OmniAICreator/Qiita-1.07M huggingface dataset:
TyphoonAssemblyによる依存関係定義

# 依存関係の定義方法
Typhoon Frameworkでは、依存関係をTyphoonAssemblyのサブクラスとして定義していきます。protocolに対して具象クラスを注入する場合には、その具象クラスを登録します。

TyphoonAssemblyは複数のファイルに分割したり、継承したりするこもとできます。

# 初期化 vs プロパティ
TyphoonAssemblyによる依存関係の定義では、初期化時の注入と、プロパティによる注入のいずれかを選んで定義することになります。

以下のサンプルコードは、Typhoon Frameworkのドキュメントから引用しています。
引用元
https://github.com/typhoon-framework/Typhoon/wiki/Assembling-Components-with-Blocks


## 初期化時の注入
オブジェクト初期化時に依存関係を注入します。これが一番ベーシックな使い方です。
初期化に使うメソッドのセレクタと、与える引数を順に指定して行きます。injectWithDefinitionを使うことで、Typhoonによって管理されている他のオブジェクトを注入することもできます。

```objc
- (id)basicKnight
{
    return [TyphoonDefinition withClass:[Knight class] initialization:^(TyphoonInitializer* initializer)
    {
        initializer.selector = @selector(initWithQuest:);
        //For more control, you can use injectParameterAtIndex or withName, but probably just. . . 
        [initializer injectWithDefinition:[self defaultQuest]];
        //. . . which means the order will follow that of the parameters in the selector. 
    }];
}
```

## プロパティによる注入
オブジェクトの初期化後、setterにより注入を行います。
注入するプロパティを一つずつ指定して行きます。プロパティの型に対して、注入すべき依存関係が一意に決まる場合にはプロパティ名だけを指定します。もちろん、明示的に注入するオブジェクトの定義を与えることもできます。

```objc
- (id)cavalryMan
{
    return [TyphoonDefinition withClass:[CavalryMan class] properties:^(TyphoonDefinition* definition)
    {
        //wire-by type
        [definition injectProperty:@selector(quest)]; 

        //explicit wiring - useful when there's more than one component representing a given type
        [definition injectProperty:@selector(quest) withDefinition:[self defaultQuest]]; 
    }];
}
```

## どちらを使うべきか？
僕は初期化が完了したオブジェクトはその時点で有効であるべきと考えているので、可能な限り初期化時に注入を行っています。

ただ、この場合循環参照の問題が起こりやすいので、必要に応じてProviderを注入します。Providerについてはまた別のエントリを書こうと思います。
サーバのスペックを取得するスクリプト作った

* PHYSICAL・・・物理CPU数
* HT・・・ハイパースレッディング(1:有効, 0:無効)
* INSTALL・・・OSをインストールした日(だと予想)
* MEM・・・スワップは考慮してないです。スワップしているサーバなんて・・・

```bash:get_spec.sh
#!/bin/sh

## 
# output sample
##
# ============
# server.local
# ============
# 
# SYSTEM
# ====================
#       OS : CentOS release 6.5 (Final)
#  INSTALL : 2013-12-01
#     ARCH : x86_64
# 
# CPU
# ====================
#     NAME : Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz
#  PHYSICAL: 1
#     CORE : 4
#       HT : 0
#    CLOCK : 3.10GHz
#    CACHE : 6MB
# 
# MEM (MB)
# ====================
#    TOTAL : 7555
#      USE : 1269
#     FREE : 6285

set -eu
CPUINFO="/proc/cpuinfo"
MEMINFO="/proc/meminfo"

if [ -e "/etc/redhat-release" ];then
    RELEASE_INFO="/etc/redhat-release"
elif [ -e "/etc/debian_version" ];then
    RELEASE_INFO="/etc/debian_version"
fi
INSTALL=`stat -L $RELEASE_INFO | grep Modify | cut -d " " -f 2`
ARCH=`uname -m`

CPU_PHYSICAL=`grep "physical id" $CPUINFO | sort | uniq | wc -l`
CPU_CORE=`grep "cpu cores" $CPUINFO | tail -n 1 | awk '{print $NF}'`
CPU_MAXID=`grep "core id" $CPUINFO | wc -l`
CPU_NAME=`grep "model name" $CPUINFO | cut -d ":" -f 2 | tail -n 1`
CPU_CLOCK=`echo $CPU_NAME | awk '{print $NF}'`
CPU_CACHE=`grep "cache size" $CPUINFO | tail -n 1 | cut -d " " -f 3 | awk '{printf "%d", $1/1000}'`

MEM_TOTAL=`free -m | awk '/Mem/{print $2}'`
MEM_USE=`free -m | awk '/-\/+/{print $3}'`
MEM_FREE=`free -m | awk '/-\/+/{print $4}'`

echo "============"
echo `hostname`
echo "============"
echo
echo "SYSTEM"
echo "===================="
echo "      OS : `cat ${RELEASE_INFO}`"
echo " INSTALL : ${INSTALL}"
echo "    ARCH : ${ARCH}"
echo
echo "CPU"
echo "===================="
echo "    NAME :" ${CPU_NAME}
echo " PHYSICAL:" ${CPU_PHYSICAL}
echo "    CORE :" ${CPU_CORE}
if [ $CPU_CORE -lt $CPU_MAXID ];then
  echo "      HT :" 1
else
  echo "      HT :" 0
fi
echo "   CLOCK :" ${CPU_CLOCK}
echo "   CACHE :" ${CPU_CACHE}MB
echo
echo "MEM (MB)"
echo "===================="
echo "   TOTAL :" ${MEM_TOTAL}
echo "     USE :" ${MEM_USE}
echo "    FREE :" ${MEM_FREE}
```
SharedPreferences が更新されたら何かするという実装

# SharedPreferences.OnSharedPreferenceChangeListener を実装し、AsyncTaskLoader を継承したクラスを用意

```java
public class SharedPreferencesLoader extends AsyncTaskLoader<SharedPreferences>
    implements SharedPreferences.OnSharedPreferenceChangeListener {
```

# registerOnSharedPreferenceChangeListener でリスナー登録

```java
  @Override
  public SharedPreferences loadInBackground() {
    prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
    prefs.registerOnSharedPreferenceChangeListener(this);
    return (prefs);
  }

  @Override
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
      String key) {
    // notify loader that content has changed
    onContentChanged();
  }
```

# LoaderManager.LoaderCallbacks<SharedPreferences> の実装クラスの onLoadFinished でごにょごにょ

```java
  @Override
  public void onLoadFinished(Loader<SharedPreferences> loader,
      SharedPreferences prefs) {
    // TODO ここでごにょごにょする
  }
```


参考URL

1. http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html
GMT4.xとGMT5.xを簡単に共存させるためのインストール手順

#Introduction
地球科学分野でよく使われるGMT(gmt generic mapping tools)
普段は5.x使ってるけど、動かなかったりしたら怖いとかの理由でGMT4.xと5.xを共存させたいことがあると思う。
そんな時簡単に切り替えられるように構築するための手順を書いておく。

方針としてはそれぞれのバージョンの名前をつけたディレクトリを/usr/local配下に配置して使うバージョンのシンボリックリンクを/usr/local/GMTにはり、
それにパスを通す。

