OmniAICreator/Qiita-1.07M huggingface dataset:
k8s の 異常終了した pods を削除する

k8s のダッシュボードを使ってると Pods などをみるにはすごく便利なんだけど，
異常終了したジョブが延々と残っていて，不要だから削除したいなと思ったのがきっかけです．
自分が調べたところでは， kubectl のコマンドに該当するものがなかったので，参考になれば幸いです．
（適切なやり方をご存知の方はコメントに記述して頂けるとめちゃめちゃ嬉しいです :clap: ）

# kubernetes dashboard
ご存知の方も多いかと思うのですが，
k8s のダッシュボードは

```bash:kubectl
kubectl proxy
```

で localhost で表示することができます．
ダッシュボードには， namespace や deployment, service, pods, replicasets など k8s クラスタで実行しているものは全て見ることができます．
詳しくは，
[kubernetes dash board（英語）](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/)
[kubernetes 環境構築](http://acro-engineer.hatenablog.com/entry/2016/10/04/120000)
が参考になるかと...

## WebUIについて
ダッシュボードの画面は
![dashboard-ui.png](https://qiita-image-store.s3.amazonaws.com/0/47270/18809e9c-155a-6e2a-e107-d022c702fb77.png)
こんな感じになるんですが，
Pods のエリアに異常終了したジョブも表示されます．

# 問題点
一回実行されて異常終了する分には画面から削除すればいいのですが，
replica set などで異常終了して自動的に再実行された場合は，異常終了した Pods が簡単に百数十件とかになるわけです．
そうなると画面から削除するのはあまりにもつらすぎるので，コマンドを使って一括削除しました．

# 解決方法
cli の `kubectl` と `awk` 使って一括削除します．
`namespace` が `default` ，あるいは指定し忘れて `Pods` や `Deployment` を `create` ， `apply` した場合は，

```bash
$ kubectl get pods -a | grep "Error" | awk '{print $1}' | xargs kubectl delete pods
```

`namespace` を明示的に指定する場合は，

```bash
$ NAME_SPACE=<your_namespace>
$ kubectl get pods --namespace=${NAME_SPACE} -a | grep "Error" | awk '{print $1}' | xargs kubectl delete pods --namespace=${NAME_SPACE}
```

でできます．
`NAME_SPACE` の値は適宜変えてください．
joobyでWebSocketを試してみる

joobyでWebSocket通信を試してみます。

# 前提条件
- joobyの[QUICK START](http://jooby.org/quickstart/)が終了している

## ①クライアント用HTMLの準備
publicディレクトリ直下にws.htmlを配置します。
※下記はあくまでサンプルなので、最低限のメソッドしか記載しておりません。

```ws.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebSocketサンプル</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$(function(){
    var ws = new WebSocket("ws://localhost:8080/ws");
    ws.onmessage = function(message){
        $("#log").prepend(message.data + "<br>");
    }
    $("#message").keyup(function(e){
        ws.send($(this).val());
    });
})
</script>
</head>
<body><input type="text" id="message"><div id="log"></div></body>
</html>

```

## ②サーバ側の処理追加
メッセージを受信して、送信元に返却しつつ、ブロードキャストするシンプル構成です。

```App.java
	{
		assets("/ws.html", "ws.html");
		ws("/ws", ws -> {
			ws.onMessage(msg -> {
				ws.send("send : " + msg.value());
				ws.broadcast("broadcast : " + msg.value());
			});
		});
	}
```

## ③ブラウザから複数タブで **http://localhost:8080/ws.html** にアクセスして、テキストボックスにメッセージを入力してみる
それぞれのタブで、自分の送ったメッセージとブロードキャスト両方が表示されていますので正常に動作しているようです。
### タブ１
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70168/07548a13-ba37-466e-19e2-37ffadac4b21.png)

### タブ２
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70168/ac4a2dd0-cdf5-0963-95dd-642d0a99400a.png)

## 最後に
たった、これだけの記述量で単純な **WebSocket** の通信が可能なので非常に楽で分かりやすいと思います。
ただ、昔からJavaに慣れ親しんだ人が見ると、あまりJavaのコードに見えないですけどねｗ
SmartGit > Add済みTagのremoteへのPush > Tag上にて右クリック | Push または Push To

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

Add TagしたタグをPushするには。

http://smartgit.3668570.n2.nabble.com/Push-tags-td7574336.html
>>  How can I push tags from Smartgit 4.6.4 ? 

> Right-click a tag and select Push or Push To. 

### Commitsペインから

- Logウィンドウを開く
- Commitsペインのコミットからタグを探す
- タグ上で右クリック
    - Push [Tag名] ...
    - もしくは
    - Push [Tag名] To ...
    - を使う

### Branchesペインから

- Logウィンドウを開く
- BranchesペインのTagsリストからタグを探す
- タグ上で右クリック
    - Push ...
    - もしくは
    - Push To ...
    - を使う

### 補足

左上部のメニューにある「Push」ボタンからはタグをPushする選択肢はないようだ。

### 関連

[SmartGit > Push [tag] | Push [tag] To](http://qiita.com/7of9/items/d99ccf3d19b2300c4f60)
Rubymineでテスト実行時にfind_spec_for_exeが出る問題の対象

Rubymineでテスト実行すると

```
Testing started at 11:55 ...

/Users/user.name/.rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems.rb:270:in `find_spec_for_exe': can't find gem spring (>= 0.a) (Gem::GemNotFoundException)
	from /Users/user.name/.rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems.rb:298:in `activate_bin_path'
	from /Users/tomoya.hirano/Documents/workspace/pokota-server/vendor/bundle/ruby/2.4.0/bin/spring:22:in `<top (required)>'
	from -e:1:in `load'
	from -e:1:in `<main>'

Process finished with exit code 1
```

と言われて動かない時がある。

このspringはどうもglobalの方を参照してるっぽいので

`gem install spring`

するとちゃんと動くようになる。
bundlerの方参照する設定とかあるんかなぁ
Coursera Machine Learning の受講記録（Week6）

[Machine Learning by Stanford University](https://www.coursera.org/learn/machine-learning/home/welcome) WEEK6 のまとめ
# 学習アルゴリズムの評価
## 仮説関数の評価
トレーニングデータの70%をトレーニングデータ、残り30%をテストデータとして、結果を評価する

![Kobito.oHUju6.png](https://qiita-image-store.s3.amazonaws.com/0/102387/ff0430af-4660-17d5-8fce-892d7dbfb4da.png "Kobito.oHUju6.png")

## モデルの選択方法
![Kobito.KmEQsA.png](https://qiita-image-store.s3.amazonaws.com/0/102387/cf1ab663-8c19-3920-0b37-7c9992c0626e.png "Kobito.KmEQsA.png")

# バイアスと分散の問題
## 仮説関数の次数と高バイアス or 高分散
　高バイアスの場合（仮説関数の次数が足りずにアンダーフィッティングが起こっている場合）は、Jcross-validation,Jtrainingの両方のコスト関数の値が大きい。
　高分散（仮説関数の次数が大きすぎてオーバーフィッティングが起こっている場合は、Jcross-validationが大きく、Jtrainingは小さい。
　![Kobito.u3d2YI.png](https://qiita-image-store.s3.amazonaws.com/0/102387/04752449-4662-1857-651f-4d5e9f386dc0.png "Kobito.u3d2YI.png")

## 正規化の係数λと高バイアス　or 高分散
　λが大きい = 正規化項が大きい　→　アンダーフィットしやすい
　λが小さい = 正規化項が小さい　→　オーバーフィットしやすい
　
　![Kobito.qx61S8.png](https://qiita-image-store.s3.amazonaws.com/0/102387/d74b3d86-d25f-c3b0-e6c5-a4987f4b6dfa.png "Kobito.qx61S8.png")


## 学習曲線
　学習曲線をプロットすると以下のような事が分かる
　高バイアス（次数が足りずにアンダーフィッティングが起きている）の場合の学習曲線は以下のような形。学習データを増やしても問題は解決しない。
　![Kobito.q10FhU.png](https://qiita-image-store.s3.amazonaws.com/0/102387/06d664cd-fef0-3fc2-4dd5-4053dddbc564.png "Kobito.q10FhU.png")

　高分散（次数が大きくオーバーフィッティングが起きている）の場合、学習曲線は以下のような形。この場合は学習データを増やす事に意味が有る。
　![Kobito.ai87Sd.png](https://qiita-image-store.s3.amazonaws.com/0/102387/139a0b3d-f6c0-9ad7-cc1c-cf227f90d8cb.png "Kobito.ai87Sd.png")

## 学習アルゴリズムの向上の為に何をするべきか
　学習アルゴリズムに問題があると分かった場合、考えられる施策は以下のようなものがあるが、この中でどの施策を取るべきか、どのように判断すべきか？
　![Kobito.Wznatb.png](https://qiita-image-store.s3.amazonaws.com/0/102387/6d1e8f0c-41c9-9948-f7d5-9eff3d34b394.png "Kobito.Wznatb.png")


# スパム分類の学習アルゴリズム構築
## エラー分析
学習アルゴリズムの向上の為にどのような施策を行うべきか、判断する手法の一つがエラー分析。
エラーとなったデータを手動で見ていき、誤検知されているデータに法則性がないかを調べて、追加の変数設定等に生かす。

# 偏りのあるクラス分類の問題について
## 予測とリコール
![Kobito.yvnXpe.png](https://qiita-image-store.s3.amazonaws.com/0/102387/78d96822-2c27-aa0a-19b1-19ad5cefecfa.png "Kobito.yvnXpe.png")
![Kobito.8u95Mb.png](https://qiita-image-store.s3.amazonaws.com/0/102387/7c837d92-7eb7-f5bc-6959-5f0d94b80291.png "Kobito.8u95Mb.png")
Coursera Machine Learning の受講記録（Week4）

[Machine Learning by Stanford University](https://www.coursera.org/learn/machine-learning/home/welcome) WEEK4 のまとめ

# ニューラルネットワーク
![Kobito.8UcEfM.png](https://qiita-image-store.s3.amazonaws.com/0/102387/ceb0ca57-9dae-784e-8888-4396f5326bee.png "Kobito.8UcEfM.png")

## ベクトル化

![Kobito.bG3rNu.png](https://qiita-image-store.s3.amazonaws.com/0/102387/837cafca-bf90-35b9-4345-4e21004a80d4.png "Kobito.bG3rNu.png")

![Kobito.wx2lRA.png](https://qiita-image-store.s3.amazonaws.com/0/102387/716beff4-0c29-6e44-1269-6fbb320258a6.png "Kobito.wx2lRA.png")

![Kobito.4D1vdH.png](https://qiita-image-store.s3.amazonaws.com/0/102387/b9b4fb64-13eb-b42d-7443-154083ae37ae.png "Kobito.4D1vdH.png")

![Kobito.t3YmED.png](https://qiita-image-store.s3.amazonaws.com/0/102387/ec6fa454-5191-9c79-dfc0-9c0ae08827b3.png "Kobito.t3YmED.png")

## Multi-class classification

![Kobito.8yMVOJ.png](https://qiita-image-store.s3.amazonaws.com/0/102387/5c4fc797-d70a-f32d-b8cb-83707cef86ea.png "Kobito.8yMVOJ.png")

![Kobito.rzEgFV.png](https://qiita-image-store.s3.amazonaws.com/0/102387/7ddd3b43-2603-4482-5e5b-1783d82fd0de.png "Kobito.rzEgFV.png")
Coursera Machine Learning の受講記録（Week5）

[Machine Learning by Stanford University](https://www.coursera.org/learn/machine-learning/home/welcome) WEEK5 のまとめ

#コスト関数とバックプロパゲーション
## コスト関数
![Kobito.AWQYuF.png](https://qiita-image-store.s3.amazonaws.com/0/102387/8a389d02-082c-aa73-6b59-434a613f4fec.png "Kobito.AWQYuF.png")

ロジスティック回帰のコスト関数は以下
![Kobito.aq3m82.png](https://qiita-image-store.s3.amazonaws.com/0/102387/222ac758-5123-a091-a4b7-150fc5027774.png "Kobito.aq3m82.png")

ニューラルネットワークのコスト関数はロジスティック回帰のコスト関数を一般化した以下となる。
![Kobito.KXLmts.png](https://qiita-image-store.s3.amazonaws.com/0/102387/6efe0015-cd9b-310a-d66e-2a8e6129c1d3.png "Kobito.KXLmts.png")

## バックプロパゲーションアルゴリズム
バックプロパゲーション（逆伝播）はニューラルネットワークのコスト関数を最小化する手法
![Kobito.JkcaPK.png](https://qiita-image-store.s3.amazonaws.com/0/102387/25da7217-2731-3c50-1d86-bf47c2d13e1d.png "Kobito.JkcaPK.png")

![Kobito.iCebbp.png](https://qiita-image-store.s3.amazonaws.com/0/102387/8c3ff23f-3767-ebf0-ef8b-8fa6c148d9bf.png "Kobito.iCebbp.png")
を算出するのに以下のバックプロパゲーションアルゴリズムを適用する。

![Kobito.nsTSNN.png](https://qiita-image-store.s3.amazonaws.com/0/102387/249faa77-d5b6-11a4-8d82-63b4992c6768.png "Kobito.nsTSNN.png")

上記の解説
![Kobito.QLuRoC.png](https://qiita-image-store.s3.amazonaws.com/0/102387/a8d8b2b8-f029-6a3b-e950-73716e95fcd7.png "Kobito.QLuRoC.png")


バックプロパゲーショでやっている事は期待値との差分δを逆方向（出力層から入力層へ以下のように伝播させている。
![Kobito.kZm0fc.png](https://qiita-image-store.s3.amazonaws.com/0/102387/f8db2c53-37f6-36f2-3530-7743af21086e.png "Kobito.kZm0fc.png")

＃バックプロパゲーションの適用法詳細
## 行列→ベクトルに変換した実装方法
θ、D（行列）をベクトルに変換する方法、それを元の行列に戻す方法　具体的なoctaveでの実装方法は以下。
![Kobito.ScR6vL.png](https://qiita-image-store.s3.amazonaws.com/0/102387/5d3e1b64-9b2a-f02f-437b-6ae8ef5fa69c.png "Kobito.ScR6vL.png")

## グラディエントチェッキング
バックプロパゲーションで計算したJ(θ）の微分が正しいかをチェックする方法。
![Kobito.6AB1aO.png](https://qiita-image-store.s3.amazonaws.com/0/102387/442a8561-3ee6-7f7e-1982-2cad514fd67e.png "Kobito.6AB1aO.png")
★グラディエントチェッキングは時間のかかる処理なので、チェックのみに利用し、実際に計算を走らせる時にはコメントアウトする等が必要。

## ランダム初期化
θの初期値を0にしてしまうとうまく計算されないので、0近くのランダムな値で初期化する必要あり。
![Kobito.XESiBU.png](https://qiita-image-store.s3.amazonaws.com/0/102387/9a424811-e763-cb74-6201-d058645dae77.png "Kobito.XESiBU.png")

## サマリー
![Kobito.nzBMvv.png](https://qiita-image-store.s3.amazonaws.com/0/102387/782de4ee-1fda-44c4-adfd-56d5e69069f7.png "Kobito.nzBMvv.png")
Coursera Machine Learning の受講記録（Week7）

[Machine Learning by Stanford University](https://www.coursera.org/learn/machine-learning/home/welcome) WEEK7 のまとめ

# サポートベクターマシーン(SVM)
![Kobito.aObs3V.png](https://qiita-image-store.s3.amazonaws.com/0/102387/60190976-cb67-9c9d-f009-4440378b9911.png "Kobito.aObs3V.png")

![Kobito.1Rr6U5.png](https://qiita-image-store.s3.amazonaws.com/0/102387/b1dc6afd-29a3-a084-23e3-d1df9447e0f0.png "Kobito.1Rr6U5.png")
![Kobito.mkyWpw.png](https://qiita-image-store.s3.amazonaws.com/0/102387/86227fb6-cc6f-58b3-2a82-9b38c1cf3aec.png "Kobito.mkyWpw.png")

# SVM カーネル

![Kobito.1oGbog.png](https://qiita-image-store.s3.amazonaws.com/0/102387/3e037d35-a9a0-b4c0-9ce4-b0e09e2e861c.png "Kobito.1oGbog.png")


![Kobito.ff3XTQ.png](https://qiita-image-store.s3.amazonaws.com/0/102387/b9a040e7-3b8d-0b90-e20d-72f1aaafdef1.png "Kobito.ff3XTQ.png")

![Kobito.USP164.png](https://qiita-image-store.s3.amazonaws.com/0/102387/bbb91177-b5ec-1f5b-6150-8ab809d41ee0.png "Kobito.USP164.png")
Djangoフレームワークにおけるmigrations機能の学習ノート（２）

[前回](http://qiita.com/pumbaacave/private/b2a0ee7ed35fc48301f0)に引き続きDjangoフレームワークのmigrations機能について勉強してみたいと思います。
# 前回のあらすじ
- Djangeフレームワークを使い、プロジェクトを作成、テスト用アプリを作成、データベースの設定を完了します
- アプリ用のモデルファイルを初期化作成し、データベースに反映させます
- モデルに新しいフィールドを追加します、データベースに反映させます
- 上のステップを変更を取り消すために、データベースを初期化した状態に復旧させます

|開発環境      |
|:-------------|
|Mac OS:Sierra |
|python2.7.10  |
|django1.11.2  |
|mysql5.7.18 |

# 今回の概要
前回ではmigrationsの基本なworkflowを紹介しました、今回ではmigrationsに関連する基本なコマンド及び実際利用中よく出会うトラブルの解決方法を勉強します。

# migrations関連するコマンド
[オフィシャルドキュメント](https://docs.djangoproject.com/en/1.11/topics/migrations)ではmigrationsに関連する４つのコマンドが紹介されています。デモアプリを活用してコマンドの使って見ましょう。

## showmigrations
コマンドラインで下記コマンドを入力：

```
python manage.py showmigrations
```

出力では：
 
```
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
polls
 [X] 0001_initial
 [ ] 0002_article_image_url
sessions
 [X] 0001_initial
```

現在プロジェクトの各アプリのmigrationsの状態がチェックリストで表示されます。
admin、auth、contenttypes、sessionsなどデフォルトアプリのmigrationsは全部反映されました。
デモアプリであるpollsでは初期化で反映されたmigrationsファイル0001_initial.pyにチェックを入れてあり、
復旧で取り消されたmigrationsファイル0002_article_image_url.pyではチェックが外されました。
コマンドにオプションをつけてアプリを指定することもできます。

```
python manage.py showmigrations polls
```

これで出力を特定なアプリに絞れます。

```
polls
 [X] 0001_initial
 [ ] 0002_article_image_url

```

## makemigrations
モデルの変更に沿ってmigrationsファイルを作成します、具体例は[前回](http://qiita.com/pumbaacave/private/b2a0ee7ed35fc48301f0)を参照しましょう。

## migrate
作成したmigrationsファイルを使って、モデルをデータベースに反映させます。取り消した変更を再度追加しましょう。

```
python manage.py migrate polls
```

出力

```
Operations to perform:
  Apply all migrations: polls
Running migrations:
  Applying polls.0002_article_image_url... OK
```

デモアプリのmigrationsの状態をチェックしましょう：

```
python manage.py showmigrations polls
```

出力：

```
polls
 [X] 0001_initial
 [X] 0002_article_image_url
```
migrationsファイル0002_article_image_url.pyが反映されたのがわかります。

## sqlmigrate

migrationsファイルの内容を実際に実行するsqlステートメントを表示します。
使用する場合対象アプリの名前とmigrationsファイル名をオプションに入れる必要があります。
migrationsファイル0002_article_image_urlを指定して実行しましょう。

```
python manage.py sqlmigrate polls 0002_article_image_url
```
出力

```
BEGIN;
--
-- Add field image_url to article
--
ALTER TABLE `polls_article` ADD COLUMN `image_url` varchar(200) DEFAULT toBeImplement NOT NULL;
ALTER TABLE `polls_article` ALTER COLUMN `image_url` DROP DEFAULT;
COMMIT;
```
一気に挙動不審なmigrationsの働きがクリアになりました。
さらに、--backwardsオプションをつけると、migrationsを取り消すためにsqlステートメントも見れます。

```
python manage.py sqlmigrate --backwards polls 0002_article_image_url
```
出力

```
BEGIN;
--
-- Add field image_url to article
--
ALTER TABLE `polls_article` DROP COLUMN `image_url`;
COMMIT;
```
コメントで記述されているのはmigrationsファイルの説明ですが、sqlステートメントではちゃんと変更を取り消しています（image_urlのコラムを消します）。
生のPHPでREST APIっぽいルーティングを作る

# 生のPHPでREST APIっぽいルーティングを作る

REST APIを作るときは、通常、Lumen: https://lumen.laravel.com/ などのマイクロフレームワークや、
普通のフレームワークを使うのが便利ですが、今回は生のPHPのみでREST APIのサンプルを作成してみます。

以下、説明のために`test`ディレクトリにルーティングのファイルを置くと仮定します。
適宜、読み替えてください。

## サーバーの設定

まず、ファイル名の指定なしでアクセスするために、Rewrite設定をします。

Apacheを使っている場合は、`test`ディレクトリの中に以下のようなファイルを置きます。

```text:.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
```
nginxを使っている場合は、以下のような設定をファイルに追記します。

```text
location /test {
  try_files $uri $uri/ /test/index.php?$query_string;
}
```

## ルーティングのソースコード

```php:index.php
<?php
preg_match('|' . dirname($_SERVER['SCRIPT_NAME']) . '/([\w%/]*)|', $_SERVER['REQUEST_URI'], $matches);
$paths = explode('/', $matches[1]);
$id = isset($paths[1]) ? htmlspecialchars($paths[1]) : null;
switch (strtolower($_SERVER['REQUEST_METHOD']) . ':' . $paths[0]) {
case 'get:user':
  if ($id) echo "ユーザー #{$id} 取得";
  else echo 'ユーザー 一覧';
  break;
case 'post:user':
  echo 'ユーザー 登録';
  break;
case 'put:user':
  echo "ユーザー #{$id} 更新";
  break;
case 'delete:user':
  echo "ユーザー #{$id} 削除";
  break;
}
```

## テスト

ユーザー一覧: http://example.com/test/user (GET)
ID #1 のユーザー取得: http://example.com/test/user/1 (GET)
ユーザー登録: http://example.com/test/user (POST)
ID #1 のユーザー更新: http://example.com/test/user/1 (PUT)
ID #1 のユーザー削除: http://example.com/test/user/1 (DELETE)

Chrome拡張の[Postman](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja)などで確認すると楽です。
docker images -a で表示される<none>となっているimageの削除手段（案）

Docker のbuildしたimageファイルの取扱で、"none"となったファイルの取扱に困り、問題を（無理やり）解消した件を記録します。

（困ったというのは、対応するcontainerのゴミを削除しても、`docker rmi -f` で消そうとしても消せないことが、原因がわからず発生しました）


```
$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
libraries           mri2                76f924af5b91        9 months ago        1.381 GB
ubuntu              12.04               e216a057b1cb        9 months ago        103.6 MB

```
上記でリストされるのは、REPOSITORY名とTAG名が設定されているものだけになるようです。
しかし、操作方法の誤りからREPOSITORY名とTAG名が"none"となってしまう場合がある。

そういった場合は以下の「-a」全部表示するオプションを付けたコマンドを打てば表示される。ここに表示されているimageは基本利用しないため、HDDの容量を無駄に消費しているため削除した方が無難。

```
$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
libraries           mri2                76f924af5b91        9 months ago        1.381 GB
<none>              <none>              a3e3f7862151        9 months ago        103.6 MB
ubuntu              12.04               e216a057b1cb        9 months ago        103.6 MB

```

そこで、"none"のimageを消そうとすると、以下のエラーが表示されることがある（理由は、調べきれていないため不明）。

```
$ docker rmi a3e3f7862151
Error response from daemon: conflict: unable to delete a3e3f7862151 (cannot be forced) - image has dependent child images
```

`docker ps -a`で確認しても対応するcontainerは見つからず、強制削除のオプション「-f」を付けても削除できず、同じエラーが表示される。
こういう時、物理的にファイルを削除すると、うまくいくことがわかった。

つまり、下記のコマンドで示すように、ファイルを探し出し、削除する方法です。

```
$ find  /var/lib/docker/image/aufs/imagedb/content/sha256 -name "a3e3f7862151*"
/var/lib/docker/image/aufs/imagedb/content/sha256/a3e3f7862151f618ed54ffd828c8086a2bfef23d6121a689ff46e6498ed58a4f
$ rm /var/lib/docker/image/aufs/imagedb/content/sha256/a3e3f7862151f618ed54ffd828c8086a2bfef23d6121a689ff46e6498ed58a4f
```

参考にしたのは、下記のページです。
[cannot delete some images #12487](https://github.com/moby/moby/issues/12487 )
REPOSITORY名とTAG名が設定されていれば正規の方法でできると思いますが、今回"none"となって対応方法が見つかりませんでした。
最終手段として/var/lib/docker以下を破棄して対応している人がいるようなので、全部消すなら一度ファイル単位で消してみようと試してみました。

今のところ、手元の環境は動作しています。
CentOS7にPyenvとPython3系をインストール

CentOSにPython3系が入っていないので、やり方をメモ。
ついでにpyenvも入れてバージョンを切り替えられるようにした。

# 環境
|OS・ミドルウェア|バージョン|
|:--------------|:--------|
|CentOS|CentOS Linux release 7.3.1611 (Core)|
|Git|git version 2.13.2|
|Vim|version 8.0.692|
|Python|3.6.2|

# 手順
1. ライブラリのインストール

    ```shell-session
    # yum -y install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel
    ```

2. [pyenv installer](https://github.com/pyenv/pyenv-installer)の起動

    ```shell-session
    # curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
    ```
3. 必要に応じてPATHの記述

    ```shell-session
    # vi ~/.bash_profile
    ```

    以下の内容を記載

    ```shell-session
    export PATH="~/.pyenv/bin:$PATH"
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
    ```

    ```shell-session
    # source ~/.bash_profile
    # pyenv
    pyenv 1.1.3
    Usage: pyenv <command> [<args>]
    
    Some useful pyenv commands are:
       commands    List all available pyenv commands
       local       Set or show the local application-specific Python version
       global      Set or show the global Python version
       shell       Set or show the shell-specific Python version
       install     Install a Python version using python-build
       uninstall   Uninstall a specific Python version
       rehash      Rehash pyenv shims (run this after installing executables)
       version     Show the current Python version and its origin
       versions    List all Python versions available to pyenv
       which       Display the full path to an executable
       whence      List all Python versions that contain the given executable
    
    See `pyenv help <command>' for information on a specific command.
    For full documentation, see: https://github.com/pyenv/pyenv#readme 
    ```

4. Python3系のインストール

    ```shell-session
    # pyenv install 3.6.2
    ```
5. インストールしたPythonを使用するように設定

    ```shell-session
    # pyenv global 3.6.2
    ```

これでインストールしたPythonが使用できる
Get,GetGetGetWildAndTough!

# コード
```ruby
GET = "Get"
WILD = "Wild"
AND = "and"
TOUGH = "Tough"

getWildAndTough = [GET,WILD,AND,TOUGH]
getChanceAndLuck = [9,9,9]

while(true) do
    gwat = rand(0..2)
    puts getWildAndTough[gwat]
    getChanceAndLuck.shift
    getChanceAndLuck.push(gwat)
    dream = true
    getChanceAndLuck.each_with_index{|wild,tough| dream = (wild == tough) && dream}
    break if dream
end 
puts getWildAndTough[3]
```

# 出力
```
and
Wild
Wild
Wild
and
Get
Get
Wild
Get
and
Wild
Wild
Get
Get
Wild
Wild
Get
Wild
Get
Wild
and
Tough
```
# なにこれ？
一人では解けない愛のパズル

# 仕様
「Get」 「Wild」 「and」 をランダムに出力します。
「Get Wild and」の順に出力されたら「Tough」と出力して終了します。

# 元ネタ
http://qiita.com/shunsugai@github/items/971a15461de29563bf90 by @shunsugai@github  
  
###### 更新履歴  
<font color="Gainsboro">開幕でWild andするとToughしちゃうバグをサイレント修正</font>
<font color="Gainsboro">HASHを辞めて配列に</font>
keyが完全に不定なjsonをなんとかGsonでパースする


## 前提

Androidにおけるjsonのパーサーライブラリの鉄板といえばGsonですが（個人調べ）、このライブラリはKotlinでも問題なく（個人調べ）利用することができます。

```kotlin:User.kt
data class User(
        val userId: String,
        val username: String
)
```

```kotlin:MainClass.kt
val user = Gson().fromJson(json, User::class.java)
```

## keyが完全に不定なjson

mediumは投稿関連のAPIしか提供されていませんが、各URLに`format=json`のクエリを入れることでjsonが返ってくるようになるので、これをGsonでパースすることができます。

サンプルURL： https://medium.com/japan?format=json

```json:top.json
])}while(1);</x>{"success":true,"payload":{"collection":{"id":"ee897b6da065","name":"Medium Japan","slug":"japan","tags":["PUBLICATIONS","JAPANESE","MEDIUM JAPAN","日本語"],"creatorId":"cd5018cebde7","description":"Medium 公式の日本語専用パブリケーションです。","shortDescription":"Medium 公式の日本語専用パブリケーションです。","image":{"imageId":"1*etUthOXG-BrZm25K7wEcgA.png","filter":"","backgroundSize":"","originalWidth":500,"originalHeight":500,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":4101,"activeAt":1487168607377},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false},"isSubscribed":false,"isNewsletterSubscribed":false,"memberOfMembershipPlanId":""},"logo":{"imageId":"1*etUthOXG-BrZm25K7wEcgA.png","filter":"","backgroundSize":"","originalWidth":500,"originalHeight":500,"strategy":"resample","height":0,"width":0},"twitterUsername":"MediumJapan","facebookPageName":"MediumJapan","sections":[{"type":2,"collectionHeaderMetadata":{"title":"Medium Japan","description":"Medium の公式日本語パブリケーションへようこ
// 省略
```

ちなみに先頭にXSS対策で付いている（と思われる） `])}while(1);</x>{` を削除した上でパースする必要があります。

ただし、このjsonはUser情報やPost情報のリストが配列ではなく、各IDをkeyとしたオブジェクトで登録されています。これだと `@SerializedName(alternate = {})` でもパースは事実上不可能です。

```json:top.json
{
   "payload":{
      "references":{
         "User":{
            "1106b2cd94a5":{
               "userId":"1106b2cd94a5",
               "username":"rayyama"
            },
            "c78a7314d9a5":{
               "userId":"c78a7314d9a5",
               "username":"SayakaNogawa",
            },
            "6673db351714":{
               "userId":"6673db351714",
               "username":"mach"
            }
         }
      }
   }
}
```
※ 必要な部分を抜粋

## Mapとしてjsonをパースする

ということでどうすれば取れるかを考えたのですが、keyの値は不定でも文字列型であることは一定しているので、Mapとして取得できるみたいです。

```kotlin:User.kt
data class Payload(
        val references: References
)

data class References(
        @SerializedName("User") val users: Map<*, User>
)

data class User(
        val userId: String,
        val username: String
)
```

```kotlin:MainClass.kt
val users = Gson().fromJson(json, Payload::class.java)

// 各ユーザーのuserIdを出力
for ((_, user) in users.payload.references.users) {
    Log.d(TAG, user.userId)
}
```

今回はKotlinでやってみましたが、おそらくjavaも同じ要領で `Map<String, User>` でいけるんじゃないかと思います。
ご指摘等あれば編集リクエストまたはコメントにてお願いします。
[Vue.js] vue-cliで作成したプロジェクトにelement-uiを導入する

vue-cliで作成したプロジェクトにelement-uiを導入しようとしたのですが、公式のドキュメントは純粋なVue.jsのチュートリアルしか載っておらず少しハマったので記録しておきます。
[公式のQuick start](http://element.eleme.io/#/en-US/component/quickstart)を見るとwebpack.config.jsの修正などが必要のようで、vue-cliで作成したプロジェクトはどこをどう弄れば良いのかなと思っていましたが、結論から言うと以下のように修正するだけでelement-uiを導入することができました。

この記事は[ブログ](http://tackeyy.com/blog/how-to-use-element_ui-with-vue_cli)からの転載です。

1 element-uiをインストールする

` $ npm install element-ui -S `

2 main.jsを修正する

```diff
 import Vue from 'vue'
 import App from './App'
 import router from './router'
+import ElementUI from 'element-ui'
+import locale from 'element-ui/lib/locale/lang/ja'
+import 'element-ui/lib/theme-chalk/index.css'
+
+Vue.use(ElementUI, { locale })
```

ロケールについてはここに説明があります。
http://element.eleme.io/#/en-US/component/i18n

正直 ` import 'element-ui/lib/theme-chalk/index.css' ` の必要性が分かっていませんが、おそらく全てのコンポーネントを一括で使えるようにしているのだと思います。
本来は(GitHubのドキュメント)[https://github.com/ElemeFE/element#quick-start]のように、コンポーネントをひとつずつimportしないといけない気がします。

3 App.vueを修正して動作確認する

```diff
 <template>
   <div id="app">
-    <img src="./assets/logo.png">
+    <div class="block">
+      <div class="block">
+        <el-date-picker
+          v-model="value"
+          type="datetime"
+          placeholder="日付の選択">
+        </el-date-picker>
+      </div>
+    </div>
     <router-view></router-view>
   </div>
 </template>
@@ -12,12 +20,4 @@ export default {
 </script>
```

[![https://gyazo.com/70babb1956ac779a94640a8b6f372ef2](https://i.gyazo.com/70babb1956ac779a94640a8b6f372ef2.png)](https://gyazo.com/70babb1956ac779a94640a8b6f372ef2)

動作確認のため無視していますが、 コンソールに ` [Vue warn]: Property or method "value" is not defined on the instance but...(省略) ` が出ます。

# 参考

[公式のQuick start](http://element.eleme.io/#/en-US/component/quickstart)
http://www.webopixel.net/javascript/1229.html

<br>
---
@egghikari さんに指摘していただいた ` index.css ` のpathについて修正しました。
Serverless Frameworkで環境変数を外部ファイルから読み込み、環境毎に自動で切り替えてみる

現在、Lambdaを開発するときにServerless Frameworkをよく使っています。

Lambdaで利用する環境変数はserverless.ymlに記載することでデプロイ時に設定されますが
本番環境と開発環境で環境変数を分けたいときは
外部ファイルにだして、それを読み込むほうがスッキリとして
また、今後環境変数を編集する際も作業しやすくなると思います。
今回は、デプロイ時に外部ファイルに書き出した環境変数を読み込み
開発環境と本番環境とで自動的に切り替える方法を紹介したいと思います。


詳細は下記リンクに記載しています。
http://dev.classmethod.jp/cloud/serverless-framework-conf-change/
備忘録：「オブジェクト指向でなぜつくるのか」

お疲れ様です。某エンジニアです。

今までC#, java, C++などでコードを書いていましたが、
オブジェクト指向の理解が怪しすぎるので書籍を読んでここにまとめていきます。
書籍はこちら⬇︎
「オブジェクト指向でなぜつくるのか」著者：平澤章 日経BP社
http://ec.nikkeibp.co.jp/item/books/P81950.html

読んだ人のコメントを調べると「読みやすい」との評価がいっぱいありました。
学生時代、大量のカタカナ語を聞かされて深い理解を諦めた自分にはぴったりかなと…

この本自体読み物的要素が強く、コードを実際に書くことはかなり少ないと思いますが悪しからず。

ということで早速１章を読んだので、まとめます。

#第１章：オブジェクト指向はソフトウェア開発を楽にする技術
全体の導入ですね。この章の内容を箇条書きでざっくり書くと、
 1. オブジェクト指向はソフトウェア開発の総合技術
 2. オブジェクト指向がわかりづらいのはだいたい説明の仕方のせい
という感じでした。
この章は導入なので実際のコードの例はなしです。
下記にそれぞれの詳細と感想を交えて書いていきます。
##1.オブジェクト指向はソフトウェア開発の総合技術
自分が前から疑問に思っていたのは、
**「結局オブジェクト指向の定義って何？」**
ということでした。
「オブジェクト指向」を名乗る言語が多い上、その機能にあんまり一貫性がないような…
「オブジェクト指向」というものがそもそもなんなのかという定義がわからなかったんです。
その理由はオブジェクト指向の発展の流れにあるそうです。

- オブジェクト指向の起源はノルウェーで開発された"Simula67"というプログラミング言語
 - この段階でクラス、ポリモーフィズム、継承の仕組みが備わっていた。
- この仕組みが"Smalltalk"に引き継がれ、「オブジェクト指向」というコンセプトとして確立
- 同様の仕組みを備えたプログラミング言語（C++, Objective-C, Java, C#, Rubyなどなど）が開発されて現在に至る

ほぼコピペですけど上記の流れでオブジェクト指向がいろんな方向に拡張された結果、オブジェクト指向を名乗る言語が大量に開発されたとのこと。
共通点は「ソフトウェア開発関連の技術であること」、「それを円滑に進める技術であること」くらい。

ということで**「オブジェクト指向を一言で言うと？」**と聞かれたら
**「難しいソフトウェア開発を楽に行うための総合技術」**となるそうです。
「詳しい定義が書いてない」んじゃなくて、「詳しい定義をしようがない」んですね。
やっと納得しました。

##2. オブジェクト指向がわかりづらいのはだいたい説明の仕方のせい
オブジェクト指向を始めたばかりのプログラマが混乱する理由は３つあるそうです。
この本の言葉を借りて挙げると、
1. 用語の洪水
2. 比喩の乱用
3. なんでもオブジェクト症候群

３つありますが要するに、
**よくわからんカタカナ語が多すぎ（＝用語の洪水）、
よくわからん比喩がよく使われ（＝比喩の乱用）、
「オブジェクト」の定義が広すぎて、様々な解釈がある（＝なんでもオブジェクト症候群）**
ということです。
共感できるエンジニアの方も多いのではないでしょうか。
やたら抽象的な説明ばかりが先行して具体的な話が抜けている上、説明する人によって解釈が異なるため、
混乱を招くとのことでした。

##まとめ
ということでこれらの混乱を取り除くべく、
1. 紹介する用語や概念は最小限に
2. 比喩による説明は最小限に
3. 「プログラムの仕組み」と「モノ中心で物事をとらえる考え方」は別物として
説明してくれるのがこの本だそうです。

次回は２章をまとめようと思うのでよろしくお願いいたします。
【Docker】基本コマンド一一覧

■dockerイメージを取り込み
docker load -i ＜ファイル名＞.tar.gz

■dockerコンテナ起動し、ログイン
docker run -i -t ＜イメージ名＞ /bin/bash

■起動中コンテナにログイン
docker exec -it ＜コンテナID＞ bash

■起動中コンテナをイメージとして保存
docker commit [編集したコンテナID] [保存するコンテナ名]

■dockerイメージをtar.gzで保存
docker save ＜イメージ名＞ > ＜ファイル名＞.tar.gz

■dockerイメージのコピー（タグ名を変更する）
docker tag ＜対象イメージ名:タグ＞ > ＜変更後イメージ名:タグ＞

■起動中コンテナにホストからファイルコピー
docker cp ＜ホストファイルパス＞ ＜コンテナID＞:＜コンテナコピー先パス＞

■コンテナに外部からアクセスする（ポートフォワーディング）
docker run -p ＜外部ポート＞:＜コンテナポート＞

■dockerfileからイメージを作成
docker build -t ＜イメージ名＞:＜タグ名＞ ＜Dockerファイルのパス＞

■statusがexitedなdockerイメージのみ一括削除
docker rm $(docker ps -a --filter 'status=exited' -q)

■コンテナのボリュームをホストにマウントする
docker run -v ＜ホストボリュームパス＞:＜コンテナ内パス＞ ＜コンテナイメージ＞

■コンテナを開始/停止/再起動
docker start/stop/restart ＜コンテナ名＞

■イメージへのタグ付け
docker tag ＜イメージID＞ ＜タグ名＞

※DockerHub使用の場合タグ名は，下記のとおり命名する。
　＜DockerHub上のアカウント名＞/＜イメージ名＞/＜バージョンorタグ＞

※ローカルリポジトリ使用の場合タグ名は，下記のとおり命名する。
　＜ローカルリポジトリIP:ポート番号＞/＜DockerHub上のアカウント名＞/＜イメージ名＞/＜バージョンorタグ＞


■コンテナイメージをregistryにpush
docker push ＜コンテナ名＞ 

■起動コンテナのIPアドレスを表示する
docker inspect -f "{{.NetworkSettings.IPAddress}}" ＜コンテナ名＞
Jenkins実際に使っているプラグイン

自分用メモ

プラグイン同士の干渉やバージョンアップ時の不具合でハマりたくないので、本当に必要なものだけをインストールするようにしている。


# 実際に使っていてGoodと思うプラグイン

## AnsiColor Plugin

コンソール出力に色付けしてくれるプラグイン。
コンソールで端末エスケープシーケンスにより色付き表示された出力を、Web上で表示するときにも色づけしてくれる。
ジョブごとに有効化しないといけないのが少し面倒。

## Extra Columns Plugin

ジョブの一覧にカラムを増やせるプラグイン。使いやすさが格段に向上する。

設定方法

- インストール後、「すべて」タブの右にある「+」ボタンからビューを追加
    - 「ジョブフィルター」は「正規表現でジョブを指定」にチェックをつけ「.*」を入力（全ジョブを表示したいため）
- [Jenkinsの管理] > [システムの設定] から [デフォルトビュー] を変更


## Categorized Jobs View

ジョブ一覧画面でカテゴリ分けするプラグイン。正規表現でジョブ名を分類する。
ジョブ数が多くなってきたら整理するのに効果的。


## Hudson Ruby Plugin

ビルド手順として「シェルの実行」と同様にRubyスクリプトを実行できるようになる。
Ruby自体は別途システムにインストールしておく必要がある。
**2018-06-25現在、公式からはインストールできなくなっているようだ。**



# 現在お試し中のプラグイン

## ThinBackup

Jenkinsの設定をバックアップできる。

# 試してみたいプラグイン

## Configuration Slicing Plugin

複数のJenkinsジョブの設定を１画面で一括編集できる

## Clone Workspace SCM Plugin

他のJenkinsジョブのワークスペースをコピーするプラグイン

# 試してみたが今は使っていないプラグイン

## rbenv plugin

Rubyのバージョンを頻繁に変えたいという要求はないので要らなかった。

## Display Console Output Plugin

ジョブの詳細画面にコンソール出力を表示する。
意外と見づらかったのと、Extra Columnsで十分なので削除した。
[クイズ]javascriptと仲良くなるための一歩　第２話「比較」

# 問題「比較」

## 第1問

```js
var s1 = "abc"
var s2 = "abc"
s1 == s2
//=> ?
```

## 第2問

```js
var s1 = String("abc")
var s2 = String("abc")
s1 == s2
//=> ?
```

## 第3問

```js
var s1 = new String("abc")
var s2 = new String("abc")
s1 == s2
//=> ?
```

: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:

#答え


## 第1問 true

文字列リテラルの比較になります

```js
var s1 = "abc"
var s2 = "abc"
s1 == s2
//=> true
```

## 第2問 true

string関数呼び出しなので、stringの比較になります。

```js
var s1 = String("abc")
var s2 = String("abc")
s1 == s2
//=> true
```

## 第3問 false

objectの比較になります。

```js
var s1 = new String("abc")
var s2 = new String("abc")
s1 == s2
//=> false
```
初心者だけどwebアプリを作りたい！！その３

フォント問題はCSS書き直したら動きました。typoってこわいね

##やったこと
・おおざっぱな画面遷移
・Googleスプレッドシートからキャラ一覧を取得（[参考](http://d.hatena.ne.jp/tk_4dd/20130511)）
・ガチャ演出のようなもの（一部）

##やること
・ガチャ結果表示
・消費した石の数表示

##できていないこと
ガチャ演出（レア確定演出みたいなの）
これはどんな演出にするかも含めて検討中
usb nic - AX88179ドライバのインストール

## 準備

http://www.asix.com.tw/search.php から `AX88179`で検索し`Linux kernel 4.x/3.x/2.6.x Driver`のものをダウンロード

![スクリーンショット_2018-04-09_08-05-12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a0158e49-5851-540d-00f8-45f37069f8e9.png)


## インストール (CentOS 5.11 i386)

```:必須パッケージ
yum update
reboot

yum groupinstall -y "Development Tools"
yum install kernel-PAE-devel
```

```bash:ソースの展開
tar jxf ../AX88179_178A_LINUX_DRIVER_v1.18.0_SOURCE.tar.bz2
cd AX88179_178A_LINUX_DRIVER_v1.18.0_SOURCE/
```

```bash:usbnet.hの取得
curl -LO https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.gz
tar xzf linux-2.6.18.tar.gz linux-2.6.18/drivers/usb/net/usbnet.h

cp usbnet.h /lib/modules/`uname -r`/build/drivers/usb/net/
```

```bash:make
make
make install
modprobe asix
```

```:rpm作成
curl -LO http://www.asic-linux.com.mx/~izto/checkinstall/files/rpm/checkinstall-1.6.1-1.i386.rpm
rpm -ivh checkinstall-1.6.1-1.i386.rpm

/usr/local/sbin/checkinstall -y -R
rpm -ivh /usr/src/redhat/RPMS/i386/AX88179_178A_LINUX_DRIVER_v1.18.0_SOURCE-20170719-1.i386.rpm
```

## インストール (CentOS 6.9 x86_64)

```:必須パッケージ
yum update
reboot

yum groupinstall -y "Development Tools"
yum install kernel-devel rpmdevtools
```

```bash:ソースの展開
tar jxf ../AX88179_178A_LINUX_DRIVER_v1.18.0_SOURCE.tar.bz2
cd AX88179_178A_LINUX_DRIVER_v1.18.0_SOURCE/
```

```bash:make
make
make install
modprobe ax88179_178a
```

```:rpm作成
curl -LO https://raw.githubusercontent.com/tukiyo/mysql4.0php5.2/master/files/checkinstall-20150420-1.x86_64.rpm
rpm -ivh checkinstall-20150420-1.x86_64.rpm

rpmdev-setuptree
/usr/local/sbin/checkinstall -y -R

rpm -ivh /root/rpmbuild/RPMS/x86_64/ax88179_178a-20180409-1.x86_64.rpm
```
Bitcoinの2017/08/01フォークに関する情報

Bitcoin Cash（旧Bitcoin Unlimited）
https://www.bitcoincash.org/

8月1日の日本時間21:20にフォークが行われるようです。
別ブランド、別コインとしてスタートし、8月1日時点のビットコイン保有者には無償でBitcoin Cashが配布されるのと同じ形になるそうです。

# 関連記事
"[日経新聞]日本仮想通貨事業者協会、ビットコイン取引を８月１日に停止"
http://www.nikkei.com/article/DGXLASFL18HHG_Y7A710C1000000/

識者のお話
"「ビットコイン分裂」の真相と深層"
http://btcnews.jp/49vdi2of11755/

まんがで今の状況を解説している記事
"今ビットコインに起こってること"
http://okanefuyasuzo.muragon.com/entry/17.html

"8/1ビットコイン分裂危機のシナリオ予想 ～8月にビットコインは分裂しません～"
http://coinandpeace.hatenablog.com/entry/bitcoin_split_scenerio

"ビットコイン最新の見通し(7.19)"
http://doublehash.me/bitcoin-7-19/

CoinBaseはユーザにBitcoin Cashを付与しないとのこと
https://twitter.com/tyk97/status/887713898031337472

7/20発識者のビデオ
8月1日ビットコイン分裂問題のシナリオと最新状況
https://www.youtube.com/watch?v=OlRTxT9Abk0

ビットコイン「分裂問題」に回避の兆し —— 価格は回復傾向に
https://www.businessinsider.jp/post-35091

ビットコイン最新の見通し(7.21)
http://doublehash.me/bitcoin-7-21/

Zaif他、日本国内の大手取引所は7/23からBTC入出金を停止するとのこと
8月1日に予期されるビットコイン分岐リスクに向けた対応についてのお知らせ（その2）
https://corp.zaif.jp/info/6064/

Segwitが順調に導入されている模様
https://twitter.com/tyk97/status/888404620531204097

7/21発識者のビデオ
ビットコイン分裂問題/BIP91アップデート（7/21）
https://www.youtube.com/watch?v=3Y_1OOttYNQ

ビットコイン最新の見通し(7.22)
http://doublehash.me/bitcoin-7-22/

ビットコイン最新の見通し(2017.7.23)
http://doublehash.me/bitcoin-7-23/

取引を再開している取引所も現れてきているそうです
ビットコイン最新の見通し(7.24)
http://doublehash.me/bitcoin-7-24/

他にも注目すべき記事を見つけたら追加していきたいと思います。
また、よい記事があればコメント欄にて教えていただけますと幸いです。
最近Swift書いていて可読性を上げるために意識していること

# Const構造体

```swift
class ViewController: UIViewController {
   func action() {
     let defaultKey = "ThisIsKey"
     ValueStore.get(defaultKey)
   }
}
```

メソッドの中にキーや数値情報を書くと、他のクラス利用者が止む無く変更したい場合にメソッドに手を加える必要が出たりそもそもの変数の場所を探す必要が出て来る。

```swift
class ViewController: UIViewController {
   private struct Const {
     static let defaultKey = "ThisIsKey"
   }

   func action() {
     ValueStore.get(Const.defaultKey)
   }
}
```

このようにConst構造体にまとめることで、定数を一箇所に集約させることが出来る。

# +Extensions.swift

Extensionを生やす場合、クラス名+Extensions.swiftという名前にしてExtensionsグループに入れている。

# setupメソッド

主に`setupAppearance`と`setupSubscriber`というメソッドをほぼ必ず作るようにしている。
これはviewDidLoad等のメソッドの中でUI装飾メソッドとRx/Gesture/delegate等のコールバックのセットアップ等が混在する事が要因で、このようにsetupメソッドとして分割することで修正箇所が明確になる

# DataSourceクラスを作る

ViewControllerに書きがちなUITableViewDelegateはDataSourceクラスに分けている。
理由はViewControllerが肥大化するから。

```swift
class ViewController: UIViewController {
  @IBOutlet weak var tableView: UITableView!
  lazy var dataSource: ViewControllerDataSource = .init(with: self.tableView)
  
  override func viewDidLoad() {
    super.viewDidLoad()
  }
}

class ViewControllerDataSource: NSObject, UITableViewDelegate, UITableViewDataSource {
  convenience init(with tableView: UITableView) {
    tableView.delegate = self
    tableView.dataSource = self
  }
}
```

こんな感じ。
実際はViewModelクラスと一緒に作ってreloadDataのタイミング等を管理している。

# didSetを使わない

`hoge.uppperPadding = 40.0`
というメソッドを呼んで、実際は

```swift
var upperPadding: CGFloat = 0.0 {
  didSet {
    //めっちゃ重い処理
  }
}
```
だったら怖いから。
プロパティへの代入は代入に留めたい。
プロパティ：軽い処理
メソッド：重めの処理
という印象があると思うので、それには逆らわないようにする。

# \`self\` = selfを使わない

closureでselfを使う際に

```swift
action = { [weak self] in
  guard let `self` = self else { return }
  self.update()
}
```

みたいな感じでself?を潰す手法があるんだけど、これは
・ そもそも`guard let `self` = self else { return }`を忘れた時に気がつけなくなる
・ selfと性質が厳密には違うのに同じ名前を使いたくない
という理由です。

# `@IBOutlet`にprivateを付ける

外から見た時にアクセス出来る必要が無いのに補完に出たりするのでprivateにしておく。
またIBOutletは厳密にはnilである可能性があるので、そういったタイミングでアクセスさせないという意図もある。
タップイベント等を流す時はちゃんとPublishSubjectを生やしてviewDidLoadとかでbindする

# Optionalの定義には` = nil`を書く

```swift
class Button: UIView {
  var color: UIColor?
}
```

となっていると、イニシャライザで初期化すべきなのか混乱するから。
`Button(color: color)`みたいなのがあるのかと思ってしまう。（structでもそういう動作だし）

```swift
class Button: UIView {
  var color: UIColor? = nil
}
```

こうなっていると、とりあえずcolorに関しては気にしなくていいと分かるし、初期値が明確になる。

# TODOにワーニングを付ける

ObjC時代はTODOはワーニングだったが、Swiftからはワーニングにならなくなった。

RunScriptに

```bash
if [ "${CONFIGURATION}" = "Debug" ]; then
TAGS="TODO:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi
```
を追加してワーニングにするようにしている。

# R.swiftの色情報をHexで管理する

カラーリテラルやR.SwiftデフォルトのClrではカラーコードが分からないので、txtにHexを書いてClrに変換している。
https://github.com/noppefoxwolf/HexToClr

# 分かりにくい処理はPlaygroundファイルを同梱する

Variableって最初ストリーム流れるんだっけ…？
みたいな疑問が出たらすぐPlaygroundで確かめてXcodeWorkspaceにいれて残しておく。

# 冗長な処理はServiceやFactoryに隠す
どうしてもFoundationのメソッドで冗長な書き方をしないといけない場合がある（VisionAPIとか…）ので、そういうのはServiceとかに隠す。


（クリーンコード警察みたいでﾔﾀﾞﾅｺﾚ…）
なんか思いついたら追記します
rx.tapを自前で生やす

RxSwiftのReactiveに対してextensionを生やすことで、rx.hogeを生やす事ができる。

```swift

extension Reactive where Base: Button {
  var tap: Observable<Void> {
    return base.tapped
  }
}

final class Button: UIView {
  fileprivate let tapped = PublishSubject<Void>()

  override func touchesEnded(_ touches: [UITouch]) {
    tapped.onNext()
  }
}
```

こんな感じで実装する。

```
button.rx.tap.subscribe()
```

こんな感じで使う。

## これのいいところ

・RxCocoaの記法と同じなので、見栄えが良い。
・PublishSubjectのtappedをクラス内に隠蔽出来るため、外からtappedを呼ぶ事故が防げる
ROS と TOMOYO Linux

# ROS はセキュリティ的にザル
---
# とか以前から言われてきましたが、
---
# SROS や ROS2 で変わりそうですね！
---
# そちらは＠atarmuさんのLTで説明しました。
---
# ところで SROS には AppArmor が含まれています。これは「セキュアOS」の一つです。
---
# 有名なところでは、SELinuxなどもありますね。
---
# ROS使っている人 → Ubuntu使い → なのでSELinuxを使う人は少ないかもしれませんが。
---
# ではこの「セキュアOS」とは何でしょう。
---
# セキュアOSの主な機能
## 強制アクセス制御 （↔ 任意アクセス制御）
セキュリティポリシーをコンピュータ内で強制できる仕組み

- たとえ資源の所有者でもシステム管理者（root）であっても、ポリシーの回避や変更ができません

## 最小特権化
ユーザやプロセスの動作に必要最小限の特権しか割り当てない仕組み

---
# 時間がないので詳細は省きますm(_ _)m
---
# ところでここは天下のNTTデータです。（会場のご提供ありがとうございました！）
---
# なのでAppArmorの代わりにNTTデータで開発されたTOMOYO Linuxを紹介します！
---
# AppArmorとTOMOYO Linuxは割と似たセキュアOSです
---
# TOMOYO Linuxの特徴

- 2005年にOSSとして公開、2009年にLinuxのメインラインにマージ
- プロセスの呼び出し履歴に基づくドメイン
 - bash → ls と、bash → bash → ls は別のドメイン
- ポリシーの自動学習機能
 - プロセスの動作を監視して記録する
 - 運用時には、学習したポリシーを強制できる
 - 一部をアクセス制御対象外や学習モードにすることも可能
 - ポリシーエディタを使ってポリシーを編集

---
# ポリシーエディタ（ドメイン遷移）

![Screenshot from 2017-07-19 00-45-00.png](https://qiita-image-store.s3.amazonaws.com/0/65518/86282e2f-e5f4-e9bd-3472-8a85bc120c4b.png)

行番号の右隣の数字（デフォルトの場合）

- 0 : 無効モード（何もしません。普通に動きます）
- 1 : 学習モード（普通に動作しながらアクセスを記録し、ポリシーに追加します）
- 2 : 確認モード（普通に動作しますが、ポリシー違反があるか確認するときに使います）
- 3 : 強制モード（ポリシーを強制して、許可がないアクセスは禁止します）

---
# ポリシーエディタ（ドメインポリシー）

![Screenshot from 2017-07-19 00-57-11.png](https://qiita-image-store.s3.amazonaws.com/0/65518/2eff4106-ea54-7409-32be-bd07b7cd8d30.png)

ポリシー作成や編集のほかに、プロセスのアクセス解析としても使えます！

---
# デモ
---
# ご清聴ありがとうございました！
---
# 参考

- TOMOYO Linux ホームページ
 - http://tomoyo.osdn.jp/

- UbuntuへのTOMOYO Linuxのインストール
 - http://bit.ly/2uxmTlH
Django,nginx,uWSGI,virtualenv ImportError: No module named site解決法メモ

#エラー

Djangoでアプリを作ってやっとの思いで公開しようと、

```bash
sudo /usr/local/bin/uwsgi --ini myapp_uwsgi.ini --uid nginx --gid nginx
```
とコマンドを叩いたら

```
Set PythonHome to /home/uesrname/.virtualenvs/virtualenvname
ImportError: No module named site
```
とエラーが出て動かない。なんてこった。

myapp_uwsgi.iniはこんな感じ

```myapp_uwsgi.ini
# myapp_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /var/www/myapp
# Django's wsgi file
module          = myapp.wsgi
# the virtualenv (full path)
#home            = /usr/local/bin/virtualenv
home            = /home/username/.virtualenvs/virtualenvname

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /tmp/myapp.sock
# ... with appropriate permissions - may be needed
 chmod-socket    = 666
# clear environment on exit
vacuum          = true
```

ちなみにsudo抜きで

```bash
/usr/local/bin/uwsgi --ini myapp_uwsgi.ini --uid nginx --gid nginx
```
としたら問題なく動いたので謎は深まるばかり。
ちなみにOSはCentOS6.9。
#解決法
パーミッションの問題だったらしくて/home/usernameのパーミッションを700から755に変えたら動いた。
ただsudoなのになぜ動かないのはよくわからない。linuxのカーネルのパーミッションとかクレデンシャルの問題なのでしょうか。

#補足
No module named siteという同じエラーでも様々な症状があるらしくてまさにピンポイントの対処方法が検索に引っかからなかった。誰かの役に立てれば。
textを1行ごとに分けてListにする方法


コード

```sample0719.scala
object sample0719 {
  def main(args: Array[String]): Unit = {
    val bufferedSource = io.Source.fromFile("resources/textList.csv")
    var lists = bufferedSource.getLines.toList
    println(lists)
  }
}
```

csv

```textList.csv
test1
test2
test3
test4
```

terminal

```結果
List(test1, test2, test3, test4)
```
atomのvim-mode-plusでundoが戻りすぎる問題を解決する

## はじめに　
atomのvim-mode-plusはvimと同様、insert modeで色々変更した後にnormal modeに戻ってundoすると変更が全て戻ってしまいます。
以下のリンク2つ目のgifがわかりやすいです。
![vim_mode_plus_undo.gif](https://qiita-image-store.s3.amazonaws.com/0/169996/73ed7f7c-417b-f362-2535-eb8d29c97f8e.gif)

[Undo/ReDo behavior completely broken](https://github.com/atom/atom/issues/2689)
[overactive undo when vim-mode is enabled](https://github.com/atom/vim-mode/issues/346)

これが本当に不便だったので、なんとかすることにしました。

## 対応策
insertモードからnormalモードに戻るとundo履歴が区切られるようだったので、スペースとエンター（改行）を入力したときに、いったんノーマルモードに戻り、またインサートモードに入るようにしました。
スペースと改行の時に区切られて欲しかったので、今回はスペースと改行コマンドを改造してノーマルモードとインサートモードの移動処理を差し込みます。

## コード
init.coffeeにオリジナルコマンドを定義し、それをインサートモードのスペースとエンターに定義しなおします。
### .atom/init.coffee

```coffeescript

# undoに区切りをつけるため、キー実行前にvimのmodeを変える
atom.commands.add 'atom-text-editor.vim-mode-plus.insert-mode', 'custom:key-with-mode-change', (e) ->
  editor = @getModel()
  modeChange(editor)
  e.abortKeyBinding()

modeChange = (editor) ->
  view = atom.views.getView atom.workspace.getActiveTextEditor()
  column = editor.getCursorBufferPosition().column
  atom.commands.dispatch view, 'vim-mode-plus:activate-normal-mode'
  if column is 0
    atom.commands.dispatch view, 'vim-mode-plus:activate-insert-mode'
  else
    atom.commands.dispatch view, 'vim-mode-plus:insert-after'
```
### .atom/keymap.cson

```json
'atom-text-editor.vim-mode-plus.insert-mode':
  'space': 'custom:key-with-mode-change'
  'enter': 'custom:key-with-mode-change'
```

上記の設定を書き込むことでとりあえず使えるようになりました。
もしかしたら何かしらの不都合が起きるかもしれませんが、いったんこれで使ってみます。

※ 2017/9/13現在、vim-mode-plusの設定のgroupChangesWhenLeavingInsertMode のチェックを外す(デフォルトはチェック有り)ことでinsert modeのundo履歴を区切ることができます。
今回の実装はスペースと改行を打つとundo履歴を区切りますが、groupChangesWhenLeavingInsertModeは時間でundo履歴を区切るという違いがあります。

参考
* [1つのキーバインドで、同時に複数のコマンドを実行する](http://qiita.com/74th/items/160b011bbfcac77d4e3c)
* [Keymaps In-Depth](http://flight-manual.atom.io/behind-atom/sections/keymaps-in-depth/)
* [How to get cursor position as buffer offset (one dimensional, in chars)?](https://discuss.atom.io/t/how-to-get-cursor-position-as-buffer-offset-one-dimensional-in-chars/15892)

# 2017/07/21 追記
行頭にスペースや改行を入れる時にうまくいかなかったので、1列目の時の特別処理を追加

# 2017/08/06 追記
改行コードやスペースを`insertText`する処理だとc++などのコーディング時に変な挙動をしたため、`abortKeyBinding`で元の処理に戻すようにした

# 2017/09/13 修正&追記
t9mdさんの指摘を受け、
「atomのvim-mode-plusには2017/07/19現在、undoが戻りすぎるバグがあります。」
を
「atomのvim-mode-plusはvimと同様、insert modeで色々変更した後にnormal modeに戻ってundoすると変更が全て戻ってしまいます。」
に変更
「groupChangesWhenLeavingInsertMode」について追記
PHP Manual 読書会(11回目)(クラスとオブジェクト2)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回:[PHP Manual 読書会(10回目)(クラスとオブジェクト1)](http://qiita.com/amesho/items/e37050262d05ef272992)

## [クラスのオートローディング](http://php.net/manual/ja/language.oop5.autoload.php)

> 最大の問題は、各スクリプトの先頭に、必要な読み込みを行う長いリストを 記述する必要があることです
> PHP 5では、これはもう不要です。 spl_autoload_register() 関数で任意の数のオートローダーを登録できて、 クラスやインターフェイスが定義されていなくても自動的に読み込めるようになります。

`spl_autoload_register`を使用することによって長たらしい読み込み記述を書かなくて済むようだ。

同一ディレクトリに`Hoge.php`を置く。

```php
<?php

class Hoge
{
    public function say() {
        echo "hello hoge\n";
    }
}
```

`set_include_path`で同一ディレクトリをinclude pathへ追加

```php
<?php
set_include_path('./');
spl_autoload_register(function ($class_name) {
        include $class_name . '.php';
});

$obj  = new Hoge();
```

呼び出すことができる。
icloudに不明なエラーがでた時の対処

突拍子も無いことで、macとicloud　dirveの同期が外れてしまい、
パスワードを入力してもサインインもサインアウトもできない
よくわからない状況になったので対処してみた。
<br>
###1.セーフモードでmacを起動
>>セーフモードを使えば、Mac の起動が最後まで進まないという問題を解決したり、起動ディスクに関するその他の問題を切り分けたりすることができる。

セーフモードのやり方
https://support.apple.com/ja-jp/HT201262
(アップル公式より)

<br>
なのでやってみたらサインインはできた。
だが、環境設定>icloud　の中のicloud driveにチェックができない！！

<br>
###2.cloudを使っている全てのデバイスでicloudにログインし直す
調べてみると、全てのデバイスでicloudにろぐいんする必要があるみたい。
なので、ipod touchもログアウト、そしてログイン。
<br>
しかし、結果は変わらず・・・
<br>
どうしようもないので、そのまま２時間くらい放置してました。
すると、急にチェックができるように！
<br>
2をやったあとしばらく時間が必要だったのかも。
とりあえず直ってよかった。
dropbox-sdk-pythonが動かない時

# 症状
Python用のDropbox API v2を叩こうとするとエラーが出て何も出来ない

```python
ValueError: Timeout value connect was Timeout(connect=30, read=30, total=None),
but it must be an int, float or None.
```

# 対策
[Issuesを探すと見つかりました](https://github.com/dropbox/dropbox-sdk-python/issues/114)
requestsが古いとコケるようなので手動でアップデートしましょう(一緒にアップデートしてほしい)

```bash
$ pip install requests -U
```
[Pythonによる科学・技術計算] 非線形関数によるフィッティング, 状態方程式, scipy

scipy.optimizeのcurvefitメソッドを用いて， XYデータを非線形関数でフィットし， 最適なフィッティングパラーメータを得る。

目的: XYデータとして， 物質の体積(V)と圧力(P)データを準備し，
それを固体の体積・圧力の関係を表す[状態方程式](https://ja.wikipedia.org/wiki/%E7%8A%B6%E6%85%8B%E6%96%B9%E7%A8%8B%E5%BC%8F_(%E7%86%B1%E5%8A%9B%E5%AD%A6))の一つとして広く使われている[3次のバーチ・マーナガン状態方程式](https://en.wikipedia.org/wiki/Birch%E2%80%93Murnaghan_equation_of_state)へとフィットすることでフィッティングパラメータを求める。
この方程式は以下の形を持つ。

```math

P(V)=\frac{3}{2}K_0[(\frac{V}{V_0})^{-7/3}-(\frac{V}{V_0})^{-5/3}][1+\frac{3}{4}(K_d-4)((\frac{V}{V_0})^{-2/3}-1)]
```
$K_0, V_0, K_d$がフィッティングパラメータである。
また，X軸がV, y軸がPである。

**問題によって，コード中のフィット関数形の指定を変えれば，あらゆる関数形で最適なフィットパラメータを得ることができる。また，線形でのフィットももちろん可能。特殊な状況を除き，万能なコードとなる。**


```py3
import numpy as np
import scipy.optimize
import matplotlib.pylab as plt

"""
非線形関数によるカーブ・フィッティング
例: 圧力  vs 体積の関係を3次のバーチ・マーナガン方程式でフィッティングする
"""



x_list=[] # x_listを定義 (空のリストを作成)
y_list=[] # y_listを定義 (空のリストを作成)

f=open('EoS.dat','rt') # プロットしたいデータが入っているファイルをr(読み込み) t(テキスト)モードで読み込む

##  データを読み込み，x_listとy_listに値を格納する
for line in f:
    data = line[:-1].split(' ')
    x_list.append(float(data[0]))
    y_list.append(float(data[1]))
##
plt.plot(x_list, y_list, 'o',label='Raw data')

#フィッティング関数の指定
def fitfunc(V, V0, K0, K0d ):
    return (3.0/2.0)*K0*((V/V0)**(-7.0/3.0)-(V/V0)**(-5.0/3.0))*(1.0+(3.0/4.0)*(K0d-4.0)*((V/V0)**(-2.0/3.0)-1.0))


para_ini =[200.0, 100.0, 4.0] # フィッティングパラメータの初期条件


para_opt, cov = scipy.optimize.curve_fit(fitfunc, x_list, y_list, para_ini)#フィッティングパラメータの最適化

#得られたフィッティングパラメータの表示
print ("Fitted V0 =", str(para_opt[0]), "(Å^3)")
print ("Fitted K0 =", str(para_opt[1]), "(GPa)")
print ("Fitted K0' =", str(para_opt[2]))

##
# for plot
V0=para_opt[0]
K0=para_opt[1]
K0d=para_opt[2]

V1 = np.arange(min(x_list) - 1, max(x_list) + 1, 0.1)
y_fit = (3.0/2.0)*K0*((V1/V0)**(-7/3)-(V1/V0)**(-5.0/3.0))*(1.0+(3.0/4.0)*(K0d-4.0)*((V1/V0)**(-2.0/3.0)-1.0))

plt.plot(V1, y_fit, color='RED',linewidth=2.0, label='Fitted curve')

plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.grid(True)
plt.title("Curve fitting for eqaution of states")
plt.legend(loc='upper right')
plt.xlabel('Volume (Å^3)', fontsize=18)
plt.ylabel('Pressure (GPa)', fontsize=18)

plt.show()
```

###結果

Fitted V0 = 163.627068001 (Å^3)
Fitted K0 = 225.52189108 (GPa)
Fitted K0' = 4.06160382625


![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/3c469155-a3c9-18b4-2579-709f9701254a.png)




***
##[付録] 使ったEoS.datファイルの中身
```
164.26 0.0 
156.05 11.9 
147.83 27.9 
146.19 31.7 
144.55 35.7 
142.91 39.9 
141.26 44.4 
139.62 49.2 
137.98 54.2 
136.34 59.5 
134.69 65.1 
133.05 71.0 
131.41 77.3 
129.77 83.9 
128.12 90.9 
126.48 98.3 
124.84 106.2
123.20 114.4
121.55 123.2
119.91 132.5
118.27 142.3
116.62 152.6
114.98 163.6
113.34 175.2
111.70 187.5
110.05 200.6
```