OmniAICreator/Qiita-1.07M huggingface dataset:
meinheld + WebSocket + mongodb しようとした時エラーが出る

日頃からお世話になっている meinheld 大先生には
既存の wsgi アプリを簡単に WebSocket を実現する `WebSocketMiddleware` というものが存在します。
僕みたいなヘタレヤロ―の書くコードだと meinheld とかにお世話にならないととても遅くて使いものにならない感じなので頭が上がらないですね。

で、そんな WebSocket を使っちゃってる最近のイケテルっぽいアプリを作ろうと思った時、
DB の選択肢としてはもうそんな勢いで当然 mongodb をチョイスしちゃいますよね。
yep.

で、meinheld の作者の方自ら書かれた [meinheld WebSocketMiddleware を flask とかに適用しちゃうサンプル](http://d.hatena.ne.jp/mopemope/20100821/p1)を参考にしつつ mongodb しちゃう物を組んでみるとこうなりますかと

```python:main.py
from shimehari import Shimehari
from mongoengine import connect
from meinheld import server, middleware
import config


def connectDB():
    connect(config['DB_NAME'])

app = Shimehari(__name__)

if __name__ == '__main__':
    connectDB()
    server.listen(("0.0.0.0", 3000))
    server.run(middleware.WebSocketMiddleware(app))
```

##起動してみる

```console
$ (venv) bin/python main.py
```

＿人人人人人人人人＿
＞　突然のエラー　＜
￣Y^Y^Y^Y^Y^Y^Y￣

##トレースバック

```console
Traceback (most recent call last):
  File "main.py", line 25, in <module>
    connectDB()
  File "/project/path/main.py", line 13, in connectDB
    connect(config['DB_NAME'])
  File "/project/path/lib/python2.7/site-packages/mongoengine/connection.py", line 162, in connect
    return get_connection(alias)
  File "/project/path/lib/python2.7/site-packages/mongoengine/connection.py", line 126, in get_connection
    raise ConnectionError("Cannot connect to database %s :\n%s" % (alias, e))
mongoengine.connection.ConnectionError: Cannot connect to database default :
call from same greenlet
```

ちょっと何言ってるかわかりませんね。
port 周りだの host がおかしいのかと色々勘ぐったものの
ふと実装を以下のように変更してみたら動いた次第。

```python:main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from shimehari import Shimehari


def connectDB():
    connect(config['DB_NAME'])

app = Shimehari(__name__)

if __name__ == '__main__':
    connectDB()
    #db に接続した後 import
    from meinheld import server, middleware
    server.listen(("0.0.0.0", 3000))
    server.run(middleware.WebSocketMiddleware(app))
```

ゴリゴリいじってるモヒカンな方々からすればあたりめーだろカス！なことなのかもしれませんが
ググったところで全然出て来なかったですし、
 WebSocket する時 node.js 使う方のほうが多いと思うのでそりゃそうだろうなぁと思いつつ、
とりあえずこれで動いたのでよしとしつつ、
`connecetDB` を `with` な感じに置き換えるとよりよいのでしょうかと。
RubyでTumblrのOAuth認証のアクセストークンを得る手順


前回、[RubyでTwitterのOAuth認証のアクセストークンを得る手順
](http://qiita.com/items/0088af5aec79b4b0008e)でTwitterでは無事OAuth成功したのだが、Tumblrで試したらできない、、、

と、思ったらできた。`https://api.tumblr.com`とすべきところを、`http://api.tumblr.com`にしてた…

    require 'oauth'
    require 'oauth/consumer'
    
    @consumer=OAuth::Consumer.new( "CONSUMER_KEYを記入","CONSUMER_SECRETを記入", {
        :site=>"https://api.tumblr.com"
        })
        
    @request_token=@consumer.get_request_token
    @request_token.authorize_url


で、表示されたURLにアクセスすると`oauth_verifier`がURLについてくるので控えておく。（これがPINか）

    @access_token = @request_token.get_access_token(:oauth_verifier => 'ここにoauth_verifierを記入')
    puts @access_token.token
    puts @access_token.secret

で、`ACCESS_TOKEN`と`ACCESS_SECRET`をそれぞれ控える。

以上！


続きはこれとかでもにょもにょ。
https://github.com/codingjester/tumblr_client
RubyでTwitterのOAuth認証のアクセストークンを得る手順


`oauth` gem を使ってサクッと。（…のはずがいろいろトラップあり…）
[Ruby OAuth GEM](http://oauth.rubyforge.org/)

[Developing OAuth clients in Ruby
](http://stakeventures.com/articles/2008/02/23/developing-oauth-clients-in-ruby)

けど、記事が古いためこのままではできなかったので、下記も参考にした。（TwitterのOAuth認証でPINが必要になったためだと思われる。たぶん。）
[10分でできるTwitter bot @ Ruby - 酒と泪とRubyとRailsと](http://morizyun.github.com/blog/twitter-bot-ruby-rails/)


# 下準備

	$ gem install oauth
	$ gem install pry

あと、Twitterでアプリ作って`CONSUMER_KEY`と`CONSUMER_SECRET`を控えておく。

# 実行

`pry`実行

	$ pry

で、以下ソースをコピペ
（もちろん`CONSUMER_KEY`と`CONSUMER_SECRET`を設定してから）
    
    require 'oauth'
    require 'oauth/consumer'
    
    @consumer=OAuth::Consumer.new( "CONSUMER_KEYを記入","CONSUMER_SECRETを記入", {
        :site=>"https://api.twitter.com"
        })
        
    @request_token=@consumer.get_request_token
    @request_token.authorize_url

で、表示されたURLにアクセスするとPINが発行されるので控えておく。

    @access_token = @request_token.get_access_token(:oauth_verifier => 'ここにPINを記入')
    puts @access_token.token
    puts @access_token.secret     

で、`ACCESS_TOKEN`と`ACCESS_SECRET`をそれぞれ控える。

で、これをtumblrでも試して見てるんだけどできないなぜ…

---

# 追記
と思ったらできた。。。。
[RubyでTumblrのOAuth認証のアクセストークンを得る手順](http://qiita.com/items/ede8f53e2484843da174)
Visual Studio2010以前でソリューション内のC#ファイルを再フォーマットする

こんなマクロでできたっぽい。
デザイナが生成したファイルは`.Designer.cs`で終わることを条件にして無視してます。
問題があるとしたら、2012からはマクロが消えたので使えない、というところですかね。
誰か拡張機能つくってくだしあ。

```vb
Imports System
Imports EnvDTE
Imports EnvDTE80

Public Module Module1
    Sub FormatAllLines(ByVal item As ProjectItem)
        Dim win As Window = item.Open()
        win.Activate()
        DTE.ExecuteCommand("Edit.FormatDocument")
        ' usingの整理もする場合は下の行を有効にしてね！
        ' DTE.ExecuteCommand("Edit.RemoveAndSort")
        item.Save()
        win.Close()
    End Sub

    Sub FormatProjectItems(ByVal items As ProjectItems)
        For Each item As ProjectItem In items
            If item.Name.EndsWith(".cs") AndAlso Not item.Name.EndsWith(".Designer.cs") Then
                FormatAllLines(item)
            End If

            If Not IsNothing(item.ProjectItems) Then
                FormatProjectItems(item.ProjectItems)
            End If
        Next
    End Sub

    Sub FormatAllProjectItem(ByVal proj As Project)
        If proj.Kind = ProjectKinds.vsProjectKindSolutionFolder Then
            For Each pitem In proj.ProjectItems
                FormatAllProjectItem(CType(pitem.Object, Project))
            Next
        Else
            FormatProjectItems(proj.ProjectItems)
        End If
    End Sub

    Sub TemporaryMacro()
        For Each proj In DTE.Solution.Projects
            FormatAllProjectItem(proj)
        Next
    End Sub
End Module
```
.orgをシェルからHTML出力

Emacsのorg-modeのファイルをHTMLに出力したい。けど、ちょうどEmacsを起動してなかった...て時のため。
`--batch`なんて滅多に使わないからメモメモ

対象ファイルはagenda.org

```sh
emacs --batch --visit='agenda.org' --funcall 'org-export-as-html-batch'
```

~/public_html/においてcgiとかにするなら、

```tcsh:agenda.cgi
#!/bin/tcsh
cd ~/.org/
emacs --batch --visit='agenda.org' --funcall 'org-export-as-html-batch' >& /dev/null
echo "Content-type: text/html"
echo ""

cat agenda.html
```
といった感じ?

org-captureしたはいいけどhtmlに出力するの忘れてた...ってときがよくあったので。
いや、org-captureしたときにフックしろよって言われればそれまでですが...
iPhone,iPadのアイコンなどのサイズ


いろいろなアイコン画像のサイズ。画像ファイルはInfo.plistで指定。


## アイコンサイズ

|ファイル名|サイズ|説明|
|-----|-----|-----|
| Icon.png | 57 x 57 | iPhone/iPod touch (3/3G/3GS)|
|Icon@2x.png	|114 x 114|	Retina用 iPhone/iPod touch|
|Icon-72.png	|72 x 72	| iPad|
|Icon-72@2x.png|	144 x 144|	Retina用 iPad|
|Icon-Small.png|	29 x 29	| iPhone/iPod touch Spotlight and Settings |
|Icon-Small@2x.png	|58 x 58	|Retina用 iPhone/iPod touch Spotlight and Settings |
|Icon-Small-50.png	|50 x 50	|iPad Spotlight and Settings |
|Icon-Small-50@2x.png|	100 x 100|	Retina用 iPad Spotlight and Settings |
|iTunesArtwork	|1024 x 1024	| Ad Hoc, iTunes用 1024×1024推奨(PNG)|

## スプラッシュ画像サイズ
|ファイル名	|サイズ|	説明|
|-----|-----|-----|
|Default.png	|320 x 480	|iPhone/iPod touch (3/3G/3GS)|
|Default@2x.png	|640 x 960	|Retina用 iPhone/iPod touch|
|Default-568h@2x.png	|640 x 1136|iPhone 5/iPod touch (4inch)|
|Default-Portrait.png	|768 x 1004|iPad (portrait)用 ステータスバー（20px）を除いたサイズ|
|Default-Portrait@2x.png|	1536 x 2008|Retina用 iPad (portrait)用 ステータスバー（40px）を除いたサイズ|
|Default-Landscape.png	|1024 x 748	|iPad (landscape)用 ステータスバー（20px）を除いたサイズ|
|Default-Landscape@2x.png	|2048 x 1496|	Retina iPad (landscape)用 ステータスバー（40px）を除いたサイズ|

※iPadのスプラッシュ画像の場合は、ファイル名に以下のオプションも可能

* -PortraitUpsideDown
* -LandscapeLeft
* -LandscapeRight

## ナビゲーションバー、ツールバー、タブバーアイコン画像サイズ
|サイズ|	説明|
|-----|-----------|
|20 x 20	|NavigationBar,ToolBar用　アイコンサイズ|
|40 x 40|Retina用 NavigationBar,ToolBar アイコンサイズ (ファイル名に @2xを付与)|
|30 x 30|TabBar用 アイコンサイズ|
|60 x 60|Retina用 TabBarアイコンサイズ (ファイル名に @2xを付与)|


## 参考
iOS Human Interface Guidelines: Custom Icon and Image Creation Guidelines http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/IconsImages/IconsImages.html

iOS App Programming Guide: App-Related Resources http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/App-RelatedResources/App-RelatedResources.html#//apple_ref/doc/uid/TP40007072-CH6-SW1

IconKit
https://itunes.apple.com/jp/app/iconkit/id507135296?mt=12

Status Barred
https://itunes.apple.com/jp/app/status-barred/id413853485?mt=12
YAML や JSON のような構造のオブジェクトに対して再帰的に処理を加えるイディオム


YAML や JSON で表現されるような、スカラー値、Array、Hash で構成されたオブジェクトについて、再帰的に処理をする際、下記のようなイディオムが使える。

```ruby
def foo(obj)
  case obj
  when Array
    obj.map{|e| foo(e)} # Array の要素を再帰的に処理
  when Hash
    obj.inject({}) do |hash, (k, v)|
      hash[k] = foo(v) # Hash の値を再帰的に処理
      hash
    end
  else
    obj
  end
end
```

# 例. Hash のキーを to_s する

```ruby
def stringify_keys(obj)
  case obj
  when Array
    obj.map{|e| stringify_keys(e)}
  when Hash
    obj.inject({}) do |hash, (k, v)|
      # ここが変わる
      hash[k.to_s] = stringify_keys(v)
      hash
    end
  else
    obj
  end
end
```


```ruby
stringify_keys({a: 1, b: [{c: 3}]}) #=> {"a"=>1, "b"=>[{"c"=>3}]}
```

# 例. スカラー値を to_s する

```ruby
def stringify_values(obj)
  case obj
  when Array
    obj.map{|e| stringify_values(e)}
  when Hash
    obj.inject({}) do |hash, (k, v)|
      hash[k] = stringify_values(v)
      hash
    end
  else
    # ここが変わる
    obj.to_s
  end
end
```

```ruby
stringify_values({a: 1, b: [{c: 3}]}) #=> {:a=>"1", :b=>[{:c=>"3"}]}
```

# 例. Array を、インデックスをキーとする Hash に置き換える

```ruby
def hash_arrays(obj)
  case obj
  when Array
    # ここが変わる
    Hash[
      obj.each_with_index.map do |e, i|
        [i, hash_arrays(e)]
      end
    ]
  when Hash
    obj.inject({}) do |hash, (k, v)|
      hash[k] = hash_arrays(v)
      hash
    end
  else
    obj
  end
end
```

```ruby
hash_arrays({a: 1, b: [{c: 3}]}) #=> {:a=>1, :b=>{0=>{:c=>3}}}
```
AnyEvent::Twitter::Stream の API version 1.1

AnyEvent::Twitter::Stream の本家は1年以上更新されておらず API バージョン 1.0 のままですが、 https://github.com/seomoz/AnyEvent-Twitter-Stream/blob/marc/sitestream/lib/AnyEvent/Twitter/Stream.pm は API バージョン 1.1 です。本家にない機能も追加されているようです。
wordpress on herokuで画像が消える問題への対応

## wordpress on heroku 

インストール方法はこちらを参照してください
https://github.com/mhoofman/wordpress-heroku

## 画像が消えた件

導入して暫くたってみたらブログの画像が全て消えてしまっていました。
どうやらherokuスピンダウンして再デプロイした時にローカルに保存していた画像が消えていたらしいです。

## S3にアップロードして対策

解決方法としてS3に上げればいいんじゃない？って事で色々調べてみると上記ソース内にpluginが既に入っているので有効化してあげればいいようです。


+ wordpress上のpluginsのところからでWP Read-Onlyのプラグインをactivate
+ wordpress上のsettingsのところからWPRO Settingsを選択
+ AWSから取得したAWS Key、AWS SecretとS3で作ったBucketを入力

これでS3に画像をアップロードできるようになるので画像が消える心配がなくなりますね。

## 参考

ちなみにこちらで導入されたようです。
https://github.com/mhoofman/wordpress-heroku/issues/23

こちらの方と同じく僕もtantan-s3-cloudfrontを導入して対策しようとしたらエラーになったので既にWPROを使った方が良いですね。
Sinatraの使い方あれこれ

# Sinatraの使い方あれこれ

## 異なるルートで同じ対応をしたい

DRYを実践したい

```ruby
require 'sinatra'

['/one', '/two', '/three'].each do |route|
    get rounte do
        "Triggered #{route} via GET"
    end
    post route do
        "Triggered #{route} via POST"
    end
end
```

## RESTリクエストのパラメータを受け取りたい

例えばこんなリクエスト

`http://my.server.address/function?key1=value1&key2=value2&key3=value3`
	
こんなふうに受けることができる

```ruby
require 'sinatra'
	
get '/function' do
    params['key1']
    params['key2']
    params['key3']
end
```

## 正規表現を用いたルート

```ruby
require 'sinatra'

get %r{/\A((?:sp|gr)eedy)\z} do |c|
    "You got cought in the #{c} route!"
end
```
	
## 別のルートへリダイレクトする


```ruby
require 'sinatra'

get '/redirect' do
    redirect 'http://www.google.com'
end

get '/redirect2' do
    redirect 'http://www.google.com', 301
end
```

ステータスコード`301`は「Moved Permanently」
デフォルトは`302`の「Temporary redirection」

## 静的なファイルを見せる

```ruby
require 'sinatra'

get '/public.html' do
end
```

`public`フォルダが使われる。例えば`public`フォルダの中に`javascrpts`フォルダがあるとすると、`http://localhost:4567/javascripts`でアクセスできる。

## Erbファイルを見せる

まず`views`フォルダを作る。

```ruby
require 'sinatra'

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

## Erbファイルに変数を渡す

```ruby
require '/home' do
    @name = 'Random User'
    erb :home
end
```

インスタンス変数にアクセスする。

```html+erb:home.erb
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Using variables</title>
</head>
<body>
  <h1>Hello, <%= @name %>!</h1>
</body>
</html>
```

評価したい文は`<%= %>`タグで囲む。ループによる制御構造などは`<% %>`で囲む。

## 事前・事後に処理したいことがあるとき

```ruby
require 'sinatra'

before do
    @before_value = 'foo'
end

get '/' do
    "before_value has been set to #{@before_value}"
end

after do
    puts "After Filter called to perform some task"
end
```

"After Filter called to perform some task" はターミナルに出力される

## 404 Not Foundのカスタマイズ

```ruby
require 'sinatra'

before do
    content_type :txt
end

not_found do
    "Whoops! You requested a route that wasn't available."
end
```

## 500 Internal Server Errorのカスタマイズ

```ruby
require 'sinatra'

...

error do
    "Y U NO WORK?"
end
```

## Session管理

```ruby
require 'sinatra'

configure do
    enable :sessions
end

before do
    content_type :txt
end

get '/set' do
    session[:foo] = Time.now
    "Session value set."
end

get '/fetch' do
    "Session value: #{session[:foo]}"
end
```

セッションをクリアするには

```ruby
get '/logout' do
    session.clear
    redirect 'fetch'
end
```

## Cookieの利用

```ruby
require 'sinatra'

get '/' do
    response.set_cookie "foo", "bar"
    "Cookie set. Would you like to <a href=\"/read\">read it</a>?"
end

get '/read'
    "Cookie has a value of: #{request.cookies['foo']}."
end

get '/delete'
    response.delete_cookie "foo"
    "Cookie has been deleted."
end
```

## ファイル添付

```ruby
require 'sinatra'

before do
    content_type :txt
end

get '/attachment' do
    attachment 'name_your_attachment.txt'
    "Here's what will be sent downstream, in an attachment called 'name_your_attachment.txt'."
end
```

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
GitHub Pagesの開設のしかた（2012年9月版）

##start GitHub Pages at September 2012

##GitHub Pagesの開設のしかた（2012年9月版）

###English

1. create repository named `username.github.com`.
2. enter the repository you created.
3. click 'admin'

	![](http://farm9.staticflickr.com/8296/7920544334_1298170a73.jpg)

4. scroll downwards

	![](http://farm9.staticflickr.com/8448/7920552600_7bfcbf5e93.jpg)

5. click 'Automatic Page Generator'

	![](http://farm9.staticflickr.com/8033/7920558596_862315d395.jpg)

6. Wait minutes and you see the site.

###日本語

1. `username.github.com`という名前のリポジトリをつくる
2. つくったリポジトリに入る
3. 「Admin」をクリック

	![](http://farm9.staticflickr.com/8296/7920544334_1298170a73.jpg)

4. 下にスクロール

	![](http://farm9.staticflickr.com/8448/7920552600_7bfcbf5e93.jpg)

5. 「Automatic Page Generator」をクリック

	![](http://farm9.staticflickr.com/8033/7920558596_862315d395.jpg)

6. しばらく待つとできる


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
GitHub Pagesの開設のしかた Jekyll-Bootstrap編（2012年9月版、なるべく「GitHub for Mac」を使う）

Jekyll-BootstrapはJekyllサイトを簡単にブログ化してくれるパッケージです。Jekyllだけで一から作るより手軽そうなのが特徴。

1. `USERNAME.github.com`という名前のリポジトリをGitHubにつくる（空のままで良い）
2. _GitHub for Mac_で**Jekyll-Bootstrap**を**ローカルの**`USERNAME.github.com`というフォルダにcloneする
3. `.git/config`を編集する

		[remote "origin"]
			fetch = +refs/heads/*:refs/remotes/origin/*
			url = git@github.com:USERNAME/USERNAME.github.com.git

	これで、先ほど作った空のリポジトリに`USERNAME.github.com`フォルダの中身をPushできる。
4. _GitHub for Mac_でPublishする
3. しばらく待つとサイトができるので、`http://USERNAME.github.com`をブラウザで開いて確認する
4. 次に`_config.yml`を編集して名前やらメールアドレスやらTwitterアカウントを編集する
5. _GitHub for Mac_でCommit & Syncする
6. 記事を書いてみる。記事名にはマルチバイト文字も使えるが、スペースを混ぜるのはダメ。

		$ vim _post/2012-03-22-installed-jekyll-bootstrap.md

5. _GitHub for Mac_でCommit & Syncする


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
gemspec と Gemfile と Gemfile.lock との違い．

Ruby で gem 管理に使われる Bundler. その Bundler で依存関係を解決するために使われるファイルには，

+ gemspec
+ Gemfile
+ Gemfile.lock

の 3 つがあります．これら 3 つのファイルの区別を意識することはあまりありませんが，それぞれ異なる役割を担っています．

# 3 つのファイルの役割

各ファイルの役割を簡単にまとめます．

## gemspec

+ gem の依存関係を記述します．

## Gemfile

+ 依存する gem の取得先を記述します．
  - 通常は取得先は `source` 行一行だけでよいはず．
  - GitHub リポジトリなどから edge バージョンを取得する場合は，その場所をここに書く．

## Gemfile.lock

+ 開発環境と運用環境とで同じ gem をインストールするために使います．
  - `bundle` などで自動で生成されます．
  - 依存 gem のバージョンと取得先が記録されます．

# Gemfile.lock の扱いについて

Gemfile.lock については，これをリポジトリに含めるかどうかが議論されるのですが，前節で述べたように，「開発環境と運用環境とで同じ gem をインストール」したいかどうかで決めればよいかと思います．すなわち，

+ 確実動作が期待されるアプリでは Gemfile.lock をリポジトリに含める．
+ デプロイの自由度を確保したいライブラリは Gemfile.lock をリポジトリに含めない．
+ （そうでないものは，開発環境=運用環境としたい気持ちの強さでどちらかに倒す）

とするのがよいでしょう．

# 参考

+ http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/
  - この記事は↑を読んで考えたことをまとめたものです．
  - 元記事と異なる主張があるかもしれません．
Rubyのrssライブラリをのぞいてみる

## RSS::Makerクラス
### rss/Maker/base.rb
#### class Base
- new_itemメソッド

	`@items << item`

#### class RSSBase < Base
##### クラスメソッド
- make(*args, &block)メソッド

	`new(*args).make(&block)`
	
	下のinitializeメソッドとmakeメソッドを呼んでいる
	
		feed= RSS::Maker.make("2.0") do |feed|
	
	のように使う

##### インスタンスメソッド
- initialize(feed_version)メソッド
- makeメソッド

		yield(self)
		to_feed

#### class ChannelBase < Base

新しいフィードを作る際に、以下のように使う

    feed.channel.about = about
    feed.channel.title = title
    feed.channel.description = description
    feed.channel.link = link
    feed.channel.language = language

- aboutメソッド

	`attr_accessor about`

- titleメソッド
	
	    def title=(new_value)
    	  @title.content = new_value
    	end
	
- descriptionメソッド

	    def description=(new_value)
    	  @description.content = new_value
    	end

- dateメソッド

	`attr_accessor date`
	
- languageメソッド

	`attr_accessor language`
	
#### class ItemsBase < Base

新しいフィードを作る際に、以下のように使う

    items.each do |feed_item|
      i= output_feed.items.new_item
      i.title       = item.title
      i.link        = item.link
      i.description = item.description
      i.date        = item.date
    end

- do_sortメソッド, max_sizeメソッド

	`attr_accessor :do_sort, :max_size`

## RSS::Parserクラス
### rss/parser.rb
#### class Parser
##### クラスメソッド

- parse(rss, do_validate=true, ignore_unknow_element=true)メソッド

    parser = new(rss, default_parser)
    parser.do_validate = do_validate
    parser.ignore_unknown_element = ignore_unknown_element
    parser.parse

以下のように使う
	
    feed = Net::HTTP.get(host, path).force_encoding('utf-8')
    begin
      @feed = RSS::Parser.parse(feed)
    rescue RSS::InvalidRSSError
      @feed = RSS::Parser.parse(feed, false )
    end


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
CoffeeScript開発環境構築メモ


Mountain LionにCoffeeScriptの環境を構築したのでメモしておきます。

##インストール

##### node.jsのインストール

```
brew install node.js
```

##### 確認
```
node -v
v0.8.15
```

##### npmのインストール

```
curl https://npmjs.org/install.sh | sudo sh
```

##### CoffeeScriptのインストール

```
sudo npm install -g coffee-script
```

##### 確認
```
coffee -v
CoffeeScript version 1.4.0
```

## 動作テスト

###### テストディレクトリの作成

```
cd ~/
mkdir js_dir (JavaScript格納ディレクトリ）
mkdir coffee_dir (CoffeeScript格納ディレクトリ）
ディレクトリは適宜移動します。
```

###### sample.coffeeの作成

下記の内容を追加

```
helloworld = 
-> console.log "hello world"

helloworld()
```
###### 実行

```
coffee sample.coffee
helloworld

```

###### JavaScriptへのコンパイル

```
coffee -o <出力先ディレクトリ> -c <ソースディレクトリ>
coffee -o js_dir/ -c coffee_dir/
```
###### 内容の確認

```
/ Generated by CoffeeScript 1.4.0
(function() {
  var helloworld;

  helloworld = function() {
    return console.log("hello world");
  };

  helloworld();

}).call(this);
```




## 参考URL
- http://straitwalk.hatenablog.com/entry/20130115/1358257362
- http://gihyo.jp/dev/serial/01/nodejs
- http://www.slideshare.net/mryoshio/coffeescript-14163365
CoronaSDKで空のグループにx/yScaleを設定すると表示されない

タイトル通り。現在のstable (2012.971)にて確認。

何も入れないグループを作って

``` lua:set_scale.lua
group.xScale = 0.7
```

等で設定してから

``` lua:insert_child.lua
group:insert(hogeText)
```

のように入れても表示されません。
groupのx座標に-9.xxxxxe18とかあったので遥か彼方に行ってしまうようです。

ダミーで何でも良いから表示されない要素つっこんでおけば回避できるようです。汚いコードですが…

ご注意を。


### 追記 

http://docs.coronalabs.com/api/library/display/newGroup.html

の公式ドキュメントに記載されているバグでした。ドキュメント詳細に書いてるのはありがたいですが、ダミー入れるぐらいで回避できるような現象なら暫定修正でもして欲しいもんです…
grepの出力をパイプで繋いだときにリアルタイムで出す

grepをパイプで繋ぐとバッファに保存されて、リアルタイムに出ないので、--line-bufferedってのを使います

```
tail -f /var/log/httpd/access_log | grep --line-buffered "error" | grep --line-buffered 'HTTP/1.1\" 50'
```
"Cannot run on the selected destination"と出てiOS Simulatorが起動しない

>Cannot run on the selected destination
>
>The selected destination does not support the architecture for which the selected software is built.  Switch to a destination that supports that architecture in order to run the selected software.

いろいろ原因はあるっぽいんだけどハマりやすいパターンとして"Info.plist"ファイルがプロジェクト内に存在するっていうのがあるみたい。
"Info.plist"は今でいうXcodeによってデフォルトで作成されるMyApp-Info.plistが以前は"Info.plist"という名前固定だったからなんだけど古いプロジェクトとかからソースを以降する時にインポートされてしまう、などがありそう。

![](http://gyazo.com/552597ed5b74bc7941522ef81a0ea67d.png)

[iphone - Xcode cannot run using the selected device (Weird error) - Stack Overflow](http://stackoverflow.com/questions/11934352/xcode-cannot-run-using-the-selected-device-weird-error/11936610#11936610 "iphone - Xcode cannot run using the selected device (Weird error) - Stack Overflow")
第7回オフラインリアルタイムどう書く。Haskell による実装。

問題は http://nabetani.sakura.ne.jp/hena/ord7selectchair/
解答リンク集は http://qiita.com/items/4364285801d1c9f370a1


面白そうな問題だったので、Haskell で実装してみました。
座席の両端に座れない空席を置いて判定を単純化してみようと頑張ってみまし
た。


```off-line07.hs
import Data.Char
import System.Environment

main :: IO ()
main = do arg <- getArgs
          let (n, str) = getData (arg !! 0)
          print $ solve n str

getData :: String -> (Int, String)
getData cs = (read a, tail b)
  where (a, b) = break (== ':') cs

solve :: Int -> String -> String
solve n cs = init $ tail $ foldl f (replicate (n + 2) '-') cs
  where f seat c = if (isUpper c) then sit c seat else rm (toUpper c) seat

sit :: Char -> String -> String
sit c cs = as ++ (c : bs)
  where
    (as, _ : bs) = splitAt (search cs) cs
    search cs@(_ : cs')
      | take 2 cs == "--" = search' 0 ( 1, -1) cs
      | otherwise         = search' 1 (-1, -1) cs'
    -- search' c (i1, i2) cs
    --  c : index counter
    --  i1, i2 : 「条件 2」と「条件 3」に適合する index
    search' _ (i1, i2) "-" = if i1 < 0 then i2 else i1
    search' c (i1, i2) cs@(s : cs')
      | take 3 cs == "---"              = c + 1
      | (i1 < 0) && (take 2 cs == "--") = search' (c + 1) ( c, i2) cs'
      | (i2 < 0) && (s == '-')          = search' (c + 1) (i1,  c) cs'
      | otherwise                       = search' (c + 1) (i1, i2) cs'

rm :: Char -> String -> String
rm c cs = as ++ ('-' : bs)
  where (as, _ : bs) = break (== c) cs
```
msgpack を ajax で flask(werkzeug) な環境に送る

js でクライアント側からも msgpack なデータを werkzeug な環境に
以下のようにして送りますた。

##クライアント側
```coffeescript:ninja.coffee
sendMsgPack:(event)=>
  event.preventDefault()
  arr = $('#hogehogeForm').serializeArray()
  data = msgpack.pack(arr)
  arrayBinary = new Uint8Array(data)
  xhr = new XMLHttpRequest()
  xhr.open('POST', '/api/url', true)
  xhr.onreadystatechange = ()->
  if xhr.readyState is 4 and xhr.status is 200
      console.log xhr.responseText
  else if xhr.readyState is 4 and xhr.status isnt 200
      console.log xhr, "hogehoge"
  xhr.setRequestHeader('Content-Type', 'application/x-msgpack; charset=x-user-defined')
  xhr.send(arrayBinary.buffer)
```

##サーバー側
```python:tasukete.py
import msgpack
from shimehari import Response, ApplicationController, request
import msgpack

class FooController(ApplicationController):
    def __init__(self, name):
        ApplicationController.__init__(self, name)

    def index(self, *args, **kwargs):
        return 'hidebu'

    def create(self, *args, **kwargs):
        #ほんとはちゃんとヘッダ見ようね
        print msgpack.unpackb(request.data)
        return Response('aaa')
```

```
$ ({'name': 'name', 'value': 'aaaaa'},)
```

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

msgpack.js には `msgpack.upload` というメソッドが用意されているようなのですが
メソッドが PUT になっていたり、リクエストヘッダの Content-Type が `application/x-www-form-urlencoded` になっていたりして、
僕にははかりしれない何かを感じたのでとりあえず生の XMLHttpRequest を使った次第です。
jQuery.ajax だと ArrayBuffer が送れないのでだめぽです。

Content-Type を `x-www-form-urlencoded` にすると、送信したデータが werkzeug の `Request.data` ではなく、 `Request.form` に入ってしまうのがなんとなくこれじゃない感があったのでなんとかかんとかした次第です。

ここまでやっといて実際は WebSocket で送ることにした次第であります。
まぁ WebSocket 使えない状況のほうが多い気がするのでもうちょい便利にブラッシュアップすれば使い物になるんではないでしょうか。

っていうか突っ込みどころは多いと思うので詳しい人がいたら教えて下さい。
最後のコマンドライン引数を取得する

（コメント反映させました。ありがとうございました！）
シェルスクリプトでコマンドライン引数を取得するには

```bash:last_arg.sh
#!/bin/bash

echo "Number of arg: $#"
echo "Last arg: ${@:$#:1}"
# POSIX shやkshの場合は以下
# echo "Last arg: $(eval echo '$'{$#})" 
```

実行例

```
$ ./last_arg.sh  a1 b2 c3 d4 e5
Number of arg: 5
Last arg: e5

$ ./last_arg.sh  a1 b2 c3 d4 e5 f6 g7 h8 i9 j10 k11
Number of arg: 11
Last arg: k11
```
evalを使う方は、引数なしで実行した場合$0を参照することになるので必要なら判定した方がいいです。
Bitmapのサイズをメモリ上に展開せずに知る

**BitmapFactory.OptionsのinJustDecodeBoundsにtrueを指定してやる。**
- outWidth(横幅)、outHeight(縦幅)、outMimeType(MIMEタイプ)などがとれる。
- http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

```java:sample.java
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), resourceId, options); 
Log.d(TAG, "width:" + options.outWidth + ", height:" + options.outHeight);
```
外部リポジトリの追加（remi,epel）

最新のPHPを入れたい場合は大体この２つはyumのレポジトリが必要なのでメモ

環境
virtualbox centOS6.3(x86)

epel

```
#先にepelから入れないとremiの依存性でエラーになるので注意
rpm --import wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6 
vim /etc/yum.repos.d/epel.repo
```

epelの設定を新規で追加する

```sh:/etc/yum.repos.d/epel.repo
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/
gpgcheck=1
enabled=0
```

epelを使ってインストールできるか確認する

```
yum --enablerepo=epel install php
#インストールする必要がない場合はNで抜ける
```

remi

```
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
vim /etc/yum.repos.d/remi.repo
```

remiの設定を新規で追加する

```sh:/etc/yum.repos.d/remi.repo
[remi]
name=Les RPM de remi pour Enterprise Linux 5 - $basearch
baseurl=http://rpms.famillecollet.com/el5.$basearch/
http://iut-info.univ-reims.fr/remirpms/el5.$basearch/
enabled=0
priority=1
```

yumでインストールできる確認する

```
yum --enablerepo=remi install php
#インストールする必要がない場合はNで抜ける
```

以上
CentOS 5で ionice -c3 を一般ユーザーで実行する


2.6.25より古いカーネルを採用しているCentOS 5などのディストリビューションでは、一般ユーザーでは ionice -c3 でジョブのIOのscheduling classをidleに設定できない。以下のようなエラーが表示される。

```
ioprio_set: Operation not permitted
```

この問題は、/etc/sudoersに設定を追加した上で、 sudo ionice -c3 のようにして実行すれば解決する。

## 設定

visudo を実行して /etc/sudoers に以下の内容を追加する。以下は amandabackup というユーザーがパスワード無しで sudo ionice -c3 を実行できるようにする例。 

```
Defaults:amandabackup !requiretty
amandabackup ALL=NOPASSWD: /usr/bin/ionice
```

!requiretty は、ssh経由でコマンドを実行するときなどに必要。以下のようなエラーでsudoがうまくいかない場合に追加する。

```
sudo: sorry, you must have a tty to run sudo
```

## 実行例

```
sudo /usr/bin/ionice -c3 コマンド
```
Herokuへのデプロイ時は常にproduction.rbの設定値でassets precompileされる


## コンテキスト
HerokuでRailsアプリケーションを運用する際は、本番環境とは別にステージング環境を用意することがよくあります。

ステージング環境では通常、Heroku上の`RACK_ENV`や`RAILS_ENV`といった環境変数を`staging`にします。

これらの環境変数が`staging`になっていると、`config/environments/staging.rb`の設定値を読み込んでアプリケーションが起動します。

## 問題
ただし、assets(CSSやJavaScript等)のprecompile時は必ずしも`staging.rb`が読み込まれるわけではないので注意が必要です。

たとえば、`application.css`とは別に`awesome.css`をprecompileしたい場合は以下のような指定が必要になります。

````ruby
config.assets.precompile += %w( awesome.css )
````

通常こうした設定値は`staging.rb`または`production.rb`に設定しますが、[heroku_san](https://github.com/fastestforward/heroku_san)や`git push`でステージング環境にソースコードをデプロイするときは`staging.rb`ではなく、`production.rb`を読み込んでassets precompileされます。


`staging.rb`と`production.rb`を同時に変更している場合は、あたかも`staging.rb`が読み込まれているように錯覚してしまいますが、先に`staging.rb`だけを更新してHerokuにデプロイしたりすると、`awesome.css`がprecompileされないため、以下のようなエラーが発生します。

````
ActionView::Template::Error (awesome.css isn't precompiled): 
````

ステージング環境のエラーだから`staging.rb`に問題があるのだろうと思い込んでると、永遠に解決しないので要注意です。

## 対応策
### 1. production.rbにassets precompile関係の設定を書く
assets precompile関係の設定値が本番環境とステージング環境で変わらないのであれば、常に`production.rb`に設定値を書いておくという解決策が選択できます。
変わったことをしないのであれば、これが一番手軽かもしれません。

### 2. デプロイ後に別途assets precompileを実行する
本番環境とステージング環境で設定を変える必要があるなら、コードのデプロイ後に[heroku](https://github.com/heroku/heroku)Gemを使ってassets precompileを実行しましょう。
こうすると`staging.rb`の設定値を使ってassets precompileしてくれます。

````
$ heroku run rake assets:precompile --app your-app-staging
````

### 3. user_env_compileプラグインを導入する
別途assets precompileを実行するやり方だと、ついassets precompileを忘れてしまう恐れがあります。毎回デプロイと同時に実行する方法はないでしょうか？
`user_env_compile`というHerokuのプラグインを導入すると、デプロイ時に`staging.rb`の設定値を使ってassets precompileするようになります。
ただし、このプラグインは実験的なプラグインなので「予告なく削除されるかもしれない」という警告が出ます。
その点に留意した上で使用してください。

https://devcenter.heroku.com/articles/labs-user-env-compile


## 備考
ローカル環境で`rake assets:precompile`を呼び出した場合も`production.rb`が読み込まれます。`development.rb`ではありません。
もし`development.rb`を使いたいのであれば、下のように`RAILS_ENV`オプションをつけると`development.rb`を読み込ませることができます。

````
$ rake assets:precompile RAILS_ENV=development
````

## 参考サイト
- http://www.johnplummer.com/tools/heroku-precompiling-assets-enviroment-variables.html
- http://stackoverflow.com/questions/9830244/heroku-always-runs-assetsprecompile-with-the-production-environment-for-rails-3
rvm がインストールされている環境で bundler をインストールしてるのに Gem bundler is not installed, run `gem install bundler` first. と言われる

[ERROR: Gem bundler is not installed, run \`gem install bundler\` first. · Issue #1043 · wayneeseguin/rvm](https://github.com/wayneeseguin/rvm/issues/1043)

上記Issueに記述されているのと同じ状況だったので、以下の手順で解決した。

- すべてのgemをアンインストール
- ~/.gemrc を開き、`- "gem" => "-n/usr/local/bin"` を削除
ちょっとまて　軽い気持ちのuint

ActionScript3で便利なuint型。どうせ負の値にならないんだからという理由で、for文のiカウンターやArrayのインデックスなんかに使っていませんか？
**あなたのそのuintが狙われています！**
軽い気持ちでuintを使う前にまずはご確認を！

そもそも[アドビのActionScriptコーディング規約](http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions)でも

> たとえ負の数にはならない場合であっても、整数には int を使います。uint は RGB の色指定、ビットマスク、その他の数値でない値にのみ使用します。

と書いてます。
うん、リンク先消えてた。
なので[trick7さんが訳してくださったほう](http://www.trick7.com/blog/2008/03/14-131809.php)を引用しています。

ちょっと試してみます。

```actionscript3
var u:uint = 0;
trace(--u);	//-1
trace(u);	//4294967295
```
あ、あかんやつや。

```actionscript3
var u:uint = 0;
while(--u < 0){
	trace(u)
}
//4294967295
```
もうだめや。

uintが一瞬だけ負の値になるのが確認できます。
これビットで考えないとややこしいのですが、
int型で '00000000000000000000000000000000'（数字が32個）がゼロで
uint型でも '00000000000000000000000000000000'はゼロなわけです。

数字の1は
'00000000000000000000000000000001'
2は
'00000000000000000000000000000010'
3は
'00000000000000000000000000000011'
どんどん増えていって
'01111111111111111111111111111111'（一番上の位が0だけどそれ以外は全部1）
のとき10進数は2147483647になります。

ここまではuintもintも同じなのですが、ここから先はintでは負の数字の世界に入ります。

uintでは
'10000000000000000000000000000000'は
2147483648とマイナスが付かずそのまま数が増えていきます。
どんどん足していって、
'11111111111111111111111111111111'で
4294967295
さたに1足せば
'00000000000000000000000000000000'になって0に循環します。

しかしながらintでは'10000000000000000000000000000000'から負の世界にいくので
-2147483648
となって、そこからどんどん足していって
'11111111111111111111111111111111'
で-1。
さらに1足すと
'00000000000000000000000000000000'になって0となるわけですね。

で、ちょっとやっかいなのがuintの
'10000000000000000000000000000000'
から
'11111111111111111111111111111111'
までの数字。つまりintでいう負の値の世界。

uint型でゼロから-1すると'11111111111111111111111111111111'になるのですが、これが一瞬だけint型で言う-1と解釈されてしまうわけです。

これを回避するためには

```actionscript3
if(--u === int(0xFFFFFFFF))
```
こんな感じでビットを意識して使わないといけないわけです。
僕はビット演算苦手なのでもっといい方法あるかもしれないですが、とにかく何かしら処理を考えないといけないよという。

で、最初に戻りますがたぶんuintをそこまで考えて使ってないのがほとんどだと思います。
プログラム中ゼロになることがないんだからuint使ったれ、くらいの気持ちで。

プログラム実行中に負の値になったらランタイムエラーでも出てくれればまだいいんですけど、実際は負の値になったとき、使ったプログラマの意図とはたぶん真逆の反応をするわけですね。
なので、特にカウンターなど1足したり引いたりする値にはuintは使わないようにするのが吉かと思います。
Array.lengthなど、もとからuint型が返ってくるやつとか格納するのにint型では、もし値が2147483647を超えたらどうなるのか不安かもしれないですが、値が20億超えることよりは-1を下回るほうがよくあることなので、特にです。

そんなことを思いながら酒を飲んでました。
UTF-8のエンコードとデコード

間違いがありましたら、教えていただけると嬉しいです。

```js
function encode(string, encoding) {
    encoding = encoding || "UTF-8";
    if(typeof Buffer === "function") {
        return new Buffer(string, encoding);
    } else {
        var bytes = [];
        var cs = encodeURI(string).match(/(?:%[0-9A-F]{2})|./g);
        for(var i = 0, len = cs.length; i < len; i++) {
            if(cs[i].length === 3) {
                bytes.push(parseInt(cs[i].slice(1), 16));
            } else {
                bytes.push(cs[i].charCodeAt(0));
            }
        }
        return bytes;
    }
}

function decode(bytes, encoding) {
    encoding = encoding || "UTF-8";
    if(typeof Buffer === "function") {
        return bytes.toString(encoding);
    } else {
        var encoded = "";
        for(var i = 0, len = bytes.length; i < len; i++) {
            encoded += "%" + bytes[i].toString(16);
        }
        return decodeURIComponent(encoded);
    }
}
```
MINIDOMがアトリビュートを勝手にソートしてしまう件

PYTHONでＭＩＮＩＤＯＭをつかってＸＭＬファイルを作成したところ、
１つのノードに複数のアトリビュートがある場合、その並びがデータ入力順にならず、
勝手にソートされてしまった。
帳簿データで、左から日時->適用->金額->伝票Ｎｏ.な並びで作成していたのだが、
この並びを変えられてしまうとすごく見づらい。
処理プログラムができてしまえば生のxmlデータを見ることはないかもしれないが、
これななかなか見づらい。
なので一応minidom.pyのソースを眺めてみた。
toprettyxml（）というすごく便利な関数で出力していたのだが、この関数から呼ばれる
Elementクラスのwritexml（）内で
a_names.sort()
とソートしている箇所があった？？
なので、Myminidom.pyとして、この一行をコメントオフしてみたのだが、、、、
なぜか改善せず。
出力時ではなく、アトリビュート入力時に並びがかわっているのかぁぁぁ？？？
とあきらめかけていたところ、下の記事が。
↓↓↓
http://ja.softuses.com/29332

上記の修正に加えて、Elementクラスの__init__()関数内で
self._attrs = OrderedDict()
#self._attrs = {} # attributes are double-indexed:
の修正を行い、ファイル先頭あたりに
from collections import OrderedDict
のインポート文を追加する。
おぉ！これで入力順にアトリビュートの並びが保持され
toprettyxml()から出力されました！！
opensource恐るべしですな。
Bridged Casts


ARCを有効にするとCとObjective-C間のキャストをする際に
ARC無効の時の記述のままだとコンパイルエラーになります。

ということで以下3種類のBridgeCast違いを簡単に説明

##__bridge
単純なキャスト
オーナーシップ権は移行しない

##__bridge_retained
キャストした際に参照カウントを+1する

##__bridge_transfer
オーナーシップ権が移行される



よく理解しないまま__bridge_retainedをして
いつまでたってもメモリが開放されなかったのは
いい経験でしたよ、ええ。

##参考URL
[Objective-C Automatic Reference Counting (ARC) 3.2.4 Bridged casts](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#arc-objects-operands-casts "Objective-C Automatic Reference Counting (ARC)")
Compassで開発環境と本番環境を切り替えてみる

開発環境と本番環境とがcompassでも切り替えられるらしい。
grunt使えばjsもまとめてできるしそっちのほうがいいじゃん、って話ではあるんですが、こちらはこちらで何かと便利かと思ったので使ってみました。

***

次のようなconfig.rbを用意してやります。

```ruby:config.rb
http_path = "/"
css_dir = "css"
sass_dir = "sass"
images_dir = (environment == :production)? "assets/img": "img"
javascripts_dir = "js"  

output_style = (environment == :production)? :compressed: :nested
relative_assets = (environment == :production)? false: true
line_comments = (environment == :production)? false: true
```

それぞれのプロパティについての説明については割愛するとして、ポイントは三項演算子をつかってるプロパティの評価文。
compassのconfigでは`environment`というプロパティが用意されていて、このプロパティは`:development`と`:production`の、いずれかのtypeを持つことができます。

それで、上記のconfig.rbでは何をしているか。
プロパティ`environment`に`:production`が指定されていた場合には三項演算子の二項目の値を、そうでない（つまりデフォルト値の`:development`）であれば三項目に指定された値を使うようにしているわけです。

***

さて、config.rbがかけた所で、じゃあ実際にどうやって環境を切り替えるか。
まず開発環境についてですが、こちらはデフォルトで指定されていますので特に指定などはせずに、

```bash
compass compile
```

もしくは

```bash
compass watch
```

してやればよいでしょう。
次に本番環境に切り替えてみます。
これもとてもかんたんで、コンパイル時にいつものコマンドの代わりに次のコマンドを叩けばおーけーです。

```bash
compass compile -e production --force
```

`-e production`で環境を設定している感じですね。
ここで`--force`としたのは、scssファイルが書き換えられていない場合には環境を切り替えたとしてもコンパイルが実行されないからです。

なので確実にコンパイルするために`--force`してあげる、という感じですね。
僕はわざわざこれうつのが面倒なのでalias設定してcprodみたいな感じにしてやってます。

***

最後に参考までに、実際にこれをつかってコンパイル実行するとどうなるか載せてみました。

```scss:hoge.scss
@import "compass";

.hoge {
    background: image-url('hoge.png');
}
```

このしょっぼいscssをコンパイルすると、

**:development**

```css:hoge.css
/* line 3, ../sass/hoge.scss */
.hoge {
  background: url('../img/hoge.png'); }
```

**:production**

```css:hoge.css
.hoge{background:url('/assets/img/hoge.png')}
```

という感じになります。
これだけだと有り難みがあんまり感じられない気もしますが、規模が大きくなってきたらそこそこ便利に使えるかも・・・しれない。
MySQL InnoDBのIndex

mysqlのInnoDBでは**clustered index**というのを採用していて、indexを貼る際に注意が必要ということでメモ

# 結論から言うと
InnoDBでは...
* Primary Key(以下PK)はできるかぎり設定して、できるかぎりauto_incrementの整数型が良い
* PKの検索は速いが、secondary indexやcount(*)での検索は若干遅い
* PKのupdateは避ける
* 無闇やたらとsecondary indexを付けない
* covering indexを狙えると速い

# かんたんに解説
図とか用意したかったけど気力がなかった。

## indexの構造
InnoDBのインデックスでは[B-Tree](http://ja.wikipedia.org/wiki/B%E6%9C%A8)というデータ構造が使われている。B-Treeの解説はwikipediaに任せる。

ツリー構造の一番下のリーフブロックに目的の行の物理的な位置が記録されている。ルート／ブランチのブロックはだいたいキャッシュされるので、実質ディスクIO２回（リーフブロック、行データ）で行データを取ってくることができる。

B-Treeは二分木と違ってブロック単位で管理できるから、ディスクIOを減らせる。全体がメモリに乗るくらいのサイズなら二分木で問題ないんだけど、DBだとそうはいかないのでB-Treeみたいな多分木が向いている。

## clustered index
InnoDB ではclustered indexというindexを強制的に持つようになっている。このclustered indexのリーフブロックには、行の位置ではなくて行データそのものが格納されている。リーフブロックを読み込んだ段階で行データも取れるので、実質ディスクIO１回で行データを取ってくることができる。これが**PKでの検索が速い**理由。

こういう構造なので、InnoDBはPKを設定してもIndex_lengthが増えない(Data_lengthに含まれている)。そのうえ、何もしないとclustered indexが勝手に生成されるので、PKを設定することでData_lengthが減ることさえある。適当に10万件くらい入れたデータをPK付けたり外したり、エンジンをMyISAMにしたりInnoDBにしたりしてみて、show table statusでData_length, Index_lengthを見てみると面白い。

このclustered indexに使われるカラムには決まりがある。
以下の優先順でclustered indexが使われる。
1. PK
2. NOT NULL の UNIQUEキー
3. 1,2に該当するものがなければ、内部的に勝手に一意になるカラムが作られて、それ

だいたいの場合、テーブルにはPKを設定すると思うので、**clustered index = PK**という認識で困ることはそんなにないとおもう

## secondary index
clustered index以外のインデックスをsecondary indexという。
secondary indexのリーフノードには、対応するclustered indexのキーが保存されていて、それを元に、clustered indexで検索する。
つまりsecondary indexでの検索の場合、secondary index→clustered indexという順番で二回インデックスを辿ることになる。これが**secondary index**が遅い理由。

ただし、`SELECT primary_key, secondary_key FROM *** WHERE secondary_key = 1;` みたいな条件で検索したときは、covering indexになるので速い。

secondary indexの全てのリーフにclustered indexのキーが保存されるので、MyISAMとかclustered indexじゃないエンジンに比べて、**clustered indexのカラムサイズ**、**secondary keyの数**によるインデックスサイズの増大が激しい。

## auto_increment
PKをauto_incrementで設定すべきというのには三つ理由がある。

### 整数型はコンパクト
前述の理由でPKはコンパクトに保ちたい。

### 更新時のリーフノードがキャッシュに乗りやすい
auto_incrementの場合、ブロックがいっぱいになって新しいブロックが作られる（リーフ追加）場合を除いて、同じブロックに更新されるので、リーフノードがキャッシュに乗りやすい。

### リーフ分割が起きない
リーフ分割というのは、あるブロックに新しい値が挿入されてブロックのサイズが足りなくなったときに、二つのブロックに分かれる仕組みのこと。例えば`1,2,3,5,6`が入っていて満杯のリーフに、`4`を挿入すると`1,2,3`のブロックと`4,5,6`のブロックに別れるイメージ。

リーフ分割は各ブロックで無駄なスペースが出来たり、構造に変更が加わるのであんまり頻繁に増えて欲しくない。
auto_incrementの場合は前回より大きい値が必ず入るので、新しくリーフを追加するのみなんだけど、そうでなくランダムインサートになってしまう場合、リーフ分割が頻繁に行われる。

要するに、ランダムインサートの場合更新性能が落ちる。
同じ理由で、PKをやたらとUPDATEするのも、よくない。（そんな運用ないだろうけど）

# まとめ
InnoDBはclustered indexを理解したうえでインデックス計画を練ろう！
コールバックで指定したブロックをメインスレッドで実行する


Blocksが浸透して、システムの実装でもコールバックを受け取って実行するタイプのものが増えてきました。
返ってきた値を見て、必要に応じてUIAlertViewやUIActionViewを出したい、というときなどにハマったので、覚書。

たとえば、Twitterアカウントを利用する際、使用できるアカウントがあるかのチェックをしたい際には```requestAccessToAccountsWithType:options:completion:```メソッドを使用しますが、
このcompletionで指定したブロックが実行されるのは**メインスレッドではない**ため、ここでUIを操作しようとするとたいへんなことになります。

``` objc:.m
ACAccountStore* store = [[ACAccountStore alloc] init];
ACAccountType* type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

[store requestAccessToAccountsWithType:type options:nil completion:^(BOOL granted, NSError *error) {
	// bad pattern 
	// grantedに応じてアラートを出したい
	if (!granted) {
		UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"エラー" message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
		[alert show];
	}
}];
```

そこで、```dispatch_get_main_queue()```を使用して、メインスレッドで処理を実行させます。

``` objc:.
[store requestAccessToAccountsWithType:type options:nil completion:^(BOOL granted, NSError *error) {
	// it works!
	if (!granted) {
		dispatch_async(dispatch_get_main_queue(), ^{
		    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"エラー" message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
			[alert show];
	    });
	}
}];
```

## 参考
[EKEventStore#requestAccessToEntityTypeのcallbackがmain thread以外の場所で実行される件とその対処](http://d.hatena.ne.jp/zentoo/20121028/1351443185)

[Allocating/showing a UIAlertView in a Block statement](http://stackoverflow.com/questions/12700411/allocating-showing-a-uialertview-in-a-block-statement)
actor と制御系

actorの仕様を見ていると、これは長年に渡って制御系エンジニアがノウハウを確立してきた、リアルタイムOS上でマルチタスク制御の実装方法を、現代風に整理したものだなと感じる。

疎結合な状態マシン同士をメッセージ・キューで通信させて平行動作を実現する。これを理解し、Cやアセンブラで実装できるかどうかが、かつては一流の制御プログラマになれるかどうかの関門だった。
Scalaメモ

# Scalaの特徴

- オブジェクト指向と関数型プログラミングのハイブリッド
  - →なので、ひとまずオブジェクト指向的な使い方で書きつつ、徐々に関数プログラミングを覚えていく、ということもできる。
　　　
- 静的型付け言語
  - →しかし強力な型推論により、自明な型は省略可能なので、Ruby等のスクリプト言語のように気軽に書ける

- ネイティブにサポートする機能であるかのように動作するライブラリが作成可能
  - →拡張性

- グルーコードなしに、Javaのすべてのライブラリを、そのまま利用可能


### 関数型プログラミング

- 関数は第一級オブジェクト
- 参照透明性

- 述語関数(predicate)
  - 結果が Boolean となる関数リテラル

# 変数

```scala
var msg = "Hello, World" // var は変数定義
val msg = "Hello, World" // val は再代入不可能な変数定義
```

# 型
- Javaのvoidに相当するのは、Unit型

# 関数
- 結果型(return type ではなく、result type) と呼ばれる


```scala
def max(x: Int, y: Int): Int = {
  if (x > y) x
  else y
}
```

# コマンドライン引数

```scala
println("Hello, " + args(0) + "!") // 配列へのアクセスは[]ではない
```

# 制御構文

```scala
var i = 0
while (i < args.length) { // 命令型のスタイル。
  if (i != 0)
    print(" ")
  print(args(i))
  i += 1
}
```

```scala
args.foreach((arg: String) => println(arg))
// ↓省略
args.foreach(arg => println(arg))
// ↓省略
args.foreach(println) // 引数が1個で1文からなるなら、省略可能
```
```scala
for (arg <- args)
  println(arg)
```

# 演算子

- Scalaには伝統的な意味での演算子は無い
  - +, -, *, / などはメソッド名

```scala
1 + 2 // (1).+(2) の省略形
```

- パラメータがひとつなら、. や () を省略できる
  - 単に省略できて簡潔、という意味にとどまらず、この仕組みが、ライブラリの機能をまるでネイティブの機能のように見せることにつながっているのでは。


# メソッド

- method(x) は、method.apply(x) に変換される
- method(x) = y は、method.update(x, y) に変換される

# コレクション

- Array はミュータブル(変更可能)⇔Listはイミュータブル(変更不能)

- タプルは、イミュータブルで異なる型の要素を持てるので、メソッドから複数の値を返したいときなどに使われる

```scala
var a = ("a", "b", 3)
a._1 // "a"
a._2 // "b"
a._3 // 3
```

- セットは、デフォルトではイミュータブル(scala.collection.immutable.Set)
  - ミュータブルなセットを使うなら、明示的に import scala.collection.mutable.Set

```scala
var s = Set("a", "b")
```

- マップは、デフォルトではイミュータブル(scala.collection.immutable.Map)
  - ミュータブルなマップを使うなら、明示的に import scala.collection.mutable.Map

```sclaa
var m = Map(1 -> "hoge", 2 -> "hage")
```
はてな ID を OpenID として使う．

`http://www.hatena.ne.jp/your_hatena_id` を OpenID の URL として使います．この URL の HTML ソースをのぞいてみると，

```html
<link rel="openid.server" href="http://www.hatena.ne.jp/openid/server" />
```

と，この URL で OpenID を使えることが分かります．

---- 

## 参考

FAQ を OpenID で検索しても見つからないのですが，

[Hatena Developer Center](http://developer.hatena.ne.jp/) → [その他](http://developer.hatena.ne.jp/ja/documents/other) → [はてな OpenID](http://developer.hatena.ne.jp/ja/documents/other/apis/openid)

と進んでいくとドキュメントが見つかります．

---- 

（どちらかというと参考のほうが重要）
rails console から web api を気軽に叩けるようにする


Railsで構築した API を気軽に叩こうにも、ユーザ認証や authenticity_token が必要だったりして（POSTの場合）いろいろ面倒なことがあります。

そこで、.irbrc に以下のような記述を追加して、rails console (irb) から気軽に API を叩けるようにしてみました。

```ruby:.irbrc
class Object

  # login する
  def login
    @base_uri = "http://localhost:3000"
    @agent = Mechanize.new
    page = @agent.get("#{@base_uri}/users/sign_in")
    page.form["user[email]"] = "user@example.com"
    page.form["user[password]"] = "password"
    page = @agent.submit(page.form)
    @authenticity_token = page.form["authenticity_token"]
    # form が無い場合は以下のように meta タグから取得
    # @authenticity_token = page.at('meta[@name="csrf-token"]')[:content]
  end

  def get(url, params = {})
    page = @agent.get "#{@base_uri}#{url}", params
    pp JSON.parse(page.body) unless page.body.blank?
    nil
  end

  def post(url, params = {})
    params.merge!( :authenticity_token => @authenticity_token )
    page = @agent.post "#{@base_uri}#{url}", params
    pp JSON.parse(page.body) unless page.body.blank?
    nil
  end
end

```

## 使用例

上記のコードを書いておくと、以下のように簡単に api を叩くことができる。

webシステムにログインする

```
login
```

get リクエストを投げる

```
get "/entries", { :user => "hoge" }
```

post リクエストを投げる

```
post "/entries", { :user => "hoge", :body => "ほげほげ" }
```
irb を起動したときカレントディレクトリの .irbrc を読み込むようにする


~/.irbrc に以下のような記述を追加する

```ruby:~/.irbrc
# カレントディレクトリの .irbrc を読み込む
current_irbrc = File.join(Dir.pwd, ".irbrc")
if File.exist?(current_irbrc)
  load current_irbrc
end
```
ruby で Map&Reduce

データを `data` としたとき

```ruby:map_reduce.rb
data.map{なんかの}.group_by{処理を}.reduce(行う){場所}

```

filter を挟んでも gsub を挟んでもいける。
これがほんとに役に立つのは Hadoop とからしい。
そんな大規模並列処理とかしないし…。

個人的に inject より reduce が好き。

[Map&Reduceとは](http://ja.wikipedia.org/wiki/MapReduce)
Install Theano on Ubuntu 12.04

基本的に http://deeplearning.net/software/theano/install_ubuntu.html#install-ubuntu を参考にする。

Mac with homebrewのインストール方法は[こちら](http://qiita.com/items/da475b4cc8e5875c73d0)。なんか、Core i5のMBPの方がちょっと前のXeonより速いので、GPGPU使わないとMLPとか使う気失せる。。。

# apt-getでインストール

```
$ sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git

$ sudo pip install Theano
```

Ubuntu 12.04ではlibatlas-devとか入れると逆に依存関係壊れるので注意。

各バージョンは下記の通り

```
Numpy: 1.6.1
Scipy: 0.9.0
Test packages
```

Scipyのテストは2個失敗する。 test_io.test_imreadは既知の問題で、おそらく大丈夫。
http://stackoverflow.com/questions/9239989/error-when-testing-scipy
test_morestats.TestAndersonも既知の問題で、下記パッチを当てればOK

https://github.com/scipy/scipy/commit/89c88431e648369d4a15b4fd4e762a28eb86abd8#diff-0
http://comments.gmane.org/gmane.comp.python.scientific.user/30283

# import numpyが失敗する場合は

``ImportError: /usr/lib/liblapack.so.3gf: undefined symbol: ATL_chemv``

が出る場合は、下記で対応する。同じ.soが複数のパッケージで導入可能で、依存関係が解決できないため

```
$ sudo apt-get remove libopenblas-base
Speed test Theano/BLAS on Ubuntu 12.04
```

http://stackoverflow.com/questions/8917977/installing-lapack-for-numpy

ちなみに、lapackやatlas,openblas周りは鬼門。とりあえず、apt-getやyumが使えるならEPEL使ってでもパッケージ管理システムに任せるべき。スキルがないのにソースからインストールしようとすると１日潰れる。無駄。

# speed test

下記コマンドでblasと連動してるかとともにスピードテストをする。

```
$ python /usr/local/lib/python2.7/dist-packages/theano/misc/check_blas.py
```

# DeepLearninのテスト

DeepLearning examples
$ git clone http://github.com/lisa-lab/DeepLearningTutorials

これで、DeepLearningTutorialsにあるexampleがダウンロードできる。

利用しているデータの特性は、[GettingStarted](http://deeplearning.net/tutorial/)を、基本的なメソッド周りは[こちら](http://qiita.com/items/3fbf6af714c1f66f99e9)を参照してください。
Cのプリプロセッサでマクロの中身を文字列化

TO_STR(INT_MAX) => "2147483647"
みたいになって欲しいけど、単純に以下のようにするとうまくいかない。

```c:
#define TO_STR(s) #s
```

TO_STR(INT_MAX) => "INT_MAX"
となってしまう。一段マクロをはさむとうまくいく。

```c:
#define EVAL(f, v) f(v)
#define TO_STR_HELPER(s) #s
#define TO_STR(s) EVAL(TO_STR_HELPER, s)
```

TO_STR(INT_MAX) => "2147483647"

ちなみに、以下は解決できなかったんですが、できるんですかね。

TO_STR(INT_MAX - 1) => "2147483646"
第7回オフラインリアルタイムどう書く。C++による実装。

お題は こちら http://qiita.com/items/4364285801d1c9f370a1

条件をベタに書き下してみました。
右端の右側、左端の左側も空いた席と見てよいので、番兵を置いて判定を単純にしています。

```cpp:
#include <iostream>
#include <sstream>
#include <string>
#include <cctype>

const char VACANT = '-';

int vacant(const std::string& chairs)
{
    const int size = chairs.size() - 2;

    for(int i = 1; i <= size; ++i)
    {
        if((chairs[i - 1] == VACANT) && (chairs[i] == VACANT) && (chairs[i + 1] == VACANT))
        {
            return i;
        }
    }

    for(int i = 1; i <= size; ++i)
    {
        if(((chairs[i - 1] == VACANT) && (chairs[i] == VACANT)) || ((chairs[i] == VACANT)&& (chairs[i + 1] == VACANT)))
        {
            return i;
        }
    }

    for(int i = 1; i <= size; ++i)
    {
        if(chairs[i] == VACANT)
        {
            return i;
        }
    }

    return 0;
}

void test(const std::string& input, const std::string& expected)
{
    std::istringstream iss(input);

    int         size;
    char        delimiter;
    std::string source;
    iss >> size >> delimiter >> source;

    std::string chairs(size + 2, VACANT);

    for(std::string::const_iterator i = source.begin(); i != source.end(); ++i)
    {
        if(std::isupper(*i))
        {
            chairs[vacant(chairs)] = *i;
        }
        else
        {
            chairs[chairs.find(toupper(*i))] = VACANT;
        }
    }

    std::cout
        << "input: " << input
        << "  actual: " << chairs.substr(1, size)
        << "  expected: " << expected
        << "  => " << (chairs.substr(1, size) == expected ? "pass" : "failure") << "\n";
}

int main(int, char* [])
{
    /* 1*/ test( "6:NABEbBZn", "-ZAB-E" );
    /* 2*/ test( "1:A", "A" );
    /* 3*/ test( "1:Aa", "-" );
    /* 4*/ test( "2:AB", "AB" );
    /* 5*/ test( "2:AaB", "B-" );
    /* 6*/ test( "2:AZa", "-Z" );
    /* 7*/ test( "2:AZz", "A-" );
    /* 8*/ test( "3:ABC", "ACB" );
    /* 9*/ test( "3:ABCa", "-CB" );
    /*10*/ test( "4:ABCD", "ADBC" );
    /*11*/ test( "4:ABCbBD", "ABDC" );
    /*12*/ test( "4:ABCDabcA", "-D-A" );
    /*13*/ test( "5:NEXUS", "NUESX" );
    /*14*/ test( "5:ZYQMyqY", "ZM-Y-" );
    /*15*/ test( "5:ABCDbdXYc", "AYX--" );
    /*16*/ test( "6:FUTSAL", "FAULTS" );
    /*17*/ test( "6:ABCDEbcBC", "AECB-D" );
    /*18*/ test( "7:FMTOWNS", "FWMNTSO" );
    /*19*/ test( "7:ABCDEFGabcdfXYZ", "YE-X-GZ" );
    /*20*/ test( "10:ABCDEFGHIJ", "AGBHCIDJEF" );

    return 0;
}
```
XPCOMを使ってFirefoxのXUL extensionからログを吐き出させる

もう死んだテクノロジーですのでみなさま興味ないかと思いますが、firefoxのXUL拡張でログを吐き出させるのは実は案外めんどいのではないかと思い始めました。console使えませんし。

以下のようにやります。

```JavaScript:hoge.js
  Ci = Components.interfaces;
  Cc = Components.classes;
  function Service(className, interfaceName) {
    return Cc[className].getService(Ci[interfaceName]);
  }
  const ConsoleService = Service("@mozilla.org/consoleservice;1", "nsIConsoleService");

  ConsoleService.logStringMessage("Hello from ConsoleService");
```

誰が使うんでしょうね。