OmniAICreator/Qiita-1.07M huggingface dataset:
rake release のうち tag を打つ機能だけ抜き出して使う

[Rake のタスクを消す (プライベートな gem のうっかり rake release を防ぐ)](http://qiita.com/items/2de40ca0b5127a0f5c2a) のようにすると `rake release` による事故の心配が無くなるので安心だけど、 Git の tag を打つところだけは便利なので使いたい。

自前でそういうタスクを書くこともできるけど、せっかくなので Bundler の提供している機能を再利用してみる。

```ruby
require "bundler/gem_tasks"
require "bundler/gem_helper"

t = Bundler::GemHelper.new

desc "Create tag #{t.send(:version_tag)}"
task :tag do
  t.send(:tag_version) { t.send(:git_push) } unless t.send(:already_tagged?)
end
```

こういう感じにすると `rake tag` で、

* Git の tag を打つ
  * バージョン番号は gemspec ファイルから自動的に参照される
  * gemspec ファイルが `lib/*/version.rb` の定数をみるようになっていればその値が使われる
* Git の tag をリモートに push する
  * ついでに push してないコミットも push される

ということが自動的に行われる。

---

簡単にコードの解説をすると、

* `rake release` タスクなどで実行されるコードは Bundler の `lib/bundler/gem_helper.rb` にあるのでそれを require する
* 
* 目的のメソッド `tag_version` とかは Bundler::GemHelper クラスの protected メソッドなので `send` で呼び出す

といった感じ。 `send` の多用を嫌う場合は Bundler::GemHelper のサブクラスを作って `self.tag_version` などと呼び出してもいい。

なお、このコードは [Bundler::GemHelper#release_gem](https://github.com/bundler/bundler/blob/master/lib/bundler/gem_helper.rb#L76) をほぼそのままコピーしただけ。
Wordpress で管理画面にカテゴリIDを表示

検索してみたら『URLのパラメータを調べろ』ばっかりだったのでメモ。

functions.php に

```php
<?php
function add_category_columns($columns)
{
	$index = 1; // 追加位置

	return array_merge(
		array_slice($columns, 0, $index),
		array('id' => 'ID'),
		array_slice($columns, $index)
	);
}
add_filter('manage_edit-category_columns', 'add_category_columns');

function add_category_custom_fields($deprecated, $column_name, $term_id)
{
	if ($column_name == 'id') {
		echo $term_id;
	}
}
add_action('manage_category_custom_column', 'add_category_custom_fields', 10, 3);
```

て書いておくと編集画面がこんな感じになります。

![categories.png](https://qiita-image-store.s3.amazonaws.com/0/6482/cfde305b-9796-0819-5362-df1f01148714.png)

他の場所に出す時はフィルタ/アクション名を調べて追記すれば良し。
Rake のタスクを消す (プライベートな gem のうっかり rake release を防ぐ)

`Rake::Task#clear` を使う。

```ruby
require "bundler/gem_tasks"
Rake::Task[:release].clear
```

実行結果

```
$ rake -T
rake build    # Build rack-castanet-0.0.4.gem into the pkg directory.
rake install  # Build and install rack-castanet-0.0.4.gem into system gems.
# rake release は消えてる
```

* http://doc.ruby-lang.org/ja/2.0.0/class/Rake=3a=3aTask.html#S_CLEAR
/etc/shadowのアレ

```python:gen-shadowpass.py
from crypt import crypt

method_num = 6  # SHA-512
salt = "chihaya" # 
password = input("password: ")

print(crypt(password, "${num}${salt}".format(num=method_num, salt=salt)))
```

Shell で実行

```
$ python3 gen-shadowpass.py
password: なんでもいいですけど
$6$chihaya$moeYHfUnBzrGnBo0qcZ.ExPeYgFtjIFhc8BR1jnE.1DMXU7waByCOVSOY2vY3qwOh9BHybqZ84nY/8tQLGrnk/
```

上記文字列を/etc/shadowに書きこんでやればパスワードを無理やり変更出来る．
Ubuntu12.04はsaltは8文字使ってるようです．
まぁ，そんなことする人は居ないと思いますけど．
CocoaPodsのビルドをスキップする


FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

------

CocoaPodsを使うと、デバッグ実行時に毎回Podsのビルドが走ります。Podsは頻繁に変更を行うものではないし、気持ちよくコーディングするにはデバッグ開始で待ちたくないので、このビルドを飛ばしたいですね。

##Podsのビルドをスキップする方法

1. Xcodeのメニューから、Product->Scheme->Edit Schemeでスキーマの編集画面を開きます。
2. 編集ダイアログ上部のSchemeを、デバッグ実行に使うSchemeに変更します。
2. 左のリストからBuildを選択し、右画面のFind Implicit Dependenciesのチェックを外します。

![capt20140523.png](https://qiita-image-store.s3.amazonaws.com/0/1209/3908dc03-3f11-6e2a-8ca5-0c4af206bfd8.png)

デバッグ実行するとPodsのビルドが走らなくなっているはずです。ちゃんと確認したければ、ビルドのログを見てみましょう。

### 注意：
 * Podsを変更しても、Podsのビルドが走らないようです。
 * Podsのライブラリ(.a)が存在しなくても、ビルドはされないようです。リンク時にエラー(ld: library not found for -lPods
)になります。
 * 依存関係を持つ他のプロジェクトもビルドされなくなるかも（未確認）

リリース用、AdHod配布用のSchemeには使わないのがお薦め。事故怖いもんね。

## Podsをビルドするには

上記のFind Implicit Dependanciesにチェックをつけて、CleanしてBuildしましょう。設定を変えずにいきたいところですが、SchemeとしてPodsを選択してビルドしてもダメでした。うまい方法がないかな。

### 対象バージョン

以下で試しています。
* Xcode 4.6.2
* CocoaPods 0.19.1
Project Euler Problem 15 (C)

http://qiita.com/items/1a35b75f5bd760cb40f8

http://projecteuler.net/problem=15

この問題をCでやってみました。
40 C 20 を求めればよいので、素数のリストを固定にしてもよかったのですが、エラトステネスの篩で動的に作ってみました。

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

void sieve_prime(int *isprime, int n)
{
    int i, j;

    isprime[0] = 0;
    for (i = 1; i < n; i++)
        isprime[i] = 1;

    for (i = 1; i * i <= n; i++)
        if (isprime[i])
            for (j = i + 1; (i + 1) * j <= n; j++)
                isprime[(i + 1) * j - 1] = 0;
}

int f_prime(int n, int p)
{
    int s;

    for (s = 0; n /= p; s += n)
            ;

    return s;
}

uint64_t comb(int n, int m)
{
    int isprime[n];
    uint64_t v;
    int p;

    sieve_prime(isprime, n);

    v = 1;
    for (p = 2; p <= n; p++)
        if (isprime[p - 1])
            v *= pow(p, f_prime(n, p) - f_prime(m, p) - f_prime(n - m, p));

    return v;
}

int main(void)
{
    printf("%"PRIu64"\n", comb(40, 20));

    return 0;
}
```
groongaで複数のカラムのスコアを別々に扱う方法

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

* [「第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)
* [「第3回 すべてのMySQLユーザに高速な全文検索機能を！ - mroongaの紹介」](http://gihyo.jp/dev/clip/01/groonga/0003)
* [「第4回 rroongaを使ったソースコード検索エンジンMilkode」](http://gihyo.jp/dev/clip/01/groonga/0004)

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

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。

この記事を書いたときの最新のバージョンは2013年4月29日にリリースした[3.0.3](http://groonga.org/ja/docs/news.html#release-3-0-3)です。

今回は、複数カラムのスコアを別々に扱う方法を紹介します。

# 複数カラムのスコアリング

groongaでは検索結果がどれだけマッチしているかというのはスコアの値の大きさで判断します。
このスコアは検索クエリを実行するごとに``_score``カラムへと反映されます。

例えば、本にコメントをつけているときのことを考えてみましょう。
``Books`` テーブルがあって、``Books`` テーブルにはタイトルを保持する ``title`` カラムとコメントを記録するための ``comment`` カラムがあるとします。

サンプルのスキーマ定義は以下のようになるでしょう。

```
table_create  Books         TABLE_NO_KEY
column_create Books title   COLUMN_SCALAR ShortText
column_create Books comment COLUMN_SCALAR ShortText

table_create  Terms             TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram
column_create Terms index_books COLUMN_INDEX|WITH_POSITION|WITH_SECTION Books title,comment
```

上記サンプルのためのサンプルデータを用意します。

```
load --table Books
[
{"title": "groonga入門", "comment": "groongaの初歩的な内容のみ。"},
{"title": "実践groonga", "comment": "入門の次に読むべき本。"},
{"title": "mroonga入門", "comment": "mroongaの初歩的な内容のみ。groongaについても触れている。"}
]
```

``title``もしくは``comment``カラムからgroongaを検索してみましょう。

```
select Books --match_columns 'title||comment' --query groonga --output_columns title,_score
```

この結果は以下のようになります。

```
[
  [
    [3],
    [
      ["_key","UInt32"],
      ["title","ShortText"],
      ["_score","Int32"]
    ],
    ["groonga入門",2],
    ["実践groonga",1],
    ["mroonga入門",1]
  ]
]
```

「groonga入門」は``title``にも``comment``カラムにも``groonga``が含まれているので、他よりもスコアが高くなっています。

``groonga``が``title``か``comment``のどちらかに含まれていれば良いので、そういうときはスコアを同じにしたいという場合にはどうすればいいでしょうか。

groongaではカラムごとの重みづけができるので、重みづけを利用して複数のカラムのスコアを別々に扱うことができます。

``title``カラムを10の位に、``comment``カラムを1の位に割り当てることにしましょう。
これを利用するとクエリは以下のように書くことができます。

```
select Books --match_columns 'title * 10 || comment' --query groonga --scorer '_score = max(_score / 10, _score % 10)' --output_columns title,_score
```

この結果は以下のようになります。

```
[
  [
    [3],
    [
      ["_key","UInt32"],
      ["title","ShortText"],
      ["_score","Int32"]
    ],
    ["groonga入門",1],
    ["実践groonga",1],
    ["mroonga入門",1]
  ]
]
```

複数のカラムのスコアを別々に扱うことで、どちらかにgroongaが含まれている場合はスコアが一緒になるようにすることができました。

# まとめ

今回は、groongaで複数のカラムのスコアを別々に扱う方法を紹介しました。

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

groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。インストールしたら試してみてください。
git と Makefile で cron の管理


## ユーザ別の設定

```:Makefile
TARGET_FILES = *.cron
CRON_FILE = crontab

all: file

.PHONY: file
file: ${TARGET_FILES}
	echo "PATH=/usr/local/bin:/usr/bin:/bin" > ${CRON_FILE}
	echo "CONTENT_TYPE=text/plain; charset=UTF-8" >> ${CRON_FILE}
	echo "" >> ${CRON_FILE}
	cat ${TARGET_FILES} >> ${CRON_FILE}
	echo "" >> ${CRON_FILE}
	crontab ${CRON_FILE}
```

https://gist.github.com/aki77/5683114/raw/be282e868cc00a7b21c69db1a4c0195cd452a501/Makefile


```:01_config.cron
####################
# config
####################

HOGE_DIR=/home/vagrant/project/hoge
HOGE_ENV=dev

FUGA_DIR=/home/vagrant/project/fuga
FUGA_ENV=dev

```

## プロジェクト別のcron設定ファイル

git によりバージョン管理されている前提です。

```:hoge.cron
####################
# hoge
####################

31 * * * *  [ "$HOGE_ENV" = "prod" ] && php $HOGE_DIR/symfony hoge:task1 --env="$HOGE_ENV"
10 4 * * *  php $HOGE_DIR/symfony hoge:task2 --env="$HOGE_ENV"

```

```:fuga.cron
####################
# fuga
####################

22 10,22 * * *  [ "$FUGA_ENV" = "prod" ] && php $FUGA_DIR/symfony hoge:task1 --env="$FUGA_ENV"
10,50 * * * *  php $FUGA_DIR/symfony hoge:task2 --env="$FUGA_ENV"

```

## 使い方

```
$ pwd
/home/vagrant/.crontab.d
$ ls -l      
合計 12
-rw-rw-r-- 1 vagrant vagrant 152  5月 22 22:50 2013 01_config.cron
lrwxrwxrwx 1 vagrant vagrant  43  5月 22 22:58 2013 10_hoge.cron -> /home/vagrant/project/hoge/config/hoge.cron
lrwxrwxrwx 1 vagrant vagrant  43  5月 22 22:59 2013 20_fuga.cron -> /home/vagrant/project/fuga/config/fuga.cron
-rw-r--r-- 1 vagrant vagrant 318  5月 22 23:02 2013 Makefile
$ make
echo "PATH=/usr/local/bin:/usr/bin:/bin" > crontab
echo "CONTENT_TYPE=text/plain; charset=UTF-8" >> crontab
echo "" >> crontab
cat *.cron >> crontab
echo "" >> crontab
crontab crontab
$ crontab -l
PATH=/usr/local/bin:/usr/bin:/bin
CONTENT_TYPE=text/plain; charset=UTF-8

####################
# config
####################

HOGE_DIR=/home/vagrant/project/hoge
HOGE_ENV=dev

FUGA_DIR=/home/vagrant/project/fuga
FUGA_ENV=dev

####################
# hoge
####################

31 * * * *  [ "$HOGE_ENV" = "prod" ] && php $HOGE_DIR/symfony hoge:task1 --env="$HOGE_ENV"
10 4 * * *  php $HOGE_DIR/symfony hoge:task2 --env="$HOGE_ENV"

####################
# fuga
####################

22 10,22 * * *  [ "$FUGA_ENV" = "prod" ] && php $FUGA_DIR/symfony hoge:task1 --env="$FUGA_ENV"
10,50 * * * *  php $FUGA_DIR/symfony hoge:task2 --env="$FUGA_ENV"
```
一括置換するワンライナー

typoしてるよ！
(G|g)allar(y|ies)を(G|g)aller(y|ies)に置換する例。

```bash
find app | xargs grep -l "[gG]allar" | xargs sed -e s/gallar/galler/g -e s/Gallar/Galler/g
```

find力、grep力、sed力高い人はもっと上手にやるかもしれない
TestFlightの使い方

テスト配信やクラッシュレポート時にとっても便利なTestFlightの使い方。

あとTestFlightのライブラリがAppに入っていると申請リジェクトされるので要注意。
App申請時は下記はコメントアウトしたほうがよい。
(\[[UIDevice currentDevice] uniqueIdentifier]]も既にリジェクト対象ですね)

１．ヘッダファイルにインポートして
\#import "TestFlight.h"

２．didFinishLaunchingWithOptionsに下記を追加
　///テストフライト
　{
　　NSSetUncaughtExceptionHandler(&caughtExceptionHandler);
　　// installs HandleExceptions as the Uncaught Exception Handler
　　NSSetUncaughtExceptionHandler(&HandleExceptions);
　　// create the signal action structure
　　struct sigaction newSignalAction;
　　// initialize the signal action structure
　　memset(&newSignalAction, 0, sizeof(newSignalAction));
　　// set SignalHandler as the handler in the signal action structure
　　newSignalAction.sa_handler = &SignalHandler;
　　// set SignalHandler as the handlers for SIGABRT, SIGILL and SIGBUS
　　sigaction(SIGABRT, &newSignalAction, NULL);
　　sigaction(SIGILL, &newSignalAction, NULL);
　　sigaction(SIGBUS, &newSignalAction, NULL);
        
　　\[TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]];
　　\[TestFlight takeOff:@"トークン"];
　}

３．ついでに下記メソッドも追加しておく。
void caughtExceptionHandler(NSException *exception) {
　 TFLog(@"%@, %@",exception, [exception callStackSymbols]);
}
void HandleExceptions(NSException *exception) {
　TFLog(@"This is where we save the application data during a exception, %@ %@",exception, [exception callStackSymbols]);
}
void SignalHandler(int sig) {
 　TFLog(@"This is where we save the application data during a signal %d",sig);
}
NSLogのカスタム方法(クラス・メソッド名・行数を表示)

下記のようにdefine定義しておくと便利(クラス名・メソッド名・行数が表示される)

#ifdef DEBUG
    #define TestLog(fmt,...) NSLog((@"%s:%d "fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
    #define TestLog(...)
#endif

そんでもってソースコードのNSLogを下記のように変更すればOK
NSLog(@"%@",@"テスト");
↓
TestLog(@"%@",@"テスト");
非同期処理をcurryでまとめる


[カリー化関数を利用して非同期処理を整理する](http://shimz.me/blog/javascript/2851)

```javascript
//カリー化関数
function curry( orig_func ) {
        var ap = Array.prototype,
        args = arguments;
         
        function fn() {
                ap.push.apply( fn.args, arguments );
                 
                return fn.args.length < orig_func.length
                ? fn
                : orig_func.apply( this, fn.args );
        };
         
        return function() {
                fn.args = ap.slice.call( args, 1 );
                return fn.apply( this, arguments );
        };
};

//出力
function log(d){
    console.log(d);
}


//非同期処理
var  Async1 = function(fn, nextFn) {
    $.ajax({
        url:'hoge1.html',
        dataType:'html',
        success:function(data){
          fn('async1');           //fn(data);
          nextFn();
        }                
    });
}

var  Async2 = function(fn, nextFn) {
    $.ajax({
        url:'hoge2.html',
        dataType:'html',
        success:function(data){
          fn('async2');          //fn(data);
           nextFn();
        }                
    });
}

var  Async3 = function(fn, nextFn) {
    $.ajax({
        url:'hoge3.html',
        dataType:'html',
        success:function(data){
          fn('async3');          //fn(data);
           nextFn();
        }                
    });
}

//end
var EndFn = function(){
   log('End'); 
}

//引数束縛
var async1=  curry(Async1 , log);
var async2=  curry(Async2 , log );
var async3=  curry(Async3 , log , EndFn);

//非同期処理を一つにまとめる
var root = curry(async1 , curry(async2, async3));

//実行
run()

```
while/for の then と or

#ループの終わり方により処理を追加する構文 or と then。

たまに便利。then は Python の while の else と同じ。同じなのに単語が違うし、or の方が else に意味が近い感じがするので混乱しやすい。

```py
# pythonじゃないよ！Booだよ！
while false:	# A
	pass
or:
	print "A ループ内を１度も実行しなかった。"  # ここ実行される！
then:
	print "A ループはbreakしなかった。"  # ここ実行される！

for i in range(10):	# B
	pass
or:
	print "B ループ内を１度も実行しなかった。"
then:
	print "B ループはbreakしなかった。"  # ここ実行される！

for i in range(10):	# C
	break
or:
	print "C ループ内を１度も実行しなかった。"
then:
	print "C ループはbreakしなかった。"
```
Password Generator by PHP

```php
<html>
 <body>
  <table border="1" align="center">
   <form method="post" action="passgene.php">
   <tr><td>文字数</td><td><input type="text" size="10" name="chara_num"></td></tr>
   <tr><td>アルファベット小文字</td><td><input type="checkbox" name="small_letter"></td></tr>
   <tr><td>アルファベット大文字</td><td><input type="checkbox" name="capital_letter"></td></tr>
   <tr><td>数字</td><td><input type="checkbox" name="numeral_letter"></td></tr>
   <tr><td>特殊文字</td><td><input type="checkbox" name="special_letter"></td></tr>
   <tr slign="center"><td colspan="2"><input type="submit"></td></tr>
   </form>
  </table>

<?php
$num_char  = $HTTP_POST_VARS["chara_num"];
$sm_letter = $HTTP_POST_VARS["small_letter"];
$ca_letter = $HTTP_POST_VARS["capital_letter"];
$nu_letter = $HTTP_POST_VARS["numeral_letter"];
$sp_letter = $HTTP_POST_VARS["special_letter"];
$strin1 = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,";
$strin2 = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,";
$strin3 = "1,2,3,4,5,6,7,8,9,0,";
$strin4 = ">,<,#,$,%,&,-,/,[,],!,(,),=,~,^,|,{,},@,";
$judge  = 0;
$selected_array;
if($sm_letter=="on"){     $judge += 1;    }
if($ca_letter=="on"){     $judge += 10;   }
if($nu_letter=="on"){     $judge += 100;  }
if($sp_letter=="on"){ $judge += 1000; }
if($judge==1){
   $selected_array = $strin1;
}else if($judge==10){
   $selected_array = $strin2;
}else if($judge==11){
   $selected_array = $strin1.$strin2;
}else if($judge==100){
   $selected_array = $strin3;
}else if($judge==101){
   $selected_array = $strin3.$strin1;
}else if($judge==110){
   $selected_array = $strin3.$strin2;
}else if($judge==111){
   $selected_array = $strin3.$strin2.$strin1;
}else if($judge==1000){
   $selected_array = $strin4;
}else if($judge==1001){
   $selected_array = $strin4.$strin1;
}else if($judge==1010){
   $selected_array = $strin4.$strin2;
}else if($judge==1011){
   $selected_array = $strin4.$strin2.$strin1;
}else if($judge==1100){
   $selected_array = $strin4.$strin3;
}else if($judge==1101){
   $selected_array = $strin4.$strin3.$strin1;
}else if($judge==1110){
   $selected_array = $strin4.$strin3.$strin2;
}else if($judge==1111){
   $selected_array = $strin4.$strin3.$strin2.$strin1;
}

$strarray = explode(",",$selected_array,-1);
if(!$strarray){
   $str = "";
}else{
   for ($i = 0, $str = null; $i < $num_char; $i++) {
     $str .= $strarray[array_rand($strarray, 1)];
   }
}
?>

  <div align="center"><font size="7" color="Blue"><?php print($str); ?></font</div>
 </body>
</html>
```
GitLab 5.2がリリース

5月22日に[GitLab 5.2がリリース](http://blog.gitlab.org/gitlab-5-dot-2-released/)されたので、変更内容を適当に翻訳します。

### 4つの重要な改善

1. フォーク。プロジェクトを自分のネームスペースにフォークできます。
2. コード検索。トップパネルの検索バーでプロジェクト内を検索できます。
3. ターボリンク。ほぼ全てのリクエストがページをリロードしないため、動作がかなり高速化されます。
4. Deploy Keyの共有。複数のプロジェクトで一つのDeploy Keyを使用でき、一つのプロジェクトは複数のDeploy Keyを持つことが出来ます。

今回のリリースのMVPはフォークに貢献したAngus MacArthurです。

### 変更点

#### 新機能

- フォーク
- コード検索
- ターボリンク
- Deploy Keyの共有
- 進歩したgfm自動補完
- その他カスタマイズ(google analytics, サインインページのカスタムテキスト)

#### セキュリティ

- 認証済みユーザーに対するPublic Projectのアクセス権を緩和(issues, merge request)。
- ldap認証でのgit-httpのpushを許可。

#### 不具合の修正

- ファイルタブ内でgit submoduleが表示されない
- 巨大なdiffがある場合にコミットページでエラーが発生する

### 番外編

私が投稿したPull Requestの宣伝ですｗ

- Networkの表示速度を改善
- Networkの表示を選択中のref(branch,tag)でフィルターする機能

### 備考

フォークは実装されましたが、異なるリポジトリ間でのMerge Requestは未実装です。
Sakura VPSのバックアップをとりたいがディスク不足なとき

環境は入れ直すとして。
ホームディレクトリのデータだけ持っていきたい。でも、アーカイブを作る空き容量すらない。
そんなとき、あると思います。

```bash
www14242u$ sudo tar zcf adachi.tgz adachi
[sudo] password for adachi: 

gzip: stdout: No space left on device
www14242u$ df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/hda2              18G   18G     0 100% /
/dev/hda1              99M   18M   76M  19% /boot
tmpfs                 502M     0  502M   0% /dev/shm
```

ってなります。じゃあ、sshトンネリングして送ります。

```bash
ssh root@glasshill.biz "(cd /home && tar cf -)" | tar xvfp -
```

これで解決w
手元に全部そのままのデータがきます。これのいいところはパーミッション情報かわらないところかな。

余談だが、こっちから向こうに転送したいときは、こうかな。

```bash
(cd path && tar cf - .) | ssh user@hostname "(cd path && tar xvfp -)"
```
Scala IDEを開発する為の環境を構築する


仕事でeclipseプラグインの開発やってるのでScala IDEの開発に参加しようかと。以下のページを手順通りにやれば環境を構築できる。

Setup -- Scala IDE documentation
http://scala-ide.org/docs/dev/setup/setup.html#setup-fork-the-project

実際やってみたので軽く手順をまとめておく。

# 1. ダウンロード
Scala IDEはScalaの2系で開発されているので、"For Scala 2.10.x"から自分の環境にあったバイナリを落とす。
http://scala-ide.org/download/sdk.html

# 2. fork/cloneする
github上でforkして、それを以下のコマンドでローカルにcloneする。

```
$ git clone git@github.com:<username>/scala-ide.git
```


# 3. ビルドスクリプト実行
org.scala-ide.sbt.full.libraryパッケージをダウンロードしてコンパイルする。scala-ideフォルダに入って以下のコマンドを実行するだけでよい。

```
$ ./build-all.sh
```

# 4. プロジェクトのインポート
1. eclipse(scala-ide)を起動する
1. Project Explorerを右クリックして、"Import…"をクリック
1. Importウィザードが開く
1. "Existing Projects into Workspace"を選択して、"Next"ボタンをクリック
1. "Select root directory"の"Browse"ボタンをクリックし、cloneしたscala-ideのフォルダを選択
1. "Projects"から以下のパッケージにチェックを入れる
 * org.scala-ide.sbt.full.library
 * org.scala-ide.sdt.core
 * org.scala-ide.sdt.core.tests
1. "Finish"ボタンをクリック

# 5. Libraryフォルダ
1. Project Explorerからorg.scala-ide.sbt.full.libraryを右クリックして、"Properties"をクリック
1. 左ペインからJava Build Pathを選択、Libraryタグを開く
1. 全てのjarを削除する(全項目を選択してRemoveボタンをクリック)
1. "Add JARs…"ボタンをクリックし、org.scala-ide.sbt.full.libraryのlibフォルダ配下のjarを全て追加する
1. "Order and Export"タブをクリックし、すべての項目にチェックを入れる

# 6. デバッグ実行
1. Project Explorerでorg.scala-ide.sdt.coreを選択して、右クリックする
1. "Debug As" -> "Eclipse Application"をクリックする
1. これで別プロセスでScala IDEがデバッグ可能な状態で起動する
The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.



対象: aws-sdk 1.9.5
すごくつまらないことでハマり続けたエラー
config.ymlにこのように記述してしまうと、
AWS::S3.newして、bucketのメソッドを呼び出すと
タイトルのエラーメッセージが発生する。

```config.yml
access_key_id: "<YOUR_ACCESS_KEY_ID>"
secret_access_key: "<SECRET_ACCESS_KEY>"
region: "ap-northeast-1"
s3_host_name:  "s3-ap-northeast-1.amazonaws.com"
```

```s3.rb
s3 = AWS::S3.new

policy = AWS::S3::Policy.new
bucket_name = "mybuckets"
bucket = s3.buckets["#{bucket_name}"]
puts bucket.policy.to_json
```

```error
ruby-1.9.3-p327/gems/aws-sdk-1.9.5/lib/aws/core/client.rb:360:in `return_or_raise': The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. (AWS::S3::Errors::PermanentRedirect)
```


## 対応方法

config.ymlのregion/s3_host_nameを削除する。
AWS.config()に食わす方法を変える。

('A`)y-~
MacOS X + JDK7を使う


他の環境と違うところのみ記載

環境
--
- MacOS X 10.7
- Oracle JDK7
- Eclipse Juno

JDKインストール
--
1. [Oracle JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)からダウンロードする。
2. dmgファイルを展開＆インストール
3. ターミナルからjavac -version

Eclipseの設定
--
1. JDK7だと日本語ファイルが文字化けするので、Eclipse.appの中身を表示。
2. Contents/Info.plistの下の方にコメントアウトされている部分を1.6系のJDKにする。
3. その後起動

```xml:Info.plist
<string>-vm</string><string>/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Commands/java</string>
```

おまけ
--
[日本語化されたJava Platform Standard Edition 7 ドキュメント](
http://docs.oracle.com/javase/jp/7/)
C++でのゲームプログラミングについて

http://zahyou.6.ql.bz/cgame/dodge_code.htm
上記ページのプログラムを作成しています。
※ dodoge.rc のオブジェクトファイルは dodge_rc.o という名前にしています。

●開発環境
エディタ：EmEditor
コンパイラ：MinGW

オブジェクトファイルを作成して最後に
「g++ -Wall -O2 -mwindows -lwinmm  dodge_rc.o dodge.o winmain.o -o dodge」
のコマンドでコンパイルすると

dodge.o:dodge.cpp:(.text+0x16): undefined reference to `timeGetDevCaps@8'
dodge.o:dodge.cpp:(.text+0x24): undefined reference to `timeBeginPeriod@4'
dodge.o:dodge.cpp:(.text+0x2c): undefined reference to `timeGetTime@0'
dodge.o:dodge.cpp:(.text+0xc2): undefined reference to `mciSendStringA@16'
dodge.o:dodge.cpp:(.text+0xe9): undefined reference to `mciSendStringA@16'
dodge.o:dodge.cpp:(.text+0x343): undefined reference to `timeGetTime@0'
dodge.o:dodge.cpp:(.text+0x394): undefined reference to `timeGetTime@0'
dodge.o:dodge.cpp:(.text+0x3f3): undefined reference to `timeEndPeriod@4'
dodge.o:dodge.cpp:(.text+0x44a): undefined reference to `mciSendStringA@16'
dodge.o:dodge.cpp:(.text+0x469): undefined reference to `PlaySoundA@12'
dodge.o:dodge.cpp:(.text+0x570): undefined reference to `mciSendStringA@16'
dodge.o:dodge.cpp:(.text+0x5b9): undefined reference to `mciSendStringA@16'
dodge.o:dodge.cpp:(.text+0x120a): undefined reference to `PlaySoundA@12'
dodge.o:dodge.cpp:(.text+0x1231): undefined reference to `mciSendStringA@16
dodge.o:dodge.cpp:(.text+0x15b3): undefined reference to `PlaySoundA@12'
winmain.o:winmain.cpp:(.text+0x214): undefined reference to `timeGetTime@0'
winmain.o:winmain.cpp:(.text+0x284): undefined reference to `timeGetTime@0'
winmain.o:winmain.cpp:(.text+0x2c9): undefined reference to `timeGetTime@0'
winmain.o:winmain.cpp:(.text+0x2df): undefined reference to `timeGetTime@0'
collect2: ld returned 1 exit status

と表示されコンパイルできません。

ヘッダファイルに「mmsystem.h」をインクルードしているのが原因だと考え、「-lwinmm」をオプションに加えたのですが、やはりコンパイルできません。
コンパイルできない原因は何が原因だと考えられるか教えてください。
よろしくお願いします。
iOSアプリバージョンアップ申請

いつも忘れてしまうのでこちらに転記しておこう。
オリジナルはこちら
http://nekomemodesu.tumblr.com/post/41518370035

------

とりあえずここが参考になりそう。

https://www.facebook.com/note.php?note_id=292904037441626


(9) 暗号化処理に関する質問と、法的問題に対応するためのアップデートなのかを聞かれるので適切に答える。

>とりあえず両方NOで。


(10) レビューが完了したら自動でApp Storeに公開するか、それとも手動で公開するかを選択する画面が表示されるので、適切に答える

>once it has been approvedにした。

>iTunes Connectで、アプリのアップデート手続き完了。

さて次は


２．新しいバージョンのアプリをビルドして、アップロードするでございます。

この操作自体はなんの問題なく完了。

いやぁ思ったより簡単でした。
javascriptで例外処理

よくjavascriptのfunction()で条件分岐させて、trueの場合はalert()を返す。
みたいなコードを書く時が多いのですが、

```js:test.js
 $(function(){
    test(A);
    test(B);
    test(C);
}); 

function test(hoge){
  if(!hoge){
    alert(hoge+ 'で失敗');
   }
}

```

と書いた際にtest(A)で失敗したらその後の処理は止めたいみたいなニーズが良くあります。
(※each文でいうbreakみたいなもの)

いつもどうしようかなーと思いながら渋々ややこしい書き方で書いてましたが、
javascriptのtry catchによる例外処理を使えば超簡単でした！

```js:test.js
 $(function(){
    try {
      test(A);
      test(B);
      test(C);
    } catch(e) {
     alert(e.message);
    }
}); 

function test(hoge){
  if(!hoge){
    throw new Error(text);
   }
}

```

超すっきりしました(｀・ω・´)ｷﾘｯ
指定桁の数字を返す


```java
import java.util.Random;

public int numGen(int keta){
    int tmp=0;
    for(int i=0 ; i<keta ; i++){
        if(keta>=2){
            tmp *= 10;
        }
        Random rnd = new Random();
        tmp += rnd.nextInt(10);
        if(tmp == 0){
            i--;
        }
    }
    return tmp;
}
```
chefでJenkinsをインストール


# Javaのインストール
```bash
knife cookbook site vendor java
```

# Jenkinのインストール

```recipes
yum_key "RPM-GPG-KEY-jenkins" do
  url "http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key"
  action :add
end

remote_file "/etc/yum.repos.d/jenkins.repo" do
  source "http://pkg.jenkins-ci.org/redhat/jenkins.repo"
  mode 0644
  action :create_if_missing
end

yum_package "jenkins" do
  action :install
end

service "jenkins" do
  action [:start]
end
```

# chefの実行
```node.rb
{
	"run_list":[
		"java",
		"jenkins"
	]
}
```

```bash
knife solo cook [対象サーバ]
```
検索候補リストから連続grepを１行で書く

コマンドラインで検索するリストを作って、連続でgrepを1行で書く。(環境 MacOS)
grepとxargsを連携する。

事前準備として、検索候補リストをfileに書き出しておく。

```
$ cat list
aaa
bbb
ccc
```

そして、検索対象は、search_dirとすると、

```
$ cat list | xargs -I 'key' grep -r 'key' ./search_dir
```

これで検索候補リストを一行ずつ search_dirからgrepできる。


awkとかとも連携

```
$ awk -F '"' '{ print $4 }' | xargs -I 'key' grep -r 'key' ./search_dir
```
Redmineなど汎用的に使えるバックアップ処理（shellscript+cron+rsync）

# redmineバックアップ処理

毎回設定が面倒なので、
結構汎用的に使える？そして、簡単に実装できる？
クーロン＋シェルを利用したバックアップ処理を書いてみました。

※ ロギングやエラー処理は適宜入れてみてください。

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

# Redmine Backup

# 定義
# バックアップ先フォルダ
TO_BK_DIR=/backup/to

# 現在日付（バックアップファイル名に使用）
NOW=`date +%Y%m%d%H`


# DBバックアップ
mysqldump -u DB_USER -pDB_PASS DB_NAME | gzip > $TO_BK_DIR/redmine/redmine_db_$NOW.sql.gz

# アップロードファイルバックアップ
gzip -rc /REDMINE_ROOT/files > $TO_BK_DIR/redmine_upload_$NOW.tgz

# 世代管理（更新日が７日以前のものは削除）
find $TO_BK_DIR/ -mtime +7 -type f -exec rm -f {} \;

# バックアップサーバと同期
rsync -avz --delete -e ssh $TO_BK_DIR/ username@remote_server:$TO_BK_DIR/
```

クーロンの設定はこんな感じ(日次午前４時起動)
0 4 * * * redmine_backup.sh >/dev/null 2>&1



sshとrsyncでパスワード無し認証のやり方などは、[ここ](http://suzulabo.com/blog/?p=20)参照
背景色を定期的に変更する

```javascript
function setBackgroundColor(index) {
    var blue1 = 'rgba(52, 152, 219, 0.8)';
    var blue2 = 'rgba(41, 128, 185, 0.8)';
    var dark1 = 'rgba(52, 73, 94, 0.8)';
    var dark2 = 'rgba(44, 62, 80, 0.8)';
    var gray1 = 'rgba(149, 165, 166, 0.8)';
    var gray2 = 'rgba(127, 140, 141, 0.8)';
    var white2 = 'rgba(189, 195, 199,1.0)';

    var colors = [blue1, blue2, dark1, dark2, gray1, gray2, white2];

    if (!index || index > (colors.length - 1)) {
        index = 0;
    }
    var color = colors[index];

    setTimeout(function() {
        $('html').animate({
            backgroundColor: color
        }, 500);

        setBackgroundColor(++index);

    }, 30000);
}

$(document).ready(function() {
    setBackgroundColor();
});
```
LangExtの紹介 - シーケンスの概要

[前回はLangExtが何であって、何ではないのかを紹介](http://qiita.com/items/1796c40d6e72eab91359)しました。

今回は、シーケンスの概要について紹介します。

表記
----
ジェネリックの型パラメータを囲むかっこですが、山かっこではなく角かっこを使います。
ドキュメンテーションコメントをXMLで記述するC#では、山かっこは何かと不便なのが、角かっこを使う理由です。
ちなみに、Eiffel/Scalaの記法から拝借しました。

シーケンスとは
--------------
LangExtは`LangExt.ISeq[T]`というインターフェイスを持っていて、これのことをシーケンスと呼びます。
シーケンスは、`System.Collections.Generic.IEnumerable[T]`の代わりとなるインターフェイスです。

独自の型を作った理由は、単に`IEnumerable[T]`が長ったらしい名前だからです。
その代償として、LangExtでは以下の物を捨てています。

1. 他のライブラリとの直接の互換性
1. IEnumerableを実装しているコレクションをLangExtで扱うこと
1. yield return/yield break
1. 配列をシーケンスとして(直接)扱えない

一つ目については次回紹介する`ToSeq`により、`IEnumerable[T]`をシーケンスに明示的に変換可能です。
また、シーケンスは`IEnumerable[T]`を継承しているため、変換せずに`IEnumerable[T]`を要求する場所で使えます。

二つ目は、今後[SeqExt](https://github.com/LangExt/SeqExt)という別ライブラリを提供予定です。
それまでは、既存コレクションを`ToSeq`するか、自分で`ISeq[T]`を実装したクラスを使うことになります。

三つ目はどうしようもない欠点となりえますが、名前の短さの方を取りました。
yieldを使いたい場合、`System.Collections.Generic.IEnumerable[T]`版を作り、
それを呼び出して結果を`ToSeq`するしかありません。

四つ目も`ToSeq`するか、`Create.Seq`(または`Seq.Create`)に渡すしかありません。
配列の扱いは、今後専用モジュールを追加する予定です。

次回
----
次回は、[シーケンスの生成について](http://qiita.com/items/af1c64c9ed754fbaa3a4)紹介します。
svg.jsでリンクを作る

ググっても見つからなかったのでメモがてら

```javascript
var canvas = SVG('canvas'); // <div id="canvas"></div>があるとして
var a = new SVG.Container(SVG.create('a'));
a.attr('xlink:href', 'http://example.com/', SVG.xlink).text('リンク'); // ここでどはまり、ちゃんと名前空間の指定を！
canvas.add(a);
```
UITableViewの全sectionのrowの合計を算出

```getRowNum.m

- (NSInteger)getRowNum:(UITableView *)tableView
{
    NSUInteger allRows = 0;
    for (NSInteger i = 0; i < [tableView numberOfSections]; i++) {
        allRows += [tableView numberOfRowsInSection:i];
    }
    
    return allRows;
}
FQLでlikeっぽく絞り込みを行う方法

# FQLでlikeを使ってみる

FQLにはlikeオペレータが無いのか、下記の様にクエリを投げるとErrorが返ってくる。
下記のクエリは、自分の友だちの中で「Sato」さんを取得したいときのサンプル。

```like.sql
select uid, name from user where uid in (select uid2 from friend where uid1 = me()) and name like "%Sato%"
```

```response.json
{
  "error": {
    "message": "(#601) Parser error: unexpected 'like' at position 93.", 
    "type": "OAuthException", 
    "code": 601
  }
}
```

Parser errorって返ってくるってことはやっぱりlike自体受け付けていないっぽい。
なんとかならないかと思って探してみたら、似たような機能を見つけた。

#strposを使う

どうやらstrposという関数が使用できるらしい。
strposを使えば文字列の中で指定する文字列が該当した位置を教えてくれるため、下記の様に使用すれば文字列検索っぽいことが可能になる。

```strpos.sql
select uid, name from user where uid in (select uid2 from friend where uid1 = me()) AND strpos(name,'Sato') >=0
```

これで、名前の中に「Sato」という文字列が存在している友達を取得できる。

#注意点
あくまでも指定しているlocaleで検索をかけるらしい。
localeに「ja_JP」を指定して、日本語の名前を返すようにしていた時に、「Sato」で検索をかけても、日本語に対して検索するので、該当なしになってしまう。
CoreDataを扱う上で必要なオブジェクト

CoreDataの扱いについて数ヶ月間ずっと悩み続けたので、その内容について超ざっくりと書きます。

Master-Detail Applicationのプロジェクトをベースにしたときに、画面遷移先のTableViewControllerやViewControllerで必ず用意しないといけないものが以下の３つです。


   * **NSManagedObject**
   * **NSManagedObjectContext**
   * **NSFetchedResultController**


**上の３つのオブジェクトがTableViewControllerにあれば、とりあえずは動くはずです。**
例えば、画面が遷移する際には、渡す元のTableViewControllerの`prepareForSegue: sender:`で

```objc:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [[segue destinationViewController] setManagedObject:managedObject];
    [[segue destinationViewController] setFetchedResultsController:self.fetchedResultsController];
    [[segue destinationViewController] setManagedObjectContext:self.fetchedResultsController.managedObjectContext];
}
```

などと書いて、それぞれオブジェクトを渡します。
ここで渡す先のTableViewControllerヘッダーには

```objc:
@property (strong, nonatomic) id managedObject;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
```

としてプロパティを宣言しているものとします。


簡単に解説すると、NSManagedObject（エンティティがクラスになったもの）を使うには単体じゃダメで、必ずNSManagedObjectContextを用意しておかないといけないのです。
ついでにNSFetchedResultsControllerがあると、TableViewにデータを渡すのが楽になるのです。


CoreDataの習得にあたって、最初は誰もがMaster-Detail Applicationのプロジェクトから始めると思います。
プロジェクトをつくってビルドすると、まあ当たり前ですが普通に動くので、「これをベースにいじっていったら楽勝じゃん？」とか思うんですよね。
ほんでいじったら急に動かなくなって、検索しても解決が出てこなくて、挫折して諦めるわけです。

私の場合はCoreDataに加えてTableViewについても初めて触れたため、ドツボにはまりました。
最終的にいろいろな解説を読んでようやく理解しましたが、大事な部分は上記の通りで、単純です。
scssでカッコを付けないで-をすると計算される。

sassで変数に正の値を指定してあとで、valueの所でマイナスを付けて負の値にしょうとしたら以下のようになってしまった。

```scss
$y: 120px;
background-position: 0px -$y;
//これだと、background-position: -120px　となってしまう！
```

`background-position: -0px -120px;`
と表示させるには `-$y`をかっこで囲む必要がある。

```scss
$y: 120px;
background-position: 0px (-$y);
// background-position: -0px -120px;
```
どうやってBounded Contextを見つけるか



ドメイン駆動設計の取っ掛かりで難しいのはBounded Contextの設計である。Bounded Contextを設計するにあたって、そのDomainのSub Domainを発見しなければならない。Sub DomainはDomainによって千差万別であり、手順書的に探し当てられるものではない。

このような課題があって、調べてみたら [Sub-domains and Bounded Contexts in Domain-Driven Design (DDD)](http://gorodinski.com/blog/2013/04/29/sub-domains-and-bounded-contexts-in-domain-driven-design-ddd/) という記事を見つけた。

この記事によると、コミュニケーション構造に着目して探してみると、ヒントを得ることができるとのこと。どんな業務にも組織があり、コミュニケーション構造がある。組織が人間である以上、コミュニケーションにはコストがかかる。そのコストを下げるために、多くの業務では組織を最適化している。つまり、組織といったコミュニケーション構造に従ってSub Domainを模索することはBounded Contextを設計するための近道である。
ひらがな・カタカナ・半角カタカナを抽出して半角カタカナに変換する



```php
<?php
$value = preg_replace('/[^ぁ-んァ-ヶーｱ-ﾝﾞﾟｧ-ｫｬ-ｮｰ]/u', '', $value);
$value = mb_convert_kana($value, 'C'); // 全角ひらがな -> 全角カタカナ
$value = mb_convert_kana($value, 'k'); // 全角カタカナ -> 半角カタカナ
```

正規表現は苦手なのでメモ。

### 追記

mb_convert_kanaの変換オプションは複数指定できたみたいです。

```php
<?php
// 全角ひらがな -> 半角カタカナ、全角カタカナ -> 半角カタカナを同時指定
$value = mb_convert_kana($value, 'kh'); 
```
プライベートネットワーク内に限定されたネットワークサービスに外部から接続するやつ

(再構築中の MBA で tsocks の autoreconf がこけて詰まっているので、暇つぶしがてら思い出メモをひとつ)

一番最初に使ったのは、SSH のポートフォワードを使うやつ。サービスごとにコマンドを実行する必要があり面倒だった思い出がある。

```
$ ssh -N -f -L 8000:192.168.1.123:80 foo@gateway.example.com
```

その後 `sshuttle` の存在を知り、しばらくの間は使っていたけど、いまいち使い勝手が良くなかったために封印した。終了後にネットワークの調子が悪くなったり、OSのアップデートで微妙な感じになったり、そんな思い出。

* [sshuttle](https://github.com/apenwarr/sshuttle)

```
$ sshuttle -r foo@gateway.example.com 0.0.0.0/0 -vv
```

最終的に、SSHのダイナミックポート転送とtsocksに落ち着いている。

* [tsocks](http://tsocks.sourceforge.net/)

`~/.ssh/config` にダイナミックポート転送用のホスト設定を書いて `ssh {host}-D` した後に、tsocks 越しにコマンドを実行したり、ブラウザから SOCKS プロクシ越しにアクセスしたりしている。

```
Host *-D
        DynamicForward localhost:1080
```

Homebrew に tsocks の Formula はないのだけど、SOCKS 関係のツールで以下が見つかった。tsocks の代わりになりそうなのは dsocks.sh だろうか。

* [dsocks](http://monkey.org/~dugsong/dsocks/)
* [redsocks](http://darkk.net.ru/redsocks/)
* [torsocks](https://code.google.com/p/torsocks/)

他にも、色々と手段はあるのでしょうね。

## 追記：2013/05/25 ##

`autoreconf` で躓いていたのは、aclocal のパスを解決できず実行できていなかったからだった。-v オプションをつければすぐに気づけたのに…。

* Xcode 4.3 以降、`autotools` は含まれなくなった模様
* Homebrew でインストールするときに環境が `superenv` と呼ばれる状態になる
  * `superenv` では `$PATH` が書き換えられる
  * `superenv` を避けたければ `--env=std` をつけてインストールしたらよいとか
* `autoconf` したい場合は `automake` と `autoconf` を `depends_on` すればよい
  * `automake` の指定はいらないかもしれない

ということを踏まえて書き直した `tsocks` の `Formula` が以下。

* https://github.com/koshigoe/homebrew-koshigoe/blob/master/tsocks.rb

上記、紆余曲折してでっち上げたものなので、以下を利用した方がよいかもしれない。

* https://github.com/mxcl/homebrew/issues/11870
border-imageのメモ

## サポート状況
まず前提として、スマホ以外では使わないほうが無難。
IE10もまだサポートしないのでタブレットも危ない。

サポート状況は [caniuse](http://caniuse.com/#feat=border-image) などを参考に。

## 記述
古いiOSやAndroidではショートハンドでしか効かなかったり、逆に`border-width`を含めると効かなかったり、順番の問題だったり、色々とあるので一部ショートハンド + `border-width` が今のところ安全。

```css
selector {
    /* 画像パス スライス リピート の順であれば安全 */
    border-image: url(hoge.png) 1 1 1 1 stretch;
    /* ボーダーの太さは別に記述する */
    border-width: 5px 5px 5px 5px;
}
```
## クロスブラウザ
例のごとくベンダープレフィックスが必要。

そしてここでひとつポイントがあって、画像の中央（コンテンツボックス部分）を表示するかどうかの`fill`キーワードが、Android4などでは**対応しておらず**記述してはいけない。記述しなくてもデフォルトで画像の中央は表示されるので、それは問題はない。

しかし、プレフィックスなしの`border-image`で記述する場合、デフォルトではW3Cの仕様に従い`fill`キーワードを記述しないと中央が表示されなくなってしまう。

つまり

```css
selector {
    -webkit-border-image: url(hoge.png) 1 1 1 1 stretch; /* デフォルトでfillの状態 */
    image-border: url(hoge.png) 1 1 1 1 fill stretch; /* fillを入れないと反映されない */
}
```
と記述必要がある。

※-webkit-をサポートしている限りはこれだけを記述しておけば間違いはないが、いつサポートが終了するかはわからないので極力プレフィックスなしの記述も加えておく。

## まとめ

現在の段階ではこう書いておいたほうがいい。

```css
selector {
	-webkit-border-image: url(hoge.png) 1 1 1 1 stretch;
	   -moz-border-image: url(hoge.png) 1 1 1 1 stretch;
	     -o-border-image: url(hoge.png) 1 1 1 1 stretch;
	        border-image: url(hoge.png) 1 1 1 1 fill stretch;
	border-width: 5px 5px 5px 5px;
}
```
下にあるViewのrecognizerを利用する


2つのUIViewが重なっているときに、上のViewに設定したrecognizerから下のViewのrecognizerを呼び出してみた。

view1の引き数の値はview2のものなので、View1の外側をタッチしてもPanやPanができてしまう。
タッチされた位置を把握する処理を付け加えればいいのかもしれない。

```Objective-C

@implementation XXXViewController
{
    UIView *_view1;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // view1 -- view2の下側にある
    _view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 150, 100, 100)];
    [_view1 setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:_view1];

    UIPinchGestureRecognizer *pinch1 = [[UIPinchGestureRecognizer alloc]
                                       initWithTarget:self action:@selector(handlePinch1:)];
    [_view1 addGestureRecognizer:pinch1];
    UIPanGestureRecognizer *pan1 = [[UIPanGestureRecognizer alloc]
                                    initWithTarget:self action:@selector(handlePan1:)];
    [_view1 addGestureRecognizer:pan1];
    
    
    // view2 -- alpha0.5でview1の上を覆っている。
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    [view2 setBackgroundColor:[UIColor blueColor]];
    view2.alpha = 0.5;
    [self.view addSubview:view2];
    
    UIPinchGestureRecognizer *pinch2 = [[UIPinchGestureRecognizer alloc]
                                       initWithTarget:self action:@selector(handlePinch2:)];
    [view2 addGestureRecognizer:pinch2];
    UIPanGestureRecognizer *pan2 = [[UIPanGestureRecognizer alloc]
                                    initWithTarget:self action:@selector(handlePan2:)];
    [view2 addGestureRecognizer:pan2];
}

// view1用：引き数recognizerの値はview2の値なので、正しい位置情報ではない。
-(void)handlePinch1:(UIPinchGestureRecognizer *)recognizer
{
    _view1.transform = CGAffineTransformScale(_view1.transform, recognizer.scale, recognizer.scale);
    recognizer.scale = 1;
}
- (void)handlePan1:(UIPanGestureRecognizer *)recognizer
{
    CGPoint transPoint = [recognizer translationInView:self.view];
    _view1.center = CGPointMake(_view1.center.x + transPoint.x, _view1.center.y + transPoint.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
}
// view2用：view1のrecognizerを呼ぶだけ
-(void)handlePinch2:(UIPinchGestureRecognizer *)recognizer
{
    [self handlePinch1:recognizer];
}
- (void)handlePan2:(UIPanGestureRecognizer *)recognizer
{
    [self handlePan1:recognizer];
}

@end
```
Scala 2.10でJSONシリアライズ

Play Framework 2.1でJSONをレスポンスとして返す実装を書こうとしたのですが、今日2013-05-22時点ではJerksonがScala 2.10に対応していません([Pull Requestは出ている](https://github.com/codahale/jerkson/issues/76))。
代替手段として、[Jackson Scala Module](https://github.com/FasterXML/jackson-module-scala)を使うことにしました。

ライブラリの追加は下記の通り。

```scala:Build.scala
  val appDependencies = Seq(
    "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.1.3"
  )
```

準備は以下のとおり。

```scala
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
```

DefaultScalaModuleというのが、Scalaがサポートしている型をJSONに変換するためのモジュールだそうです。

あとはJSONに変換したいScalaのインスタンスを渡してあげればOKです。今回はStringに変換する例です。

```scala
  //インスタンスobjをJSONに変換したStringに変換
  val json: String = mapper.writeValueAsString(obj)
```

Case classを渡してあげると、引数の名前がJSONのキーになります。

```scala
case class DataPoint(title: String, value: String)
val obj = DataPoint("test", "abc")
```

のようなcase classがあったときのobjのJSON変換結果は

```js:JSON
{"test":"abc"}
```

のようになります。
オブジェクトへのマッピング(デシリアライズ)にも、もちろん対応しています。ですが私はまだ触ったことがありません。また機会を見つけて調査してみます。
LangExtの紹介 - LangExtとは何であって、何でないか

昨日、LangExtというライブラリの新しいバージョンを[リリース](http://bleis-tift.hatenablog.com/entry/langext2.0)しました。
このライブラリは、C#での関数プログラミングを支援するためのライブラリです。
[ブログ](http://bleis-tift.hatenablog.com/)では割と長文のエントリを書く傾向にあるので、こっちではLangExtの機能を細切れで紹介していく感じにしようと思います。

最初の記事は、LangExtの紹介のようなものです。

LangExtとは
-----------
LangExtは、C#での関数プログラミングを支援するためのライブラリですが、
「関数プログラミング」という言葉に対して感じるものは人によってかなり異なります。

そこで、そのあたりを少しでも明確にしようと思います。

### LangExtは言語を拡張するライブラリである
LangExtという名前は、言語(Language)を拡張する(Extend)ことから来ています。
実際に言語を拡張するわけではないのですが、
C#の言語仕様を駆使してそれなりに分かりやすく色々なことが出来るようになっています。

提供する主な機能は、

* シーケンスに対する操作
* Option/Result(Either)
* タプルに対する操作
* 関数(Funcデリゲート)に対する操作

です。

### LangExtは実用的なライブラリである
標準クエリ演算子を捨てたり、IEnumerableを捨てたりしてはいますが、LangExtは実用できることを目指して作っています。
ここでいう「実用」は、「仕事でも使える」ということです。

外界との関連を絶って、完全に自分の中で完結するようなライブラリもあっていいと思います(Funcの引数の数を1つまでに絞ってみたり)。
ですが、それでは他のコードと連携を取らなければいけなくなった時に、いちいちワンクッションかませたり、どこかで無理が出たりします。
そういう事態を避けるため、LangExtは多少泥臭い方法(T4による自動生成とか)を使ってでも、標準ライブラリが対応している範囲までは頑張ります。

その結果失う表現力は確かにあります。しかし、LangExtの目的はコードで美しい世界を表現したいわけではありません。むしろ泥臭くても実用を目指したライブラリなのです。

### LangExtはモナドライブラリではない
LangExtはモナドを提供することを主目的としたライブラリではありません。
もちろん、LangExtもいくつかのモナドを提供しますが、その提供範囲は限定的です。

具体的には、

* リストモナド
* Optionモナド
* Error/Exceptionモナド

を提供しています。
今後増える可能性はありますが、それが主目的のライブラリではないため、その方面での期待はしないでください。

### LangExtは型クラスライブラリではない
LangExtは型クラスを提供することを目的としたライブラリではありません。
いくつかの設計上の方針により、そもそも型クラスを提供しないという方向に進んでいます。
これについてはいずれ詳しく説明する予定です。

### LangExtはLINQを拡張するライブラリではない
LINQはクエリ式と標準クエリ演算子からなります。
しかし、LangExtではその片方である標準クエリ演算子を捨てています。
そのため、LangExtはむしろ**LINQを否定するライブラリ**とも言えます。

次回
----
次は、実際にLangExtの中身の紹介に入っていきます。
LangExtの中身の紹介は、[シーケンスの概要](http://qiita.com/items/5d1f51ce45356a12ac74)から始めます。
Vagrant に sahara を導入


## bundleを使えるようにする

```
% sudo gem install bundler
Password:
Successfully installed bundler-1.3.5
1 gem installed
Installing ri documentation for bundler-1.3.5...
Installing RDoc documentation for bundler-1.3.5...
```

## saharaのインストール

```
% git clone git://github.com/ryuzee/sahara.git
Cloning into 'sahara'...
remote: Counting objects: 289, done.
remote: Compressing objects: 100% (157/157), done.
remote: Total 289 (delta 137), reused 262 (delta 112)
Receiving objects: 100% (289/289), 36.13 KiB, done.
Resolving deltas: 100% (137/137), done.
```
本家は[こっち](https://github.com/jedi4ever/sahara)だけど、うまく動かないのでforkされた方を使う。

```
% cd sahara
% bundle install
Fetching gem metadata from http://rubygems.org/.........
Fetching gem metadata from http://rubygems.org/..
Resolving dependencies...
Installing rake (0.9.2.2)
Installing Platform (0.4.0)
Using archive-tar-minitar (0.5.2)
Installing ffi (1.0.11)
Installing childprocess (0.3.2)
Using erubis (2.7.0)
Installing i18n (0.6.0)
Installing json (1.5.4)
Using log4r (1.1.10)
Using net-ssh (2.2.2)
Using net-scp (1.0.4)
Installing open4 (1.3.0)
Installing popen4 (0.1.2)
Installing thor (0.15.2)
Installing vagrant (1.0.3)
Using sahara (0.0.14) from source at .
Using bundler (1.3.5)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

```
% bundle exec rake build
sahara 0.0.14 built to pkg/sahara-0.0.14.gem.
```

gemファイルが作れたら、vagrantのプラグインに追加。

```
% sudo vagrant plugin install pkg/sahara-0.0.14.gem
Installing the 'pkg/sahara-0.0.14.gem' plugin. This can take a few minutes...
Installed the plugin 'sahara (0.0.14)'!
```

使えるようになりました。

```
% sudo vagrant sandbox
Usage: vagrant plugin <command> [<args>]

Available subcommands:
     commit
     off
     on
     rollback
     status

For help on any individual command run `vagrant plugin COMMAND -h`
```
LimeChat 2.17 リリース

細かい bug fix のための更新です。

ダウンロードは、http://limechat.net/ からどうぞ。

設定ファイルを設定変更時にすぐ保存するようにした。
UnrealIRCd の mode を誤って解釈しないように mode のパース方法を変更した。
mode +a 受信時にメンバリストをクリアしないようにした。
mode +R 受信時に Reop ダイアログにマスクを追加していなかったバグをfixした。
mode 送信時に +R のペナルティ計算が抜けていたバグをfixした。
ヘルプのマクロの箇所で、Inviteアクションの説明が間違っていたのを直した。
コメント一覧
はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/Psychs/20070526/1180150227 
http://www.cdenchi.com/dell-vostro-1015.html
mac標準ではなくhomebrewのgit1.8〜を使うためにやったこと


先日間違えて`git push -f`してしまい、激しく後悔したのでこれを機会にgitの設定を見直すことにしました。

## 前提
- homebrewがインストールされている

## 0. ローカルのgitのバージョンを確認する
`git --version`でまず現在のgitを確認すると

```
git version 1.7.10.2 (Apple Git-33)
```

かなり古いバージョンを使っている&そもそもhomebrewのgitですらないっぽいことが分かりました…
せっかくなので、ここでhomebrewに切り替えようと考えました。

## 1. homebrewのgitを最新化
`brew update`した後に`brew upgrade git`でhomebrewのgitを最新化します。

## 2. エラーが出る…

`brew upgrade git`したときに下記のエラーがでます。

```
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link git'
```

で、試しに`brew link git`するとまたエラー。

```
brew link git
Linking /usr/local/Cellar/git/1.8.2.3... Warning: Could not link git. Unlinking...

Error: Could not symlink file: /usr/local/Cellar/git/1.8.2.3/etc/bash_completion.d/git-completion.bash
Target /usr/local/etc/bash_completion.d/git-completion.bash already exists. You may need to delete it.
To force the link and overwrite all other conflicting files, do:
  brew link --overwrite formula_name

To list all files that would be deleted:
  brew link --overwrite --dry-run formula_name
```

`brew link --overwrite --dry-run formula_name`とのことなので`brew link --overwrite --dry-run git`をしてみると

```
brew link --overwrite --dry-run git
Would remove:
/usr/local/bin/git-upload-pack
/usr/local/bin/git-upload-archive
/usr/local/bin/git-shell
/usr/local/bin/git-receive-pack
/usr/local/bin/git-cvsserver
/usr/local/bin/git
```

で、問題なさそうな気がしたのでおもむろに`brew link --overwrite git`を実行。
※よくわかっていないのでそのまま実行してトラブルがあっても責任はとれません…

## 3. やっとできたと思って`git --version`を実行したら古いまま

```
git --version
git version 1.7.10.2 (Apple Git-33)
```

## 4. pathが通っていないせいで古いgitを参照してしまうため、`/etc/paths`を書き換える

他にもいろいろ方法はあるみたいですが、自分はとりあえず`/etc/paths`を書き換える方法を選択しました。
`sudo vi /etc/paths`で下記のように編集。

```sh:before
cat /etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
```

```sh:after
cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
```

## 5. ちゃんとhomebrewのgitを参照していることを確認

そのままだと変更されないのでターミナル再起動or`. ~/.zshrc`してからバージョンを確認。

```
git --version
git version 1.8.2.3
```

以上で完了です。

## 最後に
[git push時に表示されるwarning: `push.default is unset...`の意味と解決方法 #git - Qiita [キータ]](http://qiita.com/items/a8e9f5de8dcca81d3214)

この設定をしておくと間違ってすべてのrepositoryをforce pushしてしまう危険がなくなるのでおすすめです。これをやるためにバージョンアップしたのでした。
Google App Engineのアクセスログにプログラムからアクセスする

# 日本語のドキュメントには書かれていないど
Google App Engineではログへアクセス出来るAPIが用意されている。
RingoJSでのサンプル的なソースを書いてみた。

# ソース
``` js
importPackage(Packages.com.google.appengine.api.log);
importClass(java.util.Calendar);
importClass(java.util.TimeZone);

// 黙ってるとGoogle App EngineではタイムゾーンがUTCなので、
// 明示的に日本時間を指定する。
TimeZone.setDefault(TimeZone.getTimeZone("JST")); 
    
var query = LogQuery.Builder.withDefaults();
query.includeAppLogs(true);

var records = LogServiceFactory.getLogService().fetch(query);  

// 結果をmsgに文字列として格納する。
var msg = "";

// RingoJSでのイテレータの扱いに実は難儀したｗ
var it = records.iterator();

// 何件取得したかのカウンタ（取得件数制限するために利用）
var limit = 0;

// アクセス状況が気になるパスを指定する。
var targetPath = "/ykoV";

while(it.hasNext()&&limit<15) {   
   // イテレータを進める
   var record = it.next();

   if(record.getResource().lastIndexOf(targetPath,0)==0) {
      var cal = Calendar.getInstance();
      cal.setTimeInMillis(record.getStartTimeUsec() / 1000);

      // アクセスのあった時刻を取得する。
      msg = msg + java.lang.String.format("<br />Date: %s", cal.getTime().toString()) + "<br>";

      // アクセス元のIPアドレスを取得する。
      msg = msg + "IP: " + record.getIp()+"<br />";

      //msg = msg + "Method: " + record.getMethod()+"<br />";
      
      // アクセスされたURLを取得する。
      msg = msg + "Resource " + record.getResource()+"<br />";
      limit++;
   }
}
```

# 参考リンク
- [Logs API Overview](https://developers.google.com/appengine/docs/java/logs/overview)

# 関連記事
- [RingoJSをGoogle App Engineで動かす #2013](http://kjunichi.cocolog-nifty.com/misc/2013/04/ringojsgoogle-a.html)

# 関連作品
- [俺のGistへのアクセス状況を確認する](http://jsdo.it/kjunichi/cc3P)
.vimrc整理術

.vimrcが400行近くになり見づらくなってきたので見やすくしてみた。markerは使ってる人おおい感じがするけど、modelineと組み合わせたらかなり見やすくなったのでメモ。

## 1. 各種設定をmarkerで囲む

markerで囲まれた部分は折りたためるので見やすくなる。基本的な設定やマッピングの設定、プラグインを入れてる人はプラグインの設定、あとカラースキームの設定など、おおざっぱに設定をまとめてmarkerで囲む。

```vim:.vimrc
" 基本設定 {{{1

set nocompatible
set number

" マッピング {{{1

nnoremap H b
nnoremap J }
nnoremap K {
nnoremap L w

" カラースキーム {{{1

syntax on
colorscheme hybrid

" プラグイン {{{1

" neobundle {{{2

...

" unite.vim {{{2

...

" neocomplcache {{{2

...
```

プラグインの設定のなかでプラグイン毎の設定もまとめたいので、折り畳みレベルを設定する。こうすると、折り畳みが入れ子になる。

## 2. modelineを有効にする

.vimrcのための設定を書きたいのでmodelineを有効にする。modelineの詳細は`:h modeline`を参照。

```vim:.vimrc
" モードラインを有効にする
set modeline

" 3行目までをモードラインとして検索する
set modelines=3
```

## 3. modelineで.vimrc用の設定をする

ファイルの最後（最初でもいいけど）に以下を追加する。

```vim:.vimrc
" vim: foldmethod=marker
" vim: foldcolumn=3
" vim: foldlevel=0
```

- markerで折りたたむようにする。
- 行番号の左に折りたたまれてる箇所が表示されてわかりやすくなる。
- デフォルトで折りたたんで表示する。（`foldlevel`より`foldlevelstart`の方が適切だと思ったけど、なんかうまくいかないのでとりあえず`foldlevel`を使ってます）

## スクリーンショット

以上の設定をすると、.vimrcはこんな感じで表示されるようになるはず。

![fold.png](https://qiita-image-store.s3.amazonaws.com/0/1044/80b00f4c-6c5f-5dc2-912c-4fcc212c5f90.png)

---

参考までに拙者の.vimrcのリンクも載せておく。

[dotfiles/.vimrc at master · naoty/dotfiles · GitHub](https://github.com/naoty/dotfiles/blob/master/.vimrc)

これと同じことを.zshrcでもやってるので、.vimrcにかぎらず設定ファイル全般で使えるテクニックだと思う。
PHPUnitをComposerでインストールする


http://phpunit.de/manual/3.7/ja/index.html

プロジェクト毎に特定のバージョンを使う必要がある場合は、Composerでプロジェクト内にインストールする。tarvisを使う場合もこちらかもしれない。

最新の安定版は https://packagist.org/packages/phpunit/phpunit を確認。

```json:composer.json
{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}
```

phpunitに限ったことではないが開発時のみ必要な依存モジュールは``require``ではなく、 **``require-dev``** に指定する。すると``composer install``のときはインストールされずに以下のように``--dev``を指定した場合にインストールされる。

```
composer install --dev
```

Composerでインストールした実行スクリプトは ``vendor/bin`` に配置される。

プログラム内からComposerでインストールしたPHPUnitクラスを使うには ``vendor/autoload.php`` を読む必要がある。

以上を踏まえると

```
vendor/bin/phpunit --bootstrap vendor/autoload.php app/tests
```

のようにして実行できる。