OmniAICreator/Qiita-1.07M huggingface dataset:
選択式問題の正答率を上げる勉強法

　――何回解いても正答率が上がらないということはありませんか？――

## 背景・目的・読み手

### 背景

　この記事は[IT資格取得をテーマに学びをシェアしよう！【PR】Udemyのカレンダー \| Advent Calendar 2021 \- Qiita](https://qiita.com/advent-calendar/2021/udemy) 12/11分の記事です。

https://qiita.com/advent-calendar/2021/udemy

　一昨年は応用情報処理、去年はプロジェクトマネジメント、今年はITIL4と取得していく中で、選択式問題の正答率を上げる方法が自分の中で固まってきたので可視化してみようと思い立ち、記事にしました。

### 目的

　自分の勉強方法の棚卸しと、これから試験を受ける方への情報共有。

### 読み手

　自分とこれから選択式問題を含む試験を受験される方。


## 勉強法

　やっちゃダメなこと・やったほうがいいこと、それぞれ紹介します。

### 選択式問題の勉強中にやっちゃダメなたった1つのこと

**「理由なく選択肢を選ばない」**

　これだけです。選んだ理由を説明できない場合は回答せず、**敢えて外れ扱いにして絶対復習するように仕向けましょう。**

　勉強中に勘や小手先のテクニックでとりあえず選んだ回答が当たってしまった場合、その問題の理解が不十分であるという気づきや復習の機会が失われます。結果、本番で同様の問題が出た場合に外してしまう可能性が上がってしまいます。


### 選択式問題の勉強中にやったほうがいい３つのこと

1. **選択理由を書いておく**
1. **正誤の記録をつける**
1. **選択理由と正誤の記録を元に自分の理解度の傾向を分析する**

#### 選択理由を書き、分析する上でのヒント
 
　選択理由を書いておくと、間違ったときにどこを復習したらよいかの判断ポイントになります。理由を全て書くと大変な場合は、

- 自分にとって自明なところは書かない
- 考え方を問う問題は選択理由を書く
- 迷ったところだけでも書く
- （自分が分かればいいので）端折って書く

などでもよいでしょう。

　例えば、以下のように理由によって復習ポイントが多少異なります。

- 理由を確認したところ、単なる勘違いであった
    - 　→　勘違いした部分だけを覚え直す
- 理由を確認したところ、似たような単語が多く、自分の中で整理しきれていなかった
    - 　→　その設問に関する類似単語を体系的にまとめるなどし、覚え直す

　選んだ理由を書くと時間内に解けないこともあるかもしれませんが、**勉強の序盤～中盤は正答率を上げるために知識を増やす・解き方を頭に定着させることが重要**であり、制限時間内に解かなくてもよい、と私は考えています。

#### 自分の解いた結果のどこを見るか？
　選択式問題は大別すると2つに分けられることを知っておくと、効果的な振り返りがやりやすくなります。

- 知識を問う問題
    - 用語の意味を問う問題（例：〇〇について、適切なものはどれか？）
    - 最適なシチュエーションを選ぶ問題（例：〇〇な場合、ふさわしい対応はどれか？）
    - …など
- 考え方を問う問題
    - アルゴリズムの穴埋め
    - 計算問題（例：クリティカルパスを求める問題）
    - …など

　知識を問う問題は知っていれば解けるため、知識を増やして瞬殺できるようにしていくと良いでしょう。繰り返すことで正答率が上がってくるジャンルの問題です。

　考え方を問う問題は「解き方を理解しているか」をチェックする必要があります。したがって、問題を選んだ過程があっているかを重点的に確認しましょう。
　また、試験中に時間を取られる問題となるため、出題傾向次第では敢えて捨てることもあるかもしれません。

#### 正誤の記録から見えてくること

　正誤の記録の傾向を見ると、自分の弱いところが分かって来ます。そうすると、弱いところにリソースを割く、敢えてその問題は捨てて他の部分にリソースを割く、といった戦略的な勉強ができるようになります。

　例えば、ある問題を4回解いて以下のような結果になった場合、次のような判断ができます。

- ○○○×　ならうっかりミス（なので、ここはサラッと確認する程度に留める）
- ○×○×　なら記憶が定着していない（なので、ここは復習する）
- ××××　は理解度が足りない（なので、ガッチリ復習する、または、時間が無い場合は敢えて捨てる）


### 勉強法を試した結果（個人の体験談です）

　この勉強法を今年短期間でITIL4を取る必要が出たときにやってみました。想定問題を3～4回問きながら毎回傾向の振り返り→外した問題に絞って復習することで4回目ぐらいの挑戦では間違える問題が2～3個まで減りました。

　最後まで間違えた問題は別途ノートなど作り、似た用語の違いとの比較などを繰り返すことで記憶の定着ができ、予想問題は全問正解できるようになりました。



## なお、本番では…

　もちろん分からなければ勘で選ぶし、時間内に解くための時間配分も行い、試験テクニックも駆使して合格を勝ち取りましょう！
コンテナ環境でのIMDSv2使用上の注意

ec2のインスタンスメタデータを取得するのに使用する仕組みですが

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html

2年くらい前にv2が出ていて、セキュリティが強化されたらしいです（以下IMDSv2）
このへんの具体的な話は記事もたくさんあるので今回は特に触れませんが、これが引き起こすちょっとした問題について書きます

# 問題が起きる環境

ec2に起動したコンテナで起きます
現代社会においてはかなり当てはまるかと思います

# 起きる問題

metadata取得に失敗します

上記のドキュメントにある通り、IMDSv2はまずtokenを取得して、そのtokenを使用してmetadataを取得します
__ec2の設定がデフォルトの場合__、そのtoken取得に失敗します

# どういうことなのか

IMDSv2のPUTリクエストにはホップ制限がかけられており、デフォルトでこの値は1になっています
そこでこちらのドキュメントに注意事項として書いてありますが

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html

> コンテナ環境では、ホップ制限が 1 の場合、コンテナへの到達は余分なネットワークホップと見なされるため、IMDSv2 応答は返されません。

ということです

# 回避方法

これまた書いてある通り、ec2インスタンスのホップ制限を2にします

方法としては

awsコマンドで `modify-instande-metaata-options` を使用して変更する
https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html

起動テンプレートのAdvanced detailsで指定する
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-launch-templates.html

などがあります

# 一応確認してみる

kubernetes環境で試しました

適当にcurlができるpodを作成します（今回はnetshoot https://github.com/nicolaka/netshoot を使用）

podが作られたnodeのインスタンスidを取得して、metadata-optionsを確認

```
$ aws ec2 modify-instance-metadata-options --instance-id i-xxxxxxxxxxxxxxxxx
{
    "InstanceId": "i-xxxxxxxxxxxxxxxxx",
    "InstanceMetadataOptions": {
        "State": "pending",
        "HttpTokens": "optional",
        "HttpPutResponseHopLimit": 1,
        "HttpEndpoint": "enabled",
        "HttpProtocolIpv6": "disabled"
    }
}
```

`"HttpPutResponseHopLimit": 1` が確認できましたので、netshootのコンテナにログインし、curlでtokenを取得してみます

```
bash-5.1# curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
curl: (56) Recv failure: Connection reset by peer
```

エラーになりました（エラーになるまで２分くらい待ちました）
HttpPutResponseHopLimitを2にします

```
$ aws ec2 modify-instance-metadata-options --instance-id i-xxxxxxxxxxxxxxxxx --http-put-response-hop-limit 2
{
    "InstanceId": "i-xxxxxxxxxxxxxxxxx",
    "InstanceMetadataOptions": {
        "State": "pending",
        "HttpTokens": "optional",
        "HttpPutResponseHopLimit": 2,
        "HttpEndpoint": "enabled",
        "HttpProtocolIpv6": "disabled"
    }
}
```

再びnetshootのコンテナからtoken取得を試みます

```
bash-5.1# curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
AQXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
```

tokenが取得できました

確かにec2デフォルトのコンテナ環境ではIMDSv2でのtoken取得で問題があり、ホップ制限を変更することで回避できました

# 隠れた影響

aws-sdkはデフォルトでIMDSv2を使用していますので、IMDSv2は使ってないよ、という場合も影響を受けている場合があります
aws-sdkの場合は、最初IMDSv2で試して、失敗するとIMDSv1で取得するという流れになっているということなので、遅延が起きます

https://github.com/aws/aws-sdk-go/issues/2972
例えばaws-sdk-goの場合は大々的に遅れるようなのでこの問題には気付きやすいでしょう

https://github.com/aws/aws-sdk-php/issues/1908
aws-sdk-phpの場合は1秒とのことで、気付かないうちにパフォーマンスが悪化している、なんてことがあるかもしれません
装着アイテムを作ってみよう！

#装着アイテムを作ってみよう！

前回までの私の記事を読んでいただいた方はこう思ったかと思います。
「箱は飽きた。装着アイテムを作ってみたい。」
装着アイテムと言えば何か？そうだね！アンテナだね！！
私も初めて作成した装着VCIはアンテナでした。

今回の参考は公式Wiki(*https://virtualcast.jp/wiki/vci/component/sdk/attachable*)です。
公式の解説の方がわかりやすい気もしますが気にしないで行きましょう。

#では作っていきましょう。
**・準備**
　作る前にまずは準備から。
　おそらくヒエラルキーに「SampleScene」があるかと思います。
　これを右クリックし、「新規シーンを追加」を選びましょう。
　「Untitled」という新しいシーンが作成されました。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/8403204f-0ac6-555e-8873-b2d041f5bfeb.jpeg)

**・「SampleScene」をアンロード。**
　「SampleScene」を右クリックし、「シーンをアンロード」をクリックしましょう。
　これで前回作成した箱のオブジェクトがUnityからアンロードされました。
　
　※1つのシーンファイルに複数のアイテムを作成していく場合、
　　何らかの理由でシーンファイルが崩壊した場合に全アイテムが崩壊します。
　　無理のない範囲でシーンを分け、不要な場合はアンロードしておくと安心でしょう。
![1_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/ee98472c-a91c-0eec-808d-52b5ad51da4d.jpeg)

**・モデル作成1**
　VCIオブジェクトを格納するために「アンテナ」オブジェクトを作成し、
　VCIサブアイテムを格納するために「ＡＮＴ」オブジェクトを作成しましょう。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/01f38e3b-1e58-9083-af4f-ec46c923c8ec.jpeg)

