OmniAICreator/Qiita-1.07M huggingface dataset:
background-sizeがiOS7だけおかしいとき

background-sizeを使っている場所でiOS7のみ効いていないのは、backgroundのショートハンドがCSS3仕様対応したためです。
background-sizeプロパティを先に書いて、backgroudプロパティを後に書いているときなどに起こります。

参考：https://w3g.jp/blog/studies/css3_background_shorthand
missing braces around initializer

gccで以下のソースをコンパイルすると、

```c:prog1.c
int a3[][5] = {
    0,1,2,3,4,   // ★1
    5,6,7,8,9
};
```
prog1.c:★1の行:5: warning: missing braces around initializer (初期値の並びに括弧が足りません）
というワーニングが出る。２次元配列を初期化するときは、

```c:prog2.c
int a3[][5] = {
    {0,1,2,3,4},
    {5,6,7,8,9}
};
```

初期値の並びも２次元にする必要がある。３次元以上も同様。

ESCR Ver2.0 改訂版 組込みソフトウェア開発向け コーディング作法ガイド [C言語版] M2.1.1 にも「配列や構造体を0 以外で初期化する場合は、構造を示し、それに合わせるために波括弧 "{ }" を使用しなければならない。また、すべて0 以外の場合を除き、データは漏れなく記述する。」というルールが定められている。

***

話しはここから始まる。なお、これ以降のソースはすべてワーニングを除去してある。

int 5個の配列が入った構造体をtypedefしてみる。それを使った配列を初期化してみよう。

```c:prog3.c
typedef struct { int array[5]; } INT5;

int a3[][5] = {
    {0,1,2,3,4},
    {5,6,7,8,9}
};
INT5 b3[] = {
    {{0,1,2,3,4}},   // ★2
    {{5,6,7,8,9}}
};
```

このように最終的には同じデータの並びになるものでも、
typedef struct {} したのでもう一段括弧が必要になる。
★2の行だと、 構造体の左括弧、配列の左括弧、整数５つ、配列の右括弧、構造体の右括弧
である。
さらに、２次元配列を繰り返して、３次元配列にしてみよう。

```c:prog4.c
typedef struct { int array[5]; } INT5;

int a4[][2][5] = {
    {{0,1,2,3,4},{5,6,7,8,9}},
    {{10,11,12,13,14},{15,16,17,18,19}}
};
INT5 b4[][2] = {
    {{{0,1,2,3,4}},{{5,6,7,8,9}}},    // ★3
    {{{0,1,2,3,4}},{{5,6,7,8,9}}}
};
```

配列の次元があがったので、a4もb4も、もう一段括弧が必要になる。
★3の行だと、配列の左、
構造体の左、配列の左、整数５つ、配列の右、構造体の右、
構造体の左、配列の左、整数５つ、配列の右、構造体の右、
配列の右
となっていて、構造体が繰り返されていることがわかる。
typedef struct { }をもう一段増やしてみよう。上で定義したINT5が２つ入った構造体、INT10を定義する。

```c:prog5.c
typedef struct { INT5 array[2]; } INT10;

int a4[][2][5] = {
    {{0,1,2,3,4},{5,6,7,8,9}},
    {{10,11,12,13,14},{15,16,17,18,19}}
};

INT10 c4[] = {
    {{{{0,1,2,3,4}},{{5,6,7,8,9}}}},
    {{{{10,11,12,13,14}},{{15,16,17,18,19}}}},
};
```

構造体の分だけ、括弧がもう一段必要になった。
typedefを入れ子にしないで、２次元配列をtypedefしてみる。

```c:prog6.c
typedef struct { int array[2][5]; } INTW;

int a4[][2][5] = {
    {{0,1,2,3,4},{5,6,7,8,9}},
    {{10,11,12,13,14},{15,16,17,18,19}}
};

INTW d4[] = {
    {{{0,1,2,3,4},{5,6,7,8,9}}},
    {{{10,11,12,13,14},{15,16,17,18,19}}}
};
```

構造体１つのtypedefであれば、括弧は一段深くなるでＯＫ。
確認のため、上記で出てきた配列のsizeofを求めてみた。intは4バイトなので、intが何個入っているかわかる。

```
sizeof(a3)= 40
sizeof(b3)= 40
sizeof(b4)= 80
sizeof(c4)= 80
sizeof(d4)= 80
```

おまけ
基本型の繰り返しであって構造体を使わないでも多次元配列が作れるような場合は、

```c:prog7.c
typedef int INTA5[5];
INTA5 e5 = {1,2,3,4,5};
INTA5 e6[] = {
    {0,1,2,3,4},
    {5,6,7,8,9}
}; 

typedef int INTA25[2][5];
INTA25 f5 = {
    {0,1,2,3,4},{5,6,7,8,9}
};
INTA25 f6[] = {
    {{0,1,2,3,4},{5,6,7,8,9}},
    {{10,11,12,13,14},{15,16,17,18,19}}
};
```

このようにtypedefして初期化することもできる。
これならtypedefしないときの初期化と同じデータの並びにできる。
e6とf5は同じデータの並びにでき、
a4とf6は同じデータの並びにできる。
なお、配列のサイズより、初期値の数が多かったら、

```c:prog8.c
int a2[5] = {
    0,1,2,3,4,5  //★4
};
```

prog8.c:★4の行:1: warning: excess elements in array initializer [enabled by default]
というワーニングになる。
[Ruby]重複している値の扱い方

あるコンテンツの自動投稿機能の実装にするにあたり、indexに各日付に紐づけられているコンテンツの数を表示したいと思い、index・controller周りをいじっていました。
つまり、重複している日付をユニークにして、indexに表示したいと思いや、重複している値の扱い方を調べてみました。

まず、以下のデータがあったとします。
```hoge = [1, 2, 2, 3, 3, 4, 5, 6, 5, 4]
```
重複部分を取り除いた値を求めるのは以下の通りです。
 
```ruby:hoge
hoge = [1, 2, 2, 3, 3, 4, 5, 6, 5, 4]
hoge.uniq
=> [1, 2, 3, 4, 5, 6]
 ```

重複している値を取り出したいときは、以下の通りです。

```ruby:hoge
hoge.group_by{|i| i}.reject{|k,v| v.size == 1}.keys
```

やっていることとしては、
hogeの値の配列をまず、```group_by{|i|i}```をつかって、ハッシュ化します。
するとhogeはこのようになります。

```ruby:hoge
hoge.group_by{|i| i}
=> {1=>[1], 2=>[2, 2], 3=>[3, 3], 4=>[4, 4], 5=>[5, 5], 6=>[6]}
```

そして、それに```reject{|k,v| v.size == 1}```を行いvalueの値が1つのものは排除します。
するとこんな感じ。

```ruby:hoge
hoge.group_by{|i| i}.reject{|k,v| v.size == 1}
=> {2=>[2, 2], 3=>[3, 3], 4=>[4, 4], 5=>[5, 5]}
```

最後に```keys```メソッドを行い値を取り出します。
すると結果、見事に重複している値のみを取り出すことに成功しました。

```ruby:hoge
hoge.group_by{|i| i}.reject{|k,v| v.size == 1}.keys
=> [2, 3, 4, 5]
```
rbenvを再インストールしてRubyのバージョンを上げた（CentOS）

VagrantのCentOSですでに使用していたruby2.0からのruby2.1.2へバージョンを上げました。

ただ、この記事の手順は良くなったかもです。理由は最後にでも

# インストール可能なRubyのバージョンを確認
まずはインストールできるrbenvとrubyのバージョンを確認しました。

```bash:rbenvのバージョンを確認する
rbenv --version
rbenv 0.4.0-74-g95a039a
```
インストール可能なRubyのバージョンを確認します。

```bash:インストールできるrubyのバージョンを確認する
rbenv install -l
略
 2.1.0-dev
 2.1.0-preview1
 jruby-1.5.6
略
```

ruby2.1.2がありません。ruby2.1.2を入れたいのでrbenvを削除して再インストールします。

# rbenvを削除する

/.rbenv以下を削除します。

```bash:~/.rbenvを削除する
 rm -rf ~/.rbenv
```

# rbenvをcloneする
rbenvをgit cloneします。

```bash:rbenvをclone
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

rbenvのバージョンを確認します。

```bash:rbenvのバージョンを確認する
rbenv --version
rbenv 0.4.0-98-g13a474c
```

ruby-buildが必要らしいので入れます。

```bash:ruby-buildをclone
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

インストールできるrubyのバージョンを確認します。

```bash:インストールできるrubyのバージョンを確認する
rbenv install -l
略
 2.1.1
 2.1.2
 2.2.0-dev
 jruby-1.5.6
略
```
ruby2.1.2が追加されています。 

# バージョンを指定してRubyをインストールする
ruby2.1.2をインストールします。

```bash:バージョン指定してRubyをインストール
rbenv install -v 2.1.2
```

versionを確認します。

```bash:rbenvがRubyのどのバージョンを使用しているか確認
rbenv versions
rbenv: version `2.0.0-p247' is not installed
  system
  2.1.2
```
2.0.0-p247がインストールされていないと書いてあります。これは以前に入れていたrbenvの指定が2.0.0-p247になったまま残っているからです。

```bash:~/.ruby-versionを書き換える
vi ~/.ruby-version
2.1.2
```
のように~/.ruby-versionを編集して2.0.0-p247から2.1.2に変えました。

rehashします。

```bash:rbenvをrehash
rbenv rehash
```

rbenvのversionを確認します。

```bash:rbenvがRubyのどのバージョンを使用しているか確認
rbenv versions
  system
* 2.1.2 (set by /home/vagrant/.ruby-version)
```

Rubyが.rbenvディレクトリを指していれば大丈夫です。

```bash:rubyの参照先を確認
which ruby
~/.rbenv/shims/ruby
```

## おまけ
`~/.ruby-version`に書くとglobal設定になるみたいなので、ローカルのディレクトリのRubyのバージョンを指定したい場合は、ローカル指定を書きます。

```
rbenv local -v 2.1.3
```
こんなかんじ

# Rubyのバージョンを確認
Rubyのversionを確認します。

```bash:Rubyのバージョンを確認
ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
```
目的どおりruby2.1.2になりました☆（ゝω・）vｷｬﾋﾟ

# rbenvを削除する手順がおかしかったかも
rbenvを削除してgit cloneしたのですが、そもそもrbenvがgitで管理されているので、git pullすれば再インストールしなくても良かったみたいです(^o^;)

どうやらruby-build を更新するだけでRubyのバージョンが増えるそうです。

## rbenv-updateを使うともっと簡単
@riocampos さんからコメントをいただいた、rbenv-updateを使用してRubyのバージョンを上げる手順は、[rbenv-updateを使ってRubyのバージョンを上げたついでにRailsをインストールした（CentOS）](http://qiita.com/pugiemonn/items/f277440ec260b8d4fa6a)に記事を投稿しました。
[状態マシン図] 登山用LEDヘッドランプ

#登山用LEDヘッドランプ

先週末、燕岳～大天井岳～常念岳縦走してきた。そのときに持って行った登山用LEDヘッドランプがこれ。

![revolt.jpg](https://qiita-image-store.s3.amazonaws.com/0/11188/fdbe2cd9-1d7d-6bdb-586f-bc7d40e6c345.jpeg)

本体内に充電池を内蔵していて、USBミニプラグ経由で充電できる。とても明るく、遠くまでよく光が届くので、夜間の移動に使える。

取扱説明書から操作方法を読み取るのが難しいので、これの状態マシン図を描いてみた。

入力はボタンが１つのみ。

出力は白色LEDが３つ、赤色LEDが２つ、電池残量表示用の多色LEDが写真右側面に１つある。残量が多いほうから緑色、オレンジ色、赤色と変化する。

白色を循環する遷移と、赤色を循環する遷移がある。
どちらの色でも点灯、点滅するときは、２秒ほど電池残量表示が側面の多色LEDに表示され、消える。

#状態マシン図

![revolt2.png](https://qiita-image-store.s3.amazonaws.com/0/11188/fbabbe9e-8b66-f73b-b9be-327d2121bf8a.png)

選択疑似状態を起点とする遷移に設定されているアクションは、ガード条件を判定したあとに実行される。

#製品として大切なことは

```
・ボタンが押されてそのモードに入ったことが、何らかの方法でユーザーに分かるようになっている
・どの状態からどの状態へもステップを踏めば必ず遷移できる
・たとえ、今の状態がわからなくても、最終的には自分が行きたい状態に行ける
```

これらを満たして状態マシン設計する必要がある。

実は、製品はボタンを押している間にも次々に表示が変わるので、この状態マシン図は製品と完全に一致していない。正確に表現するには、押すことと離すこと を別イベントとして処理し、押され続けた時間の長さによって分岐する必要がある。が、分析モデルとして、マニュアル代わりとしては、これくらいで十分であろう。
Java入門 繰り返し(for文)

Java入門
繰り返し処理 (for文)

同じことを繰り返すのは非常に退屈でつまらないものです。しかも単純作業は間違えやすい。
そこで、Javaには繰り返し処理としてfor文が存在します。

```java:sample.java
public class Sample {
	public static void main (String[] args) {
		int i;
		String message = "世界一かわいいよ！";

		for (i = 0; i < 5; i++) {
			System.out.println (message);
		}
	}

}

```

これを実行してみると

```lang:sample.java
世界一かわいいよ！
世界一かわいいよ！
世界一かわいいよ！
世界一かわいいよ！
世界一かわいいよ！
```

messageに格納されていた「世界一かわいいよ！」が５回出力されました。

繰り返しに使用したfor文を詳しく見ていきます。

```java:sample.java
// for文で使用する変数iを宣言します。
int i;
String message = "世界一かわいいよ！";

// 5回繰り返して出力する。
for (i = 0; i < 5; i++) {
     System.out.println (message);
}
```

for文の中のi = 0はiを0で初期化しています。
i < 5は繰り返す回数です。これはiが5になるまで繰り返すという意味です。
i++でfor文に入るたびにiが１ずつ増えていきます。iが5になるとfor文の条件を抜けるので、実行しなくなります。


今回、for文で使用する変数iは外に宣言しましたが

```java:sample.java
for (int i = 0; i < 5; i++)
```

上記のようにfor文の中に宣言することも可能です。JavaであったりC++はこのように書く人が多いのかな。
MagicalRecord+XCTestでテストを行う上での環境づくりの最適解は？【模索中】


MagicalRecordいいですね。
[Mogenerator + MagicalRecordでCoreData入門](http://qiita.com/key/items/35569f334528e225531e)を参考に試している最中です。

ですがXCTestを使う上でハマったことがあり、最適な手段を模索中です。
もっといい方法があればご教示ください。

##問題点

XCTestでModelのテストをする場合
以下のように```setup```,```tearDown```を記述しメモリ上でCoreDataを使うように設定すると思います。[参考:unit-testing-with-core-data](http://www.cimgf.com/2012/05/15/unit-testing-with-core-data/)


```objective-c:SampleTests.m
@interface SampleTests : XCTestCase

@end

@implementation SampleTests

- (void)setUp
{
    [super setUp];
    [MagicalRecord setupCoreDataStackWithInMemoryStore];
}

- (void)tearDown
{
    [MagicalRecord cleanUp];
    [super tearDown];
}

//省略
```

問題はアプリ部分であるAppDelegateにもMagicalRecordの初期化が記述されるということ。

```objective-c:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [MagicalRecord setupAutoMigratingCoreDataStack];
    return YES;
}


