OmniAICreator/Qiita-1.07M huggingface dataset:
自然対数


調べ物していて、自然対数やらネイピア数やら出てきて「？」となるので、ちょこちょこメモしておく。

## メモ

`exp`は指数関数の意。
JavaScriptでは`Math.exp(x)`と書き、自然対数の底$e$を引数だけ累乗した結果を返す。

逆に`Math.log`関数を用いることで、ネイピア数を何乗したら引数の値となるかを得られる。
つまり`Math.log(Math.E) === 1`となる。

ちなみに **ネイピア数** である`2.71828...`という数字は$(1 + 1 / n)^n$という計算式で求められるよう。
（$n$の値を大きくしていっても、上記の値に収束する）


## 意味

Wikipediaから引用すると、

### 対数

>対数 (たいすう、英: logarithm) とは、任意の数 x を a を底とする指数関数により x = $a^p$ と表したときの冪指数 p の事である。 $p = log_a(x)$ と書いて pはa を底とする x の対数という。対数関数 $log_a(x)$ は、指数関数 $a^x$ の逆関数として定義される。


### 自然対数

>自然対数（しぜんたいすう、natural logarithm）は、ネイピア数を底とする対数 (logarithm) である。
歴史的には、オランダのニコラス・メルカトルによって、1668年に、1/xの積分として見出された。


### ネイピア数

>ネイピア数（ネイピアすう、Napier's constant）は数学定数の一つであり、自然対数の底として用いられる。記号は、レオンハルト・オイラーによって導入された e を用いられるのが普通であり、その値は
e = 2.71828 18284 59045 23536 02874 71352 …
と続く超越数である。ネピアの定数、ネピア数、オイラー数と呼ばれることもあるが、オイラーの定数 γ やオイラー数列とは別である。

