OmniAICreator/Qiita-1.07M huggingface dataset:
topコマンドで複数CPUの状態を確認する

こんにちはsekitakaです。
複数コアのCPUのマシンを使っていて全てのコアが使用されているのか確認したくなることがあります。
`top`コマンドで確認できるかなと思ったのですが、1つ操作が必要だったのでまとめておきます。

普通に`top`コマンドを実行するとCPUが複数あっても以下ののように1つにまとまってしまう。

```
top - 00:23:17 up 27 min,  2 users,  load average: 3.18, 2.57, 1.66
Tasks: 216 total,   2 running, 214 sleeping,   0 stopped,   0 zombie
Cpu(s): 36.1%us,  1.5%sy,  0.3%ni, 61.9%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  15297432k total,  1556492k used, 13740940k free,    40388k buffers
Swap:        0k total,        0k used,        0k free,   529280k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1737 root      20   0 1659m 632m  51m R 308.8  4.2  58:41.02 firefox
 1423 root      20   0  274m  40m 8020 S  1.3  0.3   0:17.32 Xorg.root.bin
 1645 centos    20   0 27668 3204 1104 S  0.3  0.0   0:01.31 tmux
    1 root      20   0 19232 1512 1228 S  0.0  0.0   0:01.83 init
```

`top`コマンド実行後に`1`をタイプするとCPU毎の情報を表示できるようになります。
元に戻すには再度`1`をタイプ。

```
top - 00:24:04 up 28 min,  2 users,  load average: 2.45, 2.45, 1.67
Tasks: 216 total,   1 running, 215 sleeping,   0 stopped,   0 zombie
Cpu0  : 44.4%us,  2.7%sy,  0.0%ni, 52.6%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 38.4%us,  2.4%sy,  0.0%ni, 58.9%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 33.7%us,  0.7%sy,  0.0%ni, 65.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  : 30.7%us,  1.4%sy,  1.4%ni, 66.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  : 41.4%us,  3.4%sy,  0.0%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  : 36.0%us,  1.7%sy,  0.0%ni, 62.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  : 36.1%us,  0.7%sy,  0.0%ni, 63.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  : 30.2%us,  0.3%sy,  0.7%ni, 68.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  15297432k total,  1520440k used, 13776992k free,    40912k buffers
Swap:        0k total,        0k used,        0k free,   539524k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1737 root      20   0 1658m 591m  51m S 311.5  4.0  61:08.29 firefox
 1423 root      20   0  274m  40m 8020 S  1.3  0.3   0:18.01 Xorg.root.bin
 1940 centos    20   0 15128 1412  996 S  0.7  0.0   0:02.45 top
 1645 centos    20   0 27668 3256 1104 S  0.3  0.0   0:01.37 tmux
```
Ubuntu16.04で、Visual Studio Code をする

Visual Studio Codeを更新する。
すでにUbutnu16.04にインストール済みなので、
パッケージを更新する。

