OmniAICreator/Qiita-1.07M huggingface dataset:
AWSアカウントの2段階認証を設定する

ここ数週間のIT界隈は heartbleed が猛威をふるって荒れ模様だったわけですが、近年はとにかくいろんな経路からパスワードがもれますよね。もうパスワードは漏れる前提のほうがいいんじゃないかと思ったりします。ってことで個人の AWS アカウントも、いい加減に2段階認証の設定しようと思ってやってみました。

# AWS の2段階認証

AWS では Multi-Factor Authentication (MFA) という仕組みで2段階認証を実現しています。

ドキュメント: http://aws.amazon.com/jp/iam/details/mfa/

# 必要なもの

いまのところ、スマホを持ってないとダメみたいです。

iPhone や Android の場合は、Google Authenticator を入れるのが良さそうです。

- iPhone: https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8
- Android: https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja

# 設定手順

ルートアカウントでログインした状態でマネージメントコンソールを開き、Security Credentials をクリックすると行けます。

![スクリーンショット 2014-05-01 0.04.56.png](https://qiita-image-store.s3.amazonaws.com/0/17722/b4f3681e-9be6-801c-9a1c-6c5d131852ea.png)

2014/04/30 時点では、ルートアカウントでログインした後に https://console.aws.amazon.com/iam/home?#security_credential へアクセスすれば OK です。

あとは MFA の部分を展開してデバイスを追加すれば ok です。iPhone などを MFA デバイスとして設定する Virtual MFA device を選択します。すると、下記のように QR コードが出てくるので、Google Authenticator を起動してバーコードで読み取ってやります。

![9fe31fd4-8644-a197-ef89-5b08849b1686.png](https://qiita-image-store.s3.amazonaws.com/0/17722/b8dfb90f-a9f5-749e-1141-eee74a8b5a58.png)

ちなみに、2014/05/01 時点の iPhone では、別の QR コードアプリから読み取り→Google Authenticator を起動というフローだとアプリが落ちます。Authenticator 内臓のバーコードリーダーで追加してやれば OK です。

わかりにくいのは2つのコードを入れるところで、ここは Google Authenticator に表示された 6 桁のコードを 2 つ入れる必要があります。ひとつ入れて、別のコードに切り替わるのをしばらくまって、ふたつめを入れる。という感じです。

2つのコードを入れたら、MFA の設定は完了です。AWS へのログイン時に、メアドとパスワードを入れてログインした後、こんな風に認証コードが聞かれるようになるはずです。

![スクリーンショット 2014-05-01 0.23.23.png](https://qiita-image-store.s3.amazonaws.com/0/17722/7492e493-035e-c71f-65d0-e48a71364aee.png)

これで安全な AWS ライフを送れると思います。
Parse.com を導入する際に気を付けること：セキュリティの甘さについてその２

# そんなことないと思うけど

## どうにゅうがふえるとねらわれるよねという話

### parse.com を使っているサービスを探そう

ソースレベルで検索できる検索エンジンがある。Googleだとソースレベルで検索できないような感じ、できるのかな、よくわからない。

- meanpath - The Source Code Search Engine - http://goo.gl/7rOrLk
- NerdyData - A Search Engine for Source Code - http://goo.gl/WFPfY

ここで、ParseのJavascript初期化スクリプト "Parse.initialize(" で検索をかけると、いくつか見つかる。これで、アプリケーションIDとJavascript Keyを取得することができる。

### parse.com を使っているアプリを探そう

逆コンパイルしたり、ルーターで監視したり、Wireshirk使ったり、とても簡単に見つけることが可能。

## だいじなこと

- 個人情報関連をさらさないような設計
- Cloud Code を使って隠ぺいする方法を検討
- INSERT 時にACLを適切に設定
- Auditコードを別に用意してバッチで監視
- parse.com を使わない

## あとがき

- サービス運営者は小心者であるべき
- グロースハッカーは消えるべき
- 他人のサイトのデータを勝手に消したり書き換えることは迷惑行為であり、場合によっては刑事責任に問われる可能性が。できるからと言ってやらないように。
interfacesでveth

Ubuntu(debian) の `/etc/network/interfaces` で veth ってどうやって作ったらいいものやらと思っていたら、こんな感じでいける様子。`man interfaces` と `less /usr/share/doc/ifupdown/examples/network-interfaces.gz` を読んでいくうちに、思い至った。

```bash:/etc/network/interfaces
auto veth0
iface veth0 inet manual
    pre-up ip link add veth0 type veth peer name veth0p
    post-down ip link del veth0
```

bridge-utils 入れて bridge_ports を使って上記の veth0 を組み込んでやることもできた。

```bash:/etc/network/interfaces
auto br0 br1
iface br0 inet manual
    bridge_ports veth0
iface br1 inet manual
    bridge_ports veth0p
```
Homebrewにプルリクを投げる

# Homebrewにプルリクを投げる

最近Ruby-GNOME2の開発をOSXでもできたら便利だなぁという事でちまちまとOSXでテストが動くかどうかを見てました。

## Homebrewで依存パッケージを入れる

```bash
$ brew install gtk2
$ brew install poppler
$ brew install clutter
```
なんかをすれば大体のものは入ります。

が！

しかしですよ、HomebrewのFormulaを見ると

```ruby 
 def install
    args = %W[
      ...
      --disable-introspection
    ]
```

のように、gobject-introspectionを無効にしているオプションが与えられているじゃ有りませんか！

これはよくないという事でプルリクをいくつかしてみました。
いくつかやってみて、こんな感じでプルリクすると良いかも！
という軽めのまとめです。

## プルリクするときの注意点

* HomebrewのJenkinsのテストが通る状態にすること
* プルリクは細かく
* bottleのブロックは消さない
* 文字列は"(二重引用符)で囲う
* パッチを当てる際にはupstream（開発元）に報告した上で当てる

くらいでしょうか。

まず、`HomebrewのJenkinsのテストが通る状態にすること`。これは大前提です。HomebrewではCIをJenkinsで行っていて、これに成功するものを重点的に見ているようです。（通ってなくても見てはくれますが、優先度は低くなります）

`プルリクは細かく`。これは複数Formulaのプルリクはできるだけ控える、という事に限ります。３つのFormulaの変更を同時にプルリクに含めたら分割してほしいと言われました。。。

`bottleのブロックは消さない`。これはJenkinsのCIを通す事を優先で消してしまいがちですが、ダメです。Homebrewのbottleの更新はbotがコミットしていて、bottleブロックを消すとそのbotが検知出来ないので消さないで下さい。（これは消すなと怒られました…すいませんでした）

文字列は二重引用符で囲う事が今のHomebrewのFormulaのスタイルガイドでは推奨されているようです。（これはプルリクを行う際に読むと良いですよ、というサジェストが出てきます）

`パッチを当てる際にはupstream（開発元）に報告した上で当てる`。敷居が一番高いのはおそらくこれです。`patch :DATA`としてパッチを当てる仕組みがhomebrewには有りますが、これをするにはupstreamへの報告が必須です。報告してないと'Has this been submitted upstream?'とか 'Has this issue been reported upstream?' とか聞かれます。おとなしく報告しましょう…
underscore.jsを読む#1 each

[underscore.js](http://underscorejs.org/)を少しずつ読んでいきたいと思います。※バージョンは1.6.0

第一回はeach。

```each.js
var each = _.each = _.forEach = function(obj, iterator, context) {
  if (obj == null) return obj;
  if (nativeForEach && obj.forEach === nativeForEach) {
    obj.forEach(iterator, context);
  } else if (obj.length === +obj.length) {
    for (var i = 0, length = obj.length; i < length; i++) {
      if (iterator.call(context, obj[i], i, obj) === breaker) return;
    }
  } else {
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
    }
  }
  return obj;
};
```

まず、ネイティブで[forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)が存在する場合はそれを使います。そうでない場合は、lengthが数値として定義されている場合にはfor文で各要素に対してiteratorを実行し、そうでない場合はオブジェクトのkeyを取得してfor文でiteratorを実行していきます。

breakerによる早期終了はネイティブのforEachにはない機能でユーザは使うことができませんが、_.someなどundersocre.js内の早期に終了することができるfor文を停止させるために使われています。

良い例は思いつきませんが、contextを指定することでiterator内のthisを指定できます。

[underscoreをforkしてコメントを追加していくことにしました。](http://takushi-m.github.io/underscore/docs/underscore.html#section-15)
[リファレンスも合わせて翻訳しています](http://takushi-m.github.io/underscore/)
Object#methods(false)とModule#instance_methods(false)の違い


[Rubyでクラスに実装されているメソッド（親クラス分を除く）を調べる - igaiga diary(2014-04-30)](http://igarashikuniaki.net/diary/20140430.html#p01)より。

> あるクラスに実装されているメソッド（親クラス分を除く）を調べるにはArrayの場合は [].methods(false) かなと思ったけど結果が思ったのと違う。
> 
> @hsbtさんに聞いたら Array.instance_methods(false) でインスタンスメソッドが見れると教えてくれた。便利。

具体的にどう違うのか、試してみた。

## 先に結論から

調べたいものによって、methodsとinstance_methodsや引数のtrue, falseを使い分ける。

 * 一般的なクラスのインスタンスのメソッドを調べたいなら `Module#instance_methods` を使う
   * 親クラスを含める … `Array.instance_methods(true)`
   * 親クラスを含めない … `Array.instance_methods(false)`
 * 特異メソッドを含めて調べたいなら `Object#methods` を使う
   * 親クラスを含める … `[].methods(true)`
   * 自身の特異メソッドのみ … `[].methods(false)`

## methodsとinstance_methodsの違い

引数に何も付けないと、どちらも親クラスを含むメソッド一覧を返す。

```ruby
Array.instance_methods.size
# => 177
[].methods.size
# => 177
Array.instance_methods - [].methods
# => []
```

オブジェクトに特異メソッドが定義されていない限り、結果は同じ。

## methods(false)とinstance_methods(false)の違い

引数にfalseをつけると挙動が変わる。

Object#methods(false)は、自身の特異メソッド一覧を返す。

```ruby
[].methods(false).size
# => 0
```

一方、Module#instance_methods(false)は親クラス分を除くメソッド一覧を返す。

```ruby
Array.instance_methods(false).size
=> 93
```

## 特異メソッドを定義した場合

オブジェクトに特異メソッドを定義すると、（当然だが）Object#methodsの方が数が多くなる。

```ruby
arr = []
def arr.test; end

Array.instance_methods.size
# => 177
arr.methods.size
# => 178
arr.methods - Array.instance_methods
# => [:test]
```

## 参考文献

 * [Module#instance_methods](http://docs.ruby-lang.org/ja/2.1.0/method/Module/i/instance_methods.html)
 * [Object#methods](http://docs.ruby-lang.org/ja/2.1.0/method/Object/i/methods.html)
 * [Object#singleton_methods](http://docs.ruby-lang.org/ja/2.1.0/method/Object/i/singleton_methods.html)
Dockerで特定のレイヤーの内容のみを取得する

Dockerのおもしろいところの一つとしてオーバーレイされたファイルシステムがあります。コンテナでの変更分のみを、ベースとなるイメージから独立したレイヤーとして保持することで、個々のコンテナに関するデータをコンパクトに、取り回しを簡単にすることができるわけです。

今回、Dockerとは別件で「ある操作を行ったあと、どんなファイルが更新、作成されたのかの一覧や、それぞれの内容を確認したいのだけどどうするかなあ」となったときに、「コンテナ作って、その中で実際に操作を実施してみて、コンテナの最上位レイヤーの内容だけ引っこ抜ければよいな」となり、少し試してみたのでメモしておきます。

# やりたいこと

- あるコンテナの実行中に行われた変更に関して、ファイルの内容まで含めて確認したい
    - 変更されたファイルの一覧は *docker diff <コンテナID>* でとれるみたいだけど内容をとる方法はあるだろうか？
    - まあ、docker diffとdocker exportを併用すればよいのだろうけど、なんかこう、もっとダイレクトにできそうな気がする

で、ちょこっと検索してみたところ、[Export/Save only the top layer of a container](https://groups.google.com/forum/#!msg/docker-user/0pgFG4BML80/zA46CxIlTqsJ) みたいな議論があったので、ここで書かれていることをヒントに、

1. PrivateなDocker Registryを作る
2. このRegistryに参照したいレイヤーを含むイメージをpushする
3. Registryからイメージの最上位レイヤーの内容を取り出す

みたいな方向で試してみた。

# 環境

- Ubuntu 14.04
- Docker version 0.9.1

# 手順
## PrivateなDocker Registryを作る

[dotcloud/docker-registry](https://github.com/dotcloud/docker-registry)を参考に、デフォルトの設定でlocalhostにPrivate Registryを作る。

```
$ sudo docker run -d -p 5000:5000 registry
$ curl -L http://localhost:5000/v1/_ping
true
```

なお、別サーバからでも5000番ポートでPrivate Registryがみえてしまう。他マシンからもアクセスできる環境の場合などは注意する。

## 変更内容を保持したいコンテナをPrivate Docker Registryにpushする

試しに、コンテナを起動して、コンテナ内でhello的なテキストファイルを作ってみる。

```
$ sudo docker run -i -t ubuntu /bin/bash
root@dd01d2ba1d6d:/# cd root
root@dd01d2ba1d6d:/root# echo "Maji Tenshi" > mikusan.txt
root@dd01d2ba1d6d:/root# exit
exit
```

このコンテナをlocalhost:5000/～の名前でcommit、pushする。

```
$ sudo docker commit dd01d2ba1d6d localhost:5000/test/mikusan
54c6f554db28e640353feae2a64044fa5ffca130d9a15686c2a85a9170a03302
$ sudo docker push localhost:5000/test/mikusan
The push refers to a repository [localhost:5000/test/mikusan] (len: 1)
...
Pushing tag for rev [54c6f554db28] on {http://localhost:5000/v1/repositories/test/mikusan/tags/latest}
```

この時、イメージをcommitしたときのID(長いやつ)を保持しておく。

## Private Docker RegistryからIDに対応するレイヤーを取得する

[Docker RegistryのAPI](http://docs.docker.io/reference/api/registry_api/)の **GET /v1/images/(image_id)/layer** を使って、IDに対応するレイヤーの内容をGETする。このデータはtar.gz的なデータっぽいので、以下のように取得、展開できる。
以下、適当な作業用ディレクトリを作って、その中で作業する。

```
$ curl -L http://localhost:5000/v1/images/54c6f554db28e640353feae2a64044fa5ffca130d9a15686c2a85a9170a03302/layer | tar zxvo
...
root/
root/mikusan.txt
$ ls -a
.  ..  .bash_history  dev  root  .wh..wh.aufs  .wh..wh.orph  .wh..wh.plnk
$ ls -a root/
.  ..  mikusan.txt
$ cat root/mikusan.txt
Maji Tenshi
```

天使ですね。

dev/ほげほげをmknodできないと怒られるのだけど、今回確認しようとしている対象でないので無視している。

# まとめ

ということで、イメージのIDから、そのイメージのもととなったコンテナにおいて追加、更新されたファイルを抽出することができました。（制御のためのファイルも含めてになってしまいますが・・・）
ちょっとおもしろいなと思ったのが、.bash_historyの内容も記録されていること。保存されているのは当たり前なのですが、この内容をイメージの検索に使えないか？とかそんなことを思ったりします。

今回docker diffを知らないというひどいDocker力の低さで臨んだわけですが、こんなクッソ簡単にPrivate Registryを起動できてあれやこれや試せるというのは、とにかく単純に使えるようになっているDockerのよいところだなと。
[状態マシン図] 状態マシン図を実装する

Qiita２番目の投稿です。今日初めてMarkdown書きました。Markdown練習中です。

---
状態マシン図の設計モデルができたら、今度はそれを実装に変換しよう。

状態マシン図を実装する方法はいろいろあり、それぞれ一長一短がある。ここではもっとも簡単な形の実装例をひとつあげてみよう。

状態マシンは、「今の状態と発生したイベントから、次の状態を決定する」関数のモデル、と考えることができる。今回紹介する実装例は、

今の状態と 発生したイベントを引数にとり、次の状態を返すイベント処理関数、

```c
次の状態 = HandleEvent(今の状態, 発生したイベント);
```

という関数を呼びだして、状態を更新しつづけるものである。組込みシステムでは、RTOSから１つイベントを受信してはこの関数を呼び出すイベントループを構成する。以下のような実装になる。

```c
状態 s = 最初の状態;
while(true) {
  イベント e = ReceiveEvent();
  s = HandleEvent(s, e);
}
```

これで状態マシンを実装することができる。具体的な状態マシン図と実装を見てみよう。実装に使う言語はC言語にしよう。

![code102.png](https://qiita-image-store.s3.amazonaws.com/0/11188/e19bf1fa-3027-9788-f0a2-5bb92afb85e9.png)

```c
typedef enum State { S1,S2 } State;
typedef enum Event { E1,E2 } Event;
 
void main(void)
{
  State s = S1;
  while(true) {
    Event e = ReceiveEvent();
    s = HandleEvent(s,e);
  }
}
 
State HandleEvent(State s,Event e)
{
  switch(s) {
    case S1:
      if (e == E2) {
        s = S2;
      }
      break;
    case S2:
      if ((e == E1) && g1()) {
        a1();
        s = S1;
      }
      break;
    default:
      ASSERT(false);
      break;
  }
  return s;
}

```

イベント処理関数 HandleEventは、引数eに、E1でもE2でもないイベントが渡されたら、それを無視して、今の状態と同じ状態を返す。

また、S2を起点とする遷移にはガード条件g1()が設定されている。S2の状態にいるときに、イベントE1がおきたとき、g1()が成立したならば、S1に遷移することを示している。実装を確認してほしい。

各遷移にアクションを設定し、各状態に入場時アクション、退場時アクションを設定してみよう。

![code152.png](https://qiita-image-store.s3.amazonaws.com/0/11188/1e639471-5607-19e9-30db-ec46e0210854.png)

```c
typedef enum State { Undefined,S1,S2 } State;
typedef enum Event { E1,E2 } Event;
 
void main(void)
{
  State s = Undefined;
  a0();
  s = S1;
  entry1();
  while(true) {
    Event e = ReceiveEvent();
    s = HandleEvent(s,e);
  }
}
 
State HandleEvent(State s,Event e)
{
  switch(s) {
    case S1:
      if (e == E2) {
        exit1();
        a2();
        s = S2;
        entry2();
      }
      break;
    case S2:
      if ((e == E1) && g1()) {
        exit2();
        a1();
        s = S1;
        entry1();
      }
      break;
    default:
      ASSERT(false);
      break;
  }
  return s;
}

```

StateにUndefinedという値を追加した。a0()を実行する間は、
状態はS1でもS2でもない、Undefinedの状態である。

entry1()とexit1()を実行する間は、状態はS1であり、
entry2()とexit2()を実行する間は、状態はS2となるように、
アクションと状態を更新する順序を工夫している。

Undefinedの状態は、履歴疑似状態の実現でも必要となるので、
状態マシンの実装はいつも、Undefinedの状態から始まるように
しておけばよい。

このように、

```c
次の状態 = HandleEvent(今の状態, 発生したイベント);
```

という関数呼出しを繰り返せば、状態マシンは実装することができる。

コンポジット状態ではイベントの処理の関数を入れ子にしてゆけばよい。直交状態では、領域ごとにイベントの処理の関数を作り、それぞれの領域ごとに状態を覚えてゆけばよい。履歴疑似状態では、その領域または、その領域以下のすべての状態を覚えておくための変数を別に用意し、履歴が設定されている状態を退場するときに、その変数に覚えておいて、次回入場するときにそれを戻せばよい。

より複雑な状態マシン図も実装してみてほしい。

また、状態マシン図の別の実装としては、GoF23パターンの１つ、Stateパターンが有名である。

---
参考記事

1. [状態マシン図] 遷移 と イベント[ガード]/アクション<br>
    http://saltheads.blog134.fc2.com/blog-entry-141.html
1. [状態マシン図] UML2.0 状態機械 モデル<br>
    http://saltheads.blog134.fc2.com/blog-entry-138.html
1. [Haskell] Haskellで 状態マシンを書く<br>
    http://saltheads.blog134.fc2.com/blog-entry-80.html
ParseQuery の取扱説明書

Parse.com を使ってバックエンドを構築した時、Android からは、ParseSDK を用いてそれらにアクセスするのが最も簡単かつ手軽にできます。
そして、Parse に保存されたデータにアクセスする際頻繁に使うであろうクラスが、`ParseQuery`です。

## ParseQuery の概要

ParseQuery は、指定した条件を満たすレコードの一覧を得るために使います。
例えば、あるカラムの数字が x 以上だとか、あるカラムの文字列が y と一致するとか、レコードのオフセットやリミットも指定できます。

## リレーショナルなレコード

Parse のデータベースは、リレーショナルなデータを持たせることが出来、いくつかの種類があります。

### Pointer

カラムのデータが、別のクラスが持つ特定のレコードを指し示す場合に用いられます。リレーショナルデータベースで言うところの外部キーのように働きます。

### Relation

名前の通り、関係を持っているデータの集合を取り扱うための型です。リレーショナルデータベースであれば、関係テーブルを用いて表現する内容を、カラムの型として取り扱えるようにしてくれています。

## ParseQuery の使い方

`Pointer`と`Relation`以外は、特に指定のない限りデフォルトでどの型のカラムであっても結果として取得することが出来ますが、`Pointer`と`Relation`は特別扱いされ、リクエストの際に指定しない限りレスポンスには存在しない事になったり、そもそも取得の方法が別に用意されていたります。

### Pointer を含める

`ParseQuery#include(String)`で、引数に指定したカラムの`Pointer`の内容を一緒に返してくれます。
`Pointer`で指定したデータの中に、別のクラスの`Pointer`を型とするカラムがある場合、別途それも含まれるよう指示しないと結果が得られません。

```java

ParseQuery<Hoge> query = new ParseQuery<Hoge>(); // Hoge クラスのテーブルにクエリを投げる
query.include("huga"); // Huga クラスのデータを持つ huga カラムに対し、インクルード指定することで、huga カラムに指定された Huga クラスのレコードが返ってくるようになる
query.include("huga.piyo"); // Huga クラスの piyo カラムは Piyo クラスへの Pointer である為、ドットでつないでインクルードする
query.include("huga.piyo.foo");
query.include("huga.piyo.foo.bar");
query.include("huga.piyo.foo.bar.baz"); // ドットは 3 個までの制約があるため、インクルード出来ない
```

言うまでもなく、インクルードが増えれば増えるほどレスポンスが返ってくるまでの時間は長くなります。

### Relation を含める

`Pointer`のようには含められません。

ではどうするかというと、`ParseQuery`の結果から`ParseRelation`を取得し、この`ParseRelation`が持つクエリを使って再度リクエストを投げることになります。

```java

ParseQuery<Hoge> query = new ParseQuery<Hoge>();
List<ParseObject> result = query.find();

for (ParseObject object: result) {
    ParseRelation relation = object.getRelation("data");
    ParseQuery relationQuery = relation.getQuery();
    List<ParseObject> relationResult = relationQuery.find();
    ...
}
```

言うまでもなく、取得したい`Relation`の数だけクエリを発行して`for`文を回すので、最初にリクエストを生成してから、最終的な結果を得るまでには相当の時間を費やすことになります。

### Relation のパフォーマンスチューニングをしたい

例えば、関係を多数持つカラムを考えた時、その上限が明らかになっている場合、`Pointer`の配列型としてカラムを定義する手段がありえます。
Parse のデータベースのカラムには、配列型が存在し、内部的には数字や文字列以外も配列として保持することが出来、`Pointer`も配列にすることが可能です（とは言え、`Relation`の配列を作れるかどうかは未検証ですが…）。

こうすることで、`ParseQuery#include(String)`を用いて、一回のリクエストですべての関係を引いてくることが出来るようになります。
もう`for`文をネストしてその中で何度もリクエストを飛ばすようなこともなくなります。

## まとめ的な

ParseSDK はとかく内部で色々やっているらしく、ミューテックスを使って何らかロックを取得しているようですし、`**InBackground()`でも平気で MainThread をブロックしに来てくれますし、わりと効率の悪い感じがあるので、できれば REST ですべてをさばけるようになるとシアワセかもしれません。
rails デバッグ環境の構築

log出力のみではあまりに開発効率が悪いので…。
自分の環境構築のメモ書きです。

2014/4/30現在、参考サイトの焼き回し。

# 参考
[Rails4 今のところ最強なデバッグツール達](http://qiita.com/yusabana/items/8ce54577d959bb085b37)
[Railsのデバックが捗るエラー画面 Better Errors 使ってみた！](http://morizyun.github.io/blog/better-error-gem-rails-ruby-rack/)

# pry-rails
https://github.com/rweng/pry-rails
※ 環境によっては、gem rb-readlineを入れないと動かないかも?[Pry FAQ](https://github.com/pry/pry/wiki/FAQ#readline_threads)

上記サイトのUsageの抜粋
```bash
rails console #pryが起動する
pry(main)> show-routes #routes一覧の表示
pry(main)> show-routes --grep beer #grepの例
pry(main)> show-models #モデルと属性の一覧
pry(main)> show-model Model #Modelの属性
```

# pry-doc
pry上でクラスやらメソッドやらのドキュメントやソースを確認できる優れもの

https://github.com/pry/pry-doc
```bash
pry(main) > ? String # ドキュメントを表示
pry(main) > $ String # ソースコードを表示
```

# pry-byebug
gdbばり(?)のデバッガを提供してくれる
https://github.com/deivid-rodriguez/pry-byebug

停止したい箇所にbinding.pryを入れる.

```rb
def some_method
  binding.pry          # ブレークポイント設定
  ...
end
```

gdbのように改行で直前のコマンドの繰り返しにはならないようなので、
なるようにしてみた。[pryをいじってpry-byebugを使いやすくしてみた.](http://qiita.com/hmu29/items/08f99f1e6c56d346bc37)

# better-errors, binding-of-color
ブラウザのエラー画面を見やすく、かつエラー画面からirbを実行できる優れもの。
http://morizyun.github.io/blog/better-error-gem-rails-ruby-rack/
revelでmgo実装テスト　その3

 その2まではDBとのやり取りが中心だったので、実際に取り出した値を加工する方法について実装しておきます。MongoDBにおいて、値を実際に取り出すとbson形成になるのでこれを加工しやすいように元の構造体にマッピングし直すます。実際にDBに登録する構造体は今までのように以下となります。

```Go:person.go
ackage models

import (
	"labix.org/v2/mgo/bson"
)

var (
	err error
)

type Person struct {
	PersonID     bson.ObjectId `bson:"_id,omitempty" json:"-"`
	FirstName    string        `bson:"firstName" json:"firstName"`
	LastName     string        `bson:"lastName" json:"lastName"`
	Nickname     string        `bson:"nickname" json:"nickname"`
	Email        string        `bson:"email" json:"email"`
	SecurityCode int           `bson:"securityCode" json:"securityCode"`
}
```
　次に取り出したbsonデータをPerson構造体にマッピングします。方法としてはbsonデータをjsonに変換し、その後Person構造体にマッピングします。

```Go:session.go

package controllers

import (
	"github.com/robfig/revel"
	"encoding/json"
	"labix.org/v2/mgo/bson"
	"testApp/app/models"
)

func DecordingBSONtoJSON(bsonData interface{}) models.Person {
	rawJsonData, err := json.Marshal(bsonData)
	if err != nil {
		panic(err)
	}

	var person models.Person
	err = json.Unmarshal(rawJsonData, &person)
	if err != err {
		panic(err)
	}

	return person
}
```
 bsonDataはDBから持ってきたbsonデータです。それをjson.Marshal(xxx)で[]byteに変換し、その後json.Unmarshal(yyy)でPersonにマッピングして完了です。少し回りくどいですが一応機能としては問題なく動作しました。
JavaScriptでの継承　関数プロパティprototypeについて


##前提
ホントに最近はJavaScriptについてたくさんのいい本が出ていますね。
私もいろいろ読ませて頂きましたが、私なりに掲題について一旦頭をまとめるために書きました。

いろいろ書き始めたら、いろいろがいろいろに絡み合って、あれもこれもとなってしまいました
なので、全部やめて、言葉足りないかもしれませんが、未来の自分にとってはこのくらいでまとめておきました。とりあえずです。

##そんでindex.html書いた
```html:index.html
<html>
<head>
	<meta charset="utf-8">
</head>
<script type="text/javascript">

/////////ユーザ定義でコンストラクタ関数定義
		function MyObj(){}
		var obj1= new MyObj();

		try{
			obj1.echo("obj1のecho");
		} catch(e) {
			console.log("obj1のechoがない");
		}

		//prototypeプロパティにechoメソッドを追加
		MyObj.prototype.echo = function(str){console.log(str);}
		var obj2 = new MyObj();
		try{
			obj2.echo("obj2のecho");
		} catch(e) {
			console.log("obj2のechoがない");
		}

		

//////////String（組み込みコンストラクタ関数）について
		var str = new String();
		try{
			str.echo("strのecho");
		} catch(e) {
			console.log("strのechoがない");
		}
		//Stringのプロトタイプにechoメソッド追加
		String.prototype.echo = function(str){console.log(str);};
		var hogeStr = new String("");
		hogeStr.echo("hogeStrのecho");

		//こちらも実質Stringにechoが追加されてから"文字列"はインスタンス化されているのでOK
		"文字列".echo("文字列のecho");

</script>
</html>
```

##結果
ブラウザに貼り付けて、ブラウザのコンソール見ると下記の結果が出力されていますね。

```javascript:結果
"obj1のechoがない" 
"obj2のecho"      
"strのechoがない"  
"hogeStrのecho"   
"文字列のecho"     
```
frameRateとframeRate()の関係

Processingのdraw()関数が1秒間に何回呼ばれるかreferenceを眺めただけだと、よくわからなかったので、ちゃんと調べてみました。

デフォルトだとが60fpsになっているようです。

- frameRate: 現在のおおよそのfpsを格納しているシステム変数。初期値は10fpsだが、フレーム毎に更新される。5−10回draw()関数を実行した後に有効になる。
- frameRate(): setup()関数中でfpsを設定するための関数。デフォルトは60fps。プロセッサが遅いと設定したfps以下になることがある。
- draw(): 1秒間に何回実行するかはframeRate()関数で制御する。draw()はsketchで１つでなければならい。連続実行させるか、イベントを処理するためにdraw()が必要。そのため、からのdraw()関数を定義する必要があることがある。
(draw()のreferenceのサンプルプログラム参照)

起動直後は10fpsですが、数回draw()関数を実行した後は、frameRate()で設定した値(デフォルトでは60fps)に近づくとのことです。
値が安定しないのは、処理によってはfpsが低下するためのようです。draw()を実行するタイミングで、イベント割り込みも制御しているようですので、イベント割り込みをよく使うプログラムだとfpsが低下するかもしれません。
モッタがPSGとの契約を更改

![18.jpg](https://qiita-image-store.s3.amazonaws.com/0/42827/f130f42a-4a1f-2215-2353-f8179f9378f0.jpeg)

<p align="justify">ミッドフィルダーのモッタは、PSGとの契約について、2016年の夏まで延長した。</p>

<p align="justify">ティアゴ・モッタは、パリ・サン=ジェルマンと2016年夏のリーグ・アン・チャンピオンまでの1年間の契約にサインしたと、確認された。</p>

<p align="justify">モッタの現在の契約は、2015年6月末日までである。</p>

<p align="justify">ブラジル出身のイタリア人であるモッタは、2012年1月にインテルからPSGに移籍して来た。そして、ローラン・ブランの下で、65試合に出場し8回ゴールを決めた。</p>

<p align="justify">報道を受けて、クラブは「パリ・サン=ジェルマンは、ティアゴ・モッタとの契約を2016年まで延長できたことを嬉しく思います」とツイートした。</p>

<p align="justify">バイエルンや<b><a href="http://www.bundesliga.com/jp/liga/clubs/borussia-dortmund/daten.php" title="ボルシア·ドルトムント">ボルシア·ドルトムント</a></b>のような人気のクラブについての詳細を知りたいですか？私たちを訪問。</p>
SharePoint 2013 のインストールでハマったところ

# SharePoint 2013 構成ウィザード のエラー
> System.ArgumentException の例外がスローされました。例外の追加情報: SDDL 文字列に無効な sid または変換できない sid が含まれています。 
> 
> パラメーター名: sddlForm 

1. C:\Program Files\Microsoft Office Servers\15.0\Data\Office Server を表示する
1. Analytics_(36桁の英数文字)フォルダのプロパティを表示する
1. [共有]-[詳細な共有]をクリックする
[このフォルダーを共有する]をオンにし、[アクセス許可]で"WSS_ADMIN_WPG"をフルコントロールで追加する

# AppFabric キャッシュサービスが起動しない
> Microsoft.Office.Server.UserProfiles.LMTRepopulationJob 
> &nbsp;&nbsp;string1 da5a3718-ec76-4c45-8c37-b63bcf1a7912 
> &nbsp;&nbsp;string2 FeedCacheService.IsRepopulationNeeded で不明な例外が発生しました: DataCache を作成できません。SPDistributedCache がダウンしています。。 

1. C:\Program Files\Windows Server 用 AppFabric 1.1 フォルダを開く
1. DistributedCacheService.exe.config のプロパティを表示する
1. [セキュリティ]-[編集]-[追加]をクリックする
1. "NETWORK SERVICE"をフルコントロールで追加する
[Mac] [OS X] [Eclipse] Heapサイズの変更方法


# Heapサイズの変更

MacのEclipseが重かったりEclipse経由でサーバを起動したときにOutOfMemoryExceptionが発生するような場合は、Eclipseに割り当てるHeapサイズを増やします。
Macでは `eclipse.ini` の場所がわかりにくいので紹介します。
ファイルの場所以外、変更内容自体はWindows、Linuxでも同じです。

## eclipse.iniを変更する

Eclipseインストールディレクトリ内 `Eclipse.app` で右クリック（設定により長押し）→ `パッケージの内容を表示` を選択。

![スクリーンショット 2014-04-30 20.39.15.png](https://qiita-image-store.s3.amazonaws.com/0/40758/ae3982e8-5400-2eb8-7e3c-689d67f74870.png)

上記操作で `Contents` ディレクトリが開くので `MacOS` → `eclipse.ini` をテキストエディタ等で開く。

![スクリーンショット 2014-04-30 21.18.54.png](https://qiita-image-store.s3.amazonaws.com/0/40758/c418c043-05c9-ec11-aaf1-163b39c5e70f.png)

`-vmargs` の行より下がJavaVMに対する設定です。`Xmx`の値をマシンスペックに合わせて変更します。私の端末ではデフォルトで505mだったのを1024m（`-Xmx1024m`）に変更しました。

```text:eclipse.iniの例（抜粋）
（ここより上は省略）
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Dhelp.lucene.tokenizer=standard
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XX:MaxPermSize=256m
-Xms40m
-Xmx1024m
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-javaagent:../../../plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

```

### 保存したら忘れずにEclipseを再起動しましょう。
ActiveRecord migrationのPRIMARYKEY名の変更

```rb:hoge.rb
class Hoge < ActiveRecord::Migration
  def up
    create_table(:fuga, primary_key: 'hoge_id') do |d|
      d.timestamps
    end
  end
end
```

これで、PRIMARY KEY & auto-incrementの設定がされた"id"以外の名前のcolumnができる。
Ubuntu12.04にSublimeText2のインストールと日本語入力設定


# SublimeText2をインストール
> cf.[Ubuntuにsublime text 2をインストール]( http://pgnote.net/?p=2174)

以下のコマンド実行

```bash
$ sudo add-apt-repository ppa:webupd8team/sublime-text-2
$ sudo apt-get update
$ sudo apt-get install sublime-text
```

[sublimetext公式サイト](http://www.sublimetext.com/2) からダウンロードするより楽でした。
シンボリックリンクを自動で付けてくれているようです。

```bash
$ which subl
/usr/bin/subl
```

これで、

```bash
$ subl
```

と入力すれば、sublime text が起動します。

# SublimeText2の日本語化力化
**[LinuxでのSublimeTextの日本語入力](http://qiita.com/moonoverwalker/items/b2a1b40ccabc820917cb) を非常に参考にしています。**
(リンク先ではSublimeText3を対象としていましたが、SublimeText2でもできました。)

SublimeText2は、デフォルト状態ではUbuntuで日本語入力ができません。
日本語入力設定の流れを以下に記します。


## Mozcのインストール
以下のコマンド実行

```bash
$ sudo apt-get install -y ibus-mozc
```

Mozcの設定を行う必要があるので、
**[Mozcのインストール・設定・操作説明](http://www.orca.med.or.jp/receipt/download/precise/mozc.html)**
 で確認してください


## emacs-mozcのインストール
以下のコマンド実行

```bash
$ sudo apt-get install -y emacs-mozc
```

## SublimeTextにPackageControlをインストール


[Installation - Package Control](https://sublime.wbond.net/installation#st2)
のタブ内のテキスト「import urllib2 ～～～」をすべてコピー。
メニューバーの `View > Show Console ` を押下。
下の方にでた入力画面にコピーしたテキストを貼り付けて、Enter。
その後SublimeText再起動。

## レポジトリの追加
`Ctril+Shift+P` でコマンドパレットを開いて「Package Control:Add Repository」を選択し、

https://github.com/yasuyuky/SublimeMozcInput

と入力してリポジトリを追加

## SublimeTextプラグイン「SublimeMozcInput」のインストール
コマンドパレットから「Package Control:Install Package」で「SublimeMozcInput」を入力、選択してインストール。
これでエディタ上で `ctrl+¥` を押すことで日本語入力ができるようになります。

## キーバインドの設定
デフォルトでは、日本語入力と英数入力の切り替えは `ctrl+¥` になっています。このキーバインドは変更可能です。
例えばキーバインドを `ctrl+space` にしたい場合、
メニューバーのPreferences > Key Binding-User を押下し、表示されたファイル内に、

[
{ "keys": ["ctrl+space"], "command": "toggle_mozc" }
]

と追加すれば、`ctrl+space` で日本語入力と英数入力の切り替えができます、
OpenCVを使ってドット絵をテイストそのままに拡大してみた


ドット絵の画像を拡大すると、ぼやけてしまいドット絵のテイストがなくなってしまいます。
![hero.png](https://qiita-image-store.s3.amazonaws.com/0/42150/b66766fe-c0e9-6b97-2a07-482e383819bd.png "hero.png") ![big_hero.png](https://qiita-image-store.s3.amazonaws.com/0/42150/a33bb621-aa06-e538-de84-a16efac4b0dc.png "big_hero.png")

これはバイリニア補間のような、周辺の画素値を用いて滑らかに画素が並ぶよう補間するアルゴリズムを用いているためです。
一般的な画像の拡大には効果的なのですが、ドット絵のテイストを保持したまま拡大したい場合には適しません。
ドット絵のテイストを保持したまま拡大すると以下のようになります。

![output.png](https://qiita-image-store.s3.amazonaws.com/0/42150/094f9433-9832-0976-2d7f-282d95d3aa03.png "output.png")

このドット絵のテイストを保持したまま画像を拡大するプログラムをOpenCVを用いて作りました。

_[@mori0091](https://twitter.com/mori0091)さんのご指摘により、非常に簡潔なコードとなりました。（2014/4/30修正）_


```cpp:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
  using namespace cv;

  // 拡大の倍率
  const int zoom_factor = 10;

  // 入力画像ファイル
  const Mat src_img = imread("sample.png");

  // 出力画像ファイル
  Mat dst_img;

  resize(src_img, dst_img, Size(), zoom_factor, zoom_factor, INTER_AREA);

  // 出力画像の保存
  imwrite("output.png", dst_img);

  // 出力画像の表示
  imshow("output", dst_img);
  waitKey(0);
}
```

アルファチャンネル付きのPNG画像を拡大する場合は、画像を読み込む際にアルファチャンネルの値も含めて読み込む指定をする必要があります。
プログラムは以下のようになります。

```cpp:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
  using namespace cv;

  // 拡大の倍率
  const int zoom_factor = 10;

  // 入力画像ファイル
  const Mat src_img = imread("sample.png", -1);

  // 出力画像ファイル
  Mat dst_img;

  resize(src_img, dst_img, Size(), zoom_factor, zoom_factor, INTER_AREA);

  // 出力画像の保存
  imwrite("output.png", dst_img);

  // 出力画像の表示
  imshow("output", dst_img);
  waitKey(0);
}
```

ちなみにPhotoshopで、イメージ → サイズ変更 → 画像解像度 を選択し、ニアレストネイバー法を選んで解像度を変えても同じことができます。

上記で使用したドット絵は全て[REFMAP](http://www.tekepon.net/fsm/)さんよりお借りしました。
お試し serverspec

# はじめに
* 最近、Infrastructure as Code の精神で chef を使ったインフラ構築を試しているが、そろそろテストについて考えるタイミングに来たので serverspec を触ってみる

# 環境
* Mac
* vagrant インストール済み
    * [Vagrant を使用して仮想マシンを作成してみる](http://qiita.com/kasaharu/items/5270f6d9737e7bd9b917)
* knife-solo インストール済み
    * [初めての Chef](http://qiita.com/kasaharu/items/395b55c06f8b4477019d)

# serverspec のインストール
```bash
$ gem install serverspec
```

# テスト対象の準備
* 今回は nginx をインストールしたサーバをテスト対象とする
* サーバは Vagrant で仮想サーバを用意し、 nginx のインストールは chef でおこなう
    * vagrant で用意する OS は Ubuntu とする

## 仮想サーバの用意
* Box がない場合は、公式の Ubuntu を用意しておく
    * すでに Box がある場合はスキップ

```bash
$ vagrant box add precise32 http://files.vagrantup.com/precise32.box
```

* 任意のディレクトリを用意し、仮想サーバの初期化をする

```bash
$ vagrant init precise32
```

* 設定ファイルの編集
    * Vagrantfile の L.26 の下記設定のコメントアウトを外す
    * "config.vm.network :private_network, ip: "192.168.33.10""

* 仮想マシンを起動

```bash
$ vagrant up
```

* ssh config に設定を保存する
    * 任意の名前を今回は testmachine とする

```bash
$ vagrant ssh-config --host “任意の名前” >> ~/.ssh/config
```

## chef による Recipe の用意
* chef のリポジトリ作成

```bash
$ knife solo init testForServerspec
```

* 作成したリポジトリに移動

```bash
$ cd testForServerspec
```

* knife solo を使用し、vagrant で作成した ubuntu に Chef をインストール

```bash
$ knife solo prepare testmachine
```

* 下記が出力されるとインストール完了
> Thank you for installing Chef!

同時に testForServerspec/nodes/testmachine.json が作成される

* nginx をインストールするための cookbook を作成する

```bash
$ knife cookbook create nginx -o site-cookbooks
```

* 上記コマンド入力後に作成される site-cookbooks/nginx/recipes/default.rb を編集する

```rb:default.rb
############################## nginx install

log "Nginx install ..."
package "nginx" do
  action :install
end

service "nginx" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable , :start ]
end
log "Nginx install Done!!!"
```

* 続けて、 node/testmachine.json も編集する

```json:testmachine.json
{
  "run_list":[
    "recipe[nginx]"
    ]
}
```

* chef の実行

```bash
$ knife solo cook testmachine
```

* 実行後、ブラウザから "http://192.168.33.10/" にアクセスすると "Welcome to Nginx!" のページが表示される
    * 上述の Vagrantfile の設定で 192.168.33.10 の IP を有効にしておくこと

# serverspec の設定
* Vagrantfile があるディレクトリで下記コマンドを入力し、初期化をおこなう

```bash
$ serverspec-init
```

* 各設定は次のように指定

```
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: y
Auto-configure Vagrant from Vagrantfile? y/n: y
 + spec/
 + spec/default/
 + spec/default/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile
```

* 作成された spec/default/httpd_spec.rb はサンプルコードになっているので、リネームして編集していく
    * spec/default/httpd_spec.rb -> spec/default/nginx_spec.rb

```rb:nginx_spec.rb
require 'spec_helper'

describe package('nginx') do
  it { should be_installed }
end

describe service('nginx') do
  it { should be_enabled }
  it { should be_running }
end

describe port(80) do
  it { should be_listening }
end
```

## テストの実行

* RSpec と同様に下記コマンドで実行可能

```bash
$ rake spec

....
Finished in 1.56 seconds
4 examples, 0 failures
```

* vagrant の仮想サーバを一度 destroy した後、再度 vagrant up した状態で(chef で nginx を入れる前に) 再度テストを実行するとテストが失敗することが確認できる


# 参考
* [公式ページ](http://serverspec.org/)
* [WEB+DB PRESS Vol.80]
git subtree使ってみた


共通で使いたいcssを別リポジトリで管理したくてgit subtree使ってみた。
cssを複数箇所で触る可能性もあるのでsubmoduleは使わずに。

### サブツリーの追加

親リポジトリで共通で使いたいcssのリポジトリをaddしてfetchしておく。

```
git remote add <repo_name> <url>
git fetch <repo_name>
```

サブツリーを追加。prefixで指定したパスにサブツリーがクローンされる。

```
git subtree add --prefix=app/assets/stylesheets/sub_css <repo_name> master
```

### 変更したファイルのpush/pull

何らかの編集を加える

```
git add app/assets/stylesheets/sub_css/hoge.scss
git commit -m "edit"
```

変更をサブツリーにpush

```
git subtree push  --prefix=app/assets/stylesheets/sub_css <repo_name> master
```

サブツリーの側から変更した場合はpullして親レポジトリに変更を反映

```
git subtree pull --prefix=app/assets/stylesheets/sub_css <repo_name> master
```
Haml で IE conditional comments を書く

## IE conditional comments

特定の IE だけに CSS を適用したい時などに利用する HTML の条件付きコメントのこと

[条件付きコメント - Wikipedia](http://ja.wikipedia.org/wiki/%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)

以降では、上記 Wikipedia の用語を使わせてもらいます。使うのは以下。

- 下の階層が隠れる条件付きコメント
- 下の階層が見える条件付きコメント

## 下の階層が隠れる条件付きコメントの場合

[Haml - Conditional Comments](http://haml.info/docs/yardoc/file.REFERENCE.html#conditional_comments_)

公式にあるように以下のような記法が用意されている。以下そのまま引用です。

```haml
/[if IE]
  %a{ :href => 'http://www.mozilla.com/en-US/firefox/' }
    %h1 Get Firefox
```

```html
<!--[if IE]>
  <a href='http://www.mozilla.com/en-US/firefox/'>
    <h1>Get Firefox</h1>
  </a>
<![endif]-->
```

## 下の階層が見える条件付きコメント

Wikipedia の説明が詳しいが、HTML で記述する場合は以下のように書くことが多いと思います。以下引用です。

```html
<!--[if gt IE 6]><!-->
このコードはIE以外のブラウザーとIE 7以降で表示される。
<!--<![endif]-->
```

この単一のコメントで構成されない書き方の場合は Haml では記法が用意されていないようなのです。`plain` で記載するという方法もありますが、調べていると以下の方法が提案されていました。

[“[ !IE]” conditional comments in Haml - stackoverflow](http://stackoverflow.com/questions/9107681/ie-conditional-comments-in-haml?lq=1)

```haml
= surround '<!--[if gt IE 6]><!-->'.html_safe, '<!-- <![endif]-->'.html_safe do
  このコードはIE以外のブラウザーとIE 7以降で表示される。
```

まあ、やっていく事は Haml ぽいわけでも無いのですが、いささかマシに見えるので今のところこう書くのがいいのかなと思っています。

### surround が使えない場合

[faml](https://github.com/eagletmt/faml) は `surround` が無いのでどうしようかなぁと思っていたのですが、全部 HTML で書かなくても以下のような感じで十分ぽい。

```haml
/[if gt IE 6]
  != '<!-->'
  = '内容'
  != '<!--'
```

> 全然余談だけど、`[if (!IE)|(gte IE 8)]` こういう OR ぽい書き方があることを知った。否定があるんだからあるんだろうなぁとは思っていたが。
https://msdn.microsoft.com/en-us/library/ms537512.aspx
パーミッションの名称一覧を出力する


パーミッションのID(uses-permissionのandroid:name属性)と設定画面に表示されるパーミッションの名称や説明の対応関係がわからない時に簡単に分かる方法が無いかと調べてみたところ端末(orシミュレーター)内のpmコマンドで簡単に一覧を出力できるようです。

端末orシミュレーターをPCに繋いで以下のコマンドで一覧を取得できます。名称や説明は端末内の言語設定によって変わります。

```
$ adb shell pm list permissions -f -g
All Permissions:

+ group:android.permission-group.DEVELOPMENT_TOOLS
  package:android
  label:開発ツール
  description:アプリのデベロッパーにのみ必要な機能です。
  + permission:android.permission.ACCESS_ALL_EXTERNAL_STORAGE
    package:android
    label:全ユーザー外部ストレージへのアクセス
    description:すべてのユーザーの外部ストレージへのアクセスをアプリに許可します。
    protectionLevel:signature
  + permission:android.permission.SIGNAL_PERSISTENT_PROCESSES
    package:android
    label:アプリへのLinuxシグナルの送信
    description:受信したシグナルをすべての継続プロセスに送信するようリクエストすることをアプリに許可します。
    protectionLevel:signature|system|development
  + permission:android.permission.READ_LOGS
    package:android
    label:機密ログデータの読み取り
    description:システムの各種ログファイルの読み取りをアプリに許可します。許可すると、アプリでは携帯端末の使用に関する全般的な情報を読み取れるようになります。この情報には個人情報や機密情報が含まれる場合があります。
    protectionLevel:signature|system|development
  + permission:android.permission.SET_ALWAYS_FINISH
    package:android
    label:バックグラウンドのアプリの強制終了
    description:バックグラウンドになりしだい操作を常に終了するかどうかの制御をアプリに許可します。通常のアプリでは不要です。
    protectionLevel:signature|system|development
  + permission:android.permission.WRITE_SECURE_SETTINGS
    package:android
    label:システムのセキュリティ設定の変更
    description:システムのセキュリティ設定データの変更をアプリに許可します。通常のアプリでは使用しません。
    protectionLevel:signature|system|development
  + permission:android.permission.SET_PROCESS_LIMIT
    package:android
    label:実行中のプロセスの数を制限
    description:実行するプロセスの上限数を制御することをアプリに許可します。通常のアプリでは不要です。
    protectionLevel:signature|system|development

(以下略)
```

## 例

### com.google.android.c2dm.permission.RECEIVE

```
  + permission:com.google.android.c2dm.permission.RECEIVE
    package:com.google.android.gsf
    label:インターネットからデータを受信する
    description:アプリのサービスから送信されるクラウド-デバイスメッセージの受信をアプリに許可します。このサービスを利用するとデータ通信が発生します。悪意のあるアプリケーションにより過剰なデータ通信が発生する恐れがあります。
    protectionLevel:normal

```
GCM(Google Cloud Messaging)で必要

### com.google.android.providers.gsf.permission.READ_GSERVICES

```
  + permission:com.google.android.providers.gsf.permission.READ_GSERVICES
    package:com.google.android.gsf
    label:Googleサービス設定を読み取る
    description:Googleサービス設定データの読み取りをこのアプリに許可します。
    protectionLevel:normal

```
Google Play Services SDK内のMaps APIで必要

### android.permission.GET_ACCOUNTS

```
  + permission:android.permission.GET_ACCOUNTS
    package:android
    label:この端末上のアカウントの検索
    description:携帯端末で認識されているアカウントのリストの取得をアプリに許可します。これには、インストールしたアプリによって作成
されたアカウントも含まれます。
    protectionLevel:normal
```
Google Play Services SDK内の以下のサービスで必要

* GCM ([Android 4.0.4以上の端末では不要らしい](http://stackoverflow.com/a/18444343/1001338
))
* Google Drive API
ThinReportsのリストでページ内にあと何行追加できるか調べたい

# ThinReportsのリストでページ内にあと何行追加できるか調べたい

listにadd_rowで行を追加していくと、
ページに収まらなくなった場合にも自動的に改ページされて便利です。

ですが、複数行をひとかたまりとして追加して、
途中で改ページされたくない場合もあるかと思います。
（まとめて5行追加したいのに3行しか入らないとわかれば、その時点で`page_break`で改行したい）

そんな時はそのページにあと何行追加できるのか知りたくなります。

ソースを読んだところ、行を追加してページ内に収まらなくなったことを検出するメソッド`overflow?`は見つかりましたが、あと何行追加できるか調べるメソッドは見つけられませんでした。

ということで自分でメソッドを作りました。

```rb:page.rb
module ThinReports
  module Core::Shape

    class List::Page < Basic::Interface
      def rest_row_count
        height = manager.current_page_state.height
        row_height = manager.current_page_state.format.section_height(:detail)
        max_height = manager.page_max_height
        row_count = (height / row_height).floor
        max_row_count = (max_height / row_height).floor
        max_row_count - row_count
      end
    end

  end
end
```

`id = :details`のリストオブジェクトの場合

`page.list(:details).rest_row_count`

でcurrent_pageに追加できる残り行数がわかります。
Parse.com を導入する際に気を付けること：セキュリティの甘さについて

# そのままじゃやばいという話

## Parse ってなに？

Baas （Backend As A Service）プラットフォームとしてとても有名なサービスでFacebookに買収された会社。apigee とか kinvey も有名。2013年の頭ぐらいからこの手のサービスが北米を中心にいくつか立ち上がり、大型の資金調達を経て今に至るといった感じ。サイトは http://parse.com

超簡単に開発中のサービスやアプリに導入できるのが素敵。本当に簡単すぎる。

## どれぐらいやばいのか

超簡単にできるぐらいなので、そのままだとかなり危険。データベースをネットにさらしているようなもの。MySQLとかPostgreSQLとかOracleの入口をID、パスワードを公開してネットにさらしてる感じと、まずは理解する。

例）

- 保存されたユーザーのメールアドレスを誰でも閲覧可能
- データの一覧は取り放題
- 誰でもデータも消せちゃう

クライアント側からSQLで言うところの、SELECT, UPDATE, INSERT, DELETE 呼べてるんだから、当然。

## やること

パーミッションの設定をちゃんとやる

- テーブル（クラス）レベルでのCRUDの制限
- レコードレベルでのACLの設定

など。もっと、ちゃんとやりたければ、Cloud Code を書いてデプロイし、それをクライアントから呼ぶようにする。Cloud Code を書きまくる必要があるなら、Parse 使う意味あるかわからないので、そこら辺から見直すべき。複雑な業務ロジックを持つサービスが Parse にロックインされるのが良いか悪いかプロジェクトごとで判断すべき。

## あとがき

- セキュリティには配慮しよう
- グロースハッカー消えてください

2013年ぐらいはベータ公開されたBAAS系のサービスは往々にしてセキュリティが甘々なので本当にやばかった。他人のサービスのデータを自由気ままに触れる状態。新しいものはだいたいそんな感じなのが常。BAASに限らず、閲覧可能なところにCSVファイルやらログファイルを置いちゃう事案は毎年どこかでニュースになるので、BAASが悪いわけではない。
「彼らは攻撃されたくないと思っている」--- ナスリはバルセロナを倒すためにマンチェスター・シティーに戻って来た。

![15.jpg](https://qiita-image-store.s3.amazonaws.com/0/42827/2475c8ee-96f7-5fd6-3a25-360ca5eca87d.jpeg)

<p>フランス代表チームは、マルティン・デミチェリスが処分される前までには、カタルーニャはほとんど問題を起こしておらず、<b><a href="http://www.bundesliga.com/jp/liga/clubs/fc-bayern-muenchen/daten.php" title="バイエルン">バイエルン</a>・</b>ミュンヘンはより良いチームであると伝えた。</p>

<p>サミル・ナスリは、マンチェスター・シティーのチームメイトに、運命を左右するチャンピオン・リーグのカンプ・ノウでのベスト16の第2戦の間、「怖がらないで」バルセロナと戦うように呼び掛けた。</p>

<p>火曜日のエティハド・スタジアムでのリオネル・メッシとダニエウ・アウヴェスのゴールは、マヌエル・ペレグリーニ監督率いるチームに、3月12日の試合を前に、大きなプレッシャーを与えた。</p>

<p>また、ナスリは、2月のバレンシアのカンプ・ノウでの3対2での勝利を引いて、シティーのトーナメントでバルセロナの打倒に期待を寄せた。</p>

<p><br />
</p>
Laravel 特定のフィルタだけを外す


ファンクショナルテストなどを書く際に、authフィルタは活かしたいけど、csrfフィルタは外したいという場合があります。

下記のように`Event::forget()`で、該当フィルタのイベントを削除すると、該当フィルタだけを外すことができます。

```php
Route::enableFilters(); // テストでフィルタを有効化
Event::forget('router.filter: csrf'); // csrfフィルタを削除
```

`'router.filter: ' + フィルタ名`で、イベントを指定します。（フィルタ名の前には半角スペースが必要）

フィルタ名には、`app/filters.php`で定義している`Route::filter()`の第一引数です。

```php
Route::filter('csrf', function () {
    if (Session::token() != Input::get('_token')) {
        throw new Illuminate\Session\TokenMismatchException;
    }
});
```
700個以上のJavaScriptライブラリを配信する「cdnjs」

http://cdnjs.com/ (Webサイト)

## cdnjs について

http://takanosho.wordpress.com/2012/10/29/cdnjs-major-js-library-hosting-cdn/ より引用
JavaScriptライブラリを気軽に参照することができるCDNは便利ですが、Google CDNやMicrosoft CDNにはjQueryなどの超メジャーどころのライブラリしか登録されておらず、CDNだけですべてを済ませることはできません。
(中略)
こちらのCDNはBackbone.jsやUnderscore.jsなどの「比較的メジャーだけどGoogle CDNやMicrosoft CDNに登録されていないライブラリ」がホストされており、こちらから参照することで気軽にこれらのライブラリが使えます。

## 注目のライブラリ

* http://cdnjs.com/libraries/less.js
* http://cdnjs.com/libraries/angular.js
* http://cdnjs.com/libraries/backbone.js
* http://cdnjs.com/libraries/underscore.js
* http://cdnjs.com/libraries/knockout
* http://cdnjs.com/libraries/coffee-script
* http://cdnjs.com/libraries/typescript

## 参考

* [人気上昇中のJavaScriptライブラリを調べてみた［ジャンル別に比較］](http://www.buildinsider.net/web/popularjslib/2014)

* [LESSでCSSを書いてみた](http://www.torounit.com/blog/2011/09/01/868/)
* [AngularJS 1.2 日本語リファレンス | js STUDIO](http://js.studio-kingdom.com/angularjs)
* [Backbone.js入門 – 初学者の為のロードマップ | mawatari.jp](http://mawatari.jp/archives/roadmap-for-backbonejs-beginners)
* [Underscore.jsの入り口 (第1回　Underscore.jsとは)](http://gihyo.jp/dev/serial/01/underscorejs/0001)
* [Underscore.jsの入り口 (第2回　Underscore.jsのコレクションと配列とオブジェクトの機能)](http://gihyo.jp/dev/serial/01/underscorejs/0002)
* [Underscore.jsの入り口 (第3回　Underscore.jsの関数とユーティリティとChaining)](http://gihyo.jp/dev/serial/01/underscorejs/0003)
* [MVVMフレームワーク「knockout.js」が超絶便利！！その概要と使いどころなどについて](http://analogic.jp/knockoutjs-summary/)
* [TypeScript: .NET 開発者の JavaScript への抵抗をなくす](http://msdn.microsoft.com/ja-jp/magazine/jj883955.aspx)
* http://www.typescriptlang.org/playground
* http://www.typescriptlang.org/Handbook
* [TypeScript クイックガイド](http://phyzkit.net/typescript/)
フォルダを指定してHTTPサーバーを立ち上げるGroovyスクリプト

1. Python の SimpleHTTPServer みたいなのが欲しかったけど自分は Windows の Groovy ユーザーだった。
2. [調べたら](http://groovy.329449.n5.nabble.com/groovy-one-liner-to-run-HttpServer-td3245538.html)、 Groovy のサンプルに `SimpleWebServer.groovy` というのがあり、同じようなことができるらしい。
3. 実際に使ってみたら、１リクエストごとに `java.io.FileNotFoundException: .\favicon.ico (指定されたファイルが見つかりません。)` というエラーが出る。
4. 当然のように日本語名ファイル（フォルダ）には対応していない（文字化けする）。

悔しかったので自作した。

java 1.7 以上。Windows7 上の Chrome と Firefox でのみ動作確認済み。

#使い方
```text:使い方
F:\tmp\http>tree /f
│  index.html
│  http.groovy
│
└─フォルダ
        ほげ.txt

F:\tmp\http>groovy http.groovy

port=80
base-dir=F:\tmp\http\.
```

![http.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/538070bf-4722-b777-bc29-57606b8cf4f9.jpeg)

![http.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/a0c00e55-7655-ee0e-f5f9-58c9f2d8e2c5.jpeg)

```text:usage
>groovy http.groovy -h
usage: http <option>
 -b,--base-dir <path>   ベースディレクトリのパス（デフォルトはカレントディレクトリ）
    --debug             デバッグモードで実行する。
 -h,--help              このヘルプを表示する。
 -p,--port <port>       ポート番号を指定する（デフォルト 80）
```

#java コマンドで実行する

Groovy をインストールしていない環境用。

以下の jar を用意する。

- `%GROOVY_HOME%\embeddable\groovy-all-2.x.x.jar`
- `%GROOVY_HOME%\lib\commons-cli-1.2.jar`

Groovy のコードを `http.groovy` で保存して、以下のコマンドで実行。

```text:
>java -cp commons-cli-1.2.jar;groovy-all-2.x.x.jar groovy.ui.GroovyMain http.groovy
```

#実装
[opengl-8080/groovy-http-server](https://github.com/opengl-8080/groovy-http-server)

#参考
- [JDK 6から同梱されている、簡易HTTPサーバを使う - Starlight](http://d.hatena.ne.jp/Kazuhira/20121012/1350058511)
【論文つらい】あっ、はみ出ちゃった… ってときに


# LaTeXで余白を切り詰める

1ページやら2ページやらの厳しいページ制限があるようなレジュメをTeXで書いていると
「あと3行だけ減らせたら勝てるのにッ…！」
みたいなことがよくあると思います．
そんな時に出来る悪あがきを列挙していきます．

## 注意

**おそらくどれもTeX的にはあまり良くないやり方なので，まずコンテンツ量を調整する努力をしましょう．**
どうしても削り切れない時や ~~正直どうでもいいような超低プライオリティな文書を作るときに~~この記事に書いてるものを試してみるといいです:D


## いろいろなやりかた

いずれもプリアンブル（`documentclass`と`\begin{document}`の間）に記述する．

### 行間を詰める

CSSでいうところの`line-height`．
効果は大きいが詰め過ぎると見た目に苦しくなるので注意．

```latex:
\def\baselinestretch{0.85}
```


### 図の前後の余白を詰める

どこが詰められるかはコメントの通り．
図が多い場合に効果を発揮する．

```latex:
% 図と図の間のスペース
\setlength\floatsep{2truemm}
% 本文と図の間のスペース
\setlength\textfloatsep{2truemm}
% 本文中の図のスペース
\setlength\intextsep{0pt}
% 図とキャプションの間のスペース
\setlength\abovecaptionskip{1truemm}
```

`\setlength`を`\addlength`に変更したら"デフォルトの余白からx mm長くする（短くする）"，といった指定も可能になる．

### section前後の余白を詰める

（`jsarticle`限定？）

`jsarticle.cls`にある`section`コマンドを再定義して`{0.6\Cvs}{0.4\Cvs}`の数字を調整する（最初が上マージンで2つめが下マージン？）．

```latex:
\makeatletter
  % sectionの下マージンを小さく
  \renewcommand{\section}{%
    \@startsection{section}{1}{\z@}%
    {0.4\Cvs}{0.1\Cvs}%
    {\normalfont\large\headfont\raggedright}}
\makeatother
```

### タイトルの余白を詰める

（`jsarticle`限定？）


おなじく`jsarticle.cls`から`maketitle`出力部分をコピペしてきて再定義する．
`\vskip`のあとの数字を弄ったり消したりしたらいいんじゃないかな（てきとう）．

```latex:
\makeatletter
  \def\@maketitle{%
    \newpage\null
    \begin{center}%
      \let\footnote\thanks
      {\LARGE \@title \par}%
      \vskip 1.0em
      {\large
        \lineskip .5em
        \begin{tabular}[t]{c}%
          \@author
        \end{tabular}\par}%
      \vskip 1em
      {\large \@date}%
    \end{center}%
    \par\vskip 0.5em
    \ifvoid\@abstractbox\else\centerline{\box\@abstractbox}\vskip1.5em\fi
  }
\makeatother
```

### 参考文献をちっちゃくする（4/30 22:20追記）

（`jsarticle`限定？）

これも同様に`jsarticle.cls`から`thebibliography`環境をコピペしてきて再定義する．
（参考: [BioEoS::環境解析学研究室:: - 参考文献(thebibliography)の文字サイズ，行間の変更](http://www32.atwiki.jp/bioeos/pages/80.html)）

```latex:
\makeatletter
  \renewenvironment{thebibliography}[1]{%
    \global\let\presectionname\relax
    \global\let\postsectionname\relax
    \section*{\refname}\@mkboth{\refname}{\refname}%
    \list{\@biblabel{\@arabic\c@enumiv}}%
          {\settowidth\labelwidth{\@biblabel{#1}}%
          \leftmargin\labelwidth
          \advance\leftmargin\labelsep
          % 文字サイズ？
          \setlength\baselineskip{11pt}
          % アイテム間のマージン
          \setlength\itemsep{0.4zh}
          \@openbib@code
          \usecounter{enumiv}%
          \let\p@enumiv\@empty
          \renewcommand\theenumiv{\@arabic\c@enumiv}}%
    \sloppy
    \clubpenalty4000
    \@clubpenalty\clubpenalty
    \widowpenalty4000%
    \sfcode`\.\@m}
    {\def\@noitemerr
      {\@latex@warning{Empty `thebibliography' environment}}%
    \endlist}
\makeatother
```


## さいごに

これでみんなKOOLなレジュメをつくってモテモテだ！！！！！ *[要出典]*
[GitHub] 公開鍵登録の際に、Permission denied (publickey). が出続ける場合の対応 (vagrantからsshする場合の注意も)

手順通りにやっていけば基本は大丈夫。
https://help.github.com/articles/generating-ssh-keys

# まずは: 鍵作成

```pl
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
# Enter file in which to save the key (/Users/you/.ssh/id_rsa): github_id_rsa(ここは任意)
Enter passphrase (empty for no passphrase): (ここも任意)
# Enter same passphrase again: (ここも任意)
$ ssh-add ~/.ssh/id_rsa
```

## ssh-add がうまくいかない

こんなエラーが出ることもあります。

```pl
Could not open a connection to your authentication agent.
```

そんな時はおまじない。

```pl
eval `ssh-agent`
```

これをうった後に ssh-add hogehoge をすると通ります。

# 次に: GitHubに公開鍵を登録

公開鍵の中身をコピー

```pl
# macなら
$ pbcopy < ~/.ssh/id_rsa.pub
```

**GitHubのサイトの上部ナビゲーションバーの設定アイコンから、アカウント設定を選択 > SSH鍵設定　にアクセス**

![Screen Shot 2014-04-30 at 18.09.53.png](https://qiita-image-store.s3.amazonaws.com/0/18705/99ce17ae-cd70-005f-52d1-273e50ffc0e5.png)

**まるっと貼り付け**

![Screen Shot 2014-04-30 at 18.10.04.png](https://qiita-image-store.s3.amazonaws.com/0/18705/75660c94-a66a-a981-faec-872c2cdc49e7.png)


## ミスった点

GitHubのリポジトリの中に、Setting > Deploy Key という部分があり、そこから登録するのは違います。
注意。。。

![Screen Shot 2014-04-30 at 18.11.20.png](https://qiita-image-store.s3.amazonaws.com/0/18705/e7a501c9-2a91-aa13-2059-19aa9f48728c.png)

![Screen Shot 2014-04-30 at 18.11.35.png](https://qiita-image-store.s3.amazonaws.com/0/18705/63a23334-02c0-2505-0fc3-6fe7abb3f4b9.png)


# 最後に: 接続

**接続テスト**

```
ssh -T git@github.com
```

# エラーが出たら

**~/.ssh/knownhostsの整理**
**⇒github.comで始まる行を削除**

多分これでなんとかなるはず。


# Gitでcommit

```git
$ git init
$ git add .
$ git commit -m "hoge"
```

**鍵の場所を指定**

```pl
$ vim ~/.ssh/config
---
Host github
    HostName github.com
    User git
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_id_rsa(それぞれの環境に合わせて)
---
```

```git
$ git push -u origin master
```
ImageMagickのアップデート

ImageMagickのアップデートでちょこっとハマったのでメモ。


## 前提
* Centos5.6 (64bit)
* 既に古いImageMagick(6.5)がインストールされている（build from source）


## 手順
```bash
cd {古いImageMagickのソースディレクトリ}
sudo make uninstall

sudo wget http://www.imagemagick.org/download/ImageMagick.tar.gz
sudo tar xzf ImageMagick.tar.gz
cd ImageMagick-6.8.9-0/
sudo ./configure
sudo make
sudo make install
sudo /sbin/ldconfig
```

### ポイント
* 古いものをunisntallしないと、pythonのWandライブラリが新しいほうを認識してくれなかった。

## その他
### pngを扱わせるには
```bash
sudo yum install libpng-devel
```
日本語入力時のエンターキーの入力のハンドルはこうすると共通かなぁ

日本語変換中のエンターキーの押下はブラウザごとに実装が違うそうです。
http://d.hatena.ne.jp/end0tknr/20130808/1375953351
（網羅的な情報多謝）

ユーザーエージェントで分けるのは嫌なので下記のようにしました。


```coffeescript

  # キーダウンイベント  
  keydowned: (event)->
    @downedKey = event.keyCode
    # Firefoxでは@downedKeyが日本語変換直前のキーコード
    # Chrome等では229が入ります。

  # キーアップイベント
  keyupped: (event)->
    # enter押下でかつ日本語入力ではない
    if event.keyCode == 13 && (@downedKey == event.keyCode)  
      # ...やりたい処理を書くのだ

    @downedKey = null

```
awkについて


##正規表現

```
#awkの文法
awk 'condition {actions}' file.txt
↓
# $0は全体を表す。
# ~ /pattern/が正規表現
awk '$0 ~ /pattern/ {print $0}' file.txt
↓
# $0は省略可能
awk '/pattern/{print}' file.txt
↓
# printもデフォルトのメソッド
awk '/pattern/' file.txt
```
(※以下、コマンドの最後に表示したいものを渡す)

##偶数行だけ表示

```
awk 'NR%2'
```

##２列目にsudoが含まれている行だけ取得

```
awk '$2 == sudo' 
```

##6単語以上含まれているものだけ取得

```
awk 'NF > 5' 
```

##10行目以降から表示

```
awk 'NR > 9'
```

##1000と1009が書かれている行まで表示

```
awk '/1000/,/1009/'
```

##アクセスの多い順に並べ替える

```
# uniq -cで出現回数をカウントする
# sort -rで降順並べ替え

awk '{print $7}' log | sort | uniq -c | sort -r
```



##histroyコマンドの行数を削除して表示する方法

```
# historyでコマンド履歴を表示する。
# $1=""で行数を削除し、substrで空白を削除して表示する
history | awk '{$1=''; print substr($0, 2)}'
```