OmniAICreator/Qiita-1.07M huggingface dataset:
Redmine+Postfix+SASL+CRAM-MD5で通知メールを飛ばす

Redmineのインストール後、メール通知を飛ばす際に手こずったので以下にメモします。
（とりあえず動くレベルでの設定なのであまり参考ならずすみません）

インストールすべきrpm

```
postfix
cyrus-sasl-md5
```

IDとパスワードの設定
```
saslpasswd2 -u ドメイン ユーザ名
```

```/etc/postfix/main.cf
myhostname                   = (Redmineサーバのホスト名。例：redmine.hogehoge.jp）
mydomain                     = (Redmineサーバのドメイン名。例：hogehoge.jp）
inet_protocols               = ipv4
mydestination                = $myhostname, localhost.$mydomain, localhost
mynetworks                   =  127.0.0.0/8
smtpd_sasl_auth_enable       = yes
smtpd_sasl_type              = cyrus
smtpd_sasl_path              = smtpd
broken_sasl_auth_clients     = yes
smtpd_sasl_local_domain      = $mydomain
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
```

```configuration.yml
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address:        "localhost"
      port:           25
      domain:         "RedmineサーバのFQDN"
      authentication: :cram_md5
      user_name:      ユーザ名
      password:       パスワード

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
```

```/etc/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login cram-md5
```

```その他
chown postfix /etc/sasldb2
service postfix start
chkconfig postfix on
service saslauthd start
chkconfig saslauthd on
```
WebRTCを試すために必要なもの

# はじめに
WebRTCを使うと、ブラウザで手軽に映像、音声通信が始めることができます。そのために準備する必要があるものを、整理してみます。
（大規模なシステムを作るためには様々な困難が待ち受けていますが、それはまた別のお話）

# 1. Webブラウザ
何はともあれ、Webブラウザが無いと始まりません。

### PCの場合
* Chrome... Windows, Mac, Linux
* Firefox... Windows, Mac, Linux

が試しやすいです。こだわり派はOperaでもOKです。
※EdgeでもORTCが使えますが、ややこしいので今回は触れません。また、各種プラグインも出ていますが、それも今回は置いておきます。

### モバイルの場合
モバイルでやりたい場合はAndroid版なら利用できます。残念ながらiOS版では利用できません。

* Chrome... Android
* Firefox... Android

※iOSでもBowserというブラウザで利用することができますが、それも今回は置いておきます。

### ブラウザ以外
ブラウザなくてもできるぞ！という突っ込みがあると思いますが、「試す」レベルではないので今回は除外します。

# 2. カメラ
WebRTCで一番分かりやすいのは映像の通信です。音声通信もデータ通信もありますが、分かりやすさでは映像に軍配が上がります。

* PC内蔵のカメラ
* USBで接続するWebカメラ

のどちらかを用意してください。時々ブラウザから認識できないカメラもありますので、「ドライバ不要」と謳われているカメラが無難です。

