OmniAICreator/Qiita-1.07M huggingface dataset:
datadogでtraceできないときは、datadog-agent-traceが起動しているか確認しよう

datadogを利用することになり、システムリソースは`datadog-agent`から取得できていたのですが、
APMのデータが取得できず困っていました。
[APMで使うデフォルトのport](https://docs.datadoghq.com/agent/apm/?tab=agent630)`8126`がlistenできていない状態です。
結論を言うと`datadog-agent`だけでなく、`datadog-agent-trace`が立ち上がっている必要があり、
`service datadog-agent-trace start`にて起動したところ、無事APMで解析することができました。

```
# APM用
/etc/init.d/datadog-agent-trace
# APMとは無関係のプロセス名取得用
/etc/init.d/datadog-agent-process
```
`datadog-agent`を起動すれば`datadog-agent-trace`も起動するようですが、
万が一立ち上がっていない場合は試してみてください。
ローカルでも valid な証明書が使いたい！

![Screenshot from 2019-02-07 16-30-00.png](https://qiita-image-store.s3.amazonaws.com/0/332028/2d3b38c3-67db-5610-c250-ea85c9ce59d8.png)


ローカルで HTTPS な Web サービスを開発する時にあるあるな **「自己署名証明書つらい」** 問題。

- `chrome://flags#allow-insecure-localhost` 仮想環境など localhost にサーバを立てれないとつらい
- Firefox 証明書の例外追加 他のブラウザにない機能なのでつらい

解決します。

## 要約

1. [FiloSottile/mkcert](https://github.com/FiloSottile/mkcert) をインストールします。
2. `$ mkcert -install` 打ちます。
3. ブラウザ再起動します。
3. `$ mkcert 任意のドメイン名(複数個、ワイルドカードOK)` 打ちます。
4. 生成された鍵をサーバに設定して再起動します。
5. 完

![Screenshot from 2019-02-07 16-39-20.png](https://qiita-image-store.s3.amazonaws.com/0/332028/1184fac0-6565-b7f9-5a76-91f85359f9a5.png)

## 何が起こっている？

ブラウザが「この証明書が valid かどうか」を判定するため、ローカルに **「ルート CA (証明局)」** という情報を持っています。

デフォルトでは各ブラウザベンダーが承認したルート CA と、そこから木構造で発行の権限が移譲されている中間 CA が設定されていて、それらの CA から発行された証明書であれば valid である、という判定を行っています。

`mkcert` は、この **ルート CA を生成し、自分のブラウザに登録します**。

本来ルート CA の自分での登録は様々な設定を行って、色んなコマンドを叩いてやっと実現出来る作業なんですが、 `mkcert` はそれらの面倒を完全に省略することが可能です。 `mkcert -install` に全ての面倒が圧縮されています。

これで、 **ローカルの mkcert で発行された証明書は valid とみなす** とブラウザが判断出来るようになります。

もちろんこれはこの環境以外では valid ではない(valid とみなすルート CA がない)ので、ローカル環境だけで利用してくださいね。

Web サービスを開発するエンジニアは全員ローカルに `mkcert` によるルート証明局を持つ世界になったらいいなーと思います。

証明書つらい問題を抱えている全てのエンジニアに届いてほしい！

(証明書周りはあまり詳しくないので間違った表現もあると思います。とりあえず `ローカルで簡単に valid な証明書作れる` だけ覚えてもらえれば助かります。)

※ `sample.com` さんを参考資料として掲載しましたが、ローカルでは実在しないドメインを使いましょう！
Raspberry Pi 3 B+へのUbuntu Mateのインストール


# はじめに
Ubuntu MateがRaspberry Pi 3 B+に対応しておらず、インストールしても起動できない。
起動できるようにするまでの手順をメモとして残す。

## 参考記事
http://hara.jpn.com/_default/ja/Topics/RaspPi3BPlusRos.html

## 手順
まず、Ubuntu Mateを通常手順でmicroSDカードにインストールする。

ダウンロード：https://ubuntu-mate.org/raspberry-pi/
microSDにイメージを焼く手順も上記URLに記載されているもので良い。
イメージを焼けたらmicroSDをマウントして、PI_BOOTとPI_ROOTがあることを確認する。

次にRasbianをダウンロードする。
ダウロードURL：https://www.raspberrypi.org/downloads/raspbian/

```
unzip 2018-11-13-raspbian-stretch-full.zip     # zipファイル展開
fdisk -l 2018-11-13-raspbian-stretch-full.img  # マウント位置を確認(※)
mkdir mnt                                      # 一時的なマウントポイントを作成
sudo mount -o loop,offset=<boot開始位置> 2018-11-13-raspbian-stretch-full.img ./mnt/ # boot領域をマウント
cd ./mnt
cp -p bootcode.bin fixup.dat start.elf kernel7.img bcm2710-rpi-3-b-plus.dtb /<microSDのマウントポイント>/PI_BOOT/ # 必要なファイルを上書き
cd ..
sudo umount ./mnt                              # bootとroot領域を同時にマウントできないのでboot領域をアンマウント
sudo mount  -o loop,offset=<root開始位置> 2018-11-13-raspbian-stretch-full.img ./mnt/
sudo cp -pr mnt/lib/firmware/brcm /<microSDのマウントポイント>/PI_ROOT/lib/firmware/ # brcmを上書き
sudo cp -pr mnt/lib/modules/4.14.* /<microSDのマウントポイント>/PI_ROOT/lib/modules/ # modulesをコピー
sudo umount ./mnt
```

**※マウント位置の確認方法**
`fdisk`コマンドでイメージの開始位置のセクタ数を確認する。
セクタサイズが512バイトになっているはずなので、開始位置×512をマウントコマンドのoffsetに指定する。
下の例だと
boot：8192×512=4194304
root：98304×512=50331648
を<開始位置>に指定すれば良い。

```
デバイス                                 起動 開始位置 最後から   セクタ サイズ Id タイプ
2018-11-13-raspbian-stretch-full.img1          8192    98045    89854  43.9M  c W95 FAT32 (LBA)
2018-11-13-raspbian-stretch-full.img2         98304 10346495 10248192   4.9G 83 Linux
```

以上の手順でmicroSDにmodel B+で起動できるイメージが書き込まれた状態になる。
ElasticSearchの1ドキュメントを消す方法

ElasticSearchのドキュメントというのは、RDBで言う所のレコードのこと。
普段kibanaのDevtoolsでいじっているため、cURLなどを利用する人は適宜読み替えて使って欲しい。

１つだけ消す方法は

```

DELETE index名/(ID)
```

で消すことができる。
IDはsearchなどで表示すると出てくるのでそれを指定すると消すことができる。
tileserver-glのDockerContainerがRestartを繰り返す場合の対処法

# What's happen?
業務でOpenMapTilesというMapbox Vector Tileを利用した地図配信サーバを作成しているのですが、
サーバー再起動やdocker-composeでcontainerを再起動した際に永遠とRestartを繰り返し
containerが起動しないという事件が発生しておりました。

暫定対応ですが、対処法がわかったのでメモです。

OpenMapTileやtileserver-glについてはsmellmanさんのブログをご覧ください。
[OpenMapTiles/Tileserver-GL/MaputnikによるMapbox Vector TileのOSS実装環境のまとめ](http://smellman.hatenablog.com/entry/2017/12/10/210900)


## 原因
既知の問題のようで、tileserver-glのGitHubでもissueに上がっていました。
モジュールの起動が完了する前にtileserverの起動が走ってしまうのが原因のようです。

Sleepの処理を追加して5分待つようにしているようですが、それでも時間が足りず起動できません。

## 解決策
暫定対応ですが、container imageを削除して再度docker-compose upすることで解決しました。


まずは削除対象のcontainerを確認します。

```
$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS                              NAMES
9167fc18350d        klokantech/tileserver-gl   "/bin/bash /usr/src/a"   21 hours ago        Up 21 hours                80/tcp                             tileserver_raster-tileserver_2
9f3cb6e08a8e        eeacms/varnish             "/docker-entrypoint.s"   21 hours ago        Up 21 hours (healthy)      0.0.0.0:6081->6081/tcp, 6085/tcp   tileserver_varnish_1
6dff869ac649        klokantech/tileserver-gl   "/bin/bash /usr/src/a"   21 hours ago        Up 21 hours                0.0.0.0:8080->80/tcp               tileserver_vector-tileserver_1
83b0fffca937        klokantech/tileserver-gl   "/bin/bash /usr/src/a"   21 hours ago        Up 21 hours                80/tcp                             tileserver_raster-tileserver_1
```

*tileserver_raster-tileserver_1* と *tileserver_raster-tileserver_2* を削除。

```
$ docker rm 9167fc18350d 83b0fffca937
```

再度 docker-compose up,必要に応じて docker-compose scaleでインスタンスを増やして復旧。


### やっておきたいこと
サーバーが再起動した時に上記解決策で実施したコマンドを自動で流すScriptを仕込んでおくと安心して眠れそうです。
AzureのVMを使っているのですが、Azureは再起動を伴うメンテナンスが発生することがままあるので
勝手に再起動されても大丈夫な仕組みを残しておくと障害回避になりますね。
AASMのfromに指定されている値を取得するには（1行で）



AASM Gemででこういうのを定義してたとして

```ruby
class Job
  include AASM

  aasm do
    state :sleeping, :initial => true
    state :running, :cleaning

    event :run do
      transitions :from => :sleeping, :to => :running
    end

    event :clean do
      transitions :from => :running, :to => :cleaning
    end

    event :sleep do
      transitions :from => [:running, :cleaning], :to => :sleeping
    end
  end
end
```

sleepイベントのfromを取得したいときは、こんな感じでいけます。

```ruby
Job.aasm.events.detect { |event| event.name == :sleep }.transitions.map(&:from)
```


AASM
https://github.com/aasm/aasm
Dockerのコマンドが長いのでalias設定した

# Docker コマンドが長い！

Docker コマンドをタイプする機会がたくさんあります。
毎回毎回、 `docker` から書き始めているとたいへんなので、
`alias` を設定して素早くコマンドを使えるようにしています。

## `alias` 設定内容

```
alias d='docker'
alias dc='docker-compose'
alias dcnt='docker container'
alias dcur='docker container ls -f status=running -l -q'
alias dexec='docker container exec -it $(dcur)'
alias dimg='docker image'
alias drun='docker container run --rm -d'
alias drunit='docker container run --rm -it'
alias dstop='docker container stop $(dcur)'
```

これらを `~/.bash_profile` に書いています。

## Before / After

### コンテナを起動するとき

**Before:**

```
docker image pull httpd
docker container run --rm -d -p 8000:80 httpd
```

**After:**

```
dimg pull httpd:latest
drun -p 8000:80 httpd:latest
```

### シェルを実行するとき

**Before:**

```
docker image pull centos
docker container run --rm -it centos bash
```

**After:**

```
dimg pull centos
drunit centos bash
```

### コンテナを止めるとき

**Before:**

```
docker container ls

... 止めたいコンテナのIDをコピー ...

docker container stop コピーしたコンテナのID
```

**After:**

```
dstop
```

### `docker-compose` でサービスを立ち上げるとき

**Before:**

```
docker-compose up -d
```

**After:**

```
dc up -d
```

### `docker-compose` でサービスを停止するとき

**Before:**

```
docker-compose down
```

**After:**

```
dc down
```
どうしても外せなくて使い続けてる alias 紹介

僕はエディタやターミナル、シェル設定はできるだけデフォルトであるべきだと思ってます。
それでもどうしても使い続けてる shell alias を紹介します。
基本 Mac OS, zsh 環境で書きます。

## 外せない

### `|pbcopy` → `C`

```shell
# mac
alias -g C='| pbcopy'
# linux
alias -g C='| xsel --input --clipboard'
```

これについては本当に使う頻度が高くて助かってます。
tmux だと後から `copy-mode` が使えます。
調べたら `@c` という命名でつけてる人もいました。


### `rm` → `rmtrash`

```shell
alias rm="rmtrash"
```

`rmtrash` コマンドはゴミ箱に移動してくれるコマンドです。ドジな僕はすでに3回は救われています。
素の `rm` コマンドは人間が手動で使うコマンドだと思ってません。(個人の感想)
git 管理下では気にならないですが、それ以外の場所でも保険としてあるに越したことはないと思ってます。


## 脅されたら外してもいいけど便利


```shell
alias ..="cd ../"
alias -g G="| grep"
alias ls="ls -alh -G"
alias dc="docker-compose"
```

### ``..``

定番だけどコスパ高い。

### `|grep` → `G`


pbcopy 同様使用頻度が高いので。

### `ls -alh -G`


1列に整列してたほうが見やすいと思って設定してます。
Option 外したいときは `\ls` と打ってます。

### `docker-compose`
流石に長いのでスマン。
Cloud FunctionsでGoをデプロイをする際のエラーメッセージが「go: finding ・・・」だった時の対処方法

#発生事象
##事象
GCPのCloud FunctionsをCloud Shellから「gcloud functions deploy」コマンドでデプロイしようとしたところ、以下のメッセージが出てデプロイに失敗した。

```shell
$ gcloud functions deploy NotUsed --runtime go111 --trigger-http
Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: go: finding cloud.google.com/go v0.35.1
go: finding github.com/golang/protobuf v1.2.0
go: finding github.com/BurntSushi/toml v0.3.1
go: finding github.com/google/martian v2.1.0+incompatible
・・・・（中略）・・・・・
go: finding github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e
go: finding github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1
go: finding github.com/google/go-querystring v1.0.0
go: finding go4.org v0.0.0-20180809161055-417644f6feb5
go: finding github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95
go: finding google.golang.org/api v0.0.0-20
```

##日時
2019年2月7日

##ソース

```imported_and_not_used.go

package function

import (
        "net/http"
        "fmt"
        "cloud.google.com/go/firestore"
)

func NotUsed(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello, World!")
}
```

```go.mod
module test

require cloud.google.com/go v0.35.1
```

#発生原因
##原因
インポートした「cloud.google.com/go/firestore」がソースの中で使用されておらずビルドに失敗するため。

##対策
ソースの中でインポートしたライブラリ（ここではfirestoreを使用するようにする。もしくは不要なインポートを外す。

##考察
エラーメッセージとして非常に解りづらくなっております。本質のエラーは「imported and not used」ですが、go: findingを出力してしまっているため、出力できるエラーメッセージ長の上限を超えてしまって本質のエラーが見えなくなってしまっているものと思われます。
go.modが無い場合はエラーメッセージとして「imported and not used」が出力されます。go.modがある場合のみ、エラーメッセージが解りづらくなっています。

#事象発生と調査経緯
##その１(事象発生前）
go.modが無い状態でデプロイしたところ、以下のようなエラーが発生しgo.modを作成

```シェル
$ gcloud functions deploy NotUsed --runtime go111 --trigger-http
Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: /tmp/sgb/gopath/src/serverlessapp/vendor/function/imported_and_not_used.go:7:2: cannot find package "cloud.google.com/go/firestore" in any of:
        /tmp/sgb/gopath/src/serverlessapp/vendor/cloud.google.com/go/firestore (vendor tree)
        /go/src/cloud.google.com/go/firestore (from $GOROOT)
        /tmp/sgb/gopath/src/cloud.google.com/go/firestore (from $GOPATH)
```
##その２(事象発生）
gcloud functions deployしたところ始めに説明してある事象が発生

##その３（go.modの調査）
cloud.google.com/goのバージョンを変更をためしてみたが事象は変わらず。


##その４（原因の特定と解決）
エラーメッセージを見ると「message=Build failed」とあったので、ビルドを試してみることにしました。

```シェル
$ go build imported_and_not_used.go
# command-line-arguments
./imported_and_not_used.go:7:2: imported and not used: "cloud.google.com/go/firestore"
```

あ、ごめんなさい。そうでした。

きちんと処理を実装して、未使用のインポートをなくしたらデプロイできました。



#まとめ
原因はシンプルですが、本質のエラーにたどり着くまでに時間がかかってしまいました。
デプロイする前にgo buildするかmainを書いてテストするようにしましょう。
Openpyxl 結合セルのValue取得

#ググっても中々出てこないもしくはopenpyxlのバージョン違いでそのまま使えないから、書いておく

openpyxlのSheet型とCell型を引数として渡せば、そのCellは結合セルの場合は結合セルの先頭のセルのValueを返す、結合セルではなかったらそのままCellのValueを返す。

openpyxl version 2.6

```python:getMergedCellValue.py
def getMergedCellValue(sheet, cell):
    cell_index = cell.coordinate
    for range_ in sheet.merged_cells.ranges:
        merged_cells = list(openpyxl.utils.rows_from_range(str(range_)))
        for row in merged_cells:
            if cell_index in row:
                return sheet[merged_cells[0][0]].value
    return sheet[cell_index].value
```
Windows10でSublimeText3の日本語入力をインラインでする

# はじめに
sublimetext3をテキストエディタとして使い始めた．
もともとemacs使ってたのだけれど，弱い人がいろいろ設定していたら重くなってきてテキストエディタのメリットが無くなったので…．

ところが，ノートパソコンに入れたところ，日本語入力がうまくいかない．
その対策をしたのでまとめておく．
僕の設定ファイルは[github](https://github.com/1222hime/sublime-settings-sync/tree/master)においてる．
windowsのブランチは変なことになっている．

SublimeText3のInstallとかPackage Control入れるのとかはいろんな記事があるので扱わない．
## 追記 190709  
なんか，VScodeとWSLの相性がいい上に軽量化も進んでいるようなので，移行を画策している．

# 日本語入力のインライン表示がズレる
他の記事[1][1]で紹介されているけれど，Windows上のSublimeTextでは，日本語入力のインライン表示ができない．
なのでPackage ControlからIEMSupportをインストールしたものの，ズレてしまう．
## 原因
ディスプレイ設定で，`拡大縮小とレイアウト`が100%じゃなかったらおこることがわかった．

## 解決方法1 : Sublimeの設定で解決
他のアプリ等に影響がない代わりにSublimetextの起動が遅くなる方法．

1. 検索で`sublimetext.exe`がある場所を探す．  
   `C:\Program Files\Sublime Text 3\sublime_text.exe`にあると思う．
1. 右クリックでプロパティを開く．
1. `互換性`のタブにある`高DPIの設定を変更`を開く．
1. 2つCheckBoxがあるが，どちらもにチェックを入れる．
1. `次の場合，メインディッシュに設定されているDPIを使用する`はどちらでも良い．
    1. windowsにサインインしたとき，にした方がアプリの起動が早い．
    2. このプログラムを開いたとき，にしたら外部画面を使用している際におかしくならないのだと思う．
1. '高いDPIスケールの動作を上書きします'を`システム`か`システム拡張`にする．

## 解決方法2 : Windowsの設定をかえちゃう．
デスクトップで右クリックしたら出てくるディスプレイ設定で`拡大縮小とレイアウト`を100%にする．
すると，他のアプリを含めてすべてが小さくなる．
僕は艦これを艦これウィジットで開くのデフォルト画面が小さくなって嬉しいのでこっちを使っている．

1. デスクトップで右クリックしたら出てくるディスプレイ設定で`拡大縮小とレイアウト`を100%にする．
1. 全体的にフォントサイズが小さくなるのは厄介なので，変更する
    1. ["Meiryo UIもだいっきらい"](https://tatsu-syo.github.io/index.html)でフォントサイズを大きくした．
    1. これだけではフォントが微妙になるので，`ClearTypeテキストの調整`を実行する．
        1. `設定`の`フォント`の関連する設定のところにいる． 
    1. 別のアプリもその都度フォントサイズの設定を変更する．
        1. chromeは設定で`ページのズーム`を変えたらいい感じになった．
        2. Officeとかは普通に拡大したらいい感じ． 
    1. 昔はフォントサイズだけ大きくできたらしいので，またできるようになるのを願う．
1. sublimetextでフォントサイズを変更する．
    1. 本文のフォントはSublimeTextのSettingで変更できる．ググればたくさん出てくる．
    2. サイドバーのフォントは，Themeで変更しないといけない．
        1. Preferences-Settingを開きthemeが何かを見る．
        1. `Preferences-Browse Packages`で開くファイルの`User`ファイルを開く．
        1. 先に調べたtheme名のファイルを作成し，フォントサイズの設定をかく．
        1. 僕の例[リンク](https://github.com/1222hime/sublime-settings-sync/blob/windows/Adaptive.sublime-theme)


# その他僕がした設定
## Notoフォントの行間が異様に広い  
  等幅のNotoフォントにしたけど，行間が広すぎるのでSettingで行間を詰めた．  
  Settingに"line_padding_top": -4を追加．

## ubuntuでの日本語入力
### SublimeMozcInput  
  日本語入力がいい感じになるが変換はインライン表示されない．
  Tabで変換候補が出る．  
  [http://yasuyuky.github.io/SublimeMozcInput/](http://yasuyuky.github.io/SublimeMozcInput/)



[1]:https://qiita.com/lunatea/items/53f4adcc6ea3f316e781
youtube endcardのエリアをざっくり調べてみた

#エンドカードを作る
そんな作業があったので簡単にオブジェクトの設置が可能なエリアを調べてみた。

![bandicam-2019-02-07-15-44-04-378.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/e60bdd02-ae2a-a96e-9dea-f6239cb3f9a1.jpeg)

小数点は適当に丸めてください。
厳密に正確ではないと思いますが、ある程度のガイドにはなるかと。
Ubuntu 18.04にRStudioをインストールする。

RStudioはLocalにあるdebの依存ファイルをダウンロードしてインストールしてくれるgdebiというツールを使ってインストールする。
最新のRStudioは https://www.rstudio.com/products/rstudio/download/#download で確認する。

```bash:terminal
sudo apt install gdebi
# 最新のRStudioをダウンロード
curl -LO https://download1.rstudio.org/desktop/bionic/amd64/rstudio-1.2.1578-amd64.deb
sudo gdebi rstudio-1.2.1578-amd64.deb
```

### 参考
https://qiita.com/JeJeNeNo/items/43fc95c4710c668e86a2
学びの記録　〜Progate PHP Ⅳ 〜

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているryota_miraidenshiです。
今回はPHPⅣを学んで覚えておきたいポイントをまとめておきます。

#クエリ情報
リンクを押してもどのリンクを押してこのページに飛んだのかという情報は渡さなければわかりません。
そこで使われるのがクエリ情報で、具体的にはURL以降に「?キー名=値」を記述します。
![スクリーンショット 2019-02-07 11.53.30.png](https://qiita-image-store.s3.amazonaws.com/0/351843/c5149efc-0611-7e62-a300-f3fd19619972.png)

クエリ情報を受け取るためには、セレクトボックスの情報は「$_POST['name属性名']」で記述していたのと同様に、「$_GET['キー名']」で受け取ることができます。

#returnの役割
returnの役割は文字通り値を返すことですが、もう一つ大事な役割があります。
それがreturnが呼ばれた部分で関数やメソッドの処理を終了させることです。
for文で繰り返し処理を行っていた場合もreturnが呼ばれるとそれ以降のループ処理は行われません。

#ユーザーの識別
ユーザーを識別するのに名前を使用すると同じ名前のユーザーがいた場合に識別できなくなってしまいます。
そこで必要なのが一意の何らかの値を割り振るということです。
今回はidとしてユーザーを識別するのに使用しました。

#最後に
PHPの学習を通して実際に自分で手を動かして何らかのページであったりサービスであったり作ってみることが大事だと思いました。
それをすることでここで学んだことの復習にもなり、新しい発見や知識にも繋がると思います。
jQuery.onメソッドいろいろ

自分用チートシートです。
毎度過去のプロジェクトから探してコピペするのが面倒なので、ここにまとめます。
よく使うもの中心にまとめてます。随時更新します。


###◆表示と同時に発動系

####htmlの読み込みが終わった時点で発動
特別な理由がない限りこっち

```javascript
$(function(){
	//処理
});
```

####画像やcssなどもすべて読み込み終わってから発動

```javascript
$(window).load(function() {
	//処理
});
```

####画面リサイズ
```javascript
$(window).resize(function() {
	//処理
});
```

###◆マウス動作系
####クリック
```javascript
$(document).on('click', 'セレクタ', function() {
	//処理
});
```

####ホバー
```javascript
$(document).on({
	'mouseenter': function(){
		//ホバー時の処理
	},
	"mouseleave": function(){
		//マウスを離した時の処理
	}
}, 'セレクタ');

```

###◆input系

####inputの内容が更新された時

```javascript
$(document).on('change','セレクタ', function () {
	//処理
});
```

####フォーカスした時

```javascript
//子要素に直接設定したいとき
$(document).on('focus','セレクタ', function () {
	//処理
});

//親要素に設定して子要素の反応をまるっと受け取りたい時
$(document).on('focusin','セレクタ', function () {
	//処理
});
```

####フォーカスが外れた時

```javascript
//子要素に直接設定したいとき
$(document).on('blur','セレクタ', function () {
	//処理
});

//親要素に設定して子要素の反応をまるっと受け取りたい時
$(document).on('focusout','セレクタ', function () {
	//処理
});
```

###◆タイピング系
####キーが「押された」時

```javascript
$(document).on('keydown', 'セレクタ', function (){
	//処理
});
```

####キーが「離された」時

```javascript
$(document).on('keyup', 'セレクタ', function (){
	//処理
});
```

####「特定のキー」が「押された」時

```javascript
$(document).on('keydown', 'セレクタ', function (e){
	if (e.which == 押されたキーのコード) {
		//処理
	};
});
//よく使うキー
//enter -> 13
//スペース -> 32
```
キーコードはこちらを参考にするといい感じ
[[JavaScript] キーコードの一覧 - コピペで使える JavaScript逆引きリファレンス](https://javascript.programmer-reference.com/js-list-keycode/)

###◆その他
####cssアニメーションが終了した時
```javascript
//animation(keyframe)の場合
$(document).on('animationend webkitAnimationEnd','セレクタ', function(){
	// 処理
});

//transitionの場合
$(document).on('transitionend webkitTransitionEnd','セレクタ', function(){
	// 処理
});
```

###◆共通の注意点
\$(document).on～で記述するイベントハンドラは、動的に追加された要素についても発火するが、$(document)の部分で指定する「イベントの検知範囲」は静的である必要がある。
「document(ページ全体)」としておくのが一番確実ではあるが、サイトの軽量化・高速化を心がけるなら「最小単位のユニークで静的な先祖セレクタ」を指定するのがよいようだ。
※このページでは簡略化してすべて「document」と記述する
GANの数式を理解する

GANを理解したかったのですが、数式の意味がわからなかったので調べました。5時間くらいかけて、なんとなくわかった気がしたので書いておきます。

# 概要
今回は、こちらの[GAN論文](https://arxiv.org/pdf/1406.2661.pdf)の数式の意味を調べました。
![32F3BF02-7D1C-45F2-9062-C5685E5BB2F1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/233208/78f624e8-cc53-c7a3-178c-0551048bef30.jpeg)

DはDiscriminator(識別器)、GはGenerator(生成器)を意味します。Dを騙すG, Gに騙されないDを目指して、DとGを学習させていくようです。

## 左辺
左辺は、Vを最大にするDと、Vを最小にするGを選択した際の、Vの値という意味でしょうか？

ミニマックス問題というものが関係しているようなので、[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%8B%E3%83%9E%E3%83%83%E3%82%AF%E3%82%B9%E6%B3%95)で調べてみると、
> ミニマックス法（みにまっくすほう、英: minimax）またはミニマックス探索とは、想定される最大の損害が最小になるように決断を行う戦略のこと

なので、この数式をミニマックス問題として理解すると、DがVを最大化する場合に「Vを最小にするG」を選ぶ問題、となるようです。
Gの学習がミニマックス問題に当たる気がします。


## 右辺
Dは0~1の値を返すモデルだと理解しました。
正解ラベルは、オリジナルのデータには1、Gが生成したデータには0が振られている、という認識です。 

### log(0)とlog(1)の計算結果
log(D)がどんな特徴を持つのか、調べました。Dは0~1の値を返すので、D=1とD=0の場合の結果を確認してみます。

```
log(1) = 0
log(0) = -∞
```
つまり、1に近いほど値が大きくなり(0に近づき)、0に近いほど値が小さくなる(-∞に近づく)という特徴があるようです。

### 右辺第一項
xは教師データなので、1に近い値を返せるほど正しいモデルとなります。
logD(x)は、D(x)が1に近いほど値が0に近づき、0に近いほど小さい値(-∞に近い値)になります。

### 右辺第二項
Gが生成したデータなので、Dは0に近い値を返せるほど、正しいモデルとなります。
log(1-D(G(z))は、D(G(z))が1に近いほど小さい値になり、0に近いほど大きな値(0)に近づきます。

## 学習方法
[冒頭のGANの論文](https://arxiv.org/pdf/1406.2661.pdf)の説明を読むと、DとGの学習を交互に進めるようです。
![gan.png](https://qiita-image-store.s3.amazonaws.com/0/351842/e561886e-6e2b-086b-8a43-48586cb5ffd5.png)


### Dの学習
Gを固定して、Vが最大化するように学習します。右辺全体を最大化します。

### Gの学習
Dを固定してVが最小化するように学習します。右辺の第二項だけを最小化するようです。


## 終わりに
雰囲気はわかった気がするので、コードとして実装してみたいと思います。
サブドメインの異なるサービス間で cookie を共有する

```
https://www.nicovideo.jp  // ニコニコ動画
https://live.nicovideo.jp // ニコニコ生放送
https://ch.nicovideo.jp   // ニコニコチャンネル
```

例えば上記のように、異なるサブドメインにおいてもログインセッションなどのデータを共有したい場合があります。

セキュリティの都合上[オリジン](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Origin)(`<scheme>://<hostname>:<port>`)の異なる場所と JavaScript 内でデータの送受信を行う場合は[オリジン間リソース共有(CORS)](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)の仕組みを利用する必要があります。

しかし、 CORS のような仕組みを信頼されうるサブドメインの違いだけで利用するのは面倒です。

今回は Cookie の仕様を用いて、データを共有出来るようにします。

## 要約

**`;domain=example.com` オプションを付けること。**

domain オプションがついていなければ、現在のオリジンでしか使えないクッキーとなります。

## Cookie のドメイン指定を利用する

これは先ほど例に挙げたニコニコを含め、非常に多くのサービスで既に利用されている方法です。

クッキーには、 `key=value` の他にオプションを設定することが出来ます。

- `;path=パス` オリジン以下のパスを指定することで、そのパス以下のクッキーと認識させることが出来ます。デフォルトでは現在のパスが設定されます。
- `;domain=ドメイン` このクッキーが指し示すドメインを指定します。デフォルトでは現在のドメインが指定されます。後述。
- `;max-age=寿命(秒)` 設定されてからこの秒数を経過した場合、このクッキーは無効とされます。
- `;expires=GMTString 形式の日付` 設定した日付以降、このクッキーは無効とされます。 `max-age` も `expires` も指定されなかった場合は、セッションが終了(タブが閉じられる)すると無効になります。
- `;secure` https 通信のときのみこのクッキーを送信出来ます。
- `;samesite=(lax|strict)` strict の場合は、同一オリジンからのリクエストのみクッキーを送信します。 lax の場合は、別オリジンの a タグや GET form などのリクエストでもクッキーを送信します。

ここで今回重要になってくるのが `domain` オプションの設定です。

## domain

このオプションを設定しない場合は、同一のオリジンでのみ利用可能なクッキーとなります。

このオプションを設定した場合は、そのドメイン(例えば `nicovideo.jp`)と、そのサブドメイン(例えば `live.nicovideo.jp`)でも利用可能なクッキーとなります。

また、 `nicovideo.jp` のページ上で `domain=google.com` のように **ホスト名が異なるクッキーを設定することは出来ません** (設定しても無視されます)。

しかし、 `www.nicovideo.jp` のページ上で `domain=nicovideo.jp` というクッキーを設定することは可能です。そうした場合、そのクッキーは `nicovideo.jp` 内の **どんなサブドメインからでもアクセスが可能** になります。

このように、 `domain` オプションを指定することによって、サブドメインが異なるサービスでもログインセッション情報などを気軽に共有することが可能です。逆に、指定がない場合はサブドメインが違えば共有出来ません。

以前は `domain=.nicovideo.jp` のように、プレフィックスにドットを置くことで「サブドメインを含めて利用可能」と明示することとする場合があったようですが、現在はプレフィックスにドットを置いても無視される仕様となっています。

## ※弊害

例えば開発環境なんかは `https://dev.www.nicovideo.jp` のようなドメインを使うことがあるのではないかと思います。しかし、先ほどのように `domain=nicovideo.jp` というクッキーがあった場合、開発環境でもそのクッキーを利用可能な状態になってしまいます。

なので、最低限環境ごとにクッキーの名前をわけられるようにして、開発環境と本番環境のクッキーが干渉しないような設計にしましょう。

## 参考資料

- [Document.cookie - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Document/cookie)
- [Cookie の性質を利用した攻撃と Same Site Cookie の効果 | blog.jxck.io](https://blog.jxck.io/entries/2018-10-26/same-site-cookie.html)
- [CookieのDomainとPath属性の仕様について調べた話 - emahiro/b.log](https://ema-hiro.hatenablog.com/entry/2018/01/24/022902)
十分統計量、フィッシャー-ネイマンの分解定理

# 十分統計量
標本集合から、確率分布のパラメーター $\theta$ を統計的推定する際、推定に十分な情報を含んだ統計量を十分統計量と呼ぶ。

確率変数 $X$ に対する統計量 $T(X)$ が以下を満たす場合、その統計量は十分統計量と定義される。

```math
P(X=x|T(X)=t,\theta) = P(X=x|T(X)=t)
```

# フィッシャー-ネイマン分解定理
$X$ の確率関数 $f(x;\theta)$ とする。$T(X)$ が $\theta$ の十分統計量であるとき、かつその時に限り、以下を満たす関数 $h$ と $g$ が存在する。

```math
f(x;\theta) = h(x)g(T(x);\theta) \tag{1}
```

* $h$: $\theta$ に非依存
* $g$: $\theta$ に依存。$T(x)$ を通してのみ $x$ に依存

# 各種確率分布における十分統計量
とりあえずベルヌーイ分布と正規分布について確認する。

## ベルヌーイ分布
$X_1,\cdots,X_n$ をベルヌーイ分布 $B(1, p)$ に従う独立な確率変数とすると、和 $T(X)=\sum_{i=1}^{n}X_i$ は、パラメーター $p$ に対する十分統計量となる。

```math
\begin{align}
P(X=x) &= P(X_1=x_1,\cdots,X_n=x_n) \\
&= \prod_{i=1}^{n}P(X_i=x_i) \\
&= \prod_{i=1}^{n}p^{x_i}(1-p)^{1-x_i} \\
&= p^{\sum_{i=1}^{n}x_i}(1-p)^{n-\sum_{i=1}^{n}x_i} \\
&= p^{T(x)}(1-p)^{n-T(x)}
\end{align}
```

$h(x)=1$, $g(T(X);p)=p^{T(x)}(1-p)^{n-T(x)}$ とすることで(1)式を満たすことが分かる。

## 正規分布
$X_1,\cdots,X_n$ を正規分布 $N(\mu, \sigma^2)$ に従う独立な確率変数とする。分散 $\sigma^2$ が既知とすると、和 $T(X)=\sum_{i=1}^{n}X_i$ は、パラメーター $\mu$ に対する十分統計量となる。

```math
\begin{align}
P(X=x) &= P(X_1=x_1,\cdots,X_n=x_n) \\
&= \prod_{i=1}^{n}P(X_i=x_i) \\
&= \prod_{i=1}^{n}\frac{1}{\sqrt{2\pi\sigma^2}}\exp\left(-\frac{(x_i-\mu)^2}{2\sigma^2}\right) \\
&= (2\pi\sigma^2)^{-\frac{n}{2}}\exp\left(-\frac{\sum_{i=1}^{n}(x_i-\mu)^2}{2\sigma^2}\right)\\
&= (2\pi\sigma^2)^{-\frac{n}{2}}\exp\left(-\frac{\sum_{i=1}^{n}x_i^2-2\mu\sum_{i=1}^{n}x_i+n\mu^2}{2\sigma^2}\right) \\
&= (2\pi\sigma^2)^{-\frac{n}{2}}\exp\left(-\frac{\sum_{i=1}^{n}x_i^2}{2\sigma^2}\right)\exp\left(\frac{2\mu\sum_{i=1}^{n}x_i-n\mu^2}{2\sigma^2}\right)
\end{align}
```

最後の式における最初の2項を $h(x)$, 最後の項を $g(T(x),\mu)$ とすることで(1)式を満たすことが分かる。

$\sigma^2$ もパラメーターとする場合、和 $\sum_{i=1}^{n}X_i$ に加えて、二乗和 $\sum_{i=1}^{n}X_i^2$ も十分統計量となる。この場合、$h(x)$ は1となる。
キャッシュするHTTPクライアントをBehaviorSubjectを使って実装してみた例

### :point_right: 今回の構成
Angular4を使ってます。

### :point_right: 今回の経緯
同じページで複数の子コンポーネントから同じリクエストを投げていたのを1回のリクエストで済ませたかった。

### :point_right: やったこと
HttpClientをもったサービスを作り、Getリクエストに対してBehaviorSubjectをObservableにして返すメソッドをはやした。

### :point_right: やってないこと
GETパラメータ対応とかやってない...
BehaviorSubjectの初期値を決めなきゃならなかったので配列限定にした...
とまあ実際にいろいろアプリに組み込む上であとで掲載するコードよりはもう少しファットになっているのですが、BehaviorSubject便利！の一つとしてシンプルに伝わればいいかなと思い省いています。

## Subjectとは？
nextメソッドで流れてきた値をSubscriberに流す、SubscriberでありObservableなやつ

```js
const subject = new Subject<number>();

subject.subscribe(number => console.log(number));
subject.next(1);
//出力: 1
```

## BehaiviorSubjectとは？
Subjectに前回の値を保持する機能をもったもの。
.subscribeされたときに前回保持した値を最初に流す。

```js
const behaiviorSubject = new BehaiviorSubject<number>(1); //Subjecｔと違い初期値をいれる必要あり

subject.subscribe(number => console.log(number)); //初期値が流れてくる
//出力: 1
subject.next(2);
//出力: 2
subject.subscribe(number => console.log(number));
//出力: 2
```

## HTTPリクエストに使ってレスポンスを保持したもの
リクエストパスをキーに `リクエストパス: BehaiviorSubject` のMapを持っている。
getメソッド呼び出し時に
MapになければHTTPリクエスト、
MapにあればBehaiviorSubjectをObservableにして返す。

といったことをしております。

```js
export class CachedApiService {
  private requestMap: Map<string, BehaviorSubject<any[]>> = new Map();

  constructor(private http: HttpClient) {}

  get<T>(path: string) {
    if (!this.requestMap.get(path)) {
      this.requestMap.set(path, new BehaviorSubject<T[]>([]));

      this.http.get<T[]>(path, { params: this.params }).subscribe(
        response => {
          this.requestMap.get(path).next(response);
        },
        error => this.requestMap.get(path).error(error)
      );
    }

    return this.requestMap.get(path).asObservable() as Observable<T[]>;
  }
}
```

## Angularでよかったこと
キャッシュ系っていつ更新するのか、とかどこに保持しておくのとか考える＆管理するのが面倒なイメージだったのですが、AngularのServiceとして作ることで表示する一番親ページのproviderとして呼び出せば同じページ内だけ重複したリクエストが飛ばない仕様にでき楽でした。

以下呼び出すとき

```js
@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html',
  styleUrls: ['./parent.component.scss'],
  providers: [ CachedApiService ] // ← ここ
})
export class ParentComponent implements OnInit {
...
```



簡単ですが以上です！！
APIGW & NLB & ECS fargate構築してみた発見メモ（コンソール版）

# Steps
1. NLBの構築
2. ECSのサービスの構築
4. API Gatewayの構築
5. API Gateway → NLBのつなぎこみ
6. 動作確認

# 0. 下ごしらえ
プライベートサブネットとセキュリティグループはあらかじめ準備しておきます。  
（私自身がVPCに疎いので、ここで 1. NATをIGWがルーティングされていないSubnetに配置 2. ECSのセキュリティグループのInboundのソースをセキュリテイグループに指定 というミスをしました）

# 1. NLBの構築
ポイント: 気が抜けてるとデフォルトのVPCでLB作成してしまいがち。VPC間違えるとECSとつなぎこむ時に作り直しで時間ロスします。

![](https://i.imgur.com/aKPXEwT.png)

![](https://i.imgur.com/qbo4Ez9.png)

発見。ターゲットグループを構築するときは、IPアドレスをとBeRegisteredにしておける。
![](https://i.imgur.com/wfNvkqC.png)


# 2. ECSのサービスの構築
こういうちょっとしたテストの時に便利なnginx。  
注意点として、デプロイ先のSubnetがOutboundの通信を許可している（Dockerイメージを引っ張れる）必要がある。  
（私はここでNat Gatewayをprivate subnetに置いていることに気がつくこともしばしば...）


ポイント:
* 実はサブネットの指定は1つでもOK
* NLB/ALBを採用する場合はサービスディスカバリはONにしなくてOK
![](https://i.imgur.com/XlXxGRF.png)

ポイント: TaskがいつまでたってもPENDINGに見えるときは、Stoppedのタスクを開いて原因調査すべし。  
* よく目にするエラー: `CannotPullContainerError: API error (500): Get https://111122223333.dkr.ecr.us-east-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection"`
![](https://i.imgur.com/vfUC8yk.png)


ポイント: この時点でTargetGroupのヘルスチェック結果を確認すること。  
よく目にするエラー: `None of these Availability Zones contains a healthy target. Requests are being routed to all targets.`
対応: 
* まずリクエストが到達しているか？（ECSのサービス起動時に指定したセキュリティグループを確認）
* ECS側はサービスが起動しているか？(CloudWatchのログを確認する)
* TargetGroupのヘルスチェックで指定されているポートはコンテナにマッピングされているか？サービスの利用しているポートはあっているか？
![](https://i.imgur.com/A8tnQPy.png)


# 3. API Gatewayの構築
ポイント: VPCリンクを作成する。ログインしているユーザーに複数の権限が必要（VPCエンドポイントの作成更新削除・アクセス許可の変更）
体感で5分以上かかります。
![](https://i.imgur.com/YzTR36R.png)


ポイント：APIメソッドには統合タイプと接続タイプの2種類の概念がある。
しかし、コンソールだと本当に分かりづらい....
![](https://i.imgur.com/EX9njJ8.png)

デプロイをすれば完成です！


# 参考資料
[API Gateway のプライベート統合のNetwork Load Balancerを設定する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-nlb-for-vpclink-using-console.html)

[API Gateway プライベート統合で API をビルドする](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started-with-private-integration.html)
AWS Batch で大量の PENDING などの job を terminate する方法

```
AWS_PROFILE=HOGE aws batch list-jobs --job-queue HOGE_QUEUE --job-status PENDING|jq -c .jobSummaryList[].jobId
```

から、

```
AWS_PROFILE=HOGE aws batch terminate-job --job-id XXX --reason hoge
```


RUNNABLE な場合は cancel-job 

あといちばん古い登録日の job からやると良さそう。
CSSの基本概念からHPをほぼ完成させる方法まで！



#CSSの基本概念

基本的に「どこの、何を、どうするのか」という形で書いていきます。
またその際に：と；でコードを閉めていくことを忘れないようにします。

#文字の設定方法

`font-size:20px;`文字の大きさを変更できます。
`font-family:~~~~;`文字の種類を変更できます。
`font-color`　文字の色を変更できます。
`width:10px`
`height:10px` 縦横幅を調節できます。また、この技術は画像にも適応できます。
Widthが横、heightが縦の長さとして設定されます。

#背景色の設定方法

`background-color:#~~~;`
で設定可能です。

#クラスとタグの使い分け
`li{color:~~;}`
`.selected{color:~~;}`

この場合、HTML上でクラス分けをする必要があります。
具体的には
`<li class=”selected”>~~~</li>`
として、このリストタグがクラス指定されていることを明確にしてあげます。

クラスの場合は前にドットを付ける、タグの場合はそのままで大丈夫と
覚えます。

#ひな形を完成させる
基本覚えなくても良いそうですが、一からHPを作る際には
以下のコードを添付するとよさそうです。

`<!DOCTYPE html>`
`<html>`
` <head>`
  
    <!--文字コードを「utf-8」にしてください-->
    <meta charset="utf-8">
    
    <!--タイトルを「Progate」にしてください-->
    <title>Progate</title>
    
    <!--「stylesheet.css」を読み込んでください-->
    <link rel="stylesheet" href="stylesheet.css">
 ` </head>`
  `<body>`
  `</body>`
`</html>`

今回はProgateのものを引用させていただきました！

#ヘッダーとメインとフッターを作成する
Bodyの中をいじっていきます。

まずは、HTML上にて
どこがヘッダーなのかということをお知らせしていきます。

設定方法は、
`<div class="header">   </div>`です。
これを main とか footer といった具合でクラス分けしていけば良いです。
復習を兼ねると、これを「クラス」と言います。
なので、ヘッダーをCSSでいじる場合には、
.header{}とすれば良いです。初めにドットを入れることを忘れずに！
.main{}
.footer{}
の手順でCSSをどんどんいじっていきましょう！
まず初めに、背景色の設定とそれぞれの範囲の大きさをピクセルで決めると良いですね。

#divをさらに分解しよう

`<div class=”header”>`
を例にもっと分解していきます。
この枠内に、
`<div class=”header logo”>★</div>`
でヘッダーのロゴを挿入し、
`<div class=”header list”>★★★</div>`
でヘッダーのリストを追加していきます。

次にCSSへ移って、リストを編集するのですが、
`li{
List-style:none;
}`
にすると、リストの先頭に黒点がつかなくなるのでオススメです。

#横並びにする方法
文字を横並びにするにはCSSを使っていきます。
`list{
Float:left;
`
という感じで書いていきましょう。

#CSSを用いてクラスの大きさを変更する方法
`li{
padding:40px;
}`
のようにしていく。
ちなみに全方向別にしたい場合には、
Padding-top, padding-right, padding-bottom, padding-left
を使用します。
Padding:★　★　★　★;
と一気に記述してもOKで、その場合topから順に時計周りで表示されます。


#header-listとfooter-listに同じ操作が反映されてしまうことを防止する方法
`li{
Padding~~
}`

などとしていると、headerとfooterｍの両方に反映されてしまうことを防ぐには、
`.header-list li{
Padding~~~~
}`
といった方法を使います。

#1文字だけ色を変えたい場合
`<h1>★★<span>☆</span>★★</h1>`
のようにHTMLで表記することが可能です。

#ボーダーの付け方
ボーダーを付ける際には、CSSにて
`.logo1{
Border:10px solid red
}`
のように行います。
記号について説明すると、左から大きさ、棒の種類、色です。

Borderとだけ記述すると、logo1の周りを取り囲む形で設定されてしまうので、
左だけが良いとか、アンダーバーだけ欲しいという場合には
Border-topなどと方向を記述します。

#補足　divの使い方
`<h3 class="section-title">学べるレッスン</h3>`
で、h3であることを言明してあげてください。

#margin:; と　padding:;　を使い分けよう
前者が外枠、後者が内枠です。

#フォーム作成方法
`<input>`を書くと一行の欄が作成されます。
なんのための記述欄なのか明確にするために、
`<p>氏名</p>
<input>`
などとします。

また、複数行書きたいときには
`<textarea>～～～</taxtarea>`を使います。
こちらは文章になるので最後に終了タグが必要です。
また、なんのための枠なのか明確にするために`<p></p>`を使って
用途を書くと良いです。

ちなみに、`<input type=”submit”>`とすると「送信」ができます。
`<input type=”submit” value=”保存”>`とすると「保存」にできます。
これをvalueを属性といい、valueに入る値は表示させたいものであれば
なんでもOKです。
コードに落とし込めば哲学もわかりやすくなるだろ、という試み

続編: [コードに落としこんで 哲学やろうぜ その２ ～海賊王になる方法～](https://qiita.com/41semicolon/items/f11b281565b45fec966a)

# 本稿での試み

近年の哲学の潮流は「分析哲学」と呼ばれるもの。明晰な論証を特徴としているが、日常言語（つまり日本語とか英語）であるので、なんか言いくるめられてしまうように感じる。

そこで、一意に解釈可能なプログラミング言語で実装してみて、言わんとしていることを確かめる＝**納得する** という試みをしてもよいのではないか？と考えた。

もちろん、納得する手段はプログラミング言語でなくてもよい。数式によるモデリングや、記号論理の論理式での検証でもよい。ここはQiitaなのでプログラミングで確かめようということ。

本稿では、手始めに、何かと批判の多い「意味の心理主義」についてコーディングしてみようと思う。

# 意味の心理主義
**概要**: 「アセロラの実は赤い」などの**言葉の意味**は、「あなたの心に浮かんだそのイメージ」であるよ、という説。言葉の意味がその人の心への表れであり、人によって言葉の意味が異なりうるという意味で、私秘的であるとも言われる。

**歴史的経緯と現在での評価**: わかりやすい説なんだけど、分析哲学者からはボコボコに批判されつづけており、サンドバックとしてひきあいにだされることが多い。

**興味深いトピック**: 言葉の意味が私秘的であったとしても、私たちは「アセロラの実は赤い」という言葉で意思疎通（のようなもの）ができる。これは中々興味深いことである。アセロラの実や自分の血液を見て「（僕にとって）緑色だ」としか言いようがないイメージをもつ人であるミドリさんがいたとしても、僕は彼女と「アセロラの実は赤い」という言明に対して、見解の一致を見る。もっというと、ミドリさんと僕の言葉の意味＝イメージが一致しているかどうかを確かめることさえできない。色盲のテストを行ったとしても、彼女と僕は同じ結果を得るだろう。

# コーディング
前節の「興味深いトピック」をコードに落とし込んで見る。

**「赤」のイメージ**: 僕が「赤」という言葉を見たり聞いたりした際に心に浮かぶイメージに名前をつけよう。コードに落とし込むのだから、計算機で表現できる形がよいので、`237` という整数値をあてよう。ミドリさんが「赤」という言葉を見たり聞いたりした際に心に浮かぶイメージには `114` という整数値をあてよう。実際には、イメージは整数値ではなく、心のどこかに結ばれる像である。それらの識別子として整数を選んだということ。別に文字列でもよいし、浮動小数点でもよい。

```js
const IMAGE_X = 237; // 「赤」によって結ばれる私の心でのイメージ
const IMAGE_Y = 114; // 「赤」によって結ばれるミドリの心でのイメージ
```

**「赤」の経験**: 熟れたリンゴを見たり、うっかりして怪我をした時にできた傷口から見える血液を見たり、虹や分光器を使って太陽光線のスペクトル分解を行ったりする。この体験で僕には `237`、ミドリさんには `114` という心の像が結ばれる。これを言葉にするために他人の言語使用を観察し、`237`には「赤」という言葉があてられることを学ぶ（僕が米国人であれば red という言葉をあてると学んだだろう）。つまり「赤」の意味とは237のことなのだ、となる。

```js
// 僕はリンゴや血液、アセロラをみると 237 が思い浮かぶ
function xImageOf(target) {
  if (['apple', 'blood', 'acelora'].includes(target)) {
    return IMAGE_X;
  } else {
    return null;
  }
}

// 僕は、237 を心に結ぶものを赤と呼ぶ
function isRedX (target) {
   return IMAGE_X === xImageOf(target);
}

// ミドリさんはリンゴや血液、アセロラをみると 114 が思い浮かぶ
function yImageOf(target) {
  if (['apple', 'blood', 'acelora'].includes(target)) {
    return IMAGE_Y;
  } else {
    return null;
  }
}

// ミドリさんは、114を心に結ぶものを赤と呼ぶ
function isRedY (target) {
   return IMAGE_Y === yImageOf(target);
}
```

**見解の一致**: 僕はミドリさんに言う。「アセロラの実は赤いよね」。ミドリさんは答える。「そうだね。赤いね。」僕はさらに続ける。「リンゴとアセロラの実は同じ色だよね」。ミドリさん「そうだね。同じ色だね」。僕は確信をもって続ける「赤っていうのは光子の持つ物理的な状態を表し、その周波数が X ～ Y Hz であることを指すんだよね。」ミドリさんはいう「そう定義してくれても構わないよ」。僕はミドリさんに自信をもってこういう「僕らは 赤 という言葉で同じ意味を共有しているね」ミドリさんはいう「そうだといいけどね」


```js
// 赤についての言明は完全に一致する
assert(isRedX('acelora') && isRedY('acelora')); // -> OK
assert(['acelora', 'apple'].every(isRedX) && ['acelora', 'apple'].every(isRedY));
// けれども、赤の意味＝イメージ は一致しない
assert(IMAGE_X !== IMAGE_Y);
```

# その後の展開
分析哲学者の多くは「意味が私秘的である」ことを批判する。彼らは、意味の存在場所がそれぞれの人の心であることに我慢がならないようだ。曰く「意味の存在場所は心ではない。意味とはもっと公共的・客観的なものなのだ」と。具体的にどのような説であるかは、次回（があれば）コードに落としてみよう

# 参考
『分析哲学講義』青山拓央 ちくま新書 講義2
[Unity]ネットワークドライブ(NAS等)にアクセスする恐らく一番単純なコード

# 発端
ネットワーク、外部リソース回りは`WWW`クラスを利用してアクセスするのが一般的だが、もっと手軽に最小限のコードがあるのではないかと思って調べた

#結論
```
string path= @"\\NASDrive\root/hoge";
System.IO.Directory.CreateDirectory(path)
```
これで `\\NASDrive\root` ディレクトリに `hoge` というディレクトリの作成ができた。
`Directory.GetFiles(path)` で `hoge` 内のファイルのパスを取得可能なので、後は画像データを読んだりテキストを読み書きしたりとご自由に。

### 注意
`\\NASDrive`をIPアドレスに変更してのアクセスは上手くいかなかった。
NG) `@"\\192.168.XX.XX\root\～"`

#補足
stringに`@`を加えるとエスケープ文字`(\)`が不要になる。地味に便利。

`string path= @"\\NASDrive\root\hoge";`
イコール
`string path= "\\\\NASDrive\\root\\hoge";`
Index Lifecycle Management(ILM) - その2


# はじめに

[Index Lifecycle Management(ILM)](https://qiita.com/tak7iji/items/6f4df5eeb6c16d8bc987)の補足記事です。

# Beatsでの対応

Beatsでは、[Elasticsearch Output](https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html#ilm-es)に設定を追加してあげると、ILMのポリシーをElasticsearchに送り込むことができます。

## 設定方法

[このへん](https://www.elastic.co/guide/en/beats/filebeat/current/ilm.html)に書いてあるのでやってみます。

```yaml:filebeat.yml
output.elasticsearch:
  hosts: ["localhost"]
  ilm.enabled: true
  ilm.pattern: "{now/d}-000001" 
```

簡単ですね。

`ilm.pattern`の値を`{now{YYYY.MM.dd|Asia/Tokyo}}-000001`な感じに書くこともできます。これだと、Rollover時に`Asia/Tokyo`の時間をつけてくれます。
＃でも、`+09:00`ってかけないんですよねぇ。[Date Math](https://www.elastic.co/guide/en/elasticsearch/reference/current/date-math-index-names.html)だと書けるのに。

## ポリシーのロード

```sh
# filebeat setup --ilm-policy
Loaded Index Lifecycle Management (ILM) policy
```

では、ILM UIを見てみましょう。

![ILM_UI_1.png](https://qiita-image-store.s3.amazonaws.com/0/221612/54dc683b-fe86-6b43-b976-79d92fa44c21.png)

「beats default policy」という名前で登録されているのがわかります。
＃画面は6.7のものですが、気にしないことにします。⇒6.7.0は、また色が戻るみたいです。

## データの投入の準備

準備として、テンプレートを登録します。

```yaml:filebeat.yml
setup.template:
  enabled: true
```

が設定ファイルにあることを確認してから。

```sh
# filebeat setup --temlate
Loaded index template
```

確認してみます。

```json
GET _template/filebeat-6.6.0
```

```json
{
   "filebeat-6.6.0" : {
     "order" : 1,
     "index_patterns" : [
       "filebeat-6.6.0-*"
     ],
     "settings" : {
       "index" : {
         "lifecycle" : {
           "name" : "beats-default-policy",
           "rollover_alias" : "filebeat-6.6.0"
         },
(省略）
```

ちゃんとILMの設定が入ってますね。

## データの投入

filebeatを起動してデータを投入してみます。

## 投入状況の確認

ILMのUIを見てみます。

![ILM_UI_2.png](https://qiita-image-store.s3.amazonaws.com/0/221612/3d28369e-b190-d8ad-9c17-6bef0fc2f52e.png)

Linked indicesが1になってますね。
では、Index Managent UIを見てみます。filebeat-*の詳細を見てみると、ちゃんと適用されているのがわかります。

![IM_1.png](https://qiita-image-store.s3.amazonaws.com/0/221612/bb623639-e0c4-b1b6-28bd-859efe37ae4d.png)

# おわりに

ちゃんと連動できてますね。すばらしい！
自前のIndex名にした場合については今回はやってませんが、[ドキュメント](https://www.elastic.co/guide/en/beats/filebeat/current/ilm.html#_advanced_ilm_settings)には書いてあります。

Logstashも[対応している](https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-ilm)ので、そのうちに試してみましょう。
[Golang]catコマンドもどきをGo言語で作成してみた。

# 目次
1.はじめに
 1.1. 使用上の注意
2. 実行環境
 2.1 解凍した際のファイル構造
 2.2 mycat.goの中身
 2.3 コマンドのコンパイル方法
 2.4 コマンド実行方法
3. コマンドを作成してみて
 3.1 工夫した点
 3.2 もっと工夫できた点

# 1. はじめに
Go言語を最近学び始めたので、`cat`コマンドもどきをGoで作成して見ようと思う。

このプログラム、`mycat`は引数に与えられたテキストファイル名のパスを取得し、
そのファイル内の文章を一行ずつ標準出力に出力するコマンドである。
オプション`-n`を指定することで行頭に通し番号を付与することも可能である。

## 1.1 使用上の注意
実行ファイル内にテキストファイルが存在している前提でプログラムを作成しているため、
mycat.exeが存在するディレクトリ内のテキストファイル名しか対応していない。

# 2. 実行環境

## 2.1 解凍した際のファイル構造
mycatをクリックすると(GitHubに飛びます)
[mycat](https://github.com/TsubasaSato/mycat)/
 ├mycat.go
 ├test_1.txt
 ├test_2.txt
 └README.md

## 2.2 mycat.goの中身
```go
package main

import (
	"bufio"
	"flag"
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	var n =flag.Bool("n",false,"通し番号を付与する")
	flag.Parse()
	var(
		files = flag.Args()
		path,err = os.Executable()
	)
	if err!=nil{
		fmt.Fprintln(os.Stderr,"読み込みに失敗しました",err)
	}

	//実行ファイルのディレクトリ名を取得
	path=filepath.Dir(path)
	//通し番号の用意
	i:=1

	for x:=0;x<len(files);x++{
		sf,err:=os.Open(filepath.Join(path,files[x]))
		if err!=nil{
			fmt.Fprintln(os.Stderr,"読み込みに失敗しました",err)
		}else{
			scanner :=bufio.NewScanner(sf)
			for ;scanner.Scan();i++{
				if *n{
					//オプションがある場合
					fmt.Printf("%v: ",i)
				}
				fmt.Println(scanner.Text())
			}
		}
	}
}
```

## 2.3 コマンドのコンパイル方法

`$go build mycat.go`

## 2.4 コマンド実行方法

`$mycat [オプション] [ファイル名]...`

使用できるオプション
`-n` : 行頭に通し番号を付与することができる

# 3. コマンドを作成してみて
## 3.1 工夫した点
- エラー処理を実装した点である。実行ファイルのパス、テキストファイルのパスを取得できなかった際はエラー出力を出すようにした。
実在しないファイル名を指定された場合も正しくエラー処理される。
- 引数に指定されるテキストファイルの数はいくつでも指定できる。

## 3.2 もっと工夫できた点
今回はBool型のオプションしか実装しなかったが、

- flag.String()
- flag.Int()

を用いることで、数や文字列を指定するオプションも作成できた。
FirebaseUIのログインボタンだけ使いたい

FirebaseUIにはFirebaseにログインするために、以下のような素晴らしいActivityを起動する方法があります。

<img width="300px" src="https://qiita-image-store.s3.amazonaws.com/0/18273/0b23613f-4527-0a60-3769-fc517c194675.png">

しかしこの画面カスタマイズできることが限られているので、独自Activityを作ることが多いです。
ただ独自Activityの中でも、このログインボタンだけは使いたいなと思うのはまぁ自然な発想。

Androidの場合レイアウトを以下のように記述することでログインボタンだけ使うことができます。

```xml
    <include
        layout="@layout/fui_idp_button_google"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
```

末尾のプロバイダ部分を変えれば、それぞれのプロバイダのログインボタンを表示することができます。

### 参考
https://firebase.google.com/docs/auth/android/firebaseui?hl=ja
cargo と rust-toolchain で install がうまくない話

# TL;DR

- `rust-toolchain` を設定していると `cargo install hoge` で使うツールチェインも選んでしまう
- `rust-toolchain` を無視したい場合には `cargo +stable install hoge` でいける

## 現象:手元で `diesel_cli` のインストールに失敗した

`rust` には `cargo` というビルドをしてくれたり、rust 製のツールをインストールしてくれたりするツールが標準で備わっている。
これを使って `diesel_cli` を再インストールしようとしたらコケた。

```shell-session
$ cargo install diesel_cli --force
    Updating crates.io index
  Installing diesel_cli v1.4.0
error: failed to compile `diesel_cli v1.4.0`, intermediate artifacts can be found at `/tmp/cargo-installmyVFdj`

Caused by:
  unable to get packages from source

Caused by:
  failed to parse manifest at `/home/kazuk/.cargo/registry/src/github.com-1ecc6299db9ec823/diesel-1.4.1/Cargo.toml`

Caused by:
  feature `rename-dependency` is required

this Cargo does not support nightly features, but if you
switch to nightly channel you can add
`cargo-features = ["rename-dependency"]` to enable this feature
```

心の声 「おいおい diesel さんいくらなんでも出たばっかりの 1.32.0 でコンパイル失敗するというか nightly 使えとかやんちゃすぎ」

## issue を眺める

きっと issue 上がってるやろと github 見に行って検索すると…ほらあった。盛り上がってるやろーと眺めると

https://github.com/diesel-rs/diesel/issues/1963

close されてますし、閑散としてます。

はて？

ふむふむ、1.31.0 で入ってる機能だから問題ない、まちがってない。
ふむふむ、debian がいかれたバージョニングしてて 0.31 に 1.30 が入ってて 0.32 に 1.31 が入ってる、それでおかしかったみたいだと。へー

おれ 1.32.0 いれてるから関係ないしとか思いながら色々試す。

## 普通に `~/` でやったら入ったし

シェルもう一個起こして cargo install 叩くと入るし！

```
$ cargo install diesel_cli --force
    Updating crates.io index
  Installing diesel_cli v1.4.0
   Compiling void v1.0.2
   Compiling semver-parser v0.7.0
   Compiling proc-macro2 v0.4.27
   Compiling cc v1.0.29
(ry)
   Compiling diesel_cli v1.4.0
    Finished release [optimized] target(s) in 1m 39s
   Replacing /home/kazuk/.cargo/bin/diesel
```

ここで `rust-toolchain` を指定してた事を思い出す。（プロジェクトで使うコンパイラのバージョン指定）

元シェルで `rust-toolchain` 見ると、ですよね、そうですよね。

```shell-session
$ cat rust-toolchain 
1.30.1
```

`~/.cargo/bin` 配下に入れる物のコンパイルに `rust-toolchain` 見るなよー、って怒りがふつふつと。

```shell-session
$ cargo --version
cargo 1.30.0 (a1a4ad372 2018-11-02)
```

あぁ、これ仕様だわ、サブコマンド解釈する前に `rust-toolchain` 読んでるんだもんね。

## 困るだろ？ 大丈夫 `+stable` すれば良いんよ

`cargo` では `+stable` とすれば stable なツールチェインを使う(同様に `+nightly` なら nightly)事ができるので、この場合 `cargo +stable install diesel_cli` と叩けばマシンにインストールされた現状の stable でコンパイルインストールしてもらえるって事。

## まとめ

- diesel も cargo もバグってなかった
- `cargo install` とかユーザーの home に入れる物のコンパイルに `rust-toolchain` が関係するのうっかり忘れがち
- `+stable` で入るよ
【初心者】PHPで練習用にECサイトを作成していて得たちょっとした豆知識

こんにちは。
こんにちは。
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@hotoke6です。

現在練習用にPHPでECサイトを自作しているのですが、そこで得たちょっとした豆知識をランダムに2つだけまとめます。
「もう知ってるわ」という方はスルーしていただけると助かります。

##値段を打つ時、3桁ごとにコンマを入れる方法
ECサイトに値段を表示する際、商品の値段はDBから取得していました。
DBには「3000」といったように数字のみを入力するため「¥3,000-」のような3桁ごとに打たれるコンマを表示することができませんでした。

そんな時発見したのが**number_format()**という関数です。
3桁ごとにコンマを打ちたい時に、その値をnumber_format()で囲めば自動的にコンマが打たれます。
**例**

```php
<?php
$num = 12800;
echo number_format($num);
?>

//出力 12,800
```


##個人情報入力における自動入力
最近何かのサイト上個人情報を入力する際、iPhoneなら予測変換の場所、Macなら入力欄をクリックした状態でもう一度クリックするとその項目に合わせた情報が自動入力できることがあります。
その方法を探していた時に見つけたのが**autocomplete**という属性です。
inputタグの中にautocomplete属性を設定し、それぞれ必要な値を指定すれば自動入力ができるようになります。
**例**

```html
<input type="text" autocomplete="name">
```

代表的な値はこんな感じ。

name=姓名
family-name=姓
given-name=名
username=ユーザー名
email=メールアドレス
tel=電話番号
current-password=既成のパスワード
country-name=国名
postal-code=郵便番号
address-level1 : 都道府県
address-level2 : 市区町村
address-line1 : 番地・マンション名（1行目）
address-line2 : 番地・マンション名（2行目）
organization : 会社名

まだまだありますので気になる方は[ここから](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete)見てみてください。
2019年参加予定の国内技術系カンファレンス (updated 2019.9.19)

2019年チームのメンバーが参加する予定の大型の技術系カンファレンスをまとめました。Python、クラウドサービス、DevOpsにフォーカスしています。

### [DeveloperSummit 2019](https://event.shoeisha.jp/devsumi/20190214/)
- 日時	2019年2月14日(木) - 15日(金)
- 会場	ホテル雅叙園東京
- 参加費  無料
- [https://event.shoeisha.jp/devsumi/20190214/](https://event.shoeisha.jp/devsumi/20190214/)

### [DevOpsTokyo 2019](https://www.devopsdaystokyo.org/)
- 日時 2019年4月9日(火) - 10(水)
- 会場 大崎ブライトコアホール(東京都品川区北品川5-5-15)
- 参加費 ¥15,899 – ¥21,198
- [https://www.devopsdaystokyo.org/](https://www.devopsdaystokyo.org/)

### [明日の開発カンファレンス 2019](https://asucon2019.peatix.com/)
- 日時 2019年4月24日(水)
- 会場 大田区産業プラザPiO
- 参加費 ¥1,000 – ¥5,000
- [https://asucon2019.peatix.com/](https://asucon2019.peatix.com/)

### [AWS Summit Tokyo 2019](https://www.awssummit.tokyo/)
- 日時 2019.6.12(水) - 14(金)
- 会場 幕張メッセ
- 参加費 無料
- [https://www.awssummit.tokyo/](https://www.awssummit.tokyo/)
- [※去年参加した弊社社員の参加レポート](https://www.facebook.com/QualitiaCo/posts/421976698281913)

### [CloudNativeDays Tokyo 2019](https://cloudnativedays.jp/)
- 日時 2019年7月22日(月) - 23(日)(火)
- 会場 虎ノ門ヒルズフォーラム
- 参加費 4320円(早割)から～
- [https://cloudnativedays.jp/](https://cloudnativedays.jp/)

### [builderscon tokyo 2019](http://2019.tokyo.builderscon.io/)
- 日時 2019年8月29日(木) - 31日(土)
- 会場 東京電機大学 東京千住キャンパス Building No.1
- 参加費 7500円
- [https://builderscon.io/tokyo/2019](https://builderscon.io/tokyo/2019)

### [Python Conference Japan 2019](https://www.pycon.jp/)
- 日時 2019年9月16日(月)-17日(火)
- 会場 太田区産業プラザーPIO
- 参加費 15000円
- [https://www.pycon.jp/](https://www.pycon.jp/)
-  [※去年参加した弊社社員の参加レポート](http://www.facebook.com/370457470100503/posts/479229532556629/)

### [JPAAWG 2nd General Meeting](https://meetings.jpaawg.org/)
- 日時 2019年11月14(木)-15(金)
- 会場 ベルサール飯田橋
- 参加費 無料(トレーニングセッションは5000円）
- [https://meetings.jpaawg.org/](https://meetings.jpaawg.org/)

### [ACML 2019 (The 11th Asian Conference on Machine Learning)](http://www.acml-conf.org/2019/)
- 日時 2019年11月17(日)-19(火)
- 会場 WINC AICHI, Nagoya, Japan
- 参加費 50000円から
- [http://www.acml-conf.org/2019/](http://www.acml-conf.org/2019/)
【Java】ジェネリクスを使って実装してみる

ジェネリクスを使ったいくつかの実装のメモです。

# Class\<T\>を受け取ってジェネリクス\<T\>を持つオブジェクトを返す　
ジェネリクスを指定するものを普通に宣言してしまうと冗長になりやすいので、こういったオブジェクトを何度も生成する場合はUtilクラスへ生成関数を作った方がいいかなと思ってます。

```java:実装例
// クラスに対応するListを返す関数
<T> List<T> generateList(Class<T> clazz) {
    return new ArrayList<>();
}

// クラスに対応するBeanPropertyRowMapperを返す関数
<T> BeanPropertyRowMapper<T> getBeanPropertyRowMapper(Class<T> clazz) {
    return new BeanPropertyRowMapper<>(clazz);
}
```

```java:利用例
// こう書くと冗長
new BeanPropertyRowMapper<Something>(Something.class);

// こう書いた方が読みやすい
Util.getBeanPropertyRowMapper(Something.class);
```

# 型はどうでもいい時に警告/エラーを出さないように書く
「ジェネリクスを取る型を用いるが、中身の型は関係ない」ような場合、単純に型を省略して書くと警告が出ます。

```java:警告が出る例
// ハッシュセットを用いた重複チェック
boolean checkForDuplicate(List list) {
    return list.size() == new HashSet(list).size();
}
```

このような場合、`<?>`とダイヤモンド演算子で警告が出ないように書けます。

```java:実装例
// ハッシュセットを用いた重複チェック
boolean checkForDuplicate(List<?> list) {
    return list.size() == new HashSet<>(list).size();
}
```

`<T>`で指定することでも書けますが、ちょっと冗長になります。

```java:冗長な実装例
// ハッシュセットを用いた重複チェック
<T> boolean checkForDuplicate(List<T> list) {
    return list.size() == new HashSet<>(list).size();
}
```

## Streamを使う場合
`List`を引数にとって`Stream`処理を行う場合も`<?>`を書かなければコンパイルが通らなかったりします。

```java:コンパイルが通らない例
BeanPropertySqlParameterSource[] makeParamArray(List entities) {
    return entities.stream()
            .map(BeanPropertySqlParameterSource::new)
            .toArray(BeanPropertySqlParameterSource[]::new);
}
```

```java:コンパイルが通る例
BeanPropertySqlParameterSource[] makeParamArray(List<?> entities) {
    return entities.stream()
            .map(BeanPropertySqlParameterSource::new)
            .toArray(BeanPropertySqlParameterSource[]::new);
}
```
JPAの「Repeated column in mapping for entity」エラー

```
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: jp.co.XXX.entity.Case column: contact__herokurecordid__c (should be mapped with insert="false" update="false")
```

とのエラーになったら以下のように`@JoinColumn`に`insertable = false, updatable = false`を書く

```
    @Column(name = "contact__herokurecordid__c", length = 255)
    private String contactHerokuRecordId;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "contact__herokurecordid__c", referencedColumnName = "herokurecordid__c", insertable = false, updatable = false)
    @Setter(AccessLevel.NONE)
    private Contact contact;

    public String getContactLastName() {
        if (contact != null) {
            return contact.getLastName();
        }
        return null;
    }
```
font-sizeを0にすると画像のaltが表示されない件

#HTMLメールのテンプレート制作にて

とある **HTMLメール** 制作での出来事。

> 画像表示されてない時にaltがなかったのでどうしていいか分かりませんでした（なんでalt入れてないん？）

という指摘が。

いやいや、そんなバカな。ちゃんと入ってますがなｗ　確認してみてください。

としたり顔で返答。

:hourglass::hourglass_flowing_sand::hourglass::hourglass_flowing_sand::hourglass::hourglass_flowing_sand::hourglass::hourglass_flowing_sand::hourglass::hourglass_flowing_sand::hourglass::hourglass_flowing_sand::hourglass::hourglass_flowing_sand:

そしてしばらくたらい回しにされたaltちゃんに対して・・・

> font-size:0 としてしまっているため、altが表示されないんじゃない？

バ・バカな！！フォントサイズってalt関係あるんですかぁ？？？？？

再確認すると画像を囲っている親tdタグに `font-size:0;` が。

んなバカなぁ・・・とか半信半疑になりつつもFireFoxで画像表示offにして確認。

| 画像表示off（ `font-size:0;` ） |
|:------------------:|
| ![alt00.png](https://qiita-image-store.s3.amazonaws.com/0/269200/943b8726-b778-770b-f3c0-0bcd7c89a1aa.png)|

うーむ、確かに消えて（見えない）いる。
じゃ、`font-size:0;` 消してみよう。

| 画像表示off（ `font-size:0;`削除 ） |
|:------------------:|
| ![alt01.png](https://qiita-image-store.s3.amazonaws.com/0/269200/de01fa67-2c3d-2482-240a-01c025ead577.png)|

.....表示されとる！！！！！！！

すいませんでしたぁああああああああ！:bow_tone1::bow_tone1::bow_tone1:
初歩的な確認怠ってましたぁああああああ！！！！！！:bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1:

####補足
- `font-size:0;` を入れていた理由：tdなど調整の際に、何もしないと10pxの高さが出てしまう、などの状態を防ぐためでした。
- webページとしてのaltは、単なる代替テキストでは無い場合がありますので、役割等にご注意ください。

----------------------------
今更っていう感じで盲点でした！（恥ずかしい！