OmniAICreator/Qiita-1.07M huggingface dataset:
[メモ] ラズパイで、wireshark 3.x を使う


![2019-05-20-154854_1280x720_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/410a78d1-1195-9d37-a6f3-2ae57ae83e67.png)


- (2021-02-16更新) [wireshark-qt5_3.4.3-20210216.1_armhf.deb](https://github.com/mt08xx/files/raw/master/wireshark-qt5_3.4.3-20210216.1_armhf.deb) を追加しました。
    - OS: `2021-01-11-raspios-buster-armhf` (2021-02-16にパッケージ更新 Kernel 5.10.11-v7+)
    - 手順:

        ```bash:こぴぺ
        # Install original wireshark (use dependency)
        cd ${HOME}
        sudo apt update && sudo apt install -y wireshark && sudo usermod ${USER} -aG wireshark
        # "Should non-superusers be able to capture packets?" => Yes

        # Wireshark 3.4.3
        curl -SLO https://github.com/mt08xx/files/raw/master/wireshark-qt5_3.4.3-20210216.1_armhf.deb && \
        sudo apt install -y ./wireshark-qt5_3.4.3-20210216.1_armhf.debb && \
        sudo chown -v root:wireshark /usr/local/bin/{tshark,dumpcap} && \
        sudo chmod -v 6550 /usr/local/bin/{tshark,dumpcap} && \
        sudo ldconfig && \
        sudo reboot
        ```


# 概要
ラズパイで、wireshark 3.0.1 を使うために、ビルドしました。
3.0から、いろいろとProtocol(Display Filter)が統合されたっぽいです。([これ](https://www.wireshark.org/docs/dfref/d/doip.html)とか)

<font color='red'>**依存関係を解決していない**</font>ので、まず、普通にレポジトリにある`wireshark`(v2.6.7)をインストールして、必要なライブラリなどをインストールします。

# 環境
- Raspberry Pi 3B/3B+
- Raspbian: `2019-04-08-raspbian-stretch`(デスクトップ版) <br>2019-05-20にパッケージ更新


# 手順

```bash
cd ${HOME}
sudo apt update && sudo apt install -y wireshark && sudo usermod ${USER} -aG wireshark
# "Should non-superusers be able to capture packets?" と聞かれたら => Yes

# Wireshark 3.0.1をインストール
curl -SLO https://github.com/mt08xx/files/raw/master/wireshark-qt5_3.0.1-20190513.1_armhf.deb && \
sudo apt install -y ./wireshark-qt5_3.0.1-20190513.1_armhf.deb && \
sudo chown -v root:wireshark /usr/local/bin/{tshark,dumpcap} && \
sudo chmod -v 6550 /usr/local/bin/{tshark,dumpcap} && \
sudo ldconfig

# 再起動
sudo reboot
```


# TODO

- ビルド手順を書く。


# その他
1. `wireshark-qt5` というパッケージ名で、`/usr/local` 以下にインストールします。
2. Uninstallは、こんな感じで。

    ```bash
sudo apt autoremove -y --purge wireshark-qt5 && \
sudo apt autoremove -y --purge wireshark
```
Protocol BuffersでGoのSlice・Mapを生成させる方法

# 概要
Protocol Buffersで、Goにコンパイル後にSlice・Mapを生成させるために、protocol definitionにどのように定義すれば良いかの解説となります。

# slice
`repeated`を使う

```.proto
message Result {
  repeated string message = 1;
}
```

これをコンパイルすると、

```.go
type Result struct {
        Messages  []string  
}
```

こうなります。

# map
`map<string, Bar>` を使う

```.proto

message Company {
  map<int32, string> members = 1;
}
```

これをコンパイルすると、

```.go
type Company struct {
        Members map[int32]string
}
```

こうなります。

# 参考
[Go Generated Code - Protocol Buffers
](https://developers.google.com/protocol-buffers/docs/reference/go-generated#repeated)
Goで自動生成ファイルをtest coverageの計測対象から除外する方法

# 概要
gRPCなどを使用していると、Goの自動生成ファイルを使用することになると思います。

その際、`go test` コマンドは、`.go`という拡張子のすべてのファイルをtest coverageの計測対象とするため、CIなどでtest coverageを計測している場合、この自動生成ファイルまでtest coverageの分母に入ってしまい、意味のある数字が得られなくなると思います。

そこで、それに対処する方法を解説します。

# やり方
前提として、`go test` コマンド自体に、特定のファイルを除外するようなオプションはありません。
なので、`go test`の生成ファイルから、除外したいファイルに関する記述を`grep`して除外していくことになります。

```.sh
$ go test . -coverprofile cover.out.tmp                  
# "_generated.go"の部分は、自動生成ファイルのファイル名の形式に合わせて変更する
$ cat cover.out.tmp | grep -v "_generated.go" > cover.out
$ rm -f cover.out.tmp
$ go tool cover -func cover.out
```

## コピペ用
理解しやすい用に上記で一行ずつのコマンドを記載しましたが、実際はまとめて実行する場合が多いと思うので、コピペして実行する際は下記がおすすめです。

```.sh
$ TEMP_COVER_OUT=$(mktemp); go test ./... -coverprofile $TEMP_COVER_OUT; cat $TEMP_COVER_OUT | grep -v "pb.go" > cover.out; rm $TEMP_COVER_OUT
$ go tool cover -html=cover.out
```
# 参考
[How to ignore Generated files from Go test coverage] (https://stackoverflow.com/questions/50065448/how-to-ignore-generated-files-from-go-test-coverage)
実は知らない！？プロジェクトビューの使い方


# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

Unityを扱うと絶対に使う画面、***Projectビュー***ですね。
***使う頻度が多い画面こそ使い方を知っておく***と開発効率が上がると思います、そのため今回は Projectビューを色々まとめてみました。

# Projectとは？

Unityを起動した時に表示される、以下の***画面領域***です。
![image-54-768x611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/c84c31cc-68b5-a4bf-ff01-ce2937efc79e.png)

# Projectで何ができるのか？

Projectビューでは何ができるのかと言うと、簡単に言うと***ファイル※１に対しての追加・削除***できる画面になります。

- ファイル（シーン・スクリプト・マテリアルなど）を追加・削除
   - Assetsフォルダの以下に含まれるファイル ・フォルダ
- ダブルクリックでシーンを切り替え

※１　ファイルとは、シーン・スクリプト・マテリアルなどの実ファイル、サブフォルダを指します。

# 他ビューとの関係

## Project・Hierarchyビューとの関係

上記でSceneを複数作成する事ができると説明しましたが、複数作成する場合は***Sceneを管理する画面***が必要です。

その管理を行う画面が、***Projectウィンドウ***になります。

以下のように、シーン（Scene）を複数作成してダブルクリックで切り替えられるようにできます。
![scene1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/bbb51f12-01ad-fa6f-2b74-457dbba3942e.gif)

## Inspectorビューとの関係
Projectで管理しているファイルを選択すると、その***ファイルに紐づいている情報が連動して表示***されます。

この状態でInspectorの情報を更新すると、***ファイルのデータが更新***されます
![image-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/abbe1b1c-e06c-ec00-491c-06df5c049f11.png)


# Projectの基本的な使い方

[記事](https://www.fast-system.jp/unity-project-howto/)をご確認いただければと思います。

# Projectビューの便利な使い方

筆者が便利な使い方を色々とご紹介させていただきます。

## アセットストアのインポートが行える

***キーワードを入力して、検索対象を「Asset Store」***に変更すると。
![image-66-300x189.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/b2477a39-4f3a-12bf-5adb-5b9842c134e9.png)

***アセットストアから検索***が行われて、ここからインポートが可能になります。
![image-65-300x191.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/e57167c6-40e5-355d-4301-3da91468b6fe.png)

## お気に入り機能

上記でもご紹介しましたが再度！
***検索欄にキーワードを入力***して、***★アイコンを選択するとツリー側に Favorites に自分が検索したキーワードが登録***できる。
![WS000008-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/511e417d-bfce-d84e-74f0-5e564edd6a5f.jpeg)

## １列・２列で切り替える

Projectの表示を***１列・２列の表示***が切り替えられます、好みで使いたい方を選んでください。個人的には２列の方がお気に入りが使えるので便利です。
![unity-project-crate5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/cf5c149b-b4e1-c3bc-9fd2-3a3c9b099ae1.gif)

# 終わりに

どうでしたか、意外と知らないProject（プロジェクト）ビューの使い方などもあったかと思います。いつも使っている画面だからこそ色々な使い方を知っておくと生産性が上がるかなと思いますので、ぜひご活用ください！

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
実は知らない！？ゲームビューの使い方

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

Unityを扱うと絶対に使う画面、***Gameビュー***ですね。
***使う頻度が多い画面こそ使い方を知っておく***と開発効率が上がると思います、そのため今回は Gameビューを色々まとめてみました。

# Gameビューとは？

Unityを起動した時に表示される、以下の***画面領域***です。
Sceneビューと似ていますが、別物の画面になります。
![image-67-768x642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/d53a5f69-cc0d-39d7-53b7-593725371c0b.png)

## Gameビューで何ができるのか？

Gameビューでは何ができるのかと言うと、簡単に言うと作った***ゲーム・アプリの実行・状態の確認***ができます。

- ゲーム・アプリの実行
- 画面切り替え・サイズ変更・ミュートなどの制御
- 実行状態の表示（パフォーマンス）

## Sceneビューとの関係

Sceneビューは開発者がゲーム・アプリを制作する画面で、***Gameビューはゲーム・アプリをプレイする画面***です。

そのため、***Sceneビューには表示されるけど Gameビューには表示されない***オブジェクトがあります。（下の画像だと、ライト・カメラ・カプセル）

また、***Gameビューは基本的にカメラから見た映像***が表示されます。
![image-68.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/31b67060-63e0-6d1f-a2ef-c26da71f7183.png)

# Gameビューの基本的な使い方

[記事](https://www.fast-system.jp/unity-game-view-howto/)をご参照いただければと思います。

# Gameビューの便利な使い方

便利な使い方を色々とご紹介させていただきます。

## Gameビューを複数表示する

***カメラが２つ***ある場合に、その２つのカメラ映像を同時に確認する事ができます。（３つ以上でも可能です）

まず２つ目のカメラの設定で、***出力先を「Display 2」***に変更します。
![image-71.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/b3fd00c6-279b-2d4b-9991-331b0c40a71d.png)

そして、Gameビューの***右上メニューから、新しいGameビュー***を開いて、***左右に並べて一方を「Display 2」の表示***に変更すればOKです！
![unity-game-uni.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/82fa24f7-4c9d-36a9-faf1-8cb1bb71163e.gif)

# 終わりに

どうでしたか、意外と知らないGame（ゲーム）ビューの使い方などもあったかと思います。いつも使っている画面だからこそ色々な使い方を知っておくと生産性が上がるかなと思いますので、ぜひご活用ください！

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Line Driven Design

Line Driven Design

ときおり、Lineで伝言(message)が届く

1. 電子メールを送りました。
2. Messageを送りました。
3. TwitterでDMしています。
4. FAXしました。

などなど。

5. XX日の会合でれますか？
6. YY日の会議室取れてますか？
7. ZZ日の夜の意見交換会顔出せますか？


などなども。

8. QQ日締め切りの原稿出しました？
9. gitlabのissue213コメントお願いします。
10. wikiに昨日の議事録お願いします。

そして
11. http://どこそこ.あちこち(git想定）のソースコンパイルしてdockerにあげておいてください。
12. http://どこそこ.あちこち(issue想定）のエラーを取っておいてください。
13. http://どこそこ.あちこち(wiki想定）の資料分析・設計しておいてください。
14.
開発環境を整える

#開発環境を整える

[windows環境]
MAMP
mySQLworkbench
PHPStorm
Composer
Lalavel installer

~補足~
office Excel
office Word
office PowerPoint

~デバッグ用~
chorome
xdebughelper

~追加~
Visual Studio
git
googleaccount

(社員用)
メーラー

[管理者]
会社権限
ユーザー　

[追加]
googleAccount
googleDrive共有の為に取得しといたほうが楽
Slackの登録
社内用のメッセージのやり取りがあるので必須

[最後に保存]


[ダウンロードリンク]
MAMP
https://www.mamp.info/en/
mySQLworkbench
https://dev.mysql.com/downloads/workbench/
PHPStorm
https://www.jetbrains.com/phpstorm/
Composer
https://getcomposer.org/download/

#設定で詰まったところ
##デバッグの設定
###php.iniの設定

######[ブラウザ上で有効にする方法]
PHPにXdebugを有効にする時、PHPの設定を変更しないといけない。
PHPの実行ファイルはphp.exe。設定ファイルはphp.ini。
通常[PHPをダウンロード](https://www.php.net/)した場合、インストールしたフォルダー内の直下に両方とも存在する。
しかしMAMPの場合phpがたくさん入っているので、直下にはなく、bin/php/php{version名}の中にphp.exeファイルがあり、conf/php{version名}の中にphp.iniファイルがある。

php.iniにxdebugを有効にするには
php.iniの一番下に下記を加える

```
[Xdebug]
zend_extension = "php_xdebug.dll"
xdebug.remote_enable = 1
```

[設定確認]
設定確認はMAMPを起動してpreference(設定)をクリックWebServerタグをクリックdocumentRootのフォルダーパスを確認し、そのフォルダーの下にindex.phpファイルを作成

```php:index.php
<?php phpinfo(); ?>
```

ブラウザのＵＲＬに[ loaclhost ]と入れれば　下のほうにxdebugの存在が確認できる。

######[PHPStormの上で有効にする]

PHPStormではphpのチェックを行うことができる。
しかしPHPStormの設定でphp.exeファイルを指定する際、PHPStorm側で同じファイル内にphp.iniファイルがないか検索をされる。なければエラーが返ってくるので、先ほど編集を加えたphp.iniファイルをコピーして、php.exeと同じフォルダーに貼付けてあげると上手く通る

######[composerをインストールする際]
php.exeを指定する。
インストールする際にエラーが返ってきた。
[現状：]
php/ext/php_mysql.dllがないとのことで
フォルダーを探しても見つからず、
php.ini内を見ると、
extension=php_mysql.dll
が存在していた。
[対応：]
頭に；（コメントアウト）をつけて上手く動いた

###chorome上で[Xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc/related?hl=ja)有効にする
Xdebug helperの拡張をすることで、リモートデバッグを使うことができるようになる



###choromeでlaravelをインストールする際

コマンドプロンプト上で

```
laravel new {プロジェクト名}
```

と入力すると起動するが、よくエラーで落ちるので
（プロジェクト名がフォルダー名になる）

```
composer create-project laravel/laravel {プロジェクト名} --prefer-dist
```
のほうが使える


###phpバージョン違いによるエラー
composerをインストールする際、phpを最新のバージョンでインストールできるが、実際に動かすXAMPやMAMP等でバージョンが低いと動かないことがある。
なので、動かすPHPバージョンとコンポーザーのPHPバージョンは合わせておかないといけない。
初学者のための「コンピュータの動作原理」RISC-V 編 Lesson 6

[RV32I インストラクション・セット](https://qiita.com/zacky1972/items/48bf61bfe3ef2b8ce557)を読みながら，次のコードを読みましょう。与えられたレジスタマップとメモリマップを使用してください。[手順についてはこちらを参照してください。](https://qiita.com/zacky1972/items/9cc5392d70d43503afb6#実施)

さて，このコードは，何を計算しているのでしょうか？ 考察してみましょう。初期値を色々変えてみて，実行結果を分析してみると，きっと理解できますよ。

# コード

`pc` が「戻りアドレス」になったら，終了してください。

```
	.file	"sample.c"
	.option nopic
	.text
	.align	2
	.type	sub, @function
sub:
	li	a5,1
	li	a4,0
.L2:
	bgt	a5,a1,.L4
	add	a4,a4,a0
	addi	a5,a5,1
	j	.L2
.L4:
	mv	a0,a4
	ret
	.size	sub, .-sub
	.align	2
	.globl	calc
	.type	calc, @function
calc:
	addi	sp,sp,-32
	sw	ra,28(sp)
	sw	s0,24(sp)
	sw	s1,20(sp)
	sw	s2,16(sp)
	sw	s3,12(sp)
	sw	s4,8(sp)
	mv	s4,a2
	li	s0,0
	li	s1,0
.L6:
	bgt	s0,s4,.L9
	addi	s2,a0,4
	addi	s3,a1,4
	lw	a1,0(a1)
	lw	a0,0(a0)
	call	sub
	add	s1,s1,a0
	addi	s0,s0,1
	mv	a1,s3
	mv	a0,s2
	j	.L6
.L9:
	mv	a0,s1
	lw	ra,28(sp)
	lw	s0,24(sp)
	lw	s1,20(sp)
	lw	s2,16(sp)
	lw	s3,12(sp)
	lw	s4,8(sp)
	addi	sp,sp,32
	jr	ra
	.size	calc, .-calc
	.ident	"GCC: (GNU) 8.2.0"
```

# レジスタマップ

|レジスタ|初期値|
|:------|:-----|
|a0     |0x00000003|
|a1     |0x00000002|
|a4     |0x00000000|
|a5     |0x00000000|
|sp     |0x10000020|
|s0     |0x10001000|
|s1     |0x00000010|
|s2     |0x00000020|
|s3     |0x00000040|
|s4     |0x00000080|
|x0 (zero)|常に0|
|x1 (ra)|戻りアドレス|
|pc     |calcのアドレス|

# メモリマップ

|アドレス|データ初期値|
|:------|:-----|
|0x10000000|0x00000000|
|0x10000004|0x00000000|
|0x10000008|0x00000000|
|0x1000000c|0x00000000|
|0x10000010|0x00000000|
|0x10000014|0x00000000|
|0x10000018|0x00000000|
|0x1000001c|0x00000000|
|0x10000020|0x00000000|


# 命令について

## call

さしあたり，`call offset` は `jalr ra, ra, offset` だと思ってください。

## ret

実際には `jalr zero, ra, 0` に展開されます。

## jr

`jr rs` は `jalr zero, rs, 0` に展開されます。
初学者のための「コンピュータの動作原理」RISC-V 編 Lesson 5

[RV32I インストラクション・セット](https://qiita.com/zacky1972/items/48bf61bfe3ef2b8ce557)を読みながら，次のコードを読みましょう。与えられたレジスタマップとメモリマップを使用してください。[手順についてはこちらを参照してください。](https://qiita.com/zacky1972/items/9cc5392d70d43503afb6#実施)

さて，このコードは，何を計算しているのでしょうか？ 考察してみましょう。初期値を色々変えてみて，実行結果を分析してみると，きっと理解できますよ。

# コード

`pc` が「戻りアドレス」になったら，終了してください。

```
	.file	"sample.c"
	.option nopic
	.text
	.align	2
	.globl	calc
	.type	calc, @function
calc:
	bgtz	a0,.L8
	li	a0,0
	ret
.L8:
	addi	sp,sp,-16
	sw	ra,12(sp)
	addi	a0,a0,-1
	call	calc
	lw	ra,12(sp)
	addi	sp,sp,16
	jr	ra
	.size	calc, .-calc
	.ident	"GCC: (GNU) 8.2.0"
```

# レジスタマップ

|レジスタ|初期値|
|:------|:-----|
|a0     |0x00000003|
|sp     |0x10000010|
|x0 (zero)|常に0|
|x1 (ra)|戻りアドレス|
|pc     |calcのアドレス|

# メモリマップ

|アドレス|データ初期値|
|:------|:-----|
|0x10000000|0x00000000|
|0x10000004|0x00000000|
|0x10000008|0x00000000|
|0x1000000c|0x00000000|
|0x10000010|0x00000000|

# 命令について

## call

さしあたり，`call offset` は `jalr ra, ra, offset` だと思ってください。

## ret

実際には `jalr zero, ra, 0` に展開されます。

## jr

`jr rs` は `jalr zero, rs, 0` に展開されます。
初学者のための「コンピュータの動作原理」RISC-V 編 Lesson 4

[RV32I インストラクション・セット](https://qiita.com/zacky1972/items/48bf61bfe3ef2b8ce557)を読みながら，次のコードを読みましょう。与えられたレジスタマップとメモリマップを使用してください。[手順についてはこちらを参照してください。](https://qiita.com/zacky1972/items/9cc5392d70d43503afb6#実施)

さて，このコードは，何を計算しているのでしょうか？ 考察してみましょう。初期値を色々変えてみて，実行結果を分析してみると，きっと理解できますよ。

# コード

`pc` が「戻りアドレス」になったら，終了してください。

```
	.file	"sample.c"
	.option nopic
	.text
	.align	2
	.globl	sub
	.type	sub, @function
sub:
	li	a5,1
	li	a4,0
.L2:
	bgt	a5,a0,.L4
	add	a4,a4,a5
	addi	a5,a5,1
	j	.L2
.L4:
	mv	a0,a4
	ret
	.size	sub, .-sub
	.align	2
	.globl	main
	.type	main, @function
main:
	addi	sp,sp,-16
	sw	ra,12(sp)
	sw	s0,8(sp)
	sw	s1,4(sp)
	mv	s1,a1
	call	sub
	mv	s0,a0
	mv	a0,s1
	call	sub
	add	a0,s0,a0
	lw	ra,12(sp)
	lw	s0,8(sp)
	lw	s1,4(sp)
	addi	sp,sp,16
	jr	ra
	.size	main, .-main
	.ident	"GCC: (GNU) 8.2.0"
```

# レジスタマップ

|レジスタ|初期値|
|:------|:-----|
|a0     |0x00000003|
|a1     |0x00000002|
|a4     |0x00000000|
|a5     |0x00000000|
|sp     |0x10000010|
|s0     |0x10001000|
|s1     |0x00000010|
|x0 (zero)|常に0|
|x1 (ra)|戻りアドレス|
|pc     |mainのアドレス|

# メモリマップ

|アドレス|データ初期値|
|:------|:-----|
|0x10000000|0x00000000|
|0x10000004|0x00000000|
|0x10000008|0x00000000|
|0x1000000c|0x00000000|
|0x10000010|0x00000000|

# 命令について

## call

さしあたり，`call offset` は `jalr ra, ra, offset` だと思ってください。

## ret

実際には `jalr zero, ra, 0` に展開されます。

## jr

`jr rs` は `jalr zero, rs, 0` に展開されます。
「失敗を恐れない」ではない。「挑戦しないのを恐れる、失敗するのを恐れる」だ。

巷(ちまた)には、なぜか「失敗を恐れない」という表現が溢れている。
私の場合は、「挑戦しないのを恐れる、失敗するのを恐れる」だ。

## 失敗するのはいやだ。失敗はたくさんの人を不幸にする。
失敗してはいけないタイミングで失敗をすると、たくさんの人を不幸にする。
損失を引き起こすだけではなく、人員削減や、時として事業を失うし、倒産する企業もあるだろう。

失業しても、次の就職先をすぐ見つけられる売りとなる技術を持っている人もいるかもしれないが、大多数の人はそんなわけにはいかない。
再就職で、前と同等の賃金での就職先を見つけるのは至難の業だ。雇い入れるかどうかを決める側は、あなたがその企業でどういう働き方をしていたのかを気にする。その倒産した企業の一人としてあなたを見て、あなたの働き方や、仕事への姿勢に問題があったんじゃないかと疑ってかかる。

だから、事業の失敗を気軽に考えないで欲しい。

事業縮小による拠点閉鎖で、勤務地が移動になるという場合も多くの不幸をもたらす。
数多くの単身赴任を生じさせてしまう。

あなたがふだん接している同僚には家族がいます。その家族の幸せには、事業の成功が重要です。
ですから、「失敗するのを恐れて」、問題の解決に注力するのが自然なことです。

## 失敗するのを恐れるから、どこにどういう失敗の危険があるのか、常に考え続ける。
対策がないか考え続ける。
どこかに使えるヒントがないか調べ続ける。
常に考え続けるから、物事からヒントを見つけることができる。


自分ひとりではどうしようもない部分は、チームに助けを求める。
独力で失敗して、そのとばっちりで事業が失敗するのは避けなくてはならない。
助けを求めることで、問題を扱いやすいものにしなくてはならない。

## 失敗しないのは無理だ。だから、深刻にならないタイミングで失敗を見つけるようにする。
一発ですべての項目を問題なくこなすプログラムを書くことは難しい。
だから、自動化テストを書いて、失敗が自動化テストで見つかるようにしておく。
自動化テストで、不具合が見つけるようにしておけば、個々の失敗は問題にならないものになっていく。

## 早い段階で失敗して、問題を明らかにするというのもある。
原理的な部分で無理があるのかをしれないのを後回しにすることは、
失敗する時期を後に回すことになる。
早い時期に失敗しておけば、やり直せる時間的な余裕もあるし、関わる人が増えすぎていないので、経営に与えるインパクトは大きくない。
でも、それを見なかったふりをして後回しにすれば、やり直す時間的な余裕は失われてしまう。
関わる人が増えてしてしまっているので、経営に与えるインパクトも大きい。
だから言う。早い段階で失敗することはいいことなんだと。


## バックアッププランを考えておく
ある方式に限界があるとき、それが要求水準を満たすことができない場合に備えて
別の手を考えるようにしておくことも必要だ。
ひとつの方式がうまくいくはずとは安易に信じこまない。
それぞれの方式は、それぞれに異なる限界を持っている。
自分の用途でそれが問題になるのかどうかは、開発の初期ではわからなかったりするものだ。

## 未実装の機能が複数あるとき、製品として必要な要件はどちらなのか、
どちらの実装を先にすべきなのか、
担当者として独断で判断することはしない。
PO（プロダクト　オーナー）に判断を仰ぐ。

とにかく、ビジネスの分野では開発に失敗する可能性はある。
それでも、新しい挑戦をしないままにしておくことは、事業の緩慢な終わりを招いていることだ。

## 失敗しないためにあがき続けよう

失敗しないためにあがき続けることは、かっこ良くはないだろう。
全然エレガントなやりかたではなく、ひたすら手間がかかるやり方だったりする。
判断できるタイミングがほんの少しの期間しかなく、その限られたデータの中で適切な判断をしなければならなかったりする。
前提条件が新しくなると、ほとんどすべての作業がやり直しになったりする。
それでも失敗しないためにあがき続けよう。



-----

### 不幸にして失業してしまった場合には

#### 住宅ローンの返済計画の変更をすぐに銀行に申し出ること。

再就職だって大変だ。失業保険で食いつなぐにしても、住宅ローンなどの状況によっては、返済を滞りやすくなる。
返済に滞る前に、金融機関に連絡をとって、月々の返済額を減らすように手を打ってください。
**住民税は失業中も支払う義務がある** ので、お金の問題はあまくみてはいけません。

住宅ローンは滞納2ヵ月後で相当やばいことになります。
金融機関の側は、相談を持ちかけれれもしないうちに、「このまま滞納すると次はどうなってしまいますよ」などと言ってくれることはありません。

会社が倒産し、失意に明け暮れていても、金の支払いは待ってくれません。
とりうる対策は何があるのか調べて、対策をとってください。

#### 任意売却で残債を減らそう
自宅を手放すのでも、競売と任意売却では、売れる価格が違うために、残債の量が違ってきます。
競売は避けることができます。任意売却ができるうちに任意売却をすることでです。そ。れによって数百万円の金額の違いが生じることもありそうです


記事の例
https://media.whatzmoney.com/loan/lost-job/

失業保険の支給開始日

[税金や年金は？失業したら最初にやるべきこと](https://hataractive.jp/useful/4300/)

[住宅ローンを滞納してしまうと、どうなるのでしょうか？](https://okayama-ninbai.com/about-a-short-sale/faq/faq-77.html)
[任意売却と競売の違いを比較](https://www.963281.or.jp/what/comparison/)

[未払賃金立替払制度とは？](https://www.rclo.jp/debt/faq/cat140/502/)

#### 授業料免除の申請
国立大学の授業料免除制度　（各自検索してみてください）
[国立大学の授業料免除制度の所得基準](https://hitorigurashi-navi.info/exemption/)

私立の学校でも、学校によっては、保護者が失業したような状況では、学費の延納ができる場合があります。学校の教務課に問い合わせるなどしてください。

そういった細やかな対策が、家族の生活を守ることにつながります。


仮に万策尽きた場合には
自己破産も視野に入れてください。


---
付記：
なぜ人事は浪花節が好きなんだろう？
「
ETロボコン mruby用教材の補足ページ(2019年)

ETロボコンmruby教材をリリース後に見つかった不具合情報や、ビルドの仕方の詳しい解説など公開しても差し支えない範囲でこちらに記載していきます。

公開できない情報については、こちらで更新あったことだけお知らせしますので、該当情報をあたってくださいね。

(2019/07/22追記)
[EV3RTのタスクの追加のしかた](https://qiita.com/yamanekko/items/7ddb6029820d3cfbd583)を公開しました。
外貨を全角の日本円にして返すコードを書いた

# グーグル検索でよくない？
いちいち新しいタグを開いて入力するのがめんどくさい。また、３９億６４８７万ドルとかごちゃごちゃした数字になると、「変換」の文字を含めないと円換算してくれないのが忙しい業務中はリズムが崩れて腹立たしいことこの上ありません。

# 出来たもの
日本語だけでなく、外国語も対応（グーグル翻訳）です。日本語で書かれた元の通貨とその額、円換算した額、換算レートを参照した時間を返します。ただし、１万ないし１千以下の数値は普段必要ないため、細かい金額が重要な場合は使えません。また、対応通貨はとりあえずよく遭遇するドル、ユーロ、元、ルーブル、ポンドです。コードは最下部ないし[Github](https://github.com/Nakamurus/Converting_currency_to_yen)にあります。

``` text:例
$500 million
('５億ドル', '約５４９億７５２６万１１３２円', ['05月21日 00:00 更新'])

350,9 миллиарда рублей
('３５０９億ルーブル', '約５９８２億９５９９万２７４円', ['05月21日 00:00 更新'])
```

# 必要なモジュール
```py:インストール
pip install mojimoji
pip install googletrans
```

# コード全文


```py:コード全文
import requests
import lxml.html
import re
import mojimoji
from googletrans import Translator


def fcur(currency, tril=0, bil=0, mil=0, thous=0):
  """
  Convert forreign currency to full_width japanese yen
  """
  
  translator = Translator()
  currency = translator.translate(currency, dest='ja').text # translate to ja
  translated = mojimoji.han_to_zen(currency)
  
  currency = re.sub(r'ドル', ' USD', currency) # replace with currency code
  currency = re.sub(r'ルーブル', ' RUB', currency)
  currency = re.sub(r'元', ' CNY', currency)
  currency = re.sub(r'ポンド', ' GBP', currency)
  currency = re.sub(r'ユーロ', ' EUR', currency) 
  currency = re.sub(r',', '', currency) # get rid of commma
  
  cur_name = currency.split()[-1] # get currency name
  if '兆' in currency: # convert to number, multiplying by powers of 10
    tril = int(re.findall(r'\d{1,4}(?=兆)', currency)[0]) * (10 ** 12)
  if '億' in currency:
    bil = int(re.findall(r'\d{1,4}(?=億)', currency)[0]) * (10 ** 8) 
  if '万' in currency:
    mil = int(re.findall(r'\d{1,4}(?=万)', currency)[0]) * (10 ** 4)
  if '千' in currency:
    thous = int(re.findall(r'\d(?=千)', currency)[0]) * (10 ** 3)
  ammount = tril + bil + mil + thous 
  
  url = 'https://keisanki.me/calculator/index/{}/{}'.format(cur_name, ammount)
  response = requests.get(url)
  content = lxml.html.fromstring(response.content)
  yen = content.xpath('/html/body/section[1]/div/div/div[1]/h1/span/text()')[0]
  date  = content.xpath('/html/body/section[1]/div/div/div[1]/h3/text()')
  # retrieve date to check whether currency data are actuall
  
  table = str.maketrans('','',',') # get rid of comma
  yen = yen.translate(table)
  yen_fullwidth = mojimoji.han_to_zen(yen) # convert to fullwidth
  return translated, yen_fullwidth, date

fcur(input())
```
docker imageを直接pullしてみた


https://github.com/cielavenir/pulldockerimage

## 背景

userlandの仮想化基盤としてだけでなく、ソフトウェアの直接導入にもdockerは使われてきている。dockerはimageという単位で取り扱うことが多いが、このimageをリモートリポジトリからpullしたり、リモートリポジトリにpushしたりすることが可能である。これによりimageを共有することができるのである。
ところが一部、このpullを直接はできない環境があり得る。当該マシンが直接インターネットに繋がっていないことや、イントラネットにすら繋がっていないこともあるだろう。そのような場合、docker loadにより標準入出力を介してimageをやり取りすることになる。この場合に使われるのはpullしてきたファイル群をTarで固めたものである。これは手元のdocker daemonからdocker saveすることで作成することができるが、一旦手元にdocker pullしなければ、docker saveは実行できない。バッチ処理に組み込む場合等、不便なことがあるかもしれない。
今回は、リモートからダウンロードしたdocker imageのTarを直接標準出力に生成することを試みる。[1]はそうした試みの先駆けであるが、単体ではログイン機構を有しておらず、docker.ioで使うには力不足である。これをBashからRuby/Pythonで書き直し、再利用をしやすくしたい。

## 方法

docker pullはHTTPSを用いており、認証 -> マニフェストダウンロード -> レイヤーダウンロード -> メタファイル生成という順序で行われる。
まずはマニフェストをダウンロードする。ここで401になったら、WWW-Authenticateヘッダの情報を用いて認証を行う。この認証はBasic認証であり、docker loginが済んでいれば、認証文字列は.docker/config.jsonから直接得ることができる。ここで帰ってきたtokenをBearer認証に用いる。レイヤーはマニフェストに書いてある順番で重ねれば良い。レイヤーのIDは[1]にならい`SHA256(parentId+"\n"+layerDigest+"\n")`とした。

## 結果

### モジュール

Pythonは標準ライブラリで完結させることができた。Rubyはminitarとmechanizeについて外部ライブラリを利用する。minitarはTarライブラリで、mechanizeはプログラムベースブラウザとも言うべきウェブ操作ライブラリである。

### WWW-Authenticateヘッダの取扱い

Pythonはurllib内にparse_keqv_listやparse_http_listといった関数群があり、これでparseすることができる。Rubyは標準ライブラリでは処理できないため、mechanizeを使用する。ただし、mechanizeはsavonというSOAPライブラリが導入されている環境に導入しようとするとruby-ntlm関係でエラーが発生することが知られているため、今回はMechanize::HTTP::WWWAuthenticateParserの中身を埋め込むこととした。

### 30xステータスコードの取扱い

mechanizeであれば30xステータスコードが来たら自動でLocationを読みに行ってくれるが、HTTPを直接触る限りそういうわけにも行かない。30xが来たら、今のレスポンスを捨てたあと、locationを読みに行き30xが来る限りレスポンスを捨てることを繰り返せば良い。この繰り返しはブロック(Pythonの場合はcontextmanagerを使う)を用いて行い、HTTP bodyはyieldで渡すようにすると、後処理が楽である。

### Tarの取扱い

Tar(に限らずアーカイブファイル一般)はヘッダにメンバサイズを書かなければならない(またはアーカイブに追加したあとでシークが必要であるが、標準出力を扱うため認められない)。HTTPヘッダのContent-Lengthをこのメンバサイズとして書き込めば良い。Rubyの場合は、tar.add_fileではなくtar.add_file_simpleを使う必要があった。add_fileはメンバ内に書き込んだサイズを自動判別(しシーク)するバージョンだからである。

## 結論

今回はRuby/Pythonを用いてdocker imageをtarとしてpullすることができた。
https://github.com/cielavenir/pulldockerimage にて利用可能である。

## 参考

[1] https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh

## 余談

(英語で書いたとしても)Linux Journalとかに載せるレベルじゃないですよねー肝心な場所のアルゴリズムは既存の技術ですしorz
7bgzfは違う領域だからある程度の価値があるけども。
「【ZeppelinとDev共催】OSSを学ぼう / DAppsハンズオンワークショップ」に参加してきました

5月20日に渋谷Neutrnioで開催されたセミナー
「[【ZeppelinとDev共催】OSSを学ぼう / DAppsハンズオンワークショップ](https://neutrino.connpass.com/event/127650/)」に参加して来ました。

その中のコンテンツ「OpenZeppelinの概要とDAppsハンズオンワークショップ」が、[昨日書いたqiita](https://qiita.com/tobisako/items/974563165a48b43c9851)と**たまたま**お題が被っていたので、少し補完を込めて記念レポートです。


# OSSを学ぼう / DAppsハンズオンワークショップ
20名を超えるエンジニアの方々が集まっていました。
講義内容は2本。私の本命はDAppsでしたが、OSS（Dev Token）のお話が興味深かったです。


## 講義１：OSSを学ぼう
[aggre氏](https://twitter.com/aggre_)が講師をされ、OSSの概要、github、マネタイズ方法について学びました。またaggre氏が現在開発中の、githubのダウンロード数に応じて開発者にトークンを配布する事でOSSマネタイズを支援するプロダクト「Dev Repository Token」についての説明がとても興味深かったです。続報お待ちしております。


## 講義２：OpenZeppelinの概要とDAppsハンズオンワークショップ
Zeppelin製品をリードする [Ramon Recuero](https://twitter.com/ramonrecuero) 氏が講師をされ、DAppsを開発する3つの理由（自らがコントロール出来る事・プライバシー・お金）、デプロイされたコントラクトは永続性=バグを出してはいけない事、しかしZepKitを使う事でアップグレード可能なコントラクトを簡単にデプロイする事が出来る=バグ出しても何とかなる事、Solidityのホットリロードにも対応しているのでテスト環境でガンガンバグが潰せる点、それらの実演ワークショップが主な講義内容でした。

ワークショップ内容は、[昨日書いたqiita](https://qiita.com/tobisako/items/974563165a48b43c9851)で紹介した記事「[Solidity Hot Reloading Using ZepKit](https://blog.zeppelinos.org/solidity-hot-reloading-using-zepkit/)」の内容とほぼ同様の流れでしたが、 [Ramon Recuero](https://twitter.com/ramonrecuero) 氏の説明のお蔭で個人的には更に理解が進んで良かったです。

ちなみに「[Solidity Hot Reloading Using ZepKit](https://blog.zeppelinos.org/solidity-hot-reloading-using-zepkit/)」を書いた Igor Yalovoy 氏は、Zeppelin社のブロックチェーン・フルスタック・エンジニアだそうです。なるほど、Ramon 氏の同僚なのね。

内容補完としては、

例えば、ホットリローディングを適用するコントラクトには、

```javascript:Counter.sol
    :
contract Counter is Initializable {
    :
```
上記の様に「Initializable 」を継承したコントラクトを「zos Add Counter」で登録する事で、ホットリロードが使える様になります。これはとても簡単に使えそうですね。ホットリロードは主に開発環境で活躍しますが、テストネット（kovanやropsten）でも活躍するのではないでしょうか。

また、コントラクトのアップデートで気になるのは「Storage Layout」。
ここもどうやらうまくホットリロードする仕組みが動作する様ですが、解説図を見る限り、メンバ変数の定義順が重要だった様な・・・。ここは通訳入らなかったので、英語が聞き取れなかった私は詳しく分かりませんでしたorz

このハンズオンで使われた資料って、配布されないんですかね~？（欲しい）


# 懇親会
なんだかピザを食い逃すくらい喋りすぎてた気がします(^q^)
OpenZeppelinのリードエンジニアから直接講義を受ける機会はそんなにないのではないでしょうか。
とても有意義な時間を過ごさせて頂きました。
あと、OpenZeppelinのステッカー貰ってきました。
![zzz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280104/831f892e-fcd5-74c5-927b-69ec344be1d2.png)
日本ではNeutrnioでしか手に入らないそうです（たしか）。
後日もある様な気がする（？）ので、欲しい方は、レッツ・Neutrino！
AndroidStudioのメモリサイズ変更

はじめて書く。今更な内容。

[公式](https://developer.android.com/studio/intro/studio-config?hl=ja)見ろって話なんですが、メモ書きとして。

環境：AndroidStudio3.4、Win10
インストールやら日本語化は他の人がやってるので省略

##メモリインジケータの表示
適当に空のアプリでいいので作る。コーディングの画面まで出す。

ファイル -> 設定 -> 外観＆振る舞い -> 外観
->ウィンドウ・オプション -> メモリ・インジケータを表示するにチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420872/92b4fd6f-abc7-d3e2-3e03-c8636f5f57ce.png)

適用させると右下にメモリバーが表示されるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420872/563a8cf1-41fc-4795-ba55-2aeb17971b15.png)
初期値だと大体このあたりのメモリサイズだと思います。

##使用メモリの決定
ヘルプ -> カスタムVMオプションの編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420872/67e6b431-ceb1-ee0e-c617-8f5e8b1c7e34.png)

クリックして開くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420872/1632d5fc-1de5-a7ef-a6c9-c6f62d866410.png)
こんな感じのが出てくる

ここの-Xmsが最小メモリサイズ、-Xmxが最大メモリサイズの指定になる。
ここの数字をPCのメモリに合わせて変更して**頭の#を外して**保存(Ctrl+S)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420872/c95889fe-ddea-c94e-9396-f75e2fb8646b.png)
ギガ表記でもOKらしい（例：-Xmx8g)

設定後、再起動(ファイル -> キャッシュの破棄/再起動)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420872/1506bdec-cef0-03a0-b4ba-a6e3072686c7.png)
再起動後、メモリが増えていたらOK。
Docker for WindowsでEnabled Kubernetesが出来なくてハマったときの解決方法

# 問題

- Docker for WindowsでEnabled KubernetesをチェックしApplyしたが、インストールが終わらなかったときの解決方法

![2019-05-21_01h23_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/d29ad333-1cff-4667-7f02-d7378d294e39.png)


# 対応内容

- firewallのoutboundルール追加

![2019-05-21_01h40_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/a86a8897-9587-f9f6-fd01-50169d8e90ff.png)

![2019-05-21_01h30_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/0a6e1b75-2d4d-2fb1-9ada-9285b7bc6bd3.png)


- 「.kube」ファイルを削除
- デフォルトに戻す

![2019-05-21_01h27_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/eac868ae-493a-0d88-faee-f16759692dba.png)

- 各種設定を変更

![2019-05-21_01h25_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/61c760de-80bc-d618-e160-d73ea5cc9daf.png)

![2019-05-21_01h32_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/2f748035-30ba-0dad-6979-5f6ed9fea9e5.png)

# 最後に

これで私は起動しました。参考 issuesは以下

Kubernetes fails to start (hangs in starting phase)
https://github.com/docker/for-win/issues/1962
よく使うbrewコマンド

# 自分用メモです

```:Homebrewのバージョン確認
$ brew -v
```

```:Homebrewのアップデート
$ brew update
```

```:Homebrewのアップデート&パッケージのアップデート
$ brew upgrade
```

```:インストール
$ brew install　パッケージ名
```

```:インストール済みパッケージ一覧
$ brew list
```

```:インストール可能なパッケージ検索
$ brew search 検索したいパッケージ名
```

```:インストール可能なパッケージ全表示
$ brew search
```

```:不具合がないか確認
$ brew doctor
```
AWSのWAFに設定するWebACLとかRuleとか

WAF を設定するにあたり、コンソールからポチポチやっただけでは全体間をつかめなかったので、設定する要素をUMLで表してみた。

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145742/841b9192-8e59-3fea-7b19-0bd396469866.png)

これを書かずとも、公式ドキュメントの [AWS WAF の詳細](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/how-aws-waf-works.html) に概念図があった。

![WAFの構成要素の概念図](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/images/web-acl-3a.png)

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/how-aws-waf-works.html より
webとネットワーク技術 ~TCP/IP トランスポート層~

# トランスポート層

送られてきたデータを送信先に正確に送るの役割を持っています。送られてきたデータをポート番号を使いアプリケーションに届ける役割を持ちます。

### ポート番号

コンピュータが通信する通信先のアプリケーションを指定するための番号です。コンピュータと通信するときどのコンピュータと通信するかはIPアドレスを参照すればわかります。しかしデータを送るコンピュータはわかっても、どのアプリケーションにデータを送ればいいかはわかりません。その際、アプリケーションの指定先としてポート番号が使われます。例えとして、IPアドレスがマンションの住所で、ポート番号が部屋番号のイメージです。

## 主なプロトコル
| プロトコル | 説明 |
|:-:|:-:|
| TCP | 通信の速度は遅くなるが信頼性重視。分割して送信されたデータの順序や欠落がないかをチェックしているため、速度は遅くなる。メールやwebサイトなどデータの欠落があると困るものに使われる。  |
| UDP | 通信の精度は落ちるが速度が速い。UDPでは送信されるデータをチェックしないため、速度は速いが信頼性が落ちる。 |


## TCP
TCPは通信するにあたってまず相手との間で接続を確立させてから通信を始めます。そして通信を確立した後、信頼性の高い通信をするため以下の六つのことを行なっています。
①付番によるデータ順序の保証(シーケンス番号)
②受信データ誤りがないかの確認(誤り検出)
③相手が間違いなく受け取ったことの確認(肯定確認応答)
④届いていないデータの再送要請(スタイディングウィンドウ)
⑤相手のペースに合わせたデータ送信(フロー制御)
⑥ネットワークの混雑状況に応じた送信速度の調整

またTCPには相手の応答があろうとなかろうと、一定範囲までは勝手にデータを送る方法が採用されています。これは③の確認を通信速度が遅い相手(例：衛星通信経由)に対して、いちいち少量データ毎に確認を取っていたら面倒なためです。

### シーケンス番号
TCPでバケットに付けられる番号。

### パケット
データ通信をする際に細かく分割されたデータのこと。

## UDP
UDPは信頼性が落ちる代わりに速度が速いプロトコルです。TCPがまず通信を確立させてから通信を始めるのに対して、UDPは事前準備なしで通信を始めます。またデータの再送や入れ替え、欠落、順序が保証されません。通信の手続きが簡略化されており、届いたパケットをすぐアプリケーションに送ります。そのため効率良く通信ができるため動画、音声に使われます。
挑戦者求む！ソリティアをRPAで自動化させてみた！

# やってみようと思ったきっかけ

きっかけはYahoo!ニュースで見つけたITmediaさんの記事。

この見つけた記事では、
RPAでソリティアはクリアできず、

「ソリティアはかなり「非定型業務」だった」

という結論だった。

なんか悔しい！
そう、なぜか俺のソリティア魂が燃えてきた！
ってことで、ソリティアを定型業務（定型作業）に落としこんでみた。

きっかけとなった記事は[こちら](https://www.itmedia.co.jp/news/articles/1903/03/news033.html)
https://www.itmedia.co.jp/news/articles/1903/03/news033.html


# とにかくチャレンジしてみた（動画付き）

今回のポイントは、以下。

1. とにかくソリティアをクリアさせることに重点を置く
1. 画像認識させると手間だったので、やらない
1. 位置情報で提携作業にして、繰り返しゴリゴリRPAにやらせてみた（人間なら絶対やらない！）

### 結局、クリアできたのか？
結論から言うと、クリアできた！
とにかく所定の場所を繰り返し、クリックしていく作戦。
動画は[こちら](https://youtu.be/bMUaEnXrB1I)
[https://youtu.be/bMUaEnXrB1I](https://youtu.be/bMUaEnXrB1I)
（すべて見ると長いので、早送りをおすすめしますｗ）





# 記録は！？
今回の記録は
18分01秒

でも、動画を見ると分かるように、
正直、無駄だらけで、もっと賢いやり方があるんじゃないだろうかと思う。。。w
どうやったら、もっとスマートにソリティアを自動化できるんだろう？


# 記録を更新してくれる挑戦者求む！

もし、興味のある方は是非挑戦してほしい！
もっとスマートなやり方があるはず！

今回、利用したソリティアはMicrosoft Solitaire Collection（windows10に標準で入ってるやつ）

ルールは特になし。
もちろん、スタート時以外で人間が介在することはダメ。
自動化のツールはなんでもOK（なんなら、RPAじゃなくてもいい）！


ちなみに、RPAは無償版のツールも存在しますので、是非試してみてください。
※今回は無断で会社のSynchRoid（ソフトバンク）を拝借しましたｗ

# まとめ（今回の気づき）
結局、人間は目で認識して、脳で理解して、動作に移す。
ので、
・人間の作業をRPAにそのまま移行してもうまくいかないことがある。
・ただし、RPAだからこそできる定型業務の落とし込み方がある。


###補足
あと、付け加えておきたいのは、
実際、RPAのロボット開発はほぼ後輩にやってもらった！
大切な後輩なだけに、ちゃんと記録しておく。
（やってもらったんかーいっ！！ｗ）
Geolocation APIがエラーで動かなかったとき、イベントが実行されなかったときに確認すべきこと

エラーは下記

- Chrome: タイムアウトを設定した場合にはタイムアウトする。エラーは出ない。例 `PositionError {code: 3, message: "Timeout expired"}`
- Firefox: `PositionError { code: 1, message: "User denied geolocation prompt" }`
- Safari: `PositionError {code: 1, message: "User denied Geolocation", PERMISSION_DENIED: 1, POSITION_UNAVAILABLE: 2, TIMEOUT: 3}`

## 解決策

Macなら位置情報サービスが有効になってないせい

![スクリーンショット 2019-05-21 1.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17669/1a88bec3-612d-44ae-3233-aecae4e2054e.png)

めっちゃハマった……Chromeはタイムアウトを設定していないときに何も反応してくれないから本当にわけがわからなかった
オブジェクト指向をとりまく開発手法／技法／アーキテクチャの関連図と習得ロードマップ

# 関連図
いきなり完成した関連図です。
![Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115568/0f3df87f-138b-979a-a384-a27bcc525806.png)

# 背景
以下は，この関連図をつくるに至った背景です。

アラサーエンジニアならば，様々な技術的キーワードに助けられたり振り回されたりしながらも，知ってて良かったなと思うものもあることでしょう。
私が良かったと感じているのは，関連図にもある以下のキーワードたちです。

* ドメイン駆動設計
* SOLIDの原則
* ヘキサゴナル／オニオン／クリーンアーキテクチャ
* DI（依存性注入）
* テスト技法


上記のキーワードたちのそれぞれにフォーカスした個別のブログ記事などは探せばたくさんあるし，関係性に言及しているものも何度か見かけたことはあるが，一枚絵として見られるようなものはないかなと探したが見つからなかった。

めんどくさがりで下手くそだけど，なければ作ればいいということで作ってみました。
もっとしっかり書いてくれる人がいたら書いてほしい。。



# 各技術トピックに関する おすすめ書籍
各トピックでおすすめする書籍を紹介します。


## ドメイン駆動設計
### ***エリック・エヴァンスのドメイン駆動設計*** ([Amazonへのリンク](https://www.amazon.co.jp/dp/B00GRKD6XU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1))
#### この本の見どころ
はっきりいって本が難しすぎて全部はわかりません。
個人的に役に立つかなと思ったところは

* 業務の複雑さに対応するため，業務のエキスパートを巻き込んで設計をしましょう。（ドメインエキスパート）
* 業務エキスパートと開発者との間でしっかり用語定義をして，認識に齟齬がないようにしましょう。（ユビキタス言語）
* ID／ライフサイクルをもつEntityと不変のValueObjectという考え方。（Entity / ValueObject）
* モデリングを頑張りましょう。

特に Entity / ValueObject についてはヘキサゴナル／オニオン／クリーンアーキテクチャのいずれでも登場するほどプラクティスとして扱われているのでいいものなんだと思います。
確かに Entity / ValueObject クラスがいい感じだと重複がなく，凝集性も高く，堅牢な感じになる気がします。


## SOLIDの原則
### ***Adaptive Code ～ C#実践開発手法 第2版*** ([Amazonへのリンク](https://www.amazon.co.jp/dp/B07DJ2BL4Y/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1))
#### この本の見どころ
C#ですがけっこういい本です。
良かった点としては

* SOLIDの原則を実装を交えて紹介している。
* SOLIDの各原則と親和性の高いデザインパターンを実装を交えて紹介している。
* けっこうよく見かける実装をアンチパターンとしてぶった切っちゃう。
* 「コードの臭い」がところどころで紹介されている。
* 最後にアジャイルのコントみたいなのがあっておもろい。


### ***Clean Code ～ アジャイルソフトウェア達人の技 (アスキードワンゴ)*** ([Amazonへのリンク](https://www.amazon.co.jp/dp/B078HYWY5X/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1))
SOLIDってわけではないですがきれいなコードを書くために読んでください。



## ヘキサゴナル／オニオン／クリーンアーキテクチャ
### ***Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)*** ([Amazonへのリンク](https://www.amazon.co.jp/dp/B07FSBHS2V/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1))
#### この本の見どころ
アーキテクチャという抽象的な題材に対してかなり具象的な見解が書かれている。
見所としては

* 低コストで高生産性を求めるのがアーキテクトだと言っている。シンプル。
* アーキテクトにとってオブジェクト指向とは，ソースコードの依存関係を絶対的に制御する能力である．とかカッコいいことを言ってくれる。
* 依存関係をコントロールすることで，プロジェクト構成や外部ライブラリとうまく付き合う方法が提示されている。

実際クリーンアーキテクチャ読んでからは無駄にプロジェクト構成で悩むことはなくなったなぁ。



## DI（依存性注入）
これもクリーンアーキテクチャを読めばいいです。
現場に入るとフレームワークを使うことが先行して，その素晴らしさに気付けないパターンが多いと思います。DIは使うことよりも，他の技術を実現するための実装のひとつとして捉えられてほしい。DIに使われている感じのプロジェクトもけっこうあると思う。



## テスト技法
### ***テスト駆動開発*** ([Amazonへのリンク](https://www.amazon.co.jp/dp/B077D2L69C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1))
#### この本の見どころ
テストというものの価値を見直す良い機会になる。

* プロダクトコードとテストコードの距離を近くに感じられるようになる。
* テストを書くこと／実行することによって実装を導いていく習慣がつく。
* 実装を導くペースを調整できるようになる（仮実装や明白な実装という言葉の違いを認識することで，テストに取り憑かれて開発のペースを落とす必要はないことがわかる）。
* TODOリストを作って目的や思考のログを残しておく習慣がつく。
* テストが常に隣にいてくれることで安心できる感覚がわかる。



# 習得ロードマップ
出会うタイミングは人それぞれであり，各々のコンテキストもあるが，ここでは個人的におすすめする順序を提示しておきます。

1. テスト技法（心理的安全性の確保／テストの習慣化）
2. ドメイン駆動設計（コア概念のモデリング）
3. SOLIDの原則（保守性の高いコード）
4. アーキテクチャ（プロジェクト構成に迷わなくなる）
5. DI（上記4つを実現するための重要な技術であることを噛みしめる）


どれも完璧に理解／実行するというのは難しいでしょう。
その時々に大切だと思ったことを理解しながら何周かするとすべてが少しずつ結びついてくるような気がします。
所属しているプロジェクトが恵まれていれば，普通に感じたり，当たり前に感じることも多いかもしれません。
競プロのときにコピペするgistのlist

# これは何か

コンテストに参加したときに、過去の自分が資産を残しているにもかかわらず、
実装を頑張ったら、enbugしてしまったので、すぐに引っ張り出せるように一覧化したもの。
基本的にC++。
順不同。

# 木

## ただの木

https://gist.github.com/tanitanin/dc757a6cd868e2174659

## Union Find 木

https://gist.github.com/tanitanin/8d0b8904ade00af811ae

## Binary Search Tree

https://gist.github.com/tanitanin/e61003c9e19e9f36e0c5

## 二分木

https://gist.github.com/tanitanin/fe5e5517e10c7f78fa71

## Binary Indexed Tree

https://gist.github.com/tanitanin/dac5220fd6997b74fbc7

## StarrySky (Segment Tree for range add and minimum query)

https://gist.github.com/tanitanin/0453540e7eaa882f61d0

## Segment Tree for range add and range sum

https://gist.github.com/tanitanin/9e3a421486b4e168e250

## スプレー木

https://gist.github.com/tanitanin/8aaa7c511cd22bb418e7

## Link-Cut 木

https://gist.github.com/tanitanin/c4cbc90e01ff928942af

# グラフ

## ただのグラフ

https://gist.github.com/tanitanin/7b057aa1a6b60ada7c73

# その他

## Next Combination

https://gist.github.com/tanitanin/2489a9437c172222d6e0

## GCD & LCM

https://gist.github.com/tanitanin/a9fbfa3c6051eaeb35e7
ポートで開いているプロセスを削除する方法（Windows, Mac）

## Windows

### プロセス確認
```
$ netstat -aon | find "8080"
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING       12312
  TCP         [::]:8080              [::]:0                 LISTENING       12312
```

### プロセス削除
```
$ taskkill /pid 12312
```

削除できない場合、fオプションで強制終了する

```
$ taskkill /f /pid 12312
```

## Mac

### プロセス確認
```
$ lsof -i -P | grep 8080
java      20821 user1   84u  IPv6 0xd5d16e5b8eb30f87      0t0  TCP *:8080 (LISTEN)
```

### プロセス削除
```
$ kill -9 20821
```
Writing and reading a binary file with python

### 1. Requirements
> Ubuntu16.04
> Python3.x

### 2. Refference
> https://docs.python.org/ja/3/library/struct.html

### 3. Sample codes (main.py)
```Python:function
import struct                                                                                                    

'''
  Charactor, Byte-order
  @,         native
  <,         little endian
  >,         big endian

  Format, C-type,         Python-type, Size[byte]
  c,      char,           byte,        1
  b,      signed char,    integer,     1
  B,      unsigned char,  integer,     1
  h,      short,          integer,     2
  H,      unsigned short, integer,     2
  i,      int,            integer,     4
  I,      unsigned int,   integer,     4
  f,      float,          float,       4
  d,      double,         float,       8
'''

def bwrite(data, filename):
  with open(filename, "wb") as f:
    for x in data:
      f.write(struct.pack('b', x)) # 1byte

def bread(filename):
  with open(filename, 'rb') as f:
    bdata = []
    while True:
      bytes = f.read(1)
      if bytes == b'':
        break
      else:
        bdata.append(struct.unpack('b', bytes)[0]) # 1byte
  hdata = [hex(x) for x in bdata]
  return bdata, hdata

def main():
  bwrite([0x00, 0x11, 0x22, 0x33], 'binary.dat')
  bdata, hdata = bread('binary.dat')
  print('bdata', bdata)
  print('hdata', hdata)

if __name__ == "__main__":
  main()

```

### 4. Results
```
$ python main.py 
bdata [0, 17, 34, 51]
hdata ['0x0', '0x11', '0x22', '0x33']

$ hexdump binary.dat 
0000000 1100 3322                              
0000004
```

---------------------------------------------------
Thank you.
last-samurai
apt関連コマンドが遅い原因の調査

# はじめに

Jetson Nanoをセットアップして最初のアップデートに数時間掛かっていた。今後何度も繰り返すことが予想されるため原因を調査することにした。

# 現象

インターネットのスピードテストで計測すると上り/下りとも数10MB/sが出ていた。一方 `apt update` をすると最大でも200kB/sになった。ここから類推できることは

- インターネットは遅くない → Jetson Nanoの問題ではない
- apt関連のみ遅い → Ubuntuの問題

である。

# 解決編

インターネットで調べると、apt関連が遅い場合次の2つの解決方法があるようだ。

- IPv4で強制的にアクセスする
- ミラーサーバを試す

それぞれ確認を行う。

## IPv4で強制的にアクセスする

まずはコマンドで試してみて速くなるようなら恒久対策を行う。

```bash
sudo apt -o Acquire::ForceIPv4=true update
```

速度は200kB/s程度で全く速くならなかった。よって恒久対策も行わない。

## ミラーサーバを試す

ファイル`/etc/apt/sources.list`に記載されたサーバ`ports.ubuntu.com`をすべて`jp.archive.ubuntu.com`に変更した。実際には下記のコマンドを実行した。

```bash
sudo sed -i.org -e 's|ports.ubuntu.com|jp.archive.ubuntu.com|g' /etc/apt/sources.list
```
なおオリジナルのファイルは`/etc/apt/sources.list.org`にバックアップされているので問題発生時にはこちらに戻す。

その後

```bash
sudo apt update
```
を行ったところ、結果速度は30倍以上速くなり、apt関連のコマンドもストレスなく実行できるようになった。

# 結論

aptのミラー先を変更することによってapt関連のアクセスが高速化された。あとは`jp.archive.ubuntu.com`が正常に運用されることを祈るばかり。
LightsailでSSL化(https通信)できなかった問題

SSL化しているはずなのに，なかなかできなかったので，書いておきます．
環境:Ubuntu 18.04.2"

結果からいうと，Lightsailのコンソール画面のファイヤフォールの設定でHTTPSを入れているはずなのに，sshで入って調べてみたら，有効になっていませんでした．

Let’s EncryptでSSLの設定をしたはずなのに，Chromeで`https://hoge.com`を開いてみると，
>「Chromeで「応答時間が長すぎます」

なぁにいいいいいぃぃぃぃ!!!

今度は`http://hoge.com`を開いてみると，普通に繋がる．
原因はファイヤフォールにありました．（半日くらい調べまくったぜ）

<img width="854" alt="スクリーンショット 2019-05-21 0.24.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294876/99e86c72-d164-37ee-38dd-abcb4b986cb5.png">

Lightsailのコンソールでは許可しているのに，

```
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
```

おいいいいいいぃぃぃぃ！！！
HTTPS（433）が許可されてねぇじゃねぇかあああああ！！！

ということで，

```
$ sudo ufw allow 443
```
で追加し，

```
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
```

こうなれば，`https://hoge.com`に繋がりました．
コマンドラインでMySQL操作するときのコピペ用テンプレ

毎回ググって探すのがめんどくさいのでまとめました。

# コマンド

## 接続

```
$ mysql -u ユーザ -p
```

### データベース指定版

```
$ mysql -D データベース -u ユーザ -p
```

## バックアップ取得(データベース単位)

```
$ mysqldump --default-character-set=utf8 --single-transaction -u ユーザ -p データベース > ファイル名.dump.sql
```

## バックアップ取得(テーブル単位)

```
$ mysqldump -u ユーザ -p データベース テーブル > ファイル名.dump.sql
```

## バックアップ復元

```
$ mysql -u ユーザー -p -D データベース < ファイル名.dump.sql
```

### 参考

- ググったワード：【mysql db バックアップ】
[mysqlバックアップの取り方 - Qiita](https://qiita.com/iika0220/items/01d4b8bde4c06cf13fec)

- ググったワード：【mysql テーブル dump】
[MySQL 特定のテーブルのバックアップとリカバリー | kakiro-web カキローウェブ](https://easyramble.com/backup-only-mysql-tables.html)

- ググったワード：【mysql バックアップ テーブル】
[MySQL で特定のテーブルのみをバックアップ | EasyRamble](https://easyramble.com/backup-only-mysql-tables.html)

# SQL

## ユーザ作成

```sql
CREATE USER 'ユーザ'@'接続元ホスト' IDENTIFIED BY 'パスワード';
```

## ユーザ一覧取得

```sql
SELECT User, Host FROM mysql.user;
```

### 参考

- ググったワード：【mysql ユーザー一覧】
[MySQLで、ユーザーの一覧を確認するコマンド | WWWクリエイターズ](http://www-creators.com/archives/309)

## ユーザ削除

```sql
DROP USER ユーザ@接続元ホスト;
```

### 参考

- ググったワード：【mysql ユーザ 削除】
[ユーザーを削除する(DROP USER文) | MySQLの使い方](https://www.dbonline.jp/mysql/user/index4.html)

## ユーザ権限付与

```sql
GRANT ALL ON データベース.* TO ユーザ@'接続元ホスト';
GRANT DELETE, INSERT ON データベース.テーブル TO ユーザ@'接続元ホスト';
```

## ユーザ権限一覧取得

```sql
SHOW GRANTS FOR 'ユーザ'@'接続元ホスト';
```

### 参考

- ググったワード：【mysql ユーザー一覧 権限】
[MySQLでユーザを作成し、権限を設定する方法 | サービス | プロエンジニア](http://proengineer.internous.co.jp/content/columnfeature/6638#section400)

## データベース作成

```sql
CREATE DATABASE データベース;
```

## データベース一覧取得

```sql
SHOW DATABASES;
```

## データベース接続

```sql
use データベース;
```

## テーブル一覧取得

```sql
SHOW TABLES;
```

## テーブル削除

```sql
DROP TABLE テーブル;
```
### 参考

- ググったワード：【mysql drop】
[テーブルを削除する(DROP TABLE文) | MySQLの使い方](https://www.dbonline.jp/mysql/table/index4.html)

## テーブル定義確認

```sql
DESCRIBE テーブル;
```

## インデックス定義取得

```sql
SHOW INDEX FROM テーブル;
```

### 参考

- [MySQLをコマンドで操作する - 早くなんとかしないと…](https://dosomething.hatenablog.com/entry/2017/12/25/233815)

# SELECT

## 標準

```sql
SELECT * FROM テーブル
WHERE 条件1
AND 条件2
\G
```

## 件数

```sql
SELECT COUNT(*) FROM テーブル;
```

# INSERT

## 標準

```sql
INSERT INTO テーブル (
 カラム1
,カラム2
) VALUES (
 1989
,'平成'
);
```

# UPDATE

## 標準

```sql
UPDATE テーブル SET
 カラム1 = 2019
,カラム2 = '令和'
WHERE 条件1
AND 条件2
;
```

# DELETE

## 標準

```sql
DELETE FROM テーブル
WHERE 条件1
AND 条件2
;
```

# 条件

## NULLと空文字を除外したい場合

```sql
SELECT * FROM テーブル
WHERE カラム2 != ''
\G
```

### 参考

- ググったワード：【mysql select null 空文字】
[MySQLのNULL値と空文字の扱いについて - まいけるの日記](http://d.hatena.ne.jp/mikenews/20130408/1365391870)
【Linux】シェルスクリプトにおける && と || の違い

# 複数コマンドをAND演算で実行する &&

bashシェルスクリプト上では `&&` はAND制御演算子である。
以下の場合、command1が成功したらcommand2を実行する。

```sh
$ command1 && command2
```

## エラーが起こった時の挙動

`;` でコマンドを連結する場合、コマンド1がエラーであっても、次のコマンドが実行されるが、
&& で連結した場合はエラーが起きた時点で動作が停止する。

https://qiita.com/_ydah/items/e13579cb8411fbe641c1

# 複数コマンドをOR演算で実行する ||

||  はOR制御演算子である。
指定したコマンド1が異常終了した時に、それに対処する形でコマンド2を実行できるので、
主に事後のエラー処理などを行なう時に使える。

以下の場合、command1が失敗した場合command2を実行します。

```sh
$ command1 || command2
```
go-sqlmockを使ってGORMで書いたコードをテストする

![gopher.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189588/899a1bd3-25c6-ce1b-59d0-11ad77438951.png)

gormを使ったコードのテストをするとき、Dockerなどを使ってDBを立ち上げてテストする必要がありますが、`go-sqlmock`を使うと、実際のDBの代わりにモックを使ってテストすることができます。

この記事は、簡単なモデルを例にしたサンプルコードです。

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

gormとgo-sqlmockは以下のコマンドでインストールできます。

```
go get -u github.com/jinzhu/gorm
go get -u github.com/DATA-DOG/go-sqlmock
```

## テスト対象のソース

RepositoryパターンでCreateとGetをGormで実装した例です。


```go:user/user.go
package user

import (
	"github.com/jinzhu/gorm"
)

type User struct {
	ID   string `gorm:"primary_key"`
	Name string
}

type Repository struct {
	*gorm.DB
}

func (p *Repository) Create(id string, name string) error {
	person := &User{
		ID:   id,
		Name: name,
	}
	return p.DB.Create(person).Error
}

func (p *Repository) Get(id string) (*User, error) {
	var person User

	err := p.DB.Where("id = ?", id).Find(&person).Error
	return &person, err
}
```

## テストコード

先程のコードの、CreateとGetをそれぞれテストしてみます。

まず、DBモックとGORMのオープンです。

```go:user/user_test.go
package user

import (
	"regexp"
	"testing"

	sqlmock "github.com/DATA-DOG/go-sqlmock"
	"github.com/jinzhu/gorm"
)

func getDBMock() (*gorm.DB, sqlmock.Sqlmock, error) {
	db, mock, err := sqlmock.New()
	if err != nil {
		return nil, nil, err
	}

	gdb, err := gorm.Open("postgres", db)
	if err != nil {
		return nil, nil, err
	}
	return gdb, mock, nil
}
```

これを使ってテストを書いてみます。

### Createのテスト

```go:user/user_test.go
func TestCreate(t *testing.T) {
	db, mock, err := getDBMock()
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	db.LogMode(true)

	r := Repository{DB: db}

	id := "2222"
	name := "BBBB"

	// Mock設定
	mock.ExpectQuery(regexp.QuoteMeta(
		`INSERT INTO "users" ("id","name") VALUES ($1,$2)
		 RETURNING "users"."id"`)).
		WithArgs(id, name).
		WillReturnRows(
			sqlmock.NewRows([]string{"id"}).AddRow(id))

	// 実行
	err = r.Create(id, name)
	if err != nil {
		t.Fatal(err)
	}
}

```

`mock.ExpectQuery`のところで、期待するSQLとパラメータと、実行結果のレコードを設定しています。
実際に実行した時に、この期待結果と異なる場合、以下のようなエラーが返ります。

```
--- FAIL: TestCreate (0.00s)
    user_test.go:48: Query 'INSERT INTO "users" ("id","name") VALUES ($1,$2) RETURNING "users"."id"', arguments do not match: argument 0 expected [string - 2222X] does not match actual [string - 2222]
```

### Getのテスト

```go:user/user_test.go
func TestGet(t *testing.T) {
	db, mock, err := getDBMock()
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	db.LogMode(true)

	r := Repository{DB: db}

	id := "1111"
	name := "AAAA"

	// Mock設定
	mock.ExpectQuery(regexp.QuoteMeta(
		`SELECT * FROM "users" WHERE (id = $1)`)).
		WithArgs(id).
		WillReturnRows(sqlmock.NewRows([]string{"id", "name"}).
			AddRow(id, name))

	// 実行
	res, err := r.Get(id)
	if err != nil {
		t.Fatal(err)
	}

	if res.ID != id || res.Name != name {
		t.Errorf("取得結果不一致  %+v", res)
	}
}
```
【Linux】複数コマンドを一行でまとめて実行するセミコロン

# 複数コマンドを一行でまとめて実行するセミコロン

Linuxでコマンドの間に ; が入っていたら、そこで改行が入っていると思えばよいです。
`;` は区切り文字として扱われます。

複数のコマンドを一行で実行したいときなどに使えます。
command1が終了したらcommand2を実行します。

```sh
$ command1; command2
```

# エラーが起こった時の挙動

`;` でコマンドを羅列した場合、command1が成功しても失敗してもcommand2が実行されてしまいます。
つまり、 **エラーがあっても停止はしてくれませんので注意が必要です。** 

### 2021/12/22追記

エラーをケアする場合には `&&` や `||` を使ってよしなにしてあげると良いと思います。
それぞれ挙動の違いについては過去の記事ですが、以下で書いています。

https://qiita.com/_ydah/items/528aefd1a1cab51285c3