OmniAICreator/Qiita-1.07M huggingface dataset:
Webpacker::Manifest::MissingEntryErrorの解決方法

## 【開発環境】
Ruby 2.7.5
Rails 6.1.7.6

### どういう時にエラーが発生したか
1. Railsで新規アプリケーションを実装した際、users_controller.rbを新規作成
1. indexアクションを定義後、`app > views > index.html.erb`を新規作成
1. rails sコマンドで立ち上げた際に、以下のエラーが作成した。

※以下のようなエラーのキャプチャ
![スクリーンショット 2023-10-02 6.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568360/bb86f239-2f7a-660e-b3a2-3533b8a1297a.png)

### エラー解決のためにやったこと
[Webpacker::Manifest::MissingEntryErrorが発生]https://qiita.com/kndknd/items/18187f1c2199651d08d5
上記のサイトでは以下の2コマンドでOKとのこと
```
rails webpacker:install
rails webpacker:compile
```
だが、rails webpacker:compileでエラーになってしまった。
調査すると、こちらのパッケージ@babel/plugin-proposal-private-property-in-objectがインポートされていますが、package.jsonに記述がないとエラーになってしまうとのこと

```
Compiling...
Compilation failed:
warning ../../package.json: No license field
node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error: [BABEL]: --- PLACEHOLDER PACKAGE ---
This @babel/plugin-proposal-private-property-in-object version is not meant to
be imported. Something is importing
@babel/plugin-proposal-private-property-in-object without declaring it in its
dependencies (or devDependencies) in the package.json file.
Add "@babel/plugin-proposal-private-property-in-object" to your devDependencies
to work around this error. This will make this message go away.
 (While processing: /home/ec2-user/environment/sample/node_modules/@babel/plugin-proposal-private-property-in-object/lib/index.js)
    at Object.<anonymous> (/home/ec2-user/environment/sample/node_modules/@babel/plugin-proposal-private-property-in-object/lib/index.js:28:7)
    at Module._compile (/home/ec2-user/environment/sample/node_modules/v8-compile-cache/v8-compile-cache.js:192:30)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1250:10)
    at Module.load (node:internal/modules/cjs/loader:1074:32)
    at Function.Module._load (node:internal/modules/cjs/loader:909:12)
    at Module.require (node:internal/modules/cjs/loader:1098:19)
    at require (/home/ec2-user/environment/sample/node_modules/v8-compile-cache/v8-compile-cache.js:159:20)
    at loadPartialConfigAsync (/home/ec2-user/environment/sample/node_modules/@babel/core/lib/config/index.js:34:85)
    at Object.<anonymous> (/home/ec2-user/environment/sample/node_modules/babel-loader/lib/index.js:126:26)
```
package.jsonに以下の設定を追加する
```
  "devDependencies": {
    "@babel/plugin-proposal-private-methods": "^7.18.6",
    "@babel/plugin-proposal-private-property-in-object": "^7.21.0",
    "webpack-dev-server": "^3"
  }
```

npm installを再度実行する
```
npm install
```

rails webpacker:compileを再度実行する
```
rails webpacker:compile
```

### エラーが消えてページを表示することができた！

![スクリーンショット 2023-10-02 6.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568360/c375e6d1-565e-6a11-c8ef-e6bd2fb687ff.png)

### 【まとめ】　エラー解決にあたり感じたこと、考えたこと
エラー文を見て解決できてよかったと思いましたが、英語の読解力と検索力を上げていきたいと思いました。まだまだ勉強中ですが、Webpackの理解を深めていきたいと思いました。
何かご指摘がありましたらお願いします！ここまで読んで下さり、ありがとうございました！
Macで覚えたショートカットまとめ（随時更新）

## 目的
- シチュエーションに応じて、使えるショートカットをまとめていきます。
- あくまでも自分用の備忘録としてまとめるのが先決であるため、自分が既に知っていて、身についたチョーとカットについては一旦、省略し、掲載しません。ご了承ください。


## アプリ起動中に使えるショートカット

### ***`command` + `H`***
- アプリを隠す。
- 起動中のアプリを開いている状態で、これを実行すれば、アプリを落とさずに、隠してホーム画面だけの状態にできる。


### ***`command` + `Shift` + `H`***
- 例えば、Chromeでブラウザを利用している時にこれをやると、GoogleのホームもしくはChromeのホームページに移動する。
- 編集中のページでこれをやってしまうと危ないので注意。


## ホーム画面（デスクトップ）で使えるショートカット
ホーム画面にいる時にいる際に使用するショートカットキーについて、新たに覚えて便利だと感じたものを掲載していきます。

### ***`command` + `Shift` + `H`***
- `Finder`の`ホームディレクトリ`が開く
- これはめちゃ便利❗️
- ちなみに`command`+`N`でもFinderは開くが、最近使った項目というフォルダが表示されるので、そこからホームディレクトリに移動させるのが少し面倒。


### ***デスクトップのファイルを`非表示`にする***
- こちらの記事を参考にすれば、デスクトップに散らかったファイル・フォルダを非表示にできる。
https://pc-karuma.net/mac-finder-createdesktop-false/


### ターミナルで使えるショートカット



###
書込データの出力先をExcelの代わりにJsonファイルにする

## 書込データの出力先をJsonファイルにする
![Automate_logo (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/ed3662d5-4ad1-fefb-3fe0-a3a70a2953ae.jpeg)
RPAをやっていてもPowerAutomateを触るまで知らなかったJsonファイル。
でも、使ってみると便利なので今日はその紹介をしようと思います。

### Jsonファイルって何？-ざっくりとした解説

JSONファイルは、
【データ交換の時などに使うファイルのこと】です。
よく会社で.csvファイルや.xlsxファイルで毎日配信されるファイルがあるでしょう？
そういった時に使う、.jsonという拡張子のファイルのことです。


### なんでJsonファイル？Excelやcsvじゃダメなの？
PowerAutomate(クラウドフロー)のExcelって【一つのアクションで完結できないことが多い】です。
テーブルじゃないと読み込めなかったり、
データ数が多いと、何回かに分けでデータを出させたりとかで
データを取り出すことはできますが、時間や、アクションの数が増えますね。
それは、HTTP要求の数が増えてしまい、システム費と見合わなくなる…といったことになりやすいのです。

### 1.PowerAutomatefordesktopでJsonファイルを作る
PowerAutomateのJsonファイルの作り方は簡単なので、先にDesktopについて説明します。

まずデータテーブルを作りましょう。なんでもいいんですが、
せっかくですからPowerAutomateforDesktopのバージョンでも取得しましょう。
https://learn.microsoft.com/en-us/power-platform/released-versions/power-automate-desktop#all-power-automate-desktop-versions
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/9f9c5711-06ac-d23a-1945-97bbd845207c.png)
こんなかんじでDataFromWebPageにデータを取得します。
この辺は、割愛しますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/61d0af51-c069-1682-a43f-ffc9feb851cd.png)
その下にJsonに変換するための下地を変数の中に作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/c21ba06d-020d-21e2-ac33-4002f2add4cf.png)
```ruby:変数outputsJsonの中身
%{{ }}%
```
次に先ほど用意した変数名outputsJsonの中に['DataFromWebPage']を追加し
値にDataFromWebPageを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/330e7029-2baf-7300-6921-c6471714085a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/929433b0-fe13-a7d2-e245-27efd37154dc.png)
※変数名の変更を忘れないでね！でないとエラーになったり後続アクションで出てきません。

次に、上記で設定した変数outputsJsonをカスタムオブジェクトをJsonに変換アクションに入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/73b01bc5-1c59-fa46-d5b1-5de6f4cba2cf.png)

最後にテキストをファイルに書き込むアクションを使用してJsonファイルを作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/1a6618b4-4103-004d-f775-1e402cf3ae09.png)
１.→.json拡張子を忘れずにつけましょう
２.→先ほど作成したカスタムオブジェクトを入れましょう
３.→UTF-8(バイトオーダーマーク無し)を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/52459542-f3bd-940a-d017-dd224f561691.png)
きちんとデータが作成されました。

### 2.PowerAutomateでJsonファイルを作る

PowerAutomateの場合はもっと簡単で、対象ファイルを選択→作成に入れて、最終的にファイルの作成でJsonファイルを作成することができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111714/8034bfde-4a54-5ae9-16f8-ff3c30a35993.png)



```ruby:ファイルの作成のファイルコンテンツの中身
outputs('作成')
```

### 最後に


Jsonファイルを作ってしまえば、以降はPowerAutomateやDesktopで制限なく読み込んだりでき
また、PowerQueryを使用してJsonを読み込めばExcelやBIでも操作も可能です。

それはPowerAutomateで出るExcelアクションのありがちなエラーへの回避策にもなるでしょう。
以上が、書き込みデータの出力先をJsonファイルにするためのJsonファイルの作成方法の説明でした。
java配列の添字の最大値

# 配列の添字の最大値
processing４で配列の添字に大きな値を入れるとエラーになるので、限界を探す。

