OmniAICreator/Qiita-1.07M huggingface dataset:
再帰関数の練習


等差数列を使って再帰関数のイメージをつかむための練習。

##等差数列
等差数列は、初項$a_1$、公差$d$で表される数列で、第$n$項目$(n > 1)$を以下の一般項と呼ばれる式であらわす。

```math
\begin{equation}
a_n = a_1 + (n-1)\times d 
\end{equation}
```

##再帰関数
再帰関数とは、関数の定義内で自分自身を呼ぶ関数である。
例えば、数学的に表すと、

```math
\begin{aligned}
f(x) &= x + f(x-1)\ \ (x > 1) \\
&= 1\ \ (x \le 1)
\end{aligned}
```
の様な関数が有った場合$x$に9を代入すると、

```math
\begin{aligned}
f(9) &= 9 + f(9-1) \\
&= 9 + (8 + f(8-1)) \\
&= 9 + 8 + (7 + f(7-1)) \\
&= 9 + 8 + 7 + (6 + f(6-1)) \\
&= 9 + 8 + 7 + 6 + (5 + f(5-1)) \\
&= 9 + 8 + 7 + 6 + 5 + (4 + f(4-1)) \\
&= 9 + 8 + 7 + 6 + 5 + 4 + (3 + f(3-1)) \\
&= 9 + 8 + 7 + 6 + 5 + 4 + 3 + (2 + f(2-1)) \\
&= 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 
\end{aligned}
```
と式が展開されていく。
上の式は結果的には、1から9までの足し算を行った事になる。
1から9までの足し算であればプログラムでは以下の様に足し算できる。

```cpp
int sum(0);
for(int i = 9;i > 0;--i){
	sum += (int) i;
}
```

でも、$f(-10.0)$を代入したらどうだろうか。
この場合は、関数が返す値は1となる。for文では足りなくなってしまう。なので、上述の$f(x)$をプログラム的に記述する際は、

```cpp
double f(double x){
	double sum(0.0);
	if(x < 1){
		return 1.0;
	}
	sum = f(x-1) + x;
	return sum;
}
```

と記述してあげればよい。


##等差数列をあえて再帰関数を使って表現
再帰関数がどのように動くのかは上述した通り。
何となくイメージがつかめていればいいのかな。
さてさて、等差数列は初項と公差ささえ分かってしまえば第$n$項の値を求めるのは至極簡単。何の意味もないけど、再帰関数を使って等差数列を書いてみた。(どっかの本に再帰関数は数列を頭に思い浮かべるといい見たいに書いてあった気がした)

結果以下の様になった。

```cpp:sncd.cpp
#include <iostream>
using namespace std;

double fSNCD(double a1,double d,int n){
	double an;
	if(n == 1){
		return a1;
	}
	an = fSNCD(a1,d,n-1)+d;
	return an;
}

void SNCD(){
	double a1;
	double d;
	int n;
	
	cout << "*------------------------------------------*" << endl;
	cout << " Sequence of Numbers with Common Difference" << endl;
	cout << "*------------------------------------------*" << endl;
	cout << " Input First Term        >> ";cin >> a1;
	cout << " Input Common Difference >> ";cin >> d;
	cout << " Input Number (n > 1)    >> ";cin >> n;
	cout << endl;
	if(n > 1){
		cout << "       Results :: " << fSNCD(a1,d,n) << endl;
		cout << " Check Results :: " << a1 + (n-1)*d << endl;
		cout << endl;
	}else{
		cout << " Number is less than 1 !!! " << endl;
		cout << endl;
	}
}

int main(){
	SNCD();
	return 0;
}
```

最後結果を出すときにCheck Resultsとして、一般項から第$n$項目を求めている。

再帰関数の応用としてはフラクタルを描く事もできる。
いつか書いてみるかな。
オープンデータ・新潟・この1年

私ごときが新潟の地の事情を”代表”してしまうというものでは決してありません。
オープンデータの周縁にいる小さき者の振り返りとして，厚かましくもこのアドベントカレンダーに感謝の気持ちを記したいと思います。

:heavy_minus_sign: :heavy_minus_sign: :heavy_minus_sign: 

長くオープンデータ不毛の土地だった新潟市。
昨年の私の誕生日に，ハッカソンが開催された。

今年（2015年）はどうしても，新潟市からもIODDにエントリーしたい。
言い出しっぺが，やるしかない？
「少人数でも大丈夫，是非エントリーを」と，私の背中を押してくれた庄司昌彦さん，ありがとう。
おかげで，「デー潟2015」開催のひとり番頭になる決心ができた。
https://www.facebook.com/dgata2015/　　
（デー潟2015実行委員会のFBページ）

「デー潟2015（IODD新潟市）」会場は，開店前の時間に新潟駅前のクラフトビールバーsbrの2階をお借りした。
あとで，いい会場でしたね，と言ってもらえたよ。
会場としてお店を使わせてくれて，勝手のわからない私の会場設営を快く助けてくださった，SBRのマスター，島田達也さんありがとう。
当日は15人が集まった。
事例発表は私が講談ふうにやって，あとは楽しくディスカッション（※おしゃべりとも言う？）でもいいかな，と思っていたのに，阿部慎太郎さん，笹川純一さん，yutacarさん，松井正志さんが，それぞれにもうあり得ないくらい面白くて中身の濃い発表をしてくださった。
正直，いずれのみなさんも，普段から特段「親しく」していたわけじゃなかったのに（※笹川さんとyutacarさんは結構前からのお付き合いだが），突然のお願いを聞いてくださり，時間を割いてくださった。
ただただ感動。みんなありがとう。参加くださったみんなもありがとう。

その後，なんと，総務省信越総合通信局に，管内のIODD事例として，「デー潟2015」を取り上げていただいた。
「デー潟2015」の記録は，同通信局ウェブページにて公開されています。
http://www.soumu.go.jp/soutsu/shinetsu/sbt/opendata/opendata-index.html
（ページ中，「第3回会議 平成27年4月24日」の資料をごらんください。）

このお話をくださった，信越総合通信局の西澤昌信さん，ありがとう。
なぜわたくし阿部と西澤さんがつながったかというと，デー潟2015に興味を持ってくださった名古屋大学の遠藤守さんがFBで声をかけてくださったから。遠藤さんが私と西澤さんを繋いだ。遠藤さんありがとう，

さらに，オープンデータやオープンガバメント，「デー潟2015」について，社会情報学会東北支部で発表する機会もいただいた。新潟大学の北村順生さん，ありがとう。
http://www.ssi.or.jp/committee/commit10.html
（社会情報学会　東北支部からのお知らせ）

その後，新潟の企業立地課というところが，アイデアソン・ハッカソン「がたまる」を3月に実施。市の担当の川上英明さんは，シビックテックとか，たぶんすごく詳しいとかじゃないと思うんだけど，ガッツは本物。
https://www.city.niigata.lg.jp/business/kigyo/sokushinho/shien/ideathon-hackathon.html
（アプリ開発イベント「“がたまる”アイデアソン＆ハッカソン」新潟市公式ホームページ内）

「がたまる」がきっかけになり，新潟にもようやくCode for Niigataが立ち上がったよ。川上さん，ありがとう。

