OmniAICreator/Qiita-1.07M huggingface dataset:
ggrksと英語でコメントしたい時


”ちょっとくらい調べてからにしてくれよ”、を簡潔に表す言葉 **ggrks**。
これを英語でいうと何になるんだろうとふと疑問に思い調べてみました。


# You are so shit.

英語ネイティブの同僚に尋ねたら、

>You are so shit.

という回答をもらいました。
"ちょっとは自分で調べようね"という **ggr**の部分の意味合いが完全に消し飛んでしまい、奥ゆかしさに欠けますが、反面 **ks**の部分は強調されています。

# RTFM (Read The F***ing Manual)

続いて、先輩から

> RTFM (Read The F***ing Manual)

との回答をもらいました。Fワードですね。
直訳で **マニュアル読めや**になるので、 **ggr**とはちょっと異なりますが、
Manualの部分を変えることで、応用が効くようです。

> ex) RTFS (Read The F***ing Source/ソース読めや)

類似のものに
> UTSL (Use the Source, Luke/ソースを使うのだ、ルーク)

というのもあるようです。

# GIYF (Google Is Your Friend)
最後に、同僚から

> GIYF (Google Is Your Friend)

との回答をもらいました。
直訳で、 **グーグルは君の友達**。
**ggr**の部分は完全マッチしてますね。 **ks**の部分はなりを潜めマイルドな仕上がりになっています。
なかなかいいんじゃないでしょうか。


# 追記
ほかにもそれっぽいのを見つけたので追記。

> JFGI (Just Fxxing Google It)


これらのワードは喧嘩にならないよう十分考慮して使いましょう。
GoogleAppEngineのPHPサンプルをとりあえずデプロイまで。

無料試用期間を利用してGoogleCloudPlatformを触りだして、とりあえずAppEngineでPHPを試してみようと『今すぐAppEngineを試す』てところで言われた通りに進めているとエラーが出て中々思う様に行かなかった為、とりあえずメモ。

ちなみに、PHPは今までOn/Offともに触ったことがない。

---

#対象
- GoogleCloudPlatformのAppEngineでPHP動かしたい人。

#環境
- Windows7 Home SP1
- GoogleCloudPlatformの60日試用期間中

#手順
##GoogleCloudPlatformでAppEngineを作成する。  
GoogleDevelopersConsoleのTOP画面でプロジェクトを作成する。 プロジェクト名はとりあえずhelloworld-20150702（プロジェクトIDも同じ）で作る。 作成する際に詳細設定があるが、特に気にしない。

もちろん、プロジェクト名はお好きなものでどうぞ。

##AppEngineお試しページへ
プロジェクトを選択して`コンピュート/App Engine/ダッシュボード`に移動すると、

- ドキュメントライブラリにアクセス
- 今すぐApp Engineを試す

の2つがある。  
とりあえず動かす環境を作りたいという気持ちからすぐにでも出来そうな`今すぐApp Engineを試す`を選択する。  
これで`今すぐGoogleAppEngineをお試し下さい`という、すぐにでも始められそうなページにたどり着く。

##PHPのデプロイ
###1.言語を選択します
PHPなのでPHPを選択。

###2.スターターコードを確認します
`Hello, world!`の部分を好きに変更できそうだけれど、特に変更できない。 とりあえずRunボタン的なのを押すと`Hello, world!`が表示されるのはわかる。

###3.GOOGLE CLOUD SDKのインストール
言われるがままにダウンロードしてインストール。 そして、コマンドプロンプトを起動してGoogle Cloud PlatformにLoginする。

```
> gcloud auth login
```

上のコマンドを打ち込むとしばらくしてからGoogleのログイン画面に遷移する。 とりあえず承認。 コマンドプロンプトに戻るとログインしたアカウント等が表示されている。

 次はAppEngineパッケージをインストールするらしいので、指示されるまま以下のコマンドを打ち込む。

```
> gcloud components update gae-python
```

落ちた。

GoogleCloudSDKがインストールされているディレクトリに対して権限が無いとか何とか書いている。 コマンドプロンプトを管理者権限で実行しなければならないらしい。

コマンドプロンプトを一旦終了して、管理者権限で再実行。 再Login。 そして先程実行できなかったコマンドを再実行する。 問題なく実行出来て、続行するか確認されるので`Y`で続行。 Updateが始まるのでしばらく待つ。

```
Update Done!
```

と表示されれば、おそらく正常終了。

###4.サンプルアプリのダウンロード
zipをダウンロードして適当なところへ解凍。 とりあえず、デスクトップで。

###5.プロジェクトにデプロイ
先ほど解凍したディレクトリの内容をデプロイする。 指示される以下のコマンドを打ち込む。

```
> appcfg.py -A helloworld-20150702 update appengine-try-php
```

エラー。

`appengine-try-php.yaml`が無いと怒られる。 カレントディレクトリの変更を忘れていた。 先ほど解凍したディレクトリの中に移動して、コマンドを再度実行。

エラー。

PHP5.4のアプリケーションはデプロイ出来ないらしい。 する場合は申請が必要（？）とか何とかというメッセージが表示される。 PHP5.4より上のバージョンを指定しなければならないらしい。 先程解凍したディレクトリの中に含まれる`app.yaml`を開く。

```:app.yaml
application: helloworld
version: 1
runtime: php
api_version: 1

handlers:
- url: /.*
  script: helloworld.php
```

これの`runtime`の部分を`php55`に書き換える。

```:app.yaml
application: helloworld
version: 1
runtime: php55
api_version: 1

handlers:
- url: /.*
  script: helloworld.php
```

保存して再度デプロイを実行。

エラーは出ずに成功。 指示されているURLにアクセスすると、`Hellow, world!`が表示されている。

更にダッシュボードを確認すると、今デプロイしたアプリの情報が表示される。

---

PHPのバージョンを指定するところで一番ハマった。 しかし、エラーになるのならサンプルのファイルを修正してくれても良いのだけれど…。 と、思ったら、以下のページのチュートリアルではバージョン指定がされていた。 うーん…。