- (void)applicationWillTerminate:(UIApplication *)application
{
    [MagicalRecord cleanUp];
}
```

で、Testを実行するとAppDelegateの中も実行されるので、
```     [MagicalRecord setupAutoMigratingCoreDataStack];```も実行されてしまい、CoreDataはファイルを使う設定にされてしまうようです。
で、テストが失敗するようになります。

##対応策
テストを実行中は```application:didFinishLaunchingWithOptions:```等は何もしないようにしてしまいます。
更に、コード上でStoryBoardを読むようにして、テスト中はStoryBoardも見に行かないようにします(initialViewcontrollerがCoreDataにアクセスしている場合を考慮)

プロジェクト設定の```General```->```Deployment Info```->```Main Interface```の中身を空欄にしておきます

```objective-c:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    BOOL inTests = (NSClassFromString(@"XCTest") != nil);
    if (inTests) {
        return YES;
    }
    
    [MagicalRecord setupAutoMigratingCoreDataStack];
    
    //codeによるStoryBoard読み込みと表示
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    UIViewController *initialViewController = [storyboard instantiateInitialViewController];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = initialViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

//省略

- (void)applicationWillTerminate:(UIApplication *)application
{
    BOOL inTests = (NSClassFromString(@"XCTest") != nil);
    if (inTests) {
        return;
    }

    [MagicalRecord cleanUp];
}
```

[Sampleをgithubにあげてみました。](https://github.com/m0a/MagicalRecordTesting)
Java入門 配列

Java入門
配列

C言語と同様に、Javaでも配列は存在します。
しかし、宣言の方法がC言語とは異なるようです。

**C言語**

```c:sample.c
int a[] = {0, 1, 2, 3};
```
**Java**　

```Java:sample.java
int[] a = {0, 1, 2, 3};
```
　
C言語では変数名の後ろに[　]を記述して、配列を宣言しますが
Javaでは型名の後ろに[ ]を記述して宣言を行います。

```java:sample.java
int[] b;
b[0] = 0;
b[1] = 1;

