OmniAICreator/Qiita-1.07M huggingface dataset:
try ~ catch で捕捉されてない例外をUnhandledExceptionで補足する

C#.NET　で、try ~ catch で捕捉されない例外を補足したい場合、
AppDomain.UnhandledException イベントハンドラを設定しておけば、そこで捕捉してくれます。
これで try ～ catch で捕捉し忘れても、安心アンコールワットね！

Formアプリケーション、コンソールアプリケーション、両方で使えます。

# サンプルコード

```csharp:program.cs
/// <summary>
/// try ~ catch で捕捉されてない例外をUnhandledExceptionで捕捉するサンプル
/// </summary>
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace SampleUnhandledException
{
	class Program
	{
		public static void Main(string[] args)
		{
			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
			
			//try ~ catch で捕捉されてる例外
			try {
				throw new Exception("1");
			} catch (Exception e) {
				Console.WriteLine("Catch clause caught : " + e.Message);
			}

			//try ~ catch で捕捉されてない例外
			throw new Exception("2");
		}

		/// <summary>
		/// try ~ catch で捕捉されてない例外を処理するイベントハンドラ
		/// </summary>
		/// <param name="sender">送信者</param>
		/// <param name="args">例外オブジェクト</param>
		static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args)
		{
			try
			{
				Exception ex = (Exception)args.ExceptionObject;
				
				//エラー処理
				MessageBox.Show(GetExceptionInfoString(ex));
			}
			finally
			{
				Application.Exit(); // 明示的に終了させる必要がある
			}
		}
		
		/// <summary>
		/// 例外オブジェクトからデバッグに必要な情報を文字列で返す
		/// </summary>
		/// <param name="ex">例外オブジェクト</param>
		/// <returns>例外情報の文字列</returns>
		static string GetExceptionInfoString(Exception ex)
		{
			var sb = new StringBuilder();

			sb.AppendFormat("Message={0}\n", ex.Message);
			sb.AppendFormat("Source={0}\n", ex.Source);
			sb.AppendFormat("HelpLink={0}\n", ex.HelpLink);
			sb.AppendFormat("TargetSite={0}\n", ex.TargetSite.ToString());
			sb.AppendFormat("StackTrace={0}\n", ex.StackTrace);

			return sb.ToString();
		}
		
	}
}
```

# 実行結果

