OmniAICreator/Qiita-1.07M huggingface dataset:
（Rの）プロミス問題　その３。


http://qiita.com/items/660eac769fa1a82fbf42 と
http://qiita.com/items/a7a1f51726ea2cb2e274 の続き。

以降、関数呼び出し時のプロミス＋遅延評価ではまりがちなところ。

今回はsubstituteです。

## substituteとは。

よく「関数呼び出し時の引数がどんなだったか知るには`substitute`を使えばいい」という話を聞きます。

```R
> f <- function(a) {
+ 	print(substitute(a))
+ }
> 
> f(1)
[1] 1
> f(x+y)
x + y
> f(for (i in 1:3) {print(i)})
for (i in 1:3) {
    print(i)
}
```

はい。これは例えばplotで引数をlabelで表示するときとかに使われます。遅延評価の強みですね。

ところで`substitute`の本当の機能というのは、これ大事なとこなので?substituteから抜粋しておきますが、

>`substitute` returns the parse tree for the (unevaluated) expression `expr`, substituting any variables bound in `env`.

和訳すると、「`substitute`は、`env`で束縛された変数を置換しつつ、（未評価の）式`expr`に対する構文木を返す」、と。

# substituteは置換する

要するに、substituteは式をなんとなく置換する関数だ、ということです。
どうやって置換するかというと、

>Substitution takes place by examining each component of the parse tree as follows: If it is not a bound symbol in env, it is unchanged. If it is a promise object, i.e., a formal argument to a function or explicitly created using delayedAssign(), the expression slot of the promise replaces the symbol. If it is an ordinary variable, its value is substituted, unless env is .GlobalEnv in which case the symbol is left unchanged.

「substitution（置換）は構文木の各要素を以下の通りに精査する：もし`env`に束縛されたシンボルじゃなければそのまま。もし関数の仮引数だったり`delayedAssing()`でつくられたりしたプロミスなら、シンブルはプロミスの式で置換される。普通の変数なら、値に置換される。**ただし** `env` が `.GlobalEnv` の時にはシンボルは置換されない」と。

で、`env`のデフォルトは現在の環境なので、

```R
> delayedAssign("x", {a+b}) # トップレベルでプロミス作成
> print(substitute(x)) # プロミスの式帰ってこない・・・
x
> 
> f <- function() { # 関数の中で
+   delayedAssign("x", {a+b}) # 全く同じことを行うと・・・
+   print(substitute(x))
+ }
> f() # ちゃんと式帰ってくる
{
    a + b
}
```

これを知らなかった間は、正直`substitute`の挙動が謎すぎて意味わかりませんでした。

よく使われる「`substitute`で関数への引数を知る」っていうのは、substituteの中のほんの一部の機能だということです。っていうか、この関数おかしすぎだろ。

## substituteの置換はレキシカル

substituteは全く評価を行わないので、文法的に誤った式はエラーですが、
出来上がった構文木が正しく評価されるかどうかは知りません。

```R
> f <- function() {
+   delayedAssign("x", a+b)
+   z <- 2
+   print(substitute(x <- z))
+ }
> f()
a + b <- 2 # 文法的には正しいんだけど、これはダメ。
```

誰か、substituteがこうなった歴史について知ってたら教えて下さい。

## 環境じゃなくてリストでOK

```R
> z <- list(a = 1, b = 2)
> substitute(a + b, z) # リストに束縛された値で置換。ただし評価はされない。
1 + 2
```

## plotmathにおけるsubstitute

だんだんプロミスと関係なくなって来ましたが。ユーザレベルでsubstituteを使うのはもしかしたらグラフに数式を（動的に）書きたい時、かもしれません。これも上のsubstituteの基本を知っとけば恐れることはありません。

`plotmath`の例から：

```R
> plot(1:10, type="n", xlab="", ylab="", main = "plot math & numbers") # plot
> theta <- 1.23
> mtext(bquote(hat(theta) == .(theta)), line= .25) # bquoteはsubstituteのシンタックスシュガー
> for(i in 2:9)
+     text(i,i+1, substitute(list(xi,eta) == group("(",list(x,y),")"), # *1
+                            list(x=i, y=i+1))) # *2
```

*1 の中のxは*2のiで、yが*2のi+1で置換される、というだけの話です。
`substitute`の引数`env`は評価されるので、最初はxが2、yが3、最後はxが9、yが10となります。
MacアプリのArchive時に処理を行う

Sparkleのappcast.xmlを作ったり，スタッフにアプリを配ったり，`codesign`の実行などArchive時に行う処理を自動化する．