```
宣言後は、上記のように使用することが可能です。ここはC言語と同じですね。


多次元配列も型名の後ろに[ ]を記述して宣言を行います。

```java:sample.java
int [][] score = new int [2][3];
score[0][0] = 10;
score[0][1] = 20;
score[0][2] = 30;
score[1][0] = 40;
score[1][1] = 50;
score[1][2] = 60;
```
Pecoで(ちょっと)汎用ディレクトリ選択function(zsh専用)


Pecoが流行っているので使ってみたらよい感じだったので開始してみました。
現状、多くのスニペットが特定のコマンド専用っぽい感じだったので、変化球を。

```bash:~/.zshrc
function peco-dfind() {
    local current_buffer=$BUFFER
    # .git系など不可視フォルダは除外
    local selected_dir="$(find . -maxdepth 5 -type d ! -path "*/.*"| peco)"
    if [ -d "$selected_dir" ]; then
        BUFFER="${current_buffer} \"${selected_dir}\""
        CURSOR=$#BUFFER
        # ↓決定時にそのまま実行するなら
        #zle accept-line
    fi
    zle clear-screen
}
zle -N peco-dfind
bindkey '^x^f' peco-dfind
```

上記コマンドを.zshrcに入れておくことで、```cd```まで打ったあと、```^x^f```を打つことで5階層下までのディレクトリ一覧を表示してpecoに渡します。あとは、絞り込みをして決定。 cdだけでなく、findやlsなど、どのコマンドにも適用可能です。

## 更新
なにも入力がない状態で、```^d```を受け取るとzshがログアウトを実行してしまうため、もともと```^x^d```としていたショートカットを```^x^f```に更新しました。
Qiita投稿フリークに贈る、Kobitoのデータを複数Macで同期する方法


Qiitaの投稿楽しいですよね。知識の整理になるし、公開するときに改めて調べなおしたりして、より深い知識がついたりするし。ストックしてくれたり、コメントで指摘してくれたり。そんなQiita投稿を支える最強アプリKobitoさん。これがあるから継続できる的な所あります。だけど1つだけ問題があるんです。

会社のMacで書いた下書きが、自宅のMacでは編集できない！

そう。複数のMac端末ではKobitoの非公開ドキュメントは同期されないのです。いつでもどこでもQiitaに投稿したい！っていう欲望に勝てず、今回どうにか同期できないか試してみました。

# 大前提

めっちゃ非公式なやり方であり、かつ微妙な方法でもあるので用法用量を守って的なというより自己責任でお願いします。

- 検証Kobitoバージョン : 1.9.2
- 実行前には、Kobitoを終了させておく

# Dropboxでデータ同期する

簡単です。Dropboxっていう強い味方がいるので、そこにデータを置いてKobitoから参照させればいいんです。

## Kobitoのデータ場所

KobitoのデータはSQLiteで管理されています。場所は

- /Users/ユーザ名/Library/Kobito

ここです。この中に4つのファイルがあります。

- Kobito.db
- Kobito.db-shm
- Kobito.db-wal
- Kobito.db.1.9.2.bak

## KobitoのデータをDropboxへ

DropboxにKobitoディレクトリを作って、SQLiteのファイルたちを移動させます。そして、元々あったライブラリにシンボリックリンクをはるだけです。

```
$ cd ~/Dropbox
$ pwd
/Users/ユーザ名/Dropbox

$ mkdir Kobito
$ cd Kobito

