OmniAICreator/Qiita-1.07M huggingface dataset:
第8回Jenkins勉強会に参加させて頂きました！

2013/12/20にJenkin勉強会に参加させて頂いたので、その時のメモを残します。
発表を聞かせて頂いた方々、ありがとうございました。


##概要
* 日時：12/20 (金) 19:00~21:00
* 会場：ヤフー株式会社 11F セミナールーム
* 参加枠：250名

## 発表テーマ
### 通常発表
* 川口さん：「2013年Jenkinsの歩み」
* ヤフー 石川さん：Jenkinsはじめました。 ～Yahoo! JapanのCI/CD～
* 株式会社シフト 玉川さん：Jenkinsエンタープライズについて

### LT発表
* @akiko_pusu さん：『おひとりさま〜』の1年後。〜発表者のその後を語る〜 
* @superbrothers さん：Jenkins with Docker

## 発表内容
## 1. 川口さん：「2013年Jenkinsの歩み」


### コミュニティの活動報告
* 2004年に1人で始めたJenkin開発も今では1090人がコミッター
  * 1090人が平均20のコミット
  * 1日に平均で62のコミットがある
  * コミット数はLinuxカーネルの約半分まで来た(Linuxカーネルが約5万コミット)
  * GoogleやMicrosoftでもやってくれている
  * 1年間でユーザー数は45％アップ
  * Jenkinの計算資源として18万2千のスレーブが稼働
  * 世界で250万のJobが動いている

### 大きく変わったところ
* 内部のエンジンが変わった
  * Winstone→jetty://
* クレデンシャルプラグインを開発した
  * それぞれのプラグインで認証情報を持つ必要がなくなった
  * セキュリティの向上
* gitプラグインのバージョン2をリリースした
  * バージョン1では、設定画面が複雑になり過ぎたのでシンプルにした
  * バージョン1にある機能を使うことは出来る
* 文芸的ビルド機能の追加
  * README.mdに記述した内容をJenkinsが認識してビルドを行う
  * リポジトリURLを指定する
  * ブランチが増えれば、増えたブランチのビルドも自動で行う
* システム資源を有効活用できるように改善
  * SlaveとMasterのデータのやり取りを改善

### その他
 * ユーザー会の人がアジャイルアカデミーに参加してトレーニングを実施した

## 2. ヤフー 石川さん：Jenkinsはじめました。 ～Yahoo! JapanのCI/CD～

### 自己紹介
* 広告配信システムのCIを担当
* 2人＋Jenkinsで広告配信システムを運用

### 運用構成
* 構成管理
  * GitHubエンタープライズ
* Jenkins
  * マスター3台
  * スレイブをマスター1台につき10台
  * Job数は約300
    * Job実行時間は30秒〜1時間と様々

### 道のり
* 数名の有志によりボトムアップでスタート
* 管理職の理解や協力を得ながら進めた
* 1Clickでデプロイまで出来るようになった
 * 2日かかっていた作業が数時間で出来るようになった

### トラブル事例と課題
* SCMポーリングでサーバーの負荷が上がってた
 * Webhookを有効活用する
 * Polling must die!
 * ただし、Webhookよりもポーリングの方が良い事もある
* slaveサーバーをたくさん用意できない
 * Jcloudsプラグインを活用する
     * vmwareと連携できる
     * 社内のセキュリティポリシーを守るために一部改修した
* OpenStackベースの社内Paasと連携
  * ビルド終了で仮想サーバー自動削除
  * クラウド側のリソース節約
* その他
 * Job増加問題
 * テストコード書けていない
 * もっと高度なデプロイに挑戦したい
 * 全社的に普及出来ていない

### 大切な事2つ
* エバンジェリストの存在
 * ボトムアップで進めるのは大変
 * 周囲を巻き込んでやれる人が必要
* ルールや議論はほどほどに
 * まずはやってみる事が重要

## 3.  株式会社シフト 玉川さん：Jenkinsエンタープライズについて

### 自己紹介
 * 会社の事業はテストの代行
 * 仕事は自動テストのなんでも屋
   * Jenkinsの導入
   * seliniumの導入
 * 日本Jenkinsユーザー会に所属

### Jenkins Enterprise by CloudBeesの紹介
* 特徴
 * サポートが受けられる
 * 独自のプラグインが使える
 * 強力な機能がある
 * Jenkinsをよく理解している人が開発した
     * Jenkinsの8割は、 CloudBeesの人達が開発
* 独自プラグインの紹介&デモ
 * 稼働率向上プラグイン
 * 大規模開発向けのプラグイン
     * Jenkins間で成果物がやり取りできるプラグイン
 * セキュリティ向上プラグイン
     * ユーザーに権限を柔軟に渡せるプラグイン
 * リソース最適化プラグイン
     * Jobの割当を最適化するプラグイン
     * 無駄なビルドを行わないようにするプラグイン

## 4. @akiko_pusu さん：『おひとりさま〜』の1年後。〜発表者のその後を語る〜 

### 1年で変わった事
 * Jenkins以外のジョブ管理ツールが登場
 
### 私がJenkinsに期待する事
 * 自動化のスタートアップ
   * Jenkinsは導入しやすい
   * やり方さえわかれば、後は何でやっても良い

## 5. @superbrothers さん：Jenkins with Docker

### Dockerとは
* 高速にコンテナを立ち上げることができるツール
  * 仮想マシンよりも軽量

### JenkinとDockerの連携
* Jobの中で、Dockerを使ってコンテナの作成、削除まで行う
 * クリーンな環境を一瞬で手に入れる事が出来る
Apache Log の HOSTごとの切り分けをconfigへベタで書くのをやめてみる。

### Apache のLogの名前について。
私はLogが大好きです。
なので、Logを破棄することってあんまりないんです。

結構システムロガーとかこだわる人多いのですが、今回の話題はApacheです。

### 思ったきっかけ
結構前から何台も何台もWEBサーバーを構築していると

* ApacheのLogをホストごとに変える
* 日付でログローテートする

って事は最低限するんですが **ApacheのLogをホストごとに変える**
って作業が超絶めんどくさい。

AWSでオートスケールとか使ったらもうアウト。

解析するときどのホストでのLogなのかわかりづらい。(俺の頭がわ… ry)

### 対処法
**Apacheの Logの名前指定に変数でホスト名を当てる。**

### 環境
* OS : CentOS 6.5
* Apache : 2.2.15 (yum install)

### やり方
Apacheくんはyum でインストールされた場合は

```
/etc/sysconfig/httpd
```
に環境変数を当てることができる。OPTIONSとか
そこに自身のホスト名を入れてあげる。
(ソースから入れたら apache2/bin/envvars がそれに当たる)

そしてLogFormat呼び出しの際にホスト名を変数してあげる。

###  具体的には

1. こんなコードを用意してあげる。(書き方は何でも良い。)

```bash
#!/bin/bash

DATE=`date`
CONFIG=/etc/sysconfig/httpd

MY_HOST=`hostname -s`
ADD_ENV='export HOSTNAME'
PUT_HOST="HOSTNAME=${MY_HOST}"

CHECK_HOST=`cat ${CONFIG} | grep "^HOSTNAME="`
CHECK_ENV=`cat ${CONFIG} | grep "${ADD_ENV}"`


MES="
APACHE に当てる HOSTNAME の重複もしくは以前のHOST情報が残っている可能性がありました。
この情報は削除され、新しい HOSTNAME へ書き換えられます。

旧情報   : ${CHECK_HOST}
新情報   : ${PUT_HOST}
実行時間 : ${DATE}

"

for hostname in ${CHECK_HOST}; do
        if [ "${CHECK_HOST}" != '' ]; then
                sed -i -e "/${hostname}/d" ${CONFIG}
                echo ${MES}
        fi;
done
echo ${PUT_HOST} >> ${CONFIG}

if [ "${CHECK_ENV}" != '' ]; then
        sed -i -e "/${ADD_ENV}/d" ${CONFIG}
fi

echo ${ADD_ENV} >> ${CONFIG}

```
※適宜自身の環境に合わせて変更必要
2. Apache に変数で指定する。

```
log/httpd/access_log.%Y%m%d.${HOSTNAME} 
```
等
3. Apache 再起動する。

以上！

### ついでに
AWSのオートスケール用のAMIや、vagrant 使ってるならboxなどの

```
/etc/rc.d/rc.local
```

にさっきのスクリプトを仕込んでおくと起動時に勝手にやってくれるから、httpdConfigに変数を仕込むだけでいい。
**※動作は個々で検証してからね！**

### 更に追記

この書式綺麗にしてくれる人募集中！
capistrano v3 で deploy_via copy するメモ

capistrano v3 で deploy_via :copy が実装されていないようなので自分でコピーするタスクを書いてみた。
粗い感じなのでそのうち直すかも。メモレベルです。

