OmniAICreator/Qiita-1.07M huggingface dataset:
android-ndk-profiler を使ってみた

# はじめに
http://code.google.com/p/android-ndk-profiler を使用して profile をとってみます
詳細については [Usage] (http://code.google.com/p/android-ndk-profiler/wiki/Usage)をご参照ください。

## 変数の定義
`$PATH_TO_ANP`: 展開した android-ndk-profiler をおいたディレクトリへのパス
`$LIBNAME`:  ライブラリ名
`$PATH_TO_PROJECT`: プロジェクトディレクトリへのパス

# 環境設定
## ダウンロードと展開
[ここ](http://code.google.com/p/android-ndk-profiler/downloads/list)から現在最新の android-ndk-profiler-v3.2.zip を取得

```shell-session:展開
$ cd $PATH_TO_ANP
$ unzip android-ndk-profiler-v3.2.zip
```

## Android.mk の編集
プロファイルを取りたいライブラリの Android.mk に android-ndk-profiler をリンクするための記述をする

```mf:Android.mk
LOCAL_CFLAGS := -pg
LOCAL_STATIC_LIBRARIES := android-ndk-profiler
```
Android.mk 末尾に下記を追加

```mf:Android.mk

$(call import-add-path,$PATH_TO_ANP)
$(call import-module,android-ndk-profiler)

```

# 使い方

プロファイルを取りたい箇所を monstartup と moncleanup で囲むだけ

```cpp:test.cpp
#include <prof.h>

/* 測定開始*/
monstartup("$LIBNAME");

/* 何らかの処理*/

/* 測定終了*/
moncleanup();


```

# 結果の取得
プログラム実行後 `/sdcard/gmon.out` として結果が出力されます。

```shell-session:結果の取得

$ adb pull /sdcard/gmon.out

```

Android Application のプロセスから実行する場合 AndroidManifest.xml に下記の記載が必要になります。
`<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />`

# 解析

下記コマンドで確認できます。

```shell-session:解析

$ arm-linux-androideabi-gprof $PATH_TO_PROJECT/obj/local/armeabi(-v7a)/$LIBNAME gmon.out

```

# おまけ
[graphviz](http://www.graphviz.org/) と  [Gprof2Dot](http://code.google.com/p/jrfonseca/wiki/Gprof2Dot) を使うと簡単に可視化できました。

```shell-session:gpof2dot

$  arm-linux-androideabi-gprof $PATH_TO_PROJECT/obj/local/armeabi(-v7a)/$LIBNAME gmon.out | gprof2dot.py | dot -Tpng -o output.png

```
パスワードなどを暗号化してcommitする


背景
-----

railsなどの開発をしていると、SNS連携したりDBに接続したりするときに、パスワードやSecretKeyなどのような「公開してはいけない情報」を扱うことがあります。これを普通に git などに Commitしてしまうと不都合があるわけで、通常はそういうファイルを .gitignore などで除外しておきます。

しかし、ライトなプロジェクトをJenkinsなどでDeployしているときは、一緒にCommitしてしまっておくほうが便利なわけで、なかなかジレンマがあるところです。

そこで、パスワードなどを暗号化した上でCommitして、Deploy時に復号化するような仕組みをちょっと作りました。

仕組みの概要
-----

* パスワードは **secrets.json** というファイルにJSON形式で記述して、アプリケーションはこれを読むようにする
* .gitignore に **secrets.json** を追加しておき、commit しないようにする
* **bin/crypt** で暗号化して、**bin/decrypt** で復号化する


```sh:bin/crypt
#!/bin/sh

cd $(dirname $0)
cd ..

PTN='secrets.json'

bash -c "echo -n 'Master Password: '"
read -s password1
echo
bash -c "echo -n 'Master Password confirmation: '"
read -s password2
echo

if [[ $password1 != $password2 ]]; then
    echo "passwords are not matching!"
    exit 1
elif [[ $password1 == "" ]]; then
    echo "Empty Password!"
    exit 1
fi

password=$password1

for filename in `find . -name "$PTN"`
do
    out=${filename}.crypted
    openssl enc -e -aes-256-cbc -in $filename -out $out -k "$password"
    echo crypt to $out
done
```


```sh:bin/decrypt
#!/bin/sh

set -e -a

cd $(dirname $0)
cd ..

PTN='secrets.json.crypted'

bash -c "echo -n 'Master Password: '"
read -s password
echo


for filename in `find . -name "$PTN"`
do
    out=${filename/.crypted/}
    openssl enc -d -aes-256-cbc -in $filename -out $out -k "$password"
    echo decrypt to $out
done
```

使い方
--------

### 暗号化するとき
パスワードを secrets.json に書いて、bin/crypt を実行。パスワードを聞かれるので入力する。

```
% bin/crypt
Master Password: 
Master Password confirmation: 
crypt to ./config/secrets/development/secrets.json.crypted
crypt to ./config/secrets/production/secrets.json.crypted
crypt to ./config/secrets/test/secrets.json.crypted
```

**secrets.json.crypted** というファイルが作られるので、これをCommitする。

### 復号化するとき

```
% echo <PASSWORD> | bin/decrypt
もしくは単に
% bin/decrypt
として、
Master Password: 
decrypt to ./config/secrets/development/secrets.json
decrypt to ./config/secrets/production/secrets.json
decrypt to ./config/secrets/test/secrets.json
```

となり、secrets.json が復元されます。

JenkinsなどでDeployするときは、前者の方法が便利です。
PythonからMySQLを使う

そろそろオワコン感が出てきそうなMySQLですが、
まだ普通に使うのでPythonからの使い方をメモっておきます。

##ライブラリのインストール

MySQL-pythonを使います。
ちなみにこのライブラリはMariaDBにも対応しているらしいです。

```py:
pip install MySQL-python
```

debian系でエラーになる場合は
`apt-get install python-dev`
を実行すると解決する可能性があります


##使い方
```py:
import MySQLdb
# DBへログイン
# localhostの場合は省略可
connection = MySQLdb.connect(db="test",user="test")

cursor = connection.cursor()
# SQL
cursor.execute("select * from users")
result = cursor.fetchall()

for row in result:
 p row[0]

cursor.close()
connection.close()
```

で、rowとしてSQL文の実行結果を1行づつ配列として取得できます。
また、MySQLdb.connectに`cursorclass=MySQLdb.cursors.DictCursor`を指定すると、
rowがカラム名と値の辞書になります。
MySQL Workbench で日本語フォントを使う方法


MySQL Workbench のデフォルトのフォントが英字フォントのため日本語が表示できない。
日本語を表示するためには、日本語のフォントに変更する必要があるが、その方法が分かりにくかったのでメモ。

１．Preferences… を開く

![スクリーンショット 2013-07-02 12.43.07.png](https://qiita-image-store.s3.amazonaws.com/0/8219/82ebffaa-2a4b-f0da-8493-e1183cc8cee8.png "スクリーンショット 2013-07-02 12.43.07.png")

2．Appearance タブを選択

![スクリーンショット 2013-07-02 12.43.39.png](https://qiita-image-store.s3.amazonaws.com/0/8219/33875b04-160d-ffb0-a25d-8b5ec6792aec.png "スクリーンショット 2013-07-02 12.43.39.png")

３．フォントを変更したい箇所にフォーカスを当てて[Enter]キーを押す

すると下記のようにフォント名が変更できるようになります。

![スクリーンショット 2013-07-02 12.43.48.png](https://qiita-image-store.s3.amazonaws.com/0/8219/c071dc5a-aeb8-374b-38a4-0f09d4a6340d.png "スクリーンショット 2013-07-02 12.43.48.png")

一度、変更したい行を選択した後、シングルクリック（ダブルクリックではなく!!）でも変更できます。

分かりにくい…


## 参考

http://dev.mysql.com/doc/workbench/en/wb-preferences-appearance.html
UpstartでのJenkins Slaveの起動設定メモ

前提
-----

*  jenkinsユーザが作られているとします
* `JENKINS_WORKSPACE` を `/development/jenkins-workspace` とします
	*  Owner は ユーザjenkinsとします
* Jenkins MasterがIP＝`10.0.0.220` で起動しているとします


（追記 2013/10/02)

* saturday06@githubさんからご指摘を頂きましたが、Upstart1.4からはsetuid/setgid などを使ってもっと簡単にかけます。ただ、AmazonLinux(2013.03)ではUpstartのVersionga0.6くらいなのでこのような書き方になっています。早くUpstartのVersionが上がると良いんですが。

設定
-----
まず、Jenkins Master から slave.jar を取得しておきます。

```
cd $JENKINS_WORKSPACE
wget http://10.0.0.220:8080/jnlpJars/slave.jar
```

次に以下の様な起動スクリプトを作っておきます。ちゃんとJenkins Userで起動してMasterに接続できるか確認しておきましょう。

```$JENKINS_WORKSPACE/start_jenkins.sh
#!/bin/sh

cd $(dirname $0)
exec java -jar slave.jar -jnlpUrl http://10.0.0.220:8080/computer/MyJenkinsNodeName/slave-agent.jnlp
```

次に、/etc/init/ の下に jenkins.conf を以下の様に作成します。

```/etc/init/jenkins.conf
description "Jenkins"

respawn
start on started network-services or runlevel [345]
stop on stopping network-services or runlevel [016]

exec su -s /bin/sh -c 'exec "$0" "$@"' jenkins -- /development/jenkins-workspace/start_jenkins.sh 
```

そして、以下のコマンドで起動すれば、成功です。

```
sudo initctl start jenkins
```
unittestでDB更新結果のassertする場合、reloadを忘れずに

更新は別インスタンスで行われてるからだ。言われてみれば確かにそうだ。

http://qa.atmarkit.co.jp/q/3030

```rb:controller/lists_controller.rb
def stock
    return redirect_to '/404.html' unless request.xhr?
    @list = List.find(params[:id])

    if @list.is_stocked?
      @list.is_stocked = false
    else
      @list.is_stocked = true
    end

    respond_to do |format|
      if @list.save
        format.js { @list }
      else
        format.js { render :action => "alert/error" }
      end
    end
  end
```

これだとテストに失敗する

```rb:functional/lists_controller_test.rb
test "is_stockedを更新する" do
    xhr :get, :stock, :id => @stock_flag_is_true.id
    assert_equal false, @stock_flag_is_true.is_stocked
    assert_response :success
end
```

別インスタンスで更新した内容をインスタンスに反映させるため、 `reload` を追加しなければいけない

```rb:functional/lists_controller_test.rb
test "is_stockedを更新する" do
    xhr :get, :stock, :id => @stock_flag_is_true.id
    assert_equal false, @stock_flag_is_true.reload.is_stocked
    assert_response :success
end
```

同じようにハマってる方がいた。

http://higelog.brassworks.jp/?p=76
nexus7用極小ubuntuイメージ作った。(cui。ssh,シリアル接続可)

サーバー用途に使えるものを作りました。

## 以下を解決したくて作りました。

* PCが隣にあるとandroidを消してまで活用する場がない。
* メモリが全然ない（空きが90MB。何やるにしてもスワップしまくり）
* 32GBモデルなのに / が6GBでフォーマットされる・・・

## download

[download](https://github.com/tukiyo/ubuntu_mini_nexus7)
  ↑
/etc/hosts、/etc/apt/sources.list修正しなきゃ・・・

## 使い方

* 母艦:ubuntu13.04で作成。nexus7をusb接続し、1st*.sh,2nd*.shを実行してください。
* user,password は nexus,nexus です。
* 無線LANの設定は /etc/network/interfaces にssid,passwordを入力すると良いです。
* シャットダウンは shutdown -h now。(haltでは電源落ちません。)
* 再起動は shutdown -r now。(rebootではfsck走るかも。)

```bash:/etc/network/interfaces例
auto wlan0
iface wlan0 inet dhcp
    wpa-ssid "Xperia Z"
    wpa-psk "ab345678"
```

* bluetoothとsuspendはわからなかったので対応できてません。

----

## 作り方

まず、ubuntu-desktopを入れておきます。

```bash:debootstrapの手順
$ sudo apt-get install debootstrap
$ mkdir /newdir
$ sudo -s
> debootstrap raring /newdir http://jp.archive.ubuntu.com/ports/
> cp -p /etc/apt/sources.list etc/apt/
> cp -p /etc/fstab etc/apt/
> cp -p /etc/hosts etc/
> cp -p /etc/init/ttyGS0.conf /etc/init/
> cp -p /etc/network/interfaces etc/network

> chroot /newdir
> adduser nexus
> passwd nexus
> usermod -G sudo nexus
> apt-get update
> apt-get install ssh wpasupplicant wireless-tools
> locale-gen ja_JP.UTF-8
> dpkg-reconfigure tzdata →　Asia/Tokyoを選択。
> exit
```

----

母艦から $ adb shell

recovery mode から操作


```bash:

> cd /data/
> mkdir old
> mv [^n]* old
> mv newdir/* .
> rm -r dev lib boot
> mv old/{dev,lib,boot} .
> reboot

```


----

母艦から $ sudo screen /dev/ttyACM0

以上。

----

partitionsメモ
----

$ ls -l /dev/block/platform/sdhci-tegra.3/by-name/
lrwxrwxrwx root root 2012-06-28 11:51 APP -> /dev/block/mmcblk0p3
lrwxrwxrwx root root 2012-06-28 11:51 CAC -> /dev/block/mmcblk0p4
lrwxrwxrwx root root 2012-06-28 11:51 LNX -> /dev/block/mmcblk0p2 (/boot)
lrwxrwxrwx root root 2012-06-28 11:51 MDA -> /dev/block/mmcblk0p8
lrwxrwxrwx root root 2012-06-28 11:51 MSC -> /dev/block/mmcblk0p5
lrwxrwxrwx root root 2012-06-28 11:51 PER -> /dev/block/mmcblk0p7
lrwxrwxrwx root root 2012-06-28 11:51 SOS -> /dev/block/mmcblk0p1
lrwxrwxrwx root root 2012-06-28 11:51 UDA -> /dev/block/mmcblk0p9 (/data/)
lrwxrwxrwx root root 2012-06-28 11:51 USP -> /dev/block/mmcblk0p6 

* APP -> system
* CAC -> cache
* LNX -> boot.img
* MDA -> Unknown
* MSC -> Misc (bootloader commands and other misc stuff )
* PER -> usually a fat partition containing sensor calibration etc. - per device provisioned.
* SOS -> recovery.img
* UDA -> /data - "user data area"
* USP -> Staging
Z shell でコマンドラインからgoogle検索できるようにしてみた

コマンドシェルにZ shellを使ってるわけですが、

.zshrc を書くのが最近の遊びとなってます
 
Z shell の導入方法はこちら
http://d.hatena.ne.jp/japanrock_pg/20081007/1223348852


そういや明日ビアガーデンいきたいけど晴れかな? 天気予報調べよう。

なんてときにマウスを使ってブラウザ操作はめんどくさい。

なのでコンソールから天気予報くらい出てくれたら便利やな

と思っていたらありました。

w3m というブラウザがありました。

wikipedia - w3m
http://ja.wikipedia.org/wiki/W3m

使いたいので下記を .zshrc に追加

```

# google で検索できる
function google() {
   local str opt
   if [ $# != 0 ]; then
       for i in $*; do
           str="$str+$i"
       done
       str=`echo $str | sed 's/^\+//'`
       opt='search?num=50&hl=ja&lr=lang_ja'
       opt="${opt}&q=${str}"
    fi
    w3m http://www.google.co.jp/$opt
}

```
追記したあとは

`source ~/.zshrc `

あとはgoogle こまんど打つだけ

`google 検索ワード `


let`s fun!
Rails の assets 環境で scss 使う場合の、ちょっと嬉しい小技

views/layouts/application.html.haml の body のとこを

    %body{class: controller_name, id: action_name}
としておく。 (erb なら ```<body class='<%= controller_name %>' id='<%= action_name %>' >```

こうしておくと、特定のページだけに適用したいスタイルを

```css
/* users.css.scss */
body.users#index {
	table { background-color: silver; }
}
```
みたいに書けるってぇ寸法だ。
```users#index```のとこが routes の表記と揃ってちょっとウレシくない？
byte単位で指定された範囲の部分を文字列にして返す(固定長ファイル)

たとえば固定長ファイルで3バイト目から9バイト目の範囲をひっぱってくるときに使う
Windows-31J前提

```java:
private String byteToString(byte[] bytes, int start, int end) throws UnsupportedEncodingException {
	byte[] targetByte = Arrays.copyOfRange(bytes, start, end);
	return new String(targetByte, "Windows-31J");
}
```
Debian(Wheezy)にJava7をインストール

自宅サーバのDebian(Wheezy)にOracleのJavaをインストールしたので
記録も兼ねてメモしておきます。

作業的には以下のURLの通りです
http://wiki.debian.org/JavaPackage

```shell-session:
sudo apt-get install java-package
```

次にOracleのサイトからJDKをダウンロードしてくる。
この際、ファイル名が間違っているようなので変更しておく。
(jdk-7u25-linux-i586.gz -> jdk-7u25-linux-i586.tar.gz)

```shell-session:
mv jdk-7u25-linux-i586.gz  jdk-7u25-linux-i586.tar.gz
make-jpkg jdk-7u25-linux-i586.tar.gz
sudo dpkg -i oracle-j2sdk1.7_1.7.0+update25_i386.deb
sudo update-alternatives --config java # デフォで動作させるJavaをOracleのJavaに変更
```

以上です。
Eclipse小技メモ フィールドからコンストラクタを自動生成

###Eclipse小技メモ フィールドからコンストラクタを自動生成

```java:
public class UserClass {
	/** 座標X */
	private int x;
	/** 座標Y */
	private int y;
	/** 文字列リスト */
	private List<String> stringList;
}
```

上記のようなクラスで、コンストラクタでフィールドに対して値を設定したい場合は、
メニューバーから`Source` →`Generate Constructor using Fields...`を選択して、設定したいフィールドを選んでOKすれば、以下のようなコンストラクタを自動生成してくれます。

```java:
public class UserClass {
	/** 座標X */
	private int x;
	/** 座標Y */
	private int y;
	/** 文字列リスト */
	private List<String> stringList;

	public UserClass (int x, int y, List<String> stringList) {
		super();
		this.x = x;
		this.y = y;
		this.stringList = stringList;
	}
	
}
```

ちょっとだけ便利になりますね。


さらにEclipseプラグイン`Limy Eclipse Plugin`をインストールしているのであれば、自動生成されたコンストラクタ内で`ALT+SHIFTJ`を押すと、JavaDocコメントを良い感じに生成してくれるという優れもの！

```java:
public class UserClass {
	/** 座標X */
	private int x;
	/** 座標Y */
	private int y;
	/** 文字列リスト */
	private List<String> stringList;

	/**
	 * @param x 座標X
	 * @param y 座標Y
	 * @param stringList 文字列リスト
	 */
	public UserClass (int x, int y, List<String> stringList) {
		super();
		this.x = x;
		this.y = y;
		this.stringList = stringList;
	}
	
}
```
Milkode 1.1 リリース


![milkode1.1.png](https://qiita-image-store.s3.amazonaws.com/0/3885/a8a8db54-f940-c5a5-a567-7114fd4515b8.png "milkode1.1.png")

- 相対URLに対応
-  gmilkの検索速度を高速化

要望の多かった相対URLに対応しました。
http://example.com/suburl/ などにデプロイ可能となります。

[[続きを読む]](http://ongaeshi.hatenablog.com/entry/milkode-1.1)
【Ruby on Rails】modelで前提条件を付ける

自分的に小技だなと思ったので投稿します。

データを検索する時に必須条件ってありませんか？

例えば、usersテーブルがあり、friendsテーブルがあるとします。
この時にFriendsControllerで使用するSQLには、friendsテーブルのuser_idをwhere句の条件に必ず含める必要があるとします。
SQLでいうと、

```sql:sample
SELECT friends.* from friends WHERE friends.user_id = 1
```

今まで僕はその必須条件を各検索系メソッド（findなど）の検索条件にわざわざ書いていました。

```ruby:sample
# 一覧を取得するSQLで、、、
Friend.find(:all, :conditions => {:user_id => 1})
# 詳細を表示するSQLで、、、
Friend.find(:first, :conditions => {:id => 10, :user_id => 1})
```

けど以下のロジックを追加してあげることで各検索ロジックのところに書く必要がなくなりました。

```ruby:sample
private
def friend
Friend.user_id(1)
# 下が確実？
Friend.where(:user_id => 1)
end
```

これを各検索ロジックのところで呼び出してあげればいいのです。

```ruby:sample
# 一覧を取得するSQLで、、、
friend.find_all
# 詳細を表示するSQLで、、、
friend.find(10)
```
「第11回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/c206fbc645c255cb7de6
http://nabetani.sakura.ne.jp/hena/ord11arithseq/

今回は複数の等差数列から、最も長い列になるものを取得します。

```php:
<?php
	class SEQUENCE{
		/**
		* 最大長の数列を探して返す
		* @param String 「12345abcz」みたいな文字列
		* @return int 最大の数列は「12345」なので長さの5
		*/
		public function get($input){
			// 2文字以下なら即終了
			if(strlen($input)<=2){ return strlen($input); }
			
			// 入力値を2進数に変換
			$dataText = str_repeat('0', 36);
			for($i = 0; $i < strlen($input); $i++){
				$dataText[base_convert($input[$i], 36, 10)] = '1';
			}
			
			// マッチ
			$count = 2;
			for($space=0; $space<17; $space++){
				// より長い数列を検索
				$matchStr = "/(?:1.{{$space}}){{$count},}1/";
				$bool = preg_match_all($matchStr, $dataText, $match, PREG_SET_ORDER);
				if(!$bool){ continue; }
				
				// 見つかった中で、一番長いものを上書き
				usort($match, function($a, $b){
					return (int)( (strlen($a[0]) - strlen($b[0])) < 0);
				});
				$count = ( strlen($match[0][0]) + $space) / ($space+1);
				
				// 入力文字列長以上になったらマッチしないので終了
				if($count >= strlen($input)){ break; }
			}
			return $count;
		}
	}
	
	// テスト
	$test = [
		[ '12345abcz', '5' ],
		/* 省略 */
	];

	$sequence = new SEQUENCE();
	foreach($test as $key=>$data){
		$answer = $sequence->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}
```

順番にくるくるやっていけばいいだけなのですが、何故か正規表現に思い至ってしまったのでやってみた。
最初は/(1.{0,})\1{3,}1/とかそんなかんじでガガッと一発取得してやろう、とか考えていたのですが、後方参照でサブパターンをマッチさせる方法がわからず挫折。
結局一重ではありますがループになってしまいました。
残念。
得意な人ならきっとできると思うので教えてください。

かかった時間は2時間くらい。
そのうち1.5時間は正規表現を作っては消していたところ。
つうかbase_convert()便利だな。
ちょっとしたことがGroovy「正規表現の部分で遅くなってたのを検証」


微妙に正規表現の部分で遅くなってたので、こうすりゃいんじゃね？ってのを検証してみた。

今回とくにGroovyだから便利ってとこは、ないかな。

いや、あるかな。テスト用の文字列つくるとこかな。

なお、マッチした部分を他に使う必要のないコードです。

```groovy:regexp_faster.groovy
import java.util.regex.Matcher
import java.util.regex.Pattern

def stopWatch = {c->
    s = System.nanoTime()
    c()
    "${(System.nanoTime() - s) / 1000} [microsec]"
}

Pattern slowp = Pattern.compile(/[^。「」]{30,}/)
def slowMatch = {target ->
  def r 
  println "slow=" + stopWatch {
   r = slowp.matcher(target).find()
  }
  r
}

Pattern fastp = Pattern.compile(/[^。「」]{30}/)
def fastMatch = {target ->
  def r 
  println "fast=" + stopWatch {
   r = fastp.matcher(target).find()
  }
  r
}

[
"0123456789",
"0123456789"*2,
"0123456789"*3,
"0123456789"*3+"。",              // 否定対象があるが範囲外
"0123456789"*2.9+"。",
"012345678。"*500,                // 否定対象がある長い文字列　← 速くはならないはず
"0123456789"*500+"。",            // 否定対象があるが範囲外
"0123456789"*500+"○",            // 否定対象がない長い文字列
].each{target ->
println "== taget.lenght() : ${target.length()} =="
assert slowMatch(target) == fastMatch(target)
}
""
```
/proc/meminfoの情報をzabbixで収集してみる

#meminfoファイルの中身をzabbix_senderでまとめて送信してみた
##はじめに
zabbixのメモリ関係のアイテムは、取得できるのがtotal、shared、free、buffers、cachedだけでちょっと大雑把(?)
そこでmeminfoに記載の情報をzabbixで取得してみようかな、と思った。
で、ユーザパラメータ辺りを使って項目別のアイテムを設定すると、アイテムの取得タイミングが個々で微妙にズレるのが気になるのでzabbix_senderでやってみました。
というお話。

##スクリプト
```sh:
#!/bin/sh

if [ $# -ne 2 ] ; then
  echo "This script needs two argments." 1>&2
  exit 1
fi

zbxHOSTNAME="$1"
zbxSERVER="$2"
TIMESTAMP=`date +%s`

TEMPFILE="/tmp/zbxTMP$$"
ITEMPREFIX="system.meminfo."

cat /proc/meminfo |while read LINE
  do ARTICLE=`echo $LINE |cut -d":" -f1 | tr "()" "_"`
  ITEMNUM=`echo $LINE|cut -d":" -f2|sed -e "s/ kB/ * 1024/" |bc`
  echo "$zbxHOSTNAME $ITEMPREFIX$ARTICLE $TIMESTAMP $ITEMNUM"
done >$TEMPFILE

zabbix_sender -z $zbxSERVER -p 10051 -T -i $TEMPFILE >&2
echo $?

rm -f $TEMPFILE

```
###スクリプトの解説
/proc/meminfoの情報を、引数で受け取ったzabbixサーバのIPアドレス、アイテムを取得するマシンのホスト名(とスクリプト実行時の時刻)と併せてzabbix_sender機能でサーバに登録する。
ポイントは下記の2点ぐらい

- アイテムのキーに”()”`が含まれるとアイテムが上手く登録できなかったので"_"に置換している。
- キロバイト単位をバイト単位に変換している。単位の換算はzabbix側で宜しくやってくれる。

ファイルに記録した複数の値を一括してzabbix_senderで送信する方法については
[Zabbix Senderで複数の値を一括登録 - ike-daiの日記](http://d.hatena.ne.jp/ike-dai/20120622/1340360976)
こちらを参考にさせて頂いた。

##アイテムの登録
アイテムのキーは`system.meminfo.”meminfoファイル内の項目名”`で整数型なトラッパーアイテムを登録しておく
![zabbix_meminfo-item-setting.png](https://qiita-image-store.s3.amazonaws.com/0/20934/c1c5feb3-24c6-057f-a0fa-0dab8e7fe646.png)
こんな設定をmeminfoファイルに含まれる項目の分だけ手動でやるとちょっとした苦行なのでうまい感じで省力化したいところ。

##スクリプトの起動
こんなアイテムを登録して設置したスクリプトを起動。
このアイテムの実行間隔で、上で設定したトラッパーなアイテムにスクリプトから値が登録されていく。
![zabbix_meminfo_script-kick.png](https://qiita-image-store.s3.amazonaws.com/0/20934/d17bba8b-b689-ada7-1d23-bcfce45ec4db.png)
見切れているキーの欄はこんな感じ

`system.run[/etc/zabbix/externalscripts/zbxmeminfo.sh "{HOSTNAME}" "192.168.xxx.xxx"]`
”192.168.xxx.xxx”はzabbixサーバのIPアドレス。
上述の各項目のアイテムと合わせてテンプレートにして`{HOSTNAME}`マクロを使っているので、スクリプト設置だけしてやれば複数サーバでの値の収集も比較的楽だと思う。
エージェントで`EnableRemoteCommands=1`を設定しないと動かない、はず。
ユーザパラメータに登録、crontabに登録でもいいかも。

##グラフにしてみた
![zabbix_meminfo-items.png](https://qiita-image-store.s3.amazonaws.com/0/20934/a39982b9-4b55-6279-1c0a-87da8d5e65e6.png)
グラフ本体よりも凡例の方が場所を取ってる、、、
vim7.3(+python2.4)をソースからインストール(Gundo.vimに対応)

# 目的

> vim7.3にしたい。
> MacVimやGvimで、OS上のアプリを利用してる場合は問題ないが
> 自分の場合はリモートサーバー上で作業することが多いので
> ソースインストールする、はらをくくるしかない。
> また色々と便利なUNDO管理プラグインである
> Gundo.vimを利用する為には、Python2.4のパスつきで
> コンパイルされている必要がある。
> ネット上をあさっても方法が見当たらなかったので
> 今回おこなった対応をまとめておく

## インストールディレクトリを決める。

> 自分の環境では、~/local/bin/vim をviのエイリアスにしているので
> ~/local/src/以下にインストールする。
> もちろんVPSなり専用サーバーをもっているのであれば/usr/local/以下でも問題ない。
> /usr/local/以下としたければ、~/local/を/usr/local/に適時読み替え
> 以下のように.zshrcでエイリアスを切っている

```

$ vi .zshrc
--------------------------------

alias vi="$HOME/local/bin/vim"

--------------------------------

```

## vimの最新バージョンを確認する

> バージョンとパッチファイルは最新のものを[公式サイト](http://www.vim.org/)で確認する。
> [ソースファイル](ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2)
> [パッチファイル](ftp://ftp.vim.org/pub/vim/patches/7.3/)
> パッチ番号も確認する。※今回は780とする。

## 必要なライブラリをインストールしておく。

> 既にインストール済みのものであれば無視
> Pythonは2.4以上のものであることを確認する。
> 違う場合はソースからでもインストールしてください。

```

$ sudo yum install wget
$ sudo yum install ncurses-devel
$ sudo yum install patch
$ sudo yum install make
$ sudo yum install gcc
$ sudo yum install python
$ sudo yum install python-devel

```

> インストール後、Pythonのコンフィグディレクトリがどこにあるか確認しておく。
> 自分の環境では、/usr/lib64/python2.6/configだった。
> このあたりはインストール方法とサーバーによって違う。

## wgetでソースを入手して解凍する。

```
$ cd ~/local/src/
$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
$ tar xjvf vim-7.3.tar.bz2
```

## 解凍したディレクトリでパッチをあてる。

```

$ cd vim73
$ mkdir patches
$ cd patches
$ curl -O 'http://ftp.vim.org/pub/vim/patches/7.3/7.3.[001-780]'

* ダウンロード完了までしばらく待つ

$ cd ../
$ cat patches/* | patch -p0

```

## インストール

> configureの設定としてPythonの指定。
> またインストールディレクトリをユーザーの~/local/bin/以下とするため
> ディレクトリを指定する。

```

$ ./configure --with-features=huge --enable-pythoninterp --with-python-config-dir=/usr/lib64/python2.6/config --enable-fail-if-missing --prefix=/home/i3pinet/local --enable-multibyte --disable-selinux
$ make
$ make install

```

## 確認する

> viを立ち上げて、バージョンが7.3であることを確認する。
> またGundo.vimが有効になっているか会わせて確認する。
> プラグインのインストールはされていることを前提とする。

```

$ vi
-> バージョンが7.3であること

```

> viでGundoを確認してみる

```

$ vi sample.txt

* 何か適当に書いてみる。

:GundoToggle
-> quickfixでGundo表示がされていること

```

> vimに登録しているプラグインは気が向いたらまとめます
CentOS 6.4 に R をインストールする

Basho Bench のグラフ出力に R が必要だったので、CentOS 6.4 にインストールする。

```
[on centos6]# cat /etc/redhat-release
CentOS release 6.4 (Final)
```
EPEL レポジトリ RPM は、http://ftp.riken.jp/Linux/fedora/epel/6/i386/repoview/epel-release.html から最新版をインストールする。

```
[on centos6]# rpm -ihv http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
```

あとは、普通に yum で R 言語をインストールできる。簡単だね。

```
[on centos6]# yum -y install R
[on centos6]# rpm -qa | grep R-
R-core-3.0.1-2.el6.x86_64
R-devel-3.0.1-2.el6.x86_64
R-core-devel-3.0.1-2.el6.x86_64
R-java-3.0.1-2.el6.x86_64
R-java-devel-3.0.1-2.el6.x86_64
R-3.0.1-2.el6.x86_64
```

おしまい。
Hopscotchのメモ

HopscotchはWEBページの各要素に吹き出しを出してサイトの使い方を説明するためのもの
↓のサイトでデモを見るのが一番わかりやすい

[Hopscotch](http://linkedin.github.io/hopscotch/)

[Hopscotchダウンロード](https://github.com/linkedin/hopscotch)

ダウンロードしてcssとjsをそれっぽいとこに配置

ViewのHTMLのheadタグ内

```html:View
<head>
<link rel="stylesheet" href="css/hopscotch.css"></link>
</head>
```

bodyタグを閉じる直前

```html:View
<script src="js/hopscotch-0.1.js"></script>
<script src="js/my_first_tour.js"></script>
</body>
```

ツアーの行程はmy_first_tour.jsに記述する

```js:my_first_tour.js
// Define the tour!
    var tour = {
      id: "hello-hopscotch",
      steps: [
        {
          title: "これはタイトルですよ",
          content: "これはタイトルです",
          target: document.querySelector(".page-header h2"),
          placement: "bottom"
        },
        {
          title: "絞り込み",
          content: "このボタンで絞り込みます",
          target: document.querySelector("#filter"),
          placement: "right"
        }
      ]
    };

    // Start the tour!
    hopscotch.startTour(tour);
```

ツアー完成！！
今頃「The RSpec Book」の第１９章（Railsのテスト）以降を試すには

# はじめに

RubyにおけるBDDを学ぶにあたり、今でも貴重な情報源である書籍「[The RSpec Book](http://books.shoeisha.co.jp/book/b94964.html)」ですが、Rails 3.0.0前提の内容になっています。
今やRailsは4.0までリリースされていますが、Rails3との差異はかなり大きなものです。

この本の内容を、Rails4.0.x及び最新バージョンのRSpec/Cucumberで実践するのは、おそらくエラーが大量発生することが予想され、さすがに無理があります。

なので、おとなしく本の最初で示されている各種gemのバージョンそのままのものを使うことが賢明です。
本の内容を滞り無く進めて大筋を理解してから、次にRails、RSpec、Cucumberの最新バージョンを学びましょう。

# しかし、ちょっとした問題が……

## Rails 3.0.0 がインストールできない

ここでは、Rubyは1.8.7を使う事を前提とします。Rubyの導入に関しては、以前私が書いた[この記事](http://qiita.com/emadurandal/items/a60886152a4c99ce1017)をご覧下さい。

まずは、bundlerをインストールする必要があるのですが、今普通に

```bash:
$ rbenv exec gem install bundler
```

とすると、バージョン1.3.2以降がインストールされてしまいます。このバージョンのbundlerはバージョンが新しすぎて、Rails3.0.0をインストールできません（エラーが起きます）。
そこで、以下のようにしてバージョン1.0.22をインストールします。

```bash:
$ rbenv exec gem install bundler --version "= 1.0.22"
```

その上で、[この記事](http://qiita.com/emadurandal/items/a60886152a4c99ce1017)を参考に、Rails3.0.0をローカルインストールしましょう。

## Rails3.0.0プロジェクトのGemのインストールに失敗する

第19章 p. 276で、Gemfileの内容が示されているのですが、このままだとBundlerがRakeやRSpec、Cucumber、依存関係で必要なnokogiriなどについて、最新バージョンをインストールしようとしてしまい、エラーが発生します。
そこで、古いバージョンを指定する必要があります。
私の方で検証済みのGemfileを以下に示しますので、この通りにやってください。

```rb:
source 'http://rubygems.org'

gem 'rails', '3.0.0'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

gem 'sqlite3-ruby', :require => 'sqlite3'

gem 'rake', '= 0.8.7'

group :development, :test do
  gem "rspec", "= 2.0.0"
  gem "rspec-rails", "= 2.0.0"
  gem 'nokogiri', '= 1.5.10'
  gem "cucumber", "= 0.9.2"
  gem "cucumber-rails", "= 0.3.2"
  gem "webrat", "= 0.7.2"
  gem "database_cleaner", "= 0.5.2"
end

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug'

# Bundle the extra gems:
# gem 'bj'
# gem 'nokogiri'
# gem 'sqlite3-ruby', :require => 'sqlite3'
# gem 'aws-s3', :require => 'aws/s3'

# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
# group :development, :test do
#   gem 'webrat'
# end
```

以上。あとは本の内容を進めて行きましょう。Good Luck!

# その他、気になったこと

## いまさらWebrat？

21章では、Webratを使った、ブラウザシミュレート型のテストについて書かれています。capybara全盛の時代に今更Webrat？　とも思ったのですが、調べてみるとcapybaraはWebratからインスパイアされており、多くの関数で後方互換性があるとのことです。
なので、この本でWebratを使って学んだテスト作法は、おそらく将来capybaraを使う際にも活かせると思います。
Rails + Compass でCSSの開発を高速化！

巷で話題（？）のCompassをRailsに導入する方法です。
やることは簡単なんですが、GithubのCompass-Rails を参考にして導入したら、すこしハマったので備忘録として。
Railsのバージョンは3.2.13です。

#初期設定

まずはGemfileへgemを追加。

```rb:Gemfile
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'

  gem 'compass-rails'

  gem 'uglifier', '>= 1.0.3'
end
```

bundle installを実施。
※私は本体のrubyへ直接gemを保存せず、Railsアプリ毎にローカルへinstallしています。

```console:console
bundle install --path .bundle
```

Compassの初期設定を実行。
※Githubでは「rails」の項目がなく、Rails用ではない通常の初期設定が走るようになっていました。
※be は bundle exec のエイリアスを設定しているため、頭につけて実行しています。

```console:console
be compass init rails
```

あとはstylesheetsのファイルをSassで書くだけ！

#基本的な使い方

RailsのAsset Pipelineでは、CSSはSassを採用しているため、先ほどの初期設定で追加された`screen.css.scss``print.css.scss``ie.css.scss`が、そのまま利用することができます。
試しに'screen.css.scss'をみてください。

```rb:app/assets/stylesheets/screen.css.scss
/* Welcome to Compass.
 * In this file you should write your main styles. (or centralize your imports)
 * Import this file using the following HTML or equivalent:
 * <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" />
*/

@import "compass/reset";
```

すでにデフォルトでresetのモジュールが組み込まれています。
例えば以下のように設定すると、


```rb:app/assets/stylesheets/screen.css.scss
@import "compass/reset";
@import "compass";

.box {
    width: 100px;
    height: 100px;
    background:gray;
    @include border-radius();
}
```

Compassのモジュールを追加し(Resetはリセットの内容しか読み込まないため)、
@include で 希望のmix-inを読み込みます。

```css:css
.box {
  width: 100px;
  height: 100px;
  background: gray;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  -ms-border-radius: 10px;
  -o-border-radius: 10px;
  border-radius: 10px;
}
```

角丸のCSS（プレフィックス付き）として展開されます。
※IE対応のプリフィックスがつかなくなったようなので、注意が必要です。

利用できるmix-inはこちらにあります。
[Compass / CSS3 のmix-in](http://compass-style.org/reference/compass/css3/)

#CSS Spriteについて

ちまちまジェネレーターで作っていたのが悲しくなります。。
これは便利です！

1. まずはimagesの中にCSS Spriteを適用したい画像を格納します。
一枚の画像にまとめられるので、PNGで保存です。

2. そして、Sassファイルで以下の2行を入力するだけ！

```rb:app/assets/stylesheets/screen.css.scss
@import "icons/*.png";
@include all-icons-sprites;
```

3. あとは通常通り、1枚ごとの画像サイズにあわせてwidthとheightを設定し、classで画像を指定します。
実際のクラス名は'フォルダ名+画像名`なので、例えばiconsフォルダでbag.pngファイルであれば、`icons-bag.png`となります。

Compassは多機能かつSassと合わせてプログラミング的にCSSがかけるので、
使いこなすとさらに便利になりそうです。

ぜひ、便利なCompassライフを！
zshでgit, hub, tigなどを補完する

boxenを使っているなら以下を書くことでhub特有のコマンド(browseやpull-requestなど)も補完される．使っていないなら適切にダウンロードしてくる．

```sh:~/.zshrc
autoload -U compinit && compinit # もし書いていなければ．
source /opt/boxen/homebrew/etc/bash_completion.d/git-completion.bash
source /opt/boxen/homebrew/etc/bash_completion.d/hub.bash_completion.sh
source /opt/boxen/homebrew/etc/bash_completion.d/tig-completion.bash
compdef hub=git
```

なお，boxenを使っていると`[ -f /opt/boxen/env.sh ] && source /opt/boxen/env.sh`によって強制的にalias hub=gitされるので注意．
FuelPHPで日英などの多言語切り替えに対応する

FuelPHPでブラウザの言語設定によって表示文字言語を切り替えてみました。
※ URLに/en/ /ja/等のパラメータは入りません。

```php:fuel/app/bootstrap.php
// Initialize the framework with the config file.
Fuel::init('config.php');

$languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (isset($languages[0]) && preg_match('/^en/i', $languages[0])) {
	Config::set('language', 'en');
} else  {
	Config::set('language', 'ja');
}
```

サイト内で必要な文言は言語毎（以下は日本語と英語）にファイルに記述。

```php:fuel/app/lang/ja/main.php
return array(
	'lbl_hello' => 'こんにちは！',
	'lbl_bye' => 'またね！'
);
```

```php:fuel/app/lang/en/main.php
return array(
	'lbl_hello' => 'Hello!',
	'lbl_bye' => 'Bye!'
);
```

Controllerで言語ファイルを読み込んで

```
        public function before()
        {
                \Lang::load('main');
```

Viewで表示します。

```
echo __('lbl_hello');
```

確認は、ブラウザの言語設定を切り替えて確認します。

他に適切な方法が有ればコメントお願いします。
C++でメソッド名を取得する。

obj-CのNSStringFromSelector(\_cmd)に当たるものはないかとずっと思ってたんですが実はすごい簡単でした。
\__FUNCTION__がそれに当たるみたいです。なので

```cpp:
CCLOG("%s", __FUNCTION__);
```

これでメソッド名が出力出来ます。また

```cpp:
CCLOG("%s", __FILE__);
```

これでファイル名が出力出来ます。パスごと出てくるけど。
Rack middleware stack のデバッグ方法

この middleware ちゃんと動いてるか確認したい、とか、この middleware とこの middleware を同時に使うとなんかヘッダがおかしいけどどうなってるの！とか、そういうののデバッグ法。

単にログ吐く middleware を stack の途中に積めばよい。 @app.call の前後でそれぞれロギングできる。

```config/environments/development.rb
  class M
    def initialize(app)
      @app = app
    end
    def call(env)
      warn '='*80
      env.each do |k,v|
        warn "#{k}=#{v}"
      end

      warn '='*80
      triplet = @app.call(env)
      warn triplet.inspect
      triplet
    end
  end

  config.middleware.insert_before Rack::ETag, M
  config.middleware.insert_after Rack::ETag, M
```

一個作れば何度でも積み込めるので任意の位置に差し込んでうまく使うと労力少なめでデバッグできる。

```
$ rake middleware
use Rack::Timeout
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007fd6524e9a28>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use BetterErrors::Middleware
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use Dragonfly::CookieMonster
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use ActionDispatch::Head
use Rack::ConditionalGet
use M
use Rack::ETag
use M
use ActionDispatch::BestStandardsSupport
use Rack::Cors
use MetaRequest::Middlewares::MetaRequestHandler
use MetaRequest::Middlewares::Headers
use MetaRequest::Middlewares::AppRequestHandler
run MyApp::Application.routes
```
CoffeeScript ベタ書きでオプション展開処理をしたい

関数にオプションを渡す際の処理を、メソッドを作らないでも簡潔に書けないかを模索中です。

```coffeescript:
func = (options={}) ->
  opts =
    x: 1
    y: 2
    z: 3
  opts[k] = v for k, v of options

  console.log opts

func({x:11, z:33})  # -> {x: 11, y: 2, z: 33}
```

良い書き方ありませんでしょうか？


## 結局は extend を作ったほうが良い

shallow copy も出来ないので、概ねは作ったほうが良かった

```coffeescript:
extend = (obj, props) ->
  obj[k] = v for k, v of props
  obj
```
find で 日本語ファイルを一括操作する時の注意点

日本語やら空白を含むファイルの一括削除について。

"コマンド <ファイル1> [ <ファイル2> <ファイル3> ...] " 形式のコマンドの場合

find に -print0 
xargs に -0 をそれぞれ渡してやるとうまくいく。

以下の例では、targetdir 配下の *.url ファイルを一括削除できる。

```bash:
find ./targetdir/ -name '*.url' -print0 | xargs -0 rm -fv
```
----

結果１行毎に操作をしたい場合は、
while と read でループしてやり、
"$ループ変数" としてコマンドに渡してあげればよい

以下の例では、'*.bmp' ファイルを検索し、'*.jpg'へ一括変換している。

```bash:
find ./targetdir/ -name '*.bmp' | while read line
do
  echo "convert" $line
  convert "$line" "${line%.bmp}.jpg" && rm -f "$line"
done
```
任意のhogehoge.batで黒窓（コマンドプロンプト）表示を抑制して実行

例えばWindows向けAndroid SDKはddms.batというバッチファイルを提供しており、バッチファイル経由でDDMSを起動できる。しかし残念ながら無駄なコマンドプロンプトウィンドウが表示されてしまう。鬱陶しい。
ddms.batと同じディレクトリに以下のようなJavaScriptファイルを用意し、そこから実行するとコマンドプロンプトが開かれなくなる。快適。

```js:ddms.js
var wsh = new ActiveXObject("WScript.Shell");
wsh.Run("ddms.bat", 0);
```
蝶の大群とGPUその２

ブログ書きました。

前回の記事は実験中ということで、紹介にとどまっていた蝶の大群の操作＆レンダリングについて、
もう少し踏み込んでいきます。

http://wowdev.jp/?p=640

今回のフルソースコードも公開しています。
https://github.com/wowdevjp/butterfly-GPU
IE9 と属性 expando の罠

例えば input 要素の max 属性の値を取得しようとして

```js:
hoge = input.max
```

とかすると、

- IE8 以下は内容属性がそのままJavaScriptの property としてアクセスできる
- IE10 以上は max 属性に対応している

のでちゃんと値が取れるのだけど、

- IE9 は max 属性に対応しておらず、未知の内容属性に property としてアクセスできない

ので undefined になる。
IE と <option>

(IE8 と IE9)

createElement('option') して使おうとしても、...

- option.text に値を設定しても、表示されない (空文字列が表示される)
- option.innerText に値を設定すれば表示される
- option を select から削除すると option.text がリセットされるらしく(?)、再度 append しても表示されない
- その場合も option.innerText に改めて値を設定すれば表示される

IE10 は正常。
Mac及び各種Linuxでruby-buildとrbenvをインストールしてruby環境を用意する

いつも新しい環境、新しいユーザーで入る度に実行するので、健忘録的メモ。
.zshrcは.bashrcにするもよし。

```sh
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
sudo ./install.sh
mkdir -p ~/local/src
mv  ~/.rbenv/plugins/ruby-build ~/local/src
rm -rf ~/.rbenv
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
rbenv install 2.0.0-p353
rbenv rehash
rbenv global 2.0.0-p353
```

残念ながら2.0.0-p195はインストールに失敗する。

rbenvとruby-buildの更新。及びバージョンアップ。

```sh
cd ~/.rbenv
git pull origin master
cd ~/.rbenv/plugins/ruby-build
git pull origin master
rbenv install --list
rbenv install 2.0.0-p247
rbenv rehash
rbenv global 2.0.0-p247
```
WordPressで国際化対応

WordPressで作るサイトをローカライズしたい場合、WordPressが採用する国際化のルールに対応したテーマやプラグインを使用する必要があります。

その上で、ひとくちに国際化といっても実装のされ方の違いで色んなレイヤーのものがあります。
<ol>
<li>WordPress本体に含まれる文言の翻訳</li>
<li>テーマファイル、プラグインファイルに含まれる文言の翻訳</li>
<li>投稿やページなどのコンテンツそのものの翻訳</li>
<li>WordPress本体の設定のうち、ユーザーが入力し設定する文言（サイトのタグラインとか）の翻訳</li>
<li>プラグインの設定のうち、ユーザーが入力し設定する文言の翻訳</li>
<li>言語ごとに出し分けする必要があるが、WPMLが出力に関わっていないページのため動的に出し分けられないものへの対応</li>
<li>言語ごとにURLへどう反映させるか、ページの切り替えやナビゲーションといかに連動させるか</li>
</ol>
これらは別々に対応していく必要があります。

<h2>概観すると…</h2>

1と2はgettextという仕組みを使い、WordPress本体の機能のみでまかなえます。
3〜7はプラグインが必要になる部分で、とくに5についてあまり書かれているものを見かけなかったなーというのがこのエントリを書こうと思ったきっかけです。

で、3〜7を実現するのに何のプラグインを使うか。有料ですがWPML一択なんじゃないかという印象。
隅から隅まで探した訳ではないので他にあったら教えていただきたいですけど…！
たまに比較されるqTranslateは、4とか5は対応してないんじゃないかと。

<h2>個別の対応策</h2>

<h3>1と2</h3>
.poファイルを編集して.moファイルを書きだせばいいですね。編集ツールとしては管理画面で編集できる<a href="http://wordpress.org/extend/plugins/codestyling-localization/" target="_blank">Codestyling Localization</a>や、デスクトップアプリの<a href="http://www.poedit.net/" target="_blank">Poedit</a>なんかがあります。

<h3>3</h3>
7も見越すとプラグインが必要。
WPMLの場合は以下に説明があります。
<a href="http://wpml.org/ja/documentation-5/%E8%87%AA%E5%88%86%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E7%BF%BB%E8%A8%B3%E3%81%99%E3%82%8B/" target="_blank">自分のコンテンツを翻訳する | WPML</a>

<h3>4</h3>
WPMLであればストリング翻訳というプラグイン内プラグインみたいなものを入れれば、クロールして収集し、管理画面上に表示してくれるのでそこで翻訳文を入れればOK。
<a href="http://wpml.org/ja/documentation-5/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%AC%E3%82%A4%E3%83%89/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%B3%E3%82%B0%E7%BF%BB%E8%A8%B3/" target="_blank">ストリング翻訳 | WPML</a>

<h3>5</h3>
ややこしく、サイトを見てもよくわかりません。
<a href="http://wpml.org/ja/documentation-5/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88/%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AB%E3%82%88%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%BF%BB%E8%A8%B3/" target="_blank">その他のプラグインとテーマによるテキスト翻訳 | WPML</a>
しかも結論からいうと上記ページは参考にならず、参考にすべきは以下のページです。
<a href="http://wpml.org/documentation/support/language-configuration-files/" target="_blank">Language Configuration Files | WPML</a>
の4がそれ。

「ストリング翻訳」の機能拡張なので、そのプラグインのディレクトリ（例：/wp-content/plugin/wpml-string-translation/wpml-config.xml）に、xml形式の設定ファイル（wpml-config.xml）を設置します。
一般的にプラグインのユーザー設定を保存する場所としてwp_options というtableを利用することが多いらしいんですが、このやり方はその場合のみ有効。wp_optionsの中で、翻訳したい文言が使用しているフィールド名をkey名として記載すればOK。


```xml:
<wpml-config>
    <admin-texts>
        <key name="sidebarlogin_welcome_heading">
        </key>
    </admin-texts>   
</wpml-config>
```

<h3>6</h3>
これはハードコードして出し分ける必要があり、WPMLでは例えばこんな感じで（言語で振り分ける場合）。


```php
<?php if (ICL_LANGUAGE_CODE == 'ja') { ?>
	<!-- Japanese contents here-->
<?php } else if (ICL_LANGUAGE_CODE == 'en') { ?>
	<!-- English contents here-->
<?php } ?>
```


<h3>7</h3>
プラグインの機能依存なのと設定画面で容易に見つけられると思うのでここでは省略します。
slideshareの最終ページ後の「他のスライドもありますよ的な画面」を無効にする

> slideshareって最後のページまで来た時に更に次ページ押してしまうと、他のスライドもありますよ的な画面になるのが超ウザい。そこまで行っちゃうとページ戻れないしみんなどうしてるの…？

と思ったので無効にしてみた。

# Chrome拡張作った
[Chrome ウェブストア - slideshare lastscreen disabler](https://chrome.google.com/webstore/detail/slideshare-lastscreen-dis/fhddffkedbdcdpnofkbdjfhgbhhfookj/details)

これを入れるのが一番簡単。

# Stylishでやる場合は

+ [Stylish](https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl=ja) というChrome拡張を入れる。
+ ChromeのツールバーのStylishアイコンを右クリック→オプションを開く
+ `新しいスタイルを作成`ボタンを押して以下の設定を作って保存

![979e1837569e6993cdd7e7ba8da1d32c.png](https://qiita-image-store.s3.amazonaws.com/0/18726/d8f03147-c291-8142-671c-e3ff5830707b.png)

- `名前`の「sldeshare-lastscreen-disabler」は適当
- `適用先`に「次で始まるURL http://www.slideshare.net/」を設定
- 以下のコードをコピペして保存する

```css:
.jsplLastScreenOverlay,
.lastScreenContainer {
  display:none !important;
  }
```

ただStylishだと複数環境にそれぞれ設定してやらないといけないのが面倒。

面倒嫌なのでChrome拡張作った。Chrome拡張の方はクラウド同期されて楽ちんなのでおすすめ。
daemontoolsの代替として最近使い出したスーパーサーバーSupervisorの導入


http://www.glidenote.com/archives/1684

$ cd /usr/local/src
$ sudo yum -y install python-setuptools
$ easy_install pip
$ pip install supervisor

### ログディレクトリ
$ mkdir -m 775 /var/log/supervisor/

### confディレクトリ
$ mkdir -m 775 /etc/supervisord.d

### conf精製用のコマンドで生成
$ echo_supervisord_conf > /etc/init/supervisord.conf 

```/etc/init/supervisord.conf
description "supervisord"
 
start on runlevel [2345]
stop on runlevel [!2345]
 
respawn
exec /usr/bin/supervisord -n
```

### supervisor起動

sudo initctl start supervisord

$ sudo supervisorctl status
redis                            STOPPED    May 02 01:59 PM

$ sudo supervisorctl start redis

$ sudo supervisorctl status
redis                            RUNNING    pid 31242, uptime 0:00:06

### 各種設定変更時

sudo supervisorctl reread redis

sudo initctl restart supervisord

## 参考

http://blog.craftgear.net/4f8d1f009c790e2b08000002/title/supervisor%E3%81%A7%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%AE%A1%E7%90%86


http://www.glidenote.com/archives/1684
npm コマンドメモ

- `npm install package_name@x.x.x` バージョンを指定してインストール
- `npm uninstall package_name` アンインストール
- `npm list` プロジェクトにインストールされているパッケージ一覧
- `npm list -g` グローバルインストールされているパッケージ一覧
さくっとLoadable Kernel Moduleを作るためのMakefile

```mf:Makefile
obj-m := foo.o 

KDIR  := /lib/modules/$(shell uname -r)/build
PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
```
参考：
http://docs.fedoraproject.org/en-US/Fedora_Core/6/html/Release_Notes/ar01s07s07.html
unicornがkill -USR2で再起動しない

とあるサーバーで、unicornをいくらkill -USR2しても再起動しないかったので、unicornのログをみたらこんなのが。

/home/ubuntu/.rvm/gems/ruby-1.9.2-p318/gems/bundler-1.1.1/lib/bundler/rubygems_integration.rb:147:in `block in replace_gem': unicorn is not part of the bundle. Add it to Gemfile. (Gem::LoadError)


Gemfileにunicornを記述するのを忘れていたようです。
まさに灯台もと暗し
CentOS6のPHP5.3をPHP5.4に入れ替える


追記：PHP5.5のインストール方法を投稿しました(2013/10/04)
http://qiita.com/pakiln/items/bcddcdd96e94dab96873
***
CentOS6のPHPはバージョン5.3.2で新しくはありません。
IUS(http://dl.iuscommunity.org/pub/ius/stable/Redhat/ )にPHP5.3系とPHP5.4系の新しいパッケージが用意されているのでその5.4に差し替えます。

手順はIUSのリポジトリを追加、それからCentOSデフォルトのPHP5.3をアンインストールして、IUSのPHP5.4をインストールです。

まずIUSリポジトリの追加。EPELリポジトリも必要らしいのでまとめて追加します。

```
$ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm
$ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/ius-release-1.0-11.ius.el6.noarch.rpm
$ sudo rpm -ivh epel-release-6-5.noarch.rpm ius-release-1.0-11.ius.el6.noarch.rpm
```
なお、上記はCentOS6の64ビット版の場合です。CentOS5または32ビット版が欲しい場合は次のサイトから該当するepel-releaseとius-releaseのrpmをダウンロードしてください。
http://dl.iuscommunity.org/pub/ius/stable/Redhat

次にインストール済みのPHP5.3パッケージを調べます。

```
$ rpm -qa | grep php
php-common-5.3.3-22.el6.x86_64
php-cli-5.3.3-22.el6.x86_64
php-devel-5.3.3-22.el6.x86_64
php-5.3.3-22.el6.x86_64
php-pear-1.9.4-4.el6.noarch
php-xml-5.3.3-22.el6.x86_64
```
それらを全て削除します。php.iniを変更していれば勝手にバックアップを取ってくれます。

```
$ sudo yum erase php php-devel php-common php-cli php-pear php-xml
(中略)
警告: /etc/php.ini は /etc/php.ini.rpmsave として保存されました。
(中略)
```
そしてPHP5.4のパッケージをインストールして、PHPバージョンの入れ替え完了です。

```
$ sudo yum install php54 php54-devel php54-common php54-cli php54-pear php54-xml
```

上記のphp54がIUSのPHP5.4を指します。
ちなみに各パッケージの出所は`yum info`コマンドのReleaseで確認できます。

```
$ yum info php54
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * ius: ftp.neowiz.com
 * updates: ftp.riken.jp
Installed Packages
Name        : php54
Arch        : x86_64
Version     : 5.4.16
Release     : 1.ius.el6
Size        : 9.1 M
Repo        : installed
From repo   : ius
```

補足。

IUSのPHP5.3はパッケージ名にphp53uを含みます。
現在、PHP5.3.26が用意されているので5.3系のバージョンを上げたいときにもIUSは有用だと思います。
5.3系が必要なら`yum search`コマンドでパッケージを確認してインストールしてください。

```
$ yum search php53u
```
Nancy入門してみた。

## なぜ、Nancy?

[OmniSharpServer][5]というものがありまして、この仕組みを調べていたらNancyにたどり着きました。  
「なぜ、[OmniSharpServer][5]？」っていう理由は[ココ][6]に書いてあることが始まりです。  
まぁこんな感じでNancyを入門してみました。  

## Hello World

Nancyを導入するにあたって必要となるのがNuGet.exeです。下記のURLからダウンロードできます。  

* [NuGet - Home][4]

Nancyを使うにはNuGetから必要なアセンブリをダウンロードしてくるしかないっぽいです。  
まぁそんなわけで、以下のコマンドでアセンブリをダウンロード出来ます。  

```sh:
$ ./NuGet.exe install Nancy
Successfully installed 'Nancy 0.17.1'.
$./NuGet.exe install Nancy.Hosting.Self
Attempting to resolve dependency 'Nancy (? 0.17.1)'.
Successfully installed 'Nancy.Hosting.Aspnet 0.17.1'.
$ ls
Nancy.0.17.1/  NuGet.exe* Nancy.Hosting.Self.0.17.1/
$ ls Nancy.0.17.1/lib/net40
Nancy.dll*
$ ls Nancy.Hosting.Self.0.17.1/lib/net40
Nancy.Hosting.Self.dll*
```


で次に、実際にNancyを使うコードが下記のような感じになります。

```csharp:
// sample.cs

using System;
using Nancy.Hosting.Self;

public class Sample
{
    public static void Main()
    {
        var nancyHost = new Nancy.Hosting.Self.NancyHost(new Uri("http://localhost:2000"));

        // ホストサーバー起動
        nancyHost.Start();

        // ホストサーバーがすぐに終了しないようにとりあえず入力を求めて止めておく。
        Console.ReadLine();

        // ホストサーバー停止
        nancyHost.Stop();
    }
}

// Nancy.NancyModule を継承するだけでOK
public class SampleModule : Nancy.NancyModule
{
    public SampleModule()
    {
        // 'http://localhost:2000/'でアクセスされた時に処理
        Get["/"] = _ => "Hello World!";
    }
}
```

ビルドは以下のような感じで出来ます。  
色々とめんどうなのでアセンブリをカレントディレクトリにコピーしてきています。  

```sh:
$ cp Nancy.0.17.1/lib/net40/Nancy.dll  .
$ cp Nancy.Hosting.Self.0.17.1/lib/net40/Nancy.dll  .
$ ls
Nancy.0.17.1/
Nancy.Hosting.Self.0.17.1/
Nancy.Hosting.Self.dll*
Nancy.dll*
NuGet.exe*
sample.cs
$ csc /R:Nancy.dll /R:Nancy.Hosting.Self.dll ./sample.cs
Microsoft (R) Visual C# Compiler Version 4.0.30319.17929
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
```

で、最後にこのURLを有効にするためにACLさんに許可してもらいます。(`DOMAIN\username`の部分は各自の環境に合わせて)

> netsh http add urlacl url=http://+:2000/ user=DOMAIN\username

実際に実行してアクセスしてみるとこんな感じになります。

![nancy-hello.png](https://qiita-image-store.s3.amazonaws.com/0/8325/b67be986-084b-bb51-f43b-3235699b90a9.png)


## 関連サイト

* [.Netの軽量Webフレームワーク「Nancy」を試してみた][0]
* [Nancy - Lightweight Web Framework for .net][1]
* [Introduction ・ NancyFx Nancy Wiki][2]
* [Self Hosting Nancy ・ NancyFx Nancy Wiki][3]

[0]: http://rabitarochan.hatenablog.com/entry/2012/07/18/131305#
[1]: http://nancyfx.org/#
[2]: https://github.com/NancyFx/Nancy/wiki/Introduction
[3]: https://github.com/NancyFx/Nancy/wiki/Self-Hosting-Nancy
[4]: http://nuget.codeplex.com/
[5]: https://github.com/nosami/OmniSharpServer
[6]: http://d.hatena.ne.jp/thinca/20130522/1369234427
PySideのスロットを定義する際の注意(2)


PySideでシグナルを指定する際, 通常は以下のように指定すればよい.

```python:signal_without_arg
# (object).(signal).connect(slot)
self.button1.clicked.connect(self.without_arg)
```

ただし, [clicked](https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QAbstractButton.html#PySide.QtGui.PySide.QtGui.QAbstractButton.clicked) のように,シグナルがオプション引数を持つ場合がある場合は少し注意が必要となる.
前述の指定の方法だと,オプション引数なしのシグナルとして解釈されるため,オプション引数ありのシグナルを使いたい場合は,以下のように明示的に渡される引数の型を指定する必要がある.

```python:signal_with_arg
self.button2.clicked[bool].connect(self.with_arg)
```

挙動確認用のコードは以下の通り.
button1/button2をクリックすると, それぞれのボタンが,引数の数が異なるスロット(without_arg/with_arg)にバインドされていることが分かる.

```python:onoff_button.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PySide.QtGui import QApplication, QMainWindow, QWidget, QPushButton,\
    QVBoxLayout


class OnOffButtonWidget(QWidget):

    def __init__(self):
        super(OnOffButtonWidget, self).__init__()
        self.__init_ui()
        self.__init_event()

    def __init_ui(self):
        self.button1 = QPushButton('button1', self)
        self.button2 = QPushButton('button2', self)
        self.button1.setCheckable(True)
        self.button2.setCheckable(True)

        vbox = QVBoxLayout()
        vbox.addWidget(self.button1)
        vbox.addWidget(self.button2)
        self.setLayout(vbox)

    def __init_event(self):
        self.button1.clicked.connect(self.without_arg)
        self.button2.clicked[bool].connect(self.with_arg)

    def without_arg(self):
        print 'without_arg'

    def with_arg(self, clicked):
        print 'with arg:{0}'.format(clicked)


def main():
    app = QApplication(sys.argv)
    window = QMainWindow()
    window.setCentralWidget(OnOffButtonWidget())
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
```

(ボタンクリック時の出力)

```tex:output
without_arg   (button1クリック時の出力)
with arg:True (button2クリック時の出力)
```

追記
-----------------------------------------

ドキュメントを見るとデフォルト値が分かるため(ex. clicked([checked=false]), デフォルト引数を使ってやれば共通のスロットが指定できる.

```python:with_optional
    def __init_event(self):
        self.button1.clicked.connect(self.with_optional)
        self.button2.clicked[bool].connect(self.with_optional)

    def with_optional(self, clicked=False):
        print 'with arg:{0}'.format(clicked)
```

追記2
-----------------------------------------
[activated](https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QComboBox.html#PySide.QtGui.PySide.QtGui.QComboBox.activated)のように,シグナルの中には名前,引数の数が一緒で,引数の型のみ違う場合もある. その場合は型の指定が必須になる.

```python:with_same
    def __init_event(self):
        self.combo.activated[str].connect(self.on_activated)
        self.combo.activated[int].connect(self.on_activated_init)

    def on_activated(self, text):
        self.label.setText(text)

    def on_activated_init(self, index):
        print index
```
console.log で画像表示

[dunxrion/console.image](https://github.com/dunxrion/console.image) みて面白いなーと思ったので、コア部分のアイディアだけメモ。

こんな感じ:

```js
var url = 'http://qiita.com/favicon.png';
console.log('%c+', 'font-size: 0px; padding: 8px; color: transparent; background: url(' + url + ');');
```

スクリーンショット: 
![実行例のスクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/755/15854e14-c931-4571-93a9-679de739af59.png)


[JavaScript - console.log でログに色付けたり枠付けたり - Qiita](http://qiita.com/k_ui/items/05525802f79f333450ce) の応用で:

* 対象の画像を背景画像に
* パディングを画像サイズに
* 中身の文字を透明ゼロサイズに

でできる。

* 参考: 元ネタのサンプルページ - http://dunxrion.github.io/console.image/

<del>しかしこれ、何に使うんだ・・・</del>
OpenSpendingにCSVリンク先URLを登録する際のバッドノウハウ


[OpenSpendingへの予算データの登録方法](http://qiita.com/niryuu/items/4adb658c627d2e6d48e4)に沿ってCSVデータを[OpenSpending](http://openspending.org/)へ登録する際、CSVデータをオンライン上のどこかに置く、という手順があります。

その際、Dropboxに置いて共有URLを使う、という手法が詳解されていますが、その際のちょっとしたTIPSです。

OpenSpendingで指定するURLとして、Dropboxの共有URLを指定する際、ブラウザのURL部分の文字列ではなく、ダウンロード用のリンク先を指定するようにしてください。

![katori-budget.csv_-_Dropbox.png](https://qiita-image-store.s3.amazonaws.com/0/9928/1d8e6a24-0242-023c-d9c2-d78263d65ce5.png "katori-budget.csv_-_Dropbox.png")


例えば、`katori-budget.csv`というファイルを共有している場合、正しいURLは以下になります。

``` 正解
https://dl.dropboxusercontent.com/s/nq6w68tsqdcf3qt/katori-budget.csv?token_hash=AAFLA90NYQpflFBUoaG0cIOo8eSUvH2kuwTedfOIu6MuIg&dl=1
```

ブラウザのURLバーに表示されているURLは以下ですが、こちらは間違いです。

``` 間違い
https://www.dropbox.com/s/nq6w68tsqdcf3qt/katori-budget.csv
```