OmniAICreator/Qiita-1.07M huggingface dataset:
温度センサーDS18B20をラズパイに接続して温度を測定する！


#1.温度センサー　DS18B20

モジュール付きの温度センサDS18B20をラズパイ４モデルBにつないでみたので紹介します。内容の利用については自己責任でお願いします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280313/55a9081d-cb12-2eda-eb0c-bf6a0095807b.png)

技術的なつくりは<a href = "https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf">こちら</a>を参照。


#2.結線例
ラズパイ 　ーーーー　DS18B20
5V Power ②  ーーーー　＋
GPIO4  ⑦ ーーーー　OUT
Ground（39など）　ーーーー　ー

#3.「1-Wire」の有効化
ラズパイの設定ウィンドウを開いて1-Wireを無効（デフォルト）から有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280313/b9067f1e-d8f6-39be-4b95-1c19f53cdd79.png)

#4.設定ファイルに追加の設定

/boot/config.txtファイルを開いて修正。
ターミナルから 

```terminal
$ sudo nano config.txt
```
と入力し、一番下の行が、

```
dtoverlay=w1-gpio
```
となっているのでこの行を

```
dtoverlay=w1-gpio,pullup=on
```
とします。

#5.w1thermsensorモジュールのインストール
Pythonは、w1thermsensorという便利なモジュールが用意されているので、インストール。ここでpip installとしてしまうとpython 2.7のバージョンがインストールされてはまってしまうので注意が必要かもしれません。

```terminal
$ sudo pip3 install w1thermsensor
```
このモジュールの詳細は以下。これを参考にコーディングします。

https://pypi.org/project/w1thermsensor/

#6.コード例

５秒ごとに１０回、温度を測定するプログラムです。実行すると、温度が表示されると思います。

```python
from w1thermsensor import W1ThermSensor
import time
sensor = W1ThermSensor()
for i in range(10):
    temp = sensor.get_temperature()
    print(temp)
    time.sleep(5)
```
AtCoder Beginner Contest 206 参戦記

# AtCoder Beginner Contest 206 参戦記

開始から30秒くらい、始まっていることに気づかずに無駄にした. 今回も無事爆死して、やっぱりウマ娘にかまけて精進を怠った3ヶ月は裏切らないなあと思いました.

## [ABC206A - Maxi-Buying](https://atcoder.jp/contests/abc206/tasks/abc206_a)

3分で突破. 書くだけ.

```python
N = int(input())

t = N * 108 // 100
if t < 206:
    print('Yay!')
elif t == 206:
    print('so-so')
elif t > 206:
    print(':(')
```

## [ABC206B - Savings](https://atcoder.jp/contests/abc206/tasks/abc206_b)

1分半で突破. 1からnまでの合計が n(n+1)/2 なのが分かっていれば、10<sup>9</sup> には 10<sup>5</sup> 未満で到達することが分かり、シングルループで素直に積算していっても大丈夫だと分かる.

```python
N = int(input())

c = 0
for i in range(1, 10 ** 9):
    c += i
    if c < N:
        continue
    print(i)
    break
```

追記: にぶたんにすると *O*(log<i>N</i>) になります.

```python
N = int(input())

ok = 10 ** 5
ng = 0
while ok - ng > 1:
    m = ng + (ok - ng) // 2
    if m * (m + 1) // 2 >= N:
        ok = m
    else:
        ng = m
print(ok)
```

## [ABC206C - Swappable](https://atcoder.jp/contests/abc206/tasks/abc206_c)

9分で突破. 間違って A<sub>i</sub>=A<sub>j</sub> を数え上げて、あれ数が合わないとかやって時間を無駄にした……. 2重ループだと間に合わないことは明らか. 個数を数え上げればシングルループになると気づくのは難しくない,

```python
from collections import Counter

N, *A = map(int, open(0).read().split())

t = 0
for c in Counter(A).values():
    t += c * (N - c)
print(t // 2)
```

## [ABC206D - KAIBUNsyo](https://atcoder.jp/contests/abc206/tasks/abc206_d)

46分半で突破、WA2. 過去に似たような問題絶対やってるよなあ. ざっくり言えば、各疎になっているグループ毎に、グループ内の数字の種類数-1を積算したものが答え. 入出力例はグループが複数のものがなく、WA を出してからうんうん唸ってようやく気づいた.

```
6
1 3 2 4 1 5
```

を入力して

```
3
```

が出力できれば OK ですね.

グループ判定は Union Find 以外思いつかなかった.

```python
from sys import setrecursionlimit


def find(parent, i):
    t = parent[i]
    if t < 0:
        return i
    t = find(parent, t)
    parent[i] = t
    return t


def unite(parent, i, j):
    i = find(parent, i)
    j = find(parent, j)
    if i == j:
        return
    parent[j] += parent[i]
    parent[i] = j


setrecursionlimit(10 ** 6)

N, *A = map(int, open(0).read().split())

ma = max(A)

parent = [-1] * (ma + 1)
for i in range(N // 2):
    unite(parent, A[i], A[N - 1 - i])

result = 0
for i in range(ma + 1):
    if parent[i] > 0:
        continue
    result += -parent[i] - 1
print(result)
```
UiPath データテーブル　複数条件で並べ替え

UiPathでデータテーブルを並べ替えることは可能
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/1c796433-bd45-7d00-38e5-092b6f472935.png)
プログラミング＞データテーブルと辿ると現れる
`データテーブルを並べ替え`アクティビティですね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/7eb81ed8-443d-635e-925e-e3db7176769a.png">
だけどこのプロパティを見るに
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/86561822-7755-66ca-b369-c7e82c744f52.png">
Sort条件は一つしか指定することができず、複数条件でのSortは対象外。
では複数条件のSortをしたいときはどうすればいいのだろうか。
簡単に言うと、`DataView`クラスのSortを利用することで実現する。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/89734b1d-079a-b32b-14b8-e0b551c01b22.png)
順番に解説
#１．並べ替えしたいデータテーブルをDataViewに放り込む
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/3d494d6f-4445-6c42-4e07-854392dfc5e8.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/17f213d2-052e-b9cb-f7df-c8962238dcef.png">
左辺に指定している[dv_データビュー]の型は、`System.Data.DataView`



#２．データビューでソートする
ここがやりたいことのメイン
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/fb077e52-51c3-23cd-709c-769a063977b2.png)![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/a42c3c6c-ec01-1573-e447-e2f67deb99ab.png)

左辺 `dv_データビュー.Sort`
右辺 `" [支店名] Asc, [課名] Asc"`と仮にしておく

つまり`Datatable.Sort =　並べ替え条件の文字列`
並べ替え条件には、並べ替えしたい列名と、並び順を示す`Asc`か`Desc`を指定する。Asc：昇順　Desc：降順ですね。
列名とAsc/Descはスペースで区切る。さらにカンマを付け二つ目の条件を指定していく。
例では[支店名]と[課名]を昇順でソートなわけだが、昇順の場合、Ascは省略可能なので、`"[支店名], [課名]"`　でも同じ結果が得られる。

#３．データテーブルに戻す
ここまでは、DataViewで行っていたことなのでDatatableにしてやる必要がある。
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/44fd7664-6107-b142-9056-fc3fde0c75b7.png)![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195648/8f997f96-5e8c-ac3b-0f4a-402907fc67a1.png)
データビュー.ToTable()でまるっとデータテーブルに格納

以上で、データテーブルの複数条件並べ替えが可能というわけ。


<font color="silver"><i>画像を横に並べて書きたかったのに、やり方がわからない・・・・</i></font>
M5Stack開発環境構築　(Arduino IDE導入)

Windows10でM5Stack開発環境構築を行った際の手順を記載します。まずはArduino IDE導入してHelloWorld表示させるまでのものです。(2021/6/18時点)

#1. Arduino IDEのインストール
[公式HP](https://www.arduino.cc/en/software)よりインストーラー版をDLして実行
([Just Download]でDLして、次へ、次へ...でインストール完了)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/e6fbf95d-4f55-307f-0c8a-f06ba08d3ed8.png)

