OmniAICreator/Qiita-1.07M huggingface dataset:
大量の標準出力からエラーを見逃さない方法


# 何らかの方法でキーワード検索する

コンソールからの検索、ブラウザでの検索、エディタに貼り付けての検索など。
「ERROR」とかいうキーワードで。


# 息を整えてゆっくり読む

足早に通り過ぎない。目を粉にせよ。

# エラーを見逃した原因を振り返る

「だいたいこのジョブは下の方にエラーが出てるよな」という思い込みが原因だったり。ボトルネックを突き止める








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
BoostnoteのMarkdownで円グラフを描く


## Boostnote
[Boostnote \| Boost Happiness, Productivity, and Creativity.](https://boostnote.io/)

![top.png](https://qiita-image-store.s3.amazonaws.com/0/185108/08b6cf33-7c10-4957-b470-a6aaeb01686d.png)


BoostnoteはMarkDownで書けるノートアプリです

- コードブロックやスニペットにも対応
- オープンソースで開発
- ローカルで動き、クラウドで同期も可能
- Win, Mac, Linuxに対応

## 円グラフ

バージョン0.11.11からコードブロックで円グラフを描画することが可能になったようです
> [add YAML for chart by daiyam · Pull Request #2395 · BoostIO/Boostnote · GitHub](https://github.com/BoostIO/Boostnote/pull/2395)

内部的にはChart.jsで表示しているみたいです

記述方法はyaml、jsonの二通りがあります
(表示結果は変わりません)


### YAML

```markdown
	```chart(yaml)
			type: pie
			data:
				labels:
				- Red
				- Blue
				- Yellow
				datasets:
				- data:
					- 30
					- 50
					- 70
					backgroundColor:
					- "#FF6384"
					- "#36A2EB"
					- "#FFCE56"
					hoverBackgroundColor:
					- "#FF6384"
					- "#36A2EB"
					- "#FFCE56"
	```
```




![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/19702a29-9c73-fb86-1bb5-f16482904e4a.png)




### JSON

```markdown
	```chart
	{
		"type": "pie",
		"data":{
			"labels":[
				"Red",
				"Blue",
				"Yellow"
			],
			"datasets":[
				{
					"data":[
						300,
						500,
						100
					],
					"backgroundColor":[
					 "#FF6384",
					 "#36A2EB",
					 "#FFCE56"
					],
					"hoverBackgroundColor":[
					 "#FF6384",
					 "#36A2EB",
					 "#FFCE56"
					]
				}
			]
		}
	}
	```
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/5d28ed60-aaa7-e3fb-ffa4-48b55de6009e.png)



## 萌えポイント
### その１：アニメーション
再読込時や編集時にアニメーションされます

![eqo3y-iaxap.gif](https://qiita-image-store.s3.amazonaws.com/0/185108/bb7d2849-66b7-82f6-7bc6-fbc65f6a2152.gif)


### その２：ホバータグ
マウスカーソルでグラフをホバーすると、系列名と色を表示します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/98178c13-cff6-d3b2-272f-1042c47a72d6.png)

なんだか...スイカみたいですね()
Office365共有メールボックスでのメールワイズ運用

::: note alert
2022年10月よおり基本認証が廃止になったため，この記事の方法は使用できなくなりました。
[Microsoft Exchange Online での基本認証の廃止](https://learn.microsoft.com/ja-jp/exchange/clients-and-mobile-in-exchange-online/deprecation-of-basic-authentication-exchange-online)
:::

以下のような状況でのメールワイズ運用について考えます。

- Office365の共有メールボックスをメールワイズのメールボックスにしたい
- Office365とメールワイズを併用している
 - Office365のメールは残しておきたい
- 複数のメールアドレスを共同で運用している
- Office365のライセンス（Exchange Online）は一つで済ませたい

以下のような要件です。

- メールワイズを運用するためにはPOP3に対応したメールボックスが必要（IMAPでもできなくはないですが）
- 本運用で使うのでメールボックスにメールを残さないようにする
- POP3用にOffice365共有メールボックスを使用
- Office365宛てのメールを共有メールボックスに常時転送（リダイレクト）
- POP3アクセスにはExchange Onlineのライセンスが必要

|項目|値|説明|
|:--|:--|:--|
|利用部門|営業||
|Office365メールアドレス|sales@*****.co.jp|営業|
|Office365共有メールボックス|mw_sales@*****.com|営業（メールワイズ）|
|Office365ユーザー（POP3アクセス用）|mailuser@*****.com|メールユーザー|

## Office365の設定
- POP3アクセス用にOffice365ユーザーを作成
 - "mailuser@*****.com"とする（名前はなんでもいいですが）
 - Exchange Onlineのライセンスを付与
 - POP3アクセスを有効にする（Exchangeの設定 > メールボックスの機能）
- 共有メールボックスを作成
 - "mw_sales@*****.com"とする
 - "mailuser@*****.com"をメンバーに追加する（受信用）
- Office365メール（sales@*****.co.jp）の設定
 - "mailuser@*****.com"をメールボックスアクセス許可の所有者に追加する（送信用）
 - メールの転送先アドレスを"mw_sales@*****.com"にする
 - "転送されたメールのコピーをこのメールボックスに保持する"をオンにする

共有メールボックスのメンバー追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102503/c1c692b0-fb47-ad75-2e18-dae19987eaf7.png)

## メールワイズの設定
### メールサーバー設定
以下のようにメールサーバーを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102503/f57a442b-52a0-f96d-e165-1c8b381d3cc4.png)

### メールアカウント設定
以下のようにメールアカウントを設定します。メールアカウント名の値がポイントです。

`mailuser@*****.com\mw_sales@*****.com`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102503/8208ae94-a096-4bf8-91a7-41dba6e63912.png)

## まとめ
これで，Office365とメールワイズで同じメールアドレスを運用できるようになりました。共有メールボックスを増やせば，その分メールアドレスを増やすこともできます。Office365の他にメールサーバーを用意する必要が無いので便利です。
CentOS7からsqlplusでOracleRDSに接続する



Oracleの[ダウンロードサイト](https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html)にいく。


下記2つをダウンロード。
oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm 
oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.x86_64.rpm

ダウンロードページの下にインストール手順も書いてある。

```
$ sudo yum install -y libaio
$ sudo rpm -ivh oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.x86_64.rpm

確認
$ ll /usr/lib/oracle/18.3/client64/lib
```

~/.bashrcなどに書いてもそのログインユーザーのみ使えるだけなので、
/etc/ld.so.conf.d/配下にファイルを作成して、共有ライブラリの検索パスを追記しておく。

```
# echo "/usr/lib/oracle/18.3/client64/lib" >> /etc/ld.so.conf.d/oracle.conf
# cat !$
cat /etc/ld.so.conf.d/oracle.conf
/usr/lib/oracle/18.3/client64/lib
```

/etc/ld.so.cacheの内容を更新してあげないと使われないので、ldconfigコマンドでld.so.conf.dの変更をキャッシュに反映する。

```
# ldconfig
# sqlplus64

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Nov 20 02:12:26 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Enter user-name:
```

sqlplusは使えるようになったので、RDSへの接続確認をする。

```
$ sqlplus64 'ユーザー名@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=RDSのエンドポイント)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))'
```
適当なSelect文を発行して確認

```
SQL> set linesize 160
SQL> select * from v$instance;

INSTANCE_NUMBER INSTANCE_NAME    HOST_NAME                                                        VERSION           STARTUP_T STATUS       PAR    THREAD#
--------------- ---------------- ---------------------------------------------------------------- ----------------- --------- ------------ --- ----------
ARCHIVE LOG_SWITCH_WAIT LOGINS     SHU DATABASE_STATUS   INSTANCE_ROLE      ACTIVE_ST BLO
------- --------------- ---------- --- ----------------- ------------------ --------- ---
              1 ORCL             ip-10-7-2-238                                                    11.2.0.4.0        20-NOV-18 OPEN         NO           1
STARTED                 ALLOWED    NO  ACTIVE            PRIMARY_INSTANCE   NORMAL    NO
```
iTerm2の見た目を変更する（色を付ける）

表示内容を変更し、色をつけるようにします。

参考リンク
https://qiita.com/varmil/items/9b0aeafa85975474e9b6

git-completion.bashが無い場合
http://cybermergina.hateblo.jp/entry/2018/05/25/182328


1.  git-completion.bash ファイルをgitフォルダと同じディレクトリに配置する。
（gitフォルダ内ではないので注意）

2. 同じディレクトリ内にある .bashrc ファイルに下記のソースを記述します。
    ※隠しファイルなので、macの場合は、command + shift + . で表示させます。

```terminal
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi
```
ここから下を記述
iTermでブランチ名出す設定は、下記を記載してください

```terminal
function git_ps() {
 git branch --no-color 2> /dev/null | sed -e 's/ //g' | sed -e '/^[^*]/d' -e 's/*\(.*\)/\1/'
}
export PS1='\[\033[00m\]\u@\h\[\033[00m\]:\[\033[32m\]\w\[\033[35m\] [$(git_ps)]\[\033[00m\]\$ '
// ここから上を記述

export PATH=/usr/bin/X11:$PATH
```
これで、現在のブランチを常に表示するようになり色付きにもなります。

色コードの変更は下記を参照に
https://qiita.com/wildeagle/items/5da17e007e2c284dc5dd
Slack分報を flash memory persistence の三種類で運用してみるテスト。

# 結論

いい感じ。脳の構造に合っている。

# #flash-yumainaura

今やってる作業を書く。積み上げ型ではなく「最終投稿」を編集して運用。

# #memory-yumainaura

覚えておきたいことを書く。 この中から「現在の作業」を始めたら flash に移す。


# #persistence-yumainaura

やりたいこと。覚えておきたいこと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/196115df-286b-09d7-5317-80aa90fb54b5.png)


# #times-yumainaura

普通の分報。自分のステート共有など。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AidlTokenType.import or AidlTokenType.packageが出る場合の対応

#発端
AndroidStudioが「Kotlinのプラグイン出たよ。更新する？」って聞くのでアップデート。
そのあとリソースファイル周りを触っていたら、

<interface declaration>,<parcelable declaration>, AidlTokenType.import or AidlTokenType.package Exepted, get 'com'

となって、AidlTokenTypeが認識できなくなった場合の対応(覚書)


#対応
[ファイル] [キャッシュの破棄 / 再起動]で再起動後、ビルド。


#参考
[Android Studioをアップデートしたら<interface declaration>,<parcelable declaration>, AidlTokenType.import or AidlTokenType.package expcted got 'wrap_content'](http://woshidan.hatenadiary.jp/entry/2016/01/16/002706)
Raspberry PIとffmpegとWebカメラ、USBマイクを利用して動画を取得

#Webカメラを扱うために
参考：https://leico.github.io/TechnicalNote/Linux/webcam-usage

まずはv4l2をインストールする。

```terminal
sudo apt-get install v4l-utils
```
これでv4l2-ctlが使えるようになった。
Webカメラを接続して、以下を入力すると、利用できるカメラが一覧できる。

```terminal
v4l2-ctl --list-devices
```
結果

```terminal
UVC Camera (046d:0825) (usb-3f980000.usb-1.2):
        /dev/video0
```
この`/dev/video0`というところを後で使うのでメモしておく。



#USBマイクを扱うために
参考：http://suen-study.blogspot.com/2014/02/usbusbarecordaplay.html
すでに、ffmpegのインストール時にalsaはインストールしているので、
USBマイクを接続して、

```terminal
arecord -list
```
で、USBマイクの一覧が表示される。

```terminal
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: U0x46d0x825 [USB Device 0x46d:0x825], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 2: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```
Webカメラにもマイクが搭載されているので、デバイスが2つ表示されている。
このうちカード1の方は、`U0x46d0x825` とあり、先に`v4l2-ctl`で取得したカメラの数字と同じ。
つまり、カード1のマイクはWebカメラに搭載のマイクとなる。
今回はUSBマイクを使いたいので、カード2の方になる。この`カード2`と`デバイス0`のそれぞれの数字をメモしておく。


#ffmpegを使ってWebカメラとUSBマイクから音声付き動画を取得
参考：https://signal-flag-z.blogspot.com/2016/10/raspberry-pi-3usbffmpeg.html
とりあえずカメラから画像を取得、USBマイクから音声を取得、Raspberry PIのハードウェアエンコーダを利用してエンコードしてmp4で保存。
なお、下記の例では「\」を置いて改行しているが、「\」を省略して一行にまとめて書いてもよい。
ただ関連する要素の単位で改行する方がわかりやすくなると思う。

```terminal
ffmpeg -f alsa -thread_queue_size 8192 -i hw:2,0 \
  -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \
  -c:v h264_omx -b:v 768k \  
  -c:a aac \
  output.mp4 
```
録画の終了は`q`キーを押す。

それぞれの意味は以下の通り。(参考：https://ffmpeg.org/ffmpeg-all.html）
`-f`入力・出力されるファイル（データ）のフォーマット。大抵の場合は設定しなくても大丈夫なのだが、マイクやカメラから取得するときには必要みたい（マイク→alsa、ビデオ→v4l2）。
`-thread_queue_size` データを読むときのキュー（バッファみたいなもの？）のサイズ。高フレームレートの動画ストリームとかだと、処理が追い付かずに捨てられてしまうデータがあったりするのだが、キューサイズを大きくすると、それを防げる。
`-s`動画のサイズ。
`-i`入力ストリーム。ここで、先にメモした`/dev/video0`と`hw:2,0`（2と0がarecordの出力からのメモ）を設定する。
`-c:v` `-c:a` エンコードのコーデックの指定。vがビデオコーデック、aがオーディオコーデック。以前のバージョンだと-`vcodec` `-acodec`という形だったらしい。今回はラズパイのハードウェアエンコーダを使うのでh264_omxを指定。音声はaac。
`-b:v`　ビデオのビットレート。当然ながら値が大きいほど画質がきれいになる。

# その他参考のページ
https://www.ukeyslabo.com/raspberry-pi/audio/
絵文字ビルダーすごい。Slackカスタム絵文字作成。

http://phlntn.com/emojibuilder/


[治安の悪い Slack Emoji を作るツールを作った - Qiita](https://qiita.com/zk_phi/items/8a24b8ad9d1eabd364aa)

# 表情を変えられる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5a667f8c-5114-917d-97bf-7952b6a7eb9a.png)




# 組み合わせられる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/06fce692-0985-3800-5ff3-886bb0402aed.png)

# 128x128 の ping で保存
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/690c9895-00df-d0c9-a928-b97a18a3d30c.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
基本データ型と参照型

# 基本データ型の変数とは
変数の中身に、値そのものが入っている変数のこと

# 基本データ型変数のメモリ使用領域
基本データ型とは、下記の8種類である。

| 種類 | ビット数 | 説明 |
|:-:|:-:|:-:|
| boolean  | 1bit  | true or false  |
|  byte |  8bit | 符号付き整数 -128～127 |
|  char |  16bit | Unicodeの一文字 |
|  short |  16bit | 符号付き整数 -32768～32767 |
|  int | 32bit  | 符号付き整数 -2147483648～2147483647 |
|  long | 64bit  | 符号付き整数 約-922京～約922京 |
|  float |  32bit | 浮動小数点数 |
|  double | 64bit  | 浮動小数点数 |

基本データ型の変数は、定義された時に必要なメモリ領域を確保する。その確保したメモリ領域に、値をそのまま代入し保持する。

以下のようなコードを実行したとする。

```java:基本データ型
int x = 10;
int y = x;
y = 20;
System.out.println(x);
System.out.println(y);
```
出力は以下の通り。

```java:出力
10
20
```

このように、基本データ型の変数は、値そのものを変数に保存している。そのため、`y`の中身は、10 → 20 と変化し、最終的に20が出力される。

# 参照型変数とは
値そのものを保存しるのではなく、値がおいてある場所（メモリ番地）を保持する変数のこと。
基本データ型と違い、どんな値が代入されるか分からない場合、どれくらいのメモリ領域を確保しておいたらいいのか分からない。また、1度メモリ内でその変数用に確保したメモリ領域は、後から大きく変更できない仕組みになっている。
そのため、こういった参照型変数には、メモリの他の部分に作られた値の場所を示すコードが代入される。この場所を示すコードのことを参照値と呼ぶ。

以下のコードを実行したとする。

```java:参照型
int a[] = { 1,2,3 };
int b[] = a;
b[0] = 2;
System.out.println(a[0]);
```
出力は以下の通り。

```java:出力
2
```

これが参照型変数の挙動の特徴的な部分になる。
`b[]`に保存されているのは、`a[]`の場所を示すコードなので、`b[]`の中身を変更するというのは、同時に`a[]`の中身も変更してしまう。

# 参考にした記事
https://nobuo-create.net/sanshougata/
MySQLでゼロパディングする

MySQLでゼロパディングしてデータを取得したくて
色々調べたので、その備忘録です。
間違った点などあればご教授いただければ幸いです。

※ちなみに「ゼロパディング」とは「桁が足りない分を０で埋める」ことです。
参考：[ゼロパディングとは - IT用語辞典 Weblio辞書][zeropadding]

#はじめに
テーブル作ります。

```sql
mysql> CREATE TABLE `demo`(`id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `num` int(10) UNSIGNED NOT NULL);
Query OK, 0 rows affected (0.04 sec)
```

とりあえずデータを何件か入れます。

```sql
mysql> INSERT INTO `demo`(`num`) VALUES (1);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `demo`(`num`) VALUES (12);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `demo`(`num`) VALUES (123);
Query OK, 1 row affected (0.00 sec)
```

こんな感じになります。

```sql
mysql> SELECT * FROM `demo`;
+----+-----+
| id | num |
+----+-----+
|  1 |   1 |
|  2 |  12 |
|  3 | 123 |
+----+-----+
3 rows in set (0.01 sec)
```

#ゼロパディングで取得したい

今回取得したいデータはこんな感じです。

```sql
+----+-----+
| id | num |
+----+-----+
|  1 | 001 |
|  2 | 012 |
|  3 | 123 |
+----+-----+
```

調べてみると、どうやら[LPAD][lpad]という関数を使えばいいみたいです。
というわけで、実際に取得してみます。

```sql
mysql> SELECT LPAD(`num`, 3, '0') FROM `demo`;
+---------------------+
| LPAD(`num`, 3, '0') |
+---------------------+
| 001                 |
| 012                 |
| 123                 |
+---------------------+
3 rows in set (0.00 sec)
```

おおおおおおおおおおおおおおおお(๑¯﹀¯๑)！！

ちょっと調整

```sql
mysql> SELECT `id`, LPAD(`num`, 3, '0') AS `num` FROM `demo`;
+----+-----+
| id | num |
+----+-----+
|  1 | 001 |
|  2 | 012 |
|  3 | 123 |
+----+-----+
3 rows in set (0.00 sec)
```

そうです！こういうことです！！

#補足
毎回ゼロパディングして取得したいなら、テーブル作るときに [ZEROFILL][zerofill] 使いましょう。

というわけで作り直します。

```sql
mysql> DROP TABLE IF EXISTS `demo`;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE `demo`(`id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `num` int(3) ZEROFILL NOT NULL);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO `demo`(`num`) VALUES (1);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `demo`(`num`) VALUES (12);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `demo`(`num`) VALUES (123);
Query OK, 1 row affected (0.00 sec)
```

するとこんな感じに。うん、満足。

```sql
mysql> SELECT * FROM `demo`;
+----+-----+
| id | num |
+----+-----+
|  1 | 001 |
|  2 | 012 |
|  3 | 123 |
+----+-----+
3 rows in set (0.00 sec)
```


ちなみに今回 UNSIGNED 属性を指定していませんが、マニュアルによると

> 数値カラムに対して ZEROFILL を指定すると、MySQL は自動的にそのカラムに UNSIGNED 属性を追加します。

とのことなので、大丈夫みたいです。


#参考
> 
+ [MySQL 5.6 リファレンスマニュアル - 12.5 文字列関数][lpad]
+ [MySQL 5.6 リファレンスマニュアル - 11.1.1 数値型の概要][zerofill]
[lpad]:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_lpad
[zerofill]:https://dev.mysql.com/doc/refman/5.6/ja/numeric-type-overview.html
[zeropadding]:https://www.weblio.jp/content/%E3%82%BC%E3%83%AD%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B
Slackでサイドバーを隠す一番簡単な方法 

# 画面の端っこに持ってくる

ずずずいっと左に押し込む。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e2002a14-b371-047a-995b-5634f90573bd.png)

# 何のため？

集中力の確保。

# エンジニアがそれで良いの？

問題解決のためなら手段を選ばない、それがエンジニア。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravelのエラー画面もでず、laravel.logにも何も出ないが実行が停止される時

Laravelを使用していると、致命的なエラー(Syntax Errorや重複定義）を出してしまっても
うまいことハンドリングしてwoopsしてくれると思います。
そして、エラーはlaravel.logにも残ってくれます。

普段はこれらを参考に試行錯誤している方が多いかと思います。

しかしこの度、エラー画面も出ず、ログにもなにもでないで停止する症状に遭遇したため紹介します。


# 症状

- viewの描画中、途中で切れる
- ログには何もない

# 原因

再帰コールで無限ループが発生していた


昔はコールスタック超えたらそれはそれでエラーとして扱ってくれた気がするが今回はそのようなことはなし
5.5で確認。


# おまけ

`Internal server error 500` が出るときはLaravelが原因のエラーな事は少ない

まず、error_log (apache)、または　php_fpm.log (FPMの場合）などを見れば原因が書いてある事が多い。

よく遭遇するのは

- htaccess が原因　（この前は -MultiViews が機能しないサーバ(Conoha WING)で死んだ
- PHPのパーミッション問題（共用サーバだとたまにある）

です
システムエンジニアはSlackカスタム絵文字で視認性を高める

# TODO リストを書く例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b4583423-6d6e-e0cf-12b9-7eb307871058.png)


# 絵文字の視認性やばい

すごい情報量。最小入力コスト。

# ツール・サービス毎にカスタム絵文字を登録してみよう

使えるぜ。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
react-native run-android で Activity class does not exist エラー

Androidの開発ではデバッグビルドとリリースビルドを区別するために、パッケージ名にサフィックスをつけて異なるパッケージ名にする事があります。
React Nativeでもサフィックスをつけるように`build.gradle`を修正したところ、`react-native run-android`で以下のエラーが出るようになってしまいました。

```
Error: Activity class {your.package.name/your.package.name.MainActivity} does not exist.
```

エラーメッセージでは`your.package.name`アプリの`your.package.name.MainActivity`アクティビティを起動しようとしていますが、
実際のアプリパッケージはサフィックスを指定しているので`your.package.name.dev`のようになっています。
そのためActivityが見つからないのです。

解決するにはオプションを1つ追加してコマンドを実行すればよいです。

```
react-native run-android --appIdSuffix dev
```

参考
https://stackoverflow.com/questions/41771892/react-native-app-wont-start-when-using-applicationidsuffix
三行Qiitaのススメ。TLDRなアイディア提案記事を書いてみよう

# なぜ三行？

アイディア・提案だけなら三行で事足りる。

# TLDRの効果

読み手も書き手も最小コスト。

# 犯行動機は？

ちゃんとした記事を書きたいけど、時間が足りないことが多すぎる。









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Scrapbox でプロジェクトを公開設定する ( Settings > Make this project public )


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/edc633a5-f02c-6c89-aef6-bad1fd2ca01f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b5e9408c-3917-ec11-cb1b-10331ad9b7ee.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
上司か詐欺師か

例えばこんな会話を考えてみます

> ... ある金曜日 ...
> 上司> ちょっとやってほしいタスクがあるんだけど.
> 部下> どんなタスクですか？
> 上司> (タスクの説明をしたのち) こんな感じなんだけどどれくらいかかりそう？
> 部下> その内容ですと...来週の金曜くらいまでかかりそうですね
> 上司> そりゃ困るよ、来週の木曜には上に見せることになってるんだから.じゃ、水曜までにどうにか頼んだよ.
> ... 翌週の水曜日 ...
> 上司> 先週頼んだタスクだけど終わった？
> 部下> 終わってません
> 上司> なんだって！？水曜までにやっておいてくれと言ったじゃないか！！
 

ひどく簡略化してありますが, どこで見られるようになひどい話です.
私はこんな話を聞くたびに, どこかで読んだ次の思考実験を思い出します.

> ある男が資本家たちの間を歩き回り「確実に値上がりする株の銘柄を知っている」と語って回った.
> 多くの人々はこの言葉は全く根拠のない妄言であり, この男のことをただの詐欺師だと考えたが
> 何人かの資本家たちはこの言葉を真に受けて彼に投資金を預けることにした.
> 時が過ぎ, 約束の期日を迎えたとき, 株は値上がりしており彼は約束通り投資者たちに配当金を配っていった.
> しかしこの男, 実は株価が値上がりすることを確信はしていたが, その論拠は全くなかった. 
> さて, このとき彼は詐欺師であろうか?

どこで読んだか思い出せないので細かいところはあやふやですが, おおむね上記のような話だったと思います.
このような行いが詐欺か否かと聞かれたら直感的には詐欺だと思うわけですが, ネタ元ではそこで終わらずに
この男をどのようなときは詐欺師と扱うべきでどのようなとき扱うべきではないかについての
詳細な議論が続けられていました. 
今回私が言いたいことはそういった興味深い議論についてではなく, たんに上の詐欺師と上司が似たものどおしであるということです.
つまり, 上司の男がタスクが自分の期待通りの期日に完了することを信じてたことは, 
詐欺師の男が株価が期待通り値上がりすることを信じたことに等しいと言いたいわけです.

では, どうすれば詐欺師にならずにすむのでしょうか？
一番単純な方法は, 論拠のないスケジュールを立てないことです.
最初の例ですと

> 部下> その内容ですと...来週の金曜くらいまでかかりそうですね

と作業者である部下が言っているわけですから, タスクの締め切りも金曜日かさらに先に設定すべきでしょう.

「そうは言ってもそれは理想論であって, 現実には自分の上にも上司はいて, 期日はそっちから指定されるんだからしかたないんだよ」と反論したい人もいるでしょう.
確かにタスクの期日を自分ですら決定できないことは多々あります.（あるいはほとんどでしょう）
そういう時でも投げやりになって上の決定を下に流すだけのパイプになるのではなく
部下と相談し, 現在抱えているタスクの優先度の整理をし直すとか, 新タスクを期日まで完了可能な形に縮小できないか考えたりとか, 
あるいは進捗を妨げている面倒な問題を代わりに引き受けるとか, 部下を納得させる案を考えることはできるのではないかと思います.

部下の見積もりを信用するか, あるいはタスク完了のための協力を惜しまないという態度を見せる.
部下から詐欺師として見られたくないならば, どんな時でもどちらかの態度は見せるべきです.

## 補講: なぜ作業者の見積もりは管理者の見積もりより優先すべきなのか
上段ではタスクの見積もりについては管理者の考えではなく作業者の考えを尊重すべきと述べました.
これは無条件に真としてよい命題なのでしょうか?
作業者, 特にプログラマは怠惰でものぐさで, 締め切りギリギリにならないと仕事をはじめないくせに
妙なところにこだわって余計な時間を無駄に浪費するようなろくでなし.
連中は, はっきり言ってしまえばまったく信じるに値しない.
だから, タスクの見積もりを含めすべてを自分で管理していかないことにはプロジェクトは一歩も前に進まない, 
と考えている管理者の方もいるでしょう.
プログラマは怠惰でギリギリまでタスクに着手しない. 細かいところにばかり気を取られて全体のことを気にしない.
これらの認識は, まあ大体正しいです.（少なくとも間違ってはないです）
それでも彼らに見積もりをさせるべきなのです.
なぜならば, 管理者の期待する（そして作業者は無理だと思っている）見積もりを押し付けたところで, 
彼らにそれを守るモチベーションは存在しない以上, 返ってくるのはせいぜい間に合わせの最低の質の仕事と管理者に対する不信感しかないからです.
一方で作業者が立てた見積もりを採用すれば, 自分で立てた計画である以上おそらく彼らはそれを守ろうとするでしょう.
また良い仕事をしようというモチベーションも保つことができるので, 仕上がった仕事の質にも期待がもでるでしょう.
運が良ければ管理者に対する敬意も返ってくるかもしれません.(この場合の敬意とは後で無理を通す時に使う貯金程度の意味しかありませんが…)

プログラマは信用なりません.
しかし, それでも信用しないことにはプロジェクトを前に進ませることはできないのです.
Qiitaでもっと「ポエム記事」を書いてアイディア共有したい

# ノイズにならない？

ポエムタグをフォローしているのは、ポエムタグを理解している人だけ。

# Twitterに書かないの？

どんなに役に立つ提案でも、Twitterに書くとGoogle検索さえできなくなる。

# Qiitaに書くの？

たとえコンテンツ量は薄くても「提案」は残したい。アイディアを残すのに文字量は必要ない。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニアのSlack絵文字術 – 心理的安全性が崩れた時は手を挙げよう

# 心理的安全性をどう作るか？

究極の命題だ。

# 心理的安全性が崩れるのはどんなときか？

人による。ケースによる。シチュエーションによる。一般化出来ない。

# 「手を挙げる方式」はいかが？

心理的安全性が崩れたと思った時の、Slack絵文字を作っておくとか。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DockerでNuxt.js(v1.3.0)+TypeScript開発環境を構築する

## 概要

Dockerコンテナ上でNuxt.jsの開発ができるようにする手順です。
[前](https://qiita.com/kai_kou/items/2d50d9e91e536fd4aeb2)にも同じような記事を書いたのですが、開発環境の構築についてまとめてみました。

**Nuxt.jsのバージョン1.3.0を利用した記事となります。Nuxt.jsのバージョン2の利用だと別の方法となるみたいです(未検証**


## 手順

GitHubにソースをアップしていますので、よければご参考ください。
https://github.com/kai-kou/nuxtjs-typescript-with-docker

### 前提

Dockerがインストールされている前提です。

```sh
> docker --version
Docker version 18.06.1-ce, build e68fc7a

> docker-compose --version
docker-compose version 1.22.0, build f46880f
```

### Docker環境の作成

```sh
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch Dockerfile
> touch docker-compose.yml
```

Node.jsのバージョンや、```npm``` か```yarn``` を利用するかはお好みで。

```txt:Dockerfile
FROM node:10.8.0-stretch

RUN npm install --global yarn
RUN yarn global add @vue/cli
RUN yarn global add @vue/cli-init

WORKDIR /projects

ENV HOST 0.0.0.0
ENV PORT 3000
```

```yaml:docker-compose.yml
version: '3'

services:
  app:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - ".:/projects"
    tty: true
```

Dockerコンテナを立ち上げます。

```sh
> docker-compose up -d
> docker-compose exec app bash
```

### Nuxtアプリの作成

TypeScriptのプロジェクトテンプレートを利用します。

nuxt-community/typescript-template: Typescript starter with Nuxt.js
https://github.com/nuxt-community/typescript-template

```sh:コンテナ内
> vue init nuxt-community/typescript-template app
> cd app
> yarn
```

### SCSS対応

SCSSが利用できるようにします。こちらは任意でOKです。

```sh:コンテナ内
> yarn add --dev node-sass sass-loader
```

ファイル拡張子やタグに```scss``` の指定を追加します。

```sh:コンテナ内
# ファイル拡張子の変更
> mv assets/css/main.css assets/css/main.scss

# nuxt.config.jsの設定変更
> grep -l 'main.css' ./nuxt.config.js | xargs sed -i -e 's/main.css/main.scss/g'

# .vueファイルのstyleタグにscssの指定を追加
> grep -l '<style scoped>' ./**/*.vue | xargs sed -i -e 's/<style scoped>/<style lang="scss" scoped>/g'
```

### 動作確認

実行してみます。

```sh:コンテナ内
> yarn dev
```

ブラウザでアクセスしてみます。
http://localhost:3000

<img width="1032" alt="スクリーンショット 2018-11-12 13.56.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/fa726e1d-3d6e-c9ba-fa6a-542c5f76473e.png">


やったぜ。


### HOST、PORTの指定方法

Dockerfileで```HOST``` と```POST``` を環境変数で指定していますが、環境変数で指定せずに、コマンドパラメータで指定も可能だそうです。

ホストとポート番号 - Nuxt.js
https://ja.nuxtjs.org/faq/host-port/


## まとめ

TypeScript用のプロジェクトテンプレートが用意されているので、とても簡単に環境構築することができました^^


## 参考

nuxt-community/typescript-template: Typescript starter with Nuxt.js
https://github.com/nuxt-community/typescript-template

Nuxt.js + TypeScript(+ tslint)プロジェクトの作成手順
https://www.h-sakano.net/entry/2018/09/09/131124

Nuxt.js + TypeScript + Sass + ESLint 事始め
https://qiita.com/ryota-yamamoto/items/4b06ef51926df1bdbae8

DockerでVue.js+TypeScript開発環境を構築するhttps://qiita.com/kai_kou/items/d581a9f8f3ee8605aed1

複数のファイル内の文字列をまとめて置換するLinuxコマンドhttps://qiita.com/kkyouhei/items/b4ff839a2f36ba194df3

複数ファイルを一気にgrepしたり文字列置換したりする方法 - Nao Minami's Blog
http://south37.hatenablog.com/entry/2014/08/17/%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%B8%80%E6%B0%97%E3%81%ABgrep%E3%81%97%E3%81%9F%E3%82%8A%E6%96%87%E5%AD%97%E5%88%97%E7%BD%AE%E6%8F%9B%E3%81%97%E3%81%9F%E3%82%8A%E3%81%99

ホストとポート番号 - Nuxt.js
https://ja.nuxtjs.org/faq/host-port/
PPTでポスターを作る際の寸法メモ


# 概要
学会とか真面目な用途を想定。

- A0サイズ，2カラム
- 日本語（英語でもいいけど）
- PowerPoint2017＠Windows10で作成（さして重要ではないが古すぎると一部機能がないかも）

なお，体裁については[このブログ](http://bio-eco-evo.hatenablog.com/entry/2016/08/31/162014)を最初に参考にすることを勧める。
その上で実際にどれくらいの寸法で作ろうかという話である。


## サイズ
スライドのサイズ→ユーザ設定から設定して，A0サイズ：幅84.1cm，高さ118.9cmで作る。
正直縦横比さえあっていれば問題ないが，サイズ調整機能により実寸時のイメージがつかめるので実寸で作るのが良い。

![](https://i0.wp.com/www.psylabo.com/wp-content/uploads/2014/12/8a66cfee670cffd66aa2ed1bd41dff8e.png?w=384)

図の出典：http://www.psylabo.com/?page_id=27830

## フォント
断然ゴシック体で組む。
何も考えないなら游ゴシック系などで統一。

- 日本語：游ゴシック
- 英語 通常：游ゴシックUI
- 英語 強調：Segoe UI

がおすすめ。游ゴシックが嫌いならメイリオやヒラギノフォントでも。
正直字体が細いので私もそこまで好きではないが不可ってほどでもない。

大きさについては後述するが，**24ptを下回ると圧倒的に読みにくい**（体感）のでそこらが下限と思ってもらうと良いかと。

## 位置組み

位置組みはタイトルの長さ等にも影響されるし場合によりけりだが，一例をここに述べる。

### パターン１

- タイトル部：上から**12-15cm**
- 引用・その他のスペース：下から**～8cm**
- タイトルフォント：72~82pt
- 著者，章立てフォント：50pt
- 文章：28~32ptくらい？
- 強調されるコメント：~40pt程度

この場合，以下のような見た目になる。（注：＊は40ptと大きめ）
上からは12cm下からは8cmを確保した。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/958e816a-3cae-4f5b-0d92-73f937a24fb6.png)

タイトルが長い場合は70pt台に抑えるのが良いかもしれない。

なお，5分～で説明が完了することを想定しているため，じっくり議論する場合は適宜フォントサイズを落としてもらうと良い。
Rubyの範囲指定　 〜「..」と「...」〜

##  ~~範囲リテラル~~範囲式「..」と「...」の違い
```
(1..5).to_a        #1から5以下の範囲
=> [1, 2, 3, 4, 5]
(1...5).to_a       #1から5未満の範囲
=> [1, 2, 3, 4]
```
後ろの数字(あるいは文字)を含むか、含まないか、そんだけ。

## おまけ 〜範囲に含まれているかの確認〜　
```
(1..5).include?(5)
=> true
(1...5).include?(5)
=> false
(1..5) === 5
=> true
(1...5) === 5
=> false
```
「~~範囲リテラル~~範囲式」こんなかんじ。
vbsの作法 その14

#概要

vbsの作法を調べてみた。
正規表現やってみた。

#サンプルコード

```
Dim str
Dim regEx, Match, Matches

str = "_SLat:35.66737405" & vbcrlf
str = str & "SLon:139.79088988" & vbcrlf
str = str & "1Lat:35.66743734" & vbcrlf
str = str & "1Lon:139.79096864" & vbcrlf
str = str & "2Lat:35.66731075" & vbcrlf
str = str & "2Lon:139.79081111" & vbcrlf
str = str & "---" & vbcrlf

msgbox str

Set regEx = New RegExp
regEx.Pattern = "SLat:([0-9].+[0-9])\s+SLon:([0-9].+[0-9])\s+1Lat:([0-9].+[0-9])\s+1Lon:([0-9].+[0-9])\s+2Lat:([0-9].+[0-9])\s+2Lon:([0-9].+[0-9])"

regEx.IgnoreCase = True
regEx.Global = True
Set Matches = regEx.Execute(str)
For Each Match in Matches
	RetStr = RetStr & "SLat: " & Match.submatches(0) & vbcrlf
	RetStr = RetStr & "SLon: " & Match.submatches(1) & vbcrlf
	RetStr = RetStr & "1Lat: " & Match.submatches(2) & vbcrlf
	RetStr = RetStr & "1Lon: " & Match.submatches(3) & vbcrlf
	RetStr = RetStr & "2Lat: " & Match.submatches(4) & vbcrlf
	RetStr = RetStr & "2Lon: " & Match.submatches(5) & vbcrlf
Next

msgbox RetStr

```

以上。
Raspberry Piの再セットアップとffmpegのインストール

#Raspberry PIの再セットアップ

1. まずはRaspbianの再インストール
2. SSHは直下にsshフォルダを作るのでOK。これをしておけばディスプレイをつないでなくても、SSHで接続できる。
3. 有線LANをつなげて、SSH接続。本当は無線接続をしたかったが、どうもうまくいかなかった。できるはずなのだが・・・
4. sudo raspi-config　から　interfaces OptionでVNCを設定
5. ついでに、ホスト名も設定。
6. 再起動。
7. WindowsでVNCViewerで接続できるのを確認！

参考は、http://zonomasa.hatenablog.com/entry/raspberry_pi_vnc_ssh

#ffmpegのインストール
参考：https://signal-flag-z.blogspot.com/2016/09/rapberry-pi-3-h264omxffmpeg.html

まずはffmpegのソースをgitでダウンロード

```
cd /home/pi
git clone git://source.ffmpeg.org/ffmpeg.git
```
alsaライブラリをダウンロードしてコンパイル

```
cd /home/pi
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.6.tar.bz2
```

最新が1.1.6っぽいので、1.1.6に読み替え。

```
tar xjvf alsa-lib-1.1.6.tar.bz2
cd alsa-lib-1.1.6
./configure --prefix=/home/pi/ffmpeg
make
make install
```
ffplayもビルドするためにライブラリダウンロード

```
sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev
```
ffmpegのビルド

```
cd /home/pi/ffmpeg
./configure --enable-gpl --enable-nonfree --enable-mmal --enable-omx-rpi --enable-omx --extra-cflags="- 
I/home/pi/ffmpeg/include" --extra-ldflags="-L/home/pi/ffmpeg/lib" --extra-libs=-ldl
```
・・・の途中で、` ERROR: OMX_Core.h header not found. `とのこと。
ググってみる。
http://www.ffmpeg-archive.org/ERROR-OMX-Core-h-header-not-found-td4681495.html
https://github.com/legotheboss/YouTube-files/wiki/(RPi)-Compile-FFmpeg-with-the-OpenMAX-H.264-GPU-acceleration
を参考に、一つライブラリを追加。

```
sudo apt-get install libomxil-bellagio-dev -y
```
改めてffmpegをビルド。

うまくいった。H264_omxも確認。
じゃあ、

```
make -j4
sudo make install
```
とりあえずインストールできた。
Tableソートライブラリ (IE6以降対応)

jQuery不要

* [Table Sorting (3/4) (WebFX)](http://webfx.eae.net/dhtml/tablesort/demo.html)
* http://webfx.eae.net/dhtml/tablesort/tablesort.js
    * ライセンス: Apache2.0

## 使い方

```html
<script type="text/javascript" src="tablesort.js"></script>
```

```html
<!-- tableタグにonClickを追加 -->
<table onclick="sortColumn(event);">
<!-- theadの項目をクリックするとtbody内がソートされる。thは対応していない -->
<thead>
	<tr><td>...</td></tr>
	...
</thead>
<tbody>
	<tr>...</tr>
	...
</tbody>
</table>
```

## 並び替え時の5や6の表示を変更する

```diff:tablesort.js
 function initSortTable() {
        arrowUp = document.createElement("SPAN");
-       var tn = document.createTextNode("5");
+       var tn = document.createTextNode("↑");
        arrowUp.appendChild(tn);
        arrowUp.className = "arrow";

        arrowDown = document.createElement("SPAN");
-       var tn = document.createTextNode("6");
+       var tn = document.createTextNode("⇣");
        arrowDown.appendChild(tn);
        arrowDown.className = "arrow";
 }
```
Docker(docker-compose)でWordPress

DockerのなかでもWordPressは二つのコンテナを使用するので
docker-composeを使用します。

## Install

### Docker
Dockerは、公式で簡単に入れることができます。
しかしVagrantのCoreOS(Docker専用OS)もオススメです。
[Vagrant + CoreOS + Docker が今時の開発環境らしい。構築は、めちゃ簡単！](https://qiita.com/yusk24/items/18546abac1af4be44375)

### docker-compose
```bash
$ sudo mkdir -p /opt/bin
$ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /opt/bin/docker-compose
$ sudo chmod +x /opt/bin/docker-compose
```

## Settings
docker-composeは設定ファイルを書いて起動するだけです。
`$ vi docker-compose.yml`

```
version '2'
services: 
  web:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_PASSWORD: password
      WORDPRESS_DB_HOST: db
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
```
オプションでバックグラウンドで起動可能です。
`$ docker-compose up -d`
そのあとブラウザで[localhost:8080]を確認するだけです。
サービスの終了はdownです
`$ docker-compose down`
第47話 逆正接関数の加算

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第47話です。

```math
\arctan⁡\frac{1}{73}+\arctan\frac{1}{132}=\arctan\frac{1}{x}  ,x=47
```

arctan(アークタンジェント)に関する数式です。

日常で使う角度には2つあり、いわゆる90度が直角を表す分度法と、
坂道の勾配を表すパーセントとがあります。

例えば、2%の坂道といえば、100m進んだ時に2m高くなるような坂道で、
角度だと大体1.14度になります。

坂道をパーセントで表すのは、そっちのほうが直感的だからでしょう。
2%の坂道と4%の坂道とでは、4%のほうが大体2倍ぐらいきついです。

分度法の角度だとそうはいきません。
45度の坂道の2倍きついのが90度の坂道なのか？というとわかりますが、
90度は垂直ですから、2倍どころではないレベルできついです。

ですから、車を運転する立場であれば、
2％の坂は1％の坂に比べて2倍登りにくい、と説明するほうがわかりやすいわけです。
ちなみに、90度を%で表そうとすると無限大になります。

そして、このパーセントというのがtan(タンジェント)の値です。
tanが1というのは100mで100m上がる坂、つまり45度の坂で、
tanが2というのが100mで200m上がる坂、大体63度の坂になります。

arctanというのはその逆で、tanの逆関数です。
分度法→パーセントに直すのがtanなら、
パーセント→分度法に直すのがarctanです。

ただ、正確には、分度法というより弧度法です。
数学で使う角度は直角が90度ではなくπ/2とします。
1を約57度として、180度がπとなるように切りなおした角度が弧度法です。

詳細は省きますが、まぁ、こっちのほうがいろいろ計算しやすいのでそうしています。
　
冒頭の式は、73mで1m上る坂と132mで1m上る坂を足すと、
47mで１m上る坂の角度になる、という意味です。

具体的には以下の式で求めます。

```math
\arctan⁡ α+\arctan⁡ β=\arctan⁡\frac{α+β}{1-αβ}
```
NYのスタートアップでRubyエンジニアとして就職！

と思ったんですが、無理みたいでした。

先月中旬から今月初旬にかけて面接をしていました。
面接自体は３回あって、全て電話での面接です。

## 1st Round Interview
最初はCEOと今までの経歴についてと働き方についての質問をされました。
 
```
1. 10年後にどうなっていたいか？
2. チームを引っ張った経験
3. 長所、短所
 ```

日本で聞かれるのとほぼ同じ内容です。

## 2nd Round Interview
２回目の面接はCTOとでコーディングの知識について聞かれました。
Google Docsを共有しながらコーディングを実際に行いました。
Javaの知識とかRubyの知識を中心に聞かれましたが、なんとなくの知識しかなかったですが、なんとか答えました。

質問内容は、例えば

```
1. Singletonパターンを実装してみて(java)
2. Singletonパターンはどんな時に使うの？(java)
3. Rubyのincludeとextendについて
4. N+1 queries問題について
5. Rubyでマルチスレッド・マルチプロセスプログラミングできるの？
```

もっとアルゴリズム的な問題を出されるかと思っていて、そっちの練習ばかりをしていたこともあり、自分の印象としては50%くらいしか回答できませんでした。
そのため面接終了後、共有されていたGoogle Docsにうまく回答できなかった質問の答えを調べてまとめて起きました。
（みてくれるかわからないけど、やれることはやっておこうという目的で）

そしたらなんとか面接通過できました。

# 3rd Round Interview
最後の面接は共同創業者？の人と1回目の時と同じような内容の面接をしました。

```
1. 今まで直面したなかで一番大変だった技術的な問題とそれをどう乗り越えたか
2. チーム内で意見が食い違った時にどう対処するか
```

難なく終えた印象でした。
しかし、最後の最後に「すぐ働ける人が欲しいんだよね。いつから働ける？」と聞かれ、学校が終わる来年の5月以降ならという返事をしたところ、ちょっと難色を示されました。

# これから
返事は一週間以内にとのことでしたが、すでに二週間近くたってるけど、返事がこないのでまあダメだったんだろうなと思ってます。
ただ、ダメという返事をもらったわけじゃないので、メールでも出してみて交渉の余地が歩かないか探ってみようと思います。


次回は、留学きてしまったことに関する葛藤について書こうと思います。
ブートストラップサンプリング（Bootstrap Sampling）法とそのscikit-learnを用いた実行

#Bootstrap Samplingとは
母集団となるデータがあるときに，**母集団から重複を許してランダムに**いくらかデータを取り出して再標本化をする手法．

###具体例：
母集団を$X= \{x_1,x_2,...,x_{10} \}$とする．
1. 再標本化を行う回数と，再標本化されたサンプルのサンプルサイズを設定する（例では再標本化を3回，サンプルサイズを5としておく）
2. 母集団$X$から重複を許してランダムにサンプリングをする
例：
$X_1=x_1,x_3,x_3,x_6,x_9$
$X_2=x_2,x_2,x_2,x_3,x_7$
$X_3=x_2,x_4,x_5,x_8,x_8$

##機械学習におけるBootstrap sampling
**バギング(bagging)**と呼ばれるアンサンブル学習の手法では，まず母集団からBootstrap samplingによって複数のサンプルを抽出する．そしてそれを訓練データとすることで複数の予測モデルを生成し，それらの予測モデルを何らかの方法によって結合することで（多数決，平均，出力をメタ特徴量として新たな予測モデルの構築，etc...），予測精度の向上，過学習の回避が見込める．　
![bagging.png](https://qiita-image-store.s3.amazonaws.com/0/188403/9b648bcb-d01b-31ed-7a0d-882f6a7c1cfd.png)

#scikit-learnを用いたBootstrap
「Bootstrap sklearn」とかでググるとだいたい公式ドキュメントが一番上に出てきて`sklearn.cross_validation.Bootstrap`を使えと言ってくるが，`sklearn.cross_validation`は廃止される予定なので好ましくない．（私の環境ではそもそも`sklearn.cross_validation`のなかに`Bootstrap`が見つからずimportすらできなかった）
　ということで，その代わりに`sklearn.utils.resample`を使ってBootstrap samplingをしましょう．

```python:bootstrap.py
from sklearn.utils import resample
# [0,1,2,...,9]と[10,11,12,...,19]の生成
data_x = [i for i in range(10)]
data_y = [i+10 for i in range(10)]

# K:再標本化の回数 SIZE:再標本化されたもののサンプルサイズ
K = 10
SIZE = len(data_x)

# bootstrap sampling
for i in range(K):
    resampled_data_x, resampled_data_y = resample(data_x,data_y, 
                                                   n_samples = SIZE)
    print("------%d resample ------"% i)
    print(resampled_data_x)
    print(resampled_data_y)
```
```:output
------0 resample ------
[4, 6, 0, 9, 7, 5, 0, 5, 3, 3]
[14, 16, 10, 19, 17, 15, 10, 15, 13, 13]
------1 resample ------
[5, 2, 6, 4, 5, 1, 1, 3, 1, 1]
[15, 12, 16, 14, 15, 11, 11, 13, 11, 11]
------2 resample ------
[0, 3, 0, 1, 2, 1, 7, 7, 1, 3]
[10, 13, 10, 11, 12, 11, 17, 17, 11, 13]
------3 resample ------
[1, 8, 1, 0, 2, 8, 3, 8, 4, 0]
[11, 18, 11, 10, 12, 18, 13, 18, 14, 10]
------4 resample ------
[3, 1, 6, 7, 6, 6, 4, 3, 1, 1]
[13, 11, 16, 17, 16, 16, 14, 13, 11, 11]
------5 resample ------
[3, 4, 6, 6, 9, 7, 3, 1, 4, 3]
[13, 14, 16, 16, 19, 17, 13, 11, 14, 13]
------6 resample ------
[6, 7, 1, 3, 6, 4, 8, 9, 9, 9]
[16, 17, 11, 13, 16, 14, 18, 19, 19, 19]
------7 resample ------
[9, 8, 3, 2, 6, 2, 0, 9, 4, 1]
[19, 18, 13, 12, 16, 12, 10, 19, 14, 11]
------8 resample ------
[0, 9, 2, 7, 4, 6, 0, 6, 8, 8]
[10, 19, 12, 17, 14, 16, 10, 16, 18, 18]
------9 resample ------
[5, 9, 9, 1, 3, 7, 7, 3, 6, 3]
[15, 19, 19, 11, 13, 17, 17, 13, 16, 13]
```
`resample`メソッドには，再標本化されたサンプルのサンプルサイズを`n_samples`に渡してやれば良い．（デフォルトは入力のデータ長`len(array)`）
出力を確認すると，`data_x`と`data_y`が対応された状態で再標本化されており，重複が許されていることがわかる．

### 参考
scikit-learnの`resample`メソッドのドキュメント（https://scikit-learn.org/stable/modules/generated/sklearn.utils.resample.html ）
朱鷺の杜Wiki「バギング」（http://ibisforest.org/index.php?%E3%83%90%E3%82%AE%E3%83%B3%E3%82%B0 ）
NSTextAttachmentが解放されない

# NSTextAttachmentが解放されない

NSAttrinbutedStringにNSTextAttachmentを入れると、テキスト表示で画像を扱ったりすることができる。
しかし、このNSTextAttachmentは該当箇所の文字をバックスペースで消してもメモリ上に**残り続けてしまう。**

これは**Undo用のスタック**にNSAttributedStringが存在しているからである。
Ubuntu 18.04をインストールしたLet's note CF-NX2で輝度調節をする

Let's note CF-NX2にUbuntu18.04をインストールしたら、輝度調節ができなくて詰んだので、一晩丸々つかって、いろいろ試した。

LinuxMint 19でも動作確認済み
##手順1

/etc/default/grubを開いて、

```
GRUB_CMDLINE_LINUX="acpi_osi="
```
にして保存する。
その後、update-grubする。

##手順2

/usr/share/X11/xorg.conf.d/20-intel.confを作成し、以下のように入力し保存

```Section "Device"
        Identifier  "card0"
        Driver      "intel"
        Option      "Backlight"  "panasonic"
EndSection
```
再起動して、調節できるか確認
デスクトップLinuxが流行らなかった理由

# 初めに

私が初めて Linux に触れたのはバージョン 2.2 から 2.4 に切り替わる頃でした。当時は Windows 9x 全盛期で画一的なデスクトップ環境で飽き飽きしていた所に、自由にカスタマイズ出来るX11のデスクトップ環境に感動していたものでした。この頃の Linux は特に進化が激しくて、USBが使えるようになったりDVDの読み込みができるようになったりと、興味が絶えなかったことを覚えています

Linux を始め、それを取り巻くソフトウェアはオープンソースで自由に使えることの可能性に魅力を感じ、いつかは自分もそれに貢献したいと思ってたのです

それから20年程経過して、いつの間にかあの頃の情熱はすっかり冷めきってました

* 仕事が忙しくなった
* 結婚してライフスタイルが変化した

いや、多分そんなことではない。何故だろうと、考え込んで眠れなくなった時がありました

---

帰りの電車の中でこの記事を見つけました

なぜ“デスクトップLinux”は普及しなかったのか？
http://www.itmedia.co.jp/enterprise/articles/1811/19/news029.html

ちょうど自分も同じことを考えてました。この記事を見るまでは、なぜ流行らなかったのか理由を述べている記事は目にしなかったので、自分の単なる思い込みで、この思いを世の中に発信した所で何になるんだろうと悩んだままで、メモしたままお蔵入りになってました

# お断り

一応、本記事に述べることは私個人的な妄想も含まれ、事実に反する事もあるかもしれません。また、所属組織による見解も含まれていません。あまり本気に捉えず、あくまでポエムとして読み流して頂ければと思います。

# デスクトップLinuxが流行らなかった理由

よく言われている理由としては

* アプリの使い勝手がWindowsと変わってしまう
* プリンタなどの周辺機器が使えない
* UIの見た目が悪い

などと言われて、普段Windowsを使っていた一般ユーザーが試しに使って見たものの、思うような使い方ができなくて結局戻ってしまったことが挙げられています

個人的にはこれは本質ではないと思ってます。それであれば iOS や Android は流行らないはずで、Windowsスマホが消えるはずがありません。写真加工や動画編集、簡単な文書作成など昔はPCで行っていたことが iOS 、Androidで可能でアプリの使い勝手が変わったとしても、プロ用途でなければ大体使えてます。プリンタなどの周辺機器もスマホに対応したものが数多くあります。UIもAndroidバージョン2の頃はキザギザした見た目の悪いフォントで、いかにもオタク向けな印象だったと思います

## だからなぜ流行らなかったか

「ユーザーに寄り添うことができなかった」これに尽きると思います

オープンソースソフトウェア(OSS)が発展した理由として、誰もが自由に開発できる点があります。これは、かつての市販ソフトと同等な機能の物が手軽に使え、開発のスピードが一つの会社で作るよりも早くできるといった利点がある反面、出来上がったものが開発者視点の物になってしまいます

### 例: vim-jpの議論

vim がファイル末尾に改行文字を勝手に付けていることを最近知りました。検索してみると、同じ事で悩んでいた人がいて掲示板のやりとりを読んでみると、とあるコマンドを入れれば改行を入れないで保存できるとあるのですが、知りたいことは、 `他のエディタで普通にできることがなぜ実現できないのか?` ということでした

https://github.com/vim-jp/issues/issues/152

### 例: ubuntu の謎なエラー

ubuntu はデスクトップ環境が充実していて、とても使いやすいと思います。しかし、いつの間にか起動時に必ず謎なエラーが出るようになりました

![ubuntu謎なエラー.png](https://qiita-image-store.s3.amazonaws.com/0/61404/553665b4-1dff-7964-9a7a-fb683303d8a9.png)

![ubuntu謎なエラー2.png](https://qiita-image-store.s3.amazonaws.com/0/61404/22595a72-582b-5264-78c4-e234471f4a16.png)

こんなエラー出たら正直怖いです。何度再起動しても現れるんだけど、PC壊れてるの？問題って何を報告するの？個人情報抜かれるの？年賀状をワードで作るくらいのやっと使えるくらいの両親、兄弟には勧められません

---

* 今でもLinuxを使っている人 (少数派)
    * 変わりゆく環境に適応できている
    * vi や emacs を使いこなせる
* 使わなくなった人 (多数派)
    * 思うように使えないと感じた人

我々が当たり前だと思っている事でも、多くの人は知らないこと

* 「洗えるゆかた」が大ヒットしたらしいけど、服が洗えるのは当たり前
* 「ライザップ」はボクサーの減量トレーニングなので、痩せて当たり前

よく「ググレカス！」と言われますが、一般ユーザーには通用しないし、ドキュメント作っても読まれません。何かトラブルが起きて「コマンド入れて」とか「ログ見て」とか言われても苦痛なだけです。好きじゃないと勉強できないし、解析する気は起きません

ケータイショップの店員が Line や Facebook の設定など手厚いサポートをしていったからスマホユーザーが増えたなんてこともあるようです (根拠は知らないけど)

# OSSの意義

上の記事でも挙げられてましたが、結局は「開発者の作りたかった事」と「ユーザーが求めている事」とのギャップがあったことが流行らなかった理由になるでしょう。とはいえ、「OSSなんだから色んな文化があって良いと思う」のが個人的な考えです

ギャップが埋まればそれに越したことは無いと思いますが、多様な文化があるが故に難しいことだと思います

# 将来的な問題

とはいえ、この先もこのままで良いのか？となると心配な事があります

開発者の高齢化です

最近では、リーナス・トーバルズ氏の休養の話もあるように、OSS開発者の今後が気になる所です。メーリングリストでも訃報が流れたり、身近な所では大学時代の教授が定年になったりもしています

後継者がいないと、折角育ってきたOSSが無くなってしまいそうで、誰もメンテしないまま放置されていくのではないかと気がかりです

開発する人の中には、単に自分が作りたいからという理由でやっていることもあるかもしれませんが、やっぱり、利用者が増えないとモチベーション維持は難しいのではないでしょうか？自由に開発できる反面、続けることに対しての責任はない面もあります。だからこそ継続できる状況が大事だと思います

# 結局

結論は無くモヤっとした文章だと思います。だからお蔵入りだったのですが、こういった状況の中で、どうなればいいのか、自分は何したいのか答えがないままです

こんなの書いて、誰が読んでくれるんだろうって思いながら、結構な時間になってしまいました。最後まで読んでくれた人がいるならば貴重な時間を使って読んで頂きありがとうございます
zeit の ncc コマンドで node.js アプリを 1 ファイルにコンパイルしてみたメモ

`ncc` なるコマンドの存在を知ったので、ただ気になって、いじったメモ。

## Install

これで合っているのかはしらない。

```
git clone https://github.com/zeit/ncc.git
cd ncc
npm install
npm link
```

## Help

`ncc --help` でヘルプを確認

```
ncc <input-file> [opts]
  Options:
    -M, --no-minify       Skip output minification
    -o, --out [file]      Output file (defaults to stdout)
    -h, --help            Show help
```

## Usage

Node.js のアプリを用意する。

テストアプリのフォルダを用意して、その中で下記を実行。

```
npm init
npm install --save express
```

下記ファイル (index.js) を用意。express の [Hello World](https://expressjs.com/ja/starter/hello-world.html) コードを利用。

```
const express = require('express')
const app = express()

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(3000, () => console.log('Example app listening on port 3000!'))
```

`node index.js` を実行して、ブラウザで http://localhost:3000 へアクセスすると `Hello World` が表示されるはず。

次に、下記コマンドで、コンパイル する。

```
ncc index.js -o bundle.js
```

実行！

```
node bundle.js
```

`node bundle.js` で、package.json が無くたって、node_modules が無くたって、動く。必要なのは node の実行環境と bundle.js のみ。

## Impression

- 利用用途が分かっていないw
- 感触は良い。
- db コマンドで、未コンパイルとレイテンシ、スループットを比較したが、差は感じられなかった。読み込んでしまえば一緒か。
- そんなに大きな差では無いが、ファイルサイズが削減される。
- あと、ファイルをテキストエディタで開くと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201797/5853616b-fbd5-3b9b-c361-b8c5a7802a58.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201797/ee14bf4a-c21a-a7dd-1f45-9564cbd0f024.png)


以上
AWS Mediastore の Storage containers の items を一括で消し方

画面で一個ずつポチポチするのはだるい、なので

```
END_POINT_URL=https://<SOME_ID>.data.mediastore.<REGION>.amazonaws.com
CONTAINER_NAME=SOME_NAME

aws mediastore-data list-items --endpoint-url $END_POINT_URL --path $CONTAINER_NAME | \
jq '.Items[].Name' | \
xargs aws mediastore-data delete-object --endpoint-url $END_POINT_URL --path $CONTAINER_NAME/{}
```

jq で `'.Items[].Name'` を取り出しています。
DropboxのWebhookのurlをGoogle Cloud Functionsで作ったapiを使ってやってみる

## Google Cloud Functions
簡単に言うとGCP上で Javascriptで書いた関数を実行するサービスです。Nodeを使った書くことができます。

詳しくは下記のサイトなどをみてください。
[【GCP入門編・第14回】 Cloud Functions を使ってサーバレスアーキテクチャを体験しよう！](https://www.topgate.co.jp/gcp14-using-serverless-architecture-by-cloud-functions#cloud-functions)

## 準備

### Serverless Frameworkを使う
Serverless Frameworkを使うと簡単な感じでcloud functionsを使うことができるみたいで便利！

- [Google Cloud Functions を Serverless Framework で使う](https://qiita.com/suzukenz/items/a9811461056956ee1a3b)
- [Serverless Frameworkのインストールと初期設定](https://qiita.com/keitakn/items/879bb8c075db802906df)

#### Google Cloud Platform のサービスアカウントキーを作成しておこう
下記サイトをみて手順通りに勧めていけばアカウントキーを作成できると思います。

* [Google Cloud Platform のサービスアカウントキーを作成する](https://www.magellanic-clouds.com/blocks/guide/create-gcp-service-account-key/)


#### Serverless Framework注意点
* [Google - 認証情報 ](https://serverless.com/framework/docs/providers/google/guide/credentials/)


``serverless.yml``を用意する際に、特にこの部分を忘れないでください！

> Save the keyfile somewhere secure. We recommend making a folder in your root folder and putting it there. Like this, ~/.gcloud/keyfile.json. You can change the file name from keyfile to anything. Remember the path you saved it to.

保存したkeyfileを自分のローカルの任意の場所（ルートディレクトリなど）に置くことを推奨しています。
`~/.gcloud/keyfile.json`のように配置して、serverless.yml`内の`credentials: ~/.gcloud/keyfile.json`と記載しましょう。

##### Google Cloud Deployment Manager V2 APIは有効にしておきましょう。
`serverless deploy`で怒られたらエラーに書いてあるアドレスにとんでapiを有効にしましょう。

```
Error: Access Not Configured. Google Cloud Deployment Manager API has not been used in project ******* before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/deploymentmanager.googleapis.com/overview?project=******* then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
```

## DropboxのWebhookについて

公式の説明: ttps://www.dropbox.com/developers/reference/webhooks
個々のアプリを指定してwebhookを設定しよう https://www.dropbox.com/developers/apps


## challengeをsendでそのまま返す
返してあげないと認証うまく行ってってことでエラーになるためchallengeをそのままsendでお繰り返してあげるとうまくいきます。
### 例
```
export function test(req, res) {
  res.status(200).send(req.query.challenge);
}
```

### `req.body`には下記のようにデータが入っています
```
{
    "list_folder"：{
        "accounts"：[
            "dbid：AAH4f99T0taONIb-OurWxbNQ6ywGRopQngc"、
            ...
        ]
    }、
    "delta"：{
        "ユーザー"：[
            12345678、
            23456789、
            ...
        ]
    }
}
```


### 参考
* [Dropbox Webhook API を使う](https://tanaka0325.github.io/post/using_dropbox_webhook_api/)
* [Dropbox APIを使ってDropboxのフォルダを操作する（調査中）](https://qiita.com/TakamiChie/items/6b21652afa7018ae6b27#%E4%BB%A5%E9%99%8D%E3%81%AEwebhook%E3%82%92%E5%8F%97%E3%81%91%E3%82%8B)

少し調べたのをまとめました。
他にも色々調べたり実際にものができたら共有予定です。

実際にDropbox PaperのWebhookを使いたかったのですが。
Paperには対応していないのですかね。。
SwiftGenでNamespace配下のすべての画像を取得する

# 概要

[SwiftGen](https://github.com/SwiftGen/SwiftGen)で特定のNamespace配下の全画像を配列として取得したいケースが発生したので、その対応方法をまとめます。

例えば、以下の画像のように、「animal」や「number」というNamespace配下の全画像を取得します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113553/5a9b46f1-7fd9-3f4c-6225-fea002c8ab05.png)

# 取得方法

## swiftgen.ymlの修正
Namespaceを考慮せずに全画像を取得するためのパラメータ「allValues」を以下のように指定します。

```yaml
xcassets:
  inputs:
    - SwiftGenSample/Assets.xcassets
  outputs:
    - templateName: swift4
      params:
        allValues: true
      output: SwiftGenSample/SwiftGen-Assets.swift
```

上記のように設定することで、以下のようにNamespaceを考慮しない全画像を取得することができます。

```swift
Asset.allImages
```

## Namespace毎の全画像を取得する

Namespaceを指定した場合の画像のパス（name）は以下のようになっています。

```
animal/animal_mark01_buta
animal/animal_mark02_kuma
animal/animal_mark03_inu
```

また、SwiftGenは以下のように**Namespaceの最初の文字を大文字にした列挙型**を自動生成します。

```swift
  internal enum Number {

    internal static let numberDigtal0 = ImageAsset(name: "number/number_digtal0")
    internal static let numberDigtal1 = ImageAsset(name: "number/number_digtal1")
    internal static let numberDigtal2 = ImageAsset(name: "number/number_digtal2")
    internal static let numberDigtal3 = ImageAsset(name: "number/number_digtal3")
    internal static let numberDigtal4 = ImageAsset(name: "number/number_digtal4")
    internal static let numberDigtal5 = ImageAsset(name: "number/number_digtal5")
    internal static let numberDigtal6 = ImageAsset(name: "number/number_digtal6")
    internal static let numberDigtal7 = ImageAsset(name: "number/number_digtal7")
    internal static let numberDigtal8 = ImageAsset(name: "number/number_digtal8")
    internal static let numberDigtal9 = ImageAsset(name: "number/number_digtal9")
  }
```

上記の仕様から、画像のパス（name）と自動生成された列挙型を比較し、Namespaceが等しいか確認するメソッドを作成してみました。

```swift
extension String {
    /// 引数に指定した型のNamespaceを持つ文字列か判定する
    func hasNamespacePath(of assetType: Any) -> Bool {
        guard let namespace = self.split(separator: "/").first else { return false }
        return namespace.capitalized == String(describing: assetType.self)
    }
}
```

上記のメソッドを利用することで、以下のようにNamespace毎の全画像を取得することができます。

```swift
// 数字のImageAsset配列
let numberImages = Asset.allImages.filter { $0.name.hasNamespacePath(of: Asset.Number.self) }

// 動物のImageAsset配列
let animalImages = Asset.allImages.filter { $0.name.hasNamespacePath(of: Asset.Animal.self) }
```

## サンプルコード
https://github.com/shtnkgm/SwiftGenSample

## 補足
stencilテンプレートをカスタマイズし、enumをCaseIterableに準拠させるなどの方法も考えられますが、今回はテンプレートのパラメータを利用する方法で実装してみました。何か他に良い方法などございましたらコメントなどで教えていただけると幸いです。
KUSANAGIでのマルチサイト構築手順

[KUSANAGI for ConoHa](https://kusanagi.tokyo/cloud/kusanagi-for-conoha/)を使っての環境構築手順を記載します。

基本的には、[KUSANAGI for ConoHaでのWordpress環境構築〜サーバサイド〜](https://qiita.com/i35_267/items/d64dd45bf2615c8e3d21)に沿っていきます。

#### Overview
- 今回は、kusanagiを利用してマルチサイトを構築してみたいと思います。
- マルチサイトにも色々とありますが、今回は、マルチドメイン型と呼ばれる同一インスタンス(1台)で2つのドメインを構築する方法を記載していきます。処理が軽いサイトであればサーバのイニシャル / ランニングコストが抑えられます。
- 基本的にConohaとありますが、ここはAWSでもGCPでもなんでも大丈夫です。

#### kusanagiによる1台構築とマルチサイト構築に違うところ
実はとても簡単です。
普段の構築の流れは

- kusanagi初期設定 (kusanagi init)
- Wordpress導入 (kusanagi provision)
- https化 & http→httpsリダイレクト処理追加
- ファイルアップロードを可能にする。(FTP)
- SiteGuard WP PluginでのXMLRPC防御制御
- CloudFlareによるCDN導入

という段階を踏みますが、マルチサイトの場合`kusanagi provision`を2回するだけです。

上記記事で説明したコマンドが以下で

```bash:サイト1
$ kusanagi provision suite01
```

```bashサイト2
$ kusanagi provision suite02
```
という風にし、あとは対話式でFQDNやDBユーザーなどをそれぞれ入力していくだけです。
※注意するべき部分は、サイト01とサイト02は、共有DBはだめです。provisionが失敗します。DBユーザーとDB名,DBパスワードはそれぞれ別にしましょう。

すると`/home/kusanagi/`配下にそれぞれのサイトのディレクトリができてきます。

```
/home/kusanagi/
├── suite01
├── suite02
```

あとは、それぞれサイトの設定をしたら終わります！
ただし、WP以外のところは共通なので、nginxなどの設定は一緒です。