OmniAICreator/Qiita-1.07M huggingface dataset:
Firefoxで画像の表示（読み込み）を止めて通信量を節約する

## はじめに

外出先でテザリングからインターネットに接続してブラウジングしてたらいつの間にか通信制限に引っかかっちゃってたってことよくありますよね。

どうにか通信量を抑えられないかと考えた時にブラウザ側で画像の読み込みをオフにすればそれなりに節約できるのではないかと思いました。

画像の読み込みをオフにする設定がFirefoxで提供されていたので本記事で紹介したいと思います。

## やり方

* アドレスバーに `about:config` と入力しEnter
  * 警告が表示されるので警戒しながら次に進みます
* 検索バーに `permissions.default.image` と入力しEnter
* 表示された `permissions.default.image` をダブルクリック
* ここで値を `2` に変更します
  * `1` - すべての画像を読み込む（デフォルト）
  * `2` - すべての画像を読み込まない
  * `3` - サードパーティの画像を読み込まない

以上です。

適当なWebページを開いて画像が表示されなくなれば成功です。

## さいごに

今回はFirefoxで画像の表示（読み込み）をさせない方法を紹介しました。これで通信量の大幅な削減が期待できるのではないでしょうか。実際ページがさくさく読み込まれるしユーザー体験もなかなかいいですよ。

本記事ではFirefoxでの紹介ですが、Chromeでもやれるみたいです。

## 参考

* Permissions.default.image - MozillaZine
  * http://kb.mozillazine.org/Permissions.default.image
【未経験・初心者エンジニア向け】個人的、客先常駐で生き抜くためのマインド

#はじめに
自分は、現在スタートアップで自社プロダクトの開発を行ってます。
しかし、今の会社に転職するまでは新卒の頃からずっと客先に常駐して仕事をしていました。
約3年半で5つの現場(プロジェクト)を経験してきました。
そんな自分が客先常駐で働く上で意識していたことや、やっていたことを共有したいと思います。

#対象者
多くのエンジニアは今でもお客さん先に常駐して働くというスタイルを取っていますし、経験が浅い最初は現場で経験をまずは積むといった心がけてエンジニアになる人も多いと思います。
今回はそういったエンジニアにこれからなろうと思ってる人や既に現場で仕事をしてるけどまだ経験が浅いエンジニア向けの記事になります。

#前提
あくまで個人的経験に基づいた内容なので全ての現場に共通する内容ではないです。
一例として見ていただければ幸いです。

#自分が経験したプロジェクト
自分がどのような現場に常駐していたのかをざっくり簡単に書きます。
・自動車メーカーのメータ制御開発(C言語)
・銀行のネットバンキングのWebシステム開発・DBのバッチ対応(C言語、SQL)
・AndroidTVのブラウザ開発(C++)
・Androidのおサイフケータイアプリの開発(Java)
・化学メーカーの容器管理システム開発(PHP)

#生き抜くためのマインド
###①言われたことをまずはきちんとこなしてプロジェクトに必要な人間になる
当たり前のことですが意外とできていない人が多いなぁと今までの現場を経験して思ったのであえて一番最初に書きます。
まずは特別なこととかをする必要はなく言われたことをちゃんとこなせるようにしましょう！
現場に常駐する時は、この気持ちを持つことが一番大事だと自分は思ってます。

###②インプットとアウトプットをはっきりさせる
仕事をこなす上でまず何を実現したいかをはっきりさせます。

例えばAさんは、リーダーに仕様差分の抽出を行って欲しいと仕事を振られたとします。
例えば、インプットとアウトプットは以下とします。

インプット：仕様書
アウトプット：仕様書差分の結果を抽出したExcel

とします。

インプットとアウトプットがはっきりしていれば自ずと必要な情報が見えてくることが多いです。
インプットは、比較元と比較先の仕様書の格納場所を知ること。
アウトプットは、抽出結果のExcelの格納場所を知ること。

###③5分〜15分悩んだら質問する
経験の浅い状態で分からない場合は、だいたいいくら悩んでも解決しないことがほとんどです。
分からないことはちゃんと質問しましょう。
ただ質問の仕方は考える必要があります。
口頭で質問するほどのことでなければチャットなどで質問。
分からないことに対して自分がどこまで理解しててどこが分かればそれを解決するかをなるべく具体的に書いて質問するといいです。
質問すること自体は悪いことではないですが、相手の時間を奪うことにもなるので質問の仕方には気をつけましょう。

###④できる限り質問は口頭ではなくチャットなどで行う
これは個人的に仕事してて感じたことです。
口頭で質問して聞いた内容ってその時は理解してても時間とともに忘れていきます。
もちろんメモするって言うのも一つの案ですが現場のPCがノートPCじゃない場合は手書きになりますし、手書きでのメモは思ってる以上にしんどいです。
もちろんノートPCだったら口頭で聞くとき聞きながらメモ取るのもアリ。
チャットで質問のやり取りをすると後で似たようなところでつまづいた時に過去のログを追えば解決するってケースも結構ありました。
なので個人的にはチャットでの質問をオススメします！


###⑤質問する相手や頼れる人をきちんと見定める(仕事できる人と仕事できない人を見定める)
要領よく仕事するならこれは欠かせないです。
悲しいかな。。。現場によっては仕事できない人も普通にいます。
仕事できない人ってなんとなく一緒のプロジェクトで仕事してたら分かっちゃうものです。
自分も仕事できないって見られてた時代がありますし、プロジェクトに全然貢献できなくて契約切られた経験もあります。
そういった人にリーダーやマネージャーは、仕事をあまり振ってくれません。
リーダーやマネージャーはプロジェクトの成功を第一としています。
なので、どれだけタスク抱えてても優秀な人に仕事を振りますし、仕事できない人には仕事を任せられないと言うのが本音です。
そういった人はだいたい契約切られて終わります。。。

中規模・大規模なプロジェクトだと現場長い人やシステムについてよく知ってる人は必ずいます。
なのでちょっと残酷ですが、現場で頼れる人、この人に聞けば間違いないって人を見つけましょう！

###⑥報告・連絡・相談はこまめに行う
経験が浅いうちやプロジェクト参画したての時は、できる限りホウレンソウはこまめに行いましょう。
もし問題が起きていてもアラートを早めに出すことで問題が大きくなる前に解決することができます。
昔、報告が遅い人がいてリーダーが確認したら依頼してた仕事と認識がずれていて全てやり直しになって他のプロジェクトメンバーも手伝ってなんとか終わらせたといったケースもあります。
ホウレンソウが遅れることで万一問題が発覚した時、他のプロジェクトメンバーにかける被害も大きくなるので注意が必要です！！

###⑦疑問に感じたことははっきりさせよう
これは人に寄ると思うのですが自分は疑問に思ったこと、感じたことははっきりさせないと気が済まないタイプなので書きました。
仕事をしているとふとこれってなんでこういうやり方なんだろうとか疑問に思うことがよくあります。
そういったのを疑問のまま進めていくと思わぬところで間違ってたりすることがあります。
リーダーやマネージャーも完璧ではないので指示が間違ってることも往々にあります。
そう言った時、素直に疑問に思ったことをぶつけてみると良いです！
自分が疑問に思ってたことがきっかけでバグを見つけられたりもっと効率いい方法が見つかったりといい方向に転ぶことも多々あります。
その疑問はプロダクトの品質を良くすることも往々にあります。


#終わりに
正直、少し考えれば分かることとか当たり前に思えるようなことばかりです。
でも思ってる以上にそういった基礎的な部分ができていない人も多いですし、そこができていればもっと評価されるのになぁという人をたくさん見てきました。
だからこそこれからエンジニアになってプロジェクトに参画する人、現在プロジェクトに参画して頑張ってる人に向けて改めてこのような形で発信しようと思いました。