[GoogleCloudPlatform AppEngine PHP](https://cloud.google.com/appengine/docs/php/)

次はPythonとかJavaも試してみよう。
Android画像サイズ

## Android 画像サイズ
|dpi|size|1pixel|
|---|---|---|
|ldpi|320x426|x0.75|
|mdpi|320x470|x1|
|hdpi|480x640|x1.5|
|xhdpi|720x960|x2|
|xxhdpi|1080x1440|x3|
|xxxhdpi|1440x2550|x4|
Boto 3 で、指定した key が指定した bucket の中にあるかを確かめるには

Boto 3 では、Boto 2 の頃まであった key の存在をたしかめる `exists()` にあたるメソッドが無くなっています。ですが、以下のように `list_objects()` を使うことで同様の機能を実現できます。

```exists.py
from boto3 import Session
s3client = Session().client('s3')

def exists(bucket: str, key: str) -> bool:
    """
    指定した key が指定した bucket の中に存在するか

    :param bucket: (str) bucket name
    :param key: (str) key
    :return: (bool)
    """
    contents = s3client.list_objects(Prefix=key, Bucket=bucket).get("Contents")
    if contents:
        for content in contents:
            if content.get("Key") == key:
                return True
    return False

```

## 解説
`list_objects()` は以下のような形のハッシュを返します。

```py3
{
    'IsTruncated': True|False,  # 結果が寸断されたか。されていれば True
    'Marker': 'string',
    'NextMarker': 'string',
    'Contents': [
        {
            'Key': 'string',
            'LastModified': datetime(2015, 1, 1),
            'ETag': 'string',
            'Size': 123,
            'StorageClass': 'STANDARD'|'REDUCED_REDUNDANCY'|'GLACIER',
            'Owner': {
                'DisplayName': 'string',
                'ID': 'string'
            }
        },
    ],
    'Name': 'string',
    'Prefix': 'string',
    ＜略＞
}
```

`'Contents'` がキモで、ここに該当する key の配列が入ります。該当する key がないと `'Contents'` は返り値に含まれません。したがって、`'Contents'` が含まれるかを調べて、そのリスト内の辞書の `'Key'` の値と、引数で与えた `key` が一致するものがあれば `exists()` にあたる機能を再現できます。

`Prefix` に key のフルパス？　を指定するのは若干違和感を覚えますが、Prefix とはそういうものだと理解しました。

##### 2017/06/29 追記
以下のケースで正しく動作しないことがあったので、修正しました (thx, @masahiro_toriumi さん)
> Prefixはあくまでもキーの接頭辞を指定するものなので、例えば、"MyBucket/aaa.txt"というPrefixでlist_objectをコールした場合、"MyBucket/aaa.txt.bak"などにも引っかかるため、"MyBucket/aaa.txt"というキーが存在するかどうかは正確には判断できない
シェルスクリプトでインタラクティブシェルか確認する

スクリプトで、インタラクティブシェルから起動されたのか、バッチで起動されたのか判断したい事が稀にある。

test コマンドに -t というオプションがある。
このオプションは、ファイルデスクリプタ番号が端末に関連付けられていれば真を返す。

```shell:sample
if [ -t 0 ];then
    echo its terminal session!
else
    echo its not terminal session...
fi
```

0,1,2のstdin, stdout, stderr が端末に関連付けられているかを確認すればそれがインタラクティブセッションかどうか確認できる。

っていう事を、FreeBSDのportsnapコマンドのfetchサブコマンドがやってました。
iOS 9で強化されたMapKit

<i>※本記事は、[一般に公開されている情報](https://developer.apple.com/videos/wwdc/2015/?id=206)を元に作成しています。記事中の画像はWWDCのスライドのものを引用させて頂いております</i>


WWDC 2015で発表された iOS 9 では MapKit も色々と強化されています。以下にその内容をまとめます。

# Improvements to Existing API

## ピンの色をカスタマイズできるように

iOS 8までは「赤」「緑」「紫」しか選択できませんでしたが、iOS 9
からは好きな色を設定できるようになりました。

```Swift
@availability(iOS 9.0, *) var pinTintColor: UIColor!
```

## Calloutをカスタマイズできるように

Calloutというのは、地図上のピンをタップした時に表示される「吹き出し」のようなアレです。


![スクリーンショット 2015-07-02 22.26.48.png](https://qiita-image-store.s3.amazonaws.com/0/8292/bf5caf41-4bda-b756-0038-d842dc8c3dcc.png "スクリーンショット 2015-07-02 22.26.48.png")

Calloutについては、これまでも

* タイトル
* サブタイトル
* 右側に表示されるアクセサリービュー
* 左側に表示されるアクセサリービュー

をカスタマイズすることができました。

iOS 9からは新たに

```Swift
@availability(iOS 9.0, *) var detailCalloutAccessoryView: UIView?
```

が追加され、Calloutの詳細部分までカスタマイズできるようになりました。

これにより、Calloutに画像を入れたりテキストビューなんかも表示できるようになりました。

![スクリーンショット 2015-07-02 17.47.19.png](https://qiita-image-store.s3.amazonaws.com/0/8292/ea22afea-7032-5fcb-a5c8-079644039d41.png "スクリーンショット 2015-07-02 17.47.19.png")

## Mapのカスタマイズ性向上

* 交通状況を表示できるように（showsTraffic）
* スケールバーを表示できるように（showScale）
* コンパスを表示できるように（showsCompass）

![スクリーンショット 2015-07-02 22.42.22.png](https://qiita-image-store.s3.amazonaws.com/0/8292/81d3f26f-ba55-f04a-53bc-a958d0099d67.png "スクリーンショット 2015-07-02 22.42.22.png")

## その他

* CLGeocoder
* MKLocalSearch

がTime zoneサポート。

# Transit

iOS 9の「マップ」アプリから乗換案内機能（日本は未対応）がサポートされましたが、MapKitでもこの機能が使えるようになりました。

目的地の情報をセットし、

```Swift
openInMapsWithLaunchOptions:
```

メソッドを実行することで、次のようなナビ画面が表示されるようです。（WWDCでのデモより）

![スクリーンショット 2015-07-02 18.17.32.png](https://qiita-image-store.s3.amazonaws.com/0/8292/b94e04f4-b6fd-d49e-ccd5-e3becd8b5203.png "スクリーンショット 2015-07-02 18.17.32.png")

# Flyover

これまで `MKMapType` は

* Standard
* Satellite
* Hybrid

の3種類だけでしたが、これに

* SatelliteFlyover
* HybridFlyover

が追加されました。

`SatelliteFlyover` では次のような通常のFlyoverビューが、

![スクリーンショット 2015-07-02 23.07.37.png](https://qiita-image-store.s3.amazonaws.com/0/8292/6b301166-22bc-22bd-b00c-beaccbc3e1a8.png "スクリーンショット 2015-07-02 23.07.37.png")

`HybridFlyover` ではラベル表記も併せたビューが表示されるようです。

![スクリーンショット 2015-07-02 23.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/8292/6cc48b77-6c56-9b27-b535-7cff60c1a60d.png "スクリーンショット 2015-07-02 23.07.52.png")

# リンク集

* [What's New in MapKit](https://developer.apple.com/videos/wwdc/2015/?id=206) - WWDC 2015 VIDEO

----
本記事は http://blog.koogawa.com/entry/2015/07/03/000000 でも公開しております。
bashで自作コマンド作る時の最小テンプレ



必須オプションあり、ファイルか標準入力を入力とする形のコマンドを自作する際のテンプレ。

```bash
#!/bin/bash

# ヘルプ出力関数
usage(){
cat << _EOS_
  Usage:
    $(basename $0) [-f] <-d data> file
    $(basename $0) <-h|--help>
_EOS_
}

# オプション解析で使う変数の初期化
FLAG=0
DATA=""

# オプション解析
OPTS=$(getopt -o "fd:h" -l "help" -- "$@")
[ $? -ne 0 ] && usage >&2 && exit 1
eval set -- "$OPTS"
while :; do
    case "$1" in
    '-f') FLAG=1; shift;;
    '-d') DATA=$2; shift 2;;
    '--') shift; break;;
    '-h'|'--help')usage; exit 0;;
    *) echo "[error] illegal option" >&2; usage >&2; exit 1;;
    esac
done

# 必須オプションの確認
[ -z "$DATA" ] && echo "[error] missing option '-d'" >&2 && usage >&2 && exit 1

# 入力を変数に受ける
if [ $# -eq 0 ] && [ ! -t 0 ]; then
    INPUT=$(cat -)
elif [ $# -eq 1 ]; then
    INPUT=$(cat $1)
else
    echo "[error] missing input" >&2
    usage >&2
    exit 1
fi

# Main
# 以下、メインの処理
```

## 更新履歴
+ 2015/07/04
getoptのエラー拾うのを忘れてました。
getopt結果を一旦変数に入れるようにして、`[ $? -ne 0 ] && usage >&2 && exit 1`を追加。
Eclipse Oomph のドキュメント日本語訳: Contents-Infrastructure


Eclipse の新しいインストーラーであり，ワークスペースのプロビジョニングまで担えるらしいです…が，イマイチ用語の整理が自分の中でできていないので整理中．
[前回](http://qiita.com/Mura-Mi/items/4a7019d164b9911ba866) の続きです．

以下のページの全訳です．わかりづらい，間違っているなどあったらご指摘ください．
http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.oomph.setup.doc%2Fhtml%2Fconcepts%2FDocInfrastructure.html&cp=56_1_2

---

# インフラストラクチャ
スコープ (訳注: 前回参照) に加えて，セットアップ情報の作成と保守をするために重要な構成要素がいくつかあります．

## 1. インデックス
インデックス (index) とは，プロダクトカタログやプロジェクトカタログ (訳注: 前回参照) のコンテナです．インデックスを通じてすべてのタスクモデルにアクセスをすることが可能であり， Oomph を通じて入手可能なプロダクトやプロジェクトは，すべてインデックスを通じててにはいります．Oomph のセットアップウィザードを動かすにはインデックスが必要です．また，インデックスはタスクの実装を提供する動的な Ecore モデルへの参照も保持しています．インデックスはインストールリソース (訳注: 前回参照) に保管されます．

## 2. ロケーションカタログ
ロケーションカタログ (localtion catalog) は，Oomph によってインストール，またプロビジョニングされるインストールやワークスペース (訳注: ここでいうのは Oomph の Scope としてのインストールやワークスペース) を保持しています．ロケーションカタログは双方向マップを保持しています．つまり，特定のインストールされた Eclipse ごとに，その Eclipse が開いたワークスペースを記録しており，反対にワークスペースごとに，そのワークスペースを開いた Eclipse を記録しています．Oomph がインストールされた Eclipse を開くたびに，この双方向マップに Eclipse とワークスペースのペアを追加します．このマップ内のペアは順序立てられており，最も最近インストールされたか起動された Eclipse がトップに移動され，その Eclipse に紐づくワークスペースがトップに来るようになります．同様に，ワークスペースと Eclipse のマップも順序立てられており，同様に開かれたワークスペースが先に来るようになります．ロケーションカタログはロケーションリソース (location resource) に保管されます．

## 3. カタログセレクション
カタログセレクション (catalog selection) は， Oomph のセットアップウィザードによる Eclipse インストールとプロビジョニングの履歴を保持しています．具体的に，保持しているのは以下の情報です．

(訳注: 箇条書きの箇所は省略)

言い換えれば，セットアップウィザードはその永続化された初期状態を保持しています．カタログセレクションはカタログセレクションリソース (catalog selection resource) に保管されています．

---

途中から，「Installation」は「インストールされた Eclipse」と訳してしまえばよかったと気づきました．気になったら前回分含めて治そうかな…
そして，このページは訳さずともだいたいイメージがつかめたなぁ，と思ってしまった…
GCEにsshクライアント(ubuntu)から接続

# ***gcloudで接続できるようにする***

* sshの横のポッチを押してメニューからgcloudコマンドを表示をクリック  
![image](https://qiita-image-store.s3.amazonaws.com/0/84915/1aae5cff-9cbd-0007-17a9-c3cbf1e74571.png)

- すると以下のウィンドウが出ます。  
![image](https://qiita-image-store.s3.amazonaws.com/0/84915/9812f034-0e1d-f0e5-d8f9-5fc026c7e560.png)
  
  

* ウィンドウの下にgcloudリファレンスのリンクがあるのでクリック  
以下の手順書が開きます。
https://cloud.google.com/compute/docs/gcloud-compute/?hl=ja

* 手順書に従い以下のコマンドをubuntuのtermから実行

> curl https://sdk.cloud.google.com | bash

* 正常にインストールができたらtermを再起動
curlでエラーが出るようならcurlをapt-get installしていないか、proxyが通ってない可能性があるので設定してください。

* 再起動したtermで

> gcloud auth login

を実行すると、Googleアカウントとのヒモ付ができます。(ブラウザが開いてアカウントを選択する)
* もしブラウザが表示されない場合、手順２に従って

> gcloud auth login --no-launch-browser

を実行し、表示されるURLをブラウザに入れれば行けるのかな？

* gcloudが正常にインストールされていたら、最初のウィンドウに表示されていた

> gcloud compute --project なんちゃら

のコマンドをtermから入力すると、compute engineに接続できます。
WordPressのカスタムフィールドで「数字」として並び替える

WordPressで記事を取得する際、カスタムフィールドに入力した値で並び替えたい場合があります。

しかし、

```php
$results = get_posts(array(..., 'orderby' => 'meta_value'));
```

としてしまうと、カスタムフィールドが「文字列」として評価されてしまい、2よりも10の方が先に来てしまいます。カスタムフィールドを数字として評価するには「**meta_value_num**」を利用します。

```php
$results = get_posts(array(
  'orderby' => 'meta_value_num',
  'meta_key' => 'price',
  'order' => 'asc'
));
```
プロパティ追加時にxcodeのinfo.plistがわかりづらかった

#発生事象
info.plistを開くと、、、
![Screen Shot 2015-07-02 at 21.59.31.png](https://qiita-image-store.s3.amazonaws.com/0/59560/1da67177-df7f-d95c-8a2a-d0cd03149f08.png)

あれ？？「＋」ボタンがない！
![Screen-Shot-2015-07-02-at-21.59.31.jpg](https://qiita-image-store.s3.amazonaws.com/0/59560/89378c38-adf2-e9dc-1497-65108318a512.jpeg)

他はあるのに何で？
![Screen-Shot-2015-07-02-at-22.01.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/59560/1bedd91e-c506-a039-df20-428546080e07.jpeg)

#解決策
一番下にあるプロパティを選択する（**▶︎は閉じたまま**→これポイント）
![Screen Shot 2015-07-02 at 21.59.46.png](https://qiita-image-store.s3.amazonaws.com/0/59560/fc5db15e-ef41-4bef-d6e7-d1b60d6844c1.png)


このときに「＋」ボタンを押すと追加される！！
![Screen Shot 2015-07-02 at 21.59.56.png](https://qiita-image-store.s3.amazonaws.com/0/59560/bbb528c0-c03e-719c-b104-85bcc8ff8de9.png)
!importantと継承

基本的に、CSSでは「最後の手段」とすべき`!important`ですが、かけ方によっては効かないこともありえます。意図的に`!important`をかける際にも注意が必要です。

# 事象
ある処理を組んでいる過程で、「`body`にあるクラスをかけると、ページ全体でマウスカーソルが砂時計になる」という機能を実装しようと考えました。そこで、

```css:失敗例
body.some-class{
  cursor: wait !important;
}
```

というようにCSSをかけました…が、（明示的に`cursor`をかけたものを除いて）一部の要素ではマウスカーソルが別な形となったままでした。

# 原因
さすがに動きとして気になったので、Chromeのデベロッパーツールで追いかけてみると、`body`から継承した`cursor`は、ばっちり上書きされていました。…**`input`要素などの、デフォルトスタイル**に。

どうやら、`!important`が付いたプロパティでも、継承された時には通常のプロパティとなってしまうようでした。

# 対策
ひとまず、全要素に対して`!important`をかけることにして解消しました（例はSCSSです）。

```scss:改善例
body.some-class{
  cursor: wait !important;
  *{
    cursor: wait !important;
  }
}
```

# その他
CSSで`cursor:wait`としても、カーソルの見た目が変わるだけで、ふつうに**操作は可能な**ままです。操作自体を無効にするには、別途の手段が必要です。
PlayのReadsの文法的意味(Scala)

Playでjson扱うときによく見る下のようなコード。いったい何やってるんだ？

```scala
import play.api.libs.json._

class Person(name: String)

implicit val reads = (
  (__ \ 'name).read[String]
)(Person)
```

Scala初心者の自分にはさっぱりわからず調べたので、メモ書き。


```scala
(__ \ 'name)
```
この、「__」これは[play.api.libs.json.package.scala](https://github.com/playframework/playframework/blob/2.4.x/framework/src/play-json/src/main/scala/play/api/libs/json/package.scala)に以下のようにJsPathのエイリアスとして定義されてる。

```
val __ = JsPath
```

play.api.libs.json._をインポートすることでこのエイリアスがきくようになってるので、以下の二つは同じ意味。

```scala
(__ \ 'name)
(JsPath \ 'name)
```

ってことでこの部分はJsPathの「\」メソッドの呼び出しってことになるので、以下と同じ。

```
(JsPath \ ('name))
```

初心者には何が書いてあるのか理解しにくいコード。
サンプル見れば使うことはできるんだけど、文法理解できたほうが楽しい。
TSFとは


= Timing Synchronization Function
802.11でAP-ST間での通信中の動機を取るための仕組みである。

AP起動時にリセットされ、その後1usec単位でカウントアップされる64bit変数であるっぽい。
というのも、ググった結果なので、どこかで定期的にリセットされるのかもしれない。
参考：[OFDM WIreless LANs](https://books.google.co.jp/books?id=p_rMm2l237gC&pg=PA244&lpg=PA244&dq=TSF+beacon+reset&source=bl&ots=Zex5Sa37G5&sig=yOZpYBLJyEyXZr_B4OVh2uyv_5g&hl=en&sa=X&ei=aaiHVdjVMoLQmwX5qoCQDw&ved=0CC0Q6AEwAw#v=onepage&q=TSF%20beacon%20reset&f=false)


# ドライバから触れるもの？

## Atheros
Atheros用のLinuxドライバではtsf〜という変数がソース内に見て取れるので、もしかしたらリアルタイムにtsf値の確認が可能なのかもしれない。ただ、Linux自体がそんなにRTではないので、何を見ているかがぼやける可能性は大きいと思う。
たとえば[ここ](http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/wireless/ath/ath9k/beacon.c)とか。

## Marvell
Marvellのチップでは、なかなかTSFのキーワードに引っかからないということは、チップの外から観測することはできないのかもしれない。
そもそもDataSheet見てないからなんとも言えないんだけど。
参考：[MarvellのWLAN Subsystem](http://wiki.laptop.org/images/f/f3/Firmware-Spec-v5.1-MV-S103752-00.pdf) 


# 所感
...という、たいして探してもいない、何の情報にもならない覚書でした。

おわり。
Amazon Linux AMI on EC2でPython2.7のバッチをnohupで流す

EC2 + Amazon Linux AMIでのpython環境構築について調べていたのですが、時期によって情報に錯綜があって混乱したので、個人的にまとめ。

2015年7月頭時点の「Amazon Linux AMI 2015.03」では、python2.7がデフォルトになってるみたいですね。

```console
sudo yum -y update
python --version
> Python 2.7.9
```

ただ、pipでpandasを入れようとして、いろいろ足りないとかエラーが。makeとかgccとか別途入れる必要あるようで。以下でそれっぽいもの一通り入れてくれます。

```console
sudo yum -y groupinstall "Development Tools"
sudo pip install pandas
```

ついでに。

nohupしてバッチぶん投げて帰って家で状況確認しようと思って、以下のようにいつもの感じでnohup付きで実行したら、tail -f してもprintの結果とか何にも出てこない。

```console
nohup python my.py > out.log 2>&1 &
```

以下によると、デフォルトだと処理終了までバッファされちゃうので、-uをつけろってことみたいですね。

[stackoverflow: Python - Nohup is not writing log to output file](http://stackoverflow.com/questions/12919980/nohup-is-not-writing-log-to-output-file)

-uをつけて、無事期待通りの挙動をしてくれております。

```console
nohup python -u my.py > out.log 2>&1 &
```


オプションの詳細については[本家のリファレンス](http://docs.python.jp/2/using/cmdline.html
)で。

```console:-u
stdin, stdout, stderr のバッファを強制的に無効にします。関係するシステムでは、 stdin, stdout, stderr をバイナリモードにします。
```
GCEでhadoopインスタンスを作る

### **Google Compute Engineのhadoopについてメモ**

環境構築をサボれるので今回はクイックデプロイを使ってみました。
![image](https://qiita-image-store.s3.amazonaws.com/0/84915/d81132be-2325-d36d-9a49-4024a5e70333.png)

サーバスペックを選択して、ポチっとすると簡単にインスタンスが生成されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/84915/c477c4bd-cce5-d5a1-544b-5043717eca04.png)

hadoopは、
Operating system
Debian 7 backports
となっていました。
ubuntuと同じDebian系なので少し楽かも？
と思ってsshしてllをするとコマンドありません。

色々と設定をしていく必要がありそうです。

ブラウザからのssh接続はcompute engineのVM　インタンスを選択した画面のsshをクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/84915/f6bbc9b5-4a18-78f4-13cf-862370fb1328.png)

sshクライアントからの接続は調べたら更新します。。。
k-meansでクラスタリングしたら失敗したけどどうしよう（kernel k-meansの実装）

# この記事は何？
クラスタリングのアルゴリズムで代表的なものとしてk-meansというものがあります．
k-meansは非常に単純なアルゴリズムであるため，残念なクラスタリング結果となってしまうことがあります．
そこで，この記事ではデータ空間を非線形関数によって高次元に写像しクラスタリングを行うkernel k-meansの実装を紹介します．

# k-meansの失敗例
以下のデータをk-meansでクラスタリングを行ってみました．

* クラスタリング前

![origin.png](https://qiita-image-store.s3.amazonaws.com/0/58543/3785111b-0017-8a81-f4bf-b7b1859630b3.png)


* クラスタリング後

![linear.png](https://qiita-image-store.s3.amazonaws.com/0/58543/122741f6-4e42-94e5-fff4-cf94bdbf2b5d.png)


ジーっと見てみると，中央部分と外側部分とでクラスタが2つ存在しているように見えますが，k-meansのクラスタリング結果は直線で区切ったようなものとなっています．

# kernel k-means
kernel k-meansではデータ空間を非線形関数によって高次元に写像し，クラスタリングを行います．
つまり，データ点を$x\in X$，非線形関数$\phi$としたときに，$\phi(x)$に対しクラスタリングを行います．
非線形関数$\phi$の選び方は様々なものが考えられますが，$\phi$を選択するよりもカーネル関数$k(x_i,x_j)=\phi(x_i)^T\phi(x_j)$を選択することが多いです（カーネル法）．

カーネル関数には以下のようなものがあります．

* 線形カーネル　$k(x_i,x_j)=x_i^Tx_j$
* 多項式カーネル $k(x_i,x_j)=(x_i^Tx_j+\gamma)^c$
* ガウスカーネル $k(x_i,x_j)=\exp(-\gamma\cdot\||x_i-x_j\||^2)$

線形カーネルを選択すると，k-meansと等価となります．

# kernel k-meansによるクラスタリング
先程のデータに対しkernel k-meansでクラスタリングを行ってみました．
カーネル関数にはガウスカーネルを，$\gamma$の値には0.1を設定してみました．
ソースコードは[ここ](https://github.com/szdr/KernelKMeans)にアップロードしました．

![kernel.png](https://qiita-image-store.s3.amazonaws.com/0/58543/b5a7bc38-392e-6521-681c-9d12d62d6049.png)


中央部分と外側部分とでクラスタリングできていることがわかります．

# その他
k-means，kernel k-meansは初期値に大きく依存するアルゴリズムであるため，いつもこのようにクラスタリングできるわけではありません．
kernel k-meansではカーネル関数の選択およびハイパーパラメータの設定を行う必要があるのがメンドウです…．

(2015/7/2 微妙に図が異なっていたのを修正)

# 参考文献

* [The Global Kernel k-Means Algorithm for Clustering in Feature Space, F. Grigorios, et al.](http://www.cs.uoi.gr/~arly/papers/TNN09b.pdf)
czmlの概要

どうも、cesiumのczmlのドキュメントは少ない。
簡単にいえば、kmlのcesium版であり、cesiumはkmlも使えるが
リアルタイム表示を考えるとczmlがお勧めである。

本家の英語はここだ。
https://github.com/AnalyticalGraphicsInc/czml-writer/wiki/CZML-Guide

czmlは１つのファイルだけではなく、packetのように
データを追加していくこともできるのがkmlとけっこう違う。

さらに、時間推移もできるので、データ構造が複雑である。

基本となるコマンドは
billboard
label
path
である。
これでpath上にbillboard(icon)とlabel(text)が
移動する定義を書くことができる。

この３つは同じ
position
を参照し、

    "position":{
      "epoch":"2008-07-01T12:00:00Z",
      "cartographicDegrees":[
            0,137.0,41.0,10000.0,
            200,137.0,42.0,10000.0,
            400,138.0,42.0,10000.0
      ]
    }

というように0,100,400秒後の位置を定義すること
により移動を定義することができる。

さらに、この時点でわからなかったデータを
"epoch"で次のデータがわかった時点でczmlの読み込み
を追加することで、このpathを延長することもできる。

さらには、pathは最初ceciumのバージョンでは定義の
全ての経路を表示していたが
今ではleadTimeとtrailTimeを指定することにより
表示している周辺だけのpathを表示できるようになった。

なかなか３Ｄビューアとしては有用なツールなので日本語
紹介が多くなるといいなあとか思っている。
SourceTreeでgitのhookがエラーになってしまった場合の対応


例えば、`pre-commit` などで `gulp jshint`するなどしていた場合にPATHが通らなくてエラーになってしまいます。
どうやら、GUIから使うシェル全般の話らしく、[調べた結果](http://stackoverflow.com/questions/17538460/using-git-pre-commit-hooks-in-context-of-github-client/17557522#17557522)こんな感じでshell scriptに書いておけば問題なくなりました。

```sh
#!/bin/sh
#
# Pre-commit hooks
PATH="/usr/local/bin:$PATH"
... # 処理
```

結局どうもちゃんとGUIからだと`$PATH`を見てくれないっていう話らしいっすね。
vimでバイナリを編集する


# はじめに

ときどき、ファイルヘッダ内容の確認などで、バイナリ情報をみたり、少し変更してみたりしたいときってありますよね。
でも、時々なので、いっつも忘れてしまうんです。


Windowsだと昔から [PowerWitch the Royal](http://www.vector.co.jp/soft/win95/util/se161737.html) というのを使っています。起動時のスプラッシュだけオフにすれば、満足しています。

Macでは[0xED](http://labs.torques.jp/2010/10/09/1411/)を。

vimでバイナリを確認したいなぁと思ったら、いっつもググって用が終わったら忘れてる気がするので、メモっておこうかと。


# vimでバイナリを編集する

```vim
$ vim -b file.bin
:%!xxd
```

バイナリダンプ表示になるので編集します。（右側のASCII表示は更新されません！わぉ）

編集が終わったら、元に戻します。
よく%を忘れてしまうので注意。

```vim
:%!xxd -r
```

ちなみに、xxd -rで元に戻す前に変更すると、バイナリダンプ状態で保存されてしまいます！そういうことか。


# リンク
- [vimでバイナリを表示し、値を変更したい](http://d.hatena.ne.jp/rdera/20081022/1224682665)
 
 
# 所感
本当にちょろっとした変更をしたい時用として覚えておくと便利です。

リンクにあるように、vimrcをいじれば便利になるようです。
その反面、vimに限らずですが、自分用にカスタマイズしすぎると、他の環境で作業せねばならない時に、返って混乱してしまうというのもあるんですよね。経験的に。
なので、まずは、なるべく素の状態で使えるようになっておきたいと思っています。そういう理由で、gtagsなんかも割と面倒なコマンドを毎回打ってたりするんですよね。

おわり。
Rails のマイグレーションにおける MySQL の整数型の limit について

# はじめに

バージョン情報は以下の通りです。

```console
$ bundle exec rails -v                                                                                               
Rails 4.2.3
$ mysql --version                                                                                                    
mysql  Ver 14.14 Distrib 5.6.25, for osx10.10 (x86_64) using  EditLine wrapper
```

# 概要

最近 Rails を 4.2 系にバージョンアップして気づいたこと。

```rb
class CreateWeapons < ActiveRecord::Migration
  def change
    create_table :weapons do |t|
      t.references :girl
      t.string :name

      t.timestamps null: false
    end
  end
end
```

このマイグレーションを作成して `schema.rb` を確認すると、

```rb:schema.rb
create_table "weapons", force: :cascade do |t|
  t.integer  "girl_id",    limit: 4
  t.string   "name",       limit: 255
  t.datetime "created_at",               null: false
  t.datetime "updated_at",               null: false
end
```

のように自動的に `limit: 4` が付与されています。  
あれ、以前のバージョンでは limit なんて付かなかったのに…。
そして僕はこう思いました。
「あれ？ 外部キーが 4 桁の整数だと 1 万件以上のレコードを保持できなくね？」


でも、むろんそんなことはなく、それは非常に初歩的な勘違いでした。
[Rails のドキュメント](http://apidock.com/rails/ActiveRecord/ConnectionAdapters/TableDefinition/column) を見ると、

> :limit - Requests a maximum column length. This is number of characters for :string and :text columns and number of bytes for :binary and :integer columns.

と書かれていました。つまり数値型の場合の limit の単位はバイトなんですね。
4 バイトというのは一般的な整数型の範囲 (-2,147,483,648 ～ 2,147,483,647) と一致しますし、なぜ気付かなかったし…orz

ちなみに MySQL 上は `int(11)` という型になっており、僕はこう思いました。
「あれ？ この (11) ってなんぞ？ 整数値の範囲である 4 バイトとも関係なさそうだし…」

これも [MySQL のドキュメント](http://dev.mysql.com/doc/refman/5.7/en/numeric-type-attributes.html) を確認すると、以下の言及がありました。

> When used in conjunction with the optional (nonstandard) attribute ZEROFILL, the default padding of spaces is replaced with zeros. For example, for a column declared as INT(4) ZEROFILL, a value of 5 is retrieved as 0005.

つまり、整数を 0 埋め (ZEROFILL) する際の桁数のようですね。  
ZEROFILL については StackOverflow の [What is the benefit of zerofill in MySQL?
](http://stackoverflow.com/questions/5256469/what-is-the-benefit-of-zerofill-in-mysql) というページも参考になりました。

# 参考

* <i class="fa fa-github fa-fw"></i> GitHub
    * [rails 4.2 integer migration limit 4 · Issue #18826 · rails/rails](https://github.com/rails/rails/issues/18826)
* <i class="fa fa-stack-overflow fa-fw"></i> StackOverflow
    * [What is the benefit of zerofill in MySQL?
](http://stackoverflow.com/questions/5256469/what-is-the-benefit-of-zerofill-in-mysql)
S3に置いたファイルのContent-TypeをLambdaで変更する

もともとこのようなことを行う必要性が生まれたのは、

Office2007以降の形式（.xlsx, .docx, .pptx）のファイルをブラウザからS3にアップした際に、
Content-Typeの自動設定が行われると、
「*application/vnd.ms-excel*」（Excelの場合）
と設定されます。

これはOffice2003以前の形式（.xls, .doc, .ppt）のContent-Typeであるため、
ブラウザで対象ファイルをダウンロードすると、
「*.xlsx*」だったファイルの拡張子が、「*.xls*」となってダウンロードされてしまうという事象が起こるのです。（Excelの場合）

これを防ぐためにLambdaを利用してContent-Typeを変更してしまおうということで、以下コード。


```node.js
console.log('Loading event');
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var s3tokyo = new aws.S3({apiVersion: '2006-03-01', endpoint: 'https://s3-ap-northeast-1.amazonaws.com'});
 
exports.handler = function(event, context) {
   console.log('Received event:');
   console.log(JSON.stringify(event, null, '  '));
   // Get the object from the event and show its content type
   var bucket = event.Records[0].s3.bucket.name;
   var key = decodeURIComponent(event.Records[0].s3.object.key);
   s3tokyo.getObject({Bucket:bucket, Key:key},
      function(err,data) {
        if (err) {
           console.log('error getting object ' + key + ' from bucket ' + bucket );
           context.done('error','error getting file' + String(err));
        }
		else {
			console.log('logging Content-Type : ',data.ContentType);
			if  ((data.ContentType != "application/vnd.ms-excel")&&
				(data.ContentType != "application/msword")&&
				(data.ContentType != "application/vnd.ms-powerpoint")){
				console.log('Content Type not MS-Office file.');
				context.done(null,'skip execution.');
			}
			else {
			   var type = "binary/octet-stream";
			   var params = {
				  Bucket: bucket, 
				  CopySource: bucket + "/" + encodeURIComponent(key),
				  Key: key, 
				  ContentType: type,
				  MetadataDirective: "REPLACE"
				};
				console.log('replace object.');
				console.log('bucket : ' + bucket);
				console.log('CopySource : ' + bucket + "/" + key);
				s3tokyo.copyObject(params, function(err2, data2){
					if (err2){
					   context.done('error','error2 getting file '+ String(err2));
					}else{
						console.log('replace done! Content-Type : ',data2.ContentType);
						context.done(null,'object meta-data changed.');
					}
				});
			}
		}
		}
	);
};
```

#マルチバイト文字のKey名への対応#
2バイト文字のファイル名の場合にうまくいかなかったのですが、
S3内ではURIエンコードされているので、

getObjectの際は`decodeURIComponent(key)`
putObjectの際は`encodeURIComponent(key)`

することで解決できます。

#イベントソースの設定#
以下２つのイベントを対象バケットに設定します。
・ Put 
・ CompleteMultiPartUpload
AWSマネージメントコンソール、API、CLIいずれによっても、ファイルサイズによってMultiPart Uploadに自動的に切り替わりますので、CompleteMultiPartUploadも有効にしておくことが必要です。

※Copyイベントの設定は厳禁です。これを設定すると、コード内でのCopy処理によってループしてしまうかも。
ruby よく使うString型のメソッド

個人的によく使うString型のメソッドを備忘録として。

##split

splitは引数を区切り文字に文字列を配列として返す。
urlの分解とかに便利。

```rb
url = "http://qiita.com/shizuma/items/d04facaa732f606f00ff"
url_ele = string.split('/')
#=> ["http:", "", "qiita.com", "shizuma", "items", "d04facaa732f606f00ff"]
```

##slice
文字列の中から部分文字列を取り出せる。

```rb
s = "qiita.com"
puts s.slice(0, 5) # s[0, 5]でも同様に文字を切り出せる。
#qiita
```

##include?
文字列の中に引数の文字列が含まれているかを調べる。

```rb
s = "qiita.com"
puts s.include?("qiita")
#true
```

##gsub!、sub!
gsub!：正規表現のパターンにマッチした文字列の全置換。
なお、第一引数は「正規表現パターン」、第二引数は「置換文字列」。
ここでは第一引数の「正規表現パターン」として「通常文字列」のみを使用しました。

```rb
s = "qiita.com"
s.gsub!(/com/, 'jp')
#=> "qiita.jp"
```

また、gsubはパターンに該当する全てを置換するのに対してsubはパターンに該当するひとつだけを置換します。
つまり

```rb
s = "qiita.com"
s.sub!(/com/, 'jp')
#=> "qiita.jp"
```
subでもいいですね。

違いが出るのはパターンが複数のときです。

```rb
s = "qiita.comcom"
s.gsub!(/com/, 'jp')
#=> "qiita.jpjp"

s = "qiita.comcom"
s.sub!(/com/, 'jp')
#=> "qiita.jpcom"
```

## strip


文字列の文頭と文末の空白削除

```rb
s = "  qiita  \r\n"
p s.strip
=> "qiita"
```

##その他参照
http://ref.xaio.jp/ruby/classes/string (ruby1.9)
[るりまサーチ](http://docs.ruby-lang.org/ja/search/)

今後、追加していくかもしれません。
一番簡単なFacebookログイン(OAuth2)の実装方法

Node.jsの勉強がてら地図上でお話しできる[チャットアプリ](https://github.com/ynunokawa/machiawase-map-sub)を作成していたら、チャットルームの管理が面倒なので、FacebookのMessengerで管理しているグループと連動できないかと思ってやってみた雑記です。

# 実装までの流れ

* Facebook Developers ページ

https://developers.facebook.com/apps/

1. [My Apps]でアプリを登録
1. アプリのDashboard画面から[Getting Started]ボタンをクリック
1. ウェブサイト(WWW)を選択
1. 何もせず[次へ]
1. [次のステップ]セクションにある[ログイン]を選択
1. [Quickstart]のコードをコピペ
1. {your-app-id}に登録したアプリIDを上書き

これだけでFacebookログイン ボタンが実装される。

# Facebookログイン時のPermissionについて

## <fb:login-button>を使う場合

scope属性にPermissionを指定

`<fb:login-button scope="public_profile,email,user_friends,read_mailbox" onlogin="checkLoginState();"><fb:login-button>`

## Facebook SDKのloginメソッドを使う場合

scopeパラメーターにPermissionを指定

    FB.login(function(response) {
      statusChangeCallback(response);
    }, {scope: 'public_profile, user_friends, read_mailbox, read_page_mailboxes, manage_pages'});

## Graph API 2.0からPermissionの制限がきつくなった

「公開プロフィール情報（public_profile）」「メールアドレス（email）」「いいね！リスト（user_likes）」「友達リスト（user_friends）」以外のPermissionは、全て申請をして受理されないと使えなくなった。

参考：http://snowadays.jp/2014/05/2762

## デフォルトではないPermissionの利用

* 公式に利用：申請が必要。「申請は基本的には7営業日以内、一部の権限については14営業日以内での承認。」らしい。

* 開発時に利用：登録したアプリのページの[Roles]から[テスト担当者]にPermissionを通したいユーザーを追加

Messengerのグループの情報を取得するには「メールボックスの参照（read_mailbox）」が必要だったので、とりあえずはテスト担当者でしのいでます。
障害はおきてなくても、障害はおきている？

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

みなさんはサーバ（インスタンス）の冗長化はされていますか？

AWSの各サービスの稼働状況
http://status.aws.amazon.com/

上記がAWSのサービスの状況ですが、上記に問題がなくとも自分のインスタンスだけは、AWSの仮想サーバホストの問題によって接続が一時的にできなくなってしまうことなどはおこります。
(RDSのリードレプリカも夜中に1台勝手に再起動されていたこともありましたが、AWSの基準では障害ではないようだったので、自分たちの設定した監視にのみ障害として記録されました。)


#対策
1.AWSとはいえ、やはりサービスを守りたい場合冗長構成をとる必要はあるとおもいます。

#AWS側になにかあるのではと疑わしい時は
1.AWSの仮想ホストサーバ障害の場合、EC2はStop/Start(Rebootではなく)を実施することで、Start 時に別の仮想サーバホストが割り当てられるそうです。

2.AWSのサポートに聞けば、何か起きてた場合は聞けば教えてくれます。（聞くときは、インスタンスIDや日本時間の何時であるかを伝えるといいと思います）


#まとめ
システムに障害がおこる前提での設計が必要だと思います。
親子プロセス間でエラー情報を共有する方法

# 概要
Ruby によるマルチプロセスプログラミングでは、子プロセスの異常終了を親から知ることは可能だが、子プロセスが raise した exception を Ruby の標準エラーハンドリングで扱うことはできない。

つまり、親子プロセス間でエラー内容の共有を行いたい場合、何らかの工夫をする必要がある。

そこで、プロセス間通信 (Interprocess Communication) を実現可能な`IO.pipe`を用いてプロセス間でのエラー情報共有を行った。

# 基本
まずはエラー情報の共有を行わず、子プロセスが異常終了していた場合に StandardError で落ちるようにしてみた。

```ruby:sample.rb
pids = []

pids << fork do
  puts 'forked!'
end

pids << fork do
  fail 'failed!'
end

results = Process.waitall

results.each do |r|
  fail unless pids.include?(r[0]) && r[1].success?
end
```

`Process.waitall`は全ての子プロセスの終了を待つメソッドで、返り値は「子プロセスの pid と終了ステータス (Process::Status) の配列の配列」となっている。

上記のコードであれば具体的には以下のような値が格納されることになる。

```ruby
pry(main)> results
=> [[8409, #<Process::Status: pid 8409 exit 0>], [8412, #<Process::Status: pid 8412 exit 1>]]
```

プログラムの実行結果は以下の通りとなる。

```ruby
$ ruby sample.rb
forked!
sample.rb:8:in `block in <main>': failed! (RuntimeError)
        from sample.rb:7:in `fork'
        from sample.rb:7:in `<main>'
sample.rb:14:in `block in <main>': unhandled exception
        from sample.rb:13:in `each'
```

子プロセスのエラー情報が出力されてはいるが、親プロセスからその情報を扱うことはできない。

# 子プロセス内でエラーハンドリング
このままだと気持ち悪いので、子プロセス内でエラーハンドリングを行うようにプログラムを修正する。

```ruby:sample.rb
pids = []

pids << fork do
  puts 'forked!'
end

pids << fork do
  begin
    fail 'failed!'
  rescue => e
    exit 1
  end
end

results = Process.waitall

results.each do |r|
  fail unless pids.include?(r[0]) && r[1].success?
end
```

実行結果は以下のとおりとなる。

```ruby
$ ruby sample.rb
forked!
sample.rb:18:in `block in <main>': unhandled exception
        from sample.rb:17:in `each'
        from sample.rb:17:in `<main>'
```

問題なく子プロセスの異常終了が感知できている。

# IO.pipe
IO.pipe は Linux/Unix のパイプのようなものを実現してくれるメソッドである。

> ```ruby
> rd, wr = IO.pipe
> wr.write "ping"
> wr.close
> 
> rd.read #=> "ping"
> ```
> 
> <cite>[Process spawning patterns](https://practicingruby.com/articles/process-spawning-patterns)</cite>

IO.pipe の戻り値は2つの IO オブジェクトで、それぞれ読み込み用と書き込み用である。これら2つのオブジェクトを使用すると、パイプ機能を実現することができる。

# プロセス間でのエラー情報共有
fork する前に IO.pipe を呼び出せば、子プロセスには親プロセスの IO オブジェクトのコピーが渡されることになる。

このコピーされたオブジェクトを通して、プロセス間通信を実現することができる。

```ruby:sample.rb
rd, wr = IO.pipe

pids = []

pids << fork do
  # 子プロセスでは書き込みしか行わない
  rd.close
  puts 'forked!'
end

pids << fork do
  rd.close
  begin
    fail 'failed!'
  rescue => e
    # 今回の例では"クラス名,メッセージ\n"という形式を用いる
    wr.write("#{e.class},#{e.message}\n")
    exit 1
  end
end

# 親プロセスでは読み込みしか行わない
wr.close
results = Process.waitall

# メッセージが格納されている場合
unless rd.eof?
  # 格納した形式に応じて文字列をパースしエラーを生成
  error_class, error_message = rd.read.split("\n").first.split(',')
  raise Module.const_get(error_class).new(error_message)
end

results.each do |r|
  fail unless pids.include?(r[0]) && r[1].success?
end
```

実際に実行してみると、以下のような結果となる。

```ruby
$ ruby sample.rb
forked!
sample.rb:27:in `<main>': failed! (RuntimeError)
```

これで無事、親子プロセス間でエラー内容の共有を行うことができた。

# 参考文献
- [Process spawning patterns](https://practicingruby.com/articles/process-spawning-patterns)
serverspecでカスタムマッチャを定義してYAML形式としてパース出来るかどうかをテストするbe_yamlを作ってみる

serverspecでデフォルトで定義されてるマッチャbe_fileとか以外に自分でカスタムマッチャを定義する方法のメモ。

例として、指定のパスのファイルがYAML形式としてパース出来るかどうかをテストするbe_yamlというマッチャを定義してみます。ただのRSpecの範疇な気がしますが、応用例がserverspecで便利っぽいだけです。

何がうれしいかというと、ChefでYAMLファイルを動的に生成していると、誤って変なデータ埋め込んでパースできなくなるというあるあるをserverspecのテストで検出できたりして幸せになれる。

まず`custom_matcher.rb`みたいなファイルを作って

```rb
require 'yaml'

# YAMLファイルのフォーマットチェック用のカスタムマッチャ
RSpec::Matchers.define :be_yaml do
  match do |file|
    begin
      # YAML.loadでパースして例外が発生しないかテストする
      YAML.load(file)
      true
    rescue
      false
    end
  end
end
```

`spec_helper.rb`から読み込みます。

```rb
require 'serverspec'
require_relative './custom_matcher'
...(略)
```

使い方はこんな感じです。

```rb
require 'spec_helper'

describe "hoge_server spec" do

  describe file("/hoge/config/database.yml") do
    its(:content) { should be_yaml }
  end

end
```

やり方は簡単で色々応用が効くので夢がひろがリングですねー。
【非推奨】Eclipse で Android の開発環境構築

> **:warning: 注意:** Google が Android アプリを開発するのに古くから提供している Eclipse 用の Android Development Tools プラグインの開発とサポートの 2015 年で終了します。 _[An update on Eclipse Android Developer Tools](http://android-developers.blogspot.jp/2015/06/an-update-on-eclipse-android-developer.html)_



## Android SDK インストール方法

AndroidのSDKと開発環境が一緒になったものが Android Studio でそれ以外の IDE で開発をする場合には Android SDK 単体のインストールが必要。

SDK 単体をインストールすると以下の構成のディレクトリがダウンロードされます。

```bash
.
├── add-ons
├── platforms
└── tools
    ├── ant
    ├── apps
    ├── lib
    ├── lib64
    ├── proguard
    ├── qemu
    ├── support
    └── templates
```

その中の tools/android を実行すると SDK のインストーラーが起動する。その際に自動的に最新の API バージョンが指定されているので API のバージョンに変更する。

* 必須
  * Android SDK Tools
  * Android SDK Platform-tools
* 最新のもの（レビューではないもの）
  * Android SDK Build-tools
  * Android4.4.2(API 19)内の全部
* あったほうがいい
  * Android Support Library
  * Google USB Driver

## Eclipse のインストール方法

Eclipse は [Eclipse Installer](https://eclipse.org/downloads/installer.php) からインストールをダウンロードする。

## Eclipse  から Android SDK を使えるようにする方法

 Eclipse を開いて「Help」 -> 「Install New Software...」をクリックして名前を「Android SDK」とかで ロケーションを「http://dl-ssl.google.com/android/eclipse/ 」と入力して OK する。

## 参照サイト

* [Androidアプリ開発環境の構築方法（2015年6月更新）](http://nobuo-create.net/android-develop/)
Parallels Desktop上のUbuntu１４．０４でのユーザーディレクトリ変更

環境
Mac(OS X10.9.5)
Parallels Desktop(Build9.0.24251)上のUbuntu Desktop(14.04)

Ubuntuではユーザーディレクトリがデフォルトで日本語になる（[Desktop]が「デスクトップ」とか[Public]が「公開」とか）ため、シェルでの作業がうざったい。
そのため
`LANG=C xdg-user-dirs-update`
で、ロケールを指定してあげると英語のユーザーディレクトリに変更される。

が、しかし！
Paralles上で`LANG=C xdg-user-dirs-update`をする前にParallels Toolsをインストールしてしまうと、ユーザーログイン時に、Paralles側で日本語に戻してくれるといういらぬお節介！
↓やっと辿り着いたのがここ
[Debian 7.3（wheezy）でホームフォルダが日本語名に戻る？](http://totopon.hatenablog.com/entry/2014/01/14/000051)
ここまで１週間かかりました…。

`~/.parallels/user-dirs.dirs.orig`
がまんま
`~/.config/user-dirs.dirs`
なのでこれが元凶のようだ。

で、どうすればいいかというと
`~/.parallels/user-dirs.dirs.orig`
の中身が日本語ディレクトリになっているはずなので、
それを以下のように英語ディレクトリに書き換えてやる。

```XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
```
その後再ログインするとちゃんと英語になっているはず。
私的メモ：HOKUSAI

これ↓
http://www.riken.jp/pr/press/2015/20150403_1/
の使い方メモ。

構成
===
FX100,
1080 nodes,
32 cores/node
32 GB/node

command
===
``$ listcpu``
cpuの使用率とか見れる。

``$ listquota``
ディスクの利用量とか見れる。

データ
===
/data/G15006/
以下にあることになってるらしいんだけど、
data以下は申請制らしくまだ出来てない。
G15006は僕らの課題番号。

/tmp_work
一時領域。勝手に作っちゃっていいのこれ？
利用期限は一週間ですのでrsyncはお早めに。

/home
ホームディレクトリ。
2PB or 1000万inodesまで使っていいらしいです太っ腹。

使い方
===
そのままだと使えるコンパイラとかに制限があるので、
モジュールを読んで使えるようにしてくる必要があるらしいです。
```$ module avail```
で使えるモジュールが見れるはず。
基本的には多分
`$ module load gcc
$ module load cuda
$ module load sparc
$ module load intel`
くらいやっておけば多分困らない。はず。

制限値
===
interactiveの場合、
2hrs, 128cores, 4nodesがmax。

batchの場合はなんかよくわかんない、一般とか簡易って何かしら。
24時間までなら8192 (1024)cores, 256 (32)nodes(カッコ内は簡易)。
72時間までなら512cores, 16nodes。
Android Studio で toString メソッドの生成をするときに、生成内容をカスタマイズする

# 背景
Android Studio には `toString` メソッドを自動生成する機能があります。
（実行するには、メニューの Code -> Generate -> toString()）


デフォルトでは下のようなコードが生成されます。不満点があります。

```java
@Override
public String toString() {
	return "Product{" +
			"code='" + code + '\'' +
			", category='" + category + '\'' +
			", name='" + name + '\'' +
			'}';
}
```

不満点は

* `StringBuilder` を使ってほしい
* `'\''` ではなく `"'"` を使ってほしい
* `'}'` ではなく `"}"` を使ってほしい


# 手順
`toString` メソッドを生成するときに
下のダイアログが出ます。
ここで Settings ボタンを押します
![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/44676/7d54e815-9f9c-1bc9-d592-b4db84b2c572.png)

すると次のような画面になりますので、
「StringBuilder (JDK 1.5)」というテンプレートをコピーして、新しいテンプレートを作成します。
![template.png](https://qiita-image-store.s3.amazonaws.com/0/44676/f8daff0d-8d9c-68c9-b315-90c1ddeeaba9.png)

テンプレートを修正していくわけですが、変更点は下の2点です。

* `'\''` ではなく `"'"` を使うように修正
* `'}'` ではなく `"}"` を使うように修正

テンプレート全体は以下のとおりです。

```
public java.lang.String toString() {
final java.lang.StringBuilder sb = new java.lang.StringBuilder("$classname{");
#set ($i = 0)
#foreach ($member in $members)
#if ($i == 0)
sb.append("##
#else
sb.append(", ##
#end
#if ($member.string)
$member.name='")##
#else
$member.name=")##
#end
#if ($member.primitiveArray || $member.objectArray)
.append(java.util.Arrays.toString($member.name));
#elseif ($member.string)
.append($member.accessor).append('\'');
#else
.append($member.accessor);
#end
#set ($i = $i + 1)
#end
sb.append('}');
return sb.toString();
}
```

あとは、先ほどの

![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/44676/5f072cef-57af-9167-7b70-c73bcd1b521e.png)

の画面で、作成したテンプレートを選択します。

# 結果
生成されるコードは次のようになります。

```java
@Override
public String toString() {
	final StringBuilder sb = new StringBuilder("Product{");
	sb.append("code='").append(code).append("'");
	sb.append(", category='").append(category).append("'");
	sb.append(", name='").append(name).append("'");
	sb.append("}");
	return sb.toString();
}
```

というわけで、結果を確認すると、

|項目|結果|
|:---|:---|
|`StringBuilder` を使ってほしい|OK|
|`'\''` ではなく `"'"` を使ってほしい|OK|
|'}'` ではなく `"}"` を使ってほしい|OK|

となり、全部クリアしました。
【iOS】In-House(OTA)配布の公開範囲について

社内でOTAで配布しようとしたのですが、業務委託者、業務委託先の会社の社員、はたまた、業務委託先の会社の業務委託者など、どこまでの人間に配布が許されるのか調べてみました。

https://developer.apple.com/programs/terms/ios/enterprise/ios_program_enterprise_agreement_20140909.pdf
とりあえず、これがOTA配布の規約です。
下の方に日本語でも記載があるので、要チェックしてみてください。

これを読むと「許諾団体」、「許諾ユーザー」という言葉が出てくるのですが、定義は以下の通りです。
<br>
>許諾団体
「許諾団体」とは、(a)デベロッパが自動車メーカーの場合、デベロッパの正規自動車販売店および公認
サービスパートナー、(b)デベロッパがホテル持株会社の場合、デベロッパの名前、商標もしくはブラン
ド（またはその所有もしくは支配する名前、商標もしくはブランド）でのホテル資産管理、あるいは(c)
その他Appleがその単独の裁量により書面で許諾する類似の団体をいいます。

(a)について、デベロッパの公認サービスパートナーが許諾団体に含まれるとなっています。
公認サービスパートナーの定義は特にされていないのですが、サービスの運営に関わる団体であれば含まれる。。。ということですかね。
<br><br>
>許諾ユーザー
「許諾ユーザ」とは、デベロッパとの書面による法的拘束力のある契約を有するデベロッパの許諾団体
または本契約の規定に従いデベロッパの内部使用アプリケーションを不正使用から保護するデベロッパ
の許諾団体の従業員および請負業者をいいます。

許諾団体の請け負い業者が許諾ユーザーに含まれるという記載があります。
<br><br>
これを踏まえた上で、条項の中に以下の文章があります。

>デベロッパは、デベロッパの許諾団体に、デベロッパの代わりに、デベロッパの内部使用アプリケー
ションを許諾ユーザにデプロイメントすることを許可することができます

<br>
つまり、許諾団体が取引している請け負い業者にアプリケーションのインストールを行わせることが可能ということになります。
ここで自社サービスでの業務委託先の会社を「公認サービスパートナー」と考えれば、業務委託先（許諾団体）の請け負い業者がアプリケーションをインストールすることが可能というように読めます。

なんだかまどろっこしい文章になってしまったのですが；

ちなみに以下のような条項もありました。
>本契約で特段の定めのない限り、デベロッパは、Appleソフトウェア、Apple発行の証明書、またはいか
なるサービスの全部または一部について、レンタル、リース、貸与、ウェブサイトもしくはサーバへの
アップロード、ウェブサイトもしくはサーバ上でのホスティング、販売、再配布、または再使用許諾を
行わないこと、また、他者がこれらの行為を行うことを可能ならしめないことに同意するものとしま
す。

まとめると、「ざっくりサービスの関係会社や関係者に配ってもいいけど、そいつらが不特定多数に公開するような状況にはするな」という意味に読めます。

※あくまで個人的な理解になるので、この情報に従っていかなる被害を被った場合でも僕は責任を負いません。
Windows7からのAndroid実機端末を使ったデバッグの方法について

WindowsのAndroidStuidoを使った実機デバッグにチャレンジしたのでその備忘録。
バージョンはAndroid Studio 1.2.1.1。

#最初に
多分普通に調べれば出てくるのですが、まずはAndroid Studioのツールバーから

　**Tools→Android→SDK Manager**

を起動。(こんな感じ↓)
![sdkmanager2.png](https://qiita-image-store.s3.amazonaws.com/0/75263/ba80a8af-10be-8fdb-5787-3ba2f4634b1f.png)
ここからGoogle USB Driverをインストール。

#Android端末側の設定
Android端末からデバッグを許可するように設定しないといけないです。
やることは2点、提供元不明のアプリのインストールの許可とUSBデバッグの許可。
![Screenshot_2015-07-02-17-05-44.png](https://qiita-image-store.s3.amazonaws.com/0/75263/09296ae7-562d-bb06-52f6-fe1f23f5da8d.png)

![Screenshot_2015-07-02-17-06-00.png](https://qiita-image-store.s3.amazonaws.com/0/75263/69e36c84-e024-e6cf-739a-29d466e9b0c2.png)
自分の端末のAndroidのバージョンは4.0.4。
提供元不明アプリの設定は、
　**設定　→　セキュリティ**
USBデバッグの設定は、
　**設定　→　開発者向けオプション**

#端末ごとのADBのインストール
端末ごとにADBをインストールしなければなりません。
これはメーカーや端末毎に異なるので、以下のリンクからデバッグに使いたい端末を探してインストールするのが吉。
[メーカー毎のADB/USBドライバー配布リンク先](http://app-roid.com/blog-entry-736.html)

#ちょっと
うろ覚えな部分もあるので後々追記するかもしれないです。
GitHub の「... days ago」みたいな所を日時表示に展開するブックマークレット

## 概要
GitHub 内の至る所で表示される日時が「～ days ago」ってなってるのが正直しっくり来ない。これをぜんぶ年月日時分秒に差し替えるブックマークレットを作った。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25555/d730acc0-ffcf-9b41-f0b0-039bad215952.png)
　↓↓
![2.png](https://qiita-image-store.s3.amazonaws.com/0/25555/28fa1bc1-4746-9157-6050-c110840f68df.png)


## ブックマークレット
```text:github-date-expand-bookmarklet
javascript:(function(){$('time').each(function(){var t = new Date($(this).attr('datetime'));var full = '';full += t.getFullYear() + '/';full += ('0' + (t.getMonth() + 1)).slice(-2) + '/';full += ('0' + t.getDate()).slice(-2) + ' ';full += ('0' + t.getHours()).slice(-2) + ':';full += ('0' + t.getMinutes()).slice(-2) + ':';full += ('0' + t.getSeconds()).slice(-2);$(this).text(full);});})();
```

## 生コード
```js:github-date-expand.js
$('time').each(function(){
    var t = new Date($(this).attr('datetime'));
    var full = '';
    full += t.getFullYear() + '/';
    full += ('0' + (t.getMonth() + 1)).slice(-2) + '/';
    full += ('0' + t.getDate()).slice(-2) + ' ';
    full += ('0' + t.getHours()).slice(-2) + ':';
    full += ('0' + t.getMinutes()).slice(-2) + ':';
    full += ('0' + t.getSeconds()).slice(-2);
    $(this).text(full);
});
```

## 参考
- [JavaScript - 日付フォーマットなど 日付系処理 - Qiita](http://qiita.com/osakanafish/items/c64fe8a34e7221e811d0)
Markdown記法でコメントアウトする


~~いろいろ試したけど Github で使える方法は今のところこれだけ。~~
※追記にあるとおり、普通にHTMLのコメントアウトが効きます。

# 単行コメント
```
[](
コメントアウトしたい内容
)
```

[](
コメントアウトしたい内容
)

# 複数行コメント
```
[](
複数行のときは\
改行直前に\
バックスラッシュがないと\
ダメっぽい
)
```

[](
複数行のときは\
改行直前に\
バックスラッシュがないと\
ダメっぽい
)

# 追記

HTMLコメントアウトも普通に使えた。。。
Kobito上のプレビューでは見えているけど、Qiitaにアップすると消えてた。

```
<!-- コメントアウトしたい内容 -->
<!-- 
複数行は
こっちのほうが
断然、楽
-->
```

<!-- コメントアウトしたい内容 -->

<!-- 
複数行は
こっちのほうが
断然、楽
-->
これでわかる（わかったつもりになる）！ Dagger 2


[Android-CleanArchitecture](https://github.com/android10/Android-CleanArchitecture) とか読んでいると、当たり前のようにDaggerが使われていまして。


**初見じゃ読めない！！**


コードを読み解くために、まずはDagger（正確には Dagger2）を学んでみることにしました。


# どうしてDIが重要か

**メンテナンスとテストが楽になるからです。以上！**

というくらいの認識で良いんじゃないでしょうか。


こちらのブログ記事がわかりやすかったので、一読をおすすめします。

* [要するに DI って何なのという話](http://nekogata.hatenablog.com/entry/2014/02/13/073043)



# Dagger で使うアノテーションの役割

[Dagger 2 のサイト](http://google.github.io/dagger/) を上から眺めてみた感じです。


## `@Inject` "注入箇所"

コンストラクタにつける場合とフィールドにつける場合がある。

コンストラクタの場合は引数に合わせて、フィールドの場合は型に合わせて、必要なインスタンスを生成して注入してくれる。

Daggerではメソッド注入（setterを通しての注入）はサポートしていない。


## `@Provides` "注入物生成メソッド" と `@Module` "Providesのまとめ役"

`@Inject` では、指定された型がClassであれば、自動的にインスタンスを生成してそこに注入してくれるっぽい。

通常、DIではinterfaceを使うことが多いので、 `@provides` は「`@inject` に対応する注入物を生成するメソッド」だと思えばいい。

`@Provides` は `@Module` に属している必要がある。

`@Inject` が車の給油口だとしたら、 `@Module` はガソリンスタンド、 `@Provides` はスタンドに設置されている給油機にあたる感じ。

`@Prodives` 指定できるのは名前が provide で始まるメソッドのみで、 
`@Module` 指定できるのは名前が Module で終わるクラスのみ。



## `@Component(modules = SomeModule)` "ここが依存関係グラフの頂点"
これがイマイチよくわからない。

実際に注入を行うためのトリガーを叩くため、依存関係グラフの頂点を指定するらしい。

`@Component` 指定できるのは得たい型を返す引数なしのメソッドを持ったinterfaceのみ。

すると、実体クラスが `Dagger` + ↑のinterface名 という名前で生成される。
interface名が `SomeComponent` だったらば、生成される実体クラス名は `DaggerSomeComponent` 。

生成された実体クラスは Builder クラスを持っていて、 `builder() `で取得できる。
Builder に Module の実体を与えてから `build()` すれば、 interface で用意したメソッドが注入をすべて済ませたインスタンスを返してくれる。

手動で Module の実体を与える必要がない場合は、 Builder を使わなくても `create()` メソッドで注入が済んだインスタンスを取得できる。




## `@Provides` + `@Singleton` "シングルトンとして、返り値は使い回す"

`@Provides` 指定されたメソッドがシングルトン化するイメージ。
実際に依存関係が解決されて注入が行われるときに、初めて `@Provides` が返した値が使いまわされる、という理解でいいのだろうか。良さそう。

クラスに `@Singleton` を付けても何の効力もないが、「このクラスは複数のスレッドにまたがって使われ得る」という印として使われる。Javadocにもその旨が記載されて便利。


ジョセフの血をDIOに吸わせたり、ジョセフに戻したりする感じ。



## `@Inject Lazy<T>` "T型のインスタンスを遅延注入"

インスタンスの生成を遅延することができる。
`@Inject` の箇所に実際に注入されてくるのは `Lazy<T>` のインスタンス。

ちなみに `Lazy` は[Daggerに含まれているinterface](http://square.github.io/dagger/javadoc/dagger/Lazy.html)。
`get()` メソッドで T のインスタンスを生成・取得できる。


## `@Named` "`@Inject` と `@Provides` の対応を明示的にする"
"interfaceは同じだけれども違うクラス" を注入したいとか、自動的に注入する側とされる側の関係が解決できないときとかに使用。

注入される側 `@Inject` と 注入する側 `@Provides` 両方に同じ修飾子を書く必要がある。

```java
@Inject @Named("hoge") SomeType mHoge;
@Inject @Named("fuga") SomeType mFuga;
```

```java
@Provides @Named("hoge") SomeType provideHoge(){ ... }
@Provides @Named("fuga") SomeType provideFuga(){ ... }
```

実は、重要なのは `@Named` ではなく `@Qualifier` アノテーションが付いたアノテーション（ややこしい！）。
`@Named` には最初から `@Qualifier` が付いているのでこの用途に使える。
自分でアノテーションを作っても良い。



## `@Module(overrides = true)` "このモジュールを優先して使う"

競合する `@Provides` が存在した場合、 `@Module(overrides = true)` と書かれている Module の方が優先的に使われる。

テストの時、モックを注入して使ったりするのに便利。



---

なんとなくわかった気になったので、今度から使ってみます。˚✧₊⁎( ˘ω˘ )⁎⁺˳✧༚
ofMap() 使い方メモ

値の調整でよく目にするけど謎だったofMapの使い方メモ。
範囲変換に使うらしいです。
Processingだとmap()

```cpp:sample.cpp
// ofMap(hoge, a, b, c, d) hogeを範囲a-bから別の範囲c-dへ変換する

float hoge = 2.0;

//hogeを範囲0-10から別の範囲0-100へ変換する
float mapedHoge = ofMap(hoge, 0, 10, 0, 100)

cout << mapedHoge << endl;   // mapedHoge は 20
```
AWS Webinar をやってみた！！！

#Amazon VPC トレーニング

前回では　AWSのwebinar　 AWS 初級トレーニング　windows編をやってみました。

個人的な感想なのですが、とても分かりやすかったです。

なので続きを！　今回はVPC トレーニングです。

ここで、今日VPCを初めて知った僕のために（笑）
定義を書いておきます。


VPC(virtual private cloud) はAWSのなかのプライベートのクラウドです。

これのメリットは
1.社内でVPN（virtual privare network)をすることができる。
2.オンプレとの簡単にハイブリットできる。
3.すべてのリージョンで操作可能

よってセキュリティを高めることができ、完全に外部と閉じた環境を実現
かつ　自由なネットワーク設計ができるのでとても便利です。

VPC　で操作できる構成要素
1. security group
2.  network Access control
3.  Internet Gateway
4.  NAT
5.  Elastic Network Interface  

またVPCを作ってみました！！
subnet　を作ったり、EC2を立ち上げてみたりしてみました。（AWS　すげーなー）

そのあとRDS　セクションから　DB（今回はMY SQLを使用）を使ってデータの移行をおこないました


ここまで通して感じたことは*わからないことは調べる* ということ。

一見単純ですが、stackoverflow　や　AWS documentation　など　
資料はたくさんあるので一人でも全然勉強できると思います。

ということで自己満足終わります。（笑）
最短シンプル ofxGuiの使い方メモ

調整に使いたかったのですが
あんまり情報がなくて調べるのが大変だったので
すっごいシンプルな例をまとめます。
![スクリーンショット 2015-07-02 16.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/76843/7d2c3e8c-6b09-fa95-51d3-864d0a7faccc.png)

```cpp:ofApp.h
#pragma once

#include "ofMain.h"
#include "ofxGui.h"

class ofApp : public ofBaseApp{
	public:
		void setup();
		void draw();

        ofxPanel gui;
        ofxFloatSlider circleSize;
};

```


```cpp:ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    
    gui.setup();
    
    gui.add(circleSize.setup("label", 200, 0, 400));
}


//--------------------------------------------------------------
void ofApp::draw(){
    
    ofCircle(ofGetWidth()/2, ofGetHeight()/2, circleSize);
    
    gui.draw();

}

```