OmniAICreator/Qiita-1.07M huggingface dataset:
Android Asynchronous Http Clientを使ってみた


## Android Asynchronous Http Client
Apache HttpClientを使いやすくライブラリ化したもの
本家は[ここ](http://loopj.com/android-async-http/)
javaDocは[ここ](http://loopj.com/android-async-http/doc/com/loopj/android/http/package-summary.html)

**追記※非同期でネットワークアクセスできるものの、受信データの扱いはUIスレッドで行うことになるので、データのパースが重い場合などは向かないかも**
## 非同期通信の実装例
AsyncHttpClientをnewして利用するだけ。とっても簡単。下記はyahooのトップページを取得する例

    final AsyncHttpClient client = new AsyncHttpClient();

    Button btn = (Button)findViewById(R.id.btn1);
    btn.setOnClickListener(new View.OnClickListener() {            
        @Override
        public void onClick(View v) {
            final ProgressDialog progress = new ProgressDialog(MainActivity.this);
            progress.setTitle("Get Yahoo page");
                
            // 注意：onStart -> onSuccess -> onFinishの順番で呼ばれる
            client.get("http://www.yahoo.co.jp", new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(String response) {
                    progress.dismiss();
                    Log.i(TAG, "onSuccess");
                    Log.v(TAG, response);
                    Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFinish() {
                    Log.i(TAG, "onFinish");
                    progress.dismiss();
                }

                @Override
                public void onStart() {
                    Log.i(TAG, "onStart");
                    progress.show();
                }
            });
        }
    });

## JSONデータの取得の例
JsonHttpResponseHandlerを使えばJSONObjectで取得できる。

    String url = "http://api.atnd.org/events/";
    RequestParams params = new RequestParams();
    params.put("twitter_id", "tomo_watanabe");
    params.put("format", "json");
                
    client.get(url, params, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(JSONObject json) {
                Log.i(TAG, "onSuccess: JSONObject");
                Log.i(TAG, json.toString());
            }                   
        });

## 画像のダウンロードの例
（このサンプルだと、onSuccess()のUIスレッドでBitmapデコードしてるので、あまり良くないとの指摘ありました）

    String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" };

    client.get("https://si0.twimg.com/profile_images/2298573260/j84ygij3d64npr5yzxt3.png", 
            new BinaryHttpResponseHandler(allowedContentTypes) {
        @Override
        public void onSuccess(byte[] fileData) {
            ImageView image = (ImageView)findViewById(R.id.imageView);
            Bitmap bitmap = BitmapFactory.decodeByteArray(fileData, 0, fileData.length);
            image.setImageBitmap(bitmap);
        }
    });

## 主要クラス図
![クラス図](https://lh3.googleusercontent.com/-o7h9dxc2IyQ/UECZQv-chHI/AAAAAAAADbs/vNqfKY2uMzY/w839-h409-p-k/647518180.png)
capistranoのrole一覧をsqliteを使って取得する

capistrano + chef-soloでのデプロイが最近よく見かける定番です。しかし、roleの一覧が deploy.rb の中にハードコーディングされてしまうのをなんとかしたいなと思っていました。

なぜならば、PHPやPythonを使ったプロジェクトでcapistranoを使ったときに、その情報を使って処理したいこと(管理用Webサイトなど)があるからです。そこで sqlite3でrole一覧を取得するコードを作ってみました。

``` ruby:deploy.rb
role :server, 'server1, 'server2'
```

のような deploy.rb に対して

``` ruby:deploy.rb
role(:server) do
  hosts = Array.new
  db = SQLite3::Database.new("serverlist.db")
  db.execute("SELECT name FROM serverlist WHERE role = 'server'") do |host|
    hosts.push(host[0])
  end
  db.close()
  hosts
end
```

のように書くことで serverlist テーブルに格納された role='server'である一覧を使うことができます。ちなみに serverlist テーブルの定義は以下です。

``` sql:
CREATE TABLE serverlist (
  name varchar(10),
  env  varchar(10),
  role varchar(10)
);
```

deploy.rb が長くなってしまうのが難点ですが。実は capistranoもrubyも初心者レベルですのでもっとよい方法があれば教えていただければありがたいですw
Heroku で rmagick を使う時の注意点。


下記のように Gemfile に require を明示してあげないといけない。

```
gem "rmagick", '~> 2.13.1', :require => 'RMagick'
```

stackoverflow に曰く

> require is CAsE SeNSITIvE

http://stackoverflow.com/questions/2572934/rmagick-rails-heroku

とのことで大文字小文字に気をつけろと。

OSXとかでは特に問題がないのに、heroku上ではエラーになるから気づきにくい。
Capybara で date_select の月を選択する


Rails の View で、 `date_select` のようなヘルパーを使って日付を選択する select ボックスを表示させているとします。「年」や「日」は文字列の数字を指定することで取得できますが、月にかんしては locale が英語なら "Aug" 、日本語なら "8月" のようになってしまい、テストコード内でどのように入力すべきか迷ってしまいます。（"8月" と日本語で入力してもテストを実行すると失敗してしまいます）

以下のように　`I18n.l` メソッドで Date クラスのインスタンスから月だけ取得して翻訳させればうまい具合に選択されます。

```ruby
select I18n.l(Date.today, format: '%B'), from: 'hoge[i3]'
```
faradayで証明書ストアにCA証明書を追加、Verify有効で自己署名を使う

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

連携するWEBAPIを開発する際、SSL/TLS部分には自己署名か自己CAで署名した証明書ペアを使う。

外部リソースの取得にfaradayを使う場合、証明書ストアを操作してVerifyを通過させる。

```
> require 'faraday'
> con = Faraday.new(url: "https://example.com")
> con.get

Faraday::Error::ConnectionFailed: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
from /Users/sawanoboriyu/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `connect'
```

無対策ではOSのストア(OSXのキーチェーン等)が使われて、`certificate verify failed`となる。

コネクション初期化時にCAのファイルを下記要領で指定すれば問題なく通信可能だ。

```
> con = Faraday.new(url: "https://ssl.example.com", ssl: {ca_file: "your_cacert.pem"})
> con.get
=> #<Faraday::Response:0x007ff66acd71d0
 @env=
  {:method=>:get,
   :body=>
    "<!DOCTYPE html>\n<html>…
-- snip --
```

HTTP関連のオプションはラップされているnet::httpにそのまま渡している。


証明書が複数必要なら一つのファイル内にすべて入れるか、ストアを使う。

```
> cert_store = OpenSSL::X509::Store.new
> cert_store.add_file("your_cacert.pem")
> con = Faraday.new(url: "https://ssl.example.com", ssl: {cert_store: cert_store})
> con.get
=> #<Faraday::Response:0x007ff66acd71d0
 @env=
  {:method=>:get,
   :body=>
    "<!DOCTYPE html>\n<html>…
-- snip --
```



クライアントの開発では、証明書の検証ができないという理由でVerifyを無効にすることがあるが、適当に構築したCAで発行した証明書をVerifyありで使っていく方がいい。
Xcode 4に付属しなくなったNetwork Link Conditionerなどをインストールする

Hardware IO Toolsという項目でXcodeから切り離されました。別途ダウンロードします。

- PacketLogger
- IORegistryExplorer
- Bluetooth Explorer
- Network Link Conditioner pane for System Preferences
  - (回線状況を設定できる。速度制限したり)

上記ツールが該当します。たぶんよく使われてたのはNetwork Link Conditioner([標準で付いてくる開発用ネットワーク帯域制限アプリ | Cocoaの日々情報局](http://cocoadays-info.blogspot.jp/2012/02/blog-post.html "標準で付いてくる開発用ネットワーク帯域制限アプリ | Cocoaの日々情報局"))。

Xcode->Open Developer Tools->More Developer Tools からウェブサイトを開くか以下URLからログインしてください。

https://developer.apple.com/downloads/index.action?name=Hardware%20IO%20Tools

** 参考
[xcode - Installing Apples Network Link Conditioner Tool - Stack Overflow](http://stackoverflow.com/questions/9659382/installing-apples-network-link-conditioner-tool "xcode - Installing Apples Network Link Conditioner Tool - Stack Overflow")
Rubyで使えるメソッドの一覧を取得する


```ruby
Class.methods #クラスのメソッド一覧

instance.instance_methods #クラスのインスタンスメソッド一覧

instance.public_methods #publicなメソッド一覧

instance.instance_public_methods #publicなインスタンスメソッド一覧

instance.methods(false) #継承したメソッドは含まない
```

メソッド一覧が:symbolの配列で返ってくる
Standards of network port numbers


社内サーバーにフルスタックの Node.js アプリを複数立ち上げる時に、ポート番号で迷ったのでメモ。

| ポート番号     | 役割                           |
|---------------|-------------------------------|
| `0-1023`      | Well-known                    |
| `1024-49512`  | Registered                    |
| `49513-65535` | Dynamic, private or ephemeral |

## Reference

* [List of TCP and UDP port numbers - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)
Launch Google Chrome with parameters in OS X


たぶん AppleScript でラップしてしまって、それ経由で起動するようにするのが Mac 的には正解だと思う。

```bash
open /Applications/Google\ Chrome.app --args --allow-file-access-from-files --enable-file-cookies
```

* [List of Chromium Command Line Switches « Peter Beverloo](http://peter.sh/experiments/chromium-command-line-switches/)
PHPで使うGoFパターン ひとり Advent Calendar - ブリッジ


ブリッジってなに?
--
橋ですね。継承の多用でカオスになってアレしてコピペしないためのパターンです。

でも、これ橋なのかなぁ? 
橋ではなくてコマンドなんじゃないのかなぁ?

考え方としてはテンプレートメソッドの抽象メソッド部分を差し替え可能な振舞オブジェクトに移譲するということです。つまり、テンプレートメソッドとコマンドパターンとステートの隠し子みたいなものです。

ブリッジの構造
--

* ブリッジクラス - 具体的な事柄を表現するクラス
* 実装クラス - 差し替え可能なロジックを表現するクラス

例えば、渡された引数を元にSQL文を自動生成するようなクラスが有ったとします。SQL文にはDBMS毎に微妙な構文の違いがあったりします。この時、ブリッジパターンを適用すると以下のようになります。

* SQL文を自動生成するクラス - ブリッジクラス
* DBMS毎のSQL文を生成するクラス - 実装クラス

このSQL文を自動生成するクラスを継承してDAOとORマッパーを作ったとします。運用の中で対応するDBMSが増えても、実装クラスさえ差し替えてしまえばDAOもORマッパーも何も気にすることなく利用することが出来ます。もし、ここでブリッジパターンを適用せずにDBMSごとのクラスを作っていた場合、DAO、ORマッパー共によく似たクラスをコピペで作る必要が生まれてしまいますね。

ここまで具体的な例を使って説明しておきながら、サンプルコードはサンプルコードらしいサンプルコードにしてしまいます。例が大仰過ぎたので仕方ないのです。

```
<?php
class BridgeSample {
  private $_Impl = null;

  public function __construct ( $impl ) {
    if ( !( $impl instanceof IImplement ) )
      throw new Exception ( '無理っす' );
    $this->_Impl = $impl;
  }

  public function doMethod () {
    return $this->_Impl->doMethod ();
  }
}

class Subclass1 extends BridgeSample {}
class Subclass1_2 extends Subclass1 {}
class Subclass2 extends BridgeSample {}
class Subclass2_2 extends Subclass2 {}

interface IImplement {
  public function doMethod ();
}

class ImpleSample1 {
  public function doMethod () {
    return "実装1";
  }
}

class ImpleSample2 {
  public function doMethod () {
    return "実装2";
  }
}

$parent = new BridgeSample ( new ImpleSample2 () );
say ( $parent->doMethod() == '実装2' ? "OK" : "NG" );
$subclass1 = new Subclass1 ( new ImpleSample1 () );
say ( $subclass1->doMethod() == '実装1' ? "OK" : "NG" );
```

この例なら、大まかな処理の流れについては、BridgeSampleさえ修正・追記すればSubclass達に反映されるし細かい差分については実装クラスを修正したり、増やしたりすれば何とかなっていきます。

実際どうなの?
--
メリットが大きくメリットの想像がし易いパターンであるにも関わらず、適用すべきポイントは「あとの祭」になってから気付くことの方が多いです(僕だけかも知れないけど) フレームワークの設計とかなら、割と最初期に適用ポイントを見付けられるかも知れませんが、アプリ内では、「ええーッやっぱりそうだったのー」みたいにならないように、クラス設計時にクラス図を意地になって眺めて適用ポイントを見付けましょう。


注意
--
また、Bridgeに相当するクラスのメソッド内で複雑なことをやらせると、融通効かなくなってしまいサブクラスでオーバーライドしてその場しのぎしたりすることになったりして、そのサブクラスを継承したクラスが動かなくなったりして収拾付かなくなります。ご利用は計画的に。

併用すべきパターン
--
ずばりアブストラクトファクトリです。インタンスの生成が複雑になり易いのもそうですが、実装オブジェクトのセットを隠蔽してまとめておくと実装オブジェクトを追加した等の時に修正が容易になります。
MySQLで書いてあるDBをNode.jsから利用する

事務所のMySQLで書いてあるDBをNode.jsで利用しようと思って、今日は
node-mysql https://github.com/felixge/node-mysql
を使ってみました、の巻。

#インストール

node-mysqlのREADMEには、npm install mysql@2.0.0-alpha3 と書いてありますが、 試しに npm install mysql とやると mysql@0.9.6 が入ってしまいます。

でも、-alpha3って微妙に嫌だなぁ、と思いつつnpm install mysql@2とするとやっぱり mysql@2.0.0-alpha3が入るのでした。まいっか。

```
npm install mysql@2
```

#コードを書く

今日は、今使ってるDBへのアクセスだけなのでとりあえずこんな感じ。

  データベース piyo_db
  テーブル     piyotable 

このMySQLテーブルのUserNO が '012345678' なデータを取り出しconsole.logで出力してみます。

```
var mysql = require('mysql');

var connection = mysql.createConnection({
  host     : 'localhost', //接続先ホスト
  user     : 'hoge',      //ユーザー名
  password : 'piyopiyo',  //パスワード
  database : 'piyo_db'    //DB名
});

//SQL文を書く
var sql = 'SELECT * FROM piyotable WHERE UserNO = ?;';
//プレースホルダに差し込むデータ
var userId = '012345678';

//接続します
connection.connect();

//プレースホルダー使ってSQL発行
var query = connection.query(sql, [userId]);

//あとはイベント発生したらそれぞれよろしくねっ
query
  //エラー用
  .on('error', function(err) {
    console.log('err is: ', err );
  })
  
  //結果用
  .on('result', function(rows) {
    console.log('The res is: ', rows );
  })
  
  //終わったよう～
  .on('end', function() {
    console.log('end');
    connection.destroy(); //終了
  });
```

#こんな結果になりました

```
$ node /home/hoge/mysqltest.js
The res is:  { ID: 1435,
  UserNO: '012345678',
  usedtime: '2012/08/29 14:52:50',
  data: 'OK(^^)/',
  uptime: '2012/08/29 18:00:16' }
end
```

というわけで、これは特に問題なく動作しました。

#文字コードの件を別途調べる

でも、Node.jsはutf-8推奨なわけです。その世界では問題なくても、日本には結構古い文字コードも頑固に生き残っています。うちの事務所にもあります。

で、実は今回は当初、sjis-winを使ってる古いデータベースから取ってこようとしたのです。そして見事に文字化けしてしまいました。

そこで、これまで普通のEUCのページを取ってくるのに成功しているnode-iconvで乗り切ろうと思ったのだけれど、これが、当然最近の日本のパッチ( http://www2d.biglobe.ne.jp/~msyk/software/libiconv-patch.html )などがあたってるというわけでもないようでなかなかうまくいかない。

ということで、急遽、node-iconvについても少し調べてみることにしました。

これです。

node-iconvで使える文字コードを調べてみた
http://qiita.com/items/3cf99d91d3784f5a47c4
Quine(クワイン、自己言及プログラム)

実行すると自分自身を出力するプログラム。
やっていることは単純。

```c#:Program.cs
using System;

class Program
{
    static void Main()
    {
        Func<int, string> str = x => Convert.ToString((char)x);
        var p = @"using System;

class Program
{
    static void Main()
    {
        Func<int, string> str = x => Convert.ToString((char)x);
        var p = ?;
        Console.Write(p.Replace(str(63), str(64) + str(34) + p + str(34)));
    }
}
";
        Console.Write(p.Replace(str(63), str(64) + str(34) + p + str(34)));
    }
}
```
Rails で Twitter の OAuth API を試す


Consumer 側の実装メモ。

```test_controller.rb

class TestController < ApplicationController

  def oauth_consumer
    @oauth_consumer ||= OAuth::Consumer.new(
      ENV["CONSUMER_KEY"],
      ENV["CONSUMER_SECRET"],
      :site => "http://twitter.com"
    )
  end

  def timeline
    access_token = OAuth::AccessToken.new(
      oauth_consumer,
      session[:access_token],
      session[:access_token_secret]
    )
    @response = access_token.get('https://api.twitter.com/1/statuses/home_timeline.json')
  end

  def sample_auth
    request_token = OAuth::RequestToken.new(
      oauth_consumer,
      session[:request_token],                                                                  
      session[:request_token_secret]                                                            
    ) 
    @access_token = request_token.get_access_token(                                           
      {},
      :oauth_verifier => params[:oauth_verifier],                                             
      :oauth_token => params[:oauth_token]                                                    
    )
    session[:access_token] = @access_token.token                                                
    session[:access_token_secret] = @access_token.secret
  end

  def sample_request
    request_token = oauth_consumer.get_request_token(
      :oauth_callback => "http://example.com/test/sample_auth"
    )
    session[:request_token] = request_token.token
    session[:request_token_secret] = request_token.secret
    @auth_url = "https://api.twitter.com/oauth/authorize?oauth_token=#{request_token.token}"
  end

end

```

途中 401 Unauthorized の返されてる理由が判らなくて地味に苦労した…
パーティションを切ったりする

以下のような構成で（Windows7とArch Linuxのデュアルブート）

```
/dev/sda1 プライマリパーティション１
/dev/sda2 〃２
/dev/sda3 〃３
/dev/sda4 拡張パーティション
/dev/sda5 論理パーティション１（データ用）
/dev/sda6 論理パーティション２（Arch Linux本体）
```

/dev/sda5を少し削ってパーティションを増やしたときのメモ。

## パーティションを切ってフォーマットする
全部Arch Linux上で作業しようと思ったが、GNU Partedでパーティションのリサイズができないようだったので（昔のバージョンではできていたようだ）、以前に経験のあったWindows7上でやることにした。

Windows7ではスタートメニュー→コンピュータを右クリック→管理でそれっぽい画面が出てくるので、それで適当に切る。このツールは結構便利だと思う。

次に切ったパーティションをフォーマットする。たぶんWindows 7でもできたのかもしれないけど、何も考えずにフォーマットしたらfat32とかになってたのでArch Linuxでext3にフォーマットしなおした。このとき使ったツールはgparted（GUIのほうがなんとなくやりやすかった……）で、kde上では`sudo gparted`で起動できないことがあるので`gksu gparted`もしくは`gksudo gparted`で起動する。これも適当にフォーマットできる。

ここまでで次のような構成になる

```
/dev/sda1 プライマリパーティション１
/dev/sda2 〃２
/dev/sda3 〃３
/dev/sda4 拡張パーティション
/dev/sda5 論理パーティション１（データ用）
/dev/sda7 論理パーティション３（新しく作ったやつ）
/dev/sda6 論理パーティション２（Arch Linux本体）
```

順番がおかしくなってるので、`# fdisk -l /dev/sda`とかで文句を言われてしまう。これはfdiskで適正な順序に直すことができる。

```
$ sudo fdisk /dev/sda/
x （上級者コマンドモード）
f （適正な順序にする）
w （変更を書き込む）
```

すると次のようになる

```
/dev/sda1 プライマリパーティション１
/dev/sda2 〃２
/dev/sda3 〃３
/dev/sda4 拡張パーティション
/dev/sda5 論理パーティション１（データ用）
/dev/sda6 論理パーティション２（新しく作ったやつ）
/dev/sda7 論理パーティション３（Arch Linux本体）
```

## grubの書き換え
ところで、この環境ではArch Linux上のブートローダを使っていたので、このままではブートできない（MBRがGRUBを探せないため）。なので、MBRを書き換える。MBRの書き換えにはgrub-installを使うが、パーティション構成が変更されたままの状態で実行すると"The file /boot/grub/stage1 not read correctly."というようなエラーになってしまう。これは実際のパーティション構成と/etc/fstabや/etc/mstabの内容が矛盾しているためであるらしい（[参考](http://www15.big.or.jp/~yamamori/sun/rescue/grub.html)）。これを解消するために/etc/fstabを正しく書き直し、/etc/mstabを削除してから`mount -f /`を実行して/etc/mstabを再作成するとよいらしい。

/boot/grub/menu.lstも書き換える必要がある。パーティションが一つずれたので

```
# (0) Arch Linux
title  Arch Linux
root   (hd0,5)
kernel /boot/vmlinuz-linux root=/dev/sda6 ro
initrd /boot/initramfs-linux.img
```

となっていたのを

```
# (0) Arch Linux
title  Arch Linux
root   (hd0,6)
kernel /boot/vmlinuz-linux root=/dev/sda7 ro
initrd /boot/initramfs-linux.img
```

に書き換える。最後に`sudo grub-install /dev/sda`とコマンドを打てばよい（この場合は該当しないが、/と/bootが違うパーティションならば`sudo grub-install --root-directory=/ /dev/hda`とする必要がある）。再起動して問題なければ成功です。

## 起動しないとき
作業中grub-installを忘れてしまい、MBRがGRUBに辿りつけずまったく起動できなくなってしまった。Arch Linuxのインストール用のイメージを突っ込んであるUSBがまだあったので、それを使ってUSBブートし、パーティションを消したりmenu.lstを書き換えたりとかいうことをしました。
Android-query(AQuery)でのAJAXの実装例


##Android-Queryとは
Androidでよく使われる実装をライブラリとして提供している。jQueryに対してAQueryという名前が付いているように、idタグの書き方を簡素化したり、ajaxの実装が簡単になっている。jQueryのようにメソッドチェーンが使える。リファレンスは[ここ](http://code.google.com/p/android-query/)

##AQueryの使い方
[ここ](http://code.google.com/p/android-query/)からjarのライブラリをダウンロードし、Androidプロジェクトのlibsフォルダに入れればOK

##idの記述の簡素化とAjaxのサンプル
いわゆるAsyncTaskを更に簡単に実装できるようになっている。
下記のコードはAQueryを使って、idタグの取得

	findViewById(R.id.async).onClickListener　
句を簡易的に記述できる


    private AQuery mAq;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		// AQueryの宣言
        mAq = new AQuery(this);
		// AQueryを使ってタグ記述を簡単に
        mAq.id(R.id.async).clicked(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
				// Ajaxの関数  
				asyncJson();
            }
        });
    }


そしてAjaxの関数の方はこんな感じ

    private void asyncJson() {

        final String url = "http://api.atnd.org/events/?twitter_id=tomo_watanabe&format=json";
        final ProgressDialog progress = new ProgressDialog(this);
        progress.setTitle("タイトル");
        progress.setMessage("メッセージ");

		// プログレスダイアログも設定可能
		// 非同期でURLにアクセスし、結果取得後にコールバックが呼ばれる
        mAq.progress(progress).ajax(url, JSONObject.class, new AjaxCallback<JSONObject>() {
            @Override
            public void callback(String url, JSONObject json, AjaxStatus status) {
                if (json != null) {
                    Log.i(TAG, "JSON: " + json.toString());

                    // successful ajax call, show status code and json content
                    Toast.makeText(mAq.getContext(), status.getCode() + ":" + json.toString(),
                            Toast.LENGTH_LONG).show();

                } else {
                    // ajax error, show error code
                    Toast.makeText(mAq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG)
                            .show();
                }
            }
        });
    }

ちょっとした非同期実装で、AsyncTaskを使うのが面倒な場合などには結構便利
Node.js + Socket.IOのサーバの基本構成と、Android版のSocket.IOクライアントのサンプル


とりあえずコードはよ。って方は[github](https://github.com/tomovwgti/Android-SocketIO)

##何が出来るの？

Androidアプリとブラウザでリアルタイム双方向通信のサンプルです。要はチャットアプリです。サーバは受信データをブロードキャストするようにしています。

　非常に簡単なサンプルですが、ブラウザクライアントとAndroidアプリの工夫次第で、色々な実験やプロトタイピングが出来ると思います

**画面サンプル（自機の送ったものは表示されない）**

**ブラウザの画面**
![ブラウザの画面](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tomo_watanabe/20120820/20120820231433.png)
**Androidの画面**
![Androidの画面](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tomo_watanabe/20120820/20120820231423.png) 



##実装
###サーバ

[ここ](http://d.hatena.ne.jp/replication/20111108/1320762287)を参考にして構築しました。 動作確認したバージョンは以下になります。

- 環境はMac Mountain Lion
- nvmとnpmを使用
- Node.js : v0.6.6/v0.8.7
- Socket.IO : v0.9.10
- express 3.0.0rc3

Node.jsについてはv0.8系からは、Macの場合Xcodeがインストールされている必要があるようです。expressはそのままインストールすると最新版の3系がインストールされます。2系でインストールしたい場合は

```
$ npm install -g express@2
```

とするようです（[ここ](http://creator.cotapon.org/articles/node-js/【node-js】expressでejsがインストール出来ない対処法)を参照）。なお、express2とexpress3ではapp.jsの記述方法など変更されているので注意して下さい。

###Android

Android側ですが[ここ](https://github.com/Gottox/socket.io-java-client)を参考にして作成しました。SDKはv16をターゲットとしていますが、android-support-v4ライブラリを使っていますので、そこそこの端末で動作すると思います。練習のためFragmentを使ってSocket.IOのロジック部分は、UI無しのFragmentに分けてありますがコードがやや複雑になってしまいました...もっとSocket.IOの理解が深まれば簡易的な実装にできると思いますが、とりあえず現状で公開しています。

このコードをベースに利用する場合

- io.socketパッケージ以下をそのまま使えます（ライブラリ化してもOK）
- libsのweberknecht.jarが必要です
- JSONのパースにJSONICを使用していますが、ここは自由に...

##まとめ
Node.js + Socket.IOを使ってプロトタイピングすると、ブラウザ、サーバ、モバイル、ハードと様々なものを双方向リアルタイム連携できるようになります。
vimでヤンク(コピー)した文字での連続置き換え

相変わらずvim弱なfukajunです。
ちょっとニッチな編集方法の紹介
正直この方法はながらく探し続けた方法の一つです。
それは、ヤンク(コピー)したものを、連続して別の単語と置き換える方法で、
置換を使うにも対象が一定でないというときに便利です。
ちょっと説明が難しいけど次の場合だと
hogeとhageとhoogeの3種類をすべてmogeに変更したい
そんなときに、割と便利なテクニックだと思っている。

```
1 def write
2   moge = ""
3   hoge += 'moge'
4   puts hage
5   puts hooge + hoge
6 end
```
1. 2行目のmogeをyank 例えばmの位置でyw
1. 3行目のhogeのhに移動して cwで、削除しつつ編集モードへ
1. 編集モードのまま Ctrl + r そして 0(0番目のレジスタをput)
1. 編集モード抜ける esc または ctrl + [
1. 4行目のhageにhに移動し . (ドット <- さっきの動作の繰り返し)
1. 同様に5行目のhoogeのhに移動し .
1. 同様に5行目のhogeのhに移動し .


なかなか状況的なかなか無いので、便利さを伝えにくいけど
便利さを伝えたいので会ったときは気軽に聞いてください。
では、Good cooking!
※この手順では、単語のみを対象にしてるけど、visualモードで選択して
任意の範囲を連続的にヤンクしたものと置き換えれるような方法を探してます。
もし便利な方法を御存知の方は教えてください。
iPhone/iPadでもデータをGrid表示する方法


iPhoneでデータを一覧表示する場合UITableViewを使うのが一般的だと思います。
でも項目数が多いとカスタムセルを作らなくちゃいけないし、
カスタムセル内のラベルの位置とかいちいち調整しなくてちゃならないし…めんどくさいです。
PC用やWeb用のGUIライブラリには大抵用意されていたGridなんちゃらというアレが欲しい！
ということで作ってみました。

## Grid表示ViewControllerを作成
Grid表示機能はGridTableVCというViewControllerとして定義されています。
これをrootViewControllerなどにセットして利用します。

```Objective-C:
GridTableVC *vc = [[GridTableVC alloc] init];
self.window.rootViewController = vc;
[vc release];
```

## データを用意する
データは配列で、各要素はどんなクラスでも対応可能です。
ここではname,mamil,memoなどのプロパティを持つUserというクラスが定義されているものとして例を書いています。

```Objective-C:
NSMutableArray *rows = [[NSMutableArray alloc] init];
[rows addObject:[[[User alloc] initWithName:@"山田太郎" mail:@"yamada1@example.com" phone:@"09011110001" memo:@"テスト"] autorelease]];
[rows addObject:[[[User alloc] initWithName:@"山田二郎" mail:@"yamada2@example.com" phone:@"09011110002" memo:@"テスト"] autorelease]];
[rows addObject:[[[User alloc] initWithName:@"山田三郎" mail:@"yamada3@example.com" phone:@"09011110003" memo:@"テスト"] autorelease]];
vc.rows = rows;
[rows release];
```

## 列情報を定義する
列情報はGridに表示する各列に関する情報で、GridColumnというクラスが定義されています。
propertyNameはモデルクラスのプロパティ名、headerTextは列ヘッダに表示するテキスト、widthは列の幅になります。
colsに列情報の配列を指定しますが、配列の先頭が一番左の列として扱われます。

```Objective-C:
NSMutableArray *cols = [[NSMutableArray alloc] init];
[cols addObject:[[[GridColumn alloc] initWithPropertyName:@"name" headerText:@"名前" width:150] autorelease]];
[cols addObject:[[[GridColumn alloc] initWithPropertyName:@"mail" headerText:@"メールアドレス" width:300] autorelease]];
[cols addObject:[[[GridColumn alloc] initWithPropertyName:@"phone" headerText:@"電話番号" width:150] autorelease]];
vc.cols = cols;
[cols release];
```

以上の手順でこのように表示されます。

![Screenshot](https://raw.github.com/yuch/GridTable/master/screenshot/sample.png)

## レンダラーで表示内容をカスタマイズ

さらにGridTableVCは3種類のカスタムレンダラー機能があるので、もうちょっと表示内容を工夫することもできます。
TextRendererは表示する文字列自体の加工、LabelRendererは文字列の見た目の加工、RowRendererは行全体の加工ができます。

```Objective-C:TextRenderer
col.textRenderer = ^(NSObject *val) {
	NSString *valStr = (NSString*)val;
	NSString *part1 = [valStr substringWithRange:NSMakeRange(0, 3)];
	NSString *part2 = [valStr substringWithRange:NSMakeRange(3, 4)];
	NSString *part3 = [valStr substringWithRange:NSMakeRange(7, 4)];
	return [NSString stringWithFormat:@"%@-%@-%@", part1, part2, part3];
};
```

```Objective-C:LabelRenderer
col.labelRenderer = ^(UILabel *label, NSObject *val) {
	NSString *valStr = (NSString*)val;
	if ([valStr hasPrefix:@"080"]) {
		label.textColor = [UIColor redColor];
	}
};
```

```Objective-C:RowRenderer
vc.rowRenderer = ^(UITableViewCell *cell, int rowIndex) {
	if (rowIndex % 2 == 1) {
		cell.contentView.backgroundColor = [UIColor colorWithRed:0.9 green:1.0 blue:1.0 alpha:1];
	}
};
```

以上の3つのレンダラーを設定するとこんな感じになります。

![Screenshot](https://raw.github.com/yuch/GridTable/master/screenshot/sample2.png)

## まとめ

あと列ヘッダをタップするとその列でソートすることができます。
同じ列ヘッダをタップすると昇順/降順ソートが切り替わります。

ソースはGitHubに公開しているのでご自由にどうぞ
https://github.com/yuch/GridTable

まだまだ未完成ですがちょいちょい更新していきたいと思います。
要望＆プルリクエストお待ちしております。
Console.WriteLineのオーバーロード

戒めのためにメモ。

Console.WriteLine()のオーバーロードの中には、引数の中に format 付きの物があったのですね。
 
```csharp
Console.WriteLine(string format, object arg0)
Console.WriteLine(string format, object arg0, object arg1)
Console.WriteLine(string format, object arg0, object arg1, object arg2)
Console.WriteLine(string format, object arg0, object arg1, object arg2, object arg3)
Console.WriteLine(string format, params object[] arg)
```

いままでこんなかんじで書いてましたが、String.Format() とか不要だったとは！

```csharp
//どちらも同じ結果
//Console.WriteLine(String.Format("Sum={0}",Sum(1,2,3,4,5)));
Console.WriteLine("Sum={0}",Sum(1,2,3,4,5));
```
Javaでtemplateを作るツールを作ってみた。


さくっとテンプレートの書き出しをしたかったのと、Javaの勉強中なのでJavaでツールを作ってみた。

```java
import java.io.*;

class CreateTmpl {
    public static void main(String args[]) {

        if (args[0] == null) {
            return;
        }

        String curPath  = System.getProperty("user.dir");
        String tmplPath = System.getProperty("user.home") + "/java-tmpl/" + args[0];

        File file = new File(tmplPath);
        File[] files = file.listFiles();
        for (int i = 0; i < files.length; i++) {
            fileCreate(files[i], ".");
        }
    }

    private static void fileCreate(File file, String path) {

        if (file.isDirectory()) {
            File[] files = file.listFiles();
            path += "/" + file.getName();

            File dir = new File(path);
            dir.mkdir();

            System.out.println("Create a dir : " + path);

            for (int i = 0; i < files.length; i++) {
                fileCreate(files[i], path);
            }
        }
        else {
            try {
                path += "/" + file.getName();

                FileReader filereader = new FileReader(file);
                BufferedReader br = new BufferedReader(filereader);
                File newFile = new File(path);

                newFile.createNewFile();

                System.out.println("Create a file: " + path);

                FileWriter filewriter = new FileWriter(newFile);
                BufferedWriter bw = new BufferedWriter(filewriter);
                String line;

                while ((line = br.readLine()) != null) {
                    bw.write(line);
                    bw.newLine();
                }

                br.close();
                bw.close();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

```

Javaで作ったものをラップしたshell script

```shell
#!/bin/sh

export CLASSPATH="$HOME/MyDesktop/Java/io-sample"

if [ -z $1 ]; then
    echo "No arguments. Input template name."
else
    java CreateTmpl $1
fi
```
C#で可変長引数を使うには params

よく忘れるのでメモ。

可変長引数 を使用するには、params キーワードを使います。
LinqのSum()メソッドを使っているので、サンプルにあまり意味ありませんが。

```csharp:SampleParams.cs
using System;
using System.Linq;

namespace SampleParams
{
	class Program
	{
		public static void Main(string[] args)
		{
			Console.WriteLine("Sum={0}",Sum(1,2,3,4,5));
			Console.ReadKey(true);
		}
		
		public static int Sum(params int [] values)
		{
			return values.Sum();
		}
	}
} 
```
「Sublime Text 2で全角スペースをハイライト表示するプラグインを作る」に設定でオンオフ出来るようにしてみた。


このプラグイン自体は以下のに設定でオンオフ切り替えれるようにしたものです。textの編集でいちいちハイライトされるのもなーというのがあったので。

>Sublime Text 2で全角スペースをハイライト表示するプラグインを作る http://qiita.com/items/865e1a6605b1146d4341

まぁそこまで難しい話でもなく、`FullPitchWhiteSpaceHighlightListener`クラスの`highlight_fullpitch_spaces`メソッドにifとか追加して以下の様にしただけ。

```python:FullPitchWhiteSpaceHighlight.py
class FullPitchWhiteSpaceHighlightListener(sublime_plugin.EventListener):
    # highlight full-pitch white spaces
    def highlight_fullpitch_spaces(self, view):
        if view.settings().get('fullwhitespace_viewable') == True:
            view.add_regions('FullPitchWhiteSpaceHighlight',
                             view.find_all(u'　+'),
                             "entity.name.class",
                             sublime.DRAW_OUTLINED)
        else:
            view.erase_regions('FullPitchWhiteSpaceHighlight')
```

`view.settings().get('fullwhitespace_viewable', True)`でfullwhitespace_viewableな設定を取ってくる感じですね。
無かったらgetの第二引数の値が帰ってきます。
設定ファイルに以下の様に書けばオンオフ切り替え可能に。

```JSON:hoge.sublime-settings
{
	…
	"fullwhitespace_viewable" : True,
	//"fullwhitespace_viewable" : Flase,
	…
}

```
そんな感じ。
CancellationSignalで処理を中断する。

JellyBean以降、CancellationSignalに対応したContentProviderであれば、
データベースへのクエリ要求を中断することができます。
詳細：http://yuki312.blogspot.jp/2012/08/androidcancellationsignal.html

```java
mCancelSignal = new CancellationSignal();
Cursor cursor = getContentResolver().query(
        Uri.parse("content://yuki.mycontentprovider"),
        new String[] { "_id" }, null, null, null, mCancelSignal);
```

CancellationSignalはデータベースへのクエリを中断するためだけのものではなく、
より抽象的に"処理の中断要求"を表現したクラスです。
CancellationSignalを用いた独自のキャンセル処理の実装も可能です。
エラトステネスの篩 （Scheme 版）

以前、Scheme で「Project Euler」を解いていた時に使っていたものです。
（もともとは "Chez Scheme" 用でしたが、"Gauche" 用に改変しました）

```prime-list.scm
(use srfi-1)

(define prime-list
  (lambda (n)

    (define get-num
      (lambda (m)
        (quotient (- n 1) 2)))

    (if [= n 2]
        '(2)
        ;; エラトステネスの篩
        (let* ([p-vct (list->vector (cons 0 (iota (get-num n) 3 2)))]
               ;; p-vct = #(0 3 5 7 ...)
               [size (vector-length p-vct)]
               [max (sqrt n)])
          (let loop1 ([i 1])
            (let ([j (vector-ref p-vct i)])
              (cond
                ([zero? j] (loop1 (+ i 1)))
                ([> j max] (cons 2 (remove! zero? (vector->list p-vct))))
                (else
                  (let loop2 ([k (* 2 i (+ i 1))])
                    (if [>= k size]
                        (loop1 (+ i 1))
                        (begin (vector-set! p-vct k 0)
                               (loop2 (+ j k)))))))))))))
```

私の環境では、n = 1000000 の場合、約0.5秒かかりました。
シェルスクリプトのif文とtestコマンド基礎

いつもなんとなく使ってて、あれどうだっけと検索して

[if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス](http://shellscript.sunone.me/if_and_test.html)

このページにたどり着いて「ああそうだった」となるので、自分でまとめておく。

条件判定にはよく"test"コマンドを使う。testは与えられた条件式の評価結果に応じて0もしくは1を返すコマンド。ファイル形式やパーミッションを判定に使うことができる（man test）が、単純にファイルの存在をみる-eオプションで例を書く。

~~~~~~~~~~~~~~~~~~
$ test -e /etc/init.d/syslog-ng; echo $?
0
$ test -e /etc/init.d/hahahaha; echo $?
1
~~~~~~~~~~~~~~~~~~

$?の中に直前のtestコマンドのステータスコードが入ってる。
そして、[と]はtestコマンドのaliasである。


~~~~~~~~~~~~~~~~~~
$ [ -e /etc/init.d/syslog-ng ]; echo $?
0
$ [ -e /etc/init.d/hahahaha ]; echo $?
1
~~~~~~~~~~~~~~~~~~

[と]はコマンドなのでスペースを空けないといけない。

~~~~~~~~~~~~~~~~~~
$ [-e /etc/init.d/syslog-ng]; echo $?
-bash: [-e: コマンドが見つかりません
127
~~~~~~~~~~~~~~~~~~

if文と組み合わせる

~~~~~~~~~~~~~~~~~~
$ if true ; then echo "ok"; else echo "ng"; fi
ok
$ if false ; then echo "ok"; else echo "ng"; fi
ng
~~~~~~~~~~~~~~~~~~

true/falseはそれぞれ終了ステータスとして0/1を返す"だけ"のコマンド。

~~~~~~~~~~~~~~~~~~
$ if [ -e /etc/init.d/syslog-ng ] ; then echo "ok"; else echo "ng"; fi
ok
$ if [ -e /etc/init.d/hahaha ] ; then echo "ok"; else echo "ng"; fi
ng
~~~~~~~~~~~~~~~~~~
Jasmineに用意されている評価メソッド一覧


```javascript
toBe
toBeCloseTo
toBeDefined
toBeFalsy
toBeGreaterThan
toBeLessThan
toBeNull
toBeTruthy
toBeUndefined
toContain
toEqual
toHaveBeenCalled
toHaveBeenCalledWith
toMatch
toNotBe
toNotContain
toNotEqual
toNotMatch
toThrow
wasCalled
wasCalledWith
wasNotCalled
wasNotCalledWith
```
hub pull-request 失敗時にさっき書いた description を復元する


`.git/PULLREQ_EDITMSG` に直前のものが保存されているのでそれをコピる。コピる前に pull-request を実行してしまうと上書きされるので注意。

(Pull Request メッセージを $EDITOR で開く設定にしている場合の話です)

## 1. Pull Request コメントを書いたが書式が間違っている
![1](http://30d.jp/img/kyanny/public/42155bf6-f25d-11e1-9714-00262d09affa_original.jpg)

## 2. なので Pull Request に失敗してしまうが…
![2](http://30d.jp/img/kyanny/public/42323c30-f25d-11e1-8cff-00262d0af68e_original.jpg)

## 3. .git/PULLREQ_EDITMSG に残っていて助かった！
![3](http://30d.jp/img/kyanny/public/41f73b80-f25d-11e1-a66b-00262d0af68e_original.jpg)
インスタンス変数に外からアクセスするメソッドを簡単に書く

その２
インスタンス変数に外からアクセスするメソッドを簡単に書く
attr_accessor インスタンス変数名のシンボル

```ruby
class AClass
def initialize
  @foo
  @bar
end

attr_accesor :foo,:bar
end

instance = AClass.new
instance.foo = 1
instance.bar = "bar"
```
ActiveRecord :binary type のカラムを psql でテキストに変換して見る

アップロードしたファイルを保存したい場合などはエンコーディングの問題のない binary (postgresql だと bytea) で保存するといいのですが、psql コマンドから中身をテキストとして見たい場合には

```sql
SELECT encode(bin,'escape') FROM t;
```
Perl 6 で逆ポ

http://qiita.com/items/da7960c9ac1a15882ce2 に触発されて Perl 6 で逆ポーランド記法の計算機を書いた。オーソドックスに grammar を使っている。

```perl
use v6;

grammar RPN {
   rule TOP { ^ [ <num> | <op> ]+ $ }
   token num { <[\d.]>+ }
   token op { < + - * / > }
}

sub rpn($rpn) {
    RPN.parse($rpn, actions => class {
        my @s;
        method TOP($/) { make @s.pop }
        method num($/) { @s.push: +$/ }
        method op($/) { @s.push: +&::("infix:<$/>")(|[@s.pop, @s.pop].reverse) }
    }).ast;
}

my $s = "
1 -> 1
1 2 + -> 3
3 1 - -> 2
10 2 / -> 5
2 5 8 + + -> 15
2 5 8 + * -> 26
2 5 8 * + -> 42
1 2 + 3 4 + * -> 21
2 3 * 4 5 * + -> 26
";

for $s.trim.lines {
    $_ ~~ /(.+) ' -> ' (.+)/;
    my $r = rpn(~$0);
    say ($r == $1 ?? 'ok' !! 'fail') ~ ": $0 -> $r";
}

```
std::bind で参照を束縛する

嵌ったのでメモ．std::bindで何も考えずに参照を引数に取る関数を束縛すると値渡しになってしまう．

```c++
#include <iostream>
#include <functional>

void f(int& x) { x = 42; }  // 参照を引数に取る

int main() {
  int x = 0;
  auto g = std::bind(f, x);
  g();                          // ここで x = 42 となって欲しい
  std::cout << x << std::endl;  // 0 が出力される
}
```

std::ref を使うと上手く動く．

```c++
#include <iostream>
#include <functional>

void f(int& x) { x = 42; }

int main() {
  int x = 0;
  auto g = std::bind(f, std::ref(x));
  g();
  std::cout << x << std::endl;  // 42 が出力される
}
```
指定時間内に関数が終了しなかったら何かするデコレータ

昨日投稿したTipsの改良版です。通知する部分をハンドラ関数を渡すようにして分離し任意の処理を行えるようにしました。

また、@methaneさんに教えていただいた functools.wrap を使ってみました。このデコレータがついた関数をpaverの@taskにもしてみたのですがヘルプがNoneとなり docstring が表示されなかったのはこれを使っていなかったからのようでした！(functools.wrapを使うとヘルプにdocstringが表示されました)

``` python:timeout.py
from functools import wraps

def on_timeout(limit, handler, hint=None):
    '''                                                                                                    
    指定した実行時間に終了しなかった場合、handlerをhint/limitを引数にして呼び出します                
    @on_timeout(limit=3600, handler=notify_func, hint=u'長い計算')                                         
    def long_time_function():                                                                              
    '''
    def notify_handler(signum, frame):
        handler("'%s' is not finished in %d second(s)." % (hint, limit))

    def __decorator(function):
        def __wrapper(*args, **kwargs):
            import signal
            signal.signal(signal.SIGALRM, notify_handler)
            signal.alarm(limit)
            result = function(*args, **kwargs)
            signal.alarm(0)
            return result
        return wraps(function)(__wrapper)
    return __decorator
```

実際の使い方は以下のような感じです

``` python:main.py

from timeout import on_timeout

def handler_func(msg):
    print msg # 実際は適切な通知処理を行う

@on_timeout(limit=1, handler=handler_func, hint=u'長い計算')
def long_time_function():
    import time
    time.sleep (2)

if __name__ == "__main__":
    long_time_function()
 
```

これ実行すると limit が1秒にも関わらず処理が sleep(2) しているため1秒経過時点でhandler_funcが呼ばれ、以下のような表示になります。

```
'長い計算' is not finished in 1 second(s).
```

これで AWS 以外でも応用できそうです。
rubyで逆ポ

http://d.hatena.ne.jp/torazuka/20120829/stackmachine
を読んで、ruby で逆ポを書いてみた。
最初は普通にやろうと思っていたんだが、書き始めてから正規表現で解決するという作戦に変更。
perl6 なら正規表現による置換一発でかけるのかもしれないなんて思いつつ、perl6 のことは全く知らないのでわからない。

```ruby:rpn.rb
#!ruby

def rpn( s )
  return s if /\A[\d\.]+\Z/=~s
  raise "FAIL : #{s}" unless /([\d\.]+)\s+([\d\.]+)\s+([^\d\.\s]+)/=~s
  a, b=[$1,$2].map( &:to_f )
  r=case $3
    when '+'
      a+b
    when '-'
      a-b
    when '*'
      a*b
    when '/'
      a/b
    end
  rpn( s.gsub( $&, r.to_s ) )
end

DATA.each{ |a|
  i, x = a.split( "->" ).map( &:strip )
  ac = rpn(i)
  raise [i,x,ac].inspect unless ac.to_f==x.to_f
  puts "ok : %s -> %s"%[i,ac]
}
__END__
1 -> 1
1 2 + -> 3
3 1 - -> 2
10 2 / -> 5
2 5 8 + + -> 15
2 5 8 + * -> 26
2 5 8 * + -> 42
1 2 + 3 4 + * -> 21
2 3 * 4 5 * + -> 26
```

正規表現なんか使わなくてももっとすっと書けるような気がしてならないが、まあこんなところで。
なんとなく、eval は禁止の方向で。
二項じゃない演算子に対応するためには一手間必要か。
あと、再帰で書いているのでスタックがあふれる危険あり。
末尾再帰になっていると思うので、ループにするのは簡単だと思う。
ForEach()メソッドをシンプルに書けるようにする

* [指定回数処理を繰り返すメソッド(拡張メソッド) #c# - Qiita](http://qiita.com/items/cded0dba429581655db2)

ジェネリック版コレクションに備わっているForEach()メソッドですが、
下記ソースコードの a ではなく b のような書き方したい！

```csharp:program.cs
using System;
using Rohinomiya;

namespace SampleForEach
{
	class Program
	{
		public static void Main(string[] args)
		{
			var dirs = new string[]{"aa","bb","cc"};
			
			Array.ForEach<string>(dirs, s => Console.WriteLine(s) );	// a
			dirs.ForEach(s => Console.WriteLine(s));					// b：こういう書き方したい

		}
	}
}
```

というわけで、Arrayクラスを拡張して、ForEach()メソッドを書いてみました。

```csharp:ClassArrayExtension.cs 
using System;

namespace Rohinomiya
{
	/// <summary>
	/// Arrayクラスを拡張する
	/// </summary>
	public static class ArrayExtension
	{
		/// <summary>
		/// ForEachメソッド
		/// </summary>
		/// <param name="array">Arrayクラス</param>
		/// <param name="action">実行させたいActionデリゲート</param>
		public static void ForEach<T>(this T[] array, Action<T> action)
		{
			Array.ForEach<T>(array, obj => action(obj));
		}
	}
}

```
gitoliteのリポジトリを削除する方法


1. gitolite.conf に記述されているリポジトリを削除する
2. gitolite.conf を commit する
3. gitolite.conf を push する
4. リポジトリのあるサーバにログインする
5. サーバからリポジトリの実体を削除する

```
$ sudo su - gitolite
$ cd repositories
$ rm -rf repo.git
```
ユーザーの権限の追加のメモ

ここを参照
http://www.nouveller.com/quick-tips/quick-tip-9-change-the-default-capabilities-of-wordpress-users-with-ease/

```php
	// store the 'Contributor' role
 
	$edit_contributor = get_role('contributor');
 
	// add a capability of 'upload_files'
 
	$edit_contributor->add_cap('upload_files');
```
指定回数処理を繰り返すメソッド(拡張メソッド)

以前の記事に関連して、Ruby の int.Times() メソッドみたいなのを書いてみました。

* [ジェネリックと拡張メソッドを使ってみる #c# - Qiita](http://qiita.com/items/1aa08c088a62f46d9fe1)

int クラスに対して、n 回繰り返す拡張メソッドを追加するには、以下のように適当な名前の静的クラスに、拡張メソッドを記述します。
1つ目の引数に、this キーワードを付けると、あたかもその型に対するメソッドのように使えます。

# ソースコード

```csharp:ClassIntExtensions.cs 
namespace Rohinomiya
{
	/// <summary>
	/// intクラスを拡張する
	/// </summary>
	public static class IntExtensions
	{
		/// <summary>
		/// [count] 回 処理を繰り返す
		/// 
		/// 使用例： 3.Times( i => Console.WriteLine(i.ToString()));
		/// </summary>
		/// <param name="count">繰り返す回数</param>
		/// <param name="action">実行させたいActionデリゲート</param>
		public static void Times(this int count, Action<int> action)
		{
			for (int i = 1; i <= count; i++) 
				action(i);
		}
	}
}
```

# 使用例

```csharp 
3.Times( i => Console.WriteLine(i.ToString()));
```

# 実行結果

```
1
2
3
```
「オフラインリアルタイムどう書く第三回の参考問題」を解いてみた

↑http://qiita.com/items/ebd8a56b41711ba459f9

こんな感じになった。


```ruby:baseball_count.rb

class BsoCount
  def initialize
    @ball = @strike = @out = 0
  end
  def ball
    @ball += 1
    @ball = @strike = 0 if @ball == 4
  end
  def strike
    @strike += 1
    self.out if @strike == 3
  end
  def out
    @out += 1
    @out = 0 if @out == 3
    @ball = @strike = 0
  end
  def hit
    @ball = @strike = 0
  end
  def foulball
    @strike += 1 unless @strike == 2
  end
  def result
    [@out, @strike, @ball]
  end
end

ansArr = []
bso = BsoCount.new
STDIN.gets.each_char do |actionChar|
  case actionChar
  when 's' then bso.strike
  when 'b' then bso.ball
  when 'f' then bso.foulball
  when 'h' then bso.hit
  when 'p' then bso.out
  end
  ansArr.push bso.result.to_s
end
print ansArr.join ','
```
GCC 4.7 で Passenger <= 3.0.15 のビルドが失敗する問題

GCC 4.7 では最新リリース版の Passenger (3.0.15) のビルドに失敗する。

これは C11 で追加された TIME_UTC が、 Boost 1.49 までで定義されている TIME_UTC 
と衝突するためである。

> [TIME_UTC is a macro in C11](https://svn.boost.org/trac/boost/ticket/6940)

Arch Linux では既に GCC 4.7 が導入されているが、
Boost も最新版の 1.50 であるため、この問題は起きない。ところが
Passenger は古いバージョンの Boost を同梱しており、それを使って必要なものを
ビルドしようとする。このため GCC 4.7 の環境ではビルドが失敗する。

Boost にパッチを当ててこの問題を解決する修正が Passenger のレポジトリに
先日コミット（ [Backport fix from https://svn.boost.org/trac/boost/ticket/6940]
(https://github.com/FooBarWidget/passenger/commit/27894da4c7a5da30ef7ab4b03f914d1dec8531ac)
）されているので、git からソースコードを持ってきて gem を作り、インストール
すれば、ビルドに成功する Passenger をインストールできたことになる。

```sh:install-passenger-git.sh
# Install Doxygen and Asciidoc to Arch Linux. 
sudo pacman -S --noconfirm --needed doxygen asciidoc
git clone https://github.com/FooBarWidget/passenger.git
cd passenger
rake package
gem install -l pkg/passenger-3.0.16.gem
```

以上のようにすれば gem に Git 版 Passenger がインストールされる。
Passenger StandAlone を使ってみよう。

```sh:startup-passenger-standalone.sh
cd $rails_application_to_be_run_with_passenger
passenger start -p $passenger_port -d
```

Passenger が Nginx など、必要なものをビルドして起動するはずだ。
Ubuntu 8.04(hardy)のGitを1.7へ


標準のリポジトリでは、1.5系しかないので、1.7にする方法。
まだ、いくつか自分が管理する8.04が有りそうなので

/etc/apt/source.listに以下を追加

```
deb http://ppa.launchpad.net/smartlounge/ubuntu hardy main
deb-src http://ppa.launchpad.net/smartlounge/ubuntu hardy main
```

次に、以下のコマンドを実行

```
gpg --no-default-keyring --keyring /tmp/sml.keyring --keyserver keyserver.ubuntu.com --recv 504EBE1344441FF0E7CC4CA30E76E800643C34E6 && gpg --no-default-keyring --keyring /tmp/sml.keyring --export --armor 504EBE1344441FF0E7CC4CA30E76E800643C34E6 | sudo apt-key add - && rm /tmp/sml.keyring
```

これで、Gitの1.7にアップデート出来る環境が整ったので、以下を実行

```
% sudo aptitude update
% sudo aptitude safe-upgrade
```

これで、無事にGitのバージョンアップは完了するはず。


参考：
http://openbooth.org/archives/54.html

https://launchpad.net/~smartlounge/+archive/ppa
xcodeでアプリをrunしても「could not launch」と表示されてアプリが起動しないとき

xcodeでアプリをrunしても「could not launch」と表示されてアプリが起動しないとき

状況
・コンパイルは通る
・エミュレータでは起動した
・実機へのアプリ転送はされても、起動しない
・「no such file or directory」と表示されいて、コンパイル済みのアプリへのパスが表示されている

~/Library/Developer/Xcode/DerivedData/
の中から対象プロジェクトのディレクトリを一旦削除してから、再コンパイルを試したら状況は解消されました。

状況が発生した原因はアプリのプロジェクトにあるtargetをDuplicate＆修正を行なってから実機転送を試みたら、発生しました。
UITapGestureRecognizerでダブルタップ時にシングルタップアクションをさせない

```objectivec
  UITapGestureRecognizer *doubleTapGestureRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)] autorelease];
  doubleTapGestureRecognizer.numberOfTapsRequired = 2;
  [self.view addGestureRecognizer:doubleTapGestureRecognizer];
  
  UITapGestureRecognizer *singleTapGestureRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)] autorelease];
  singleTapGestureRecognizer.numberOfTapsRequired = 1;
  // ダブルタップに失敗した時だけシングルタップとする
  [singleTapGestureRecognizer requireGestureRecognizerToFail:doubleTapGestureRecognizer];
  [self.view addGestureRecognizer:singleTapGestureRecognizer];
```
IP::Country のデータ最新化

Perl モジュール IP::Country 付属のデータは古いので、付属のスクリプトで再生成すると良いです。

```
cd dbmScripts
        sh whois_filenames
        perl ipcc_loader.pl
        perl ipcc_maker.pl
        perl ipauth_loader.pl
        perl ipauth_maker.pl
```

- lib/IP/Authority/auth.gif
- lib/IP/Authority/ipauth.gif
- lib/IP/Country/Fast/cc.gif
- lib/IP/Country/Fast/ip.gif

の4つのファイルが更新されます。

数十分かかりますw
Error handling


PhoneGap開発中に、ブラウザのエラーがXcodeに出力されなかったので、通常のテキストとして出力するのを書いてみたのでメモ。

```javascript
window.onerror = function (e, file, num) {
    console.log('/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/');
    console.log(e);
    console.log('Error on ' + file + ' at Line: ' + num);
    console.log('/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/');
};
```
Twigで翌月を表現

* 翌月

```PHP:
{{ "now"|date("Y/m/01")|date_modify("+1month")|date("Y年n月") }}
```
* 翌月最終日

```PHP:
{{ "now"|date("Y/m/01")|date_modify("+1month")|date("Y年n月t日") }}
```
EBSの容量を大きくする


勢いでやったけどアッサリできた。
Management Console上でほとんど完結して、
AWSのCLI Toolsとかを使ったりもしなかった。

Amazon Linux 3.2.12-3.2.4.amzn1.x86_64

1. EC2のインスタンス止める
2. EBSのボリュームをdetachする
3. 対象のEBSボリュームのsnapshotをとる（8GBなら分ぐらい？
4. snapshotを選択して"create volume"
5. EC2のインスタンスに新しくしたEBSをattachする
6. インスタンスを起動する
7. sshで繋いで、"resize2fs"する

Ubuntuとかは勝手にやってくれるらしいが。

```bash:before
ec2-user@ST02> df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/xvda1             8362320   7008880   1269576  85% /
tmpfs                   869280         0    869280   0% /dev/shm
```

```bash:resize2fs
sudo resize2fs /dev/xvda1
```


```bash:after
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda1            24872264   7011108  17609868  29% /
tmpfs                   869280         0    869280   0% /dev/shm

```

ふえたー！
後は作ったsnapshotを消したり、古いEBSを消すのは自由。
gtm-oauthとgtm-http-fetcherで添付するときのメモ

（１）バイナリ以外の項目


```
GTMMIMEDocument *doc = [GTMMIMEDocument MIMEDocument];

// keywordはNSString
 NSMutableDictionary *headers
 = [NSMutableDictionary dictionaryWithObject:@"form-data; name=\"keyword\"" forKey:@"Content-Disposition"];
    [doc addPartWithHeaders:headers body:[keyword dataUsingEncoding:NSUTF8StringEncoding]];

// entryTextはNSString
headers = [NSMutableDictionary dictionaryWithObject:@"form-data; name=\"status\"" forKey:@"Content-Disposition"];
 [doc addPartWithHeaders:headers body:[entryText dataUsingEncoding:NSUTF8StringEncoding]];
```


（２）リクエストにoauth認証の情報を追加するのは一番最後送信直前にする

```
NSMutableURLRequest *request
 = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"送信先URL"]];
[request setHTTPMethod:@"POST"];
// ：：
// いろいろ
// ：：
//authはGTMOAuthAuthentication
[auth authorizeRequest:request];
GTMHTTPFetcher *fetcher = [GTMHTTPFetcher fetcherWithRequest:request];
[fetcher setPostStream:stream];
[fetcher beginFetchWithDelegate:self
                      didFinishSelector:@selector(送信したあと)];
```
Sublime Text 2 で ` を ' などと同様に扱う


ST2 では `'` や `(` などを入力すると、対応する記号を自動で補完したり、選択文字列を囲んだりするが、`` ` `` (バッククォート) ではそのような動作はしない。

下記の記述を keymap に追加すれば、`` ` `` でも同様の動作をする。

なお、これは Packages/Default/Default (OSX).sublime-keymap で定義されている、`'` のための記述 (Auto-pair single quotes) をコピーして、`'` を `` ` `` に置き換えただけである。

```js
  // Auto-pair back quotes
  { "keys": ["`"], "command": "insert_snippet", "args": {"contents": "`$0`"}, "context":
    [
      { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
      { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
      { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true },
      { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[`a-zA-Z0-9_]$", "match_all": true },
      { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single", "match_all": true }
    ]
  },
  { "keys": ["`"], "command": "insert_snippet", "args": {"contents": "`${0:$SELECTION}`"}, "context":
    [
      { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
      { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
    ]
  },
  { "keys": ["`"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
    [
      { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
      { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
      { "key": "following_text", "operator": "regex_contains", "operand": "^`", "match_all": true }
    ]
  },
  { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context":
    [
      { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
      { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
      { "key": "preceding_text", "operator": "regex_contains", "operand": "`$", "match_all": true },
      { "key": "following_text", "operator": "regex_contains", "operand": "^`", "match_all": true }
    ]
  }
```