#2. M5Stackドライバ　インストール
[M5StackのDownloadページ](https://m5stack.com/pages/download)よりDLして実行(次へ、次へ...でインストール完了)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/71443837-19d8-5276-b165-fd06b751816f.png)

#3. Arduino IDEにESP32のボード情報を設定
* 3-1. ボードマネージャを追加する
 * [ファイル]→[環境設定]でウィンドウを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/9c414689-01f9-ee77-3797-1efc3bf2449f.png)
 * 開いたら、「追加のボードマネージャのURL」に以下を記載
`https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/17a1639d-ba0c-fa2e-4653-e089d73203ca.png)
(https://dl.espressif.com/dl/package_esp32_index.json
でもいいかも知れませんが、よくわかりません。)

* 3-2.  esp32ボードマネージャインストール
 * [ツール]→[ボード]→[ボードマネージャ]でボードマネージャを開き
 * 検索窓に”ESP32”を入力する
 * 表示されるEspressif Systemsのesp32をインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/4ab28316-916b-f0f3-3192-403a3661cef0.png)
* 3-3.自分の利用するボードを選択する
 *  [ツール]→[ボード]を選択
 *  今回はM5Stack Grayのため、「M5Stack-Core-ESP32」を選択しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/8cb294a0-1f1f-5107-c7e6-e8a441ad9832.png)

#4. Arduino IDEにシリアルポートを設定する
* ボードを選択後に再度[ツール]を開くと、通信設定がほぼ設定されています
* シリアルポートのみ、[ツール]→[シリアルポート]で設定します


#5. Arduino IDEにM5Stack Library をインストール
* 2.と同じ[M5StackのDownloadページ](https://m5stack.com/pages/download)をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/6d935723-1489-ce81-98d0-25eec0523f24.png)
* 表示されたGitHubのサイトからZIPファイルをDownloadする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/055de9e7-b8bb-64fb-248b-c0e0482c6b4e.png)

* [スケッチ]→[ライブラリをインクルード]→[.ZIP形式のライブラリをインストール] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/e94d61cf-32f3-2e8a-26f8-cc00bd8c35fc.png)
(他のサイトや関連書籍には[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理] で表示されるライブラリマネージャ画面の検索欄に”M5Stack”入力してインストールする、とありましたが、私の環境では以下が何故か見つかりませんでした。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/e86d5dc2-7b2e-71bc-5f7f-55e9b3f313b0.png)
その後、[ファイル]→[スケッチ例] とすると、下記のようにサンプルスケッチが追加されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/5369a465-3be5-1dac-920b-353c0746aae8.png)

* サンプルスケッチの中にあるBasics→HelloWorldなどを選択
* 検証→マイコンボードに書き込むを選択すればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/c3df02a3-05c2-ba43-137f-8b4522d49852.png)
【Ｅxcel】テーブル操作

# 元データ
![cccccc.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/8cdf7d8e-aa26-56f6-3f02-3d45e7472d9a.png)

# テーブル全体の取得
```vb
  ' リストオブジェクトを取得する。
  Dim lo As ListObject
  Set lo = ThisWorkbook.Worksheets(1).ListObjects(1)
```
　・ListObjectsは１ブック中の全てのテーブル

# テーブルの各情報の取得
## ヘッダー／ボディ
```vb
  Dim header_r As Range
  Dim body_r As Range
  Set header_r = lo.HeaderRowRange()
  Set body_r = lo.DataBodyRange
```
　・ヘッダは1行目、ボディは2行目以降

# 参考サイト
  [エクセルの神髄 第131回.テーブル操作のVBAコード（ListObject,DataBodyRange）](https://excel-ubara.com/excelvba1/EXCELVBA431.html)
【Rails】device使用してURLにアクセス時に、422 Unprocessable Entityと気の対処法

<h2>症状</h2>
Advanced REST clientを使用して、URLにPOSTでAPIを叩くと、以下のエラーが発生してしましました。

```terminal:error
422 Unprocessable Entity
```

422 Unprocessable Entityは、サーバーが要求本文のコンテンツ型を理解でき、要求本文の構文が正しいものの、中に含まれている指示が処理できなかったことを表します(引用)

つまり、postしたbodyの記述が間違っているようです

```json:post
{
  email:"nekonekonekko",
  password:"123456"
}
```

<h2>解決方法</h2>
jspmの左側の文字を""で囲むことで解決しました。

```json:post
{
  "email":"nekonekonekko",
  "password":"123456"
}
```

<h2>参考</h2>

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/422

https://qiita.com/tomokazu0112/items/5fdd6a51a84c520c45b5
Laravelの2種類のテストの比較（FeatureテストとUnitテスト）

## はじめに
Laravelの`tests/`ディレクトリ以下には`Feature/`と`Unit/`の二つのディレクトリが自動で作成されます。それぞれのディレクトリには`ExampleTest.php`が最初からありますが、これら二つの違いは「素のPHPUnitの`TestCase`クラスを継承している」か「Laravel用に拡張された`TestCase`クラスを継承しているか」です。

`Feature/ExampleTest.php`はLaravel用に拡張された`TestCase`クラスを継承しているので、DBアクセスを含むLaravelの機能がテスト内で全て使えます。`Unit/ExampleTest.php`は素のPHPUnitの`TestCase`クラスを継承しているため、Laravelの機能が使えず、素のPHPコードとしてのロジックテストを書くものになっています。

`Feature`テストは便利なのですが、Laravel用に拡張されている分テストの実行に時間がかかります。なので、Laravelに依存しない形で書けるテストは極力`Unit`テストにするべきです。

# FeatureテストとUnitテストの比較

次のようなUser Modelがあります。`isAdmin()`メソッドでは、  `role`カラムの値が「ADMIN」の場合に`true`を返します。このメソッドについて、FeatureテストとUnitテストを書いて比較します。

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    protected $fillable = [
        'name',
        'email',
        'password',
        'role',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    public function isAdmin(): bool
    {
        return $this->role === 'ADMIN';
    }
}

```

## Featureテストの場合

`isAdmin()`メソッドを呼び出すと、Userモデルは内部でDBアクセスを行い、`role`カラムの値をDBから読み出そうとします。なので、Featureテストの場合、実際にDBへデータを登録してから`isAdmin()`メソッドを呼び出すことになります。

```php
<?php

namespace Tests\Feature;

use App\Models\User;
use Tests\TestCase;

class UserTest extends TestCase
{
    public function test_isAdmin()
    {
        $user = User::factory()->create(['role' => 'ADMIN']);
        self::assertTrue($user->isAdmin());
    }
}

```

実行結果はこちらです。実行時間は[0.38s]でした。

```bash
sail test tests/Feature/UserTest.php 

   PASS  Tests\Feature\UserTest
  ✓ is admin

  Tests:  1 passed
  Time:   0.38s
```


## Unitテストの場合

Unitテストの場合は、DBアクセスができません。では、どうするかというと、Userモデルをインスタンス化した後に、`role`プロパティへ自分でデータをセットします。

```php
<?php

namespace Tests\Unit;

use App\Models\User;
use PHPUnit\Framework\TestCase;

class UserTest extends TestCase
{
    public function test_isAdmin()
    {
        $user = new User();
        $user->role = 'ADMIN';

        // これでもOK
        // $user = new User(['role' => 'ADMIN']);

        self::assertTrue($user->isAdmin());
    }
}

```

実行結果はこちらです。実行時間は[0.06s]でした。**Featureテストの1/6程度の時間で終わっています。**

```bash
sail test tests/Unit/UserTest.php

   PASS  Tests\Unit\UserTest
  ✓ is admin

  Tests:  1 passed
  Time:   0.06s
```

# まとめ

今回はFeatureテストとUnitテストの実行時間の比較を行いました。テスト対象のコードはとてもシンプルなものでしたが、それでも6倍以上の差でUnitテストの方が高速ということがわかりました。プロジェクトの全てのテストをFeatureテストにしてしまうと、少なくともこれだけ実行時間に差が出てしまうということですね。
また、実際のFeatureテストでは、裏でLaravelがよしなにやってくれていることも含めると、更に多くのLaravelの機能を使うことになると思います。そう考えるとFeatureテストとUnitテストでは6倍以上の実行時間の差が出るのではと思います。みなさん、Unitテスト書いていきましょう。そしてUnitテストが書けるような設計をしましょう。
PowerShellでファイル名を変更する

## 概要
PowerShellでファイル名を変更する方法を記載する。
スクリプトで使うというより、ワンライナーでやるときを想定したもの。

