OmniAICreator/Qiita-1.07M huggingface dataset:
モーツァルトをlightweight-ganで生成した


## はじめに
タイトルだけだと何言ってるのかわからないと思うので補足していきます。今回、僕が作成したのは<strong>楽譜</strong>です。lightweigth-gan という手法を用いてモーツァルトの楽譜の画像データを生成させました。
## lightweight-gan とは
- めっちゃ軽いGAN
    - 画像100枚程度でok
    - GPU一枚だけでもうごく
- コマンド１行だけで実行
    - codeは書かなくていい  
 
という比較的簡単に始められる手法？で[ここ](https://github.com/lucidrains/lightweight-gan)から始めることができます。

## 実行環境
使ったマシンのスペック
- OS windows10pro
- CPU i7 9700k
- GPU RTX2060
- RAM DDR4 16GB
の自作pc 

## 下準備
今回、実行したパソコンにpythonが入っていなかったのでほんとに最初からやることになりました。

step 1 pythonをインストール
　僕の場合はanacondaからインストールしました

step 2 CUDAをインストール
　[nvidiaのページ](https://developer.nvidia.com/cuda-toolkit)からダウンロードできます。僕の場合はGPUがCUDAに対応しているの知っていましたが、お使いのGPUがCUDAに対応しているかは[ここ](https://developer.nvidia.com/cuda-gpus)で確認できます。

step 3 lightweight-gan のインストール
`pip install lightweight-gan`
これだけでokです。

step X pytorch のCUDAのバージョンを変える
　最近anacondaでpythonをインストールした場合githubのREADME通りに実行しようとすると<font color="red">エラーメッセージ</font>で<strong>CUDAが使えないよ、インストールされてるかチェックして</strong>といわれました（英語だったので意訳。すいません、このエラー時の画像がありません。）
解決方法ですが、pytorchのCUDAのバージョンを(おそらく)10.2にし、pipを使いインストールしなおしました。

後は画像を集めるだけです。

今回僕はモーツァルトの楽譜ということで
[IMSLP](https://imslp.org/wiki/Main_Page)
というところからpdfをダウンロード、その後jpgに変換し約100枚の画像を集めました。
~~IMSLPにはもっと多くの楽曲がありましたがダウンロードするのがあまりにもめんどくさかったので大体100枚集めたらやめました。~~

画像が集め終わったらあとは実行するだけです。

## 実行
`$ lightweight_gan --data ./path/to/images --image-size 512`
これだけで実行できます。

ここで問題になってくるのが軽量といってもものすごく時間がかかることです。コマンドを走らせると最初は何も進んでいないように見えますが、12時間で10%くらいは進みました。
そこで推奨されているかわかりませんが(途中でやめる場合は自己責任でお願いします。僕が大丈夫だったからと言ってみんな大丈夫とは限りません)途中でやめることもできます。僕は30%行ったときにctrl + CとEnterでコマンドを停止させました。

## 画像の生成
`$ lightweight_gan \
  --name {name of run} \
  --load-from {checkpoint num} \
  --generate \
  --generate-types {types of result, default: [default,ema]} \
  --num-image-tiles {count of image result}`

これで生成できますが、何を入力すればいいかわかりづらいので、実行時に何も設定せず実行した僕の場合は
>
{name of run} : default
{checkpoint} : /result/default に数字の名前の画像がたくさんあると追うので一番よさそうなもの(数字が大きければ大きいほど僕の場合よかった)の数字
{types of result, default: [default,ema]} : この行は[default,ema]でいいと思う　この場合はdefault とemaが生成される。
{count of image result} : 何枚作るのか　お好みでお願いします。

にしました。

## 参考にさせていただいたページ
[lightweight-gan](https://github.com/lucidrains/lightweight-gan)
これはpytorch版を作成した人のgithubへ飛ばされます。
[ligthweigth-ganとのであい](https://qiita.com/resnant/items/75543fb5047e90dd8202)
去年のカレンダーでたまたま目にしたページ。
[CUDA のインストール方法](https://imagingsolution.net/program/cuda/cuda-download-install/)

## このページにリンクのあるページ
[CUDAのダウンロードページ](https://developer.nvidia.com/cuda-toolkit)
[CUDA対応か確認できるページ](https://developer.nvidia.com/cuda-gpus)
[IMSLP](https://imslp.org/wiki/Main_Page)

## 最後に
最後に完成品で一番それっぽい写真をお見せします。![generated-01-12-2021_02-32-05-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752968/284b945a-fd1d-af4e-e96e-7d08254fdea1.jpeg)

最後までお付き合いいただきありがとうございました。
PHP strpos()関数の注意点

文字列の中に特定の文字列があるかどうかの判定を行うために`strpos()`を使用するが、注意が必要である。

#strpos()

```php
if(strpos($対象となる文字列, $特定の文字列)){
    //省略
}
```

#返り値
####特定する文字列があった場合
　→最初の文字のインデックス番号
　　例：helloの特定文字列、ellの返り値は1

####特定する文字列がない場合
　→(bool)false

#注意（これが今回のメイン）
strpos('hello', 'ell')
の返り値は1。
しかし
strpos('hello', 'hell')
の返り値は0になる。（当然だけど）

だからif文を使用する場合、'hell'という特定の文字列があったとしても、
結果はfalseになる。（返り値が0だから）

#解決策
返り値はint型もしくはfalse(bool型)だから、この両方をtrueの結果にしてあげる必要がある。

```php
$i = 'hello';
if(strpos($i, 'hell') !== false){
    echo 'including';
}else{
    echo 'not including';
}

//結果　including
```

```php
$i = 'hello';
if(strpos($i, 'ell') !== false){
    echo 'including';
}else{
    echo 'not including';
}

//結果　including
```

```php
$i = 'hello';
if(strpos($i, 'abc') !== false){
    echo 'including';
}else{
    echo 'not including';
}

//結果　not including
```

```php
$i = 'hello123';
if(strpos($i, 'o1') !== false){
    echo 'including';
}else{
    echo 'not including';

//結果　including
```
テーブルの結合

テーブルの結合には、 INNER JOIN テーブル名 ON 条件 キーワードを使用

mysql> SELECT * FROM books INNER JOIN chapters ON books.id = chapters.book_id;

SELECT * FROM books
SELECT * FROM books は単純に books テーブルの一覧を表示

INNER JOIN chapters
INNER JOIN chapters が接続されることで、テーブルが結合

ON books.id = chapters.book_id
そこで、 ON books.id = chapters.book_id を加えて、この条件に沿わない結合パターンは消す

テーブルの結合は一対多、多対多で活躍する
ORDER BY

ORDER BY 並べ替え基準となるカラムと指定すると、小さい順に並べ替えて表示させることができます。これはテーブル内の順番が変わるのではなく、あくまで表示上そう見えるようにできるだけです。

mysql> SELECT * FROM bookstore.books ORDER BY price;

大きい順に並べ替えたい場合には、DESCをつけます。

mysql> SELECT * FROM bookstore.books ORDER BY price DESC;
SQL CRUD操作

INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);

SELECT カラム名 FROM テーブル名;

UPDATE テーブル名 SET カラム名1 = 値1, カラム名2 = 値2, ...

DELETE FROM テーブル名

mysql> SELECT * FROM bookstore.books WHERE price > 1500;

mysql> UPDATE bookstore.books SET price = 1200 WHERE price = 1000;

mysql> DELETE FROM bookstore.books WHERE title = "はじめてのCSS";
AWSのポリシーのアタッチ・デタッチのタイムラグに注意しよう

有名な話なのか分かりませんが、**AWSのポリシーのアタッチ・デタッチに分単位のタイムラグがありました。**
お陰様で時間を無駄にしたというか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/d1cb7a0d-51a4-d2d4-c040-67efd7bce7a8.png)

題材は [AWS LambdaからLambdaを非同期で呼び出す(Python)](https://qiita.com/ume1126/items/8170a10fad6b21f0f54a#comments) です。

Lambda関数から他のLambda関数を呼び出すというもので、権限の設定が必要になります。

ついつい、（開発初期は）ルートユーザでやっちゃったりして、（一般のIAMユーザだと権限絡みで躓いてイライラするので）これはいけない、ということで一般のIAMユーザで作業した訳なんですけれども。

記事を参考にしてやってみて、「AWSLambdaRole」というポリシーをつけてみたんですが、一向に権限エラーが解消されない。

仕方なく、他の方法で権限をゴテゴテつけて、うーん、ダメだなぁ、と思いながらもう一度（何も変更せず）テストをしてみると、今度はグリーン（エラーなし）に。

その後、何度かアタッチとデタッチを繰り返して、ずいぶんタイムラグがあるなぁ、と思った次第です。

1:44:55に権限付与して、5秒間隔でテストをしてみると…1:49:45に変更が反映されました。5分弱ですね。
続いて、権限を削除してみます。

1:50:55に権限の削除が完了し、同じようにテストです。1:54:25に変更が反映されました。3分30秒ですね。

1、2秒のラグならそんなもんかな、と思いますが、数十秒単位だと操作が間違っていたかな、となって時間が無駄になるので、なんとかして欲しいところではあります。
Mac mini (M1, 2020) で LaTeX の環境構築 (VSCode)


前の記事 [競プロ環境構築](https://qiita.com/cubinglover/items/5b4d05ca0f77c60f1d79) に続きメモです。

参考にした記事です
https://qiita.com/uoyuki/items/c172235a0caf2f637ea4

##環境
* Mac mini (2020, M1)
* macOS BigSur 11.1

##手順
* VSCode の拡張機能をインストール
    * TeX Workshop
* TeX をインストール & アップデート

```zsh
% brew install --cask tex-no-gui
% sudo tlmgr update --self --all
```
無限時間かかります。

* setting.json に追加

```json
    //Latex
    "latex-workshop.latex.tools": [
        {
            "command": "ptex2pdf",
            "args": [
                "-interaction=nonstopmode",
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOCFILE%.tex"
            ],
            "name": "ptex2pdf"
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "ptex2pdf",
            "tools": [
                "ptex2pdf"
            ]
        }
    ],
    "latex-workshop.latex.autoClean.run": "onFailed",
    "latex-workshop.view.pdf.viewer": "tab",
    "editor.renderControlCharacters": true,
```

* VSCode を終了して (ウィンドウを閉じるだけではだめ) 再起動

できるようになりました、えらい。

##おわりに
ユーザスニペットをまた構築します。
k8sのNamespaceが消えない問題


消しても永遠に消えないPod...

```
% kubectl get ns
tmp                  Terminating   65m
```


昔のCRDが残っちゃってるので、それを消せばいいらしい

```
%  kubectl get apiservice | grep False
v1beta1.admission.certmanager.k8s.io        cert-manager/cert-manager-webhook   False (FailedDiscoveryCheck)   589d
% k delete apiservice  v1beta1.admission.certmanager.k8s.io
apiservice.apiregistration.k8s.io "v1beta1.admission.certmanager.k8s.io" deleted
```

ただ今回のtmp namespaceに関しては、[こちら](https://qiita.com/tettsu__/items/86091804aca424632f07) の方法を使う必要があるらしい。
次回からは、普通に消えてくれる

参考
* https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-408599873
* https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-678704071
* Terminatingになったまま消えないNamespaceを削除する <br>
 https://qiita.com/tettsu__/items/86091804aca424632f07
Webpacker::Manifest::MissingEntryError

```
rails generate controller home top
```
などのコマンドで適当に作成したページを開くと、以下のエラーが発生。
![スクリーンショット 2021-01-04 21.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/909963/14cc7593-ca49-5fc4-52ee-352790ba3836.png)

ターミナル上は以下の表示。

```

Webpacker can't find application in アプリ名/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
```
``・manifest.jsonが見つからない。``
``・views/layouts内のapplication.html.erbの９行目がおかしい。``

この２点を解決するために色々調べて試したが、改善せず。
調べた記事の中に、nodeのverが関係しているんじゃないかな〜的な物があったので、nodeのverを変更するついでに、webpacker installのために導入したnode,yarnやらを再installしてみた。
node verは最新版から、stableでinstallしたv14.15.4に変更。
下記の手順で実行すると、解決できました。

１．nodeのver変更するため、homebrewで管理しているnodeをuninstall。
　　(homebrewでnodeのver変更する方法がわからなかったので。)
　　nodebrewでstable版を再インストール。
２．yarn/icu4cも一旦uninstall。再度homebrewでインストール
　　※nodeはnodebrewでinstall済みのため、--ignore-dependencies　オプションをつけること。

```
brew install yarn --ignore-dependencies
```
icu4cは--ignore-dependencies不要。

```
brew install icu4c
```
３．rails newで新しいプロジェクトを作成。
　　このときすでにnode,yarn,icu4cがinstallされていれば、勝手にwebpackerもinstallされる。
４．rails sして、適当に作成したページを確認するとエラー発生せず。


これのせいで全く作業が進まなかったので改善してほんと良かった。

rails6以降は標準でwebpackerが導入されるようで、私のrailsもv6.0.3.4です。
今回の原因は、nodeのverの相性が悪かったのかな〜と思っていますが、そういうことにしときます。
IQと偏差値の換算方法

ここでの偏差値はIQテストにおけるものであり、大学入試テストなどの学力試験における偏差値とは異なることを理解しておいてください。


# IQとは
IQ（知能指数）とは知能検査の結果を表す指標の一つで、クイズ番組などでよく出てくるやつです。昔は
$$IQ=\frac{精神年齢}{実年齢}*100$$
で計算していたそうですが、現在は

$$IQ=\frac{個人の得点ー同じ年齢集団の平均点}{同じ年齢集団の標準偏差}*15+100$$
で計算されます。
ただし、15の部分は方式によって異なるようです。(ビネー式の場合は16、ウェクスラー式の場合は15、キャッテル式の場合は24を使用します。)

特にクイズ番組などでは、IQを高く見せるためにキャッテル式の24分の1を用いることが多いようです。

さて、今回用いるメンサノルウェーIQテストは15分の1を用います。

# 偏差値とは
高校受験や大学受験でよく目にする偏差値ですが、以下の式で計算されます。
$$偏差値=\frac{個人の得点ー平均点}{標準偏差}*10+50$$

ほとんどIQの計算方法と同じであることがわかると思います。

# 今回用いるテスト
高IQ集団と呼ばれるメンサのノルウェー支部がメンサの入会試験と似た問題を公開してくれています。
https://test.mensa.no/
皆さんもこのサイトでIQを調べてみてください。

# 偏差値とIQの換算
$$IQ=\frac{個人の得点ー平均点}{標準偏差}*15+100$$より、

$$個人の得点ー平均点=\frac{(IQ-100)*標準偏差}{15}$$
これを偏差値の計算式に代入すると、

```math
偏差値=\frac{個人の得点ー平均点}{標準偏差}*10+50\\
=\frac{\frac{(IQ-100)*標準偏差}{15}}{標準偏差}*10+50\\
=\frac{(IQ-100)*10}{15}+50\\
=(IQ-25)*\frac{2}{3}
```
となります。
逆に、偏差値からIQを求めたい場合は

```math
IQ=偏差値*\frac{3}{2}+25
```
で求められます。

# 換算表
![スクリーンショット 2021-01-12 2.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118594/1a595876-5254-63a4-df06-e4e8c1622683.png)
next.jsにfirebaseのgoogle認証を取り入れる

#この記事について
Next.jsプロジェクトでのGoogleログイン機能の備忘録です。

#やり方
Vercelが公開しているgithubのexamplesの「with-firebase-authentication」のREADMD.md通りにやればよい。

README.mdに書いてある下記コマンドを実行すると

```
npx create-next-app --example with-firebase-authentication with-firebase-authentication-app
```
プロジェクトが複製される。

FirebaseAuth.jsを以下のように修正する。

```components/FirebaseAuth.js
  // signInOptions: [
  //   {
  //     provider: firebase.auth.EmailAuthProvider.PROVIDER_ID,
  //     requireDisplayName: false,
  //   },
  // ],
  signInOptions: [firebase.auth.GoogleAuthProvider.PROVIDER_ID],
```

あとは、README.meの「Configuration」通りにやればOK！

#参考サイト
https://github.com/vercel/next.js/tree/canary/examples/with-firebase-authentication

#感想
「Next.jsで（Firebaseを使った）Googleログインの方法」を探していたのですが、
VercelのGithubのサイトが一番分かりやすくて、エラーなくすんなりとできました！
めっちゃ簡単！

これで、Googleアカウントを使ったサインアップとログインができることは確認できたけど、
各ユーザーに紐づいた情報を登録したり、取得したりするのはどうやるんだろう？
明日からもまた調べよう。
Cloud9+Railsでmysqlを導入する際に手間取った記録

・Cloud9＋Rails+MySQLでRailsアプリケーションを作成を試みる。
・MySQLの導入に手間取る。
・rails newをすでに実行していたため、Gemfileにmysqlを記述し、bundle installを実行するとエラー

```
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.
```

#手順
https://qiita.com/kumas/items/e2c647dca08fd46b5c7a
こちらを参考にアプリケーションの作成をしましたが、知識不足のため、手間取りました。

①作成したディレクトリに移動して、rails newを実行

②Gemfileにて

```
gem 'sqlite'
#デフォルトのsqliteをMySQLへ変更

gem 'mysql'
```

③bundle installを実行すると上記エラー

④

``` 
sudo yum install mysql-devel
```
で解決するとのことだが、これもエラーで返されてお手上げ。。

#解決した方法

```
sudo apt-get install libmysqld-dev
```

「そういや、cloud9のenvironments作成時にUbuntu選択してたなぁ。そのエラーかな？」
調べるとそうでした。というか基本的なことがわかってなかった。

https://qiita.com/ryota-0906/items/2da9dcd54a6840b59364
https://qiita.com/hal-bo/items/1e0568120c545bf723c6

Ubuntu環境でパッケージ形式の違うRedHut系のyumコマンド使っていたら、そりゃエラーを返されますよね。
超絶基本的な話ですが、Linuxのパッケージファイルの形式は理解しておかないといけない。
データベースサーバー

起動

sudo service mysqld start

起動状態確認

sudo service mysqld status

停止

sudo service mysqld stop

データベースサーバへの接続

mysql -u root

データベースサーバからの切断

mysql> exit

データベースの作成

mysql> CREATE DATABASE ？？？;

データベース一覧の確認

mysql> show databases;

データベースを削除

mysql> DROP DATABASE ？？？;

操作するデータベースを選択

mysql> USE ？？？;
[TypeScript] nullとundefined、! と ? の意味

トピックに関する個人的ブックマークでございます。

#nullとundefined

リンク ： [nullとundefined](https://typescript-jp.gitbook.io/deep-dive/recap/null-undefined "nullとundefined")

>JavaScript(と、TypeScript)は、nullとundefinedという2つのボトム型(bottom type)があります。これらは異なる意味を持っています。

#TypeScriptのコードレビューを依頼された人のための!と?の解説

リンク ： [TypeScriptのコードレビューを依頼された人のための!と?の解説](https://dev.classmethod.jp/articles/typescript-assertions/ "TypeScriptのコードレビューを依頼された人のための!と?の解説")

>TypeScriptのコードレビューをしていて、 ! と ? の意味を改めて確認したら意外とややこしかったのでまとめておきます。

>ご注意: 本記事では、nullとundefinedを厳密に区別せず、どちらも含めてnon-null/nullableと表現しています。
[AWS]CloudFormationのスタックが消せない解決例

## どんな様子だったか
下記のサイトのCloudFormationを利用しようとして失敗したため、そのスタックを削除しようとしたらDeleteFaildになって失敗した
https://classmethod.github.io/ci-cd-hands-on-ecs/delete-environment/

## 原因
CloudFormationのスタック削除による一括削除だとVPCの機能の一つのセキュリティグループを削除できない
↓
セキュリティグループが残っているとVPCが削除できない
↓
VPCが残っているとCloudFormationのスタック削除が成功しない

## 解決策
VPCの使用していないセキュリティグループを手動で削除した後にCloudFormationのスタック削除を行うと成功します。

## 原因究明に繋がった記事
公式のトラブルシューティング記事：
https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-beanstalk-deletion-failure/

↑のなかにセキュリティグループは手動でないと消せないと書いてあり、自分も確認してみたら解決に繋がったという流れだった。
データベースとは

データベースは、たくさんのデータを一元管理し、データの保存、取得することに特化したソフトウェア（ミドルウェア）。データベースは データを永続的に保存 するのに適している。アプリケーションはデータを処理しますが、保存することができない。

最も利用されている種類はリレーショナルデータベース。リレーショナルデータベースを管理するシステムを、リレーショナルデータベース管理システム（RDBMS）

リレーショナルデータベースの特徴には下記の3つ。

・テーブルは、カラム(縦)とレコード(横)で構成される
・カラムに、保存されるデータの制約を設定できる
・データの保存や取得などの処理に、SQLという言語を使用する。

ユーザーテーブル(users)から全員分の名前(name)を取得するには、下記のような命令文。

select name from users;
【Rails】 enumの使い方（日本語表記の導入）


今回はECサイトの制作をしていた際の注文ステータスのカラムにenumを使用し、プルダウン表記を活用しました。enumを使用することが初めてであったので、忘れない様に自身のメモとして記事を残したいと思います。
以下の記事は実装の際に参考にさせていただきました。

(参考記事)
・【初心者向け】i18nを利用して、enumのf.selectオプションを日本語化する[Rails]
https://qiita.com/tanutanu/items/d44a92425188a4489ec6
・[初学者]Railsのi18nによる日本語化対応
https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5

開発環境
---
ruby 2.6.3
Rails 5.2.4.4

Gemfile
-

```Gemfile.
gem 'enum_help'
```
```terminal.
bundle install
```
まずは、enumを使用するのに必要なgemをGemfileに記述します。
上記のように記述ができたら、ターミナルでbundle installのコマンドを実行します。

model.rb
-
```Ruby:order_item.rb
 enum production_status: {cannot_be_started: 0, waiting_for_production: 1, in_production: 2, production_completed: 3}
```
次にモデルのファイルに記述を加えます。
enum カラム名: {名前(今回はステータス名): 0, 名前(今回はステータス名):1 ... n }
enumの後には、enumを使用するカラム名と波カッコ内にはその名目（英語表記）と各値に0から順に数字を振っていきます。
このように各名目に数字を対応させるため、テーブルを作成する際のenumのデータ型はinteger(整数型)となります。

日本語の設定に変更する
---
```config/application.rb
module NaganoApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    # config.load_defaults 5.2
    config.i18n.default_locale = :ja #この1行のみ追加
    
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end
```
この1行の記載がないと日本語表記に変換されません。

```ja.yml
ja:
  enums:
    order_item: 
      production_status:
        cannot_be_started: "着手不可"　　　　
        waiting_for_production: "制作待ち"
        in_production: "制作中"
        production_completed: "制作完了"
```
先ほどのmodelファイルの内容を日本語訳をして記述します。
断層やカラム名の記述に誤りがあると、表示されなくなってしまいます。

viewに表示する
---
```
<%= form_with model: @order_item, url: admin_order_item_path(order_item), method: :patch, local: true do |f| %>
　<%= f.select :production_status, OrderItem.production_statuses.keys.map {|k| [I18n.t("enums.order_item.production_status.#{k}"), k]} %>
　<%= f.submit "変更" %>
<% end %>
```
フォーム内にプルダウン表記でステータスを変更できるようにしました。
f.select以降は以下のような構成になっており、こちらもカラム名の単数、複数表記を誤ると表示がされなくなります。
:カラム名（単数形）, モデル名.カラム名（複数形）.keys.map {|k| [I18n.t("enums.モデル名.カラム名（単数形）.#{k}"), k]} %
keys.map以降の表記により、設定されているenumの値の0から順に選択肢を入れてくれているようなイメージになります。


enumのメリット
---
今回のようにステータス管理など頻繁に更新が必要な際には特に有効な機能になります。
数値で管理を行うため、何か変更する必要がある時でも修正が容易に行えることが大きなメリットです。
model側とviewに必要な記述を少し書き加えるだけで、アプリケーション全体に変更を行うことが可能です。

終わり
---
今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になれば幸いです。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
C#による音声の同期・非同期再生

# はじめに
この記事は，C#による音声の同期・非同期再生についてまとめた記事である．
主にC#入門者である自分の知識整理のためにまとめたものである．

# 同期再生・非同期再生とは
**同期再生**とは，音声の再生が終了まで他の処理を行わない再生方法である．
一方，**非同期再生**は，音声をバックグラウンドで再生する再生方法であるため，再生後も次の処理を行う．
音声を再生中に他の処理を行いたい場合，同期再生で再生してしまうと音声の再生のみ行われるが，非同期再生だと音声の再生と他の処理が同時に行える．

# 同期再生


```C#:synchro.cs
static string Method1(){
  //処理１を行う
  Thread.Sleep(3000);

  //処理２を行う
  return "hogehoge";
}

static void Method2(){
  //処理１を行う
  Thread.Sleep(3000);

  //処理２を行う
}

static void Main(string[] args){
  string result = Method1();
  Method2();
  Console.WriteLine(result);
  Console.ReadLine();
}
```


# 非同期再生


```C#:asynchro.cs
static async Task<string> Method1(){
  //処理１を行う
  await Task.Delay(3000);                       //(2)

  //処理２を行う
  return "hogehoge";
}

static void Method2(){
  //処理１を行う
  Thread.Sleep(3000);

  //処理２を行う
}

static async Task Main(string[] args){
  Task<string> task = Method1();                //(1)
  Method2();                                    //(3)
  Console.WriteLine(task.Result);               //(4)
  Console.ReadLine();
}
```

(1)
関数Method1に入る．
Task型かTask型のジェネリック．
Task型は、非同期メソッドの状態や戻り値を知ることができる．
<>は戻り値の型．

(2)
同期からの変更点．
awaitは、Task型を返す非同期メソッドが終了するまで待つ(3000ms待つ、という非同期メソッド)．
**awaitが付いているメソッドが実行されると一旦そのメソッドを抜け、メインに戻る**．
※awaitは戻り値がTask型のメソッドにしか付けることができない．
「Task.Delay」→引数で指定した秒数を待ち，その実行状態をTask型で返す非同期メソッド

(3)
Method1を一旦抜けて実行される．
その間にもTask.Delay(3000)は別スレッドで実行中．
**Task.Delay(3000)の処理が終わったら、Method2が途中でもMethod1に戻り、文字列を返す**．

(4)
asyncメソッドの戻り値はTask型であるため、Resultプロパティで戻り値を取得できる．
Next.jsでのtailwindcssの導入の仕方


#流行りのスタイルのtailwindcssの導入の仕方(Next.js)

## `npx create-next-app next-js`で導入したファイルに

### 1.npm install


```
npx create-next-app . --use-npm

npm i tailwindcss

npx tailwindcss init -p
```

### 2.🗂stylesのglobal.cssの中身を書き換える

```
@tailwind base;
@tailwind components;
@tailwind utilities;
```
### 3.🗂pagesにimport文を追加
```
import '../styles/globals.css';
import 'tailwindcss/tailwind.css';
```
### 4.下記のサイトを参考にclassName内に記述  
[tailwindcssのチートシート](https://nerdcave.com/tailwind-cheat-sheet)

```:[例です]
<div classnName="flex justify-center items-center flex-col min-h-screen text-gray-600 text-sm font-mono"></div> 
```
LaTeXの日本語フォントがPDFビュワーによって汚くなってしまうとき

ビュワーによって見た目が変わったり，漢字が汚くなったりしませんか？
僕はGoogle DriveのPDFビュワーでみた時が最悪でした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/b06e233e-d6c0-c332-7ecc-3cd7438b9675.png)


こんな時，和文フォントを埋め込む設定になっていない可能性があります．しましょう．

```shell
kanji-config-updmap-sys ipaex
```
Linuxであればroot権限が必要です

```shell
sudo kanji-config-updmap-sys ipaex
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/a8b75e16-57e0-0b76-303a-a5ae254521df.png)

きれいになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/6753562b-15c3-63dc-8869-e0a3e93fd1d0.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/a107cd9f-6b0f-bb0e-9b88-7cb7cb36df62.png)
ショートカットを利用したAmazon Musicのプレイリスト自動再生

# 注意
初回の投稿からかなりの時間が経過しているため、Amazon Musicの仕様が変更されている可能性があります。
そのため、実際に動作しない場合がありますのでご注意ください。

# サマリー
ショートカットを利用してできる限り少ない動作でAmazon Musicのプレイリストを自動再生できないかと考えた。
その結果、プレイリストの共有用URLをいじると開く際に自動再生できるようになることがわかり、またURLを投げるアプリはOpenerを使うことで、実質ワンタップで音楽の自動再生を可能にした。

# プロローグ
iPhoneのショートカットの音楽再生および操作はデフォルトの音楽アプリ **"ミュージック"** のみしか対応していない。そのため、今主流となりつつあるSpotify・LINE music・Apple Musicなどの **ストリーミングサービス** や **サードパーティの音楽アプリ** を私が愛用しているショートカットアプリから操作することができないので不便を感じていた。この記事にたどり着いた皆さんもきっとそう感じているに違いない。

#Bluetoothイヤホン接続からの自動化を完成させたい
特に不便を感じていたのは自作の音楽自動再生ショートカットである。Bluetoothイヤホンの接続をトリガーとしてAmazon Musicを開くというもので、目標はプレイリストの再生まで持っていくところである。しかし、前述の通りアプリの操作ができないため、アプリを開くところ止まりで音楽の再生まで不可能であった。が、最近Amazon Musicにおいて、プレイリストの再生まで持っていく方法が判明した。

# 方法
方法というか先に結論としてこの記事で伝えたいことは次のこと

 - プレイリストの共有用URLをいじると、URLを開く際に自動再生できるようになる
 - URLを投げるアプリはSafiriでもChromeでもなく、Openerを使う

次項から詳しく説明していきます。

# 実際にショートカットを作成する

## 1. プレイリストの共有リンクを取得する
Amazon Musicで作成したプレイリストの詳細からプレイリスト共有用のリンクを取得する。
`プレイリスト右側の… > シェアする > リンクをコピー`
この時、プレイリストはマイプレイリスト・既存のプレイリストのどちらでも構わない。

## 2. リンクをいじる

ここが肝となる工程。
取得したリンクはこのような構造になっている。

```:マイプレイリスト
https://music.amazon.co.jp/user-playlists/@@@@@@@@@@?ref=dm_sh_～～～～～～～
```
```:既存のプレイリスト
https://music.amazon.co.jp/playlists/@@@@@@@@@@?ref=dm_sh_～～～～～～～
```

このリンクの`?`以降は不要なので全て削除する。

```:マイプレイリスト
https://music.amazon.co.jp/user-playlists/@@@@@@@@@@?
```
```:既存のプレイリスト
https://music.amazon.co.jp/playlists/@@@@@@@@@@?
```
そして、`?`に続いて`do=play`を書き込む。

```:マイプレイリスト
https://music.amazon.co.jp/user-playlists/@@@@@@@@@@?do=play
```
```:既存のプレイリスト
https://music.amazon.co.jp/playlists/@@@@@@@@@@?do=play
```

これで準備完了。先ほどの未加工のリンクを開いた場合、Amazon Musicのアプリが開かれ、プレイリストの画面に到達するだけで終わる。一方、変更後のリンクを叩けば、**プレイリストのページが開かれるのと同時に楽曲の再生**が行われる。

ただし、ここで**リンクを開くときのブラウザーによって動作の違いがある**。
私のiPhone12の環境ではChrome, Safari, Openerの3種類を試したが、結論から言うと**Opener**がベスト。
まず、Chromeだがこれは微妙。Chrome上でプレイリストが開かれ、"Amazon Musicで再生する"と表示されるだけなのでタプしなければいけない手間が増えるのと、自動で再生されないという2つの弱点がある。
次にSafari。これは自動でAmazon Musicのアプリを開きプレイリストを再生するところまではうまく行った。しかし、Amazon Musicを既に使用中である場合、現在の曲の再生を中止してプレイリストの曲を強制的に再生させることができない。
最後にOpener。これはOpener内の設定でAmazon MusicアプリにURLを渡すように自動設定を組んでやると、URLを叩いてからノータッチでプレイリストの自動再生ができる。さらにSafariにはできなかったプレイリストの強制再生ができるのでこちらの方をお勧めする。

## 3. ショートカットを組む
### 3-1. OpenerでURLを開く
作成したリンクをOpenerで開くショートカットを単一で作成しておく。

### 3-2. オートメーションで自動化する
オートメーションで使用しているBluetoothイヤホンが接続されたら、先ほど作成されたショートカットが起動するように設定する。


## 4. 動作確認
![イメージ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/24a44eab-67de-18a8-70aa-721b8b6f0a16.gif)

OpenerでAmazonMusicのリンクを開くがタップされているように見えるが、これはアプリ側のエフェクトで実際には何も操作していない。Bluetoothイヤホンを起動させてから音楽再生までに行う操作は、オートメーションの実行許可のタップのみで済むようになった。
今回は1つのプレイリストの自動再生を試みたが、ショートカットにリストから選択するアクションを加えることで、どのプレイリストを再生するか選ぶことも可能になる。


## 5. 便利なショートカット
以下のショートカットの利用をお勧めする。
[AmazonMusic Playlistリンク取得ショートカット](https://www.icloud.com/shortcuts/ced76fbdb6394fb5bc053c2fe8c7521c)

Amazon Musicで作成したプレイリストの詳細からプレイリスト共有用のリンクを取得する際、
`プレイリスト右側の… > シェアする > その他のオプション`
からこのショートカットを選択すると、自動再生のリンクに変更されたURLがクリップボードにコピーされる。
これは、マイプレイリスト・既存のプレイリストどちらについても対応できるようにしてる。ぜひ利用いただきたい。

## 6. 参照
https://stackoverflow.com/questions/46103409/ios-deep-linking-with-amazon-music-app
非同期通信でいいね機能実装してみた

今回は非同期通信を用いてのいいね機能を実装していきたいと思います。

##下準備
①favoriteコントローラーを追加

```
　$rails g controller Favorites
```

②ルーティング設定

```ruby:routes.rb
　resource :favorites only: [:create, :destroy]
```

③favoriteモデルを追加

```
　$rails g model Favorite user_id:integer pet_id:integer
　$rails db:miigrate
```

今回私はuserテーブルとpetテーブルの中間テーブルとしてfavoriteテーブルを使用しています。

④リレーションを関連付ける

```rudy:favorite.rb
    belongs_to :user
    belongs_to :pet
```
```rudy:user.rb
     has_many :favorites, dependent: :destroy
```
```rudy:pet.rb
has_many: favorites, dependent: :destroy


def favorited_by?(user)
 favorites.where(user_id: user.id).exists?
end
```
これで下準備は完成！

##いざ、非同期通信いいね実装
①　いいね用の部分テンプレートを作成
view/favorites の中に _favorite.html.rebを作成する 
 
```rudy:_favorite.html.reb
<% if pet.favorited_by?(current_user) %>  
   <%= link_to pet_favorites_path(pet), method: :delete, remote: true do %>
       ♥<%= pet.favorites.count %>
   <% end %>
 
   <% else %>
      <%= link_to pet_favorites_path(pet), method: :post, remote: true do %>
         ♡<%= pet.favorites.count %>
      <% end %>
<% end %>
```
②　部分テンプレートを呼び出したいページに呼び出す

```
 <div class="favorite-btn<%= pet.id %>">
  <%= render 'favorites/favorite', pet: @pet %>
</div>
```

③　view/favorite　の中に create.js.erb　と　destroy.js.erbを作成する

```rudy:create.js.erb
$(".favorite-btn<%= @pet.id %>").html("<%= j (render 'favorite', pet: @pet) %>");
```

```rudy:destroy.js.erb
$(".favorite-btn<%= @pet.id %>").html("<%= j (render 'favorite', pet: @pet) %>");
```
 
④ favorites_controller.rb を編集

```rudy:favorites_controller.rb
 def create
    @pet = Pet.find(params[:pet_id])
    favorite = current_user.favorites.new(pet_id: @pet.id)
    favorite.save
  end

  def destroy
    @pet = Pet.find(params[:pet_id])
    favorite = current_user.favorites.find_by(pet_id: @pet.id)
    favorite.destroy
  end
```

これで完成！！
PostmanでAlpha Vantage APIを使って米国株価を取得する

WebAPIの練習にPostmanを使ってみました。

日本株価の取得は記事が多数ありましたが米国株は比較的少なかったこと、英語記事にてBest Stock Market APIsに選ばれていたAlpha Vantage APIを使ったものとなると見当たらなかったので試すことにしました。

#1 Alpha Vantage API
サイトはこちら
https://rapidapi.com/alphavantage/api/alpha-vantage/endpoints

ユーザ登録したら https://www.alphavantage.co/documentation/ 下図の矢印のhereという場所を押します。

![スクリーンショット 2021-01-12 0.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/7a37a6bf-2b19-7df2-b24d-1c8cac21ca67.png)

GET FREE API KEYからAPIキーを取得します。

![スクリーンショット 2021-01-12 0.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/1c969482-cfdf-5f8d-d826-a098ec32509d.png)


#2 Postman
Paramに https://www.alphavantage.co/documentation/ に記載されたパラメータを入力してSendすると
指定した銘柄の株価を含むJSONデータが返ってきます。

![スクリーンショット 2021-01-12 0.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/f394cbf4-21bd-4149-7849-c09d608e4141.png)

要はホストに対しパラメータ、APIキーをHTTPリクエストすれば、JSONが返ってくるのだと理解しました。

以上。
Ansibleのmakeで詰まった話

こんにちは。最近Ansibleを書いてhttpdやphpをソースからコンパイルしてインストールしています。yumやdnfといったリポジトリに依存しないインストール方法なので、

- リポジトリの更新に関わらず同じ環境が再現できる
- ライブラリを依存関係を最低限にしつつインストールができる

などメリットもあるかと思います。そんな中、今回利用するライブラリのほとんどで `./configure`や `make`コマンドを実行してインストールしますが、これをAnsibleでやった時にとんでもない時間ハマったのでメモがてら残しておきます。

## 改善前のコード（抜粋）
```httpd.yaml
- name: get httpd
  get_url:
    url:
    dest: /tmp/
    state: present

- name: open httpd repository
  unarchive:
    src: /tmp/httpd-2.4.45.tar.gz
    dest: /opt/httpd-2.4.45
    remote: yes

# ....apr, apr-util, pcreなど必要なパッケージを取得....

- name: configure httpd
  command: './configure --prefix=/usr/local/apache2'
  args:
    src: /opt/httpd-2.4.45

- name: execute make command
  command: 'make'
  args:
    chdir: /opt/httpd-2.4.45

- name: execute make install
  make:
    chdir: /opt/httpd-2.4.45
```

## 手動実行とAnsible実行の翻訳のために
### commandモジュール
はじめにcommandモジュールです。リモートで実行させたいコマンド、特にAnsibleののモジュールが用意されていないパターンだと使う必要が出てくるかと思います。今回の場合は `./configure`のシェルを叩くために使っています。特定のファイルを実行するためにはよく使うのではないでしょうか。

### makeモジュール
makeコマンドを実行するためにモジュールが公式で提供されています。
https://docs.ansible.com/ansible/2.8/modules/make_module.html
ここで大事だったのが、makeコマンドで渡すサブコマンドを指定するところです。これを見落としていたこともあり、だいぶハマりました。

### 手動からYAMLへ
手動で行うと以下になります。（httpdのインストール部分）

```shell
# cd /opt/httpd-2.4.45
# ./configure --prefix=/usr/local/apache2
# make
# make install
```
これをAnsible化させると、

```yaml
- name: configure httpd
  command: './configure --prefix=/usr/local/apache2'
  args:
    src: /opt/httpd-2.4.45

- name: execute make command # make モジュールに変更
  make:
    chdir: /opt/httpd-2.4.45

- name: execute make install
  make:
    target: install          # targetを追加
    chdir: /opt/httpd-2.4.45
```
makeモジュールを2回使って、`make`のみと`make install`を実行しています。

## 改善後のコード（抜粋）
```httpd.yaml
- name: get httpd
  get_url:
    url:
    dest: /tmp/
    state: present

- name: open httpd repository
  unarchive:
    src: /tmp/httpd-2.4.45.tar.gz
    dest: /opt/httpd-2.4.45
    remote: yes

# ....apr, apr-util, pcreなど必要なパッケージを取得....

- name: configure httpd
  command: './configure --prefix=/usr/local/apache2'
  args:
    src: /opt/httpd-2.4.45

- name: execute make command # make モジュールに変更
  make:
    chdir: /opt/httpd-2.4.45

- name: execute make install
  make:
    target: install          # targetを追加
    chdir: /opt/httpd-2.4.45
```

## 終わりに
なんでmakeモジュールの`target`が必須じゃないんだろうと思ったら、makeコマンドそのものも実行できる様にしているのか、、、と後になって気づきました。１からコードを書くと気づきが多くて楽しいですね。

あと、ドキュメントちゃんと読もう。
データの作成について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183229/9a60aa25-4868-5c0d-ec53-80e5e93793b9.png)
①	1	2	3	4	5	6	7	8
1	0	0	0	0	0	0	1	619
2	0	0	0	0	0	0	1	3119
3	0	0	0	0	0	0	405	10000972


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183229/f0d7e342-e3e3-025f-10d9-de08a2f82475.png)
②	1	2	3	4	5	6	7	8
1	50857	53228	56866	58901	59978	61313	62837	64097
2	4,473,958	4,135,176	5,191,647	5,305,163	5,725,937	5,601,672	6,127,613	6,199,216
3	6,411,686,762	5,480,950,652	7,287,560,551	7,126,785,651	8,022,950,263	7,528,830,961	8,938,249,355	885,634,353



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183229/d9be6ecd-7aa1-24a0-f316-e6f31052c203.png)
③	1	2	3	4	5	6	7	8
1	36,285	37,380	39,108	39,738	40,179	41,090	41,990	42,594
2	3,025,962	2,822,524	3,456,928	3,421,664	3,655,095	3,572,636	3,803,219	3,843,816
3	4,715,130,393	4,233,467,842	364,882,464	5,117,481,956	5,631,277,670	5,449,962,520	6,066,486,126	6,342,622,881



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183229/2677a5f9-0078-11dc-d77c-38dadef6fdbd.png)
①	1	2	3	4	5	6	7	8
1	0	0	0	0	0	0	1	619
2	0	0	0	0	0	0	1	3119
3	0	0	0	0	0	0	405	10000972
								
②	1	2	3	4	5	6	7	8
1	50857	53228	56866	58901	59978	61313	62837	64097
2	4473958	4135176	5191647	5305163	5725937	5601672	6127613	6199216
3	6411686762	5480950652	7287560551	7126785651	8022950263	7528830961	8938249355	885634353
								
③	1	2	3	4	5	6	7	8
1	36285	37380	39108	39738	40179	41090	41990	42594
2	3025962	2822524	3456928	3421664	3655095	3572636	3803219	3843816
3	4715130393	4233467842	364882464	5117481956	5631277670	5449962520	6066486126	6342622881
マスタデータ と トランザクションデータ の違い

# マスタデータ と トランザクションデータ の違い

## 勉強前イメージ

変わらないデータとその他のデータ？
マスタは顧客情報って感じ。
トランザクションはわからん

## 調査

### マスタデータとは

コアとなるデータで、購買のサービスであれば顧客情報(住所や名前)など頻繁に変更されないデータ
以下の特徴があります

- 頻繁な更新や追加がない
- 基本的には更新できる人が限られている

### トランザクションデータとは

業務に伴って発生したデータや詳細の記録

- 頻繁な更新が行われる
- どのユーザでも更新・追加ができる
- データを集めることを目的としている

### イメージ

図解してみました。
アカウントの名前・住所などは `マスタデータ` で頻繁に更新が発生しません。
購入履歴の商品や金額などは `トランザクションデータ` で日に何度も更新されます。

![マスターとトランザクションUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/82225758-f3ff-2491-095c-a7fa9ddd2312.png)


## 勉強後イメージ

実際にDBを設計したことがなかったからきちんと言葉では知らなかったけど、
分類があるってことはなんとなく知ってたし、その違いもわかってた。
トランザクションログとかも似たようなイメージなんだろうな

## 参考

- [マスタとトランザクション](https://qiita.com/saeco_cco/items/5547813f75038e368be7)
- [46:マスターデータとトランザクションデータを分けよう](https://jisou-programmer.beproud.jp/%E3%83%87%E3%83%BC%E3%82%BF%E8%A8%AD%E8%A8%88/46-%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%88%86%E3%81%91%E3%82%88%E3%81%86.html)
- [マスターデータとトランザクションデータって結局なんぞや](http://gomocool.net/gomokulog/?p=906)
- [マスタデータ、トランザクションデータとは｜データ分析用語を解説](https://www.gixo.jp/blog/12341/)
Outlook（office365）自動修正をやめて欲しいと思う人向け

## いきさつ
　最近になり、Outlookを使用するようになりまして、勝手に修正してくれる機能があるのですが、「それはしなくていいよ」と思うのがいくつかありまして、手順等はググれば（WEBで検索をすれば）見つかりますが、あえてこの記事に取り上げていきます。

* 先頭文字が大文字になる
* 造語なのに勝手にスペルミスと思われ、自動で訂正される
* 意図した記述が、別の記号に変換される
* こちらの意図した箇条書きをしたいのに、勝手に変換される
* テキスト形式メールの人限定だが、文の途中で勝手に改行される
* ハイパーリンクになる(先方のメールソフトのことを気にしていない、勝手極まりない)

## 設定手順

１. [メール]、[編集オプション] の >ファイル>オプションに移動します。
２. [文章校正>オートコレクトオプション] を選択します。
３. [オートコレクト]タブを選択し、赤枠のチェックを外します。

![キャプチャ_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71427/feec87d3-88a9-58c4-137f-1f4af84de11f.png)

４. [入力オートフォーマット]タブを選択し、赤枠のチェックを外します。

![キャプチャ_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71427/86e6db97-f3b6-1945-acc3-8e573181871a.png)

５. [オートフォーマット]タブを選択し、赤枠のチェックを外します。

![キャプチャ_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71427/a89d7e6f-03fa-1ccd-e9ef-cfdad71870cc.png)

６. [メール]の >ファイル>オプションに移動します。（テキスト形式メールの人限定）

折り返し改行は、初期値は76文字になっているので、最大の132文字に変更します。

![キャプチャ_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71427/b67133ff-6d88-f999-1e7e-63af5dba9d8c.png)
【元Sier(SES)が薦める】未経験からWEBエンジニアを目指す方に読んでもらいたい本

![71QbtRE7N7L.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772104/e690d2fb-6be1-e191-8604-f792b4d8c4a0.jpeg)
私は、約5年間にわたり、Sier(SES)として働いていたのですが、今後のキャリアを考えWEBエンジニアに転向しようと活動しています。
そんな元Sier(SES)ですが、前職の経験を基に、これからWEBエンジニアを目指す方に読んでもらいたい本を紹介したいと思います。

# ✅【21世紀最強の職業】Web系エンジニアになろう!

| 発売日     | 2020/11/6   |
|:----------:|:-----------:|
| 価格       | 1980円      |
| 著者       | 勝又 健太   |
| Kindle版   | あり        |


## 🔴本書を進める理由：情報が整理されている
未経験からWEBエンジニアを目指すにあたり、まず最初に「WEBエンジニアとは何ぞや」という情報収集が必要になってきます。
みなさんも、これまでの人生の中で様々な分野で情報収集をしてきたと思いますが、一番労力を使うのがこの情報の取捨選択だと思います。
（この情報の取捨選択（情報整理）については、Googleの経営理念にもなっているので、いかに大事かが分かると思います。）
本書では、WEBエンジニアを目指すにあたり、必須な知識（用語）がカテゴリごとにまとめられています。
本書を読んでから用語を調べていくのが、一番効率的な情報収集だと考えているため本書を勧めます。

## 🔴書籍の内容
本書の規定に触れない程度に、本書にどのようなことが触れられているのか箇条書きにまとめています。
>
- Webサイト制作とWEBアプリ開発の違い
- Web系エンジニア（WEBアプリ開発）について
 - Web系エンジニアの特徴一覧
 - Web系エンジニアの主な職種一覧
 - Web系エンジニアのワークスタイル（働き方）
 - Web系エンジニアになる方法
 - Web系エンジニアになるための必須知識（用語）
 - Web系エンジニアの今後のキャリア
- Sier業界とWeb業界の比較
 - Sier業界について
 - Web業界について
- Web業界の今後のトレンド
【Rails AWS Docker】既存Ruby on Rails + MySQLアプリをDockerで構築し、AWSにデプロイする(3)

ポートフォリをとして作ったRuby on RailsアプリをDockerコンテナ化し本番環境をAWSで構築するまでの道のりです。
ポートフォリオ自体はこちらとなります。
[【ポートフォリオ】転職活動時に作成したポートフォリオの概要（テッ◯キャンプ）]
(https://qiita.com/sho_U/items/058e590325ee6833abb0)

かなり苦しめられたので、どなたかのお役に立てれば。

|  | タイトル |
|:-:|:--|
| 1  |  [ローカル環境のRailsアプリをDockerコンテナ化](https://qiita.com/sho_U/items/a1b5e4ddf13f3c42a722) |
| 2  | [AWSにVPCを作成する。パブリックサブネットを作成する](https://qiita.com/sho_U/items/9cdd37fd8c34c677d042)|
| 3 | プライベートサブネットを作成する|
| 4 | [EC2インスタンスを作成する](https://qiita.com/sho_U/items/cb268b774f60cb01c226) |
| 5  | [RDSを作成する](https://qiita.com/sho_U/items/4e5431add35d9318865d)  |
|  6 | [DockerコンテナをAWSにアップロードする](https://qiita.com/sho_U/items/5ef6693f7ae8f1c27bb7) |
#プライベートサブネットを作成します。

実は後ほど、理由は説明するのですがプライベートサブネットは異なるアベイラビリティーゾーンで２つ作る必要がありあります。
アベイラビリティーゾーンとは、ざっくりいうとクラウドが保管されているサーバーが実際に置かれている地域です。

よって下記のような構成を作ります。

![IMG_633C134D7C4A-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/39700015-cdb6-6aa1-25cf-d590d6af582c.jpeg)

##一つ目のプライベートサブネット作成します。

AWSコンソールからVPCダッシュボードに入り、サブネットを選択してサブネットを作成する。

VPC IDに先ほど作成したVPCを選択する。

アベイラビリティーゾーン：今回はap-northease-1a

名前 : fitO2_private_subnet_1a

IPv4 CIDR ブロック : 10.0.20.0/24

「サブネットを作成」をクリック

##二つ目のプライベートサブネット作成します。

AWSコンソールからVPCダッシュボードに入り、サブネットを選択してサブネットを作成する。

VPC IDに先ほど作成したVPCを選択する。

アベイラビリティーゾーン：今回はap-northease-1c

名前 : fitO2_private_subnet_1c

IPv4 CIDR ブロック : 10.0.21.0/24

「サブネットを作成」をクリック

##プライベートサブネット用のセキュリティーグループを作成する。

EC2ダッシュボードのセキュリティーグループをクリックして、「セキュリティーグループの作成」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/69882117-3db4-2aaa-6031-47f9381e2523.png)

「ルールの追加」をクリックします。

セキュリティーグループ名 : fitO2_db_SG
VPC : 先ほど作成したVPC
インバウンド ：
　タイプ : MYSQL/Aurora
  ポート : 3306
  ソース :
    カスタム
　　 パブリックサブネットに置かれたEC２インスタンスに適用する予定の（先ほど作った）セキュリティーグループを指定。（名前を打ち込んだら出てくる。出てこなければグループIDをコピペ）

これで、プライベートサブネット2つと、それに適用させる予定の下記の様なセキュリティーグループの作成が完了しました。

![IMG_237B88A63A89-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/07300b41-e1e1-793a-33ff-73b2b991a005.jpeg)

次回(4)へ続く
[EC2インスタンスを作成する](https://qiita.com/sho_U/items/cb268b774f60cb01c226) |
投稿テスト4(PostgreSQLでJSONB型を扱う)


# PostgreSQLでJSONB型を取扱う際のコードまとめ
参考にしたページ
https://blog.serverworks.co.jp/postgres_jsonb_search
https://qiita.com/kumazo/items/483f47360f8b61a9fbb9

## テスト用の環境
### テスト用のテーブル作成　&　テストデータ投入
```SQL
CREATE TABLE jsonb_test(
	id int,
	jsonb jsonb
);

INSERT INTO jsonb_test VALUES(
	(1000,'{"no":1,"state":"great","data1":36.5,"data2":1.11}'),
	(1001,'{"no":2,"state":"good","data1":36.0,"data2":2.22}'),
	(1002,'{"no":3,"state":"bad","data1":37.4,"data2":3.33}'),
	(1003,'{"no":4,"state":"good","data1":36.4,"data2":4.44}'),
	(1004,'{"no":5,"state":"bad","data1":38.1,"data2":5.55}')
```


### キー「state」のデータを取り出す
「->>」でキーにアクセスする。
「state」にアクセスした場合

```SQL
select jsonb->>'state' from jsonb_test
```
TEXT型
"great"
"good"
"bad"
"good"
"bad"

### Where句にJSONB型部分を指定する場合
<font color="Red">※そのまま抜き出すとTEXTになってしまう</font>

```SQL
select jsonb->>'data1' from jsonb_test 
      where jsonb->>'state' = 'good'
```
TEXT型 
"36.0"
"36.4"

### 抽出したデータはTEXT型になるため、任意の方にキャストして使用
```SQL
select (jsonb->>'data1')::NUMERIC
   from jsonb_test where jsonb->>'state'='good'
```
NUMERIC型
36.0
36.4
Rails5.2系にバージョンアップで生じたエラーの解決策

#はじめに
Rails初心者の私が学習する中で躓いた箇所を備忘録としてまとめました。

#学習教材
[フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座](https://www.udemy.com/course/rails-kj/)

#問題①
`Gemfile`でRailsのバージョンを5.2系に更新し、コンテナを立ち上げた際に下記エラーが発生。

```
Exiting
web_1  | /app/config/initializers/new_framework_defaults.rb:21:in `<top (required)>': undefined method `halt_callback_chains_on_return_false=' for ActiveSupport:Module (NoMethodError)
```

##解決方法
エラーを読めば分かりますが、
`/app/config/initializers/new_framework_defaults.rb`の**halt_callback_chains_on_return_false**メソッドが原因だと読み取れる。
調べたら、Rails5.2よりhalt_callback_chains_on_return_falseが削除されたそうなので、コメントアウトすれば問題を解決できる。

```:new_framework_defaults.rb
# Do not halt callback chains when a callback returns false. Previous versions had true.
#ActiveSupport.halt_callback_chains_on_return_false = false <=コメントアウトする
```

#問題②
コマンドからRspecでテスト実施

```
docker-compose exec web bundle exec rspec ./spec/models/
```

すると、下記エラーが出力される(エラー抜粋)

```
rails aborted!
ActiveRecord::MismatchedForeignKey: Column `board_id` on table `board_tag_relations` has a type of `int(11)`.
This does not match column `id` on `boards`, which has type `bigint(20)`.
To resolve this issue, change the type of the `board_id` column on `board_tag_relations` to be :integer. (For example `t.integer board_id`).
```

##解決方法
5.1系以前はmigrationを作成するとデフォルトでidカラムはintで作成されますが5.1系からはこれがbigintに変更されることが原因。型の異なるカラム同士ではFK制約を張れないので型を統一する必要がある。

*  board_tag_relations.board_idは**bigint型**
*  boards.idは**int型**

解決方法としてboard_tag_relations.board_idをint型に修正し、`db:migrate:reset`すれば問題は解決できる。

#問題
`redirect_to :back`でエラー発生

```

redirect_to :back, flash: {
        user: user,
        error_messages: user.errors.full_messages
      }
```

##解決方法
Rails5.1系から
`redirect_to :back` => `redirect_back(fallback_location: root_path)`に置き換わったので修正すれば問題解決。

```
redirect_back(fallback_location: "http://localhost", 
      flash: {
        user: user,
        error_messages: user.errors.full_messages
      })
```

#参考
* [rails 5.1.6 のアプリをrails 5.2.0にアップデートしたときに困ったとこメモ](https://tkmr.hatenablog.com/entry/2018/04/19/021252)
* [Rails 5.1以前に作成されたテーブルにFK制約を張れない問題の解決策](https://qiita.com/nametaketakewo/items/d9d26fb301a09d7e6c2c)
* [Rails 5.1系からは redirect_to :backがきえまっせ](https://qiita.com/100010/items/3ae5dea25e85b0cbf1ee)
EC2にsshで接続しよー、あ、俺のIPアドレス前と違うわ

家のルーター再起動したらssh通信できなくて焦った人です

そのままですね
前提として前までEC2にssh通信できてたよって人向けです

まず[自分のIPアドレスを確認](https://www.cman.jp/network/support/go_access.cgi)

その後EC2のマネージメントコンソールに飛んで、セキュリティグループを確認

使用してるセキュリティグループのインバウンドルールに

タイプSSHの行のソースを確認

ここにさっき確認した自分のIPアドレスがなければルールを編集して追加or置換

そのあといつも通りコンソールからssh通信を試すと通りますー
NavMesh


〇動的NavMesh機能は正式採用
「Unity 5.6からLow Level APIのような物が公開され、NavMeshを動的にベイクすることが可能になりました。」
http://tsubakit1.hateblo.jp/entry/2018/01/06/003209

昔は機能をAppendしていたが、Unity2019では普通に機能実装されている。た
Unity2018でも多分実装されていると思う。

〇メモ

https://xr-hub.com/archives/7639

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/502ceff6-7547-397e-8fee-efe84cee370b.png)

[Unity2019.4.16 Navigationsample](https://1drv.ms/u/s!ApO4wsxFJBbVvgD-xlUI_spgqYFb?e=CvavTT)
GoLand IDEをUbuntuにインストール

無料バージョンではありますが、GoLandエディタを自分のUbuntu環境にダウンロードしてみました。
参考にしたのは以下のサイトです。
[Install Jetbrains GoLand Go IDE on Ubuntu](https://linuxhint.com/install_jetbrains_goland_ubuntu/)
[在Ubuntu安装JetBrains Goland IDE](https://blog.csdn.net/jianming21/article/details/106409772)

snapdを使ってダウンロードする方法もありますが、今回はサイトからダウンロードする方向でいきました。

## 前提

- 環境がUbuntu
- Goはローカルにすでにダウンロード済み

## ダウンロード

Linux用のバージョンをこちらでダウンロードします。
https://www.jetbrains.com/ja-jp/go/download/#section=linux

ダウンロードしたら展開して `opt`フォルダに移します。
もちろん他のところでもOKらしいです。
移動したらシェルファイルを実行して立ち上げます。

```
$ cd Downloads

$ sudo tar xzf goland-2020.3.1.tar.gz -C /opt

$ ls -l /opt
total 12
drwx--x--x 4 root root 4096 11月 20 01:33 containerd
drwxr-xr-x 8 root root 4096  1月 11 23:19 GoLand-2020.3.1
drwxr-xr-x 3 root root 4096 11月 20 10:46 google

$ /opt/GoLand-2020.3.1/bin/goland.sh
```

このような画面が出てきますが、`Do not import settings`を選んで進みます。

![Screenshot from 2021-01-11 23-20-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/cfdd4e00-e3b8-0cd7-247a-674f537ffb59.png)

ライセンスは持っていないので、無料バージョンを使います。`Evaluate for free`を選んで持っていないほうで進めると、最終的にこの画面にたどりつきます。

![Screenshot from 2021-01-11 23-20-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/7655e478-012c-90d3-6218-d5fdfb22495f.png)

毎回シェルファイルを実行して立ち上げるのは面倒なので、以下のようにアプリケーションディレクトリにファイルを作成します。今回はバージョンが`2020.3.1`なので、以下のように記入します。バージョンが変わった場合は違うバージョン名を記入してください。

```
$ cd /usr/share/applications/

$ sudo vi Goland.desktop
[Desktop Entry]
Name=Goland
Comment=Goland IDE
Exec=/opt/GoLand-2020.3.1/bin/goland.sh
Icon=/opt/GoLand-2020.3.1/bin/goland.png
Type=Application
Terminal=false
Encoding=UTF-8
```

作ったファイルに権限を与えます。

```
$ sudo chown 自分のユーザー名 Goland.desktop

$ sudo chmod 755 Goland.desktop
```

これでアプリケーション内から開けるようになります。

![Screenshot from 2021-01-11 23-40-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/3727e296-4f1b-753c-3b7d-17cd277084a2.png)

ちなみにDesktopでも開きたい場合は、Desktopに先程のファイルをコピればいいです。

```
$ cp Goland.desktop /home/user/Desktop/
```

## プログラムを書いてみる

New Projectを選びます。

![Screenshot from 2021-01-11 23-43-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/0fe739fe-dbca-d22f-7d20-7c393a5323d8.png)

すでに入っているGOROOTをもとにCreateします。

![Screenshot from 2021-01-11 23-43-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/dee990ce-8140-ccd6-b7b7-016c2e4e6072.png)

毎度おなじみの`Hello World`を作ります。

![Screenshot from 2021-01-11 23-51-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/e7ec70e4-26ba-2661-d1a4-6b5b0c77017b.png)


上のRunメニューからRunを押すと `go build hello.go`が出てくるので、これをクリックします。

![Screenshot from 2021-01-11 23-49-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/fd508709-d614-3b63-50b3-1ed5d361e6e9.png)

Hello Worldが出力されました！

![Screenshot from 2021-01-11 23-51-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/eb1c1fac-79e0-9fc3-aeb3-e1be870599d7.png)

以上です。無料バージョンなんで30日しか使えないぽいんですけどね、、、
視覚的に理解するフィボナッチ数と再帰関数

## はじめに
フィボナッチ数を求めるコードを書く問題に挑戦していたところ再帰関数が出てきて頭がパンクしそうだったので整理するためにも記事にしてみます。
メインは再帰関数ですがついでにフィボナッチ数とメモ化に関しても説明してあるのでよければ見ていってください。

## フィボナッチ数列とは
本題ではないので詳しい説明は割愛しますが 0, 1 もしくは 1, 1 から始まり、前２つ前の数字を足し合わせると次の数になる数列のことです。
<img width="600" alt="fib1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901009/b59a7ef2-1fa2-27e7-14db-e7168bfd3da8.png">
こんな感じ。

## 漸化式
「うわ何や難しい文字出てきたわ戻ろ」
と思って帰りかけた文系のあなた、もうちょっとお付き合いください。
ガチガチ文系の筆者ですがなんとか理解して噛み砕いてみたので大丈夫です。多分。

前項目の画像では２１で数列が終わっていますが、その次の数字は何になるでしょうか？
数列を構成する各々の数を数列の「項」といいますが、この項に番号をふってみましょう。配列番号を付けるイメージです。
<img width="600" alt="fib2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901009/9d441f8d-4fac-aab1-c027-e958a7619bad.png">
２１の次、つまり<B>９番目</B>の数字を求めたいわけです。
”前２つの数字を足し合わせると次の数になる”という性質を考えると<B>７番目＋８番目</B>なので
　<CODE>１３＋２１＝３４</CODE>　となります。
数列にふった”番号”に注目して式を作り替えるとどうなるでしょうか。
　<CODE>７番目＋８番目＝９番目</CODE>　ですね。
上の式をもう少しいじってみます。７番は９番の２つ前、８番は９番の１つ前なので
　<CODE>（９ー２番目）＋（９ー１番目）＝９番目</CODE>　ですよね。

ポイントは３つ

- ０番目の数字は０
- １番目の数字は１
- ２番目以降は前２つ前の数字を足し合わせると次の数になる


では、フィボナッチ数列（Ｆ）の<B>ｎ番目</B>の数を求めるには？

```math
　\large{F_{0} = 0,}\\
　\large{F_{1} = 1,}\\
　\large{F_{n} = F_{n-2} + F_{n-1}}　\small{(n ≥ 2)}
```
このように数列の項同士の関係性を利用して作られた式を漸化式と呼ぶそうです。
この漸化式は再帰的な定義になっているので再帰呼び出しを使って簡単にプログラムを書くことができます。

## 再帰関数
再帰関数とは何かを説明する前にまずは上記の漸化式を利用してどの様なプログラムがかけるのかをみていきます。

```ruby
def fibonacci(n)
  return n if n == 0 || n == 1
  fibonacci(n - 2) + fibonacci(n - 1)
end
```
上でも書いた様に０番目の数＝０、１番目の数＝１なのでこの２択に当てはまる場合はreturnでnを返します。
それ以降は漸化式と同じ要領でプログラムを書いてあげればOKです。
fibonacciという関数内にまたfibonacci関数が存在しているわけですが、この様な自分自身を呼び出す関数を<B>再帰関数</B>といいます。

## 処理の流れ
では処理の流れはどうなっているのでしょうか。
再帰呼び出しは
関数内にある自分自身の中に入って処理→さらにその中の自分自身の中に入って処理…
という風にreturnに引っかかるまでループを繰り返します。
例えば n = 6 とした時、２行目は条件不一致によりスキップされ３行目へ進みます。
３行目では fibonacci(4) + fibonacci(5) となり、 fibonacci(4) の処理が始まるのです。

文章だと分かりづらいので図にしてみましょう。

![fib3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901009/c49f6fcf-fd6b-c8d6-2687-522ddcd6652a.png)
こんな感じでreturnに行き当たるまでループします。
ループの戻り値である０か１を順番に足していくことで最終的にｎ番目の数を求めるようになっているわけですね。

## 再帰関数の弱点
お気づきの方もいらっしゃるかと思いますが、シンプルに書ける便利な再帰呼び出しにも弱点があります。
それは<B>同じ項を何度も重複して計算してしまう</B>ことです！
上記の様な６番目程度の数を求める場合は大したループではないのですが、１００番目の数を求めるとなると、同じ計算を何度も繰り返してしまうために処理が終わるまでに長い時間がかかってしまうのです。
この欠点を補うのが<B>メモ化</B>です。

## メモ化
上の図を見てもらうとA, B, Cと全く同じ処理が再び行われている部分がありますよね。
そこで文字通り一度計算した内容をメモ（キャッシュ）しておき2回目以降はメモをチラ見するだけで済むのがメモ化です。
メモ化を利用して書き直したプログラムがこちら

```ruby
def fibonacci(n)
  @memo ||= []
  return n if n == 0 || n == 1
  @memo[n] ||= fibonacci(n - 2) + fibonacci(n - 1)
end
```

<B>||=</B>は「||」演算子の自己代入演算子です。
左辺が 偽 か 未定義 なら左辺に右辺を代入する、という意味になります。
２行目でmemoというメモ帳を用意してあげて、４行目で未だ計算したことのない値の場合はメモしておく流れになっています。

これで１００番目の数字でも一瞬で求めることができるようになりました。お疲れ様でした！

## おわりに
ここまでご覧いただいてありがとうございました。
フィボナッチ数の求め方は他にもあるようなので色々試してみたいと思います。
Notionでアイコンをお洒落にしたい

#はじめに
絶賛溺愛して使っているメモアプリのNotion。
デフォルトの絵文字だけだと、なんかスタイリッシュさに欠けるので、フリーアイコンを探して使っています。私が使っているサイトを紹介します。
「Notion Icons」と「MATERIAL ICON」がシンプルでお洒落になるかな…と思ってよく利用します。

##フリーアイコン

- [flaticon](https://www.flaticon.com/)
- [MATERIAL ICON](https://material.io/resources/icons/?icon=home&style=baseline)
- [Notion Icons](https://www.notion.vip/icons/)

##基本的な使い方

- 保存はSVGの拡張子で保存するのがベター


パソコンに画像を保存している場合は、ここから選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/8553f0ac-2b78-e4e5-0fd2-05edc66679f6.png)

画像のリンクを貼る場合はここから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/dc8bb575-9dd8-1dda-3ba6-80c7f86b6975.png)

##最後に
お洒落なアイコンを集めてフォルダを作りたいなぁ…
【Java】AtCoderのABC-188に参加しました。

初めまして。初めての投稿になります。
ユーザー系IT企業で中堅どころとして働いていますが、自己研鑽のためにQiitaを始めます。

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

https://atcoder.jp/users/ishikawaryou

時間ギリギリでしたが、何とかC問題まで解くことができました。
もともと僕はCOBOL技術者で、Javaは完全独学ですが、C問題まで解けた自分をまずはほめてあげようと思います。

これからもコツコツ取り組んで、茶色を目指したいと思います！
同じく灰色レベルで頑張っている方、お互い頑張りましょう！