OmniAICreator/Qiita-1.07M huggingface dataset:
nagiosのcfgを生成しやすくするスクリプト

## 生成スクリプト

```sh:generate.sh
#!/bin/sh
set -eu
OUTPUT="generate.cfg"
cat /dev/null > $OUTPUT

cfg () {
    IP="$1"
    NAME="$2"
    echo "define host {" >> $OUTPUT
    echo "        use            generic-printer" >> $OUTPUT
    echo "        host_name      $NAME" >> $OUTPUT
    echo "        alias          $NAME" >> $OUTPUT
    echo "        address        $IP" >> $OUTPUT
    echo "        contact_groups admins" >> $OUTPUT
    echo "        }" >> $OUTPUT
    echo >> $OUTPUT
}

# 列挙
cfg "192.168.100.1" "myRouter"
cfg "192.168.100.2" "pc1"
cfg "192.168.100.3" "pc2"
cfg "192.168.100.4" "pc3"
```

```
sh generate.sh
```

* generate.cfg が生成される。

## 出力例

```text:generate.cfg
define host {
        use            generic-printer
        host_name      myRouter
        alias          myRouter
        address        192.168.100.1
        contact_groups admins
        }

define host {
        use            generic-printer
        host_name      pc1
        alias          pc1
        address        192.168.100.2
        contact_groups admins
        }

define host {
        use            generic-printer
        host_name      pc2
        alias          pc2
        address        192.168.100.3
        contact_groups admins
        }

define host {
        use            generic-printer
        host_name      pc3
        alias          pc3
        address        192.168.100.4
        contact_groups admins
        }

```
Dateクラスの使用

#_概要_
・日付に関する複雑な概念を簡単に使用できる様にしたもの
・日付や時刻を出力できる

##_準備_
・requireメソッドで外部からdateクラスを呼び出す

```ruby
require "date"

```

##todayメソッド
・dateクラスで良く使われるメソッド
・自動的に”今日の”日付を算出し出力してくれる

```ruby
require "date"
day = Date.today
#dayという変数に代入する

puts day

#結果 
2020-10-24
```

##_wdayメソッド_
・曜日を日曜日か土曜日の順に１〜６の整数として出力できる。
　日曜日＝０
　月曜日＝１
　火曜日＝２
　水曜日＝３
　木曜日＝４
　金曜日＝５
　土曜日＝６

```ruby
require "date"
day = Date.today.wday

puts day

#結果（日曜日の場合）
０
```

##備考
　（例）
　日曜日と土曜日は　『今日は○○曜日。休みです』　と出力し
　その他の曜日は　『今日は○○曜日。仕事です』　と出力する

###※間違っている箇所や,こうした方が良いなどありましたらよろしくお願い致します

```ruby
require"date"
day = Date.today.wday
wday = ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"]

if day == 6 or 0
  puts "今日は#{wday[day]}。休みです！！"

else 
  puts "今日は#{wday[day]}。仕事です"

end
pecoのコマンド履歴に日付を表示し、かつ日付を貼り付けない

# 概要
・mac/zsh
・history（コマンドの実行履歴）に日付も含めて保存
・pecoを使って、ctrl+rからコマンド履歴を引用する
・日付からも検索したい
・履歴の選択時に日付が貼られると困る
<br>
## historyに日付が記録できていない人
下記を.zshrcに追加し `source ~/.zshrc` してください。

```
precmd='history -a; history -c; history -r' # 履歴のリアルタイム反映
setopt Extended_History           # 日付を保存する
setopt append_history             # 履歴を既存のhistoryに追加していく
setopt EXTENDED_HISTORY           # 開始と終了を記録
```
<br>
## 日付から検索したい
まず、下記のように設定するとhistory自体に日付は入っていても、pecoの検索画面に日付が表示されません。
（日付で検索できない）
参考： [pecoを使って端末操作を爆速にする](https://qiita.com/reireias/items/fd96d67ccf1fdffb24ed)

```
function peco-history-selection() {
    BUFFER=`history -n 1 | tac | awk '!a[$0]++' | peco`
    CURSOR=$#BUFFER
    zle reset-prompt
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818772/4cfe6527-a766-b939-ba30-b2a2b381745b.png)

<br>
「いつのコマンドなのか」も知りたい且つ絞りたいため、「-i」のオプションを追加

```
BUFFER=`history -n 1 | tac | awk '!a[$0]++' | peco`
↓
BUFFER=`history -i -n 1 | tac | awk '!a[$0]++' | peco`
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818772/0ac4829e-2c78-96f4-b7c1-7f61afeaff8e.png)

<br>
一見できたように見えますが、これをそのまま選択すると日付もコマンドとして貼り付けられてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818772/95862c0d-2eb1-7fb6-8c4c-ad8987b66e86.png)

## 解決策
下記に置き換えると↑と同様の表示で、貼り付け時に日付だけ除外できます。
`BUFFER=` 部分で出力された内容から、historyの番号や日付の区切りのスペースを数えて、以降の文字列に加工しています。
※ `awk '!a[$0]++'` は表示から重複を削除するものなので、不要なら削除可

```
function peco-history-selection() {
    local selected_log=`history -i -n 1 | tac | awk '!a[$0]++' | peco`
    if [ -n "$selected_log" ]; then
    BUFFER=`echo $selected_log | cut -d ' ' -f 4-`
    CURSOR=$#BUFFER
    zle reset-prompt
fi
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818772/654f512a-568b-867e-c0b7-84ff428805f2.png)

## 結果
日付からコマンドを検索して貼り付けられるようになりました。
FastAPI vs Vert.x　ベンチマークとか感想とか

AIをAPIにするためにPythonのFWを探していたが、FastAPIに出会って触ってみたらめっちゃ速いし良さそうだったのでプロジェクトでVertxをすでに技術選択していた自分にアチャーってなってる

# ベンチマーク

Rails6が100同時で250req/secぐらいでるサーバーで確認

```
Requests per second:    245.42 [#/sec] (mean)
Time per request:       407.472 [ms] (mean)
Time per request:       4.075 [ms] (mean, across all concurrent requests)
```

OKってテキスト返すだけのサンプルプログラムベンチマーク
FastAPIはgunicorn -> uvicornx4で起動

## 100同時

### Vert.x - Kotlin
```
Requests per second:    3207.38 [#/sec] (mean)
Time per request:       31.178 [ms] (mean)
Time per request:       0.312 [ms] (mean, across all concurrent requests)
```

### FastAPI
```
Requests per second:    2703.43 [#/sec] (mean)
Time per request:       36.990 [ms] (mean)
Time per request:       0.370 [ms] (mean, across all concurrent requests)
```

## 1000同時
### Vert.x - Kotlin
```
Requests per second:    3777.86 [#/sec] (mean)
Time per request:       264.700 [ms] (mean)
Time per request:       0.265 [ms] (mean, across all concurrent requests)
Transfer rate:          1080.97 [Kbytes/sec] received
```
### FastAPI
```
Requests per second:    2746.82 [#/sec] (mean)
Time per request:       364.058 [ms] (mean)
Time per request:       0.364 [ms] (mean, across all concurrent requests)
Transfer rate:          413.10 [Kbytes/sec] received
```

## 10000同時
### Vert.x - Kotlin
```
Requests per second:    3736.25 [#/sec] (mean)
Time per request:       2676.477 [ms] (mean)
Time per request:       0.268 [ms] (mean, across all concurrent requests)
Transfer rate:          1069.07 [Kbytes/sec] received
```

### FastAPI
```
Requests per second:    3524.81 [#/sec] (mean)
Time per request:       2837.034 [ms] (mean)
Time per request:       0.284 [ms] (mean, across all concurrent requests)
Transfer rate:          218.69 [Kbytes/sec] received
```

## 感想
FastAPI良い。。。
* 普通に使う分にはvertxとFastAPIは同程度の速度でしょう。FastAPIくそ速い
* FastAPIはソースコードの量少なくてすむ、すぐかける
* パフォーマンスは実用なら誤差範囲。

FWというより使う言語の好みの問題に収束しそう
私はVertxが好き。
* 動かすまでにIDEがミスをかなり詳しく検知してくれる(静的型付け)
* ディレクトリ構造気にせず作業できる
* プロジェクトの構造を構築しやすい
* Vertxはeventbusとか夢もある

技術選択してしまったポジショントークでVertxを擁護したいけど、FastAPIの良さにはもう文句でない。FastAPIは流行るでしょう。もう流行ってる。VertxはいつまでもマイナーFWです。。

### FastAPI
* APIドキュメントを自動リアルタイム生成
* 開発中はリアルタイムにリロードしてくれるので楽
* webの記事がvertxより充実している印象
* 比べると圧倒的にシンプルでとっつきやすい
* AIとつなぎ込みが簡単(のはず？)なのでPythonでバックエンドは完結できそうな感じある
* だれが書いても同じような見通しの良さのコードになりそう→超重要
* サーバーサイドを薄く、軽く、速く、という最近の流れにマッチしてる感じある
* Docker使えばこちらもデプロイ簡単らしい。
* C10K大丈夫
* sessionは標準では無いっぽいのがAPI特化故か。issueは立ってる

