OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10 に Ruby on Railsを入れてみた。

## 動機

仕事中、手が空いたので、技術ニュースを漁っていたところ、 **Rails6** が出ていたことに大興奮な私。(普段はSier)
そこで、割と自由な私は社内のWindows端末に**Ruby on Rails6**(以下Rails)を入れてみました。

## 動作環境
- Windows 10 Pro
- VS Code
- Ruby 2.6.5 (投稿時最新)
- Rails 6.0.1

でーす。

## 必要なものインスコ

### VS Code

[ここから](https://code.visualstudio.com/download)入手しましょう。

### Git 

[ここから](https://git-scm.com/)入手しましょうぜ。

### Ruby

インストーラーは[こちら](https://rubyinstaller.org/downloads/)。

インストールが終わったら、VSCodeのコンソールからコマンド叩いていきましょう。
私の場合は**bash**でなくVSCode上で**powershell**で色々実行しました。

### Rubyのバージョン確認

```
C:\>ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x64-mingw32]
C:\>gem -v
3.0.3
```

入った。

### Railsインストール

```
C:\>gem install rails 
...
40 gems installed
C:\>rails -v
Rails 6.0.1
```
入った入った。

### さて動くか試してみようぜ！

Dドライブ直下でインスコしているように書いていますが適宜読み替えてください。

```
D:\>rails new sample_app
In Gemfile:
  sqlite3
         run  bundle binstubs bundler
Could not find gem 'sqlite3 (~> 1.4) x64-mingw32' in any of the gem
sources
listed in your Gemfile.
       rails  webpacker:install
Could not find gem 'sqlite3 (~> 1.4) x64-mingw32' in any of the gem
sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```
色々動いてるけど最後の最後にエラーだぜ。
デフォのDB、sqlite3が入ってないってさ。とりあえず指示通り入れます。

```
D:\>gem install sqlite3
1 gem installed
```

入った。

```
D:\sample_app>bundle install
Bundle complete! 14 Gemfile dependencies, 70 gems now installed.
```

入ったー。

```
D:\sample_app>rails s
=> Booting Puma
=> Rails 6.0.1 application starting in development
=> Run `rails server --help` for more startup options
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment
Exiting
```

怒られた。webpackがないって。ぐぐったら、情報出てきた。``` rails webpacker:install```で良さそう。

```
D:\sample_app>rails webpacker:install
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
```

Yarnがないって。
ご丁寧にURL貼ってあったから、[ここ](https://yarnpkg.com/lang/en/docs/install/#windows-stable)から入れようぜ。

...数分後

入れた。**VS Code再起動**しましょう

```
D:\sample_app>rails webpacker:install
Done in 7.19s.
Webpacker successfully installed
```

入った。

```
D:\sample_app>rails s
Puma starting in single mode...
```

動いた！

http://localhost:3000/

で動くよーに、なりまんた。でめたしでめたし。

ご覧頂きありがとうございました。
乗算ブレンドをグラフで理解する

#はじめに

乗算ブレンドは、以下の式で定義されます。

基本色＝ブレンド前の色
合成色＝ブレンドする色
結果色＝ブレンド後の色
各色の範囲を0〜1としたとき

**結果色　＝　基本色 × 合成色**

こう言われても、いまいちピンと来なかった（イメージできなかった）ので、
基本色と合成色を自由に変更できるグラフを作ってみました。
少しでも右脳で理解する助けになれば。。
#グラフ
[ブレンドモードテスト](https://taka108.github.io/BlendModeTest/)
今のところ白黒固定です。
#TODO
・RGBそれぞれ動かせるようにする
・ほかのブレンドモードも作る
#参考
**計算式参考**
[【drango creators blog】なんとなく、からぬけだそう。知っておきたい描画モードの仕組み](http://creator.dwango.co.jp/11568.html)
**実用例**
[【印刷の現場から】Photoshopの描画モード -「乗算(じょうさん)」](https://www.wave-inc.co.jp/weblog/?p=1585)
学ぶことの前処理

学ぶことは大事だけれど、
「なにを学ぶのか？」
という、言わば『学ぶことの前処理』も大事だなぁと思いました。

--- --- --- --- ---

最近私はSQLを勉強しています。

「ビッグデータを扱えるようになれ」と会社に言われて勉強を始めました。

「これくらいは解けないといけない」とSQLの問題を渡されましたが、取っ掛かりすら掴めませんでした。


私はこれまでまともにSQLを勉強したことがなかったので、Progateから勉強しました。ちょうど1週間前です。

Progateは2日ほどで終わり、次はもう少しレベルの高い、キリンが描かれたSQLの本を始めました。

SQLの本なので、CREATE DATABASEやDROP DATABASEなど、ある程度網羅的に書かれています。

私はせっかく買ったのでまじめに参考書の頭から始めたのですが、CREATEやDROP, UPDATEはやらなくていいのでは？と思いました。

なぜかというと、もともと私に求められていたスキルは「ビッグデータを扱えること」であり、CREATEやDROPではなく、極論を言えばSELECTしか求められていませんでした。

また、私はなにかを知りたいと思ったとき、その仕様や原理、言わば低水準のところが気になってしまいます。

「いまのSQLをやったら基本的なSQL文は理解できるはずだから、その次はさらに深いSQLの文法や原理を理解しよう」と思ってしまいました。

実際そのような本を探すために本屋に行って、良さそうな本があったのでレジまで持っていくところまでやりました。

しかし、「SQLの原理を理解することを、俺は求められているのか？」と思い、本を戻しました。

私が求められているのは、SQLの、CRUDでいうところのReadのみで、また、極論を言えばSQLの原理なんか知らなくてよくて、それよりもビッグデータを扱う練習をすることを求められています。

--- --- --- --- ---

これはSQLに限った話ではないと思いました。

SQLも、Pythonも、bashも、すべて奥が深く、その分野について完璧に理解することはほぼ不可能です。

ではどうするのか？と考えたときに、「なにかを学ぶ前に、なにを学ぶのか、なぜ学ぶのか」などを考えることが大事だと結論しました。

これを「学ぶことの前処理」と今後自分の中で呼ぼうと思います。
VSCode で実行中のタスクを全て強制終了させるキーボードショートカットを設定する

VSCode と Angular で Web アプリを開発していて、デバッグが終了する時に ``ng serve`` を止めるという事がしたかったのだけど、Windows ではいろいろ面倒で諦めて(macOS ではできた)、ならばと実行中のタスクを全て停止する方法を探したらあった。

1. Menu -> View -> Command Pallet -> "Open Keyboard Shortcuts"
2. ``keybindings.json`` に次のように記述

**keybindings.json**

```json
[
  { 
    "key": "ctrl+alt+c",
    "command": "workbench.action.tasks.terminate",
    "args": "terminateAll" 
  }
]
```

ちょっと解説すると、``workbench.action.tasks.terminate`` は、「強制終了させるタスクを選択して実行する」というコマンドのようだけど、これに ``terminateAll`` という文字列を与えると、何も聞かずに全ての実行中タスクを強制停止してくれる。
このためだけに [VSCode のコードを辿った](https://github.com/microsoft/vscode/blob/ab89935fd348d023fe34dc8070d105080e1a9652/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts#L2297) ので間違いないと思う。

キーボードショートカットはお好みで。

## 参考

* [Terminate all tasks · Issue #27041 · microsoft/vscode](https://github.com/microsoft/vscode/issues/27041#issuecomment-482620400)
* [VS CodeでTerminate Running Taskのキーボードショートカットを設定する - Qiita](https://qiita.com/niusounds/items/6a943ffbede956a3ecb2)
* [vscode debugger - Terminate another task from within a postDebugTask - VS Code - Stack Overflow](https://stackoverflow.com/questions/54480792/terminate-another-task-from-within-a-postdebugtask-vs-code)

## おまけ

そしてこの ``workbench.action.tasks.terminate terminateAll`` コマンドを、タスクとして以下のように登録し、

**.vscode/tasks.json**

```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "ng-serve",
            "type": "shell",
            "isBackground": true,
            "command": "ng serve",
            "problemMatcher": {
                "owner": "custom",
                "pattern": {
                    "regexp": "^$"
                },
                "background": {
                    "activeOnStart": true,
                    "beginsPattern": "^.*Angular Live Development Server.*$",
                    "endsPattern": "^.*Compiled successfully.*$"
                }
            }
        },
        {
          "label": "postdebugKill",
          "type": "process",
          "command":[
             "${command:workbench.action.tasks.terminate}",
             "terminateAll",
          ]
        }
    ]
}
```

``launch.json`` で、デバッグ実行 -> 停止したときに「全てのタスクを終了」としたかった。。。

**.vscode/launch.json**

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Debug with Chrome",
            "url": "http://localhost:4200",
            "webRoot": "${workspaceFolder}",
            "preLaunchTask": "ng-serve",
            "postDebugTask": "postdebugKill"
        }
    ]
}
```

のだけど、この状態でデバッグ停止すると「終了するタスクを選択させるプロンプト」が表示されてしまう。
``terminateAll`` のパラメータがうまく渡せてないようだけど、よく分からない。。。
bashで"を二重で使う方法

# やりたいこと
echoで`sed "${line},10d" hoge.txt`と出力したい

# 問題点

```bash
# これだと""が思い通りに解釈されない
echo "sed "${line},10d" hoge.txt"

# これだと変数が展開されない
echo 'sed "${line},10d" hoge.txt'
```

# 対処方法
海外の記事にあったけどなんかしっくりこない。
誰かいい方法合ったら教えてください。
`"`を変数に代入すればいいらしい。

```bash
dqt='"'
echo "sed ${dqt}${line},10d${dqt} hoge.txt"
```

# こっちのほうが良い

```bash
echo "sed \"${line},10d\" hoge.txt"
```
PMP更新してみた

#はじめに
　とってそうそうPDUを３年以内で取らねばならないという事実があり、だったら一気に更新までやってやれ！と思って、更新もしてみた。
　当然PDU60とってからですよ。

#ざっくりいうと
　まぁ悩むところはないはず。
　すぐ更新しても、期限は更新した日基準じゃなくて次の次のサイクル終了日

#やってみた
![pmp1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/0a33f970-52dc-48e1-8f8e-c9226f631a26.jpeg)

PDU60とると、こんな感じにReNew NOWというリンクが出てきます。

![pmp2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/472185a1-1363-8d5d-5625-7c0aa483202a.jpeg)
![pmp3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/99684336-6c51-df01-85cd-1cad9e67fe17.jpeg)

同意して次に進みます。

![pmp4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/c89d995d-2413-a6a1-0ea0-ff9914116fee.jpeg)

お支払いの住所です。
まぁ会員になっていれば自動で値が入ってます。変更がなければそのままでいいと思います。


![pmp5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/fe32c38f-931a-7e9c-318d-bdeb93b3bb0c.jpeg)


お支払いの仕方です。バウチャーがある人はそれを入力するのかな。

![pmp6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/d2379bd3-cbef-0fdd-b1c2-02caf08b4041.jpeg)

billingアドレスなどは消してます。

![pmp7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/c4e41493-8ecf-1576-0bd2-e30e3e0a2011.jpeg)


![pmp8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/85fb428c-4ab2-76c7-488c-e245fa90c299.jpeg)



で、更新後どう見えるかというとこんな感じ。
自分の場合、2019/8に取得したので、最初のサイクルが2022/8までで、今回更新したので2025/8までになりました。
ちなみにこの状態でPDU追加しても2025のサイクルのPDUには加算されません（実験済み）

#最後に
PMP日本語支部のページにも「PDUを得たら速やかに更新しましょう」とあるので、忘れないうちにやったほうがいいんでしょうね。
ただ、さっさと更新したら次のサイクルっていつから始まるんだろうって思うと切り替えにくいなと思う人がいるかと思いますが、今回の結果からそんなことはないとわかりました。

次は6年後かな

ちなみにPDUは（裏技とかではなく）ちゃんと稼ぎましたよ。
kustomize build の出力をフィルタするワンライナー

`kustomzize build`の出力は巨大なmultiple documentなYAMLになりがちで、
毎回 less で表示するのはつらい。

そこでmultiple documents形式のYAMLを
`kind`と`metadata.name`でフィルタするワンライナーを書いてみました。
jqとyqを使っています。
なんで両方使うのかというと、yqが`select`に対応していないっぽいからです。
ref: https://github.com/mikefarah/yq/issues/173

```console
$ kustomize build . | yq r - -d "*" -j | jq '.[] | select(.kind | match("service";"i")) | select(.metadata.name=="prometheus")' | jq . -s | yq r -
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: prometheus
- apiVersion: v1
  kind: Service
  metadata:
    name: prometheus
  spec:
    ports:
    - port: 9090
      targetPort: 9090
    selector:
      app.kubernetes.io/name: prometheus
    type: ClusterIP
```

流石に長いのでシェルスクリプトの関数にしてみました。

```sh
function kfilter() {
    cat - | yq r - -d "*" -j | \
        jq ".[] | select(.kind | match(\"$1\";\"i\")) | select(.metadata.name==\"$2\")" \
        | jq . -s | yq r -
}
```

おわり。

```console
$ kustomize build . | kfilter service alertmanager
- apiVersion: v1
  kind: Service
  metadata:
    name: alertmanager
  spec:
    ports:
    - port: 9093
      targetPort: 9093
    selector:
      app.kubernetes.io/name: alertmanager
    type: ClusterIP

```
要件定義・設計・見積り・時間計測・タイムマネジメント・プロジェクトマネジメントを学ぶには（書籍編）

# どうやって、要件定義・設計・見積り・時間計測・タイムマネジメント・プロジェクトマネジメントを学ぶのか

本を読み漁ることにした

## 前回の取り組み
[設計を学ぶときに興味を持った投稿記事](https://qiita.com/JINPLAYSGUITAR/items/f3396ca09286bd12ccd6)

## 前提
- 表題の各要件が出来るようになるために読む、もしくは出来なくても数%でもいいから今よりマシになるために読む [^1]
- アカデミックよりに興味本位で読む。きっと、そちらの方が興味を持つ
- 事象的に読み、これはこれと考えるようにする(結果を急がない)
- 仕事に活かせそうも考える
- 仕事にどうすれば活かせるか考える

## 読みたい書籍、読んだ書籍のメモを残す

### 読んだ書籍
●要件定義、設計関連を期待して読んだ
[はじめよう! 要件定義 ~ビギナーからベテランまで](https://www.amazon.co.jp/dp/4774172286/)

●時間管理、見積りを期待して読んだ
[脳のパフォーマンスを最大まで引き出す 神・時間術](https://www.amazon.co.jp/dp/4479795820/)

### 読みたい・興味のある書籍(期待)
●要件定義、設計関連関連
[はじめよう! プロセス設計 ~要件定義のその前に](https://www.amazon.co.jp/dp/4774185922/)
[はじめよう! システム設計 ~要件定義のその後に](https://www.amazon.co.jp/dp/4774195391/)

●時間管理、見積り、時間計測、タイムマネジメント関連
[人月の神話](https://www.amazon.co.jp/dp/4621066080/)

●プロジェクトマネジメント関連
[世界一わかりやすいプロジェクトマネジメント 第4版](https://www.amazon.co.jp/dp/4862804438)
↑書店で読んだのはこれだったか？気になった

※プロジェクトマネジメント（マネジメント）はシステム屋の専売特許ではなく職種問わず重要な要素だと思う
システム開発のプロジェクトマネジメントよりはどの職種にも言えるベーシックなプロジェクトマネジメントを学びたい
特にEasyでコンピュータがなくても出来る、考えられる知識を学びたい
なぜならば、コンピュータが登場する前からマネジメントの概念はあったハズだから
コンピュータ依存するものではないと僕は考える

[^1]: 今のままでは変わらないとき、今と違うことを少しでもすれば、結果は変わるかもしれないからだ
自然言語処理で、お笑いコンビ「たりないふたり」のtwitterを分析

たりないふたりが終わった記念に、

- **結果の再集計**
- **コードのリファクタリング**

を行いました。<br><br>

以下の3つの記事で自分のブログにまとめています。

1. [【結果】お笑いコンビ「たりないふたり」のツイートを分析した](https://corgi-komugi.com/tarifuta_result/)
1. [【コード解説①】お笑いコンビ「たりないふたり」のツイートを分析した｜基礎集計編](https://corgi-komugi.com/tarifuta_code1/)
1. [【コード解説②】お笑いコンビ「たりないふたり」のツイートを分析した｜自然言語処理編](https://corgi-komugi.com/tarifuta_code2/)
Laravel5.8環境構築での注意点

#概要
WindowsでLaravel5.8の環境構築をするにあたって1週間近くの時間を溶かしてしまったので、
そこでの個人的に注意すべきだと思った点をいくつか残しておこうと思います。

※この記事はVagrant + HomesteadでのLaravel5.8環境構築を前提としています。

#【超重要】そもそもバージョンは合っているか
今回はLaravel5.8で開発しようとしているのに異なるバージョンをインストールしていたら、
場合によっては最後の最後で思い通りに動かないということもあり得ます。

※ここではsampleというフォルダ名で作成しています。
"sample"のところがフォルダ名となるので自由に読み替えてください。

##誤まり
```
composer create-project laravel/laravel sample
```
これでは現行のLaravelの最新バージョンがインストールされてしまいます。

##正しくは
```
composer create-project --prefer-dist laravel/laravel sample "5.8.*"
```
このように記述することで、Laravel5.8の最新バージョンが正しくインストールされます。

##ちなみに
```
php artisan –version
```
このコマンドを実行すると、インストールされているLaravelのバージョンを確認することができます。
ここでは"Laravel Framework 5.8.~"となっていればOKです。

#【重要】foldersのmapはフルパスで書く（Windows）
```Homestead.yaml
folders:
    - map: C:\Users\Owner\Homestead\code
      to: /home/vagrant/code
```
Windowsでの環境構築において、Homestead.yamlファイルにおけるfoldersプロパティのmapのパスは
”C:\Users\Owner\Homestead\code”のようにフルパスで書かないと共有フォルダは作成されません。

※ここではcodeという名前の共有フォルダが作成されています。
"code"のところは作成したフォルダ名に応じて読み替えてください。

#【そこそこ重要】共有フォルダはホスト側であらかじめ作成しておく
Homestead.yamlファイルの編集を終えたら、仮想マシンを起動もしくは再起動することになります。
そのときに共有フォルダ（上記のcodeフォルダ）はホスト側であらかじめ作成されている必要があり、
そうでなければ共有フォルダは自動で作成されることはなくフォルダの中身も共有されることはありません。

#参考資料
・[Laravel 5.8 インストール](https://readouble.com/laravel/5.8/ja/installation.html)
・[Laravel 5.8 Laravel Homestead](https://readouble.com/laravel/5.8/ja/homestead.html)
【Rails】find_byで取得したものに、eachメソッドは使えない

##エラー文
```
 #<NoMethodError: undefined method `each' for #<Group:0x00007ff22e3f16a0>
```
##原因
find_byで取ってきた値にeachメソッドを使おうとしていた。

##なぜ、そうなった？？
このようにfind_byで複数のレコードを取得したものに
eachメソッドを使用していたから。

```ruby
array.map do |id|
 @groups = Group.find_by(id: id)
end   
 @groups.each do |group|
```

##対策、使い分け
モデルを1件だけ取得したい場合はfind_byメソッド。
複数取得してeach doで回したい場合はwhereを使うようにする。

find_byで取得したオブジェクトをviewでeach doしてしまったら、
エラーになるので、each doで出力する時は仮に1件しか要らない場合であっても
絶対にwhereを使うようにする。
Eclipseの動的webプロジェクトでコンテキストルートをプロジェクトフォルダにする

- `(プロジェクト名)\.settings\org.eclipse.wst.common.component`を開く。
- `<wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>`
の部分を`<wb-resource deploy-path="/" source-path="/" tag="defaultRootSource"/>`に書き換える。


```xml:org.eclipse.wst.common.component
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="webapp">
        <wb-resource deploy-path="/" source-path="/" tag="defaultRootSource"/>
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
        <property name="context-root" value="webapp"/>
        <property name="java-output-path" value="/test/build/classes"/>
    </wb-module>
</project-modules>
```
カクヨムの傍点記法を、小説家になろう向けの中黒ルビに変換するシェルスクリプト

とりいそぎコードのみ。

```kaku2narou.sh
for textfile in $(grep -lE '《《[^》]+》》' *); do #該当記述を含むファイルを検出
  for hit in $(grep -Eo 《《[^》]+》》 "${textfile}"); do #ファイルごとに該当記述を検出
    phrase=$(echo -n "${hit}" | sed -e 's/^《《//' -e 's/》》$//') #傍点部付きの文字列を検出
    cn=$(echo -n "${phrase}" | wc -cm | grep -Eo '\d+') #文字列の文字数をカウント
    dots=$(printf '%*s' "$cn" | sed -e 's/ /・/g') #中黒を並べる
    gsed -i -e "s/${hit}/｜${phrase}《${dots}》/" "${textfile}" #置換する
  done
done
```

上記のコードの場合、`《《ぼうてんぶ》》`を`｜ぼうてんぶ《・・・・・》`のような形に変換する。

ただし、小説家になろうでは１０文字を超える連続ルビが使用できない。

そこで、原稿のメンテナンス性を無視して、`｜ぼ《・》｜う《・》｜て《・》｜ん《・》｜ぶ《・》`のような形に変換するコードが以下。

```kaku2narou.sh
for textfile in $(grep -lE '《《[^》]+》》' *); do
  for hit in $(grep -Eo 《《[^》]+》》 "${textfile}"); do
    phrase=$(echo -n "${hit}" | sed -e 's/^《《//' -e 's/》》$//')
    nphrase=$(echo -n "${phrase}" | gsed -E -e  's/(.)/｜\1《・》/g')
    gsed -i -e "s/${hit}/${nphrase}/" "${textfile}"
  done
done
```

変数がきちゃない。
あと変数名をちゃんと`{}`でくくらないとバグってびびった。
備忘録: VSCodeショートカットキー

# VSCodeのショートカットキー

これは、自分が忘れてしまうので身につくまで確認するため用のチートシートです

## 対象OS

* Windows

## 一覧

* 同じ名前を一括編集する
    * Ctrl + Shift + L
    * Ctrl + F2

* 同じ名前を編集する(一つずつ対象追加)
    * Ctrl + D

* マルチカーソルをクリック箇所に追加
    * Alt を押しながら クリック

* マルチカーソルを追加
    * Ctrl + Alt + 矢印(下 or 上)

* コマンドパレット
    * Ctrl + Shift + P

* フォーマット
    * Alt + Shift + F

* (htmltagwrap プラグイン導入後) 選択範囲をタグで囲む
    * Alt + w
条件書式プラグイン EX Ver5（developer networkの機能追加版）

developer networkで公開されている[新デザイン版 条件書式プラグイン](https://developer.cybozu.io/hc/ja/articles/208236353)に6つの機能を追加しました。

# 追加機能

## 1. 文字と日付の優先順序を設定可能
文字、日付の優先度を自由に設定できます。
![config1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/9a76bbe6-f11d-78d8-ec18-04cb64b983d6.png)
書式条件フィールドで選択するフィールドの種類によって条件値のフォーマットを自動で変更します。
※developer networkの新デザイン版 条件書式プラグインでは日付の条件書式が優先されます


## 2. 全フィールドに書式を適用可能
書式変更フィールドで全フィールド、全フィールド(一覧)、全フィールド(詳細)を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/68cacc27-aa40-8a2a-9956-16c2fcb3080c.png)


「全フィールド」を選択すると一覧画面と詳細画面両方の全フィールドが書式変更の対象となります。

一覧画面の例です。
![index1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/f98a5ebd-5d99-c305-d753-90e10011dd15.png)

詳細画面の例です。
<img height="200px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/d70cf262-12c0-22fe-b4b4-7718696cb95e.png">

## 3. 複数フィールドに書式を適用可能
Ctrlを押した状態でクリックすることで複数選択できます。

以下の例では一覧画面では全フィールド、詳細画面では会社名フィールドが書式変更の対象になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/ae629cb7-8e2a-8dbb-2de5-f205b78fd8b1.png)


## 4. リンクを設定可能
文字装飾でリンクを選択できます。
![config5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/66bcb93b-d7dc-f366-2749-bbeb151bfcfc.png)

例えば以下の設定でファイルサーバーを開くことも可能です。
未検証ですがおそらくNotesなどのアプリを起動することも可能なはずです。
![config4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/7fe9a8e6-6583-e7a1-2196-982ce6145b37.png)

![unc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/64990cbb-ba78-f5c6-f436-5e6ec89b473e.gif)
この動画で設定している値は「file://///127.0.0.1/」で、自身のクライアントPCを指定していますが、ファイルサーバーも指定できます。
例）file://///ファイルサーバーのIPもしくはドメイン名/パス/


「file://///xxxx/」を開くにはブラウザの設定変更が必要になります。
例えばInternet Explorer 11では「https\://xxx.cybozu.com/」を信頼済サイトに登録する必要があります。
詳細は[こちら（サイボウズ株式会社のよくあるご質問）](https://faq.cybozu.info/alphascope/cybozu/web/dezie/Detail.aspx?id=1301)をご確認ください。
※デヂエ 8のサイトになっていますがkintoneでも同じ設定変更が必要になります。

ファイルサーバーやNotesアプリを開けるかどうかはセキュリティ設定やOS設定に依存します。
必ず実際に利用する環境で試すようにしてください。

## 5. モバイル対応
2020年10月版kintoneのアップデートにより、モバイルでも書式が変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/41c54e24-0790-b292-9353-c0853a140685.png)

## 6. プラグイン設定画面に書式表示
プラグイン設定画面で書式を確認できるようにしました。
![config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/e2d0d6f7-67ea-4421-dec2-cefe70d76cad.png)


# ダウンロード
[conditional-format-ex-ver5.0.1.plugin.zip](https://github.com/potaracom/conditional-format-ex/releases/download/v5.0.1/conditional-format-ex-ver5.0.1.plugin.zip)をダウンロードしてご利用ください。
ソースコードは[https://github.com/potaracom/conditional-format-ex](https://github.com/potaracom/conditional-format-ex)で公開しています。
（ソースコードは不具合を作り込まないようにできる限り元のソースコードを残すようにしています）

# 更新情報
- 2021/10/12 v5.0.1
書式条件フィールドが未設定の場合は保存しないように修正しました。

- 2021/10/11 v5
プラグイン設定画面で書式を確認できるようにしました。

- 2020/10/11 v4
モバイルに対応しました。

- 2020/7/2 v3
書式変更フィールドの複数選択機能を追加しました。
書式変更フィールドに全フィールド(一覧)、全フィールド(詳細)を追加しました。

- 2020/3/14 v2 リリース
  SourceMapが存在するCDNに変更しました。

- 2019/11/11 v1
文字と日付の優先順序を設定できる機能を追加しました。
書式変更フィールドに全フィールドを追加しました。
文字装飾にリンクを追加しました。
RxSwiftのコールド備忘録1

# はじめに
RxSwiftのHot・Coldについてなかなか覚えられないので、アウトプットして覚えていくことにしました。
備忘録としてなので、あまり参考にならないかと思います。悪しからず。

# RxSwiftにおけるHot・Coldとは?
RxSwiftにおけるObservableにはHot/Coldという性質があります。

## Hot
subscribeしなくてもストリームが流れ出る。いわゆる垂れ流し状態。

## Cold
subscribeしないとストリームが流れない。手動操作(subscribeが必要)の状態。

# Coldの簡単な例

これは何が出力されるでしょうか?

```swift
let observable = Observable.of(1,2,3,4,5,6,7)
                  .map { value in
                     print(value)
                  }
```

パッと見ですと `1,2,3,4,5,6,7`が出力されそうですが、

実はこれは何も流れません。
mapを含め、ほとんどのオペレータはコールドなので、subscribeするまでストリームは流れません。

```swift
observable
     .subscribe(onNext: { value in
           print(value)
     })
     .disposed(by: disposeBag)
```

subscribeすることでストリームは流れます。


当たり前ですが、とても重要なのでまずはColdについての備忘録でした。
Hotについてはまたの機会に。
初心者によるプログラミング学習ログ 157日目

# 100日チャレンジの157日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

157日目は、


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>157日目<br><br>Udemyで架空のwebサイトコーディング講座<br>メンターさんの課題のwebサイトコーディング<br><br>コーディングメインな日でした。<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1193622970129735680?ref_src=twsrc%5Etfw">November 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Python の http サーバーサイド処理

サーバーサイドプログラム
>> Nginx + fcgiwrap という環境で作動します。
>> Get と Post の両方に対応します。
>> aa と bb を与えて、和と差を計算して返します。

```py:test_aa.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#       text_aa.py
#
#                                               Nov/20/2019
#
# ---------------------------------------------------------------------
import  sys
import  json
import  cgi
import  cgitb
cgitb.enable()
#
# ---------------------------------------------------------------------
ff=cgi.FieldStorage()
#
str_aa = ff.getfirst("aa","")
str_bb = ff.getfirst("bb","")
aa = int(str_aa)
bb = int(str_bb)
wa = aa + bb
sa = aa - bb
#
dict_aa = {}
dict_aa['aa'] = aa
dict_aa['bb'] = bb
dict_aa['wa'] = wa
dict_aa['sa'] = sa
str_aa = json.dumps (dict_aa)
#
print ("Content-type: text/json; charset=UTF-8\n\n")
print (str_aa)
# ---------------------------------------------------------------------
```

curl の　Get でテスト

```bash
curl "http://example.com/test_aa.py?aa=81&bb=34"
```

Python の　Get のクライアント

```py:http_get.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#   http_get.py
#
#                   Nov/11/2019
#
# ------------------------------------------------------------------
import  sys
import  json
import  requests
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="http://example.com/test_aa.py"
args={}
args['aa']= 891
args['bb']= 192
#
rr=requests.get(url,args)
dict_data = json.loads(rr.text)
#
print(dict_data['aa'])
print(dict_data['bb'])
print(dict_data['wa'])
print(dict_data['sa'])
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------

```

Python の　Post のクライアント

```py:http_post.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#   http_post.py
#
#                   Nov/11/2019
#
# ------------------------------------------------------------------
import  sys
import  json
import  requests
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="http://example.com/test_aa.py"
args={}
args['aa']= 875
args['bb']= 512
#
rr=requests.post(url,args)
dict_data = json.loads(rr.text)
#
print(dict_data['aa'])
print(dict_data['bb'])
print(dict_data['wa'])
print(dict_data['sa'])
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

参考ページ
[cgi --- CGI (ゲートウェイインタフェース規格) のサポート](https://docs.python.org/ja/3/library/cgi.html)
PHP Warning:  PHP Startup: Unable to load dynamic libraryで困った話

# php -v をするとこんなエラーが出た

php -v だけで無く色んなコマンドで出てくるぞ？？

```
$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/path/to/extension/mysqli.so'
```

※この記事は`mysqli.so`を例にした記事です

## 解決方法

### まずはgrepでphp.iniの中を確認してみよう

php.iniの場所がわからなければ`phpinfo()`で確認しよう！
[もういい加減覚えよう。php.iniはどこにあるのか](https://qiita.com/ritukiii/items/624eb475b85e28613a70)

```
$ cat /etc/php.ini | grep mysqli.so

// こうなっていたら
extension=/path/to/extension/mysqli.so

// コメントアウトし直してあげる！
;extension=/path/to/extension/mysqli.so
```

### コメントアウトが外れていたら直してあげる

```
$ sudo vi /etc/php.ini

// viの中で文字列検索
/mysqli.so

// これを見つけたら先頭に;を付けてコメントあるとする
extension=/path/to/extension/mysqli.so
↓
;extension=/path/to/extension/mysqli.so
```
 
### 保存したら確認

エラーがでなくなっていればOK

```
$ php -v
```
rails+vue.js チャット機能コードメモ（画像も送れる）

```
<template>
  <div>
    <div v-for="item in messages" :key="item.message.id">
      <div>
        <div>{{ userEmail }}:{{ item.message.content }}</div>
        <img :src="item.image" alt="" />
      </div>
    </div>
    <div>
      <input type="text" v-model="message" placeholder="入力してください" >
      <span>
        <button type="button" v-if="userMessageChannel" @click="speak">Send</button>
      </span>
    </div>
    <input type="file" @change="onFileChange" v-if="fileSwitch" />
    <img
      v-show="uploadedImage"
      :src="uploadedImage"
      alt=""
    />
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: "",
      messages: [],
      uploadedImage: '',
      imgName: '',
      userMessageChannel: null,
      fileSwitch: true,
      tmpImage: ''
    };
  },
  props: ['userId', 'roomId', 'userEmail'],
  created() {
    this.userMessageChannel = this.$cable.subscriptions.create( "UserMessageChannel", {
      received: (data) => {
        data['image'] = this.tmpImage
        this.messages.push(data)
        this.message = ''
        this.tmpImage = ''
      },
    })
  },
  computed: {
    sendData() {
      var send = {
        user_id: this.userId,
        room_id: this.roomId
      }
      if (this.message && this.uploadedImage) {
        send['message'] = this.message
        send['image'] = this.uploadedImage
        return send
      } else if (this.message) {
        send['message'] = this.message
        return send
      } else if (this.uploadedImage) {
        send['image'] = this.uploadedImage
        return send
      }
      send = null
    }
  },
  methods: {
    speak() {
      this.userMessageChannel.perform('speak', this.sendData);
      this.reset();
    },


    messageClass (user_id) {
      return {
        "right": user_id === Number(this.userId)
      }
    },
    dataClass (user_id) {
      return {
        "float-right": user_id === Number(this.userId)
      }
    },
    onFileChange(e) {
      const files = e.target.files || e.dataTransfer.files
      this.createImage(files[0])
      this.imgName = files[0].name
    },
    createImage(file) {
      const reader = new FileReader()
      reader.onload = e => {
        this.uploadedImage = e.target.result
      }
      reader.readAsDataURL(file)
    },
    reset() {
      this.tmpImage = this.uploadedImage
      this.uploadedImage = false
      this.fileSwitch = false
      this.$nextTick(function () {
        this.fileSwitch = true
      })
    }
  }
}
</script>

```
RISC-V freedom-e-sdkをqemuで動かすためのメモ

# 背景

そろそろRISC-Vを動かしてみようと思い、手軽なqemuを使ってみることにしました。プロセッサの仕様も正しく理解できていないので、まずは一番シンプルそうな本家のfreedom-e-sdkから動かしてみます。

# 環境

OS: Ubuntu18.04 x86_64 on VMware Fusion 11.5.0 on macOS 10.15.1

# セットアップ

gitなどのツールはセットアップ済みと仮定します。

    $ git clone --recursive https://github.com/sifive/freedom-e-sdk.git

ツールチェーンは、https://www.sifive.com/boards からダウンロードします。

    $ curl https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14.tar.gz

ツールチェーンを展開して、パスを通しておきます。

qemuも https://www.sifive.com/boards からダウンロードできますが、自分でビルドしても構いません。（2019/11/11時点のqemuのmasterは問題なく動作しました）

# ビルド

    $ cd freedom-e-sdk
    $ make
    ...
    riscv64-unknown-elf-gcc ... -march=rv32imac -mabi=ilp32 ...

とすると、software/hello/debug/hello.elf が出来上がります。
補足ですが、make helpとすると、オプションがでます。どうやらデフォルトのTARGETはfreedom-e310-arty （DigilentのFPGAボードでfreedom-e310コアを動かすためのターゲット）のようです。また注目すべきは、toolchainは、riscv64-unknown-elf-gccとなっており、64bit CPUまで対応可能なコンパイラーを使っていますが、freedom-e310が32bitなので、-march, -mabiを指定しているようです。

# qemuで実行

    $ qemu-system-riscv32 -nographic -machine sifive_e -kernel ./software/hello/debug/hello.elf 
    Hello, World!

とすれば、先ほどビルドした hello.elf が実行できます。
launchctl leadをするとPath had bad ownership/permissionsとエラーが出るときの対処法

#問題
```bash
$sudo launchctl load XXXXX.plist
XXXXX.plist: Path had bad ownership/permissions
```
とエラーが出る。

#解決方法
>https://entotsu44.hatenablog.com/entry/2019/09/10/175534
Pythonを実行しようとしたらMicrosoftStoreに飛ばされた件

##対象読者

- PowerShellでPythonを実行したらMicrosoftStoreに飛ばされるようになった人
- PowerShellでPythonスクリプトを実行しても何も起らなくなった人
- パスは設定済みで元々Pythonが実行できていた人

##環境

- Windows10 Home
- Anaconda3

##結論
~~原因は不明ですが~~下記パスが参照されていると思われます。環境変数の順位を変更するなどしましょう。
Windows 10 May 2019 Update が原因のようです（@Miyukiumooさんありがとうございます）
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1188376.html

```console:諸悪の根源
C:\Users\user\AppData\Local\Microsoft\WindowsApps\python.exe
```

##経緯

###Pythonが実行できない
いつも通りPowerShellでPythonスクリプトを実行しようと思ったら、何も起こらず処理が返ってきた。
コマンドプロンプトでもダメ。
試しにインタプリタを起動してみたらMicrosoftStoreに飛ばされた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110876/01289b13-d49f-bf4a-9bea-3f34fda19298.png" width=100%>

**なにゆえ？？**

ちなみにこのとき、Anacondaの仮想環境では普通にスクリプト実行できてました。

前日ガラにもなくcondaのアップデートをしてみたらめちゃくちゃ時間かかったしめちゃくちゃconflictって表示されてたしCtrl-cで中断・再開とかしちゃったし、デフォルト環境が壊れちゃったのかな～とAnacondaを入れなおしてみたけど、ダメ。

###実行ファイルおよび環境変数の確認
Anaconda入れなおす前に確認するべきことでしたが。。。

環境変数の確認。ちゃんとpython.exeまでパスが通っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110876/75379dca-e892-0ff6-dbdb-21041eabef84.png" width=100%>


**では、なにゆえ？？**

###コマンドが参照しているパスの確認
ここでやっと気付く。そもそもなんでエラーじゃなくてMicrosoftStoreにとぶんだろう。
コマンドが参照しているパスを確認してみると

```console
> where python
C:\Users\user\AppData\Local\Microsoft\WindowsApps\python.exe
C:\Users\user\Anaconda3\python.exe
```

**なんかおる**

エクスプローラで確認してみると、比較的最近できたファイルのようでした。
怒りを込めて削除しようとするも弾かれました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110876/690843f4-5ced-e509-53e4-41b2af17a45b.png" width=80%>

管理者権限で実行すれば消し去れるのかなと思いつつ、穏便に解決する道を選びました。

###環境変数の順位を変更する
コマンドを実行すると、環境変数のパスを走査して初めに見つかったファイルを実行します。
MicrosoftStoreに飛ばすpython.exeより先にAnaconda3のpython.exeがみつかるようにします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110876/937fe9a5-6c3f-73e1-6c14-ce8b0cc6368f.jpeg" width=60%>


これで無事にPythonが実行できるようになりました。

##まとめ
コマンドが実行できなくなったらまずコマンドが参照しているパスの確認をすべし。

何もしてないのにパソコンが壊れた と言いたくなるような状況でした。
後学のため、こんなことしたんじゃない？というのがあればご教示頂きたいです。
【MySQL】左外部結合を用いて表を結合

#概要
アウトプット用に、学習した内容を紹介していきます。
本日はMySQLでLEFT JOINを使ってみます。

#環境
Mac OS Mojave 10.14.6
MySQL 5.7.28

#表の結合

以下の二つの表がデータベースに登録されており、これを結合してユーザーが投稿した内容を表示したいとします。

**userテーブル**

|  id  |  name  |  gender  |  age  | 
|:---:|:---:|:---:|:---:| 
| 1 |  john  |  m  |  18  | 
| 2 |  paul  |  m  |  20  |
| 3 |  alice  |  f  |  15  |
| 4 |  dabid  |  m  |  17  |

**postsテーブル**

|  id  |  user_id  |  content  |
|:---:|:---:|:---:|
| 1 |  1  |  Hello  |
| 2 |  1  |  World  |
| 3 |  2  |  I'm Paul.  |
| 4 |  4  |  😀  |
| 5 |  5  |  😂  |

posts表の全てのcontentと、それに対応したusers表のnameが欲しいカラムです。
この時、以下のSELECT文による左外部結合を用いることで欲しい結果が得られます。

```
mysql> SELECT name,content
    -> FROM posts
    -> LEFT JOIN users
    -> ON posts.user_id = users.id;
```

```:出力
+-------+-----------+
| name  | content   |
+-------+-----------+
| john  | Hello     |
| john  | World     |
| paul  | I'm Paul. |
| dabid | 😀          |
| NULL  | 😂          |
+-------+-----------+
5 rows in set (0.00 sec)
```
無事にnameと、それに対応するcontentが表示されました。また'😂'に対応するnameがusers側に存在しないため、nameがNULLになっています。

ちなみに上記の表をINSERTで作成しようとすると、posts表・contentカラムに登場してくるシングルクォーテーション、そして絵文字で、それぞれエラーを吐いてしまう可能性があります。

シングルクォーテーションはエスケープ、絵文字は文字コードをutf8からutf8mb4に変更することで対応が可能ですので、気になった方はぜひ調べてみてください。
Ruby勉強日誌２

自分の復習用に基礎的な文言をまとめてみました。





配列：一つの変数に複数の値を入れること

```hairetsu.rb  
  変数 = [値a,値b,値c]
end
```

ハッシュ：複数のデータをまとめ、キーをつけることができる型

```hash.rb
　変数 = { :key1 => 値a, :key2 => 値b }
end
```

引数

```hikisu.rb
  puts 表示したいもの
  #表示したいものの部分が引数にあたる
end
```

addメソッド:戻り値を指定する

```add.rb
  def add(値a,値b)
  値a + 値b
  end
```
ElasticBeanstalk Worker Tierで定期バッチの構築する

めもです。随時追記

## TODO
- エラーの時の動作
- VPC等の設定
- 監視周り

## つくりたいもの
- ElasticBeanstarkのWorker Tierで定期的にメール送信するバッチ
- PlatformはDockerMultiContainer
- Cronでx分に一回送信するメールあるかチェックして送信する

## ざっくり
- EBのWorkerはSQSのキューをEC2で監視してる
- キューにPublishされたら監視Jobはlocalhostの80にHTTP/POSTする
- WEBAPI作って処理すりゃいい
- HTTP/POSTの実態はApache/httpdらしいのでデフォTimeoutは5分
- 処理が長時間かかることが予想される場合は、Timeoutを延長するか,いったん200で返して、バックグラウンドで処理する
- 200返すとキューから消えるので別途ステート管理が必要
- EBはECSやらLBとか一括で設定できるアプリケーションプラットフォーム？でいいのかな

## 構築
### aws-ebcliの導入
- https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html#eb-cli3-install.scripts
- pipでインストール。要aws-cli設定

### アプリケーション作成+環境作成
1. `eb init`でアプリケーションを作る(プラットフォームはDocker Multi Container)
2. ecr作ってAPIをPush
3. aws-elasticbeanstalk-ec2-roleにECRのPullポリシーつける
4. `Dockerrun.aws.json`書く
5. Cron.yaml書く
6. よくわかんないけど要Commit????
7. `eb create ${env-name} -t worker`でWorker環境作成
8. Deployまでいくはず、ダッシュボードからSQSに飛んでメッセージ送信してみる
9. LogからAPIのLog確認して200で処理されてるの確認

## dockerrun.aws.json
- MultiContainerPlatformだけど確認だけなのでコンテナ1個
- イメージ的にDockerComposeのJSON版
- `"AWSEBDockerrunVersion": 2`はMultiContainer専用っぽい
- imageにECRのURI　

``` .json
{
    "AWSEBDockerrunVersion": 2,
    "containerDefinitions": [
        {
            "name": "python-caintainer",
            "image": "xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/eb-worker-demo:latest",
            "essential": true,
            "memory": 256,
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80
                }
            ],
            "workingDirectory": "/var/app",
            "environment": [],
            "entryPoint": ["python", "app.py"]
        }

    ]
}
```

## 定期Job
- cron.yamlで設定する(プロジェクトルートにおいときゃいい？)
- urlに対応してPOSTされる
- cron式通りにSQSがPusblishされる

``` .yaml
version: 1
cron:
 - name: "batch_task_1"
   url: "/api/v1/sendmail"
   schedule: "*/30 * * * *"
 - name: "batch_task_2"
   url: "/api/v1/status"
   schedule: "*/5 * * * *"
```
VSCode【Remote-SSHで接続できない】

2020-03-14追記
version1.43.0で下記不具合は解消した模様

#環境
OS:windows 10 Pro
バージョン:1903
ビルド:18362.418 

VSCode:1.40.0
Remote Development 0.17.0

#現象
Remote-sshを使うためconfigを作ったが、configファイルが読み込まれない
UserもHostNameも読まれないため接続先に接続できない

#原因
configまでのパスに「久」の字が含まれている（ほかにも使えないマルチバイトの文字は色々あるはず）

#対処方
パスでマルチバイトを使わないようにする
Azure App Service（Web App）にPythonのFlaskのWebアプリをのせるサンプル


## 準備

Azureポータルにログインして、作成から **Webアプリ**（App Service） 作る。

- 公開： コード
- ランタイムスタック： Python 3.6とか　3.7とか　3.8とか
- OS：　Linux ※なんとなくWindowsじゃダメな気がします…気のせいかもしれませんが……

あとは適当に好きな感じで起動してAzure App Service（Web Apps）のデフォルトの画面が出ることを確認しておいてください。

## まず手元でコードを書く

Azureにデプロイする前にまずローカルで動くコードを書きます。

```python:application.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return "hello world!"

if __name__ == "__main__":
    app.run(debug=True)
```

これを保存してローカルのコンソールとかで実行してみてください。

```bash
python application.py
```

ブラウザで `http://127.0.0.1:5000/` にアクセスするとこんな表示がでると思います。
`Flask` が入ってないよというエラーが出たら `pip install Flask` でインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/d910bac7-8f98-ec69-3d2d-94a0f7e13d89.png)

これでローカル側の準備が完了です。

## Azureに持って行く

Gitとか使った方が楽です！というのは最初に言いますが、、、とは言え、ちょっと試すのにリポジトリ作るのもめんどくさいなーということもあると思うのでみんな大好きFTPでやっておきます。

FTPの手順はそこら中にあるので省略して、

```tex
/site/wwwroot/
```

ここさきほど作った `application.py` を置いてください。

> ファイル名は `application.py` じゃないといけません。デフォルトで `application.py` か `app.py` を見つけてくれるようになっています。

そして忘れちゃいけないのが App Service の再起動です。

再起動して（きもち30秒くらい待って……）ブラウザを更新してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/abc0c214-048c-bf8d-7c10-250412232045.png)

無事にこの画面がでたら成功です。
5Vの定圧回路

FPGA FMチューナ用に5Vの定圧回路を作って見ました。

![写真（2019-11-01 10.14）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fa248d06-8fa9-fed5-cb82-92354ff4e744.jpeg)

ACアダプタはトランスタイプのものとスイッチングタイプのものがあります。テスターで計ると無負荷時には定格の電圧より高くなります。これは定格の電流を流した時にその電圧になる様になっているためです。トランスタイプのほうがより高く出る傾向があるようです。

7805などのレギュレーターの入力は2V以上高くないといけません。またあまり高すぎると発熱が激しくなります。7805の場合は7V以上必要です。

モールドタイプの部品を使ったので、金属のネジでヒートシンクにとめています。

使用する電解コンデンサーは倍くらいの耐圧があればよいようです。

定格5.5V 900mAのトランスタイプのACアダプターは無負荷で8Vちょっと出ていて、FPGA FMチューナーの負荷450mAをかけたとに7.3Vとなっていて、発熱もほんのりで良い感じです。

![定圧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/85e575a2-4ca8-ca29-61f5-733f4aea1dc3.png)

当初これより4Vくらい高いアダプタを使用したら結構発熱していました。

使っていなかった、スイッチを付けたケースにちょうど入ったので入れて、テスト用のジャックも付けてみました。

![IMG_20240112_112937.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fb45762a-1216-0ad1-8a50-9a3a7e05b607.jpeg)

このジャック千石電商のジャンク袋に50個くらい入っていたものです。かなりしっかりしたもので、おそらくマル信のチップジャックではないかと思われますが、カタログにはありません。

FPGA FMチューナ用に作りましたが、５V系の電源としていろいろ使いまわしています。

トランスを使った電源は

* LDOのレギュレータ
* 普通のレギュレータ
* FETのディスクリート
* トランジスタのディスクリート

作れますが、いろいろディスクリートの実験をされている方がおられました。

http://juubee.org/kimagure/kimagure_menu.html

ディスクリートといっても制御部分をNJM723のようなICを使うケースとオペアンプとシャントレギュレーター(TL431)で作るケースなどがあるようです。

部品取りした小さいトランスで、レギュレータで10Vの電源を作ろうとしました。無負荷でトランスの出力がAC10.7Vあブリッジとコンデンサーで整流してDC 14.8Vくらいあったのですが、負荷をつなくと11.8Vくらいまで下がって、普通のレギュレータでは出力が10Vを切ってしまうようでした。
AnglerでtypescriptしてQRコード生成

#AnglerでtypescriptしてQRコード生成

QRコード読み取り機能をAnglerでJSするメモ

##ngx-kjua

文字入れたりできる機能あるようで良さそう
![NoName_2019-11-11_16-50-5_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/b6e56637-2eb1-db59-bfa4-13bc5bd00933.png)

コードもHTMLに埋め込みできるのも今回は良さそう

```
 <ngx-kjua
    [text]="'hello'"
  ></ngx-kjua>
```

###Gitとサンプルサイト

https://github.com/werthdavid/ngx-kjua
https://werthdavid.github.io/ngx-kjua


##ZXing

スキャナー込なので、そこが良いねポイント？

![NoName_2019-11-11_19-16-1_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/8c89e9e6-447a-637c-8d52-04eb97c36039.png)


ID指定でQR生成がメイン？

```
<div id="result"></div>
```

###Gitとサンプルサイト

https://github.com/zxing-js/library
https://zxing-js.github.io/library/
Ubuntu 18.04 に Python 3.8 をインストール（OS標準）

# はじめに

Ubuntu 18.04にPython 3.8をインストール
(最近できるようになったと思われる)
[changelogs\.ubuntu\.com/changelogs/pool/universe/p/python3\.8/python3\.8\_3\.8\.0\-3~18\.04/changelog](http://changelogs.ubuntu.com/changelogs/pool/universe/p/python3.8/python3.8_3.8.0-3~18.04/changelog)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update; apt install -y python3.8
... 略
```

### 各種確認

```shell-session
# which python3.8
/usr/bin/python3.8

# ll /usr/bin/python*
-rwxr-xr-x. 1 root root 5203488 Oct 28 16:14 /usr/bin/python3.8*

# python3.8 -V
Python 3.8.0

# apt show python3.8
Package: python3.8
Version: 3.8.0-3~18.04
Priority: optional
Section: universe/python
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 488 kB
Depends: python3.8-minimal (= 3.8.0-3~18.04), libpython3.8-stdlib (= 3.8.0-3~18.04), mime-support
Suggests: python3.8-venv, python3.8-doc, binutils
Breaks: python3-all (<< 3.6.5~rc1-1), python3-dev (<< 3.6.5~rc1-1), python3-venv (<< 3.6.5-2)
Download-Size: 355 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages
Description: Interactive high-level object-oriented language (version 3.8)
```
書籍「15Stepで踏破 自然言語処理アプリケーション開発入門」をやってみる - 1章メモ「演習に入るまえの予備知識」

# 内容
[15stepで踏破 自然言語処理アプリケーション入門](https://www.amazon.co.jp/dp/4865941320) を読み進めていくにあたっての自分用のメモです。

# 準備
- 個人用MacPC：MacOS Mojave バージョン10.14.6
- docker version：Client, Server共にバージョン19.03.2

# 章の概要
本に記載の通り、学習環境の構築および、演習の前提となる知識（プログラミング言語とライブラリ）について押さえる。

# メモ
## 1 序論・自然言語処理と機械学習
メモなし

## 2 本書の執筆・開発環境
執筆環境をrequirements.txtとして配布されているほか、Dockerfileも配布されている。

requirements.txtは下記のようにライブラリの種類とバージョンが記載されていて、pipを使って一括でライブラリをインストールすることができる。

```bash:requirements.txt
numpy==1.15.0
scipy=1.1.0
...
mecab-python3==0.996.2
neologdn==0.3.2
...
```

```bash
# pipでのインストール例
$ pip install --no-cache-dir -r requirements.txt
```

Dockerfileを利用する場合は、DockerfileからDockerコンテナをビルドして起動する。（自分はこちらで実行）

```bash
### コンテナビルド ###
# Dockerfileが置いてある場所で実行
$ ls | grep Dockerfile
Dockerfile

# リポジトリ名：15step、タグ名：latest でビルド
$ docker build -t 15step:latest .

### コンテナ起動 ###
# デフォルトでコンテナを起動するとpythonが起動した状態
$ docker run -it 15step:latest
Python 3.6.5 (default, Jun 27 2018, 08:22:23)
>>>

# 停止はquit()
>>>quit()
$

# bashを起動したのちpythonを起動する方法も
$ docker run -it 15step:latest /bin/bash
/usr/src/app# 
/usr/src/app# python
Python 3.6.5 (default, Jun 27 2018, 08:22:23)
>>>
```

## 3 機械学習のためのPythonの基礎
- リストとタプルと辞書を使い分けれるようにする
    - タプルはimmutable
- 三項演算子がC言語とかと比べるとより英文的な書き方
    - `price = 1000 if age >= 20 else 800`
    - age>=20ならばprice=1000、そうでなければprice=800が実行される
- for文
    - listに対してはforeach的に`for val in ＜リスト＞:`
    - カウンタ変数が欲しい場合はenumerateを`for i, val in enumerate(＜リスト＞):`
    - カウンタ変数のみが欲しい場合はrangeを`for i in range(5):`
- 関数、クラス、モジュール
    - モジュールを読み込む`import module as md`
        - `md.method `で関数を呼び出す
    - モジュールの関数を読み込む`from module import method`
        - `method`で関数を呼び出す
- 正規表現は正規表現パターンをあらかじめコンパイルしておけば、実行を高速化できる

## 4 数値計算ライブラリNumPy
- 配列は`numpy.array(＜リスト＞)`
- 次元は`＜配列＞.shape`
- スライス（複数の要素を指定して取得）は`＜配列＞[m:n]`
    - 要素m~n-1までを取得
    - m=0やn=<要素数>の場合は省略可
- ブロードキャスティング
    - ベクトル＋スカラー や 配列＋ベクトル の計算時、自動的に次元を揃えてくれる
- 四則演算は`＜配列1＞ 演算子 ＜配列2＞`で計算できる
- 内積は`numpy.dot(＜配列1＞,＜配列2＞)`
- 最大値を取得したい場合
    - 要素の最大値を得るのは`numpy.max(＜配列＞)`
    - 要素の最大値のインデックスを得るのは`numpy.argmax(＜配列＞)`
- 合計、平均、乱数、初期化（0で初期化,1で初期化）
- 配列結合
    - 縦方向は`numpy.vstack(＜配列1＞,＜配列2＞) `
    - 横方向は`numpy.hstack(＜配列1＞,＜配列2＞) `

## 5 本書で利用するその他の主要ライブラリ
メモなし


# 参考引用文献
- [15stepで踏破 自然言語処理アプリケーション入門](https://www.amazon.co.jp/dp/4865941320)
numpy.load()で`Object arrays cannot be loaded when allow_pickle=False`が発生する場合の対処法

- numpy 1.16.3 以降

# 現象

Pythonコードの例

```python
np.load('/path/to/file.npy')
```

発生するエラーの例

```
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-37-1db66562b57b> in <module>
----> 1 np.load('tmp.npy')

~/venv/aep/lib/python3.7/site-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding)
    451             else:
    452                 return format.read_array(fid, allow_pickle=allow_pickle,
--> 453                                          pickle_kwargs=pickle_kwargs)
    454         else:
    455             # Try a pickle

~/venv/aep/lib/python3.7/site-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs)
    720         # The array contained Python objects. We need to unpickle the data.
    721         if not allow_pickle:
--> 722             raise ValueError("Object arrays cannot be loaded when "
    723                              "allow_pickle=False")
    724         if pickle_kwargs is None:

ValueError: Object arrays cannot be loaded when allow_pickle=False
```

# 原因


`numpy v1.16.3` より、`numpy.load()`関数の挙動が変更されたため。

|変更前|変更後|
|---|---|
|`allow_pickle`オプションの省略時のデフォルト値は`True`|`allow_pickle`オプションの省略時のデフォルト値は`False`|

- [np.load - NumPy v1.17 Manual](https://docs.scipy.org/doc/numpy/reference/generated/numpy.load.html)

# 解決方法

後述する**セキュリティ上の懸念**がないことを確認した上で、以下のように`allow_pickle`オプションを指定してやれば良い。

```python
np.load('/path/to/file.npy', allow_pickle=True)
```

# 解説

### numpy行列と`dtype`

numpy行列（`np.ndarray`）は数値だけでなく文字列やPythonオブジェクトを格納することができる。格納された値の種類は、`dtype`という属性へと反映されている。

- [Data type objects (dtype)](https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html)

### `numpy v1.16.0`の脆弱性

Pythonオブジェクトが含まれたnumpy行列（をシリアライズしたファイル）を`np.load()`によってでシリアライズする際に、悪意のあるコードを実行できてしまうという脆弱性が報告されている。（ただしこの脆弱性に関しては反論がある）

- [CVE-2019-6446](https://nvd.nist.gov/vuln/detail/CVE-2019-6446)

そこで`v1.16.3`より、`np.load()`のデフォルトの挙動が前述したように変更され、`dtype`がPythonオブジェクトである場合に、`allow_pickle=False`ならば`ValueError`をスローするようになった。
より安全サイドへ倒すための仕様変更と言える。

### セキュリティ上の懸念

当然のごとく、**信頼できないファイル**に対して`np.load(allow_pickle=True)`してはいけない。前節で述べたように、任意のコードを実行できてしまう可能性がある。

Jupyter等によるデータ整形や機械学習など、アドホックなコードなら普通は問題ない[^1]。注意すべきはPythonを用いたアプリケーション開発者である。

<dt>NGな例</dt>
<dd>ユーザからアップロードされたファイルに対して`np.load(allow_pickle)`する</dd>
<dt>OKな例</dt>
<dd>システム内でシリアライズしたファイルを`np.load(allow_pickle)`する</dd>

[^1]: 悪意のある同僚（？）からもらった`*.npy`ファイルなら問題ある。

### これってBreaking Change じゃないの？

アプリケーションの挙動が変わってしまうので、当然Breaking Change（後方互換性のない変更）だと思う。

Pythonの数値計算系のライブラリには、デフォルト値の変更ならセーフみたいな風潮があるかもしれない。[^2]リビジョンアップだから大丈夫でしょう、とか思っていたら痛い目に合う。
他の言語から参入したアプリケーションエンジニアはよく注意されたい。

[^2]: 他の例としては`sklearn.ensemble.RandomForestClassifier`の`n_estimator`のデフォルト値など
curlを使用して外部APIの情報を取得

## curlとは
> cURLとは、HTTPリクエストをすることにより、外部サイトの情報を取得することができる関数です。
>https://www.sejuku.net/blog/26754

### curl_init()
cURLのセッションを初期化し、返り値にcURLハンドルを返します。

```
curl_init ([ string $url = NULL ] )
```
### curl_setopt()
cURLの転送用オプションを設定します。返り値にはboolean型の値を返します。

```
curl_setopt ( resource $cURLハンドル , int $オプション , mixed $値 )
```
### curl_exec()
cURLのセッションの実行時に使用します。この関数はセッションの初期化、オプション設定後に使用する必要があります。

```
curl_exec ( resource $cURLハンドル )
```
### curl_close()
cURLのセッションを閉じるときに使用します。

```
curl_close ( resource $cURLハンドル )
```

## 基本的な使い方
```curl.php
<?php
 
$url = "https://www.aaa.com/";
 
//cURLセッションを初期化する
$ch = curl_init();
 
//URLとオプションを指定する
curl_setopt($ch, CURLOPT_URL, $url);//取得するURL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//curl_exec()の返り値を文字列で返す。通常はデータを直接出力。
 
//URLの情報を取得し、ブラウザに渡す
$res =  curl_exec($ch);
 
//結果を表示する
var_dump($res);
 
//セッションを終了する
curl_close($conn);
 
?>
```

このコードを実行すると、ブラウザに指定したURLを表示する。
cURL関数はhttpのほかにhttpsによるSSL/TSL認証にも対応。

## 【実例】ビットコイン価格を取得し、表示する
```curl;.php
<?php
//ビットコインの各種情報
$url = "https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY";

//curlセッション初期化
$ch = curl_init();

//URLとオプションを指定する
curl_setopt($ch, CURLOPT_URL, $url);//取得するURL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//curl_exec()の返り値を文字列で返す

//URLの情報を取得
$response = curl_exec($ch);
$result = json_decode($response);//取得したURLのJSONコードをデコードし$resultに代入
echo '現在のBTC価格は:' . number_format($result->ltp) . '円';//ビットコイン価格を表示

//セッション終了
curl_close($ch);
?>
```

「ltp」項目の右に表示されている数字が、bitFlyerでの現在のビットコイン価格
$result->ltpでビットコイン価格取得

**number_format()** 
パラメータが一つの場合、千位毎にカンマ（,）を追加する


## JSONとは
JSONとは、JavaScript Object Notationの略でデータフォーマットの一種。

JSON形式のデータ

```
{
"name" : "JSON",
"age" : "30",
"gender" : "male",
}
```

波括弧で括り、その中がデータ。
コロン（:）の左側が「key」、右側が「value」
macOS Catalina にアップデートしたらDockが消えた

#問題
* macOS Catalina にアップデートしたら、Dockが表示されなくなった。
    * システム環境設定で表示／非表示などを切り替えても回復しない

#解決方法（case report）
* 本質的な解決方法ではなく、私の環境ではこれで解決したというケースレポートです。
* ターミナルで以下のコマンドを実行し、Dockの設定を破棄する（デフォルトに戻す）
    * 再起動しなくてもコマンド実行後直ちにDockが表示された。（Finderが再起動された）

```Terminal.app
$ defaults delete com.apple.dock; killall Dock
```
CodeCommitへのアクセスをIPアドレスで制限

# CodeCommitへのアクセスをIPアドレスで制限したい

## IPアドレスで制限できるサービス

　AWSコンソールへのアクセスも同じやり方で制限できるようです。 
[AWS: 送信元 IP に基づいて AWS へのアクセスを拒否する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html)


## IAMポリシーの書き方

IAMポリシーには以下のように送信元IPアドレスでサービスを制限できる機能があります。
Actionセクションに**"codecommit:**と記載してCodeCommitへのアクセスを制限しています。

```JSON:IAMポリシー
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Deny",
         "Action": [
            "codecommit:*"
         ],
         "Resource": "*",
         "Condition": {
            "NotIpAddress": {
               "aws:SourceIp": [
                  "xxx.xxx.xxx.xxx/16"
               ]
            }
         }
      }
   ]
}
```

[指定された IP アドレス範囲アクセスからリポジトリへ接続するユーザーを許可する](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/auth-and-access-control-iam-identity-based-access-control.html
)

## 設定の確認

　IAM Policy Simulatorを使って、疑似的にポリシーの確認ができます。
　Permissionが想定通りの結果になれば設定が完了です。

[IAMPolicy Simulator を使用した IAM ポリシーのテスト](
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_testing-policies.html

)
サーバー側のPHPのバージョンが、一部のライブラリのインストール要件に満たない場合

ローカルとサーバーでPHPのバージョンが違うような環境で作業をしていると、やはり不具合というかエラーが出てきてしまいます。
もっとも、環境を同じにしろって話なんですけど・・・😢

ちゃんと環境を統一しないとエラーが出るよという自分への戒めを込めて備忘録としてまとめてみます...

## 問題点
今回、Laravelプロジェクトを作成した際に内包されるライブラリのうち、`doctrine/lexer`が、PHP7.2以上を要求していました。

そしてサーバーの方のPHPのバージョンが7.1.8だったので、バージョンが足りず(?)、エラーとなっていました。



## 解決方法
`doctrine/lexer`のバージョンを指定してやることでこの問題を解決しました。

```
composer require doctrine/lexer=1.0.2
```
を実行してバージョンを下げました。

どうやら`doctrine/lexer`のバージョンが1.1.0になった時にPHP7.2.0以上を要求するようになったらしいです。

サーバーのPHPのバージョンを上げれば済む話ですが、他のプロジェクトに影響があるかな？と思いライブラリのバージョンを下げて対応しました。
Railsでcontroller作成からテーブルのデータを取得するまでのメモ

最近、Rails触り始めたのでアウトプット兼メモです。
間違いありましたらご指摘いただけますと幸いです。

##コントローラーの作成
```
$ rails generate controller コントローラー名 アクション名
```

※コントローラー名は頭文字が大文字かつ複数形で作成します。

generateはgと省略してもOKです。

##モデルとテーブルの作成 
```
$ rails g model モデル名 カラム名 
```
※モデル名は頭文字が大文字かつ単数形で作成します。


カラムを増やす場合はこの様に後ろに追記していきます。

```
$ rails g model モデル名 name:string(unique|index) device_id:integer
```
次に、このままではまだDBに反映されていないので、
マイグレーションしてDBに反映させます。

```
$ rails db:migrate
```
##マイグレートの確認

```
$ rails db:version
```

ロールバックするときはこれ

```
$ rails db:rollback
```
※作成されたマイグレーションファイルはモデル名が複数系となります。

##controllerからデータを登録する
controllerから検索する為のデータを登録します。

```
モデル名.create(フィールド名: 登録する値)
```

##controllerからデータを取得する

主キーで検索する場合

```
モデル名.find(主キー値)
```
※主キー値は配列でも可能です。

任意の値で検索する場合

```
モデル名.find_by(フィールド名: 検索する値)
```


これでテーブル作成から、データを登録して取得する一連の流れが出来ました。


##参考
Rails generate の使い方とコントローラーやモデルの命名規則
https://qiita.com/higeaaa/items/96c708d01a3dbb161f20

rails generate migrationコマンドまとめ
https://qiita.com/zaru/items/cde2c46b6126867a1a64