$ mv ~/Library/Kobito/* ./
$ cd ~/Library/Kobito/

$ ln -s ~/Dropbox/Kobito/Kobito.db Kobito.db
$ ln -s ~/Dropbox/Kobito/Kobito.db-shm Kobito.db-shm
$ ln -s ~/Dropbox/Kobito/Kobito.db-wal Kobito.db-wal
$ ln -s ~/Dropbox/Kobito/Kobito.db.1.9.2.bak Kobito.db.1.9.2.bak
```

この作業を、他のMacでも行えばDropbox経由でデータが同期されるはずです。問題は、オフライン時に差分が生じた時、上書き合戦になるであろう…という。まぁ、運用を間違えなければ、とりあえず大丈夫でしょう。おそらく。

というわけで、楽しいQiita投稿生活を。
Java入門 乱数の取得

Java入門
乱数の取得

仕様関数：
new java.util.Random().nextInt()

例：

```Java:Sample.c

public class Sample {
　public static void main (String[] arg) {
　　// 0~89の乱数を取得
　　int a = new java.util.Random().nextInt(90);

　　System.out.println (a);
　}
}
```
ActionMailerでメールを送る際、必ずBCCを送る

`config/environment/production.rb`に以下を追加すると、ActionMailerで送るメールは必ず指定したメールアドレスにBCCが送られるようになる。
※ あらかじめActionMailerの設定をしてあることが前提。

``` ruby:/config/environment/production.rb
config.action_mailer.default_options = {
  bcc: 'hoge@fuga.com'
}

```

#### 【関連】
 RailsのActionMailerでメールを送信する（Gmail経由）
http://qiita.com/ytr_i/items/0907ee3312ed9d79c9e8
AFHTTPSessionManagerとNSURLSessionの関係整理

##背景
通信に関する処理の実装をやったことがない自分。
iOS開発においては`AFNetworking`がデファクトスタンダードだと知る。
いざフレームワークを導入してみるものの、用途に適した使い方、勘所がつかめない。
順を追って知識を整理する必要性を感じ、下記の流れで整理した。

1. URLローディングシステムの整理
1. NSURLSessionを中心としたクラス図を描いてみた
1. クラス図を俯瞰しながらのまとめ

##URLローディングシステムの整理
AFNetworking2.0系では、NSURLSessionの利用を勧めていた。ならばということで
クラスリファレンスを見ていると、まずはURLローディングシステムを学ぶべしというような記述があった。
>Important: The NSURLSession API involves many different classes working together in a fairly complex way that may not be obvious if you read the reference documentation by itself. Before using this API, you should read URL Loading System Programming Guide to gain a conceptual understanding of how these classes interact with one another.

プログラミングガイドは[こちら](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html#//apple_ref/doc/uid/10000165i)。下記に要点をメモする。

* URLローディングシステムでは、メインとなるURLローディングクラス（群）と５つのヘルパークラスに分類される
![URLローディングシステム](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Art/nsobject_hierarchy_2x.png)

* `NSURLSession`はiOS7以降で開発を進めるなら利用が推奨されるAPI
* 旧バージョンを対象とするなら、
	* コンテンツをディスク上のファイルにダウンロードしたい場合は`NSURLDownload`を使う
	* コンテンツをメモリ上にダウンロードしたい場合は`NSURLConnection`を使う
* シンプルなリクエストなら、`NSURLSession`を使って`NSURL`から直接取得する
* データアップロードなどのより複雑なリクエストなら、`NSURLRequest`や`NSMutableURLRequest`を`NSURLSession`や`NSConnection`に渡す
* URLローディングシステムはメタデータを提供するために、２つのヘルパークラスを使う。

|クラス|クラスの位置づけ|
|---|---|
|NSRequest|URLやプロトコル固有のプロパティを隠蔽する|
|NSResponse|コンテンツのメタデータ(MIME TYPEなど）とコンテンツ自身を隠蔽する|

* プログラミングガイドには、その他に「リダイレクト」、「認証と証明書」、「キャッシュ管理」、「クッキー」、「サポートするプロトコル」に関する記述がある。

##NSURLSessionを中心としたクラス図
まずは[NSURLSession のまとめ](http://qiita.com/aKentaKoyama/items/96a979ab3a140e7b39ec)を参照させていただき、NSURLSessionの特徴を知りました。
さらに[クラスリファレンス](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html)を参照し、その内容から簡単なクラス図を作成した。
![NSURLSessionを中心としたクラス図](http://yuml.me/f95e50f8)
クラス図作成のルールは、できるだけ[こちら](http://yuml.me/diagram/class/samples)に基づいたが自信はない。


##クラス図を俯瞰しながらのまとめ
`AFNetworking`では、まずは`AFHTTPSessionManager`を使うことになりそうなのでそれをふまえる。

* `NSURLSession`にはきめ細かいデリゲートメソッドがあり、その実装を`AFURLSessionManager`が実装している
* 僕はそのサブクラスである`AFHTTPSessionManager`に対してプロパティである`NSURLSession`オブジェクトを介して`NSURL`や`NSURLReqest`、`NSResponse`を提供し、`NSURLSessionTask`の具体クラスを取得して、
目的のコンテンツを取得する
* 取得したコンテンツに対して行いたい処理を、Blocksとして実装して`AFHTTPSessionManager`に設定する
* TODO:ここまでで一旦メモを終えるが、必要に応じて第２弾を作る
excel vbaで ldap検索

多分、次のような感じ。
ただ、手元に試せるldapがないので、動かしていません。

```vbnet:search_ldap.vb
Private Sub SearchLDAP(ByVal Row As Integer, ByVal Column As Integer)
    
    Dim ret As String, ret2 As String
    Dim UID As String
    Dim strLDAP As String
    Dim oLDAP As Object
    
    On Error Resume Next
    While Cells(Row, StartCol).Value <> ""
      If Cells(Row, Column + NameOffset).Value = "" Then
        UID = Cells(Row, Column).Value
        If UID <> "" Then
            strLDAP = "LDAP://ldap.xxx.yyy.co.jp/uid=" & _
                      UID & ",ou=people,o=xxx-group"
            Set oLDAP = GetObject(strLDAP)
            'set oLDAP.ld_sizeLimit = 100
    
            Cells(Row, Column + 1).Value = oLDAP.GET("mail")
            Cells(Row, Column + 2).Value = oLDAP.GET("cn")
            Cells(Row, Column + 3).Value = oLDAP.GET("o") &" "& oLDAP.GET("ou")
        End If
      End If
        Row = Row + 1
    Wend

End Sub
```

たまに、visual basic に触れたくなるんですよね
read hoge; echo $hoge | wc -cだと改行文字も含まれるので注意

ちょっとハマった。

```diff:
 FLAG=0
 while [ $FLAG = 0 ]; do
    echo -n "Input 8 strings (example: 12345678): "
    read strEight
-   STR_LEN=$(echo $strEight | wc -c)
+   STR_LEN=$(echo -n $strEight | wc -c)
    if [ $STR_LEN -eq 8 ];then
       FLAG=1
    else
       echo "input length wrong, retry."
    fi
 done
```
bootstrap3で横並びのボックスを実現する方法

bootstrap3にて、横並びのボックスを実現する方法です。

## checkboxの場合

labelにcheckbox-inlineを付けます。

```html
<form class="form-horizontal">
    <div class="form-group">
        <label class="control-label col-xs-3">チェックリスト</label>
        <div class="col-xs-9">
            <label class="checkbox-inline">
                <input type="checkbox" name="">オプション１
            </label>
　　　　　　　<label class="checkbox-inline">
                <input type="checkbox" name="">オプション２
            </label>
        </div>
    </div>
</form>
```

## radioボタンの場合

labelにradio-inlineクラスを付けます。

```html
<form class="form-horizontal">
    <div class="form-group">
        <label class="control-label col-xs-3">チェックリスト</label>
        <div class="col-xs-9">
            <label class="radio-inline">
                <input type="radio" name="examplecheck">オプション１
            </label>
　　　　　　　<label class="radio-inline">
                <input type="radio" name="examplecheck">オプション２
            </label>
        </div>
    </div>
</form>
```

## その他で実現したい場合(例：年月日)

その他で実現したい場合はform-inlineを使います。(もしかしたら他にやり方があるかも)

```html
<form class="form-horizontal">
    <div class="form-group">
        <label class="control-label col-xs-3">年月日</label>
        <div class="col-xs-9 form-inline">
            <input type="text" class="form-control" name="year" size="4"><label>年</label>
            <input type="text" class="form-control" name="month" size="2"><label>月</label>
            <input type="text" class="form-control" name="day" size="2"><label>日</label>
        </div>
    </div>
</form>
```

なお、checkboxとradioボタンに関しては基本的に内容は後に付けなければいけません。どうしても前に付けたい場合にはその他の実現で出来るかと思います。
二つの時刻の差を求める

# 二つの時刻の差を求める

びっくりしたことにphpには二つの時刻の差を求める関数がないみたい。

なのでこうする。

```php:diffTime.php

function diffTime($start,$end) {

  $startSec = strtotime($start);
  $endSec   = strtotime($end);

  $diff = $endSec - $startSec;

  return gmdate('h:i:s',$diff);

}
```
sshで誰かがログインしたらChromeにpush通知する

たまたま似たようなことをやってた人がいるようですが物凄い確率で起こった偶然です。

# ChromeへSSHログインをpush通知


 - ChromeでGCMを使ったPush通知が出来るらしい
 - sshログインを通知したい！
 
っていう発想が出てきたのでそれをまとめてやってみることに…………

調べてみると[idobataに送る](http://qiita.com/futoase/items/3e57b10adbff04290342)ってのがありました。ちなみにこれならログも残るしChromeにも通知できるし既に負けてます！() 

## でもやっぱ面倒
~~ChromeアプリやExtensionでGCMを使おうとするとストア公開(限定公開/非公開含む)が必要らしい。つまりそれって$5払えってことだよね？~~→普通に`chrome.gcm`使って試してみたらストア公開はいらなかった。

Chrome35からGCM辺りがまた変わってたりもするみたいだけどとりあえず今回はコーディングはめんどくさいので既にあるものを借りちゃいます。

これ→https://github.com/GoogleChrome/chrome-app-samples/tree/master/gcm-notifications


公式のサンプルアプリです。
ストアからインストールする。

## APIの方
GCMを使えるようにする。

[Google developer console](https://console.developers.google.com)へいく。まだアプリを作ってない場合は適当に登録してやる。

プロジェクトの画面を開くとプロジェクト番号って数字があるのでメモっとく。これがSenderIDになる。

先程のアプリに入れるところがあるのでコピペしておきますか。これでEnterすると`chrome.gcm.register`されるわけですね。

続いてAPIを利用できるようにします。
Developer consoleの左のAPIと認証→APIからGoogle Cloud Messaging for Androidとfor Chrome、両方有効にする。多分どっちかだけで大丈夫だと思うけど謎が…………


初回は規約へ同意を求められます。

次に認証情報を開いて鯖からのアクセスを許可する

Create new key→サーバーキーの順にクリック。サーバーのIPアドレスを入力してやる。

シンプルな認証ですね。

APIキーが表示される。これが認証情報としてHTTPヘッダの一部になって送られる。

これも先程のアプリに入力欄があるのでコピペ

とりあえずこれだけ入れて下にcurlコマンドが表示されているはずなので、鯖にsshでアクセスしてコピペしてやる。ここまでの手順に問題がなければidが返され、デスクトップに通知が出現するはず。

ただしipv6の使える鯖でやるとそちらが優先されることがある(と言うか多分優先される)。ipv4だけしか登録してなかったら当然のごとく401が返ってくる。(それもhtmlで)。ipv6アドレスをGoogleに登録しおけばそれでいいのだが、ConoHaのような大量にipv6があるような場合、そもそもどのipアドレスが利用されるかもわからない。（わかるの？)

面倒なので`-4`をつけてipv4を強制させたところ無事pushに成功した。(ここだけでしばらく悩んだ)

## sshログインを通知

sshrcをつくってやり、とりあえずsshログインを通知させた。

```sh:/etc/ssh/sshrc
/etc/ssh/rc.d/google_push.sh
```

```sh:/etc/ssh/rc.d/google_push.sh
curl -H "Content-Type:application/x-www-form-urlencoded;charset=UTF-8" -H "Authorization: key=YOUR_API_KEY" -d "registration_id=クライアント識別id" -d data.[Login]="$(id -nu) $(date +'%Y-%m-%d %H:%M:%S %Z')" https://android.googleapis.com/gcm/send -4 -o /dev/null
```

google_push.shにchmod +xしておく。

強引だけどとりあえずこれでChrome使ってるときにログイン通知は受け取れるようになった。

…………やっぱり実装しなおさないと…………
rbenvを用いたRubyとRailsのインストール方法


## rbenvって何？
複数バージョンのRubyを切り替えるだけでなく、ローカルディレクトリ毎にRubyのバージョンを指定出来るシステム


## 参考URL
[CentOS6にrbenvをRailsをインストールする方法](http://konyu.hatenablog.com/entry/2014/02/08/213614)
[rubyのversion upをした時の作業内容メモ](http://shiro-16.hatenablog.com/entry/2014/07/01/003435)
[rbenv を利用した Ruby 環境の構築](http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)


### rbenbの取得
* rbenbをgithubからcloneする。

```text:cmd
$ cd
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```
### bashの設定変更
* .bash_profileに以下の追記をして設定を反映させる。

```text:cmd
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

```text:bashの再読み込み
$ source ~/.bash_profile
```
### ruby-buildの取得
* ruby-buildをgithubよりcloneする。

```text:cmd
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```
### Rubyをインストールする
* インストール可能なrubyのVersionを調べる

```text:cmd
$ rbenv install --list
```
```text:実行結果
Available versions:

  …

  2.1.0
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.1.1
  2.1.2
  2.2.0-dev

  …
```
どうやらインストール出来る最新のverは2.1.2らしい。(2014/8現在)
特に問題は無いので最新版をインストールする。

### CRuby2.1.2をインストール
* CRuby≠JRuby

```text:cmd
$ rbenv install -v 2.1.2
```
* デフォルトでRuby2.1に設定

```text:cmd
$ rbenv global 2.1.2
```
* rubyのインストールを確認

```text:cmd
ruby -v
```
```text:実行結果
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
```
### gemの最適化
* rbenv-rehashを入れてgemの入れ替えに対してrehashを自動実行するようにする
  
```text:cmd  
$ gem install rbenv-rehash
```
* gemのアップデート

```text:cmd  
$ gem update --system
```
* bundlerインストール(インストール済の場合はアップデートのみで良い

```text:cmd  
$ gem install bundler
$ gem update bundler
```



### rails4系をインストールする
* 取得できるRailsのバージョンを確認する

```text:cmd
$ gem list rails --remote
```
* Railsをインストールする

```text:cmd
$ gem install --no-ri --no-rdoc rails
```
* インストールを確認 

```text:cmd
$ rails -v
```
```text:実行結果
Rails 4.1.5
```
### Vagrant、Virtual boxにRailsをインストールする場合
gemからrailsをインストールしようとするときにアホほど遅い場合は、 /etc/resolv.conf に書きを追加し保存する

```text:/etc/resolv.conf
+ options single-request-reopen
```
sshでLinuxマシンにログインしたらSlackで通知する


誰かがログインしたときにお知らせをしたいことってありますよね。
最近Slackを使いはじめていい感じの僕はやっぱりsshでログインされたらSlackで通知させたいわけですよ。

ということで、sshでログインした瞬間にSlackへ通知する方法を書いていきます。



# webhookの作成
Slack側でAdd New Integrationで新しいIntegrationを作成します。
![kobito.1407259278.801756.png](https://qiita-image-store.s3.amazonaws.com/0/2095/4a71ccb7-05b2-92fc-15ca-41c883283e8e.png "kobito.1407259278.801756.png")

Add New Integrationをおしたら、Incomming WebHooksをクリックしましょう。
![kobito.1407259340.936689.png](https://qiita-image-store.s3.amazonaws.com/0/2095/6b753264-c4c4-c6bb-7c9e-248f2ceab91b.png "kobito.1407259340.936689.png")


押すとURLが発行されるので`token=`でかかれたtokenをこの次に書く`トークン`の部分に記載してください。
![スクリーンショット 2014-08-06 2.png](https://qiita-image-store.s3.amazonaws.com/0/2095/7d98a168-88bf-646f-1f26-829b7b6a460d.png "スクリーンショット 2014-08-06 2.png")



# sshrcを作成する
`/etc/ssh/sshrc`ファイルを作成します


``` /etc/ssh/sshrc
<<<<<<< HEAD
$ sudo vim /etc/ssh/sshrc
=======

>>>>>>> YOUR_EDITION
/etc/nodejs/sshlogin.js $USER $SSH_CLIENT
aaaa

```

## 実行するスクリプトの作成する
まずはディレクトリを作成します。

```
$ sudo mkdir /etc/nodejs/
$ sudo npm init
```

つぎに必要なライブラリを準備します。
今回はnode-slackrを利用します。

```
$ sudo npm install --save node-slackr
```

あとはスクリプトを書くだけ

``` /etc/nodejs/sshlogin.js
var Slack = require("node-slackr");
var slack = new Slack("サブドメイン","トークン",{
  channel: "#alert",
  username: "ウォッチサーバよりお知らせします",
  icon_url: "http://imgak.1mobile.com/group2/M00/26/E7/S36rZFMoT-mAeyE9AAL2y4L9Xm8291.png"
});

slack.notify(process.argv[2]+"がログインしたよ! IPアドレス:"+process.argv[3],function(err, result){
  console.log(err, result);
});
```

##  実際に動いているか確認してみる
![スクリーンショット 2014-08-06 222.png](https://qiita-image-store.s3.amazonaws.com/0/2095/2ec55128-b924-dad0-db54-fd55978f1809.png "スクリーンショット 2014-08-06 222.png")

こんな感じにSlackに表示されました。
これで不正アクセスがあってもすぐにわかってしまいますね！
swiftのAVPlayerでbackgroud再生

```swift
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)
```
上記のコードをplay()する前に設置。

あとはinfo.plistに
![スクリーンショット 2014-08-06 1.59.36.png](https://qiita-image-store.s3.amazonaws.com/0/7186/e426d228-7301-290e-4364-d3bda7a8d0b7.png)
Key:Required background modes
Value:App plays audio or streams audio/video using AirPlay
として保存すれば、バックグラウンドの実現が可能。

参考：http://stackoverflow.com/questions/24393495/playing-a-sound-with-avaudioplayer-swift
iOS用Staticライブラリのビルドおよびインストール方法


##概要
  Xcodeを使用したiOS用Staticライブラリのビルドおよびインストール方法について整理します。

##環境
* 作成日: 2014/08/05
* OS: Mac OS X 10.9.4
* Xcode: Xcode6 beta5
* 言語: Objective-c

##参考文献
* [Xcode 5 で iOS 用 static library を作ろう！](http://qiita.com/fizzco/items/8f3fbc744e591ba8dffe) on Qiita

##インストールディレクトリ
  Staticライブラリ、ヘッダファイル、その他のリソースファイルを、下記にインストールします。図中の`PROJECT_NAME`は、ライブラリのプロジェクト名です。

    $(HOME)/local
      include/<PROJECT_NAME> ... ヘッダファイル
      lib/ ... ライブラリ(*.a)ファイル
      resource/ ... xibなどのリソースファイル

##実行/設定手順
###プロジェクトの作成
  File → New → Projectから、Cocoa Touch Static Libraryを選択。

###ライブラリインストール用ターゲットの追加
  インストール用のターゲットを追加します。Target → Other → External Build Systemを選びます。
1. `install.mk`なるMakefileを作成します。 `install.mk`ファイルの内容を文末に添付します。
2. 本ターゲットを、ライブラリのビルドターゲットに依存させます。
3. ターゲット → Info → External Build Tool Configurationの、Argumentsの項を、`-f install.mk`とします。
4. 追加したターゲットでビルドすると、各種ファイルがインストールされます。

###install.mkの概要
1. `build_command`マクロを用いて、プロジェクトをReleaseビルドします、
2. lipoコマンドを使って、iPhoneOS用のライブラリと、シミュレータ用のライブラリをマージします。参考: [lipo を使って簡単に Universal Binary を作成する方法](http://akisute.com/2011/03/lipo-universal-binary.html)
3. [installコマンド](http://kazmax.zpp.jp/cmd/i/install.1.html)を使ってヘッダファイルを目的のディレクトリ`$(HOME)/local/lib/$(PROJECT_NAME)`にコピーします。
4. installコマンドを使って、`*.xib`ファイルを、resourceディレクトリ下にコピーします。

###install.mkファイルの記述内容
	INSTALL_PATH	= $(HOME)/local
	LIB_NAME	= lib${PROJECT_NAME}.a
	CONFIGURATION	= Release

	build_command  = xcodebuild build -target $(PROJECT_NAME) \
		-project $(PROJECT_NAME).xcodeproj \
		-configuration $(CONFIGURATION) \
		ONLY_ACTIVE_ARCH=NO \
		BUILD_DIR=$(BUILD_DIR) \
		BUILD_ROOT=$(BUILD_ROOT)

	all: build_library install_library install_header install_resource

	build_library: dummy
		$(build_command) -sdk iphoneos
		$(build_command) -sdk iphonesimulator

	install_library: dummy
		mkdir -p $(INSTALL_PATH)/lib
		lipo -create -output $(INSTALL_PATH)/lib/$(LIB_NAME) \
		  ${BUILD_DIR}/${CONFIGURATION}-iphoneos/$(LIB_NAME) \
		  ${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/$(LIB_NAME)

	install_header: dummy
		mkdir -p $(INSTALL_PATH)/include/$(PROJECT_NAME)
		install -m 0644 ${BUILD_DIR}/${CONFIGURATION}-iphoneos/include/$(PROJECT_NAME)/*.h \
		  $(INSTALL_PATH)/include/$(PROJECT_NAME)

	install_resource: dummy
		mkdir -p $(INSTALL_PATH)/resource
		find $(PROJECT_DIR) -name "*.xib" -exec install -m 0644 "{}" $(INSTALL_PATH)/resource ";"

	dummy:

##備考
* Swiftを使ったstatic libraryは生成できない様です。すくなくとも、Xcode6 beta4では。
プレビュー機能をつける


どちらかというとこのやり方に納得行ってない感じなので、コメントなどいただけると幸いです…

# やりたいこと

投稿を作成するページ(new.html.erbとか)で、プレビューのボタンがあって、そこを押すと現在の入力されていたものが投稿された場合の表示形式を見たい。

# やったこと
[#38 Multibutton Form - RailsCasts](http://railscasts.com/episodes/38-multibutton-form)と全く同じような対応をした。

```ruby:new.html.erb

<% if params[:preview_button] %>
  <%= textilize @project.description %>
<% end %>
...
<%= submit_tag 'Create' %>
<%= submit_tag 'Preview', :name => 'preview_button' %>

```

```ruby:project_controller.rb

def create
  @project = Project.new(params[:project])
  if params[:preview_button] || !@project.save
    render :action => 'new'
  else
    flash[:notice] = "Successfully created project."
    redirect_to project_path(@project)
  end
end

```

# 参考
- [#38 Multibutton Form - RailsCasts](http://railscasts.com/episodes/38-multibutton-form)

- [Railsで記事のpreviewとか作る時 - Qiita](http://qiita.com/ToQoz/items/f7263068cc0cccc52bc1)
Go言語でシンプルな JSON API サーバー

# 概要
HTTP で JSON を POST すると、JSON で応答を返すシンプルなサーバーを Go言語で作ってみたものです。

日本語文章を POST すると mecab でパースして、結果を返してくれます。

# 関連記事
http://qiita.com/rerofumi/items/2bb1e49b20f2175ecaac

# インターフェース
## リクエスト
HTTP で JSON形式のコマンドを POST します。
`{"Token": "01234", "Sentence": "なにか文章"}`

* Token: future reserve
* Sentence: mecab で解析したい一文(UTF-8)

## リザルト
JSON形式で戻ってきます。
`{"Status":0,"Code":"OK","Result":["A","B","C"]}`

* Status: 0 で成功、それ以外で失敗
* Code: 成功時は OK、それ以外は失敗理由
* Result: 成功時 mecab の解析結果が array で戻る(UTF-8)

# インストール
`go install bitbucket.org/rerofumi/webmecab`
でどぞー

# 実行
install で入れたのならば $GOPATH/bin に webmecab が居るはず。

`usage: webmecab [-p port]`

* p もしくは port でポート指定、無指定時 80

# ソースコード
```mecab-web-api.go
package main

import (
	"bitbucket.org/rerofumi/mecab"
	"fmt"
	"net/http"
	"encoding/json"
	"os"
	"flag"
	"strconv"
	"io"
	"bufio"
)

/* --- JSON define */
type MecabOutput struct {
	Status int
	Code string
	Result []string
}