### Vertx
* (Kotlinなら)静的型付けの楽さ。起動しなくてもタイポとか指摘してくれる
* IDEの恩恵をフルに得られる。補完とかリファクタはIDEがある分一日の長の感じある
* fat-jarつかえばデプロイかんたん(Javaいれたらサーバー構築完了の楽さ好き)
* (私は)Kotlin書いてて楽しい
* (OpenAPIのライブラリつかって開発)APIドキュメントはこちらも自動生成っぽいことにはなる
* OpenAPI読み込めるの最高→重要
* ロギングとかのJVM資産ある(これは私がPythonよく知らないだけなのかも。でもlog4jとか便利よね)
* eventbusという夢
* C10K大丈夫
* 実はいろいろ揃っていて他に何も要らない感じはある。sessionとかあるので旧来風にsession cookieで認証維持とかできて楽
* やろうとおもえばSpringすればDIもできる。なんでもできる

### 他のフレームワークとの比較
JVM言語とPythonなのでactixとかとくらべてエンジニアは集めやすそう。業務系なら鉄板SpringBootとか.Net MVCが情報量多くて良さそう。
EnOceanIoTシステム開発コンテストの参加レポート

#EnOceanIoTシステム開発コンテストとは
IoT ALGYAN主催のEnOceanを使ったコンテストで、2020年10月17日にオンラインで審査会が開催されました。
詳しくは[こちら](https://algyan.connpass.com/event/191271/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/893f93a4-b13d-a3cb-75f1-a7af130bcd34.png)

#コンテストに参加した動機
なんといっても開発用のデバイスプレゼントです。
事前に開催された[イベント](https://algyan.connpass.com/event/183265/)に参加することでEnOceanのマルチセンサー＋USBドングルを貰うことが出来ました。これだけで、結構いい金額になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/f8ce92b9-573b-016a-1506-a29e33dfb044.png)

更になんと！審査会優秀者には、EDK400J EnOcean 評価キットが貰えるという。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/ee75800d-ab84-90b4-70a6-00982c401283.png)

ただし、参加だけで高価なデバイスがプレゼントされるというだけに、プレゼントを貰った人は必ず、必ずコンテストに応募すること！という圧は強めでした(笑) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/4a39a4ee-02a2-2b9a-af9d-8e261c23374d.png)


#応募作品：玄関便り
###コンセプト
子どもが学校から帰ってきたのをお知らせしてくれる見守りデバイスです。
EnOceanを使ってドアの開閉を検知して、M5Stackでデータを受信し、Lineに通知を送ってくれます。
細かい内容は[こちら](https://protopedia.net/prototype/1953)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/d89e229b-307e-314e-0775-14122dc9d8d2.png)

###こだわりポイント
* ちょっと見た目を可愛くしたかったので、足を付けてみた
* それっぽく見せたくて、EnOcean受信モジュールをM5Stackの背面に隠した
* あとは、ドアの開閉情報だけですが、宿題が終わったらボタンを押してもらうなど、ちょっと見守りっぽくしてみた

↓それっぽくなるようにM5Stackの後ろに頑張って隠した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/59e73608-5a5a-0563-02eb-9897a84ce724.png)

#コンテストに参加して
結果は残念ながら何も賞は貰えませんでしたが、以前からやりたいと思っていたことを一気に作り上げることが出来ました。なんだかんだ言って、作品が出来上がるのは嬉しいです。あとは、初のオンラインでのコンテスト参加でしたが、十分に楽しむことが出来ました。オンラインだと自分の順番までのんびりしていられると思いきや、ぼーっとしてて忘れるんじゃないかと逆に変なソワソワ感がありました。オフラインだと確実に呼び出されますが、オンラインだと最悪寝ちゃうと誰も起こしてくれない(笑)
ということで、プレゼントを貰って、作品を作って、楽しい審査会に参加して、良いことばかりです。
あとは、ちょっと自分が**「どろぼう」**になってしまうのではないかという不安を常に感じつつ(笑)、日々を過ごして開発さえすれば大丈夫です。

#最後に
EnOceanの受信モジュールがM5Stackのポートにそのまま刺さればどんなに楽なことかと何度も思ったので、ちょっと作ってみることにしました。こちら、ちゃんと動作確認出来たら販売する予定ですので、興味のある人はしばしお待ちを！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/d8369acf-2260-01d7-6102-fa00a43de562.png)
普段 Ruby を使ってない人が Ruby の環境を構築する

## 内容

普段 Ruby を使っていない人向けに Ruby の環境を構築するまでの工程を書く。Ruby プログラムを書く予定はないが、Ruby 製のアプリケーションを利用するために、 Ruby 環境を構築する必要があったのだが、検索しても分かりにくい記事やら明らかに内容が非 Ruby 書いてる人から見ても変なのばっかヒットするので、自分で書く。私は専門家でもなんでもないので、書いた内容の正しさは保証しません。

## Ruby を使っている人が全然書いてくれない前提条件

本当の専門家はおそらくみんな知っているのだろうが、検索でヒットしないのが悲しい。

1. OS に含まれるインタープリタ型プログラミング言語のインスタンス A と開発に使うインスタンス B が同じ A = B だと、B をカスタマイズすると A を含む OS が壊れるので、A ≠ B となるように B を別に用意するのが現代では一般的である。
2. macOS（やその他多くの Unix-like システム） は Ruby を含む。
3. rbenv が Ruby に対して前提条件１を実現するために存在する。
4. Ruby のパッケージ（部品化された Ruby で書かれたプログラム）は gem と呼ばれている。
5. gem を取り扱うプログラムの名前とコマンド名は `gem` である。
6. gem にはそのまま gem 名のコマンドとして呼び出し可能なものがある。
7. プログラム `gem` はパッケージ管理ソフトとしては（おそらく）機能が不十分である（と考えられている）。
8. プログラム `gem` を補完し、パッケージ管理ソフトとするプログラム Bundler が存在する。
9. Bundler は `bundle` という名前の gem であり、呼び出し可能である。
10. コマンド `bundle` を実行すると現在のディレクトリ下の `Gemfile` という名前のテキストファイルの指示に従って様々な gem をインストールし、Ruby 環境を構成する。
11. Ruby アプリケーションは１つの gem として提供される（ものもある）。
12. 高度な Ruby アプリケーションは複数の Ruby アプリケーションの連携で構成される。
13. 高度な Ruby アプリケーションを真面目に取り扱うならば、bundler を利用するのが自然である。

## やること

前提条件を考えると、gem で提供される Ruby アプリケーションを真面目に使うには、

* Ruby
* rbenv
* gem
* bundler

を利用する必要があることが分かる。私は Fish Shell を使っているので、bash や Zsh 利用者とは異なる部分が含まれる。

1. rbenv を Homebrew を通してインストールし、Fish 上で機能するように rbenv に指示された通りに謎の設定コマンドを Fish の設定ファイルに記述する。
2. 最新の Ruby インスタンスをインストールする。
3. インストールした Ruby インスタンスをシェルが呼び出す Ruby インスタンスに指定する。
4. Ruby インスタンスに bundler をインストールする。
5. やんなきゃ動かない謎のコマンド `rbenv rehash` を実行する。

```sh
#! /usr/bin/env fish

brew install rbenv
echo "status --is-interactive; and source (rbenv init -|psub)" >> $HOME/.config/fish/config.fish
rbenv install 2.7.2
rbenv global 2.7.2
gem install bundler
rbenv rehash
```

`rbenv rehash` は必要なのだが、なぜ必要なのかは理解していない。

## Ruby アプリケーションのインストール

1. 私は Asciidoctor で図形を楽に入れられるようにする Asciidoctor Diagram を利用したい。
2. 私は私のユーザースペース全体でこのアプリケーションが機能すればいいので、ホームディレクトリ以下に ファイル `Gemfile` を作成し、そこに、gem の設定を記述し、bundler を動かす。
3. やんなきゃ動かない謎のコマンド `rbenv rehash` を実行する。

```sh
#! /usr/bin/env fish

echo "\
source 'https://rubygems.org'
gem 'asciidoctor'
gem 'asciidoctor-diagram'
" > $HOME/Gemfile
bundle
rbenv rehash
```

こちらも同様に `rbenv rehash` が必要なのだが、なぜ必要なのかは理解していない。

## あとがき

ただアプリケーションが動くようになった過程を書いただけなので、詳しい方の補足・訂正・批判を待っています。
Error: Activity class [Activity名 ] does not exist.解決法

#実機ビルドでエラー発生！

とにかく早くこのエラーを解決したい方の為にまず試して欲しいキーワードを書いておきますので、それをコピペしてググってみてください。簡単に試せる方法からご紹介します。

**1.GoogolePlayStoreのPlayプロテクトを外す**
**2.Clean ProjectをしてAndroidStudioを再起動する**
**3.adb uninstall [パッケージ名] というコマンドを試す**

以下は私のエラー遭遇振り返りです。


