OmniAICreator/Qiita-1.07M huggingface dataset:
Emacs 24.3 で migemo を使う

以前は普通に使えてたのに，Emacs 24.3 にバージョンを上げると migemo が使えなくなってしまった．現象としては，isearch でローマ字を入力したときに対応する日本語のハイライトはしてくれるのに，何度 C-s を入力してもカーソルが日本語に移動してくれないというものだ．

同じ現象に悩んでいる人がいれば .emacs に以下を記述するといいかもしれない．

```common-lisp
(setq search-whitespace-regexp nil)
```
配列要素をClass名で振り分けたHashに


仕事中にちょっと書いてみたんですが、実際やっぱりこんなことしなくても良かったので供養。

```ruby
target = [1, :hoge, "Foo", :fuga, "Bar", 2]
target.inject({}){|acc, obj| (acc[obj.class.to_s.intern]||=[]) << obj; acc}
#=> {:Fixnum=>[1, 2], :Symbol=>[:hoge, :fuga], :String=>["Foo", "Bar"]}
```
Cucumberで作ったfeatureファイルをブラウザで表示するアプリケーション

### アプリケーションを作った背景
* Cucumberでテストを書くとフィーチャーファイル(xxx.feature)とステップファイル(xxx_steps.rb)ができる
* どのようなテストをしているかコード管理システム(gitやsvnなど)から確認できる
* しかし、フィーチャーファイルを見るのに特化したアプリケーションがほしくなった

### 作成したアプリケーション
* Gitに公開した
 * https://github.com/RustyNail/CucumberViewer
* featuresディレクトリにフィーチャーファイルを配置するだけ
* 起動方法は```$ padrino start```だけ
 * padrinoはインストールが必要
* 日本語/英語対応済

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Storyboard上のView Controllerが動かせないのはSynergyのせい

超ニッチな話題。
なぜかStoryboard上のView Controllerをドラッグできない。
なんとこれ、Synergy(キーボード・マウスを複数PCでLAN経由で共有するツール)使ってるからだって。
http://stackoverflow.com/questions/8875543/why-cant-i-move-ios-storyboard-elements-around
なるほど、開発用Macに直差ししたマウスならVCをドラッグできる。
よく気づきましたね！！
dyld: DYLD_ environment variables being ignored because main executable (/usr/bin/sudo) is setuid or setgidを黙らせる


.bash_profileに以下が設定されていると、

```.bash_profile
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
```

sudoしたときに以下メッセージが表示される
Macのバグらしい？です。
参考URL：http://qiita.com/items/b5a6d1c6cdcb22be565f

```
dyld: DYLD_ environment variables being ignored because main executable (/usr/bin/sudo) is setuid or setgid
```

いちいち、うるさいので、黙らせる。
.bash_profileの1番最後に以下を追加

```.bash_profile
unset LD_LIBRARY_PATH
unset DYLD_LIBRARY_PATH
```

更新

```
$ source ~/.bash_profile
```

これで、邪魔なメッセージが出なくなる。
rbenv install (ruby-build) のスピードをあげたい

## アーカイブをキャッシュする

`RUBY_BUILD_CACHE_PATH` 環境変数を使うと，ビルド中にダウンロードする tar ball をそこにおいてくれます。すでにキャッシュに存在する場合は，それを利用してくれます。

    $ RUBY_BUILD_CACHE_PATH=/tmp rbenv install 2.0.0-p0

同じバージョンの Ruby を再ビルドする場合くらいしか使えないような気もしますが，複数のサーバで共有したり，手元にダウンロードしてあるアーカイブを使ったりとかいう状況だと役に立つかもしれません。

## RDoc, RI 用情報を生成しない

なんだかんだいって RDoc や RI 用情報の生成に時間がかかる (というか進捗が見えないまま時間がすぎるのがイヤ) ので，必要ないのであれば生成しないようにできます。(MatzRuby の場合)

    $ CONFIGURE_OPTS="--disable-install-rdoc" rbenv install -v 2.0.0-p0
rbenv を system-wide にインストールする際の傾向と対策

`rbenv install` とか `gem install` とか，どんな権限で実行すればいいのかわかんなかったのでたしかめました。

## rbenv install とか利用できるユーザを限定する場合

`rbenv` ディレクトリの group (たとえば `staff`) を設定して `chmod g+ws` とかする方法。
たぶん rbenv GitHub Wiki の Shared install of rbenv というページが元になってるんだろうけど，この Wiki ページは今やもう存在しないのでよくわかりません。

### インストール手順

