OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase プロジェクトに後からGitHub Actions のCI 設定を追加する方法

## 概要
* Firebase のアップデートによりinit 時にGitHub Actions によるCI 設定を行えるようになりました
* Firebase Hosting のpreview 機能とも連携していて，プルリクエストを作成するたびにone time url でプレビュー版が作成されるなど非常に便利です
* 新規プロジェクトの場合はinit 時にあれよあれよという間に設定されますが，この記事では既存のFirebase プロジェクトに適用する方法を載せます

## オフィシャルでサポートされてました
* 解説するまでもなくオフィシャルで後から追加するオプションが用意されていました・・・
* 備忘録代わりに（あるいは気づかず自前で設定追加を試みようとしている方を止めるために）コマンドだけ載せておきます

```
firebase init hosting:github
```
* ドキュメント https://github.com/marketplace/actions/deploy-to-firebase-hosting#setup
AWSのインスタンス起動時にゲームを起動するようにしたい

# 経緯
身内でゲームサーバを立てることになったので、AWSでゲームサーバを構築しました。
24時間起動する運用ではなく、平日の夜や土日にだけ起動するようにしたかった。
今後CloudWatchなどでを用いて、インスタンスの定時起動、終了を行うと思うと、
インスタンス起動時に毎回サーバに入ってゲームを起動するコマンド実行を自動化したかった。

# やりたいこと
インスタンス起動時にゲームの起動するコマンドが実行されてゲームが起動したい。

# 使ったAMI
* Amazon Linux 2 AMI(64bit x86)

# 方法
AWSに限らず、Linuxには「chkconfig」があるらしい。
サーバ起動時の挙動を設定してくれている機能くらいの認識で使ってみた。

## chkconfigを設定するまでの誤解
### 私がinputした情報
他のサイトみながら、やっていくと以下のディレクトリに起動時に動かしたいサービスを登録するらしい。
```/etc/init.d/(サービス名)
```

hoge登録するサービスは以下のような例

```
#!/bin/sh
case "$1" in
 start)
       sh -x /home/ec2-user/hoge_start_script.sh
       ;;
 stop)
       sh -x /home/ec2-user/hoge_stop_script.sh
       ;;
  *) break ;;
esac
```
この情報だけを持って試しに動かしてみた。

### サービス名の記述にはフォーマットがある
例を見て起動スクリプトだけ動かしたかった私はhogeサービスを作り、
```/etc/init.d/hoge
```

起動するスクリプトだけ記載しました。

```
#!/bin/sh
sh -x /home/user/hoge_start_script.sh
```

以下のコマンドでサービスを登録しようとしたところ
```sudo chkconfig --add hoge
```

```service hoge does not support chkconfig
```
と怒られました。
どうも原因は登録するサービスにもフォーマットらしきものがあるそうで、
私が認識したフォーマットは以下で第１引数start、stopの挙動を書くフォーマットにしないといけないそうです。
（私の認識なので語弊があるかもしれません）

```
#!/bin/sh
case "$1" in
 start)
       （起動時に動かすコマンド）
       ;;
 stop)
       （終了時に動かすコマンド）
       ;;
  *) break ;;
esac
```

### 実行ユーザは指定しないといけない
サービスにフォーマットがあることを知り、以下の通り修正してみましたが、
インスタンス起動時に「hoge_start_script.sh」の挙動をしてくれませんでした。

```
#!/bin/sh
case "$1" in
 start)
       sh -x /home/ec2-user/hoge_start_script.sh
       ;;
 stop)
       sh -x /home/ec2-user/hoge_stop_script.sh
       ;;
  *) break ;;
esac
```
今回私はAWSのデフォルトユーザである「ec2-user」で作成していましたが、
いろんなサイトを巡ったところ、
ユーザを指定してシェルを実行しないといけないそうです。

最終的に以下のようにサービスを修正することにより、
「hoge_start_script.sh」の挙動をしてくれました。

```
#!/bin/sh
# chkconfig: 2345 99 10
# description: start shell
case "$1" in
 start)
       su -l ec2-user -c "sh -x /home/ec2-user/hoe_script.sh start"
       ;;
 stop)
       su -l ec2-user -c "sh -x /home/ec2-user/hoge_script.sh stop"
       ;;
  *) break ;;
esac
```

## インスタンス起動時にゲームを起動するようにする手順まとめ
いろいろとはまりましたが、最後にec2インスタンス起動時に特定のシェルを動かすための手順をまとめます。
初めの作業はAWSのコンソール上での作業です。

1. サービスを作成する

    ```
cd /etc/init.d
sudo vi hoge
   ```

2. サービスのスクリプトを記載する

    ```
#!/bin/sh
case "$1" in
 start)
       su -l ec2-user -c "sh -x /home/ec2-user/hoe_script.sh start"
       ;;
 stop)
       su -l ec2-user -c "sh -x /home/ec2-user/hoge_script.sh stop"
       ;;
  *) break ;;
esac
    ```

3. 権限付与

    ```
sudo chmod 775 /etc/init.d/hoge
    ```
4. 起動時のサービスに登録する。
    ここからはAWSのEC2のGUI上で操作です。
インスタンスの停止が条件なので、この作業を行う前にインスタンスを停止しておいてください。
対象のサーバを選択し、
「アクション」-「インスタンスの設定」-「ユーザデータを編集」を選択する。
（「ユーザデータを編集」は下の方にあり、ないと勘違いすることもありますが、スクロールすればあります。）
ユーザーデータをテキストで変更を選択して、以下をテキストボックスに入れる。

```
sudo chkconfig --add hoge
sudo chkconfig hoge on
```

これでインスタンス起動時にhogeサービスのシェルが実行されるようになります。
【1分で読める！】SQLでやりがちなミス(超超初学者向け)

##初めに(読まなくてもＯＫ)
・投稿の目的：「学び」というより「自戒」です。
・共感してもらえたら嬉しいです(;^ω^)
・結果：起こった問題で、**3時間**溶かしました。Σ（・□・；）

##状況(読まなくてもＯＫ)
・私の学習状況：PHP学習と同時にSQL触りだして**2週間経過**
・就職活動の準備の一つとしてMySQLとPHPを使ったポートフォリオを開発中
・ポートフォリオの機能の一つに「全国の音楽フェスについて口コミする機能」を実装済み

##やりたかったこと
口コミ情報が保存されている既存テーブル(reviews)から**「どのフェスに何個口コミがされているか」**を取得したい！

▽既存テーブル(reviews)

| id | fes_name | review |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  1 | Rock'in Japan  |  So nice!!! |
|  2 | Rock'in Japan  | Exciting!!  |
|  3 | SWEET LOVE SHOWER  | 最高！  |

▽取り出したい値

| fes_name| review_cnt|
|:-:|:-:|
| Rock'in Japan  |  2 |
| SWEET LOVE SHOWER | 1 |

##起こったこと
▽当初のSQL記述

```
SELECT fes_name COUNT (id) AS review_cnt FROM reviews GROUP BY fes_name
```

▽最終的な記述

```
SELECT fes_name, COUNT(id) AS review_cnt FROM reviews GROUP BY fes_name
```

▽結論
①`fes_name`と`COUNT`の間に`,`がなかった
②`COUNT`と`(id)`の間に無駄な空白があった

これだけでした。(笑)

6時間の間で、
・「いいね！機能」のようにテーブルを他に作ったり
・fes_nameに対してreview_idの数を数えようとしたり
記述を変えましたが全部上記の間違った書き方をしてたんですね…(´Д｀)

##反省(読まなくてもＯＫ)
原因はGoogle検索の１つの記事に執着しすぎて、**他の記事を参考にしなかったこと**ですね
(その記事の投稿者さんには修正の依頼をかけています。)

もっと視野を広くせねば、と反省です…

##最後に
「これやりがちだねー」とか
「これやったことあるわー」とか
「音楽フェス好きだから応援したい！」
なんて思って頂けた方は気軽にLGTMいただけるともっと今後も恥ずかしいミスを投稿し続けていこうと思いますので、よろしくお願いしますm(__)m
Minecraftで影をつけてみよう！【glsl】