Code for Niigata代表の山田道也さんはじめとするみなさん，ありがとう。
私は大した働きできないけれど，みなさんこそが，私の夢みたものでした。
http://www.codeforniigata.org/
(【コードを紡いで、地域を繋ぐ】Code for Niigata）

今年はチャレンジの年で，特に最初の4半期に飛ばして，そのあとはちょっと失速してしまったけど，こうして振り返ると，オープンデータ繋がりでほんとうにたくさんの方にお世話になった1年でした。

来年はどんな年になるかな。

ちょっと早いけど，みなさんよいお年をお迎えください。

阿部由紀江（Code for Niigata）

（写真は三条市の”燕三条トライク”で開催したCode for Niigata主催「真夏のハッカソン！」のときのもの。Code for Niigataウェブページより借用）
![PK5_1565-1024x683.jpg](https://qiita-image-store.s3.amazonaws.com/0/104136/b99bc26d-648d-fb50-356c-7d5e263628d6.jpeg)
zshのmanを読もう

zshのmanは非常に詳しく、正確に書かれています。しかし、その分量が多くて例も少ないので、かなり読みにくいです。なので、これから何回かに分けてzshのmanページを解説していきます。

まず今回はzshのmanについての概要を説明します。

zshのmanは量が多いので17個に分割されています。各ページの名前と簡単な説明は次の通りです。

| 名前 | 説明 |
|:------------|:------------|
|zsh          | zshの概要                                |
|zshroadmap   | zshのmanの概要                           |
|zshmisc      | その他すべて                             |
|zshexpn      | 展開機能について                         |
|zshparam     | 変数について                             |
|zshoptions   | オプションについて                       |
|zshbuiltins  | 組み込みコマンドについて                 |
|zshzle       | コマンドライン編集について               |
|zshcompwid   | 補完ウィジェットについて                 |
|zshcompsys   | compsysという補完システムについて        |
|zshcompctl   | compctlという補完システムについて        |
|zshmodules   | モジュールについて                       |
|zshcalsys    | カレンダーシステムについて               |
|zshtcpsys    | TCPシステムについて                      |
|zshzftpsys   | zftpコマンドのラッパー関数について       |
|zshcontrib   | ユーザーから投稿されたスクリプトについて |
|zshall       | 他のすべてのzsh manページを集めたページ  |

たくさんあって楽しくなってきますね。

この中でも特に読んだほうが良いページは「zshexpn」と「zshoptions」です。

zshexpnは展開に関するmanページです。展開というのはつまり、短い文字列を長い名前に置き換えることです。コマンドライン履歴の展開やファイル名生成(ワイルドカードなど)がこれにあたります。展開機能を使いこなせば、本来より短い名前で指定できるようになるので、コマンドライン操作が速く快適になります。

zshoptionsはzshのオプション一覧とその解説が書かれています。これを見て便利だと思うオプションを試してみると良いです。

zshをカスタマイズして便利に使おうという典型的なzshユーザーは、この2つを読んでおけばだいたいのことができるでしょう。

その他、役に立つものからどうでもいいものまで、たくさんページがあります。このアドベントカレンダーを利用して、今後いくつか解説していくので、お楽しみに。
Vim-Airlineの設定ではまったからメモ

# Airlineとは
Vimのステータスラインをかっこ良くしてくれます。
あと、Powerlineより速いです！
例：[vim-airlineから引用](https://github.com/bling/vim-airline/blob/master/README.md)
![Vim-Airline-Demo](https://raw.githubusercontent.com/wiki/bling/vim-airline/screenshots/demo.gif)

# Airlineの設定方法
1. `NeoBundle`が入っているなら.vimrcに`NeoBundle 'bling/vim-airline'`します
2. この状態でvimを開くと正しく表示されません
3. ターミナルのフォントを`powerline`フォントに設定をします
(powerlineフォントがないならインストールするか、`fontforge`を使ってパッチを適用します)
4. この状態でvimを起動すると以下のようになります
![スクリーンショット 2015-12-04 21.27.32.png](https://qiita-image-store.s3.amazonaws.com/0/57682/89e811ef-01c9-79c6-876e-2284f83ad82f.png)  
なんか表示がおかしい！
これで1日くらい悩みました。結果的にはReadMeよく読んでなかった(+_+)  
5. .vimrcに`let g:airline_powerline_fonts = 1↲`を書けば治ります  
(他にも、`set laststatus=2↲`を書き忘れたりしやすいです)  
修正したら以下のように正しく表示されました。
![スクリーンショット 2015-12-04 21.29.03.png](https://qiita-image-store.s3.amazonaws.com/0/57682/09f93242-7a1a-4777-71d9-f1eb591a98ef.png)

# まとめ
vim-airline使うと、vimをかっこ良く装飾できます
是非使ってみましょう！
Readmeはよく読みましょう！（自分への言い聞かせ）
XcodeServerでCarthage管理のライブラリバージョンを変えるとエラーが出る

# 背景
1. Carthageを利用したプロジェクトをXcode ServerでCI回していた
2. Cartfileに明確にバージョン指定していなかった
3. SwiftDateが2.0に
4. ふいに`carthage update`してしまいエラーが発生
5. Cartfileにバージョン指定をしたが、いつまでもSwiftDate2.0を見続ける（`beginningOfDay`ねぇよって）
    * Botが使ってるCacheディレクトリ（`/Library/Developer/XcodeServer/Integrations/Caches/`）を消してもダメ
    * Carthageのキャッシュ（`~/Library/Caches/org.carthage.CarthageKit/`・`~/Library/Caches/carthage/`・`/var/_xcsbuildd/Library/Caches/org.carthage.CarthageKit/`・`/var/_xcsbuildd/Library/Caches/carthage/`）を消してもダメ
    * 再起動してもダメ

# 状況把握
* Carthage/Checkoutsまでは合ってる
* `/Library/Developer/XcodeServer/Integrations/Caches/`内のプロジェクトをローカルに持ってくると
    * そのままビルドするとダメ
    * `carthage bootstrap`しなおすと通る

# 解決策
https://github.com/Carthage/Carthage/issues/385
を見つけ、もしや...と思い。
1. `~/Library/Developer/Xcode/DerivedData/`削除
2. `/var/_xcsbuildd/Library/Developer/Xcode/`削除

で、きちんとCartfile.resolved通りビルドされました...
`/Library/Developer/XcodeServer/Integrations/Caches/`に`DerivedData`も入っているので消しているつもりでしたが、これらも削除しないといけないらしい。
詰んだときにはご参考に。
RxSwift で MVVM パターンを作るときに参考になるサンプルコードまとめ

公開されているものがまだ少ないのでまとめます。
見つけ次第 更新します。

# サンプルコード

## artsy/eidolon

[artsy/eidolon](https://github.com/artsy/eidolon)

オープンソースの iOS アプリ。
元々は RAC 2 で作っていたものを RxSwift で書き換えたとのこと。

その PR がこちら: 

> Migrates from ReactiveCocoa 2.x API to RxSwift #569
> https://github.com/artsy/eidolon/pull/569

## sergdort/RxMarvel

[sergdort/RxMarvel](https://github.com/sergdort/RxMarvel)

> Keeping this in mind I like to think about ViewModel as a “Black Box” which accepts some UI triggers, other dependencies and apply some Rx operators
> https://medium.com/@SergDort/viewmodel-in-rxswift-world-13d39faa2cf5

## devxoul/RxTodo

[devxoul/RxTodo](https://github.com/devxoul/RxTodo)

> ## Philisophy
>- View doesn't have control flow. View cannot modify the data. View only knows how to map the data.
>- View doesn't know what ViewModel does. View can only communicate to ViewModel about what View did.
> - Model is hidden by ViewModel. ViewModel only exposes the minimum data so that View can render.

## yuzushioh/sandbox

[yuzushioh/sandbox] (https://github.com/yuzushioh/sandbox/tree/master/RxSwift%2BPostViewModel)

[発表資料](https://github.com/yuzushioh/sandbox/blob/master/RxSwift%2BPostViewModel/RxSwift%E5%8B%89%E5%BC%B7%E4%BC%9A.pdf)があります

## tryswift/RxPagination

[tryswift/RxPagination](https://github.com/tryswift/RxPagination)

RxSwift と APIKit, Himotoki を用いた実装例。
try! Swift での[発表内容](https://speakerdeck.com/ishkawa/protocol-oriented-programming-in-networking) もまとまってます。

## RxSwift/RxExample

[WikipediaImageSearch](https://github.com/ReactiveX/RxSwift/tree/master/RxExample/RxExample/Examples/WikipediaImageSearch)

TableView と API クライアントの実装例。

# おまけ

RxSwiftは使っていないですが、MVVM パターンのサンプルコードもまとめてみます。

## NatashaTheRobot/ProtocolOrientedMVVMExperimentSwift

[NatashaTheRobot/ProtocolOrientedMVVMExperimentSwift](https://github.com/NatashaTheRobot/ProtocolOrientedMVVMExperimentSwift)

> Natasha the Robot will walk you through her process of learning and using protocol-oriented programming to leverage Swift 2.0’s power and create beautiful, robust code.
> https://realm.io/news/doios-natasha-murashev-protocol-oriented-mvvm/

発表内容にある再利用可能な protocol を用意して ViewModel を組み立てるアプローチが参考になります。

## kumapo/ProtocolOrientedMVVM

[kumapo/ProtocolOrientedMVVM](https://github.com/kumapo/ProtocolOrientedMVVM)

[NatashaTheRobot/ProtocolOrientedMVVMExperimentSwift](https://github.com/NatashaTheRobot/ProtocolOrientedMVVMExperimentSwift) を自分なりにアレンジしたもの。


# あとがき

もし よさげなサンプルコードを見つけた方がいましたらコメントにてお知らせください。
AppLink for Blenderがうまく動かないときのおはなし

**AppLink for Blenderがうまく動かないときのおはなし**

某所で晒したことのある画像ですが、ここでも晒すことにします。
Blender用のApplinkが何の反応もしないってときに、これで直るかも。
もしかしてもう公式で対処されてるかもしれないけど、首をかしげてる人の助けになれば。


いちまいめの画像
![tapplinktutorial1.png](https://qiita-image-store.s3.amazonaws.com/0/103927/3a47375f-aeab-ce3f-4d74-197e52f3d6e0.png)


･･･3D-Coatには、他ソフトとボタン一つでデータをやりとりできるAppLinkっちゅうかなり便利な機能があるんだけど、3D-coatがバージョン4.5になって、統合ソフトBlenderとの間でその機能がうまく動いていない謎があった。原因は、4.5でMyDocuments用フォルダが新しくなったかららしい。


にまいめの画像
![tapplinktutorial2.png](https://qiita-image-store.s3.amazonaws.com/0/103927/43e33de2-bb6f-1f13-d0cb-c57f0c65b551.png)


･･･フォルダが新しくなったのが原因なら、Blenderのapplinkプラグインをメモ帳で開いて、フォルダ名を指定してる部分の行を自分で書き換えてやれば直るはずだ。


さんまいめの画像
![tapplinktutorial3.png](https://qiita-image-store.s3.amazonaws.com/0/103927/aea97db5-226a-478b-fe4f-f1040d1679ae.png)


･･･Blender側のプラグインのほうは直った。で、3D-Coatさんにも、フォルダの名前を正しく教えてやる必要があるので、Exchange_folder.txt･･････エクスチェンジフォルダ.txtってそのまんまの名前でわかりやすいね、このテキストファイルに書かれた1行を正しく変えてやれば、3D-Coatもフォルダを間違えないでくれる。


さいごの画像
![tapplinktutorial4.png](https://qiita-image-store.s3.amazonaws.com/0/103927/31dd683c-cedf-44cc-2299-f388496fc808.png)


･･･フォルダ名の書き換えが正しく終わると、3D-CoatとBlenderの間で、モデルがちゃんと交換できるようになると思う。

最後に
1回1回objでエクスポートして渡しあうのでも良いっちゃ良いんだけど、特に統合ソフト側からデータを3D-Coatへ送るときに、AppLink機能はかなり便利なので、もし正常に動いていなかった人は、これを機に使ってみてはいかがでしょう。面白いよ。

3D-Coat　AppLinkの公式説明ページはこちら
http://3d-coat.com/applinks/?no_cache=1
itamaeでホームディレクトリにrbenv環境を構築する



itamaeでホームディレクトリにrbenv環境を構築する事例がウェブに見当たらなかったので、[サロン当日予約アプリPopcorn](https://popcorn.coubic.com) で採用した方法をご紹介します。


なお、環境は Ubuntu 14.04 ですが、どの OS でも大丈夫なはずです（たぶん）。


## 完成したレシピ

```ruby
# cookbooks/ruby/default.rb

include_recipe './attributes/default.rb'

rbenv_dir          = node['rbenv']['root_dir']
rbenv_versions     = node['rbenv']['versions']
rbenv_version      = node['rbenv']['version']
rbenv_owner        = node['rbenv']['owner']
rbenv_group        = node['rbenv']['group']
sudo               = "sudo -u #{rbenv_owner} -i"

git rbenv_dir do
  repository 'git://github.com/sstephenson/rbenv.git'
end

directory "#{rbenv_dir}/plugins" do
  not_if "test -d #{rbenv_dir}/plugins"
end

git "#{rbenv_dir}/plugins/ruby-build" do
  repository "git://github.com/sstephenson/ruby-build.git"
end

execute "chown #{rbenv_dir}" do
  command "chown -R #{rbenv_owner}:#{rbenv_group} #{rbenv_dir}"
end

rbenv_versions.each do |version|
  execute "rbenv install #{version}" do
    command "#{sudo} rbenv install #{version}"
    not_if  "#{sudo} rbenv versions | grep #{version}"
  end
end

execute "rbenv local #{rbenv_version}" do
  command "#{sudo} rbenv local #{rbenv_version}"
end

execute "rbenv global #{rbenv_version}" do
  command "#{sudo} rbenv global #{rbenv_version}"
end

execute "gem install bundler" do
  command "#{sudo} gem install bundler"
  not_if  "#{sudo} gem list | grep bundler"
end
```

工夫したポイントをいくつかご紹介します。

### node attributes

node.reverse_merge! を使って、デフォルトを設定しています。

```ruby
node.reverse_merge!(
  rbenv: {
    root_dir: '/home/kotaroito/.rbenv',
    owner: 'kotaroito',
    group: 'kotaroito',
    versions: %w(2.1.4),
    version: '2.1.4'
  }
)
```

詳しくは、itamae作者の荒井さんが http://gihyo.jp/admin/serial/01/itamae/0003 にて説明してくださっています。


### sudo


```ruby
sudo = "sudo -u #{rbenv_owner} -i"
```

sudo で -u と -i オプションを指定しています。

```
-i, --login

 Run the shell specified by the target user's password database entry as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell.  If a command is specified, it is passed to the shell for execution via the shell's -c option.....
```

```
-u user, --user=user

  Run the command as a user other than the default target user (usually root )....
```

これらオプションによって、~/.bash_profile を読み込んでくれるので、rbenv install や gem install bundler を node attributes で指定したユーザで実行することができます。


以上です。
udevを使ってPCIバスIDとNIC名称を固定する方法

# MACアドレスとNIC名称の固定
CentOS 6ではMACアドレスとNIC名称を固定する設定が`/etc/udev/rules.d/70-persistent-net.rules`に投入されています。

```
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x10ec:0x8139 (8139cp)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```

このように設定で指定されていてMACアドレス`52:54:00:xx:xx:xx`のNICは必ず`eth0`という名前になります。

この状態で不便なところは物理サーバの筐体故障が発生したときです。復旧作業でディスクを同スペックの別筐体にのせかえることがありますが、MACアドレスが変わっているので新しい筐体のNICを`eth0`として認識してくれません。`eth0`として認識させるためには先ほどの設定ファイルにある`52:54:00:xx:xx:xx`部分を書き換える必要があります。
仮想サーバでもディスクイメージを複製して複数のサーバを立ち上げたいときに書き換えの手間が発生します。

# MACアドレスからPCIバスIDに変更
udevではMACアドレスの他にPCIバスIDを使ってNIC名称を固定することができます。

1.まずMACアドレスが設定されているファイルを削除して書き込めないようにします。

```
# ln -fs /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

2.PCIバスIDをethtoolコマンドから確認します。

```
# ethtool -i eth0 | grep bus-info
bus-info: 0000:00:03.0
```

3.このPCIバスIDを使ってudevルールを`/etc/udev/rules.d/99-net.rules`に書き込みます。

```
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:00:03.0", NAME="eth0"
```

以上で完了です。これで筐体を変えても同じ機器構成の筐体であれば同じNIC名称で認識してくれます。

参考にMACアドレスからPCIバスIDに変更するスクリプトです。認識している全NICのPCIバスIDを取得してudevルールを設定します。

```lang:bash
#!/bin/bash

ln -fs /dev/null /etc/udev/rules.d/70-persistent-net.rules

net_rules=/etc/udev/rules.d/99-net.rules
rm -f $net_rules

for nic in `ifconfig -a | awk '/^eth/ {print $1}'`
do
        nic_pciid=`ethtool -i $nic | awk '/^bus-info/ {print $2}'`
        echo 'SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="'$nic_pciid'", NAME="'$nic'"' >> $net_rules
done
```

※このスクリプトを実行すると`/etc/udev/rules.d/99-net.rules`が削除されるのでご注意ください。

# おわりに
udevはこの他にも処理の途中でスクリプトを実行できたりもします。複数のiscsiへ接続する際は接続した順番でデバイス名が変わってしまい確認がめんどうです。ですが簡単なスクリプトを用意すれば毎回同じディレクトリにマウントさせるといったことも行えます。
以上udevの利用方法紹介でした。
多段SSHポートフォワードを使ってAWSのRDSに接続する


# 概要
Macから多段SSHポートフォワードを使って、AWS上のRDSに直接接続する方法。

# 構成
Mac --> 踏み台(EC2) --> 開発サーバ(EC2) --> 開発MySQL(RDS)

# 手順
## ポートフォワード
コンソールを１つ開いて、下記のコマンドを入力
```
ssh -t -L 13306:localhost:44444 踏み台のPublicIP ssh -L 44444:RDSのEndPoint:3306 開発サーバのPrivateIP
```

## RDS接続
コンソールをもう一つ開いて、下記のコマンドを入力
```
mysql -h 127.0.0.1 -P 13306 -u dbユーザ -p
```

以上。
git rebase -i で “Could not execute editor”

gitに設定されているvimのパスがよろしくないらしい。
以下のコマンドで解決した。

```bash
% which vim                                                                                                                                                                                                                    (git)-[topic-help-#21]
/usr/local/bin/vim
% git config --global core.editor "/usr/local/bin/vim"
```

参考:http://blog.44uk.net/2011/09/26/could-not-execute-editor-while-using-git/
katsuya-san/ESP8266-THETA-S-SimpleRemoteControler で少し引っかかったこと

# 基本
 全てはここ(と記載されているリンク先) https://github.com/katsuya-san/ESP8266-THETA-S-SimpleRemoteControler にかかれています。
@katsuya-san さん、その他の方々、ありがとうございます。

# それでも引っかかったこと
## ArduinoIDEのインストール
まず、「開発ボードの追加」で「ツール」 → 「ボード」→「Boards Manager」を1回め開いても、ESP8266は出てこず、一度閉じて、2回目開くことでESP8266が表示された。これは2台のPCで同じ現象が出た。

## COMポート
  あとで。

## ソースのコンパイルエラー
  Stringからchar *へのコンパイルエラーが発生したので、WiFi.SSIDをString型の変数に格納し、String.toCharArray(変数)で変換。

## 選択する開発ボード
  最初、Generic ESP8266 Moduleにしたが、書き込みエラーとなったので、Node MCU 0.9(ESP-12 Module)を選択することで書き込み完了。


#TODO
## WiFiパスワードの変更
  デフォルトのソースだと、SSIDから切り出しているようなので、それを修正する。
Ubuntu の MySQL 5.6 のパスワードリセット (mysqld_safe がうまく起動しない場合)

Ubuntu に MySQL 5.6 をインストールして使ってたのですが、root パスワードがわからなくなったので再設定。

[MySQLでrootパスワードを忘れた時のリセット方法 - Qiita](http://qiita.com/Wollest/items/08c89803276627db21e7) を参考にしましたが、僕の環境では mysqld_safe がうまく起動しなかったので、僕のやった手順です。

起動の引数をあれこれ試すのが大変そうだったので、initスクリプトを書き換えて起動させます。

## 1. MySQLd の停止

```bash
$ sudo service mysql stop
```
## 2. 起動スクリプトの修正

```bash
$ sudo vim /etc/init.d/mysql
```

mysqld_safe で検索して、↓この行をコメントアウトし

```bash
su - mysql -s /bin/bash -c "mysqld_safe > /dev/null &"
```

その下に↓こう追加。

```bash
su - mysql -s /bin/bash -c "mysqld_safe --user=root --skip-grant-tables &"
```

↓こんな感じになる。

```bash
...
/lib/init/apparmor-profile-load usr.sbin.mysqld

# su - mysql -s /bin/bash -c "mysqld_safe > /dev/null &"
su - mysql -s /bin/bash -c "mysqld_safe --user=root --skip-grant-tables &"
for i in 1 2 3 4 5 6;
do
...
```

## 3. MySQLd の起動

```bash
$ sudo service mysql start
```

## 4. ログイン

```bash
$ mysql --database=mysql
```

## 5. パスワードを更新

```mysql
mysql> UPDATE user SET Password = PASSWORD('hogehoge') WHERE User='root';
```

## 6. 起動スクリプトの戻し

/etc/init.d/mysql　の コメント状態を元にもどす。

```bash
su - mysql -s /bin/bash -c "mysqld_safe > /dev/null &"
# su - mysql -s /bin/bash -c "mysqld_safe --user=root --skip-grant-tables &"
```

## 7. 再起動

```bash
sudo service mysql restart
```
JINS MEMEのSDKをSwiftで作る方法 & 日常アプリ

既に Swift でのビルド方法とか纏めてる方がいたので、ビルド方法とかはソチラを参考にどうぞ...
[SwiftでJINS MEMEアプリ開発]("http://qiita.com/nisshiee/items/9ec409a35f4137e2a32e")
[JINS MEME Swift Sampleを書きました]("http://qiita.com/you_matz/items/4f0f83289cb5f4ee5980")

と転載だけだと微妙なので、JINS MEMEのいい所 "日常で普通に使えるメガネ型デバイス”を活かしたアプリを考えて以前作った物を並べてみます。

- [MEME β SDK Swift サンプル](https://github.com/tfuru/MemeBlink) 
  JINSさんオフィス@飯田橋 で開催された JINS MEMEハッカソン 中に作った物
  はじめコレをSDK1.0.5に対応させてカレンダー埋めるつもりでした。

- マ◯オ (MEME β SDKのSwiftでの実装サンプル)
   JINS MEMEハッカソンでサポート員で暇だったので作ったアプリ
   瞬きや歩行にあわせてアニメーションしたりファイヤーボール投げたり
   コレを作った事でMEMEの歩行検知,瞬き検知の精度が凄いく良い事がわかりました。


- [あるくさらうんど♪](http://hacklog.jp/works/3246)
   MA11 リクルートさん主催のハッカソンにチーム参加して2ndStageに進んだ物
   街を歩く事を楽しくする為に MEME を使って行動にサウンドエフェクトつけたり、
   Google MAPに8bit風レイヤーで自分だけの地図を書いたりする事ができるアプリ。
   MEMEとnifty mBaaSを使ったのでサーバにデータが行動ログがサーバに蓄積されます。
   GitHub [ソースコード等](https://github.com/ArukuSurround)

これで今日の分埋めといといて、土日で何か作って カレンダーの空き日を埋めることにします...。
Windows7でBasic認証が失敗する話(備忘録)


# Basic認証が通らないんだけど？

そんな連絡がクライアントから来た。
クライアントから連絡を受けて改めて確認したがやはり入れる。
で、どんな情報が来てるのかと確認のためにサーバーのログを見てみた。

# ログインユーザーの情報が送られてきていないんだけど？

サーバーのログを見るとアクセスしてきたユーザーが出てるところが空文字になっていた。
Windows7の環境からやってみたけどもこっちで確認するとアクセスユーザーが送られてきている。

なぜだ・・・(´Д`；)

# 困ったからgoogle先生に聞いてみた

すると[こんな記事](http://ameblo.jp/u-kun-win/entry-11522823583.html)を見つけた。

>Windows 7でパスワード欄にクリップボードの内容をペースト（貼り付け)すると、認証に失敗する。つまりパスワードを正しくペーストすることが出来ない。
ただし、失敗するのは右クリックメニューの「貼り付け」を利用した場合に限る。Ctrl-Vで貼り付ける場合は問題は発生しない。

なんだと！？　Σ(ﾟДﾟ；)

まさかと思いつつも試してみる。

# 結果

入力欄には表示されているのに失敗した・・・。
サーバーログにもユーザーの箇所が空文字で出力されていた。
まさかだよ、Windows7・・・。
普段はキーボードでしかコピペをしないから完全に盲点だった。
EC2上でNTP(タイムサーバー)を使う際の設定

EC2では仮想サーバホスト(Xen)の時刻を元に同期が行われており、
そのままの設定ではNTP(タイムサーバー)を設定しても時刻が同期・反映されません。

---
・Xenとの時刻同期を行うようになっているか確認
```more /proc/sys/xen/independent_wallclock
0```
0 と表示される場合はXenとの時刻同期が行われるようになっており、NTPの結果が反映されません。

---
・システム再起動後にも、設定を反映させるために設定ファイルを変更します。
(最後に一行追加)
```vi /etc/sysctl.conf
xen.independent_wallclock = 1```

・変更した設定ファイルの内容をロードします。
`sysctl -p`

・設定ファイル全てのロードをしたくない場合は、代わりに下記のコマンドを実行します。
`echo 1 > /proc/sys/xen/independent_wallclock`

---
・設定が反映されたか確認します。
```more /proc/sys/xen/independent_wallclock
1```

1に変わっていればOKです。

---

あとは、NTPを設定すれば時刻が同期します。
jQueryでウインドウを指定の割合までスクロールした時にコードを一度だけ実行する方法

##ウインドウを指定の割合までスクロールした時にコードを一度だけ実行する方法

Google Adwordsなどで広告を出すときにページの6割を読んだら成果にしたいという要望が有り作りました。
一度だけしか実行しないというスクリプトは、今まであまり使ってこなかったので自分用のメモとして残しておきます。

```js
$(function(){
	var h = $(window).height();
	$(window).on('scroll', function(e){
		if ((h/$(this).scrollTop()*100) < 60) {
			// ここに実行したいコードを入れる
			$(this).off(e);
		}
	});
});
```
DockerコンテナにマウントされているVolumeディレクトリを docker-inspectで取得する

docker 1.7 から　1.8 に更新したら、
以前の方法で取れなくなってしまった。

1.8では配列になったようなので、
インデックス指定またはループで検索する必要がある。

```
CONTANER="コンテナ名 / コンテナID"
VOLUME_DEST="コンテナのマウントパス"

# docker 1.7
docker inspect -f '{{(index .Volumes "${VOLUME_DEST}")}}' ${CONTAINER}

# docker 1.8
# 配列0番目のマウント
docker inspect -f '{{ (index .Mounts 0).Source }}' ${CONTAINER}

# マウントパスからループ検索
docker inspect --format='{{range $conf := .Mounts}} {{if eq .Destination "${VOLUME_DEST}"}} {{.Source}} {{end}} {{end}}' ${CONTAINER}  | tr -d ' '

# 移動用につかったりする（長い･･･）
cd $(docker inspect --format='{{range $conf := .Mounts}} {{if eq .Destination "${VOLUME_DEST}"}} {{.Source}} {{end}} {{end}}' ${CONTAINER}  | tr -d ' ')
```
※追記１　余分な空白が付いてしまうのでトリミング

man によると、
format は　Go言語の [text/template](https://golang.org/pkg/text/template/) だそうだ。
Linux 版 Swift を Mac 上で Docker を使って手っ取り早く試す


ついに Swift が [OSS 化](https://swift.org/)されました。
そして、[Docker image も公開されている](https://github.com/swiftdocker/docker-swift)ので、Mac で手っ取り早く動かしてみたい方向けにログを残しておきます。

## 必要なもの

### VirtualBox

無ければ [ここ](https://www.virtualbox.org/wiki/Downloads) から入れる
 
### Docker & Docker Machine

無ければ 

```
$ brew install docker
$ brew install docker-machine
```

で入れる

## 起動する

```terminal
$ docker-machine create --driver virtualbox dev
$ eval "$(docker-machine env dev)"
$ docker pull swiftdocker/swift
$ docker run -i -t --name swiftfun swiftdocker/swift:latest /bin/bash
$ docker start swiftfun
$ docker attach swiftfun
``` 

以上です。
後は `Swift` で Repl が起動しますので色々試してみてください。

![スクリーンショット 2015-12-04 19.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/4497/e63ce3c9-5d33-d5a4-8239-54cbf5b19dc1.png "スクリーンショット 2015-12-04 19.49.33.png")

一回 docker コンテナから抜けた場合は、`start`, `attach` を行えば OK です。

Enjoy Swift!
[備忘録]osxでコマンドラインでairでHelloWold


1.sdkダウンロードして解凍し、テキトーな位置に置く
http://www.adobe.com/devnet/air/air-sdk-download.html

2.パス通す。
.bash_login

```
export PATH=$HOME/AIRSDK_Compiler/bin:$PATH
```

パステキヨー

```
source ~/.bash_login
```



3.テキトーな場所でhelloworldなソース書く
HelloWorld.as

```
package{
  import flash.display.*;
  import flash.text.*;

  public class HelloWorld extends Sprite{
    public function HelloWorld(){
      var tf:TextField = new TextField();
      tf.text = "Hello World!";
      addChild(tf);
    }
  }
}
```

4.設定ファイルを同じ位置に書く。
HelloWorld-app.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/19.0">
    <id>HelloWorld</id>
    <versionNumber>0.1</versionNumber>
    <version>0.1</version>
    <filename>HelloWorld</filename>
    <initialWindow>
        <content>HelloWorld.swf</content>
        <visible>true</visible>
        <systemChrome>standard</systemChrome>
        <transparent>false</transparent>
    </initialWindow>
</application>

```

```
<application xmlns="http://ns.adobe.com/air/application/バージョン">
```
バージョンは、air-sdk-description.xml（SDKのフォルダ内）を見て、
そのバージョンを指定する。


5.コンパイル

```
mxmlc ./HelloWorld.as 
```

6.実行

```
adl HelloWorld-app.xml
```

![スクリーンショット 2015-12-04 19.48.37.png](https://qiita-image-store.s3.amazonaws.com/0/38889/4effb01b-df62-988f-74fe-86be959ee8bc.png "スクリーンショット 2015-12-04 19.48.37.png")

とりあえず動く。。。
OSS化したSwiftの歩き方

さて、ついにSwiftがOSS化しましたね！
いつになることやら、、、と待っていたら急にOSS化されてびっくりしました。

とりあえずSwiftと名のつくリポジトリを全部クローンしました。

```
git clone https://github.com/apple/swift.git
git clone https://github.com/apple/swift-clang.git
git clone https://github.com/apple/swift-evolution.git
git clone https://github.com/apple/swift-package-manager.git
git clone https://github.com/apple/swift-corelibs-foundation.git
git clone https://github.com/apple/swift-corelibs-libdispatch.git
git clone https://github.com/apple/swift-llvm.git
git clone https://github.com/apple/swift-corelibs-xctest.git
git clone https://github.com/apple/swift-llbuild.git
git clone https://github.com/apple/swift-cmark.git
git clone https://github.com/apple/swift-3-api-guidelines-review.git
git clone https://github.com/apple/swift-lldb.git
```

clangやllvm、lldbなども公開されていますね。。。これは面白くなりそうです。

まず普段使っているSwiftのコアなAPIを覗いてみます。

`swift.git` の `stdlib/public/core` に色々あります。

```
...
Optional.swift
...
String.swift
...
```

おお、、、感動！

これから暇な時にSwiftの実装を読み、わかったことを投稿していきたいと思います。
Cloud9でRailsの開発を行っているとメールが失敗する

# 概要
cloud9は無料で好きなだけvm環境を用意できるので気に入って使っています。
しかし、最近思わぬ落とし穴にハマってしまったので覚書きしておきます。

# 結論

cloud9はGoogle Cloud Engineを利用しており、GCEは現在GMail以外のsmtpサーバとの通信を許可していないそうです。
https://docs.c9.io/discuss/5582e67bea39a939002242a3

# cloud9での成功例

## GMailを利用する

```rb:config/environments/development.rb
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
        address: ENV['smtp_address'],
        port: ENV['smtp_port'],
        user_name: ENV['smtp_user_name'],
        password: ENV['smtp_password']
  }
```

```:.env
smtp_address=smtp.gmail.com
smtp_user_name=you@gmail.com
smtp_password=app_password(aaaabbbbccccdddd)
smtp_port=587
```

https://myaccount.google.com/security
で2段階認証を有効にしてアプリパスワードの項目にて発行した物をパスワードとして使う必要があります。

## SMTP2GO

メールが送信できなくて迷走していた際にこちらも送信する事ができました。
手順は公式通りでいけました。
https://www.smtp2go.com/docs/rubyonrails/

#cloud9での失敗例

さくらのメールボックスとZohoを利用しての送信は上手くいきませんでした。
git rev-parseを使いこなす

こんにちは！

Gitを使っているとプログラムからGitのメタ情報を取りたい！ってこと、よくありますよね？
でも、 `git status` をgrepしたりしていませんか？？
`git rev-parse` から取れる情報もたくさんあるんですよ！
というわけで `git rev-parse` のちょっと凝った使い方を説明します。

## そもそも git rev-parse ってなによ？

> Pick out and massage parameters

とのことです。
ちなみに、Google翻訳によると「選ぶとマッサージパラメータ」って出てきました。
つまり、(与えられたモノが)何なのかを明らかにすることと、(gitの)パラメータを出力することができるやつってことです。（雑）

## git rev-parse <object>

objectのhashが取得できます。

```bash
git rev-parse master # => f62f59973b8d9aeff1731e6f6260ca7fb9694ead
```

## git rev-parse --short <object>

objectのhashの短縮表記が取得できます。

```bash
git rev-parse --short master # => f62f599
git rev-parse --short f62f59973b8d9aeff1731e6f6260ca7fb9694ead # => f62f599
```

## git rev-parse --symbolic <object>

objectがシンボルであればそれをそのまま取得します。


```bash
git rev-parse --symbolic master # => master
git rev-parse --symbolic f62f599 # => f62f599
```

## git rev-parse -show-cdup

カレントディレクトリからgitのルートディレクトリへの相対パスを得ることができます。
gitのルートディレクトリではなにも得られません。

```bash
git rev-parse --show-cdup
cd eg
git rev-parse --show-cdup # => ../
```

## git rev-parse --show-prefix

現在のディレクトリへの、gitのルートディレクトリからの相対パスを得ることができます。

```bash
git rev-parse --show-prefix
```

カレントディレクトリからの相対パスを渡すことでgitのルートディレクトリからの相対パスも作ることができます。

```bash
cd eg
git rev-parse --show-prefix lib/MyProj/DB.pm | tr -d '\n' # => eg/lib/MyProj/DB.pm
```

## git rev-parse --is-inside-work-tree

ワークツリーの中にいるかどうかを `true` または `false` という文字列で得ることができます。

```bash
git rev-parse --is-inside-work-tree # => true
```

## git rev-parse --git-dir

.gitディレクトリのフルパスを得ることができます。

```bash
git rev-parse --git-dir # => /Users/karupanerura/project/Aniki/.git
```

## git rev-parse --resolve-git-dir <path>

指定したパスが.gitディレクトリか判定することができます。
パスとして正しければディレクトリすら不在でも通ります。

```bash
git rev-parse --resolve-git-dir lib  # => fatal: not a gitdir 'lib'
git rev-parse --resolve-git-dir .git # => .git
```

## git rev-parse --show-toplevel

gitのルートディレクトリを得ることができます。

```bash
git rev-parse --show-toplevel # => /Users/karupanerura/project/Aniki
```

## 具体例

こういうことができます。捗る！

https://github.com/karupanerura/dotfiles/blob/master/git/config#L62
https://github.com/karupanerura/dotfiles/blob/master/git/config#L69
https://github.com/karupanerura/dotfiles/blob/master/bin/git-save#L5-L8

## まとめ

いかがでしたでしょうか？ `git rev-parse` べんり！って感じが伝わればいいなーと思います。
他にもいろんなことができます。「これ判定できないのかな？」って困ったときは `git rev-parse` と `git diff` と `git log` のドキュメントを見ればだいたい解決するきがします。（しないかも）
gitに管理下でメタい操作を行いたいときには必ず使いたくなるコマンドだと思います。
ワンライナーに！やっつけスクリプトに！今晩のおかずに！なんにでもいけますね！

明日は @oh-sky さんの `GitGitにしてあげましょうかね(CV:大坪由佳)` です。意味深ですね。（意味深ですね。）
お楽しみに！
Sencha Cmd6

reactだ、Fluxだ、などと聞こえたりしますが、
そんな中ExtJSはバージョン6になっています。

大きな目玉といえば、SenchaTouchとの統合でしょう。
それまでは、PC用とスマートフォン用に分けて開発が行われていたものが、ExtJS6からは1つのコードをベースに開発が可能となりました。
SenchaTouchでは使えなかったものが、ExtJS6からは使えるようになっているのではないでしょうか。

ExtJSが6になったことで、SenchaCmdも6になっています。
Sencha Cmdといえば、アプリケーションのスケルトン作成からビルドまで、開発のサポート的なツールでしたが、ExtJS4あたりからは、Sencha Cmdありきの開発となっています。

特に導入が難しいわけではないからか、このSencha Cmdのインストールについて書かれている記事は少ないのですが、せっかくなのでSencha Cmd6をインストールするついでにまとめてみました。

# どこで手に入れるのか

お試し的な感じになりますが、以下のサイトから登録してダウンロードができる流れとなっているようです。

https://www.sencha.com/products/extjs/evaluate/

実際にアクセスしてみます。

![スクリーンショット 2015-12-04 3.10.00.png](https://qiita-image-store.s3.amazonaws.com/0/34693/38c130e4-e881-02e1-76ae-c11acad5733f.png "スクリーンショット 2015-12-04 3.10.00.png")

英語が苦手な方でも、フォームに何を入れたらよいかはわかると思います。

少し戸惑ったのは、「Country」。
いえ、訳せなかったわけじゃなくて、もちろん国の選択なんですが、
「Japan」が見当たらない。

![スクリーンショット 2015-12-04 3.12.40.png](https://qiita-image-store.s3.amazonaws.com/0/34693/0573a586-1033-1e8b-c375-2f08ee9f922d.png "スクリーンショット 2015-12-04 3.12.40.png")

はて、、日本が干されましたかと思ったら、
ちゃんとあります。
a-z順かと思えば、JAPANはなんと一覧の上の方にあるのですね。

![スクリーンショット 2015-12-04 3.15.15.png](https://qiita-image-store.s3.amazonaws.com/0/34693/ee6f2efa-caf6-828e-289f-4d1ba52e7094.png "スクリーンショット 2015-12-04 3.15.15.png")

すると、こんな表示になります。
![スクリーンショット 2015-12-04 3.16.49.png](https://qiita-image-store.s3.amazonaws.com/0/34693/72bec727-abff-6aa4-a667-78a24a5394b9.png "スクリーンショット 2015-12-04 3.16.49.png")


ふむふむ。「ありがとね、ExfJSをダウンロードできるリンクをメールで送ったよ」
みたいな。

早速受信してみると、届いてました。
これかな？

![スクリーンショット 2015-12-04 3.19.29.png](https://qiita-image-store.s3.amazonaws.com/0/34693/fc7c1acb-4f95-1896-f7e2-2b144f09bd3f.png "スクリーンショット 2015-12-04 3.19.29.png")

その下のJetBrainsやEclipse,VisualStadioのプラグインってのも、なかなか気になりますが、とりあえずCmdをポチリ。
こんなページに飛びました。

![スクリーンショット 2015-12-04 3.20.42.png](https://qiita-image-store.s3.amazonaws.com/0/34693/bb50432c-8f3e-bd6e-238b-0973cad1db4b.png "スクリーンショット 2015-12-04 3.20.42.png")


ここであなたはその手がピタッと止まります。
そう、ダウンロードボタンが2つあるのです。一体どちらが本物でしょうか。

当然、両方本物ですが、よく見ると1つはJRE入り、もう1つはJRE入ってないやつ、
ということらしいです。

JREがすでに入ってるなら、WITHOUTのほうで良いと思います。
ダウンロードボタンを押すと、サンキュ！って言われます。

![スクリーンショット 2015-12-04 3.32.08.png](https://qiita-image-store.s3.amazonaws.com/0/34693/f90148ab-8b00-0738-520c-c2143fee800a.png "スクリーンショット 2015-12-04 3.32.08.png")


だらだら長くて、中身の無い記事になってしまっていますが、、
次回はインストールして、実際にコマンド叩いてみましょう。
EC2のAmazonLinuxでrootログイン可能にする(AMI設定まで)

EC2のAmazonLinuxはデフォルトでrootログインを禁止しているため
一旦 ec2-userでログインしてから毎回 sudo su - でrootに変更しないといけない。

個人での運用だと面倒なので、rootログインを可能に設定した。
またAMI化したあとに、新しいec2インスタンスを立ち上げると設定が戻ってしまうので、それの対応もする。

---
・rootユーザーに切り替える
`sudo su -`

---
・設定変更
```vi /etc/ssh/sshd_config
PermitRootLogin forced-commands-only
 ↓
PermitRootLogin without-password```

---
・ec2-userの公開鍵をそのままコピーします。
```mv /root/.ssh/authorized_keys /root/.ssh/authorized_keys_bak
cp -f /home/ec2-user/.ssh/authorized_keys /root/.ssh/authorized_keys
service sshd reload```

---
・この状態でAMIを作成して、新しいインスタンスを立てると
　rootでログインできない状態に戻る(authorized_keysが変更される)
　のでcloud-initも変更します。
```vi /etc/cloud/cloud.cfg
disable_root: false
↓
disable_root: true```

---
ReactNativeでAsyncStorageの保存場所を変える

ReactNativeのAsyncStorageは通常だと`NSDocumentDirectory`以下に`RCTAsyncLocalStorage_V1`というディレクトリを作成し、そちらにデータが保存されます。

しかしながら、`NSDocumentDirectory`の中身はiTunes File Sharingなどを利用するとユーザーから見える場所なので、うっかり削除されてしまったり、あまり好ましくないと思います。

こちらのIssueでも今の仕様は微妙、というやり取りが。

* [[AsyncStorage] should not always create a RCTAsyncLocalStorage_V1 directory under NSDocumentDirectory](https://github.com/facebook/react-native/issues/2477)

ということで、より適切な場所だと思われる`NSLibraryDirectory`以下にデータを保存するようにするためには、

1. エディタで`node_modules/react-native/React/Modules/RCTAsyncLocalStorage.m`を開く
2. `static NSString *RCTGetStorageDirectory()` の中の
  `NSDocumentDirectory`を`NSLibraryDirectory`に書き換える
3. リビルド

でokです。
【JSで顔認識】画像から判定する方法


[前回の投稿](http://qiita.com/s_s_k/items/4f18d0a9f8a9f53decfd)の続きです。今回は画像から顔認識をします。

### キャプチャ方法
映像、画像から顔認識するためには、入力内容をキャプチャする必要があります。
画像を入力の値として使用する場合は、一度<b>canvas</b>に描画し、それを入力対象として使います。
imgタグをstart()メソッドの引数で渡しても、エラーになります。

### canvasを用意する
まずはHTMLの準備をします。canvasを２つ用意します。
id="image"は元画像を描画します。
id="overlay"は元画像のcanvasの上にのせ、判定情報を描画します。

```html
// 元画像描画用
<canvas id="image" width="625" height="500"></canvas>

// 顔認識判定結果出力用
<canvas id="overlay" width="625" height="500"></canvas>
```


### 画像をcanvasに描画
前回と同じように画像をcanvasに描画します。

```javascript
var cc = document.getElementById('image').getContext('2d');
var img = new Image();
img.onload = function() {
	cc.drawImage(img,0,0,625, 500);
};
img.src = '画像パス';
```


### 判定結果を描画する
判定結果を描画する処理を用意します。

```javascript
// 判定結果を描画するcanvas
var overlay = document.getElementById('overlay');
var overlayCC = overlay.getContext('2d');

// 判定結果描画処理、前回と同じですね。
function drawLoop() {
	drawRequest = requestAnimFrame(drawLoop);
	overlayCC.clearRect(0, 0, 720, 576);
	if (track.getCurrentPosition()) {
		track.draw(overlay);
	}
}
```

### 顔認識処理を実行
最後に顔認識処理を実行します。

```javascript
track.start(document.getElementById('image'), box);
drawLoop();
```


js部分をまとめておきます。

```javascript

// canvasを取得
var cc = document.getElementById('image').getContext('2d');
var overlay = document.getElementById('overlay');
var overlayCC = overlay.getContext('2d');

// ここから画像読み込み処理
var img = new Image();
img.onload = function() {
	// 読み込み完了後に、canvasに描画
	cc.drawImage(img,0,0,625, 500);
	
	// 顔認識実行
	track.start(document.getElementById('image'), box);
	
	// 結果を描画
	drawLoop();
};
img.src = '画像パス'; //読み込み実行


// 判定結果描画処理
function drawLoop() {
	drawRequest = requestAnimFrame(drawLoop);
	overlayCC.clearRect(0, 0, 720, 576);
	if (track.getCurrentPosition()) {
		track.draw(overlay);
	}
}
```
【kintone】kintone Promiseとは





##概要
kintone Promiseは、非同期処理をすっきりかける（非同期を同期っぽく記述できる）処理。
基本的にはPromiseオブジェクトのthen()を使ってリクエストの順番通りに処理する。

##特徴
* Promiseサポートされたイベントの返り値でPromiseオブジェクトをreturnできる
* リクエスト系APIでcallbackを省略するとPromiseオブジェクトが返される

##基本的（初歩的）なPromiseの書き方
```
kintone.api(
	URL
	HTTPメソッド
	パラメータ
).then(
	成功時の処理
).catch(
	失敗時の処理
);
```


##参考
>1.kintone APIでPromiseを使ってみよう！
>https://cybozudev.zendesk.com/hc/ja/articles/204564604
→kintoneで、promiseが導入された背景と具体的なサンプルコードがわかりやすい。
>2.Kintoneでのpromise入門vol.1
>https://www.r3it.com/blog/kintone/20151028_promise/
→基本的なJS(EC6)のPromiseの使い方〜kintoneでの用途をシンプルに説明している。

>3.kintoneを紹介するブログ（JOYZO)
>https://www.joyzo.co.jp/blog/1155
→KintoneにおけるPromiseとは〜注意点なども含めたサンプルコードがわかりやすい。
静的解析ツール PVS-Studio


PVS-StudioというC/C++の静的解析ツールがあると知ったので試してみました
http://www.viva64.com/

使い方は簡単
VisualStudioを使っているなら、そのままコンパイルするだけです。
コンパイル完了後、下の方にガガッと解析結果が出てきます。

この手の有名な静的解析ツールにはcppcheckがありますが、
私の持ってるやや大きめのプロジェクトではcppcheckより解析速度が断然速かったです。
製作者側も大分意識しているようで、他の静的解析ツールとの比較記事もありますね。
http://www.viva64.com/en/a/0086/

有料のソフトのようですが、今のところ制限がある部分は感じません。
他の人のBlog見ていると過去には制限があったっぽいですが、なくなったんでしょうか？

値段によっては買おうと思ったんですが、価格は非公開で、
欲しいライセンス数を書いてメールして、という感じなので躊躇してます。
仕様変更でガッツリ制限掛かる可能性もあるのでそこが困る部分ですね。
exec - refreshonly の使い所

Puppetアドベントカレンダー4日目です。

長丁場なので軽めのtipsで恐縮です。あと21日...

## execタイプの`refreshonly` オプション

* https://docs.puppetlabs.com/references/latest/type.html#exec

> The exec has refreshonly => true, which only allows Puppet to run the command when some other resource is changed. (See the notes on refreshing below.)

とのことです。このオプション、冪等性の担保のために非常に便利に使えます。よくやっているパターンを二つ紹介します。

## あるファイルの中身に変更があったら展開したい

```puppet
class sample_install {

  file { '/usr/local/src/some-binary.zip':
    source  => 'puppet:///modules/sample_install/some-binary.zip',
    notify  => Exec['unzip some-binary.zip'],
  }

  exec { 'unzip some-binary.zip':
    command     => 'unzip -o -u /usr/local/src/some-binary.zip -d /usr/local/bin && chmod 775 /usr/local/bin/some-binary',
    refreshonly => true,
  }

}
```

こうすることで

* 毎回ファイルを展開することを防ぐ
* しかし、ソースファイルに変更があったら、確実に解凍させる

が実現可能です。zipball、tarballを直接つっこんでる場合に便利でしょう。hashicorp tools系とか。

## あるファイルの更新に伴い、そのファイルの内容を反映させるようなコマンドをキックする

```puppet
class sysctl::reload {

  exec { '/usr/sbin/sysctl -p /etc/sysctl.d/*.conf':
    refreshonly => true,
  }

}

class log::sysctl {
  include ::sysctl::reload

  file {
    '/etc/sysctl.d/td-agent.conf':
      content => template('log/sysctl.conf'),
      notify  => Class['::sysctl::reload'];
  }
}
```

典型的には、 `systemctl daemon-reload` とか、 `sysctl -p` をフックさせると便利ではないでしょうか。

親のClassにnotifyを仕掛ければ、そこに所属する exec タイプが全部キックされるようです。

こんな感じで、Puppet初心者の脱却に是非 `refreshonly` を活用していきましょう。

----

ということで明日は id:kijibato さんとなります。支援に感謝。
Swift オープンソース化ではじめて知った import の書き方

# はじめに
[Swift](https://github.com/apple/swift) のソースをつらつら眺めていたんですが、はじめて知った `import` の記述を見たので投稿します。

# import 例

## 特定の変数のみのインポート

```swift
// 例 
import var Foundation.NSUTF8StringEncoding
// or Playground では let でも大丈夫みたいでした
import let Foundation.NSUTF8StringEncoding 

// 元の定義
// public var NSUTF8StringEncoding: UInt { get }
```

## 特定のクラスのみのインポート

```swift
import struct Swift.String

// enum, class も同じ形式で大丈夫な模様
import enum UIKit.UILayoutConstraintAxis
```

## 特定の関数のみのインポート

```swift
import func CoreGraphics.CGRectMake
```


# おわりに

ドキュメント見たらしっかり説明がありました。。

> Swift
> [Import Declaration](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID351)
Jupyter で wav ファイルを埋め込む

# 問題

以下のブログなどにあるように、 Jupyter で動画を埋め込むことができる。
http://jakevdp.github.io/blog/2013/05/12/embedding-matplotlib-animations/

同じように音のファイルも埋め込んで、 Jupyter から再生したい。

# 解決方法

HTML5 Audio 要素を使って、上記ブログと同じように埋め込む。

こんな風に関数を定義して、

```python
from IPython.display import HTML
def embedAudio(filename):
    tmpl = """
    <audio controls>
    <source src="data:audio/x-m4v;base64,{0}" type="audio/wav">
    """
    
    return HTML(tmpl.format(open(filename, "rb").read().encode("base64")))
```

こんな感じで実行すると埋め込める。

```py
embedAudio("myaudio.wav")
```

ただし、ひとつの Cell に一つだけ。
macにDBD::mysqlをインストールする

久しぶりにMTをローカルにインストールしようとしてDBD::mysqlがないと怒られてインストールしたのでメモ。
# cpanmをインストール
```bash
brew install cpanminus
```

# DBIをダウンロードしてインストールする
```bash
sudo cpanm DBI
sudo perl -MCPAN -e 'shell' #opens a CPAN shell session
cpan> get DBD::mysql
cpan> exit
```

# DBD::mysqlをインストール
```bash
cd ~/.cpan/build/DBD*
sudo perl Makefile.PL
sudo make install
```
別サーバにあるnodeプロセスをリモートデバッグする方法

# 概要
ローカルマシンで起動したnodeプロセスのブラウザ経由のリモートデバッグはnode-inspectorを使って簡単に出来たのですが、
別マシンで起動したnodeプロセスのデバッグをしようとしたらうまく行かなかったのでその解決法を書いておきます。

## ローカルマシンで起動したnodeプロセスのリモートデバッグの場合
```
$ node-debug -p 8888 app
(..略)
debugger listening on port 5858
Node Inspector is now available from http://127.0.0.1:8888/?ws=127.0.0.1:8888&port=5858
(..略)
# netstatで調べるとローカルアドレスが127.0.0.1でローカルからしかアクセス出来ないようです。
$ netstat -ano | grep 8888
tcp        0      0 127.0.0.1:8888              0.0.0.0:*                   LISTEN      off (0.00/0/0)
```

## リモートマシンで起動したnodeプロセスのリモートデバッグの場合
公式ドキュメントを読んでみたところ*--web-host*を付ければ、
リモートマシンのnodeプロセスに対してリモートデバッグが出来るようでした。

>--web-host		0.0.0.0	Host to listen on for Node Inspector's web interface.
>node-debug listens on 127.0.0.1 by default.

```
$ node-debug -p 8888 --web-host=0.0.0.0 app
(..略)
debugger listening on port 5858
Node Inspector is now available from http://127.0.0.1:8888/?ws=127.0.0.1:8888&port=5858
(..略)
# netstatで調べるとリモートからもアクセス出来るようになっていました。
$ netstat -ano | grep 8888
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      off (0.00/0/0)
```

参考) https://github.com/node-inspector/node-inspector
HomebrewでMySQLをインストールしたときのエラー

HomebrewでMySQLのインストールを行ったときに遭遇したエラーについてまとめてみました。

##Homebrewのインストール
```ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"```
上記のコマンドを実行するとインストールがはじまる

##MySQLのインストール
```brew install mysql```
これでmysqlのインストールがはじまる

##mysql.serverの起動
```sudo mysql.server start```
root権限でmysql.serverを起動

しかし、
```$sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/***.local.pid).```
となり起動に失敗する

いろいろ調べてみるとどうやら権限に問題があるらしい
/usr/local/var/mysql/の権限をいじる
所有者を_mysqlに変更
```sudo chown -R _mysql /usr/local/var/mysql```
アクセス権限を全ユーザに与えてみる
```sudo chmod 777 /usr/local/var/mysql```

もう一度試してみる
```$sudo mysql.server start
Starting MySQL
. SUCCESS!```

これで上手くいった

##参考
[MySQLが起動しないエラー](http://easyramble.com/mysql-server-pid-file-error.html)
[Macの電源を久しぶりに落としたらmysqlが起動しなくなった
](http://chotchy-inc.hatenablog.com/entry/2014/10/28/154738)
[JavaScript] 4. 即時関数でクラス定義

---

1. [クラスの定義](http://qiita.com/Koizumi-Greenwich/items/7a579c43084286dd38be)
2. [クラスの継承](http://qiita.com/Koizumi-Greenwich/items/96215899b8b61cc85e65)
3. [即時関数 と jQuery.readyイベント関数](http://qiita.com/Koizumi-Greenwich/items/d192ad98ca8b2449e4fd)
4. [即時関数でクラス定義](http://qiita.com/Koizumi-Greenwich/items/6f74230f35f2c5b9a46b)
5. [private プロパティ](http://qiita.com/Koizumi-Greenwich/items/f9e8a6dad4f049c89944)
6. [Object.defineProperty/ies でプロパティ/メソッド定義](http://qiita.com/Koizumi-Greenwich/items/1b827b4304538f2f8e37)

---

[1.クラスの定義](http://qiita.com/Koizumi-Greenwich/items/7a579c43084286dd38be)では、コードを解りやすくするために *ラベルブロック* を使ってクラス定義全体を括る方法を紹介しました。
ここでは **即時関数** の中にクラス定義を入れる方法を紹介します。

*※即時関数については、[3.即時関数 と jQuery.readyイベント関数](http://qiita.com/Koizumi-Greenwich/items/d192ad98ca8b2449e4fd) を参照してください。*

#即時関数でのクラス定義
この方法では、クラス定義全体を *即時関数* の中で行います。

```js:即時関数内でクラス定義
クラス名 = (function(){
    var コンストラクタ関数オブジェクト変数 = function(仮引数, ...) {
       〜 コンストラクタ処理 〜
    }
    .
    .
    .
    return コンストラクタ関数オブジェクト変数;
})();
```

ポイントは、即時関数はあくまで関数なので *返り値* を持つという点です。
そして定義されるクラスは、コンストラクタとして定義された関数オブジェクトです。

そこで即時関数の最後、クラス定義を終えた後に、コンストラクタ関数オブジェクト（＝クラス）を返り値として返し、それを変数で受け取ります。
結果、受け取った変数がクラスそのものになります。

```js:MyClass-immediate.js
MyClass = (function() {
    var myClass = function(prop1, prop2) {
        this.prop1 = prop1;
        this.prop2 = prop2;
    }
    
    return myClass;
})();
```

コンストラクタ関数オブジェクトは即時関数内のローカル変数にしています。
即時関数の返り値を受け取ったグローバル変数 `MyClass` がこのクラスを表す名前になります。

##静的な private プロパティ
この方法を利用すると、擬似的に静的な private プロパティを設けることができます。

```js:即時関数内でクラス定義
クラス名 = (function(){
    .
    .
    
    var 変数;
    var 変数 = 値;
})();
```

即時関数内のローカル変数は、同関数の内部からしかアクセスできません。
したがってクラス内だけで利用できる変数＝private プロパティ となります。
ただしコンストラクタ関数オブジェクトとは関わりがありませんので、あくまで静的なプロパティとなります。

```js:MyClass-immediate.js
MyClass = (function() {
    // 静的なprivateプロパティ
    var privateProp = null;
    
    // セッター
    myClass.setPrivateProp = function(arg) {
        privateProp = arg;
    }
    
    // ゲッター
    myClass.getPrivateProp = function() {
        return privateProp;
    }
})();
```

この例では、`privateProp` という静的privateプロパティを定義しています。
また、静的メソッドとしてこのプロパティへのセッター、ゲッターを定義しています。


#サンプルコード

```js:MyClass-immediate.js
/**
 * クラス MyClass
 */
MyClass = (function() {
    /**
     * コンストラクタ
     */
    var myClass = function(prop1, prop2) {
        // プロパティの定義
        this.prop1 = prop1;
        this.prop2 = prop2;
    }
    // prototype をローカル変数へ
    var p = myClass.prototype;
 
    // 静的なprivateプロパティ
    var privateProp = null;
    
    /**
     * privateProp セッター
     */
    myClass.setPrivateProp = function(arg) {
        privateProp = arg;
    }
    
    /**
     * privateProp ゲッター
     */
    myClass.getPrivateProp = function() {
        return privateProp;
    }
    
    /**
     * メソッド methodA
     */
    p.methodA = function(arg1, arg2) {
        return this.prop1 + this.prop2 + arg1 + arg2 + privateProp;
    }
    
    return myClass;
})();

// MyClassオブジェクトを生成
var obj = new MyClass('aaa', 'bbb');
// privateProp に値をセット
MyClass.setPrivateProp('ppp');
// MyClass.methodA() を呼び出す
var result = obj.methodA('ccc', 'ddd');
```
PagedList を使って ASP.NET MVC でページネーション

#本記事の概要
Webアプリにおいてページ処理が必要になる場面は多いですが、自力で実装するのは大変。
Paginate機能が標準で付いているフレームワークもありますが、ASP.NET MVCには無さそうなので PagedList というライブラリを使ってみる。

#PagedList (PagedList.MVC) とは
PagedList は Nuget で一番DLされてるページネイション用ライブラリ。
PagedList.MVC はHTMLヘルパー用のライブラリになりますので両方セットでインストールします。
（PagedList.MVC のほうをインストールすると PagedList も一緒にインストールされます）
https://github.com/TroyGoode/PagedList
https://www.nuget.org/packages/PagedList.Mvc

##使い方(Model, Controller側)
```csharp
// データベースから取得するためのIQueryable型を用意
IQueryable<Book> books = dbSet
    .Where(b => b.Price < 3000)
    .OrderBy(b => b.Title);

int pageNumber = 1; // ページ番号
int pageSize = 20;	// 1ページに表示する件数

IPagedList<Book> bookPages = books.ToPagedList(pageNumber, pageSize); // Bookをページで取得
```
基本的な使い方は IQueryable型 に対して拡張メソッド `ToPagedList()` でページ番号とサイズを指定するだけ。
IPagedList型 は IEnumerable型 を継承してページ情報のプロパティを実装したもの。
books は `ToPagedList()` 実行時に、必要な件数のLIMIT句をSQLに加えた形で遅延評価されます。

さらに `ToPagedList()` はIQueryable型の拡張メソッドなので、[前回](http://qiita.com/midori44/items/4204e9d6ddf778d229d7) 紹介した AutoMapper のマッピングに対してもそのまま実行できます。

```csharp
IPagedList<BookViewModel> books = dbSet
    .Where(b => b.Price < 3000)
    .OrderBy(b => b.Title)
	.ProjectTo<BookViewModel>() // AutoMapperによるBookViewModelへのマッピング
	.ToPagedList(1, 20); // そのままメソッドチェーンで即時評価
```
このように LINQ to Entities なら 絞り込み、ソート、マッピング、ページネーション を全て繋げて一度に実行できます。便利。

##使い方(View側)
表示側はこうなります

```csharp:.cshtml
@using PagedList
@using PagedList.Mvc;
@model IPagedList<App.Models.Book> // IPagedList型で渡す

...

foreach(var book in Model) {
	// IEnumerableを継承しているので、何も意識せずリストアップ可能
}

// ページ番号表示
@Html.PagedListPager(Model, page => Url.Action("Index", page))
```
Bootstrapに対応しているので、Bootstrapを導入しているとページ番号は次のような表示になります。
![WS0029.jpg](https://qiita-image-store.s3.amazonaws.com/0/57132/9c66f330-d140-5c32-925b-9f396e120ae8.jpeg)



また、PagedListPager() の第3引数に PagedListRenderOptions を指定すれば、あらかじめ用意されたスタイルが簡単に使用できます。
![WS0027.jpg](https://qiita-image-store.s3.amazonaws.com/0/57132/34a86c01-cd13-6816-65c1-37e33d755e9a.jpeg)
![WS0028.jpg](https://qiita-image-store.s3.amazonaws.com/0/57132/eb9aeec2-aa28-f8d6-f3b3-5ca50de04080.jpeg)


#最後に
２日連続で、IQueryable型のメリットと定番ライブラリを紹介させていただきました。
引き続き ASP.NET Advent Calendar 2015 をお楽しみください。
Kaggle ScriptsのChainer対応について


Kaggle ScriptsでChainerを使えるようにしてもらったのでその報告です。
# Kaggleとは
https://www.kaggle.com/
> Kaggleは世界で最も大きなデータサイエンティストのコミュニティであり、企業や研究者がデータを提供し、Kaggleコミュニティに所属する世界194ケ国、30万人以上のデータサイエンティストや研究者が最適モデルを競い合うコンペティションの運営を行っています。
 http://www.recruit.jp/news_data/release/2015/0716_15946.html

賞金があるので、賞金目当てで参加するコンペティションというイメージがあるかもしれませんが、何度も参加している印象としては、機械学習に自信のある人たちが自分たちのヤバさを示すために参加する天下一武道会的なサイトです。また機械学習ライブラリ開発者の方もたくさん参加されていて、たとえば、Kerasの[fchollet](https://www.kaggle.com/fchollet)さん、XGBoostやMXNetの[Tianqi Chen](https://www.kaggle.com/tqchen)さん、Lasagneの[sedielem](https://www.kaggle.com/sedielem)さん、H2O.aiの[mlandry](https://www.kaggle.com/mlandry)さんもKaggleの常連で、ランキング上位に名を連ねていることやスターターコードを投稿している姿を見ることがあります。

# スターターコード?

KaggleにはフォーラムやKaggle Scriptsと呼ばれるコードの実行環境あります。コンペティションの開催中に議論をしたりコードを投稿したりできます。新しいコンペティションが始まると、"Beating the Benchmark"というスレが立ったりコードが投稿されたりします。これは、シンプルな実装でそこそこのスコアを出す初心者/コンペ入門用コードを公開する習わしで、多く方がこれをベースに参加を開始します。機械学習に興味を持っている参加者数百人がよいスコアを出しているスターターコードを試そうとするので、ここでおすすめしたいライブラリを使っておけばよい宣伝になります。

# Kaggle Scripts?
https://www.kaggle.com/scripts
Kaggle ScriptsはKaggleがホストするスクリプトの実行環境です。RやPythonのコードをブラウザ上で記述して実行できます。各コンペティションのデータセットに直接アクセスでき、実行結果をそのまま投稿できます。
Kaggle Scriptsのコードは、Dockerのコンテナ上で実行されます。パッケージのインストールはできないので、あらかじめ定義されているパッケージしか使用できません。
この環境には、KerasやLasagne、XGBoostなどがインストールされています。

**で、Chainer は？**

ChainerはKaggle Scriptsで使えるのでしょうか。気になります。
タイトルでネタバレしていますが、**ワシが**Kaggleの運営に依頼して対応してもらいました。

**Kaggle Scripts では Chainer が使えます**

バージョンは、現在1.5.0.3になっています。対応していただいた当初は 1.3系だったのでアップデートはされているようです。どんなタイミングでアップデートされるのか、動作確認されているのか、などは不明ですが。

# 実際にKaggleでChainerを使ってみた話

Chainerを使ったコードで[Coupon Purchase Prediction](https://www.kaggle.com/c/coupon-purchase-prediction)に参加して、1076チーム中5位になりました。
詳細はここでは書きませんが、コードはフォーラムに投稿しています。(Kaggle Scriptsではありません)
https://www.kaggle.com/c/coupon-purchase-prediction/forums/t/16789/approach-sharing/95047#post95047
特にすごいDeep Learningの手法というわけではなく、ただの3層MLPです。

基本Torch7ユーザーである僕がこのコンペでChainerを使った理由は、当時日本ではChainerが流行っていて、主催が日本の企業だったので、優勝した場合を考えると、Torch7とかいうイミフメイ環境で提供するよりはPython+Pandas+Chainerのほうが受けがいいだろうと思ったからです。結局入賞はできなかったので意味なかったですが。
使ってみて、特に困ることはなく、実装の変な癖やバグでスコアが出ないということもなかったので、Chainerはコンペティションでも使えるよいライブラリだと思います。