OmniAICreator/Qiita-1.07M huggingface dataset:
Instagram APIで知りたいことまとめ

http://nekostagram.com/
のように

表示枚数を次から次へと増やす方法
(参考？)
http://shoheik.hatenablog.com/entry/2014/05/12/170708


複数の人の写真を混ぜて表示
例:有吉と長澤まさみの写真を表示

ハッシュタグで表示
例 #japanで抽出

movieを動かす方法
movieだけを抽出方法

特定ユーザー投稿を除外
カレントディレクトリの最後の git revision を表示する

『現在のリポジトリの最後の revision』を得るだけであれば

```shell-session
$ git rev-parse HEAD
```

で構わないのだけれど、まぁ特定の用事の時には『このディレクトリ以下の最後の変更 revision』が欲しくなったりならなかったりする。

そういう時はこうするとよい。

```shell-session
$ git rev-parse $(git log --oneline -n 1 . | awk '{{print $1}}')
```

やってることは『最後の log を1行だす』『先頭の省略された reivision を得る』んでそれを `rev-parse` に渡してるだけ。

`log` 単体だと、リポジトリ内で特定可能な長さまでカットされるが、その値が今後も特定可能とは限らない(将来的に衝突する可能性がある)ので、用途に応じて長くしておく。

べんりべんりー
Sinatra始める(ruby勉強5日目)


今までは[ブログ](http://mofumofu3n.hatenablog.jp/)に書いていましたがこれからはQiitaに書いていきます。

ナンバリングは3.0+1.0までやったので今回からは普通に戻します。

## Sinatraとは

Ruby製のWebアプリケーションフレームワーク。

特徴はRailsのようなフルスタックなフレームワークとは異なり、
ルーティングのみ制御するフレームワークです。

なので、フレームワークの知識はフルスタックなフレームワークと
比べて少なくすみます。

まずは、Sinatraをインストールしていきます。

## インストール

インストールするのは`sinatra`本体と
sinatraの拡張機能がまとまった`sinatra-contrib`です。

```
$ sudo gem install sinatra sinatra-contrib
```

## HelloWorldしてみる

`app.rb`を用意し、以下のように記述します。

```ruby
#!/usr/bin/env ruby
# encoding: utf-8

require 'sinatra'

get '/' do
  'Hello, world!'
end
```

記述したらいつもどおり実行してみます。

```shell
$ ruby app.rb
```

これで、Webサーバが起動するので`http://localhost:4567`にアクセスすると`Hello, World!`と表示されます。

ちなみに、トップレベルに記述するのを`Classic Style`といいます。

逆にクラスを作成して記述するのを`Modular Style`と呼びます
。

Modular Styleで記述した場合のコードは以下のようになります。

```ruby
require 'sinatra'

class Hello < Sinatra::Base
  get '/' do
    'Hello, world!'
  end
end

Hello.run!
```

## テンプレートを使ってHelloWorldする

今のままでは表示する内容をアプリケーションのコードに書いていますが
これでは使いづらいです。

ですので、表示する内容を別ファイルにわけます。

`app.rb`と同じ階層に`views/hello.erb`ファイルを用意します。

このerbというのはhtmlへrubyのスクリプトを埋め込めるテンプレートになります。

`views/hello.erb`の中身は以下の通りになります。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
```

次は'app.rb'を変更します。

```ruby
require 'sinatra'

class Hello < Sinatra::Base
  get '/' do
    erb :hello
  end
end

Hello.run!
```

今まで表示内容を直接記述していた位置にerbメソッドを記述し、
呼び出すファイルをシンボルで指定します。

これで再度rubyを実行すると、テンプレートを読み込んで出力してくれます。

## アプリケーションから表示内容を埋め込む

`Hello,World!`の記述をアプリケーションから指定できるようにします。

`views/hello.erb`

```html
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
<h1><%= @hello %></h1>
</body>
</html>
```

`app.rb`は以下の通り

```ruby
require 'sinatra'

class Hello < Sinatra::Base
  get '/' do
    @hello = 'Hello, Hello World!'
    erb :hello
  end
end

Hello.run!
```

インスタンス変数に出力した文字列を書き、
テンプレートファイルには`<%= %>`の形式でインスタンス変数を指定します。

これで再度実行するとインスタンス変数に指定した文字列が出力されます。

今日はここまで。

明日はリクエストのパスによって処理を変更するところを書きます。
Macの環境設定(4) キーと入力周りの設定


## はじめに
[前回](http://qiita.com/nenokido2000/items/763a4af5c161ff5ede68)の続きです。
Mac固有のキーバインドなど、入力周りの設定・調整について
何をやったかをまとめてみます。

## Google日本語入力のインストール
Macの標準日本語入力ツールと言えば「ことえり」ですが、
変換が微妙だったりと使いにくい面があります。
なので、Google日本語入力を導入してみました。

### インストール
[公式サイト](http://www.google.co.jp/ime/)からDLして、インストーラを使用してインストールします。

### Google日本語入力をデフォルト化する
インストールしただけだとことえりがデフォルトとなっているため、
以下の手順でGoogle日本語入力をデフォルト化します。

1. アップルメニューの「システム環境設定」をクリック
2. 「キーボード」を選択
3. 入力ソースタブを開く
4. 左下部に「＋」ボタンがあるので、これを押下する
5. 入力ソースの選択画面に移るので、「日本語」にフォーカスする
6. 	右ペインに「...(Google)」という設定があるので、使用したいものを選択して、「追加」ボタン押下で追加される
今回は、「カタカナ」「ひらがな」「全角英数」「半角カナ」
を追加しました。
7. 入力ソースタブに戻って、「ことえり」を選択した状態で、「-」ボタンを押下

以上で、Google日本語入力がデフォルトとして使用されるようになります。

## キーバインドの設定色々
### 日本語入力の切り替え
家のMBAはJISキーボード、職場のMBPはUSキーボードというややカオスな状況なのですが、
[karabiner](https://pqrs.org/osx/karabiner/index.html.ja)でUSキーボードでも日本語入力の切り替えをJISキーボードっぽくできるようにしておきたいと思います。
以下、手順です。

1. [公式サイト](https://pqrs.org/osx/karabiner/index.html.ja)からDLして、インストーラでインストール
2. karabinerを起動して、「Change key」タブから「For Japanese」を選択
3. 「コマンドキーの動作を優先モード v1」にチェックを入れる

右Command単独押下でかな入力、左Command単独押下で英数入力と切り替えができるようになります。	

### ファンクションキーの動作変更
デフォルトだと、標準的なファンクションキー（e.g. 日本語入力時にF7で全角カナ変換）として使用するためには、
fnキーを一緒に押す必要があります。
Eclipse使っていると、宣言を開くときに「F3」など、ファンクションキーを使ったショートカットを多用することになるので、
その都度fnキーを押すのは面倒です。
そのため、fnキー無しでもファンクションキーとして使えるように設定します。
以下、手順です。

1. アップルメニューの「システム環境設定」を開く
2. 「キーボード」を選択
3. 「キーボード」タブにある、「F1、F2 などのすべてのキーを標準のファンクションキーとして使用」にチェックを入れる

### Command + SpaceでEclipseの補完ができるようにする
キーの位置的にこの組み合わせで補完を発動したいのですが、Mac側のキーバインド(入力ソースの切り替え）が勝ってしまい、
うまくいきませんでした。
そのため、以下の手順でキーバインドを変更しています。

1. アップルメニューの「システム環境設定」を開く
2. 「キーボード」を選択
3. 「ショートカット」タブから、「入力ソース」を選択し、「前の入力ソースを選択」のチェックボックスを外す

## 所感
他にもやってるような気もしますが、覚えてる限りを書いてみました。
karabinerはもっと色々活用したいですね。

とりあえず、４回で最低限やった設定についてまとめました。
他にも色々インストールしているのですが、だらだら書いてもしょうがないので、気が向いた都度で別個にまとめを書いていきたいと思います。
Compassで連番png画像をspriteにする際の注意


compassの sprite-map なんかを使って連番pngを繋げた
スプライト画像を作る際、
デフォルトの状態だと連番通りにつなげてくれない。

そこで、

```
$img: sprite-map("img/renban/*.png", $layout: horizontal);
```

というように、$layout: horizontal というオプションをつけてあげると連番通りにつなげてくれる。
Herokuで新規アプリをAPIで作りたい【調査】【リンクのみ】

https://devcenter.heroku.com/articles/setting-up-apps-using-the-heroku-platform-api

ここ見たら出来そう。tar.gzをいきなり放り込んでアプリが作れるっぽい。すげぇ。
PHPで楽天高速バスサービスをスクレイピングしてDBに保存する

勉強もかねて、<a href="http://hb.afl.rakuten.co.jp/hsc/13123244.bf54095c.13123243.399aad9b/" target="_blank">楽天高速バスサービス</a>をPHPでスクレイピングしてみたメモ。
https://github.com/kuredev/rakuten_scraping

#### 作ったもの

楽天高速バスサービスから、指定の経路の、
* 最安値バスの金額とコース名
* 予約可能な件数
を取得してMySQLに保存する。

cronで回してデータを取りつづければ、最安値の推移等を分析できる。

#### スクレイピング部分
例として
・2014年9月12日
・東京→大阪の夜行バス
・3列シート
を条件に「予約可能件数」、「最安値」、「最安値のコース名」を配列として取得する処理を書いてみます。ライブラリとして、「<a href="http://simplehtmldom.sourceforge.net/">simple_html_dom</a>」を使います。

流れとしては、
①ソースの取得
②必要なデータが記述されたタグを特定
③特定のタグを指定し、データを抽出
④PHPのデータ構造に格納する
となります。まずスクリプトを示します。

```main.php
require_once dirname(__FILE__).'/lib/simple_html_dom.php';
function get_bus_info(){
//①
	$url = 'http://bus.travel.rakuten.co.jp/bus/ReSearchOpenSeatAction.do?f_rsf=&f_chd=0&f_cthr=true&f_cfou=false&f_fst=&f_sky=price&f_tst=&f_dsctcd=ALL&f_prcsq=0&f_isb=false&f_adt=1&f_cwom=false&f_ctwo=false&f_spy=&f_dscpcd=osaka&f_crel=false&f_cnig=true&f_stm=09&f_ctts=false&f_sk=0&f_spm=&f_sty=2014&f_dpcpcd=tokyo&f_spd=&f_cday=false&f_spc=&f_dpctcd=ALL&f_gyt=&f_cres=false&f_rno=&f_std=12';
	$html = file_get_html($url);
//②、③
	$kensu = $html->find(".paging_str", 0)->plaintext;
	$course_name = str_replace(array("\r\n","\r","\n"), '', trim($html->find(".result_route",0)->plaintext));
	$price = parsePrice($html->find(".result_price", 0)->plaintext);
//③
	return array(
		"kensu" => $kensu, 
		"price" => $price, 
		"course_name"=>$course_name
		);
}
```

肝は②、③ですが、タグを特定するには、Chromeの「要素の検証」を実施すると簡単に分かります。スクレイピングしたいページを開いて特定の部分をマウスで選択し、右クリックすると選択出来ます。

![要素の分析.png](https://qiita-image-store.s3.amazonaws.com/0/50690/15e1a71c-6eaa-d4d9-31a2-acc758d03f76.png)

タグさえ分かれば、simple_html_domを使うとデータの抽出も②の方法で簡単に出来ることが分かると思います。
楽天高速バスの場合は、上記URL中のresult_priceクラスの一番最初に取れるものが最安値となっているわけです。

#### DBへの保存

今回は単一のテーブルに保存するだけなので、特に工夫することもないのですが、ORMライブラリとして、<a href="http://www.phpactiverecord.org/">php-activerecord</a>を使ってみました。以下のようにほとんどコードを書くことなく、DBに保存出来ました。

```main.php
$arr = get_bus_info($url);
Week::create($arr);
```

```Week.php
class Week extends ActiveRecord\Model{
	static $table_name = 'weeks';
	static $primary_key = 'week_id';
}
```

#### 分析結果
調べてみると面白かったので、たまにはブログに書いてみました。
楽天高速バス予約ページを分析して分かった最適な高速バス予約のタイミングと金額について - ざっき http://kure.hatenablog.jp/entry/2014/09/11/230916
SciPy のよく使うサブパッケージ

SciPy はたくさんの数学的なアルゴリズムや便利な関数の集合体で NumPy を基礎としその延長線上に作られています。今日はその膨大な [SciPy のサブパッケージ](http://docs.scipy.org/doc/scipy/reference/index.html)のうちほんの一部ですがよく使う便利な関数について探索をしていきます。

サブパッケージには次のようなものがあります。これらはそれぞれ from scipy import PACKAGE_NAME といった方法で呼び出すことができます。 (他にもやりかたがあります)

|パッケージ|内容|
|:--|:--|
|cluster|クラスタリングアルゴリズム|
|constants|物理定数や数学定数| 
|fftpack|高速フーリエ変換ルーチン|
|integrate|統合と常微分方程式|
|interpolate|補間とスムージングスプライン| 
|io|入力および出力|
|linalg|線形代数|
|ndimage|N 次元処理|
|odr|直交距離回帰| 
|optimize|最適化と根検出ルーチン| 
|signal|シグナル処理|
|sparse|スパース行列と関連したルーチン| 
|spatial|空間データ構造とアルゴリズム| 
|special|特別な機能|
|stats|統計的分布と機能| 
|weave|C/C++ 統合|

筆者の独断と偏見でこのうち特によく使うサブパッケージを選ぶとすると [scipy.stats](http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html) と [scipy.linalg](http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html) です。

## 統計関数 (scipy.stats)

scipy.stats は統計のためのサブパッケージです。まず、連続確率変数と離散確率変数をカプセル化した 2 つの一般的なクラスがあります。 SciPy にはこれを基にした 80 以上の連続確率変数と 10 以上の離散確率変数に関するクラスがあります。これら主に統計に関するクラスは scipy.stats の下にまとまっています。 

連続確率変数に関する共通のメソッドには次のようなものがあります。

|メソッド|内容|
|:--|:--|
|rvs|ランダム変量|
|pdf|確率密度関数|
|cdf|累積分布関数 |
|sf|生存関数（1-CDF）| 
|ppf|パーセントポイント関数 （CDF の逆）|
|isf|逆生存関数（SF の逆）| 
|stats|平均、分散、フィッシャーの尖度、尤度|
|moment|非中心化積率|

### F 分布

おなじみの F 分布です。

```py3
from scipy.stats import f # stats から F 分布を呼ぶ
def draw_graph(dfn, dfd):
    rv = f(dfn, dfd) # 与えられた 2 つの引数で F 分布を描く
    x = np.linspace(0, np.minimum(rv.dist.b, 3))
    plt.plot(x, rv.pdf(x))

draw_graph(1, 1)
draw_graph(2, 1)
draw_graph(5, 2)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/9ee08bc5-0e10-b7dc-f338-6d310eb4f283.png)