前回：[基本の解説・ブロックの色を変更する方法](https://qiita.com/MCH_YamaRin/items/addd86de2635d2c27580)
次回：[光源の色を変更する方法](https://qiita.com/MCH_YamaRin/items/b086544a0c5891b26131)
#はじめに
今回はMinecraftの影Modの代名詞と言っても過言ではない、
**影をつける方法を解説していこうと思います！**

影をつける方法と聞けば、
「太陽の位置とブロックの位置を計算して～」
といった感じに想像する人が大半だと思います。

もちろんその方法で影をつけることは可能なのですが、

**・マトリックスなどの計算をそこそこ複雑に行うので、処理が重くなる**
**・仕組みが複雑なので、理解が難しい**
**・私の低スペックPCに打撃を与える**

以上の理由から、リアルな影をつける方法の紹介は断念（機会があれば記事を書くかもしれない）しました。

でも心配しないでください。
**ブロックの明るさの情報から影を求めれば、より軽量でより簡単な仕組みで影をつけることができます！**

#ブロックの明るさから影をつける方法

今回も「gbuffers_terrain.fsh」を編集していきましょう。

ファイルの中を探せば、次のようなコードが見つかるはずです。

```glsl
diffuse *= texture2D(lightmap, lmcoord);
```
これはブロックに明るさをつける命令で、「lmcoord」をもとに処理されています。

**この「lmcoord」を利用します！**

#「lmcoord」のしくみ
「lmcoord」には、**「lmcoord.x」**と**「lmcoord.y」**の二種類の情報が入っています。

**「lmcoord.x」は、松明などの光の強さ、「lmcoord.y」は、ブロックの真上から光を当てたときに、そこが影になるかならないかのレベル...のようなものです。**

**「lmcoord.y」を使えば、明るさをもとに影をつけることができます！**

#影をつけてみましょう！

```glsl
if(lmcoord.y <= 0.95){
diffuse.rgb *= vec3(0.0);
}
```
このコードを書いてみましょう。

**「if(){}」は、()の中の条件が成立すれば{}の中のコードが実行されるという命令なので、**

**「lmcoord.y」が0.95以下の部分をvec3(0.0)にする**
といった仕組みです。

「vec3(0.0)」は、「vec3(0.0 , 0.0 , 0.0)」を省略したものです！

![2021-02-07_12.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087947/a4755e50-d783-b275-2587-b01337f0e910.png)

影がつきましたが、真っ黒ですね...

**「vec3(0.0)」を「vec3(0.7)」にして、明るめにしてみましょう。**

![2021-02-07_12.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087947/383e907f-70b3-fc1d-42ce-5ab43884e2ab.png)

だいぶ影っぽくなりましたね！
![2021-02-07_12.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087947/cb95a511-cce0-5aa4-6645-28f6d4697adc.png)

このままでもいいのですが、松明などの光で照らされても暗いままなので不自然です...

```glsl
if(lmcoord.y <= 0.95){
diffuse.rgb *= vec3(0.7) * (lmcoord.x + 0.7);
}
```
**光の情報を持った「lmcoord.x」を掛け算してみましょう！**

lmcoord.xの数値は低めなので、0.7を足しています。
()をつけると、その中の式が優先して計算されます！

![2021-02-07_12.10.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087947/74626d6d-4e1c-8d48-08e3-98a20193c5fa.png)

**完璧～！**

「mix()」や「smoothstep()」といった関数を使うことによって、影の境目を滑らかにすることもできます。

ぜひ考えてみてくださいね！

#おわりに

次回があれば松明などの光の色を変更する方法を解説しようと思います！
(勘の良い人はやり方が分かると思います。)

**それではまた会いましょう！さようなら！**
連続するアルファベットを指定文字数分出力する

# やりたいこと
- 連続したアルファベットを指定文字数分生成したい


## コード

```bash
# 単純なアルファベットの出力はブレーズ展開を使います
echo {A..Z} 
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
```

- 指定の文字数

```bash
# その中から文字数をUPSのselfを使いました。
echo {A..Z} | self {1..9}
A B C D E F G H I
# 指定文字数
NUM_CH=9
echo {A..Z} | eval self {1..$NUM_CH}
A B C D E F G H I
```

## 参考文献
 [ブレース展開に変数を使う(実行例). eval を使えば解決！](https://gist.github.com/tgck/5427200)
[Tukubaiオンラインコマンドマニュアル(self)](https://uec.usp-lab.com/TUKUBAI_MAN/CGI/TUKUBAI_MAN.CGI?POMPA=MAN1_self)
Drupalをローカル環境で起動する

こんにちは、GRIの肖です。
こちらは[グロースエクスパートナーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/gxp)の14日目の記事です。<br>

CMSと言えば様々なシステムが出てくると思いますが、DrupalというCMSをご存じでしょうか？

実はこの2年間Drupalの案件を開発しています。たくさんのCMSの中から、Drupalを選んだ理由を考えると、Drupalは柔軟なコンテンツ管理の機能を持っていること、データを効率的に再利用できること、詳細な権限設定ができることなどなどです。

ワークフローや承認の機能もしっかり付いてるため、大規模のサイトにDrupalが適しているのではないかと思います。

CMSに興味ある方、Drupalを利用してみてはいかがでしょうか？

ローカル環境でDrupalを起動する手順を簡単に紹介したいと思います。
Drupalのドキュメントサイトで細かく記載しているため、下記手順はドキュメントを参考にしています。
ドキュメント：https://www.drupal.org/docs/installing-drupal
Drupalバージョン： 9.4.9
PC： MacOS

<h2>準備 Before a Drupal installation：</h2>
<p>ローカル環境なので、まずweb serverの環境を用意します。<br>
自分はxamppを使っています。<br>
xamppソース：https://sourceforge.net/projects/xampp/files/<br>
インストール手順：https://qiita.com/miriwo/items/37e4dfec4484d389db07<br>
インストールが終わったらserversのstartボタンを押します。MySQL DatabasとApache Web Serverがrunningになるとlocalhostが立ち上げます。</p>

<h2>Step 1: Get the Code</h2>
Drupal coreをダウンロードします。<br>
ダウンロード先：https://www.drupal.org/project/drupal/releases/9.4.9

<h2>Step 2: Install dependencies with composer</h2>
Composerをインストールします。<br>
手順: https://getcomposer.org/download/<br>

<h2>Step 3: Create a database</h2>
localhost/phpmyadminでDrupal用のデータベースを追加します。<br>
ここで、"utf8mb4_unicode_ci"もしくは"utf8mb4_general_ci"を選択することを忘れないように注意します。

<h2>Step 4: Configure your installation</h2>
xamppの場合は、Step 2でダウンロードしたDrupal core一式フォルダをxamppのhtdocsフィルダに入れます、そのあと、localhost/drupal-9.4.9/ を開くとDrupalページを見れるようになります。

<h2>Step 5: Run the installer</h2>
step-by-stepの手順：https://www.drupal.org/docs/user_guide/en/install-run.html<br>
localhost/drupal-9.4.9/ を開くと、初回はDrupalサイトでの設定ページになります。<br>
設定を進めている最中は権限周りのerrorやwarningが出てくると思いますが、説明文通りに設定を追加すれば解消できます。

<h2>Step 6: Status check</h2>
step5の設定が終わったら、サイトの管理画面に入れる状態になります。そこで一つtrusted_host_patternsのエラーが出るはずです。localhostの場合は、settings.phpに以下のコードを追加すると解消できます。

```ruby:settings.php
$settings['trusted_host_patterns'] = [
  '^localhost$'  
];
```
以上で一通りローカル環境のインストールが終わりました。

<h2>おわり</h2>
ざっくりの手順ですが、Drupalを開発してみたい方、是非お試しください。
[OutSystems]OutSystems Launcher (Chrome Extension)

OutSystems開発者向けのChrome Extensionです。

[OutSystems Launcher](https://chrome.google.com/webstore/detail/outsystems-launcher/bghjgajoiopjdomgbjbgbeendnpleglc/related?hl=en-US)

# 環境
Personal Environment(Version 11.9.0 (Build 16900))
Service Studio(Version 11.10.8)
OutSystems Launcher(Version 2.0.12)

OutSystems Launcherの最終更新日は、2018/9/13なので最近は更新されていないようです。

# ViewStateのサイズをアイコンのバッジで確認できる
これは、Traditional Webだけに関係がある機能です。
Traditional WebではPreparationなどで取得したデータをポストバック時に利用するために、ViewStateという機能を使っています。

データは画面のHTML内に埋め込まれているので、実装方法によってはサイズが肥大化してパフォーマンスを劣化させることがあります。

普通はHTMLのソースを開いてサイズを確認するのですが、このExtensionを入れておくと、以下のようにChrome Extensionのアイコンにバッジとしてサイズを表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d68e82cb-010a-5efe-d793-1dd094b71e9d.png)

# Chromeで開いているページをService Studioで開く
Chromeで開いている、OutSystemsで作成した画面を、Service Studioで開く機能です。
テストや、運用中の調査時に実装を確認したいときにすぐに開発画面が開くので、作業がいくらか楽になる。

　ブラウザで「https://<FQDN>/<モジュール名>/<画面名>」のようなページを開いているときに、Chrome Extensionのアイコンをクリックすると、ダイアログが出ます。「Open Service Studio」ボタンをクリックすれば、Service Studioで該当モジュールの該当画面を開いてくれます。

Service Studioを閉じた状態であれば、起動もしてくれました。

また、古い機能なので、Traditional Webだけかとも思いましたが、調査時点では、MobileのプレビューとReactive Webでも動作しました。

# ViewStateサイズの算出結果を検証してみる
アイコンバッジに「1.0 KiB」と表示されているページで、実際に出力されているViewStateを確認してみます。

KiB=1024 bytesなので、実際の長さはその前後の値と推測されますね。

ページのソースを開き、「name="__OSVSTATE"」を含むinputタグのvalueを確認すれば実際の値が見られます。BASE64エンコーディングされているので桁数を見ればいいはず。上記ページでは「1048桁」でした。
【Rails】RailsのデバッグをVSCodeでできるようにしてみた（M1 Big Sur）


Railsのpry-railsをデバッグ手段として学んだが、binding.pryとコード内に記入するのに違和感があったので別方法を模索
例えばgitに意味のない変更ログが残るリスクがあること
~~一番の理由はデバッグしているうちにコードに書いたことを忘れてしまうこと~~
また調べ物に奔走するのが嫌なのでこれを備忘録として残す！

## 環境

- macOS Big Sur 11.2 M1
- Ruby 2.6
- Rails 6.1.1
- Visual Studio Code - Insiders 1.54.0-insider
- rubyide 0.28.1

## Ruby Extension

拡張機能で「Ruby」と検索すると出てくるこれをインストール

![rails-debug-setup_2021-02-07-10-44-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528850/c08ef30f-8261-5ac4-8911-1d0f3f519eab.png)

[debugger.md]:(https://github.com/rubyide/vscode-ruby/blob/master/docs/debugger.md)

この詳細欄(Details)で案内されている[debugger.md]のruby-debug-ideをRailsアプリで使えるようにする

## デバッガーインストール

Gemfileのdevelopmentにruby-debug-ideとdebaseを追記する
(Rubyのバージョンが２系でない場合はdebaseはない別のGemをインストールする必要がある。詳しくは[debugger.md]を参照）

```ruby:Gemfile
# 省略
group :development do
  # 省略
  gem 'ruby-debug-ide'
  gem 'debase'
end
# 省略
```

追記を終えたらインストールを実行

```sh
% bundle install
```

## デバッグの構成を追加

次にデバッグの構成を追加する
下記をクリック（拡張機能で日本語にしている場合は「構成の追加」をクリック）

![rails-debug-setup_2021-02-07-11-11-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528850/b7659857-5967-ffda-1788-eaec7663b84f.png)

Rubyの拡張機能を導入していた場合は、rubyが現れるとのこと・・・だけど私がやるときは無かった
でも気にしなくても良い
何でもいいからどれか一つをクリック

![rails-debug-setup_2021-02-07-11-19-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528850/aaf51c4e-6665-e7cc-d555-9abd8136b4e5.png)

クリックをするとlaunch.jsonというファイルが開く
ここに設定を書き込めばいいので気にしなくてもよかった
下記をlaunch.jsonに追記して保存する
各項目の詳細は[こちら](https://github.com/rubyide/vscode-ruby/blob/master/docs/debugger.md)を参照

```json:launch.json
(省略)
{
  "configurations": [
    {
      "name": "Listen for rdebug-ide",
      "type": "Ruby",
      "request": "attach",
      "cwd": "${workspaceRoot}",
      "remoteHost": "127.0.0.1",
      "remotePort": "1234",
      "remoteWorkspaceRoot": "${workspaceRoot}",
      "useBundler": true
    }
  ]
}
(省略)
```

ここまで出来たら左のサイドバーにあるデバッグを押し、画面左上に「Listen for rdebug-ide」が追加されているかを確認

![rails-debug-setup_2021-02-07-11-27-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528850/65ce2a5d-b5c8-f7a1-54b5-8ba5cf42edae.png)


## デバッグの実行

次のコマンドをVSCode内のzshターミナルで実行

```shel
bundle exec rdebug-ide --host 127.0.0.1 --port 1234 -- bin/rails s -b 0.0.0.0 -p 3000 -e development
```

実行後に下記が現れることを確認しておく

```shell
Fast Debugger (ruby-debug-ide 0.6.1, debase 0.2.2, file filtering is supported) listens on 0.0.0.0:1234
```

次に用意したデバッグの構成を実行する
「Listen for debug-ide」の左にある再生マークを押す

![rails-debug-setup_2021-02-07-11-24-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528850/385a4c83-67df-c4db-d02a-c3e5938bcc6b.png)

無事成功すると、Railsのサーバーの起動をターミナルから確認できる
これでデバッグの実行は成功！
あとはブレイクポイントを作ってラクラクデバッグ！

## 参考

[rubyide/vscode-ruby](https://github.com/rubyide/vscode-ruby)
[rubyide/vscode-ruby/doc/debugger](https://github.com/rubyide/vscode-ruby/blob/master/docs/debugger.md)
[WindowsでVSCodeを使ってrailsのデバッグを行う](https://qiita.com/naoto_koyama/items/313e45a0f26e1e641728)
[RailsプロジェクトをVSCodeからデバックできるようにする](https://qiita.com/igara/items/0c19b557e3d7cbc41233)
pythonでベクタレイヤに新しいフィールドを作る方法

## 新しいフィールドを作る

```
#レイヤの指定
lyr = iface.activeLayer()

#フィールドの定義

new_field = QgsField(name='fieldName', type=QVariant.String, typeName='String', len=254)

#定義したフィールドの適応
lyr.dataProvider().addAttributes([new_field])
lyr.updateFields()
```
- QgsFieldで作成するフィールドの設定内容。
    - name:フィールド名
    - type：フィールドタイプ。stringの場合は`QVariant.String`、integerなら`QVariant.Int`、realなら`QVariant.Double`
    - len：フィールドの長さ
    - prec：精度（小数点以下の数値長さ）の指定


## フィールドに値を入力する
```
for f in lyr.getFeatures():
    f.setAttribute("fieldName", value)
    lyr.updateFeature(f)

lyr.commitChanges()

```
Edit With Notepad++が表示されない事がある

#32-bit アプリケーションとレジストリ shellex
64-bit WindowsにNotepad++ 64-bitをインストールしている時、32-bitアプリケーションのコモン ダイアログ(開く、保存、等)でファイルを右クリックすると`Edit With Notepad++`が表示されません。
このメニューはレジストリの`HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\ANotepad++64`に記述されており`NppShell_06.dll`からシェルへのメニューが返されますが、x86アプリケーションからx64のDLLは呼び出せないためです。
WinMerge等も同様の仕組みです。
#レジストリ shell
WinMergeでは拡張メニュー等複雑な機能があるためDLLによるシェル拡張が必要ですが、`Edit With Notepad++`は単純にNotepad++でファイルを開くだけです(多分)。
であれば、`notepad++.exe`のコマンドライン引数に渡すだけでも実現可能です。

```EditWithNotepad++.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Notepad++]
@="Edit with &Notepad++"
"Icon"="\"C:\\Program Files\\Notepad++\\notepad++.exe\""

[HKEY_CLASSES_ROOT\*\shell\Notepad++\command]
@="\"C:\\Program Files\\Notepad++\\notepad++.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked]
"{B298D29A-A6ED-11DE-BA8C-A68E55D89593}"=""
```
`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked`に`{B298D29A-A6ED-11DE-BA8C-A68E55D89593}`を追加し(無効化)、
代わりに`HKEY_CLASSES_ROOT\*\shell\Notepad++`にアイコンとコマンドを設定します。
レジストリを設定したら、一旦サインアウトしてもう一度サインインします。
(又はExplorer.exeを再起動)
#注意
複数のファイルを選択した時、マルチインスタンスの設定をしている時等、異なる挙動になる可能性があります(未確認)。
#元に戻す

```-EditWithNotepad++.reg
Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\*\shell\Notepad++]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked]
"{B298D29A-A6ED-11DE-BA8C-A68E55D89593}"=-
```
レジストリを設定したら、一旦サインアウトしてもう一度サインインします。
(又はExplorer.exeを再起動)
[参戦記] ABC191

**パフォーマンス**
マイワースト２を更新orz

**A**
問題なし

**B**
[]を消し忘れるという初歩的なWA。

**C**
問題の意図が不明。質問を見ると返答に詳しい説明があるが、これは不公平であろう。入試業務の経験からすると、ありえない措置である。責任者が例が１つしかないのはrngさんの意見によるものとツイートしていたが、結果として誤判断であった。担当者に責任を押し付ける責任者の資質を疑う。
そういったあれこれから、これはパスすべき問題と判断したし、それで良いと思う。経費の問題は良く理解できるが、時間をかけて推敲すべき問題だったと思う。

**D**
問題の内容はクリアで、概ね正しい解法も許容時間で思い付いたが、誤差のうまい処理ができなかった。
Dとしては難しめという話もあり、少し実力不足だったという印象がある。

**反省**
体調は問題なかったが、惨敗であった。
自分は数学科なので、数学寄りの思考なのだが、情報処理の特性を踏まえた情報処理に適した考え方を出来なければいけない。
前回も数値誤差の処理に失敗したが、再発防止できなかったので、精神的にかなりダメージを負った。突き詰めると、純粋数学と実用数学の差をどう埋めるかという問題であり、簡単に克服できるものではないと痛感した。
DB設計ファーストでLaravel開発をする場合に、Modelクラスを自動生成する

Laravelの新規開発では、通常DBのテーブル作成には、Migrationファイルを使います。

**Laravel 7.x データベース：マイグレーション**
https://readouble.com/laravel/7.x/ja/migrations.html

では、既存のDBが存在しているプロジェクトの場合はどうするでしょうか？
この場合、Reliese Laravel というパッケージを使って、Modelクラスを自動生成することができます。

**Reliese Laravel**
https://github.com/reliese/laravel

#### Reliese Laravelのインストール
では早速、Composerでインストールしてみましょう。

```
composer require reliese/laravel --dev
```



#### Reliese Laravelの読み込みのためプロバイダー登録


``` app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        if ($this->app->environment() == 'local') {
            $this->app->register(\Reliese\Coders\CodersServiceProvider::class);
        }
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

```

#### Reliese Laravelによるモデルの自動生成
下記コマンドで、すべてのテーブルのモデルを自動生成します！

```
php artisan code:models
```

特定のテーブルのモデルのみ自動生成したい場合は下記のコマンドを実行します。

```
php artisan code:models --table=users
```


これらのコマンドを実行すると「app/Models」 のフォルダ階層にModelクラスが作られます。


#### メリット
DBにリレーションがはられている場合は、hasMany, belongsToのリレーションが自動で作成されるため、複雑なJOINなどを書く必要はなくなります。
Eloquentなら、Controller側・View側でも使えて開発がかなり楽になります。

#### 注意点
DBの内容が変わった場合、手動で書き換えるか、Reliese Laravelで再度自動生成する必要があります。
Reliese Laravelで再度自動生成する場合、Modelクラスに独自で追加したプロパティやメソッドは消えてしまいますので、
私は今回、既存の「app/Models」 は別フォルダにバックアップしてから、自動生成してその後、バックアップの内容を追記する形にしました。
「config/model.php」の'base_files' をtrueにすると、独自のモデル変更を失わないようにできるみたいです。こちらを試してみるのもいいかもしれません。
個人開発ぐうたら日記１　～きっかけ編～

# まえがき
最近またメラメラと、何かゲームでも作りたいなあと思っていたらきっかけがあったので作ってみることにした。今回は我流ではあるが、個人開発の流れを記事として残していきたいと思う。~~途中でモチベなくなったらしらん。~~

# きっかけ
ある日、後輩と大好きなスーパー銭湯にいったところ、「[晩白柚（ばんぺいゆ）](https://ja.wikipedia.org/wiki/%E6%99%A9%E7%99%BD%E6%9F%9A)」という柑橘系のフルーツを浮かべた風呂があった。

![9a40cb9cd9c79c414b718587aa62a5b5_1496639821.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635329/0ee1e7eb-8f37-0032-4f07-660a8b48a81f.jpeg)
>出典：[晩白柚風呂](https://www.kinasse-yatsushiro.jp/sp/events/detail/43)

その名前、その大きさとも僕の知らないフルーツだったが、何かしら**ビビッとくるもの**があった。

**これが空から降ってきて集めるゲームを作ってみたいなあ…**

大体僕が趣味で何か作ろうという時、そこに「〇千人にプレイしてもらいたい」とか「〇万円稼ぎたい」とか考えることは全くなく、無意味なものでも、しょうもないものでもアイデアベースで**「作りたいと思ったものを作る」**ことが多い。（あまりにしょうもなさすぎるとAppleの審査でリジェクトされるｗ）

今回もひょんなことがきっかけではあったが、とりあえず作ってみたいな、と思った。
ただ僕は超めんどくさがりで、デザインとか苦手。アプリに使う画像はこれまでも全てネットのフリー素材に頼っている。
なので、どれだけ晩白柚をテーマにしたアプリを作りたいと思っても、フリーで使える晩白柚の素材がなければこの企画は妄想で終わる。あっけないが大体そんなものだ。
ところが調べたところ、いらすとや様様。ちゃんと晩白柚もサポートされていました。頭が下がる思い。

![fruit_banpeiyu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635329/4452e995-3d2d-e713-0779-3db42a489016.png)
>出典：[晩白柚・バンペイユのイラスト](https://www.irasutoya.com/2016/02/blog-post_6.html)

かくして、素材があることも分かったので、個人開発を始めることを決めた。

# 何を作るか
最低限作れることがわかったから、もう少しどういったアプリにしたいかを考えてみた。

**晩白柚が空から降ってきて、それを集めるゲーム。**

着想はこれだが、さすがにこれだけだとシンプル過ぎる。
だが妄想を膨らませすぎると、機能がもりもりになって完成が見えづらくなり、ぽしゃりやすい。
**個人開発はモチベーションが命**なので、いかに「ぽしゃらせないか」を考えることが大事。
ある程度形になってきたら、楽しくなってくるのでそこから機能なんていくらでも盛れる。
ということで、お風呂や寝る前に考えながら結局

- **空から食材が降ってきて、その中からフルーツを集めるゲーム**
- **柑橘系をゲットするとプラスポイント**
- **野菜をゲットするとマイナスポイント**

これぐらいにしておく。
ゲームの設定や詳細は、正直ネットに画像素材があるかに依存するため、この段階ではある程度ふわっとしたものにする。
~~デザイン勉強しろというお話。~~

ちなみにお風呂や寝る前に考えた妄想は、

- カゴの上に落ちてくるフルーツが積まれていって、画面外にはみ出たらゲームオーバー（テトリス的な）
- サイズが小さいものの上に大きいものを積むと、ポーンと跳ね返される
- 逆にフルーツをよけまくる（弾幕STG的な）

などなど。

# 何で作るか
これはまあ、前回も使用したUnity C#でいいだろう。
恥ずかしながら、クロスプラットフォーム開発に対応したツールはこれしか使ったことがない。
新しい言語やツールなどの技術の習得まで目標に入れると、これまたぽしゃりやすい。

# コラム：個人開発のモチベーション
さっきも申し上げた通り、趣味でのアプリ開発は休日などのプライベートな時間を消費するのでモチベーション管理が非常に重要である。**また個人開発は相当な忍耐力がないと完遂できないと思っている。**これガチ。
僕がゼロベースで作ってストア公開まで至ったアプリはまだ1つしかないが、想像以上にキツかった。
ようわからんバグ、謎のコンパイルエラー、さじを投げたくなるビルドエラー、辞書のようなガイドラインチェック、何度申請しても落とされる審査、などなど。何度完遂をあきらめかけたかわからない。

それでも僕が個人開発をしたくなるモチベの源泉は

- **アイデアを形にできた時の達成感を得たい（ほぼこれ）**
- **自分が作ったアプリを、友人がプレイして楽しんでいる姿を見たい**
- **UnityやC#のスキルを少しでもあげたい**

要はほぼ自己満です。趣味での個人開発ってそんなもんかなって僕は思います。

# 次回予告
ざっくり何を作るか、何で作るかが決まったので、いよいよ次からは行動に移していく。
まずはネットで画像素材を集めるところからｗ
僕の場合、ネットのフリー素材が命なので素材からイメージを膨らませ、具体的な設定を考えることも多い。
というわけで、次回は画像素材を集めて簡単な画面イメージを考えるとこぐらいまでをやりたい。
【docker】〜image has dependent child images 対応〜


表題のエラー対応についての備忘録です。
image has dependent child imagesは、親となるイメージを消そうとすると発生するエラーです。

#対応
stack overflowに対応が書いてあったが、「docker rmi <RPOSITORY:TAG>」で指定すればエラーが起きないとのこと。。

```bash
docker rmi <IMAGE ID>
#Error response from daemon: conflict: unable to delete <IMAGE ID> (cannot be forced) - image has dependent child images

docker rmi <RPOSITORY:TAG>
#Untagged: <RPOSITORY:TAG>
```
https://stackoverflow.com/questions/38118791/can-t-delete-docker-image-with-dependent-child-images


#原因

公式ドキュメントにこれについて記述がありました。
https://docs.docker.com/engine/reference/commandline/rmi/

```bash
docker rmi <IMAGE ID>
#→image layer自体も消す（"delete"）

docker rmi <RPOSITORY:TAG>
#→tag(セーブポイント)だけを消して、image layerはそのまま("untaged")
```
EC2のWebサーバーの設定をしてみた

# 初めまして
今回オリアプのデプロイをEC2にて行いましたので、その際のWebサーバー設定を備忘録として残りたいと思います。

# 使用サーバー
Nginx(エンジン・エックス)
※ユーザーのリクエストに対して静的コンテンツのみ取り出し処理を行い、動的コンテンツの生成はアプリケーションサーバに依頼します。

# 目的
EC2内にWebサーバーを用意して起動させます。
※Webサーバーは静的コンテンツ（リクエストを送っても内容が変わらない物）を表示します。


# Nginxを導入します。

```
ターミナル
[ec2-user@ip-ご自身のIP ~]$ sudo amazon-linux-extras install nginx1
コマンドが出てきたら「Yes」で
```

次に、設定ファイルを編集します。

iを押してインサートモードにしてください。

編集箇所
①アプリケーション名をご自身のアプリ名へ
②ElasticIPをご自身のIPへ

編集後、「esc」「:wq」を押して保存終了します。

```
[ec2-user@ip-ご自身のIP ~]$ sudo vim /etc/nginx/conf.d/rails.conf
```
コマンドを実行すると、下記が表示されます。
ファイルの詳細を表示されます。

```
/etc/nginx/conf.d/rails.conf
upstream app_server {
  # Unicornと連携させるための設定
  server unix:/var/www/アプリケーション名/tmp/sockets/unicorn.sock;
}

# {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
server {
  # このプログラムが接続を受け付けるポート番号
  listen 80;
  # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない
  server_name Elastic IP;

  # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく
  client_max_body_size 2g;

# 接続が来た際のrootディレクトリ
  root /var/www/アプリケーション名/public;

# assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}
```

次に「Nginx」の権限を変更します。

```
[ec2-user@ip-ご自身のIP ~]$ cd /var/lib
[ec2-user@ip-ご自身のIP lib]$ sudo chmod -R 775 nginx
#postメソッドを使用してもエラーが出ないようにする

[ec2-user@ip-ご自身のIP lib]$ cd ~
[ec2-user@ip-ご自身のIP ~]$ sudo systemctl reload nginx
[ec2-user@ip-ご自身のIP ~]$ sudo systemctl start nginx
# Nginx設定ファイルを再読み込みして起動します。
```

# Unicornの設定を変更します。
アプリケーションサーバーの設定変更になります。

railsのconfig/unicorn.rbにて

```


listen 3000

↓のように変更します。ポート番号からアプリのパスにします。

listen "#{app_path}/tmp/sockets/unicorn.sock"

```

変更後は、Githubをしている場合は、push、本番環境にも上げておきます。

```
# 開発中のアプリケーションに移動
[ec2-user@ip-ご自身のIP ~]$ cd /var/www/開発中のアプリケーション

# GitHubの内容をEC2に反映させる
[ec2-user@ip-ご自身のIP <レポジトリ名>]$ git pull origin master

```

# Unicornを再起動します。

再起動の手順は
①プロセスの確認
②プロセスをkill
③unicorn_railsコマンドを実行
です。

```
#プロセスを確認します
[ec2-user@ip-ご自身のIP <リポジトリ名>]$ ps aux | grep unicorn

ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
#↑　unicorn_rails masterの「17877」がプロセスidです。これをkillで止めます。
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn

[ec2-user@ip-ご自身のIP <リポジトリ名>]$ kill 「unicorn_rails masterのご自身のプロセスid」

# 最後にUnicornを起動します。
[ec2-user@ip-ご自身のIP <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```

以上でWebサーバーの設定が完了できました。


# 最後に
実際に、作業をして文字として残すことによって徐々にAWSの理解が追いついてきました。
また、Webサーバーとアプリケーションサーバーの違いも理解しておくことで、作業自体の意味も理解しやすくなりますね！

ここまで読んでいただきありがとうございました！
【AWS】リージョン変更について

# AWSのリージョン変更について
備忘録
以下は、EC2インスタンスを間違ってオハイオに作ってしまい、東京へリージョン変更した時の
方法になります。

## リージョン変更の流れ
1. インスタンスの停止
1. スナップショットの作成
1. スナップショットのコピー
1. リージョンの変更
1. スナップショットからイメージを作成
1. インスタンスの作成

## 1. インスタンスの停止
AWSサービスからEC２を選択（※この場合のリージョンはオハイオ）
インスタンスを選択し、インスタンスの状態をクリック　インスタンスの停止を選択する

## 2. スナップショットの作成
EC2左側のメニュー　Elastic Block Storeのスナップショットをクリック
インスタンスのスナップショットを作成を押します。
Select resource type　は　instance
ボリュームはオハイオのボリュームを選択し実行

## 3. スナップショットのコピー
EC2左側のメニュー　Elastic Block Storeのスナップショットをクリック
作成したスナップショットを選択し、アクションからコピーをクリックします。 
画面が表示されたら、送信先リージョンを東京に選択し、コピーをクリック。
スナップショットのコピーが開始されましたと表示されればOK。

## 4. リージョンの変更
AWSサービスからEC２を選択（右上のリージョンをオハイオから東京へ変更）
上記、スナップショットのコピーが開始されましたと表示されれば、
東京のスナップショットにもスナップショットが生成される。

## 5. スナップショットからイメージを作成
EC2左側のメニュー　Elastic Block Storeのスナップショットをクリック
スナップショットのステータスがcompletedになったらアクションから
イメージの作成をクリックします。 名前を入力し、仮想化タイプを「ハードウェアアシストの仮想化」を選択し作成をクリック

## 6. インスタンスの作成
EC2左側のメニューからAMIをクリックし、ファイルが作成されているか確認し、
availableとなっている事を確認する。
オハイオのインスタンスを終了、Elastic IPの解放をした後
インスタンスを作成をクリックし、左側のメニューからマイAMIがクリックできるようになって
いるので選択し、インスタンスを作成します。 セキュリティグループの設定、Elastic IPの関連付け等の再設定が必要です。

これまでがリージョン変更の全容です。

>参考情報
以下のページを参照しました。ありがとうございました。
>https://qiita.com/nadonado/items/8ad7181a42a0e16efdf8
【SwiftUI】ハイライトする方法

## はじめに
SwiftUIで手軽にハイライトさせることが出来たのでそれをまとめました。
アプリのユーザーに何か知らせる時、ハイライトで視覚的に訴えかけられれば良いなと思ったのがきっかけです。

こんな感じでハイライトされます。
<img width="250" alt="ezgif.com-video-to-gif-4.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406612/7e8a835e-86d9-de03-cc6a-ffce263a2eb7.gif">


## ソースコード
コードの必要箇所だけ抜粋しました。
レイアウトを自由に設定して使用することができます。

```swift:ContentView.swift
struct ContentView: View {
  
  @State private var isHighlight = false
  
  var body: some View {
    VStack {
      Text("Hello World!")
        .overlay(Color.yellow
                  .opacity(isHighlight ? 1 : 0))

      Button("HIGHLIGHT") {
        isHighlight = true
        withAnimation(.easeOut(duration: 1)) {
          isHighlight = false
        }
      }
    }
  }
}


```

同じボタンにtrueとfalseを両方入れて動くのか不安でしたが、想定通りの動きをしてくれました。
最初にisHighlightをtrueにして、opacityを1にして、その後1秒かけてopacityを0にしていく動きとなります。
これでハイライトらしい動きとなりました。

上記動画のコード全体はこちら。
https://gist.github.com/takuma-2531/fcc0946555e7ff45d24eb0e72e545453

## おわりに
SwiftUIは少し工夫するだけで様々な動きを実装できて面白いです。
ハイライトの色とか形とか時間とか変えて使っていただけると嬉しいです！
同時に文字サイズとか変えても面白そうですね。
最後まで読んでくださりありがとうございました。
AWSでEC2に接続しようとしたら"ssh: connect to host xx.xxx.xx.xxx port 22: Operation timed out"と出た

＜はじめに＞
転職活動用に制作しているポートフォリオについて、AWSでのデプロイ（SSL認証まで完了）
している状態です。
その後、Action Cableを用いた追加実装を行い、デプロイの前にAWSの設定変更が必要な状況。
connection.rbのファイルの編集が終わり、EC2に接続してNginxの設定変更をしようとした際に
下記エラーが発生。初歩的なことが原因でしたが備忘録も兼ねて簡単に投稿します。

```
xxxxxxxxxxx@xxxxxxxxxxx .ssh % ssh -i xxxxxx.xxx ec2-user@xx.xxx.xx.xxx
ssh: connect to host xx.xxx.xx.xxx port 22: Operation timed out
```

＜内容＞
EC2インスタンスのSSlの送信元の設定に問題があったようです。。
接続したいインスタンスを選択し、「セキュリティ」→「セキュリティグループ」を選択→
「インバウンドルール」の「インバウンドルールを編集」を選択

SSHの「送信元」の箇所（"カスタム""任意の場所""マイIP"３択が表示）を"マイIP"に
選択する必要がありました。
＊元々"カスタム"としていたのがよくなかったようです。。。

これで以下のように無事に接続できました！

```
xxxxxxxxxxx@xxxxxxxxxxx .ssh % ssh -i xxxxxx.xxx ec2-user@x.xxx.xx.xxx
Last login: Sun Jan 17 01:31:40 2021 from om126034118109.18.openmobile.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
4 package(s) needed for security, out of 10 available
Run "sudo yum update" to apply all updates.

```

＜終わりに＞
機械音痴のためこの手のエラーにかなりビビってしまうのですが、同じような場面に遭遇している人は
他にもいるはずなので焦らず丁寧な対応が必要だと思いました。
Salesforce Classic での Pardot を使用した対ビジネスマーケティングの自動化 ⇒ Salesforce Engage の基本 ⇒ Salesforce Engage 機能の探索

１．Saleforce から直接、マーケティングが承認したメールを送信できる、Salesforce Engage のコンポーネントは次のうちどれですか?
２．Engage Alerts は次のうちどの条件で絞り込むことができますか?
３．マーケティング承認済みテンプレートを使用したメールの有効性のみを確認するには、次のうちどの検索条件ビューを使用しますか?
４．Engage for Gmail から直接、プロスペクトをリストに追加するには、どの機能を使用しますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/48dc61e7-0c9b-024a-86d0-fa4c9bbdcc4d.png)
GNU Emacs 28.0.50 (build 1, aarch64-apple-darwin20.3.0, NS appkit-2022.30 Version 11.2 (Build 20D64))

# introduction

Macを購入したらまず初めにEmacsをビルドします。M1 MacBook Airを買ってもとーぜん。。。

![スクリーンショット 2021-02-07 10.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154910/6a0e3e3e-20af-3a84-852d-11f681fc9495.png)


# environment

- macOS: M1, Intel
- xcode
- [MacPorts](https://www.macports.org/): autoconf, texinfo

# build

```
#!/bin/sh

EMACSDIR=Emacs
JOBS=4

if test ! -e /opt/local/bin/autoconf; then
    echo "sudo port install autoconf"
    exit 0
fi

export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin

cd /tmp

git clone --depth 1 https://git.savannah.gnu.org/git/emacs.git $EMACSDIR

cd /tmp/$EMACSDIR
sh autogen.sh

mkdir build
cd build
../configure --with-ns --without-makeinfo --with-gnutls=no

make -j $JOBS || (echo "falure exit" ; exit)
make install

open /tmp/$EMACSDIR/build/nextstep

exit 0
```

# Note

Trumpで相手がmacOSのァイルを開けないのは何故だろう。
Raspberry Pi (Ubuntu)相手なら開けるのに。
ここではGnuTLSを使ってないけど、--with-gnutlsでもダメ。
どうすれば解決しますかね。

```
C-x C-f /ssh:hostname: 
```
【Rails】データを選択して、csv出力する実装から学んだこと


# はじめに

こんな感じで検索結果から、任意のデータを選択してcsv出力なんて機能ありますよね。
![選択結果を出力.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697823/49870897-63d6-184c-6fc4-595885be9565.gif)
PFで実装してみようと思うものの、やり方を調べてもなかなかヒットせず。。

そこで！
自分なりにこうしたらいいかな？と考え、実装してみました。

本記事では以下の内容について記載していきます。

1. どうやって実装方法を考えたか
2. 処理の流れ
3. 実装から学んだこと

本記事は初学者による投稿です。
もし、もっとこうした方が良いなどありましたら、コメントいただけると幸いです！！


# 環境

**【OS系】**

 - macOS Catalina 10.15.7
 - Ruby on Rails 6.0.0
 - Ruby 2.6.5


**【アプリのモデル】**

- matterモデル

案件管理のため、Matterモデルとしています。

# どうやって実装方法を考えたか

### 結論：サーバーサイドから処理を逆算していった

色々試すうちに、まずは任意のレコードを取得する方法が必要だなと考えました。
具体的には以下の流れ考えました。

1. csv出力するためには、レコードを取得する必要がある。
2. 意図したレコードはSQLでいうと、どんな文か？
3. SQL文をrailsのコードに置き換えるとどんなコードか？


# 処理の流れ

以下の流れで選択したデータがcsv出力されます。

1. ユーザーにチェックしてもらう。（チェックした時の値は、レコードのIDとなるよう設定）
2. 出力ボタンをクリックすると、チェックされたレコードのIDが配列となって渡される
3. IDの配列をもとに、レコードを取得
4. 取得されたレコードをもとに、csvファイルを作成する

### ポイント

#### チェックボックスで選択した値全てを送るためには、name属性に[]を追加する

チェックボックスにて、選択した値を全て送るためには
name属性に[]を追記する必要があります。

実装中、チェックボックスに入れてるのに、レコードが送られない。。。なんてことがあり
ぼくはこれを知らず、2日くらい溶かしました。

railsのform_withを使って作成したので、コードは以下の感じです。

```sample.html.erb
<%= f.check_box "id[]",{class:"checkbox",checked: true},matter.id, false%>
```


#### IN句を使ってレコードを取得する

IN句を使うことで、カラムの中から指定された値と一致するものを取得できます。
今回の場合で言うと、IN句でレコードのIDを指定し、レコードを取得しています。

IN句を使用し、SQL文の発行数を一回に抑えました。

railsでIN句を使用するためには、 whereメソッドを使用します。

```
Matter.where(取得したいカラム:[取得したい値])
```





# 実装から学んだこと

####やり方を真似るより、完成イメージを考えて実装する方がコードを深く知ることができる

自分の意図した機能は、どういう風に動いていることだろうか？と考えることが重要と思いました。

冒頭にも記述したとおり、ぼくは実装する時やり方を探す癖がありました。

ですが、そうするとコードを深く知ることができていないため
今後改修するときや、人に説明するときに深く話せないなんてこともしばしば。

それでは、今後の役にたたないので、

1. 完成イメージをする
2. 逆算して必要なものを考える
3. サーバーサイドから作っていく

と言う流れが、自分の勉強になり、よいのかなと思っています。

####SQL文はなるべく発行数を抑える

エンジニアさんのお話を聞いていると、どうやらSQLを発行する時がシステムに負荷がかかるようです。
そのため、できるだけSQLの発行数を抑える必要があります。

最初はコントローラーに届いたIDの配列を一つずつ取り出し、findで取得と言った感じで実装していました。
コードでいうと以下の感じです。

```sample.rb
params[:id].each do |id|
  matter = Matter.find(id)
  (略)
end
```

しかしそうすると、SQL文が届いたIDの数発行されてしまいます。
そこでIN句を使用し、発行数を少なくしています。

```sample.rb
（略）
matters = Matter.where(id:params[:id])
(略)
```

PFレベルでは問題ないのかもしれませんが、
実務を意識して今後もSQL文は気にしていこうと思っています。（特にORMを使用する時）

# 参考にした記事

[SQLでIN句を使おう!基本からサブクエリ活用方法まで一覧紹介](https://www.sejuku.net/blog/72497)
[checkboxの値を複数postする方法](https://seeknext.co.jp/frontend/checkbox-post/)
[RailsのActiveRecordでwhere in句を使う](https://qiita.com/ultrasevenstar/items/babe4aa7449baa83989b)
QuickSight きめ細かなアクセス制御(FGAC)

## QSでAthenaへ権限付与するとAthenaのいろいろ見えちゃう

全部のデータベースが見えている状態

![スクリーンショット 0003-02-07 11.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/8cf32d04-b3cb-466d-31a8-d8b62de9695b.png)

データベースdefaultの全部のテーブルが見えている状態

![スクリーンショット 0003-02-07 11.19.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/669782bd-e51d-c2ce-6e67-83b6e0600c6a.png)

## これを制限する

あるユーザーには"default"データベースの"elb_logs"テーブルのデータだけ、可視化のデータソースにする
などの制御します。

### IAMポリシー作成

任意の名前で作成。画面右上の"管理ポリシーのインポート"をクリックして、「AmazonAthenaFullAccess」をインポート

![スクリーンショット 0003-02-07 11.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/078b5d28-b318-0bf6-a75c-caa31398a3bb.png)

リソース指定で、Glue Databaseの"default"、Glue tableの"elb_logs"だけ指定

![スクリーンショット 0003-02-07 11.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/a455fa04-af6d-1f04-6f90-2ef9381a555d.png)

### 作成したポリシーをQuickSightユーザーに紐付け

QuickSightの管理ユーザーで管理画面に移動

![スクリーンショット 0003-02-07 11.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/120837d9-c058-72e6-e40f-e2e249326b61.png)

あとは手順に沿って進めます

![スクリーンショット 0003-02-07 11.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/5d533ca0-03fd-5716-a805-3793600ecfb9.png)

さっき作ったポリシーを選択。この後アタッチするユーザーを選択

![スクリーンショット 0003-02-07 11.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/bd8db485-456c-a9db-22a6-f30505df1f85.png)

### 絞り込めた

対象としたデータベース(default)とテーブル(elb_logs)だけが表示されました。

![スクリーンショット 0003-02-07 11.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/715c83de-2034-33dc-1305-215860bb3e53.png)


#### 参考ドキュメント

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/scoping-policies-iam-interface.html
VPCピアリング 概要


* VPCのピアリング機能をまとめる。

## 概要

* 2 つの VPC 間でプライベートなトラフィックのルーティングを可能にするネットワーキング接続。
  * どちらの VPC のインスタンスも、同じネットワーク内に存在しているかのように、相互に通信できる。
![vpc_peering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/f29da132-7312-bea5-7736-81c22ef0bb89.png)


## できること

* **自分が保持する異なるVPC間での接続**
* **別のAWSアカウントのVPCとの接続**
* **別のAWSリージョンのVPCとの接続**
* **複数VPCとの接続**


## 制限事項
* **CIDR ブロックが一致または重複するVPC 間での接続**
    * VPC に複数の IPv4,v6 CIDRブロックがある場合、いずれかのCIDR ブロックが重複している場合は、接続を作成できない。

* **ピアリング先のVPCを経由する通信**
    * VPC A と VPC B の間、および、VPC A と VPC C の間  に VPC ピアリング接続が設定されており、VPC B と VPC C の間には VPC ピアリング接続がない場合 ⇒ VPC A を経由して VPC B から VPC C にパケットを直接ルーティングすることはできない。
        * VPC B と VPC C の間でパケットを直接ルーティングするために、両者の間に別の VPC ピアリング接続を作成する必要がある。
    * 以下の場合も対応できない。
        * ピアリング先のVPCが接続しているVPNを経由したオンプレミスとの直接通信。
        * ピアリング先のVPCのインターネットゲートウェイ/NATを経由したインターネットへの直接通信。

## 接続設定方法

1. **最初に別の VPC とのピアリング接続リクエストを作成する。**
   * アカウント内の別の VPC や、別の AWS アカウントの VPC との VPC ピアリング接続をリクエストできる。
   * リージョン間 VPC ピアリング接続 (複数の異なるリージョンに VPC が存在する) では、リクエスタ VPC のリージョンからリクエストを行う必要がある。
2. **リクエストをアクティブ化するために、アクセプタ VPC の所有者がリクエストを承認する。**
   * リージョン間 VPC ピアリング接続では、アクセプタ VPC のリージョンでリクエストを承諾する必要がある。



## ユースケース

### 複数の VPC をピアリング接続してリソースにフルアクセスする

- 例：会社でA事業部用の VPC と、B事業部用の別の VPC を利用している。両事業部は互いのすべてのリソースにアクセスする必要がある場合。

### 1 つの VPC にピアリング接続して一元管理されているリソースにアクセスする

- 例：会社の IT 部門がファイル共有用の VPC を保持している場合。そのVPC に他部門のVPCからアクセスしたい場合。他部門のVPCはIT部門用のVPCとピアリング接続を行う。

## 参考情報

* [VPC ピア機能とは](https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/what-is-vpc-peering.html)
* [VPCピアリングを作りながら学んでみた](https://dev.classmethod.jp/articles/handson-vpc-peering/#toc-5)
RailsでBootstrapを使用する時に特定のパーシャルを抜き出して使う

## はじめに
Railsアプリケーションを開発する中でBootstrapすべてではなく、特定のパーシャルファイルを`application.scss`にインポートする際にハマったので残しておきます。

## 合わせて読んでいただけそうな記事
以前に私が書いた以下の記私が毛色は似ているのですが、今回は別の記事として記載します。
ぜひこちらもご覧下さい。
[RailsでBootstrapのグリッドシステムのみを使用する](https://qiita.com/supercell1023koeda/items/93dd1951edcbbe3b92e9)

## 環境
`Ruby 2.7.2`
`Ruby on Rails 6.0.3.4`

## 前提
以下を実行してYarnにbootstrapが追加済みであること

```terminal
$ yarn add bootstrap 
```

## ハマった部分
今回の要件で、アプリケーション内のヘッダーの部分のみBootstrapを使用できるようにしたいという話がでたので`application.scss`に以下のように追記をしました。

```scss:app/assets/stylesheets/application.css
省略

@import "bootstrap/scss/nav";
@import "bootstrap/scss/navbar";
```

`rails s`でサーバーを起動して[http://localhost:3000/](http://localhost:3000/)にアクセスしましたが、以下のエラーが画面に出力されてしまいました。


`We're sorry, but something went wrong.`

logをみると以下のように出力されていたので、ビューファイルを確認するが追記はしていないので怪しい部分は見当たらず。。

```
  Rendered collection of homes/_notification.html.erb [0 times] (Duration: 0.0ms | Allocations: 3)
  Rendered homes/index.html.erb within layouts/application (Duration: 3.3ms | Allocations: 1221)
Completed 500 Internal Server Error in 33ms (ActiveRecord: 2.6ms | Allocations: 10983)
```

## 解決方法
- まずはエラーが出るまでの変更箇所を確認する
- 追記したファイルで怪しい部分の割り出し(今回の場合は`application.scss`)
- 実際にコメントアウト等をして再起動してみる
- 対象箇所がわかったら原因の追求

### 仮設 その1
`Bootstrap`を導入したことによる影響か？
→ `yarn add bootstrap`でyarnに追加しただけなので、恐らくエラーとは違う

### 仮設 その2
`application.scss`のimport部分の記述が足りない・もしくは間違っているのか？

今回は 仮設の2番が正解でした。
bootstrapで特定のパーシャルファイルをインポートする際の方法を調べます。

## 結果
bootstrapで特定のパーシャルファイルを抜き出して使用するためには、以下の部分が必要でした。
どうやら最低限のパーシャル部分が必要になるようです。

### 変更前

```scss:app/assets/stylesheets/application.css

@import "bootstrap/scss/nav";
@import "bootstrap/scss/navbar";
```

### 変更前
```scss:app/assets/stylesheets/application.css
#必須パーシャル
@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";

@import "bootstrap/scss/nav";
@import "bootstrap/scss/navbar";
```

普段Bootstrapを使うときはどうしてもテンプレートで`bootstrap.scss`をインポートしてしまうので良い機会になりました。


### 参考記事
[Bootstrap 4 CSS customization
](https://higuma.github.io/bootstrap-4-css-customization/ja/partials.html)
LaravelでPHP8にバージョンアップしたらcallActionでエラー

Laravelのバージョンは8.9.0でPHPを7→8にバージョンアップしたときに出たエラーの解消方法をメモ。
以下のようなエラーが出ました。

```
Error
Unknown named parameter $kind
```

該当行は `vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54` で `Controller.php` の `callAction` メソッドで発生している模様。

```
/**
 * Execute an action on the controller.
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function callAction($method, $parameters)
{
    return call_user_func_array([$this, $method], $parameters);  // ←ここでエラーが起こってる
}
```

どうもコールバック関数をコールする `call_user_func_array` 関数で渡す配列 `$parameters` の形式に問題がありそうで探ってみた。
`callAction` メソッドの `$parameters` をダンプすると以下のような内容でした。

```
array(1) { ["kind"]=> string(1) "1" }
```

PHP7での `call_user_func_array` は配列のkeyが無視されていたので問題なかった様子。PHP8になって名前付き引数が追加されたためkeyが無視されなくなってしまったため起こったエラーのようです。
これにより呼び出された側の引数で、kindという名前の引数が用意されていないため、 `Unknown named parameter $kind` のエラーが出ていたようです。
そこで、名前付き引数でない配列を渡すように子クラスで親クラスの `callAction` をオーバーライドすることにしました。親クラスのメソッドを直接変更してもいいのですが、フレームワークは直接さわらないのは暗黙の了解で。

```
public function callAction($method, $parameters)
{
    return parent::callAction($method, array_values($parameters));
}
````

`$parameters` を `callAction` 関数に渡す前に `array_values` で通常の配列にして渡してあげます。
`array_values` 関数で変換すると以下のような配列を渡すことになります。

```
array(1) { [0]=> string(1) "1" }
```

これはいずれLaravel側が改修するのかな？その時はまた修正しないとなー。
とりあえず解決。
AWS Lambdaを直列に動かす　SQS編

# はじめに
この記事は、社会人２年目 AWS、python初心者が勉強したことをまとめたものです。
間違っている点、改善点等ございましたご指摘いただけると大変ありがたいです。

# この記事について
２つのLambdaを直列に動かす方法について記載します。
直列に動かすとは、Lambda１が正常終了した後Lambda２を動かすことを指しています。

Lambdaを直列に動かす方法として以下の二つが浮かびました。

* Step Functionsを利用
* SQSを利用

過去にStep Functionsを利用した方法を紹介したので、
本記事ではSQSを利用した方法について紹介します。

[AWS Lambdaを直列に動かす　Step Functions編](https://qiita.com/sushilike86/items/5fb3b28c92c27bcd2a49)


# 構築するシステム

メッセージの送受信を行う非常にシンプルな構成です。

func1がキューにメッセージ `func1 is done!!!` を送信します。
func2がメッセージをキューイングし、メッセージの中身`func1 is done!!!`を表示します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066929/35034187-29b3-c12e-0770-25888323f8fa.png)

# 構築手順

## キューの作成

sushi.fifoという名前のfifoキューを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066929/6b3a5e64-8f0c-627f-32ff-5fccd5073717.png)

## Lambda関数作成

SQSのキューにメッセージを送信する`func1`とメッセージを取得し表示する`func2`をそれぞれ作成します。

```python:func1

import boto3

def lambda_handler(event, context):
    sqs = boto3.client('sqs')
    
    response = sqs.send_message(
        QueueUrl='https://sqs.ap-northeast-1.amazonaws.com/1234567890/sushi.fifo',
        MessageBody='func1 is done!!!',
        MessageGroupId='sushi'
    )

```

```python:func2
def lambda_handler(event, context):
    print(event['Records'][0]['body'])
```

## Lambda関数に権限付与
func2にはLambdaメッセージをキューイングするためのポリシー`AWSLambdaSQSQueueExecutionRole`を付与します

func1にはメッセージを送信するため以下のポリシーを作成し付与してあげます。

```json:sushi-queue
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "sushiSendMessage",
            "Effect": "Allow",
            "Action": "sqs:SendMessage",
            "Resource": "arn:aws:sqs:*:1234567890:sushi.fifo"
        }
    ]
}
```

準備は以上です！実行して結果を確認します！

# 成功しました！！！

func2のログから`func1 is done!!!`が確認されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066929/e6043864-3407-6585-22b5-c820719fe572.png)

LambdaをSQSを使用して直列に動かすことに成功しました。
【Laravel】マイグレーション云々

知識を整理するための個人的な備忘録です。

#イントロダクション
マイグレーションとは、テーブル定義を管理する仕組みのこと。
アプリケーション開発にあたってテーブル定義はしばしば変更されるため、変遷するテーブル定義を管理する必要がある。

#コマンド
##マイグレーション生成
```
$ php artisan make:migration create_テーブル名_table
```
`table`オプションをつける事で既存のテーブルに列を追加できる。

```
$ php artisan make:migration add_追加するカラム名_to_追加するテーブル名_table --table=追加するテーブル名
```
###生成されるファイルについて

```php:新規作成の時
public function up() {
  Schema::create(
    //省略
  );
}
```
```php:既存のテーブルを変更した時
public function up() {
  Schema::table(
    //省略
  );
}
```
`up`には`php artisan migrate`で実行される内容を。`down`には`php artisan migrate:rollback`で実行される内容を記述する。

##マイグレーション実行
存在するファイル分は全て実行。

```
$ php artisan migrate
```

##ロールバック
最後のマイグレーション操作をロールバック。

```
$ php artisan migrate:rollback
```
`step`オプションで巻き戻す数を指定できる。

```
$ php artisan migrate:rollback --step=戻したいファイル数
```

#参考
* [Laravel 6.x データベース：マイグレーション](https://readouble.com/laravel/6.x/ja/migrations.html)
* [Laravelにおけるマイグレーションのしくみ](https://www.hypertextcandy.com/how-laravel-migration-works)
社内で数人アンケートとって新言語の勉強ステップをまとめてみた


どうも。GIBの宮本です。あんまりブログぽいのを書く時間もないまま数年が過ぎました。
僕自身も着々と新しい事を学んで、相変わらず2026年には仕事で海外に出るよ。
とか言ってます。あんまり数年前から変わってません。
自分ごとですがぶっちゃけちゃうと、SEO効かせるために色んなことやってきた経緯もあります。
自分のやりたいことのために戦略的に自分なりにメディアを使ってきたつもりです。
2017年ごろに勉強会しまくってたときに思った「日本のITを最強にしたい」この気持ち変わってないです。お金はどう使うかが大事だと学び、今もそう思ってます。日本の未来のためにお金と労力を使う覚悟があります。
ところで今回の記事についてですが、記事を書こうと思ったきっかけは、社内のエンジニアがslackで勉強の仕方を共有し合ってたのを見て思いつきました。
自分達は比較的勉強好きな集団だと思ってたので、2名のエンジニアに聞いてみると勉強会をそこそこ開催してるようで、僕と3人で合計してみると400回くらい(389回2021/1時点)の勉強会を開催してたようです。アウトプットは最大のアウトプットだとざっくり思ってたわけですが、もう少し細かく勉強方法について共有してもらったので、その辺りまとめて残しておこうと思いました。



# 勉強方法(GIB人)

未経験からスタートして一瞬でエースになった現在2年目WEBエンジニア。
基本やってからアプリ作る流れのようだ。Udemyをよく使ってそう。

```
１）基本的な記法学ぶ
↓
２）udemyで一つアプリ作る

新言語はすでに1つ以上言語学んでて、新しい言語学習する場合の勉強方法の場合
2番目はudemyってところが味噌で、既にその言語を使ってる人が書くコードや便利ツール（拡張機能やライブラリ）が一度に学べる
最初の1ヶ月は他の人のコード見ないようにしてる。
```


# 勉強方法(GIB人)

営業もできちゃう3年目のWEBエンジニア。
大体似た勉強方法やってそう。

```
基本的な記法を学ぶ
↓
簡単なプロダクト作る
↓
裏側でどう言った動きをしてるのか学ぶ
他のコードの書き方を学ぶ
```

# 勉強方法(GIB人)

新卒の1年目データサイエンスとかWEBをやるエンジニア。
大体みんなと変わりないプロセスでやってる。

```

体力があれば基礎的な技術を積極的に習得
　　└ 長期休暇や定時で帰れる状態が続く場合は、
　　　気力が必要なのに目に見えるアウトプットが出ないものを進めます。
　　　 例えば学習中のC言語関連がそれにあたります。
　　　C/C++言語は趣味の組み込みや業務での活用など、
　　　かなり先の話になりますが、将来的には活きる技術と(現状)信じています。
　　　しかし、そこまでの道のりが長くアウトプットも「Pythonでよくね？」と
　　　自問するものが続いており、はっきり言って「簡単にプロダクト作る」ことへの
　　　モチベーションがかなり低いと言わざるをいません。
　　　なので牛歩ではありますが気力が高まっているときは
　　　積極的にそのようなアウトプットが出にくいものを率先して勉強しています。
　　　(最近、SQLの勉強をしていたりするのはそれです。残業がないので。)
アウトプットは目に見える形で
        └勉強会や何か目に見える形でアウトプットを出します。
```

# 勉強方法(GIB人)

プログラミングが趣味の4年目のWEBエンジニア。
本を愛用してるようだ。

```
本を買う（巻末にサンプルプロジェクトの演習がついているもの）
↓
1章（最低限の基本の文法説明がある章）をエディタで書きながら学ぶ
↓
間の章を飛ばしてサンプルプロジェクトを作成する 
↓
作成しながら出てきた機能を該当章を参照しながら実装する
```



# 勉強方法(GIB人)

1000万ユーザー以上のサービスを支えてきた、10年くらい目のWEBエンジニア。
独学でツライ思いをしてきたんだろうなぁ。


```
基本的な文法を覚える(使っている言語との特徴の違いなど比較する)
↓
書籍の内容で気になる部分を写経して動かしてみる
↓
さっと読み終える
↓
サンプルプロダクト作る


サンプルコードが間違っていたorバージョン違いで動かないときはよくエラーになってなかなか進まない現象がつらい

```



# 勉強方法(GIBの宮本)

僕は強制されないと自分の意思だけではできないので、イベントを開いてる。

```
1)基本構文を写経
↓
2)勉強会のイベントを立てる
↓
3)勉強会駆動で1年くらい開発を進める
```


# 勉強方法(テッククエストのうっちー)

プログラミングスクール[テッククエスト](https://tech-quest.club/)のうっちーとも仲がいいので聞いてみました。

```
大体同じ勉強方法をしてるとのこと。
他の言語で知っているアルゴリズム(if文、配列にプッシュ、辞書etc)をそのまま使って、ToDoアプリなどを作ることが多い
それが組み上がったあとに、ちらほら文法のまとめ記事などを見ながら「パターンマッチで書いた方がきれいに書けそう」「クラスでこういうことができるのか」などを反映させていくイメージ
「言語独自のコードの書き方」はあくまで「手段」なので、まずは「目的(プロダクトコード)」を用意するのが優先
```

# 結論

大体がこのステップであることがわかりました。

```
1. Udemyか書籍を使って基礎を学ぶ
2. アプリ作る
```

参考になりそうであればやってみてください。何か他にいい案あれば教えてください。
[Unity3D] プレイヤーに攻撃アニメーションの実装

プレイヤーに攻撃アニメーションをつける
---
1, 攻撃アニメーションをドラッグし、idleとwalkからmake transitionをつける。（idleには帰りのmake transitionをつける）
![583D4E77-3273-4560-A846-540974191C69_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/deb79ff3-441c-527e-bf71-b4badcccf306.jpeg)

2, ParametarsでTriggerでAttakを作成し、Conditionsに設定する。
各Transitionに設定する。（idleに帰るTransitionは設定なしでOK）
HasExitTimeのチェックを外し、Transitiopn Duratorは0にする。
![3760A9E4-71C5-43B2-97F5-9E67EB866E50_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/8d4c4096-2e8a-33e1-f895-d119abd15761.jpeg)

![138EC850-FA60-4C56-A537-1CF6D0050531_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/3d1c8a17-c7f8-1329-c963-a7fba315d158.jpeg)

![466D9E8D-C6A4-49A0-BD58-8D0EDB98A019_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/e765d96e-074e-3228-7094-2fcb55a898e8.jpeg)

3, idleアニメーションを選択し、Transitionsの順番を変更する。
（idleから攻撃を優先する）
![CF39EC2B-48B3-4832-929E-566A2FCA7F6F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/3bcf58cc-be4a-06e6-14bb-003c773a65df.jpeg)
４, PlayerManagerに下記のスクリプトを書く
(Vを押すと攻撃アニメーションが発動する)

```C#:PlayerManager
//攻撃
        if (Input.GetKeyDown(KeyCode.V))
        {
            animator.SetTrigger("Attack");
        }
```

攻撃しながら移動できてしまうバグの修正
---
１, Attackを選択し、AddBehaviourからPlayerAttackBehaviourを作成する
![805A949D-6ED7-4CF1-B1A7-65E7174F164D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/e6dbbeb5-9136-5ec1-9702-ab286ca34c9f.jpeg)

2, PlayerAttackBehaviourに下記のコードを記述する

```C#:PlayerAttackBehaviour
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerBrooklynBehaviour : StateMachineBehaviour
{
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<PlayerManager>().moveSpeed = 0;
    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {

    }

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<PlayerManager>().moveSpeed = 3;
    }

    // OnStateMove is called right after Animator.OnAnimatorMove()
    //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    // Implement code that processes and affects root motion
    //}

    // OnStateIK is called right after Animator.OnAnimatorIK()
    //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    // Implement code that sets up animation IK (inverse kinematics)
    //}
}
```