以下のコードは文法エラーが起きない
```java
int[] array = new int[2147483647];
```
しかし、以下のコードは文法エラーが起きる

```java
int[] array = new int[2147483648];
//The literal 2147483648 of type int is out of range 
```

この数字はint型の最大値であり、32bit（もしくは4Byte）精度の最大値ともいえる。
(2^32)/2 = 2147483648
（マイナスも使うから半分）

だが、実行してみると、エラーになる。
```java
int[] array = new int[2147483647];
//OutOfMemoryError: You may need to increase the memory setting in Preferences.
```
エラーにならない最大値は、2小さい2147483645。
```java
int[] array = new int[2147483645];
```

processingの設定でメモリサイズを大きくしても効果なし。
javaのVMの制限なのか、macの制限なのかよくわからない。

メモリをどのぐらい使うのかということについては、byte[2147483648]のサイズは2GBなので、int[2147483648]だと8GB消費するはず・・・だが、macはメモリを自動で圧縮するので、中身を使っていたり使っていなかったりで、実使用メモリがどうなるかよくわからない。

# 解決策？
とりあえず、これよりも大きな数字を使いたい場合は、2次元配列にする必要がある。
```java
int[][] array = new int[2147483645][256];
```
この1行だけなら実行はできたが、2TBのメモリを使うはずなので、おそらく使い物にはならないだろう。※このPCは32GB搭載機。
これ以上を狙うなら、スパコンのような搭載メモリが尋常ではない環境とか、SSDをメモリのように使うソフト入れるとか、自分で、ファイルアクセスで、そういう機能をつけるとか。いずれにしても面倒そうな環境を整える必要がある。もちろんプログラムを改良する必要が生じる。

# 結論
java仕様でlongの数値を添え字に使えないわけだが、java言語仕様として使えたとしても、そんな大容量メモリを搭載してないだろうから、いらないだろう、ということか。必要なら、二次元配列にすれば、いいだろ。という設計者の考えと理解した。
Golangのパッケージではまってしまった　メモ

Go言語のパッケージの勉強していたところ、main.goからその下の配下のgoファイルをインポートできずにエラーが発生しました。
検索してググり、ググり・・
分からなくて、ChatGPT先生に相談したり・・・。
Goのバージョンによりライブラリ配下importのパスなどの設定が異なることが原因らしい。
GOPATHの配下にディレクトリを作りました。
C:\Users\ユーザー名\goの下にディレクトリを作成して
そこにmain.goファイルを作りその下にディレクトリを作り、その中に読み込みたいgoファイルを作成。

そして初期化
````
PS C:\Users\ユーザー名\go\awesomeProject> go mod init awesomeProject
go: creating new go.mod: module awesomeProject
go: to add module requirements and sums:
        go mod tidy
````
ディレクトリ構成はこんな感じです。
![スクリーンショット 2023-10-02 045219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/928107/791e1c15-5c6b-9887-240e-ae25680630db.png)

正常に動作しました。

出来てみれば、単純なのに、苦労しました。
ポインターより難しかった。

パッケージを作る時は必ずGOPATHの配下にディレクトリを作り作業しないといけないのですね。
【UnrealEngine】オデ、セーブ実装したい

オデは、セーブ、ロード、したい。
5分、ステップ3つ、実装おわり。

### (1/3) ブループリントクラスからSaveGameをつくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/83b9c4ac-035c-16cc-3b76-52e190547f15.png)

### (2/3) 作ったSaveGame内に、保存したい値の変数をつくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/e3fc0bf7-bb97-2ba4-ac8f-69862128dd9e.png)

### (3/3) ゲームインスタンスのEvent Initに以下のノードをかく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/85b4a6ef-44de-40ad-1f36-9b45530cdb1d.png)

### ゲームインスタンスからセーブゲーム内の変数を変えたり取得したりできるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/cf293e18-5156-fbd8-6527-eeba5bca6d61.png)

### 変更した値を保存したいときは以下を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/ebde8045-84e4-842f-c96f-69995253e71f.png)

## 参照

http://kagring.blog.fc2.com/blog-entry-180.html

https://hogetatu.hatenablog.com/entry/2015/07/26/003427

##### ※本記事は、とりあえず動かしたい人向けです。詳しい説明は他の方のブログや公式ドキュメントを参照してくださいmm
エラー文を読む上で覚えておきたい英単語

## はじめに
開発中にエラーに直面した時にちゃんとエラー文読んでますか？
エラー文って英語だしよくわからんから読む気がなくなりますよね
だから脳死でエラー文をコピペしてChat GPTにぶん投げちゃいますよね
まぁそれで解決するならいいんですけど。。。

でもエラー文で使われる英語は限られているので
初心者の内から覚えちゃいましょう。後々楽になると思います。


## エラー文で頻出する英単語
JavaScriptを想定していますがその他の言語でも似たようなもんだと思います。
| 英単語 | 意味 |
| ---- | ---- |
| valid | 有効な|
| invalid | 不正な|
| expected | 予期した 期待された　|
| unexpected | 予期しない　|
| defined | 定義された |
| undefined | 未定義の　|
| declared | 宣言された　|
| undeclared | 未宣言の　|
| reference | 参照　|
| require | 必要とする　|
| deprecated | 非推奨な　
| expired | 期限切れの　|
| apply | 適用する |
| deny | 拒否する　|
| permission | 許可　|
| range | 範囲　|
| missing | 見当たらない |
| expression | 式　|
| statement | 文 |
| operator | 演算子　|
| operand | 被演算子（オペランド）　|
| initializer | 初期化子（イニシャライザー）　|
| mutable | 変更可能な　|
| immutable | 変更不可能な　|
| iteration | 繰り返し　|
| iterable | 繰り返し可能な |
| assigment | 代入　|
| constraint | 制約　|


上記の単語を覚えておけば
英語が苦手な人でもChat GPTに頼らなくても
エラー文が何を教えてくれているのかがわかる様になると思います。


## 最後に
新人プログラマーのための　エラーが怖くなくなる本

https://www.amazon.co.jp/%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E5%B8%B0%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%EF%BC%81-%E6%96%B0%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E6%80%96%E3%81%8F%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B%E6%9C%AC-%E6%A1%9C%E5%BA%AD-%E6%B4%8B%E4%B9%8B/dp/479818067X

この本に他にもエラーについての基礎知識がたくさん載ってます
新人はみんな読んだほうがいい良本でした。
2023/10/2主にITとかセキュリティの記事

理想のセキュリティー対策は「ゼロトラスト」だが、現実は長い道のり(9/28)
https://active.nikkeibp.co.jp/atcl/act/19/00506/080700004/

偽のマイクロソフト社員にPCを遠隔操作されて金銭を騙し取られる詐欺発生(9/30)
https://ascii.jp/elem/000/004/160/4160128/?rss

「フィッシング」詐欺気をつけて　佐賀県警、相談増加で注意喚起(9/30)
https://news.yahoo.co.jp/articles/ecd41ed2a3d8fd469d68c3cc785502441f2e55d8

＜社説＞デジ庁への指導／個人情報の重み自覚せよ(9/28)
https://www.kobe-np.co.jp/opinion/202309/0016858480.shtml

注意！「トロイの木馬に感染した」は詐欺かも！新潟村上市の70代男性、ウイルス駆除名目で7万円被害(9/30)
https://www.niigata-nippo.co.jp/articles/-/289964

中古「検温カメラ」から顔画像流出…その原因、個人情報・悪用されるリスクは？ 専門家が解説(9/30)
https://news.mynavi.jp/article/20230930-2782109/

「AI失業」米国で現実に　松原実穂子さんらとThink!(9/30)
https://www.nikkei.com/article/DGXZQODL2967N0Z20C23A9000000/

防げサイバー犯罪、情報技術の競技会を京都府警が初開催　優勝した部署は(9/30)
https://www.kyoto-np.co.jp/articles/-/1120307

名古屋港障害、ウイルス対策不十分　国交省が再発防止策(9/29)
https://www.nikkei.com/article/DGXZQOUA297U40Z20C23A9000000/

個人情報保護委員会からの行政指導への対応について 中国電力(9/29)
https://www.energia.co.jp/press/2023/14966.html

日本はスパイ天国か　人気経済アナリスト・馬渕磨理子さん「情報こそ最も価値ある通貨」意識が低いと警鐘(9/30)
https://news.yahoo.co.jp/articles/ffc82cb4d46bf8b8ae3daf2b5a46bd8857aed9fd?source=rss

「台湾有事」への備え　大量避難民と大規模通信障害　江崎道朗(9/30)
https://www.sankei.com/article/20230930-ATKDVYBV2ZAIBIKSC7ZJWXVENU/?outputType=theme_weekly-fuji

シスコの複数製品に緊急の脆弱性、CISAが警告(9/30)
https://news.mynavi.jp/techplus/article/20230930-2781442/

QRコードを含むメールに注意、フィッシングメールに悪用される可能性あり(9/30)
https://news.mynavi.jp/techplus/article/20230930-2781154/