### z 得点

次のように求まります。

```py3
x = np.array([61, 74, 55, 85, 68, 72, 64, 80, 82, 59])
print(stats.zscore(x))
#=> [-0.92047832  0.40910147 -1.53413053  1.53413053 -0.20455074  0.20455074
#    -0.61365221  1.02275369  1.22730442 -1.12502906]
```

## 線形代数 (scipy.linalg)

[BLAS](http://ja.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) と [LAPACK](http://ja.wikipedia.org/wiki/LAPACK) を利用した非常に高速な線形代数計算をできます。

線形代数ルーチンはすべて 2 次元配列に変換することができるオブジェクトを前提としています。これらのルーチンの出力も基本的に 2 次元配列となります。

```py3
x = np.array([[1,2],[3,4]])
linalg.inv(x)
#=>
# array([[-2. ,  1. ],
#        [ 1.5, -0.5]])
```

## まとめ

SciPy のサブパッケージは膨大な関数を備えていてとても説明しきれるものではありません。興味が出た方は、ぜひ[オンラインドキュメント](http://docs.scipy.org/doc/scipy/reference/index.html)を読んでみてください。

またオンラインドキュメントだけで足りない人は、[以前に紹介した無料書籍](http://qiita.com/ynakayama/items/8ed2854bcc3c3633345b)もあわせて参考にすると良いでしょう。
VagrantでMeteor.js + TDD(Laika)環境を揃える

![http://en.wikipedia.org/wiki/Laika](http://upload.wikimedia.org/wikipedia/en/c/c9/Laika.jpg)

# [Vagrant up](https://vagrantcloud.com/cbumgard/boxes/nodejs)

```bash
$ mkdir earth && cd earth
$ vagrant init cbumgard/nodejs
$ vagrant up
$ vagrant ssh
```

```bash
ssh $ node -v
    > v0.10.26
ssh $ npm -v
    > 1.4.3
ssh $ git --version
    > git version 1.7.9.5

ssh $ npm -g ls
    > /usr/lib
    > └─- npm@1.4.3

ssh $ exit
```

# Install [Meteor](http://docs.meteor.com/) 'n' [Laika](http://www.sitepoint.com/test-driven-development-with-meteor/)
```bash
$ vagrant ssh
```

```bash
ssh $ curl https://install.meteor.com/ | sh
ssh $ meteor --version
    > Meteor 0.9.1.1
```

```bash
ssh $ sudo npm install -g laika
ssh $ laika --version
    > 0.3.9
```

## Install Dependencies
### [Phantom.js](http://lealog.hateblo.jp/entry/2013/05/12/211803)

```bash
ssh $ mkdir tmp && cd tmp

ssh $ wget https://phantomjs.googlecode.com/files/phantomjs-1.9.0-linux-i686.tar.bz2
ssh $ bzip2 -cd phantomjs-1.9.0-linux-i686.tar.bz2 | tar xvf -
ssh $ sudo mv phantomjs-1.9.0-linux-i686/bin/phantomjs /usr/local/bin/

ssh $ cd ../
ssh $ rm -rf tmp
ssh $ phantomjs -v
    > 1.9.0
```

### [Mongodb](http://qiita.com/hidesuke/items/56a87d827708c8c770da)

```bash
ssh $ mongod --version
    > db version v2.4.4
ssh $ sudo mkdir -p /data/db/
ssh $ sudo chmod 777 /data/db/
```

# [Here comes Meteor!](http://arunoda.github.io/laika/getting-started.html)

```bash
ssh $ cd /vagrant
ssh $ git clone https://github.com/arunoda/hello-laika.git
ssh $ cd hello-laika
ssh $ laika
```
![So the result is 3 tests complete](http://arunoda.github.io/laika/images/getting-started/third.png)

# Enjoy!
* [Tutorials - Best Learning Resources for Meteor.js](https://www.yauh.de/articles/376/best-learning-resources-for-meteorjs/#tutorials)
Chromeのリモートデバッギング / Virtual boxのローカル開発環境にあるアプリを確認する

Virtual Boxのローカル開発環境で動くアプリを、Google Chromeを通してAndroidの実機で見る&デバッグする方法。なんかややこしい…ので適当にイメージ図にしました。個人的にはVagrant使ってますが、使ってなくても同じです。
　　
<!-- extract -->

![Screen Shot 2014-09-11 at 10.09.20 PM](http://image.workabroad.jp/upload/2014/188/workabroad.jpg)
すでにVirtual boxで開発環境が構築されていて、アプリがブラウザで確認できる状態を前提としています。
また、Mac/PCとAndroidが同じWifiに接続されている必要があります。
また、開発中のアプリへは dev.your-app.com で接続すると過程します。

で、こんなことができて便利。

<iframe width="560" height="315" src="//www.youtube.com/embed/Q7rEFEMpwe4" frameborder="0" allowfullscreen></iframe>

###USB接続
普通にMac/PCとAndroidを繋ぎます。

###Chrome
パソコンのChromeを立ち上げて、```chrome://inspect/#devices```にいきます。
AndroidのChromeも立ち上げると、下のようになってるはず。
![Screen Shot 2014-09-11 at 10.14.35 PM](http://image.workabroad.jp/upload/2014/196/workabroad.jpg)

###プロキシの設定（Android）
AndroidのSettingにいって、Wifi名を長押し -> Modify network
Show advanced options をタップして以下のように入力して保存。
Proxy hostname : localhost
Proxy port : 9000
![scr](http://image.workabroad.jp/upload/2014/190/workabroad.jpg)

###プロキシの設定（Mac/PC）
[Charles](http://www.charlesproxy.com/)をダウンロードしてイントール。
起動して、Proxy -> Proxy setting を確認する。
![Screen Shot 2014-09-11 at 7.39.38 PM](http://image.workabroad.jp/upload/2014/191/workabroad.jpg)
8888というポートをメモします。別のポートでもかまいません。

###ふたたびChrome
```chrome://inspect/#devices```にいって、Port forwardingをクリック。
Portに9000、IP address に localhost:8888 と入力し、Enable port forwarding にチェックを入れて、Doneを押して保存。
![Screen Shot 2014-09-11 at 7.40.13 PM](http://image.workabroad.jp/upload/2014/195/workabroad.jpg)
　　
これでOpen tab with urlにURL（dev.your-app.com）を入れると、携帯の画面に自分のローカル環境で動いているアプリが表示されるはず。
あとは通常のChromeのデバッグツールが使えるし、エレメントにマウスオーバーすると、携帯の該当する部分がハイライトされたりと、めちゃ便利！
　　
![Screen Shot 2014-09-11 at 7.41.04 PM](http://image.workabroad.jp/upload/2014/193/workabroad.jpg)

###参考
ここに全部書いてある。
https://developer.chrome.com/devtools/docs/remote-debugging
duコマンドのサイズをわかりやすく表示してサイズ順にソートする


# やり方

``du`` コマンドは ``-h`` オプションで人間に読みやすい形式にできます。

``` shell-session
% du -h 
3.8M    ./世界のさまざまなバレンタインとその習慣♥♥.key/Data
 12K    ./世界のさまざまなバレンタインとその習慣♥♥.key/Metadata
4.0M    ./世界のさまざまなバレンタインとその習慣♥♥.key
2.7M    ./世界のさまざまなバレンタインとその習慣♥♥_pub.key/Data
 12K    ./世界のさまざまなバレンタインとその習慣♥♥_pub.key/Metadata
3.0M    ./世界のさまざまなバレンタインとその習慣♥♥_pub.key
7.0M    .
```

しかし、3.8Mや12Kという値では ``sort`` コマンドでソートすることができません。
そこで、``du`` をバイト単位で表示し、``sort`` を使ってソートしてからcoreutilsにある ``numfmt`` コマンドでわかりやすい単位をつけます。

Linuxなどを使っていてGNU coreutilsが入っていれば何も考えずに

```shell-session
du -b | sort -n | numfmt --to=iec --suffix=B --padding=5
```

と打ちましょう。すると

```shell-session
% du -b | sort -n | numfmt --to=iec --suffix=B --padding=5                                                                                      
 819B ./世界のさまざまなバレンタインとその習慣♥♥.key/Metadata
 819B ./世界のさまざまなバレンタインとその習慣♥♥_pub.key/Metadata
2.6MB ./世界のさまざまなバレンタインとその習慣♥♥_pub.key/Data
2.8MB ./世界のさまざまなバレンタインとその習慣♥♥_pub.key
3.5MB ./世界のさまざまなバレンタインとその習慣♥♥.key/Data
3.8MB ./世界のさまざまなバレンタインとその習慣♥♥.key
6.5MB .
```

なんだかいい感じですね。

## やってること

* ``du`` の ``-b`` オプションでブロックサイズ単位からバイト単位で表示されます。
* ``sort -n`` でファイルサイズ順に昇順でソートされます。
* ``numfmt`` コマンドでいい感じにしてくれます。

# OS Xでこれをやりたい

``numfmt`` コマンドはGNU coreutilsにしかないので、Mac OS Xでは[Homebrew](http://brew.sh/)でインストールすれば使えるようになります。

```shell-session
brew install coreutils
```

どうやらBSDの ``du`` はバイト単位で表示する機能がないようです。よって、``du`` もcoreutilsのものを使う必要があります。デフォルトだとインストールされるコマンドにgというプリフィックスがつくので、その場合は

```shell-session
gdu -b | sort -n | gnumfmt --to=iec --suffix=B --padding=5
```

と ``gnumfmt`` を呼ぶ必要があります。
インデックサ this[] をリフレクションで取得する

以下のように定義されているインデクサをリフレクションで取得してみましょう。

```csharp
public object this[int index]
{
    get {  }
    set {  }
}
```

通常のプロパティであれば、以下のようにして取得できます。
( Hoge クラスの Fuga プロパティの場合)

```csharp
var pi = typeof(Hoge).GetProperty("Fuga", BindingFlags.Public | BindingFlags.Instance)
```

しかし、インデクサはプロパティ名がないので、上記のように書けません。
~~と思われますが、このように書くと取得できます。~~

```csharp
var pi = typeof(Hoge).GetProperty("Item", BindingFlags.Public | BindingFlags.Instance)
```

インデクサは内部的に Item と名前で扱われてるんですね。 __※追記あり__
試しにこういう定義をしてみましょう。

```csharp
public class Hoge
{
    public object Item { get; set; }
    public object this[int indexer] { get; set; }
}
```

すると`'Hoge' は 'Item' の定義を既に含んでいます。`というエラーが発生します。
このことからもインデクサが Item として扱われてることがわかりますね。

###追記
@tomochan154 さん、 @chocolamint さんからコメントを頂きました。
まずインデクサを複数定義した場合、上のリフレクションでは例外が発生します。。
また、 [IndexerNameAttribute](http://msdn.microsoft.com/ja-jp/library/system.runtime.compilerservices.indexernameattribute.aspx) でインデクサの名前を Item 以外に変更する事もできるので、GetProperty("Item", ... と書く方法も適切でないことが分かりました。

お二人から紹介された方法を下に書いておきます。

```csharp
// this[int index] 一本釣り
var types = new[] { typeof(Int32) };
var pi = typeof(Hoge).GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .First(pp => pp.GetIndexParameters().Select(pr => pr.ParameterType).SequenceEqual(types));
// インデクサ全部
var pis = typeof(Hoge).GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .Where(p => p.GetIndexParameters().Length > 0).ToArray();
```

```csharp
// this[int index] 一本釣り
var types = new[] { typeof(Int32) };
var type = typeof(Hoge);
var pi = type.GetProperty(type.GetCustomAttribute<DefaultMemberAttribute>().MemberName, types);
```
__COUNTER__マクロ

`__COUNTER__`は、0から始まり、使用されるたびに1ずつ増える数値に置き換えられるマクロのこと。

systemdやlinuxではユニークな文字列を生成するときに使われている。

```c:systemd/src/shared/macro.h
#define UNIQ __COUNTER__

```

```c:linux/include/linux/compiler-gcc4.h
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
```

覚えていたら便利なことが...あるかなー？
pecoの基礎の基礎


「pecoってツールらしきものが流行っている」と思いつつ、導入とか難しそうと思って後回しにしていたんですが、気がついたら自分の手元のbash設定ファイルにpecoを使う関数が定義されていたので、改めて初歩からやってみました。

説明に使用しているシェルはお馴染みのbashです。

#pecoとは

- [GitHubのpecoのサイト](https://github.com/peco/peco)

とてもシンプルなツールで **「標準入力から受けた行データをインクリメンタルサーチして、選択した行を標準出力に返す」** コマンドです。

シンプルゆえに様々な組み合わせで効果を発揮します。あらゆる場面での選択肢を標準入力に渡して、選択された結果を標準出力から受け取って加工してコマンド実行をする、というのが基本的な流れ。

説明じゃ伝わらないので実例を体験したほうが早いかも。

#peco のインストール

pecoで検索すると「pecoはGoでできている」とか出てきて「Goってなんぞや」とかなるのですが、 **pecoが何で作られているかとか使用者には関係ない** わけで、以下のページを見てインストールしましょう。

- [例えば、pecoをビルドしない - Qiita](http://qiita.com/lestrrat/items/de8565fe32864f76ac19)

Macのhomebrew環境を使っている人は `brew tap peco/peco` して   `brew install peco` するだけなのとても楽だったのが、2015年2月にはhomebrewの公式に入ったので、tapの必要は無くなりました。

#pecoの初歩

`peco` コマンドが使えるようになったら、あとは使ってみましょう。

検索して出てきたサイトのコマンドを `~/.bashrc` などに書いて使うよりもまず、自分で実例を体験してみたほうが応用がきいて良いです。

ホームディレクトリかどこかのディレクトリで以下のコマンドをうちます.

```bash
$ ls -l
```

よく知られたファイル一覧のコマンドです。ファイル一覧がたくさん出てきた方が後で面白いです。

これの出力をパイプで `peco` に渡すと…

```bash
$ ls -l | peco
```

なんとカーソル上下で行選択ができるようになります。そしてキーボードを打つとインクリメンタルサーチ (打っている途中で検索が進んで絞り込まれる) も可能です。しかも高速に。

どこかの行で Enter を打ってみましょう。コマンド待ち状態に戻ったうえで、`peco` によって Enter を打った行が標準出力に表示されました。

コマンドの標準出力を取り出して変数や別のコマンド入力に渡すことができれば便利そうですよね。そう思えたら次の一歩です。

#pecoワンライナー

bash ではコマンドの結果を標準出力から別の場所に取り出したりするには `$(command)` といった記法を使います。

```bash
$ expr 1 + 2
3
```

この出力を変数に格納して出力するには以下のようにします。

```bash
$ answer=$( expr 1 + 2 )
$ echo "いちたすには $answer です"
```

この要領で peco が使えます。

現在のディレクトリにあるサブディレクトリ一覧を表示 (`ls -1d */`) して、それをpecoで選択して移動するには、以下の一行になります。

```bash
$ cd "$( ls -1d */ | peco )"
```

`$(...)` 自体をダブルクォートでくくっているのは、空白が入ったディレクトリ対策です。`ls -1d */ | peco` でpecoに入って、選択されたディレクトリを`cd`コマンドに渡しています。

ね、簡単でしょう？

#pecoを使ったコマンドをbashの関数にする

いちいちコレを打つのも面倒なので、`~/.bashrc` などに関数として書いておきましょう。

```bash
# ~/.bashrc などで
function peco-lscd {
    cd "$( ls -1d */ | peco )"
}
```

もし即時反映したい場合は `source ~/.bashrc` などで。

これで `peco-lscd` と打つと、先ほどのコマンドが実行されます。

実はこれ、peco で入力をキャンセルしたとき (Escを押したときとか) に結果がカラになって `cd` コマンドに何も渡らず、結果的に意図せずホームディレクトリに戻ってしまいます。これの対処も入れましょう。

```bash
# ~/.bashrc などで
function peco-lscd {
    local dir="$( ls -1d */ | peco )"
    if [ ! -z "$dir" ] ; then
        cd "$dir"
    fi
}
```

`local` でローカル変数宣言をしたり、`if` 文や `test` コマンド (`[ ... ]`)  などを使って少し拡張性に気を使っています。

このあたりまで来ると、bashのシェルスクリプトがわかるかといった話になってくるので、もし知らない方で興味のある方は調べてみるとよいでしょう。

このコマンドだと「末尾にスラッシュが2つつく」とか「ドットから始まるディレクトリがリストアップされない」といった気になる点もあります。知っているコマンドを使って解決していくと良いでしょう。

```bash
function peco-lscd {
    local dir="$( find . -maxdepth 1 -type d | sed -e 's;\./;;' | peco )"
    if [ ! -z "$dir" ] ; then
        cd "$dir"
    fi
}
```

関数定義を消したい場合は、そのbashを終了させて立ち上げ直すか、`unset -f peco-lscd` と打てばよいです。

#みんなの応用例を探して拝借する

あとはシェルスクリプト力を発揮して自分でpeco活用コマンドを作るなり、他の応用例を拝借するなりしてpecoを活用していくだけです。

Qiitaには[pecoタグ](http://qiita.com/tags/peco)もあって、結構な人による応用例があります。また、新しい(2014年)ツールですので検索しても古い情報にはあたらない(2014年の今のところは)という点もあるので、Googleなどで検索しても使える情報がいっぱい出てくるのが特徴です。

検索してみるとzshとの応用例が多く見つかりますが、単純なコマンドなのでbashや他のシェルでコマンドを作ることも当然ながら容易にできます。
【感想】Androidアプリ開発パーフェクトマスター (Perfect master) その2

##はじめに
職業訓練ではEclipse+ADTの環境ですが、Android Studioの環境も触ってみたいという思いがありました。
某新宿の大きな書店に行ったら残り1冊しかなかった(おそらく棚に出していないだけかもしれませんが…)。
後、下記のタイトルで投稿しました。

[【感想】Androidアプリ開発パーフェクトマスター(Perfect master)](http://qiita.com/seiya1311/items/ccd7d5dbad18fb8a7a94)

しかし、サイトを閲覧させて頂いての感想でした。
Android Studioもふれてみたいと考えていたので、購入しました。

ということで
[Androidアプリ開発パーフェクトマスター](http://www.shuwasystem.co.jp/products/7980html/4161.html)
を読みながら感想とかを書いていこうと考えています。

##本の厚さ
>ページ数 992P

ということでかさばります。持ち運びは大変です。

##「Chapter 2 開発環境をPC上に用意する」を読んで
でインストールは既にしているので、さらっとまずはどんなことが書いているのか読んでいると

>Chapter 2 開発環境をPC上に用意する
>(抜粋)
>2.1.2 開発環境を動かすための下準備（環境変数「JAVA_HOME」の設定）

ですが、JAVA_HOMEの設定をするとのことですが、javac、javaなどのbinフォルダを環境変数に追加する記載しかありません。
ちょっと初心者向けといっているのですが、パソコンのインストールとか少し詳しい人ところがないと厳しいようです。
まぁAndroid Studioはころころ変わるらしいので、その時は起きなかったのかもしれませんが…

画面の写真はカラーで大きさもそこそこでいいとは思います。

> Java A to Z プログラミング的な話1 パッケージのインポート

Javaに関してですが、Chapter 2とかの最後に書いてあったりします。
丁寧に書いていると思います。
が、一番初めにパッケージ?これはプログラム初学者にとって分かりやすいのか?
と考えてしまいます。

まぁ従来からの学習の流れは下記のような感じかなと考えています。

1. 開発環境をインストール
2. 実行環境やコンパイルの格納されているbinフォルダなどを環境変数へ追加
3. まずテキストエディタでHello World!を出力するプログラムを入力して実行
4. 基本の演算子、基本の構文を学習
5. そのプログラム固有の概念を学習
6. GUI画面の作成を学習、イベント駆動型の学習

この方法がいいかはわかりませんが

まぁ少しづつ読みながら勉強して感想を書いていこうと思います。
Web+DB press vol. 82まとめ

# アプリケーション間で連携する手法
## FileTransfer
ファイルを介して通信
## Shared Database 
データベースを介して通信
一昔前のトラベルはこれに近い？
## Remote Procedure Invocation
ネットワーク上で同期的な関数呼び出しを介して連携
API多くはこれに該当
## Messaging
お互いにメッセージをやりとりしながら進めていく
ScalaのActor Modelとか、Javasciprtのeventみたいな

# RESTスタイルの特徴
## ROAの「4つの概念」
### リソース
名前とURIを持ったデータ（e.g. プランのデータ、施設のデータ）
### URI
### 表現
リソースの形式（e.g. JSON形式、XML形式）
### リンク
別のリソースを指し示すもの

## ROAの「4つの特徴」
### アドレス可能性
提供する情報がURIを通して表現できる
### ステートレス性
ステータスを持たない
/A, /B, /Cの順にアクセスしないと情報が表示できないとかだと、ステートレス性がない
### 接続性
あるリソースが別のリソースとの関連を表すリンクを持ちうる
### 統一インターフェース
- リソースの取得(GET)
- リソースの作成(POST)
- リソースの更新(PUT)
- リソースの削除(DELETE)

**リソースを取得する際に、/v1/getResourceのような形でURI中に操作を表す語彙が登場することがない**

HTTPメソッドの利用がROAに沿っていれば、「安全性」、「べき等性」を持つ
### 安全性
サーバー側の状態が変更されることがない(≒いわゆる副作用がない)
GET、HEADがこの性質を持つ

### べき等性
その操作を何度繰り返しても同じ状態となる
GET、HEAD、PUT、DELETEがこの性質を持つ

# RPCスタイルの特徴
## XML-RPC
RESTと対照的に複数のメソッドに対してエンドポイント(≒URI?)は一つ

## JSON-RPC 2.0
HTTP(S)プロトコル以外でも利用できる
リクエストパラメータとレスポンスパラメータの対応付けを示すためにidを持つ
idがないリクエストはNotificationとみなされてレスポンスを返す必要がない→非同期リクエストに使える
複数の処理を一つのリクエストでまとめて送って、レスポンスもまとめて受け取ることが出来る。(Batch request)

# RESTかRPCか
## RESTの特徴
**Pros**
ROAという設計概念を適用し、制限を設けることで自明なコンセンサスを共有できる→実装者によってブレがでづらい
**Cons**
(RPCに比べると)自由度が低い(e.g. BatchRequestが出来ない)
## RPCの特徴
**Pros**
NotificationやBatch Request等ユニークな機能が取り込める自由度の高さ
**Cons**
仕様に統一感が無くなり、理解しづらいものになる可能性が高い

## RESTが向いてる
- 公開API等、不特定多数のクライアントがAPIを用いる
- 複数のエンジニアがAPIを設計する
- L7で分散したい

## RPCが向いてる
- クライアントが社内に限定されている、SDKのような形でラップされている
- 限定されたエンジニアがAPIの設計をする

# 総評
APIってURLに対して、JSONを返せば良いんだよね、くらいに思ってたので、
結構色々なルールが定義されてることに驚きました。
今後APIを設計するときには、RFCとにらめっこしながら作る必要があるかなと思いました。
AChartEngineでグラフ線が消える場合がある解決方法

あるAndroidアプリ開発で、AChartEngineを使用していたのですが、スクロールすると、いきなりグラフの線が消えて、プロットだけの表示になってしまう問題が発生してました。
解決にちょっと苦戦したので、メモしておきます。

最初は、安定のStack Overflowを見て、こうすればいいのかとやってみたけどうまくいきませんでした。詳しくは以下のURLを参照してください。<br>```android:hardwareAccelerated="false"```、```View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);```

[AchartEngine when zooming in linechart lines dissapear - Stack Overflow](http://stackoverflow.com/questions/14243870/achartengine-when-zooming-in-linechart-lines-dissapear)

これ以外の、解決方法がなかなか見つからずにけっこう悩んでましたが、ちょっと意外な場所が原因でした。

本アプリでは

```java:AChartEngineクラス
//changeRenderingModeメソッド
protected XYMultipleSeriesDataset dataset;
XYSeries newSeries = new XYSeries(title);
dataset.addSeries(newSeries);
```

のようにしてdatasetにXYseriesのオブジェクトを入れていたのですが、これだとグラフに描画されていないときには、周りの文字サイズ等のプロパティは適応されません。だから

```java:AChartEngineクラス
//changeRenderingModeメソッド
protected XYMultipleSeriesDataset dataset;
XYSeries newSeries = new XYSeries(title);
newSeries.add(1, 1);
dataset.addSeries(newSeries);
```

みたいな感じで初期値を追加していました。ちなみにchangeRenderingModeメソッドはグラフのモードを切り替えるメソッドです。

グラフ線が消えるのは、これが原因だったみたいです。。。

最初に追加したものはグラフ生成前にちゃんと消さないと、グラフのプロットが２つ被ってしまい、おかしな挙動をしてしまうみたいです。（消さないでも0.01とかにしても大丈夫です。被らなければ。ただ点が重なって気持ち悪いです。）

詳しい原因はちょっと分かっていませんが、これをグラフ生成前に消すことで解決しました。

今回は開始ボタンを押すと動的にグラフが描画されて、スピナーで複数のグラフや測定データを切り替えたりしていのたで以下の様な感じにしました。

```java:開始ボタンのあるクラス(ViewとかViewModel)
selectedGraph.clearData();
```

```java:インタフェースの実装ファイル
    @Override
    public void clearData(){
        if( this.dataset.getSeries().length > 0 ) {
            this.dataset.getSeriesAt(0).clear();
        }
    }
```

selectedGraphにはインタフェースの型をもつオブジェクトが入っています。で、状態によって切り替えてる感じです。

とりあえずメモ。
iterm セッティング


````.bash_profile
#iterm
#color setting
bind "set completion-ignore-case on"

export PS1="[\[\033[01;38m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]]\$"
export CLICOLOR=1
export LSCOLORS=DxGxcxdxCxcgcdabagacad

export LESSHISTFILE="-"
unset HISTFILE
# iterm
````
RSpecカスタムマッチャでデータベースのUNIQUE制約を簡単にテストする

Railsを使っているとDBのフィールドにUNIQUE制約をつけることがよくありますが、テストしようとするとデータを保存してエラーが起きることを確認したりして相当面倒です。
なのでカスタムマッチャを作りました。

たとえばPersonモデルのnameフィールドのUNIQUE制約をテストする場合は

```Ruby
describe Person do
  subject { FactoryGirl.create(:name) }
  it { should have_not_null_constraint_on(:title) }
end
```

と書いてあげれば

    $ bundle exec rspec spec/models/person_spec.rb
    Person
      should have UNIQUE constraint on name

とテスト実行できます。

カスタムマッチャのソースコードは下記の記事に書きました。

* [RSpecカスタムマッチャでデータベースのUNIQUE制約を簡単にテストする](http://blog.enogineer.com/2014/09/09/rspec-db-unique-constraint/)

ちなみに他にこんな記事も書いています。

* [RSpecカスタムマッチャでデータベースのNOT NULL制約を簡単にテストする](http://blog.enogineer.com/2014/09/08/rspec-db-not-null-constraint/)
* [RSpecカスタムマッチャでデータベースの外部キー制約を簡単にテストする](http://blog.enogineer.com/2014/09/10/rspec-db-foreign-key-constraint/)
xargsコマンドのオプションを調べてみた


## はじめに

xargsコマンドについて、オプションの有無やオプション指定よる動作を違いを記述します。

## 環境

* CentOS 6.5
* xargs 4.4.2

## xargsコマンドのオプションによる動作に違い

* オプションを指定しない場合

```shell
$ echo 'Java Ruby Python' | xargs
Java Ruby Python
```

* 実行されるコマンドを標準エラーに出力する

tオプションを指定します。

実行結果を __xargs.stdout__ へ保存します。
実行されるコマンドを __xargs.stdout__ へ保存します。

```shell
$ echo 'Java Ruby Python' | xargs -t > xargs.stdout 2> xargs.stderr
$ cat xargs.stdout
Java Ruby Python

$ cat xargs.stderr
/bin/echo Java Ruby Python
```

以降は、実行されるコマンドのみ出力し、実行結果は/dev/nullへ向けることにします。

* 使用する引数の個数を指定する

nオプションを指定します。

```shell
$ echo 'Java Ruby Python' | xargs -t -n 1 > /dev/null
/bin/echo Java
/bin/echo Ruby
/bin/echo Python
```

* ファイルから読み込む

aオプションを指定します。

```shell
$ echo 'Java Ruby Python' > xargs-sample.txt
$ echo -t -a xargs-sample.txt > /dev/null
/bin/echo Java Ruby Python

$ echo -e 'PHP\nPerl\nJavaScript' > xargs-sample2.txt
$ xargs -t -a xargs-sample.txt -L 1 > /dev/null
/bin/echo PHP
/bin/echo Perl
/bin/echo JavaScript
```
* 使用する行数を指定する

Lオプションを指定します。

```shell
$ xargs -t -L 1 -a xargs-sample.txt > /dev/null
/bin/echo PHP
/bin/echo Perl
/bin/echo JavaScript
```

* 引数を置き換える

Iオプションを指定します。

```shell
$ echo 'Java Ruby Python' | xargs -t -Ilangs echo '=> langs' > /dev/null
echo => Java Ruby Python
```
iオプションを指定した場合は __-I{}__を指定したことになります。

```shell
$ echo 'PHP Perl JavaScript' | xargs -t -i echo '=> {}' > /dev/null
echo => PHP Perl JavaScript
```

nオプションとIオプションを同時指定した場合は、Iオプションのみ有効になります。

```shell
$ echo 'Java Ruby Python' | xargs -t -n 1 -Ilang echo '=> lang' > /dev/null
echo => Java Ruby Python
```

LオプションとIオプションを同時に指定した場合はどちらも有効となります。

```shell
$ echo -e 'Java\nRuby\nPython' | xargs -t -L 1 -Ilang echo '=> lang' > /dev/null
echo => Java
echo => Ruby
echo => Python
```

## 参考

* [Man page of XARGS](http://linuxjm.sourceforge.jp/html/GNU_findutils/man1/xargs.1.html)
* [【xargs】標準入力から生成したコマンドラインを実行する](http://itpro.nikkeibp.co.jp/article/COLUMN/20140331/547143/)
CircleCIでkarmaのカバレッジを出力する


RailsをAPIサーバにしてクライアントコードをRailsとは完全に切り離してAngularJSで構築しているプロジェクトにおいてテストを自動化するためにCircleCIを使っています。

そこで、カバレッジを出力するのにrspecの場合は下記を参照して簡単にできるのですが、クライアントコードのカバレッジの出力に若干工夫が必要だったので、ここで簡単にやり方をご紹介します。

https://circleci.com/docs/code-coverage

上記のURLだと"../../../"でカバレッジのHTMLの出力先を指定しており、これだとややっこしいのでディレクトリをデフォルトの出力先ディレクトリを変更しました。

また、上記のrspecの場合は、`spec_helper.rb`でCircleCI環境時に出力先を指定しているのですが、karmaでは開発時に使用している`grunt`の`test`とは別にCircleCI用に`test:ci`というタスクを用意して、CircleCI用の設定ファイルを別途作成するようにしました。


```yaml:circleci.yml
test:
  post:
    - cd client && grunt test:ci

general:
  artifacts:
    - "~/coverage"
```

もとのタスクに`test:ci`を登録しました。


```coffee:client/Gruntfile.coffee
grunt.registerTask "test", (target) ->
  if target is "ci"
    grunt.task.run([
      "clean:server"
      "concurrent:test"
      "autoprefixer"
      "connect:test"
      "karma:ci"
      "protractor"
    ])
  else
    grunt.task.run([
      "clean:server"
      "concurrent:test"
      "autoprefixer"
      "connect:test"
      "karma"
      "protractor"
    ])
```

さらにkarmaの設定ファイルを下記の通り指定します。

```coffee:client/Gruntfile.coffee
karma:
  unit:
    configFile: "test/karma.conf.coffee"
    singleRun: true
  ci:
    configFile: "test/karma_ci.conf.coffee"
    singleRun: true
```

karmaの設定ファイルでCircleCIでテスト実行時にカバレッジが出力されるディレクトリを指定します。

```coffe:client/test/karma_ci.conf.coffee
coverageReporter: 
  type: "html"
  dir: process.env['CIRCLE_ARTIFACTS'] + "/coverage"
 
reporters: ['spec','coverage']
```

以上です。
C#上でCanvasからUIオブジェクトを取り出す方法


Unity上でcreateから作れるから、TextとかButtonとかUI下にあるオブジェクトはGameObjectの亜種だと勘違いしてました...

```c#
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Initialize : MonoBehaviour {
	
	public Canvas canvas;
	
	// Use this for initialization
	void Start () {
		Text target = null;
		foreach (Transform child in canvas.transform){
			if(child.name == "Main Title"){
				target = child.gameObject;
				target.text = "AAAAAAA";
			} else if (child.name == "Sub Title") {
				target = child.gameObject;
				target.text = "BBBBBBB";
			}
		}
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

と書いたら華麗にエラーが起きたので、どうした物かと悩んでいたんですが、TextのInspectorをよく見た所、
![kobito.1410434614.075755.png](https://qiita-image-store.s3.amazonaws.com/0/45511/0484e49d-273e-3290-6d1d-bac1fc69a188.png "kobito.1410434614.075755.png")
(Script)なる文言が...

という事は、UIオブジェクト群って **コンポーネント** 	だったんですね...恥ずかしい...

```c#
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Initialize : MonoBehaviour {
	
	public Canvas canvas;
	
	// Use this for initialization
	void Start () {
		Text target = null;
		foreach (Transform child in canvas.transform){
			if(child.name == "Main Title"){
				target = child.gameObject.GetComponent<Text>();
				target.text = "AAAAAAA";
			} else if (child.name == "Sub Title") {
				target = child.gameObject.GetComponent<Text>();
				target.text = "BBBBBBB";
			}
		}
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```
![kobito.1410434887.363529.png](https://qiita-image-store.s3.amazonaws.com/0/45511/d509acae-d843-fecd-23f7-422cebce94bd.png "kobito.1410434887.363529.png")![kobito.1410434928.686063.png](https://qiita-image-store.s3.amazonaws.com/0/45511/c06e6d33-3f2c-202e-84a8-2b9afe398d12.png "kobito.1410434928.686063.png")

無事"Main Title"と"Sub Title" Textの文言の変更出来た！
iOS8 からローカル通知が保存されなくなった？

ハマったのでメモ。

単純なローカル通知を追加。

```objectivec
    UILocalNotification *notify = [[UILocalNotification alloc] init];
    notify.fireDate = [NSDate dateWithTimeIntervalSinceNow:100];
    notify.alertBody = @"test";
	[[UIApplication sharedApplication] scheduleLocalNotification:notify];

    NSLog(@"notifications: %@", application.scheduledLocalNotifications);
```

もちろん iOS 7 だとうまくいく。

```
notifications: (
    "<UIConcreteLocalNotification: 0x7fb6d2105e80>{fire date = Thursday, September 11, 2014 at 8:02:10 PM Japan Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Thursday, September 11, 2014 at 8:02:10 PM Japan Standard Time, user info = (null)}"
)
```

iOS8 だと変なエラー出て application.scheduledLocalNotifications が空っぽ。

```
Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7f8936b00a90>{fire date = 2014年9月11日木曜日 19時59分27秒 日本標準時, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = 2014年9月11日木曜日 19時59分27秒 日本標準時, user info = (null)} with an alert but haven't received permission from the user to display alerts
notifications: (
)
```

パーミッションがうんたらかんたら。

```
with an alert but haven't received permission from the user to display alerts
```



ぐぐったらあった。

■ scheduleLocalNotification doesn´t work - Stack Overflow
http://stackoverflow.com/questions/12277334/schedulelocalnotification-doesn%C2%B4t-work

これで解決。

```objectivec
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }
    return YES;
}
```

リモート通知同様、ローカル通知でもちゃんと初期化しろってことらしい。

おかげでローカル通知でも起動時にダイアログ出るようになった。

![通知ダイアログ](http://resources.qnote.jp/qiita/local-notification-1.png)

iOS8 の User Notifications 周りはいろいろ面白そうなのであとで調べる。
GoogleSpreadSheetのユーザーストーリーリストをGoogleAppsScript経由でJIRAに落としこむ

## やりたいこと

ユーザーストーリーを表にまとめてるので、自動的にJIRAのIssueとして全部切って欲しい。

## やりかた

`user-story-list`
![user-story-list](https://qiita-image-store.s3.amazonaws.com/0/1361/7dc5306c-62e8-096f-828a-96e7b657c1be.png)

```js:main.gs
function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('JIRA', [
    {
      name: 'Create issues',
      functionName: 'createIssuesForJira'
    }
  ]);
}

function createIssuesForJira() {

  var jiraUrl = '<JIRAのURL>';
  
  var startRowIndex = 2;
  var startColumnIndex = 1;

  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getRange(
    startRowIndex,
    startColumnIndex,
    sheet.getLastRow() - startRowIndex + 1,
    sheet.getLastColumn() - startColumnIndex + 1
  ).getValues();
  
  for (var i=0; i<rows.length; i++) {
    if (!rows[i][0]) {
      var response = UrlFetchApp.fetch(jiraUrl, {
        contentType: 'application/json',
        method: 'post',
        payload: JSON.stringify({
          fields: {
            project: {
              key: rows[i][1]
            },
            issuetype: {
              name: rows[i][2]
            },
            summary: rows[i][3],
            description: rows[i][4]
          }
        })
      });                              
      if (response.getResponseCode() === 200) {
        sheet.getRange(i + startRowIndex, startColumnIndex).setValue(JSON.parse(response.getContentText()).key);
      }
    }
  }
}
```

## さいごに

作ったんだけど、諸事情で**試せていない**ので、自己責任でお願いします。
（たぶん、大丈夫。たぶん…。）
インスタンスから名前空間を取得する

# やりたいこと

インスタンスのクラス名の名前空間の部分だけ抽出したい。
(例えば `A::B::C::D` の `A::B::C` の部分)

# 方法

[String#deconstantize](http://api.rubyonrails.org/classes/String.html#method-i-deconstantize) と [String#constantize](http://api.rubyonrails.org/classes/String.html#method-i-constantize) を使って実現できます。 (Special thanks to @jkr_2255)

```ruby
module Puella
  module Magi
    class HolyQuintet
      def initialize(name)
        @name = name
      end
    end
  end
end

instance = Puella::Magi::HolyQuintet.new("美樹さやか")
#=> #<Puella::Magi::HolyQuintet @name="美樹さやか">

class_name = instance.class.name
#=> "Puella::Magi::HolyQuintet"

class_name.deconstantize
#=> "Puella::Magi"

class_name.deconstantize.constantize
#=> Puella::Magi
```

# 以前 (2014/09/11 (木)) 紹介していた方法

[String#demodulize](http://apidock.com/rails/String/demodulize) と [String#gsub](http://docs.ruby-lang.org/ja/2.1.0/method/String/i/gsub.html) を使えば簡単にできるよ！

```ruby
module Puella
  module Magi
    class HolyQuintet
      def initialize(name)
        @name = name
      end
    end
  end
end

# Active Support Core Extensions が提供している String#demodulize を利用するため。
require 'active_support/core_ext'

instance = Puella::Magi::HolyQuintet.new("美樹さやか")
#=> #<Puella::Magi::HolyQuintet @name="美樹さやか">

class_name = instance.class.name
#=> "Puella::Magi::HolyQuintet"

class_name.demodulize
#=> "HolyQuintet"

# 名前空間の文字列を取得する。
class_name.gsub("::#{class_name.demodulize}", "")
#=> "Puella::Magi"

# 名前空間の Module (or Class) を取得する。
class_name.gsub("::#{class_name.demodulize}", "").constantize
#=> Puella::Magi
```
折り紙を使って流用開発を考えてみる

[前回](http://qiita.com/nobuhide/items/94b65dafa15799d0507f)は綺麗な折り紙のかぶとを折る「コツ」を他の人にも納得してもらう方法についてGSNで説明してみました。今回はその「コツ」を流用して折り紙の金魚が綺麗であることを説明してみようと思います。

###相手と合意形成できているゴールを前提に利用する
まずかぶとの折り方と金魚の折り方を比較してみます（図1参照）。Step.7までは同じ折り方であることが分かるので、Step.7までは前回引き出した折り紙かぶとを折る「コツ」を使って折ったかぶとを流用しても他の人の納得は得られると考えます。

![MakingKabutoandKingyo.png](https://qiita-image-store.s3.amazonaws.com/0/53108/4104e88a-9946-f68b-ec7b-c9d1d02ea7e0.png "MakingKabutoandKingyo.png")

図1 折り紙かぶとと金魚の折り方の比較

それでは、折り紙の金魚が綺麗であることを説明していきましょう。Step.7までは折り紙かぶとの「コツ」、それ以降のStepでは折り紙金魚の「コツ」を利用すれば金魚が綺麗であることを説明できるように思います。この説明をGSNで描くと図2のようになります。

![ConfirmforBeautifulKingyo.png](https://qiita-image-store.s3.amazonaws.com/0/53108/c9f07d00-f431-516d-a8f2-1f7a66dd1a00.png "ConfirmforBeautifulKingyo.png")
図2 綺麗な折り紙の金魚GSN

それではこの「綺麗な折り紙の金魚GSN」を説明していきます。なお、折り紙金魚を綺麗に折るコツは前回の記事と同じやり方で引き出されているものとします。

1. トップゴールは「折り紙の金魚は綺麗である」としてゴールノード(G1)で示しています。
2. 文脈ノードには「折り紙共通のコツ(C1)」、「折り紙金魚を綺麗に折るコツ(C2)」、「折り紙金魚の折り方(C3)」、「折り紙のかぶとが綺麗に折れていることを説明したGSN(C4)」、「かぶとと金魚の共通部品と金魚のみの部品の関係一覧(C5)」を用意しました。
3. トップゴールは折り紙かぶとの時と同じように折り紙金魚の折り方(C3)に基づいた戦略ノード(S1)に従って分解していきますが、まずはかぶとと金魚の共通の折り方(G2)、金魚のみの折り方(G3)、共通部分と金魚のみの部分の関係(G4)に分けて説明します（S1もそういう文面の方がよいかもです。時間があったら見直します！）。
4. かぶとと金魚の共通の折り方(G2)が妥当であることは文脈ノードC4で明確に説明できると思います（Sn1にしてもいいかもしれませんね）。
5. 金魚のみの折り方(G3)が妥当であることはかぶとの時と同じように文脈ノードC2の折り紙金魚を綺麗に折るコツを使って説明しています。
6. 最後に共通部品と金魚のみの部品の関係が妥当であること(G4)を文脈ノードC5に基づいた戦略ノード(S3)に従って分解し、共通部品が折り紙の金魚に相応しいことをSn6,7を証拠として説明しています。

共通の折り方(G2)と金魚のみの折り方(G3)が妥当であることを説明すれば大丈夫なんじゃない？と思われる方もいるかもしれませんが、共通の折り方(G2)は綺麗な"かぶと"を折ることを念頭にしているため、もしかすると金魚の部品としては適切ではないかもしれません。そういう意味でG4を説明することは何かを流用した場合には不可欠の説明だと考えます。

###折り紙を使って流用開発を考えてみて思ったこと
今回の記事は松野先生と平鍋さんの[対談ムービー](https://www.youtube.com/watch?v=vZJmNH2vIus)で教えて頂いた流用開発の説明の仕方を折り紙を題材にして説明し直したものになります。流用開発は過去の良い製品を流用することで積み上げてきた高い品質をそのまま維持しつつ最小のコストで新しいモノ作り上げる優れた考え方だと思います（流用開発という言葉が一般的ではないかもなので異なる解釈は多々あると思います。その点はご容赦頂けると幸いです）。ただ、流用する部分と新しい部分を個別で考えてしまうと製品として組み上げた時の品質は怪しいものになってしまうのは冷静になれば明白だと考えます。とはいえ実際の開発現場でいつも冷静にいられるかと言えば、なかなか難しい訳で、そういった意味でもGSNを使って自分たちのやってきたことを説明してみるのは良い製品作りのためにスゴく大切なんじゃないかなと思っている次第です。松野先生、平鍋さん、貴重なお話ありがとうございました。解釈が間違っていること等ありましたらご指摘頂けるとうれしいです！
Using Omnicontacts to get mail contacts from Google


Today, when I'm working on company, my colleague asked me: "Do you use Omnicontacts gem to get mail contacts from Google?". After 30 minutes research about this gem, now I'll write a post "Using Omnicontacts to get mail contacts from Google".

- First, create new rails app:

```
	mkdir omnicontacts
	cd omnicontacts/
	rails new .
```

- After run command `bundle install`, let's add OmniContacts into `Gemfile` as a dependency:

```ruby
	gem 'omnicontacts'
```

`bundle install` again.

- You need generate a controller to handle callback returned from Google.

`rails g controller main index contact`

```ruby
	class MainController < ApplicationController
		def index
  		end
		def contact
		end
	end
```

- As for Omniauth, let's go to `/config/initializers/` directory and create new file `omnicontacts.rb`

```ruby
	require 'omnicontacts'

	Rails.application.middleware.use OmniContacts::Builder do
  		importer :gmail, "client_id", "client_secret, {:redirect_path => "/oauth2callback", :ssl_ca_path => "/etc/ssl/certs/curl-ca-bundle.crt"}
	end
```

To add `client_id` and `client_secret`, please access [Google API Console](https://code.google.com/apis/console/) and Create new Client ID

- After generated `main_controller`, let's update the routes file:

```ruby
	Omnicontacts::Application.routes.draw do
		match "/contacts/:importer/callback" => "main#index", :via => [:get]
		match "/oauth2callback" => "main#contact", :via => [:get]
		# You can have the root of your site routed with "root"
 		root 'main#index'
	end
```

- The list of contacts will be accesses via the `omnicontacts.contact` key in the environment hash. So, please edit the `main_controller` file:

```ruby
	class MainController < ApplicationController
		def index
  		end
		def contact
			@contacts = request.env['omnicontacts.contacts']
			respond_to do |format|
      			format.html 
    		end
		end
	end
```

- After that, we need edit two files in Views folder

```ruby:/main/index.html.erb
	<h2>OmniContacts Example</h2>

	<a href="/contacts/gmail">Gmail</a>
```

```ruby:/main/contact.html.erb
	<% unless @contacts.nil?%>
  		<% @contacts.each do |c|%>
  			<ul>
    			<li><%= c[:name]%> :  <%= c[:email]%></li>
  			</ul> 
  		<%end%>
	<%end%>
```

- Done, now you can run `rails s` and access to `http://localhost:3000`.

---

####You can refer example at link: http://omnicontactsvinhnguyen.herokuapp.com/ or https://github.com/vinhnguyenleasnet/omnicontactvinhnguyen
ObjCからSwiftに書きなおす際にNSCodingがうまく動かない（解決済）

ObjCで以下のようなクラスを書いていたとします。

```objc:AAClass.h

#import <Foundation/Foundation.h>
@interface AAClass : NSObject
@property NSString*name;
@end

```

```objc:AAClass.m
#import "AAClass.h"
@implementation AAClass
-(id)init{
    if (self = [super init]) {
        _name = @""
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:_name forKey:@"name"];
}
- (id)initWithCoder:(NSCoder *)coder {
    if (self = [super init]) {
        _name = (NSString*)[coder decodeObjectForKey:@"name"];
    }
    return self;
}
@end

```

これをswiftに書き換えようとして

```swift
import Foundation

class AAClass : NSObject,NSCoding{
    var name:String = ""
    
    override init() {
        super.init()
    }
    
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.name, forKey: "name")
    }
    
    required init(coder aDecoder: NSCoder) {
        self.title = aDecoder.decodeObjectForKey("name") as String
    }
}
```

と書き直します。
処理は同様に行われますが、

ObjCで

```objc
[NSKeyedArchiver archivedDataWithRootObject:aaclass]
```

したものを
swiftで

```swift
NSKeyedUnarchiver.unarchiveObjectWithData(aaclass as NSData)
```

すると、例外エラーを吐いてしまいました。
恐らくObj-Cとswiftのクラス名が同じでも内部的には違うクラスとして扱われているのでしょうか…？
これからObj-CをSwiftに書き直す方は多いと思いますが、NSCodingの部分にはお気をつけ下さい。

＃＃＃＃＃追記
@satoshia @See_Ku から助言を頂きました。

```swift
@objc(AAClass)
class AAClass : NSObject,NSCoding{
~~
```

のように明示的に指定することで正常に動作しました！！
ありがとうございます
MySQLのトランザクションでハマったんだが


MySQLのトランザクションについて、購入処理の調査をしていてハマったので記録。

トランザクション絡みでこんなコードがありました。

```
start_transaction

  insert_into_member #1

  start_transaction
    insert_into_coupon #2
  commit

  insert_into_order #3

if error?
  rollback
else
  commit
end
```

いざ、エラーを起こしてrollbackの検証をしたところ。
\#2だけコミットされて、他はrollbackされることを期待したんですが、

**全部commitされてる…。**

なんでやー、と思って調べていったところ。
start transactionすると、自動的にコミットされるんですね。下記参照。

▼ 暗黙的なコミットを引き起こすステートメント
http://dev.mysql.com/doc/refman/4.1/ja/implicit-commit.html

最初の start transaction は、2回目のstart transaction 実行時にコミットされ、以後は普通にクエリを流してるのと変わらなくなっていました。

トランザクションの中にトランザクションは入れないように、と肝に銘じた一件です。

おそらく、最初に作ったときは問題なかったんでしょうが、
後から別メソッドを組み込んだところ、そちらの内側でトランザクションを利用していた、というトラップ。
勉強になりました。
VagrantでParallelsとVirtualBoxの両方に対応する


普通、Ubuntu12.04LTSを使うのであれば以下の様にすると思います。

```Vagrantfile
  config.vm.box = 'hashicorp/precise64'
```

ここを以下の様にします

```Vagrantfile
  config.vm.provider :virtualbox do |vb, override|
    override.vm.box = 'hashicorp/precise64'
  end
  
  config.vm.provider :parallels do |pr, override|
    override.vm.box = 'parallels/ubuntu-12.04'
  end
```

ここで気をつけたいのは、以下の様にすると期待通りには動かない、という事です。

```Vagrantfile
  # This is BAD EXAMPLE !!
  config.vm.provider :virtualbox do |vb|
    config.vm.box = 'hashicorp/precise64'
  end
  
  config.vm.provider :parallels do |pr|
    config.vm.box = 'parallels/ubuntu-12.04'
  end
```


但し `hashicorp/precise64` と `parallels/ubuntu-12.04` の間で完全に互換性がある訳ではないので、そこの部分は吸収するようにセットアップしてあげるひつようがありそうです。

parallels用のboxは以下のURLから探せます。

* https://vagrantcloud.com/search?provider=parallels
スクレイピングを「PHP Simple HTML DOM」でちょっと試してみた

参考サイト

http://www.kaasan.info/archives/1457

参考サイトを見ながらレイアウトは無視してとりあえず作ってみた。
気をつけて欲しいのはインクルードのパス。
自分の環境に合わせて変えるのを忘れない様に！
Sublime textにEmmetを入れて使ってみた

先日の勉強会でEmmetが気になったので調べて、使ってみた。
結構使いやすい気がする。

1.Sublime textを導入
<pre>http://mnemoniqs.com/web/sublimetext2/</pre>

2.Emmetを導入
<pre>http://leko.jp/archives/442
上記サイトで導入について見るのは下記の部分だけw
<pre>SublimeText2<br>Package Controlは入っている前提で、<br>Ctrl + Shift + Pを押し、Install Packageを選択。<br>出てきたリストの中からEmmetを選ぶだけです。<br>数秒待てばインストールが完了し、もう準備完了です。</pre><br>基本的な使い方とかは下の方に記載されています。</pre>
rsyncで差分バックアップするスクリプトなど

# はじめに

レンタルサーバやVPSを借りていると<a href="http://support.sakura.ad.jp/mainte/mainteentry.php?id=14251">不意にデータが飛ぶ</a>ことがたまにありますよね。

そんなときに備えて自宅サーバにリモートサーバのデータを差分でバックアップしておけると安心です。

有償/無償/商用も含めて様々なソリューションがあると思いますが、自分はお手軽にrsyncだけで実施しています。

# 方針

リモートのサーバAから、手元のサーバBにバックアップします。

- リモートサーバA(IPアドレスaaa.bbb.ccc.ddd)
 - [cron]リモートサーバA内のバックアップ対象データを /for_backup/ に集める
- 手元のサーバB
 - [cron]rsyncで A:/for_backup/ を /remote_a_backup/latest に転送する
 - [cron]rsyncで /remote_a_backup/latest を /remote_a_backup/YYYYMMDD に差分バックアップする


# スクリプト

## リモートサーバA内のバックアップ対象データを /for_backup/ に集める

まあ適当に。

```bash:gather_for_backup.sh
#!/bin/sh
rsync --progress -av --delete /etc                     /for_backup/
rsync --progress -av --delete /data                    /for_backup
rsync --progress -av --delete /root/bin                /for_backup/root
rsync --progress -av --delete /var/lib/mysql           /for_backup/var/lib
...

# chown for rsync
chown -R takeuchi.rsync /for_backup
```

## rsyncで A:/for_backup/ を /remote_a_backup/latest に転送する

```bash:rsync_from_remote_server.sh
#!/bin/sh
rsync --progress -avz -e ssh --delete --bwlimit=150 takeuchi@aaa.bbb.ccc.ddd:/for_backup/ /remote_a_backup/latest
```

## rsyncで /remote_a_backup/latest を /remote_a_backup/YYYYMMDD に差分バックアップする

```bash:rotation.sh
#!/bin/sh
# 世代バックアップ

# ROTATE_DAYS : LATEST_DIR を含めて何世代バックアップするか
ROTATE_DAYS=30
#
BASEDIR=/remote_a_backup
LATEST_DIR=${BASEDIR}/latest/
NEW_DIR=${BASEDIR}/`date -d '-1 day' +%Y%m%d`/
LINK_DIR=${BASEDIR}/`date -d '-2 day' +%Y%m%d`/
OLDEST_DIR=${BASEDIR}/`date -d "-$ROTATE_DAYS day" +%Y%m%d`/

rm -rf $OLDEST_DIR
rsync -avz --progress --delete --link-dest=$LINK_DIR $LATEST_DIR $NEW_DIR
```

## crontab(ローカルサーバ)

```bash:crontab
0 7 * * * /remote_a_backup/rsync_from_remote_server.sh > /tmp/a-backup-rsync.log; /remote_a_backup/rotation.sh > /tmp/a-backup-rotation.log
```

本当はもう少し異常系の処理が必要とは思いますけど 30 日以内に気づくという前提で。。
Rails 4.0にcapybara セットアップメモ


([Rails 4.0 にturnipセットアップメモ](http://qiita.com/hmu29/items/df00c0c16aaac4c24e21)の続き)

# セットアップ

```rb
#Gemfile
group :test, :development do
  gem 'capybara'
end
```

```rb
# spec_helper.rb
require 'turnip/capybara' # turnipで利用する場合
```

# 基本系

```rb
step 'GETでアクセスする' do
  visit '/login' # GETのみ

  expect(page).to have_content("ほにゃらら")

end
```

```rb
step 'POSTでアクセスする' do
  page.driver.post('/login', {
	username: "ほにゃらら",
    password: "ほにゃらら"
    })

  expect(page).to have_content("ほにゃらら")
end
```

### 例外を試験する

```rb
step ":url へのルートがない " do |url|
  expect{ visit(url) }.to raise_error(ActionController::RoutingError, "No route matches ほにゃらら")
end
```

### responseがJSONの場合

```rb
visit(url)
json = JSON.parse(page.body)
```

かjson対応のgemをインストールする

# メソッドを確認する

 session.rb参照

https://github.com/jnicklas/capybara/blob/master/lib/capybara/session.rb

# rspecのmatcherを確認する

 matchers.rb参照

https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec/matchers.rb

# 参考

https://github.com/jnicklas/capybara/tree/master/lib/capybara