OmniAICreator/Qiita-1.07M huggingface dataset:
Gitのおさらい（よく使うコマンドまとめ）

※HTML/(S)CSSまでならできるデザイナー向けの内容

# Gitとは
- 「分散型バージョン管理システム」である（ほかに集中型がある）
- 誰がなんのためにどこを変更したのか確認できる
- 「複数人で同じソースを修正する時に使うシステム」という理解でOK

# プロンプト
- Linuxなどのターミナル上に表示される「$」など、「ここにコマンド打てますよ」のサイン
- bashではPS1変数に「どう表示させるのか」が格納されていて、自分で変更することができる
- エンジニアとの会話でよく出てくるから覚えておいた方がいい

## プロンプトの記号の意味
```terminal:terminal
[NAME +]$ # ステージングされているがコミットが終わっていない
[NAME <]$ # リモートの方が歴史が進んでいる
[NAME >]$ # ローカルの方が歴史が進んでいる
[NAME =]$ # リモートもローカルも同じ進み
[NAME %]$ # リモートにないファイルが追加されている
[NAME *]$ # リモートにもローカルにもあるファイルの内容が異なる
```

# よく使うコマンド
## 基礎編（「教えられる」レベルにしておくとよい）
### リモートの変更を落とす
```terminal:terminal
$ git fetch
```
- プロンプトの記号が`<`か`>`になる
- ↑「手元の状態と比べて進んでるのかどうか」を言ってくる

### リモートの変更を反映させる
```terminal:terminal
$ git pull
```
- プロンプトの記号が`=`になる
- `pull`には`fetch`が含まれているようだが、**私は自分を信じられないのでどっちもやる**

### ブランチを作る
```terminal:terminal
$ git checkout -b {ブランチ名}
```
- やる前に親ブランチを更新（`fetch`→`pull`）しておかないと**エンジニアに死ぬ程叱られる**
- 最新Gitでは`git switch`に修正されているよう
- ちなみに接頭にハイフンがつくやつは「オプション」と呼ばれている（「bオプションつけて」とか言われる）

### 保存する修正ファイルを選択する
```terminal:terminal
$ git add {ファイルパス}
```
- プロンプトの記号が`+`になる。これを「ステージング」という
- `git add .`ですべてのファイルを選択

### 修正を保存する
```terminal:terminal
$ git commit -m '{コミット名}'
```

### ブランチをサーバに上げる
```terminal:terminal
$ git push -u {ブランチ名}
```
- 初めてpushする時は必ず`-u`をつける。するとプロンプトに例の記号が表示されるようになる。これは**ローカルとリモートのブランチの紐付けがされたことを示す。**一度`-u`をつけたら、次回から`-u {ブランチ名}`をつけなくてよい
- `-f`で強制的にpush。**上書きしてよいかよく確認してから行う**

### 親ブランチに合流する（1）
```terminal:terminal
# 親ブランチにcheckout(switch)してから
$ git merge {ブランチ名}
```
- `--no-ff`で「マージした」というコミットを残す
- 自分の修正の**後に**、親ブランチの修正をくっつける

- ### 親ブランチに合流する（2）
```terminal:terminal
$ git rebase {親ブランチ} #自分の作業ブランチで
```
- 自分の修正の**途中に**、親ブランチの修正を入れる
- `merge`か`rebase`か、合流の仕方はエンジニアの指示に従った方がよい気がする

### 差分を確認する
```terminal:terminal
$ git diff
```
- `--name-only`でファイル名だけの一覧
- 「diffを見てください」とか言う

## 便利編（「できる」レベルにしておくとよい）
### 当該ファイルの修正履歴を一覧する
```terminal:terminal
$ git log {ファイルパス}
```
- `-p`でどんな変更をしたか表示する

### コミットを一覧する
```terminal:terminal
$ git log
```
- `--oneline`でコミット名だけの一覧
- コミットIDを確認できる

### 当該コミットを当該ブランチにくっつける
```terminal:terminal
$ git cherry-pick {コミットID}
```
- 「チェリーピクる」とか言う（言わない）

### コミット名を修正する
```terminal:terminal
$ git commit --amend
```

### 修正を1つ前のコミットに忍ばせる
```terminal:terminal
$ git commit --amend --no-edit
```
- 歴史が変わるので、pushしてないかpushしたことがバレてないブランチでのみ行う

### 当該コミットでどんな変更があったか一覧する
```terminal:terminal
$ git show {コミットID}
```
- `--name--only`でファイル名だけの一覧を表示する

### コミットしてないファイル、あるいはゴミ（Untracked file）を消す
```terminal:terminal
$ git clean
```
- `-n`で消すファイルを選ぶ
- `-f`で強制的に消す

### 複数のコミットを1つにまとめる
```terminal:terminal
$ git rebase -i HEAD~{コミットの個数}
$ git rebase -i HEAD~~~~
```
- {コミットの個数}には、「1つ前のコミットから数えた個数」を入れる。2つ目はコミットの数だけ`~`を書く
- 履歴がキレイになるから重宝する
- 参考：https://qiita.com/takke/items/3400b55becfd72769214

### リモートの内容に書き換える
```terminal:terminal
$ git reset --hard origin/{ブランチ名}
```
- 「もう何がなんだかよくわからなくなったし今までの修正全部ゴミにしちゃってもいいや」という境地になったらやるやつ

# （蛇足）ターミナル操作への思い
たとえば

```terminal:terminal
$ exit
```
ってした時にターミナルが閉じるのを見ると、**「GUIでバツボタン押してる裏でこんなことが…」「Exitって言ったら閉じた…えらい…」という感動がある**ので、マークアップレベルのデザイナーも使うべきだと思っている。世界が変わる。
あと、黒い画面カッコイイ。
マイコンボードTips

あれ、動かないとかここなんのピンだっけ？ってなるので、ボード毎にまとめていく