バージョンが変わることによってこの手順が古くなることもあると思うので
より詳しく・正確な情報は公式web( http://gmt.soest.hawaii.edu/home )を参照すること。

#4.xの導入
まずは4.5.12をダウンロードする。
ダウンロード先は東海大学のミラーサイトが早いと思う。

    $wget "ftp://ftp.scc.u-tokai.ac.jp/pub/gmt/gmt-4.5.12-src.tar.bz2"
    $tar xf gmt-4.5.12-src.tar.bz2

次にコンパイルしてインストールする。
更に細かいオプション指定したい場合は「./configure --help」で確認。
また、manとかも入れたいのでinstall-allとしたがここも適宜変更すること。
また、netcdfが入ってなかったらapt-getなりで導入する。(パッケージはlibnetcdf-dev)

    $cd gmt-4.5.12/
    $./configure --prefix=/usr/local/GMT-4.5.12 
    $make all
    $sudo make install-all

インストールができたら/usr/local/GMT-4.5.12から/usr/local/GMTにシンボリックリンクを貼る。

    $sudo ln -s /usr/local/GMT{-4.5.12,}

念の為動作確認をする。

    $export PATH=/usr/local/GMT/bin/:$PATH
    $gmtdefaults -D | head

これで正常にバージョンなどがごちゃごちゃ表示されたら成功。

#5.xの導入
次に5.1.1をダウンロードする。

    $cd ~
    $wget "ftp://ftp.scc.u-tokai.ac.jp/pub/gmt/gmt-5.1.1-src.tar.bz2"
    $tar xf gmt-5.1.1-src.tar.bz2
    $cd gmt-5.1.1/

4.xの時はconfigureだったが、5.xからはcmakeを使うように変更された
設定のテンプレートファイルがあるのでそれをConfigUser.cmake
という名前にしてそれをvimなど好きなエディタで編集する。

    $cp cmake/ConfigUser{Template,}.cmake
    $vim cmake/ConfigUser.cmake

とりあえずprefixだけ以下のようになるように直したが、
こちらも各人好みでさらに編集する。

    $diff cmake/ConfigUser{Template,}.cmake
    41c41
    < #set (CMAKE_INSTALL_PREFIX "prefix_path")
    ---
    > set (CMAKE_INSTALL_PREFIX "/usr/local/GMT-5.1.1")

あとはbuildディレクトリを作ってそこでコンパイル・インストールする。

    $mkdir build
    $cd build
    $cmake ../
    $make all
    $make install

これで一応導入されたので
シンボリックリンクを張り替えてきちんと動作するか確認する。

    $sudo ln -snf GMT{-5.1.1,}
    $export PATH=/usr/local/GMT/bin/:$PATH
    $gmtdefaults -D | head

このとき5.1.1のバージョンに変わっていれば成功。

#共存設定
ということであとはパスをちゃんと通して
ターミナルを開いた時に適応されるようにする。

    $cd ~
    $echo 'export PATH=/usr/local/GMT/bin/:$PATH' >> .bashrc
    $echo 'export MANPATH=/usr/local/GMT/share/man/:$MANPATH' >> .bashrc

わたしは個人的にしか使わないので.bashrcに追記したが、
必要に応じてリダイレクト先を変えること。
これでとりあえずできた。
また、切り替えのために以下のようなスクリプトを用意しておくと便利である。

    case $1 in
        4)sudo ln -snf /usr/local/GMT{-4.5.12,};;
        5)sudo ln -snf /usr/local/GMT{-5.1.1,};;
    esac
    gmtdefaults -D | head 

さらに頻繁に切り替えを行う場合は.bashrcなどにコマンドのエイリアスを貼っておくと更に使い勝手が良くなるだろう。
90年代に<table>使ったhtmlレイアウトに慣れた人はLayout XMLのLinearLayoutがネストしすぎる傾向がある

# 理由

昔はCSSのブラウザ差がひどくて&lt;div&gt;が流行る前は&lt;table&gt;ネスト全盛だったんだ

# 結論

できるだけ RelativeLayout を使おう！
PHPで非同期実行する

```php
//Windowsの場合はpopen関数で非同期実行
if (strpos(PHP_OS, 'WIN')!==false) {
	//「start」コマンドで非同期実行
	$fp = popen('start php test.php', 'r');
	pclose($fp);
//Linuxの場合はexec関数で非同期実行
} else {
	//「>」で出力先指定(＊出力先はnullなので出力しない)
	//「&」で非同期実行
	exec('php test.php > /dev/null &');
}
```
latex: Cannot determine size graphic in ...


一般に，latexのタイプセット時には，画像ファイルのサイズ情報が必要で，epsファイル以外の画像ファイルの場合は，

```Bash
$ ebb hoge.png
```

のようにして，`hoge.bb`のようなBoundary Box情報が記載されたファイルを用意する．

この場合，ファイル名に拡張子以外のところに「. (ピリオド)」が存在すると，latexがBoundary Box情報を読み取ってくれない！！！
これで結構苦労した．
gitで特定タグ(リビジョン)からの変更のあった差分だけzipに固めるスクリプト


## メモ 

共有レポジトリからgitプロジェクトをcloneして特定のタグから最新までの変更差分のみを
zipに固めるバッチ処理


- git_flow.sh
  - git_diff_archive.shを内部的に呼び出している。
  - 以下の一連の流れをgit_flow.sh内で行っている。
    - 引数として以下を受け取る
      - レポジトリURL
      - 差分を取得する際の基準のTAG名
      - 一通りの処理が終わったセットするタグ名
      - zipファイルを解凍した際のディレクトリ名
      - zipファイル名
    - レポジトリURLを元にプロジェクトをcloneする
    - cloneしてきたプロジェクトに移動して基準タグ名を元にリビジョンIDを取得する
    - 取得したリビジョンIDと現在までの修正差分をzipに固める(git_diff_archive.shを呼ぶ)
    - 新しいタグをセットする
    - zipファイルを実行ファイルと同じディレクトリに移動する
    - cloneしたディレクトリを削除する
- git_diff_archive.sh
  - git_flow.sh内部から使われる事のみを想定
  - 単体でも動くと思う。
  - 引数は以下の通り
    - リビジョンID
    - 差分zipを解凍したときのディレクトリ名
    - zipファイル名


### ファイル内容

```bash:git_flow.sh

#/bin/sh

# 引数 ------------------------------------------------------------

# $1 : repository url
# $2 : target_tag_name
# $3 : next_set_tag_name
# $4 : prefix (解凍したときのディレクトリ名)
# $5 : zip_name (zipファイル名)

# ----------------------------------------------------------------


git_flow() {
  local repository_url=$1
	local target_tag_name=$2
	local next_set_tag_name=$3
	local prefix=$4
	local zip_name=$5

  local base_dir=$(cd `dirname $0`; pwd)
	local clone_dir="$base_dir/clone_dir"

	# git clone
  echo "clone開始---------------"
	git clone $repository_url $clone_dir
  echo "clone終了---------------"

  ## clonedirに移動
	cd $clone_dir

  # 第二引数のtag nameからリビジョンID取得
  echo "リビジョンID取得開始---------------"
	revision_id=`git show $target_tag_name | grep commit | cut -c8- | head -n 1`

	echo $revision_id
  echo "リビジョンID取得終了---------------"

	echo "差分アーカイブ開始---------"

  $base_dir/git_diff_archive.sh $revision_id $prefix $zip_name

	# 次のタグセット
	echo "新しくタグをセット: $next_set_tag_name -------------------"
	git tag -a $next_set_tag_name -m "set tag $next_set_tag_name"
	git push origin $next_set_tag_name

	# 実行ファイルのディレクトリにzipを移動
	mv $zip_name $base_dir

	echo "差分アーカイブ終了---------"

	## 元のディレクトリに戻って諸々削除
	echo "cloenディレクトリ削除------------------"
	cd $base_dir
	rm -rf $clone_dir
}

if [ $# -eq 5 ]; 
then
  git_flow $1 $2 $3 $4 $5
else
	echo "引数エラー 1: repository url, 2: target_tag_name, 3: next_set_tag_name, 4: prefix 5: zip_name"
	echo "使い方 : ./git_flow.sh /path/to/repository/share.git v1 v2 root zip.zip"
fi


```


```bash:git_diff_archive.sh

#/bin/sh

# 引数 ------------------------------------------------------------

# $1 : revision
# $2 : prefix (解凍したときのディレクトリ名)
# $3 : zip_name (zipファイル名)

# ----------------------------------------------------------------



git_diff_archive()  {
	local revision=$1
  local prefix=$2
  local zip_name=$3

	diff="git diff --name-only $revision HEAD"

  git archive --format=zip --prefix="$prefix/" HEAD `eval $diff` -o $zip_name
}


if [ $# -eq 3 ]; 
then
	echo "アーカイブ開始---------"

  git_diff_archive $1 $2 $3

	echo "アーカイブ終了---------"
else
	echo "引数エラー 1: コミットリビジョン, 2: zipに固める際のディレクトリ名 3: zipファイル名"
	echo "使い方 : ./git_diff_archive.sh 18ea21f root zip.zip"
fi

```
OSX Mavericks にhomebrew + rbenvでruby 2.1.1インストール (2014/04/18)