バグ修正を反映させるため、実機にあったアプリをアンインストールしていざデバッグ起動しようとしたら突然の拒絶。

```
Error: Activity class [Activity名 ] does not exist.
```

え…？Activityあるよ…？え…？（パニック）


色々と試しましたが最終的に解決に至った方法は…

**GoogolePlayStoreのPlayプロテクトを外す**

信じられないくらい簡単な解決法。

これでもう安心かと思いきや、また同じエラーに遭遇。

GoogolePlayStoreのPlayプロテクトは外されているのに何故だ…！と、思いましたが、最初にたくさん解決方法を検索して試していたおかげで思い当たることがありました。
それは、アンインストールしたアプリが実はまだ完全に消去できていないという可能性。
adbコマンドを使用してアプリを完全に消去してから再びインストールしてみると、ちゃんと実機ビルドに成功しました。

```
% adb uninstall [パッケージ名]
```

adbコマンドを使うためにはパスを通す必要がありますので、設定した記憶がない人はググってみてください。
（ご自身が使っているターミナルがbashかzshかは気をつけてくださいね。私がまだよく分かっていなかった時は、サイトのコマンドをそのままコピペして使っていたので、bash使っているのにzshにパス通してたりしてましたから…）

さて、adbコマンドとは…？という人のために少しだけ解説します。

#adb（Android Debug Bridge）