Qiita にもいくつかあるし，kyanny さんの[記事](http://blog.kyanny.me/entry/2012/02/03/155652)もあるので，方法は割愛します。

### rbenv install の際

インストールできる権限 (例だと `staff` 所属) のユーザが，

    $ rbenv install 2.0.0-p0

などのようにする。

で，自分の環境だと `chmod g+s` しててもインストールしたユーザの user ID と primary group ID で `versions` 下に `0755` (`drwxr-xr-x`) でインストールされました (umask にもよるとは思いますが)。

ということは，結局アンインストールとか `gem install` とかは，そのバージョンの Ruby をインストールしたユーザーが行う必要がありそうです。

違っていたらすみません。

### gem install の際

インストールできる権限 (例だと `staff` 所属) のユーザが，

    $ gem install bundler

などのようにする。

んだけど，結局前項で書いたように，そのバージョンの Ruby をインストールしたユーザが system wide な gem install をする必要があり (そう) です。

## rbenv install とかしていいのは root 権限だけ (の場合)

(どうしても rbenv を system-wide にインストールしたい場合は) 個人的にはこちらのほうがおすすめ。

### インストール手順

適当ですが，<ins>`/usr/local/rbenv`</ins> <del>`/usr/lib/rbenv`</del> にインストールする場合。
要するに `chown` とか `chmod` とかしてないだけです。

    $ git clone https://github.com/sstephenson/rbenv.git
    $ cd rbenv
    $ mkdir versions
    $ mkdir shims
    
    $ mkdir plugins && cd plugins
    $ git clone https://github.com/sstephenson/ruby-build.git
    
      (ほか rbenv-gemset とか rbenv-default-gems とか rbenv-vars とかお好みで)
    
    $ cd ../..
    $ sudo cp -R rbenv /usr/local/

`ruby-build` の `install.sh` は実行していません。`ruby-build` コマンドを使わない (つねに `rbenv install` 等で実行する) のであれば，必要ないと思います。

あとは `/etc/profile.d/rbenv.sh` とか `/etc/skel/.bash_profile` とかに必要事項を書く。

```shell-session:
# cat > /etc/profile.d/rbenv.sh

export RBENV_ROOT="/usr/local/rbenv"

export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

CTRL+D
```

### sudo の設定

以下のインストール等を (`su -` や `sudo -Hi` 等で) root shell でおこなうならやる必要のないことですが， `sudo` でおこなうなら，sudo 先から `rbenv` や `ruby` 等が見えるようにする必要があります。
(root shell だと，個人ユーザの rbenv version と違ってくるので，`sudo` 使うほうがおすすめではあります)

* `Defaults` の `env_keep` に `PATH`, `RBENV_ROOT`, `RBENV_VERSION` を追加する
* `Defaults` の `secure_path` を設定しない (か，`secure_path` に `$RBENV_ROOT/shims`, `$RBENV_ROOT/bin` を追加する)

### rbenv install の際

root 権限で実行する。たとえば `sudo` 経由の場合，

    $ sudo rbenv install 2.0.0-p0

などのようにする。

### gem install の際

root 権限で実行する。たとえば `sudo` 経由の場合，

    $ sudo gem install bundler

などのようにする。

もちろん，root 権限は使わずに個人ディレクトリに

    $ gem install --user-install bundler

のようにしてインストールすることもできますが，個人ディレクトリの gem 用 `bin` ディレクトリに普通 `PATH` は通していないので

>     WARNING:  You don't have /home/dayflower/.gem/ruby/2.0.0/bin in your PATH,
>               gem executables will not run.

みたくおこられます。もちろん個人用に `PATH` 通してもいいんだけど，そうすると `rbenv` 使う意味がないですね。

Gem を system wide にインストールしたくないなら bundler 使えってことで。

### ちょっと困ること

`rbenv rehash` すると

>     rbenv: cannot rehash: /usr/local/rbenv/shims isn't writable`

みたく怒られてしまいます。
個人的には実害ほぼないのでいいんですけど。
ファイルディスクリプタ

OS全体

```
cat /proc/sys/fs/file-nr 
```


1プロセスがオープンできるファイルディスクリプタの上限(linuxはデフォルト1024)

```
ulimit -n
```

変更するには/etc/security/limits.conf に記述

```
root    soft    nofile  16384 
root    hard    nofile  32768 
```

プロセスのファイルディスクリプタ上限

```
cat /proc/32686/limits 
```

使用しているファイルディスクリプタ

```
/usr/sbin/lsof -p プロセスID
```
SciPy+matplotlibで3D散布図を作成(Python)


PythonでSciPy(NumPy)とmatplotlibを使って3D散布図を作成する方法です。
サンプルデータはiris.csvを使用(http://aima.cs.berkeley.edu/data/iris.csv)


+ scipy.genformtxtメソッドで、csvファイルのデータを直接scipy.array形式で取り込むことができます。

+ scipy.array形式のデータは普通の配列として扱うことができ、さらにd[d[:,0] >= 7]のように簡単に条件に合うレコードを抽出することができます。複数の条件式を使用する場合はビット演算子で連結します。

+ グラフ描画の際にはscatter3Dメソッドが使えますが、データ数が多いと極端に重くなります。<del>plotメソッドのほうが良いです。</del>
(5/9追記)<del>plotメソッドではデータの読み込み順にプロットが上書きされていくので、プロットが重なった時に立体的な前後関係がおかしくなります。scatterメソッドは処理が重く、グラフの回転操作に難がありますが、立体的な前後関係はより正確です。</del>
(5/10追記)立体的な重なりがおかしいのはscatterも同様でした。どうもmatplotlibの未解決問題のようです。きれいな3Dグラフ書きたい人はMayaViを使えとのこと。
http://matplotlib.org/mpl_toolkits/mplot3d/faq.html

+ plotメソッドのプロパティとして、color（マーカーの色）、ms（Marker Size、マーカーの大きさ）、mew（Marker Edge Width、マーカーの枠線の太さ）などが指定できます。

```python:plot3d.py
# coding: UTF-8

from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
from scipy import genfromtxt


# ファイル読み込み
d = genfromtxt("./temp/iris.csv", delimiter=",")

# グラフ作成
fig = pyplot.figure()
ax = Axes3D(fig)

# 軸ラベルの設定
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.set_zlabel("Z-axis")

# 表示範囲の設定
ax.set_xlim(4, 8)
ax.set_ylim(2, 5)
ax.set_zlim(1, 8)

# 抽出条件設定
d1 = d[d[:,0] >= 7]
d2 = d[(d[:,0] < 7) & ((d[:,1] > 3) & (d[:,1] <= 3.5))]
d3 = d[(d[:,0] < 7) & ((d[:,1] <= 3) | (d[:,1] > 3.5))]


# グラフ描画
ax.plot(d1[:,0], d1[:,1], d1[:,2], "o", color="#cccccc", ms=4, mew=0.5)
ax.plot(d2[:,0], d2[:,1], d2[:,2], "o", color="#00cccc", ms=4, mew=0.5)
ax.plot(d3[:,0], d3[:,1], d3[:,2], "o", color="#ff0000", ms=4, mew=0.5)
pyplot.show()
```


# 出力結果
別ウィンドウが開き、グラフが表示されます。
グラフはドラッグで自由に回転できます。
メニューバーのsaveアイコンで下記のようなpngファイルを出力できます。

![出力](https://qiita-image-store.s3.amazonaws.com/0/17925/c4a495c9-9609-d0e0-9283-3f863b27dba9.png)
NSDictionaryOfVariableBindingsマクロ

変数名をキー、その値をバリューにして辞書を作成します。

```objc
    NSNumber *hoge = @1;
    NSNumber *piyo = @2;
    NSDictionary *dict = NSDictionaryOfVariableBindings(hoge, piyo);
```

たま〜に使えるかもしれません
Node.jsとは何か？

結論：Node.jsとはスクリプト言語である。

最近、Node.jsを使い始めたので、知識をしいれようと
いろいろなサイトを見てまわったけど、
　・サーバーサイドJavascriptがどうの、
　・簡単にHTTPサーバが書けますだの、
胡散臭い宣伝文句じみた説明しか見かけない。

これでは、Node.jsがなんなのか初心者には何も伝わってこない。

冒頭で書いたように、”Node.jsはプログラミング言語の一種である”
と教えてくれれば、すぐに理解できるのに、
なんでサーバーサイドばかり強調するのだろう？

[Wikipedia](http://ja.wikipedia.org/wiki/Node.js "Node.js")で見ても、
これが、Node.jsのハローワールドです。ってのが以下。

```javascript
var http = require('http');
 
http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8000);
 
console.log('Server running at http://127.0.0.1:8000/');
```

サーバーサイドに興味ない人は、これだけでNode.jsを敬遠してしまうんじゃないだろうか？

ためしに、もっと簡単なハローワールドを書いてみる。

```javascript:helloworld.js
console.log('Hello, world!');
```

これだけである。

このプログラムを実行するには、Node.jsをインストールしたら
（インストールは検索してみてください。たくさん出ます。）
コマンドプロンプトで

```bash
node
```

と打ち込めば、Javascriptインタープリタ（としてのNode.js）が立ち上がる。
そこで、さっきのhelloworld.jsに書かれた１行を打ち込めばいい。

最後にもう一度言おう。
Node.jsとは、RubyやPerlやPHPやPythonのようなインタープリタ言語である。
もちろん、サーバーじゃなく自分のPCで気軽にプログラミングが楽しめる。

※Node.jsといった場合、ライブラリなどの環境を含めていうこともあるようだ。
　だが、それは別のお話。
Sublime Text 2 スニペット


```xml:sample.sublime-snippet
<snippet>
	<content><![CDATA[
Hello, ${1:this} is a ${2:snippet}.
]]></content>
	<!-- オプション: トリガーとなる単語を設定 -->
	<tabTrigger>hello</tabTrigger>
	<!-- オプション: トリガーとなる範囲を設定 -->
	<scope>source.python</scope>
</snippet>
```

↓カーソルをカーソルを持ってきてくれる

```
${1:this}
```


packageフォルダのUserフォルダに .sublime-snippet という拡張子で保存する

```
Sublime Text 2/Packages/User/sample.sublime-snippet
```
mroongaでgroongaの前方一致検索を使うには


いよいよ、[gihyo.jp](http://gihyo.jp/)さんでgroongaの隔週更新連載が始まりました!! 
第2回の記事も公開されたので、一読をおすすめします。

* [「第1回 全文検索エンジンgroongaを紹介します！」](http://gihyo.jp/dev/clip/01/groonga/0001)
* [「第2回 groongaをRuby On Railsでも使ってみた ～chikamap.comの事例から」](http://gihyo.jp/dev/clip/01/groonga/0002)

連載は始まりましたが、利用事例をどんどん紹介していきたいです。groongaやmroonga、rroongaを実際に使っていて、利用事例記事を書いてもいいよ、という人をまだまだ募集しています。
詳細は[groonga普及のための協力のお願い](http://sourceforge.jp/projects/groonga/lists/archive/dev/2013-February/001186.html)を参照してください。

# はじめに

MySQLで高速に全文検索するためのオープンソースのストレージエンジンとして[mroonga](http://mroonga.org/ja/)を公開しています。
この記事を書いた時の最新のバージョンは2013年4月29日にリリースした[3.03](http://mroonga.org/ja/docs/news.html#release-3-03-2013-4-29)です。

今回は、mroongaでgroongaの前方一致検索を使う方法を紹介します。

# mroongaにおける全文検索用のパーサ指定

mroongaではコメントを用いた独自の構文で全文検索用のパーサを指定することができます。
また、パーサだけでなくノーマライザーもコメントで指定することができます。

例えば、パーサに``TokenMecab``を利用したい場合には以下のようにコメントで指定します。

```
FULLTEXT INDEX (content) COMMENT 'parser "TokenMecab"'
```

指定できるパーサについては[全文検索用のパーサの変更](http://mroonga.org/ja/docs/userguide/storage.html#how-to-specify-the-parser-for-full-text-search)を参照してください。

3.03からはパーサの指定を明示的に無効にすることができるようになりました。

無効にする場合は、コメントで以下のように指定します。

```
FULLTEXT INDEX (content) COMMENT 'parser "off"'
```

# パーサを無効にした状態での前方一致検索

では、パーサを無効にできるとどのような利点があるのでしょうか。

実際の例で試してみましょう。

サンプルとして使うスキーマは以下の通りです。

```
CREATE TABLE test (
  id int(11) NOT NULL AUTO_INCREMENT,
  content varchar(255) NOT NULL COLLATE 'utf8_unicode_ci',
  content2 varchar(255) NOT NULL COLLATE 'utf8_unicode_ci',
  PRIMARY KEY (id),
  FULLTEXT INDEX content (content) COMMENT 'parser "off"',
  FULLTEXT INDEX content2 (content2)
) ENGINE=mroonga DEFAULT CHARSET=utf8;
```

テスト用のテーブルに一方はパーサを無効にしたカラムの``content``を用意し、もう一方はパーサを特に指定しないカラム``content2``を用意します。

サンプルとして使うデータは以下の通りです。

```
INSERT INTO test (content, content2) VALUES ('とらっく', 'とらっく');
INSERT INTO test (content, content2) VALUES ('とらっくばっく', 'とらっくばっく');
INSERT INTO test (content, content2) VALUES ('東京都', '東京都');
INSERT INTO test (content, content2) VALUES ('京都', '京都');
```

では、上記のデータでパーサを無効にした``content``カラムに対して前方一致検索してみましょう。

```
SELECT * FROM  test WHERE MATCH(content) AGAINST('とらっく*' IN BOOLEAN MODE);
```

期待通りに``とらっくばっく``と``とらっく``が結果に含まれています。

```
id	content	content2
2	とらっくばっく	とらっくばっく
1	とらっく	とらっく
```

では、デフォルトのパーサが適用される``content2``カラムに対して前方一致検索してみましょう。

```
SELECT * FROM  test WHERE MATCH(content2) AGAINST('とらっく*' IN BOOLEAN MODE);
```

この結果は0件となり、``とらっくばっく``にも``とらっく``にもヒットしません。
これはデフォルトのパーサがバイグラムでトークナイズしているためです。
何も指定しないと、``TokenBigram``を指定した場合と同じになります。

前方一致検索でデフォルト設定によりトークナイズした結果がインデックスとして使われてしまうと、期待した結果を得られません。

同様の理由で、パーサを無効にしないと``東京*``ならヒットしますが``東京都*``だとヒットしないということになります。

このような場合に、パーサを明示的に無効にできると意義があります。

これまでもパーサに``TokenDelimitNull``を指定すれば似たようなことはできましたが、カラムにnull文字が含まれていないことを担保する必要がありました。

# まとめ

今回はmroongaでgroongaの前方一致検索を使う方法を紹介しました。

ノーマライザーも一緒に指定できるようになったので、``NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark``も指定すれば、``utf8_unicode_ci``を使いつつも、濁点は区別して全文検索を行うことができたりします。


mroongaに興味をもったら、まずは[インストール](http://mroonga.org/ja/docs/install.html)してみてください。

動作を知りたいというのであれば、[ユーザーガイド](http://mroonga.org/ja/docs/userguide.html)もあります。
Raspberry PiでCloud9のソースを動かすには

# v0.6系で、出来た!
v0.10系だとだめ、v0.8系でもだめ。ということで、0.6系を使いました。
（OSXだと0.8系でビルドできて、動いたんだが。。）


## node.js本体のインストール
nvmでのv0.6系のインストールを試みるもビルドでエラーとなってしまったので、パッケージで入れた。

```
sudo apt-get install nodejs
mkdir -p ~/local/bin
cp /usr/bin/nodejs ~/local/bin
export NODE_PATH=~/local
export NODE_HOME=~/local
```

## npmのインストール
npmをGithubのページの方法に従い、 npm_conf_prefix=~/local を指定してインストールする。

```
wget https://npmjs.org/install.sh
npm_config_prefix=~/local sh install.sh
```

```
git clone https://github.com/ajaxorg/cloud9.git
rm -rf ~/.sourcemint
cd cloud9
rm -rf node_mod*
npm install -g sm
sm install
```

# 完成
ビルドはv0.6でないとうまくいきませんでしたが、動かすことは
v0.8系ならばできました。

node.jsだから処理が軽いだろう？とあまり根拠なく期待してましたが、
もっさり感たっぷりでした。。。

# 元のブログ記事
[UbuntuやRaspberry PiでCloud9のソースを動かすには](http://kjunichi.cocolog-nifty.com/misc/2013/04/ubunturaspberry.html)
UIRefreshControlで引っ張って更新をする

facebookなどのアプリでよく見る、引っ張って更新(Pull to Refresh)を実装する方法です。

実装はかなり簡単です。UIRefreshControlのインスタンスをUITableViewControllerのUITableViewControllerにセットするだけです。
更新処理はUIRefreshControlのaddTarget:action:forControlEvents:でアクションを設定すればOKです。

```objc
- (void)viewDidLoad
{
    [super viewDidLoad];

UIRefreshControl *refreshControl = [[UIRefreshControl alloc]init];

// 更新アクションを設定
[refreshControl addTarget:self action:@selector(onRefresh:) forControlEvents:UIControlEventValueChanged];

// UITableViewControllerにUIRefreshControlを設定
self.refreshControl = refreshControl;
}

- (void)onRefresh:(id)sender
{
    // 更新開始
    [self.refreshControl beginRefreshing];
    
    // 更新処理をここに記述
    
    // 更新終了
    [self.refreshControl endRefreshing];
}
```

引っ張った時にでてくるテキストとかもいろいろ変更できるようです。
IAMポリシーで変数を利用してみる

 * いつの間にIAMポリシーに変数が利用出来るようになっていたので試してみる
  * [Amazon Web Services ブログ: 【AWS発表】AWS IAM - アクセス制御のポリシーに変数を利用可能に](http://aws.typepad.com/aws_japan/2013/04/variables-in-aws-access-control-policies.html)
 * IAMポリシーの設定が楽になりそう

## 試した手順
 * 適当なIAMグループを作成する
 * Permissionsで以下のようなポリシーを設定する
  * [AWSアカウントID]の実際の数字に置き換えている
  * 次の権限を持つように設定：IAM以外の全ての権限、IAMの閲覧権限、IAMの自分のアカウントのCredentials発行/更新権限

```javascript:JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "NotAction": "iam:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:ChangePassword",
        "iam:CreateAccessKey",
        "iam:DeleteAccessKey",
        "iam:UpdateAccessKey",
        "iam:UpdateSigningCertificate",
        "iam:UploadSigningCertificate",
        "iam:UpdateLoginProfile"
      ],
      "Resource": [
        "arn:aws:iam::[AWSアカウントID]:user/${aws:username}"
      ]
 
    },
    {
      "Action": [
        "iam:Get*",
        "iam:List*"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}
```

 * 適当なIAMユーザを作って上記のグループに所属させる
 * 作成したIAMユーザにパスワードを設定してManagement Consoleにログインしてみる
 * 動作を確認してみる => OK
  * Management ConsoleでIAMサービスを閲覧できること => OK
  * EC2などのIAM以外の操作ができること => OK
  * IAMの自分のアカウントのCredensial発行ができること => OK
  * IAMの自分のアカウント以外の操作についてできないこと => OK

## 変数に対する要望
 * AWSアカウントを複数使う予定があるが、AWSのアカウントIDの変数がないらしくベタ書きする必要があるので変数を用意してほしい。

## はまった
 * "Version": "2012-10-17"を入れていなかったら変数が正しく動作しないらしく、IAMの自分のアカウントの操作ができなかった。
AWSにGitLabとRedmineをインストールしてみた

数ヶ月前に取得したAWSのアカウントの無料期間がもったいないので、Amazon EC2にGitLab 5.1とRedmine 2.3をインストールしてみました。
無料の範囲内だとメモリが613MiBしか利用できませんが、個人利用程度なら問題なく使用できそうな感じでした。アカウントの取得から最初の1年間は無料なので、個人用のGitLabとRedmineが欲しい場合は試してみてはいかがでしょうか？

折角なので、しばらくデモサイトとして公開しておきます。[前の記事](http://qiita.com/items/b3c18784dedc6c64f3a1)で紹介した、ネットワークの表示速度の改善も適用してあるので、どれくらい高速化されるのか体感してみたい場合は試してみて下さい。

* [GitLab](http://ec2-gitlab.hiroponz.net)
* [Redmine](http://ec2-redmine.hiroponz.net)

ユーザー: test
パスワード: 12345678

構築手順の説明は面倒なので書きませんが、ネット上に参考になる情報がたくさんあるのでそんなに難しくはないと思います。
Raspberry Pi にOCaml-4.00.1をソースからインストールする

Raspberry Pi (Type B) に最新のOCamlをソースからインストールするためにやったことメモ(最新版にこだわらない人は apt-get install ocaml でOK)

## Raspberry Pi のswap領域を増やす
ocamlのビルドにはメモリがたくさん必要な部分があるので、また、今後の開発のためにメモリのswap領域を1GBに増やしました。

参考: http://qapla.blog52.fc2.com/blog-entry-296.html

## OCamlソースコードのダウンロード

$ wget http://caml.inria.fr/pub/distrib/ocaml-4.00/ocaml-4.00.1.tar.gz
$ tar xzvf ocaml-4.00.1.tar.gz

## Raspberry Pi用のパッチを当てる
もともとOCamlはARM向けのネイティブコンパイラがありますが、そのままだとRaspberry Piではうまくいかない部分があるようです。

Anil Madhavapeddyさんという方がRaspberry Pi用のocaml patchを書いているのでそれを使わさせてもらいましょう。

  $ cd ocaml-4.00.1
  $ wget https://github.com/avsm/ocaml/commit/dc0776f55108a20dad5a9c06188545dc08dbf462.patch
  $ patch -p1 < dc0776f55108a20dad5a9c06188545dc08dbf462.patch

## OCamlのビルド・インストール
あとは普通のOCamlと同様です。

  $ make world.opt
  $ sudo make install

以上でocamlインストールできました。
have fun!
コンパイル時に関連プロパティを自動で追加する属性

# モチベーション

次のような何かデータベース上のテーブル行を表す、ありがちそうなクラスを考える。

```py
# python じゃないよー。Booだよー。
class Person:
	public Id as int
	public Name as string
	public Age as int
	# その他いろんなもの

	# 指定idのデータを取得する static メソッド。
	public static def Get( id as int ) as Person:
		# ...
```

きっとこのテーブルは、次のような同様のクラスからIdを使って参照されている。データベースに乗っていたり、シリアライズされたりするだろうから、Person を直接参照することはできない。

```py
class Family:
	public FatherId as int  # PersonのId
	public MotherId as int   # PersonのId
	# その他いろんなもの
```

このFamilyクラスインスタンスから、各メンバーのPersonを取得するのは簡単だけど面倒くさい。

```py
f as Family
print Person.Get(f.FatherId).Name
print Person.Get(f.MotherId).Age  # 女性の年齢を尋ねるとは不謹慎な！
```

Personから更に別のIdを使った参照があるとダラダラと Get() なメソッドが連鎖してしまう。

# 目標

上のFamilyが次のようなコードとなるような自動化の仕組み。

```py
class Family:
	public FatherId as int
	public MotherId as int

	public Father as Person:  # このプロパティをコンパイル時に自動挿入
		get:
			return Person.Get(FatherId)

	public Mother as Person:  # このプロパティをコンパイル時に自動挿入
		get:
			return Person.Get(MotherId)
```

# 解決方法：GetするPropertyを勝手に追加してくれる属性を作る。

コンパイル時にGet()してくれるプロパティ構文木を追加する次の属性を作る。

```py
import Boo.Lang.Compiler
import Boo.Lang.Compiler.Ast

# [IdField(クラス名)] とすると "return クラス名.Get()" というプロパティを追加生成する属性。
# AbstractAstAttribute は構文木を書き換える属性のためのクラス。Apply()をオーバーライドして属性適用時の処理を書く。
public class IdFieldAttribute( AbstractAstAttribute ):

	private refclass as ReferenceExpression

	def constructor( cls as ReferenceExpression ):
		refclass = cls

	def Apply( node as Boo.Lang.Compiler.Ast.Node ):
		# c = 属性のついた構文木ノードの直近のclass定義
		c = node.GetAncestor[of ClassDefinition]()
		assert c != null
		# idf: 属性のついたノードがフィールドかどうか。Idで終わっているかどうか等チェック。
		idf = node as Field  # フィールドの構文木ノードクラスは Boo.Lagn.Compiler.Ast.Field
		return if idf == null or not idf.Name.EndsWith( 'Id' ) or idf.Name == 'Id' or not idf.IsPublic or idf.IsStatic

		# フィールド名から Id を除いた名前でプロパティ構文木生成。
		n = idf.Name[:-2]
		pn = ReferenceExpression( n )
		prop = [|
			public $(pn) as $(refclass):
				get:
					return $(refclass).Get($(ReferenceExpression(idf.Name)))
		|]
		prop.LexicalInfo = idf.LexicalInfo

		# 作ったプロパティをクラスにメンバとして追加する。
		c.Members.Add( prop )
```

このソースを IdFieldAttribute.dll としてビルドする。次のような感じ。

```sh
$ booc -o:IdFieldAttribute.dll IdFieldAttribute.boo
```

このdllを他のプログラムコンパイル時に参照することで、次のようにIdField 属性を使用出来る。Person については前述のものと同じ。

```py
class Family:
	[IdField(Person)]   # Father as Person というプロパティができる
	public FatherId as int
	[IdField(Person)]  # Mother as Person というプロパティができる
	public MotherId as int

f = Family( FamilyName:'Taira', FatherId:1, MotherId:2 )
print f.Father.Name   # f.Father で直接 Person が取得できる。
print f.Mother.Name   # 女性の年齢を聞くのはやめよう。
```

## 注意点

名前違いのプロパティを構文木レベルで追加しているだけなので、同名のメンバーがすでに定義されていたら、当然コンパイルエラー。

# IQuackFu

実は IQuackFu インターフェースを使うと、上記の方法よりももっと簡単でメンテナンス性のいい実装になったりはする。

ただ、IQuackFu は型指定できない(objectだけ)ので、型違いのエラーを実行時にしか検出できない。

# 結論

まぁまぁ便利だけど、この IdField はどうしてもほしい物か？と聞かれるとやや疑問ではあるかも。

好き勝手な属性を作り続けると、何をやってるのかわからない大変なプログラムになるかもしれない。

ただ、このぐらいなら許されるような気がする。
照合順序の異なるテーブルを結合してエラーが発生した場合

異なる照合順序の結合でエラーが発生する場合がある。

mysql> show table status like 'foo' \G;
*************************** 1. row ***************************
Collation: utf8_unicode_ci

mysql> show table status like 'hoge' \G;
*************************** 1. row ***************************
Collation: utf8_general_ci

mysql> desc foo;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| code  | varchar(32)  | YES  |     | NULL    |       |
| name  | varchar(256) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc hoge;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| code  | varchar(32)  | YES  |     | NULL    |       |
| val   | varchar(256) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

結合でエラー発生
↓
mysql> select * from hoge h, foo f where h.code = f.code; 
ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='

上記のエラー回避するには、COLLATE節を使用して、どちらかのデフォルトの照合順序を無効にしてしまえば良い

mysql> select * from hoge h, foo f where h.code = f.code collate utf8_general_ci; 
+------+--------+------+--------+
| code | val    | code | name   |
+------+--------+------+--------+
| 0001 | ほげ   | 0001 | ふー   |
+------+--------+------+--------+
1 row in set (0.00 sec)


mysql> select * from hoge h, foo f where h.code collate utf8_unicode_ci = f.code; 
+------+--------+------+--------+
| code | val    | code | name   |
+------+--------+------+--------+
| 0001 | ほげ   | 0001 | ふー   |
+------+--------+------+--------+
1 row in set (0.00 sec)
herokuで「The page you were looking for doesn’t exist.」エラーが出るときの対処法

herokuに Railsのプロジェクトをデプロイすると、オフィシャルドキュメントに従って作業をすると、次のようなエラーメッセージが表示されてしまいます。

> The page you were looking for doesn’t exist.

これは、Rails 3.2以降で発生する現象で、アセット周りのプリコンパイルが影響しているのだとか。これを回避するには、オフィシャルドキュメントの手順に加えて次の手順をしなければならないようです。

ローカルに Railsのプロジェクトを作ったら、gitで pushをする前に

> rake assets:precompile

と打ち込みます。後は、デプロイすればOK。結構はまります。
Bashのブレース展開で00:00から23:59まで

```bash
$ ( for TIME in {{0..1}{0..9},2{0..3}}:{0..5}{0..9}; do echo $TIME; done; )
00:00
00:01
00:02
(中略)
23:57
23:58
23:59
```

内容と関係ないんだけど、変数使ってシェル芸キメる時に全体を括弧でくくらないとなんか気持ち悪いのって自分だけ？


#2015/04/23追記
↓ブレース展開でゼロパディングできる環境なら

```bash
$ echo {00..23}:{00..59} |xargs -n1
````
[zf2] セッションの設定

ZF2.2

セッションの設定はSession Managerが管理している。

Session Managerを生成する上で[公式マニュアル](http://framework.zend.com/manual/2.1/en/modules/zend.session.manager.html)の例をそのまま採用するとModule.phpが肥大化してしまうので、Session Managerを生成するためのFactoryを自作しなきゃいけないのかと思ったら、すでにFactory (\Zend\Session\Service\SessionManagerFactory) が用意されていた。

SessionManagerFactoryは以下のように利用する。

```Module.php
public function getServiceConfig() {
    return include __DIR__ . '/config/service.config.php';
}
```

```sevice.config.php
<?php

return array(

// Service Factoryを登録します.
'factories' => array(
    'SessionManager' => '\Zend\Session\Service\SessionManagerFactory',
),

// Session Managerの動作を設定します.
'session' => array(
    'config' => array(
        'class'   => '\Zend\Session\Config\SessionConfig',
            'options' => array(
                'name'                => 'zf2s',
                'remember_me_seconds' => 86400,
        ),
    ),
    // セッションの管理方法を指定する.
    // デフォルトは\Zend\Session\Storage\SessionArrayStorage.
    'storage' => '\Zend\Session\Storage\SessionArrayStorage',
    // デフォルトのSession Container Managerとして利用する.
    // デフォルトの値はtrue.
    // 'enable_default_container_manager' => false
),

);
```
MongoDB 準備めも Mac

ちょっと勉強会向けに準備したことメモ。

# 事前情報　マシン環境
* MacBook Air(11-inch, Late 2010)
* OS 10.7.5
* プロセッサ  1.4 GHz Intel Core 2 Duo
* メモリ  2 GB 1067 MHz DDR3
* ソフトウェア  Mac OS X Lion 10.7.5（11G63）

あ、、最近使ってなかったから忘れてたけどこれライオンさんか。

# やったこと！
MacPortsとか入っていないしいろいろ限界なマシンなので、、、ダウンロードしたものを動かしてみる方向で。
1. http://www.mongodb.org/downloads でMacのところからとってくる。
2. とってきたものを展開して名前長かったので変更してアプリケーションのところへフォルダごと移動
3. ターミナルでバージョンが見れるかたたいてみる

>$ /Applications/mongodb/bin/mongod --version
>db version v2.4.3
>Tue May 21 20:20:23.054 git version: fe1743177a5ea03e91e0052fb5e2cb2945f6d95f

一応、動いたっぽい。

## 引き続きちょっと触ってみる

さらにターミナルからたたいてみる、前にグーグル先生情報だとデータディレクトリが必要そうなので作ってからそこを指定して起動

>$ mkdir /Applications/mongodb/data
$ /Applications/mongodb/bin/mongod --dbpath=/Applications/mongodb/data/ &

別窓から接続。成功っぽい。

>$ /Applications/mongodb/bin/mongo
MongoDB shell version: 2.4.3
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
Server has startup warnings: 
Tue May 21 20:42:42.920 [initandlisten] 
Tue May 21 20:42:42.921 [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000
＞ show dbs
local	0.078125GB
＞ exit
bye


ひとまずのメモ。
開発環境整えたらMacPortsか何かでやりたいな。。
iOSシミュレータが起動しなくなった！！！



なぜだかよくわからんとですけど、iOSシミュレータが起動しなくなったとです。

いろいろ触ってみたところ

>iOSシミュレータ＞コンテンツと設定をリセット

これを実行することで元に戻ったですたい。
PHPの基礎 - プログラミングの基礎 - 

## 配列の基礎
 * 配列とは何かを調べて下さい
 * 変数$item に1から10までの値を入れてechoで1つずつ表示するプログラムを書いて下さい。

## 条件分岐
 * まずif文とはどういうものか調べてみましょう

 * 以下のコードをコピーして実行してみて下さい。

 ```sample.php

<?php

$al = 10;
$fr = 20;

if ( $al > $fr  ) {
    echo 'al is big.';
} else {
    echo 'fr is big';
}

?>
```

上のファイルを参考にして、

```comp.php
<?php

$al_number = 10;
$fr_number = 20;
$mu_number = 30;

//snip

?>
```

```//snip``` の部分にif else if, else などを使い、最も大きな値がどれか分かるように記述して下さい。やり方は問いません。自由に記述してみて下さい。

## ループ
 * for文とは何かを調べ、1から20までループしてそれを全てブラウザで表示させて下さい。

 * for文で1から20まで数字を配列にいれ、それを全てブラウザで表示させて下さい。


これらの実行が終わったら、コメント欄にプログラムソースを貼付けて下さい。
Jade HTML5 Boilerplate

```Jade:index.jade
!!! 5
//if lt IE 7
  <html class="no-js lt-ie9 lt-ie8 lt-ie7">
//if IE 7
  <html class="no-js lt-ie9 lt-ie8">
//if IE 8
  <html class="no-js lt-ie9">
//[if gt IE 8]><!
html(class='no-js')
  //<![endif]
  head
    meta(charset='utf-8')
    meta(http-equiv='X-UA-Compatible', content='IE=edge')

    title

    meta(name='description', content='')
    meta(name='viewport', content='width=device-width, initial-scale=1')

    link(rel='stylesheet', href='css/normalize.css')
    link(rel='stylesheet', href='css/main.css')
    script(src='js/vendor/modernizr-2.6.2.min.js')

  body
    //if lt IE 7
      p.browsehappy You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.

    p Hello world! This is HTML5 Boilerplate.

    script(src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js')
    script window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')
    script(src='js/plugins.js')
    script(src='js/main.js')

    script.
      (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
      function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
      e=o.createElement(i);r=o.getElementsByTagName(i)[0];
      e.src='//www.google-analytics.com/analytics.js';
      r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
      ga('create','UA-XXXXX-X');ga('send','pageview');
```

## Version

HTML5 Boilerplate Version 4.3.0

## References

* https://gist.github.com/xtian/888338
* https://raw.github.com/kaosf/jade-h5bp/v4.3.0/index.jade
* https://raw.github.com/h5bp/html5-boilerplate/v4.3.0/index.html
subversionでactive directory認証をする

subversionでactive directory認証をした時の設定をメモしておく。

adサーバ
Windows2000

svnサーバ
CentOS5.9
subversion 1.6.13

```svn.conf
<VirtualHost *:80>
  ServerName svn
  ServerAlias svn.example.co.jp
  ErrorLog /var/log/httpd/svn_error_log
  TransferLog /var/log/httpd/svn_access_log
  <Location />
    DAV svn
    SVNParentPath /pub/svnrepos
    AuthBasicProvider ldap
    AuthType Basic
    AuthzLDAPAuthoritative off
    AuthName "Example Subversion Repository"
    AuthLDAPURL "ldap://example.co.jp:389/DC=example,DC=co,DC=jp?sAMAccountName?sub?(objectClass=*)"
    AuthLDAPBindDN "CN=admin,CN=Users,DC=example,DC=co,DC=jp"
    AuthLDAPBindPassword ********
    <LimitExcept GET PROPFIND OPTIONS REPORT>
      Require ldap-group CN=svn,CN=Users,DC=example,DC=co,DC=jp
    </LimitExcept>
  </Location>
  Redirect 404 /favicon.ico
</VirtualHost>
```
svnというユーザグループを作ってそこにユーザを追加すれば更新可能ユーザになる。
RubyからRを使う（Mountail Lion）


###1. R_HOMEの設定
.bash_profileに以下を追加。

```.bash_profile
export R_HOME=/Library/Frameworks/R.framework/Resources
```

###2. RSRubyをインストール

```
$ gem install rsruby -- --with-R-lib=/Library/Frameworks/R.framework/Libraries --with-R-include=/Library/Frameworks/R.framework/Headers
```

###3. 動くか試す
```r_ruby.rb
require 'rsruby'
r = RSRuby::instance
puts r.sum(1,2,3)   #=> 6
```

##参照
・[rakkyooの備忘録 RubyでRの関数を使う（macOS X）](http://rakkyoo.net/?p=602 "RubyでRの関数を使う（macOS X）")
・[Mae向きな日記 RSRubyのインストール](http://d.hatena.ne.jp/rahaema/20121228/p1 "RSRubyのインストール")
Javascriptで数値の3桁区切りを実装


10,000円とか、値段表記の際に使う数値の3桁区切りを行う関数。

```
function addFigure(str) {
	var num = new String(str).replace(/,/g, "");
	while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
	return num;
}
```

参照
http://okadao.blogspot.jp/2009/10/javascript3.html
【中上級者お断り】初心者のためのgit利用入門


私は主業務がインフラなので、共同作業をする相手も同じくインフラなエンジニアが多いです。インフラエンジニアの中には開発経験が浅い、もしくは全く無い人間も少なくないので、scmの扱いはチームの最大公約数、故に原始的で汚くなります。

なので、gitの履歴をきれいに保つために、かんたんに出来るプラクティスについてまとめます。

## 作業の流れ
### 1. とりあえずブランチ
諸悪の根源の一つは、master（ないしは更新すべきブランチ）での直接作業です。なので、とにかくブランチを作ります。
お勧めは「今やろうと思っている作業」を単位にすることなので、名前もそれっぽい（`make_backup_script_for_wap`みたいな）感じで作ります。

```make_branch_and_use
$ git branch
# 初期状態
* maser

# ブランチを作って移動
$ git branch kinou_tsuika
$ git checkout kinou_tsuika

# 確認
$ git branch
* kinou_tsuika
  master
```


### 2. コミットは自由に
ブランチを切っている場合は、いくらコミットしてもとりあえずその中の話になります。なので、コメントを付けつつ気にせずコミットします。

```change_and_commit
# 編集して
$ vim hogehoge.txt

# commit
$ git add hogehoge.txt
$ git commit -m 'change parameters'
```


### 3. 長くなりそうなときはリモートブランチにさくさくpush
作成時間がちょっと長くなりそうだったり、違う端末でも作業をしたい場合は、2の作業結果をちょくちょくpushすると捗ります。

```remote_push
# リモートブランチを確認
$ git branch -a
* kinou_tsuika
  master
  remotes/origin/master

# 大丈夫そうなので、リモートブランチの作成
$ git push origin kinou_tsuika

# 無事できた
$ git branch -a
* kinou_tsuika
  master
  remotes/origin/master
  remotes/origin/kinou_tsuika
```


### 4. 履歴をきれいにまとめる
ここまでではリモートブランチを使う場合もメインでないブランチです。つまり、閉じた世界なのでどこにも反映されません。というわけで、反映してみます。

```merge_to_master
# メインのブランチに切り替えて
$ git checkout master

# ひとまず最新に更新して
$ git pull origin master

# 自分の変更分をsquashで取り込んで、再コミット
$ git merge --squash kinou_tsuika
$ git commit -m 'kinou_tsuika done'

# きれいになったコミットをpush
$ git push origin master

# 後始末のブランチ削除
$ git branch -D kinou_tsuika
$ git push origin :kinou_tsuika
```



## まとめ
要点はこれだけです。これならできませんか・・・？

- こまめにbranchをつくる
- remote branchも気軽につくる
- remoteへのpushは--squashなmerge後に


## 【番外編】失敗からの回復方法
### ブランチ作るの忘れちゃった
気付いたらmasterとか、直接更新しないはずのブランチを更新しちゃってた場合

```forget_create_branch
# コミット未遂
$ git status
変更内容がずらずら…

# 現在の変更内容を一時保存（コミットではない）
$ git stash

# 急いでブランチを作り直して
$ git branch hoge
$ git checkout hoge

# 一時保存したやつを戻す
$ git stash pop
```

### ブランチ壊しちゃった
masterブランチがえらいことになった。自力でなおせない。。。

```recover_remote_branch
# mergeに失敗してmasterが壊れた。。。
$ git branch -a
  master
* kinou_tsuika
  remotes/origin/master

# 壊れたローカルのmasterを消す！
$ git branch -D master

# そして再生
$ git checkout -b master origin/master
$ git branch
* master
  kinou_tsuika
  remotes/origin/master
```
apt-get upgradeから特定パッケージを除外する

apt-get upgradeしたいけど、バージョンアップすると今の設定が効かなくなるパッケージがあるときの対処方法。

```
$ echo [パッケージ名] hold | sudo dpkg --set-selections
```

holdしたものを解除する。

```
$ echo [パッケージ名] install | sudo dpkg --set-selections
```
Homebrew で gcc4.7 を入れる

Mac って `gcc` のバージョンが古くて C++ の C++11 の機能が全く使えなくて悲しくなります

ということで変えましょう

前提として

* Homebrew を使っている
* `brew doctor` してもエラーが出ない

が必要です

    brew tap homebrew/versions
    brew install gcc47

ひたすら待ちましょう

終わってもエイリアスは `llvm` に貼られたままなので上書きます

    sudo ln -sf /usr/local/bin/gcc-4.7 /usr/bin/gcc
    sudo ln -sf /usr/local/bin/g++-4.7 /usr/bin/g++

`gcc --version` とかして望みのバージョンが出れば完了です

ただ `-static` オプションつけたらエラーが出たりするのでガッツリ使いたいなら Linux ディストリビューション使いましょう…
その日の成果をコミットログとして取得する


その日にコミットしたタイトルとリポジトリ(GitHub)のURLを簡単に取得できるようにしました。
以下のような形式で取得できます。

vimのタグ設定
 https://github.com/shoyan/dotfiles/commit/ee2634b83e6cb2f0d8294b20af362beedf46837c
行末選択しやすくする
 https://github.com/shoyan/dotfiles/commit/9480b8392a95c133edf69185c3da777ae62f268d
branchをbrで使えるように
 https://github.com/shoyan/dotfiles/commit/b881ab093ed929b1731f1978fbf7dbfcde4cbf36
compareコマンド追加
 https://github.com/shoyan/dotfiles/commit/01fb7d644312bc0e86a7f646292c2de2e7e0e18a

## 設定方法

~/.bashrcに以下を記述してください。

```Bash:.bashrc
function seika {
    local URL="$(git remote -v | head -n 1 | sed -e 's|.*git@\(.*\):\(.*\)\.git.*|https://\1/\2|g')"; git log --pretty="%s \n $URL/commit/%H" --author="$(git config --get user.name)" --since=1.days | sed 's/\\n/\
/g'
}
```


## 実行方法
コミットログを取得したいGitのワーキングディレクトリで以下のコマンドを入力します。

```sh
$ seika
```
CommonLispでjQueryのようなDOMアクセスを行う方法

CommonLispにはHTMLのparseを行うライブラリは様々あります。
http://www.cliki.net/HTML%20parser

がjQueryのようなcssでセレクタを指定する形式のものとして
[stp-query](https://github.com/nubgames/stp-query)というライブラリをquicklispを眺めていたら見つけたので簡単に使い方をメモしておきます。

```common-lisp:stp-query.lisp
(ql:quickload "drakma")
(ql:quickload "stp-query")
(ql:quickload "jp")
(ql:quickload "cxml-stp")

;; "->" マクロで利用している関数
;; どこ由来の関数なんだろう...?
(defun ensure-list (thing)
  "Returns THING as a list.

If THING is already a list (as per listp) it is returned,
otherwise a one element list containing THING is returned."
  (if (listp thing)
      thing
      (list thing)))

;; jQueryのようにチェインしたいのでマクロを定義
;; stp-queryの作者のbackportsリポジトリより拝借
(defmacro -> (x &rest forms)
  "Threads X through FORMS in second postition."
  (if (null forms)
      x
      `(-> ,(let ((list (ensure-list (first forms))))
              (list* (first list) x (rest list)))
           ,@(rest forms))))

;;
;; drakmaでWebページを取得してcxml-stpのツリーに変換
;; その内容を$:findで検索してみる
;;
;; アクセス先はさくらんぼ亭の公式Web
;;
(let* ((web-page (ql:quickload "stp-query")
       (parsed-doc (chtml:parse web-page (cxml-stp:make-builder)))
     (-> ($:find parsed-doc "li") ($:find "a"))))
```

こんな感じでjQueryのようにDOMを取得できます。
オフラインどう書く第11回参考問題 お試し(C)  

http://qiita.com/items/c206fbc645c255cb7de6

イベントに参加というわけではありませんが面白そうだったのでやってみました。
ビット演算を利用して数列を一気にマッチングという発想です。
maxlenは高速化の余地がありそうです。

```c
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

#if !defined(min)
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif

const uint64_t ptn[] = {
	UINT64_C(0xfffffffff), UINT64_C(0x555555555), UINT64_C(0x249249249),
	UINT64_C(0x111111111), UINT64_C(0x842108421), UINT64_C(0x041041041),
	UINT64_C(0x810204081), UINT64_C(0x101010101), UINT64_C(0x008040201),
	UINT64_C(0x040100401), UINT64_C(0x200400801), UINT64_C(0x001001001),
	UINT64_C(0x004002001), UINT64_C(0x010004001), UINT64_C(0x040008001),
	UINT64_C(0x100010001), UINT64_C(0x400020001), UINT64_C(0x000040001),
	UINT64_C(0x000080001), UINT64_C(0x000100001), UINT64_C(0x000200001),
	UINT64_C(0x000400001), UINT64_C(0x000800001), UINT64_C(0x001000001),
	UINT64_C(0x002000001), UINT64_C(0x004000001), UINT64_C(0x008000001),
	UINT64_C(0x010000001), UINT64_C(0x020000001), UINT64_C(0x040000001),
	UINT64_C(0x080000001), UINT64_C(0x100000001), UINT64_C(0x200000001),
	UINT64_C(0x400000001), UINT64_C(0x800000001)
};
const int nptn = sizeof(ptn) / sizeof(ptn[0]);
const uint64_t mask = UINT64_C(0xfffffffff);


int str2bits(uint64_t *bits, const char *s, int *dmin)
{
	const char *p;
	int prev;
	int d;
	int v;

	*bits = 0;
	*dmin = -1;
	prev = -1;
	for (p = s; *p != '\0'; p++) {
		if (*p >= '0' && *p <= '9')
			v = *p - '0';
		else if (*p >= 'a' && *p <= 'z')
			v = *p - 'a' + 10;

		*bits |= UINT64_C(1) << v;

		if (prev != -1) {
			d = v - prev;
			if (*dmin == -1 || d < *dmin)
				*dmin = d;
		}
		prev = v;
	}

	return p - s;
}

int maxlen(uint64_t bits, int a, int d)
{
	int max;
	int len;

	max = 1;
	len = 0;
	for (bits >>= a; bits; bits >>= d) {
		if (bits & 1)
			len++;
		else {
			if (len > max)
				max = len;
			len = 0;
		}
	}
	if (len > max)
		max = len;

	return max;
}

int solve(const char *s)
{
	uint64_t bits;
	uint64_t p;
	int max;
	int nums;
	int dmin;
	int len;
	int i;
	int j;
	int k;

	if ((nums = str2bits(&bits, s, &dmin)) <= 2)
		return nums;

	max = 1;
	for (i = dmin - 1; i < nptn / max; i++) {
		k = min(i, nptn - i - 1);
		for (j = 0; j <= k; j++) {
			p = (ptn[i] << j) & mask;
			if ((len = maxlen(bits & p, j, i + 1)) > max)
				max = len;
			if (max * 2 > nums)
				return max;
		}
	}

	return max;
}

void test(const char *in, const char *out)
{
	int e, r;

	e = atoi(out);
	r = solve(in);

	printf("%s ", r == e ? "ok" : "ng");
	printf("%s -> %d (%d)\n", in, r, e);
}

int main(void)
{
...snip...
```
node.jsでお手軽にサーバーを立てるlibrary serve。

開発中にサーバーを立てる必要が出てきます。
その際におすすめするのがnode.jsのserveコマンドです。

[serve](https://github.com/visionmedia/serve)

npmでglobalにserveをいれます。

```bash

$ npm install -g serve

```

/devで開発しているとします。目的のdirectoryで`serve`と入力します。
デフォルトでは3000番ポートが開きます。

```bash
$ cd /dev
$ serve
serving /dev on port 3000
# または
$ serve /dev
```

`-p`オプションで任意のポートで実行出来ます。

```bash

$ serve -p 4000

```

ファイル名に日本語があるとうまくいかないことことがあります。
rvm install ruby2.0.0p1.95 # 少しつまずく人向け


OS X 10.7.5

## 少しつまずく人向け

```zsh
rvm get stable
rvm install 2.0.0
```

```output
Searching for binary rubies, this might take some time.
No binary rubies available for: osx/10.7/x86_64/ruby-2.0.0-p195.
Continuing with compilation. Please read 'rvm mount' to get more information on binary rubies.
Installing requirements for osx, might require sudo password.

Xcode version older than 4.6.2 installed, download and install newer version from:

    http://connect.apple.com

After installation open Xcode, go to Downloads and install Command Line Tools.
```

おお、Xcodeアップデートしてなかった。
App Storeからアップデート。再チャレンジ。

```zsh
rvm install 2.0.0
```

```output
Installing required packages: libtool, libxml2, libxslt, libksba. - using ZSH, can not show progress, be patient...
Error running 'requirements_osx_brew_libs_install libtool libxml2 libxslt libksba',
please read /Users/takashi/.rvm/log/ruby-2.0.0-p195/1369112252_package_install_libtool_libxml2_libxslt_libksba.log
```

なんか自動で入らなかった系？

```zsh
brew install libtool
brew install libxml2
brew install libxslt
brew install libksba
rvm requirements

rvm install 2.0.0
```

やっと入ったどー！

```zsh
rvm list
```

```output
rvm rubies

=* ruby-1.9.3-p327 [ x86_64 ]
   ruby-1.9.3-p362 [ x86_64 ]
   ruby-2.0.0-p0 [ x86_64 ]
   ruby-2.0.0-p195 [ x86_64 ]
```

```zsh
rvm use ruby-2.0.0-p195
```

デフォルトで使いたい猛者は、

```zsh
rvm use ruby-2.0.0-p195 --default
```

いろいろ試してみます。
Depth of nested list


リストの入れ子構造（nested）になっている深さをカウントする。というのが、[落ちてた](http://stackoverflow.com/questions/6039103/counting-deepness-or-the-deepest-level-a-nested-list-goes-to)のでメモ。

落ちてたものに、空のリストをカウントするよう、一行追加しただけ。

```python
def depth(l):
    if isinstance(l, list):
        if l == [] : return 1 # count a empty list
        return 1 + max(depth(item) for item in l)
    else:
        return 0

if __name__ == "__main__":
    l = ["1",[],"42",["2","13",["2","3",[]],["4"]],["2",[" "],"3"],"3"]
    print depth(l)
```
wget による Googleの検索結果の取得

## wgetコマンドからの利用法

```bash
wget "https://www.google.co.jp/search?q=検索キーワード&ie=UTF-8&oe=UTF-8&num=20" \
--no-check-certificate --user-agent="(｀・ω・´)" -O キーワード.html
```

Google検索のパラメータ
* q: 検索キーワード
* oe: 出力時の文字コード。UTF-8指定
* num: 検索結果の表示件数。デフォルト10を変更時

wget のパラメータ
* --no-check-certificate : サーバ証明書を検証しない
* --user-agent: を指定しないと wget だと弾かれたので
* -O: 出力先ファイル名を指定する

注意？
あんまりリクエスト投げすぎると駄目？
今やるとエラーになってしまうので・・・

## 具体的には次の用途で利用

Googleウェブマスターツールの検索クエリー（上位）に対して、クリック数の改善を行うため現在の検索結果を確認（タイトル、descriptionなど）する為に利用。

ウェブマスターツールの検索クエリを CSVなどでダウンロード。
ダウンロードして知りたいキーワードを適当に取得して、例えばテキストエディタで

```
01    キーワード(1)
02    キーワード(2)
```
とか タブ区切りで作成

```
s/(.+)\t(.+)/wget "https://www.google.co.jp/search?q=\2&ie=UTF-8&oe=UTF-8&num=20" --no-check-certificate --user-agent="(｀・ω・´)" -O \1.html/
```
置換してコマンド流す。
Markdownの目次自動作成（SublimeText PlugIn）

※ この記事を書いてから多くの機能追加がされているので、詳しくは[Githubページ](https://github.com/naokazuterada/MarkdownTOC)を御覧ください。この記事の内容古いです。

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/4404/1f5e6f75-fdf5-b668-99dd-bdee52613eaf.png)

Markdownで取説を作ったりするときに、自動で目次を作ってくれると便利だなと思って、SublimeText2用のプラグインを作ってみました。

[Source on Github](https://github.com/naokazuterada/MarkdownTOC)

## 機能

- 文章中のHeading要素を検索してリスト化します
- 目次は、挿入位置以降の内容を反映します（最初に「Insert TOC」メニューを選択する際は、カーソル位置以降の内容）
- Headingにアンカーが着いている場合は、リンクを張ります
- 保存時に目次の内容を更新します

## インストール

### Package Controlを使う場合

1. “Package Control: Install Package” コマンドから "MarkdownTOC" プラグインを検索し、インストール。
2. ST2 を再起動。


### Gitを使う場合

```
git clone git@github.com:naokazuterada/MarkdownTOC.git ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/MarkdownTOC
```

### その他

1. Zipファイルをダウンロードして解凍します。
2. ST2の"Packges"フォルダを開きます (Sublime Text 2 > Preference > Browse Packages...)。
3. "MarkdownTOC"フォルダを"Packages"フォルダに移動。


## 使い方

1. Markdownファイルを開く
2. 目次を挿入したい位置にカーソルを移動
3. Tools > MarkdownTOC > Insert TOC を選択
4. カーソル位置に目次が挿入されます
5. ファイルの内容を更新し保存
6. 目次の内容も自動的に更新されます

***目次の前後のコメントタグを削除すると、自動更新がされなくなります***
Booコンパイラを起動してBooプログラムの構文木を得るBooプログラム

# ソース

```boo
# pythonじゃないよ。Booだよ！
import Boo.Lang.Compiler
import Boo.Lang.Compiler.Steps
import Boo.Lang.Compiler.IO

# text = 何かお好きなBooプログラム
text = """
print "hello world!"
"""
# c = Booコンパイラ。ただし構文木生成だけするように。
c = BooCompiler()
p = c.Parameters
p.Pipeline = CompilerPipeline() # コンパイラパイプラインを空っぽにする。
p.Pipeline.Add( Parsing() )  # Parsing:構文木生成コンパイラステップを追加。
p.Input.Add( StringInput( "ファイル名の代わりの文字列", text ) ) # 文字列をコンパイラの入力に設定。
ctxt = c.Run() # コンパイル。パイプラインは Parsingだけなので構文木生成しかしない。

# CompileUnit は構文木のルートとなる構文木クラス
ast = ctxt.CompileUnit
print "CODE: " + ast + " type:" + ast.GetType()
```

# 文字列じゃなくてファイルを入力にしたい

StringInput のところを次のようにします。

```boo
p.Input.Add( FileInput( "ファイルパス" ) )
```

# コンパイルエラー

コンパイルエラーはコンパイル結果(CompilerContext)のErrorsプロパティ(ICollection)です。

```boo
ctxt = c.Run()   # コンパイル
for err in ctxt.Errors:
    print err
```

# 結論

あとは、Boo.Lang.Compiler.Ast.DepthFirstVisitor を継承して構文木トラバーサーを実装し、上記 ast に Accept() すれば、自前Booプログラム解析機のできあがりです。

# Unity

通常のランタイムコードとしては使えませんが（無理やり入れてもでかすぎて非現実的）、エディタプログラムとしてであれば使えます。
Eclipseのタイトルバーにワークスペース名を表示する

Eclipse複数起動してると、あれ？どれがどのワークスペース開いてたっけ？とかなってストレスがマッハなので調べた。

### 1.Eclipse.exe起動時に引数として-showLocationを追加する。
ショートカットとか作ってリンク先の後ろにつけたりするアレ
もちろんコマンドラインで実行するときに後ろに付けたっていい

### 2.eclipse.iniの中に-showLocationを記述する。
これでもいけるらしい。

### 3.GUIで設定する。
Eclipse起動して、ウィンドウ→設定→ワークスペースを開くとワークスペース名（ウィンドウ・タイトルで表示）って項目があるので、そこに任意のタイトルを設定する。



任意のタイトルを付けられるのが嬉しいので俺は3番を選びました。
画像とか見たい人は参考URLをどうぞ。
[参考URL](http://mcuoneclipse.com/2012/08/01/show-workspace-location-in-the-title-bar/)
IEでだけ動かないスクリプトが一発逆転動くかもしれない

[JSガリガリなサービス](http://omojan.revinx.net/)を開発、運用していて、
IEには「別のブラウザを使えというウインドウを出すか」とまで思っていた。
実際、俺のWindows7 64bit環境でもIE9だけ動かなかったのだが、
F12でコンソールを開くと、なぜか動く。
IEを愛用する利用者にみんなF12を押させるわけにもいかん。
しかしIEでももしかしたら普通に動くんじゃないかと思って少し調べた。


http://d.hatena.ne.jp/ux00ff/20120326/1332751376
こちらの記事での処置

```javascript

if (!window.console){
    window.console = {
        log : function(msg){
            // do nothing.
        }
    };
}

```



をJSの最後に付け加えてやると、何もしなくてもIEで動いた。
一部の機能しか見ていないが。
Javascriptでin_array的なことをするならsomeメソッドが便利


```javascript
var tmp = ['test', 'hoge', 'Hello', 'world'];

tmp.some(function(v){ return v === 'Hello' }) //-> true
tmp.some(function(v){ return v === 'hello' }) //-> false
```

some仕様

```javascript
tmp.some(function(v, i, a){ console.log(v) })
->test
->hoge
->Hello
->world

tmp.some(function(v, i, a){ console.log(i) })
->0
->1
->2
->3

tmp.some(function(v, i, a){ console.log(a) })
->["test", "hoge", "Hello", "world"]
->["test", "hoge", "Hello", "world"]
->["test", "hoge", "Hello", "world"]
->["test", "hoge", "Hello", "world"]
```

二つの配列を比較

```javascript
var a = ['test', 'hoge', 'hello', 'world'];
var b = ['aaa', 'bbb', 'ccc', 'hoge'];
a.some(function(v){ return b.some(function(vv){ return vv == v }) }); 
->true
```
Proguardで難読化されたスタックトレースから元の名前を復元する

Developer Consoleのクラッシュレポートのスタックトレースが難読化されていて読めないとき。

ビルドのときにproguardが生成したproguard/mapping.txtがあれば、Android SDKの tools/proguard/bin/retrace.sh を使って復元できるようだ。 

```sh
# android-sdk is installed by homebrew
$ echo $ANDROID_SDK
/usr/local/opt/android-sdk
$ $ANDROID_SDK/tools/proguard/bin/retrace.sh proguard/mapping.txt stacktrace.txt
```
ホームページをMediaWikiからJekyllに移行した


こんな感じ。

![milkode](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130519/20130519235217.png)

http://milkode.ongaeshi.me

`_layouts/layout.html`とLiquidテンプレートの組み合わせで結構色々なことが出来るのがよかったです。「面倒なHTMLを書かずに記事本文だけを書ける」のは私的にWikiを使う大きなモチベーションの一つだったのですがJekyllなら同じことが出来そうです。

[[続きを読む]](http://ongaeshi.hatenablog.com/entry/software-page-renewed-using-jekyll)
複数 Redmine を1ドメインでホストする

Apache + Passenger で

* http://example.com/redmine1/
* http://example.com/redmine2/

の様にホストする方法。

試したバージョンは

* Apache 2.2.x
* Passenger 3.0.x
* Redmine 2.2.x

設定は簡単で

```apache:httpd.conf
Alias /redmine1 /opt/redmine-2.2-1/public
RackBaseURI /redmine1

Alias /redmine2 /opt/redmine-2.2-2/public
RackBaseURI /redmine2
```

```bash:symlink
cd /var/www
sudo ln -s /opt/redmine-2.2-1/public redmine1
sudo ln -s /opt/redmine-2.2-2/public redmine2
```

これで一見動いているのだが、実は Cookie の Path が 「**/**」 になっているので、両方に同時にアクセスできないので

```ruby:config/application.rb
config.session_store :cookie_store, :key => '_redmine_session'
  ↓
config.session_store :cookie_store, :key => '_redmine_session',
                     :path => config.relative_url_root
```

```yaml:config/configuration.yml
autologin_cookie_path:
  ↓
autologin_cookie_path: Redmine::Utils.relative_url_root
```

と書き換えると良いみたいですよ。
mac-key-modeで詰まった・・・


emacsの設定で

```init.el
(require 'redo)
(require 'mac-key-mode)
(mac-key-mode 1)
```

として、redo.elとredo+.elとmac-key-mode.elをダウンロードしてきて、``.emacs.d`` に置く。（あとで ``site-lisp`` とかに整理しておく）

ここで、ちゃんとバイトコンパイルしないといけない！

emacsたちあげて、M-x byte-compile-file　で３つをバイトコンパイル完了。やっと通った。。。っと思ったら、通らない・・・

エラーを記録し忘れたけど、何かがread onlyになってる的な・・・

調べてみると、emacs24系では、redo+のバージョンが古いとダメで、2013年最新のやつを拾ってこなきゃダメ！！ Version: 1.16

ってことで、解決。
sphinx+mathjaxでマクロをusepackageみたいに読み込む


gitで公開されている [Sphinx + MathJax で自作 TeX マクロを利用する](https://gist.github.com/uchida/4005663) を使えば良い。

だけど、usepackageみたいに、読み込みたいと思うものですよね。


PYTHONPATHが通っているところならどこでも（今回は ``~/lib/python`` を想定）いいから、 ``mathjaxlib`` というディレクトリを作る。（今回は、 ``~/lib/python/mathjaxlib`` ）
（ん？その適応したいディレクトリに入れればいいじゃないかって？あ〜ん〜そだね〜）

ここに上のgitで公開されている **mathjax.py** を放り込む。

続いて、

```__init__.py
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
```

と、

```mathjax_preamble.py
def importstys(stys):
    """importsty for a list."""
    ret, delim  =  [], "%"*60
    for sty in stys :
        ret.append(delim+"\n%\n%   "+sty+"\n%\n"+delim)
        ret.append(importsty(sty))
    return "%\n".join(ret)

def importsty(sty):
    """import a refered sty file(.sty) by using kpsewhich. And this return the body in loaded sty as a string."""
    if sty.endswith(".sty") != True :
        sty += ".sty"
    import commands
    f = open( commands.getoutput("kpsewhich "+sty), 'rU' )
    tmp = f.read()
    f.close()
    return tmp

mathjax_preamble = r"""
"""
```

を書いて、 ``~/lib/python/mathjaxlib/`` に放り込む。計３っつのファイルが入っていたら、OK。

っで、自分で作っているページのconf.pyに

```conf.py
# MathJax
extensions.append( 'mathjaxlib.mathjax' )
mathjax_path = 'http://mathjax.connectmv.com/MathJax.js'
mathjax_path +='?config=default' # for mathjax v1.1
# TeX macros
from mathjaxlib.mathjax_preamble import mathjax_preamble, importstys
mathjax_preamble += importstys(["abbreb","matope"])
```

とか書いておくとおｋ。"abbreb","matope"は私の使ってる短縮語集ですので、自分の環境に合わせてください。

**あ、当然`kpsewhich`が通らないとダメですよ！！**

簡単なテストなら。

```conf.py
mathjax_preamble+="""\
\def\oo{\infty}
"""
```

とかしておいて、

```sphinx
.. math:: \int_0^\oo \frac{\text{sin}(x)}{x} dx = \frac{\pi}{2}
```

っで、試してみてください。