## 方法
Product -> Edit Scheme -> 左メニュー一覧のArchive->一番下のPost-actionを選択
あとはArchive時に実行したい処理を書けばよい．
![](http://f.cl.ly/items/070W3b2j3Q0g1g330m2b/Screen Shot 2012-04-10 at 12.12.41 AM.png)

## 設定例

```bash
env > /tmp/xcode-archive-env.log # 環境変数をダンプする
ARCHIVE_APP="$ARCHIVE_PRODUCTS_PATH/Applications/$WRAPPER_NAME"
codesign -s "Some Certificate" "$ARCHIVE_APP" >/tmp/post-action.log 2>/tmp/post-action-error.log # コードサイン
cp "$ARCHIVE_APP" ~/Dropbox/ShareDir # 共有用にアプリをコピーする
```

## tips
使える環境変数は以下のドキュメントにある．`$ARCHIVE_PRODUCTS_PATH`とか使える
https://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW105

全部値が見たいときは`env > /tmp/xcode-archive-env.log`なんかを設定して一度実行すればいい．
MacからSSHでサーバーに自動ログイン

 1. MacのTerminal.appを起動しvi等を使ってコピって保存
 2. chmod o+x ./ssh_autologin.sh
 3. ./ssh_autologin.sh で自動ログイン
 4. ネットワークによって遅延が大きい場合、timeoutの数を大きくして調節

```Shell:ssh_autologin.sh

#!/usr/bin/expect

set timeout 2
spawn ssh ユーザー名@サーバーアドレス -p ポート番号
expect "Password: "
send "パスワード\n"
interact

```

パスワードを生で保存します。取り扱い注意
鍵認証とかも欲しいなぁ
vimperatorで快適ブラウジング

## vimperatorとは

ブラウザをキーボードのみで操作できるようになるFirefoxのアドオン。vimのように操作できる。

## ダウンロード

https://addons.mozilla.org/ja/firefox/addon/vimperator/

## 設定

以下のテキストをホームディレクトリに`.vimperatorrc`として保存。
Firefoxを再起動。

```vim:.vimperatorrc
map j 5<C-e>
map k 5<C-y>
map h <C-p>
map l <C-n>
map H <A-Left>
map L <A-Right>

set hintchars=asdfjkl
```

## vimperatorの世界にようこそ！

### 基本的なキーボード操作

- `o`でurlを入力して`Enter`で候補のページを開く。
- `t`でurlを入力して`Enter`で候補のページを別タブで開く。
- `d`でタブを閉じ、`u`で閉じたタブを開く
- `j`, `k`で上下に移動
- `h`, `l`でタブを左右に移動
- `H`, `L`でウィンドウの履歴を前後に移動
- `f`でリンクにキーが表示される。どれかのキーを入力するとリンクを開く。
- `F`でリンクにキーが表示される。どれかのキーを入力すると別タブでリンクを開く。
- `/`でページ内を検索する。`n`, `N`で検索結果を移動する。
Play2.0のアプリをherokuにdeployしたときのエラーE10を解消する方法


公式ドキュメントを参照した。
http://www.playframework.org/documentation/2.0/ProductionHeroku

ルートディレクトリで下記を実行


```sh
echo "web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS}" > Procfile
```

あとは同じ

```sh
git init
git add .
git commit -m "init"
heroku create -s cedar
git push heroku master
heroku open
```

\#%や$はコピペしにくいので抜いた
githubでfork元から最新を取り込む


例えば[ranguba/rroonga](https://github.com/ranguba/rroonga)からforkした[ongaeshi/rroonga](https://github.com/ongaeshi/rroonga)があって、ranguba/rroongaの最新版を取り込みたいような場合。

*ranguba/rroonga* をremoteに *fork_master* といった名前で登録し、fetch->mergeすればよい

```
git remote add fork_master git://github.com/ranguba/rroonga.git
git fetch fork_master
git merge remotes/fork_master/master
```
HashからSelectタグを作る

Rails3.2で検証。ActiveRecordの配列以外から作るときはこんな感じでできる。
コレクションを指定して、個々の要素のどれがkey(:first)でvalue(:last)になるか指定するのがポイント

```ruby
- list = {"01"=>"ABC","02"=>"FFF"}
= select_tag :company_name, options_from_collection_for_select(list,:first,:last)
```
はじめてのiOS 「iOSテクノロジーの概要」読んだ


[iOSテクノロジーの概要](https://developer.apple.com/jp/devcenter/ios/library/documentation/iPhoneOSTechOverview.pdf)を読んだ。

iOSのレイヤは大きくわけて4つあって、各レイヤにどんなフレームワークが定義されているよ、ってのをさらっと紹介している文書。

* Cocoa Touchレイヤ
* Mediaレイヤ
* Core Serviceレイヤ
* Core OSレイヤ

バックグランド処理はどんなことが出来るのか知りたい。

* Highlightとかの処理って重くないの？
* Core Locationフレームワークの
"ユーザの位置の変化を追跡するため携帯電話の基地局を使用する、低消費電力の位置 監視サービスのサポートが導入されました。"ってのが気になる。ユーザーの位置情報の追跡ってバックグランドで割と現実に可能なのか？
NSUserDefaultsの使い方

NSUserDefaultsの使い方

## 文字列を保存したいとき
```ObjectiveC:test.m
NSString *hoge = @"hoge";

//keyNameという名前でhoge(文字列)を保存する
[[NSUserDefaults standardUserDefaults] setObject:hoge forKey:@"keyName"];
[[NSUserDefaults standardUserDefaults] synchronize]; //すぐに保存する
```

## 数値を保存したいとき
```ObjectiveC:test.m
NSInteger hoge = 1;

// keyNameという名前でhoge(数値)を保存する
[[NSUserDefaults standardUserDefaults] setInteger:hoge forKey:@"keyName"];
[NSUserDefaults standardUserDefaults] synchronize];
```

## 保存したものを取り出す
```ObjectiveC:test.m
NSString *string = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyName"];
NSInteger integer = [[NSUserDefaults standardUserDefaults] integerForKey:@"keyName"];
```
getter/setterがないインスタンス変数に外部からアクセスする

```ruby
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

class Hoge
  # setterは公開されていない
  attr_reader :fuga
  def initialize
    @fuga = 'fuga'
    # getter/setter共に公開されていない
    @hige = 'hige'
  end
end

hoge = Hoge.new
p hoge.fuga
#  => "fuga"

# インスタンス変数の名前を文字列で指定して
# 外から強制的に書き換える
name = "@fuga"
hoge.instance_variable_set(name, 'fugafuga') if hoge.instance_variable_defined?(name)
p hoge.fuga
#  => "fugafuga"

# シンボルでも指定できる
hoge.instance_variable_set(:@fuga, 'fugafugafuga') if hoge.instance_variable_defined?(:@fuga)
p hoge.fuga
#  => "fugafugafuga"

# 読むのも当然できる
p hoge.instance_variable_get('@hige') if hoge.instance_variable_defined?('@hige')
#  => "hige"

```
CMSampleBufferをCGImageやUIImageに変換

`AVCaptureSession`等でカメラ画像をキャプチャリングした場合には、`CMSampleBuffer`の形式で画像が得られる。
これをビットマップ処理する場合などに、ビットマップデータまたは`CGImage`等でアクセスしたい場合に有効。

```objc

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
CVPixelBufferLockBaseAddress(imageBuffer, 0);
void *baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
size_t width       = CVPixelBufferGetWidth(imageBuffer);
size_t height      = CVPixelBufferGetHeight(imageBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef cgImage = CGBitmapContextCreateImage(newContext); 
UIImage *uiImage = [UIImage imageWithCGImage:cgImage scale:1.0f orientation:UIImageOrientationRight];
CGContextRelease(newContext); 
CGColorSpaceRelease(colorSpace); 
CGImageRelease(cgImage);
```
アソシエーションの整理


1. 対象を持っているなら has 
1. 対象を一つ持っているなら has_one
1. 対象を複数持っているなら has_many
1. 自分が対象に所属している(所有されている)なら belongs_to 

----

> belongs_to アソシエーションは他のモデルとの１対１の繋がりを作ります。データベースにおいて、このクラスが外部キーを格納していることを、このアソシエーションが示しています。[RailsGuids](http://wiki.usagee.co.jp/ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Active Record Associations#p77e778f)

----

+ Member has one Profile
メンバーは一つのプロフィールを持っている
```member.id = profile.member_id```

+ Profile belongs to Member
プロフィールはメンバーに所有されている
```profile.member_id = member.id```

+ Company has many Members
会社は沢山のメンバーを雇っている
```company.id = member.company_id```

+ Member belongs to Company
メンバーは会社に所属している
```member.company_id = company.id```

+ Member has many logs
メンバーは沢山の履歴を持っている
```member.id = log.member_id```

+ Log belongs to Member
履歴はメンバーに所有されている
```log.member_id = menber.id```

+ Member belongs to status
メンバーはある状態に属している
```member.status_id = status.id```

+ Status has many Members
ある状態のメンバーは複数いる
```status.id = member.status_id```
はじめてのiOS iOS開発ガイドはどっちがどっち？

[iOS開発ガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/Xcode/Conceptual/ios_development_workflow)を読んでのメモ。

* ざっくり把握するのに良い
* Provisioningのお話がこちらにも載っている
* デジタルアセットの関係ってのが分かりやすい

と、読み終えたら、もうひとつ同じ名前の資料の[iOS開発ガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/iOS_Development_Guide.pdf)を見つけました。

* よりXcodeの使い方にフォーカスしている
* いわゆる初心者向けiOS開発本の内容とかぶる感じする
* ざっと読んでみた感じ前者の古いバージョン？
* テストしやすいコードを記述するために考慮すべきガイドラインが載ってて良い。

というわけで、どちらもiOS開発のガイド的にざっくり読んでみるのに良い。最後まで読んで気づきましたが、改訂履歴を見る感じ前者のほうが新しいようですね。
carrierwaveでアップロードした画像をメールで送信する

identifierにファイル名が、current_pathにファイルのパスが入っている

```ruby
class UserMailer <ActionMailer::Base
  def thanks(user)
    attachments[user.image.identifier] = File.read(Rails.root.join(user.image.current_path))
    mail(to: "xxx@example.com")
  end 
end
```
Dropbox を使って Kobito を複数デバイスで使う


~/Library/Kobito/Kobito.db を Dropbox に移動してシンボリックリンク貼る。

```bash
mv ~/Library/Kobito/Kobito.db ~/Dropbox/Document
ln -s ~/Dropbox/Document/Kobito.db ~/Library/Kobito
```

すでに複数デバイスで使っていた場合、データのマージが必要。

Kobito.db は SQLite データベースなので、なんらかの方法でこの db にアクセスして ZITEM テーブルの該当行を手作業で移行する。
Qiita で共有していない場合は Markdown をコピペするほうが楽。
MyBatisでのMySQLストアドの呼び出し

MyBatisからMySQLのストアドを呼ぶ場合の書式

```mybatis_stored_sample.xml
<select id="ID名" parameterType="パラメータの型" resultType(or resultMap)="戻りの受けの型" statementType="CALLABLE">
{call ストアド名(#{パラメータ型の名称, mode=IN, jdbcType=JDBCの対応する型},#{出力パラメータの型, mode=OUT, jdbcType=対応するJDBCの型})}
</select>
```

って感じで呼び出せる。
但し、ストアドからの戻りリターンが複数個所記述があると、resultがおかしくなるので1か所にする事。
Emacs memo


### Grep setting

```list:.emacs
;; grep結果バッファでのカーソル移動でダイナミックにファイルを開いてくれる
(require 'color-grep)
(setq color-grep-sync-kill-buffer t)
;; M-x grep-findでPerlのackコマンドを使うよう変更
(setq grep-find-command "ack --nocolor --nogroup ")
```

### Reference page
http://www23.atwiki.jp/selflearn/pages/41.html#id_15e2b62b
rubyでslimになってみる


## セットアップ
gem install sinatra slim


## 適当な場所に以下のファイル作成する

```ruby:test_slim.rb
require 'sinatra'
require 'slim'

get '/' do
  slim :index
end
```

```slim:views/index.slim
doctype html
html
  head
    title Slim Example
  
  body
    h1 スリムスリム〜
```

## 実行
ruby test_slim.rb

ブラウザでhttp://localhost:4567/にアクセスする。
スリムスリムー。
Mac でコマンドラインからアプリケーション起動


open -a [アプリケーション名] でよい。
アプリケーション名は /Application 下の .app の拡張子を除いたもの。

```bash
# Kobito 起動
open -a Kobito

# .profile を TextEdit で開く
open -a TextEdit ~/.profile

# サブディレクトリにあるものもアプリケーション名だけで OK。
open -a Microsoft\ Excel
```

よく使うものは alias を作っておくと楽。

```bash
# ~/.profile
alias kobito="open -a Kobito"
```

.app をフルパスで渡してもよい (/Application 下にない場合など)。

```bash
# 下記のどちらでも OK
open /Applications/Kobito.app
open -a /Applications/Kobito.app
```
はじめてのiOS Provisioning Portalが意味不明編

# Provisioning Portal

[Provisioning Portal](https://developer.apple.com/ios/manage/overview/index.action) がよくわからない。How To見れば何すれば良いのか分かるんですけど、一体何をしているのかが理解しづらかったのです。そのへんは、[iOSデベロッパプログラム iOS4スタンダードプログラム ユーザガイド](http://adcdownload.apple.com//ios/ios_developer_program_user_guide/ios_developer_program_user_guide__standard_program_v2_jp.pdf)を読むことで理解できました。

スタンダードプログラム ユーザガイド読むと良いよ、というのは[@_arittake](http://twitter.com/#!/_arittake)さんが教えてくれました。ありがとうございます。


## アプリケーション間でキーチェーンデータを共有する

先のガイドに「アプリケーション間でキーチェーンデータを共有する」方法が書いてあったのですが、何が嬉しいのかな？と思っていたら、

* [[iOS] Keychain Services とは](http://cocoadays.blogspot.jp/2011/02/ios-keychain-services.html)」
* [[iOS] 複数アプリケーション間でのデータ共有 〜 Keychain Services を使った第三の方法](http://cocoadays.blogspot.jp/2011/02/ios-keychain-services_07.html)

あたりに事例と方法が書いてあったので、この辺が用途なんですかね。キーチェーンデータの共有以外にデータ共有方法ってあるですかね、キーチェーンデータの共有だとなんかとてもセキュアなデータの共有に使うのかな？というイメージがあるんですよね。

## ところで、証明書っていつ必要？

のでつぶやいたら、[@ryonext](http://twitter.com/#!/ryonext)さんから教えてもらえました。感謝。

[@ppworks 「iOS開発用証明書ってのは、もしかして実機にインストールするときにしか使わない？」](https://twitter.com/ppworks/status/189256043841331200)

開発時に実機にインストールする段階で必要なんですね。
個数の異なる二つのリストをカンマ区切りで縦に結合する

個数の異なる二つのリストデータをカンマで区切って縦に並べたいことがあると思います。
そんなときは、以下のようにLINQを使うとうまくまとまります。

```

var list1 = new string[] { "a", "b", "c", "d", "e" };
var list2 = new string[] { "A", "B", "C" };

//list1.Length >= list2.Lengthとする
var query = from x in list1.Select((item, index) => new { item, index })
            join y in list2.Select((item, index) => new { item, index }) on x.index equals y.index into z
            from a in z.DefaultIfEmpty(new { item = "", index = -1 })
            select x.item + "," + ((a.index != -1) ? a.item : "---");

foreach(var line in query) {
    Console.WriteLine(line);
}
```

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

```
a,A
b,B
c,C
d,---
e,---
```
Kobitoの改善要望

この要望内容は気づいた時にどんどん書き足すことにする。

* 右下の「変更を反映」ボタンが有効になる場合は、左レイアウトのリスト項目の色が変わるといい
> 時々反映されていることに気が付かないっす。

* Kobito Updateしたら過去の投稿記事の幾つかが消えた。。。
webの内容とは同期しない？

* 左のEditorと右のViewが同期してスクロールしていただけると助かります

> 長文になると、どこの編集がどのように変更されたか追うことが難しい

* 他サービスへの投稿

> EvernoteとかBlogとかに投稿したいっす
Rails memo


## To create new app with mysql

First type following command

```
rails new example -d mysql
rake db:migrate
```

At this time, I got following error

`uninitialized constant Rake::DSL`

Some web pages say that this is because version of rake is not proper.
I tried following thing.

* Add following line in to Gemfile

`gem "rake", "0.8.7"`


* Then type following command

```
bundle update rake
```
However, it still doen't work.

I found web page.
[http://www.wizardinthemarket.com/program/210/](http://www.wizardinthemarket.com/program/210/)

I change rake version to 9.2.2.

Now it works fine.

### mysql issue
Some web pages say that if I wanna use mysql
I need to use

```
gem 'ruby-mysql'
```

instead of 

```
gem 'mysql2'
```

in Gemfile. However, rails 3.2.3 doesn't accept ruby-mysql.
If you use that, following issue will be happened.

When I type 

```
rake db:migrate
```
Error comes and terminal says that I need to type following command.

```
gem install activerecord-mysql2-adapter
```

However,  the gem doesn't exist.
Just use mysql2.

## General operation
### Creating controller
```
rails generate controller CONTROLLER_NAME
```
This command will generate

`/app/controllers/CONTROLLER_NAME_controller.rb` 

####
After creating the action, do not forget to configure
route setting.


## Reference page

[http://www.rubylife.jp/rails/ini/index4.html](http://www.rubylife.jp/rails/ini/index4.html)
PHPでPCとスマートフォン（iPhone / Android）を振り分ける

```php
<?php
$ua=$_SERVER['HTTP_USER_AGENT'];
if((strpos($ua,'iPhone')!==false)||(strpos($ua,'iPod')!==false)||(strpos($ua,'Android')!==false)) {
	header("Location:/sp/index.php");
	exit();
}
?>
```
swfObject(1.5)でflashplayerの判定

```javascript
var so = new SWFObject('hoge.swf', 'top', '320', '240', '8', '#000000');
if(so.installedVer.major >= 8){
/*-------------------------------------------------
*   FlashPlayer8以上がインストールされている場合
*/
 
}else{
/*-------------------------------------------------
*   FlashPlayer8以上がインストールされていない場合、
*/
 
}
```
UIColorからR,G,B,A各要素の取り出し

UIColorからRGBAの各要素を取り出すには、以下のようにする。
getRed:green:blue:alpha:, getWhite:alpha:の両メソッドがUIColorに追加されたのがiOS 5.0からなので、古いiOSをサポートする場合には要注意。
また、RGBAの各コンポーネントが、カラーの場合と単色の場合とで使用メソッド/関数が異なる為、エラーチェックを実施している。

####iOS 5.x以降の場合

```objectivec:getcolor.m
UIColor *color = [UIColor redColor];
CGFloat r, g, b, a;
if (![color getRed:&r green:&g blue:&b alpha:&a]) {
	[color getWhite:&r alpha:&a];
	g = b = r;
}
```

####iOS 4.x以前の場合

```objectivec:getcolor.m
UIColor *color = [UIColor redColor];
CGFloat r, g, b, a;
const CGFloat *components = CGColorGetComponents(color.CGColor);
if (CGColorGetNumberOfComponents(color.CGColor) == 4)　{
	r = components[0];
	g = components[1];
	b = components[2];
	a = components[3];
} else {
	r = components[0];
	g = components[0];
	b = components[0];
	a = components[1];
}
```
超適当 Rails3 TDD BDD CI 環境づくり

# 以下のものを入れます

- ruby, rails, cucumber, rspec, spork, factorygirl, simplecov

Guard を忘れた・・・

# ruby インストール

- Rails を使うときは ruby 1.9.2 を使う

command:

    $ sudo apt-get install git-core build-essential zlib1g-dev sqlite3 libsqlite3-dev libtool libssl-dev nodejs
    $ rvm install 1.9.2

- Gemsetを作成

    $ rvm --create 1.9.2@myproj
    $ rvm use 1.9.2@myproj

# Rails

    $ cat > $HOME/.gemrc <<EOF
    gem: --no-ri --no-rdoc
    EOF
    $ gem install rails
    $ rails new BrilliantApp

## Gemfile

    group :test, :development do
      gem 'rspec-rails'
    end
    
    group :test do
      gem 'simplecov-rcov', :require => false
      gem 'ci_reporter'
      gem 'autotest'
      gem 'autotest-rails'
      gem 'test_notifier'
      gem 'spork'
      gem "factory_girl_rails", "~> 1.2", :require => false
  
      # cucumber
      gem 'capybara'
      gem 'database_cleaner'
      gem 'cucumber-rails'
      gem 'cucumber'
      gem 'launchy' # So you can do Then show me the page
      gem 'ramaze'
      gem 'webrat'
    end

インストール実行

    $ bundle

## setup

    $ rails g rspec:install
    $ rails g cucumber:install ja --rspec --capybara --spork
    $ spork --bootstrap

spec/spec_helper.rb:

の先頭

    # This file is copied to spec/ when you run 'rails generate rspec:install'
    ENV["RAILS_ENV"] ||= 'test'
    require File.expand_path("../../config/environment", __FILE__)
    require 'rspec/rails'
    require 'rspec/autorun'
    require "test_notifier/runner/rspec"
    require 'spork'
    require 'simplecov'
    require 'simplecov-rcov'
    SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter

真ん中あたり

    Spork.each_run do
      # This code will be run each time you run your specs.
    
      # reload always for model change
      silence_warnings do
        load Rails.root.join('config/routes.rb')
        Dir[Rails.root.join('app/**/*.rb')].each do |file|
          load file
        end
        require 'factory_girl_rails'
      end
    
    end


config/environments/test.rb:

    config.cache_classes = true

.rspec:

    --colour --drb

features/support/env.rb の最後のほう:

      # Possible values are :truncation and :transaction
      # The :transaction strategy is faster, but might give you threading problems.
      # See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
      Cucumber::Rails::Database.javascript_strategy = :truncation
    
      silence_warnings do
        Dir[Rails.root.join('app/**/*.rb')].each do |file|
          load file
        end
        require 'factory_girl_rails'
        require 'factory_girl/step_definitions'
      end
    
    end

cucumber.yml (ROOTではなく、configの下に書いたほうが良いかも？）:

    autotest: --drb --color --format progress --strict
    autotest-all: --drb --color --format progress --strict

# autotest 実行方法

    $ spork &
    $ spork c &
    $ autotest

> 環境によっては bundle exec 必要
python の autotest というか sniffer

# インストール

linux: pip install sniffer autonose pyinotify
windows: pip install sniffer autonose pywin32
Mac: pip install sniffer autonose MacFSEvents

# オプション
sniffer のデフォルトは、nose を使うので nosetests のオプションを -x に続けて使う。doctest なら sniffer -x--with-doctest

# 注意
- テストディレクトリを指定するときは sniffer -x t とかする
- pybrew venv を使う場合は、sniffer もライブラリもぜんぶ同じ virtualenv に入れること

# Special Thanks
http://pypi.python.org/pypi/sniffer
PHP+MySQLで文字化ける問題を解消する

EC2のCentOSでphp+mysqlで環境をつくったときに文字化けが起きた。下記のコピペで解消できた。
http://kennyqi.com/archives/61.html


以下引用
***

```my.conf
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
```

```sh
%/etc/rc.d/init.d/mysqld restart
%mysql>set names utf8;
%mysql> show variables like 'cha%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

\#余談だけど、php書くとなぜかすごくいい加減な気持ちになるから、書くのが速くなる。
gvim の設定

``` .gvimrc
if has('gui_macvim')

  set showtabline=2    " タブを常に表示
  set transparency=5   " 透明度
  set imdisable        " IME OFF
  set guioptions-=T    " ツールバー非表示
  set antialias        " アンチエイリアス
  set tabstop=4        " タブサイズ
  set number           " 行番号表示
  set nobackup         " バックアップなし
  set visualbell t_vb= " ビープ音なし

  colorscheme desert   " カラースキーマ
  set columns=100      " 横幅
  set lines=35         " 行数

  set nowrapscan       " 検索をファイルの先頭へループしない
  
  " 検索ハイライトをEsc２回押しで消去
  set hlsearch
  nmap <Esc><Esc> :nohlsearch<CR><Esc>

  "---------------------------------------------------------------------------
  " フォントに関する設定
  set guifontwide=Osaka:h12
  set guifont=Ricty:h12

  "---------------------------------------------------------------------------
  " カーソル設定
  set cursorline
  highlight CursorLine ctermbg=LightGrey
  highlight CursorLine ctermfg=Blue

  "---------------------------------------------------------------------------
  " マウスに関する設定:

  " ビジュアル選択(D&D他)を自動的にクリップボードへ (:help guioptions_a)
  set guioptions+=a

endif
```
Titaniumでdate.jsを使う

標準のDateライブラリが使いにくいので便利なdate.jsをTitaniumで使う。
date.jsをダウンロードしてResourcesディレクトリ以下に配置して以下のとおり。

```javascript:app.js
require('date');
```

```javascript
Date.today(); //=> 2012-04-07 15:00:00 +0000
Date.tomorrow(); //=> 2012-04-08 15:00:00 +0000
```
スワイプでカーソルを移動する。


最後の-[UITextView setSelectedTextRange:]がPrivateAPIかも知れない。

```objectivec
// add gestures
UISwipeGestureRecognizer *rightSwipeShiftCaret = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(rightSwipeShiftCaret:)];
rightSwipeShiftCaret.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:rightSwipeShiftCaret];
[rightSwipeShiftCaret release];

UISwipeGestureRecognizer *leftSwipeShiftCaret = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(leftSwipeShiftCaret:)];
leftSwipeShiftCaret.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:leftSwipeShiftCaret];
[leftSwipeShiftCaret release];

…

- (void)rightSwipeShiftCaret:(UISwipeGestureRecognizer *)sender
{
    [self swipeShiftCaretToLeft:NO];
}

- (void)leftSwipeShiftCaret:(UISwipeGestureRecognizer *)sender
{
    [self swipeShiftCaretToLeft:YES];
}

- (void)swipeShiftCaretToLeft:(BOOL)isLeftSwipe
{
    // UITextView is applied UITextInput protocol since iOS5.
    if ([self.view respondsToSelector:@selector(positionFromPosition:inDirection:offset:)]) {
        UITextPosition *position = isLeftSwipe ? [self.view positionFromPosition:self.view.selectedTextRange.start inDirection:UITextLayoutDirectionLeft offset:1] : [self.view positionFromPosition:self.view.selectedTextRange.end inDirection:UITextLayoutDirectionRight offset:1];
        // failsafe.
        if (!position)
            return;
        UITextRange *range = [self.view textRangeFromPosition:position toPosition:position];
        // Private API?
        [self.view setSelectedTextRange:range];
    }
}
```
vimrcの最大公約数的な部分

```vimrc
set encoding=utf-8
set t_co=256
"インデント
filetype plugin indent on
"文字の設定
set guifont=Osaka-Mono:h14
"ルーラーの設定
set number
"IMを無効化
set imdisable           
au GUIEnter * winpos 0 0
"set lines=162 columns=205
"クリップボード連携
set clipboard=unnamed
"検索時に大文字を含んでいたら大/小を区別
set smartcase
"新しい行を作ったときに高度な自動インデントを行う
set smartindent
"行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする。
set smarttab
"インクリメンタルサーチを行う
set incsearch
"バックアップなし
set nobackup
"スワップファイルなし
set noswapfile

"全角スペースを視覚化
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=#666666
au BufNewFile,BufRead * match ZenkakuSpace /　/


noremap gh ^
noremap gl $
noremap gv :tabnew ~/.vimrc<CR>
nnoremap gd :!python closure-library/closure/bin/build/depswriter.py --root_with_prefix="apps ../../../apps" --output_file=javascript/deps.js<CR>
nnoremap gw <C-w><C-w><CR>
nnoremap gr :source ~/.vimrc<CR>
nnoremap <C-r> :%s/
nnoremap <C-p> :!python ~/test.py<CR>
inoremap { {}<LEFT>
inoremap [ []<LEFT>
inoremap ( ()<LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>
inoremap <tab> <Space><Space>
if &t_Co > 1
syntax enable
endif
set cursorline
set autoindent
set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
setlocal ts=2
setlocal softtabstop=2
setlocal shiftwidth=2
setlocal smarttab
setlocal smartindent
setlocal expandtab
" Use ClipBoard
set guicursor=n-v-c:blinkwait1-blinkoff1-blinkon1
set nowrap
""silent!source ~/vimbook.vim
set vb t_vb=
command! -nargs=1 Grep vimgrep <args> **/*.php|ccl
nnoremap <C-h> :Grep
nnoremap <C-p> :cprevious<CR>   " 前へ
nnoremap <C-n> :cnext<CR>       " 次へ
nnoremap <C-g> :<C-u>cfirst<CR> " 最初へ
# 文字列の文字コードを返す関数

引数 msg の文字コードを探し当てる関数


```python

def get_jp_encoding_name (msg,char_code = 'iso-2022-jp'):
	import types
	
	enc_name = char_code or 'iso-2022-jp'
	check_type = ['utf_8',
				   enc_name,		'iso2022_jp_1', 'iso2022_jp_2',
				   'iso2022_jp_2004','iso2022_jp_3', 'iso2022_jp_ext',
				   'shift-jis',	  'cp932',		'shift_jis_2004',
				   'shift_jisx0213', 'euc_jp',	   'euc_jis_2004',
				   'euc_jisx0213']
	for enc in check_type:
		try:
			if isinstance(msg, types.StringType):
				s = msg.decode(enc)
			else:
				s = unicode(msg,enc)
		except :
			continue
		return enc
	return None
```


いつぞやの Python-ML に流れていたコード。
gitoliteインストール


# 環境
* CentOS5
* git 1.7.3.4

# 参考
http://please-sleep.cou929.nu/intorducing-gitolite.html
http://d.zeromemory.info/2012/03/20/git-gitolite.html

# 作業手順

## gitoliteユーザ作成

```bash:gitoliteユーザ作成
sudo /usr/sbin/useradd -m -s /bin/sh gitolite
sudo passwd gitolite
sudo mkdir -m 700 /home/gitolite/.ssh
sudo chown -R gitolite:gitelite /home/gitolite
```

## sshd_configのAllowUserを追加してreload
```bash:gitoliteユーザ作成
sudo service sshd reload
```

## gitoliteインストール
```bash:
git clone git://github.com/sitaramc/gitolite
cd gitolite
sudo src/gl-system-install
cp .ssh/authorized_keys /tmp/hazy.pub
gl-setup -q /tmp/hazy.pub
```

gl-system-install時にこんなのでたけど気にしない

> using default values for EUID=0:
> /usr/local/bin, /var/gitolite/conf, /var/> gitolite/hooks
>                ***** WARNING *****
>    gl-setup is not in your $PATH.
>
>    Since gl-setup MUST be run from the PATH (and not as src/gl-setup or
>    such), you must fix this before running gl-setup.  Just add
>
>        PATH=/usr/local/bin:$PATH
>
>    to the end of your bashrc or similar file.  You can even simply do that
>    manually each time you log in and want to run a gitolite command.

## gitolite管理用レポジトリをclone
```bash:
git clone ssh://gitolite@nebula/gitolite-admin.git
```
あとはkeydirに認証鍵を足したり、設定ファイルをいじってレポジトリ追加したりすればオーケーらしい。
タスク管理スクリプトライブラリ

```taskf/cmd.scm
(define-module taskf.cmd
			   (use srfi-1)
			   (use srfi-19)
			   (use gauche.process)
			   (use file.util)
			   (export clear ToDo w r del))
(select-module taskf.cmd)
(define clear
  (let1 c (process-output->string '("clear"))
		(lambda ()
		  (display c))))
(define (ToDo)
  (display "?> ")(flush)
  (let1 cmd (read)
		(cond ((eq? cmd ':q)(exit))
			  ((eq? cmd ':w)(w))
			  ((eq? cmd ':r)(r))
			  ((eq? cmd ':del)(del))
			  (else (begin(print "***ERROR***\ncommand not found: " cmd)(ToDo))))))
(define (w)
  (let1 words (with-input-from-file 
				(string-append (home-directory) "/SchemeTask/.todo") 
				(pa$ read))
		(if (eof-object? words)
		  (writ (create) '())
		  (writ (create) (cons words '())))))
(define (create)
  (display "新しいタスク> ")(flush)
  (let1 solve (read)
		(if (eq? solve ':q)
		  (r)
		  (begin
			(display "期限日> ")(flush)
			(let1 ttime (read)
				  (if (eq? ttime ':q)
					(r)
					(cons solve (cons ttime '()))))))))
(define (writ result words)
  (with-output-to-file 
	(string-append (home-directory) "/SchemeTask/.todo")
	(pa$ print
		 (if (null? words)
		   (x->string (cons result words))
		   (x->string (cons result (car words))))))
  (w))
(define (timer result)
  (let*	((date1 
		   (make-date 0 0 0 0 (date-day(current-date))(date-month(current-date))(date-year(current-date))(date-zone-offset (current-date))))
		 (date2 (make-date 0 0 0 0 
						   (third result) 
						   (second result) 
						   (first result) 
						   (date-zone-offset (current-date)))))
		(cond ((> (date->modified-julian-day date1) (date->modified-julian-day date2))'期限過ぎてます。)
			  ((eqv? (date->modified-julian-day date1) (date->modified-julian-day date2))'期限日です。)
			  (else (string->symbol
					  (string-append "残り" 
									 (x->string 
									   (- (date->modified-julian-day date2) 
										  (date->modified-julian-day date1)))"日です。"))))))
(define (r)
  (let1 words (with-input-from-file (string-append (home-directory) "/SchemeTask/.todo") (pa$ read))
		(cond ((eof-object? words)
			   (begin
				 (print "Nothing!!!!!!")
				 (ToDo)))
			  ((null? words)
			   (begin 
				 (print "Nothing!!!!!!")
				 (ToDo)))
			  (else (begin(for-each(lambda(word n)
									 (format #t "[~s]~s: ~s\n-> ~s\n" n (second word) (first word) 
											 (timer (map (lambda(n)(x->number n)) (string-split (x->string (second word)) #\/)))))
							(reverse words)(iota (length words) 1))(ToDo))))))
(define (del)
  (let1 n (read)
		(let1 words (with-input-from-file 
					  (string-append (home-directory) "/SchemeTask/.todo") (pa$ read))
			  (with-output-to-file (string-append (home-directory) "/SchemeToDo/.todo")
								   (pa$ print
										(cond
										  ((number? n)(x->string (delete (ref (reverse words) (- n 1)) words)))
										  ((eq? n '-a)
										   (begin 
											 (display "本当にいいですか?(y/n)")
											 (flush)
											 (let1 ans (read)
												   (if (eq? ans 'y)
													 (x->string (filter symbol? words)))
												   '())))
										  (else (string-append "***ERROR command not found: "n)))))
			  (ToDo))))
(provide "taskf/cmd")
```
scriptタグの順番


JavaScriptでオブジェクトとして定義したモジュールを使いたい場合。scriptタグでインポートする順番が大事。


```main.html
<!DOCTYPE html>
<head>
  <script src="main.js"></script>
  <script src="module.js></script>
</head>

</html>```

main.jsの中でmodule.jsの関数やらを使いたい場合はmodule.jsを先にインポートしないといけない。

```main.html
<!DOCTYPE html>
<head>
  <script src="module.js"></script>
  <script src="main.js></script>
</head>

</html>```
 
JavaScriptは単にその場に展開するだけなので当然と言えば当然か。
でも複雑なモジュール構成になってくるとどうすればいいんだろう？
Chrome localStorageへのアクセス


ChromeのlocalStorageを使う場合、そこにあるデータにアクセスするには二通りの方法がある。localStorageはwindowグローバルオブジェクトのプロパティ。

オブジェクトプロパティへのアクセスのような形

```object_property.js
localStorage["one"] = 1;
var one = localStorage["one"];
```


アクセスメソッドを使う形

```access_method.js
localStorage.setItem("one",1);
var one = localStorage.getItem("one");
```
一つのファイルでWebWorkersを使う



```all-in-one.js
(function(global) {
    "use strict";
    
    // window と worker 共通のコードはここに書く
    

    if (typeof(window) !== "undefined") {
        (function(window) {
            
            // window用のコードはここに書く
            var worker = new Worker("このファイルのURL");
            worker.addEventListener("message", function(e) {
                console.log(e.data.msg);
            }, false);
            worker.postMessage({msg:"hello"});

        }(global));
    } else {
        (function(worker) {
            
            // worker用のコードはここに書く
            worker.addEventListener("message", function(e) {
                worker.postMessage({msg: e.data.msg + ", worker!"});
            }, false);
            
        }(global));
    }
}(this));
```
pecl-HTTPによる複数リクエストを並列実行するサンプル

以前に[cURLの例](http://qiita.com/items/1c67b51040246efb4254)を書きましたが、もっと簡単なのはpecl-HTTPのHttpRequestPoolを使うことです。こっちの方が圧倒的に読みやすいのでおすすめ。

http://jp2.php.net/manual/ja/httprequestpool.construct.php
をベースにしていますが、cURLの例と同等になるように少しオプションを追加しています。

```php
<?php
/**
 * pecl-HTTPで並列リクエストを行うサンプル
 *
 */
$urls = array(
    'http://localhost/sleep.php?wait=1',
    'http://localhost/sleep.php?wait=2',
    'http://localhost/sleep.php?wait=3',
);
try {
    $pool = new HttpRequestPool;
    foreach ($urls as $u) {
        $req = new HttpRequest($u);
        $req->setOptions(array(
            'timeout' => 10,
            'connecttimeout' => 10
        ));
        $pool->attach($req);
    }
    $pool->send(); //全リクエストが返ってくるまでブロックする

    //レスポンスを解析。
    foreach($pool as $req) {
        echo $req->getUrl(), ':', $req->getResponseCode(), PHP_EOL;
        echo $req->getResponseBody(), PHP_EOL;
    }
} catch (HttpException $e) {
    echo $e;
}
```

結果が返ってくるまでにそれぞれ1秒、2秒、3秒かかるAPIに同時リクエストしています。約3秒で処理が終わります。
Iteratorを実装していてforeachで全リクエストを操作できるなど、使いやすいインターフェースです。記述も短く、PHP5らしさの溢れる書き方ができます。

問題は共用レンタルサーバーでpecl-HTTPはあまり普及していない?ことでしょうか。
CentOSにviの7.3を入れる方法

コピペ
http://d.hatena.ne.jp/janus_wel/20110104/1294107609

余談だけど、EC2にMySQL+Vim73+vimrcを整備したAMIを作成しておくと捗る気がした。なんとなくCentOS使ってるけど、次はDebian使ってみようかな。dpkgに悪いイメージない。

```sh
yum install ncurses-devel
yum install lua lua-devel
mkdir -p work/install/vim
cd work/install/vim
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
tar xjvf vim-7.3.tar.bz2
mkdir patches
cd patches
curl -O "ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.[001-094]"
cd ../vim73
for i in `ls ../patches/7.3.*`; do patch -p0 < $i; done
cd src
./configure --disable-selinux --enable-luainterp --enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-tclinterp --enable-rubyinterp --enable-multibyte --disable-gui --with-features=huge
make ARCH=x86_64
cd ~
wget "http://asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.2.tar.gz"
tar zxvf checkinstall-1.6.2.tar.gz
cd checkinstall-1.6.2
make
make install
cd ~/work/install/vim/vim73/src
checkinstall
cp /usr/src/redhat/RPMS/x86_64/Vim-7.3-1.x86_64.rpm ../../
rpm -ivh Vim-7.3-1.x86_64.rpm
Twitter Bootstrapを利用する際のテンプレート

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta name="description" content="説明分">
    <meta name="keywords" content="キーワード1, キーワード2">
    <title>ページタイトル</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
</head>
<body>
    <div class="container">
    <div id="header">
    header
    </div>
    <div class="row">
        <div class="span4" id="sidebar">サイドバー</div>
        <div class="span8" id="main">メイン</div>
    </div>
    <div id="footer">
    footer
    </div>
    </div>
</body>
</html>
subviewを全て取り除く

```Objective-C
for (NSInteger i=[self.view.subviews count]-1; i>=0; i--) {
    [[self.view.subviews objectAtIndex:i] removeFromSuperview];
}
```
先頭から行うと、取り除くごとにsubviewsの要素が前に詰められて
奇数番目のsubviewしか取り除けないので後ろから取り除く。
インクルードガード用の neocomplcache スニペット

neocomplcache のスニペットには，Vim script の式を使って動的に展開する機能があります．

``` c.snip

snippet include_guard
alias   inc_guard
prev_word '^'
abbr    #if !defined HOGE #define HOGE #endif
    #if !defined `toupper( substitute( expand("%"), "\\.", "_", "g" ) )."_INCLUDED__"`
    #define `toupper( substitute( expand("%"), "\\.", "_", "g" ) )."_INCLUDED__"`
    ${0}
    #endif // `toupper( substitute( expand("%"), "\\.", "_", "g" ) )."_INCLUDED__"`

```

このファイルを ｇ:neocomplcache_snippets_dir で指定したディレクトリ下に置くと，inc_guard または include_guard というスニペットが追加されます．

例えば hoge.hpp というファイルの編集中にこれを展開すると

``` cpp:hoge.hpp

#if !defined HOGE_HPP_INCLUDED__
#define HOGE_HPP_INCLUDED__

#endif // HOGE_HPP_INCLUDED__

```

と展開されます．
Pow で特定の URL だけ 404 になる理由


Nginx + Unicorn では問題ないのに、Pow を使っている開発環境だけ特定の URL で 404 Not Found を返すことがあり困っていました。

### 原因

Pow は public という名前のディレクトリを静的なパスだと解釈するようで、そこにファイルが存在する場合そちらを優先して表示するようです。

### 現象

例えば、 `/admin/comments` という URL があるとします。もしアプリケーションの `/public` ディレクトリに `admin/comments/` という名前のディレクトリが存在したら、アプリケーションがリクエストを処理するよりも先に Pow がこの URL は静的ファイルへのアクセスだと解釈し、 `/public/admin/comments/index.html` というパスのファイルを表示しようとするものの、このディレクトリには `index.html` という名前のファイルが存在しないため 404 Not Found を返します。

Sinatra ベースの CMS Lokka を使用していてこのような現象に遭遇しました。

### 対策

対策としては、テンプレートのパスと URL がダブらないようなディレクトリ構成にするしかないと思います。

### 参考リンク

- [Does Jekyll work with Pow? - Stack Overflow](http://stackoverflow.com/questions/6696711/does-jekyll-work-with-pow "Does Jekyll work with Pow? - Stack Overflow")
Kobito 使ってみました

起動と挙動がいちいち軽いのが良いですね。
markdown のリアルタイムプレビューがあるのも嬉しい。
evernote はメモをストックするのには良くても、
必要なときに立ち上げてメモを書くには重くてストレスでした。
Kobito で書いたメモが、evernote にストックされていってくれると嬉しいです。そういう連携ってきっと準備中ですよね。
期待しています。
Javascript で複数のコールバックをまとめて受け取る

以下のように「複数のコールバック呼び出しが完了した時点で処理をすすめる」パターンを簡素に書くことができます。
各コールバックに渡された引数もまとめて最後の then 関数に渡され、しかもその順番は cb.here を呼び出した順番と対応することが保証されます。（コールバックが呼び出された順ではありません）
これで複数リソースの読み込みも怖くない！

```javascript:example.js
var cb = new Callback();
request(..., cb.here());
request(..., cb.here());
request(..., cb.here());
cb.then = function(result1, result2, result3) {

}
```

```javascript:callback.js
var Callback = (function () {

  /**
   * 複数のコールバックをまとめて一つのコールバックにします。
   * @constructor
   * @example
   * var cb = new Callback();
   * asyncFunc1(..., cb.here()); // f('guitar') とコールバックされる
   * asyncFunc2(..., cb.here()); // f('fiddle','banjo') とコールバックされる
   * asyncFunc3(..., cb.here()); // f()  とコールバックされる
   * asyncFunc4(..., cb.here([])); // f('mandolin') とコールバックされる
   * cb.then = function(a, b, c, d) {
   *   // cb.here() を呼んだ数だけ引数が渡る
   *   // a は 'guitar'
   *   // b は ['fiddle', 'banjo']
   *   // c は null
   *   // d は ['mandolin']
   * }
   */
  var Callback = function() {
    this.resultList = [];
    this.stepCount = 0;
    this.callCount = 0;
    /**
     * すべてのコールバックをまとめて最終的に呼び出される関数。
     */
    this.then = null;
  };
  
  /**
   * コールバック関数を生成して返す。
   * 生成した関数が空引数で呼ばれた場合は null を。
   * 1引数で呼ばれた場合はその値を。
   * 2引数以上で呼ばれた場合は配列を登録し、
   * すべてのコールバックが呼び出された時点で
   * 登録した引数を then に渡して呼び出す。
   * here に空配列を渡した場合は引数の数にかかわらず配列を登録する。
   * @return {function(...)}
   */
  Callback.prototype.here = function() {
    var registerArray = arguments.length == 1 &&
        arguments[0] instanceof Array &&
        arguments[0].length == 0;
    if (arguments.length != 0 && !registerArray) throw new Error(
        "Callback#here に引数が渡されました。" +
        "xx.here() と書くべき場所で xx.here としている可能性があります。");
    return (function(callback, stepCount) {
      return function() {
        var result = arguments;
        if (!registerArray && result.length == 0) {
          callback.resultList[stepCount] = null;
        } else if (!registerArray && result.length == 1) {
          callback.resultList[stepCount] = result[0];
        } else {
          callback.resultList[stepCount] = [];
          for (var i = 0; i<result.length; i++) {
            callback.resultList[stepCount][i] = result[i];
          }
        }
        if (++callback.callCount >= callback.stepCount) {
          if (callback.then != null) {
            callback.then.apply(null, callback.resultList);
            Callback.call(this);
          } else throw new Error("then が未登録です");
        }
      }
    })(this, this.stepCount++);
  };

  return Callback;
})();
```
C, C++ のヘッダファイルの依存関係を rake で扱う

rake + gcc で C や C++ のオブジェクトファイルとヘッダファイルの間の依存関係を扱うにはどうしたら良いかなーと試行錯誤して、 一つの解答にたどり着きました。オブジェクトファイルを生成するときに MMD オプションで依存関係を *.d ファイルに吐いておき、 2回目以降のコンパイルでは、それを rake から読み込んで利用します。

```ruby:Rakefile
def get_headers(file)
  if File.exists?(file)
    File.read(file).gsub("\\\n ", "").scan(/^\S+: (.+)$/)
        .flatten.map {|s| s.split(' ') }.flatten
  else
    []
  end
end

# rule の場合は proc を通して
rule '.o' => ['%X.cpp',
              proc {|file| get_headers(file.pathmap('%X.d')) }] do |t|
  sh "#{GXX} #{CFLAGS} -c -o #{t.name} -MMD #{t.prerequisites[0]}"
end

# file の場合は直接
file 'myapp.o' => ['myapp.cpp', *get_headers('myapp.d')] do |t|
  sh "#{GXX} #{CFLAGS} -c -o #{t.name} -MMD #{t.prerequisites[0]}"
end
```
getパラメタをオブジェクトにして返す


```javascript
var paramsParser = function(url){
	var rData = {};
	var point = url.indexOf("?", 0);
	point = point + 1;
	url = url.slice(point);
	var getArr = url.split('&');
	for(var x=0, xlen = getArr.length; x < xlen; x++){
		var paramArr = getArr[x].split('=');
		rData[paramArr[0]] = paramArr[1];
	}
	return rData;
};
```
UITextFieldでキーボードを閉じる

こんな感じで、UIControlEventEditingDidEndOnExitの時に閉じる処理呼び出せばよい。


```objective-c:closeKeyboard.m

// キーボード閉じる
- (void)done:(id)sender
{
    [sender resignFirstResponder];
}
- (void) createTextField
{
    UITextField *textField = [[UITextField alloc] init];
    [textField addTarget:self action:@selector(done:) forControlEvents:UIControlEventEditingDidEndOnExit];
    [self.view addSubView: textField];
}
```
Javascript 安易な文字列の復元


```javascript
var unescapeStr = function(s){
	s = s.replace(/&gt;/g, '>');
	s = s.replace(/&lt;/g, '<');
	s = s.replace(/&#039;/g, '\'');
	s = s.replace(/&quot;/g, '"');
	s = s.replace(/&amp;/g, '&');
	return s;
};
```

escapeされた文字列「<>\"&」を元の文字列に戻す。
取り敢えず自分が必要な分だけ。もっとマシなのがどこかにあるはず。
jquery.ui.datepicker


日付をカレンダーから選択して値を入力する挙動を実装できるjQuery.uiのライブラリ。

最低限の記述

```html
<head>
<link rel="stylesheet" href="./static/css/cupertino/jquery-ui-1.8.16.custom.css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.ui.core.js"></script>
<script type="text/javascript" src="jquery.ui.datepicker.js"></script>
<script type="text/javascript" src="i18n/jquery.ui.datepicker-ja.js"></script>
</head>
<body>

<input type="text" name="hoge" id="datepicker-input" />

</body>
```


```javascript
jQuery(function(){
	$.datepicker.setDefaults( $.datepicker.regional['ja'] );
	jQuery('#datepicker-input').datepicker({
		dateFormat: 'yy/mm/dd'
	});
});
```

その他オプションは下記参照
http://jqueryui.com/demos/datepicker/
#C/C++初心者≠プログラマ初心者用 基礎知識チートシート#2


#クラス

##コンストラクタとデストラクタ

 - 多分他の言語よりも重要になってくるっぽい気がする。変数の初期化が必須だし、GCもないので。

example:

```Cpp:classexam
#include <iostream>

#include <iostream>

class CTest
{
public:
	int health;
	int mana;

	CTest(int hp, int mp); // コンストラクタ
	~CTest(); // デストラクタ
};

CTest::CTest(int hp, int mp)
{
	health = hp;
	mana = mp;
}

CTest::~CTest() // デストラクタは引数も戻り値も持たない
{
	std::cout << "デストラクタがよばれたよ！" << std::endl;
}


int main()
{
	CTest t(100, 20);
	std::cout << t.health << "\n" << t.mana << std::endl;
	return 0;
}
// デストラクタ => healthとmanaが出力 => デストラクタの順で呼ばれる
```

こんな感じ。
　　

##newとdelete

 - C++におけるnewとdeleteは、VBやなんかとは（多分、見かけ上は）違った意味を持つようだ

　先の例に示したように、newを使わなくてもインスタンスの生成は行えるし、deleteしなくてもデストラクタの呼び出しは行われる。
　newとdeleteの働きはCでいうmallocとfreeと似ていて、メモリの動的確保と解放を行えるようだ。ただし、mallocとfreeは関数であり、newとdeleteは演算子であることに注意する。
　次に簡単な例を示す：

```Cpp:プリミティブへのnew/delete
#include <iostream>

int main()
{
	int *p;

	p = new int(); // int型の領域を確保.また、ここでコンストラクタの呼び出しも行われる。
	*p = 42;
	std::cout << *p << std::endl;

	delete p;
	return 0;
}
```

　newでコンストラクタが呼ばれるのと同じように、deleteではデストラクタが呼ばれる。C++にはintのようなプリミティブにもコンストラクタがある。
　配列の初期化についてはまた記法が異なるので、書くときに調べよう。

　上記のように、newとdeleteで指定されるのはポインタだ。

　クラスに対しても、次のように使える：

```Cpp:クラスへのnew/delete
#include <iostream>

int main()
{
	CExample* p;
	
	p = new CExample(100);
	std::cout << p->getNum() << std::endl;
	delete p;
	return 0;
}



```

　　
　　

インスタンス生成の色々もまたちょっと趣が違いそうなので、次でまとめる。
NICのオフロード機能を無効にする


NICのオフロード機能(OS側ではなくNIC側でパケットの分割とかを行う機能)を利用しているとバグのせいかままRSTが発生したりしてパケットの再送(tcpだと強制的に3s待たされる)が起こりネットワークで遅延する場合が増えることがある。やっかいなことにデフォルトではこの機能がonになっていることが多いのでそれをoffにする方法。ethtoolコマンドで行える。

- オフロード機能の状態確認

```sh:
ethtool -k eth0
```

- rx-checksumming 無効

```sh:
ethtool -K eth0 rx off
```

- tx-checksumming 無効

```sh:
ethtool -K eth0 tx off
```

- tcp-segmentation-offload

```sh:
ethtool -K eth0 tso off
```

- generic-receive-offload 無効

```sh:
ethtool -K eth0 gro off
```
JavaのUnicode文字列の変換用メソッド("あ" <-> "\u3042")

コンソールからnative2asciiを実施しても良いのですが、Javaのコードの中で実施しなきゃいけない時に、よく書く短いコードなのでまとめておきます。

```java
/**
 * Unicode文字列に変換する("あ" -> "\u3042")
 * @param original
 * @return
 */
private static String convertToUnicode(String original)
{
	StringBuilder sb = new StringBuilder();
	for (int i = 0; i < original.length(); i++) {
		sb.append(String.format("\\u%04X", Character.codePointAt(original, i)));
	}
	String unicode = sb.toString();
	return unicode;
}

/**
 * Unicode文字列から元の文字列に変換する ("\u3042" -> "あ")
 * @param unicode
 * @return
 */
private static String convertToOiginal(String unicode)
{
	String[] codeStrs = unicode.split("\\\\u");
	int[] codePoints = new int[codeStrs.length - 1]; // 最初が空文字なのでそれを抜かす
	for (int i = 0; i < codePoints.length; i++) {
		codePoints[i] = Integer.parseInt(codeStrs[i + 1], 16);
	}
	String encodedText = new String(codePoints, 0, codePoints.length);
	return encodedText;
}
```
NAT環境下の複数のサーバから外部のサーバに大量にアクセスする時に遅い場合


NAT環境下で外のサーバにアクセスする際リクエスト数が多いとtimestampの不整合によりsyn送った場合にsyn+ackではなくackが帰ってきてRSTしてしまうという症状が発生する。これを回避するには
/etc/sysctl.confに以下を追加すれば良い。

```text:/etc/sysctl.conf
net.ipv4.tcp_timestamps = 0
```
コマンドラインからLintの結果をHTML形式で出力する

```bash:qiita.rb
lint <アプリフォルダパス> -–html <レポートファイル名>.html
```

(adbにパスが通ってない場合は %ANDROID_SDK_HOME%/tools 直下で実行)
HTMLフォーマットでは各項目の詳細情報へのアンカーリンクも貼られているので便利です。

参考：http://yuki312.blogspot.jp/2012/04/androidlint.html
OS X LionでPython開発環境を作成

```Bash:python環境作成
# virtualenvとvirtualenvwrapperをインストール。
sudo easy_install -UZ pip
sudo pip install virtualenv
sudo pip install virtualenvwrapper

cat << EOF >> .oh-my-zsh/custom/zshrc.mine.zsh                                                                     
export WORKON_HOME=\$HOME/.virtualenvs 
source /usr/local/bin/virtualenvwrapper.sh
EOF
source .zshrc

mkvirtualenv  -p /usr/bin/python2.7 python2.7
deactivate
```

```Bash:利用時
workon python2.7
```
SimpleXMLのデータはvar_dumpで見えない! (こともある)


SimpleXMLでATOMをパースしようとして、ちょっと手こずったのでメモ。(PHPでXML扱うのが久しぶり)

* SimpleXMLのデータはvar_dumpなどで、見えないことがある。(←重要)
* foreach じゃないと言うことを聞かないかも。
* 解析したデータを使いたい場合、文字列にキャストすること。

```php
<?php
//フィードを解析して、記事データを取得する関数
function get_articles($url, $max = 5){
	$atom = simplexml_load_file($url);
	$articles = array();
	$n = 0;
	foreach ($atom->entry as $item){
		$attr = $item->link->attributes();
		$articles[] = array(
			'title' => (string)$item->title,
			'url' => (string)$attr['href'],
			'date' => (string)$item->published,
		);
		if ($max <= ++$n) break;
	}
	return $articles;
}

//使用例 : JSONで出力
$feed_url = 'http://somewhere/atom.xml';//フィードのURL
$articles = get_articles($feed_url);//記事データを取得
header('Cache-Control: public,max-age=3600');
echo json_encode($articles);
```

## おまけ
PHPの命名規則から逸脱するプロパティ名は、

```
$xml->{'sample-prop'}
```

のようにすればOK。
Linuxでwrite cacheの確認 & 有効化する方法


write cacheが無効なままだとload averageのグラフがピンピンはねたりする症状がみられる。有効にするにはhdparamコマンドを使えば良い。

```sh:
hdparm -I /dev/sda | grep -i write  # 確認
hdparm -W1 /dev/sda        # 有効化
```
Linuxで2TB以上のHDDを使う場合はディスクのフォーマットにpartedを使う


fdiskでは2TB以上が扱えないので変わりにpartedコマンドを利用する。partedコマンドでMBRではなくGPTを利用すればよい。

ex) 3TBのディスクの場合

```sh:
parted /dev/XXX

(parted) mklabel gpt
(parted) mkpart                                                           
Partition name?  []?                                                      
File system type?  [ext2]? ext4                                           
Start? 1                                                                  
End? 3001GB
```