OmniAICreator/Qiita-1.07M huggingface dataset:
AWS リージョンとAZ

#はじめに
AWSソリューションアーキテクトアソシエイト資格取得のための勉強をアウトプットしていきます。
# リージョンとは
大まかに言うと「地域、国」のことです。
AWS は世界中にサーバーを持っており、リージョンという大きな単位でまとまっています。
東京リージョン、ソウルリージョン、北カリフォルニアリージョン、など多数存在します。
![AWS　リージョン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/eb43df5e-d4b9-a063-732c-e49b90cbb601.gif)
##特徴
複数のリージョンにシステムを分散配置することで、障害耐性を高めることができます。

#AZ（アベイラビリティゾーン）とは
各リージョンに、アベイラビリティーゾーンと呼ばれる複数の独立した場所があります。AZ(アベイラビリティーゾーン)とは、物理的、ソフトウェア的に自律しているデータセンタの集合の単位です.
<img width="747" alt="スクリーンショット 2020-03-02 10.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/156fb681-b173-13e6-1825-e2d31de2225f.png">
##抑えておきたいポイント
<img width="878" alt="スクリーンショット 2020-03-02 10.23.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/e29f9d4f-56ee-7c7a-1aff-530febe79fd5.png">
####AZ を利用した冗長構成で耐障害性を高める
####マルチAZ
複数の AZ を用意しているのは、データセンター障害が発生した場合に対処するためです。AWSをはじめとするクラウドは何もしなくても非常に高い耐障害性を持っているわけではなく、耐障害性が高める複数の仕掛けを用意していることです。
複数の AZ にリソースを分散してリソースを配置することで今回のような単一データセンター障害の場合でも影響を軽減することができます。


例えば ELB を利用して負荷分散する場合は、ap-northeast-1a と ap-northeast-1c にインスタンスを配置するようにします。
また Amazon RDS などのマネージドサービスでもマルチAZ 構成を指定して、別の AZ にリードレプリカを配置し、障害検出時に自動的に切り替えることができます。オートスケーリングを利用する場合でも、複数の AZ を指定して障害時に自動的に、もしくは主導で切り替えることができます。


##AWSサービスの3つのサービスレベル
<img width="791" alt="スクリーンショット 2020-03-02 10.59.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/ea3de861-65dc-e0cb-26d7-cb233d6652eb.png">

#最後に
このような感じでポイントを抑えながらアウトプットしていきます。
次はVPCをまとめていきたいと思います。

**VPC偏**
https://qiita.com/avicii2314/items/ac787c57e0123600d57a
新しいMac bookを買った時にする設定　（Flutter, Reactエンジニア編）

#無ければアカウントを取得するもの一覧

- Git hubアカウントを取得 (仕事用とプライベート用を分けたければ)
https://github.com

- 初期設定のやり方
https://help.github.com/en/articles/set-up-git

- Google Account (会社のメアドで取得)
https://myaccount.google.com/intro

#インストールするもの一覧

- X Code
App Storeで検索

- Android Studio
https://developer.android.com/studio

- Flutter
https://flutter.dev/

- Slack
App Storeで検索

- nvm
https://qiita.com/sansaisoba/items/242a8ba95bf70ba179d3
インストール後最新のnpmをインストール

- Firebase CLI
コマンドラインで下記の２つを実行
`npm install -g firebase-tools`
`firebase login`

- Git
https://git-scm.com/downloads

- Homebrew
https://brew.sh/

- Ruby
https://qiita.com/nishina555/items/63ebd4a508a09c481150

- ESLint
`yarn global add eslint`

- VS Codeを入れる
https://code.visualstudio.com/

- VS Codeのsettings.jsonに下記を追加

```
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
  "source.fixAll.eslint": true
  }

```
-
Couldn't find User with 'id'エラーについて

#はじめに
ブラウザにてviewページを表示しようとしたところ、表題のエラーとなりました。
Couldn't find User with 'id'エラー
idが見つかりませんよと言われてます。
原因を調べてみました。

#今回の原因および解決法
以下の通りresourcesを複数形から単数形に変更したところ改善されました。

```ruby:routes.rb（変更前）

Rails.application.routes.draw do
  resources :users,only: [:show,:index,:edit,:update]
  resources :books
  devise_for :users
end
```
↓

```ruby:routes.rb（変更後）

Rails.application.routes.draw do
  resource :user,only: [:show,:index,:edit,:update]
  resource :book
  devise_for :users
end
```

resourceメソッドには単数形のresourceと複数形のresources、
２つの定義が存在し、今回はresourceでpathを生成しないとURLにIDまで引き渡してしまう為？エラーとなっていたみたいです。

こちらの方法で改善されたのでCouldn't find User with 'id'エラーが出た際はresource部分を確認してみるといいと思います。
【資格】医療情報技師に合格した時の勉強法を思い出して書いてみる


2017年に取得することができました医療情報技師を受験した際の思い出を書いて見ます。


## 試験の概要

医療情報技師試験は次の3つの受験科目があり、その全てで合格点を超える必要があります。

* 医学・医療 系
* 情報処理技術 系
* 医療情報システム系

いずれの科目もマークシート方式での多肢選択方式で、5択からの選択問題が多いです。
問題の中には2個以上を選択するする問題もありますので、要注意です。
問題をよく読んでおかないと、「あれ！？これ複数選択だったの！？」ってなります。（なりました。

難易度的には`情報処理技術系`であれば感覚的には基本情報技術者くらいの知識が求められるかなぁと言った印象。
`医学・医療系`、`医療情報システム系`に関しては専門的な知識が問われる事が多く、予め準備が必要です。
実際、私が合格した時も`医学・医療系`の点数はボーダーギリギリだった。。。

## 受験時の勉強方法

医療システム部署に所属していたり、応用情報技術者、そして医療情報基礎知識検定も合格していましたので、ある程度のベースとなる知識はありました。
ですが、試験範囲も結構広かったので3, 4ヶ月は準備した覚えがあります。

