OmniAICreator/Qiita-1.07M huggingface dataset:
nsinit が上手く行かなくて困っていたら nsenter があまりにもあっさりだった件

[mog project: Docker: How to Run 'nsinit' in the boot2docker VM](http://mogproject.blogspot.com/2014/06/docker-how-to-run-in-boot2docker-vm.html) を `yungsang/boot2docker` で試してみたところ、`nsinit` でエラーが出てどうしても上手く行かなかった。
`failed to nsenter: drop capabilities operation not permitted`

本家の `boot2docker-cli + boot2docker.iso` では問題無く自分の環境でも上手く行くので、何が違うのか気になって調べてみることに。

**(ここまで昨日)**

**(ここから今日)**

1. NFS を入れて独自に `boot2docker.iso` をビルドしているので、一旦、本家と同じ状態で `boot2docker.iso` をビルドしてみた。=> エラーの表示が微妙に違うもののやはりエラーになって上手く行かず。
`failed to exec: bridge is not specified`

2. `boot2docker.iso` ビルド用のホストに boot2docker 自身を使っているので、まさかとは思ったが念の為、CoreOS でもビルドしてみる。=> `Dockerfile` からビルドする時点でエラーを吐いて `boot2docker.iso` をビルド出来ず。CoreOS はこういうのには向かないと。
`Cannot mknod: Operation not permitted`

その後、ubuntu や debian でやってみても全てダメ。
これはおかしいと、
[Docker の nsinit を CoreOS で試してみた - Qiita](http://qiita.com/yungsang/items/04e28433710554062451) をやってもダメ。

まさかと思って再度試したら `boot2docker-cli + boot2docker.iso` でもダメになって。。。

これは `go get github.com/docker/libcontainer/nsinit` で取ってくるソースの状態に左右されているな。

`boot2docker.iso` のビルドから何回もテストしたので、まる１日使ってしまった(´・ω・｀)

### ちなみに、
[Attaching to a container with Docker 0.9 and libcontainer](http://jpetazzo.github.io/2014/03/23/lxc-attach-nsinit-nsenter-docker-0-9/)
にもあるもう一つの方法、[nsenter](http://man7.org/linux/man-pages/man1/nsenter.1.html) を試してみたところ、`nsinit` よりも簡単にアタッチ出来ることを確認しました。
しかも、上記全てのケースで動作しました。

```
docker@boot2docker:~$ tce-load -wil util-linux
docker@boot2docker:~$ sudo nsenter --target $(docker inspect --format '{{.State.Pid}}' 7dab329c20b5) --mount --uts --ipc --net --pid
# ps
PID   USER     COMMAND
    1 root     nc -p 8080 -l -l -e echo hello world!
    8 root     -sh
   13 root     ps

# exit
docker@boot2docker:~$ 
```

`go` や `gcc` 等のでかいオブジェクトをダウンロード／インストールする必要も、ディレクトリへの移動も必要無くて、簡単にアタッチ出来るー

### ちなみに、
CoreOS に `nsinit` が搭載される予定はあるか聞いてみた。(nsinit がイケると思っていた昨日の朝のこと)
[Do you have a plan to bundle nsinit like toolbox in CoreOS? · Issue #696 · coreos/coreos-overlay](https://github.com/coreos/coreos-overlay/issues/696#issuecomment-47031991)

```
> > I just noticed that github.com/codegangsta/cli is not shipped inside of the
> > vendor directory. This is required by the nsinit tool
> > (docker/pkg/libcontainer/nsinit).

> The "nsinit" tool is not actually officially supported, and only
> exists for development purposes (which is why that dep isn't
> included).  Hopefully soon, the ability of nsinit to enter an existing
> container with a new command will become a standard feature (it is
> in-progress).
> 
> - Tianon

So nsenter is the way to go until upstream blesses nsinit as supported or provides alternate functionality that they do want to support.
```

とのこと。
今のところは `nsenter` の方が良さそうです。

次の版から `yungsang/boot2docker` に `nsenter` 標準搭載しようかな。
Use delegate in Swift

### protocol
```swift
protocol ControllerDelegate : NSObjectProtocol {
    func Controller(Controller: obj, clickedIndex index: Int);
}
```

### The variable for delegate
```swift
class Controller: UIView {
    var delegate:ControllerDelegate!;
    ...
```

### call delegate function like this
Now you donot need to point a function like @selector("function:name:")
Using respondsToSelector("function:name:") is OK

```swift
func buttonClicked(sender:UIButton) {
    if self.delegate.respondsToSelector("Controller:clickedIndex:") {
        delegate.Controller(self, clickedIndex:sender.tag);
    }
}
```
Application.persistentDataPath の場所


Unity Editor (Mac OS X) 

```
~/Library/Caches/<PlayerSettingsのCompanyName>/<Project名>/
```

各プラットフォーム別のディレクトリについての情報は以下のページが参考になる

[【Unity3D】ファイル保存パス - Qiita](http://qiita.com/bokkuri_orz/items/c37b2fd543458a189d4d)
SQLiteKit を使う




```csharp:sample.cs
// Application.persistentDataPath 取得したパス配下にDBファイルを作成する
var dbPath = System.IO.Path.Combine(Application.persistentDataPath, "test.db");
var db = new SQLiteDB();
db.Open(dbPath);

// 暗号化
db.Key("0x414243");

// CREATE TABLE
var qr = new SQLiteQuery(db, @"
CREATE TABLE IF NOT EXISTS test_data (
	id INTEGER PRIMARY KEY AUTOINCREMENT, 
	name TEXT, 
	role TEXT
);");
qr.Step();
qr.Release();
qr = null;

// INSERT
qr = new SQLiteQuery(db, @"
INSERT INTO test_data (
	name,
	role
)
VALUES (
	'taro',
	'programmer'
);");
qr.Step();
qr.Release();
qr = null;

// SELECT
qr = new SQLiteQuery(db, "SELECT * FROM test_data");
while(qr.Step()) {
	Debug.Log (string.Format ("{0}: {1} - {2}", query.GetInteger("id"), query.GetString("name"), query.GetString("role")));
}
qr.Release();
qr = null;

db.Close();
db = null;
```
Spray: 現在のURLを取得する方法


* [requierstUri](http://spray.io/documentation/1.2.1/spray-routing/misc-directives/requestUri/)で取ることができる。
* 現在のURIをもとに、別の完全なURLを作ることもできる。

```scala
    path("foo") {
      requestUri { uri =>
        val barURL = uri.withPath(Uri.Path("/bar")) // 別の完全なURLを生成
        complete(barURL.toString())
      }
    }
```

```http
HTTP/1.1 200 OK
Content-Length: 25
Content-Type: text/plain; charset=UTF-8
Date: Thu, 26 Jun 2014 03:18:49 GMT
Server: spray-can/1.3.1

http://localhost:8080/bar
```
「Material Design」を Android アプリに取り入れよう！


## はじめに
本稿では、Google I/O 2014 で発表された新しいUXの体系「Material Design」のガイドラインのうち、'比較的導入が容易なもの'とその導入方法について紹介します。

「Google Design」トップ
http://www.google.com/design/

「Material Design」紹介動画
https://www.youtube.com/watch?v=Q8TXgCzxEnw#t=31

## 文字サイズ
タイポグラフィの標準スタイルの中で、文字サイズの基本セットについて触れています。文字サイズは原則、12、14、16、20、34spを使いましょう！
http://www.google.com/design/spec/style/typography.html#typography-roboto

res/values/dimen.xml 内にこんな感じで文字サイズを定義しておくとよいと思います。

```xml:dimen.xml
<resources>

    <dimen name="textsize_xsmall">12sp</dimen>
    <dimen name="textsize_small">14sp</dimen>
    <dimen name="textsize_medium">16sp</dimen>
    <dimen name="textsize_large">20sp</dimen>
    <dimen name="textsize_xlarge">34sp</dimen>

</resources>
```

タブレット向けに文字サイズを変えたい場合はこちらの記事をどうぞ。
http://qiita.com/suzukihr/items/1a3204e6c713cf870f8d


## 画面レイアウト
スペーシングについてかなり詳細に説明されています。このあたりがきちんと守られていると美しい画面ができてユーザに好印象を与えられると思います。意図的にデザインをする場合を除き、このページを参考にレイアウト作成をしましょう！
http://www.google.com/design/spec/layout/metrics-and-keylines.html#metrics-and-keylines-keylines-and-spacing

尚、このページ以外でも、コンポーネンツのページで、スペーシングや View のサイズ・比率についてはかなり細かく触れていますのでご参考まで。


## 配色
今風のカラーパレットが紹介されていますので、ここにある色の組み合わせでアプリを彩りよくしましょう。
http://www.google.com/design/spec/style/color.html


## アクションバー
最近はトップにメイン画像を持ってきて、スクロールの動きに合わせてアクションバーにfadeの効果を入れる画面をよく見かけますね。こちらのライブラリが参考になると思います。
https://github.com/ManuelPeinado/FadingActionBar


![代替テキスト](http://material-design.storage.googleapis.com/images/style-typography5_large_mdpi.png "画像タイトル")
画像引用元ページ：http://www.google.com/design/spec/style/typography.html#typography-standard-styles


## ナビゲーション
左上のメニューを押して出てくるあれです（Navigation Drawer）。今回の変更で左から出すナビゲーションは ActionBar に重ねて出るようにするんですね。似たような動きをするライブラリもいくつかありますが、導入するならなるべく標準のものを入れましょう。

オフィシャルのドキュメントはこちら。
https://developer.android.com/design/patterns/navigation-drawer.html

ソースコードはこちら。
https://developer.android.com/training/implementing-navigation/nav-drawer.html

![代替テキスト](http://material-design.storage.googleapis.com/images/components-dividers-full-bleed-1b2_large_mdpi.png "画像タイトル")
画像引用元ページ：http://www.google.com/design/spec/components/dividers.html#dividers-types-of-dividers
Rails4でサポートされたPostgreSQLのhstoreを使う


rails4で正式にサポートされたPostgreSQLのデータ形式「hstore」を実際に扱ってみる。

基本的に[ここ(Using Hstore with Rails 4)](http://mikecoutermarsh.com/using-hstore-with-rails-4/)を訳しただけな内容だけど、ちょっと補足もあります。

## 最初の準備

PostgreSQLのhstore extensionを有効にする。

``` ruby
class AddHstoreSupport < ActiveRecord::Migration
  def up
    execute 'CREATE EXTENSION hstore'
  end

  def down
    execute 'DROP EXTENSION hstore'
  end
    
end
```

## hstoreのカラムを作る。
add_columnなりcreate_tableなりで自由にどうぞ

```ruby
add_column :users, :settings, :hstore
```

```ruby
create_table :users do |t|
	t.string :email
	......
	t.hstore :settings
end
```

## 実際に使うために
modelでhstoreで扱うキーのaccessorを設定する。
ActiveRecord::Storeを使うんだけど、http://api.rubyonrails.org/classes/ActiveRecord/Store.html に書いてあるようにPostgreSQLのhstoreやjson型を使う場合にはserializationとかしなくてもstore_accessorを設定すればよしなにやってくれる。

> NOTE - If you are using PostgreSQL specific columns like hstore or json there is no need for the serialization provided by store. Simply use store_accessor instead to generate the accessor methods. Be aware that these columns use a string keyed hash and do not allow access using a symbol.

validationも普通に使える。つまりhstore内のkey,valueをそれぞれ独立したカラムとして扱うことが可能になる。

```ruby
class User < ActiveRecord::Base  
  # setup hstore
  store_accessor :settings, :favorite_color, :time_zone

  # can even run typical validations on hstore fields
  validates :favorite_color,                            
    inclusion: { in: %w{blue, gold, red} }

  validates_inclusion_of :time_zone, 
    in: ActiveSupport::TimeZone.zones_map { |m| m.name }, 
    message: "is not a valid Time Zone"

end  
```

## Active Admin
store_accessorできちんと設定しておけばちょっとの変更でActive Adminでもhstoreを扱うことができる。

app/admin/users.rb

```ruby
ActiveAdmin.register User do
permit_params :email, ......., :favorite_color, :time_zone

form do |f|
  f.inputs  do
    f.input :email
	.........
    f.input :favorite_color
    f.input :time_zone
  end
  f.actions
end
```

checkboxとかを設定したい場合はFormtastic的に明示的に指定すればオッケー。

```ruby
f.input :is_free, :as => :boolean
```

booleanはデータベースにはテキストとして保存される。

```
settings: {"is_free"=>"0"}
```

## まとめ
PostgreSQL依存のデータ型なので使うのためらう感じもするけど、別にデータベース変える予定ないしという場合なら積極的に使っていくと便利な機能ではないかと。ER図みてもデータベース全体が見通せなくはなるけれど、Modelだけの修正で扱うデータが自由に変更出来るメリットは大きいと思います。

あと、store_accessorに気付くまではactive adminで「hstoreなんかしらねーよ」といわれて挫けそうでした。[このへん](http://goo.gl/zWTXNR)みると同じように泣いてる人が。store_accessor大事！
httpie: HTTPのストリームをデバッグする方法

[httpie]はデフォルトではHTTPリクエストが完了してからBodyを出力する。Server-Sent Eventsなど、ストリームのデバッグをするとき困る。ストリームを逐次表示させるには `--steram` オプションをつける。


```console
$ http -v localhost:8080/stream2 --stream
```

![httpie-stream.gif](https://qiita-image-store.s3.amazonaws.com/0/889/5a71e32e-5366-1928-a2ef-297a4f621a2d.gif "httpie-stream.gif")

[httpie]: https://github.com/jakubroztocil/httpie
NOT EXIST (SELECT…) を NOT IN (リテラルリスト) で置き換える事について

## 結果としては危険です

IN句の値リストにNULLが入ると結果がUNKNOWNになるためです。

データ数も少なくSQLも読みやすくなるのでいいかも～♪てか思った。
事前に関数で否定値集合リストを取得し値リストでSQLのNOT INに入れる。良いんじゃないかと調べたら結構なデメリットがありました。
否定値集合リストが無い場合、関数の返却値でNULLとする場合の動作が怖いです。
当初 NOT IN (NULL) で無効化されると想定したのですが、そうではありませんでした。

検証します。

```sql:返却が不正
mysql> select 1 in (null);
+-------------+
| 1 in (null) |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT 1,2,3 FROM dual WHERE 1 NOT IN (4,5,6);
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
1 row in set (0.00 sec)

mysql> SELECT 1,2,3 FROM dual WHERE 1 NOT IN (null);
Empty set (0.00 sec)

mysql>
```

PHP内でリテラルリストのNULL判定条件分岐を入れ忘れた場合の危険性を考えると使わない方が良さ気です。

## ちょっとだけ考えた事

```sql
-- SQL -- 結果
SELECT 1 in (1,2,3,4,5,null); -- 1
SELECT 6 in (1,2,3,4,5,null); -- NULL
SELECT 6 in (1,2,3,4,5); -- 0
SELECT 1 AND 1; -- 1
SELECT 0 AND 1; -- 0
SELECT 0 AND 0; -- 0
SELECT NULL AND 1; -- NULL
SELECT NULL AND 0; -- 0
SELECT NULL AND 0; -- 0
SELECT NULL AND NULL; -- NULL
SELECT NULL IS NULL AND NULL IS NULL; -- 1
SELECT NULL IS NULL AND 1 IS NOT NULL; -- 1
SELECT NOT NULL; -- NULL
SELECT NOT NULL AND NOT NULL; -- NULL
SELECT NOT NULL OR NOT NULL; -- NULL
SELECT NOT NULL OR 1; -- 1
SELECT NOT NULL OR 0; -- NULL
SELECT NOT NULL AND 1; -- NULL
SELECT NOT NULL AND 0; -- 0
mysql> SELECT 1, (select 1 from dual where 1 in (null)), (select 1 from dual where 1 in (null)) IS NULL;
+---+-------+-------+
| 1 |       |       | ← 省略しました
+---+-------+-------+
| 1 |  NULL |     1 |
+---+-------+-------+
1 row in set (0.00 sec)
```

もうヤケクソでコード叩きましたです。酷いもんです。
結果セットを積み上げて、TRUE > NULL > FALSE こんな優先順位で返却してるのかと思ったけど違うようです。
ロジック理解が面倒くさいので、こんなもんなんだと思うようにしました（諦めた）
スパッと論旨明快で簡潔に理解出来る方法ないものですかね…
参考リンクの4番目に解となるリンクを載せておきます。疑問に思った方は読むと面白いです。
同僚に教えていただけました。ありがとうございます！おかわりください！
ただし、個人的に、納得は、したくない。

## 参考リンク

どれも面白いです。是非読んで下さい。

1. MySQL の IN 句における NULL の扱いについて - しがないエンジニアの技術メモ http://d.hatena.ne.jp/harapeko_san/20111130/1322623529
1. EXISTS - オラクル・Oracleをマスターするための基本と仕組み http://www.shift-the-oracle.com/sql/exists-condition.html
1. NULL の特性 - オラクル・Oracleをマスターするための基本と仕組み http://www.shift-the-oracle.com/element/null/nulls-effect.html
1. 3値論理とNULL （1/3）：CodeZine http://codezine.jp/article/detail/532
いつも忘れちゃうjQueryの一致まとめ

毎回ググるので、自分用にまとめ。

#一致
nameがaddressのとき。

```js
$("[name='address']")
```

#否定
nameがaddressじゃないとき。

```js
$("[name!='address']")
```

#前方一致
nameがaddressから始まるとき。
address_prefectureとか。

```js
$("[name＾='address']")
```

#後方一致
nameがaddressで終わるとき。
first_addressとか。

```js
$("[name$='address']")
```

#部分一致
nameにaddressが含まれているとき。
address_prefectureとかfirst_addressとかfirst_address_prefectureとかどこでもいい。

```js
$("[name*='address']")
```
js-inherits

##継承について##
* sub.prototype = Object.create(sup.prototype, { constructor : {value: sub_name }});
* util.inherits(sub, sup);            // nodejs

##getter と setter の定義##
```js
Manager.prototype.__defineGetter__('sockets', function() {
	return this.of('/');
});
```
参考：
[Working with Objects](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects)
[bootstrap] radioにinput-lgをつけたときのラベル

大きいradioボタンを作るのに.input-lgをつけたらlabelの位置がずれてしまうので
修正したときのメモ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47343/3318e8ea-2f4a-70e4-9c6a-a13817f7bf24.png" width=50%>

##案１. btn-groupを使う
丸いradioボタンはボタン形式にしてしまう。
bootstrapでは
data-toggle="buttons"
を設定するとradioをボタングループのUIに変更できるのでそっちを選択。
ボタンの大きさは.btn-lgをつければ大きくなる

<img src="https://qiita-image-store.s3.amazonaws.com/0/47343/bf114972-6e45-7bec-864e-732fd4bf6634.png" width=70%>

```html:sample-btn.html
  <div class="btn-group" data-toggle="buttons">
    <label class="btn btn-default"><input type="radio" name="radio-btn" value="0">btnのradio0</label>
    <label class="btn btn-default"><input type="radio" name="radio-btn" value="1">btn is radio1</label>
  </div>
  <div class="btn-group" data-toggle="buttons">
    <label class="btn btn-default btn-lg"><input type="radio" name="radio-btn-lg" value="0">btnの大きいradio0</label>
    <label class="btn btn-default btn-lg"><input type="radio" name="radio-btn-lg" value="1">large btn radio1</label>
  </div>
```

##案２ スタイルを追加してがんばる
labelのテキストをspan要素にしてvertical-alineで調整
.input-lgはheightが46pxありradioに適用すると行間が開きすぎるのが気になったのでそこもちょっと調整
でも大きくなるのがちょっとだけだから少し寂しい。。。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47343/b665a860-81b0-09f6-03a5-abf8c1088492.png" width=50%>

```html:sample-radio.html
  <div class="radio-lg-box">
    <label><input class="input-lg" type="radio" name="raio-lg" value="0"><span>btnの大きいradio0</span></label>
  </div>
  <div class="radio-lg-box">
    <label><input class="input-lg" type="radio" name="raio-lg" value="1"><span>large btn radio1</span></label>
  </div>
```

```css:sample-css.html
  .radio-lg-box .input-lg {
    height: 25px;
  }
  .radio-lg-box label {
    cursor: pointer;
  }
  .radio-lg-box span{
    vertical-align: 5px;
    margin-left: 5px;
  }
```

#参考
bootstarap
http://getbootstrap.com/css/#forms-control-sizes
WordPress、カテゴリID/カテゴリ名/親カテゴリのIDを取得

WordPress、カテゴリID/カテゴリ名/親カテゴリのIDを取得
==========


■about
----------

WordPress、カテゴリID/カテゴリ名/親カテゴリのIDを取得




■code
----------

```php:php
< ?php
/* 現在のカテゴリ－の取得 */
$cat_now = get_the_category();
$cat_now = $cat_now[0];
/*親カテゴリーのID取得*/
$parent_id = $cat_now->category_parent;
/*現在のカテゴリーID/カテゴリー名取得*/
$now_id = $cat_now->cat_ID; /* カテゴリID */
$now_name = $cat_now->cat_name; /* カテゴリ名 */
?>
```




■reference
----------

WordPressでカテゴリID/カテゴリ名/親カテゴリのIDを取得する | OpenMediaLaboratory Blog / WordPressやiOS,Android,Mac,カメラ,プラモデルなど
http://blog.openmedialabo.net/2090
ADTに、Json Toolsをインストールしてみる

## 背景
* ADTで、jsonファイルなどを編集するときに、highlightなどがないので、不便利である
* Androidの初心者なので、うまくADTを使っていない

## 目的
* Json Toolsプラグインをインストールする
* ADTに、プラグインのインストール手法を習得する

## ADTとは
* Android Developer Tools の略称である
* バージョン：Build: v22.6.2-1085508 

## 手順
#### ADTに、プロキシ設定
これは、会社に、一番うるさい作業だ :angry: 

* Windows → Preferences → General → Network Connection
* Active Provider: Manual
* Proxy entries
 * HTTPとHTTPS両方を設定しないといけない
 * HTTPは、eclipse marketplace clientのインストールのために、使われる
 * HTTPSは、プラグインのホストへアクセスするために、使われる。たとえば、https://bitbucket.org/

#### Eclipse Marketplace Clientのインストール
* Help → Install New Software
* 「Add」を押す
 * Name: 任意
 * Location: http://download.eclipse.org/releases/juno
* OKをクリックして、Nextをクリックする
* 「Marketplace Client」を選択して、「Next」をクリックする
* ADTがリスタートされる

#### Json Toolsのインストール
###### 方法１
* http://marketplace.eclipse.org/から、Json Toolsを検索する
* 「Install」アイコンをADTプロジェクトへドラッグする

###### 方法2
* Help → Eclipse Marketplace
* Json Toolsを検索する
* 「install」ボタンをクリックする

## 参照
* [Eclipse Indigoのネットワーク設定](http://undertrees-lab.blogspot.jp/2011/08/eclipse-indigo_31.html)
* [Where is Eclipse Marketplace in Android SDK](http://www.google.com/url?q=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F17283486%2Fwhere-is-eclipse-marketplace-in-android-sdk&sa=D&sntz=1&usg=AFQjCNHkrg6Zl8N-Fbp7juvpmfqSbQ5byQ)
* [Eclipse Marketplace での便利なプラグインインストール方法](http://www.google.com/url?q=http%3A%2F%2Fqiita.com%2Ftakanorig%2Fitems%2F2d417c2fb52632fcb996&sa=D&sntz=1&usg=AFQjCNEeXJ8vGZ7dGJSpMLbIqhwEBTg4uA)
CentOS 7 RC インストール

以下より探します。
http://buildlogs.centos.org/centos/7/os/

私は以下をダウンロードしました。
http://buildlogs.centos.org/centos/7/os/x86_64-20140618/images/boot.iso

vmware等でisoからブートしました。
インストールを選択し、リストから日本語を選択し続行ボタン

右下のネットワークとホスト名を選択します。
画面右のオフをオンに切り替え、左上の完了ボタンで戻ります。

インストール先をクリックしますが、変更が無い為そのまま完了を選択します。

インストールソースを選択しネットワーク上(N)にチェックが付いていることを確認し
http://の右側の入力欄へ下記を入力します。
buildlogs.centos.org/centos/7/os/x86_64-latest/

そしてその画面の下の方にある+ボタンを選択しリポジトリを追加します。
右側の入力欄が有効になりますので、http://の右側の入力欄へ下記を入力し画面左上の完了ボタンで戻ります。
buildlogs.centos.org/centos/7/os/x86_64-latest/

ソフトウェアの選択をクリックし好きな構成を選択し、追加機能を選択し左上の完了ボタンで戻ります。
※私は最小限のインストールを選択しました。

以上完了したら、インストールが開始できるようになっているはずなので開始します。
インストール中にrootパスワードの作成及びユーザの作成が行えるので適当に作成します。

インストール途中でエラー終了してしまったので続きは別で。。。
joinコマンドでtab区切りファイルを扱う

SQLのJOIN的なことがコマンドだけで出来てしまう便利なjoinコマンド。
スペース区切りならそのまま、CSVなら`-t ,`で出来るけど、タブ区切りは`-t "\t"`や`-t '\t'`ではうまく行かない。

コンソールからそのまま打てるなら、`-t '<tab>キー'`と<tab>キーを実際に押す。
制御コマンドが押せないようになっているなら、`-t '<Ctrl+v><tab>キー'`で対応可能。

コメントより：
`-t "$(printf '\011')"` も使えます。この方がスマート！
はじめてのgulp.js


## インストール

まずはグローバルインストール。

```bash
npm install -g gulp
```


次に、プロジェクトフォルダでローカルインストール

```bash
npm install --save-dev gulp
```


グローバルとローカルを両方インストールする必要がある。

## タスクの作成

プロジェクトフォルダにgulpfile.jsを作成。
ここにタスクを記述する。

3つのタスクhello,hoge,defaultを登録してみる。

```javascript:gulpfile.js
var gulp = require('gulp');
gulp.task('hello',function(){
  console.log('hello wolrd!');
});

gulp.task('hoge',function(){
  console.log('hogehoge');
});
gulp.task('default',['hello','hoge']);

```

helloとhogeは引数に渡した関数を実行する。

defaultは引数に渡した配列で指定されたタスクを実行する。（helloタスクとhogeタスクを指定している)
このように、複数のタスクを実行させることができるが、並列処理されるので __実行順序は保証されない__。

## タスクの実行
`gulp タスク名`で実行する

```bash
gulp hello
gulp hoge
gulp default
```

gulpコマンドはタスク名を指定しないで実行すると、defaultという名前のタスクを実行しようとする。よって、defaultタスクの実行にはタスク名は省略可能。

```bash
# defaultタスクを実行
gulp
```

あとは、プロジェクトに応じて好きなタスクを作成していけばよい。
便利なプラグインがあるのでいろいろ探してみるとよい。
Rubyで認証付HTTPプロキシに対応する

# 背景(認証付プロキシとの戦い)

企業内のネットワークだとセキュリティのためにプロキシを利用してるところも多いと思う。
しかし、そういう環境で開発している人が少ないせいかライブラリのプロキシ対応は忘れられがちなようである。
さらに、認証付きのプロキシとなると対応されている範囲は狭くなる。

Rubyのgemでもよくプロキシ対応が無い場合があり、pull-requestして対応してもらったりしているが新しいライブラリが次々でてきてなかなか対応が追いつかない。

# 認証付HTTPプロキシ対応gemを作ってみた

## gem概要

上記のような理由から認証付プロキシに対応するgem([http_proxy_from_env](https://github.com/mechamogera/http_proxy_from_env))を作ってみた。
gemをinstallしてrequireすればNet::HTTPが環境変数(http_proxyとか)によってプロキシを利用するようになる。
Net::HTTPの挙動が変わるのでプロキシ未対応gemとかでも大丈夫なはず。

## 設計のアプローチ

最初は[env_http_proxy](https://github.com/chiastolite/env_http_proxy)というgemのようなアプローチを考えていた(というか既にgemがあった)。

しかし、[ruby 2.0.0のNet::HTTPにおいて環境変数からプロキシを利用する対応](https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/36476)が入っているのを見つけた。
環境変数からの読み込みに対応していてno_proxyも対応していたが、認証付プロキシには対応していなかった。
その変更があたっていなければ変更をあてる(認証付プロキシは変更があたっていてもいなくても対応)というようにしてみた。

今後Ruby側の変更で挙動がおかしくなる可能性はあるが、Net::HTTPそれなりに枯れてるから大丈夫かなとも思ったり。
あと、rubyの1.9.3と2.0.0あたりでしか動作確認してない。

## gemの使い方

簡単

* [http_proxy_from_env](https://github.com/mechamogera/http_proxy_from_env) gemをインストールする(bundlerでもgemコマンドでも)
* requireする

```rb
require 'http_proxy_from_env'
```

* 必要なgemをrequireしてコードを書く
crontabでdateコマンドを使う時の注意点

crontabで出力ファイル名に日付を使いたい時などにdateコマンドが使える。

注意点として、日付フォーマットを使う場合は%をエスケープする必要がある

```bash:crontab
4 0 * * * /foo/bar/hoge > hoge-$( date '+\%Y\%m\%d' ).log
```

エスケープしないとunexpected EOFとシンタックスエラーが出てしまう
AWS RDSの割り当てられているディスク容量を取得する。

呼び出しかた
`ruby rds.rb RDS名`

```rds.rb
##ライブラリのロード
require 'rubygems'
require 'aws-sdk'
require 'time'
require 'yaml'

#時間設定 5分間
StartTime = (Time.now - 300).iso8601
EndTime = (Time.now).iso8601

# 引数の受け取り
strRDS = ARGV[0]        # RDS名称

#AWS定義の読み込み
AWS.config(YAML.load(test.yml))

#####################################################################
#       RDS
#####################################################################
#RDSをNEWする
rds = AWS::RDS.new.client

# 割り当てられているディスクサイズ（バイト）を取得します
storage_space = rds.describe_db_instances(
         :db_instance_identifier => strRDS
)[:db_instances][0][:allocated_storage]

# 結果の表示
p storage_space

```

```test.yml
access_key_id: アクセスKey
secret_access_key: シークレットアクセスKey
auto_scaling_endpoint: autoscaling.ap-northeast-1.amazonaws.com
cloud_front_endpoint: cloudfront.amazonaws.com
cloud_watch_endpoint: monitoring.ap-northeast-1.amazonaws.com
emr_endpoint: elasticmapreduce.ap-northeast-1.amazonaws.com
elasticache_endpoint: ec2.ap-northeast-1.amazonaws.com
elastic_beanstalk_endpoint: elasticbeanstalk.ap-northeast-1.amazonaws.com
elastic_load_balancing_endpoint: elasticloadbalancing.ap-northeast-1.amazonaws.com
elastic_transcoder_endpoint: elastictranscoder.ap-northeast-1.amazonaws.com
ec2_endpoint: ec2.ap-northeast-1.amazonaws.com
iam_endpoint: iam.amazonaws.com
s3_endpoint: s3-ap-northeast-1.amazonaws.com
rds_endpoint: rds.ap-northeast-1.amazonaws.com
```
Jenkinsのインストール

◆インストール
リポジトリの作成
`sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo`

keyファイルのインポート
`sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key`

Jenkinsのインストール
`sudo yum install jenkins`

サービスの起動を実施
`sudo service jenkins start`

自動起動をON
`sudo chkconfig jenkins on`

◆画面設定

後で・・・・


◆導入プラグイン
以下のようなプラグインを導入しています。

Next Executions
　→ジョブの関連を表示します。
Timestamper
　→ビルド結果に時間を表示します。
Extra Columns Plugin
　→ビルドボタンやジョブ結果表示ボタンなどをつけられます。
Email-ext plugin
　→連続回数で失敗した場合にメールを送付するなど設定可能です。
Build Trigger Badge Plugin
　→各ビルドにトリガーとなった要因をバッジで[こんな感じ](https://wiki.jenkins-ci.org/display/JENKINS/Build+Trigger+Badge+Plugin)に表示します。
　　表示されるバッジの種類は
　　①ユーザにより手動実行
　　②上流ビルドからのビルドリレーによる実行
　　③SCMのポーリングによる実行
　　④定期実行
AWS RDSの情報を取得するスクリプト


呼び出し方
`ruby rds.rb RDS名称 取得項目 値の種類`

**取得項目**
CPUUtilization　　　　:CPU使用率
FreeStorageSpace　　:空きディスク容量
FreeableMemory　　　:空きメモリ容量
SwapUsage　　　　　　:SWAP使用量
ReadIOPS　　　　　　:読み込みIOPS
ReadLatency　　　　　:読み込みレイテンシ
ReadThroughput　　　:読み込みスループット
WriteIOPS　　　　　　:書き込みIOPS
WriteLatency　　　　　:書き込みレイテンシ
WriteThroughput　　　:書き込みスループット

***値の種類***
Average　　　　　　　:平均
Minimum　　　　　　　:最小
Maximum　　　　　　　:最大
Sum　　　　　　　　　　:合計
Data Samples　　　　　:サンプル

```lang:rds.rb
#!/bin/env ruby

##ライブラリのロード
require 'rubygems'
require 'aws-sdk'
require 'time'
require 'yaml'

#引数を変数に詰め込み
strRDS = ARGV[0]                # RDS名称
strMetric = ARGV[1]             # 取得する項目
strStatistics = ARGV[2]         # 取得する値の種類（最小、最大、平均等）


#時間設定 5分間
StartTime = (Time.now - 300).iso8601
EndTime = (Time.now).iso8601

#AWSの接続定義
AWS.config(YAML.load(File.read(test.yml)))

#################################################################
###       CloudWatch
#################################################################
#CloudWatchをNEWする
cw = AWS::CloudWatch.new.client

## メトリクス
value = cw.get_metric_statistics
(
        :namespace   => 'AWS/RDS',
        :metric_name => strMetric,
        :statistics  => [strStatistics],
        :dimensions  => [{ :name => "DBInstanceIdentifier", :value => st            rRDS }],
        :period      => 60,
        :start_time  => StartTime,
        :end_time    => EndTime,
)[:datapoints][0][:"#{strStatistics.downcase}"]

#結果の表示
p value

```

リージョンの一覧は下記URLをご覧ください。
http://docs.aws.amazon.com/general/latest/gr/rande.html

```lang:test.yml
access_key_id: アクセスKey
secret_access_key: シークレットアクセスKey
auto_scaling_endpoint: autoscaling.ap-northeast-1.amazonaws.com
cloud_front_endpoint: cloudfront.amazonaws.com
cloud_watch_endpoint: monitoring.ap-northeast-1.amazonaws.com
emr_endpoint: elasticmapreduce.ap-northeast-1.amazonaws.com
elasticache_endpoint: ec2.ap-northeast-1.amazonaws.com
elastic_beanstalk_endpoint: elasticbeanstalk.ap-northeast-1.amazonaws.com
elastic_load_balancing_endpoint: elasticloadbalancing.ap-northeast-1.amazonaws.com
elastic_transcoder_endpoint: elastictranscoder.ap-northeast-1.amazonaws.com
ec2_endpoint: ec2.ap-northeast-1.amazonaws.com
iam_endpoint: iam.amazonaws.com
s3_endpoint: s3-ap-northeast-1.amazonaws.com
rds_endpoint: rds.ap-northeast-1.amazonaws.com
```
iOS8で復活した設定画面へのURLスキーム

iOS8から設定画面へのURLスキームが可能になりました。
設定画面へのURLスキームはiOS5.0.1までは可能だったのですが、
iOS5.1以降ずっと禁じられていました。

設定画面へのURLスキームの方法と遷移先に関係するプリファレンス設定画面についてまとめました。

![iOSシミュレータのスクリーンショット 2014.06.25 21.39.55.png](https://qiita-image-store.s3.amazonaws.com/0/34488/3d06ada0-b538-a645-982d-b5805b95e17c.png)

(本記事の内容は[一般公開されているiOS8の情報](https://developer.apple.com/library/prerelease/iOS/navigation/)に基づいています。
iOS8に関するスクリーンショットは掲示していません。画像はiOS7のものです)

#設定画面へURLスキームするメリット
設定画面へアプリからURLスキームが可能になるメリットとして、
iOS標準のソーシャル機能やプッシュ通知をアプリ内で使われている方は、
ユーザが各機能の許可設定をしていない場合などに設定画面への遷移を促すことができます。

#方法
URLスキームをする方法はNSURLにUIApplicationOpenSettingsURLStringを指定してopenURLするだけです。

###Objective-C
```objc
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
```

###Swift
```swift
let url = NSURL(string:UIApplicationOpenSettingsURLString)
UIApplication.sharedApplication().openURL(url)
```


※注意
iOS8から使える機能であるため、iOS7以前のOSで実行する場合アプリが落ちる可能性があります。

###~~余談　iOS5.0時代での方法~~
iOS5.0.1では以下のコードで設定画面にURLスキームができました。
iOS7.1.1では何も動作しません。

```objc
NSURL *url = [NSURL URLWithString:@"prefs:root=General"];
[[UIApplication sharedApplication] openURL:url];
```

##おすすめ利用方法
機能が制限されているためユーザに設定変更を求めるときにダイアログで表示してあげると良いと思います。

```objc:Objective-C
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:@"設定画面で◯◯を許可してください。" preferredStyle:UIAlertControllerStyleAlert];

[alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
// 何もしない
}]];

[alertController addAction:[UIAlertAction actionWithTitle:@"設定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
    // 設定画面へのURLスキーム
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:url];
}]];

[self presentViewController:alertController animated:YES completion:nil];

```


#設定画面への遷移先
アプリがプリファレンス設定画面を持っているか否かでURLスキームの遷移先が異なります。
[プリファレンス設定画面](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html)とは設定画面の下部にある各アプリ毎の設定画面です。

| 条件                           | 遷移先                       |
|:------------------------------|:-----------------------------|
| プリファレンス設定画面を持っていない場合|設定画面のトップ                |
| プリファレンス設定画面を持っている場合　|設定画面内の自身のアプリの設定画面|

##iOS8では自動生成されるプリファレンス設定画面
iOS8からはプライバシー設定に関わる機能を利用している場合、自動的にプリファレンス設定画面が作成されます。
（例：カメラのプライバシー許可など）


#プリファレンス設定画面の作成方法
プロジェクトに以下の設定を実施することで設定画面のトップ下部にあなたのアプリの設定画面を作成できます。

手順：
1. Xcode→File→New→Fileを選択
2. iOSのResourceを選択
3. Setting Bundleを選択
4. 適当な名前で保存
5. アプリを実行

![スクリーンショット 2014-06-25 22.12.52.png](https://qiita-image-store.s3.amazonaws.com/0/34488/fd6ee830-f952-ac6d-fa65-baeb7bfcec8e.png)


以上の手順で設定画面内にあなたのアプリの設定画面が作成されます。
設定する項目についてはプロジェクト内に生成されたRoot.plistの要素を書き換えることで変更できます。

#参考
公式Class Reference
https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/doc/constant_group/Settings_Launch_URL
迷路作り名人

　いや〜はまってしまいました。幅優先、上手く書けないなぁ・・・。感覚を掴むまでが大事ですね。何度も書いてどう動いているか調べてみようと思います。

```java:
import java.util.*;
public class Main {
	
	int longestPath(String[] maze, int startRow, int startCol, int[] moveRow, int[] moveCol) {
		Queue<Integer> qx = new LinkedList<Integer>();
		Queue<Integer> qy = new LinkedList<Integer>();
		boolean[][] visit = new boolean[maze.length][maze[0].length()];
		
		qx.add(startRow);
		qy.add(startCol);
		int ans = -1;
		int count = 1;
		while(!qx.isEmpty()) {
			int nowX = qx.poll();
			int nowY = qy.poll();
			for(int r = 0; r < moveRow.length; r++) {
				int nextX = nowX + moveRow[r];
				int nextY = nowY + moveCol[r];
				if(nextX < 0 || nextY < 0 || nextX >= maze[r].length() || nextY >= maze.length) continue;
				if(visit[nextY][nextX] || maze[nextY].charAt(nextX) == 'X') continue;
				
				qx.add(nextX);
				qy.add(nextY);
				ans = Math.max(ans, count);
				count++;
				visit[nextY][nextX] = true;//訪れた事を記憶
			}
		}
		return(ans);
	}
	
	void doIt() {
		String[] maze = {
				"...",
				"...",
				"...",
				"...",
		};
		int startRow = 0;
		int startCol = 1;
		int[] moveRow = {1, 0, -1, 0};
		int[] moveCol = {0, 1, 0, -1};
		System.out.println(longestPath(maze, startRow, startCol, moveRow, moveCol));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}
	
}
```
未経験者にプログラミングを教えるとき

自分がやってみて、良かった事の共有

##プログラミングの入門の入門（追記）
・プログラムとは何かの説明として、「「入力」された情報を「加工」して「出力」するもの」だと言ってしまう。
・メカニズムの説明やサンプルコードの解説、改修のあとで、演習課題を出すときも、「入力」と「出力」を提示して、それを実現するように指示する。入力と出力の間を埋めることがプログラマーの仕事なのだと伝える。

##プログラミングの入門
・処理フローを考えることとコーディングは分けてやらせる
・やってはいけないのは、「変数」とか、「変数の宣言」、「データ型」、「コンパイル」といった新しい概念を利用することと処理フローを考えることを同時にやらせること。

自分がやるのは、
1.英語として読めば何となく分かる簡単なIF分岐のコード(C言語)を見せて、コンパイルして実行させる。
➡ソースコード、実行バイナリの区別をつけてもらう。
2.コード１行毎のざっくりした解説をして、処理フローをフローチャートにしたものを解説。
　・プログラミングの行為の脳内構成要素として、「処理フローの設計」と「言語の文法を利用して、処理を実現する」の２つがあることを理解してもらう。
3.IF-ELSE分岐までは、フローチャート課題を出して、解かして、でOK。個々人が「簡単」って思えるぐらいまで繰り返す。
4.LOOPは、分からない人は分からないので、インタラクティブにファシリテーションしながら、やる。
　・ここらあたりで、問題定義➡解決策の立案（アイデア出し）➡検証っていう問題解決のプロセスを体感してもらうといい。「フラグの利用」みたいなものも、知らない人にとってはイノベーションに近い「アイデア」
　・また、「フラグ」みたいな定石の存在も伝える。

☆最初は手続き型でいい。最初にちょっとプログラムを見せるのは、学習の目的を理解させるため。最初にCを使うのは、他の言語を学ぶ導入がし易いから。Javaの実行環境とは何か、をCと比較しながら説明できる。Rubyとかを教えるのでもそうだろう。

##変数と代入を馬鹿にしない。
　変数、データ型の概念と代入は、簡単だからさらっと終わらせてしまう人もいそうだけど、これは、しつこいほど、説明し、実際にコード書かせて実感させなければ、後で死ぬ。意外と分かっていない事多い。コンパイル、Hello World,変数とデータ型で1.5日くらい使っていい。

特に代入演算子「=」を算数と異なる。代入する処理であることを強調する。日本語で声に出して読ませて、必ず「右辺の結果から左へ代入する」と意識させる。

あと、演算子の評価ってこともイメージさせた方がよい

x=10

は分かっても、
y=5
x=10 + 20 + y

だとまた、「=」を「イコール」と脳内で解釈してしまうことが多い。人は混乱すると古い、自分が慣れた考え方に戻りたがる。
処理に利用される場合は、変数の中身が扱われることも教えるのと、演算子が評価される動きも丁寧に教えた方がいい。

「10 + 20 + y」は演算子が順に評価され、「30+y」⇨「35」となって、最後に「x = 35」が実行される、と脳内で処理の流れを追えるまで説明した方が良い。

※変数を評価すると値を返すタイプの言語はここら辺が統一的に理解できるから、初心者にはわかりやすいと思う。


##最初は詳細はいらない。
 例えば、データ型は、intとStringぐらいでいい。あまり多くは教えない。小数とか、細かく説明しだすと、何が重要か、分かんなくなる。本よめ、でいい。

##簡単なことでも、同じ事をくりかえさせる。
　例えば、コンパイル、変数の代入、IF分岐とか、は結構説明して、やらせればすぐできる。だからといって、すぐ次にいってはいけない。同じ事を何度もくりかえさせて、何も考えずできるぐらいまで体にしみ込ませてからじゃないと、進むにつれて、「一度に考えること」が多くなり苦しくなる。

##新しい概念を教えるときは、困らせてから、それを解決するアイデアとして教える。
メソッドを教えるときは、教える前にコピペで処理を書けるコードを書いてもらってから教える。問題を認識してもらってから、それを解決するアイデアとして教えるとすんなり入る。オブジェクト指向が難しいのは、小規模で単純なプログラムの場合、オブジェクト指向が解決する（しようとする）問題を認識するのが難しいから。

メソッドを教えるときに、メソッドの名前をサンプルでは分かり易くする。文章のように読めるように書けることを実感させる。加えて、時間があれば、ダメな命名（あいまい、間違っている、別の事をしている）、ダメなメソッドの作り方（副作用や、複数の事をしている等）を実例で示す。時間があれば、いい名前を考えるプチ演習や、ダメで、誤解を生む名前を考えさせるプチ演習をやると楽しい。

##オブジェクト指向入門
・オブジェクト指向とは、を最初に教えない。
　手続き型等のプログラミング言語の経験のない初心者にとっては、余り意味はない。帰って混乱させるだけ。。。
・オブジェクト指向は、オブジェクトを使わせて、そのメリットを理解させる。
　最初にクラスを作って。。。オブジェクト指向とは、って言ったって、何が便利なのか分からない。それよりも、ライブラリを使わせて、Stringを「文字列クラス」とそのインスタンスと説明したり、Listを「リストクラス」とそのインスタンス、と説明した方がすぐ分かる。
オブジェクトを作って、使うのが、OOPと理解させる。
・理解してもらってから、自分で、作ってみましょう、としてクラスの定義等をやる。できれば、最初に、完成したクラスを提供して、使ってみてから、クラス定義の解説等をやるのがいい。
・オブジェクト指向の諸概念はクライアントコードの立場を考えないと、意味が分からない。。。使い手にとって便利で、間違えにくくするために、クラスを定義することを教える。setterを公開するか否か、という簡単な問いについてはセンスのある新人なら考えられる。

##意図的にエラーを発生させる
学校の優等生的な新人は、間違いを犯さないことを過度に重視する。だから、エラーを恐れる。ただ、意図的にエラーを起こす事が結構有効な技術検証の手段であったりする。だから、正解を問う演習だけでなく、エラーを起こす演習も取り入れると理解が深まるし、学校のお勉強の呪縛を解くのにもいいと思う。

##こんなやつも
[プログラミングを最初に学ぶ時に知っておきたいテーブル駆動方式](http://qiita.com/masatsugumatsus/items/fec1b6b8b831056f8bc7)
Unicode::Japaneseのインストール失敗をなんとかしてみた

Unicode::Japanese を入れようとしたらエラーしたので
その解決策の記録。

# 大正義cpanmでこける

```bash
$ cpanm Unicode::Japanese
Result: FAIL
Failed 4/33 test programs. 5/1456 subtests failed.
make: *** [test_dynamic] エラー 255
-> FAIL Installing Unicode::Japanese failed. See /home/ymko/.cpanm/work/1403711176.7952/build.log for details. Retry with --force to force install it.
```

# 素直にbuild.logを見る

```text:build.log

**** CONFIGURE ****
Can't locate ExtUtils/Embed.pm in @INC

 >> It seems we can't compile XS module in this environment.
 >> Reason : the C compiler exited with non-zero status 256
 >> disableXS...

at t/v038_guess_imode2.t line 29.
  is($xs_loaderror, '', "load success");
at t/v041_sjisau.t line 29.
  is($xs_loaderror, '', "load success");
```

どうやら、XSが無効になっていることでテストがエラーしている様子
具体的にはExtUtils/Embed.pmが無いかららしい。

# 無ければ入れればいいじゃない？

```bash
$ cpanm ExtUtils::Embed
skipping R/RJ/RJBS/perl-5.20.0.tar.gz
```

なぜか入らない？
ならばローカルにダウンロードして入れてみる。

```bash
$ wget http://search.cpan.org/CPAN/authors/id/D/DO/DOUGM/ExtUtils-Embed-1.14.tar.gz
$ cpanm ExtUtils-Embed-1.14.tar.gz
! Installing ExtUtils-Embed-1.14.tar.gz failed. See /home/ymko/.cpanm/work/1403713519.8320/build.log for details. Retry with --force to force install it.
```

やっぱり入らない。

```text:build.log
Can't locate ExtUtils/Embed.pm in @INC
```

ビルドの時点で自分自身が必要という矛盾。

```bash
# yum install perl-ExtUtils-Embed
```

# 再度

```bash
$ cpanm Unicode::Japanese
--> Working on Unicode::Japanese
Fetching http://www.cpan.org/authors/id/H/HI/HIO/Unicode-Japanese-0.49.tar.gz ... OK
Configuring Unicode-Japanese-0.49 ... OK
Building and testing Unicode-Japanese-0.49 ... OK
Successfully installed Unicode-Japanese-0.49
1 distribution installed
```

入りました。以上。
[車輪の再発明]固定長文字列の解析 バイト単位での文字の切り出し

この間作ったのは文字の長さで切り出していいたのでバイト単位で切り出せるように改造。

全角文字と半角文字が混在しているような文字列はこれでいけるはず。
そもそもインターフェースとして全角半角が混ざったものを固定長データでやりとりするのをやめさせるのが先決だと思うけど念のため作っておく。

追記）
UTF-8で処理するように書いたけどUTF-8の日本語は3～4バイトに定義されているので意図しない位置で切り出す可能性があるのを注意する必要がある。Shift_JISとかEUC-JPとか使ったほうが良さげ。

```java:FixedLengthStringByteParser.java
package tools;

import java.nio.charset.Charset;
import java.util.Objects;

/**
 * 固定長文字列パーサ
 */
public class FixedLengthStringByteParser {

	/** 固定長文字列のバイト配列 */
	private final byte[] source;
	/** 文字コード */
	private final Charset charset;
	/** 現在位置 */
	private int position = 0;

	/**
	 * コンストラクタ
	 * @param source 固定長文字列
	 * @param charset 文字コード
	 */
	public FixedLengthStringByteParser(String source, String charset) {
		Objects.requireNonNull(source);
		Objects.requireNonNull(charset);
		this.charset = Charset.forName(charset);
		this.source = source.getBytes(this.charset);
	}

	/**
	 * 次の文字列を切り出す
	 * @param length 長さ
	 * @return 切り出した文字列
	 */
	public String next(int length) {
		if (length < 1) {
			return null;
		}
		if (position >= source.length) {
			return null;
		}
		String ret = null;
		if (position + length > source.length) {
			int len = source.length - position;
			ret = new String(source, position, len, charset);
			position += length;
			return ret;
		}
		ret = new String(source, position, length, charset);
		position += length;
		return ret;
	}

	public static void main(String[] args) {
		// UTF-8の日本語は全角３バイト
		// （全角４バイトにも漢字が定義されているので注意）
		FixedLengthStringByteParser parser = new FixedLengthStringByteParser("1あbcd文字列", "UTF-8");
		System.out.println(parser.next(4));
		System.out.println(parser.next(3));
		System.out.println(parser.next(3));
		System.out.println(parser.next(7));
		System.out.println(parser.next(5));
	}
}
```
hubot-scriptのエイリアス

最近、hubotのスクリプトばかり作ってる気がするが、今回は[hubot-alias](https://github.com/dtaniwaki/hubot-alias)を作ってみた。

例えば、[hubot-browserstack](https://github.com/ngs/hubot-browserstack)は`hubot screenshot http://www.google.com`のように使うけど、`screenshot`って打つのめんどくさいよね、でもオリジナルのrepoは短い名前に対応してくれそうにないよね、という時にこれ使います。

`hubot alias scst=screenshot`とhubotに教えると、次回から`hubot scst http://www.google.com`でhubotが応えてくれるようになります。

aliasを消す時は`hubot alias scst=`でaliasのリストを見る時は`hubot alias`

単純なhubot-scriptだけど、まあまあ使えるかも。

ちなみに仕組みは[hubot-privilege](https://github.com/dtaniwaki/hubot-privilege)とほとんど同じ。
hubotの`receive`関数をフックしてます。
Rails4 | 新規・変更機能リスト

# Rails4 | 新規・変更機能リスト

## 概要

Rails4で新規追加、変更された機能をリストアップします。

## 一覧

|対象|URL|
|:-------|:-----|
|NullRelationの追加|http://qiita.com/tbpgr/items/0896a364d8b362f95dee|
|where.notによる否定クエリ|http://qiita.com/tbpgr/items/8802dfc9af9e838ec4ca|
|pluckが複数カラムを受け取り可能になった|http://qiita.com/tbpgr/items/ec3b31c422885de371c0|
|名前付きscopeはlambda記法のみを許容|http://qiita.com/tbpgr/items/0b621854900c132d8a42|
|update_attributes が update に変更|http://qiita.com/tbpgr/items/e43cc47261397bff5852|
|update_columnsの追加|http://qiita.com/tbpgr/items/3411261026d5642915f5|
|ActionController::Liveを利用したリアルタイム通信を試す|http://qiita.com/tbpgr/items/bd780ac8c1a0c1cb1a33|
|マスアサインメント機能と脆弱性とStrong Parameters|http://qiita.com/tbpgr/items/63028f5e19a2d1617e40|
Rails4 | 新規・変更機能 | ActionController::Liveを利用したリアルタイム通信を試す

# Rails4 | 新規・変更機能 | ActionController::Liveを利用したリアルタイム通信を試す

## 概要

Rails4では手軽にPush型通信を行えるActionController::Liveが追加されたので試してみます。

## 前提
RailsのデフォルトのWebサーバーである、WEBricはリアルタイム通信に対応していないので、
pumaを利用して試します。

## サンプル

### 仕様

* 下記で *scaffold* した状態をベースとする

~~~bash
rails g scaffold person name:string age:integer
rake db:migrate
~~~

テーブルには以下のデータが登録されています

~~~bash
$ select * from people;
1|tanaka|20|2014-06-25 23:45:12.555117|2014-06-25 23:15:55.737728
2|suzuki|19|2014-06-25 23:45:30.476800|2014-06-25 23:15:50.489037
~~~

* Personテーブルに 'honda' という名前のデータが登録されているか監視します。

### サンプルコード

* Gemfileに *puma* を追加

~~~ruby
gem 'puma'
~~~

* *bundler* で *puma* をインストール

* Controllerを作成

honda_check_controller.rb

~~~ruby
class HondaCheckController < ApplicationController
  include ActionController::Live

  def index
    response.headers['Content-Type'] = 'text/plain'

    created = false
    loop do
      Person.uncached do
        honda = Person.where(name: 'honda')
        if honda.size > 0
          response.stream.write("honda is created\n")
          created = true
        else
          response.stream.write("honda is not created\n")
          sleep(rand(3))
        end
      end
      break if created
    end
  rescue IOError
  ensure
    response.close
  end
end
~~~

* routes に HondaCheckController のルーティング情報を追加

routes.rb

~~~ruby
  get 'honda_check' => 'honda_check#index'
~~~

* サーバーを起動します。

~~~bash
puma
~~~

* クライアントからcurlで接続してリアルタイム通信を開始します

'honda' はまだ登録されていないので 'honda is not created' が表示され続けます

~~~bash
$ curl localhost:9292/honda_check
honda is not created
honda is not created
honda is not created
:
:
~~~

* DBに *honda* を登録します

~~~
sqlite> insert into people(name, age) values ('honda', 24);
sqlite> select * from people;
1|tanaka|20|2014-06-25 23:45:12.555117|2014-06-25 23:15:55.737728
2|suzuki|19|2014-06-25 23:45:30.476800|2014-06-25 23:15:50.489037
10|honda|24||
~~~

* 'honda' の登録を検出し、 'honda is created' が表示され、処理が終了しました

~~~bash
$ curl localhost:9292/honda_check
honda is not created
honda is not created
honda is not created
:
honda is created
$ 
~~~
Rails4 | 新規・変更機能 | update_columns の追加

# Rails4 | 新規・変更機能 | update_columns の追加

## 概要

*update_columns* は *update* (旧 *update_attributes* ) よく似たメソッドで、
対象カラムを変更する点は同じですが、 *validation* や *hook* を実行しません。

## サンプル

### 仕様

* 下記で *scaffold* した状態をベースとする

~~~bash
rails g scaffold person name:string age:integer
rake db:migrate
~~~

### サンプルコード

* *scaffold* した状態の *PeopleController* の *update* メソッドの内容を下記のように変更します

~~~ruby
def update
  respond_to do |format|
    if @person.update_columns(person_params)
      format.html { redirect_to @person, notice: 'Person was successfully updated.' }
      format.json { render :show, status: :ok, location: @person }
    else
      format.html { render :edit }
      format.json { render json: @person.errors, status: :unprocessable_entity }
    end
  end
end
~~~

* Personモデルに *before_update* の設定を追加します

~~~
class Person < ActiveRecord::Base
  before_update ->{ logger.info 'before_update' }
end
~~~

### update_columns を実行

* http://xxxxx:3000/people/<任意のid>/edit をリクエストし、適当な値で更新を実行

更新が反映されているが、 *before_update* フックが呼び出されていないことをログから確認できます。
Rails4 | 新規・変更機能 | update_attributes が update に変更

# Rails4 | 新規・変更機能 | update_attributes が update に変更

## 概要

*update_attributes* が *update* というシンプルな名前に変更になりました。
ただし、 *update_attributes* は今まで通り使用可能。

## サンプル

### 仕様

* 下記で *scaffold* した状態をベースとする

~~~bash
rails g scaffold person name:string age:integer
rake db:migrate
~~~

### サンプルコード

* *scaffold* した状態の *PeopleController* の *update* メソッドの内容を確認します

~~~ruby
def update
  respond_to do |format|
    if @person.update(person_params)
      format.html { redirect_to @person, notice: 'Person was successfully updated.' }
      format.json { render :show, status: :ok, location: @person }
    else
      format.html { render :edit }
      format.json { render json: @person.errors, status: :unprocessable_entity }
    end
  end
end
~~~

* Personモデルに *before_update* の設定を追加します

~~~
class Person < ActiveRecord::Base
  before_update ->{ logger.info 'before_update' }
end
~~~

### update を実行

* http://xxxxx:3000/people/<任意のid>/edit をリクエストし、適当な値で更新を実行

更新が反映され、ログで *before_update* フックの呼び出しを確認します。
以下は、フックのログ。

~~~
before_update
~~~
Rails4 | 新規・変更機能 | 名前付きscopeはlambda記法のみを許容

# Rails4 | 新規・変更機能 | 名前付きscopeはlambda記法のみを許容

## 概要

Rails3以前では名前付き *scope* には2通りの記法がありました。

~~~ruby
class SomeModel < ActiveRecord::Base
  # lambdaを使わない記法
  scope :scope_name, where('condition > 10')
  default_scope where('condition > 20')
  # lambdaを使う記法
  scope :scope_name, -> { where('condition > 10') }
  default_scope { where('condition > 10') }
end
~~~

Rails4では *lambda記法* のみを許容します。
（実行タイミングの誤解を防ぐため）

## サンプル

### 仕様

* 下記で *scaffold* した状態をベースとする

~~~bash
rails g scaffold person name:string age:integer
rake db:migrate
~~~

テーブルには以下のデータが登録されています

~~~bash
$ select * from people;
1|tanaka|20|2014-06-25 23:45:12.555117|2014-06-25 23:15:55.737728
2|suzuki|19|2014-06-25 23:45:30.476800|2014-06-25 23:15:50.489037
~~~

### サンプルコード

* *scaffold* した状態の *PeopleController* の *index* メソッドを下記のように変更します

~~~ruby
  def index
    case params['age_type']
    when 'minority'
      @people = Person.minority
    when 'adult'
      @people = Person.adult
    else
      @people = Person.all
    end
  end
~~~

* Personモデルに *scope* の設定を追加します

~~~
class Person < ActiveRecord::Base
  scope :adult, -> { where('age >= 20') }
  scope :minority, -> { where('age < 20') }
end
~~~

### 成人のデータをリクエストする

* http://xxxxx:3000/people?age_type=adult をリクエスト時

画面には以下のようなレコードが表示されます

~~~
tanaka  20  Show  Edit  Destroy
~~~

### 未成年のデータをリクエストする

* http://xxxxx:3000/people?age_type=minority をリクエスト時

画面には以下のようなレコードが表示されます

~~~
suzuki  19  Show  Edit  Destroy
~~~

### 成人・未成年をリクエスト

* http://xxxxx:3000/people をリクエスト時

画面には以下のようなレコードが表示されます。  

~~~
tanaka  20  Show  Edit  Destroy
suzuki  19  Show  Edit  Destroy
~~~
Rails4 | 新規・変更機能 | where.notによる否定クエリ

# Rails4 | 新規・変更機能 | where.notによる否定クエリ

## 概要

Rails3以前では否定のクエリを記述する際に下記のようにする必要がありました。

~~~ruby
if age.nil?
  Person.where('age IS NOT NULL')
else
  Person.where('age <> ?', age)
end
~~~

Rails4では *where.not* が追加され、下記のようにシンプルに記述できるようになっています。

~~~ruby
Person.where.not(age: age)
~~~

## サンプル

### 仕様

* 下記で *scaffold* した状態をベースとする

~~~bash
rails g scaffold person name:string age:integer
rake db:migrate
~~~

* *index* へのリクエスト時に Query String に *age* を指定することで対象 *age* を指定

テーブルには以下のデータが登録されています

~~~bash
$ select * from people;
1|tanaka|24|2014-06-25 23:45:12.555117|2014-06-25 23:45:12.555117
2|suzuki|25|2014-06-25 23:45:30.476800|2014-06-25 23:45:30.476800
3|sato||2014-06-25 23:48:59.710500|2014-06-25 23:48:59.710500
~~~

※ sato の age は null

### サンプルコード

* *scaffold* した状態の *PeopleController* の *index* メソッドを下記のように変更します

~~~ruby
def index
  @people = Person.where.not(age: params['age'])
end
~~~

### age が 24 以外のデータを検索

* http://xxxxx:3000/people?age=24 をリクエスト時

画面には以下のようなレコードが表示されます

~~~
suzuki san  25  Show  Edit  Destroy
~~~

### age を指定しないで（nil）で検索

* http://xxxxx:3000/people をリクエスト時

画面には以下のようなレコードが表示されます。  
nilの分岐を作成していませんが、新たな文法により正常に表示されています。  

~~~
tanaka  24  Show  Edit  Destroy
suzuki  25  Show  Edit  Destroy
~~~
Rails4 | 新規・変更機能 | pluckが複数カラムを受け取り可能になった

# Rails4 | 新規・変更機能 | pluckが複数カラムを受け取り可能になった

## 概要

Rails3.2で追加された *pluck* メソッドが複数のカラムを受け取れるようになった。
*pluck* メソッド自体については、ActiveRecordを返却せずにカラムの値を配列として取得することによって
パフォーマンスが要求される場面で利用される。

## サンプル

### 仕様

* 下記で *scaffold* した状態をベースとする

~~~bash
rails g scaffold person name:string age:integer
rake db:migrate
~~~

~~~bash
$ select * from people;
1|tanaka|24|2014-06-25 23:45:12.555117|2014-06-25 23:45:12.555117
2|suzuki|25|2014-06-25 23:45:30.476800|2014-06-25 23:45:30.476800
3|sato||2014-06-25 23:48:59.710500|2014-06-25 23:48:59.710500
~~~

### サンプルコード

~~~ruby
Person.all.pluck(:name, :age)
~~~

### 出力

~~~
[["tanaka", 24], ["suzuki", 25], ["sato", nil]]
~~~
Rails4 | 新規・変更機能 | NullRelationの追加

# Rails4 | 新規・変更機能 | NullRelationの追加
## 概要
Rails4では ActiveRecord に NullRelation が追加された。
任意の条件の時だけ空の結果を返したい場合など、通常の結果が返却された場合と同様に
メソッドチェインを利用できる。（最終的には空値が返却される）
いわゆる、 **Null Object Pattern** 。

*none* を利用した際は、SQLが発行されないためパフォーマンスの意味でも好ましいです。

## サンプル

### 仕様

* 下記で *scaffold* した状態をベースとする

~~~bash
rails g scaffold person name:string age:integer
rake db:migrate
~~~

* *index* へのリクエスト時に Query String に *disable* キーがあれば *none* を。なければ *all* を返却する。
* *Person* の *name* には敬称 *san* を付与する。

### サンプルコード

* *scaffold* した状態の *PeopleController* の *index* メソッドを下記のように変更します

~~~ruby
  def index
    @people = params['disable'] ? Person.none : Person.all
    logger.info "params['disable'] = #{!!params['disable']}"
    logger.info "@people = #{@people.class}"
    @people = @people.map { |person| person['name'] += ' san';person }
  end
~~~

### all 呼び出し時

* http://xxxxx:3000/people をリクエスト時

ログは以下のようになります

~~~bash
params['disable'] = false
@person = Person::ActiveRecord_Relation
  Person Load (0.6ms)  SELECT  "people".* FROM "people"   ORDER BY "people"."id" ASC LIMIT 1
~~~

画面には以下のようなレコードが表示されます

~~~
tanaka san  24  Show  Edit  Destroy
suzuki san  25  Show  Edit  Destroy
~~~

### none 呼び出し時

* http://xxxxx:3000/people?disable=true をリクエスト時

ログは以下のようになります。

~~~bash
params['disable'] = true
@people = Person::ActiveRecord_Relation
~~~

SQLを実行していないため、SQLのログが出力されていません。

画面にはレコードが表示されません。
AndroidのアニメーションでfillAfterが効かない場合

fillAfterが効かなくてちょっと焦ったのでメモ

このxmlのアニメーションは「fillAfter=true」にしてるが効かない

```xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="400"
        android:fillAfter="true"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toYScale="0.5"
        android:toXScale="0.5"></scale>
</set>
```

fillAfterをsetタグの方に設定するとちゃんと効く

```xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <scale
        android:duration="400" 
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toYScale="0.5"
        android:toXScale="0.5"></scale>
</set>
```


またはsetを外してscaleだけにする

```xml
<?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="400"
        android:fillAfter="true"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toYScale="0.5"
        android:toXScale="0.5">
</scale>
```

どうも親タグにfillAfterつけないといけないみたいですね…