android開発で実機（orエミュレータ）を使って動作を確認する時、PCから実機（orエミュレータ）を動かせるようにするコマンドラインツールです。つまり、PCとデバイスを繋いでくれる橋渡しの役割を担っているのがadbコマンドというわけですね。
ほとんど使わないような気もしますが、今回のように実機上のどこかにキャッシュが残っていたりしてどうにもいかない場合などには便利です。
先ほどのように、デバイス上のアプリをPCからadbコマンドを送ってアンインストールしたりすることができます。
詳しくは[AndroidDevelopers](https://developer.android.com/studio/command-line/adb?hl=ja)にありますのでこちらをご覧ください。

#おわりに
このエラーが発生する前にも何度かインストールとアンインストールをしていたのに、急に実機ビルドできなくなって驚きました。しかもGoogolePlayStoreのPlayプロテクトを外していない状態で操作できていたので、何故急にadbコマンドを使用しないとアンインストールできなくなったのかは謎です。
しかし、今回のことをきっかけにadbコマンドを知ることができたので勉強になりました。
この記事が誰かのお役に立てることを願います。

この記事の内容に関してミスがあった場合か、私の知識がアップデートされた場合には加筆・修正を行います。
Django Signalsの種類と使い方

#概要
###Signalsとは
データが更新されたり、リクエストが起きた時が起きた時に処理を走らせることができる。
例えば、データが作成されたことをお知らせしたい時や他のデータもついでに作成したい時なんかに便利。

[Django 公式ドキュメント](https://docs.djangoproject.com/ja/3.1/topics/signals/)

###どこに書けばいいの？
公式サイトよると
>Strictly speaking, signal handling and registration code can live anywhere you like, although it's recommended >to avoid the application's root module and its models module to minimize side-effects of importing code.

>In practice, signal handlers are usually defined in a signals submodule of the application they relate to. >Signal receivers are connected in the ready() method of your application configuration class. If you're using >the receiver() decorator, import the signals submodule inside ready().

全く意味は分かりませんが、どうやらサブモジュールに定義するといいらしい。
ってことで`signals.py`を作った！

###種類

何ができるんだろう


| 名前 | 意味 |
|:-:|:-:|
| pre_init  | モデルをインスタンス化した最初  |
| post_init  |  モデルをインスタンス化した最後 |
| pre_save  |  モデルのsave()メソッドの最初 |
|  post_save | モデルのsave()メソッドの最後  |
|  m2m_changed | 中間テーブルの変更 |
|  pre_migrate |  migrateを実行する前 |
| post_migrate  | migrateを実行した後  |
|  request_started | HTTPリクエストを応答した最初  |
|  request_finished | HTTPリクエストを応答した最後   |
|  got_request_exception | HTTPリクエスト中に例外が発生したら  |
|  connection_created | DBの接続が開始されたら  |

[Django 公式サイト](https://docs.djangoproject.com/ja/3.1/ref/signals/#got-request-exception)にはまだいくつか種類があったけど眠い。(現在 AM 2:38)😃😃


#使い方
Djangoに`receiver`を認識しもらうために下準備が必要。
ちなみに今回のアプリケーションの名前は`book`という謎な名前です😃😃😃

###AppConfigに準備

settings.pyにAppConfigを参照しておく😃😃

```python:settings.py
DJANGO_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
THIRD_PARTY_APPS = [
    'rest_framework',
    'django_filters',
]

LOCAL_APPS = [
    'common.apps.CommonConfig',
    'book.apps.BookConfig', # <- こいつ
]

INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
```

app.pyに`signals.py`をimportする必要がある😃😃😃

```python:book/apps.py

from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _


class BookConfig(AppConfig):
    name = 'book'
    verbose_name = _('Book')

    def ready(self):
        try:
            import book.signals
        except ImportError:
            pass

```

ってことで下準備が終わったので、`signals.py`に
どんどん書いていこう~😃😃😃😃

###receiverを書く
`@receiver`デコレータを書いて基本的なのは実行ができる☺️☺️

ってことでサンプルに、`pre_save`の書きかた！！！！

```python:book/signals.py

from django.db.models.signals import pre_save
from django.dispatch import receiver

from .models import Book


@receiver(pre_save, sender=Book)
def sample(sender, *args, **kwargs):
    print(sender, args, kwargs)
```
これでviews.pyとかでモデルオブジェクトを`save()`した最後には
`sample()`が実行される。


```python:book/views.py

class ListBook(APIView):

    def get(self, request):
        b = Book(# ゴニョゴニョいれる)
        b.save()
        return Response('success')
```


ってことで以上になります☺️☺️☺️☺️
Chainerによる機械学習のためのPython学習メモ　13章 ニューラルネットワークの基礎

#What

Chainerを利用して機械学習を学ぶにあたり、私自身が、気がついた点、リサーチした内容をまとめる記事になります。今回は、ニューラルネットワークの基礎を勉強します。

私の理解に基づいて記述しているため、間違っている場合があります。間違いは都度修正するつもりです、ご容赦ください。

#Content
###ニューラルネットワークとは
ニューラルネットワークは、微分可能な変換を繋げて作られた計算グラフ (computational graph) 　を指す。
ここでは、他にセットで知っておくべき用語を紹介する。
ノード・・・入力または（最終）出力　途中途中の演算結果もノードになる（と思われる）  
エッジ・・・ノード間を結ぶ線。状態遷移をみやすくするだけ？
このノードが非常に多いニューラルネットワークを用いた機械学習をディープラーニングというらしい。（やっと出てきました）

### Layer
入力層→中間層or隠れ層（演算過程）→出力層のことを指す。

###構造
中間層のノード数は任意性がある。設計者のセンスが問われる。自分で決めるパラメータをハイパーパラメータという。ニューラルネットワークにはいくつか種類がある。（全結合、畳み込み、再帰型など）


###ニューラルネットワークの計算
入力が与えられたとき、ニューラルネットワークの各層を順番に計算していき、出力まで計算を行うことを、順伝播 (forward propagation) と言います。

####線形変換
入出力の関係式を行列を用いて表現できる場合、線形変換可能

####非線形変換
非線形な入出力も扱いたい場合、線形変換した結果を非線形変換する過程を一個挟むことでニューラルネットワークを非線形なものとして取り扱う。線形→非線形化する関数を活性化関数という。活性化関数はいろいろあるよう。


今回はここまで、次回続きをやります

#Comment
よく実験系、理論系と区別することがありますが、そう遠くない未来に両方理解できる人が絶対必要になると思うから
機械学習独自に勉強して使いこなすと言ってみたら、応援してもらえました。
頑張ろう
Railsのbundle installで見かけないエラーが…それに対する解決法

# はじめに
最近、講義やゼミでの研究も相まってAWS Cloud9でrailsを使う機会が増えている。
そんな中で初めて見たエラーだった。ネットで検索してもいまいち解決法が分かりにくかったので、ここにメモがてら残そうと思う
# 本題
では、どんなエラーが出たのか。以下の様なエラーだ。

```
$ budle install
There was an error while trying to write to
`/tmp/bundler-compact-index-xxxxxxxxx(date)-xxxxxx-xxxxxxx/versions`. There was insufficient space
remaining on the device.
```

ほほう…何だろう。最後の一文を見るとデバイスの容量が足りないという事みたいです。
という事は・・・デバイスのボリューム自体を増やす。もしくは使いそうにないファイルの中身を消去して、空きを作るなどが考えられます。では、前者を解決策１、後者を解決策２としたいと思います。

#### 解決策１
これは、AWS Cloud9のボリュームを増やすという事です。記事がすでに上がっているので割愛したいと思います。
#### 解決策２
では、何処のファイルの中身を消去しようとなりますが、私は/var/logを使う事が今回は無さそうなのでそちらを消去することにしました。その際に使用したコマンドが以下です。

```
$ sudo find /var/log/ -type f -name \* -exec cp -f /dev/null {} \;
```
# 最後に
という訳で、２つの解決策を提示しました。これで、容量が足りるようになると思うので、再度**bundle install**して貰えれば大丈夫です。
恐らくもっと良いやり方もあると思います。最後までお読みいただきありがとうございました。
ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table: main.follows~

フォロー機能を実装するためにUserモデルと中間テーブルのRelationshipモデルを作成。

``` model/user.rb
.
.
  def follow(other_user)
    unless self == other_user
      self.relationships.find_or_create_by(follow_id: other_user.id)
    end
  end
```

こんな感じでfollowメソッドを作り、relation_controllerの該当アクション内で呼び出したところ、タイトルのエラーが出てきた。

テーブルがないと言われているけど必要なテーブルがあることはschemaファイルからも確認できたので混乱。

## 原因
原因としてはrelationshipsテーブルを作るときのmigrationファイルに問題があった

``` db/migrate/time_create_relationships.rb
class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      t.references :user, foreign_key: true
      t.references :follow, foreign_key: true

      t.timestamps
      
    end
    add_index :relationships, [:user_id, :follow_id], unique: true
  end
end
```

こちらのfollow_idカラムを作成する部分、`t.references :follow, foreign_key: true`のforeign_keyがtrueとなっている部分が原因でした。
foreign_keyがtrueになっているとid名と同じテーブルが存在するか、つまりありもしないfollowテーブルがあるかを確認してしまうため、エラーが吐き出されていたようです。

解決法としては該当部分に

``` db/migrate/time_create_relationships.rb

 t.references :follow,  foreign_key: { to_table: :users }
```

と参照するテーブルを記述することで正しく動作しました。

`rails g model relationships follow:references`とターミナルで自動作成されたマイグレーションファイルはデフォルトで`foreign_key:true`となるので気を付けたいところです。
Oracle DBの起動シーケンスの理解 ～後輩にしてあげたいOracleの小話～

# 前置き

Oracleの起動シーケンスは基本中の基本。
これをもう少し掘り下げて、ただの知識ではなく使える知識になるように後輩に話してみました。


# オラクルデータベースの起動状態の遷移
Oracleを使っている人なら以下の4つの状態は誰でも知ってますね。

* SHUTDOWN
    * 何も起動していない停止状態
* NOMOUNT
    * インスタンスが起動している状態
* MOUNT
    * データベースをマウントしている状態
* OPEN
    * データベースを利用できる状態

# どうしてこんなシーケンス？

では、どうしてこんな風に状態遷移して起動するのでしょうか？
1つずつ順を追って説明します。

## SHUTDOWN
インスタンスが存在しない状態。
インスタンスはオラクルの**バックグラウンドプロセス**とそれが確保している**メモリ**を指します。
要はOS上のオラクルのプロセス群です。

## NOMOUNT
処理をするためにはインスタンスを起動する必要があります。
このインスタンスのみを起動した状態がNOMOUNTになります。

インスタンスは前述の通り**バックグラウンドプロセス**と**メモリ**のセットです。

・どれくらいメモリを確保するのか
・どこにログを出す場所
・DBのファイル（正確には制御ファイル）の場所

など、プロセスについて色々指定したいことがあります。それらをまとめたものが**初期化パラメータファイル**です。

プログラムで固定値にすることなく、柔軟にニーズに合った資源割り当てをしたプロセスの起動のために、
初期化パラメータファイルを読み込んでオラクルはインスタンス起動をしています。

## MOUNT
プロセス（インスタンス）が起動すると、そのプロセスで自在にファイルを扱えます。
オラクルだけでなく、コンピュータ全般そいういうものですね。

データベースはインスタンスで扱うデータファイルを指します。
**初期化パラメータファイル**に**制御ファイルの場所**が記載されています。
制御ファイルには**データベースのファイルの場所や停止時のDBの状態など**が記されています。

起動したプロセスが指定されたデータファイルをすべてつかむところまで完了するとMOUNT状態になります。

## OPEN

ファイルをつかんだら制御ファイルの情報とデータファイルの状態を比較します。
ここで制御ファイルとデータファイルの間に不整合がないことが確認できるとOPEN状態になります。

不整合を解消（リカバリ）をしないとOPENはできません。

#状態遷移に着目してまとめ

状態にフォーカスして説明するのが一般的ですが、
私は状態遷移をベースにして理解をしています。

こうすることで、トラブルが起きた時にどこを調べるかがとらえやすくなるからです。

## SHUDTOWN ⇒ NOMOUNT
* 初期化パラメータファイルを読み込んでインスタンスを起動を完了させる。
* ここで失敗するケースは以下が考えられる
    * 初期化パラメータファイルが見つからない
    * 初期化パラメータファイルの設定が誤っている
    * プロセス起動やメモリ割り当てのためのOSリソースの不足

## NOMOUNT ⇒ MOUNT
* 初期化パラメータファイルから制御ファイルを探し、制御ファイルからデータベースファイルをつかむところまで完了させる。
* ここで失敗するケースは以下が考えられる
    * 初期化パラメータで指定した場所に制御ファイルがない
    * 制御ファイルが破損している
    * 制御ファイルに指定されているデータファイルがない

## MOUNT ⇒ OPEN
* データファイルをチェックして問題なければ全てのユーザにDBを開放する。
* 前回のDB停止がクラッシュの場合クラッシュリカバリ（主にコミットしていない更新のロールバック）を行う。
* 問題がある場合には自動ないしはDBA作業でリカバリをして起動させる必要がある
* ここで失敗するケースは以下が考えられる
    * データファイルの不整合
    * 不整合の解消に必要なREDOログ/アーカイブログがない
    * DBリストアをしたため、リカバリ（障害直前までのアーカイブログの適用）が必要

それぞれのシーケンスで何をするかを覚えておくことは障害調査に必須です。
是非整理して覚えておきたいですね。


#
何故 Safari は厄介かと，その対処法一覧

## 背景

- iOS（iPhoneOS/iPadOS）では，AppleWebKit つまり Safari に基づいたブラウザしか認められていない．
- これは iOS 14 でデフォルトのブラウザが変更可能になっても変わらず．
- そしてこれらの端末を使用している個体は地球上に大変多い．
- 従って，Safari に対応していない Web アプリは iPhone の Chrome/Firefox 等でも動かないことになり，使いものにならない．

## Safari の何が駄目なの？

Safari は例えば，以下の技術に対応していません：

- SharedWorker → Safari 16 で対応
- WebComponent Custom Element の継承
- ~~BroadcastChannel~~
- **iOS/iPadOS に於ける通知**
- iOS/iPadOS 上の非Safariブラウザ (WkWebView) に於ける ServiceWorker

然も，これらの不備への開発チームの対応をみるに，あるいは Google が WebKit から離脱した経緯も考えるに，これからも彼らの技術的限界ないし問題からサポートが限定を受ける技術は多かろうと予想します．あゝ大変．

## 我〻は如何にすべきか

### CustomElements の継承

これはあきらめて，統べて既存要素から継承しない独自の要素で構成するしかありません．

### BroadcastChannel

:::note info
Safari 15.4 から対応しました。
:::

これは，Web Worker 内から使用しないのであれば，LocalStorage 及び StorageEvent で簡単にそれっぽいものを作ることができます．

### SharedWorker

:::note info
Safari 16 から対応しました。
:::

WebSocket 接続を維持したり，共有の重い計算をするのにはとても重宝する機能ですが，限定的にエミュレートするしかありません：

- 最初に開いたタブなりで Dedicated Worker を走らせる．
- 上記の偽 BroadcastChannel でタブ間通信を行い，Worker が走るタブが消えたら別の誰かが開き直す．

### iOS/iPadOS に於ける通知

Push API にも Web Notifications API にも対応していません。App Store にて管理される非Webアプリを優先したいと云う思惑が感ぜられます。

### iOS/iPadOS 上の非Safariブラウザ (WkWebView) に於ける ServiceWorker

ServiceWorker が動作しない環境は，他にも Firefox のプライベートウィンドウなどがあるので，なるべく ServiceWorker が動作することがクリティカルな要件にならない様アプリケーションを設計するべきでしょう。どうしても必要な場合，iOS では Safari を使うように案内するなどが考えられます。

## 最後に

他にも Safari で困ることがあったり，解決法を見つけたりした方は，Twitter [@chaankhoong](https://twitter.com/chaankhoong) まで仰ってください．
Twitter Botで引用RTをするときにつまづいたメモ

#はじめに
今回が人生初、Qiita投稿となります。
仏のような心をもってこの記事を読んでください。
間違っていたところがあれば指摘していただけると嬉しいです。

#何が起こった？
学校にて、そのあまりにもの授業の面倒くささから午後だけ休み、プログラムを書いてやろうと思い、工業力学と英語の授業にバイバイしました。

そこで前々から作りたかった「自分がその日コミットしていなかったら#contributter_reportの自動ツイートを利用して自分を煽り散らすTwitter Bot」を作ることにし、その中で引用RTをしたいと思い、調べてみましたが公式のドキュメントにもググってもなかなか出てきません。
そこでやっと見つけたので、僕と同じような人がいたらググって検索結果に出てきやすいようにQiitaの記事を書くことにしました。

#引用RTをする方法
これは周知の事実で僕だけが知らなかったとしたら非常に恥ずかしいのですが、
引用RTは **引用RTにそえる文字と同時に引用元のツイートのURLをツイートする**だけでできます。

例として下のツイートを引用RTとすると、このツイートのURLをコピーし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307792/9d90958b-acdf-327e-599e-989ccdf44bdd.png)
引用RTするテキストと一緒に引用元のツイートのURLを貼り付けてツイートするだけで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307792/997639a1-8487-3e1e-6706-6622a7b362f1.png)
この様に引用RTすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307792/04de21b1-ca82-6e54-6fdc-a317288561b2.png)

#サンプルコード
別ファイルのkey.pyにAPIkeyやアクセストークンを設定していて最初にimportしています。

```python
import tweepy
from key import CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET

auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN_KEY,ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

tmp = 'https://twitter.com/genshi0916/status/'
for tweet in tweepy.Cursor(api.search, q='genshi0916 contribution 0').items(1):
  text = tweet.text
  id = tweet.id

  try:
    print(text)
    print("contribution数:0ってどういうことですか?????????????進捗出してください\n" + tmp + str(id))
    api.update_status("contribution数:0ってどういうことですか?????????????進捗出してください\n" + tmp + str(id))

  except:
    print('error')

```
tweet.idでツイートのidを取得し、tmpにツイートID以外の部分（今回はgenshi0916のツイートのみに反応するbotなので'https://twitter.com/genshi0916/status/' となっています。）

ユーザー名はこのソースのままでいくと、    

```python
user_name = tweet.user.screen_name
```
など追加しその次の行にtmpを移動させ下のようにすると良いと思います。

```python
tmp = 'https://twitter.com/'+user_name+'/status/'
```
#まとめ
引用RTは**文字と引用元のツイートのURLをツイート**！！！！！！


この記事が誰かの助けになってくれたら嬉しいです。
Twitter BotでよきTwitterライフを！！！

ソースはGithubで公開しているのでurlを貼っておきます。
https://github.com/Genshi0916/genshi-contribution-check

#参考文献
* https://kurozumi.github.io/tweepy/
* https://teratail.com/questions/24370
数値について

#数値

**数値は、数を表現する値です。文字列とは異なり、計算などを
行うことができます。**

数値は文字列とは違って、**<font color="Red">ダブルクォーテーション"</font>**や
**<font color="Red">シングルクォーテーション'</font>**も必要ありません。
以下は数値を使った数の表し方の例です。


```java:【例】Rubyファイル
# 整数
10

# 負の値
-10

# 小数
3.14
```


数をダブルクオーテーションで囲むと数値ではなく文字列として扱われてしまいます。
プログラミングでは文字列の"10"と数値の10は別物です。数値は計算ができますが、文字列は計算ができません。

#irbで以下のコードを実行してみましょう
irbでRubyの数値を記述し、実行してみましょう。

```java:irb
# 数値を書いてエンターキーで実行
irb(main):001:0> 12345

# 続けてこのように表示されれば成功
=> 12345
```

#まとめ

**数値とは、数を表現する値のこと。**

#####以上。
【Rails】deviseの導入

度々忘れてしまうのでメモ

# 1.deviseとは
Rubyのgemの1つ
ログイン機能の実装を簡単にしてくれる

# 2.インストール方法
Gemfileに追記

```PHP:Gemfile
gem 'devise'
```

Gemのインストール

```:ターミナル
$ bundle install
```

# 3.deviseの設定ファイル作成
devise専用のコマンドで設定ファイルを作成する。

```:ターミナル
$ rails g devise:install
```

# 4.Userモデルの作成
アカウントを作成するためのUserモデルを新しく作成する。

```:ターミナル
$ rails g devise user
```
モデルとマイグレーションの生成やルーティングの設定などをまとめて処理してくれる。

# 5.テーブルの作成
4で自動生成されたマイグレーションファイルを使用して、テーブルを作成する。

```:ターミナル
$ rails db:migrate
```

#6.devise用のビューを作成


```:ターミナル
$ rails g devise:views
```
【HTML】404ページを作成する方法

#プログラミング勉強日記
2020年10月24日
404ページをカスタマイズする方法を初めて知ったのでまとめる。

#404ページとは
　まず最初に404ページについて説明する。

- 削除されたページにアクセスしたとき
- 間違ったURLを入力したとき

　404ページは上記のように存在しないページにユーザがリンクしたときに表示されるエラーページのこと。サーバーにアクセスしたときの表示が404で処理されるので、404ページと呼ぶ。

Googleの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/18c02d58-d5a6-df13-7173-1971efdf9660.png)

