OmniAICreator/Qiita-1.07M huggingface dataset:
言語処理100本ノック10~14

言語処理100本ノック2章unixコマンドに入りました。
全然8月中に終わらせることができないような気がします...
いろいろアドバイスください！！
言語処理100本ノック2015のサイトにあるhightemp.txtを入力ファイルとします。
#*10.行数のカウント*

```nlp10.py
#! usr/bin/env python
#coding:utf-8
with open('hightemp.txt','r') as f :
    num_line = len([None for line in f])
    print num_line

```
実行結果

```
24
```

unixコマンド
`wc -l hightemp.txt `

実行結果(unixコマンド)

```
24 hightemp.txt
```


#*11.タブをスペースに置換*

```nlp11.py
#! usr/bin/env python
#coding:utf-8
with open('hightemp.txt','r') as f:
    for line in f:
        rep_line = ' '.join(line.split())
        print(rep_line)
```
実行結果
```
高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02
```

unixコマンド
`expand -t 1 hightemp.txt `

#*12.1列目をcol1.txtに，2列目をcol2.txtに保存*

```nlp12.py
#! usr/bin/env python
#codeing:utf-8
with open('hightemp.txt','r') as f:    
    wf1 = open('col1.txt','w')
    wf2 = open('col2.txt','w')
    for line in f:
        wf1.write(line.split()[0]+'\n')
        wf2.write(line.split()[1]+'\n')
    wf1.close()
    wf2.close()
```
実行結果

```col1.txt       
高知県
埼玉県
岐阜県
山形県
山梨県
和歌山県
静岡県
山梨県
埼玉県
群馬県
群馬県
愛知県
千葉県
静岡県
愛媛県
山形県
岐阜県
群馬県
千葉県
埼玉県
大阪府
山梨県
山形県
愛知県
```

```col2.txt
江川崎
熊谷
多治見
山形
甲府
かつらぎ
天竜
勝沼
越谷
館林
上里見
愛西
牛久
佐久間
宇和島
酒田
美濃
前橋
茂原
鳩山
豊中
大月
鶴岡
名古屋
```

unixコマンド
`cut -f1 hightemp.txt > col1.txt`
`cut -f2 hightemp.txt > col2.txt`

#*13. col1.txtとcol2.txtをマージ*

```nlp13.py
#! usr/bin/env python
#coding:utf-8

c1 = open('col1.txt','r')
c2 = open('col2.txt','r')

with open('merge.txt','w') as wf:
    for line1,line2 in zip(c1,c2):

        wf.write(line1.strip()+' '+line2.strip()+'\n')
        
c1.close()
c2.close()
```

実行結果

```
高知県 江川崎
埼玉県 熊谷
岐阜県 多治見
山形県 山形
山梨県 甲府
和歌山県 かつらぎ
静岡県 天竜
山梨県 勝沼
埼玉県 越谷
群馬県 館林
群馬県 上里見
愛知県 愛西
千葉県 牛久
静岡県 佐久間
愛媛県 宇和島
山形県 酒田
岐阜県 美濃
群馬県 前橋
千葉県 茂原
埼玉県 鳩山
大阪府 豊中
山梨県 大月
山形県 鶴岡
愛知県 名古屋
```

unixコマンド
`paste col1.txt col2.txt`


#*14.先頭からN行を出力*

```nlp14.py
#! usr/bin/env python
#coding:UTF-8
import sys
argvs = sys.argv[1]

#コマンドライン引数が正しく入力されているか確認する部分を作成
with open('hightemp.txt','r') as file:
    for i in xrange(int(argvs)):
        line = file.readline()
        print line,
```

実行結果(コマンドライン引数を3とした場合)

```
高知県	江川崎	41	2013-08-12
埼玉県	熊谷	40.9	2007-08-16
岐阜県	多治見	40.9	2007-08-16
```

unixコマンド
`head -3 hightemp.txt `


コマンドライン引数が入力されていない場合のエラー処理をしないといけないと思いつつ放置しました。
arduinoで「collect2.exe: error: ld returned 5 exit status」

arduino ide v1.6.5で自分の環境では(windows xp sp3)、上記エラーで、参った。
##xpでやりたいので、ideのバージョンを下げた。
v1.6.4　変わらず。
v1.6.3　少し良い。
PL2303HXAをWindows10で使う


古いドライバを入れる。