**・モデル作成2**
　「3Ｄオブジェクト」→「シリンダー（円柱）」を利用してアンテナの形状を作成しましょう。
　自力でアンテナ形状にモデリング出来ると思いますが、
　参考としてそれぞれの「Transform」値を貼り付けておきます。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/e47af4e1-ac6b-1d21-5cc6-e0b99ba3e793.jpeg)

**・マテリアルの一括適応**
　ここに御用意した黒色に着色したマテリアルが有ります。
　ヒラエルキーから全てのシリンダーを選択し、
　用意したマテリアルを「Mesh Rendeer」の「Default-Material」へドロップしましょう
　これで全てのオブジェクトのマテリアルが一括適応できました。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/e003e20e-42b2-32f5-c611-c26274ffb4bf.jpeg)

**・コンポーネントの追加**
　ヒラエルキーからVCIサブアイテムが存在する「ANT」を選択し、
　インスペクターの「コンポーネントの追加」→「VCI Attachable」を選択
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/022b9e13-b0e8-2dd0-e24e-25f6ccb158bd.jpeg)

**・VCI Attachableの設定**
　「サイズ」を「1」にしましょう。
　「要素0」に装着したい場所。ここでは「頭」を選択しましょう。
　「Attachable Distance」は装着判定を行う範囲です。
　　例として「0.1」としましたが、もう少し大きく「0.3」くらいが妥当かもしれません。

　「Scalable」にチェックを入れると、アイテムの大きさに合わせて装着範囲が変化します。
　　アイテムを大きくすると装着範囲がとんでもなく大きくなるのでお好みです。

　「オフセット」はＹ「-0.6」にし、アンテナ下部に装着判定が来るようにしましょう。

　※ここのサイズは大きさをさすわけではなく、要素の数（規模）を設定しています。
　　この表記はUnityではよくあります。
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/611afbda-c7a0-0cfd-b660-a05f7aadbb55.jpeg)

#終わりに
これにて頭に装着することの出来るアンテナを作成することが出来ました。
熊アバターを用意すればアナロ熊ごっこが出来ます！
また、アイテムをうまいこと作成し、要素を「Neck」とすることで
首に装着できるニコニコプレミアムパスも作成することが出来ます。
ではまたどこかで！！

![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/67752dc8-9a8d-aa1c-10d1-60c872788e9a.jpeg)
ファイルの操作

## ファイルの操作
仕事で使ったもの学んだもの、プライベートで使ってみたもの学んだもののメモのまとめです。
随時更新します。
### 関数
|  関数  |  説明  |
| ---- | ---- |
|  file_get_contents(ファイル名)  |  ファイルの内容を全て書き込む  |
|  file_put_contents(ファイル名, 文字列)  |  文字列をファイルに書き込む  |
|  fgets()  |  ファイルのデータを一行ずつ取得する  |
|  fopen()  |  ファイルへの接続をオープンし、ファイルにアクセスする際に使用する変数としてファイルポインタ（ファイルハンドラ）を返す  |
|  is_readable()  |  ファイルの読み込みに関するアクセス権（パーミッション）を点検、読み込み可能であるかどうかを知る  |
|  chmod(変更するファイル名, 変更後のパーミッション)  |  パーミッションを変更する  |
|  fclose()  |  オープンされたファイルポインタをクローズする  |
|  fread() | [バイナリセーフ](https://qiita.com/dodonki1223/items/e3d2c4a032b129e1f6ce)なファイルの読み込み  |
|  fwrite() | バイナリセーフなファイル書き込み処理  |
|  file() | ファイル全体を読み込んで配列に格納する  |
|  file_exists() | ファイルまたはディレクトリが存在するかどうか調べる  |
|  stream_set_timeout() | ストリームにタイムアウトを設定する  |
|  popen() | プロセスへのファイルポインタをオープンする  |
|  stream_context_create() | ストリームコンテキストを作成する  |
|  umask() | 現在の umask を変更する  |
|  mb_convert_encoding() | 指定した文字列を指定した文字コードに変換し、返す  |
|  feof() | ファイルポインタがファイルの終端にあるか調べる  |
|  fgetcsv() | カンマ区切りでこうせされたCSVファイルの行を読み込む  |
|  fputcsv() | カンマ区切りでこうせされたCSVファイルの行を出力する  |
|  fgetc() |  ファイルから一文字を取り出す  |
|  header() |  HTTPヘッダー情報を送信するときに使用  |


- file_get_contentsとfile_put_contentsは、ローカルファイルだけでなくリモートファイルに対しても読み書きを行うことができる
- ファイルにアクセスする関数を利用する場合、ディスク容量やパーミッション（ファイルへのアクセス権）など、エラーの原因を常にチェックする必要がある

## 用語
|  用語  |  説明  |
| ---- | ---- |
|  スクリーンスクレイピング  |  ほかのWebサイトの画面情報を切り出し、画面の内容から情報を抽出して利用すること  |
|  ファイルポインタ  |  ファイルへのアクセスが可能になる特別な変数, ファイルを編集するための現在位置を表し、ポインタが先頭にある場合はファイルの一番最初から読み書きを行う  |
|  HTTPヘッダー  |  HTTPによる「リクエスト（要求）→レスポンス（応答）」の流れで、どのような情報をリクエストして、どのようなコンテンツを受け取るかを定義するためのもの  |

- スクリーンスクレイピングを行う場合、対象のWebサイトが明示的に情報を公開しているパブリックドメインであることを確認する必要がある

[モード](https://www.php.net/manual/ja/function.fopen.php)にアクセスしてファイルにアクセスする
$ファイルポインタ = fopen(ファイル名, ファイルのモード)

## ファイルへのアクセス手順
1. fopen()関数を利用して、ファイルへの接続をオープンにする
2. fgets()関数を利用して、ファイルに対して読み込みを行う
3. fclose()関数を利用して、ファイルをクローズする

## ファイルエラー処置
ファイル処理関数のエラーはfalseが帰るが、0が入力されていた場合0を返してしまう。そのため、phpでは0はfalseと判定されるため、「$test === false」を使う必要がある

## ファイルアクセスの脆弱性
- ***ディレクトリトラバーサルの脆弱性***・・・Webサーバ側で公開ファイルへのアクセス制御は行えるが、フォームデータに「.」や「..」といったパス指定を行う特殊文字が含まれていると、公開設定をしていないファイルにアクセスできる場合がある
- そのため、realpath()を使用し、返還後のファイル名を受け入れてよいかを判断する方法が良い

以下参照させていただいた記事です。
https://qiita.com/dodonki1223/items/e3d2c4a032b129e1f6ce
https://www.php.net/manual/ja/function.fopen.php
[UiPath] 要素認識ができないときのTips：フレームワーク変更

#はじめに
UiPathでWF開発する際、要素認識（＝アプリケーションの構造を認識したセレクターを指定）しながら開発していくことが多いと思いますが、たまに「ここだけ認識できない…！何故！」ってなってしまうこともあります。
画像認識・座標認識を使ったりという回避策もありますが、**その前に一度試してみてほしい方法**を記載します。
＜使用バージョン＞UiPath Studio 2020.10.3（UIAモード：モダンデザイン）

###更新履歴
- 2021/12/15　投稿

#要素認識不可例と対応案
私が確認したことのある、下記の悲しい例を見てください。
※環境やバージョンによって異なる現象となる可能性があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912140/9850dac3-8b31-3ebd-51e0-cbcfdf7319e0.png)
ああ…！😭
Microsoft Edgeで、リンクに対し右クリックしたときのメニューです。「名前をつけてリンクを保存」したかったのですが、選べない…。

###こんなときは
要素認識モードで**F4**を押す、もしくは選択オプションウィンドウからオレンジ枠のボタンを押してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912140/b35afcbb-8db0-6e3a-13d2-ad07fdcdcc8f.png)
↓ 結果 ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912140/75c7145e-3fc7-882c-51ff-911fee9fed42.png)
認識できました😊

###何が起こったのか
F4を押した結果、UIフレームワークがDefaultからAAに変わっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912140/8c9e0b69-eea7-ad66-b59f-40ac9b4af152.png)
（他社ツールかと思いますわ）

#UIフレームワークとは
UIフレームワークとは一体なんなのか、というと、UI要素（セレクター）を取得するための技術のことを指しています。
F4ボタンを押すとフレームワークの種類が変わる＝要素認識の技術を変えるということですね。
認識のアプローチを変えることで、認識出来なかった部分が対応できるかどうか確認する、ということをやりました。