GitHubの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/cd74c41e-4d60-e773-d333-4c8bc0b797e9.png)

#オリジナル404ページに記述する内容
　オリジナル404ページを作るポイントを紹介する。

- サイトのデザインと統一性を持たせる
- 次の行動を促すようにする

　例えば他のページが青を基調にしているのに対して404ページが赤を基調とすると統一性がなくなってしまう。なので、Webサイトのデザインと合わせることで唐突にエラー画面を出されたときに混乱を防ぐことができる。
　「ページが見つかりません」だけではユーザがどうすればいいかわかんなくなってしまうので、ページのサイトマップを入れたり、サイト内検索をできるようにしたり、ユーザに次の行動を促す必要がある。

#オリジナルの404ページを表示させる方法
　`.htaccess`を使用する。`.htaccess`のファイルを作成して、404状態のときにどのページを表示するかという設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/769ef5dd-62ba-80ab-28d0-f6dbfb9bdf87.png)
　上の図のようにルートディレクトリに404.htmlを設置し、`.htaccess`に以下を記述する。

```:.htaccess
ErrorDocument 404 /404.html
```
　表示させるページのパスはルートパスで記述する。


#参考文献
[HTMLで404ページの作成方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/32143)
[オリジナルな404（Not Found）ページの正しい作り方](https://www.granfairs.com/blog/staff/howto-create-404page)
WordVBA 現在の位置にフィールドコードで全角和暦で日付を挿入あるいは曜日付きで挿入 Insert Field Code byte Char And Jp Era with Weekday

```vb
Sub InsertFldWggge年M月d日()
'For Word VBA
'ドキュメントの現在のカーソルの位置に全角、和暦で日付を挿入します。フィールドコードを使います。
Dim DT As Date
On Error Resume Next
DT = CDate(InputBox("全角和暦ggge年M月d日形式で日付を挿入します", "フィールドコードで日付を挿入します", Date))
If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description: Err.Clear: Exit Sub

    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "MERGEFIELD """ & Format(DT, "yyyy\/M\/d") & """ \@""ggge年M月d日""  \* DBCHAR ", _
        PreserveFormatting:=True
 ActiveDocument.Activate
End Sub
```

##全角和暦日付曜日
平成２８年５月１日（日）のように和暦、全角、日付ありで現在の位置に挿入します。
かっこも全角になります。

```vb
Sub InsertFldWggge年M月d日_aaa_()
'For Word VBA
'ドキュメントの現在のカーソルの位置に全角、和暦で日付を挿入します、フィールドコードを使います。
Dim DT As Date
On Error Resume Next
DT = CDate(InputBox("全角和暦曜日つきで日付を挿入します", "フィールドコードで日付を挿入します", Date))
If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description: Err.Clear: Exit Sub

    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "MERGEFIELD """ & Format(DT, "yyyy\/M\/dd") & """ \@""ggge年M月d日(aaa)""  \* DBCHAR ", _
        PreserveFormatting:=True
 ActiveDocument.Activate
End Sub
```

###かっこは半角
フィールドコードを2つ作ります。VBAを使うと可能です。

```vb
Sub InsertFldWggge年M月d日aaaWithHalpParenthes()
'For Word VBA
'ドキュメントの現在のカーソルの位置に全角、和暦で日付を挿入します、フィールドコードを使います。かっこParenthesは半角です
Dim DT As Date
DT = CDate(InputBox("全角和暦曜日つきで日付を挿入します。曜日のかっこは半角です", "フィールドコードで日付を挿入します", Date))
If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description: Err.Clear: Exit Sub

    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "MERGEFIELD """ & Format(DT, "yyyy\/M\/dd") & """ \@""ggge年M月d日""  \* DBCHAR ", _
        PreserveFormatting:=True
    Selection.TypeText Text:="("
      Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "MERGEFIELD """ & Format(DT, "yyyy\/M\/dd") & """ \@""aaa""  \* DBCHAR ", _
        PreserveFormatting:=True
    Selection.TypeText Text:=")"
    
End Sub
```

##フィールドコードの日付はフィールドコードを表示させるか非表示を切り替えることで西暦と和暦で検索できる
フィールドコードで日付を挿入するのはVBAを使っても楽ではありませんが、強力な利点があります。それはフィールドコードを表示させていると西暦で、フィールドコードを表示させないと和暦で検索します。
今、すべてのフィールドコードが結果を表示しているとすると、次のVBAですべてコード表示になります。またフィールドコードのコードが表示されていれば、今度はコードが隠され、結果だけが表示されます。
これにより日付は西暦と和暦の両方でチェックすることができます。

```vb
Sub ToggleShowCodeOfFieldCodesInDocument()
' For Word VBA
' Documentのすべてのフィールドコードについてコード表示させるかどうかを反転させる
Dim wDoc As Document: Set wDoc = ThisDocument
Dim fc As Field, i As Long
If wDoc.Fields.Count > 0 Then
For i = wDoc.Fields.Count To 1 Step -1
Set fc = wDoc.Fields(i)
fc.ShowCodes = Not fc.ShowCodes
Next
End If
End Sub
```

## 余談
なおフィールドコード内の日付は全角`２０１８／２／８` でも成功します。どうもCDateのような効果を持っているようです。
MySQLクエリログの見方

#前提
MySQLにおけるクエリログの見方を忘れがちなのでメモします。

MySQL8
#本題
MySQLのクエリログは**general_log**と言う設定をONにすることにより、
すべてのクエリをログに吐かせることができる。

まずは、general_logの設定確認。

```
mysql> show variables like 'general_log%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | OFF                             |
| general_log_file | /var/lib/mysql/2a4a9fa16d2e.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)
```
デフォルトでは恐らくOFFになっているため、ONに変更します。

```
mysql> set global general_log = on;
Query OK, 0 rows affected (0.02 sec)
```

確認。

```
mysql> show variables like 'general_log%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | ON                              |
| general_log_file | /var/lib/mysql/2a4a9fa16d2e.log |
+------------------+---------------------------------+
2 rows in set (0.01 sec)
```

試しにクエリを投げてみます。

```
mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.01 sec)
```

```
$ cat /var/lib/mysql/2a4a9fa16d2e.log

2020-10-24T00:00:00.278525Z    19 Query show variables like 'general_log%'
2020-10-24T00:00:00.802232Z    18 Query select 1
```

※ログの分だけディスクを食うので注意。
python:3.8-alpineでException: you need a C compiler to build uWSGIエラーへの対処

Dockerのイメージ作成の際に、
python:3.8-alpineで、Exception: you need a C compiler to build uWSGI エラーが出た場合の対処方を記載


１.以下の記述だとエラーになる
（Exception: you need a C compiler to build uWSGI）

```:dockerfile
FROM python:3.8-alpine

RUN addgroup -S uwsgi && adduser -S -G uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI
```

2.以下の文でgccを追加する
RUN apk add gcc build-base linux-headers

```:dockerfile
FROM python:3.8-alpine

RUN apk add gcc build-base linux-headers
RUN addgroup -S uwsgi && adduser -S -G uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI

```



以上
ReactでPropsからHタグのレベルを変える。

👇のようにPropsからHタグのレベルを制御したいとします。

```jsx:例
<H level={1} /> // = <h1 />
<H level={2} /> // = <h2 />
<H level={3} /> // = <h3 />
<H level={4} /> // = <h4 />
<H level={5} /> // = <h5 />
<H level={6} /> // = <h6 />
```

React.ElementTypeにキャストすることで文字列からHTMLの標準タグを作ることができます。

```jsx:解決法
function H(props) {
    const Header = `h${props.level}` as React.ElementType;
    return <Header />;
}
```
catalinaにした途端git pullができなくなった


git pullしたら、

```
git: error: unable to locate xcodebuild, please make sure the path to the Xcode folder is set correctly!
git: error: You can set the path to the Xcode folder using /usr/bin/xcode-select -switch
```

とかでた。

ああ、最近MacのOSアプデしたなと。

色々やったのですが、そもそもXcodeがインストールされてなかったので、
**AppStoreからXcodeをインストールしたら治りました。**
[OutSystems]Screenを帳票作成に使用する方法（UltimatePDF）

Forge上にあるコンポーネント「UltimatePDF」を使うことで、Screenの表示結果をPDFとして出力できます。帳票作成に使えます。

ただし、Traditional Webのコンポーネントなので、ScreenもTraditional Webのもの。Reactive Web Appからダウンロードさせたければ、ブラウザ内の別タブとして開く、などの対応が必要。

そのUltimatePDFの簡単なチュートリアルを書いてみます。

# 環境
Personal Environment(Version 11.9.0 (Build 16900))
Service Studio (Version 11.8.11)
UltimatePDF (Version 2.1.0)

# チュートリアル
## モジュールと参照
Traditional Webのモジュールを用意してください。
参照は、以下の通り、UltimatePDFの全Web Blockを追加しておきます。

![qUltimatePDF0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5df14016-158f-1d25-e6ca-d297196839dd.png)


## 画面はテンプレートから作成する
### 作成手順
UltimatePDFにScreen Template「PDF Report」が付属しているので、これをベースに画面を作ります。

1. UI Flowを選択し、右クリック
2. Add Web Screenを選択
3. 「PDF Report」テンプレートを選択して「CREATE SCREEN」ボタンをクリックして画面作成

![qUltimatePDF1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9b179c37-ee5a-8793-5c69-5c5a0862ec73.png)

## 作成したページの構造
このテンプレートから作った画面のWidget Treeは以下のようになります。
![qUltimatePDF2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/275007a8-51df-5f92-6695-b21421f9eb9e.png)

UltimatePDFが提供する2つのWeb Blockで画面が構成しています。

- PrintLayout：印刷用のヘッダ・本文・フッタ構成。余白をパラメータで指定できる
- ScreenToPDF：このWeb Block内を置くと、画面アクセスと同時に画面をPDFに印刷してダウンロードしてくれます

### Previewパラメータ
テンプレートから作った画面にはデフォルトで入力パラメータPreviewがあります。
この値をTrueにすると、画面にアクセスしたときに自動でPDFがダウンロードされなくなります。
その状態でもブラウザの印刷機能を使えば、ヘッダ、改ページ、フッタが適用されたPDFが作れます。

## 帳票用画面のコンテンツを作成する
作成中は画面のPreviewのDefault ValueをTrueにしておくと、ブラウザ上で表示を確認できます（やっておかないと毎回PDFファイルをダウンロードすることになる）。

ここでは、動作確認なので非常に簡単に以下の構成にします。
### ヘッダに固定のテキストを表示
各ページのヘッダ部分にテキストを表示するには、そのコンテンツをHeader Placeholderに配置します。

![qUltimatePDF3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7fc6a36c-12b0-4334-5797-9510a5075c45.png)

上の例では、ユーザー名と実行日時をだしています。
誰がいつ出したかを後で確認できるようによくあるやつです。
サポートに問い合わせするときにこれが出ていると、ログを追いかけるのが楽ですね。

### 本文は改ページを挟んで２ページ出力する
任意の場所で改ページを行うには、改ページしたい場所にPagination\PageBreak Web Blockを配置します。

本文は、MainContent Placeholderに配置です。
![qUltimatePDF4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/261e099a-bb7b-9f44-ac73-61078126d04e.png)

上の配置では、１ページ目の左上に数字の1、2ページめの左上に数字の2が出力されます。

### フッタには、「現在のページ / 総ページ数」
現在のページを表すには、PageNumbers\PageNumber Web Block、総ページ数はPageNumbers\PageCountを表示したい場所に配置してください。

![qUltimatePDF5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1b9c725a-3af9-6403-f5ab-44fa2e7fc2d3.png)

## 動作確認
画面作成が終わったら、Preview入力パラメーターのDefault ValueをFalseに戻して該当画面にアクセスします。

ScreenToPDFの機能によってアクセスすると直ちにダウンロードが起こり、（設定にもよるかもしれませんが）ブラウザのダウンロードダイアログが開きます。

1ページ目のスクリーンショット
![qUltimatePDF6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2f7d814d-4474-728b-ca98-8a411632378e.png)

ページサイズはA4です。
これは、PageLayout Web BlockのPaperSizeパラメータで指定するのですが、デフォルトがA4であるため。

余白サイズも変更できて、MarginSizeを指定します。
【RSpec】コントローラーのインスタンス変数をテストで使いたいとき【assignsは非推奨】

Rails 5 から assigns（assert_templateも）が非推奨になりました。
一応、コントローラーテスト自身はdeprecatedになっていないのでassignsは使えるのですが、rails-controller-testingというgemをインストールする必要があります。

しかし、これはあくまでも既存のプロジェクトに対する救済策で、新規のプロジェクトでassignsを使うことは推奨できません。（ぶっちゃけ理由はわからないです。わかる方いれば教えて下さい :pray: )