1.最新のパッケージをダウンロード
 ( https://code.visualstudio.com/ )
 
2.更新適用
  sudo dpkg -i code_(LatestVersion)_amd64.deb
DatastoreのプロジェクションクエリをGoon経由で発行してはいけない

GoonはGoogle Cloud Datastoreを読み書きするための薄いラッパーパッケージで、GAE/Go+Datastoreの環境で力を発揮します。詳細は以下の記事が参考になります。

- [GAE/Goの自動キャッシュ付きDatastoreライブラリGoonを使う - Qiita](http://qiita.com/soundTricker/items/194d4067b0e145544b56)

そんなGoonですが、表題の通りプロジェクションクエリとの相性が良くありません。クエリの種類に応じて`func (q *Query) Run(c context.Context)`と`func (g *Goon) Run(q *datastore.Query)`とをプログラマが使い分ける必要があります。

## プロジェクションクエリとは

Datastoreはカラム指向のNoSQLで、インデックス機能によるデータのソートやフィルタにも対応しています。また、RDBMSで言うマルチカラムインデックスを作ることもできます（カスタムインデックス）。

さらに、検索クエリがRDBMSで言うCovering indexになっている（＝インデックスだけで結果を返せる）場合は費用面で低コストになるメリットがあります[^1]。このようなクエリはプロジェクションクエリと呼ばれ、次のようなクエリで実現できます。

```go
	q := datastore.NewQuery("post").Project("bbs_id", "updated_at").Order("-updated_at")
```

この例では、`post`というKindについて、`bbs_id`と`updated_at`の2プロパティのみを取り出し、`updated_at`で降順ソートして全件取り出しています。

## プロジェクションクエリとGoonの相性

ところで、このクエリをGoonのRunメソッドで実行してしまうのは混乱の元です。

というのも、GoonはDataStoreに対するキャッシュ層を2段持っています。

- インプロセスのキャッシュ（1段目キャッシュ）
- memcached（2段目キャッシュ）
- Datastore

GoonのRun/Next/GetAllメソッドでデータを取得した場合、その結果は全てインプロセスのキャッシュに乗ってしまいます。ところが、プロジェクションクエリでは一部のプロパティについてのみ値がセットされ、取れなかったプロパティについては全てゼロ値が返ってきます。この不完全な結果がキャッシュされてしまうと、以後の処理で同じエントリの値を取得しようとしてもキャッシュヒットしてしまって正しい値が取れないトラブルが起こってしまうのです。

つまり、プロジェクションクエリの場合はdatastoreパッケージのRunメソッドを使ってキャッシュに乗らないようにし、通常のクエリの場合はGoonのRunメソッドを使ってキャッシュの恩恵を受ける、という使い分けが必要になります。

## 補足：Goonでキーオンリークエリを使う

ちなみに、キーオンリークエリについてはGoon側で考慮されているので、Goon経由で使っても問題はありません。

``` go
	q := datastore.NewQuery("post").KeysOnly().Filter("bbs_id =", b.ID).Order("-updated_at")
	t := g.Run(q)
	for {
		k, err := t.Next(nil)
		// ....
    }
```

このように、キーオンリークエリではNextメソッドの第一引数にnilを渡せばキャッシュされません。

また、GetAllメソッドでは内部的にキーオンリークエリかどうかの判定を行っており、結果がキャッシュされないように実装されています。


## 参考資料

- [Projection Queries](http://projqueries.aju-slides.appspot.com/)

[^1]: 「[データストアのクエリ  |  Cloud Datastore のドキュメント  |  Google Cloud Platform](https://cloud.google.com/datastore/docs/concepts/queries)」によれば「distinct on 句を使用しないプロジェクションクエリは小規模な操作であり、クエリ自体については 1 回のエンティティ読み取りとしてカウントされます」とのことなので、1000件取得しても1件読み込みのお値段ということになります。つまり、通常クエリをプロジェクションクエリにすれば最大99.9%プライスダウンです。オトクすぎますね。
CentOS6 Supervisor Install and Active.

#備忘

##EPEL インストール
https://fedoraproject.org/wiki/EPEL/ja 
より下記文言のリンクをコピー
EL6 epel-release

```bash:bash
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
```
##Supervisorインストール
```bash:bash
yum -y --enablerepo=epel install supervisor
```
##Supervisor起動
```bash:bash
service supervisord start
```
##Supervisor実行
```bash:bash
supervisorctl start all
```
ターミナルで一つ前にいたディレクトリに戻るコマンド。

ターミナルで一つ前にいたディレクトリに戻るには```cd ../```が使えることがわかりました。

例えば、ホームディレクトリの
```/Users/your_user_name```にいたとして、
```cd ~/Desktop/```でデスクトップに移動しても、
```cd ../```を使えば、一つ前にいたディレクトリの```/Users/your_user_name```に戻れます。
MySQL 基本

MySQL
データベースの作成
テーブル作成
--------以下Railsが操作
データ登録
データ抽出
リレーション
データ検索
データ更新
データ削除

-------------

```ruby:


desc テーブル名 ;

select * from テーブル名 ;

```


-------------

```ruby:
mysql -u root -p

```


```ruby:


create database mysql_example;
show databases;
use mysql_exercise;
show tables;

```


create databaseコマンドでデータベースの作成ができる。
useコマンドで操作するデータベースを指定する。


```ruby:

create table users(
id int auto_increment primary key,
name varchar(255)
);
create table posts(
id int auto_increment primary key,
user_id int,
message text
);
show table;

```


create tableコマンドでテーブルの作成ができる。

```ruby:

desc users;
desc posts;

```

descコマンドでテーブル構造の確認ができる。


```ruby:


insert into users (name) values ("Taro"),("Jiro");
insert into posts (message,user_id) values
("message1" by Taro,1),
("message2" by Taro,1),
("message1" by Jiro,2),
("message2" by Jiro,2);


```



insert intoコマンドでテーブルにデータを登録することができます。

```ruby:


select * from users;
select * from posts;


```


selectコマンドでテーブルのデータを確認することができます。

```ruby:


select * from posts where id =3;
select * from users where id =2;


```



postsテーブルのisが3のデータに関連付けられたusersテーブルのデータを抽出するために2回selectコマンドを実行しています。
※Webフレームワークにはリレーションという仕組みがあり、その仕組みを利用すると関連する別のテーブルのデータを簡単に取得することができます。

```ruby:

select * from posts where posts.message liki "%Taro%",

```



postsテーブルのmessageフィールドのデータの中でTaroという文字列が含まれるものを抽出しています。

```ruby:
update users set name ="TARO" where id = 1;
select * from users;

```




updateコマンドでデータを変更することができます。

```ruby:


delete from users wher id = 1;
select * from users;

```

deleteコマンドでデータを削除することができます。

```ruby:
truncate table post;
select * from posts;

```

truncateコマンドでテーブルの全データを削除することができます。

```ruby:
exit
```
技術英語 > you use the boolean operators [and, or, and not] to ... > Boolean Operations — and, or, not

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2023 / 12833)

> you use the boolean operators **and, or, and not to** ...

2つめのandは`A, B, and C`のandなのだろうか。
(A = and, B = or, C = not)
意訳「bool演算子であるandとorとnotを使って...」
(疑問点: and, or, notはbool演算子とみなせるのだろうか)

(追記 2017/03/01)
https://docs.python.org/2/library/stdtypes.html
> 5.2. Boolean Operations — and, or, not

---

あるいはboolean operatorsから数えて`A, and, B, and C`と見る。
(A = boolean operators, B = or, C = not)
意訳「bool演算子とorとnotを使って...」

英文法として前者の方(A, B, and C)の使用をよく見かける。
アプリケーション　基本動作

- 登録画面の処理
- ログイン、ログアウトの処理
- 登録情報修正処理
- メッセージ作成画面の処理
- トーク画面、メッセージ一斉削除処理
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
- 投稿データ削除時の確認ダイアログ
- アクセス時にページの一番下まで自動スクロール
- プロフィール画像を丸形に変更
- バリデーション
- Flashメッセージ
- ルーティングのルート制限
- 特定のルートに対し認証済みユーザーのみアクセスを許す
- －－－－－－－－－－－－
- 投稿一覧と投稿処理内容
- 投稿削除
- コメント機能
- 検索機能
- －－－－－－－－－－－－
- ホーム画面作成
- 登録画面、登録修正画面作成
- メッセージ作成画面、トーク画面作成
- ログイン画面作成
- －－－－－－－－－－－－
- Ver1,Ver2,Ver3,Ver0
アプリケーションの作成２

```ruby:app/views/layouts/application.htmlerb


```

app/views/layouts/application.htmlerb
から「window.scrollTo(0.document.body.scrollHeight);」を削除。
投稿一覧画面では新しい投稿が上に表示されるような並び順にするため、「window.scrllTo(0.docment.body.scrollHeight);」の自動スクロール処理を削除した。

```ruby:app/assets/stylesheets/mystyle.css


```

app/assets/stylesheets/mystyle.cssにコード追加。

```ruby:
.btn-space-20 {
  margin-top: 20px;
}

```
投稿一覧画面の新しい投稿ボタンの位置調整に使います。

```ruby:app/views/layouts/_navbar.html.erb


```
app/views/layouts/_navbar.html.erb
のテキスト変更
「+投稿一覧」

```ruby:app/views/posts/show.html.erb


```

app/views/posts/show.html.erbを作成し次のコード入力。
show.blade.phpを新規作成します。投稿に対するコメントを表示する箇所は後で追加します。

```ruby:app/controllers/posts_controller.rb


```

app/controllers/posts_controller.rbからコード削除

```ruby:
def delete_all_post
  Post.delete-all
  redirect_to posts_path
  end
end
```

派生アプリでは全投稿を削除すつボタンは使用しないので削除します。

```ruby:app/controllers/posts_controller.rb


```

app/controllers/posts_controller.rbのindexを次のコードに変更

```ruby:
def index
  @post = Post.all.order(created_at: :desc)
end
```

order(created_at: :desc)を使って新しい投稿が上に来るようにソートする。

```ruby:app/controllers/posts_controller.rb


```

app/controllers/posts_controller.rbに次のコード追加。

```ruby:
def show
  @post = Post.find(params[:id])
end
```

新しい画面（投稿内容）のためのshowアクションを追加します。

```ruby:config/routes.rb


```
config/routes.rbから次のコード削除。

```ruby:
post "delete_all_post" => "post#delete_all_post"
```
delete-all_postアクションを削除したので、ルートも削除。
さらに、次のコードを変更
showアクションを追加したのでルートも追加。
```ruby:config/routes.rb
resources :posts, only: [:index, :new, :create, :show]
```
app/controllers/posts_controller.rbに次のコード追加。
せんたくされた投稿を削除するための処理。

```ruby:app/controllers/posts_controller.rb
def destroy
  @post = Post.find{params[:id]}
  @post.destroy

  redirect_to posts_path
```
config/routes.rbのコード変更。
destroyアクションのルートを追加します。
```ruby:config/routes.rb
resources :posts, only: [:index, :new, :create, :show, :destroy]
```
app/views/posts/indwx.html.erbの次のコードを変更。
action属性にPostControllerのdestroysアクションのルート設定。
destroyアクションにパラメータとしてpost.idを渡す。

```ruby:app/views/posts/indwx.html.erb
<form action="<%= post_path(:id => post.id) %>" method="post">
```

rails g model Commentを実行。
Commentモデルのほかにcommentsテーブルのマイグレーションスクリプトも生成されます。

```ruby:
rails g model Comment
```

app/models/comment.rbのCommentクラスに次のコードを追加。
UserとCommentは1対多の関係があり、Commetは多側なのでリレーションの定義ではbelongToを使います。

```ruby:app/models/comment.rb
class Comment < ApplicationRecord
  belong_to :user

  validates :message, presence: true
end
```
copy.copyとcopy.deepcopy

#copy.copyとcopy.deepcopy
##1. pythonにおけるcopy
pythonのlist型やdict型のコピーは少しややこしい。一般的に、これらのオブジェクトのコピーとしては,
1. =を用いた参照の値渡し
2. copy.copy()を用いた浅いコピー
3. copy.deepcopy()を用いた深いコピー
の３つがある。理解した範囲で結論から書くと、
__=は単なる参照の値渡しで、copy.copy()は一番上層のオブジェクトだけを新しく作成して中のオブジェクトは参照の値渡し、copy.deepcopyは最下層まで、全てのobjectが新たに作られて渡される。__
ということだと思う。

実際に挙動の詳細を２次元配列を用いて確認する。
まず、hoge = [[1,2,3],[4,5,6]]という２次元配列を上記の3つの手法でコピーし、id()でオブジェクトの場所を確認すると、

```py
>>> hoge = [[1,2,3],[4,5,6]]
>>> fuga   = hoge
>>> piyo   = copy.copy(hoge)
>>> hogera = copy.deepcopy(hoge)
>>> id(hoge) == id(fuga)
True
>>> id(hoge) == id(piyo)
False
>>> id(hoge) == id(hogera)
False
```

となる。=でコピーされたfugaはhogeと同じ場所にあるオブジェクトを参照しているのに対し、copy.copy()及び、copy.deepcopy)()でコピーされたpiyoとhogeraそのものは異なる場所にあるオブジェクトを参照していることがわかる。
中の要素の場所はどうなってるかというと

```py
>>> id(hoge[0]) == id(piyo[0])
True
>>> id(hoge[0]) == id(hogera[0])
False

```
となり、copy.copy()でコピーされたpiyoの要素の参照先は、hogeと同じになっているのに対して、hogeraでは異なる。つまり、中の要素においても新しいlistオブジェクトが生成されたことがわかる。

##2. 一部の要素を共有した２次元配列
挙動の違いは分かったが、実際どんなときにcopy.copyとcopy.deepcopyを使い分けるのか。全部deepcopyにしとけばいいのではないか。ということで無理やりcopy.copyを使う例を考えてみた。コードはさっきまでの続き

```py
>>> piyo.append([7,9,11])
>>> hoge.append([8,10,12])
>>> piyo
[[1, 2, 3], [4, 5, 6], [7, 9, 11]]
>>> hoge
[[1, 2, 3], [4, 5, 6], [8, 10, 12]]
>>> id(hoge[0]) == id(piyo[0])
True
>>> id(hoge[1]) == id(piyo[1])
True
>>> id(hoge[2]) == id(piyo[2])
False
>>> hoge[0][1] = 20 #hogeの0番目のlistの２番目の要素を20にする。
>>> hoge
[[1, 20, 3], [4, 5, 6], [8, 10, 12]]
>>> piyo
[[1, 20, 3], [4, 5, 6], [7, 9, 11]] #piyoの0番目のlistの２番目の要素も変わる。
>>> hoge[2][1] = 20 #hogeの2番目のlistの２番目の要素も20にする。
>>> hoge
[[1, 20, 3], [4, 5, 6], [8, 20, 12]]
>>> piyo
[[1, 20, 3], [4, 5, 6], [7, 9, 11]] #piyoには影響しない。
```
上の挙動からもわかるが、このときhogeとpiyoの間では、０番目の1番目の要素(list)の情報は共有されている(参照先が同じになっている)が、2番目以降の要素(list）は異なるという状態になっている。つまり、一部の要素だけ共有した2次元配列を作成できている。こんな風に、一部の要素だけ共有するような多次元listもしくはdictをつくるときは、最初に共通する部分だけを持ったオブジェクトをつくって、copy.copy()でコピーするのがいいのかもしれない。メモリの節約にもなる。

そんなことするくらなら、クラスつくって、クラス変数とインスタンス変数で分ければいい気もするけど、、
Alembic(DBのスキーマ管理ツール)導入メモ

マイグレーション用のupgrade,downgradeスクリプトを手書きとかして疲弊したくないので、Alembicを導入してみたメモ。

AlembicはSQLAlchemyのマイグレーション用スクリプトとサーバの状態から、upgrade,downgrade差分を自動で生成してくれる素敵なツールです。
#インストール
導入はpipで終わります

```
pip install sqlalchemy
pip install alembic
```

お使いのSQLに合わせて、python用SQLドライバーを入れておく必要があります（サーバとの差分を取るため、SQLサーバと接続できる必要があります）

今回はMySQLで使用しました。

```
pip install pymysql
```

#初期設定
alembic initコマンドで、作業用ディレクトリを作成します。

```
alembic init [作業ディレクトリ名]
```

alembic.iniファイルと指定した作業ディレクトリが作成されます。作業ディレクトリの中にはenv.pyという設定ファイルが有りますので、このファイルとalembic.iniの２つのファイルを編集します。

まず、alembic.iniはMySQLへの接続の設定を記述します。sqlalchemy.urlのところを書き換えます。

```
sqlalchemy.url = mysql+pymysql://ユーザー名:パスワード@ホスト名:ポート/DB名
※:ポート名は省略可能
```

DB名まで指定が必要です。このiniファイルは複数用意しておいて実行時に使い分けることができるので、DBごとにiniファイルを用意しておくことで対応できます。

続いて、作業ディレクトリの中のenv.pyを書き換えます。# add your model's MetaData object hereというコメント行があるので、その下にtarget_metadataという変数に対してSQLAlchemy用のDB定義用スクリプトのMetaDataクラスのインスタンスを登録します。

ちょっとわかりにくいかもしれませんので、まずは、サンプルのSQLAlchemy用のDB定義スクリプト

```python:sample.py
from sqlalchemy import MetaData, Table, Column, Integer, String, DateTime, Float, Boolean, Text
from sqlalchemy.dialects.mysql import TINYINT, SMALLINT

meta = MetaData()

Table(
  'status', meta,
  Column('account_id', Integer, primary_key=True, autoincrement=False),
  Column('hp', SMALLINT, nullable=False, server_default='30'),
  Column('weapon_id', SMALLINT, nullable=False, server_default='1'),
  Column('weapon_lv', TINYINT, nullable=False, server_default='0'),
  Column('armor_id', SMALLINT, nullable=False, server_default='1'),
  Column('armor_lv', TINYINT, nullable=False, server_default='0'),
)
```
というのがあったとして、

```python:env.py
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
import sample
target_metadata = sample.meta
```
というように記述します。

#マイグレーション用スクリプト生成
sample.pyファイルをimportするため、ファイルのある場所をPYTHONPATHに指定する必要があります。カレントにある場合も、.の指定が必要です。

```
PYTHONPATH=. alembic revision --autogenerate
```
alembic.iniを複数用意する場合、ファイル名を変えたのち--configオプションで指定します。

```
PYTHONPATH=. alembic --config iniファイル revision --autogenerate
```

--autogenerateをつけることによって、作業ディレクトリの中のversionsというディレクトリの中に、現在のサーバと指定したSQLAlchemyスクリプトとで差分をとって、upgrade,downgradeを含んだスクリプトを自動生成してくれます。

後は、iniファイルで指定したマイグレーションの元となるファイルを編集しては、alembic revisionコマンドで差分ファイルを生成していきます。
間違えて変な設定するスクリプト作っちゃっても、作ったばかりなら生成されたファイルを消すだけでなかったことにできます。
※downgrade用に前バージョンのファイル名が記述されているので、途中のファイルを消すときは修正が必要

#サーバに適用
alembic revisionで作ったスクリプトはalembic upgradeを使ってサーバに適用することができます。upgradeやdowngradeで好きなrevisionにすることができますが、たいていは最新バージョンで更新すると思います。最新版にするにはheadと指定します。

```
PYTHONPATH=. alembic --config iniファイル upgrade head
```

#バージョンがおかしくなった時の修正
alembicはDBにalembic_versionというテーブルを作って、version_numにファイル名(最後の_は除く)を格納しているだけのシンプルなバージョン管理です。

なので、DBを最新版の形に合わせたのちversionsの中の最新のファイル名をversion_numに設定すれば、バージョンのズレはなくなります。

作業ディレクトリ下のversionsの中のスクリプトと、DBの中のalembic_versionテーブルを削除すれば、alembicによる設定はなかったことにできます。
Rubyでオープンクラスに警告を出す

ピピー！✋👮 こちらオープンクラス警察です。

```rb:open_class_alarm.rb
module OpenClassAlarm
  @status = :disable
  @modules = ObjectSpace.each_object(Module).to_a

  def self.enable
    @status = :enable

    if block_given?
      yield
      disable
    end
  end

  def self.disable
    @status = :disable
  end

  TracePoint.trace(:class) do |tp|
    if @modules.include?(tp.self)
      if @status == :enable && tp.self.instance_of?(Class)
        warn "#{tp.path}:#{tp.lineno} found open class `#{tp.self}'"
      end
    else
      @modules << tp.self
    end
  end
end

OpenClassAlarm.enable

class String
end
```

出力

```
open_class_alarm.rb:31 found open class `String'
```

検知する範囲をブロックで囲むことも出来ます。

```rb
OpenClassAlarm.enable do
  class String
  end
end

class Hash
end
```

出力

```
open_class_alarm.rb:30 found open class `String'
```

https://github.com/jeremyevans/ruby-refrigerator を見て

:thought_balloon: 「TracePointを使って似たようなことが出来そうだな」

と思い作ってみました。

ついでにgemも作りました。

https://github.com/siman-man/open_class_alarm
Nginxで鍵の掛かったPEMファイルを使用する際の設定ファイル


## はじめに

最近某社で扱ってるサービスのインフラ整備を気が向いたので久しぶりにしようと思ってCTO様にお話を頂いてやってみた時の話です。

## 環境

- Azure
- Ubuntu 16.04 LTS
- Nginx 1.10.1

## 前置き

Nginxの設定上で __ssl_certificate_key__ に設定するPEMファイルに鍵が掛かっているのを知らなくて以下コマンドは実行してもOKはでるが __[SSL Server Test](https://www.ssllabs.com/ssltest/)__ でBが返ってくる。

```bash
$ sudo /etc/init.d/nginx reload
```

## Nginx test

Nginxには設定ファイルがちゃんと動くものになっているかテストしてくれるコマンドが用意されているので実行してみます。

```bash
$ sudo nginx -t
Enter PEM pass phrase:
```

お？鍵がかかっている。ということでちょっとCTO様に確認。パスワードを教えてもらった。

```bash
$ sudo nginx -t
Enter PEM pass phrase:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

通った。しかしこれだけではさっきと一切SSLのランクは変わらない。

### 解決策

http://stackoverflow.com/questions/33084347/pass-cert-password-to-nginx-with-https-site-during-restart

いつも通りググったらすぐにでてきた。

ちなみに公式さん→ http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_password_file

とりあえず `server` の中に `ssl_password_file` を追加したらいいらしい。

```:/path/to/password_file
password_dayo
```

ぶっちゃけこんな感じのパスワードはあり得ないしファイル名もあり得ないけどこんな感じだったとしよう。

以下Nginx設定

```:nginx.conf
server {
    listen 443 ssl;
    ssl on;
    server_name hoge.example.com;
    
    ssl_certificate /path/to/certificate.cert;
    ssl_password_file /path/to/password_file; # PEMファイルより前に定義するべき(?)
    ssl_certificate_key /path/to/certificate_key.pem # こいつに鍵がかかっている
    
    # 以下略
}
```

あとはいろんなことして頑張って __A+__ 目指しましょうね :sushi:

## 最後に

定期的に http://nginx.org/en/CHANGES 見ておくべきですね。
というかもっとNginxについて知見溜めたいです。
HAL_Driverでu485通信を実装する

## HAL_Driverでu485通信を実装する

* HAL_Driverを使ってu485の通信を実装します
* u485の通信を実装する場合はUartに加えてピンの制御が必要になります
* 使用するマイコンの使用に合わせて各ピンの設定をしていることを前提としています

## 環境

* stm32f系のマイコン
* HAL_Driver

## u485通信時のピン制御

* 受信時はdeピン,reピンをLowにする
* 送信時はdeピン,reピンをHighにする
* 各ピンをHighにする場合はreピン, deピンの順番でHighにする
    * deピンだけがHighになる状態にしない

## 実装

* UARTで使用するTx, Rxのピンに加えてRE, DEのピン設定をOUTPUTに設定します
    * ピンの設定はCubeMX等を使用すると良いです

* UARTハンドルを含む構造体を宣言しておくと便利です

```c

typedef struct {
  UART_HandleTypeDef* huart;
  uint32_t de_pin;
  uint32_t re_pin;
  GPIO_TypeDef* de_port;
  GPIO_TypeDef* re_port;
} u485_HandleTypeDef;

```

* 送信時は送信前に各PINをHighにします

```c

// ピン設定は各環境に合わせてください
#define RE_PIN GPIO_PIN_XX
#define RE_PORT GPIOB
#define DE_PIN GPIO_PIN_XX
#define DE_PORT GPIOB

#define TIMEOUT 100

void u485_transmit(u485_HandleTypeDef* hu485, uint8_t* tx_buffer, uint16_t tx_size) {
  // 送信を有効にする
  HAL_GPIO_WritePin(hu485->re_port, hu485->re_pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(hu485->de_port, hu485->de_pin, GPIO_PIN_SET);

  // 送信
  HAL_UART_Transmit(hu485->huart, tx_buffer, tx_size, TIMEOUT);

  // 受信待機状態にする
  HAL_GPIO_WritePin(hu485->de_port, hu485->de_pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(hu485->re_port, hu485->re_pin, GPIO_PIN_RESET);
}

bool u485_receive(u485_HandleTypeDef* hu485, uint8_t* rx_buffer, uint16_t rx_size) {
  // 受信
  return HAL_UART_Receive(hu485->huart, rx_buffer, rx_size, TIMEOUT) == HAL_OK;
}
```
NefryでGrove IR Distance Interrupter (赤外線距離センサ)を触るメモ


[前回](http://qiita.com/n0bisuke/items/257126448cf4db482d43)に続き、[Nefry](https://dotstud.io/shop/nefry-connect-internet/)でGroveの赤外線距離センサを使ってみます。

## Grove - IR Distance Interrupter

* http://wiki.seeed.cc/Grove-IR_Distance_Interrupter_v1.2/

![](https://i.gyazo.com/260262d4b614c3770e1cbd5e144dc7b9.png)

スペックはこんな感じです。 Nefryだと3.3V対応しているセンサを使えるのでこのセンサーは問題なく使えます。

```
Parameter	Value
Operating voltage(V)	3.3 or 5 Volts
Operating current(mA)	Maximum: 20 mA
Effective detectable distance	7.5–40 cm
Reflective photosensor	datasheet
Output operational amplifiers	datasheet
Weight	2.5 g(for the module), 8.5 g(for all single package)
```

## 近くにものがあるとライトがつく人感センサっぽいものを作る

![](https://i.gyazo.com/ab787816c6c040e25e55662c53916a1d.gif)

Arduinoのサンプルプログラムに毛が生えたくらいですが以下がプログラムになります。

```
#include <Nefry.h>

void setup()  {
  Nefry.println("Grove IR Distance Interrupter !");
  Nefry.setLed(0,0,0);
  pinMode(12,INPUT); //D4ポート -> 12
}

void loop()  {
    while(1)  {
        Nefry.ndelay(500);
        if(digitalRead(12)==LOW)  {
            Nefry.println("Somebody is here.");
            Nefry.setLed(255,255,255);
        }
        else  {
            Nefry.println("Nobody.");
            Nefry.setLed(0,0,0);
        }
    }
}
```
pythonの参照について

#Pythonでつまづいたこと

コメントでも指摘されているが、前提としてPythonにそもそも参照渡しは存在しない。以下の記事を参考。
https://qiita.com/raccy/items/d4c5e7995a8fc90109ee#_reference-de4299be58ab9d936fcb

本記事は、明らかに理解不足のときに書いたこともあって不正確な部分が散見されるが、まぁ当時どのように抱えた疑問と向き合ったのかのメモとして残しておきたい（メモを残すのはよくないのかもしれないが）。

##参照渡しとか言う謎
pythonを始めたころに、一番につまづいたのが、いたるところでよく見られる「pythonの引数は全て参照渡しである」という謎の説明である。参照渡し自体はなんとなく理解できた。ただ、pythonで以下のコードを動かすと、、、
    
    >>> a=1
    >>> b=a
    >>> b=2
    >>> print(a,b)
    1,2

となる。 まぁ当たり前という気がするが、参照渡しだとすると納得がいかない（そもそも参照渡しではなかったのだから納得が行かないのは当然でであったようだ。。）。 何故なら、参照渡しなら

    >>> a=1
    >>> b=a
    >>> b=2
    >>> print(a,b)
    2,2　 

となるはずだからだからである（当時のこの理解はあっていたっぽい）。「参照渡しで b=aなら、bもaも同じメモリを共有しててbが書き換わったらaも書き換わるんじゃないの？」と思っていたのである。実際、listで似たようなことをするとそうなる。

    >>> a=[1,2,3]
    >>> b=a
    >>> b[0]=5
    >>> print(a,b)
    #[5,1,2],[5,1,2] 

参照渡しなら、そうなるだろうという挙動である。ってことは、複数の要素が入りうるものは参照渡しで、数値型だけ違うのかと思って,以下のコードでa,bのメモリの場所を調べてみると、、、、

    >>> a=1
    >>> b=a
    >>> print(id(a)==id(b))
    True
    >>> b=2 
    >>> print(id(a)==id(b))
    False

ということで b=a とした時点ではbもaも同じ場所を参照していることになる。が、ｂ=2とすると、bは新たに作られた2という値を持つint objectの場所を参照するようになる。一方で、aは元の場所を参照し続ける。なるほど納得。しかし、今度はlistの例の方が分からなくなる。そこで、調べてみると

    >>> a=[1,2,3]
    >>> b=a
    >>> a_0=a[0]　
    >>> b[0]=5
    >>> print(a[0])
    5
    >>> print(id(a)==id(b))
    True
    >>> print(id(a[0])==id(a_0))
    False 
    >>> b=[4,5,6]
    >>> print(id(a)==id(b))
    False
    

これでやっと納得。つまり。
1. b=aの時点ではbもaと同じ場所を参照する
2. b[0] = 5とすると新たに5という値を持つint objectが作られて、b[0]は新たにその場所を参照するようになる。
3. このとき、aもbも同じ場所を参照しているため、b[0]が新たに参照した場所をa[0]も参照する。
4. b=[4,5,6]とすると、新しいlist オブジェクトが作成されるためbはその場所を参照する。このときaはもとの場所を参照し続ける。
という挙動になっているようだ。

長々と書いたけど、つまり、
__変数に新たなオブジェクトそのものが代入されるときには、これまでの参照先から変わって新たなオブジェクトが作られた場所を参照するようになる。__
で実務的には問題ないはず。
JSをテストするCargoの拡張機能を書いてみた話

# Introduction

皆さんよいrustライフをお送りでしょうか！

rust 1.14のリリース以降、かんたんにasm.js及びwasmのコードが吐けるようになりました。ところがまだJavascript側とのブリッジになるようなライブラリはあまり（？）ないようです。そこで[ここ](http://0x90.hatenablog.jp/entry/2017/02/28/232813)とかにもちょくちょくメモしているのですが、Emscriptenの関数を叩いてJS側との橋渡しをする[rustのライブラリ](https://github.com/hajifkd/emval-rs)をちょろちょろ書いています。

この際に気になったのがtestです。[こちら](http://qiita.com/skitaoka/items/498c6bd1ac9d3b7ca6c9)の記事によくサマライズされていますが、rustはいい感じのテスト方法を持っています。しかし、targetをasmjsにするとこれが途端に使えなくなってしまいます。更に贅沢を言うと、ブリッジコードのテストもしたいのでJS側のコードも予め読んでおきたいように思います。

ということで、これらを何とかするためにCargoのsubcommandを作ってみました。

# 注意

筆者もまだrust歴が極めて浅いのであまりrustっぽくないコードを書き散らしている可能性があります。気になる点などありましたらぜひご教授ください。

# Cargoとは

言わずと知れたRustのすごいやつです。Subcommandの作り方の詳細（？）は[拙ブログ](http://0x90.hatenablog.jp/entry/2017/02/28/235753)にまとめてみたのですが、Cargoにはかんたんにsubcommandを追加できる機能があります。


shell scriptかpythonあたりでちょちょっと書いてしまったほうが楽かもしれないけど
今回はせっかくなのでrustを使って新しいsubcommand, `testjs`を作ってみました。

# インストール

crates.ioに登録したので（ちなみにすごく簡単でした）、cargo経由でinstallできます。

```shell-session
$ cargo install cargo-testjs
```

# 使い方

Emscriptenが有効になっている環境で、プロジェクトのルートディレクトリに行き

```shell-session
$ cargo testjs
```

するだけです。設定は、次の3つをCargo.tomlに書けます。

```toml:Cargo.toml
[package.metadata.testjs]
node = "nodejs"
target = "asmjs-unknown-emscripten"
prelude = "tests/test.js"
```

それぞれの設定ですが、

## node

nodejsのコマンド。絶対パス指定か、パスが通っている必要がある。デフォルトはnode。

## target

デフォルトはasmjs-unknown-emscriptenだが、wasmにしてもそもそも現時点では動かないのであんまり意味がないｗ

## prelude

testを実行する前に読み込むべきJavascriptファイル。

# 例

テストの例も書いてみました。

https://github.com/hajifkd/testjs-example

# 終わりに

rustは楽しいです。もしかしたらこれくらい誰かが書いてるかな～ってものも意外となかったりするので（とはいえこのsubcommandはどうだか調べてはいないので車輪の再発明をした可能性はあるｗ）、ライブラリを書くのも面白いかもしれません。ではでは。
JuliaでMatlabのMATファイルを読む

**MAT.jl**というパッケージを利用すると，（おそらく）一部の形式で書かれたデータを読むことができます．

- [MAT.jl / github](https://github.com/simonster/MAT.jl)

Matlabのデータファイルを一部でも読めると，次のような嬉しさがある場合があります．

- MatlabのプログラムをJuliaで書き直すが，Matlabで作る人工テストデータも一緒に持ってきたい
- Matlabのコードでランダム生成したデータをそのままJuliaに持ってきたい（乱数がうまく制御できないため，人工データだけはMatlabで作りたい）
- Matlabのデータ形式(拡張子mat)で行列が配布されているので，Juliaで読みたい・操作したい

```matlab
a = full(sprand(10, 5, 0.5))
save("a.mat", "a", "-V6")

% aの中身の例
   0.00000   0.19501   0.43008   0.00000   0.99290
   0.00000   0.00000   0.41530   0.00000   0.00000
   0.03694   0.44592   0.00000   0.00000   0.10643
   0.64455   0.98242   0.52705   0.66157   0.00000
   0.00129   0.99386   0.15698   0.00000   0.00000
   0.95067   0.41919   0.00000   0.34563   0.94855
   0.84108   0.71847   0.61328   0.02859   0.00000
   0.00000   0.00000   0.00000   0.00000   0.00890
   0.00000   0.00000   0.00000   0.00000   0.00000
   0.92218   0.00000   0.00000   0.00000   0.26231
```


```julia
file = matopen(data_sample/a.mat)
# MAT.MAT_v5.Matlabv5File(IOStream(<file data_sample/a.mat>),false,#undef)

a = read(file, "a")
# 10×5 Array{Float64,2}:
# 0.0         0.195015  0.430079  0.0        0.992902
# 0.0         0.0       0.415298  0.0        0.0
# 0.0369418   0.445923  0.0       0.0        0.106427
# 0.644554    0.982418  0.527051  0.661571   0.0
# 0.00129234  0.993864  0.156979  0.0        0.0
# 0.950667    0.419189  0.0       0.345633   0.948547
# 0.84108     0.71847   0.613283  0.0285883  0.0
# 0.0         0.0       0.0       0.0        0.00890422
# 0.0         0.0       0.0       0.0        0.0
# 0.922183    0.0       0.0       0.0        0.262313
```
Vue.jsのインラインコンポーネントでハマったこと

Vue.jsでインラインコンポーネントを作っていてハマッタので自戒を込めてメモします。

こんな感じのコンポーネントをHTML内にインラインで書いてみたんですよ。

```html:html
<main id="app">
    <table>
        <item v-for="item in list" :hoge="item.hoge"></item>
    </table>

    <script type="text/x-template" id="item-template">
        <tr>
            <td>{{hoge}}</td>
        </tr>
    </script>
</main>
```

```javascript:js
new Vue({
    el: '#app',
    data: {
        list: [
            { hoge: 'hoehoe' },
            { hoge: 'foo' }
        ]
    },
    components: {
        item:{
            template: '#item-template',
            props: [ 'hoge' ]
        }
    }
});
```

なぜか `hoge is undefined` みたいなエラーが出てくる。
調べても原因がわからない。しかしFiddle上で試してみたら動く。

うーん、うーんと唸ること２時間。

あ！！！

```html:html
<main id="app">
    <table>
        <item v-for="item in list" :hoge="item.hoge"></item>
    </table>
</main>

<!-- #app の外に書く -->
<script type="text/x-template" id="item-template">
    <tr>
        <td>{{hoge}}</td>
    </tr>
</script>
```

動いた！！

Vue.js の管理エレメント内にテンプレート書いていたから、`{{hoge}}`の部分が反応しちゃったのか。
なんという単純なミス……。
Xcode8でCoreDataのmigrationを行う

## 前置き
CoreDataでデータモデルを作成し、シミュレータや実機で検証を行った後に、データモデルを変更してアプリをアップデートするとエラーが発生するので、変更した際には一度アプリをアンインストールして新規インストールしなくてはいけなくなってしまう。
既にリリース済みで新しいバージョンにアップデートしたい場合や、テストで入れたものも消さずにそのまま更新したい場合は、migrationを利用してモデルを変更し、アプリのバージョンアップを行えばよい。

## 前提
- Xcode8を使用
- CoreDataを使用したプロジェクトが作成されていること

## マイグレーションの設定方法
既に作成済みのCoreDataのデータモデル `.xcdatamodeld` ファイルを選択し、メニュー　>　Editor　>　Add Model Version... を選択し、バージョン２のモデルファイルを作成する
![image](https://qiita-image-store.s3.amazonaws.com/0/128475/59e3c93a-88c6-2b50-8fa7-e77a7797ac2a.png)

追加するとデータモデルがツリー状態になるので、バージョン2を選択して、モデルの変更を行う
![image](https://qiita-image-store.s3.amazonaws.com/0/128475/2890ce95-e54e-7f50-828f-1966d6b3fb96.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/128475/d290f32d-2a01-5e96-3b7e-7f19fda5068e.png)

メニュー　>　Editor　>　Create NSManagedObject Subclass... でエンティティークラスを作成する際にバージョンの選択ができるでバージョン2にチェックをつけてクラスを再生成する
![image](https://qiita-image-store.s3.amazonaws.com/0/128475/bd40c90b-236f-5bff-e9c6-33d8b7ce1467.png)

データモデルのバージョン1になっているので、バージョン2を選択する（画面右端を参照）
![image](https://qiita-image-store.s3.amazonaws.com/0/128475/d126d438-b3cd-25ad-dd9f-fe6e1fe8486d.png)

以上
HTMLメールで<img>要素にsvg画像は使えない

タイトルのとおりです。
多くのメールクライアントは、 HTMLメールで `<img src="a.svg">` のように書いても画像を表示してくれません。
インライン画像もダメです。

https://css-tricks.com/a-guide-on-svg-support-in-email/

現時点ではpngなどを使うのが無難なようです。
canvasでつくる円形のくり抜きレイヤー

こういう円形のくり抜きレイヤーをcanvasで気軽に描画する。
![スクリーンショット 2017-02-28 23.49.30.png](https://qiita-image-store.s3.amazonaws.com/0/18973/4a5fb91b-6065-02e6-1ea9-6eefe644ec13.png)

```HTML:HTML
<canvas id="image" style="height: 300px; width: 300px;" height="300" width="300"></canvas>
```

```JavaScript:JavaScript
var image = new Image()

image.onload = function() {
  canvas = document.getElementById("image");
  context = canvas.getContext("2d");
  
  context.fillStyle = "rgba(0, 0, 0, 0.5)";
  context.fillRect(0, 0, 300, 300);
 
  context.fillStyle = "rgb(255, 255, 255)";
  context.globalCompositeOperation = "destination-out";
  context.arc(150, 150, 150, 0, Math.PI * 2);
  context.fill();
  
  context.globalCompositeOperation = "destination-over";
  context.drawImage(image, 0, 0, 300, 300)
}

image.src = "https://frenchmoments.eu/wp-content/gallery/nancy-place-stanislas/copyright-french-moments-place-stanislas-nancy-8.jpg"
```
Synvert で作ったリファクタリング用の Snippet を RuboCop に置き換える

以下の記事で作った Synvert の Snippet を RuboCop の `--auto-correct` で置き換えてみます。

http://qiita.com/tbpgr/items/b7117a79db6e07540328

### RuboCop の Cop の作り方
RuboCop が提供している RuboCop::Cop::Cop クラスを継承して作成します。  
詳細な作成方法については下記の記事をご確認ください。

[実践!! RuboCopプラグイン開発入門 - SideCI TechBlog](http://tech.sideci.com/entry/2016/06/09/111926)

Synvert の例と同じ変換処理を RuboCop でも実装してみます。
実践!! RuboCopプラグイン開発入門の手順に沿って実装してみました。
件の記事を読めばわかるところは省いて、Copの本体のコードだけ紹介。

#### <i class='fa fa-code'></i> テスト対象コード
```ruby
10.times do
  a = rand(-5..5)
  if a > 0
    puts "positive"
  elsif a < 0
    puts "negative"
  else
    puts "zero"
  end
end
```

#### <i class='fa fa-code'></i> 変換コード
```ruby
# frozen_string_literal: true

module RuboCop
  module Cop
    module Lint
      class NegaPosi < Cop
        MSG_NEGA = 'X < 0 は X.negative? 変更してください'.freeze
        MSG_POSI = 'X > 0 は X.positive? に変更してください'.freeze
        METHOD_NEGA = "negative?"
        METHOD_POSI = "positive?"

        def on_send(node)
          receiver, method_name, *args = *node
          return unless [:>, :<].include?(method_name)
          return unless args.first.source == "0"
          message = method_name == :> ? MSG_POSI : MSG_NEGA
          add_offense(node, :expression, message)
        end

        def autocorrect(node)
          _receiver, method_name, *args = *node
          nega_posi = method_name == :> ? METHOD_POSI : METHOD_NEGA
          lambda do |corrector|
            corrector.replace(node.loc.expression, replacement(node, nega_posi))
          end
        end

        private

        def replacement(node, nega_posi)
          "#{node.receiver.source}.#{nega_posi}"
        end
      end
    end
  end
end
```

#### <i class='fa fa-terminal'></i> 実行
* lint を実行

```sh
$ rubocop  -r rubocop/nega_posi test/sample.rb
Inspecting 1 file
W

Offenses:

test/sample.rb:3:6: W: Lint/NegaPosi: X > 0 は X.positive? に変更してください
  if a > 0
     ^^^^^
test/sample.rb:5:9: W: Lint/NegaPosi: X < 0 は X.negative? 変更してください
  elsif a < 0
        ^^^^^

1 file inspected, 2 offenses detected
```

* autocorrect を実行

```sh
$ rubocop --auto-correct  -r rubocop/nega_posi test/sample.rb
Inspecting 1 file
W

Offenses:

test/sample.rb:3:6: W: [Corrected] Lint/NegaPosi: X > 0 は X.positive? に変更してください
  if a > 0
     ^^^^^
test/sample.rb:5:9: W: [Corrected] Lint/NegaPosi: X < 0 は X.negative? 変更してください
  elsif a < 0
        ^^^^^

1 file inspected, 2 offenses detected, 2 offenses corrected
```

* 実行後のファイル

```ruby
10.times do
  a = rand(-5..5)
  if a.positive?
    puts "positive"
  elsif a.negative?
    puts "negative"
  else
    puts "zero"
  end
end
```

* diff

![diff.png](https://qiita-image-store.s3.amazonaws.com/0/43480/91e2dc6c-14a3-b5bf-8945-2cb0f13a1dcc.png)
Python3(Anaconda)のインストール

# 環境
OS X 10.11.6

# Homebrewインストール
Homebrewをインストールする。

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# pyenvインストール
デフォルトではpython2がインストールされているが、python3(Anaconda)をインストールしてバージョンを切り替えられるようにpyenvをインストールする。

```bash
 $ brew install pyenv
```
.bashrcまたは.bash_profile以下の設定を追加する。

```bash
$ export PYENV_ROOT="$HOME/.pyenv"
$ export PATH="$PYENV_ROOT/bin:$PATH"
$ eval "$(pyenv init -)"
```

# Anacondaのインストール
インストール可能なPythonのバージョン確認する。

```bash
$ pyenv install -l
```

最新のAnacondaのバージョンを指定してインストールする。

```bash
$ pyenv installa naconda3-4.1.0
```

バージョンを確認する。

```bash
$ pyenv versions
 * system
  anaconda3-4.1.0 (set by /Users/username/.pyenv/version)
```

使用するPythonを変更する。

```bash
$ pyenv global anaconda3-4.1.0
```

バージョンを確認する。

```bash
$ pyenv versions
  system
 * anaconda3-4.1.0 (set by /Users/username/.pyenv/version)
```
TensorFlow 1.0のXLAはマルチGPUでは使えない

これを書いている時点（TensorFlow 1.0）での情報です。マルチGPUなコードでXLAを有効にするとGPUを交互に使用するような（片方0%片方100%を繰り返す）挙動になります。

参考 : [TensorFlow XLA with multiple gpu does not use GPU at the same time](http://stackoverflow.com/questions/42319632/tensorflow-xla-with-multiple-gpu-does-not-use-gpu-at-the-same-time)

現状マルチGPUなマシンを使っていると「XLAは諦める」「マルチGPUは諦める」「一つのマシンでマルチノードをやる」のいずれかの選択肢になるのかなと思います。自分はXLAを諦めてマルチGPUでやってます。XLA自体TensorFlow 1.0であってもexperimentalなのでまあ暖かく見守っていきます。

TensorFLow 1.0発表時にGoogleリサーチブログで出ていた「 including a 7.3x speedup on 8 GPUs for Inception v3 and 58x speedup for distributed Inception v3 training on 64 GPUs!」というのはシングルGPUのマルチノードの話だったのかなと推測しています。
phpbrewでphpバージョン管理をはじめる。

- mac PCでのセットアップ手順メモ(備忘のために検索してあちこちに散らばっていたtipsをまとめてみた)。
- 前提としてhomebrewを使う環境があること

##1. phpbrewをインストール

homebrewに登録されている以下のレポジトリを自分のローカルPCで利用できるようにする

```bash
[~] brew tap homebrew/versions
[~] brew tap homebrew/php
[~] brew tap homebrew/dupes
```
その後
`brew install phpbrew`でインストール。`phpbrew init`を実行するように、などと指示が出るので適宜やっておく。

##2. 試しに最新バージョンのphp(7.1.2)を入れてみる

```bash
[~] phpbrew known
7.1: 7.1.2, 7.1.0 ...
7.0: 7.0.16, 7.0.15, 7.0.14, 7.0.13, 7.0.12, 7.0.11, 7.0.10, 7.0.9 ...
5.6: 5.6.30, 5.6.29, 5.6.28, 5.6.27, 5.6.26, 5.6.25, 5.6.24, 5.6.23 ...
5.5: 5.5.38, 5.5.37, 5.5.36, 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31 ...
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...
[~] phpbrew install 7.1.2

configure: error: OpenSSL version 1.0.1 or greater required.
```
こんなエラーが出た。下記のようにして解決する

```bash
[~] brew --prefix openssl
/usr/local/opt/openssl
[~] phpbrew install 7.1.2 +openssl=/usr/local/opt/openssl
* To configure your installed PHP further, you can edit the config file at
    /Users/daiando/.phpbrew/php/php-7.1.2/etc/php.ini

To use the newly built PHP, try the line(s) below:

    $ phpbrew use php-7.1.2

Or you can use switch command to switch your default php to php-7.1.2:

    $ phpbrew switch php-7.1.2

Enjoy!
```
なが〜い間待たされてようやくインストールできた。ワンライナーにするとこんな感じ。
`phpbrew install 7.1.2 +openssl=$(brew --prefix openssl)`

##3. warningが出る時の対処

早速バージョン確認

```bash
[~] phpbrew list
* (system)
  php-7.1.2
[~] php -v
PHP 7.0.15 (cli) (built: Jan 22 2017 08:51:45) ( NTS )
[~] phpbrew switch php-7.1.2
[~] php -v
PHP 7.1.2 (cli) (built: Feb 28 2017 22:58:12) ( NTS )
[~] phpbrew list
WARNING: json extension is required for downloading release info.
WARNING: curl extension might be required for fetching data.
* php-7.1.2
```

これで7.1.2が使えるようになっている。
しかし、`phpbrew list`でもう一度インストールされたphpバージョンを確認すると、jsonとcurlのエクステンションが無い、という警告が出た。警告を消したいので、下記のように対処した。

```bash
[~] phpbrew ext install json
[~] phpbrew ext install curl
[~] phpbrew list
* php-7.1.2
```
AmazonのECS optimized AMIでdockerコンテナのBaseSizeを変更する

ECS optimized AMIはAmazon LinuxでDockerを動かす様になっている。
Amazon LinuxのDockerはデフォルトでdevice mapperをストレージのバックエンドにしている。
device mapperではコンテナに変更が入った時のレイヤーやベースイメージがsnapshotで表現されており、その上限が10GBになっている。
つまり、10GB以上の変更を加えられないので、例えば10GBを越えるファイルを一度にDLしてきて一時ファイルとして保持するとかの場合にディスクが足りなくなる。
バッチ処理のワーカーとかだと割とそれを越えるのはあり得る。

イメージごとカスタマイズしてしまえば簡単に実現できるが、管理イメージが増えるより、起動時のコンフィグという形で定義できる方が良かったので、どういう順序で設定が行われているかを調べてみた。

ECS optimized AMIは起動時にcloud-initが`/etc/cloud/cloud.cfg.d/`以下にある設定を読み、bootcmdフックで`docker-storage-setup`というシェルスクリプトを実行する。
そこで`/etc/sysconfig/docker-storage-setup`を読んで、その設定に合わせてdevice mapperのボリュームを構築し、DOCKERの起動オプションを定義したファイルを生成する。

なので、こいつより前に`/etc/sysconfig/docker-storage-setup`に`--storage-opt dm.basesize=40GB`って感じの値を書く様にしなければならない。

bootcmdはかなり速い段階で実行されるフックなので、どうしたもんかなーと思ってたらcloud-initには最速で実行されるboothookというものがあるらしい。
(cf. http://cloudinit.readthedocs.io/en/latest/topics/format.html#cloud-boothook)

multipartで起動設定を作り込んで、boothookとユーザースクリプトの両方を起動時にuser-dataとして送り込むと上手く設定できそう。
で、terraformで設定書いてみた。

```
data "template_file" "ecs_config" {
    template = "${file("${path.module}/ecs_config.sh.tpl")}"
}

data "template_file" "add_docker_storage_option" {
    template = "${file("${path.module}/add_docker_storage_option.sh.tpl")}"

    vars {
      dm_base_size = "${var.dm_base_size}"
    }
}

data "template_cloudinit_config" "config" {
  gzip = true
  base64_encode = true

  part {
    content_type = "text/cloud-boothook"
    filename = "add_docker_storage_option.sh"
    content = "${data.template_file.add_docker_storage_option.rendered}"
  }

  part {
    filename = "ecs_config.sh"
    content_type = "text/x-shellscript"
    content = "${data.template_file.ecs_config.rendered}"
  }
}

resource "aws_launch_configuration" "ecs" {
    # 省略
    user_data = "${data.template_cloudinit_config.config.rendered}"
}
```

```
#!/bin/bash

echo 'EXTRA_DOCKER_STORAGE_OPTIONS="$EXTRA_DOCKER_STORAGE_OPTIONS --storage-opt dm.basesize=${dm_base_size}"' >> /etc/sysconfig/docker-storage-setup
```

こんな感じ。

これで起動してみたら、想定通りBaseSizeが変更できた。

ちなみにboothookは起動時には毎回問答無用で実行されるらしいので、再起動するとかを想定している場合は、ガード機構をスクリプトに組み込んでおく必要があるだろう。

ECSのクラスタに組込む場合、落としたら普通ノードごと破棄することがほとんどだと思うので、自分は気にしないことにした。
SASLの設定


# 前提知識
## SASL
- Simple Authentication and Security Layerの略。
- コネクション型のプロトコルに対して認証機能を提供する。

## Base64
- 64種類の印字可能な英数字のみを用いるエンコード方式
- MIMEによって規定されている
- 7ビットのデータしか扱うことの出来ない電子メールにて広く利用されている

```bash
# Base64でエンコードしたユーザー名とパスワードを生成
$ printf "{user name}@{my domain}\0{user name}@{my domain}\0{password}" | openssl base64 -e
```


# 手順
## cyrus-saslがインストールされているか確認

```bash
$ yum list installed | grep sasl

cyrus-sasl.x86_64                 2.1.23-13.el6_3.1                    installed
cyrus-sasl-lib.x86_64             2.1.23-13.el6_3.1                    installed
```

不足しているパッケージがあるので、インストールする。


```bash
$ sudo yum install cyrus-sasl-md5
$ sudo yum install cyrus-sasl-plain
$ sudo yum install cyrus-sasl-devel

$ yum list installed | grep sasl
cyrus-sasl.x86_64                 2.1.23-15.el6_6.2                    @base
cyrus-sasl-devel.x86_64           2.1.23-15.el6_6.2                    @base
cyrus-sasl-lib.x86_64             2.1.23-15.el6_6.2                    @base
cyrus-sasl-md5.x86_64             2.1.23-15.el6_6.2                    @base
cyrus-sasl-plain.x86_64           2.1.23-15.el6_6.2                    @base
```

## SASL認証用アカウントの作成

```bash
# 新規ユーザー作成
$ sudo /usr/sbin/saslpasswd2 -c -u {my domain} {user name}
# ユーザー一覧表示
$ sudo /usr/sbin/sasldblistusers2
# パスワード変更
$ sudo /usr/sbin/saslpasswd2 -u {my domain} {user name}
# ユーザー削除
$ sudo /usr/sbin/saslpasswd2 -u {my domain} -d {user name}
```

## postfixがSASLのDBを参照できるように設定
/etc/sasldb2のgroupをpostfixに変更する。

```bash
# 設定変更
$ sudo chgrp postfix /etc/sasldb2

# 設定後
$ ls -l /etc/sasldb2
-rw-r----- 1 root postfix 12288  2月 28 22:27 2017 /etc/sasldb2
```

## SASL認証方式の設定
- pwcheck_methodの設定
	- saslauthd ・・・ PAMやshadowを使用
	- auxprop ・・・ SASL独自のパスワードDBを使用
- mech_listの設定

```bash
$ sudo vi /etc/sasl2/smtpd.conf

#pwcheck_method: saslauthd
pwcheck_method: auxprop
mech_list: plain login DIGEST-MD5 CRAM-MD5
```

## SASL再起動

```bash
$ sudo /etc/init.d/saslauthd restart
```

# 参考資料
- https://www.ipa.go.jp/security/rfc/RFC2222JA.html
- http://oxynotes.com/?p=4428
- https://ja.wikipedia.org/wiki/Base64
公開鍵を簡単に設定したい！

#公開鍵って、公開してれば簡単に追加できるよね

##SSHの公開鍵配布を簡単にやる
https://s8a.jp/distribution-of-ssh-key
を読んで…

##curl -sS URL >> ~/.ssh/authorized_keys　する
https://github.com/yasuken1990/pubkeys
を作りました。

使い方は簡単です。

###git clone
`git clone https://github.com/yasuken1990/pubkeys.git`

###移動して実行
`cd pubkeys && sh addkey.sh`

###ドキュメントルートを設定
`vim /etc/httpd/conf.d/pubkeys.conf`

```pubkeys.conf
<VirtualHost *:80>  
    DocumentRoot /[path]/public_keys  
    ServerName pubkey.example.com  
    <Directory "/[path]/public_keys">  
        Options Indexes FollowSymLinks  
        AllowOverride all  
        Order allow,deny  
        Allow from all  
    </Directory>  
</VirtualHost>  
```

###あとは(※ > ではなく、 >> です。 > だと上書きされて消えてしまいます)
`curl -sS http://pubkey.example.com/ >> ~/.ssh/authorized_keys`
するだけ

開発チームごとにディレクトリつくって、公開鍵を置いておくのもいいかもしれませんね…
まだ使い勝手よくというか、暇なときにコマンド(シェル)追加していこうとおもいます。
Stream#collectを使用してJavaBeanリストから特定のフィールドのみを取得してリスト化する

以下のHogeクラスをサンプルとして使う。

```java
public class Hoge {

    private String foo;

    private String bar;

    public Hoge(String foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }

    // getter/setter
}
```

`Stream#collect`を使用して`Hoge#bar`のリストを作成する。

```java
// Hogeリストを作成
List<Hoge> hoges = Arrays.asList(new Hoge("f001", "b001")
                               , new Hoge("f002", "b002")
                               , new Hoge("f003", "b003"));
// Hoge#barのリストを作成
List<String> bars = hoges.stream().collect(ArrayList::new
                                        , (l, h) -> l.add(h.getBar())
                                        , (l1, l2) -> l1.addAll(l2));

System.out.println(bars); // [b001, b002, b003]
```
[xcode_ext_ruby_worker] Xcodeを拡張してRubyスクリプトにコードを書いてもらうXcode Editor extension

##```Xcode```のメニューバーから特定のディレクトリに入っている```Ruby```ファイルを選んで、今見てるソースファイルのテキストを編集することができる```Xcode```の```extension```です。

活用として、一応[```struct```を```enum```にする](http://qiita.com/Arczzir/items/a8ce479c7a33de2278e9)という機能を持つRubyスクリプト[ ```struct2enum.rb``` ](https://github.com/Arczzir/xcode_ext_ruby_worker/releases/tag/1.0)を作って見ました。（実はむしろそういう機能を簡単に使って欲しいので、この```extension```を作り出したっていうことです）

#### [xcode_ext_ruby_worker アプリ](https://github.com/Arczzir/xcode_ext_ruby_worker/releases/tag/1.0) ←リリース1.0。```.rb```ファイルをディレクトリ追加したらメニューから実行可能になります

#### [ソースコード@GitHub](https://github.com/Arczzir/xcode_ext_ruby_worker)


実行処理の流れ図：
https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW2

![Group@2x.png](https://qiita-image-store.s3.amazonaws.com/0/163219/009a89c9-1794-c918-b729-757296eebfe3.png)
バリデーション

##バリデーションを定義する

```ruby:
app/modles/entry.rb
class Entry < ActiveRecord::Base
validates_presence_of :title
end

class Entry < ActiveRecord:Base
validates_presence_of :title, :content, :on => :create
end


```
##バリデーション　パラメータ

```ruby:
:message 
:on
:if
:unless
:allow_nil


```
##バリデーション　宣言

```ruby:
validates_presense_of |   can't be blank 
validates_length_of | 後述   
validates_numericality_of |   is not anumber
validates_format_of |    is invalid
validates_inclusion_of  |  is not included in the list
validates_exclusion_of |   is reserved
validates_confirmation_of |  doesn't match confimation
validates_uniqueness_of |   has already been taken
validates_acceptance_of |   must be accepted
validates_associated |   is invalid

app/models/user.rb
class User < ActiveRecord::Base
validates_confimation_of :password
<%= password_field "user", "password" %>
<%= password_confimationの入力項目も用意する %>
<%= password_field"user", "password_confimation" %>

...
end


```
####validates_length_of

```ruby:
class Blog < ActiveRecord::Base
validates_length_of :title, :in => (2..30)
:too_short => "タイトルは2文字以上で入力してください。"
:too_long => "タイトルは30文字以下で入力してください。"
end

```

```ruby:
:minimum
:maximum
:is
:in/:within
:too_long
:too_short
:wrong_length
:message
```
##validate_uniquness_of

```ruby:
class Entry < ActiveRecord::Base
validates_uniqueness_of :title, :scope => [:blog_id]
end

:scope
:case_sensitive
```
UniRxでボタンを押したらコルーチン終了

　Unityで[StartCoroutine](https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.StartCoroutine.html)メソッドや[Coroutine](https://docs.unity3d.com/ja/current/ScriptReference/Coroutine.html)型、使っていますか？

　コルーチンを使うことで、時間を扱うコードが非常に書きやすくそして読みやすくなります。

　またコルーチンの内部で別のコルーチンを発生させることができるので、条件分岐したり繰り返したりする複雑なコルーチンも記述可能です。

　そんなコルーチンのよくある使い方はこんな感じでしょう。

```csharp:
using System.Collections;
using UnityEngine;

public class ResultView : MonoBehaviour
{
    /* 中略 */

    public Coroutine Show(Result result)
    {
        StartCoroutine(ShowEnumerator(result));
    }

    IEnumerator ShowEnumerator(Result result)
    {
        /*
           ここでreusltのデータをビューに表示
        */

        FadeIn();

        yield return new WaitForSeconds(3.0F);

        FadeOut();
    }

    /* 中略 */

}
```

　`ResultView`は、`Result`を引数にとる`Show`メソッドを持っています。`Show`メソッドは、フェードインし、`Result`のデータを3秒間表示し、フェードアウトします。このメソッドのポイントは次の行です。

```csharp:
        yield return new WaitForSeconds(3.0F);
```

　こうすることで、フェードインが行われてから3秒後にフェードアウトが実行されます。

　さて、「3秒後」という処理を「閉じるボタンが押されたら」に変更するにはどうすればいいでしょうか？

　Unityの標準UI、uGUIはボタンのクリックに対してデリゲート(詳しくは[こちら](http://qiita.com/RyotaMurohoshi/items/740151bd772889cf07de))を登録し、「ボタンが押されたときに何をするか記述する」ことは非常に簡単にできます。しかし、このようにコルーチンと組み合わせるには工夫が必要です。

　UniRxを用いれば、ボタンが押されたイベントとCoroutineを組み合わせることが可能です。

　次のコードのように、UniRxの`OnClickAsObservable`拡張メソッドと、`First`メソッド、そして`ToYieldInstruction`を用います。

```csharp:
    IEnumerator ShowEnumerator(Result result)
    {
        /*
           ここでreusltのデータをビューに表示
        */

        FadeIn();

        yield return closeButton
            .OnClickAsObservable()
            .First()
            .ToYieldInstruction();

        FadeOut();
    }
```


　ポイントは`ToYieldInstruction`メソッドです。これを用いることで、`IObserable<T>`をコールーチン内で活用できます。

　「ボタンが押された」よりももっと複雑なイベント・ストリームにも、`ToYieldInstruction`メソッドそしてコルーチンは活躍しそうですね。
フォルダ内のフォルダ/ファイル名を取得

はじめに
---
Windowsのコマンドラインで、フォルダの中にある全フォルダ/ファイルの名前を取得する。
ただし、サブフォルダ以下の名前と拡張子は取得しない。


例えば、C:\Users\USER\Downloadsにある全ファイルを取得し、C:\Users\USER\Downloadsのresult.txtに書き出す。

実行前
---

```:取得したいフォルダ
C:\Users\USER\Downloads\apple.txt
                       \banana.pdf
                       \grape\muscat.csv
```

コマンドプロンプトを開き、以下のコードを実行。

for /f "delims=" %i in ('dir /b 出力したいファイル群が入ったフォルダの場所') do @(echo %~ni)>>出力したい場所\テキスト名.txt

```
C:\Users\USER>

C:\Users\USER>for /f "delims=" %i in ('dir /b C:\Users\USER\Downloads') do @(echo %~ni)>>C:\Users\USER\Downloads\result.txt
```

実行後
---
```:result.txt
apple
banana
grape
```


その他
---
・すべて
　　>dir /b　"パス"
・ファイル名のみ　
　　>dir /b/a-d "パス"
・フォルダ名のみ
　　>dir /b/a-a "パス"

参考
---
[コマンドプロンプトの使い方](https://www.adminweb.jp/command/bat/)
PowerShellで、プリンタドライバをインストールする

参考URL： LAN内の全PCに自動でプリンタードライバーをインストールする方法
http://www.se-support.com/clientpc/printer-install.html

上記サイトではバッチファイルが紹介されています。
これをPowerShell で置き換えてみます。
変更点は、「OSは問わないが 64bit or 32bit で区別されているドライバ」に対応させました。
プリンタドライバは、共有フォルダ \\\public の配下にあるそれぞれのフォルダ内で解凍しておきます。
```
64bit版の場合： "\\public\64bit\fxap4c5575plw150110wxp6fja\"
32bit版の場合： "\\public\32bit\fxap4c5575plw150110w2k3fja\"
```

プリンタの作成には、以下のフォルダ内にある VBScript(.vbs) を使用します。
```
C:\Windows\System32\Printing_Admin_Scripts\ja-JP\cscript prndrvr.vbs
```
記述するとこんな感じです。
PCの台数が多いときは、このスクリプトを
ログオンスクリプトで 1回だけ実行させれば一撃です。

```ps1:install_xerox_c4475.ps1
##--- config ---
# プリンタのIPアドレス
$ipaddress = "192.168.1.100"

# 解凍したプリンタドライバパッケージ内のinfファイルに記述されている、プリンタの名称
$inf_printername = "FX DocuCentre-IV C4475"

# PCの「デバイスとプリンター」に表示されるプリンタの名称
$printername = "DocuCentre-ⅣC4475"

##--- main ---
Set-Location C:\Windows\System32\Printing_Admin_Scripts\ja-JP\

# 通信ポートの作成
$port_name = "IP_" + $ipaddress
cscript prnport.vbs -a -r $port_name -h $ipaddress -o raw -n 9100

#--- OS の bit を判定する ---
$os = Get-WmiObject -Class Win32_OperatingSystem
# Write-Host $os.OSarchitecture

if ( $os.OSarchitecture -eq "64 ビット" )
    {
    # 64bit版ドライバのインストール
    cscript prndrvr.vbs -a -m $inf_printername -v 3 `
    -i "\\public\64bit\`
    fxap4c5575plw150110wxp6fja\cswnd\ART_EX\x64\FXLKNJL.inf"
    }
else
    {
    # 32bit版ドライバのインストール
    cscript prndrvr.vbs -a -m $inf_printername -v 3 `
    -i "\\public\32bit\ `
    fxap4c5575plw150110w2k3fja\cswnd\ART_EX\Win2000_XP\FXLKNJL.inf"
    }

# プリンタの作成
cscript prnmngr.vbs -a -p $printername -m $inf_printername -r $port_name
##--- end ---
```
Gitのファイルの名前について

Ｇｉｔは基本的にファイルの名前をＡＳＣＩＩにコード転換してから展示する。例えば、`虚無.txt`というファイルは、Ｇｉｔでは`\350\231\232\347\204\241.txt`と表現されている。

```
SinriMac:~/Codes/Leqee/erp Sinri$ touch 虚無.txt
SinriMac:~/Codes/Leqee/erp Sinri$ git status
On branch dev
Your branch is up-to-date with 'origin/dev'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	"\350\231\232\347\204\241.txt"


It took 2.41 seconds to enumerate untracked files. 'status -uno'
may speed it up, but you have to be careful not to forget to add
new files yourself (see 'git help status').
nothing added to commit but untracked files present (use "git add" to track)
SinriMac:~/Codes/Leqee/erp Sinri$ 
```

それを日本語のままにしたい場合、`.gitconfig`を編集し、下記のことを確保すればいい。

```
[core]
quotepath = false
```

メモとして
もともとそのツールを利用したいがそのような支障が出てくる。それで解決できる。
https://github.com/oleander/git-fame-rb/issues/74