###UiPathで利用可能なUIフレームワーク
F4を押すことで、以下の3種類のフレークワークが選択できます。
- Default：UiPathにより作成されたフレームワークです。規定ではこちらを使うようになっています。
- AA：[Active Accessibility](https://docs.microsoft.com/ja-jp/windows/win32/winauto/microsoft-active-accessibility)という名のフレームワークです。一世代前のMiscrosoftの技術で、UI自動化のために開発されました。
- UIA：[UI Automation](https://docs.microsoft.com/ja-jp/windows/win32/winauto/entry-uiauto-win32)という名のフレームワークです。AAより新しいMicrosoftの技術です。

#まとめ
ほとんどの場合、既定となっているDefaultのフレームワークで問題無く要素認識可能のようですが、先述のようにたまに上手くいかない場合が発生します。
バージョンアップにより解決されている場合もあるのですが、取り急ぎ解決したい場合は、まず他のフレームワークに切り替えて認識できるか確かめてみるのが良いかなと思っています。セレクターを取っていてあっ（悲）と思ったら、とりあえずF4を押してみてください！
【Raspberry Pi Pico】ThonnyでDevice is busyエラーが出る対処法

# 事象
ラズパイpicoを繋ぎ、Thonnyでコードを読み出し・保存しようとすると以下のエラーが出る

```
Device is busy -- can't perform this action now.
Please wait or cancel current work and try again!
```

# TL;DR
Thonny > Preference > Interpreterにて以下の項目を見直す

- Which interpreter or device should Thonny use for running your code?
    - → MicroPython(Raspberry Pi Pico) を選択
- Details > Port
    - → < Try to detect port automatically > を選択

以上に設定して OK を押すと、ファームウェアをインストールするか聞かれるのでインストールする。
自分の環境ではこちらでエラーが解消しました。

# 環境
 -　Raspberry Pi Pico
 -　Thonny 3.3.6


# その他試したこと
- Ctrl + C 押してね、という表示が出るものの押しても変わらず
- ↓で議論されているように`main.py`のファイル名を書き換えるuf2ファイルを入れてみましたが、変わらず（後ほど確認したところファイル名変更は正常にされてました）

https://forums.raspberrypi.com/viewtopic.php?t=321332
Spresenseを使ったシンプルなAudio Playerをつくってみた

# はじめに
SpresenseのもつAudio機能を簡単に使えるようにするためのArduinoライブラリ「SP_Audio」を作成しました。イメージは、DFPlayer Miniぐらいのシンプルさを目指しています。ただ、DFPlayerとは違って、MP3だけではなくWAVも再生可能、ハイレゾも再生可能、デュアルデコードで2つのストリームを同時に再生可能、さらにビープ(tone)も組み合わせると同時にトリプル再生可能、そして、再生だけはなく録音にも対応、ハイレゾ録音も可能。これらSpresenseのもつAudio機能そのものなのですが、DFPlayerとはレべチです。

前置きが長くなりましたが、「SP_Audio」ライブラリはSpresenseのもつAudio機能をかなり抽象化しているので、機能の中身を知りたいひとはソニー公式の[Audioチュートリアル](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_tutorial_audio)に丁寧に解説されているのでそちらを参考にすると良いと思います。

# SP_Audio 特徴
* DFPlayer MiniっぽくシンプルなAPIでオーディオ機能を扱える
* ライブラリ内で専用スレッドを立てて処理しているので、他の処理との組み合わせ動作が簡単！
* 機能
 * MP3/WAVの再生機能
 * MP3/WAVの録音機能
 * ビープ音再生機能
 * デュアルデコード対応
 * ハイレゾ対応

# SP_Audio 使い方

ライブラリはこちらです。Arduino/libraries 以下にインストールしてください。
(インストール方法について、もう少し具体的な方法を知りたい場合はコメントください)

https://github.com/baggio63446333/SP_Audio

APIの使い方はこんな感じです。

```cpp:MP3再生
#include <SP_AudioPlayer.h>
SP_AudioPlayer player;

void setup()
{
  /* Initialize Player */
  player.begin(); // 初期化
  player.volume(10); // ボリューム設定
  player.setFs(48000); // サンプリングレート設定
  player.setBitlen(16); // ビット長設定
  player.setChannel(2); // チャンネル数設定

  /* Player */
  player.mp3play("/mnt/sd0/sample.mp3"); // ファイル再生
}
```
```cpp:MP3録音
#include <SP_AudioRecorder.h>
SP_AudioRecorder recorder;

void setup()
{
  /* Initialize Recorder */
  recorder.begin(); // 初期化
  recorder.volume(50); // マイクゲイン設定
  recorder.setFs(48000);  // サンプリングレート設定
  recorder.setBitlen(16); // ビット長設定
  recorder.setChannel(2); // チャンネル設定

  /* Recorder */
  recorder.mp3recorder("/mnt/sd0/sample.mp3"); // 録音開始
  sleep(10); // 10秒間録音
  recorder.stop(); // 録音停止
}
```

# SP_Audio サンプルコード一覧

機能についてAPIを細かく説明するより、サンプルコードを動かしてみてもらった方が早いと思うのでexamples一覧(2021/12/16時点)を載せておきます。

|example|説明|
|-------|---|
|MP3Player|SDカードのmp3フォルダに置いてあるMP3ファイル(16bit, 2ch)を順番に再生する。|
|WAVPlayer|SDカードのwavフォルダに置いてあるWAVファイル(44.1kHz, 16bit, 2ch)を順番に再生する。|
|MP3Recorder|SDカードにsample.mp3(48kHz, 16bit, 2ch)を10秒間録音する。録音が終わったら再生、を繰り返す。|
|WAVRecorder|SDカードにsample.wav(48kHz, 16bit, 1ch)を10秒間録音する。録音が終わったら再生、を繰り返す。|
|HiresWavRecorder|SDカードにhires.wav(192kHz, 16bit, 1ch)を10秒間録音する。録音が終わったら再生、を繰り返す。|
|MP3DualPlayer|SDカードのmp3フォルダに置いてあるMP3ファイル(16bit, 2ch)を順番にデュアル再生する。|
|WAVDualPlayer|SDカードのwavフォルダに置いてあるWAVファイル(44.1kHz, 16bit, 2ch)を順番にデュアル再生する。|
|TalkingDisplay|音源words.zipをSDカードに展開しておく。シリアルからのコマンド入力にしたがって日付や時間を再生する。|
|Beeper|音階をビープ再生する。|
|PlayRtttl|スターウォーズをビープ再生する。|
|SerialBeeper|シリアルコマンド入力にしたがってビープ再生する。|
|SerialPlaylist|シリアルコマンド入力にしたがってプレイリストを再生する。|

# さいごに

オーディオ機能をメインに使うというよりも、他の機能を実装しているアプリケーションの中で、音機能も簡単に組み合わせて使いたいよという場合に、setup(), loop() にオーディオ処理をごちゃごちゃ書かなくて済むので、このライブラリは役に立つのではないかと思います。
これ以下はない最低限の健康対策

##はじめに
私は今年からデスクワーカーの30代です。
体を動かす機会も少なくなり、どんどん体力が衰えて行くのを感じております。
そこで、今後のためにも健康を維持するための方法を自分なりにまとめたいと思います。
##なにから始めるべきか
健康について考えたのは、もちろん今回が初めてではありません。
こうなる前から健康に関して、意識だけは高く持っており、
* 早起きしてランニング
* 仕事帰りにジム通い
* 週末はフットサル
数々の素晴らしいアイデアも生まれましたが、それ以上に多くの言い訳も生まれ一切長続きしませんでした。
今回はこれまでの失敗を活かし、こんな私でも続けることのできる、言い訳のしようもない、**超ゆるいトレーニング**をかき集め
気が向いたらやるという**超ゆるいルール**から始めることにしました。
`気が向いたらとはいっても1日1回は絶対にやるという鉄の掟を立てております。`
##部位別トレーニングメニュー
私でもこれならできると厳選した自信を持ってお勧めする超ゆるいメニューです。
:large_blue_diamond: **脚**
<iframe width="560" height="315" src="https://www.youtube.com/embed/lDvtVEuaNQw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
:large_blue_diamond: **腹筋**
<iframe width="560" height="315" src="https://www.youtube.com/embed/EH-4rkzRfnM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
:large_blue_diamond: **背中**
<iframe width="560" height="315" src="https://www.youtube.com/embed/Zjzsh-l_B_I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

お腹凹ますだけだったり、足踏みするだけだったりトレーニングと言えるか微妙な程ゆるいです。
とは言え色々な記事や動画でよく見かけますので、なんらかの効果は見込めるかと思われます。
##いつやるのか
私はこれらを1日1回　何分でも何秒でもいいので、必ずやるといった鉄の掟を立てておりますが、
実際は、1回と言わず、日常のルーティンと紐づけてそこそこやってます。

* 歯磨き中
* ドライヤー中
* 入浴中

水回り多めです。
他にも洗濯物畳んでる時とか、料理中とか毎日行っている家事と結び付けてもいいかもですね！
人によって様々かと思いますが大体これで1日15分ぐらいでしょうか？
他にも、
* 信号待ち
* エレベーター内
など、トレーニングが面倒であれば信号に間に合うように走る！信号が無い道を遠回りして歩く！階段を登る！
日頃から高い意識を持ち超ゆるいトーレニングに励んでおります。

他にも人それぞれ色々と思いつくかと思いますが、
私の自分ルールですと、前半の15分に後半も合わせると20分以上となりますので、

*1ヶ月 10時間*
*3日に1回 1時間のトレーニングに相当します。*
**年間120時間、継続は力也**

##ポイント
どんなに短時間でもゆるいトレーニングでもいいので、必ず1日 1回は何かやることが大事だと考えております。
最初はこれ以上ないくらいにハードルを下げて毎日行う事で、
まずは運動習慣を身につけ、そのうえでトレーニングの時間や負荷を徐々に上げていく方針が、
言い訳上手な自分でも続けることができるポイントだと思ってます。

##最後に
ポイントとかあげといてではありますが、私もこれからこれらを継続していき、効果を検証していく身となります。
ただ、年間120時間、もっと大袈裟に死ぬまでと考えたら何千時間のトレーニングとなりますので、やった人とやらなかった人でやっぱり何か違ってくるとは思ってます。
腰のダメージに怯え恐る恐る10kgの大台を突破した愛娘を抱き上げている私も、いつかは半永久的かつパワフルな抱っこを実現していることでしょう。
この記事が少しでも皆さんの健康維持にお役立て出来れば幸いです。
Deno のしつこいエラー、Volar をオフにしたら直った。

# Deno をセットアップするも、エラーが出続けた。

最近 Deno を使うことになり、[公式ドキュメント](https://deno.land/#installation)を読みながらセットアップすると、VSCode上にこんなエラーが出ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/ba64b892-329c-81b6-f8a5-4e6164ba4884.png)

```
An import path cannot end with a '.ts' extension. Consider importing 'slack-cloud-sdk/mod' instead.ts(2691)
```

ググってみると、[同じように困っている人たちがたくさん](https://github.com/denoland/deno/issues/5027)いました。

直し方もいろんなサイトで紹介されていて、大抵以下のようなものです。

- VSCode の settings.json に `"deno.enable": true` を記述する。
- コマンドパレット（`ctrl + shift + p`）を開いて、`Deno: Initialize Workspace Configration` を選択する。
- 上記設定後にリロードする。

ほとんどの人は上記で直っていたようですが、私の場合**依然としてエラーが表示され続けました。**

# 原因は Volar

色々探しているうちに、[ある Issue のクローズ後のコメント](https://github.com/denoland/vscode_deno/issues/90#issuecomment-968154385)に

> Volar をオフにしたら直るよ！！

的なことが書いてあったので、`Disable(workspace)` したところ直りました。

Volar は Vue3 で欠かせない VSCode 拡張ですが、まさかこんな副作用があったとは。ハマる人が減ると嬉しい。

# おまけ
Volar のセットアップ時に [builtin の TypeScript の補助機能を disable にすると良いという記事](https://zenn.dev/ymgn____/articles/e7709e88948446) があったのですが、私は誤って VSCode 全体で disable にしてここもハマってしまいました。同じような人がいるかわからないですが、少なくともこのワークスペースで enable にしておいてください。

拡張機能の検索窓から `@builtin typescript` で検索し、enable にするだけです。
ASTERIA warpで暗号化したファイルを復号化してみる

#はじめに
Asteria warpを使ってテキストファイルの復号化をします。
復号化はJavaの標準ライブラリを使用しています。
(暗号化もやりたかったのですが、時間の都合で復号化のみになってしまいました・・・)

使用した環境は以下の通りです。
* ASTERIA warp Standard Edition 2106.100
* JDK8

#フローの説明
フローはとてもシンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87342/a0ff515b-9bff-168c-7ece-c3aed32189ef.png)

* マッパーで入力ファイルと出力ファイルを設定します。
* Javaインタプリタ―コンポーネントで復号化をしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87342/4428aa38-7e51-7e68-5658-5b2486829c37.png)

暗号化された入力ファイルと復号化した出力ファイルのパスを指定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87342/2e0a6785-7b32-3762-88fc-f4f20c303901.png)

Javaインタプリタコンポーネントの中に復号化するJavaのコードを記載します。
(ノ―コードツールなのに、思い切りコードを書いています・・・)

#まとめ
ASTERIA Warpはデータベースを始めいろいろなシステムを簡単に連携させることができます。
普段はjavaでコードを書くようなことはほとんどありませんが、ASTERIA Warpの中に最小限のコードを入れることでさらに便利になることがあると思います。
ClickHouse 21.12 の新機能

この記事は[ラクス Advent Calendar 2021](https://qiita.com/advent-calendar/2021/rakus)の16日目の記事です。
昨日は@r_numotoさんの[Laravel SailでDocker環境を作ってみる](https://qiita.com/r_numoto/items/62afb14a466a9eaa8743)でした。

---

## ClickHouseとは

https://clickhouse.com/

[ラクスのOrganization](https://qiita.com/organizations/rakus)でClickHouseについて触れるのは初めてなので説明すると。
ClickHouseはオンライン分析用に開発されたオープンソースの列指向型データベース管理システムです。[Yandex](https://yandex.com/)というロシアのGoogle的な会社がアクセス解析を行う(Googleアナリティクス相当の[Yandex.Metrica](https://metrica.yandex.com/about?)を実現する)ために開発した製品で、現在はYandexから独立したClickHouse, incが開発を行っています。他の製品だと[AWSのRedShift](https://aws.amazon.com/jp/redshift/)や、[GoogleのBigQuery](https://cloud.google.com/bigquery)が近い製品になります。

そのほか[公式ドキュメントの概要](https://clickhouse.com/docs/ja/)を御覧ください。ちょっと古いですが↓の資料も特徴を知るにはいいと思います。

https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/10%20Good%20Reasons%20to%20Use%20ClickHouse%20by%20Ramazan%20Polat.pdf

自前でホスティングすることも可能ですし、[Altinity.cloud](https://altinity.com/cloud-database/)や[Yandex.cloud](https://cloud.yandex.com/en/services/managed-clickhouse)のサービスを使うこともできます。

## ClickHouse 21.12

昨日(2021/12/15)、ClickHouse21.12のドキュメントが公開されました。日本時間2012/12/17 02:00からはRelease Webinarが開催され、リリースはその後されると思います。

**Webinar**

https://www.youtube.com/watch?v=6qi_S9CEqa4

**リリース記事**

https://clickhouse.com/blog/en/2021/clickhouse-v21.12-released/

アドベントカレンダーの担当前日にタイミング良すぎ！ということで、本記事ではChangelogから目についた新機能を紹介したいと思います。

https://clickhouse.com/docs/en/whats-new/changelog/#clickhouse-release-v21-12-2021-12-15

### BOOL型のサポート

ClickHouseの特徴として、他の製品(MySQLやPostgreSQL、Kafkaなど)と連携が可能というものがあり、この機能追加もその一環です。テーブルにBool型のカラムを定義できるようになり、真(`1`, `true`, `TRUE`)や偽(`0`, `false`, `FALSE`)を扱えるようになりました。

https://github.com/ClickHouse/ClickHouse/issues/30684

### CNFオプティマイザーの追加

フィルター条件により速度が出ない問題の解決のため、[CNF](https://en.wikipedia.org/wiki/Conjunctive_normal_form)でのオプティマイザーが追加されたようです。ドキュメントがないため使い方は見切れていませんが用途によりCNFとDNFを使い分けられるようです。

https://github.com/ClickHouse/ClickHouse/issues/11749

### ファイルからデータ登録が複数並列で行えるように

例えば、次のクエリ`INSERT INTO t FROM INFILE hoge/*`を実行することでhoge以下の全ファイルを`t`にロードすることができます。すべてのファイルは並列で処理されるので、かなりの速度が期待できそうです。

https://github.com/ClickHouse/ClickHouse/pull/30135

### カスタムフォーマットの追加と、各種フォーマットのバグ修正

ClickHouseでは入出力にCSV、TSV、JSON、Parquetなど様々なフォーマットに対応しています。今回はそのフォーマットについてのバグ修正と、独自フォーマットの定義を作成可能にする機能追加が行われました。

https://github.com/ClickHouse/ClickHouse/pull/31434

https://github.com/ClickHouse/ClickHouse/pull/30178

### URLテーブル関数にリトライオプションを追加

ClickHouseには様々な[テーブル関数](https://clickhouse.com/docs/en/sql-reference/table-functions/)が用意されていて、その一つにurlがあります。例えば`SELECT * FROM url(https://hoge.com/sample.csv, CSV, 'id Int32, value String')`とすればsample.csvにアクセスし、ファイルに対してSQL文を実行できます。
今回の機能追加で、アクセスに失敗した際に再試行を行えるようになりました。

https://github.com/ClickHouse/ClickHouse/issues/29696

## 最後に

今回の更新ではバグフィックスや、性能改善が多めになっていました。
[2021年のロードマップ](https://github.com/ClickHouse/ClickHouse/issues/17623)もそれなりに完了していて、来年以降も活発に開発されていきそうです。
スライドショー

手こずったJQueryのスライドショー。
作ったのはボタンを押したときに画像がスライドするものです。
説明が間違っていたら申し訳ないです。勉強します。

まず最初にコードを書くまえに必要な手順をリストアップしました。以下自分が必要だと思いメモに記述した内容です。

① forを関数外で実装し、要素の位置情報、個数、幅の個数を取得する
② ボタンが押されたとき、data属性を取得する
③ １クリックごとに要素の幅分スライドする

## forを関数外で実装し、要素の位置情報、個数、幅を取得する
①では、画像の位置情報を配列に入れ流必要があると考えたため、forを使って、位置情報を取得できるようにしました。

まずスライドショーで見せたい画像ファイルを用意します。

```javascript
<ul class="slider-list clearfix">
 <li><img src="./img/1.jpg"></li>
 <li><img src="./img/2.jpg"></li>
 <li><img src="./img/3.jpg"></li>
 <li><img src="./img/4.jpg"></li>
</ul>
```
空の配列を用意します。

```javascript
var pages = [];
```
画像の位置情報を取得するために、要素の個数を取得する必要があるため、**length**を使います。

```javascript
var numCount = $('.slider-list li').length;
```
要素の幅を取得した後に幅の数値を入れる変数を用意します。

```javascript
var num = 0;
```
forで i を用意し、i が numCount より小さい数値の場合のみ繰り返されるようにします。
forの処理で画像のサイズを width を使って num に追加し、 **push**を使って配列 pages に要素を格納します。『-』をつけた理由は、 element.style にて left としているため、右にスライドすると『- px』になったからです。
**eq()**とは、複数のHTML要素の中からインデックス番号を指定することで特定の要素だけを取得できます。

```javascript
for(var i = 0; i < numCount; i++){
 if (i == 0) {
  pages.push(0);
 } else {
  num += - $('.slider-list li').eq(i).width();
  pages.push(num);
 }
}
```
これでforを関数外で実装し、要素の位置情報、個数、幅を取得することができました。

## ボタンが押されたとき、data属性を取得する
②では、クラスごとに呼び出すのではなくdata属性を使うことでより汎用性の高いソースになるため、data属性を取得します。
ボタンを用意します。

```javascript
<button type="button" class="slider-ctrl-btn is-prev" data-ctrl="prev"></button>
<button type="button" class="slider-ctrl-btn is-next" data-ctrl="next"></button>
```
slider-ctrl-btn の data('ctrl') を取得したいため、以下のようになります。

```javascript
$(this).data('ctrl')
```
## １クリックごとに要素の幅分スライドする
③ではifを使って prev と next の条件を作ります。
まず初期値の用意。

```javascript
var pagesNum = 0;
```
ボタンは２つのため条件も２つで足りるので、が「もし②が『prev』のとき、右にスライドする。それ以外の場合、左にスライドする。」としました。**animate**を使うことでスライドするアニメーションが実行されます。

```javascript
$(".slider-ctrl-btn").click(function () {
  if ($(this).data('ctrl') === 'next') {
    var step = 1;
    pagesNum = pagesNum + step;
    if (pagesNum === pages.length) {
      pagesNum = 0;
    }
    $(".slider-list").animate({left: pages[pagesNum]})
  } else if ($(this).data('ctrl') === 'prev') {
    var back = -1;
    pagesNum = pagesNum + back;
    if (pagesNum === -1) {
      pagesNum = pages.length - 1;
    }
    $(".slider-list").animate({left: pages[pagesNum]})
  }
});
```
Nestjsでマイクロサービス①


メモ：[こちら](https://docs.nestjs.com/microservices/basics)
を見読みつつそのままでは実装ができなかったので実装しました。


NestJSのMictoservisの項目の実装が足りてなかったので独自で実装しました


## Overview
TCPでの通信を行う
いわゆる　request-responseモデルであり、応答を待つタイプ

- 実装はこちら：https://github.com/starcharles/nest-microservice/tree/feature/tcp-example

 - server1を起動した状態で
 - server2を起動
 - server2のGET /sum GER /userなどを叩く
 - TCPでserver1に通信が届く

### Redisでの実装
Redis のPub/Sub機能を用いて、メッセージングを行う

実装：https://github.com/starcharles/nest-microservice/tree/feature/redis

1. redisをpassworldなしで動くように起動（調べてください）

2. server1, server2を起動

エラーが出なければ接続できているので、server2(localhost:3001)に対して
GET http://localhost/notificationをする

うまく行けばserver1で受信できて成功！！！
ReactなどSPAのサービスをChromeで超簡単にデバックする

知ってる人も多いかもしれないけど、Chromeのブラウザー開発者ツールでデバックができる。
#方法
ツールを開いて、「ソース」タブからソースコードが書かれたファイルを選択すると、デバック画面が表示される。

#使用感　
ブレークポイントなども設定でき、使い方はVScodeのそれとほぼ変わらない。
クライアントサイドにあるコードは設定など不要でデバックできる。
ReactなどのSPAはブラウザにほぼ全てのソースコードがある場合が多いため、VScodeでlaunch.jsonを設定するのがめんどくさければこちらでもいいかも。
Next.jsの公式サイトにも記載されている方法なのでぜひ使ってみてください。
ちなみにサーバーサイドのデバックもNext.jsならできるっぽい。方法は下記の記事でどうぞ。

#参考文献
https://nextjs.org/docs/advanced-features/debugging#debugging-with-chrome-devtools
NuxtJSのビルド時にTerser RangeError

## RangeError

`nuxt build` 実行時に RangeError が発生

```shell-session
nuxt build
# ...

Entrypoint app = adb3c20.js 7657aa1.js 3dc6bb3.js 2ae3199.js

ERROR in ec87413.js from Terser
RangeError: Maximum call stack size exceeded
at Object.parent (C:\**\node_modules\terser\dist\bundle.min.js:7656:35)

# ...

FATAL Nuxt build error                                                                                                                                                                                                                                      
```

## assetのサイズが大きすぎる？

fontsourceのフォントを複数DLしてプロジェクトに含めていたからだろうか

フォントをプロジェクトから省いたらビルドできた。

# 回避策

フォントをプロジェクトファイルから省き、CDNのものを利用する方向で対応した。

参考 ビルドオプションの指定で対応できないかと調べたが解決せず

https://nuxtjs.org/ja/docs/configuration-glossary/configuration-build/#optimization
シェル学習 awk

####awkによる検索と計算の練習

```
$ seq 5 | awk '/[24]/'
2
4

$ seq 5 | awk '$1%2 ==0'
2
4

$ seq 5 | awk '$1%2==0{printf("%s 偶数\n"),$1}'
2 偶数
4 偶数

$ seq 5 | awk '$1%2==0{print $1, "偶数"}$1%2{print $1, "奇数"}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数

$ seq 5 | awk 'BEGIN{a=0}$1%2==0{print $1, "偶数"}$1%2{print $1, "奇数"}{a+=$1}END{print "合計",a}'

1 奇数
2 偶数
3 奇数
4 偶数
5 奇数
合計 15


```
Lambda を使用して、Amazon EC2 インスタンスを一定の間隔で停止および起動するにはどうすればよいですか?



教材
-

https://aws.amazon.com/jp/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/

実作業
-

停止して起動する EC2 インスタンスの ID を取得します
-

EC2の画面から当該EC2インスタンス選択
リージョンも確認しておく

JSON ポリシーエディターを使い IAM ポリシーを作成します
-

IAMの画面からポリシーを選びポリシーの作成をクリック
JSONタブをクリック
コピペして適切なタグをつけて名前をつけて作成

 Lambda のための IAM ロールを作成します
-
IAMの画面からロールを作成
さきほどのポリシーをアタッチして
適切なタグをつけて名前をつけて作成

EC2 インスタンスを停止および起動する Lambda 関数を記述する
-
このまま実施します
>
1.    AWS Lambda コンソールで、[Create function] クリックします。
2.    [Author from scratch] をクリックします。
3.    [Basic information] に次の事項を追加します。
[Function name] に EC2 インスタンスを停止させる関数の名前を入力します。たとえば「StopEC2Instances」のようになります。
[Runtime] では [python 3.8] を選択します。
[Permissions] で [Choose or create an execution role] を展開します。[Execution role] で [Use an existing role] を選択します。[Role] で今回作成した IAM ロールを選択します。
4.    [Create function] をクリックします。
5.    [Function code] で、次のコードをコピーして 、コードエディターのエディタペインに貼り付けます (lambda_function)。このコードでは指定したEC2 インスタンスを停止します



関数コード例 - EC2 インスタンスの停止

```
import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))
```

注意: [region] で、「us-west-1」を自分のインスタンスがある AWS リージョンと置き換えます。[instances] で、サンプルの EC2 インスタンス ID を、実際に停止および起動したいものの ID と置き換えます。

関数コード例 - EC2 インスタンスの開始

```
import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))
```

注意: region および instances では、EC2 インスタンスを停止させたコードと同じ値を使用します。

Lambda 関数のテスト
-
今回起動と停止なのでテストのコードはいらない
デプロイ忘れないこと

Lambda 関数をトリガーするよう、CloudWatch Events のルールを作成します。
-

Cloudwatch の画面から イベントを開いてルールを選択する

あとはそのまま実施します
>
6.    [Targets] の [Add target] をクリックします。
7.    [Lambda function] をクリックします。
8.    [Function] から EC2 インスタンスを停止させる関数を選択します。
9.    [Configure details] を選択します。
10.    [Rule definition] で次の事項を行います。
[Name] には「StopEC2Instances」といったようなルールを指定する名称を入力します。
(任意) [Description] でルールを記述します。たとえば「Stops EC2 instances every night at 10 PM.」のようになります。
[State] で [Enabled] チェックボックスをオンにします。
11.    [Create rule] を選択します。

あとがき
-
ルールの書き方を勉強したい
「平日毎朝7時にスタート 夕方6時にストップ」など
化石がマイナスからKaggleを始める～レベル最弱の「タイタニック号を救え！ ない」3 ～

#前提
数学力・統計力・技術力がほぼすべて「ゼロより低い、マイナス」の化石エンジニア・アンモナイトが生き残りを目指して~~賞金が欲しくて~~、Kaggleに挑戦する。
たぶん、Kaggleに挑戦する記事の中で、もっともレベルが低いと思う。
現状は、チュートリアルコンペ・タイタニック号の内容に驚愕し（「え、タイタニック号を救う話じゃないの？」）、
そもそも技術とは……となったところです。

#1：自習
前回判明の通り、いかんせん、アンモナイトは技術力が低すぎる+思い込みが強すぎる＝マイナス過ぎる。
このままではKaggle挑戦を月日とともに忘却し、少しでもマシなIT系の人になろう、という初志を忘れかねない。
そこで、Kaggleをホールドしつつ、地道に他社の研修資料＆動画を見ることにした。
ありがたいことに、昨年は研修資料＆動画を公開してくださった企業様が複数あり、
「最初にこれを見るべき」ということで、サイボウズ様の研修資料＆動画を見始めました。
つまり、Kaggleに挑戦すると同時に、「常識」を学ぶ。

サイボウズ様・研修：
https://blog.cybozu.io/entry/2021/07/20/100000

アンモナイトが考えた化石エンジニアの進化：
「化石→アジャイル→社外コミュニティへ→スクラム→CSM→常識（他社研修）→Kaggle→アプリ作成→陸上（肺呼吸）」

#2：サイボウズ様研修
そういうわけで、今年の正月休みを使って研修資料＆動画の視聴を始めたのだが、面白い。
昨日までで「Webアプリケーション基礎」～「サイボウズのアジャイル・クオリティ」まで視聴したが、知らないことを知るのはすごく面白い。
特に「ソフトウェアテスト」「テスト自動化」「サイボウズのアジャイル・クオリティ」は、もともとアジャイルでのQAに興味があったので、とても面白かった。
「アクセシビリティ」も、考え方の軸を教えてくれたので、「あー、なるほど」と腹落ち感。
これは資料作成時にも役立つ考え方ではないかと感じました。
※Dockerとコンテナの初歩も理解（たぶん）。

もしアンモナイトと同様に「化石になってるな……」と感じておられる方は、とっかかりになる資格取得と他社研修の視聴がおススメです。
いかんせん、なにか武器がないと始まらない。ヒノ●の棒でもいいので、拾う。もしくは、3タイプからどれかを相棒に選んで旅に出る。
アンモナイトのとっかかりはアジャイルでしたが、そこは人それぞれ強みがあると思います。
もし、「いや、本当に何もないんです……WF沼から出られない呪いがかかってるんです……」という方は、「本気」を武器にしてみては？
「本気」は誰でも装備できてレアリティ低いと思われるかもしれませんが、意外と「殺意120％の本気」を持っている方は少ない気がします。
熱量を持っている方は、何に挑戦するにしても、意欲の密度が違うと思います。

#3：タイミングが悪い
「本気」について熱く語ったところですが、明日からRSGT2022が始まるのである。
さすがにこっちのセッションを見ないわけにはいかないので、今週はサイボウズ様の研修資料＆動画を見つつ、RSGTに熱狂の予定です。
楽しみすぎる。


地道に研修視聴後、Kaggleに戻ってきます。「タイタニック号は救え」ないのですが（理解した）。
長文にお付き合いいただき、ありがとうございました！
rex0220 計算式プラグイン テーブル行数を指定

計算式プラグインで、テーブル行数を指定できるようになりました。
新規レコード追加時に指定行数分を用意するなどの用途に利用できます。
※計算式プラグイン Ver.48以降でサポート

# 概要

計算式で指定することにより、テーブル行数を制御できます。
あらかじめ必要なテーブル行を準備したり、月ごとにテーブル行数を変えるなどが可能です。
追加・削除ボタンを非表示にして、誤った操作を防止できます。

テーブル５行固定表示例
![2021-12-26_14h44_55.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/60d4fe87-6ba7-3c52-a7d0-e89ea35c215e.gif)

![2021-12-26_13h13_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c48723c9-ca40-be9d-b5ed-95042f3aee30.png)


# テーブル５行固定例１

テーブルの計算式に「5」を指定するだけです。
テーブル行数は、0 ～ 100 の範囲で指定可能です。
あと行番号、行ごとに区分を設定します。

- テーブル５行固定： 5
- 番号：　ROWNO(テーブル５行固定)+1
- 区分：　CHOOSE(ROWNO(テーブル５行固定),"A","B","C","D","E","F")
- 数値：　NVL(数値, CHOOSE(ROWNO(テーブル５行固定),10,20,30,40,50))

![2021-12-26_14h50_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2584e046-adf4-567f-9085-f602d397fdf4.png)

# テーブル５行固定例２　日付と曜日設定

行ごとに、日付と曜日を設定してみます。

- テーブル５行固定： 5
- 番号：　ROWNO(テーブル５行固定)+1
- 日付：　DATE_ADD(開始日,ROWNO(テーブル５行固定),"day")
- 曜日：　SWITCH(DATE_FORMAT(日付,"ddd" ),<br>
"Sun","日","Mon","月","Tue","火","Wed","水","Thu","木","Fri","金","Sat","土","")
- 区分：　CHOOSE(ROWNO(テーブル５行固定),"A","B","C","D","E","F")
- 数値：　NVL(数値, CHOOSE(ROWNO(テーブル５行固定),10,20,30,40,50))

![2021-12-26_13h13_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a9103d5d-939e-3c63-89ab-e8509bfca2d0.png)

# テーブル行数可変例１

数値項目をテーブルの件算式に指定して、数値により行数を制御できます。

- テーブル： テーブル行数
- 番号：　ROWNO(テーブル)+1
- 区分：　"X-"&RIGHT("00"&(ROWNO(テーブル)+1),3)


![2021-12-26_15h11_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/be29f5b2-685f-2a8d-9b35-1120a08ddc66.png)

# テーブル行数可変例２　指定月の日数

指定月の日数分のテーブル行数を設定します。

- 指定月：　NVL(DATE_FORMAT(指定月,"YYYY-MM-01"),DATE_STARTOF("TODAY","month"))
    - 指定日から月の一日にします
- テーブル： DATE_ENDOF(指定月,"month","D")
    - 指定月の最終日で、テーブル行数を指定
- 番号：　ROWNO(テーブル)+1

![2021-12-26_15h47_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d3c07091-b48b-1ff2-1778-8eecf0514f0a.png)
これ余談なんですけど・・・情報量の単位はビットとバイトだけじゃないんです

#これ余談なんですけど・・・情報量の単位はビットとバイトだけじゃないんです

##data
　単なるデータ。
　実は「data」は複数形で、単数形は「datum」である。


#bus
　アドレスバス、データバスのバス。
　乗り物のバスと同じスペルである。


#cache memory
　現金のcashではない。
　cacheは探検隊の用語らしい。
　探検隊は、往路に食べ物を隠しておいて、復路でその食べ物を取り出して食べる。
　その隠し場所がcacheである。

#register
 CPU内の汎用レジスタのレジスタである。
 アセンブリ言語では、演算するときは汎用レジスタを用いる必要がある。
 スーパーのレジは、このレジスタを縮めたものである。

#store
　アセンブリ言語のストア命令のストアである。
　汎用レジスタの内容をメモリに格納する命令である。
　このストアはお店のストアと同じスペルである。

#execute
	プログラムを実行することである。
	実行ファイルのファイル拡張子は「exe」である。
	「死刑にする」、「処刑する」の意味もある。
	
#address
　アドレスバスのアドレスである。
　語源で考えると、ad(の方へ)+dress(まっすぐに）であるので、
　「発言する」、「演説を行う」などの意味もある。

#octet
　オクテットとは、情報量の単位の一つで、8ビットのことである。
　電気通信関係の技術者が主に用いる用語である。
　オクトは語源的に「8」を表す。
　
　現在1バイトも8ビットであるが、昔は人によってビット数が違っていた。
　通信では、送信側と受信側が同じ規則で通信しないといけないので、
　8ビットを表すオクテットという用語が生まれた。
　
　GitHubのキャラクターのオクトキャットは、
　タコ（octopus）と同じで足が8本である。
　　
　10月（October）も2か月ずれているが、８と関係がある。

#nibble
　ニブルとは、情報量の単位の一つで、4ビットのことである。
　1ニブルは16進数の1桁分である。
　1バイトは2ニブルである。

　nibbleは、「すこしずつかむ」ことである。
　「かむ」ことは、「bite」である。
React Navigation で Bottom Tabs Navigator が keyboardに連動するのを阻止


起きる現象は
android & TextInput & soft keyboard
の時、タブナビゲーション用のタブがキーボードの上部に引っ付いてくる、という厄介なやつです。
下記 qiitaリンクも参照あれ。 



Bottom Tabs Navigator　version6.Xではオプションでどうにかできるようになったようです。
**tabBarHideOnKeyboard: true**


```sample.tsx
import React from 'react';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';


export function sample() {
  const Tab = createBottomTabNavigator();

  return (
    <Tab.Navigator
      screenOptions={{
        tabBarHideOnKeyboard: true,
      }}
    >
      <Tab.Screen
        name='ScreenOne'
        component={ScreenOne}
      />
      <Tab.Screen
        name='ScreenTwo'
        component={ScreenTwo}
      />
    </Tab.Navigator>
  );
}
```

ドキュメントの記述がさりげなさすぎてつらい。
https://reactnavigation.org/docs/bottom-tab-navigator/

参考リンク
https://qiita.com/garmi/items/e530028c533cfe2b03b1
https://qiita.com/nitaking/items/bf13d5ce8e7ac812c0df
Google ColaboratoryでサクっとStreamlit（最小構成）

# ノートブック

>**colabでサクッとStreamlit（最小構成）**

https://colab.research.google.com/drive/1M7vXfYIeLed1u-awzd39u6PU-tCGNC0W

# 使い方
`メニューバー`から、

>`ランタイム`　**>**　`すべてのセルを実行`

https://qiita.com/gudapys/items/5d8a24292e6d5729ca45

そもそも`Google Colaboratory`の使い方は、という方はこちら。

https://qiita.com/gudapys/items/24a04b01438ea7e01678

# ソース

`pip`で`streamlit`をインストールします。

```bash:コードセル1
!pip install streamlit
```

Streamlitメインの処理を`/content/app.py`に保存します。

```python:コードセル2
%%writefile app.py
import streamlit as st
st.title("Hello World !")
```

`ファイルブラウザ`を起動、`エディタ`で`app.py`を開いておきます。

```python:コードセル3
from google.colab import files
files.view("/content")
files.view("app.py")
```

Streamlitをlocaltunnelのトンネルで起動します。

```bash:コードセル4
!streamlit run app.py & sleep 3 && npx localtunnel --port 8501
```

実行して、下のような出力が出るまで待ち、
`your url`に接続して`アプリ画面`をブラウザの別タブで開きます。
初回は`Click to Continue`ボタンを押して遷移します。


```
npx: installed 22 in 2.985s
your url is: https://****-******-**.loca.lt
```

:::note warn
https://****-******-**.loca.ltは公開アドレスです。
アドレスを知っている人は誰でも閲覧できます。
:::

# 終わり方

作業が終わったら、実行中の`セルの停止`と`セッションの終了`をします。
それをしなくても１２時間経てばノートブックのセッションは切断されるようなので
タブを閉じて離脱してもいいかもしれません。

# こんな使い方ができる

## Streamlit APIの動作確認をする。
colab画面右の`エディタ`から、

>`app.py`を編集　→　上書き保存 →　開いたアプリ画面（開いたhttps://***.loca.ltのページ）の更新

これだけで、動作確認ができます。

:::note info
簡単なコードであればStreamlitは起動しっぱなしでOKです。
:::

:::note info
本番実装する一歩手前のスペニットの動作確認なんかに使えると思います。
:::

例えば`st.dataframe`ってどう使うんだっけ？と思ったら

https://docs.streamlit.io/library/api-reference/data/st.dataframe

```python:app.py
import streamlit as st
import pandas as pd
import numpy as np
df = pd.DataFrame(
    np.random.randn(50, 20),
    columns=('col %d' % i for i in range(20)))
st.dataframe(df)
```

コピペしてapp.pyを上書き保存。
アプリページを更新するだけ。
すべて、colab上（ブラウザ上）で完結しています。
なので極論、スマホからでも動作確認やStreamlitを使ったWebアプリの開発ができてしまいます。


:::note warn
他ユーザの作ったノートブックをそのまま編集しても保存されません。
保存したい場合は、メニューバーから[ドライブにコピーを保存]を押してコピーします。
:::

:::note warn
また、ローカルに保存したファイルは、セッションが終了すると共に消えます。
コードセルに保存するか、googleドライブをマウントしてその中に作ると消えません。
:::
javascriptにcssを埋め込めず、style-loaderのバージョンを落としたら成功した話

今まで正常に動いていたプロジェクトで、`style-loader`をアップデートしたら`Swiper`のcssファイルが読み込まれなくなりました。

詳細な原因は不明ですが解決方法はわかったので備忘録として残します。

# エラー内容

webpack + babelによるコンパイルは問題ないのですが、ブラウザで表示すると下記のようなエラーが表示されます。

```
Uncaught TypeError: Cannot read properties of undefined (reading 'locals')
    at Object../node_modules/swiper/css/swiper.min.css (swiper.min.css?2abe:7)
    at __webpack_require__ (bootstrap:19)
    〜略〜
```

# エラーになる環境

- node v16.13.1
- style-loader v3.3.1
- css-loader v6.5.1

# 成功した環境

- node v16.13.1
- style-loader v2.0.0 ← ダウングレードした
- css-loader v6.5.1

# おわり

なぜstyle-loader v3系にするとエラーになるのかは不明です。
【Rails7】Railsで数値を３桁で区切る

Rails で数値を3桁区切りにする際のメソッド名が変更された。

### before

```ruby
to_s(:delimited) # TypeError: no implicit conversion of Symbol into Integer
```

### after

```ruby
to_formatted_s(:delimited)
```

変更の理由としては、Ruby 3.1では `to_s` のカスタム実装がない場合に高速化がされるが、Railsは多くのコアクラスで `to_s` をオーバーライドしており高速化が無効になってしまうため。

## 外部リンク

### 変更のPR

[Deprecate to_s(format) in favor of to_formatted_s(format)](https://github.com/rails/rails/pull/43772)

### 検索上位記事

https://qiita.com/wacker8818/items/cc213ba3ce72891dfb23

https://qiita.com/syohhe/items/1a8502e143ed273cfa23
PythonのPriority queue（優先度付きキュー）でpopすると最小値が取得できる

PythonのPriority queue（優先度付きキュー）には[heapq](https://docs.python.org/3/library/heapq.html)が利用できます。ヒープは二分木によって実現されますが、「親ノードの値が子ノードより大きい場合」と「親ノードの値が子ノードより小さい場合」の2つのパターンが考えられます。教科書的には前者が多いようですが、Pythonのheapqは後者。そのため**popすると最小値** が取得できます。ドキュメンテーションを引用すると下記の通り。

> The API below differs from textbook heap algorithms in two aspects: （中略） (b) Our pop method returns the smallest item, not the largest (called a “min heap” in textbooks; a “max heap” is more common in texts because of its suitability for in-place sorting).

「教科書とは違うよ」って書いてあるのが面白いですね。

## 利用方法

使い方はこんな感じ。

```python
import heapq

def test_heapq():
    a = [3,5,2,8,-2]
    heapq.heapify(a)
    v = heapq.heappop(a)
    assert v == -2
```

## ほかの言語は？

ドキュメントベースでさらっと調べたところプログラミング言語によって「最小値を取得する」のか、「最大値を取得する」のかけっこうバラバラな様子です。どちらを選択するかをどう決めているんだろう。それぞれPopすると…

### C++ std::priority_queue

最大値を取得。

https://cpprefjp.github.io/reference/queue/priority_queue.html



### Java PriorityQueue

最小値を取得。

https://docs.oracle.com/javase/jp/8/docs/api/java/util/PriorityQueue.html

### C# PriorityQueue

最小値を取得

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.priorityqueue-2?view=net-6.0

### Rust PriorityQueue

最大値を取得

https://docs.rs/priority-queue/latest/priority_queue/priority_queue/struct.PriorityQueue.html
VPCサンプルシステムを構築してみた

下記のようなVPCサンプルシステムを構築してみた
![routetable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398199/a0e0649f-b461-81c5-f81f-6977c954c486.png)

インターネットからアクセスされるWebサーバーのEC2インスタンスと
そのWebサーバーからアクセスされるDBのインスタンスからなるシステム
をAWS上に構築するとします。

そのようなシステムのVPCを構築するステップは、次の通りです。

ステップ１、VPCの作成
ステップ２、サブネットの作成
ステップ３、インターネットゲートウェイの作成
ステップ４、ルートテーブルの作成

詳しく構築手順は簡単な動画作成しました
下記をぜひを参照ください。
https://www.youtube.com/watch?v=5VvMDsUu_m0

AWSに趣味があれば、一緒に勉強しましょう。
showメソッドの実装

###詳細画面の表示

店舗や組織、ユーザー、投稿等の詳細画面を作成時によく使われるメソッドとして
『showアクションメソッド』が使用されます。

どのように使用するのか、ある組織の詳細画面を表示するという設定でコードの一例を紹介させていただきます。


###routes

```php:web.php
Route::get('/organization/{organization}', 'UserController@show')->name('organization.show');
```
/organization/{organization}にアクセスをすると、UserContoroller内のshowメソッドの処理が行われるルーティングが設定されております。名前付きルートで記載されている為、アクセス時にはView側に{{ route('organizaition.show') }}を記載する必要がある事が分かります。


###Controller
```php:UserController.php

namespace App\Http\Controllers;
use App\User;

        public function show($id)
    {
        $user = User::find($id);
        return view('detailOrganization', compact('user'));
    }
```

useにUserモデル(組織情報が登録されている)を使用すると定義されている為、User::find($id)の返り値はUserモデルのオブジェクトが返されます。


###View

```php:detailOrganization.blade.php
<p>組織名：{{ $user->name }}</p>
<p>電話番号：{{ $user->tell }}</p>
<p>住所：{{ $user->address }}</p>
<p>外観図：<img src="{{ $user->image }}" alt=""></p>
```
組織の詳細画面に遷移すると、nameカラムから組織名、tellカラムから電話番号、addressカラムから住所、imageカラムから外観図が取得されブラウザに表示される。



```php:index.blade.php
<a href="{{ route('organizaition.show') }}"></a>
```

組織の詳細画面にアクセスを行う為、今回は一覧画面に名前付きルートを使用したリンク先に遷移するコードを記載しました。(ヘッダーやメニュータブに設定でもOK)
ちなみにURLの後ろに『/organization/1』、『/organization/2』、『organization/3』と直接URLに入力をしても詳細画面が表示され確認する事ができます。
timezoneデータベースをPHP on CentOS環境で使えるようになるまで

今日、[PHPのライブラリ(geo-timezone)](https://github.com/minube/geo-timezone)を使って、緯度経度からTimezoneを拾えるようにしました。

かなりニッチな内容なので、あまり多くの人に役に立たないかもしれませんが、
自分がまた同じことをやる時に、手順を覚えている自信がゼロだったので記録を残します。

また、ライブラリがDebian系での利用が想定されているようで、そこでも少し躓いたのでポイントをメモします。


## まず、composerでrequire
お決まりの作業です。

```
composer require minube/geo-timezone
```

## 次に、vendor配下のライブラリディレクトリ内で複数の作業

`vendor/minube/geo-timezone/bin`
に行きます。

そこで、 `compile-geos.sh`を実行すれば良い、というので、
実行するも何かがうまくいかなくてしばし悩みました。

ふとshの中身を読んでみると、
`apt-get install php7.0-dev && ....`
などと書かれていて、Debian系向けとわかり、躓きポイント判明。

apt-getしようとしている`php7.0-dev`から`php7.0-mbstring`までをyumすると良いかと思いますが、
自分の環境では既に導入済みなのでパスすることに。

`curl -s -O http://download.osgeo.org/geos/geos-3.6.1.tar.bz2 `
の行からを実行すると、無事installが進みました。

その次の
`git clone https://git.osgeo.org/gogs/geos/php-geos.git`
も実行して、無事install終了（っぽい）。


## .soファイルを.iniファイルで読み込ませる？
`README.md`には.soファイルを.iniファイルで読み込ませるべし、と書いてあるのですが、
自分の環境では不要でした。
動いたし、ま、いっかということで。


## データベース作成コードを走らせてみる

Githubのリポジトリページにある[解説文](https://github.com/minube/geo-timezone#usage)の通り、
UpdaterData()というメソッドを走らせてみましたが、なぜか途中で止まる🤔

`ini_set('memory_limit', '-1');`
を設定してやると無事進みました。

自分は今、少し懐かしいVagrant環境でこの作業を実行しているのですが、
「メモリがexhausted！」と怒られるので、潔くメモリリミット撤廃。
ローカルなんでキニシナイ。


で、最終的に、以下のようなコードを書き、CLIから直接PHPコマンドで叩きました。

```
use GeoTimeZone\UpdaterData;

include_once ('../../vendor/autoload.php');

ini_set('memory_limit', '-1');

$updater = new UpdaterData("./data/");
$updater->updateData();
```

READMEには「終わるまで2~3時間かかるよ」なんて恐ろしいことが書いてあります。
「マジかよ」と呟きながら、シューシュー言うCPUの音を聞きながら、この備忘録を書いています。

## 終わりに

このライブラリ、元は[node-geo-tz](https://github.com/evansiroky/node-geo-tz)とか、[timezone-boundary-builder](https://github.com/evansiroky/timezone-boundary-builder)がベースになっていて、PHP向けにwrapperを作ってくださった様子。　素晴らしい。
これで（きっと）無事、世界のTimezoneを、サマータイムとか歴史的経緯とか国内に複数Zoneを持つ状況とか気にせず、しっかり取得できそうです。
数々のcontributorの皆様、ありがとう！

あとは、DBの完成を待つばかり...

（最新版のDBを時々作り替える必要があるよ、とか恐ろしいことが書いてあるけど、見なかったことにしたい）
KUSANAGI 9 for Vagrant がリリースされたので最速で構築する

KUSANAGI 9 for Vagrant がリリースされました。

KUSANAGI 9 for Vagrant
[https://kusanagi.tokyo/kusanagi9/cloud/kusanagi-for-vagrant/](https://kusanagi.tokyo/kusanagi9/cloud/kusanagi-for-vagrant/)

KUSANAGI 9 を試してみたいけれども、とりあえず動かせる環境を見てみたい人のために、最速で WordPress 環境構築する Vagrantfile 一式を準備しました。

## KUSANAGI 9 for Vagrant の使い方

公式ページに説明があります。
[https://kusanagi.tokyo/kusanagi9/cloud/kusanagi-for-vagrant/](https://kusanagi.tokyo/kusanagi9/cloud/kusanagi-for-vagrant/)

が、今回はもっとかんたんに環境を準備していきます。

### 1. 環境構築ファイル一式をダウンロードして展開

下記 Zip ファイルをダウンロードし、展開してください。

[https://github.com/3rd-cloud/3rd-cloud/raw/main/Tutorial/KUSANAGI 9 for Vagrant/3. WordPress 環境作成/download.zip](https://github.com/3rd-cloud/3rd-cloud/raw/main/Tutorial/KUSANAGI%209%20for%20Vagrant/3.%20WordPress%20%E7%92%B0%E5%A2%83%E4%BD%9C%E6%88%90/download.zip)

### 2. Vagrant 起動

`Vagrantfile` ファイルがあるディレクトリで PowerShell を開き、下記コマンドを実行してください。

```bash
vagrant up
```

ワタクシおすすめサーバー構成で自動セットアップされます。アップデートも自動適用されます。

完了するまでしばらくお待ち下さい。

また、PowerShell のウィンドウは後で使うのでそのままにしておいてください。

### 3. hosts ファイルに追記

今回の Vagrantfile で起動する仮想マシンには、`192.168.33.10` を割り当てています。
また、自動セットアップされる WordPress サイトの FQDN は、`www.vagrant.local` を設定しています。
ブラウザから WordPress セットアップ画面を表示させるため、`hosts` ファイルに設定を追記してください。

```bash
192.168.33.10 www.vagrant.local
```

### 4. ウェブブラウザで `www.vagrant.local` を開く

[http://www.vagrant.local/](http://www.vagrant.local/) を開き、WordPress セットアップ画面が表示されていれば完了です。

### 5. KUSANAGI 9 サーバーに SSH 接続

上記の 2. で開きっぱなしにしていた PowerShell で、下記コマンドを実行するとサーバー内に入れます。

```bash
vagrant ssh
```

## ファイルの保管場所

今回の記事で使用した元ネタファイルは、下記においてありますのでご活用ください。

[https://github.com/3rd-cloud/3rd-cloud/tree/main/Tutorial/KUSANAGI 9 for Vagrant/3. WordPress 環境作成](https://github.com/3rd-cloud/3rd-cloud/tree/main/Tutorial/KUSANAGI%209%20for%20Vagrant/3.%20WordPress%20%E7%92%B0%E5%A2%83%E4%BD%9C%E6%88%90)
next.jsの環境構築

node.jsを入れる

node.jsの導入の仕方

参考にした動画

https://www.youtube.com/watch?v=wtb0V6a4FXQ

https://www.youtube.com/watch?v=lhfNe6xmlLg

デスクトップにフォルダを作成する
仮にmyappと名前にする

ターミナルを起動する

myappまでディレクトリを移動する

````Mac:terminal
npx create-next-app
````

プロジェクト名を指定する next-appとかにしてみても良い

作成されたフォルダをVScodeで開く

VScodeのターミナルを開く

作成したプロジェクト名まで cd で移動する

````VScode:terminal
npm run build
````

````VScode:terminal
npm run start
````

表示されたlocalhostにアクセスしてサイトが表示されていれば成功

````command:terminal
サーバーを閉じる
コントロール　+ c 
````
通常はnpm run devで編集しながら確認できる

````VScode:terminal
npm run dev
````
参考にした動画

https://www.youtube.com/watch?v=YoIQ_FIBlYY
歴だけ長い俺が応用情報技術者試験にぎりぎり合格した

年も明け、昼まで寝る生活にも飽きたため、久しぶりに記事を書くことにした。

インフラの技術とかではなくて何番煎じかの資格の話で恐縮だけど、どこかの誰かの役に立てばと思う。

#はじめに
取得時の自分のキャリアはこんな感じ

~~~
・エンジニアと呼ばれて約5年
・CCNA、LPIC level2取得済み(どちらも失効済み)
・サーバー(windows,Linux)構築やネットワーク構築が仕事のメイン(今も昔も)
・1度個人でdjangoを使ってwebサービスを作ろうとしたが断念
・技術以外では採用や教育やデザイン()など薄く広くやっている
~~~

#勉強方法
##勉強期間
本格的に勉強を始めたのは試験を受ける年の8月くらいから

8月に初めて平日は1~2時間くらい、土日も3~4時間くらいは欠かさずやっていた

最初は何もわからな過ぎて辛かった・・・

##勉強方法
勉強で使ったのは過去問道場だけだった

[応用情報技術者過去問道場](https://www.ap-siken.com/apkakomon.php)

最初は本とかも買ったりしたけど、自分は本を読みながらの資格勉強は合わないと思い、速攻メルカリ行きとなった。

主に以下のような進め方で試験本番に臨んだ

* 8月　午前問題をひたすら解く
* 9月　午前問題は模擬試験を1日1回解く、午後問題の過去問を解いていく
* 10月　見直しながら9月と同じ内容で勉強

勉強がすべてパソコン上で完結できるのは非常にありがたい。
過去問でわからないことがあればそのままググり、内容を読み解いていくことができるので、割とスムーズにできたと思う。

(ただ演算子は正直いまだによくわかってない)

#試験当日について
技術者試験は早起きとの勝負という噂を聞いていたがあながち間違いではないと思う。

試験会場最寄りの駅に降りると似たような雰囲気の人も多く若干緊張する。

早起きは辛くても、なるべく早く現地には行った方がよいと思う。

今回俺が午後問題で選んだのは以下の項目である。

* 情報セキュリティ(必須)
* システムアーキテクチャ
* ネットワーク
* サービスマネジメント
* システム監査

あまり技術分野を選んでいなくて恥ずかしいところでもある。

当日の試験結果としては下図のものとなった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/0f166449-e6b6-474d-69bd-c50dbb101737.png)

兎にも角にも何とか合格はできたのでよしとする。

#まとめ
勉強を継続すればいつかは取れると思う。

また運要素が大きいとも思う。
試験前日に過去問道場の模擬試験で間違えた問題が、そのまま本番でも出たものがあったため、これはかなり率直にラッキーだった。

また今回は試験が終わった後、絶対落ちたと思ったが何とか掬われた感がある。
~~オフィスに透明バッグ持ち込むセキュリティとか何年前流行ったセキュリティだよ~~

応用情報を取れたらスペシャリスト以上の試験は、2年間は一部の問題が免除で受けられるらしいので、
次はネスぺを次回の春に取りたいと思う。

以上、駄文読んでいただきありがとうございました。
【MUI】LoadingButtonの色を変える方法【styled-components】

<h2>LoadingButtonの色を変える方法</h2>
沼にはまったので、メモ。

LoadingButtonのcolorに直接色を指定しても、うまく変化せずThemeProviderとかを調べましたが、あまりうまくいかず最終的にstyled-componentsで色を付けるという原始的な方法で解決したので、ここに記録します。

<h2>解決方法</h2>

```react:LoadingButton.js
import React, { useState } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import SendIcon from '@mui/icons-material/Send';
import LoadingButton from '@mui/lab/LoadingButton';
import { COLORS } from "../style_constants";
import { styled } from '@mui/material/styles';

const useStyles = makeStyles((theme) => ({
  button: {
    margin: theme.spacing(1),
  },
}));

const CustomButton = styled(LoadingButton)({
  backgroundColor: COLORS.MAIN_COLOR,
  opacity: 0.9,
  "&:hover": {
    backgroundColor: COLORS.MAIN_COLOR,
    opacity: 1,
  },
});

export function LoadingButton({ onClick, btnLabel }) {
  const classes = useStyles();
  const [loading, setLoading] = useState(false);

  function handleClick() {
    setLoading(true);
    onClick();
  }

  return (
    <div>
      <CustomButton
        size="large"
        variant="contained"
        color="primary"
        onClick={handleClick}
        loading={loading}
        loadingPosition="end"
        endIcon={<SendIcon />}
        className={classes.button}
      >
        {btnLabel}
      </CustomButton>
    </div>
  )
}

```

結果(デフォルトの色以外の色に変更できた)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/54f20c07-c3ae-87e4-4726-3d247a4bc4d7.png)


<h2>参考</h2>

https://mui.com/components/buttons/#loading-button

https://mui.com/styles/basics/#styled-components-api

https://developer.mozilla.org/ja/docs/Web/CSS/opacity