OmniAICreator/Qiita-1.07M huggingface dataset:
パズルゲー「ルームスイーパ」をC++で解いてみた その2

# 概要
　[前回の記事](http://qiita.com/YSRKEN/items/8d6564bf40ad0dcb4081)の続きです。
　あれから様々な工夫をこらすことによって探索を高速化しました。

# こつこつ作戦です！
　枝刈りで相当速くなったはずなのですが、それでも解けない問題は多いです。そこで、無駄だと思われる計算を徹底的に省くことにしました。
　まず、鉢合わせ処理がありえる場合とない場合とで、枝刈りする際の判定が「掃除人の位置から拭きたい位置のマスまでの最短距離＞掃除人が歩ける残り歩数＋2歩」と「掃除人の位置から拭きたい位置のマスまでの最短距離＞掃除人が歩ける残り歩数」に分かれていましたが、**冷静に考えると毎回+2するのは無駄ですよね。**というわけで、最短距離を格納するバッファを2種類に増やし、計算を簡略化しました。
　また、周囲にゴミ箱やリサイクル箱があるかどうかも今までは毎回if文を並べていましたが、**ゴミ箱やリサイクル箱の位置は盤面読み込み時に決定します**ので、そちらも事前に計算することにしました。
　他にもビット演算を利用して判定を高速化するなどした結果、1割ほど計算時間が短くなりました。

# 次は並列化です！
　上記までで、思いつく限りの高速化策はネタ切れとなってしまいました。となると、後は演算の並列化ぐらいしかありません。
　しかし再帰探索は並列化の苦手分野であり、困難な過程になると予想されました。**開発環境(Visual Studio 2015)だとOpenMP2.0までしか使えない**ので[task構文](https://docs.oracle.com/cd/E22054_01/html/821-2493/girtd.html)が使えず、したがって別のスレッド生成方法を探す他なかったからです。実はこうした[探索並列化の経験はある](http://qiita.com/YSRKEN/items/82943ce17e03b0b414f3)のですが、その際はBFSも併用する複雑なことをしていたのでもう少し楽したいということもありました。
　そこで、目をつけたのは**[std::threadおよびstd::future](http://qiita.com/termoshtt/items/d3cb7fe226cdd498d2ef)**です。標準的な構文でサクッと並列化できるのですから使わない手はありません。ただ、もちろんスレッドを生成しまくると効率が悪すぎますので、スレッド数を抑えるために次のようなコードを組みました。

```solve_.cpp
/* もちろん概略的なものです */
size_t threads = 1;	 //現在のスレッド数
size_t max_threads = 8; //最大スレッド数
std::mutex mtx;
void Move(){
	if(threads < max_threads){
		// スレッド数を増やす処理
		動かせる手を列挙
		vector<std::future<bool>> result;
		std::deque<bool> result_get;
		mtx.lock(); g_threads += それぞれの手の数 - 1; mtx.unlock();
		for(size_t di = 0; di < それぞれの手の数; ++di){
			result[di] = std::async(std::launch::async, [(略)] {
				手を動かす
				bool flg = Move();
				手を戻す
				return flg;
			});
		}
		for(size_t di = 0; di < それぞれの手の数; ++di){
			result_get[di] = result[di].get();
		}
		mtx.lock(); g_threads -= それぞれの手の数 - 1; mtx.unlock();
		for(size_t di = 0; di < それぞれの手の数; ++di){
			if(result_get[di]){
				結果を書き戻す
				return true;
			}
		}
		return false;
	}else{
		// 1スレッドで探索する処理
		手を動かす
		bool flg = Move();
		手を戻す
		return flg;
	}
	その他の処理
}
```

　長々と書いてますが、要するに「移動する方向に応じてスレッドを作成する」「最大スレッド数はthreadsで管理する」ということですね。これらの工夫により、CPUを使いきって探索してくれるようになりました。

# 計算、がんばります！
　これだけ工夫したのですから、当然速くなってくれないと困ります。そこで、[「No.46 平等に労働する部屋」](http://www.iphoroid.jp/appli/capture.php?mgi=2859&mgai=9297)について、演算時間を比べてみましょう。Core i7-4790K(定格)・64bitWindows10で64bitバイナリを動かしました(どれもPGO適応済み。[リリースしているもの](https://github.com/YSRKEN/SweepOptimizer/releases)と同じバイナリ)

|ソフト|演算時間[ms]|備考|
|:-----|:-----------|:---|
|Ver.1.1.1|27756|前回の記事の最新版|
|Ver.1.2.0|25244|こつこつ作戦です！|
|Ver.1.3.0(1スレッド)|26417|次は並列化です！|
|Ver.1.3.0(2スレッド)|14949|-|
|Ver.1.3.0(4スレッド)|11044|-|
|Ver.1.3.0(8スレッド)|6865|-|

　これから分かるように、**並列化の威力は絶大である**と窺えます。ただ、並列化も完璧ではなく、小さな問題などでむしろ遅くなったケースもありました。ただ、Ver.1.3.0では動作スレッド数を自由に調整できますので、自環境に合わせて最適化できます。
　なお、これらの工夫で追加で解けた問題はNo.45ぐらいで、後は**並列化して数時間放置しても解けない**と完全に沼っています……。なぜかA～Pの追加問題があったのでそちらも解いたのですが、No.N・No.O・No.Pの3つ以外は全て短時間で解けました。
日本語プログラミング言語「なでしこ」でズンドコキヨシ

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

プログラミング言語って記号とかいろいろ並んでて僕には難しいです。
あとズンドコキヨシってくらいなので日本語の方がしっくりきますね。ってことで「[なでしこ](http://nadesi.com/top/)」で書きました。

```
アレとは配列
▲最初
ズンドコは２の乱数
もしズンドコが０ならば
	「ズン」を表示
	アレに「ズン」を配列追加	
もしズンドコが１ならば
	「ドコ」を表示
	アレに「ドコ」を配列追加
ソレはアレの配列要素数
もしソレが６以上ならば
	アレの１を配列削除
答えはアレを「」で配列結合
もし答えが「ズンズンズンズンドコ」ならば
	最後へ飛ぶ
最初へ飛ぶ
▲最後
「キヨシ」を表示
```
![bfe6ec8ae8ddec5bd10be63763ab2632.png](https://qiita-image-store.s3.amazonaws.com/0/665/d5a8b90b-c640-d186-105e-f751203e2128.png)
ズンドコキヨシ with Java 短く書いた

流行ってたのでつい・・・

```java:Kiyoshi.java
public class Kiyoshi {
  public static void main(String[] args) {
    String s = "";
    do {
      s += Math.random() > 0.5 ? "ズン" : "ドコ";
    } while (!s.endsWith("ズンズンズンズンドコ"));
    System.out.println(s + "キ・ヨ・シ！");
  }
}
```

やっぱJavaだし長く感じるよなー。

### 3/17 追記
出力は毎回なのか・・・というわけで version 2

```java:Kiyoshi2.java
public class Kiyoshi2 {
  public static void main(String[] args) {
    String s = "";
    do {
      String zd = Math.random() > 0.5 ? "ズン" : "ドコ";
      System.out.print(zd);
      s += zd;
    } while (!s.endsWith("ズンズンズンズンドコ"));
    System.out.println("キ・ヨ・シ！");
  }
}
```

長くなっちまった・・・
Ruby初心者のためのattr_accessor

#問題
Rubyの [attr_accessor](http://ref.xaio.jp/ruby/classes/module/attr_accessor) とは何者なのか。

#解決
インスタンス変数を定義しつつ、ゲッターとセッターも作ってくれる便利なやつ。
- **別に使わなくてもいい** （当然使ったほうがいいし普通は使う）
- **怖がらなくてもいい** （無害です）

#解説
次のような「よくある動作」すなわち、あるクラスで、オブジェクトのインスタンス変数の読み書きがしたいとする。


```
user = User.new

#値の書き込み
user.name = "Ichiro Tanaka"

#値の読み出し
user.name
=> "Ichiro Tanaka"
```

そのクラス定義、これではダメ。（C言語あたりから来た人なら、いける気がしてしまうはず）

```
class user
  @user
end
```

値の「読み」「書き」のそれぞれに、メソッドを用意する必要がある。

```
class user

  #値の書き込み用メソッド
  def user=(val)
    @user = val
  end

  #値の読み出し用メソッド
  def user
    @user
  end

end
```

長い。こんなよくある動作のためにメソッド２つも人力で書くなんて…。
そこで登場するのがattr_accessor。

```
class User
  attr_accessor　:name
end
```

こう書くだけで、読み書きに対応したインスタンス変数が用意される。
そんなインスタンス変数を複数個用意したいときも簡単。

```
class User
  attr_accessor　:name, :email, :mobile, :birthday
end
```

コードが随分コンパクトになるので、積極的に使っていきましょう（自分へ）。
RubyでFizzBuzz

### Rubyの練習がてらにFizzBuzzを書いてみた。
変数宣言しなくていいし、ループ、分岐の記述も楽だなと思った。
ちなみにRubyのバージョンは2.2.3

```
# とりあえず1から100まで
for i in 1..100 do
  if i % 3 == 0 && i % 5 == 0
    puts "FizzBuzz"
  elsif i % 3 == 0
    puts "Fizz"
  elsif i % 5 == 0
    puts "Buzz"
  else
    puts i
  end
end
```

```
# 別解
# each　を使ってみる
(1..100).each do |i|
  if i % 3 == 0 && i % 5 == 0
    puts "FizzBuzz"
  elsif i % 3 == 0
    puts "Fizz"
  elsif i % 5 == 0
    puts "Buzz"
  else
    puts i
  end
end
```

### 実行結果

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```
AndroidでDELETEリクエストを送付する（HttpURLConnection利用）

DELETEリクエストも記載します。

送付するURLイメージ
DELETE http://exam/delete/1

Javaソース

```Java

try {
    String buffer = "";
    HttpURLConnection con = null;
    URL url = new URL("URL");
    con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("DELETE");
    con.setInstanceFollowRedirects(false);
    con.setRequestProperty("Accept-Language", "jp");
    con.setConnectTimeout(5000);
    con.setReadTimeout(5000);
    con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
    con.getResponseCode();
    con.disconnect();
} catch (MalformedURLException e) {
    e.printStackTrace();
    return 500;
} catch (ProtocolException e) {
    e.printStackTrace();
    return 500;
} catch (IOException e) {
    e.printStackTrace();
    return 500;
} catch (Exception e) {
    e.printStackTrace();
    return 500;
}
return 200;
}

```

リクエスト、レスポンスでJSON文字列やりとりしないので
DELETEの通信が一番すっきりしています。
Ansibleでユーザ追加とグループ作成方法

# ansibleでユーザとグループの設定する
## イベントリファイルの作成
dev-serverという親グループを作成し、共通設定としてcommon-baseという子グループを作成し、dev-serverを包含させる。
親グループを複数作成し、子グループへ属させことで、実行タスクを振り分けPlayBookの再利用性を高めたいのでこの構成を組む。

```yml:staging
[dev-server]
dev002

[common-base:children]
dev-server
```

## マスタープレイブック作成
実行ホストと実行タスクが増えた時に修正が容易になるように、マスタープレイブックはシンプルにする。
今回は１つのymlのみinculuedさせる

```yml:site.yml
---
- include: common-base.yml
```

## グループのプレイブック作成
実行ホストをイベントリで設定したグループを指定し、変数を定義したymlファイルとタスクを定義したymlファイルをinculdeする

```yml:common-base.yml
---
- hosts: common-base
  vars_files:
    - ./vars/usergroup.yml
  tasks:
    - include: ./tasks/user-group-setting.yml
```

## 変数定義ファイルの作成
いろいろなサイトをみたところkey名にユーザー名を当てているものがあったが、拡張性が悪くなるので以下のように定義。

```yml:usergroup.yml
usergroup:
  user:
    name: hoge
    group: hoge
    uid: 4519
    gid: 4519
    password: $6$hoge$zOyVU7p6q2aLNjyi7.WZy8sgiSqUPRnQBYruV9iAIdBr5p3tqipt9ZscPHlwe8wBEW91jb4mB2fLGPY7dsRBA/

  group:
    name: hogegroup
    gid: 1919
```

### パスワードの作成
AnsibleのUSERモジュールで設定するパスワードはハッシュ化されたものを記載する必要がある。
以下でハッシュ化して変数ファイルのpasswordに設定

```sh
python -c 'import crypt; print crypt.crypt("123456789", "$6$hogehoge$")'
```
※ pythonでは`crypt.crypt("ここにパスワード","$6$ここにハッシュkey")`でHASH化できるのでそれをprintさせて取得する


## タスクファイルの作成
構築対象のサーバーの設定をタスクとして定義する。ユーザ作成とグループ作成を行う場合は
userモジュールとgroupモジュールを利用して変数定義ファイルから設定値を取得してユーザとグループを設定する

```yml:user-group-setting.yml
- name: create group
  group: name={{usergroup.group.name}} gid={{usergroup.group.gid}}

- name: add users that join to group (wheel and usergroup)
  user: name={{usergroup.user.name}} uid={{usergroup.user.uid}} state=present password={{usergroup.user.password}} groups={{usergroup.user.group}},wheel

- name: user join to other group
  user: name={{usergroup.user.name}} append=yes groups={{usergroup.group.name}}

- name: ~/.ssh for users exist
  file: path="/home/{{usergroup.user.name}}/.ssh" state=directory owner={{usergroup.user.name}} group={{usergroup.user.group}} mode=0700
```

## 実行
テストをして問題ないことを確認したら実行する

### シンタックステスト
```sh
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging  ~/ansible/playbook/common-playbook/site.yml --syntax-check
```

###  実行タスクリストを確認
```sh
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging  ~/ansible/playbook/common-playbook/site.yml --list-task
```

### リハーサル(dry-rub)
```sh
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging  ~/ansible/playbook/common-playbook/site.yml --check
```

### 本番
```sh
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging  ~/ansible/playbook/common-playbook/site.yml
```

## 参考
http://docs.ansible.com/ansible/playbooks_best_practices.html#top-level-playbooks-are-separated-by-role
http://knowledge.sakura.ad.jp/tech/3084/
AndroidでPUTリクエストを送付する（HttpURLConnection利用）

APIにアクセスする場合、HTTPのメソッドを指定します。
以前、GETリクエストの記事を書きましたがPUTリクエストも追記します。

送付するURLイメージ
PUT http://exam/update/1

送付するJSON文字列イメージ

```json
{
    "user":{
    "name": "post",
    "password": "password",
    "password_confirmation": "password"
    }
}
```

Javaソース

```java
final String json =
  "{\"user\":{" +
  "\"name\":\"name1\","+
  "\"password\":\"password\","+
  "\"password_confirmation\":\"password\""+
  "}}";

try {
        String buffer = "";
        HttpURLConnection con = null;
        URL url = new URL("URL");
        con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("PUT");
        con.setInstanceFollowRedirects(false);
        con.setRequestProperty("Accept-Language", "jp");
        con.setDoOutput(true);
        con.setConnectTimeout(5000);
        con.setReadTimeout(5000);
        con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
        OutputStream os = con.getOutputStream();
        PrintStream ps = new PrintStream(os);
        ps.print("json文字列");
        ps.close();
        BufferedReader reader =
                new BufferedReader(new InputStreamReader
                        (con.getInputStream(), "UTF-8"));
        con.disconnect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
        return 500;
    } catch (ProtocolException e) {
        e.printStackTrace();
        return 500;
    } catch (IOException e) {
        e.printStackTrace();
        return 500;
    } catch (Exception e) {
        e.printStackTrace();
        return 500;
    }
    return 200;
}
```


過去に投稿した部分から、以下のオプションを追加しました。
接続の状況によって例外処理を行うように指定しています。

```java
  setConnectTimeout(5000);
  setReadTimeout(5000);
```
上の２つによって、以下のような動きとなります。
・ホストに接続する際、5秒以上経ったら例外を投げる
・接続後、レスポンスが変える際、5秒以上経ったら例外を投げる

※注意
hostsに登録されていない、DNSから引けないような接続先を指定した場合は、指定した設定で例外を投げません。接続先を解決でき、接続時の失敗（SocketTimeoutException）における例外となります。
→上のようなHostに通信したケースではUnknownHostExceptionが投げられます。

Androidであれば、android.net.httpがHTTPクライアントでは
一般的だと今更知りました。
mitmproxy 0.16 にリクエスト内容をcurlコマンドやPythonコードに変換できる便利なやつがついていた

ドキュメントは全然整備されてなくてソースコード読んでたら偶然見つけた。

![Screen Shot 2016-03-17 at 12.45.01 AM.png](https://qiita-image-store.s3.amazonaws.com/0/229/1959007f-4825-f8ec-b91d-cc3f9080f580.png)

`E` を押して `c` `p` `r` どれかでクリップボードにコピーされる。
ActionMailerでメール機能の実装

<h2>
お問い合わせなどがあったときにそのユーザーにメールが届くために
</h2>
<p>
rails ではActionMailerという機能を提供しているので、これを利用してメール機能を実装します。まずコマンドで
</p>

```command:command
$ rails g mailer InquiryNotifier
```

<p>
と打ちます。ファイルが自動生成されますが一旦ここでは気にしません。
</p>
mailerがメールを送るためにすることの流れは

```
0,sendgridでアカウントを作る
1,ActionMailerクラスを継承したInquiryNotifierクラスで送信する際のメソッドを定義
2,formでもらったデータを`InquiryController.rb`のcreateアクションにsendgridなどのメールクライアントをかませる
3,smtpの設定
4,メールの書く内容のにformのデータを反映
```
といったところです。
<h4>0,sendgridアカウントを作る</h4>

[こちらから](https://sendgrid.com/)

<h4>1,ActionMailerクラスを継承したInquiryNotifierクラスで送信する際のメソッドを定義</h4>

```ruby:inquiry_notifier.rb
class InquiryNotifier < ApplicationMailer

  def send_user(inquiry)
    @inquiry = inquiry
    mail(to: @inquiry.email, subject: 'お問い合わせありがとうございます。' )
  end
#@inquryはユーザがデータを投入するための変数です
end

```
<h4>2,formでもらったデータをInquiryController.rbのcreateアクションにsendgridなどのメールクライアントをかませる</h4>

```ruby:inquries_controller.rb
....
  def create
    @inquiry = Inquiry.new(inquiry_params)#ストロングパラメータです
    if @inquiry.save
      InquiryNotifier.send_user(@inquiry).deliver_now #rails5ではdeliver_nowしか使えないのでこちらを推奨します。
      redirect_to root_path
    else
      render template: "welcome/index"
    end
  end
...
```
<h4>smtpの設定</h4>
```ruby:config/production.rb

....
config.action_mailer.default_url_options = { :host => 'ホスト名' }
  config.action_mailer.smtp_settings = {
    :user_name => 'sendgridのユーザー名',
    :password => 'sendgridのパスワード',
    :domain => 'ドメイン名',
    :address => 'smtp.sendgrid.net',
    :port => 587,
    :authentication => :plain,
    :enable_starttls_auto => true
  }
...

```
を追加。

<h4>
4,メールの書く内容にformのデータを反映
</h4>
先ほどのコマンドで'layouts/miler.html'が自動生成されてるので、そこに埋め込むものが以下です。

```erb:send_user.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <p>ユーザ名 => <%= @inquiry.name %></p>
    <p>eメールアドレス => <%= @inquiry.email%></p>
  </body>
</html>

```

ローカルでもオンラインであれば実行できます\(^o^)/
コードを追加してadminにも送ることもできるようになりますｖ（＾＿＾ｖ）♪
electronでjqueryとbootstrapをwebpackでまとめてみる

electron+baeblのテンプレートを作ってみた その１
http://qiita.com/umema4/items/1250ad632204acbd684c

electron+baeblのテンプレートを作ってみた その2(CSS周り)
http://qiita.com/umema4/items/597ed5ac2b5304d8a512

github
https://github.com/umema4/electron-babel6

今回はjqueryとbootstrapをスクリプトから呼ぶところを中心にすすめる

# jqueryの設定
electronの公式では
http://electron.atom.io/docs/v0.36.7/faq/electron-faq/#i-can-not-use-jqueryrequirejsmeteorangularjs-in-electron
となっている

```js
  webPreferences: {
    nodeIntegration: false
  }
```

を指定しているのでscriptタグから読み込み可能

```html
  <script src="./node_modules/jquery/dist/jquery.js"></script>
  <script src="./node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
```

からの

```
bootstrap.min.js:7 Uncaught Error: Bootstrap tooltips require Tether 
```

とエラー。bootstrap4ではTetherが必要なようなので
npmで追加する

```sh
npm install tether --save
```

これでOK

```html
  <script src="./node_modules/jquery/dist/jquery.js"></script>
  <script src="./node_modules/tether/dist/js/tether.js"></script>
  <script src="./node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
```

だけどnode_moduelsから読み込むのもいけてない気がするのでwebpackでまとめてしまう

webpackでvendorを下記のようにまとめる

```js
    vendor: ['jquery', 'tether', 'bootstrap'],
    plugins: [
      new webpack.ProvidePlugin({
        $: "jquery",
        jQuery: "jquery",
        "window.jQuery": "jquery"
      }),
      new webpack.ProvidePlugin({
        "window.Tether": "tether"
      }),
　    new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.bundle.js')
    ]
```

```html
  <script src="./assets/vendor.bundle.js"></script>
  <script src="./assets/app.bundle.js"></script>
```

今回の修正コード
https://github.com/umema4/electron-babel6/commit/da804a8990bcec159fe008a4baad1ceaf33fe054

## 参照
https://webpack.github.io/docs/code-splitting.html
http://stackoverflow.com/questions/28969861/managing-jquery-plugin-dependency-in-webpack
ズンドコキヨシ with Ruby

最近Ruby力が落ちてきている気がするので、力試しにやってみる。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

尚、@yancya さんのコードは極力見ないようにする。
http://qiita.com/yancya/items/1167e9764719151d0c80

でも、@joker1007さんのアドバイスは見てしまったのでそれは不可抗力で。

とりあえず仕様を満たす動きをサラッと書いてみる。

```rb
#coding: utf-8

zun = "ズン"
doko = "ドコ"
ary = []

while ary << [zun,doko].sample
  p ary.last
  if ary.last(5) == [zun, zun, zun, zun, doko]
    p "キ・ヨ・シ！"
    break
  end
end
```

で、これを最適化する。

```rb
#coding: utf-8

zun, doko = "ズン", "ドコ"

loop
  .lazy
  .map { p [zun,doko].sample }
  .each_cons(5) { |a| p "キ・ヨ・シ！"  and break if a.join == zun * 4 + doko }
```

2016.03.17 「ズン」が1個足りてなかったのと1個目のコードの判定がおかしかったので修正。

each_consを使えば？　という@joker1007さんと、チラ見してしまった@yancyaさんのmap処理見てなければ後者は無理だったと思う。
Vimが長いテキストで重くなる現象を回避

Vimで編集中のファイル内にdata URL等のlong lineがあると、設定によってはVimが死にます。

`syntax on`だとsyntax highlightingのために、一行3000文字まで解析しよと頑張っちゃうらしいので、そこが原因です。

基本的には1行多くてもせいぜい200文字くらい（多い）なので、
最大設定を適当に書き換えればokです。

```.vimrc
" 以下を.vimrc等に記述
set synmaxcol=200
```
ElasticBeanstalkのWorkerつかってみる

# はじめに

Workerを使ってなんかつくってみたという内容が主となってます。

# ElasticBeanstalk Workerについて

Workerは、インスタンス内にsqsdというデーモンが動き、指定したSQSにキューがたまるとそのキューを取得し、インスタンス内の指定したパスにメッセージをpostするしくみが付いている。
メッセージ → SQS → sqsd → アプリケーションみたいな流れ。
Worker環境作成時にSQSも同時に作成することができる。
下記のリンクの図をみるとイメージしやすいと思います。
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html


# Workerで環境をつくってみる

SQSにメッセージをpostしたらメッセージをDynamoDBに登録するというアプリケーションを作ってみようと思います。

## 事前準備

### Railsアプリケーションを作成してzipにする
jsonでpostされたらDynamoDBに登録する実装をする。

```ruby:routes.rb
Rails.application.routes.draw do
  post '/sqs_test', to: 'sqsd#add_dynamo'
end
```

```ruby:sqsd_controller.rb
class SqsdController < ApplicationController
require 'aws-sdk-core'
    def add_dynamo
        json_request = JSON.parse(request.body.read)
        p json_request

        dynamo_cli = Aws::DynamoDB::Client.new(
                        region: 'us-west-2'
                    )

        # sqsd_testテーブルに登録する
        dynamo_cli.put_item(
                    table_name: 'sqsd_test',
                    item: {
                        id: json_request['id'],
                         message: json_request['message']
                    })
    end
end
```

### DynamoDBのテーブルを作成する
以下の内容でテーブルを作成しました。

![dynamo.PNG](https://qiita-image-store.s3.amazonaws.com/0/85232/b70ce815-18e4-bafd-7a13-a586e34ccd97.png)



## Worker作成

アプリケーションに事前に作成したzipを指定します。

![app_zip.PNG](https://qiita-image-store.s3.amazonaws.com/0/85232/48530c4b-da85-755f-4ac9-711900d23a8d.png)

**ワーカーキュー** に自動生成キューを指定。
**HTTPパス** に上のRailsで設定したパスを指定。
**MIMEタイプ**　にapplication/jsonを指定。

![worker.PNG](https://qiita-image-store.s3.amazonaws.com/0/85232/5cee1b7c-1f5a-45af-b6a4-3b20dff916cd.png)

他の設定を最低限行い、作成しました。

![created_env.PNG](https://qiita-image-store.s3.amazonaws.com/0/85232/ff44ba1c-9083-3db1-ee52-e7ef1424e2e1.png)

これで、インスタンス1台とSQSが作成されました。


# sqsdの動作を確認する

自動生成されたSQSに以下の内容をpublishする。

```
{"id":"1234", "message":"worker test"}
```

すると、インスタンスで動いているsqsdがキューを取得し、メッセージをローカルの**/sqs_test** にpostすることで、
作成したRailsアプリケーションによって、dynamoDBに登録されます。

![dynamo_result.PNG](https://qiita-image-store.s3.amazonaws.com/0/85232/38ef0676-d92b-2eb8-1153-3137f10b4815.png)


# まとめ

ElasticBeanstalkのworkerというものを使ってみた。
実際にSQSにメッセージを送信し、sqsdがそれをsubscribeしてアプリケーションにpostするというのをログとともに確認することができた。
batch処理など、アプリケーションの裏側でいろいろと使えそうだと感じた。もう少し何かしらで使ってみたい。
また、ElasticBeanstalkだとアプリケーションの管理などがとても楽に感じた。

一度つかってみると感覚がわかるので、ElasticBeanstalk使ってみたい人はなにかしら作ってみると楽しいと思った。

また今度、途中経過の内容やElasticBeanstalkの概要などをまとめてみようと思います。
Apache の SetEnvIf で プライベートIPアドレス帯域を指定する方法


#背景
ログ出力や特定モジュールから内部アクセスは除外したかったが mod_setenvif では CIDR 表記は受け付けなかったため プライベートIPアドレス帯域を正規表現でセットしてみた。

#環境
・Apache 2.x

#やったこと
プライベートIPのアドレス定義は以下のとおり。

| クラス | IPアドレス範囲 | CIDR表記 | サブネットマスク |
| --- | --- | --- | --- |
| クラスA | 10.0.0.0 ～ 10.255.255.255 | 10.0.0.0/8 | 255.0.0.0 |
| クラスB | 172.16.0.0 ～ 172.31.255.255 | 172.16.0.0/12 | 255.240.0.0 |
| クラスC | 192.168.0.0 ～ 192.168.255.255 | 192.168.0.0/16 | 255.255.0.0 |

各クラスのIPアドレス範囲からネットワークアドレスとブロードキャストアドレスを除外すると、ホストとして利用可能なIPアドレス範囲は以下となる。

| クラス | ホストのIPアドレス範囲 | ネットワーク | ブロードキャスト |
| --- | --- | --- | --- |
| クラスA | 10.0.0.1 ～ 10.255.255.254 | 10.0.0.0 | 10.255.255.255 |
| クラスB | 172.16.0.1 ～ 172.31.255.254 | 172.16.0.0 | 172.31.255.255 |
| クラスC | 192.168.0.1 ～ 192.168.255.254 | 192.168.0.0 | 192.168.255.255 |

#プライベートIPを正規表現で記述してみる
ホストのIPアドレス範囲を正規表現で表すと以下となる。
###クラスA ( 10.0.0.1 ～ 10.255.255.254 )
```
^10\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$
```
###クラスB （ 172.16.0.1 ～ 172.31.255.254 ）
```
^172\.(1[6-9]|2[0-9]|3[0-1])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
```
###クラスC ( 192.168.0.1 ～ 192.168.255.254 )
```
^192\.168\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$
```

#設定例
プライベートIPアドレスなら環境変数 HOGE_IGNORE にIPアドレスをセットする。
ただし 192.168.0.1 のアドレスならば 環境変数 HOGE_IGNORE は立てない。

```conf
<IfModule mod_setenvif.c>
  SetEnvIf Remote_Addr "^(192)\.(168)\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$" HOGE_IGNORE=$1.$2.$3.$4
  SetEnvIf Remote_Addr "^(172)\.(1[6-9]|2[0-9]|3[0-1])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" HOGE_IGNORE=$1.$2.$3.$4
  SetEnvIf Remote_Addr "^(10)\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$" HOGE_IGNORE=$1.$2.$3.$4
  SetEnvIf Remote_Addr "^192\.168\.0\.1$" !HOGE_IGNORE
</IfModule>
```

環境変数のセット用法は以下を参照ください。
引用元：https://httpd.apache.org/docs/2.2/ja/mod/mod_setenvif.html#setenvif

| 引数 | 説明 |
| --- | --- |
| varname | 環境変数 varname に 1 がセットされる |
| !varname | （既に varname がセットされてたら）環境変数を消去する |
| varname=value | 環境変数 varname に value の値がセットされる |
| varname=$1 | 環境変数 varname に ```$1..$9``` の範囲内で正規表現の丸括弧()で囲まれた部分が置換されてセットされる |

間違いや、もっと簡単な方法があるよ。などあればご指摘いただければと思います。

# (追記)もっと簡単な方法
そんな細かくIPを指定する必要ない！環境変数さえ立てば良い！
っていう場合は、先頭一致で弾けますね

```conf
<IfModule mod_setenvif.c>
  SetEnvIf Remote_Addr "^192.168." HOGE_IGNORE
  SetEnvIf Remote_Addr "^172.(1[6-9]|2[0-9]|3[0-1])." HOGE_IGNORE
  SetEnvIf Remote_Addr "^10." HOGE_IGNORE
  SetEnvIf Remote_Addr "^192.168.0.1$" !HOGE_IGNORE
</IfModule>
```
以上です
RS-232Cの備忘録

RS-232Cの備忘録です。

シリアルケーブルで通信できないでとても困ったので、問題の解決方法を備忘録として残します。

□データが本当に出力されているか
□出力先(ポート番号)
□ケーブル(クロスとストレート)
□ボーレート(通信速度)
□パリティーチェック
□ストップビット
□フロー制御と同期式

上記が正しければ、問題なく通信できるはず。

解決できなかった場合は追記していきます。
PHPリファレンス（使用したもの）



## 定義済みの変数

|$_POST | POSTメソッドでリクエストされたデータは、POST変数「$_POST」を利用し、取得します。|
|---|---|
|if文 |<?php if ($a > $b) echo "aはbより大きい"; ?> 別の書き方は下記を参照|

引用：<a href="http://www.php-ref.com/web/01_post.html" target="_blank">ＰＨＰリファレンス（$_POST）</a>
引用：<a href="http://php-web.net/nyumon/if.html" target="_blank">条件分岐 if文</a>（別の書き方）
```php
<? if(): ?>
<?php else: ?>
<?php endif; ?>
 ```


## 制御構造
|foreach |foreach は、配列を反復処理するための便利な方法です。 foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。|
|---|---|

引用：<a href="http://www.phpbook.jp/tutorial/for/index8.html" target="_blank">foreach文 - 繰り返し処理 - PHP入門</a>

## 変数・データ関連

### 変数操作

|isset |変数がセットされており、それがNULLでないことを調べます。|
|---|---|

## テキスト処理

### PCRE

#### PCRE関数

|preg_match |正規表現によるマッチングを行う。|
|---|---|

```php:php
 <?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>
 ```
 ↓出力結果
 ```Array
(
    [0] => Array
        (
            [0] => def
            [1] => 0
        )

)
  ```
 引用：<a href="https://secure.php.net/manual/ja/function.preg-match.php" target="_blank">PHP: preg_match - Manual</a>


## PHP: PHP マニュアル - Manua

引用：<a href="http://php.net/manual/ja/langref.php" target="_blank">PHP: 言語リファレンス - Manual</a>
ShinobiLayer: Endurance Storageにおけるmanual snapshotの取得方法


#1. はじめに
SoftLayerのEndurance Storageは、1GB単位の性能が決まっている高い可用性を持ったストレージです。Block Storage(iSCSIタイプ)とFile Storage(NFSタイプ）を選択することができます。
Endurance Storageの特徴の１つは、なんと言ってもsnapshotとreplication機能でしょう。ただし、このsnapshot機能は、今までスケジュールベース（hourlyもしくはdailyもしくはweekly）でしか選択できず、自分の好きなタイミングでsnapshotを取れなかったため使いにくいという声もありました。
今回の新機能（2016/04/04付けリリース）はこの制約を補完する機能であり、自分の好きなタイミングでsnapshotを取得することができます。

#2. Customer Portalからの実行方法

Actions -> Take Manual Snapshotを実行するか、直接Take Manual Snapshotのアイコンを実行する。
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/05c08135-c043-064f-b4f3-ec9814c93ba9.jpeg)


#3. APIからの実行方法
API実行時には、Endurance StorageのIDを知っておく必要があるが、実はそれはURLから簡単に分かる。上述のケースだと、該当のEndurance StorageのURLが`https://control.softlayer.com/storage/block/4550753/endurance`になっているので、ID=4550753が対象のEndurance Storageということが分かる。そこで、以下のようにidを指定して`client['Network_Storage'].createSnapshot`を実行する。

```py:createManualSnapshot.py
import SoftLayer
client = SoftLayer.create_client_from_env()
client['Network_Storage'].createSnapshot('This is manual snapshot', id=4550753)
```

その結果、ポータルに以下のように出力される。
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/651d2900-eb9f-efc4-b46c-1d9434165a01.jpeg)



#4. その他注意点
- snapshotはほぼ一瞬で実効可能。
- 取得間隔は最低でも一分以上開ける必要がある。一分以上開けないと、API実行時に、`SoftLayer.exceptions.SoftLayerAPIError:　SoftLayerAPIError(SoftLayer_Exception_Public): Snapshot already exists. Please wait one minute between creating snapshots.`というエラーが発生する。
HTML,CSS #11 〜応用:menuの中央配置〜

本日の勉強。

##**進度**##
ホームページ作成練習




##**メモ**##
###`menu`が中央配置にならない###
前回書きました、`margin:0 auto;`でmenuが中央配置にならない件です。
問題は`width`を%で指定していたせいでした。
調べたなかでは要素を中央配置にする方法は4つありました。

1.`width`を`600px`で指定してみました。
`margin:0 atuo;`でも中央配置になりました。しかしページを伸縮させると偏ってしまいました。

2.`position`を使う方法。
こちらはどうやらもっと上の要素で`position`を使っていたせいか、レイアウトが崩れまくってしまいました。

3.全てを%で設定し、さらに`li`の親要素を`padding`で調節すると中央に寄っていく方法。
これで見事に中央配置になりました。

4.text-align:center;
これが意外だったのですが、親要素で`text-align:center;`を指定し、中の要素を`display:inline-block;`にします。
ただ、なかなか上手く出来ないのでもう少し検証して見ようと思います。


色々やり過ぎてこんがらかってきたので本日は以上です。
Bitbucket事始め

Bitbucketにアカウントを作る。

SSHキーを生成する。

```bash:GitBashにて
$ ssh-keygen -t rsa -C "メールアドレス"

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa):
★ここでファイル名だけ入力するとカレントディレクトリに生成されるので、あとで上記ディレクトリに移動すること。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

.ssh/config ファイルを作って、以下を追記する。

```:.ssh/config
Host bitbucket.org
 IdentityFile ~/.ssh/xxxxxxxx_rsa
```

##### BitBucketのSettingsのSSHキーで公開鍵を追加する
右上のユーザーアイコンをクリック ⇒ アカウントの管理 ⇒ セキュリティ『SSHキー』をクリック。
あとは画面の指示に従っていけばOK。

##### 接続してみる。

```bash:GitBashにて
$ ssh -T git@bitbucket.org
```

Bitbucketにリポジトリを作成する。※GUIで簡単にできるので省略

ローカルのリポジトリをpushする。

```bash:GitBashにて
$ cd ローカルリポジトリのディレクトリ

remoteリポジトリを登録する。（originの部分は必要に応じて変更）
$ git remote add origin git@bitbucket.org:xxx/xxxxxxxx.git

確認する。
$ git remote -v 
origin  git@bitbucket.org:xxx/xxxxxxxx.git (fetch)
origin  git@bitbucket.org:xxx/xxxxxxxx.git (push)

すべてのbranchをpushするなら
$ git push origin --all

masterだけをpushするなら
$ git push origin master

tagは別途pushする。（必要なら）
$ git push origin --tags
```
Bitbucketからリポジトリをcloneする。

```bash:GitBashにて
$ git clone git@bitbucket.org:xxx/xxxxxxxx.git
```
※このコマンド文字列はBitbucketのリポジトリ概要ページのAction⇒Cloneから取得出来る。

## その他

#### ssh keyのパスフレーズを解除

```bash:GitBashにて
$ ssh-keygen -p -f /c/Users/xxx/.ssh/xxxxxxxx_rsa
Enter old passphrase:
Key has comment '/c/Users/xxx/.ssh/xxxxxxxx_rsa'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
```

#### リポジトリごとにssh鍵を切り替える

host名のエイリアス⇔「実ホスト名＋鍵ファイル」
のセットを定義する。

```:.ssh/config
Host bitbucket.org
 IdentityFile ~/.ssh/business_rsa
 
Host bitbucket-private.org           ← エイリアス（git remote で設定する名前）
 HostName        bitbucket.org       ← 実ホスト名
 IdentityFile ~/.ssh/private_rsa     ← 上のとは違うkeyを指定している
```

そして、`git add`時にエイリアスを指定する。

```bash
$ remote add origin git@bitbucket-private.org:xxx/xxxxxx.git
                        ~~~~~~~~~~~~~~~~~
```

[リポジトリ毎にSSH鍵を指定する](http://yanor.net/wiki/?Git%2F%E8%A8%AD%E5%AE%9A%2F%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E6%AF%8E%E3%81%ABSSH%E9%8D%B5%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)
[~/.ssh/config で簡単に複数ホストへのSSH接続を管理する](http://superbrothers.hatenablog.com/entry/20090730/1248971671)
JRubyでもらくらくSAT：prop_logic-sat4j

以前からRuby上で命題論理やSATを実装する[`prop_logic`](https://github.com/jkr2255/prop_logic)というgemの開発を続けていますが（[参考記事](http://qiita.com/jkr_2255/items/3330e62ae28662fd769d)）、今回はその`prop_logic`をJRuby上で高速実行するためのgemを作ってみました。

# Why JRuby?
`prop_logic`については、すでにCRuby用にMiniSatソルバーへのバインディング（[jkr2255/prop_logic-minisat](https://github.com/jkr2255/prop_logic-minisat)）も作っています。そして、JRuby版を作るに当たって使った[Sat4j](http://www.sat4j.org/)ソルバーは、公式にも「MiniSatの4倍ちょっと時間がかかる」と言っています。それでは、なぜわざわざSat4jを使ってJRuby版を作ったのでしょうか。

じつは、`prop_logic-minisat`では、MiniSatとのバインディング部分に既存のgemである[`ruby-minisat`](https://github.com/mame/ruby-minisat)を使っています。そして、使い込んでいく過程で「もう少し細かくMiniSatを制御したい」となったのですが、`ruby-minisat`は、C++で書かれたMiniSatをRubyから使うために、C++ ⇔ Cのラッパー層 ⇔ Rubyというような、複雑な構造となっていました。そして、Cエクステンション自体もどう書けばいいのかよくわからず、簡単には手を出せないのが実情です。

それと比べてみれば、[JRubyからJavaのクラスを呼ぶのは容易にできる](http://qiita.com/jkr_2255/items/33b1eb1b2d4099ca1c67)ので、「SATソルバーを細かく制御する」ことができそうだ、というのがJRuby版を作ろうと思った理由です[^1]。

# インストール
`prop_logic-minisat`と同様、SATエンジンを置き換えるだけのプラグインなので、`gem install prop_logic-sat4j` & `require 'prop_logic/sat4j'`とするだけで、`PropLogic`のメソッドやクラスはそのまま使えます（[数独の例](http://qiita.com/jkr_2255/items/3330e62ae28662fd769d)もそこさえ書き換えれば動きます）。

## C/J両用
そんなことをしたい人はあまりいないとは思いますが、書き方を工夫すれば「CRubyではMiniSatで、JRubyではSat4jで」動かすこともできます。

```rb:Gemfile
# platforms: で仕分ける
gem 'prop_logic-minisat', '>= 0.2.0', platforms: :ruby
gem 'prop_logic-sat4j', github: 'jkr2255/prop_logic-sat4j', platforms: :jruby
```

```rb:単体のRubyファイルで分ける場合
if defined?(JRUBY_VERSION)
    require 'prop_logic/sat4j'
else
    require 'prop_logic/minisat'
end
```

[^1]: 実際、ソルバーの呼び方の工夫で、4倍遅いはずのSat4j版で、MiniSat版と同等の速度が出た、という例も確認しています。
wscatを使う


今回はcommand lineでWebSocketを扱える[wscat](https://github.com/websockets/wscat "wscat")を試してみたのでメモっておきます


##dockerコンテナ立ち上げ

```
docker run --rm -it -p 8080:8080 --name wscat-test takashioshikawa/php5.6.17
```

##作業ディレクトリ作成

```
mkdir /src && cd /src
```

##WebSocketテストをダウンロード

```
wget https://github.com/TakashiOshikawa/ratchet-test/archive/master.zip
```

解凍

```
unzip master.zip
```

```
cd ratchet-test-master/
```


##node.jsとnpmのインストール

参考はこちら[centos + node.js + npm + nvm インストール]("http://qiita.com/akippiko/items/3708016fc43da088021c" centos + node.js + npm + nvm インストール)

```
yum install -y epel-release
yum install -y nodejs
yum install -y npm --enablerepo=epel
```


##wscatのインストール

```
npm install -g wscat
```


##WebSocketアプリの起動とwscatでの接続

WebSocketアプリをバックグラウンドで実行

```
php bin/chat-server.php &
```

wscatで接続

```
wscat -c localhost:8080/chat
```


こんな感じの文字が出たらOK

```
[root@ec5ce01ae845 ratchet-test-master]# wscat -c localhost:8080/chat
New connection! (58)
connected (press CTRL+C to quit)
> dd
Connection 58 sending message "dd" to 0 other connections
> aa
Connection 58 sending message "aa" to 0 other connections
>
```
技術ドキュメントにもCIを~「ドキュメント作成システム構築ガイド」を読んで ~

[ドキュメント作成システム構築ガイド](http://www.amazon.co.jp/GitHub-RedPen-Asciidoctor-CI/dp/477418036X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=) を読み終えたので、その感想です。GitHubとCIサービスの組み合わせ方、gitやmarkdownの初歩的な使い方も丁寧に書かれているので、意外と新人向きの書籍かもしれません。

発売前に、[エクセルで手順書を作るのはきっとやめた方がいい](http://qiita.com/n_slender/items/2b237c17605372a4b845)という自分の投稿に、その解決策としてCIに沿ったライティングの情報を追加したのですが、それが[著者のお一人の目に留まったらしく](http://atl.recruit-tech.co.jp/blog/3940/)、なんだか恐縮です。

# 概要

ソースコードの品質を高めるために、継続的インテグレーション(CI)が導入されてきたように、ドキュメントに対してもそれをやろうというものです。そのために

* バージョン管理システム(Git)
* Gitで差分が見やすい軽量マークアップ言語(markdown,asciidocなど)
* 文章を校正するためのツール(RedPen,textlintなど)
* PDFやHTMLなどに出力するためのツール(Asciidoctor)
* CIサービス(TravisCI,CircleCIなど)

を導入します。

1部では、gitの使い方、markdownの記法、GitHubでのプルリクエストとレビューのやり方、RedPenの使い方をとりあげています。2部では、より表現力のあるAsciidocの使い方と、それをTravisCIでRedPenでのチェック、htmlとpdfの出力を自動化するやり方をとりあげています。

# ソースコードでのCI

Javaのプロジェクトで、次のようなCircleCIを使って、次のようなものを作ったことがあります。

* GitHubでプルリクエスト作成+コードレビュー
* JUnitでテストコード実行
* findbugsで静的解析
* テストのカバレッジなどのレポート作成

コードの静的解析とドキュメントの校正が、同じ立ち位置といえます。プロジェクトにはよっては、jarなどの実行ファイルの作成をすることもあり、それがドキュメントで言えば指定のフォーマットでの出力に対応しているでしょう。

# まとめ

CIを使ったソフトウェア開発を経験したことがあれば、ドキュメントにどう適用するかはイメージしやすいと思います。そのためのツールの一例を知るにはこの本はとっつきやすいでしょう。

また、そもそもCIの経験がない人にとっては、仕組み作りの手本にもなるのでおすすめです。どういうものが自動化できるかを知れば、自分の仕事でどこかが自動化したいのか、できるのかというのが見えてくると思います。

一昔前であれば、ドキュメントならwordやexcelで作るものだったかもしれませんが、markdownやasciidocなどの選択肢がでてきているので、そういったやり方にとらわれる必要はないでしょう。できそうなところから、markdownでドキュメントをつくったり、gitのバージョン管理を組み合わせてみたりすると、これから先を生き抜くための基礎スキルが身につくのでは。

# 参考サイト

http://msyksphinz.hatenablog.com/entry/2016/04/03/020405
Data Binding ライブラリと Espresso の組み合わせで Instrumented tests 中に予期せず落ちることがある問題の対応 (workaround)

[Data binding ライブラリ](http://developer.android.com/intl/ja/tools/data-binding/guide.html)を使っている Android アプリを [Espresso](http://developer.android.com/intl/ja/tools/testing-support-library/index.html#Espresso) と組み合わせて (?) instrumented tests (`./gradlew connectedAndroidTest`) を実行すると、以下のような例外でテストに失敗することがある。

> java.lang.ClassCastException: java.lang.String cannot be cast to &lt;our.app.DataBindingType>

## 発生する問題

私が実際に遭遇したのは以下のようなエラー。

```
your.app.package.id.TargetActivityTest > yourTestMethodName[Nexus 5 - 6.0.1] FAILED
        java.lang.RuntimeException: Unable to start activity ComponentInfo{your.app.package.id/your.app.package.id.TargetActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to your.app.package.id.databinding.ActivityTargetBinding
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)

Tests on Nexus 5 - 6.0.1 failed: Instrumentation run failed due to 'java.lang.ClassCastException'
:app:connectedDebugAndroidTest FAILED
```

## 報告

以下で報告されている。

- [Issue 182715: Data Binding & Espresso: IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation - Android Open Source Project - Issue Tracker - Google Project Hosting](https://code.google.com/p/android/issues/detail?id=182715)
- [Espresso test fails with java.lang.String cannot be cast to com.abc.events.databinding.SponsorDetailBinding](http://stackoverflow.com/questions/33890393/espresso-test-fails-with-java-lang-string-cannot-be-cast-to-com-abc-events-datab - Stack Overflow)

私は遭遇していないのだけれど、以下のようなエラーが出ることもある模様。

```
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
    at android.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:31)
    at com.espresso.databinding.MainActivity.onCreate(MainActivity.java:15)
```

## 対応

上記ページに workaround が書かれていた。 どうやら Data Binding のためのタスクが `androidTest` 向けにも動いていて、それが原因でおかしくなってるぽい。

上記ページの workaround をもとに、以下のようなコードを build.gradle に書いてとりあえず回避した。

```groovy
project.afterEvaluate {
    def targetTasks = tasks.findAll({ it.name ==~ /\AdataBindingExportBuildInfo.*AndroidTest\z/ }).each {
        it.deleteAllActions()
    }
    // 将来予期せず動作しなくなるなどしたときのために例外を投げる。
    if (targetTasks.empty) throw new RuntimeException('対象となるタスクが存在しませんでした。 ' +
            'Data binding と Espresso の組み合わせのための workaround が不要になった可能性があります。 ' +
            'ビルドスクリプトを見直してください。')
}
```

`dataBindingExportBuildInfoDebugAndroidTest` や `dataBindingExportBuildInfoReleaseAndroidTest` といったタスクの処理を全部無くしてしまうというもの。

将来タスク名が変更されたりして workaround のコードが動かなくなったときに気付くように例外を投げるようにしておいた。
Macのターミナルでbase64のエンコード／デコードをする方法

Macのターミナルだけで、base64のファイルをエンコード／デコードする方法。

SAMLResponseなどを確認する際にサクッと使えたのが便利だったのでメモしておく。

## エンコード
```bash:Command
$ openssl base64 -in <SOURCE_FILE_NAME> -out <OUT_FILE_NAME>
```

## デコード
```bash:Command
$ openssl base64 -d -in <SOURCE_FILE_NAME> -out <OUT_FILE_NAME>
```

以上
svn: warning: cannot set LC_CTYPE localeとかで怒られる件

これ

```bash
svn: warning: cannot set LC_CTYPE locale
svn: warning: environment variable LC_CTYPE is UTF-8
svn: warning: please check that your locale name is correct
```

未だに原因がよく分かってないから対処法だけ。

```bash
$ echo 'export LC_CTYPE=en_US.utf8' >> ~/.zshrc
$ source ~/.zshrc
```

ロケールの名前がUTF-8とutf8で異なってるのかな？
python入門 - 環境準備(mac編)


## まずはpyenvをインストール

#### pyenvとは

pythonのバージョン管理ツールです。
複数のバージョンを切り替えて使えたりするので便利です。

PHPで言う所のphpenv.rubyのrbenvと一緒です。

[pyenv](https://github.com/yyuu/pyenv)


#### install

homebrewを使ってインストール。

```
$ brew install pyenv
...
...
色々でます
...
...
$ pyenv --version
pyenv 20151006
```

### Pythonのインストール

pyenvでインストール可能なPythonのバージョン一覧を確認してみます。

```
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  ...
  中略... 
  ...
```

とりあえず、 ２系と3系を入れときます。

インストールするには、↓のように、 `pyenv install x.x.x` とバージョンを指定するだけでOKです。

* 2.7.9のインストール

```
$ pyenv install 2.7.9

...
中略
...

Installed Python-2.7.9 to /Users/riki/.pyenv/versions/2.7.9
```

* 3.5.0のインストール

```
$ pyenv install 3.5.0

...
中略
...

Installed Python-3.5.0 to /Users/riki/.pyenv/versions/3.5.0
```

### 使うPythonのバージョンを変更する

試しに、今どのバージョンなのか見てみます。

```
$ python --version
2.7.10
```

これはデフォルトのバージョンです。
pyenvでインストールしたバージョンは、ちゃんと指定してあげる必要があります。

```
# 使えるバージョンを確認してみる
$ pyenv versions
* system (set by /Users/riki/.python-version)
  2.7.9
  3.5.0 

# 使うバージョンを指定
$ pyenv local 3.5.0
$ pyenv rehash
$ python --version
Python 3.5.0
```

これで `3.5.0` を使えるようになりました。
Java OpenCVのkmeansを使って減色

#Java OpenCvのkmeansを使って減色
画像処理で減色しようと思い、k-means法を利用したときハマったのでメモ。
参考：[減色処理：Core.kmeans](http://opencv.blog.jp/java/kmeans)

##目的
参考サイト見ながら減色処理しようとしたけど、期待する画像が出力されない・・・。
下サイトでやってるような処理結果が欲しい！
[k-meansクラスタリングによる画像分割，減色](http://opencv.jp/opencv2-x-samples/k-means_clustering)

##方法・コード
BGR画像をk-meansで減色して、出力されるようコードを編集しました。

```java:cluster
	public static Mat cluster(Mat cutout, int k) {
		Mat samples = cutout.reshape(1, cutout.cols() * cutout.rows());
		Mat samples32f = new Mat();
		samples.convertTo(samples32f, CvType.CV_32F, 1.0 / 255.0);

		Mat labels = new Mat();
		TermCriteria criteria = new TermCriteria(TermCriteria.COUNT, 100, 1);
		Mat centers = new Mat();
		Core.kmeans(samples32f, k, labels, criteria, 1, Core.KMEANS_PP_CENTERS, centers);		
		
		centers.convertTo(centers, CvType.CV_8UC1, 255.0);
		centers.reshape(3);
		
		Mat dst = cutout.clone();
		int rows = 0;
		for(int y = 0; y < cutout.rows(); y++) {
			for(int x = 0; x < cutout.cols(); x++) {
				int label = (int)labels.get(rows, 0)[0];
				int r = (int)centers.get(label, 2)[0];
				int g = (int)centers.get(label, 1)[0];
				int b = (int)centers.get(label, 0)[0];
				dst.put(y, x, b,g,r);
				rows++;
			}
		}
		return dst;
	}
```

##結果
![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/118314/7c9a2ab7-564c-9ee5-2e08-bc78fa70914d.jpeg)

いいね！

以上！
Android studioでコード補完候補の自動表示が効かなくなった件の対処

　とても初歩的ですが、以前AndroidStudioで急にコード補完候補の自動表示がされなくなりハマッた経験があるため対処法をメモします。同じことでハマッてる人の役に立てばと思います。

#1.現象
 通常であれば以下のように、コードを少し打てば、補完候補をすぐに表示される。
![スクショ.png](https://qiita-image-store.s3.amazonaws.com/0/102567/ec118a53-d9ff-049d-220e-48174f218e79.png)

これが表示されなくなった。

#2.対処
「Power Save Mode」になっていなかったのが原因。これをAndroidStudio画面で「ファイル」->「Power Save Mode」をクリックして以下のようにチェックを外します。
![s.png](https://qiita-image-store.s3.amazonaws.com/0/102567/1fa480e2-05e7-8c5f-f6dc-775bb28de170.png)

#3.結果
表示してくれるようになった。

逆にコード補完候補表示がうっとおしいという方はチェックを入れるといいかもしれません。
Node学園 20時限目

# イベント概要
http://eventdots.jp/event/584880

# ESLint Past and Future
@mysticatea
ナガシマさん
ESLintのレビュワー
ES2015のルール半分ぐらい作った人

## なぜ作られた？
2013年の夏頃から作られだした
拡張性のある静的解析ツールが欲しかった
JSHintのプラグイン機能の追加がうまくいかなかった

## なぜ人気になった？
- より良い検証ができる
 - プラグイン追加 
- 開発者が貢献するのが簡単
 - 充実したコントリビューション・ガイド
 - 各ルールが疎結合であるため、興味のあるルールだけ読めばOKという手軽さ
 - エコシステムとコミュニティを育てる 
- ES2015のブームに乗った
 - babelと連携できた
- Reactのブームに乗った

## 開発体制は？
１２人
- 機能はレビュワー以上が確認
- バグはコミッター以上が確認
- masterブランチのみで開発
 - 古いバージョンのメンテは今はしていない

## サポート体制は？
- github
- chatroom
- stack overflow
- twitter

裏話

## どんな機能がある？
- ES2016(ES7)までの全構文とJSXをサポート
- 209の組み込みルール
- Auto fixing eslint --fix
- npm経由で設定を共有
- プラグイン
- ローカルだけのカスタムルール
- ラッパーツールも出てる

## 3.0.0の紹介
未確定情報含む
- Stage4に到達した構文のサポート
- より多くのルールでAuto Fixing
- より良いエディタ連携
- Globベースの設定ファイル
 - かなり破壊的変更
- よりよいカスタム・パーサAPI
 - for babel-eslint
- よりよいスタイル・ルール
 - 各ルールが完全に独立しているので統一感がない
- TypeScriptサポート
- Node 0.xサポート終了
 - このリストの中で唯一の確定事項

# client side of ■■■■■fresh.tv
[資料](http://s.aho.mu/160405-node_school/)
@ahomu 
サイバーエージェント
frontendweekly.tokyo
フロントエンド関連のメールマガジン

## fresh
生放送配信プラットホーム
コメントがsocket.io、放送はHLS

2015年春ごろから開発スタート
Webクライアント開発者４～５人
nginx -> node -> api(golang)
nodeはフロントエンド専用(サーバサイドレンダリング)

## ssr
２重テンプレート回避
コンテンツ表示の高速化
JSのみでレンダリングする事のペナルティが少なくない
Isomorphicなパーツ選び（ブログに記載あり）

- レンダリング、ルーティング、データローディング
- データローディングだけはサーバとクライアントでリクエストの中身は変わる

### Flux周辺の雰囲気
スマートUI
他のコンポーネントと児湯有しないUIはstate使う
Contextでpropsのバケツリレー回避

## spa
メリット

- なんとなく画面遷移が早くなる
- URLをまたいだ表現が可能になうｒ

デメリット

- ブラウザのナビゲーションを破壊してしまう

### 本当にSPAにするべきなのか？
リンクを押してページ遷移してくようなUIだったらSPAにするよりも今までの方法のほうがよい
Webアプリ的な１つのURLに留まって一部のみを変えていくようなアプリはSPA向き
ブラウザナビゲーションおｗ破壊するなら責任持って実装するべき

PinPが要件にあったからSPAで実装した

- ルーティングのあとに画面更新
 - 画面遷移の開始とともに画面真っ白とかはNG
- ルーチングのあとにスクロール
- ブラウザバックは即座に表示 

## components
Page
Project
UI
Utils

### 設計心得
- 単機能の組み合わせ
- 再利用性の程度を明確にすること
- 規模に応じた簡潔なレイヤリングを持つこと
 - 細かすぎてもざっくりすぎても困る
 - atomic design

## まとめ
- SSR最高
- SPA向き不向きがある
- コンポーネントの設計だいじ

# ピザ
お皿がなくなるハプニング

# Vue.js
Vue.jsの歴史
Laravel(PHP関連)

# NodeBotsの話
nObisuke
LIG
Milkcocoaエバンジェリスト

- konashi.js
- MESH
- noble
- sphero.js
- gpio
- cylon.js
- johnny-five.io
- nodeshool
 - nodebot workshop
- Tessel2
- freeboard
 - データビジュアライズツール

# option-tでエラーハンドリング
@saneyuki

エラーの話。ちゃんとハンドリングしよう。

# OracleがNode.jsをやり始めたというのだが！
@charlier_shoe

## Oracle Node Cloud

- Application Container Cloud
- Java SE、Node.jsがリリース
- Ruby、python、PHPサポート予定

Zipにかためてデプロイ(REST APIあり)
あとからスケールアウト、スケールアップ可能(REST APIあり)
無料で６０日

## Jet
Javascript Extension Toolkit

5種類のOSSとOracleのソース
はじめてのオラクル「発」のOSS

# ひたすら楽してディープラーニング
https://speakerdeck.com/yujiosaka/hitasurale-sitedeipuraningu

はじパタ本
kaggle
ひたすら楽してFF6
Python->CoffeeScript->ES2015

# noble
力尽きた
おびえながらLinuxサーバのIPアドレス変更した際のメモ

サーバのIPアドレスの第3オクテットが変更になるから対応してくれと言われ、びくびくしながら作業してなんとか完了したので、次回びくびくしないための備忘録。

1. 作業依頼
-----
今回IPアドレス以外にも、DNSなどの変更も必要なようでした。
変更作業依頼として下記項目が挙げられていました。

- IPアドレス
- ゲートウェイ
- DNS(プライマリ)
- DNS(セカンダリ)

今回は上記4項目について設定を変更しました。

便宜上変更前の設定と変更依頼の内容を下記のように定義します。

- 変更前
    - IPアドレス : 123.45.66.890
    - ゲートウェイ : 123.45.66.089
    - DNS(プライマリ) : 123.45.12.908
- 変更依頼
    - IPアドレス : 123.45.67.890
    - ゲートウェイ : 123.45.67.089
    - DNS(プライマリ) : 123.45.13.900

2. 設定の変更
-----
事前調査で、変更が必要そうなファイルを調べていたので、まずバックアップを取っておくことから始めます。/home/work/の配下に作業日付のフォルダが複数作成されていたので、先人を習ってこのディレクトリ配下にバックアップを取得しておきます。

```bash:バックアップ
cd /home/work/
mkdir yyyymmdd(※作業日付)
cd yyyymmdd/
sudo cp -ip /etc/sysconfig/network-scripts/ifcfg-eth0 .
sudo cp -ip /etc/resolv.conf .
sudo cp -ip /etc/hosts .
sudo cp -ip /etc/sysconfig/network .
```

では、まずifcfg-eth0から修正します。
※インターフェイスの設定ファイルです

```bash:ifcfg-eth0(開く)
vim /etc/sysconfig/network-scripts/ifcfg-eth0
```

```bash:ifcfg-eth0(修正)
DEVICE=eth0
BOOTPROTO=static
BROADCAST=123.45.67.255（第3オクテットのみ修正）
HWADDR=XX:XX:XX:XX:XX:XX
IPADDR=123.45.67.890（IPアドレス）
NETMASK=255.255.255.0
NETWORK=123.45.67.0（第3オクテットのみ修正）
ONBOOT=yes
```
ここにGATEWAYが書かれている場合もあるので、設定があれば適宜書きなおしてください。
また、ブリッジの設定が書かれている場合は/etc/sysconfig/network-scripts/ifcfg-br0 の修正も必要になります。

```bash:
BRIDGE=br0（ブリッジの設定）
```

次にresolv.confを修正します。
※DNSのIPを設定するファイルです

```bash:resolv.conf(開く)
vim /etc/resolv.conf
```

```bash:resolv.conf(修正)
nameserver 123.45.13.900（DNS(プライマリ)）
```

続いてhostsを修正します。
※ホスト名とIPアドレスとの対応表のようなものです

```bash:hosts(開く)
vim /etc/hosts
```

```bash:hosts(修正)
123.45.67.890 example（IPアドレス）
```

最後にnetworkを修正します。
※ホスト名の設定等をするファイルです

```bash:network(開く)
vim /etc/sysconfig/network
```

```bash:network(修正)
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=example
GATEWAY=123.45.67.089（ゲートウェイ）
```

3. 物理ケーブルの差し替え
-----
「えいやっ」と差し替えました。

4. 設定の反映
-----
調べるのが面倒くさくて、rebootしたら設定反映されるだろうとたかをくくり適当にサーバを再起動しました。結果反映されませんでした。。
色々設定を見直したり、コマンド入力したりしましたが、下記1行コードでいけました。

```bash:command
service network restart
```

上記コマンドだと関係ないnicまでこけたりするそうなので、下記のようなコマンドにした方がいいという話もありました。

```bash:command
ifdown eth0
ifup eth0
```

引用元：[IP変更のときはservice network restartはやめよう](http://rksz.hateblo.jp/entry/2013/02/15_do_not_restart_network)

5. おまけ
-----
networkをリスタートした後下記コマンドを入力すると、現在のIPの設定が表示されます。

```bash:command
/sbin/ifconfig
```

ブリッジが設定されている場合は、このコマンドで設定が表示されます。
iOSアプリのIn Reviewまでの日にちを表示させる、BitBarのPluginを作りました


![title.png](https://qiita-image-store.s3.amazonaws.com/0/25250/8dc0cd04-e04a-6fd0-9009-8f41e0762b5a.png "title.png")


## BitBarとは

Macのメニューバーに色々表示してくれるアプリです。
[公式ページ](https://getbitbar.com/)のスクリーンショットがわかりやすいでしょうか。

![bitbar.png](https://qiita-image-store.s3.amazonaws.com/0/25250/41e28d3d-0f3d-ee74-a577-7628df0b3a01.png "bitbar.png")

この様に、メニューバーにテキスト（絵文字）を表示させてくれる、Macアプリです。


## プラグイン

[公式ページ](https://getbitbar.com/)にプラグイン一覧があり、そこからインストｰルもできるようになっています。また、[Github](https://github.com/matryer/bitbar-plugins)にもソースが公開されていて、既存のモノを自分でカスタマイズして使う事もできます。

## インストール方法

[こちらから](https://github.com/matryer/bitbar/releases/)最新版のバイナリをダウンロードするか、[Homebrew](http://brew.sh/)を使っても、インストールすることができます。


## Contribution

BitBar本体もオープンソースとなっており、[Github](https://github.com/matryer/bitbar/)上でホスティングされています。また、[プラグイン作成の仕方](https://github.com/matryer/bitbar#writing-plugins)が詳しくありますので、ご覧いただければすぐにでも始める事ができるかと思います。うれしい事に、標準出力で表示する機構な為、好きな言語で開発することができます。

## 作ったモノ

今回は、雑にiOSアプリのIn Reviewまでの日にちが知りたいと思ったので、iOS開発者におなじみの[http://appreviewtimes.com/](http://appreviewtimes.com/)から、In Reviewまでの日にちスクレイピングして表示するプラグインを作ってみました。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/25250/785a5e9d-06e0-6334-1725-5adbb732cf40.png "01.png")


## 感想

色々表示させていると狭くなってしまうので、[Rebuild.fm](http://rebuild.fm/132a/)のエピソードで話題になっていた、[Bartender 2](https://www.macbartender.com/)というアプリをいれてみました。Pluginを色々入れると、メニューバーのスペースが足りなくなってしまうので、大変重宝しています。(有償ですが、１ヶ月のお試し期間があります。)
幸いにも、今回[公式のPluginのリポジトリ](https://github.com/matryer/bitbar-plugins/tree/master/Dev/AppStore)に取り込んでいただき、[Web](https://getbitbar.com/plugins/Dev/AppStore/average_app_store_review_times.1h.rb)上からでもインストールすることができますので、もしよろしければ是非お使い下さいませ。元の[リポジトリ](https://github.com/mfks17/bitbar-plugin-AppStore)はこちらです。
 
また、便利なプラグインがあれば、ご教示していただければ幸いです。
ちなみに、自分はこのプラグインの他に、[HackerNews](https://getbitbar.com/plugins/Web/HackerNews/hacker_news.rb)、[Xode](https://getbitbar.com/plugins/Dev/Xcode/xcode-version.1h.sh)、自作のGithub Trending ~~(未公開)~~ を表示する[プラグイン](https://github.com/mfks17/bitbar-plugin-github-trending)を使っています。[^1]こんな感じです。

![menu.png](https://qiita-image-store.s3.amazonaws.com/0/25250/0ecaffff-0c7c-04e4-6000-2d11f90b252e.png "menu.png")


では皆さんも、BitBarで Happy Hacking!!:rocket::rocket::rocket:


## 謝辞
- [MacOSXのメニューバーに定期実行したスクリプトの標準出力を出せるBitBarが地味に便利](http://qiita.com/LOUIS_rui/items/222327202e523213691f)

- [BitBarでRedmineのプラグインを作りました](http://qiita.com/hikouki/items/f0bcaabd46b0e26acbe6)

- [小ネタ gitbarを使って、mac osでGitHubへのコントリビューションステータスを表示する](http://qiita.com/letusfly85/items/53f1d5edb5bd26d02122)

- [BitBar と Togoo を連携して残タスク数をメニューバーに表示してみた](http://kakakakakku.hatenablog.com/entry/2016/03/15/231045)

- [bitbarでtrelloの特定ボード、特定リストの先頭を表示するってやつ](http://hkdnet.hatenablog.com/entry/2016/03/16/093007)

## 追記

2016/05/07

- Github Trendingを見るプラグインへのリンク追加

[^1]: 別記事にしました。　[Githubの好きな言語のトレンドリポジトリを表示させる、BitBarのPluginを作りました](http://qiita.com/mfks17/items/6803b338a6da8b91a666)