OmniAICreator/Qiita-1.07M huggingface dataset:
enumの文字列表現を定義する

DataGridViewでenumを行や列のIndex代わりに使うことがあります。
例えば`enum colDataGridView{COL_X,COL_Y,COL_DATA};`などとします。
「enumの各要素に対応する文字列表現を定義できたら表のヘッダに使えるのになぁ」と考えたときに思いついたネタです。

```c#:sample.cs
public enum colDataGridView { COL_X, COL_Y, COL_DATA };

public static class colDataGridViewExtension
{
	public static string GetString(this colDataGridView col)
	{
		string ret = "";

		switch(col) {
			case colDataGridView.COL_X:
				ret = "X座標";
				break;
			case colDataGridView.COL_Y:
				ret = "Y座標";
				break;
			case colDataGridView.COL_DATA:
				ret = "データ";
				break;
		}
		return ret;
	}
}

class Program
{
	static void Main(string[] args)
	{
		colDataGridView item = colDataGridView.COL_X;
		Console.WriteLine(item.GetString());
		//「X座標」と出力されます
	}
}
```
プログラミングの学習に役立つウェブサイト   

[How I Taught Myself to Code in 8 Weeks](http://tech.yipit.com/2012/08/21/how-i-taught-myself-to-code-in-8-weeks/)

8週間でソフトウェア開発のことを何も知らない状態から実際に動くプロトタイプをつくれるようになるまでの方法について。
Python、Djangoを使用。


[iPad and iPhone Application Development](http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255?mt=10)

iTunesUで無料で見ることができるスタンフォード大学のiPhone、iPadアプリケーション開発の授業。Objective-Cの基礎から開発の実践まで学ぶことが出来る。

[jQuery Fundamentals](http://jqfundamentals.com)

jQueryを基礎から学ぶのに使える。備え付けのエディターにコードを書いてすぐに試すことができる。
curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume.

nvmからnode.jsのインストールの途中で何か失敗した後、再チャレンジすると以下のようなエラーが出る場合がある。
curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume.

下記によると
http://sanrinsha.lolipop.jp/blog/2012/03/node-jsnvm.html
「~/.nvm/src以下のファイルを削除」すべしとあるので、当該バージョンのファイルを削除。
capybara/rspecで認証をスタブする


よく見る認証の構造で、（こういうやつ）

```ruby:app/controllers/ApplicationController.rb
# encoding: utf-8

class ApplicationController < ActionController::Base
	before_filter :authenticate
	helper_method :current_user

	def authenticate
		# 認証
	end

	def current_user
		# ユーザーの取得
	end
end

```

セッションからレコードを呼び出すと思いますが、
capybaraでセッションをうまく扱えなかったので（知っている方投稿してほしいです）スタブで回避しました。

```ruby:spec/integration/authenticate_spec.rb
# ~

it "ユーザーが取得できなければリダイレクトされるべき" do
	visit "/foo/bar"
	current_path.should == "/" 
end

describe "ユーザーが取得できるとき" do
	before (:each) do
		@user = User.create({:name => "foo", :email => "bar@example.com" })
		
		# ApplicationControllerを継承する全てのインスタンスの:current_userをスタブ
		ApplicationController.any_instance.stub(:current_user).and_return(@user)
	end

	it "認証をパスしてリクエスト通りのレスポンスを返すべき" do
		visit "/foo/bar"
		current_path.should == "/foo/bar"
	end
end
 
```

[rack_session_access](https://github.com/railsware/rack_session_access)というgemでいけるようなのですが、
READMEどおりにやってうまくいかなかった(GET /rack_session/edit しようとした)のでメモ。
CakePHPでキャッシュファイル生成時のパーミッションを指定する


```php:app/Config/core.php
<?php
  Cache::config('default',array(
    'engine' => 'File',
    'mask' => 0666,
  ));
?>
```

要は、キャッシュエンジンがFileの時はmaskキーに任意のパーミッションを指定できるらしい。
Nokogiriで文字化けを防ぐ

Nokogiriでゴリゴリやってます。やっと使い方分かってきました。
Nokogiriだとデフォルトでも割と文字化けしないなと思ったんですがさすがに色んなサイトを対象にしようとすると化けました。ので何とかします。

他にいい方法があったら是非教えて下さい。
###（注意：下に追記があります。binaryで読み込んでkconvのtoutf8、charsetにutf-8を指定でほぼ起きなくなりました。）

```ruby:Sample
require 'open-uri'
require 'nokogiri'

uri = "http://www…"
page = URI.parse(uri).read
charset = page.charset
if charset == "iso-8859-1"
  charset = page.scan(/charset="?([^\s"]*)/i).first.join
end

document = Nokogiri::HTML(page, uri, charset)
```

という形にしています。

open-uriの`.charset`で大抵上手に設定してくれるんですが、charsetがiso-8859-1になって化けてしまう場合があります。
その場合はページ内のmetaTag記載に期待して`.first`としましたが、もちろんページによっては初めに出てくるcharsetがページ全体のエンコーディングとは別になっている場合もあると思います。

参考にした[2011-02-15 Nokogiriが文字化けするのの対策](http://hitode909.hatenablog.com/entry/20110215/1297739278)では

```ruby:charset
  if charset == "iso-8859-1"
    charset = io.scan(/charset="?([^\s"]*)/i).flatten.inject(Hash.new{0}){|a, b|
      a[b]+=1
      a
    }.to_a.sort_by{|a|
      a[1]
    }.reverse.first[0]
  end
```

として、ページ内で一番使われているエンコーディングを指定していました。が、これだと僕の対象としていたページでは別のエンコーディング指定が多発（JavaScript用の指定）していた為、上手く行かず`.first`を指定することにしました。

他にいい方法をご存知のかたは是非コメントお願いします。

###追記
文字化けの原因はcharsetが未指定だったからではなく、parseしたURIオブジェクトをNokogiriに読み込ませていたからの様です。

```ruby:Sample_before
page = URI.parse(uri).read
...
document = Nokogiri::HTML(page, uri, charset)
```

の部分ですね。以下のように変更したところ今のところ文字化けもエラーも起きていません。

```ruby:Sample_after
# parseされていないhtmlを読みこませる
html = open(url).read
doc = Nokogiri::HTML(html, url)
```

ローカルのirbやpryではURIオブジェクトから開いたファイルとcharset指定で動いていたのですが、Rails環境で同じ事をした所、特定のサイト上でheadまでしか読み込まれない状態になり、charsetを消すと直るという現象に遭遇しました。解決のためにリサーチしていた所

```ruby:snippet_form_stackoverflow
# Request the HTML before parsing
html = open("http://www.walmart.com.br/").read

# Replace original DOCTYPE with a valid DOCTYPE
html = html.sub(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')

# Parse
doc = Nokogiri::HTML(html)
```

を見つけ、Parseする前のプレーンなhtmlをNokogiriに投げるべきだと気付き解決しました。
（因みに上のスニペットの解説では、DOCTYPEの指定が不適切なサイトの場合Xpath等を使った指定がおかしくなるため、それを解決するにはDOCTYPEを置き換えればいい、と言うものでした。余談ですが勉強になりました。）

Xpathでの指定が上手く行かず目的のデータを集めるのに手こずっていたのですが、適切な読み込ませ方をすることで快適に使えるようになりました。（今のところは）めでたしめでたし

参考：[nokogiri doc.xpath('head') returns nil](http://stackoverflow.com/questions/6899491/nokogiri-doc-xpathhead-returns-nil)

### 追記2
やっぱ文字化けしました。基本的には大丈夫なんだけど特殊な文字含んでたり上手くcharsetを自動で読めなかったりすると化けます。今のところ

```ruby:sample
require 'kconv'
...
Nokogiri::HTML(html.toutf8, nil, 'utf-8')
```

で対応してます。
参考：
[解決済】RubyのNokogiriはHTMLの日本語エンコーディングを保持しないので困る++](http://d.hatena.ne.jp/kitamomonga/20090223/ruby_mechanize_encoding_confuse)
[CP932など特殊な文字を含むHTMLをスクレイピングする](http://d.hatena.ne.jp/sugyan/20120524/1337788935)

###追記3
文字化け。ガッデム！

```error
Encoding::UndefinedConversionError in PostsController#create
"\xAD\xB5" from EUC-JP to UTF-8
```

という具合に文字化けを含んだ文字列を含んでいるとエラーが出る。
解決案としてバイナリで読み込んで対応した。

```ruby:sample
    html = open(url, "r:binary").read
    doc = Nokogiri::HTML(html.toutf8, nil, 'utf-8')
```

参考：
[open-uriでUTF-8でないページを取得するときの注意](http://route477.net/d/?date=20110119)
オブジェクトの配列を複数キーでソートする


単に比較可能なオブジェクトの配列をソートする場合は[5,3,1].sortでいいですが、
今だけハッシュの配列で特定の要素だけを使ってソートしたい！みたいな場合があります。
このような場合、rubyのsortではC言語のqsortみたいに、比較関数(ブロック)を指定することができます。

```ruby:sort.rb
hash_ar = [{"key1"=>"abc", "key2"=>5}, {"key1"=>"bbc", "key2"=>10}, {"key1"=>"abc", "key2"=>1}] 
=> [{"key1"=>"abc", "key2"=>5}, {"key1"=>"bbc", "key2"=>10}, {"key1"=>"abc", "key2"=>1}] 

hash_ar.sort{ |a, b| (a["key1"] == b["key1"]) ? a["key2"] <=> b["key2"] : a["key1"] <=> b["key1"] }
=> [{"key1"=>"abc", "key2"=>1}, {"key1"=>"abc", "key2"=>5}, {"key1"=>"bbc", "key2"=>10}]
```


sort{}では、ブロックの戻り値の大小関係でソートが行われます。
また<=>はオブジェクトの比較を使って、-1,0,1のどれかを返すので、このようにソートブロックの中に条件を書くことで好きな方法でソートできます。

ブロックの結果を-にすることで逆順にしたり、判定部分をメソッド化するのもできるようです。

```ruby:sort.rb
def keys_sort(a,b)
	return a["key1"] <=> b["key1"] unless a["key1"] == b["key1"]
	return a["key2"] <=> b["key2"] unless a["key2"] == b["key2"]
    a["key3"] <=> b["key3"]
end

hash_ar = [{"key1"=>"abc", "key2"=>5}, {"key1"=>"bbc", "key2"=>10}, {"key1"=>"abc", "key2"=>1}] 
=> [{"key1"=>"abc", "key2"=>5}, {"key1"=>"bbc", "key2"=>10}, {"key1"=>"abc", "key2"=>1}] 

hash_ar.sort{ |a, b| keys_sort(a,b) }
=> [{"key1"=>"abc", "key2"=>1}, {"key1"=>"abc", "key2"=>5}, {"key1"=>"bbc", "key2"=>10}]
```

なんかもっとよさそうな書き方がありそうですが…
結局YESとかNOとかなんなのさ



なぜ TrueOrFalse ではいけなかったのか……は調べようとも思わないので知りませんが
内部的には

``` objectivec:YESorNO

#define YES (BOOL)1 
#define NO  (BOOL)0 

```

というマクロとして定義されています。


で、 BOOL ってなんなのさ

``` objectivec:BOOL

typedef signed char BOOL;

```

ということで、内部的には signed char の別名です。
比較の時に、なんか凄いバグ仕込まないように気をつけましょう。


でも、やっぱり TrueOrFalse で良かったんじゃ……。
homebrew で入れた Jenkins の起動方法


すぐ忘れちゃうのでメモ。

	# start Jenkins
	# 1.474 はインストールしたバージョン
	java -jar $(brew --prefix jenkins)/libexec/jenkins.war

これで http://localhost:8080/ でアクセスできる。
サービス登録とかパス通しとけとかいろいろあるけど、基本のキで。

##参考
[MacへJenkinsインストールメモ - BLOG.IK.AM](http://blog.ik.am/entry/view/id/141/MacへJenkinsインストールメモ)
Mac Lion での FTP サーバーの起動終了方法

すぐ忘れちゃうのでメモ。

	# 起動
	sudo launchctl load -w /System/Library/LaunchDaemons/ftp.plist 
	
	# 終了
	sudo launchctl unload -w /System/Library/LaunchDaemons/ftp.plist

root は `/Users/[現在のユーザー]` になる模様。怖いですね。

##参考
* [Mac LionでFTPサーバーを使う - くじらぶろぐD](http://d.aoikujira.com/blog/index.php?Mac LionでFTPサーバーを使う)
Rでプログレスバー（windows）

[参照](http://goo.gl/GWQrA)


```{r}
# 初期ウィンドウを用意
pb <- winProgressBar(title="Example progress bar", label="0% done", min=0, max=100, initial = 0)

# スリープを挟んだサンプル
for(i in 1:100) {
  Sys.sleep(0.1)
  info <- sprintf("%d%% done", round((i/100)*100))
  setWinProgressBar(pb, i/(100)*100, label=info)
}

# プログレスバーウィンドウを閉じる
close(pb)
```

## コンソール上に表示させる場合

```{r}
pb <- txtProgressBar(title="Example progress bar", label="0% done", min=0, max=100, initial = 0)
for(i in 1:1000) {
  Sys.sleep(0.1)
  setTxtProgressBar(pb, i/(100)*100)
}
close(pb)
```
Ruby 1.9.3 で、 Net::Telnet の #closed? 等が無い

メモ

Telnet#closeについては[ここ](https://bugs.ruby-lang.org/issues/3830)でも指摘されていて既に追加されているのだけれど、Telnet#closed?等のメソッドにはまだ応えないっぽかった。
1.8.7で動かしてたスクリプトを1.9.3へ移行する際に気づいて、その時は次のようなモンキーパッチ書いて凌いだんだけど・・・

```ruby
module Net; class Telnet
  
  unless method_defined? :closed?
    def closed?
      @sock.closed?
    end
  end
  
end; end
```
そもそもそういう手の入れ方でいいのかが良くわからなくてちょっと悩む。
[るりま](http://doc.ruby-lang.org/ja/1.9.3/class/Net=3a=3aTelnet.html)ではSimpleDelegatorをまだ使っている記載になってるけど、実際の実装からは外れている。
そのへんもあって、SimpleDelegator使ってた頃と同様他のTCPSocket・IO系メソッドにも応えるべきなのか、そもそもそもそういう動作は現在非推奨なのかがよくわからない。
kaminari徹底入門

Rails Advent Calendar 11 日目です。

Railsの定番paginatorと言えば[kaminari](https://github.com/amatsuda/kaminari)です。Railsで開発をしたことがあれば、少なくとも名前くらいは聞いたことがあるでしょう。
大変使いやすく、ほぼゼロコンフィグでページネーションできますが、ドキュメントがシンプルなこともあって、ちょっと凝ったことをしようとすると情報を探すのに苦労します。
と言うわけで「kaminariを使って三日目」くらいの人向けに書いてみます。

## Why kaminari?
まずは基本的なところをおさらいします。
ActiveRecordオブジェクトをkaminariでpaginateするには、以下のようなコードを書きます。（Gemfileは設定済みとします）

```ruby
Item.page
```

Item.all.pageとしては**いけません**。
これは以下のようなSQLを発行します。

```ruby
puts Item.page.to_sql
#=>  SELECT `items`.* FROM `items` LIMIT 25 OFFSET 0
puts Item.page(3).to_sql
#=>  SELECT `items`.* FROM `items` LIMIT 25 OFFSET 50
```

引数に整数を渡すとOFFSETが加算されていきます。
pageメソッドはActiveRecord::Relationオブジェクトを受け取ってActiveRecord::Relationオブジェクトを返すため、whereメソッドなどで絞り込んだ結果に対してpageメソッドを実行したり、pageメソッドで得られた結果に対してさらに操作したりできます。
また、一度に全てのレコードを取得しないので実行速度やメモリの点で有利です。

## 基本
ページネーションするには以下のようにします。

```ruby:items_controller.rb
def index
  @items = Item.page(params[:page])
end
```

```erb:index.html.erb
<%= paginate @items %>
```

とりあえずこれだけで目的は達せます。

## 1ページの件数を変えたい
コントローラで都度変更するなら以下のようにします。

```ruby:items_controller.rb
def index
  @items = Item.page(params[:page]).per(10)
end
```

デフォルトを変更するなら、モデルに以下の一行を追加します。

```ruby:item.rb
paginates_per 10
```

デフォルトは25です。

## 見た目を変えたい
kaminari組み込みのデザインは十分クールだと思いますが、デザインを合わせたいなどということもあるでしょう。その場合は以下のようにします。

まず、以下のコマンドを実行します。

```
rails g kaminari:views default
```

これでapp/views/kaminari以下にテンプレートが書き出されるので、それを変更します。
テンプレートの先頭に利用可能なローカル変数の一覧が出ているので、それを参考にクラスなどを設定していけば好みのデザインにできるでしょう。
なお、Twitter Bootstrapを使う場合、kaminariデフォルトのままだとbootstrapのクラスとぶつかって正しく表示されません。
手で直しても良いですが、便利なスニペットがあります。
[twitter-bootstrap-kaminari-views](https://github.com/gabetax/twitter-bootstrap-kaminari-views)
これをcloneして上書きすればbootstrapできちんと表示されます。
[hamlバージョン](https://github.com/konung/twitter-bootstrap-kaminari-views)もあります。

## よく使うAPI

```ruby
@item.total_count #=> レコード総数
@item.offset_value #=> オフセット
@item.num_pages #=> 総ページ数
@item.per_page #=> 1ページごとのレコード数
@item.current_page #=> 現在のページ
@item.first_page? #=> 最初のページならtrue
@item.last_page? #=> 最後のページならtrue
```

### 例
```erb:page_info.html.erb
ページ:<%= @item.current_page %> / <%= @item.num_pages %>
<%= @item.total_count %>件中<%= @item.offset_value %>
〜<%= @item.offset_value + @item.length %>件を表示しています。
```

## Ajax
Ajaxでページネーションするには、ビューを以下のようにします。

```erb:index.html.erb
<%= paginate @items, :remote => true %>
```

これだけでxhrでリクエストが行われますが、実際に書き換えを行う部分は自分で用意してやる必要があります。以下は一例です。

```ruby:items_controller.rb
def index
  @items = Item.page params[:page]
  respond_to do |format|
    format.html
    format.js
  end
end
```

```javascript:index.js.erb
$("#items").html("<%= j(render :partial => 'items') %>");

```

```erb:index.html.erb
<div id="items">
  <%= render :partial => "items" %>
</div>
<%= paginate @items %>
```

```erb:_items.html.erb
<% @items.each do |item| %>
以下略
```

## その他
ActiveRecordの例のみを紹介しましたが、kaminariはMongoidやDataMapperにも対応しています。また、Arrayオブジェクトをページネーションすることも可能です。
ドキュメントは整備されているとは言えませんが、ソースは読みやすくまたコーディングの参考にもなるので、興味があったら是非読んでみることをお勧めします。
カスタムlocatedbを作ってanythingで利用する

カスタムlocateで高速にファイル検索 → anythingで利用

## メリット

* カスタムlocatedbを設定することでインデックス生成・更新を高速化
* 範囲を限定することでanythingで誤選択を減らす

## locatedb更新設定

/etc/locate.rc をコピーして編集

```sh
% cp /etc/locate.rc $HOME/Library/Preferences/locate.rc
% vi $HOME/Library/Preferences/locate.rc
```

```sh:$HOME/Library/Preferences/locate.rc
#
# All commented values are the defaults
#
# temp directory
#TMPDIR="/tmp"

# the actual database
FCODES="$HOME/Library/Caches/com.apple.locate.db"

# directories to be put in the database
SEARCHPATHS="$HOME"

# directories unwanted in output
#PRUNEPATHS="/tmp /var/tmp"

# filesystems allowed. Beware: a non-listed filesystem will be pruned
# and if the SEARCHPATHS starts in such a filesystem locate will build
# an empty database.
#
# be careful if you add 'nfs'
#FILESYSTEMS="hfs ufs"
```
$HOMEは環境に合せて変更する
FCODES を $HOME/Library/Caches/com.apple.locate.db
SEARCHPATHS を$HOME以下に限定

## locatedbを更新する為のlaunchdの設定

locatedbを定期的に更新する為の設定

```xml:$HOME/Library/LaunchAgents/com.apple.locate.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>AbandonProcessGroup</key>
        <true/>
        <key>Disabled</key>
        <true/>
        <key>KeepAlive</key>
        <dict>
                <key>PathState</key>
                <dict>
                        <key>/var/db/locate.database</key>
                        <false/>
                </dict>
        </dict>
        <key>Label</key>
        <string>com.apple.locate</string>
        <key>LowPriorityIO</key>
        <true/>
        <key>Nice</key>
        <integer>5</integer>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/libexec/locate.updatedb</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
</dict>
</plist>
```
$HOME/Library/LaunchAgentsが無い場合、mkdirする
↑は2時間毎にlocatedbを更新する設定
詳しくは man launchd.plist

```sh
% defaults write ~/.MacOSX/environment LOCATE_CONFIG $HOME/Library/Preferences/locate.rc
% defaults write ~/.MacOSX/environment LOCATE_PATH $HOME/Library/Caches/com.apple.locate.db
```
設定ファイルとlocatedbのパスを設定 → 設定後再ログインが必要

```sh
% /usr/libexec/locate.updatedb
% ls $HOME/Library/Caches/com.apple.locate.db
```
手動実行してlocatedbが生成されることを確認する

```sh
% launchctl load -w ~/Library/LaunchAgents/com.apple.locate.plist 
```
launchdに登録

## emacs設定

```cl:~/.emacs/init.el
  (setq anything-sources
        '(
...
          anything-c-source-locate
...
          )
        )
  ;; locate db
  (let ((locatedb (concat (getenv "HOME") "/Library/Caches/com.apple.locate.db")))
    (when (file-readable-p locatedb)
      (setenv "LOCATE_PATH" locatedb)
      )
    )

```
anything-sourcesにanything-c-source-locate追加
locatedbのパスを指定

後はemacsを再起動後anythingを起動すればlocatedbが使える
Haxe で Lock を使う

こんなかんじ。

	var lock = new neko.vm.Lock();
	asyncProc(function(content : String) : Void {
		trace("asyncProc finished.");
		lock.release();
	});

	lock.wait(30); // 最大30秒待つ
	trace("wait for async finished.");

package が示す通り、neko しかサポートしてない。

##参考
Lock - Haxe http://haxe.org/api/neko/vm/lock
railsでブログ内にシンタックスハイライト(コードの色付け)をする方法(1)

プログラミングをやっているとググってブログ中のコードを参考にすることがよくあります

```ruby:example.rb
puts 'The best way to log and share programmers knowledge'
```

このようなコードってブログ内にてどのように書いているのでしょうか？？

それには以下の様な知識が必要になります

・マークダウン
・シンタックスハイライト

それぞれ見ていきましょう



###Markdown(マークダウン)
--------------------
Markdownとは"読みやすく書きやすいプレーンテキストで書け、そして構造的に妥当なXHTML（もしくはHTML）に変換することのできるフォーマット"のコト

つまり、プレーンテキスト(ブログなどの本文)にHTMLなどのタグを書かずに、記号を書くだけで表示としてはHTMLとして表示させることです

例)
####プレーンテキストに書いた内容
-------------
![プレーンテキスト本文](http://gazoy.com.s3.amazonaws.com/s/vXG/orig.png)
---------------
　　　　　　　↓
###ブラウザ内での表示
-------------------
![ブラウザでの表示](http://gazoy.com.s3.amazonaws.com/s/vXJ/orig.png)

--------------

このようにタグを書くこと無く、太字にしたりとHTMLタグを付けることができます。
RailsではMarkdownをするためのgemとして"Redcarpet"というのがあります

導入するにはGemfileに書いてインストールするだけです

```ruby:Gemfile
gem 'redcarpet','~>1.17.2'
```

```c:Terminal
bundle install
```

Redcarpetの使い方は

```ruby:herper.rbなど
def markdown(text)
  #optionの設定
  options = [ :autolink, :gh_blockcode, :hard_wrap, :no_intraemphasis,
    :fenced_code, :filter_html]
  #マークダウン
  Redcarpet.new(text, *options).to_html.html_safe
end
```

Redcarpetのバージョンが違うととnewのメソッドがないとエラーが出るので注意です



続きは次回！
Haxe で非同期処理のコールバックはどう書けば？


Java みたいにコールバックの interface を定義しても匿名クラスが使えない？みたいだし、JavaScript みたいに function を Dynamic で渡すのも型安全じゃない。。。。

こうすればいいのか！

	// 呼ばれる方
	public function sendRequest(path:String, 
		onSuccess:String->Void, onError:String->Void) : Void {
		// 成功
		onSuccess("yeah!");
		// 失敗
		onError("oops…");
	}


	// 呼ぶ方
	sendRequest("http://hoge", 
		function(data:String):Void {
 			// 成功した時、呼ばれる
			trace(data);
		},
		function(err:String):Void {
 			// 失敗した時、呼ばれる
			trace(err);
		}
	)


これなら呼ぶ方で function の定義を間違えると、コンパイル時にエラーにしてくれる。

Proxy - Haxe http://haxe.org/doc/proxy にそんな感じで書いてあった。
Haxe でプロパティ

プロパティは次のような感じで書く

```as:PropertyExample.hx
// 普通の
public var filename(default, defailt):String;

// Readonly - 同じクラスからは setter 使える
public var filename(default, null):String;

// Readonly - 同じクラスでも setter 使えない
public var filename(default, never):String;

// setter/getter メソッドを指定
public var filename(getFileName, setFileName):String;
```

null と never の違いは、同じクラスからアクセスできるかどうか。
C# と対比させると下のような感じ？

```cs:PropertyExample.cs
// Haxe の null と同じ
public string Filename { get; private set; } }
// Haxe の never と同じ
public string Filename { get; } }
```

##参考
[Properties - Haxe](http://haxe.org/ref/properties)
第３回 オフラインリアルタイムどう書く解答(C++)

毎回毎回で遅れてますが。
C++で。
問題はこちらです http://nabetani.sakura.ne.jp/hena/ord3ynode/

辞書を引くシンプルなやりかたです。現在の位置と前の位置で1バイトを作って`std::strchr`を使って辞書を引いているのがちょっとだけ工夫。

`std::strchr`を使ったら楽になるかなー、と思ってやってみたんですが、思ったほどではありませんでした。

```C++:
#include <cstring>
#include <string>

#define P(x, y) static_cast<char>((x) * 16 + (y))

static const int A = 0;
static const int B = 1;
static const int C = 2;
static const int D = 3;
static const int E = 4;
static const int F = 5;

static const char dirs[] = "rlb";

static char GRAPH[4][18] =
{
    { E, B, F, C, F, D, D, A, E, B, F, C, C, A, D, A, E, B }, // r
    { C, F, E, D, A, F, B, E, D, C, B, E, A, F, C, B, A, D }, // l
    { A, A, A, B, B, B, C, C, C, D, D, D, E, E, E, F, F, F }, // b
    { P(A, B), P(A, C), P(A, D), P(B, A), P(B, C), P(B, E), P(C, A), P(C, B), P(C, F), P(D, A), P(D, E), P(D, F), P(E, B), P(E, D), P(E, F), P(F, C), P(F, D), P(F, E) }
};

std::string ord3ynode(const std::string& src)
{
    char        cur    = P(B, A);
    std::string result = "A";
    for(std::string::const_iterator i = src.begin(); i != src.end(); ++i)
    {
        std::size_t d    = std::strchr(dirs, *i) - dirs;
        std::size_t p    = std::strchr(GRAPH[3], cur) - GRAPH[3];
        char        next = GRAPH[d][p];
        result += ('A' + next);
        cur = cur * 16 + next;
    }
    return result;
}
```


テストコード。Google Testを使っています。

```C++:
#include "gtest/gtest.h"

std::string ord3ynode(const std::string& src);

struct Data
{
    const char* dir;
    const char* expected;
};

const Data data[] =
{
    /* 0*/ {"b", "AB" },
    /* 1*/ {"l", "AD" },
    /* 2*/ {"r", "AC" },
    /* 3*/ {"bbb", "ABAB" },
    /* 4*/ {"rrr", "ACBA" },
    /* 5*/ {"blll", "ABCAB" },
    /* 6*/ {"llll", "ADEBA" },
    /* 7*/ {"rbrl", "ACADE" },
    /* 8*/ {"brrrr", "ABEDAB" },
    /* 9*/ {"llrrr", "ADEFDE" },
    /*10*/ {"lrlll", "ADFEDF" },
    /*11*/ {"lrrrr", "ADFCAD" },
    /*12*/ {"rllll", "ACFDAC" },
    /*13*/ {"blrrrr", "ABCFEBC" },
    /*14*/ {"brllll", "ABEFCBE" },
    /*15*/ {"bbrllrrr", "ABACFDEFD" },
    /*16*/ {"rrrrblll", "ACBACABCA" },
    /*17*/ {"llrlrrbrb", "ADEFCADABA" },
    /*18*/ {"rrrbrllrr", "ACBABEFCAD" },
    /*19*/ {"llrllblrll", "ADEFCBCADEB" },
    /*20*/ {"lrrlllrbrl", "ADFCBEFDFCB" },
    /*21*/ {"lllrbrrlbrl", "ADEBCBACFCAB" },
    /*22*/ {"rrrrrrlrbrl", "ACBACBADFDEB" },
    /*23*/ {"lbrbbrbrbbrr", "ADABABEBCBCFE" },
    /*24*/ {"rrrrlbrblllr", "ACBACFCACFDAB" },
    /*25*/ {"lbbrblrlrlbll", "ADADFDABCFDFED" },
    /*26*/ {"rrbbrlrlrblrl", "ACBCBADFEBEFDA" },
    /*27*/ {"blrllblbrrrrll", "ABCFDADEDABEDFE" },
    /*28*/ {"blrllrlbllrrbr", "ABCFDABCBEFDEDA" },
    /*29*/ {"lbrbbrllllrblrr", "ADABABEFCBEDEBCF" },
    /*30*/ {"rrrrbllrlrbrbrr", "ACBACABCFDEDADFC" },
           {0, 0 }
};

TEST(ord3ynodeTest, test)
{
    for(const Data* d = data; d->dir != 0; ++d)
    {
        ASSERT_STREQ(d->expected, ord3ynode(d->dir).c_str());
        
    }
}
```
Google Closure LibraryでJSを圧縮する


圧縮にはclosurebuilder.pyを使う。
コマンドライン引数は以下の通り。
--rootにはアプリのJSへのルートと、closure library自体のルートを指定する。

```shell
python ./closure-library/closure/bin/build/closurebuilder.py \                                                
--root=./js \
--root=./closure-library \
--namespace="hogehoge" \
--output_mode=compiled \
--compiler_jar=/Applications/gcc/compiler.jar \
> ./hoge.min.js
```
fields_forとdate_selectを組み合わせる


`hoge has many fugas`という関連があるとして、既存のfugaがあり、そこに新規でfugaを追加したいとする。
この場合、次の点を解決する必要がある。

* 配列風パラメータ名のインデックスを空にしておく (A)
* 既存のものにはidを送ってあげる (B)

厄介なのは`date_select`で、これは`select`タグ個々にパラメータ名を設定することはできない。
ではどうやって(A)を実現するかというと、`fields_for`に`index: nil`というオプションを渡しておく。こうすることで`prefix`オプションのあとに`[][date(1i)]`などが付加されるようになる。

```HAML
- @fugas = [@hoge.fugas, Fuga.new].flatten

= form_for @hoge do |f|
  %ul
    - @fugas.each do |fuga|
      %li
        = f.fields_for :fugas, fuga, index: nil do |ff|
          - if fuga.persisted?
            = ff.hidden_field :id, value: fuga.id, name: "hoge[fugas_attributes][][id]"
          = ff.text_field :name, name: "hoge[fugas_attributes][][name]"
          = ff.date_select :date, prefix: "hoge[fugas_attributes]"
  %div
    = f.submit
```

ちなみに`date_select`以外で`name`オプションを指定しているのは、こうしないと`[]`のなかにid値が入れられてしまい、`hoge[fugas_attributes]`のなかにハッシュと配列が入り乱れてしまうから。
プログラミングを学ぶ上で犯した2つの最大の間違い

プログラミングを効率よく学ぶ上で参考になるブログ記事があったので翻訳して紹介したいと思います。

Written By Suneel Chakravorty, A Developer At Yipit  [The 2 Biggest Mistakes I Made When Learning to Code](http://www.suneelius.com/2012/09/07/the-2-biggest-mistakes-i-made-when-learning-to-code/)

- - -

1年前、大学を出たての僕は現実世界に挑もうと決心した。実現したいスタートアップのアイディアはたくさんあった。でも、**コードの書き方は知らなかった。**

Yipitの共同創立者のVin Vacantiのアドバイスに従って独学でコードを勉強し始めた。

最終的にプロトタイプを作り上げられるのに十分なほど学習するまでの道のりは厳しかった。もしあなたが当時の僕と同じ途上にいるならば、同じ間違いを犯さないことを祈っている。

## 間違い#1: 実際には必要のないことに時間を費やしすぎた

僕はどこから手を付けたらよいのかすらわかっていなかった。たくさんのバズワードがあって、たくさんの競い合う観点があって、何が重要なのかを判断するのが難しかった。Hacker NewsやQuora、StackOverflowを巡回して、人気の記事からランダムに用語をひっぱってきたことで僕はこんな馬鹿げた寄せ集めのリストを考え付いた。

*HTML, CSS, AJAX, PHP, Javascript, Heroku, Celery, SQL, jQuery, Django, POSTGRES, nodeJS, BackboneJS, Ruby, Rails, MongoDB, Python*

どれが必要で、どれが必要でないかがわかっていなかったから全部を学習しようとした。

## すべきだったこと: 実用的なプロトタイプに必要なものだけにリストを絞り込むべきだった

最終的に、リストの項目が実際に何をするものなのかを理解し、以下のものに絞り込んだ

1. HTML: ページを構築する(e.g. これがリンク、これがタイトル）
2. CSS: コンテンツをスタイリングする(e.g. マウスオーバーした時にリンクを太字にする）
3. Javascript: コンテンツを動的なものにする(e.g. リンクをクリックした時にポップアップを開く）
4. jQuery: 使いやすいプラグインが集まったJavascriptライブラリー(e.g. 写真のスライドショー)
5. Python: データを処理する(e.g. データベースからユーザーの購入履歴を引き出してオススメを提示する)
6. Django: Pythonで実装されたWebアプリケーションフレームワーク。上に挙げた全ての要素を繋ぎ合わせ、多くのビルトインの必要な機能を提供する(e.g. 予め用意されたログインシステムやPythonだけを使って簡単にデータベースにアクセスする方法等）。フレームワークを使おう。めちゃくちゃ楽になる！

## 間違い#2: すぐにコーディングを始めなかった

コーディングの本を読むのに時間を使いすぎた。自分のプロジェクトに実際どう役立つかもわからずにいた。最悪なことに、読んでいるものを実際に応用しなかったので自分の中に何も蓄積されることがなかった。

## すべきだったこと: 最初から小さなプロジェクトに取り組みながら学習すべきだった

あとになって、実用的なプロトタイプを作り上げるのに十分なとても効果的な学習方法を発見した:

1. 積極的にチュートリアルに取り組んで、例題のコードを書くこと。これに関してYipitの同僚開発者が[素晴らしい提案](http://tech.yipit.com/2012/08/21/how-i-taught-myself-to-code-in-8-weeks/)をしている。
2. 簡単なプロジェクトを選んでコードを書く。[シンプルなブログ](http://www.djangorocks.com/tutorials/how-to-create-a-basic-blog-in-django/starting-your-application.html)や、[基礎的な投票アプリ](https://docs.djangoproject.com/en/dev/intro/tutorial01/)をつくってみる。
3. #2を何度か繰り返す。
4. 自分のスタートアップのプロトタイプを作り上げる

今すぐやり始める利点はたくさんある。速やかにプログラミングにおいて持ちうる不安を乗り越えられること。すぐに学習の労力が報われることがわかること。何よりも大事な利点は、**自分のプロダクトをつくり上げるのに必要なスキルを急速に伸ばせることだ。**
ActionMailerの使い方メモ


## ModelとTemplateの生成
```sh:
rails g mailer ExampleMailer
```

## 文字コードをISO-2022-JPに変更
方法はいくつかあるようだが、どうもさっくり出来る方法が少なそう。
調べた限りだと現状ActionMailerの代わりに[jpmobile::mailer](https://github.com/jpmobile/jpmobile)を使うのが良さそう。jpmobileに書き換えるとデフォルトはISO-2022-jp、docomo/SoftBankにはShift_JISで送信を行なってくれるらしい。手順は以下

### jpmobileを追加インストール

```text:Gemfile
gem 'jpmobile'
```

### ActionMaierの代わりにJpmobile::Mailerを継承する

```ruby:app/mailers/example_mailer.rb
class ExampleMailer < ActionMailer::Base
  ↓ 書き換え 
class ExampleMailer < Jpmobile::Mailer::Base
```

## htmlメール textメールの切り替え
単純にViewテンプレートの拡張子によってtext or htmlメールで送るかを決定している様子

```text:
template.text.erb # => textメールで送信
template.html.erb # => htmlメールで送信
template.erb      # => htmlメールで送信
```
HBase の FilterString の SingleColumnValueFilter の ドキュメントの嘘

```
SingleColumnValueFilter (<compare operator>, ‘<comparator>’, ‘<family>’, ‘<qualifier>’)
```
は、以下の誤り

```
SingleColumnValueFilter (‘<family>’, ‘<qualifier>’, <compare operator>,  ‘<comparator>’)
```

comparator も ドキュメントに有るように単純に値を指定するのではなく、
<pre>
'binary:abc'
</pre>
のように指定する。

参照:
http://grokbase.com/t/hbase/issues/1255wdwt53/jira-created-hbase-5946-thrift-filter-language-documentation-is-inconsistent
Androidで画面サイズを取得する方法

Androidで画面サイズを取得するのに、従来はDisplayクラスのgetWidth()/getHeight()メソッドを使っていたが、API level 13以降では非推奨(Deprecated)になっています。

代わりに、getSize(Point point)メソッドが追加されていて、こちらを使うようにとのことです。ただし、このgetSize()メソッドはAPI level 13より前では存在しません。そのため、API level 13をまたぐコードを書く場合は、注意が必要です。

下記StacOverflowの回答がとても参考になったので、コード部分をメモとして引用します。
stacoverflow : [Android get Screen Size deprecated?](http://stackoverflow.com/questions/10659954/android-get-screen-size-deprecated)

```
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
overrideGetSize(display, size);

void overrideGetSize(Display display, Point outSize) {
    try {
      // test for new method to trigger exception
      Class pointClass = Class.forName("android.graphics.Point");
      Method newGetSize = Display.class.getMethod("getSize", new Class[]{ pointClass });

      // no exception, so new method is available, just use it
      newGetSize.invoke(display, outSize);
    } catch(NoSuchMethodException ex) {
      // new method is not available, use the old ones
      outSize.x = display.getWidth();
      outSize.y = display.getHeight();
    }
}
```
MacにてRailsでMysqlを使おうとすると『 9): Library not loaded: libmysqlclient.18.dylib (LoadError) 』が発生する場合の対策


## 出てくるエラーメッセージ

```
$ rails s
/Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2.rb:9:in `require': dlopen(/Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.18.dylib (LoadError)
Referenced from: /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle
Reason: image not found - /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2.rb:9:in `<top (required)>'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/bundler-1.2.0/lib/bundler/runtime.rb:68:in `require'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/bundler-1.2.0/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/bundler-1.2.0/lib/bundler/runtime.rb:66:in `each'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/bundler-1.2.0/lib/bundler/runtime.rb:66:in `block in require'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/bundler-1.2.0/lib/bundler/runtime.rb:55:in `each'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/bundler-1.2.0/lib/bundler/runtime.rb:55:in `require'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/bundler-1.2.0/lib/bundler.rb:128:in `require'
from /Users/username/Dropbox/myproject/w7tree/mysite/config/application.rb:13:in `<top (required)>'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.8/lib/rails/commands.rb:53:in `require'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.8/lib/rails/commands.rb:53:in `block in <top (required)>'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.8/lib/rails/commands.rb:50:in `tap'
from /Users/username/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/railties-3.2.8/lib/rails/commands.rb:50:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
```

要するに、libmysqlclient.18.dylib が見つからんとおっしゃっておる模様。


## 対策

シンボリックリンクにて、適切な場所にlibmysqlclient.18.dylibを設置すればよいらしい

以下のコマンドを実行すればOK

```
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
```


-------


参考サイト: http://stackoverflow.com/questions/5446747/ruby-mysql2-gem-not-working-mac-os-x-snow-leopard-ruby-1-9-2
rack_after_reply でレスポンス後に処理を行う


Rails Advent Calendar 10 日目です。

Rails で、S3 へのアップロードや画像処理、メール送信など、時間のかかる処理をする際に、レスポンスをすぐに返し、処理自体はレスポンス後に行いたい場合があります。

rack_after_reply (https://github.com/oggy/rack_after_reply) は rack サーバを拡張する gem で、`env["rack_after_reply.callbacks"]` に Proc オブジェクトを追加することで、レスポンス後に実行してくれます。

```ruby
# Gemfile
gem "rack_after_reply"
```

```ruby
# app/controllers/photos_controller.rb
def create
  @photo = Photo.new(params[:photo])
  if @photo.valid?
    env["rack_after_reply.callbacks"] << lambda {
      # 時間のかかる処理
      sleep 10
      @photo.save!
    }
    # 202 Accepted を返す
    format.html { render status: :accepted }
  else
    format.html { render action: :new }
  end
end
```

上の例では、即座にレスポンスが返り、(およそ) 10 秒後にレコードが追加されます。

ちなみに、この例では HTTP ステータスコードとして、201 や 302 ではなく、202 (Accepted) を返していて、これは「リクエストは受理したけど、まだ処理が完了していない」ことを示すステータスコードです。

本来、202 を返すときは「リソースの現在の状態」と、「最新の状態をモニタできる URL、またはリソースの作成にかかる見込み時間」を付与すべきですが、ここではなにもしてません。

# 他のライブラリとの比較

こういった用途では resque や delayed_job が有名ですが、これらはいづれも、データストアにジョブ登録 -> 別プロセスで処理という方法をとるため、ジョブ実行に必要なすべての情報をデータストアにシリアライズして保存しなければなりません。

この処理は、特にファイルのアップロード (Rails では一時ファイルになる) が絡むと面倒で、carrierwave などのライブラリを利用しているとさらに複雑になります。

rack_after_reply は、だいたい下記のような特徴をもつので、実装の容易さ・簡潔さなら rack_after_reply、分散のしやすさ・汎用性・疎結合性なら resque / delayed_job といった感じでしょうか。

## メリット

* 遅延処理しない場合に比べ、ほとんどコードを変える必要が無い
* 別のプロセスやデータストアが必要ないため構成がシンプル
* メモリ上のオブジェクトや一時ファイルをそのまま処理できる

## デメリット

* 時間のかかる処理をフロントエンドと同じプロセスが行うので分散しにくい
* 処理の途中で失敗した場合のリトライがしにくい

# 仕組み

最初 Rack ミドルウェアかなと思ったけど、Rack ミドルウェアではレスポンス後に処理を行うことはできない。中身をみてみると、代表的な Rack サーバが各リクエストを処理するメソッドをフックして、コールバックを実行しているようです。

対応している Rack サーバは README 参照。
いま見たところ Mongrel, Passenger, Thin, Unicorn, WEBrick が挙がっています。

# テスト

「仕組み」でも書いたとおり、Rack サーバの拡張なので、普通にテスト書いてもうまくいきません。というか、そもそも `env["rack_after_replay.callbacks"]` が `nil` になって例外が起きます。

ひとまず、遅延処理を行う部分を下記のようにすれば、テスト時は rack_after_reply を使わないようになります。運用時と実行されるタイミングが変わってしまうので、あまりよい方法ではないですが...。

```ruby
slow_proc = lambda {
  # 時間のかかる処理
  @photo.save!
}

if env["rack_after_reply.callbacks"]
  env["rack_after_reply.callbacks"] << slow_proc
else # テスト時
  slow_proc.call
end
```
Sublime Text 2 のプラグイン (コマンド) をつくる


# 概要

- Python で書く必要がある
- 実体は sublime_plugin.TextCommand のサブクラスで、このクラス 1 つが 1 コマンドに対応
- 実行時はこのクラスのインスタンスが作られ run メソッドが呼ばれるので、処理をここに書く
- コマンド名はクラス名から Command をのぞき snake case にしたもの、FooBarCommand なら foo_bar になる
- Command Palette に表示する方法は後述
- Snippet はまた全然別の仕組み

# 作り方

[Tools]-[New Plugin...] とするとひな形ができるので、Packages/User 下 (など) に保存する。拡張子は py でよい。

# 使い方

1. Console を開いて ([View]-[Show Console]) `view.run_command("コマンド名")`
2. キーバインドする ([Sublime Text 2]-[Preferences]-[Key Binding (User)])
3. Command Palette から使う (後述の方法で登録して [Tools]-[Command Palette...]) 

# ドキュメント

http://www.sublimetext.com/docs/2/api_reference.html

ここにも書いてあるけど、Packages/Default 内にサンプルがいくつかある。

# イディオム

self.view に対して処理することが多い。

```py
# 開いてる view を取得
self.view

# OK / キャンセルダイアログ
if not sublime.ok_cancel_diag(u'処理を続行しますか?')
  return

# 開いてるファイルのパスを取得
self.view.file_name()

# 開いてるプロジェクトのパスを取得
self.view.window().folders()[0]

# ファイルを開く
self.view.window().open_file("foo.rb")

# ファイルの内容をすべて取得
region_all = sublime.Region(0, self.view.size())
self.view.substr(region_all)

# ファイルの内容をすべて置き換え
self.view.replace(edit, region_all, "bar")

# ファイルの存在チェックとかは普通に Python のライブラリを呼べば良い
import os
os.path.exists("foo.rb")

# シェルなんかも Python のライブラリで
# rbenv で ruby 呼ぶ場合、環境変数渡すかフルパスにしないといけない
import subprocess
subprocess.Popen(["ruby", "-v"], stdout = subprocess.PIPE).communicate()[0]
```

# Command Palette に表示する

コマンドを作っただけでは、Command Palette には表示されない (run_command やキーバインドで使うことはできる)。

下記の様なファイルを Packages/User/User.sublime-commands という名前 (拡張子重要) で保存すれば、Command Palette に表示されるようになる。

```javascript
[
  // caption は Command Palette に表示される文字列
  // command はコマンド名
  { "caption": "Foo Bar", "command": "foo_bar" },
  { "caption": "Baz", "command": "baz" }
]
```
Unix Domain Socket サーバーを作る


習作で Unix Domain Socket を書いてみたのでメモを残しておく。

## Python

TCP との違いは `socket` 初期化時に `socket.AF_UNIX` を指定することと、 `.bind()` の引数がパスになるくらいです。ただ、指定されたファイルがすでにあったらエラーになるので、 `.bind()` する直前に `unlink()` しておきます。

```python:uds_server.py
#!/usr/bin/env python
import os
import signal
import socket

signal.signal(signal.SIGPIPE, signal.SIG_IGN)

sock = socket.socket(socket.AF_UNIX)
os.unlink('test.uds')
sock.bind('test.uds')
sock.listen(10)

while True:
    s, addr = sock.accept()
    print "connected from:", addr
    while True:
        s.sendall("a"*60 + '\n')
```

## C

Python に比べると `sockaddr_un` を扱うのがちょっと面倒。 `sockaddr_un.sun_path` の長さが短いことに注意。ディレクトリ構造が深いところにソケット作れないってことらしい。 Python でも結局は内部でこれを使っているので、パス長の制限からは逃げられないはず。

```uds_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <signal.h>

static char buf[] = "aaaaaaaaaaaaaaaaaa\n";

int main()
{
    int r;
    int listen_fd = 0;
    struct sockaddr_un local, remote;

    signal(SIGPIPE, SIG_IGN);
    listen_fd = socket(PF_UNIX, SOCK_STREAM, 0);
    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, "test.uds");
    unlink(local.sun_path);
    r = bind(listen_fd, (struct sockaddr *)&local, sizeof(local));
    if (r)
        perror("failed to bind");

    listen(listen_fd, 100);
    for (;;) {
        socklen_t len = sizeof(remote);
        int remote_fd = accept(listen_fd, (struct sockaddr *)&remote, &len);
        if (remote_fd < 0) {
            perror("failed to accept");
            return 0;
        }
        for (;;) {
            int sent = write(remote_fd, buf, 20);
            printf("sent %d bytes\n", sent);
            if (sent < 0) {
                printf("%d %s\n", errno, strerror(errno));
                perror("fail to send");
                close(remote_fd);
                break;
            }
        }
    }
}
```
CUIで簡易統計関数

実験とかしていると`cut`とか`paste`やった後に平均とか標準偏差とか見たくなりますよね。ってことでRさんの関数をエイリアスで呼び出す。

```sh
for f in mean sd max min
do
    alias $f="R --vanilla --slave -e \"x <- scan('stdin', quiet=TRUE); cat($f(x), fill=TRUE)\""
done
```

こんな感じで使う。

```sh
% jot 10 | mean
5.5
% jot 10 | sd
3.02765
```

便利。ちょっと起動に時間がかかるけど。
オブジェクトのメモリ管理で気をつけること2つだけ


Objective-C初心者向けです。

Objective-Cはポインタを直に扱う言語なので、メモリ管理を意識しないと簡単に落ちてしまいます。
なのでJavaやJavaScript等のメモリ管理をよきに計らってくれる言語しか使ったことがないと非常に苦労すると思います。

しかし以下に挙げる2点さえしっかり守ってくれれば、かなり落ちにくくなると思います。

## 1. allocを書いたら、即releaseを書くべし

alloc initを書いたら次の行でまずreleaseしましょう。
ファイルを変更したらCtrl+Sを押すのと同じくらい、無意識にやるように習慣化するのが良いです。
これによってメモリの開放漏れによるバグが激減するはずです。

#### まずalloc/releaseペアを書いて

```
NSMutableArray *array = [[NSMutableArray alloc] init];
[array release];
```

#### その後オブジェクトを使った処理を追加しましょう

```
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:something];
...
[array release];
```



## 2. ポインタをオブジェクト内で保持する場合は必ずプロパティ経由にすべし

私はポインタをオブジェクト内で保持する場合（つまりクラスのメンバ変数にポインタがある場合）は、
必ず対応するプロパティを作成するようにしています。
経験上これは非常に有効です。

どういうことかって言うと、
以下のように名前（NSStringのポインタ）を持つUserというクラスを定義するとします。

```Objective-C:
@interface User {
	NSString *_name;
}
@end
```

その場合、必ず、_nameに対応するプロパティを追加します。

```Objective-C:
@interface User {
	NSString *_name;
}
@property(nonatomic, retain) NSString *name;
@end
```

そしてこの名前フィールドにアクセスする場合は、メンバ変数を直に触るのではなく、
必ずプロパティ経由でアクセスするようにします。

#### メンバ変数直アクセスはNG

```Objective-C:
// 代入
_name = name;
[_name retain];
// 開放
[_name release];
```

#### プロパティ経由でアクセスしよう

```Objective-C:
// 代入
self.name = name;
// 開放
self.name = nil;
```

要はretain/releaseとかいちいちやってると、いつかミスるよってことです。
プロパティ経由の開放にしておけばreleaseの多重呼び出しで落ちることを防げます。
また、コード中にretainやreleaseが散財していると、どうも精神衛生上よろしくないように思います。
その状態を何とも思わないというのも危険です。


## 補足
なお、今回はautorelease pool/ARC/blocksについては置いておきます。
autorelease pool/ARC/blocksはとても便利ですが、よくわかってないで使うと罠にはまる可能性が高まります。
また所詮後付けされた機能ですので、使わなくてもなんとかなるはずのものです。
Objective-Cについてよくわかっていないうちは、これらの機能は使わない方がいいんじゃないかと思います。
第３回 オフラインリアルタイムどう書く解答(Haskell RWSモナド編) 

勉強会には参加してないんですが、書いてみたので回答を貼っておきますw
最近mtlパッケージのモナドがめちゃめちゃ便利であることを理解したので、そのあたりのモナドを使うことに凝ってます。

```haskell
import Control.Monad.RWS
import System.Environment

data Node = A | B | C | D | E | F deriving (Show, Eq, Ord, Enum)

data Path = Path {source :: Node, target :: Node} deriving Show

data NodeGroup = NG Node Node Node Node deriving Show

route :: Path -> Char -> Node
route (Path s t) c = route' (nodeGroup t) s c
  where
    route' (NG _ n2 n3 n4) n 'r'
      | n == n2 = n4
      | n == n3 = n2
      | n == n4 = n3
      | otherwise = error "Invalid Node"
    route' (NG _ n2 n3 n4) n 'l'
      | n == n2 = n3
      | n == n3 = n4
      | n == n4 = n2
      | otherwise = error "Invalid Node"
    route' (NG _ n2 n3 n4) n 'b'
      | n == n2 = n2
      | n == n3 = n3
      | n == n4 = n4
      | otherwise = error "Invalid Node"
    route' _ _ _ = error "Invalid route'"

    nodeGroup A = NG A D C B
    nodeGroup B = NG B A C E
    nodeGroup C = NG C A F B
    nodeGroup D = NG D E F A
    nodeGroup E = NG E B F D
    nodeGroup F = NG F C D E

goRoute :: String -> RWS () String Path ()
goRoute [] = return ()
goRoute (next:xs) = do path@(Path _ t) <- get
                       let nextNode = route path next
                       tell $ show nextNode
                       put $ Path t nextNode
                       goRoute xs

main :: IO ()
main = do arg <- liftM head getArgs
          let initPath = Path B A
              (_,_,w) = runRWS (goRoute arg) () initPath
          putStrLn $ show (target initPath) ++ w
```

最初、Reader部分も使って書いてたけど、無くてもいいやと思ったので、
RWSモナドだけどWSのところしか使ってない。

Haskellでテストコード書けるようにならないとなあ。
第3回オフラインリアルタイムどう書くの解答例 rubyで

先日行われた第三回オフラインリアルタイムどう書く
http://atnd.org/events/31590
で出した問題
http://nabetani.sakura.ne.jp/hena/ord3ynode/
を、rubyで解いた。

```ruby:ynode.rb
#!ruby

def next_pos( from, cur, cmd )
  return from if cmd=='b'
  y=[0x10,2,1].map{ |i|
    ((i^cur)&16)+((i+cur)&15)%3
  }
  d=(cmd=="r")==(cur<0x10) ? 2 : 1
  y[( y.index(from)+d )%3]
end

def solve( i )
  i.chars.inject([1,0]){ |s,c|
    s+[next_pos( s[-2], s[-1], c )]
  }[1..-1].map{ |i|
    (( i<0x10 ? 'A'.ord : 'D'.ord-0x10 )+i).chr
  }.join
end

DATA.each{ |a|
  next if a.strip.empty?
  i,x=a.split( /\s+/ ).map( &:strip )
  a=solve(i)
  raise [i,a,x].inspect unless a==x
  puts "%s -> %s" % [i,a]
}

__END__
b	AB
llllllrllrlbrrr	ADEBADEFCBADABED
```

テストデータは大半を省略。

座標系を入れて、座標から頂点名を引けるようにしたら、右に曲がったり左に曲がったりするのは論理的に計算できるよね、というアイディア。

問題の地図は三角柱。三角形を底面として、16進数の10の位が上下。1の位が三角柱の中心軸を回る座標。
ということでビット計算等でごにょごにょすると何とかなる。
iOSシステム設定のプロクシ情報を取得する


CFNetwork/CFProxySupport のAPIを利用するのが一番スマートそう。

[CFNetworkCopySystemProxySettings](http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFProxySupport/Reference/reference.html "CFNetworkCopySystemProxySettings")関数で設定情報を辞書でまとめて取得できる。

```objc:プロクシが有効かどうか調べる
  CFDictionaryRef proxySettings = CFNetworkCopySystemProxySettings();
  // 値が0でなければプロクシが有効になっている
  CFNumberRef enable = CFDictionaryGetValue(proxySettings, kCFNetworkProxiesHTTPEnable);

  BOOL isHttpProxySettingsEnable = CFBooleanGetValue(enable);
```
RailsのApplication templateを使って開発の初速をあげよう！


Rails Advent Calendar 9日目です。

どのくらい認知があるのか知りたい、という意味も込めての投稿です:-)
Railsに標準で備わっているApplication Template（アプリケーションテンプレート）の概要とサンプルの紹介です。

## RailsはGemが増えると最初の設定だるい

よくRailsは「設定より規約」なんだよね、とか聞きますが、
たしかにRailsは仕組みさえ覚えてしまえば、
比較的簡単にデプロイまでできてしまいます。
難しい設定ファイルも書くことはとても少ないです。
特に最近はHerokuを中心とするPaaSの台頭でよりその恩恵を受けれている気がします。

また、Rubyのコミュニティがとても活発で、
優秀な方がたくさんいるので、めちゃんこ便利なGemがたくさん流通しています。

Githubをサーフィンしてたら、
「やっべー、このGemすげー、Gemfileに追加しよ！」
ってことは日常茶飯事です。

でも、そうやっているといつのまにかGemの設定ファイルがたくさん生まれます。
Capistranoならconfig/deploy.rb
ResqueをGodで監視するならconfig/god/resque.rb
他に毎回application.rbに追加している設定もあるかもしれません。

そうすると、

```bash
rails new hogehoge
```

してから、実際にアプリケーションコード書き始めるまでの準備がとても長い…
そしてコピペするとミスのなんのって。

やっぱこうなってきたら自動化したいですよね。

## Application Templateを使おう

RailsにはApplication Templateという機能があります。
どういうのかっていうと、
いつも使う設定をひとつのファイルにまとめておくと、
毎回それを参照することで自動的にファイルの生成や設定の追加をやってくれる、というものです。
文章にするとちょっと抽象的すぎますね。

たとえば、

```ruby:app_template.rb
# Gemfileにrainbowを追加（bundle installの前に実行される）
gem 'rainbow'

# どうせいつもすぐ消すし消しとこ！
remove_file "public/index.html"
```

```bash
rails new new_project_name -m app_template.rb
```

とすると、自動的にrainbowが入った状態で、
public/index.htmlが存在しないプロジェクトが出来上がります。

---

もし、毎回は使わないけど、時々使いたいgemがあれば、

```ruby:app_template.rb
if yes?('Would you like to install nokogiri?')
  gem 'nokogiri'
end
```

のように書くことも出来るし、gitのリモートリポジトリを指定したいときは、

```ruby:app_template.rb
@app_name = app_name
@remote_repo = ask("git remote repo?")

git :remote => "add origin #@remote_repo:#@app_name.git"
```

のようにインタラクティブなApplication Templateも書くことも出来ます。

---

詳しい書き方については、
英語ですがRails Guidesに書いてあるのでそちらをご参照ください。

Rails Guides
[Creating and Customizing Rails Generators & Templates > 8 Application Templates](http://guides.rubyonrails.org/generators.html#application-templates)

Rails Guidesにも書いてあるんですが、
このApplication TemplateではThorの以下のメソッドも使えるので便利です。

Thor
[Module: Thor::Actions](http://rdoc.info/github/wycats/thor/master/Thor/Actions)


## 作るのもいいけど…出来上がってるの無いの？

あるある、あるよ。

Stackoverflow
[What Rails application templates show best practices for setting up a new Rails 3 application?](http://stackoverflow.com/questions/4999207/rails-3-application-templates)

でもすんげーたくさん詰まってて、
個々が使いやすいように、自分のために作るものだと思うので、
是非ちょっとずつ自分のAppcation Templateを作ってみては！とおもいます。

って言うだけじゃ説得力ないな、と思ったので自分もつくりました笑
[tachiba's application template](https://github.com/tachiba/rails3_template)

スパゲッティになっちゃっているので、
設定の量が増えたらStackoverflowに紹介されているもののように、
ファイルを分割してapplyで参照するのが可読性も保ててよいのかと思います。

## 自動化して楽しよう！

やっぱRailsを使うなら実装を書くのに時間を割きたいな、と思います。
ほんで、これだけすらすら実装して、
デプロイできる環境が整っているので、
それこそゴミのようにたくさんサービスを作りたいわけです。

ちょっと最初は面倒なんですが、
自分のためのApplication Templateを作る、育てるのは楽しいと思うので、
是非作ってGithubで公開してみてください。

cf.)
ちなみに、Rails ComposerというRails Apps Composer(Gem)を使ったテンプレートもあります。
http://railsapps.github.com/rails-composer/

ちょっと複雑そうに見えたので自分は逃げてしまいました:-(
MountainLionでWeb共有する方法

Macを山ライオンにしたら、Web共有が出来なくなってしまった。
困った！！と思ったら、解決方法が・・・。

ターミナルで以下のコマンドを実行して、configファイルを作って、Apacheを再起動するのだそうだ。
sudo vim /etc/apache2/users/sachiko.conf

<Directory "/Users/USERNAME/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
Railsでの変数初期化　nilガード

```ruby
a ||= []
```
aがnilなら[]を初期値として、nilでないならばaとする

いつかどこかで解説を見た気がしたけれど、"||="ではググれないのでメモ
いま解説をメタプログラミングRubyで見つけたので
次から忘れたら"nilガード"でググろう
Rails 3.2 Application Templatesを使って、速攻で良い感じのRailsのひな形を作る

アドベントカレンダー。
http://qiita.com/items/53a405a7b40899baffed

>kitaindia「参加します　９月５日」

今現在　９月９日。

スマヌ・・・スマヌ・・・

# さて。

https://github.com/RailsApps/rails3-application-templates
を使って、 手っ取り早くRails開発環境を作ってしまいましょう。
ウィザード方式で質問に答えていくだけで、unicornやcucumber、rspecなんかの設定もパパっとやってくれます。mongoid+omniauthなんかもパパッとつくれちゃいます。
rails newでサラピンのものつくるより良いです。

環境はRails 3.2.8のruby 1.9.3p194 です。

>$ rails new myapp -m https://raw.github.com/RailsApps/rails-composer/master/composer.rb
>      recipe  Running railsapps recipe...
>   question  Install an example application?
>          1)  I want to build my own application
>          2)  rails3-bootstrap-devise-cancan
>          3)  rails3-devise-rspec-cucumber
>          4)  rails3-mongoid-devise
>          5)  rails3-mongoid-omniauth
>          6)  rails3-subdomains
>   railsapps  Enter your selection: 

って出るので、使いたいテンプレを入力してenter. 今回は2で、deviseとcancanがすぐ使えるテンプレ作りましょう。

>    question  Web server for development?
>          1)  WEBrick (default)
>          2)  Thin
>          3)  Unicorn
>          4)  Puma
>       setup  Enter your selection: 

次がでました。開発用のサーバーを選びましょう。ナウなヤングも使ってるという噂の3のUnicorn使ってみたいので、3で。

>    question  Web server for production?
>          1)  Same as development
>          2)  Thin
>          3)  Unicorn
>          4)  Puma
>       setup  Enter your selection: 

本番のは何使う？　って聞かれるので「開発用と同じ」でいいかな、ってことで1番。

>    question  Template engine?
>          1)  ERB
>          2)  Haml
>          3)  Slim
>       setup  Enter your selection: 

テンプレートエンジン何使う？　って聞かれます。いつもは慣れてるERBだけど、試しに2のHamlにしてみましょうか。2で。

>    extras  Set a robots.txt file to ban spiders? (y/n)

googleなんかの検索エンジン避けのためにrobots.txtを設定するか聞かれます。nでいいと思います。

>   extras  Create a project-specific rvm gemset and .rvmrc? (y/n) 

自分がrvmをつかってるから出るのかな？ rvmにgemsetを今回のために作るかどうか聞かれます。.rvmrcも作ってくれるのでディレクトリに行ったら自動でgemsetをプロジェクト用にセットしてくれます。yで。（rvmrcだいすき）
gemsetの名前はrails new で指定したアプリ名になります。同名のgemsetがあったら置き換えられます。

>   extras  Create a GitHub repository? (y/n) 

GitHubに登録するかどうか聞かれます。nで。

色々gemダウンロードしたりしてくれたりします。これで完了。

> $ cd myapp/
> $ unicorn

で実行してみましょう。ほら、簡単devise+cancan+unicorn+hamlのひな形ができました。
Rspec、cucumberなんかのテストも用意されています。

ソースも確認してみましょう。なかなか良い感じじゃないですか？
WindowsでGitを使うときに、パスフレーズの入力を1回だけで済ませる

リモートリポジトリにアクセスする際に毎回パスフレーズの入力を求められるのは結構面倒です。

mattnさんが以下のサイトで紹介しているバッチファイルを実行して、パスフレーズを1回だけ入力すれば、その後はパスフレーズの入力が不要になります。

* [Big Sky :: Windowsでもssh-agentとssh-addを使ってパスフレーズ入力を省略する。](http://mattn.kaoriya.net/software/20081106192615.htm)

# 実行例

ssh-setup.bat の名前でバッチファイルを保存したと仮定

```bat
>ssh-setup.bat 
Enter passphrase for /d/users/*****/.ssh/id_rsa:
Identity added: /d/users/*****/.ssh/id_rsa (/d/users/*****/.ssh/id_rsa)
```
Rubyのクラスメソッドはインスタンスメソッドと同じようにprivateにならない


これも他の言語からRubyにやってきた人は間違えやすいかも。
private以下で定義したクラスメソッドはインスタンスメソッドと同じようにprivateになりそうな気がしますが、実はpublicのままです。
`private_class_method`でそのメソッドを指定するか、特異クラスの中で定義する必要があります。

````ruby
require 'rspec'

describe 'private class method' do
  context '1. when use private keyword' do
    class PrivateKeyword
      def a_public_instance_method; end
      def self.a_public_class_method; end
    private
      def a_private_instance_method; end
      def self.a_private_class_method; end
    end

    let(:instance) { PrivateKeyword.new }
    specify { instance.respond_to?(:a_public_instance_method).should be_true }
    specify { PrivateKeyword.respond_to?(:a_public_class_method).should be_true }
    specify { instance.respond_to?(:a_private_instance_method).should be_false }

    #Maybe surprising!!
    specify { PrivateKeyword.respond_to?(:a_private_class_method).should be_true }
  end

  context '2. when use private_class_method' do
    class PrivateClassMethod
      def self.a_private_class_method; end
      private_class_method :a_private_class_method
    end

    # Should be private
    specify { PrivateClassMethod.respond_to?(:a_private_class_method).should be_false }
  end

  context '3. when use singleton class' do
    class InSingletonClass
      class << self
        def a_public_class_method; end
      private
        def a_private_class_method; end
      end
    end

    specify { InSingletonClass.respond_to?(:a_public_class_method).should be_true }

    # Should be private
    specify { InSingletonClass.respond_to?(:a_private_class_method).should be_false }
  end
end
````
````
$ rspec private_class_method_spec.rb
.......

Finished in 0.00232 seconds
7 examples, 0 failures
````

ちなみにprivateなクラスメソッドがそれほど多くないなら、2番目の`private_class_method`を使う方がシンプルでいいと思うんですが、どうでしょうか？
そもそもあまりクラスメソッドが多いと、本当にオブジェクト指向プログラミングできてますか？ということになりそうですし。

###参考
Privateメソッドに関連する話として、「JavaやC#の常識が通用しないRubyのprivateメソッド」というタイトルで以前ブログを書きました。
http://junichiito.hateblo.jp/entry/20120315/1331754912