OmniAICreator/Qiita-1.07M huggingface dataset:
[PowerShell]ある特定のAssemblyの名前空間(namespace)の一覧を取得する方法

ちょっと色々調べていたら、あるモジュール(Assembly)の名前空間(namespace)の一覧を取得したくなったのでメモ。
PowerShellで１行で書けます。

` [Reflection.Assembly]:: LoadFrom( "モジュールのパス" ).GetTypes().Namespace | sort -Unique`

クリップボードに貼り付けたいならパイプで

` [Reflection.Assembly]:: LoadFrom( "モジュールのパス" ).GetTypes().Namespace | sort -Unique | clip`
React Nativeを触ってみた

朝起きたら[こんなページ](http://facebook.github.io/react-native/)を見つけたので15分だけ触ってみた。
基本的な導入は以下にあるが、ここでは最低限動くまでメモ。

- http://facebook.github.io/react-native/docs/getting-started.html

## 1. 準備

React Nativeを動かすには、最低限`node`と`react-native-cli`が必要になる。
上記をインストール後、`react-native init`でプロジェクトを作成する。

```
$ brew install node
$ npm install -g react-native-cli
$ react-native init AwesomeProject
```

作成されるディレクトリの概要は以下のとおり。

```
$ cd AwesomeProject
$ tree -L 2
.
├── AwesomeProject.xcodeproj
│   ├── project.pbxproj
│   ├── project.xcworkspace
│   ├── xcshareddata
│   └── xcuserdata
├── iOS
│   ├── AppDelegate.h
│   ├── AppDelegate.m
│   ├── Base.lproj
│   ├── Images.xcassets
│   ├── Info.plist
│   └── main.m
├── index.ios.js
├── node_modules
│   └── react-native
└── package.json

9 directories, 7 files
```

## 2. 実行

1. `AwesomeProject.xcodeproj`をXcodeを開く
2. `cmd+R`でRunする

すると、以下のようにシミュレータが立ち上がる。

![react-native.png](https://qiita-image-store.s3.amazonaws.com/0/25075/bbc78fb2-e0a3-9fc2-ce9a-4e01f288af80.png)

## 3. 編集

1. `index.ios.js`を編集する
2. Xcode上で`cmd+R`でRunする

## 4. 所感

15分どころか、ものの3分もあれば実行まで確認できた。
次は[チュートリアル](http://facebook.github.io/react-native/docs/tutorial.html)を見ながらなにかつくってみる。
ピザスプリントのススメ

# タイムテーブル公開

デザインスプリント(Design Sprint)の実施レポートとかちらほら見かけるようになってきたけど詳細なタイムテーブルまでは公開されていなかったりで、真似しようにも具体的にどうしたらいいか分からないという人もいるかと思うので、今後実施したスプリントのタイムテーブルとかレポートをどんどん公開していこうと思います。

デザインスプリントがいまいちよく分からないという方はまずはこちらをご覧ください。[THE DESIGN SPRINT(和訳)](https://github.com/crossnode/DesignSprint)

# まずは1スプリント

「デザインスプリントってどんなのか一度体験してみたい」という場合は1回ピザスプリントをするといいですよ。

# なぜピザ？

![2015-03-26 19.55.34.jpg](https://qiita-image-store.s3.amazonaws.com/0/27176/c2b361e7-4a52-ad7d-83ad-a4a4f01ed39d.jpeg)

「ピザいいよ、ピザ」とか言われても、「いや、あの、ピザじゃなくてサービスとかアプリの改善をしたいんですが...」となるかもしれませんが、まずは手法を理解してから本番行きましょうよということです。

手法がいまいち理解しきれてないのにお題がガチだと結果も出ないと思うので、お題はみんな馴染みがあって改めて理解を深めるフェーズが要らないテーマがいいと思うわけです。

そこでみんな大好き「PIZZA」ですよ。

# タイムテーブル

ピザを決めて注文するまでを30分に収めるメソッドを組みました。

1. 条件設定(5分)
  - 対象メニュー共有（今回は会場の[下北沢オープンソースカフェ](http://www.osscafe.net/ja/)御用達のピザ屋さんに限定）
  - 予算上限（1人1,000円7人合計7,000円等）
  - 最低アイテム数（Lサイズ✕3枚等）
  - 必須条件（食べられないものなど）
2. ノート作成(5分)
  - メニューから条件に合うアイテムを書き出す
3. クレイジー4(5分)
  - 30秒で1つ書く＆10秒弱休むを繰り返して4つ紙に書き出す
4. サイレント投票(5分)
  - 「これ美味しそう」「これ今日食べたいかも」と思うものに投票
  - 何個投票してもOK
5. 注文(10分)
  - 人気上位アイテムを予算内で選択して注文
  - 予算や好みに応じて必要であれば次点アイテムを採用してもOK

# 気づいたこと

![2015-03-26 20.16.57.jpg](https://qiita-image-store.s3.amazonaws.com/0/27176/18654f92-e03e-6091-8e62-5afbb33fc33a.jpeg)

1. タイマーアプリ大事
  - 今回はこちらを使いました[Sprint Timer](http://crossnode.github.io/SprintTimer/)
  - 「フェーズと残り時間を大画面に表示できるアプリが欲しい」とスプリント直前に思い立って即席で1時間弱で作りました
  - 参加者が口々に「あのタイマーがなかったら時間内に作業を終わらせようという気にならなかった」「ファシリテーターが口頭で残り時間を言うだけでは実感が湧かなかったと思う」と言っていたので、できるだけ大きく表示できるタイマーは必要だと思います。タブレットとか実物の時計とかじゃ目に入らないって
  - ちなみにこのタイマーはフェーズと分数を入力してスタートボタンを押すだけで使えるんですが、CRAZY8のときは0.6mで走らせると35秒になるのでちょうどいい感じですよ
2. プリントアウト大事
  - CRAZY4でアイデア出しをしたあと、候補に挙がったアイテムはプリントアウトしたメニュー表でマーカーで囲っていって、マークしてあるアイテムに投票してもらうのが分かりやすいと好評でした
  - 投票はシール買ってくるのはあまりエコじゃないのでマジックで◯を書いてもらいました。分かればいいんだよ
3. とにかく準備大事
  - タイマーアプリとかプリントアウトとか、いかに先回りしてシミュレーションして準備できるかがスプリントの成否を分けると思いました
  - 準備万端じゃないと自信をもってファシリテーションできないし、自信がなさそうなファシリテーターの言うことは聞いてもらえないと思う
  - 結果として30分でたかがピザを注文するだけのスプリントでも準備には1週間くらいチビチビやってトータルしたら5時間くらいかかってるかも。いやもっとかも...
  - このタイプのスプリントをするのは初めてだから本番の数倍準備にかかっても仕方ないかな。次回はこれをベースにできるから準備も30分くらいで収めたいところ
4. ファシリテーション大事
  - やる前から分かってたけど本当にファシリテーターが即断できないと時間に収まらない
  - 「今はこれをやるフェーズだよ」「それはこのあとのどのフェーズでやるから今はこれに集中してね」ということを折に触れて簡潔に伝えて軌道修正するだけの理解とコミュ力が必要。どうすべきでどうしたらそうしてくれるか瞬時に判断して実行する牧羊犬のイメージ
5. 決裁権者（もしくはリーダー的存在）のGOサイン確認大事
  - みんなの総意をまとめたらリーダーにGOサインをもらうとこまでやるとフェーズが締まる・キマった感が出る
  - 結局みんな誰か（責任者）のお墨付きがないと安心できない・終わったと実感できないんだと思う
6. ピザスプリントでもプロトタイピング（注文）まで時間に収めよう
  - メニューが決まったところで油断しがちだけどECサイトの深い罠が待ち受けているのです
  - 注文システムでまごつくことを予想して、このフェーズだけ他のフェーズの2倍時間を割り当てました。それでもギリギリでした

# あとがき

ファシリテーターの僕を含めて全員初めてのスプリントだったけど時間内に収まって大成功だったと思います。

参加したみんなの意識もまっすぐで時間内に今のフェーズをきちんとやろうという集中力が素晴らしかったです。こんな感じで実案件も良くしていけたらハッピーですね。

しかし、予想通り注文で時間食いました。ピザのWEB注文は何度やってもやり直しや思った動線で進めなかったりしますね。

次回はもう少し長いドアノブスプリントについて書きたいと思います。
Rails Tutorial メモvol.3

第６章　新規ユーザーの登録

<font color=red>rails console</font>上で
`user1=User.new(name:"~",email:"~")
`
コマンドで、メモリ上に<font color=blue>user1</font>のデータを作成する。（※DB上には保存されていない）

ここで
`user1.save`
を実行することにより、DB上にも保存される。
この際に、id,created_at,updated_at属性が生成される。

この一連の操作を
`user1=User.create(name:"~",email:"~")`
で行える。

・DB上から削除
`user1.destroy`
ただし、メモリには残ってる。
・DB上のデータの確認（検索）
`User.find(@id)`
でid=@idのユーザーを探せる。
destroyしたユーザーは検索できなくなっている。
・登録されているユーザーの表示
`User.all` <--全員表示
`User.first` <--<font color=red>idが一番若いもの</font>を表示
はじめてのBrowserify


タイトルを見て初心者向けのBrowserify解説記事を期待した人がいたらごめんなさい。
自分がはじめてBrowserifyを使うにあたっての個人的メモです。

今までは雑にconcatしていたけど、複数のjsファイルが依存関係にあると読み込む順番を指定しないといけないし、そもそもグローバルオブジェクトを経由するようなことは避けたい。

というわけで、Browserifyを使ってCommonJSスタイルでモジュール管理してみる。

ちゃんとした解説が読みたいなら、ちょうどCodeGridさんにBrowserifyの記事が載っているのでそちらがオススメです。
僕もお世話になりました。


##試してみる

事前に、npmでBrowserifyをインストール。

```
npm install -g browserify
```


さっそく試してみる。
hoge.jsという適当なモジュールを用意。

```hoge.js
function Hoge() {
    this.msg = 'hoge';
}

Hoge.prototype.setMessage = function setMessage(msg) {
    this.msg = msg;
};

Hoge.prototype.say = function say() {
    return this.msg;
};


module.exports = Hoge;
```

main.jsというファイルを用意して、上のモジュールを読み込んで使ってみる。

```main.js
var Hoge = require('./hoge');

var hoge = new Hoge();
console.log(hoge.say());
```

下記コマンドでBrowserifyを実行。

```
browserify scripts/main.js -o scripts/bundle.js
```

これで依存関係を解決したbundle.jsが出力される。

お手軽ですね。
即時関数で囲むようなイディオムも必要ない。


##CoffeeScriptで試す

生のJavaScriptでクラスっぽいものを書くのは辛い（というかどの書き方が正解なのかよくわからない）ので、同じことをCoffeeScriptでやってみる。

browserifyのtransformsという仕組みを使ってCoffeeScriptをJavaScriptに変換、その後、依存関係を解決して出力という流れ。

前述の手順と同じように、モジュールと、それを読み込むファイルをCofeeScriptで用意する。

```hoge.coffee
class Hoge

  constructor: ->
    @msg = 'hoge'

  setMessage: (msg)->
    @msg = msg

  say: ->
    return @msg


module.exports = Hoge
```

```main.coffee
Hoge = require './hoge'

hoge = new Hoge()
console.log hoge.say()

```

そして同じようにbrowserifyを実行。。する前に、CoffeeScriptをJavaScriptに変換するcoffeeifyモジュールをインストールする。

```
npm install coffeeify
```

下記のようにtransformsにcoffeeifyを指定してbrowserifyを実行することで、依存関係を解決したjsファイルを出力できる。

```
browserify -t coffeeify --extension=".coffee" scripts/main.coffee -o scripts/bundle2.js
```

エントリポイントがひとつであれば、これだけ。


##今後

実案件で使うときはgulpのようなビルドシステムにタスクとして組み込んで使うことになるかと思います。
その際はファイルの変更をwatchしたり、コードをminifyしてsourcemapを出力したりすることになるかと。
あとは、外部のライブラリをrequireした場合やコード量が増えてきた時に出力に時間がかかりそうなので、差分ビルドできるようにしておくとよいかも。

その辺りは追々。
移除 Vagrant


## Windows 

直接使用新增移除工具移除

## Mac

1. 刪除 `/Application/Vagrant` 資料夾
2. 刪除 `/usr/bin/vagrant` 檔案

## Linux

1. 刪除 `/opt/vagrant` 資料夾
2. 刪除 `/usr/bin/vagrant` 檔案


### 參考

1. [Vagrant Doc](http://docs.vagrantup.com/v2/installation/uninstallation.html)
2. [Vagrant 入門](https://github.com/astaxie/Go-in-Action/blob/master/ebook/zh/01.3.md)
Atomでローカルサーバを起動するパッケージ

作りました。

https://atom.io/packages/local-server-express

## 機能

### `ctrl+alt+cmd+s`でサーバ立ち上げ

開いてるプロジェクトのルートが`/`になり、`localhost`をホストに空いてるポートでサーバが立ち上がります。ついでにデフォルトブラウザが起動します。

`index.html`が存在しないフォルダを開いたときには↓のようにファイルの一覧が出ます。

![image](https://qiita-image-store.s3.amazonaws.com/0/17969/42304baa-6707-9f62-dbf6-755a37d4440d.png)

### HTMLファイル

HTMLファイルで上記コマンドを実行するとそのファイルのパスを開きます。

---

※ Macでしか確認してないのでWindowsで動かなかったらすいません:bow:
NSTimerのtoleranceプロパティ


NSTimerのリファレンスを見ていたら```tolerance```という見慣れないプロパティが追加されていた。
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/#//apple_ref/occ/instp/NSTimer/tolerance

iOS7以降で使える模様。

toleranceには寛容とか許容という意味がある。


要するにタイマーをリピートさせるときの次回発火時間を計算する際に```tolerance```プロパティを加味して計算するということらしい。そして、```tolerance```プロパティには経験則として少なくともintervalの 10% を与えてあげると良いとのこと。

```Objective-C
NSTimeInterval timeInterval = 1.0;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(updateData:) userInfo:nil repeats:YES];
timer.tolerance = timeInterval * (10.0 / 100.0);
```

設定した場合としなかった場合とで比較できてないけれど、基本的に設定しておくのが吉な気がする。
【jQuery】現場でよく使うプラグイン① flexslider


flexsliderは簡単にスライドショーが実装でき、たくさんのオプションがある、jQueryの定番プラグインです。

まずは公式ページから下記ファイルをインストール

+ flexslider.js
+ flexslider.css


```html:index.html
<ul class="slide">
  <li><img src="slide01.jpg"></li>
  <li><img src="slide02.jpg"></li>
  <li><img src="slide03.jpg"></li>
</ul>
```

```Javascript:script.js
$(セレクタ).flexslider({
	//オプションを設定
});
```
【俺メモ】VMWare上のCentOSのIPアドレスを固定に設定する

ホストOSはWindowsやで。
# ホストOSの設定を確認

* VMWareの仮想マシンの設定で、ネットワークアダプタがNATやんな。
* ネットワークの設定でVMNet8のIPアドレスをゲットや。(→192.168.xxx.1)

# CentOSの設定

ネットワークの設定ファイルを修正すんで。

```shell-session
# nano /etc/sysconfig/network-scripts/ifcfg-eth0
```
以下の内容で書き換えや。（無い場合は追加、書かれていない設定はそのまま）

```shell-session
  ONBOOT=yes #no⇒yes
  BOOTPROTO=static #dhcp⇒static
  IPADDR=192.168.xxx.yyy #add
  NETMASK=255.255.255.0 #add
  GATEWAY=192.168.xxx.2 #add
  DNS1=192.168.xxx.2 #add
```

ポイントや。試験にでるさかい、しっかりおぼえとき
* ホストOSのIPアドレスの部分xxxは仮想マシンのxxxと一緒やで
* yyyの部分は129以上なら好きな数字でええで
* GATEWAYのアドレスは最後は2固定やで
* GATEWAYとDNS1は一緒やって

# 確認

```shell-session
# service network restart
# ping -c 4 www.yahoo.co.jp
PING www.g.yahoo.co.jp (124.83.203.233) 56(84) bytes of data.
64 bytes from f8.top.vip.ogk.yahoo.co.jp (124.83.203.233): icmp_seq=1 ttl=128 time=13.0 ms
64 bytes from f8.top.vip.ogk.yahoo.co.jp (124.83.203.233): icmp_seq=2 ttl=128 time=11.4 ms
64 bytes from f8.top.vip.ogk.yahoo.co.jp (124.83.203.233): icmp_seq=3 ttl=128 time=27.3 ms
64 bytes from f8.top.vip.ogk.yahoo.co.jp (124.83.203.233): icmp_seq=4 ttl=128 time=11.5 ms
```
となればOKやで。
Java、Android独学の際に参考にしたサイトなど

#はじめに
わたしは過去に入門書を購入しコマンドプロンプトで鶴亀算を実際に作成するところあたりまでやったものの、その後が続かず学習を辞めたということが3回ほどある人間である。
当記事作成時である2015/03時点ではJavaの学習を再開後9ヶ月目、趣味のAndroidアプリを公開しており、次はiOSアプリを作ろうかとしているところだ。
「なんとなく興味はあるけれど学習が続かない」くらいのひとの助けになるかとおもい、わたしが勉強のために参考にさせていただいたサイト等をまとめていく。
#Java学習参考サイト
**1.[Javaで始めるプログラミング（JavaBook）](http://msyk.net/keio/JavaBook/)**
過去に学習を中断した原因を考え、「コマンドプロンプトで行う鶴亀算」と「GUIを伴うアプリケーションソフト」間の隔たりが大きすぎて学習初期に持った熱がすぐに冷めてしまうことによるものだとおもい、すぐに「クリックができるもの」を教えてくれるサイトを探して上記サイトに辿り着いた。
Java開発のためのソフト、Eclipseの導入方法も載っておりスムーズに学習を始められるとおもう。

**2.[JavaDrive](http://www.javadrive.jp/)**
条件分岐、配列等、基本的なことはここで確認できる。
プログラミングを独学で習得しようとした際に一番時間が掛かることは、「こういうことがしたいしたぶんできるとおもうのだけれど、それを何と呼ぶか分からないため検索できない」問題に直面することだとおもうので、少なくともここの目次くらいは読んでおくといいかもしれない。

**3.[Javaちょこっとリファレンス　Listの要素をソートする（独自クラス）](http://java-reference.sakuraweb.com/java_collection_sort_original.html)**
わたしが作りたいモノのために不可欠だったけれど何と呼ぶのか分からず非常に躓いたものを解説していてくれたページ。
当該ページのデータクラスにて社員番号と社員名が載っているが、これを元に手を加えていけば例えば電話番号、基本給、家族構成等の情報を一単位にして操作できるため、これができるようになればデータを記録、検索するような操作ができるようになる。
※これが最適なのかどうかは知らない。
#Android学習参考サイト
**1.[Androidアプリ開発入門](http://androidguide.nomaki.jp/index.html)**
上記サイトの入門編で「タッチして動くアプリ」の作成をすぐに体験できる。

**2.その他**
ちょっとまとめ方が思い付かなかったので、欲しい情報に辿り着くまでに時間が掛かった問題やよく使っているものを適当に羅列する。

・文字列の結合：
初心者向けJava講座の多くで文字列の結合は+演算子を用いて行う例が紹介されるが、+演算子を用いた文字列の結合は処理が重いようなのでStringBuilderによって行ったほうがよい。
Androidアプリでcsvファイルの読み書き（特に書き込み）をする際、20万回（1行50セル×4000行）程度の処理に+演算子での文字列結合を加えながら行おうとするとアプリが固まってしまうが、StringBuilderであれば問題なく処理を行うことができる。

・文字コード問題：
csvファイルを読み取ってアプリ内で処理したかったのだが何度やっても文字化けしてしまう。文字コードを変更するという記述を足してみてもうまくいかない。分かってみれば簡単で、BufferReader等でcsvファイルで使われている文字コードを指定して読み込めばいいだけであった。

・GoogleAnalytics：
公開するアプリにGoogleAnalyticsを設定する際、公開するとき以外はAndroidManifestのversionName末尾にx等記号をつけておくと作成時のテスト中に起きたエラーとユーザーの操作で起きたエラーを区分して集計できるため便利である。
他にanalytics.xmlにて集計用のスクリーンネームを設定できるが、複数のアプリを公開する予定ならMain、Setting等重複しそうなスクリーンの区別を考えて設定するのが手間だし、設定しなくてよいとおもう。

・[relColors](http://www.weekendphp.com/relColors/fff)：
カラーコードを参照できる。縁に色をつける場合、縁の中の色から下に6～8個ほどの色を使うとしっくりくる気がする。

・[ソフトウェア技術ドキュメントを勝手に翻訳 外形Drawable](http://www.techdoctranslator.com/android/guide/resources/available-resources/drawable-resource#Shape)：
丸角やグラデーションのおしゃれなボタンができる。押下時に色が変わったり、使えないときに色を変えたりするのもこのサイトあたりに載っていた気がする。
inputのnameに[や]を使うとangularのvalidationが上手く動作しない件(とその回避方法)

# 注意

* angularの問題というより、使い方の問題かも知れないです。
* 検証はしたけど、ソースを追っているわけではないので絶対にコレだ！という解釈でも無いです。
* 明確な回避方法はわからないです。(追記:分かりました。)教えていただければと思います。

# 事の発端

cakePHPで開発中に、フロントエンドのformをangularでバリデーションしたかった。

# 比較

きちんと動作するコード

```html
<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="utf8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
</head>
<body>
<div ng-controller="sample">
<form name="Form">
<div ng-show="Form.title.$error.required">必須です</div>
<div ng-show="Form.title.$error.maxlength">最大255文字です</div>
<input type="text" name="title" ng-model="title" ng-required="true" ng-maxlength="255">
</form>
</div>
</body>
<script>
var app = angular.module('app', []);
app.controller("sample", function($scope, $http) {
});
</script>
</html>
```

動作しないコード

```html

<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="utf8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
</head>
<body>
<div ng-controller="sample">
<form name="Form">
<div ng-show="Form.data[0][title].$error.required">必須です</div>
<div ng-show="Form.data[0][title].$error.maxlength">最大255文字です</div>
<input type="text" name="data[0][title]" ng-model="data[0][title]" ng-required="true" ng-maxlength="255">
</form>
</div>
</body>
<script>
var app = angular.module('app', []);
app.controller("sample", function($scope, $http) {
});
</script>
</html>
```

# 上記コードの差分

inputタグのnameとそれを利用するng-showの値が```title```か```data[0][title]```かの違い

# なぜそんな名前を利用するか？

cakePHPでformの値を受け渡したい場合は```data[hoge]```の様に記述する様にドキュメントに記載されている。

従わなくても問題なく動作するが、値を配列で受渡したかったりすると従っていたほうが無難。

# 現象

内部的には上手く動作しているのか、firebug等で確認すると、クラスが切り替わっていて条件に合わない場合はng-invalidとか付いている。

しかしバリデーションメッセージの表示(というか、ng-showで利用される、```Form.data[0][title].$error.required```への値の受け渡し？)は上手く動作しない。

# 推測
formタグのnameの次にinputの名前を記述するが、inputの名前が配列の様な形で宣言されることを想定していないのでは無いか？

=> ```Form.data[0][title]``` の ```data[0][title]``` 部分

# 回避方法

```html

<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="utf8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
</head>
<body>
<div ng-controller="sample">
<form name="Form" action=".">
<div ng-show="Form['data[0][title]'].$error.required">必須です</div>
<div ng-show="Form['data[0][title]'].$error.maxlength">最大255文字です</div>
<input type="text" name="data[0][title]" ng-model="data[0][title]" ng-required="true" ng-maxlength="255">
</form>
</div>
</body>
<script>
var app = angular.module('app', []);
app.controller("sample", function($scope, $http) {
});
</script>
</html>
```

ng-showの所を```Form['data[0][title]']```という様に変更するのが良いみたいです。


[le_panda_noir](http://qiita.com/le_panda_noir)さんのコメント
>これはおそらくForm.data[0][title]がForm["data"][0][title]と評価されてるからだと思われます。つまり、inputでnameがdataの0番目(すでにここでおかしい。普通はここで$errorなどが参照される)のtitle変数(もちろん宣言してないのでundefined)の値が指すプロパティを参照してるという動作だと思われます。Form["data[0][title]"]なら問題なく動作するのではないでしょうか?(実機で調べてないしかなりあやしいので動かなかったらすいません)

と自分の投稿を見てくださった別の方からの参考リンク

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2756&forum=9

をたどった所回避方法が分かりました！
ありがとうございました。
GitHub の Pull Request 発行をもっとスマートに

# モチベーション

* コマンド一発・スクリプト実行で Pull Request を発行する

# 事前準備
## hub コマンドのインストール

### Mac へ

```bash
$ brew install hub
```

### CentOS へ

```bash
cd /tmp
git clone https://github.com/github/hub.git
cd hub/
./script/build
cp hub /usr/local/bin/
```

* go がないとエラーになる。その場合は、下記コマンドを実行し、go を入れる。

```bash
$ cd /tmp
$ curl https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz 
$ sudo tar -C /usr/local -xzf  go1.4.linux-amd64.tar.gz

# .bash_profile に記載
export PATH=$PATH:/usr/local/go/bin
$ source ~/.bash_profile
```


# コマンドラインからの Pull Request 発行

## Pull Request のテンプレートファイルを用意

* 下記のようなテンプレートファイルを用意する
    * プロジェクトに応じて好きなフォーマットを用意

```:.pullreqmessage.txt
[#ticket-no][WIP][Task/Bug]

## 対象チケット
https://github.com/user-name/hogehoge/ticket-no

## 対応内容

### PR ステータス
 - [ ] 実装完了
 - [ ] レビュー
 - [ ] レビュー指摘対応
 - [ ] 完了
```

## master に対して Pull Request 実行

```bash
$ git branch
* work_branch
  master
```

* Pull Request を発行(ちょっと長いがコマンド一発)

```bash
# user-name はリポジトリのある user-name に適宜変更する
$ hub pull-request --browse -F ~/.pullreqmessage.txt -b user-name:master -h user-name:$(git symbolic-ref --short HEAD)
# symbolic-ref の --short オプションが使用できない場合は下記
$ hub pull-request --browse -F ~/.pullreqmessage.txt -b user-name:master -h user-name:$(git rev-parse --abbrev-ref HEAD)
```

# script 化

* Redmine などのバグトラッキングシステムの使用を考慮し、スクリプト実行時にチケット番号を引数に渡すことで Pull Request のタイトルや本文にチケット番号を挿入するようにする

```sh:create_pullreq.sh
#!/bin/sh

if [ $# -ne 1 ]; then
  echo "指定された引数は$#個です。"
  echo "引数にチケット番号を渡してください。"
  exit 1
fi

if expr "$1" : '[0-9]*' > /dev/null ; then
  echo "チケット番号 $1 の Pull Request を作成します。"
else
  echo "チケット番号が不正です。数値を入力してください。"
  exit 1
fi


echo 'Create temporary format file.'
sed -e "s/ticket-no/$1/g" ~/.pullreqmessage.txt > ~/.pullreqmessage_temp.txt

echo 'Exec Pull Request'
hub pull-request --browse -F ~/.pullreqmessage_temp.txt -b user-name:master -h user-name:$(git symbolic-ref --short HEAD)

echo 'Delete temporary format file.'
rm ~/.pullreqmessage_temp.txt
```

### スクリプトの実行 (使い方)

```bash
# 例: チケット番号 0000 用の Pull Request を作成する場合
$ sh create_pullreq.sh 0000
```



## コマンド実行後

* Pull Request を作成し、ページが表示される

![pull_req_image.png](https://qiita-image-store.s3.amazonaws.com/0/28573/5fe276e1-0acc-cb1a-3e0f-ab5a9a6cf20e.png)


### SSH 接続先のサーバなどブラウザを開けない環境の場合

* `export BROWSER=echo` を ~/.bash_profile に記載しておくと、ページを表示する代わりに Pull Request の URL を標準出力するよう変更できる。


# 参考
* https://github.com/kasaharu/scriptForGitHub
windowsでmarkmon

markmonが面白そうなのでインストールしました。

#最初は駄目だった
macで動いたのはよく見るけど、windows(windows7です)はなかなか見ません。なんだか、markmonをsublime text3で動かしたのだけどなかなか、動かなくていろいろやってみたら動いたのでご紹介

#インストール

nodeはインストール済みとします。

ここで
<pre>npm -g install markmon</pre>
とするんですけど、msのコンパイラclの動く環境でやんないとうまくいかないようです。

マニュアルにもwindows sdk 7.1がうんたらと書いてあるんですけど読み飛ばしていました。英語が駄目だといかんですなあ

次にpandocをダウンロードインストールします。windows用のインストーラでインストールできました
<pre>pandoc xxx.md -o xxx.docx</pre>
とかすると、markdownからwordに変換してくれる凄い奴なんでお勧めです。

最後にsublime text 3です。package installerをインストールする方法はいろんなところに書いてあるので省略します。

japanizeとかIMEsupportとかインストールして気持ちよくなってください。

最後にmarkmonをインストールするんですけど、これが鍵です。
#sublimeのmarkmon
これをsublimeのpackage installerでインストールしてしまうと、なんだか理由はわからないのですがpackage setting->markmon->default settingとやっても真っ白なんですねえ
しかたがないのでマニュアルインストールです。

sublime-text-markmonのzipファイルを
users\[name]\AppData\Roaming\Sublime Text 3\Packages
持ってきてここで解凍します。

そこで、中のsublime-text-markmon.sublime-settingsを修正します。
<pre>
{
    //On Windows try "markmon.cmd" if you get errors.
    //If markmon is not on your path you'll need to use a full path to it
    "executable": "markmon.cmd",
    "port": 3002,
    "command": "pandoc -t HTML5 --mathjax",
    "stylesheet": null,
    "projectdir": null
}</pre>
ここの "executable"はデフォルトは"markmon"だったんですけど、上のコメントにも書いてあるように.cmdを追加します。

以上でＯＫです。

sublimeを再起動して、サンプルのmdを書いて、
ツール->markmon->launchを実行！！

コマンドプロンプトでnodeが起動されてsocket.ioもスタートしてport 3002で待ってます。と同時にwebが開いて、以降はsublimeの入力と同期してwebが動きます。
おおおおおお！

mathjaxは<pre>$x^2$</pre>とか入力すると$x^2$に変換するのは、qiitaと同じ感じですね。

そしてこれを
<pre>pandoc xxx.md-o xxx.docx</pre>
で変換して感動しようとしたのですが、どうも変な感じです。

どこかでこれを修正する方法をアップしていたのを見た記憶があるんですけど、忘れました。

まずは、markmonのwindows起動のご紹介まで
kinect for windows v2をopenframeworkで使用する

openFrameworksでkinect動かそうと思ったら、of公式ではxbox版のkinectしかサポートしていなかったのでメモ
(2014年3月24日現在)
→ofxKinectはv1対応らしく
kinect for windows v2で無理やり使おうとしたら、libusb0.dllがないと怒られました・・・。

ということで、まずは環境
openFramewoks : 0.8.4
OS : Windows 8.1
KINECT : Kinect for Windows v2
IDE ： VisualStudio 2012 express

#１.openFrameworksをローカルに展開
http://openframeworks.cc/download/

#2.ofxKinect2を入手

http://forum.openframeworks.cc/t/ofxkinect2-addon-of-kinect-for-windows-v2-device-with-microsoft-sdk/15013
https://github.com/sadmb/ofxKinect2

ofxKinect2-master.zipを入手


#3.ローカルに展開していたopenFrameworksのaddonsにofxKinect2をいれる
作成したopenFrameworksのaddonsフォルダへ
ofxKinect2-masterの直下にあるsrcフォルダをコピペ
![4.png](https://qiita-image-store.s3.amazonaws.com/0/68563/61080ac5-22d2-6a8b-4366-2707088313f8.png)

以下の例ではofxKinect2というフォルダを作った。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/68563/ee93e1e6-3b82-9d21-a8e6-8c719415aaef.png)

#4.デモ実行

ofxKinect2-masterの直下にあったexampleフォルダを適当な名前と場所において実行

>C:\of_v0.8.4_vs_release\apps\myApps\kinect2example

実行時のデモ
![3.png](https://qiita-image-store.s3.amazonaws.com/0/68563/2fcd30dc-6cb9-ac29-a867-05f7315a912e.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/68563/4ca7bbe9-3492-5bd6-e003-b35a9b9f906d.png)

#その他

自力でプロジェクトジェネレータでプロジェクトを生成して試してみたの
のですが、vsに対してのkinect sdkのオプション設定等々が不明で作動しませんでした。

一応以下を参考にしてみたのですが・・・。
https://github.com/sadmb/ofxKinect2
>Usage: You should add Kinect2 include and library.
>
>add to C++ -> General -> Additional Include Directories: $(KINECTSDK20_DIR)\inc;
>add to Linker -> General -> Additional Library Directories: $(KINECTSDK20_DIR)\lib\x64;

(2015/4/1追記)
再度試したところ、プロジェクトジェネレータでもプロジェクトを作成できました。

![tuika .png](https://qiita-image-store.s3.amazonaws.com/0/68563/2cb94ad0-c238-1b4a-b09c-5587017a5760.png)

追加の依存ファイルにKinect20.libを追加していなかったと推測しております。
Microsoft Azure for DreamSparkの紹介

Microsoft Azure for DreamSparkというのを紹介してもらったので，ちょっとやってみました．

# 参考
https://buchizo.wordpress.com/2015/03/25/学生のazure利用がより簡単に/

# Microsoft Azure for DreamSparkとはなにか
Steve GuggenheimerがMicrosoft Azure for DreamSpark (Students)のリリースについて，ブログでアナウンスをしています．
以下に，[Announcing Microsoft Azure for Student Developers](http://blogs.msdn.com/b/stevengu/archive/2015/03/23/announcing-microsoft-azure-for-student-developers.aspx)より抄訳を示します．
> システム開発がパラダイムシフトした今，学生開発者に新しいシステムへのアクセスを与えることがイノベーションを生む．
> Microsoftは，新しいシステムを用いて，学生が何かを形にすることを支援するプログラム[Microsoft Imagine](http://www.imagine.microsoft.com/)を立ち上げた．
> Microsoft Azureでは，その理念に沿うように，Azure App Service Web AppsとApplication Insightsへのアクセスを，DreamSparkの1プログラムとして解放した．
> やっぱ学生すげーわ．だからMicrosoft Azure for DreamSparkどんどん使ってね．

# なにができるのか
Microsoft Azure for DreamSparkの紹介動画[Scott Guthrie Announces Azure for Students through Microsoft Imagine](http://channel9.msdn.com/Blogs/Microsoft-Imagine/Scott-Guthrie-Announces-Azure-for-Students-through-Microsoft-Imagine)より引用
> Announcing free Azure web development services for verified students – no credit card required!
> * Web Apps
> * Visual Studio Online
> * Application Insights

Web App，Visual Studio Online，Application Insightsは，元々無料枠があるAzure上のサービスです．
したがって，Microsoft Azure for DreamSparkは，クレジットカードを持たない学生であっても，Azureの先進的な機能を利用することができる枠なのです．
アカウントは，無料サービスしか使えないように制限されるので，特に課金される心配も無いです．

# 登録する
DreamSparkにログインし，Microsoft Azure for DreamSparkを検索し，サインアップをします．
登録時，名前や住所の入力や電話かSMSによる認証が必要ですが，クレジットカード情報の入力は必要ありません．

# つかう
Microsoft Azure for DreamSparkは，新しいサービスであるWeb Appなどしか利用できないため，プレビューポータルしか表示することができません．
クレジットカード情報を登録していない状態で，管理ポータルを表示しようとすると，サブスクリプションが見つかりませんと表示され，利用することができません．
Microsoft Azure for DreamSparkへの登録が正しく完了した状態で，プレビューポータルを表示すると，Billingの欄にDreamSparkと表示されるようになります．
![ホーム_-_Microsoft_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/35580/2e72d20e-c26e-1c97-9ac4-c65a8d145c29.png)

# Web App
追加＞Web + mobile＞Web appから，新しいWeb appを作成することができます．
![Web_app_-_Microsoft_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/35580/ba84125e-32c6-8d96-5fa6-99e1c2d7339e.png)

今度Web Appを使うとなにができるのか調べてみたいと思います．
401 unauthorizedのときに適切なrouteにリダイレクトする

# 背景

とあるルートのモデルにおいて認証が必要だとして、認証が失敗したときには適切なページに遷移させたい。

# 方法

Ember.Routeのerrorアクションをカスタマイズすればいい。
なぜかreopenだとうまくいかない。

```
app/router.coffee

`import Ember from 'ember';`
`import config from './config/environment';`

Router = Ember.Router.extend({
  location: config.locationType
})

Router.map ->
  @resource 'articles', {path: '/'}, ->
    @route 'index', {path: '/'}
    @route 'show', {path: 'articles/:id'}
  @route 'unauthorized'
```

```
app/initializers/route.coffee

`export default Router;`
`import Ember from 'ember'`

initialize = () ->
  Ember.Route = Ember.Route.extend
    actions:
      error: (reason, transition) ->
        if reason.status is 401
          @transitionTo('unauthorized')

RouteInitializer =
  name: 'route'
  initialize: initialize

`export {initialize}`
`export default RouteInitializer`

```
オブジェクト指向設計　getter, setterを使うなとはどういうことか

# 趣旨
今回は、とかく誤解されたままになりがちなこのテーマについて自分の中での整理も兼ねて書いていきます
内容は特定の言語に限定されるものではありませんが、コード例はJavaで書いています。他の言語をお使いの方は適宜読み替えながら読んでいただければ幸いです

## 入門書は間違ったことを教えている？
皆さんはどのような本でオブジェクト指向プログラミング言語を勉強しましたか？多くの方は例えば「やさしい～」や「たのしい～」のような入門書から入ったのではないでしょうか（中にはいきなり分厚い言語仕様から入る剛の者も居るようですが）
その中で必ずと言っていいほど書かれているワードがあります

> フィールドはprivateにし、その値の書き換えや読み取りにはgetterやsetterを用意しましょう。これによってカプセル化が維持されます

さて一方でコミュニティなどでは次のように言われることがあります
> getterやsetterを使うのをやめよう

一方では使おうと言っている人たちが居り、もう一方では使うべきでないとする人たちが居るのです。これは困りましたね、どちらが正しいのでしょうか？

## どちらも正しい。ただし・・・
結論から言えば、入門書が嘘を教えているわけではありません。ただ、初心者に教えるという前提がある手前、オブジェクト指向のごく浅い部分にしか触れられないため誤解を生んでいるだけです
確かにフィールドを外部から隠蔽し、getterやsetterで皮をかぶせることである程度内部の実装に幅を持たせることができます
だからと言ってオブジェクトをただのデータの入れ物としてgetterとsetterをこねくり回すコードを書いていると、あちらこちらでそのオブジェクトに対して似たような操作を行うコードが書かれがちです
これはメンテナンス性を著しく下げる行為であり、好ましいことではありません

## getter, setterを使うなの本当の意味
Q. ではどうするべきなのか
A. オブジェクトをデータの入れ物として扱うのではなく、そのデータの加工を任せる
例えばオンライン書店システムにおいて、本のIDと購入冊数から合計額を求めるプログラムについて考えましょう
ぱっと浮かびやすいのは次のようなコードかと思います

```java:手続型ライクなコード
java
Book book = dao.findBook(bookId);
int totalPrice = book.getPrice() * quantity;
```

特に違和感は感じないかもしれません。特に手続型言語などではこういった中央集権的なコードが当たり前だったこともあり、入門書などでも普通にこういったコードが書かれています
これをオブジェクト指向ライクに書き換えると次のようになります

```java:オブジェクト指向ライクなコード
Book book = dao.findBook(bookId);
int totalPrice = book.calculateTotal(quantity);
```

こうすることで何が変わるのか？
・Bookの内部情報がより隠される=>前者では少なくとも「本の単価」についてが外部に引き出されていました。しかし後者ではより本来の目的に近い「合計額」のみが引き出されています
・処理の重複が起きにくくなる=>このように情報の本来の持ち主がデータの加工を担当すると、あちらこちらで同じような加工処理が行われることがなくなります。つまり全体としてのコード量や複雑さが減り、メンテナンス性が向上します
・変更に強くなる=>1つ目や2つ目と強く関係しますが、合計額算出の具体的な処理の内容はBookの中に隠蔽されています。従って、算出方法が変わったとしてもBook#calcurateTotalが変更されるだけで済みます

「getter, setterを使うな」というのはより正しく言うならば、**「そのgetter, setter呼び出しは呼び出される側への責務の割り当てに置換できないか検討しろ」**ということになります

## 1行まとめ
今回の内容を1行ずつにまとめると
・データの加工は、そのデータの持ち主がやるのがベスト。その結果、カプセル化が進み、コードの重複を排除できる
・カプセル化の目的は、変更による影響範囲を極力狭くすること


## おまけ：関連事項
・GRASPパターン：Expert（情報エキスパート）パターン
・DRY(Don't Repeat Yourself)原則



# More better
Twitterにてその設計例はよろしくないという指摘をいただき、自分でも確かになあと思ってしまったのでもう少しマシな例を挙げておきます

## 前述の例の問題点
その前に前述の例ではどこに問題があったのかを明確にしておきます
・quantityは本質的にBookの扱うべき情報ではないため、calculateTotalをBookの責務だと言うのは苦しい
やはりこの点が気になったのではないかと思います

## 私の責務配分ルール
このように処理に必要なデータの持ち主が複数に分かれる場合、私は以下のルールで責務の配分を行います
・加工対象のデータの持ち主同士で一方が他方を集約する場合、集約する側がデータの加工を担当する
・集約（包含）関係が無い場合、第3者的なオブジェクトがデータの加工を担当する

## 改案
まず1つのショッピングカートには複数の購入情報（本と購入個数を表す情報）が含まれています

手続型的な中央集権型の設計だとこうなるかと思います
![クラス図0.jpg](https://qiita-image-store.s3.amazonaws.com/0/72322/33e544b8-fa22-ae5b-47e7-12f4b018d12f.jpeg)

```java:ShoppingCart#calculateTotal
int total = 0;
for(Buy buy:buys) {
　total += buy.getBook().getPrice() * buy.getQuantity();
}
return total;
```

次にオブジェクト指向的な分散型の設計だとこうなります
![クラス図1.jpg](https://qiita-image-store.s3.amazonaws.com/0/72322/c1f3d670-7152-9362-2840-72dfdcd55600.jpeg)

```java:ShoppingCart#calculateTotal
int total = 0;
for(Buy buy:buys) {
　total += buy.calculateTotal();
}
return result;
```

```java:Buy#calculateTotal
return book.getPrice() * quantity;
```

前者がBuy及びBookをただのデータの入れ物として扱っているのに対して、後者はBuyにBuyの持っているデータの加工を任せています
後者の方が全体的にすっきりして見やすいコードになったのではないでしょうか

まだこの例でも完璧には程遠いでしょうが幾分マシになったのではないかと思います
どういう形であれ指摘や意見はありがたいのでまた何かあればよろしくお願いします
Chefにおける NodeとClientの考え方について


自分の中で、まったくNodeとClientの関係について整理できてなかったので、ここで整理したい。


## 1. [前提]Chefにおける、各ファイルの考え方

大きく分けて、下記の３つだと考えている

1. リソース(各アプリケーションの設定などをまとめたもの)
   - `cookbooks`
     - apacheインストール用Cookbook
     - gitインストール用Cookbook

2. テンプレート(サーバのあるべき姿を定義する上での共通部分の定義)
   - `enviroment`
      - development,testなど環境によって適用すべきリソースや、設定を定義
   - `role`
      - WEBサーバ、DBサーバなど役割によって適用すべきリソースや、設定を定義

3. サーバのあるべき姿を定義したもの
   - `node`
      - 物理サーバと１対１の関係
      - roleなどのtemplateを適用し、このサーバがどのテンプレートに当てはまるかなどを定義
      - Chefによる、プロビジョニングはこのNodeファイルの定義にしたがって行われる


Chef-solo,Knife-solo環境では、上記３つを理解しているだけで特に問題なくChefを使用することができるはず。
しかし、`Chef-Server`では、そうはいかない。

新たに`ClinetとPermission`という考え方が出てくる

上記を踏まえた上で、NodeとClientについて見ていく。

## 2. [本題]NodeとClientについて

Chef-solo環境では、`Cookbook` , `Role` , `Enviroment` , `Node`ファイルはChef Repositoryが置いてあるサーバにログインできるユーザが編集を行うことができました。

しかし、Chefサーバ環境では、サーバに直接ログインしてこれらのファイルを編集することを想定していません。

workstation(今回は説明は省きます)と呼ばれるところで、RoleやNodeファイルを編集し、ChefサーバにRestAPIのPOSTメソッドを叩くことによってファイルを更新します。

**しかし、ChefサーバにアップされているNode情報を誰もが見れたり、誰でも更新できたりする状態は好ましくありません。**

ここで初めて`Client`という考え方でてきます。`Client`は、Chefサーバにアクセスすることができる[人,サーバ]を管理する仕組みです。認証の方式には、公開鍵暗号方式が使用されます。

**しかし、Clientであればすべての操作が許される訳ではありません。(Nodeを消したり、編集したり)**

Chefサーバでは、管理するファイル(Cookbooks,Enviroment,Node,Role)に、Permission情報を新たに、付与します。
例えば、下記のようなイメージ

Node A 、Client A,B,Cが存在したとき
Client[A]はNodeの読み込み、編集、削除ができますが、Client[B]は読み込みしかできません。

ちなみに、workstationから

```
$knife node create hogehoge
```

とすると、デフォルトでは、下記のPermissionでNode情報が作成されます

| Name | Read | Update | Delete| Grant |
|:----:|:---:|:----:|:-----:|:--------:|
|admins       |     ○   |    ○     |○   | ○ |
| clients     |     ○    |    ×    | ×  | × |
|users        |      ○   |    ○    |○   | × |
|<作成ユーザ>   |      ○   |    ○    |○   | ○ |

この状態では、nodeのアップデートは admin,usersグループのuserとNodeを作成したユーザしか行うことができません。

**もし、Nodeを使い回したいと思っている人がいたら、このPermissionの扱い方に注意しましょう**
clientsグループにUpdate権限を付与しないと、エラーでこけます。



## 3. まとめ

- Client

   - Chef-Serverを使う環境初めて必要になる考え方
   - Rest-APIを叩くためのClient
   - Chefサーバ上の各Object(Node,Enviroment)の操作のPerrmissionが設定される
   - Clientの認証は、公開鍵暗号方式で行われる(client.pem)

- Node

   - サーバのあるべき姿を定義したファイル
   - Chefサーバ環境では、Nodeの現在の状態も管理できることになる(Client自身がNodeファイルを更新することで）
【AndroidStudio】Ctrl + Alt + ← を使う

AndroidStudioを使い始めたのですが、定義などにジャンプしたあとに**戻る**ショートカットキー　**Ctrl + Alt + 左**　が効かず困っていました。
具体的にいうと、PCの画面が回転してしまっていました。
ホットキーという機能が有効になっているとこうなってしまうようです。

ホットキーの無効化は
1．ウィンドウの何もないとこで右クリック
2．グラフィックオプション
3．ホットキー
4．無効化

これで無事にAndroidStudioで戻るショートカットキーが使えるようになりました。
作業効率かなり上がった気がします！
Rubyを全く触ったことない人がMilkodeを導入するまで

#Rubyのインストール
Rubyのサイト（http://rubyinstaller.org/downloads/）
からrubyinstaller-2.0.0-p643-x64をダウンロード(Windows 7 64bitの場合)。
#milkodeのインストール

##DevKitの初期化、インストール
    ruby 2.0.0p643 (2015-02-25) [x64-mingw32]
    C:\Users\hogehoge>gem install milkode
と入力する。なにやら失敗した。

    ERROR:  Error installing milkode:
    The 'eventmachine' native gem requires installed build tools.
    Please update your PATH to include build tools or download the DevKit
    from 'http://rubyinstaller.org/downloads' and follow the instructions
    at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'
なにやらDevKitなるものを入れないといけないようだ。
さきほどのRubyのサイト（上記）から
DevKit-mingw64-64-4.7.2-20130224-1432-sfx
をダウンロードする。
DevKitを”C:\DevKit”とかのフォルダを指定して展開。

初期化後、インストール。

    C:\DevKit>ruby dk.rb init
    [INFO] found RubyInstaller v2.0.0 at C:/Ruby200-x64

    Initialization complete! Please review and modify the auto-generated
    'config.yml' file to ensure it contains the root directories to all
    of the installed Rubies you want enhanced by the DevKit.

    C:\DevKit>ruby dk.rb review
    Based upon the settings in the 'config.yml' file generated
    from running 'ruby dk.rb init' and any of your customizations,
    DevKit functionality will be injected into the following Rubies
    when you run 'ruby dk.rb install'.

    C:/Ruby200-x64

    C:\DevKit>ruby dk.rb install
    [INFO] Updating convenience notice gem override for 'C:/Ruby200-x64'
    [INFO] Installing 'C:/Ruby200-x64/lib/ruby/site_ruby/devkit.rb'

##jsonとrroongaのインストール
milkode公式サイトを見ると
jsonとrroongaなるものを入れないといけないらしいので、

    C:\DevKit>gem install json
    C:\DevKit>gem install rroonga

いけたみたいなので再度milkodeをインストール

    C:\DevKit>gem install milkode
を実行。通った。

どうやら、milkodeの公式サイトの
RubyInstaller + DevKit
てやつにあたるようだ。

milkの初期化をする。

    C:\DevKit>milk init

##プロジェクトの追加
プロジェクトの追加をする。

    C:\DevKit>milk add Project

お疲れ様でした。成功です。
あとは

    C:\DevKit>milk web

なんかすれば
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/70418/07eed072-bd7a-6528-d563-225354c901c5.png)
終わりです。

.SVNとかバイナリファイルやテキストファイルを検索から除外したい場合は

    milk ignore *.exe
    milk ignore .svn

とか記述すれば検索が早くなる（Gitの.gitignoreに対応しているらしい）

あと社内にWebサーバーを立ち上げ、そこにアクセスしたい場合なんかは、

    milk web -o 0.0.0.0
と記述し、ファイアウォールを無効化なりすれば、アクセスできます。

なかなかハマッった。。。
atom-shell-v0.22.1からnode-ffi-v1.3.0でネイティブモジュール(C言語)を叩く

node-ffiが先日v1.3.0になり、nodejsのv0.11, v0.12に対応し、nanパッケージも使用するようになりました。

詳しい内容は、node-ffiのリポジトリのHistory.mdを読むといいです。

[node-ffi/History.md at master · node-ffi/node-ffi](https://github.com/node-ffi/node-ffi/blob/master/History.md "node-ffi/History.md at master · node-ffi/node-ffi")

早速atom-shellで試してみます。

# 環境

Ubuntu 14.10

環境による差異は、主にネイティブモジュールのビルドだと思うので、node-ffiのexampleを参考にOSにあったビルド方法を選択することにより、多分他のOSでも試せます。

[node-ffi/example/factorial at master · node-ffi/node-ffi](https://github.com/node-ffi/node-ffi/tree/master/example/factorial "node-ffi/example/factorial at master · node-ffi/node-ffi")

# インストール

現行のatom-shellで使用しているnodejsのバージョンは、iojs-v1.5.1です。

nvmなり、nodebrewで環境を作ります。

```bash
$ nvm install iojs-v1.5.1
```

atom-shellとnode-ffiを入れます。

```bash
$ npm init
$ npm install atom-shell ffi -save
```

# サンプルコード

ディレクトリ構成

```
├── index.html
├── index.js
├── native
│   ├── libSay.c
│   ├── libSay.h
│   └── libSay.so
├── node_modules/
└── package.json
```

atom-shellのエントリポイント

```js:index.js
var app = require('app');
var BrowserWindow = require('browser-window');

require('crash-reporter').start();

var mainWindow = null;

app.on('ready', function() {
  mainWindow = new BrowserWindow({width: 800, height: 600});

  mainWindow.loadUrl('file://' + __dirname + '/index.html');

  mainWindow.on('closed', function() {
    mainWindow = null;
  }); 
});
```

UI(html)

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello atom-shell with ffi!</title>
  </head>
  <body>
    <h1>Hello atom-shell with ffi!</h1>
    We are using io.js <script>document.write(process.version)</script><br />
    and atom-shell <script>document.write(process.versions['atom-shell'])</script>.
    <script>
    var ffi = require('ffi');
    
    document.write('<h2>Example: Readme</h2>');

    var libm = ffi.Library('libm', {
      'ceil': [ 'double', [ 'double' ] ]
    });
    document.write('<div>"libm" sample: ' + libm.ceil(1.5) + '</div>'); // 2
    
    // You can also access just functions in the current process by passing a null
    var current = ffi.Library(null, {
      'atoi': [ 'int', [ 'string' ] ]
    });
    document.write('<div>"atoi" sample: ' + current.atoi('1234') + '</div>'); // 1234

    document.write('<h2>Example native module(C language)</h2>');

    var say = ffi.Library('./native/libSay.so', {
      'hello': [ 'string', [ ] ],
      'echo': [ 'string', [ 'string' ] ]
    });
    document.write('<div>' + say.hello() + '</div>'); // Hello!
    document.write('<div>' + say.echo('World!') + '</div>'); // World!
    </script>
  </body>
</html>
```

ネイティブモジュール(C言語)

```c:libSay.h
#ifndef __LIB_SAY_H
#define __LIB_SAY_H

char* echo(char* word);

char* hello();

#endif
```

```c:libSay.c
#include "libSay.h"

char* echo(char* word) {
    return word;
}

char* hello() {
    return (char*)"Hello!";
}
```

ネイティブモジュールのビルドです。

```bash
$ gcc -shared -fpic libSay.c -o libSay.co
```

# 結果

![Screenshot from 2015-03-26 22:17:55.png](https://qiita-image-store.s3.amazonaws.com/0/24784/3e7385c5-4c9a-b437-99a9-ee544dac656d.png)

無事動きました。
ipmitool のリモート操作に必要な設定

# 概要

OpenIPMI 等をインストールするだけでは、サーバローカルでコマンドを実行できても、リモートで Power Off/On の操作は出来ません。
ユーザーが作られていないことを前提として、ユーザ作成から実行までのメモです。

## ユーザ作成

```
$ ipmitool user set name ${UID} ${UserName}
```

## パスワード設定

```
$ ipmitool user set password ${UID}
```

## ユーザの権限確認

Privilege Level が ADMINISTRATOR になっていないとリモートで Power Off/On は出来ません。

なお、USER でも参照(sdr, power status 等)は可能です。
その場合は -L オプションで USER を指定しましょう。
このオプションのデフォルトは ADMINISTRATOR になっています。
詳細は man 参照。

```
$ ipmitool channel getaccess ${ChannelNumber} ${UID}
(snip)
Link Authentication  : enabled
IPMI Messaging       : enabled
Privilege Level      : USER
```

## ユーザ権限付与

privilege=4 は ADMINISTRATOR です。
setaccess 後、最後 getaccess にて Privilege Level が ADMINISTRATOR になっていることを確認しましょう。

その他の権限に関しては man 参照。

```
$ ipmitool channel setaccess ${ChannelID} ${UID} privilege=4
```

## IPMI 経由で電源 OFF/ON

ここまで設定すれば、問題なくリモートから電源の OFF/ON が出来るはずです。

```
$ ipmitool -I lanplus -H ${IPMI_IPAddress} -U ${UserName} -P ${Password} power off
```

```
$ ipmitool -I lanplus -H ${IPMI_IPAddress} -U ${UserName} -P ${Password} power on
```
Net::SCPでのハマりどころと解決方法

#ハマりどころ1
ワイルドカード使えない。

```rb
require 'net/scp'
opt = {compression: true, password: scp_pass}
Net::SCP.upload!(scp_host, scp_user, '*.gz', scp_dir, opt) #can't use wildcard
```
これなら動く。

```rb
require 'file'
require 'net/scp'
files = Find.find(dir).select {|path| path if path =~ /^.*.gz$/}
opt = {compression: true, password: scp_pass}
Net::SCP.start(scp_host, scp_user, opt) do |scp|
  files.each { |file| scp.upload!(file, "#{scp_file}/") }
end 
```

#ハマりどころ2
上でも動作するが、asyncにしたい。そういった時は次のコードを書くことになる。

```rb
require 'file'
require 'net/scp'
files = Find.find(dir).select {|path| path if path =~ /^.*.gz$/}
opt = {compression: true, password: scp_pass}
Net::SCP.start(scp_host, scp_user, opt) do |scp|
  channels = files.map { |file| scp.upload(file, "#{scp_file}/")}
  channels.each { |c| c.wait}
end 
```

しかし、対象ファイルが大量だったりすると次のような謎のエラーが発生する。

```
rake aborted!
open failed (1)
/home/hoge/apps/vendor/bundle/ruby/2.1.0/gems/net-ssh-2.9.2/lib/net/ssh/connection/channel.rb:525:in `do_open_failed'
/home/hoge/apps/vendor/bundle/ruby/2.1.0/gems/net-ssh-2.9.2/lib/net/ssh/connection/session.rb:552:in `channel_open_failure'
/home/hoge/apps//vendor/bundle/ruby/2.1.0/gems/net-ssh-2.9.2/lib/net/ssh/connection/session.rb:466:in `dispatch_incoming_packets'
...
```
(たぶん)原因はc.waitの前に転送が終わってしまっているから、closeできないチャンネルが発生するため。
そこで次のように変更する。

```rb
require 'file'
require 'net/scp'
files = Find.find(dir).select {|path| path if path =~ /^.*.gz$/}
opt = {compression: true, password: scp_pass}
Net::SCP.start(scp_host, scp_user, opt) do |scp|
  files.each { |file| scp.upload(file, "#{scp_file}/").wait }
end 
```

意外にハマるので注意が必要である。
PHPからMySQLに接続してレコードを挿入する２

## 前提
[PHPからMySQLに接続する](http://qiita.com/tiida26/items/a8af26b5f34d64423b8b) にて接続を行っている


## コード(処理部分のみ)

テーブル: hogetable に以下のようなレコードを挿入する。

|id|name|pass|
|:---:|:---:|:---:|
|2|taro|foo|

```php
$stmt = $dbh->prepare("insert into hogetable (id,name,pass) values (:id,:name,:pass)");

$stmt->bindParam(":id", $id);
$stmt->bindParam(":name", $name);
$stmt->bindParam(":pass", $pass);

$id = "2";
$name = "taro";
$pass = "foo";

$stmt->execute();    // ここで変数に入れた値をもちいてinsertする。

echo $dbh->lastInsertId();    // 最後に挿入したレコードのidまたはシーケンス番号を表示させる。
```


## その他

`bindParam`でプレースホルダーに変数をもたせる。
Linuxサーバで負荷試験するにあたって

LinuxでTCPのサーバを置いて多量のTCP接続を行うと、初期設定のままではうまくいきませんでした。
多量のTCP接続を受け付けるには設定手順があると知ったので紹介します。

## 「Too many open files」と出て接続できない
1プロセスで開けるソケット数上限に達したようです。
上限を上げましょう(デフォルト1024)。
接続元と接続先でそれぞれ以下のコマンドを使います。
> ulimit -n 102400

## 「Connection refused」と出て接続できない
まず接続先でdmesgコマンドを実行しましょう。

> TCP: Possible SYN flooding on port 8888. Sending cookies.

と表示されたらSYN flooding攻撃かもとOSが判断して新規接続をブロックしています。
無効化しましょう( http://ja.wikipedia.org/wiki/SYN_flood )。
接続先で以下のコマンドを使います。
> sysctl -w net.ipv4.tcp_syncookies=0
EC2 上の CentOS 6.6 で Nginx + HHVM を使う

# はじめに
Facebook が開発した PHP の超高速実行環境 HHVM (HipHop Virtual Machine) 
どんなものか確かめてみるべく Nginx + HHVM を使ってみました

yum でサクッと入れるだけだと思っていたら、2016/1 時点で配布されているビルド済みパッケージは Ubuntu、Debian、Mint しかサポートされていないんです

[HHVMの公式サポート対象](https://docs.hhvm.com/hhvm/installation/introduction#prebuilt-packages)

CentOS 上にインストールしたかったのですがなかなか情報が見つからず
ソースからビルドするのはハードルも高いしメンテナンスを考えると躊躇してしまうので、非公式らしいですか yum でインストールする方法を調べました

環境をつくるまでの道のりが意外と長かったので、
CentOS 6.6 上に Nginx + HHVM で PHP を動かす環境を作るときのメモです
※仮想マシンは EC2 を利用しています

ググると Hop5 のリポジトリからインストールしている記事が多いですが、HHVM のバージョンが古いのと HACK が動かないらしいです
あと起動スクリプトも中途半端な状態なので微妙でした

今回の方法では gleeze リポジトリを利用するので、最新のHHVM3.5を入れることがきでます

# Nginx インストール
nginx のインストールは超簡単です
CentOS の公式リポジトリにある nginx はめっちゃ古いバージョンなので、nginx の公式リポジトリから最新版をインストールします

```bash
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

$ sudo yum install nginx
```

# HHVM インストール

Github で公開されている CentOS へのインストール手順では、ソースからビルドするか コミュニティの方が用意した非公式リポジトリからインストールするよう書かれています
[公式のインストール手順](https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-on-Centos-6.x)

ですが、この通りにやっても依存関係のエラーが出てインストールできません・・・


なので、以下のようにして epel、remi、gleeze のリポジトリからそれぞれ必要なパッケージをインストールします
HHVM は gleeze リポジトリで配布されているんですがこれが出処不明のサーバーです
--nogpgcheck をつけないといけないところがヤバイ

```bash
# epel リポジトリの追加とパッケージのインストール
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel libevent-devel libcurl-devel libmemcached-devel

# remi リポジトリの追加とパッケージのインストール
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum --enablerepo=remi install libwebp mysql mysql-devel mysql-lib

# gleez リポジトリの追加と HHVM のインストール
$ sudo rpm -Uvh http://yum.gleez.com/6/x86_64/gleez-repo-6-0.el6.noarch.rpm
$ sudo yum install --nogpgcheck hhvm
```

インストールが完了したら設定を修正してそれぞれのサーバーを起動します

# Nginx セットアップ
php にアクセスがあった時に FastCGI で HHVM と通信する設定を入れます

```nginx:/etc/nginx/conf.d/default.conf
location ~ \.php$ {
    root          /usr/share/nginx/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}
```
```bash
$ /etc/init.d/nginx start
```


# HHVM セットアップ
ドキュメントルートと実行ユーザーを設定します

```ini:/etc/hhvm/server.ini
; ドキュメントルート
hhvm.server.source_root = /usr/share/nginx/html/
; 実行ユーザー
hhvm.server.user = nginx
; error.log の各行に日時を出力する
hhvm.log.header = true
```
```bash
$ /etc/init.d/hhvm start
```


# まとめ
php-fpm + OPcache と比較した時に軽い処理だと php-fpm の方が速い場合もありました
HHVM は1プロセスでマルチスレッドで動作してますが、php-fpm はマルチプロセスなので、CPU 使用率は HHVM の方が低かったです

DB アクセスして JSON を返すだけの API だとむしろ php-fpm のがちょっと速いくらいでほとんど差はみられませんでした

jmeter で負荷を掛けて確認したところ、どちらを利用した場合でも負荷が1つのコアに偏っていて、マルチコアのサーバーでも CPU が遊んでる状態になっていました
HHVM、php-fpm に原因がありそうですがそこはわかってないです
gopenflow demo環境構築メモ

Raspbian
========
Installation
------------
raspbian を SD カードに書く。

いつも通り最新版にしておく。

```
apt-get update -y
apt-get dist-upgrade -y
```

手持ちのUSB接続日本語キーボード対応。コンソールの時に `loadkeys jp106` で日本語になる（X window 使ってるときは別の方法）。

```
apt-get install console-data
```

手元にある NEC Aterm WL300NU-AG という usb wifi dongle 対応。中身は atheros で、carl9170 ドライバで動作させる。ファイルが足りないので要追加インストール。インストール後は udev から再起動しないといけないので、いっそのことシステム全体再起動しておくと漏れが無くて簡単。

```
apt-get install iw wireless-tools linux-firmware-free
```

raspbian が古いので、golang は自前でインストールする。

```
apt-get install mercurial
hg clone https://code.google.com/p/go
cd go/src && ./all.bash
```

raspbian が古いので、openvswitch も自前でインストールする（openflow 1.3対応のため）。

```
wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz
tar xf openvswitch-2.3.1.tar.gz && cd openvswitch-2.3.1 && ./configure && make install
```

Arch
====
本家サイトの[記述](https://wiki.archlinux.org/index.php/Raspberry_Pi)を適宜参照する。

```
pacman -Suy
pacman -S iw wireless_tools crda
pacman -S lxde xorg-xinit xf86-video-fbdev
pacman -S git gcc make pkg-config patch openvswitch go
echo "exec startlxde" > .xinitrc
```

archのほうがraspi2のCPUに最適化されてて高速かな？古いものがないので、いろいろすっ飛ばせる。

lxde の無線マネージャを切りたい場合は、タスクバーで右クリック！してメニューを出す。シングルボタンマウス使用時は無理。

共通
----
gopenflow をビルドしておく。

```
go get github.com/hkwi/gopenflow
# ここで gopacket にパッチを当てる
cd $GOPATH/src/code.google.com/p/gopacket && curl https://gist.githubusercontent.com/hkwi/99b6cbdb5579bed4aa09/raw/2547d09ba5ceb6ab57995205f51e3f72d6e54424/gopacket.patch | patch -p1
go install github.com/hkwi/gopenflow/ofp4sw/trema_sw
go install github.com/hkwi/gopenflow/ofp4sw/ofctl
go install github.com/hkwi/gopenflow/ofp4sw/ofmon
```
運用
====
キーボード周り
------------
その場で変更するのは次のコマンド。

* コンソール
 * `sudo loadkeys jp106`
* X window
 * `setxkbmap -layout jp`

Demo
====
window を使って、いろいろな出力を同時進行で見せておく。

```
startx
```

```
git clone https://github.com/hkwi/twink
cd twink && python -m twink.ovs
golib/bin/trema_sw -i 15 -e wlan0
```

launch packet in dumper in another window

```
golib/bin/ofmon unix:path/to/socket.monitor
```

demo follows...

```
ovs-ofctl -O OpenFlow13 dump-ports-desc unix:///path/to/socket.jackin
iw dev wlan0 interface add mon0 type monitor
ovs-ofctl -O OpenFlow13 dump-ports-desc unix:///path/to/socket.jackin
golib/bin/ofctl unix:path/to/socket.jackin dump-flows
golib/bin/ofctl unix:path/to/socket.jackin add-flow dot11_tag=0,@apply,output=controller
golib/bin/ofctl unix:path/to/socket.jackin dump-flows
golib/bin/ofctl unix:path/to/socket.jackin del-flows
golib/bin/ofctl unix:path/to/socket.jackin dump-flows
golib/bin/ofctl unix:path/to/socket.jackin add-flow addr1=ff:ff:ff:ff:ff:ff,@apply,output=controller
golib/bin/ofctl unix:path/to/socket.jackin del-flows
golib/bin/ofctl unix:path/to/socket.jackin add-flow addr2=--:--:--:--:--:--,@apply,output=controller # 対象機器のMACに読み替える
```

```
echo "ctrl_interface=/tmp/w" > s.conf
wpa_supplicant -Dnl80211 -iwlan0 -cs.conf &
wpa_cli -p /tmp/w
 scan
 scan_result
 add_network
 set_network 0 ssid "xxxx"
 set_network 0 key_mgmt NONE
 enable_network 0
 select_network 0
```
Androidで実環境に頑健な連続音声認識をさせたい


androidで音声認識をさせる場合、RecognizerIntentやSpeechRecognizerを利用するパターンが多いと思われます。
しかしRecognizerIntentはマイクの絵が表示されているダイアログがポップアップして鬱陶しいですし、それが嫌な場合はSpeechRecognizerを使うでしょう。
SpeechRecognizerクラスは、Androidの音声認識用に用意されているServiceにアクセスするためのクラスで、これはアプリケーションのメインスレッドで呼びたしたり、そもそもオフラインで動かなかったりするので、利用シーンが限られてしまいます。
じゃあどうするのか、すごいものがあります。
### [Julius](http://julius.sourceforge.jp/)
大語彙連続音声認識エンジンです。日本語の言語モデルもあるので、日本語が使えます。日本語の大語彙連続音声認識ができるものは他にないのではないでしょうか。音響モデルももちろん付いているのですが、JNAS（新聞記事読み上げ音声コーパス）から音響モデルを作成されたものなので、実環境には使いづらいです。しかしJuliusは高い汎用性を持たせるためにこの音響モデルや言語モデルを取り替えることができるので、自前で用意したものを使うこともできます。とはいっても、音響モデルを用意するのは大量の発話データが必要なので大変むずかしいです。
数万語彙の連続音声認識を一般のPC上でほぼ実時間で実行できます。一般のPC上で実行できるという話ですが、C言語で書かれているのでiOSでも動くし実際にサンプルアプリがあります。Linuxでも動くので、ということはつまりAndroidでも頑張ったら動くらしいです。実際頑張って動かした例もあるようです。
英語のモデルはないので、英語に対応したい場合は用意しなければなりません。また、実環境（ハンズフリー音声認識でかつ、拡散性雑音がとても多い場合）に用いるには、高精度な雑音抑圧を必要です。実際、実環境での音声認識精度はかなり難易度が高く、高い精度で製品に応用しているのを見たことがありません。

### [PocketSphinx](http://cmusphinx.sourceforge.net/)
英語の音響モデル言語モデルを用いた連続音声認識エンジンで、[Android用](http://cmusphinx.sourceforge.net/wiki/tutorialandroid)のサンプルアプリもあります。これはかなり優秀で実環境で利用する想定で開発されていて、音響モデル、雑音抑圧も頑健に動作しています。[自前の雑音抑圧などいらないという言及もされています。](http://stackoverflow.com/questions/25641154/noise-reduction-before-pocketsphinx-reduces-recognition-accuracy/25643241#25643241)
でもアプリを動かすと分るように連続音声認識はもちろん、keyword spottingやgrammar searchも可能です。実際雑音環境下でもかなりの精度で認識が可能でした。
これもC言語で書かれており、Androidに組み込むにはAndroidNDKが必要になってきます。
具体的な組み込み方法は気が向いたら書きます。
これをServiceでバックグラウンドで動かすと、”OK google”のようなボイスコマンドでアプリが操作できるようになるわけです。
ただ注意しないといけないのは、とあるアプリでPocketSphinxを動かしている間は他のアプリケーションでマイクが使えません（正確には同じアプリからもSpeechRecognizerやRecognizerIntentなどは使えません）。つまりこれを動かしているときは"OK google"や様々なアプリでの音声検索を犠牲にするというわけです。バックグラウンドで常に動かして"OK google"的な使う方をするとデメリットもあるので、使いどころは難しいかもしれませんが、アプリが動作中にのみ動作させることで有用に使えるかもしれません。


##　おわりに
これら２つとも音声認識処理部分は基本的にはにたようなことをやっていますが、音声（残響が畳み込まれた）と雑音が混じった入力信号から雑音抑圧するフェーズはJuliusではやっていません。故に環境雑音や、ハンズフリーによる残響特性が畳み込まれた音声を入力すると精度が低くなるのです。Juliusは汎用性は高そうですが、実環境に実用化するとなると大変な雑音抑圧処理や、音響モデルの作成が必要になります（逆に汎用性低い？）。
　 |l､{　 　j}　/,,ｨ//｜　　　　　／￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
　 i|:!ヾ､_ﾉ／ u {:}//ﾍ　　　　　|　あ…ありのまま 今　起こった事を話すぜ！
　 |ﾘ u' }　 ,ﾉ　_,!V,ﾊ |　　 　 ＜　『おれは奴の前で階段を登っていたと
　 fト､_{ﾙ{,ィ'ｅﾗ　, ﾀ人.　　　　|　　思ったらいつのまにか降りていた』
　ヾ|宀| {´,)⌒`/ |<ヽﾄiゝ　　　|　催眠術だとか超スピードだとか
　　ヽ iLﾚ 　u' |　| ヾｌﾄﾊ〉. 　　|　そんなチャチなもんじゃあ　断じてねえ
　　 ﾊ !ニ⊇　'／:} 　V:::::ヽ.　│　もっと恐ろしいものの片鱗を味わったぜ…
　 /:::丶'T'' ／u'　__ /:::::::/｀ヽ ＼＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
【Apache】Apacheまわりに強くなりたい！※あとでやるリスト


##STEP1 基本

参考本）※これいいかも
> http://goo.gl/PdCerm

あとApacheに関しては本家のディレクティブの設定をあたるのがGood、
下記のURLとかが良い。

>http://httpd.apache.org/docs/2.2/ja/mod/directives.html

<Directory>ディレクティブ
・DocumentRootディレクティブ
・ErrorLogディレクティブ
・IndexOptionsディレクティブ
・KeepAliveディレクティブ
・Listenディレクティブ
・LogLevelディレクティブ
・NameVirtualHostディレクティブ
・<Proxy>ディレクティブ
・ServerName
・ServerAlias
・ServerRoot
・ServerSignature
・VirtualHost

このあたりの設定のやり方とかを順番に覚えていったり、調べて自分のサーバで検証してやり方を覚えていったりするのが良いらしい。

##STEP2 自分でやってみる

あと、自分で立てたサーバにApacheを入れると、
/etc/httpd/conf/httpd.conf
にApacheの設定ファイルがあるから、
このファイルを全部読み切るみたいなことをしながらわからないことをググって理解していく。

※　社会人１年めの時に、httpd.confは全部一回読んでみるとGoodらしい

##まとめ（流れ）
1. httpd.conf の中身を必要そうなところかいつまみながら読んでみて、
設定をいじってみる。

基礎的な感覚を身につけてから、
2. それぞれ他の設定のやり方とか意義を身につけるのに本読む
3. 本読みながらそれぞれの項目を深堀りするためにオフィシャルも交えていく