OmniAICreator/Qiita-1.07M huggingface dataset:
CFRunLoopによるCore Animationの逐次的アニメーション

Core Animationを使って、あるアニメーションが終わったら次、それが終わったらまた次……といったように逐次的にアニメーションをしたくなった。
Core Animationは非常に優秀なアニメーションフレームワークで、非同期アニメーションを大した労力もなく実行することができる。一方、アニメーションと同期して処理を実行するのは結構面倒くさい。CAAnimationの委譲メソッドを使うか、CATransactionの+setCompletionBlock:メソッドを使うしかない（はず）。逐次的にアニメーションをしていく上で、コールバックを用いて書くとまとまりが悪くなってあまりよろしくない。
という訳で、あるアニメーションが終わるまでスレッドをブロックすることにする。実装の方法は他にもあるかもしれないが、今回はCFRunLoopを使ってみることにした。
大まかな戦略としてはこうである。

1. アニメーションを開始
2. CFRunLoopを起動して待機
3. アニメーションの終了通知を受け取り、CFRunLoopを解除

これを１セットの処理として、アニメーションごとに行うことで、逐次的にアニメーションを実行する。

```objectivec
- (void)doAnimationsSequentially {
    CFRunLoopRef rl = CFRunLoopGetCurrent();
    CFDateRef distantFuture = (__bridge CFDateRef)[NSDate distantFuture]; // ARC環境下
    CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFDateGetAbsoluteTime(distantFuture), 0, 0, 0, NULL, NULL);
    
    CFRunLoopAddTimer(rl, timer, kCFRunLoopDefaultMode);
    
	// アニメーション１
    [CATransaction begin];
    [CATransaction setCompletionBlock:^(void){
        CFRunLoopStop(rl); // (3) RunLoop解除
    }];
	// (1) アニメーション開始
    [CATransaction commit];
    CFRunLoopRun(); // (2) 終了まで待機

	// アニメーション２：アニメーション１が終わってから開始する
    [CATransaction begin];
    [CATransaction setCompletionBlock:^(void){
        CFRunLoopStop(rl);
    }];
	// 何か
    [CATransaction commit];
    CFRunLoopRun();

	... // 以下同様……
    
	// 後片付け
    CFRunLoopTimerInvalidate(timer);
    CFRelease(timer);
}
```

割とさっぱりしていると思う。
イベントループ中で実行するとアプリケーションがアニメーションの終了まで止まってしまう。
CATransactionが明示的にネストされていると、一番外側のCATransactionがcommitするまでアニメーションが開始されないため、フリーズしてしまうので注意。
- - -
ちょっと解説。
CFRunLoopは、入力ソースなどのイベントを監視するためのクラス。CFRunLoopRun()を実行すると監視ループに入り、現在のスレッドでの処理が止まる。CFRunLoopに登録されている入力ソースが全て処理を終えるか、CFRunLoopStop()を実行することで監視ループを抜けることが出来る（一回ずつ入力ソースを処理したり、タイムアウトを設定することも出来る）。ここで注意しなければいけないのは、入力ソースが登録されていない場合、CFRunLoopRun()はループに入ることなく終了するということ。
CFRunLoopはスレッドごとに一つ存在し、CFRunLoopGetCurrent()で現在のスレッドのCFRunLoopを取得できる。スレッド作成時点では入力ソースは一つも登録されていないので、サブスレッドで実行することを考えて、空の（コールバックを持たない）タイマーを作って登録している。このようにCFRunLoopTimerCreate()を使っていいかどうかはリファレンスに書いていなかった。一応動作はしたが、気になるならコールバックに適当な関数を突っ込んでおいてもいいかも。
CFRunLoopTimerCreate()の第二引数(fireDate)にdistantFutureを設定して発火しないタイマーを作る。これによってCFRunLoopStop()が呼ばれるまで監視ループを勝手に抜けない様にする。
nginx+passenger+spdyをインストールする

# Ubuntu 12.04でnginx+passenger+spdyをインストール

既存のnginxが入っている場合は、先にaptitude purgeなどで削除しましょう。

```shell:passenger-nginx-spdy.sh
#!/bin/sh
 
NGINX_VERSION=1.3.11
TMP_PATH=/tmp
 
# Fetch and extract Nginx
cd $TMP_PATH
wget http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz
tar xvfz nginx-$NGINX_VERSION.tar.gz
cd nginx-$NGINX_VERSION
 
# Fetch and apply the Nginx SPDY patch
wget http://nginx.org/patches/spdy/patch.spdy.txt
patch -p1 < patch.spdy.txt
 
# Install the latest passenger gem
# 必要に応じてrvmsudoをつけましょう
gem install passenger
 
# Configure passenger (with ubuntu-style paths)
# ここもrvmsudoを必要に応じてつけて下さい
passenger-install-nginx-module \
  --auto \
  --nginx-source-dir=$TMP_PATH/nginx-$NGINX_VERSION \
  --prefix=/usr \
  --extra-configure-flags=" \
    --conf-path=/etc/nginx/nginx.conf \
    --pid-path=/var/run/nginx.pid \
    --sbin-path=/usr/sbin \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_spdy_module"
 
# Cleanup
sudo rm -r $TMP_PATH/nginx-$NGINX_VERSION
rm $TMP_PATH/nginx-$NGINX_VERSION.tar.gz
```


これでnginxをインストールし、
http://nginx.org/patches/spdy/README.txt
にあるようにnginx.confで


```shell:/etc/nginx/nginx.conf
  server {
      listen 443 ssl spdy default_server;
      ssl_certificate      server.crt;
      ssl_certificate_key  server.key;
  }
```


のような記述を書き足せば利用できます。
SPDYはSSL必須なので、適当にSSL証明書を作り/etc/nginx/sslとかにでも入れておきましょう。

