OmniAICreator/Qiita-1.07M huggingface dataset:
RustのFFI経由でlibyaraを使う。

# はじめに
RustでもYara rule使いたかった。それだけなんだよ。
Pythonだけゆうぐうされやがって！

※この記事の内容を使って書いたツール(2018年5月5日)
関連記事(Qiita) [RustとC(FFI)でテキスト及びバイナリgrepツールを作ってみた](https://qiita.com/segfo/items/ea0af9ffefc862a91152)

Rustで叩けると何が良いか。
http://yara.readthedocs.io/en/v3.6.3/index.html
パターン書いて、バイナリの中に存在する何か特定の文字列やバイト列を引っこ抜いてくるとか、パターンに一致したらランサムウェアとかスパイウェアとかそういう分類分けするとか・・・に使える。

で、一応C言語のAPIもあるらしいので、Windows上でライブラリをビルドできれば大勝利。
http://yara.readthedocs.io/en/v3.6.3/capi.html

# Windows上でビルドする。
VCは使わない。
（諸事情により、VS Communityは使わない方針で。使う方が圧倒的に楽ではある）

Windows 10上のBashを起動して下記のコマンド淡々と打ち込む。
（Windows 10 ver 1703(build 15063.540)のWSL）


```sh
apt-get update
apt-get install build-essential git
apt-get install gcc-multilib gcc-mingw-w64 autoconf automake libtool libjansson-dev libmagic-dev libssl-dev
git clone --depth=50 https://github.com/VirusTotal/yara.git VirusTotal/yara
export CONFIGFLAGS=--host=x86_64-w64-mingw32
export CC=gcc
cd VirusTotal/yara
./bootstrap.sh
unset CC
./configure $CONFIGFLAGS
make
```

ライブラリがビルドできたかどうか確認する

```sh
cd libyara/.libs
file libyara.a
```

ビルドできたのが確認できたら、Rustから叩いてみる。

```sh
cargo new yara --bin
cd yara
mkdir lib
# 以下の移動元パスは、libyara.aが有るパスを指定する。（コピペNG）
mv /path/to/libyara.a ./lib/
```

すると、ディレクトリの構成はこうなるはず。
yara
┣lib
┃┗libyara.a
┣src
┃┗main.rs　←　これを開く
┣Cargo.toml
┗.gitignore


main.rsを編集する

```rust

extern crate libc;

#[link(name = "yara",kind = "static")]
extern{
    pub fn yr_initialize()->libc::c_int;
    pub fn yr_finalize()->libc::c_int;
}

fn main() {
    unsafe{
        yr_initialize();
        yr_finalize();
    }
}
```

次に、ビルドスクリプトをトップディレクトリに追加して編集する。

yara
┣lib
┃┗libyara.a
┣src
┃┗main.rs
┣Cargo.toml
┣build.rs　←これ
┗.gitignore

やってることは、ライブラリの検索パスをコンパイラに標準出力経由で伝えてるだけ。

``` rust
fn main() {
    println!("cargo:rustc-link-search=native=.\\lib");
}
```

からの、cargo build　でビルドが通るはずなので、後は定義情報とかゴリゴリ書いたり
Rustでラッピングして、使いやすいクラスにしたり自由に料理する感じで。

おわり。
【2017年8月26日現在】組織アカウント(office365, AzureAD)でMicrosoftアカウントを作成する方法

## Microsoftアカウントと組織アカウントの重複問題について
Microsoftの認証基盤は２つあります。
1. Xboxやhotmailと結びついた主に個人向けのMicrosoftアカウント(Personal account)
2. office365やAzureActiveDirectory配下の組織アカウント(Work or school account)
の２つです。

これだけ聞くと、ふ～んという感じですがログインに関して問題がございます。
例えば、sample@contso.comという[Azureのポータル](https://portal.azure.com)にアクセスしてみましょう。
メールアドレスを入力すると以下のような選択肢が出ます。
<img width="300" alt="account1.png" src="https://qiita-image-store.s3.amazonaws.com/0/123580/4fa07418-b182-2272-da2c-980b7e80bb55.png">

sample@contso.comが「Microsoftアカウントなのか」「組織アカウントなのか？」について聞かれるわけですが、
Azureの認証にMicrosoftアカウントを利用している場合、組織アカウントを選んでもログイン後のAzureには何も表示されません。
逆にSharePoint(office365)に組織アカウントでアクセスしようとしても、個人アカウントを選んでは同じく何も表示されません。

## 現状
MicrosoftとしてはこのIDの重複問題への対策として、
組織アカウントでの新規のMicrosoftアカウントの作成は禁止してあります。

※参考
[Cleaning up the #AzureAD and Microsoft account overlap](https://blogs.technet.microsoft.com/enterprisemobility/2016/09/15/cleaning-up-the-azure-ad-and-microsoft-account-overlap/)
[#AzureAD と Microsoft アカウントの重複問題に対する取り組み](https://blogs.technet.microsoft.com/mssvrpmj/2016/09/30/azuread-%E3%81%A8-microsoft-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E9%87%8D%E8%A4%87%E5%95%8F%E9%A1%8C%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E5%8F%96%E3%82%8A%E7%B5%84%E3%81%BF/)

## 例外的な対策
通常では上の通りMicrosoftアカウントの作成時に組織アカウントのメールアドレスを指定すると
「無理です」と怒られます。

ただし、[Bing Ads](https://secure.azure.bingads.microsoft.com/Login.aspx)というサービスは
現状Microsoftアカウントの認証しか提供していないので例外的に組織アカウントでの作成が可能です。

以下のページにアクセスし、「Already use Bing Ads?」の箇所に組織アカウントのメールを入力することで作成可能です。
![account2.PNG](https://qiita-image-store.s3.amazonaws.com/0/123580/9fa60267-39f4-4d66-c1f7-3e0393579103.png)
「Bing Adsと紐付けますか？」というページ以降は入力しなくて大丈夫です。

## 注意事項
この方法もいつまで残るかわからないので、どうしても必要な場合のみ利用しましょう。
CMS GCで勘違いしていたこと

# CMS GCについて
はここが大変わかりやすく勉強になりました。
http://cco.hatenablog.jp/entry/2014/12/01/162240

## なにを勘違いしていたのか
上記のサイトを見たり、仕事で使っているサーバを参考にとりあえず以下の感じで、CMS GCを設定していました。

```
 -XX:+UseConcMarkSweepGC
 -XX:CMSInitiatingOccupancyFraction=40 
```
これでold領域が40%になればCMS GCが走ってくれる！

というのが勘違いでした。。。


## 実際は
上記の設定だと初めてold領域が40%に達したときのみCMS GCが走ります。。
その後は100%になるまでCMS GCが走らないことも。。

そうじゃなくて、毎回40%でCMS GCに動いて欲しい。。。><

## 解決策

`-XX:+UseCMSInitiatingOccupancyOnly`これを追加してあげればよかった！
これを設定するとCMS発生の起因を`CMSInitiatingOccupancyFraction`のみにするそうです。

無事毎回40%のタイミングでCMS GCが走るようになって幸せです。^^
docker専用OSになんでもインストールできるようにする



## 経緯
- localのmacに「docker-quickstart」を入れてdocker環境を作っていました
- docker専用osは、yumもapt-getもcurlもなく最小構成です
- 突然、何かをインストールしたくなるときがあるかと思いますので、記事にしました。

## 目標
- なんでもと言うのは書きすぎましたが、easy installやpython pipが入ればだいぶ楽になるのではないでしょうか。

## 環境
- docker-machine
- boot2docker(v?.?.?)

## pythonを入れる
```
$ tce-load -w -i python.tcz
```

## 次にeasy installを入れる
```
$ wget https://bootstrap.pypa.io/ez_setup.py
$ chmod 755 ./ez_setup.py
$ ./ez_setup.py
```

## pipを入れる
```
$ easy_install pip
```

## pip install awscli
```
$ pip install awscli
```

#### なんとまあ、awscliがインストールできたではありませんか！！！

## まとめ
- なんでもとは言いすぎましたが、aws-cliがインストールできました！！（何に使うかは不明です！！！）
CircleCI 2.0 でGithubにpushした時herokuにデプロイする


[ここ読めば](https://circleci.com/docs/2.0/deployment_integrations/)全部書いてる

※ githubとの連携は終わっている前提で話します

#Circle CIとherokuの接続
circle ciの Environment Variablesに
HEROKU_API_KEY　と HEROKU_LOGIN　を追加

API_KEYには

```bash
$ heroku auth:token
```
の結果を

LOGINにはherokuのemailを記入

##ssh keyの作成
ローカルでもどこでもいいので

```bash
$ ssh-keygen
```
でキーペアを作成

秘密鍵を
SSH Permissions
に追加
Hostname は

####git.heroku.com


登録した後に出てくる文字列をメモしておく


公開鍵を
https://dashboard.heroku.com/account
に登録

##Circle CI の設定ファイルを書く

プロジェクトのrootに.circleciディレクトリを作成

```.circleci/config.yml
version: 2

jobs:
  build:
    docker:
      - image:  circleci/php:7.1.8-browsers
    steps:
      - checkout
      - run:  wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
      - run:  bash .circleci/setup-heroku.sh
      - add_ssh_keys:
          fingerprints:
          - "<メモした文字列>"
      - deploy:
          name: heroku deploy
          command: |
              if [ "${CIRCLE_BRANCH}" == "master" ]; then
                  git push heroku master
              fi 
```


```setup-heroku.sh
#!/bin/bash
git remote add heroku https://git.heroku.com/<your-app-name>.git
wget https://cli-assets.heroku.com/branches/stable/heroku-linux-amd64.tar.gz
mkdir -p /usr/local/lib /usr/local/bin
tar -xvzf heroku-linux-amd64.tar.gz -C /usr/local/lib
ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku

cat > ~/.netrc << EOF
machine api.heroku.com
    login $HEROKU_LOGIN
    password $HEROKU_API_KEY
machine git.heroku.com
    login $HEROKU_LOGIN
    password $HEROKU_API_KEY
EOF

# Add heroku.com to the list of known hosts
ssh-keyscan -H heroku.com >> ~/.ssh/known_hosts
```
Amazon Linux にアタッチされている EBS rootボリュームサイズをオンラインで拡張する。

# はじめに
以前、[Amazon LinuxにアタッチされているEBSのボリュームサイズを拡張する。](http://qiita.com/kooohei/items/fdd37482e5878da3f4fd)を行いました。
ですが、実はこれだとrootボリュームの場合はうまくいきません。(Amazon Linux の場合だと再起動する必要があると思います。)
なので、今回はrootボリュームをオンライン(再起動しない)で拡張したいと思います。

# 事前確認
まずは現在のボリュームを確認しておきます。

```
$ lsblk 
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk 
└─xvda1 202:1    0  20G  0 part /
```

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         991M   56K  991M    1% /dev
tmpfs           1002M     0 1002M    0% /dev/shm
/dev/xvda1        20G  4.1G   16G   21% /
```

# ボリューム拡張

[AWSマネジメントコンソール](https://console.aws.amazon.com/)へログインします。

[EC2] > [インスタンス] から対象のインスタンスを選択し、[説明]タブに記載されているルートデバイスへ移動します。(初めからルートデバイスのボリュームがどれかわかっていたらそのままボリュームを選択してもOKです。)
![スクリーンショット 2017-08-25 23.06.19.png](https://qiita-image-store.s3.amazonaws.com/0/82090/63ea74e5-581b-f646-b1c1-ec0525751c67.png)

「アクション」 > 「ボリュームの変更」をクリックします。
![スクリーンショット 2017-08-25 23.15.33.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ce4dcdc2-021a-df78-45f9-b2aee79b2041.png)

「ボリュームの変更」でサイズを変更します。(今回は40へ変更)
![スクリーンショット 2017-08-25 23.15.56.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ba0d5a51-9d49-964e-0c27-bcc0f8eaf845.png)

確認で「はい」をクリック
![スクリーンショット 2017-08-25 23.16.12.png](https://qiita-image-store.s3.amazonaws.com/0/82090/afe9d1b2-d001-a526-183c-d970cdc4e0fb.png)

「ボリュームの変更リクエストが完了しました」と出るので「閉じる」をクリックします。
![スクリーンショット 2017-08-25 23.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/82090/880b50f7-ef61-c369-b3e9-12b27275792e.png)

しばらくするとサイズが20GiBから40GiBへ変わります。

サーバへ入って確認するとボリュームサイズが拡張されているのがわかります。

```bash:確認
$ lsblk 
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  40G  0 disk 
└─xvda1 202:1    0  20G  0 part /
```

ですがまだファイルシステムからは見えているのは 20G のままです。

```bash:確認
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         991M   56K  991M    1% /dev
tmpfs           1002M     0 1002M    0% /dev/shm
/dev/xvda1        20G  4.1G   16G   21% /
```

growpart と resize2fs で拡張します。

```bash:growpart
$ sudo growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=41938910,end=41943006 new: size=83881950,end=83886046
```

```bash:resize2fs
$ sudo resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/xvda1 is now 10485243 (4k) blocks long.
```

```bash:確認
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         991M   56K  991M    1% /dev
tmpfs           1002M     0 1002M    0% /dev/shm
/dev/xvda1        40G  4.1G   36G   11% /
```

無事に拡張されました。

# おわりに
これで急なボリューム拡張が必要になってもサーバを停止する必要がないのでとても便利ですね。
fluentdで特定のパターンにマッチする行だけをwarnログを出さずに取得する

fluentdの`in_tail`プラグインを使ってログファイルから特定のパターンにマッチする行だけ取得し、かつwarnログ（`[warn]: pattern not match: "xxxxx"`）を出力させない方法について学んだので紹介。

## 検証環境
- MacOS 10.12.6
- fluentd 0.12.40

## 前提条件
- ログはJSONやLTSVなどの構造化されたフォーマットで出力されていない
- `in_tail`の`format`オプションで正規表現を与えて取得する必要がある
- ログは様々なフォーマットで出力される可能性がある。例えば、スタックトレースのログが含まれる場合がある。

このようなログファイルを相手に、fluentdのwarnログを出さずに特定のパターンにマッチする行だけを取得していく。

## 雑にやるとwarnログが出る
まず、以下のように単純に取得したい行のパターンを`format`に与えるとどうなるか。

```
<source>
  @type tail
  tag sample.log
  path /Users/foo/work/fluentd/sample.log
  format /\[(?<level>[A-Z]+)\]\s+status_code=(?<status_code>[0-9]+)\s+message=(?<message>.+)/
</source>

<match sample.log>
  @type file
  path /Users/foo/work/fluentd/output.log
</match>
```

パターンにマッチするログを与えた場合は当然問題ない。

```
$ echo '[INFO] status_code=200 message=hello world' >> /Users/foo/work/fluentd/sample.log
```

しかし、パターンにマッチしない行を与えた場合は...

```
$ echo 'hello world' >> /Users/foo/work/fluentd/sample.log
```

以下のようなwarnログがfluentdのログに出力されてしまう

```
2017-08-25 23:43:08 +0900 [warn]: pattern not match: "hello world"
```

## どうするか？
`format`オプションに全ての行にマッチするパターンをor条件で与えた後、いずれかのキーが空の行を`filter_grep`で弾くことで実現できる。

```
<source>
  @type tail
  tag sample.log
  path /Users/hiroki/work/fluentd/sample.log
  # OR条件として「.*」を与えてすべての行をマッチさせる
  format /\[(?<level>[A-Z]+)\]\s+status_code=(?<status_code>[0-9]+)\s+message=(?<message>.+)|.*/
</source>

# status_codeが空の行を弾く
<filter sample.log>
  @type grep
  exclude1 status_code ^$
</filter>

<match sample.log>
  @type file
  path /Users/hiroki/work/fluentd/output.log
</match>
```

このように設定するとパターンにマッチしない行でもwarnログが出力されなくなり、パターンにマッチする行は期待通りに取得できる。めでたしめでたし。
jugemブログのRSSをPHPで表示させる


```php
<?php
//jugemブログのRSSをPHPで表示させる
$rss = simplexml_load_file('JUGEM RSSのURL');
foreach($rss as $item){
$date = date("Y/n/j", strtotime($item->issued));
if($item->title != ""){
echo <<< eof
<li>
<a href="{$item->link->attributes()->href}">{$item->title}</a>
<span style="font-size:10px;">{$date}</span>
</li>
eof;
}
}
?>
```
AndroidBootstrapのボタンをfindViewByIdするときの注意

AndroidBootstrapで作ったボタンをfindViewByIdする時は、

```java:ダメな例
Button btn = (Button) findViewById(R.id.button_1);
```

ではなく

```java:グッドな例
BootstrapButton btn = (BootstrapButton) findViewById(R.id.button_1);
```

とする。これのせいで小一時間潰した。
レガシーな現場のSEのための"エビデンス"を少しでも楽に取る方法 

レガシーな現場のSEがやる仕事に「エビデンス取得（検証・打鍵とも）」があると思います。
一考の余地ある成果物体型だと思いますが、そんな裁量のないSEのために使えるツール＆ショートカット集をまとめました。
（Windows7に全てデフォルトで入っています！ご安心を。）

# 目次
1. エビデンスとは
2. スクリーンショットの取得
3. エクセルの装飾
4. おすすめショートカット


# 1.エビデンスとは
広義にはテストエビデンスの略称であり、プログラム・仕様・機能が正しく実装されていることを証明するもの。
狭義には複数枚のスクリーンショットをExcelで整形したテストエビデンスを指す。

サンプルは[こちら](https://www.dropbox.com/s/5nzdxilwibqnm0b/Qitta_%E3%82%A8%E3%83%93%E3%83%87%E3%83%B3%E3%82%B9%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB_20170825.xlsx?dl=0)
![qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/96286/f413cbe2-bec1-5e5d-0fac-bdb235ff58b3.png)


保守性は低くても柔軟なフォーマットなので、画像数枚のものから数千行*数シートに及ぶ超大作までいろんなエビデンスがあります。
ITに詳しくないクライアントの方でも自身のPCでテスト結果を確認できるようにするための方法であると理解しています。


# 2. スクリーンショットの取得
エビデンスはスクリーンショット + Excel上での装飾で成り立っています。
まずはスクリーンショットを取得する上でのツールを紹介します。
※当然すべてWindows対応です。

* 現在一番上に表示されているウインドウのみスクリーンショットを取得する → Alt+PrtSc
* ウインドウの重ね順に関わらず、現在見えている範囲をトリミングする → Snipping Tool
  (Windowsキーを押して"Snipping Tool"で検索して下さい。)
→ いずれもスクリーンショットを取得後にCtrl + VでExcelに貼り付け可能です。
![snipping.png](https://qiita-image-store.s3.amazonaws.com/0/96286/4a3a520b-bc2a-7fa1-2393-c758703ceeb5.png)


※モーダルが表示されている状態で下の画面もエビデンスに収録したいときは、
一旦全画面をPrtscでスクショしてからExcel上でトリミングします。

# 3. エクセルの装飾
スクリーンショットを取得後、（ちまちましてどうでもいいことだと思いますが、）
注目すべき場所の装飾、コメントの追加、書類としてのフォーマットの整理をすると思います。

* Excel上でスクリーンショットをセルのマス目に沿ってぴったりと配置する → Altキーを押しながらマウスでドラッグ
* Excel上でスクリーンショットをトリミングする → 書式-トリミング (Alt+J-P-V-C)

* すでに配置しているオブジェクトをドラッグ&ドロップで別の場所に移動し、かつ元の場所のオブジェクトはそのままにする
  → Ctrlを押しながらドラッグ&ドロップ
* セル上の文字の装飾を、別のセルから設定だけパクってくる
  → 別のセルを普通にコピーしたのち、書式のみ貼り付け



# 4. おすすめショートカット
これまで紹介した操作を含め、いくつか便利な操作を紹介します。
これらの機能を1. クイックアクセスツールバーに登録し、 2.Altキーでアクセスする癖をつけておく。とちょっと作業が早くなると思います。
ちなみにWindowsではAltキーを押すとリボンのメニューがキーボードの英数字で起動できるようになります。そうした英数字を「キーチップ」と呼ぶようです。

キーチップが表示されている例
![toolbar.png](https://qiita-image-store.s3.amazonaws.com/0/96286/2a96546b-382c-f218-0d0f-48f397e8d2e1.png)


1. ドキュメントの場所: こうしたファイルをファイルサーバー上に置いてパスで共有する場合、
   ショートカット一発でファイルのパスが取得できると便利です。

2. 書式のみ貼り付け
   テキストのサイズやフォント、文字の背景色を他のセルからパクってくることができます。

3. 最前面へ移動
4. 最背面へ移動
   オブジェクト（枠線やフキダシ）で画像を装飾する都合上、オブジェクトが見えなくなってしまっては困ります。
   基本的にはオブジェクトを最前面に移動するか、画像を最背面に移動して全部が見えるようにすると楽です。

5. シートの行を挿入
6. シートの行を削除
7. シートの列を挿入
8. シートの列を削除
   スクショとスクショの間に別のスクショを挟むこともありがちです。
   そうした場合、まずShift+PageDownで範囲選択 → シートの行を挿入 で、丸々１ページ分の空白を挿入することができます。
   列の場合もしかり。

9. オブジェクトの選択
   複数あるオブジェクトをまとめて選択したいときに便利です。
   そんなことしなくても、オブジェクトをクリックすれば選択モードになるのではないかって？
   いえいえ。オブジェクトを全選択した状態で、逆に選択されたオブジェクトから特定のオブジェクトをまとめて選択範囲外にするときに効果ありなのです。
   
# まとめ
非生産的なことはショートカットでなんとかしましょう！SEの方は、出世したらこういうエビデンスは廃止してもっと効率良い成果物体系を考えて下さい。
react-notification-system をさわってみた

# 公式
公式サイト: http://igorprado.com/react-notification-system/
Github: https://github.com/igorprado/react-notification-system


# まえがき
さわってみました。
さわった感じは、結構動きがスイスイしてて良いな〜というのと（スイスイは[公式サイト](http://igorprado.com/react-notification-system/)で実感できる）、アラート・通知まわりで見た目や出現・消滅などをこだわりたい場合、簡単に実装できるな〜という感じ。

# サンプルコード
Github に書いてある公式のとはちょっと変えてます。

```js
import React from 'react'
import NotificationSystem from 'react-notification-system'


class Notification extends React.Component {
  constructor() {
    super()
    this.notificationSystem = React.createRef()
    this._addNotification = this._addNotification.bind(this)
  }

  _addNotification(event) {
    event.preventDefault()
    this.notificationSystem.addNotification({
      message: "やっほー通知だよ！",
      level: "success"
    })
  }

  render() {
    return (
      <div>
        <button onClick={this._addNotification}>通知する</button>
        <NotificationSystem ref={this.notificationSystem} />
      </div>
    )
  }
}
```
<br />

props 一覧はこんな感じ。
![プロパティの表](https://qiita-image-store.s3.amazonaws.com/0/130756/b34d1588-f019-5f50-eefd-6ebe02217ec1.png)
*[Github](https://github.com/igorprado/react-notification-system#creating-a-notification)より引用*


# 見た目まとめ
よく使いそうなものだけ。

## メッセージのみ (message)
![スクリーンショット 2017-08-25 22.55.22.png](https://qiita-image-store.s3.amazonaws.com/0/130756/7f454bed-6665-7318-7302-729921fc1ac1.png)
`message: "Notification Message"`

## タイトル付き (title)
![スクリーンショット 2017-08-25 22.54.37.png](https://qiita-image-store.s3.amazonaws.com/0/130756/de9b770f-0c02-139d-b7d4-d98262852d85.png)
`title: "Title"`

## 通知のタイプ (色) (level)
![スクリーンショット 2017-08-25 22.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/130756/bb61ab35-2111-bff3-89b8-91a7a34b96f5.png)
`level: "error"`

![スクリーンショット 2017-08-25 22.59.22.png](https://qiita-image-store.s3.amazonaws.com/0/130756/6185d67f-943d-b4ef-41f7-f2d5098de6a9.png)
`level: "warning"`

![スクリーンショット 2017-08-25 22.59.38.png](https://qiita-image-store.s3.amazonaws.com/0/130756/85dbd8cc-15cd-9812-e2c3-d3508f9e077c.png)
`level: "info"`

（緑色は`level: "success"`）

他の色にするのも `style` prop で指定できるみたい。

## アクションボタン付き (action)
![スクリーンショット 2017-08-25 22.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/130756/a2256ba4-f6c0-67cc-bec7-1c854f52717c.png)

```js:この例のコード
action: {
  label: 'Button',
  callback: function() {
    console.log('Notification button clicked!');
  }
}
```

## 中身をHTMLで書く
![スクリーンショット 2017-08-25 22.56.58.png](https://qiita-image-store.s3.amazonaws.com/0/130756/43e5e054-e858-574b-6a5e-b741755c48ee.png)

```js:この例のコード
children: (
  <div>
    <h2>Hello World</h2>
    <a href="#">Anchor</a>
  </div>
)
```

# あとは、
`autoDismiss: 10`で "10秒で消滅" とか決められたり（defaultは5秒）、
`position: "bc"`で通知の出現場所を "画面の中央上部(b->bottom, c->center)" にできたり（defaultは"tr"(top, right)）、
`dismissible: false`で "クリックしても消せない" ようにできたり（地味）、

する。


# あとがき
良い感じでした。
【Python】1日前のunixtimeを求める

# コード

```python:test.py
# -*- coding: utf-8 -*-

from datetime import datetime, timedelta

now = datetime.now()
n = now - timedelta(days=+1)
print(n)

m = n.timestamp()
print(m)
```

# 実行

```
2017-08-24 07:11:17.372524
1503583877.372524
```
foreachで表示した複数のリスト要素それぞれに対してイベントを設定する方法(bladeテンプレート使用)

以下の```to_room```をクリックすると```make_room```のフォームをsubmitする、という処理を書きたい。
全体がforeachで囲まれているため、単純にセレクタを指定しても全要素に対して適切にイベントを設定するのが難しそう。

```html
@foreach($friends as $friend)
  <div class="to_room">
     <form method="post" action="{{ url('/room') }}" class="make_room">
          <input type="hidden" name="id" value="{{$friend->id}}">
          <input type="submit" name="submit" value="メッセージを送る">
     </form>
  </div>
@endforeach
```

結論としては```each```を使って以下のように指定する

```javascript
//eachを使うことでそれぞれの要素に対してイベントを設定出来る
$(".to_room").each(function(){
	$(this).click(function(){
        //.childrenを使ってフォームを指定することでクリックした要素の子要素に当たるフォームのみsubmit出来る
		var form = $(this).children('.make_room').submit();
	});
});
```

注意するポイントとしては、
セレクタにidを指定せずclassを指定すること。
idを使った場合一番最初の要素のみにしかイベントが設定されなくなってしまう。


以上。
【PowerBIメモ】メジャーテーブルを作ろう！

DAXで計算した値を格納できる「メジャー」。
PowerBIユーザーのほとんどがお世話になっているはずです。

メジャーって何？って方は、まずこちらの公式チュートリアルをご参照ください。

[チュートリアル: Power BI Desktop で独自のメジャーを作成する](
https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-tutorial-create-measures/)

便利なメジャーですが、整理・管理は上手くできていますか？
たくさんのテーブルにたくさんのメジャーが乱立してしまい、四苦八苦している方もいるのではないでしょうか？

そこで、メジャーを体系的に管理するための「メジャーテーブル」の作り方をご紹介します。


#対象読者
PowerBIの初歩的なことが分かる方


#メジャーテーブルの作り方

まずはこんな状態からスタートします。

![図6.png](https://qiita-image-store.s3.amazonaws.com/0/165789/0c6e3251-2d94-7b9c-4992-0eb013b355a9.png)


複数のテーブルに複数のメジャーが転がっていて、ちょっと煩わしいと思ってしまいます。
できればメジャーは一か所に統合したい。

そんな方にメジャーテーブルは便利です。


###テーブルを作成

まずはリボンの「データの入力」から以下の図のように適当な数字を一つ入力したテーブルを作成します。

分かりやすくテーブル名はメジャーテーブルとでもしておきましょう。


![図1.png](https://qiita-image-store.s3.amazonaws.com/0/165789/ef8b1c1f-b5d1-90b8-6c04-83718afe1ca0.png)


###適当なメジャーをテーブル上に作る
ひとまず１個、メジャーをテーブル上で作成します。

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/165789/774d0200-9906-269c-5e42-138612bddfc5.png)


###既存のカラムを削除
適当な値を入れたカラム「列１」を削除しましょう。
一応、メジャーだけ格納されたテーブルとして機能していますが、アイコンなどは特に変わりません。
もう一工夫必要です。

![図3.png](https://qiita-image-store.s3.amazonaws.com/0/165789/0196da08-970f-4d07-9c4e-59ae800f4176.png)


###フィールドを閉じる
一度、フィールドを最小化します。

![図4.png](https://qiita-image-store.s3.amazonaws.com/0/165789/405a37a4-3acc-2a69-cc35-6de9d2fd54fc.png)

###フィールドを開く
最小化したのち、もう一度フィールドを表示してみましょう。

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/165789/8db342d9-e228-d141-b645-051f8326c0f6.png)

メジャーのアイコンになったテーブルのできあがり！
・・・まぁ、アイコンはおまけ程度ですが(笑)


#おわりに
メジャーテーブルを使うと、メジャー管理が非常にやりやすくなります。
テーブルが多数あり、複雑なメジャーを使えば使うほど、その効果を実感しやすくなります。
もちろん、複数のメジャーテーブルを作って管理したりすることもいいかもしれません。

ぜひお役立てください。
【メモ】CSSで長文の途中で切って途中で'...'を表示する方法(1行、複数行)

####①１行の場合

```css
p {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
```

####②複数行の場合(webkit)

```css
p {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
}
```

※複数行でIE,Firefox対応の書き方は下記記事参照。

(参考)
https://tech.recruit-mp.co.jp/front-end/tips-ellipsis/
Pythonのデータ型の小さなメモ

# 数

```python:test.python
# cat test.py
# -*- coding: utf-8 -*-

num = 10
print(num)
print(type(num))
```

```file:実行
10
<class 'int'>
```

# 文字列

```python:test.python
n = "kure"
print(n)
print(type(n))
```

```file:実行
kure
<class 'str'>
```

# リスト
Cの配列と同じ。添字は整数値。データを[]で囲むかlist(データ)でリストデータを作る。可変長。

```python:test.python
n = [1,2,3,4]
print(n)
print(type(n))

# 追加
print("追加")
n.append(5)
print(n)

# 挿入
print("挿入")
n.insert(2,'insert')
print(n)

# 削除
print("削除")
del n[0]
print(n)
```

```file:実行
[1, 2, 3, 4]
<class 'list'>
追加
[1, 2, 3, 4, 5]
挿入
[1, 2, 'insert', 3, 4, 5]
削除
[2, 'insert', 3, 4, 5]
```

## for

```python:test.py
n = [1,2,3,4]
for v in n:
        print(v)
```

```file:実行
1
2
3
4
```

# タプル
変更不可なリスト。データを()で囲むかtuple(データ)でタプルデータを作る。
ただし、空タプルは()。要素が一つのデータは(データ,)と最後にカンマを書く。カンマを書かないと単なる算術優先演算の括弧として扱われてしまう。
なお、カンマがあればタプルになり、()は書かなくてもよい。ただし、カンマの適用対象が不明確な場合は()で囲まなければならない。

```python:test.python
n = (1,2,3)
print(type(n))
print(n)
```

```file:実行
<class 'tuple'>
(1, 2, 3)
```

# ディクショナリ
連想配列。リストは整数値が要素、ディクショナリはキーが要素。キーは数値、文字列、タプル、が指定可能。
{} で囲むデータは、キー:値 という形で指定します。
{} で囲む以外にも dict(データ) でも作れます。
dict() は、キーと値のペアのシーケンス、あるいは変数名=値でデータを指定します。

```python:test.python
n = {'a':1, 'b':2, 'c': 3}
#for文
for v in n:
        print(v)

for k, v in n.items():
        print(k, v)
```

```file:実行
a
b
c
a 1
b 2
c 3
```
Ruby の簡単なエラーだけど分からなくなっちゃうエラー

エラーメッセージを検索してたどり着くことを期待した記事です。


自分も過去に苦しみました。解決したらいいねしてください。どれに詰まったのかをコメントしていただけると尚良しです

# no implicit conversion of Fixnum into String が sort { ... } で出現した時

sort のブロック内で大小の -1 / 0 / 1 を返すのに return を使っていないだろうか。Ruby では next を使おう

# no implicit conversion of Symbol into Integer が出たとき
```
"文字列"[:symbol]
```

という参照が起こるとこのエラーになる。 `:symbol` でアクセスしようとしているのが (おそらく Hash を期待して書いたコードだと思われるが、 Hash ではなく) String になっていないだろうか。調べてみよう
fetchAll()で取得した配列が空だった場合について

PHPでデータベースからデータを取得する際に、`fetchAll()`を利用して配列を作成して`foreach()`で取り出すということを行うことはよくやるかと思います。

SELECT文で一件のデータも取り出せなかった場合は空の配列が戻ってくるのですが、その挙動に少し戸惑ったので覚え書きとして書きたいと思います。

PHPの公式リファレンスにて`fetchAll()`の戻り値についての説明は以下の通りです。

>##返り値 
>PDOStatement::fetchAll() は、 結果セットに残っている全ての行を含む配列を返します。 この配列は、カラム値の配列もしくは各カラム名に対応するプロパティを持つオブジェクトとして各行を表します。 取得結果がゼロ件だった場合は空の配列を返し、 失敗した場合は FALSE を返します。

SELECT文でデータを取得する際にデータが一件も見つからなかった場合は、空の配列が戻ってくる、とのことなので、戻り値を受け取るときは配列型で受け取らなければならないと思い、以下のようにしてデータを受け取るようにしました。

```table_data_check.php
// テーブルからデータを取り出すSQL文
$sql = 'SELECT id FROM test_table;';
$sth = $dbh->prepare($sql);
$sth->execute();
$id_list[] = $sth->fetchAll();

//データが取得されたかどうかの確認
if(empty($id_list)){
    echo 'test_tableからidが取得できました';
}else{
    echo 'test_tableからidを取得できませんでした';
}
```
`empty()`を使って`fetchAll()`で取得した配列を検査しデータが取得できたときと、できなかったときで条件を分けることができるかと思っていましたが、実態は異なっていました。

`print_r()`で配列の中身を確認してみたら以下のようになっていました。

```
Array
(
    [0] => Array
        (
        )

)
```
空の配列を配列型で受け取っているため、空の配列が配列に格納されて、二次元配列のようになっていました。


>**上記の処理についてコメントをいただきました**
>そもそも、配列の受け取り方に根本的な間違いがありました。
>PHPでは変数名[]で代入することで配列の最後に要素を追加する、という>意味になるため、上記のような結果となっていたようです。


配列で受け取った場合は、以下のように、受け取った配列の0番目の配列の中身を確認すればよいでしょう。

```table_data_check.php
// テーブルからデータを取り出すSQL文
$sql = 'SELECT id FROM test_table;';
$sth = $dbh->prepare($sql);
$sth->execute();
$id_list[] = $sth->fetchAll();

//データが取得されたかどうかの確認
if(empty($id_list[0])){
    echo 'test_tableからidが取得できました';
}else{
    echo 'test_tableからidを取得できませんでした';
}
```

すごい初歩的なことですが、配列の中身を確認するまでずっと悩んでしまいました。

##参考
PDOStatement::fetchAll
http://php.net/manual/ja/pdostatement.fetchall.php
Webpackと外部のJavaScriptを連携する

Webpackを使えばCommonJSに準拠した形でJavaScriptどうしの依存関係を構築していけますが、状況によってはWebpack外との連携を取っていく必要が出てきます。

## Webpack管理外のライブラリを使う

プロジェクトを作った後からWebpackを導入したなどで、Webpack管理下のコードから、外部にあるライブラリを呼び出す必要があるかもしれません。

また、jQueryなどの著名なライブラリの場合、「そちらはWebpackのバンドルに含めず、既存のパブリックCDNを使いたい」というような状況も、発生するものです。

このような場合、いちおう「グローバルにある`jQuery`をそのまま使う」という選択肢も、ないわけではありません。ただ、それをやると、依存関係がはっきりしなくなって、Webpackの魅力が半減してしまいます。また、Node経由で入れるライブラリなどでは、きちんと`require('jquery')`としてある例があるので、これにも手当てが必要です。

正しい方法としては、`webpack.config.js`で指定する`externals`という設定があります（[リファレンス](https://webpack.js.org/configuration/externals/#externals)）。

```
externals: {
  jquery: 'jQuery'
}
```

のように書いておくと、`require('jquery')`で呼び出されるモジュールが、本来のjQueryではなく、単にグローバルの`jQuery`変数を参照するだけのものに差し替わります（もちろん、Webpackのバンドルより前にjQueryを読み込んでおかないと、正しく動作しません）。

## Webpackで入れたライブラリを外部から使う

逆に、Webpack管理のライブラリもそのままではグローバルに現れませんので、手段が必要となります。

もちろん自分で`window.foo = require('foo');`のようにしてもいいのですが、それを勝手に行ってくれるツールとしてexpose-loader（[GitHub](https://github.com/webpack-contrib/expose-loader)）があります。`require('expose-loader?変数名!ファイル')`のように書くだけで、`ファイル`を`require`したものをグローバルの`変数名`にしてくれます。

## CommonJSに則っていないライブラリをWebpack管理に入れる
jQueryプラグインなどでよくあるのですが、JavaScriptライブラリの中には、CommonJSとして他ライブラリとつなぐのではなく、

* グローバルにある`jQuery`をそのまま拾ってきて、そこにセットする[^1]
* `this`が`window`になっているのを前提に、直接変数を書き込む[^2]

ようなものがあります。このような場合、元のコードに手を加えることもできますが、imports-loader（[GitHub](https://github.com/webpack-contrib/imports-loader)）を使って処理することもできます。

前者の場合、`require('imports-loader?jQuery=jquery!./file')`のようにすれば、ファイル冒頭に`var jQuery=require('jquery');`を補って処理してくれるので、CommonJS経由のjQueryが入ります。

後者の場合は、`require('imports-loader?this=>window!./file')`とすることで、`this`に`window`を割り付けた状態で処理してくれるようになります。

## 脚注
[^1]: もっとも、`require`の結果として何かが取れる構造ではないので、CommonJSとjQueryプラグインはそんなに相性が良くないかもしれません。
[^2]: どういうわけか、npmにあるのにこういうスタイルになっているコードに遭遇してしまったこともあります。
iOS11からUITableViewにスペースができてしまう


UITbaleView(UIScroll Viewスクロールで更新などで使っていたスクロールビュー部分)がiOS11のシミュレーターではずれてしまう問題。


理由としては今まで、navigation bar分を手動で調整していた場合に、iOS11からはUIScrollViewContentInsetAdjustmentBehaviorが追加されて自動で（自動がデフォルトになったため）変更するようになったためである。

詳細は以下の通り
[UIScrollViewContentInsetAdjustmentBehavior](https://developer.apple.com/documentation/uikit/uiscrollviewcontentinsetadjustmentbehavior)

contentInset.top
や
tableView.contentInset
を検索して引っかかればその可能性大

なので、今までの実装を変えずにとりあえずデザイン崩れを直すには新しく追加されたUIScrollViewContentInsetAdjustmentBehaviorのデフォルトのautoからこの調整部分をnoneを以下のように変更するか独自に調整していた部分をiOS11以上では設定しないようにすればいい。


```Objective-C
if (@available(iOS 11.0, *)) {
     scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} 
```
XCodeのbeta版を入れた時にcarthageのライブラリがimportできない時の解決方法



XCodeのbeta版を入れて動作確認しようとしたが、うまくいかない時の対処法
（ライブラリ側がSwiftのバージョンに対応している前提）

Module compiled with Swift 3.1 cannot be imported in Swift 3.2

のように出てしまう。

carthageが古ければcarthageのアップデートをする。

```
brew update carthage
```


https://swift.swift-studying.com/entry/2016/11/06/115620


対処法1
以前のXCodeが残っている場合はメインのXCodeを切り替える

```bash
sudo xcode-select --switch ~/Downloads/Xcode-beta.app
```

対処法２
carthage updateする際に　--no-use-binaries　オプションをつける

```bash
carthage update --platform iOS --no-use-binaries
```


これで自分はうまくいきました。
[要約] GitHubに静的サイトを公開する手順


1: リポジトリを用意

* リポジトリを新規作成 https://github.com/new または 既存のリポジトリを使う
* リポジトリ名は、最終的なURLに含まれることを意識しておく
* ユーザ名のrepoにかぎらず、どの公開repoでも可能

2: `docs/` 以下に静的サイトを用意

* 例

```
mkdir docs
echo "hello page" > docs/index.html
git add .; git commit -m 'update'
git push origin master
```

3: GitHubで設定

* `https://github.com/${user}/${repo}/settings` を開く
* GitHub Pages について `master branch /docs folder` を `Save`

4: 完了

* `https://${user}.github.io/${repo}/` にホスティングされている

## Example
https://github.com/kuronat/home
→ https://kuronat.github.io/home/
Fuseboxはモジュールバンドラーデファクトの夢を見るか


wamw Friday I/O 4日目です。
[株式会社ワムウ](http://wamw.jp/)では、毎週金曜日は 興味がある事柄に取り組み、その成果を何らかの形でアウトプットする日 としています。


## Fusebox とは

[Fusebox](http://fuse-box.org/)


`gulp/grunt + browserify` や `webpack + *loader` のような所謂モジュールバンドラーです。

Fuseboxの特徴として

- とても強い
- クッソ速い
- めっちゃシンプル
- 柔軟性抜群

をうたっています(公式で)。


## 何ができるの？

プラグインの兼ね合いなどもありますが、その他モジュールバンドラーでできることは同じようにできます。
加えて、後発であるがゆえに近年のWebフロントエンド開発に必要な機能が **スマートに実装されていて、簡単に使える** という印象があります。

同じようなことをするにも `gulp` や `webpack` だと

- 設定ファイルが複雑で学習しづらい
- やりたいことに適したプラグインを探すところからはじまり、追加で学習コストがかかる
- `webpack-dev-server/client?http://localhost` ってなによ
- `hogerify` しすぎ。 `hogeloader` 使いすぎ。


## さあ使ってみよう

まずはもちろん。
`yarn` でも `npm` でもお好きなもので `fuse-box` をインストールします。
追加で使用するものも必要に応じて入れてください。

```sh
npm install fuse-box --save-dev
npm install typescript --save-dev
```

ちょっとしたコードを書きます。

```src/myclass.ts
export class MyClass {
  constructor(public name: string = 'My name is Taro!') {}
}
```

```src/index.ts
import { MyClass } from './myclass'

const me = new MyClass()
console.log(me)
```

そして `Fusebox` 用の設定ファイルを記述します。

```fuse.js
const { FuseBox } = require('fuse-box')
const fuse = FuseBox.init({
  homeDir: 'src',
  output: 'dist/$name.js',
})
fuse.bundle('app')
  .instructions('>index.ts')

fuse.run()

```

これで準備ができました。
あとはこの `fuse.js` を動かすだけです。

```
❯ node fuse

--------------------------
Bundle "app" 

    index.js
    myclass.js
└──  (2 files,  617 Bytes) default
size: 617 Bytes in 27ms
```

簡単ですね！


## ちょっとまて

ぱっとみでもなんとなくわかるものの、1行よくわからない点がありますね。
そうです。
`.instructions('>index.ts');`
こいつです。

動きを上から順に解説していくと、まずFuseboxの初期化

```
const fuse = FuseBox.init({});
```

この `FuseBox.init()` の返り値である `fuse` のことを FuseBox は **Producer** と呼んでいます。

この Producer を作成する際に渡したパラメータやプラグインがこの Producer を通して作られるバンドルの基本設定となります。

![スクリーンショット 2017-08-25 19.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/97820/741f2e35-b4c2-a16f-4408-442737ddd86e.png "スクリーンショット 2017-08-25 19.19.53.png")

出典: http://fuse-box.org/page/bundle#bundle


詳しい設定はこちら。
http://fuse-box.org/page/configuration


作成したProducerに対して `.bundle('app')` を行うと「app っていうバンドルを作ってね。そしてそれは……」という意味になります。

そしてお待ちかねの `.instructions('>index.ts')`

`.instrunctions` というメソッドを呼ぶと、基本的には「このファイルをバンドルしてね」となるのですが、FuseBoxはここに色々な算術記号を用いて少し複雑なことができます。

**ファイル読み込み時に自動で実行** したり **バンドル指定時にファイルを追加** したり **特定のファイルを除外** したり **vendorファイルだけをバンドル化** したり **globで指定** したりです。

ここで言う `.instructions('>index.ts')` の `>` は「ファイル名の前につけるとバンドル化したファイルを読み込み時に自動で実行」という意味の記号で、全体としてはFuseBox算術命令語で「`index.ts`をファイルを読み込んだ際に自動で実行する形でバンドル化してね」となります。

`>` の他にも色々な記号や書式があるので、詳しいことは下記公式ドキュメントを確認してください。

http://fuse-box.org/page/bundle#arithmetic-symbols



## 終わりに

本当に簡単な設定だけの説明となったので、詳しく知りたい方は[公式ドキュメント](http://fuse-box.org/)や[サンプル](http://fuse-box.org/page/examples-and-seeds)を見てみてください。

いつもやっている通り

- サーバ建ててwatch
- SCSSビルドしてコンポーネントに埋め込み
- HMRで幸せ
- タスクランナー走らせてあれやこれや

なんてことも、もちろんできます。

次回はもう少し踏み込んだところを解説しようと思います。
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第一章 知識をかみ砕く2

# モブモデリングのすすめ
> 知識の噛み砕きは独りで行う作業ではない。開発者とドメインエキスパートからなるチームが共同して行うもので、たいていは開発者が率いる。（第一部 第一章より)

ポイントは２つ。
## 1. チームでやる

開発者とドメインエキスパートからなるチームで行う。メンバー全員で行う。
> メンバ全員がモデルを一緒に噛み砕くことで変化する。（第一部 第一章より)

今関わっているプロジェクトでは、モデルは（特に新規で作る場合)メンバー全員が集まって作っています。

効率が悪いと思うかもしれない。
誰かが作って後からレビューすればいいかもしれない。

これはやってみないと良さがわからないかもしれないです。

以下、全員でやってみた感想です。

>
- 複雑なドメインであるほど集まって議論する方が深いモデルになっていくのがわかります。（白熱しすぎることもあります・・・><;)
- 全員がドメインに詳しくなります。
- 日本人にとっては英語への変換がある。みんなで議論することでしっくりくる言葉が思い浮かびます。逆にしっくりこない言葉も浮き彫りになります。
- ビジネスにおいて重要な箇所や、複雑な箇所が自ずと浮き彫りになる。
- **普段の会話が本当にモデルの言葉を使うように**なります。

全員でモデルを作る作業を自分で勝手に**モブモデリング**と呼んでいます。

この辺り、色々伝えたいことがあるので別途記事でまとめたいと思います。

## 2. 開発者が主導する

ドメインエキスパートから一方的に情報を貰うだけでは、深いモデルになりません。
開発者側が積極的に関わることで、お互いに学びが生まれてモデルは良いものになっていくのだと思います。

特に間にマネージャーや調整役が入ってしまうと、開発者側から質問する機会はあれど、お互い一方通行で深いモデルに関する議論がされていかないです。

開発者が自ら主導することで、その辺りを防止できます。


全員で、開発者が主導し、学びながら深いモデルを追求する。
[クイズ]javascriptと仲良くなるための一歩　第４０話「配列追加」

#問題

```js
var arr = [0,1,2];
arr.x = 'X';
Object.keys        //=> ["0", "1", "2", "x"]
Object.values(arr) //=> [0, 1, 2, "X"]
arr[x] //=> ?
arr.length //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```js
var arr = [0,1,2];
arr.x = 'X';
Object.keys        //=> ["0", "1", "2", "x"]
Object.values(arr) //=> [0, 1, 2, "X"]
arr[x] //=> undefined
arr.length //=> 3

//ちなみに
arr.x //=> X
arr[3] //=> undefined
```
ALIENWARE 15 スプレマシー VRでDisplayPortから映像が出なくなったときの対処方法

## 問題の発生状況
[ALIENWARE 15 スプレマシー VR](http://www.dell.com/jp/p/alienware-15-laptop/pd?oc=caaaw15404jp&model_id=alienware-15-laptop)で、NVIDIAのドライバーを385.41  WHQL(2017/8/25時点の最新版)に更新したところ、ディスプレイポートにモニターを接続した途端、本体のモニターも接続先のモニターも信号が出力されなくなるという問題が発生しました。
そのあと、ドライバーを再インストールしたり、再起動をしたりしてみても状況は改善されませんでした。
## 対処方法
NVIDIAの[ドライバーダウンロードページ](http://www.nvidia.co.jp/Download/Find.aspx?lang=jp)から古いドライバー、具体的にはバージョン **384.94** をダウンロードしてインストールしたところ、問題なく動作するようになりました。
## 教訓
問題なく動作しているときには、ドライバーを更新前に、その問題のないバージョンのインストーラーをダウンロードしておいてから更新すること。さもないと良好な状態に戻れなくなる場合もあるかも。
[クイズ]javascriptと仲良くなるための一歩　第３９話「配列の長さ」

#問題

```js
var arr = [0,1,2]
arr.length = 2
arr[2]         //=> ?
arr.length     //=> ?
arr.length = 3
arr[2]         //=> ?
arr.length     //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```js
var arr = [0,1,2]
arr.length = 2
arr[2]         //=> undefined
arr.length     //=> 2
arr.length = 3
arr[2]         //=> undefined
arr.length     //=> 3
```
MSP430 > JTAG > TESTピン > shared JTAGモード

```txt:動作環境
MSP430
```

TI(Texas Instruments)が販売してきたパラレルポート接続デバッガの販売は終了している。
それと同等機能のデバッガについてはトラ技の2007年1月号に掲載されていた。

その中で、TESTピンに対する処理が書かれている。

TESTピンは全てのMSP430においてあるというわけではないようだ。

[How to determine if selected MSP430 has shared JTAG pins](https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/230457)
> Shared JTAG means simply and exactly shared with other functions, e.g. GPIO or other peripherals.
>
MSP430F5419A has a shared JTAG (with port J, that is named after JTAG).
...

MSP430F5419の場合は
http://www.ti.com/lit/ds/symlink/msp430f5419a.pdf
のp13あたりに以下のような記載がある。

|  |  |
|:-:|:-:|
| PJ.0/TDO | General purpose digigal I/O  |
|   | JTAG test data output port  |

上記のようにGPIOとしてのPJ.0とTDOが「shared」になっている。

一方で、他の某MSP430の場合、TDOやTDIはGPIOとは「shared」になっておらず、TESTピンはない。

TESTピンがないMSP430に接続するデバッガの場合は、TESTピン関連の回路は省略して良いと考えている。


### 関連ページ

[MSP430用のJTAGツールを作ろうかな](http://nahitafu.cocolog-nifty.com/nahitafu/2006/12/msp430jtag_c675.html)
[MSP430 書き込み器を作ってＬチカまで](https://blogs.yahoo.co.jp/jf1vrr_station/25479700.html)
[Olimex MSP430-JTAG](https://www.olimex.com/Products/MSP430/JTAG/MSP430-JTAG/) - 回路図がある
Laravel 5.4 + VueJS Hot Reloadについて

Laravel5.4から、webpack-dev-serverによるhot reloadが使えます。

## How to

まずは、artisanコマンドでPHPが動くサーバーを立ち上げます。

```
$ php artisan serve

# http://localhost:8000/
```

次に、npm scriptでwebpack-dev-serverを立ち上げます

```
$ npm run hot

# http://localhost:8080/
```

index.blade.phpに、webpack-dev-serverがコンパイルしたapp.jsを読み込ませるようにします。

```index.blade.php
...

    <script src="http://localhost:8080/js/app.js"></script>
    </body>
</html>
```

これだと、deployした時に困るので、mixを使います。

```index.blade.php
...

    <script src="{{ mix('js/app.js') }}"></script>
    </body>
</html>
```

これでリロードしなくても、VueJSの更新を終えます。

### 参考
https://laracasts.com/discuss/channels/vue/simple-vue-hot-reload-with-laravel-54-and-mix
make_sockのエラーせいで、apacheを起動する方法

下記のエラーが発生した際に、apacheが起動できません。
```(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
```

対応方法

```bash
   $ fuser -k -n tcp 80
```

```
  $ fuser  --help
  ...
Show which processes use the named files, sockets, or filesystems.

  ...
  -k,--kill             kill processes accessing the named file
  ....
  -n,--namespace SPACE  search in this name space (file, udp, or tcp)
  ....

```
Vue.js を使って h1 タグの内容をもとにページ内リンクのリストを作る方法

一枚ペラのページを作るときに、ページ内の目次を作りたいという場合、セクションごとに ID をふるのはいいとして、それを手書きでリスト化するのは手間もかかるし、ミスのもとになります。

そんなときに Vue.js を使うとリストの作成、更新を自動化できて便利です。

完成イメージは下記のような感じです。

![ページ内リンクのリスト](https://dl.dropbox.com/s/krzj9mdhwcurrfm/%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88-Vue.js.png?dl=0)

Vue.js のテンプレートを含んだ HTML はこのようになります。

```html
<ul class="menu">
  <li v-for="title in titles">
    <a v-bind:href="'#'+title.href">{{ title.title }}</a>
  </li>
</ul>
<article>
  <header>
    <h1 id="first" class="add-to-list">First article</h1>
  </header>
  <section>
    <p>I have a pen.</p>
  </section>
</article>

<article>
  <header>
    <h1 id="second" class="add-to-list" alt-title="Second Section">Second article</h1>
  </header>
  <section>
    <p>I have a apple.</p>
  </section>
</article>

<article>
  <header>
    <h1 id="third" class="add-to-list">Third article</h1>
  </header>
  <section>
    <p>I have a pen.</p>
  </section>
</article>

<article>
  <header>
    <h1 id="fourth" class="add-to-list">Fourth article</h1>
  </header>
  <section>
    <p>I have a pineapple.</p>
  </section>
</article>
```

JavaScript のコードはこちら

```js
var titles = document.getElementsByClassName('add-to-list');
var titleTextArray = [];
var title;

for (var i=0; i<titles.length; i += 1) {
  title = titles[i];
  titleTextArray.push({
    title: title.hasAttribute('alt-title') ? title.getAttribute('alt-title') : title.innerText,
    href: title.id
  });
}

var vm = new Vue({
  el: '.menu',
  data: {
    titles: titleTextArray
  }
});
```
HTML 要素の class でリストに掲載する h1 タグを指定していますがもちろん、タグは h1 以外でも使えます。

alt-title という属性は h1 タグの内容とは違う文字列をリストに表示する場合に使います。

タイトルのリストを作るとき、alt-title という属性を持っている場合にはその値を title としてセットします。

これで、ページ内にセクションを追加するたびにリストを書き換える必要がなくなりますね。

ほんのちょっとしたことなので、わざわざ Framework などを使うのはどうかという考えになるかもしれませんが、作業量や間違いを減らす効果を考えると十分に導入の動機になるのではないでしょうか。

使用しているのは Vue.js 2.3.4 です。

Vue.js のウェブサイトはこちら ([Vue\.js](https://jp.vuejs.org/))

上記スクリプトのデモ。

<p data-height="265" data-theme-id="0" data-slug-hash="prZGMm" data-default-tab="html,result" data-user="shingorow" data-embed-version="2" data-pen-title="prZGMm" class="codepen">See the Pen <a href="https://codepen.io/shingorow/pen/prZGMm/">prZGMm</a> by Shingo Matsui (<a href="https://codepen.io/shingorow">@shingorow</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
【プログラマーのための統計学】ベイズの定理

## 目次
[プログラマーのための統計学 - 目次](http://qiita.com/Esfahan/items/bd9e52837bbaeb168b9f)

## 前提
事前に以下の記事を読むことをおすすめします。

- [事象とは](http://qiita.com/Esfahan/items/8cf3cf819d57e54ef970)
- [条件付き確率と乗法定理](http://qiita.com/Esfahan/items/4b410cebe0ebdce420fa)

## ベイズの定理
事象Aが起こるという条件のもと、i種類の事象Bが起こる場合の条件付確率は以下で求められます。
K種類の事象Bは、`B_1, B_2, B_3・・・B_i` というように定義し、お互いは排反とします。


事象Aが起こるという条件のもと事象`Bi`が起こる条件付確率は、以下の式で求められます。

```math
P(B_i|A) = \frac{P(A∩B_i)}{P(A)}
```

`P(A∩B_i)`の部分に、
[乗法定理](http://qiita.com/Esfahan/items/4b410cebe0ebdce420fa#%E4%B9%97%E6%B3%95%E5%AE%9A%E7%90%86) (`P(A∩B)=P(A)×P(A|B)`)を使って、`P(A)×P(A|B)` を代入します。
すると、以下の式に置き換えられます。


```math
P(B_i|A) = \frac{P(B_i) \cdot P(A|B_i)}{P(A)}
```

これがベイズの定理です。
それぞれの変数は、以下のような意味になります。

| 変数 | 説明 |
| --- | --- |
| P(A) | A が起きる確率 |
| P(B) | B が起きる確率（事前確率） |
| P(A｜B) | B の後でA が起きる確率（条件付き確率、尤度） |
| P(B｜A) | A の後でB が起きる確率（条件付き確率、事後確率） |


## ベイズの定理の証明
詳しくは、こちらの[ベイズの定理の証明](http://kenyu.red/archives/3434.html)を参照していただきたいのですが、

> B の後で A が起きる確率（条件付き確率）× Bが起きる確率は、
> A の後で B が起きる確率（条件付き確率）× Aが起きる確率と同じ。

つまり、

```math
P(B_i|A) \cdot P(A) = P(A|B_i) \cdot P(B_i)
```

ということになります。
これの両辺を`P(A)`で割ると、以下の形になります。

```math
P(B_i|A) = \frac{P(B_i) \cdot P(A|B_i)}{P(A)}
```

## ベイズの定理を展開
また、ベイズの定理は、このような形に展開して使われることも多いです。

```math
P(B_i|A) = \frac{P(B_i)\cdot P(A|B_i)}{\sum_{j=1}^{k}P(B_j)\cdot P(A|B_j)} 
```

## 参考
- [ベイズの定理](https://bellcurve.jp/statistics/course/6444.html)
- [ベイズの定理の証明](http://kenyu.red/archives/3434.html)
コーヒー豆の数理

# はじめに

だいぶ前だが、職場でコーヒーミルが話題になった。コーヒー豆を挽いた時、粒が揃っているほうが良い、というのはよく聞く話だが、実際の豆のサイズ分布はどうなってるんだろう？ちゃんとある平均サイズの周りにガウス分布しているんだろうか？　プロペラ式はよくないと言われるが、実際にどうなんだろう？

というわけで、理想的な条件で考えてみる。

# 近似

プロペラ式のコーヒーミルを理想化して考える。簡単のため、以下のような理想的な条件を考える。

* 豆を一次元とする
* 豆の大きさ(長さ)に比例してカッターがぶつかる豆が選ばれる
* カッターが豆にあたったら、その場所でスパッと二つに切れる
* カッターが豆にあたる場所は一様分布とする

相当、荒っぽい近似だが、この作業を続けていった時に、豆はどのようなサイズ分布になるか、という問題である。ここまで見た瞬間に答えが分かった人は、この先を読む必要は全くない。それ以上の情報は今後出てこないから。

# 数値計算

問題を見た瞬間に分布が思い浮かばなかった人(俺)は、数値計算することにしよう。ナイーブに実装するなら、

1. (0,1)の線分を用意する
2. 乱数により、線分の一箇所をランダムに選ぶ
3. その場所を二つに切る
4. 乱数で切る線分を長さに比例して選び、選ばれた線分の位置をランダムに選ぶ
5. その場所を二つに切る


![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/f5ee46cc-1c39-12c4-4d81-107d37f74325.png)

という処理を繰り返せばよろしい。しかし、この方法は無駄である。線分を長さに比例して選び、そこを切る、というプロセスは、わざわざ線分を選ぶ必要は無い。ただ(0,1)の乱数を発生させて、その場所をぶった切れば、長さに比例して線分を選んでさらにその線分を切ることと等価である。

従って、

1. (0,1)の線分を用意する
2. ひたすら乱数を発生させて線分をぶった切る
3. 線分の長さ分布が求める分布

と問題が簡略化された。ここまで見た瞬間に答えが分かった人は、この先を読む必要は全くない。それ以上の(略

# スクリプト

というわけでスクリプトを書いてみよう。分布を見る時には生分布ではなく[累積分布関数を使う](http://qiita.com/kaityo256/items/690a463b6b865da80de6)のが便利である。結局、上記の分布はソート二回で求めることができる。

```rb:coffee.rb
a = Array.new(1000) do
  rand
end
a.sort!
b = Array.new(a.size-1) do |i|
  a[i+1] - a[i]
end
b.sort!
s = b.size
s.times do |i|
  puts "#{b[i]} #{i.to_f/s}"
end
```

この実行結果、すなわちコーヒー豆のサイズの累積分布関数はこうなる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/4044d895-4025-b59f-bec4-b204dcc5e591.png)

さすがにこれみて気がついた。ランダムにイベントを発生させた時のイベント間の時間の分布だから、これは指数分布ですね。

# まとめ

カッターが豆のサイズに比例してランダムにぶちあたり、あたった豆はスパっと二つに切れる理想的なプロペラ式のコーヒーミルを考えた。その結果、非常に細かい豆多数と、大きな豆が少数という、コーヒーをいれるには最悪のサイズ分布となった[^1]。すなわち、理想的なプロペラ式コーヒーミルでは理想的なコーヒーをいれることはできない(ドヤ)。

[^1]: もともと計算の動機は、職場の人が「プロペラ式だとうまく粒径が揃わない気がする」と言ったのを確認するためだったので、この人の直感は正しかったことがわかった。
Pythonの日付型をRFC822フォーマットに変換する


Pythonの基本となる日付型はISO8601で以下のようなフォーマットとなっている

```
2017-08-25 18:57:07.602290
```

対するRFC822は以下のようなフォーマット

```
Fri, 25 Aug 2017 09:57:07 -0000
```

PythonでISO8601をRFC822に変換する方法は以下のとおり

```python:
import datetime
import time
from email import utils

now = datetime.datetime.now()
# 2017-08-25 18:57:07.602290

nowtuple = now.timetuple()
# time.struct_time(tm_year=2017, tm_mon=8, tm_mday=25, tm_hour=18, tm_min=57, tm_sec=7, tm_wday=4, tm_yday=237, tm_isdst=-1)

nowtimestamp = time.mktime(nowtuple)
# 1503655027.0

rfc822 = utils.formatdate(nowtimestamp)

print(rfc822)
# Fri, 25 Aug 2017 09:57:07 -0000
```
Haskell入門者LT会「ゲスト講演」資料

Haskellでソケットプログラミング
============================

はじめに
-------

これは、[Haskell入門者LT会](https://shinjukuhs.connpass.com/event/58936/)のゲスト講演の資料です。[Haskell入門ハンズオン](https://shinjukuhs.connpass.com/event/58224/)のときに、事前資料として公開しておいた部分の復習について、「わかりやすかった」と評判がよかったので、今回も事前に公開することにしました。

何をするか
---------

Webページを開くとき、ブラウザはサーバにHTTP層でGETリクエストを送っている。そのHTTP層は、TCP層のうえで動きます。そのTCP層の直上で、いろいろと試してみる。

あまり「Haskellならでは」といったコードでもなく、Haskellについての知識が増えるわけでもないのですが、今回は「おもしろければそれでいい」ということで。

サンプルコードなど
---------------

サンプルコードを用意した。また、できるだけ統一された環境とするために、学習用環境も用意した。gitを使えるかたは以下のようにする。

```shell-session
% git clone https://github.com/YoshikuniJujo/haskell-nyumon-handson
```

gitを使えないかたは、つぎのアドレスから圧縮ファイルを入手して、展開する。必要に応じてディレクトリ名を変更する。

[https://git.io/vQIKd](https://git.io/vQIKd)

できたディレクトリに移動しておく。

```shell-session
% cd haskell-nyumon-handson/beginnerLt/
```

まずはファイル入出力
----------------

```shell-session
% cat hello.txt
Hello, world!
% stack ghci
```

```hs
> :module System.IO
> h <- openFile "hello.txt" ReadMode
> hGetLine h
"Hello, world!"
> hClose h
```

```hs
> h <- openFile "foo.txt" WriteMode
> hPutStrLn h "bar"
> hClose h
> :quit
```

```shell-session
% cat foo.txt
bar
```

Webページに接続
-------------

つぎは、Webページに接続してみる。

```shell-session
% stack ghci --package network
```

```hs
> :module Network
> :module + System.IO
> h <- connectTo "skami.iocikun.jp" $ PortNumber 80
> hPutStrLn h "GET / HTTP/1.1"
> hPutStrLn h ""
> hGetLine h
"HTTP/1.1 200 OK\r"
```

ファイルの入出力と、おなじように書ける。
HTTPのGETリクエストを出したら、HTTP 200 OKがかえってくる。

サーバを立てる
-----------

「手作業、大好き!!」人力サーバを立ててみよう。

```hs
> s <- listenOn $ PortNumber 4492
> (h, _, _) <- accept s
```

acceptによって作られる動作は、クライアントからの接続を待つ。ブラウザを開いて以下のアドレスをうちこもう。

    http://localhost:4492

対話環境にもどって

```hs
> hGetLine h
"GET / HTTP/1.1\r"
> hPutStrLn h "HTTP/1.1 200 OK"
> hPutStrLn h "Content-Type: text/plain"
> hPutStrLn h "Content-Length: 5"
> hPutStrLn h ""
> hPutStrLn h "hello"
```

これで、ブラウザにhelloと表示される(はず)。

きのこ、たけのこ総選挙
------------------

最後は「きのこ、たけのこ総選挙」でしめる。現在、「きのこ、たけのこ総選挙」サーバを立ち上げたままにしてあるので、各自クライアントを書いて、選挙に参加しよう。(ただし、結果はサーバを落とすたびに0, 0にリセットされますが)

### 「きのこ、たけのこ総選挙」クライアント

つぎのようなクライアントを書きます。

```hs
import System.IO
import Network

main :: IO ()
main = do
        h <- connectTo "skami.iocikun.jp" $ PortNumber 4492
        hPutStrLn h "Yoshio"
        hPutStrLn h "kinoko"
        hGetLIne h >>= putStrLn
        hClose h
```

Yoshioのところは各自の名前(日本語不可)に置き換えて、kinokoのところは場合によってtakenokoに置き換えてください。サンプルコードとしてkinoko.hsやtakenoko.hsが用意してあります。

コンパイルするのがめんどうなら、つぎのようにして走らせます。

```shell-session
% stack ghc -- -fno-warn-tabs -e main kinoko.hs
kinoko: 2 takenoko: 3
```

当日はサーバのほうの出力もお見せします。また、サーバのソースコードはkt.hsにあります。ご参考までに。


最後に
-----

これが当日のゲスト講演の内容のすべてです。ハンズオンのときに、「一度やったところは、わかりやすかった。そのあとのところは、ついていくのが大変だった」との意見があったので、今回はすべて事前公開してみました。実験的に。結果的に、「ネタバレでつまらなかった」といった意見があれば、また次の機会の参考にさせてもらいます。

また、「うまく動かない」「わからないところがある」などありましたら、コメントまたは以下にメールをください。

funpaala@gmail.com
1秒の無音の音楽ファイル作成・1秒の動画を1枚の静止画から作成

# 1秒の無音の音楽ファイルを生成

```
ffmpeg -ar 48000 -t 00:00:01 -f s16le -acodec pcm_s16le -ac 2 -i /dev/zero -acodec libmp3lame -aq 4 silent.mp3
```

です。

```
-t xx:xx:xx -f 
```
の部分が秒数指定です

silent.mp3のファイル名は任意で

# 1秒の動画を1枚の静止画から作成

```
ffmpeg -loop 1 -i image.png  -i ~/silent.mp3 -c:v h264 -c:a mp2 -t 00:00:01 -vf scale=640:640 -y -pix_fmt yuv420p -r 29.98 movie.mp4
```

image.png: 動画にしたい静止画
silent.mp3: BGMにしたい音楽ファイル（今回はさっき作った無音mp3）
movie.mp4: 生成する動画のファイル名
00:00:01: 動画の秒数
Dockerfile CMDの角括弧([ ])の有無による挙動の違い

Dockerfile CMDの角括弧(`[ ]`)の有無によって挙動が違った。

角括弧がある: PID 1のプロセスはCMDで指定したプログラムのプロセス
角括弧がない: PID 1のプロセスはshell

仕様は[ここ](https://docs.docker.com/engine/reference/builder/#cmd)に書いてある。

# 角括弧有り
## Dockerfile

```Dockerfile
FROM ubuntu:16.04
CMD ["tail", "-f", "/dev/null"]
```
## プロセスの様子
```shell-session
$ docker exec -it with_brackets ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.2  0.0   4416   748 ?        Ss   09:35   0:00 tail -f /dev/null
root         7  0.0  0.1  34428  2680 pts/0    Rs+  09:35   0:00 ps aux
```
## PID1
CMDで指定したプログラムのプロセス

# 角括弧無し
## Dockerfile

```Dockerfile
FROM ubuntu:16.04
CMD tail -f /dev/null
```
## プロセスの様子
```shell-session

$ docker exec -it without_brackets ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.3  0.0   4512   780 ?        Ss   09:37   0:00 /bin/sh -c tail
root         5  0.0  0.0   4416   784 ?        S    09:37   0:00 tail -f /dev/nu
root         6  0.0  0.1  34428  2728 pts/0    Rs+  09:37   0:00 ps aux
```
## PID1
shellのプロセス

# コンテナ起動時にコマンドをした場合
## Dockerfile
角括弧有り、角括弧無し両方で試した

## プロセスの様子

```shell-session
$ docker run --name my_container -d my_image  sleep 1000
$ docker exec -it my_container ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.2  0.0   4384   744 ?        Ss   03:19   0:00 sleep 1000
root         7  0.0  0.1  34428  2816 pts/0    Rs+  03:19   0:00 ps aux
```
## PID1
起動時に指定したプログラムのプロセス

# どういう時に違いが出るか
`docker stop`は、PID 1のプロセスに対して`SIGTERM`を送る。その後10秒以内にプロセスが死なない場合は、`SIGKILL`を送る。
実行したいプログラムで`SIGTERM`をハンドリングしたい場合、角括弧無しでCMD実行すると、`SIGTERM`が正しくハンドリングできない事がある。

ref: https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/
Swiftでクラス名をStringで取得する。

StoryboardのIdentifierとかを手書きしたりするとたまにあるタイプミス。
極力そういうのを減らしたい。できればプロパティで取得したい。
そんなわけで色々いじってたらこうなりました。

```Swift:
protocol getClassName {
}

extension getClassName {
    static var className: String {
        
        return String(describing: self)
    }
}

extension NSObject: getClassName { }
```
使う時はこんな感じでよくなりました。

```
UIViewContiosroller.className
```
enjoy Swift!
Docker版　API Connectの状態を初期化する（5.0.6版）

# API Connect Docker版の初期化

IBMのAPI　ConnectにはDocker版が存在するが、Docker Composeにて起動する仕様となっており、ディスク構成が永続するのかしないのかわかりづらい部分がある。

今回はその初期化について解説する。

# Imageを削除してもデータが残る！

全てImageやNetwork削除したい場合、下記のコマンドにてDockerのイメージやネットワークを削除するが、この後　buildし直しても　Portal等に以前の情報が残っており、様々な事象が発生する。

```
docker-compose down
```

# devicemapper上のVolumeに残る情報

dockerのストレージドライバは、下記のコマンドによって確認が可能。

```shell-session
docker info | grep Storage
```

今回はdevicemapper を使用している場合の情報を記述する。
devicemapper はDockerが使用するVolume情報を /var/lib/docker/volumes に保管する。

API Connectが使用しているものは下記の６つ。

```shell-session

apiconnectdocker_ibmportal_etc
apiconnectdocker_apim_ihvar
apiconnectdocker_ibmportal_var
apiconnectdocker_apim_wip
apiconnectdocker_es_data
apiconnectdocker_config_ssh_keys
```

これらを初期化したい場合は、上記のディレクトリを消すか、docker-compose にオプションをつける。

```shell-session
docker-compose down -v
```

尚、イメージを消したい場合は　--rmi オプションをつける。

※詳細は不明だが上記の手法でVolume削除する場合、

```shell-session
ERROR: for ibmportal  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
```

のエラーが出力され、Portalが起動しなくなる場合がある。

結局のところ
下記のように手動で削除、再作成した方が無難。

```shell-session
docker-compose stop
docker-compose rm
rm -rf /var/lib/docker/volumes/apiconnect*
cd /var/lib/docker/volumes/
mkdir -p apiconnectdocker_apim_ihvar/_data
mkdir -p apiconnectdocker_apim_wip/_data
mkdir -p apiconnectdocker_config_ssh_keys/_data
mkdir -p apiconnectdocker_es_data/_data
mkdir -p apiconnectdocker_ibmportal_etc/_data    
mkdir -p apiconnectdocker_ibmportal_var/_data
cd -
docker-compose up -d
```