## Pro Micro 互換ボード
- ピン配置  
https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro
- COMポートが認識されなくなる  
異なる動作クロックのスケッチを書き込むと起こるらしい  
書き込み時に素早くRSTを2回かけるとブートローダーモードの動作時間が通常0.75秒→8秒になるので、その隙に?正しい動作クロックのものを書き込めば修復可能  
~~__試した結果、書き込み/スケッチ実行はできるけどCOMは自動で認識されない__~~  
できた、うまくいく個体といかない個体がある?  
[USBデバイスとして認識されなくなったPro Microの修復](http://okiraku-camera.tokyo/blog/?p=8390)  
[How to Reset to Bootloader | Pro Micro & Fio V3 Hookup Guide](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/troubleshooting-and-faq#ts-reset)  

## Twelite
- ADCの測定範囲中途半端問題  
測定レンジは0-Vccではなく0-2.4V、内部Vrefは1.2V  
[ADCの仕様](https://mono-wireless.com/jp/tech/Hardware_guide/QA_ADC.html)  
MCUにJN5148が使用されているのでデータシートを読んでみると外部Vrefは1.6Vまで印加できるので、twelite SDKを弄れば0-3.2Vまで測定できるかもしれない  
[JN-DS-JN5148-1v7-254806.pdf](https://www.mouser.de/datasheet/2/302/JN-DS-JN5148-1v7-254806.pdf)

## Seeed XIAO
- COMポートが認識されなくなる  
誤ってProMicroのバイナリを書き込んでしまった
解決方法はRSTを2回かける  
[Seeeduino XIAOが見えない（again）…今度はシリアルポートが消えた（解決）](https://jiwashin.blogspot.com/2020/01/seeeduino-xiao-recovery.html)

## TBD
ML Study Jams vol.3 : Machine Learning トレーニング プログラムの詳細をお知らせします

先日の投稿でお知らせしました通り、Google は Machine Learning （機械学習） の専門的な知識を持たない方向けにトレーニングを無料で提供するプログラム「ML Study Jams vol.3」を 2019 年 8 月 20 日（火）から 9 月 15 日（日）の期間中に開催します。

本日は、今回の ML Study Jams 期間中に使用する受講コースを決定いたしましたので、ご連絡いたします。
初心者向け

1) How Google does Machine Learning (https://www.coursera.org/learn/google-machine-learning-jp)
2) Learning into Machine Learning (https://www.coursera.org/learn/launching-machine-learning-jp)

中級者向け
1) End-to-End Machine Learning with TensorFlow on GCP (https://www.coursera.org/learn/end-to-end-ml-tensorflow-gcp)
2) Google Cloud Platform Big Data and Machine Learning Fundamentals (https://www.coursera.org/learn/gcp-big-data-ml-fundamentals?specialization=gcp-data-machine-learning)

すでに以前の ML Study Jams で Machine Learning の基礎を学んだ方でも、新たな中級者向けコースで Machine Learning について学ぶことができます。
本プログラムは、オンライン学習プラットフォーム、Coursera 上にある Machine Learning 関連のコードラボを利用して行います。
今回のプログラムでは、チーム単位で参加しチーム毎に開催する形式となります。受講する仲間がいない方については、地域ごとのチームマッチングもサポートする予定です。チームがまだ決まっていない方も、登録してみてください。

ML Study Jams Vol.3 ご案内ページ
https://events.withgoogle.com/ml-study-jams-japan/

皆様のご応募をお待ちしております。
Posted by Takuo Suzuki - Developer Relations Team
ラズベリーパイで監視カメラ作ってみる。

ラズベリーパイで監視カメラを作る方法を書いておきます。
多分USBカメラはこのやり方じゃできないと思います。
今回使うカメラは
https://www.amazon.co.jp/Raspberry-Pi-NoIR%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9C%E3%83%BC%E3%83%89-PiNoir-Camera/dp/B01ESQY6GU/ref=sr_1_39?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=raspberry+pi+camera&qid=1576854310&sr=8-39
こんな感じのカメラを使います。
ラズベリーパイの薄い線で繫げるやつだったら多分できます
まずはgitコマンドを使えるようにするために、gitのパッケージをダウンロードをします。

```
$ sudo apt get install git
```
そしてRPi_cam_Web_Interfaceというファイルをダウンロードしないといけないので下記のコマンドを実行します。

```
$ sudo git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
```

これでファイルがインストールできたので、次はそのファイルの中に入っているinstall.shを実行します。

```
$ ./install.sh
```
これでインストール画面が出てきますので、任意の設定をします。（基本的にはそのままで大丈夫です。）
これができたら、http://ラズパイのIPアドレス/
でカメラにつながると思います。
日本語（15）かなづかい変換

韓国と日本のIT業界で協力できるかもしれないこと
https://qiita.com/kaizen_nagoya/items/52501f8ee4dc23f595eb

# かな変換1
かなづかいの変換で、旧仮名から新かなへの変換は簡単そう。

旧かな：ゐゑヰヱ
を
新かな：いえイエ
に変換する。

```shell-session:macOS
$ sed -e "s/ゐ/い/" -e "s/ゑ/え/" -e "s/ヰ/イ/" -e "s/ヱ/エ/" zenbunj.txt > zenbunjn.txt
```

２文字でも無理やりなら変更できる。

```shell-session:macOS
$ sed -e "s/ゐ/い/" -e "s/ゑ/え/" -e "s/ヰ/イ/" -e "s/ヱ/エ/" -e "s/やう/よう/" -e "s/思ふ/思う/" zenbunj.txt >zenbunjn2.txt
```

```kyushin.sed
s/ゐ/い/
s/ゑ/え/
s/ヰ/イ/
s/ヱ/エ/
s/やう/よう/
s/なふ/なう/
s/ひて/いて/
s/ぢる/じる/
s/をる/おる/
s/すぢ/すじ/
s/会ふ/会う/ 
s/会ひ/会い/ 
s/思ふ/思う/ 
s/思ひ/思い/ 
s/祝ふ/祝う/
s/祝ひ/祝い/
s/伝へ/伝え/
s/変はる/変わる/
s/強ひて/強いて/
```
 
# 参考資料
【Linuxコマンド】sedで文字列を置換する方法
https://www.sejuku.net/blog/54595

sed - テキストの置換や編集をする
https://linuxcommand.net/sed/

Python による日本語自然言語処理
http://www.nltk.org/book-jp/ch12.html

64bitCPUへの道 and/or 64歳の決意(0)：101件
https://qiita.com/kaizen_nagoya/items/cfb5ffa24ded23ab3f60

連休中の記事数は目標達成した。質向上のために集計。平均が無意味なことを再確認:57件
https://qiita.com/kaizen_nagoya/items/138c543c5e74e380d31d

「量子アニーリングの基礎」への記事一覧<作成中> 27件
https://qiita.com/kaizen_nagoya/items/2f9b56d7dea41e3f18dd

無線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

仮説（0）一覧（目標100現在40）
https://qiita.com/kaizen_nagoya/items/f000506fe1837b3590df

安全（0）安全工学シンポジウムに向けて: 21
https://qiita.com/kaizen_nagoya/items/c5d78f3def8195cb2409

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

鉄道（０）鉄道のシステム考察はてっちゃんがてつだってくれる
https://qiita.com/kaizen_nagoya/items/26bda595f341a27901a0

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

転職(0)一覧
https://qiita.com/kaizen_nagoya/items/f77520d378d33451d6fe

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

数学関連記事１００　
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事　１００
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

views 20,000越え自己記事一覧
https://qiita.com/kaizen_nagoya/items/58e8bd6450957cdecd81

Views１万越え、もうすぐ１万記事一覧 最近いいねをいただいた216記事
https://qiita.com/kaizen_nagoya/items/d2b805717a92459ce853

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

一覧：携帯計画者日記（0）
https://qiita.com/kaizen_nagoya/items/005d38c6f55c85570e74

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Cognos Analytics が cogaudit.logに出力するログメッセージ（エラーコード）一覧

#Cognos Analyticsが出力するログメッセージ一覧が欲しい
Cognos Analyticsがログに出力する可能性のあるメッセージ一覧（エラーコード一覧）が欲しい、と言われる事があります。
エラーコードとは「DPR-ERR-2000」みたいのですね。
マニュアル等見ても、この手のものは公開されていないですね。
世の中の色々な製品は、普通にこういう情報出せるものなのでしょうか。

#ログメッセージ一覧を知る方法
アンオフィシャルな方法ですが、この様にやればメッセージ一覧が取得できるというやり方です。

Cognos Analyticsサーバーにログインして、/opt/ibm/cognos/analytics/msgsdk 配下の各種XMLファイルを見ると、cogaudit.logに出力され得るメッセージがわかります。

例えば、「DispatcherMessages_en.xml」というファイルは、ファイル名からしてディスパッチャーが出力するエラーメッセージな事がわかりますが、
最初の方の行を抜粋すると、以下のようにあり、
この三箇所を見ていくと、
**component name="DPR"**
**section name="DPR"**
**errorCode="1002">Successfully registered the dispatcher**
とあり、これにより
**「DPR-DPR-1002 Successfully registered the dispatcher」** というメッセージが、Cognosは表示する可能性があるという事がわかります。

```html
	<component name="DPR" usage="Messages generated by the Dispatcher">
		<section name="DPR" usage="This section is for message that are generic Dispatcher messages" type="Messages">
			<string id="HANDLER_TRACEBACK">Handler trace back:</string>
			<string id="EXCEPTION_STACKTRACE">Exception trace back:</string>
			<string id="REGISTRATION_SUCCESS" errorCode="1002">Successfully registered the dispatcher <param name="0"/> in Content Manager.</string>
			<string id="UNREGISTRATION_SUCCESS" errorCode="1003">Successfully unregistered the dispatcher <param name="0"/> from Content Manager.</string>
			<string id="BIBusCommand.badMIMEType" errorCode="1004">Expecting a BI Bus XML response but got: \n\n</string>
			<string id="BIBusCommand.missingHeader" errorCode="1005">SOAP Header element not found in the SOAP response: </string>
```

もう少し下の方に行くと、"ERR"のsectionがありますので、
最初の行から、**「DPR-ERR-2000 The dispatcher did not initialize」**  というディスパッチャーのエラーメッセージがある事がわかります。
※「DPR」は前述のcomponent nameから取得

```html
		<section name="ERR" usage="This section is Dispatcher error messages" type="Messages">
			<string id="ENGINE_NOT_INITIALIZED" type="String" errorCode="2000">The dispatcher did not initialize.</string>
			<string id="STOPPED" errorCode="2001">Unable to execute request because the dispatcher or provider has been stopped.</string>
			<string id="NO_PROCESS" errorCode="2002">Unable to execute the request because there were no connections to the process available within the configured time limit.</string>
			<string id="E_POGO_CHANNEL_SEND_FAILURE" errorCode="2003">Unable to write a request.</string>
			<string id="E_POGO_CHANNEL_RECV_FAILURE" errorCode="2004">Unable to read a response.</string>
```

という感じで、とりあえず、裏技的にこの様に見ればメッセージ一覧がわかるよ、という紹介までです。
実際何のメッセージを監視すれば良いかというのは、一概には言えないので書きませんが、もし「自分はこうやってるよ」という情報お持ちの方がいらっしゃいましたら、コメント頂けるとうれしいです。
AWS Lambda で opencvを動かす (python3, S3)

python2.7のやり方はのっていたけど、python3.6がなかったのでメモしておきます。

# 概要と注意点
opencv重いので、S3バケットにzipでアップロードしたものを使用する。
その際に、zipの中に、lambda_function.pyを入れておく。
S3にアップロードされたzipは、AWSコンソール上では編集できないです。

# 手順

### ・その１： Amazon Linuxを立てる
Lambdaで動かすには、ファイル構造をAmazon Linux仕様にしなければならないようです。
よって、Amazon Linuxを立ててください！！！

### ・その２： lambda_fanction.py　を書く
書いてください。
【注意点】
- importは以下のように、numpy→cv2の順で記入してください。
- `lambda_function.py` という名前で
- `def lambda_handler` とう関数の中に書いてください

```python:lambda_function.py
import boto3
import numpy as np
import cv2

s3 = boto3.resource('s3')

def lambda_handler(event, context):
        bucket = s3.Bucket(S3のバケット名)
        bucket.download_file(S3にある画像, /tmp/S3にある画像名) #これで、Lambdaのtmpにダウンロード

        print('-----cv2-----')
        image_path = '/tmp/ダウンロードされた画像 #2行上の /tmp/S3にある画像名 と同じ '
        img = cv2.imread(image_path)
        cv2.imwrite('/tmp/image.jpeg',img)
        print('/tmpのls: ', subprocess.run(["ls", "-l", "/tmp"], stdout=subprocess.PIPE))
        bucket.upload_file('/tmp/image.jpeg', 'image.jpeg')
        print('complete upload')
        print('-------------')
```

### ・その３： 必要なモジュールを -t　でpipインストールする
requirements.txtがあればそれを使っても構いません。
lambda_function.pyがあるディレクトリで、モジュールたちが並列になるようにインストールします。
`pip3 install opencv-python -t .`

【注意点】
- lambda_function.pyがあるディレクトリで行なってください
- 今回動かすlambdaの環境がpython3なので、opencvのインストールもpytho3の環境で行なってください


### ・その4： まとめてzipする。
`zip -r lambda-package.zip *`
これでlambda-package.zipという名前でzipされます。


### ・その5： S3にアップロードする
zipをアップロードします。

### ・その6： lambdaから読み込む
関数コードを `Amazon S3からのファイルのアップロード` にし、ランタイムはPython3.6を選びます。
そして、リンクURLに、その５でアップロードしたURLを記入します。
<img width="1524" alt="スクリーンショット 2019-08-19 17.07.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192887/9d61355a-c745-4c1f-70a9-b03f9b9a786b.png">
保存をおしたら完成です。
純粋仮想関数と抽象クラス、スマートポインタ

# やりたいこと
親クラスで定義されたスマートポインタを引数に取る純粋抽象関数を子クラスで実装して使いたいが、やり方がよく分からなかったのでメモをする。
Sub1, Sub2とBaseクラスを継承したものを複数個用意し、Sub1同士、Sub2同士を比較する関数を持たせたいという場面を想定している。子クラスのインスタンスを使用する関数にてテンプレートで解決するのだが、IDEのオートコンプリート機能を使いたいので、テンプレートは出来れば使いたく無いという我儘からきた考えである。私の結論としては、テンプレートを使ったほうが良さそうということになった。このコードはdynamic_castを使っており安全でないらしいことと、スマートポインタを使っても生ポインタを取り出して使用している、といったことをして動かしているのでうまいコードではないような気がするが、これよりうまい方法が思いつかなかった。ちなみになぜdynamic_castは安全でないのかはまだ僕は知らない。

# 実験
最初のコード。生ポインタをcomp関数に入れると動くがスマートポインタを入れると動かない。

```c++

#include <iostream>
#include <memory>

using namespace std;

class Base {
public:
  int val = 0;
  virtual bool comp(const Base* obj) = 0;
  virtual bool comp(const unique_ptr<Base> &obj) = 0;
};


class Sub : public Base {
public:
  explicit Sub(int i){ this->val = i*2; }
  bool comp(const Sub *obj) {
    return this->val < obj->val;
  };
  bool comp(const Base *obj) override {
    return comp(dynamic_cast<const Sub*>(obj));
  };
  // コンパイルエラー
  bool comp(const unique_ptr<Sub> &obj) {
    return this->val < obj->val;
  };
  bool comp(const unique_ptr<Base> &obj) override {
    return comp(dynamic_cast<const unique_ptr<Sub>>(obj));
    // return comp(dynamic_cast<const unique_ptr<Sub>&>(*obj));
    // return comp(dynamic_cast<Sub*>(obj.get()));
  };
};


int main() {
  // 生ポインタを使うと動く
  Base *pr1 = new Sub(1);
  Base *pr2 = new Sub(2);
  cout << (pr1->comp(pr2) ? "true" : "false") << endl;

  // スマートポインタを使用したい
  unique_ptr<Base> p1 = make_unique<Sub>(Sub(1));
  unique_ptr<Base> p2 = make_unique<Sub>(Sub(2));

  cout << (p1->comp(p2) ? "true" : "false") << endl;
  // 生ポインタを入れると動く
  cout << (p1->comp(p2.get()) ? "true" : "false") << endl;
  return 0;
}
```

しかし、生ポインタを引数に取りたいので、ちょっと改善したらコンパイルは通るが実行時にエラーが起こった。


```c++
  bool comp(const unique_ptr<Base> &obj) override {
    // return comp(dynamic_cast<const unique_ptr<Sub>>(obj));
    return comp(dynamic_cast<const unique_ptr<Sub>&>(*obj));
    // return comp(dynamic_cast<Sub*>(obj.get()));
  }
```

実行するとエラーが発生した。

```bash
>>> true
>>> libc++abi.dylib: terminating with uncaught exception of >>> type std::bad_cast: std::bad_cast
>>> 
>>> Process finished with exit code 6
```

こちらが動くパターンだ。comp関数は引数にユニークポインタを受け取っているが、結局キャストするときは生ポインタを使いましょうということである。エラーになる理由がよくわかってないが、とりあえずこれで動くことは確認できた。生ポインタを外部から入れるよりは少しマシである。

```c++
  bool comp(const unique_ptr<Base> &obj) override {
    // return comp(dynamic_cast<const unique_ptr<Sub>>(obj));
    // return comp(dynamic_cast<const unique_ptr<Sub>&>(*obj));
    return comp(dynamic_cast<Sub*>(obj.get()));
  }
```


`bool comp(const unique_ptr<Base> &obj)`の中身を変更すると、コンパイルが通るようになったり、実行時にエラーを出さなったりしたが、どんどん生ポインタに近づいていった。動くコードでは`bool comp(const unique_ptr<Sub> &obj)`は使用されていないから、しかたない。ユニークポインタを、代入された関数が終了するまで保持し続けるのであればこれでもいいのかもしれないと思った。

ちなみに、スマートポインタのキャストを行いたい人は私以外にも存在するをとは確認できている。
https://stackoverflow.com/questions/26377430/how-to-do-perform-a-dynamic-cast-with-a-unique-ptr


# 謝辞
同僚のエンジニアのMさんに色々教えてもらったので感謝。
capybaraでファイルダウンロードをテストする

Capybaraでファイルをダウンロードするテストを書いたので備忘録

Capybaraでファイルをダウンロードすると、デフォルトのダウンロードディレクトリ(~/Downloads)にファイルがダウンロードされるため、テストがしづらい。
設定を追加して、システムテストを実行しやすくする。

まずは、Capybaraで利用するWebDriverにダウンロードディレクトリを設定する

```ruby
# spec/support/capybara.rb
# frozen_string_literal: true

require 'capybara/rspec'

# 読みこんで、Capybara.current_driverの初期化を済ませる
require 'action_dispatch/system_test_case'

Capybara.register_driver(:pc_headless) do |app|
  options = Selenium::WebDriver::Chrome::Options.new
  options.headless!

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

RSpec.configure do |config|
  config.before(type: :system) do |example|
    driven_by(:pc_headless)

    # ここ。ダウンロード先を指定する
    page.driver.browser.download_path = CapybaraDownloadsHelper.path
  end
end
```

続いて、ダウンロードファイルをテストで利用するためのヘルパーを用意する

```ruby
# spec/support/xxx_helper.rb
# frozen_string_literal: true

# Capybaraでダウンロードしたファイルを管理する
module CapybaraDownloadsHelper
  PATH = Rails.root.join('tmp', 'data', 'downloads').to_s.freeze

  class << self
    # ダウンロード先のディレクトリ
    #
    # @return [String]
    def path
      File.join(PATH, Thread.current.object_id.to_s)
    end

    # ダウンロードしたファイル一覧を返す
    #
    # @return [Array<String>]
    def files
      Dir[File.join(path, '*')]
    end

    # ダウンロードが完了したか
    #
    # @return [boolean] ダウンロードが完了していればtrue
    def downloaded?
      files.grep(/\.crdownload$/).none? && files.any?
    end

    # ダウンロードしたファイルを削除する
    #
    # @return [void]
    def delete_all
      FileUtils.rm_f(files)
    end
  end
end

RSpec.configure do |config|
  config.before(:all) do
    FileUtils.mkdir_p(CapybaraDownloadsHelper.path)
  end

  config.after(:all) do
    FileUtils.rm_rf(CapybaraDownloadsHelper.path)
  end

  config.before do
    CapybaraDownloadsHelper.delete_all
  end
end
```

これで、簡単にテストを行うことができるようになる。

```ruby
RSpec.describe 'download', type: :system do
  it 'downloads file' do
    find('#download_link').click

    Timeout.timeout(10.second) do
      loop do
        break if CapybaraDownloadsHelper.downloaded?
      end
    end

    file = CapybaraDownloadsHelper.files[0]
    expect(file).to test_something
  end
end
```
AWS Batchでのマルチスレッド処理では、コンテナあたりのスレッド数に要注意

# 概要

AWS Batchのジョブ設定には、VCPUという項目がある。
設定の名称からすると、コンテナ内から見えるCPU数が変わるのではないか？という期待を持ってしまいがち。

しかし、この設定の実態はただの優先度設定である ([docker runの--cpu-sharesオプションにマップされている](https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/job_definition_parameters.html))。
よって、ここに何を設定したとしても、コンテナ内からは、Dockerホストに実装されている全てのCPUコアが見える。

# 失敗例

OpenMPなどの並列化プラットフォームを利用すると、デフォルトでは、システムに実装されているCPU数分のスレッドが起動する動作になっていることが多い。
そのような動作をするプログラムを動かす際、以下のような(間違った)設定をしたとする。

*   ジョブ定義：

    VCPU=2、メモリ8GiB

    ※「全スレッド共有で4GiB使用し、さらに1スレッドごとに2GiBのメモリを使用する」という設計のプログラムを動かすものとする。
    ※2スレッド動作時は、4 + 2 * 2で8GiB必要となる。

*   コンピューティング環境：

    m4.16xlarge	(32物理コア・	256 GiBメモリ)

設定時の想定では、16コンテナで32スレッドが起動し、16 * 8 = 128GiBのメモリが消費される。
しかしこの場合、実際には、16コンテナ * 32スレッド(物理コア数分) = 512スレッドが起動する。

## 発生する問題

*   事故パターン1 OOM

    512スレッド * 2GiBだけでも1TiBのメモリが必要になるが、動作しているEC2インスタンスには256GiBしか実装されていない。
    そこで、OOM Killerさんが目覚める。

    ＿人人人人人人＿
    ＞　突然の死　＜
    ￣Y^Y^Y^Y^Y^Y^￣

* 事故パターン2 性能劣化

    スレッドごとに必要なメモリが少なく、OOMが起きなかったとする。
    それでも、処理の大半が演算の場合、CPUの奪い合い(コンテキストスイッチ祭り)が発生する。

    ＿人人人人人人人＿
    ＞　無駄に遅い　＜
    ￣Y^Y^Y^Y^Y^Y^Y^￣

    ただし、この動作は、インスタンスに対して起動中のコンテナが少ない場合にはメリットとなるので、一長一短。
    コンテナがCPU性能を目いっぱい使うので処理がすぐ終わり、ジョブが無くなったインスタンスがスケールインすることでコストが下がる。
    大抵の場合はメリットのほうが大きいかも。

# どうすりゃいいのか

*   スレッド数に比例して消費メモリが(大きく)増える設計/実装は避ける

*   上記が無理なら、起動するスレッド数を固定する

    ハードコードではなく、環境変数経由で指定できるようにして、ジョブ定義で調整するとベター。
    OpenMPならデフォルトでOMP_NUM_THREADS環境変数によるスレッド数指定に対応している。
Amplify注目issue（今後実装されたら嬉しい機能たち）

自分のメモ用。

## Add schedule option on function category cli
cronをamplify cliで設定できる
https://github.com/aws-amplify/amplify-cli/issues/1789

## TypeScript support for functions
タイトル通り
https://github.com/aws-amplify/amplify-cli/issues/659

関連して：
https://github.com/aws-amplify/amplify-cli/pull/1951
amplify pushにhookしてtsc動かせばいけるよね的な

## Provide support of other languages rather than VTL in the fields resolvers
VTLの代わりにNodeとかサポートする
https://github.com/aws-amplify/amplify-cli/issues/569

## Auth Enhancements
https://github.com/aws-amplify/amplify-cli/issues/766

Auth系はまだない機能が多いので、色々な機能拡張が予定されている

## amplify add trigger
任意のソース(S3, cognito, DynamoDB等)にtriggerを追加できるコマンド。
https://github.com/aws-amplify/amplify-cli/issues/1609

## SSR support
Next.jsのSSRをサポートする
https://github.com/aws-amplify/amplify-js/issues/1613
pythonのnp.array配列に格納した２次元座標から、入力した座標に最も近い座標を取得した際の備忘録です

# 目的
pythonのnp.array配列に格納した２次元座標から、入力した座標に最も近い座標を取得した際の備忘録です

# コード

```python:sample.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np

PI = 3.1415
coordinate = np.array([
        # x, y, th
        [0.5, 0, PI],
        [0.9, 0, PI],
        [0.9, -0.5, PI],
        [0.9, 0.5, PI],
        [0.9, 0, PI],
        [0, 0.5, -1*PI/2],
        [0, 0.5, 0],
        [0, 0.5, PI],
        [-0.5, 0, 0],
        [-0.9, 0, 0],
        [-0.9, 0.5, 0],
        [-0.9, -0.5, 0],
        [-0.9, 0, 0],
        [0, -0.5, PI/2],
        [0, -0.5, 0],
        [0, -0.5, PI],
        [0, -0.5, PI/4]
])

# 点p0に一番近い点を取得
def func_search_neighbourhood(p0, ps):
    L = np.array([])
    for i in range(ps.shape[0]):
        norm = np.sqrt( (ps[i][0] - p0[0])*(ps[i][0] - p0[0]) +
                        (ps[i][1] - p0[1])*(ps[i][1] - p0[1]) )
        L = np.append(L, norm)
    return np.argmin(L) ,ps[np.argmin(L)]


def main():
    # target coordinate
    _x = 0
    _y = -0.7

    target_coor = np.array([_x, _y])
    idx, nearrest_coor = func_search_neighbourhood(target_coor, coordinate)
    print( len( coordinate ) )
    print( idx, nearrest_coor[0], nearrest_coor[1], nearrest_coor[2] ) # idx, (x, y, th)

if __name__ == '__main__':
    main()
```

実行結果

```
$ python sample.py
17
13 0.0 -0.5 1.57075
```

# 参考
[Python/NumPyで2点間の距離を計算](http://programming.blogo.jp/python/numpy/distance_between_two_points)
[辞書内のPythonの最も近い座標](https://codeday.me/jp/qa/20190714/1254085.html)
[Python/Numpyで最も近い点を探索](http://programming.blogo.jp/python/numpy/serch_neighbourhood_point)
[Finding the closest point to a list of points](https://codereview.stackovernet.com/ja/q/7426)
jQueryの「document」の意味とは?

## documentってどんな役割?

JavaScriptで`document`っていう記述がよく出てきますよね。

```javascript

$(document).on('click', '【セレクタ】', function ()
 {
 // 何かの処理
});
```

あれってどんな役割をしているのでしょうか?

##documentとは?

JavaScriptでdocumentオブジェクトを活用することで、`HTML要素へ簡単にアクセスする`ことができます。

##documentを使ってできること

documentを使ってできることをいくつか紹介します。

####URL取得や画面遷移をする:location

**locationプロパティ**を使うと、``現在開いているWebページのURLを取得することができます。``

```javascript

//現在開いているWebページのURLを取得する
var url = document.location.href;
```
hrefプロパティでアドレスバーに表示されているURLを取得することができます。


####HTMLの読み込み完了後に処理を実行する

JavaScriptでdocumentオブジェクトを使ってHTML要素を操作する場合、`HTMLが読み込まれた後に処理を実行する`必要があります

そのため、HTMLが読み込まれてからJavaScriptを実行するために以下のような記述をします。

```javascript
$(document).ready(function() {
    //処理を実行する
});
```
この場合、HTMLソースだけを読み込んだあとにすぐJavaScriptの処理が実行されます。画像などを含めて、すべてのリソースが読み込まれてから実行されるわけではないのがポイントでしょう。

##まとめ

・documentを使うことで、任意のHTMLを取得したり追加したりできる。
共有計算機、大型計算機を使うことになった人が陥りがちなこと。教えた側は想像できなかったこと。

共有計算機、大型計算機を使うことになった人が陥りがちなこと
===============================================

# 初心者が陥りがちで、そして教えた側からすると、なぜできないのか？という疑問が残るケース

どのケースも、正しく伝わっていないことが原因だとおもうが、
教えた側には想像もしないところで、つまっていることがある。

# ssh でログインができない

## パスワードを打ったのですが、表示されません、入力されません。

### 初心者の人へ

パスワードは、通常、入力しても、画面には表示されません。

### 教えている側の人へ

入力した文字が表示される（以下、エコーバック）と思い込んでいるケースがあります。
とくにユーザー名は、エコーバックされるので、パスワードもそう思うことが想像されます。

また、最近のスマホだと、非常に短い間、パスワードとして入力している文字が表示される。そういうものを期待している可能性があるのではないかと想像しました。

## パスワードを打ったのだがログインができません。

今の時代、ユーザー名と、パスワードを伝えることがあるのかはおいておいて。
鍵認証でもあるかもしれないケース。

### 初心者の人へ

パスワードをすべて売った後、最後に `Enter` キーを押しましょう。

### 教えている側の人へ

最初にパスワードまたはログイン方法を伝えるときに、
パスワードを入力したあとに、 `Enter` を押すことをつたえましょう。

伝えた場合でも、念の為、聞いてみたほうが良いかとおもいます。

# バックアップができない

共有計算機や、大型計算機などで実行したあと、
その結果をバックアップしてほしい。バックアップしたい。

## コマンドを教わったが、バックアップができない

### 初心者の人へ

どこからどこへ、バックアップするのか？
どのマシンで、どの操作（コマンドを入力）をするのかを確認しましょう。
必要があれば、sshをするのか、しないのか？なども確認しましょう。

### 教えている側の人へ

共有計算機からバックアップする場合など含めて、
どのマシンで、どのような操作をするのか、はっきり伝えましょう。

「scpコマンドで、できるから」だけだと、
共有計算機側に、scpと打ち込んで、手元のMac にコピーをしようとすることが考えられます。

伝えるときに、
- どのマシン
- どのコマンド
- 相手先のマシンへは、ログインしなくてよい、またはログインするを明確にする。

手元へもってくるときには、手元から向こうへ、データを取りに行くということを明確に伝えたほうがよいとおもいました。

その他のケースでは、
- どのマシンで
- このコマンドをうつと
- どのデータが
- どこにいくのか
を伝えたほうが良いです。

#### 例

あなた：実行してもらいたい人

```
「共有計算機で計算した結果をバックアップするために、あなたのMacでターミナルを新しく開いて、以下のscpコマンドを打ち込んでください。」
「これを実行すると、あなたのパソコンから、共有計算機に接続をして、計算データを、あなたのパソコンにコピーしてきます。」
```

## バックアップ用のツールで、バックアップができない


### 初心者の人へ

教わったツールを、どのマシンで実行するのか、確認しましょう。

### 教えている側の人へ

WinSCPを教えたとして、それを Windows で実行しようとせず、
共有計算機側で実行しようとするケースなども考えられます。

そのあたり、明確につたえてあげたほうがよいです。

# データがなくなりました。

自分のコンピュータと、共有計算機を間違えて消してしまった。

## 初心者側

`hostname` コマンドなどで、自分がどこにいるかを把握するようにする方がよい。
または、プロンプトにホスト名を出したほうが良い。

必要があれば、なにかを消すときには、指差し確認する

## 教える側

`hostname` コマンドなどで、どこで作業しているかを確認する方法を教える
または、プロンプトにホスト名を出す方法を教えた方が良い

# docker で動かないけど、普通に動かすと動くツールがあります。

docker for Mac , docker for Windows かどうかを確認する。

これらだと、初期のメモリ設定が、少ない可能性がある。
M5StickVの起動音がうるさいので黙らせた話

# 概要
M5StickV 買っちゃいました。
で、とりあえず色々遊ぼうと思ったんですけど、こいつ、、
起動したら「ピコーン！」
充電しようと思ってケーブル挿したら「ピコーン！」
再起動したら「ピコーン！」
って、ピコーン！ピコーン！うるさいんですよ。
というわけで、まずは静かにさせることにしました。

![KIMG0637.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449620/25da4a5e-1ec1-e996-4a9f-d4108a9b7234.jpeg)
![KIMG0639.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449620/357e4fff-92a1-21ac-05de-13b8a671c81c.jpeg)

# WAV ファイルを鳴らさなければいい
結論としてはこれだけ。flash に書かれている boot.py の WAV ファイル鳴らしているところを消せばいいんですけど、なかなかいうことを聞いてくれない。

## uPyLoader を使ってみた → 不安定
本体フラッシュの boot.py を書き換えるのに [uPyLoader](https://github.com/BetaRavener/uPyLoader/releases) をお勧めしている記事が何個か見つかったので試してみたのですが、どうにも不安定。書き込みが成功したり失敗したり、というか、一度だけ書き込みが成功して、それ以降失敗続きです。書き込み成功した１回はいったい何だったのだろう、、？

## ampy も使ってみた → GETできない
[ampy](https://github.com/pycampers/ampy) も使ってみたのだけど、あまり状況変わらず。`> ampy ls /flash` とかでファイル一覧は取得できるのだけど、`> ampy get /flash/boot.py` だとエラーを吐いて止まる。使い方が違うのかな？（よく分かってない）

## シリアル接続して pye コマンド【成功】
TeraTerm でシリアル接続してコマンドラインから `>>> pye('/flash/boot.py')` で書き換えるのが結局安定してて一番早かった。
書き換えに成功するなら後は簡単。

```python:boot.py
try:
    player = audio.Audio(path = "/flash/ding.wav")
    #player.volume(100)
    player.volume(10)
    wav_info = player.play_process(wav_dev)
    wav_dev.channel_config(wav_dev.CHANNEL_1, I2S.TRANSMITTER,resolution = I2S.RESOLUTION_16_BIT, align_mode = I2S.STANDARD_MODE)
    wav_dev.set_sample_rate(wav_info[1])
    while True:
        ret = player.play()
        if ret == None:
            break
        elif ret==0:
            break
    player.finish()
except:
    pass
```

30行目くらいから起動音の再生処理が書いてあるので、この辺を消せばいいんだけど、簡単に音量を 100 → 10 に変更してみた。このくらいの音量にすると全然聞こえない。もう少し大きくてもいいかもしれない。

# まとめ
boot.py の簡単な修正なら pye コマンドが簡単だった。
uPyLoader や ampy での書き換えがうまくいかないのがイマイチ納得いかないのでもうちょっと試してみようと思う。今後必要になるだろうし、、（上手くいかない理由をご存知の方いらっしゃいましたら教えてください m(_ _)m
AIの画像分析について

# どうやって作成するの？

## 1.撮影する
  まあめんどくさい作業ですが、ネットとかにその画像がないときにこの方法を使いましょう。

## 2.画像サイトなどを利用する
これもいい方法です。僕は、フォト蔵を主に使っています。[^1]

# 水増しについて
**データを作ったけれどデータが足りない！！**というときに使います。
回転、反転作業などをします。

# あとは学習されるだけ！...だが...
いざ機会学習をしてみると、学習率が低すぎる時があります。そのような時はもっと水増しをしてみましょう！
macOSでDockerコマンドの入力補完を有効化する手順

# 1. `bash-completion`をインストールする
```bash:bash
$ brew install bash-completion
```

# 2. `.bashrc`と`.bash_profile`に以下の内容を追加する
```bash:.bashrc
if [ -f `brew --prefix`/etc/bash_completion ]; then
    . `brew --prefix`/etc/bash_completion
fi
```
```bash:.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

# 3. Dockerのシンボリックリンクを追加する
```bash:bash
$ ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion /usr/local/etc/bash_completion.d/docker
$ ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion /usr/local/etc/bash_completion.d/docker-machine
$ ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion /usr/local/etc/bash_completion.d/docker-compose
```

# 参考文献
- [Docker for Macをさくっと使うための入力補完](https://www.eastforest.jp/container/5255)
centos7 redis4 systemctl インストールと自動起動

# systemctl って何よ？

CentOS 7から自動起動や解除を設定する際に「systemctl」コマンドを使う。
この仕組を利用すればサービスの自動起動だけでなく、プロセスの監視を行い停止したら再起動を行うこともできます。

# デーモンって何よ？

iphone のバックグランドで動いているアプリのようなもん。


参考
https://www.ritolab.com/entry/74
https://yomon.hatenablog.com/entry/2016/02/20/162648


では、redis4 で 試してみよう。



・redisのインストール
・サーバー再起動時に自動起動
・redisが落ちてたら10秒後に自動起動


# firewall を開ける

大切なのは "使うサーバーに向けてのみFirewallを開ける" ということ。
redisのbind は ローカルIPを指すもので、グローバルIPから直接作業する場合はFirewallで制御する。

```

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="グローバルIP" port protocol="tcp" port="6379" accept"
firewall-cmd --reload
success

//ポートが空いたかチェック
firewall-cmd --list-all

```



# ソースからインストール

```

yum install cpan
yum install gettext
yum grouplist 
yum groupinstall 'Development Tools'

```


yum は古いので

```

wget http://download.redis.io/releases/redis-4.0.14.tar.gz

# ダウンロードしたソースを解凍する
tar xzf redis-4.0.14.tar.gz
cd redis-4.0.14/
make install
sudo mkdir /etc/redis
sudo cp redis.conf /etc/redis/6379.conf

```


```

ln -s /home/hideki/redis-4.0.14/src/redis-server /usr/local/bin/redis-server
ln -s /home/hideki/redis-4.0.14/src/redis-cli /usr/local/bin/redis-cli

```

フォルダ作成とパーミッション変更

```

useradd redis
mkdir -p /var/lib/redis/6379
mkdir -p /var/log/redis
mkdir -p /etc/redis
chown -R redis:redis /var/log/redis /var/lib/redis

```




logfile と dir はパーミッションがおかしいと redisの起動すらしないので、とりあえず起動することを確認してから設定しても良い。

```/etc/redis/6379.conf

logfile /var/log/redis.log
bind 0.0.0.0 # 全サーバーから接続許可グローバルIPは指定できない。ローカルIPアドレスのみ。

dir /var/lib/redis/6379/
supervised systemd

//パスワードを設定
//ここで設定してうまく動かない場合がある.

//requirepass yourpass

//接続ユーザー数を限定
maxclients 5000

//メモリいっぱいになったら古いデータから消す。期限が設定されていないキーは永遠残るみたいなので。
maxmemory-policy allkeys-lru

//サーバー落ちたらデータ諦める(永続化オフ)
save ""

```

パスワードを設定する際は、インストール完了後に

```

/usr/local/bin/redis-cli
redis-cli> CONFIG SET REQUIREPASS '' 

```

をすると良い。じゃないと
NOAUTH Authentication required ってなる場合がある。

```/etc/systemd/system/redis.service

[Unit]
Description=Redis

[Service]
Type=notify
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
ExecStop=/usr/local/bin/redis-cli -p 6379 [先程指定しておいたrequirepass]
User=redis
Group=redis


Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

```

Restart は 停止してたら再起動せよ
RestartSec は 10秒後に。


# デーモンをリロード

うまく動かない場合は logファイルのパーミッションを疑う。
また、rebootも試してみる。

```

systemctl daemon-reload
systemctl start redis
systemctl status redis
systemctl enable redis

```

# 再起動するか、テスト


1 redis を kill して停止

systemctl stop redis すると自動開始されないので注意。
ちゃんとkill。

```

ps -ef | grep redis #プロセス番号を調べ
# redis     1531     1  0 15:55 ?        00:00:00 
kill -9 1531 #強制停止

```


2 サーバー再起動

```

reboot

```

でサーバーを再起動して自動的に redis が始まるか。
設定がうまくいっていれば両方とも自動で起動する。

ただし、それだけではエラーが出るので


ログファイル `/var/log/redis.log` を見ながら修正していく。


https://www.denet.ad.jp/technology/2017/11/redis-centos7.html
https://blog.megunlabo.net/2018/04/03/redis-install/
[2019-08-19] Ubuntu 18.04+Docker(19.03)+NVIDIA GPU環境セットアップ

やり方がまた変わっていたのでメモしておきます。


```
$ grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Ubuntu 18.04.3 LTS"
```
(標準で入るドライバを無効化する作業がまず必要かもしれない)




# Dockerのインストール

https://docs.docker.com/install/linux/docker-ce/ubuntu/
にしたがってやる。

```
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ docker -v
Docker version 19.03.1, build 74b1e89
```

https://docs.docker.com/install/linux/linux-postinstall/
にしたがってやる。

```
$ sudo usermod -aG docker $USER
(logout -> login)
$ docker run hello-world
Hello from Docker!
...
```


# NVIDIAドライバ

```
$ lspci | grep NVIDIA
00:09.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)

$ sudo apt install nvidia-headless-430 nvidia-utils-430
```


# DockerのNVIDIA対応のためのパッケージ


https://github.com/NVIDIA/nvidia-docker
にしたがってやる。

```
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
```

# 確認

```
$ sudo reboot

$ nvidia-smi
...
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
...

$ docker run --gpus all --rm nvidia/cuda nvidia-smi
...
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
...
```
[備忘録] Google Cloud Dataflow APIでLocationを指定する

# なにこれ

自作Dataflow TemplateをAPIでlaunchする際、`Location(Region)`を指定していたら地味なところでハマったので備忘としてのメモ。同じ境遇の方がいればその助けになれば幸いです。

## 問題

[公式ドキュメント](https://cloud.google.com/dataflow/docs/guides/templates/executing-templates?hl=ja#google-api--)に沿って自作Dataflow Templateの実行をしようとした際、`Location`の指定があると下記のようにエラーとなった。

```
The workflow could not be created, since it was sent to an invalid regional endpoint (asia-northeast1). Please resubmit to a valid Cloud Dataflow regional endpoint.
```

※社内の~~めんどくさい~~ポリシー上、`asia-northeast1`を利用する必要があります。

# 対処法

これも公式ドキュメントには書いてありました。公式最強。
https://cloud.google.com/dataflow/docs/reference/rest/

`projects.templates.launch`ではなく、`projects.locations.templates.launch` を利用すれば良かったみたいです。

なんでLocationの有無でAPIが分かれてるのか。。。

## 実装

公式にある実装例に、**.locations()** と`location`パラメータを追加するだけでOK。

```python:example.py
from oauth2client.client import GoogleCredentials
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

PROJECTID = "{{YOURPROJECTID}}"
LOCATION = "asia-northeast1" ## 顧客が本当に指定したいRegion
GCSPATH = "gs://{{YOURBUCKETPATH}}/{{YOURTEMPLATE}}" ## template

credentials = GoogleCredentials.get_application_default()
service = build("dataflow", "v1b3", credentials=credentials)

## RequestBody
body = {
    "environment": {
      ...
    },
    "parameters": {
      ...
    },
    "jobName": "{{YOURJOBNAME}}",
}
## REST:: v1b3.projects.locations.templates
req = service.projects().locations().templates().launch(
          projectId=PROJECTID, location=LOCATION,
          gcsPath=GCSPATH, body=body
      )
res = req.execute()
...
```
mixinでエラー発生!!importの順番に問題あり

## mixinとは?

@mixinで定義したスタイルを@includeで呼び出せるというものです。

よって、よく使うスタイルを@mixinで定義しておけば、何度でも@includeで呼び出せるのですっきりしたコードを書くことができます。

## 実際にコードを書いてみる

mixin用のファイルを作成して、コードを書いてみます。

```sass:mixin.scss
@mixin h2style {
  text-align: center;
  padding-top:50px;
  font-size:50px;
}
```
こんな風に定義して

```sass:_game_index.scss

h2{
    @include h2style;
  }
```
でスタイルを反映させる...

##ところがエラーが発生。

mixinでスタイルを設定完了のはずがエラーが発生してしまいました。

原因は**importの順番にありました。**

```application.scss
@import "./reset";
@import "modules/game_index";
@import "modules/mixin";
```
コードは基本的に上から読み込まれます。以上の記述だと、`game_index`が`mixin`よりも上で記述されているため、エラーが発生しました。

よってimportの順番を変えてあげましょう。

```application.scss
@import "./reset";
@import "modules/mixin";
@import "modules/game_index";
```

これで、エラーはなくなります。何ら問題なくmixinでスタイルを定義させることに成功しました。
webarenaでubuntu その18

#概要

webarenaでubuntu18.04やってみた。
postfix3.3やってみた。
php7.2でやってみた。

#インストール

```
sudo apt-get install php
```

#サンプルコード

```
<?php
        mail("ubuntu", "php", "test");
?>
```

#確認

```
mail
```


以上。
BottomNavigationViewをカスタマイズしているとリリースビルド時のみ崩れる

AndroidのBottomNavigationViewをデフォルトで使っていると、アイテムが4つ以上の場合アイコンの下にテキストが表示されたり、アニメーション機能が有効になったりと、困る場合が多いため、
「BottomNavigationViewHelper.disableShiftMode」にて独自にカスタマイズされている方もいるかと思います。


こんな感じにカスタマイズしてます。
<img width="333" alt="スクリーンショット 2019-08-19 15.29.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132493/9a36f4c6-bd03-ef47-7a68-90db17b7b301.png">


ここまでは問題ないのですが、releaseビルド時だけ、カスタマイズした機能が無効になり、以下のように崩れる現象が発生.

<img width="334" alt="スクリーンショット 2019-08-19 15.29.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132493/679a58ce-60a9-09e6-71ac-b7afd614a9fb.png">


debugビルド時は崩れが発生せず、releaseビルドの際だけ崩れが発生したので、build.gradle内のbuildTypesの指定が怪しいと思い確認。

```build.gradle
    buildTypes {
         //略
        release {
            //略
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //略
        }
    }
```

試しに「minifyEnabled true」を削除すると画面崩れなくビルドすることができたが、この設定を削除せずになんとかしたい。

BottomNavigationViewをカスタマイズしているソースを追っていた所、リフレクションを使っている箇所を発見
menuView.getClass().getDeclaredField("mShiftingMode");
ソース的には以下。
コレのせいだ。

```java
import java.lang.reflect.Field;

public class BottomNavigationViewHelper {
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView hogeView = (BottomNavigationMenuView) view.getChildAt(0);
        try {

            Field shiftingMode = hogeView.getClass().getDeclaredField("mShiftingMode");
            //〜略〜
```

リフレクションを使ってしまっていると、難読化した際に、メソッド名やクラス名も別の文字列に変換されてしまうため、proguard-rules.proファイルに、以下を追加し、難読化の対象から除外してやる必要がある。


```proguard-rules.pro
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}
```

同様の現象が発生した方はぜひ試してみてください
LaravelMixでAutoprefixerを設定する

Laravelでgridレイアウトが使いたかったのですが、IE対応したかったのでLaravelMixにautoprefixerを入れました。


```webpack.mix.js
mix.sass('source.scss', 'output.css')
    .options({
        autoprefixer: {
        options: {
          grid: true, // gridレイアウトが使えるようにする。対象ブラウザは .browserslistrc
        },
      },
    });
```

```.browerslistrc
ie 11
Firefox > 50
```

.browerslistrcの書き方はこちら https://qiita.com/takeshisakuma/items/0bc1c39ee976bd1f52d7
...4333796 (DEPRECATED) Could not find an installed version of Gradle either in Android Studio, or on your system to install the gradle wrapper. Please include gradle  in your path, or install Android Studio [ERROR]...   が発生した時(mac)

gradleがないらしい。
gradleはインストール済みなのでパスを通す。（インストールしてない人はandroidstudioをインストールしてね)

```bash

export PATH="/Applications/Android Studio.app/Contents/gradle/gradle-5.1.1/bin":"$PATH"
```
を実行して次回以降発生させないために```~/.bash_profile```に追記する。

```bash

source ~/.bash_profile
```
を実行して完了。

'''''追記'''''
(gradleのバージョンは環境に合わせて変えてね...)
Excel VBAちゃんが「ブラウザを起動してパスワード入れてログインする」

#趣旨
ほんの少しだけでも自動化することで、
大きくストレスが軽減されることがあるよねっていう例

ブラウザを起動してログインするための部品です
そのまま使えることはない
URLやパスワード以外にもカスタマイズが必要です。

VBAProject
    参照設定はMicrosoft Internet Controls

IE_login）Internet Explorer用の処理はライブラリを使って正攻法
chr_login）Google Chrome用はSendKeys,sleepを使って力技

```vba:Module1.bas
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If


Sub ADM0001()
    Call IE_login("https://www.pokemoon.net:8081/lg/", "ADM0001", "new+new")
End Sub
Sub ADM0002()
    Call IE_login("https://www.pokemoon.net:8082/lg/", "ADM0002", "nekoneko")
End Sub

Sub ADM0001ch()
    Call chr_login("https://www.pokemoon.net:8081/lg/", "ADM0001", "new{+}new") 'エスケープが必要
End Sub
Sub ADM0002ch()
    Call chr_login("https://www.pokemoon.net:8082/lg/", "ADM0002", "nekoneko") 'エスケープが必要
End Sub

Function IE_login(pUrl As String, _
                  pId As String, _
                  pPs As String)
    
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    objIE.Visible = True
    objIE.navigate pUrl
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.document
    
    With htmlDoc
        .getElementById("PUSERID").Value = pId
        .getElementById("PPASSWORD").Value = pPs
    End With
    Set htmlDoc = Nothing
    
    objIE.navigate "javascript:J_FORM_SUBMIT()"
    Set objIE = Nothing

End Function

Function chr_login(pUrl As String, _
                   pId As String, _
                   pPs As String)
    
    Dim objChr As Object
    Set objChr = CreateObject("WScript.Shell")
    objChr.Run ("chrome.exe -url " & pUrl)
    
    Sleep 4000
    SendKeys pId, True
    SendKeys "{ENTER}", True
    SendKeys "{TAB}", True

    Sleep 1000
    SendKeys pPs, True
    SendKeys "{ENTER}", True

    Set objChr = Nothing

End Function
```

//2019/09/19
関数の呼び出しをDebug.Printでやってる謎の部分をちゃんとCallに直すと、
メモリが足りませんが出なくなりました。とほほ


#先達 参考 Special Thanks
大変ありがとうございます

	【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
	https://tonari-it.com/vba-ie-wait/#toc3

	タブーの小技 パスワードクリップ BAT/VBA/Javascript
	https://qiita.com/lamp/items/7c36efbae41bd30b7774
	これの続き
Flutter: MainAxisAlignmentを理解する

Flutterでレイアウトを組み立てる際、ColumnとRowはほぼ必ず使う。
そのColumnとRowで`mainAxisAlignment`を指定するわけだが、違いがよく分からないので整理してみた。

## 環境
```
Flutter 1.7.8+hotfix.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 20e59316b8 (4 weeks ago) • 2019-07-18 20:04:33 -0700
Engine • revision fee001c93f
Tools • Dart 2.4.0
```

## 使用レイアウトコード

縦にテキストが３行並んでるだけのシンプルなレイアウト

```dart
Center(
  child: Column(
    mainAxisAlignment: MainAxisAlignment.start, // <= 今回のターゲット
    children: <Widget>[
      Container(
        height: 100,
        color: Colors.orange,
        child: Text(
          'First',
          style: Theme.of(context).textTheme.display1,
        ),
      ),
      Container(
        height: 100,
        color: Colors.green,
        child: Text(
          'Second',
          style: Theme.of(context).textTheme.display1,
        ),
      ),
      Container(
        height: 100,
        color: Colors.blue,
        child: Text(
          'Third',
          style: Theme.of(context).textTheme.display1,
        ),
      ),
    ],
  ),
),
```

画面イメージ
![2019-08-18-08-56-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/a52995fd-0a10-83ec-73f2-4b4a8e270a8c.png)

今回は、Columnに設置した`MainAxisAlignment`の値を変更し、レイアウトへの表示を確認して学んでいく。

## MainAxisAlignmentとは

公式ドキュメントによると
https://api.flutter.dev/flutter/rendering/MainAxisAlignment-class.html

> フレックスレイアウトで子を主軸に沿って配置する方法。

この説明を読んでも「？」となるが、主軸（メイン方向）というのがキモで、
Columnなら縦、Rowなら横
が主軸の方向となる。
**なぜなら、Columnは子レイアウトを縦方向に並べ、Rowは横方向に子を並べるため。**
（[図での説明](https://flutter.ctrnost.com/basic/layout/columnrow/#%E9%85%8D%E7%BD%AE)を見ると分かりやすい）


あと、ソースを見ても分かるが、MainAxisAlignmentはただの`enum`だった。

## MainAxisAlignmentの種類と挙動

### start

メイン方向の開始位置に配置されれる。

![2019-08-18-08-56-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/a52995fd-0a10-83ec-73f2-4b4a8e270a8c.png)

### end
メイン方向の終了位置に配置されれる。

![2019-08-19-14-45-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/cf61808b-f1f8-330d-26e4-23e9220876d9.png)


### center
メイン方向の中央位置に配置されれる。
![2019-08-19-14-48-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/50a1ba9f-ad4d-af06-50de-6b63d0c97e8d.png)


### spaceBetween
子たちの間に空きスペースを均等に置く。
開始/終了にはスペースを設けない。

![2019-08-19-14-49-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/b349ef03-b4fa-82a7-16d6-aded62f57fb2.png)

### spaceAround
並べた子の間に空きスペースを均等に配置する。

![スクリーンショット 2021-01-28 21.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296554/13e24e50-533f-f168-9c2f-dc06584dd301.png)



### spaceEvenly
開始、終了、子の間に空きスペースを均等に配置する。

![2019-08-19-14-51-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/d6d78a35-65b6-8465-6ee8-4ad711460dd7.png)

## コード置き場
実装に使用したリポジトリ
https://github.com/ikemura23/flutter_lab/tree/MainAxisAlignment
配列を利用した単純なPowerShellループ処理

```powershell
$list = @("xx","yy","zz")
for($i = 0; $i+1 -le $list.Count ; $i++){
やりたい処理
}
```

##### メモ
ループ処理で確認が出ると鬱陶しいので確認無効のオプションを入れておくと良いですね。
-Confirm:$false
ちゃんとテストした後に付けてくださいね(｡･_･｡)
Windows制作環境設定

#Windows制作環境設定

##WSLの有効化
- Cortanaで「windowsの機能」を検索
- windowsの機能の有効化または無効化
 - Windows Subsystem for Linuxのチェックを入れる

##Ubuntuを入手
- Microsoft Storeでubuntuを検索
 - Ubuntu（無印）を入れる
 - インストール横のメニューからタスクバーに入れておくと良し

##Ubuntuの起動
- 最初の起動時はしばらくお待ちください
- ユーザーアカウントの作成は適宜

##Proxyの設定
.bashrcにproxyの環境変数を設定

```bash:
echo '# proxy setting' >> ~/.bashrc
echo 'export USER=user' >> ~/.bashrc
echo 'export PASSWORD=password' >> ~/.bashrc
echo 'export HTTP_PROXY=http://${USER}:${PASSWORD}@proxy:port' >> ~/.bashrc
echo 'export HTTPS_PROXY=${HTTP_PROXY}' >> ~/.bashrc
echo 'export http_proxy=${HTTP_PROXY}' >> ~/.bashrc
echo 'export https_proxy=${HTTP_PROXY}' >> ~/.bashrc
```

password更新時は

```bash:
export PASSWORD=[new password]
exec $SHELL -l
```

##ubuntuのパッケージを更新する
proxyの設定をしてからアップデート

```bash:
sudo sh -c "echo 'Acquire::ftp::proxy \"http://user:password@proxy:port\";' >> /etc/apt/apt.conf"
sudo sh -c "echo 'Acquire::http::proxy \"http://user:password@proxy:port\";' >> /etc/apt/apt.conf"
sudo sh -c "echo 'Acquire::https::proxy \"http://user:password@proxy:port\";' >> /etc/apt/apt.conf"
exec $SHELL -l

sudo apt-get update
```

##gitを入れる
gitを入れて、.bashrcにgitのproxy設定を入れる

```bash:
sudo apt-get install git

echo '# git config' >> ~/.bashrc
echo 'git config --global http.proxy ${HTTP_PROXY}' >> ~/.bashrc
echo 'git config --global https.proxy ${HTTP_PROXY}' >> ~/.bashrc
```

##anyenvを入れる
```bash:
git clone https://github.com/riywo/anyenv ~/.anyenv

echo '# anyenv setting' >> ~/.bashrc
echo 'export PATH=${PATH}:${HOME}/.anyenv/bin' >> ~/.bashrc
echo 'eval "$(anyenv init -)"' >> ~/.bashrc
exec $SHELL -l
```

メッセージが出るので実行

```bash:
anyenv install --init
```

質問が出るので答える（yでいい）

###anyenvを一括でアップデートするプラグインを入れておくと便利

```bash:
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
exec $SHELL -l
```

##nodenvを入れる
```bash:
anyenv install nodenv
exec $SHELL -l
 ```

###nodeを入れるときに一緒にyarnも入れるプラグイン

```bash:
git clone https://github.com/pine/nodenv-yarn-install.git "$(nodenv root)/plugins/nodenv-yarn-install"
```

##確認
インストールできるnodejsの確認

```bash:
nodenv install -l
```

必要なバージョンをインストール

```bash:
nodenv install 12.8.1
```

インストールされているバージョンの確認

```bash:
nodenv versions
```

使用するバージョンを選択

```bash:
cd [プロジェクトフォルダ]
nodenv local 12.8.1
```



##pluginsフォルダが無い時は
###anyenv
```
mkdir -p $(anyenv root)/plugins
```

###nodenv
```
mkdir -p $(nodenv root)/plugins
```
マネジメントコンソールでCodePipelineのロールを作成するときの注意

# 目的
CodePipelineのロールを作成するときに、わからないことがありサポートに問い合わせため備忘録。

# 経緯
AWSサービスの中にCodePipelineがない！
CodeBuild/CodeDeployはあるけど・・・
![roll.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/5b053a41-55cf-b5d0-6211-c5e97971d185.jpeg)
試しにCodeBuildでロールを作成し、CodePipelineにロールを設定してもうまくいかず。。

# 解決
一旦、テキトーなAWSサービスを選んでロールを作成。
作成した後に、個別に修正する。

・[信頼関係の編集]ボタンを押下
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/8cfa772b-b00b-f77c-5089-1848ab9abad8.png)

・ポリシードキュメントのServiceを下記に変更し、[信頼ポリシーの更新]ボタン押下。

```
        "Service": [
          "codepipeline.amazonaws.com"
        ]
```


# 感想
画面になければ自分でコードで編集せいっていうね。。。