↑ @jnchito さんからコメント頂きました。ありがとうございます！
簡単に言うと、Railsの生みの親が、「やめよう」といったからです。（鶴の一声？？）
詳しく知りたい方はコメント欄をご覧ください :smile: 

代わりに、

```
controller.instance_variable_get("@hoge")
```

というのを使うことでインスタンス変数を取得することができます。

#コード例
最近書いたパスワードリセット処理のテストを一部抜粋してきました。

```ruby:password_resets_request_spec.rb
RSpec.describe 'PasswordResets', type: :request do
  let(:user) { create(:user) }

 describe 'パスワードリセット編集画面へのアクセス' do
    context '不正なメールアドレスだったとき' do
      it 'userはパスワード再設定ページへリダイレクトされること' do
        post password_resets_path, params: { password_reset: { email: user.email } }
        user = controller.instance_variable_get('@user')
        get edit_password_reset_path(user.reset_token, email: '')
        expect(flash[:danger]).to be_truthy
        follow_redirect!
        expect(request.fullpath).to eq '/password_resets/new'
      end
    end
```

↑のコードではreset_token属性にアクセスしたかったので、そのためにcreateアクションの@userというインスタンス変数を取得しているといった感じです。

また、こちらはもっといい書き方がある(システムスペック)ことを、 @jnchito さんから教えていただいたので、後日こちらに追記していきたいと思ってます！