```rb:copy.cap
namespace :my do

  set :my_local_tmp_dir, ->() { "#{fetch(:tmp_dir)}/#{fetch(:application)}" }

  task :wrapper do
    run_locally do
      execute :mkdir, '-p', "#{fetch(:my_local_tmp_dir)}/"
      execute :echo, "'#!/bin/sh -e\nexec /usr/bin/ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no \"\$@\"\n'", '>', "#{fetch(:my_local_tmp_dir)}/git-ssh.sh"
      execute :chmod, '+x', "#{fetch(:my_local_tmp_dir)}/git-ssh.sh"
    end
  end

  task clone: :'my:wrapper' do
    run_locally do
      if test " [ -f #{fetch(:my_local_tmp_dir)}/#{fetch(:application)}/HEAD ] "
        info t(:mirror_exists, at: repo_path)
      else
        within "#{fetch(:my_local_tmp_dir)}" do
          with fetch(:git_environmental_variables) do
            execute :git, :clone, '--mirror', repo_url, "#{fetch(:application)}"
          end
        end
      end
    end
  end

  task update: :'my:clone' do
    run_locally do
      within "#{fetch(:my_local_tmp_dir)}/#{fetch(:application)}" do
        execute :git, :remote, :update
      end
    end
  end

  task create_release: :'my:update' do
    run_locally do
      within "#{fetch(:my_local_tmp_dir)}/#{fetch(:application)}" do
        execute :git, :archive, '--format=tar', fetch(:branch), "> #{fetch(:application)}.tar"
      end
    end
  end

  desc 'cap deploy via copy'
  task deploy: :'my:create_release' do
    tar_text = nil
    run_locally do
      tar_text = File.open("#{fetch(:my_local_tmp_dir)}/#{fetch(:application)}/#{fetch(:application)}.tar").read
    end

    on roles :all do
      execute :mkdir, '-p', "#{fetch(:tmp_dir)}/#{fetch(:application)}/"
      upload! StringIO.new(tar_text), "#{fetch(:my_local_tmp_dir)}/#{fetch(:application)}.tar"

      execute :mkdir, '-p', release_path
      execute :tar, '-xvf', "#{fetch(:my_local_tmp_dir)}/#{fetch(:application)}.tar", '-C', release_path
    end
  end
end
```
【PHP】代替構文(endswitch文)

こんにちは。
どうしても頭に代替構文が入ってこないので、メモ。

```php
<?php
$i = 1 ;

switch($i) :
    case 0 :
        echo "テスト" ;
        break ;

    case 1 : 
        echo "テスト1" ;
        break ;

    default :
        echo "default" ;
endswitch ; ?>
```

おそらく実用的な使い方は、

```php
<?php    switch($i)    ?>
<?php    case 1:   ?>
<?php    break;?>
<?php    endswitch ; ?>
```
みたく1行ずつ記載していくんだと思う。
短くて見やすさを強くするため？

if文でもいきなり

```php
<?php if ($a == 5): ?>
~~
<?php endif ; ?>
```
と出てくると難しく思えてしまう。
実際はもっと多用されているだろうから、なれなくては。

それではこれからも宜しくお願いいたします。
CONTAINERとIMAGEをまとめて削除


# CONTAINERをまとめて削除
> docker ps -a | awk '{print $1}' | xargs docker rm

# IMAGEをまとめて削除
> docker images |  awk '{print $3}' | xargs docker rmi

私のDocker環境自体vagrantで作成しているのでこれでなんの問題もありませんが、やるときは自己責任でお願いしますm(_ _)m
/var/www/html/**/*が閲覧できない

* httpdを入れて /var/www/html/hoge/fuge.html を公開しようとしたところエラーになったので、その対応方法をメモ
 * /var/www/html/fuge.htmlだと大丈夫だけど、/var/www/html/hoge/fuge.html にするとダメ
 * hoge/はホームディレクトリからmvしたもの

### 現象
* アクセスすると 403 Forbidden になる
 * httpdのerror_logを見ると

> [Mon Dec 23 21:05:44 2013] [error] [client x.x.x.x] (13)Permission denied: access to /hoge denied

## 原因
* SELinuxコンテキスト
 * ls --contextで見ると分かる

> $ ls -d --context /var/www/html/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
$ ls -d --context /var//www/html/hoge/
drwxr-xr-x. ec2-user ec2-user unconfined_u:object_r:user_home_t:s0  /var//www/html/hoge/

##  対応
* chcon によるコンテキストの変更

> $ chcon -R system_u:object_r:httpd_sys_content_t:s0  /var//www/html/hoge/

 * 手っ取り早くやるなら/var/www/html/ と同じコンテキストにしておけばとりあえず閲覧できるようになる
plenv を使う

perl 版 rbenv

https://github.com/tokuhirom/plenv

## plenv と perl-build のセットアップ

```
$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv
$ echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(plenv init -)"' >> ~/.bash_profile
$ echo 'export PATH="$HOME/.plenv/shims:$PATH"' >> ~/.bash_profile
$ git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
$ exec -l
$ plenv rehash
```

## インストール可能なバージョンの検索

```
$ plenv install -l
```

## perlのインストール
この例では centos 5.9 標準の 5.8.8 をインストールしている

```
$ plenv install 5.8.8
$ plenv rehash
$ perl --version

This is perl, v5.8.8 built for darwin-2level

Copyright 1987-2006, Larry Wall
```
処理時間の計測をAndroidで簡単に行う

Androidで処理時間の計測を簡単に行う方法が無いかと探していたら、TimingLoggerというクラスを使えば簡単に行えることが分かったので共有します。

ただし、注意が必要で、最初に以下シェルコマンドを打ってやらないと、ログは出力されません。

```
$ adb shell
# setprop log.tag.TAG_TEST VERBOSE
```

###実装方法

```java
// 測定開始
TimingLogger logger = new TimingLogger("TAG_TEST", "testTimingLogger");

// 何らかの処理１
doSomething1();

// 処理1計測終了
logger.addSplit("処理１");

// 何らかの処理2
doSomething2();

// 処理2計測終了
logger.addSplit("処理２");

// 測定終了＋ログ出力
logger.dumpToLog();
```

といった感じみたいです。

実際Logcatに出力された内容は以下の通りです。

```
12-24 10:43:58.195: D/TAG_TEST(2164): testTimingLogger: begin
12-24 10:43:58.195: D/TAG_TEST(2164): testTimingLogger:      21456 ms, 処理1
12-24 10:43:58.195: D/TAG_TEST(2164): testTimingLogger:      66216 ms, 処理2
12-24 10:43:58.195: D/TAG_TEST(2164): testTimingLogger: end, 87672 ms
```
Logcatのコマンド打つところに”tag:TAG_TEST”とたたくと、それにちなんだログだけ出力されるようフィルタリングされるようになります。

ちなみに、複数の種類のログも出力できるので、回数分Shellコマンドたたいてあげるといいみたいです。
sshdたてる時に公開鍵の入ったディレクトリのパーミッションを変えないとログインできない

http://www.pistolfly.jp/weblog/2007/02/ssh.html

クライアント側の秘密鍵が400とかになってないとこの鍵が使えない。これは「秘密鍵にアクセス出来過ぎです。」的なエラーを表示してくれるから、すぐ分かると思われる。
問題はサーバー側で、/home/userは700辺りになってると思うけど、.sshやその下のauthorized_keysのパーミッションは下2桁が00になってないと思う。変えないとログイン時にkeyがrefusedされてしまう。これはクライアント側に拒否された旨のエラーしか返らない。
/var/log/secureにパーミションエラー的なログが出ているので、まずはここを確認。
まぁその前にSELinuxを疑うのが賢明だけどな！だが、SELinux疑い過ぎると、今回のパーミションのような基本を忘れるし、次sshd建てた時とかにも忘れてる。
KobitoのプレビューフォントをRictyにする方法