（追記:2014/Aug/5)
rbenv install 2.1.1がreadlineでコケる問題、この方法で解決しました。

```shell-session
curl -fsSL https://gist.github.com/mislav/a18b9d7f0dc5b9efc162.txt | rbenv install --patch 2.1.1
```

[rbenv - Error compiling Ruby 2.1.1](http://stackoverflow.com/questions/23418227/rbenv-error-compiling-ruby-2-1-1)

==================


Mavericksにアップデートしたら、homebrew環境が壊滅的に壊れました。
rubyを入れなおそうとしたら以下のエラー

```shell-session
$ xxx -> RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.1.1
Downloading yaml-0.1.6.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/5fe00cda18ca5daeb43762b80c38e06e
Installing yaml-0.1.6...
Installed yaml-0.1.6 to /Users/stakei/.rbenv/versions/2.1.1

Downloading ruby-2.1.1.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/e57fdbb8ed56e70c43f39c79da1654b2
Installing ruby-2.1.1...

BUILD FAILED

Inspect or clean up the working tree at /var/folders/wt/lwvqd5_j2kj6fcmg2nzgjld00000gn/T/ruby-build.20140418025042.58008
Results logged to /var/folders/wt/lwvqd5_j2kj6fcmg2nzgjld00000gn/T/ruby-build.20140418025042.58008.log

Last 10 log lines:
compiling ossl_x509crl.c
compiling ossl_x509ext.c
compiling ossl_x509name.c
1 warning generated.
compiling ossl_x509req.c
compiling ossl_x509revoked.c
compiling ossl_x509store.c
installing default openssl libraries
linking shared-object openssl.bundle
make: *** [build-ext] Error 2
```

ハマりまくったのですが、こちらのエントリーで解決。

[MacでRuby 2.x.xがインストールできないバグ (homebrew + rbenv)](http://qiita.com/manuluu/items/85c42e2ddd03c4832c28)

以下、備忘録として。
homebrewを入れなおし、brew doctorで出たエラーファイルは全て削除（削除しないほうがいいらしいが？）。
パッケージは`brew uninstall xxx` -> `brew install xxx`で再インストール。

```shell-session
# Install homebrew
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
$ echo export PATH="/usr/local/bin:$PATH" >> ~/.zprofile

# Check homebrew
$ brew doctor

# Install ruby 2.1.1
$ brew update
$ brew install rbenv ruby-build
$ brew uninstall openssl && brew install openssl

# readline 6.3.3 should be uninstalled, and install readline 6.2.4
$ brew uninstall readline
$ cd /usr/local/
$ git checkout 0181c8a Library/Formula/readline.rb
$ brew install readline

$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.1.1

$ rbenv versions

```

(ヽ´ω`)
たった6個のsedを通せば、Apacheログは驚くほど扱いやすくなる

# Q. awk '{print $9}'とかでUser-Agent丸ごと取り出したい

とか思ったことない? Apacheのログ解析で。でもできないじゃない。例えば

```text:combined形式ログ
192.168.0.1 - - [17/Apr/2014:11:22:33 +0900] "GET /index.html HTTP/1.1" 200 43206 "https://www.google.co.jp/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
```

なんかのログで`"mozilla/5.0 (Windows NT 6.1 ……  Safari/537.36"`の部分が欲しいなーと思って、AWKで取ろうとしても

```sh:こーなってしまう
$ awk '{print $12}' httpd-access.log
"Mozilla/5.0
$ 
```

なーんてふうに、最初のスペースまでで切れてしまって全然使い物にならない。さて、何とかならないものか。

# A. 6個のsedコマンドにパイプで通せばできるよ

でも、そこは我らがUNIX。シェルスクリプトとパイプと標準コマンドさえあればお手のもの。sedコマンド6個通すだけでできるようになるのさ。

次のシェルスクリプトを書いてこいつに流し込むだけ。
 **(2014/05/05) おい、動かねーじゃねーか！という指摘を受けて修正しました。m(_ _;)m**

```sh:apalognorm.sh(Apachログを整形するシェルスクリプト)
#! /bin/sh

# ----- ちょいと下ごしらえ -----
RS=$(printf '\036')             # 元々の改行位置にマークするための記号定義
LF=$(printf '\\\n_');LF=${LF%_} # sedで改行コードを挿れるための定義

# ----- 本番 -----
sed 's/^\(.*\)$/\1'"$RS"'/'                |
sed 's/"\([^"]*\)"/'"$LF"'"\1"'"$LF"'/g'   |
sed 's/\[\([^]]*\)\]/'"$LF"'[\1]'"$LF"'/g' |
sed '/^["[]/s/[[:blank:]]/_/g'             | # ここに空白の代替文字
sed 'N;$s/\n//g'                           |
sed 's/'"$RS"'/'"$LF"'/g'
```

試しに実行してみると、

```sh:ほらこのとおり
$ cat httpd-access.log | apalognorm.sh
192.168.0.1 - - [17/Apr/2014:11:22:33_+0900] "GET_/index.html_HTTP/1.1" 200 43206 "https://www.google.co.jp/" "Mozilla/5.0_(Windows_NT_6.1;_WOW64)_AppleWebKit/537.36_(KHTML,_like_Gecko)_Chrome/34.0.1847.116_Safari/537.36"
$ 
```

日時列(4列目)、HTTPリクエストパラメーター列(5列目)、User-Agent列(9列目)に含まれているスペースが全て`_`に置換されている。もちろん、列を区切っているスペースはそのままで。

もし、`_`が気に食わないのであれば`*`でも`+`でも、好きな文字列(2文字以上でもいい)を4番目のsedの後半部分に書けばいいだけ。

# 6つのsedは何をやってるのか?

## sed 1号

（加工の都合により、途中で一時的に改行を挿むので）元の改行を別の文字(0x1e)で退避させておく。

## sed 2号

ダブルクォーテーションで囲まれている区間`"～"`があったら、その前後に改行を挿み、その区間を単独の行にする。

## sed 3号

ブラケットで囲まれいる区間`[～]`も同様に、前後に改行を挿んで、この区間を単独の行にする。

## sed 4号

ダブルクォーテーション、またはブラケットで始まる行は、先程行を独立させた区間なので、これらの行にある空白をそうでない文字列に置換する。

## sed 5号

改行を全部取り除く。（これはべつにsedでやる必要ないのだけど）

## sed 6号

退避させていた元々の改行を復活させる。（これもべつにsedでやる必要ないのだけど）

# コマンド化したものをGitHubに置いておいたよ

例によってちゃんとコマンド化したものを[Gistに上げておいた](https://gist.github.com/richmikan/7254345)。ログ解析で困っているなら使ってみてね。スペースの代替文字が`_`では気に入らない人向けに、オプションで指定できるよにしてある本格派だ。

Apacheサーバー管理者は、これで少し幸せになれるかも。

尚、Gistに上げたものは、5号と6号のsedはtrに置き換えているので悪しからず。まぁ、全部sedでやるというのはネタだからねぇ。
TurbolinksとBackbone.jsを共存させるための二行

小ネタ

Backbone.jsのディスパッチにRouterを使うことは良くある。
ページが単純に読み込まれるなら、ページ読み込み時に`Backbone.history.start({pushState: true})`すれば良いのだが、Turbolinksだとリンク辿っても既にstart済みのまま。
かといってBackboneのRouterはpopstateイベントに反応するので、Turblinksでページ遷移してもURL変わるだけでRouterが反応しない。

なので、イベントを足しておく。

```coffee
# hack for Turbolinks
$(document).on "page:load", ->
  Backbone.history.loadUrl()
```

Turbolinksの遷移が完了した際には、とりあえず`loadUrl()`読んでURLを確認する。もしかしたら`checkUrl()`の方が良いかもしれない。

pushStateが使えないブラウザとかは知らんw
uninitialized constant AWS::S3::Base の対処法

# aws-sdk なのか aws-s3 なのか？

```rb
AWS::S3::Base.establish_connection!(
  :access_key_id     => 'REPLACE_ME',
  :secret_access_key => 'REPLACE_ME'
)
```

こういうコード（ウェブにあったサンプル）書いて

```
uninitialized constant AWS::S3::Base
```

と怒られた。「gem で aws のライブラリインストールしてるのに何で？」

このコードは **aws-s3** 用のもので、昔からあった aws-s3 の後に Amazon が公式で出した **aws-sdk** の場合はちょっと違う書き方をする必要があるというもの。わかりにくい！

**aws-sdk** 使うときは↓を見る
http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html
ドキュメント内の配列の長さ一覧を得るクエリ

MongoDBでドキュメントの中の配列の長さを得るには、aggregationフレームワークを使う。

例えば、以下のようなコレクションがあったとして、

```
> db.col.find()
{ "_id" : ObjectId("535007a6b8cc08db967b00d7"), "ary" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("535007a9b8cc08db967b00d8"), "ary" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : ObjectId("535007afb8cc08db967b00d9"), "ary" : [ 1, 2, 3, 4, 5, 6, 7 ] }
```

キー"ary"の値の配列の長さ一覧は、以下のようなクエリで求められる

```
db.col.aggregate(
{ $unwind: '$ary'},
{ $group: { _id: "$_id", length:{$sum:1}}}
);
```

実行結果は以下の通り

```
> db.col.aggregate(
... { $unwind: '$ary'},
... { $group: { _id: "$_id", length:{$sum:1}}}
... ) ;
{
        "result" : [
                {
                        "_id" : ObjectId("535007afb8cc08db967b00d9"),
                        "length" : 7
                },
                {
                        "_id" : ObjectId("535007a9b8cc08db967b00d8"),
                        "length" : 5
                },
                {
                        "_id" : ObjectId("535007a6b8cc08db967b00d7"),
                        "length" : 3
                }
        ],
        "ok" : 1
}
```
django-nose で ImproperlyConfigured が発生した場合の対処法

[django-nose](https://github.com/django-nose/django-nose) は django 標準テストでは難しいカバレッジを取れたりするので重宝してます。
ただ、不可解なエラーが発生してビューが全くテストできない事態が発生してしまい、２～３日悩んだんですが解決方法が全く見つからなかったのでメモしときます。

```
ERROR: Failure: ImproperlyConfigured (The included urlconf project.urls doesn't have any patterns in it)
```

`settings.INSTALLED_APPS` に [django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar) があればコメントアウトしましょう。
Rで自然言語処理。Pixiv小説で単語別の出現数を調べる。

#概要
日本語の形態素解析ツールMeCabを統計処理用言語Rから使う。
RからMeCabを使う事により、
機械学習用パッケージとの連携が期待できる。
Pixiv小説の本文をAPI経由で取得し、単語別の出現数を調べる。

#事前準備
[RCurlのインストール](http://www.slideshare.net/yokkuns/rweb-api)
[RMeCabのインストール](http://www.kkaneko.com/rinkou/textcommand/rmecab.html)

#コード
```r:trymecab.r
library(RCurl)
library(RMeCab)

story <- getURL("http://spapi.pixiv.net/iphone/novel_text.php?id=<Pixiv小説ID>")
txt <- tempfile("txt")
write(story, file = txt)
frq <- RMeCabFreq(txt)
frq.noun <- frq[frq$Info1=="名詞",]
frq.noun <- frq.noun[order(-frq.noun$Freq),]
frq.noun[1:10,]
```

#出力結果（サンプル）
```
       Term Info1        Info2 Freq
846      姫  名詞         一般  150
1190   こと  名詞       非自立   80
1195     の  名詞       非自立   65
725      こ  名詞         一般   60
1076   絵里  名詞     固有名詞   30
1200   よう  名詞       非自立   25
1148 ちゃん  名詞         接尾   20
975    言葉  名詞         一般   15
1023   それ  名詞       代名詞   15
1029     何  名詞       代名詞   10
```

#感想
辞書を鍛える必要性を感じる。
Eclipseで出現箇所のマークの色を変更するのは難易度高い

Eclipseでクラス名や変数などをクリックした際に、出現箇所のマークが表示されるのは非常に便利なのだが、デフォルトやTheme(プラグイン)を設定したときなどで色を変えたいことがよくある。

しかし、設定の場所がまったく直感的でなく、いつも探し回るのでメモ。

設定ウィンドウを表示して、「一般」－＞「エディター」－＞「テキスト・エディター」－＞「注釈」の順に開いて、注釈型の「=>出現箇所」と「=>書き込み出現箇所」から変更出来る。・・・・・ふぅ。

こんなところにあるなんて、絶対、想像でけへん。

ちなみに、背景色だけしか変更出来ないので、Themeを設定している場合はいい感じの色を見つけるのが難しい。未だに納得できてないよぅ。
netsh の port proxy で お手軽パケットキャプチャ

任意のホスト間のパケットをネットワーク構成などを変更せず、お手軽にキャプチャする方法の紹介です。
（パケットキャプチャソフトの使い方については、記載していません。）

## 想定するシーンは？

例えば、HOST-A から HOST-B の 12345番ポートへ接続するような通信のキャプチャを想定してみましょう。

```
[HOST-A]--------------------------------[HOST-B]
        （この間の通信をキャプチャしたい!!）
```

通常であれば、なんとかしてキャプチャするパケットを横取りしてやる必要があります。

 - 経路内にリピーターハブを挟んで、パケットを横取りする。
 - ポートミラーリング機能をもつスイッチングハブを使って、パケットを横取りする。 

```
[HOST-A]----------[リピータHUB]----------[HOST-B]
                       | 
                       |（横取り!!）
                    [HOST-C]
```
HOST-C で HOST-A = HOST-B 間の通信をキャプチャしようとしていますが、
追加の機器や LAN ケーブルを用意したり、配線しなおしたりするのは面倒です。

## どうする？
キャプチャしようとするホスト HOST-C に HOST-A = HOST-B 間のパケットを中継させて、ついでにキャプチャもするようにしてしまいましょう。

```
[HOST-A]-----------[既存のHUB]-----------[HOST-B]
                       | 
                       |
                    [HOST-C]
```

HOST-C は特別な接続は必要とせず、HOST-A と HOST-B と通信できるネットワーク上のどこかに存在すれば OK です。
なんと、同一のブロードキャストセグメントにいる必要すらありません！（ここがお手軽）

## どうやって？
最近の Windows では、標準で port proxy が使えるようになっています。（ここがお手軽）
HOST-C で次の netsh コマンドを実行してみましょう。

```
> netsh interface portproxy add v4tov4 listenport=12345 connectaddress=HOST-B
```

これだけで HOST-C は、自身の 12345番ポートへの接続を、HOST-B の 12345番ポートへフォワードしてくれるようになります。
（注意：フォワードさせるには、IP Helper サービスが開始されている必要があります。）

設定が正常に反映されているか確認してみましょう。

```
> netsh interface portproxy show v4tov4
ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               12345       HOST-B          12345
```

HOST-C 上で 12345番ポートが LISTEN されていることも確認してみましょう。

```
> netstat -na | findstr :12345
  TCP    0.0.0.0:12345     0.0.0.0:0         LISTENING
```

あとは、HOST-A の接続先を HOST-B から HOST-C に変更してやるだけ。
HOST-C 上でキャプチャソフト（WireShark など）を起動させて、どんどんキャプチャしましょう。

## お手軽ポイントのまとめ

1. 追加の機器や LAN ケーブルは必要ありません。
1. 既存の LAN 環境を変更する必要がありません。
1. サードパーティ製のポートフォワード用のソフトの準備は不要です。

## 参考

portproxy 設定を削除するには

```
> netsh interface portproxy delete v4tov4 listenport=12345 connectaddress=HOST-B
```

全ての設定を削除するには

```
> netsh interface portproxy reset
```

設定を確認するには

```
> netsh interface portproxy show v4tov4
```

その他、listenport と connectport を別々に指定することもできたりします。
詳細は、ヘルプで確認できますね。

```
> netsh interface portproxy add v4tov4 help

使用法: add v4tov4 [listenport=]<integer>|<servicename>
              [connectaddress=]<IPv4 address>|<hostname>
             [[connectport=]<integer>|<servicename>]
             [[listenaddress=]<IPv4 address>|<hostname>]
             [[protocol=]tcp]

パラメーター:

       タグ             値
       listenport     - リッスンする IPv4 ポートです。
       connectaddress - 接続する IPv4 アドレスです。
       connectport    - 接続する IPv4 ポートです。
       listenaddress  - リッスンする IPv4 アドレスです。
       protocol       - 使用するプロトコルです。現在、TCP だけがサポート
                        されています。

注釈: IPv4 をリッスンし、IPv4 経由でプロキシ接続するためにエントリを追加
      します。
```
phpのupdateでsessionのpermissionが元に戻る対策

##問題点
CentOSのphpはyum updateにより更新しているが、更新の度に`/var/lib/php/session`のpermissionが nginx / nginxからroot / apacheに戻ってしまう。webサーバにnginxを使っている場合に、sessionにアクセスできなくなりエラーとなる。

##解決策
sessionのフォルダ位置をリセットされないような別の場所に変えるというやり方もあるようだが(未確認)、問題はupdateの際に起こるので、下記のようなaliasを登録してupdateを行うようにする。

> alias yup='sudo yum -C update && sudo chown nginx.nginx /var/lib/php/session'

- `yup`でアップデート後にpermissionが変更されるようになります。
- Cオプションはお好みで
WebStormのGrunt Consoleを利用する

WebStorm 8.0.0でgrunt consoleが実装されました。Gruntfileに定義されたタスクをWebStorm上でGUIから実行できます。  

# grunt-cliのインストール
npmから`grunt-cli`をインストールします。  
`npm install -g grunt-cli`

# 環境変数の追加
WebStormはbashやzshの環境変数は読めないので、 **システムの環境変数** にnodeのパスを通す必要があります。  
nodebrew環境であれば、`/etc/environment`に`~/.nodebrew/current/bin`を追加します。他の環境でも`grunt`にパスが通るようにパスを追加すれば大丈夫だと思います。

# プロジェクトにgruntをインストール
プロジェクトに`grunt`をインストールします。  
`npm install grunt`  

# Gruntfile.jsを追加
これは手作業で`Gruntfile.js`という名前で新規ファイルを追加します。中身はまだ空でいいです。  
`Gruntfile.coffee`でも認識されるようです。

# Open Grunt Console!
WebStormのProjectウィンドウから`Gruntfile.js`を右クリックすると下の方に`Open Grunt Console`を選択します。  
コンソールが開くと、タスクの無い状態で表示されると思います。タスクを`Gruntfile.js`に記述したあとにGruntコンソールの更新ボタンを押すと反映されます。  
![grunt_console.png](https://qiita-image-store.s3.amazonaws.com/0/20253/8932353b-4561-c355-33f6-08f24964af96.png)

# タスクの実行
コンソール左のタスクリストに表示されるタスクをダブルクリックすると右のコンソールで実行されます。
Ruby で Amazon S3 にアップロードするときのアクセス権限 (aws-s3用)

#アクセス権限の種類は4つあるよ

1. private (default です)
1. public_read
1. public_read_write
1. authenticated_read

public_read_write の使い道は良くわからん。誰でも PUT で書き込みできるようにするそうな。ウェブサイトの画像等のストレージに使用するのなら、public_read にする必要あり。デフォルトは private なので、とりあえず保存したら他の人は読めません。

```rb
S3Object.store(
    'kiss.jpg',
    data,
    'marcel',
    :access => :public_read
  )
```
のように書くと、 http://s3.amazonaws.com/marcel/kiss.jpg から読めるようになる。 marcel は backet の名前です。
# すんげー簡単に、LT用スライドを作る方法

あえてスライドだけにした。
SEOきかないんやろうな。。。残念

使ったものは

* REVEAL.JS
* github page

使い方は、以下のスライド（REVEAL.JSで作ってます）

<iframe 
width=640 
height=480 
src="https://shinofara.github.io/#/"></iframe>

github page  
https://shinofara.github.io/#/

http://shinofara.hateblo.jp/
Clojureでtransientをmutableなオブジェクトとして扱ってはいけない

ClojureDocsにも書かれていることですが、以下のコード

```clj
(let [v (transient {})]
  (dotimes [n 5] (assoc! v (keyword (str n)) n))
  (persistent! v))
```

の結果は

```
{:0 0, :1 1, :2 2, :3 3, :4 4}
```

で予想通りかもしれませんが、以下のコード

```clj
(let [v (transient {})]
  (dotimes [n 10] (assoc! v (keyword (str n)) n))
  (persistent! v))
```

の結果は

```
{:0 0, :1 1, :2 2, :3 3, :4 4, :5 5, :6 6, :7 7}
```

となります。

`assoc!`などの関数は、元のオブジェクトを変更するとは限りません。
coocs2d-x rc0 EventListenerPhysicsContact が機能しない

底辺のQに答えるブログだよ！（主に自分のため）

betaではonContactBegin = CC_CALLBACK_2だったところが、onContactBegin = CC_CALLBACK_1にしないといけないのは良いとして、PhysicsBody に setContactTestBitmask(0xFFFFFFFF) てな感じで判定フラグを立てないといけないらしい。

今までデフォルトで必要なかったじゃん！
情弱情弱ゥ
【Unity】バイオハザード風の動きをするscriptとカメラについて

# はじめに
ネタが無い！っていうか思いつかない！
でも何か書きたい！ので書きます。
使ってる前提で書いちゃいます。tips系ですね。

# バイオハザード風の動きをするコントローラー
バイオハザートと言っても４〜のド派手なアクションではなく、
１〜３のあの動きになります。
コントローラーの上下で前後、左右で向きを変える、という挙動です。
UnityScriptで書いちゃってますが、C# , Booでも基本同じです。

```js:CharacterController_Bio.js
#pragma strict

public  var speed : float = 3; 
private var direction : Vector3 = Vector3.zero;
private var playerController : CharacterController;
private var animator : Animator;

function Start() {
	playerController = GetComponent( CharacterController );
	animator = GetComponentInChildren( Animator );
}

function Update() {
	if( playerController.isGrounded ) {
		// 上下キーが押されたら
		if(Input.GetAxis("Vertical") != 0){
			var varticalMove = Input.GetAxis("Vertical");
			animator.SetFloat("Speed" , varticalMove);

			direction = new Vector3(0 , 0 , varticalMove);
			direction = transform.TransformDirection(direction);
			direction *= speed;
		}

		// 左右キーが押されたら
		if(Input.GetAxis("Horizontal") != 0){
			transform.Rotate(0 , 100 * Time.deltaTime * Input.GetAxis("Horizontal") , 0);
		}
	}
	direction.y += Physics.gravity.y * Time.deltaTime;
	playerController.Move( direction * Time.deltaTime ); 
}
```

# カメラはどうする？
カメラは標準のSmoothFollow.jsでもいいでしょう。左右の回転をカメラがちゃんと追ってくれます。
もし、自分でカスタムしたい場合のためにソース置いときます。自分はコッチ使ってます。
（毎回パラメータいじるのめんどいので）

```js:SmoothFollow_Bio.js
#pragma strict

var target : Transform;
var distance = 3.0;
var height = 2.0;
var heightDamping = 0;
var rotationDamping = 1.0;
 
function LateUpdate () {
	if (!target) return;
	 
	// Calculate the current rotation angles
	var wantedRotationAngle = target.eulerAngles.y;
	var wantedHeight = target.position.y + height;
	 
	var currentRotationAngle = transform.eulerAngles.y;
	var currentHeight = transform.position.y;
	 
	// Damp the rotation around the y-axis
	currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
	 
	// Damp the height
	currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);
	 
	// Convert the angle into a rotation
	var currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);
	 
	// Set the position of the camera on the x-z plane to:
	// distance meters behind the target
	transform.position = target.position;
	transform.position -= currentRotation * Vector3.forward * distance;
	 
	// Set the height of the camera
	transform.position.y = currentHeight;
	// Always look at the target
	transform.LookAt (target);
}
```

暗い洋館を探索するUnityちゃんがバイオハザードごっこをしている様子です。
![スクリーンショット 2014-04-17 23.02.34.png](https://qiita-image-store.s3.amazonaws.com/0/26453/4b44d860-2b6a-46ca-0aef-cbb1fd0040b4.png)

こんなんでいいのかよ！もっとこうあるだろ…！複数のライティングはコスト高いからモバイルでは気をつけろ！とか…。上手いこと説明出来るようにまとめてからまた書きます。

以上
.gitignoreに書いてあるけれどもインデックスされているファイルの一覧を取得する


.gitignoreの中身を見直そうと思い、スクリプトを書いた。
(.gitignoreの行数 × git ls-filesの行数) 回のgrepをするので結構時間がかかるけれども、目的は果たせたので可とする。

```sh:git-ls-force-indexed.sh
#!/bin/sh

GITIGNOREPATH=`git rev-parse --show-toplevel`'/.gitignore'

if [ $? -ne 0 ]
then
    exit $?
fi

if [ ! -f $GITIGNOREPATH ]
then
    echo $GITIGNOREPATH' does not exist.'
    exit 1
fi

for indexed in `git ls-files`
do
    for ignored in `cat ${GITIGNOREPATH} | grep -v '^#'`
    do
        if [ `echo /${indexed} | grep -F ${ignored}` ]
        then
            echo $indexed
        fi
    done
done
```
Nokogiri 初心者用あれこれ：忘れたときに思い出すためのまとめ

# マッチしない時の戻り値は empty で検証する

html.xpath でマッチしない場合の戻り値は nil じゃなくて empty

```rb:hoge.rb
hoge = html.xpath('//div[@class="hoge"]')
```

なら、hoge.empty で検証する。

# n番目の要素は0じゃなくて1から始まる

```rb:hoge.rb
hoge = html.xpath('//div[@class="hoge"][1]')
```

なら、class="hoge" になってる、div要素の最初のものを戻すよ。[0]って書いたら駄目だよ。

**TODO この投稿を綺麗にマークダウン**
一行で正規表現の非破壊置換

よく知られてそうなテクニック（？）の一つ

```pl:reg.pl
use strict;
use warnings;

my $foo = "foo";

# 普通に書くと変数に入れるので2行かかる
my $bar = $foo;
$bar =~ s/foo/bar/;
print "$foo $bar\n";

# こうすれば1行で済む
(my $baz = $foo) =~ s/foo/baz/;
print "$foo $baz\n";

__END__
foo bar
foo baz

```
homebrew で入れたfindutils binutils coreutilsのsymlinkを~/binに作る

homebrew で入れたfindutils binutils coreutilsのsymlinkを~/binに作る

あとは.zshrcとかで$HOME/binにPATHを通してあげればいい
(PATHは先頭に通しておく)

<pre>
#! /usr/bin/env zsh
#-*- coding: utf-8 -*-
mkdir -p ~/bin
for package in findutils binutils coreutils
do
    for filepath in `find $(brew --prefix $package)/bin -type f -print`
    do
        name=`basename $filepath`
        name=${name#g}
        ln -s $filepath ~/bin/$name
    done
done
</pre>
CentOS 6.5 で OpenLDAP（2）OpenLDAPサーバー インストールと設定

## インストール
```shell-session
yum -y install openldap-servers openldap-clients
```
> OpenLDAPサーバーにデータを登録する際の「ldapadd」コマンドや検索用の「ldapsearch」コマンドは「openldap-clients」パッケージに入っている
> そのため、OpenLDAPサーバーのみであっても、「openldap-clients」パッケージもインストールしておくこと

## 初期設定削除
```shell-session
rm -rf /etc/openldap/slapd.d/*
rm -rf /var/lib/ldap/*
```

## 設定ファイルのコピー
```shell-session
cp -a /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
cp -a /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
```

## マスターパスワード作成
```shell-session
slappasswd -s pass
```
>
```shell-session
{SSHA}fCkF7qPmO1cnQsPun1fixcrhCNP+Kerd
```

## 設定ファイル編集
```shell-session:/etc/openldap/slapd.conf
# スキーマファイル設定
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema

# 接続プロトコル
allow bind_v2

# 管理ファイル
pidfile     /var/run/openldap/slapd.pid
argsfile    /var/run/openldap/slapd.args

# TLS設定
#TLSCACertificatePath  /etc/openldap/ssl/cacert.pem
#TLSCertificateFile    /etc/openldap/ssl/server.crt
#TLSCertificateKeyFile /etc/openldap/ssl/server.key

# userPasswordに関するアクセス権
access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=example,dc=com" write
    by anonymous auth
    by * none

# その他の属性に対するアクセス権
access to *
    by self write
    by dn="cn=Manager,dc=example,dc=com" write
    by * read

# monitorデータベースに対するアクセス権
database monitor
access to *
    by dn.exact="cn=Manager,dc=example,dc=com" read
    by * none

# データベース設定
database    bdb
suffix      "dc=example,dc=com"
checkpoint  1024 15
rootdn      "cn=Manager,dc=example,dc=com"
rootpw      {SSHA}fCkF7qPmO1cnQsPun1fixcrhCNP+Kerd
directory   /var/lib/ldap

# indexの設定
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub
```

## 設定のテスト
```shell-session
sudo -u ldap slaptest -u -v -f /etc/openldap/slapd.conf
```
>
```shell-session
config file testing succeeded
```

## /etc/openldap/slapd.d/ の更新
```shell-session:
sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
```
> エラーが出るが無視する
>
```shell-session
bdb_db_open: database "dc=example,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
backend_startup_one (type=bdb, suffix="dc=example,dc=com"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)
```

## LDAP起動
```shell-session
/etc/init.d/slapd start
chkconfig slapd on
```
MacでH2を使う。


#H2をダウンロード
↓こちらから
http://www.h2database.com/html/main.html

![オープン](http://f.cl.ly/items/2l1e2E453n1E033b2W1U/2014-04-15_10_48_42.png)

Macの場合All Platformsのzipですね。

ダウンロードしたzipを解凍してどっかに配置。
私はApplicationディレクトリ内に配置しました。

↓このような内容ですね。
![オープン](http://f.cl.ly/items/111D2s2L1j0m1y15290V/2014-04-15_11_00_21.png)


#起動
起動はbinの中のシェルを実行してあげます。

```shell
$ pwd
/Applications/h2/bin
$ ./h2.sh
```

ブラウザが開いた。
![オープン](http://f.cl.ly/items/04010T0H3A1i2b3n0p1i/2014-04-15_20_41_44.png)


なので、URLをlocalhostにしてみた。OK。
![オープン](http://f.cl.ly/items/3S3Z2F3s3i1R1g2O0I0t/2014-04-15%2020.45.40.png)


あとは、connectしてあげれば、指定の位置にDBのファイルを作ってくれます。この場合は、~/testディレクトリに作ってくれます。

以上。
ターミナルで使える色と色番号を一覧にする


vim の colorscheme をカスタマイズするのに色番号一覧が欲しいなと思いました。
さらに iTerm2 の Color 設定が反映されている状態の色を知りたかったので、まるっきりこちらのブログの記事を参考にターミナル上で色一覧を生成。

* [VimLで色指定する数値の一覧 | Inhale n' Exhale](http://h2plus.biz/hiromitsu/entry/674)

Ruby で書きました。

```rb:termcolor.rb
# -*- coding: utf-8 -*-

@fg = "\x1b[38;5;"
@bg = "\x1b[48;5;"
@rs = "\x1b[0m"

def color(code)
  number = '%3d' % code
  "#{@bg}#{code}m #{number}#{@rs}#{@fg}#{code}m #{number}#{@rs} "
end

256.times do |n|
  print color(n)
  print "\n" if (n + 1).modulo(8).zero?
end
print "\n"
```

実行するとこんな感じ。

![実行例](https://www.evernote.com/shard/s16/sh/6363093d-9fe0-4d3f-8877-632d80773f1e/bcc880c1647909a4e20c3bd0bf6b4798/deep/0/termcolor.png)
CentOS 6.5 で OpenLDAP（1）サーバー準備

## サーバーとクライアントの準備
[CentOS 6.5 インストール手順 - Qiita](http://qiita.com/T_Tsan/private/ade6fa6b7d196854a47b)
[CentOS 6.5 初期設定 - Qiita](http://qiita.com/T_Tsan/private/44845646058732fd4b98)
上記2つを参考に、2つのCentOSマシンを作成する。
ホスト名やIPアドレスは、

| ホスト名 | IPアドレス | 役割 |
|---|---|---|
| ldap.example.com | 192.168.0.10 | LDAPサーバー |
| client.example.com | 192.168.0.20 | LDAPクライアント |

とする。

また、LDAPサーバー、LDAPクライアントとは別に、同一ネットワーク内にてWindowsクライアントマシンがあるものとする。
WindowsクライアントマシンからLDAPサーバー、LDAPクライアントにSSHで接続して設定をしていくものとする。
LinuxユーザーをLDAPで管理する前提なので、SSH接続は当初はrootで行う。
Clojureでglobでのファイル検索

Clojureでのglobによるファイル検索はこんな感じでできます。
Java7から入ったjava.nio.fileパッケージを使います。

```glob.clj
(require '[clojure.java.io :as io])
(require '[clojure.string :as s])
(import '[java.nio.file FileSystem FileSystems])
(import '[java.io File])

(def file-separator (System/getProperty "file.separator"))

(defn files-glob [dir glob]
  (let [dir (io/as-file dir)
        path (str "glob:" (.getPath (io/file dir glob)))
        path (if (= file-separator "\\") (s/replace path "\\" "\\\\") path)
        m (.. ^FileSystem (FileSystems/getDefault) (getPathMatcher path))]
    (filter #(.matches m (.toPath ^File %)) (file-seq dir))))
```

```
(files-glob "." "**/*.clj")
```
gem browser でゲームプラットフォームを判定する

[gem browser](https://github.com/fnando/browser)はRuby on RailsやSinatraなどのWebアプリで閲覧者の使っているブラウザを判定したい時に便利です。
一般的なブラウザ（IEやFireFox等）の判定以外にも、PlayStationやXBoxの判定機能がいつの間にか実装されていました。

例えばSinatraならば以下のように使えるようです。

```app.rb
require 'sinatra'
require 'browser' # >= 0.4.0

get '/' do
  browser = Browser.new ua: request.env['HTTP_USER_AGENT'] 
  client = case
  when browser.playstation? || browser.psp?  then 'PlayStation'
  when browser.firefox? then 'FireFox'
  when browser.ie? then 'IE'
  else 'InterNet'
  end

  "you are #{client} user !!"
end

```

アプリを起動して```http://192.168.xx.xx:3456```などにプレステのブラウザからアクセスすると「you are PlayStation user !!」と表示されます。

javascriptで実装したゲームをWebアプリとして公開する際に、プレステやXboxなどのプラットフォーム間での差異を吸収するのに使えそうですね！！　ものすごいニッチな需要ですが。
READMEには書かれていないので、もしかしたらそのうち消えることもあるのかも…

なお[sinatra-support](https://github.com/sinefunc/sinatra-support)で、ほとんど同じインターフェイスのbrowser判定が提供されていますが、ゲームプラットフォームには未対応のようです。
ThinReportsで複数レイアウトを使って一覧表を作成する

ThinReportsで、reportの作成方法やpageの作成方法はいくつも書き方があるので、
自分の使った書き方をメモ。

* 同一ファイル内に複数レイアウトを使用
* 一覧表を使用
* 一覧表のフッタに合計を表示

```rb
user_contents = { user_name: 'ユーザー名', user_address: 'sample@example.com' }

report = ThinReports::Report.create do |r|
  # ユーザーページレイアウト
  r.start_new_page :layout => File.join(Rails.root, 'app', 'reports', 'user.tlf') do |page|
    page.values(user_contents)
  end
  
  # 本一覧ページレイアウト（表id: details）
  r.start_new_page :layout => File.join(Rails.root, 'app', 'reports', 'books.tlf') do |page|

    # フッタ作成時の処理
    page.layout.config.list(:details) do
      use_stores :total_cost => 0
      events.on :footer_insert do |e|
        e.section.item(:total_cost).value(total_cost)
      end
    end

    # リスト作成処理
    @books.each do |book|
      book_contents = {title: book.title, cost: book.cost}

      page.list(:details).add_row(book_contents)
      page.list(:details).store.total_cost += cost
    end
  end
end

send_data report.generate,
  filename: 'report.pdf',
  type: 'application/pdf',
  disposition: 'attachment'
```
Laravelのartisanでバッチ処理

Laravelでバッチ処理を書いた時のメモ

■artisanに登録する
app/start/artisan.php

```php:artisan.php
Artisan::add(new \commands\TestCommand());
```


■処理を記述
app/commands/TestCommand.phpに処理を記述
・Illuminate\Console\Commandを継承する
・fire()にメイン処理を記述する
・getArguments()に引数の設定を記述
・getOptions()にオプションの設定を記述

```php:TestCommand.php
namespace commands;

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use models\batch\BatchTestModel;

class TestCommand extends Command
{
    protected $name = 'batch:test';
    protected $description = 'アーティザンのテスト';

    public function fire()
    {
        // 全ての引数を取得する
        $argument = $this->argument();

        // 引数を全て表示してみる
        $this->info(json_encode($argument));

        // Modelを呼び出してみる
        $exec = new BatchTestModel();
        $exec->execute($argument());

    }


    /**
     * 受け取る引数の設定
     * @return array
     */
    protected function getArguments()
    {
        return [
            ['argument1', InputArgument::REQUIRED, '引数の説明・・・必須'],
            ['argument2', InputArgument::OPTIONAL, '引数の説明・・・任意']
        ];
    }

    /**
     * 受け取るオプションの設定
     * @return array
     */
    protected function getOptions()
    {
        return [
            ['example1', 'e', InputOption::VALUE_REQUIRED, 'オプションの説明・・・必須'],
            ['example2', 'f', InputOption::VALUE_OPTIONAL, 'オプションの説明・・・任意']
        ];
    }
}
```

■artisanコマンドで処理を実行する

```
$ php artisan batch:test --example1 option1 -f option2 value1 value2
{"command":"batch:test","argument1":"value1","argument2":"value2"}
["option1","option2"]
```



------おまけ------
■使用できるartisanコマンドの一覧を表示してみる
TestCommand.phpの
・protected $name
・protected $description
で設定した内容が一覧表示される。

```
$ php artisan list
・・・省略
batch
  batch:test                  アーティザンのテスト
```

■ヘルプを表示
helpコマンド打つとTestCommand.phpの内容を読み取り使用方法が出力される

```
$ php artisan batch:test --help

Usage:
 batch:test [-e|--example1="..."] [-f|--example2[="..."]] argument1 [argument2]

Arguments:
 argument1             引数の説明・・・必須
 argument2             引数の説明・・・任意

Options:
 --example1 (-e)       オプションの説明・・・必須
 --example2 (-f)       オプションの説明・・・任意
 --help (-h)           Display this help message.
・・・以下省略
```
MEAN という言葉が示すもの

今日気づいて調べていて、最初意味が分からず困っていた「MEAN」という言葉。
日本語の”示す”かと思いきや、実は、

* MongoDB
* Express
    * http://expressjs.com/ 
* AngularJS
* Node.js

という要素の造語だったぽい。
ひとまず、自分が好きになりつつあるはやりを掛け合わせた造語に出会って、うれしさのあまり投稿。

## 参考URL

http://meanjs.org/generator.html#overview
http://www.mean.io/#!/
http://blog.mongodb.org/post/49262866911/the-mean-stack-mongodb-expressjs-angularjs-and


（さんざんAngularJSとか言っておいて、ちょっと恥ずかしい）
Everyplayプレハブ生成直後の録画可能端末の判定

録画をサポートしている端末のみ表示したいUIがあったので簡単に対応しようとした所、
IsRecordingSupported()の挙動について微妙にハマったのでメモ程度に書いておく。

```csharp:RecTest.cs
void Start()
{
  if( Everyplay.SharedInstance.IsRecordingSupported() )
  {
    // UI表示処理
  }
}
```

このような形で実装していたのだが、対応端末でもUIが表示されなかった。  
公式のドキュメントを見ても特に注意事項などが記述されていなかったので少し調べた所、
*ReadyForRecording*のイベントを待ってから参照すれば良い的な事が書かれていた。


```csharp:RecTest.cs
void OnEnable()
{
  Everyplay.SharedInstance.ReadyForRecording += this.OnReadyForRecording;
}

void OnDisable()
{
  Everyplay.SharedInstance.ReadyForRecording -= this.OnReadyForRecording;
}

void OnReadyForRecording()
{
  if( Everyplay.SharedInstance.IsRecordingSupported() )
  {
    // UI表示処理
  }
}
```

非対応端末でUIが表示されず、対応端末でUIが表示されたので多分大丈夫っぽい。

参考: http://stackoverflow.com/questions/22898985/everyplay-isrecordingsupported-is-false-on-android-nexus-5
Objective-Cで変数へのアクセス速度を比較してみた

### 概要
Objective-Cでは、プロパティを使って変数を宣言すると、その変数へのアクセス方法が２種類あると思うのですが、実際どっちのほうがアクセス処理が速いのかを簡単なプログラムで計測してみました。  

### アクセス方法  
　• 直接インスタンス変数にアクセスする。  
　• プロパティ経由（ゲッタ）経由でアクセスする。  

### テスト内容
.hファイルで宣言したNSString型の変数に.m内で、同じ型の変数に代入する処理を1000回する間の処理速度を計測する。

### 実行環境  
• Mac Book Air
OS X version10.9.2
プロセッサ : 1.8GHz Intel Core i7
メモリ : 4GB  
• Xcode
version 5.1

### プログラム

以下に計測に使ったコードです。

~~~hoge.h
@property(nonatomic,copy)NSString *str;
~~~  

~~~hoge.m

NSString *temp = @"";
_str = @"hoge";

NSDate *startDate = [NSDate date];

for(int i = 0;i<1000;i++){
	temp = _str; //変数に直接アクセス
	//temp = self.str; //プロパティ経由でアクセス
}

NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:startDate];
NSLog(@"time is %lf (sec)", interval);

~~~  

  
### 実行結果
それぞれ１０回計測した結果を示します。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/11781/e4f54a68-d4e1-33d6-3a94-ce8aa0e7bedd.png)  
  
変数に直接アクセスしたほうが約６倍速いという結果になりました。
変数の値を参照するだけであれば、直接アクセスしたほうが良さそうです。
Python から Oracle DB にアクセスする


## 1.Instant Client Downloads for Linux x86-64をインストール
[Instant Client Downloads](http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html "Instant Client Downloads for Linux x86-64")から、以下をダウンロード

- oracle-instantclient-basic-10.2.0.5-1.x86_64.rpm 
- oracle-instantclient-devel-10.2.0.5-1.x86_64.rpm
- oracle-instantclient-sqlplus-10.2.0.5-1.x86_64.rpm

ダウンロードしたら、rpmパッケージをインストールします。

```bash
$ sudo rpm -ivh oracle-instantclient-basic-10.2.0.5-1.x86_64.rpm 
$ sudo rpm -ivh oracle-instantclient-devel-10.2.0.5-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient-sqlplus-10.2.0.5-1.x86_64.rpm
```


## 2.環境変数の設定
### 2-1.ORACLE_HOME の設定
```bash
export ORACLE_HOME=/usr/lib/oracle/10.2.0.5/client64
```
### 2-2.PATH の設定
```bash
export PATH=$PATH:$ORACLE_HOME/bin
```
### 2-3.include の設定
```bash
sudo ln -s /usr/include/oracle/10.2.0.5/client64 /usr/lib/oracle/10.2.0.5/client64/include
```
### 2-4.ld の設定
```bash
$ sudo vim /etc/ld.so.conf.d/oracle.conf
```
以下を書き込みます。
> /usr/lib/oracle/10.2.0.5/client64/lib/

保存したら、次のコマンドを実行

```bash
$ sudo /sbin/ldconfig
```

## 3.cx_Oracle をインストール
```bash
$ /usr/local/python2.7/bin/python setup.py build
$ sudo cp build/lib.linux-x86_64-2.7-10g/cx_Oracle.so /usr/local/python2.7/lib/python2.7/site-packages/
```

## 4.接続の確認
```bash
$ /usr/local/python2.7/bin/python
>>>import cx_Oracle
>>>
```

## 参考
[偏った言語信者の垂れ流し](http://d.hatena.ne.jp/nullpobug/20140109/1389236173 "UbuntuでPythonからcx_Oracleモジュールを使ってOracle Database 11gに接続する")
RubyからMacの通知センターで通知する簡単な方法 (AppleScript)

(追記: 2015/2/25 今見ると変なコード書いてるので書き直したいけど書き直さないでしょうね)

Rubyで通知させたかったので簡単な方法を調べました。
Rubyっていうか、ただのAppleScriptです。

# AppleScript
Marvericksから、AppleScriptで通知センターに通知できるようになりました。

```notification.scpt
display notification "めっせーじ"
```
![スクリーンショット 2014-04-17 18.19.27.png](https://qiita-image-store.s3.amazonaws.com/0/18902/a10c8187-a154-b55c-504f-96e5800d7cf2.png)


オプションとしてタイトル、サブタイトル、音を指定できます。
それ以外は変更できません。アイコンとかも。

```notification_with_options.scpt
display notification "めっせーじ" with title "たいとる" subtitle "さぶたいとる" sound name "Purr"
```
![スクリーンショット 2014-04-17 18.19.37.png](https://qiita-image-store.s3.amazonaws.com/0/18902/0b9ad160-2057-9541-2528-6b0a323b4fde.png)

通知センターではこんな感じ。消去は×ボタン。
クリックするとAppleScriptエディタが立ち上がります。(変更不可)
![スクリーンショット 2014-04-17 18.20.47.png](https://qiita-image-store.s3.amazonaws.com/0/18902/f7144f27-92a2-b5e4-a2f5-fbc52b238006.png)

使い方は「AppleScriptエディタ」の以下を参照。

[ ファイル > 用語説明を開く > StandardAdditions.osax > User Interaction > display notification]
>display notification v : Display a notification. At least one of the body text and the title must be specified.
>  display notification [text] : the body text of the notification
>    [with title text] : the title of the notification (default is the name of the calling application).
>    [subtitle text] : the subtitle of the notification
>    [sound name text] : the name of the sound to play

# Ruby
で、Rubyから利用する簡単な方法はシェルから`osascript`コマンドを実行する方法と思います。
Rubyみたいに`-e`オプションをつければ、文字列をAppleScriptとして実行できます。

```shell-session:Terminal
osascript -e 'display notification "hello"'
```
「\`\`」を使えば、そのままの形でRubyで実行可能。

```rb:notification_test.rb
`osascript -e 'display notification "hello"'`
```

メソッドにしてみます。
こっちはコマンドの実行を「\`\`」でなく`system`メソッドにしました。

```rb:notification
def notification(message, title:"Ruby", subtitle:"", sound:"")
  [message, title, subtitle, sound].each{|arg| arg.gsub!(/"/, '\\\\\"')}

  scpt = 'display notification "%s"' % message
  scpt << ' with title "%s"' % title
  scpt << ' subtitle "%s"' % subtitle unless subtitle.empty?
  scpt << ' sound name "%s"' % sound unless sound.empty?

  system %|osascript -e "#{scpt.gsub(/"/, '\"')}"|
end

# ダブルクォーテーション、シングルクォーテーションが問題なく使えること確認
notification %q|"I thought what I'd do was, I'd pretend I was one of those deaf-mutes."|, sound:'Glass'

```

AppleScriptの文字列にはダブルクォーテーションしか使えません。
だからosascriptに渡す文字列はシングルで囲おうと思ったんですが、シェルでシングルをエスケープするのがやたらめんどくさかったのでいっそぜんぶダブルにしました。
(参考: [bashなどのshellでシングルクオートをエスケープする方法 - 中野智文](http://blog.goo.ne.jp/nakano-tomofumi/e/8dd371f5fd1b4dfa69517394ff4988c6))

動かなかった場合はコメントいただけると助かります。
## sound nameについて
`sound name`は省略した場合、音がなりません。
存在しない音を指定するとデフォルトの音(トライトーン)が鳴ります。

音には[システム環境設定 > サウンド > サウンドエフェクト]にある名前を指定します。
ただ、トライトーンはそこにないので、他にも指定できる音があるのかもしれません。(情報求ム)

代わりに`say "hello"`とかやって喋らせるのもいいかもです。

# 参考
[Mavericksでは通知センターをスクリプトから使えるようになった | Blog by msyk](http://blog.msyk.net/?p=181)
[Mavericksでrequire 'osx/cocoa'が出来ない - rcmdnk's blog](http://rcmdnk.github.io/blog/2013/10/23/computer-mac/)