#最後まで読んでいただきありがとうございます！
最近個人開発のアプリのデプロイに必死で、少し短いです :pray: 
デプロイ完了したら、また記事をがっつり書いてこうと思ってます！！よろしくお願いいたします。
Node.jsを使ってコマンドライン引数を取得する

コマンドラインから引数を取得するには``process.argv``を使用する。

```javascript:test.js
console.log(process.argv)
```

出力結果

```
$ node playground/test.js a a a a a a a
[
  '/usr/local/bin/node',
  '/Users/yutakaf/Desktop/git/weather_app/playground/test.js',
  'a',
  'a',
  'a',
  'a',
  'a',
  'a',
  'a'
]
```
process.argv0の元の値にアクセスするargv[0]必要があるかどうかを確認します。
2番目の要素は、実行中のJavaScriptファイルへのパスになります。
残りの要素は、追加のコマンドライン引数になります。

process.argv[2]から引数になることに注意しましょう。

### 環境
```
$ node -v
v12.18.4
```
JavaScript ES6での書き方ということが言いたかった。

### 引数をたくさん取得する場合
引数が可変する場合には下記のように要素を取得できる。
forなら下記のように、

```javascript:test.js
for(var i = 0;i < process.argv.length; i++){
  console.log(`argv[${i}] = ${process.argv[i]}`);
}
```

mapを使うともっとスマートに書ける。

```javascript:test.js
process.argv.map((v,i) => console.log(`argv[${i}] = ${v}`))
```

出力結果

```
$ node playground/test.js a a a a a a a
argv[0] = /usr/local/bin/node
argv[1] = /Users/yutakaf/Desktop/git/weather_app/playground/test.js
argv[2] = a
argv[3] = a
argv[4] = a
argv[5] = a
argv[6] = a
argv[7] = a
argv[8] = a
```

### コメント
作業中に思い出せなかったこと、ちゃんと仕様を調べようと思ったのでまとめてみた。

