OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 に Intel の(無料)compiler を入れてみる

# Intel コンパイラーがタダですってよ奥様!!

にわかに信じ難いが、あのお高いIntel Compiler がタダで手に入る時代になりました。
ということで、インストール大会。

## タダのツールキットを取ってくる。

https://software.intel.com/content/www/us/en/develop/articles/free-intel-software-developer-tools.html

ふむふむ。私はHPCが好きなので、ベースツールキットとHPCツールキットを落としてくればいいのね。

早速ダウンロードします。

https://software.intel.com/content/www/us/en/develop/tools/oneapi/base-toolkit/download.html

オペレーティングシステムと、ダウンロード方式を選びます。
私はLinux + YUMですのでそれを選択。
web + download って手もあって(インテルはこれをオススメしている。)それにしようかと思ったが、ちょっとyumでやってみようと思います。

インストールのインストラクションが示されるのでそれを基にやってみる。

```vim:/etc/yum.repos.d/oneAPI.repo
[oneAPI]
name=Intel(R) oneAPI repository
baseurl=https://yum.repos.intel.com/oneapi
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://yum.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
```

んでもって、インストラクションページの下層にあるパッケージを選択してインストールすればよさげ。

たとえばベースキットを入れたい時は

```bash
$ sudo yum install intel-basekit
```

とすればよろし。
なので、HPCキット(intel-hpckit)も同じようにすればきっと入るはず。

ということでインストール。

```bash
$ sudo yum install intel-basekit intel-hpckit
〜 中略 〜
Install  2 Packages (+92 Dependent packages)

Total download size: 3.3 G
Installed size: 16 G
```

これはまたデカイですね。ちょっとしたディストリビューションサイズではないですか。
とりあえず y して、風呂でも入ってきますかね。
…とおもったら、風呂沸かす準備の前にダウンロードが終わってしまった。最近の回線ははやいですね。

```bash
80 MB/s | 3.3 GB  00:00:42 
```

ですってよ奥様。
で、インストールしたら、使い方がややこしいので、それは次回にペンディング。

サンプルコードの備忘録

https://software.intel.com/content/www/us/en/develop/documentation/get-started-with-intel-oneapi-base-linux/top/run-a-sample-project-using-the-command-line.html

使い方の備忘録

https://software.intel.com/content/www/us/en/develop/documentation/get-started-with-intel-oneapi-hpc-linux/top.html
JavaScriptを学ぶ―関数オブジェクトとは―


JavaScriptでは「関数はオブジェクト」であるようです。
Javaを学習していたので、意味が分かりません…
違和感があるので、まとめてみたいと思います。

# 関数はオブジェクト
- 関数⇒は何かしらの処理
- オブジェクト⇒モノ

であると認識していますが、この２つが何故同じオブジェクトであるのでしょうか？


何となく分かりやすい料理のレシピで例えると

- 関数⇒やること：何かを作るために、何が必要で、どんな手順で処理するか。
- オブジェクト⇒レシピ：どんな材料で、どんな手順で何ができるか書いたもの。

こう考えるとほぼ一緒ですね。

# 関数をオブジェクト扱いするとどうなるか
JavaScriptではこのように「関数は処理手順を定義したオブジェクト」として扱われます。
オブジェクトなので変数に代入したり、引数として別の関数に渡したりすることが可能です。


#ソースコードを見てみる
```html
    <script>

        function add(a, b) {
            return a + b;//※　a + bというメソッドを返す
        }

        //a+bというメソッドをcalcLatorに代入する
        const calcLator = add;

        //xに2+3=5を代入する
        const x = calcLator(2, 3);

        console.log(x);//5

    </script>
```

上記のコードだと、***※***の位置でa+bというメソッドをオブジェクトとして扱っているので、calcLatorという変数に代入が可能という訳です。
calcLatorは計算式がはいっているので、`calcLator(2, 3);`とすると`2+3`をしてくれます。


因みに無名関数（関数名を指定しない）書き方はこんな感じです。

```html
<script>
        //無名関数
        //a/bをそのままcalcLatorに入れたvar
        const calcLator = function (a, b) {
            return a / b;
        }
        //xに3/2=5を代入する
        const z = calcLator(3, 2);

        console.log(z);//1.5
</script>
```

#まとめ
関数オブジェクトのポイントは***「関数オブジェクト単体で考えるのではなく、呼び出し側とペアで考えること」
関数オブジェクトは単体では意味がなく、利用する呼び出し側があって初めて機能します。

「関数もオブジェクト」が分かってきました。

参考:https://book.impress.co.jp/books/1115101084
Railsのリファクタリングの例

リファクタリングとはプログラミングにおいて、プログラムの動作を変えずにコードの内部構造を整理すること、つまりコードを見やすくすることを言う。

修正前

```ruby
    <% if user_signed_in? && current_user.id == @item.user_id && @item.purchase.blank? %>
      <%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %>
      <p class="or-text">or</p>
      <%= link_to "削除", item_path, method: :delete, class:"item-destroy" %>
    <% else user_signed_in? %>
    <% if @item.purchase.blank? %>
    <%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%>
```

これはフリマアプリの一例で、ユーザーのログイン状態において出品した商品の編集、削除ボタンが表示されるか、もしくは購入ボタンが表示されるかの条件分岐を記述したものである。
これだと１行目に「ログインしていればかつ現在ログイン中のユーザー、出現在ログインしているユーザーが商品の出品者であればかつ商品は売れていなければが同じである」というややこしい表記法になっている。
さらに５行目にまたuser_signed_in?があり、６行目に商品は売れていなければの記述で購入画面に進むを表示させる制御をしている。
そこで下記のようにリファクタリングしてみる。


```ruby
    <% if user_signed_in? || @item.purchase.blank? %>
    <% if current_user.id == @item.user_id %>
      <%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %>
      <p class="or-text">or</p>
      <%= link_to "削除", item_path, method: :delete, class:"item-destroy" %>
    <% else %>
    <%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%>
    <% end %>
    <% end %>
```
１行目に大きな条件として"ログインしていれば" かつ "商品は売れていなければ"を記述、２行目に"現在ログインしているユーザーが商品の出品者であれば"をif文のネスト構造で記述して「商品の編集」「削除」を表示させるか 「購入画面に進む」を表示させるかを制御している。
１行にまとめるよりも２行に分けたほうが後々わかりやすく重複しない。
Artifactoryのインストール Docker compose版

今回はDocker composeを使用してArtifactoryのインストールを試します。
Docker composeとは、複数のコンテナをまとめて管理できる定義ファイルです。

#Docker compose等の準備
まずは、Dockerのインストールと起動を実施します。
すでに以前紹介しているので、以下に必要なコマンドのみ掲載します。
※sudo省略

```
yum -y install docker
systemctl start docker
systemctl enable docker
systemctl status docker
```

