OmniAICreator/Qiita-1.07M huggingface dataset:
VkInline で Python で Vulkan compute して GPU 機械学習などに思いを馳せる

## 背景

* お手軽に python で GPU 計算したい
* Vulkan であれば, Khronos からは安定したコンパイラ, ドライバについては 各 GPU ベンダーから安定(or 定期的なアップデート)したものが出ており, 安心感がある.
  * Windows, Linux, Android で動く
  * macOS は MoltenVK 経由でいけるかも
* Vulkan compute 自体は, 画面出力(Swap chain)は不要にできているので, オフラインでサーバ GPU で動かすのにも使える

少なくとも Colab + Tesla P100 では Vulkan 使えました.

https://qiita.com/syoyo/items/3956e98e4a607cde6cb2

(V100 や A100 はどうかしらん?)

cupy のような感じで, python からインラインで Vulkan compute kernel を呼べる VkInline を試します.

https://github.com/fynv/VkInline

Vulkan 1.2 ドライバが必要になります.
(現状, 1.2　に対応しているのは RADV(AMD OSS(?) Linux Vulkan ドライバ) か Windows Adrenalin ドライバくらいでしょうか?)

## VkInline

ライセンスは Anti 996 ライセンスです
(9 時 9 時(21 時), 週 6 日労働のような労働基準法を無視した会社では anti-996 license なソフトウェアは使ってはいけない)

https://github.com/996icu/996.ICU

### ビルド

特に問題なく, 手順に従えばすんなりいけます.

### 実行環境セットアップ

* Vulkan 1.2 ドライバ
  * 少なくとも, `VK_KHR_buffer_device_address` がサポートされているドライバ. amdgpu や古めの AMD GPU で Windows では動きません
    * 現状の vkinline コードでは強制的に `exit` しているので, ログが出ずにわかりづらい.
  * NVIDIA では, 1.2 対応のドライバは現状(2020 年 6 月 8 日時点) beta driver になります.   
* Python cffi, ,numpy, glm

くらいでいけます.
 
今回は, RADV ドライバで RX5700(Navi) で動作確認しました.

ROCm で RADV で Vulkan(compute kernel) を使うメモ
https://qiita.com/syoyo/items/ce3943757281acbdba49



### 動かす

test_compute.py を動かしてみます.

```py
// from VkInline test_compute.py
import VkInline as vki
import numpy as np

# interface with numpy
harr = np.array([1.0, 2.0, 3.0, 4.0, 5.0], dtype='float32')
darr = vki.device_vector_from_numpy(harr)
print(darr.to_host())

# GLSL data type
print(darr.name_view_type())

harr2 = np.array([6,7,8,9,10], dtype='int32')
darr2 = vki.device_vector_from_numpy(harr2)

# kernel with auto parameters, launched twice with different types
kernel = vki.Computer(['arr_in', 'arr_out', 'k'],
'''
void main()
{
    uint id = gl_GlobalInvocationID.x;
    if (id >= get_size(arr_in)) return;
    set_value(arr_out, id, get_value(arr_in, id)*k);
}
''')

darr_out = vki.SVVector('float', 5)
kernel.launch(1,128, [darr, darr_out, vki.SVFloat(10.0)])
print (darr_out.to_host())

darr_out = vki.SVVector('int', 5)
kernel.launch(1,128, [darr2, darr_out, vki.SVInt32(5)])
print (darr_out.to_host())

# create a vector from python list with GLSL type specified
darr3 = vki.device_vector_from_list([3.0, 5.0, 7.0, 9.0 , 11.0], 'float')
print(darr3.to_host())
```

```
[1. 2. 3. 4. 5.]
Comb_bb4c7639fd354507
[10. 20. 30. 40. 50.]
[30 35 40 45 50]
[ 3.  5.  7.  9. 11.]
```
:tada:


## 展望

特に問題なくすんなり動いてびっくりです! 期待ができますが, ここから機械学習などのアプリを作っていくにはいろいろ課題があります.

* Vulkan 向けに cuDNN 系とか移植(convolution 系のネットワークを使いたい場合).
* 複数 GPU 対応(Vulkan の機能で GPU to GPU 直通信したいときとか)
* 倍精度や, fp16 対応とか

## TODO

* [ ] 優秀な GPU 機械学習若人さまが, **VkInline をお極めになされることで, 人類史上最速で優秀な Vulkan 機械学習若人さまへと昇華なされる**スキームを確立する旅に出たい.
選択した文字列をリアルタイム翻訳するGoogle Chrome拡張機能を開発したよ🥺

こんにちは(๑╹ω╹๑ )

絶好のプログラミング日和ですね😊

今日は😋

タイトルの通り🤗

**ページ閲覧中に選択した文字列をリアルタイム翻訳**する
Google Chromeの拡張機能を開発しました🎉