type MecabInput struct {
	Token string
	Sentence string
}


/* ----------------------- */
/* --- controller          */
/* ----------------------- */
func apiRequest(w http.ResponseWriter, r *http.Request) {
	list := make([]string,0)
	ret := MecabOutput{0,"OK",list}
	request := ""

	// JSON return
	defer func() {
		// result
		outjson,err := json.Marshal(ret)
		if err != nil {
			fmt.Println(err) //TODO: change to log
		}
		w.Header().Set("Content-Type", "application/json")
		fmt.Fprint(w, string(outjson))
	}()

	// type check
	if r.Method != "POST" {
		ret.Status = 1
		ret.Code = "Not POST method"
		return
	}

	// request body
	rb := bufio.NewReader(r.Body)
    for {
        s, err := rb.ReadString('\n')
		request = request + s
        if err == io.EOF { break }
	}

	// JSON parse
	var dec MecabInput
	b := []byte(request)
	err := json.Unmarshal(b, &dec)
	if err != nil {
		ret.Status = 2
		ret.Code = "JSON parse error."
		return
	}

	// mecab parse
	result, err := mecab.Parse(dec.Sentence)
	if err == nil {
		for _, n := range result {
			ret.Result = append(ret.Result, n)
		}
	}

}


/* ----------------------- */
/* --- main                */
/* ----------------------- */
func main() {
	// switch
	var (portNum int)
	flag.IntVar(&portNum, "port", 80, "int flag")
	flag.IntVar(&portNum, "p", 80, "int flag")
	flag.Parse()

	var port string
	port = ":"+strconv.Itoa(portNum)
	fmt.Println("listen port =", port)

	// route handler
	http.HandleFunc("/", apiRequest)

	// do serve
	err := http.ListenAndServe(port, nil)

	// error abort
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

}
```
Hubot | Hubotのインストール

# Hubot | Hubotのインストール

## 概要
Hubotのインストール

## 前提
OS: Ubuntu14.04 LTS

## 手順
### npmのインストール

~~~bash
$ sudo apt-get update -y
$ sudo apt-get install -y nodejs
$ sudo apt-get install -y npm
~~~

### hubotのインストール

~~~bash
$ sudo npm install -g hubot coffee-script
$ sudo ln -s /usr/bin/nodejs /usr/bin/node
~~~

### インストールの確認

~~~bash
$ hubot -v
2.8.0
~~~

※Kandanと併せて利用する場合は、hubot-kandan adapterを利用する都合上2.4.7 をインストールする必要がある

## 参照
https://hubot.github.com/
https://github.com/github/hubot/tree/master/docs
vimのquickrunでrubyをbundle exec rubyする方法


- 1. `.vimrc`に以下を設定

```
let g:quickrun_config['ruby.bundle'] = { 'command': 'ruby', 'cmdopt': 'bundle exec', 'exec': '%o %c %s' }
```

- 2. vimのコマンドモードで以下を実行

```
set ft=ruby.bundle
```

[711fumiさんのブログ記事](http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/04/17/090805)を参考にさせていただきました。
quickrun_configの'command'に複数コマンドを登録することができないっぽいのでどうしていいかわからなかったんですが、'cmdopt'を使う＆実行位置を指定することでできるんですねーということで目からウロコでした。
2についてはquickrunでruby使うときは全部bundle execだぜって人は上記のブログ記事に従って.vimrcにfiletypeを登録したら良いと思います。
Git | remote リポジトリのURLを一括で変更するRubyスクリプト

# Git | remote リポジトリのURLを一括で変更するRubyスクリプト

## 概要
remote リポジトリのURLを一括で変更するRubyスクリプトを作成します。

利用例としては、GitLabのドメイン（IPで利用している場合はIP）を変更した場合に
GitLabから clone したローカル環境の大量の remote リポジトリの設定を旧ドメインから
新ドメインに変更することです。

## 前提
* 旧リポジトリドメインを ***old_repo*** , 新リポジトリドメインを ***new_repo*** とします。
* remote リポジトリ名はすべて *origin* として設定しているものとします
* URLに ***old_repo*** を含まない remote リポジトリは処理対象外とします
* 同一ディレクトリ直下に各リポジトリが clone されているものとします

~~~bash
$ tree
┣ repo1
┣ repo2
┣ : 略
┣ repoY
┗ repoZ
~~~

* リポジトリは下記が存在するものとします

※otherは remote_url に ***old_repo*** を含まないものとします。

~~~bash
$ tree
┣ hoge
┣ hige
┣ hage
┗ other
~~~

## プログラム

~~~ruby:update_git_remote_urls.rb
class Dir
  def self.dirs(pattern)
    Dir.glob(pattern).select { |e|File.directory?(e) }
  end
end

class GitUrlUpdator
  def initialize
    @dirs = Dir.dirs("*")
  end

  def each
    @dirs.each do |dir|
      Dir.chdir(dir)
      yield(dir, self)
      Dir.chdir('../')
    end
  end

  def target_repo?(name)
    `git remote -v`.include?(name)
  end

  def rename(old_repo, new_repo)
    old_url = read_old_url
    new_url = old_url.gsub(old_repo, new_repo)
    `git remote rm origin`
    `git remote add origin #{new_url}`
    puts "Complete rename [#{old_url}] to [#{new_url}]"
  end

  private

  def read_old_url
    repo_url_src = `git remote -v`.split("\n").first
    repo_url_src =~ /
      (?<remote_name>origin)
      \t
      (?<url>.+)
      \s
      (?<fetch_or_pull>\(.+\))
      /x
    $~[:url]
  end