補足:
PowerShellのリネームの記事自体はぐぐれば結構あるのですが `Get-ChildItem` で罠がある事例も掲載している人もいるみたいなので、その辺も含めた備忘録です。

## 環境

* **OS** ... Windows 10
* **PowerShell** ...  5.1.19041.1023

## テストデータ

```powershell
> New-Item -Name foo.txt -ItemType File; New-Item -Name bar.txt -ItemType File; New-Item -Name baz.txt -ItemType File
foo.txt
bar.txt
baz.txt
```

## コマンドの例

**`Get-ChildItem` の丸かっこが重要**です。
なお、例が横長になるのを避けたかったので、カレントディレクトリに移動する前提の例にしています。(`.`も省略できるんですが、察してください。)

### ファイル名に含まれるキーワードを置換する
foo を foo2 に変更する例

```powershell
cd "<target-directory>"
(Get-ChildItem -File .) | Rename-Item -NewName {$_ -replace "foo", "foo2"}
```

### ファイルの先頭にprefixを追加する

```powershell
cd "<target-directory>"
(Get-ChildItem -File .) | Rename-Item -NewName {$_ -replace "^", "prefix-"}
```

大して変わりませんが、他には次の方法があります。

* 一度、ディレクトリの一覧を変数に入れる

    ```powershell
    cd "<target-directory>"
    $items = Get-ChildItem -File .
    $items | Rename-Item -NewName {$_ -replace "^", "prefix-"}
    ```

* ForEach-Object を使う

    ```powershell
    cd "<target-directory>"
    (Get-ChildItem -File .) | ForEach-Object { Rename-Item $_ ($_.Name -replace "^", "prefix-")}
    ```

### ファイルの先頭からprefixを削除する

```powershell
cd "<target-directory>"
(Get-ChildItem -File .) | Rename-Item -NewName {$_ -replace "^prefix-", ""}
```

### NG例: ファイルの先頭にprefixを追加する

`Get-ChildItem` に丸かっこ付けない場合は、ファイル数が多いと `prefix-prefix-prefix-...` といった名前になる。
自分のマシンだとファイル数を30から40に変えたら問題が起こった。

```powershell
cd "<target-directory>"
Get-ChildItem -File . | Rename-Item -NewName { "prefix-" + $_.Name }
```