ビデオコーデック「VP8」に関連するゼロデイ脆弱性が発見されChromeやFirefoxがセキュリティアップデートを実施、すでに悪用された事例も(9/29)
https://gigazine.net/news/20230929-google-fixes-zero-day-exploited-chrome/

中国の脅威グループ「BlackTech」が日米の政府・企業を攻撃、FBIや警察庁が警告(9/29)
https://news.mynavi.jp/techplus/article/20230929-2780950/

中国のハッカー集団がMicrosoft Outlookのアメリカ国務省アカウントに不正アクセスし約6万通のメールを盗んだことが発覚(9/29)
https://gigazine.net/news/20230929-chinese-hacker-microsoft-us-state-department-mail/

BPaaS(ビーパース)とは？SaaSやBPOとの違いやメリット・デメリットを詳しく解説(9/29)
https://digital-shift.jp/flash_news/s_230929_1

AWS ParallelCluster 3.7.1 Ubuntu 22.04 で Mountpoint for Amazon S3 を利用できないときの確認ポイント(9/30)
https://dev.classmethod.jp/articles/troubleshooting-s3-mountpoint-on-aws-parallelcluster-371-ubuntu2204/
【備忘録】Railsのheadメソッドでよく使うステータスコードと対応するシンボル


:::note info
Railsのheadメソッドについて。
headメソッドは、応答ステータスとヘッダのみを出力してくれるメソッド。以下で各ステータスコードごとの意味とシンボルを表で整理しました。
:::

| ステータスコード | HTTP コード | 意味 |
|:---------------|:-----------|:-----|
| `:ok`               | 200         | 成功の意味。主にGETリクエストの成功を示すのに使用されます。 |
| `:created`          | 201         | リソースの作成が成功したことを示す。主にPOSTリクエストの成功を示すのに使用されます。 |
| `:accepted`         | 202         | リクエストが受け入れられたが、まだ処理されていないことを示す。 |
| `:no_content`       | 204         | リクエストは成功したが、返す内容がないことを示す。主にDELETEリクエストや、PUT/PATCHリクエストの成功を示すのに使用されることが多い。 |
| `:moved_permanently`| 301         | リソースが恒久的に新しい場所に移動したことを示す。 |
| `:found`            | 302         | 一時的なリダイレクトを示す。 |
| `:see_other`        | 303         | POSTリクエストの後にGETを使用して応答を取得するためのリダイレクトを示す。 |
| `:bad_request`      | 400         | クライアントのリクエストが不正であることを示す。 |
| `:unauthorized`     | 401         | 認証が必要、または失敗したことを示す。 |
| `:forbidden`        | 403         | 認証は成功したが、アクセスが許可されていないことを示す。 |
| `:not_found`        | 404         | リクエストされたリソースが見つからないことを示す。 |
| `:unprocessable_entity` | 422    | リクエストは適切であるが、何らかの理由で処理できないことを示す。主にバリデーションエラーを伝えるのに使用される。 |
| `:internal_server_error` | 500   | サーバ内部のエラーが発生したことを示す。 |
Kindle Unlimitedで読めるデータサイエンス・AI・ビジネス系の本たち【2023年10月】

# 自己紹介
短めに。データサイエンティスト✖︎コンサルを目指して日々勉強している慶應義塾大学4年生です。
X(Twitter)やってます。（<a href='twitter.com/A7_data'>@A7_data</a>)詳しい経歴とかは他の記事を見てね。

# 本記事はNoteに移行しました

https://note.com/a7_data/n/n1f337879ce89
R言語　環境作成

# 必要なもの
- conda

# bashスクリプト
## condaでの仮想環境作成
```R
conda create -n venv python=[好きなversion] -y
conda activate venv
```
## Rで用いるパッケージなど
```R
conda install -c r r r-irkernel r-essentials rstudio -y
```

## jupyterの設定
```
conda install -c conda-forge jupyter_contrib_nbextensions jupyter_nbextensions_configurator -y
jupyter contrib nbextension install --sys-prefix
jupyter nbextensions_configurator enable --sys-prefix
```
has_many, belongs_toでインスタンスメソッドを定義している件について

# はじめに
初めまして！　
私はRUNTEQでRuby on Railsをメインに勉強しています。
今回は私が関連付け（アソシエーション）の学習の過程で見落としてしまったが故に、後に苦労したことについて記録しておこうと思い、本記事を執筆しています。

# 本題

早速ですが、今回お伝えしたいのは次のようなことになります。

**関連付けの際、has_manyやbelongs_toで指定したものはインスタンスメソッドとして使える。**

例えば、一人のユーザーが複数のポストを投稿できるようにするという状況を仮定します。モデルにはUserとPostがあり、両者を関連付けします。関連付けには色々と手続きが必要ですが、その中でmodelsディレクトリには次のように書くでしょう。

```Ruby:app/models/user.rb
has_many :posts, dependent: :destroy
# dependent: :destroyは本記事では重要ではありません。
```
```Ruby:app/models/post.rb
belongs_to :user
```
このとき、`posts`, `user`はそれぞれインスタンスメソッドとして使えるということが今回伝えたいことです。もう少し厳密に言うと、ここでは`posts`はUserクラスのインスタンスに対して使うことができるインスタンスメソッドで、`user`はPostクラスのインスタンスに対して使うことのできるインスタンスメソッドです。

インスタンスメソッドについてはこちらを参照
https://qiita.com/moshi1121/items/c74d350bab32113d4f3d

# インスタンスメソッドとして使えるとはどういうことか
例えば、idが1のユーザーが投稿したポストを取得したいとき、通常はこのように書くでしょう。
```Ruby
@user = User.find(1) #　idが1のユーザーを取得
@posts = Post.where(user_id: @user.id) #　idが１のユーザーのポストを全て取得
```
上記のことは、`posts`をインスタンスメソッドとして定義しているときは次のように書くことができます。
```Ruby
@user = User.find(1) #　idが1のユーザーを取得
@posts = @user.posts #　＠userに結びついたポストを全て取得
```

同様に、インスタンスメソッドとして定義された`user`を使うと、ポストを投稿したユーザーの情報を取得することができます。
```Ruby
@post = Post.find(1) #　idが1のポストを取得
@user = @post.user #　@postに結びついたユーザー情報を取得
```

これらインスタンスメソッドはさまざまな活用方法があるので、ぜひ試してみてください。
# 注意点
Railsガイドでは次のように注意がされています。
> belongs_to関連付けで指定するモデル名は必ず「単数形」にしなければなりません。
> has_many関連付けを宣言する場合、相手のモデル名は「複数形」で指定する必要があります。

つまり、先ほどの例で言うと
```Ruby:app/models/user.rb
has_many :posts
```
```Ruby:app/models/post.rb
belongs_to :user
```
これは認められても
```Ruby:app/models/user.rb
has_many :post
```
```Ruby:app/models/post.rb
belongs_to :users
```
これは認められないということになります。

::: note warn
現状、has_manyに関しては単数形でもそれなりに通ってしまいます。
:::
また、モデル名に関係のない適当な名前を指定しても機能しないので、お気をつけください。


# 終わりに
今回は簡単にhas_manyとbelongs_toのみを取り上げましたが、同様のことはRailsがサポートする6つの関連付け全てに当てはまることです。
・belongs_to
・has_one
・has_many
・has_many :through
・has_one :through
・has_and_belongs_to_many

https://railsguides.jp/association_basics.html
eVC++ 3.0 の覚書

eVC++ 3.0 について

# eVC++ 3.0 概要
- Windows CE (特にPocketPC) 向けのコンパイラ
- 当時(2000年台前半)は無償公開されていた
- Visual Studio シリーズ同様にプロダクト ID が必要だが、これもダウンロード ページに公開されていた
- eVC++ 3.0 のほかに Handheld PC、Pocket PC などの SDK が別途必要

# 今回利用したインストーラ
- evt2002web_min.exe
  - eMbedded Visual Tools 3.0 2002 Edition
  - ダウンロード日付: 2006/3/11 17:59
  - サイズ 210,485 KB

　昔の HDD や、MSDN の CD-ROM などを探してみよう！!

# Windows11 へのインストール
　結論から言うと、問題なくビルドは行える

- 途中、プロダクト ID を要求されるが、Webを検索すれば出てきます
  - eVC4 プロダクトID あたりで検索
  - eVC++3.0 / 4.0 で同じプロタクト IDです
    ![Product Number and User ID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/d9e619d7-ebbc-6123-7710-cb0f094b1b62.png)


- Windows CE Tools フォルダ で、最初から入っているフォルダが間違っている
  - ここでは C:\Windows CE Tools を指定する
    ![Choose Windows CE Tools Folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/0a7570a0-a1b8-b2ac-0c7a-57b1237f3a84.png)
    - たぶん %ProgramFiles% に C:\Windows CE Tools を上書きしたのだろう
    　![path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/a7528749-e9ae-9052-abd9-c8d03df95f7c.png)