end

old_repo = 'old_repo'
new_repo = 'new_repo'
git_url_updator = GitUrlUpdator.new
git_url_updator.each do |dir, git_url_updator|
  next unless git_url_updator.target_repo?(old_repo)
  git_url_updator.rename(old_repo, new_repo)
end
~~~

## 変更前後の確認

~~~bash
# 変更前の remote の設定を確認
$ cd hoge
$ git remote -v
origin  git@old_repo:some_group/hoge.git (fetch)
origin  git@old_repo:some_group/hoge.git (push)

$ ../
# remote の設定を変更
$ ruby update_git_remote_urls.rb
Complete rename [git@old_repo:some_group/hoge.git] to [git@new_repo/hoge.git]
Complete rename [git@old_repo:some_group/hige.git] to [git@new_repo/hige.git]
Complete rename [git@old_repo:some_group/hage.git] to [git@new_repo/hage.git]

# 変更後の remote の設定を確認
$ cd hoge
$ git remote -v
origin  git@new_repo:some_group/hoge.git (fetch)
origin  git@new_repo:some_group/hoge.git (push)
~~~

## 参照
GitHubにソースコードを公開しておきました。
https://github.com/tbpgr/git_update_remote_urls
SQLFiddleでOracleのPL/SQLを実行する

[サンプル](http://sqlfiddle.com/#!4/fcd15/2)

- `Query Terminator` で `/` を選択する。
- 普通の SQL を実行する場合は、文末文字を `/` にする。

`DBMS_OUTPUT.PUT_LINE()` は使えないっぽいので、何らかのテーブルに出力してあげる必要がある。
シェルコマンド1行で複数コマンドや条件に応じた実行をする

crontabやansibleを使ってると、条件に応じたコマンドや複数コマンドの実行を一行に記述したい場合が案外多い.

スクリプトファイルを用意して実行すれば言われそうだが、たかが数行のためにファイルにおこすの面倒だし、なんせファイルの管理をしなければならない.

そんな時に1行で済む便利なシェルコマンドの書式をまとめておきます.

※ 以下の例は別のコマンドやオプションを使えば本来1コマンドで済みますが、説明の便宜上少し回りくどいコマンドにしています.

## コマンド1 || コマンド2
コマンド1が異常終了ならコマンド2を実行

~~~bash
$> ls hello.txt || echo "Hello!" > hello.txt
~~~
> hello.txtが存在しなければ、文字列"Hello!"をhello.txtに出力して生成.

## コマンド1 && コマンド2
コマンド1が正常終了ならコマンド2を実行

~~~bash
$> ls hello.txt && rm -f hello.txt
~~~
> hello.txtが存在したら、hello.txtを削除.

## "[ 条件式 ]"の利用
以下のように、シェルスクリプトのif文で用いる "[ 条件式 ]" を利用した書き方も可能です.

~~~bash
$> [ -f hello.txt ] || echo "Hello!" > hello.txt
$> [ -f hello.txt ] && rm -f hello.txt
~~~
> [ -f hello.txt ] は "hello.txtがファイルである"->真. ファイルでない/存在しない->偽.
> 条件式の書式はシェルスクリプト入門サイトなどに詳細な説明があるので割愛します.

## コマンド1; コマンド2
コマンド1を終了したら、結果に関わらずコマンド2を実行

~~~bash
$> ls hello.txt; cp hello.txt yeah.txt
~~~
> hello.txtの有無を確認し、その結果に関わらずhello.txtのコピーをyeah.txtとして生成する
> hello.txtがない場合、それにも関わらずコピーしようとするので後者cpコマンドはエラー.

## コマンド1 | コマンド2
言わずと知れたパイプ処理. コマンド1の出力をコマンド2の入力として実行.

~~~bash
$> ps aux | grep ntpd
~~~
> プロセス一覧リストを出力して、そのうち"ntpd"が含まれる行を出力.
ステータスバーをタップした時に、一番上ではなく途中にスクロールさせたい時の書き方


ステータスバーをタップしたら一番上にスクロールするアプリはよくありますし簡単に実装できます。しかしこれを「途中に」スクロールしたい場合が、ごくごく稀にあります。今日そんな場面に遭遇して調べたので、まとめておきます。


そもそもステータスバーをタップしたら、何がどう動くのか
----
UIScrollViewやUITableViewは、scrollsToTopというプロパティを持っています。このプロパティは、「scroll-to-top gestureが行われた時に一番上にスクロールするか」をBOOL型で設定します。scroll-to-top gestureはステータスバーをタップする事のようです。([UIScrollView Class Reference](https://developer.apple.com/library/ios/documentation/uikit/reference/uiscrollview_class/Reference/UIScrollView.html)のscrollsToTopを参照)。
このプロパティがYES（デフォルト）の場合、delegateのメソッド```- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView```が呼ばれ、本当にスクロールするのかどうかをYES/NOで受け取り動作します。プロパティがNOの場合は、delegateメソッドは呼ばれません。
このdelegateメソッドがYESを返せば、システム側で上にスクロールしていきます。途中までスクロールさせたい場合は、「戻り値としてはNOを返して」「delegateの中でスクロール」すれば良いのです。

サンプルコード
----

以下のコードは、UITableViewで「ステータスバーをタップしたら、section=1にスクロールする」場合のdelegate部分の実装です。

```objective-c
#pragma mark - UIScrollViewDelegate
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    // section=1までスクロールする
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

    // システム的な自動スクロールは停止
    return NO;
}
```

UIガイドライン的にはどうか？
----
正直アプリを申請してみないとわかりません。
[iOSヒューマンインタフェースガイドライン](https://developer.apple.com/jp/devcenter/ios/library/documentation/userexperience/conceptual/mobilehig/Bars/Bars.html#//apple_ref/doc/uid/TP40006556-CH12-SW2)の中のステータスバーの箇所を見ても、scroll-to-top gestureやタップ時のアニメーションについての言及はありません。自分が見落としているだけかもしれません。
また、これまで触った事のあるアプリでも、「ステータスバーをタップしたら一番上ではなくて途中にスクロールする」パターンは見た事ありません。
なのでせっかく実装しても審査で落とされてアバーとなるかもしれません。
無料で使える画像検索APIとリクエスト数制限まとめ

「ある単語で画像検索した結果を返す」みたいなAPIが使いたかったので無料で使えそうなのを探してみた。

#### 写真共有系サービス
- [Flickr search API](https://www.flickr.com/services/api/flickr.photos.search.html)
  - [3600クエリー/時間](https://www.flickr.com/services/developer/api/)
- [フォト蔵 search_public](http://photozou.jp/basic/api_method_search_public)
  - 「1リクエスト/秒を目安」
- [Panoramio Widget API](http://www.panoramio.com/api/widget/api.html)
  -  100000/日
- [Instagram media/search](http://instagram.com/developer/endpoints/media/)
  - [5000リクエスト/時間](http://instagram.com/developer/limits/)

#### 検索エンジン
制限がきついのが多い

- [Google画像検索API](https://developers.google.com/image-search/?hl=ja) 
  - 2011年5月に廃止
- [Google カスタムサーチ API](https://developers.google.com/custom-search/json-api/v1/overview?hl=ja)
  - 無料だと1日100リクエストまで?
- [Bing (Microsoft)](http://msdn.microsoft.com/en-us/library/dd250942.aspx)
  - [5000リクエスト/月まで無料](http://datamarket.azure.com/dataset/bing/search)
- [Yahoo!画像検索 API](http://developer.yahoo.co.jp/webapi/search/imagesearch/v2/imagesearch.html)
  - 2013年3月に提供終了
- [Ookaboo API](http://about.ookaboo.com/a/ookaboo_api)
  - Creative Commons の画像を検索できるらしい, 1000リクエスト/API key or IPアドレス

#### 素材サイト
- [Pixaboy](http://pixabay.com/api/docs/)
  - リクエスト数上限に関する記載なし？ 
- [Stockvault API](http://www.stockvault.net/api)
  - 利用には申請が必要
- [Shutterstock API](http://api.shutterstock.com/)
  - 申請が必要 
 
#### その他
- [Tiqav (ネタ画像)](http://dev.tiqav.com/)
  - リクエスト数上限記載なし?
- [Twitter search API](https://dev.twitter.com/docs/api/1/get/search)
  - 450リクエスト/15分



参考にしたURL

- [日本の全エンジニアに捧ぐ！現在公開されているAPI一覧【2013年版】 | Find Job ! Startup](http://www.find-job.net/startup/api-2013)
- [無料で利用できる画像検索APIまとめ | Pa-kun plus idea](http://web.plus-idea.net/2012/10/image-search-api-free/)
- [203 Photo APIs: Flickr, Foursquare and Yahoo Image Search](http://www.programmableweb.com/news/203-photo-apis-flickr-foursquare-and-yahoo-image-search/2012/02/22)
BCDコードを整数に変換する方法

この前、新入社員にBCDコードを整数に変換する方法を質問された。おそらく同じようなことを来年入社する新人にも聞かれると思うので説明用のメモを残す。

```cpp:bcd.cpp
unsigned char bcd = 0x12;                // BCDコード(2桁の整数)    
int a1             = bcd & 0x0F           // 1桁目の取得
int a2             = (bcd >> 4) & 0x0F;   // 2桁目の取得 
int num            = a2 * 10 + a1;        // 計算して整数値を求める
````
[Groovy]素数判断

最近Groovyを触っていなかったのでなんとなく素数を求めてみた。

```groovy
def isPrimeNumber = { Integer num ->
    num >= 2 ? (2..<num).every{num % it} : false
}

assert isPrimeNumber(2)
assert isPrimeNumber(3)
assert isPrimeNumber(5)
assert isPrimeNumber(7)
assert isPrimeNumber(11)
assert isPrimeNumber(4) == false
```

コレだけだと普通なので、自分が今回一番最初に書いたコードも残しておく。以下の通り。

```groovy
def isPrimeNumber = { Integer num ->
    def r = (2..num).collect{
        num % it == 0
    }
    r.findAll{it == true}.size() == 1
}
```
なんかもっとスマートにできないのか。。。？と思い以下のように修正

```groovy
def isPrimeNumber = { Integer num ->
    (2..<num).every{ num % it }
}
```

で、2未満の値が渡された際にfalseを返すようにした。それが今回最初に提示したコード。
余談になるけどクロージャの引数にちゃんとInteger型として明示してあるので、クロージャの中で渡された値が本当に数値なのかをチェックする必要はない。
Ruby | ディレクトリの一覧取得

# Ruby | ディレクトリの一覧取得

## 概要
Rubyでディレクトリの一覧取得

## サンプルコード(カレント配下のディレクトリのみ取得)

~~~ruby:dirs.rb
%w{hoge hige hage}.each { |dir|Dir.mkdir(dir) unless Dir.exist?(dir) }
print Dir.glob('*/')
~~~

## 出力

~~~ruby
["hage/", "hige/", "hoge/"]
~~~

## サンプルコード(カレント配下のサブディレクトリも含めた全ディレクトリを取得)

~~~ruby:dirs_rec.rb
require 'fileutils'
require 'pp'
%w{hoge/hoge/hoge hige hage/hage/hage hage/hege/huge}.each { |dir|FileUtils.mkdir_p(dir) unless Dir.exist?(dir) }
pp Dir.glob('**/')
~~~

## 出力

~~~ruby
["hage/",
 "hage/hage/",
 "hage/hage/hage/",
 "hage/hege/",
 "hage/hege/huge/",
 "hige/",
 "hoge/",
 "hoge/hoge/",
 "hoge/hoge/hoge/"]
~~~

## 感謝の意

1つ目のサンプルは ryosy383 さん
2つ目のサンプルは cielavenir さん
に教えていただきました。
ありがとうございます！
Go言語から mecab を使う

# 概要
Go言語の cgo バインディングを使って libmecab を呼び出すメソッドです。

珍しい物では無くむしろ良く見かけるのですが、手習いで自作してみました。
他は mecab_nbest_sparse_tostr() を使っているのが多く、それではシングルスレッドでしか使えない物になるため、mecab_lattice_tostr() を使う様にしています。

# 引っかかったところ
## import "C" は include 直下に書く
`// #include <mecab.h>
// #include <stdio.h>
import "C"`
import と include の間に空改行挟むと動かないそうです。
ずいぶんなやんだ。

## C のポインタ戻りの納め方が良くわかってない
`hoge := C.moga()'
と := で戻り値を受け取ろうとして上手くいかない時があったのですがエラーになるときがあり、そのときどういう型なのか良くわかりませんでした。
単に私の経験不足。

# 使い方
`go install bitbucket.org/rerofumi/mecab`
でどーぞ。

# ソースコード
```mecab-bind.go
package mecab

// #cgo CFLAGS: -I/usr/local/include
// #cgo LDFLAGS: -L/usr/local/lib -lmecab -lstdc++
// #include <mecab.h>
// #include <stdio.h>
import "C"

import "strings"

/* --------------------------------- */
/* --- error define                  */
/* --------------------------------- */
type mecabError struct {
	message string
}

func (err mecabError) Error() string {
	return err.message
}

/* --------------------------------- */
/* --- mecab parse                   */
/* --------------------------------- */
func Parse(line string) (result []string, err error) {
	var parse []string
	sentence := C.CString(line)

	model := C.mecab_model_new2(C.CString(""))
	if model == nil {
		return parse, mecabError{"mecab model is not created."}
	}
	mecab := C.mecab_model_new_tagger(model)
	if mecab == nil {
		return parse, mecabError{"mecab tagger is not created."}
	}
	lattice := C.mecab_model_new_lattice(model)
	if lattice == nil {
		return parse, mecabError{"mecab lattice is not created."}
	}

	C.mecab_lattice_set_sentence(lattice, sentence)
	C.mecab_parse_lattice(mecab, lattice)
	
	lines := strings.Split(C.GoString(C.mecab_lattice_tostr(lattice)), "\n")

	for _, item := range lines {
		if strings.Index(item, "EOS") != 0  {
			if len(item) > 1 {
				parse = append(parse, item)
			}
		}
	}

	C.mecab_destroy(mecab)
	C.mecab_lattice_destroy(lattice)
	C.mecab_model_destroy(model)

	return parse, nil
}
```

# 修正履歴
2014/08/12 - 確保した mecab 構造体の解放を忘れていたので追加、メモリ食い尽くして落ちたところで気がついた (;´ Д`)
現状でもエラーリターン時にゴミが残りそうではある。
opencsvの調査

# リンク
## opencsv (sourceforge.net) 

本家サイト(version 2.4-SNAPSHOT r117)
[http://opencsv.sourceforge.net](http://opencsv.sourceforge.net)

## opencsv の派生物

### opencsv github 
(各開発者が version 2.4~2.6 を名乗っている？) 私はここからforkした
[https://github.com/jlawrie/opencsv](https://github.com/jlawrie/opencsv)

本家 sourceforge.netからのforkで以下の機能追加がある

* jlawrie/master

  本家 2.4-SNAPSHOT (r117) と機能的な差異はなし

* jokillsya/master

  CSVReaderをIterableインタフェースの実装に変更、その他細かく変更が入っている
  意図的かどうかは不明だが、CSVIterator, CSVParserBuilder, CSVReaderBuilder,  などのクラスがなくなっている

* revelytix/revelytix

   CSVParser を Serializable にしたのみ

* OpenRefine/openrefine2.6

    CSVParser で、文字列(charではなくString)でのセパレータ指定に対応
    など

* filippor/master

  OpenRefine の途中から派生
  クォートしてない空要素をnullとして扱う？

* claygregory/master

  ResultSetHelperService で NVARCHAR,NCHAR,LONGNVARCHAR 正しく扱うようにした

* romank0/release-2.4-quotes-fix

  空のフィールドを null として扱う

### opencsv code.google.com
[ https://code.google.com/p/opencsv]( https://code.google.com/p/opencsv)

本家とcompatibleで機能追加されている。以下を参照
ただし、本家の途中から派生しているらしく、CSVIterator などいくつかのクラスが存在しない

[code.google.com](https://code.google.com/p/opencsv/)

### opencsv 3.0 github
[https://github.com/kongch/OpenCSV-3.0](https://github.com/kongch/OpenCSV-3.0)

code.google.comからのfork で本家とimcompatible
以下を参照

[github](https://github.com/kongch/OpenCSV-3.0)

定数が Constants クラスにまとめられている
code.google.com からそこまで大きくは変わっていないよう

## opencsv 使い方
[http://java.akjava.com/library/opencsv](http://java.akjava.com/library/opencsv)

# その他のJava CSV ライブラリ

## super csv
[http://supercsv.sourceforge.net](http://supercsv.sourceforge.net)

## csv tokenizer
[http://www.wakhok.ac.jp/~tomoharu/Java/csv/](http://www.wakhok.ac.jp/~tomoharu/Java/csv/)

## s2csv
http://s2csv.sandbox.seasar.org

## OrangeSignal CSV
http://orangesignal.sourceforge.jp/csv/migration.html

# CSVライブラリの比較記事

* http://d.hatena.ne.jp/orangesignal/touch/20140125/1390667027
* http://honeplus.blog50.fc2.com/blog-entry-69.html
strtokの部分文字列分割対応版

- 文字コードは **UTF-8** である前提です。Shift_JISやEUC-JPなどは正しく処理することは出来ません。
- 以下のバージョンでは、デリミタを複数指定することは出来ません。

```c:strstok関数
#include <stdio.h>
#include <string.h>

char *strstok(char *str, const char *delimiter) {
    static char *ptr = NULL;
    char *boundary;
    if (!str) {
        str = ptr;
    }
    if (!str) {
        return NULL;
    }
    if (boundary = strstr(str, delimiter)) {
        *boundary = '\0';
        ptr = boundary + strlen(delimiter);
        return str;
    }
    ptr = NULL;
    return str;
}

int main(void) {
    char str[] = "あいうえをかきくけをさしすせ";
    char delim[] = "を";
    char *p;
    for (p = strstok(str, delim); p; p = strstok(NULL, delim)) {
        puts(p);
    }
    return 0;
}
```

- 以下のバージョンでは、デリミタを複数指定することが可能です。

```c:strstoks関数
#include <stdio.h>
#include <string.h>
 
char *strstoks(char *str, const char **delimiters, const int delimiters_size) {
    static char *ptr = NULL;
    char *boundary;
    int i;
    if (!str) {
        str = ptr;
    }
    if (!str) {
        return NULL;
    }
    for (i = 0; i < delimiters_size; ++i) {
        if (boundary = strstr(str, delimiters[i])) {
            *boundary = '\0';
            ptr = boundary + strlen(delimiters[i]);
            return str;
        }
    }
    ptr = NULL;
    return str;
}
 
int main(void) {
    int size = 2;
    char str[] = "あいうえおかきくけこさしすせ";
    char *delims[] = {"お", "こ"};
    char *p;
    for (p = strstoks(str, delims, size); p; p = strstoks(NULL, delims, size)) {
        puts(p);
    }
    return 0;
}
```