OmniAICreator/Qiita-1.07M huggingface dataset:
TechAcademy学習記録 Ruby編

#TechAcademy Ruby編

この記事はTechAcademyの学習メモruby編です。
TechAcademyって何とかそういうのはメインページの[こちら](http://qiita.com/sutatin/items/c8c52ad6190622a37c0e)から。
rubyは省略が多用できる言語作法なので、戸惑う事が多かったです。
基本的な文法などはいつものように省略します。

書き方やイディオムで参考になったのは下記。


[[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか](http://qiita.com/jnchito/items/dedb3b889ab226933ccf)
[Railsを触る際知っていると便利なRubyの基礎【ブロックとかシンボルとか】](http://qiita.com/kidach1/items/46a6e49b6306655ccd64)
[Ruby 2.1 / Rails4.1 の意外に忘れられている便利なメソッド](http://ruby-rails.hatenadiary.com/entry/20150101/1420049679)
[知って得する！５５のRubyのトリビアな記法](http://melborne.github.io/2013/03/04/ruby-trivias-you-should-know-4/)

##cloud9のコンソールではirbで動作確認を行う。
別にcloud9に限った話ではないと思うんですけどね。
単文スクリプトならわざわざファイル作らないで動作確認できる。
[library irb](http://docs.ruby-lang.org/ja/1.9.3/library/irb.html)

ちなみにirbは改行できずに1行1行返り値が表示されます。
コンパイル言語で育った自分には最初違和感がありましたね。

exit　で脱出です。

##ハッシュとシンボル
ハッシュはJavaでいうMapコレクションだと思えば良いはず。
シンボルは任意の文字列と一対一に対応するオブジェクトらしい。
よくわからなかったので検索してみたけどシンボルは深淵ということだけわかった（駄目）
詳しくは下記リンクを参照。

[class Symbol](http://docs.ruby-lang.org/ja/2.0.0/class/Symbol.html)
[文字列にするか、シンボルにするか、いったい何が違うのだ？](http://d.hatena.ne.jp/zariganitosh/20061118/1163851550)
[Railsを触る際知っていると便利なRubyの基礎 [ブロックとかシンボルとか]](http://qiita.com/kidach1/items/46a6e49b6306655ccd64)

```
//下記3つはだいたい同じ意味（厳密には違うけど）

//一番元となるハッシュの書き方
fruit_colors = { "apple" => "red", "orange" => "orange", "banana" => "yellow" }

//シンボルを使ったハッシュの書き方
fruit_colors = { :apple => "red", :orange => "orange", :banana => "yellow" }

//更に省略できるハッシュの書き方
fruit_colors = { apple: "red", orange: "orange", banana: "yellow" }
```

個人的には一番下の書き方で慣れていこうと思う。



##繰り返し処理
ここは慣れが必要、インクリメントによるforではなく、拡張For文が標準と考えよう。

###each文
```
(配列).each do |(配列の要素)|
  (配列の要素に対して行う処理)
end

↓　自分の理解

(配列).each do |(自分で名づけて良いループ内で使う配列の要素,要素2)|
  (配列の要素に対して行う処理)
end

```

なので|hogehoge|のhogehogeをループ文中に使わないとエラーが起きる。

###範囲オブジェクトなる存在
範囲オブジェクト(5..10)を使えば普通のfor文みたいに出来る。

```
//3つの配列を表示
cities = ["Tokyo", "Osaka", "Nagoya"]
(0..2).each do |number|
   puts cities[number]
 end
```

あと-1は最後の要素を指定されることになる。

```
//上と同じ出力結果
cities = ["Tokyo", "Osaka", "Nagoya"]
(0..-1).each do |number|
   puts cities[number]
 end
```

[size - 1ではなく、マイナスのインデックスで最後の文字や要素を指定する](http://qiita.com/jnchito/items/dedb3b889ab226933ccf#size---1%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%83%9E%E3%82%A4%E3%83%8A%E3%82%B9%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A7%E6%9C%80%E5%BE%8C%E3%81%AE%E6%96%87%E5%AD%97%E3%82%84%E8%A6%81%E7%B4%A0%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)

###uptoメソッド
```
> 3.upto(5) do |n|
>   puts "■" * n
> end
↓
■■■
■■■■
■■■■■
```
３から５を表す
範囲オブジェクトと似てるかな。


##メソッドは引数のカッコを省略できる
これのせいで初学者にはRailsのコードが凄い読みづらい（苦笑）

```
//引数がハッシュ
> tax({ hoge: 500, fuga: 10 })

//引数直下のハッシュの{}は省略可能
> tax( hoge: 500, fuga: 10 )
//ちなみにハッシュinハッシュの中の{}は省略できなかった。

//メソッドの()は省略可能
> tax hoge: 500, fuga: 10
```

##::（ダブルコロン）は.（ドット）と（ほぼ）同じ
[Rubyにおけるドット記法，二重コロン記法](http://qiita.com/ktarow/items/772014a4f0d48905f3ef)

```
//ほぼ下の２つは同じ
a = Book.name
a = Book::name
```
Coursera Machine Learningの課題をPythonで: ex7-2 (主成分分析)


### はじめに
機械学習を学ぶ第一歩として定番のCourseraのMachine Learningコース（Stanford、Andrew Ng先生）。このコースのMatlab/Octaveのプログラミング課題をPythonで実装するシリーズ。
今回はex-7 教師なし学習の後半、主成分分析(Principal Component Analysis, PCA)をやります。

### ライブラリのインポート
各種ライブラリをインポートします。

```py
import numpy as np
import scipy.io as scio
import matplotlib.pyplot as plt
from sklearn import decomposition
```

### データの読み込み・表示
Matlabの.mat形式のデータを`scipy.io.loadmat()`で読み込みます。データは32x32ピクセルの256階調グレースケール画像が5000枚。5000x1024の2次元行列に入ってきます。
これをとりあえずそのまま表示（最初の100画像だけ）してみます。

```py
data = scio.loadmat('ex7faces.mat')
X = data['X'] # Xは5000x1024の2次元行列

fig = plt.figure()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
for i in range(0,100):
    ax = fig.add_subplot(10,10,i+1)
    ax.axis('off')
    ax.imshow(X[i].reshape(32,32).T, cmap = plt.get_cmap('gray'))
plt.show()
```

出力はこちら。
![ex7-3.png](https://qiita-image-store.s3.amazonaws.com/0/96897/20ae7879-79be-1cb2-19bf-b91e16fb9a3f.png)

### 主成分分析の実施
32x32ピクセル = 1024次元 で表現されている元画像データに主成分分析をかけることによって、100次元までデータを縮減します。主成分分析は `sklearn.decomposition.PCA()`クラス一発です。パラメータ`n_components=` でいくつまで主成分を取るかを指定できます。

```py
pca = decomposition.PCA(n_components=100)
pca.fit(X)
```

### 主成分の可視化
主成分分析の結果は、`pca.components_`に格納されています。100x1024の2次元行列です。この主成分ベクトルをそのまま表示することができます。最初の36主成分だけ表示してみましょう。

```py
fig = plt.figure()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
for i in range(0,36):
    ax = fig.add_subplot(6,6,i+1)
    ax.axis('off')
    ax.imshow(pca.components_[i].reshape(32,32).T, cmap = plt.get_cmap('gray'))
plt.show()
```

結果はこちら。
![ex7-4.png](https://qiita-image-store.s3.amazonaws.com/0/96897/bcf23b94-04eb-81eb-47fd-184950fc82db.png)

### 次元縮減と再構築
主成分分析は、もともと1024次元ベクトルで表現されていた画像情報を、100次元まで縮減していることになります。次元縮減したデータセットは、`pca.transform(X)`で取得することができます（5000x100の2次元ベクトル）。
これに主成分ベクトルを掛けて、5000x1024の2次元ベクトルを復元します。復元したデータは、元データを100の主成分で圧縮して、表示できるように復元したものとなります。再構築した結果の最初の100個の画像を表示してみます。

```py
Xreduce = pca.transform(X) # 次元縮減。結果は5000x100行列
Xrecon = np.dot(Xreduce, pca.components_) # 再構築。結果は5000x1024行列

fig = plt.figure()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
for i in range(0,100):
    ax = fig.add_subplot(10,10,i+1)
    ax.axis('off')
    ax.imshow(Xrecon[i].reshape(32,32).T, cmap = plt.get_cmap('gray'))
plt.show()
```

結果はこちら。上にある元画像と比べると、ディテールは失われているものの、おおまかな特徴は復元されているのがわかります。

![ex7-5.png](https://qiita-image-store.s3.amazonaws.com/0/96897/76864f88-b630-e461-280d-d30af837f0d0.png)

### おわりに

今回もシンプルなコードになりました。
SharpDX 3.0.0 リリースノート翻訳

https://github.com/sharpdx/SharpDX/releases/tag/v3.0.0 の翻訳記事です．

----
これは重要な新機能や変更のある `v3.0.0` の，最終リリースです．

> 訳注 : `v3.0.0`の前に，ベータ版やプレリリースなどがありました．

- グラフィックスカードの能力を最大限引き出すDirect3D12への対応を追加（ただし`Windows 10 10586` 以上の環境のみ）
- [diet branch](https://github.com/sharpdx/SharpDX/issues/398) の活動によって、SharpDXの主要アセンブラは少し軽量に
- 配布とパッケージを2つのプラットフォームに絞ることで単純化
    - **デスクトップ**（`.NET 4.5`）
    - **ストアアプ**（`PCL .NET 4.5`）
- 数学関連のAPI（`Vector3`や`Vector4`など）はそれ専用のアセンブラに移動．ハイレベルのAPI（XenkoやMonoGameなど）がこのAPIを含まなくてもいいようになりました
- 前のバージョンでは`SharpDX`アセンブラに含まれていた`RenderForm`や`RenderLoop`を，新しいアセンブラである`SharpDX.Desktop`に移動
- XInputとXAudioは様々なバージョンのインターフェースに対応

アセンブラは**Zip**と**NuGet**から利用できます．
NuGetはdiet workのおかげで，前のバージョンより安定で利用しやすいです．

> 訳注 : `v2.6.x`では，`SharpDX`をNuGetから導入すると全てのプラットフォームのアセンブラが導入されるため300MBほどダウンロードしていました．

APIのクリーンアップも行っています．

- `DirectX June 2010 SDK`はサポートされません．DX11のメソッドはサポートされません．（`Texture.FromFile`など）
- `Direct3D10` API は削除
> 訳注 : Direct3D10はオワコン

- ツールキットはサポートされす，また配布もされません．
> 訳注 : ツールキットの代わりにMonoGameやXenko（Paradox Engineから改名）などが推奨されています

- `Direct3D9`，`DirectSound`，`DirectInput`，`RawInput`は開発されていないため，C++からのSharpGenによるコード生成はありません．つまり，これらのAPIには主要な変更はなく，廃止予定だと考えるべきです

> 訳注 : Microsoft公式にも非推奨のAPIです

`.NET 2.0`や`.NET 4.0`，また`Direct3D10`のようなAPIを使いたい場合，`SharpDX 2.6.3`を使う必要があります

## ソースからビルド
SharpDXをソースからビルドするには，[Windows SDK for Windows 10](https://dev.windows.com/en-us/featured/hardware/windows-10-hardware-preview-tools)が必要です．

## サンプルの使い方
[サンプル](https://github.com/sharpdx/SharpDX-Samples)はSharpDXリポジトリのサブモジュールになっています。サンプルを使うには，ShaprDXのZipバイナリをダウンロードし，`Sample`ディレクトリと同じ階層に`Bin`ディレクトリとして展開してください．
- `Bin\DesktopApp\SharpDX.dll`
- `Samples\Desktop\...`

サンプルのセットアップを簡単にするスクリプトを追加予定です．
一部のシェルで動かないシェルスクリプト

# これ、正しく動きますか？

```sh:
#! /bin/zsh

echo $(case 1 in 1) echo OK;; esac)
```

いや、シェルスクリプトにしなくてもそれぞれのシェルに切り替えてコマンド実行するだけで確かめられるのですが……。

```sh:旧バージョンbash
$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
$ echo 'echo $(case 1 in 1) echo OK;; esac)' | bash
bash: line 1: syntax error near unexpected token `;;'
bash: line 1: `echo $(case 1 in 1) echo OK;; esac)'
$ 
```

```sh:旧バージョンzsh
$ zsh --version
zsh 5.2 (i386-portbld-freebsd9.3)
$ echo '$(case 1 in (1) echo OK;; esac)' | zsh
zsh: command not found: OK
$ 
```

# 原因は、`$(`〜`)`の中のcase文

調べてみて「あ〜そういうこと」と思いましたが、`$(`〜`)`というサブシェル実行構文が、中のcase構文で出てくる条件指定の`)`を自分の閉じ括弧であると誤認識してしまうことが原因でした。

私は今のところ旧バージョンのbashとzshでだけこの現象を見つけましたが、シェルのパーサーが甘いと将来的にも起きそうなので気をつけようと思います。

# 対策:バッククォート囲み<code>&#x60;</code>〜<code>&#x60;</code>に代える

上記シェルではいずれも、`$(`〜`)`を<code>&#x60;</code>〜<code>&#x60;</code>に書き代えることで治まります。

```sh:バッククォートに代えれば大丈夫
$ echo 'echo `case 1 in 1) echo OK;; esac`' | bash
OK
$ echo 'echo `case 1 in 1) echo OK;; esac`' | zsh
OK
$ 
```

<strike>そもそも、新バージョンにすればいいのですが。特にBashは、ShellShock問題がありましたから当然更新しましたよね？</strike> ← お前はどうなんだ！

追記:
ShellShockパッチの当たった後の今でも現役なbashでもこの現象が起こることを教えてもらいました。（ありがとうございます、@akinomyogaさん）
Espresso 2.0 導入

Espresso 2.0 導入時に警告が出たのでメモ

# 開発環境
- AndroidStudio 2.0 Preview 4

## Espresso の設定（Setup Espresso）
##### 1. build.gradle に対して以下の依存関係を記述する

```java:build.gradle
dependencies {
    androidTestCompile 'com.android.support:support-annotations:23.0.1'
    androidTestCompile 'com.android.support.test:runner:0.4.1'
    androidTestCompile 'com.android.support.test:rules:0.4.1'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
    // Set this dependency if you want to use Hamcrest matching
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
}
```

**※ com.android.support:support-annotations の警告が出ることがある**
`Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app and test app differ.`

**依存関係を修正する**

```java:build.gradle
    androidTestCompile 'com.android.support:support-annotations:23.0.1'
    androidTestCompile ('com.android.support.test:runner:0.4.1') {
      exclude module: 'support-annotations'
    }
    androidTestCompile ('com.android.support.test:rules:0.4.1') {
      exclude module: 'support-annotations'
    }
    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.1') {
      exclude module: 'support-annotations'
    }
    // Set this dependency if you want to use Hamcrest matching
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
```


## Espresso 実行（Run Espresso Tests on a Device or Emulator）
##### 1. build.gradle の defaultConfig に testInstrumentationRunner を指定する

```java:build.gradle
android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}
```

##### 2. コマンドラインから実行する

`./gradlew cAT`

# Espresso 2.0 参考

[Testing UI for a Single App](http://developer.android.com/intl/ja/training/testing/ui-testing/espresso-testing.html)
日付で期間指定するときに「23:59:59.999」を使わない

履歴データなどを取得するAPIを設計するとき、必ずつきまとうのが期間指定です。
履歴データの件数は青天井ですから全件取得で処理がパンクしないよう、開始日／終了日もしくは開始日時／終了日時を指定させることが普通です。

API上で指定するのが「年月日」だったとしても最終的にDBに問い合わせる際にはdatetime型に落とし込まれるので大体同じ話になるのですが、よくやってしまいがちな失敗が
**●終了日時を○月○日23:59:59.999と指定するように作ってしまう**
**●すなわち、終了日時が「以下」という条件で働くようになっている**
ことです。

終了日時が「以下」という条件で働くようにAPIを設計したとして、日時の精度はAPIに明記されているでしょうか？
日時の精度も仕様の一部として明記するとして、採用しているDBのバージョンアップにともない日時型データの精度が上がってしまう事態も有り得ますがその際に仕様が変わってしまうおそれはないでしょうか？
これが確定していなければ、呼ぶ側が「23:59:59.999」と指定すればいいのかあるいは「23:59:59.999999」と指定すべきなのか決定できないのです（9の数が足りていなければデータの取りこぼしが発生しますし、9が過剰なら四捨五入でデータの取り過ぎが発生します）。

そしてもちろん、時刻に限らず連続値の精度は決め打ちせずにすむならしないでおく方が当然APIとしての拡張性は高まります。
**●時刻値の精度は非明示（もしくは最低保障精度だけ明示）に**
**●期間は「以上・未満」で指定（すなわち2015年一年間なら「2015-01-01 00:00以上、 2016-01-01 00:00未満」と表現）**
するという規約にすることで精度面で拡張に対して開いたAPIとなります。
Lambdaでコマンドやシェルスクリプトを実行してみる(Node.js)

Lambdaでコマンドやシェルスクリプトを実行してみる(Node.js)

小ネタです。

# コマンドの実行をとりあえずやってみる

Lambdaを選択後のBlueprintを選ぶ画面で **node-exec** というのがあるのでそれを選べば実行できます。

コードは以下のようになっていました。

```index.js
var exec = require('child_process').exec;

exports.handler = function(event, context) {
    if (!event.cmd) {
        context.fail('Please specify a command to run as event.cmd');
        return;
    }
    child = exec(event.cmd, function(error) {
        // Resolve with result of process
        context.done(error, 'Process complete!');
    });

    // Log process stdout and stderr
    child.stdout.on('data', console.log);
    child.stderr.on('data', console.error);
};
```

child_process.execメソッドでは第一引数に実行するコマンドを指定し、第2引数でコマンドが終了した時に結果をコールバックで受け取とっています。上記例だとevent.cmdとして実行するコマンドを指定しています。
また、コマンド実行時の標準出力、標準エラー出力はdataイベントが発生したタイミングで随時console.logとして出力されるようになっています。

Node.jsのv0.11以降であればexecSyncというメソッドが追加されており、同期的にコマンド実行ができますが、2015/12/26現在のLambdaで実行可能なNode.jsはv0.10.36となっていたのでこれは使えないですね。。。。

話が少しそれてしまいました。
試しにマネージメントコンソールのLambdaのページからコマンドを実行してみます。

画面上で作成したfunctionを指定し、

Action->Configure test event

と選択し

```
{
  "cmd": "cat /etc/system-release"
}
```

という形で記述する事でコマンドを実行する事ができます。
ちなみに実行すると以下の結果でした。

```bash
2015-12-26T06:48:42.028Z	b37dec85-ab9c-11e5-a810-83acc71c00c9	Amazon Linux AMI release 2015.09
```

# シェルスクリプトを実行してみる

では次にシェルスクリプトを実行してみます。Nodeのコードを`./exec.sh`を実行するように変更し、併せて実行するシェルスクリプトのファイルをアップロードする事で実行するようにしています。

ディレクト、ファイルを作成します。

```bash
$mkdir node-exec
$cd node-exec
$vi index.js
$vi exec.sh
```

```index.js
var exec = require('child_process').exec;

exports.handler = function(event, context) {
  child = exec('/bin/bash ./exec.sh', function(error) {
      // Resolve with result of process
      context.done(error, 'Process complete!');
  });

  // Log process stdout and stderr
  child.stdout.on('data', console.log);
  child.stderr.on('data', console.error);
};
```

```exec.sh
#!/bin/bash


# 以下にシェルスクリプトを書く
ls /usr/bin
ls /bin
```

ファイル作成後、zip圧縮し、lambdaへアップロードします。

```bash
# zipにまとめる
$zip -r node-exec.zip index.js exec.sh

# コードのアップロード.function-nameが違う場合には適宜変更
$aws lambda update-function-code --function-name node-exec --zip-file fileb://./node-exec.zip
```

上記を実行する事でコマンドが実行できます。

# [おまけ]lambdaで色々やってみた

以下、おまけです。

+ awsコマンドはインストールされているか->されていません
+ curlによるメタデータの取得->できませんでした
+ curlによるgoogleへの接続->できました
+ echo $PATH->/usr/local/bin:/usr/bin:/bin。コマンドをざっと見る限り、Linuxコマンドはあまり制限されていないようでした
SourceTree > ターミナル > commit忘れを防ぐ > modifiedの一覧を取得するshスクリプト

```txt:動作確認
Source Tree 1.6.22.0 on Windows 7 pro
```

## 背景
しばらくの日数、現在使用中のPCにアクセスできなくなる時、コミット忘れをして、戻ってきたときに別開発PCで作業したものをマージするなりしないといけなくなり面倒になる。

きちんと手仕舞いしておきたい。

複数プロジェクトにおける修正中のファイルリストを取得したい。

## 状況

1つの親フォルダに複数のプロジェクトフォルダが含まれる場合での対応をしている。

![](http://yuml.me/diagram/class/[親フォルダ]-->[...], [親フォルダ]-->[PROJECT_2], [親フォルダ]-->[PROJECT_1])

それ以外の場合はfor文の部分を変更が必要 (以下ではPROJECT_A, _Bは取りこぼす)。

![](http://yuml.me/diagram/class/[親フォルダ]-->[...], [親フォルダ]-->[PROJECT_2], [親フォルダ]-->[PROJECT_1], [親フォルダ]-->[WORK], [WORK]-->[PROJECT_A], [WORK]-->[PROJECT_B])

## v0.1
### 手順と実行結果

1. SourceTreeでターミナルを起動
2. cd .. で一つ上に移動 (親フォルダへ)
3. 以下のスクリプトを実行すると、modifiedのファイル（とプロジェクト)が分かる


```
$ for dir in $(ls); do echo $dir; cd $dir; if [ -d .git ]; then git status | grep modified; fi; cd ..; done
```

```txt:結果(例)
...
PROJECT_1
#     modified:  Project1.res
#     modified:  Unit1.cpp
#     modified:  Unit2.cpp
PROJECT_2
#     modified:  shutdownButton.py
PROJECT_3
PROJECT_4
PROJECT_5
#     modified:  hello_test_exec
...
```

上記の例ではPROJECT_3とPROJECT_4は何も変更なし。PROJECT_1,2,5で修正したがcommitしてないファイルがあることが分かる。


## v0.2

SHELLファイルにした。one linearよりデバッグしやすい。

### スクリプトファイル

```checkYetToCommit.sh
#!/bin/sh

for dir in $(ls); do 
	echo $dir; 
	cd $dir; 
	if [ -d .git ]; then 
		git status | grep modified; 
	fi; 
	cd ..; 
done
```

### 使い方

1. cd .. (親フォルダへ移動)
2. sh checkYetToCommit.sh

または chmod +x checkYetToCommit.sh してる場合は

1. cd .. (親フォルダへ移動)
2. ./checkYetToCommit.sh

### 備考

- MINGW32の find コマンドは -type オプションがないようだ。
ディレクトリだけ取得というのが分からない
- commitしたがpushしてない問題は未対応
webapp2でRailsの_methodパラメータをまねてみる


default_dispatcherが呼ばれる前に、_methodパラメータを確認して、request.methodの値を該当するメソッドに書き換えればいいので、自前のdispatcherを用意してapp.router.set_dispatcherメソッドでセットしてやる。


```python
def dispatcher(router, request, response):
    method = request.get('_method').upper()
    if method in ['HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE']:
        request.method = method
    return router.default_dispatcher(request, response)
    
app = webapp2.WSGIApplication([
    webapp2.Route('/foo', handler=FooHandler),
], debug=True)
app.router.set_dispatcher(dispatcher)
```
Crystal Advent Calendar 2015 の海外からの記事の日本語訳


[Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800) に、海外から投稿してくれた人が2人いました。

[Kemal](https://github.com/sdogruyol/kemal) の作者であるトルコの Serdar Dogruyol と、Crystal の作者である Ary Borenszweig 本人です。

記事を日本語訳したものを以下に公開しています。どちらも、Crystal についての情報としてはもちろんですが、Ruby ってホントに愛されてるんだなぁ、と感じることのできる素敵な内容なのでぜひ読んでみてください。

- [Why Crystal? (by Serdar Dogruyol)](http://fiveteesixone.lackland.io/2015/12/16/why-crystal/)
- [The Future of Crystal (by Ary Borenszweig)](http://fiveteesixone.lackland.io/2015/12/28/the-future-of-crystal/)
Unbound 設定


# はじめに
unbound は次世代? の DNS(キャッシュサーバー)です．有名なDNSとして BIND がありますが脆弱性が多いと言われるため他のDNSをインストール，設定してみました．

# インストール
ubuntu では以下の通り．apt から行える

 ```bash
 $ sudo aptitude install unbound
 ```
 
# 設定
 ubuntu では，*/etc/unbound/* 以下に配置されており， __unbound.conf.d/*.conf__ を編集する． */etc/unbound/unbound.conf* は， unbound/conf.d/*.conf を取り込む設定となっている． 

```yaml:local.conf
#
#  local network - DNS Setting
#
# domain name: ***.local
#
server:
    # インターフェース設定．デフォルトルートとする
    interface: 0.0.0.0

    # 問いあわせを許可するネットワーク設定
    #
    # ネットワークに合わせて記述する
    access-control: 192.168.1.0/24 allow

    # IPv6 は使用しない
    do-ip6: no
    
    # ローカルゾーン設定
    #
    #
    local-zone: "***.local." static


    # NS レコードの設定 
    #
    # ネームサーバーの設定を行う
    #
    # プライマリ: ns.~
    # セカンダリ: ns2.~
    local-data: "IN NS ns.***.local."
    local-data: "IN NS ns2.***.local."


    # MX recode: mail server
    #
    # メールサーバーの設定．
    # 
    # mail.~.local.
    local-data: "IN MX 10 mail.***.mydns.jp."


    # A レコード，ptr レコードの設定
    #
    # A レコードは，正引き
    # PTR レコードは，逆引き
    #
    # サーバーIP: 192.168.1.10
    local-data: "***.local. IN A 192.168.25.1"
    local-data: "***.local. IN A 192.168.25.1"
    local-data: "***.local. IN A 192.168.25.1"
    local-data: "***.local. IN A 192.168.25.1"
    local-data-ptr: "192.168.25.1 shirakawa.mydns.jp."

    # 転送設定
    #
    # 上記設定以外の問い合わせが発生した場合，google dns に問いあわせるようにする
forward-zone:
    name: "."
    forward-addr: 8.8.8.8
```
 
# 参考文献

 【LAN】ローカルで好きな名前を使う【Unbound、DNS】, ゆっくり備忘録. http://mitsuakikawamorita.com/blog/?p=2606
Unbound の設定, むらさきのくも. http://murasaki.cocolog-nifty.com/cloud/2009/07/unbound-1f2d.html
UnboundとNSDの紹介　BIND9との比較編, Silde Share. 東大亮. http://www.slideshare.net/hdais/nsd-unboundintro
ElasticBeanstalkでカスタムAMIを使う

## GUIの場合
* GUIの場合、AWSの公式ドキュメントがあるが、一度インスタンスを起動した後に置き換えるやり方なのでイマイチ。
   * http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.customenv.html
* 環境（インスタンス）が起動した後に、環境の「設定」→「インスタンス」の「カスタムAMI ID」で置き換えたいAMI IDを指定すると、そのAMIでインスタンスを再作成する
![20151228_084724.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/97b6a367-529f-4ab0-9870-e1f712c41a66.jpeg)

## CUIの場合

* 「option_settings」の「aws:autoscaling:launchconfiguration」で指定すると、インスタンス作成時にそのAMIを使用する（eb createコマンドにAMIを指定するパラメータは無い）

```yaml:.ebextensions/launchconfiguration.config
option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: ImageId
    value: ami-xxxxx
```
クラウドコンソールでviを開いたときに『:』（コロン）が打てなくて困った時のこと

# 障害対応時にクラウドコンソールでCentOSにログインしてviを開いたときに『:』（コロン）が打てなくて困った。。。
コロンが打てないと『:q』で抜けられない！！
（多分）全部のキーを入力してみたが、コロンが出てこない！！

調べてみたらWindows10でキーボードが**101英語**として判断される場合があるらしいのでその影響かもしれないですが、
障害対応中にクライアントのキーボード設定変更やレジストリ変更や再起動なんてやってられない！！

と思ったときに確か他に**必殺のコマンド**があったはずだと思い出して調べてみた！！

# 『ZZ』でviを上書き保存して終了できた！！
これなら入力できる！！ってことで解決しました。
$.ajaxで twitter API から JSONデータを取得する 

# 結論
答：
動かざることバグの如し　- Javascript「のみ」でTwitterAPIを叩いてみる
http://thr3a.hatenablog.com/entry/20140224/1393250002

```
$.ajax({ 
  type: GET/POST,
  dataType: 'jsonp',
  jsonp: false,
  cache: true,
  url: API URL + Query + 署名
})
```
QueryはCallbackメソッド含みます。


``` 実例.
$.ajax({ 
  type: 'GET',
  dataType: 'jsonp',
  jsonp: false,
  cache: true,
  url:'https://api.twitter.com/1.1/favorites/list.json?user_id=3076153748&count=20&oauth_version=1.0&oauth_signature_method=HMAC-SHA1&oauth_consumer_key=tFXFkfUvPeIk5Eevk3DdkPOX3&oauth_token=3076153748-klm7iiLntCZFZGdkNVwBcSPdzzMMAOPIoerIvdg&callback=cb&oauth_timestamp=1451232047&oauth_nonce=o7LJms&oauth_signature=kq%2FwNK28G0a%2B4aZbawKuhLXgyfk%3D'
})
```

#なんのこっちゃていう人向け解説
##Web API をブラウザで扱う際の問題点と回避策
- Domainが違うサイトにアクセスするので通常はじかれます。

```
XMLHttpRequest cannot load
https://api.twitter.com/1.1/favorites/list.js.
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'https://~' is therefore not allowed access.
```

- 回避策の１つとしてJSONではなくJSONPを取得します。ただしサーバ側が対応してる必要があります。幸いTwitterはだいたい対応しているそうです。 https://dev.twitter.com/faq#38

- 認証が必要なTwitter APIを叩くには、クエリストリングから作成した署名が必要です。細かい説明は https://syncer.jp/twitter-api-matome/get/favorites/list このサイトがわかりやすかったです。
- 簡単にいうとアプリ用に発行された秘密鍵とユーザに発行された秘密鍵の二つを用いてクエリストリングを暗号化したもの（署名）をクエリにつける必要があります。
- この署名とクエリストリングの内容が一致しないとエラーになります。
- なお上記サイトではHeaderにAuthorization属性を付与する必要があるとありましたが、不要なようです。

## $.ajaxのJSONP対応
- $.ajaxではJSONPが使えます。
- dataTypeをJSONPにすると自動的にクエリストリングにコールバック関数を設定し、success等を実行してくれます。
- またクエリストリングに適当な値を設定し、キャッシュを無効にしてくれます。

##問題点
- クエリストリングと署名は一致している必要があります。
- $.ajax dataType:JSONPは自動的にコールバック関数とキャッシュクリア値をクエリストリングに追加します
- このため署名とクエリストリングが一致せずエラーになります

##回避策
- jsonp:false でコールバックの自動設定を無効にできます。
- cache:true でキャッシュクリアの設定を無効化できます。
- これによりクエリストリングと署名が一致し、リクエストに成功します。
- そのためコールバック関数は自分で作成・設定し、署名前のクエリストリングに含める必要があります。

# 注意点
- クエリストリングの署名作成にはシークレットキーが必要になります。普通にjavascript単体でやるとシークレットキーが丸見えになり、よろしくありません。対策を講じるようにしてください。私は署名処理は自サーバで行い、リクエストはブラウザに任せる予定です。
Angular2のevent bindngとproperty bindingの記法がdash-case(kebab-case)からcamelCaseに変更されていた。


1ヶ月前のBreaking changeなので周回遅れ感はあるが、Angular.ioのDart版docにはまだ反映されていないのでメモしておく。
TypeScript版に合わせてDart版が改訂される時にはこれも反映されているだろう。
https://angular.io/docs/ts/latest/guide/displaying-data.html
https://angular.io/docs/dart/latest/guide/displaying-data.html


この変更により、例えばAngularの[core directiveであるngIf, ngForなどのselectorが`ng-if`から`ngIf`、`ng-for`から`ngFor`といったように](https://github.com/angular/angular/commit/da9b46a071a3ab5a021e0a57a1e3f81260bfe383)変更されている。


詳細は以下。
https://github.com/angular/angular/blob/master/modules/angular2/docs/migration/kebab-case.md


この変更の理由としてdesign docが公開されており、ざっくり言うと、

Event bindingをdash-caseで書き(`(my-event)="exp()"`)camelCaseのevent名に変換するルールでは、dash-caseのevent名が定義された際にbindingできない。そのためdash-case to camelCase変換は止めたとのこと。

Property bindingもまたCSS selectorがcase insensitiveであることに起因するbindingの問題を解決するために、Angularでbindingするattribute nameはcase sensitiveとして扱い、dash-case to camelCase変換は止めたとのこと。

詳細は以下。
https://docs.google.com/document/d/1UMxTIUBTIUZNfOqwMhkLg0ANFSBtLIK9JsIu77EZaBA/edit?ts=564f7dd4



Polymerでcomponentを書いているとAttributeのdash-caseとPropertyのcamelCaseの書き分けをつい忘れてしまい、AttributeをcamelCaseで書いてデバッグで無駄な時間を使ってしまう経験が何度かあるので、その点でもこの変更は歓迎。ちなみにcamelCaseで定義されたものをうっかりdash-caseで書くとTemplateCompilerがちゃんとエラーを吐いてくれるのが嬉しい。
SSHの秘密鍵と公開鍵がちゃんとペアになってるか確認する

このコマンドで公開鍵が表示されるので、`目grep`なり何なりであってるか確認しましょう。

```
ssh-keygen -y -f ~/.ssh/id_rsa
```

### 参照

http://stackoverflow.com/questions/274560/how-do-you-test-a-public-private-dsa-keypair
[Android]端末にあるデータベースの中身を見る方法

##したいこと
実機をUSBで繋いだ状態で、andoridアプリで使用したsqliteのデータベースの中身を（できるだけ分かりやすく）見たい


##環境
AndroidStudio 1.5.1
スマホ SC-06D
windows7

##スマホのどこに保存されているか
/data/data/（アプリのパッケージ名）/databases
権限がないのでエクスプローラーでは見えない

##1 adb(Android Debug Bridge )を使ってアンドロイドの中身に入る
###a adbのインストール
AndroidStuidio->file->settings->ADB ideaインストール

![settings.PNG](https://qiita-image-store.s3.amazonaws.com/0/83382/39913dd9-1d62-b22f-2c56-b3c6f1ed4219.png)


###b AndroidSDKのPATH設定
システムのプロパティの「詳細設定」のPATHに
C:(AndroidStudioの場所)\sdk\tools
C:(AndroidStudioの場所)\sdk\platform-tools
を「;」で区切って追加

>参考
Androidアプリ開発でadbコマンドを使ってシェルを起動する方法【初心者向け】
http://techacademy.jp/magazine/2989

###c adbで確認
コマンドプロンプトかAndroidStudioのTerminalで
`adb shell`（起動）
->`shell@android:/`となりますのでそこで
->`run-as （アプリのパッケージ名）`
->そうするとdataフォルダの中身を見れます
->`cd databases`でdatabasesフォルダに移動
->`ls`でフォルダの中身を表示
->該当のdbがあるか確認

###d adbで操作
ファイルのコピーは`cat`なのですぐに使いたくなりますが、dataフォルダの中で使ったのでは外に出せませんので、自分が外に出ます。
`exit`
で始めの
`shell@android:/`に戻ります。
そこで
`run-as （パッケージ名） cat databases/（データベース名）.db > /（スマホでアクセスできるフォルダ）/（データベース名）.db`

スマホでアクセスできるフォルダ名　SC06Dだと　`/storage/sdcard0/download`とかになります。

ここまで来るとwindowsのエクスプローラーでもアクセスできるようになります。
>参考
SQLiteの取得と内容確認
http://ymlib.com/YMWorld/Android/P0/W0/P007/YMWAndroid007.html

##2 さらにファイルをGUIで見たい
sqlite browserを使用

>詳しくは
DB Browser for SQLiteの使い方
http://www.dbonline.jp/sqlite-db-browser/

>データの表示/追加/修正/削除
http://www.dbonline.jp/sqlite-db-browser/data/index1.html

これで内容が入っているか確認したり、構文が合っているか確認したりできるようになりました。

##今回わからなかったこと
>SQLite の中身を見る
http://muchag.undo.jp/archives/665

こんな感じでadb shellの中でsqliteを実行したかったのだがそれはなぜかできなかった。

##感想
GUIで見れると安心する。
技術英語 > To do so, we would [introduce an unstable element] [to a critical situation].

@ Star Trek movie > First Contact

艦隊の仲間たちの船が、敵であるボーグと好戦状態に入っている。しかしながら、一度はボーグに同化されてしまったピカード艦長含むクルーが戦闘に加わる許可はでていない。

戦闘に加わったらどういうことになるかを艦隊がいかに考えているかについて、ピカード艦長が

> To do so, we would introduce an unstable element to a critical situation.

To do so (戦闘に加わることによって)

<hr>
マルチタスク、マルチスレッド処理などでよくいう「Critical region」。そこに不確定要素を入れると重要な処理がスケジュール通り機能しなくなる。

OSによっては「EnterCriticalRegion()」と「LeaveCriticalRegion()」という関数で明示的にCritical regionの処理をしている旨をOSに伝える機能もある。

<hr>

関連して思い出したのは

- ソフトリアルタイム
- ハードリアルタイム

https://en.wikipedia.org/wiki/Real-time_computing

> the goal of <font color=red>a hard real-time system</font> is to ensure that all deadlines are met, but for <font color=red>soft real-time systems</font> the goal becomes meeting a certain subset of deadlines in order to optimize some application-specific criteria.
必要なのはJavaScript言語仕様書とブラウザーコンソールだけ！（シリーズその１）

#JavaScriptがちょっと理解しにくいとお嘆きの方へ・・・
それは私のことです！
C/C++、そしてC#などメインに使ってきたんでJavaScriptなどのスクリプト言語はいろいろと理解しずらい。Strong-typingではなく、動的で自由度も高く、いくつものやり方で同じ結果を得られたりする、そういうところが今まで扱ってきた言語と大きくことなるから。そこで効率よく学習できる方法は何だろうとずっと考えていた。

結論としては、Chromeなどのブラウザー開発者ツールのconsole（コンソール）と「JavaScript言語の仕様書（Language specifications）」を使って実験と確認を繰り返すという「会話式の方法」が自分には効果的だと分かった。ググって見つかるチュートリアルやブログも参考になるんだけど、場合によっては著者も深く理解していない場合もあったりして、かえって混乱してしまうことがあるから。その点、仕様書は正確。

#JavaScript Language specifications（言語仕様）
現段階で JavaScirptの仕様を読むとなると下の二つになる。

**JavaScript 5**
[JavaScript 5.1 Language Specification](http://www.ecma-international.org/ecma-262/5.1/) （2011年頃出た）

**JavaScript 6**
[ECMAScript 2015(HTML形式)](http://www.ecma-international.org/ecma-262/6.0/index.html)（2015年6月に正式に承認）


これら言語仕様を軸足にする。そうすれば間違った解釈をしてしまっているチュートリアル記事などに惑わされずに学習できる（この記事もそれに含まれる可能性があることは断っておく）

#まずは JavaScript 5 から始める
最新の6は、私の好きなStrong-typeな言語に近い雰囲気。だけど私にとって混乱のもとになっている5から始めることにした。

#ブラウザ開発ルールのコンソールと対話できる環境を作る

このステップはとても簡単。これを読んでいるということはおそらくChromeがインストールされている状況なので、ほかにインストールするものはない。

まずは、下の内容のHTMLファイルを作る。
`<script>`ブロックを含むことに注意。
ファイル名は適当でよい（例： index.html）

```
<html>
<body>
  <script>
    console.log(Date());
  </script>
</body>
</html>
```

次にファイルをブラウザーで実行する。
ファイルをダブルクリックするなどして、Openすると大抵はブラウザにロードされる。（Atomのようなエディタならエクステンションでブラウザのロードできて便利）。
![2015-12-08 18_15_05-Start.png](https://qiita-image-store.s3.amazonaws.com/0/103139/ebf0858c-3e26-1462-0799-ed37012e9f08.png)

ページがロードされたら「F12キー」でブラウザの開発者ツール開く。

これで、学習環境はできたので、さっそくコンソールを使ってみる。

#コンソールを使って任意のウェブサイトを表示する

```
window.location = 'http://google.com'
```

と打ち込んでみると、ブラウザがグーグルのホームページをロードする。

そう、コンソールだけで、どのURLにも移動できるわけだ。

コンソールにはロードされたスクリプトやブラウザーからのトレースや警告、そしてエラーなどのアウトプットが表示される。

![2015-12-08 18_08_19-Start.png](https://qiita-image-store.s3.amazonaws.com/0/103139/fa5dbed1-8179-7a7a-3502-1de6a380c197.png)

コンソールをすっきりクリアーしたい場合は、左上の「Clear console log」ボタンを押す。

![2015-12-08 18_10_19-Start.png](https://qiita-image-store.s3.amazonaws.com/0/103139/ff2f3772-9ecb-d35f-4642-37e43560c730.png)

#コンソールを使って前のページに戻る

ブラウザでよく使う「Back（戻る）」ボタンがあるが、コンソールでも同じことが出来る。

```
window.history.back()
```

うまく元のページに戻ってこれた。

このように、コンソールを使うだけで、JavaScriptの実行環境やブラウザとページの内容をアウトプットを通して理解できるだけでなく、コンソールに直接ステートメントを打ち込むことで、JavaScript実行環境やブラウザを操作することも出来る。

#要点

コンソールを通して JavaScript実行環境と会話をすることが出来る。これはスクリプトをファイルに保存して、いちいちロードして実行させるやり方よりも直感的にJavaScript実行環境を理解できるし、会話式で少しずつコンセプトを理解しながら学習を進めることができる。

[その２へつづく](http://qiita.com/yoshiwatanabe/items/0f34988dfdcf795e6811)
Android Studioでフォントのサイズを変更する

# Android Studioでフォントサイズを変更する方法
1. FIle-Settingsを選択する。
1. Settings画面が開いたら、colors & fonts - fontを選択する。
1. save asを押す。最初にsave asを押さないと編集できない仕様のようです。２回目からは大丈夫です。
1. 保存するscheme名を聞いてくるので、適当に決めて保存します。
1. 保存するとEditor FontのSizeが変更できるようになります。

以上です。
ofxKinectWindows2のインポート

ofxKinectForWindows2 by elliotwoods
https://github.com/elliotwoods/ofxKinectForWindows2

Mac Bootcamp
IDE: vs2015
OF: v0.9.0

---

1.
emptyExampleをコピー。適当に名前を変える。

---

2.
Solution ExplorerのSolution名の上で、右クリック > Add Existing Project
addons > ofxKinectForWindows2 > ofxKinectWindowsLib > ofxKinectForWindows2Lib.vcxproj　を開く。
<img width="758" alt="11.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/64523/aaf87af2-9668-3d0b-5ece-df1498444ea1.jpeg">

---

3.
Solution Explorerのプロジェクト名 > Referenceの上で、右クリック > Add Reference...
Add Referenceパネルが表示されるので、ofxKinectForWindows2Lib にチェックをいれてOK。
<img width="866" alt="2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/64523/1fc7bcbb-b845-04dd-9d04-7c62151c345c.jpeg">

---

4.
メニューバー > View > Property Manager を開く。
Property Manager上部、Add Existing Property Sheet のアイコンをクリック。
addons > ofxKinectForWindows2 > ofxKinectForWindows2.props を開く。

<img width="865" alt="3.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/64523/55630e07-da83-fcf9-c748-d0dcd145cd11.jpeg">

---

5.
Solution Platformを x64 にして、コンパイル。
<img width="518" alt="5.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/64523/be7a62bf-ba52-970c-4bc9-51aaab5ed251.jpeg">

---
Gottyに感動した

## 参考

* [tmux - gottyによるttyのブラウザ経由での共有 - Qiita](http://qiita.com/saitara/items/dda90bf8f9e528c98738)

## 感想

* 文字が見やすい。斜体対応
* w3mが見やすい
* byobuを使うと続きを引き継ぎやすい

課題

* クリップボードからの貼り付けができない
    * `ctrl_v_paste = false` ?
* 日本語入力ができない(uim使うか)
    * [hterm](https://github.com/chromium/hterm)側で改善されれば・・・
* Webブラウザのタブの切り替えをキーボードで行うと文字が入力されてしまう。

## インストール

* [Releases · yudai/gotty · GitHub](https://github.com/yudai/gotty/releases)

```bash:実行
./gotty \
 -c user:pass \
 --random-url \
 --random-url-length=80 \
 -p 3000 \
 -w \
 byobu
```

```bash:標準出力
2015/12/27 18:35:02 Permitting clients to write input to the PTY.
2015/12/27 18:35:02 Using Basic Authentication
2015/12/27 18:35:02 Server is starting with command: byobu
2015/12/27 18:35:02 URL: http://127.0.0.1:3000/cnj7tnpo59vewtk7q8qq93e4pzvpvwmv4jjc058qaai4wkad7pm9n2u4ammbnzg5ygqyqt1kpjepspqx/
2015/12/27 18:35:02 URL: http://192.168.1.5:3000/cnj7tnpo59vewtk7q8qq93e4pzvpvwmv4jjc058qaai4wkad7pm9n2u4ammbnzg5ygqyqt1kpjepspqx/
```

* `-c` : basic認証
* `-w` : 入力を許可
* `-p` : listen port

## ~/.gotty

* [gotty/.gotty at master · yudai/gotty · GitHub](https://github.com/yudai/gotty/blob/master/.gotty)

```bash:
curl https://raw.githubusercontent.com/yudai/gotty/master/.gotty -o ~/.gotty
```

```diff:~/.gotty
 // [string] Address to listen, all addresses will be used when empty
-// address = ""
+address = "localhost"
 
 // [string] Port to listen
-// port = "8080"
+port = "3000"
 
 // [bool] Permit clients to write to the TTY
-// permit_write = false
+permit_write = true
 
 // [bool] Enable basic authentication
-// enable_basic_auth = false
+enable_basic_auth = true
 
 // [string] Default username and password of basic authentication (user:pass)
 //          To enable basic authentication, set `true` to `enable_basic_auth`
-// credential = "user:pass"
+credential = "user:pass"
```

```bash:
./gotty byobu
```
Numpy で特定のインデックス以外の要素を取り出す

R ユーザーならば，呼吸をするのと同じくらい当たり前な以下の操作．
これで特定の添字を除いた要素を抽出することができる．

```r
vec <- 1:10
ind_rm <- c(5, 7)
# ind_rm 以外の index を指定して要素を取り出している
print(vec[-ind_rm])
```
```r
[1]  1  2  3  4  6  8  9  10
```

案外 numpy だとスマートにやる方法がなかなか思いつかない．
皆結構困っているのではなかろうか．
自分だけだったら悲しい．

# Numpy でやりたい
やはり R のように特定の要素以外という発想がそもそも間違っているっぽいので，素直に残す要素の添字を含む array もしくは list を上手に作る方法を考える．

素直にやるならこんな感じな気がするけれど，何か `in` とか明らかに無駄な計算している感が拭えない．

```py
import numpy as np

vec = np.arange(10)
ind_rm = [5, 7]

# [0, 1, 2, 3, 4, 6, 8, 9] を作りたい!
ind = [i for i in range(10) if i not in ind_rm]

print vec[ind]
```

[Stack overflow で調べて](http://stackoverflow.com/questions/19286657/index-all-except-one-item-in-python)ちょっと感心したのは以下のような方法．

```py
import numpy as np

vec = np.arange(10)
ind_rm = [5, 7]

# [True, True, True, True, False, True, False, True, True, True] を作れば良いという方針
ind = np.ones(10, dtype=bool)
ind[ind_rm] = False

print vec[ind]
```

行数の節約にはならないけれど，こっちの方が無駄な計算がなくて若干速いっぽい．
`np.ones` にこんな使い方があるの初めて知った．

# まとめ
より良い方法求む．
UE4 で入力周り考察(1)

# 環境

UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 を触ってみて動作を確認する
入力周りの制御を確認してみる

# 本文
## チュートリアルを確認
まずは、C++ プログラミングのチュートリアルの「プレイヤー入力と Pawn クラス」を
確認してみる。。。なるほど、これは、ちょっと分かりにくい。プログラミングのあまり
経験の無い人が見ると、なにこれ？となると思う。
分かる人に簡単に説明すると、入力キーのマッピングを決めて、イベントにコールバック
を設定し、イベント経由でキャラを制御する感じ。入力バッファさえ参照できれば後は、
適当にやれるんだが、なぜこんなに面倒なのかと思ったがブループリントの事を考えれば
確かにこうなっている方がインタフェースとしては適切なのかもしれない。

## UE4 の入力管理の思想
UE4 では、入力はイベントで管理するようだ
エンジン側のコードをきちんと読んだわけではないが、おそらくメインループの最初(の方)
の処理( Tick が実行される前 )で、ハードウェアの入力 API からリードした値をエンジンが
保持し、その値を元にイベントをコールバックするはず。

こちらとしては、そのエンジンが保持している(であろう)入力バッファを直接参照したい
こんな感じで
// こちらは、擬似コードです
// 1P コントローラの左アナログスティックの X 値の参照
float var = Input::GetAxisLeftX( 0 );

入力を抽象化してくれるのはありがたいが、私の考えではそれはアプリケーションの役割だと
思う。イベントのコールバックだとコールバックのタイミングが重要になる。仮にコールバック
が Tick より後だとすると、入力が 1 フレーム遅延する事になるが、作るゲームの種類によっては
それは困る。また入力した値を、どの状態の時、どの順で、どうやって参照するか？はトータルで
考える必要がある。そういう意味でも入力はアプリケーション側が決定権を持つ方が使いやすい。

エンジン側のクラスなどを軽く調査してみたが、どうやら上記のように直接参照する方法が
なさそうなので、今度はエンジンのソースを見てアクセス可能かどうかを調査してみようと
思う。考察(2)に続く予定。
コマンドラインで文字列のハッシュを生成する


下の例では文字列 `test` のSHA256ハッシュを生成している。

```bash
$ echo -n 'test' | shasum -a 256
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08  -
```

- `echo`に渡している`-n`は改行を出力しないオプション
- `shasum`に渡している`-a`はアルゴリズム指定オプション
複数画像からなる巨大地図画像のジオリファレンス

年の瀬に横浜（一人暮らし新居）と奈良（家族の家）を行ったり来たりのkochizufanです。
引っ越しやら行政手続きやら家財揃えに忙殺されて投稿遅れてすみません。

ネタは、単独画像でない、メッシュ単位に分割された大量のGeoTiff画像等を、多量のGCPから全部ジオリファレンスする際のノウハウについて。
そんなユースケースたいしてないだろうって？いや場合によってはあるんじゃないすか？
例えば...例えば...明治初期のまだ伊能図並み精度でしか測量成果がなかったために位置ズレしてる北海道旧版地形図上のアイヌ地名を、ジオリファレンスで正確な位置に戻すとか...[^1]。
こういうをジオリファレンスする際に、各図郭内に含まれるGCPだけでジオリファレンスすると、各図郭の切れ目で不整合を起こしてしまいます[^2]。

解決法は単純で、gdal_translate等の-gcpオプションは、各図郭のextent外の座標と対応付くgcpでもちゃんと受け付けてくれるので[^3]、全部のgcp[^4]を指定してやれば、隣り合う図郭との不整合も生じずに全てジオリファレンス変換できます。

...と、非常に単純なんですが、いくつか試行錯誤した気をつけるべき点もあるので列挙します。

* **各図郭の外側には透明のバッファ領域を設ける**<br>非線形変形ですので、うにょーんと変形された後の画像は、元の画像のextentからはみ出す場合もあります。<br>そのような場合、gdalwarpでは、右と下方向[^5]にはみ出した分は勝手に画像が拡大してくれますが、左や上方向にはみ出した分は元のextentで頭切れトンボ？になってしまいます。<br>これを防ぐために、元画像の外郭にconvertコマンド[^6]等を用いて、透明なバッファ領域を設けましょう。
* **gdalwarpでは変換元の投影系ではなく、GCPの投影系を指定する**<br>元の画像は日本測地系の平面直角だから、**-s_srs**の指定はそれで...とか考えだすと訳がわからなくなります。<br>gdal_translateでGCPの座標を埋め込んだ時点で、そのGCPの投影系になっているので、gdalwarpの**-s_srs**もその定義のprojtext[^7]を指定する必要があります。
* **大量のGCPの指定は、--optfileオプションを使う**<br>GCPの指定が大量であった場合、コマンドラインオプションで指定すると引数が多すぎるというエラーが出て実行できない場合があります。<br>こういう時は、オプション引数の記述をファイルに書き出して、-**-optfile**オプションでそのファイル名を指定すると、コマンドラインオプションの制限以上のGCP指定を行う事ができます。

以上のような注意点を踏まえ、実際の手順を列挙すると、

1. 元画像（GTiffとする）に対し

    ```shell-session:
    gdalinfo src.tiff
    ```
    してOrigin[^8]、Pixel Size[^9]の値を得ます。
2. convertコマンドで

    ```shell-session:
    convert src.tiff -bordercolor "#00000000" -border "1500x1500" mid1.tif
    ```
    で透明バッファ領域を発生させます[^10]。
3. Origin、Pixel Sizeとバッファ幅より、GCPのピクセル座標値（extent外のものも含む）を計算し、

    ```text:data.gcp
    -gcp ピクセルX1 ピクセルY1 lat1 lng1 -gcp ピクセルX2 ....
    ```
    といった形でファイルに書き出します。
4. gdal_translateを実行します。

    ```shell-session:
    gdal_translate -of "GTiff" -a_srs "+proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees" --optfile data.gcp tmp1.tif tmp2.tif
    ```
5. gdalwarpを実行します。

    ```shell-session:
    gdalwarp -tps -s_srs "+proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees" -t_srs "+proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees" -of "GTiff" -dstnodata 0 tmp2.tif result.tif
    ```

これで、複数画像からなる巨大地図でも、切れ目不整合が生じない形でジオリファレンスすることができます。

[^1]: 謎の具体例
[^2]: 異なる点で非線形な変形かけてる事になるので当たり前
[^3]: ピクセル座標の場合にマイナスの値、等も含む
[^4]: 函館だけの図郭でも北海道全域等
[^5]: 要するにピクセル座標で正方向
[^6]: ImageMagickに含まれるユーティリティ
[^7]: 多くの場合、**-t_srs**と同一になると思われます
[^8]: ピクセル原点位置での、投影系座標値
[^9]: 1ピクセル毎の、投影系座標の変化値
[^10]: 上記例では1500ピクセルのバッファ
AndroidのAppCompat Themeの継承関係がよくわからないので図にしてみた

できた図
<img src=https://github.com/takahirom/android-theme-and-style-graph/raw/master/output/small_appcompat.jpg>



## 経緯

AppCompatActivityを使って、AppCompatテーマを適応することで、色などに統一感を持たせることが可能となります。

テーマは継承することによって要素を変えていくことができます。
デフォルトでこんな感じのテーマが作られて皆さん使っていると思います。
今回はTheme.AppCompat.Light.DarkActionBarを継承しています。

```xml
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
```

ではこの継承しているTheme.AppCompat.Light.DarkActionBarは何者でしょうか？
これは実際にはこうなっておりBase.Theme.AppCompat.Light.DarkActionBarを継承しています。

```xml
   <style name="Theme.AppCompat.Light.DarkActionBar" parent="Base.Theme.AppCompat.Light.DarkActionBar"/>
```

Base.Theme.AppCompat.Light.DarkActionBarはどうなっているかというと、Base.Theme.AppCompat.Lightを継承しているようです。

```xml
    <style name="Base.Theme.AppCompat.Light.DarkActionBar" parent="Base.Theme.AppCompat.Light">
        <item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
        <item name="actionBarWidgetTheme">@null</item>
    <!-- 省略 -->
    </style>
```

Base.Theme.AppCompat.Lightは、AndroidのAlternative resourceの仕組みを利用しています。今回はAndroid5.0以上であればvaluesディレクトリにあるvalues.xmlではなく、values-v21やvalues-v22やvalues-v23にあるvalues.xmlのstyleを利用します。そのためBase.Theme.AppCompat.Lightは4つ定義されています。
またそれぞれのBase.Theme.AppCompat.Lightで継承しているstyleが違うので、もうとてもじゃないですが、追えません。

そこで**グラフで作ってしまえば分かるのでは、、**ということでxmlからGraphvizのdotファイルを自動生成してグラフを作ってみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/bf72f2f4-9564-c066-66b0-4284ba3aef97.png)

非常に見難いのですが、全体像を出すとこんな感じになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/748c2e37-5729-e5d6-f948-f5581071ec31.png)


継承とAlternative resourceの仕組みを上手く使うことでバージョンごとに分けたり、全部で使うものをvalues/themes.xml内で定義してそれを継承したりして、うまくやっているようです。
があまり追えません。。

AppCompat系の全体の画像は以下になります。(めっちゃでかいです。)
https://github.com/takahirom/android-theme-and-style-graph/raw/95b27f29567de0833f4e0475421086a35efd4520/output.png
またpdfは以下になります。
https://github.com/takahirom/android-theme-and-style-graph/raw/master/output/appcompat.pdf

生成のスクリプトなどはここにおいてあります。(動けばよかったのでソース汚いです、、)
https://github.com/takahirom/android-theme-and-style-graph

# まとめ
正直図にしてもよくわからなかったですが、テーマの継承をうまくたくさん利用してバージョン対応している事がわかりました。
ThemeOverlayなどの色んなテーマやスタイルの仕組みを探ったりする時にもしかすると役立つかもしれません。
Ruboty で環境変数の必須チェックを行う

Ruboty は環境変数の必須チェックを行う仕組みが用意されています

## <i class="fa fa-code" style="font-size:1em;"></i> Env::Validatable
Ruboty は内部で Env::Validatable というモジュールを用意しており、
これが読み込まれているクラスでは

```ruby
env(key, description, options = {})
```

を設定することで環境変数の必須チェックを設定することができます。
Ruboty::Handers::Base は Env::Validatable を include しているので


```ruby
require "ruboty/hoge/actions/hoge"
require "ruboty/hoge/actions/hige"

module Ruboty
  module Handlers
    # An Ruboty Handler + Actions to hoge-hige
    class Hoge < Base
      on /hoge\z/, name: 'hoge', description: 'output hige'
      on /hige\z/, name: 'hige', description: 'output hige'
      env :DEFAULT_HOGE_TEXT1, "DEFAULT_HOGE_TEXT1 desc"
      env :DEFAULT_HOGE_TEXT2, "DEFAULT_HOGE_TEXT2 desc"

      def hoge(message)
        Ruboty::Hoge::Actions::Hoge.new(message).call
      end

      def hige(message)
        Ruboty::Hoge::Actions::Hige.new(message).call
      end

    end
  end
end
```

のようにしておけば、 `DEFAULT_HOGE_TEXT1`, `DEFAULT_HOGE_TEXT2` に対して必須チェックが行われます。
未設定の場合は ruboty 実行時に以下の様なメッセージが表示されます。

```
Error: ENV["DEFAULT_HOGE_TEXT1"] is required but missing
    DEFAULT_HOGE_TEXT1                      - DEFAULT_HOGE_TEXT1 desc
```
[Verilog超絶初心者]$monitorの罠

Icarus Verilogを使っています。

$monitorに、複数bit幅の信号のうち特定bitだけを入力しても変化を検出してくれないようです。

```verilog
reg a, b;
reg[1:0] c;

initial begin
	c = 0;

	【うまくいかない例】
	$monitor ("%t: c[0] = %b, c[1] = %b", $time, c[0], c[1]);

			 
	#10	c = c+1; 
	#10	c = c+1; 


	【うまくいく例】
	$monitor ("%t: a = %b,  b = %b", $time, a, b);

			 a <= c[0]; b <= c[1];
	#10	c = c+1; a <= c[0]; b <= c[1];
	#10	c = c+1; a <= c[0]; b <= c[1];
```
uGUIのScroll Viewをはじめてみる

Unity5.3.1f1のScroll Viewを調べてみました。

今回は縦にスクロールするものを作ってみます。
#実装
##初期配置
メニューバーの「GameOjbect」→「UI」→「Scroll View」を選択。
ざっくり説明すると

- Scroll Viewは一番上の親
- Viewportは見える範囲を制御(==マスク)
- Contentは実際スクロール内のアイテム。この下に複数のGameObjectを配置する感じ。
- Scrollbar Horizontalは横のスライダー
- Scrollbar Verticalは縦のスライダー

![ScrollView1.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/942da2f1-4b63-1819-6153-9a2e564d4ef6.png)

##縦限定のScroll Viewにする
今回は縦のスクロール限定なので、横スライダー(==Scroll Horizontal)を消します。
![ScrollView3.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/764afb5d-58ae-3d05-3b3a-d60056f9ad04.png)

- Horizontalのチェックを外す
- Horizontal ScrollbarがMissingになっていたらNone
- ImageのNone(==必須ではないのでお好みで)

![ScrollView5.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/d4d8d7ab-9a3c-550a-e84a-03b4022bbf15.png)

今回はわかりやすくするため、Heightを大きくしておきました。
![ScrollView6.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/c5c9c7cb-43ad-5be2-4e56-abaa765c1154.png)

##Viewportの設定
![ScrollView7.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/d89b8539-dd91-d17f-307f-68a87b384228.png)

ここの設定は必須ではないですが、わかりやすくするため下記のようにしておきます。

- Maskのチェックを外します
- ImageをNone

![ScrollView8.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/2e09ebaa-5463-0f4a-b4c0-e77a14ffb046.png)

## Contentの設定
縦のスクロールは上にあわせると都合がよいことがあるので、AnchorsとPivotは図のようにしました。
![ScrollView9.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/735e3fbb-8fbb-0616-f420-05b0fe17ec86.png)

Textをいれてみました。
![ScrollView10.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/70c6fd47-01b1-cc82-06ba-faee4131e029.png)

Content Size Filterをいれます。
縦スクロールの場合はVetical Fitをいれます。値はPreferred Size。
このコンポーネントはよくわかっていないんですが、オブジェクトのサイズを自動調整してくれる感じらしいのです。
![ScrollView11.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/18d449d6-426a-938c-d8ba-39447f969a75.png)

なので、この設定するとHeightがTextの大きさで自動調整されてこんな風になります。
地味に大切な機能だったり。
![ScrollView12.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/c2e3a8f6-f577-829d-d287-9348e135ae84.png)

#完成
Sceneにみるとこんな感じ。
Maskが外れているので範囲外が表示されています。
![ScrollView13.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/535da44f-fae3-544d-9cd9-b631680a2722.png)
PHPで配列要素を削除する方法

PHPで配列要素を簡単に削除する方法を教えてもらったのでメモとして残しておきます。（@memory-agape ちゃんありがとう！）

# 環境
- PHP5系

# やりたいこと
以下のように、特定の値(今回の場合は`'c'`)に一致する配列要素だけを削除する。

```php
// 元の配列
$array1 = array('a', 'b', 'c', 'd');

//$array1から'c'だけを削除した配列がほしい
array('a', 'b', 'd');
```

# 実現方法
PHP Doucmentを全部読めていない初心者なので、一瞬「for文で実現するしかないのか...?」と暗澹たる思いでしたが、`array_diff`という標準ライブラリで実現できました。

```php
// 元の配列
$array1 = array('a', 'b', 'c', 'd');
// 除外対象の値
$value = 'c';

$result = array_diff($array1, array($value));
var_dump($result);// 'c'を除いた配列が表示される。
```

CLIでも簡単に確認できます。

```bash
$php -r "var_dump(array_diff(array('a','b','c','d'),array('c')));"
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [3]=>
  string(1) "d"
}
```
注意点として、生成された配列の`index`は0からの連番ではない可能性があります。（上記の例だと`$result[2]`が無い）

連番に戻したい場合は、`array_values`関数を使うと良いでしょう。(@Hirakuさん ありがとうございます！)

```php
$php -r "var_dump(array_values(array_diff(array('a','b','c','d'),array('c'))));"
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "d"
}

```

# 参考
- [PHP Document - array_diff](http://php.net/manual/ja/function.array-diff.php)
- [PHP Document - array_values](http://php.net/manual/ja/function.array-values.php)
(極座標変換)シェーダーでTheta 画像をリトルプラネットに変換

![スクリーンショット 2016-01-16 23.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/59911/5a7cb3bc-6fe7-77e2-fa39-94969440e214.png)

シェーダーで行うので、WebcamTextureに動画として表示したものをリトルプラネットとしてリアルタイムに変換することもできるんじゃないかと思います。

```CircularPolar.shader
Shader "Unlit/CircularPolar"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				float2 huv = (i.uv-0.5)*2;
				float2 pl;
				pl.y = sqrt(huv.x*huv.x+huv.y*huv.y)*2+1;
				pl.x = atan2(huv.y,huv.x)/3.14159265;
				huv = pl;
				i.uv = (huv+1)*0.5;
				i.uv.x = clamp(i.uv.x,0.0,1);
				i.uv.y = clamp(i.uv.y,0,1.99);

				// sample the texture
				fixed4 col = tex2D(_MainTex, i.uv);
				return col;
			}
			ENDCG
		}
	}
}
```
はじめてのGo言語 - インストール〜nginx導入まで - 　

Go言語が気になって気になってしようがないので、触ってみました。
最終的には、会社のHPをGoで実装したいと思います。（問い合わせ機能とかあるんで）
まずは、導入編です。

# Goのインストール
## インストール
簡単にインストールできます。（今回はLinuxにインストールしました。）

```
cd /usr/local/src
wget https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz
```
※バージョンは2016/01/11現在の最新版です。

## 解凍しますっ

```
tar -C /usr/local -xzf go1.5.2.linux-amd64.tar.gz
```

## パスを通す
```
export PATH=$PATH:/usr/local/go/bin
```

## テストコード
```hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

## 実行してみる
```
go run hello.go
```
ひとまずGoが動きました。

# nginxをインストール
Goはパッケージが豊富なので、`net/http`というパッケージで簡単にhttpサーバーの利用が開始できるそうなんですが、サービスレベルまで作りこむときにはきっと`nginx`の方がいいのかなーと思い・・・。

## リポジトリファイル作成します。

```
touch /etc/yum.repos.d/nginx.repo
vi /etc/yum.repos.d/nginx.repo
```

```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
```

## インストールします。

```
yum install nginx
```

## 設定ファイルの書き換え。

```
 cd /etc/nginx/conf.d/*.conf
 vi xxxx.conf　→　新しくファイルを作って下さい。（default.confがあるのでコピーしてもOK）
```
```xxxx.conf
server {
    listen       80;
    server_name  example.com;

    location / {
        fastcgi_pass  127.0.0.1:9000;
        include       fastcgi_params;
    }
}
```

## 設定のチェックと反映

```
/etc/init.d/nginx configtest
/etc/init.d/nginx reload
```

# index.goを作成する

```Go:index.go
package main

import (
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
)

func handler(res http.ResponseWriter, req *http.Request) {
    fmt.Fprint(res, "Hello World!")
}

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:9000") // TCP 9000 番ポートで Listen
    if err != nil {
        return
    }
    http.HandleFunc("/", handler)
    fcgi.Serve(l, nil)
}
```
## 実行します。
```
go run index.go
```

## ブラウザからURLを叩いてみます。
![スクリーンショット 2016-01-16 20.59.32.png](https://qiita-image-store.s3.amazonaws.com/0/45949/87d94492-7935-47d1-1844-cdef4c0f2d23.png)
と表示されました。

# テンプレートを別けてみる
```Go:index.go
package main

import (
    "net"
    // ↓追加
    "html/template"
    "net/http"
    "net/http/fcgi"
)

func handler(res http.ResponseWriter, req *http.Request) {
    // ここを書き換えます。
    // 同階層に置いたindex.htmlを読み込めます。
    t, _ := template.ParseFiles("index.html")
    t.Execute(res, nil)
}

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:9000") // TCP 9000 番ポートで Listen
    if err != nil {
        return
    }

    http.HandleFunc("/", handler)
    fcgi.Serve(l, nil)
}
```

# 現時点の問題
 - css,js,imageなど静的ファイルの読み込みのやり方がわからない。
 - Go言語の基礎をまだ把握していない。＼(^o^)／

MVCを自分で実装したいのですが、まだ慣れていないので
次回は、フレームワークを使ってみたいと思います。
あと、Goの基礎も。