- そのまま進めていくと
  - htmlhelp が新しいよ
  - エミュレータがインストールできない
  などと言われるが、エラーはなくインストール可能である。

その後、Windows11 の[スタート]→[すべてのアプリ]から [eMbedded Visual C++ 3.0]を選択すれば起動可能である。
テキトーにプロジェクトを作成して、ビルドを確認する。
![eVC3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/e6a3963d-b19a-49b8-cd8d-3ab89942a87a.png)
【書評】新人プログラマーのためのエラーが怖くなくなる本

## はじめに

私自身、業界歴は長いもののキャリアのスタートがマークアップエンジニアということもあり、そこまでプログラミングがめちゃめちゃ出来なくても今まで何とかなっていました（何とかなってたというより、何とかなる様に自分自身が選択していただけかもしれませんが）
いつかはしっかりとエラーが読めて解決できるようになりたいとは思うものの、行数が長いエラーを見ただけで拒絶反応がでて原因を探るのが億劫に感じたりしていたので、書籍のタイトルの「新人」ではないのですが、少しでも拒絶反応が軽減できればと思い、購入してみました。

## 本の構成

kindle版では245ページと書かれていますが、私は物理本を購入しまして著書紹介の手前のページは194ページとなってました。
比較的にそこまで分厚くないので、合間合間で読んでたらすぐに読み終えるボリュームです。

> 第1章 エラーはどうして怖いのか？
第2章 エラーの上手な読み方
第3章 不具合の原因を効率的に見つけるには？
第4章 ツールを活用してデバッグを楽にしよう
第5章 どうしても解決できないときは？
第6章 デバッグしやすいコードを書こう

内容としてはJavaScriptのエラー例が多く、フロントまわりの仕事をしている私にとってありがたい内容でした。

### エラーの上手な読み方

この章に書いてあるエラー文などは何度も見たことはあるのですが、「スタックトレース」を真剣に見たことはなく「なんか沢山行数が表示されてるけど、これなんだろ？」くらいにしか思ってませんでした（スタックトレースという名称も初めて知った）

https://qiita.com/KenRoda/items/c096ea75ca865fb7bbea

### 不具合の原因を効率的に見つけるには？

ここでは二分探索が紹介されていました。
私は過去にMENTAというサービスでメンターにお願いしてプログラミングを教えてもらったことがあり、その時にアルゴリズムの問題として二分探索の問題を出題され、それを解いた事があります。
当時は言われるがままやらされて、これがどこに活かされるのか分からなかったのですがこういった箇所に活かされるのか、と点と点が繋がって線になった感覚がありました。
もっとしっかり取り組んでおけばよかった…（というより、これを覚えることによりどんなインセンティブがあるのか初学者は分からない）

https://wa3.i-3-i.info/word18218.html

### ツールを活用してデバッグを楽にしよう

ここはChromeのコンソールにあるブレークポイントを使用してデバッグのやり方が丁寧に書かれてあります。
ステップ実行などはJavaScriptの学習で使用したことはあるのですが、条件付きでのブレークポイント等は初見でした。

それ以外では効率的な検索のやり方だったり、デバッグしやすいコードとは？という事が初学者向けに書かれてあります。

エピローグに書かれていた

> エラーの読み方や、効率的なデバッグ手法は、先輩から後輩への口頭伝承によって伝えられることが多いように思います。
デバッグはプログラミングにおいて基本的なスキルにもかかわらず、いざ学ぼうと思ったときに道標となる情報が世の中には意外とありません。
そこで、デバッグのエッセンスを一冊の本にまとめることが本書の狙いでした。


という文章が印象に残りました。

この本を読んで「明日からエラーなんか怖くなくなった」とまではいかないですが、最低限の向き合い方や心構えは理解できたかと思います。


https://www.amazon.co.jp/dp/B0CCD7S9VM/?coliid=IUM4S38WEI27J&colid=2F12G32NB5FM2&psc=0&ref_=list_c_wl_lv_ov_lig_dp_it
pyenvのインストールではまってしまった。　メモ

Open Interpreter が有料だと思って無視していたが、無料だと分かりインストールしようとしたところPython3.9では動かないことが分かり、3.10に変更しょうと思いました。
VS-Codeのインタープリターで変更すれば良いかと思ったらそうはいかない。
ターミナル上で変更したいので、pyenvをインストールしました。
LinuxやMacだと簡単だがWindows上だと結構面倒で、かなりはまってしまった。
pyenvのインストールはこちらの記事が参考になりました。
[【pyenv-win】pyenv のインストールと実行]("https://qiita.com/probabilityhill/items/9a22f395a1e93206c846)

インストール完了後、バージョン確認のコマンドを実行すると、以下のエラーが出力
`````
'DOSKEY' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'chcp' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'cscript' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'cscript' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
`````
Windowsの環境変数PATHが正しく設定されていないことが原因である可能性があります。Pythonやその関連コマンド（chcp, cscript, DOSKEYなど）が見つからない場合、Windowsはこれらのコマンドを内部コマンドまたは外部コマンドとして認識できません。

PowerShellを管理者として開いて、
````
Get-ExecutionPolicy -List

````
を実行。現在の実行ポリシーを表示
何も表示されないが、さらに
````
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

````
このコマンドは、実行ポリシーを「RemoteSigned」に設定します。これは、ローカルで実行されるスクリプトはすべて許可され、リモートからダウンロードされたスクリプトは信頼できる署名が必要となる設定。
再度pyenvのバージョンを確認したら動作しました。
実際なんの言語が市場で需要が高いんだろう？と思って調べてみました

# 目次
* はじめに
* 各言語ランキング
    * TIOBE Index
    * 求人が多い言語
    * 年収が高い言語 
* 需要が高い言語
    * Python
    * Java
    * C言語

# はじめに
新卒未経験でIT業界に入社した2年目エンジニアです。
入社して7月から現在にかけて、Flutterの開発に関わってきました。

実際にエンジニアとして力がついたことの確信は、いくつかの場面で経験してきたものの、
他の言語に挑戦したときに、自分はどこまでできるんだろう。。といった漠然とした不安がありました。
(同じ不安を抱えている人いませんか。。。？)

そこで、
別の言語のチュートリアルをやってみよう！
せっかくなら、需要の高い言語にしたいな。

と思ったのがきっかけで、市場で需要の高い言語を調査してみました！
調べたら出てくるランキングを集めてもつまらないので、需要が高い理由まで調べてみようと思います。

# 各言語ランキング

## TIOBE Index(2023年09月28日現在)

|順位|言語|
|:----|:----|
|1位|Python|
|2位|C言語|
|3位|C++|
|4位|Java|
|5位|C#|
|6位|JavaScript|
|7位|Visuak Basic|
|8位|PHP|
|9位|Assembly langage|
|10位|SQL|

:::note info
TIOBE Indexとは
正式名称は「TIOBEプログラミングコミュニティインデックス」。
ソフトウェアの品質の追跡を行なっている、オランダTIOBE Software社が、検索エンジンのヒット数を追跡して、その結果から毎月ランキングを発表しています。
このランキングによってどのPG言語がどれだけ話題になっているかを取ることができます！
:::


## 求人が多い言語ランキング

|順位|言語|
|:----|:----|
|1位|Java|
|2位|Python|
|3位|JavaScript|
|4位|PHP|
|5位|C#|
|6位|Ruby|
|7位|C++|
|8位|Go|
|9位|C言語|
|10位|Swift|

※調査してみた相場です

## 年収が高い言語ランキング

|順位|言語|
|:----|:----|
|1位|Scala|
|2位|TypeScript|
|3位|Go|
|4位|Python|
|5位|Kotlin|
|6位|Ruby|
|7位|Swift|
|8位|C++|
|9位|JavaScript|
|10位|Java|

※調査してみた相場です

# 需要の高い言語

## Python

Pythonの需要の高い理由としては、その汎用性が理由のようです。
汎用性が高いがため、現在注目を集めているAIなどの最先端技術の開発にも対応することができます。
最近流行りの「Chat GPT」もPythonでプログラムされているようです！

Pythonは「インタプリタ型」を採用しているため、コンパイル方式を採用している言語よりも処理速度が速く、さらには文法がシンプルで分かりやすいという特徴を兼ね備えています。

実際にPythonは、AI以外にもWebアプリケーション・データ分析といった場面で活用されていて、それに合わせたフレームワークやライブラリが豊富といったところも注目を集めている理由だと思われます。

:::note info
インタプリタ型
ソースコードを読みながらその場で機械語に翻訳して実行してくれるプログラムのこと。
「コンパイル型」も存在し、コンパイル型はソースコードを丸ごと機械語に変改して、実行ファイルを作成し処理を実行するプログラムのため、インタプリタ型は、コンパイル型と比べて実行速度が速い。

実行時に毎回ソースコードを必要とする制約があるが、問題のあるコードまでは必ず実行してくれるというメリットもあるため、動作確認を容易に実行できるというメリットがある。
:::

## Java

Javaはランキングを見ると、年収にはさほど上位に食い込んできませんでしたが、求人ランキングでは堂々の1位を獲得しています！

その理由としては、基本的にどんな環境でも使える言語だからという理由が大きいようです。何やら、「JVM」という仮想マシンでシステムを動かしているらしい。

つまり、Javaで作ったプログラムを仮想環境の上で動かしているため、その上でプログラムが動くことによって、OSなどによる環境の差を無視できるということらしいです！
モバイルアプリ開発をしている自分からしたら魅力的すぎる！！！

Javaのもう一つの特徴として、オブジェクト指向であることが挙げられます。
これによって、大手企業のシステムがJavaによってつくられるケースが増加し、求人が多くなっている傾向が見られます。

:::note info
オブジェクト指向
「モノ」と「操作」に分けてプログラムを作り上げる概念のこと。
これによって、膨大なプログラムを効率よく作成することができ、不具合が起きた時に、対象のコードを見つけやすいといったメリットがある。
:::

## C言語

未経験の身からしたら、C言語って就活中の時にめちゃくちゃ馴染みありませんでした？？
「言語」ってつくからかな？？笑

そんなことはさておいて、こちらもどのランキングにもランクインしてくる言語の一つです！！
汎用性の高さと処理速度の速さを兼ね備えていることは前提に、OSやロボットの開発にも活用されていて、ソフトウェア開発を飛び出してハードウェアの開発までもを可能にしているのことが人気の理由のようです！




# まとめ

TOIBEのランキングを過去数年見てみたのですが、Python、C言語、Javaは上位ランカーとして腰を据えていましたね。

今回取り上げたランキングは、TOIBE・求人・年収の観点でしたが、順位は違えどどのランキングにも顔を出してくる言語は、「処理速度」と「幅広く活用されるメリットがある」といった汎用性の高さがキモになってるようですね！(当たり前か)

皆さんはなんの言語が気になりましたか？？
今から学ぶのにおすすめの言語があれば、コメントください！
tWAS 9.0 と Db2 で DataSourceを使う

# 目的
tWAS 9.0と、Db2 で環境を構築してDataSourceをテストします。

# Gitレポジトリ
用意したGitレポジトリをクローンします。

```
git clone https://github.com/pdprof/db-connections
cd db-connections/derby-docker/
```

# Db2イメージのビルド

Libertyと、Db2, MySQL, Derbyのイメージをビルドします。localhost 以外の docker を動かしているホストのIPアドレスをACCESS_HOSTに指定します。今回はDb2を使用します。

```
export ACCESS_HOST=172.17.0.1
# export ACCESS_HOST=`hostname` # hostnameコマンドで返す値でアクセスできる場合
# export ACCESS_HOST=host.containers.internal # liberty から dbサーバーへの接続を podmanのホスト経由でする場合
./setup-docker.sh
```

# tWAS9.0イメージのビルド

tWAS 9.0 イメージをビルドします。
```
./setup-was90.sh
```


# Db2の起動

今回はDb2を起動します。（setup-docker.sh 後で停止していない場合は起動済みです）

```
docker ps # 起動状況の確認
./db2-start.sh
# ./mysql-start.sh # mysqlを起動する場合
```

# Db2にアクセスするtWAS9.0の起動

Db2にアクセスするtWAS9.0を起動します。mysqlやDerbyへアクセスするイメージの用意はありませんが、構成をまねてみてください。

```
./was90-start.sh 
```

# アプリケーションにアクセスして動作確認

http://localhost:9080/db.connections/
にアクセスすると以下画面が確認できます。localhost部分は環境にあわせて変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/f18a7d3c-2ce9-be3f-a86a-0ffefaa15618.png)