[Stinrg Selection To Google Translation On Chrome Extension](https://github.com/huuyafwww/Stinrg-Selection-To-Google-Translation-On-Chrome-Extension)

※即席で開発したので名前は適当です🤫

![realtime_translate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/c9f80e99-795a-cab7-0d50-7b0c615566fb.gif)


### きっかけ

普段英語のドキュメントを読む際にGoogle翻訳を利用してページを一括翻訳していました😅
その際にコードブロックも翻訳されることが多々有り不便に感じていました😢

```
実際には部分翻訳のみで良い場合が多々あり、
文字列の選択時にリアルタイムで翻訳結果をプレビュー出来ないか🤔
```
という想いで開発しました！

↓簡易アーキテクト図↓

![figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/1f80773d-ff32-7d73-e066-a8d867fa32bb.png)

[Stinrg Selection To Google Translation On Chrome Extension](https://github.com/huuyafwww/Stinrg-Selection-To-Google-Translation-On-Chrome-Extension)


<img width="350" alt="スクリーンショット 2020-06-07 18.30.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/ff400305-f697-3f1d-f12d-9771460ec3fc.png">

Google翻訳の公式拡張機能でも同様のプレビューは可能ですが、

- 日本語に翻訳する
- 英語に翻訳する

のどちらかを選択する必要がありました。

片方向のみの翻訳を行うことは機会としてあまりないため、

- 選択した文字列に日本語が含まれていれば、英語に翻訳する
- 選択した文字列に日本語が含まれていなければ、日本語に翻訳する

という相互翻訳に対応させました👏

```js

/**
 * Is Japan String
 *
 * @param {string} target_str
 */
function __is_ja_str(
    target_str
)
{
    return /[\u3041-\u3096\u30A1-\u30FA\u3400-\u9FFF\uF900-\uFAFF\uF900-\uFAFF\u3000-\u301C]/.test(target_str);
}
```

**a-z**と**A-Z**という含有チェックでは日本語が含まれている可能性があるため、
日本語の含有チェックで処理を走らせています！

また、Content Scripts側でGASに非同期通信をするとクロスオリジンとなるため、
BackgroundでGASと非同期通信を行っています！

※非同期通信を行うBackgroundとContent Scriptsを相互に対話させる処理の開発に少し時間がかかりました

GASからGoogle翻訳を利用する際に[公式サイト](https://developers.google.com/apps-script/guides/services/quotas)を確認したのですが、
特に従量課金に関する特記事項はありませんでした😲

ですが、~~拡張機能のソースにアクセストークンをベタ貼りするわけにもいかないので~~、
OSSにしました🎉

<img width="350" alt="スクリーンショット 2020-06-07 23.40.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/406b8dd8-a7ec-e9e9-4f92-17660bbbfaee.png">


※```browser_action```で設定ページ作成しました

### まとめ

アクセストークンの取得方法は[GitHub](https://github.com/huuyafwww/Stinrg-Selection-To-Google-Translation-On-Chrome-Extension)を確認してください🙇‍♂️

野良Extensionの有効化方法やGASの基本操作等は割愛します🙏

改変や再配布は自由です🙆‍♂️

その際はコメント欄でお知らせ頂けると🥺

~~プレビューした翻訳結果が画面内で邪魔になることがあるので、
削除出来る機能も後々に加えようと思っています🤭~~
↑対応しました🎉

~~それと翻訳結果の簡易プレビューウインドウの位置座標が、
うまく書けていないので適切な座標で表示できるよう修正しようと思っています🙇‍♂️~~
↑ドラック＆ドロップの実装で対応しました🎉

文章を選択する度翻訳に走ってしまうのが憂いだったので、
選択終了時にAltキー（MacはOptionキー）を押下している場合のみに、
翻訳が走るように仕様変更しました😇

ありがとうございました(๑╹ω╹๑ )
めっちゃ簡単にラズパイ用のOSをインストールできる

#ラズパイのOSインストール，めんどくさい！
ラズベリーパイ，利用されている方であればご理解いただけると思うんですけれど，RaspbianだろうがUbuntuだろうがOSをインストールするのが非常にめんどくさいです(__主にWindows__)
通常だと，
- OSのイメージファイルをDLしてくる
- __「ライティングソフト」__でイメージファイルをSDに書き込む
この手順が必要ですが，先日公開された[__Raspberry Pi Imager__](https://www.itmedia.co.jp/news/articles/2006/05/news031.html)を使うことで，
ツールの中でインストールしたいOSとSDをリストから選んで書き込むだけで済みます．しかも__圧倒的に高速にインストール__が可能です．

なぜ__「ライティングソフト」__を太字で強調したかと言うと，これがまたWindowsだと分かりづらいしめんどくさいんですよ．
- Win32Disk Imager
- DD for Windows
- balenaEtcher
- and more…
いっぱいあって，初見だとどれ使えば良いのかわからなかったです．
しかもWin32 DiskImagerで書き込んだら，何故かRaspbianが起動しなかったんですよね．DD for Windowsに関しては，書き込んだどのOSも認識してくれなかったです．
balenaEtcherで書き込んだら Raspbian __「は」__インストールも起動も可能でした．しかし，Ubuntuは起動しませんでした．
多分拾ってきたUbuntuのイメージが悪かったんでしょう．わざわざ拾ってきたイメージを焼いたのに使えなかったとか時間の無駄だしめんどくさいです．
MacやLinuxなどのUNIX系OSだとddコマンドを使えばOSインストール(書き)もバックアップ(読み)もほぼ確実にできて楽です．しかし，ターミナル操作が必要だし結局OSイメージ探してこないといけないしめんどくさいです．

#実際に使ってみよう
めんどくさいめんどくさい言っていても仕方がないのでRaspberry Pi Imangerを使ってみましょう．私の環境はMacですが，WindowsやLinuxでも同じUIで同じ手順なはずです．あとUIがマテリアルデザインに準拠しているので非常に使い心地が良いです．

###Raspberry Pi Imagerのインストール
まずRaspberry Pi Imagerをインストールします．
https://www.raspberrypi.org/downloads/

###OSインストール
起動してみるとこういう画面が出ます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/949e61c6-334c-e0cf-7b26-0fa402d47826.png)
CHOOSE OSでインストールしたいOSが選べます．今のところはRaspbianとLibreELECとUbuntuが選択可能です．(2020-06-07)
今回は，UbuntuをRPi2に入れたいので選んでみましょう．
(最新のUbuntu20.04 LTSも使えるだと…しかもRPi2に対応している…キミに決めた！)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/fcccb512-0d0e-2b22-c4bb-2f42eeaaad2b.png)

同様に，CHOOSE SDでインストールしたいSDを選んでください．選び終わったらWRITEを押して書き込みです！めっちゃ簡単！

あ，書き込み時に認証を求められるのでちゃんと認証してくださいね．SDにディスクイメージを書き込むときに管理者権限が要るため求められるのだと思われます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/ab21ddea-15b0-5958-43bf-ee7d5366bb9b.png)

OSのDLにかかる時間はインターネット環境によりけりだと思いますが，私の場合はなんと10秒もかかりませんでした．書き込みには当然時間がかかりますが，OSイメージを拾ってくるのが簡単で速いなんてすばらしいですね．スクリーンショットは書き込み中のRaspberry Pi Imagerです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/cc74d07b-32be-4baa-1291-9a59d1f86840.png)

このあとちゃんとRPi2でUbuntuが起動できました．本当に嬉しいです．
【Swift】Realm Browserが使えない問題について

# Realm Browserが使えない、、
最近、新しくXcodeプロジェクトファイルを作ってrealmで開発してる時にこんな問題に出会いました。。

**Realm Browserが使えない！！！**

今までコマンドを打つだけで使えていたRealm Browser（RealmDBを用いて保存したときの、保存内容を確認するもの）が開けなくなってしまったのです、以下の画像のように謎のkeyが要求される状態に、、

<img width="972" alt="スクリーンショット 2020-06-07 18.31.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490120/7c44ade7-c576-cea7-66fd-237ca064884f.png">


# 解決法

代わりとなるものを見つけたので、使い方を手順追って説明します。

### ①Realm Studio をダウンロードする　
まず、[Realm Studio](https://realm.io/jp/products/realm-studio/)をダウンロードしてください。



### ②「アプリが悪質なため開けません」、と表示されたら、設定からMacのセキュリティを解除する
（この警告が出ない人は飛ばしてください）

設定画面の中にある家マークの「セキュリティとプライバシー」＝>「一般」＝>「ダウンロードしたアプリケーションの実行許可」で開くをおす。



### ③ログインが要求されるのでログインする



### ④３つ出てくるボタンの中のopen realm fileを選択
左下のです。
<img width="692" alt="スクリーンショット 2020-06-07 18.43.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490120/104135aa-1ddd-2d6a-a0c4-e40997096f77.png">

### ⑤先ほどの④を押すと、finderに飛ぶ
飛んだら、**command+shift+G** で表示される以下のフィールドにurlをペースト（realmのファイルをpcから探す作業）
<img width="786" alt="スクリーンショット 2020-06-07 18.49.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490120/f5c72341-3d9c-d047-0b94-9ffc356b505b.png">

※この urlは、 print(Realm.Configuration.defaultConfiguration.fileURL!)でデバックコンソールに表示されるものの、**最初のfile://** 以降の文字列。
（Realm Browserで、ターミナルでopenの後に打っていたurlと同じ）

入力すると、このようになるはずです。
<img width="790" alt="スクリーンショット 2020-06-07 18.48.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490120/efce9cbf-33d3-1304-fbb0-2ec4f2a2a1b6.png">


### ⑥Realmファイルのところに飛ぶので、上写真の一番左を選択。そのまま中身見れば完了！
<img width="891" alt="スクリーンショット 2020-06-07 18.58.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490120/77a30ded-569a-9215-9c3b-0df80b60bb18.png">
ラズベリーパイ4でcronを動かす

ラズベリーパイ4にて定期実行させるタスクを登録させるためにcronを用いました。その時の調査内容をまとめます。　※OSはRaspbianです。
# cronのログを有効化

```
$ sudo vim /etc/rsyslog.conf
// 以下のコメントアウトを外す
cron.*                          /var/log/cron.log
$ sudo /etc/init.d/rsyslog restart
```
# cronの起動、再起動、停止、ステータス確認
私の場合は最初からcronが起動している状態でしたが、状況に応じて実行してください。

```
// cronのステータス確認
$ sudo /etc/init.d/cron status
// active (running)になっていればOK
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-05-31 22:05:22 JST; 6 days ago
     Docs: man:cron(8)
 Main PID: 3315 (cron)
    Tasks: 71 (limit: 4915)
   Memory: 189.2M
...
// cronの起動
$ sudo /etc/init.d/cron start
// cronの再起動
$ sudo /etc/init.d/cron restart
// cronの停止
$ sudo /etc/init.d/cron stop
```

# cronの設定

```
$ crontab -e
// 以下書式に従って設定を書く
分 時 日 月 曜日 '実行したいコマンドまたはスクリプト'
```

# cronの設定時の注意点
cronはユーザーのシェルで起動しないため、ユーザーの環境変数は引き継がれません。そのため、必要に応じて以下を設定。
## 文字コードの設定

```
LANG=ja_JP.UTF-8
0 0 * * * /home/foo/foo1.sh
```

## コマンド実行のためのPATHを通す

```
$ echo $PATH
/usr/local/sbin:/usr/local/bin:hogehoge...
$ crontab -e
LANG=ja_JP.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:hogehoge...
0 0 * * * /home/foo/foo1.sh
```

# cronの実行結果をログに出力する
cron実行中のプログラムのログを出力させるための設定をします。

```
$ sudo touch /var/log/hoge.log
$ sudo chmod 777 /var/log/hoge.log
$ crontab -e
LANG=ja_JP.eucJP
PATH=/usr/local/sbin:/usr/local/bin:hogehoge...
0 0 * * * /home/foo/foo1.sh > /var/log/hoge.log 2>&1
// 上記は上書き。追記させたい場合は
0 0 * * * /home/foo/foo1.sh >> /var/log/hoge.log 2>&1
```

# cronに複数コマンドを実行させる
cronに複数のコマンドを実行させるときはセミコロンで区切ります。

```
$ crontab -e
LANG=ja_JP.eucJP
PATH=/usr/local/sbin:/usr/local/bin:hogehoge...
0 0 * * * /home/foo/foo1.sh; /home/foo/foo2.sh > /var/log/hoge.log 2>&1
```

# 参考
* [ラズベリーパイでCronを使って定期処理を行う方法、ハマりポイントやCronが動かない場合の対処方法など](https://k99-tech.com/blog/archives/1141)
* [【cron】定期的に処理を行う【MacOS】【Linux】](https://qiita.com/syunyo/items/69c3523a8c500b37f33f)
* [Cronの使い方とテクニックと詰まったところ](https://qiita.com/UNILORN/items/a1a3f62409cdb4256219)
* [ラズベリーパイで自分が作ったシェルスクリプトへのパスを通す](https://raspi.maruzonet.com/archives/481)
* [cron実行時の環境変数を設定](https://admnote.paix.jp/2014/07/cron%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A/)
* [UNIX&Linux コマンド・シェルスクリプト リファレンス](https://shellscript.sunone.me/input_output.html)
Edge AI / IoT good stocks

以下の記事を参考にFPGA(UltraV2/Vitis)/AWSでEdge AI / IoTのシステム構築を試していきます。

-Ubuntsu 18.04.01 on Vertual Box
https://pc-karuma.net/mac-virtualbox-install/

Ubuntsuは確実にversionを揃える18.04.01は下
http://old-releases.ubuntu.com/releases/18.04.1/

UbuntsuのVersionをXilinx推奨に正確に揃える,アップデート設定をオフにする
linuxではcable driverは手動でスクリプト
https://japan.xilinx.com/support/answers/66440.html
.ISOをvbのdiskに設定する

ultra96についているboutureでライセンスを作成する
ultra96のbdf(board definition file)を入手する
https://github.com/Avnet/bdf
vivadoの場所は
/data/board/

-Ultra96の付属購入物 JTAG/AC-Adoptor/

-Ultra96で合成ライセンス取得
-virtual boxで共有フォルダ

-petalinux install

-Ultra96 bring up
https://qiita.com/harmegiddo/items/bba9b967a86fa716f680
https://www.96boards.org/documentation/consumer/ultra96/ultra96-v2/installation/

-Xilinx Vitis入門
https://qiita.com/basaro_k/items/6841c99c39ff12851847
https://www.hackster.io/news/hello-world-on-the-ultra96-using-vitis-89a06b18fa3a
https://github.com/Xilinx/Vitis-AI-Tutorials/tree/Vitis-AI-Custom-Platform

-custom platformの作り方
https://japan.xilinx.com/html_docs/xilinx2020_1/vitis_doc/xmg1596051749618.html

-AWS IoT Core
https://aws.amazon.com/jp/iot-core/

-AWS 


<Vivado install>
cd
cd Downloads
sudo chmod 777 Xilinx_unified_2020.1_0602_1208_Lin64.bin
./Xilinx_unified_2020.1_0602_1208_Lin64.bin


<petalinux library>
sudo apt install gcc
sudo apt install g++
sudo apt install iproute2
sudo apt install net-tools
sudo apt install libncurses5-dev
sudo apt install zlib1g:i386
sudo apt install libssl-dev
sudo apt install xz-utils
sudo apt install debianutils
sudo apt install flex
sudo apt install bison
sudo apt install libselinux1
sudo apt install xterm
sudo apt install autoconf
sudo apt install libtool
sudo apt install texinfo
sudo apt install zlib1g-dev
sudo apt install gcc-multilib
sudo apt install build-essential
sudo apt install screen
sudo apt install pax
sudo apt install gawk
sudo apt install python3
sudo apt install python3-pexpect
sudo apt install python3-pip
sudo apt install python3-git
sudo apt install python3-jinja2
sudo apt install xz-utils
sudo apt install debianutils
sudo apt install iputils-ping
sudo apt install libegl1-mesa
sudo apt install libsdl1.2-dev
sudo apt install pylint3
sudo apt install cpio

<petalinux install command>
cd /opt/
sudo mkdir petalinux
sudo chown <user>:<grp> petalinux

cd
cd Downloads
sudo chmod 777 petalinux-v2020.1-final-installer.run
./petalinux-v2020.1-final-installer.run -d /opt/petalinux
[Java/Kotlin]画像の向きを考慮してリサイズする

# 概要
- iPhoneのカメラで画像を作成した場合、画像の向きはEXIFのorientationに保存される。
- EXIFはimagemagicの`identify`コマンドで確認できる。

```
$ identify -verbose IMG_1046.png | grep Orient
  Orientation: TopLeft
```
- 画像をリサイズする場合はEXIFを考慮する必要がある。
- 自分で実装するのは大変なのでライブラリを使う。
    

# 使用するライブラリ

- [sksamuel/scrimage](https://github.com/sksamuel/scrimage) - Java, Scala and Kotlin image processing library

# 実装


```build.gradle
dependencies {
    ...
    implementation "com.sksamuel.scrimage:scrimage-core:4.0.4"
    ...
}
```

```ImageResizer.kt
object ImageResizer {
    enum class ImageFormat {
        JPEG,
        PNG;

        companion object {
            fun fromName(formatName: String): ImageFormat? {
                return when (formatName) {
                    "jpg", "jpeg" -> JPEG
                    "png" -> PNG
                    else -> null
                }
            }
        }
    }

    /**
     * 長辺を[size]にしてリサイズする
     *
     * 長辺が[size]よりも小さい場合は、リサイズしない
     */
    fun resize(inputStream: InputStream, size: Int, formatName: String): File {
        // オリジナルのファイルを読み込む
        val original = ImmutableImage.loader().fromStream(inputStream)
        val originalWidth = original.width.toDouble()
        val originalHeight = original.height.toDouble()

        if (originalWidth <= size && originalHeight <= size) {
            // 長辺がsizeよりも小さい場合は、リサイズしない
            return createImageTempFile(original, formatName)
        }

        val resizedWidth: Double
        val resizedHeight: Double
        if (originalWidth > originalHeight) {
            resizedWidth = size.toDouble()
            resizedHeight = size * originalHeight / originalWidth
        } else {
            resizedHeight = size.toDouble()
            resizedWidth = size * originalWidth / originalHeight
        }

        val resized = original.fit(resizedWidth.roundToInt(), resizedHeight.roundToInt())
        return createImageTempFile(resized, formatName)
    }

    private fun createImageTempFile(image: ImmutableImage, formatName: String): File {
        val format = ImageFormat.fromName(formatName)
            ?: throw BadRequestException("The image format $formatName is not supported ")
        val outFile = createTempFile(suffix = ".$formatName")
        when (format) {
            ImageFormat.JPEG -> image.output(JpegWriter(), outFile)
            ImageFormat.PNG -> image.output(PngWriter(), outFile)
        }
        return outFile
    }
}
```

これで正しい向きでリサイズ画像が作成されます(リサイズ後の画像からはEXIF orientationは失われます。)

# 備考

- Javaのサムネイル作成ライブラリとして [thumbnailator](https://github.com/coobird/thumbnailator) が有名ですが、こちらはEXIFのorientationを考慮していないようでした。
    - https://github.com/coobird/thumbnailator/issues/108

# 参考
IFTTTを使ってEvernoteに毎日同じノートを作る

#背景
Evernoteで日報やら日記やらを複製し毎日作成していたが、非効率だなと。
IFTTT使ったらテンプレートのノートを自動で作成してくれるのでは、、、と思い始めました。

#はじめに
IFTTTにEvernoteを連携させる必要があります
詳しくは[こちら](https://evernote.com/blog/jp/docomo-ifttt2018/)へ

以下引用になります
>使用方法 
1. IFTTT のアプリケーションをダウンロードします。あるいは、ブラウザでIFTTTにアクセスします。 
2. 「Sign up」を選択してユーザー登録をします。メールアドレスとパスワードを設定するか、Google や Facebook アカウントを使って登録することも可能です。
3. 初回利用時には、Evernote との連携が必要になります。Services で Evernote を検索し、Evernote のパネルを選択。「Connect」ボタンをクリックまたはタップし、Evernote の画面で IFTTT との連携を承認します。
4. 使用したい連携機能を検索して選択し、「Turn on」をクリックまたはタップして「入」の状態に変更します。例えば、右上の検索アイコンをタップし、「evernote」を検索することで、Evernote と連携した機能を表示させることができます。

#手順
###1.アプレット準備
右上のアイコンをクリックし「Create」を選択
![スクリーンショット 2020-06-07 15.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/8dcf48ba-f271-6caf-21f4-f01db532905d.png)
「+This」をクリック

###2.Thisの設定
検索窓に「time」を入力
![スクリーンショット 2020-06-07 15.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/23897c97-ca6b-2c2c-ad9d-910995ef84fd.png)
「Data&Time」をクリック
![スクリーンショット 2020-06-07 16.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/6ea1a042-f828-f2f7-910d-55cd4bacca6a.png)
５つのトリガーが出てきますが、ここでは「平日のみ」のように指定がしたいので
中央の「Every day of the week at」を選択します
![スクリーンショット 2020-06-07 16.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/12677c0b-112b-d697-2be0-c0bc1937c0bc.png)
この画面では
・ノートを作成したい時間
・ノートが作成される曜日
の2つを決めます
決めたあとは「Create trigger」をクリック

###3.Thatの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/9952fbd8-f4d4-2ecc-fa8b-3bb1eb324944.png)
「+That」をクリックし、
検索窓で「Evernote」を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/73c282eb-c989-bd4f-45ca-56d4a4346511.png)
アイコンをクリックし、Evernoteの設定を行います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/70230672-a9f6-b168-dc2a-95bbde3e704d.png)
6つのアクションが出てきますが、
ここではノート作成である「Create a note」をクリック

###4.Evernoteアクションの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/1e577b76-b927-5a63-7e8c-9c7d7cecc505.png)
ここでできることは
・タイトル名の変更
・ノート本文の変更
・どのノートブックに保存するか
・どのタグ付をするか
の4つです

####タイトル
以下の2つを使うと自動で曜日と日時を表記してくれます

```
・ {{DayOfWeek}}：ノート作成日の曜日
出力例)Saturday
```
```
・ {{CheckTime}}：ノート作成日の日時
出力例)June 06, 2020 at 08:45PM
```
私は

```
【日記】{{DayOfWeek}}{{CheckTime}}
```
とタイトルに記入して日記を毎日作成しています

####本文
ここにはノートに表示したい本文を記載します
またHTMLタグを使用することもできるらしいのですが、
現時点で確認したものは

```
ボールド：<b>文章</b>
イタリック：<i>イタリック</i>
下線：<u>下線</u>
水平線：<HR>
改行：<br>
```
の5点になります

いい感じに本文の体裁を整えましょう

####ノートブック
作成したノートを入れたいノートブック名を記入

####タグ
作成したノートに付けたいタグ名を記入

###5.フィニッシュ
Evernoteのアクションを記載し終わったら
「Create action」をクリックし
![スクリーンショット 2020-06-07 18.06.32のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284042/fa2379ba-1fab-06df-3adc-9f180a65691e.png)
ここの画面で「Finish」をクリックして終了です

あとはEvernoteにノートが作成されるのをじっと待ちましょう。

#終わりに
ノートの本文に
・箇条書き
・表
・マーカー
・チェックボックス
等をノート本文に自動で記載する方法が見つからなかったのが妥協ポイント
わかり次第追記していきたいと思います
またご存知の方がいましたらコメントいただけると幸いです
DataflowでDatastoreのentityを一括削除する

# Cloud Datastoreのentityを一括削除する方法
Cloud Datastoreでentityを一括削除するには、Cloud Dataflowを使います。
Cloud　Dataflowにはテンプレートがあるので非常に簡単にできます。

- Dataflow APIを有効にします
- Create job from templateを選択する
- Job name: 適当にJOBの名前を付ければOK
- Regional endpoint: 特にこだわりがなければそのままでOK
- Dataflow template: Bulk Delete Entities in Cloud Datastoreを選択します
- GQL Query: 削除したいentityを抽出する、GQL
- Read data from Datastore Project Id of: データを読み込みたいGCP projectのID
- Delete all matching entities from the GQL Query present in this Datastore Project ID: データを削除したいGCP projectのID
- RUN JOB


<img width="950" alt="スクリーンショット 2020-06-07 18.00.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158142/4f454d60-3bc8-f301-583c-e748b08ea461.png">


# 注意事項
削除してしまうともとに戻すことはできないので、必ず**バックアップをとってから**削除しましょう！

# 参考
https://cloud.google.com/datastore/docs/bulk-delete?hl=ja
Splunk searchとwhereの違い

https://twitter.com/GreggWoodcock/status/1269327397301751811
ということで、 [@woodcock](https://answers.splunk.com/users/1493/woodcock.html)がプレゼンをやるということなので、こちらも勝手にやってみる。

#違い

|コマンド|大文字小文字|結局なんなのよ|
|:-:|:-:|:-:|
|search|関係なし|サーチなので|
|where|関係あり|evalと一緒|

#解説
`eval`がケースセンシティブというのはfundamental1で教えてくれる大事なこと。
逆に`search`はケースインセンシティブ
日本語でここら辺を簡潔にいうのはなんていうのだろう:question:

`stats`の後とか`where`か`search`かは

1. どちらにしても`フィールド名=`は必要
2. 正規表現とか考えると`where`のほうがやれることが多い
3. 単純にフィールドの値を限定するなら`search`の方がわかりやすい
4. `"`で囲うのを忘れるのは`where`では致命的

`where`の評価は`eval`というのは、結構忘れやすいかもしれない。
そのため、４番目の制限でエラーになりやすい（かも）

#まとめ
大文字小文字を「気にする」か「気にしないか」と文字列を`"`で「囲わない」と「囲う」の違いが大きい`search`と`where`

自分の案件は`where`でSplunk>Answersで答える時は`search`でやるのが多いです。

Splunk>Answersの質問者は詳細が分からないとこが多いですし。
【小ネタ】GitKrakenを使ってUnityプロジェクトにgitを簡単に導入する

# はじめに

どうも、にー兄さんと申します。
今回は小ネタなのですが、Unityにgitを導入する簡単な方法を見つけたので書いていきたいと思います。
とはいえ他にもいろいろやり方はあると思いますので、これが一番！というものなく、個人のお好きな環境で導入してもらうのが一番だと思っているので、あくまで一例として受け止めてくださいね。
(久しぶりの記事投稿で導入の雰囲気を完全に忘れた顔)

# UnityプロジェクトをGitKrakenで管理する

自分はgitクライアントにGitKrakenを使っています。理由はブランチ表示が綺麗だからというのと、普通に便利だからです。
Unityだと、開発するIDEにGit管理できるシステムが載ってたり各種プラグインを導入できたり色々あるとおもいます(RiderにもVSにも標準でありますよね)。
自分はもともとCUIでgitコマンド叩いて管理していたのもあって、IDE付属の機能がちゃちゃっと「はいステージングはいコミット～～～適当にプッシュもしておくしいつのまにかignoreとかライセンスも追加してあるぜ～～～」みたいにやってしまうとたまに怖いんですよね（普通はそんなことないと思いますが）
そういう意味では、自分の手の中で堅実にgit管理ができて、オシャレなクライアントが使いたいって人はGitKraken普通におススメですね。

## UnityとGit

ところで、Unityエンジニアの皆さんはGit管理ってどうやっていますか？
自分の中ではちょっと前までUnityとgitってすごい相性悪いイメージがありました。
まぁ巨大なバイナリファイル扱ったりするしチームで同じシーンいじったらコンフリクトするしファイル構造もAsset以下は勝手にmetaファイル生成されちゃうし......という感じですかね？
とはいえ最近(でもないか？)は普通にLFS導入したりGithub for Unityというパッケージがあったりで普通にgit管理は便利になってきました。
参考：[【超初心者向け】Unityのプロジェクトを、GitHub for Unityを使って超簡単にバックアップする方法](https://qiita.com/toRisouP/items/97c4cddcb735acde2f03)
(Unityでsubmoduleどう使えばいいんだろう？ってツイートしたら強そうな人に「使わないのが正解」って言われたときは泣きましたけど)

自分の場合、いつもどうやってたかというと、

1. UnityプロジェクトをUnity Hubから作成する
2. Unityを閉じる
3. プロジェクトのルートをpowershellかなにかのシェルで開く
4. `git init`
5. `README.md`を適当に書いてステージング、コミットをコマンドで
6. GitKrakenで開く
7. Unityを再度開く

という手順を踏んでいました。
なぜかというと、まずUnityを一回閉じるのは、余計なファイル操作がUnityで勝手に行われることを避けるためです。Asset以下をいじらなければ必要ないのですが、過去何度か失敗していることもあって慎重になっています。
あとGitKrakenは、gitの初期化が済んでいることと、なにかコミットされていないと開けないので、適当に`README`をコミットしてから開くことにしてました。

## GitKrakenで解決！w

...できるのか...？
まぁ大方解決できると思う...。

まずはいつも通り適当なフォルダにプロジェクトを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/fa531c91-7222-4c9c-8dc5-dc931b7822de.png)

そのつぎにGitKrakenを開いて、「＋」タブから新しいrepoをセットアップしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/d1991f12-91fd-6339-0984-95adda549042.png)

「Start a local repo」を押下して作成/初期化するリポジトリを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/5b2e4001-9015-7875-12fb-27426ddfc8f3.png)

そうするとこんな感じの画面が出ると思うので必要項目を入力していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86191/4925e215-7695-ac5e-473a-3af90bbd2b6d.png)

注意点としては、Initialize inの項目は、先ほど追加したUnityプロジェクトの**親フォルダ**、Full PathのほうにUnityプロジェクトのルートを入力してください。
Full Pathのディレクトリが存在しなければ自動で作成される仕組みですが、すでにある場合はそのディレクトリをgit initする仕組みです(これが便利)。

そうすると、ちゃんとUnity用のignoreファイルが生成されたうえで、initialコミットには`.gitignore`、`LICENSE.md`、`README.md`がコミットした状態でリポジトリが初期化されます。
これでUnityプロジェクトにgit管理が導入されました！やったね！

## 注意

Gitの導入は終わったのですが、ここで一つ注意があります。
たとえば外部のunitypackageとか導入した時に適宜ignoreを設定すると思うのですが、**デフォルトで`.gitignore`が読み取り専用モード**になってます。
なので、これは一回エディタか何かで開いて解除する必要があるのかなぁって思います。

# おわりに

すごい小ネタでしたが、記事を書かせていただきました。
個人的にUnityでgit管理するのがめんどくさかったんで、sandbox的なプロジェクトとかテストのためだけに作ったプロジェクトにはgit管理を導入していませんでした。
これからは簡単に導入できるのでただ勉強するだけでもコミットして草が生やせそうです。

少しでもこの記事が、みなさまの参考になれればとても幸いです。
最後まで読んでいただきありがとうございました。
[技術メモ]viewを作成するときにエンジニア目線で気をつけるべきこと


「メンテナンス性」の高いコードを書くように気をつけて書くべきです。
具体的には、BEMという方法論を使ってフロントを設計することで可読性、
再利用性の高いコードを実現できるように心がける必要があります。

また、rubocopなど自動でコードを判定・修正してくれるjemもありますね！
https://qiita.com/d0ne1s/items/a3566aca023d11f2bfc4

参考になる記事
https://app.codegrid.net/entry/bem-basic-1
PYNQ-Z1 > VHDL > Clock Divider IPの実装と使用 (ZYBOでの実装を参考として)

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.1 (64-bit)
```

### 参考: ZYBOでの実装

- [ZYBO / IP > Clock Divider > IP作成したClock Dividerを使ってFCL_CLK0(100MHz)を1Hzに分周してみた](https://qiita.com/7of9/items/0687d2cffc470b83d38c)

ZYBOで試したVHDLでのClock DividerをPYNQで試した。


### PYNQ-Z1での変更

Vivadoのバージョンが違うが、変更箇所はLEDのポートおよび、XSDKの代わりのPython実装となった。


https://reference.digilentinc.com/reference/programmable-logic/pynq-z1/reference-manual

- Site: R14
- Fixed: チェック
- I/O Std: LVCMOS33


### Block Design

Block DesignはZYBOの時と同じ。

![コメント 2020-06-07 160435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/3497ce2c-16c7-d499-f6e9-e6d00f41f99c.png)


### Python実装

```py
from pynq import Overlay
from pynq import PL
OL = Overlay("/home/xilinx/pynq/overlays/base/2020-06-07_VHDL_LED.bit")
OL.download()
```

OL.download()するとR14のLEDの点滅が始まった。
起動時に、最近のPC使用記録を表示

テレワークなどが広がっているが、自分が出社しない日に誰かが自分のPCにログインしたかを確認するスクリプトです。
起動時に自動スタートアップに設定すれば便利です。

```powershell:checkDirty.ps1
# $ErrorActionPreference = 'Continue';
Param($Arg1);
$td = [DateTime]::Today;
if ($Arg1 -ieq 'ALL') {
    $sk = ([DateTime]::MinValue - $td).Days + 1;
} else {
    switch ($td.DayOfWeek.value__) {
        0 {$sk = -2; break;}
        1 {$sk = -3; break;}
        default {$sk = -1; break;}
    }
}
Get-EventLog System -InstanceId 7001,7002 -After ($td.AddDays($sk)) |
#Select-Object -Property TimeGenerated, EventId, MachineName, ReplacementStrings |
%{
    $ts = $_.TimeGenerated.toString('yyyy/MM/dd(z)HH:mm:ss');
    $outputEid = $_.EventId.toString();
    if (7001 -eq $outputEid) {
        $outputEid = '└' + $outputEid + '(ログオン)';
    } elseif (7002 -eq $outputEid) {
        $outputEid = '┌' + $outputEid + '(ログオフ)';
    } else {
        $outputEid = '　' + $outputEid;
    }
    $targetHost = $_.MachineName.toString();
    $outputTerm = $_.ReplacementStrings[0];
    $outputUser = $_.ReplacementStrings[1];
    try {
        $outputUser = (New-Object System.Security.Principal.SecurityIdentifier($outputUser)).Translate([System.Security.Principal.NTAccount]).Value;
    } catch {}
    [PSCustomObject]@{タイムスタンプ = $ts; イベントID = $outputEid; 対象ホスト = $targetHost; 対象セッション = $outputTerm; 対象ユーザー = $outputUser};
} |
Out-GridView -Title "PC利用履歴" -Wait;
```
KubernetesにコントリビュートするためのCLAのサイン方法をまとめる

# はじめに
Kubernetesにコントリビュートするには、CNCFのCLA（Contributor License Agreement）に同意し、サインする必要があります。
これを行わなければPull Requestを出しても、CIプロセスの中でマージされません（`cncf-cla: no`ラベルがつきます）

公式の手順はこちらになりますので、まずはこちらを確認してください。
https://github.com/kubernetes/community/blob/master/CLA.md

CLAはLinux Foundationのサイト経由で実施するため、 Linux Foundation IDとGithubアカウントを連携する必要があります。

サインするCLAは、以下のようなドキュメントです。
https://github.com/cncf/cla/blob/master/individual-cla.pdf

慣れない英語文書へのサインで、自分も手探りで実施しました。
初めての人は少し戸惑うと思いますので、参考になるように自分が実施した際の内容を書き留めたいと思います。

今回は個人（indivisual）としてサインする方法を説明します。

# Linux Foundation IDを作成する。

CKA（Certified Kubernetes Administrator）などの試験を受ける際に作成済み方は飛ばしてください。

以下のリンクからLinux Foundation IDを作成します。
https://identity.linuxfoundation.org/

初めてLinux Foundation IDを作成する人は、登録の段階でGithub認証で作成しておくと楽です。

## Linux Foundation IDをGithubアカウントと連携する。

マイページの`Social Network Login`タブでGithub認証を有効か確認してください。
![スクリーンショット 2020-06-07 16.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/7ddc5d99-4b52-df3c-aeee-48d1a77e2206.png)

## メールアドレスを確認する。
次にLinux Foundation IDのメールアドレスが、Githubアカウントの`Primary email address`と一致しているかを確認します。

Githubでは複数のメールアドレスを登録することができますが、Linux Foundation IDのメールアドレスは必ず`Primary email address`と一致していなければ、Pull Requestを行った際にエラーとなるので注意が必要です。

![スクリーンショット 2020-06-07 16.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/f07f2d09-b399-2f55-591e-a16c694632d8.png)

![スクリーンショット 2020-06-07 16.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/1c589945-7831-d154-9b90-57dedc8792f8.png)

# CLAにサインする。

以下のURLにアクセスし、`Sign up to contribute to this project as an individual`を選択します。
https://identity.linuxfoundation.org/projects/cncf

![スクリーンショット 2020-06-07 17.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/e21b9277-1dff-198f-9720-a76e84220526.png)

画面に従って進めると、電子署名サービスのHelloSignというところから、CLAにサインするページのリンクがメールで送られてきます。

![スクリーンショット 2020-06-07 16.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/e874ac9d-26e0-6843-b102-922ac8aaa235.png)

`Review & Sign`のリンク先のページで、住所など必要事項を入力し、サインを完了します。

基本的には画面の指示に従って行えば大丈夫だったと記憶していますが、覚えている限りで以下の点にちょっと戸惑いました。他にも戸惑ったことがあれば、是非コメントください。

- `Title`という欄には、企業で登録する際は通常役職を記載するようです。今回は個人でのサインだったので何を記載すべきかわからず、自分はとりあえず「Contributor」と記載しました。何を書くべきかご存知でしたら教えてください。。
- `Mailing Addresses`はメールアドレスではなく、自分の住所を記載します。


サインが完了すると、以下のようなメールが来ます。自分がサインした内容が添付されていますので、内容が問題なければOKです。
![スクリーンショット 2020-06-07 16.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/87fca9c1-93af-ddfc-8f4e-0b0f172e1cc2.png)

以上でCLAは完了です。
Linux Foundation IDのアカウントページにアクセスすると、Project membershipとGroupが追加されています。

![スクリーンショット 2020-06-07 17.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/2cda2331-6734-b3a9-fba6-ecb1adee2e2a.png)

# Pull Requestを送る。

これで、PRしたときにCIロボが`cncf-cla: yes`ラベルをつけてくれれば成功です！

![スクリーンショット 2020-06-07 17.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279529/20dba888-b1b7-c2f1-38e9-83a38a9c7f39.png)

# トラブルシューティング

自分はこれですんなりできたのですが、うまく行かない時は改めて公式のドキュメントやトラブルシューティングを参考にしてください。

https://github.com/kubernetes/community/blob/master/CLA.md#troubleshooting
CSSだけでハンバーガーメニュー

本記事ではCSSだけでハンバーガーメニューを実装します。


##前提条件
・javascriptは書かない
・id属性は使用しない。
・SCSSで書く


とりあえず完成品

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="hornet2641xx" data-slug-hash="oNbXdyR" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="oNbXdyR">
  <span>See the Pen <a href="https://codepen.io/hornet2641xx/pen/oNbXdyR">
  oNbXdyR</a> by HoRnet2641XX (<a href="https://codepen.io/hornet2641xx">@hornet2641xx</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


##解説とポイント（自分が最初わからなかったところ）

###解説
・CSSだけで行う場合は`input`の`checked`で制御する

・アイコンも書いているけど、まぁスクリプト書くならどっかからアイコン持ってきてもいいのかなとは思う

・メニューの展開時は画面全体を暗くするようにoverlayを作る


##ポイント

###紐付けについて。

idを使用した実装方法。
`input`タグにid属性を指定して、`label`タグに同じ値を設定することで、`input`と`label`を紐づける方法。

一例

```html:index.html
  <input type="checkbox" id="drawer__box">
  <label for="drawer__box" class="drawer__icon">
    <span class="icon__parts"></span>
  </label>

```

ここでid属性を使ってしまうと、メリットよりデメリットが多くなってしまいます。。
もちろんid属性を指定するメリットはたくさんあります（DOMの要素速度の取得速度の向上や、視認性の高さなど）が、
`class`でできるならその方がいいですよね。

上のコードを`id`ではなく、`class`にする場合は以下のようにして紐づけることができます。

```html
  <label class="drawer__icon">
    <input class="drawer__toggle" type="checkbox" >
    <span class="drawer__icon__parts"></span>
  </label>
```

変更点は`input`タグを`label`タグで囲んであげるだけです。
classとidが散乱していないので上のコードより見やすいかなと個人的には思います。
PRML　演習問題  2.42（基本）

## はじめに
本記事は, 機械学習の教科書の決定版ともいえる, **Christopher Bishop先生**による[**『Pattern Recognition and Machine Learning （パターン認識と機械学習）』**](https://www.microsoft.com/en-us/research/people/cmbishop/prml-book/), 通称**PRMLの演習問題の解答**を記したものです. これは, [**生物測定学研究室**](https://www.ut-biomet.org/)の輪読会でPRMLを取り扱っており, その勉強の一環として演習問題を解いたときのもので, **匿名の有志の学生による解答をこちらのアカウントから代わりに投稿**させていただいています.　（なお一部数式の表現などを修正してあります.）



## 問題
>**2.42**（標準）ガンマ分布(2.146)の平均、分散、およびモードを求めよ
（モードとは、最頻値のこと）
ガンマ関数の定義
$$
\begin{align*}
\Gamma(\mu)=\int_0^\infty a^{\mu - 1}e^{- a} d\mu
\tag{1.141-改変}
\end{align*}
$$
今回は、この関数の性質である
$$
\begin{align*}
\Gamma(\mu + 1) = \mu \Gamma(\mu)
\end{align*}
$$
を利用する。
また、ガンマ分布とは
$$
\begin{align*}
Gam(\lambda|a,b) = \frac{1}{\Gamma(a)}{b^a}{\lambda^{a-1}}e^{-b{\lambda}}
\tag{2.146-改変}
\end{align*}
$$
で求められる分布であり、
$$
\begin{align*}
\int_0^\infty\frac{1}{\Gamma(a)}{b^a}{\lambda^{a-1}}e^{-b{\lambda}}d\lambda = 1
\end{align*}
$$
である。（演習2.41）
また、この関数は、本文中では説明が省かれているが、$a > 0,b > 0, \lambda > 0$である。
（多分この分布が『分散の共役事前分布』として想定されているため）

## 解法
基本的に[PRML 演習問題 2.6 （基本）](https://qiita.com/Lab_of_Biomet/items/77b8a6fa7f273611883c)のベータ分布の問題と同じ解法です。
ガンマ分布の平均は確率分布$\lambda \times {Gam(\lambda|a,b)}$の積分で求められるため、(2.267)は(2.265)より

```math
\begin{align*}
 \mathbb{E}[\mu] & = \int_0^\infty\frac{1}{\Gamma(a)}{b^a}{\lambda^{a}}e^{-b{\lambda}}d\lambda \\
& = \frac{b^a}{\Gamma(a)}\frac{\Gamma(a+1)}{b^{a+1}}\int_0^\infty{Gam(\lambda|a+1,b)}d\lambda \\
& = \frac{b^a}{\Gamma(a)}\frac{a\Gamma(a)}{b^{a+1}} = \frac{a}{b} \quad(2.147)
\end{align*}
```

よって、ガンマ分布の期待値を示すことができた。
ガンマ分布の分散については、確率変数の2乗の期待値を用いて計算する。

```math
\begin{align*}
 \mathbb{E}[\mu^2] & = \int_0^\infty\frac{1}{\Gamma(a)}{b^a}{\lambda^{a+1}}e^{-b{\lambda}}d\lambda \\
& = \frac{b^a}{\Gamma(a)}\frac{\Gamma(a+2)}{b^{a+2}}\int_0^\infty{Gam(\lambda|a+1,b)}d\lambda \\
& = \frac{b^a}{\Gamma(a)}\frac{a(a+1)\Gamma(a)}{b^{a+2}} = \frac{a^2+a}{b^2}
\end{align*}
```

この式と、分散の公式 $\operatorname {var}[\mu] = \mathbb{E}[\mu^2] - {\mathbb{E}[\mu]^2}$ より、

```math
\begin{align*}
\operatorname {var}[\mu] = \frac{a^2+a}{b^2} - \frac{a^2}{b^2} = \frac{a}{b^2}\quad(2.148)
\end{align*}
```

最後に、ガンマ分布の最頻値を求める。
まず、$\lambda$を含まない正規化定数はあまり重要ではないことから $f(\lambda) = \lambda^{a-1}e^{-b{\lambda}}$ を前提とする。
$\lambda > 0$ より積分の内側が正であることから、正規化定数も正とみなし、以下の解説では$f(\lambda)$のみから最頻値を求める。

```math
\begin{align*}
f'(\lambda) & = (a-1)\lambda^{a-2}e^{-b\lambda} - b\lambda^{a-1}e^{-b\lambda} \\
& = ({\lambda^{a-2}e^{-b\lambda}})\{(a-1)-b\lambda\}
\end{align*}
```

まず、$0 < a \leq 1$の場合、$\frac{a-1}{b} < 0$よりこの導関数は常に負になること、$\lambda > 0 ,\lim_{\lambda \to +0} f(\lambda) = \infty$となるため、最頻値は存在しない。
また、$1 < a$のときは、$f'(\lambda) = 0$となる$\lambda$は$\frac{a-1}{b}$である。
よって

```math
\begin{align*}
  \left\{
    \begin{array}{l}
      f'(\lambda) > 0 \quad(0 < \lambda < \frac{a-1}{b}) \\
      f'(\lambda) = 0 \quad (\lambda =  \frac{a-1}{b}) \\
      f'(\lambda) < 0 \quad(\frac{a-1}{b} < \lambda < 1)
    \end{array}
  \right.
\end{align*}
```

となる。
よって、ガンマ分布の最頻値は$\lambda = \frac{a-1}{b} (a > 1の場合のみ)$であることが示された。 ■
Python初心者の為のエラーとの戦い方

#　はじめに

　書籍を使って独学でプログラミングを学び始めた際、エラー処理に苦しみ挫折しかけました。
　何が分からないのか、分からない状態に陥り少しトラウマだったりします笑



　なので、~~当時の自分への供養も兼ねて~~同じような初学者の力になるため記事にしました。


##　対象　

　・プログラミング経験,知識がほぼないという方
　・まだ専門用語がよくわからない方
　・言われた通りに記述してるのになんで動かねぇんだ！という方


##　ゴール

　・何を直せばいいのか理解できるようになる

# 　エラーの例

　意図的にエラーを出すため、[plotly](https://plotly.com/python/)というライブラリをインポートしてみます。


```python:filename.rb
import plotly.express as px
```

### 　エラーメッセージ

すると、このようなメッセージが出ます。

ModuleNotFoundError　Traceback (most recent call last)　<　ipython-input-6-86e89bd44552　> in 　<　module　>
----> 1 import plotly.express as px
ModuleNotFoundError: No module named 'plotly'

直訳すると、'plotly'というモジュールがないよ。という意味です。

###　エラーの原因


今回のケースでは

・PATHが通っていない
・モジュールのインストールが済んでいなかった

などいくつか理由が考えられます。

しかし、最初のうちは見ただけじゃそんなの分かりませんよね。

# 解決法

##　では何をすればいいのか?


**　エラーで出たメッセージの検索**です。特に下一行。

今回のケースでは

・ModuleNotFoundError: No module named 'plotly'

の一行ですね。

　エラーコードをネット検索かけると、類似の質問をしてる人がいるので
その中で**自分の状態に近い人の解決方法を参考にする**のがオススメです。

そうするとエラーの原因及び、**自分が何をすればいいか**の指針が見えてきます。

##　まとめ
　様々な種類のエラーがありますが、理由がわからない場合の対処はほぼ一緒だと考えます。

・エラーが出たらその文章を検索
・似たケースと自分のケースを比較、検討
・試行

　です。一つずつ試してベストな形にしていきましょう。
　
##　あとがき
 　エラー出まくって、どうすればいいか分からない初心者の助けになれば幸いです。
　

#参考
・https://plotly.com/python/
超簡単！！Webページを5分でインターネット上に公開する方法

#はじめに
今回は、超簡単に自分で作成したWebページをインターネット上に公開する方法を議事録として記録します！
もう知ってるよって方も多いかと思いますが、その辺はご了承下さい:bow_tone1:

*※GitHubを使用して公開するので、GitHubに登録する必要があります。*

#Webページを公開する流れ
公開するための手順を説明していきますが、大前提として公開するWebページは完成しているものとします（笑）

##GitHubに登録/ログイン
まずは[GitHub](https://github.co.jp/)にアクセスしましょう！
既にアカウントを持っている場合はそのままログインし、アカウントを持っていない場合はSignUpして下さい。
<img width="1440" alt="スクリーンショット 2020-06-07 15.59.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/cd2a9a7e-d55e-f842-d890-7a143d213423.png">
登録方法についてはこちら記事を参照してもらうと分かりやすいです！
[GitHubアカウント作成とリポジトリの作成手順](https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)

#リポジトリの作成
次はリポジトリを作成します。
GitHubのページから新しくリポジトリを作成するか、[GitHub Desktop](https://desktop.github.com/)を使用してリポジトリを追加しましょう！
<img width="1440" alt="915589DD-54CD-4FA4-8DA5-47BAC0F5686D_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/784932c0-f0a5-27a9-0439-cd030f96b7ad.jpeg">
<img width="1440" alt="07112061-6F40-4503-AB0C-3934C35B62A0_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/91fb7e46-cc75-91f6-ec77-470c128b5912.jpeg">


リポジトリの作成方法に関してもこちらの記事を参考にしてもらうと分かりやすいです！
[GitHubアカウント作成とリポジトリの作成手順](https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)

##リポジトリにファイルをアップロード
リポジトリが完成したら公開するファイルをアップロードしましょう！
GitHub Desktopでリポジトリを作成した場合は既にファイルも登録されているのでここはスキップしてください。
`Create new file`の場合は、直接コードを記述します。
`Upload files`の場合はHTMLファイルやCSSファイル、画像などが追加できます。
<img width="1440" alt="9185A9CC-4544-42E5-B63C-8E3D44DE566B_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/a0d2131e-57aa-77b7-36eb-874827f3de40.jpeg">

##ページの公開
最後にアップロードしたファイルを公開します！
画面右上の`Settings`をクリックします。
そして、`GitHub Pages`欄にある`Source`がデフォルトでは`None`になっているので、`master branch`に切り替えます。
<img width="1440" alt="86C8D42C-1F7A-4A0A-9458-FBDB1ADAD305_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/4f24ec05-19d7-121d-92a6-b0e7e180a8f3.jpeg">

そうすると青い背景にURLが表示されるのでこれで公開は完了です！
<img width="1440" alt="E5A23625-D9BB-4DB8-96B7-63F7F9B7E581_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/7711d521-e516-44ce-736f-883395358545.jpeg">

##終わりに
いかがだったでしょうか？
簡単な作りのWebページだったり、ゲーム、ポートフォリオなどを公開するにはもってこいだと思います！！

ただし、GitHubを使用して公開するのでソースコードも公開することになってしまいます。
ソースコードを公開したくない方は注意してください！
[React]superのpropsとは何か。

#super (props)のprops とは何ぞや

リアクトのコンポーネントを作成する時、いつも

```react
class Hello extends React.Component {
    constructor (props) {
        super(props)
        // イベントハンドラをthisで結びつける
        this.clickHandler = this.clickHandler.bind(this)
    }
}
```

```react
super (props)
```
を書いている。
これは何を意味しているのか。


propsを

```javascript

console.log (props)
```

すると、

```react

ReactDOM.render(
    <Hello name="クジラ"/>,
    document.getElementById('root')
)
```

ここで渡されていた
name="クジラ" が表示された。


#####propsの結果はコンポーネント呼び出しのとき渡された値だと判明

#なぜpropsの値をsuperするのか

参考 : https://qiita.com/hand-dot/items/61a4b808f110b12e4281

結論 : 

super(props)を定義してからでないと
```this.state```等でprops内の値を新規追加出来ないから。
git初心者だった（？）私がよく忘れるgitコマンドメモ

# いつもWebを見るので、いつも覚えられないのでメモ
- 毎回検索してコピペするので、いつまでたっても覚えられない・・・
- 毎回検索するのすら嫌になってきたので、使用頻度が高いと思うものを勝手にメモ
- 体系的な解説ではないので、申し訳ございません。個人メモに毛が生えた程度です。

### ローカルの編集をなかったことにする
```
git reset --hard HEAD &
```
### configの中身確認
```
git config --list
◆名前の設定
git config --global user.name Nanashino.Gonbe
git config --global user.email nanashino.gonbe@noname.co.jp
```
### リモートブランチをローカルにCheckoutする
```
git checkout -b local_branch_name origin/remote_branch_name
```
### tagを指定してclone
```
git clone リポジトリ名 -b ブランチorタグ名
```
### ブランチの作成
```
git branch -a
git checkout master
git checkout -b 作成するブランチ名
git branch -a
git push -u origin 作成したブランチ名
```
### git cloneして違うリポジトリにpushする
```
git clone XXXXXX
git remote -v
git remote set-url origin ※新しく作成したリポジトリURL
git remote -v
git push origin master
```

### ローカルブランチの削除
```
git branch -d ローカルブランチ名
```
CentOS7でclangdをビルドする

## ~~ごめんなさい~~

~~この記事はそもそも不要でした。
CentOSでclangdを使う場合配布バイナリを入れるだけでOKです。
2021/02/07現在の最新版はこちら。
https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.1/clang+llvm-11.0.1-x86_64-linux-sles12.4.tar.xz~~

~~(SUSE向けのバイナリダウンロードが正解ってのは気づきませんでした)
ここから下の記載は不要だけども、誰かの役に立つかもなので一応取っておく。~~

いや、やっぱり11.0.0以降はCentOS7だとglibのバージョンが合わないので、この手順は必要なようだ。
10.0.0以前なら多分以下のダウンロードのみで動くが、clangdは進化が早いのでなるべく最新をビルドしたほうがいい。
https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/clang+llvm-10.0.0-x86_64-linux-sles11.3.tar.xz

## やりたいこと

- clangdをCentOS7で使いたい
- でもCentOS7向けのバイナリ配布が無いのでビルドが必要  
  こちらでバイナリ配布があるが、CentOS7だとほんの僅かにglibcが古くてダメ  
  https://github.com/clangd/clangd/releases/download/10.0.0/clangd-linux-10.0.0.zip
- CentOS7のgcc, cmakeのバージョンがかなり古い
- 個人的な理由からyumのリポジトリ追加は避けたい（SCL使えばもっと楽なはず）
- よって、gcc, cmakeのビルドからやってみる

## 手順

大まかな流れは以下の通り。

1. 必要なパッケージのインストール
2. gccをビルドする
3. cmakeをビルドする
4. clangdをビルドする

## 環境

こんな環境でやりました。

- CentOS7  
  まっさらな環境から試したかったのでdockerでクリーンな環境を作った。
  dockerのホストはubuntu20.04
- メモリ 8GB  
  最低限以下のレベルだと思う。最低16GBは欲しい。  
  何もせずにやるとメモリ枯渇でリンクが死ぬので、今回の手順ではホストのswapを増やして頑張った。
- SSD  
  ~~clangdだけでも30GB位空き容量が欲しい。  
  clang-tidyとかclang-formatとかclangそのものまでビルドすると確か50GBとかもっと使う。~~  
  Debugビルドにしてたのが原因ぽい。Releaseなら10GBくらいでOK。

## 必要なパッケージのインストール

wgetは普通にブラウザダウンロードするなら不要。openssh-develはcmakeが必要というので入れる。

``` bash
yum install gcc gcc-c++ make cmake bzip2 wget openssl-devel
```

## gccをビルドする

gccのバージョンは適当。5.1.0以上なら何でもいいはず。
makeの-jオプションは環境に合わせて適当に調整する。cpuのコア数-1位がいいと思う。何でもよければ数字を消すだけでもOK

```bash
wget http://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.gz
tar xf gcc-7.3.0.tar.gz
cd gcc-7.3.0
./contrib/download_prerequisites
./configure --prefix=/opt/gcc --disable-multilib --enable-languages=c,c++
make -j 3
make install
```

## cmakeをビルドする

cmakeはビルド済バイナリの配布があったと思うので別に無理してビルドする必要は無いが、ついでなのでビルドしておく。
こっちもバージョンは適当(今の最新かな？)。3.4.3以上である必要がある。

``` bash
wget https://github.com/Kitware/CMake/releases/download/v3.17.3/cmake-3.17.3.tar.gz
tar xf cmake-3.17.3.tar.gz
cd cmake-3.17.3
./bootstrap --prefix=/opt/cmake
make -j 3
make install
```

## clangdをビルドする

clangdは凄い勢いで開発進んでいるので、新しい方が機能多くていいと思う。今回は最新安定版の10.0.0をビルドする。
メモリ容量が微妙な人は後述の手順でswapを増やしてから行った方がいいと思う。
あと、このビルドは結構時間がかかる。2h以上は見ておいた方がいい。

``` bash
PATH=/opt/gcc/bin/:/opt/cmake/bin/:$PATH

wget https://github.com/llvm/llvm-project/archive/llvmorg-12.0.0.tar.gz
tar xf llvmorg-12.0.0.tar.gz
cd llvm-project-llvmorg-12.0.0
mkdir build
cd build
CC=/opt/gcc/bin/gcc CXX=/opt/gcc/bin/g++  cmake ../llvm -DCMAKE_CXX_LINK_FLAGS="-Wl,-rpath,/opt/gcc/lib64 -L/opt/gcc/lib64" -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DLLVM_TARGETS_TO_BUILD="X86" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/clang
make -j 3
```
自分の環境だとメモリが8GBしか無く、後半のリンクでメモリが枯渇するのでswapを増やす。
以下の手順はホストPC(ubuntu20.04)で行った。他の環境だと手順が違うかもしれない。「仮想メモリ 増やし方」とかで適当にググって欲しい。

``` bash
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```

## clangdをインストールする

/opt/clang/bin/にインストールされるので後は適当にパスを通しておしまい。

``` bash
sudo make install
```

## 参考

https://www.llvm.org/docs/GettingStarted.html#getting-a-modern-host-c-toolchain
【初心者】railsのアソシエーションを利用したカラムの表示でハマった話

## テーブルの構成
- groupsテーブル
- messagesテーブル

## アソシエーション
- `groups` : has_many :messages
- `messages` : belongs_to :group

## したかったこと
特定のグループの最新メッセージをアソシエーションを利用して取得したい。

## 上手くいかなかったコード
```ruby:messages_controller.rb
#略
  def index
    #略
    @latest_massage = @group.messages.order(updated_at: :desc).limit(1)
  end
  #略
  def set_group
    @group = Group.find(params[:group_id])
  end
```
```ruby:index.html.erb
  #略
  @latest_message.content
```
### 出力結果 → NoMethodError

## contentを取り出せたコード
```ruby:index.html.erb
  #略
  @latest_message[0].content
```
## 学んだこと
- `@group.messages.order(updated_at: :desc).limit(1)`では、まだメッセージは配列に格納されたハッシュのままなので、`.content`で取り出すためには、要素の指定がいる。__配列に格納された状態ではゲッターメソッドは使えない。__
- `order(updated_at: :desc).limit(1)`を使わなくても、最新メッセージを取得するのであれば、`@group.messages.last.content`とするのが手っ取り早い。
- contentを取り出すだけなら、eachメソッドに`@group.messages`を渡して順番に取り出せる。
AtCoderでRuby学習12 標準出力の使い分け（p/puts/print）

## はじめに
Rubyおよびアルゴリズムの学習の一環として競技プログラミングに参加しています。
ここでは、学習の中で学んだことをアウトプットしていきます。

今回は標準出力について。
これまでなんとなくでprintをメインに使ってきましたが、
さすがに区別は出来ていた方がいいだろうと思ったのでまとめておきます。

## 単純にまとめると
**pメソッド**
・ オブジェクトの型を反映した出力（文字列型は**" "**に囲まれて出力。整数型はそのまま）
・ 一行ごとに改行

**putsメソッド**
・ オブジェクトを文字列に変換して出力
・ 一行ごとに改行

**printメソッド**
・ オブジェクトを文字列に変換して出力
・ **改行しない**

## pメソッド
オブジェクトの型を反映した出力を行います。
文字列は**" "**に囲まれた形で出力されてしまうので、
解答を文字列で行うような問題では、不正解となってしまいます。
整数で解答を行う場合は問題ありません。

```ruby
p "test"
p 123
```
```ruby:出力
"test"
123
```

## putsメソッド
オブジェクトを文字列に変換して出力します。
文字列の最後で改行が行われます。

```ruby
puts "test"
puts 123
```
```ruby:出力
test
123
```

## printメソッド
オブジェクトを文字列に変換して出力します。
putsメソッドと違い、改行は行われません。

```ruby
print "test"
print 123
```
```ruby:出力
test123
```
上記のように2つのオブジェクトを続けて出力する際は、文字列が繋がった状態で出力されます。

出力される形式が少しずつ異なる為、問題によって使い分ける必要がありそうです。


##問題例①
「Atcoder Biginners Selection」第2問「[Product](https://atcoder.jp/contests/abs/tasks/abc086_a)」より

二つの正の整数a, bがあります。
aとbの積が偶数であればEvenを、奇数であればOddを出力しなさい。

```ruby:入力例
3 4
```

```ruby:解答例
a, b = gets.split(" ").map(&:to_i)
p (a*b).odd? ? "Odd" : "Even" #pメソッド
puts (a*b).odd? ? "Odd" : "Even" #putsメソッド
print (a*b).odd? ? "Odd" : "Even" #printメソッド
```

```ruby:出力
"Even" #pメソッド 不正解
Even #putsメソッド 正解
Even #printメソッド 正解
```
**" "**で囲んでしまうpメソッドでは不正解となりました。
putsメソッドかprintメソッドでの解答が正解となります。

##問題例②
「Atcoder Biginners Selection」第3問「[Placing Marbles](https://atcoder.jp/contests/abs/tasks/abc081_a)」より


3つのマスからなるマス目があります。
各マスには"0"か"1"が書かれており、"1"が書かれているマスにビー玉を置きます。
ビー玉が置かれたマスはいくつあるか答えなさい。

```ruby:入力例
101
```

```ruby:解答例
ary = gets.split("").map(&:to_i)
count = 0
ary.each{|i| i==1 ? count+=1 : count+=0}
p count #pメソッド
puts count #putsメソッド
print count #printメソッド
```

```ruby:出力
2 #pメソッド 正解
2 #putsメソッド 正解
2 #printメソッド 正解
```
この問題では、どのパターンの出力でも正解となりました。

##問題例③
「Atcoder Biginners Selection」第1問「[Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)」より

整数a,b,cと文字列sが与えられます。
a+b+cの計算結果と、文字列sを半角スペースを挟んで並べて出力しなさい。

```ruby:入力例
1
2 3
test
```

```ruby:解答例
a = gets.to_i
b, c = gets.split(" ").map(&:to_i)
s = gets.chomp
p "#{a+b+c} #{s}" #pメソッド
puts "#{a+b+c} #{s}" #putsメソッド
print "#{a+b+c} #{s}" #printメソッド
```

```ruby:出力
"6 test" #pメソッド 不正解
6 test #putsメソッド 正解
6 test #printメソッド 正解
```
この問題でも問題例①と同様に、pメソッドのみが不正解となりました。
**文字列を出力して解答するような問題の場合は、putsメソッドかprintメソッドで解答するのがいいようです。**




## 最後に
以上、よく使う標準出力の使い分けについてでした。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。
master failed to start, check stderr log for detailsのエラーに対処する

##はじめに
EC2を使って、railsアプリをデプロイさせようとするもUnicornがうまく起動しなかったので記事にしました。

##エラー分
表題にも記載しているとおり下記のようなエラーに遭遇しました。

```ターミナル
$ unicorn_rails -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D -E production #実行

master failed to start, check stderr log for details #エラー分

```

##解決策
Unicornを起動させるコマンドの先頭に`bundle exec`をつけることで無事に起動しました。

```ターミナル
$ bundle exec unicorn_rails -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D -E production
```

##原因
log/unicorn.logをチェックしたところ、『 You have already activated unicorn 5.5.3, but your Gemfile requires unicorn 5.4.1.』と書かれていたので、おそらくbundlerでインストールしたものとGemfileに書かれているunicornのバージョンが違うことによるものだろうと

##bundle execって何？
これを先頭につけることによって、Bundlerが管理するgemを利用できる状態でコマンドを実行することになるらしい。
Pythonのimportシステムを理解するためのお役立ちサイト

## Pythonのimportシステムについて調べたときに参考になったサイトの備忘録です
- https://www.slideshare.net/uckey/general-python-import-mechanism
- https://the-hitchhikers-guide-to-packaging.readthedocs.io/en/latest/introduction.html


## メモ
- moduleとpackageがある
- Python2.7では基本的には__init__.pyがあることでpackageとして認識される
- importはsys.path→sys.modules
- .pthファイルというのがあって、.pthファイルでsys.pathにパスを通す方法もある
Colaboratoryで流体力学をCupyする。その１

流体力学をGoogle　Colaboratoryでやります。
まずは準備編です。

#流体力学
　流体力学は、物理学の一つですが、大学でやります。なので、対象は大学生以上とします。大学数学がわかっている前提ですやります。
　大学卒業してから３０年が経過して、当時は大型計算機、その後スーパーコンピューターと呼ばれるもので計算されていました。今では使える人も少ないfortranで書かれていたみたいです。
　大学に通う子供が、流体力学を使った研究をするみたいなので、興味を持ったことがきっかけです。
　今では、GPGPUでかなりのことができるようになりました。それでも、GPGPUを用いた方法は、あまり紹介されておらず、調べてもよく分からなかったので、勉強がてら触ってみようかと思ったのが動機です。

#GPGPU
Colaboratoryも、pythonを基本言語にしているので、pythonベースで考えます。
pythonの中でも、Numpyは、行列計算を容易にするものです。ほとんどNumpyだけとも言えます。そして、GPGPUで強力なのは、Cupyです。
人工知能関係でpreferred networksが作ったchainerから派生したCupyを使用すると、簡単にGPGPUを使うことができます。Google　ColaboratoryにはCupyがプリインストールされているので、便利です。
Google　Colaboratoryとpythonについては、ここでは詳しく書かないので、自分で調べてください。

#PySPH
流体力学の中でも計算流体力学は、CFDと呼ばれていますが、その中の一つ粒子法のSPHを当面使います。これ以外を見つけることができなかったのが理由です。
TODOリスト

## やらんとあかん
1. C++学習
2. a

## やりたい
1.Game(Unity)
    1-2. 大縄跳び
    1-2. 放置ゲー
    1-3. ガチャゲー
    1-4. ワールド(ダンジョン)シミュ
    1-5. 野球

2.Web App
    2-1. 好みの可視化
    2-2. スケジューラー

3.Other
    3-1. フーリエ変換等の備忘
    3-2.