次にDocker composeのインストールを実施します。
[こちらのページ](https://github.com/docker/compose/releases)から最新版のバージョンを確認して、それを取得します。
取得方法もそのページ内に記載されている…との事ですが、現在はそれらしい記述が見当たらなかったので、ひとまずこちらに取得のコマンドを記載しておきます。
コマンドは以下です。

```
curl -L https://github.com/docker/compose/releases/download/<最新のバージョン>/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```

エラーなく取得できたら、以下のコマンドを実行し、実行権限をつけます。

```
chmod +x  /usr/local/bin/docker-compose
```

実行権限付与後、```docker-compose --version```コマンドを実行してバージョンが表示されたら完了です。

#Docker composeを使ったインストール
続いてこちらの[公式ページ](https://jfrog.com/open-source/)からDocker composeの圧縮ファイルをダウンロードします。
以下画像の青枠内の部分から「Docker Compose」を選択してから緑枠内の「Click here」をクリックします。

![atf01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/d538b671-69ba-0c92-dc41-e823b333dfe5.png)

ちなみにフリーのOSS版は上記からダウンロードが可能ですが、こちらの[公式ページ](https://jfrog.com/download-jfrog-platform/)からpro版のダウンロードが可能なようです。
pro版は30日間試用が可能のようですが、期限が切れた際の挙動が気になったので、今回はこちらをインストールしてみました。

ダウンロードした圧縮ファイルをSCP等でインストール対象サーバーへ転送し、以下のコマンドで解凍します。
解凍が正常に実行出来たら、カレントディレクトリにできる```artifactory-pro-<version>```ディレクトリへ移動します。
※OSS版の場合は```artifactory-oss-<version>```

```
tar -xvf jfrog-artifactory-pro-<version>-compose.tar.gz #OSS版の場合は「pro」を「oss」に読み替え
```

解凍後に出来たディレクトリへ移動後、中に入っている以下のスクリプトを実行します。

```
./config.sh
```

スクリプト実行後、対話形式でのセットアップが実行されますので、必要に応じて設定を行います。
少々待つと、```Done```と表示されます。

セットアップが完了すると、インストールに必要なyamlファイルが生成されます。
以下のコマンドを実行し、Artifactoryのインストールを実行します。

```
docker-compose -p rt-postgres -f docker-compose-postgres.yaml up -d
docker-compose -p rt up -d
docker-compose -p rt ps #Name:artifactoryのStatusがUpになっていれば成功
```

インストールと起動が完了しましたら、早速ブラウザにてログインするのですが、その前にFirewallで通信許可の設定を入れます。

```
firewall-cmd --add-port=8081-8082/tcp --zone=public --permanent
firewall-cmd --reload
```

通常のインストール手順と同様に、```http://<サーバーのIP>:8082```へアクセス出来ればインストール完了です。
今回は以上です。
NS3&ndnSIM v2.1 の依存関係解決とメモ（for Ubuntu 18.04 LTS）


## whatis ndnSIM?


- NDN(CCN)で利用されているシミュレータ 
    - https://ndnsim.net
- NS3（Network Simulator 3）上で動作。

## ndnSIM 2.1関係のドキュメント

- Doxygen: https://ndnsim.net/2.1/doxygen/

### NFD-0.3.4-ndnSIM

- Mon May 4 12:56:48 2015 -0700のやつ
- https://static.eric-lightning.info/Docs/nfd/0.3.4/doxygen/
- DevGuide: Rev4 
  - https://named-data.net/wp-content/uploads/2015/05/ndn-0021-4-nfd-developer-guide.pdf

### ns3.23-dev-ndnSIM-2.1

-  https://www.nsnam.org/releases/ns-3-23/documentation

## 依存関係

```shell-session
sudo apt install python libsqlite3-dev libcrypto++-dev libboost-all-dev
```

## 設定とコンパイル
```sh
# ns-3のディレクトリにwafがある．
cd ns-3
######################
# 設定（初回のみ）
./waf configure --enable-example

#####################
# コンパイル（2回目以降は変更箇所のみ）
./waf

# 基本，ソースコードの変更 -> ./waf -> ソースコードの変更 -> ./waf ....
# で，コンパイルが通るか，確認する．
#--------------------------------

# 下記の「シミュレーション実行」を参考にシナリオを実行して，シミュレーションを実行する．

#---------------------------------

###############################
# 全て，コンパイルしなおす場合
# コンパイルしたものを全て消して
./waf clean
# 設定しなおして
./waf configure --enable-examples
# 全部コンパイルしなおす
./waf

```

## シミュレーション実行

```
# ns-3/src/ndnSIM/examples/ndn-simple.cppのシナリオを実行
./waf --run "ndn-simple"
# パラメータがある場合
./waf --run "ndn-simple --DATA_RATE=1Mbps"

```

## メモ

### ディレクトリ構造

```
ns-3
├── bindings
├── build .... コンパイルしたもの。
├── doc
├── examples ... NS3のシナリオ（ndnSIMではない）
├── src
│   ├── ndnSIM（ndnSIMのディレクトリ）
│   │   ├── NFD（転送関連をつかさどる、NDN FORWARDING DAEMON）
│   │   │   ├── contrib
│   │   │   ├── core
│   │   │   ├── daemon
│   │   │   │   ├── face
│   │   │   │   ├── fw（転送関係の処理、forwarder.cpp）
│   │   │   │   ├── mgmt
│   │   │   │   └── table（各種テーブル）
│   │   │   ├── docs
│   │   │   ├── rib
│   │   │   ~~
│   │   ├── apps
│   │   │   └─ 送信要求のConsumerと返送のProducer
│   │   ├── examples（シナリオファイル）
│   │   ├── helper（ヘルパー、シナリオファイルで使うHelperのプログラム）
│   │   ├── model
│   │   │   └── cs（キャッシング）
│   │   │       └── custom-policies
│   │   ├── ndn-cxx（NDNのツール群）
│   │   │   └── src
│   │   │       └── data,interest,link,name,face...（データに情報入れて返送する）
│   │   │       
|   |   |
|   |   |
|   |   |
│   │   └── utils
│   │       ├── ndn-fw-hop-count-tag.[h|c]pp ... インタレストにタグの情報を入れて送信する．
│   │       ├── topology
│   │       ├── tracers
│   │       └── trie
│   │           ├── LFU
│   │           ├── ONE
│   │           ├── TWICE
│   │         　~~
│   ├── network
│   ├── openflow
│   ├── point-to-point
│   ~~（そのほか、いろいろ）
├── utils
│   └── lcov
└── waf-tools
```
意外としらない？エンジニアなら覚えておきたいChrome開発者ツールでできること8選

ウェブ系エンジニアで働いていると頻繁にChromeのデベロッパーツールをよく使うと思います。
デバッグのときやパフォーマンスのボトルネックを探すとき、レスポンシブ対応のCSSを書く際などにデベロッパーツールは便利ですよね。

そこで今回は、普段自分が使っていて便利だと感じる機能をまとめました。
知っていると知らないでは開発効率が大きく変わると思います。
筆者の私はChromeマスターでもなんでもないので、他にも便利な機能があればコメント教えていただけると今後使えるので助かります。

# 0.紹介する機能一覧
1. 機能検索するためのショートカットキー
2. 選択したElementを非表示にするショートカットキー
3. CSSの色指定形式を変更する
4. 任意のHTML Elementにブレイクポイントをおく
5. 直近に選択したHTML Elementを参照する
6. XHR/Fetchにブレイクポイントを設定する
7. consoleで直近で評価された値を参照する
8. CSSセレクターを使ってDOM elementへの参照を取得する

# 1. 機能検索するためのショートカットキー
コンソールタブ、ネットワークタブなどたくさん機能があるデベロッパーツールですが、詳細検索を使うことでマウスを使わずキーボードだけで切り替えられます。
`command + shift + P`を押すことで、下記の写真のように機能が検索できます。

![Screen Shot 2021-04-18 at 18.16.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101149/50cf9419-cda8-88dc-827d-e074ccac035d.png)

# 2. 選択したElementを非表示にするショートカットキー
HTML/CSS関連のデバッグしているときに特定の要素の表示・非表示にしたいときも稀にあると思います。
そんな時はElementsの中から非表示にしたい要素をクリックして、`h`を押すと切り替えができます。

# 3. CSSの色指定形式を変更する
当たっている色を調整するときに割と便利なのがCSSの色指定形式を変更する方法。
個人的な話ですが、16進数表記やrgb表記が個人的にわかりにくく、hsl表記が好きなので結構色指定の形式を変更します。
方法は簡単で、変更したいCSSの色を`shit`を押しながら押すと形式が変わります。

# 4. 任意のHTML Elementにブレイクポイントをおく
JavaScriptでDOM操作をすることがあると思います。
デバッグの際などに、どのJavaScriptのコードによって特定のDOMの変更がなされたのかを知るために、Elementにブレイクポイントを置けます。
ソースコードを追えば済みますが、ソースコードを追う手間を少しだけ省くのに便利です。
ブレイクポイントをおきたいElementを選択肢
-> 右クリックして
-> Break on
を押すことでブレイクポイントを置けます。
ブレイクポイントのタイミングは以下の三つから選べます
```・Elementのサブツリー変更
・Attributeの変更
・Nodeの削除
```

# 5. 直近に選択したHTML Elementを参照する
Elementsタブから要素を選択し、その後にconsoleで`$0`と打つと直近で選択した要素を参照することができます。
参照した要素にクラスを追加したりDOM操作も簡単にできると知っておくと意外と便利です。
```$0.classList.add('new-class')
```
`$0,$1,$2`数値を変えることで選択履歴を遡って参照できます。

# 6. XHR/Fetchにブレイクポイントを設定する
JavaScriptを使ってAPIでデータを取得することがあると思います。
特定のAPIにバグがある際などに、特定のAPIへのリクエストに対してブレイクポイントをおく方法を知っておくと意外と便利です。
方法は簡単で、Sourcesタブを選択し、画面右の`XHR/fetch breakpoint`にデバッグしたいURLを追加すると簡単にブレイクポイントを置けます。
![Screen Shot 2021-04-18 at 19.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101149/a0253e19-d9ac-5e60-3993-aae6662ac316.png)

# 7. consoleで直近で評価された値を参照する
console画面で何かしらの式を書くことがあるかと思いますがそのときに便利な機能です。
画像のように`$_`を使うことで直前の評価された値を参照することができます
![Screen Shot 2021-04-19 at 14.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101149/840fec3f-f607-fe41-204c-bba8f3fb69f3.png)

# 8. CSSセレクターを使ってDOM elementへの参照を取得する
コンソール内で`$(selector)`を使うことで下記の画像のようにDOMを参照できます。
![Screen Shot 2021-04-19 at 15.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101149/17431e30-b592-e52c-26bd-76aecb7dcc5f.png)
一番最初の該当するelementを取得できます。
また、`$$('selector')`を使うことで該当するelements全てを配列で取得することも可能です。
補足情報ですが、こちらはdocument.querySelector()のエイリアスです。

# 参照
こちらのページではより多くの機能が詳細に記載されています。

https://developer.chrome.com/docs/devtools/console/utilities/
# 終わりに
今回は私が個人的に便利だと思うChrome Developerツールの便利な機能をまとめました。
ぜひ使ってみてください。
演算子 PHP

演算子の学習用メモ

#演算子とは
演算子とは、ひとつ以上の値 (または「式」) から別の値 (や「式」) を生み出すものです。
> https://www.php.net/manual/ja/language.operators.php

```php
2 + 5 ;
1++ ;
$num = 14 ;
20 < 25 ;
'私の名前は' . ' 鈴木太郎' ;
```

これらの`+``=``<``.`は全て１つ以上の値を操活用し別の値を生み出すと言う点においてそれぞれ`+は代数演算子`、`=は代入演算子`、`<は比較演算子`、`.は結合演算子`と呼ばれ、<strong>演算子という同じくくり</strong>になります。

また、`++`のように１つの値を活用する演算子を`単項演算`、
`2 + 5`のように2つの値を活用する演算子を`二項演算`と呼びます。

#代数演算子
基本的には学校で習った感覚で記述できます。

```php
echo  3 + 7;
//10
```

###演算子の優先順位
代数演算子は二項演算に部類されます。つまり以下のような式でも実際には1+2を計算し、その結果に+3のように左から評価されています。

```php
echo 1 + 2 + 3; // 実際は (1 + 2) + 3
//6
```
>詳しくはリファレンス参照
> https://www.php.net/manual/ja/language.operators.precedence.php


#代入演算子
左オペランドに右オペランドの式の値を設定する("得て代入する") ことを意味します。

```php
echo $num = 7 ;
//7
```

###「$num = 7」の演算後、$num変数から７を取得しなくても、「$num = 7」の演算結果として７という値は取得できる

```php
// 変数から取得もできるが、、
$num = 7;
echo $num . "<br>";

// 演算結果で7が取得できるのでそのまま値として扱えます。
echo  $num = 7 . "<br>";

```
実行結果の値は7で同じです。
冒頭で演算子とは１つ以上の値を活用して別の値を生み出すと記述しましたが、<strong>変数から取得しなくても「$num = 7」という式そのものの演算結果として7が取得できています。</strong>


サンプル

```php
$a = ($num = 7) + 3 ;
echo $a ;
//10
```

###複合演算子
代入演算子は、<strong>同じ演算子というカテゴリに属する、代数演算子や結合演算子と組み合わせて使うことができます。</strong>これを「複合演算子」と呼びます。

```php
//【A】
$int = 10;
$int += 5; //① + (代数演算子)  ② = (代入演算子) の順番で実行
echo $int . "<br>";
//15

//【B】
$string = 'おこさま';
$string .= 'メニュー'; //① . (結合演算子)  ② = (代入演算子) の順番で実行
echo $string . "<br>"
//おこさまメニュー
```
【A】の場合 \$int = \$int + 5; (【B】の場合 \$string = \$string + 'メニュー';)でも最終的に変数に代入される値は同じですが、
<strong>`+`や`+`や`.`が○○演算子という同類であることを意識していると複合演算子での記述が理解しやすくなります。</strong>

#続き
https://www.php.net/manual/ja/language.operators.comparison.php
https://www.php.net/manual/ja/language.operators.increment.php
https://www.php.net/manual/ja/language.operators.logical.php
https://www.php.net/manual/ja/language.operators.string.php
https://www.php.net/manual/ja/language.operators.array.php
[Swift]YoutubeAPIを使用してJSON形式の情報をXcodeで扱う方法

<h2>YoutubeAPIを使用してみよう</h2>

YoutubeAPIを使用してJson形式の情報を扱えるようにするには以下の手順で作業を行う

**1:YoutubeAPIを使用でできるよにプロジェクトの作成、とAPIキーを作成するconsole.cloud.google.com**
**2:Xcodeで対象のJSON形式に対応したmodelを作成する**
**3:APIへリクエストを投げる**
**4:レスポンス情報をmodel型のオブジェクトへデコードする**


まずは、APIキーの作成をするためにhttps://developers.google.com/youtube/v3/getting-started?hl=ja
へアクセスして

**作業を始める前に**
という項目の手順よりGoogleアカウントが無ければ作成
https://console.cloud.google.com/apis/credentials?hl=ja&project=youtubeapp-311106&folder=&organizationId=
へアクセス

![7a26467c2a73e4cc837296144a2b07ce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276686/43b5d4d9-f438-e8c9-4ae9-02d16e9c092f.png)


私の画面だとハンバーガーメニューの右側のGoogole Cloud Platformの右のYoutubeAppのタブから作成できる。
その後
**+認証情報の作成**
というタブをクリックしてAPIキーを発行する
このAPIキーはYoutubeAPIへリクエストを投げる時にクエリパラメータとして渡す値で
文字通り鍵（認証）に役割を果たす。
では試しに。
https://www.googleapis.com/youtube/v3/search?q=任意の文字&key=取得したキー&part=snippet

というURLへアクセスすると
![8de037f135ce0a24464267d874a09c27.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276686/ec6f2249-d20e-fc52-cb56-1cc7d1330d67.jpeg)

JSONファイルがレスポンスとして返ってくる。
要はこれをXcodeで扱えるようにする事ができればいい。

そのために
alamofireというライブラリを使用する。
このライブラリはhttp通信のためのライブラリ

cocoapodでライブラリをプロジェクトにインストールする。

<h2>テストコード</h2>
デフォルトのストーリーボードに紐付けられているViewControllerでテストコードを書いてみる


```swift
import UIkit
import Alamofire
class ViewController: UIViewController{

override func viewDidLoad() {
        super.viewDidLoad()
        //リクエスト　URL
        let urlString = "https://www.googleapis.com/youtube/v3/search?q=検索したいワード&key=APIキー&part=snippet"
        
　　　　　//リクエストを作成
        let request = AF.request(urlString)
        
        //リクエストをyoutubeApiに投げてレスポンス情報を取得
        request.responseJSON{(response) in
            do{
                //Json情報を取得して対象のモデルオブジェクトへ変換
                guard let data = response.data else { return }
                let decode = JSONDecoder()
                let video = try decode.decode(Video.self, from: data)
                print("video:", video.items.count)
            } catch {
                print("変換に失敗しました\(error)")
            }      
            print("response", response)
        }
    }
}
```

modelはこのように

```swift
import Foundation

class Video: Decodable {    
    let kind: String
    let items: [Item]    
}

class Item: Decodable {    
    let snippet: Snippet   
}

class Snippet: Decodable {    
    let publishedAt: String
    let channelId: String
    let title: String
    let description: String
    let thumbnails: Thumbnail
}

class Thumbnail: Decodable {    
    let medium: ThumbnailInfo
    let high: ThumbnailInfo    
}

class ThumbnailInfo: Decodable {    
    let url: String
    let width: Int?
    let height: Int?    
}
```

Json形式の情報をデコードするには変数名を一致させる必要があり、配列に対しては上記のように
クラスを作成して入れる情報をクラスで扱えるようにする。
例えば、レスポンスとして返ってきたjson情報には
Itemという配列がある。この配列の中には更にkindやidなどの変数や、snippetなどの配列がある
この配列の中に入っている情報一つの型（クラス）で扱う。

結果として一つのvideoクラスのインスタンスが作成され、
その中のItemという変数名の配列にjson情報のItem配列の各要素が格納される

ちなみに、json情報の全ての要素を格納する変数を用意しなくても取り出したい情報だけ用意しておけばいい。
逆に、json情報にない情報を格納する変数がモデルオブジェクトで宣言されているとエラーとなる。

あと生成したオブジェクトの情報を使って、imageURLから画像をダウンロードしたり、文字列を　labelに割り当てたり似たり焼いたりお好みに
ColabとgoogleDriveの関係

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) ColabにマウントしたgoogleDriveと自分のgoogleDriveの関係をわかりたい。

##やること
Google ColaboratoryにGoogleDriveをマウントして、
それと自分が普段使っているGoogleDriveの関係を把握します。


##Google Colaboratoryとは？
割愛します。
Google Colaboratoryにログインして新規ファイルを開いた後という前提で説明します。


##ColaboratoryにGoogleDriveをマウントする

Colabo環境にGoogleDriveをマウントするには、

```shell:Colab
from google.colab import drive
drive.mount('/content/gdrive') #（gdriveの部分は任意の文字で良い）
```
として、表示されるリンクをクリックして認証。
表示されたキーをコピーし、colabに戻って打ち込めばドライブのマウントはOK。


##GoogleDriveがマウントされた場所を確認する

```shell:Colab
! ls /content
```
として、現在のColab環境のディレクトリに何があるかを確認します。
`gdrive	sample_data　`
と表示されるはずです。
（ちなみに /content がColab環境のデフォルトのディレクトリ）

```shell:Colab
! ls gdrive
```
とすると
`MyDrive`
と表示されます。このMyDriveが普段使っている自分のgoogleDriveのディレクトリ第一階層に対応しています。

##GoogleDrive（MyDrive）の中身を見る

```shell:Colab
! ls gdrive/MyDrive
```
こうすると、自分が使っているgoogleDriveの中身がリストで表示されます。これで一安心です。
パスを指定すればgoogleDriveに自分で入れたファイルにColabからアクセスできるはずです。
MySQLでランダムデータを作成する

# 日付

```sql
select date(now() - interval 1 day) + interval floor(rand() * 86400) second;
```

実行時刻の1日前の00:00:00から、その日内の時刻でランダムな日時を決める。

```mysql
mysql> select date(now() - interval 1 day) + interval floor(rand() * 86400) second;
+----------------------------------------------------------------------+
| date(now() - interval 1 day) + interval floor(rand() * 86400) second |
+----------------------------------------------------------------------+
| 2021-04-17 01:32:41                                                  |
+----------------------------------------------------------------------+
1 row in set (0.01 sec)
```

# 文字列

```sql
substring(md5(rand()), 1, 19)
```

ランダムで生成したmd5の文字列から、所定の長さを使う。

```mysql
mysql> select substring(md5(rand()), 1, 19);
+-------------------------------+
| substring(md5(rand()), 1, 19) |
+-------------------------------+
| 08384853ae61dc665e5           |
+-------------------------------+
1 row in set (0.00 sec)
```

# 参考

- [MySQLで簡単にランダムなテストデータを作成する方法 - Qiita](https://qiita.com/tayasu/items/c5ddfc481d6b7cd8866d)
- [RAND\(\), RAND\(N\)](https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_rand)
要素の取得＋CSS書き換え

# DOM (Document Object Model)
htmlで表現されている個々のオブジェクトを取得／操作したりできる

- 要素の取得
 -  <code>getElementById(id);</code>
- 要素の作成
 - <code>createElement(tag_type);</code>
 - <code>createTextNode(text);</code>
- 要素の追加
 - <code>appendChild(element);</code>

---------------
#jQueryの基本文法

```php
$(document).ready(function(){
//ここにjQueryの処理を記述
});
```
```php
$('要素').css('プロパティ','値');
```

# テキストの色を変更する方法

```php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>Practice</title>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
  </head>
  <body>
    <h1 id="title">タイトル１</h1>
    <p id="element1">要素１</p>
    <p id="element2">要素２</p>
  <script>
    $(document).ready(function(){
      $('h1').css('color', 'red');
    });
  </script>
  </body>
</html>
```
Selenium を Firefox で使用する方法 Anaconda / Jupyter Notebook 

#背景
はやたすさんの動画【Python × スクレイピング入門⑩】にて Selenium インポートに失敗し、Chrome を諦めて Firefox で試して成功したのでその方法を書くことにした。

#対象読者
以下に当てはまる方。
・Mac 環境
・Chrome で Selenium インポート失敗。
・インポート時のエラーが解決できなかった。

[はやたすさんの動画](https://youtu.be/bP4Cnn73G8E)を見て、Anaconda Navigator と Selenium を Anaconda Navigator 経由でインストール済みであることを前提に記載。

# geckodriver のインストール
Chrome と同様に Firefox でも driver のインストールを行う。
Assets を開くとダウンロードする箇所がある。

https://github.com/mozilla/geckodriver/releases

driver を任意の場所に置いた後、以下のコードを Anaconda Navigator で起動させた Jupyter Notebook に貼り付ける。

#Python で使えるようにするコード
  
```main.py
from selenium import webdriver

path = '/ geckodriver の Path をここに入れてください/'
driver = webdriver.Firefox(executable_path=path)
url = 'ここにURLを書いてください'
driver.get(url)

sleep(5)

driver.quit()
```

実行後、Firefox が起動し指定したURLのWebpageが開けば成功。

#トラブルシューティング
筆者が引っかかったエラー　一覧

`can't be opened because apple cannot check it for malicious software.`

設定を開いてアクセス許可を出す必要がある。
(以下サイトを参考に解決。https://support.postbox-inc.com/hc/en-us/articles/360041824214-Error-Postbox-can-t-be-opened-because-Apple-cannot-check-it-for-malicious-software-)


`Anaconda Navigator の Environments で Selenium が出てこない`
Update index をクリックして解決。 

`NotADirectoryError: [Errno 20] Not a directory:`
以下のように記述すると Path が通らなくなる。
driver = webdriver.Firefox('/ geckodriver の path /')

以下のように記述し解決。
path = '/ geckodriver の Path /'
driver = webdriver.Firefox(executable_path=path)

#参考記事
https://qiita.com/hujuu/items/ef89c34fca955cc571ec

https://qiita.com/motoki1990/items/a59a09c5966ce52128be

#使用環境
Mac book M1 2020 (arm64)
macOS Big Sur
Atom で Textile の目次付きプレビューが出来るか確認

# Atom で Textile の目次付きプレビューが出来るか確認

→結論としては出来ない（見つけられなかっただけかもしれないが…）


## 確認手順

1. まずは Atom のインストール
1. Atom で Textile プレビューの確認
1. Atom で Textile 目次付きプレビューの確認


## 1. まずは Atom のインストール

Atom をインストールをして日本語化。

[【初心者必見】MacにAtomをインストールし、日本語化する方法](https://snome.jp/engineer/atom-install/)


## 2. Atom で Textile プレビューの確認

次に textile のプラグイン（language-textile, textile-preview）をインストールして、プレビューの確認。

[Atomでtextileをかけるように設定する](https://kishaku-kangen.blogspot.com/2017/08/atomtextile.html)


## 3. Atom で Textile 目次付きプレビューの確認

さぁ、textile に `{{toc}}` を追加して、目次付きプレビューが出来るか確認。

[Wikiページ内の目次を表示する](https://redmine.jp/faq/wiki/toc/)

### →残念。`{{toc}}` を入れても目次は表示されない

うーん、やはり `{{toc}}` は Redmine 独自方式っぽいので普通には対応してないよな。

[Redmine独自の特殊なWikiフォーマット](https://raintrees.net/projects/a-painter-and-a-black-cat/wiki/Markdown#Redmine独自の特殊なWikiフォーマット)


# 最後に

普段の業務では Textile がメインだが、SublimeText で OmniMarkupPreviewer の目次を使いたいがために Markdown でメモを取っている不都合な私。
正直、毎回変換するのが面倒なので、もしや Atom ならと思い確認してみたがダメそうだった。
これが出来れば、今更ながら Atom に乗り換えたかったが…

良い方法が中々見つけられないなぁ。

[OmniMarkupPreviewer で目次を表示する | mersy note](https://note.mersy418.com/article/toconomnimarkuppreviewer)
[Linux]rmコマンド

コマンドの個人復習メモ

#rmとは
rmコマンドはremoveの略で、基本的にファイルを削除するコマンドです。

```zsh
rm ファイル名1 (ファイル名2 ファイル名3) # 並べれば複数可能
```

#特徴
###そのままではフォルダは削除できない
sampleFoldrフォルダを作って削除しようとすると「sampleFoldrはディレクトリです」というエラーが出ます。

```zsh
mkdir sampleFoldr
rm sampleFoldr/

**エラー**
rm: sampleFoldr/: is a directory
```

###削除して良いかめっちゃ聞いてくる
毎回、削除してよいか聞かれます。消して良い場合は「y」を押して「エンターキー」をおします。
>削除したくない場合は「エンターキー」だけ押せばスルーされます。

```zsh
touch sampleFile
rm sampleFile
remove sampleFile? y # 削除して良いか聞いてくる
sampleFile # 削除したファイルが表示される
```

#オプション
| オプション | 利便性 |説明 |
|:-:|:-:|:-:|
| <strong>-r (--recursive)</strong>| ◎| <strong>フォルダを中身ごと削除できる</strong> |
| -f (--force)| ◎| 確認されず削除できる |
| -i (--interactive)| | 削除前に確認する |


##サンプル
###-r (--recursive)
``先ほど`rm`コマンドだけでは削除出来なかったsampleFoldrフォルダですが、`-r`オプションをつけるとフォルダを削除できるようになります。

```zsh
rm -r sampleFoldr
examine files in directory sampleFoldr? y # フォルダの中身削除してOK?
remove sampleFoldr? y # フォルダも削除してOK?
sampleFoldr # 削除したフォルダ名
```

###-f (--force)
削除して良いかの確認入力なしで削除されます。
> 便利ですが非表示になるのは確認メッセージだけでなく、エラーメッセージなども非表示になってしまうため、予期せぬ挙動が発生しても知る術がなくなってしまうので、注意が必要です。

```zsh
rm -f sampleFile
sampleFile # 削除したファイル名
```

###-i (--interactive)
削除して良いかの確認入力なしで削除されます。
(オプションをつけなくてもデフォルトで聞いてくれます)

```zsh
rm -i sampleFile
remove sampleFile? y #削除して良いか聞いてくれる
sampleFile # 削除したファイル名
```

#参考
https://www.atmarkit.co.jp/ait/articles/1606/06/news013.html#:~:text=%E3%80%8Crm%E3%80%8D%E3%81%AF%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84,%E3%81%AF%E8%A4%87%E6%95%B0%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

https://eng-entrance.com/linux_command_rm#rm
.htaccessファイルでIPアドレスを制限しようとしたらログインできなくなったこと

あるきっかけから、長らく触っていない自分のWordPressブログの管理画面にアクセス制限をかけたくなり、調べたところ次のようにwp-adminフォルダと同階層にある「.htaccessファイル」をいじればいいことがわかりました。

```
<FilesMatch "wp-login.php|wp-admin">
  Order deny allow
  Deny from all
  Allow from xxx.xxx.xxx.xxx
</FilesMatch>
```

これ自体の意味としてはURLに「wp-login.phpまたはwp-admin」がつく際のアクセスを禁止、でも
「xxx.xxx.xxx.xxx」に指定されたIPアドレスは認めるよ、って意味らしく、だからここに自分のIPアドレスを書けばいいと多くのサイトで言われていました。しかし、なぜか私のパソコンであるMacbookのIPアドレスを入れてもうまくいきませんでした。（マックブック　ipアドレスで検索したら出てくる、システム環境設定から参照するIPアドレスです）

![スクリーンショット 2021-04-18 18.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690469/ef69785e-df38-86d5-9c42-7edbf24416ab.png)

そして15分ぐらい調べて、インターネットを利用するときに割り振られるグローバルIPアドレスというものを発見。
以下のサイトにアクセスするだけでそのIPアドレスが表示されます。

https://www.cman.jp/network/support/go_access.cgi

ここで出てくるIPアドレスを先程の「xxx.xxx.xxx.xxx」に貼り付け、おまけについてきてしまった全角スペースを削除すると無事ログイン画面に入ることができました。

あまり自分のIPアドレスをどう確認するかについて一緒に書いているサイトがなかったので、誰かのお役に立てれば幸いです。
ノートPCで自作OS(MikanOS)を動かしたい

### はじめに
[ゼロからのOS自作入門](https://www.amazon.co.jp/dp/B08Z3MNR9J/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)（通称：みかん本）で楽しくOS自作に取り組んでいます。
本書の内容を追うだけならQEMUで起動するだけで十分なのですがせっかくOSを自作しているのに、実機でやらないと勿体ない。

というわけで、この記事では私がノートPC ( LG gram model 13Z980-NA77J ) で本書の自作OS (MikanOS)を起動する際にうまく動かなかった点とそれに対する解決策をまとめていきます。
**注意**
あくまで私のノートPCで必要だった変更ですので、変更は自己責任にてお願いします。

※2021/04/18時点 osbook_day06cまで確認済みです。進め次第追記していきます。


### 障害 1. ノートPC標準搭載のwindowsが起動してしまう
USBストレージに焼きこんだMikanOSを起動させたいのですが、ブート中に素通りして標準搭載のwindowsが起動してしまいました。


#### 解決手順1-1. USB ストレージブートの優先度を上げる
まずはLG GramのUEFIの設定を変更しUSBストレージの起動優先度をwindows搭載のストレージよりも高くします。LG GramのUEFIにはwindowsから入ります。[こちら](https://www.taremimiusagi.net/entry/gram_bios20190304/)を参考にさせていただきました。

#### 解決手順1-2. Secure BootをOFFにする
みかん本でも言及されていますが、Secure bootはOFFにしなければいけません。上記のリンクにSecure bootをOFFにする方法も書かれていますので参照ください。

#### 解決手順1-3. USBストレージのファイルシステムをFAT32にする
本書ではexFATファイルシステムでフォーマットするように書かれていますが私の環境ではexFATではブートできず、FAT32でフォーマットする必要がありました（原因は未解決。これはかなり詰まりました。）。

### 障害 2. kernelページをAllocateできない
QEMUでは動作するのに、実機では"faild to allocate pages: Not Found"となりました。

#### 解決手順2-1. カーネルのエントリアドレスを変更する。
実機のメモリマップを確認してると、私のLG gramでは0x0010000が予約されててEfiConventinalMemoryが0x00110000からになってることに気づきました。
以下のようにカーネルのベースアドレスを0x00110000に設定してビルドしたら起動できました。

```text:Makefile
#LDFLAGS  += --entry KernelMain -z norelro --image-base 0x100000 --static  
LDFLAGS  += --entry KernelMain -z norelro --image-base 0x110000 --static
```

今回のように、AllocatePagesが失敗する場合は物理メモリアドレスが既存のプログラムとバッティングしている可能性があるので一度確認されることをおすすめします。このようなことを見越してか、メモリマップの確認方法は本書で触れてくれています。

### 障害 3. USBマウスが認識しない
QEMUではマウスカーソルが動くのに、実機ではうまく反応してくれませんでした。なお、タッチパッドではなくUSBマウスを外付けしています。

#### 解決手順3-1. kMemoryPoolSizeのサイズ数を大きくする。
LogレベルをDebugにして出力を確認していると、xhc.InitializeでkNoEnoughMemoryで初期化失敗していました。

usbドライバのコードをたどっていくとusb/xhci/ring.cppの67行目

```cpp:usb/xhci/ring.cpp
  buf_ = AllocArray<TRB>(buf_size_, 64, 64 * 1024);  
```
でbuf_にnullptrが返ってくることが問題のようです。

さらに、AllocArray<>()をたどるとusb/memory.cppの32行目

```cpp:usb/memory.cpp
    if (reinterpret_cast<uintptr_t>(memory_pool) + kMemoryPoolSize
        < alloc_ptr + size) {
      return nullptr;
    }
```
でnullptrがかえってくることが原因のようでしたので、if文の条件式から、 kMemoryPoolSizeを変更することにしました。
具体的にはusb/memory.hppの13行目を以下のように変更しました。

```cpp:usb/memory.hpp
 // [org] static const size_t kMemoryPoolSize = 4096 * 32
 static const size_t kMemoryPoolSize = 4096 * 64; 
```

これで初期化が成功し無事マウスカーソルを動かすことができました。


### 障害4. カーネル側にメモリマップが渡らない（8章 osbook_day08a)

#### 解決手順 4-1. UEFIに変更を加えたので、UEFIアプリ側の再ビルドが必要
忘れてて、結構なやんだ。

適宜、追加していきます。
VSCodeが `models.json` というファイルを生成するときの対処

## 背景
VSCodeを起動するときに `code /path/to/project` といったコマンドを使用すると、謎のJSONファイル `models.json` と巨大なバイナリファイルが生成された。

`.gitignore` に追加してもよかったが、それより根本的な解決をしたかったため、生成場所を変更した。

## 原因・解決
Pylance リポジトリの [issue](https://github.com/microsoft/pylance-release/issues/331) によると、どうやらVSCode Intellisenseに関係するファイルのようである。
今回はワーキングディレクトリに生成されるのを止めたかっただけなので、それ以上詳しくは調べていない。

上記issueで言及されているIntelliCodeの [issue](https://github.com/MicrosoftDocs/intellicode/issues/231) で、 [生成場所を変える方法](https://github.com/MicrosoftDocs/intellicode/issues/231#issuecomment-708129568) が記載されていたため、実行した。

抜粋:

> There's a small hack you can do to fix this issue locally.
Go to File>Preferences>Settings and search for "model download path".
You can modify this variable to have a personalized absolute path. This will make sure that all models are always managed on that directory and that directory only.
> You will need to modify the settings using the settings.json file, this is the structure of that property:
"vsintellicode.modelDownloadPath": "",

要約すると、 settings.json の `vsintellicode.modelDownloadPath` というフィールドでファイルの生成先を変更できるとのことなので、以下を追記した。

今回は適当にIntelliCodeの実体が入っている場所に新しくサブディレクトリを作った。

(2021/12/5 UPDATE): このフィールドでは環境変数を使えないようで、ずっと `'./$HOME/.vscode/...'` というディレクトリが生成されるのを放置していた。絶対パスで指定する必要がある。

```json
/* ... */
  "vsintellicode.modelDownloadPath": "/Users/<USERNAME>/.vscode/extensions/visualstudioexptteam.vscodeintellicode-1.2.12/models",
/* ... */
```

## まとめ
上記設定を保存・適用したところ、 次回以降VSCodeを起動しても例の2ファイルは生成されなくなった。

検索方法が悪かったのか、日本語どころか英語の情報もあまり見つからなかったため、 `models.json` に困らされた誰かの参考になれば幸いである。
vscode remote sshでaws ec2に接続した際のNoPermissions (FileSystemError): Error: EACCES: permission denied解決法

新しくec2 instanseを作ってremote sshに繋げた際、vscodeのremote sshで
ローカルからドラッグアンドドロップしても、権限がないため、できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267142/1463c053-1a6f-f429-5f9a-96218b390563.png)

権限付与したいディレクトリに移動して、

sudo chmod -R 777 ./

で権限を与えてやることでできます。

ただ、セキュリティ、管理には気を付けてください。
Laravel レコードが存在しているかを確認する 個人メモ

# 目的

- 当該のレコードが存在することをクエリビルダーで確認する方法をメモ的にまとめる

# 方法

1. クエリビルダーに`exists()`を追加することでレコードの存在を確認できる。レコードが存在していた場合はtrueを、存在していなかった場合はfalseを返す。
1. 下記に例を記載する。

    ```php
            return $this->Memo
                ->where('workspace_id', $workspace_id)
                ->exists();
    ```
[シェルスクリプト]for文

シェルスクリプトでのfor文の書き方

#基本的な書き方
* `inの後に並べたワードリスト`がループ内で「val」として順番に扱われる
* 処理は`do`と`done`で挟む
* 処理内でワードリストの値はforの後の文字列に`$`をつけて呼び出す

```zsh
for val in list1 list2 list3 #「list*」がワードリストです
do
echo $val #先頭に$をつけてワードリストの値をループごとに左から順番に設置されます
done

**結果**
list1
list2
list3
```
###ポイント
C言語やJavaのfor文は「ループカウンタ」を用意しカウンタの数だけ繰り返しすることが殆どだと思います。
<strong>シェルスクリプトでのforは、「ワードリスト」を使って繰り返しをする</strong>という違いがあります。

>Javaなどのfor文のような記述も出来るようになっているが、ワードリストをつかうほうがbashでは一般的のようです。
また、シェルスクリプトでのforは、比較的繰り返し条件が単純な場合に利用されます。
※ 複雑な条件式が必要な場合は「while」を使用するのが一般的のようです。


###ワードリストは、処理の中で使わなくてもOK
do,doneの間に記述される処理にワードリストを使わない場合、単純にワードリストの個数分同じ処理がされるだけです。



#seqコマンドで、連続した数字を出力
`seq`の後ろに数字を1つだけ入れると1からスタートしてその数字までの連番が出力さますます。

```zsh
seq 5
1
2
3
4
5

# 値の個数: 5個
```

ちなみに以下のように２つ並べると開始の数字を決められる(今回は-2からスタートしている)

```zsh
seq -2 6
-2
-1
0
1
2
3
4
5
6

# 値の個数: 9個
```

###ワードリストの代用として使える
ワードリストの入れる箇所に、<strong>seqコマンドをバッククウォーテーションで囲って記述するとseqコマンドが実行され結果の値や値の個数をワードリストとして使えます。</strong>

```zsh
for val in `seq 3` #必ずバッククウォーテーションで囲います
do
touch file$val.txt
done

**結果**
file1
file2
file3
```

#練習
【作るもの】
バックアップコマンド
カレントディレクトリにある全てのファイルとフォルダをBACKフォルダにコピーする。

【手順】
ファイルは Desktop/sh 内に作成します。

<strong>ファイル作成とパーミッションの変更</strong>

```zsh
touch sh/folderBack.sh # ファイル作成
chmod 755 sh/folderBack.sh # 権限変更
```
<strong>パスを通す</strong>
これでローカルPC内であれば、どこからでもファイル名だけで実行できるようになります。

```zsh
export PATH=$HOME/Desktop/sh:$PATH
source ~/.bashrc
source ~/.bash_profile
```

<strong>スクリプト内容</strong>

```zsh
vi sh/folderBack.sh # エディタで編集(ここはエディタであればなんでもOK)
```

```folderBack.sh
#!/bin/sh
#カレントディレクトのファイルとフォルダをBACK/にコピー

for i in `ls -a *`
do
mkdir -p BACK/
cp $i BACK/$i.back
done
```

<strong>実行</strong>
バックアップするファイルが無いと試せないので、事前にshフォルダには、作成しているfolderBack.shファイルの他に、for.shファイル、print.shファイルで合計3ファイルがあり、その状態で実行します。

実行前のshフォルダ内

```zsh
tree
.
├── folderBack.sh
├── for.sh
└── print.sh
```

実行

```zsh
folderBack.sh
```

<strong>結果</strong>
`BACKフォルダ`が作成され、その中にファイル名の最後に`.back`が追加された状態でコピーができました。

実行後のshフォルダ内

```zsh
tree
.
├── BACK
│   ├── folderBack.sh.back
│   ├── for.sh.back
│   └── print.sh.back
├── folderBack.sh
├── for.sh
└── print.sh
```


#参考
https://eng-entrance.com/linux-shellscript-for#for
iLok2からiLok3へのライセンス移行

iLok2のキーホルダーを取り付ける部分が経年劣化で壊れました。
キーホルダーを取り付けておかないと誰のiLokかわからないし、気づけばカバーも割れていたので、iLok3に新調することにしました。ということで、iLok2からiLok3へのライセンスの移行を行います。

- 実行環境：MacBook Pro (15-inch, 2016)
- OS:macOS 11.2.3

# iLok License Managerをダウンロードし、インストール
https://ilok.com/
## 以前にインストールしていた場合は、最新版にアップデートしておく
![スクリーンショット 2021-04-18 17.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/34a588c3-c9c0-71f8-f940-f920ae21ac3c.png)

![スクリーンショット 2021-04-18 16.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/cfe01757-0ab7-2cbd-6643-a0d54d1bb20c.png)
バージョンが古すぎた…

## 移行元のiLokと移行先のiLokを接続する
![IMG_1386.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/64aa09bf-9484-8829-ce03-973df0b7a0ee.jpeg)
ちなみに使用している年季入ったアダプタは<a href="https://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0-%E3%83%89%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-PD%E5%AF%BE%E5%BF%9C%E3%80%90Type-C%C3%972-microSD%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E3%80%91%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E5%8F%8E%E7%B4%8D-DST-C05BK/dp/B07KZKCG6K">ELECOM DST-C05BK</a>
それにしてもiLok3（写真左側のiLok）は、驚きの小ささですね

![スクリーンショット 2021-04-18 16.51.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/a081f8fb-df52-cae4-726d-75c74f58f1de.png)
のちほど、iLokデバイスをiLokに登録する作業が発生するので、アカウントは作成しておいてください。
https://www.ilok.com/#!registration

# ライセンスの移行
## 移行元から移行先へライセンスをドラッグアンドドロップする。すると…
移行元のiLokからライセンスを移行先のiLokへドラッグアンドドロップします。ところが…
### アプリケーションへのアクセス認証を許可する
![スクリーンショット 2021-04-18 16.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/3b4a6f04-8f87-a7a1-1bf6-04de36ad325a.png)
アクセシビリティアクセスのアラートがでました。
アプリケーションへのアクセスを許可します。

![スクリーンショット 2021-04-18 16.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/7ef7098e-a43e-5a96-6046-0ccc5c1935c3.png)

### いよいよライセンスの移動を開始
あらためて、移行元のiLokからライセンスを移行先のiLokへドラッグアンドドロップ
![スクリーンショット 2021-04-18 16.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/dc63450c-b922-29c6-9a21-101e753619ba.png)
![スクリーンショット 2021-04-18 16.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/98eac701-f968-c068-bfd6-4e8a99576f05.png)
「いまからライセンスを現在の場所から外して、新しいiLokに移動します、続けますか？」と言われるので、OKしてください
![スクリーンショット 2021-04-18 16.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/3f69f716-75e4-6536-f04f-125e6d738ec8.png)
移行が始まりました！「Do not unplug your iLok..」と書かれているとおり、移行が完了するまでは、iLokを抜き差ししないでください。
![スクリーンショット 2021-04-18 16.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/bd64a74b-4588-4a62-8066-db40819fb128.png)
「あたらしいiLokはまだ登録されていません、アクティベイトする前にこのiLokをアカウントに登録しないといけません。登録しますか？」
と聞かれるので、「YES」してください。

### あっという間に移行完了
![スクリーンショット 2021-04-18 16.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232745/93d17866-9d49-97ea-60fc-322d6b7cd085.png)

# まとめ・感想
iLokはライセンスの移行が大変だと聞いていましたが、iLock License Managerのおかげで簡単でしたー

# 参考サイト
- <a href="https://ilok.com/">iLok 公式ウェブサイト</a>
- <a href="https://www.tacsystem.com/support/download/001128.html">iLok サポートページ</a>
Reactでタイピングゲーム

作った

# 動作イメージ

![wbwgl-vg69c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29365/58ff9aa0-2fcf-877e-b2ef-49dec720f644.gif)

# Link

https://t02uk.github.io/react-type/

# 所感
アニメーションのライブラリには、`react-transition-group` を使用したが、create-react-app した後の状態ではReact純正の最新バージョンが使えず、古めのバージョンを使う必要があった。
古めのバージョンなので、`<React.StrictMode>` も消さないと警告が出る。
怠惰・傲慢・短気の真意を考察してみた

# 本記事の内容
優秀なエンジニアの性格の特徴として、一般的に「怠惰・傲慢・短気」であることが多いと言われています。しかし、ただ怠惰・傲慢・短気であるだけでは優秀なエンジニアにはなれません。なぜ優秀なエンジニアがこういう性格だと言われるのかということについて自分なりに考察してみたので、ここにまとめてみます。

# 結論
優秀なエンジニアが空気を読まずに周りの（優秀ではない）エンジニアと違って生産性の高い働き方をしている様子が周囲の人たちには「怠惰・傲慢・短気」に見えている

# そもそも「優秀なエンジニア」とは？
まずはじめに前提条件を確認します。本記事では「優秀なエンジニア」の定義を「生産性の高いエンジニア」、つまり周囲のエンジニアよりも多くの仕事をこなすエンジニアとします。

## 生産性を上げるために必要なことは？（最重要）
この節は誤解している人が多いかつ本記事の最重要ポイントです。
### ①長く働き過ぎると逆に生産性が下がる
このことは1950年代から分かっていることだそうです（[引用](www.amazon.co.jp/dp/4788914727)）。労働時間が長くなると集中力が下がり、逆に生産性が下がってしまいます。（単位時間あたりの生産性ではなく、労働者１人あたりの生産性が下がります。）
このことは[国際比較からもそのような傾向が出ている](https://www.johas.go.jp/Portals/0/data0/sanpo/sanpo21/sarchpdf/94_28.pdf)ことが分かります。ちなみに、単純な計算では年1,200時間（週24時間）あたりに生産性のピークが来て年2,000時間（週40時間）だと年1,200時間に比べて4割近く生産性が下がるそうです。年1,200時間労働を目指せば良いわけではないと思いますが、生産性の観点で見ると日本人は長時間働きすぎの傾向があるようです。

### ②忙しい人は生産性が低い
ここで言う「忙しい人」とは多くの仕事を抱えている人のことを指します。科学的に見れば多くの仕事を抱えると仕事内容を切り替えるタイミングが多くなります。人間は仕事内容を切り替えてから集中し始めるまでに時間がかかるので、切り替え回数が多いほど生産性が低くなります（[引用](www.amazon.co.jp/dp/4788914727)）。
このことは経験的にもよく知られており、[エッセンシャル思考](https://www.amazon.co.jp/dp/4761270438)という有名な本で詳しく解説されています。この本では仕事の多くを断り、本当にしたい仕事に全力を注ぐことの重要性が書かれています。

# 怠惰・傲慢・短気の意味の考察
以上の内容を踏まえて私なりに優秀なエンジニアがなぜ怠惰・傲慢・短気なのかを考察していきたいと思います。
### 怠惰
優秀なエンジニアは生産性を上げるため、無闇に長時間働くことはせず、短時間集中して働きます。優秀なエンジニアは他のエンジニアよりも早く帰ってしまうため、その様子を見た周りの人たちには怠惰に見えるのかもしれません。

### 傲慢
優秀なエンジニアは仕事を選びます。重要度がそれほど高くないと思った仕事は全て断ってしまうため、その様子を見た周りの人たちには傲慢に見えるのかもしれません。

### 短気
優秀なエンジニアは短時間集中型の労働スタイルなので、ダラダラ長い会議は嫌いです。会議が長引いてくるとこのまま会議の場にいるくらいなら開発をした方がよいと判断して会議を途中で退席してしまいます。その様子を見た周りの人たちには優秀なエンジニアがブチ切れて帰っているように見えるのかもしれません。

# 結論
私は以上に示したような「怠惰・傲慢・短気」な働き方を実践して優秀なエンジニアになろうと思います。まずは定時退社を厳守して、ある程度勝手が分かってくれば出席する会議を選ぼうと思います。また、仕事内容も「お客さんを儲けさせるために本当に必要なことなのか」という基準で選んでいきたいと思います。


# 引用
[週40時間の自由をつくる 超時間術](www.amazon.co.jp/dp/4788914727)
[エッセンシャル思考 最少の時間で成果を最大にする](https://www.amazon.co.jp/dp/4761270438)
[産業保健21 第94号](https://www.johas.go.jp/Portals/0/data0/sanpo/sanpo21/sarchpdf/94_28.pdf)
Flask-Loginの練習


https://github.com/maxcountryman/flask-login


```py:app.py
from flask import Flask, redirect, request, url_for
from flask_login import LoginManager, login_user, logout_user, login_required, UserMixin, current_user

app = Flask(__name__)
app.secret_key = 'super secret string'  # Change this!

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"  # 未ログイン時にprotectedにアクセスするとリダイレクト

# Our mock database.
users = {'foo@bar.tld': {'password': 'secret'}}


class User(UserMixin):
    pass


@login_manager.user_loader
def user_loader(email):
    if email not in users:
        return

    user = User()
    user.id = email
    return user


@login_manager.request_loader
def request_loader(req):
    email = req.form.get('email')
    if email not in users:
        return

    user = User()
    user.id = email

    return user


@app.route('/')
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return '''
               <form action='login' method='POST'>
                <input type='text' name='email' id='email' placeholder='email'/>
                <input type='password' name='password' id='password' placeholder='password'/>
                <input type='submit' name='submit'/>
               </form>
               '''

    email = request.form['email']
    if request.form['password'] == users[email]['password']:
        user = User()
        user.id = email
        login_user(user)
        return redirect(url_for("protected"))

    return 'Bad login'


@app.route('/protected')
@login_required
def protected():
    return f'''
    Logged in as: {current_user.id} <a href='logout'>logout</a>
    '''


@app.route('/logout')
def logout():
    logout_user()
    return f'''
    Logged out
    <a href='login'>login</a>
    '''


if __name__ == '__main__':
    app.run(debug=True)
```
読書メモ_データ分析の先生! 文系の私に超わかりやすく統計学を教えてください!

・データ分析の先生! 文系の私に超わかりやすく統計学を教えてください!

https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E5%85%88%E7%94%9F-%E6%96%87%E7%B3%BB%E3%81%AE%E7%A7%81%E3%81%AB%E8%B6%85%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E7%B5%B1%E8%A8%88%E5%AD%A6%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-%E9%AB%98%E6%A9%8B-%E4%BF%A1/dp/4761275057

# 手に取ったきっかけ
機械学習・データ分析で出てくるキーワードの理解を深めたかった
本自体は図書館でレンタル

# メモ
統計学の入門というより、統計学で何をやっているのかの入門書という印象

会話形式で頭に入ってきやすかった

# 得られたこと
他の統計学の入門書を読むスタートラインに立てた気がする
Mobile Publisher を使用してブランド設定したモバイルアプリケーション ⇒ アプリケーションのメンテナンス

１．ブランド設定されたアプリケーションにメンテナンスが必要になると思われるのはいつですか?
２．Google Play または App Store に公開しているアプリケーションを変更する場合はどうしますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/dc848ece-1594-4b64-5298-81a4e69e0609.png)
[Django / python] form.Form を使ったフォームからの値をまとめて代入したいですよね？

# 概要
画面（templates）からviews.pyに渡した値を1つずつ代入するのが嫌になりました。
そこで試行錯誤してみたら、そこそこらくちんになったので共有(^ワ^*)

## どういうこと？

こういうことです！

```python
# root_directory/app_name/views.py

def new_book(request):
    """本の新規登録"""
    form = BookForm(request.POST or None)
    if form.is_valid():
        book = Book()
        book.title = form.cleaned_data['title']
        book.author = form.cleaned_data['author']
        book.publisher = form.cleaned_data['publisher']
        # もう嫌になった！！！！
        # なんで1個ずつ代入せなあかんのじゃ！！
        # パラメータが10も20もあったらどうすんじゃい！！！
```

# 解決策

手抜きもーど\_(-ω-`\_)⌒)\_

## ソースコード

```python
# root_directory/app_name/views.py

def new_book(request):
    """本の新規登録"""
    form = BookForm(request.POST or None)
    if form.is_valid():
        # 1行でまとめて代入！！きもちいい！！！
        book = Book(**form.cleaned_data)
```

これでいけました。
周知の事実なのかもしれませんが、記事が見つからなかったので...どなたかの参考になれば幸いです。

## 補足

ちなみにこの`**`は、辞書型データの中身を展開して、

- keyを引数名として
- valueを値として

メソッドに渡すときに使うものです。

```python
# もし以下のようなデータになっていたとすると...
# form.cleaned_data => { 'name': 'name_aaa', 'author': 'ryukishi007' }

# こう書いた場合、
Book(**form.cleaned_data)

# こう書いているのと同じ動作になります。
Book(name='name_aaa', author='ryukishi007')
```

（知ってたけど初めて役に立った。）
[Swift5] cellをtapしたときのhighlightを無効にする方法

# はじめに
tableView全てのcell, または，特定のcellをtapしたときのhighlightを無効にする方法をメモしました．

# tableView全体のcellに適用する場合

```swift
tableView.allowsSelection = false
```

上記を記述することで，didSelectRowAt#が動作しなくなるので，tapしてもアニメーションが発生しなくなります．

ただし，cellの上にUIButtonを配置した場合，そのbuttonはdidSelectRowAt#と関係ないので動作します．


UITableViewが編集モードの時にも無効にしたい場合，上の記述に加えて以下を記述する．

```swift
tableView.allowsSelectionDuringEditing = false 
```


# 特定のcellに適用する場合

```swift
cell.selectionStyle = .none
```

# 参考
* [How can I disable the UITableView selection?](https://stackoverflow.com/questions/190908/how-can-i-disable-the-uitableview-selection)
JavaScriptメソッドで出来ること

#はじめに
初学者の私が、アクティブラーニング兼備忘録の為にJavaScriptのメソッドをまとめる記事です。
少しずつ追記していきます。

#目次
- getElementById
    - 基本構文
    - innerHTMLで活用
    - onClickで活用

#getElementById
getElementByIdメソッド
HTMLタグで指定した任意のIDにマッチするドキュメント要素を取得する。
これが一番よく使う気がします。

##基本構文

```
<html>
  <body>
    <p id='hey'>Hello world</p>
    <script>
      console.log(document.getElementById('hey'));
    </script>
  </body>
</html>
```

```
<p id='hey'>Hello world</p>
```

##innerHTMLで活用

```
<html>
  <body>
    <p id='hey'>こんにちは</p>
    <input type='button' value='Click' onclick='myfunc()'>

    <script>
      let myfunc = () => {
        const myp = document.getElementById('hey');
        myp.innerHTML = 'こんばんは';
      }
    </script>
  </body>
</html>
```

ボタンを押すと「こんにちは」から「こんばんは」になる

##onClickで活用

```
<html>
  <body>
    <p>push button</p>
    <input type='button' id='myid' value='Click'>

    <script>
      let mybutton = document.getElementById('myid');
      let myfunc = () => {
        mybutton.value = 'Hello world';
      }
      mybutton.onclick = myfunc;
    </script>
  </body>
</html>
```

ボタンを押すと、ボタンに書いてある「Click」が「Hello world」になる
【Vue.js】methodsでバインドした値をsubmitする際に上手くpostされない時にnextTickを使った話

Qiitaの質問機能で回答頂いた内容がとても勉強になったので、
復習を兼ねて記事としても残しておく。

## 発生した問題
vueテンプレート内で、form要素のaction属性、input要素のvalue属性を動的に処理したいが、
methods内でdataに対して、属性値を更新しても上手く代入した値が反映されず、空でpostされてしまう。

## 事例
```vue.js
略
<form :action="action" method="post" ref="form">
  <input :value="id" type="hidden" name="id">
</form>

<span @click.prevent="formSubmit(item.id, '/edit')">編集する</span>
略
export default {
  data(){
    return {
      action: '',
      id: ''
    }
  },
  methods:{
    formSubmit(id, action){
    this.id = id;
    this.action = action;
    this.$refs.form.submit();
    return false;
  }
略
    
```

ちなみに↓だと上手くいく

```vue.js
略
<form action="" method="post" ref="form">
  <input value="" type="hidden" name="id" ref="input">
</form>

<span @click.prevent="formSubmit(item.id, '/edit')">編集する</span>
略
export default {
  methods:{
    formSubmit(id, action){
    this.$refs.form.value = id;
    this.$refs.form.action = action;
    this.$refs.form.submit();
    return false;
  }
略
```

## 解決方法
そもそもの問題はbindした結果がDOMに反映されるのが、
メソッドがreturnした後になる為、仮想DOMだけ書き換えて、
DOMそのものが書き換わる前に submitを実行する形となり、値がPOST出来なかった。

そこでnextTickを使ってsubmitをDOMの更新サイクル後に実行する。

https://jp.vuejs.org/v2/api/index.html#Vue-nextTick

```vue.js
略
<form :action="action" method="post" ref="form">
  <input :value="id" type="hidden" name="id">
</form>

<span @click.prevent="formSubmit(item.id, '/edit')">編集する</span>
略
export default {
  data(){
    return {
      action: '',
      id: ''
    }
  },
  methods:{
    formSubmit(id, action){
    this.id = id;
    this.action = action;
    this.$nextTick(() => this.$refs.form.submit());
    return false;
  }
略
    
```

nextTickはDOM更新後に第1引数で渡した関数を実行してくれる。
これでmethodsで更新した値でPOSTする事が出来た。めでたしめでたし。
多分最小構成のCO2センサー作成方法

CO2センサー製造販売しているけど、ぱっとみ綺麗なものを作ろうとすると大量生産の中国には勝てん。ということで最小構成で動かす方法を考えてみた。USB刺さるPCあったら基本動くはず。

センサー->省けない。

画面->PCやスマホに繋げられれば不要

電源->PCやスマホからとる

ケース->とりあえず不要

その他機能->PCやスマホがあれば何とでもできる


というわけで、できた。

![DSC_0123.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178348/3f361393-ef6e-b2b7-489e-23a63ae99ef1.jpeg)

さすがにもうちょっと
![DSC_0158.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178348/cc322d1d-21b7-21f2-78d4-b5bf1c96cd72.jpeg)

すっきり。

USBシリアル変換モジュールでブリッジしているだけ。（ハードへリンクはろうとしたら自前販売先になり規約にかかりそうなので自重）
以下のように接続(前がSBシリアル変換モジュール後ろがMHZ19)

    5V-VIN
    GND-GND
    TXD-Rx
    RXD-Tx


環境構築。

```
[yoshitake@localhost usbpy]$ pyenv version
3.7.1 (set by /home/yoshitake/develop/usbpy/.python-version)

pip install pyserial
```

プログラム

```
import serial
import traceback
import time

serial_dev = '/dev/ttyUSB0'


def connect_serial():
    return serial.Serial(serial_dev,
                         baudrate=9600)


def mh_z19():
    try:
        ser = connect_serial()
        result = ser.write(b"\xff\x01\x86\x00\x00\x00\x00\x00\x79")
        s = ser.read(9)
        return {'co2': s[2]*256 + s[3]}
    except:
        traceback.print_exc()
    finally:
        ser.close()
```


[ブログ](https://www.rocher.kyoto.jp/arbr/?p=1628)にもうちょっとちゃんと書いてある。
RSpecによるrailsアプリのテスト

#テストコードのエラー解決

現在railsで作成中のアプリにおきましてdeviseによるuser管理機能の改良を行っておりました。
その際にテストコードが通らないとという現象がおきました。
原因は細かなミスだったのですが、ありがちなことではないかと思います。

#やりたかったこと

user管理機能においてactivehashを用いて、userが都道府県を登録できるようにしようと試みました。
##models
まず、prefectureのmodelを用意
usersとのアソシエーションを記述します
user側にはprefectureとのアソシエーション　belongs to　を記述します。
[![Image from Gyazo](https://i.gyazo.com/82cbca0af197e1d476fdb90a65861f42.png)](https://gyazo.com/82cbca0af197e1d476fdb90a65861f42)


ユーザー側ではバリデーションの設定をします。
1の無選択では登録できないよう、1以外の入力を求めます。

[![Image from Gyazo](https://i.gyazo.com/fbb8f8603758d0364b942cc74902ca63.png)](https://gyazo.com/fbb8f8603758d0364b942cc74902ca63)

##spec
続いてspecです
まずfactories
ユーザー情報にprefecture_idの項目を追加します。
これで生成されるユーザー情報に都道府県が含まれます。
[![Image from Gyazo](https://i.gyazo.com/bbe42064a91ddc330076eceb0ea41287.png)](https://gyazo.com/bbe42064a91ddc330076eceb0ea41287)

次にテストコード
保存できるケースとできないケースを追加

[![Image from Gyazo](https://i.gyazo.com/9e319034b7f171cc00b77e6741bda825.png)](https://gyazo.com/9e319034b7f171cc00b77e6741bda825)

準備が整ったのでテスト実行！
すると
##エラーの発生

[![Image from Gyazo](https://i.gyazo.com/05a0d1f539be5394a549e92ac2c4fc97.png)](https://gyazo.com/05a0d1f539be5394a549e92ac2c4fc97)

エラー出ちゃいました。
全ての情報は生成されているみたいですけど

今回いじったのはprefecture関係だけなのでprefecture周りを探してみます。

##解決
怪しいところを発見しました。
[![Image from Gyazo](https://i.gyazo.com/fbb8f8603758d0364b942cc74902ca63.png)](https://gyazo.com/fbb8f8603758d0364b942cc74902ca63)
バリデーションがprefectureとなっています。
しかし今回はidで管理しております。
そこで

[![Image from Gyazo](https://i.gyazo.com/2288e9e4f5abdf823abfff8aabd85b93.png)](https://gyazo.com/2288e9e4f5abdf823abfff8aabd85b93)

バリデーションをprefecture_idに変更してみました。

もう一度テストを行うと
[![Image from Gyazo](https://i.gyazo.com/c816541fd7b3e0ebbdbf19bc0f271b6b.png)](https://gyazo.com/c816541fd7b3e0ebbdbf19bc0f271b6b)

無事テストが通りました！

##終わりに
わかって見れば単純なミスでも起きた時は結構気づかないものですね。
小さな間違いでもテストが通らないということを経験するいい機会でした。
また、今回は検証エリアが狭かったため、比較的早く解決できたと思います。
定期的な検証は欠かさず行いたいものです。
Mobile Publisher を使用してブランド設定したモバイルアプリケーション ⇒ アプリケーションのテストおよび申請

１．ブランド設定されたアプリケーションの管理パッケージをインストールする必要があるのはなぜですか?
２．Android アプリケーションのベータバージョンの準備ができた時点で、通知メールを受け取るのは誰ですか?
３．アプリケーションのベータバージョンをインストールした後、ベータテスト担当者は何をテストできますか?
４．Salesforce で iOS ブランドアプリケーションを承認することで、どうなりますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/5cc7deb2-45b6-234c-aa10-60194738328a.png)