Simple db access test をクリックすると TABLEの作成とデータ挿入が実行されます。JPA Action Test 以下のボタンでJPAのテストができます。実行される内容は代わり映えしませんが、出力はJSONにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/d76ec298-4edd-7e6d-d917-35202970d658.png)


# トラブルシューティング

毎度のことですが、よくつかう dockerコマンドを書いておきます

接続がうまくいかない場合は、/config/server.xml で指定したホスト名（IPアドレス）が問題ないか、DBが動作しているか確認します。DBは 

```
docker ps # 動作中のContainer確認
docker logs -f mydb2 # ログ確認
docker restart mydb2 # 再起動
docker inspect mydb2 # container 確認
docker exec -it mydb2 bash # Container内状況確認
```

など試してみましょう。mydb2の部分を docker ps で確認した container の別IDにすることでtWAS9.0側も確認できます。

# まとめ

tWAS9.0, Db2の環境を構築をしてテストをすることができました。
Cinemachineが重すぎる時にやるべきこと

# 何の記事？
UnityのCinemachineは非常に便利なパッケージですが、使い方によって重くなることがあります。
最適化のための情報を見つけるのに苦労したため、日本語でも情報を残しておきます。

ちなみに以下のスレッドでUnityのGregorylさんが言っていることを紹介しているだけです。
https://forum.unity.com/threads/cinemachine-boundary-performance.806643/

# 効果を確認した環境
Unity 2022.3.4f1
Cinemachine 2.9.7

# StandbyUpdateをNeverにする

最初にやるべきなのはVirtualCameraにある、StandbyUpdateの変更です。
カメラがアクティブで無い時に計算を走らせるかどうかを指定しています。
初期値はRound Robinとなっています。

VirtualCameraを色んな角度からのカットを保存するために使うと、
VirtualCameraの数が飽和して、この処理が非常に重くなります。
**どうもVirtualCameraがついているオブジェクトを非アクティブにしても動いているようです。**
**非アクティブにするだけでは処理負荷が変わりませんでした**