![実行結果](https://lh6.googleusercontent.com/-0X0OmNDW564/UBqXwLHjQ6I/AAAAAAAAEYQ/LfApdDkqSD0/s640/2012-08-03_00h05_42.png)

Log4Net と組み合わせるとよさげかもしれませんね。

# 参考

* [AppDomain.UnhandledException イベント (System)](http://msdn.microsoft.com/ja-jp/library/system.appdomain.unhandledexception.aspx)
nginxで404の時だけ別サーバから取得してくる

ウェブインターフェースのアプリケーションで何かしらのデータを動的に生成して配信したいけど効率的な配信とかキャッシュは面倒だしnginxの力を借りたい。

[proxy_storeとかを使って](http://wiki.nginx.org/HttpProxyModule#proxy_store)、nginxでは404の時だけ後ろのアプリケーションサーバに取りに行く。

    server {
        listen 8888;
        server_name  localhost;

        location / {
            root /tmp/data;
            error_page 404 = @data;
        }   
     
        location @data {
            internal;

            proxy_pass http://localhost:4567;
            proxy_store on;
            proxy_store_access user:rw group:r all:r;
            proxy_temp_path /tmp/data/temp;

            root /tmp/data;
        }
    }

こんなアプリケーションと一緒に動かす。
（とりあえずここではSinatraでサクッと）

    #!/usr/bin/ruby
    require 'sinatra'

    get '/*' do
      "Generated at #{Time.now.to_s}\n"
    end

    delete '/:path' do
      path = "/tmp/data/#{params[:path]}"
      File.unlink path
      "delete #{path}\n"
    end

組み合わせて使うと

    $ curl http://localhost:8888/hoge
    Generated at 2012-08-02 23:03:25 +0900
    $ date
    2012年 8月 2日 木曜日 23時03分27秒 JST
    $ curl http://localhost:8888/hoge
    Generated at 2012-08-02 23:03:25 +0900
    $ cat /tmp/data/hoge
    Generated at 2012-08-02 23:03:25 +0900

このように、初めてアクセスがあった時だけ後ろのSinatraに問い合わせてローカルに保存。そして

    $ curl --request DELETE http://localhost:4567/hoge
    delete /tmp/data/hoge
    $ curl http://localhost:8888/hoge
    Generated at 2012-08-02 23:03:40 +0900

SinatraのDELETEメソッドを叩きhogeを削除してまたアクセスすると、再度hogeを生成する。ぼちぼち使い道がありそう。
本番環境のみ、BASIC認証を設定する！


常に忘れる為、ココにメモしておきます。

```ruby:app/controllers/application_controller.rb
http_basic_authenticate_with :name => ENV["BASIC_AUTH_NAME"], :password => ENV["BASIC_AUTH_PW"] if Rails.env.production?
```

`name`と`password`は、Herokuの環境変数で設定しておきます。

```bash
$ heroku config:add BASIC_AUTH_NAME=fakestarbaby
$ heroku config:add BASIC_AUTH_PW=password
```
RailsAdminを導入してみた


[Rails3 で管理画面を作成するなら RailsAdmin で決まりかも](http://d.hatena.ne.jp/griefworker/20120628/rails_admin)に沿ってやってみたけど、ちょこちょこ躓いたのでメモ。

deviseは2.1.2、rails_adminは0.0.5。

```Gemfile
gem 'devise'
gem 'rails_admin'
```

ここでは管理者のモデルを`Admin`とする。まずはdeviseでこれを作る。

```
$ bundle install
$ rails g devise Admin
$ vim app/models/admin.rb
```

```diff
-  devise :database_authenticatable, :registerable,
-         :recoverable, :rememberable, :trackable, :validatable
+#  devise :database_authenticatable, :registerable,
+#         :recoverable, :rememberable, :trackable, :validatable
```

```
$ vim config/routes.rb
```

```diff
-  devise_for :admins
+#  devise_for :admins
```

```
$ rake db:migrate
```

これで`admins`テーブルができた。
続けてrails_adminを導入する。

```
$ rails g rails_admin:install
$ vim app/models/admin.rb
```

```diff
-#  devise :database_authenticatable, :registerable,
-#         :recoverable, :rememberable, :trackable, :validatable
+  devise :database_authenticatable, :registerable,
+         :recoverable, :rememberable, :trackable, :validatable
```

*マウントする前にdeviceに登録する*ようにルーティングを調整。

```
$ vim config/routes.rb
```

``` diff
+  devise_for :admins
   mount RailsAdmin::Engine => '/admin', :as => 'rails_admin'
-
-#  devise_for :admins
```

```
$ rake db:migrate
$ open http://127.0.0.1:3000/admins/sign_up
```

ユーザの登録が終わったら`:registerable`を外す

```
$ vim app/models/admin.rb
```

```diff
-  devise :database_authenticatable, :registerable,
+  devise :database_authenticatable,
```
時差分かりにくいよー助けてActiveSupport！


注：ActiveSupport::TimeWithZoneとかの話じゃないです。

JSTの端末使ってる前提で。
Ruby 1.9.3p125
Rails 3.2.5

## UNIX時間はどこでも同じだ

```ruby
Time.now.utc
#=> 2012-08-02 06:44:35 UTC
Time.now
#=> 2012-08-02 15:44:36 +0900

Time.now.utc.to_i
#=> 1343889882
Time.now.to_i
#=> 1343889885
```

これ時々混乱するけど、
起点となるのはUTCの1970-01-01 00:00:00 UTCだから、
その時点では日本は1970-01-01 09:00:00 +900なわけで、
UNIX時間は同じ。

## 今日はいつ？

railsのActiveSupportは便利です。

```bash
rails console
```


```ruby
Time.now.utc.beginning_of_day
#=>2012-08-02 00:00:00 UTC

Time.now.beginning_of_day
#=>2012-08-02 00:00:00 +0900
```

ここまではOKでしょう

```ruby
Time.now.utc.beginning_of_day
#=>1343865600

Time.now.beginning_of_day
#=>1343833200

# UTC's beginning_of_day == JST's beginning_of_day + 9.hours
Time.now.utc.beginning_of_day.to_i == Time.now.beginning_of_day.to_i + 9.hours
#=> true

```

どうでしょ。
感覚だと逆の感じがしませんか。
JSTは9時間早いので9時間早く今日が始まっているわけです。

## データストアはUTCなんだけどフロントはJST

よくあるパターンですね。

```ruby
today_jst = Time.now.beginning_of_day..Time.now.end_of_day

Post.where(created_at: today_jst).count
```

で結局良いわけですね。

## 結論

こういうのは透過的にやりたいですね、ハイ。
heroku_san 3.0.2でdeploy前にテストを走らせる方法


以下のコードを`[RAILS_ROOT]/lib/tasks`に追加するとdeploy前にテストが走ります。

```ruby:heroku_hook.task
namespace :heroku do
  namespace :deploy do
    desc "Run spec before deploy"
    task :before => :environment do
      Rake::Task['spec'].invoke
    end
  end
end
```

spork等を適切に使うように設定すれば軽快に動くと思います。
SAKURAの共有サーバで環境変数を使う


Gitに入れられない固有の値は「環境変数」に入れておく、というのがPaaSを使い慣れた人の共通認識だと思います。でも、[SAKURAの共有サーバ](http://www.sakura.ne.jp/rentalserver/)で同じことをやろうとすると、Apacheの[suEXEC](http://httpd.apache.org/docs/2.2/suexec.html)が有効になっているらしく、上手くいきません。

(結論から言うと、環境変数を取り出すのは色々難があるのですが、既存のコードにちょっと細工して、それっぽく使う方法を紹介します)

##普通のやり方
Apacheの設定経由で、```SetEnv```を使うのが一般的でしょうか。

```httpd.conf
SetEnv DB_HOST localhost
SetEnv DB_NAME my_db_name
SetEnv DB_USER db_admin
SetEnv DB_PASS *******
```

※もちろん、単純にシェルから環境変数を入れておく手もあります。

##でも...
前述の通りSAKURA(の共有サーバ)では...

* Apacheの設定ができない (※.htaccessではGitリポジトリに含まれてしまう)
* 設定で来たとしても、suEXECに阻まれる。

> suEXEC は、安全な環境変数のリスト (これらは設定時に作成されます) 内の変数として渡される安全な PATH 変数 (設定時に指定されます) を設定することで、 プロセスの環境変数をクリアします。
> *cf. [suEXECサポート](http://httpd.apache.org/docs/2.2/ja/suexec.html)*

##仕様がないので。
環境変数をエミュレートする方法を考えます。

まず、前提としてディレクトリ構成が次のようになっているとします。(太字は元々SAKURAで用意されているディレクトリ)

* **/home/username/**
	* **www**
		* yourwebsite.com/ : *virtual hostのルート*
			* index.php
			* evlfs.php
	* env_vars
		* yourwebsite.com : *環境変数がiniファイル形式で納められたテキストファイル*

SAKURAのデフォルトでは、**/home/username/www/**がドキュメントルートになっていますが、マルチドメインで使うケースが多い(と思う)ので、上記のようにwwwの下にディレクトリを置いています。

## iniファイル形式で値を書く

PHPには、iniファイル形式をパースする便利な関数があります。環境変数にセットしたい内容も、iniで書くことにしましょう。

```ini:yourwebsite.com
DB_HOST = localhost
DB_NAME = my_db_name
DB_USER = db_admin
DB_PASS = *******
```

これを、env_varsディレクトリ内に置きます。他ドメインでも利用する場合は、ファイル名をドメイン名にしてドメイン毎に用意します。

## $_SERVERにセット

後は、PHPからiniファイルを読込めばOKです。evlfs.phpファイルの内容は次のような感じに。

```evlfs.php
<?php
/**
 * Enviroment Variable Loader for SAKURA
 */
$path = "{$_SERVER['DOCUMENT_ROOT']}/../env_vars/{$_SERVER['HTTP_HOST']}";
if ('support@sakura.ad.jp' == $_SERVER['SERVER_ADMIN'] && file_exists($path))
	$_SERVER = array_merge($_SERVER, parse_ini_file($path));
```

* SAKURAのサーバ上で実行されているか、
* iniファイルが存在するか、

をチェックして、iniファイルの内容を$_SERVER配列に追加します。

最後、フロントコントローラ(index.php)から evlfs.php を読込みます。

```index.php
require_once 'evlfs.php';
```

これで、```$_SERVER['DB_HOST']```で'localhost'を取得できるようになりました。PaaS的な書き方をしてしまったコードも、この一行だけで無事動くようになるはず!
gitのメモ


主にコマンドのメモ。
最近頑張って覚えようと思って、ATOK Padに入れてます。
（optionを2回押すとATOK Padが立ち上がるので・・・）


```
#indexに追加(-A:全部追加)
git add -A

#indexから削除
git checkout HEAD hogehoge.txt

#commit
git commit

#ブランチの作成
git branch hoge

#リモートブランチの作成
git branch hoge
git push origin hoge

#ブランチの確認(-a:全部表示、-r:remoteのみ表示)
git branch

#リモートブランチを無名ブランチとして取得
git checkout origin/hoge

#リモートブランチをローカルブランチとして取得
git checkout -b localhoge origin/hoge
(localhogeが新規作成される)

#リモートブランチの削除
git branch -d hoge
git push origin :hoge

#現在スイッチしてるbranchにhogeをrebase
git rebase hoge

#現在スイッチしているbranchにhogeをmerge
git merge hoge

#mergeの取り消し
git reset --hard HEAD^

#たった今行ったcommitの取り消し
git reset --soft

#コンフリクトしたfooブランチのbar.txtを、ブランチhogeのファイルで上書きする
git checkout hoge foo/bar.txt

```

ところどころ間違ってるかも。
あとで編集しよう。。。
git ですべてのブランチに対して処理を行う方法

git-svn を使っているとき、すべてのブランチに対して git svn rebase をしたいと思った。

# 方法1

以下のコマンドで、ブランチのリストを取得できる。

```sh
git for-each-ref --format='%(refname:short)' refs/heads
```

これを使ってシェルスクリプトを書くことができる。

```sh
git svn fetch
for branch in $(git for-each-ref --format='%(refname:short)' refs/heads); do
    git checkout $branch && git svn rebase --local
done
```

# 方法2

git for-each-ref の出力をパイプで直接 sh に渡してしまう方法もある。

```sh
git svn fetch
git for-each-ref --format='git checkout %(refname:short) && git svn rebase --local' refs/heads | sh
```

# 補足

ブランチのリストを取得して何か処理する、といった場合は、git branch でなく git for-each-ref を使うほうがいいようだ。

git branch は hidh-level commands (porcelain) であり、シェル上で対話的に使うことを想定している。だから、現在のブランチにマークがついていたりする。

git for-each-ref は low-level commands (plumbing) であり、スクリプトで使うのに向いている。だから、普段シェル上でコマンドを打つときはちょっと使いにくいけど、format 指定ができたりして応用がきく。
mysqlでストアドプロシージャを使用する


一連のSQL文や処理を名前をつけて保存、関数呼び出しのように使用できる。
※mysql5.0から使用可


```sql:登録
mysql>
CREATE PROCEDURE test_proc01() SELECT CURDATE();

```


```sql:呼び出し
mysql>
CALL test_proc01();
```


```sql:登録一覧確認
mysql>
show procedure status;
```
PHPで使うGoFパターン ひとり Advent Calendar - アブストラクトファクトリー


## アブストラクトファクトリーってなに? 

生成に関するパターンですね。根本的な考え方はビルダーと似ています。複雑な手順のオブジェクト生成をラップしようという考え方です。

## アブストラクトファクトリーの構造

* Factory - 部品を作る向上
* Product - 部品を当て込まれる対象

```
<?php
class House {
  private $_Door   = null;
  private $_Window = null;
  public function setDoor ( $door ) { 
    $this->_Door = $door;
  }
  public function setWindow ( $window ) { 
    $this->_Window = $window;
  }
}


interface IHouseFactory {
  public function createDoor (); 
  public function createWindow (); 
}

class JapaneseHouseFactory implements IHouseFactory {
  public function createDoor () {
    return '木の門';
  }

  public function createWindow () {
    return '障子';
  }
}

class ForeignHouseFactory implements IHouseFactory {
  public function createDoor () {
    return '木のドア';
  }
  public function createWindow () {
    return 'ガラスの窓';
  }
}

$factory1 =  new JapaneseHouseFactory (); 
$factory2 =  new ForeignHouseFactory (); 

$jphouse = new House (); 
$jphouse->setDoor ( $factory1->createDoor () );
$jphouse->setWindow ( $factory1->createWindow () );

$fhouse = new House (); 
$fhouse->setDoor ( $factory2->createDoor () );
$fhouse->setWindow ( $factory2->createWindow () );
var_dump ( $jphouse );
var_dump ( $fhouse );
```


このファクトリで縛ることによって木の門とガラスの窓のようなおかしな組み合わせでオブジェクトが設定されることがなくなり、安全に作れるようになりましたね。今回は複雑さを減らすために文字列で全てのプロパティを設定しましたがcreateDoorが返すのが、また複雑な生成を経たオブジェクトの場合もあります。そのようなケースを想像すると、もっとこのパターンの意義も伝わり易いのではないかと思います。

## 実際どうなの?

有名な適用例としてはDOMでしょうか。その他でもしょっちゅう使われていますね。また、このパターンのもうひとつのメリットとしては、Factoryがオブジェクトなので引数等で渡し易い点です。次回に説明するFactoryMethodと組み合わせることでUnitテストが行い易くなります。
NeoBundleの導入


##NeoBundleとは？
vimのプラグイン管理ツール。
##vundleとの違い
[公式ドキュメント](http://vim-users.jp/2011/10/hack238/)からの引用

0. コマンド名が改善されている
1. vital化されている
2. shellslashがオンでも動作する
3. vimprocに対応している
4. unite.vimインタフェースの実装
5. Subversion, Mercurialへの対応
6. リビジョン指定

##使い方

```sh:
 $ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh
 $ sh ./install.sh
```

下記をvimrcに追記

```vim:
"NeoBundle Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath^=/home/vagrant/.vim/bundle/neobundle.vim/

" Required:
call neobundle#begin(expand('/home/vagrant/.vim/bundle'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'

" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }

" Required:
call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
"End NeoBundle Scripts-------------------------
```

vi上から、`:NeoBundleInstall` で.vimrcのNeoBundleで指定されているリポジトリのプラグインをインストールできる。
プラグインを削除したい場合は、vimrc上からNeoBundleの記述を消して `:NeoBundleClean` でできる。
エンディアン判定

HTML5でバイナリを扱う場合はcpuのエンディアンに気をつける必要がある(最近のcpuはリトルエンディアンばっかりだと思うんだけど)。例えば、websocketでArrayBufferでデータを渡すときにエンディアンが違ったり(Rhinoとか後ろがJavaのやつはビッグエンディアンかな？)、バイナリファイルのシグニチャを整数値で与えると不具合が出る可能性がある。

```js
var isLittleEndian = !!new Uint8Array(new Uint16Array([1]).buffer)[0];
```
Bashのブレース展開・変数パラメータ展開

Bashにはブレース展開，変数パラメータ展開と言って変数を簡単に操作したりする機能がある．以下によく使う例を載せる．詳細は参考ページを参考に．

### 拡張子を変更したい場合

```sh
for i in *.c; do mv $i ${i%.c}.cpp; done
```

上記の例では拡張子 c を拡張子 cpp に置き換える．

### ファイル名の一部を変更したい場合

```sh
for i in *_temp.*; do mv -n $i ${i/_temp/}; done
```

上記の例では hoge_temp.txt があった場合 _temp を削除し hoge.txt に変更を行う．(一応，上書きしないように -n フラグを追加している．)

### ファイル名に追記したい場合

```sh
for i in *; do mv $i ${i%.*}_temp.${i##*.}; done
```

上記の例では hoge.piyo.txt があった場合，拡張子の前に _temp を追加し hoge.piyo_temp.txt に変更を行う．

## 参考ページ

1. http://d.hatena.ne.jp/dharry/20090211/1234290856 - 変数パラメータ展開について
2. http://akitosblog.seesaa.net/article/185306796.html - 1のページに不足している置換について
3. http://lhlhlh.blog71.fc2.com/blog-entry-3.html - ブレース展開について
zsh global alias でエラー出力だけを楽々パイプする

```sh:.zshenv
alias -g L="|& $PAGER"
alias -g E='2>&1 > /dev/null'
```

-g は global alias にするオプション。こうしておくと、例えば次のように書くことができるようになる:

```sh
$ g++ hoge.cpp E L
(エラー出力をページャで見る)
```

今の場合、下のと同じ意味になります:

```sh
$ g++ hoge.cpp 2>&1 > /dev/null |& lv
```

「へいへい、もっと cool な方法があるぜ！」って人はツッコミ入れてくださいな。
NSUserNotificationメモ

やりたいことがあって色々と調べたものの結局流れてしまったので。
日本語訳風のメモだけ記しておく


***
Display Information
  `title`  *文字通りタイトル*
  `subtitle`  *サブタイトル*
  `informativeText`  *本文*
***
Displayed Notification Buttons 
  `hasActionButton`  *デフォルトで「表示」と書かれているボタン。NOにするとこのボタンが表示されなくなる*
  `actionButtonTitle`  *上のボタンに表示するテキスト。デフォルトで「表示」と書かれているのを変更出来る。*
  `otherButtonTitle`  *「閉じる」ボタンのテキスト。これも変更出来る。*
***
Delivery Timing
  `deliveryDate`  *通知日時？通知センターで右上に表示される時間。NSDateで指定できる。自動で相対時間にされる。*
  `actualDeliveryDate`
  `deliveryRepeatInterval`  *NSDateComponentsで指定した間隔で繰り返し通知できるらしい。少し触ったがよく分からず。*
  `deliveryTimeZone`  *通知日時のタイムゾーン。デフォルトではシステムのもの？*
***
Delivery Information
  `presented`
  `remote`
  `soundName`  *通知の際に鳴る音をNSStringで指定できる。*
***
User Notification Activation Method
  `activationType`
***
User Notification User Information
  `userInfo`  *NSDictionaryで色々と渡せるらしい。使い道がよくわからない。*
***


当方はiOSのことはわかりませんが、逆輸入なのでiOSとほぼ同じなのでは。
iOS関連の情報を漁ればもっと詳しく分かるかも知れない

read-onlyはスルーしてしまいました
あまりあてにならない内容ですがどこかで何かの役に立てば
MacでOctopressをgithub pagesにセットアップするまでに行った事

もっとMarkdown表記を勉強するために、Markdownの使えるブログサービスがないかと調べてみたところOctopressがヒット

[OCTOPRESS - A blogging framework for hackers.](http://octopress.org)

Octopressの利用にはRuby 1.9.2以上が必要なのですが、何の環境も整っておらず、かなりハマってしまったのでメモ。

##Rubyの開発環境を整える
別記事にだしたので[こちら](http://qiita.com/items/5b517705ef2ea7f6e36d)を参照

##gitの環境を整える
こちらも別記事に出したので[こちら](http://qiita.com/items/cbbda1bd8e9b96c92166)を参照

##Octopressのセットアップ
###レポジトリのclone
今回のインストール先はDropboxを指定。ディレクトリを移動して、Octopressをgitからclone

```Bash
cd
cd dropbox
git clone git://github.com/imathis/octopress.git octopress
```

これで、dropboxディレクトリの中にoctopressというディレクトリが作成されgithubからcloneされた内容が保存されました。

###インストール

```Bash
cd octopress
gem install bundler
rbenv rehash
bundle install
rake install
```

###githubにレポジトリを作成
[Create a New Repository](https://github.com/new)から'username.github.com'という名前でリポジトリを作成。自分の場合はtetsuya.github.com *注1

*注1 - github pagesは`username.github.com`でしか作成できないようです。例えば、'tetsu.github.com'のレポジトリ名が空いてたからといってdeployしても何も起こりませんでした。

###github pagesにコミット

```Bash
rake setup_github_pages
```
すると

>Enter the read/write url for your repository:

と表示されるので、レポジトリを指定します。自分の場合、
`git@github.com:tetsuya/tetsuya.github.com.git`



最後にgithub pagesにdeployして終わりです。

```Bash
rake generate
rake deploy
```
>\#\# Github Pages deploy complete

これで完了です

10分程待ってからアクセスしてみましょう[このようなページが](http://tetsuya.github.com)できていれば成功です。
MacOSX Lion(10.7)でRubyの開発環境を整える

RVMとかも試したけど挫折。結局、Homebrew + rbenvでうまくいったのでメモ。

##実はMacにはRubyが初めから入っている
Terminalアプリを起動しバージョンを確かめてみる

```Bash
ruby -version
```
**結果**

>ruby 1.8.7 (2011-12-28 patchlevel 357)

しかし、今回は最新版のRuby1.9.2 patchlevel 290が使いたいのです。困った。

##Homebrewのインストール
Homebrewとはパッケージ管理システムだそうです。と言われてもイマイチなんのことか分からないのですが、Macアプリのの更新チェッカーの用なものと理解しました。

インストールは、以下のコマンドをterminalに打ち込むだけです。

```Bash
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
```
インストールが完了すると、updateするまえにdoctorを走らせるように言われます

```Bash
brew doctor
```
すると、下記のようなエラーがでました

>Warning: No Xcode version found!

##Xcodeのインストール

どうやら、Xcodeがインストールされていないのが問題のようですが、何GBもするのでMBAのディスクスペースを圧迫されてしまうのはちょっと…と思っていたら、どうやら`Command Line Tools for Xcode`でもよい事が判明。

[Apple Developer](http://connect.apple.com)からDeveloperアカウントを取得後、ダウンロードできるのですが、何故かChromeからだと表示が崩れたのでSafariで試したほうがいいかもしれないです。

Command Line Tools for XcodeはGUIなので詳細は割愛。もちろん、App StoreからXCodeを落としてくるのもありだと思います。

##rbenvのインストール
rbenvとはRubyバージョン管理ツールだそうです。パッケージ管理だとかバージョン管理とか管理管理うるさいですがさくっと入れちゃいます。

```Bash
brew update
brew install rbenv
brew install ruby-build
```

次はRubyの最新版、1.9.3のインストールを行いましょう

```Bash
rbenv install 1.9.3-p194
```
ここで、以下のようなエラーがでてBuildに失敗しました

>TO FIX THE PROBLEM: Install the official GCC compiler using these
packages: https://github.com/kennethreitz/osx-gcc-installer/downloads
>
You will need to install the official GCC compiler to build older
versions of Ruby even if you have installed Apple's Command Line Tools
for Xcode package. The Command Line Tools for Xcode package only
includes \`llvm-gcc`.
>
BUILD FAILED

どうやら今度は、[GCC Compiler](https://github.com/kennethreitz/osx-gcc-installer/downloads)というものが必要なようです。

上記アドレスから、`GCC-10.7-v2.pkg`をダウンロードしてインストール。こちらもGUIツールなので詳細は割愛。

インストールが終わったところで、先ほど失敗したRuby 1.9.2のインストールをもう一度実行してみます。

```Bash
rbenv install 1.9.2-p290
```

次はうまくいきました。これでRubyの開発環境は整いました。
Sublime Text 2でスニペットを自作する


`Tools > New Snippet...`

```xml+ruby:it_should_allow_mass_assignment_of.sublime-snippet
<snippet>
  <content><![CDATA[
it { should allow_mass_assignment_of :${1:name} }
$0
]]></content>
  <tabTrigger>ism</tabTrigger>
  <scope>source.ruby.rspec</scope>
</snippet>
```

以下の場所に保存
`/Users/user/Library/Application Support/Sublime Text 2/Packages/User/`

scopeは必須ではない
スコープの取得は [Sublime Text 2で現在のスコープを取得する](http://qiita.com/items/f04d0bdd341c7798bba2)

rspecのファイル内で`ism⇥`で展開できる


should_notも作成

```xml:it_should_not_allow_mass_assignment_of.sublime-snippet
<snippet>
  <content><![CDATA[
it { should_not allow_mass_assignment_of :${1:name} }
$0
]]></content>
  <tabTrigger>isnm</tabTrigger>
  <scope>source.ruby.rspec</scope>
</snippet>
```
phpMyAdminのDBグループ表示を無効化する


業務でphpMyAdminを使用していると、データベース名がアンダースコア起点でグループ化されて少々鬱陶しいので何とかしてみる。


まずは、フレーム左のナビゲーション部分を調べてみる。

``` php:./navigation.php(312-)
    echo '<div id="databaseList">' . "\n";    $_url_params = array('pos' => $pos);    PMA_listNavigator(count($GLOBALS['pma']->databases), $pos, $_url_params, 'navigation.php', 'frame_navigation', $GLOBALS['cfg']['MaxDbList']);    echo '</div>' . "\n";    $common_url_query = PMA_generate_common_url();    PMA_displayDbList($GLOBALS['pma']->databases->getGroupedDetails($_SESSION['tmp_user_values']['navi_limit_offset'], $GLOBALS['cfg']['MaxDbList']), $_SESSION['tmp_user_values']['navi_limit_offset'], $GLOBALS['cfg']['MaxDbList']);
```

PMA_displayDbList()が表示しているっぽい。で、ここは何やってるかなと……

``` php:./navigation.php(334-)
function PMA_displayDbList($ext_dblist, $offset, $count){    global $element_counter, $img_minus, $img_plus, $href_left,        $db_start, $common_url_query;    // get table list, for all databases    // doing this in one step takes advantage of a single query with information_schema!    $tables_full = PMA_DBI_get_tables_full($GLOBALS['pma']->databases->getLimitedItems($offset, $count));    $url_dbgroup = '';    echo '<ul id="leftdatabaselist">';    $close_db_group = false;    foreach ($ext_dblist as $group => $db_group) {        if (count($GLOBALS['pma']->databases) > 1) {            if ($close_db_group) {                $url_dbgroup = '';```

$ext_dblistを追っかければ何かわかるかな…
$ext_dblist 
<= $GLOBALS['pma']->databases->getGroupedDetails($_SESSION['tmp_user_values']['navi_limit_offset'];

次

``` php:./libraries/List_Database.class.php(256-)
            foreach ($separators as $separator) {                // use strpos instead of strrpos; it seems more common to                // have the db name, the separator, then the rest which                // might contain a separator                // like dbname_the_rest                $pos = strpos($db, $separator, 1);                if ($pos !== false) {                    break;                }            }
```

ここで、グルーピングのためのセパレータをチェックしているので、この部分をまるごと消すなりコメントアウトすればOKっぽい。
第二回オフラインリアルタイムどう書くの解答例


[問題](http://nabetani.sakura.ne.jp/hena/ord2/)はこれ。

``transpose``使って逃げてる上に、いろいろ酷過ぎてすみません、的な回答。テストは通ってるけど、それだけ。。。

https://gist.github.com/3195676
<{xoops_explaceholder}>でモジュール間のテンプレートの依存を疎結合にしようぜ！


## モジュール同士が強く依存しあってしまう実装

XOOPS Cubeでモジュール間でテンプレートや表示を共通化したいことや、あるモジュールの表示を別のモジュールに埋め込みたいことってありますよね。その場合ついついめんどくさくて[リスト 1]のように直接別モジュールのテンプレートをインクルードしちゃうことってあります。そのときは「とりあえず動く」ので、いいかなと思います。

[リスト 1]

```smarty:foo_index.html
<{* これは foo モジュールのテンプレート *}>
<{include file="db:bar_inc.html"}><{* bar モジュールのテンプレート *}>
```

しかし、[リスト 1] の実装は気持ち悪さがあります。それは、あるモジュールが別のモジュールに完全に依存しているからです。モジュール間の関係は疎結合に保ちたいものです。この希望はテンプレートでも同じです。

## 拡張プレースホルダを使ってモジュール間を疎結合にしよう

拡張プレースホルダ関数 `<{xoops_explaceholder}>` を使うと、モジュール同士を疎結合に保ちつつ、表示の一部を他のモジュールに委譲することができます。`<{xoops_explaceholder}>` はとてもシンプルな Smarty プラグインです。内部実装を見てみるとわかりますが。デリゲートイベントをファイアしているだけです。`<{xoops_explaceholder}>` はデリゲートなのでプリロードなどでフックすればいいわけです。


[リスト 1] を `<{xoops_explaceholder}>` に置き換えたコードは、 [リスト 2] のようになります。`control` はデリゲート名の一部になります。この例では、わかりやすさのための拡張プレースホルダを設置したテンプレートの名前 + 任意の識別子の形式にしています。

[リスト 2]

```smarty:foo_index.html
<{* これは foo モジュールのテンプレート *}>
<{xoops_explaceholder control="foo_index.hoge_part"}>
```

拡張プレースホルダのデリゲート名は `Legacy.Event.Explaceholder.Get.` + `control` で指定した文字列になります。[リスト 2] の例では `Legacy.Event.Explaceholder.Get.foo_index.hoge_part` が完全なデリゲート名になります。このデリゲート名に対する、呼び出され側モジュール "bar" のプリロードは [リスト 3] のような骨組みになります。`Legacy.Event.Explaceholder.Get.*` デリゲートはコールバック関数の第一引数に `&$buffer` を渡します。コールバック関数は任意の処理を行ったあと、 `&$buffer` に表示したい文字列を代入することで、呼び出し元テンプレートに任意の表示を行うことができます。


[リスト 3]

```php
<?php

class Bar_Explaceholder extends XCube_ActionFilter
{
	public function preBlockFilter()
	{
		$this->mRoot->mDelegateManager->add('Legacy.Event.Explaceholder.Get.foo_index.hoge_part', array($this, 'get'));
	}

	public function get(&$buffer, array $params)
	{
		// 拡張プレースホルダで呼び出されるメソッド
		// $buffer に代入した文字列が呼び出し元テンプレートに表示される
	}
}
```

## コールバックに好きな変数を渡せないの？

渡せます。[リスト 2] の実装をちょっと変更して [リスト 4] のようにします。`<{xoops_explaceholder}>` の `control` 以外の引数は、オプションになります。なので、好きなように引数を追加することができます。追加した引数はコールバック関数にもれなく渡されます。

[リスト 4]

```smarty:foo_index.html
<{* これは foo モジュールのテンプレート *}>
<{xoops_explaceholder control="foo_index.hoge_part" foo=$foo bar=$bar baz=$baz}>
```

[リスト 4] の `$foo`, `$bar`, `$baz` はコールバック関数の第二引数 `$params` に連想配列になって渡ってきます。なので、 [リスト 5] のようにこれらの変数を参照することができます。

[リスト 5]

```php
<?php

class Bar_Explaceholder extends XCube_ActionFilter
{
	public function preBlockFilter()
	{
		$this->mRoot->mDelegateManager->add('Legacy.Event.Explaceholder.Get.foo_index.hoge_part', array($this, 'get'));
	}

	public function get(&$buffer, array $params)
	{
		var_dump($params['foo'], $params['bar'], $params['baz']);
	}
}
```

## おわり

以上が、拡張プレースホルダを使ったモジュール間のテンプレート連携です。ぜひ、モジュール間のテンプレートを疎結合に保って、メンテナンス性を向上しましょう！
html+css+javascriptでネイティブのiPhoneアプリをつくるPhoneGapの導入方法


##PhoneGapとは？
iOS/Androidアプリをhtml+css+jsで作成できるフレームワーク
iOSであればXCodeにプラグインをインストールし、AndroidであればXCodeでインストールする。
BlackBerryアプリなんかも作れるらしい。

##使用条件
Xcode 4.3+
Xcode Command Line Tools
Intel-based computer with Mac OS X Lion or greater (10.7+)

##PhoneGapのインストール
http://phonegap.com/download
上記から最新版をダウンロード
##Cordovaのインストール
ダウンロードしたファイルの中のCordova-2.0.0.pkgを起動し、ダイアログに素直にしたがって愚直にインストール
##binフォルダをどこかにコピー
binフォルダーをどこかにコピーして、terminalでコピー先に移動する
##プロジェクトを作成する
下記を実行
 ./create /path/to/HelloWorld org.apache.HelloWorld HelloWorld HelloWorld

##プロジェクトをxcodeで開く
作成されたプロジェクトフォルダの中の.xcodeprojをxcodeで起動

##プロジェクトをiOSのシミュレーターで実行
xcode上の左上の方にあるschemeのドロップダウンから下記のような形で選択してからcommand+Rで実行
HelloWorld>iPad 5.1simulator

##どこから編集するの？
プロジェクト直下のwwwフォルダ内のindex.htmlを編集すればいろいろできる

##参考
http://docs.phonegap.com/en/2.0.0/guide_getting-started_ios_index.md.html#Getting Started with iOS

##感想
最後に触ったのが一年くらい前で、久しぶりに触ったらかなり様変わりしていた。Cordovaとか初耳だった。
jQuery Mobileでボタンやリストビューを動的に追加する


jQuery Mobileが初期化処理を完了し、ページが表示されたあとに

```html
<a data-role="button"/>
```

を追加してもただのanchor要素が追加されるだけだった。以下のようにbutton関数を呼べばボタンになった。
参考: http://forum.jquery.com/topic/how-to-dynamically-add-data-role-button


```js
<script>
(function($){
  $(window).load(function(){
    var $content = $('#content');
    $('<a/>').text('Label')
      .data('icon','home')
      .appendTo($content)
      .button()
      ;
  });
})(jQuery);
</script>
```

同じようにリストビューも追加できた。ただし、こちらはappendしたあとに呼び出さないとうまく表示されなかった。

```js
$('<ul/>').append('<li>aaa</li><li>bbb</li>')
  .appendTo($content)
  .listview()
  ;

```
git でリモートブランチの削除

```
$ git branch -rd remote_branch
```

としててしばらくハマった。

```
$ git push origin :remote_branch
```

が正しいらしい。git のバージョンにもよるのかな？

http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81
moduleをextendしつつクラス毎の値を持ちたい

```ruby
module M
  def fav
    @fav
  end
  def fav=(val)
    @fav = val
  end
end

module A
  extend M
end

module B
  extend M
end

A.fav = :neko
B.fav = :inu

A.fav #=> :neko
```
SCRABBLE★NOTE | 書き殴りノート


開発に関するメモなどを殴り書きします。
![Note](https://github.com/FakeStarBaby/fakeimg/raw/master/note.jpg "Note")
photo by [kwill1229](http://www.flickr.com/photos/46352700@N00/990822185/)

## iOS

### 公式

* [iOS Developer Library](https://developer.apple.com/jp/devcenter/ios/library/japanese.html)

### チュートリアル

* [iPhone Tutorials](http://www.raywenderlich.com/tutorials)
* [iPad and iPhone Application Development](http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255?mt=10)
* [ARアプリの作り方 (1) - カメラオーバーレイビューを表示する](http://news.mynavi.jp/column/iphone/026/index.html)

### ライブラリ

* [iPhoneアプリ開発で使えるObjective-Cライブラリの紹介](http://smartappscreative.com/iphone/iphoneアプリ開発で使えるobjective-cライブラリの紹介/)
* [iPhoneで動くARアプリを作るためのライブラリ10選](http://www.atmarkit.co.jp/fsmart/articles/armobile05/01.html)

### 参考

* [A Day In The Life](http://d.hatena.ne.jp/glass-_-onion/)
* [ZERO4RACER PRO DEVELOPER'S BLOG](http://www.zero4racer.com/blog/)
* [Natsu's note](http://blog.natsuapps.com/)

## Corona SDK

### チュートリアル

* [Learning Corona: A List of Corona SDK Tutorials, Resources & Tools](http://www.learningcorona.com/)
オレオレ開発環境まとめ | 随時更新！


オレオレ開発環境について、まとめてみました。
随時、更新して行きます。

## マシン

* [MacBook Air](http://www.apple.com/jp/macbookair/)
  * 13インチ
  * 2.0GHzデュアルコアIntel Core i7
  * 8GB 1,600MHz DDR3L SDRAM
  * 256GBのフラッシュストレージ
  * バックライトキーボード (JIS)

## OS

* [OS X Yosemite](http://www.apple.com/jp/osx/)

## アプリケーション

### ブラウザ

#### メイン

* [Chrome](http://www.google.co.jp/chrome/intl/ja/landing.html)
	* [chrome-extension - オレオレ Chrome 拡張まとめ - Qiita](http://qiita.com/fakestarbaby/items/2c5c82b69143bf7e12e1)

#### サブ

* [Safari](http://www.apple.com/jp/safari/)
* [Firefox](http://www.mozilla.jp/firefox/)

### ニュース

* [Pocket](http://getpocket.com/)

### 仕事効率化

* [1Password](https://agilebits.com/onepassword)
* [Airmail2](http://airmailapp.com/)
* [Alfred2](http://www.alfredapp.com)
* [CheatSheet](http://www.cheatsheetapp.com/CheatSheet/)
* [Dropbox](https://www.dropbox.com)
* [Google ドライブ](https://www.google.com/intl/ja_jp/drive/)
* [Keynote](http://www.apple.com/jp/iwork/keynote/)
* [Kobito](http://kobitoapp.com)
* [LICEcap](http://www.cockos.com/licecap/)
* [OneDrive](https://onedrive.live.com/about/ja-jp/)
* [Skitch](http://skitch.com/jp/)
* [Slack](https://slack.com/)
* [Sunrise Calendar](https://itunes.apple.com/jp/app/id886106985)
* [Toggl](https://www.toggl.com/)
* [Wunderlist](https://www.wunderlist.com/ja/)

### ソーシャルネットワーキング

* [Line](http://line.naver.jp/ja/)
* [Janetter](http://janetter.net/jp/)

### ユーティリティ

* [AppCleaner](http://www.freemacsoft.net/appcleaner/)
* [Bartender](http://www.macbartender.com/)
* [BetterTouchTool](http://blog.boastr.net)
* [Caffeine](http://lightheadsw.com/caffeine/)
* [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)
* [StuffitExpander](http://www.stuffit.com/mac-expander.html)

### 開発ツール

* [Atom](https://atom.io/)
* [CoronaSDK](http://coronalabs.com/)
* [Dash](http://kapeli.com/dash)
* [HerokuToolbelt](https://toolbelt.heroku.com)
* [iTerm2](http://www.iterm2.com/#/section/home)
* [Sketch3](http://bohemiancoding.com/sketch/)
* [SublimeText3](http://www.sublimetext.com/2)
* [Unity](http://japan.unity3d.com/)
* [Xamarin Studio](http://xamarin.com/studio)
* [Xcode](https://developer.apple.com/xcode/)
* [XQuartz](http://xquartz.macosforge.org/landing/)

### ブック

* [Kindle](http://www.amazon.co.jp/gp/feature.html?docId=3077089416)
Grape | API生成マイクロフレームワーク


Grapeは、RubyでRESTライクなAPIを生成する為のマイクロフレームワークです。
![Grape](https://github.com/FakeStarBaby/fakeimg/raw/master/grape.jpg "Grape")
photo by [Anders Ljungberg](http://www.flickr.com/photos/a_t_ljungberg/251602869/)

## リソース

* [GitHub](https://github.com/intridea/grape)
* [RubyGems.org](http://rubygems.org/gems/grape)
* [The Ruby Toolbox](https://www.ruby-toolbox.com/projects/grape)

## インストール

Gemfileに、grapeを追記する。

```ruby:Gemfile
gem 'grape'
```

インストールする。

```bash
$ bundle install
```

## 初期設定

libディレクトリ配下に、API実装ファイルを新規作成します。

```bash
$ touch lib/api.rb
```

libディレクトリ配下を自動的に読み込むように設定します。

```ruby:config/application.rb
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
```

ルーティングに、API実装ファイルのマウントを追記します。

```ruby:config/routes.rb
mount API => "/"
```

## 利用方法

基本的な、Grapeの利用方法は以下のようになります。
`params`というブロックにて、パラメータのバリデータチェックも可能です。

```ruby:lib/api.rb
class API < Grape::API
  # APIアクセスに接頭辞を付加
  # ex) http://localhost:3000/api
  prefix "api"

  # APIアクセスにバージョン情報を付加
  # ex) http://localhost:3000/api/v1
  version 'v1', :using => :path

  resource "users" do
    # ex) http://localhost:3000/api/v1/users
    desc "returns all users"
    get do
      User.all
    end

    # ex) OK: http://localhost:3000/api/v1/users/1
    # ex) NG: http://localhost:3000/api/v1/users/a
    desc "return a user"
    params do
      requires :id, type: Integer
      optional :name, type: String
    end
    get ':id' do
      User.find(params[:id])
    end
  end
end
```

## 合わせて読みたい

* [APIの作成に特化したRuby製フレームワーク grape を試してみた | FIRN.JP](http://firn.jp/2011/05/27/grape)
color-moccur.elの結果を編集する: moccur-edit.el

[先日のポスト](http://qiita.com/items/e5fd73e03323f3d8f7bc)でいれたcolor-moccurの結果を編集できるようにmoccur-edit.elをいれます。

```
M-x install-elisp-from-emacswiki moccur-edit.el
```

設定ファイルに下記を追加します。

```common-lisp:~/.emacs.d/init.el
;;; moccur-edit.el
(require 'moccur-edit)
```

これで、`M-x occur-by-moccur`で検索をし、そのバッファで`r (moccur-edit-mode-in)`を押します。すると、バッファを編集することができます。通常のバッファと同じように`M-% (query-replace)`なども使用できます。変更点もわかりやすいようにハイライトされます。

変更が完了したら、`C-c C-c (moccur-edit-finish-edit)`をすると変更箇所がファイルに反映されます。もしくは、`C-c C-k (moccur-edit-kill-all-change)`をすると変更を取り消せます。

これで、プログラミンをしているときなどクラスやメソッドの名前などがだいぶ変更しやすくなりました。
Entity Frameworkでデータベースファーストで開発する


久しぶりにやったら、どうやってたのか思い出せないのでメモ。

## Entity FrameworkのEntity Data Modelを新規で追加する

使いたいデータベースを元にData Modelを作る。

## EDMXファイルを開いて、プロパティ「スキーマ」の「新しいオブジェクトの複数化」を有効(True)にする

好みに合わせてやりましょう。上記の方法で作るとデフォルトではFalseです。
でも、複数化したほうが.NETぽいし、気持ち悪くなくてよくね？

```単数形.cs
db.TableName.Select(x => x.ID);
```

```複数形.cs
db.TableNames.Select(x => x.ID);
```

## DBのテーブルをすべてUpperCamelCaseになおす

なってないとC#のコードが気持ち悪いことになるので全部を手動で修正。

```snake_case.cs
db.table_name.Select(x => x.full_name);
```

```CamelCase.cs
db.TableNames.Select(x => x.FullName);
```


### このとき、エンティティセット名が複数形のUpperCamelCaseになってるかをチェックする

DBから生成した場合、自動で変わらないことがあるのでここも手動でやります。

#### エンティティセット名がC#からDBを参照するときの名前になる

ダイアグラムにテーブル名として表示されている名前ではないので注意。
ダイアグラムにテーブル名として表示されている名前は、テーブルのクラスを表す。

----

これで、MySQL WorkBenchとかでDB設計しても、気持ちよくLINQが書けそうな気がする。
Rakefileでもoptparse

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

optparseの使い方を知ったので、Rakeで使ってみた。
直接渡すのは多分ムリなので、ENVでもらって配列に。

```ruby:Rakefile
# -*- coding: utf-8 -*-

require 'optparse'

argv_array = ENV["ARGV"] ? (ENV["ARGV"]).split(" ") : []

options = {}
OptionParser.new do |opts|
  opts.banner = 'Usage: rake [rake_options] task  ARGV="[options]"'

  opts.on('-e', '--environment ENVIRONMENT') {|v| options[:rake_env] = v}
  opts.on('-p', '--port PORT_NUM') {|v| options[:port] = v.to_i}
end.parse!(argv_array)

desc "print parsed options."
task :print_opt do
  p options
end
```

パースしたいオプションは`ARGV=""`とまとめて放り込む仕様。

```bash:shell_output
$ rake print_opt ARGV="-h"
Usage: rake [rake_options] task  ARGV="[options]"
    -e, --environment ENVIRONMENT
    -p, --port PORT_NUM


$ rake print_opt ARGV="-e production -p 8875"
{:rake_env=>"production", :port=>8875}
```

取ってつけた感はあるけども、書式のチェックは楽になるかも。
XQuartz のインストール


Mountain Lion には X11 が同梱されていません。そのため `brew doctor` すると X11 を入れるように言われます。

```
$ brew doctor
Warning: X11 is not installed.
You don't have X11 installed as part of your OS X installation.
This is not required for all formulae, but is expected by some.
You can download the latest version of XQuartz from:
  https://xquartz.macosforge.org
```

しかし https://xquartz.macosforge.org を見ても、どこからダウンロードできるのかいまいちわかりません。よく見ると、左のサイドバーの一番下にある [XQuartz](http://xquartz.macosforge.org/landing/) のページから .dmg ファイルをダウンロードできるのでした。
PHPで使うGoFパターン ひとり Advent Calendar - オブザーバー


## オブザーバーってなに?

オブザーバーとか大仰な名前が付いていますが要はカスケード更新したりするような時に使うパターンです。オブザーバーは日本語で言うと「観察者」くらいの意味になりますか。GUIやDOMなんかのフレームワークではよく使ってるんじゃないでしょうか? DOMのバブリングもこれだと思います。


## オブザーバーの構造

* ISubject - オブザーバーを使う側のインターフェース
* Subject - ISubjectを実装した実クラス
* IObserver - 通知を受け取るオブザーバー
* Observer - IObserver を 実装した実クラス

```PHP
<?php
interface ISubject {
  public function add ( $observer );
  public function remove ( $observer );
  public function notify ( $e );
}

interface IObserver {
  public function recieve ( $music );
}

class Radio implements ISubject {
  private $_List      = array ();
  private $_MusicList = array ();
  public function __construct () {
  }

  public function add ( $observer ) {
    if ( !( $observer instanceof IObserver ) )
      throw new Exception ( '無理じゃね?' );
    $this->_List[] = $observer;
  }

  public function remove ( $observer ) {
    $tmp = $this->_List;
    foreach ( $tmp as $obj ) {
      if ( $observer != $obj ) {
        $this->_List[] =$obj;
      }
    }
  }

  public function notify ( $e ) {
    foreach ( $this->_List as $obj ) {
      $obj->recieve ( $e );
    }
  }

  public function broadCast ( $music ) {
    $this->_MusicList[] = $music;
    $this->notify ( $music );
  }

  public function talk () {
    $this->notify ( 'DJの喋り' );
  }
}

class Listner implements IObserver {
  private $_Name = null;
  public function __construct ( $name ) {
    $this->_Name = $name;
  }

  public function recieve ( $music ) {
    print "$this->_Name さんが " . $music . " を聞きました\n";
  }
}

$radio = new Radio ();
$radio->add ( new Listner ( 'Larry' ) );
$radio->add ( new Listner ( 'Gates' ) );
$radio->add ( new Listner ( 'Jobs' ) );
$radio->broadCast ( 'Flim / Aphex Twin ' );
$radio->broadCast ( 'Journey to reedham / SquarePusher' );
$radio->talk ();
```

例では少なかったですがSubjectが何かするたびに、
必要があれば、ちょくちょくnotifyをキックするイメージです。
notifyで渡す引数は、もっと汎用的に状態を通知出来るオブジェクトとかでも良いです。
例えば、JavaScriptのイベントの仕組みでは event というオブジェクトだったりします。

## 実際どうなの?
パターンと言うには単純で適用範囲も実アプリでは少なそうに見えますが、
例えば、ORマッパーでキー値が更新された時にnotifyして連鎖更新するの
なんかにも使えますね。
Unitテストは割とし易いと思います。
Vimでカッコ系言語のカッコを色分けして見やすくする

[RainbowParentheses](https://github.com/kien/rainbow_parentheses.vim)というのを見つけた。

以下は、schemeファイルを開いたときに有効化する設定。

~~~~~vim:.vimrc
Bundle 'kien/rainbow_parentheses.vim'

augroup MyAutoCmdFileType
  autocmd! MyAutoCmdFileType
  "...
  autocmd Filetype scheme :RainbowParenthesesToggle
augroup END

let g:rbpt_max = 7
let g:rbpt_loadcmd_toggle = 0
~~~~~

![](https://img.skitch.com/20120801-g943pcfnis91f9siytd2igmpji.jpg)

g:rbpt_maxの値は利用するカッコ色の数。

![](https://img.skitch.com/20120801-qxu3ja1g7h5grxaywrba5s33c3.jpg)

READMEでは16色くらいまで設定してたのでもっといけるんじゃないかな
HSIカラー空間への変換(oF)

HSI testApp::RGBtoHSI(unsigned char r, unsigned char g, unsigned char b)
{
    HSI hsi = {0.0f, 0.0f, 0.0f};
    
    unsigned char max, min;
    
    // get Max
    if (r > g) max = r;
    else max = g;
    if (b > max) max = b;
    // get Min
    if (r < g) min = r;
    else min = g;
    if (b < min) min = b;
    
    if (max == min) {
        hsi.h = -1.0f;
        hsi.s = 0.0f;
        hsi.i = (float)max / 255.0f;
        return hsi;
    }
    
    // calc Hue
    if (max == r) 
        hsi.h = (float)(M_PI/3 * (((float)g - b)/(max - min)));
    else if (max == g)
        hsi.h = (float)(M_PI/3 * (((float)b - r)/(max - min)) + 2 * M_PI / 3);
    else if (max == b)
        hsi.h = (float)(M_PI/3 * (((float)r - g)/(max - min)) + 4 * M_PI / 3);
    if (hsi.h < 0.0f) hsi.h += 2 * M_PI;
    
    // calc Saturation
    hsi.s = (max - min) / max;
    
    // calc Intensity
    hsi.i = max / 255.0f;
    
    return hsi;
}
XOOPSモジュール開発者のための.gitignore


自分の開発中のモジュールだけ git で管理したい場合にする設定です。

```text:.gitignore
/html/.*
/html/*.*
/html/class/
/html/common/
/html/core/
/html/images/
/html/include/
/html/install/
/html/kernel/
/html/language/
/html/preload/
/html/themes/
/html/uploads/
/html/modules/*.*
/html/modules/legacy*/
/html/modules/user/
/html/modules/profile/
/html/modules/message/
/html/modules/stdCache/
/xoops_trust_path/.*
/xoops_trust_path/*.*
/xoops_trust_path/cache/
/xoops_trust_path/libs/
/xoops_trust_path/modules/
/xoops_trust_path/settings/
/xoops_trust_path/templates_c/
/xoops_trust_path/vendor/
/docs/*
/extras/*
!/xoops_trust_path/composer.json
```

XOOPSのコア自体も含めた一般的なプロジェクトでは、[XOOPS, TOKYOPen開発時の.gitignoreとか.git/info/excludeの設定](http://qiita.com/items/5afd757e814f116a8bae)のほうが参考になると思います。
bulkInsertとapplyBatchのアトミック性を保証する

デフォルトでは、bulkInsert,applyBatch共にアトミック性は保証されていません。
詳細：http://yuki312.blogspot.jp/2012/07/androidbulkinsertapplybatch.html

```java:bulkInsert
public int bulkInsert(Uri uri, ContentValues[] values) {
    SQLiteDatabase db = MyDataBase.getInstance(getContext())
            .getWritableDatabase();
    db.beginTransaction();
    try {
        SQLiteStatement insertStmt = db
                .compileStatement("INSERT INTO test "
                        + "(name) VALUES (?);");
        for (ContentValues value : values) {
            insertStmt.bindString(1, value.getAsString("name"));
            insertStmt.executeInsert();
        }
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }
    ...
```

```java:applyBatch
@Override
public ContentProviderResult[] applyBatch(
        ArrayList<ContentProviderOperation> operations)
        throws OperationApplicationException {
    SQLiteDatabase db = MyDataBase.getInstance(getContext())
            .getWritableDatabase();
    db.beginTransaction();
    try {
        ContentProviderResult[] result = super.applyBatch(operations);
        db.setTransactionSuccessful();
        return result;
    } finally {
        db.endTransaction();
    }
}
```
javascript初心者によく教えること


色々な人に同じことを教えている気がするのでまとめておく。
他の言語でもいいので、変数、分岐、繰り返し、関数くらいがわかってたら、下のことにとりかかっても早くない。

上の方が効果/学習コストが高い。

##困ったらChromeデバッガ
とにかく困ったらChromeデバッガを使う。jsもcssもhtmlもChromeデバッガを使って確認する。
使い方は一通り勉強した方がいい。

##とりあえずjQueryとcoffeescriptを使う
jsのmvcフレームワークとかに比べると学習コストが激安。
初心者であれば、とりあえず使っておいて間違いない。


##検索は、「javascript+◯◯」ではなく、「jquery+◯◯」
生jsを排除してなるべくjQueryに寄せて書くことで、IE対応を減らせる。記述量も減る。

##変数を一つのグローバルなオブジェクトにまとめて格納する
名前空間の汚染を小さくするために、状態保存用のwindowオブジェクトプロパティ(≒グローバル変数)は一つのアプリケーションで一つだけしか使わないようにする。

```javascript:
//ダメな例
foo = 1
bar = 2
```
```javascript:
//良い例
window.hoge = {}
hoge.foo = 1
hoge.bar = 2
```
##クロージャを覚える
外に出さなくてもいい変数は隠蔽する。下記では、fooが隠蔽されている。隠蔽は、coffeescriptのclassを参考にするとわかりやすいと思う。

```javascript:
func = function(){
  var foo = 0;
  return function(){
    return foo = foo + 1;
  }
}
bar = func()
bar()//->1
bar()//->2
bar()//->3
```
##副作用のない書き方を覚える
jsは並列っぽい動き方をする上にスコープがわかりにくいので、意図しないところで変数が上書きされやすい。再帰関数、無名オブジェクト、無名関数を利用する。
##テストを書くな
宣伝です。テストコードを書かないでリグレッションテストができるテスティングツールporkyをつくったので、使ってみてください。
https://github.com/puriketu99/porky
Classの登録はどうするの？ - Metro App (Javascript)


WinJS.Class.define() を使って、いざクラスを登録してみたが、
どこからも参照できない…！
という悲しい状況に陥ってしまった方、いらっしゃいませんか？？

はいー( ´ ∇ ` )ﾉ

…冷静に考えると、わかりますね。
Namwspace に登録する必要があります。

そんなとき、Class.define の使い方が、とてもずばりわかりやすいサンプルが、
なんと Namespace のページにありました！

ここ ↓
[Organizing your code with WinJS.Namespace (Metro style apps using JavaScript and HTML)](http://msdn.microsoft.com/en-us/library/windows/apps/Hh967793.aspx)

以下、該当部分の引用です。

>
```js
WinJS.Namespace.define("Robotics", {
    Robot: WinJS.Class.define( function(name) {
            this.name = name;
        }, 
        { modelName: "" }, 
        { harmsHumans: false, obeysOrders: true })
});
var myRobot = new Robotics.Robot("Mickey");
myRobot.modelName = "4500";
var harm = Robotics.Robot.harmsHumans; 
```

----
リファレンスは少しずつでも隅々まで根気よく読み込んでいくと、
たくさんのヒントが埋まっていて、わくわくしますね！
アクセス解析ツールのmixpanel導入してみた


最近のいけてるサイトでよく使われているmixpanelを使ってみました。
やりたいことはWebサイトのイベント監視をシンプルにわかりやすくってだけです。


## mixpanelの登録と料金
こちらから登録できます。
https://mixpanel.com

mixpanelはPVベースではなくイベントベースなので、課金もPVではなくイベント単位になります。イベントのことをデータポイントと呼んでいます。

データポイント数は、25,000まで無料となっています。
サイトにバナーを貼って申請すると、加えて175,000データポイント、合計200,000まで無料になります。

ちなみに無料プランの次は、500,000データポイントで$150です。ちょっと高いです。。

一見高すぎて使えねーや、と感じるかもしれませんが、PVではなくイベントでの課金なのですね。
なので本当に見たいイベントだけに絞って設定することで、無料の範囲内で使うのがいいと思います。
全体のPVとかはGoogle Analyticsを併用して見れば良いですね。


## 初期化スクリプトを埋め込む

mixpanelでデータを計測するためには、まずHTML内に初期化スクリプトを埋め込む必要があります。
以下の自動生成コード＋init呼び出しの2つを連続して、ページロード時に走る場所に貼り付けます。

```HTML:自動生成コード
(function(c,a){var b,d,h,e;b=c.createElement("script");b.type="text/javascript";
  b.async=!0;b.src=("https:"===c.location.protocol?"https:":"http:")+
    '//api.mixpanel.com/site_media/js/api/mixpanel.2.js';d=c.getElementsByTagName("script")[0];
  d.parentNode.insertBefore(b,d);a._i=[];a.init=function(b,c,f){function d(a,b){
    var c=b.split(".");2==c.length&&(a=a[c[0]],b=c[1]);a[b]=function(){a.push([b].concat(
      Array.prototype.slice.call(arguments,0)))}}var g=a;"undefined"!==typeof f?g=a[f]=[]:
    f="mixpanel";g.people=g.people||[];h=['disable','track','track_pageview','track_links',
    'track_forms','register','register_once','unregister','identify','name_tag',
    'set_config','people.set','people.increment'];for(e=0;e<h.length;e++)d(g,h[e]);
    a._i.push([b,c,f])};a.__SV=1.1;window.mixpanel=a})(document,window.mixpanel||[]);
```
```HTML:init
mixpanel.init("token", {
  track_links_timeout: 2000
});

```

initの"token"の箇所は自分のアカウントのトークンを設定します。
トークンはこちらで確認できます。
https://mixpanel.com/account/

track_links_timeoutというのは、イベント記録の取りこぼし防止用のミリ秒設定です。
デフォルトは300msなのですが、実験中フォーム送信が記録されたりされなかったりで悩まされました。
とりあえず2秒くらいに設定してみました。

## イベントを記録
イベントの記録はmixpanel.trackメソッドを呼び出します。

```JavaScript:track
mixpanel.track("event name", {
  key: value
});
```

上の例のように任意のデータをイベントに追加できます。ここで設定したキーで集計データを絞り込みしたりできるので、かなり便利です。


## フォーム送信を記録
記録したいイベントって単なるボタンクリックではなくフォーム送信であることが多いと思います。
フォーム送信のイベント記録はtrackでもできますが、専用のtrack_formsというメソッドが用意されています。

```JavaScript:track_forms
mixpanel.track_forms('#formId', 'event name', function(form) {
  return {
    key: $("[name='key']", form).val()
  };
});
```

第1引数は対象フォームのCSSセレクタ表現です。第2引数はイベント名。第3引数は追加で記録する情報を返す関数になります。
この関数で自由にフォーム内のフィールドを引っ張ってきてデータを設定します。


## まとめ
以上、コードベースでのざっくりmixpanel紹介でした。
mixpanelの良さはGUIのデータ集計画面にあるので、ぜひぜひ登録していじってみてください。

あとGoogle Analyticsにもイベント機能はあるのですが、いまいちわかりにくいです。
そこでPVベースの自動集計はGoogle Analytics、イベント監視はmixpanelというように役割を分けて、両方使うというのがいいんじゃないかと思っています。
多分皆さんそうしてるんじゃないかな。
JsonSerializableを実装してjson_encode()と仲良くなる


PHP 5.4で追加された [`JsonSerializable`](http://php.net/manual/ja/class.jsonserializable.php) インターフェイスを実装すると、オブジェクトに対して `json_encode()` できるようになります。

```php
<?php

class Foo implements JsonSerializable
{
	public function jsonSerialize()
	{
		return array('foo', 'bar', 'baz');
	}
}

var_dump(json_encode(new Foo())); // string(19) "["foo","bar","baz"]"
```

最近はバックエンドとフロントエンドをJSONでやりとりする場合がありますが、モデルクラスに対して `JsonSerializable` を実装しておけば、よりシームレスな感覚でモデルオブジェクトをやり取りできますね。
Throttleを実装してみる

resizeやmousemoveなど、多数発火するイベントを間引く処理の実装。


```javascript
function Throttle(ms) {

    var _timer,
        prevTime;

    function exec(func) {

        var now = +new Date(),
            delta;

        if (typeof func !== 'function') {
            return false;
        }

        if (!prevTime) {
            func();
            prevTime = now;
            return;
        }

        clearTimeout(_timer);
        delta = now - prevTime;
        if (delta > ms) {
            func();
            prevTime = now;
        }
        else {
            _timer = setTimeout(function () {
                func();
                _timer = null;
                prevTime = now;
            }, ms);
        }
    }

    return {
        exec: exec
    };
}

/*! --------------------------
	使用例
------------------------------ */
var throttle = new Throttle(1000),
	i = 0,
	timer;

timer = setInterval(function () {
    i++;
    if (i > 10) {
        clearInterval(timer);
        console.log(i);
        return false;
    }
    var j = i;
    throttle.exec(function () {
        console.log(j);
    });
}, 32);
```
MacでiPhoneシミュレータを一発起動


XCodeをインストールすると、iPhoneシミュレータがついてくるが、単体で起動する方法が面倒だったのでメモ。


XCodeに付属のアプリは、以下のディレクトリにエイリアスがある。

```shell
$ open /Applications/Xcode.app/Contents/Applications/
```

Finderで開いて、エイリアスをコピーし、アプリケーションフォルダに放り込めば LaunchPad にも表示されます。

このフォルダの中には他にも

+ Accessibility Inspector.app
+ Application Loader.app
+ FileMerge.app
+ Instruments.app
+ OpenGL ES Performance Detective.app
+ Printer Simulator.app
+ iPhone Simulator.app

等等。

あと[iWebinspector](http://www.iwebinspector.com/)を一緒に入れるととても便利です。
テーブルビューにピッカー表示

カスタムセルにテキストフィールドを配置して
カスタムセルをテーブルを(動的に複数行)表示しています。
ナビゲーションバーに確定ボタンを配置しいます。


下記が分かりません。
ご教授頂けますでしょうか？


1.テキストフィールドをタップするとピッカー表示->テキストフィールドに値をセット
2.確定ボタンを押下するとテキストフィールドに入力された全ての値(複数行)を取得する。


何卒、宜しくお願い致します
特定のサーバでssh接続に時間がかかる

特定のサーバにsshでつなごうとするとやたらと接続に時間がかかった(1分くらい)のでその時の対処を記録しておきます。

`ssh -v`で接続すると、

```
 .
 .
 .
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
Credentials cache file '/tmp/krb5cc_1000' not found

debug1: Unspecified GSS failure.  Minor code may provide more information
Credentials cache file '/tmp/krb5cc_1000' not found

debug1: Unspecified GSS failure.  Minor code may provide more information


debug1: Unspecified GSS failure.  Minor code may provide more information
 .
 .
 .
```

このあたりで時間がかかっていたので、`GSSAPIAuthentication`を使わないように`~/.ssh/config`で設定します。

```
Host *
    GSSAPIAuthentication no
```

根本的解決ではないのですが、私の場合`GSSAPIAuthentication`は使わないので。
Smartyでのtry-catch的な書き方


動的にファイルをincludeする場合など。

```smarty
<{* try *}>
<{capture assign="try"}>
	<{include file=$include_file}>
<{capture}>
<{if $try|trim}>
	<{$try}>
<{else}>
<{* catch *}>
	<div style="color:red">Something wrong…!</div>
<{/if}>
```

* デミリタはJavaScriptやCSSとかぶるので`<{` `}>` に変更してます。