1. スタートメニュー→設定→デバイス→デバイスマネージャー
2. Prolific USB-to-Serial Comm Port (COM4) を選んでプロパティ
3. ドライバータブでドライバーの更新
4. コンピュータを参照して検索します→一覧から検索します
5. 3.3を選択。
![PL2303drivers.png](https://qiita-image-store.s3.amazonaws.com/0/61810/5ec448dc-2baa-cae8-1ec7-0418f98ba4a5.png)

3.4系はうまく動かない。
3.6系はディスコンのHXAに対応してない。
エポックタイムの扱いでハマった話

ちょっとエポックタイムを使った比較を作った時にハマったので備忘録としてまとめ。

とりあえず説明よりも以下のコードと実行結果を見てほしい。

#普通にjava.util.Dateを引数0で初期化
```java:EpochTest1.java
import java.text.SimpleDateFormat;
import java.util.Date;

public class EpochTest1 {

	public static void main(String[] args) {
		SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 0指定で初期化
		Date epoch = new Date(0);

		System.out.println(fmt.format(epoch));
	}
}
```
```text:実行結果
1970-01-01 09:00:00
```
あれ？9時間ずれてる・・・
9時間ってことはタイムゾーンの関係なんだろう。
めんどくさいけどCalendar使うか・・

#java.util.Calendarを使ってみる
```java:EpochTest2.java
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class EpochTest2 {

	public static void main(String[] args) {
		SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// Calendarをタイムゾーン指定して作成
		Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
		// 0ミリ秒を設定
		cal.setTimeInMillis(0);
		Date epoch = cal.getTime();

		System.out.println(fmt.format(epoch));
	}
}

```
```text:実行結果
1970-01-01 09:00:00
```
あり？Calendar使ってもずれてる・・・

#DateFormatのタイムゾーン設定
```java:EpochTest3.java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class EpochTest3 {

	public static void main(String[] args) {
		SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// Dateformatのタイムゾーン設定
		fmt.setTimeZone(TimeZone.getTimeZone("UTC"));

		// 0指定で初期化
		Date epoch = new Date(0);

		System.out.println(fmt.format(epoch));
	}
}

```
```text:実行結果
1970-01-01 00:00:00
```
というわけでDateFormatのタイムゾーンの設定の問題でした。
内部的には`Date epoch = new Date(0);`とかでちゃんとエポック秒になっている。
でも文字列として変換する際にUTCエポック秒はJSTでは+09:00なので
SimpleDateFormatとかで変換すると`1970-01-01 09:00:00`になってしまう。

ただこれがちょっと問題で、テンプレートエンジンとかで
dateformatのタイムゾーンとかがいじりにくい場合、
日付の生成にミリ秒を使うと意図せずずれることがある。

なのでデフォルトロケールの"1970-01-01 00:00:00"を作成する方法も知っとくとハマらない。

#文字列から初期化
```java:EpochTest4.java
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class EpochTest4 {

	public static void main(String[] args) throws ParseException {
		SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		// DateFormat使って作成すればOK(当たり前
		Date epoch = fmt.parse("1970-01-01 00:00:00");
		System.out.println(fmt.format(epoch));

		// java.sql.TimestampはvalueOfを使うとDateFormatとか作らなくても狙った時間の初期化ができる。
		// ただしフォーマットはyyyy-mm-dd hh:mm:ss[.fffffffff]固定。
		System.out.println(fmt.format(Timestamp.valueOf("1970-01-01 00:00:00")));
	}
}
```
```text:実行結果
1970-01-01 00:00:00
1970-01-01 00:00:00
```
結局表示に使うのであれば文字列としての日付型をparseする方法がベターなのかな？
FFmpegを使うメモ

FFmpeg（エフエフエムペグ）は動画と音声を変換することのできるUNIX系OS生まれのフリーソフトウェア(wikipediaより)

参考になるURL
[動画処理の定番ツール「FFmpeg」ことはじめ](http://qiita.com/kitar/items/59f80bba2ca997e0f5e6)

1 環境構築
2 コマンドを使う
・ ファイルの情報を確認
・ 動画ファイルの拡張子変換
・ 静止画像を動画に変換
・ m3u8拡張子の動画をtsファイルに変換


#macにffmpeg環境をつくる
参考にしたURLは以下
[Macでffmpeg(使い方)](http://note.chiebukuro.yahoo.co.jp/detail/n301863)

環境は上記URLでの手順で非常に簡単に作成できることがわかった。

#ファイルの情報を確認
```
ffmpeg -i 5gen.ts
```

#動画ファイルの拡張子変更（Matroskaに変換かける）
```
ffmpeg -i 001_xylophone_woods.wmv -vcodec copy test_matroska.mkv
```
無事に変換可能

#適当な動画ファイルから特定の時間帯を切り出す
3分程度の動画から20秒程度の時間を切り出すコマンドは
```
ffmpeg -i [元動画] -ss [開始位置(秒数)] -t [切り出す秒数] [新しい動画]
```
にならって
```
ffmpeg -i "001_xylophone_woods.wmv" -ss 0 -t 20 "test_kirinuki.wmv" 
```
とした

#静止画像を動画に変換してみる
```
ffmpeg -y -f image2 -r 1 -loop_input -t 10 -vcodec 'copy' -i "スクリーンショット 2015-05-19 16.24.10.png" test_png_matroska.mkv
```
無事に変換可能
http://d.hatena.ne.jp/witchmakers/20090916/1253113671

#動画に字幕をいれるにはどうしたらいいか。
↑これはかなり大変。　
ffmpegを使って実行できるらしいが、
よくネットで提供されているコンパイル済みのffmpegには字幕に変換するオプションはコンパイルされていなことが多い。
コンパイルをしなおす必要があるので、自分でやるのがいいらしいが、何をコンパイルに含めるかをわかってからコンパイルしないと悲しい目にあう。
・・・・残念ながらまだ実現できていない。。

#m3u8拡張子の動画をtsファイルに変換
ストリーミングでよく使われるm3u8拡張子。
このファイルの中身は実行する動画のURLが書かれている。
m3u8ファイルはVLCで実行でき、ストリーミング状態で動画を確認することができる。

```
ffmpeg -i index_av.m3u -vcodec copy -acodec copy test.ts
```

これだけで実行したときになぜか音声だけが変換された。

Video: h264の変換がうまくいかず以下のようなエラーが出た場合、「libx264」をつけてみるとエラーは取れるようだ

```
[h264 @ 0x7fc36a01d200] decode_slice_header error
[h264 @ 0x7fc36a01d200] no frame!
```
m3u8の実行は実態があるわけではないので、変換スピードについてこず、エラーが起きることがあるようだ。
-analyzeduration / -probesize のオプションをつけ変換タイミングをずらすと成功することも多い。
今回は30秒ずらしてみたが、うまくいかない場合は60Mなどと増やしてみてもいいかもしれない。
以下のようなエラーが出たためオプションをつけた。

```
[mpegts @ 0x7fc369809400] decoding for stream 0 failed
[mpegts @ 0x7fc369809400] Could not find codec parameters for stream 0 (Video: h264 ([27][0][0][0] / 0x001B), none): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
```
最終的に以下のコマンドでうまく変換ができたようだ

```
ffmpeg  -analyzeduration 30M -probesize 30M  -i index_av.m3u -vcodec libx264 -acodec copy test.ts
```

#m3u8拡張子の動画をmp4ファイルに変換
tsファイルに変換できたので、out.fileの拡張子だけ変えて実行してみた。

```
ffmpeg  -analyzeduration 30M -probesize 30M  -i index_av.m3u -vcodec libx264 -acodec copy test.mp4
```
みごとにエラー

```
[mp4 @ 0x7ff715813600] Malformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)
av_interleaved_write_frame(): Operation not permitted
```

オプションをつけないとだめみたいだったので、aacのアプションを追加

```
ffmpeg  -analyzeduration 30M -probesize 30M  -i index_av.m3u -vcodec libx264 -acodec copy -bsf aac_adtstoasc test.mp4
```

同じm3u8の内容をts拡張子とmp4拡張子でそれぞれしてみた結果
動画サイズの違いはあんまりないこともわかりました。
NodeJSの導入(CentOS7

# NodeJSの導入

## 要件

* CentOS7

## NVMの導入

nvmをくろーん

```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
```

.bashrcに、nvmを登録

```
$ echo . ~/.nvm/nvm.sh >> ~/.bashrc
```

.bashrc再読み込み

```
$ . ~/.bashrc
```

入ってるか確認

```
$ nvm --version
0.26.0
```

## nodeのインストール

インストール出来るバージョンのリスト

```
$ nvm ls-remote
v0.1.14
...
iojs-v3.1.0
```

今回は、stableを入れる

```
$ nvm install stable
######################################################################## 100.0%
Now using node v0.12.7 (npm v2.11.3)
```

バージョン確認

```
$ node -v
v0.12.7
$ npm -v
2.11.3
```
postfix受信済みと配送不能メールの自動削除

**万が一サーバに入られて個人情報を抜かれない為に
こんなシェルを書いてみた**

```bash:mail-delete.sh
#!/bin/sh

############################################
#配送不能キューに溜まったメールを廃棄する
############################################
postsuper -d ALL defer
postsuper -d ALL deferred

############################################
#curに移動してから一日経過したメールを削除する
############################################
function delete_file () {

	###################
	#debug用
	#ls -la /home/$1/Maildir/cur/
	#echo -e "削除対象のメールはこちら============================\n"
	#find /home/$1/Maildir/cur/ -ctime +1 -type f;
	#find /home/$1/Maildir/cur/ -ctime +1 -type f >> /var/log/cron;
	#echo -e "====================================================\n"
	find /home/$1/Maildir/cur/ -ctime +1 -type f -exec rm -f {} \;
}

############################################
# /home直下のdirだけ取得し、delete_fileを呼び出す
############################################
ls -F /home | grep / | while read line; do
	
	if [ -d /home/$line/Maildir ]; then
		delete_file $line;
	fi

done
```

**あとはシェルをcronで実行するだけ！(毎日0時)**

```bash:/etc/cron.d/mail-delete
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
0 0 * * * root /etc/cron.d/mail-delete.sh
```
utf32コードポイントをutf16サロゲートペアに変換する

# utf32コードポイントをutf16サロゲートペアに変換する

ちょっと必要になって調べたのでメモ書き。
rubyの `Array#pack("U*")` 的なやつ。

```bash
#!/bin/bash

function utf8Esc() {
    # "\xXX" 形式にする
    fold -s2 | xargs -i echo -n "\x{}"
}

function unicodeEsc() {
    # "\uXXXX" 形式にする
    fold -s4 | xargs -i echo -n "\u{}"
}


function packUtf32() {
    # utf32be のコードポイントを utf8 にする
    xargs printf "%08X" | xxd -r -p | \
    iconv -f utf32be -t utf8
}

function utf32ToEscapedUtf16() {
    # utf32be のコードポイントをサロゲートペアの utf16be にする
    xargs printf "%08X" | xxd -r -p | \
    iconv -f utf32be -t utf16be | \
    xxd -p | unicodeEsc
}


VAL=0x2000B  # 𠀋

echo "bash ---------------------------"
echo $VAL | packUtf32 | xxd -p
echo $VAL | packUtf32
echo
echo $VAL | utf32ToEscapedUtf16
echo
echo

echo "ruby ---------------------------"
echo "print [$VAL].pack('U*')" | ruby | xxd -p
echo "print [$VAL].pack('U*')" | ruby
echo
cat <<EOD | ruby
require "json/pure"
puts JSON.utf8_to_json_ascii([$VAL].pack("U*"))
EOD
```

```txt:output
bash ---------------------------
f0a0808b
𠀋
\ud840\udc0b

ruby ---------------------------
f0a0808b
𠀋
\ud840\udc0b
```

## 最初からrubyでやればいいじゃん

とか言わない。

```rb
echo 0x2000B | ruby -r "json/pure" -e "print JSON.utf8_to_json_ascii([ STDIN.read.hex ].pack('U*'))"
```


## 主に参考にしたとこ

http://0xcc.net/blog/archives/000183.html
ターミナルを作るスクリプト

サーバーを操作できてしまうので非常に危険。
実際に使う場合は、外部に漏れないようにしたり、パスワードかけたり、権限を管理者だけにするのがおすすめ。
あんまり使わないと思うけど。

```html+php:comand.php
<!DOCTYPE HTML>
<meta charset="utf-8">
<h1>ターミナル</h1>
<form action="" method="GET">
  コマンドを入力：<input type="text" name="cm">
  <input type="submit">
</form>
<hr>
<b>result:</b>
<br>
<?php
$cm = (!empty($_GET['cm'])) ? $_GET['cm'] : '' ;
echo exec($cm);
?>
```
qiita > 検索 > 「title:書式 user:7of9」では検索できるが、「title:書式指定子 user:7of9」では検索できない

http://qiita.com/7of9/items/810b335186795da08d18
の続き

- [title:書式 user:7of9](http://qiita.com/search?utf8=%E2%9C%93&sort=&q=title%3A%E6%9B%B8%E5%BC%8F+user%3A7of9)
ではタイトルに「書式」が入っているもの9件が見つかった。
- [title:書式指定子 user:7of9](http://qiita.com/search?utf8=%E2%9C%93&sort=&q=title%3A%E6%9B%B8%E5%BC%8F%E6%8C%87%E5%AE%9A%E5%AD%90+user%3A7of9)では検索結果が0となった。

タイトルに「書式指定子」という文字列を含んでいる記事はある。
本来は上記いずれの方法でも検索されることを期待するが、実際には片方でしか検索できない。

法則がよくわからないので検索時にいくつかトライすることになる。
VIsual studioメモ

#「続行するには何かキーを押してください . . .」
「プロパティ」
->「リンカー」
->「システム」
->「サブシステム」
->「コンソール(/SUBSYSTEM:CONSOLE)」

#strcpyとか使いたい。
「プロパティ」
->「C/C++」
->「全般」
->「SDLチェック」
->「いいえ」

#IntelliSense エラーレポートの無効化
「ツール」
->「オプション」
->「テキストエディタ」
->「C/C++」
->「詳細」
->エラーレポートの無効化

#SIMDを使いたい。
「プロパティ」
->「C/C++」
->「コード生成」
->「拡張命令セットを有効にする」
-> 「Advanced Vector Extensions」(ヘッダファイルはimmintrin.h)

#CUDAを使いたい。
プロジェクトの「プロパティ」
->「ビルドのカスタマイズ」
->「ビルドカスタマイズファイル」
-> CUDAにチェック

プロジェクトの「プロパティ」
->「C/C++」
->「全般」
-> 追加のインクルードディレクトリ
   `$(CUDA_PATH)\include, $(NVCUDASAMPLES_ROOT)\common\inc`

->「CUDA C/C++」
->「Device」
-> Code Generation
   `compute_30,sm_30`とか

->「リンカー」
->「入力」
-> 追加の依存ファイル
   `cudart.lib`

cuファイルの「プロパティ」
->「全般」
->「項目の種類」
-> CUDA C/C++

# 警告を抑制
[CUDAコンパイラ(nvcc)でVisualStudioコンパイラ(cl)の特定の警告を無効にする方法](http://qiita.com/aokomoriuta/items/b2c466b966714a7d5b9a)

# メモリチェック
```c:main.c
#include <stdlib.h>
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
int main()
{
::_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
//
_CrtDumpMemoryLeaks();
return 0;
}
```

# ベンチマーク
```c:main.c
#include <windows.h>
int main(int argc, char**argv)
{
	LARGE_INTEGER f, start, finish;
	memset(&f,      0x00, sizeof(f));
	memset(&start,  0x00, sizeof(start));
	memset(&finish, 0x00, sizeof(finish));
	QueryPerformanceFrequency(&f);
	QueryPerformanceCounter(&start);	
	proc();
	QueryPerformanceCounter(&finish);
	int t = (int)((finish.QuadPart - start.QuadPart) * 1000 / f.QuadPart);
	printf("%d msec\n", t);
	return 0;
}
```
【Mac】エイリアスを使うならシンボリックリンクを使え

# エイリアスに出来なくて、シンボリックリンクに出来ること
**```cd```コマンドが使える。**

もうこれ以上に優先すべき事項がない。

開発をする上で、環境設定上どうしてもフォルダ構成が崩せない、特定のフォルダに入れなければいけないことが多々ある。
自分は開発系は全て```~/Developer/```というフォルダを作ってここに突っ込んでやっているが、上記のような状況になった場合にむず痒くなる。し、「あのプロジェクトのファイルはどこだ」という事になりやすい。

このような状況の時、プロジェクトのフォルダのエイリアスを作成して```~/Developer/```に突っ込んでおけば良いのだが、エイリアスには難点がある。
*```cd```コマンドによる移動が使えないのだ。*

## シンボリックリンクなら出来る
ところがどっこい、シンボリックリンクなら出来るのだ。

エイリアスだと、オリジナルのファイルそのものを移動した時に追跡してくれる。
とかいう記述をどっかで見たが、シンボリックリンクも追跡してくれる。確認した。

エイリアスの方が優れている点が見つからない…

## シンボリックリンクの作成方法
シンボリックリンクを作成するにはコマンドライン操作が必要で、次のコマンドで作成出来る。

```$ ln -s オリジナルの絶対パス シンボリックリンクを置きたいディレクトリ```

例えばMAMPでPHPのプロジェクトを開発していたら、

``` $ ln -s /Applications/MAMP/htdocs/hoge ~/Developer/```

これで、```cd ~/Developer/hoge```ができるようになる。
Swiftのindirectについて調べてみた

Swiftの ```indirect``` について調べてみました。

# ```indirect``` とは

Swift2.0から登場(正確にはXcode7 β4かららしい)。enumにくっつけて使うと再帰的なenumを作ることができる。

```swift
enum Sample {
    case Some(Sample)   //ここで再帰している
}
```

と書こうとすると、 ```indirect enum Sample``` にするよう指摘してくれる。 ```indirect case Some(Sample)``` でも可

# ```indirect``` の用途

公式ドキュメント的には[The Swift Programming Language: Enumerations](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html)の
[Recursive Enumerations](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-ID536)
に書いてある。題材は ```(5 + 4) * 2``` のような ```Int``` と足し算と割り算の3つの要素を ```enum``` を使って表すというもの。

要は ```enum``` と ```indirect``` を使うと二分木とかリストとか作れる

# なぜ ```indirect``` とつけなければいけないのか

```enum``` 自体は値型( ```String``` とか ```Structure``` とかの類)で再帰ができないため。らしい。 ```indirect``` が使えないβ3以前で二分木を作ろうとすると、再帰ができないので1つの ```enum``` で表現することができず、複数の ```enum``` を用意する必要がある。

参考：
[A persistent tree using indirect enums in Swift | Airspeed Velocity](http://airspeedvelocity.net/2015/07/22/a-persistent-tree-using-indirect-enums-in-swift/)
Swift1.2時代のやり方との比較をされている記事：
http://qiita.com/satoshia/items/9c6465356e2e155cd078

# おまけその1: ```indirect``` と ```sizeof```


```indirect``` で再帰が発生するとサイズがちいさくなる。

```swift
enum Sample<T> {
    case Foo(T)
    case Bar(T)
}

indirect enum Sample1<T> {
    case Foo(T)
    case Bar(T)
}

enum Sample2<T> {
    indirect case Foo(T)
    case Bar(T)
}

enum Sample3<T> {
    indirect case Foo(T)
    indirect case Bar(T)
}
```

|sizeof()|T = ```Int```|T = ```String```|
|---|---|---|
|Sample|9|25|
|Sample1|8|8|
|Sample2|9|25|
|Sample3|8|8|

# おまけその2: ```case``` バグ

http://qiita.com/satoshia/items/9c6465356e2e155cd078 でも紹介されているが、 ```if case let hoge = .Some(...) { ... }``` といった具合に ```switch``` 文以外でcaseを使うとクラッシュするらしい。
β5では解消されている模様

参考：
https://forums.developer.apple.com/thread/12188
ATS対策 外部ページの表示にはSFSafariViewController

iOS9でそんなに大きく取り上げられなかったのに開発者には頭のいたいATS, *App Transfer Security*。
APIをいくつかしか使ってないってなら「対応待ち」「例外設定」などで対応できますが、
沢山の外部サイトにリンクするアプリの場合はどうするの？ってことで。
結論「SFSafariViewControllerを使おうよ（見た目気にしなければ）」ってことです。

SFSafariViewControllerは「SafariのVC実装」なので、*HTTPのサイトも表示できます。*
で、こんな感じで実装してあげます。

```objc:ViewController
    Class safari = NSClassFromString(@"SFSafariViewController");
    if (safari != nil) {
        SFSafariViewController *safariViewController =
        [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"http://example.com/"]];
        
        [self presentViewController:safariViewController
                           animated:YES
                         completion:nil];
    } else {
        //iOS8以下の場合の処理。独自またはサードパーティのWebViewController呼び出しなど。
    }
```

他にもやり方はそれぞれだろうとは思いますが、手っ取り早く外部リンク解決できます。
もちろん　
`[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://example.com/"]];`

ってSafari呼び出しもていいんですけどね。
Ubuntu14.04LTSにufwを入れてFW設定をする

# 準備
まずはufwをインストールする。

```bash
$sudo apt-get install ufw
```
ipv6まわりが挙動が怪しいのでいろいろ試した結果ipv6は外したほうが良いようだ。

```lang:/etc/default/ufw
# Set to yes to apply rules to support IPv6 (no means only IPv6 on loopback
# accepted). You will need to 'disable' and then 'enable' the firewall for
# the changes to take affect.
IPV6=no
```
# 設定
とりあえず入ってくるものは全部拒否が基本で、外部に出ていくのはOKにしておく。

```bash
$sudo ufw default deny incoming
$sudo ufw default allow outgoing
```
もちろんsshも許可しておいた方がいい。リモートログインで作業しててsshを許可しなかったら詰む。

```bash
$sudo ufw allow 22
```

ログも取るようにしておこう。

```bash
$sudo ufw logging low
```
とはいえlowの場合はdefault以外のルールで弾かれたものをログにとるので、上述設定では何も書かれない。sshをallowではなくlimitにしたら不正なアクセスのログがのこるかもしれない。low以外には、

* off（完全に無効）
* medium（流量制御ありでallow・denyにマッチしたもの+不正なパケット+新しいコネクションを出力。デフォルト値）
* high（mediumの流量制御なし版）
* full（すべてのログを記録）

とりあえず早速ufwを有効にする。

```bash
$sudo ufw enable
```
以下のようにufwの状態を確認することが出来る。

```bash
user@localhost:~$sudo ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
```
上記例ではssh以外にもhttpも許可している。
# その他
なぜかこの設定後apt-get updateができなくなった。どうもipv6のアクセスが出来ない（？）ようだった。調べたら以下のように/etc/gai.confに記載を追加すると良い。

```lang:/etc/gai.conf
# 最後に追記
precedence ::ffff:0:0/96  100
```
記載完了後システムをrebootするとFWも順調に動作しapt-getも問題ない。
LitJsonでlongを使用する　メモ

下記サイトを参考にしました。（めっちゃ感謝です）
　http://caitsithware.com/wordpress/archives/140


■とりあえずこんなのを用意して事前に登録しておく

    private void LitJsonInitial()
    {
        JsonMapper.RegisterExporter<float>((obj, writer) => writer.Write(Convert.ToDouble(obj)));
        JsonMapper.RegisterImporter<double, float>(input => Convert.ToSingle(input));
        JsonMapper.RegisterImporter<int, long>(input => Convert.ToInt64(input));
    }
pepperめも_10:突然ペッパーが話さなくなった時に思い出してほしい問題

#突然ペッパーが話さなくなった時に思い出してほしい問題

ペッパーに、任意の文章を喋らせたいのに話さなくなった！
こんなことがおきたのでメモ

※Choregraphの2.0.5で確認

#ペッパーが喋らない

下記の文章を喋らせてみてください。「」ごとコピペしてください

「とのさまラボは１０時～１１時まで営業中！」

喋らないですよね！なにこれ！？

エラーログも出ないし。

#なおしかた

ペッパーの頭を３回なでた後に、文章をコピペしなおすとなおります。
下記の文章を喋らせてみてください。「」ごとコピペしてください

「とのさまラボは１０時〜１１時まで営業中！」

しゃべりましたよね！うまくいかない人は、ちゃんと上の文章を
コピペしなおしてください。（あたまをなでたあとに）

#おしまい

みんな試してみてね！
awsでzshを利用する方法

awsの無料枠を使っているとデフォルトのOSのAmazonLinuxAMIだと
単純にchshを叩いて入力するだけでは意味がなかったので公開します

手順
1.「sudo yum intall zsh」でzshのインストール
2.「cat /etc/shell」でzshがインストールされているのか確認
3.「sudo vim /etc/passwd」
4.「[username]:x :1634231:100 :[Your Name]:/home/[username]:/bin/bash」を
「[username]:x :1634231:100 :[Your Name]:/home/[username]:/bin/zsh」に変更
**コピペしないでください**
5.再起動するとデフォルトシェルがzshになっているはずです

お疲れ様でした。
プロセスを確認してKillする

よく忘れるので備忘録

プロセスの確認

```
$ ps aux | grep xxxxxxxx
```

※xxxxxxxの部分には「sidekiq」などを指定する

```
500       3047  7.4 24.1 355960 248428 ?       Sl   13:41   1:17 sidekiq 3.3.3 xxxx_project [0 of 3 busy]      
```

こんな感じでプロセスが出てくるので左から２番目のプロセスIDをkillする

```
$ kill 3047
```

強制的には-9をつける

```
$ kill -9 3047
```


sidekiqの場合、本番環境などではプロセスがちゃんと終わってからkillされるようにする
# 参考サイト
* [sidekiq を安全に止める](
http://qiita.com/pekepek/items/8eb302c997335fbce854)
runtime.Caller(1)をなめて扱ったら危険かもしれない

#議題

Golangでよくやる GetCurrentFile() とか GetCurrentDir() みたいなのはもしかしたら、ちょっと使い方間違えるとヤバイかもしれないというお話です。

よくやるやつ... つまりこう！！

```go
import (
  "runtime"
  "path"
)

// __FILE__
func GetCurrentFile() string {
  _, filename, _, _ := runtime.Caller(1)
  return filename
}

// __DIR__
func GetCurrentDir() string {
  _, filename, _, _ := runtime.Caller(1)
  return path.Dir(filename)
}
```

runtime.Caller(1)っていうのが問題で、挙動を見る限り、これは現在位置と言うよりビルドしたソースの位置らしいのです。なので、ビルドしてビルドしたディレクトリ構成の外で使うと挙動がおかしくなります。

**`__DIR__`的な考え**

| ディレクトリ | パス | 結果 |
|-----------|------------|------------|
| 元のディレクトリ | /Volumes/go/foo/bar/ | /Volumes/go/foo/bar/ |
| お引越し先 | /Home/fazbizz/ | /Home/fazbizz/ |

**GetCurrentDir()**

| ディレクトリ | パス | 結果 |
|-----------|------------|------------|
| 元のディレクトリ | /Volumes/go/foo/bar/ | /Volumes/go/foo/bar/ |
| お引越し先 | /Home/fazbizz/ | /Volumes/go/foo/bar/ |


#調査

とりあえず、日本語訳のドキュメントを読んでみる。
http://golang.jp/pkg/runtime

>Callerは、呼び出したゴルーチンスタック上で実行している関数のファイルと行番号情報をレポートします。引数skipは、引き上げるスタックフレーム数であり、これに0を指定したときはCallerを呼び出したスタックレームになります。戻り値は、プログラムカウンタ、ファイル名、ファイル内で呼び出した箇所の行番号をレポートします。情報を返せなかったときは論理値okにfalseが返ります。

Caller(1)の場合についてのことが書かれてない。

原文も呼んでみる
http://golang.org/pkg/runtime/#Caller

>Caller reports file and line number information about function invocations on the calling goroutine's stack. The argument skip is the number of stack frames to ascend, with 0 identifying the caller of Caller. (For historical reasons the meaning of skip differs between Caller and Callers.) The return values report the program counter, file name, and line number within the file of the corresponding call. The boolean ok is false if it was not possible to recover the information.

う〜ん、おんなじか(´～｀;)


海外の記事
http://blog.el-chavez.me/2013/05/17/golang-current-file-path/

>Next you can use the Caller method and capture the filename. We need to give this function a 1 to tell it to skip up a caller.

訳す

>Callerメソッドを使ってファイル名をキャプチャできる。このファンクションに1を渡すとcallerをスキップできる

振り返る

>これに0を指定したときはCallerを呼び出したスタックレームになります。

もしかして0指定してないと実際に呼び出したところの情報は取れないのか！！
∑(ﾟДﾟ)ｶﾞｰﾝ

(実際にやってみたは後でやってみる)

#代替策を考える

考えたくないので、stackoverflowとかから引っ張る
http://stackoverflow.com/questions/18537257/golang-how-to-get-the-directory-of-the-currently-running-file

```go
import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {
    dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    if err != nil {
            log.Fatal(err)
    }
    fmt.Println(dir)
}
```

```go
import (
    "github.com/kardianos/osext"
    "fmt"
    "log"
)

func main() {
    folderPath, err := osext.ExecutableFolder()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(folderPath)
}
```

```go
import (
    "fmt"
    "os"
)

func main() {
    pwd, err := os.Getwd()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(pwd)
}
```

#追記
Googleグループで似た話してました。
https://groups.google.com/forum/#!topic/golang-nuts/XiKfqDO3rKQ
時間計算をミリ秒で計算する

Javaで時間の計算をミリ秒で計算し、条件分岐を作成したのでここにメモ

**ポイント**

* ミリ秒にする（getMsecOfDay(int hour)）
* 本日の0時からのミリ秒を出す(getMsecOfDay(Date current))
* 細かくメソッド化する(isHoliday()やisNight()など)

**仕様**

* 平日(金曜以外)は営業時間を8-20
* 金曜日の営業時間は8-17
* 土日休み

**必要なライブラリをimport**

```
import java.util.Calendar;
import java.util.Date;
```
**定数**

```
// 業務終了とする時刻
private static final int FRIDAY_END_HOUR = 17;
// 平日の始業時刻
private static final int WEEKDAY_START_HOUR = 8;
// 平日の終業時刻
private static final int WEEKDAY_END_HOUR = 20;
```
**ミリ秒**

```
private static long getMsecOfDay(int hour) {
  // N時間 * 60分 * 60秒 * 1000ミリ秒
  return hour * (60 * 60 * 1000);
}
```
**本日0時からのミリ秒**

```
    
//1970/1/1~現在までのミリ秒 - 1970/1/1~現在0時までのミリ秒
private static long getMsecOfDay(Date current) {
  // 現在ミリ秒 - 同日0時のミリ秒で、0時から換算したミリ秒を算出する
  return current.getTime() - org.apache.commons.lang.time.DateUtils.truncate(current, Calendar.DATE).getTime();
}

```
**土日**
   
``` 
//土日は true を返す
private static boolean isHoliday() {
  int wday = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
  return wday == Calendar.SATURDAY || wday == Calendar.SUNDAY;
}

```
**夜間の時間帯か判定**   

``` 
//夜20時 ~ 朝8時までの間の場合 true を返す
private static boolean isNight() {
  long baseTimeMsec = getMsecOfDay(new Date());
  return baseTimeMsec getMsecOfDay(WEEKDAY_START_HOUR) || getMsecOfDay(WEEKDAY_END_HOUR) <= baseTimeMsec;
}

```
**土日と金曜17時以降**

```

// 金曜日の17時以降、または土日の場合 true を返す
public static boolean isWeekend() {
  int wday = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
  long baseTimeMsec = getMsecOfDay(new Date());
  // 金曜日17~または土日はサービス時間外
  return (getMsecOfDay(FRIDAY_END_HOUR) < baseTimeMsec && wday == Calendar.FRIDAY) || isHoliday();
}

```
**営業時間外**

```
//金曜日17時以降、または土日の場合、また平日の20時〜8時の場合は true を返す
public static boolean isOutOfService() {
  return isWeekend() || (isNight() && !isHoliday());
}
```
D言語で書く "イケメンなコード"  ~ 階乗をイケメンに書く ~

#概要
D言語でイケメンに書く書くシリーズをやろうかなぁと思ったのでなんとなく投稿することにしました。  
言うまでもないですが、コードに対する感覚は僕の個人的なものなので万人がこのコードをイケメンであると評価するとは思いません。  
  
  
#本題
さて、階乗のコードを書け！と言われると、どのように書きますか？  
以下のようにいくつかの例が考えられますね。  
  
##1 ループ

```d
T f(T)(T n){
  T s = 1;

  foreach(i; 1..1+n)
    s *= i;

  return s;
}
```

一番単純ですが、僕はこの実装は嫌いです。  
  
##2 再帰

```
T factorial(T)(T n){
  return n == 0 ? 1 : n * factorial(n - 1);
}
```

まぁ、普通の実装と言ったところでしょうか。  
でも、再帰というと末尾再帰の方がいい気がしますよね？

##3 末尾再帰

```d
T factorial(T)(T n, T s = 1){
  return n == 0 ? s : factorial (n - 1, s * n);
}
```

これが末尾再帰です。  
しかし、D言語だと次のようにもっとカッコよく記述できます。  

## rangeをmapしてreduceする
```d
import std.range,
       std.algorithm;

T factorial(T)(T n){
  return n == 0 ? 1 : n.iota.map!"a+1".reduce!"a*b";
}
```

##何をしているのか
`iota`は0から第一引数にnが与えられた時に、0からn-1までのn個のrangeを返します。  
つまり、こうなります

```d
assert([0, 1, 2] == 3.iota.array);
```

それで、mapはrangeの各要素aに対して操作Fを行います。
ここではFはa+1となります、よってiotaで生成されたrangeの各要素aに対してそれぞれ1を加えた値を要素として持つ新しいrangeがmapにより作られます。
つまり、

```d
assert([1, 2, 3] == 3.iota.map!"a+1".array);
```

その後、reduceですべての要素の積を求めます。
何故こうなるか、というとreduceはrangeと操作を受け取ります。
ざっくり説明すると、
aに与えられたrangeの各要素が順に入り、bにはそれまでの結果が入ります。
そしてそのa,bによる計算結果がbに代入されていく みたいなイメージです。
つまり、

```d
  assert(6 == [1,2,3].reduce!"a+b");
  /*
    int b;
    foreach(a; [1,2,3]){
      b += a;
    }
    return b;
    みたいなイメージ
  */
```

よってこれらを組み合わせることで階乗が実装できます。

#次回予告
次回は気が向いたらきますね
SQLの効率化

SQLを高速化について、少し勉強したのでメモを残しておきます。

**サブクエリを引数に取る時はINよりEXISTSまたは結合**
<pre>
SELECT * FROM A WHERE id IN(SELECT id FROM B);
-- より
SELECT * FROM A AA WHERE EXISTS(SELECT B BB WHERE AA.id = BB.id);
-- の方が早い。もしくは
SELECT AA.id, AA.name FROM A INNER JOIN B BB ON AA.id = BB.id;
</pre>

* EXISTSは条件に合致するものを１行でも見つけたらそこで検索終了
* INは全表検索してしまう
* 結合キーにインデックスが張られていればインデックス参照だけで済む

※PostgreSQLは7.4からIN述語にサブクエリが速度改善されている
※OracleはINを使ってもインデックススキャンを行う様に工夫されている

**DISTINCTをEXISTSで**
<pre>
SELECT AA.name FROM A AA INNNER JOIN B BB ON AA.name = BB.name;
-- より
SELECT name FROM A AA WHERE EXISTS(SELECT * FROM B BB WHERE AA.name = BB.name); 
</pre>

* DISTINCTは重複を排除するソート
* 上記であればソートが発生しない

**ALLオプション**
<pre>
SELECT * FROM A
UNION
SELECT * FROM B
-- より
SELECT * FROM A
UNION ALL
SELECT * FROM B
</pre>

* UNIONは重複排除のソートを行う
* ALLを使えばソートは発生しない

**GROUP BY と ORDER BY でインデックスを使う**

* インデックスの存在するキーを指定すればソート時に高速化できる
* ユニークインデックスの場合はソートをスキップできる

**MAXまたMINでインデックスを使う**

* 引数にインデックスが存在した場合、そのインデックスだけで済む

<pre>
-- IN述語で複数のキーを使う場合はまとめる
SELECT id,name,email FROM A AA 
WHERE name IN (SELECT name FROM B BB WHERE AA.id = BB.id) 
AND email IN (SELECT email FROM B BB WHERE AA.id = BB.id);
-- より
SELECT * FROM A AA
WHERE id || name || email IN (SELECT id || name || email FROM B BB)
-- の方が検索が１度で良い。または
SELECT * FROM A AA
WHERE (id,name,email) IN (SELECT id,name,email FROM B BB);
-- インデックスを利用できる
</pre>

**インデックスをうまく活用する**

* 検索条件の右側で式を使えばインデックスを使用できる
<pre>
-- test_1列にインデックスが張られているとして
SELECT * FROM A WHERE test_1 > 108 / 1.08 
</pre>
* IS NULL・IS NOT NULL 述語を使わない
<pre>
-- IS NULL または IS NOT NULL はインデックスを利用できない
SELECT * FROM A WHERE test_1 IS NOT NULL;
</pre>
* 否定型は使わない
<pre>
<>、 !=、 NOT INなどは全表検索し、インデックスを使用しない
</pre>
* 前方一致を使う
<pre>
SELECT * FROM A WHERE test_1 LIKE 'z%';
</pre>

**ちなみにインデックスとは**
以下参照元：http://www.techscore.com/tech/sql/15_01.html/#sql151
<pre>
引用：インデックスとは、データの検索速度を向上させるために、どの行がどこにあるかを示した索引のことです。
</pre>
つまり、目次ですね。本などで調べる時はやはり目次を見た方が早いですよね。

**作り方は**
<pre>
-- postgreSQL
CREATE [UNIQUE] INDEX インデックス名 ON テーブル名(列名,...) ;
-- oracle
CREATE [UNIQUE] INDEX インデックス名 ON テーブル名(列名 [ ASC | DESC ],...) ;
</pre>
**消し方**
<pre>
DROP INDEX インデックス名 ;
</pre>

SQLの勉強することによりアプリケーションの速度向上も望めると思います。
今後はこの情報をAppにも活用していきたいですね。
例のアレ

```r
library(ggplot2)
ggplot(data.frame(x = c(-1, 1)), aes(x)) +
  stat_function(aes(ymin=..y.., ymax=1), fun = function(x) ifelse(x<0, sqrt(10/9-x^2), NA), geom="ribbon", fill="#FFD700", n=1001) +
  stat_function(aes(ymax=..y.., ymin=-1), fun = function(x) ifelse(x>0, -sqrt(10/9-x^2), NA), geom="ribbon", fill="gray50", n=1001) +
  geom_ribbon(aes(ymin=-1, ymax=1), data.frame(x = seq(-1/3, 1/3, len=2)), fill="black") +
  stat_function(aes(ymin = 2/3, ymax = ..y..), fun = function(x) sqrt((1/3)^2-(x-2/3)^2)+2/3, geom="ribbon", fill="red", n=1001) +
  stat_function(aes(ymax = 2/3, ymin = ..y..), fun = function(x) -sqrt((1/3)^2-(x-2/3)^2)+2/3, geom="ribbon", fill="red", n=1001) +
  xlim(-1, 1) + ylim(-1, 1) +
  coord_equal() +
  theme_bw()
```

```r
ggplot(data.frame(x = c(-1, 1)), aes(x)) +
  geom_ribbon(aes(ymin=-1, ymax=1), fill="black") +
  stat_function(aes(ymin=..y.., ymax=1), fun = function(x) ifelse(x<0, sqrt(10/9-x^2), NA), geom="ribbon", fill="#FFD700", n=1001) +
  stat_function(aes(ymax=..y.., ymin=-1), fun = function(x) ifelse(x>0, -sqrt(10/9-x^2), NA), geom="ribbon", fill="gray50", n=1001) +
  geom_ribbon(aes(ymin=-1, ymax=1), data.frame(x = seq(-1/3, 1/3, len=2)), fill="white") +
  stat_function(aes(ymin = 2/3, ymax = ..y..), fun = function(x) sqrt((1/3)^2-(x-2/3)^2)+2/3, geom="ribbon", fill="red", n=1001) +
  stat_function(aes(ymax = 2/3, ymin = ..y..), fun = function(x) -sqrt((1/3)^2-(x-2/3)^2)+2/3, geom="ribbon", fill="red", n=1001) +
  xlim(-1, 1) + ylim(-1, 1) +
  coord_equal() +
  theme_minimal() + theme(panel.grid = element_blank())
```
Windows10でedgeとかのアイコンが消えたりした時の対処法

# 何かアイコンが消えた、視認性が悪い。
~~~cmd 
sfc /scannow
~~~
上記も効かないしで困って調べていたところ、edgeとかはメトロアプリと同じ扱いらしいということにたどり着く

# Powershellで下記のコマンドを打って解決
~~~Powershell
Windows PowerShell
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Users\Username> Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}
~~~

パッケージを全部再インストールする感じのコマンド
弊害としてはスタートメニューが吹き飛んで登録しなおしになったり、飛ばなかったりする。
よくわかりません。
unity > RectTransform.SetAsLastSibling(); > 最後に描画 > 前面に来る

https://www.youtube.com/watch?v=0L-Y8dPJHDM&list=WL&index=35
の18:55あたりで出てくる。

```csharp
public class DragPanel : MonoBehavior, ... {
  ...
  public void OnPointerDown (PointerEventData data) {
    panelRectTransofmr.SetAsLastSibling();
  }
}
```

RectTransform.SetAsLastSibling();を実行することで最後に描画することになる。
最後に描画したものは前面に来るらしいので、DragPanelとして使うときによさそう。


http://docs.unity3d.com/ScriptReference/Transform.SetAsLastSibling.html
> Move the transform to the end of the local transfrom list.

ドキュメントだけではlistの最後に来ることはわかるが、それで何に役立つのかはわからなかった。
文字列中の式展開はどんだけネストできるのか検証

ふと気になって試したら1427段階までネストできました。
最後はメモリが足りなくなってエラーなので、メモリが許す限りいくらでもネスト可能なようです。

```rb
f = -> n { n.times.inject("1") {|a| a.sub(/1/, '"#{1}"')}}

f[2]                            # => "\"\#{\"\#{1}\"}\""
eval f[2]                       # => "1"

(1..Float::INFINITY).each do |n|
  begin
    eval f[n]
  rescue Exception
    n                           # => 1428
    raise
  end
end
# ~> -:8:in `eval': (eval):1: memory exhausted (SyntaxError)
# ~> ...#{"#{"#{"#{"#{"#{"#{"#{"#{"#{1}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"...
# ~> ...                               ^
# ~> 	from -:8:in `block in <main>'
# ~> 	from -:6:in `each'
# ~> 	from -:6:in `<main>'
```
C++でJavaっぽい、いやJava以上のsynchronized

C++11以降だとstd::mutexとstd::lock_guardがありますし、これらは簡単なクラスだから古いC++でも数秒で自作できますし、でも排他スコープが明確なJava/C#のsynchronizedの記法がうらやましいなーとこんなマクロ書いちゃうこと多いですよね。（よね？）

```cpp
#define synchronized(monitor) \
  if (auto __lock = std::make_unique<std::lock_guard<std::mutex>>(monitor))
```

こういうの定義しておくと

```java
std::vector<int> data_;  // いろんなスレッドから読み書きするデータ
std::mutex monitor_;     // mutexオブジェクトを宣言しておいて

...

synchronized (motinor_) {
  // 排他制御された処理
  data_.doSomething();
}
```

Javaやあっ。

さてここからはJavaを超えに行きます。
プログラマの意図は**「data_を自スレッドしか触っていないことを保証したい」**であって、monitor_という存在は意図よりも低レベル、ノイズです。Javaだとdata_そのものにモニタの役割もさせてしまう（synchronized(data_)と書く）こともまあできますが、これはあまりよろしくない技法だから普通はmonitor_を別に用意するものです。
C++ならそれもマクロに用意させてプログラマの目から隠せる。

```cpp
// 先ほどのsynchronizedの定義に追加します。

// モニタ変数の名前は _mutex_【対象変数名】 だ
#define MONITOR_OF(var) _mutex_ ## var

// 変数宣言とそれ専用のモニタ変数宣言をやってくれる
#define DECLARE_THREAD_SAFE(type, var) \
  type var; \
  std::mutex MONITOR_OF(var);

// 独占使用したい変数を指定する記法
#define exclusive(var) synchronized(MONITOR_OF(var))
```

こうすると、data_の独占使用はこうなります。

```java
DECLARE_THREAD_SAFE(std::vector<int>, data_)  // いろんなスレッドから読み書きするデータ

...

exclusive (data_) {
  // 排他制御された処理
  data_.doSomething();
}
```

synchronizedマクロですが、if構文の枠に乗せるためにmake_uniqueしてるのがなんか迂遠で汚らしいですね。なんかいい書き方ありますかね。ifでなくfor使うとか？
Fluxについて現時点での理解

# Fluxについて現時点での理解をまとめました
### Fluxって？
* 設計概念、アーキテクチャ
* こう設計するといいよねっていうFacebookの提唱
* なので実体があるわけではない

### Reactとの関係は？
* ReactはFluxアーキテクチャView部分の実装、こちらはライブラリとし提供されている
* ただし、Fluxアーキテクチャに当てはめなくてもReact単体でも使える

### Fluxは新しいの？
* いいえ
* ただのオブザーバーパターン（の応用）
* ビビらなくていい

### Fluxの登場人物たち
* Action
* Dispatcher
* Store
* View

### Flux - Action
* データの流れの起点になるひと
* 定義されるメソッドは下記に紐づくと考える
    * ユーザーの操作
    * サーバーからのレスポンス（初回レンダリング）
    * APIレスポンス
* 各Actionをトリガーにしてイベント発生させて、アクション種別とかデータを渡す

### Flux - Dispatcher
* ActionとStoreを繋ぐひと
* Actionが発生させたイベントをDispatcherによってStoreに通知してデータを渡す
* イベント発生処理とイベント購読処理を備える

### Flux - Store
* 状態を管理するひと
* Dispatcherが発生させるイベントを購読して、そのコールバックに自身の状態変更用（=ビジネスロジック）メソッドを渡す
* 状態変更処理はコールバック経由のみ（setter相当のメソッドは定義しない）
* 状態が変更されたら、状態変更イベントを発生させる

### Flux - View
* React
* Storeの状態変更イベントを購読して、その変更イベントをトリガーにして表示更新
* 更新処理自体はReactがよしなにやってくれるはず

### 旨味
* データの流れを一方方向にすることでシンプルになる
* Storeの処理を正しく行ってさえいれば、Viewの表示処理を気にする必要はない　はず

### 使い所
* 機能モリモリなSPA
* 今のところ、アニメーションなどを多用するものには向かなそう
Adblock有効時のYouTube埋め込みコード対処

#**Adblockについて**
Adblockとは、Webサイト上の広告を自動的に非表示にする拡張機能です。
全世界のネット人口のうち4.9%、数にして1億4400万ユーザーも存在しているそうです。

#**Adblockが使われている時の問題**
多くのキャンペーンサイトで、YouTubeの埋め込みコードで動画を紹介しているサイトを見かけます。
しかし、AdblockでYouTubeの埋め込みコードがブロックされてしまい空白ができてしまいます。

恥ずかしながら自分自身YouTubeの広告に嫌気をさしてAdblockを愛用するようになった一人です。
とあるWebサイトを閲覧していると、画面全体が空白になっており、直帰した経験が何度もあります。
たまたまAdblock非有効時に閲覧をすると動画の存在を知りました。

そういった経緯からYouTube埋め込みコードを用いる場合には
Adblockユーザーのために動画の存在を示す必要があるなと思った次第です。

#**Adblockユーザーのための実装**
**対処その1 - HTML / CSSのみで対処する**
jsdo.itに簡単にサンプルを用意しましたのでご覧ください。
・[Adblock有効時のYouTube埋め込みコード対処サンプル](http://jsdo.it/Masato.Takahashi/zvfW)

Adblock有効時には埋め込みコードの「iframe」が非表示になってしまいます。
iframeが非表示になると下敷きになっている要素が出現するという簡単な構造です。

***
**対処その2 - FuckAdblockを使う**
[FuckAdBlock](https://github.com/sitexw/FuckAdBlock)を使う。
本格的には使ったことありませんが、JavaScriptでAdblockのON / OFFを取得することができます。
これを使って本格的に対処するのもアリだと思います。

***
**対処その3 - そもそもYouTubeを使わない**
YouTubeからの埋め込みコードはブロックされてしまいます。
しかし、たしかVimeoからの埋め込みコードはブロックされなかったかと思います。（曖昧な記憶ですがｗ）

自分のサーバーに動画を置いても良いのならVideoタグを使うことも視野に入れておくのも良いのではないでしょうか。


***
**以上**
そもそもAdblockユーザーへの配慮は必要なのかしら・・・ｗｗｗ
ご意見ございましたら、よろしくお願い致します。

ご覧いただきありがとうございました。
[AndroidStudioとGitHubの連携]新しく作業する時のBranchの切り方

※現在作業していない状態で行う
###AndroidStudio
1.最新の状態にする
VCS->Git->Fetch

2.VCS->Git->LocalBranchのDelopをクリック->checkout

3．versionControlのLogを確認
HEADが緑のdevelopに移動していることを確認

>参考
developブランチがうまいこといかなかった時の対処法
http://qiita.com/tesoro/items/bbe5cde92e9b7904753d

4.developの状態をpullする
VSC->Git->pull
current Branchがdevelopになっている事を確認
origin/developにだけチェックが入っていることを確認
pull

5.Gradleの更新

6.確認のため問題にならないくらいの変更を加える

7.new Branchの作成
VCS->Git->Branches->+new Branch->名前を入力
（機能の追加の場合は「feature-」と付けることが多い）

8.pushする
VCS->Git->Push

###GitHub
9.対象アプリの画面を開く

10.compare&pull Requestをクリック

11.base:Develop compare:「作った名前」にする

12.create pull request

13.そして本格的な作業を始める
ニフティクラウド mobile backendのiOS 9対応について

[ニフティクラウド mobile backend](http://mb.cloud.nifty.com)のiOS SDKは、
iOS 9のベータ版でも動作確認を行っておりますが、
SNSやGoogleアカウントと連携するために以下のような設定が必要です。

## Facebook連携でのiOS 9対応

- Facebook開発者サイトでアナウンスされている、iOS 9対応を実施してください
 - [Preparing Your Apps for iOS9](https://developers.facebook.com/docs/ios/ios9)
- ニフティクラウド mobile backendでは、Facebook SDKのv4.1.0で動作確認を行っております

## Twitter連携でのiOS 9対応

- App Tranceport Securityの影響でTiwtterのapiサーバーとの通信が制限されます
 - Info.plistでapiサーバーとの通信を有効にしてください

```
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>api.twitter.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
```

## Google連携でのiOS 9対応

- Google Sing-in iOS SDKのv2.2.0から、iOS 9に対応しています
 - XcodeでプロジェクトのBuild Settingsを開き、Enable bitcodeをNOに指定してください
 - [Google Sign-In iOS SDK Release Notes](https://developers.google.com/identity/sign-in/ios/release?hl=ja)
ngTagsInputでDuplicates in a repeater are not allowedの対処方法


## はじめに前置き

以下機能を持ったRailsベースのWebアプリケーションを開発してます

- スマフォアプリ向けのAPIの機能
- 管理画面
- スマートフォン向けサイト

基本的にはRailsのレールにのって開発をしているのですが、管理画面で割りと込み入ったことを今後やっていく予定でそこだけAngularJSの機能を多用していこうと思って従来jQueryのやつを使っていたものをTags InputのAngularJS版と思われる[ngTagsInput](http://mbenford.github.io/ngTagsInput/)を利用することにしました。

ちなみに環境は以下です

- Rails 4.2
- AngularJS
  - Rubyのgemのangularjs-rails-1.4.3に内包されてるものを利用
- ngTagsInput v3.0.0
 

## 生じていたトラブル

管理画面で新規にデーター登録してる時には気づかなかったのですが既存データーの編集画面を表示した時に、Webブラウザのコンソール画面に

```
Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: tag in tagList.items track by track(tag), Duplicate key: undefined, Duplicate （以下省略）
```

というメッセージが表示されて、意図したデーターも表示されないトラブルが生じました

## 原因

[Angularjs – ngTagsInput v2.2.0 – “Duplicates in a repeater are not allowed.”](http://www.tech.shinynewthings.com/?p=115)を読んで気づいたのですが、track by の所の処理に原因がありそうでした


## 解決策

[AngularJSのngRepeatを"ちゃんと"理解する.](http://qiita.com/Quramy/items/1a4c4bdc02a362a4c22d
)をまずは読みつつ、今回作ってるものがバックエンドのRailsベースのアプリから

```json

[
  {
    id: 1,
    name: "ローライズ",
  },
  {
    id: 2,
    name: "スキニー",
  },
]
```

みたいなJSONを受け取る処理なので無駄な再描画を防ぐためにtrack byを利用するのは正しい使用例かと判断してngTagsInputのソースを書き換えることにしました

### 従来のngTagsInputのソースコード

```js

ng-repeat="tag in tagList.items track by track(tag)
```

### 変更後のngTagsInputのソースコード

```js

ng-repeat="tag in tagList.items track by $index
```

にて解決。
Internet Explorerではlocation hash changeでhashとname属性が一致するinputに飛んでいってしまう

既存の js rendering じゃない画面を Backbone で部分的に js rendering することがよくある[^1]んですが、その際気をつけるべきことのひとつが Routing に使う location hash が html 内の id 属性と被らないようにすることだと思います。意図せぬ位置にスクロールしちゃいますよね。

ところがだ。 Internet Explorer だと name 属性の一致する input にも飛んでいってしまうのだよ。

[^1]: みんなはどう？
CentOSでWebSVNが動かなかったのはSELinuxの設定が原因だった


# 現象

SVNサーバとは別のサーバにApache入れてWebSVNを立ち上げたが、正常に動作しない。
Apacheのerror_logには以下のような出力が出てた。

```/var/log/httpd/error_log
svn: E000013: Unable to connect to a repository at URL 'svn://218.219.151.16/home/svn/repos/claris'
svn: E000013: Can't connect to host '218.219.151.16': Permission denied

```


# 原因

どうやらSELinuxが有効化されているとhttpdのCGI経由でのネットワークアクセスが制限され、結果としてWebSVNのようなスクリプトが正常に動作しないらしい。


# 対処

そもそもCGIで他ホストに繋いで情報のやりとりを許すことにいろいろ問題あることは置いといて（イントラネット内のサービスなので目をつぶる）。

対応としてはSELinuxの設定で、`httpd_can_network_connect`をonにする。

```bash:例
現在の設定を確認
$ sudo getsebool httpd_can_network_connect
httpd_can_network_connect --> off

ONにする
$ sudo setsebool httpd_can_network_connect 1

設定を再度確認
$ sudo getsebool httpd_can_network_connect
httpd_can_network_connect --> on
```

これでWebSVNが動作するようになった。

# 参考

[トラブルシューティングはCentOS 5におまかせ － ＠IT](http://www.atmarkit.co.jp/fsecurity/rensai/selinux205/selinux02.html)
knowledgebaseプラグインを追加する(Redmine2.X, 3.X)

knowledgebaseプラグインはwikiにはないタグ付け管理ができるのでインストールしてみた。いろいろ躓いたのでメモを残しておく。

##redmine2.Xの場合

###環境

* CentOS 6.7
* redmine 2.3.1 stable
* ruby 2.0.0
* knowledgebase 3.0.7

###インストール

基本的には[本家サイト](https://github.com/alexbevi/redmine_knowledgebase#installation)に書いてあるとおりに進める。
RAILS_ENVのセットを忘れがちなので注意すること。

認証プロキシ経由のgit cloneがうまくいかないときは、zipをDLして、/var/lib/redmine/plugins/でunzipする。
unzipで解凍したら、redmine_knowledgebase_master を、redmine_knowledgebase にリネームすること。


##redmine3.Xの場合

###環境

* CentOS 7.1
* redmine 3.0.4 stable
* ruby 2.1.6p336
* knowledgebase 3.0.7

###インストール

redmine3.Xへインストールする場合は罠がある。
2系とは異なるリポジトリからzipをDLする。
https://github.com/alexbevi/redmine_knowledgebase/tree/redmine-3.0-compat

解凍後、redmine_knowledgebaseにリネームし、redmine/でbundle install する。
あとは、2系と一緒。
HTMLテキストフィールド入力値に対する日本語 IME のハンドリング


よくある「テキスト入力によるフィルタリング」みたいな機能の際に、日本語 IME による入力が未確定の場合はイベントを発火したくないというのをうまくやるやつ。


```html
<html>
  <head></head>
  <body>
    <input id="foo" type="text" value="" />
    <script>
      var onComposition = false;
      var input = document.getElementById("foo");

      input.addEventListener('keyup', function (e) {
          if (onComposition) return;
          console.log(e.target.value);
      });
      input.addEventListener('compositionstart', function () {
          onComposition = true;
      });
      input.addEventListener('compositionend', function () {
          onComposition = false;
      });
    </script>
  </body>
</html>
```

## 参考

IME handling guide
https://developer.mozilla.org/en-US/docs/Mozilla/IME_handling_guide
追加できるフォーム(jQuery)

初投稿。もう既出のネタかと思いますが、、、

```html:index.html
<div id="form">
  <input type="text">
</div>
<input type="button" value="+" id="addForm">
```
```js:script.js
$(function(){
  $('#addForm').click(function(){
    $('#form').append('<input type="text">');
  });
});
```
これで追加できるようになります。
ちなみに、値の取得は、

```js:script.js
var value;
var forms = $('input[type=text]');
for (var i = 0 + 1;i < forms.length + 1;i++) {
  value = $('input[type=text]:nth-of-type(' + i + ')').val();
  // これで、変数valueにフォームの中身が格納されたので、あとはここでAjaxとかするだけ。
}
```
です。
「nth-child」じゃなくて「nth-of-type」にするほうが、バグが起こりにくいです。
追加の上限を設定する場合は、


```html:index.html
<div id="form">
  <input type="text" data-inputCount="0">
</div>
<input type="button" value="+" id="addForm">
```
```js:script.js
$(function(){
  $('#addForm').click(function(){
    var inputCount = $('#form input:last-child').attr('data-inputCount');
    var next_num = parseInt(inputCount) + 1;
    if(next_num == 10/* ←上限 */) {
      $('#addForm').remove();
    } else {
      $('#form').append('<input type="text" data-inputCount="' + next_num + '">');
    }
  });
});
```
たぶんこれでいいと思います。

**2015.08.21 追記**
@naga3 さんに、よりシンプルなコードを教えていただいたので、追記します。
値の取得はchildrenとeachを使った方がいい：

```javascript:script
var forms = $('#form').children();
forms.each(function() {
  var value = $(this).val();
  // これで、変数valueにフォームの中身が格納されたので、あとはここでAjaxとかするだけ。
});
```

上限を設定するときもこんなに簡潔に書ける：

```javascript:script
$('#addForm').click(function(){
  if ($('#form').children().length < 10) {
    $('#form').append('<input type="text">');
  }
});
```
ありがとうございます！
【質問】PHPからCSVへ書き出す際の改行について

入力画面→確認画面→CSV書き出しというフローになっているサイトがあるのですが、
確認画面内の改行タグがCSVに書き出したときに反映されておらず、画像のように
改行扱いされず別のセルに入ってしまいます。

![CSV.jpg](https://qiita-image-store.s3.amazonaws.com/0/90208/6cf9b43b-e182-28fc-d752-a46075658649.jpeg)

テキストエリアには↓のような形で記載されています。
`<td class="textarea"><?php echo nl2br($_POST['hoge']); ?></td>`

nl2brという記述が改行タグを挿入するためのもの、というのは調べて分かったのですが
私自身はエンジニアではないためこれ以上どうすればよいのかわかりません。

他に必要な確認事項がありましたら追記しますので、
どなたかご教授いただけないでしょうか。よろしくお願いします。
react.js/material-uiでコンポーネントでhtml5のinputタグを使ってバリデーション

react.jsとmaterial-uiを使うと、入力フィールドとそのバリデーションは次のようなコードになります。今回はメールアドレスを入力するケースです。


※ ES6の記法で書いています。


```js

handleValidation(e) {
  let email = this.refs.email;
  let value = email.getValue();
  if (!value) {
    email.setErrorText('メールアドレスを入力してください');
    return;
  }
  let re = /^.+@.+$/i;
  if (!re.test(email)) {
    email.setErrorText('入力された値はメールアドレスではありません');
    return;
  }
}

render() {
  return <TextField ref='email' floatingLabelText='email'
           onChange={this.handleValidation.bind(this)} />;
}
```

のように記述します。html5のタグが使えるのに、メリットを全然活かせていません。TextFieldにセットしたプロパティはすべて、inputタグにセットされるので、type='email'をセットします。ここでは一緒に、required=trueをセットして、入力を必須にセットしています。

```js
render() {
  return <TextField ref='email' floatingLabelText='email'
           type='email' required={true}
           onChange={this.handleValidation.bind(this)} />;
}
```

これで、inputタグのtypeはemailになりました。しかし、html5のinputタグのバリデーションはフォームをサブミットするときに実行されて表示されます。さらにonChangeで自前でemailのバリデーションを行うのもの二度手間です。もっとスッキリとしたいです。

inputタグは値が入力されると、即座にバリデーションされてvalidationMessageにバリデーションメッセージがセットされます。これを使えば、バリデーションのロジックを自分のコードから減らせて、表示方法もコントロールできます。

material-uiに限った話で言えば、input要素はdiv要素の中にラップされているので、reactのコンポーネントからDOM要素を抜き出す、と言う余分な処理が入りますが、やり方自体はreact.jsに限らず汎用的に使えるはずです。

それでは、バリデーションメッセージを処理するようにhandleValidationを書き換えます。

```js
handleValidation() {
  let email = this.resf.email;
  let elem = React.findDOMNode(email).getElementsByTagName('input')[0];
  if (!elem.validity.valid) {
    email.setErrorText(elem.vaidationMessage);
  } else {
    email.setErrorText('');
  }
}
```

これで、入力値のバリデーションがhtml5の機能で隠蔽されました。また、ブラウザの機能でかっこわるいバリデーションエラーを見せるのではなく、Material UIの統一的なエラーメッセージの表示方法でエラーを見せられるようになります。
Browserfyの出力をpretty printした状態で吐き出したい


Browserifyさんどんな出力吐いてるの？と思って研究したい時に欲しくなった。

# 答え
[js-beautify](https://github.com/beautify-web/js-beautify)使う。

```sh
$ npm i -D js-beautify
```

```package.json
"scripts": {
  "beautify-build":"browserify -e ./src/index.js | js-beautify -f - > build/index.js"
}
```
だいたいこんな感じ。
beautifyfyとかあるかなと思ったけど無かった。
scalatraの環境構築

scalatraを使ってIntelliJで開発したい

qiita内にscalatraに関する投稿はあまり多くないようなので，備忘録がてらいつもお世話になっているので少し貢献したいと思う．

## 実行環境
OSX Yosemite 10.10.3
scala-version 2.11.7
sbt-version 0.13.8
Java 7

## 前提条件
scalaが入っている
sbtが入っている
jdkが入っている

## いろいろインストール
### Conscript
giter8というものをのちにインストールするが，それがこれに依存しているため，まずこのConscriptをインストールする．
ちなみにこれから書くことは全部GitHubの[n8han/conscript](https://github.com/n8han/conscript)の```README```に書いてある．

Macの場合

```
curl https://raw.githubusercontent.com/n8han/conscript/master/setup.sh | sh
```

を実行すれば大丈夫

たぶん```~/bin/cs```ができているはず．

### giter8
インストールの前にpathが通ってるか確認．
通ってなければ必ず通すこと

通っていたら(通したら)

```
cs n8han/giter8
```

とりあえずこれで前準備終わりかな

## Scalatraプロジェクトを作ってみる．
ここからは[sgykfjsm.github.com](http://sgykfjsm.github.io/blog/2013/02/22/scalatra-tutorial-001/)にお世話になった．
自分のをみるより，こちらの方のを参考にした方がいいかも．．

### Build

プロジェクトをつくりたいところで

~~```g8 scalatra/scalatra-sbt```を実行~~
```sbt new scalatra/scalatra-sbt.g8```を実行

結構時間がかかるかもしれないけど気長に．．
最後に

```
organization [com.example]:
name [My Scalatra Web App]: 
version [0.1.0-SNAPSHOT]:
servlet_name [MyScalatraServlet]:
package [com.example.app]:
scala_version [2.11.6]:
sbt_version [0.13.8]:
scalatra_version [2.4.0-RC2-2]:
```

と1行ずつ質問されるはずなので，適宜答えていけばいいと思う．
空行のまま```enter```を押しても[]の中身になるだけ

#### できあがったプロジェクト
こんな感じの構成

```
[scalatra] ls                                        8:45:14  ☁  master ☂ ✖ ⚡ ✭
README.md project   sbt       src
```

[scalatra]は自分が勝手に設定したもの

自動的に`README.md`までつくってくれてた

```README.md
## Build & Run ##

```sh
$ cd Scalatra
$ ./sbt
> container:start
> browse
``

If `browse` doesn't launch your browser, manually open [http://localhost:8080/](http://localhost:8080/) in your browser.
```

###Run
できてたREADMEに従ってやってみた．

Buildしたプロジェクト配下で```sbt```
その後
```container:start```
と入力

待ったけど```>```がでてこないで，[http://localhost:8080/](http://localhost:8080/)をブラウザに入力

Hello, world

と画面にでればOK

## 付録
sbtでつくったプロジェクトをIntelliJで開発するには```/project/plugins.sbt```に以下を記述

```scala:plugins.sbt
//これはIntelliJ用
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")

//いや，やっぱEclipseだよなーって人用
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")
```

上の方を書いたなら```sbt gen-idea```
下の方を書いたなら```sbt eclipse```
を実行すれば，好みのIDEで開発できる．