ちゃんとSPDYで通信できているか確認するには、chromeで
[SPDY Indicator](https://chrome.google.com/webstore/detail/spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin)
をインストールし、httpsでアクセスし、緑色のアイコンになることをチェックしましょう。
Lokka(Sinatra app)でhttp headerのキャッシュ制御

Lokkaをherokuで動かしていたが高速化をしたかったのでcloudfrontに置いたら、キャッシュ制御が必要になった。

Lokkaはsinatraベースなので下記リファレンスに従えばいい
http://www.sinatrarb.com/intro#Cache%20Control

今回はLokka::Blogというプラグインを用意してそこでafter filterに登録した。

```ruby
module Lokka
   module Blog
     def self.registered(app)
       app.after do
          cache_control :public, :must_revalidate, :max_age => 600
        end
　  end
  end
end
```
Cucumberの結果をSinatraでホスティング、APIステータスサイトを手軽に実現

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

[githubのステータスサイト](https://status.github.com/)など、WebでAPIを提供するプロバイダならユーザから各機能が正常なのかをお知らせしたいですね。

何かの機能がそのふるまいをできているかどうか？ これはCucumberの出番ですかね。
最新結果がいつでも誰にでも分かるようになっていればベストですが、そのためのサーバを立てて管理して・・・となると面倒極まりない。

スケジューラもあることだし[Heroku](http://www.heroku.com/)にやってもらうか。

今回のサンプルはこちらにおいてます > [https://github.com/higanworks/heroku_cuucmber_example](https://github.com/higanworks/heroku_cuucmber_example)

## 概要

- cucumberのhtml出力を定期的に実行する
- 結果のhtmlをherokuでホスティングする


### Gemfileの作成

`Sinatra`、`Cucumber`など関連するGemsを入れるため`Gemfile`を作成します、Bundleしておきましょう。`Gemfile.lock`も忘れずにgitに入れておきます。


```ruby:Gemfile
source "https://rubygems.org"

gem "sinatra"
gem "cucumber"
gem "rake"
gem "thin"
```

## sinatraでindex.htmlを表示する

`/`が呼ばれたら`public/index.html`のファイルの内容をReadすればいいので、`cunfig.ru`にまるごと書いてしまえばいいです。

```ruby:config.ru
require 'sinatra'
get('/') { open('public/index.html').read }
run Sinatra::Application
```

必要十分。多言語対応ならjaとかenとかのクエリを貰って分岐しますわ。


## heroku用にForemanのファイルを用意する

herokuはForemanでアプリを起動してくれるので、foreman用の定義をつくります。


```text:Procfile
web: bundle exec rackup -p $PORT
```




## herokuへ

`features`を適当に書いたら、herokuへアップします。

```shell:Shell
heroku create
git push heroku master
```

### cucumberをheroku上で実行

出力を`public/index.html`にして更新します。

```shell:Shell
heroku run cucumber -f html -o public/index.html
```

これで`index.html`がcucumberの出力に差し替わります。


## とりあえずホスティングした結果

[http://mighty-springs-8010.herokuapp.com/](http://mighty-springs-8010.herokuapp.com/)

問題なく見れました。

![cucumber_on_heroku](https://dl.dropbox.com/u/3524956/quiita/Cucumber_heroku_image01.jpg)

あとは定期的に実行すればOKと。

## スケジューラの追加と登録

アプリにスケジューラアドオンを追加します。

```shell:Shell
heroku addons:add scheduler:standard
```

先程のcucumberをタスクに登録すれば定期的に`index.html`が更新されていきます。

## 終わりに

出力のフォーマットをカスタマイズして、ユーザへの自動情報提供ページがつくれますね。
ビヘイビアテストとユーザ告知を同時に実現できる、なかなか良い仕組みだと思います。
CoronaSDKでランダムな実数を算出する！


`math.random()`を利用して算出します。

```lua:sample.lua
-- 0〜1
math.random()
---> 0.61073766677209

-- 0〜10
math.random() * 10
---> 8.1230520494855

-- 1〜10
math.random(1, 9) + math.random()
---> 5.5851816798491
```

## 公式リソース

[App Development Tool | math.random()](http://developer.coronalabs.com/reference/index/mathrandom)
CSSだけで幅を超えた文字列を...で省略する

ある幅に合わせて文字列を省略したいときがありますが、
レンダリングされる文字によって幅が違うので、文字数で制御するのは割と面倒ですね。

ですが以下のようにcssを書いておけばきっちり決めた幅であふれた部分を「...」で省略してくれます。

```css
p{
  width: 100px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  -o-text-overflow: ellipsis; /* Opera9,10対応 */
}
```

```html
<p>もじもじもじもじもじもじもじもじもじもじもじ</p>
```

面白いのは、省略されて後ろについた「...」までを選択してコピペすると省略されて隠れている部分までちゃんとコピペできます。

SEO的にも問題なさそうだし使ってみよう
InspectorのVector3表示を改善するAttribute作った

前提
----

UnityでVector3をInspectorで表示すると、ちょう縦幅を使ってて、だるい。
![](http://gyazo.com/d0e78503e302c3bceafca8d1bbd5e93e.png?1359814659)

　

Unity3.x系だと、ここではEditorのみを書かなきゃいけなかったけど、
Unity4.x系からAttributeを自作すればInspectorの表示を自分で編集できる様になった。

Editorっていうと、特定の開発環境専用のツールのイメージがあったけど、
Attributeはもっと汎用的な、「UnityのInspectorってこうだったらいいよね」を拡張するのに特化した感じ。

個人的な感想だし、上手く表現出来ないけど。

　　　

Attributeとは？
----

ちなみにAttributeって何？って時の為に、
4.x系から追加されているRangeAttributeなどがある。
値の範囲をInspector側にも制限出来るので便利。

　

```c#:hoge.cs
[RangeAttribute(0, 10.0f)]
public float duration = 1;
```

みたいな感じでfloatかintの上にAttribute付けてあげると

　

こんな感じにスライドバーで値を調整出来る。
![](http://gyazo.com/564cb85e958b28e138049f337fdc60de.png?1359814941)

　　

本題
----

ちなみに自作Attributeの作り方は、[公式Blog](http://blogs.unity3d.com/2012/09/07/property-drawers-in-unity-4/)で説明してるけど、
説明してるsampleがserverAdrressの為の正規表現で文字列制限Attributeなのだ。

　

Vector3の表示を変えるには、自作するしか無いのか！！！くそが

　

という事で、作ってみました。
![](http://gyazo.com/974aa8a3a6d755502758b96c25acaf82.png?1359792171)

#[https://github.com/anchan828/property-drawer-collection/tree/master/Vector3FieldAttribute](https://github.com/anchan828/property-drawer-collection/tree/master/Vector3FieldAttribute)
@kyusyukeigoさんのご指導のおかげで、なんとかpull requestできました。
ありがとうございます！！！

このリポジトリには便利Attributeが他にもあるので有効活用したいです。
　

ハマりどころ
----
４時間くらい謎のエラーにハマっておりました。

Vector3Fieldで表示されるのは、`label`と`Vector3`の2行分になります。

そのため、一工夫しないと以下の様な表示になってしまいます。
![](http://gyazo.com/e08b63e0ba052c47bc671601c355bc8b.png)

　

１行以上の表示になりうる値を表示したい時は、
`PropertyDrawer`の`GetPropertyHeight`から表示領域の調整を行う必要があります。

````c#:hoge.cs
public override float GetPropertyHeight (SerializedProperty property, GUIContent label)
{
　　　return base.GetPropertyHeight (property, label) + 30;
}
````

　

このように、デフォルトの表示領域が一行分になっているので、
表示領域の高さに`+30`とかしてやれば、ちょうど良い感じになりました。

　
Attributeおもしろいし、便利！
BitbucketのPrivate repositoryをタダでCIする

# Private repositoryをタダでCI
## 概要
BitbucketはタダでPrivate repositoryをつくれるので、運営しているwebサービスのソースなど公開しちゃうのはちょっと。。。というものを預けるのに便利です。最近はTravis-CIなんかがあって、サーバを立てなくてもCI出来たりしますが、githubしか対応していなくて涙目でした。
今回、[CloudBee](http://www.cloudbees.com)を使って__リポジトリからCIまで無料な環境__を作ったのでそのまとめです。

### アプリケーション構成
細かいものは他にもありますが、テストに関係しそうな構成はだいたいこんな感じ

- Python (2.7.2)
- MongoDB
- web.py
- nose
- coverage
- mongomock
- pep8

### 前提条件
ユニットテストの外部依存は面倒で嫌いなので、__MongoDBやその他入出力を伴うテストは全てMock化__しています。若干バグ（というか機能不足）ありますが、[mongomock](https://github.com/vmalloc/mongomock)でだいたいいけます。あとpep8はテストスクリプト化して、リポジトリ中の全ソースにスタイルチェックをかけてます。

### ローカルJenkinsでやってたこと
nosetestsをたたいて、カバレッジの収集とユニットテスト（含むpep8チェック）です。カバレッジはCobertura XMLレポート、ユニットテストはJunitテスト結果として集計します。

## 構築手順
### DEV@cloudのアカウント作成
FREE版（300min/month, 2GBまで無料）にSign upしてアカウントを作成します。いろいろ答えてアカウント作成していくと、おなじみのJenkins画面に到達します。__基本的にローカルサーバで動かすものと一緒で、管理者権限を持ってる状態__（自由にプラグインが追加できる）です。

### Jenkinsの環境整備
ローカルのJenkinsと基本的にいっしょです。Jenkinsの管理->プラグインの管理で、必要なプラグインを導入します。今回、使いそうだった以下を入れました。（多すぎかも）

- Jenkins Cobertura Plugin
- CloudBees Python Installations Plugin
- CloudBees Jenkins-as-a-Service Python Installations

### ジョブの作成
いよいよメインです。ローカルサーバとして所有しているわけではないので、__Python実行環境はvirtualenv__を使う必要があります。あとはprivateリポジトリなのでアクセス用のssh鍵周りの設定が必要ですが、CloudBeeに予めssh鍵がありますので、Bitbucket側にreadonlyの鍵として登録（リポジトリのConfig->Deployment keys）しておきます。

#### ローカルJenkinsの実行内容

```bash:local_jenkins_job
nosetests -c nose.cfg
```

#### DEV@cloud上のJenkinsの実行内容

```bash:cloudbee_jenkins_job
virtualenv --distribute DEV
DEV/bin/pip install -r requirements.txt
DEV/bin/nosetests -c nose.cfg
```

virtualenv用に若干記述が増えています。requirements.txtはpip freezeとかでも出力できるアレです。nose.cfgはカバレッジ取得等のnosetestsのオプションが入ってます。

これでジョブを実行すると、ローカルのJenkins同様に普通に実行されあえなく完了です。
あとはscmのポーリングなり定期実行なり、お好みにあわせて実行するだけです。

## 若干はまったところ
pep8チェッカーはプロジェクトディレクトリ全体にかけるようにしていましたが、__virtualenvを入れたことで、プロジェクトディレクトリ内にライブラリが入る__ようになります。
なので、初回のジョブ実行時はライブラリ群に対するPEP8警告が出まくって大変でした。。。

プロジェクト全体に対して実行する処理がある場合は事前に除外するようにしましょう。（上記の例だと _[PROJECT_DIR]/DEV_ というディレクトリが作られてそこに一通り入る）
Rails4アプリ開発日記


#Why
Rails4が今年リリースされると思って、前々から自分で作ったサービスを有償で提供したいと思っていたから仕事の休憩時間や休日に本格的な開発を楽しんでみる。

すでに、システム構成とか運用とかについては頭の中にあって経験も長いのでそこは問題ない。
もち、CIサーバー使ってワンクリックデプロイまで構築するよ。

アイデアのニーズもそこそこあるってことはとあるサイトから確認してる。
もちろん、スタートアップのビジネスとして考えてるのでミッションもビジョンもバリューも決まってる。

お金が入ってくる流れを作るまでは自分の時間と頭を使うしかない。
先行投資額が安価なのもウェブサービス提供型ビジネスのいいとこだ。
なによりトライアンドエラーが安価でできるのはほんっとにうれしい限りだ。

#Problem
あとは４つの課題をクリアすればよい

1. UIをどう作るか
2. どうやってお客を集めるか
3. 価格設定をどうするか
4. ポジショニングをどこに設定するか

#Plan
マイルストーン
・2013年 ドラフト版の開発
・2014年 夏 ベータ版公開
・2015年 リリース版公開

##開発手法の３つのルール

1. 継続的インテグレーション
2. BDD
3. TiDD

プロジェクト管理はVPSにredmineたてて、backlogsプラグインで運用することにする。
優秀なチームができたらコミュニケーションはSkypeを使う。

##成功報酬でよければ、今は無償で協力してほしい人

* 優秀なデザイナー

##条件

* gitが使える
* javascript(jquery)でプログラムできる
* html5でデザインができる
* フィーリングがあう
* ミッションが同じである

#Rails4のインストールではまったことをメモ

##開発環境
MacOSX lion 10.8.2
Macbook Air 11'inc

依存関係が問題になるため、先にインストールが必要なgemのリスト
i18n (0.6.1)
atomic (1.0.1)
thor (0.17.0)
thread_safe (0.1.0)

rails4をインストールした日
２０１３年０２月０２日　PM１：００頃

###前提条件
rvmがインストールされruby-1.9.3-p374がデフォルトとなっていること
初めはrvmを使ってたけど、機能がシンプルなrbenvを今はつかってる
ここでは、rvmで説明することにする

```
$ rvm list

rvm rubies

=* ruby-1.9.3-p374 [ x86_64 ]
   ruby-head [ x86_64 ]
```

rvm gemset globalに以下のバージョンのgemがインストールされていること

```
$ rvm gemset use global
Using ruby-1.9.3-p374 with gemset global
$ gem list

*** LOCAL GEMS ***

bundler (1.2.3)
rake (10.0.3)
rubygems-bundler (1.1.0)
rvm (1.11.3.6)
```

##インストール手順
rvmで任意のgemsetを作っとく
そして、前述の依存関係のgemをインストールする

```
$ rvm gemset create rails4
$ rvm use 1.9.3-p374@rails4 --default

$ gem install thread_safe
$ gem install i18n
$ gem install thor
```

適当なディレクトリにrails4をcloneする
~/.bashrcにaliasを切っとくと楽だ

```
$ git clone https://github.com/rails/rails.git
```

```bash:~/.bashrc
alias r4='/Project/Rails/1.9.3/rails/railties/bin/rails'
```


適当なディレクトリを作ってRails4のアプリケーションを作る
--skip-bundleはRails4がgem化されていないのでbundlerがうごかないらしい
-T テストはRspec使うからTest:Unitはスキップする

```
$ source ~/.bashrc
$ r4 new sampleapp --skip-bundle -T
```

sampleappのGemfileをrails4とかをgithubから取得するように編集する

```
$ diff Gemfile ../default/Gemfile
4c4
< gem 'rails', '4.0.0.beta', github: 'rails/rails'
---
> gem 'rails', '4.0.0.beta'
11,13c11,13
<   gem 'sprockets-rails', '~> 2.0.0.rc1', github: 'rails/sprockets-rails'
<   gem 'sass-rails',   '~> 4.0.0.beta', github: 'rails/sass-rails'
<   gem 'coffee-rails', '~> 4.0.0.beta', github: 'rails/coffee-rails'
---
>   gem 'sprockets-rails', '~> 2.0.0.rc1'
>   gem 'sass-rails',   '~> 4.0.0.beta'
>   gem 'coffee-rails', '~> 4.0.0.beta'
```

bundle installを実行して依存関係のgemをインストールする。

```
$ bundle install
```

サーバーを起動してブラウザでアクセスしてみる。

```
$ r4 s
```

localhost:3000
動いたので、今日のところはここまでにする。

##参考
[Rails4 betaのインストール手順](http://memo.yomukaku.net/entries/ZyInhdY "Rails4 betaのインストール手順")
[Rails 4.0を使ってみよう – その1 インストール～herokuで動かす](http://techracho.bpsinc.jp/baba/2012_06_13/5719 "Rails 4.0を使ってみよう – その1 インストール～herokuで動かす")
順列列挙(Erlang)


飛行機本で勉強したときのソースを発見。
リスト差分演算子--と内包表記が使えるのですっきり書ける。

```permutation.erl
  1 -module(permutation).
  2 -export([perms/1]).
  3 perms([])->[[]];
  4 perms(K)->[[H|T] || H<-K, T<-perms(K--[H])].
```

```
$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> c(permutation).
{ok,permutation}
2> permutation:perms("1234").
["1234","1243","1324","1342","1423","1432","2134","2143",
 "2314","2341","2413","2431","3124","3142","3214","3241",
 "3412","3421","4123","4132","4213","4231","4312","4321"]
PhpStormでタブをすべてスペースに変換する方法

Menu > Edit > Convert Indents > to Spaces

でOK。キーボードのショートカットを割り当てたいなら

Menu > PhpStorm > Preferences > IDE Settings > Keymap

で convert と検索すれば出てくるので、
Add Keyboard Shortcut で適当なものを追加できる。
第7回オフラインリアルタイムどう書く。C++による実装。


問題は http://nabetani.sakura.ne.jp/hena/ord7selectchair/
で。
C++ による実装。

当日その場で書いた。

```c++
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

const char NOMAN = '-';

bool is_empty( string const & c, size_t ix )
{
    return c.size() <= ix || c[ix]==NOMAN;
}

bool and_( bool a, bool b ){
    return a&&b;
}

bool or_( bool a, bool b ){
    return a||b;
}

bool t( bool a, bool b ){
    return true;
}

size_t sit_pos( string & c, char cmd )
{
    typedef bool ( *proc_t)( bool, bool );
    proc_t procs[] = { and_, or_, t };
    for( size_t px=0 ; px<3 ; ++px ){
        for( size_t ix=0 ; ix<c.size() ; ++ix ){
            if ( c[ix]!=NOMAN ){
                continue;
            }
            if ( procs[ px ]( is_empty( c, ix-1 ), is_empty( c, ix+1 ) ) ){
                return ix;
            }
        }
    }
}

void add_member( string & c, char cmd )
{
    c[ sit_pos( c, cmd )] = cmd;
}

void remove_member( string & c, char cmd )
{
    size_t pos = c.find_first_of( cmd - 'a' + 'A' );
    c[pos] = NOMAN;
}

string solve( string const & input )
{
    size_t count = atoi( input.c_str() );
    string seq = input.substr( input.find_first_of( ':' ) + 1 );
    string chairs( count, NOMAN );
    for( size_t ix=0 ; ix<seq.size() ; ++ix ){
        char cmd = seq.at( ix );
        if ( 'A'<=cmd && cmd<='Z' ){
            add_member( chairs, cmd );
        } else {
            remove_member( chairs, cmd );
        }
    }
    return chairs;
}

void test( string const & input, string const & expected )
{
    string actual = solve( input );
    cout 
        << ( actual == expected ? "ok" : "**NG**" )
        << input << " -> "
        << actual << " / "
        << expected << endl;
}

int main()
{
/*1*/ test( "6:NABEbBZn", "-ZAB-E" );
/*2*/ test( "1:A", "A" );
// あとは省略
}
```

関数名を and, or にしたらコンパイルが通らなかったので and_ と or_ にした。
[Rails]paypal決済の処理を組むのにpaypal-expressがオススメ

paypal-expressのgemで簡単に決済導入ができました。お手軽。

## paypal-express

githubはこちら
https://github.com/nov/paypal-express

wikiもちゃんと充実。定期決済とかもできる。
https://github.com/nov/paypal-express/wiki

サンプルアプリがあるのがいいね
https://paypal-express-sample.heroku.com/

サンプルアプリのコードがあるのがもっといい
https://github.com/nov/paypal-express-sample

こちらで簡単に決済のシステムが組めました。ありがとうございました。
第7回オフラインリアルタイムどう書くの問題をrubyで解く

問題はhttp://qiita.com/items/4364285801d1c9f370a1
からリンクされています。

```ruby
def solve(q)
  num, s = q.split(':')
  us = ['-'] * num.to_i
  ns = [0] * (num.to_i + 2)
  s.split('').each do |c|
    uc = c.upcase
    if uc == c
      ia = []
      us.zip(ns[1..-2]).each_with_index do |(u, n), i|
        next unless u == '-'
        ia[n] ||= i
      end
      i = ia.find{|e| e != nil}
      us[i] = c
      ns[i] += 1
      ns[i+2] += 1
    else
      i = us.index(uc)
      us[i] = '-'
      ns[i] -= 1
      ns[i+2] -= 1
    end
  end
  us.join
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t"
  print ans
  puts ans == a ? 'o' : 'x'
end
__END__
1	6:NABEbBZn	-ZAB-E
2	1:A	A
3	1:Aa	-
```
第7回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/36098 )を行いました。

問題は「のんびり座りたい」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord7selectchair/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
ParseのCloudCodeを使って入力値のvalidationをする

[Parse.com](https://parse.com/) を使ってクライアントアプリ開発をする場合、
ACLの書き込み権限のあるユーザなら不正なリクエストによって
どのカラムでも書き換え可能になってしまうため、
ユーザの不正な入力値を拒否するために [CloudCode](https://parse.com/products/cloud_code) を使って validation する必要がある。

例えばメールアドレス変更のクエリに紛れて User テーブルの birthday カラムを不正に書き換えようとした場合を想定する。
実際の書き換え処理の前に実行したい処理は CloudCode の beforeSave を用いる。
下のコードを main.js に書いて parse deploy すればデプロイされる。

```js
Parse.Cloud.beforeSave("_User", function(request, response) {
    // MASTER_KEYを使った更新、DataBrowserからの更新は成功                                                                                                                                                                                                                               
    if (request.master == true) {
        return response.success();
    }

    var user = request.user;
    // ユーザが存在しない場合(新規登録の場合)は成功
    if (!user) {
        return response.success();
    }

    // 仮に birthday を変更する入力があっても、既に登録されている値を改めて set する
    request.object.set("birthday", user.get("birthday"));
    return response.success();
});
```

[公式ドキュメント](https://parse.com/docs/cloud_code_guide)にも上記のように
validation する方法が記載されていて、とりあえず問題なく動作する。

しかし、サービスの拡張に伴って影響範囲の洗い出しも困難になってくるので、
そもそもユーザには書き換え権限を与えずに、
PFCloud を使って、サーバサイドでデータ書き換えを扱った方が安全な実装ができる。

```js
Parse.Cloud.define("changeEmail", function(request, response) {
    var user = request.user;
    if (!user) {
        // ログインしていないのでエラー
        return response.error("ERROR: not login");
    }

    var email = request.params.email;

    /* ここで email の文字列を validation をする */

    Parse.Cloud.useMasterKey();
    user.set("email", email);
    user.save(null, {
        success: function(result) {
            return response.success("SUCCESS: change email");
        },
        error: function(result, error) {
            return response.error("ERROR: cannot change email");
        }
    });
}
```

CloudCode に上記のようなコードを書いて、
クライアントアプリ側で [PFCloudのリファレンス](https://parse.com/docs/ios/api/Classes/PFCloud.html) を参考に下記のように実行する。

```objc
[PFCloud callFunctionInBackground:@"changeEmail"
                   withParameters:[NSDictionary dictionaryWithObject:self.textFieldEmail.text forKey:@"email"]
                            block:^(id result, NSError *error)
{
    if (!error) {
        // サーバ側の処理が成功した場合の処理
    } else {
        // サーバ側の処理が失敗した場合の処理
    }
}];
```

このように実装しておけば不正にカラムが書き換えられることもない上、
マルチプラットフォーム開発も容易になる。
インターネットからとってきたHTML(NSData)の文字コードを判別したい

NSDataからNSStringに変換する際、initWithData:encoding:って文字コードを指定するんだけれども | J7LG
http://www.j7lg.com/archives/213

総当り。
実際には、↓を全部試せばよいのだろうか。
http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

```c:
enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   NSUnicodeStringEncoding = 10,
   NSWindowsCP1251StringEncoding = 11,
   NSWindowsCP1252StringEncoding = 12,
   NSWindowsCP1253StringEncoding = 13,
   NSWindowsCP1254StringEncoding = 14,
   NSWindowsCP1250StringEncoding = 15,
   NSISO2022JPStringEncoding = 21,
   NSMacOSRomanStringEncoding = 30,
   NSUTF16StringEncoding = NSUnicodeStringEncoding,
   NSUTF16BigEndianStringEncoding = 0x90000100,
   NSUTF16LittleEndianStringEncoding = 0x94000100,
   NSUTF32StringEncoding = 0x8c000100,
   NSUTF32BigEndianStringEncoding = 0x98000100,
   NSUTF32LittleEndianStringEncoding = 0x9c000100,
   NSProprietaryStringEncoding = 65536
};
```
テーブルの行を削除・追加しても、自動的に連番になるCSS

[テーブルの行を削除・追加しても、自動的に連番になる方法](http://www.webbibo.com/blog/htmlcss/renban.html)を参考に、テーブルにクラス指定するだけで連番になるように改良した。

```auto_numbering_table.css
.numbering {
    counter-reset: num;
}
 
.numbering tr td:first-child:before {
    counter-increment: num;
    content: " " counter(num) ".";
}
```
Githubで空のディレクトリを管理する方法


Githubでは空のディレクトリのバージョン管理をデフォルトでは行ってくれないことが分かった。
その場合には空の.gitkeepファイルを作成するとかっこいい。

```
cd /emptyDir
touch .gitkeep
```

空ファイルがあるのでバージョン管理の対象になるというだけ。

参考：http://memo.yomukaku.net/entries/195
エクスプローラからコマンドプロンプトやPowerShellを開いたり, その逆をする方法のまとめ

__エクスプローラ__ で開いているフォルダから, __コマンドプロンプト__ や __PowerShell__ を開いたり,
その逆をする方法はいろいろとあるようだが, とりあえず下記のとおり (Windows 7).

# エクスプローラ -> コマンドプロンプト・PowerShell

## 設定なしで使用可

- __エクスプローラ__ のアドレスバー (Alt+D) で`cmd` or `powershell`を入力してEnter
- __エクスプローラ__ で, Shiftキーを押しながら __フォルダ__ を右クリックして, "コマンドウィンドウをここで開く" (__PowerShell__ なし)
- __コマンドプロンプト__ や __PowerShell__ で`cd`と入力後に, __エクスプローラ__ で開いている __フォルダ__ を画面にドラッグしてEnter

## 設定して右クリックメニューを追加

- [PowerToy](https://technet.microsoft.com/ja-jp/magazine/2008.06.elevation.aspx)から *Elevation2008_06.exe* をダウンロードして解凍し, その中から追加したい _\*Here\*.inf_ を選んでインストール (__管理者権限__ 可)
- [Open Command Prompt Shell Extension](https://forest.watch.impress.co.jp/library/software/opcmdprmptsh/)をインストール (__PowerShell__ なし, __管理者権限__ 可)

- レジストリ (`HKEY_CLASSES_ROOT\Directory\shell`) を編集


# コマンドプロンプト・PowerShell -> エクスプローラ

```powershell
explorer .
start .
```


https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/start

- 以下は, __PowerShell__ のみ

```powershell
Start-Process .
ii .
Invoke-Item .
```

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/invoke-item

# 参考

http://webdev.seesaa.net/article/273340995.html

http://stackoverflow.com/questions/378319/windows-explorer-command-prompt-here

http://stackoverflow.com/questions/183901/how-to-start-powershell-from-windows-explorer

http://stackoverflow.com/questions/320509/is-it-possible-to-open-an-explorer-window-from-powershell
ImageMagick で画像を半透明にして重ね合わせる


画像の重ね合わせは`composite`コマンドを使う。

以下は、source1.jpg と source2.jpg をそれぞれ 25% の濃さで重ね合わせ、結果を output.jpg として出力する例。

```bash:
$ composite -dissolve 25%x25% source1.jpg source2.jpg output.jpg
```

## 参考

[画像処理についてあれこれ: ImageMagickで画像を半透明にして重ね合わせる](http://kyle-in-jp.blogspot.jp/2006/12/imagemagick_05.html)

[ImageMagick: Command-line Tools: Composite](http://www.imagemagick.org/script/composite.php)

[Compose -- IM v6 Examples](http://www.imagemagick.org/Usage/compose/)
標準出力をJTextAreaに流す

Javaアプレットの開発のとき、printlnの類をコンソールでなく画面内で流してみたいことがあります。
ロガーを使う場合でも、標準出力に出す設定をすれば結局この方法で読むことができます。

標準出力は[System.setOut](http://docs.oracle.com/javase/jp/6/api/java/lang/System.html#setOut%28java.io.PrintStream%29)を使うとリダイレクト出来ますが、そのために[PrintStream](http://docs.oracle.com/javase/jp/6/api/java/io/PrintStream.html#PrintStream%28java.io.OutputStream, boolean%29)を作ってやる必要があります。
その際、[ByteArrayOutputStream](http://docs.oracle.com/javase/jp/6/api/java/io/ByteArrayOutputStream.html)を使うとバッファ関係を書かずに短くすみます。
受け側はバイト単位なのでマルチバイト文字の切りがいいところでflushが呼ばれるとは限りませんが、autoFlushという引数をtrueにしてやると大体うまくいくようです。

```java:RedirectConsole.java
private static void redirectConsole(JTextArea textarea) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream() {
        @Override
        public synchronized void flush() throws IOException {
            textarea.setText(toString());
        }
    };

    // trueをつけるといいタイミングでflushされる
    PrintStream out = new PrintStream(bytes, true);

    System.setErr(out);
    System.setOut(out);
}
```

ログは無制限に溜まっていきますが、[ByteArrayOutputStream#reset](http://docs.oracle.com/javase/jp/6/api/java/io/ByteArrayOutputStream.html#reset%28%29)を呼ぶようにすればクリア出来ます。

```java:RedirectConsole.java
private static void redirectConsole(JTextArea textarea, JButton resetButton) {
    final ByteArrayOutputStream bytes = new ByteArrayOutputStream() {
        @Override
        public synchronized void flush() throws IOException {
            textarea.setText(toString());
        }
    };

    resetButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            synchronized (bytes) {
                bytes.reset();
            }
        }
    });

    // trueをつけるといいタイミングでflushされる
    PrintStream out = new PrintStream(bytes, true);

    System.setErr(out);
    System.setOut(out);
}
```
許容誤差付きEqインスタンス

Fixedでいいんじゃないの、というのは無しの方向で…

```haskell
{-# LANGUAGE FlexibleInstances, FlexibleContexts, KindSignatures, GeneralizedNewtypeDeriving #-}
import GHC.TypeLits

newtype Tol (d :: Nat) a = T a deriving (Show, Num, Fractional, Real, Floating, RealFrac, RealFloat)

instance (Num a, Fractional a, Ord a, SingRep e Integer) => Eq (Tol e a) where
    a == b = withSing (eqN a b) where
        eqN :: (Num a, Fractional a, Ord a) => Tol e a -> Tol e a -> Sing e -> Bool
        eqN (T a) (T b) e = abs (a - b) < recip (fromIntegral $ 10 ^ fromSing e)

instance (Num a, Fractional a, Ord a, SingRep e Integer) => Ord (Tol e a) where
    compare a@(T x) b@(T y)
        | a == b = EQ
        | x < y = LT
        | x > y = GT

{-
ghci> T 1.0 + T 2.0
T 3.0
ghci> (T 1.0 :: Tol 3 Float) == (T 1.00001 :: Tol 3 Float)
True
ghci> (T 1.0 :: Tol 5 Float) == (T 1.00001 :: Tol 5 Float)
False
-}
```
Titanium で binary データをファイルに書き込む方法

Titanium は内部的に Blob を使っている箇所もあり、画像データや HTTPClient で取得したデータなどは、Binary でファイルに書き出すことができます。

ただ、プログラム中で作った Binary っぽいデータなど（音声データや動画データなど）は、
普通に `file` に `write` するだけではうまくいかない場合があります。

そんな時は、`Ti.Buffer` を使ってみるといいと思います。

```javascript
function pack(fmt, data) {
    var result = '';
    //... implement 'V' only
    switch (fmt) {
    case 'V':
        result += String.fromCharCode(data & 0xFF);
        result += String.fromCharCode(data >> 8 & 0xFF);
        result += String.fromCharCode(data >> 16 & 0xFF);
        result += String.fromCharCode(data >> 24 & 0xFF);
    }
    return result;
}

// Binary っぽいファイルを Binary でちゃんと出力する
var blob, buff, file;

blob = [
    'fmt ',
    pack('V', 16),
    pack('V', 44100)
].join('');

buff = Ti.createBuffer({length: blob.length});
for (var i = 0; i < blob.length; i++) {
    buff[i] = blob.charCodeAt(i)
}

file = Ti.Filesystem.getFile(Ti.Filesystem.tempDirectory, "binary");
file.write(buff.toBlob());
```

Binary っぽいデータを一度 Ti.Buffer に書き込み、`toBlob` を使ってバイナリ化して書き込みます。

##### 普通に書きだしたとき #####
\xC2 というデータが書き出されてしまっている。リトルエンディアンで処理しているバイナリデータをUTF-8で書きだすからなんか変になっているのではないかと。
![普通に書きだしたとき](http://hamasyou.com/images/PlainWrite.png)

##### Blob で書きだしたとき #####
\xC2 は書き出されていない。
![Bufferで書きだしたとき](http://hamasyou.com/images/BlobWrite.png)
Origami で PDF に埋めこまれている画像を抽出する


以下のようなコードで抽出できる。

```ruby:extract_images.rb
# coding: utf-8                                                                                                                           
require 'origami'                                                                                                                         
                                                                                                                                          
include Origami                                                                                                                           
                                                                                                                                          
pdf = PDF.read(ARGV[0])                                                                                                                   
                                                                                                                                          
images = pdf.root_objects.find_all {|obj| obj.is_a?(Graphics::ImageXObject)}                                                              
                                                                                                                                          
images.each do |stream|                                                                                                                   
  ext, image_data = stream.to_image_file                                                                                                  
  image_file = "image_#{stream.reference.refno}.#{ext}"                                                                                   
  File.open(image_file, "wb") do |f|                                                                                                      
   f.write(image_data)                                                                                                                    
  end                                                                                                                                     
end           
```

使い方

```bash:
$ ruby extract_images.rb PDFファイル名
```
Mac で rename コマンド（ファイル名一括変換）


Mac には Linux の rename コマンドがありません。Homebrew に似たのがあるので、入れてみます。（名前は同じですが別物のようです。）

```
brew install rename
```

## 使い方

foo を bar に、hello を ciao に変える場合はこんな感じです。

```
rename -s foo bar -s hello ciao *
```

正規表現で置換。

```
rename 's/\.htm$/.html/' *.htm
```

もちろん後方参照も使えます。

```
rename 's/img-(\d*).jpg/foo-$1-bar.jpg/' *
```

ディレクトリ内のファイルを再帰的に改名するには find と組み合わせて使います。Mac に標準で入っているの bash の glob の '*' は深いディレクトリ階層にマッチしないためです。

```
find . -name "*foo*" | xargs rename -s foo bar
```

ドキュメントは以下です。
http://plasmasturm.org/code/rename/
復習 モナド

# はじめに

monad って一体なんなのって、[象の絵が](http://learnyouahaskell.com/)[かいてある本](http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06885-0)とか、色々な所で色々なやり方で論じられていると思うので、適宜調べればいいと思うんですけど、やっぱり自分用のまとめも欲しい。とりあえずここに『復習 モナド』としてまとめておきます。

# レジュメ

```haskell:monad.hs
-- 射の合成
(.)   ::                 (  b ->   c) -> (  a ->   b) -> (  a ->   c)
(<=<) :: Monad    m   => (  b -> m c) -> (  a -> m b) -> (  a -> m c)
(=<=) :: Comonad  w   => (w b ->   c) -> (w a ->   b) -> (w a ->   c)
(<<<) :: Category cat => cat b c      -> cat a b      -> cat a c

-- 関手
($)   ::                    (  a ->   b) -> (  a ->   b)
map   ::                    (  a ->   b) -> ([a] -> [b])
(<$>) :: Functor     f =>   (  a ->   b) -> (f a -> f b)

-- Applicative
repeat ::                  a -> [a]
pure   :: Applicative f => a -> f a
(<*>)  :: Applicative f => f (a -> b) -> (f a -> f b)

-- Monad
fmap      :: Functor f => (a -> b) -> (f a -> f b)
return    :: Monad   m => a -> m a
join      :: Monad   m => m (m a) -> m a
(=<<)     :: Monad   m => (a -> m b) -> (m a -> m b)

-- Comonad
fmap      :: Functor f => (a -> b) -> (f a -> f b)
head      ::              [a] -> a
extract   :: Comonad w => w a -> a
duplicate :: Comonad w => w a -> w (w a)
(<<=)     :: Comonad w => (w a ->   b) -> (w a -> w b)
```

# 合成と圏論

小さいプログラムを『合成 compose』して、大きなプログラムを作りたい。たとえば f :: Float -> Int という「関数」と g :: Int -> String という「関数」を組み合わせて、 (g . f) :: Float -> String という「関数」を作れる。

a -> b の a の方を『ドメイン domain』、 b の方を『余ドメイン codomain』と呼ぼう。関数 g のドメインと関数 f の余ドメインが両方とも Int だから、合成できることが分かる。

「関数」だけじゃなくて、「無限リストの処理」とか「副作用のある計算」みたいなプログラムでも同じことができる。こういった、ドメインと余ドメインを持っていて合成できるものを『射 morphism』、その全体を『圏 category』と呼ぶ。圏論は圏や射についての理論。

Haskellの (.) 演算子は関数の合成。同様に (<=<) 演算子はKleisli圏（後で出てきます）の射 (a -> m b) の合成。Haskellにはそのまま Category という名前の型クラスが定義されていて、 (<<<) 演算子はどの圏の射の合成にも使える、オールマイティーな演算子。逆向きの (>=>) や (>>>) という演算子もある。

# 関手とFunctor型クラス

**2013年2月2日 内容が間違っているので修正**

HaskellのFunctor型クラスの定義する fmap 関数は、リストのに対する map 関数を一般化したものだと思える。「関数 (a -> b)」を「コンテナ型の関数 (f a -> f b)」に変換してくれる関数を定義している。

<del>関数の圏の対象からコンテナ型の関数の圏の対象への関数 a -> f a は『対象関数 object function』、</del><ins><a href="http://qiita.com/sct/items/5d7e50549918b25cacf6">Qiita内で圏論に言及するエントリのまとめ (2)</a></ins>関数からコンテナ型の関数への写像 (a -> b) → (f a -> f b) は『射関数 mapping function』にあたる。関手はこの2つの関数から成り立っている。（Functor型クラスでは射関数 fmap だけが定義されている）

『関手 functor』はには次の性質が成り立つ。

```haskell:functor.hs
-- 合成の保存
functor (g <<< f) === functor g <<< functor f
-- 恒等射の保存
functor id === id
```

恒等射は他の射と合成しても何も変わらない射。

```haskell:id.hs
id <<< f === f
g <<< id === g
```

よく分からないイメージ図。

```

  a       →【g】→      b

           ⇩ map

 [a]   →【map g】→    [b]


  a       →【g】→      b

           ⇩ fmap

 f a   →【fmap g】→   f b

```

```(<$>)``` 演算子はfmapの別名で、```(fmap f)``` と ```(f <$>)``` は同じ。

# どうやら時間切れのようだ……

続きはまた次回。
SBTで実行可能なjarファイルを作る

sbt-assemblyが簡単すぎて鼻血が出た話

鼻血は出てないです、スイマセン。

sbtのプロジェクトで実行可能なjarファイルを作る方法です。

sbt-assemblyを使います。

ファイル構成はこんな感じ

```test:tree.text
./
├── build.sbt
├── project
│   ├── plugins.sbt
│   ├── project
│
├── src
│   └── main
       └── scala
```
`plugins.sbt`に以下を記述

```scala:plugin.sbt
resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.5")
```

`build.sbt`はこんな感じ

```scala:build.sbt
import AssemblyKeys._ //一番最初の行に書く

name := "app name"

version := "0.1.0"

scalaVersion := "2.9.1"

libraryDependencies += "org.scalatest" %% "scalatest" % "1.9.1" % "test"

assemblySettings	//これを追加しますん
```

最後に、sbtのインタープリタから

`assembly`

と打つだけ。これで実行可能なjarファイルがtarget下にできます。

すげえ、簡単すぎて泣ける。

sbtはいいなぁ・・・

リンク
[sbt-assembly](https://github.com/sbt/sbt-assembly)
[sbtで実行可能なJarを生成する方法（sbt-assembly）](http://ameblo.jp/wataru420/entry-11202812747.html)
neoagent1人読書会 その8


今回はKVSからのレスポンスをウェブアプリケーションに書き出す部分。「その5」で見たna_client_callbackの残り半分を読んでいく。

```c
static void na_client_callback(EV_P_ struct ev_io *w, int revents)
{
    int cfd, tsfd, size;
    na_client_t *client;
    na_env_t *env;

    cfd    = w->fd;
    client = (na_client_t *)w->data;
    env    = client->env;
    tsfd   = client->tsfd;

    pthread_rwlock_rdlock(&env->lock_refused);
    if ((client->is_refused_active != env->is_refused_active) || env->is_refused_accept) {
        pthread_rwlock_unlock(&env->lock_refused);
        NA_EVENT_FAIL(NA_ERROR_INVALID_CONNPOOL, EV_A, w, client, env);
        return; // request fail
    }
    pthread_rwlock_unlock(&env->lock_refused);

    if (env->loop_max > 0 && client->loop_cnt++ > env->loop_max) {
        NA_EVENT_FAIL(NA_ERROR_OUTOF_LOOP, EV_A, w, client, env);
        return; // request fail
    }

    if (revents & EV_READ) {

..

    } else if (revents & EV_WRITE) {

```

ここまではいつもどおり。

```c
        size = write(cfd,
                     client->srbuf + client->cwbufsize,
                     client->srbufsize - client->cwbufsize);

        if (size < 0) {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
                return; // not ready yet
            }
            if (errno == EPIPE) {
                NA_EVENT_FAIL(NA_ERROR_BROKEN_PIPE, EV_A, w, client, env);
            } else {
                NA_EVENT_FAIL(NA_ERROR_FAILED_WRITE, EV_A, w, client, env);
            }
            return; // request fail
        }

        client->cwbufsize += size;
```

ここも特におかしいところはない。

- srbuf: レスポンスバッファーの先頭を指すポインター
- srbufsize: レスポンスバッファーのうち実際に使われているバイト数
- cwbufsize: レスポンスバッファーのうち書き出しが終わったバイト数

```c
        if (client->cwbufsize < client->srbufsize) {
            na_event_switch(EV_A_ w, &client->c_watcher, cfd, EV_WRITE);
            return;
        } else {
            client->crbufsize        = 0;
            client->cwbufsize        = 0;
            client->srbufsize        = 0;
            client->swbufsize        = 0;
            client->request_bufsize  = env->request_bufsize;
            client->response_bufsize = env->response_bufsize;
            client->event_state      = NA_EVENT_STATE_CLIENT_READ;
            client->req_cnt          = 0;
            client->res_cnt          = 0;
            na_event_switch(EV_A_ w, &client->c_watcher, cfd, EV_READ);
            return;
        }
        
    }
}
```

最後に書き出し完了していたらclientを初期化して、na_event_switchでまたREADフェーズに入っている。動的に確保したバッファーも解放したりはしてない。

ここまででneoagentの挙動は理解できた。コネクションプールとかクライアントプールっていったい何なの？とかソケットの扱いとか色々あるけど、とりあえず1人読書会はここまでにしておく。
neoagent1人読書会 その7


「その6」で出てきたna_target_server_callbackのもう半分。今回はKVSからのレスポンスを読み込む部分。

コードは「その5」で出てきたna_client_callbackのREADとほぼ同じなのでさくっと終わる。

```c
    if (revents & EV_READ) {

        if (!env->is_extensible_response_buf) {
            if (client->srbufsize >= client->response_bufsize) {
                NA_EVENT_FAIL(NA_ERROR_OUTOF_BUFFER, EV_A, w, client, env);
                return; // request fail
            }
        } else if (client->response_bufsize > env->response_bufsize_max) {
            NA_EVENT_FAIL(NA_ERROR_OUTOF_BUFFER, EV_A, w, client, env);
            return; // request fail
        } else if (client->srbufsize >= client->response_bufsize) {
            size_t es;
            es = (client->response_bufsize - 1) * 2;
            if (es >= env->response_bufsize_max) {
                es = env->response_bufsize_max;
            }
            client->srbuf = (char *)realloc(client->srbuf, es + 1);
            client->response_bufsize = es;
        }

        size = read(tsfd, 
                    client->srbuf + client->srbufsize,
                    client->response_bufsize - client->srbufsize);

        if (size <= 0) {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
                return; // not ready yet
            }
            NA_EVENT_FAIL(NA_ERROR_FAILED_READ, EV_A, w, client, env);
            return; // request fail
        }

        client->srbufsize                += size;
        client->srbuf[client->srbufsize]  = '\0';

        if (client->srbufsize > env->response_bufsize_current_max) {
            env->response_bufsize_current_max = client->srbufsize;
        }
```

- srbuf: レスポンスバッファーの先頭を指すポインター
- srbufsize: レスポンスバッファーのうち実際に使われているバイト数
- response_bufsize: レスポンスバッファーのバイト数

```c
        if (client->cmd == NA_MEMPROTO_CMD_GET) {
            client->res_cnt = na_memproto_count_response_get(client->srbuf, client->srbufsize);
            if (client->res_cnt >= client->req_cnt) {
                client->event_state = NA_EVENT_STATE_CLIENT_WRITE;
                na_event_switch(EV_A_ w, &client->c_watcher, cfd, EV_WRITE);
                return;
            }
```

「その5」でも書いたとおり、getだったらmulti getの可能性があるのでリクエスト時のgetのキー数とレスポンスの値の数（END\n\r）を数えて一致したら終了としている。

```c
        } else if (client->srbufsize > 2 &&
                   client->srbuf[client->srbufsize - 2] == '\r' &&
                   client->srbuf[client->srbufsize - 1] == '\n')
        {
            client->event_state = NA_EVENT_STATE_CLIENT_WRITE;
            na_event_switch(EV_A_ w, &client->c_watcher, cfd, EV_WRITE);
        }
```

ちゃんとリクエストが終了していれば状態をクライアントへの書き出しに変えてイベントウォッチャーを変更して終わり。
カスタムメニューを使った送信ボタンの無いドロップダウンメニューで、カテゴリーページへ移動をする

私はよくカテゴリーの並び替えをしたナビゲーションなどを、カスタムメニューを使って構成しているのですが、表示させたいカテゴリーやリンクの量が多くて見づらい！と思うこともしばしばでした。
この記事は、月別のアーカイブなどでよく見かける、ドロップダウンメニュー式のページ遷移をカスタムメニューで作成したメニューにも使ってコンパクトに表示してみたいと思ったのがきっかけです。

【要は以下の条件を満たしたカテゴリーのリンクを設置したい】
●カテゴリーを取捨選択
●しかも並べ替えしたい
●ドロップボックス表示（そして選択したら遷移）したい

ただ単に、並べ替えのしていないカテゴリーをドロップダウンメニュー表示にするなら「wp_dropdown_categories」を使えばいいと思うのですけど、これだとカテゴリの順序を入れ替えできない！

だけど、カスタムメニューで作成されたメニューのデータを取得する、「wp_get_nav_menu_items」であれば実現することができました。


* * *


以下のコードを記述する前に、
1)functions.php に、register_nav_menus()を記述してカスタムメニュー機能を有効にしておきます。
2)カスタムメニューを作成して
3)表示させたいPHPファイルの該当する箇所に以下コードを記述。

```php:index.php
<select onChange='document.location.href=this.options[this.selectedIndex].value;'>
<option>カテゴリーを選択</option>
<?php
$dropItems = wp_get_nav_menu_items('dropCategory');
foreach($dropItems as $item) :
  echo '<option value="' . get_category_link($item->object_id) . '">' . $item->title . '</option>';
endforeach;
?>
</select>
```

select要素のonChangeイベントは、選択したoptionのvalueで指定されたURLへ遷移するための記述です。

wp_get_nav_menu_items() の引数に入れている「dropCategory」は、カスタムメニューで作成したメニューの名前です。

get_category_linkの引数にカテゴリーIDを入れて、カテゴリーページへのURLをセットしています。このURLで遷移します。
bin/vendorsコマンドでcomposerのライブラリをインストールする

Symfony2は2.2以降composerでインストール出来るようになったので、Packagistのライブラリが利用しやすくなりましたが、2.0/2.1もcomposerとおなじ[PSR-0](http://www.infiniteloop.co.jp/blog/2012/10/psrphp/)形式のAutoloaderを使ってるので、bin/vendorsコマンドでPackagistのライブラリを利用する事ができます。


[aws-sdk-php](https://packagist.org/packages/aws/aws-sdk-php)を例に説明します。


## 1. とりあえずPackagistで公開されているライブラリのgit(http)のURLを調べる。
 Packagistのページからcannonicalのリンクを開いて、http (https://github.com/aws/aws-sdk-php.git) のリンクをコピーします。 ※1
※1 SSH/git-read-onlyのリンクを使うとbin/vendorsコマンドの時にgithubへのID/PASSが求められるので面倒です。

## 2. depsファイルにそのリンクを貼り付ける。
```properties
[aws-sdk-php]#セクション名はなんでも良い。
    git=https://github.com/aws/aws-sdk-php.git
    version=2.1.0 # tagsのページから必要なバージョンのタグ名を貼り付ける。
```

## 3. compser.jsonを開いて、requireでで必要されているライブラリを調べる。
```json
{
//.......
    "require": {
        "php": ">=5.3.2",
        "guzzle/guzzle": "~3.1.2"
    },
//.......
    "autoload": {
        "psr-0": {
            "Aws": "src/"
        }
    }
}
```
aws-sdk-phpの場合Guzzleを必要としてるので、Guzzleのgitのリンクを調べてdepsに追加します。

```properties
[aws-sdk-php]
    git=https://github.com/aws/aws-sdk-php.git
    version=2.1.0

[guzzle]
    git=https://github.com/guzzle/guzzle.git
    version=v3.1.2
```
## 4. bin/vendorsコマンドを実行
```shell
php bin/vendors install(update)
```
を実行して上記で追加したファイルがvendorsディレクトリに入っている事を確認します。
(vendors/[セクション名]にライブラリがインストールされるはずです。)

## 5. app/autoloader.phpを修正。
composer.jsonの **autoload** セクションを元に、app/autoloader.phpを修正します。

```php
$loader->registerNamespaces(array(
    'Symfony' => __DIR__.'/../vendor/symfony/src',
    'Monolog' => __DIR__.'/../vendor/monolog/src',
//...
//...
    'Aws' => __DIR__.'/../vendor/aws-sdk-php/src',
    'Guzzle' => __DIR__.'/../vendor/guzzle/src',
));
```
配列のキーにautoload > psr-0 > キー
配列の値に__DIR__.'/../vendor/[depsのセクション名]/autoload > psr-0 > バリュー'
を設定します。


上記で、設定が完了です。
別途、composerコマンドを入力したり、compposerのautolaod.phpをインクルードしたり剃る必要がないのでライブラリの管理コストがぐっと低減されます！
CSSのセレクタ一覧を機械的に抽出

CSSの静的解析ツールをなんか作れないかなー、ということで、SassにあるCSSのパーサーを使ったらいいんじゃね?ということで、書いてみました。

だいぶ遅いので、もっと効率的な方法あるんじゃないかなーと思いつつ、とりあえずメモ。

```ruby:print_selector.rb
require 'sass/css'
require 'pp'

def print_selector(file)
  css = ""
  File.open(file) do |io|
    css = io.read
  end
  css = Sass::CSS.new(css, {:filename => file})
  css_tree = css.__send__(:build_tree)
  css_tree.select {|n| n.is_a?(Sass::Tree::RuleNode) }.each do |rule|
    pp rule.parsed_rules.members
  end
end

print_selector(ARGV[0])
```
FPS/CPU使用率/メモリ消費量のモニタリング

CoronaでFPSとその平均値、CPU使用率、メモリ消費量をモニタリングするモジュールです。結構適当かもしれん。



```lua:lib/util/simplefps.lua
module(..., package.seeall)

--FPSの定義、コンテンツに合わせる
local content_fps = 60;

--カウンタ表示用

displayObject = display.newGroup();

local textFront  = display.newText("",   display.contentWidth/2,   5, native.systemFont, 20 );
local textShadow = display.newText("", 1+display.contentWidth/2, 1+5, native.systemFont, 20 );

textFront:setTextColor ( 255,255,255 );
textShadow:setTextColor( 0,0,0 );

displayObject:insert( textShadow );
displayObject:insert( textFront );

--

local frame_count = 0;
local count_num = 0;
local total_frame = 0;

local cpu_count = 0;
local cpu_per = 0;
local cpu_ms = 0;

--

local function cpuChecker()
	cpu_count = cpu_count + 1;
	local d = cpu_count % content_fps;
	if d == 1 then
		cpu_ms = os.clock();
	elseif d == 0 then
		cpu_ms = os.clock()-cpu_ms;
		cpu_per = math.floor(cpu_ms*100);
	end;
end;

local function enterframeCheck( event )
	frame_count = frame_count+1;
	cpuChecker();
end;


local function oneSecondCheck( event )
	count_num = count_num + 1;
	total_frame = total_frame + frame_count;
	
	local ave = math.floor( 10*total_frame/count_num )/10;
	local mem = math.floor( collectgarbage( "count" )/1024*100)/100;
	local tex = math.floor( system.getInfo( "textureMemoryUsed" )/1024/1024*100)/100;
	
	local disp = "FPS:"..frame_count .. "  AVE:".. ave .."  MEM:"..mem.."MB".."  TEX:"..tex.."MB  ".."CPU:"..cpu_per.."%";
	textFront.text , textShadow.text = disp , disp;

    frame_count = 0;
end

Runtime:addEventListener( "enterFrame", enterframeCheck );
timer.performWithDelay( 1000, oneSecondCheck , 0 );
```

`content_fps`の値はコンテンツのfpsに合わせて書き換えてください。

## 使いかた
```lua:main.lua
local fps = require "lib.util.simplefps";
fps.displayObject.y = display.contentHeight/2;
```

こんな感じ。配置座標はお好きなように。
で、以下が画面に表示されるはずです。

**FPS:** 1秒間に何枚画面描画されているか。content_fpsの値と近ければ良いかんじ。

**AVE:** このモジュールを読込んでからの平均fps

**MEM:** メモリ使用量

**TEX:** テクスチャメモリ使用量

**CPU:** CPU使用率。適当な算出ですが、CoronaシミュレータとiOSにおいては近似値が出ているはず（アクティビティモニタで確認してみてください）。Androidにおいては100%未満はうまく算出出来ません。

これを使うと、「iPhone5って速ええなあ、iPhone4の4倍かよ」とか「Macはやっぱスマホより圧倒的に速い」とか「Tegra3って全然速くないのね（泣」とか色々分かります。アプリをうっかり落とさないように、しっかりチューニングしましょう。
同じ処理をテンプレート化する

同じ処理をまとめたくて作ってみた。


https://gist.github.com/4690864
実験コードなので使用の際は注意

引数および戻り値ともにオブジェクト型のみ対応

---

テンプレートの登録

```
[[STTemplate appearance] addTemplate:^id() {
    void(^block)(UIImageView *) = ^void(UIImageView *view) {
        view.layer.cornerRadius = 30;
        view.clipsToBounds = YES;
    };
    return block;
} forKey:@"ImageViewを角丸に"];

[[STTemplate appearance] addTemplate:^id() {
    void(^block)(UIImageView *, NSNumber *) = ^void(UIImageView *view, NSNumber *radius) {
        view.layer.cornerRadius =[radius floatValue];
        view.clipsToBounds = YES;
    };
    return block;
} forKey:@"複数引数の時は"];
```

テンプレートの適用

```
[[STTemplate appearance] templateOf:@"ImageViewを角丸に"](someImageView);
[[STTemplate appearance] templateOf:@"複数引数の時は"](someImageView, @(30));
//もしくはマクロから呼び出し
STTemplateApply([STTemplate appearance], @"ImageViewを角丸に", someImageView);
```

戻り値を返すとき

```
[[STTemplate appearance] addTemplate:^id() {
    id(^block)() = ^id() {
        return @"hoge";
    };
    return block;
} forKey:@"戻り値を返すときはこんな感じ"];
```


```
id hoge = STTemplateExecute([STTemplate appearance], @"戻り値を返すときはこんな感じ");
```
jQueryでonしてすぐにoffする場合。

```javascript:allFunciton.js
$('#html_id').on('any_event', function(e){
  $(this).off('any_event');
});
```
もちろんこれでもいいのだが、他のイベントリスナーまでオフにしてしまう。

なのでe.handleObj.handlerを使って解決する。

```javascript:selfFuncitonOnly.js
$('#html_id').on('any_event', function(e){
  $(this).off('any_event', e.handleObj.handler);
});
```
上記、jQueryなのでブラウザテストしてないです！！！


以下でも行ける気がするのだが、どうなんだろう。

```javascript:useFunction.js
handlerFunction = function(e){
  $(this).off('any_event', handlerFunction);
}
$('#html_id').on('any_event', handlerFunction);
```

評価順的に混乱しそうなのでやってないです・・・・