[Kobito v1.8.3からプレビューに適用されるCSSを編集可能になった](http://blog.qiita.com/post/66771339379/kobito-v1-8-3-release)ので、Rictyを使うようにしてみました。コードも文章も見やすくなるのでおすすめです。
Rictyのインストールについては[font - プログラミング用フォントをMacに homebrew でインストール - Qiita [キータ]](http://qiita.com/hshimo/items/02b9882162b6f07cd85f)を参照してください。

## 設定方法

### 1. カスタムCSSを有効にする

![スクリーンショット 2013-12-24 10.02.31.png](https://qiita-image-store.s3.amazonaws.com/0/2/15d5b7b5-e87e-f5c5-83da-a4e95c507c5e.png "スクリーンショット 2013-12-24 10.02.31.png")

### 2. カスタムCSSを開いてCSSを編集

↓のCSSをそのままコピペすると適用されます。

```css
/* See Kobito.app/Contents/Resources/markdown.css for predefined style. */

body {
  font-size: 14px;
  line-height: 1.6;
  font-family: "Ricty";
}

code, .code-frame pre code {
  font-family: "Ricty";
}

li, p {
  line-height: 1.6;
}

h1, h2, h3, h4, h5, h6 {
  line-height: 1.4;
}
```

## ビフォーアフター

### ビフォー
![スクリーンショット 2013-12-24 10.52.36.png](https://qiita-image-store.s3.amazonaws.com/0/2/1463ecd5-20c0-7539-be42-6ccf0f52cea1.png "スクリーンショット 2013-12-24 10.52.36.png")

### アフター
![スクリーンショット 2013-12-24 10.52.27.png](https://qiita-image-store.s3.amazonaws.com/0/2/2e7ac019-2ef2-ec6a-b8d6-47dd29bb0ef4.png "スクリーンショット 2013-12-24 10.52.27.png")
[Ruby] privateメソッドの本質とそれを理解するメリット


## 概要
- Rubyのprivateメソッドを支える、2つのルール
- ルールを知る事によるメリット

※前者は[メタプログラミングRuby](http://www.amazon.co.jp/gp/product/4048687158/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4048687158&linkCode=as2&tag=kidachi-22)より。

## 2つのルール

1. privateメソッドを呼び出す時は、レシーバは指定できない
- 自分（self）以外のオブジェクトのメソッドを呼び出すには、レシーバを指定する必要がある


## ルール1

### privateのついたメソッドを呼び出す時は、レシーバは指定できない

例として、レシーバ指定しないパターンと、
明示的にレシーバ指定してしまうパターンを試してみます。

```ruby
class Sample1

  def s1_call_private
    s1_private    # 通常の呼び出し
  end

  def s1_call_private_with_receiver
    self.s1_private    # あえてレシーバ（self）を明示して指定
  end

  private

    def s1_private
      p "Welcome to my private room!"
    end

end

s1 = Sample1.new

s1.s1_call_private
=> "Welcome to my private room!"

s1.s1_call_private_with_receiver
=> NoMethodError: private method `s1_private' called for..
```

ルール通り、レシーバを明示した方（`s1_call_private_with_receiver `）はNoMethodErrorが出る。

## ルール2


### 自分（self）以外のオブジェクトのメソッドを呼び出すには、レシーバを指定する必要がある

※こちらは「privateメソッドのためのルール」という訳ではなく、至極当然の話ですが


```ruby
class Sample2

  def s2_call_sample1
    s1 = Sample1.new
    s1.s1_call_private    # 通常の呼び出し
  end

  def s2_call_sample1_without_receiver
    s1 = Sample1.new
    s1_call_private    # レシーバ（s1）なしで呼んでみる
  end

end

s2 = Sample2.new
s2.s2_call_sample1
=> "Welcome to my private room!"

s2.s2_call_sample1_without_receiver
=> NameError: undefined local variable or method `s1_call_private' for..
```

当たり前ながらs2_call_sample1_without_receiverはエラー。

#### ここで、ルール1とルール2のコンフリクトが起きる。

つまり、
外部（s2）からs1のメソッドを呼び出そうとするなら、
`s1.s1_private `のようにs1というレシーバをつける必要があるが（ルール2）、
<strong>（s1の）privateメソッドはレシーバを付けて呼び出す事を許してくれない</strong>（ルール1）。

コードに示すと以下になります。

```
class Sample2

  def s2_call_sample1_private
    s1 = Sample1.new
    s1.s1_private    # 外部s1のメソッドを呼びたいので、レシーバs1は必須（ルール2）。
                     # でもprivateメソッドなのでレシーバは付けられない（ルール1）。
  end

end
```


結果として、<strong>privateメソッドは外部から呼び出すことが出来ない</strong>。

これがprivateメソッドの内部的な仕組みです。

## つまり

Rubyのprivateメソッドは、

- 呼び出す際にレシーバを指定できない

（し、逆にそれ以外は「ごく普通のメソッド」だと言える）


## このことを理解しておくメリット

privateの挙動の混乱を防ぎやすい。

例えば、
JavaやC#の常識が通用しないRubyのprivateメソッド
http://blog.jnito.com/entry/20120315/1331754912


上記記事にもあるように、JavaやC#と違いRubyは
#### スーパークラスのprivateメソッドはサブクラスからも呼び出すことが出来る。

これは定義だけ覚えているとすぐに分からなくなりそうですが、

#### privateメソッドは呼び出す際にレシーバを指定できない（だけ）

という今回学んだルールと、

#### サブクラスからなら、スーパークラスのメソッドはレシーバを指定せずに呼び出せる

という（ごく当たり前の）決まりを掛け合わせて考えれば、

#### スーパークラスのprivateメソッドはサブクラスからも呼び出すことが出来る

ことは至極当然なものとして頭に入ってくるのではないでしょうか。
テンポラリデータポインタの扱い

テンポラリデータのポインタを引数にするときは下みたいにconstにしてやらないと「taking address of temporary array」と言われてしまう。テンポラリデータじゃ戻ってからのアクセス手段がないので値を書き込んでも使えないからね。しかし、コンストラクタのメンバを初期化するところでテンポラリデータのポインタを食わせると...

```cpp
magMax((const double[]){ MAXFLOAT, MAXFLOAT, MAXFLOAT }), //OK
```

これは通る。が、

```cpp
magMax((const double[]){ -MAXFLOAT, MAXFLOAT, MAXFLOAT }), //NG
```

これは「taking address of temporary array」で通らない。違いは単項の「-」だけ。しかし、

```cpp
magMax((const double[]){ 0-MAXFLOAT, MAXFLOAT, MAXFLOAT }), //OK
```

と単項ではない「-」だと通る。上のコードは３つともconstなテンポラリデータのポインタを食わせているのに。
...わけがわからないよ。

とは言え、MAXFLOATはstatic const floatなのでその辺が関係あるのかもしれないし、C++の推奨に反してマクロで与えてやるとまた違った結果になる可能性がある。
[Rails4.0] DEPRECATION WARNING への対応



## ActiveRecord関連で

Rails4で3系の書き方をしていたら、以下のようなwarningが発生した。

```sh
DEPRECATION WARNING: Relation#calculate with finder options is deprecated. Please build a scope and then call calculate on it instead. (called from hoge_check at /work/Fuga/app/models/tag.rb:103)

DEPRECATION WARNING: The :distinct option for `Relation#count` is deprecated. Please use `Relation#distinct` instead. (eg. `relation.distinct.count`). (called from hoge_check at /work/Fuga/app/models/tag.rb:103)
```

## 対処

countの中に条件（condition）を書くのではなく、
条件はwhere、カウントはcount、と分離して書けばok。

##### 改善前

```ruby
TagHistory.count(:conditions => {:action_id => @params.aid})
```

##### 改善後

```ruby
TagHistory.where(action_id: @params.aid).count()
```

##### 改善前

```ruby
TagHistory.count(:conditions => {:tag_id => self.id, :user_id => @user.id})
```

##### 改善後

```ruby
TagHistory.where(tag_id: self.id, user_id: @user.id).count()
```

解決。
サイコロを転がす(2013.7.6の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの24日目です。我が家の<a href="http://blog.livedoor.jp/o0_hamuhamu_0o/archives/7012131.html">クリスマスケーキはこんな感じ</a>だそうです。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord12rotdice/ にあります。

```hs
module Doukaku.Dice (solve) where
import Data.Char (intToDigit, digitToInt)

solve :: String -> String
solve = map head . scanl (flip roll) "153"

roll :: Char -> String -> String
roll 'E' (x:y:z:_) = z:y:(rev x):[]
roll 'W' ds = let e = roll 'E' in e . e . e $ ds
roll 'S' ds = let n = roll 'N' in n . n . n $ ds
roll 'N' (x:y:z:_) = y:(rev x):z:[]

rev :: Char -> Char
rev = intToDigit . (7 -) . digitToInt
```

二方向分の回転演算さえ作れば、後はその組み合わせで表現できます。ところで、自分は`roll`のように戻り値がendmorphismになる関数を書く癖があるのですが、
こいつは`foldl`やら`scanl`と相性が悪くいつも`flip`する羽目になります。foldの「l」系の関数は使うなってことでしょうか。

http://nabetani.sakura.ne.jp/hena/ord12rotdice/ に他の方の回答もありますので、見ると参考になるでしょう。それではみなさん、よいクリスマスをお迎えください。
Python Jinja2

```python:index.cgi
#!/usr/local/bin/python2.7
# -*- coding: utf-8 -*-

import cgi
from   jinja2 import Environment, FileSystemLoader

#----------------------------------------------------------
# CONFIG
#----------------------------------------------------------
_ENCODE             = 'utf-8'
_HTML_TEMPLATE_FILE = 'index.tmpl'

#----------------------------------------------------------
# Jinja2 Wrapper
#----------------------------------------------------------
class HTTPtemplate(object):

    def __init__(self, template_file):

        self.endocing      = 'utf-8'
        self.data          = {}
        self.template_dir  = './'
        self.template_file = template_file

    def set_encode(self,encode):

        self.encode = encode

    def set_template_dir(self, template_dir):

        self.template_dir = template_dir

    def set_data(self, key, value):

        try :
            value = unicode(value, self.encode)

        except :
            value = value

        self.data[key] = value

    def http_output(self):

        env  = Environment(loader=FileSystemLoader(self.template_dir, encoding=self.encode))
        tmpl = env.get_template(self.template_file)
        print tmpl.render(data=self.data).encode(self.encode)


#----------------------------------------------------------
# MAIN
#----------------------------------------------------------
def main():

    #----------------------------------------------------------
    # POST|GET データー取得
    #----------------------------------------------------------
    http_requests = cgi.FieldStorage()

    #----------------------------------------------------------
    # HTML生成
    #----------------------------------------------------------
    http = HTTPtemplate(_HTML_TEMPLATE_FILE)
    http.set_encode(_ENCODE)
    http.set_data('charset', _ENCODE)
    http.set_data('request_get' , http_requests.getvalue('get'  , None))
    http.set_data('request_post', http_requests.getvalue('post' , None))
    http.http_output()

if __name__ == '__main__' : main()
```

```html:index.tmpl
Content-Type: text/html

<!DOCTYPE html>
<head>
<meta charset="{{data.charset}}">
<title>INDEX</title>
</head>
  <body>
    <form method="post" action="./?get=あ">
    <textarea name="post" cols="50" rows="1"></textarea>
    <input type="submit" value="submit">
    <p>GET :{{data.request_get}}</p>
    <p>POST:{{data.request_post}}</p>
    </form>
  </body>
</html>
```
「Haxerから見たJSX」という感想文を書いてみた。

HaxeからJSXをスパイ活動してきました@nobkzです

# Haxerから見たJSXについて。

## そもそもなぜHaxerなのにJSXのAdvent Calendarに参加したか?

12月7に[きしださんが主催していたイベント](http://d.hatena.ne.jp/nowokay/20131204#1386148361)に参加したときのことでした。言語パフォーマンスについてのイベントで、いろいろと勉強になったのですが、それで、JSXの人(@kazuhoさん )が来ていました。普段AltJSとして、CoffeeScriptや、Haxe(AltJS以外でもですが。)、TypeScriptなどは書いたことがありましが、JSXは一番疎いところであり、また、「JSXは速い」って散々言われてそれに疑問を抱いていたので、丁度良い機会でした。

それで、いろいろとJSXの高速化の話しを聞き、なるほど納得して、じゃあ家に帰って実際にJSXでコードを書いてみようと思いました。んで何を思ったか、 **「せっかくだしJSXあんまり書いたことないけどJSX Advent Calendar参加しよう。たぶん、Haxeから視点で互いに刺激になるから面白いだろう!]** と思いました。そして、「まぁ22日あたりぐらいに設定していれば、その間にJSXスパイ活動できるだろう!」と思いました。

## JSXやっぱり、確かに速いなーと思った。

んで、ちょっとしたJSXでシューティングゲームを作ってみました。いや、というより、Haxeで書いていたものをJSXで書きかえました。

 **JSXはやっぱり速い** 気がした。ベンチマークとかやってないけど。ただゲームの規模が小さいのか、体感で早い気がしました。実際にコンパイルされたコードを除くと、いろいろと最適化が図られて良いと思いました。


**JSXの最適化は伊達じゃなかった**

## JSXとHaxeの静的型の考えかたの違い

JSXの静的型はなんというか、 **速度と安心感のための静的型付け** と感じました。静的片付けにおける型安全はもちろんですが **型情報を元に最適化を計っている** ように思いました。事実そういう面はあると思います。その一方 **静的型付けによる煩わしさ** は残ってしまいました。それは、型指定の煩わしさ、多態の実現のための煩わしさが残ってしまいました。

一方 Haxeは、 **安心と生産性向上のための静的型付け** だと思いました。JSX並に型情報を元にした最適化をコンパイラがしてくれるわけではありませんが、**Haxeには型推論や匿名型、構造的部分型付けなどの、静的型の煩わしさを開放してくれる機能がたくさんあります** 更には、Haxeは **型推論から得た型情報を元にコード補完機能までコンパイラについている始末** です! 

ただ、どちらも型安全は守られるので、ある程度の品質は保証されているという点でどちらもそこは共通しているとは思います。


## 言語機能はやっぱりHaxeだとおもった。

JSXはすごく新しい言語で、Haxeは出てきて以外と長い(2005年ぐらいに登場した)ので、言語機能面ではやっぱりHaxeは強いですね。Haxerとしてやっぱり、JSXの言語機能としてほしいと思ったのが、

* **やっぱり強力な型推論**
* (Haxeの代数的データ構造をとれる) enum
* パターンマッチ

やっぱり、型推論があるかないかが一番大きいと思います。enumやらパターンマッチはその次に欲しいですね。やっぱり、直和型を作りたいですから!

## JSで書かれてたライブラリのバインドするときのつらぽよ

HaxeやJSXの違いではなく、共通することですが。

HaxeもJSXもクラスベースのオブジェクト指向言語であり、JS はプロトタイプベースのオブジェクト指向言語ですが、そのJSとの言語間の差が生み出す苦しみはHaxe、JSXどちらもあります。それは、JSのライブラリをバインドするときで、そこでちょっと困惑するときがあります。

JSが何らかのクラスを意識したライブラリであるならば、バインドは書きやすいのですが、そうじゃないライブラリの場合、なんらかのクラスを再設計しないといけない場合が多くそれはとてもつらぽよなのです。HaxeなどはJSのコードを埋めこんだり、Dynamic型があるけれどもそれだと型の安全が保証されなくなってしまいます。(あとDynamic型だとコードの補完がされないので不安になるってこともありますw) 

また、使う側も、元のライブラリと同じ様に使用できれば良いのですが、設計が変っているので、そこの対応付けの手間がかかりつらぽよなのです。

JQueryなんかは、HaxeもJSXどっちもつらぽよなので、あんまり使用をお勧めしません。ただ、HaxeではDom自体が型を持ってたり、Ajaxがやりやすいライブラリなど、JQueryの機能でやりたいことの変わりに使えるライブラリが沢山あるので、それを利用することでなんとかなっています。JSXもDom操作のしやすい機能かライブラリをつけるとまた良いのかなとか思ったりします。


まあぶっちゃけ **TypeScriptを使え** って誰かが言いそうですが。


## サーバーサイドとクライアントサイドJSについて。

ずっと僕は、web開発における、Haxeマインドについて、node.jsとの何処かの共通性を感じていました。それは、サーバーサイドと、クライアントサイドで、 **共通するデータ構造を一つのソース** で管理できるということです。

もちろん、サーバーサイド、クライアントサイド、(Haxeにおいてはコンパイルする言語環境)によって依存コードが出るのは当たり前です。ですが、 共通するデータ構造を一つのソースを異なる環境で利用できるというメリットはどちらも享受できます。 HaxeではJS以外にも、PHP,neko、C#、Javaなど様々な環境に掃き出せるので、その傾向が強いです。それで、環境依存コードはその環境で、継承やらmixinなどでクラスに機能追加してしまえばいいのです。

僕が最近Haxeで書く理由はそういうことで、サーバーサイドとクライアントサイドで異なる言語でかかれたリソースは一つの言語で書き、サーバーサイドとクライアントサイドで異なる言語でかかれたある意味コードの重複をひとるにしようということです。

nodejsはそいういうことを実現できます。ですが、JSは大規模開発に向かないと思います。JSだけで本格的に、webアプリケーションを作るのは大変だと思います。僕が一番JSXに期待しているのは、実はサーバーサイドJSの方です。今後なにかの機会に、JSXでサーバーサイドもクライアントサイドで最適化が書けられたJSを吐きだし、webアプリケーションを作成してJSXを試してみたいとおもいます。

## あと思ったこと

* 日本でつくられたのに、なんでドキュメントが英語なの?(英語キライwww)
* エディタは結局なんか良いのないの?
* JSXの"X"ってなんなの?

## 最後に

おそくなってすいませんですたーーーーーーーー!!!!
RHEL6で、ls -l 打った時に権限の後ろに".（ドット）"が付く、付かないは何を意味してる？

末尾の参考情報を読めば分かりますが。。。

以下は、RHEL5系では”.（ドット）”表示されないのに、RHEL6系だと表示されるので、ん？ てなってちょっと調べた際のメモです。

# 結論
要は、RHEL6系だとSELinux有効化で作られたファイル・フォルダには".（ドット）"が付くよ。それだけ。

仮にSELinux=無効化しても、/tmpとかの標準フォルダとかには初めから付いてる。
また、SELinux=有効化で作成したファイル・フォルダにも付けられる。

これはセキュリティコンテキストという属性。この属性はSELinux=無効化した後も残る。
この属性をコマンドで敢えて削除することもできるけど、そもそも、SELinux=無効化して今後使っていくなら別に放っといても使わないので関係ない。

## ちなみに、この表示はRHEL6系から。
5系と6系では、lsコマンドを含むコアパッケージ（coreutils）のバージョンが違うので、5系ではこの".（ドット）"は、表示されない。

***
# 参考情報：
参考にさせて頂いた情報です。

* [Linuxでパーミッションに現れるドットの謎]
(http://www.ecoop.net/memo/archives/linux%E3%81%A7%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E7%8F%BE%E3%82%8C%E3%82%8B%E3%83%89%E3%83%83%E3%83%88%E3%81%AE%E8%AC%8E.html)
  * → 結論が書かれてる。
* [Red Hat Enterprise Linux Server6.0でパーミッションの表記について質問です。 l…]
(http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1461665769)
  * → SELinux有効化、無効化の時の".（ドット）"表示の動作が分かる。
* [RHEL6のls -l のパーミッション の ピリオド "." って何よ](http://dharry.hatenablog.com/entry/20110512/1305212090)
  * → lsコマンドのソース読んでる（どういう時に".（ドット）"が付くのか分かる）。
pythonでもっとも簡単に音声合成する方法

pythonで手軽に音声合成したいならeSpeakがおすすめです。

#eSpeakとは

多言語に対応したオープンソースのスピーチシンセサイザー。

英語はもちろんのこと、スペイン語、ドイツ語、中国語など幅広く対応しています。(残念ながら日本語未対応)

[対応言語一覧はこちら](http://espeak.sourceforge.net/languages.html)

一応日本語に対応させる方法も存在するようです　
　→　http://ja.nishimotz.com/espeak

#インストール方法
    sudo aptitude install python-espeak

#テストプログラム

Hello Worldを発声するプログラム

```py:helloworld.py
from espeak import espeak
espeak.synth("Hello World")
```
unityでopencvを使ってみる for mac

# Homebrewインストール

Homebrew入れてなかったので入れる

```shell-session
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```

```shell-session
brew doctor
brew update
```

オッケーそう

### 参考
http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc
http://brew.sh/index_ja.html


# OpenCVインストール

```shell-session
$ brew install opencv
Error: No available formula for opencv 
Searching taps...
homebrew/science/opencv
```

ありゃエラー
http://qiita.com/laprasDrum/items/59092e96608dd106be63 を参考に

```shell-session
$ brew tap homebrew/science
```

あらためて

```shell-session
$ brew install opencv
```

長い・・・。でもおｋ！


# OpenCVSharpインストール

https://github.com/shimat/opencvsharp
これなんだけどどうもmacでのコンパイルは暗黒面があるらしいのでスルーして、

http://warapuri.tumblr.com/post/70283352060/unity-opencv-mac を真似る
> Mac用: CSharpTest_MacOS.zip
> 
> Win用: CSharpTest_Win.zip
> 
> Macの方は以下のようにdylibを配置しましょう。root権限が必要です。
> 
> sudo mkdir -p /usr/local/lib
> 
> sudo cp *.dylib /usr/local/lib

# 使ってみる
unityでプロジェクトを立ち上げてCSharpTest_MacOS.zip のAssetを全部ぶち込みシーンをロード！

・・・やっぱり動かない

もいっちょこちらにお世話になって
http://warapuri.tumblr.com/post/70283352060/unity-opencv-mac 

* CUBE作る
* Unlit/Texutureなマテリアル作ってCUBEにつける
* ページのサンプルスクリプトをCUBEにつける

動いた！！
とりあえず開発出来る！

が、Mac用ビルドしたら元ページと同じエラーが・・・
これはしばし放置かなぁ

>私のMacでMac用ビルドした際に、プレイしてもうまく動いてくれないことがありました。Player.logを見てみるとlibcxcore.dylibが見つからないというエラーでした。
RHEL6でドライバ（カーネルモジュール）のロード順を固定化する方法


先に書いておくと、ここに書いた方法はあまりやる意味無いです。

互換デバイス名を用いて動作するプログラムが既にあったので、互換デバイス名を固定化しようと暫定対処でこの方法をとりましたが、この方法だとディスク故障時のズレなどの場合、結局対処出来ないため、互換デバイス名を完全に固定することは出来ません。

本来はby-id名などを用い、デバイスのロード順などで名称がずれる互換デバイス名を用いないように実装すべきです。
ただ、古いシステムなどで互換デバイス名が結構問題になる場合はあるので、そういうシステムを触る機会が多い人は知っておいても良いかもしれまえん。本来は、システム更改などがある場合、プログラムなどを更改後のOSの仕様に合わせるべきですが。。。

とはいえ、他に何かしらの用途で利用するかもしれませんので、RHEL6でドライバ（カーネルモジュール）のロード順を固定化する方法を書きます。

# で、どうやる？
カーネルオプションの「rdloaddriver」を使用することで、ドライバの読み込み順を制御（固定化）出来ます。

```rdloaddriver=<ロードしたいモジュール名>``` というように指定します。

例えば、ブート時に module1、module2 という順序でカーネルモジュールをロードするように指定したい場合は、```/boot/grub/grub.conf``` のカーネルオプション指定行（※ kernel 行） に以下のように追加します。

```/boot/grub/grub.conf
kernel XXXX rdloaddriver=module1 rdloaddriver=module2
```

# 注意です
上記の方法で正常動作するのは、初期 RAM ディスク（initramfs）に rdloaddriver で指定したカーネルモジュールが含まれていることが前提です。
一般的な SCSI ドライバのカーネルモジュールはデフォルトで含まれてるのであまり気にする必要はないと思います。
が、含まれてない場合困るので、その方法も以下に書いておきます。

## dract —add-drivers コマンドで初期RAMディスクに利用モジュールを追加する
初期RAMディスクに利用したいモジュールが含まれてない場合は、`dract`コマンドを用いて初期RAMディスクを再生成します。
```dracut```コマンドを実行する時に```--add-drivers```オプションを用います。
その時に、追加したいカーネルモジュール名を指定し、初期RAMディスク（initramfs）を再作成することで、利用モジュールを initramfs に組み込むことが出来ます。

以下は、module1と、module2を組み込む例です。

```module1と、module2を組み込む場合の例
# dracut --add-drivers module1 module2 /boot/initramfs-<カーネルver>.img <カーネルver>
```

## 特定のモジュールが初期RAMディスクに組み込まれているか確認する方法
現在の初期RAMディスクに、これから利用しようとするモジュールが含まれているか確認した場合があります。

特定のカーネルモジュールが、初期RAMディスク（initramfs） に組み込まれているかどうか、以下のような方法で確認出来ます。以下は、module1が組み込まれているか確認する例です。

```module1が組み込まれているか確認する例
# mkdir temp
# cd temp
# gunzip < /boot/initramfs-<カーネルver>.img | cpio -id
# find . -name "module1.ko"
./lib/modules/<カーネルver>/kernel/drivers/aaa/module1.ko
```

# RHEL5系では？
ちなみに、RHEL5系であれば「modprobe.conf」の記載順でドライバのロード順序を制御できます。

RHEL5、6では、この辺のドライバ周りが結構違うので注意です。
現場では、まだまだRHEL5系触るので。。
Eclipseのローカルヒストリー機能でファイルを以前の状態に戻す

Eclipseでファイルを以前の状態に戻したいときは，ローカルヒストリーが便利です．
ローカルヒストリーはファイルごとに前に保存した時の状態を履歴として残す機能です．

#### 今回の環境：
Eclipse Version: Kepler (4.3.0)
(※pleiadesで日本語化してあります)

### 使い方
1. パッケージ・エクスプローラのファイルを右クリック．
2. 比較→ローカルヒストリー
3. 新しく出てくるヒストリーの項目中の，改定時刻のいづれかを選択．
   現在のファイルとの比較画面が出てきます．
4. 画像の赤枠で囲ったところにある，”右から左にすべての非競合をコピー”で元のファイルに戻せます．

![localhistory.png](https://qiita-image-store.s3.amazonaws.com/0/30677/17a66df7-2e2f-f1c9-5dd0-7a20ca536548.png)
CoffeeColliderをMac OS Xにインストールした

巷で話題になっている CoffeeColliderを Mac OS X にインストールして、
コマンドラインから音を出せるようになったのでその過程のメモです。

#### CoffeeCollider の Mac OS X へのインストール

基本的な手順は、[github の README](https://github.com/mohayonao/CoffeeCollider/blob/master/README.md) にあるとおり。

> npm install -g coffee-collider

自分の環境には npm が入っていなかったので、このインストールを最初に実施する必要がありました。
( npm は "Node Packaged Modules" の略だそうで、Node 上で動くアプリの管理ソフトとのこと)

```bash
# npm のインストール
$ sudo port install npm

# npm と node を確認する
$ file `which npm`
/opt/local/bin/npm: symbolic link to \`../lib/node_modules/npm/bin/npm-cli.js\'
$ file `which node`
/opt/local/bin/node: Mach-O 64-bit x86_64 executable

# 試しに npm の機能を使ってみる
# インストール可能なモジュールのリストアップ
$ npm search | grep -i collider
npm http GET https://registry.npmjs.org/-/all/since?stale=update_after&startkey=1387786693960
npm http 200 https://registry.npmjs.org/-/all/since?stale=update_after&startkey=1387786693960
coffee-collider       Sound Processing Language for Web Audio                       =mohayonao            2013-12-19 11:00  0.2.2       language coffeescript supercollider music
idgen-collider        determine likelyhood of id collisions                         =carlos8f             2012-09-28 20:56  0.0.0
lhc                   Large Hashsum Collider                                        =stuartpb             2013-02-14 15:22  0.1.0       hash collision
polvo-cc              CoffeeCollider plugin for Polvo                               =hems                 2013-12-22 04:16  0.0.3       polvo plugin build system tool coffeecollider
sc4node               A library for sclang (SuperCollider client application)       =kn1kn1               2012-08-27 12:30  0.0.14
subcollider           JavaScript library that provides like SuperCollider functions. =mohayonao           2013-05-30 12:50  0.1.0
supercolliderjs       Tools for communicating with the SuperCollider music language environment =crucialfelix 2013-01-15 11:56  0.2.1       supercollider synthesis music sound
$

# CoffeeCollider をインストールする
# ※ 管理者権限が必要
$ sudo npm install -g coffee-collider
Password:
npm http GET https://registry.npmjs.org/coffee-collider
npm http 304 https://registry.npmjs.org/coffee-collider
npm http GET https://registry.npmjs.org/coffee-script
... 長いので省略...
coffee-collider@0.2.2 /opt/local/lib/node_modules/coffee-collider
├── optparse@1.0.5
├── coffee-script@1.6.3
├── ws@0.4.31 (tinycolor@0.0.1, options@0.0.5, commander@0.6.1, nan@0.3.2)
└── speaker@0.0.10 (bindings@1.1.1, debug@0.7.4, readable-stream@1.1.9)
$ 

# インストール後の確認
# → 実体は javascript のコード
$ file `which coffeecollider`
/opt/local/bin/coffeecollider: symbolic link to `../lib/node_modules/coffee-collider/bin/coffeecollider.js'
$ 

```
これで、ローカルに coffeecollider がインストールされてコード片を実行する準備が整いました。

####  サンプルの実行

こちらもREADMEから。

```bash
# 音量注意。Ctrl + C で終了する
$ coffeecollider -e "(->SinOsc.ar([440,442])).play()"
$
```
左のチャンネルから 440Hz 、右のチャネルから 442Hz のサイン波が出力されます。

とりあえず、自分の環境では手軽に実行できるよう `ccll` という名前でリンクを張ってみました。

```bash
$ sudo ln -s /opt/local/bin/coffeecollider  /usr/local/bin/ccll
$ ccll -v 
CoffeeCollider version 0.2.2
```

ファイルからスクリプトを読む場合はこんな感じ。
`ccll ~/Desktop/CoffeeCollider-master/examples/demo.coffee`

以上
IntelliJ IDEAでAIR for iOS/Android両対応アプリ時のめんどくさいappxmlづくりを楽にして、Flash Builderよりオシャレにつくろう


この記事は [Adobe AIR Advent Calendar 2013](http://www.adventar.org/calendars/182) 23日目の記事です。

## この記事で伝えたいこと

* Flash Builderでは難しい両対応アプリをつくる
* app.xmlを複数つくる
* app.xmlをgrunt + jadeでオシャレに解決する

## FlashBuilderでの問題点

* SDKを自力でアプデしないといけない
* AndroidとiOSで同じapp.xmlを共有してる
    * 自力でapp.xmlを書き換えたりするのはヤバい
* developモードとreleaseモードの区別がよくわからない
    * air.hoge.hogeapp.debugなどと、勝手に「.debug」が後ろに付いたりする

というのをFlashBuilder 4.6, 4.7のときに思っていました。ひょっとすると、ちゃんとした方法があるのかもしれませんが、わかりませんでした。あればいいですね！


## という問題をIDEAで華麗に解決しよう

## IDEAでは複数の書き出し設定が作れる
ので、

* android / release
* android / debug
* ios / release
* ios / debug

と必要なぶんだけ設定をつくってしまおう、という魂胆です。

## おソースをGithubに置いときますね。

https://github.com/katapad/appxml-gen


## grunt + jadeでapp.xmlをサクっと量産しよう

* base.config.coffeeに書かれている設定をベースに
* ios.config.coffee, android.config.coffeeなどで、個別設定を上書き・追加します
* その設定を元にbase.jadeを使ってapp.xmlを吐き出します。

## しこしこIDEAの設定を作成

それぞれのapp.xmlを指定してやる。こんな感じです。


![appxml.png](https://qiita-image-store.s3.amazonaws.com/0/2631/1e46b066-e1ad-cec2-83d3-cfecae465a80.png "appxml.png")




# こんな風にして、それぞれの設定を作っていけば、FlashBuilderでiOSのときとAndroidでチマチマ設定しなおしたり、bin-release-tmpの中身に変なファイルが知らん間に追加されて、どれが正しいファイルかわかんなくなっていた地獄の日々から開放されるし、あとは死んでもできますね！やったー！
mrubyで詳しいビルドのログを表示する

# mrubyのmakeとrake

mrubyにはとってつけたようなMakefileがあり、makeでビルドできるようになっていますが、実際にはRakeを使ってビルドしています。mrubyにはRakeがインストールされていないRuby環境でもRakefileでビルドできるよう、そのためのminirakeがついているくらいです。

makeを使わずminirakeでビルドするには以下のようにします。

```
$ ruby ./minirake
```

# 詳細なビルドログを出力する

しかしながら、上記のように実行すると細かい実行ログが表示されません。シンプルなのも良いかもしれませんが、デバッグの時には全部表示してほしいこともあります。

そのような場合には、``-v``オプションを使用します。

```
$ ruby ./minirake -v
```

こうするとログが出力されるようになります。

makeを使う場合でも、Makefileを以下のように書き換えればログが出力されるようになります。

```diff
- RAKE = ruby ./minirake
+ RAKE = ruby ./minirake -v
```

C部分のデバッグ中や、何か挙動が気になる場合などはこちらに書き換えた方が良いでしょう。
knife-solo で Ubuntu に Android SDKをインストールする・改


Berkshelf を使って力技な部分を減らしました

## 環境
* MacOS X 10.9.1
* Chef 11.8.2
* Ruby 2.0.0p247
* Berkshelf 2.0.10
* Vagrant box(Ubuntu 12.10(x64))

## 実行手順
1. Ruby, Chef, Berkshelf, Vagrant を入れておく(詳細は割愛)
1. `vagrant up`が成功するまでがんばって環境構築(詳細は割愛)
1. `knife solo init chef-repo`
1. proxy を使うひとはここで .chef/knife.rb に proxy を追加。あ、box 側はどうしようかな…調査します
  * box 側はこちら http://mas0061.blogspot.jp/2013/04/windows-cygwin-proxychef.html をご参照ください
1. Berksfile に Android-SDK を追記
  * `echo "cookbook 'android-sdk', :git => 'https://github.com/gildegoma/chef-android-sdk'" >> chef-repo/Berksfile`
 * 「Berksfile なんてできてないんだけど？」というひとは、Berkshelfをインストールしていないのかもしれません
  * 「なんでわざわざgithubを指定しているの？」 -> 公開されている Android-SDK の Cookbook だと、v22.05という、ちょっと古いバージョンが入っちゃうからです
1. `vagrant ssh`
 * Ubuntu に 32bitライブラリを入れるおまじないが必要。ここが自動化できれば完璧なのじゃが。。
 * `sudo dpkg --add-architecture i386 && sudo apt-get update`
 * exit
1. `cd chef-repo`
1. `knife solo prepare <host>`
 * host は各自 vagrant をセットアップした場所にしてください 
1. `knife solo cook <host> -o android-sdk::default`

最後まで行けばお疲れ様でした！！`vagrant ssh`して`echo $ANDROID_HOME`とか`android init`とかしてみてください！！
VALUE-DOMAIN用DDNS設定更新スクリプト


ひとまず、コレをRasPiのcronに仕込んで間に合わせ。
ドメインとかパスワードは直接書かない方が良いと思います。


```sh:updater.sh
#!/bin/bash

workd=/usr/local/hoge
domain="example_com"
passwd="password"

/usr/bin/curl -s http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip \
-o ${workd}/current_ip                                          \
-w '%{http_code}' > ${workd}/status

status=`/usr/bin/cat ${workd}/status`
if [ "200" -ne "$status" ] ; then
  exit 0
fi

prev=`/usr/bin/cat ${workd}/prev_ip`
current=`/usr/bin/cat ${workd}/current_ip`

if [ -z "$current" ] ; then
  /usr/bin/mail -r "hoge@example.com" -s "GLOBAL IP REF ERROR" "master@example.com" 
  exit 0
fi

if [ "$prev" = "$current" ] ; then
  exit 0
fi

/usr/bin/cat ${workd}/current_ip > ${workd}/prev_ip

url="http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=${domain}&p=${passwd}&h=*&i=${current}"

/usr/bin/curl -s "${url}" > ${workd}/curl.log.$$

if [ $? -ne 0 ] ; then
  /usr/bin/echo "${url}" | /usr/bin/mail -r "hoge@example.com" -s "DDNS UPDATE ERROR" "master@example.com" 
  exit 1
fi

rm ${workd}/curl.log.$$

exit 0
```
ハードウェア性能に応じたMroonga/Groongaの全文検索性能について

# はじめに


全文検索エンジンMroonga/Groongaでは、主に以下の点が全文検索性能に影響すると思われます。

* 検索がインデックスアクセスのみであるか否か

Mroongaでは、特定の条件下において、複数インデックスを用いて全文検索することができます。(参考：[MroongaによりMySQLで複数インデックスを有効に全文検索する方法](http://createfield.com/Mroonga%E3%81%AB%E3%82%88%E3%82%8AMySQL%E3%81%A7%E8%A4%87%E6%95%B0%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95))

Groongaでは、ある程度自由に複数インデックスを用いて全文検索することができます。（インデックスが使われないケースを特定する方法は今のところわかりません。）

*  語句の出現頻度が非常に高いかどうか

[Ngramのサイズに応じたMroonga/Groongaの全文検索性能について](http://createfield.com/Ngram%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%9FMroonga/Groonga%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)、[Mroonga/GroongaのMeCabトークナイザの全文検索性能について](http://createfield.com/Mroonga/Groonga%E3%81%AEMeCab%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)に示したように、語句の出現頻度が非常に高いと検索性能が劣化します。

* 検索結果のレコード件数が非常に多いかどうか

[Mroongaにおける様々なレコード件数カウント方法とパフォーマンスについて](http://qiita.com/naoa/items/258305428aa72dd0185e)に示したように、検索結果のレコード件数が非常に多いと検索性能がある程度劣化します。

これらのうち語句の出現頻度は、検索性能への影響が大きいです。たとえば、Unigramトークナイザを用いた場合は、全体的に語句の出現回数が非常に多くなり、検索性能が大幅に劣化します。

しかしながら、データベース規模が大きくなればなるほど、全体的に語句の出現回数は多くなり、BigramトークナイザやMeCabトークナイザを用いたとしても全文検索性能がある程度劣化せざるを得ません。

そこで、語句の出現回数が非常に多くて検索性能が劣化する場合に、ハードウェア性能を向上させると、どの程度検索性能を向上させることができるかを試してみます。

[続きを読む](http://createfield.com/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E6%80%A7%E8%83%BD%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%9FMroonga/Groonga%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
D言語のビルドツール DUB


本当はD言語で Wavelet Matrix のライブラリを作って公開しようと思ったのですが
23日に間に合わなかったのでdubの紹介をします（出来たらまた別途公開することにします）。

##DUBとは
dub は D 言語のビルドツール兼パッケージマネージャです。
JSON で必要なライブラリ（とそのバージョン）を記載しておくと、dub が自動的に持ってきてくれます。 Ruby でいう Gemfile のようなものですね。
単に便利なだけでなく、D言語の標準パッケージマネージャになるとかならないとか言われているようなので、使うに越したことはありません。

##インストール
[DUB の公式サイト](http://code.dlang.org/) で、バイナリかソースをダウンロード＆インストールすればOKです。Windows, Mac OS X, Linux 用のバイナリが容易されているので、とても簡単です。

また、DUB に対応しているパッケージの一覧も書いてあるので見てみましょう。
欲しいライブラリが記載されていないときは、[Twitterでつぶやくとなぜかいつの間にか追加されています](https://twitter.com/kazoo04/statuses/380579947418353664)。怖い。

##つかいかた

```
$ dub init test
Successfully created an empty project in '/Users/kazoo04/test'.
```

で、プロジェクト用ディレクトリ(ここでは test)が生成されます。中身は

- /package.json
- /source
- /source/app.d

の3つです。 
ソースコードは source ディレクトリに入っていて、このディレクトリ内のコードがビルドの対象になります。ちなみに src という名前でもOKです。
package.json の dependencies にパッケージのことを書きます。
デフォルトでは次のような感じになっています。

```
{
	"name": "test",
	"description": "A minimal D application.",
	"copyright": "Copyright © 2013, kazoo04",
	"authors": ["kazoo04"],
	"dependencies": {
	}
}
```

たとえば、 msgpack-d と vibe.d を使いたいときは

```
{
	"name": "test",
	"description": "A minimal D application.",
	"copyright": "Copyright © 2013, kazoo04",
	"authors": ["kazoo04"],
	"dependencies": {
		"vibe-d": ">=0.7.19-beta.2"
	}
}
```

のように書きます。上記のようにバージョンを指定すればそれを、master と書けばリポジトリの最新のものをインストールしてくれます。
たとえば次のような表記が使えます。

- ```==1.0.0```
- ```>=1.0.0```
- ```>=1.0.0 <=1.2.3```
- ```~master```

ビルドするときは、

```
$ dub build
```

です。パッケージのインストールのために時間がかかりますが気長に待ちましょう。

最後に

```
$ dub run
```

で実行できます。

##その他のオプション
[公式ページ](http://code.dlang.org/package-format) に細かい package.json の設定が載っています。

たとえば、 configurations を指定することで、複数のビルド設定を切り替えることが出来たり、 DUB に登録されていないリポジトリを登録したりすることができます。

以上簡単ですが DUB の紹介でした。
「プログラマのためのSQL」データベースvsファイルシステム


* SQLは3つの言語の集合といえるかもしれない
	* DDL
		* データ宣言言語(データの内容を定義する)
	* DML
		* データ操作言語(データを操作する。例 select, update )
	* DCL 
		* データ制御言語(データへのアクセス制御などを行う。例 grant)
* SQLは集合型言語であることを意識する
	* ある意味で関数型言語に似てるかもしれない

# 1.3 行vsレコード
* レコードはプログラム(ホスト言語)側で定義されるべきもの
*    READ a, b, c と   READ a, c, bは違う、
* SELECT a, b, cはSELECT a, c, bと同じデータである
* その違いはしっかり理解しないと

# 1.4 列vsフィールド
* ファイルは受動的、互いに独立している(データ同士の関連が付けられない)
* データベースは能動的にすべてのデータを正しく保つように動作する

# 1.5 オブジェクトとしてのテーブル
* テーブル≠ファイル(そうイメージすることは簡単だけど)
* テーブルは単なるスプレッドシートではない
JavaScript - 配列のコピー

JavaScriptでは配列を単純な代入によってコピーしたあと、コピー先の配列に変更を加えると、同時に元の配列も変更されてしまうらしい。

```js:改善前
(function() {
   var x = ["a0", "a1", "a2"];
   var y = x;
   y.push("a3");
   /* 配列を表示 */
   console.log(x);
   console.log(y);
})();
```

たとえば、上記のコードを実行すると配列x, 配列yはともに

```js
["a0", "a1", "a2", "a3"]   // 配列x
["a0", "a1", "a2", "a3"]   // 配列y
```

と表示された。

オリジナルの配列まで変更される事態を回避する方法をいろいろ試してみると、
「しっかりと配列のコピーをつくってやればよい」ことが分かった。
以下のコードでは、配列yに対して配列xの要素を１つずつコピーすることにより、x全体をコピーしている。
この方法であれば、コピー後に配列yに加えた変更は元の配列xに影響を与えることはなかった。

```js:改善後
(function() {
   var x = ["a0", "a1", "a2"];
   var y = [];
   for(var i = 0; i < x.length; i++) {
      y.push(x[i]);
   }
   y.push("a3");
   /* 配列を表示 */
   console.log(x); 
   console.log(y); 
})();
 
/* 出力結果 */
["a0", "a1", "a2"]         // 配列x
["a0", "a1", "a2", "a3"]   // 配列y
```

##おまけ
これとは別の以下のような方法でもOKだった。

0. 単純な代入によって配列xを配列yにコピーする.

0. コピー先の配列yに変更を加える前に、
`JSON.parse(JSON.stringify(x))`
によって配列xを文字列化し、再び、オブジェクトにパース（解析）してxに代入する.

この方法で書くと次のようになる。 

```js:おまけ
(function() {
   var x = ["a0", "a1", "a2"];
   var y = x;
   x = JSON.parse(JSON.stringify(x));
   y.push("a3");
   /* 配列を表示 */
   console.log(x); 
   console.log(y); 
})();
 
/* 出力結果 */
["a0", "a1", "a2"]         // 配列x
["a0", "a1", "a2", "a3"]   // 配列y
```
Scala Liftフレームワークの参考文献

いろいろ情報が散在しているのでまとめ。

[Lift cookbook](http://cookbook.liftweb.net/#_lift_cookbook)
[Lift Demo](http://demo.liftweb.net/)
[Simply Lift](http://simply.liftweb.net/)
[Exploring Lift](http://exploring.liftweb.net/)

[Lift Demo](http://demo.liftweb.net/)と[Github](https://github.com/lift/examples)コードを見比べるのがいい感じだ。
Ubuntu 12.04 LTSのインストールと初期設定

## タッチパッドを無効にする

タッチパッドがうざくてしかたがないので無効にする。

```diff:/usr/share/X11/xorg.conf.d/10-evdev.conf
Section "InputClass"
         Identifier "evdev touchpad catchall"
         MatchIsTouchpad "on"
         MatchDevicePath "/dev/input/event*"
+        Option "Ignore" "on"
         Driver "evdev"
 EndSection
```

## 必須ソフトのインストール

```bash
$ sudo apt-get install git
$ sudo apt-get install vim
$ sudo apt-get install curl
$ sudo apt-get install zsh
$ sudo apt-get install tmux
$ sudo apt-get install ncftp
```

## 自分用の環境設定

```bash
$ cd ~
$ mkdir -p git && cd git
$ git clone git@github.com:keiji0/dotfiles.git && cd dotfiles
$ 
```

## Terminalの設定

カラースキームは[Solarized Colorscheme for Gnome Terminal](https://github.com/sigurdga/gnome-terminal-colors-solarized)を使う

```bash
$ git clone git://github.com/sigurdga/gnome-terminal-colors-solarized.git
$ cd gnome-terminal-colors-solarized
$ ./solarize
```

## Emacs 24のインストール

package.elが入っているのでv24を入れる

```bash
$ sudo add-apt-repository ppa:cassou/emacs
$ sudo apt-get update
$ sudo apt-get install emacs24 emacs24-el
```

ref. http://gihyo.jp/admin/serial/01/ubuntu-recipe/0235

## vmware playerのインストール

Download: https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/6_0

```sh
$ sudo bash VMware-Player-6.0.1-1379776.x86_64.bundle
# インストーラーの指示に従う
```

## 参考

1. [Ubuntu 13.10をインストールした直後に行う設定 ＆ インストールするソフト](http://www.k5.dion.ne.jp/~r-f/sicklylife/memo/ubuntu1204/index.html)
AFNetworking 1.xのUIImageView+AFNetworkingを使っている場合は画像キャッシュに注意してほしい


# はじめに

UIImageView+AFNetworkingのNSCacheをクリアしないとクラッシュします。

# UIImageView+AFNetworkingを使うと画像の読み込みに便利

最近ではかなり色んな所で使われているであろう通信ライブラリAFNetworkingでは、[UIImageView+AFNetworking](https://github.com/AFNetworking/AFNetworking/blob/1.x/AFNetworking/UIImageView%2BAFNetworking.m)を使ってUIImageViewに対して次のような画像ロードのメソッドを追加しています。

```objc:UIImageView+AFNetworking.h
- (void)setImageWithURL:(NSURL *)url;

- (void)setImageWithURL:(NSURL *)url
       placeholderImage:(UIImage *)placeholderImage;

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest
              placeholderImage:(UIImage *)placeholderImage
                       success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                       failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure;
```

## NSCacheが使われているがクリアしていないのでクラッシュする

これらメソッドにより通信処理やプレースホルダーのセットなどが簡単になっているのですが、このメソッドで読み込まれた画像はNSCacheによってメモリキャッシュされていて、さらにprivateな変数としてstaticで定義されているためメモリが解放されるタイミングはコントロールできません。最悪の場合、メモリ警告が起きたあとも使い続けているとアプリケーションはクラッシュしてしまいます。

## 解決法

サクッと考えられる解決法をいくつか

### 解決法1. AFNetworking 2を使う

iOS7以降だけが対象であれば、AFNetworking 2を使えば解決します。AFNetworking 2の[UIImageView+AFNetworking](https://github.com/AFNetworking/AFNetworking/blob/master/UIKit%2BAFNetworking/UIImageView%2BAFNetworking.m)はメモリ警告をNSNotificationで監視し、キャッシュをクリアしています。

```objc:UIImageView+AFNetworking.m
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * __unused notification) {
            [_af_defaultImageCache removeAllObjects];
 }];
```

### 解決法2. 自分のリポジトリにforkしてfork先のコードを使う

iOS6も対象にしないといけない場合かつgit submoduleやCocoaPodsを使っているならAFNetworking 1.x系のリポジトリをforkして自分のリポジトリでAFNetworking 2のような処理を追加するのが良いと思います。

### 解決法3. カテゴリでNSCacheのオブジェクトをpublicにする

iOS6も対象にしないといけないし、git submoduleやCocoaPodsは使っているものの何らかの理由によって自分のリポジトリを使うことが憚られる場合、カテゴリでgetterを記載することでキャッシュを取り出すことが出来ます。

```objc:UIImageView+AFNetworkingImageCache.h
@interface UIImageView (AFNetworkingImageCache)

+ (NSCache *)af_sharedImageCache;

@end
```

カテゴリを使ってUIKitを拡張しているライブラリに対してカテゴリでメソッドを追加するということに違和感がなければ、NSCacheはキャッシュする上限も決められるのでこの方法もありかもしれません。

### 解決法4.  開発プロジェクトのコードと同じように修正してコミットする

一番オススメしない方法ですが、ライセンスが緩い外部のOSSなライブラリは開発プロジェクトと同じリポジトリにぶっこんで修正してしまえば当然好きにできます。ですがそんなことしたらライブラリが改善された場合、都度手動でファイル置き換えていくの面倒じゃないでしょうかね？とりあえず正常に動くことは大事とは思いますが、引き継いだ人にダサイっすねとか言われかねないしgit submodlueやCocoaPodsで保持されてない外部ライブラリがあると引継ぎたくないですね！

### 解決法5. UIImageView+AFNetworkingを使わない

最後に、使わないので済むならそれが一番かもしれないですね…
UIImageViewにtwitterのthumbnail画像当てる


```objective-c
NSURL *url = [NSURL URLWithString:[[status valueForKey:@"user"] valueForKey:@"profile_image_url"]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
UIImage *image = [UIImage imageWithData:data];
_userThubmnail.image = image;
```
正規表現で全角スペースにマッチさせる方法

全角スペースを正規表現でマッチさせたいけど、`\s` だとマッチしない。これは `\s` や `\d` といった正規表現の文字クラスの略記法が **ASCII の範囲の文字のみを対象** としているからなんです。

ひどいよ… こんなのってないよ…

じゃあ、半角スペースと全角スペースの両方にうまくマッチさせるにはどうしたらいいのでしょう。

それでは、「苗字と名前が半角もしくは全角のスペースで区切られた日本人の氏名の文字列から
正規表現を使って苗字と名前をそれぞれ取り出す」という例をもとに考えてみましょう。

# 方法1: 文字クラス内で全角スペースを指定する

```rb
"佐倉　杏子" =~ /^(.+?)[\s　]+(.+)$/
puts $1 #=> "佐倉"
puts $2 #=> "杏子"
```

文字クラス (角括弧) の中に `\s` と `"　"` (全角スペース) を並べて指定します。でも正規表現に直接全角スペースを入力するのはなんだか嫌ですね。

# 方法2: Unicode プロパティの blank を利用する

**Unicode プロパティ** といふものありけり。`\p{blank}` が全角スペース (ASCIIコード範囲外の空白) にもマッチします。

```rb
"佐倉　杏子" =~ /^(.+?)\p{blank}+(.+)$/
puts $1 #=> "佐倉"
puts $2 #=> "杏子"
```

# 方法3: POSIX 文字クラスの blank を利用する

**POSIX 文字クラス** といふものありけり。`[[:blank:]]` が全角スペース (ASCIIコード範囲外の空白) にもマッチします。

```rb
"佐倉　杏子" =~ /^(.+?)[[:blank:]]+(.+)$/
puts $1 #=> "佐倉"
puts $2 #=> "杏子"
```

# 参考
全部 [Ruby 2.3.0 リファレンスマニュアルの正規表現のページ](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fregexp.html) に載っていました。Unicode プロパティも！ POSIX 文字クラスも！ (説明が) あるんだよ！Ruby のリファレンス素晴らしい (\*´д`\*) ﾊｧﾊｧ

# 正規表現小ネタ

```rb
# 全角スペースを2つ重ねた場合

# その1
"佐倉　　杏子" =~ /^(.+)[[:blank:]]+(.+)$/
puts $1 #=> "佐倉　"
puts $2 #=> "杏子"

# その2
"佐倉　　杏子" =~ /^(.+?)[[:blank:]]+(.+)$/
puts $1 #=> "佐倉"
puts $2 #=> "杏子"
```

全角スペースを2つ重ねた場合、苗字にマッチさせる部分で控えめな量指定子 `+?` を使わないと
1つ目の全角スペースにまでマッチしてしまいます。正規表現の量指定子は欲張りなのだそうです。

この辺については [正規表現で最短マッチを知っとくとちょっと便利かも](http://blog.livedoor.jp/sasata299/archives/51809374.html "
正規表現で最短マッチを知っとくとちょっと便利かも
") が非常に参考になりました。
DropwizardのSSL対応

SSLを有効にする場合はyamlファイルに設定を書いてあげればOK。
keystoreファイルは[dropwizard-example](https://github.com/dropwizard/dropwizard/tree/master/dropwizard-example)から拝借。

Dropwizardのバージョンは0.6.2。

# SSLを有効にする設定

[User Manual](http://dropwizard.codahale.com/manual/core/)にはSSLに関する設定しか書いていないけどhttp.connectorTypeも変更する必要がある。
http.connectorTypeは「blocking」、「nonblocking」、「legacy」、「legacy+ssl」、「nonblocking+ssl」の５種類を選択できて、そのうちSSLが有効になるのは「legacy+ssl」、「nonblocking+ssl」の２種類。
その他の３種類を選択するとSSLは使えないっぽい。

下のyamlファイルは[Getting Started](http://dropwizard.codahale.com/getting-started/)のHello WorldにSSLの設定を追加したもの。

```yaml:hello-world-ssl.yml
template: Hello, %s!
defaultName: Stranger

http:
  connectorType: nonblocking+ssl

  ssl:
    keyStore: ./setting/example.keystore
    keyStorePassword: example

    # optional, JKS is default. JCEKS is another likely candidate.
    keyStoreType: JKS
```