VirtualCameraが多い場合は、StandbyUpdateがNeverで可能な運用を探るか、
一部のカメラだけUpdateを有効化するようにしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955766/fba1dd3c-9672-2f89-83c8-5ba623a1c227.png)
<?xml version="1.0" encoding="UTF-8"?><svg id="_繝ｬ繧､繝､繝ｼ_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 144.52 128.33"><defs><style>.cls-1{fill:none;stroke:#e71f19;stroke-miterlimit:10;stroke-width:.33px;}</style></defs><rect class="cls-1" x="4.52" y="43.75" width="137.7" height="7.37"/></svg>

# CinemachineBrainのUpdateMethodをLateUpdateに
CinemachineBrainのUpdateMethodをLateUpdateに変更します。
SmartUpdateよりもパフォーマンス的に有利とのこと。　
~~じゃあSmartって一体…？とは思いますが~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955766/7fa2e169-befd-1f27-d3ba-958be283ebf3.png)
<?xml version="1.0" encoding="UTF-8"?><svg id="_繝ｬ繧､繝､繝ｼ_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 144.22 74.06"><defs><style>.cls-1{fill:none;stroke:#e71f19;stroke-miterlimit:10;stroke-width:.33px;}</style></defs><rect class="cls-1" x="1.9" y="47.87" width="137.7" height="7.37"/></svg>

# ビルドセッティングのDeepProfillingとScriptDebuggingをfalseに
Devlopmentビルドを使っている場合は、
ビルドセッティングのDeepProfillingとScriptDebuggingをfalseにしましょう。
オーバーヘッドが発生して遅くなるようです。
不便ですが、不正確なデータに惑わされるよりはマシですね……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955766/ac23554b-592c-3160-4b70-da8c1f994ca4.png)
<?xml version="1.0" encoding="UTF-8"?><svg id="_繝ｬ繧､繝､繝ｼ_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 142.33 112.72"><defs><style>.cls-1{fill:none;stroke:#e71f19;stroke-miterlimit:10;stroke-width:.26px;}</style></defs><rect class="cls-1" x=".94" y="66.38" width="88.17" height="7.37"/><rect class="cls-1" x=".94" y="73.75" width="88.17" height="7.37"/></svg>


以上です！
私の場合はこれでかなり早くなりました！！
ぜひお試しあれ！
Windows 11 で設定画面を表示する4つの方法

Windows 11 は「設定」という画面から各種設定を変更する仕様となっています。この記事では Windows 11 22H2 を例に、設定画面を開く方法を 4 つ紹介します。

## 方法一覧

||方法|クリック操作|右クリック操作|キーボード操作|操作手数|備考|
|---|---|---|---|---|---|---|
|**1**|[**「ピン留め済みアプリ」から開く**](https://qiita.com/mmake/items/7fab65a6e5cd5b7683e3#%E6%96%B9%E6%B3%951%E3%83%94%E3%83%B3%E7%95%99%E3%82%81%E6%B8%88%E3%81%BF%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8B%E3%82%89%E8%A1%A8%E7%A4%BA)|必要|-|-|2|**容易**|
|2|[「すべてのアプリ」から開く](https://qiita.com/mmake/items/7fab65a6e5cd5b7683e3#%E6%96%B9%E6%B3%952%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8B%E3%82%89%E8%A1%A8%E7%A4%BA)|必要|-|-|4|容易|
|**3**|[**スタートボタンの右クリックから開く**](https://qiita.com/mmake/items/7fab65a6e5cd5b7683e3#%E6%96%B9%E6%B3%953%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%8B%E3%82%89%E8%A1%A8%E7%A4%BA)|必要|必要|-|2|**簡単**|
|4|[「Windows」＋「I」から開く](https://qiita.com/mmake/items/7fab65a6e5cd5b7683e3#%E6%96%B9%E6%B3%954%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%81%8B%E3%82%89%E8%A1%A8%E7%A4%BA)|-|-|必要|1|迅速|

## 方法1：ピン留め済みアプリから表示
### スタートメニューの表示
スタートボタンをクリックし、スタートメニューが表示されたら「**設定**」をクリックします。

![103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/11afbf74-98ec-7493-6411-e84e8125d719.png)

### 設定画面の表示
設定画面が表示されます。

![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/46a702e3-2d75-2623-2b69-250adb19e168.png)

## 方法2：すべてのアプリから表示
### スタートメニューの表示
スタートボタンをクリックし、スタートメニューが表示されたら「**すべてのアプリ >**」をクリックします。

![103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/11afbf74-98ec-7493-6411-e84e8125d719.png)

### すべてのアプリの表示
アプリ一覧が表示されたら下にスクロールし、「**設定**」をクリックします。

![37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/e61e08e6-c3e4-db01-ee19-fc3d696eb4c7.png)

### 設定画面の表示
設定画面が表示されます。

![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/46a702e3-2d75-2623-2b69-250adb19e168.png)

## 方法3：スタートボタンの右クリックから表示
### スタートボタンを右クリック
スタートボタンを右クリックし、コンテキストメニューが表示されたら、「**設定**」をクリックします。

![133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/0116a1dc-8d06-fb24-2638-37fde59e8f55.png)


### 設定画面の表示
設定画面が表示されます。

![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/46a702e3-2d75-2623-2b69-250adb19e168.png)

## 方法4：ショートカットキーから表示
### 「Windows ロゴ」＋「I」を押す
キーボードの「**Windows ロゴ**」＋「**I**」を押します。 設定画面が表示されます。

![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/46a702e3-2d75-2623-2b69-250adb19e168.png)
javaのコレクションについてのアウトプット

# 今日から、学んだことをアウトプットしていこ～＾＾！
今日学んだことは、Javaの**コレクション**について！
まずは、自分の認識したことを書き記していきます＾＾

# コレクションとは？
コレクションとは、「複数のデータをまとめる方法」だと認識しています＾＾！
コレクションには大きく分けて３つの種類があります！

一つ目は、「ArrayList」などの、情報を順序通りに並べて格納する**List（リスト）**
二つ目が、「HashSet」などの、複数の情報を重複なく格納する**Set（セット）**
三つ目が、「HashMap」などの、情報をペアで格納する**Map（マップ）**

# List（リスト）について
Listとは、配列などのように情報を順番通りに格納する方法で、中でもArrayListは、格納する要素の追加や削除が簡単＾＾♪

ArrayListのコード↓
**ArrayList<インスタンスの型名> 変数名 = new ArrayList<インスタンスの型名>();**

コード例↓
動物の名前を格納した例
```
ArrayList<String> animals = new ArrayList<String>();
```

新しい情報を挿入する場合は**add()**
新しい情報を上書きする場合は**set()**

# Set（セット）について
Setとは、情報を重複なく格納する方法で、
・情報の順序を重視しない場合はHashSet
・情報を格納した順序に取り出したい場合はLinkedHashSet
・５０音などの自然順序付けに取り出したい場合はTreeSet
など、用途に合わせて選ぶことができる＾＾

HashSetのコード↓
**Set<インスタンスの型名> 変数名 = new HashSet<インスタンスの型名>();**

コード例↓
都道府県名を格納した例
```
Set<String> prefecture = new HashSet<String>();
```

新しい情報を挿入する場合は**add()**

# Map（マップ）について
Mapとは、情報をペアで格納する方法で、
・情報の順序を重視しない場合はHashMap
・情報を格納した順序に取り出したい場合はLinkedHashMap
・５０音などの自然順序付けに取り出したい場合はTreeMap
など、用途に合わせて選ぶことができる＾＾

HashMapのコード↓
**Map<一つ目の情報の型名,二つ目の情報の型名> 変数名 = new HashMap<一つ目の情報の型名,二つ目の情報の型名>();**

コード例↓
生徒の名前と点数をペアで格納した例
```
Map<String, Integer> scores = new HashMap<String, Integer>();
```
新しい情報を挿入する場合は**put()**

# まとめ
配列よりも便利で、現場でも活用頻度が高いようなので、ぜひとも覚えておきたい機能だ＾＾！
Seleniumでリグレッションテストを試してみる

最近は転職活動を行なっており一区切りついたため、久しぶりに記事を書いてみましたので見てもらえると嬉しいです。
また、selenium以外にもunittestを使用しています。

## リグレッションテスト

リグレッションテストについてまとめていきます。
リグレッションテスト（Regression Testing）は
Webサイトなどについて意図しない変更がされていないかを確認するためのテストで前回までのバージョンと現在のバージョンを比較し、差異がないか確認するためのテストです。「回帰テスト」と呼ばれていたりもします。

## Pythonのインストール
Pythonのインストールについてはされている方が多いかと思いますので今回は省略します。

## Seleniumのインストール
Pythonのパッケージ管理ツールであるpipを使用してインストールしていきます。

```
pip install selenium
```
上記のコマンドをターミナルで実行するとSeleniumのインストールが実行されます。

## WebDriverのダウンロード
Seleniumでブラウザの操作をするためにはWebDriverを準備する必要があります。
私はChromeを利用しているため、ChromeDriverをダウンロードしていきます。一応Firefoxのドライバも記載しておきます。
ドライバについてはchromeのバージョンと一致するものを選ぶ必要があります。
Chromeのバージョンを確認する方法はChromeの右上あたりの点が3つ並んだ設定ボタンから設定⇨Chromeについてを押すと記載されています。

[Chrome](https://sites.google.com/chromium.org/driver/?pli=1)のドライバ
Chromeのバージョンが117以降の場合は[こちら](https://googlechromelabs.github.io/chrome-for-testing/)からの方が分かりやすいです。
[Firefox](https://github.com/mozilla/geckodriver/releases)のドライバ

私はChromeのバージョンが117、intel製CPUのMacを使用しているため、mac-x64 (x86_64)の方をダウンロードします。
もし、Apple製のCPU搭載Macを使用されている場合はmac-arm64 (Apple Silicon)を選ぶ必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958368/388b6631-329e-3f18-00e9-44629214ed6e.png)

ダウンロードができたらPATHを通していきます。
私の場合は/usr/local/bin/にPATHが通っているので/usr/local/bin/に移動させることで通しました。

ダウンロードに移動します
```
cd ~/Downloads/
```
chromedriverを/usr/local/bin/に移動させます。
```
mv chromedriver /usr/local/bin/
```
ホームディレクトリに移動します。
```
cd ~
```
.zshrcにパスを記載していきます。
```
vi .zshrc
```
.zshrcの末尾に下記を追加します。

```
export PATH="/usr/local/bin/chromedriver:$PATH"
```
保存したら反映させます。
```
source ~/.zshrc
```

これでパスを通っているか確認します。
```
chromedriver --version
```
下記のように出力されればOK!
```
ChromeDriver 117.0.5938.92 
```
これでSeleniumの設定は以上となります。

Unittestは標準モジュールなので何もしなくても使えると思います。

以上で必要なツールやモジュールの準備は完了です。
あとはテストを作っていきます。

## seleniumで画面操作を行う
まず最初にseleniumで画面操作を行っていきます。
```
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.google.com")
print(driver.title)
driver.quit()
```

上記のコードをpythonのファイルに記載して実行すると自動でChromeが開き、グーグルが開いた瞬間に閉じられると思います。
また、ターミナルに開いたページのタイトルが表示されていると思います。
これでseleniumが動作していることが確認できると思います。

次にunittestで開いているページが正しいかどうか判定していきます。

```
import unittest
from selenium import webdriver

class TestTitle(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.google.com")

    def tearDown(self):
        self.driver.quit()

    def test_google_title(self):
        self.assertEqual(self.driver.title, "Google")

if __name__ == "__main__":
    unittest.main()

```
上記を実行するとChromeが自動で開いた後に閉じ、ターミナルの実行結果に下記のような表示がされているかと思います。
```
----------------------------------------------------------------------
Ran 1 test in 3.167s

OK
```
上記はテストが一件実行され、問題ないことが表示されています。
失敗するとどうなるかも確認してみましょう。

7行目を下記に変更して同じように実行します。
```
self.driver.get("https://qiita.com/")
↓
self.driver.get("https://www.google.com")
```

実行すると下記のように実行結果が表示されるかと思います。
```
----------------------------------------------------------------------
Ran 1 test in 5.103s

FAILED (failures=1)
```

これでseleniumとunittestを使用した簡易的なテストができることが確認できました。
次回はopencv等を含めたビジュアルリグレッションテストについて記載していきたいと思います。
SOLID原則

SOLIDは良いオブジェクト指向設計の5つの原則です

## 1. SRP : 単一責任原則
- single responsibility principle
- **一つのクラスは一つの責任**のみを持たなければならない。
- 変更があるときに影響が少なければ単一責任原則によく従ったもの

## 2. OCP:開放-閉鎖原則
- Open/closed principle
- **拡張には開いているが、変更には閉じていなければならない。**
- Srpingの場合、使用領域と構成領域（AppConfig）に分けることで、
  ソフトウェア要素を新たに拡張しても使用領域の変更は閉じているようになった。

## 3. LSP:リスコフ置換原則
- Liskov substitution principle
- **多型性で下位クラスはインターフェース規約をすべて守らなければならない。**
  例えば、車のエクセルを押せば、無条件に前に行くように保障しなければならない。

## 4.ISP:インターフェース分離原則 
- Interface segregation principle
- **特定のクライアントのための複数のインターフェイスは、1 つの汎用インターフェイスよりも優れています。**
- ex. 自動車インターフェース → 運転インターフェース、整備インターフェースに分離
      ユーザークライアント→ドライバークライアント、整備士クライアントに分離
- 分離すれば整備インターフェース自体が変わってもドライバークライアントに影響を与えない。
## 5. DIP:依存関係逆転原則
- Dependency inversion principle
- インターフェース（抽象化）に依存すべきであり、実装クラス（具体化）に依存してはならない。
- クライアントは役割についてよく知っておくべきであり、特定の実装クラスについてよく知っておくべきコードを組んではならない。




## 例えば
例えば、DiscountPolicyをFixDiscountからRateDiscountに変更すると、
以下のようにコードを修正すると思います。
```
// 既存コード
DiscountPolicy discountPolicy = new FixDiscountPolicy();
// 修正コード
DiscountPolicy discountPolicy = new RateDiscountPolicy();

discountPolicy.count();
```
この場合、

1. SRP、1クラスは1つの責任しか持たないといけないのに,
**具現オブジェクトの生成、連結、実行まで様々な責任を持っており、SRPに違反**している。

2. OCP、拡張には開いているが、変更には閉じている必要があるが、
**クライアントコードを変更する必要があり、OCPに違反**している。

3. DIP、実装クラスに依存せず、インターフェース（役割）に依存しなければならないが、
**インターフェースだけでなく実装クラスにも依存しており、DIPに違反**している。


しかし、上記の原則を守りながら開発をしようとすると、やることが多すぎてスプリングを作ることになった。
【Linux】指定ディレクトリ配下のファイル総容量を確認する方法


## `du`コマンド

`du`コマンドを使用することでディレクトリ内のファイル容量を表示させることができます。

```terminal
$ du .
8328	./sample/example
280240	./sample
7670680	.
```

## オプション（一部）

### `-h`
次のように実行すると、適切な単位で表示します。

```terminal
$ du -h .
4.1M	./sample/example
137M	./sample
3.7G	.
```

### `-s`

次のように実行すると、指定したディレクトリの合計を表示します。

```terminal
$ du -s .
7670776	.
```

### `-d 深さ`

次のように実行すると、表示する深さを指定できます。

```terminal
$ du -d 1 .
7670680	./sample
7670776	.
```

## 容量が大きい順に表示する

以下のように実行すると容量が大きい順に表示されます。

```terminal
du -h . | sort -n -r
```
Godotに手を出してみた

# はじめに
仕事の息抜きにゲーム開発をやろうと思い立ち、2Dゲームに強そうなGodotエンジンを使用して開発してみようと思ったので、自分用メモなども含めていろいろ環境を作ったり、詰まった点などを書いていく

※Godot 4.1.1時の話なので、違うバージョンを使っている人は参考程度にどうぞ。

## エンジン入手
エンジン自体は普通にダウンロードしてこればOK
Windows : https://godotengine.org/download/windows/
C#を使う場合は.Net対応バージョンを、GDScriptで書く場合はStandardをダウンロードする。C++？環境作ってみようと思ったが挫折したので今後対応できたら書くかも。

## 環境作成でやったこと、Tips雑記
こちらを参考にしてVSCodeと連携して書くようにしている。めっちゃ助かっている。

https://note.com/himitsucrab/n/n15e1d173aad6

* .gdignoreファイルをGodotで読み込みたくないディレクトリにおいておくと読み込まなくて済むようになる。

* user:// ディレクトリは環境依存
Windowsなら以下
%APPDATA%\Godot\app_userdata\[project_name]
なお、プロジェクト設定から自身で指定したディレクトリに変更することができるので、ゲーム中に別フォルダに設定することも可能。

* labelの文字色をスクリプトで変える方法がわからなかった。
結論だけ言うと以下の形でできる
$label.add_theme_color_override("font_color", Color.RED)
【簡単設定】IntellijでSpringBoot(Java) + Gradle + MySQL + Doma2のプロジェクトを作る

# はじめに

SpringBoot + MySQLでアプリを作る際、DBにアクセスするときに使用するORマッパーはいつもSpring Data JPAをだったのですが、個人的に使いにくいなと感じることが多かったんです。。。
しかし、[Doma2](https://doma.readthedocs.io/en/2.9.0/)というORマッパーが良いという事を聞き、今回使ってみようと思いました。
その際、初期設定あたりで色々つまづいたところがあったので、今回はそこを中心に執筆しようと思います。（Controller, Serviceの実装は省きます。）

GradleでDoma2を導入する記事がなかなか少なかったので、参考になれば幸いです！！
※本当はkotlinでしたかったのですが、つまづいたのでJavaで解説します（笑）

## 環境
SpringBoot 2.7.16
Java 11
MySQL 8.0.32
IntelliJ IDEA 2021.3.2

SpringBootのプロジェクトは事前に[Spring Initializr](https://start.spring.io/)等で準備してください

## Doma2とは

* JavaのDBアクセスフレームワーク
* 注釈処理を使用して コンパイル時 にコードの生成やコードの検証を行う
* データベース上のカラムの値を振る舞いを持った Java オブジェクトにマッピングできる
* 2-way SQL と呼ばれる SQL テンプレートを利用できる

## build.gradleにdoma2の設定を追加する

まずは**build.gradle**に以下の設定を追加しましょう

```build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.16'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    // ↓追加
	id 'org.seasar.doma.compile' version '1.1.0'
}

dependencies {
    // ↓追加
	implementation 'org.seasar.doma.boot:doma-spring-boot-starter:1.4.0'
    // ↓追加
	annotationProcessor 'org.seasar.doma:doma-processor:2.35.0'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

```

追加したらビルドを行いましょう

## MySQLの設定
application.yml(propertiesでも可)に、以下の設定を追加しましょう
```application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost
    username: root
    password:
      initialization-mode: always
  sql:
    init:
      mode: always

doma:
  dialect: ORACLE
  naming: SNAKE_LOWER_CASE
```

## Daoインターフェースの作成

続いて、SQLを発行してくれるDAOを作成しましょう

```TodoDao.java
package com.example.doma.infrastructure.dao.todo;

import com.example.doma.domain.todo.Todo;
import org.seasar.doma.Dao;
import org.seasar.doma.Insert;
import org.seasar.doma.Select;
import org.seasar.doma.Update;
import org.seasar.doma.boot.ConfigAutowireable;

import java.util.List;

@ConfigAutowireable
@Dao
public interface TodoDao {
  @Select
  List<Todo> findAll(String name);
}

```

## SQLファイルの作成
「findAll」に対応するSQLクエリを作成しましょう
SQLファイルの配置場所ですが、以下のディレクトリに配置し、名前も合わせる必要があります
```
src/main/resources/META-INF/...(Daoファイルまでのディレクトリ)/findAll.sql
```

今回は全件取得するSQLを発行したいので、以下のSQLをファイル内に書きましょう

```
select * from テーブル名;
```

## エンティティの作成
以下のようにエンティティを作成しましょう

```TodoEntity.java
package com.example.doma.domain.todo;

import lombok.Data;
import org.seasar.doma.*;

import java.util.Date;

// application.propertiesの「doma.naming」で指定済みなので不要
//@Entity(naming = NamingType.SNAKE_LOWER_CASE)
@Data
@Entity
public class Todo {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  public int id;

  private String name;

  private Date createTimestamp;

  private Date updateTimestamp;
}

```

設定は以上です！
あとはRestでもなんでも良いので、Controller、Serviceを作成して、ServiceでDaoのfindAllを呼べばSQLを実行することができます。

不備等あればコメントいただけますと幸いです！
Javaの環境構築をしよう!(Windows編)

# 環境構築って何？
まず環境構築って何？ってところですが、Javaは実行するためのソフトやPC上での設定が必要です。これらを総称して環境構築といいます。

* 環境構築の流れは以下です。
1. [JDK(Java Development Kit) のインストール](#1-jdkjava-development-kit-のインストール)
2. [環境変数の設定](#2-環境変数の設定)
3. [確認作業](#3-確認作業)
### 1. JDK(Java Development Kit) のインストール
JDK は、Javaプログラミングを行うために必要なソフトです。これを使って実際のコードを動かします。

↓こちらのサイトからダウンロードできます。
[JDKダウンロードサイト](https://jdk.java.net/21/)

赤線のZipというところをクリックしてください。
![JDKダウンロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/07b20190-acc9-f0e3-08d5-93484aba3cfc.jpeg)
ダウンロードしたZipファイルを解凍したのち、実行し任意のフォルダに保存します(今回は C:\Program Files\Java\に指定)。
![JDK配置.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/4801964e-b353-bec7-9a87-5e5d048ae8d0.jpeg)

### 2. 環境変数の設定
環境変数の設定はダウンロードしたJDKがどこにあるのかをPCに認識させる作業です。普段スマホでアプリ何かをダウンロードしたときには、そのまますぐ使えますがJavaはそうはいかないので、どこにJDKをダウンロードしたかをPCに教えてあげる必要があるんですね。

※以降は、Windows11における設定手順のため、OSのバージョンごとに若干の違いがあるため、ご自身の環境で置き換えて進めてください。

まずは、タスクバーの検索ボックスに「コントロールパネル」と入力して、コントロールパネルを開いてください。
![コントロールパネル開き方.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/25eb70af-36c8-9b25-01e5-d17f88860f53.jpeg)
開いたらさらにシステムを開きます。
![システムを開く.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/e8289183-aa35-e303-9088-891333f6348a.jpeg)
システムの詳細設定を押下。
![システムの詳細.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/3a830709-c0b7-5019-f20d-bc86e748d68f.jpeg)
環境変数を押下。
![環境変数設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/fcac93d1-8334-c6dd-4dcd-17fae9916065.jpeg)
新規ボタンを押下しユーザー環境変数を追加します。
![ユーザー環境変数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/4b9986a7-15a3-1347-ea03-d60bfd4a3c7a.jpeg)
以下のように設定しOKボタンを押下。
変数名：「JAVA_HOME」
変数値：1. JDK(Java Development Kit) のインストールにてJDKを保存した場所。※本手順では「C:Program Files\Java\」を指定。
![ユーザー環境変数値を設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/d845de8f-56b1-73b2-de2c-a76cef6f7543.jpeg)
元のユーザー環境変数のところに追加されているのが分かると思います。
![環境変数設定後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/44320f28-a82c-0b93-ecbb-bb86f5e75e6e.jpeg)
ユーザー環境編の「Path」を選択した状態で編集ボタンを押下すると以下のユーザー環境変数の編集画面が表示されますので、新規ボタンを押下。
![Path.設定png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/833175d2-cbad-609a-39f8-58a929c2af7b.jpeg)
以下の様に「%JAVA_HOME%\bin」と値を設定し、OKボタンを押下したら環境変数の設定はすべて完了です。
![編集値入力.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/51e9c247-823d-af61-345a-c2f2243b3577.jpeg)

### 3. 確認作業
1~2の手順が正しく行われ、Javaが使用出来るかどうかを確認を行います。

タスクバーの検索ボックスに「cmd」と入力しENTERを押下してください。すると以下のような画面が出てきます。
![cmd開く.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/1f5fdd38-dcea-09c7-caa3-eaae91555abe.jpeg)
そこに「java -version」と入力しENTERを押下。
以下の様にJDKの情報が表示されれば、環境構築完了です。
![cmd_java-version.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/14410dc5-cf1e-4065-f29c-9e1f8e34ae2f.jpeg)
以下の様な表示が出た場合は、2. 環境変数の設定が間違っている可能性が高いので再度確認してみてください。
![cmd_error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/6ca99021-f5d6-d8f4-7470-f5dbf1a0f13f.jpeg)
Javaの環境構築手順は以上です!
VRChatのワールド制作時にテストビルドを複数起動しようとしてもEACが止めてくる問題

VRChatで込み入ったものを作るとどうしても同期テストが必要です
VRChat SDKコントロールパネルからBuild & Test New Buildボタンを押すときに、Number of Clientsのところに数字を入れておくと複数起動をして、同期テストが行えるはず・・・けど、何故か２つ目のクライアントをEasy Anti Cheatが止めてしまい、同期テストができず苦しんでいました

修正する情報もネットにほとんど落ちていなかったし、周りの人も発生していないし、twitterに同じ症状の人も居て苦しんでいるとか、４つクライアントを立ち上げるとうち２つが生き残ってなんとかテストできるとか、そういう情報はあったのですが、これといった、解決策がなくて困っていたのですが、解決したので共有します

VEChat SDKコントロールパネルから、ログイン状態でSettingsタブを開き、VRChat Clientの項目のRevert to Defaultボタンを押す

以上です

どうも過去にClientを手動で設定しなきゃいけない時期があったため、その時の設定が残っている人に発生するようです
解決にあたりアドバイスをくれたはいさん（https://twitter.com/hd4tails ）に多大な感謝を送ります
(WIP) A Tour of Go をやってみる

# Overview
Golang のキャッチアップの為、A Tour of Go に取り組む。

A Tour of Go:

https://go-tour-jp.appspot.com/list

# Using the tour
https://go-tour-jp.appspot.com/welcome/1

チュートリアルの説明が記載されている

# Packages, variables, and functions

## For loop
https://go-tour-jp.appspot.com/flowcontrol/2

> 初期化と後処理ステートメントの記述は任意です。

初期化と後処理ステートメントを記述しない場合、条件式の前後にセミコロンをつける、つけないは選択可能

OK:

```go
for ; 条件式; {
    ...
}
```

OK:

```go
for 条件式 {
    ...
}
```

## If statement

https://go-tour-jp.appspot.com/flowcontrol/5

If statement で変数宣言
https://go-tour-jp.appspot.com/flowcontrol/6
If スコープ内でのみ使用可能
Springで始めるWeb開発#2

# はじめに
<!-- 発端や概要を記載 -->
Javaのフレームワーク「Spring」を使って開発を行っています。
今回はその２になります。[前回はこちらから。](https://qiita.com/nayuziro200/items/b7e0cd1da19072b27252)

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [REST APIとは？](#Chapter1)
2. [APIの作成](#Chapter2)

<!-- 各チャプター -->
<a id="#chapter1"></a>
## REST APIとは？

REST（Representational State Transfer）は、ウェブアーキテクチャの設計原則を指し、RESTful APIはこの原則に従って設計されたウェブAPIの一種になります。

API（Application Programming Interface）は、ソフトウェアアプリケーション同士がコミュニケーションを取るための一連のルール（インターフェースの仕様）になります。

REST APIでは、HTTPで定義するGET、POST、PUT、DELETEなどのリクエストでデータを操作します。

GET　:　リソースの取得（例：　データの取得）

POST　:　リソースの作成（例：　データの送信）

PUT　：　リソースの更新（例：　データの更新）

DELETE　：　リソースの削除（例：　データの削除）

クライアントがAPIを使用してリクエストを送信すると、サーバーはJSON形式のデータを返します。
以下のようにキー（name,age）と値（John Smith,30）を持っています。

```:JSON
{
  "name": "John Smith",
  "age": 30,
  "city": "New York"
}
```

<a id="#chapter2"></a>
## APIの作成

GET、POSTを中心に以下のようなコードを作成しました。

```:RequestController
@RestController
public class RequestController {
	@Autowired
	private CartService cartService;

	@GetMapping("/cart")
	public ResponseEntity<List<Cart>> getCartItems() {
		List<Cart> cartItems = cartService.getAllCarts();
		return ResponseEntity.ok(cartItems);
	}
	
	@PostMapping("/cart")
	public ResponseEntity<Integer> addCartItem(@RequestParam("itemId") Integer itemId) {
		cartService.addToCart(itemId);
		return ResponseEntity.ok(itemId);
	}
}
```

解説します。

上の`@GetMapping("/cart")`では/cartにアクセスした時にCart（カート）のアイテムを取得するコードになります。

[Postman](https://www.postman.com/)で動作確認しました。
以下の画像のようにデータベースに登録したデータを取得することができました。
（Postmanは、API開発者やテストエンジニアがAPIをテストするためのツールです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071732/e8d5379d-e1f8-4d51-5a7c-3b1007c6bc46.png)


下の`@PostMapping("/cart")`では/cartにView画面から送信処理があったときCart（カート）に追加するコードになります。
今は送信時のデータを返り値としています。
`2`というデータを送信したので以下の画面に表示しているように`2`が帰ってきています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071732/b4c9289c-354b-2ce2-e7ba-d608781bca09.png)

# 最後に
APIを作ってみたの回でした。
Googleにも便利なAPIがあるようなので調べて使ってみたいと思います！

# 参考資料
https://aws.amazon.com/jp/what-is/restful-api/