Twitterでも色々発信してるのこちらももし良ければよろしくお願いします🙇‍♂️
[きゅ〜ぶのTwitter](https://twitter.com/cube_3110)
HugoのAcademicテーマでポートフォリオサイトを作った話

## はじめに
初めてのポートフォリオサイトを[Hugo](https://gohugo.io/)の[Academicテーマ](https://sourcethemes.com/academic/)で作ってみました。英語読むのつらいという方の参考になれば幸いです。

私のポートフォリオサイトは[こちら](https://shimech.github.io/)

## 環境
- macOS Catalina 10.15.1
- Homebrew 2.1.15

(Homebrewのインストールは[こちら](https://brew.sh/index_ja))

## 1. Hugoのインストール
CLIで、

```
$ brew install hugo
$ hugo version
Hugo Static Site Generator v0.59.1/extended darwin/amd64 BuildDate: unknown
```

## 2. academic-kickstartリポジトリをfork
[こちら](https://github.com/sourcethemes/academic-kickstart)のgithubリポジトリにアクセスし、右上の「fork」ボタンを押下します。すると、自分のアカウントに `https://github.com/{username}/academic-kickstart` というURLのリポジトリができます。

## 3. forkしたacademic-kickstartリポジトリをcloneし、ビルドしてみる
CLIで、

```
$ git clone https://github.com/{username}/academic-kickstart.git portfolio
$ cd portfolio
$ git submodule update --init --recursive
$ hugo
$ hugo server
```
`http://localhost:1313/` にアクセスすると、現時点でのページが表示されます。

## 4. いろいろアレンジする
基本的に `content/home/` の中のMarkdownファイルを書き換えることでコンテンツの作成が可能です。（Homeだけは、 `content/authors/admin/_index.md` です。）
非表示にしたい項目は、

```content/home/*.md
active = false
```
とします。

### 4.1 テーマ / フォントを設定
```config/_default/params.toml
theme = "{theme_name}"
...
font = "{font_name}"
```
と書き換えることでテーマやフォントを指定できます。指定できるテーマ / フォントは、 `themes/academic/data/{themes or fonts}/` にあります。また、自作したTOMLを `data/{themes or fonts}/` に置くことでカスタマイズすることも可能です。

### 4.2 ナビゲーションバーをカスタマイズ
`config/_default/menus.toml` を編集します。

### 4.3 Skillsのアイコンをカスタマイズ
`skills.md` では、基本的に[Font Awesome](https://fontawesome.com/icons?d=gallery)でアイコンを探して、 `icon = "{icon_name}"` とすることでアイコンを表示できるのですが、Font Awesomeにないアイコンは、 `static/img/` に配置し、

```themes/academic/layouts/partials/widgets/featurette.html
...
<div class="col-12 col-sm-4">
    {{ with .icon }}<div class="featurette-icon"><i class="{{ $pack }} {{ $pack_prefix }}-{{ . }}"></i></div>{{ end }}
    {{ with .icon_path}}<div class="featurette-icon"><img class="fab" src="/img/{{.}}" width=60px></div>{{ end }} 　<!-- この行を追加 -->
    <h3>{{ .name | markdownify | emojify }}</h3>
    {{ with .description }}<p>{{ . | markdownify | emojify }}</p>{{ end }}
</div>
...
```
と書き換え、 `icon_path = "{file_name}"` とするといけます。

## 5. github.ioにデプロイ
githubに `{username}.github.io` という名前のリポジトリを作成します。
その後、CLIで、

```
$ hugo
$ cd public
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/{username}/{username}.github.io.git
$ git push -u origin master
```
とし、 `https://{username}.github.io/` にアクセスすると、ビルドしたページが表示されます。

## 参考ページ
* [Hugoでポートフォリオサイトを作ってみた](https://qiita.com/haruto830/items/e9d715b26849beabc156)

## おわりに
ReactとかAngularとかしっかり勉強して、いつかフルスクラッチでオリジナルのポートフォリオサイトを作ってみたいです。
初心者によるプログラミング学習ログ 153日目

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

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

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

153日目は、

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

## 1. 概要

リモートサーバ(Linuxとか)のGUIをローカル(Mac)に表示しよう。

## 2. Macでの作業

まずMac側の準備を行います。

### 2.1. XQuartzのインストール

Mac用のX Window Systemである[XQuartz](https://www.xquartz.org/)をインストールします。
なお、Lion以前の古いOS(Lion, Snow Leopard, Leopard)には標準でX11が入っているためインストール不要のようです。

[Apple サポート](https://support.apple.com/ja-jp/HT201341)で案内されている通り、 `XQuartz-x.x.xx.dmg`をダウンロードしインストールします。

もしくは以下のようにbrewでもインストールできます。

```sh
$ brew cask install xquartz
```

インストール直後はDISPLAY環境変数は設定されていません。

```sh
$ echo $DISPLAY

$
```

いったんMacからログアウトしてログインすると設定されます。
（左上のリンゴマーク->`xxxをログアウト`からログアウトする)

```sh
$ echo $DISPLAY
/private/tmp/com.apple.launchd.qeR8i7Bf4G/org.macosforge.xquartz:0
$
```

## 3. リモートサーバ(Linuxとか)での作業

次にリモートサーバ側の準備を行います。

### 3.1. sshdの設定

Ubuntuなどのリモートサーバ側のsshdの設定を行います。

以下のように設定しsshdを再起動しておきます。

```sh
$ sudo vim /etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost no
$ sudo systemctl restart sshd
```

## 4. Macからリモートサーバにsshする

準備が整ったところで、GUIを表示させてみましょう。

iterm2などのターミナルでMacからUbuntsなどのリモートサーバにsshでログインします。

ログインしたら`firefox`や`xeyes`など、GUIを持つアプリケーションを起動するコマンドを叩きます。

```sh
# Ubuntuなどのリモートサーバにログイン
$ ssh -XY my-ubuntu

# Ubuntuなどのリモートサーバで
# 何でも良いのでGUIを持つアプリケーションを起動してみる

# 例えばxeyesとか
$ xeyes

# 例えばfirefoxとか
$ firefox
```

Mac側でXQuartzのウィンドウが起動し、GUIが表示されたら成功です。

## 5. 補足

なおMac側で以下のように設定しておくと`-XY`オプションは不要になります。

```sh
$ vim ~/.ssh/config
Host *
    ForwardX11 yes
    ForwardX11Trusted yes
```

上記例のようにHostを `*` とすると、全てのホストに効きますので、効かせたくないホストにも効くことに注意が必要です。

システム全体で共通の設定としたい場合、ユーザーごとに`~/.ssh/`配下で設定を行うのではなく、
`/etc/ssh/ssh_config` の `ForwardX11` や `ForwardX11Trusted` を `yes` に設定する方法もあります。

特定のホストのみに設定したい場合は以下のように記述できます。
影響範囲が狭いほうがいい場合が多いと思うのでこちらがおすすめです。

```sh
$ vim ~/.ssh/config
Host my-ubuntu
    HostName 192.168.1.100
    User loft
    ForwardX11 yes
    ForwardX11Trusted yes
```
docker+jenkinsのジョブである子コンテナにうまいことボリュームをマウントする (DooD)

# やりたいこと
- ローカルをクリーンに保ちたいのでコンテナ内でjenkinsを走らせたい
- jenkinsのジョブとして、コンテナを生成してその中でビルドを走らせたい

要は**Docker outside of Docker**要件です。
丸一日ウンウン唸ってやっと解決できたっぽいので仮投稿。


# まとめ
1. `docker.sock`をコンテナにマウントすると、ホストと同格のdockerコマンドが叩けるようになる
2. `docker-compose`がdocker-compose.ymlを探すときは**コンテナ内を見ている**が、`docker.sock`は**ホストを見ている**ので、(混乱ポイント1)
3. コンテナ内でdocker-compose.ymlのボリュームを相対パス(`./***`のような書き方)で指定すると**無を参照する**(仕様っぽい)
4. マウント対象のディレクトリが存在しないとき、`docker-compose`はエラーを吐かずに**空のディレクトリを生成する**(混乱ポイント2)
5. ホスト側の絶対パスで指定すれば、コンテナ内でもきちんとマウントすることができる
6. `$PWD`とか`$JOB_NAME`(jenkinsの環境変数)を使って、うまいこと動的に絶対パスを生成する
7. HAPPY.....


### 解法



jenkinsコンテナとビルド用コンテナはそれぞれ別のrepoでVCSで管理されている想定です

▼jenkinsコンテナ

```
version: '3'
services:

  jenkins:
    container_name: 'jenkins'
    build:
      context: ./container
      dockerfile: Dockerfile    # jenkins/jenkins:ltsのイメージを使用しています
    ports:
      - '8080:8080'
      - '5000:5000'
    volumes:
      - ./jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - HOST_PWD=$PWD
```

▼ビルド用コンテナ
jenkinsジョブのworkspaceから実行したいほう
docker-compose.yml

```
version: '3'
services:

  work:
    build:
      context: ./server
      dockerfile: container/Dockerfile
    container_name: 'work'
    tty: true
    volumes:
      - /dev/shm:/dev/shm
      # - ./server/:/server/  ↓に書き換え
      - $HOST_PWD/jenkins/jobs/$JOB_NAME/workspace/server/:/server/
```

▼ビルド用コンテナ
ローカルで直接実行するほう
docker-compose-local.yml
実行するときは `docker-compose -f docker-compose-local.yml up -d` でymlファイルを指定すればよい

```
version: '3'
services:

  work:
    build:
      context: ./server
      dockerfile: container/Dockerfile
    container_name: 'work'
    tty: true
    volumes:
      - /dev/shm:/dev/shm
      - ./server/:/server/  # 相対パスのままでよい
```
機械学習を無料で学べるサイトまとめ

# 手を動かす系
## Chainer チュートリアル
https://tutorials.chainer.org/ja/

何から学ぶべきか迷わない人はとりあえずこれやっとけというサイト
日本語表記だし分かりやすいと好評

## メディカルAI専門コース オンライン講義資料
https://japan-medical-ai.github.io/medical-ai-course-materials/#

同じくChainerが公開している。
実際のデータが使えるのが魅力。少し応用向け。

## 東大松尾研究室監修のエンジニア向け教育プログラム「DL4US」
https://weblab.t.u-tokyo.ac.jp/dl4us/

画像分類から自然言語処理、強化学習、GANまで幅広く学べる。
ライブラリはKeras。

# 動画で学ぶ系
## Coursera
https://ledge.ai/ai-study-free-course/
大学のコースを無償でオンライン提供されている。

## Amazon Machine Learning University
https://aws.amazon.com/jp/training/learning-paths/machine-learning/
AWSが無償公開しているコース

## Machine Learning Crash Course
https://developers.google.com/machine-learning/crash-course/
こっちはGoogle
DockerでNginxを動かすまで

#MacにDockerをインストールする

```:ターミナル
$ brew cask install docker
```

以下のコマンドでインストールされたか確認します

```:ターミナル
$ docker --version

Docker version 19.03.4, build 9013bf5
```

# Nginxのイメージをインストールする

```:ターミナル
$ docker pull nginx
```

以下のコマンドでインストールされたイメージの一覧を確認できます。

```:ターミナル
$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              540a289bab6c        2 weeks ago         126MB
hello-world         latest              fce289e99eb9        10 months ago       1.84kB
```

# Nginxを動かしてみる

```:ターミナル
$ docker container run --name webserver -d -p 80:80 nginx
```

以下のコマンドでNginxのサーバーの状態を確認できます

```:ターミナル
$ docker container ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
dd8218b4f671        nginx               "nginx -g 'daemon of…"   27 minutes ago      Up 5 seconds        0.0.0.0:80->80/tcp   webserver
```


# Nginxを起動・停止する

###停止

```:ターミナル
$ docker stop webserver
```

###起動

```:ターミナル
$ docker start webserver
```
新卒エンジニアが２年半どうやって技術を勉強したか？

# はじめに

私は新卒未経験でIT企業に入社して、スマホアプリの開発に携わっています。
今現在、インドネシアでITアドバイザーとして働くにあたって、今までどのように技術を身につけてきたかを
整理したいと思います。

# サマリ

大きく分けて３つの方法があったかなと思います。
1. インプットの習慣
2. アウトプットの習慣
3. 技術書輪読会

## インプットの習慣

習慣の大敵は習慣にするまでの意思が続かないことだと思います。
そこで、やったのは、インプットの自動化です。

### Qiita記事の自動取得

Qiitaの記事で「Swift」のクエリに引っかかるものを自動で毎朝メールが来るようにGASを使用して設定しました。

毎朝メールが来るので、自分から主体的に調べる必要がないのが習慣化できたコツだと思います。

以下にスクリプトを載せておきますね。

```Script:GAS
var target = "swift";
var mailAddress = 'XXX@gmail.com';

function getQiitaItems() {
  // 昨日の日付を「yyyy-mm-dd」の形式で取得
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
  var formattedYesterday = Utilities.formatDate( yesterday, 'Asia/Tokyo', 'yyyy-MM-dd');
  
  // 1ページ10記事の単位で1ページ分取得する（記事作成日でソート）
  var url = "https://qiita.com/api/v2/items?query=" + target + " created:%3E%3D" + formattedYesterday + "&page=1&per_page=10&sort=created";
  
  var urlFetchOption = {
    'method' : 'get',    
    'contentType' : 'application/json; charset=utf-8',
    'muteHttpExceptions' : true
  };
  
  var response = UrlFetchApp.fetch(url, urlFetchOption);
  var response = JSON.parse(response);
  
  var mailBody = "";
  
  // もし取得した記事が一件もなければ何もしない、記事が一件以上あればメールを送る
  if (response.length == 0) {
    return false;
  } else {
  　// 1記事ずつ取得する
    for(var i=0; i<response.length; i++) {
      var title = response[i].title;
      var url = response[i].url;
      var created_at = response[i].created_at;
      var body = response[i].body;
      var mailBody = mailBody + title + "\n" + url + "\n\n"
    }
    return sendMails(mailBody);
  }
}
// メールを送信する関数
function sendMails(mailBody) {
　// メールアドレス、件名、本文の順番で
  MailApp.sendEmail(mailAddress, 'Qiitaくん(' + target + ')', mailBody);
}
```

これをやったことで毎日少なくとも関連記事のタイトルだけでもチェックするようになりました。
気になるタイトルがある日はついついその先まで調べてしまいます。

インプットの一歩目のサポートツールとして、とても重宝しています。

## アウトプットの習慣

アウトプットの意識を持ってから、確実に知識の定着が深くなりました。
僕がやったのは２つです。

### 会社のチャットツール（slack）に投稿

気になったこと、いい記事をなるべくシェアするようにしていました。

### Qiitaの記事作成

これはまさに今もこの記事を通してやっているようなことですが、言い方悪いかもしれませんが、少し雑な記事でも、それを書くことによって、もう一度自分の中に知識が入り込んできます。

また、間違った投稿をしたりすると、メッセージをもらえたりすることもあるので、誤った理解を防ぐことにも繋がります。

## 技術書輪読会

輪読会に参加する以前も技術書を読むことはありましたが、、一人で読んでいるとわりと続かないことが多いです、、

思い出したときに、またちょこっと読んで、、みたいなことをしていて
いつまでも知識を身につけて、忘れて、身につけて、、の繰り返しみたいになってしまっていました。。

### 技術書輪読会のやり方

#### ポイントは本を読んでこないこと

本を読んできて、その内容を話し合うみたいにしてしまうと参加のハードルが高くなったり、続かない人が出てきます、、

#### こんな感じでやってました

20分・・・みんなで同じ章を読む
20分・・・みんなで読んだ章の分からなかったところを話し合う

↑これを繰り返し２周やったりしていました。
それを毎週○曜日に開催とかにすると比較的、継続しやすいのかなと思います。

# まとめ

ポイントは、、
**アウトプットする場所をつくること、持つこと**
**あまり意思を必要としない形で習慣化させること**
だと考えています。

ぜひ、皆さんの学習法も教えて下さい。

# その他

技術のことだけでなく、一般教養あたりのことに関する読書も同じようにアウトプットする習慣を身につけたことで、１年間で200冊の読書をすることができました。
↓↓↓
https://www.instagram.com/book.stock.tetsudoku/

最近始めたインドネシア語学習も同じようにインスタを活用しています。ご参考までに！
↓↓↓
https://www.instagram.com/bahasa.indonesia.jp/
CentOS8へのMySQL8のインストール


こんにちは。
BitByteの伊井です。

今回は、MySQL8.0のインストール方法について、紹介したいと思います。

まず、dnfコマンドで、おもむろに以下のようにインストールを行っていきます。

`sudo dnf install @mysql`

このようにインストールすることによって、依存関係も安全にインストールすることが
可能です。

インストールが完了したら、再起動後もMySQLが起動されるように設定します。
`sudo systemctl enable --now mysqld`

その後、以下のMySQLの設定コマンドを実行します。
`sudo mysql_secure_installation`

コマンドを実行すると、VALIDATE PASSWORD PLUGINの設定をするか
尋ねてきます。パスワードの強度、妥当性などについての設定なので、
特にデフォルトでいい場合は、Enterで進んでください。
次に、rootユーザのパスワードを設定するプロンプトになるので、設定します。
その次は、

- anonymousユーザの削除
- 外部からのrootユーザのアクセス許可
- テストデータベースの削除

を聞かれますので、好きな方を選択してください。

設定が完了するので、rootユーザでログインできるかどうか、確認してみましょう。
`mysql -u root -p`

MySQL8では、GRANT ALLでユーザは作成できないので、
ユーザ作成したのちに、そのユーザに権限を与えてください。

パスワード認証メソッドを、より早く安全なcaching_sha2_passwordメソッドに変更する場合は、
`sudo vim /etc/my.cnf.d/mysql-default-authentication-plugin.cnf`

```ruby:/etc/my.cnf.d/mysql-default-authentication-plugin.cnf
[mysqld]
default_authentication_plugin=caching_sha2_password
```

と編集して保存した後、以下のコマンドでMySQLを再起動させ、反映させます。
`sudo systemctl restart mysqld`

以上で、CentOS8へのMySQL8のインストールの完了です。
文字コードの設定は、MySQL8ではデフォルトでutf8mb4になっています。
その他設定は、/etc/my.cnfに追加してください。
UML ステートマシン図で画面遷移図を書く

<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_01.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_01-1024x786.png" alt="" width="1024" height="786" class="alignnone size-large wp-image-2185" /></a>

<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_04.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_04.png" alt="" width="826" height="346" class="alignnone size-full wp-image-2186" /></a>

<h3>画面</h3>
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_02.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_02.png" alt="" width="243" height="199" class="alignnone size-full wp-image-2181" /></a>

- 状態を使用
- 名前は画面名

<h3>遷移</h3>
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_03.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_03.png" alt="" width="618" height="164" class="alignnone size-full wp-image-2184" /></a>

- 遷移を使用</li>
- トリガーに遷移契機を記述
〇〇釦押下
△△メニュー選択
- 遷移に条件がある場合、ガード条件に記述

<h3>アクション</h3>
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_02.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_02.png" alt="" width="243" height="199" class="alignnone size-full wp-image-2181" /></a>

- 画面処理概要をアクションに記述
- entry：遷移時の実行処理
- do：画面表示中の実行処理
- exit：終了時の実行処理

<h3>画面遷移図分割</h3>
<blockquote>画面が多くなった場合の分割</blockquote>
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_05.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_05.png" alt="" width="298" height="196" class="alignnone size-full wp-image-2188" /></a>

<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_04.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/11/ScreenTransition_04.png" alt="" width="826" height="346" class="alignnone size-full wp-image-2186" /></a>

- サブマシン状態を使用
- サブマシン名に別ステートマシン図を記述(include)
- 別ステートマシン図は開始疑似状態と終了状態で入出を記述
【iOS13】UIImagePickerControllerでisModalInPresentationがtrueでもSwipe Down Closeできることに対する対処法

# TL;DR
- `UIImagePickerController`をChild ViewControllerとしてもったViewControllerを定義
  - イニシャライザの中で`UIViewController.isModalInPresentation` を`true`にする

# iOS13から入った`isModalInPresentation`でSwipe Down Closeを防げる
`UIViewController`で`modalPresentationStyle`が`.pageSheet`にセットされると、そのビューをSwipe Downで閉じることが可能です。[^ios13]。 

閉じられることの防止策の一つの手として、iOS13から入った`UIViewController.isModalInPresentation`を`true`にするという手があります。

```swift
let vc = UIViewController() 
// iOS13だとpresent時に、デフォルトで`vc.modalPresentationStyle` が `.pageSheet` のときと同様の動作になる
// Swipe Down Closeを防ぐために、isModalInPresentationをtrueにする
vc.isModalInPresentation = true
present(vc, animated: true, completion: nil)
```

# `UIImagePickerController`だと`isModalInPresentation`を`true`にしてもSwipe Down Closeを防げない
表題にもある通り、`UIImagePickerController`は`isModalInPresentation`を`true`にしてもSwipe Down Closeを防げません。

```swift
let vc = UIImagePickerController() 
// isModalInPresentationをtrueにしてもSwipe Down Closeできてしまいます
vc.isModalInPresentation = true
present(vc, animated: true, completion: nil)
```

# 対処方法
まず、`UIImagePickerController`をChild ViewControllerとしてもったViewControllerを定義します。
このとき、イニシャライザの中で`UIViewController.isModalInPresentation` を`true`にしましょう。

```swift

@available(iOS 13.0, *) // `isModalInPresentation` がiOS13からなので
class ImagePickerControllerContainer: UIViewController {

   // あえてイニシャライザでimagePickerを受け取るようにしたほうがDelegateの設定とかやりやすい
   init(imagePicker: UIImagePickerController) {
      super.init(nibName: nil, bundle: nil)

      isModalInPresentation = true
      
      addChild(imagePicker)
      imagePicker.didMove(toParent: self)
      view.addSubview(imagePicker.view)
   }

   ...
```

このクラスはSwipe Down CloseできないImage Pickerとして利用することができます。

```swift
let picker = UIImagePickerController() 
let vc = ImagePickerControllerContainer(imagePicker: picker) 
present(vc, animated: true, completion: nil)
```

# 諸注意
かなりアドホックなクラスなので、プライベートクラスで定義して必用なときだけ使うほうが無難です。

```swift
// どっかのクラスのNested Typeとして定義したり
private class ImagePickerControllerContainer: UIViewController {
   ...
```


### 参考文献
- iOS13でのモーダル表示 - https://qiita.com/nullpo33/items/a46a180a0aaf63aadcea



[^ios13]: iOS13だとdefaultで`.pageSheet`と同様の状態になります。というのも、iOS13だと`modalPresentationStyle`は、`.automatic`がDefault Valueであり、直接`.pageSheet`が指定されているわけではないです。https://developer.apple.com/documentation/uikit/uiviewcontroller/1621355-modalpresentationstyle
ADMMｓ

```{r}

#ADMMs p.215

library(dplyr)

data=data.frame(num=1:20,y=c(0.20, 0.10, 0.49, 0.26, 0.92, 0.95, 0.18, 0.19, 0.44, 0.79, 0.61, 0.41, 0.49, 0.34, 0.62, 0.99, 0.38, 0.22,0.71,0.40),x1=c(84,87,86,85,82,87,92,94,88,84.9,78,90,88,87,82,84,86,83,85.2,82),x2=c(61,55.5,57,57,50,50,66.5,65,60.5,49.5,49.5,61,59.5,58.4,53.5,54,60,58.8,54,56),x3=c(24.5,24,23,22.5,22,24,25,26,25,24,23,21,26,25.5,24,23,24,24,24,22))

p=10;lambda=50



ite=10000

Y=data$y;X=as.matrix(data[,colnames(data) %in% c("x1","x2")])

X=t((t(X)-apply(X,2,mean))/apply(X,2,sd))

A=cbind(rep(1,nrow(X)),X)

x=rep(1,ncol(A))

z=x;guzai=rep(0,ncol(A))

eta=0.0001;

for(j in 1:ite){
  
vec=x  
  
for(i in 1:length(x)){
  
x_sub=vec;x_sub[i]=x_sub[i]+0.01

dx1=sum((Y-A%*%x_sub)^2)+p*sum((x_sub-z+u)^2)

dx2=sum((Y-A%*%x)^2)+p*sum((x-z+u)^2)

x[i]=x[i]-eta*(dx1-dx2)/0.01
  
}  
  
vec=z

for(i in 1:length(z)){
  
z_sub=vec;z_sub[i]=z_sub[i]+0.01

dz1=lambda*sum(abs(z_sub))+p*sum((x-z_sub+u)^2)

dz2=lambda*sum(abs(z))+p*sum((x-z+u)^2)

z[i]=z[i]-eta*(dz1-dz2)/0.01
  
}
  
guzai=guzai+p*(x-z);u=guzai/p  

cost=sum((Y-A%*%x)^2)+lambda*sum(abs(z))+p*sum((x-z+u)^2)/2

print(cost)

}


```
ServiceNowのFlow DesignerでActionの初回保存時にActionのInputでsys_idを変数名にするとぬるぽが出る

確認したバージョン: madrid patch4
環境: Developer Instance

これはIncidentへの最新コメントを取得するActionを作成したくなり、Incidentのsys_idを引数にとるActionを作成したときのお話です。

labelに `sys_id` を設定してSaveすると `java.lang.NullPointerException` で保存に失敗。

<img width="1452" alt="スクリーンショット 2019-11-07 19.59.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20570/01e647b2-1ba5-5362-2d03-8a90adb5b590.png">

しかし `id` など別のlabelに変更すると保存に成功。
<img width="1463" alt="スクリーンショット 2019-11-07 19.59.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20570/9bbb585d-6e6a-aa74-7b5c-d5dbddb64086.png">

一度保存に成功した後であれば、labelにsys_idを設定しても保存に成功する模様。
<img width="1450" alt="スクリーンショット 2019-11-07 20.06.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20570/da722d40-6bb2-e81b-1900-d92eb7d89338.png">
ELB配下のEC2にCakePHPアプリケーションを置いたらCSSが当たらない

# 概要
自社開発したサービスをELBにぶら下げたEC2インスタンスにデプロイしていざアクセスするとリダイレクト処理が繰り返し行われるというエラーが起こった。[AWSで構築されたサイトをSSL化しようとしたらリダイレクトループではまった](https://qiita.com/tihimsm/items/2c58a3425e446261940b)を参考に.htaccessを編集してそれを解消したら今度はcssが当たらないという状態になり。きっと.htaccessがまだ間違ってるんだろうと深みにハマった。結局、ELBの仕組みを把握してないことから招いたエラーだった。

# 結論（原因と変更）
- 構成: ->port443->ELB->port80->EC2
- ELBからEC2への通信にはポート80で通信していた。
- コード中でポート80での通信の時はフルパスをhttp://～に設定する記述をしていた。

```
    if($_SERVER["HTTP_PORT"] == 443){
        define('SITE_URL', 'https://' . $_SERVER["SERVER_NAME"]); //本番環境の場合
    }else{
 	define('SITE_URL', 'http://' . $_SERVER["SERVER_NAME"]); //ローカル環境の場合
   }
```
- http://～のパスでcssをリクエストしてたのでnotfoundを返してスタイルが当たらなかった。
- 設定部分で["HTTP_X_FORWARDED_PORT"]を参照するように変更した。

```
    if($_SERVER["HTTP_X_FORWARDED_PORT"] == 443){
        define('SITE_URL', 'https://' . $_SERVER["SERVER_NAME"]); //ELBでSSL監視してる場合
    }else{
 	define('SITE_URL', 'http://' . $_SERVER["SERVER_NAME"]); //ローカル環境の場合
   }
```

※ここから下は細かい話です
# .htaccessを疑う
まず最初にこの現象が発生した。
[AWSで構築されたサイトをSSL化しようとしたらリダイレクトループではまった](https://qiita.com/tihimsm/items/2c58a3425e446261940b)
（あんまりよく読まずに）なるほどこの.htaccessの内容にすればいいのねと丸コピして適応。
んでこのエラーは解決したものの今度はcssが当たらないという事態が発生。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507709/8ac0b6fb-072c-ad4f-7989-eb4c68cc51cf.png)
赤いところ全部参照できてない。調べてみたら全部http://～のパスで探してる。https://～じゃないからnotfoundになってエラーが吐かれてた。

# httpsなのにportが80?
適当な画面でvar_dump($_SERVER[HTTP_PORT])してポート番号を確認すると80番と返される。httpsリクエストしてるのになんで80なんや？？と混乱。きっとさっき編集した.htaccessでまだ変更しないといけないんだろうとググって調べて分からなくてハマる。

# ELBの働きを知ろう！
解決できなくて消耗しまくる。んでアーキテクチャ構成担当者に相談したところ
[HTTP ヘッダーおよび クラシックロードバランサー](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/x-forwarded-headers.html)を読んでときた。
ELBはポート443でリクエストを受け付けてEC2のポート80に受け渡すのが役割。
つまり$_SERVER[HTTP_PORT]は80を返す！
ELBを通った時HTTPヘッダーに["HTTP_X_FORWARDED_PORT"]という項目が追加され、これがELBへアクセスされたポート(443)が格納されているのでこれを利用してコードを変更して解決できた！

初歩的なエラーながらかなりてこずったけれどELBの仕組みとかアーキテクチャの理解が深まったのでいい経験だった。ご参考になれば幸いです。
VSCodeのRemote - SSH extentionでsshログインする

VSCodeでssh接続できたのでメモ. 
#導入

[Remote - SSH extention](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)を入手する. 
![Screenshot from 2019-11-07 19-28-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362923/30bd3211-fbee-34ae-340b-1de2e5d72f3e.png)
インストールが済むと右下に次のような緑のマークが現れる. 
![Screenshot from 2019-11-07 19-25-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362923/24316684-d6c0-99cf-6f97-845bf4923571.png)

#設定

左のメニューバーにRemote - SSHのメニューが追加されるので, これをクリックする. 
![Screenshot from 2019-11-07 19-36-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362923/9813acfb-e69b-2ba9-d035-44be2081d537.png)

次に+ボタンを押して新しいsshサーバを追加する. 
![screenshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362923/c305dd5a-7ad4-284f-2d90-f70379f357e2.png)　![Screenshot from 2019-11-07 19-44-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362923/2a0d3e0e-688a-93f4-4ba4-c265e2beff4e.png)

```bash 
ssh user@xxx
```
のように入力するとsshの設定の保存先を聞かれるので適当なところへ保存しておく. 

#接続
メニューバーにサーバが追加されるので, そこをクリックするとssh接続できる.
#Ruby の aasm gem で  after_all_transitions の Callback が出来ない : AASM::UnknownStateMachineError のエラー

[aasm/aasm: AASM - State machines for Ruby classes (plain Ruby, ActiveRecord, Mongoid)](https://github.com/aasm/aasm#callbacks)

# 問題

```
aasm do
end
```

の場合と

```
aasm(:some_name) do
end
```

の場合で callback の書き方が違う

# 解決


```rb

require 'aasm'

class Job
  include AASM

  aasm(:runner) do
    after_all_transitions :log_status_change

    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

  def log_status_change
    puts "changing from #{aasm(:runner).from_state} to #{aasm(:runner).to_state} (event: #{aasm(:runner).current_event})"
    # changing from sleeping to running (event: run)

    # puts "changing from #{aasm.from_state} to #{aasm.to_state} (event: #{aasm.current_event})"
    # There is no state machine with the name 'default' defined in Job! (AASM::UnknownStateMachineError)
  end
end

job = Job.new
job.run

```

# 理由

```
aasm(:name) do
end
```

で複数の StateMachine を作ることができるが、それにフックさせる callback メソッドは aasm の DSLではなく フラットなメソッドとして書くため、どの種類の StateMachine かを教える必要があるっぽい




# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2678








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
if...else...endの条件分岐文がどうして汚いんですか(怒)→すみませんでした！！！

#その日の流れ

          test =  if 日本人なら?
                    "和食"
                  else 
                    "洋食"
                  end 

こんな感じのコード書いて、この直下に式展開でtestを呼び出すようなコード書いてたら
先輩に「きたねー」と言われてしまった。。。

#Lv.5になって「でんこうせっか」覚えた気分だ

最初に「三項演算子」というものがあってだな...という説明を受けた時に
ちょっと自分の悪い癖が出てしまって、こんなことを思ってしまった。

![名称未設定ファイル (53).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/a7bf2a45-34cb-91a3-2063-0905faeb9f16.jpeg)

だが、俺は3ヶ月だしそもそも書き方これしか知らない奴が見やすいっていうのは
オレオレ表現のオンパレード何だろうな...と思いながら、くそ丁寧に先輩が説明してくれた。

[参考記事]
【Ruby・Rails】三項演算子(条件演算子）を使ってif文をスリムに書こう！
https://qiita.com/lasershow/items/160c854e4256ba596ec5

なるほど、要はif...else...end的な文書を「三項演算子」・・・
お前は一行でやってしまうって言うんだな。

名前に踊らされて難しそうではあったが、数学の因数分解みたい？なイメージだった。
5行のところを1行でかけてしまった。

          test =  if 日本人なら?
                    "和食"
                  else 
                    "洋食"
                  end 

          test =  日本人なら? ? "和食": "洋食"

日本人ならって言うのは、いわゆる条件式になります。

- Trueなら「和食」　Falseなら「洋食」

![名称未設定ファイル (54).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/3362bf26-d103-164c-8c83-3a403a03cb85.jpeg)

#それで「三項演算子」は何が嬉しいの？

・コード量が少なくて済むから見やすくなる

・変数にどんなロジックが組み込まれているかわかりやすい。

・入力数が少なくて、書き手も楽になる。

#結論：すいませんでしたぁぁあああ

ちょっとばかりif文が使えたからといって、「通ればよかろうなのだぁ」ってクソコードを量産するのは他の人に迷惑をかけるし、スキルアップもしない。
自分の中にいる危険因子を見つけてしまった。。。
まあついこの間まで通らないクソコード書いてたから、調子乗ってたんだろうなと思う今日この頃です。
Ecipse起動時に「The Eclipse executable launcher was unable to locate its companion shared library.」と出た場合の対処法

# Eclipse(Pleadesでも)をダウンロード→起動しようとして題名のエラーが出たときの対処法3つ

※ Windows環境前提です。

## 1.解凍しなおす

Windowsのエクスプローラーはパスを含めてファイル名が259文字が上限となる
解凍時にやたら長い名前パスに長いファイルを解凍してこの上限を超えた場合にはファイルの配置ができず消えてしまう可能性がある。
それにより、題名のエラーが発生する。

そのため、比較的浅く文字数の少ないフォルダに解凍しなおすのが第一の対応策となる。
また、Windows標準のzipファイル展開や7zipによる展開は問題が起きにくいが
LhaplusだとEclipseのzipは解答失敗するケースが多々あるようなので、解凍に使うソフトを変更するのも一つの手である

## 2.eclipse.iniファイルを確認、修正する

eclipse.iniファイルは以下のような記載がある
`--startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120913-144807`

ここで、Eclipseのダウンロード先フォルダを起点に、--startupならばjarファイルが--launcher.libraryならばフォルダが存在することを確認する。
もしも無かったならばequinox.launcherで検索して、引っかかったファイルのバージョンへと数値を書き換える。(ファイル名もしくは、フォルダ名をそのままeclipse.iniに持ってくる。)

## 3.直接launcherを実行する(※おすすめしない方法です。)
Eclipseのダウンロード先フォルダから、pluginディレクトリに移動して

org.eclipse.equinox.launcher_xxxxxxxx.jarを実行(xxxxxxxxは各個の環境のバージョンに合わせて変動)
すると、起動します。

ただし、本来修正するべき起動しない原因を解決せずに動かす方法なので、意図せぬ不具合が発生する可能性もありあまりおすすめできない方法です。
【Laravel5.8】Eagerロード先テーブルは必ず主キーもSELECTしないといけない

テーブルBと、B.idにリレーションを張ってるテーブルAがあったとします。

モデルは普通。

```php:モデル
// モデルA
class TableA extends Model{
    // テーブル名
    protected $table = 'table_a';

    /**
     * リレーション
     * @return BelongsTo
     */
    public function tableb()
    {
        return $this->belongsTo(TableB::class, 'b_id', 'id');
    }
}

// モデルB
class TableB extends Model{
    // テーブル名
    protected $table = 'table_b';
}
```

コントローラとテンプレも普通。

```php:コントローラ
    $tableas = TableA->get();
```

```php:blade
@foreach ($tableas as $tablea)
    {{ $tablea->name }}
    {{ $tablea->tableb['name'] }}
@endforeach
```

さくっとできました。

できたはいいけどn+1問題が直撃する書き方です。
ループのたびに`SELECT * FROM table_b WHERE id=x`というSQLが走るので、とてもよろしくありません。
よって[Eagerローディング](https://readouble.com/laravel/5.8/ja/eloquent-relationships.html#eager-loading)するようにしましょう。
コントローラにwith書くだけなので一瞬です。

```php:コントローラ
    $tableas = TableA->with('table_b')->get();
```

何十個も発行されていたSQLがわずか二つに減りました。

しかし、これもまだ無駄があります。
テーブルAもBもnameしか使ってないので、`SELECT *`ではなく`SELECT name`のSQLを発行するようにしたいです。
このためにLaravelには[スコープ](https://readouble.com/laravel/5.8/ja/eloquent.html#local-scopes)という機能があります。

```php:モデル

// モデルA
class TableA extends Model{
    // テーブル名
    protected $table = 'table_a';

    /**
     * リレーション
     * @return BelongsTo
     */
    public function tableb()
    {
        return $this->belongsTo(TableB::class, 'b_id', 'id');
    }
    
    /**
     * 取得対象カラム
     */
    public static function scopeName($query){
        return $query->select(['name']);
    }
}

// モデルB
class TableB extends Model{
    // テーブル名
    protected $table = 'table_b';

    /**
     * 取得対象カラム
     */
    public static function scopeName($query){
        return $query->select(['name']);
    }
}
```

コントローラからはスコープの呼び出しを追加します。

```php:コントローラ
    $tableas = TableA::name()->with(['tableb' => function ($q) {$q->name();}])->get();
```

やったね。

はい、これテーブルBのデータ取って来れません。
リレーション先テーブルのデータに主キーがなかった場合、何故か紐付けてくれないのです。

実はEagerローディングは予想に反してJOINしていません。
発行されたSQLを見ると、`SELECT name FROM table_a WHERE id IN (1, 2, 3); SELECT name FROM table_b WHERE id IN (4, 5, 6);`みたいになっています。
別々に取ってきたデータを後でくっつけているので、くっつけるために主キーが必要になっています。

マニュアルにも[特定カラムのEagerロード](https://readouble.com/laravel/5.8/ja/eloquent-relationships.html#eager-loading)という項目で一応触れられているのですが、スコープとはだいぶ離れたところにあるうえに`with('author:id,name')`という例示のせいで一見同じものに見えないため、関係ないと読み流してしまいました。

ということできちんと結合するには、主キーも取ってくるようにしましょう。

```php:モデル

// モデルB
    public static function scopeName($query){
        return $query->select(['id', 'name']);
    }
```

# まとめ

SELECT先を指定するときは、必ず主キーも入れよう。
【Ruby】タブ区切りテキストファイル(tsv)をcsvに変換する

#概要
アウトプット用に、学習した内容を紹介していきます。
本日の内容はRubyでtsvをcsvに変換するお話です。

#環境
Mac OS Mojave 10.14.6
Ruby 2.5.3
エディタ VSCode

#tsvをcsvに変換
以下のタブ区切りテキストをcsvに変換します。

```meibo.txt
john	m	18
paul	m	20
alice	f	15
dabid	m	17
jasmin	f	17
```
こちらは以下のコードでcsvファイルへの変換が出来ます。

```Ruby:tsvtocsv.rb
require 'csv'

File.open( 'meibo.txt', 'r:UTF-8' ) do |file|
  CSV.open( 'meibo.csv', 'w', force_quotes: true ) do |csv|
    #一行ずつCSVファイルへ書き込み
    file.each_line do |line|
      csv << line.chomp.split( "\t" )
    end
  end
end
```
File.openでtsvファイルを読み込みます。
次の行、CSV.openで書き込み用ファイルを用意します。

その下のループ文では、tsvファイルに対し一行ずつcsvファイルへ書き込んでいきます。
chompで改行文字削除、split( "\t" )でタブごとに区切っています。
DDD初めたい人にオススメする参考文献まとめ

1年以上前にチームに共有するためにまとめたものなので、多少古いかもしれない。
誰かの参考になれば！

## イチオシ

### 0から学ぶときのイチオシはこちら

- [Domain Driven Design（ドメイン駆動設計） Quickly 日本語版](https://www.infoq.com/jp/minibooks/domain-driven-design-quickly)
少ない文量で大枠を知ることができて、しかも無料。とりあえず読むべき。

- [.NETのエンタープライズアプリケーションアーキテクチャ 第2版](https://www.amazon.co.jp/dp/4822298485)
初めにオススメされるであろうEvans本とIDDDは文量多すぎ、内容抽象的すぎで、はじめから立ち向かうと心が朽ち果ててしまう。
この本は、文量控えめ（Evans本とIDDDと比較して）かつ、話の流れが読みやすいのですんなり読める。
あと実装のイメージが付きやすいのもこの本だった。

### 設計とかそもそも必要なの？という人はこちらからがイチオシ

- [現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法](https://www.amazon.co.jp/dp/B073GSDBGT)
- [Adaptive Code ～ C#実践開発手法 第2版](https://www.amazon.co.jp/dp/B07DJ2BL4Y)
- [Clean Architecture　達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/dp/B07FSBHS2V)

## まとめ
### Web
- [IDDD本から理解するドメイン駆動設計](https://codezine.jp/article/corner/655)
- [Scalaコードでわかった気になるDDD](http://labs.gree.jp/blog/2013/12/9354/)
- [ドメインモデルの根拠とドメインモデル貧血症の対策について](http://creators-note.chatwork.com/entry/2017/12/10/160210)
- [混乱しがちなサービスという概念について](https://j5ik2o.hatenablog.com/entry/2016/03/07/034646)

### PDF
- [Domain Driven Design（ドメイン駆動設計） Quickly 日本語版](https://www.infoq.com/jp/minibooks/domain-driven-design-quickly)
- [CQRS Documents by Greg Young 日本語訳](http://www.minato.tv/cqrs/cqrs_documents_jp.pdf)

### 書籍
- [エリック・エヴァンスのドメイン駆動設計](https://www.amazon.co.jp/dp/B00GRKD6XU)
- [実践ドメイン駆動設計](https://www.amazon.co.jp/dp/B00UX9VJGW)
- [.NETのエンタープライズアプリケーションアーキテクチャ 第2版](https://www.amazon.co.jp/dp/4822298485)
- [現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法](https://www.amazon.co.jp/dp/B073GSDBGT)
- [ユースケース駆動開発実践ガイド](https://www.amazon.co.jp/dp/B01B5MX2TC)

### 実装
- Golang
  - https://github.com/marcusolsson/goddd
- Java
  - https://github.com/VaughnVernon/IDDD_Samples:
- C#
  - https://github.com/VaughnVernon/IDDD_Samples_NET
- Scala
  - https://github.com/j5ik2o/spetstore
speech to text(google api)から取得して表示したhtmlTableをcsvファイルとしてDLさせた日

```test.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>test</title>

</head>
<body>
        <h3 class="text-muted">Result Page</h3>
  <div contenteditable="true">
        <table border="1">
        <tr>
          <th>秒</th>
          <th>text</th>
        </tr>
        {% for text in result %}
        <tr>
          <td>{{text.alternatives[0].words[0].start_time.seconds}}</td>
          <td>{{text.alternatives[0].transcript}}</td>
        </tr>
        {% endfor %}
        </table>
  </div>

<br style="mso-data-placement: same-cell;">

            function handleDownload2() {
                var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
                var content = handleDownload();
                var blob = new Blob([ bom, content ], { "type" : "text/csv" });

                if (window.navigator.msSaveBlob) { 
                    window.navigator.msSaveBlob(blob, "test.csv"); 

                    // msSaveOrOpenBlobの場合はファイルを保存せずに開ける
                    window.navigator.msSaveOrOpenBlob(blob, "test.csv"); 
                } else {
                    document.getElementById("download").href = window.URL.createObjectURL(blob);
                }
            }
        </script>
        <a id="download" href="#" download="test.csv" onclick="handleDownload2()">ダウンロード</a>
    
</body>
</html>
```

###メモ
改行対応のためにTextContentからinnerTextに
###参考
https://qiita.com/miki-tensorflow/items/e29bd8046820f1c9cfb0
https://qiita.com/wadahiro/items/eb50ac6bbe2e18cf8813
【Swift】UITabBarControllerでアプリ起動時に指定したタブを表示する

UITabBarControllerで最初にデフォルト表示されるタブを指定する方法です。
調べてもObjective-Cでの記述ばかりだったので残しておきます。

## 結論
`TabBarController.swift`を作り`selectIndex`で表示したいタブの番号を指定する

```swift:TabBarController.swift
class TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        selectedIndex = 1
    }
}
```

これで理解できる方、この記事はここまでです。

以下、順に`TabbarController.swift`を作った場合と作らなかった場合の挙動と、実装の手順を示していきます。

## 確認環境
Xcode 11.1
iOS 13.1(Simulator)
Storyboard使用

## プロジェクト生成
画像のような状態のデモプロジェクトを用いて進めます。
TabBarControllerに3つのViewControllerを付けておきます。
背景色やタブアイコンは分かりやすさのために適当にしています。
<img width="565" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224808/37b301b5-c3fc-4d55-55ef-571f5e63f106.png">

## TabBarController.swiftが無い場合
アプリを起動すると一番左のタブが表示されます
<img width="535" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224808/302cce7c-800d-e635-5f5a-d0a1c044ce78.png">

## TabBarController.swiftがある場合
### TabBarController.swiftを作る
XcodeでTabBarController.swiftを作りましょう
<img width="722" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224808/30e7239e-7293-f718-3e72-c9336b1d963a.png">

作ったファイルで以下のように記述します

```swift:TabBarController.swift
import UIKit

class TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        selectedIndex = 1
    }
}
```

### クラス付けをする
Storyboardで先ほど作った`TabBarController.swift`とUITabBarControllerを紐づけます
<img width="1169" alt="スクリーンショット 2019-11-07 19.12.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224808/26e65723-bfb1-3eba-267d-752d9c3e4cfd.png">

### 再びアプリ起動
再びアプリを起動すると2番目のタブが最初に表示されるようになります。
<img width="535" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224808/be74b916-5ac9-0afc-ecd5-a2d6d7033970.png">

もちろん、`selectedIndex = 2`とすれば一番右のタブが最初に表示されます。
Android【Jetpack Composeお試し編】


## 概要
「Android Studio 4.0 Canary 1」にてkotlinのコードでUIを構築できる`Jetpack Compose`に対応しました。  
実際に公式のチュートリアルやデモを試したのでそのまとめです。


[Android Studio 4.0 ダウンロードページ](https://developer.android.com/studio/preview?hl=ja)
[Jetpack Composeとは](https://developer.android.com/jetpack/compose)
[Use Android Studio with Jetpack Compose](https://developer.android.com/jetpack/compose/setup)
[TUTORIAL Jetpack Compose Basics](https://developer.android.com/jetpack/compose/tutorial)
[Jetpack Compose Basics](https://codelabs.developers.google.com/codelabs/jetpack-compose-basics/index.html#0)

## 使い方
1, ActivityのonCreate内に`setContent`を呼ぶ
2, `@Composable`アノテーションをつけた関数を作成し、UIを記述していく
3, `setContent`内に2で作成した関数を呼ぶ

```kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
		// 1
        setContent {
            // 3
            Greeting(name = "Android")
        }
    }
}
// 2
@Composable
fun Greeting(name: String) {
   Text (text = "Hello $name!")
}
```

### レウアウトやテキストにStyleを指定する
Composable関数の引数にスタイルを指定する

```kotlin
Text (text = "Hello $name!", style = Color.Red)
```
MaterialThemeを使用してスタイルを指定する

```kotlin

MaterialTheme {
    Text (text = "Hello $name!", style = +themeTextStyle { h1 })
}
```

### 動的にデータを変更したい場合(ステート)
1, `@Model`アノテーションをつけたデータクラスを作成
2, Composable関数に1のモデルクラスのインスタンスを渡す

```kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // 2
            Counter(counterState)
        }
    }
}

val counterState = CounterState()

// 1
@Model
class CounterState (var count: Int = 0)

@Composable
fun Counter(state: CounterState) {
    Button(
        text = "${state.count} times",
        onClick = { state.count++ }
    )
}
```

### よく使いそうな関数
<table>
<tr>
  <th>関数名</th>
  <th>動作</th>
</tr>
<tr>
  <td>Text</td>
  <td>文字列を表示する</td>
</tr>
<tr>
  <td>DrawerImage</td>
  <td>画像を表示する</td>
</tr>
<tr>
  <td>Container</td>
  <td>レイアウト</td>
</tr>
<tr>
  <td>Row</td>
  <td>要素を横並びにする</td>
</tr>
<tr>
  <td>Column</td>
  <td>子要素を縦並びにする</td>
</tr>
<tr>
  <td>Clip</td>
  <td>画像の角を丸くしたりすることができる</td>
</tr>
<tr>
  <td>Surface</td>
  <td>子要素の背景色の指定や角を丸くしたりすることができる</td>
</tr>
<tr>
  <td>HeightSpacer</td>
  <td>指定した分の高さのスペースを作る</td>
</tr>
<tr>
  <td>WidthSpacer</td>
  <td>指定した分の幅のスペースを作る(Column内で使う)</td>
</tr>
<tr>
  <td>Clickable</td>
  <td>子要素をクリック要素にする</td>
</tr>
</table>

### 感想
React, Flutter, SwiftUIを触ったことがありますが、そのおかげかスラスラコードがかけました。

Jetpack ComposeだとステートをModelクラスで保持できるので、普段Android開発してる人はState周りはすんなり理解できると思います。

既存のAPIなどとも互換性があるそうなので、既存のプロジェクトに組み込むこともできます。

正式にリリースされる際はSwiftUIにあるViewをドラッグアンドドロップするとコードが追加される機能がついて欲しいです。

Fragment内の`setContent`をviewGroupの拡張関数として呼べるので、Fragment内でもComposable関数が使用できそうだが、やり方がわかりません（わかり次第追記します。）
2~3年目エンジニア同士で「SQLアンチパターン」の輪読会をしてみた

# 試しに始めた輪読会が意外と盛り上がったので記事にしました。

## 概要

- 題材
  - SQLアンチパターン
- メンバー
  - 業界2~3年目のエンジニア
  - 業界はSIerとWeb

![images (2).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293438/637c9f1c-cf9b-6d88-42d9-1ea72621febb.jpeg)


## 経緯

元上司にSQLの知識が乏しい事を相談したら同じ様な仲間募って`輪読会`してみれば？
って言われたので単純な僕は早速仲の良いメンバー（社外）を集めて`SQLアンチパターン`の輪読会を始める事にした。

## メンバー

- ナミザト（筆者） 
  - 3年目　SQLは幼稚園児と同レベルの知識
- ボンバーさん
  - 3年目　SQL分かる
- ゆいさん
  - 2年目　SQLふんわり分かるけど曖昧な所もある
- ハルさん
  - 2年目　業務で書くけど分からない事も多々ある

## 目的

- 完璧な設計が出来ずともアンチパターンを避けた適切な設計が出来る様になる（または考えられる）
- アンチパターンだけでなく、DBに関する理解が浅い部分を恥ずかしがらずに質問して皆んなで理解を深める
- 自分だけで理解して終わるのでなく、皆んなが納得するまで議論し、共通認識を高める
- 何となく理解していたつもりでいた知識を言語化する事で自身の本当の理解度を認識する

> 今回の目的にアンチパターンの理解だけでなく、DB関連の理解も深めたいというものがあるので普通の輪読会とは少し違うかも...。

## 本題

SQLアンチパターンは章区切りでそれぞれアンチパターンが説明されていて、アンチパターンで設計をした場合にその設計が如何に柔軟性に欠けているか、いくつかの例が出てきます。
そして章の最後に相応しい設計で解決方法を紹介するという内容になっています。

その分かなり分かりやすくまとめられているので、内容に対しての議論するのは難しいなと思い、別のアプローチ方法を考えた。

### 輪読から議論までの流れ

1. 皆んなで同じ章を読む（1回の勉強会で1章ずつ進める）
2. 輪読する時間を決める
3. 輪読していく中で`疑問` `感想` `提案` `質問` `自分用メモ`を付箋に書き綴る
4. メモした付箋を共有のホワイトボードに貼り付ける
5. 付箋を1つずつテーマとして上げて議論する（または知ってる人が教える）

## 1.皆んなで同じ章を読む

これは輪読会では当たり前だが、共通の章を同じペースで読み進める。
そうじゃないと議論もクソもないからね。。

まずは第1章の`ジェイウォーク`から読み始めました。

## 2. 輪読する時間を決める

だらだら読むのは良くないと何処かの記事で書かれていたので、30分という時間を決めて1章をそれぞれで読んでもらいました。
今回の`SQLアンチパターン`は1章10P位なのでちょうど良かったが、本に合わせて時間を調整するのが適切です。

## 3. 輪読していく中で`疑問` `感想` `提案` `質問` `自分用メモ`を付箋に書き綴る

これが今回一番大事で議論をするための材料を用意するのではなく、自身の気付きや疑問を簡単に付箋に描いてもらった。

なぜそんな事をしたかというと、基本技術書などは課題に対するまとめがあり、それで完結してしまうんです。
そのため議論をするための材料探しというのは、中々捻り出せないものなのです。。

なので、議論に重きを置いた今回は質より量で攻めるやり方を取りました。

## 4. メモした付箋を共有のホワイトボードに貼り付ける

3で集めた付箋をホワイトボードにジャンル毎に分けて共有しやすい様にしました。

## 5. 付箋メモを1つずつテーマとして上げて議論する（または知ってる人が教える）

4で貼り付けた付箋メモをジャンル毎に進行者（執筆者）がテーマとして発表して、
それに対して各々の意見を語り、議論するという流れで進めました。

**`実際の様子`**
![輪読会.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293438/2329805a-a467-cce7-d093-5bba12f05eb3.jpeg)

> 皆んなで写真撮るの忘れた

### 付箋メモで上がった議題の一例

- 5~10人までしかユーザが登録できないなおかつ登録した時期によって変動するという問題に対して
 - なぜ5~10人までなのか（ナミザト）
 - 10人超えた時にどうなるのか（ナミザト）
 - 登録した時期によって変わるのはなぜ？（ハルさん）
- 適切な設計の時に出てくる参照整合性とは？（ゆいさん）
- 外部キー制約って？（忘れた）
- indexを貼る理由は？またはどういう意味？（ゆいさん）

などなどアンチパターンというよりDB関連の議題の方が多かったです。
本来の輪読会であれば逸れた質問に分類されると思いますが、今回はDBの知識も深めたいという名目もあるため
あえて幅広く出してもらいました。

## 輪読会を通して気付いたこと

- 本を読んだつもりになっている
- 自分の認識と皆んなの認識が違うことがある（または誤っている）
- 理解しているつもりでも人に説明できるほど理解していない
- 話が逸れがちなので軌道修正する人が必要（僕らだけかもしれないが）

## 結果

今回の題材「SQLアンチパターン」の`ジェイウォーク`に関する議題というよりはDB関連の議題が多く出ました。
もちろん`ジェイウォーク`に関しても図で書きながらみんなの共通認識を擦り合わせて、齟齬が出ないようにしたので「皆んなで理解する」という意味ではクリア出来たかな？という感じでした。
次回はちゃんとアンチパターンの議題も出せるようにレベルアップしていきたいですね。

## 反省点&改善点（気付き）

- 仲良い人同士で無いと意見を出しづらいかも
 - 初対面の人でもディスカッションしやすい雰囲気作り（課題）
- もっとテーマを出す
- アンチパターンについてもう少し議論出来る様にしたい
- ある程度SQLに精通した人が居ないと詰む
- MAXでも5人くらいが丁度いい
QueryDocumentSnapShotとDocumentSnapShotを厳密に区別する必要はない

``` javascript
const doc = await db.collection(hoge).doc(id).get();

const query = await db.collection(hoge).get();
query.forEach(doc => {
  
});
```

上記の二つのdocの方は厳密には前者がDocumentSnapShotで後者がQueryDocumentSnapShotである。

では、これらのdocを同じ変数や引数で受けるために

``` javascript
const someFunc(doc:firestore.QueryDocumentSnapShot | firestore.DocumentSnapShot) => {
}
```
としなければならないのかと言うと、特にそんなことはない。

QueryDocumentSnapShotはDocumentSnapShotのサブクラスであり、
公式ドキュメントにも、違いはQueryDocumentSnapShotの場合isExistsが常にtrueを返したり、
getDataがundefinedを返すことはない程度であると書いてある。

typescriptで型指定する場合は単にfirestore.DocumentSnapShotでOK。
Go言語のテンプレート機能について



#概要
go言語に標準で搭載されているテンプレート機能について紹介します。
テンプレート機能を使うことで、ロジックとデザインを分離することが出来ます。
変数の埋め込み、ループ、条件分岐などが出来ます。


ただし、それほど多機能ではないため使い所は限られるでしょう。
例えばメールではJavascriptが使えないため使用に適しています。

複雑なことはできませんが独自関数を作成できるため、何かをやろうとする場合は逐次独自関数を作成していくことになります。

##packageについて
Go言語には組込みのテンプレート・パッケージとして、 `text/template` と `html/template` パッケージが搭載されています。  
`html/template` パッケージは`text/template` をラップしたもので、同じインターフェースを提供し、コードインジェクション対策を施した安全なHTMLを生成します。   
出力が HTML の場合は常に `html/template` を用いるべきです。  

##基本的な使い方
```go
//テンプレートを用意
textBody := `
{{define "base"}}
	Hello! {{.Name}}
	{{.Age}}歳ですね
{{end}}
`
//埋め込み変数
params := map[string]string{
	"Name": "たろう",
	"Age": "23",
}

t, _ := template.New("base").Parse(textBody)
t.Execute(os.Stdout, params)

```

##テンプレート内の記述方法
```go
//Goからの変数を受け取るには .変数名 となります
{{.Name}}

//テンプレート内で変数を作成できます。この場合、$変数名 になります
{{$count := 23}}
{{$count}}

//ループ処理
//break, continueなどの機能はない
{{range $index, $offer := .Offers}}
	{{$index}}	//0, 1, 2 ...
	{{$offer.Name}}	//構造体の中身へのアクセス
{{end}}

//条件分岐
{{ if gt i 1 }}
	i > 1 です
{{end}}

//上記同様の書き方で、以下の比較関数が使える
//引数はスペース区切りで与える
eq
  arg1 == arg2
ne
  arg1 != arg2
lt
  arg1 < arg2
le
  arg1 <= arg2
gt
  arg1 > arg2
ge
  arg1 >= arg2

```

##文字列操作
fmt.printf が使えますので、文字列の連結はできます

```go
{{$body := printf "%s%s" $index "番目です"}}
```

##独自関数について
上記にかかれていること以外は基本的できず、四則演算も出来ません。やる場合は独自関数を定義する必要があります
独自関数はGo側で定義し以下のようにテンプレート側に渡します。

```go
funcMap := template.FuncMap{
	"add":	func(a, b int) int { return a + b },
}

t, _ := template.New("base").Funcs(funcMap).Parse(textBody)
t.Execute(os.Stdout, params)

//テンプレート側では以下のように使用できる
{{add 5 2}}	//7
{{$count := add 4 2}}	//変数にわたすこともできる
{{$count}}	//6
```

##搭載された全関数。詳しくはドキュメントを参照
https://golang.org/pkg/text/template/

```go:funcs
var builtins = FuncMap{
	"and":      and,
	"call":     call,
	"html":     HTMLEscaper,
	"index":    index,
	"js":       JSEscaper,
	"len":      length,
	"not":      not,
	"or":       or,
	"print":    fmt.Sprint,
	"printf":   fmt.Sprintf,
	"println":  fmt.Sprintln,
	"urlquery": URLQueryEscaper,

	// Comparisons
	"eq": eq, // ==
	"ge": ge, // >=
	"gt": gt, // >
	"le": le, // <=
	"lt": lt, // <
	"ne": ne, // !=
}
```
誕生日あて問題

#Rubyアルゴリズム問題
#誕生日あて問題を作ろう
今回作るプログラムは誕生日あてプログラムです
#仕様
①１〜３１日のなかから、ランダムで誕生日を一つ自動的に決めます

②予想を入力し、結果により出力を以下５パターン変えます
・正解
・２０日以上離れている
・１０日以上離れている
・１０日以内
・３日以内

③５回で正解しなければゲームオーバーにします

#答え
<details><summary>誕生日あて問題回答</summary><div>

```ruby
#正解
def yes(num)
  puts "正解！"
  puts "#{num}回目であたったよ"
  exit
end

#不正解
def no(num, input, birthday)
  difference = (input - birthday)**2
  if num == 5
    puts "Game Over"
    exit
  elsif difference >= 400
    puts "20日以上離れてる。見当違いだよ"
  elsif difference >= 100
    puts "10日以上離れてる。"
  elsif difference >= 16
    puts "10日以内だよ。少し近いよ"
  else
    puts "3日以内!惜しい！"
  end
end

#誕生日をランダムで決める
birthday = rand(1..31)
puts "私の誕生日を5回以内に当ててね"
num = 1

while true do
  puts "#{num}回目のチャレンジです"
  puts "1~31日のいつだと思いますか？"
  input = gets.to_i

  if birthday == input
    yes(num)
  elsif input < 1 || input >31
    puts "当てる気ありますか？"
  else
    no(num, input, birthday)
  end
  num += 1
end
```
</div></details>