# 3. Webサーバー
ブラウザのWebRTCはJavaScriptから利用することになりますが、ローカルファイル(file://～)ではカメラ/マイクにアクセスすることができません。Webサーバーを用意する必要があります。
※Chrome 47からは、https://～　での利用が必須になりました。が、http://localhost/～ は例外として使えますので、「試す」にはまずはローカルで動かしてみましょう。

Apacheやnginxといったサーバーをセットアップできればそれが良いですが、ハードルが高いなーという人はこちらの[「お手軽なWebサーバーの立て方」](http://qiita.com/massie_g/items/2913066e596dae197539)を参考にしてみてください。

# 4. シグナリングの手段
WebRTCで通信を行うには、SDPやICE Candidateといったお互いの情報を交換する必要があります。このために何らかのサーバーを用意するのが一般的で、WebSocketなどが利用されます。まず試すにはちょっとハードルが高いのですが、その代わりにあなた自身が[手動でシグナリング](http://qiita.com/massie_g/items/f5baf316652bbc6fcef1)を行うこともできます。

# 5. ネットワーク接続
WebRTCで通信を行うには、シグナリングの過程でICE Candidateと呼ばれる通信経路の情報を収集する必要があります。このためには利用するPCが**ネットワークにつながっている**必要があります。たとえ同一PCの中で通信が完結していても、完全にスタンドアローンの状態では ICE Candidate が1つも収集されません。意外な落とし穴ですね。

WiFiでもテザリングでも良いので、PCから外につながるネットワークを用意しましょう。実際の映像や音声の通信はPC内で完結できるので、パケ死することは無いはずです。

※必ずしもインターネットにつながっていなくても、閉じたネットワークでも大丈夫だと思うのですが、確認できていません。


# 終わりに
[WebRTC Conference Japan 2016](http://webrtcconference.jp/)が開催されます。[豪華な特別対談もあります](http://webrtcconference.jp/#recommend)。
2日目の2/17に[「WebRTC Boot Camp」](http://webrtcconference.jp/session/#session_9)と題して初心者向けのハンズオンを担当します。
会場のネットワーク接続に制限があるので、ご参加する方はできるだけテザリングやWiFiルーター等をご用意ください（パケ死はしません）。

ご参加お待ちしています！
CircleCIでexceeded the memory limit of 4G on 1 containerが出た際の対処方法の1つ

[CircleCI](https://circleci.com/)で

```
Your build has exceeded the memory limit of 4G on 1 container. The results of this build are likely invalid. We have taken a snapshot of the memory usage at the time, which you can find in a build artifact named `memory-usage.txt`. The RSS column in this file shows the amount of memory used by each process, measured in kilobytes.
```

というエラーで`RSpec`が`died unexpectedly`で死んでしまってつらかった。

`artifacts`の`memory-usage.txt`を見てねと言われて見てみたら、

phantomjsがメモリリークしてた。

```
PID   RSS %CPU COMMAND
 31187 1970560 30.4 /usr/local/bin/phantomjs
```

[poltergeistのREADME](https://github.com/teampoltergeist/poltergeist#memory-leak)
にも書いてあったので、[Using Poltergeist, Phantom JS instances are not exiting during every rspec run · Issue #419 · teampoltergeist/poltergeist](https://github.com/teampoltergeist/poltergeist/issues/419#issuecomment-31065045)を参考にしながら`rails_helper.rb`へ、以下を追加。


```rails_helper.rb
  # Phantomjsのmemory leakを防ぐ
  config.append_after(:all) do
    # see https://github.com/teampoltergeist/poltergeist/issues/419#issuecomment-31065045
    session_pool = Capybara.instance_variable_get('@session_pool') || {}
    session_pool.each do |_, session|
      # https://github.com/teampoltergeist/poltergeist#memory-leak
      session.driver.quit if session.mode == :poltergeist
    end
    session_pool.clear
  end
```

`session_pool.clear`しちゃっているので、Driver生成のオーバーヘッドがかかるであろうから、元記事の`:each`より`:all`ぐらいがいいかなという判断です。

`if session.mode == :poltergeist`は以下のようなpoltergeistをdriverとしてCapybaraに登録するところの第一引数と合わせて下さい。

```rails_helper.rb
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app)
end
```
AndroidをMac環境で開発してみる part2 エミュレータ高速化

次はエミュレータの高速化についてメモしたいと思います。
 
## HAXM インストール　
1.Android SDK Manager を起動し、
Extras > Intel x86 Emulator Accelerator(HAXM installer) をインストール

2.HAXM をインストールするため、HAXMインストーラを実行。
インストーラの場所は、SDK Manager の中の Intel x86 Emulator Accelerator にマウスカーソルを合わせると Location: ~~
を見るとダウンロードされてる場所がわかります。
![スクリーンショット 2016-01-15 19.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/85547/e0a6c300-1d02-aaac-2b25-e9dd7c3a5680.png "スクリーンショット 2016-01-15 19.19.53.png")

3.あとはpackage を実行し、インストールするのですが、途中でエミュレータのメモリを設定する所があります。初期設定でもいいですが、自分のPCのメモリを見比べて調整してください。1GB分 1024MB あればある程度はスムーズに動くようです。

4.高速化する準備はできたので、エミュレータを作り直します。
AVDManager を起動し、createを選択。

+ Device = Nexs4
+ Taget  = Android 6.0 API Level 23
+ CPU		= Intel Atom(x86)
+ Memory Oprion = HAXM で設定したMBを入力
+ Emulation = Use Host GPU にチェック

の設定で作成。古い方のエミュレータは削除してもOKです。

これで高速化の設定は完了です。
再度実行してみてください！　起動や動きが早くなってるはずです。

次はAndroidのコードについてまとめたいと思います。

------

####開発環境
Mac OSX Yosemite 10.10.5
Eclipse Mars
JDK 8
Android SDK 6.0

####参考URL
http://saku-java.be-ourselves.jp/2014/05/18/intel-x86-android-emulator-setting/
バルス祭り-ジャストインバルスについて思うこと

# ■バルス祭りとは
テレビ放送のシータとパズーの「バルス」と同タイミングで、Twitterなどのソーシャルメディア上で『バルス』と投稿すること。

# ■ジャストインバルスとは
NTTデータでは【1秒たりともずれずにバルスする】ことを、【ジャストインバルス】とし集計を行っているらしい。
詳しくは下記を参照。
[1月15日の「バルス祭り」、ツイート全量をリアルタイム計測、NTTデータが実況中継 -INTERNET Watch]
(http://internet.watch.impress.co.jp/docs/news/20160113_738831.html)

# ■1秒未満でバルスをツイート出来たとしてもアウト？
テレビに張り付き、頑張って1秒未満でバルスをツイート出来たとしてもジャストインバルスは無理かもしれない。
なぜなら、地上デジタルテレビ放送は遅延問題を抱えているからだ。
[日本の地上デジタルテレビ放送-遅延問題](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%9C%B0%E4%B8%8A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%86%E3%83%AC%E3%83%93%E6%94%BE%E9%80%81#.E9.81.85.E5.BB.B6.E5.95.8F.E9.A1.8C)

# ■遅延を考慮してツイート
首都圏では平均１.９５秒遅延しているらしい。
首都圏の皆さん、シータとパズーより１.９５秒早く滅びの呪文を唱えてください！ 

*ジャストインバルスにならなくても投稿者は責任を負いません。 必ず自己責任でお願いします。

[地デジになって年越しのカウントダウンが必ず”ずれる”理由](http://matome.naver.jp/odai/2135695504557276301)

# ■備考
・そもそもNTTデータがバルスの発生時刻をどのように定めているのか謎。
・遅延問題は、テレビそのものにもある模様。
とりあえず何も考えずにバルス観測だけしとくか…

### 毎度おなじみのバルス祭り
久々にラピュタの日ですね、また記録が出たりしないんでしょうか。

と言っても自分はラピュタ見るつもりはないんで…とりあえず集計用にログ取れないかな〜などと

[ShellScript - シェルスクリプトは「バルス」に勝てるのか、体を張って確かめたい！（オマケ付き） - Qiita](http://qiita.com/richmikan@github/items/48f49473f46084c57701)
### お久しぶり、`twurl`
ターミナル(zsh)からTwitter APIを叩くのに、面倒くさがりの自分はtwurlを叩きます。　rubyで書かれたcurlっぽいTwitter公式のOSSクライアント。

#### Install
requirement: ruby

```zsh
$ gem install twurl
```

#### Auth
```zsh
$ twurl authorize -c [ConsumerToken] -s [ConsumerTokenSecret]
// => OPEN Link in browser and auth, input pin in stdin 
```

or

```zsh
$ twurl authorize -c [ConsumerToken] -s [ConsumerTokenSecret] -a [AccessToken] -S [ATSecret]
```


#### Use filter stream

```zsh
$ twurl -d 'track=バルス' -H stream.twitter.com /1.1/statuses/filter.json
```

#### Out to file 

```zsh
$ twurl -r 'track=バルス'  -H stream.twitter.com /1.1/statuses/filter.json>>log.json
```

#### realtime format output (ex: only text with jq)

```
$ twurl -d 'track=バルス' -H stream.twitter.com /1.1/statuses/filter.json|jq .text
```

### リアルタイムログ監視
```zsh
$ tail -f log.json|jq .text
```

### 既知の問題

- Filter Streamの仕様上収集できるのは単独ワードかハッシュタグにバルスを含むもののみ
- 再接続とか考慮してないから切れたら手動で。
- `-d 'trac=バルス,タニタ'`
- OSX以外のカーネルのtailの仕様の差異とかしらない
sbtのインタラクティブモードで、複数コマンドを続けて実行する方法


コマンドラインでsbtを実行するときに、

```bash
$ sbt reload clean update compile test
```

のようにすると複数のコマンドを続けて実行できますが、
これと同じことをインタラクティブモードで実行するには、

```bash
$ sbt
> ;reload ;clean ;update ;compile ;test
```

とコマンドをセミコロン区切りにするとできます。

```bash
> sbt help
  ; <command> (; <command>)*              Runs the provided semicolon-separated commands.
```

ちょっとしたTipsでした。
[Windows]ローカルでECCUBE+SQLiteでサクッと構築

#今日も私的メモで失礼。
今日もサクサク**「やったことメモ」**♡
今回はWindowsローカルにSQLiteを使って『サクッ！』とローカル構築！サクッとぉ！

先日に続き、「ローカルはサクッ！と済ませたい！！」の思いが

つよすぎ？(´・ω・｀)私。
##準備
1. PHPインストール。
Web Platform Installer使って、サクッとPHP5.6と自動で選択されるゆかいな仲間たちをインストール。

2. Source Treeでeccubeのリポジトリをクローン。もしくは
```git clone https://github.com/EC-CUBE/ec-cube.git```

1. コマンドラインからクローンしたフォルダへ移動。
```cd ec-cube```
4. 必要なcomposer(と呼ぶ？)を入れますよ～。
```php -r "readfile('https://getcomposer.org/installer');" | php```
```php composer.phar install```
5. すると、一旦止って`ほにゃららToken`と出たら、2つ目のURLにアクセスして承認しましょう。
6. 承認すると出てくるキーをコピーコマンドラインにペースト。すると続投。します。

##手順
1. (2度目はココから)コマンドラインからクローンしたフォルダへ移動。
```cd ec-cube```
 
4. で、実行。
```php -S localhost:8080 -t html```

5. ブラウザのアドレスバーに入力したインストール画面！オケ！
```localhost:8080```

##補足
インストールを進めていくとDB名など出てくるので、そこをSQLiteにすると開発モードでサクッと終わります♡
 
　
 
> 参照元
EC-CUBEエバンジェリスト 大河内健太郎さんでした♪
(http://qiita.com/nanasess/items/c835e87c0e720c4e391f)
grafana zabbixのdockerコンテナ起動

# 概要

[grafana-zabbix](https://github.com/alexanderzobnin/grafana-zabbix)を使って、zabbixのデータをgrafanaからみたい。
grafanaはdockerで起動したい。

# 結論

できた。

grafanaのコンテナに、grafana-zabbixをいれたものを作った。

## 気づいたこと

結構な部分が環境変数で設定ができる。

# 起動方法

まずは、データ永続化のためのディレクトリを作り、設定ファイルのサンプルを落とす。

```
mkdir grafana
```

>docker run --name=grafanazabbix --rm=true -v $PWD/grafana:/var/lib/grafana -p 3000:3000 -e GF_SERVER_ROOT_URL=http://your.grafana.server:3000 -e GF_SECURITY_ADMIN_PASSWORD=password -e GF_AUTH_ANONYMOUS_ENABLED=true -ti manabuishii/docker-grafana-zabbix:0.2.0

# grafanaの設定に関して

grafanaの設定に関しては、以下の記事（すごく助かりました）を参照。

- [grafana-zabbixのインストール&初期設定 - Qiita](http://qiita.com/biatunky/items/f148326ed0cc80afa217)

# grafana コンテナ

コンテナについては

- [https://hub.docker.com/r/grafana/grafana/](https://hub.docker.com/r/grafana/grafana/)

# grafana-zabbix
grafana-zabbixについて以下参照

- [alexanderzobnin/grafana-zabbix](https://github.com/alexanderzobnin/grafana-zabbix)

細かい設定についても書いてある。

# grafana コンテナでやりたいこと

grafanaのコンテナで、以下のことをやりたい。

- ゲストユーザを許可する
- データを永続化する
- カスタマイズしたplugin.jsonを使う

### ゲストユーザを許可する

グラフをみせたいので、許可する。
そんなときは

```
-e GF_AUTH_ANONYMOUS_ENABLED=true
```

### データを永続化する

標準だとsqlite3を使うようで、そのデータはコンテナ内の /var/lib/grafana 以下に作られる。
そのためのディレクトリを

```
mkdir grafana
```

そのためのオプションは

```
-v $PWD/grafana:/var/lib/grafana
```

### plugin の設定のためのファイルを指定する

plugin.jsonの中に設定を書いてコンテナ内と共有する

雛形をダウンロードする。
コンテナの中にあるものと同じ
```
wget https://raw.githubusercontent.com/manabuishii/docker-grafana-zabbix/master/plugin.json
```
編集をして、起動時に以下のオプションを渡す
```
-v $PWD/plugin.json:/usr/share/grafana/public/app/plugins/datasource/zabbix/plugin.json
```

### 作ったもの

github

- [manabuishii/docker-grafana-zabbix](https://github.com/manabuishii/docker-grafana-zabbix)

hub.docker.com

- [docker-grafana-zabbix](https://hub.docker.com/r/manabuishii/docker-grafana-zabbix/)
Laravelで指定したフィールドのうちの1つ以上の入力を判定したい時のバリデーション実装

例えばこのようなフォームがあったとして、

```html:例えばこんなフォーム
<textarea name="article_1"></textarea>
<textarea name="article_2"></textarea>
<textarea name="article_3"></textarea>
<textarea name="article_4"></textarea>
<textarea name="article_5"></textarea>
```
article_1〜article_5のうちのどれかが入っていればOK(全部空だとエラー)というバリデーションを行いたいとする。

# 使用可能なバリデーションルールはこんな感じ

[使用可能なバリデーションルール](http://readouble.com/laravel/5/1/ja/validation.html#available-validation-rules)を見たところでは、以下のバリデーションが使えそうなところ

> **required_without_all:foo,bar,...**
フィールドは、指定された他のフィールド全部が存在しない場合のみ、この項目が入力されていることをバリデートします。

# 実装するならこんな感じ

### バリデートするフィールドを設定し、常に空の状態にする。

```html:例えばこんなフォーム
<input type="hidden" name="articles" value="">
<textarea name="article_1"></textarea>
<textarea name="article_2"></textarea>
<textarea name="article_3"></textarea>
<textarea name="article_4"></textarea>
<textarea name="article_5"></textarea>
```

### 判定したいフィールドを「required_without_all」で全て指定する。
```php
public function rules()
{
    return [
        'articles' => 'required_without_all:article_1,article_2,article_3,article_4,article_5'
    ];
}

public function messages() {
    return [
        'articles.required_without_all' => 'articleは一つ以上入力してください。'
    ];
}
```
Swift を Tailor でコードの静的解析を試す


![tailor.png](https://qiita-image-store.s3.amazonaws.com/0/27210/1d1b8710-234b-7842-bab6-5d69acc5f7e7.png "tailor.png")

# Tailor

Swift で使える静的解析ツール Tailor を導入してみました。

https://tailor.sh/

# セットアップ

homebrew でインストールができます・・が、

```
t-fujiki$ brew install tailor
tailor: Java 1.8+ is required to install this formula.
You can install with Homebrew Cask:
  brew install Caskroom/cask/java

You can download from:
  http://www.oracle.com/technetwork/java/javase/downloads/index.html
Error: An unsatisfied requirement failed this build.
```

Java8 以降がインストールしてある必要があります。

## 1. Java8 のインストール

こちらから。
http://www.oracle.com/technetwork/java/javase/downloads/index.html

## 2. Tailor のインストール

homebrew でさくっと。

```
brew install tailor
```

## 3. Xcode プロジェクトへの統合

下記コマンドを実行すると Build Phase に Tailor を実行する Run Script を設定してくれます。

```
tailor --xcode /path/to/demo.xcodeproj/
```

## 4. プロジェクトをビルド

ビルドすると issue navigator に警告を出してくれます。

![Screenshot 2016-01-15 18.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/27210/0c62f225-6c8f-029d-0165-e189046a3091.png "Screenshot 2016-01-15 18.23.05.png")


# 適用されるルール

適用されるルールはこちら。

https://github.com/sleekbyte/tailor/wiki/Rules

金曜日や週の始めの月曜日など、なかなかテンションの上がらない時間に気分転換として導入してみてもいいかもしれません。

# 追記

プロジェクトに組み込んだものの毎ビルド時にチェックさせるとけっこう時間がかかります。

Run Script の内容を一時的に無効にするという方法はなさそうなので、
普段は Build Phase -> Tailor の部分のスクリプトの先頭に "exit 0" を足して無効にしておくのがよさそうです。

```
exit 0
if hash tailor 2>/dev/null; then
  tailor
else
  echo "warning: Please install Tailor from https://tailor.sh"
fi
```
Node.jsで、MongoDBのカーソルを逐次処理する

一般に、javascriptでは、逐次処理がネストするときひどく見づらいなコードになります。mongoDBのfindの結果（カーソル）を逐次処理する必要があるときも同じです。そんなときは以下のような拡張をしてやればすごく楽です。

```js
require('mongodb').Cursor.prototype.serial = function(callback){
    var cursor = this;
    return new Promise(function(fulfilled, rejected){
        function task(){
            cursor.next()
                .then(function(item){
                    if(item){
                        return Promise.resolve(callback(item))
                            .then(function(){
                                task();
                            })
                    }else{
                        return cursor.close()
                            .then(function(){
                                fulfilled();
                            })
                    }
                })
                .catch(function(err){
                    rejected(err);
                })
        }
        task();
    })
};
```

使用例

```js
    db.collection('account').find().serial(function(account){
        return db(account._id.toString()).collection('clientMail').find({
            sendTime: {$lt: new Date().getTime()},
            status: 'reserved'
        }).serial(function(mail){
            return db.collection('client').find({_id: new ObjectID(mail.clientId)}).next()
                .then(function(client){
                    return sendMail(client, mail)
                })
        })
    })
    .catch(function(err)){
    // エラー処理
    })
```

ベタに書くと、エラー処理がとんでもなく複雑になるのですが、かなりすっきりしたコードになりました。async.seriesなんかもありますが、エラー処理のすっきりさでは、Promiseにかないません。
「『スクエア・カルテット』問題」に参加しました。

[CodeIQ「『スクエア・カルテット』問題」](https://codeiq.jp/q/2628)の出題期間が終了したということで、自分が提出したコードを公表してみたいと思います。最初はPythonで書いており、実際に提出までしたのですが――なぜか途中で気が変わりSchemeへと変更。おそらくPythonについてはだれかほかの方がコードを公開してくれると思うので、自分はユーザーの少ないSchemeに絞りたいと思います。

***
__2016/11/17追記:__
公開されたコードについて出題者の[@riverplusさん](https://twitter.com/riverplus)がまとめてくださっていたようです。わたしはこれから勉強します(´・ω・`)
http://togetter.com/li/922419
***

```scm
; n(= b*b-a*a)があたえられたとき、ありうるpとq(p > q)の組み合わせを作り、リストに格納する
; (make-pq-list 91) => '((13 . 7) (91 . 1)) [約数]
(define (make-pq-list n)
  (let loop ((q 1) (pq-list '()))
    (if (>= q (sqrt n))
      pq-list
      (loop (+ q 1)
            (if (zero? (modulo n q))
              (cons `(,(quotient n q) . ,q) pq-list)
              pq-list)))))

; 問題文のF(a, b)
; (F 3 10) => 104
(define (F a b)
  (let loop ((pq-list (make-pq-list (- (* b b) (* a a)))) (sum 0))
    (if (null? pq-list)
      sum
      (let ((p (car (car pq-list))) (q (cdr (car pq-list))))
        (loop (cdr pq-list)
              (if (even? (+ p q)) ; p + qが偶数のとき、p - qも偶数
                (+ sum p) ; p = x + y
                sum))))))

; メイン関数。入力を処理して関数Fに渡し、その結果を出力する
(define (MAIN)
  (let* ((a (read)) (b (read)))
    (write (F a b))))

(MAIN)

; == 方針 ==
; x ** 2 + a ** 2 = y ** 2 + b ** 2
;     <=> x ** 2 - y ** 2 = b ** 2 - a ** 2
;     <=> (x + y)(x - y) = b ** 2 - a ** 2
; x + y = p, x - y = q, b ** 2 - a ** 2 = n (p > q, nは0以上の整数)とすると
;     p = x + y <=> x = (p + q) / 2
;     q = x - y <=> y = (p - q) / 2
;     n = p * q
; p, qがとりうる値はnの約数であることを利用して求める
; p, qがわかればx, yおよびx + yの値も決定する
; ただしx, yは自然数、つまりp + q, p - qはともに偶数である必要がある
```

アルゴリズムについては下部の「方針」に書いた通り――というかあれ以上にどう書いていいのか、わたしにはわかりません(´・ω・`)。数学的な説明はわたしより何倍も偉い人が書いてくれるはずなので、わたしも今から期待しています。

ちなみにCodeIQで採用されているSchemeの処理系はGuile1.8.5です。この手のサイトでSchemeが利用できるのは珍しいのですが、処理系はやや古いので、CodeIQに関心がある全国20億人のSchemeプログラマのみなさんはお気を付けを。
[JavaプログラマのためのHaskell]一日目・導入の話

「ふつうのHaskellプログラミング　ふつうのプログラマのための関数型言語入門」という本を読み進めながらHaskellを勉強していきたいと思います。
この本では、JavaプログラマのためのHaskell入門書といった立場からHaskellを学習していきます。Javaのソースコードと比較しながら説明されていますので読みやすいと思います。

<h1>Haskellの利点</h1>
・柔軟にプログラミングができる
・コンパイル時の型チェックが容易
・読みやすい
・遅延評価が基本

<h1>hello.hs</h1>
Hello World を出力

```hello.hs
main = putStrLn "Hello World!"
```

<h1>cat.hs</h1>
標準入出力

```cat.hs
main = do cs <- getContents
          putStr cs
```
　　・getContents: 標準入力をすべて読み込む.
　　・putStr: 引数の文字列を標準出力にそのまま出力.末尾に改行はつかない.
　　・Haskellではインデントが文法的な意味を持つ

<h1>リストリテラル</h1>

```
[]
[1, 2, 3]
["aa", "bb", "cc"]
["a", "b", "c"]
"abc"
```
　　・リストには一種類の値しか入れられない.
　　・文字列もリストである.

<h1>countline.hs</h1>

```countline.hs
main = do cs <- getContents
          print $ length $ lines cs
```

　　・＄演算子:　()のネストを減らすために使われる.()で置き換えて書くと、以下.

```countline.hs
main = do cs <- getContents
          print(length (lines cs))
```
　　・lines関数：　文字列を行のリストに分割.

```
lines "aaa\nbbb\nccc\n" → ["aaa", "bbb", "ccc"]
lines "aaa\n"           → ["aaa"]
lines "aaa"             → ["aaa"]
lines "\n"              → [""]
lines ""                → []
```
　　・length関数：　リストの長さ（要素の数）を返す.

```
length [1, 2, 3, 4]       → 4
length ["aa", "bb", "cc"] → 2
length [""]               → 1
length []                 → 0
length "String"           → 6
length ""                 → 0
``` 
　　・print関数：　値を文字列化して標準出力に出力.


今回はここまで！
[第二回](http://qiita.com/noco/items/4b448d518b428a7310e8)


出典
青木峰郎.ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門.ソフトバンク クリエイティブ株式会社,2006,372p.
RLoginの基本的な接続設定


「サーバーをさわってみよう！」～初心者でもよくわかる！VPSによるWebサーバー構築講座(2) - さくらのナレッジ
http://knowledge.sakura.ad.jp/beginner/2751/

上記の記事が公開されたあとにリリースされたRLoginのバージョンで、サーバー設定項目の中に「接続時にユーザー名・パスワードの入力を求める」というチェックボックスができたようなので、都度ユーザー名・パスワードを入力する場合には、チェックをいれるべき。

他は、同様。
（「Server Address」とプロトコル（ssh））とデフォルト文字セット（UTF-8）が主な設定項目。
EC2のsshホスト鍵を得て手元のknown_hostsと比較


EC2インスタンスにsshで接続する際、もやもやした思いを抱きながら`ssh -oStrictHostKeyChecking=no`している人も多いのではないかと思います。理想はStrictHostKeyCheckingの際に不一致の場合はTTYでaskするのではなく、コマンドを呼び出してくれるといいのですが、手元の環境に降りてくるのがいつになるかもわからないし、今できることを考えていきます。

実際に何が必要か考えると、1.正しいホスト鍵を得る 2.known_hostsと比較する、になります。

前者は[`aws ec2 get-console-output`](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-console.html)で得ることができます。インスタンスが再起動された場合（init.dとかで毎回表示するか、起動ごとにホスト鍵を作り直すか）や、起動後にコンソールに64KBの出力がある場合（こちらは対策が厄介なので、別の場所に保存するという戦略の方がいいかもしれない）の対策が必要かもしれません。

後者は特に悩む必要も無いので淡々とやります。

以下のスクリプトによって、正しいホスト鍵との比較が出来るようになります。ここではエラーにしていますが、`ssh-keygen -R`で既存の鍵を消した上でknown_hostsにあたらしい鍵を登録するようにすると、sshコマンドを実行する前に叩いておくとそこそこ便利なヘルパースクリプトがつくれるでしょう。

```ruby
#!/usr/bin/env ruby
require 'open3'

def hostname2instance_id(hostname)
  case hostname
  when /\.amazonaws.com\z/
    key = 'dns-name'
  when /\.internal\z/
    key = 'private-dns-name'
  when /\A10\./
    key = 'private-ip-address'
  when /\A\d+\.\d+.\d+.\d+\z/
    key = 'ip-address'
  else
    abort "unknown hostname type '#{hostname}'"
  end
  o, s = Open3.capture2('aws', 'ec2', 'describe-instances', '--filters', "Name=#{key},Values=#{host<
  res = o[/"InstanceId"\s*:\s*"([^"]+)"/, 1]
  unless res
    puts "cannot get InstanceId for '#{hostname}' #{s.inspect}"
    puts o
    abort
  end
  res
end
hostname = ARGV.shift
puts "hostname: #{hostname}"
instance_id = hostname2instance_id(hostname)
puts "InstanceId: #{instance_id}"

o, s = Open3.capture2('aws', 'ec2', 'get-console-output', '--instance-id', instance_id)
server_keys = o[/-----BEGIN SSH HOST KEY KEYS-----(.*)-----END SSH HOST KEY KEYS-----/, 1]
server_keys.gsub!(/\\r\\n/, "\n")
server_keys.strip!
puts server_keys

o, s = Open3.capture2('ssh-keygen', '-qF', hostname)
puts "known host key: #{o}"
unless o.scan(/^\S+\s+([a-zA-Z0-9=+\/]+)/).any?{ server_keys.include?($1) }
  abort "server key doesn't match"
end
```
Rspec | named_let は match_array / contain_exactly には効かない

named_let は Rspec 用の gem である。
let に与えたシンボルを、テスト結果を表示してくれる。

だがしかし。

# テスト内容

```rb:test_spec.rb
require 'spec_helper'

describe do
  subject { [Object.new, Object.new] }
  named_let(:instances) { subject }
  it { should contain_exactly(*instances) }
end
```

# 結果

```
rspec -fd test_spec.rb
```

named_let でつけた名前ではなく、中身 (この場合はインスタンス  がそのまま表示されてしまう。

```
  should contain exactly #<Object:0x007fcb73c525b0> and #<Object:0x007fcb73c52588>

Finished in 0.90819 seconds (files took 11.2 seconds to load)
1 example, 0 failures
```

# 環境

- named_let (0.1.5)
- rspec-rails (3.1.0)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
AndroidをMac環境で開発してみる part1　環境設定

今度は、MacでAndroidをEclipseで開発してみようと思います。
そのための環境設定をメモしておきたいと思います。

必要なものは 

+ Eclipse
+ JDK		(Java Developer Kit) 
+ Android SDK	(Software Development Kit) 

の3つになります。
現在、私が開発している環境が↓のVersionです。

+ Eclipse Mars
+ JDK 8
+ Android SDK 6.0

##ダウンロード

Eclipse Mars はこちらのサイトから ダウンロードできます。 
http://www.bluage.com/downloads
**Download Eclipse Installer for...**
から選んでダウンロードできます。

----------------

JDK 8 はこちらの公式サイトから、
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

ラジオボタンが **Decline License Agreement** になっているので **Accept License Agreement** を 選択してからダウンロードしてください。

-----------------
Android SDK 6.0 はこちらの公式サイトから、
http://developer.android.com/intl/ja/sdk/index.html

ページ下側の **SDK Tools Only** と書いてある所の中から選んでください。




##インストール
※Eclipse は省きます。

**Android SDK のインストール**
1.Android SDK　の zip または gz のファイルを解凍した後、 tools 内の android を実行してください。

2.Android SDK Manager が立ち上がるので、必要な項目を選択し、インストールします。
Tools 内の 

+ Android SDK Tools
+ Android SDK Platform-tools
+ Android SDK Build-tools

Android 6.0 内のすべてをインストールしてください。
左のリストから一つ選び、Accept Licenseを選ぶとすべて選べるので、install が開始されます。
容量が多いので結構時間がかかります。

**ADT Plugin のインストール**
メニューバー > Help > Install New Software... を開き,
[Add] を押した後、↓を入力してOKボタン

```
名前　　　　：ADT Plugin
ロケーション：https://dl-ssl.google.com/android/eclipse
```
その後の処理は成り行きでOKです。

##エミュレータの作成
1.メニューバー > Window > Android Virtual Device Manager を開く。
2.create を選択し、必要項目を入力していきます。

+ AVD Name = 適当
+ Device = 3.7 WVGA(Nexs One)
+ CPU = ARM(armeabi-v7a)
+ skin = 変更なしか Skin with dynamic ~ 

OKを押すと作成完了！

##Hello World 実行
1.Eclipseを開き、Window > Perspective > Open Perspecive > Java を選択。 
2.Package Explorder 内で右クリック New > Android Application Project を選択すると、Hello world のサンプルソースが作成されます。

後は Project File を右クリックして Run As で実行！

##まとめ
これで Hello world は実行できると思います。
次はエミュレータの高速化を投稿したいと思います。



###参考URL
http://qiita.com/yasumodev/items/5bfa68945bc1561c84d8
こちらがわかりやすいと思います。

###開発環境
Mac OSX Yosemite 10.10.5
Eclipse Mars
JDK 8
Android SDK 6.0
cdeとelscreen-separate-buffer-listの相性が悪い


[elscreen-separate-buffer-list](http://blog.wameiz.com/blog/2015/02/12/emacs-elscreen-separate-buffer-list/)便利ですよね。余計なバッファがリストに現れないのは大変見通しが良くなるものです。

そして[cde](http://masutaka.net/chalow/2011-09-28-1.html)も大変便利です。シェルでEmacsのカレントバッファにcdすることってよくやる操作ですからね。

ですがelscreen-separate-buffer-listをインストールしてcdeを使おうとすると、cdeが謎のエラーメッセージを吐いてcdしてくれなくなります。

cdeの方がどちらかと言うと重要だったので elscreen-separate-buffer-list を外してしばらく使っていました。が、どうにも不便なので一念発起して調べてみました。

というかなおす箇所はcdeを定義している`.zshrc`の中の一箇所で、`s/cadr/assoc 'window-configuration/`すりゃいいです。

ついでにこれだけのまとまったコードをzsh側に置いておくのもなんか変な気がするので`init.el`側に移します。こんなふうになります。

```Lisp:init.el
(defun return-current-working-directory-to-shell ()
  (expand-file-name
   (with-current-buffer
       (if (featurep 'elscreen)
           (let* ((frame-confs (elscreen-get-frame-confs (selected-frame)))
                  (num (nth 1 (assoc 'screen-history frame-confs)))
                  (cur-window-conf
                   (assoc 'window-configuration
                          (assoc num (assoc 'screen-property frame-confs))))
                  (marker (nth 2 cur-window-conf)))
             (marker-buffer marker))
         (nth 1
              (assoc 'buffer-list
                     (nth 1 (nth 1 (current-frame-configuration))))))
     default-directory)))
```

```bash:.zshrc
function cde () {
        EMACS_CWD=`emacsclient -e "(return-current-working-directory-to-shell)" | sed 's/^"\(.*\)"$/\1/'`
        echo "chdir to $EMACS_CWD"
        cd "$EMACS_CWD"
}
```

なんかうまい関数名が思いつかなかったので適当になってしまいました。誰かかっこいい関数名を…
paizaで使えるテスト小ワザ(Ruby)

本記事はpaizaの利用規約 第8条 10項に抵触していないと考えていますが、万が一指摘があれば本記事は削除します。

> 第8条（禁止事項）
> 10.ブログ・SNS等本サイト以外の媒体（インターネット媒体に限られず、不特定多数が閲覧可能なものを全て含む。）上において、当社が出題した問題の内容、当該問題に対する解答、解答へのヒント等の示唆及びカンニング等の不正を助長する内容等を掲載する行為。

## はじめに

度々面白いオンラインハッカソン(?)をやってくれる [paiza](https://paiza.jp/) ですが、可愛い女の子につられてやってみた人も多いんじゃないかと思います。（かくいう私がそうですが）
paizaの問題のほとんどは標準入力から何らかのデータを受け取り、解答を標準出力に出すという形式です。全問題を見たわけではありませんが、私が今まで解いた問題は全てその形式だったと思います。
コードを書くにはブラウザ上のエディタも一応提供されていますが、やはり普段使っている環境で書きたいことがあると思います。そこで、ローカル環境で動作確認を行う際に使える小ワザを書いてみます。タイトルにも入れていますがRubyで使える小ワザです。

## 本題
標準入力(`gets`), 標準出力(`puts`)を使うコードをテストするのは面倒だなーと思い、`Kernel.gets`, `Kernel.puts` が呼ばれないように、自分で `gets` , `puts` を作ってみました。

たとえば、「n回、数値が与えられるのでそれぞれ2倍にした数値を出しなさい。（最初にnが与えられ、以降は数値がn回与えられる）」という問題の場合。（これは私が作った架空の問題です）
具体的には、以下のような感じです。

```rb
NL = "\n"
INPUT = 0
OUTPUT = 1

@data = [ # 問題文で入力例と出力例が1〜3個ほど例示されるので、それをコピって貼り付ける
[ # 例-1
<<EOS,  ## 入力例-1
1
2
EOS
<<EOS   ## 出力例-1
4
EOS
],
[ # (問題文で与えられれば)例-2
<<EOS,  ## 入力例-2
2
1
5
EOS
<<EOS   ## 出力例-2
2
10
EOS
]
].map { |entry| [entry[INPUT].split(NL), entry[1]] } # 1行ずつ読むように改行で分割して配列にする

@i = -1
def gets
  @data[@test_case - 1][INPUT][@i += 1] + NL
end

@output = ""
def puts(content)
  @output << content.to_s + NL
end

def assert
  return Kernel.puts "OK!"  if @data[@test_case - 1][OUTPUT] == @output
  Kernel.puts "NG!!!",
    "expected: ", @data[@test_case - 1][OUTPUT],
    "actual: ", @output
end

# 実行したいテストケースを指定する
@test_case = 1

### 提出コード ここから ###

gets.to_i.times { puts gets.to_i * 2 }

### 提出コード ここまで ###

# 動作が正しいかチェック
assert
```

正解の場合の出力例:

```bash
OK!
```

不正解の場合の出力例:

```bash
NG!!!
expected: 
2
10
actual: 
3
15
```

### 注意点

* 結構な数のインスタンス変数を使っているので、解答コードで変数名が重複しないように気をつける
* プリントデバッグしたい場合など、 `puts` そのままでは使えないので `Kernel.puts` と書くか `p` 等を使う

--

テスト書くならminitestなりrspecなり使えばええやん、という意見もあるかと思いますが、問題には制限時間もあるため簡便な方法が好みです。また、きっちりやるならば `ARGV` や `ARGF` を使ったり、テスト用コード部分は別ファイルにしてrequireするなど色々あるかと思いますが、まぁこんな感じということで。
他にも小ワザ等あれば教えてください。
コマンド実行が終わったことをぼっちslackに通知するハック


# 概要
- 実行に時間がかかるコマンドを打った時、長々と実行ログを眺めるのは時間の無駄。
- かといって、次のタスクにとりかかっていると、実行したことを忘れてしまう。。

という課題を解決するために、任意のコマンド実行が終了したら、ぼっちslackに通知してくれるようにしました。

# シンプル編

## 方針
- `command; [slack通知]`で実行が終わったらメッセージを送るシンプルな仕組み
- `command`の後ろにちょろっと足すだけで通知できるようにしたい（つまり、なんかのスクリプトの引数として、実行したい`command`を入力するのは使いづらいので避ける）

## 実装
- 事前準備として、ぼっちslackのwebhookのurlを発行しておく。`slack webhook`とかで検索すれば、やり方はすぐ出てくるので割愛します。


- slackを送るperlスクリプト

```send_to_slack.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
use LWP::UserAgent;
use JSON::XS;

my $uri_str = 'https://hooks.slack.com/services/YOUR_BOCCHI_SLACK_WEBHOOK';


GetOptions(
	'message=s' => \my $MESSAGE,
);

my $params = +{
	text => $MESSAGE,
};
my $paylaod_json = JSON::XS->new->encode($params);

my $ua  = LWP::UserAgent->new;
my $req = HTTP::Request->new(POST => $uri_str);
$req->content_type('application/x-www-form-urlencoded');
$req->content(sprintf("payload=%s",$paylaod_json));

$ua->request($req);
```

- .zshrcの設定

```.zshrc
alias -g N='; ~/myscript/send_to_slack.pl --message 終わったよー'
```

## 使い方
```
dev/tools/sync_to_servers.pl N
```

しばらくたった後...

![スクリーンショット 2016-01-15 15.42.08.png](https://qiita-image-store.s3.amazonaws.com/0/17297/48866a29-425e-3347-0c74-5dc9b959b1dc.png "スクリーンショット 2016-01-15 15.42.08.png")


これで実行後のタスクを忘れることを防ぐ。

# 応用編
## 改善点
- 一連の作業をバックグラウンドでやりたい
- メッセージになんのスクリプトだったか加えたい

## 実装

- プロセス簡易監視 && slackに送るperlスクリプト

```notify_process_end_to_slack.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
use LWP::UserAgent;
use JSON::XS;

my $uri_str = 'https://hooks.slack.com/services/YOUR_BOCCHI_SLACK_WEBHOOK';

GetOptions(
	'pid=i'     => \my $PID,
);

die "can't watch!\n" unless $PID;

my $program_name = '';
while (1) {
	if (my $name = `ps -p $PID -o comm=`) {
		chomp $name;
		$program_name ||= $name;
		sleep 1;
	} else {
		last;
	}
}

my $message = "${program_name}終わったよー";
my $params = +{
	text => $message,
};
my $paylaod_json = JSON::XS->new->encode($params);

my $ua  = LWP::UserAgent->new;
my $req = HTTP::Request->new(POST => $uri_str);
$req->content_type('application/x-www-form-urlencoded');
$req->content(sprintf("payload=%s",$paylaod_json));

$ua->request($req);
```

- .zshrcの設定

```
alias -g NB='>/dev/null 2>&1 & ~/myscript/notify_process_end_to_slack.pl --pid $! &'
```

### 補足
- `ps -p [PID] -o comm=` で該当のプロセスIDのプログラム名を取得できます
- ` $!` には直前にバックグラウンド実行したPIDが入ります

## 使い方
```
hoge.pl NB
```

コマンドをバックグラウンドで実行してくれる。
しばらくすると、

![スクリーンショット 2016-01-15 15.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/17297/1f97efa9-0c37-e141-0a31-40973b91c48c.png "スクリーンショット 2016-01-15 15.58.09.png")


注意したいのは、これが使えるのは、実行したいコマンドがバックグラウンド実行可能なときだけ。
例えば`ssh -t user@other_host 'any_command' NB`ができない。実行したいプロセスがsuspendになる。
IEでHTML5のvideoタグの動画が見られないときはURLACTION_ALLOW_AUDIO_VIDEOの値を確認

# 経緯

IEで動画見られないとの話があり、そもそもvideoタグのsrcに書いてあるURLへのリクエストがされていないらしいということがありました。調べてみたら [unable-to-play-html5-videos-in-ie](http://blogs.msdn.com/b/askie/archive/2014/12/31/unable-to-play-html5-videos-in-ie.aspx) の記事にいきあたり、解決できました。

# URLACTION_ALLOW_AUDIO_VIDEO　とは?

平たくいうと、動画や音声メディアの再生を許可するかどうかのフラグ。
初期値は0で、IEのゾーンのセキュリティレベルをHighにすると3になって、動画が表示されなくなる。
より正確には、srcタグにあるURLへのリクエストしなくなる。

以下は[公式サイト](https://msdn.microsoft.com/en-us/library/ms537178(v=vs.85).aspx)より抜粋。

>Internet Explorer 9. Determines whether media elements (audio and video) are allowed. For the element to appear, both the security zone of the host webpage and the media source must allow media. By default, this URLAction permits playback of resources from all zones except the Restricted Sites zone. This means that pages in the restricted zone cannot play media from anywhere, and that pages in other zones do not permit media that is loaded from restricted sites.

# regeditで閲覧・編集

regedit.exeを実行すると、レジストリの閲覧・編集ができます。上記のやつは`Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3` の2701に該当します。

# 感想

対象に応じて、リクエストするかどうかをコントロールできる値があるとは、ちょっとびっくり。こういったところに触れる機会がなかったので、この経験はありがたい。

# 参考サイト

http://blogs.msdn.com/b/askie/archive/2014/12/31/unable-to-play-html5-videos-in-ie.aspx

https://msdn.microsoft.com/en-us/library/ms537178(v=vs.85).aspx
JavaFX8のTableViewで発生するJDK-8144681不具合を回避する

JavaFX8で業務アプリを作っている際に踏んでしまったバグ <a href="https://bugs.openjdk.java.net/browse/JDK-8144681">JDK-8144681</a>。
私のとった回避策とソースコードをご紹介します。

# 1. 不具合JDK-8144681 とは？
`javafx.scene.control.TableView<S>`において **カラムの並び替え(re-ordering)** を行った際に発生する不具合。

### 前提条件
 - TableViewのセル複数選択を許可している（SelectionMode.MULTIPLE）

### 再現手順
 1. TableViewのデータセルを複数選択する
 2. ヘッダーセルをドラッグし、カラムの並び替えを行う
 
→ ドロップした際に`ArrayIndexOutOfBoundsException`が発生

# 2. 回避策
JavaFX8のライブラリ内のソースコードのため、根本原因を修正することは厳しい。
ので、例外が発生しないように回避策を立てる必要があります。

 - カラムの並び替えを使用不可にする
 - カラムの並び替え直前に選択状態を解除する
 - カラムの並び替えイベント発生時に選択状態を解除する

今回は「**カラムの並び替え直前に選択状態を解除する**」を対策として採用しました。

## 不採用の理由

### 使用不可
そもそも並び替えしなければ発生しない！
ただ、JavaFX8のTableViewデフォルト動作としてある「並び替え」機能を使用禁止にしてしまうとユーザビリティが落ちてしまう。そのため今回この策は見送った。

### イベント発生時に選択状態を解除
調査して分かったのだが、カラム並び替えの時「並び替え」を示すイベントが発生しない。
そのため並び替えをピンポイントで捕まえ、何かのアクションを仕掛けることができなかった:joy:

# 3. ソースコード
ドラッグのイベントは（なぜか）大元のTableViewで発生する。
他のドラッグイベントと区別するために、イベント発生源（target）がヘッダーに属しているかを判定しアクションを行うとする。

```java:FxApplication.java
// [JDK-8144681] 不具合回避のため reordering直前にselect/focusを解除する
tableView.addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> {
    boolean isHeaderNode = false;
    
    // 親ノードを探索し TableColumnHeaderに属しているかを調べる
    for (Node node = (Node) event.getTarget() ; ; node = node.getParent()) {
        if(node == null || node instanceof TableView) {
            break;
        }
        if(node instanceof TableColumnHeader){
            isHeaderNode = true;
            break;
        }
    }
    if(! isHeaderNode) return;
    
    tableView.getSelectionModel().clearSelection();
    tableView.getFocusModel().focus(-1);
});
```

# まとめ
かなり限定的な条件で発生する不具合ではありますが、JDK8でTableViewを使用すると必ず発生するので対策しておいて損はないと思います。
Rails-Mysqlのrake db:migrateができない問題

前回の問題はこちら

・Rails(mac OSX / CentOS)でsocketがないよって言われた時のもろもろ
　http://qiita.com/taiga8899/items/918563a1b04b106d32fb

今回はその続きです。
さあDBもできたし早速railsで基本的なアプリ(名前：tts)を作ろう！と思ってこんなふうに打って

$rails g scaffold hand card1:string card2:string

みたら以下のように怒られました。

Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (can't activate mysql2 (~> 0.3.10), already activated mysql2-0.4.2. Make sure all dependencies are added to Gemfile.) (LoadError)

なるほど。じゃあGemfileにviしてactiverecord-mysql2-adapterいれるね。ついでに
$bundle install
$bundle update
しておこう。んでもっかいscaffoldをrails gするとちゃんと通る。
そのあと、
$rake db:migrate
しようと思ったら今度はこれだよ。

rake aborted!
Mysql2::Error: Unknown database 'tts_development'

みたいに怒られました。

前回の記事で書いた通り、rails+mysqlではあらかじめDBを作らないとうまくrakeできないという。そうでした。というわけで早速mysqlを立ち上げて以下のクエリを通しました。

$ create database `tts_development` character set utf8 collate utf8_general_ci;
$ grant all on `tts_development`.* to `root`@'%' identified by '';

これでdatabase.ymlにある通りのmysql設定になりました。んじゃもう一回rake db:migrateしますか。

そしたら次はこれだよ。

NoMethodError: undefined method `accept' for nil:NilClass

うーわーなんじゃこれ。ググろ。
〜（５分後）〜
http://kiyotakagoto.hatenablog.com/entry/2013/06/04/004437
んん……？
いやrails2はちゃんと入ってるし（-v 0.4.2)activerecord2のアダプタがないと怒られたんですが……？　とりあえずgemfileからコメントアウトしますか。bundleしてからはいrake。

rake aborted!
LoadError: Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (can't activate mysql2 (~> 0.3.10), already activated mysql2-0.4.2. Make sure all dependencies are added to Gemfile.)

はいそうですか。意味わかんねえ。

というわけでちょっと調べてきます。解決したら続き書きます。だれか原因がわかったら教えてください。(rakeが通りました。以下確認)

----------------------------------------------------

どうも原因として2点考えられます。

・railsそのもののバージョンの悪さ
・mysql2のgemfileのバージョン指定の必要性
・mysqlのDB作成のやり方のまずさ

まずは1点目
どうもrails 3系でうまくいかないのでrails4に切り替えました。

次に２点目
http://qiita.com/kzkiq2nd/items/b29cb9cc478f490a591e
http://takuyan.hatenablog.com/entry/20110112/1294822377
ここに書いてある通り、なんかgem installで引っ張ってくる最新版のmysql2はぶっ壊れてるらしいです。んなこと知るか。というわけでバージョンを指定しましょう。

３点目
rake db:migrateする前にdbをmysqlサーバ内に作らないといけないのですが、その作り方をrake db:createでscaffoldした設定を利用して作成する必要があるようです。んなこと知るか。というわけでコマンドを打ちましょう。
Git 古いコミットの日付だけ新しくする

コミットの順番を入れ替えたいことがある（バグを修正したあとテストを書いたが、 CI 上で再現テストのコミットを一度 fail させてから修正のコミットで pass することを示したい、など）

`rebase -i` でコミットの順番を入れ替えられるが、日付はオリジナルのコミット順のままなので、 `git log` の並び順が時系列にならなくてちょっと気持ち悪い。そういうときに、見た目と時系列を合わせる方法。

`git commit --date` オプションを使う。 `--date=now` と指定できて便利。
https://git-scm.com/docs/git-commit

# reflog から cherry-pick -> 日付を変更して再び commit する場合

```bash
$ git cherry-pick c3fe8ff
[fix/XXXX 47e1d1d] Lorem ipsum dolor sit amet, consectetur adipisicing elit,
 Date: Fri Jan 15 16:30:34 2016 +0900
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git commit --amend -C head --date=now
[fix/XXXX 4928054] Lorem ipsum dolor sit amet, consectetur adipisicing elit,
 Date: Fri Jan 15 16:55:11 2016 +0900
 1 file changed, 1 insertion(+), 1 deletion(-)
```

# 一度 stage し、改めて commit するとき前と同じ commit message を使いたい場合

```bash
# -C をつけると日付も指定した元 commit と同じになってしまうが...
$ git commit -C c3fe8ff
[fix/XXXX b454f1d] Lorem ipsum dolor sit amet, consectetur adipisicing elit,
 Date: Fri Jan 15 16:30:34 2016 +0900
 1 file changed, 1 insertion(+), 1 deletion(-)

# --date=now をつけると日付を変更してくれる（メッセージは同じものを再利用してくれる）
$ git commit -C c3fe8ff --date=now
[fix/XXXX 7c8d3eb] Lorem ipsum dolor sit amet, consectetur adipisicing elit,
 Date: Fri Jan 15 16:53:20 2016 +0900
 1 file changed, 1 insertion(+), 1 deletion(-)
```

元ネタ http://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git#comment8900550_5017265
【MySQL】ERROR 2002の対処法

##状況

私は研究でWebサーバーを構築し，その中にMySQLを入れているのですが，ある日突然mysqlを起動すると下記のエラーが出て起動しなくなりました．

```lang:error
# mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
```

その際、私が行った対処を下記に記す．

##対処法

###**原因**
原因は，mysql.sockが上記のエラーに書かれている場所にないことだと思うので，作ってやればいい．

##**mysql.sockの作成**

```lang:コマンド
# touch /var/lib/mysql/mysql.sock
```

これで，上記の場所にmysql.sockが作成されたので，再度MySQLを起動してみる．

```lang:コマンド
# /etc/rc.d/init.d/mysqld start
```

これで私は，MySQLを起動することができた．
【メモ】PostgreSQLの明示的テーブルロック

たまにタイトルのようなことをやる必要が出てくるので、忘れた時用にメモ

### SELECTを許容する場合

```sql
BEGIN;

LOCK TABLE hoge IN EXCLUSIVE MODE;
```

### SELECTも不可にする場合

```sql
BEGIN;

LOCK TABLE hoge IN ACCESS EXCLUSIVE MODE;
```

いずれにしてもcommitした時点でロックは解除される。
AndroidでAnimatorSetをRepeatするときの注意点

ちょっとハマったのでメモ。

# AnimatorSetをリピート

Androidで xmlのAnimatorを定義する際、`<set>` タグの属性でrepeatさせることができない。
なので通常は以下のように繰り返し再生する。

```kotlin
animator.addListener(object : Animator.AnimatorListener {
    override fun onAnimationRepeat(animation: Animator?) {
    }

    override fun onAnimationStart(animation: Animator?) {
    }

    override fun onAnimationCancel(animation: Animator?) {
    }

    override fun onAnimationEnd(animation: Animator?) {
        animation?.start()
    }
})
animator.start()
```

だがこのままだとアニメーションが終了することができない。
viewを置換したあともAnimationが残り続け、いずれはStackOverflowExceptionを起こす。

```kotlin
var canceled = false
animator.addListener(object : Animator.AnimatorListener {
    override fun onAnimationRepeat(animation: Animator?) {
    }

    override fun onAnimationStart(animation: Animator?) {
        canceled = false
    }

    override fun onAnimationCancel(animation: Animator?) {
        canceled = true
    }

    override fun onAnimationEnd(animation: Animator?) {
        if (!canceled) {
            animation?.start()
        }
    }
})
animator.start()
```

きちんとキャンセル時の対応を入れてあげればOK。
find ~ xargs ~ sedをやろうとしたら厳しかったのでRubyを使った話

あるAPIのキーが変わったので、スクリプトに直接書き込まれたそれらを変更しなければならなくなった。こういう用途にまず思いつくものとして、Linuxコマンドのイディオムに`find ~ xargs ~ sed`というのがあって

```
find ./ -type f | xargs sed -i "s/OldXxxXXXxX/NewXxxXXXxX/g"
```

と書いてみたが、このコマンドは動かなかった。

```
$ find ./ -type f | xargs sed -i "s/OldXxxXXXxX/NewXxxXXXxX/g"
sed: 1: "./%cabinet/": invalid command code .
xargs: sed: Argument list too long
```

おそらくだが、プログラムが適切にエスケープできない文字が混入しているファイルパスがあって、それでつまづいてしまうのである。

そこで、Rubyで似たようなことをするスクリプトを書いた。
適切にエスケープをやってくれる`Shellwords.#escape`があるからだ。
また、sedに食わせると更新日時が変わってしまうので、置換が必要なファイルだけをsedに食わせていくことにする。

```ruby
old_s = 'OldXxxXXXxX'
new_s = 'NewXxxXXXxX'

files = `grep -rwl '.' -e "#{old_s}" --include='*.rb'`.split("\n")
files.each do |fp0|
  fp = Shellwords.escape(fp0)
  puts "---> #{fp}"
  puts `sed -i '' 's/#{old_s}/#{new_s}/g' #{fp}`
end
```

このコードを対象のルートディレクトリで動かしたところ、うまくいった。

なお、このコードは一旦grepで全部のファイルを見つけてからsedをやっていて、本当はgrepでファイルが発見されるたび逐次sedを呼びたいのだけど、うまくやる方法がわからなかった。
【MySQL】ERROR 1045 の対処法

##状況

研究でWebサーバーを構築している際に，MySQLをインストールした直後に，起動すると下記のようなエラーが発生した．

```lang:error
# mysql -u root -p
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

このときに私が行った対処法を下記に記す．

***

##対処法

###**MySQLの停止**
MySQLが稼働している場合は，一旦停止する．

```lang:コマンド
# service mysql stop
```

###**オプション付きで起動**
MySQLを権限システムを使用せずに起動する．

```lang:コマンド
# mysql_safe --skip-grant-tables &
```

###**mysqlコマンドプロンプトに入る**

```lang:コマンド
# mysql -u root
```

###**rootへの権限設定**

現状の設定の確認

```lang:コマンド
> use mysql;
Database changed
> select * from user;
Empty set (0.00 sec)
```

rootユーザに全てのDBに関する権限を設定し，PWを指定．
念のためuserテーブルを全削除してから実行する．
ここでは実行結果は省略する．
なお，```grant```コマンドのPWとはMySQLの起動時のパスワードとなるので，任意で設定してください．

```lang:コマンド
> truncate table usr;
> flush privileges;
> grant all privileges on *.* to root@localhost by 'PW' with grant option;
> flush privileges;
```

###***MySQLの再起動***

これでrootユーザへの権限設定ができましたので，MySQLを通常起動する．

```lang:コマンド
> quit;
# service mysql start
```

これで，私はMySQLを起動することができました．
nfsマウントする際の使用ポート

#前提
アクセス制限をしている
nfs-utilsでnfsサーバを立てている

#nfsv3の場合

お察し

#nfsv4の場合(最近はデフォルトでこれ)
TCP：2049 を開放
以上


#おまけ
IPv6使ってない場合はnfs start時にエラーかワーニングがでる
postfixでも同じように対処

以下に修正

```
# vi /etc/netconfig
#udp6       tpi_clts      v     inet6    udp     -       -
#tcp6       tpi_cots_ord  v     inet6    tcp     -       -

```
JPAの性能問題と対策

Java EEのJPAは便利だけれど、使い方を間違えると性能問題が発生する。
代表的な問題と対策について調べてみました。

# JPAを使うメリットとネイティブSQLを使うという選択肢

JPAを使うメリットは次の2つあるかと思います。

1. 生産性・保守性向上
2. RDBMSへの依存性排除

1は特に動的にSQLを生成する場合には大きなメリットとなります。
動的にSQLを生成する必要がなく、RDBMSを変更することがなく、かつ、新しい技術への好奇心がないメンバーの場合は、JPAを使わずにネイティブSQLを使った方がよいかもしれません。

# 代表的な問題と対策

## N+1問題

### 問題

親子関係があるEntityで次のようにデータを取得すると、初めにparentsをとるために1回、ループの中でN回のSQLが発行されてしまう。
（生SQLならjoinで1回なのに）

```java
List<Parent> parents = query(Parent).all();
for (Parent parent: parents) {
  System.out.print(parent.child.name);
}
```

### 対策

JPAの場合、JPQLでJOIN FETCHを使用する。

```JPQL
SELECT p FROM Parent p JOIN FETCH p.children
```

のように記述すると、次のSQLが発行される。

```SQL
SELECT p FROM Parent p LEFT OUTER JOIN FETCH p.children
```

他にも、@Fetchや@JoinFetchアノテーションを使用する方法もあるが、それぞれ、Hibernate, EclipseLink固有。

## バルクinsert, update, delete問題

### 問題

大量のデータをループでmerge, removeしてしまい、大量のSQLが発行される。

### 解決策

JPAのbulk処理があるらしいが、これといった定番の方法がみつからない。
いずれにしても、まずは本当に大量データループで処理する必要があるのかを検討する。
ダメな場合は、DB固有のバルク処理にするのが現実的か。

## クエリ発行箇所が特定できない問題

### 問題

DBで性能解析し、問題のあるSQLを特定しても、発行箇所はJPAなので、対応がわかりにくく、どこで発行されたSQLなのかわかりにくい。

### 解決策

ログに呼び出し元の情報（class, methodなど）とSQLを記録する。

## インデックスつけ忘れ問題

### 問題

SQLやRDBの仕組みを知らなくてもプログラミングできてしまうため、indexの付け忘れがおきやすい。

### 解決策

レビューや単体性能テストで、インデックス付け忘れを防止する。
そのために、性能要件がシビアな部分は事前に洗い出し、単体性能テストの大量データを準備しておく。


※参考：アノテーションによるインデックス定義

```
@Entity
// @Tableアノテーションのindexesでインデックスを定義。
// coolumnListはテーブル側の列名でカンマ区切り
@Table(indexes = @Index(name = "member_index", columnList = "NAME,ID", unique = true ))
public class Member implements Serializable {
```

## 不要な大容量カラムを無意味に取得してしまう問題

### 問題

Blobやtextなど大容量のカラムがあり、それらが不要にも関わらず取得してしまい、性能問題になる。

### 解決策

プロパティの遅延ロードをする(@Basic(fetch = FetchType.LAZY))。
遅延ロードではデータが必要になって初めてSQLを発行する。
このため、トランザクションが終了している場合にはデータを取得できない点に注意が必要。

```
@Entity
public class ContainsBlob implements Serializable {

    @Id
    private String name;

    @Column
    @Lob
    @Basic(fetch = FetchType.LAZY)
    private byte[] largeData;

    // 省略
}
```

また、できれば、blobやtextはできるだけ別テーブルにする。
それができなければ、必要なカラムだけを指定したView Tableを用意する。

# 参考にした情報

* [O/Rマッパーによるトラブルを未然に防ぐ](http://www.slideshare.net/kwatch/how-topreventorm-troubles)
* [Java EE 7徹底入門](http://www.amazon.co.jp/dp/4798140929)
* [JavaEE7をはじめよう(9) - JPA TIPS](http://enterprisegeeks.hatenablog.com/entry/2015/05/18/072811)
* [JPAとN+1問題](http://bbook.hatenablog.jp/entry/2015/02/16/234848)
* [TERASOLUNA Global Framework Development Guideline](https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/DataAccessCommon.html#n-1)
[ jenkins ] リモートからジョブの実行

Jenkinsのwikiを見てリモートからのジョブ実行を試行錯誤メモ。

##0. 基本

ご存じのとおり基本的にはこんな感じで起動できる

```bash:
curl http://[jenkins-server]:8080/job/[job_name]/build
```

以下は応用編。
ネタ元はjenkinsのwiki[https://wiki.jenkins-ci.org/display/JA/Remote+access+API]

##1. tokenを使ってみる
jenkinsのグローバルセキュリティの設定でsecurityをONにしている場合、もうちょっと頑張る必要あり。
あと、プロキシとかを経由しないとjenkinsサーバにたどり着かない場合も多々あり。。。。。
そんなときはtokenを使用する。(ほかにもcurlのuオプションでユーザ認証するなど別の方法もある。)

`Build Triggers`セクションに`Trigger builds remotely (e.g., from scripts)`というチェック項目がある。
これにチェックを入れてtokenを適当な文字列で設定する。いま仮に`test`と設定。

上記の前提だとジョブはこんな感じで起動できる

```bash
export proxy="[proxyserver]:[port]"
export url="http://[jenkins-server]:8080/job/[job_name]/build"
curl -x $proxy -X POST $url -d token=test
```


##2. パラメータも一緒に渡す。
ジョブの設定でパラメータを使う場合。
`param1`が設定したパラメータ名で`testvalue1`がジョブ実行時に渡す値。

```bash
export json="{\"parameter\": [{\"name\": \"param1\", \"value\": \"testvalue1\"}] }"
curl -x $proxy -X POST $url -d token=test --data-urlencode json="$json"

```


整形済みのjsonファイルで渡してみる

```bash
cat testfile2.json
{
  "parameter": [
    {
      "name": "param1",
      "value": "testvalue1"
    }
  ]
}
curl -x $proxy -X POST $url -d token=test --data-urlencode json="`cat testfile2.json`"

```
出来た。

最後に複数のパラメータを渡して実行してみる


```bash
cat testfile2.json
{
  "parameter": [
    {
      "name": "param1",
      "value": "testvalue1"
    },
    {
      "name": "param2",
      "value": "testvalue2"
    }
  ]
}
curl -x $proxy -X POST $url -d token=test --data-urlencode json="`cat testfile2.json`"

```

ちゃんとジョブがリモート実行できました。
動作 OS に合わせてコードの分岐を行う

## コンパイル時点でOS毎に分岐
OS固有のAPIを呼び出したり、OS毎に処理を分岐させたい場合に
実行時にアプリを起動しているOSの種別を取得して処理を分岐する方法もありますが、コンパイル時点で処理を分岐する方法もあります。
コンパイル時に処理を分岐するには、{$ifdef }命令を記載します。
{$ifdef } は、関数内に記載しても良いですし、クラス定義の段階で記載しても良いです。

#### 記載例
```Pascal
  {$ifdef Darwin}
    // ここに Mac OS 向けのコードを記載
  {$else}
  {$ifdef Windows}
    // ここに Windows OS 向けのコードを記載
  {$else}
    // ここに Linux 等、他の OS 向けのコードを記載
  {$endif}
  {$endif}
```

#### クラス定義の分岐の例
```Pascal
type
  TTestObject = class(TObject)
  private
  {$ifdef Darwin}
    // ここに Mac OS 向けのコードを記載
  {$else}
  {$ifdef Windows}
    // ここに Windows OS 向けのコードを記載
  {$else}
    // ここに Linux 等、他の OS 向けのコードを記載
  {$endif}
  {$endif}
  end;
```

#### 関数内の分岐の例
```Pascal
function GetText(): String;
begin
  {$ifdef Darwin}
    // ここに Mac OS 向けのコードを記載
  {$else}
  {$ifdef Windows}
    // ここに Windows OS 向けのコードを記載
  {$else}
    // ここに Linux 等、他の OS 向けのコードを記載
  {$endif}
  {$endif}
end;
```
面白いLinuxバグ

Grup2画面で、28回BackSpaceボタンを押したら、ログインしなくても、ファイルをアクセスできる不具合です
結構歴史がる不具合です。
時間があったら、試してみたい
http://hmarco.org/bugs/CVE-2015-8370-Grub2-authentication-bypass.html
[NetworkX]特定の属性を持つノードを検索したい

# 概要

研究でNetworkXを使っているのですが，特定の属性を持つノードを検索したくなって，そのようなメソッドがあるか探してみた結果どうやらなさそうなので作りました．

# コード

```py3:find_specific_attribute_node.py
import networkx as nx

def find_specific_attribute_node(G, attr, value):

    result = []

    d = nx.get_node_attributes(G, attr)

    for key, v in d.items():
        if(v == value):
            result.append(key)

    return result
```

# 動作例

以下の様なテストプログラムを走らせてみます．

```py3:find_node_test_for_qiita.py
import networkx as nx
from find_specific_attribute_node import find_specific_attribute_node as find_nodes
if __name__ == '__main__':

    Graph = nx.DiGraph()

    Graph.add_node('a', color = 'blue')
    Graph.add_node('b', color = 'red')
    Graph.add_node('c', color = 'blue')
    Graph.add_node('d', color = 'red')
    Graph.add_node('e', color = 'blue')
    Graph.add_node('f', color = 'red')

    print(find_nodes(Graph, 'color', 'blue'))
```

以下実行結果です．

```py3:実行結果
['a', 'e', 'c']
```

`color`属性に`blue`が設定されているノード名からなるリストが取得できていることがわかります．
# 説明
すごい適当に作ったものなのでアレですが，引数は以下の3つです．

- G : 検索対象となるグラフ
- attr : 検索したい属性名
- value : 見つけたいattrの値

返り値は見つかったノード名のリストです．

# おわりに

すごく要求されそうなものなので実際はNetworkXに似たような機能のメソッドが存在しているのかもしれません．誰か教えて下さい．

あと，メソッドとかの命名規則をちゃんと勉強してないので，「こういう名前をつけたほうがいい」とかありましたら教えていただけると僕が嬉しいです……