### References
[process.argvのドキュメント](https://nodejs.org/docs/latest/api/process.html#process_process_argv)
[Node.jsでコマンドライン引数を取得する]
(https://qiita.com/furusin_oriver/items/f030d1eaa9e7b54233c3)
yukicoder contest 271 参戦記

# yukicoder contest 271 参戦記

## [A 1264 010](https://yukicoder.me/problems/no/1264)

010 は 010 → 101 と1回操作ができ、0100 は 0100 → 1010 → 1101 と2回操作ができ、01000 は 01000 → 10100 → 11010 → 11101 と3回操作できの辺りで答えが分かる.

```python
N = int(input())

print('01' + '0' * N)
```

## [B 1265 Balloon Survival](https://yukicoder.me/problems/no/1265)

N≦1000なので*O*(<i>N</i><sup>2</sup>log<i>N</i>)でもギリギリなんとかなるので、全組み合わせの距離を出して、小さい順に並べて消滅をシミュレートしていけばいい. 既に消滅した風船は記録しておいて、それの衝突が来たらスキップ. 1番目の風船と衝突する風船の数が答え.

```python
N = int(input())
xy = [tuple(map(int, input().split())) for _ in range(N)]

a = []
for i in range(N - 1):
    for j in range(i + 1, N):
        d = (xy[i][0] - xy[j][0]) * (xy[i][0] - xy[j][0]) + (xy[i][1] - xy[j][1]) * (xy[i][1] - xy[j][1])
        a.append((d, i, j))
a.sort()

result = 0
t = set()
for _, i, j in a:
    if i in t or j in t:
        continue
    if i == 0:
        result += 1
        t.add(j)
    else:
        t.add(i)
        t.add(j)
print(result)
```
AWSとネットワーク（基礎）

# はじめに
AWSはAmazon Web Servisesの略で、Amazonが提供しているクラウドサーバーのサービスです。
AWSへの理解度を高めるために、学んだことをアウトプットします。
今回はネットワークとの関係を記載します。


# AWSを使う目的
AWSを使う目的は、簡単に言うとネットワークやサーバーを構築する手間を省くためです。
ネットワークやサーバーを構築するには、インターネット回線や複数のサーバー、接続するためのハブやルーターなどのネットワーク機器の用意が必要です。
AWSを使うことで仮想的なネットワークやサーバーを構築することが可能です。


# リージョンとアベイラビリティーゾーン

* リージョン
AWSでは世界に数十箇所のデータセンター群があり、それぞれの地域に存在するデータセンター群のことをリージョンと言います。

* アベイラビリティゾーン
アベイラビリティゾーンとはリージョンをさらに分割したものです。
アベイラビリティゾーンはそれぞれ独立した設備を用いているため、一つのアベイラビリティゾーンが災害などの被害を受けて使用できなくなっていても、別のアベイラビリティゾーンには影響を受けないようになっています。


# Amazon VPC

AWSにて自由なネットワークを作れる領域です。
Amazon VPCを作成する時は、使用するIPアドレス範囲を指定します。

* サブネット
Amazon VPCを作成した後、いくつかのネットワークに分割して使用します。
この分割したネットワークのことをサブネットと呼びます。

* Amazon EC2 (Amazon Elastic Compute Cloud)
サブネットの中に配置できるサーバー。
各サーバーの個体は**インスタンス**と呼ばれます。
インスタンスを作る時はCPUのスペックやディスクの容量を決めることができます。
尚、１年間無償利用できるタイプは「t2.micro」


# 参考
「Amazon Web Services 基礎からのネットワーク＆サーバー構築」
著者：大澤文孝、玉川憲、片山暁雄、今井雄太

# 最後に
本投稿が初学者の復習の一助となればと幸いです。
【Bubble】入力された数字をすべて半角で取り込む

# はじめに
現在構築中の予約フォームサイトで、電話番号入力欄を用意しているのですが、Inputエレメントの"Content format"を「Text(numbers only)」にしてみたところ、数字のみの入力にはなったものの半角全角の両方が許可されてしまいました。
半角に統一したかったので、入力を半角のみにする方法を探しましたが、自分では見つけられませんでした。
そこで、データベースに取り込む際に全角数字を半角数字にしてしまおう、と考えました。

# やりたいこと
半角、全角のどちらで入力された数字も半角数字でデータベースに取り込みたい。

# 悩んだこと
半角⇒全角、全角⇒半角にするものが標準では用意されていなさそうでした。
（大文字⇒小文字、小文字⇒大文字というのはできそうでしたが）

# 解決方法
上手いやり方が見つからなかったため、0～9までの各数字について、「０⇒0」というように一文字ずつ置換することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802620/dad18fd7-d087-aa18-833d-ba8ad863e991.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802620/f81c370f-d3cc-d1e3-53de-e6651bd016dd.png)

あまりにもスマートじゃなさ過ぎて、これでいいのか…？と悩んでしまいます。
うーん、でも簡単に変換してくれるような関数用意されてないしなぁ。
入力も半角しか受け付けないようにできないのかなぁ。
とりあえずやりたいことはできているし、高々電話番号の数字の桁数の置換なので処理負荷は大したことないと思うので、これで進めてみます。
【PHP】FizzBuzzをカンマ&スペース区切りで出力できますか？

#本記事の内容
FizzBuzzのちょっとしたアレンジ

#要件
・１〜４０までの数字を出力
・ただし3の倍数なら、その数字は"Fizz"と出力
・ただし5の倍数なら、その数字は"Buzz"と出力
・ただし3の倍数かつ5の倍数なら、その数字は"FizzBuzz"と出力
・ただし、各数字の間に、カンマ　と　半角スペースを設けること

# 期待値
```
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, FizzBuzz, 31, 32, Fizz, 34, Buzz, Fizz, 37, 38, Fizz, Buzz
```
#ポイント
**最後の数字(この場合はBuzzという文字)の後ろに、カンマと半角スペースを入れないようにするには？**

#答えの一例（ちょっとだけでも考えたうえで、ご覧ください）

```PHP

$data = 40;

for($i = 1; $i <= $data; $i++){
    if($i % 15 == 0){
        echo "FizzBuzz";
    }elseif($i % 3 == 0){
        echo "Fizz";
    }elseif($i % 5 == 0){
        echo "Buzz";
    }else{
        echo $i;
    }
    
    if($i < $data){
        echo ", ";
    }

}

```

#ひとこと

・数字だけでなく、カンマと半角スペースも、for文で出力する要素とみなして、
かつ繰り返し回数が最終回でない限り出力する、ということでした。
頭の体操でもになれば幸いです。

#この記事を書いた人
現役エンジニアです。よければツイッターフォローお願いいたします。
自分含め、エンジニアで頑張っている人を褒めて、励ますようなツイートを心がけています。
https://twitter.com/ohara5555
HTMLを読み込んでからJSが読み込まれるようにする方法

#はじめに
　少し苦手意識のあるJSでエラーが出たので、忘れないために…


##コードは合っているのに、エラーが出た
JSとHTMLは切っても切れない関係。
HTMLを読み込み、JSが読み込まれることで、JSがしっかりと動いてくれる。
そう、逆だと動かない。
JSを読み込み、HTMLを後から読み込むと、エラーが出る。考えればわかることだが、JSでは`getElementById`などで、HTMLに記述されているid名を読み出す。
HTMLを読み込んでから、JSが読み込まれるように、次の記述をJSにする。

```javascript

window.addEventListener('load', () => {
　//処理をここに記述
});
```

コードの意味は、「ページをloadしたら、イベントを発火させる」
基本これを忘れずに、最初に記述しておく。
Railsに動画を挿入する方法

#railsに動画を挿入する方法
#結論
```java:index.html.erb
<%= video_tag "earth.mov", class: "landing_video", loop: true, autoplay: true, muted: true %>
```
##<font color="blue">earth.mov</font>の箇所はそれぞれご自身で好きな動画をこちらに当てはめてください。
##基本的にmp4でもmovでも形式は問われないと思いますが、UIを考えたときにあまり容量の大きすぎるものだと使い勝手が悪くなってしまうと思うのでその辺りはお気をつけて！
#現場からは以上です！
お名前ドットコムで取得したドメインが急に使用出来なくなった時



デプロイで使用しているのは、RDS、EC2、route53です。
今回、ターミナルでコマンド `dig 取得したドメイン`でstatusを確認したら
 <font color="red">status: NXDOMAIN</font>が見つかり、これを解決するために一日かかりました。

急に使えなくなった場合の解決策は、
①IPアドレスでアクセスできるか確認する。

IPアドレスでアクセスできた場合、下記の内容確認。
①お名前ドットコムにログインし重要なお知らせが来ていないか確認する。
②メールに重要メールが届いていないか確認する。

私の場合は、メールに
20xx年xx月xx日12:00までに登録情報の修正をお願いします。と届いていたのですが
それに気づかずに指定の日付を超えてしまった為、ドメインが使用できなくなっていました。
登録情報を修正したら、3日後ぐらいにドメインが使用できるようになりました。
お名前ドットコムからのメール多い....

[digコマンドの説明](https://dnsops.jp/event/20120831/dns-troubleshoot-2.pdf)
【fish】Mac ターミナル上でカウントダウンタイマー

###こんな感じ

```
#入力値調整
read -P "How many minutes? >" input;
set error_message "--------------------------------------"\n"please set numbers 1 ≦ [input] ≦ 120!!"\n"--------------------------------------";
set input_time (expr $input - 1);
​
#このタイマーは1分未満を測れません！
​
if test $status -eq 2;
 echo $error_message;
 exit;
else if test $input_time -lt 0;
 echo $error_message;
 exit;
else
 echo "-------------------"\n"start["{$input}"]minutes!!"\n"-------------------";
end;
​
#n分* 59 sleep_loop
for mm in (seq $input_time 1);
​
 for ss in (seq 59 0);
  
  sleep 1;clear;
 
  #1桁分の場合、先頭に0を追加
  if test $mm -le 9;
   echo -n 0;
  end;
​
  echo -n $mm:;
 
  #1桁秒の場合、先頭に0を追加
  if test $ss -le 9;
   echo -n 0;
  end;
 
  echo $ss;
  end;
    
  if test $mm -eq 0 -a $ss -eq 0;
   break;
  end;
​
  echo "-------";
  echo "finish!";
  echo "-------";
​
end;
```

###おまけ
※不具合ありワンライナー版(残り1分で止まります)
※※使い道がないので修正はしていません

```
for mm in (seq 3 1); for ss in (seq 59 0); sleep 1; clear ;  if test $mm -le 9; echo -n 0; end; echo -n $mm:; if test $ss -le 9; echo -n 0; end; echo $ss; end; if test $mm -eq 0 -a $ss -eq 0; break; end; end;

```




####なんでこんなものを作ったのか

ScaraMatsuri2020のスタッフとして参加した10/18
タイムキーパーだったのでZoomにて仮想カメラを用いてタイマーを映す必要がありました。

しかしタイマーが映せない＋タイマーアプリそのものも起動できないなどトラブルが発生
前日は大丈夫だったのに・・・。

色々思考錯誤しターミナル画面は映せたのでこれでなんとかできるのでは・・・
と思ったのですがなんだかんだ解決したのでお蔵入りしました。

後日.shとして作り直したのがこちらでございます。
※ifとforはbashだと若干書き方違うので、流用する場合はその辺りちょっと調べてみてください。



カウントアップでもよければ

```
// 現在時刻表示 1秒ごとに更新
watch -n 1 date

//例 オプション付けてみたり
watch -n 1 date -v-1H +%M:%S 
```
で、より簡単に見れます。
Railsでドットが２つ並んだやつに出くわした

##カリキュラムにあったっけ？
はじめに見た時は、普通に記述ミスかと思いました。
メンターさんに聞いた時も初めは見たことないですね。と仰っていました！
調べてこれはオブジェクトと言うことを教えていただきました。

下記が問題のコードです。

```

date: @todays_date..@todays_date + 6)
```

これは、２点ドットですが、３点ドットもあります。

**範囲オブジェクト**というそうです。
SQLに保存する時に使用するみたいで、
・コードが少なく可読性が高い
・エラーになりにくい
上記のようなメリットがあるそうです。



##どんな使いかた？

```ruby:rails
User.where(age: ...30)
```
上記のコードが


```SQL:SQL
SELECT "users".* FROM "users" WHERE "users"."age" < 30
```
たしかに短くなる。


初めの方のコードは、**範囲抽出(Beetween)**といいます。
簡単に言うと左の値から、右の値までって感じですね！





下記のページ参照させていただきました。
気になる人は見てみてください！

【Rails】範囲オブジェクト(Range)を使ったActiveRecordのwhere比較、範囲検索のコードの書き方https://simple-minds-think-alike.hatenablog.com/entry/active-record-where-with-range
【Xcode 12.1】line 144: ARCHS[@]: unbound variable Command PhaseScriptExecution failed with a nonzero exit code

Xcode12.1で以下のエラーで実機ビルドとarchiveできなくなり数時間ハマった。

```
line 144: ARCHS[@]: unbound variable
Command PhaseScriptExecution failed with a nonzero exit code
```

以下の方法で解決できました。

## やった
- プロジェクトのBuildSetting -> User Defined に`VALID_ARCHS`を追加。値は`$(ARCHS_STANDARD)`
- pod install後にPodsプロジェクトのBase SDKをmacOSからiOSに変更(macOSだとARCHS_STANDARDの値がiOSと異なるので)

## やらない
以下は解決方法としてぐぐると出てくるが実施しない
- Excluded Architectureにarm64を追加する
mixコマンドを使えない時に確認すること。** (Mix) The task "mix xxxxxx" could not be found Note no mix.exs was found in the current directory


例えば`mix hex.info`と打つとこんな風に出力されることがある。

```
** (Mix) The task "hex.info" could not be found Note no mix.exs was found in the current directory
```

`mix archive`を確認して次のようになる場合は、必要なhex,phxがインストールされていない。

```zsh

% mix archive
No archives currently installed.
```

`mix archive.install hex phx_new`を実行する。
また、このコマンドは最新のphoenixのバージョンをインストールする。

```zsh

% mix archive.install hex phx_new
Could not find Hex, which is needed to build dependency :phx_new
Shall I install Hex? (if running non-interactively, use "mix local.hex --force") [Yn] Y
* creating /Users/kuraya/.kiex/mix/archives/elixir-1.11.1/hex-0.20.6
Resolving Hex dependencies...
Dependency resolution completed:
New:
  phx_new 1.5.6
* Getting phx_new (Hex package)
All dependencies are up to date
Compiling 10 files (.ex)
Generated phx_new app
Generated archive "phx_new-1.5.6.ez" with MIX_ENV=prod
Are you sure you want to install "phx_new-1.5.6.ez"? [Yn] Y
* creating /Users/kuraya/.kiex/mix/archives/elixir-1.11.1/phx_new-1.5.6
```

再度mixコマンドを使えるか確認する。

```zsh

% mix hex.info
Hex:    0.20.6
Elixir: 1.11.1
OTP:    23.0

Built with: Elixir 1.11.1 and OTP 21.3
```