以下は[教えてgooのアンサー](http://oshiete.goo.ne.jp/qa/5568254.html)から引用。

>$a^x$といった指数関数のaが自然対数の底（ネイピア数(Napier's Constant),eで表される）の特別な場合。e^x≡exp(x)は微分しても積分しても同じ関数のままの特異な性質を持った関数で、微分積分学の発達に大きく貢献した。e（≒2.71828 18284 59045 23536 02874 71352 66249）自体は、π（円周率）などと同じく、数学上の重要な定数の１つとなっている。

つまり、微分・積分しても形が変わらない特殊な数値に「ネイピア数」という名前を付けて特別扱いした、ということかな・・？


## log（logarithm、対数）

[wikipedia](https://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0)より引用

>対数 (たいすう、英: logarithm) とは、任意の数 x を a を底とする指数関数により $x = a^p$ と表したときの冪指数 p の事である。 $p = log_a(x)$ と書いて pはa を底とする x の対数という。対数関数 $log_a(x)$ は、指数関数 $a^x$ の逆関数として定義される。

JavaScriptでは `Math.log10()`、`Math.log2()` が定義されており、それぞれ `10` を底とする対数、`2` を底とする対数を求める関数。

### 例

```js
var l = Math.log2(256); // => 8。256は2の8乗。
```

ちなみに、以下のようにすると任意の冪乗を求めることができます。

```js
Math.log10(121) / Math.log10(11); // => 2。11の2乗。
```
PHPの終了タグと行コメント

PHPの行コメントは終了タグをコメントアウトしない。

```php
<?php //echo 'hoge'; ?>
fuga
```

上記コードはfugaを出力する。(syntax errorにならない)

普段は別に困らないし、`<?php# コメント ?>`みたいな短い書き方でコメントをテンプレートに埋め込めて便利なのだが、これが原因で思わぬ挙動を起こす事がある。

```php
<?php
echo '<?php', PHP_EOL;
echo '?>', PHP_EOL;
```

このコードは3行目を`//`でコメントアウトすると、コメントアウトしきれず、終了タグ以降の文字列が出力されてしまう。

```php
<?php
echo '<?php', PHP_EOL;
//echo '?>', PHP_EOL;
```

実行すると、以下が出力される。

```
', PHP_EOL;
```

この不具合にハマると原因が分かりにくいので、できれば予防的な書き方をしておきたい。

予防方法としては、`?>`などの終了タグの文字列がプログラム中に登場しないようにしておく方が無難。わざと文字列を分割して書くとかかな。

```php
<?php
echo '<?php', PHP_EOL;
echo '?'.'>', PHP_EOL;
```

JavaScript中の`</script>`が文脈に関係なく問題になるのと同じですね。
rails_adminを更新したら認証を行わなくなってた

[RailsAdminを導入してみた](http://qiita.com/ikm/items/f1f3957bb8b521114cd4)の続き。

rails_adminを0.5から0.6.2に更新したら、認証の画面を介さずにいきなりログインできた。

コミットログを漁ってみたところ、[0.6.1からデフォルトで認証を行わない](https://github.com/sferik/rails_admin/commit/c31f62fb867e6a962cdb0ab294a9b1d54cbd49eb)ようになってたらしい。

[wiki](https://github.com/sferik/rails_admin/wiki/Devise)を参考に、これまでと同じようにDeviseで認証を行うよう設定した: 

```rb
RailsAdmin.config do |config|
  config.authenticate_with do
    warden.authenticate! scope: :user
  end
  config.current_user_method &:current_user
end
```

なおこの`scope`というのは、routes.rbに書いている`devise_for :hogehoge`の`:hogehoge`の部分のことらしい。
作業時によく使用するgitコマンド

## 状態遷移

![スクリーンショット 2014-06-16 12.39.37.png](https://qiita-image-store.s3.amazonaws.com/0/14914/55877b92-1cff-a8a1-5fe6-92a673d08410.png "スクリーンショット 2014-06-16 12.39.37.png")

## 良く使うコマンド

### git status

現在の状態を確認する。

```
~/test/git_test3 (aaa ✘)✹✚✭ ᐅ git status
# On branch aaa
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   README.md
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   a.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b.txt
```

よく見ると次に何をすべきか教えてくれてる。

### git add 

Stagedに進める（コミット対象にする）

```console
git add FILES
```

まとめてaddしたい場合はいかが便利

* 全ての変更点をadd

```console
git add -A
```

* 変更もしくは追加をadd（削除ファイルは対象外）

```console
git add .
```

* 変更のみadd（新規ファイルは対象外）

```console
git add -u
```

* ファイル内の一部のみaddする

```console
git add -p
```

### git checkout (ここではindexから戻す部分のみ説明）

指定されたファイルをStaged（index）の状態に戻す。
* Working Directoryの状態でcheckoutすればindexからファイルを取得してくるので変更が無い状態に戻る。

```console
git checkout FILE_NAME
```

Working Directoryの内容全てを元に戻す

```console
git checkout .
```

### git commit

変更点を確定する。リポジトリの履歴に登録される。

### git reset

HistoryのHEADの位置を変更する。

![スクリーンショット 2014-06-16 15.58.32.png](https://qiita-image-store.s3.amazonaws.com/0/14914/12aff136-3752-6bad-28c6-07980dda075a.png "スクリーンショット 2014-06-16 15.58.32.png")

HistroryのHEADとは最新のコミットのことである。

* Historyを一個前にする（例えば間違ってコミットした場合）

変更した内容をそのままにしたい場合

```
git reset --soft HEAD~
```

完全に指定したhistoryに変更する（変更点は破棄される）。

```
git reset --hard HEAD~
```

### git stash

一時的に他の作業を行いたい場合に変更点を退避させる。

退避

```
git stash save '一覧で表示されるメッセージ'

# saveは省略できるのでstashのみでもOK
git stash

# Untracked も対象にしたい場合は「-u」オプションを使う
git stash -u
```

一覧

```
git stash list
```

復元

```
# 最後にstashしたものを復元
git stash pop

# 複数stashしてる場合は引数を指定する
git stash pop stash@{1}
```

### git fetch

リモートの情報を取得します。

### git rebase

Histroyを綺麗にします。
本プロジェクトで採用しているgitフローは以下なのでfeatureブランチをローカルに適用する場合もpullではなくrebaseを使います。
http://qiita.com/astrsk_hori/items/659ce848139f1a452c6c

rebaseを使う

```
git rebase origin/master
```

pullもオプション指定ならOK

```
git pull --rebase
```

### git push

プルリクエストするためにリモートに転送する。

```
git push origin BRANCH_NAME
```

強制push

```
git push -f origin BRANCH_NAME
```

* 強制pushは作業ブランチしか実行しないこと！

### git diff

* 差分確認

HEADと比較

```
git diff

git diff hoge.txt
```

BRANCH比較

```
git diff --name-only hoge origin/master
```

### git log

マージコミットからマージしたファイル一覧を取得

```
git log -m -1 --name-status
```
unicodeな特殊文字をWindowsで編集・表示

twitterなどで使われる特殊文字を使った顔文字があります。
unicodeをあっちからこっちから組み合わせて使っているので、エディタで表示出来ないし保存も出来ません…( ◞‸◟ )
使わなければ良いのですが、テストで必要な場合もあるので困りますよね。

知ってる限りですが情報共有的な意味でスクラップしておきます。

## フォントは Arial Unicode MS

unicode文字が沢山入っているフォントです。
文字の形が気に入らないですが、コレ使います。
最近のWindowsは標準搭載です。
確かMicrosoftのどこかからダウンロード出来た気がします。

## エディタはGreenPad

GreenPad - kMonos.NET http://www.kmonos.net/lib/gp.ja.html
なんか公式からダウンロードしようとするとカスペルさんに怒られるのでベクターからダウンロードをオススメします。

GreenPadの詳細情報 : Vector ソフトを探す！ http://www.vector.co.jp/soft/win95/writing/se251463.html

## 設定

ちょっと面倒臭いです。

### 関連付けの作成

1. GreenPad 起動
2. メニュー[表示]-[設定(_S_)…]
3. 文書タイプ別設定 で[追加]
4. 文書タイプの追加ダイアログが開くので名前と拡張子を指定  
  名前(N):unicode AA  
  拡張子(E):utf
5. [OK]で追加された
6. ※ レイアウトファイルを新規に作ります

### レイアウトファイル作成

上の関連付けの続きから
1. 文書タイプの[INI]をクリック
2. レイアウト"default.lay" [編集]
3. エディタ画面が開くので名前を付けて保存  
[別名で保存(A)… Ctrl+Shift+S]
4. "unitext.lay" でひとまず保存する
5. 内容修正  
フォントを Arial Unicode MSに変更
サイズを適当に変更
あとはそのまま
```
…
ft=Arial Unicode MS
sz=14
…
```
6. [Ctrl]+[S]で"unitext.lay"に上書き保存

### レイアウトファイルを割り当て

1. GreenPad 起動
2. メニュー[表示]-[設定(_S_)…]
3. 文書タイプ別設定 で[unicode AA]クリック
4. 関連付けられているレイアウトにドロップダウンから"unitext.lay"を選択
5. [OK]
6. エディタ画面に戻る
7. 適当なunicode文字（特殊顔文字などで検索）をエディタに貼り付ける  
```
0(:3　)～=͟͟͞͞('､3)_ヽ)＿
('､3_ヽ)_
_:(´ཀ`」 ∠):_ ...
_(•̀ω•́ 」∠)_ ₎₎...
_(:D｣┌)⁼³₌₃
(:3[※※]͟͟͞͞ =:･*･｡
[▓▓]=͟͟͞͞=͟͟͞͞ εː)
ｵｯﾊﾏｰ!('ᴗ'三Σ[___]
\((°∀° ㄘㄘ °∀°))/
\((°∀° ≡ °∀°))/
٩(๑`^´๑)۶
٩( ˘ω˘ )۶
```

8. ところどころ文字化けしてますよね？
9. メニュー[表示]-[文書タイプ(_T_)]-[unicode AA]クリック
10. これで文字化けがなくなる
11. ファイルはデスクトップにutf8AA.utf とでもして保存して下さい  
次にutf8AA.utfを開くとArial Unicode MSフォントで表示されます

## 関連情報

絵文字各社の差異について調べたメモ 
ドコモの携帯絵文字PDFが見つかったのは拾い物でした 

* iphone アンドロイド 絵文字 差異 - Google 検索 https://www.google.co.jp/search?q=iphone+%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AD%E3%82%A4%E3%83%89+%E7%B5%B5%E6%96%87%E5%AD%97+%E5%B7%AE%E7%95%B0&ie=utf-8&oe=utf-8&hl=ja 
** iOS絵文字一覧 http://www.shurey.com/memo/emoji.html 
** iPhone の絵文字一覧と対応表 http://iphoneac.com/beginner6.html 
** auとSoftBankのiPhone間は絵文字が化ける - Apps Core http://www.appscore.org/2011/11/ausoftbankiphone.html 
*** auのiPhoneで絵文字が化ける問題についてのまとめ - Mac OS Xの文字コード問題に関するメモ http://d.hatena.ne.jp/NAOI/20111025/1319533202 
**** auとSoftBankのiPhoneにおける絵文字対応を比較する - Mac OS Xの文字コード問題に関するメモ http://d.hatena.ne.jp/NAOI/20120201/1328080732 
*** iOSと絵文字について - More the iPhone Development Playground http://kimada.hatenablog.com/entry/20111103/1320330523 

** NTTドコモ絵文字変換対応表pdf ドコモ対なにか 
*** 絵文字変換機能 | サービス・機能 | NTTドコモ https://www.nttdocomo.co.jp/service/communication/imode_mail/function/emoji_convert/index.html 

** 絵文字を共通化　携帯・PHS各社、iPhone除き　Unicodeに対応 : ITNEWS http://blog.livedoor.jp/itnew/archives/38477442.html 
*** キャリア6社の絵文字がついに統一 - ケータイ Watch http://k-tai.impress.co.jp/docs/news/20140424_646054.html
Asteriskのdemoの動作を確認する


zoiperの設定は済んでいるものとする。

zoiperにてダイヤルしてみましょう。

![スクリーンショット 2014-06-16 16.19.26.png](https://qiita-image-store.s3.amazonaws.com/0/25728/55cee2d4-6f51-04f5-70c1-3ae91322c7e2.png "スクリーンショット 2014-06-16 16.19.26.png")

* 2 : demo-moreinfo
* 3 : congraturation〜
* 1000 : 3と同じか
* 500 : IAX2/guest@pbx.digium.com/s@default に発信。
* 600 : 
* 8500 : 
* # : demo中に # を押すとガイダンスの終了が流れる。

これらは `extensions.lua` で設定されている。
`extensions.conf`は見づらいので使わない方がいい。

# 設定追加

今は `5` にダイヤルしてもかからない。
`5` のダイヤルに対する動作を追加してみましょう。

```diff:extensions.lua
 ["3"] = function ()
 	channel.LANGUAGE():set("fr") -- set the language to french
 	demo_congrats()
 end;
+["5"] = function ()
+	channel.LANGUAGE():set("fr") -- set the language to french
+	demo_congrats()
+end;
```

```bash:再起動。多分別の方法がある。
sudo /etc/init.d/asterisk restart
```

`5` にダイヤルして `3`でダイヤルした時の内容と同じことを確認。

# Systemコマンドで任意の処理をさせる

同様に以下設定を追加してみましょう。

```bash:extensions.lua
 ["4"] = function ()
    app.System("/usr/bin/curl http://myhome.co.jp/call4.php")
 end;
```

`4`にダイヤルすると、記述したコマンドが実行される。

* asteriskを起動しているユーザ権限で実行される。
* sshを実行させたい場合は`/home/asterisk/.ssh/`あたりの設定を済ませておく必要がある。
* sudoが必要であれば`/etc/sudoers`を修正しておく。
gulpでbrowserify使ってcoffee-scriptの監視とコンパイル

まずnpmから必要な物をいれる。gulpで browserify/coffeeify を使ってビルドする場合、coffee-script も必要になる。

```
$ mkdir proj-path; cd proj-path
$ npm init
$ npm install --save-dev gulp gulp-browserify gulp-watch gulp-plumber gulp-rename coffeeify coffee-script
```

- gulp-rename リネームタスク
- gulp-watch 監視タスク
- gilp-plumber タスクの実行に失敗してもgulpを終了させないパイプ(watchでビルド失敗時に終了させない)
- gulp-browserify browserify

gulpfile.coffee

```coffeescript
gulp       = require 'gulp'
browserify = require 'gulp-browserify'
rename     = require 'gulp-rename'
watch      = require 'gulp-watch'
plumber    = require 'gulp-plumber'

gulp.task 'coffee', ->
  gulp
    .src 'src/index.coffee', read: false
    .pipe plumber()
    .pipe browserify
      transform: ['coffeeify']
      extensions: ['.coffee']
      debug: true
    .pipe rename 'app.js'
    .pipe gulp.dest './public'

gulp.task 'watch', ->
  gulp.watch('src/**/*.coffee', ['coffee'])

gulp.task 'default', ['coffee']
```

ディレクトリ構成はこう

```
package.json
public/
  - app.js
src/
  - index.coffee
  - foo.coffe
  - bar.coffe 
```

実行

```
$ gulp # コンパイル
$ gulp watch # 監視開始
```


## 追記

gulp-browserifyはgulp公式的には規約違反でBlacklistedらしい。

[Gulp + Browserify: The Everything Post | Viget](http://viget.com/extend/gulp-browserify-starter-faq "Gulp + Browserify: The Everything Post | Viget")

こうしろとのこと


```javascript
var browserify = require('browserify');
var gulp = require('gulp');
var source = require('vinyl-source-stream');
     
gulp.task('browserify', function() {
    return browserify('./src/javascript/app.js')
        .bundle()
        //Pass desired output filename to vinyl-source-stream
        .pipe(source('bundle.js'))
        // Start piping stream to tasks!
        .pipe(gulp.dest('./build/'));
});

```
Swift+Parseで#mapをキメる

Swiftでは#mapがあります。
というわけでParseで受け取ったオブジェクトを#mapしたくなりますね。

Swiftの神キャストに期待して安直に書くと…

```swift:someParse.swift
var messages : Message[]!
let query = PFQuery(className: "Message")
query.whereKey("user", equalTo: PFUser.currentUser())
query.findObjectsInBackgroundWithBlock {(objects : AnyObject[]!, error: NSError!) in
    messages = objects.map {(message: PFObject!) in Message(text: message["text"], sender: message["sender"], ...)}
}
```

こんな感じに出来そうに見えますが出来ません。
まず、`message: PFObject` で型不一致で引っ掛かり、`o["text"]` がAnyObject で返ってくるので Message の init でも型不一致で死にます。

というわけで、こんな感じに明示的なキャストを駆使することでParseで#mapをキメることが出来ます。

```swift:someParse.swift
var messages : Message[]!
let query = PFQuery(className: "Message")
query.whereKey("user", equalTo: PFUser.currentUser())
query.findObjectsInBackgroundWithBlock {(objects : AnyObject[]!, error: NSError!) in
    messages = (objects as PFObject[]).map {(message: PFObject) in Message(text: message["text"] as String, sender: message["sender"] as String, ...)}
}
```

関係ないですが静的言語を書くのに疲れたので、RubyMotionをキメたくなってきました。
[Android 4.2以降] 開発者向けオプションを表示させる方法

Android開発をしていて実機でデバッグするフェーズにきたとき、なんかあるはずの開発者向けのメニューが私の開発端末(Xperia ZL2)にはなくて動揺しましたが、なんかGoogleに踊らされていたみたいです。

# 解決策

「設定」 > 「端末情報」 > 「ビルド番号」

このビルド番号の欄を、連打してみてください。
ちょっとニンマリしたりイラッとしたりしながら、開発者向けオプションが使えるようになります。

# 参考

* http://developer.android.com/tools/device.html#setting-up
* http://androidlover.net/smartphone/galaxynexus/android-4-2-developer-options.html
UnityでMsgPackを使う


# どの実装を使うか?

Unity4.5.1 (iOS) 上で [msgpack/msgpack-cli](https://github.com/msgpack/msgpack-cli) がうまく動かなかったので、[masharada/msgpack-unity](https://github.com/masharada/msgpack-unity) を使った。

# どのPackerを使うか?

msgpack-unityには以下3種類のPackerが存在する

* BoxingPacker
* ObjectPacker
* CompiledPacker

結果から言うと ObjectPacker を使った。
BoxingPacker はあらかじめクラスの定義等は必要無いが、プリミティブな型しかサポートしておらず文字列(string型)の扱いが難しいので除外。
CompiledPacker は動的にシリアライズ・デシリアライズ用のアセンブリを生成することで高速に動作するっぽいが、iOSアプリでは動的なコード生成は行えないので除外。
結果として、 ObjectPacker を使用することにした。

# 利用手順

## 1. Pack/Unpack の対象となるデータ構造をクラスで定義する

たとえば以下のような構造の MsgPack データをやりとりすると仮定する（※便宜上Jsonで表現）

```
{
  "id" : 1,
  "name" : "Nanashi Taro",
  "age" : 25
}
```

このデータ構造と同等のクラスとして以下のようなクラスを定義する。

```
public class SampleData {
	uint id;
    string name;
    unit age;
}
```

## 2. Pack してみる

前述のデータを ObjectPacker でPackしてサーバに送信するコードは以下のように記述する 

```
var data = new SampleData {
  id = 1,
  name = "Nanashi Taro",
  age = 25
};
var packer = new MsgPack.ObjectPacker();
byte[] body = packer.Pack(data);

var headers = new Dictionary<string, string>();
headers["Content-Type"] = "application/x-mpac";

WWW www = new WWW("http://yourhost/api", body, headers);
yield return www;
```

## 3. Unpack してみる

前述のデータをサーバから受け取り、Unpackするコードは以下のようになる。

```
WWW www = new WWW("http://yourhost/api");
yield return www;

var packer = new MsgPack.ObjectPacker();
var result = packer.Unpack<SampleData>(www.bytes);

Debug.Log(result.id);
Debug.Log(result.name);
Debug.Log(result.age);
```

# 参考

* [masharada/msgpack-unity](https://github.com/masharada/msgpack-unity)
AsteriskのクライアントにZoiperを使う


# サーバに接続設定

![ziper1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e86ab835-2ce9-084f-e9a0-f8e6b77577a2.png "ziper1.png")

![ziper2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d1d74837-9667-d32c-2597-c871b4aa4eb2.png "ziper2.png")

![ziper3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9e340977-a1fc-7418-e921-67393497054c.png "ziper3.png")

![ziper4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d33bda1e-d0d2-56fa-03ed-3fdcda0c1992.png "ziper4.png")


# Zoiperで音が出ない時

* Zoiperを再起動すればよいが、一応以下も確認したほうがいい。

Preferences を開き以下確認。

![zoiper51.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ca85c20b-faef-07d2-90e5-4695881521bb.png "zoiper51.png")

* Registered表示されていること。

![zoiper52.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c902e86e-74a3-c0be-992f-4450e8096d6a.png "zoiper52.png")

* Available Codecに何か追加していること。

![zoiper53.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0162d640-418f-3d47-5eff-682cc9852f54.png "zoiper53.png")

* port番号がAsteriskのsipポート番号と一致していること。
CentOS6 on GCEにDockerを入れ、コンテナ上でNginx + Unicorn + Redmineを動かす

# CentOS6 on Google Compute EngineにDockerを入れ、コンテナ上でNginx + Unicorn + Redmineを動かしてみる

### 1. CentOS6 on GCEにDockerをインストールします。

```bash
sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install docker-io
sudo service docker start
sudo chkconfig docker on
```

### 2. コンテナ用の自前のDockerfileと初期化用ファイルを取得します。
（Ubuntu 14.04にruby+chefをインストールするお試し設定）

https://github.com/t-oginogin/dockerfiles

```bash
sudo yum install curl
curl -o Dockerfile https://raw.githubusercontent.com/t-oginogin/dockerfiles/master/ubuntu/Dockerfile_chef
````

### 3. Dockerfileをビルドします。

```bash
sudo docker build -t t.oginogin/chef .
```

### 4. Dockerコンテナを起動します。
（Redmineのポートを3000にしてるのでポートフォワードも設定します）

```bash
sudo docker run -p 3000:3000 -it --name chef t.oginogin/chef /bin/bash
```

### 5. rootでbashが起動するので、ユーザーubuntuでシェルを起動します。

```bash
su - ubuntu
```

### 6. ChefでRedmine起動に必要なものをインストールします
#### 6.1. recipe取得

```bash
git clone https://github.com/t-oginogin/chef-recipes-ubuntu.git ~/chef-repo
```

#### 6.2. localhost.json内のパラメータ（user,passwordなど）を適宜変更します

#### 6.3. solo.rb内のcookbook_pathを適宜変更します

#### 6.4. recipeを実行します

```bash
cd ~/chef-repo
sudo chef-solo -c solo.rb -j ./localhost.json
```

### 7. recipe実行が終わればredmine起動まで終わったので、Ubuntuから抜けます

```bash
exit
exit
```

### 8. Dockerイメージを保存します

```bash
sudo docker commit chef t.oginogin/redmine
```

### 9. 保存したイメージからコンテナを起動します

```bash
sudo docker run -p 3000:3000 -it --name redmine t.oginogin/redmine /bin/bash
```

### 10. 起動したコンテナ内でサービスを起動します（ユーザーubuntuで起動）。
```bash
su - ubuntu
sudo service mysql start
sudo service redmine start
sudo service nginx start
```

※redmine起動時に`tmp/sockets/unicorn.sock`はソケットファイルでないというエラーが発生した場合は、`tmp/sockets/unicorn.sock`を削除して再度redmineを起動します。

### 11. Host側（今回はGCE上のCentOS）からredmineへ接続確認します

```bash
curl http://localhost:3000/
```

無事にindex.htmlが取得できました。

### 12. インターネットからredmineへ接続確認します

#### 12.1. GCEのFirewall設定にport:3000を追加します

Developers Consoleから対象インスタンスのネットワークを選択し、
[ファイアウォール ルール]-[新規作成]から追加します。

* 名前:`rails`
* ソース IP の範囲:`0.0.0.0/0`
* プロトコルとポート:`tcp:3000`
* 説明:`空白（任意）`
* ソース タグ:`空白（任意）`
* ターゲット タグ:`空白（任意）`

#### 12.2. ブラウザでGCEインスタンスの外部アドレスにアクセスします

http://xxx.xxx.xxx.xxx:3000/

Redmineのページが表示されました。

## 課題
手順10でサービスを手動で起動しています。

手順9でコンテナを起動すると、
serviceに登録したデーモンが自動起動されることを期待していたのですが、
起動されなかったためです。

これはDockerコンテナ起動時にプログラムを一つしか指定できないため、
登録していたサービス群を自動起動させることが難しい？のです。
（後述する/sbin/initを起動させる方法を試してみましたが断念しました。）

Dockerのサイトでは`supervisord`を起動することで登録してある複数のサービスを起動する方法が紹介されています。

https://docs.docker.com/articles/using_supervisord/

supervisordとserviceコマンドとは使い勝手が違っていたので、
supervisordを使うのを見送りました。

なんとか通常の仮想環境のようにLinux丸ごとコンテナで動かしたかったので
他のやり方を調べていると、次のサイトで紹介されていました。

[DockerでUbuntuの/sbin/initを実行する](http://blog.udcp.net/2013/11/10/dockerでubuntuのsbininitを実行する/)

こちらを参考に調整したのですが、Ubuntu14.04では別の問題が発生したためかうまくいきませんでした。

そもそもコンテナの使い方として、一つのコンテナにいくつもサービスを詰め込むやり方が効率良くない気がしてきました。
コンテナを有効に使うベストプラクティスを勉強したいと思います。
npm installでpeerinvalidエラーが出た時の解消方法

`npm install`コマンドでnpmのモジュールをインストールする際に、依存ライブラリのバージョンが解決しきれなくてエラーになる場合があります。
今日私の環境で起きた例です。

```json:package.json
{
  "name": "~~~~~~",
  "version": "0.0.0",
  "description": "test",
  "main": "Gruntfile.js",
  "directories": {
    "doc": "docs"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "~~~~~~~~",
  "dependencies": {
    "handlebars": "~1.1.2",
    "ember-template-compiler": "~1.3.0-beta.2",
    "grunt": "~0.4.1",
    "grunt-ember-templates": "~0.4.18",
    "grunt-contrib-watch": "~0.5.3",
    "grunt-karma": "~0.6.2",
	"karma": "~0.10.0",
    "karma-requirejs": "~0.2.0",
    "karma-mocha": "~0.1.1",
    "karma-chai": "0.0.2",
    "karma-junit-reporter": "~0.2.1"
  }
}

```

上記ファイルがあるディレクトリにて、`npm install`と実行した結果、下記エラーが出力されました。


> npm ERR! peerinvalid The package karma does not satisfy its siblings' peerDependencies requirements!
> npm ERR! peerinvalid Peer grunt-karma@0.6.2 wants karma@~0.10.0
> npm ERR! peerinvalid Peer karma-requirejs@0.2.2 wants > karma@>=0.9
> npm ERR! peerinvalid Peer karma-mocha@0.1.4 wants karma@>=0.12.8
> npm ERR! peerinvalid Peer karma-chai@0.0.2 wants karma@>=0.9
> npm ERR! peerinvalid Peer karma-junit-reporter@0.2.2 wants karma@>=0.9
> npm ERR! peerinvalid Peer karma-chrome-launcher@0.1.4 wants karma@>=0.9.3
> npm ERR! peerinvalid Peer karma-firefox-launcher@0.1.3 wants karma@>=0.9
> npm ERR! peerinvalid Peer karma-html2js-preprocessor@0.1.0 wants karma@>=0.9
> npm ERR! peerinvalid Peer karma-jasmine@0.1.5 wants karma@>=0.9
> npm ERR! peerinvalid Peer karma-script-launcher@0.1.0 wants karma@>=0.9
> npm ERR! peerinvalid Peer karma-coffee-preprocessor@0.1.3 wants karma@>=0.9
> npm ERR! peerinvalid Peer karma-phantomjs-launcher@0.1.4 wants karma@>=0.9

この場合、1行目でkarmaがどのバージョンを使うべきか解決しきれないことが分かります。
2行目以降に、どのライブラリがkarmaのどのバージョン(以降)を使用するかが出力されますので、一つ一つ確認します。
今回のケースですと、下記のkarma-mochaがkarmaのバージョンで唯一0.12系を求めていることが分かります。karma-mochaのバージョンを、karmaの要求バージョンが0.9系のものに下げることで解決しました。

> npm ERR! peerinvalid Peer karma-mocha@0.1.4 wants karma@>=0.12.8



[npm install したときにpeerinvailedと怒られたときの対応](http://qiita.com/Layzie/items/cde511d763d2c11ee774) という記事もあり、こちらでは既存のgenerator-angularが要求するgenerator-karmaが古かったので、generator-karma側を合わせた、という対処方法になっています。

同様のエラーが起きた場合の参考になれば幸いです。
iOS 7.0 シミュレーターインストールできない


![kobito.1402309284.116744.png](https://qiita-image-store.s3.amazonaws.com/0/229/5c7901cf-f64e-a83a-705b-fd6d35924bcd.png "kobito.1402309284.116744.png")

なんか出てこない……

iOS 7.1, 6.1 シミュレータだけ利用できる。原因不明。

* /Applications/Xcode.app
* ~/Library/Caches/com.apple.dt.Xcode
* ~/Library/Developer
* ~/Library/Application\ Support/iPhone\ Simulator

を削除してXcode再インストール

<blockquote class="twitter-tweet" lang="en"><p>The only component I see available for install in Xcode is the IOS 6.0 simulator. Where is 5.1, 6.1, etc? How do I reset this list?</p>&mdash; Jean-Francois Roy (@jfroy) <a href="https://twitter.com/jfroy/statuses/357171632235749376">July 16, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

同じ状況になっている人をひとり確認した

## その後

Xcode 6 Beta を使うとなぜか出てくるっぽい

![スクリーンショット 2014-08-18 7.37.17 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/9ed34cd9-f12c-4cee-6631-cce67c2d4b09.png)
Loading EasyTether on demand


## 151110: For 10.10+ users
- Finally they have released new driver.
- However, the driver will be loaded automatically again via usual install.
- To install manually,
  1. unpkg http://www.mobile-stream.com/beta/darwin/easytether-yosemite-b8.pkg
  2. `sudo mkdir /private/var/lib/easytether` this is where adbkey is created (related to Android 4.2+ ADB authorization)
  3. copy usr/local/bin/easytether-usb to /usr/local/bin
- just `sudo easytether-usb` when you want to activate EasyTether (you should `adb kill-server prior`)


## Article

Abstract:
EasyTether provides USB tethering even if the Android doesn't provide official tethering. However, installing EasyTether on OSX machine prohibits adb, which is awful for Android developers. Using kextload is a workaround. klink already has such kind of application, but EasyTether doesn't yet. So I have written the EasyTetherLoader application.
URL: https://github.com/cielavenir/EasyTetherLoader

EasyTetherはAndroid端末が公式テザリングを提供していなくてもadb経由でUSBテザリングができる素晴らしいツールです。
ですが、OSXにEasyTetherをインストールすると、adbが使えなくなる問題があります。
Android開発者にとってこれは致命傷です。
回避策は、使いたいときに、コマンドラインからkextloadを使ってロードすることです。

ですがこれは少々面倒です。klinkはアプリがありますがEasyTetherにはまだありません。なので、EasyTetherをロードするアプリを作りました。
https://github.com/cielavenir/EasyTetherLoader

- リポジトリをクローンする
- EasyTetherLoader.applescriptを書き換えて、adbコマンドと管理者パスワードを設定する
- install.shを実行してEasyTetherUSBEthernet.kextとmain.scptを用意する
  - なおinstall.shは(dmg/hfsの展開に)7zを使用しますので、p7zip-fullの導入が必要です。

あとはEasyTetherLoader.appを実行するだけで、(実行中のみ)EasyTetherUSBEthernet.kextがロードされます。

謝辞：[ClamshellWake](https://github.com/zarigani/ClamshellWake)を大いに参考にさせて頂きました。感謝します。

追伸1：開発元に連絡をとってみたのですが、「アプリは開発中である」との返信が1年前にあっただけでした。それ以来返信は一向にないので諦めました。

追伸2：EasyTetherLoaderは以前から作っていたのですが、導入が多少面倒でした(ライセンスの都合上EasyTetherUSBEthernet.kextをバンドルできませんでした)。が、先日オンラインインストーラーを作ったので、ようやく記事にすることが出来ました。
文字列を取得、数字に変換して計算。計算した結果をカンマ区切りの文字にして戻す。

string型 とか、Number型とかよくわからなかったので、いろいろとつまずいた部分。
もっとスマートな書き方がある気がするんですが、
とりあえず、よくある形で練習することにします。


###サンプル
```
<div id = "container">
 <p>合計　1,000　人参加</p>
<div>
```
ここの1,000人を取り出して、500人足して表示させたいとき。

###書き出したコード
```var tt = $("div#container p").text();
var ta = tt.match(/\d/g);
var ts= ta.join("");
var tInt = parseInt(ts,10);
var t = tInt + 500;
var tNum = String(t).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,' );
var html = $("div#goods_cart_return p").html("合計" + tNum + "人参加");
```


#####１行ずつみていく


`var tt = $("div#container p").text();`
div#container の子要素のpにあるテキスト『合計　1,000　人参加』を取得

`var ta = tt.match(/\d/g);`
数字を使いたいので、正規表現を使って数字部分だけ抜き出す。1,0,0,0

`var ts= ta.join("");`
1,0,0,0　このままだと数字がバラバラで使えないので、1000にしちゃう。

`var tInt = parseInt(ts,10);`
1000はまだ文字列のまま。これを計算で使えるように数字に変換します。

`var t = tInt + 500;`
これでようやく計算できるようになった！ここではたんに500をたしているだけ。

`var tNum = String(t).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,' );`
計算した結果に３桁ごとにコンマをつけたいならば、replaceを使ってコンマをつけます。

`var html = $("div#goods_cart_return p").html("合計" + tNum + "人参加");`
あとはもどしてやるだけです。
引数無しでjqを起動された場合にルートノードを表示する

JSONを手軽に整形できる`jq`はすごく便利なんですが、単に全体を整形したいだけでも引数にドットを渡さないといけないのが玉に瑕。例えば`curl`でJSONを取得して整形しようと思うとこんな感じにドットがついて回ります。

```bash
curl http://example.com/example.json | jq .
```

.zshrc/.bashrcに以下の関数を定義しておけば、引数無し（で標準入力を渡した場合）にルートノードからの表示が行えます。先ほどの例だとこんな感じ。

```bash
curl http://example.com/example.json | jq
```

これでドットを打ち忘れてusageを見ることもなくなりますね。

```bash:.zshrc
# Display root node when run the jq without argument
function jq {
  if [[ -p /dev/stdin && $# -eq 0 ]]; then
    command jq .
  else
    command jq "$@"
  fi
}
```
ALLOW_INVALID_DATESなお話

現行PJの修正のためローカル環境にクローン作ったのです。
INSERTでエラーがぽつりぽつり出てておかしいなぁっと。
DateフィールドやDateTimeフィールドへの挿入で''空文字としてインサートしてる箇所がエラーとなってます。
FuelPHPのorm葉っぱーなどのコア周りを見てるとデータが指定されない場合はデフォルトをDB構造から読み取ってセットしているっぽい動きをしている。
検証環境のMariaDBならエラー無しで show create table も同じ…

環境要因ですね

調べるとありました。

## my.ini でsql-modeを指定するそうです
MySQL :: MySQL 5.6 Reference Manual :: 5.1.7 Server SQL Modes http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html

> [mysqld]
 # Set the SQL mode to strict
 # sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode="ALLOW_INVALID_DATES"

※ sql-mode="" or sql_mode="" どちらでも良いようです。元々置いてあるmy.iniに合わせましょう

ALLOW_INVALID_DATES を指定すると日付に無効な値を指定してもエラーとせず 0 で挿入可能になります。
あまり薦められたものじゃないですがMySQLをバージョンアップして厳密になってそれまでのコードが動かないとなれば話は別です。

これで解決なのですが軽くハマっていたのでもう少し書きます

## sql_modeオプション変更後の確認

```shell-session
c:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -proot
mysql> select @@sql_mode;
+------------------------------------------------------------------------------------+
| @@sql_mode                                                                         |
+------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ALLOW_INVALID_DATES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye

c:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -proot
mysql> select @@sql_mode;
+---------------------+
| @@sql_mode          |
+---------------------+
| ALLOW_INVALID_DATES |
+---------------------+
1 row in set (0.00 sec)

mysql>
```

上が変更前、下が変更後です

## my.ini の場所

環境:
windows7 Professional
MySQL 5.6
MySQLの起動はサービスで行っている

いつものようにプログラムフォルダにあるとおもいきや残念そこではなかったです
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini
でした。
確認はサービスで起動しているのでサービスのコマンドラインを確認します。

1. [コントロールパネル]開く
2. ウィンドウ右上の検索テキストに service 入力
3. [管理ツール - ローカルサービスの表示] クリック
4. 名前:[MySQL56]を右クリックし[プロパティ]表示
5. 開いた=全般=タブの[実行ファイルのパス]を確認する  
"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.6\my.ini" MySQL56

こんなところに直指定されてました。
んなことわかるかぁー(／・ω・)／にゃー！

## 結果

問題なく動作するようになりました。
これで良いとは思っていないｗ
FuelPHPってこの問題どうやって解決してるんだろう…調べませんけど…
BootstrapでNavbarにロゴ画像をいれるとズレる問題の解決法

<img src="http://media02.hongkiat.com/twitter-bootstrap/twitter-bootstrap.jpg" style="border:none;">

Bootstrap使ってますか？？エンジニアとってデザインがぐっと楽になるBootstrapは使ってる方も多いと思いますが、Navbarに画像を入れると下に偏った配置になるんだけど、、、
という声がどこからか聞こえてきたので、今回はその解決法を紹介します。

## つかうもの
- [Twitter Bootstrap3](http://getbootstrap.com)

## 問題点

Bootstrapのnavbarのheaderに
`<a class="navbar-brand" href="#">Brand</a>`
こんな記述がされていると思うのですが、ここにロゴ画像を埋め込めばいいじゃん！
ということで
`<a class="navbar-brand" href="#"><img src="logo.png"></a>`
と記述しても上手くいきません。画像が下寄りに配置され、navbarからはみ出したりしてしまいます。

## 解決法

画像を放り込まないで、aタグの背景にせっていしてあげると上手くいきます！
`<a class="navbar-brand" href="#"></a>`
そして、cssで

```css
.navbar-brand {
  background: url("logo.png") no-repeat left center;
  background-size: contain;
  height: 50px;
  width: 250px;
}
```

これで上手くいくはずです♪
お疲れさまでした^^

### ブログやってます！！
http://alex23drum.hatenablog.com
Tampermonkey

前：http://qiita.com/cielavenir/items/89f193ddcb72fb78f43b

Chrome 35.0.1916.153 m / 36.0.1985.67 beta-m以降では、chrome://extensionsからuser.jsをインストールする方法が使えなくなったため、Tampermonkey ( https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo/ )を使って導入します。

Tampermonkeyを導入すると、user.jsにアクセスするとき、以前はChromeがインストール拒否する挙動でしたが、Tampermonkeyが自身のデータフォルダに格納する挙動に変更されます。なのでuser.jsを直接導入することが可能となります。

あとは当該user.jsのincludeにあるURLにアクセスすると、user.jsが実行されていることが確認できるはずです。
proxmoxでOpenVzのゲストに2NICを割り当てる

[ウナムチロ: Proxmox ve (proxmox)で仮想マシンNIC追加(CT)](http://umchifre.blogspot.jp/2014/01/proxmox-ve-proxmoxnicct.html)が参考になった。

# OpenVzゲストにNIC追加

対象のゲストを停止してから

1. Network
1. Add
1. Network Device (veth)
1. Nameをeth0、Bridgeをvmbr0に設定。後は入力せずにAddをクリック。
1. Nameをeth1、Bridgeをvmbr1に設定。後は入力せずにAddをクリック。

(IP address (venet)で追加だとダメでした。)

# ゲストにIP設定

設定するにはOpenVzゲストを起動して、ホストから`vzctrl enter コンテナID`で接続する。

## CentOSの設定例

* WAN:192.168.0.90 (eth0)
* LAN:192.168.10.90 (eth1)
* GW:192.168.0.1

```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.0.90
NETMASK=255.255.255.0
ONBOOT=yes
```

```bash:/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
IPADDR=192.168.10.90
NETMASK=255.255.255.0
ONBOOT=yes
```

```bash:/etc/sysconfig/network
NETWORKING="yes"
GATEWAYDEV="eth0"
NETWORKING_IPV6="no"
HOSTNAME="guest01.local"
GATEWAY=192.168.0.1
```

```bash:/etc/resolv.conf
search local
nameserver 192.168.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
```
Raspberry Pi のカメラモジュールでハイビジョン撮影して iOS に streaming 配信する


Cameramodule をセットした Raspberry Pi で、raspivid で動画撮影し、ffmpeg をセグメンタにして HLS で配信するスクリプト
これをサーバのドキュメントルートで実行する。segments フォルダが存在していることが前提（そこにセグメントファイルを作成する）
[こんな感じ](https://www.youtube.com/watch?v=rLKXUMqokpM)で、８〜９秒ほどの遅延でストリーミング配信できました

```Bash
raspivid -n -w 1080 -h 720 -fps 25 -vf -hf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
    -i - \
    -c:v copy \
    -map 0:0 \
    -f ssegment \
    -segment_time 4 \
    -segment_format mpegts \
    -segment_list stream.m3u8 \
    -segment_list_size 1 \
    -segment_list_flags live \
    -segment_list_type m3u8 \
    "segments/%01d.ts" 


trap "rm stream.m3u8 segments/*.ts" EXIT
```

[このページ](http://raspberrypi.stackexchange.com/questions/7446/how-can-i-stream-h264-video-from-raspberry-camera-module-via-apache-nginx-for-re)を参考にし、元のスクリプトだと鏡像反転してしまうのとセグメンタの遅延が大きかったので少し変更しました
[WIP] [Chrome] RealDownloaderはなぜインストールできるのか

前：http://qiita.com/cielavenir/items/bbeb314d3a4abbd9bd24

TamperMonkeyの動作試験をしようと思って大学のWindowsのChromeを開けたところ、RealDownloaderがインストールされていた。
35.0.1916.153 mではこれは不可能なはずなのに…。
ということはこれを再現できれば外部拡張のインストールが可能なのではないかと考えられた。
idhngdhcfkoamngbedgpaokgjbnpdijiをレジストリエディタで検索したところ、`HKEY_LOCAL_MACHINE\Software\Google\Chrome\Extensions\idhngdhcfkoamngbedgpaokgjbnpdiji`が見つかった。

同様の手法をMacBookAir上のWinServer2012R2(DreamSpark)で試してみたが、「新しい拡張機能がインストールされました」が何度やっても消えなかった。
Windows 8/8.1ではなくServerであることが原因なのか、Chrome 36.0.1985.67 beta-mであることが原因なのかは現状わからない。マシンを変えて試してみる予定(うまくいけば別記事切るし、いかなければコメントで終わり)。

ただ、standardはともかくも、cTouch (filesystem)はWebStoreでホストしているのだから、とりあえず謎。
chef-dkを使ってchefを一瞬で使いはじめる



##chef-dkとは
opscodeでrpmでパッケージングしてくれている
chefを利用するにあたって使うと想定されているツール群です。
ちょっと試したい or 長期で運用を想定していない（とりあえず使えれば良い）
程度であれば、chef-dkからのインストールがお手軽で簡単です。


##構築環境

今回インストールする構成は以下

####chefをインストールするサーバ

* CentOS6系(vagrant VM)

####chefを使って自動構築するサーバ
* CentOS6系(vagrant VM)


##Hostサーバでchefのインストール

ダウンロードサイトがあるので下記URLからダウンロードしてきます。

Chef-dkダウンロードサイト
http://www.getchef.com/downloads/chef-dk/mac/

```

$ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.1.0-1.el6.x86_64.rpm

$ sudo rpm -ivh https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.1.0-1.el6.x86_64.rpm

```

これでchefの周辺ツールのインストールは完了しました。
リモートサーバでの自動構築をするにはもう一つ
knife-soloというパッケージが足りないのでインストールします。

```
$ chef gem install knife-solo
```

これで準備は全て整いました。
環境設定をリロードするため、knife-soloをインストールした後は
一度サーバからログアウトを行う事をお勧めします。

##レシピを書く

ここでは試験的に、対象にapacheをインストールして起動するレシピを書きましょう

```

#レポジトリ初期化
$ knife solo init ./chef-repo

$ cd chef-repo

$ knife cookbook create apache -o site-cookbooks

```

対象のファイルを以下のように記述します

```site-cookbooks/apache/recipes/default.rb

package "httpd" do
  action :install
end

service "httpd" do
  action [ :enable, :start]
end

```

これで準備は完了です。


##対象ホストと利用レシピを設定する

nodeファイルを新規作成し、以下のように記述します。
ここでいう`192.168.33.11`はapacheをインストールした対象のホストIPになります。
名前解決出来るようならドメインでも構いません。

```

$ cat < END >> nodes/192.168.33.11.json
{
  "run_list":[
    "recipe[apache]"
  ]
}
END

```

##knife-soloを実行する
knife-soloとはリモートでchef-soloを実行してくれるソフトになります。
何をいってるか分からないという人はググって下さい。
まずは対象のサーバへchefのレシピが適用出来るように初期設定を行います。

```bash

$ knife solo bootstrap 192.168.33.11 --bootstrap-version 11.12.0

```

オプションとしてbootstrapのバージョンを指定してやります。
rpmになってるバージョンがちょっとおかしくなっており
何もオプションを指定せずに実行すると失敗してしまいます。


####注意

この時対象のサーバへの前提条件として

* hostからノーパスワードでログインが実行出来る。
* ノーパスワードでログイン後、ノーパスワードでsudoが行える。

上記２つの条件を満たしているとスムーズにいくので設定することを推奨します。
また上記の流れでbootstrapをすると
設定したレシピまで実行されるので実際には対象にapacheが入っているかと思います。
レシピのみ実行する場合は下記コマンドを実行します。

```bash

$ knife solo cook 192.168.33.11

```

対象のサーバで確認してみます

```
[vagrant@localhost ~]$
[vagrant@localhost ~]$ ps aux |grep http
root      3795  0.0  0.8 175708  3764 ?        Ss   11:57   0:00 /usr/sbin/httpd
apache    3797  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
apache    3798  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
apache    3799  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
apache    3800  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
apache    3801  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
apache    3802  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
apache    3803  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
apache    3804  0.0  0.5 175708  2400 ?        S    11:57   0:00 /usr/sbin/httpd
vagrant   4185  0.0  0.2 107460   940 pts/0    S+   12:31   0:00 grep http

[vagrant@localhost ~]$ chkconfig --list |grep 3:on |grep httpd
httpd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[vagrant@localhost ~]$
```

お疲れ様でした。
golang pcap on Windows

環境構築が問題になりやすそうなので、ここに書いておく。

golang は Path から `gcc` を検索する。[Windows 版](http://golang.org/doc/install) は MinGW gcc を使うようになっている。私の環境は Windows 8.1 64 bit なので、[ダウンロードサイト](http://golang.org/dl/) から go1.2.2.windows-amd64.msi を選んだ。この時点で MinGW も 64 bit 版が必要になる。

普段から cygwin を使っているので、mingw は cygwin パッケージ化されたものを使うことにした。cygwin パッケージで `mingw64-x86_64-gcc-core`, `mingw64-x86_64-binutils`, `mingw64-x86_64-headers`, `mingw64-x86_64-runtime` を選択してインストールする。あるいはもちろん cygwin を使わずに MinGW を単体を直接入れても良い。ただし [MinGW](www.mingw.org/) とは独立した [Mingw-w64](http://mingw-w64.sourceforge.net/) というプロジェクトがあり、64 bit 版はそちらからインストールすること。

golang のライブラリは、`GOPATH` を使ってツリー管理する。ここでは `testproj` 以下に作ることにする。

```bash
mkdir testproj
export GOPATH=$(cygpath -d `pwd`/testproj)
```

gopacket を取得する。次のコマンドを実行すると `testproj` 以下にソースが取得される。

```bash
go get code.google.com/p/gopacket
```

`code.google.com/p/gopacket/pcap` のために [WinPcap developer pack] (https://www.winpcap.org/devel.htm) が必要。`WpdPack` というディレクトリが `C:\WpdPack` になるように展開して配置する。こうする理由は、`gopacket/pcap/pcap.go` に `#cgo windows CFLAGS: -I C:/WpdPack/Include` などと書いてある内容と合致させるため。

ここまでセットアップできたら `gopacket` を使ったプログラムを書いてみる。

```go
package main

import (
        "code.google.com/p/gopacket/pcap"
        "fmt"
)

func main() {
        ifs, err := pcap.FindAllDevs()
        if err == nil {
                for _, ife := range ifs {
                        fmt.Println(ife.Name, ife.Description)
                }
        }
}
```

~~実は現時点では `gopacket` を少し手直ししないといけない。~~パッチ送ったら、すぐに修正取り込んでくれた[#13](https://code.google.com/p/gopacket/issues/detail?id=13), [#14](https://code.google.com/p/gopacket/issues/detail?id=14)ので、今は手直し不要。

cygwin mingw でうまく使うにはコツがある。残念なことに cygwin の mingw gcc は cygwin gcc から呼び出しできない（未対応）。gcc のフラグで切り替えられたらいいのだけれど、まだそこまで出来ていない。alternative のような仕組みもない。`/usr/bin/gcc` は `x86_64-pc-cygwin-gcc` と同一で、cygwin の mingw gcc は `x86_64-w64-mingw32-gcc` で呼び出さないといけない。ということで、次のようにする。

```bash
CC=x86_64-w64-mingw32-gcc LD=x86_64-w64-mingw32-ld go run test_program.go
```

mingw-w64 をインストールした場合は、PATH を通して、最初に見つかる `gcc` がそれになるように調整すればOK。
SSHD等の総当たり対策

## インストール

```bash:root
yum -y install denyhosts
```

## 設定ファイル

```bash
ls -l /etc/denyhosts.conf
```

## 再起動等
```bash
# Usage: /etc/init.d/denyhosts start        # 起動
# Usage: /etc/init.d/denyhosts stop         # 停止
# Usage: /etc/init.d/denyhosts status       # 状態確認
# Usage: /etc/init.d/denyhosts restart      # 再起動
# Usage: /etc/init.d/denyhosts reload       # 再読み込み
# Usage: /etc/init.d/denyhosts force-reload # 再起動（強制）
# Usage: /etc/init.d/denyhosts condrestart  # 再起動（起動している場合のみ）
/etc/init.d/denyhosts restart
```
リモートにプッシュしたコミットを取り消す

ローカル環境でいくらポンコツなコミットをしてもgit resetで問題ないが、
問題なのは間違いを含むcommitをリモートにプッシュしてしまった時のコミット取り消し。

コミットが以下の通りあって、Cが間違えたコミットだとする。
+A +B +C

```script:shellscript
+Cのコミットログを調べる
$ git log

+Cを取り消すコミットを作る
git revert +CのコミットID
```

以上のコマンドを実行すると+Cを取り消す-Cのコミットが出来るので、リモートにプッシュしてめでたし。

ちなみにぐぐるとブランチを消して新しく作り直すなんて方法が上位に出てくるけどとんでもない
過去に犯した過ちは決してなかった事になんて出来ない。
認めよう、自分の無知と愚かさを。
PHPで、子クラスから親クラスのメソッドを実行した時に、その子クラスのファイル名が知りたい

ちょっと面倒なタイトルだけど、やりたいこととしては

- 親クラスに何らかのメソッドがあって、子クラスでもそれを使う（継承）
- メソッド自体は親クラスにしか書かない
- でも呼ばれた子クラスのファイル名（とかその他）が知りたい

ということがあって、普通に `debug_backtrace()` とか使ったんだけど、返ってくるのは親クラスのファイル名だった。 


例えば以下の場合、実行してるのは子クラス( `child.php` )だけど、返るのは親クラスのファイル名( `parent.php` )。
実行してるのが `parant.php` だからそうなるみたい。

```php:parent.php(失敗例)
class ParentClass
{
    public function trace()
    {
        $trace = debug_backtrace();
        // ↓呼び出してるのはこのファイル(parent.php)なので、それが返る
        return basename($trace[0]['file']);
    }
}

include('child.php');

$child = new ChildClass();
echo $child->trace(); // parent.php
```

```php:child.php(失敗例)
class ChildClass extends ParentClass
{
}
```

[ReflectionClass](http://www.php.net//manual/ja/class.reflectionclass.php) を使うとうまくいった。

```php:parent.php(成功例)
class ParentClass
{
    public function trace()
    {
        $trace = debug_backtrace();
        // ↓これで呼び出し元のクラスの情報を取得
        $ref = new ReflectionClass($trace[0]['object']);
        return basename($ref->getFilename());
    }
}

include('child.php');

$child = new ChildClass();
echo $child->trace(); // child.php
```

```php:child.php(成功例)
class ChildClass extends ParentClass
{
}
```

子のファイルごとにエラーとかをまとめたいけど親クラス内だけで処理したかった、みたいなやつで使ったので備忘のためw
Android StudioのNavigation Editorを触ってみる

XcodeのStoryboardみたいなものがAndroid Studioに付いたと聞いたので取り敢えず触る。


手持ちのプロジェクトはうまく認識してくれなかったので要調査。
今回は新規プロジェクトで利用してみます。

# Navigation Editor を使う

## 起動

`Tools -> Android -> Navigation Editor`と起動するとプロジェクトホーム直下に
`.navigation/raw/main.navg.xml`というフォルダとファイルが生成されるようです。

![スクリーンショット 2014-06-16 11.56.29.png](https://qiita-image-store.s3.amazonaws.com/0/23818/1cf1fdcd-3404-7fef-c4f6-72a23ac6f49d.png)

![スクリーンショット 2014-06-16 12.09.52.png](https://qiita-image-store.s3.amazonaws.com/0/23818/bcded39e-f1cb-b1b0-e9ca-6e0f1117ee89.png)


## 編集

`右クリック`でActivityの作成ができます。
ウィザードでActivityクラスとlayoutファイルが生成されて`AndroidManifest.xml`にも追記されます。

![スクリーンショット 2014-06-16 12.05.03.png](https://qiita-image-store.s3.amazonaws.com/0/23818/01755ec6-1175-5687-ef8b-b1e3ff616ff5.png)
　
　
`Shift+左クリック`でActivity同士を繋げることができます。
作ったばかりのActivityで繋ぐと繋げる物がないので下記のようにエラーが出ます。

![スクリーンショット 2014-06-16 12.17.50.png](https://qiita-image-store.s3.amazonaws.com/0/23818/cb9784bb-b40b-b783-1cbe-7e2db9f9b8d5.png)
　
　
TextViewをButtonに変更してidを与えて`Shift+左クリック`で繋げてみます。

![スクリーンショット 2014-06-16 12.24.03.png](https://qiita-image-store.s3.amazonaws.com/0/23818/8095186d-dab4-03f9-f314-97a73e323b58.png)
　
　
MainActivityのコード見てみるとクリックイベントが生成されているがViewのimportまでされていない、残念だ。

![スクリーンショット 2014-06-16 12.25.31.png](https://qiita-image-store.s3.amazonaws.com/0/23818/d59ba9d5-5310-a487-c8d8-deda31c88aa9.png)
　
　
そしてNavigation Editorは沈黙した。

![スクリーンショット 2014-06-16 12.26.52.png](https://qiita-image-store.s3.amazonaws.com/0/23818/12e2f755-29cf-821e-e9d3-93effd0367d2.png)


# 感想

Navigation EditorからActivityやlayoutファイルを削除できたらいいな。
あとlayoutファイルが参照していたファイルも他と競合しなければ削除できたりすると嬉しいです。
まだお試し機能状態なのでこれがあるから開発が色々捗るということはなさそう。(小並感

# 参考
http://tools.android.com/navigation-editor
ファイルサイズがnKB以上のファイルを表示する

カレントディレクトリ以下にある100kbytes以上の容量を持つファイルの一覧を表示します。
単にカレントディレクトリの中だけを探すなら`-Recurse`を外せばOk。

```ps1
Get-ChildItem -Recurse | Where-Object { $_.Length -ge 100000 }
```

<a href="http://www.moj.go.jp/MINJI/minji101.html">不動産登記規則第73条第１項の規定により法務大臣が定める土地所在図等の作成方式</a>では申請情報として添付する図面TIFFファイルサイズは300KB以下と定められています。
大量の図面TIFFファイルを処理する際にこの制限にひっかからないかのチェックを行いました。
制限の通り300KB以上をのファイルだけを表示するには`100000`ではなく`300000`とすればいいけど、何も表示されないのも心配なのでとりあえず100KB以上を指定しました。

とはいえ今回チェックした約2300枚の地積測量図のうち、100KBを超えた図面は11枚。1番大きなファイルでも144KB程度でした。
CADから直接PDFやTIFFに変換した場合はノイズがほぼないので300KBを超えることはなさそうな感じ。
一度印刷してからスキャナで読み取った図面はノイズが多いのでよくチェックをする必要がありそう。
SSHの鍵認証設定

いつも忘れるのでメモ。

# 鍵作成
```bash
$ cd ~/.ssh/
$ ssh-keygen -t rsa -f hoge_rsa
```
パスワード入力待ちになるのでパスワード入力。
（入力せずにEnterでパスワードなしの鍵ができるらしいが、自分はいつもつけてます。）

# サーバーに鍵を転送
サーバー側に.sshディレクトリをあらかじめ作成しておく。

```bash
$ scp ./hoge_rsa.pub user@host:~/.ssh/
```

# サーバー側の鍵設定
```bash
$ cd ~
$ chmod 700 .ssh
$ cd .ssh
$ cat hoge_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ rm -fv hoge_rsa.pub
```
.sshディレクトリとauthorized_keysファイルのパーミッションを正しく設定しないとつながらないので注意。
これでハマること多し。

# サーバー側sshd設定変更
```bash
$ su
パスワード：
# vi /etc/ssh/sshd_config
```

以下の行のコメントをはずして有効化する。

```text
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
```

## 参考：追加の設定
### PermitRootLogin
noに設定するとrootログインを禁止にできる。

### PasswordAuthentication
noに設定するとパスワードログインを禁止にできる。
設定を間違って、鍵認証できない状態でパスワードログイン禁止にしてしまうとログインできなくなってしまうので、後から変更したほうが良い。

# sshd再起動
再起動して設定を反映。

```bash
# which sshd
/usr/sbin/sshd
# /usr/sbin/sshd -t
（設定ファイルに間違いがなければ何も表示されない）
# service sshd restart
```

serviceはCentOSの場合。
他のディストリビューションの場合は違うかも。

# クライアントからログイン確認
初回のみ-iオプションで秘密鍵の指定が必要。

```bash
$ ssh -i ~/.ssh/hoge_rsa user@host
```

# エイリアス設定
クライアント側の~/.ssh/configを設定することで user@host の部分を省略できる。
これは鍵認証と直接関係ないが、やっておくと便利。

```bash
$ vi ~/.ssh/config
```

```text
Host hoge-server
    HostName xxx.xxx.xxx.xxx
    User hoge
    IdentityFile ~/.ssh/hoge_rsa
```

```bash
$ chmod 600 ~/.ssh/config
$ ssh hoge-server
```



#参考URL
[鍵交換方式によるssh接続](http://kazmax.zpp.jp/linux/lin_sshrsa.html)
[SSHで公開鍵認証を使う](http://www.pistolfly.com/weblog/2007/02/ssh.html)
[~/.ssh/config で簡単に複数ホストへのSSH接続を管理する](http://superbrothers.hatenablog.com/entry/20090730/1248971671)
Spotlight検索でのインデックス作成の停止/開始

## 停止
「ターミナル」から以下のコマンドを実行。

```
sudo mdutil -i off /
```

その後、パスワード入力。

## 開始
「ターミナル」から以下のコマンドを実行。

```
sudo mdutil -i on /
```

その後、パスワード入力。
int nonNegative = MAX(0, [array count] - someInt)が負の値になってしまう

はまったのでメモ

```objc
int nonNegative = MAX(0, [array count] - someInt)
```

みたいなのを書いて、値が負にならないことを保証しようとしたが、この書き方は誤り。

0が普通の `int` であるのに対して、 `[array count]` は `NSUInteger` を返すらしい。
`[array count] - someInt` は`unsigned int`なので負の数を表現出来ない。-1とかをunsigned intとして解釈すると、とても大きい数となってしまうので、結局上の式は想定外の動作をする。

ちなみに

```objc
if (0 < [array count] - someInt)
```
と書いた場合はちゃんとコンパイラが違う型同士の比較だという警告を出してくれる。
Tomcatのセッションタイムアウト時間のリセットタイミングについて

適当なタイトルですが、、、

セッションのタイムアウト時間はいつリセット(数え直し)されるのか気になったので実験してみました。

こんな感じのソースコードです。

```java:SessionTestServlet
package com.sample.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/SessionTestServlet")
public class SessionTestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();

		out.println("<html>");
		out.println("<head>");
		out.println("<title>セッションテスト</title>");
		out.println("</head>");
		out.println("<body>");

		HttpSession session = request.getSession(false);
		if(session == null){
			out.println("セッションはありません。セッションを新しく作成します。<br>");
			session = request.getSession(true);
		}
		out.println("セッションタイムアウト:"+session.getMaxInactiveInterval()+"<br>");
		out.println("<a href=\"./SessionTestServlet\">再読み込み</a><br>");

		out.println("</body>");
		out.println("</html>");
	}
}
```

セッションタイムアウト時間はweb.xmlに下記を追加して3分に変更しておきます。

```xml:web.xml
<web-app ...>
...
  <session-config>
    <session-timeout>3</session-timeout>
  </session-config>
</web-app>
```

結果としては、何らかのリクエストがある度にセッションのタイムアウト時間はリセットされるようです。
セッションオブジェクトに(コード上は)一切アクセスしないようなHTMLやサーブレットにリクエストがあってもセッションのタイムアウト時間はリセットされます。

ブラウザからセッションIDを含むクッキーが渡されるので、それによりセッションのタイムアウト時間がリセットされると考えるのが正確かもしれません。
CakePHPインストール

## 環境
- Mac OSX 10.9
- MAMP 3
- PHP 5.5

## Download
http://cakephp.jp/ でダウンロードしたzipファイルを
任意のディレクトリに設置して解凍

```shell-session
cd /yourpath/cakephp-2.4.10/
```

## cacheの書き込み権限を与える

```shell-session
chmod -R 777 app/tmp 
```

## Security.salt / Security.cipherSeed

```shell-session
vim app/Config/core.php
```

### Security.salt

```php
# before(default)
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
# after
Configure::write('Security.salt', 'abcd1234qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
```

### Security.cipherSeed

```php
# before(default)
Configure::write('Security.cipherSeed', '76859309657453542496749683645');
# after
Configure::write('Security.cipherSeed', '12345678657453542496749683645');
```

## database configuration

Your database configuration file is NOT present.
Rename APP/Config/database.php.default to APP/Config/database.php

```shell-session
mv app/Config/database.php.default app/Config/database.php
```

CakePHP is NOT able to connect to the database.
Database connection "Mysql" is missing, or could not be created.

```shell-session
vim app/Config/database.php
```
nodejsにてHTMLを解析したい場合使うべきLibとは？

突然nodejsにてHTMLを解析の仕事が出てきた。

調べた結果、`jquery`（ウェブ側のjQueryとちょっと違う）と`cheerio`を洗い出した。

#1. jquery

HOME: https://github.com/UncoolAJ86/node-jquery

インストールはコマンド2個：
```
npm install -S 'jquery@>=2.1'
npm install -S 'jsdom@latest'
```
ですが、`jsdom`のインストールは遅い！

```
> contextify@0.1.8 install /Users/liubin/github/ss4cn/node_modules/jsdom/node_modules/contextify
> node-gyp rebuild

gyp http GET http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz
gyp http 200 http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz
  CXX(target) Release/obj.target/contextify/src/contextify.o
  SOLINK_MODULE(target) Release/contextify.node
  SOLINK_MODULE(target) Release/contextify.node: Finished
jsdom@0.10.6 node_modules/jsdom
```
`nodejs`自体のダウンロードとビルドが必要です。

使う方法も面倒くさい。具体的に本家のサンプルをご参照。

ドキュメントは不備。

#2 cheerio

HOME: http://matthewmueller.github.io/cheerio/

インストールは簡単かつ迅速

```
npm install cheerio
```

詳しいドキュメントが用意されている。使うも簡単。

```js
// from https://github.com/cheeriojs/cheerio
var cheerio = require('cheerio'),
    $ = cheerio.load('<h2 class="title">Hello world</h2>');

$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

$.html();
//=> <h2 class="title welcome">Hello there!</h2>
```

欠点：httpから直接HTMLコンテントを取得するメソッドが無い。`request`パッケージを使うと自前実装しなければならない。

#3 結局

`cheerio`を使うことになりました。
JavaScriptでsubmit()する場合は、フォーム内のフィールドにsumbitというname要素を入れたら駄目よ〜ダメダメ。。。

プチはまり。

フォームにsubmitというnameの要素があるとsubmit()が効かなくなります。

結構忘れるので、気をつけよう。