OmniAICreator/Qiita-1.07M huggingface dataset:
fabricを使う時に調べたことのメモ

fabricを使う時に調べたことのメモ。雑記。

# EC2へのインストール

```
$sudo yum update -y
# もしpipがなければ
$sudo easy_install pip
$sudo pip install fabric
$fab --version
/usr/lib64/python2.7/dist-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.
  _warn("Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning)
Fabric 1.10.2
Paramiko 1.15.1
```
warningが出ますが、以下のとおり、下記のように挙動に問題はなさそうなので無視。

[OSS編～Ansibleでサーバ構成管理 パート①～](http://recipe.kc-cloud.jp/archives/4885)

[Using Ansible on AWS – EC2インスタンスを作成する](http://dev.classmethod.jp/cloud/aws/using-ansible-on-aws/)

解消する方法も書きましたが、かなり面倒です。。。

[fabricやAnsibleインストールでYou should rebuild using libgmp >= 5 to avoid timing attack vulnerabilityと出た時](http://qiita.com/toshihirock/items/5cde09731be74e6edc24)

# ローカルで任意の操作をする

local(command)という感じで実行できる。

自分の場合、これで~/.ssh/configを変更して引数に指定したリモートサーバーへ踏み台を超えてアクセスするような設定を行った。
なお、変更後に`env.use_ssh_config = True`としないと変更前のssh/configを読み込むっぽいので注意が必要

# 終了ステータスコード1の場合にロールバック処理したい

[fabric でエラー時のロールバック処理をする](http://qiita.com/5t111111/items/c50524dd22ba6db0117d)

上記の通りですが、以下の様な感じで使える

```
def exec():
  env.warn_only=True
  result = run('nslookup hogefuga')
  if result.return_code != 0:
    rollback()

def rollback():
  #something
```

事前にファイルバックアップをしておいて、NGの場合、リストアみたいなことができて便利です。

# タスクをまとめる

小さいタスクを定義してその小さなタスクを呼び出すタスクを定義すればOK

```  
def before():
  # something

def remote():
  # something
  
def after():
  # something

def all():
  before()
  remote()
  after()
```
で

```
$fab -H hoge all
```

という感じで呼び出せば良い

# 引数を渡す

[Fabricを使って複数のサーバを操作する](http://inaz2.hatenablog.com/entry/2014/11/15/112145)

上記リンクのままですが、以下の様な形で定義して

```
def ls(path):
    run("ls %s" % path)
```

以下のように呼び出せば良い

```
$fab -H fabric-host ls:/usr/local
```

タスクをまとめるに書いたように

```
def before(path):
  # something

def remote():
  # something
  
def after():
  # something

def all(path):
  before(path)
  remote()
  after()
```

```
$fab -H fabric-host all:/usr/local
```

とかも可能。

# 定数を使う

以下の様な感じで使える

```
FABRIC_EXEC_USER = 'ec2-user'

def check():
  local("grep -e 'Host hogefuga' /home/%s/.ssh/config" % FABRIC_EXEC_USER)
```

変数の展開は複数でも当然可能。

# 実行コマンド、標準出力を表示しないようにする

デフォルトでは標準出力や実行コマンドの内容が表示されますが、コマンド実行前の処理（自分の場合、~/.ssh/configの設定変更やバックアップ）は標準出力されると邪魔です。
そのような場合、hideを使えば出力の制御ができます。

例えば

```
def hoge():
  local("hostname")
```

```
$fab hoge
[localhost] local: hostname
vagrant-ubuntu-trusty-64

Done.
```

というのが

```
def hoge():
  with hide('running', 'stdout'):
    local("hostname")
```
とすると

```
fab hoge

Done.
```

という感じに出来ます。
gitのステージングって何？必要なの？

git でコミットするにはいちど「ステージング」する必要がある。
なぜそんな面倒なものを挟むのか。と最初は思った。

しかし実はメリットがある。

- 変更を二つ以上に分けてコミットできる
- そのために、本当にコミットして良いかどうか、確かめながら進めることが出来る

ということだ。

gitは単にバックアップの存在ではないので。
なるべく「意味の単位」でコミットを実行していった方が良い。だからステージングがある。

もしステージングという処理が存在しなかったら。
変更の一部だけをコミットするのには、次のようなコマンドを打たなければいけなかっただろう。

`$ git commit --with directory/file1.txt directory/file2.txt directory/file2.txt` **（架空のコマンド）**
とか、
`$ git commit --without directory/file3.txt directory/file4.txt` **（架空のコマンド）**
とか。

やっぱりステージングは必要だ。

（SourceTreeなどのソフトを使っている場合は、ほとんど意識しないかもしれないが。どのファイルをコミットするか。あのチェックボックスにチェックを入れていく作業がステージングだ）








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravel5 入門してみた


今人気のlaravelを導入した時の備忘録です。

### 公式サイト

http://laravel.com/docs/5.1

### 必要条件

* PHP >= 5.5.9
* OpenSSL PHP Extension
* PDO PHP Extension
* Mbstring PHP Extension
* Tokenizer PHP Extension


### インストール

laravelは２つのインストール方法を用意しています。

A. Via Laravel Installer


```
composer global require "laravel/installer=~1.1"
```


B. Via Composer Create-Project

今回はこちらを使ってみました。

```bash:私の採用した方法
./composer.phar create-project laravel/laravel --prefer-dist
```

マニュアルには↓のように書かれていますが、自分はglobal環境にcomposerをインストールしていなかったので、上のようにcomposer.pharのあるディレクトリからインストールしました。

```bash:マニュアルに記載のある方法
composer create-project laravel/laravel --prefer-dist
```

インストールが完了すると、カレントディレクトリ内にlaravelというディレクトリが出来てます。

```bash:laravelディレクトリ
$ ls laravel/
app      bootstrap      composer.lock  database     package.json  phpunit.xml  readme.md  server.php  tests
artisan  composer.json  config         gulpfile.js  phpspec.yml   public       resources  storage     vendor

```

### 初期設定

最初にいくつか設定を変更する必要があるそうです。

#### Directory Permissions

`storage`と`bootstrap/cache`ディレクトリのパーミションを書き込み権限があるように変更して上げる必要があるそう。

```bash
$ cd laravel
$ chmod 777 storage
$ chmod 777 ./bootstrap/cache/
```

#### Application Key


これは、↑で紹介した２つのインストール方法を使った場合は、すでに作られているので特に何かする必要はないそうです。
実際、`laravel/.env`を見ると、app_keyという項目にランダムな32文字の文字列が書き出されていました。

どうやらセッションデータの暗号化の時なんかに使っているみたいです。

#### Additional Configuration

`config/app.php`というファイルがありますので、ここでタイムゾーンと言語の設定だけ変えておきます。

timezone: Asia/Tokyo
local: ja

### 確認

ここで、ドキュメントルートを`laravel/public/`に変更し、ブラウザからアクセスしてみると、`laravel5`という文字が表示されているのが確認出来たかと思います。

これで導入は一旦OKそう。
fabricやAnsibleインストールでYou should rebuild using libgmp >= 5 to avoid timing attack vulnerabilityと出た時

EC2にfabricを導入してみたら以下の様なwarningが。。。

```
$sudo yum update -y
$sudo pip install fabric
$fab --version
/usr/lib64/python2.7/dist-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.
  _warn("Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning)
Fabric 1.10.2
Paramiko 1.15.1
```

Ansibleのインストールでも同じようになるらしいが、下記のように挙動に問題はなさそうなので無視しても良さそう。

[OSS編～Ansibleでサーバ構成管理 パート①～](http://recipe.kc-cloud.jp/archives/4885)

[Using Ansible on AWS – EC2インスタンスを作成する](http://dev.classmethod.jp/cloud/aws/using-ansible-on-aws/)

でも気になるので解消してみた時のメモ

# 環境

+ Amazon Linux AMI 2015.03 (HVM)

# どうすればよいか

以下のサイトの通りやったら解消できた

[SaltStack: GMP and PyCrypto on Amazon Linux](http://devop.ninja/configuration%20management/2014/11/20/saltstack-gmp-and-pycrypto-on-amazon-linux/)

やっていることとしては多分以下。

+ gbglibのビルド、rpm作成、インストール
+ python-cryptoのビルド、rpm作成、インストール

手順と以下が少し違ってた

+ /usr/local/bin/fpmではなく、パスが通る所にfpmがインストールされた($which fpmで確認できる)
+ setup.pyに実行権限がなかったので追加。($chmod 755 setup.py)

# 終わったら

```
[ec2-user@ip-172-31-26-11 SPECS]$ fab --version
Fabric 1.10.2
Paramiko 1.15.1
```

Warningなくなったけど、結構大変。。。
多分、最初から問題が発生しないOSでやった方が楽だと思います。。。
[Mac]絵文字を駆使してコマンドラインで擬似GUIメニューを実現する😊



みなさん、コンソール画面使ってますか。
真っ黒い画面にコマンドを入力するあれです。
使い慣れればとても効率的ですが、コマンドを覚えるのが大変ですよね。

そこで、

* 複数の機能を効率的に組み合わせることができるCUIの長所
* 機能がグラフィカルに提示されそこから選ぶだけでいいGUIの長所

この２つを融合した新しい操作方法を考えてみました。これです。

![emo.gif](https://qiita-image-store.s3.amazonaws.com/0/33890/89530a55-331b-0ed1-160c-dc1382fb144e.gif "emo.gif")


特定のキーを押すとメニューが現れ、その中から絵文字を選び入力するとそれがコマンドとして解釈されます。

例えば、
「カレントディレクトリを移動するコマンドなんだっけ？確かCから始まってDで終わる名前だったんだけど〜」
という時には、
メニューを呼び出し、その中から💿の絵文字を選べばcdコマンドが実行されます。


## どう実現してるの⁉️

必要なのはMacの標準環境。
特別なアプリのインストールは必要ありません。

### ①.bash_profileにエイリアス👽を設定する。

.bash_profileにエイリアスを追加します。
想像力が働く限り好きなだけ登録してください。

```
alias 💿='cd'
alias 📖='ls'
alias 💬='echo'
alias 🐈='cat'
alias 👎='kill -9'

```

### ②コンソールを再起動💻
してください。

### ③コンソール画面でControl+Command+Spaceを押す👇

すると絵文字メニューが出てきますので、定義済みのコマンドを実行してみてください。
よく使う項目はお気に入りに登録することもできます。

## まとめ

コンソール画面がとても賑やかになりました。


Mac以外で絵文字対応しているコンソールは今のところ聞いたことがありませんが、MacからsshでLinuxマシンに入って試したところ、問題なく絵文字操作ができました。接続する端末側が絵文字対応していれば、単なるunicodeなので問題なさそうです。

最後にプチtipsとして、

```
export PS1="👷 $"

```

という風に、PS1という環境変数に任意の文字を設定すると[プロンプトをカスタマイズ](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/002cngprmpt.html)することができます。

![emops1.png](https://qiita-image-store.s3.amazonaws.com/0/33890/44bd9ebe-58fb-b9d2-382a-95b913a1fbe4.png "emops1.png")
Zabbix設定メモ


##やりたいこと

自分の環境に合わせたインストール。設定手順をまとめておきたい。
自分の環境の特徴は、

* PHPが5.6。
* メール送信のSMTPとしてGmailを利用したい。

の２つ。それぞれ、Zabbixインストール時のレポジトリの追加や、送信用カスタムスクリプトの設定が必要になる。

##参考
* インストールは[ここ](https://blog.apar.jp/linux/334/)を参考にさせていただきました。
* 各種監視設定は同じく[ここ](https://blog.apar.jp/zabbix/1046/)を参考にさせていただきました。
* 簡単エージェントレンスの監視等は[ここ](http://www.walbrix.com/jp/blog/2014-02-zabbix-simple-web-monitoring.html)を参考にさせていただきました。

##前提

* CentOS6.x(or6.5)
* Apacheインストール済
* MySQLインストール済
* PHPインストール済（但し、remiから5.6：普通にやると引っかかる）

##インストール

###リポジトリインストール

そもそもどのレポジトリが有効になっているか？

```bash
yum repolist all
```

Zabbixレポジトリ追加

```bash
sudo rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
```

>Zabbixのリポジトリは標準でenailed=1になっているので、必要に応じて0にしておく。
/etc/yum.repos.d/zabbix.repo
最新のレポジトリは公式サイトで確認する。

###Zabbixインストール

Zabbixサーバーのインストール

```bash
yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese
```

上記だと、PHP依存関連のエラーがでました。
原因は、LaravelのためにPHPを5.6にしてたから。--enablerepoをつけて再度実行。

```bash
yum install --enablerepo=remi,remi-php56 zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese
```

Zabbixエージェントのインストール

```bash
yum nstall zabbix-agent
```

Zabbix便利コマンドのインストール

```bash
yum install zabbix-get
```

###Zabbix DBのセットアップ

まず、MySQLにログインし、Zabbix用のDBとユーザーを設定しておく。

```bash
mysql>create database zabbix;
mysql>grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
```
各種スクリプトを実行。

```bash
mysql -u root -p zabbix < /usr/share/doc/zabbix-server-mysql-2.4.6/create/schema.sql
mysql -uroot -p zabbix < /usr/share/doc/zabbix-server-mysql-2.4.6/create/images.sql
mysql -uroot -p zabbix < /usr/share/doc/zabbix-server-mysql-2.4.6/create/data.sql
```

>pathはバージョンによって変わります（特に、zabbix-server-mysql-2.4.6部分）。

###Zabbixの起動設定

/etc/zabbix/zabbix_server.confのDBPassword=<password>を適切に設定し、コメントイン。

####サーバ起動＋自動起動

```bash
sudo service zabbix-server start
sudo chkconfig zabbix-server on
```

####エージェントも起動＋自動起動

```bash
sudo service zabbix-agent start
sudo chkconfig zabbix-agent on
```

####エージェントの起動確認

```bash
zabbix_get -s 127.0.0.1 -p 10050 -k agent.version
2.4.6
```

>zabbix(_get)は、zabbix_agentd.confのServer=に記述されたサーバのみ反応するようです。
ローカルテストする場合は、127.0.0.1も加えておきましょう。

####Apacheのリスタート

必須。

```bash
sudo service httpd restart
```

###ウィザード

Check of pre-requisitesでPHP always_populate_raw_post_dataがonになってる！offを要求！というエラー。
php.iniの

```bash
always_populate_raw_post_data = -1
```
をコメントイン。httpd restart。

##エラーメール設定

ローカルのSMTPが使えればわけないのですが、ここではGmailを利用します。
Zabbixのメールはtls認証に対応していないようなので、送信用のスクリプトを作成し、それで送信します。が、ハマりました。

スクリプト自体は[ここ](http://www.zabbix.jp/documents/download)から入手できます。

###ハマりポイント１（PHPMailerのrequire）

そもそもメール送信にはPHPMailerを利用しているので、その本体をダウンロード、設置します。また、STMPクラスが無い！というエラーに遭遇しました。そのためには、class.phpmailer.phpのrequireの前にclass.smtp.phpをrequireします。

###ハマりポイント２（スクリプト保存Path）

どこかのサイトの例に、送信用のスクリプトを/var/lib/zabbixとかに置いている例があったのですが、送信用のスクリプトは、/etc/zabbix/zabbix_server.confで、AlertScriptsPathで指定されたPathでしか有効じゃないようです（標準では/usr/lib/zabbix/alertscripts）。メディア設定の際のファイル名（Path）は、このフォルダからの相対Pathで指定するようです。

後は、スクリプトをGmailに合わせて改変します。追加項目としては、

$mailer->Port = 587;
$mailer->SMTPSecure = "tls";

くらいでしょうか。あと、そもそも最近のGmailは、アプリ専用のパスワードを取得する必要があるので、前もって準備します。
qiita > 検索 > 「"書式指定子" user:ユーザ名」では検索結果に表示されるが、「title:"書式指定子" user:ユーザ名」もしくは「title:書式指定子 user:ユーザ名」の検索結果は0になる


記事のタイトルをもとに検索をしたのだが、意図した通りには検索結果が出てこなかった。

- [「"書式指定子" user:7of9」](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=%22%E6%9B%B8%E5%BC%8F%E6%8C%87%E5%AE%9A%E5%AD%90%22+user%3A7of9) >> すべて(7)
- [「title:"書式指定子" user:7of9」](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=title%3A%22%E6%9B%B8%E5%BC%8F%E6%8C%87%E5%AE%9A%E5%AD%90%22+user%3A7of9) >> すべて(0)
- [「title:書式指定子 user:ユーザ名」](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=title%3A%E6%9B%B8%E5%BC%8F%E6%8C%87%E5%AE%9A%E5%AD%90+user%3A%E3%83%A6%E3%83%BC%E3%82%B6%E5%90%8D)>> すべて(0)

このあたりもう少し理解しないと、過去の記事検索に失敗しそう。

もしかしたら、title:で漢字キーワードの検索はできないのかもしれない。
csharp > 書式指定子 > index付きのforeach表示 > foreach内で string msg = string.Format("index:{0} / value:{1}", index++, value);

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

foreachは便利ですが、各要素の表示の時にindexをどのようにつけるか。

以下に紹介されている。
http://dotnetcsharptips.seesaa.net/article/400926856.html


```csharp
	private void indexDisp()
	{
		var list = new[] { 3, 1, 4, 1, 5, 9, 2 };

		int index = 0;
		foreach (var value in list) {
			string msg = string.Format("index:{0} / value:{1}", index++, value);
			Debug.Log(msg);
		}
	}
```

結果

```
index:0 / value:3
index:1 / value:1
index:2 / value:4
...
```
unity/dotnet > csv > string test="AAA,BBB,CCC"を各要素にわける > string [ ] elements = test.split(',');

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

csvファイル解析の前準備。
,区切り文字を各要素にわけたい

```csharp
		string test = "AAA,BBB,CCC,DDD";

//		var elements = test.Split (',');
		string [] elements = test.Split (',');
		foreach (string aString in elements) {
			Debug.Log(aString);
		}
```

コメントアウトしているvarを使った方法でもいける。

参考
http://qiita.com/kyubuns/items/bcbe92a18dffea684fbc
Apache2を使えるようにする

# Apache2を使えるようにする

[USBメモリを使う](http://qiita.com/or2/items/bea5425f225476522a49)の続き

Apache2をとりあえず使えるようにして、コンテンツの置き場所をUSBメモリにしてみる

## Apache2をインストールする
`sudo apt-get install apache2`

## USBメモリにコンテンツの置き場ディレクトリを作成
`sudo mkdir /mnt/usb1/www`
必要に応じてデフォルトのDocumentRoot(/var/www)からファイルをコピーしておく

## Apache2のインストール先を確認する
`whereis apache2`

```lang:result
apache2: /usr/sbin/apache2 /etc/apache2 /usr/lib/apache2 /usr/share/apache2 /usr/share/man/man8/apache2.8.gz
```
Apache2の設定ファイルは/etc/apache2にあるっぽい

## Apache2の設定ファイル
### /etc/apache2/apache2.conf
Apache2全体の設定ファイル

### /etc/apache2/sites-available/
サイト毎の設定ファイルが置かれているディレクトリ
設定ファイルのうち/etc/apache2/sites-enabled/にリンクしたものだけが有効になる
リンクを張ったり外したりするコマンドも用意されている

* a2ensite(/usr/sbin/a2ensite)：/etc/apache2/sites-enabled/にリンクを張る

```lang:Example
sudo a2ensite
Your choices are: default default-ssl
Which site(s) do you want to enable (wildcards ok)?
default
Enabling site default.
To activate the new configuration, you need to run:
  service apache2 reload
```

* a2dissite(/usr/sbin/a2dissite)：/etc/apache2/sites-enabled/のリンクを外す

```lang:Example
sudo a2dissite
Your choices are: default
Which site(s) do you want to disable (wildcards ok)?
default
Site default disabled.
To activate the new configuration, you need to run:
  service apache2 reload
```

### /etc/apache2/mods-available/
Apache2のモジュールを置くディレクトリ
モジュールのうち/etc/apache2/mods-enabled/にリンクしたものだけが有効になる

## DocumentRootを変更する
コンテンツの置き場所をUSBメモリにするにはDocumentRootを変更する
デフォルトサイトのDocumentRootは
/etc/apache2/sites-available/default
に書かれている

`sudo cp /etc/apache2/sites-available/default  /etc/apache2/sites-available/default.orig`

`sudo nano /etc/apache2/sites-available/default`

```lang:/etc/apache2/sites-available/default
[Before]
DocumentRoot /var/www
<Directory /var/www>

[After]
DocumentRoot /mnt/usb1/www
<Directory /mnt/usb1/www>
```

## 変更した設定を反映するためにApache2を再起動する
`sudo /etc/init.d/apache2 restart`
unity > fileIO > ファイルの作成日時を取得したい > System.DateTime dt = System.IO.File.GetCreationTime (filepath1);


ファイルの作成日時を取得したい。

```csharp
string filepath1 = "test.csv";
System.DateTime dt = System.IO.File.GetCreationTime (filepath1);
Debug.Log(dt.ToString("yyyy/MM/dd hh:mm:ss"));
```

http://jeanne.wankuma.com/tips/vb.net/file/gettimestamp.html

他に
- 更新日時 : System.IO.File.GetLastWriteTime(filepath)
- アクセス日時 : System.IO.File.GetLastAccessTime(filepath)
unity > System.DateTime/書式指定子 > stringへの変換 > dt.ToString("yyyy/MM/dd hh:mm:ss") > hh:12時間表記, HH:24時間表記

System.DateTimeをstringに変換したい。

```csharp
string filepath1 = "test.csv";
System.DateTime dt = System.IO.File.GetCreationTime (filepath1);
Debug.Log(dt.ToString("yyyy/MM/dd hh:mm:ss"));
```

結果

```
2015/08/15 07:28:10
```

http://www.dotnetperls.com/datetime-format

> MMM     display three-letter month
ddd     display three-letter day of the WEEK
d       display day of the MONTH
HH      display two-digit hours on 24-hour scale
mm      display two-digit minutes
yyyy    display four-digit year


<hr>
`dt.ToString()`という簡略表記もあるが、こちらにすると`08/15/2015 07:28:10`という表記になった。
unity > fileIO > ファイル拡張子を取得 > Path.GetExtension (filepath);

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

ファイルの拡張子を取得したい。

http://www.atmarkit.co.jp/fdotnet/dotnettips/293extension/extension.html
http://docs.unity3d.com/ScriptReference/Path.GetExtension.html

```csharp
string filepath = "test.sin";
string ext1 = Path.GetExtension (filepath);
Debug.Log (ext1);
```

上記で".sin"という拡張子が取得できた。
unity > UIをprefab化して別のプロジェクトでHierarchyに追加した時、EventSystemが自動追加されない > UIのButtonなどの反応がない

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

UIのButtonやInputFieldなど複数のオブジェクトをCanvasにまとめてprefab化した。それをExport packageによりAssetファイルにして、別プロジェクトにてImport packageにてインポートした。

できたprefabをHierarchyに追加した時、EventSystemはシーンに自動追加されない。そのため、Buttonなどを押してもOnClickの処理がされない。
EventSystemを UI -> Event Systemから追加するとButtonなどのOnClick処理がされるようになった。

通常は、UI -> Buttonなどを追加した時はEvent Systemは自動追加されるが、複数のUIをprefab化したものの追加時にはEvent Systemは自動追加されないようだ。
2015-08-15 技術英語 > unselect / deselect / clear @ The IBM Style Guide | 2019-09-30 untick 

引用: The IBM Style Guide

> - unselect v
<font color=red>Do not use</font>. Use "clear" to refer to removing a mark from a check box. Use "deselect" in other situations.

> - deselect v
Do not use to refer to removing a mark from a check box. <font color=red>Use "clear"</font>. Use instead of "deselect" in other situations.

> - clear v
Use "clear", not "deselect" or "unselect" to refer to removing a mark from a check box.

<hr>
引用: アプリケーションをつくる英語 by 西野竜太郎さん

> IBM Style Guideではdeselectよりunselectを使うとしています。

上記のIBM Style Guideを見るとunselectよりもdeselectを使う、と読み取れる。

あと、checkboxの選択解除はclearを使うと上記から読み取れる。


### untick
(追記2019-09-30)

MCUXpresso IDE User Guide Rev 11.0.0
p10

> it can be disabled via [unticking] the preference at:

untick
リバーシで遊んで覚える Java 8.

# Today's issue
みなさん、新しいプログラミング言語を覚えるときってどうしてますか？
私はコンソールバージョンの ~~オセロゲーム~~ リバーシを実装することが多いです。

* 一通りの文法要素を試すことができる
* ルールが決まっているため仕様決めに悩まず、実装に専念できる
* そこそこのボリューム
* 凝ろうと思えば色々凝れる

今回も java8 勉強用にリバーシを実装し、せっかくなので [公開する](https://github.com/nmby/reversi) ことにしました。java初心者のみなさん、よろしければ勉強の土台にでも、反面教師的なネタとしてでも、いかがですか。
[2016/1/1追記：細かなバグ修正等を行い、v1.0.0として正式版をリリースしました。]
[2016/2/3追記：[入門者向けの紹介サイト](http://reversi.hotchpotch.xyz/) を作りはじめました。]

ゲームとしても遊べます。モンテカルロ・シミュレーションを使ったAIプレーヤーは結構強いですよ！ AIプレーヤーを自作して対戦させることも簡単です。
（お約束：ただし動かす際は自己責任でお願いします。末尾の免責事項をご参照ください。）

＜Contents＞
1. とりあえず動かして遊んでみる
2. AIプレーヤーを自作してみる
3. ソースコードを読んでみる...

![reversi1.png](https://qiita-image-store.s3.amazonaws.com/0/84939/87298d41-c2ab-f0db-203f-bb8c723116f1.png)

# ■■■ 1. とりあえず動かして遊んでみる ■■■
1. [こちら](https://github.com/nmby/reversi/releases) から xyz.hotchpotch.reversi-x.x.x-yyyymmdd.jar をダウンロードし、ローカルPCの任意の場所に配置します。
2. `java -jar` コマンドでダウンロードした jar ファイルを起動します。  

    ```console:例
    > java -jar "C:\Users\hoge\Desktop\xyz.hotchpotch.reversi-2.0.0-20160108.jar"
    ```

3. あとは表示されるメニューに従って操作するだけです。「ConsolePlayer」を選ぶと、コンピュータと対戦することができます。

# ■■■ 2. AIプレーヤーを自作してみる ■■■
## 準備と作成
1. ふつうの java プロジェクトを作成します。（java8準拠にすることをお忘れなく。）
2. [こちら](https://github.com/nmby/reversi/releases) から xyz.hotchpotch.reversi-x.x.x-yyyymmdd.jar をダウンロードし、ビルド・パスに設定します。
3. [xyz.hotchpotch.reversi.framework.Player インタフェース](http://reversi.hotchpotch.xyz/docs/api/index.html?xyz/hotchpotch/reversi/framework/Player.html)を実装し、AIプレーヤークラスを自作します。

※より詳しい手順は [こちらのサイト](http://reversi.hotchpotch.xyz/) を参照してください。

![reversi2b.png](https://qiita-image-store.s3.amazonaws.com/0/84939/1947d48c-a4a6-f4be-e8b5-ac05429ee41f.png)

## 動かす
1. 上記の eclipse の画面から、[実行]→[実行] を選びます。（なんか色々聞かれたら「Menu」を選択します。）
2. eclipse のコンソールビューに実行状況が表示されます。表示内容に従い、対話的に入力を行います。
3. プレーヤー選択時に自作クラスを指定することで、クラスがロードされ、動作します。

![reversi3b.png](https://qiita-image-store.s3.amazonaws.com/0/84939/a5108a69-7e20-e5b2-b3d9-d487ebba0246.png)

リーグ戦を選ぶと、複数のプレーヤーによる総当たり戦が自動で行われます。
対戦成績が一覧で表示され、お互いの強さが一目瞭然になります。

![reversi4c.png](https://qiita-image-store.s3.amazonaws.com/0/84939/d3c65702-9104-72ca-f08c-e00491c411be.png)

# ■■■ 3. ソースコードを読んでみる... ■■■
まだ多くのバグが埋まっているはずです... 見つけましたら nmby までご一報いただけますと幸いです m(. .)m
ソースの各要素については、追い追い別記事化したいと思います。

実装においては、次の点に留意しました。

* 可能な限り不変クラスを使う。（そして[不変なメンバはゲッタ無しで直接公開しちゃう](http://www.ibm.com/developerworks/jp/java/library/j-ft4/)。）
* Serializable を実装する際は、クラスの恒等式が決して破られないように注意する。
* クラスがスレッドセーフなのか否かをドキュメントで明確化する。スレッドセーフと謳うものは、実際にそうであるように実装する。

要は『Effective Java』で謳われているような点ですね。ただし、理解しきれていない点はあるかもしれません。
なお実装は、『ザ・ジャバ』って感じのコテコテテイストに仕上げてあります☆


今回実装してみて分かったコト

* java.util.stream まわりは非常に便利だけれども、そもそもマルチスレッド・プログラミングについて理解していなかった... orz
* java.util.concurrent まわりもなーんも理解してなかった... orz
* シリアライゼーションは相変わらずよう分からん... orz

java8 どころの話ぢゃないじゃん... orz

～～～

### 免責事項
ソースコードおよびバイナリは MIT ライセンスに基づき公開しています。
利用の結果生じたいかなる損害その他の影響について、一切責任を負いません。
また、公開内容の正しさを保証しません。
詳細は [LICENSEファイル](https://github.com/nmby/reversi/blob/master/LICENSE.txt) をご参照ください。
Centos6.5+Ruby2.2.x+Rails4の構築メモ


##はじめに##
vagrantユーザで/vagrant（共有フォルダ）にRailsプロジェクトが動作するまでの構築手順をメモしたものです。


##構築する環境##
* centos6.5(on vagrant)
* rbenv
* Ruby(2.2.2)
* Rails(4.2.3)

##前提##
vagrant上にcentos6.5環境ができていること。

```:Vagrantfile
config.vm.network :"forwarded_port", guest: 3000, host: 3000
config.vm.network "private_network", ip: "192.168.33.10"
```

##手順概要##
1. Git インストール
2. パッケージインストール
3. rbenv インストール
4. Ruby(2.2.2) インストール
5. Rails(4.2.3) インストール
6. railsプロジェクト作成
7. 動作確認


##1. Git インストール##

```
$ sudo yum install git
```

##2. パッケージインストール##
```
$ sudo yum install gcc make glibc-headers openssl-devel readline libyaml-devel readline-devel sqlite-devel
```

※進める中で必要になったものを追加して修正。修正前のコマンド：~~yum install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel~~

##3. rbenv インストール##

```
$ cd ~
$ mkdir .rbenv
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
```
とりあえずvagrantユーザが使えればいいので~/.rbenv にインストールした

```:パスを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
````
※直接 ~/.bash_profileに''内を書き込んでもよし
ユーザ共通なら /usr/local/rbenv にインストールして、パス設定は /etc/profile にするのかな？

```:バージョン確認
$ rbenv --version     ⇚※
rbenv 0.4.0-153-g3b6faa8
```
※一度、ターミナルを立ち上げ直してから確認

##4. Ruby(2.2.2) インストール##
```:前準備
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```
~~※「rbenv install 2.2.2」を実行したらエラーになり、エラー文の中に「yum install -y readline-devel」とあったので実行~~（パッケージインストール時に行うよう修正）

```:インストール
$ rbenv install 2.2.2
```
ここが一番長いので気長に待つ

```:使用バージョンを設定
$ rbenv global 2.2.2
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
```


##5. Rails インストール##
```
$ gem install rails --no-ri --no-rdoc     ⇚※
```
※--no-ri --no-rdoc を付けるとドキュメント生成を省略して、早くインストールできるらしい

##6. Railsプロジェクト作成##
これから作成するプロジェクトの場所 ⇨ /vagrant/sample

```
$ cd /vagrant
$ rails new sample
```
~~※いきなりnewしたらエラーになり、エラー文のなかに「yum install sqlite-devel」とあったので実行~~（パッケージインストール時に行うよう修正）

```
$ cd sample
$ vim Gemfile
 # gem 'therubyracer', platforms: :ruby     ⇚※
 ⇑ この行をコメントを外す

$ bundle install
```
※「bundle install」は「rails new sample」の時に行われているみたいが、therubyracerとやらがコメントアウトされているので、再度「bundle install」を行う

##7. 動作確認##
```
適当にコントローラを作成
$ rails g controller users index

サーバー起動
$ rails s -b 0.0.0.0     ⇚※
```
ブラウザで以下のURLにアクセスして確認
http://192.168.33.10:3000/users/index

※Rails 4.2～ サーバー起動のデフォルトのホストが0.0.0.0からlocalhostに変更されらしい。ホストマシンからアクセスするには「-b 0.0.0.0」のオプションを付けることで以前と同じ動作を再現できるらしい

##参考にさせてもらったサイト##
・[CentOS/RHEL に Ruby 2.x をインストールする](http://dotnsf.blog.jp/archives/1020034700.html)
・[LinuxにRuby on Railsをインストールする](http://tsuchikazu.net/linux_ruby_on_rails_install/)
・[Vagrant で Ruby on Rails 4 の環境構築](http://qiita.com/Salinger/items/20f466ffe7cc0c04b010)
・[rails環境構築（CentOS + ruby on rails）](http://qiita.com/shinyashikis@github/items/3501c5f7f71a8e345c3d)

##〆に##
色々ハマったがとりあえず動いてよかった。
JavaでListの要素を初期化・追加する方法


#初めに

JavaでListの要素を初期化・追加を設定したい場合のイディオムを幾つか紹介して、
行き着いたものを紹介します。

## 環境
java version "1.8.0_25"です。

#初期化
## asListを使う
検索するとよくでてくる方法がasListを使う方法です。
1行で書けて、要素を並べるだけで良いので可読性も高く便利です。


参考:
http://qiita.com/donsan_24/items/f2be9b6828b73d3fc49e

```java:asListを使う
List<String> list = Arrays.asList("AA", "BB", "CC");
```

ただし、致命的な問題があり、これで生成したListは、固定サイズのArrayListであるためaddやremoveができません。

```java:asListを使う
List<String> list = Arrays.asList("AA", "BB", "CC");

  // UnsupportedOperationExceptionが発生する
list.add("DD");
list.remove(0); 
```

標準ライブラリの問題とも言えますが、固定サイズのリストで大丈夫なら便利かも。
ドキュメントにもちゃんと「固定サイズ」と書かれています。
https://docs.oracle.com/javase/jp/7/api/java/util/Arrays.html#asList(T...)


##インスタンスイニシャライザを使う方法

インスタンス生成時にメソッドを呼ぶ記述法です。
括弧がわかりにくいですが、原理的には「すべてaddする」方法と同じです。

```java:インスタンスイニシャライザを使う
List<String> list = new ArrayList<String>(){
	{
		add("AA");
		add("BB");
		add("CC");
	}
};
```

##コンストラクタでListを与える。

raccyさんにコメントいただきました。
そういえばListのコンストラクタでListを与えることができるのを失念してました。
なので初期化するのはこの方法が良さそうです。

```Java:コンストラクタでListを与える
List<String> list = new ArrayList<>(Arrays.asList("AA", "BB", "CC"));
```


#要素の追加

##すべてaddする
要素分addします。
追加する分行を追加するか
拡張for分などでforを回してしまう事が考えられれます。
（個人的には後者が好きです）

```java:すべてadd追加
List<String> list = new ArrayList<>();
list.add("AA");
list.add("BB");
list.add("CC");
```

```java:forですべてadd追加
List<String> list = new ArrayList<>();
for (String item : new String[]{"AA", "BB", "CC"}) {
	list.add(item);
}
```



##asListとList.addAllを使う
asListで作ったListを対象のListにaddAllしてしまう方法です。
リストを入れなおしているので先ほどの制限を受けないため、こちらもお勧めです。

```
List<String> list = new ArrayList<>();
list.addAll(Arrays.asList("AA", "BB", "CC"));

list.add("DD");
list.remove(0);
```


##Collections.addAllを使う
（実は最近まで知らなかったのですが、色々してたらIntelliJ IDEAが提案してくれたのですごいと思いました。）

```java:Collections.addAllを使う
List<String> list = new ArrayList<String>();
Collections.addAll(list, new String[]{"AA", "BB", "CC"});
```

さらにaddAllの第二引数は可変長引数なのでこう書けます。
追加では多分これが一番よさげだと思ってます。

```java:Collections.addAllを使う
List<String> list = new ArrayList<String>();
Collections.addAll(list, "AA", "BB", "CC");
```




#まとめ
Listの初期要素はコンストラクタにasListで指定、
要素の追加はCollections.addAllを検討してましょう。
ラジコンの改造


##暇なのでラジコンを改造してみる

改造したラジコン
![IMG_1050.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/73020513-6929-c2bf-dc01-51dd6a074ac0.jpeg "IMG_1050.JPG")




![IMG_1040.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/bc15dd73-b971-2f35-033c-3a3df3079383.jpeg "IMG_1040.JPG")


まず中身の確認
![IMG_1042.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/45c31469-9392-82a5-5b59-2a7ea95a3dc5.jpeg "IMG_1042.JPG")

中身は無線用のICとモータドライバのみの単純な構造

##モータドライバのデータシートを確認

使用されていた型番MX1208のデータシートを確認
http://sales.dzsc.com/486178.html

2,3,6,7ピンにUPにすれば操作できることがわかります。

あとは半田付けしてArduino PRO miniで実験
![IMG_1047.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/48092a51-e946-9227-fa70-85c92f5368b9.jpeg "IMG_1047.JPG")

![IMG_1052.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/bb34872b-713d-f0dd-7dd1-b8271e733404.jpeg "IMG_1052.JPG")


簡単に改造ができました。

次はBLEをつないでiPhoneから操作できるように改造しよー！！
msgpack-lite ピュアJavaScript実装の速いMessagePackライブラリ

MessagePack のエンコード・デコードを行う Node.js 用の JavaScript のライブラリを公開しました。
エンコード処理は、C++ で書かれた msgpack ライブラリよりも速いです。（Node.js v0.10.40）
デコード処理も、他の Pure JavaScript のライブラリより速いです。

- デモ → http://kawanet.github.io/msgpack-lite/

## 使い方

エンコード処理：（JSオブジェクトをBufferに変換）

```js
var msgpack = require("msgpack-lite");
var buffer = msgpack.encode({"foo": "bar"}); // => 81 A3 66 6F 6F A3 62 61 72
```

デコード処理：（BufferをJSオブジェクトに変換）

```js
var data = msgpack.decode(buffer); // => {"foo": "bar"}
```

上記のような１メッセージごとの変換に加えて、ストリーミングでの連続変換にも対応しています。

## ベンチマーク

Node.js 用のいろいろなライブラリで、JS オブジェクトと Buffer を相互変換した結果です。
右端 op/s の値がスコアで、1秒あたりの変換処理数です。

operation                                                      | result             | op/s
-------------------------------------------------------------- | ------------------ | -----
buf = Buffer(JSON.stringify(obj));                             | 225700op / 10001ms | 2256
obj = JSON.parse(buf);                                         | 243000op / 10000ms | 2430
buf = require("msgpack").pack(obj);                            | 182000op / 10014ms | 1817
obj = require("msgpack").unpack(buf);                          | 232100op / 10004ms | 2320
**buf = require("msgpack-lite").encode(obj);**                 | 203300op / 10001ms | **2032**
**obj = require("msgpack-lite").decode(buf);**                 | 145700op / 10003ms | **1456**
buf = Buffer(require("msgpack-javascript").msgpack.pack(obj)); | 138400op / 10010ms | 1382
obj = require("msgpack-javascript").msgpack.unpack(buf);       | 102000op / 10007ms | 1019
buf = require("msgpack-js-v5").encode(obj);                    | 28900op / 10032ms  | 288
obj = require("msgpack-js-v5").decode(buf);                    | 99600op / 10008ms  | 995
buf = require("msgpack-js").encode(obj);                       | 28700op / 10004ms  | 286
obj = require("msgpack-js").decode(buf);                       | 104600op / 10012ms | 1044
buf = require("msgpack5")().encode(obj);                       | 4500op / 10025ms   | 44
obj = require("msgpack5")().decode(buf);                       | 18600op / 10024ms  | 185
obj = require("msgpack-unpack").decode(buf);                   | 1600op / 10245ms   | 15

このうち [msgpack-javascript](https://github.com/msgpack/msgpack-javascript) とは、本家レポジトリにある [msgpack.codec.js](https://raw.githubusercontent.com/msgpack/msgpack-javascript/master/msgpack.codec.js) のことです。

- ベンチマーク環境：Node.js v0.10.40, AWS EC2 m3.medium, Amazon Linux AMI release 2015.03

## 備考

- GitHub → https://github.com/kawanet/msgpack-lite
- NPM → https://www.npmjs.com/package/msgpack-lite

いちおう、デモできるように browserify 対応でブラウザでも動きますが、今のところ、ブラウザ上の処理速度は追いかけていないので、速いかどうかは分かりません。（buffer の状況による）
capistrano3で突然deploy時githubのprivate repositoryにssh接続できなくなった

# エラー
```
ERROR: Repository not found.
DEBUG [d98d0ce0] 	fatal: Could not read from remote repository.
DEBUG [d98d0ce0]
DEBUG [d98d0ce0] 	Please make sure you have the correct access rights
DEBUG [d98d0ce0] 	and the repository exists.
```

# 原因
リモートサーバーのsshキーを持ったリードエンジニアがgithubから抜けた

# 解決法
SSH Agent Forwarding(参考)
デプロイ先にSSHを設定する
# デプロイ先にSSHを設定する
デプロイ用にssh-keygen

->


```
eval 'ssh-agent bash'
ssh-add
```

または

```.ssh/config
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_for_git
  User git
```

## それでもエラー
Hostの方に.comを入れていなかったためエラーが発生したよう

```.ssh/config
Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_for_git
  User git
```


# 参考
http://qiita.com/ryshinoz/items/cc3a526c92bf79d3bfe3
Crystal - Array - Instance Method - swap #crystal

## <i class="fa fa-diamond" style="font-size:1em;"></i> 概要
CrystalのArrayクラスのインスタンスメソッド`swap`について

## <i class="fa fa-check-circle" style="font-size:1em;"></i> シグネチャ
`def swap(index0, index1)`

破壊的操作です。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
hoges = ["hoge", "hige", "hage"]
pp hoges.swap(0,1)
pp hoges
pp hoges.swap(0,-1)
pp hoges
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~ruby
hoges.swap(0, 1) = ["hige", "hoge", "hage"]
hoges = ["hige", "hoge", "hage"]
hoges.swap(0, -1) = ["hage", "hoge", "hige"]
hoges = ["hage", "hoge", "hige"]
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Array - Crystal API Library](http://crystal-lang.org/api/index.html#http%3A//crystal-lang.org/api/Array.html)
2015年8月時点でのvimでGoを使うときに入れた設定


vimと関係無いもの

* https://github.com/jstemmer/gotags
* https://github.com/buaazp/Godef
* https://github.com/motemen/go-quickfix

vimのプラグイン

* https://github.com/fatih/vim-go
* https://github.com/majutsushi/tagbar

vimの設定(丸コピ

```vim
au FileType go nmap <leader>r <Plug>(go-run)
au FileType go nmap <leader>b <Plug>(go-build)
au FileType go nmap <leader>t <Plug>(go-test)
au FileType go nmap <leader>c <Plug>(go-coverage)
au FileType go nmap <Leader>ds <Plug>(go-def-split)
au FileType go nmap <Leader>dv <Plug>(go-def-vertical)
au FileType go nmap <Leader>dt <Plug>(go-def-tab)
au FileType go nmap <Leader>gd <Plug>(go-doc)
au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
au FileType go nmap <Leader>gb <Plug>(go-doc-browser)
au FileType go nmap <Leader>s <Plug>(go-implements)
au FileType go nmap <Leader>i <Plug>(go-info)
au FileType go nmap <Leader>e <Plug>(go-rename)

let g:tagbar_type_go = {
    \ 'ctagstype' : 'go',
    \ 'kinds'     : [
        \ 'p:package',
        \ 'i:imports:1',
        \ 'c:constants',
        \ 'v:variables',
        \ 't:types',
        \ 'n:interfaces',
        \ 'w:fields',
        \ 'e:embedded',
        \ 'm:methods',
        \ 'r:constructor',
        \ 'f:functions'
    \ ],
    \ 'sro' : '.',
    \ 'kind2scope' : {
        \ 't' : 'ctype',
        \ 'n' : 'ntype'
    \ },
    \ 'scope2kind' : {
        \ 'ctype' : 't',
        \ 'ntype' : 'n'
    \ },
    \ 'ctagsbin'  : 'gotags',
    \ 'ctagsargs' : '-sort -silent'
\ }
```
macにdocker toolboxをインストールする

# docker toolboxについて

boot2dockerの後継に当たるツールらしい。
dockerのバージョンは、1.8になる。

# 前提

boot2dockerがインストールされている環境でインストールしました。
ただ、boot2dockerがインストールされていなくても手順はほとんど変わらないと思います。

# インストール手順

下記サイトからpkgをインストール。
https://www.docker.com/toolbox

インストーラが起動するので、指示にしたがってインストールする。
boot2dockerがインストールされている環境では、Margeするかどうか聞かれるため、Margeを選択。

Virtual BoxにdefaultというVMが作成され、起動していれば大丈夫。
（boot2docker VMではなく、defaultというVMを使用します。）

ターミナルでdocker -vを実行すると以下のようになっているはず。

```sh
docker -v
Docker version 1.8.1, build d12ea79
```

# docker VMの操作

boot2dockerからコマンドが変わっています。

起動

```sh
docker-machine start default
```

状態確認

```sh
docker-machine status default
```

終了

```sh
docker-machine stop default
```

一度終了して、再度起動した場合は、環境変数を再設定する必要があるため、

```
Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```

と出るので、指示の通り以下のコマンドを入力。

```sh
docker-machine env default
```

コマンドを入力すると、環境変数の設定などがされた後、以下のコメントが出力される。

```
# Run this command to configure your shell: 
# eval "$(docker-machine env default)"
```

指示通りに以下のコマンドを入力すると、dockerコマンドでdefault　VMを操作出来る。

```sh
eval "$(docker-machine env default)"
```
docker-machineを切り替えるzsh関数

`eval $(docker-machine env foo)` とタイプするのが面倒なので、以下の様なzsh関数を作りました。

```zsh
function dm-use() {
  if [ $# != 1 ]; then
    echo $DOCKER_MACHINE_NAME
  else
    eval $(docker-machine env $1)
  fi
} 
```

* `dm-use` で現在のVM名を表示
* `dm-use name` で指定の名前のVMのenvを設定

それだけです。`~/.zshrc` あたりに入れておけばokです。
ツイッターで同じ本文のツイートをし続ける

初投稿です。
Twitterで同じ内容のツイートをしようとすると、重複していると言われ、ツイートできない。
そこで、完全に同じ内容とは言い切れないが同じツイートをする方法がある。
もしかしたら、既出かもしれないかもしれないしつまらない話になると思うが、僕自身ここで投稿してみたいという思いが強い。許し亭許して。

#ほんだい
じゃあ、どうやって同じツイートをし続けるか、
**in_reply_to_status_id**を変え続けてツイートしたらいいのだ。

言語はなんでも問題ないんだけど僕はphpでやっとこさなのでphp。
ライブラリは[TwistOAuth](https://github.com/mpyw/TwistOAuth)を使っています。

```php:ketsu.php

require 'TwistOAuth.php';

$to = new TwistOAuth(ck,cs,ot,os);
$id = null;
do{
	$res = $to->post('statuses/update', array('status' => 'ケ ツ マ ン ア ト ム', 'in_reply_to_status_id' => $id));
}while($id = $res->id_str);
```
こうすることでケ ツ マ ン ア ト ムとツイートし続けます。

エラー処理してないガバガバコードだけど許して

[ここ](https://twitter.com/_QXT_/status/632165776460378112)から見てもらえばわかる通り、ずーーっとリプライが続く形で連投されていきます。
こんなふうになっちゃうよ↓
![alt](https://pbs.twimg.com/media/CMYMwsBUcAAgzg4.png)

#だからなんだよ
たのしい
まあ要は、**in_reply_to_status_id**を変え続けてツイートしたらいいのだ。ということだけです。ありがとうございました。
Macでmd5ハッシュの比較を行う

Macでmd5ハッシュの比較を行う
============================

Linuxのmd5だと `md5 -c md5.txt` あるいは `md5 --check md5.txt` でハッシュ値の検証ができますが、残念ながらMacのmd5ではこのオプションがありません。

目で見て比較するのも面倒なのでどうにかハッシュの比較ができないかやってみました。
どうにか出来たので備忘録代わりにメモっておきます。

```bash
$ grep -f <(md5 -r ${ハッシュをチェックしたいファイル} | cut -d " " -f 1) md5sum.txt
```

使用例)

```bash
$ grep -f <(md5 -r CentOS-6.7-x86_64-bin-DVD1.iso | cut -d " " -f 1) \
md5sum.txt
51f90e8ddd2ea199780065eaf75130ad  CentOS-6.7-x86_64-bin-DVD1.iso
```

ファイルが正しければ(ハッシュがリストに存在すれば)該当行が出力されます。
逆に言うと何も出力されなければファイルが正しくないということですね。



他にもあれば随時追記予定です。
swift iOS8カメラ制御（撮影、保存）

準備は[キャプチャセッションのセットアップ](http://qiita.com/mr0505iwaki/items/013913d11327d88ef6ba)を参照

１、画像を取得
２、取得した画像をJpegに変換
３、JpegからUIImageを作成してアルバムに追加


```swift
//カメラにつながっているコネクションを選択
let videoConnection = ImageOut.connectionWithMediaType(AVMediaTypeVideo)
        
//接続から画像を取得
self.ImageOut.captureStillImageAsynchronouslyFromConnection(videoConnection, 	completionHandler:
	{(imageDataBuffer: CMSampleBuffer?, error:NSError?)->Void in
    	if(imageDataBuffer == nil){
             //error
       }
                
       //取得したImageのDataBufferをJpegに変換
      let imageData: NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer)
                
       //JpegからUIImageを作成
       let image : UIImage = UIImage(data: imageData)!
                
       //アルバムに追加
       UIImageWriteToSavedPhotosAlbum(image, self, nil, nil)
    }
)

```
[github StillCamera Capture](https://github.com/Atsushi-Komuro/StillCamera.git)
VagrantでWindows boxを構築する

# まえがき
VagrantでWindowsをゲストとしたBoxを構築する場合、Linuxなどで使用される起動時のSSHが使用出来ない。

Windowsがゲストの場合、WinRMというSOAPベースのプロトコルが使用されるらしい。

そのため、box化するWindowsのWinRMの設定が必要となるのだが、設定がなかなか見つからなかったためまとめておく。

# 設定手順(ゲスト側)
## Vagrantユーザーの追加
これは…管理者権限持った「vagrant」という名前のユーザーを「vagrant」というパスワードで追加してやればいいだけなので割愛。

## firewallの穴あけ
WinRMが使用する以下のTCPポートを開る。

| port |
|------|
| 5985 |
| 5986 |

## Enable-PSRemoting
これをやらないと、ハマります。
PowerShellを「管理者として実行」で起動して

```
Enable-PSRemoting
```

と入力し、以下のようなメッセージが出てきたら、 A を入力していく

```
PS C:\WINDOWS\system32> Enable-PSRemoting

WinRM クイック構成
Windows リモート管理 (WinRM)
サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
 これには、次の処理が含まれます:
    1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
    2. WinRM サービスのスタートアップの種類を [自動] に設定します。
    3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
    4. WS-Management トラフィック用の Windows
ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。

続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):a
WinRM は既にこのコンピューター上で要求を受信するように設定されています。
このコンピューター上でのリモート管理には、WinRM が既に設定されています。

確認
この操作を実行しますか?
対象 "名前: microsoft.powershell SDDL:
O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;IU)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)。選択し
たユーザーがこのコンピューターに対して Windows PowerShell
コマンドをリモートで実行できるようにします。" に対して操作 "Set-PSSessionConfiguration"
を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):a
PS C:\WINDOWS\system32>
```

## WinRMの設定
そのまま、PowerShellで以下を実行する。

```
winrm quickconfig -q
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="512"}'
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
sc.exe config WinRM start= auto
```

## 疎通確認
そのままPowerShellから以下を実行

```
(-Split (( winrm id | where {$_ -like '*ProductVersion*'}) -Split '=')[1])[5]
```

エラーにならなければ（「3.0」と表示されるはず）OK。

# 設定手順(ホスト側)
VagrantfileのVMのWindowsのboxベースのVMの設定に以下を記載する

```
    config.vm.guest = :windows
    config.vm.communicator = "winrm"

    config.vm.provider "virtualbox" do |vb|
      vb.gui = true
      vb.memory = "4096"
      vb.customize ["modifyvm", :id, "--paravirtprovider", "hyperv", "--hardwareuuid", "ほげほげ"]
    end
```

# 備考
「modifyvm」で「hardwareuuid」を指定しているのは、ライセンス認証を通したマシンのUUIDを設定しておかないと、別のマシンと判断されて、ライセンス認証しないといけなくなるため…
悪用厳禁です！
同じ「hardwareuuid」を持ったVMを同時起動しないこと！（同時起動するとライセンス違反になると思いますので…同じマシンが２つあるって、そもそも、あり得ないお話でしょうから）

# 参考
[PowerShellでリモートPCの操作を行うに為にEnable-PSRemotingをするための準備](http://tech.guitarrapc.com/entry/2013/02/12/000202)
[WindowsでVagrantを扱う私的まとめ (Windows OSのBox作成編 Part.1)](http://stknohg.hatenablog.jp/entry/2015/01/19/234136)
dplyr で素数列挙 SQL #rstatsj

@gg_hatano さんのこういう話がある。

- [SQLで素数列挙](http://qiita.com/gg_hatano/items/9127e3a3b2dd25defcb1)

これを dplyr でやってみる。

まずは DB テーブルの用意。

```r:R
library(dplyr)

df <- data.frame(num=1:100)
srcs <- temp_srcs("sqlite")
tbls <- dplyr:::temp_load(srcs, list(df=df))
temp_tbl <- tbls$sqlite$df

print(temp_tbl)
```

```:結果
Source: sqlite 3.8.6
From: tvjegatmvj [100 x 1]

   num
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  10
.. ...
```

こうして作られた一時テーブル `tvjegatmvj` から、素数だけを取り出したい。

戦略は元記事と同じなのでそちらを参照のこと。
dplyr ではサブクエリを直接書けないようなので、まずはサブクエリを作って SQL を取り出す。

```r:R
subq <- temp_tbl %>% 
  rename(s2.num=num) %>%
  collapse %>%
  filter(num >= s2.num * s2.num) %>% 
  filter(s2.num > 1) %>%
  filter(num %% s2.num == 0) %>%
  { .$query$sql }

print(subq)
```

```:結果
<SQL> SELECT "s2.num"
FROM (SELECT "num" AS "s2.num"
FROM "tvjegatmvj") AS "_W19"
WHERE "num" >= "s2.num" * "s2.num" AND "s2.num" > 1.0 AND "num" % "s2.num" = 0.0
```

このサブクエリを使ってクエリを作成する。

```r:R
q <- temp_tbl %>%
  filter(num > 1) %>%
  filter(`not exists`(subq))

print(q$query)
```

```:結果
<Query> SELECT "num"
FROM "tvjegatmvj"
WHERE "num" > 1.0 AND NOT EXISTS(SELECT "s2.num"
FROM (SELECT "num" AS "s2.num"
FROM "tvjegatmvj") AS "_W25"
WHERE "num" >= "s2.num" * "s2.num" AND "s2.num" > 1.0 AND "num" % "s2.num" = 0.0)
<SQLiteConnection>
```

これを実行して結果を取得する。

```r:R
prime_nums <- q %>% collect

print(prime_nums)
```

```:結果
Source: local data frame [25 x 1]

   num
1    2
2    3
3    5
4    7
5   11
6   13
7   17
8   19
9   23
10  29
.. ...
```

無事、素数が取り出せた。

Enjoy!

## 関連

- [dplyr でデータベースを扱うときの情報をそろそろまとめておく](http://qiita.com/hoxo_m/items/341f499eb4117eec41df)
Vim メモ Buffer関連

# Buffer 関連

####### `:ls`
全バッファ表示

####### `<C-^>`
直前のバッファに切り替え

####### `:bn`
次のバッファへ移動

####### `:bp`
前のバッファへ移動

####### `:bf`
最初のバッファへ移動

####### `:bl`
最後のバッファへ移動


####### `:b バッファ番号`
指定バッファ番号のバッファへ移動。バッファ番号は`:ls`で調べられる。


####### `:b 文字列`
文字列がファイルパスに含まれるバッファに切り替え。これ便利！！
複数のバッファにマッチしてしまう場合は、`<C-i>`,`<C-d>で補完可能

###### `:bd`
Buffer削除。単に`:bd`ならアクティブのBufferが削除。バッファ番号指定したいときには`:bd 1 3 5`のように指定可能。もしくは`3,5:bd`のような指定も可。
犬画像をGoogle画像検索から保存

* ！！このGoogle Image APIは使えなくなっています！！

## 参考

* [PythonでGoogle画像検索から画像を自動収集](http://networks.blog.jp/python/urllib2_google%E7%94%BB%E5%83%8F%E5%8F%8E%E9%9B%86)
  * 日本語での画像検索に対応されていなかった
  * windows向けに書かれていたのでLinux用に修正
  * せっかくなので巨大な画像(huge)のみ取得

## 準備

```bash:
sudo pip install httplib2
```

## コード

```py:get_imgs.py
#-*- coding:utf-8 -*-
import json
import os
import urllib2
import httplib2
import shutil

# search_wordの画像リンクを探索
def get_img_urls(search_word, n):
    img_url=[]
    images_per_request=8
    # https://developers.google.com/image-search/v1/jsondevguide
    url = "http://ajax.googleapis.com/ajax/services/search/images?q={0}&v=1.0&imgsz=huge&rsz="+str(images_per_request)+"&start={1}"
    urlencoded = urllib2.quote(search_word)
    # search_wordと一致する画像URLをn個取得
    for i in range(n):
        res = urllib2.urlopen(url.format(urlencoded, i*images_per_request))
        data = json.load(res)
        img_url += [result["url"] for result in data["responseData"]["results"]]
    return img_url

# URL先の画像ファイルを保存
def url_download(search_word,urls):
    if os.path.exists(search_word)==False:
        os.mkdir(search_word)
    opener = urllib2.build_opener()
    http = httplib2.Http(".cache")
    # URLの数だけ画像DL
    for i in range(len(set(urls))):
        try:
            fn, ext = os.path.splitext(urls[i])
            response, content = http.request(urls[i])
            with open(str(i)+ext, 'wb') as f:
                f.write(content)
            shutil.move((str(i)+ext).encode("utf-8"), search_word)
        except:
            continue

# nは10だと失敗した。8ならok
def main(search_word, n):
    urls = get_img_urls(search_word, n)
    url_download(search_word,urls)

if __name__ == '__main__':
    main("子犬 チワワ", 2)
    main("チワワ お座り", 2)
```

* images_per_request=8 としているので、上記例では2*8枚取得します。
Docker-machine using VMware Fusion



自分用にメモ。
これで Vagrant の VMWare Fusion Integration 無しでも大丈夫かも。

# 準備
## VMWare Fusionのインストール
* Dockerコンテナを動かす machine は VMware Fusion を使うので、これをあらかじめインストールしておく

## Docker Toolbox のインストール
* https://www.docker.com/toolbox からイメージを取得、インストール
  * /usr/local/bin 以下にdockerやdocker-machine コマンドがインストールされる


# machine の管理
## machineの作成

```
docker-machine create --driver vmwarefusion <machine_name>
```

例えばdefaultという名前のmachineを作成するには

```
docker-machine create --driver vmwarefusion default
```

とする。
machineをカスタマイズするには

```
docker-machine create \
  --driver vmwarefusion \
  --vmwarefusion-cpu-count "2" \
  --vmwarefusion-memory-size "2048" \
  --vmwarefusion-disk-size "40000" \
  default-2cpu-2gb-40gb
```

などオプションで指定できる。

## machine の確認

```
docker-machine ls
```

出力例)

```
NAME                    ACTIVE   DRIVER         STATE     URL                         SWARM
default                          vmwarefusion   Running   tcp://172.16.148.136:2376
default-2cpu-2gb-40gb            vmwarefusion   Running   tcp://172.16.148.137:2376
```


## docker を動かすための環境変数の確認

```
docker-machine env <machine_name>
```

出力例)

```
$ docker-machine env default                                                                                            export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.16.148.136:2376"
export DOCKER_CERT_PATH="/Users/xxx/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval "$(docker-machine env default)"
```


例えば machine名 default を (dockerコマンドに対して) active にするには

```
eval "$(docker-machine env default)"
```

`docker-machine ls` で確認すると default がactiveになる

```
NAME                    ACTIVE   DRIVER         STATE     URL                         SWARM
default                 *        vmwarefusion   Running   tcp://172.16.148.136:2376
default-2cpu-2gb-40gb            vmwarefusion   Running   tcp://172.16.148.137:2376
```

解除するには 環境変数を解除する(`-u`はunset)

```
eval "$(docker-machine env -u)"
```

## machine の起動

```
docker-machine start <machine_name>
```

## machine の停止

```
docker-machine stop <machine_name>
```


## machine の削除

```
docker-machine rm <machine_name>
```

# docker の利用

上記環境変数が正しく設定されていれば、対象のmachineに対してdockerコマンドが使える。

テスト例)

```
$ docker-machine active
deafult
$ docker run busybox echo hello world
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox

cf2616975b4a: Pull complete
6ce2e90b0bc7: Pull complete
8c2e06607696: Pull complete
Digest: sha256:df9e13f36d2d5b30c16bfbf2a6110c45ebed0bfa1ea42d357651bc6c736d5322
Status: Downloaded newer image for busybox:latest
hello world
```



### 参考
* https://docs.docker.com/machine/
* http://dev.classmethod.jp/tool/docker1-8-macosx/
VIM メモ 挿入モードのショートカット

vimのメモを週一くらいで書いていこうかと思う。
そのうちちゃんとまとめたい。

***

# 挿入モードの必須ショートカット

###### `<C-[>`
ノーマルモードに戻る。`<ESC>`より押しやすい。

###### `<C-h>`
直前の１文字削除。これは皆使っていると思う。

###### `<C-u>`
現在の行のカーソルより手前の文字を全部消す。
文章書いている途中に「やっぱりこの文章やめた」のときに多用。

###### `<C-w>`
直前の１単語を消す。英語書いているときに多用するが、日本語書いているときには使いにくいかも。

###### `<C-r>0`
ywとかでyankしたもの（レジスタ0に保存されている)をペースト。
これを使いこなせると便利になる。

``` c:
#define = HOGEHOGE;

int foo = FOO;

```

のような文章で`FOO`を`HOGEHOGE`に書き換えたい場合に、`HOGEHOGE`のところで`yiw`して、FOOのところで`ciw<C-R>0<ESC>`するのが常套手段

###### `<C-o>`
ノーマルモードに一瞬戻ってコマンド実行して挿入モードに戻る。
例えば`<C-o>$`で、行末に移動して編集続行
Telnetの自動化

#なぜ自動化する？
例えばtelnetでsmtpの疎通確認をするとき、telnetは対話型のコマンドなので、
telnet 192.168.1.1 25

と接続し、正常に接続できることを確認したら、手入力でquitと入力し、telnet接続を終了していました。
しかしながらこれ本番作業の度にやるのは結構手間です。
確認対象のメールサービスが複数あるとさらに時間がかかります。

そこでサブシェルでtelnetへの入力を用意しておき、telnetに渡してみた。

#コマンド

```console
#(sleep 0.5;echo quit) | telnet 192.168.1.1 25
```

なお、サブシェルが完了したらtelnet接続は終了するため、quitをわざわざ仕込む必要はない模様。



実行例

```console
# (sleep 1;echo quit) | telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 test.localdomain ESMTP Postfix
Connection closed by foreign host.
#
```

#コマンド説明
最初にかっこ内でサブシェルでコマンドを作成しておき、それをtelnetにパイプで渡している。
サブシェルではsleepが必要。sleepしなければ、実行が速すぎてtelnetにわたる前に実行されてしまう。
sleepを何秒にするべきかは実際にtelnetしてみてどれくらいで反応が返ってくるかで決める。

こうすることで、今まで何回かの手入力が必要だったtelnetでの疎通確認が、
ワンライナーで実現できました。

#改良
220が接続成功の意味なので、grepで強調表示してみた。

```console

# (sleep 1;echo quit) | telnet localhost 25 | grep 220 --color
220 test.localdomain ESMTP Postfix
Connection closed by foreign host.
#
```
(実際には220が赤色強調表示される。)


一度に複数のメールサービスの疎通確認したい場合、以下のように３つ一度にコピーして貼り付けすれば一気に実行できる。

```console
(sleep 0.5;echo quit) | telnet 192.168.1.1 25
(sleep 0.5;echo quit) | telnet 192.168.1.2 25
(sleep 0.5;echo quit) | telnet 192.168.1.3 25
```


#応用
smtpに限らずtelnetで接続できるものには何でも応用できる。
例えばスイッチにログインし、インターフェース情報を取ってきてみた。

```console
# (sleep 1;echo <ユーザ名>; sleep 1; echo <パスワード>;sleep 1;echo show ip int bri fa 0/1;sleep 1) | telnet
 192.168.1.1 23
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.


User Access Verification

Username: admin
Password:
Switch>show ip int bri fa 0/1
Interface              IP-Address      OK? Method Status                Protocol
FastEthernet0/1        unassigned      YES unset  up                    up
Switch>Connection closed by foreign host.
#

```



#弱点
sleepを使っておりますので、もちろんマシン負荷やネットワーク状況によって反応速度の変化が大きい環境では、
コマンドの組み合わせがちぐはぐになってうまく実行されない可能性もあります。（=毎回の動作保証はない）
よって、あくまで人の目がある状況下での半自動化用途に最適かと思います。
完全に自動化するならexpect等コンソールの反応を識別できるものを利用したほうがよいと思います。