* [医療情報基礎知識検定の受験時の話](https://qiita.com/h-ueno2/items/72b70a69bcfb2f62a6e4)




勉強方法の基本は次のような感じでひたすら過去問を解いてました。
1. とりあえずテキストを一通り目を通す。
2. ひたすら過去問を解く。
3. わからなかった問題について復習。


##使用したテキスト

+ [医療情報 第６版 医療情報システム編](http://www.shinoharashinsha.co.jp/Books2.aspx?PID=311&PNO=-1)
+ [医療情報 第６版 医学・医療編](http://www.shinoharashinsha.co.jp/Books2.aspx?PID=309&PNO=-1)
+ [医療情報 第６版 情報処理技術編](http://www.shinoharashinsha.co.jp/Books2.aspx?PID=308&PNO=-1)

医療情報学会が出版しているテキストのため、試験範囲をカバーします。
内容のイメージ的には学校の教科書といった感じで、資格勉強に特化した内容ではないため、
正直取っつきづらさも若干感じるかなという感想。
購入する場合は、最新版を購入しましょう。


+ 医療情報基礎用語集

公式で配布している試験範囲の基礎用語とその解説をまとめた用語集。
対象は基礎知識検定試験の受験者のため、医療情報技師のすべてをカバーしていないとは思いますが、ちょっとした暗記などには役立つかと。
チラッと見れるのがありがたい。
入手に少々情報登録が必要になります。
[医療情報基礎用語集][3]


### 使用した過去問


+ [医療情報技師試験対策wiki](https://iryoujyouhou.wiki.fc2.com)

有志の方々で試験問題をまとめられているWiki。
過去全ての問題があるわけではないですが、シンプルで非常に役立ちます。
解説も全ての問題にあるわけではないので、自分で調べたりできる方にはおすすめ。
私は通勤中にスマホからアクセスしていました。



### こういう過去問集もあります。

こちらは解説まで記載された問題集です。
[医療情報技師能力検定試験過去問題・解説集2019](https://www.nankodo.co.jp/g/g9784524249138/)
上記のWikiだけだと問題が全網羅されている訳でもなく、解説もない問題も多々あるため、ちゃんと勉強するならこういった問題集を買った方が良さそうです。

### 最後に

医療情報基礎知識検定と比べると非常に難易度が高いです。
ちなみに受験時期は毎年8月中旬ほどの日曜日。
私が受験した年はお盆休みの最終日でした。
休み中に追い込む...といった選択肢もあります。


[1]:http://jami.jp/jadite/new/kiso/news-k.html
[2]:http://jami.jp/jadite/new/doc/pdf/140418kiso_mondai_2-1.pdf
[3]:http://jami.jp/jadite/new/kiso/kiso_yougo.html
Googleドライブにファイルを格納し、格納したフォルダやファイルのURLをSlackに通知する

#やりたいこと

1. 毎日の処理で作成されたファイル数点をGoogleドライブに置きたい
2. 置いたファイルの直接のリンクをSlackに通知したい。

、、、これらを簡単にやりたい

#課題
特に2が課題でAmazon S3などであれば置く先と、パスの構成とファイル名があれば再現できるが、GoogleドライブはURLが独特の構成をしているため、置く場所とフォルダ名やファイル名だけではURLが再現できない（たぶん）。

#解決方法
・いずれもrcloneを駆使する
・rclone lsjson でフォルダやファイルのIDが返却されるのでそれで頑張る
・jq職人になる

#手順

## rcloneセットアップ
割愛します、が
・本連携用のサービスアカウントキーのJSONを用意
・rclone config でdriveを選択肢、JSONファイルを絶対パスで指定


## ファイルを転送してみる
今回、上記config で xxxxxxxx_daily_report というremoteを作成しています。

### 送り込むファイル
・フォルダ構成

```
root_folder/
　　　　　└yyyymmdd/
　　　　　　　　　└diva/
　　　　　　　　　　　└ yyyymmddhis.csv
　　　　　　　　　　　└ yyyymmddhis.png
　　　　　　　　　└divb/
　　　　　　　　　　　└ yyyymmddhis.csv
　　　　　　　　　　　└ yyyymmddhis.png
```

これらのファイルを、Googleドライブの特定のフォルダ以下に毎日転送したいです。

以下のコマンドで出来ます。

```
$ rclone copy ./yyyymmdd/ xxxxxxxx_daily_report:yyyymmdd/
```

実際にGoogleドライブにアクセスすると、無事ファイルが転送されています。

## 転送したファイルのURLの取得
上記ドライブに置かれること、自体を運用ルールとしても良いのですが、Slackだけ見ていればリンクが通知され押せばファイルが確認できる、ようにしたほうがQOLが上がろうというものです。

結論としては、lsjson というサブコマンドを使うことでIDが取得可能です。

### アップしたディレクトリの取得

```
$ rclone lsjson  xxxxxxxx_daily_report:
[
{"Path":"20200226","Name":"20200226","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-26T09:54:29.000Z","IsDir":true,"ID":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{"Path":"20200227","Name":"20200227","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-26T21:56:13.071Z","IsDir":true,"ID":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},
{"Path":"20200228","Name":"20200228","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-27T22:05:59.635Z","IsDir":true,"ID":"ccccccccccccccccccccccccccccccccc"},
{"Path":"20200229","Name":"20200229","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-28T22:12:34.958Z","IsDir":true,"ID":"ddddddddddddddddddddddddddddddddd"}
]
```

こんな感じで返ってきます。bash, grepとjqを駆使し

```
DIRID=`rclone lsjson xxxxxxxx_daily_report: |grep 20200229| jq .'ID'`
DIRURL="https://drive.google.com/drive/u/0/folders/"${DIRID//\"//}
```

とか することでURLの生成が行えます。
※ワンライナーに拘っている訳ではないので自己責任にてお願い致します...

## アップしたファイルの取得
以下のように remote:(フォルダ)/ファイル名 をlsjsonに渡すと、上記同様にIDが返却されます。

```
$ /usr/bin/rclone lsjson  xxxxxxxx_daily_report:/20200229/diva/yyyymmddhis.csv
[
{"Path":"aaa","Name":"aaa","Size":0,"MimeType":"application/octet-stream","ModTime":"2020-02-29T11:58:55.419Z","IsDir":false,"ID":"1ixOc30WmdczvNAlUlgeiyZ5dN97y2oHT"}
]
```

さきほどのようにgrepをしても良いのですが、1個しかないので

```
DIVACSVID=`/usr/bin/rclone lsjson  xxxxxxxx_daily_report:/20200229/diva/yyyymmddhis.csv|jq .[].ID`
DIVACSVURL="https://drive.google.com/file/d"${DIVACSVID//\"//}
```

といった形で取得できます。
※ワンライナーに拘っている訳ではないので自己責任にてお願い致します...


無事URLが取得できたので、事前に用意した[ワークフローにPOST](https://qiita.com/yuji_saito/items/5dc2b079d4e43bd381d8)すればSlack通知完了です。


※活用イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68734/3a0e98ed-99dd-617f-0403-7a55a6745c32.png)

猫は正義
ポップアップウィンドウ（表示）

#はじめに
JavaScript（jQueryで記述）を使って、ボタンをクリックするとポップアップウィンドウが表示されるようにします。
別ブログにて、書き直したものを公開中です。
[https://airesaies.com/2020/09/05/program007/](https://airesaies.com/2020/09/05/program007/)
#実行
hamlは次のものを用意します。

```haml:sample.haml.html
.btn
  ボタン
.pop
```

`.btn`をクリックすると`.pop`にオブジェクトが作成されるようにします。

```javascript:sample.js
$(function(){
 $(".btn").on("click" function(){
    let html = `
     <div class = "pop__window"></div>
   `
   $(".pop").append(html);
 })
});
```

このままだと何も表示されないので、CSSを指定します。

```sample.scss
.pop{
  &__window{
    width: 500px;
    height: 500px;
    background-color: 500px;
  } 
}
```

こうすれば、`.btn`を押すと`.pop`の部分に赤い四角が作成されます。
ポップアップウィンドウっぽくするために、

```sample.scss
.pop{
  &__window{
    width: 500px;
    height: 500px;
    background-color: 500px;
    position: fixed; 
    top: 300px; 
    left: 300px;
    //値は任意
  } 
}
```

これで、画面の中央当たりに、赤い四角が表示されるようになります。
最後に、ボタンを押しても赤い四角が増え続けないように、既に表示されている赤い四角が削除されるようにします。

```javascript:sample.js
$(function(){
 $(".btn").on("click" function(){
    $(".pop__window").remove();
    let html = `
     <div class = "pop__window"></div>
   `
   $(".pop").append(html);
 })
});
```

これで最低限の処理はできました。
次回以降は、これを応用したプログラムを作りたいと思います。
Excelな設計書をMarkdownにしてみた

# 発端
今期初めてマネジメント側を任され、プロジェクトの運用について裁量をいただきました。
そこで、以前から取り組みたかった脱Excelを試験的に運用させてもらうことになりました。

# なぜ脱Excel？
未だに社内のドキュメンテーションにExcelを使うケースは多いと思います。
Excelを使うメリデメを挙げてみましょう

（以下の記事から大いに影響を受けています。）
[設計書は Excel だけじゃなくて Markdown も使ってほしい - Qiita](https://qiita.com/KoKeCross/items/2e233219f73ffbe7d674)
## EXCELドキュメント

### メリット

1. 誰でも使える。直感的に操作可能。
1. 案件ごとにブックを持てる(１つのファイルで管理できる)。
1. 数式を使ったドキュメントが作れる。

### デメリット

1. バージョン管理ツールとの相性が悪い。(バイナリデータ)
1. 参照したいだけなのに編集ロックが鬱陶しい
1. ファイル自体が大きくなりがちで、動作が重くなったり、検索に時間がかかるようになる。
1. 図や数式に頼ったドキュメント作成をすると、メンテが難しくなる。

自分は特に、どこを変更したかわからない（バイナリデータである）ことが問題と感じていたので、今回脱エクセルを目指すことになりました。

# どうやって脱エクセルする？
Markdownを使います。
ちょうど、社内でプロジェクト管理ツールが「redmine」から「backlog」に移ったタイミングだったので、「backlog」のwikiで設計書の管理を試みることにしました。

本当はgitの管理下に置いて、プルリクエストなどの恩恵を受けれるような運用にしたかったのですが、今回はそこまで至りませんでした。

# 実際に運用してみて
Markdown + Backlogのwikiでの設計書の管理は便利な面もあれば、課題もたくさん見えてきました。

### 便利だった面
* ブラウザ上だけで完結するのでストレスフリー
* ドキュメントが見つけやすくなった
    * 検索がドキュメント内部まで及ぶので見つけやすい。Excelは開くまで目当てのものかわからない。
* ドキュメントの共有もリンクを貼るだけでいいし、環境を選ばない
* 差分が取れるようになった。(Backlogの機能で履歴が見れる)
* 好みのエディターでドキュメント作成できる様になった

### 課題
* 表現力不足
    * 図を挿入したい場合に面倒くさかった
    * テーブルが書きづらい（外部エディター使えば緩和される）
* 関数が使えない
    * テスト仕様書などに関しては、集計の機能が必要だった

という感じでしょうか。
UMLをMarkdownで書けるようになるツールなどを使えば、表現力不足は解消されるかも知れません。
（直感的でないので学習コストはかかりますが…）


# 最後に
まだテキストベース管理の真骨頂であるgitとの連携が取れていないので、次はそれを目指してやっていきたいです。
【ざっくり】コンポーネント指向ってなに？【Vue.js】

# はじめに
単一ファイルコンポーネントでの実装を想定してます。
以下のような読者を想定してます。

* Vue.jsってどういう言語なの？
* コンポーネント指向？聞いたことはあるけどよくわからん
* コンポーネント指向はわかるけど、なにが嬉しいの？

# コンポーネントとは？
「部品」
「構成要素」
という意味の言葉。

Vue.jsでは、「機能ごとにJavaScriptとテンプレートをセットしたパーツ」のことを指します。
テンプレートは、HTMLとCSSによって構成されます。

## 例

ログイン機能のコンポーネントがあるとしたら…

* JavaScript
    * ログインボタンが押された時、入力されたIDとパスワードを持ったユーザが存在するかチェックする
    * ユーザが存在する場合、ログイン処理を行う
    * ユーザが存在しない場合、エラーメッセージを表示する
* テンプレート
    * ID入力フォーム
    * パスワード入力フォーム
    * ログインボタン
    * エラーメッセージ表示エリア

みたいな感じになります。

「ログインをする」という一つの機能に対して、必要なものを全てまとめた部品ですね。

# コンポーネント指向とは？

たくさんのコンポーネントを作って、それを組み合わせることで一つのアプリケーションを作りあげようという考え方です。

## 利点

* 一度コンポーネントにしてしまえば何度でも使える！
    * 違うアプリケーションでも同じものが使える
* 処理する部分と見た目を定義する部分のソースコードが近い位置にあるから分かりやすい！

# 単一ファイルコンポーネント

Vue.jsに用意されたコンポーネント指向を助ける仕組みです。
HTML、CSS、JavaScriptを一つのファイルにまとめて書き、拡張子に「.vue」をつけることで単一ファイルコンポーネントの実装ができます。

じゃあコンポーネントごとにJSやCSSを書かないといけないの？というとそういうわけではありません。
「.vue」という拡張子のファイルであっても、今までと同じように外部で宣言された「JSファイル」、「CSSファイル」を読み込むこともできます。
なので、複数のコンポーネントで呼び出されるような汎用的なJS処理、CSSはそれぞれ外部に宣言しておけます。


# コンポーネントの使いかた

コンポーネントはHTMLタグのように呼び出せます。

例えばログインコンポーネントであれば
`<login />`
というように書きます。

また、コンポーネントには値を渡す事ができます。
渡す値によって、同じコンポーネントであっても柔軟な処理を行わせる事ができます。

楽曲の検索機能の実装で例えると
「曲名」を入力させて検索するコンポーネント
`<songSearch searchTarget="song_title" />`
「アーティスト」を入力させて検索するコンポーネント
`<songSearch searchTarget="artist" />`
という実装方法になります。

これによって内部の処理を使いまわす事ができ、効率的な開発を行う事ができます。

# どんな単位でコンポーネントにすればいいのかわからない…
コンポーネント化の粒度の指標として「アトミックデザイン」というものがあります。
迷ったら参考にしてみるのも良いのではないでしょうか。

# 参考
[コンポーネントの基本 — Vue.js](https://jp.vuejs.org/v2/guide/components.html)
[フロントエンドのコンポーネント設計に立ち向かう - Qiita](https://qiita.com/seya/items/8814e905693f00cdade2)
[基礎から学ぶ Vue.js](https://cr-vue.mio3io.com/)
Gitのリポジトリを共有サーバーに作成する

# ローカルで作業しているけど変更管理は共有サーバーでしたい
共有サーバーにリモートブランチを作成してローカルで作業するときの手順。

## 共有サーバー側の作業
「.git」を末尾に付与したディレクトリを作成して、変更管理用の初期化を行います。
※このディレクトリではソースなど作業ファイルを格納して作業を行うわけではありません。

```console
$ mkdir hogehoge.git
$ cd ./hogehoge.git
$ git init --bare --shared
$ git remote add <name> <url>
```
- `<name>`: ブランチ名
- `<url>`: 接続先（ローカルから接続できること）

例1； `$ git remote add origin C:/git/hogehoge.git`
例2； `$ git remote add origin http://hogehoge.git`

## ローカル側の作業
```console
$ mkdir hogehoge
$ cd hogehoge
$ git init
$ git commit --allow-empty -m "initial commit"
$ git remote add <name> <url>
$ git push <name> master
```

`<name>`と`<url>`はリモート側と同じ内容を入力すれば紐づけることができます。
別の環境で作業するときは作ったリモートリポジトリを`clone`すれば作業を行えます。
開発等で使える便利サイトまとめ

# 時間

* [エポック秒（UNIX秒）変換](http://tools.up2a.info/ja/epochtimes)

# 絵を描く

* [draw.io](https://www.draw.io/)

# テキスト

* [Duplicate text line remover](https://onlinetexttools.com/remove-duplicate-text-lines)
* [Text Escaping and Unescaping](http://0xcc.net/jsescape/)
* [Text Tables Generator](https://www.tablesgenerator.com/text_tables)
* [AsciiTree (treeコマンド代わり)](https://codogue.com/asciitree/)

# Markdown

* [Markdown Tables Generator](https://www.tablesgenerator.com/markdown_tables)

# JSON

* [JSON Formatter & Validator](https://jsonformatter.curiousconcept.com/)
* [JSONLint](https://jsonlint.com/)

# JavaScript

* [beautifier.io](https://beautifier.io/)
* [JSFiddle](https://jsfiddle.net/)

# CSS

* [beautifier.io](https://beautifier.io/)
* [W3C CSS Validation Service](https://jigsaw.w3.org/css-validator/validator.html.ja)

# HTML

* [beautifier.io](https://beautifier.io/)
* [W3C Markup Validation Service](https://validator.w3.org/)

# XML

* [XML整形ツール](https://tm-webtools.com/Tools/XMLBeauty)

# 正規表現

* [REGEXPER](https://regexper.com/)

# Grok

* [Grok Debugger](https://grokdebug.herokuapp.com/)

# Cron

* [crontab guru](https://crontab.guru/)

# デザイン

* [Figma](https://www.figma.com/)

# 色

* [Colorpicker for data](http://tristen.ca/hcl-picker/)
* [List of 20 Simple, Distinct Colors](https://sashat.me/2017/01/11/list-of-20-simple-distinct-colors/)
* [Flatuicolorpicker](http://www.flatuicolorpicker.com/)
* [(Qiita) bashで16色表示するスクリプト用意しておくと便利](https://qiita.com/soramugi/items/46117274419665e601fa)

# ネットワーク

* ユーザーエージェント
  - [OSを判定するユーザーエージェント](https://htaccess.cman.jp/useragent/os/)
  - [ブラウザを判定するユーザーエージェント](https://htaccess.cman.jp/useragent/browser/)
  - [スマートフォン・携帯のユーザーエージェント](https://htaccess.cman.jp/useragent/smartphone/)

# 統計情報

* [Google Trends](https://trends.google.co.jp/trends)
* [Google Books Ngram Viewer](https://books.google.com/ngrams) ([about](https://japan.cnet.com/article/20424286/))

# Windows

* Windowsの容量を空ける
  - [Cドライブの容量不足解消：不要ファイルを一気に削除](https://freesoft.tvbok.com/tips/optimise_vista/increase_freespace_c_drive.html)
  - [pagefile.sysとhiberfil.sysの解説ページ](https://freesoft.tvbok.com/tips/pc_windows/pagefile-hiberfil-sys.html)
LaravelでS3を使用する時にprofileを指定する

# LaravelでS3を使用する時にprofileを指定する

LaavelからAWS S3へ画像をアップロードしたりする時に、flysystemを使う場合に、profileを指定する方法を調べてみたら簡単でした。

公式に従って、パッケージはflysystem-aws-s3-v3を使用します。

## credentialsはこんな感じだとして

```~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

[my_profile]
aws_access_key_id = ZZZZZZZZZZZZZZZZZZZZ
aws_secret_access_key = ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
```

## ファイルシステムの設定

### ACCESS_KEYとSECRET_ACCESS_KEYの場合

```config/filesystems.php
  'default' => env('FILESYSTEM_DRIVER', 'local'),

  // 追記
  'cloud' => env('FILESYSTEM_CLOUD', 's3'),

  // 〜 略 〜

  'disks' => [
    'local' => [
      // 〜 略 〜
    ],
    'public' => [
      // 〜 略 〜
    ],

    // 以下を追記
    's3' => [
      'driver' => 's3',
      'key' => env('AWS_ACCESS_KEY_ID'),
      'secret' => env('AWS_SECRET_ACCESS_KEY'),
      'region' => env('AWS_DEFAULT_REGION'),
      'bucket' => env('AWS_BUCKET'),
    ],
```

### PROFILE=defaultで良い場合は、keyとsecretを指定しない
('profile' => 'default'もOK）

```config/filesystems.php
  'default' => env('FILESYSTEM_DRIVER', 'local'),

  // 追記
  'cloud' => env('FILESYSTEM_CLOUD', 's3'),

  // 〜 略 〜

  'disks' => [
    'local' => [
      // 〜 略 〜
    ],
    'public' => [
      // 〜 略 〜
    ],

    // 以下を追記
    's3' => [
      'driver' => 's3',
      'region' => env('AWS_DEFAULT_REGION'),
      'bucket' => env('AWS_BUCKET'),
    ],
```

### PROFILE=my_profileを指定したい場合
keyとsecretを指定しない＋profileを追加

```config/filesystems.php
  'default' => env('FILESYSTEM_DRIVER', 'local'),

  // 追記
  'cloud' => env('FILESYSTEM_CLOUD', 's3'),

  // 〜 略 〜

  'disks' => [
    'local' => [
      // 〜 略 〜
    ],
    'public' => [
      // 〜 略 〜
    ],

    // 以下を追記
    's3' => [
      'driver' => 's3',
      'region' => env('AWS_DEFAULT_REGION'),
      'bucket' => env('AWS_BUCKET'),
      'profile' => 'my_profile',
    ],
```

いけるかな？と試してみたらすんなりでした。
webデザイナー向けのUI/UXの基礎

# ◆ UI/UXの違い
※ webデザイナー向けの解釈です。主観で小難しい表現を使わずより想像しやすい表現にしてます。
※ 全然間違ってるよ！という内容にお気づきの場合は教えて頂けると嬉しいです。

## UIとは
UI = ユーザインターフェイス = ``` PCやスマホなどの表示、操作などの仕組み ```
↓
``` 「使いやすさ」や「使い勝手」「見やすさ」 ```などが求められる。
### 補足：UIの種類
#### CUI（キャラクターユーザーインターフェース）
※キャラクターはこの場合「 文字。記号。」の意。

＝コマンドライン入力によって操作を行う。
（macのターミナルやwinのコマンドプロンプトでやってるやつです）

#### GUI（グラフィカルユーザーインターフェース）
＝マウスや指でボタンやアイコン画像などを押すだけで操作できる。
（アプリ全般GUIです。アドビもソースツリーもほぼぜーんぶGUIです）

```
デザイナーで苦手に感じる方も多い「コマンドライン入力（CUI）」も実はUIですが、苦手と感じる方が多いので一般に普及できません。
その際にGUIが必要になります。
= CUI よりも GUI の方が " UIが良い " ということです。　（極端な比較ですが...）
```

## UXとは
UX = ユーザエクスペリエンス = ``` ユーザ体験 ```
↓
「使いやすさ」や「使い勝手」「見やすさ」などに加えて、``` 使い心地・感動・印象 ```も求められる。

## UI/UXの違いのまとめ
大抵の場合```UXが良ければUIも良い```ですが、```UIが良いからと言ってUXが良いとは限らない```となります。

例：

- ボタンの配置もサイズもよくテキストも読みやすい。 = ``` UIが良い。 ```
- ボタンの配置もサイズもよくテキストも読みやすい **が** 、<br>ページの読み込み速度が **遅くてやだ！** = ``` UIは良いがUXは悪い。 ```
- ボタンの配置もサイズもよくテキストも読みやすい **し** 、<br>ページの読み込み速度が **早くて快適 (^^)** = ``` UIが良くUXも良い。 ```

# ◆ UIをよくする
- 片手操作時は右利きが多いからボタンなどは右に配置する。
- ボタンのサイズを押しやすい大きさにする。
- アイコンのみのボタンではなく一緒に名前も記載する。（例：ハンバーガーメニューは慣れてない人はメニューだとわからないので下にMENUなどの表記もつける）
- 行間や余白をとって見やすくする。

# ◆ UXをよくする
※ UI以外の部分
- 読み込み中のローディングアニメーションを愉快なものにする（待たされても楽しい気分になる）
- 遅延ロードさせて読み込み体感速度をあげる
- ユーザの欲しい情報を欲しいタイミングで表示させる
- 入力フォームの入力のしやすさ（全角、半角入力どちらも対応、パスワードは表示・非表示選択できるなど）

# 参考
[apple : ユーザインターフェイスのデザインのヒント](https://developer.apple.com/jp/design/tips/)
[google : Material Design](https://material.io/design/layout/understanding-layout.html)
tar.gzやtazの解凍/圧縮コマンドとその意味

いつもtarの解凍/圧縮を思考停止でググっていたけど、ついに意味を調べたのでメモ。



# tar.gz taz

### 解凍 : -zxvf

```
tar -xzvf hogehoge.taz
```

`-` : なくても動く(すごいなぁ！）
`x` : e<b>x</b>tract。展開
`z` : g<b>z</b>ip/b<b>z</b>ip2/x<b>z</b>/l<b>z</b>ma形式
`v` : <b>v</b>erbose。展開のログなどを表示。
`f` : 解凍する元<b>f</b>ileの選択。デフォルトでは/dev/rmt0を参照するらしい

ということで、<b>短縮版</b>は

```
tar xzf hogehoge.tar.gz
```

となる。
当然、順番も変えられる。
ググるたびに、違うオプション(呪文)をコピペしてたのはこのせい。。。

### 圧縮

```
tar czfv hogehoge.tar.gz hoge.txt foge.txt goge.txt ...
```

`c` : <b>c</b>ompress

### 中身の確認

```
tar tzf hogehoge.tar.gz
```

`t` : <b>t</b>est

# version
検証したもの
MacOSのbrewで入れたtcshに入ってたやつ。

bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6


# 参考
[teppeis blog](https://teppeis.hatenablog.com/entry/20080109/1199897258)
[Angular] Directiveでリアクティブフォームの値を操作する

Directiveの中でリアクティブフォームを操作したい場面があると思います。
そんな時は`NgControl`をDIすればアクセスできます。

## 例
```html
<form [formGroup]="formGroup">
  <input
    type="text"
    formControlName="hoge"
    hoge
  />
<form>
```

```js:directive.ts
import { OnInit, Directive, ElementRef, HostListener } from '@angular/core';
import { NgControl } from '@angular/forms';

@Directive({
  selector: '[hoge]'
})
export class HogeDirective implements OnInit {

  constructor(
    private ngControl: NgControl,
  ) {}

  get control() {
    return this.ngControl.control;
  }

  @HostListener('event', ['$event'])
  onHoge(event: any) {
    // リアクティブフォームへのアクセスが可能
    this.control.value;
    this.control.setValue('fuga');
  {
}
```
Visual Studio CodeでC言語を行頭かっこじゃないようにオートフォーマットする

# やりたいこと

Cのコードをこのスタイルにフォーマットしたい。開始かっこの改行なし、タブサイズは4。

```c
#include <stdio.h>

int main(void) {
    printf("hello, world\n");
    return 0;
}
```

# 結論

settings.jsonに以下を追記して解決。

```json
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, IndentWidth: 4}"
```

参考：https://stackoverflow.com/questions/45823734/vs-code-formatting-for

# Visual Studio Codeの自動整形について

C/C++用のextension([C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools))を入れると、「`Shift`+`Option`+`F`(Mac)」で自動整形されるようになる。
またはテキストエリア上で「右クリック」→「Format Document」でも可能。


# 試行錯誤のログ

[C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)のデフォルトでは、自動フォーマットは開始かっこ `{` が新しい行に来る。
でも`{` の前は改行されないスタイルの方が好みなんだ…！
Googleのスタイルガイドだとこの形式らしい。C++用っぽいけれど。
https://google.github.io/styleguide/cppguide.html

settings.jsonに以下を書けば適用される。
`Cmd`+`,`で環境設定を開いてから、画面右上の <img align="middle" width="25" alt="スクリーンショット 2020-03-01 17.35.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227743/9934b97a-9e6a-1ad4-f8cb-82c6e8a4bb46.png"> (Open Settings (JSON))をクリックして開く。

```json
"C_Cpp.clang_format_style": "Google"
```

ただしこれだとタブサイズが2。タブは4がいい…。

ので、ここだけ上書きする設定をする。
失敗：言語ごとの設定として、以下のように書いても`tabSize: 4`は全然効かなかった。ずっと2でフォーマットされた。

```json
{
    "C_Cpp.clang_format_style": "Google",
    "[c]": {
        "editor.tabSize": 4
    }
}
```

こちらが正解。(再掲)

```json
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, IndentWidth: 4}"
```

## ついでに
ファイル保存時に自動でフォーマッタが動くように設定追加。

```json
{
    "editor.formatOnType": true,
    "editor.formatOnSave": true,
    "C_Cpp.clang_format_style": "{BasedOnStyle: Google, IndentWidth: 4}"
}
```
docker上のredashとローカルのmysqlを連携させる

docker上に立てたredashとローカルのmysqlを連携させるのに少し苦労したので方法を残しておこうと思います

* redashとは
 * OSSで提供されているダッシュボード作成ツール
 * データをredashに連携させる事でコードなどを書かずにデータをグラフ化することができます

* 今回の目的
 * docker上に立てたredashとMacpcのローカルで起動しているmysqlを連携させる
 * mysqlのデータをredashでグラフ化させる
 (redash自体の開発は行わない想定です)

**git clone**
 `git clone https://github.com/GitSumito/redash-v7.git`
*バージョン8が最も最新ですがバグが多く出たため、バージョン7をクローンしています
またdockerのbuild時にエラーが多く発生したためbuild済みのものをクローンしています

**環境変数の設定(postgresに認証なしにアクセスできるようにする)**
redash.envファイルに 
`POSTGRES_HOST_AUTH_METHOD=trust`
を加筆することでpostgresアクセス時に出てしまうauthのエラーが出なくなりますが用途によって使い分けてください

**コンテナの起動**
`docker-compose run --rm server create_db`
dbにddlを流し込む
`docker-compose up -d`
コンテナを起動
*ログが見たい場合は`docker-compose up`でコマンド実行してください

**redashへのアクセス**
`http://localhost指定したport`にアクセス
redashの登録画面が表示されたら情報を入力して[Setup]で登録
<img width="495" alt="スクリーンショット 2020-03-01 12.39.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594379/184b10d3-e654-af02-9db8-864314acec64.png">

**データベースとの連携**
Setupが完了すると下記画面に遷移します
![S__49840136.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594379/97ab839e-6b57-56b2-d607-65ef75159016.jpeg)

データベース連携に使用するのは真ん中のこの部分です
![S__49840135.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594379/d48a0964-1f08-6677-d355-a1ab730180d4.jpeg)
*画像には斜線が引いてありますが初期状態では引いていない状態で正しいです

1.`Connect a Data Source`を押下

mysqlをリソースとして指定した画面の後でこのような画面が表示されると思います
ここで`Host`に`host.docker.internal`と入力
`User`と`Password`のところにはmysqlの情報を入力
![S__49840138.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594379/ab5082db-28d6-acda-3524-6b3a36047102.jpeg)

**保存**

[save]ボタンを押下
dashboardに戻り`2.Create your first query`を押してデータが連携されていれば完了です

**補足**

なぜHostが`host.docker.internal`のような文字列になるのでしょうか？
それはdockerとMacは友達ですが、dockerとmysqlは友達の友達
つまり、他人なのでdockerから直にmysqlを連携することが出来ないからです

```
×docker→mysql
○docker→Macポート→mysql
```

そこで一度Macのポートを経由する必要があります
そこでMacのポートに当たるのが`host.docker.internal`です
<img width="805" alt="スクリーンショット 2020-03-01 13.14.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594379/3dd6685c-147c-4231-0dc2-79bc59b7d956.png">


*ちなみに`host.docker.internal`はdockerだけが知っているポート、向き先のためMacからアクセスしようとしてもアクセスはできないので下のような画面になってしまいます

![S__49840133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594379/906a6800-8c94-3c60-ca06-6f01300b8852.jpeg)

これからも`host.docker.internal`に助けられることが多そうです！

誤り等あればコメントお願いします！

おしまい！
今までの仕事で使っていた便利な方法について

#今までの仕事で迷ったり取り方の方法の違いや便利な方法についてまとめを書いてみたいと思います。
##javascriptとECMASCript(Babel)の違い
これについてはかなり悩みました。
クラスの追加の仕方やライブラリの組込書き方に違いがありました。
それに伴い組込部分などちょっとしたところで躓くことが多かったように思います。

```node.js
import '*****' from *****;
const ***** = require('******');
```

```js
#Babel
import {*****} from '*****';
```
この書き方に慣れるまでに時間がかかりました。
実際にクラスが書けると楽なのですがC#とかの流儀で書いてしまうと動かないこともありました。
実際にはC#の場合importで組み込むときにはクラス名とファイル名は一致させる必要は無かったのですがJavascript(ES6）ではクラス名とファイル名の一致が必要なので気をつけて下さい。
変数組込の場合は別に変数とrequireで組み込むライブラリで一致させる必要はありません

##for文の書き方
これは人によって流儀を持たれていました。
実際はC#などで使われるfor...inで書くことでKey値で書くのが早いんですが。
ここでも人の流れに乗っかる形でfor...in・for...ofで書くことをやめて.filter・.map・.findで書いていたような気がします。
確かに書き方としてはスマートに書けるのですが実際のところqiitaのに書かれている方も最近は.filter・.map・.findなどで書かれている人が多くなってきていますが。
ちょっと待って下さい。
Keyが変動する部分では.filter・.findでは値が取れませんので要注意です。
このところは気をつけて下さい。
しっかりとfor...inで値をとるようにしましょう。

```js
#従来のfor...in・for...of
let hogehoge = ['a', 'b', 'c'];
for(let hoge in hogehoge){
    let hogeKey = hoge;
    let value = hogehoge[hoge];
}

let hogehoge = ['a', 'b', 'c'];
for(let value of hogehoge){
    console.log(value);
}
```

```js
#.filter .map  .find
let hoge = ['a', 'b', 'c'];
let value = Object.entries(hoge).filter(e => e[1]).map(e => e[0])

let hogehoge = ['a', 'b', 'c'];
let value2 = Object.values(hogehoge).find(e => e.hogehoge === 'a');
```

いろんな所で迷いまくりましたが最後はこの書き方を覚えると早いが使いどころを間違えると思ったような値が返ってこないこともあり色々と模索しながらデータを取っていくようにしていました。
##consoleの使い方
これ意外と自分も使いこなせていたと思っていたのですが楽な方法がいっぱいありました。
普通だとlog取りだと思っている人もいますが配列表示やいろんなこともできるので試してみるといいかもしれません。

```js
#consoleの使い方

//logの取り方
let value = 'aaa';
console.log(value);

//table（配列）取得もできます
console.table([[0,1,2,3,4], [5,6,7,8,9]]);

//データ内のObjectをみる方法
console.dir(object);

//DOM内容の表示
console.dirxml(node);

```

これらを覚えておくと意外と便利です。
詳しくはasialさんの[【Javascript】consoleオブジェクトが持つlog以外の便利メソッド18（前編）](https://blog.asial.co.jp/1036)に書かれています。

以上です。
Retrieve the first day of week in current locale（今日は何曜日？）


Some places(country) start the week with Sunday, some with Monday, maybe some with others, IDK,
some this magic let java library find the right one for us.
現地の週の始まりの曜日を計算する（月曜だったり日曜だったり、他もあり)

```
DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
LocalDate firstDay = today.with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
```
 
*only serve as memo so actual syntax may break
Bookmarkable Diff - ブックマークできる Diff ツールを作った

## URL

https://my-tools.netlify.com/diff

## デモ

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170621/ea06519f-70c8-d3d7-bc86-11237cd5ef09.gif)

## モチベーション

- Mac でサクッと diff とりたい
- diff 結果を他人に共有したい
- でも diff 結果を外部に保存したくない

## 現状

- 過去色々なデスクトップアプリを試したが、どれも肌に合わなかった。
    - WinMerge を Wine で起動し html 出力する日々にも疲れてしまった。
- 簡単に diff できる Web サイトはいくつかある。
    - しかし、結果を他人に共有したいとなったら、どこもテキストを得体の知れないサーバー側に保存しようとする。
    - これはいただけない。

ないなら作ればいいじゃない。

## 大雑把な仕組みの説明

### Diff

- https://www.npmjs.com/package/diff
    - 強い。
- 1 文字入力ごとに diff が実行されても無駄なので、 lodash/throttle で間引いている
    - だから、diff の反映が入力から少し遅れて見える。代わりに、入力はスムーズ。

### URL を生成する時

- 「Generatoe URL」ボタンをクリックする。
- 左右のテキストと「Diff options」の設定値を json テキスト化し、圧縮する。
- 圧縮テキストをクエリパラメータとして URL と連結。
- それを URL 欄に反映する。
    - `?v=～` の部分がそれである。
    - 以下のサイトで展開を確認できる（Algorithm は lzma）
        - http://output.jsbin.com/cayuhox
    - 暗号化はしていないため、このクエリパラメータを漏らしたらアウト。

### URL を開く時

- URL を開く。
- クエリパラメータから圧縮文字列を読み取り、展開する。
- 展開された json テキストの各値を、画面に反映する。

以上、全てクライアントサイド、ブラウザ上の JavaScript の処理で完結する。
完全にストレージレスな diff ツールである。
URL さえブックマークすれば、PC・スマホ、どこでも diff を確認することができる。

Bookmarkable Diff!
Write once, Diff anywhere!!

## 注意

- 勉強のため Google Analytics を使っている。
- 記録内容は、「画面遷移」と「ボタンのクリック」。
- クエリパラメータは記録していない。
- プライバシーに関わりうる情報であるクエリパラメータは、送信されないよう細心の注意を払って実装した。
    - これを守れなかったら、このツールを作った意味がなくなってしまうので・・・
    - [個人情報（PII）を送信しないようにする方法 - アナリティクス ヘルプ](https://support.google.com/analytics/answer/6366371?hl=ja) より
        - `URL、URL パラメータ、タイトルのいずれかに個人情報が含まれている可能性がある場合は、それを削除してください`
- 送信内容を確認したい場合は、「[Google Analytics Debugger](https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna)」を使って確認してみてほしい。
- もし万が一、クエリパラメータを送信してるようなことがあれば、ご連絡いただけると幸いです。

あとどう頑張ってもダサいデザインにしかなりませんでした。助けて下さい。
C言語　mallocで確保していない領域に対してfree()を使うと出るエラーについて

mallocしてない領域をfree()すると出てくるエラー

```terminal
malloctest.out(24922,0x1000cddc0) malloc: *** error for object 0x7ffeefbff5b0: pointer being freed was not allocated
malloctest.out(24922,0x1000cddc0) malloc: *** set a breakpoint in malloc_error_break to debug

```

変数の宣言直後にNULLで初期化すると上記のエラーはでなくなる。
NULLはfree()でスキップされるから？

```c
List *a;
a = NULL;
```

free()を２重で行っても同様のエラーが出る。
確保してない領域に対してfree()を行うと出てくるエラーだと理解。

```terminal
malloctest.out(25177,0x1000cddc0) malloc: *** error for object 0x100201bf0: pointer being freed was not allocated
malloctest.out(25177,0x1000cddc0) malloc: *** set a breakpoint in malloc_error_break to debug
```

このエラーは確保されていない領域に対して、確保されている前提で処理を行うと出てくるエラー。free()で解放した後の領域に対して、値を格納しても同じエラーが出ます。


###参考
【C言語】mallocが原因と思われるエラーに対して - 現在C言語... - Yahoo!知恵袋
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10116060110
Aliexpressで購入したLCDをArduino互換機で動かす

# 最初に
最近、Aliexpressで部品を購入して遊ぶことが多くメモ。

# 購入したもの

## lec
購入店舗
https://ja.aliexpress.com/item/32786773241.html?spm=a2g0s.9042311.0.0.27424c4dfs7NFj
これの`１．９８＄`のやつ
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/3e5de8da-a2e4-477e-4a1a-e3ef4a217434.png">
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/69be9923-2a63-c7da-1553-2e124cc52191.png">


## uno互換機
Amazonで２個で１０００円くらいのuno互換機

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/8e8922fc-eb3e-f11c-654a-b8f65581d7e2.png">

# 配線図
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/5705880d-a047-1379-60b4-033a0cc98274.png">

# プログラム

モジュールをこちらからダウンロードしインストール
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/

こちらのサイトの参考コードをコピーさせていただき。
[Tutorial – PCF8574 backpacks for LCD modules and Arduino](https://tronixstuff.com/2014/09/24/tutorial-serial-pcf8574-backpacks-hd44780-compatible-lcd-modules-arduino/)

無事に動きました。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/10828a62-4345-bc23-9604-1ffd8b05cb39.png">



# 詰まったところ
## 複数のモジュールがある
Ardiunoはインクルードに同一のヘッダファイルがある場合警告が出ます。
その場合インクルードファイルが有る場所の重複しているフォルダを削除しましょう。

私はMACなので`~/Documents/Arduino/libraries/`配下にありました

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/f969d708-fa7c-9a47-7e34-cba09bdae096.png">


## 点滅するだけで文字が出ない
裏面の可変抵抗ををマイナスドライバーで回しましょう。
これはコントラストを操作しているらしく、これが合っていないと表示が出ないことがあります。
(これでめちゃくちゃ時間食ったのでここに備忘録とします。)
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/a5edb563-d494-64f4-f509-23d60b1fe9be.png">


# こちらのサイト参考にさせていただきました

[Tutorial – PCF8574 backpacks for LCD modules and Arduino](https://tronixstuff.com/2014/09/24/tutorial-serial-pcf8574-backpacks-hd44780-compatible-lcd-modules-arduino/)
Pythonではじめる機械学習 個人的備忘録 Part2

前回の続きです。

Pythonではじめる機械学習という本の2章の前半についての備忘録です。
この記事は「Pythonではじめる機械学習」を読んでいる人じゃないとなんのこっちゃだと思います。ぜひ買って一緒に勉強しましょう！

# 教師あり学習
何かを学ぶときはまずその学問や分野で用いられる言葉を身に着けていかなければ会話や議論ができない。初学者である私はまずこの大きな壁を少しずつよじ登っていかなければこの道に入っていくことはできない。ということで少々煩雑ではあるが、初めて耳にする言葉も同時に説明を入れていく。

### クラス分類と回帰
教師あり機械学習は大別すると
・クラス分類
・回帰
に分類できる（これはクラス分類）。

1章でやったアイリスの分類や、SPAMメールかどうかの判断もクラス分類になる。

一方、回帰は連続値予測をおこなう機械学習のことをいう。
例えば
・トウモロコシの収穫量
・年収の予測
・株価の変動
とかである。

### 汎化、過剰適合、適合不足
機械学習で目指すところは汎化(generalize)である。
訓練データから作った予測モデルが、未知のデータに対して正確に予測ができるのであれば、そのモデルは汎化できているという。
モデルがいい感じかどうかってことでいいと思います。

必要以上の情報量を与えたモデルを作ってしまうことを過剰適合という。その逆は適合不足という。
適合不足から情報量を増やしていくと精度は徐々に上がるが、ある情報量を超えると、過剰適合となり下がり始める。
この最良の汎化性能を示すスイートスポット(精度の極大値)を与えるモデルが求めるモデルである。

### 教師あり機械学習アルゴリズム

###### 警告文
~~~Python
# データセットの生成
X, y = mglearn.datasets.make_forge()
~~~
この時

~~~
DeprecationWarning: Function make_blobs is deprecated; Please import make_blobs directly from scikit-learn
  warnings.warn(msg, category=DeprecationWarning)
~~~
警告文が出ますが進めるのでとりあえず無視します。
これ以降もmglearnを使った時に警告文はいっぱい出てきますが全部無視します。

###### ウィスコンシン大学
[ウィスコンシン大学](https://www.wisconsin.edu/)
世界大学ランキングにも載っており、ノーベル賞受賞者も輩出している優秀な学校です。
この本を読んだ人とならウィスコンシン大学で仲良くなれるかも。
「あー、あのウィスコンシンのやつね」
「そうそう、乳がんのやつ！」
みたいなね。

###### zip関数
[Python, zip関数の使い方: 複数のリストの要素をまとめて取得](https://note.nkmk.me/python-zip-usage-for/)
Zip関数の使い方はこちらを参考に。

###### 特徴量エンジニアリング
特徴量間の積を交互作用と呼ぶ。

### k-最近傍法
###### k-最近傍法のクラス分類
k個の最も近いデータを参照し、投票（多数決）でラベルを決める方法。文脈からするに距離による重みはないので、一番近いものと違うラベルになることもありそう。2個の特徴量を変化させていくことでクラスの境界を決定することができる。この教会のことを決定境界と呼ぶ。kの値が大きいほどなめらかな決定境界になり、小さいほど複雑度の高いモデルに対応することができる。本ではkの数を変化させていって精度が最も高くなる参照数を求めていた。
######k-近傍回帰
k-最近接法の回帰バージョン。こっちはk=1だと一番近いものの値に、3とか9だと平均値を採用するやり方。一番単純そうなだれでも思いつくやり方かな。
###### 利点と欠点
利点：理解しやすい、調整しなくてもけっこう高い精度が出せる
欠点：訓練セットが大きくなると遅くなる、疎なデータセットだと性能が悪い
このため実際にはほとんど使われていない。
### 線形モデル

###### 線形回帰
最小二乗法ってやつです。2乗した時の誤差が一番小さくなるようなパラメータを採用するやり方。

###### リッジ回帰
いきなり意味不明になっちゃいました。
L2正則化の説明なさすぎやろ。。。
[過学習とL2正則化](https://qiita.com/kento1109/items/815bdd3f1549d86611d4)
このページとかで確認するとなんとなくイメージしやすかったかも。
要するに、
「傾き」wを
訓練データに対する予測だけじゃなく、ほかの制約に対しても最適化するために（←ここよくわからん）
wを訓練データに対してのフィッティング（最小二乗法で得られる結果）よりも小さくしたい。
なのでwの大きさに対して二乗和のペナルティを与えてわざと小さくしている。

ペナルティが小さくなればただの線形モデルに近づいていくし、
ペナルティが大きいとwは0に近づいていく。
つまり汎化させたいときはペナルティを大きくすればよいがどの程度大きくすればよいかはモデルによって異なる。

うん。自分で言っててよくわからん。

###### Lasso
こっちは絶対値の和をペナルティにしているんだけど、その時は係数が0になりやすいらしくて
変数を減らしたいときに使ってって書いてあった。
よくわからんからまた詳しく調べて記事にします。

###### クラス分類のための線形モデル

クラス分類するときの線形モデルは関数の値が0より大きいか小さいかで分類している。
ロジスティック回帰は回帰って入ってるけど分類アルゴリズムだそう。
線形SVCとロジスティック回帰の違いはよくわからなかった。

###### 線形モデルによる多クラス分類

1対その他(one-vs.-rest)アプローチが説明されてた。
一つのクラスとその他で分類して、それをすべてのクラスに対して行うことによって分類している。
言ってることはまあわかるんだが、結局scikit-learnを使ってるだけで理解が深まってないような。。。
使い方はわかるから、まずはなれるところからですかね。
macでvagrantコマンドしても何も起こらない時の対処

#環境
macOS 10.11.6
vagrant 2.2.7

#事象

vagrantをインストールして、さぁやるぞー！って思って、とりあえずインストールできるてるか確認したところ、

```
$ vagrant -v
```

しても何も起きない。エラーも出てきてないし、バージョンも出てこない。。。

#対処法

参考記事
https://blog.framinal.life/entry/2017/10/10/104514

上記の記事はwindowsの場合ですが、バージョンを下げればいけるかも？
と思い試す。

###vagrantのアンインストール

下記の記事が参考になりました。
https://qiita.com/silva114jp/items/6e1e64e9aeaca62b1c04

###古いバージョンのvagrant

下記のURLからインストールできます
https://releases.hashicorp.com/vagrant/

私の場合は1.9.8をインストールしました。

```
$ vagrant -v
Vagrant 1.9.8
```
で無事バージョンも確認できました。

同じような事象にハマっている人の助けになれば幸いです。
Wordpress静的化サービスのStratticをさわってみた

StratticがTechCrunchで取り上げられてて気になったので試してみました。
　https://www.strattic.com/
現時点(2020-03-02)ではベータのようです。

# どんなもの？
Wordpressを静的化するサービスです。

# 1. アカウントを作成して、ログインする
<img width="1002" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/ae66b434-64fd-0724-6fea-29283226170b.png">

# 2. Wordpressで記事を書いてプレビューを公開する

<img width="1002" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/29191211-ab42-be0f-2172-15ce65e0f608.png">

<img width="829" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/e8b7bebf-c1a8-4ee5-5050-e90a20d916c2.png">

<img width="816" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/156c1f57-c574-f4c5-25a9-b2ecb530e786.png">


# 3. 本番を公開する


<img width="829" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/d515142d-af4b-e53c-2b6a-71d40143ac23.png">


<img width="825" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/408fdab8-d8ee-b97e-6cff-849b533cf3e7.png">




# 雑感
操作はとても簡単でした。Shifterとガチンコで競合していますが、これからが楽しみです。
【Gradle】jarファイル内にクラスファイルが存在しなかった話

## 事象
下記のようなbuild.gradleファイルを用いてビルドを行った際に、jarファイルが生成されるが、その中身にクラスファイルが存在していませんでした。

```gradle:build.gradle
apply plugin: 'java'

group = 'com.test.foo'
version = '1.0.0'

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

compileJava {
    options.encoding = 'UTF-8'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.slf4j:slf4j-api:1.7.21')

    testCompile 'junit:junit:4.12'
    testCompile 'org.hamcrest:hamcrest-library:1.3'
}
```



## 原因と解決策
今回の事象の原因は、javaファイルが`/src`配下に存在していたことでした。

今回Javaプラグインを用いていますが、このプラグインはデフォルトのままですと`/src/main/java`配下のjavaファイルをビルドするようになっています。

そこで、javaファイルを`/src/main/java` 配下に移しビルドを行ったところ、無事にjarファイル内にクラスファイルが生成されていました。

今回もともとAntでビルドが行われていたプロジェクトをGradleでビルドするように変更するという背景もあり、ソースのディレクトリ構造をあまり意識していなかったので、Javaプラグインにこのような条件があったのを知りませんでした。

ちなみに、[こちら](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout)にあるように`sourceSets`を用いることで、ビルド対象のディレクトリを設定することもできます。

今回は他のプロジェクトとの統一感を考えて`/src/main/java`配下にソースを移動するという方針を取りましたが、この方針もスマートだと思います。

## まとめ
Gradleを用いて生成したjarファイル内にクラスファイルが存在しない場合は、ディレクトリ構成およびGradleのビルド対象のディレクトリがどうなっているかを確認してみてください。

Javaプラグインを用いている場合は、デフォルトで`/src/main/java`配下のjavaファイルをビルドするようになっていますので、ディレクトリ構成をこれに合わせるか、ビルドする際に参照するディレクトリを明示的に設定するようにしてください。

## 参考
#### Gradle公式ドキュメント
- [Organizing Gradle Projects](https://docs.gradle.org/current/userguide/organizing_gradle_projects.html#sec:use_standard_conventions)
- [The Java Plugin](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout)
【Atom】パッケージのアップデート漏れで、linterのエラー表示の解消に悩んだ話

# 背景
普段使っているPCの調子が悪いため、２年ほど前まで使っていたPCを立ち上げました。
OS、エディター、パッケージ等、一応のアップデートを済ませ（たつもりで）、htmlの編集にとりかかりました。

ところが、htmlファイル編集画面に何やらエラーが出現。
<img width="411" alt="スクリーンショット 2020-03-02 5.23.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575953/18115ea5-5b17-57ab-2788-e2d51012ae3c.png">

[linter](https://atom.io/packages/linter)プラグインから、

`Unexpected token`

という忠告がありました。


# 環境
- macOS Catalina v10.15.3
- Atom v1.44.0


# 導入していたlinter関係のパッケージ
- [linter](https://atom.io/packages/linter) v2.3.1
- [linter-ui-default](https://atom.io/packages/linter-ui-default) v1.8.1
- [linter-csslint](https://atom.io/packages/linter-csslint) **v2.0.1 ※アップデート前**
- [linter-htmllint](https://atom.io/packages/linter-htmlhint) v1.6.3
- [linter-eslint](https://atom.io/packages/linter-eshint) v8.5.5
- [linter-jscs](https://atom.io/packages/linter-jscs) v4.2.4
- [linter-php](https://atom.io/packages/linter-php) v1.6.1
- [linter-sass-lint](https://atom.io/packages/linter-sass-lint) v1.9.0


# 原因
linterのメッセージを見てみると、「Provider」が**CSSLink**になっています。
<img width="1437" alt="スクリーンショット 2020-03-02 5.23.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575953/b5ac5662-be39-04e3-1cf0-e76268079f63.png">

調べると、v2.0.1までは、linter-csslintのgrammarScopesがhtmlも範囲に入っているとのこと。
確認したら、確かに`'source.html'`の記述がありました。
<img width="994" alt="スクリーンショット 2020-03-02 6.27.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575953/a369775b-5048-d738-703b-774546322959.png">


# 解決
**v2.0.2**からは、`'source.html'`の記述が削除されたということです。
急いでlinter-csslintをアップデート。（2020/03/02現在:v2.0.6）

一応ソースを確認したら、`'source.html'`の記述は消えていました。
<img width="844" alt="スクリーンショット 2020-03-02 6.32.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575953/ce646796-62ab-d618-0a79-a2bd610c36c5.png">


エラー表示問題も無事解決。
<img width="315" alt="スクリーンショット 2020-03-02 6.46.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575953/c639354d-6e78-b517-e32f-db8dd429bc62.png">


# 反省
今回、パッケージのアップデートを手動で行っていたため、Updateボタン押下に漏れがあり、linter-csslintのバーションが古いままになっていました。これに気づくまで、多くの時間を使ってしまいました。
パッケージのアップデートを自動化する[「auto-update-packages」](https://atom.io/packages/auto-update-packages)というパッケージもあるようなので、早速取り入れたいと思います。


# 参照
https://github.com/AtomLinter/linter-csslint/pull/211
https://github.com/AtomLinter/linter-csslint/releases
sequelize model:create時のエラーを解決するまでに実行したこと


##実行コマンド
```terminal:console
sequelize model:create --name goal --underscored --attributes goalname:string
```
sequelizeでgoalというモデルを作成しようとしている。

###エラー内容
```terminal:console
Unable to resolve sequelize package in
```
`意味`
sequelizeがうまく開かないみたいだけど


#問題点がありそうなところを考える
以下の１番目から順番に思いついたため、順番に対処しました。
結果的に３番目の「実行ディレクトリの誤り」だっただけですが、そこに辿り着くまでに手順をまとめておこうと思います。

####1. confing.jsonの表記ミス
####2. sequelizeのインストールができていない
####3. 実行ディレクトリの誤り

##1. confing.jsonの表記ミスの可能性
vimなどのエディタでnode/config/config.jsonを確認。

```terminal:terminal
vim node/config/config.json
```

```terminal:node/config/config.json
1 {
  2   "development": {
  3     "username": "root",
  4     "password": null,
  5     "database": "database_development",
  6     "host": "127.0.0.1",
  7     "dialect": "sqlite",
  8     "storage": "./data/development.sqlite3",
  9     "operatorsAliases": false
 10   },
 11   "test": {
 12     "username": "root",
 13     "password": null,
 14     "database": "database_test",
 15     "host": "127.0.0.1",
 16     "dialect": "sqlite",
 17     "storage": "./data/test.sqlite3",
 18     "operatorsAliases": false
 19   },
 20   "production": {
 21     "username": "root",
 22     "password": null,
 23     "database": "database_production",
 24     "host": "127.0.0.1",
 25     "dialect": "sqlite",
 26     "storage": "./data/production.sqlite3",
 27     "operatorsAliases": false
 28   }
```
確認したが問題が確認できなかった。

##２. sequelizeのインストールができていない
この時点で自分はパニック
何をして良いかわからないが、もしかしてインストールがうまくいってなかったのではと思い、コンテナにログインし、sequelize　--versionをおこうが、command not foundと怒られてしまったため、とりあえず再インストールを行うことにした。

早速コンテナにログインし実行してみる

```
docker exec -it serverapp /bin/bash
```

```terminal:root
npm install --save sequelize
```
<img width="829" alt="スクリーンショット 2020-03-02 06.54.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/40c2b01c-7ae2-859d-42b7-f0ceb87d9fd2.png">
ENOENTとはError NO ENTry のこと。ようはファイルみつかんねぇーよってこと。
すでにpackage.jsonがディレクトリにあるため、エラーが出たと自己解釈（この解釈は間違ってるかもしれませんが・・・）。

インストールの確認

```terminal:root
sequelize　--version
```
<img width="640" alt="スクリーンショット 2020-03-02 06.59.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/ec1b768d-740c-d487-d7bf-c6117cc64d23.png">
しっかりインストールが完了したため、マイグレーションを行うと以下のエラーが出た。

####実行コマンド
```terminal:console
sequelize db:migrate
```

###エラー内容
```terminal:console
ERROR: Please install mysql2 package manually
```

`意味`
Mysql2を手動でインストールして


`解決`
まずSQliteを使用するのにMySQLをインストールしてなのか疑問だったが、とりあえずMysql2をインストールしてみることにした。

##実行コマンド
```terminal:console
sequelize db:migrate
```

###エラー内容
```terminal:console
connect ECONNREFUSED 127.0.0.1:3306
```

`意味`
Mysql2を手動でインストールして

設定ファイルがsqliteになっているのにmysqlが必要なのが意味不明すぎて混乱した。

##3. 実行ディレクトリの誤り
最終的にはこれが原因でした。

root/nodeで実行しないといけないものをroot直下で実行していました。

正しくは

```terminal:root/node/
sequelize model:create --name goal --underscored --attributes goalname:string
```
これで実行し無事マイグレートを行えました。

#まとめ
今回のエラーでMysqlやsqliteについて知るきっかけになった良かったと思いますが、結構時間がかかってしまったので、今後はディレクトリ構造も注意してみたいと思います。
IteratorPattern@GoF

```
仁: [
        what has container<T>,
        what provides a interface I call "Interface to abdicate" for client,
        what provides a interface treats container@仁 for 伎
    ]
伎: [
        what treats 仁 as container,
        what contains 仁
    ]

佳: IteratorPattern@GoF

```

container@仁がtreatするTが統一されていれば，IteratorPattern@GoFはeffective．かかるTが多種多様だと，かかるcontainerは偶発的凝集に過ぎず，佳を適用してもcontainer@仁を走査することぐらいしかできない．
DjangoでのTemplatesの場所

# 概要
DjangoでWebアプリケーションを開発する際、templatesフォルダをアプリケーションフォルダ直下におくか、ルート（manage.pyなどと同じ階層）置くかで、settigns.pyの内容が変わります。
それに関する備忘録的なメモです。

# Djangoでのフォルダ階層

Djangoでは、一つのプロジェクトの中で複数のアプリケーションを作れます。
例えばユーザー管理のアプリケーションとしてaccount, 写真投稿のアプリケーションとしてpostsなどと言ったぐいあです。その際に、フォルダの構成には二通りあります。

## 各アプリケーションの下にtemplatesフォルダを配置

通常はこのアプリケーションごとに、templatesフォルダを作るようです。
というか、Djnagoのマニュアルなどでは大体が一つのアプリケーションを前提としているので自動的にそうなっているようです。
Djangoのプロジェクトを作ったときに自動生成されるsettings.pyもそれを想定しています。
つまり、アプリケーションフォルダの下にtemplatesを作るのであれば、settigns.pyはデフォルトのままで使えます。

## ルートにtemplatesを配置

個人的には上に書いたデフォルトのやり方はあまり好きではありません。
私はルート（migrate.pyなどと同じ階層）にtemplatesフォルダを置くようにしています。
その際に、settings.pyを次のように変更する必要があります。

### Before

```python

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
---------(中略)-----------
    },
]
```

### After

```python
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],# ここを変更
        'APP_DIRS': True,
---------(中略)-----------        },
    },
]
```

以上、簡単ではありますが、あくまでも自分への備忘録が目的なのでご了承ください。
Keycloak Docker版をローカルのPostgreSQLにつなぐ

[フューチャー Advent Calendar 2019](https://qiita.com/advent-calendar/2019/future) 16日目の記事です。
去年のアドカレを3月に投稿することになってしまい申し訳ありません。

# Keycloakのカスタマイズ
OpenID Connectを利用した認証認可ソフトウェアの一つとして便利なKeycloakですが、ローカル環境で軽く試す場合、Javaのランタイムなど考えると少し面倒なのでDocker版を利用するケースが多いかと思います。
KeycloakのDBはデフォルトでIn-memoryのH2を使ってるので、Keycloakを再起動すると永続化された既存の設定が消えてしまい、再設定する手間がかかります。
例えば、あらゆる設定を試したり、SPIを利用したり、特にCredentialModel拡張やUserStorageSPIを使ってローカル環境でゴリゴリカスタマイズする場合、頻繁に再起動することになるので、ローカルのDBを使い永続化して内容を確認したり直接いじってみたりとかしたいですよね。

# Docker版のDB永続化
[Docker Hub](https://hub.docker.com/r/jboss/keycloak/)にも書いてある通り、Docker版でももちろん外部のDBが使えるようにサポートしてますし、[keycloak/keycloak-containers](https://github.com/keycloak/keycloak-containers/tree/master/docker-compose-examples)を見るとサンプルのDockerfileまで用意されてます。
しかし、このサンプルではdocker volumeで永続化された、Docker版DBをdocker-composeにより使ってるので、ここではローカルで直接インストールされたPostgreSQLにつなごうと思います。

# Dockerfile

```dockerfile:Dockerfile
FROM jboss/keycloak

ENV KEYCLOAK_USER admin
ENV KEYCLOAK_PASSWORD pass1234

ENV DB_VENDOR postgres
ENV DB_ADDR postgres
ENV DB_PORT 5432
ENV DB_DATABASE keycloak
ENV DB_USER keycloak-user
ENV DB_PASSWORD db-password

# ローカルで開発SPIのjarを入れる
ADD ./build/libs/*.jar /opt/jboss/keycloak/standalone/deployments/
```

ここで重要なのは`ENV DB_ADDR postgres`
これを`localhost`にしてしまうと、DBの向き先がホストOS(ローカル)じゃなくコンテナ内を指してしまうので全然繋がりません。ここは`postgres`というエイリアスにしときます。
(`--net=host`でコンテナをホストネットワークにつなぐと、`[UDP] /172.17.0.1 is not a valid address on any local network interface`とかでWildFlyに怒られます。)

# PostgreSQL
```conf:postgresql.conf
listen_addresses = '*'
```

コンテナからはホストの内部IPアドレスでアクセスして来ますが、ローカル環境なので特に支障なければ適当に`*`にします。

```conf:pg_hba.conf
# TYPE  DATABASE    USER             ADDRESS           METHOD
host    keycloak    keycloak-user    192.168.0.0/16    password
```

Dockerコンテナの中からホストにアクセスする場合は、Remote(接続元)のIPアドレスがdocker0によって変換されるので`172.17.0.0/16`などではなく、ホストの内部IPのCIDRである`192.168.0.0/16` or `192.168.x.x/32`などにします。
同じく支障なければ`0.0.0.0/0`でも構いません。

# 起動
```sh
$ docker run -p 8080:8080 --add-host postgres:`ipconfig getifaddr en0` keycloak
```
あとは起動時`postgres`エイリアスにホストマシンの内部IPをセットすればOKです。

# やってみたら
これ、別にKeycloakに限った話じゃないですよね…
他のDocker版アプリをローカルDBにつなぐ場合にも使えそうです！

# References
- [jboss/keycloak - Docker Hub](https://hub.docker.com/r/jboss/keycloak/)
- [Using Docker to launch web app, can't connect to Postgresql DB? - Stack Overflow](https://stackoverflow.com/questions/37482716/using-docker-to-launch-web-app-cant-connect-to-postgresql-db)
- [Allow docker container to connect to a local/host postgres database - Stack Overflow](https://stackoverflow.com/questions/31249112/allow-docker-container-to-connect-to-a-local-host-postgres-database)
- [How to configure PostgreSQL to accept all incoming connections - Stack Overflow](https://stackoverflow.com/questions/3278379/how-to-configure-postgresql-to-accept-all-incoming-connections)