OmniAICreator/Qiita-1.07M huggingface dataset:
Elasticsearchへのクエリが突然Failし始めた時の対処(fielddata cacheがデフォルト無限で泣いた話)


Elasticsearchにクエリ投げても突然応答しなくなるという事象が発生し、調査してみたので内容をシェア。


##出たエラー
突然Elasticsearchのクエリがfailし始めて、Kibanaのグラフが応答しなくなったという話が上がる。。

![1__tmux.jpg](https://qiita-image-store.s3.amazonaws.com/0/40850/6aea23f3-72ae-ee2e-0303-716b7b6f038c.jpeg "1__tmux.jpg")


ログ見てると、下記の用語が怪しいので調査
####うちの環境だと、HEAP_SIZEを18gにしていたので、まさにこのエラーは、[indices.breaker.fielddata.limit]でひっかかっている。(18g*60%=10.8g...)

|用語|内容|
|---|---|
|CircuitBreaker|OOM(OutOfMemory)を制御する為の機構<br>デフォルト値は下記<br>[indices.breaker.fielddata.limit]<br>The fielddata circuit breaker limits the size of fielddata to 60% of the heap, by default.<br>[indices.breaker.request.limit]<br>The request circuit breaker estimates the size of structures required to complete other parts of a request, such as creating aggregation buckets, and limits them to 40% of the heap, by default.<br>[indices.breaker.total.limit]<br>The total circuit breaker wraps the request and fielddata circuit breakers to ensure that the combination of the two doesn’t use more than 70% of the heap by default.|
|FielddataCache|Elasticsearchのクエリキャッシュ機構<br>デフォルト制限なし&削除(期限)なし|

##対処方法

###暫定対応
APIでキャッシュをクリアする。
※クリア直後からElasticsearchへのクエリが反応しはじめる

```
$ curl -XPOST 'http://localhost:9200/_cache/clear' -d '{ "fielddata": "true" }'
{"_shards":{"total":1430,"successful":715,"failed":0}}
```

###恒久対応

elasticsearch.ymlに下記設定を追加しサービス再起動

###最適な値は正直わかっていないので、運用しながら要チューニング

```
indices.fielddata.cache.expire: 60m #default -1
indices.fielddata.cache.size: 30% #default 無限
```

##現状のFielddataCacheサイズを知る

- _allが全体
- fielddata.memory_size_in_bytesが該当のサイズ
- インデックス毎のサイズも見れる

```
#index毎
curl -XGET 'http://localhost:9200/_stats/fielddata/?fields=field1,field2&pretty'
```

##所感
時系列データ突っ込んでいる場合は、結構あたる問題だと思うので、expireくらいはデフォルトでつけてもいいような気が、、
突然の事で辛かった。。

##参照
https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html#circuit-breaker
http://igor.kupczynski.info/2015/04/06/fielddata.html
https://www.elastic.co/guide/en/elasticsearch/reference/1.5/cluster-nodes-stats.html
homebrew caskのインストール方法（2015/08/24時点）

遅ればせながら[Homebrew Cask](http://caskroom.io)を導入しようと思い調べてみると、Google検索で見つかる上位サイトのインストール方法に`brew tap`を使う古い方法が混じっていたので、メモを残しておきます。2015/08/24時点の情報です。

# インストール方法
ターミナルで以下のコマンドを入力します。

```shell-session
$ brew install caskroom/cask/brew-cask
```

これだけ。`brew tap 〜`はもう必要ない（`install cask room/…`の中でtapしてくれる）です。
[Git] Git patch rollback

When you want to rollback a commit.

For github, go to the github commit page, and append `.patch` to the url, then you will get the patch of this commit. Save the content to a file like `file.patch`.

Use this command to rollback this commit:

```
git apply -R file.patch
```

Then this commit will be rollbacked.



**References:**
[Reversing patches](https://www.drupal.org/patch/reverse)
Grand-Frontend-Osaka 2015 Summer 発表資料

8/22にグランフロントで行われたGrand-Frontend-Osaka 2015 Summerに登壇・参加してきました！
発表内容としては、「WebComponentsとPolymer」についてです。

備忘録代わりの資料
http://www.slideshare.net/tk_0225/webcomponentspolymer
FRPそのものからReactiveCocoa(swift2)まで

ReactiveCocoaなるものが便利と言われてもとっかかりがわからないので、
functional reactive programmingの理解に役立つ記事を読んで、
ReactiveCocoaでHello world級のことをします。

ReactiveCocoaは ```swift2``` を使います、たった今確認したところではマイルストーン「Swift 2」の進捗は84%らしいです。

# Functional Reactive Programming

そもそもリアクティブプログラミングを採用すると何がいいのか：
http://d.hatena.ne.jp/pokarim/20101226

副作用がどうこう：
http://qiita.com/hterada/items/eafeb2ce31f0d771e59e
http://qtamaki.hatenablog.com/entry/2015/01/16/135703

# ReactiveCocoa

ObjC用APIとSwift用APIは異なっている。公式的には新しくやるならSwift推奨らしい。

> __We highly recommend that all new projects use the Swift API.__

Swift1.2用→Swift2.0用でも変更が入っているのでサンプルコードを漁る時は注意が必要。
例えば ```|>``` の廃止など(https://github.com/ReactiveCocoa/ReactiveCocoa/issues/2224)

## 導入

Carthageなら

```carthage
github "ReactiveCocoa/ReactiveCocoa" "swift2"
```

で得られるReactiveCocoa.frameworkとResult.frameworkを入れればOK

## Hello, world?

こちらの方のソースならSwift2でそのままいける：
http://qiita.com/bonegollira/items/12b451046bc14ecf5d97

## 補足

swift版では配列に対して使うことができないらしい：
http://akisute.com/2014/12/reactivecocoa-swift.html

https://github.com/Wolox/ReactiveArray というものを作っている人もいる。

# 次にすること

* README.mdをちゃんと読む
* [swift2ブランチのReactiveCocoa/Documentation](https://github.com/ReactiveCocoa/ReactiveCocoa/tree/swift2/Documentation)内にある.mdを読む  
(Documentation/LegacyにあるObjC用のドキュメントやmasterブランチのドキュメントとは内容が異なっている、それらについても参考になるかもしれないしならないかもしれない)
* [swift2ブランチのReactiveCocoa/Swift](https://github.com/ReactiveCocoa/ReactiveCocoa/tree/swift2/ReactiveCocoa/Swift)内にある.swiftを読む

Swift、特にSwift2.0版についてはサンプルが少ないしそもそも未完成なので、初心者としては言語・バージョンにこだわらず勉強して待つことにします
43434343

PHPRUNNER

MASTERGRID FORM 設定
![colors.png](https://qiita-image-store.s3.amazonaws.com/0/37985/64c5983c-e16a-a9b6-e11a-af1fe6aa282e.png)

# 色々な言語で配列の重複を削除する方法

```perl:uniq.pl
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
say uniq(1, 1, 2, 3, 3);
```

（uniq関数は http://stackoverflow.com/q/7651/454997 より引用）

```ruby:uniq.rb
p [1, 1, 2, 3, 3].uniq
```

（uniqにブロックを与える書き方は http://ruby-doc.org/core-2.2.0/Array.html を参照）
iOS9などリリース予測



http://qiita.com/tomofusa/items/c795df0ebbaf668116c0
を元に今年も

# iOSのリリースの傾向

## メジャー version upと製品リリースの関係


||iOS 4 |iOS 5|iOS 6|iOS 7 |iOS 8|iOS 9|
|:-------|:-------|:------:|:------:|:-----:|:------:|:-----:|
|ベータテスト開始|2010/4/9|2011/6/6|2012/6/11|2013/6/11|2014/6/2|2015/7/10|
|GM版配布|2010/6/9|2011/10/5|2012/9/12|2013/9/10|2014/9/9|2015/9/10|
|新iPhone発表|2010/6/8|2011/10/5|2012/9/13|2013/9/10|2014/9/9|2015/9/9|
|一般配布開始|2010/6/22|2011/10/12|2012/9/20|2013/9/18|2014/9/17|2015/9/16|
|新iPhone発売|2010/6/24|2011/10/14|2012/9/21|2013/9/20|2014/9/19|2015/9/25|

※注意1：ライブラリレベルだとGMと一般配布の内容に差異がある場合も。
※注意2：.1のupdate時はGMを飛ばす場合もある。あくまでメジャーversionの傾向です。
※注意3：今年からWatchOSもupdate。iOSと同時想定。

## βリリースの傾向

<del>いくつまで出るかわかりません。GMが出るまでは、これが最終だろうと思わない方が自分のためです。
※2015/08/24時点</del>

|iOS|最終ベータ版|
|:-----:|:-----:|
|iOS 3.0|beta 5|
|iOS 4.0|beta 4|
|iOS 5.0|beta 7|
|iOS 6.0|beta 4|
|iOS 7.0|beta 6|
|iOS 8.0|beta 5|
|iOS 9.0|beta 5|


# 対策案

あくまで私見です。

* 基本は、例年通りの対策を行う。

## イレギュラー

* デバイスが増えている。Watch ＆ TV。特に未発表のTVがどのタイミングからどのような形での参入なのか。
* β提供時期が例年より遅い。かつAppleMusicのサービスなど直近のiOSリリース品質が不安定に感じている。→ iOS9自体の品質不安が残る。

```
9/9 にAppleTVも発表され、デベロッパーを募っている状況。製品リリース後も期待が持てる。
iOS9についてはtiny version upを行っているので想定通りではあるが、余り喜ばしいことではないですね。AppStoreの課金処理についても一部想定外が残る模様。
```

# reference

Thx.

* http://www.kototoka.com/entry/2014/03/10/120034
* http://tools4hack.santalab.me/ios7-beta6-release.html
* [iOS (アップル) @wikipedia](http://ja.wikipedia.org/wiki/IOS_(%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB))
* http://weekly.ascii.jp/elem/000/000/363/363911/
[Swift] TabBarでタップするTabItemがタップされたらなんかしらの処理を入れたいとき

# TabBarControllerのCustom Classを設定

HogeViewControllerとします。

# Tab Bar Item に Tag を設定

![Screen Shot 2015-08-24 at 10.20.28.png](https://qiita-image-store.s3.amazonaws.com/0/18705/07d3dec5-27ca-c430-08b4-a51715650bdc.png)

# HogeViewControllerでTagの情報を取得して、処理を入れる

以下な感じでコードを追記します。

```swift
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        switch item.tag {
        case 1:
          println("foo")
        default:
          println("bar")
        }
    }
```
[Xcode] Archive が選択できないとき

XcodeでプログラムをArchiveしたいけど、選択できない様になっていたとき。

![Screen Shot 2015-08-24 at 10.09.23.png](https://qiita-image-store.s3.amazonaws.com/0/18705/07448630-5f97-8b07-235a-0327bf948faa.png)

# 対応

Simulatorの選択のところで、実機を選ぶといいです。

![Screen Shot 2015-08-24 at 10.10.23.png](https://qiita-image-store.s3.amazonaws.com/0/18705/49b0bd90-0799-116b-29a5-b1cc7df15edb.png)

![Screen Shot 2015-08-24 at 10.12.34.png](https://qiita-image-store.s3.amazonaws.com/0/18705/71d52427-522c-39fc-c5bf-236cdf372214.png)


それだけでした。
json整形ブックマークレット

jsonデータをブラウザでいい感じに見るためのブックマークレット

お気に入り（ブックマーク）に登録して使ってね❤️

```lang:JavaScript
javascript:void new function(){var str = JSON.stringify(JSON.parse(document.body.getElementsByTagName('pre')[0].innerHTML), null, '    ');document.body.innerHTML = '<textarea style="width:100%;height:100%;font-size:14px;">' + str + '</textarea>';};
```
文字列中の特定文字を処理した後に置換する

「文字列中に含まれるローマ字をDB上のものと照合して漢字に変換したい」と考えてコードを書きました。他に例が見当たらなかったので上げておきます。

ローマ字を変換しているといっても、文字列から取得していうるのは英字なので、DBの処理の箇所を別の処理に変更すれば他の使い方もできそうです。また、正規表現の箇所を変えれば他の応用もできると思います。

```php
 <?php

require_once("dsn.php");

function romajiConvert($str) {

  // 文字列内に英字が含まれる場合
  if (preg_match("/[a-zA-Z]+/", $str)) {

    // 文字列内に含まれる英字を取り出す
    preg_match_all("/[a-zA-Z]+/", $str, $out, PREG_PATTERN_ORDER);
    $alphabet = $out[0];
    $replace = array(); // 置換用配列

    foreach ($alphabet as $az) {

      // ここからDBの処理
      // DBの地名ローマ字データと照合し、漢字に変換する
      // e.g. Tokyo -> 東京都
      global $dsn;
      $db = new PDO($dsn['host'], $dsn['user'], $dsn['pass']);
      $db->exec('SET NAMES utf8');
      $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
      $sql = "SELECT kanji FROM romaji_convert "
            . "WHERE LOWER(hebon)=LOWER(:romaji) OR LOWER(kunrei)=LOWER(:romaji)";
      $stt = $db->prepare($sql);
      $stt->bindValue(":romaji", $az, PDO::PARAM_STR);
      $stt->execute();
      $response = $stt->fetch(); 

      // DBにデータがあった場合はそれを、なかった場合は元の値を入れる
      // （str_replaceで使うため）
      if (!empty($response['kanji'])) {
        $replace[] = $response['kanji'];  
      } else {
        $replace[] = $az;
      }
    }

    // str_replace($search, $replace, $subject)
    // において、$search と $replace が配列の場合は順に置換が行われる
    // http://php.net/manual/ja/function.str-replace.php
    // e.g. 
    //    $subject = "nya wan chun";
    //    $search = ["nya", "chun"];
    //    $replace = ["にゃ", "ことりちゃん！"];
    //    $out = str_replace($search, $replace, $subject);
    //    echo $out;
    //    --- 出力結果 ---
    //    "にゃ wan ことりちゃん！"
    $str = str_replace($alphabet, $replace, $str);
  }

  return $str;
}

?>
```
CI 上で assets:precompile をする時になるたけ早くする

Circle CI でも travis-ci でもなんでもいいんですが、とにかくデプロイ用に用意する assets:precompile を早くしたいというあなたむけの記事です。

`bin/rake assets:precompile` は `public/assets` 以下に配信用の assets を吐き出し、 manifest.json なども配置されますが、この `public/assets` ディレクトリをキャッシュするだけでは、次回の `bin/rake assets:precompile` は早く__なりません__。

継続的な `bin/rake assets:precompile` の実行を高速化するには `public/assets` だけでなく、 `tmp/cache/assets` も保存しておき、 `assets:precompile` 実行前に再配置しておく必要があります。

これにドはまりすると『CI 一回実行するのに、 `assets:precompile` だけで8分かかる……』というような悲しい Tweet をするハメになるので気をつけてください。特に、 `browserify-rails` などを使っている時に強烈に効きます。

僕の所はこれやるだけで8分かかってた `assets:precompile` が（変更がなければ）3秒で終わるようになったので、はちゃめちゃに効くと思います。

騙されたと思ってやってみてください。

ちなみに Circle CI で上記のことを実現するには、 `circle.yml` に

```
dependencies:
  cache_directories:
    - 'public/assets'
    - 'tmp/cache/assets'
```

と書き足すといいです。
【デザインパターン】 Commandパターン

##概要
命令とそれに伴うパラメータをカプセル化したパターン

以下の5種類のクラスからなる
1. Commandクラス(命令のインタフェースを定義)
2. ConcreteCommandクラス(1.のインタフェースを実装)
3. Clientクラス(2.を生成してそれに対する5.を設定する)
4. Invokerクラス(1.で定義されているインタフェースを呼び出す)
5. Receiverクラス(1.の処理対象となるオブジェクトのインタフェース)

##具体例と実装
家事手伝いロボットを例にすると、

上記1~5はそれぞれ

1. 命令クラス(Commandクラス、家事を行うための命令)
2. 掃除クラス、洗濯クラス、炊事クラス(CleanUpCommandクラス、WashingCommandクラス、CookingCommandクラス、掃除、洗濯、炊事の命令のクラス)
3. ロボット所有者クラス(RobotUserクラス、家事手伝いロボットの所有者) 
4. 命令入力用リモコンクラス(Controllerクラス、家事手伝いロボットへの命令を出す)
5.家事手伝いロボットクラス(HouseWorkRobbotクラス、家事手伝いロボット)

が対応する。
コードの詳細は以下

```rb:command.rb
class Command
  def initialize
    @robot = HouseWorkRobbot.new()
  end

  def do()
  end

  def cancel()
  end
end
```

```rb:clean_up_command.rb
class CleanUpCommand < Command
  def do()
    @robot.do_clean_up
  end

  def cancel()
    @robot.cancel_clean_up
  end
end
```

```rb:washing_command.rb
class WashingCommand < Command
  def do()
    @robot.do_washing
  end

  def cancel()
    @robot.cancel_washing
  end
end
```

```rb:cooking_command.rb
class CookingCommand < Command
  def do()
    @robot.do_cooking
  end

  def cancel()
    @robbot.cancel_cooking
  end
end
```

```rb:robot_user.rb
class RobotUser
  def initialize()
    @controller = Controller.new
  end

  def clean_up()
    @controller.clean_up()
  end

  def washing()
    @controller.washing()
  end

  def cooking()
    @controller.cooking()
  end

  def cancel()
    @controller.cancel()
  end
end
```

```rb:controller.rb
class Controller
  def clean_up
    clean_up_command = CleanUpCommand.new
    do(clean_up_command)
  end

  def washing
    washing_command = WashingCommand.new
    do(washing_command)
  end

  def cooking
    cooking_command = CookingCommand.new
    do(cooking_command)
  end

  def cancel
    @previous_command.cancel()
  end

  private

  def do(command)
    command.do
    @previous_command = command
  end
end
```

```rb:house_work_robbot
class HouseWorkRobot
  def do_clean_up
   # 掃除をする
  end

  def cancel_clean_up
    # 掃除をやめる
  end

  def do_washing
   # 洗濯をする
  end

  def cancel_washing
    # 洗濯をやめる
  end

  def do_cooking
   # 炊事をする
  end

  def cancel_cooking
    # 炊事をやめる
  end
end
```
##メリット
* オペレーションの呼び出しをするオブジェクトと実行するオブジェクトを分離する
* 複数のCommandオブジェクトを合成することが出来る
* 新しいCommandの追加が容易に行える

##まとめ
オブジェクトに対する要求自体をオブジェクトにすることで、あるオブジェクトに対して複数の要求を組み合わせて送りたいときに便利なパターン
DockerHubからDockerfileを確認するスクリプト

API探したけど探しきらなかった。

要: pandoc

```bash:check_dockerfile.sh
set -eu
if [ ! $# -eq 1 ];then
    echo "usage: $0 'docker image name'"
    echo "   ex: $0 tukiyo3/ubuntu-dev"
    exit 1
fi

IMAGE=$1
URL="https://hub.docker.com/r/$IMAGE/~/dockerfile/"

pandoc --no-wrap -f html -t markdown $URL  |
awk '
BEGIN{RS="\n\n"}
/FROM/{print}
' |
sed -e 's/RUN/\nRUN/g' \
    -e 's/ENTRYPOINT/\nENTRYPOINT/g' \
    -e 's/VOLUME/\nVOLUME/g' \
    -e 's/ENV/\nENV/g' \
    -e 's/EXPOSE/\nEXPOSE/g' \
    -e 's/CMD/\nCMD/g' \
    -e 's/\\\\/\n/g' \
    -e 's/\\//g' \
    -e 's/#/\n#/g'
echo
echo open $URL
```

* 変換しやすいように、htmlをmarkdownに変換、行の折り返しを無効(pandoc)
* FROMから始まり、"\n\n"までの複数行を取得(awk)
* 改行コードが消えているので挿入(sed)

## 使い方

```bash:
sh check_dockerfile.sh tukiyo3/ubuntu-dev
```

おかしい箇所あるが欲しい情報は取れる。
さらに確認したい場合は出力されるURLをブラウザで確認。
Vagrant AWS Provider プラグインでEC2インスタンスを使う

今さらながらVagrantでAWS Provider（Virtual Box の仮想マシンではなく、EC2インスタンスを使うやつ）を使ってみたのでメモ

## 事前にAWSプラグインをいれましょう

```
$ vagrant plugin install vagrant-aws
```

## Vagrantfile

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "dummy"
  config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
  config.ssh.pty = true
  config.vm.provider :aws do |aws, override|
    aws.access_key_id = "AWSNOACCESSKEY"
    aws.secret_access_key = "AWSNOSECRETKEY"
    aws.ami = "ami-cbf90ecb"
    aws.instance_type="t2.micro"
    aws.security_groups=["sg-873248e2"]
    aws.keypair_name = "newgyu-dev1"
    aws.region = "ap-northeast-1"
    aws.associate_public_ip = true
    aws.subnet_id = "subnet-be3dbdc9"
    override.ssh.username="ec2-user"
    override.ssh.private_key_path = '~/.ssh/newgyu-dev1.pem'
  end
  config.vm.synced_folder "../playbook", "/playbook"
end
```

### providerとして```:aws```を指定

https://github.com/mitchellh/vagrant-aws/blob/master/README.md に書いてあるとおりですが、

```ruby
config.vm.provider :aws do |aws, override|
   :
end
```

で囲ったブロック内に aws.* , override.* に対する設定を書きます。

### boxファイルはダミーのものを指定する

```ruby
config.vm.box = "dummy"
config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
```

ここは素直に。

### AWSでEC2インスタンスのcreate,dropができるユーザーのAPIキーを指定

```ruby
aws.access_key_id = "AWSNOACCESSKEY"
aws.secret_access_key = "AWSNOSECRETKEY"
```

必須ですね。ベタに書きたくない場合は環境変数から取得するように、

```ruby
aws.access_key_id = ENV["AWS_ACCESS_KEY"]
aws.secret_access_key = ENV["AWS_SECRET_KEY"]
```

とかでもいいです。（このへんはVagrantfileはrubyなのでrubyの書式を利用する感じです）

### 通常はインターネット経由での利用になるのでpublic_ipで

自分の場合はVPCを設定していたので、

* VPCの中に公開サブネット
* インターネット越しにsshが通るセキュリティグループ

を事前にAWS Consoleで作っておく必要がありました。

```ruby
aws.security_groups=["sg-873248e2"]
aws.associate_public_ip = true
aws.subnet_id = "subnet-be3dbdc9"
```

VPCなしの直EC2の場合はたぶんセキュリティーグループでsshが通るようにだけすればいいと思います。

### ```vagrant ssh```できるように

```ruby
aws.keypair_name = "newgyu-dev1"
override.ssh.username="ec2-user"
override.ssh.private_key_path = '~/.ssh/newgyu-dev1.pem'
```

* keypair_nameを指定するとそのキーペアをEC2インスタンスに設定してくれます
 無指定だとどうなるのかは試していません。（新たにキーペアつくるのかな？）
* ssh.usernameの指定はほぼ必須だと思われます
* ssh.private_key_pathは指定したキーペアの秘密鍵の方を指定します。

### synced_folderを使う場合

```ruby
config.ssh.pty = true
config.vm.synced_folder "../playbook", "/playbook"
```

まず、AWSプロバイダーを使った場合のsynced_folderはrsync over sshで実現されています。
そのためVagrantファイルの設定でsshログインしてsudoできるようにしておく必要があります。それは上記のec2-userによるssh接続設定をすることでクリアしているはずなのですが、sudoができなくて怒られます。
最近のAmazon LinuxのAMIの初期sudoersにはrequirettyという設定が組み込まれていて、ttyを介さない接続でのsudoをさせないようにしているのが原因とのことで、```config.ssh.pty```の設定をすることでttyっぽく振る舞ってくれるようです。

## いざ起動

```
$ vagrant up --provider=aws
```

```--provider```オプションをお忘れなく。
railsのcssフレームワークでbootstrapの代わりにuikitを使う


# 1. uikitとは

皆さん，uikitというcssフレームワークはご存知でしょうか．
知らない方はこちらが参考になると思うので，どうぞ．

[BootstrapユーザーがUIkitに乗り換えるべき３つの理由](http://designup.jp/bootstrap-uikit-127/)

# 2. uikitをrailsで使う

[uikit-sass-rails](https://github.com/cworreschk/uikit-sass-rails)
gemで提供されているので，お手軽に使いたいならこれだと思います．
Gemfileに`gem 'uikit-sass-rails'`と書いてapplication.js, application.cssに数行付け足すだけで使えます．

# 3. uikit-sass-railsのバグ

requireする順序がおかしいせいでprecompileして一つのjsになると，jsが正しく動作しなくなる不具合があります．
パッチを書いてPRは送ってあるのですが，見ていないのかマージされる様子がないようです．

とりあえず，現状では

```rb
gem 'uikit-sass-rails', git: 'https://github.com/8398a7/uikit-sass-rails'
```

をとすれば，productionでも問題なく動作します．
[java8] 8回目：文字列結合に新しい仲間が追加

[前回：[java8] 7回目：インタフェースのデフォルト実装　～菱形継承～]
http://qiita.com/yuusuke_s/items/b7a310a5bad7905581f5

お久しぶりです。
そろそろJava8の記事から離れようと思ったのですが、、、
文字列結合周りで便利そうなクラスた加わっていたので、簡単にご紹介。

SDKの標準にこういうクラスが追加されていくのは、地味に便利だなぁと感じています。

## java.util.StringJoinerによる結合

### 単純な結合
引数なしのコンストラクタがあっても良いのでは？と思ったり。

``` java
public class StringJoinSample {

	public static void main(String[] args) {
		StringJoiner sample1 = new StringJoiner("");
		sample1.add("aaaa").add("bbbb").add("cccc");
		System.out.println(sample1);
	}
}
```

結果
> aaaabbbbcccc

### 区切り文字を含む結合

``` java
public class StringJoinSample {

	public static void main(String[] args) {
		StringJoiner sample1 = new StringJoiner("|");
		sample1.add("aaaa").add("bbbb").add("cccc");
		System.out.println(sample1);
	}
}
```

結果
> aaaa|bbbb|cccc

### 区切り文字＋Prefix、Suffixを含む結合

``` java
public class StringJoinSample {

	public static void main(String[] args) {
		StringJoiner sample1 = new StringJoiner("|", "【", "】");
		sample1.add("aaaa").add("bbbb").add("cccc");
		System.out.println(sample1);
	}
}
```

結果
> 【aaaa|bbbb|cccc】


## java.util.stream.Collectors#joiningによる結合
上記の３パターンをまとめて紹介しています。
streamのcollectメソッドの引数に、Collectorsインタフェースの実装を渡すようですね。

``` java
public class StringJoinSample {

	public static void main(String[] args) {
		List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");

		// 単純な結合
		System.out.println(list.stream().collect(Collectors.joining()));


		// 区切り文字を含む結合
		System.out.println(list.stream().collect(Collectors.joining("|")));


		// 区切り文字＋Prefix、Suffixを含む結合
		System.out.println(list.stream().collect(Collectors.joining("|", "【", "】")));
	}
}
```

結果
> aaaabbbbcccc
aaaa|bbbb|cccc
【aaaa|bbbb|cccc】



## 最後に
通常のStringやStringBuilderを使ってももちろん同じことはできますが、
新しいものや便利なものは、取り入れていきたいなと個人的には思っています。
【デザインパターン】 Interpreterパターン

##概要
言語に対して、文法表現と、それを使用して文を解釈するインタープリタを一緒に定義するパターン

以下の4種類のクラスからなる
1. Abstract Expressionクラス(表現のインターフェイスを定義する)
2. Terminal Expressionクラス(階層構造の終端の表現を実装)
3. NonTerminal Expressionクラス(階層構造の節の表現を実装)
4. Contextクラス(2,3が構文解析をおこなう上でのグローバルな情報を含む)

##具体例と実装
英文法と翻訳を例にすると、

上記1~4はそれぞれ

1. 英文クラス(EnglishGrammerクラス。英文を解釈するインターフェイスを定義)
2. 各種品詞クラス(Nounクラス、Verbクラス、Adjectiveクラス。英文を最小単位に分解した品詞部分の解釈を行う)
3. 各種成分クラス(Subjectクラス、Predicateクラス、Objectクラス。英文を構造毎に分解した文の成分の解釈を行う)
4. 原文クラス(OriginalSentenceクラス。今回は未定義)

が対応する。
コードの詳細は以下

```rb:english_grammer.rb
class EnglishGrammer
  def interpret(sentence)
  end
end
```

```rb:noun.rb
class Noun < EnglishGrammer
  def interpret(parts_of_speech)
    # 名詞を解釈
  end
end
```

```rb:verb.rb
class Verb < EnglishGrammer
  def interpret(parts_of_speech)
    # 動詞を解釈
  end
end
```

```rb:adjective.rb
class Adjective < EnglishGrammer
  def interpret(parts_of_speech)
    # 形容詞を解釈
  end
end
```

```rb:subject.rb
class Subject < EnglishGrammer
  def interpret(sentence_element)
    # 主語を解釈
  end
end
```

```rb:predicate.rb
class Predicate < EnglishGrammer
  def interpret(sentence_element)
    # 述語を解釈
  end
end
```

```rb:object.rb
class Object < EnglishGrammer
  def interpret(sentence_element)
    # 目的語を解釈
  end
end
```


##メリット
* 文法規則を表現するためにクラスを使っているため、文法の変更や拡張が容易

##まとめ
ドメイン特化言語を実装する際に使用するパターン
バイトオーダー > little endian / big endian > 判別用変数 > 1を入れておいて判別

引用: オンラインゲームのしくみ: Unityで覚えるネットワークプログラミング by 河田匡稔（まさとし）さん
7.4 プログラムを動かしてみよう

> - エンディアンの判定
変数endianに判別用の数値1を代入します。このendianをBitConverterクラスでbyte[]型の値に変換します。このとき、ビッグエンディアンであれば最上位4バイトは0になっています。リトルエンディアンであればメモリ配置順が逆になるので、最上位バイトは1になっています。

```
ビッグエンディアン 00 00 00 01
リトルエンディアン 01 00 00 00
```
通信 > パケットとシリアライザ > byte[]型の変数１つにまとめる

引用: オンラインゲームのしくみ: Unityで覚えるネットワークプログラミング by 河田匡稔（まさとし）さん
7.4 プログラムを動かしてみよう

> - パケットとシリアライザ
...
そこで、構造体の変数すべてをひとつひとつ変換して、byte[]型の変数1つにまとめることで、パケットをまるごと送信できるようにします。
...
パケットデータを渡すとbyte[]型のデータへ<font color=red>シリアライズ</font>し、byte[]型データを渡すと構造体のデータへ<font color=red>デシリアライズ</font>してくれる、...
c++/stl > ABI問題の回避 > STLと例外を回避する

引用: C++のためのAPIデザイン by マーティン・レディ
12.1 プラグインによる拡張

> 12.1.3 C++でのプラグイン実装
...
- STLと例外を回避する
std::stringやstd::vectorなど、STLクラスの異なる実装間ではABI互換性がない可能性がある。そこで、こうしたコンテナは、コアAPIとプラグインAPI間の関数呼び出しでは避けること。同様に、例外もコンパイラ間のABIが安定しないため、プラグインAPIでは回避したほうがよい。

http://stackoverflow.com/questions/8395742/stl-containers-and-binary-interface-compatibility
c++ > ABI問題の回避 > extern "C"で宣言する

引用: C++のためのAPIデザイン by マーティン・レディ
12.1 プラグインによる拡張

> 12.1.3 C++でのプラグイン実装
...
- 自由関数にはCリンケージを使用する
プラグインAPIのすべてのグローバル関数はCリンケージを使ってC++のABI問題を回避すること。つまり、`extern "C"`で宣言する。同じく、プラグインがコアAPIに渡す関数コールバックも、Cリンケージを使って移植可能性を最大にするとよい。

...

3ページほどあとで以下の定義がある

```
// pluginapi.h
...
#define CORE_FUNC extern "C" CORE_API
#define PLUGIN_FUNC extern "C" PLUGIN_API
```

CORE_FUNCやPLUGIN_FUNCを使うことで、Cリンケージでの宣言となる。
c/c++ > C++の仕様では特定のABI定義はない。...バイナリ互換性のないコードが生成される可能性がある。

引用: C++のためのAPIデザイン by マーティン・レディ
12.1 プラグインによる拡張

> - CとC++
> バージョン管理の章で解説したとおり、C++の仕様では特定のABI(アプリケーションバイナリインターフェース）定義はない。そこで、コンパイラが異なれば、また、同じコンパイラでもバージョンが異なれば、バイナリ互換性のないコードが生成される可能性がある。
...
プレーンCのABIは十分定義されているため、プラットフォームやコンパイラの違いを超えて動作する。

https://en.wikipedia.org/wiki/Application_binary_interface

http://stackoverflow.com/questions/2171177/what-is-application-binary-interface-abi
-【デザインパターン】 Flyweightパターン

##概要
多数の細かいオブジェクトを効率よくサポートするために共有を利用するパターン

以下の5種類のクラスからなる
1. Flyweightクラス(インスタンスを再利用するためのインターフェイスを定義)
2. Concrete Flyweightクラス(1.のインターフェイスを実装)
3. UnsharedConcreteFlyweightクラス(ConcreteFlyweightオブジェクトを子として管理する)
4. Flyweight Factoryクラス(flyweightを生成、管理する)
5. Clientクラス(flyweightへの参照を保持する)

##具体例と実装
文書作成エディタを例にすると、

上記1~5はそれぞれ

1. 文字イメージクラス(Glyphクラス。文字入力のためのインターフェイスを定義)
2. 文字クラス(Characterクラス。文字入力のインターフェイスを実装)
3. 今回はなし
4. 文字ファクトリークラス(CharacterFactoryクラス。文字を生成)
5. ユーザクラス(Userクラス、文書を作成する) 

が対応する。 
コードの詳細は以下

```rb:glyph.rb
class Glyph
  def draw
  end
end
```

```rb:character.rb
class Character < Glyph
  def initialize(character, font)
    @character = character
    @font = font
  end

  def draw
    # @character, @fontの元に文字を描画
  end
end
```

```rb:character_factory.rb
class CharacterFactory
  def initialize()
    @characters = Hash.new
  end

  def create_character(character, font)
    character = @characters[character][font]
    if character.nil?
      @characters[character][font] = Character.new(character, font)
    else
      character
    end
  end
end
```

```rb:user.rb
character_factory = CharacterFactory.new

character_factory.create_character('s', :utf8).draw
character_factory.create_character('u', :utf8).draw
character_factory.create_character('c', :utf8).draw
character_factory.create_character('c', :utf8).draw
character_factory.create_character('e', :utf8).draw
character_factory.create_character('s', :utf8).draw
character_factory.create_character('s', :utf8).draw
```
##メリット
* オブジェクトをflyweightとして共有することによってメモリが節約できる

##まとめ
再利用できるインスタンスが存在し、プログラムを省リソース化したい際に利用するパターン
Material関連のエラーが出たので対処


先ほど新しくプロジェクトを作ったら以下のようなエラーが出ました。

```
Error:(2) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
Error:(2) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.
```

その時点の`build.gradle`はこちら。

```java:build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "com.hatenablog.shoma2da.sample_library"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.0'
}
```

`compileSdkVersion`を変えれば直りました。

```java:build.gradle
    compileSdkVersion 23
```
プログラマなのに知らなかったら恥ずかしい英単語集


##1. send, deliver, dispatch, announce, distribute, route
[send](http://ejje.weblio.jp/content/send) : (命令・依頼などによって)行かせる、送る
[deliver](http://ejje.weblio.jp/content/deliver) : 配達する; 引き渡す，明け渡す; 手渡す
[dispatch](http://ejje.weblio.jp/content/dispatch) : 〈軍隊・特使などを〉〔…へ〕急派する，特派する
[announce](http://ejje.weblio.jp/content/announce) : 人に〕〈…を〉知らせる，発表する
[distribute](http://ejje.weblio.jp/content/distribute) : 〈ものを〉〔…に〕分配する
[route](http://ejje.weblio.jp/content/route) : 貨物などを〉〔…のルートで〕発送する

##2. find, search, extract, locate, recover
[find](http://ejje.weblio.jp/content/find) : (努力して)見つけ出す 
[search](http://ejje.weblio.jp/content/search) : (何かを見つけようとして注意深くまたは徹底的に)捜す
[extract](http://ejje.weblio.jp/content/extract) : 〈エキスなどを〉〔…から〕抽出する
[locate](http://ejje.weblio.jp/content/locate) : 〈…の〉位置を突き止める 
[recover](http://ejje.weblio.jp/content/recover) : 〔廃物などから〕〈有用なものを〉取り出す，再生する

##3. start, launch, create, begin, open

[start](http://ejje.weblio.jp/content/start) : 〔仕事などを〕始める; 〔…に〕着手する
[launch](http://ejje.weblio.jp/content/launch) : 〈矢・やりなどを〉放つ; 〈ミサイルなどを〉発射する，発進させる，打ち上げる.
[create](http://ejje.weblio.jp/content/create) : 〈新事態・騒動などを〉引き起こす
[begin](http://ejje.weblio.jp/content/begin) : 〈仕事などを〉始める，着手する 
《★【比較】 start のほうが口語的》
[open](http://ejje.weblio.jp/content/open) : 〈ドア・目・容器・包み・手紙などを〉あける



##4. make, create, set up, build, generate, compose, add, new
[make](http://ejje.weblio.jp/content/make) : 〈ものを〉作る，造る
[create](http://ejje.weblio.jp/content/create) : 〈独創的なものを〉創作する; 〈新型を〉考案する
[set up](http://ejje.weblio.jp/content/set+up) : 〈小屋などを〉建てる; 〈バリケードなどを〉築く
[build](http://ejje.weblio.jp/content/build) : 建てる 
《★【類語】 build は通例家・橋・船・帝国など大きなものを造る; make は小さいものを作る》
[generate](http://ejje.weblio.jp/content/generate) : 生成する
（語源：ラテン語「生み出す」の意）
[compose](http://ejje.weblio.jp/content/compose) :〈集められた素材が〉〈ものを〉構成する，〈…の〉基礎をなす
（語源：［ラテン語「組み立てる」の意）
[add](http://ejje.weblio.jp/content/add) : (他のものに)加える，追加する
[new](http://ejje.weblio.jp/content/new) : 新しい

[](http://ejje.weblio.jp/content/) 


　
　
参考文献：[リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell](http://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655)
install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC の対処法

.plからMySQLに接続しようとして、下記エラーが出た場合の対処法。

    install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 8) line 3.
    Perhaps the DBD::mysql perl module hasn't been fully installed,
    or perhaps the capitalisation of 'mysql' isn't right.
    Available drivers: DBM, ExampleP, File, Gofer, Proxy, Sponge.

下記を実行する。

    yum install "perl(DBD::mysql)"
[MySQL]AWS(RHEL7)x64へのMySQLインストール手順

rootになる。

	yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
	yum -y install mysql-community-server
	mysqld --version
	systemctl enable mysqld.service
	systemctl start mysqld.service

rootのパスワードを設定する

	mysql -u root
	update mysql.user set password=password('任意のパスワード') where user = 'root';
	flush privileges;
Django - startprojectせずにプロジェクトスタート

Django Newbieの浅い知識ですが、備忘録として書いておきます。

# はじめに
Djangoで新規プロジェクトを作成する際、コマンドラインに

`$ django-admin startproject project_name`

と入力することでプロジェクトを始めることが多いのではないか思います。
このコマンドによって、Django 1.8では以下のようなディレクトリレイアウトでプロジェクトが自動的に作られます。

```
project_name/
    manage.py
    project_name/
        __init__.py
        settings.py
        urls.py
        wsgi.py
```

Newbieの自分からしたら、最初からここまで準備してくれるのはとても助かるのですが、実はこれらの自動作成されたファイルなしでも、自分好みの初期状態でプロジェクトを作成する方法があるらしいのです。

#いざ。
では、早速プロジェクトを作成していきましょう。
今回は一つのpythonファイルを使って、ブラウザ上に「Hello, World!」と出力してみたいと思います。
適当なディレクトリにhello.pyというファイルを作成します。
##まずは、viewから
最初にviewを作成していきます。とは言ってもとても簡単で、

```python:hello.py
from django.http import HttpResponse

def index(request):
    return HttpResponse('Hello, World!')
```
と入力するだけです。requestを待ち受けて、文字列を返します。
これは本来はview.pyに記述する内容です。

##URL Patterns
次に、urlpatternsの設定です。正規表現パターンによって、どのurlに対するrequestに、どのviewを返すかを決めていきます。
今回は、一つの文字列を表示するだけなので、urlのパターンは一つだけです。これもhello.pyに書き加えていきます。

```python:hello.py
...
from django.conf.urls import url

urlpatterns = {
    url(r'^$', index),
}
```

##settings
ここで、ROOT_URLCONFや、MIDDLEWARE_CLASSESなど、デフォルトプロジェクトではsettings.pyに記述されている重要な設定のうち最低限必要なものをhello.pyに加えていきます。

```python:hello.py
...
from django.conf import settings

settings.configure(
    DEBUG = True,
    SECRET_KEY = 'secretkey',
    ROOT_URLCONF = __name__,
    MIDDLEWARE_CLASSES = (
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    )
)
```

主なコードは以上です。どうでしょうか。デフォルトのプロジェクトと比べると心配になるくらい少ない記述ですが、これだけでもしっかりとDjangoのプロジェクトとして機能します。

このプロジェクトを起動するために、sysをimportをしておきます。

```python:hello.py
import sys

...

if __name__ == '__main__':
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)
```

以上です。
コマンドラインで、
`
$ python hello.py runserver
`

と入力します。すると、デフォルトプロジェクトのmanage.pyから起動した時と同じ文字列がコマンドラインに現れて、http://127.0.0.1:8000/ にアクセスすると、予定通り「Hello, World!」と表示されていると思います。

##何が嬉しいの?
さて、このように自分でスクラッチからプロジェクトを作成して何が嬉しいかというと、自分で作成したプロジェクトをテンプレとして、違うプロジェクトを作成することができるからです。
例えば、今作成したhello.pyを以下のようなディレクトリに置くとします。

```
hello/
    hello.py
```

この場合、helloというのがプロジェクト名になります。
では、このhelloプロジェクトを基に新しいプロジェクトを作成してみようと思います。

helloプロジェクトと同じディレクトリで、以下のコマンドを入力します。
`
$ django-admin startproject hoge --template=hello
`
すると、Djangoのデフォルトのプロジェクトレイアウトではなく、

```
hoge/
    hello.py
```

のようなレイアウトでプロジェクトがスタートします。
テンプレさえ作っておけば、作成するプロジェクトの規模、機能などによってレイアウトを自由に変えられるのです。

以上、また発見があれば投稿したいと思います。
[Perl]AWS(RHEL7)x64へのLWPインストール手順

前提：PuTTY接続済みであること

rootになる。

	yum install perl
	perl -v
	rpm -Uvh http://fr2.rpmfind.net/linux/dag/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
	yum install epel-release
	yum install wget
	wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
	rpm -Uvh epel-release-7*.rpm
	yum clean all
	yum install libyaml
	yum list --cacheonly libyaml libyaml-devel
	yum -y install *YAML*
	yum install cpan
	yum -y install perl-libwww-perl
	perl -MCPAN -e shell
	cpan> o conf prerequisites_policy follow
	cpan> o conf commit
	cpan> upgrade
	cpan> install YAML
	cpan> install Bundle::LWP
	cpan> install HTML::Tree
	cpan> install HTML::Format
	cpan> install LWP::Protocol::https
	cpan> exit
	perl -MLWP -le "print(LWP->VERSION)"
→ バージョン番号を確かめる。

.plを下記のように実装する。LWPのバージョンを前述の番号と合わせる。

	use LWP 6.05;
	my $browser = LWP::UserAgent->new;
	my $url = "http://www.yahoo.co.jp";
	my $response = $browser->get( $url );
	print $response->decoded_content;

.plを実行してyahooのソースが表示されたらOK。
Rails - CSVダウンロード（サービスオブジェクト）



#経緯

- 以前、[.csv.rubyビューテンプレートでCSVダウンロード](http://qiita.com/mnishiguchi/items/2e63dbe977cd278a4396)を実装してみたことがある。
- サービスオブジェクトとして実装する方が綺麗に書けることに気がついたのでメモ。

#特徴

- サービスとしてMVCから切り離すので、アプリ本体をシンプルに保てる。
- （ビューテンプレートなしに）各種ビューヘルパーへのアクセスが可能。
- どのコントローラでも使用可能。

#やり方

##CSVモジュールを`require`

```rb:/config/application.rb
require File.expand_path('../boot', __FILE__)

require 'csv'
require 'rails/all'
# ...
```

##サービスオブジェクト

```rb:/app/helpers/csv_helper.rb
module CsvHelper

  class SendUsersCSV

    def initialize(users, controller)
      @users      = users
      @controller = controller
      @view       = controller.view_context
      send_csv
    end

    def send_csv
      # http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-headers
      @controller.send_data render_csv,
        type:        "application/csv",
        filename:    "users-#{Date.today}.csv",
        disposition: "attachment"
    end

    def render_csv
      # Set options if needed (e.g. :col_sep, :headers, etc)
      # http://ruby-doc.org/stdlib-2.0.0/libdoc/csv/rdoc/CSV.html#DEFAULT_OPTIONS
      options = { headers: true }

      attributes = %w(id username sign_in_count created_at confirmed_at updated_at)

      @output = CSV.generate(options) do |csv|
        # Column names in a first row
        csv << attributes

        # Write each record as an array of strings
        @users.unscoped.each do |user|
          csv << attributes.map{ |attr| user.send(attr) }
        end
      end
      @output
    end
  end
end
```

##コントローラ

```rb
class UsersController < ApplicationController
  include CsvHelper

  def index
    @users =  User.all

    respond_to do |format|
      format.html
      format.csv { SendUsersCSV.new(@users, self) }
    end
  end
end
```

##`users_path(format: "csv")`へのリンク

```rb:/app/views/users/index.html.haml
= link_to "CSVダウンロード", users_path(format: "csv"), class: "btn btn-warning"
```

##テスト

http://qiita.com/mnishiguchi/items/2e63dbe977cd278a4396#%E3%83%86%E3%82%B9%E3%83%88

#資料

- https://github.com/railscasts/362-exporting-csv-and-excel
- https://github.com/railscasts/153-pdfs-with-prawn
- http://qiita.com/mnishiguchi/items/2e63dbe977cd278a4396#%E8%B3%87%E6%96%99
JXA で Google Chrome を Incognito Window (シークレットモード) で開き直す

# プライベートブラウジングについて

私は普段、 OS X 上の Google Chrome で Web ブラウジングしている。

セキュリティ上の懸念というか、潔癖症のようなものを感じていて、
メインで使うブラウザでは日をまたいで Cookie を残したくない。
最近は、ほとんど常に Incognito Window にしている。
(Incognito Window はシークレットモードとかプライベートブラウジングという呼ばれ方もしているアレ)

頻繁にログインするようなサイトは Fluid で専用アプリ化している。
なのでログイン時に認証を求められることが多くて困るようなことはない。
Fluid で分けてしまえばサイトごとに Cookie が分断されるので万が一の時にも安心。

# 問題点

ひとつだけ困ることといえば、 Google Chrome を最初に立ち上げた時にノーマルモードで立ち上がってしまうこと。

[OS X 版 Google Chrome の起動時に立ち上がるウインドウをシークレットモードに](http://qiita.com/kitsuyui/items/d7d53141e2c252ee10b9)

で書いたような工夫をしてみたが、 Selenium が動作しなくなったり Chrome Secure Storage へのアクセス権を尋ねるポップアップが出るようになったりと、解決方法として使えるものではなかった。


# 解決方法

次のよう方針を考えた。

- Google Chrome のウインドウを取得する。
- ノーマルモードならすべてのタブの URL を記録し、閉じていく。
- 記録した URL をシークレットモードで開き直す。

これを JXA で実装した。
これを定期的に実行すれば良さそう。

# コード

```js
#!/usr/bin/env osascript -l JavaScript

main();

function main() {
  if (!isAppWaking('Google Chrome')) {
      return;
  }
  restrictChromeIncognito();
}

function isAppWaking(appName) {
  var se = Application('System Events');
  return se.processes().some(function (process) {
    return process.name() === appName;
  });
}

function restrictChromeIncognito() {
  var alreadyOpenIncognito = false 
    , reopenUrls = [] 
    , chrome = Application('Google Chrome')
    ;
  chrome.windows().forEach(function (window) {
    var mode = window.mode();
    if (mode === 'incognito') {
      alreadyOpenIncognito = true; 
      return;
    }
    window.tabs().forEach(function (tab) {
      var url = tab.url();
      reopenUrls.push(url);
    });
    window.close();
  });
  if (!alreadyOpenIncognito) {
    chrome.Window({mode: 'incognito'}).make()
  }
  openUrls(chrome, chrome.windows[0], reopenUrls);
}

function openUrls(chrome, window, urls){
  urls.forEach(function (url) {
    var newTab = chrome.Tab({url: url});
    window.tabs.push(newTab);
  });
}
```
SQLiteのdbにファイルを保存する方法

BLOB型に保存すれば良い。
やり方は[DBD::SQLite - search.cpan.org #Blobs](http://search.cpan.org/~ishigaki/DBD-SQLite-1.48/lib/DBD/SQLite.pm#Blobs) ほぼそのまま。

# 準備

```bash
$ sqlite a.db
sqlite> create table image (id integer primary key, data blob);
```

# 入力、出力

```pl:a.pl
use strict;
use warnings;
use DBI;

# 入力画像データ
my $i_img = `cat meshi.jpg`;

# a.dbを開く
my $dbh = DBI->connect("dbi:SQLite:dbname=a.db") or die $DBI::errstr;

# 画像データを入力
my $i_sth = $dbh->prepare("INSERT INTO image (data) values (?)");
$i_sth->bind_param(1, $i_img, DBI::SQL_BLOB);
$i_sth->execute();
$i_sth->finish();

# 画像データをDBから取得
my $o_sth = $dbh->prepare("SELECT data FROM image WHERE id=1");
$o_sth->execute();
my $row = $o_sth->fetch();
my $o_img = $row->[0];
$o_sth->finish();

# 画像データをファイルに出力
open my $fh, ">:raw", "image.dat";
print $fh $o_img;
close $fh;

```

```bash
$ perl a.pl
$ ll
-rw-r--r-- 1 ymko users 591872  8月 24 00:48 a.db
-rw-r--r-- 1 ymko users    529  8月 24 00:48 a.pl
-rw-r--r-- 1 ymko users  73429  8月 24 00:48 image.dat
-rw-r--r-- 1 ymko users  73429  8月 23 06:34 meshi.jpg
```

なお、db上のデータを消してもdbのファイル容量は減らない。
vacuumコマンドで減る。

# 参考

How can I load an image file into a blob in SQLite using Perl? - Stack Overflow
http://stackoverflow.com/questions/997599/how-can-i-load-an-image-file-into-a-blob-in-sqlite-using-perl
意訳：私はDB上に画像データを保存するのは如何なものかと思うけど、DBI::SQLiteのサンプルにあるからこれでできるよ。

DBD::SQLite - search.cpan.org
http://search.cpan.org/~ishigaki/DBD-SQLite-1.48/lib/DBD/SQLite.pm#Blobs

Working with images in SQLite with Perl
http://zetcode.com/db/sqliteperltutorial/images/


空き領域の開放(VACUUM文) - SQLite入門
http://www.dbonline.jp/sqlite/manage/index1.html
適当にはじめるboot2docker

# 適当にはじめるboot2docker

## dockerすごい
- とにかく早い
- ちょっとアレ試したい
- コマンドが結構複雑だけど、GUIも出てる

## boot2dockerをインストール

公式サイトにとびインストール、その後boot2dockerを起動

-> アプリケーションからboot2dockerを選ぶと環境変数などを初期化した状態で端末が起動する

## 作業イメージ
1. イメージを取得
2. イメージからコンテナを作成する
3. コンテナを起動し、アタッチする
4. 色々作業する
5. コンテナから抜ける
6. 状態を残したいのであればコミットする

※アタッチ: dockerで起動したコンテナの標準出力を見ることができ、さらに操作可能な状態にする
早い話が、ターミナル上でも操作対象がコンテナの中身に切り替わる

## コマンド一覧

dockerhubからイメージを取得する

    $ docker pull <イメージ名>[:タグ]

    例: dockerhubからバージョン5のcentos公式イメージを取得する
    $ docker pull centos:centos5

イメージ一覧を表示する

    $ docker images

イメージからコンテナを名前をつけて作成し、さらにアタッチする

    $ docker run -i -t --name=<コンテナ名> <イメージ名> <プロセス名>

    例: docker run -i -t --name=golangtest centos:centos5 /bin/bash
- 補足
  - iとかtとか

    -i, --interactive=true|false
    Keep STDIN open even if not attached. The default is false.
    -t, --tty=true|false
    Allocate a pseudo-TTY. The default is false.
    When set to true Docker can allocate a pseudo-tty and attach to the standard input of any container. This can be used, for example, to run a throw‐
    away interactive shell. The default is value is false.

  - プロセス名って？

    勉強中です。
    最初から起動するプログラムを指定してコンテナを走らせることができるようです。
    バッチのテストとかですかね。
    シェルを立ち上げるとインタラクティブに操作可能になります。

起動中のコンテナの一覧をみる

    $ docker ps

停止中のコンテナも含め一覧表示する

    $ docker ps -a

停止中のコンテナを起動させ、さらにアタッチする

    $ docker start -i <コンテナ名>

    例: docker start -i golangtest

起動したコンテナを操作するためアタッチする

    $ docker attach <コンテナ名>

    例: docker attach golangtest

操作中のコンテナから抜ける（停止させない）

    CTRL-p CTRL-q

操作中のコンテナを停止させる

    $ exit

    or

    ctrl + d

現在のコンテナの内容を確定し、イメージとして保存する

    $ docker commit <コンテナ名> <保存するイメージ名>[:<タグ>]

    例: $ docker commit test centos:golang

ホストコンピュータと特定の場所を共有する

    $ docker run -i -t -v <ホスト側のパス>:<コンテナ側のパス> <イメージ名[:タグ]> <実行するプロセス名>

    例: $ docker run -i -t -v $HOME/dockershare:/usr/share/test/html --name=mounttest centos:centos-golang /bin/bash
オイラーの公式をイメージできるようにする

この記事は[物理数学の直観的方法](http://www.amazon.co.jp/%E7%89%A9%E7%90%86%E6%95%B0%E5%AD%A6%E3%81%AE%E7%9B%B4%E8%A6%B3%E7%9A%84%E6%96%B9%E6%B3%95%E2%80%95%E7%90%86%E5%B7%A5%E7%B3%BB%E3%81%A7%E5%AD%A6%E3%81%B6%E6%95%B0%E5%AD%A6%E3%80%8C%E9%9B%A3%E6%89%80%E7%AA%81%E7%A0%B4%E3%80%8D%E3%81%AE%E7%89%B9%E5%8A%B9%E8%96%AC%E3%80%88%E6%99%AE%E5%8F%8A%E7%89%88%E3%80%89-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%95%B7%E6%B2%BC-%E4%BC%B8%E4%B8%80%E9%83%8E/dp/4062577380)の4章の自分なりの平凡なまとめを淡々と描くものです。過度な期待はしないでください。

オイラーの公式は以下の式ですね。

```math

e^{i\theta}=\cos\theta+i\sin\theta

```

右辺の方は簡単です。
三角関数の定義より、

```math

f(\theta)=\cos\theta+i\sin\theta

```

は、横軸がcosθ、縦軸がisinθですねなので、
以下のようにガウス平面上を円運動します


![image_key.png](https://qiita-image-store.s3.amazonaws.com/0/8588/f273b341-b2ca-d4ba-5db6-721ff9649989.png)

右辺の方がわかったので、
一緒に左辺も見てみましょう

```math

f(\theta)=e^{i\theta}

```

こちらは、よくわからないので、一旦微分してみます
合成関数の微分を考えるのが楽です

分離します

```math
f(\theta)=e^u\\
u = i\cdot \theta
```

それぞれ微分します

```math
上部=e^u\\
下部=i
```

合成します

```math
f'(\theta)=e^{i\theta} \cdot i
```

微分できました。
すると、新しいことがわかります。
**「ある地点f(θ)の値、に虚数単位iを掛けた値がその時点での勾配である」**
ということです。
iを掛けるというのは、ガウス平面上で90度回転することですから、
イメージは以下のようになります。

![image_key2.png](https://qiita-image-store.s3.amazonaws.com/0/8588/6b423877-c099-a30e-5f39-bf3fc503a5e9.png)


```math

f(\theta)=e^{i\theta}

```

は、スタート地点については、θに0を入れてみると+1で、
またすべての位置に対して常にこれが言えるわけですので、
やはり、以下のようにガウス平面上を円運動するのです

![image_key.png](https://qiita-image-store.s3.amazonaws.com/0/8588/f273b341-b2ca-d4ba-5db6-721ff9649989.png)

オイラーの公式はこれを示していたのですね

そして数学の至宝とも言われているオイラーの等式

```math

e^{i\pi} = -1

```

そうそれはスタート地点から一度虚数の海に飛び出していき、
ちょうど π分進む長い航海のあと、
再び実数軸に帰ってきたその瞬間のことを述べていたのです

![image_key3.png](https://qiita-image-store.s3.amazonaws.com/0/8588/7e35525e-04dc-8997-cb70-2fe9ffe37240.png)

これはもはや自明のことのように感じるのではないでしょうか
DockerとKitematicを使って1分でpdf全文検索エンジンをインストールする


[Honyomi - Pdf search engine written by Ruby](http://honyomi.nagoya/)

[Kitematic](http://qiita.com/ongaeshi/items/1e6fd25d3c9c27f6f376)を使うと本当に1分です。

1. Kitematicでhonyomiコンテナをインストール
1. URLをクリックしてWebアプリを起動
1. [Add]を押して好きなpdfをドラッグ＆ドロップ
1. あとはブラウザで[検索](http://library.honyomi.nagoya/?query=%E6%97%A5%E6%9C%AC%E8%AA%9E+%E7%89%B9%E5%BE%B4)や[閲覧](http://library.honyomi.nagoya/v/6)してください
1. もっとpdfが欲しい人は[達人出版会](http://tatsu-zine.com/)や[Gihyo Digital Publishing](https://gihyo.jp/dp)や[The Pragmatic Bookshelf](https://pragprog.com/)を使いましょう

<img alt="honyomi" src="https://raw.githubusercontent.com/ongaeshi/honyomi/master/images/honyomi-03.gif" />
Goのchannelの送受信用の型について


#初めに

Goにはchannelと呼ばれる、並行処理用のキューがあります。
基本的なことは他の記事に譲るとして、
これを使うと簡単に同期的にキューが扱え、ブロッキングもしてくれるので並行同期処理をする場合に（Javaなどに比べ）かなり楽に書けます。



# channelの例
```go:標準のchannel
// 容量10のchannel作成
c := make(chan int, 10)

// キューに送信
c <- 10

// キューから受信し、値を出力
// キューに値がなければロック
fmt.Println(<-c) //10
```


実は、channelには送信専用・受信専用の型（？）があります。
Effective Go
https://golang.org/doc/effective_go.html#channels
や記事などにもあまり書かれてないので
記載したいと思います。



## 送信専用のchannel
（コンパイルエラーになります。）

```go:送信専用のchannel
// 送信専用の容量10のchannel作成
c := make(chan<- int, 10)

// キューに送信
c <- 10

// 送信専用なのでコンパイルエラーになる。
fmt.Println(<-c)
```

## 受信専用のchannel
（コンパイルエラーになります。）


```go:受信専用のchannel
// 受信専用の容量10のchannel作成
c := make(<-chan int, 10)

// 受信専用なのでコンパイルエラー
c <- 10

fmt.Println(<-c) 
```


# 使いどころ

上だけ見ると、コンパイルエラーになるので使いどころあるの？という感じですが。

実は、
「標準のchannel型」　→　「入力 or 出力専用のchannel型」
への代入ができます。

（それ以外はできないようです。）


うまく使うと型レベルで宣言し、コンパイル時にチェックできます。



```go:channelの代入
package main

import (
	"fmt"
)

func main() {
	c := make(chan int, 10)
	c2 := make(chan<- int, 10)

	c2 = c
	
	// c2に4を送信する
	c2 <- 4
	
	//　c2は送信専用なのでコンパイルエラー	
//	fmt.Println(<-c2)	
	
	// cからを受信すると4を受け取れる
	fmt.Println(<-c)
}

```

これだけだと、あまり大したことないですが、以下の様に関数呼び出しで使う場面もでてくるかもしれません。

## 送信専用のchannelの使用例

go tourの非同期的なfibonacciの例ですが
https://go-tour-jp.appspot.com/#66


このfibonacci関数内では、channelに対して送信しかしておりません。
なので

```go:fibonacchi(送信Only）
package main

import (
    "fmt"
)

func fibonacci(n int, c chan<- int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x+y
    }
    close(c)
}

func main() {
    c := make(chan int, 10)
    go fibonacci(cap(c), c)
    for i := range c {
        fmt.Println(i)
    }
}

```

と書くことが出来ます。
http://play.golang.org/p/4YtIDSDGkS


これでfibonacci関数内で送信しかしないと明示でき、
間違えて受信の処理をしてしまうことを防げます。

## 受信専用のchannelの使用例

非同期に素数を順番にジェネレートする関数です。
呼び出した側は、受信のみにさせることが出来ます。

```go:素因数分解のジェネレータ(受信Only）
package main

import (
	"fmt"
)

func getPrimeGen() <-chan int {
	var gen = make(chan int)
	go func() {
		var primes = make([]int, 0)
		for k := 2; ; k++ {
			check := true
			for _, value := range primes {
				if k % value == 0 {
					check = false
					break
				}
			}
			if check {
				primes = append(primes, k)
				gen <- k
			}
		}
		close(gen)
	}()
	return gen
}

func main() {
	//受け取ったchannelは受信のみ
	primeGen := getPrimeGen()

	for i := 0; i < 10000-1; i++ {
		<-primeGen
	}
	// 素数の10000番目を出力します。
	fmt.Println(<-primeGen)

}
```
http://play.golang.org/p/UVk5Z5U266

#まとめ
channelの送受信用のchannel型もうまく使っていきましょう。
Railsチュートリアルつまづいた箇所

2015/8よりRailsチュートリアルをGemバージョン指定せず進めたときのつまづいた箇所備忘録。
随時更新していきます。

（つまづき１）Capybara DSLをRSpecヘルパーファイルに追加する。
　×　spec/spec_helper.rb　に記載
　○　spec/rails_helper.rb 　に記載
　➡理由　Rspecのバージョン違い
（参考）　RSpec3でCapybaraのinclude
http://qiita.com/necojackarc/items/8ba3a3fd2262f69adc34

（つまづき２）sporkを介したrspecでエラー
　以下の記事の通りにしたら動いた。
　　（参考）RSpecとsportkの連携時のエラー
　　http://toifan.daiwa-hotcom.com/wordpress/?p=271
　➡理由　Rspec3からRSpec::Core::CommandLineがなくなったらしい

（つまづき3）画面がくずれる
　　・header内のulたぐにnav-tabs追加
　　　元々　`<ul class="nav pull-right">`
　　　修正　`<ul class="nav nav-tabs pull-right">`

　　・hero-unitが効かない➡そのままそっとしておく

（つまづき4）bootstrap LESSの変数
Bootstrap2と3でのカラー変数の違い
http://qiita.com/necojackarc/items/9e549746252f44ce6680

（つまづき５）Rspecのbe_falseマッチャのリネーム
be_true/be_falseマッチャが、be_truthy/be_falsey（またはbe_falsy）にリネームされているのでbe_falsyに直す必要がある。

（つまづき６）uninitialized constant FactoryGirl
　以下の通りにしたら解消
（参考）【エラー】uninitialized constant FactoryGirl と出る場合
http://source.hatenadiary.jp/entry/2014/02/06/222318

（つまづき7）bootstrap のエラースタイルが適用されない
　以下の通りで解決
（参考）Railsのfield_with_errorsクラスにBootstrap3を適用
http://qiita.com/necojackarc/items/12abfa22bf767da20096

（つまづき8）bootstrap alert-errorが赤くならない
　以下の通りで解決
（参考）.alert.alert-errorがスタイルされない
http://qiita.com/yoshiyukiohta@github/items/1b7c35b45cda5628d211

（気づき）
　　it { should ... }　より 
　　it { is_expected ... } と書いた方がよいらしい

（つまづき９）alert[:notice]の色がつかない
　またしてもbootstrapの変更 notice ➡ alert-info
（参考）
https://gist.github.com/suryart/7418454
vue.jsでデータを初期値にリセットできるコンポーネント作ってみた



## 経緯

GET APIでデータをもらってきてVMに渡して、ユーザがそのデータを変更して、変更された内容をUPDATE APIに投げてサーバー側のデータを更新する！ようなことをしたいと思っていて、じゃあユーザが操作を間違えてしまったので手元の変更内容をキャンセルしたいことが生じたらどうしようかなと思ったので、$dataを初期状態に戻せるコンポーネントを作ってみました。


## 使い方

- 使いたいvmで`mixins: [resettable]`します。
- $dataの読み書きは通常どおり行えます。
- 初期値を読みたい時は `getBase([プロパティ名])`で取得できます。
- `reset()`メソッドで`$data`を初期値に戻します。
- `setAsBase()`メソッドを呼ぶと、現在値を新しい初期値として扱います。
- `changed`プロパティで、初期値から書き換わっているかどうかを取得できます。

### サンプルコード (scriptタグで読み込む版)

````index.html
<script language="javascript" src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.12.10/vue.js"></script>
<script language="javascript" src="http://satetsu888.github.io/vue-resettable/dest/vue-resettable.js"></script>

<div id="app">
    <color-component color="#aabbcc"></color-component>
</div>

<script type="x-template" id="color-component">
    <div>
        <p style="background-color:{{getBase('color')}}">baseData:{{getBase('color')}}</p>
        <p style="background-color:{{color}}">currentData:{{color}}</p>
        <p><input type=text v-model="color"></p>
        changed: {{changed("color")}} <br>
        <input type=button value="Reset" v-on="click: reset">
        <input type=button value="Update"v-on="click: update()">
    </div>
</script>

<script>
    var colorComponent = Vue.extend({
        props: ["color"],
        template: "#color-component",
        mixins: [resettable]
    });

    var app = new Vue({
        el: '#app',
        components:{
            'color-component': colorComponent
        }
    })
</script>
````

### サンプルコードとデモ(webpack版)
https://github.com/satetsu888/vue-resettable-sample

### 本体
https://github.com/satetsu888/vue-resettable

## 内部でやってること

1. `created`イベントのタイミングで、内部で base, current という名前でもっているプロパティに初期値と現在の値を登録します。この時、base, current以外の `mixin` されたプロパティを全て`$watch`し、更新をcurrentにも反映するようにします。
1.  `reset`時は base プロパティの中身を使って、currentおよびそれ以外の全てのプロパティの中身を書き換えます。
1. `setAsBase`の時は逆に、currentでbaseを書き換えます。

## TODO
- base, currentというプロパティを使っている状態なので、mixinしても迷惑をかけないようにする
- computed propertyの変更も見張れるようにとか

## おまけ
なんとか動くようにはなったんですが、もうちょっとスマートな実装方法がありそうな気がしています。よりよい方法をご存知の方、同じようなことがやりたくて困っている方は情報をお寄せください。
SpringBoot +thymeleaf + nekoHTML問題


**thymeleaf**
http://www.thymeleaf.org/

デフォルトで入ってるthymeleafのテンプレートエンジンの構文チェックが厳しすぎる件で、調整する方法がないか模索中。
デフォルトでXMLパーサーを使うので構文チェックが厳しすぎるのだ。
DOMパーサーとして、NekoHTMLを入れてLEGACYHTML5を指定することでいい加減なHTMLが読めるようになるのだが、いかんせん、xml-apis.jarのバージョンが古く、最新の2.0系には対応していないようなエラーがでる。
この問題はgradleを使わずにNekoHTMLのサイトからダウンロードしてきたファイルをライブラリ参照する事で一旦解消しているので調査保留中。

`spring.thymeleaf.mode=LEGACYHTML5`

**build.gradle**
`compile("org.springframework.boot:spring-boot-starter-thymeleaf")`
`compile('net.sourceforge.nekohtml:nekohtml:1.9.22')`

**nekoHTML**
http://nekohtml.sourceforge.net/