OmniAICreator/Qiita-1.07M huggingface dataset:
NeoBundleのインストール

# 必要なもの
NeoBundleはPCにGitがインストールされている必要があります。

# インストール
## NeoBundleのインストール
1. .vimフォルダ以下にbundleフォルダを作成
2. 作成したbundleフォルダにneobundle.vimをクローン

```sh
$ mkdir -p ~/.vim/bundle
 $ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

## 設定
公式サンプルからとりあえず最低限の設定のみ抜粋
.vimrcに次の内容を書いておけば、最低限利用できます。

```vim:.vimrc
"--------------------------------------------------------------------------
" neobundle
set nocompatible               " Be iMproved
filetype off                   " Required!

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#rc(expand('~/.vim/bundle/'))

filetype plugin indent on     " Required!

" Installation check.
if neobundle#exists_not_installed_bundles()
  echomsg 'Not installed bundles : ' .
        \ string(neobundle#get_not_installed_bundle_names())
  echomsg 'Please execute ":NeoBundleInstall" command.'
  "finish
endif
```
## プラグインの取得
さらに、次のように.vimrcに追記して、`:NeoBundleInstall`を実行するとプラグインが`.vim/bundle`フォルダ以下に追加され、利用できるようになります。

```vim:.vimrc
"GitHubリポジトリにあるプラグインを利用場合
NeoBundle 'tpope/vim-fugitive'

"GitHub以外のGitリポジトリにあるプラグインを利用する場合
NeoBundle 'git://git.wincent.com/command-t.git'

"Git以外のリポジトリにあるプラグインをを利用する場合
NeoBundle 'http://svn.macports.org/repository/macports/contrib/mpvim/'
 NeoBundle 'https://bitbucket.org/ns9tks/vim-fuzzyfinder'
```

以上を追記してから、vimを立ち上げて下記コマンドを実行

```
:NeoBundleInstall
```

# 参考情報
* [Shougo/neobundle.vim](https://github.com/Shougo/neobundle.vim)
* [NeoBundleの導入](http://qiita.com/items/1c32d3f24cc2919203eb)
Trying to build Play 2.0 project with Jenkins

Assumed Environment: Amazon Linux

# Installing Jenkins
http://pkg.jenkins-ci.org/redhat/

```bash
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins
sudo /etc/init.d/jenkins start
```

check 8080 is allowed by your security group.

# Setup subversion repo
```bash
sudo yum install subversion
sudo svnadmin create /tmp/repo
```

# Install your Play
```bash
wget http://download.playframework.org/releases/play-2.0.4.zip
unzip play-2.0.4.zip
PATH=$PATH:PATH=$PATH:$HOME/play-2.0.4
```

# Create a Project
```bash
play new myproj
svn import myproj file:///tmp/repo -m "Import myproj"
```


# Configure Jenkins
http://stackoverflow.com/questions/10398543/play-framework-2-0-continuos-integration-setup
install sbt plugin

# Failed!!!

## Install sbt
http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html

```bash
sudo rpm -Uvh http://scalasbt.artifactoryonline.com/scalasbt/sbt-native-packages/org/scala-sbt/sbt//0.12.1/sbt.rpm
```

## Configure Jenkins
システムの設定:
	name: system-sbt
	jar: /usr/lib/sbt/sbt-launch.jar
Check your project is using system-sbt

# Failed!!!

## Clear action of sbt of myproj

# Success!!!!

This is the master document. http://wiki.cloudbees.com/bin/view/DEV/Playframework

# So how about testing??
Write test http://www.playframework.org/documentation/2.0.4/JavaTest

# Failed!!! (ie. build succeeded

## Configure Jenkins Project
Add dist to sbt action

# Failed!!!!!!!
Cannot run program "javac"

## Install JDK
```bash
sudo yum install java-1.6.0-openjdk-devel
```
## Configure Jenkins
Specify JDK according to http://wiki.cloudbees.com/bin/view/DEV/Playframework
	name: openjdk
	path: /usr/lib/jvm/java-1.6.0-openjdk.x86_64

# Failed!!! (ie. build succeeded

## Configure Jenkins Project
Add test to sbt action. now action is test dist.

# Succeess!!!
SBCL 1.1.2変更点まとめ

# 重要

* SBCLをWindowsで使う場合、Windows NT 5.1以降（Windows XP、Server 2003）が必要になった（Windows 2000は以後サポートされない）
* Windowsではスレッドサポートを無効にしてSBCLがビルドできるかは保証されなくなった

# 機能強化

* sb-concurrencyモジュールにfrlock追加
* SBCLをビルドするときにsb-dynamic-coreを指定することで、リンケージテーブルをサポートする環境では、コアファイルを変更せずにランタイムの再構築や再配置ができるように
* Windowsではコンソールの入出力にUCS-2を使うようになった
* Windows NT 6.1以降（Windows 7、Server 2008 R2）では、sb-thread:interrupt-threadで無名パイプの入出力に割り込み可能に
* 1.1.0で試験的に導入されたsb-safepointとそれに関連する機能をPowerPCでもサポート

# バグ修正

* Windowsコンソールからブロッキングせずに読み込む場合に、ブロッキングされることがあった問題を修正
* Windowsでのスレッドの安定性が改善された
よく使うディレクトリに別名をつける


コマンドに別名をつける方法はよく知られていると思いますが、同じようにディレクトリに別名をつけることができます。

## 文法

次のようにすると、`~エイリアス名` が `ディレクトリパス` の別名になります。

```zsh
hash -d エイリアス名=ディレクトリパス
```

## 具体例

例えば、次のように設定します。

```zsh
hash -d log=/var/log
```

すると、次のように別名を使うことができます。

```zsh
% ls ~log
（/var/log ディレクトリの内容表示）
% ls ~log/apache2
（/var/log/apache2 ディレクトリの内容表示）
% cd ~log
% pwd
/var/log
```

ほかにも、cygwin だと以下のような設定をしておくと `~desktop` でデスクトップフォルダを扱えるようになります。

```zsh
hash -d desktop="$(cygpath --desktop)"
```
Emacsの設定を便利に変えられるcustomize-groupの紹介 

# はじめに
Emacsを使っている時、ちょっとここの色変えたい、とか、ここの動作を変えたい、というのがよくあると思います。そういう時皆さんどうしてますか？elispがあんまり分からない僕なんかはぐぐっては見つかった設定をコピペする、見つからなかったら諦める日々を過ごしていました。
で、そんな中知ったcustomize-groupという関数。これを使うと、そんな生活とはおさらば出来るんです。

具体例で示しましょう。例えば、現在行のハイライトの色設定を変えてみます。

# 現在行のハイライトの色を変える
まず、customize-groupでは、いろんな設定がgroup分けされているので、今から変える設定がどのgroupに属しているのか考えます。大体その設定が書かれているelispのファイル名やmode名です。
現在行のハイライトはhl-line-modeなので、hl-lineというgroupかな、と目星をつけます。

で、`M-x customize-group`します。するとgroup名の入力を求められるので、`hl-line`と入力し、`Enter`を押します。
すると以下のような画面が出てくるはずです。

```
To apply changes, use the Save or Set buttons.                                                
For details, see [Saving Customizations] in the [Emacs manual].

                                         [ Search ]

 Operate on all settings in this buffer:
 [ Set for current session ] [ Save for future sessions ]
 [ Undo edits ] [ Reset to saved ] [ Erase customizations ]   [ Exit ]

                                                                                             
Parent groups: [Convenience]

Hl Line group: Highlight the current line.
      [ State ]: something in this group has been changed outside customize.

Hide Global Hl Line Mode: [Toggle]  on (non-nil)
   [ State ]: CHANGED outside Customize.
   Non-nil if Global-Hl-Line mode is enabled. More

Show Value Global Hl Line Sticky Flag
   Non-nil means the Global HL-Line mode highlight appears in all windows. More

Show Hl Line face: [sample]
   Face to use for `hl-line-face'.

Show Value Hl Line Face
   Face with which to highlight the current line in Hl-Line mode.

Show Value Hl Line Sticky Flag
   Non-nil means the HL-Line mode highlight appears in all windows. More
```

ここに色んなカスタマイズ出来る項目が載っているので、これをいじって、動作の確認して、保存する、という流れになります。

今設定したい項目は`Hl Line face`です。ここの`Show`にカーソルを合わせて`Enter`を押すと詳細が見れます。僕の場合以下のようになりました。

```
Hide Hl Line face: [sample]                                                                   
   [ State ]: STANDARD.
   Face to use for `hl-line-face'.
   [X] Underline: [Value Menu] Off
   [X] Background: #262626    [ Choose ]  (sample)
   Show All Attributes
```

次に`Background`の`Choose`にカーソルを合わせて`Enter`を押すと、色見本が出てくるので、好みの色の上でEnterを押すと選択出来ます。今は例なので、使いませんが青色を選んでみました。

```
   [X] Background: lightsteelblue [ Choose ]  (sample) 
```

これで設定を変えましたが、まだ反映されていません。反映させるためには`[ State ]`の上にカーソルを合わせて`Enter`を押します。すると以下のような選択肢が表示されるはずです。

```
Available choices:

0 = Set for Current Session
1 = Save for Future Sessions
2 = Undo Edits
4 = Erase Customization
6 = Add Comment
9 = For All Kinds of Displays
: = Show Lisp Expression

C-g = Quit
```

今はとりあえず、現在のセッションだけ有効にしてみます。そのために`0`を入力します。
すると、現在行の色が変わったはずです。この設定が気に食わなかったらまた設定を変えて、現在のセッションだけ有効にして確認、というのを繰り返します。それで気に入った設定を見つけたら、また`[ State ]`にカーソルを合わせ`Enter`を押した後`1`を押します。すると勝手にinit.elに設定が書き込まれ、次にEmacsを起動させた時もこの設定が有効になります。これで現在行の色設定の変更が完了しました。

また、この例では使いませんでしたが、`Show All Attibutes`にカーソルを合わせて`Enter`を押すと全てのカスタマイズ出来る項目が出てくるので、更に細かい設定が可能になります。

# おわりに
こんな感じで色設定だけでなく、色んな設定をいじることが出来ます。ぐぐって出て来なかった設定は諦める、なんて生活とはおさらばですよ！
FuelPHPでMarkdown記法を使う。(表示編)


> ブログの本文でリンクを書いたりするのに、わざわざタグを記述するのは面倒なので、巷で流行り(？)のMarkdown記法が使えるようにしました。

↓加筆修正(2012/12/4)

例えばよくあるブログシステムの記事部分みたいに、同じテンプレを多くのページで利用し、各ページの一部分の内容を管理画面から編集させるような場合に、そのページ内容の編集画面でリンクなどのタグをわざわざ記述するのは、とても面倒です。

そこでここでは、FuelPHPにおいて、巷で流行り(？)のMarkdown記法を、smartyテンプレ内で部分的に使う方法を探ってみました。

…といっても、調べてみたら[Markdownクラスが既にある][1]ので、それを利用します。

流れとしては、(DBから本文データを取得 →) Markdown::parse() → Viewに渡す → html_entity_decode で[実体参照をデコード][2]して画面表示(smarty)、という感じ。

つまり、

    Controller側：
    
    $data['str'] = Markdown::parse($str);
    ...
    return Response::forge(View_Smarty::forge('hogehoge.tpl', $data));

↓

    View側(smarty)の表示させたいところで:
    
    {$str|html_entity_decode}

だけで、ＯＫ。

…なんと、簡単なんだ。(FuelPHP…恐ろしいk

ちなみに、記事作成の時にMarkdown記法での入力を楽にする方は、[このへん](http://www.moongift.jp/2012/12/20121202/)を使うと出来そうだけど、それはおいおい…

[1]: http://fuelphp.com/docs/classes/markdown.html
[2]: http://d.hatena.ne.jp/TakiTake/20090220/p2

*References:*

* [Markdown - Classes - FuelPHP Documentation](http://fuelphp.com/docs/classes/markdown.html)
* [htmlspecialchars_decodeはやめて、html_entity_decodeで実態参照をデコード - ぬるま湯に浸かりながら](http://d.hatena.ne.jp/TakiTake/20090220/p2)

---

追記(2012/12/4)：

( thanks ワテさん [@aWebprogrammer](https://twitter.com/aWebprogrammer) )

Twitter の方で、「[View_Smarty じゃなくて View_Markdown もあるよ](https://twitter.com/aWebprogrammer/status/275656748910665730)」との反応を頂きました。
今回、Markdown → smarty なんてやり方をしているのは、まさに[指摘通り](https://twitter.com/aWebprogrammer/status/275657502203461632)で、

1. テンプレ(View)は、デザイナがsmartyを使ったりだったり、htmlだったりで作成
2. 開発者が、1. のテンプレにシステムからの動的な値を当て込む(ここで、smarty化)
3. 同一テンプレの各ページで一部分を、(html？なにそれ？な)一般ユーザが、管理画面的なところから編集する(Markdown)

というフローを暗黙に想定しているからです。

ちなみに、View が Markdown で書かれていれば(デフォルトは *.md)、Controller で、

    return Response::forge(View_Markdown::forge('hoge.md'));

とすれば、ＯＫです。

----

追記(2012/12/5)：

[『はじめてのフレームワークとしてのFuelPHP』](http://tatsu-zine.com/books/fuelphp1st)でおなじみの鈴木憲治氏 [@kenji_s
](https://twitter.com/kenji_s) から「[エンコードして、後でhtml_entity_decodeするとかわけわからん](https://twitter.com/kenji_s/status/275821004893335556)」と暖かい(！)反応を頂きました。

まさにその通りで、そうならないためには、fuel/app/config/parser.php で、

   	'View_Smarty'   => array(
        ...
        'auto_encode' => false,

とすれば、View では、

    {$str}

で済みます。
Ember.js データとテンプレートのバインディング

今日は、Ember.js によるデータとテンプレートのバインディングの方法を説明します。

Ember.jsアプリケーションは、Handlebarsテンプレートエンジンを使って、HTMLへの値の埋め込みを記述します。
他のMVCフレームワークと同様、表示要素の単位をViewと呼びます。
Ember.jsのViewは、Handlebarsテンプレートと、Ember.Viewを継承したクラスのインスタンスから構成されます。Viewクラスは表示に必要な情報をメンバとして持ち、テンプレートは情報の表示方法を記述します。

実際のサンプルを見てみましょう。

```js
var App = Ember.Application.create();
  
App.ApplicationView = Ember.View.extend({
  lhs: 6, 
  rhs: 7,
  answer: function () {
    return this.get('lhs') * this.get('rhs');
  }.property('lhs', 'rhs')
});

```

ネームスペースとしてEmber.Applicationクラスのインスタンスを作成します。これはお約束です。
次にEmber.Viewを継承したViewクラスを定義します。answerメンバは、昨日説明したバインディング機能の一種、プロパティとして記述しています。
名前をApplicationViewという名前にしておくと、名前をつけてないテンプレートに対して自動的に結びつけ、アプリケーション初期化時にインスタンスを作成して描画してくれるようです。この動作は現状ドキュメントには書いてない気がします。

次に、このViewクラスの情報を表示するHandlebarsテンプレートを見ていきます。

```html
  <script type="text/x-handlebars">
    {{view Ember.TextField valueBinding="lhs"}}

    *

    {{view Ember.TextField valueBinding="rhs"}}

    = 

    {{answer}}
  </script>
```

{{ }} で囲んでる部分が、バインディングの定義です。一般のテンプレートエンジンと同様、ここにデータを埋め込むわけですが、Ember.jsのテンプレートは、値が更新されたタイミングで自動で表示を更新してくれます。

今回のサンプルだと、lhs, rhsの入力欄からユーザが値を変更すると、自動でApplicationViewのそれぞれのメンバの値が更新されます。さらに、これらのメンバを参照するように定義されているanswerの値も更新され、answerの値を埋め込んでいるテンプレートの表示も更新されます。

これを利用することで、DOMイベントのハンドラ、DOM情報の更新処理を全く書いていないにも関わらず、動的に計算結果表示を更新するアプリケーションを作成できます。

では実際にサンプルの動作を体験してみてください。

http://kmdsbng.github.com/emberjs_multiplier_sample/

データバインディングの強力さを実感していただけたのではないでしょうか。
色々なbreakpointを使ったJSデバッグ

Google Chromeのとても優秀なDeveloper Tools，の中でもよく使うブレークポイントの機能について簡単に紹介します．単純なブレークポイント以外にもJS特有の機能があるのだけれど，あまり使っている人を見ることがないので…
この投稿を読んだ後にはconsole.logやalertでprintデバッグをすることはないでしょう．

![](http://dl.dropbox.com/u/164559/screenshots/20121204_004822.png)

## 色々なBreakponts
Developer Toolsのブレークポイントは，ソースコードの特定の行でbreakするという一般的なブレークポイント以外にもいくつかあります．上部写真の右側のメニュー参照

- Breakpoints
 - 普通のbreakpoint
- DOM Breakpoints
 - Developer ToolsのElementsタブでDOMを右クリック→Break on...にて指定．特定のDOMのサブツリーや属性が変更されたとき，また該当DOMが削除されたときなどを指定してbreakする
- XHR Breakpoints
 - 指定した文字列を含むURLにリクエストが飛んだときにbreak．
- Event Listener Breakpoints

機能は名前とセクションを見た通りという感じです．

## breakさせて何をするか
- 右のScope Variablesセクションからそのスコープにある変数の値チェック
- コンソールを開いてメソッド呼び出し
- 右上メニューからステップ実行して動きを見る

など．色々試してみてください．

## おまけ
右下の歯車をクリックすると色々設定できます．ショートカットキー一覧が見られるのも便利．

## まとめ
JSデバッグ時になんとなく適当にconsole(+単純なbreakpoints)だけ使っている人も多いと思いますが，Developer Toolsのあちこちを一度クリックしてみると面白いです．
Clojure のリーダーマクロについて

[lispリーダーマクロアドベントカレンダー](http://qiita.com/advent-calendar/2012/lisp-reader-macro) の４日目の記事です。Clojure 初心者向けに書いてみました。[Gistのここ](https://gist.github.com/4195740)に置きました。
98%のプログラマはjsのテストを自動化していない(俺調べ)

私が今年イベントで喋ったプログラマはたぶん50人近くいて、その度にJSのテストについて話を伺っておるのですが、ちゃんとJSのテスト書いてる人は1人しかいませんでした。html5カンファレンスの会場でオーディエンスに聞いた時もjsのテストを書いている人は2%くらいしかいませんでした。その多くが、書いた方がいいってのはわかってるんだけどねぇ〜みたいな感じでした。


#なぜ書かないか？
テストコードを書くのがめんどうだから
テストコードを修正するのがめんどうだから
非同期なテストを書きにくいから
#じゃあ、その問題解決するからテスト自動化しようぜ
テストを書かずにテストの自動化？そんなことできるのかよ
#Porkyならできるよ！
どうやって使うの？
#jsファイルを4つ読み込むだけ
[https://github.com/puriketu99/porky](https://github.com/puriketu99/porky)からcloneして、必要なファイルを読み込む

```sh:clone
git clone https://github.com/puriketu99/porky.git
```

```html:必要なjavascriptファイルを読み込む
<script src="/porky/jquery.js"></script>
<script src="/porky/indexeddb.shim.js"></script>
<script src="/porky/jquery.indexeddb.js"></script>
<script src="/porky/porky.js"></script>
```

#テストの登録は？
下記の関数をテストケースに登録する場合を考えます。

```coffeescript:テスト対象の関数
append = function(){$("body").append("test case1");};
```

javascriptコンソールから、下記を実行します。

```javascript:console
>porky.register({name:"test1",func:"append"})
```

nameはテストの名称、funcは関数の名前です。
ajaxの場合は、is_ajax:trueを引数のオブジェクトに追加してください。
これでテストの登録は完了です。

#テストの実行は？

Chromeのjavascriptコンソールから下記を実行します。

```javascript:console
>porky.run()
```

pokry.runを実行すると、下記のようにテスト結果がconsole上に出力されます。

```yaml:結果
Porky 
  Runner
  test1 
    UI test 
      success 
    JSON test 
      success 
  test1: 13ms 
Porky: 25ms 
```

フィードバックがあればよろしくお願いします。
https://github.com/puriketu99/porky
Tweenライブラリ　GoKitの紹介

# GoKit

## GoKitってなに？→Unityで使えるTweenライブラリです

Unityで使うTweenライブラリといえば「iTween」や、「NGUI」に含まれるTween機能を使うことが多いのではないかと思いますが、実はplugin職人さんで有名な”prime31”さんもTweenライブラリを作ってらっしゃいましたので紹介します！
http://prime31.github.com/GoKit/

”Lightweight tween library”　__軽い！__（らしい）
しかも__無料！__（←ここ重要）

## ソース

#### ■githubから最新版のソースがDLできます！
http://prime31.github.com/GoKit/

#### ■Unity Asset Storeにもあります！
http://u3d.as/content/prime31/go-kit-tween-library/339

## 使い方

すごく丁寧な動画がアップされています！
#### ■Getting Started
http://www.youtube.com/watch?v=DHiVdp2peCQ

動きを視覚的に見やすくするエディタスクリプトがついてます！
#### ■Visual Path Editor Demo
http://www.youtube.com/watch?v=wbD51ZWUw34

## ドキュメント

リファレンスなどドキュメントはこちら！
#### ■GoKit Documentation
http://prime31.com/unity/docs/#goKitDoc

#### ■wiki
https://github.com/prime31/GoKit/wiki

## サンプル

DLしたファイルの中の"Demo"ディレクトリの中にサンプルシーンが入っているのでそれを確認してください！


以上、手抜き感溢れてましたが紹介でした。
TeXでの行間の調整方法

TeXで，論文やドキュメントを書いていると
・章のタイトルだけ前のページの最後に位置し，１行目が次のページにはみ出てしまう
・末尾が１行だけ次のページにはみ出してしまう
・８ページに収めたいのに９ページになってしまう
などの問題があります．
もちろん，文章をいじったり，図表を拡大縮小したりすることで多少の調整は可能ですが，どうしてもどこもいじれなくなってしまうこともあると思います．
そんな時は，行の間隔を調整しましょう．

## 箇条書きの調整
![](http://gyazo．com/7b89993b72e222408b0317014d8ba2f6．png)

縦方向の間隔を調整するためには，\vspace{指定間隔}を使用します．また，横方向の間隔を調整するため
には，\hspace{指定間隔}を使用します．

通常

```tex:
\begin{itemize}
  \item 記号つき箇条書き
  \item 記号つき箇条書き
  \item 記号つき箇条書き
\end{itemize}
```

縦方向の間隔を縮小

```tex:
\begin{itemize}
  \item 記号つき箇条書き
  \vspace{-3mm}
  \item 記号つき箇条書き
  \vspace{-3mm}
  \item 記号つき箇条書き
  \vspace{-3mm}
\end{itemize}
```

## 行間の調整
`\baselinestretch` を利用することで，行間を調整できます．利用方法は，`\documentclass` と`\begin{document}` の間に，`\renewcommand{\baselinestretch}{倍率}` と記述します．倍率の部分を 0．8 とすると行間が 0．8 倍 になります．
逆に 1 以上の値にすると，行間を広げることができます．
文中の一部の箇所だけ行間を調整する場合には，`\begin{spacing}{倍率}調整したい文章\end{spacing}` とします．
右クリックメニューの新規作成から今日の日付フォルダーを一発で作れるようにする

※レジストリエディタを使用します
 - - -
1.HKEY_CLASSES_ROOT　の下に「Folder.yyyyMMdd」というキーを作成し、（既定）のデータに「フォルダー（yyyyMMdd形式）」と入力
2.HKEY_CLASSES_ROOT　の下に「.aaaafolder_yyyyMMdd」というというキーを作成し、（既定）のデータに「Folder.yyyyMMdd」と入力
3.前の手順で作成した　HKEY_CLASSES_ROOT.aaaafolder_yyyyMMdd　の下に「ShellNew」というキーを作成
4.前の手順で作成した　HKEY_CLASSES_ROOT.aaaafolder_yyyyMMddShellNew　に文字列値を追加し、名前を「Command」、データを

```bat:Command
cmd /c md "%1..%%date:~-10,4%%%%date:~-5,2%%%%date:~-2,2%%"
```

と入力
 - - -
こんな感じに使えるようになります。

![利用イメージ](http://cdn-ak.f.st-hatena.com/images/fotolife/a/alg-lj/20110619/20110619174652.png)
childViewControllerをスライドアニメーションで切り替える（ContainerViewController）

```objective-c
- (void)switchToViewController:(UIViewController *)viewController transition:(SwithingTransition)transition
{
  UIViewController *toViewController = viewController;
  
  if (!toViewController) {
    return;
  }
  
  UIViewController *fromViewController = self.currentEmbededViewController;
  
  if (!fromViewController) {
    // 遷移前ViewControllerが存在しない場合、そのままViewに追加
    [self addChildViewController:toViewController];
    [self.view addSubview:toViewController.view];
    [toViewController didMoveToParentViewController:self];
  } else {
    CGRect toViewStartFrame = self.view.frame;
    CGRect fromViewEndFrame = self.view.frame;
    
    // 開始、終了フレームの設定
    switch (transition) {
      case SwitchingTransitionToRight:
        toViewStartFrame.origin.x -= self.view.frame.size.width;
        fromViewEndFrame.origin.x += self.view.frame.size.width;
        break;
      case SwitchingTransitionToLeft:
        toViewStartFrame.origin.x += self.view.frame.size.width;
        fromViewEndFrame.origin.x -= self.view.frame.size.width;
        break;
      default:
        break;
    }
    
    toViewController.view.alpha = 0.0;
    toViewController.view.frame = toViewStartFrame;
    
    [self addChildViewController:toViewController];
    // 削除開始
    [fromViewController willMoveToParentViewController:nil];
    
    [self transitionFromViewController:fromViewController
                      toViewController:toViewController
                              duration:1.0
                               options:UIViewAnimationOptionTransitionNone
                            animations:^{
                              fromViewController.view.frame = fromViewEndFrame;
                              toViewController.view.frame   = self.view.frame;
                              
                              fromViewController.view.alpha = 0.0;
                              toViewController.view.alpha   = 1.0;
                            } completion:^(BOOL finished) {
                              // 追加完了
                              [toViewController didMoveToParentViewController:self];
                            }];
  }
  
  self.currentEmbededViewController = toViewController;
}
MacでPostfixを使ってGmail経由でテストメールを送信


###環境
Mac OSX 10.8.2, Postfix

#####Postfixを起動してみる

````
$ sudo postfix start
````

####Postfixの設定
````
$ sudo vi /etc/postfix/main.cf
````

リレーホストを追加する

````
relayhost = [smtp.gmail.com]:587
````

設定ファイルの最後に下記を追記する

````
#sasl setting
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
 
#tls setting
smtp_use_tls = yes
````

メールのローカル配送をMaildir形式にする

````
home_mailbox = Maildir/
#mail_spool_directory = ...
#mailbox_command = ...
````

####Gmailのアカウント情報を作成

````
sudo vi /etc/postfix/sasl_passwd  #新規作成
````

アカウント情報を記述する

````
[smtp.gmail.com]:587 hogehoge@gmail.com:(password)
````

適切な権限を設定し postmap をかける

````
chmod 640 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
````

####Maildirの作成

````
$ sudo mkdir /home/hogehoge/Maildir
$ sudo chown -R hogehoge:staff /home/hogehoge/Maildir
$ sudo chmod 700 /home/hogehoge/Maildir
````

####最後にPostfixを再起動して終了

````
sudo postfix stop
sudo postfix start
````

[参考]
http://weble.org/2012/05/10/mac-postfix
http://d.hatena.ne.jp/ramtiga/20110411/p1
http://snbhsmt.blog110.fc2.com/blog-entry-42.html
shell scriptでのgetoptsの使い方メモ


```shell
#!/bin/sh

while getopts l:a: OPT
do
    case $OPT in
        "l" ) echo "$OPTARG";;
        "a" ) echo "$OPTARG";;
    esac
done

```

`getopts l:a:` の部分がオプションの指定。
:(コロン)をつけることで、引数があることを明示。
引数があることを明示した場合、$OPTARGでその引数を取得することができる。

`$ ./test.sh -l hoge -a fuga`
↓
`$ hoge`
`$ fuga`
と出力される。

参考: http://tech.lampetty.net/tech/index.php/archives/373
Spreadsheetの独自関数をGASで作るよ☆

Google Apps Script Advent Calendar三日目です。
今日はGoogle Apps ScriptでGoogle Spreadsheet（最近Sheetsに改名されましたが）の独自関数を作ってみたいと思います。


# 独自関数の作り方

Google Spreadsheetの独自関数の作り方は簡単です。
一日目に書いたようにSpreadsheetのGAS Editorでグローバルな所に関数を書きます。
今回は受け取った値を消費税計算して返却する関数を作ってみましょう。

```javascript
function 消費税(num){
  return 1.08 * num;
}
```

これだけで独自関数が完成しました。
なお税率のところをちゃんと別定義しろとかそういう話はなしでお願いいたします。


# 独自関数の呼び出し

Spreadsheetからこの関数を呼び出す場合は任意のセルに`=消費税(100)`などのように`=関数名(引数)`の形で記述します。

なお今回は関数名を日本語にしました。もちろんアルファベットで定義しても呼び出せますが、日本語(漢字やかな)でも呼び出し可能です。

# 細かい話

これだけではAdvent Calendarの意味が無いのでちょっと細かい話を書いていきます。

## 引数

独自関数の引数はいくつでも指定可能です。（多分）
また`=関数(A1)`や`=関数(A1:B3)`の様にセルの参照を渡すこともできます。

ただし、複数のセルの参照(A1:B1やA1:B2)を渡した場合は、一行であろうと一列であろうと2次元配列の形で返却されます。

例えば`=関数(A1:B1)`の様に渡した場合は`[[A1の値, B1の値]]`が渡され、
`=関数(A1:A2)`の様に渡した場合は`[[A1の値],[B1の値]]`が渡されます。

なお可変長引数にしたい場合は通常のjavascript同様に`arguments`変数を利用して
取得してください。

```javascript:可変長引数
function 可変長引数(val1 , val2, args){
  //第三引数を可変長引数とする
  var var_args = [];
  for(var i = 2; i < arguments.length;i++) {
    var_args.push(arguments[i]);
  }
  return JSON.stringify(var_args);
}
```

なおもちろんSpreadsheetの関数結果自体を渡すことも可能です。


## 返却値

返却値には数値、日付、文字列、配列の3つのいずれかの型が返却可能です。

数値は普通に計算結果を返却してください。先ほどの消費税計算みたいな感じですね。
日付はDate型オブジェクトを返却すると、セルが日付として扱ってくれます。
文字列はまぁ並々に

そしてExcelには無いSpreadsheetの特徴として配列の返却があります。
Spreadsheetでは配列関数と呼ばれる一つのセルに記述した関数から複数のセルに結果を反映することができます。

例えばExcelでよくやる「行列を入れ替えて貼り付け」はSpreadsheetでは`=TRANSPOSE(セルへの参照)`という関数を利用します。
この関数をどこかのセルに書くとその結果が書いたセルを基準に複数のセルへ展開されます。

GASでも同様に配列値を返却すると関数が呼ばれた場所を基準に複数セルへ値が展開されます。

```javascript
function returnArray(){
   return [["1", "2"]];
}
```

上記スクリプトをGAS Editorに貼り付けて、セルから`=returnArray()`を呼び出してみてください。
関数を書いたセルに1が、隣のセルに2が反映されたと思います。

なおSpreadsheetではこの仕組を利用して、FILTER(特定データの抽出)やQUERY(SQLライクなクエリを利用した抽出)等の関数が利用できます。

今回はGASネタなのであまり書けないので是非[関数のヘルプ](https://support.google.com/drive/bin/static.py?hl=ja&topic=25273&page=table.cs)を見てみてください。

## ログ

GASでは`Logger.log(表示したいもの)`という形でログを表示しますが、
独自関数の場合はこのLoggerを利用してもログを見ることはできません。

なので対象の関数にLoggerを書いておきをGAS Editorで直接呼び出すことで挙動をテストして下さい。
ただ引数に関してはテストしづらいと思うので、

```javascript
function logger() {
  return JSON.stringify(arguments);
}
```

見たいのを作っておいて引数について見てみるとどういう値が渡ってきているかわかると思います。

## 権限

GASでは様々なサービスと連携可能なのですが、
独自関数については制限があります。

まず利用できるサービスはSOAP, UrlFetch, Google Translateと一部のSpreadsheetAppのみです。
またSpreadsheetAppは書き込み系の操作は不可能です。

https://developers.google.com/apps-script/execution_custom_functions#permissions

なので独自関数を何かの書き込み処理の起点としては利用できないということを覚えておいてください。


## グローバル変数

もし対象の独自関数が書いてあるGASプロジェクトにグローバル変数があった場合、
そのグローバル変数はセルの数だけ初期化されます。

つまり

```javascript
var hoge = ScriptProperties.getProperty("初期値");
```

のような記述がグローバル変数にあり、これが書いてある対象のプロジェクト内の独自関数を100箇所のセルで呼び出すと、100回`ScriptProperties.getProperty()`が呼び出されます。

これは最大呼び出し数の制限に引っかかる原因となるので覚えておいてください。

# まとめ

独自関数について書かせていただきました。
配列の扱いを如何にうまくやるかが独自関数の大事なポイントかなーと勝手に思ってます。
ExcelにあるけどSpreadsheetに無いみたいな関数を独自関数で作ると幸せかもしれません。
Play! framework 2.0でのi18n関連

すでにこっちに書いてしまったのでコピペ。面倒なので、整形してないです。
http://d.hatena.ne.jp/k4200/20121203/1354505611

```
 前提・環境

    Play 2.0.4
    英語・日本語の2か国語に対応
    英語がデフォルトの言語


メッセージカタログにメッセージを外出し
基本

以下の3ファイルを用意

    conf/messages.en → 英語のメッセージ
    conf/messages.ja → 日本語のメッセージ
    conf/messages → デフォルトのメッセージ

最初の2つは説明不要だと思うので、最後のに関して説明。
デフォルトのメッセージファイル

例えばviewの中で以下のような記述があり、

@Messages("index.welcome", user.name)

ユーザーの言語（これがどうやって定まるかは後述）が"ja"だとすると、messages.ja の以下の行が使われる。

#messages.ja
index.welcome={0}さん、ようこそ

仮に、この行がないと、messages の中の対応する行が使われる。

#messages
index.welcome=Welcome {0}!

実際の開発での流れ

ということで、自分なりの結論。

    messages にはデフォルトの言語の内容を入れておく（この場合は英語）
    messages.en はそれのコピーとかシンボリックリンクにしておく
    サブの言語（この場合、日本語）用のファイルは、messages の内容を翻訳

ちなみに、規模が大きくなって翻訳者とかが複数人絡むようになってくると、メッセージファイルをテキストのままで単純に管理するのは辛くなってくるので、翻訳者用のシステムとDBを用意して、そのDBからテキストファイルを出力するようにしたほうが良さそう。（Play じゃないけど、別プロジェクトではそうした）
画像
ファイルの配置

メッセージだけ多言語対応すればi18nが完了すると思っちゃだめで、画像内のテキストとかも対応する必要がある。

画像は以下の様な感じでフォルダ分けしておく。

    public/images/common → 言語関係なく使う画像（字のないアイコン、線、背景等）
    public/images/en → 英語用の画像
    public/images/ja → 日本語用の画像

viewからの参照

画像を表示する場合は、基本は後述するCSS（LESS）で対応した方が簡単だけど、view 内で直接 img タグを書きたい場合には以下のようにする。

@(param: some.Type)(implicit lang: Lang)
<!-- ↑先頭で implicit parameter として lang を受け取る -->

<img src="images/@lang.language/foo.png" />

CSS
プロジェクトの設定

Build.scala は以下のように。

    // どの less ファイルをコンパイルするか、みたいな設定
    def customLessEntryPoints(base: File): PathFinder = (
      (base / "app" / "assets" / "stylesheets" * ("*.less" -- "_*.less"))
    )

    // project 設定に、lessEntryPoints を追加。
    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here
        lessEntryPoints <<= baseDirectory(customLessEntryPoints),
    )

これで準備完了。
LESS

LESS便利だね。lessファイルの配置に関して説明。

まずはapp/assets/stylesheets というディレクトリを作成し、その配下に以下のようにファイルを作成。

    en.less
    ja.less
    _common.less （サブディレクトリに入れてもよし）

en.less はこんな感じ。ja.lessも同様に作る。

@lang: en;
@import "_common.less";

_common.less はこんな感じ。

.logo {
	background: url("/images/@{lang}/logo.png");
}

これで、en.css は以下のように生成される。

.logo {
  background: url("/images/en/logo.png");
}

LESS便利だね。
LESSのハマりポイント

とにかくエラーメッセージが分かりにくい。

LESSの行末のセミコロンがなかったり（Scalaプログラマーがよくやる間違い）、urlのダブルクォートがなかったりすると意味不明のメッセージが出る。そのメッセージでググると、Play自体のバグだとか、ライブラリのバグだとか色々情報が出てくるけど、実際は簡単なミスだったりする。

ということで、いきなりがっつり書かず、まずは簡単なLESSファイルを書いてある程度仕組みに慣れてから、徐々にやってくと良さそう。

ちなみに、出たエラーはこんなの。

EcmaError: TypeError: Cannot call method "charAt" of undefined (less-1.3.0.js#352)

まとめ

Play 2.0の多言語対応は、基本的な機能は揃っているので、どんどん海外対応のアプリ・サービスを作るといいのでは。
```
メモ：Photoshop ACV（トーンカーブ）ファイルを Objective-C で扱えるようにする

ACVObject という便利なものが github で公開されている。
https://github.com/schwa/ACVObject

GPUImage では直接フィルタをかけられる。が、うまく動作したりしなかったりする？
https://github.com/BradLarson/GPUImage
Googleスプレッドシートとスクリプトでサクッと作る地域の便利マップ

2012/11/29(木)に開催された第10回ジオメディアサミットで少しお話した内容です。
プログラムの技術的な話というよりは、ビジネス観点でのすごいんじゃない！？的な内容です。
<iframe src="http://www.slideshare.net/slideshow/embed_code/15553947" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="http://www.slideshare.net/j1008sato/gas-15553947" title="Googleスプレッドシートとスクリプトでサクッと作る地域の便利マップ" target="_blank">Googleスプレッドシートとスクリプトでサクッと作る地域の便利マップ</a> </strong> from <strong><a href="http://www.slideshare.net/j1008sato" target="_blank">Junya Sato</a></strong> </div>

#告知させてください。
Tokyo GAS 〜東京でのGoogle Apps Script勉強会・交流会〜を2012年1月18日(金)に開催します！
詳しくは、こちらをご覧いただき、お気軽にご参加ください！
http://atnd.org/event/TokyoGAS
セマンティック・バージョニングと、Gemfileのバージョン指定方法 - Gemfileでよく見る`~>`を使いこなす

ライブラリを使う時、バージョンが合わなくてうまく動かないという問題は、`Ruby`に限らず、どのプログラミング言語でも常に悩みの種である。特にDepedencyの多いライブラリをインストール/インクルードするときは、大体この問題で躓く。`C++`とかでGUI関係のライブラリを入れるときは何度も挫折したし、特に、進化が速く変更の多い`Perl`,`PHP`をはじめとしたスクリプト言語では普通にそういう問題に出くわす。

もちろん`Ruby`もその例外ではないのだが、より個人がライブラリ(gem)を作って、githubなどに上げ、公開していくという文化がある割に、あまりこの問題に悩まされないので、`Ruby(on Rails)`は比較的うまくやっていると思う。

これは、`Bundler`というツール自体の功績でもあるけれど、ライブラリを作る個人個人が、ちゃんと一定の規則に従ってバージョン付けして、依存関係を正しく`Gemfile`に書くという文化によるものが大きいと思う。なので、`Bundler`を支える文化のセマンティック・バージョニングと、`Gemfile`の書き方について紹介しようと思う。

今回は、AdventCalendarということで、あんまりRubyを使わない人にも参考になるテーマで書いてみたつもり。
他言語プログラマでも、特に、自分でライブラリを作ってみようかなと思っている人は絶対に知っておくべき。



## Semantic Versioning　(バージョン付けの規則)

バージョンには付け方があり、基本的にはこの法則に従うべきというガイドラインが存在する。
ちゃんと意味のあるバージョン付けをしましょうということなのだが、それが、Semantic Versioningという名前で以下のURLで公開されている。
http://semver.org/
http://shijimiii.info/technical-memo/semver/ (日本語訳)

ここでは、`3.2.8`のように、バージョンを常に3つの数字を`.`で区切った方法(`X.Y.Z`形式)で、指定する方法のみ説明する。なお、上のURLには`1.0.0-alpha.1`や`1.3.7+build.11.e0f985a`などのより細かい規則も載っている。

### Semantic Versioningの大原則

まず、大原則として以下のルールに則る。

> *公開APIを定め、それを基にバージョンを付ける。*

### Semantic Versioningの詳細ルール

あとは、3桁それぞれに意味を持たせ、以下のルールに従ってバージョン付けする。

- すべての公開される変更でバージョンを上げる
- 3つの数字`X.Y.Z`の意味はそれぞれ`Major.Minor.Patch`
- `Major`をあげるときは後方互換のない変更
 -  新しいAPIの公開など
- `Minor`をあげるときは後方互換のある変更
 - APIの追加、サポートを外そうとしているAPIに警告を出すなど
- `Patch`をあげるときはバグ修正
 - バグ修正の定義は、正しくない挙動を直すこと
- 安定した公式APIが定まるまでは、`0.y.z`形式にしておき、この状況では例外的にいつAPIを変えても良い

ちなみにバージョンは少数ではないので、`1.10`と`1.9`は`1.10`の方が新しいバージョンである。

### 具体例

バージョン付けの例としては、以下のような流れになる。

```
0.0.1  # Initial Version
0.0.2
0.1.0  # 0.0.2と比べて機能が大きく変わった。

1.0.0  # 多分Stableであろう、公式APIを定めた！

1.0.1
1.0.2
1.0.3
…
1.0.9
1.0.10
1.0.11
…
1.0.17  # バグだらけでいろいろ修正

1.1.0   # 追加APIを導入。ついでにバグも修正(Minorをあげるのと同時にバグ修正してもOK)

2.0.0   # 過去のしがらみを断ち切り、リニューアルしたAPIを公開
```

## GemfileでのVersion指定の仕方

例えば`hoge`という名前のgemがあったとする

### 安全に今のバージョンのみ使いたい場合

```rb:Gemfile
gem "hoge", "2.1.8"  # 2.1.8のみ使う
```

### 今後のバグ修正のみ受け入れたい場合

基本は、後方互換のある修正はすべて受け入れればよいので数字を2つだけ書いて指定する。

```rb:Gemfile
gem "hoge", "~> 2.1"  # 2.1.0以上3.0.0未満の最新のものを使用
```

例えば`devise`などの大き目のgemだったり、なんだかんだでバグ修正以外の機能追加が入ると動かなくなりそうというようなものは数字３つで指定しておく。ちゃんとガイドラインにしたがって運用されていて、公開APIが変わってなくても、推奨されるディレクトリ構成だったり、設定の仕方だったりが変わるというのもありえる。

```rb:Gemfile
gem "hoge", "~> 2.1.8"   # 2.1.8以上2.2.0未満の最新のものを使用
```

### 今後の変更は全て受け入れ最新に追従したい場合

基本は、以下のように何も指定しないでOK

```rb:Gemfile
gem "hoge"
```

公開するgemなどを作っていて、見知らぬユーザーの環境に古い`hoge`gemが入っていると困るなどという場合は以下のように`>=`を使う。

```rb:Gemfile
gem "hoge", ">= 2.1.3"  # 2.1.3以上の最新のものを使う
```

`2.1.3`の部分は頑張って自分の書いたものが`hoge`gemのどのバージョンからなら動くかを調べて埋める。`">= 2.1"`かもしれないし、`">= 1"`かもしれない。

### 参照
http://gembundler.com/gemfile.html
CGridView で関連モデルによって検索とソートをする

## リレーション : Post BELONGS_TO Author
次のような関係の二つのモデルがあるとします。

```php:Author.php
// 投稿者
class Author extends CActiveRecord {
    ...
}
```
```php:Post.php
// 記事
class Post extends CActiveRecord {
    ...
    function relations() {
        return array(
            'author'=>array(self::BELONGS_TO, 'Author', 'id_author'),
        );
    }
    ...
}
```

記事をグリッドで一覧表示するときには、投稿者名をコラムに表示して、投稿者名でソートしたり、検索したり出来るようにしたいと思うでしょう。そういう機能を提供する（私の考えでは）最善の方法を以下に述べます。

## 検索用の属性を追加する
最初に Post モデルに検索文字列を格納する新しい属性を追加します。検索文字列の格納は外部キーのカラムを使っても出来ますが、私としては、外部キーのカラムの意味をオーバーロードしない方が良いと思います。というのは、検索のシナリオでは、外部キーの ID ではなく文字列を格納するからです。この新しい属性は 'search' のシナリオで 'safe' であると宣言しなければいけません。

```php:Post.php
class Post extends CActiveRecord {
    public $author_search;
    ...
    public function rules() {
        return array(
            ...
            array('xxx,yyy,author_search', 'safe', 'on'=>'search'),
        );
    }
}
```

## 検索の実装
次にクエリ基準を組むときにこの属性を使います。具体的には、標準の実装ですべてのモデルに search() という関数が提供されていますので、その関数を修正します。このとき、Post モデルと関連する Author を一緒に取得したいので、クエリ基準の 'with' 属性を設定します。こうすると JOIN を使った単一のデータベース・クエリを実行してデータが取得されます。（こうしない場合は、関連する Author のモデルはレイジー・ローディングによって取得されることになります。その場合は、実行されるデータベース・クエリの数が 1+N 個になります。）

```php:Post.php
    $criteria = new CDbCriteria;
    $criteria->with = array('author');
    ...
    $criteria->compare('author.username', $this->author_search, true);
    ...
```

## ソートの実装
投稿者名によるソートを実現するためには、ちょっとトリッキーですが、search 関数から返す CActiveDataProvider に細工をほどこします。

```php:Post.php
    return new CActiveDataProvider('Post', array(
        'criteria'=>$criteria,
        'sort'=>array(
            'attributes'=>array(
                'author_search'=>array(
                    'asc'=>'author.username',
                    'desc'=>'author.username DESC',
                ),
                '*',
            ),
        ),
    ));
```

sort 設定の 'attributes' セクションによって、デフォルトのソート方法をオーバーロードすることが出来ます。上記の設定は、ユーザが 'author_search' フィールドでのソートを指定した場合に、どういう ORDER 句を生成すべきかを指定するものです。最後の '*' は、このモデルの他のフィールドは標準的な ORDER 句を生成すべき事を指定しています。他のフィールドも同じ方法でデフォルトのソート方法をオーバーロードすることが出来ます。（例えば、ユーザが last_name でのソートを指定した場合に、last_name と first_name の両方を ORDER 句に含めるようにすることが出来ます。）

## CGridView での使用
以上でグリッドを使用する準備は完了しました。

```php:view.php
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'title',
        'post_time',
        array('name'=>'author_search', 'value'=>'$data->author->username'),
        array(
            'class'=>'CButtonColumn',
        ),
    ),
));
```

これで、author_id の外部キーではなく投稿者名によるソートが可能になり、投稿者名の部分一致による検索が可能になりました。

## 注記
上記は [Searching and sorting by related model in CGridView](http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview) の翻訳です。
NSStringから絵文字を外す

　日々、Xcode の機嫌を伺う読者諸賢の皆様、こんばんは。これは、[Objective-C Advent Calendar 2012](http://qiita.com/advent-calendar/2012/objective-c)の3日目の記事です。以前、`NSString` な文字列から絵文字だけを除去する必要に駆られたことがあったので、不幸にも同じ事態に陥った方の為のメモを残しておきます。

###サロゲートペア（代用対）

　`NSString` は UTF-16のラッパだそうで、その文字列にはデータ長が 16bit の文字と、サロゲートペアと呼ばれる 32bit の文字が混在しています。サロゲートペアは、上位 16bit が 0xD800~0xDBFF、下位 16bit が 0xDC00~0xDFFF の範囲に収まることになっていて、ある文字がサロゲートペアかどうかは、最初の 16bit を見ることで判別できます。

###コードポイント（符号点）

　通常、Unicode は U+ から始まるコードポイントと呼ばれるもので表され、U+10000 未満に非サロゲートペア、以上にサロゲートペアが当てられています。例えば、非サロゲートペアである「A」は U+0041、「あ」は U+3042、サロゲートペアである「?」は U+1D11E、「?」は U+2F81A、といった具合です。

　プログラムで文字を扱うには、コードポイントではなくバイト列であることが望ましいです。非サロゲートペア、つまりコードポイントが U+10000 未満の文字なら数値そのまま、サロゲートペアなら以下の様な変換を噛ませることでバイト列を得ることができます。

#####コードポイントからバイト列

```objectivec
const int codepoint = …;
const unichar high = (codepoint - 0x10000) / 0x400 + 0xd800; // high surrogate
const unichar low = (codepoint - 0x10000) % 0x400 + 0xdc00; // low surrogate
```

#####バイト列からコードポイント

```objectivec
const unichar high = …; // high surrogate
const unichar low = …; // low surrogate
const int codepoint = ((high - 0xd800) * 0x400) + (low - 0xdc00) + 0x10000;
```

###実装

　実装例です。`for` 文を回して `characterAtIndex:` メソッドで文字を拾おうとすると、サロゲートペアかどうかお構いなく文字列を分割してしまうので、`enumerateSubstringsInRange:options:usingBlock:` メソッドを使います。

```objectivec
@interface NSString (RemoveEmoji)

- (NSString*)removedEmojiString;

@end

@implementation NSString (RemoveEmoji)

- (NSString*)removedEmojiString {
   NSMutableString* __block buffer = [NSMutableString stringWithCapacity:[self length]];
    
    [self enumerateSubstringsInRange:NSMakeRange(0, [self length])
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {         
         const unichar high = [substring characterAtIndex: 0];
         
         // Surrogate pair (U+1D000-1F77F)
         if (0xd800 <= high && high <= 0xdbff) {
             const unichar low = [substring characterAtIndex: 1];
             const int codepoint = ((high - 0xd800) * 0x400) + (low - 0xdc00) + 0x10000;
             
             [buffer appendString: (0x1d000 <= codepoint && codepoint <= 0x1f77f)? @"": substring];
             
         // Not surrogate pair (U+2100-27BF)
         } else {
             [buffer appendString: (0x2100 <= high && high <= 0x27bf)? @"": substring];
         }
     }];
    
    return buffer;
}

@end
```

とりあえず、除外する範囲を U+1D000-1F77F と U+2100-27BF としていますが、わりと適当に決めた範囲なので不足があると思います。絵文字の範囲は、正直よくわかりません。適宜変更してください（丸投げ）。

###その他

　サロゲートペアは、上位サロゲートと下位サロゲートを並べて書式 `@"%C%C"` で表示や生成ができます。

```objectivec
NSLog(@"%C%C", [@"?" characterAtIndex:0], [@"?" characterAtIndex:1]);
NSString* g_clef = [NSString stringWithFormat: @"%C%C", [@"?" characterAtIndex:0], [@"?" characterAtIndex:1]];
```

###終わりに

　日本語版の Wikipedia に、コードポイントの分類などが非常に見やすくまとまっていたので、参照してみてください。

> [Unicode - Wikipedia](http://ja.wikipedia.org/wiki/Unicode)

###追記

　CocoaPods に登録しました。どうぞ、可愛がってやってください。

> [woxtu/NSString+RemoveEmoji](https://github.com/woxtu/NSString-RemoveEmoji)
Ember.Objectが提供するデータバインディング機能

Ember.jsのデータバインディングの仕組みについて説明します。

Ember.Objectクラスがデータバインディングの機能を提供しています。
Ember.View、Ember.Controllerなどの、Ember.jsアプリケーションを構成するクラスは Ember.Object クラスを継承しているので、それらのクラスではデータバインディング機能を利用できます。

(Ember.Objectクラスのインスタンスを作るには、Ember.Object.create()メソッドを使います。
Ember.Objectクラスを継承したクラスを作るには、Ember.Object.extend()メソッドを使います。)


Ember.jsはデータバインディングのために、プロパティ、オブザーバ、バインディングという機能を提供しています。それぞれ説明します。

## プロパティ

他のメンバを参照するメンバを定義します。参照先に、他のプロパティを指定することもできます。
参照先のメンバが更新されると、プロパティの値も更新され、プロパティを参照しているプロパティ/オブザーバ/バインディングにも更新を通知します。

```js
var Multiplier = Ember.Object.extend({
    lhs: 6,
    rhs: 7,
    answer: function () {
        return this.get('lhs') * this.get('rhs');
    }.property('lhs', 'rhs')
});

var multiplier = Multiplier.create();

multiplier.get('answer'); // => 42

multiplier.set('rhs', 3);

multiplier.get('answer'); // => 18
```

## オブザーバ

他のメンバの値が更新された時に実行したい処理を記述できます。
値変更によって付随的に行う処理は、プロパティではなくオブザーバに処理を書くことが推奨されています。

```js
var security = Ember.Object.create({
  securityLevel: 5
});

security.addObserver('securityLevel', function() {
  alert('セキュリティレベルが' + this.get('securityLevel') + 'に変わりました');
});
security.set('securityLevel', 3); // => オブザーバが実行され、alertポップアップが表示される。
```

以下の書き方でもOKです。

```js
var security = Ember.Object.create({
  securityLevel: 5,
  securityLevelChange: function() {
    alert('セキュリティレベルが' + this.get('securityLevel') + 'に変わりました');
  }.observes('securityLevel')
});
```

## バインディング

他のEmber.Objectインスタンスのメンバを参照する関連を定義します。
バインディングを使うには、ネームスペースとしてEmber.Applicationのインスタンスを作成する必要があるみたいです。
(普通にグローバル変数に入れたオブジェクトの値はバインディングできませんでした。)
バインディングの参照先の値が更新されると、バインディングの値も更新され、バインディングを参照しているプロパティ/オブザーバ/バインディングにも、値の更新が通知されます。

```js
MyApp = Ember.Application.create();

MyApp.capital = Ember.Object.create({
  name: "東京"
});

MyApp.country = Ember.Object.create({
  capitalNameBinding: 'MyApp.capital.name'
});

// Later, after Ember has resolved bindings...
MyApp.capital.get('name'); // => "東京"
MyApp.country.get('capitalName'); // => "東京"

MyApp.country.set('capitalName', 'ネオサイタマ');

MyApp.capital.get('name'); // => "ネオサイタマ"
MyApp.country.get('capitalName'); // => "ネオサイタマ"
```

これら3つの機能を理解すれば、Ember.jsのデータバインディングの動作をすべて理解したことになります。
バージョンに依存した zshrc の書き方


同じ zshrc を複数の環境で使っているとたまにあることですが、古いバージョンだと無効な設定があったりしておこられることがあります。

以前は `zsh --version | awk '{print $2}'` みたいな感じでバージョンを取得して "." で split して比較してた頃もありました。

これだと細かいバージョンの指定をしようとするとめんどくさかったりします。
同様のことを is-at-least を使えば簡単にできますよっていうお話です。

例えば vcs_info を使おうとした際は 4.3.10 以上となるので以下のようにかけばおkです

```~/.zshrc
autoload -Uz is-at-least
if is-at-least 4.3.10; then
    autoload -Uz vcs_info
	
    # ここに vcs_info に関わる設定をかく
fi
```

これでバージョンに依存した設定でも気軽にかけますね！

## おまけ
```~/.zshrc
REPORTTIME=3
```
３秒以上時間がかかった際に実行後、以下のように出力されます

> $ perl hoge.pl
> perl hoge.pl 3.38s user 3.10s system 32% cpu 38.203 total

これ地味に便利です！
eclipse環境構築memo

# Plugin

## Basic
* Quick JUnit
* Eclipse Color Theme
* Mchr3k - JDEclipse-Realign - http://mchr3k-eclipse.appspot.com/
* Glance
* Eclipse 4 Chrome Theme
* Eclipse-Juno-Dark https://github.com/Prototik/Eclipse-Juno-Dark/downloads

## Android
* Android Development Tools for Eclipse

## Maven
* Maven Integration for Eclipse
* Maven Integration for Eclipse WTP

## Spring
Spring Tool Suite for Eclipse Juno

# Preferences Setting

* Font変更
General >a Appearance > Colors and Fonts > Basic の値を変更


* lombok設定(Mac)

1.lombokを取得
2.Eclipse.app/Contents/Mac OS配下に配置
3.eclipse.ini編集

```eclipse.ini
 -Xbootclasspath/a:lombok.jar
 -javaagent:lombok.jar
```
TheSchwartzでメール送信を外部処理する方法

最近のwebappはいかにイベントループを止めないかが重要です。非同期処理です。重い処理はjobqueueでwebappのプロセスから投げて外してあげるというのがレスポンス向上にかかせません。PerlのjobqueueにはTheshwartzやGearmanが有名どころみたいです。調べてみたところ、すぐ処理を行うならGeramanらしいですが、Gearmanも他にプロセスをあげるようなのでDBを使ってることで信頼性が高いTheSchwartzを導入することにしました。
	
## インストール

まずはPerlモジュールをダウンロードする。

	$ cpanm TheSchwartz 

次にスキーマファイルをダウンロード。

	$ wget http://cpansearch.perl.org/src/SIXAPART/TheSchwartz-1.10/doc/schema.sql	
		
スキーマのファイルからデータベースを作成する
		
	$ mysql -uroot -p 
	mysql> create database TheSchwartz
	mysql> grant all on TheSchwartz.* to <user>@localhost identified by “xxxx”;
	$ mysql -u<user> -p -DTheSchwartz < ./schema.sql
	
JobQueueクラスを作ります。job9->sendmail($info)でジョブを投げます。

	package JobQueue;
	use Mouse;

	use strict;
	use warnings;
	use TheSchwartz;

	has client => (
    	is => 'ro',
    	isa => 'TheSchwartz',
    	lazy => 1,
    	builder => '_build_client',
	);

	sub _build_client {
    	my $self = shift;
    	return TheSchwartz->new(
        	databases => [{
            	dsn  => 'dbi:mysql:TheSchwartz',
            	user => ‘<user>’,
            	pass => ‘xxxx’,
        	}],
       		verbose => 1,
   		 );
	}

	sub sendmail {
    	my ($self, $info) = @_;
    	$self->client->insert(MailWorker => $info); 
	}
	1;

ワーカーのスクリプトは下のようになります。postfixがCentOSで走っているのでMail::Mailerを使用してメール送信を行うようにしました。

	#MailWorker.pl
	package MailWorker;

	use strict;
	use warnings;
	use base qw( TheSchwartz::Worker );
	use Data::Dumper;
	use Mail::Mailer;
	use utf8;
	use Encode;

	sub work {
    	my ($class, $job) = @_;

    	print "process...\n";
    	print Dumper $job->arg;
    	my $info = $job->arg;

    	my $subject = encode('MIME-Header-ISO_2022_JP', $info->{'title'});
    	my $url = $info->{'url'};
    	my $body = “....”

   	 	my $mailer = new Mail::Mailer 'smtp', Server => 'localhost';
    	$mailer->open(
        	{To => $info->{'email'},
        	From => ‘my@domain.com',
        	Subject => $subject,
        	}
    	);
    	print $mailer $body;
    	$mailer->close;
    	$job->completed();
	}

	package main;
 	use strict;
	use warnings;
	use TheSchwartz;
 
	my $client = TheSchwartz->new(
    	databases => [{
        	dsn  => 'dbi:mysql:TheSchwartz',
        	user => ‘<user>’,
        	pass => ‘xxx’,
    	}],
    	verbose => 1, # ログを出力
	);
	$client->can_do('MailWorker'); 
 
	my $interval = 10; # default is 5
	$client->work($interval);

workerプロセスを起動してジョブを待ち受けます。

	$ perl MailWorker.pl

下記みたいな感じでジョブを投げたらメールを送れました！^_^
	
	my $job9 = JobQueue->new();
	my $info = { email => ‘hoge@hoge.com’,,, }
	$job9->sendmail($info);

Reference :

* http://tech.bayashi.jp/archives/entry/perl-module/2009/002492.html
* http://blog.livedoor.jp/sasata299/archives/51189271.html
bezierPathWithRoundedRectでstrokeの落とし穴

タイトルが変になっちゃいましたが、
bezierPathWithRoundedRectでViewのrectを指定して、角丸線をかきたいが、なぜか汚くなるという現象に頭を抱えていました。
しかしなんてことはない、Viewのサイズにおさまりきらない部分がきりとられちゃってたんですね。
自分のviewのrectより少し小さくCGRectInset等で加工すれば大丈夫でした
http://stackoverflow.com/questions/7912791/custom-button-frame-doesnt-look-as-good-as-round-rect-uibutton
Yiiで作るIRCBot


YiiはWebフレームワークに非ず。その気になれば大概の事は指先ひとつでダウンさ。つまるところコマンドラインで動けば大概のことはできるのでYiiの便利なとこつまみ食いして使いましょうということ。

手抜きのためにテーブルを作ってActiveRecordを使います。以下のようなテーブルを作ります。

```sql
CREATE TABLE `bot` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nickName` varchar(32) DEFAULT NULL,
  `realName` varchar(32) DEFAULT NULL,
  `server` varchar(128) DEFAULT NULL,
  `port` int(11) DEFAULT NULL,
  `channel` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

対応するモデルが以下のようになります。今回つかうIRCライブラリはPEARのNet_SmartIRCです。だいぶ古臭いのですが、なんとか動かせるのと、特定のメソッドさえ持っていればどんなインスタンスでもBOTにできる自由度の高さがあります。

```php:model/Bot.php
<?php

class Bot extends CActiveRecord
{
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	public function tableName()
	{
		return 'Bot';
	}

    public function timer($irc)
    {
       //10000ms毎に叩かれる
    }

    public function hello($irc,$data)
    {
        $irc->message(SMARTIRC_TYPE_NOTICE, $data->channel, 'こんにちは'); 
    }

    public function reserveMessage($irc, $data)
    {
       //すべてのメッセージをうけとるので保存とか返事とかいろいろできる
    }

}
```

ひとまずBotのために必要なメソッド`timer()`と`reserveMessage()`とサンプルがてら`hello()`を用意します。

こいつをコマンドで起動させるためにコンソール用のクラスを作ります。`command/RunCommand.php`を作成すると、protectedの下にある`yiic`を利用して

```
./yiic run
```

と呼び出せます。ちなみにこの時標準で`config/console.php`の設定を参照します。`config/main.php`とは全く別の設定になるので、DBの設定と、importにmodels.*を追加しましょう。

```php:config/console.php
<?php
…
	//追加
	'import'=>array(
		'application.models.*',
		'application.components.*',
	),
…
	'components'=>array(
		// DBの設定
		'db'=>array(
			'connectionString' => 'mysql:host=localhost;dbname=hoge',
			'emulatePrepare' => true,
			'username' => 'root',
			'password' => '',
			'charset' => 'utf8',
		),
…

```

さてコンソールコマンドを作ります。`CConsoleCommand`を継承するとyiicから呼ばれた際、`run()`が実行されます。

ちなみに先頭の不可解な`$GLOBALS`の定義はyiiから呼ぶ際にどうやら変数のスコープがおかしくなってしまうのでそれを埋めるべく定義しなおしてます。まあPHP4時代からのライブラリなので諦めましょう。もしくはPHP5向けのナウくて自由度の高いライブラリおしえてください。


```php:command/RunCommand.php
<?php
require_once("Net/SmartIRC.php");
$GLOBALS['SMARTIRC_nreplycodes'] = $SMARTIRC_nreplycodes;

class RunCommand extends CConsoleCommand
{
    public function run()
    {
        $bot = Bot::model()->findByPk(1);
        $irc = new Net_SmartIRC();

        //10000msec毎に$bot->timer()を呼ぶ
        $irc->registerTimehandler(10000, $bot, 'timer');
        //チャンネルメッセージがパターンに一致したら$bot->hello()を呼ぶ
        $irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL, '^hi$', $bot, 'hello');
        //すべてのメッセージを$bot->reserveMessage()に渡す
        $irc->registerActionhandler(SMARTIRC_TYPE_ALL, '.*', $bot, 'reserveMessage');

        $irc->connect($bot->server, $bot->port);
        $irc->login($bot->name,$bot->name);
        $irc->join($bot->channel);

        $irc->listen();
    }
}
```

動作としてはNet_SmartIRCオブジェクトにイベントハンドラを登録すると、指定のメソッドが呼ばれるだけの簡単なしくみなので、先ほどのBotモデルのメソッドが呼ばれるようにします。

これでコマンドを叩くだけでBOTが起動して指定のサーバーのチャンネルに入ります。

```
./yiic run
```

ただしこの状態だと起動しっぱなしなので、バックグラウンドで実行させるとか、プロセスをフォークしてから起動して死ぬとかするようにしないとちょっと勝手がわるいかもしれません。


サンプルがいい加減なので何がしたいんだコレ感あるかもしれませんが、Yiiのプロダクトに載せればIRCをインターフェイスにして情報を取得したり保存したり、何かしらを通知させることもできたりと結構使えます。

YiiのコンポーネントやARはWebでなくても使い勝手がよいので、CUIツールのフレームワークとしてもいい働きをするんじゃないでしょうか。
第六回オフラインリアルタイム参考問題

コードを修正しました。
解き方は修正前と同じですが、コードは短くなったので見やすくなったかと思います。

```cpp

#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>

namespace{
using namespace std;
using namespace boost;
typedef pair<size_t, size_t> pair_t;

vector<pair_t> get_rect(const string& s){
    vector<pair_t> v;
    for(size_t i=0; i<s.length(); i+=3){
        if(s[i] == '-'){
            continue;
        }
        v.push_back(pair_t(lexical_cast<size_t>(s.substr(i,1)),lexical_cast<size_t>(s.substr(i+1,1))));
    }
    return v;
}

void set_pos(set<string>& s, pair_t x, pair_t y){
    for(size_t j=y.first; j<=y.second; ++j){
        for(size_t i=x.first; i<=x.second; ++i){
            s.insert(lexical_cast<string>(i) + lexical_cast<string>(j));
        }
    }
}

bool same(const set<string>& red, const string& green){
    set<string>::iterator found = find(red.begin(), red.end(), green);
    return found != red.end();
}

size_t solve(const string& s){
    vector<pair_t> pos = get_rect(s);
    set<string> red, green;
    for(size_t i=1; i<3; ++i){
        //長くてごめんなさい
        set_pos(red, pair_t(min(pos[0].first, pos[i].first), max(pos[0].first, pos[i].first)), pair_t(min(pos[0].second, pos[i].second), max(pos[0].second, pos[i].second)));
        set_pos(green, pair_t(min(pos[3].first, pos[i+3].first), max(pos[3].first, pos[i+3].first)), pair_t(min(pos[3].second, pos[i+3].second), max(pos[3].second, pos[i+3].second)));
    }
    return count_if(green.begin(), green.end(), bind(&same, red, _1));
}
}

//以下はテスト
BOOST_AUTO_TEST_CASE( solve_test1 ){
    BOOST_CHECK_EQUAL(solve("23-94-28,89-06-51"), 11);
}

BOOST_AUTO_TEST_CASE( solve_test2 ){
    BOOST_CHECK_EQUAL(solve("11-84-58,02-73-69"), 40);
}

BOOST_AUTO_TEST_CASE( solve_test3 ){
    BOOST_CHECK_EQUAL(solve("18-41-86,77-04-32"), 26);
}

BOOST_AUTO_TEST_CASE( solve_test4 ){
    BOOST_CHECK_EQUAL(solve("81-88-23,64-58-14"), 0);
}

```