## 参考
* [rename - PowerShell: How do I append a prefix to all files in a directory? - Super User](https://superuser.com/questions/1206967/powershell-how-do-i-append-a-prefix-to-all-files-in-a-directory)
【Php】validationについて-3

# 初めに
phpのvalidationについて学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

前回の記事:
https://qiita.com/redrabbit1104/items/a6e57aa1fd1771ef90ff
https://qiita.com/redrabbit1104/items/a3eaf2bba51fac0b3c51
https://qiita.com/redrabbit1104/items/6e9c85c7503ed9043f38

# emailとurl入力フォームを追加
メールアドレスとホームページの入力欄を追加します。

```php
メールアドレス
<input type="email" name="email" 
 value="<?php if (!empty($_POST['email'])) 
        {echo sp_chars($_POST['email']);} ?>">
<br>
ホームページ
<input type="url" name="url" 
  value="<?php if (!empty($_POST['url'])) 
         {echo sp_chars($_POST['email']);} ?>">
```
また、確認画面の方にも入力したメールアドレスとホームページが見れるようにします。

```php
メールアドレス
<?php echo sp_chars($_POST["email"]); ?>
ホームページ
<?php echo sp_chars($_POST["url"]); ?>
```
そしてhiddenタイプで入力した値を渡すようにします。

```php
<input type="hidden" name="email" 
       value="<?php echo sp_chars($_POST['email']); ?>">
<input type="hidden" name="url" 
       value="<?php echo sp_chars($_POST['url']); ?>">
```
これで準備完了です。

#filter_var()関数
メールアドレスやemailなどの値が予め用意されているフィルター（入力規則）に合っているかどうかをチェックする関数。戻り値はtrueまたはfalseになります。

```php
filter_var("対象の値", "適用するフィルタ", "オプション")
```

フィルタにはたくさんの種類がありますが、emailとurlのvalidationで使うフィルタとしては
FILTER_VALIDATE_EMAILとFILTER_VALIDATE_URLを使います。
メールアドレスは入力されていない場合と入力内容が正しくない場合にメッセージが表示されるようにします。

```php
if (empty($filter_value['email']) || 
    !filter_var($filter_value['email'], FILTER_VALIDATE_EMAIL)) {
    $messages[] = '正しい形式のメールアドレスを入力してください。';
    }
```

ホームページは入力されなかった場合を除いて、正しく入力されたかをチェックしたいのでif文の中にif文を用意してvalidationを掛けます。

```php
if (!empty($filter_value['url'])) {
   if (!filter_var($filter_value['url'], FILTER_VALIDATE_URL)) {
      $messages[] = '正しい形式のホームページを入力してください。';
   }
}
```

emailやurlはhtml側で独自のvalidationが掛かりますので、php側のvalidationを確認するためには入力画面のinput欄のtypeをtextに変更する必要があります。

```php
メールアドレス
<input type="text" name="email"        //typeをemailからtextに変更
       value="<?php if (!empty($_POST['email'])) 
       {echo sp_chars($_POST['email']);} ?>">
<br>
ホームページ
<input type="text" name="url"          //typeをurlからtextに変更
       value="<?php if (!empty($_POST['url'])) 
       {echo sp_chars($_POST['email']);} ?>">
```

# 参考サイト
https://www.php.net/manual/ja/function.filter-var.php
https://www.php.net/manual/ja/filter.filters.validate.php
スプレッド演算子をオブジェクトに使用する

Reactを学習していて、子コンポーネントにpropsを渡す際に`{...todo}`という表記があったので疑問になって調べた。

# オブジェクトに使う場合
配列のみで使用できると思っていたスプレッド演算子だが、オブジェクトの中身を展開するためにも使用できることを知った。
以下の出力結果はどちらも同様。

```js
const hoge = {a: 1, b: 2}
console.log(hoge)
// > Object { a: 1, b: 2 }
console.log({...hoge})
// > Object { a: 1, b: 2 }
```

ECMAScript 2018(ES9)からの新機能とのこと。
残プロ　第-18回　~tkinterでcsvを編集(したい)~

# わざわざtkinterで実装する意味とは...

tkinterで軽く実装することで，他言語で実装する際のプロトタイプとして利用できます．
学習コストも少ないので今回はtkinterでcsvの編集に挑みました(未完成)．


# 機能紹介

表の作成・表示は[第-14回](https://qiita.com/R1nY1x1/items/26c056d2ef0a3848215c)で紹介しています．
実装済みの機能は

- csv読込・表作成
- タスク追加
- タスク削除
- csv書込

![csv_editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578927/69019f3c-c814-545e-ad1e-0fda8b101f28.png)


### タスク追加

csvファイルの行数を取得し末尾に追加を行っています．entryやlabel等のいくつも用意する必要があるものは，リストに格納することで扱いやすくなります．

~~~ python:addingTask
tmp = []
for i in range(len(df.columns)):
	tmp.append(task_entrys[i].get())
df.loc[len(df)] = tmp
~~~

### タスク削除

tree.selection()を利用することで楽に指定行を取得できます．今回はvaluesの先頭(インデックス)を利用していますがtagsを利用してもいいかもしれません．

~~~ python:deleteTask
for i in tree.selection():
	df = df.drop(index=tree.item(i)['values'][0])
~~~
ヘルパーメソッド（form_with）について

# はじめに
ポートフォリオを作成するためにオリジナルアプリを作成しております。
少しHTMLの学習から離れていたため、復習として投稿させていただきます。
# なぜヘルパーメソッドを使うのか？
- パスの指定やRubyの埋め込みなどの記述がシンプルになる
- セキュリティ上の問題を解消する
 
以上の２点が主な理由になります。
# ヘルパーメソッドの一例
| ヘルパーメソッド | 説明                         |
|:-----------:|:----------------------------|
| form_with   | 投稿ページなどにおけるフォームの実装 | 
| link_to     | リンクの実装                    | 
これ以外にもたくさんのヘルパーメソッドが存在します。
コントローラー作成時に毎回生成される`〇〇_helper.rb`ファイルを使用することにより、カスタムすることも可能です。
# form_withメソッドとは？
フォームを実装するためのヘルパーメソッドです。
HTMLで`formタグ`を使用することがありますが、その代わりに使用する事ができます。


#### HTMLで記述した場合
 

```html
<form action="/tweets" method="tweet">
  <input type="text" name="fix__content">
  <input type="submit" value="修正する">
</form>
```
 

#### ヘルパーメソッドを用いて記述した場合
 

```erb
<%= form_with url: "/tweets", method: :tweet, local: true do |form| %>
  <%= form.text_field :fix__content %>
  <%= form.submit '修正する' %>
<% end %>
```
 
ヘルパーメソッドはRubyとして取り扱われるので、それを表示するために`<%= %>`で囲んで使用します。
`form_with`は、`do`から`end`までの間がフォームの記述になります。
したがって、`do〜end`の間に、表示される投稿フォームの内容を記述していきます。

# 指定する引数について
```erb
<%= form_with url: "/tweets", method: :tweet, local: true do |form| %>
```
| 部品| 説明                                           |
|:-------------:|:-----------------------------------------------------------|
|urlオプション	|リクエストのパスを指定する。|
|methodオプション	|リクエストのHTTPメソッドを指定。postを指定する場合は省略できる。|
|localオプション	|リモート送信（Ajax）を無効にするかどうかを指定。trueで無効になる。|

`url: "/posts"`, `method: :post`, `local: true`という記述はオプションと呼ばれています。
それぞれフォームがどのような動作を行うかを決めています。
# フォーム部品の主なヘルパーメソッド
| 部品           |用途                                 　                       |
|:-------------:|:-----------------------------------------------------------|
|text_field     |テキストボックス                                                 | 
|password_field |パスワード入力ボックス（入力テキストがアスタリスク等に置かれて表示）       | 
|check_box	|チェックボックス（複数選択可能）                                      |
|radio_button	|ラジオボタン（複数の中から1つしか選択できない）                          |
|submit         |送信ボタン                                                     |
この表の`submit`を除いて、これらのヘルパーメソッドの引数には、`name属性`にあたる名前が入ります。
`name属性`の値が、データを扱う際の名前であるキーになります。
# おわりに
`form_with`に関して、自身ではまだまだわからないところが多くあります。
今回は理解できた部分だけを抜粋した基礎的な記事になります。
また間違いなどございましたら、コメントいただけると幸いです。
お手数をおかけしますが何卒よろしくお願いします。
python小ネタ帳

### はじめに
pythonの学習を進める上で役に立ちそうなネタを見つけたらメモ代わりに残しておいて、
今後どんどん使っていくのを目的とする

###001.文字列型のリストを簡単に作る

- rangeそのままだとint型になってしまうためmap関数でstrに置換してやるところがミソ

```python
list(map(str, range(10)))
```

```:実行結果
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
```

###002.ランダムな数字のリストを作る

- 0~100までの数字でランダムに20個のリストを作る

```python
import random
random.sample(range(101), 20)
```

###003.ランダムな文字列を作る

- 大文字小文字を含む15文字のランダムな文字列を生成する
string.printableで記号も含めた文字列を出力可能

※参考サイト

https://docs.python.org/3/library/string.html


```python
import random
import string
''.join(random.choice(string.printable) for _ in range(15))
```

###004.ファイルを一度に読み込む

-ファイルを一度に読み込みたいときに使えるテクニック
input.txtを読み込んでそのままoutput.txtに書き出したいといった時に使えるテクニック


```python
with open('input.txt') as f, open('output.txt', mode='w') as fw:
    for line in f.readlines():
        fw.write(line)
```

もちろん単純にファイルをコピーしたいだけならshutilを使ってコピーでも構わないし
従来通りwith openを2回書いても良いが1行で簡単に書けるというのがポイントである

###005.P●IZAスキルチェックでお馴染みのやつ

最初にループをさせる回数を入力させてその後引数を渡して処理させる系
入力した値をsplitで分割してリストに渡してやれば良い


```python
num = int(input('Enter number: '))
print('*' * 20 + ' What is your hobby? ' + '*' * 20)

to_string = [list(input().split()) for _ in range(num)]
print(to_string)

num = int(input('Enter number: '))
print('*' * 20 + ' What is your favorite number? ' + '*' * 20)

numbers = [list(map(int, input().split())) for _ in range(num)]

print(numbers)
```

```:実行結果
Enter number:  3
******************** What is your hobby? ********************
 読書　映画　水泳
 プロレス　テニス
 野球　サッカー
[['読書', '映画', '水泳'], ['プロレス', 'テニス'], ['野球', 'サッカー']]

Enter number:  4
******************** What is your favorite number? ********************
 777 1234
 222
 123 456 789
 999 666 777
[[777, 1234], [222], [123, 456, 789], [999, 666, 777]]
```

###006.モジュールのsourceを確認する

inspectモジュールのgetfileでソースコードのPATHが取得できる

```python
import inspect
import glob

inspect.getfile(glob)
```

```:実行結果
'/Users/xxx-pc/.pyenv/versions/anaconda3-2021.05/lib/python3.8/glob.py'
```
STM32F103C8と温度,S-5851で液晶温度計 (Mbed)(AQM0802A)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

x mbed NUCLEO-F103RB バードは、BluePill F103C8
x プログラムは、STM32F303K8と同じ



```c++

#include "mbed.h"

//#define S5851A 0x48
#define ADDR        ((0x48)<<1) //  address
#define ADDR_LCD    (0x7C)      //  address

I2C i2c(I2C_SDA, I2C_SCL); //767 303
//I2C i2c(dp5, dp27); //1114
//I2C i2c(PA_10, PA_9); //010

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

int     tempval;        //温度
char    data_read[6];   //i2cバッファー
int     n10;            //10の桁
int     ii;             //ループカウンター

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

char INIT_cls[]={0x0,0x1};

int main()
{

    //液晶の初期化
    for(ii=0;ii<11;ii++){
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(2);
    } //for

    while (1) {

        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(2);

        //初期化
        //set address 0
        i2c.write(ADDR, "\000", 1); //addres 0

        //温度の読み込み
        // Read temperature register
        i2c.read(ADDR, data_read,1,false);

        //温度の保存
        // Calculate temperature value in Celcius
        tempval =  data_read[0];

        //tempval = 12; //debug

        //計算
        // Calculation temp
        n10 = DVI10(tempval);             //10の桁
        tempval = tempval - ( n10 * 10 ); //1の桁

        //液晶に出力
        // Display result
        data_read[0] = '@';
        data_read[1] = '0' + n10;
        data_read[2] = '0' + tempval;
        //data_read[3] = '\r';
        //data_read[4] = '\n';
        data_read[3] = 0;
        i2c.write(ADDR_LCD, data_read ,3);

        //1秒待つ
        wait_ms(1000);

    }//while

}//main



```


![i2c_s5851_103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/31160537-d72f-50b6-534f-8b1f7747bc9a.jpeg)
gitconfigをリポジトリに置いて共有する

# gitconfig をリポジトリで共通部分を外出しして管理したい
## gitconfigファイルをリポジトリに作成
```
vi .gitconfig
```

## リポジトリルートの`.gitconfig`をローカルのgitconfigのincludeファイルに指定する。
> どうしてもここは必要か？

```
git config include.path '../.gitconfig'
```

### 確認
```input.console
git config -l
```

```output.console
include.path=../.gitconfig
```

# 参考
[gitconfigのincludeが便利](https://qiita.com/knt45/items/51b8a8645f36fb0a6d01)
[.gitconfigはGitで管理しておいて、git config user.name/user.emailは管理したくない](https://mistymagich.wordpress.com/2016/08/31/gitconfig%E3%81%AFgit%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%97%E3%81%A6%E3%81%8A%E3%81%84%E3%81%A6%E3%80%81git-config-user-nameuser-email%E3%81%AF%E7%AE%A1%E7%90%86%E3%81%97%E3%81%9F%E3%81%8F%E3%81%AA/)
[gitconfig](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)
discord.py - コンバーターを手動で使う

# 始めに
discord.pyのcommandsフレームワークのコンバーターを手動で使う方法を解説します。
# 環境

```
- Python v3.9.2-final
- discord.py v1.7.3-final
- aiohttp v3.6.3
- system info: Windows 10 10.0.17134
```

`python -m discord -v`の情報。

# tl;dr

```python
await commands.converter.ConverterClassHere().convert(ctx, m.content)
```
※ConverterClassHereは[ここ](https://discordpy.readthedocs.io/ja/latest/ext/commands/api.html#converters)のクラス名で置き換えて下さい。

# 何をしているのか
commandsフレームワークのコンバーターは

```python
class MemberConverter(IDConverter):
    ...
    async def convert(self, ctx, argument):
        bot = ctx.bot
        match = self._get_id_match(argument) or re.match(r'<@!?([0-9]+)>$', argument)
        guild = ctx.guild
        result = None
        user_id = None
        ...
```
のようにコンバーター用のクラスがあり、そのインスタンスメソッドにconvertが実装されています。
そのため、インスタンスを作ってconvertを呼び出せば手動で使うことが出来ます。

# サンプル

```python
@bot.command()
async def sample_wizard(ctx):
    await ctx.send("メンバーを送信して下さい。")
    message = await bot.wait_for("message", check=lambda m: m.channel == ctx.channel)
    members = [await commands.converter.MemberConverter().convert(ctx, raw_single_member) for raw_single_member in message.content.split()]
    for member in members:
        await member.kick()
    await ctx.send(f"{len(members)}人のメンバーをキックしました。")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659894/63d6c0ae-86c5-a1f8-086f-54ab356819e0.png)

# 最後に
discord.pyのcommandsフレームワークのコンバーターを手動で使う方法を解説しました。
ウィザードのようなものを作るときやメッセージURLからメッセージを取得するときなどに使えると思います。

最後まで読んでいただきありがとうございました。
# おまけ

discord.py 2.0で[commands.run_converters](https://discordpy.readthedocs.io/ja/latest/ext/commands/api.html#discord.ext.commands.run_converters)が追加されるようですが、引数ではないと使えないようです（inspect.Parameterが必要）。

----
「[3000文字Tips - 知ると便利なTipsをみんなへ届けよう](https://qiita.com/official-events/d523df99d6479293ffa7)」への投稿記事です。
VirtualBoxのインストール手順（macOS）

## 概要

備忘録として、下記手順を記載する。
・VirtualBoxのダウンロード

### 前提
OS：macOS Big Sur
バージョン：11.2.1

## 手順

### 1 VirtualBoxのインストール
[公式ダウンロードページ](https://www.virtualbox.org/wiki/Downloads)にアクセス
`OS X hosts`をクリック
ダウンロードが開始される
![スクリーンショット 2021-06-19 22.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581782/90ca5fcc-6241-d83b-1f08-db86834ed244.png)
ダウンロードフォルダに、`VirtualBox バージョン OSX.dmg`のダウンロードを確認
ダブルクリックし、インストーラを起動
![スクリーンショット 2021-06-19 22.32.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581782/737dc2d1-abbf-700b-1944-c7313080142d.png)
インストーラに従って、インストールを行う
![スクリーンショット 2021-06-19 22.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581782/655ea7fd-8764-7910-7c20-c8d957bc6a6a.png)
インストール先を変更したい場合は、［インストール先を変更］から設定を変更する
［インストール］をクリック
![スクリーンショット 2021-06-19 22.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581782/328e3404-8daa-9e7b-0de9-5b7fd6683522.png)
`インストールが完了しました。`と表示されたことを確認
![スクリーンショット 2021-06-19 22.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581782/2bc0890e-e4fa-524a-bc4c-befb9a85fa73.png)

### 2 VirtualBoxのインストール確認
以下2点から、VirtualBoxのインストールを確認する
1. アプリケーションフォルダに`virtualBox.app`が格納されていること
![スクリーンショット 2021-06-19 22.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581782/1ca8147e-8ad7-4978-8bd6-d32b63e996ef.png)
2.`virtualBox.app`をクリックし、`Oracle VM VirtualBox マネージャー`を起動できたこと
![スクリーンショット 2021-06-19 22.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581782/d1283acc-51ce-bb0e-3f89-e6c78f043d05.png)

以上

[CentOS7のダウンロード手順](https://qiita.com/kazuho_0531/items/f413c5914a632c4cd83f)へと続く
PennyLaneをC++バックエンドで高速に動かす

# PennyLaneとバックエンド

PennyLane はいろいろなバックエンドを自由に使い分けられます。
実機はともかく、シミュレーターの場合、**速度**が重要になりますよね。

Pennylaneの標準のバックエンド `default.qubit`
`dev = qml.device("default.qubit", wires=n_qubits)`
は、速度の面では特筆した性能は有りません。しかし、勾配計算として`adjoint`が使えます。
このアルゴリズム、標準の `parameter-shift`[^1]に比べて体感で3倍程度早くなります。いいですね。
https://qiita.com/notori48/items/9cfe49c79b42389db0e1
(早くなる度合いは、パラメータ数にも依存します。）

アルゴリズム計算量に加えて、バックエンド自体の計算の速さも重要です。
Pythonはインタプリタなので基本遅くて、できればC++やJuliaが使いたい。
素晴らしいことに、C++が裏で走る(が、記述はpythonな)qulacsをPennyLaneから呼び出す事ができます。
回路実行は`default.qubit`のおよそ3倍速になります。

`!pip install pennylane-qulacs["cpu"]`
`dev = qml.device("qulacs.simulator", wires=n_qubits)`

よし、これで勾配計算に`adjoint`を使えば、3x3 = 9 倍速だ！・・・と、なればいいのですが、
残念ながら`qulacs.simulator`は`parameter-shift`しか使えません。
**C++かつ`adjoint`を使う方法はないのでしょうか？？**

<font color="DeepPink">実は、ありました。</font>
紹介します。

# Pennylane-lightning plugin

どうやら最近出たプラグインで　**Pennylane-lightning plugin**　というものがあります。

Release:	0.16.0-dev
The PennyLane-Lightning plugin provides a fast state-vector simulator written in `C++.`

PennyLane is a cross-platform Python library for quantum machine learning, automatic differentiation, and optimization of hybrid quantum-classical computations.

https://pennylane-lightning.readthedocs.io/en/latest/index.html

公式にはpennylaneのver0.16.0が推奨となっていますが、0.15.0でも動くようです。
プラグインのインストールは、
`!pip install PennyLane-Lightning`

です。
そして、
`dev = qml.device("lightning.qubit", wires=n_qubits)`

で使えます。
単純な回路[^2]で時間を測ってみると、
`default.qubit` : 6 sec
`qulacas.simulator` : 2 sec
`lightning.qubit` : 2 sec
となり、確かにqulacs並の速度が出ています。

勾配計算についても、`adjoint`が（エラー無く）指定できました。
実際の量子機械学習タスク(Tensorflow.keras + pennylane)でやったところ、
`default.qubit w/adjoint` : 3min 15sec /epoch
`qulacas.simulator w/parameter-shift` : 9min 10sec /epoch
`lightning.qubit w/adjoint` : 2min 45sec / epoch

このようになり、やはり**`lightning.qubit w/adjoint`が最速**となります。
しかし残念ながら、keras + pennylane で量子NNを組んだ場合では単純な回路実行以外のオーバーヘッドに律速があるようで
`default.qubit`の3倍速にはなっていません。それでも、たった1行で速度が20%ぐらいは早くなっています。

まぁ、それでも古典NNに比べるとめっっちゃくちゃ遅いんですけどね。
Communiityでも、速度が遅すぎて驚いたという記事がたくさん上がっています。それな。[^3]

# まとめ

ちょっとでも早くする工夫をしてみた。
PennyLane-Lightningはすぐ使えて速いぞ！

[^1]: 例えばqiskit に入っている勾配計算ライブラリも、この方法です。
[^2]: 24qubitのGHZ状態生成回路, shots=10
[^3]: みなさんもぜひ量子機械学習(変分回路）をやってみてください。驚くほど遅いと思います。
csvデータの形がいびつでpandasで読み込みにくい場合の対処法

#csvデータの形がいびつで読み込みにくい場合の対処法

pandasを利用したcsvデータの読み込みで躓いてしまったことがありました。
ちょびっと時間を溶かしてしまったので備忘録としてここに残します。

計測器のメーカーや種類によって、大量のヘッダーやフッター、計測条件などが計測したcsvデータの中に入っていることが多いです。
計測条件は用途によって形が変わり、何行、何列で記載されているかは、csvデータを開いてみないとわからないです。
開ける場合は開いて解決で良いのですが、システムを作ってどんなcsvが来てもエラーで止まらずにとりあえず読み込みたい場合もあります。

なにも考えずにpandasに流し込むとこんなエラーで叱られて中身が確認できない場合があります。
 
```
[code]
import pandas as pd
path = "test.CSV"
df = pd.read_csv(path,encoding='shift-jis')

[output]
ParserError: Error tokenizing data. C error: Expected 2 fields in line 5, saw 10
```


ところが、
あらかじめ列名を適当に作って、namesで与えてあげると読み込むことが可能になります。


```
[code]
import pandas as pd
path = "test.CSV"

col_name = range(1,15,1)
df = pd.read_csv(path, names=col_name,encoding='shift-jis')
_df = df.fillna('')
_df.head(7)

[output]
1	2	3	4	5	6	7	8	9	10	11	12	13	14
0	#BeginHeader	47												
1	#FormatType	***												
2	#FormatVersion	R1.00.00												
3	タイトル													
4	ユニット番号	MASTER	UNIT1	UNIT2	UNIT3	UNIT4	UNIT5	UNIT6	UNIT7	UNIT8				
5	ユニット種別	***	(1)**	(2)**	未設定	未設定	未設定	未設定	未設定	未設定				
6	計測モード	ノーマルモード		
```

NaNだらけなので、適当にfillnaで埋めています。
あとは煮るなり焼くなり自由です。
【Excel】ピボットテーブル

# できること
  SQLのGROUP BY句のように、「複数の項目」ごとにデータを「集計」することができる。

# 元データ
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/1a357f5e-8bc3-8d57-4a67-fb84dc92cc1c.png)

# テーブルの作成
 1. 挿入 -> ピボットテーブル
 2. 選択領域を表全体(A2 -> D11)としてOKボタン
 3. 別シートにピボットテーブルが作成される

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/4022f9f3-0d2b-74b9-b932-374f672e261d.png)
![２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/eabc1048-001a-c96b-babd-8490bb3bb775.png)

# テーブルのグルーピング
## １項目の場合（日別　合計金額）
　・行に「日付」を追加する。
　・値に「合計金額」を追加する。

![22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/196a8d34-53f7-e3f2-e0c9-0e53ec5afa88.png)
![333.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/5b4ac563-fe54-0bed-f157-7a5d5b0f062a.png)

## ２項目の場合（日別店舗別　合計金額）
　・行に「店舗」を追加する。
　・列に「日付」を追加する。
　・値に「合計金額」を追加する。

![444.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/9822cf20-13af-1670-8608-377a12ddd3ea.png)
![4444.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/268e162b-6fb3-dcd2-57b1-21cfb7a3fd2c.png)

# テーブルの更新
## 1. 値の更新
　〇合計金額の更新をピボットテーブルに反映する。
　・ピボットテーブルツール -> 分析 -> 更新
![5555.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/2b002f6a-71bf-0708-ea1c-c0a43711093b.png)
![555555555.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/70b5d5b3-e4db-0101-fc64-013422ca463e.png)


#### 更新とすべて更新の違い
　・更新　　　：　選択中のピボットテーブルのみ更新
　・すべて更新：　ブック中の全てのピボットテーブルが更新 (テーブル数が多い時は処理速度に難あり)


## 2. 行列の追加 / 削除
　〇追加した行をピボットテーブルに反映する。
　・ピボットテーブルツール -> 分析 -> データソースの変更
　・データの選択範囲に12行目を含める。

![66.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/a62d8b1f-bc9a-ca46-9eac-25745ee675d4.png)
![777777.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/61ee9fb9-0e89-b4ba-0de0-512dbe842ae6.png)

# 書式の変更
　・「値」の項目の「合計／合計金額」プルダウンを押下
　・値フィールの設定を選択
　・表示形式を選択
![9999.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/91a348dc-9a69-ee38-da04-20c8efe0d6de.png)
Spring Boot エラー The dependencies of some of the beans in the application context form a cycle

# 事象
アプリケーション起動時に以下のエラーが発生

```
The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  testAService defined in file [/Applications/develop/workspace/awba-management/build/classes/kotlin/main/com/awba/manage/awbamanage/service/testAService.class]
↑     ↓
|  testBService defined in file [/Applications/develop/workspace/awba-management/build/classes/kotlin/main/com/awba/manage/awbamanage/service/testBService.class]
└─────┘

```

# 原因
testAServiceとtestBServiceクラスでお互いをConstructor Injectionしているため。
Springがどちらのインスタンスを先に作れば良いかわからなくなり、エラーとなる。

```kotlin:testAService.kt
@Service
class TestAService(private val testBService: TestBService){
~
}
```

```kotlin:testBService.kt
@Service
class TestBService(private val testAService: TestAService){
~
}
```

# 解決策
基本的に、お互いを参照するような設計は推奨されてないっぽい。
まずは設計の見直しを検討する。

どうしてもやりたい場合は、@Lazyを使ったりSetter Injectionを使うなどの対応がある

### 参考
https://www.baeldung.com/circular-dependencies-in-spring
https://stackoverflow.com/questions/40695893/spring-security-circular-bean-dependency
【Java】AtCoderのABC-206に参加しました（レート：223→231）。

こんばんは。

2021/6/19に、AtCoderのABC-206に参加しました。
レートは以下の通りとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/6c76bf03-f145-c640-8417-203232a77109.png)

C問題まで突破し、順位は5887/9029でした。
レートは+8で231へ。久々にプラスで嬉しいけど、挽回までまだまだ時間がかかりそうです。
C問題で一度WAを出してしまっただけで、このレートかあ・・。


###A問題

定価206円のエナジードリンクを1本N円で販売。
消費税率1.08を乗じたうえで、定価206円を上回るかどうか？

```java
import java.util.Scanner;

public class Main{
 public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
   long n = sc.nextLong();
   long m = (n*108/100);
   //System.out.println(n*108/100); 
   if(m<206){
     System.out.println("Yay!");
   }else{
     if(m==206){
     System.out.println("so-so");
     }else{
     System.out.println(":(");
     }
   }
 }
}

```


###B問題
空の貯金箱がある。
1日目に1円。2日目に2円、、と貯金していき、入力したN円に到達するのはいつか？
結構悩んでしまいました・・。

まず、x日間貯金を続けたときの金額は、

x*(x-1)/2

になります。今回は、これがN円になる時を考えます。すると、

2n = x^2
(-1は無視する事にしました）

で、xは、√2nになると考えました。
xが小数点以下を四捨五入して求める事で、ACとなりました。
ただ、四捨五入でなぜ良いのか、論理的な説明が自分でちょっと難しい状態です・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/829d8307-e507-f6be-690e-727e506282ef.png)


値を複数使ってテストをすると、上記のようになり、四捨五入すればよさそうなのでこのプログラムにしたのですが。

```java
import java.util.Scanner;

public class Main{
 public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
   double n = sc.nextDouble();
   double m = 2*n;
   double c = Math.sqrt(m);
   System.out.println(Math.round(c));
 }
}

```

###C問題

数列が与えられる。Ai≠AjかつAi<Ajとなる組み合わせはいくつあるか？
まず、1個ずつ比較するのはTLEになるのでだめですね。

・ソートする。これにより同じ値が隣同士にきて比較しやすくなる。

・同じ値があるか、その場合はいくつあるかチェックする。
　同じ値がx個あったときは、x(x-1)/2個の組み合わせが上記の条件の対象外になる。
　それを対象外カウンター（cnt）に加算していく。

・最後、N個の数列の全組み合わせの個数（n(n-1)/2）から、cntを減算する。

ここで、最初は配列の個数Nをint型で宣言し、最後まで使っていたところWAになりました。
考えてみたらNの値は3*10^5が限界ですが、最大値でn(n-1)/2の計算をしたときはint型の限界を超えてしまいますね。
最後、nをlong型にした変数nlを用意して計算するように修正しました。


```java

import java.util.Scanner;
import java.util.Arrays;

public class Main{
 public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
   int n = sc.nextInt();
   long a[] = new long[n];
   for(int i=0;i<n;i++){
      a[i] = sc.nextLong();      
   }
   Arrays.sort(a);
   
   for(int i=0;i<n;i++){
   //  System.out.println(a[i]);
   }
   
   // chk
   long cntwk =1;
   long cnt =0;
   char flg = '0';
   for(int i=1;i<n;i++){
     if(a[i-1]==a[i]){
       cntwk++;
       flg = '1';
     }else{
       cnt = cnt+(cntwk*(cntwk-1)/2);
       cntwk=1;
       //System.out.println(" i " + i + " cnt " + cnt);
       flg = '0';
     }
   }
   if(flg=='1'){
       cnt = cnt+(cntwk*(cntwk-1)/2);
   } 
   long nl = (long)n;
   System.out.println(nl*(nl-1)/2-cnt);
   
   
 }
}

```

###さいごに
C問題は、過去の反省を踏まえずにWAを1度出してしまいました。
振り返り集をまとめておかないといけないですね。

今日は家の事情があり、真っ暗な部屋でパチパチ問題を解いていたので目が痛いです。
早く寝たいと思います。

最近は高いレートが出せないですが、ノーミスで少しでも早く解けるようにすれば、レートはまた上がると思うので、練習を少しずつ積んでいきます！
React.memo / useMemo / useCallback / Redux reselect の差分表

`React.memo` / `useMemo` / `useCallback` / `Redux reselect` の違いを表にまとめました。
どれもメモ化する(計算結果を再利用する)という意味では似ていますが、ここでは入力は何か、出力は何か(何をメモ化するのか)、いつ再計算するのかという視点でまとめます。

# 差分表

||入力|出力|いつ再計算するか|
|---|---|---|---|
|React.memo|component|メモ化された component|component への props が変化したとき[^1]|
|useMemo<T>(factory: () => T, deps: DependencyList &#124; undefined): T|引数を持たない関数と依存リスト|関数の計算結果:T|依存リストのいずれかが変化したとき|
|useCallback(callback: T, deps: DependencyList): T|任意の関数と依存リスト|与えられた関数|依存リストのいずれかが変化したとき[^2]|
|reselect: createSelector(...inputSelectors &#124; [inputSelectors], resultFunc)|stateを入力とする関数群 inputSelectors と inputSelectorsの結果を入力とする関数resultFunc |resultFuncの計算結果|inputSelectorsのいずれかの結果が変化したとき[^3]|

[^1]: `React.memo`によりメモ化された componentは、propsが変化しなければ再レンダリングされませんが、propsに inline callbackが含まれると、propsが変化するため再レンダリングされます。これを防ぐために、`useCallback`により callbackをメモ化することができます。

[^2]: `useCallback(fn, deps)` は `useMemo(() => fn, deps)`と等価です。

[^3]: `Redux useSelect(selector: Function, equalityFn?: Function)` では state が変化したとき、selector関数の計算が常に発生します。selectorの計算コストが高いときには `reselect` を使用することで、依存する stateの一部が変化したときにだけ再計算が発生するようメモ化できます。

# 参考にしたページ
[React の最上位 API – React](https://ja.reactjs.org/docs/react-api.html)
[フック API リファレンス](https://ja.reactjs.org/docs/hooks-reference.html)
[reduxjs/reselect: Selector library for Redux](https://github.com/reduxjs/reselect)
[React.memo / useCallback / useMemo の使い方、使い所を理解してパフォーマンス最適化をする](https://qiita.com/soarflat/items/b9d3d17b8ab1f5dbfed2)
LPC1114と温度,S-5851で液晶温度計 (Mbed)(AQM0802A)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

x プログラムは、STM32F303K8とi2cが違う


```c++


//I2C i2c(I2C_SDA, I2C_SCL); //767 303
I2C i2c(dp5, dp27); //1114
//I2C i2c(PA_10, PA_9); //010


```


プログラム


```c++

#include "mbed.h"

//#define S5851A 0x48
#define ADDR        ((0x48)<<1) //  address
#define ADDR_LCD    (0x7C)      //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767 303
I2C i2c(dp5, dp27); //1114
//I2C i2c(PA_10, PA_9); //010

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

int     tempval;        //温度
char    data_read[6];   //i2cバッファー
int     n10;            //10の桁
int     ii;             //ループカウンター

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

char INIT_cls[]={0x0,0x1};

int main()
{

    //液晶の初期化
    for(ii=0;ii<11;ii++){
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(2);
    } //for

    while (1) {

        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(2);

        //初期化
        //set address 0
        i2c.write(ADDR, "\000", 1); //addres 0

        //温度の読み込み
        // Read temperature register
        i2c.read(ADDR, data_read,1,false);

        //温度の保存
        // Calculate temperature value in Celcius
        tempval =  data_read[0];

        //tempval = 12; //debug

        //計算
        // Calculation temp
        n10 = DVI10(tempval);             //10の桁
        tempval = tempval - ( n10 * 10 ); //1の桁

        //液晶に出力
        // Display result
        data_read[0] = '@';
        data_read[1] = '0' + n10;
        data_read[2] = '0' + tempval;
        //data_read[3] = '\r';
        //data_read[4] = '\n';
        data_read[3] = 0;
        i2c.write(ADDR_LCD, data_read ,3);

        //1秒待つ
        wait_ms(1000);

    }//while

}//main



```
AtCoder Beginner Contest 206（Sponsored by Panasonic）参戦記（三完）

## A問題
https://atcoder.jp/contests/abc206/tasks/abc206_a
税抜き$n$円のものがあります。税込価格では$206$円以上か以下かちょうど$206$円かを求めてください。

誤差を考えなくとも良いです。
また、税込価格を求めるときには```math.floor()```を使いました。

```py
n = int(input())
 
import math
 
if math.floor(n * 1.08) < 206:
    print("Yay!")
elif math.floor(n * 1.08) == 206:
    print("so-so")
else:
    print(":(")
```

## B問題
https://atcoder.jp/contests/abc206/tasks/abc206_b
貯金をしたいです。$i$日目には$i$円貯金します。
貯金が$n$円貯めるには、最低何日かかるでしょうか。

1日目から順々にシュミレーションすればよいです。
こういうときは```while```を使うことによってきれいに書けます。

```py
n = int(input())
 
d = 1
y = 0
 
while y < n:
    y += d
    d += 1
 
print(d - 1)
```

## C問題
https://atcoder.jp/contests/abc206/tasks/abc206_c
$N$項からなる数列があります。
$A_i$と$A_j$が異なる整数$i, j$$(i < j)$の組が何通りあるかを求めてください。

ソートしてごにょごにょやります。
より詳しく言うと、ソートすると同じ整数が並んだ状態になるので、やりやすくなりますね。

```py
n = int(input())
a = list(map(int, input().split()))
 
a.sort()
 
d = 0
ans = 0
 
for i in range(1, n):
    if a[d] != a[i]:
        d = i
    ans += d
 
print(ans)
```

## 終わりに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632093/c0da1f7e-c27a-29f0-44f4-f1629600b1c1.png)
冷えました。悲しいです。
いい加減Dを解けるようになりたいものです。
ちなみに、Cの制約を誤読していて、ソートすると間に合わないと思っていました。
ちゃんと制約を見ましょう（自戒）
AWS CLIの振り返り ~S3入門編~

#本記事の目的
JAWS-UG CLI オンラインハンズオンの復習として、ハンズオンで取り上げられたAWSサービスに関する用語と、使用したAWS CLI コマンドを箇条書きでまとめる。
今回はS3入門編を取り上げる。

#主なAWSサービス用語
####バケット
オブジェクトを格納するストレージの論理区間。

####オブジェクト
バケットに格納されるデータ。

####(オブジェクト)キー
オブジェクトの固有の識別子。

####署名付きURL
一時的にバケットにアクセスするためのURL。

####ACL
バケットやオブジェクトへのアクセス管理をXMLで定義する方法。その内、事前に定義済みの一連のACLは**既定ACL**と呼ばれ、private,public-read,public-read-write等が含まれる。

####静的Webサイトホスティング
S3を利用して、静的コンテンツ(表示される内容が変わらないHTMLページ)をWebサイトとして公開する機能。

#主なAWS CLI コマンド一覧
####バケットの作成
```
aws s3 mb \
　　　　s3://${S3_BUCKET_NAME}
```

####バケットの一覧表示
```
aws s3 ls　 \　　
　　　　s3://${S3_BUCKET_NAME}　\
　　　　--recursive
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|s3://<バケット名>|任意|特定のバケットの情報を取得可能。|
|--recursive|N/A|任意|指定したディレクトリ以下にある全てのオブジェクトを一覧表示する。|

####バケットの削除
```
aws s3 rb \
  s3://${S3_BUCKET_NAME}　\
  --force
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|s3://<バケット名>|必須|特定のバケットの情報を取得可能。|
|--force|N/A|任意|バケット自体を含むバケット内の全てのオブジェクトを削除する。|

####オブジェクトのアップロード/コピー/ダウンロード
```
aws s3 cp \
 　　s3://${S3_BUCKET_SOURCE}/${S3_OBJECT_SOURCE} \
 　　s3://${S3_BUCKET_NAME}/${S3_OBJECT_KEY}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|s3://<コピー元バケット名>/<コピー元オブジェクトキー>|必須||
|N/A|s3://<コピー先バケット名>/<コピー先オブジェクトキー>|必須||

####オブジェクトの削除
```
aws s3 rm　　\
　　　　s3://${S3_BUCKET_NAME}/${S3_OBJECT_KEY}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|s3://<バケット名>/<オブジェクトキー>|必須||

####オブジェクトの移動
```
aws s3 mv \
　　　　s3://${S3_BUCKET_SOURCE}/${S3_OBJECT_SOURCE}　　\
 　　s3://${S3_BUCKET_NAME}/${S3_OBJECT_KEY}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|s3://<移動元バケット名>/<移動元オブジェクトキー>|必須||
|N/A|s3://<移動先バケット名>/<移動先オブジェクトキー>|必須||

####オブジェクトの同期
```
aws s3 sync \
 　　${DIR_S3_SYNC}
 　　s3://${S3_BUCKET_NAME}/ \
 　　--exclude ${S3_SYNC_EXCLUDE} \
　　　　--acl ${S3_SYNC_ACL}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|同期ファイル用ディレクトリ|必須||
|N/A|s3://<同期先バケット名>|必須||
|--exclude|除外するオブジェクト|任意|同期対象から除外するディレクトリまたはファイルを指定可能。|
|--acl|既定ACL|任意|既定ACLの例：public-read(全てのユーザに対して読み取りのみ許可)|


####署名付きURLの作成
```
aws s3 presign \
　　　　s3://${S3_BUCKET_NAME}/${S3_OBJECT_KEY} \
　　　　--expires-in ${S3_PRESIGN_SECONDS}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|s3://<バケット名>/<オブジェクトキー>|必須||
|--expires-in|署名付きURLの有効期限|任意|署名付きURLの有効期限を分単位で指定可能。|

####静的Webサイトホスティングの有効化
```
aws s3 website \
　　　　s3://${S3_BUCKET_NAME} \
 　　--index-document ${S3_DOC_INDEX} \
 　　--error-document ${S3_DOC_ERROR}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|N/A|s3://<バケット名>|必須||
|--index-document|インデックスファイル|任意|静的Webサイトのインデックスファイルを指定可能。|
|--error-document|エラーページファイル|任意|静的Webサイトのエラーページファイルを指定可能。|

####バケットリージョンの取得
```
aws s3api website get-bucket-location \
　　　　--bucket ${S3_BUCKET_NAME}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--bucket|バケット名|必須||



#参考文献
- AWSCLIコマンドリファレンス:[S3](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): S3入門](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-s3-highlevel/index.html)
配列に格納されている関数を間隔空けて実行したいし戻り値もほしい

## 経緯

WEBスクレイピングやろうと思った訳ですよ。ただ「このページを定期的にクロールする」とかじゃなくて「わんさかあるページからわんさか情報取ってくる」ってやつで、流石にページロードの間隔空けないと問題が起こるなぁと思って。

### `setTimeout` は戻り値がとれない

外部にコンテナ用意して入れるとか、そんなむりやりな方法もありますが、関数が戻り値を返すんだからそのままほしいじゃん。

## 実装(普通の関数)

```javascript
// 関数を遅延実行できるようにするやつ
const lazyFunction = (f, ...args) => {
  return () => f(...args)
}

// 適当な関数
const log = (n) => {
  console.log(n)
  return n
}

// 適当な関数を5個実行できるようにする
const logs = [1,2,3,4,5].map(n => lazyFunction(log,n))

// 等間隔実行の関数
const intervaledExecute = async (fs, interval) => {
  const promises = fs.map((f, i) => new Promise((resolve, reject) => {
    // setTimeout を interval 伸ばしながら実行するようにする
    setTimeout(() => resolve(f()), interval * i)
  }))
  // Promiseは一気に解決しちゃう
  return await Promise.all(promises)
}

// 1秒毎に1、2、3、4、5って出てその後に[1,2,3,4,5]が出る
(async () => {
  res = await intervaledExecute(logs, 1000)
  console.log(res)
})()
```

## 実装(実行したいのがPromiseだった場合)

```javascript
// ここはかわらない
const lazyFunction = (f, ...args) => {
  return () => f(...args)
}

// 適当なPromise関数
const logp = n =>  new Promise((resolve, reject) => {
  console.log(n)
  setTimeout(() => resolve(n), 500)
})

const logps = [1,2,3,4,5].map(n => lazyFunction(logp, n))

// 等間隔実行関数
const intervaledExecutePromises = async (ps, interval) => {
  const promises = ps.map((p,i) => new Promise((resolve, reject) => {
    // then で Promise の結果を取り出して外の resolve に渡す
    setTimeout(
      () => p().then((r, s) => resolve(r)),
      interval * i
    )
  }))
  return await Promise.all(promises)
}

// 0.5 秒毎に数字が出て最後に配列が出る
(async () => {
  res = await intervaledExecutePromises(logps, 500)
  console.log(res)
})()
```

力技だなぁ……なんかもーちょっと……スマートな書きかた無いかなぁ……
最低限知っておくべきGitコマンド

# はじめに
Git初心者が覚えておくべき必須コマンドを自分用のメモとしてまとめました。



<!-- 各チャプター -->
# git init
Gitの初期化処理を行う。


```
git init
```

Git管理下に置きたいディレクトリまで移動し、上記コードを実行する事で.gitファイルが生成される。
<br>


#git remote
リモートリポジトリを関連付ける。


```
git remote add origin <RemoteRepositoryURL>
```
リモートリポジトリ(GitHubのリポジトリ等)のURLを指定し実行する事で、ローカルリポジトリとリモートリポジトリを繋げることができる。
<br>


# git status
ローカルリポジトリのgitの状態を確認できる。


```
git status
```

<br>

# git add
変更を仮登録する。


```
git add <ファイル名>

git add .
```
.を付けることで変更がある全てのファイルを対象とできる。
<br>

# git commit
仮登録してある変更を本登録する。

```
git commit

git commit -m "コミットメッセージ"
```
-mを付けることで同時にコミットメッセージも記述できる。
<br>

# git push
本登録した変更を、リモートリポジトリに反映させる。

```
git push origin <ブランチ名>

git push -u origin <ブランチ名>
```
-uを付けることで次回から「git push」のみで実行できる。
ブランチを作っていない場合、ブランチ名は「master」
<br>

# git pull
リモートリポジトリの最新情報をローカルリポジトリに反映させる

```
git pull origin <ブランチ名>

git pull -u origin <ブランチ名>
```
-uを付けることで次回から「git pull」のみで実行できる。
<br>

# git clone
リモートリポジトリのソースコードをローカルにコピーする。
<br>

```
git clone <RemoteRepositoryURL>
```
リモートリポジトリのURLを記述することで、ソースコードを丸々コピーできる。
<br>

# git branch
ブランチ(作業場)の作成、確認、削除などができる

```
git branch
```
ブランチの状態を確認。
<br>

```
git branch <作成したいブランチ名>
```
ブランチの作成。
<br>

```
git branch -d <削除したいブランチ名>
```
ブランチの削除。
<br>

# git checkout
ブランチ間を移動できる。

```
git checkout <切り替え先のブランチ名>
```
ブランチ名を指定することで、そのブランチに移動できる。
<br>

```
git checkout -b <作成したいブランチ名>
```
-bを付けることで、ブランチの作成と移動が同時にできる。
<br>

# git merge
ブランチを統合させる。

```
git merge <統合させたいブランチ名>
```
統合させたいブランチ名を指定することで、現在のブランチと統合する事ができる。
<br>