OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリの利用ライブラリ情報　〜　NYT Now編　〜

[iOSアプリの利用ライブラリ情報　アーカイブへ](http://qiita.com/andeight/items/d6a1a19f606ea563b548)

## アプリについて

- アプリ　：　NYT Now
- URL　　：　http://www.nytimes.com/nytnow/
- New York Timesが提供しているニュースアプリ。特徴としては、その日の重要なニュースをシンプルなUIで提供してくれる

## 利用ライブラリ

- ARSafariActivity
アクティビティーにサファリで開くが追加されている

- CMDQueryStringSerialization
簡単に辞書型とクエリーストリングを変換できる。

- CocoaLumberjack
ログの出力先などを柔軟に設定できる。

- Hockey SDK
？

- JMStaticContentTableViewController
カスタムテーブルビュー

- Localytics
解析ツールのSDK

- Masonry
AutoLayoutのConstrainsをシンプルな記法で書けるようになる

- NSHash
NSStringとNSDataにハッシュのメソッドを追加している

- SDWebImage
簡単に画像を非同期でダウンロードできて、かつUIImageViewに設定することができる

- SSZipArchive
ファイルの圧縮/解凍ができる

- SVProgressHUD
ローディング

- uiimage-from-animated-gif
GIFをUIImageViewで表示する

[iOSアプリの利用ライブラリ情報　アーカイブへ](http://qiita.com/andeight/items/d6a1a19f606ea563b548)
Ubuntu16.04 vagrantで環境を作ろうとしたときのエラー

##Ubuntu16.04でvagrantを起動した際に起こった現象

初めにこの現象が起きた手順も記載しておきます。
ubuntuをインストールしている前提で話を進めていきます。

```ruby:terminal
sudo apt-get upgrade
```
をしました。
そのあとにVirtualBoxとvagrantをインストール

vagrantの下準備まで完了さして、


```ruby:terminal
sudo vagrant up
```
コマンドをした際にエラーが起きました。
VBoxManage --Version を確認しろ？
みたいなエラーが出たので確認すると

```ruby:terminal
sudo VBoxManage --Version
```
とここでもエラーが...(´・ω・`)
sudo /sbin/rcvboxdrv setupをしろとのこと

```ruby:terminal
sudo /sbin/rcvboxdrv setup
```

だけどここでもエラー
Starting VirtualBox kernel modules ...failed!

カーネルのバージョンに問題があるかもしれない...
てことで調べてみる。

```ruby:terminal
sudo uname -rv
```
4.4.0-31-genericになってる...

```ruby:terminal
sudo dpkg --list | grep linux-image
```
でインストールされているバージョン確認

```ruby:
ii  linux-image-4.4.0-21-generic
ii  linux-image-4.4.0-31-generic
ii  linux-image-extra-4.4.0-21-generic
ii  linux-image-extra-4.4.0-31-generic
```

2つ入ってる
けど使われているバージョンは最新だからこれをデフォルトの4.4.0-21-genericに
戻してみる。

```ruby:terminal
sudo vim /etc/default/grub
```

```ruby:/etc/default/grub
GRUD_DEFAULT=0
GRUD_HIDDEN_TIMEOUT=0
```
になっているので下記のように書き換え

```ruby:/etc/default/grub
GRUD_DEFAULT="Ubuntu, with Linux 4.4.0-21-generic"
#GRUD_HIDDEN_TIMEOUT=0
```

これでいいはず！

```ruby:terminal
sudo update-grub
```

だけどここでエラーが

```ruby:
Warning: Please don't use old title `Ubuntu, with Linux 4.4.0-21-generic' for GRUB_DEFAULT, use `Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-21-generic' (for versions before 2.00) or `gnulinux-advanced-8fb09bc8-001b-4a90-b14f-ac4c5a1421ef>gnulinux-4.4.0-21-generic-advanced-8fb09bc8-001b-4a90-b14f-ac4c5a1421ef' (for 2.00 or later)
Adding boot menu entry for EFI firmware configuration
done
```


てことは

```ruby:/etc/default/grub
GRUD_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-21-generic"
```
これでいけるかな？

```ruby:terminal
sudo update-grub
```

とおったー！
てことで再起動して

```ruby:terminal
sudo /sbin/rcvboxdrv setup
```
エラーが出ないで行けた！

```ruby:terminal
sudo VBoxManage --Version
```
バージンの確認

```
5.0.26r108824
```
これでいけるかな

```ruby:terminal
vagrant up
```
起動確認完了！

初めにapt-get upgradeをしたせいでカーネルの最新版ば入ったみたいです。(´・ω・`)
[Sidekiq] ローカルでSidkiqが動かなくなった時の対処方法 ~ 0から始めるRails編 ~


# ローカルでSidkiqが動かなくなった時の対処方法


## エラー状態
ちなみにこのような画面のまま, プロセスが一切立ち上がらず何も処理されないままになってました。
<img width="457" alt="スクリーンショット 2016-08-01 14.36.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/5c3d754b-c904-d8dc-c2cf-012db92d1494.png">

ちなみにソースと実行コマンドは以下の通りです。
実行コマンドはこちら

```rb
rails c
> HogeWorker.perform_async
```

```ruby:app/workers/hoge_worker.rb
class HogeWorker
  include Sidekiq::Worker

  def perfor(*args)
    p "hogehoge"
  end
end
```

```config/sidekiq.yml
:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 20
:queues:
   - default
```

## 対処方法
Gemfileの記述に問題あり!
おそらく sidekiqとrspec-sidekiqの内容が競合しているのではないかと
ということで以下のように書き直してあげるとうまく実行されるはずです。

```diff:Gemfile
group :development, :test do
  # 省略
  gem 'rspec-sidekiq', require: false # <= こいつが問題!
end 
```

```diff:Gemfile
group :development, :test do
  # 省略
-  gem 'rspec-sidekiq' # <= こいつが問題!
end 


group :test do
  gem 'rspec-sidekiq'
end
```
# つぶやき

近々 ActiveJob + Sidekiqの導入方法を書こうと思います。

## 参考サイ
http://yss44.hatenablog.com/entry/2013/12/25/073226
OpenShiftでSpringBootを動かす


## やりたいこと

Gradleで作成したSpringBootのプロジェクトをOpenShiftで実行する。
OpenShiftのアプリケーションはDIYで作成する。
ソースも、Bitbucketで管理することで、無料でソース管理をし、実行環境を構築する。

## 前提

Gradleで作成したSpringBootのプロジェクトがBitbucketのリポジトリに存在する。
OpenShiftのアカウントがあり、rhcコマンドがしようできるようになっている。

## OpenShift用のファイルを作成する

プロジェクトのルートディレクトリに .openshift/action_hooks ディレクトリを作成し、
deploy,start,stopファイルを作成する。

deploy : JDK,Gradleがなければをダウンロードし、gradleでパッケージを作成する。

```bash:deploy
#!/bin/bash

set -x

if [ ! -d $OPENSHIFT_DATA_DIR/jdk1.8.0_101 ]; then
   cd $OPENSHIFT_DATA_DIR
   wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jdk-8u101-linux-x64.tar.gz
   tar xvf *.tar.gz
   rm -f *.tar.gz
fi

if [ ! -d $OPENSHIFT_DATA_DIR/gradle-2.13 ]; then
    cd $OPENSHIFT_DATA_DIR
    wget https://services.gradle.org/distributions/gradle-2.13-bin.zip
    unzip gradle-2.13-bin.zip
    rm -f gradle-2.13-bin.zip
fi

if [ ! -d $OPENSHIFT_DATA_DIR/gradle ]; then
    cd $OPENSHIFT_DATA_DIR
    mkdir gradle
fi

if [ ! -d $OPENSHIFT_DATA_DIR/logs ]; then
    cd $OPENSHIFT_DATA_DIR
    mkdir logs
fi

cd $OPENSHIFT_REPO_DIR
export GRADLE_USER_HOME=$OPENSHIFT_DATA_DIR/gradle
export GRADLE_HOME=$OPENSHIFT_DATA_DIR/gradle-2.13
export JAVA_HOME=$OPENSHIFT_DATA_DIR/jdk1.8.0_101
export PATH=$JAVA_HOME/bin:$GRADLE_HOME/bin:$PATH

gradle bootRepackage
```

start : 起動時に実行されるスクリプト

```bash:start
#!/bin/bash

source $OPENSHIFT_CARTRIDGE_SDK_BASH

set -x

export JAVA_HOME=$OPENSHIFT_DATA_DIR/jdk1.8.0_101
export PATH=$JAVA_HOME/bin:$PATH

cd $OPENSHIFT_REPO_DIR
nohup java -jar build/libs/*.jar --server.port=${OPENSHIFT_DIY_PORT} --server.address=${OPENSHIFT_DIY_IP} &
```

stop : 停止時に実行されるスクリプト

```bash:stop
#!/bin/bash

source $OPENSHIFT_CARTRIDGE_SDK_BASH

PID=$(ps -ef | grep java.*\.jar | grep -v grep | awk '{ print $2 }')

if [ -z "$PID" ]
then
    client_result "Application is already stopped"
else
    kill $PID
fi

```

各ファイルは実行権を追加する。

## OpenShiftにアプリケーションを作成する。

以下のコマンドでDIYカートリッジでアプリケーションを作成する。

```
rhc app create <app-name> diy-0.1
```

テンプレートのファイルが作成されるので、一度削除し、コミットする。

```
cd <app-name>
git rm -rf .openshift README.md diy misc
git commit -am "Removed template application source code"
```

Bitbucketのリポジトリをリモートリポジトリとして追加し、pullする。

```
git remote add upstream https://<user>@bitbucket.org/<user>/<repository>.git
git pull -s recursive -X theirs upstream master
```

Bitbucketのからpullしたファイルを、OpenShiftにpushする。

```
git push
```

deploy, start の各ファイルが実行されるので、SpringBootが起動したら、ブラウザで画面にアクセスする。

```
http://<app-namd>-<domain>.rhcloud.com/
```

## メモ

- action_hooksのファイルに実行権を忘れると、当たり前だが、失敗する。
- build.gradleは、変更しなかった。

## 参考

- [Spring Bootキャンプ ハンズオン資料](http://spring-boot-camp.readthedocs.io/ja/latest/index.html)

- [OPENSHIFT DIY: BUILD SPRING BOOT / UNDERTOW APPLICATION WITH GRADLE](http://blog.codeleak.pl/2015/02/openshift-diy-build-spring-boot.html)

- [Gradle Distributions](https://services.gradle.org/distributions/)
Android の操作を記録して爆速で再生する


Android 扱ってると操作を自動化したくなることがあると思います。
Android の自動化は簡単に実現できます。

## 1. adb shell input による自動化

adb コマンドを使ってタップやスワイプを端末に送信できます。
下記のサイトなどで詳しく解説されています。
[getevent/sendeventでAndroid端末の操作自動化](http://techblog.qoncept.jp/?p=356)


また、下記の記事（英語）で解説されているスクリプトを使用すれば、操作を簡単に記録・再生することもできます。
[Android Record and Playback | FatTuba.com ](http://fattuba.com/android-record-and-playback/)


下記は↑の記事のスクリプトを OSX で動作するようにちょっと調整したものです。

https://github.com/pm11op/AndroidRecorder

### 動作イメージ
あらかじめ手書きメモアプリを立ち上げて、文字を書く操作を記録しておいたものを再生する様子

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Android 上で記録した操作を再生 <a href="https://t.co/g3s9OeOykO">pic.twitter.com/g3s9OeOykO</a></p>&mdash; まさるんこ (@masarunco) <a href="https://twitter.com/masarunco/status/759985718227705856">2016年8月1日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


### メリット・デメリット
この方法は sleep をはさみつつ、順番にクリック・タップをしたい場面で有用です。
逆に、動作が遅いのでとにかく連打したいとかいう場面（？）には不向きです。


## 2. dd コマンドによる自動化
### 使い方
デバイスや記録先ファイルのパスは適宜書き換えてください

2.1. ```$ adb shell "dd if=/dev/input/event5 of=/sdcard/sample2"```
2.2. Android 端末上で記録したい操作を実行
2.3. Ctrl+C
2.4. ```$ adb shell "dd if=/sdcard/sample2 of=/dev/input/event5"```

### 動作イメージ
あらかじめ適当にクリックしまくった操作を連続で再生する様子

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">暇だからぷにぷにやる合間にぷにぷに自動化してたら 3日で俺よりうまくなった | <a href="https://t.co/trXHewSWJO">https://t.co/trXHewSWJO</a></p>&mdash; まさるんこ (Kinoshit) (@pm11op) <a href="https://twitter.com/pm11op/status/753806314325716992">2016年7月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


### メリット・デメリット
動作はくそ速いです。
処理が速すぎて各操作間の時間差はほぼつけられないので、とにかく連打させるくらいにしか使えません。

## 3. 100回タップするのにかかる時間を計測
具体的にどれくらいの差がでるか、下記の手順で計測してみました。

### adb shell input
下記スクリプトを time コマンドで計測

```sample1.sh
COUNT=0;
while [ $COUNT -lt 100 ]; do
  adb shell input touchscreen tap 540 960;
  COUNT=$(( COUNT + 1 ));
done;
```

```bash
$ time sh sample1.sh

real    0m32.238s
user    0m0.429s
sys     0m0.395s
```

### dd
3.1. ```$ adb shell "dd if=/dev/input/event5 of=/sdcard/sample2"```
3.2. Android 端末上で10回タップ
3.3. Ctrl+C
3.5. 下記スクリプトを time コマンドで計測

```sample2.sh
COUNT=0;
while [ $COUNT -lt 10 ]; do
  adb shell dd if=/sdcard/sample2 of=/dev/input/event5";
  COUNT=$(( COUNT + 1 ));
done;
```

```bash
$ time sh sample2.sh


real	0m0.565s
user	0m0.057s
sys	0m0.064s
```

## まとめ
adb shell input で 30秒以上かかった操作が dd では 0.5 秒で終わりました。
両者を組み合わせればなんでもできそうですね。


## 免責事項

* あくまで技術的好奇心を満たすのが目的であり、ゲームの自動化を推奨するものではありません
activejob

https://blog.codeship.com/how-to-use-rails-active-job/


```rb
2.2.3 :012 > AddCommentJob.new.job_id
 => "bd2d58c0-5019-4159-a755-398b498de828" 
2.2.3 :013 > AddCommentJob.new.job_id
 => "b97580d6-83c4-4824-ace4-c7db6cf4cdce" 
```

```rb
2.2.3 :014 > AddCommentJob.class_eval do
2.2.3 :015 >     queue_as :lala
2.2.3 :016?>   end
 => "lala" 
2.2.3 :017 > AddCommentJob.queue_name
 => "lala" 
2.2.3 :018 > AddCommentJob.new.queue_name
 => "lala" 
```

https://github.com/rails/rails/blob/master/activejob/lib/active_job/core.rb#L66-L71

https://github.com/rails/rails/blob/master/activejob/lib/active_job/core.rb#L7-L29

inline_adapter 不支持wait和wait_util 

https://github.com/rails/rails/blob/master/activejob/lib/active_job/enqueuing.rb

https://github.com/rails/rails/blob/master/activejob/lib/active_job/queue_adapters/inline_adapter.rb#L16-L18

config.active_job.queue_adapter设置

https://github.com/rails/rails/blob/master/activejob/lib/active_job/enqueuing.rb#L76

https://github.com/rails/rails/blob/4-2-stable/activejob/lib/active_job/queue_adapter.rb

rails 5 默认使用async adpater,rails 4 使用inline adpater 

rails 4 config.active_job.queue_adapter 不止可以指定symbol还可以指定class, rails 5 当中启用了

https://github.com/rails/rails/blob/master/activejob/lib/active_job/queue_adapter.rb#L40-L45
Field 'カラム名' doesn't have a default valueの対処法

備忘録

環境	windows + MySQL5.6
ログ	Field 'カラム名' doesn't have a default value
原因	sql_mode
対策	sql_modeにNO_ENGINE_SUBSTITUTIONを設定する

MySQLにroot権限で接続

sql_modeを確認する
	mysql> show global variables like 'sql_mode';
	+---------------+----------------------------------------------------------------+
	| Variable_name | Value                                                          |
	+---------------+----------------------------------------------------------------+
	| sql_mode      | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
	+---------------+----------------------------------------------------------------+

sql_modeをNO_ENGINE_SUBSTITUTIONに変更する
	mysql> set global sql_mode=NO_ENGINE_SUBSTITUTION;


sql_modeを確認する
	mysql> show global variables like 'sql_mode';
	+---------------+------------------------+
	| Variable_name | Value                  |
	+---------------+------------------------+
	| sql_mode      | NO_ENGINE_SUBSTITUTION |
	+---------------+------------------------+

再起動対策
	my.iniを編集
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

	sql_mode=NO_ENGINE_SUBSTITUTION

	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
オレオレ Ansible Best Practices 2016年8月版

# はじめに

[前回](http://qiita.com/raki/items/e8b1cdac4a86eea0231f) から１年以上も開いてまだ Ansible のベストプラクティスを追いかけています。。。
てゆうか、去年[ベストプラクティス第二段](http://qiita.com/raki/items/d2f7a44a3a736382f93c) を書いてたんだけど下書きにして放置してたみたいなのでさっき公開したｗ

今はまた変わって、 ansible-galaxy に移ってみたので、そこらへん。。。

# 概要

* 1プロジェクト数十台規模の複数プロジェクト管理向け（仕事が増えましたｗ）
* 丸コピーやめた（ロールや設定のずれが気になってしょうがないので）
* 基本的にロールは Github -> Travis CI(Docker&ServerSpec) -> ansible-galaxy で管理することにした
* システムワイドでもアカウントローカルでもOK
* インベントリや設定値、なにより playbook はプライベートリポジトリに
* プロジェクト別インベントリ

# ざっくり

```
ansible.cfg
inventory/
  group_vars/
    project-a-prod-web
    project-a-prod-db
    project-a-stg-web
  host_vars/
    project-a-host
  project-a
  project-b
playbooks/
  project-a-prod-web.yml
roles/
  galaxyに上げる前のロールとか
  プライベートなロール
templates/
vars/
```

ボイラープレート的には前回とそんなには変わってない。
前述のとおりロールを galaxy に押し出したので、roles の下は結構すっきりさせた。
他のメンバーも含めてみんなで使うロールはシステムワイドにおいて、個人的なロールを roles に配置した。

```yaml:require.yml
- officel.selinux
- officel.timezone
- officel.yum-repos
- officel.yum-default
- officel.service-stop
```

あ、Office L はうちの屋号すｗ 職場のアカウントは別にある。
あとコレらは CentOS 6 と 7 でしかチェックしていない（弊社CentOS6しか使っていないので）。

で、↑こんな感じの yaml を書いて、

```
$ ansible-galaxy install -r require.yml -p .
```
みたいにすると、まとめてインストールされる。
-p . をつけばければシステム側にインストールされる。

ansible.cfg で `roles_path    = /etc/ansible/roles:roles` ってすることで、システムワイドとローカルの両方のロールディレクトリが有効。

プロジェクト.yml とか、グループ単位で工夫しながら playbook を書くようにして、設定変更は（ロールのデフォルト値と違うものにするのは） playbook 中に書くようにした。
結局それが一番ずれないし、対象のサーバを作った時の設定が見えやすいし、変更も容易なので。
コマンドラインレベルで --list-hosts とか --tags とか多用して管理してるのでそこだけもうちょっとなんとかできないかと思ってるけど、まだいい感じにはなっていない。
複数プロジェクト見てると仕方ないかも。

# ansible-galaxy

Github -> Travis CI(Docker&ServerSpec) -> ansible-galaxy にしたのは、この先のため。あともろもろ。

* プロジェクトのOSをCentOS6系に固定していたけど7系にしていく？かもしれない
* プライベートクラウドからAWSへの乗せ変えするかも
* Docker 勉強するにあたってコストかけたくない
* ロールを外に出して共有することで少しでもフィードバックあったらいいなという下心
* 会社の技術公開の一環
* ロールのローカルテストは時間食いすぎる（Travisにすると時短がすごい）
* galaxy のサイトでロール探すと目的に即したものを探すの難しいので、

# playbook

最近はサーバを作るためのPBを書いてそれをコミットして残すようにしてる感じ。
もちろん同じになるはずのサーバは同じPBを使いまわすけど、プロジェクト、サーバの種類、環境とかに合わせて別にしている。
なんだかんだいって、変数とかで自由度を上げるより、その時どういう状態で作ったか、がちゃんとわかるほうが運用的に楽だった。
PB中の vars_file とかで読み込みファイルを変えて運用するのもありっちゃあり。
設定ファイルを送りつけたり、ユーザ作成したりって処理のロール（タスク）は同じだけど、扱う値が違うものは読み込むファイルをプロジェクト別にしておくだけでだいたいまかなえた。

# 今後

まだまだgalaxyにもっていけてないロールがたくさんあるので、運用でテストしながらちょっとずつ移行予定。
秘伝のたれ化した現在のロールを解体して作り直すのはちょっと面倒だけど、ちゃんとテストがかけて、OS毎のチェックもできるのは便利だしやりがいありそう。あるかな。あるよね。
あと、運用中に発生した課題や構成の工夫、設定の内容とかもできるだけ押し出して共有できたらいいな。
オレオレ Ansible Best Practices 2015年8月版（1月版からの変更点）

# はじめに

2015年も半分以上終わって、年明けに苦労してたサービスも無事ローンチされ、Ansible の再整理をする時間が取れてるくらいなので、オレオレベストプラクティスを再整理。
ってゆうことを書いていて１年間寝ていた下書きを発見したので2016年になった今頃とりあえず公開してしまうという手抜き。
[2016年8月版](http://qiita.com/raki/items/8f2a449add5881e859be) を書い（た）ているので、そのベースにコレが必要なので。

# １月版からの主な変更点

[オレオレ Ansible Best Practices 2015年1月版](http://qiita.com/raki/items/e8b1cdac4a86eea0231f) からの主な変更点

* Ansible のバージョンアップに伴い ansible.cfg を少し変更
* inventory ファイルを統合して１つにした（サービスで１つのファイルのほうが管理しやすい）
* roles のうち、各機１回実行したらもうやらないようなもの（yum リポジトリやi18n設定など）を roles/init/XXX として１段下げて整理しなおした
* 各タスクから notify やサーバ別分岐などを排除して、各ファイルをすっきりさせた

# 説明

## Ansible のバージョンアップに伴い ansible.cfg を少し変更

以前は hostfile として inventory ファイルを指定していたが、バージョンアップに伴い1.9から、 [inventory](http://docs.ansible.com/ansible/intro_configuration.html#inventory-file) となったようだ。
ただ、hostfile のままでも使えるので特に問題ない。

バージョンアップとは直接関係ないが、 forks の値を 50 にしてもしっかり動いたので、最近は 50 にしたままにしている

また、コントロール機をこっそり社内に移動して、管理下にある他のサービスのサーバも管理可能なように ssh_args に .ssh/config を渡すようにし、ssh proxy 経由でも作業できるようにした。[参考](http://qiita.com/ftakao2007/items/842d83ff8c2bea8f80df)

## inventory ファイルを統合して１つにした

１サービスで本番、開発、共用と、NWが分かれている環境だったため、inventoryファイルをそれぞれ分けていたが、運用フェーズに入りいちいち切り替えるのが面倒になってきたので１つに統合しなおした。
プレイブック実行時に -l を付けないで実行することのほうが少ないので（たいていは単独のサーバに処理を行うため）inventoryファイル内できちんとコメントを付けて全てのサーバを管理するほうが運用的に楽

## roles のうち、各機１回実行したらもうやらないようなもの（yum リポジトリやi18n設定など）を roles/init/XXX として１段下げて整理しなおした

ざっと数えて50個のロールが出来上がり、見難くなってしまったので階層を下げることにした。カテゴリ化したとも言える。

* init 初期処理用（旧phase01）
* lang 開発言語等（旧phase02）
* tools 監視ツール類（旧phase03,09）
* common 共通用（Heartbeatなど）
* web Webサーバ用（nginx,httpdなど）
* db DBサーバ用（MySQL,MHA）
* cache Cacheサーバ用（Redis,Memcachedなど）
* monitor 監視サーバ用（munin,zabbixなど）
* util 設定回収タスクなどいろいろ

って感じにした。それぞれの下にロールを丸ごと移動している。かなりすっきりして見やすくなったと思う。


## 各タスクから notify やサーバ別分岐などを排除して、各ファイルをすっきりさせた

1月版の時も書いたけど、タスクはシンプルなのが一番なので、インストールタスクと設定タスクは別々にした。
notifyでrestartしていたところも全部削って、シンプル化した。
JavaScript でcsvをtableに変換する

```js
var table = csv2table(csv);


    function csv2table(text) {

        var rows = text.split("\n");
        var table = document.createElement("table");

        for ( var i = 0; i < rows.length; i++ ) {
            var tr = document.createElement("tr");
            var tds = rows[i].split(",");
            for ( var j = 0; j < tds.length; j++ ) {
               var td = document.createElement(i == 0 ? "th" : "td");
               td.innerHTML = tds[j];
               tr.appendChild(td);
            }
            table.appendChild(tr);
        }

        return table.innerHTML;
    }
```
JavaScript で sprintf (のようなもの)を実装する

使い方：
var s = _sprintf("aaa %s ccc %s eee", "bbb", "ddd")
（%sしかつかえない。）

    function _sprintf(){

        if ( arguments.length < 2 ) {
            return "";
        }
        var s = arguments[0];

        for(i=1; arguments.length > i; i++){
            s = s.replace("%s", arguments[i]);
        }

        return s;
    }
データベースのテーブル定義書をhtml形式で自動生成する


## データベースのテーブル定義書ってどうやって作っていますか？

1. 暖かみのある手作りのexcel
   そして実際のCREATE TABLE文を保存しているファイルとの乖離が忍び寄り...

2. ERWinやSI Object Browserのような商用製品を使う
   そこそこお金かかる & GUI前提なのでは? & あとそれgitとかでバージョン管理できんの?

3. CSE, pgAdmin, A5:SQL Mk-2 のような新旧さまざまなフリーソフトを使う
   UNIX系OSで実行できて、かつ、GUIじゃなくCLIでないと、Jenkins等のCIサーバ上での自動実行が難しいですよね
   
4. 軟弱者め。CREATE文やALTER文のSQLさえ死守しておけば、あとは例えばmysqlの show tables, show create table foobar みたいなコマンドをその都度たたけば済む話だろ。   

そもそもテーブル定義書が先か、ER図が先か、CREATE TABLE文が先か、JavaのJPAにそったアノテーションつきのエンティティクラスが先か、といったところから考え始めると、その流派や方法論は実に様々です。

なんであれ、人間が読むためのテーブル定義書がまったく無いよりは有る方がよいでしょう。もちろん実際のDBに作成されているテーブルやカラムと乖離しているようでは無意味です。確実で手っ取り早くてどこででもたいてい使える方法の一つが、実際に稼働しているDBサーバのメタ情報にアクセスして全自動でテーブル定義を逆起こしする手法です。

DBFluteというJavaのO/Rマッパには、そんな機能が付属しています。たとえO/RマッパにDBFluteを使ってなくとも、というかそもそもJavaじゃなくてC#やRubyなんですけど、みたいなプロジェクトであっても、正しいテーブルが作られているテスト用（本番でもいいけど）のDBサーバのメタ情報をもとにテーブル定義書を作るという目的に限定すれば、これから説明する手法はどこででも使えるでしょう。DBFluteとmavenというツールの都合上JDKが必要ですが、どうせJenkinsでやるのですから、最低限、JenkinsマシンにだけJDKが入っていればそれでいいのです。

## あらかじめ必要なもの

* JDK8以上. ただしDBFluteのバージョンを少し古くすればJava6でもOK
* JAVA_HOME環境変数をセットしておく
* あらかじめ目的のテーブル、インデックス、制約などが全て作成済みの、N/Wアクセス可能な状態のDBサーバ

これだけです。Mavenすら要りません。サンプルではmaven-wrapperを使っているので、mavenが無ければ自動ダウンロードされます。

## サンプルプロジェクト

https://github.com/nabedge/dbflute-doc-sample がサンプルです。READMEに書いてあるとおりに作業すると、target/dbflute_dfclient/output/doc/schema-dfclient.html というファイルにテーブル定義書ができあがります。このサンプルではh2databaseをその都度作成してCREATE TABLEするところまでをmavenのcompileフェーズに含めることで、DBサーバがわりにしています。

READMEの手順をそのままJenkinsジョブ化するとこんな感じになるはずです

![dbflute-doc-jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/3213/5887a4f7-9902-61cc-c225-30bd780961c0.png)


このジョブを自動実行させて、ジョブのurlの"lastSuccessfullBuild"の配下を見れば、常に最新のテーブル定義が見れるという寸法。 テーブル定義だけでなく、インデックスの情報、外部キーの状況なども見れるのが嬉しいですね。

![dbflute-doc-result.png](https://qiita-image-store.s3.amazonaws.com/0/3213/9ac0f128-de61-29fe-7a27-6a561a169464.png)


### 参考
* [Alto DBFlute | DBFlute](http://dbflute.seasar.org/ja/introduction/altodbflute.html)
scpのaliasを作ろう！


踏み台サーバなどにscpコマンドでファイルを配置したい時に、毎回サーバのIP等を入力するのがめんどくさいなと思ったこの頃。
scpのエイリアスを作成して、コマンド引数としてファイルを指定するだけで所定のサーバー・パスにファイルをおけるようにしようと思いました

aliasを作って実現しようとしたのですが、エイリアスに対して引数を上手く渡せない
ということで以下のように関数を使うと良いらしいです

```Terminal
$ alias my-echo="echo $1" # ダメ
$ my-echo() { echo $1}		# これはOK
```

というわけで、bash_profile等に以下のような記述を追加

```.bash_profile
# scp用の関数を定義
scp-gate(){scp $1 username@example.com:~/}
```

上記のようにした所、以下のようなエラーがでて上手くscpすることができませんでした

```
$ scp-gate fileA
scp: /home/username: not a regular file
```

これはsshの設定が読み込まれていないためらしいです
そこで、sshのconfigファイルを編集して、ドメインと設定を反映させましょう

まずはsshの設定から

```~/.ssh/config
Host gate↲
   HostName example.com
   User username
   Port 22
```

そして、aliasに相当する関数もドメイン指定するように修正

```.bash_profile
# 踏み台コピー
scp-gate(){scp $1 gate:~/}
```

再度実行！！

```Terminal
$ scp-gate fileA
ishibashi@10.134.0.21's password: 
fileA                                                                                                             100%  488     0.5KB/s   00:00 
```

無事scpのエイリアスっぽいものができました。めでたしめでたし。

#### 参考文献
[bashのalias に引数を渡すには？](http://takuya-1st.hatenablog.jp/entry/2015/12/15/030119)
[Unable to use scp with a bash alias](http://superuser.com/questions/291778/unable-to-use-scp-with-a-bash-alias)
Kindle端末に任意のファイルを保存する


# 概要
* 任意のPDFなどのファイルをKindleで読みたい場合にどうするかのメモです。

# Kindleパーソナル・ドキュメントサービス

[Kindleパーソナル・ドキュメントサービス](https://www.amazon.co.jp/gp/help/customer/display.html/ref=kinw_myk_wl_ln?ie=UTF8&nodeId=200767340#pdocarchive)を利用することで手元のPDFをKindleに直接送信できます。

## 対応端末
* Fireタブレット
* Kindle端末
* Kindle for iPhone、iPad、iPod touch
* Kindle for Android

## 対応しているファイルの種類

* Kindle形式（.MOBI、.AZW）
* Microsoft Word（.DOC、.DOCX）
* HTML（.HTML、.HTM）
* RTF（.RTF）
* Text（.TXT）
* JPEG（.JPEG、.JPG）
* GIF（.GIF）
* PNG（.PNG）
* BMP（.BMP）
* PDF（PDF

## ファイルのサイズ制限

ファイルサイズは50 MB以下でなければ送信できません。

## 料金
* 無料
* Wi-Fi接続時もしくは[USB経由での転送](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201974290)に対応しています。

# Kindleパーソナル・ドキュメントサービスの利用方法
パーソナル・ドキュメントをEメールに添付し、Send-to-Kindle Eメールアドレス宛てに送信すると端末で読めるようになります。

## Send-to-Kindle Eメールアドレス

Send-to-Kindle Eメールアドレスについては[こちら](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201974220)に詳細が書かれています。

### Send-to-Kindle Eメールアドレスへの送信前の確認 

Send-to-Kindle Eメールアドレスを使用してパーソナル・ドキュメントを送信する前に確認することは以下の点です。

1. 送信元のEメールアドレスがパーソナル・ドキュメントの承認済みEメールアドレス一覧に含まれている
2. ドキュメントのファイル形式がサポートされている形式である

これらの条件を満たすことで、パーソナル・ドキュメントは、新規Eメールに添付して送信もしくは、ドキュメントが添付されているEメールをSend-to-Kindle Eメールアドレス宛てに転送することで端末に配信できます。

### パーソナル・ドキュメントの承認済みEメールアドレスへの登録

承認済みEメールアドレスへの登録は[こちら](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201974240)が参考になります。追加の具体的手順は以下のとおりです。

1. [コンテンツと端末の管理](https://www.amazon.co.jp/mykindle)にアクセス
2. 設定タブをクリックし、パーソナル・ドキュメントの設定の項目までスクロール
3. 「承認済みEメールアドレスを追加」をクリックしメールアドレスを登録
4. 承認済みEメールアドレス一覧に一覧追加したメールアドレスが表示されたのを確認

これで承認済みEメールアドレスの登録が完了します。

### Send-to-Kindle Eメールアドレスの確認

Send-to-Kindle Eメールアドレスの確認は[こちら](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201974220)が参考になります。確認の具体的手順は以下のとおりです。

1. [コンテンツと端末の管理](https://www.amazon.co.jp/mykindle)にアクセス
2. 設定タブをクリックし、パーソナル・ドキュメントの設定の項目までスクロール
3. Send-to-Kindle Eメール設定の下に、Send-to-Kindle Eメールアドレスが表示されるのを確認

Eメールアドレスを変更する場合は、端末の横にある編集をクリックし、新しいEメールアドレスを入力後に保存をクリックします。

## パーソナル・ドキュメントの配信

承認済みEメールアドレスを送信元として、ドキュメントを送信したい端末のSend-to-Kindle Eメールアドレスを宛先に指定し、配信したいファイルを添付します。

以上でパーソナル・ドキュメントのKindle端末への配信は完了です。
Go で 10 パズルの解を遺伝的アルゴリズムを使って列挙する

[Code-Hex/tenpuzzle - GitHub](https://github.com/Code-Hex/tenpuzzle)　　
> Tenpuzzle - Find the solution of the 10 puzzles in Genetic Algorithm

[10 パズル](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%91%E3%82%BA%E3%83%AB) <- 10 パズル知らない人向け
# なぜ作ったか:zap:
大学の講義で遺伝的アルゴリズムの考えをレポートにまとめるか、遺伝的アルゴリズムを使った何かのプログラムを作ってくるかのどっちかだったため、作った。この記事がいつの日か誰かの役に立てばいいなと願い、記録する。

# 仕組み:snake:
遺伝的アルゴリズムは存在する個体に対して大まかに 3 つの出来事を必要とする。それが、

- 交叉
- 突然変異
- 個体の死滅

である。簡単に言うと自然界において**優秀な存在は生き残る**というのと同じことである。
※優秀なイメージ
![優秀](http://lh3.ggpht.com/-nouaB85BBP0/VAaI_ufaMbI/AAAAAAAAIpI/sP2XIP_Dnkc/th_5.jpg?imgmax=800)

## 交叉:dog:
10 パズルの解というものは 10 になるような四則演算を用いた式のことである。式はこんな感じで二分木で表現することが可能である。
![式の二分木](http://interactivepython.org/runestone/static/pythonds/_images/meParse.png)

この場合だと$((7+3)∗(5−2))$ということになる。
10 パズルのルール上このような二分木のパターンが　5 パターンしか存在しない。どんなパターンが存在するかは[コメント](https://github.com/Code-Hex/tenpuzzle/blob/master/tree.go#L104)で簡単に記載している。

つまりこれらの部分木を使って交叉を行う。 2 つの親となる木を用意してあげ、各親の木の同じ形をした部分木(葉も含む)同士を交換して新しい木を生成していくことになる。

## 突然変異:dragon:

いろいろ考えられるが、今回行った方法は生き残った木を 2 パターン使って突然変異させることである。

- 演算子の変更
- 数値の変更

## 個体の死滅:frog:
悲しいことではあるが、遺伝的アルゴリズムでは必須な機能である。
劣勢な個体を排除するために**適応度関数**というものを用いて優秀な個体か、優秀ではないかというものを判断する。今回の場合だと生成された式の計算結果と 10 の距離がどれだけ離れているかで優秀かどうか判断した。そして 10 から遠ければ遠いほど優秀ということにした。（式を見てこれは 10 になりやすい式だ！！ってならんでしょー...）

その部分の[ソースコード](https://github.com/Code-Hex/tenpuzzle/blob/master/ga.go#L116)である。

つまり、この判断さえできれば優秀な順でソートすることが可能になる。ソート後に劣勢な個体を全体の半分[削除](https://github.com/Code-Hex/tenpuzzle/blob/master/ga.go#L42)する。

以上の交叉、突然変異、死滅を行った後の最終的な個体の数は、初期で作成した集団の数と同じ数になる。

一連の流れのコードは[こんな感じ](https://github.com/Code-Hex/tenpuzzle/blob/master/ga.go#L12)になる。

# 実行:running:

    go get github.com/Code-Hex/tenpuzzle
    go get github.com/Code-Hex/tenpuzzle/cmd/ga

のあとに

    ga

で実行可能である。

# 感想
10 パズルのすべての解を見つけたいなら普通に総当たりを行ったほうが早いし、このプログラムが何の役に立つのかすら未だに分からないが、遺伝的アルゴリズムの学習にはとても役立った。

生物の生き残り競争は本当に厳しいものであることも分かった。
これだけ覚えてJavaScript

### 変数

変数の宣言はvar。

```javascript
var x = 100;
```

無くても動くけど必ずつけましょう。

```javascript
x = 100;
```

### 関数

```javascript
function add(x, y){
  return x + y;
}

add(1, 2); // 3
```

「add」という名前の関数を定義していますが、これは下記とほとんど同じ意味です。

```javascript
var add = function(x, y){
  return x + y;
};
```

このとき、addはひとかたまりの処理をまとめた関数になっていて、かっこをつけるとその処理を呼び出せます。

```javascript
add;       // 関数
add(1, 2); // 関数を実行している
```

関数も代入できます。

```javascript
var x = add;
x(1, 2);
```

変数に一度とらなくても関数は呼び出せます。

```javascript
(function(x, y){
  return x + y;
}); // これを無名関数と呼んだりします

(function(x, y){
  return x + y;
})(1, 2); // カッコをつけて引数を渡せば呼び出せます

(function(){
  return 100;
})(); // 引数が無ければこう。
```

JavaScriptの変数のスコープは関数の中で閉じているので、変数はなるべく関数の中で定義するとよいです。

```javascript
var x = 1;

var addOne = function(y){
  return x + y;
};

addOne(2); // 3

x = 100;

addOne(2); // 102になっちゃう！
```

```javascript
var f = function(y){
  var x = 1;
  return x + y;
};

addOne(2); // 3

x = 100;

addOne(2); // 3
```

### オブジェクト

他の言語では連想配列とか辞書とかハッシュとか呼ばれてるものに近い存在がオブジェクトです。

```javascript
var x = {}; // 空のオブジェクト

x.hoge = 123;

x.hoge + 1; // 124
x["hoge"] + 1; // 124
```

```javascript
var x = {"hoge": 123}; // こういう定義もできる

x.hoge + 1; // 124
x["hoge"] + 1; // 124
```

オブジェクトに関数を入れることもできます。

```javascript
var x = {
  "hoge": 123,
  "add": function(x, y){
    return x + y;
  }
};

x.hoge;
x.add(1, 2);
```

### コールバック

JavaScriptの世界は非同期で進みます。たとえばファイルの読み込み。

```ruby
# Rubyだとこう

s = open("log.txt") {|f| f.read}
print s # ここでファイルの内容が出力されます。
```

```javascript
// JavaScriptだとこう

var s;
var fs = require('fs');
fs.readFile('./log.txt', 'utf8', function (err, text) {
  s = text;
});

console.log(s); // ファイルの内容が出力されません。
```

JavaScriptはファイルの読み込み終わりを待たずに処理を継続し、読み込めたときにあらかじめ設定しておいた関数を呼び出すというつくりになっています。その関数をコールバック関数と呼びます。

```javascript
fs.readFile('./log.txt', 'utf8', function (err, data) {
  // この関数がコールバック
});
```

関数は代入できるので、このようにも書けます。 

```javascript
var callback = function(err, data){
  console.log(data);
};

fs.readFile('./log.txt', 'utf8', callback); // readFileに関数を渡しています

fs.readFile('./log.txt', 'utf8', callback()); // これだと関数を実行した結果をreadFileに渡していることに注意
```
tableVeiw.reloadData()をバックグラウンドスレッドで実行してはいけない

Swiftでサーバから非同期にデータを取得して、それを画面に描画するという処理を書きたい。
はじめ、スレッドを意識せずに以下のようなコードを書いていたため、画面をタップしないとセルが描画されない、もしくは描画されるまで待っていると以下のようなエラーが出るという現象が起きていた。

エラー

```
This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes.  This will cause an exception in a future release.
```

問題のあるコード

```swift
loadData() {
    (task: AWSTask!) -> AnyObject! in

    if task.error !== nil {
        let alertView = UIAlertController(title: "エラー", message: "データの取得に失敗しました。", preferredStyle: .Alert)
        alertView.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        self.presentViewController(alertView, animated: true, completion: nil)
    } else {
        self.tableView.reloadData()
    }
    
    return nil
}
```

ここでloadData()関数はAWS SDKを利用し、バックグラウンドスレッドで非同期にAWSからデータを取得する処理を担っているとする。loadData()はクロージャを受け取り、AWSと通信した後にそれを実行する。

通信が正常に終了した場合、`self.tableView.reloadData()`が実行されることになるが、この処理はバックグラウンドスレッドで実行される。
しかし、SwiftではUIに関する操作をバックグラウンドスレッドで行ってはいけない。そのため上記のようなエラーが出力されていた。

これを解決するため、以下のようなコードに修正する。具体的には、`dispatch_async(dispatch_get_main_queue())`を実行し、`self.tableView.reloadData()`をメインスレッドで実行するようにしてあげれば良い。

```swift
loadData() {
    (task: AWSTask!) -> AnyObject! in

    dispatch_async(dispatch_get_main_queue()) {  // 追加
        if task.error !== nil {
            let alertView = UIAlertController(title: "エラー", message: "データの取得に失敗しました。", preferredStyle: .Alert)
            alertView.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
            self.presentViewController(alertView, animated: true, completion: nil)
        } else {
            self.tableView.reloadData()
        }
    }  // 追加
    
    return nil
}
```

ちなみに、自分がメインスレッドにいるかどうかを以下のコードで調べることができる。

```swift
loadData() {
    (task: AWSTask!) -> AnyObject! in
    
    let currentThread = NSThread.currentThread()
    print(currentThread.isMainThread)  // false

    dispatch_async(dispatch_get_main_queue()) {
        let currentThread = NSThread.currentThread()
        print(currentThread.isMainThread)  // true
        
        if task.error !== nil {
            let alertView = UIAlertController(title: "エラー", message: "データの取得に失敗しました。", preferredStyle: .Alert)
            alertView.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
            self.presentViewController(alertView, animated: true, completion: nil)
        } else {
            self.tableView.reloadData()
        }
    }
    
    return nil
}
```
ZendeskのマクロをAPIで登録する方法

どーもZendesk中の人の原田です。

Zendeskを利用して効率的にリクエストチケットをハンドルするためにはマクロ、トリガ、自動化を活用する事が重要です。マクロ、トリガ、自動化はつまるところはチケットの情報を纏めて更新してくれる機能なのですが
***
- マクロ＝手動
- トリガ＝特定条件で自動実行
- 自動化＝特定条件＋時間で自動実行

***

という違いがあります。またマクロは階層化構造を6段階もてるので、電話やメールの内容に合わせてIssueTreeの様に
**「製品カテゴリ」→「製品名」→「現象」→「追加情報」→「追加情報入力テンプレート」**
という様な感じで階層化を持たせてエージェントが階層を掘り下げていくことで自動的に入力される内容を詳細に決めて、最終的にはコメントのテンプレートも貼り付けて対応することも可能です。

これだけ便利な機能なのに唯一残念のは

- マクロの登録は1本ずつ(GUIでは纏めて登録できるような画面が無い)
- 階層化のマクロを行う場合には「::」というセパレート文字を使わなきゃいけない
- 階層の下段を作る場合には都度タイトルで分ける必要がある

要するに階層化構造を持つマクロを手動で登録するには~~超面倒な~~タイトルなどを設定する必要があります。便利なのに登録が面倒だと広まらない、これはどうにかしないと!!

と言う事でどうにかしてマクロを簡単に登録する方法は無いかと考えてみました。
ZendeskはRestAPIが揃っているのでこれを利用するのが一番なのですが、階層化構造を持ったものをどう作るか考えた結果、Excelを活用して関数を作る事にしました。

なんだかんだ言ってConcatenate関数は非常に優秀!!
階層化を作って最後にマクロの名前を::でセパレートしてくれるセルを作成します。

```ruby:6階層の構造を持ったマクロ名を生成する関数
=CONCATENATE(A3,IF(LEN(B3)=0,,"::"),B3,IF(LEN(C3)=0,,"::"),C3,IF(LEN(D3)=0,,"::"),D3,IF(LEN(E3)=0,,"::"),E3,IF(LEN(F3)=0,,"::"),F3)
```

で、この関数で生成された名前をマクロ名に設定して、あとはZendeskのマクロの作成関数を実行するだけです。


```ruby:ZendeskのMacro生成APIリファレンス
curl https://{subdomain}.zendesk.com/api/v2/macros.json -v -u {email}:{password}
```

勿論PasswordじゃなくTokenを利用することも可能です。このAPIも記述するのが面倒なので再びConcatenate関数登場。

```ruby:Concatenate関数を利用してマクロを生成するAPIを自動的に作る
CONCATENATE("curl -u ",$F$1,"/token:",$D$1," https://",$B$1,".zendesk.com/api/v2/macros.json -H ""Content-Type: application/json"" -X POST  -d '{""macro"":{""title"": """,H3,""",""actions"": [ {""field"": ""subject"", ""value"": """,H3,"""}]}}'")
```

```ruby:実際に実行するAPI
curl -u gharada@zendesk.com/token:hogehoge https://z3nhogejp.zendesk.com/api/v2/macros.json -H "Content-Type: application/json" -X POST  -d '{"macro":{"title": "分類１::分類２::分類３::分類4::分類5::分類6","actions": [ {"field": "subject", "value": "分類１::分類２::分類３::分類4::分類5::分類6"}]}}'
```

これで実際に分類を6階層持ったマクロが作成されました。
趣味でIPSを使ってみた話

サーバのに"何か"が起きたとき、管理者へ教えてくれると同時にそれとなく対処してくれる便利な仕組みについて。
最近わりと有名になってきた感があります。

## IDSとIPS
IDS（Intrusion Detection System:不正侵入検知システム）として有名なSnortは使ったことがあるという方も多いのではないでしょうか。
ブタさんが可愛いあいつです。
自分も大好きなあいつですが、今回はさらに可愛いミーアキャットを意味する"Suricata"というIPS（不正侵入検知・防御システム）を導入して使ってみました。

基本的な仕組みとしては、予め「不正である」として定めたルールに則って不正侵入と思われる通信を検知すると同時に攻撃からの防御もしてくれるようにするという、素敵な仕組みです。

## 試しに導入してみる
どちらも導入するだけなら簡単なので、まずは動かしてみたほうがイメージしやすいですね。
詳しいインストール手順については、[公式サイト](https://suricata-ids.org/)のDocsに"Quick start guide"や"Installation guides", "Basic Setup"として、環境ごとに丁寧な手順が掲載されているので参考にしてみてください。

注意すべき点として、/etc/suricata/suricata.yamlの設定で誤りがあると、たとえ起動したとしても期待通りの動きをしてくれませんので注意してください。

Suricataの起動は

```
$ suricata -c <suricata.yaml> -i <対象インタフェース>
```
で可能です。
```例
$ suricata -c /etc/suricata/suricata.yaml -i eth1
```
起動して、このような表示がされれば成功です。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/4e663880-a766-865d-50e8-121a973a7123.jpeg)


ログファイルは、その種類ごとに/var/log/suricataへ記録されていきます。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/3d29fb11-d4a4-ba82-1a10-c16c168e9424.jpeg)


あとは、この検知した内容によってどのような動作をするか、設定してやれば自動化が可能です。
が、それはまた次の機会に。

### （おまけ）Snorbyのインストール・設定
Suricataもしっかりとログを吐いてくれるのですが、よりグラフィカルに確認するにはSnorbyが便利です。
SuricataとSnorbyの組み合わせについては[こちらのサイト](http://mimumimu.net/blog/2014/05/13/centos-6-5-%E3%81%AB-snorby-%E3%81%A8-suricata-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)でも紹介されていますので、参考にしてみてください。

ただし、インストール時にrubyのバージョンが古いと引っかかってしまうのでrbenvなどからruby 2.x系を導入しておくとスムーズかと思います。
インストールに成功すると、ブラウザからサーバへアクセスする事で以下のようなログイン画面が表示されます。
![000.JPG](https://qiita-image-store.s3.amazonaws.com/0/131348/12471d10-cd0b-cec0-85eb-bc272a43db1b.jpeg)
初期設定は
ID:snorby@snorby.org
Pass:snorby
ですが、ドメイン名等設定されている場合には
ID:snorby@<ドメイン名>
Pass:snorby
となりますのでご注意ください。

無事ログインに成功すれば、状況をグラフィカルに確認出来る画面が開きます。
これだけわかりやすければ、一目瞭然ですね。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/131348/278b19a1-273f-636d-1efa-41fde7bf6cf5.jpeg)
git > Link > submodulesの使用例

git関連でsubmodulesという機能があるのは知っているが、それを使いこなしているプロジェクトの例を知らない。

以下の使用例を見つけた。
http://cocu.hatenablog.com/entry/2016/03/16/054603
https://github.com/cocuh/.dotfiles

componentsフォルダのコミットメッセージが「update submodules」となっている。

自分が知りたいのは以下のような使い方をしているリポジトリ。

- 複数プロジェクトで共有ソースをsubmodulesとしている
- あるプロジェクトでは特定のコミットまでupdate
- 別のプロジェクトでは最新のコミットまでupdate

blenderではsubmodules使っているのかもしれない。
https://wiki.blender.org/index.php/Dev:Doc/Tools/Git

Apache brooklyn
https://brooklyn.apache.org/developers/code/
node.js(Johnny-Five)で小型LCDを制御してみる

### Ｉ２Ｃ接続ＬＣＤモジュールをarduinoに接続してnode.jsで制御できるか

http://akizukidenshi.com/catalog/g/gM-09109/
秋月電子Ｉ２Ｃ接続小型ＬＣＤモジュールを使い
johnny-fiveのコンポーネントを使ってもうまく動作しなかった。


幸い、johnny-fiveではI2C通信を直接制御できるようなのでコンポーネントがなくても
なんとか対応できそうなので実装してみた。

参考したのがC言語のソースでそのままでとってもきれいなソースコードとは言えないが多少でも参考になれば幸いです。
また、johnny-fiveのソースコードを熟知してないので間違った使い方をしているかもしれない。

![M-09109.jpg](https://qiita-image-store.s3.amazonaws.com/0/11566/a575b2e1-3606-93ec-f77d-3baf4ee2033e.jpeg)


```js:lcd.js

var LCD_ADR = 0x3e ; //lcd address
var CONTRAST= 0x26 ; // コントラスト
//
var five = require("johnny-five");

var board = new five.Board();

//Main
board.on("ready", function() {

// LCD表示処理
//
/* LCD 初期化 */
var lcd_init = function(){
  board.io.i2cConfig();
  lcd_cmd(0x38); // 8bit 2line Normal mode
  lcd_cmd(0x39); // 8bit 2line Extend mode
  lcd_cmd(0x14); // OSC 183Hz BIAS 1/5
  /* コントラスト設定 */
  lcd_cmd((0x70 + (CONTRAST & 0x0F)));//下位4bit
  lcd_cmd((0x5C + (CONTRAST >> 4)));//上位2bit
  lcd_cmd(0x6b); // Follwer for 3.3V
  lcd_cmd(0x38); // Set Normal mode
  lcd_cmd(0x0C); // Display On
  lcd_cmd(0x01); // Clear Display
}

/* LCD コマンド */
var lcd_cmd = function(cmd){
  board.io.i2cWrite(LCD_ADR,0x00,cmd);
}

/* SEND DATA */
var lcd_data = function(lcd_data){
  board.io.i2cWrite(LCD_ADR,0x40,lcd_data);
}

/* Set Cursor */
var lcd_setCursor = function( row,clm){
  //row=0 or 1
  if(row==0) lcd_cmd(0x80+clm);
  if(row==1) lcd_cmd(0xc0+clm);
}

/* All Clear */
var lcd_clear = function(){
  lcd_cmd(0x01); //初期化コマンド出力
}

/* LCD print */
var lcd_print = function(ptr){
	var msg = ptr +"";
	for(var i=0; i<msg.length ; i++)
	{
	   	lcd_data(msg.charCodeAt(i) ); //文字表示
	}
}

// テスト表示
 lcd_init(); //LCD初期化
 lcd_clear(); // LCDクリア
 lcd_setCursor(0,0); //カーソル位置
 lcd_print("hello"); // 表示文字列
 lcd_setCursor(1,3);
 lcd_print("world");1

});


```


![DCIM0442.JPG](https://qiita-image-store.s3.amazonaws.com/0/11566/2acf8c0a-48e2-cca4-817e-5e0d1b7d8b96.jpeg)
spark-sqlのthriftserverの起動オプション


```~/bin/start-thriftserver.sh
#!/bin/sh                                                                                                     
export SPARK_HOME=/opt/spark2.0

$SPARK_HOME/sbin/start-thriftserver.sh \
  --hiveconf hive.server2.thrift.port=10001 \
  --hiveconf hive.server2.thrift.bind.host=[なんかさーばー] \
  --master yarn --conf spark.ui.port=4049
```

- port=10000は普通のhiverserv2が使っているので、10001に変更
- masterはyarnで
- spark.ui.portは他が使っているので、4049に変更
Seleniumのキー入力が遅い対応

Selenium で行うテストで、キー入力があまりにも遅くて困ったときの対応方法

64bit のwindows 10 を使っていたので、当然 IEDriver も 64bit だと思って使っていたけれど、
調べてみたら、**32bit版を使うと速くなる** 、ということで試してみた。

64bit: １文字3秒くらいかかっていた
32bit: １フィールド一瞬で入力終了

というくらい速くなった。



参考サイト
http://devadjust.exblog.jp/19305561/
Git pushまで

# GitHubへのPush

**※自分用です**


- Git Bashをローカルリポジトリ/で実行（右クリック）
- Bash上からコマンド
- `git init`
- `git remote add origin [githubのurl(.git)]`
- `git add .`
- `git commit -m "コミットメッセージ"`
- `git push -u origin master`

- 以上でアップロード完了
Mac 上で Ruby の nokogiri 1.6.8 インストールの際に LZMA_OK 識別子が原因でビルドエラーになる時の対応方法

# 現象

nokogiri gem をインストールしようとした際にビルドエラーとなってしまいます。

```
gem install nokogiri -v '1.6.8'
```

LZMA がどうのこうの。圧縮系ライブラリがなにかまずいのかもしれません。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

(中略)

xmlIO.c:1450:52: error: use of undeclared identifier 'LZMA_OK'
    ret =  (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1;
                                                   ^
1 error generated.
make[2]: *** [xmlIO.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
========================================================================
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

# 解決

システムのライブラリを利用するよう変更しましょう。

    gem install nokogiri -- --use-system-libraries

bundler 利用時は、 bundler 経由で nokogiri がインストールされた時の設定を行いましょう。

    bundle config build.nokogiri --use-system-libraries

# その他解決方法

xz はファイルの圧縮ツールです。
何らかの理由で Homebrew から xz をインストールしてしまっている場合、これをアンインストールします。

```
brew uninstall xz
gem install nokogiri -v '1.6.8'
```

# 参考

https://github.com/sparklemotion/nokogiri/issues/1483
CSSアニメーションのループ＆ウェイトを Stylus で簡単に

CSS でインターバルのあるループアニメーションを作るのって大変ですよね？
例えば1秒間でアニメーションして、2秒のインターバルがある場合。

```css
div {
  animation: flash 3s linear infinite;
}

@keyframes flash {
             0% { opacity: 1; }
  16.666666666% { opacity: .5; }
  33.333333333% { opacity: 1; }
}
```

辛い！辛すぎる！！！
もっと複雑になると尚の事。。。

ってことで AltCSS。
僕がいつも使ってる Stylus で。

```stylus
// mixins
// name          => keyframes名
// duration      => アニメーション秒数
// interval      => インターバル秒数
// animationHash => アニメーション内容の連想配列
create-keyframes(name, duration, interval, animationHash)
  @keyframes name
    durationRatio = duration / (duration + interval)
    for progress, cssHash in animationHash
      {durationRatio * progress}{unquote('%')}
        for key, val in cssHash
          {key} val

div
  animation flash 3s linear infinite  // アニメーション秒数とインターバル秒数の合計秒数を入れる

create-keyframes(flash, 1, 2, {
    '0': { opacity: 1 },
   '50': { opacity: .5 },
  '100': { opacity: 1 }
})
```

まあ、多分 SASS とか他の AltCSS でも出来るかと。

animation の合計秒数を自動計算させる為に、
そこも mixin に含めようかと思ったけど、
出力の問題と、汎用性がなくなるのでヤメました。

とりあえず、これで少しは楽しくCSSアニメーションを書けるようになるかと！
まさかのIE8以下でlocation.hrefからdocument.referrerが取れなかった件

メモ。

とある実装で、onclick時にlocation.hrefから遷移するページでcookieにreffererを書き込むことになり、
他ブラウザは問題ないのに、どうしてもIE8で書き込みできなかったのが発端。
cookie自体の問題なのか、特定がしにくく
苦しんだあげくに見つけたのがコチラ。

http://www.goma.pw/article/2015-07-26-0/

ブラウザ振り分けは各自のやり方で良いとして。

キモになるのはcreateElementで新たなリンクエレメントを作成、
そのリンクエレメントに引数なり遷移先のURLをセットして
element.appendChildでぶっ込んで、clickイベント発火で遷移させる。

都合上、実装は他の方にお任せしてしまったが、
ここにたどり着くまでに時間かかりまくった。


もうこんな戦い嫌だよIE8。
nodebrew install-binary で no such file or directory

## エラー内容

```
brew install nodebrew
```

してからインストールしようとして

```
~ nodebrew install-binary v6.2.2
Fetching: https://nodejs.org/dist/v6.2.2/node-v6.2.2-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /Users/ono/.nodebrew/src/v6.2.2/node-v6.2.2-darwin-x64.tar.gz: No
Warning: such file or directory
```

## 対応

ディレクトリ作成は手動のようで。
ソースが取れないのだと思ってちょいはまり。

```
mkdir -p /Users/ono/.nodebrew/src 
```

これだけ。
オンラインコンパイラ,コードテスト等


## General
* CodePen (http://codepen.io/)
* CodePad (https://codepad.co/)
* ideone (http://ideone.com/) 複数言語対応

## JavaScript
* jsdo.it (http://jsdo.it/)
* JSFiddle (https://jsfiddle.net/)

## CoffeeScript
* js2coffee (http://js2.coffee/)

## BABEL
* babel (https://babeljs.io/)

## ECMAScript6
* ES6 Fiddle (http://www.es6fiddle.net/)
* ES6 Console (http://es6console.com/)

## CSS
* Online CSS Editor (http://www.cssportal.com/online-css-editor/)
* Autoprefixer CSS online (https://autoprefixer.github.io/)

## Sass(Scss)
* sassmeister (http://www.sassmeister.com/)
* SCSS Compiler (http://beautifytools.com/scss-compiler.php)

## LESS
* LESS TESTER (http://lesstester.com/)

## JADE
* Jade - Template (Engine http://jade-lang.com/demo/)
* HTML2Jade (http://html2jade.org/)
* HTML 2 Jade - a converter for HTM (http://html2jade.aaron-powell.com/)

## HAML
* HAML to HTML Free Online Converter (https://www.haml-converter.com/)
* Convert HTML to HAML (http://htmltohaml.com/)

## Minify
* Online Javascript Compression Tool (http://jscompress.com/)
* JavaScript Minifier (https://javascript-minifier.com/)

### minifyされたコードを戻す
* Pretty Diff (http://prettydiff.com/?m=beautify)
* Javascript unpacker and beautifier (http://alexis.m2osw.com/js-beautify/)

## PHP
* PHP Sandbox (http://sandbox.onlinephpfunctions.com/)

## Other
* htaccess (http://htaccess.madewithlove.be/)
* 正規表現チェッカー (http://okumocchi.jp/php/re.php)
* PHP正規表現チェッカー (http://nelog.jp/regular-expression-online-tools)
* RegExr (http://www.regexr.com/)
Rails5(Turbolinks5)にGA(google analytics)を設置！

## はじめに
間違っているかもしれません。
挙動の確認は取れてますが、自己責任で使ってください。

## Google Analyticsの設置
レイアウトに以下のコードを貼り付ける。

```html
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-000000-00', 'auto');
  ga('send', 'pageview');

</script>
```

ここまでは同じです。

## turbolinks5で動くようにする。
ページ切り替えのイベントでGAへの送信が発火するようにします。

```coffeescript
# Google Analyticsの設定
$ ->
  $(document).on 'turbolinks:render', ->
    if window.ga?
      ga('set', 'location', location.href.split('#')[0])
      ga('send', 'pageview')
```

多分動きます。
JavaScriptがOFFでも大丈夫です。

## 参考
[Turbolinks 5とTurbolinks Classic（2.x）の比較](http://qiita.com/jkr_2255/items/fe1e69e043c94a5c0a79)
ともかく最小の手順でWindows 10からSSHしたい！

TL;DR
=====

ともかくWindows10からsshできるようにするための最小手続きです

```ps1:管理者のPSコンソールで
PS> get-packageprovider -name chocolatey -forcebootstrap
PS> set-packagesource -name chocolatey -trusted
PS> install-package -name win32-openssh
```

これでsshできます

```:一般ユーザでOK(cmdでも大丈夫)
ssh -i C:\Users\ma2shita\_ssh\hoge-key.pem ec2-user@ec2-hoge-ip.hoge-region.compute.amazonaws.com
```

概要
====

[2016/7/29までだった、Windows10無償アップグレード](https://www.microsoft.com/ja-jp/windows/get-windows-10)に釣られてUbuntuから乗り越えたかたも100万人くらいいると信じている ma2shita です

ともかくsshしないと生きてけないのですが、[8/2のWindows 10 Anniversary Update](https://news.microsoft.com/ja-jp/2016/06/30/160630-windows-10-anniversary-update/)まで待てません (注:今日は8/1)

参考資料
=======

* [Win32-OpenSSHでWindowsからEC2へ簡単にSSH接続できるようになりました ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/win32-openssh-was-released/)
* [Windows 10でPackageManagement (OneGet) + Chocolateyでアプリ管理](http://rcmdnk.github.io/blog/2016/03/11/computer-windows-chocolatey-packagemanagement/)
PHP_CodeCoverage_Exception はXdebugを確認せよ

Codeception で Coverage レポートを出そうとした時に以下のようなエラーメッセージに遭遇した

```
[PHP_CodeCoverage_Exception]
No code coverage driver available
```
このようなエラーメッセージが出たら、XdebugがOFFになっている可能性があるので確認する

CentOSの場合
/etc/php.d/15-xdebug.ini の以下の行を有効にする

```15-xdebug.ini
zend_extension=xdebug.so
```

おそらく composer コマンド実行時に Xdebug をoffにするよう警告が出るので、そこで無効にしたのでしょう
Larvalを勉強している時に使ったコマンド

Larvalを勉強している時に使ったコマンド

■artisan コマンド
・サーバ起動
　php artisan serve —host 0.0.0.0 —port 8080

・tinker(アプリケーションとのやり取り)起動
　php artisan tinker

・migration
　php artisan make:migration ファイル名 —create=テーブル名(テーブル作成)
　php artisan make:migration ファイル名 —table=テーブル名(テーブル更新)
　php artisan migrate(migrationファイル実行)
　php artisan migrate:status(migrationファイルの適用状況確認)
　php artisan migrate:rollback(migrationを一つ前の状態に戻す)

・コマンド確認
　php artisan list

・コントローラー作成
　php artisan make:controller PostsController

・データベース操作(tinker)
　$post = App\Post::find(id番号);
　$post->all();
　$post->all()->toArray();
　$post->delete();
　App\Post::orderby(“created_at”,”desc”)->get()->toArray();
　App\Post::latest(“created_at”)->get()->toArray();
　App\Post::create([“title” => “title 1”, “body” => “body 1”]);
　App\Post::where(“id”,”>”,1)->orderby(“created_at”,”desc”)->get()->toArray();
　App\Post::where(“id”,”>”,1)->orderby(“created_at”,”desc”)->take(1)->get()->toArray();

・var_dump的な
　dd($posts->toArray());

・controllerからviewへのデータの受け渡し
　return view("posts.index", ["posts" => $posts]);
　return view("posts.index")->with("posts",$posts);

・viewでのデータの表示
　@forelse($posts as $post)
　{{ $post->title }}
　@empty
　@endforelse

　@foreach
　{{ $post->title }}
　@endforeach

・テンプレートエンジンbladeの活用
　index側
　テンプレートファイルの読み込み
　@extends(“テンプレートへのファイルパス”)

　表示
　<中身が多い場合>
　@section(“content”)
　表示する中身
　@endsection

　<中身が少ない場合>
　@section(“title”, “文言”)

　default側
　@yield(“content”)


■その他コマンド
・.envファイルの設定(viコマンド)
　vi .env

・mysqlコマンド
　grant all on DB名.テーブル名 to ユーザー名@ホスト identified by ‘パスワード’
　(あるDBのあるテーブルに対するホストからのユーザーのアクセスに対して全ての権限を与える(パスワード付きで))
　mysql-ctl cli(mysql起動)
React Native で development, staging, production など環境を切り替える

基本的に React Native は development か production かしか切り替えができない。

`__DEV__`
---------

React Native では development かどうかを判別する仕組みとして `__DEV__` というグローバルな変数が定義されている。次のページに書いてあるように、 packager に bundle してもらう際、 dev という query prameter に `true` か `1` を指定したときに `__DEV__ = true` としてくれる。

https://github.com/facebook/react-native/tree/master/packager#pathtomodulenamemapbundle-query-params

これを見て設定を切り替えればいい。

ちなみに Android で `cd android && ./gradlew assembleRelease` したり iOS で Release ビルドした場合はきちんと `__DEV__ === false` にしてくれる。

react-native-config
-------------------

と、ここまではいいんだけど staging と production をわけたいとなると本体の仕組みだけでは無理になる。

https://github.com/facebook/react-native/issues/4017

> There are no staging vs. production options in the packager. You'll have to determine that at runtime.

react-native-config はここらへんをうまいこと切り分けてくれるパッケージ。

https://github.com/luggit/react-native-config

仕組みとしてはビルド時に環境を指定して設定値を native app に埋め込み、実行時にそれを bridge して読み込めるようにする、というもの。

README がとても丁寧に書かれているのでそれを読めばいいんだけど、備忘録代わりに設定方法をひととおり書いておく。

https://github.com/luggit/react-native-config#different-environments

react-native-config は `.env` というファイルをデフォルトの設定ファイルとして読み込んでくれる。中身は sh 変数の定義のように `VAR=VALUE` という形で設定値を定義していく。

まず環境と設定ファイルを次のように作っておく。

| 環境          | ファイル名        |
|---------------|-------------------|
| development   | `.env`            |
| staging       | `.env.staging`    |
| production    | `.env.production` |

```sh:.env
API_ENDPOINT=http://dev.example.com/api/
```

```sh:.env.staging
API_ENDPOINT=http://stg.example.com/api/
```

```sh:.env.production
API_ENDPOINT=http://prd.example.com/api/
```

Android
-------

Android の場合、 `ENVFILE` という環境変数を指定しながら `react-native run-android` するだけ。 staging 環境のアプリをビルドしたい場合、次で OK 。

```sh
ENVFILE=.env.staging react-native run-android
```

iOS
---

iOS の場合それぞれの環境ごとに scheme を作る必要がある。

1. アプリ名と同じ名前の scheme ができているはずなのでそれを duplicate
    - 名前はわかりやすく `appname-staging` とかにしておく
2. duplicate した scheme の Build -> Pre-actions に `echo ".env.staging" > /tmp/envfile` という内容の sh script を書く

![app-staging.png](https://qiita-image-store.s3.amazonaws.com/0/27516/abeea18f-9481-5472-8bea-67201e28c6ac.png)

↑を `.env` 含めてすべての設定ファイルに対してやる。 `/tmp/envfile` というグローバルな状態見てるから毎回書き換えないと前回の状態を引き継いじゃうので。

これで OK 。


使い分け
--------

development かどうかわかればいいという場合は `__DEV__` での切り替えで、それ以上に環境を細かくわけたい場合は react-native-config を使えばいい。


mocha と react-native-config
----------------------------

mocha でテストを書く場合、 native app は経由しないというかできない、つまり react-native-config を使おうとすると当然のごとく設定値を読み込めなくて落ちるんだけど、それを何とかする package を @shinout が作ってくれた。

https://github.com/CureApp/react-native-config-node

ここらへんの解説もしたいけど、テストについてを含めて今度まとめて書く予定。