OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのキーワード引数も含めてmemoizeしたい


[Pythonwiki](http://wiki.python.org/moin/PythonDecoratorLibrary)には次のようなmemoizeデコレータが紹介されています。

```
# note that this decorator ignores **kwargs
def memoize(obj):
    cache = obj.cache = {}

    @functools.wraps(obj)
    def memoizer(*args, **kwargs):
        if args not in cache:
            cache[args] = obj(*args, **kwargs)
        return cache[args]
    return memoizer
```

ただ、コメントに書いてあるとおり、kwargsには対応していない様子。では対応しましょう。

```
# do not use "self" for a name of argument.
import inspect
def memoize(obj):
    cache = obj.cache = {}

    @functools.wraps(obj)
    def memoizer(*args, **kwargs):
        argdict = inspect.getcallargs(obj, *args, **kwargs)
        argdict.pop('self', None) # if obj is a bound method, arguments includes "self"
        argset = frozenset(argdict.iteritems()) # for Python3, use dict.items() instead
        if argset not in cache:
            cache[argset] = obj(*args, **kwargs)
        return cache[argset]
    return memoizer
```

肝は、標準ライブラリのinspectを使うこと。
inspect.getcallargs()は

```
>>> def f(a, b, c=10):
...     pass
... 
>>> inspect.getcallargs(f, 1, 2) 
{'a': 1, 'c': 10, 'b': 2}
```
みたいに、引数の名前と引数を辞書にしてくれます。
inspectは色々便利です。
vim-powerline のカスタムメモ

====

[vim-powerline](https://github.com/Lokaltog/vim-powerline)には[vim-colors-solarized](https://github.com/altercation/vim-colors-solarized)用のカラースキームとテーマがあるため、Vimの表示全体を[solarized](http://ethanschoonover.com/solarized)で統一できます。

background=light な明るいカラースキームがお好きであれば

```vim
set background              =light
let g:Powerline_theme       ='solarized256'
let g:Powerline_colorscheme ='solarized'
colorscheme solarized
```

background=dark な暗めがお好きであれば

```vim
set background              =dark
let g:Powerline_theme       ='solarized256'
let g:Powerline_colorscheme ='solarized256'
colorscheme solarized
```

となります。

ただし、これには欠点があって、solarized 用のテーマは statusline に表示されるSegment(項目)がデフォルトのものに比べて少なく、filetype, fileformat, fileencoding などが表示されません。

なんだかんだでやっぱり不便なため、これらを追加します。

`Pl#Theme#InsertSegment()`を使って、以下のようにします。

```vim
let s:prev_seg = 'paste_indicator'
for seg in ['fileformat', 'fileencoding', 'filetype', 'lineinfo']
  call Pl#Theme#InsertSegment(seg, 'after', s:prev_seg)
  let s:prev_seg = seg
endfor
unlet s:prev_seg
```

これは、 paste\_indicator (solarizedのテーマでstatuslineの一番右に配置されているSegment, `autoload/Powerline/Themes/solarized256.vim`参照)の後に順番にSegmentを追加しています。

ここでは、fileformat(改行コード), fileencoding(エンコーディング), filetype(ファイルタイプ), lineinfo(行:列) を順に追加しています。詳しくはPowerlineをインストールしたディレクトリの`autoload/Powerline/Segments.vim`あたりを参考にしてください。

他には以下のようなものがあります。

 - `paste_indicator` : オプション &paste が有効か
 - `mode_indicator` : ノーマル/インサート/Visual/etc...
 - `fileinfo` : ファイルのパス、&readonly, &modified などなどまとめて表示
 - `flags.ro` : &readonly
 - `filepath` : ファイルのパス
 - `filename` : ファイル名
 - `flags.mod` : &modified
 - `filesize` : ファイルサイズ
 - `pwd` : カレントディレクトリ
 - `fileformat` : &fileformat
 - `fileencoding` : &filencoding
 - `filetype` : &filetype
 - `scrollpercent` : 全行数のうちのカーソル行の % 表示
 - `lineinfo` : カーソル位置の行:列情報
 - `line.cur` : 現在行
 - `line.tot` : 全行数
 - `charcode` : カーソル位置の文字コード
 - `currhigroup` : カーソル位置のハイライトグループ
 - `ws_marker` : 行末の空白存在表示
C vs Python vs Ruby vs Haskell（無意味な処理deベンチマーク）

<http://d.hatena.ne.jp/nshinchan01/20121114/1352907064>

Haskellはそんなに遅くないよ(´･_･`)！

元のコード

~~~ {haskell}
mylist :: Int -> [[Int]]
mylist n = take n $ iterate (map (+n)) [1..n]

main :: IO ()
main = print.last.last $ map reverse $ mylist 4000
~~~

~~~
$ ghc -O2 muda.hs && time ./muda
15996001

real    0m2.164s
user    0m1.912s
sys     0m0.248s
~~~

ちょっと賢く

~~~ {haskell}
mylist :: Int -> [[Int]]
mylist n = take n $ map (take n) $ iterate (drop n) [1..n^2]

main :: IO ()
main = print.last.last $ map reverse $ mylist 4000
~~~

~~~
$ ghc -O2 muda.hs && time ./muda
[1 of 1] Compiling Main             ( muda.hs, muda.o )
Linking muda ...
15996001

real    0m0.565s
user    0m0.556s
sys     0m0.004s
~~~

Haskellの本気

~~~ {haskell}
mylist :: Int -> [[Int]]
mylist n =
  [ take n [ i * n + 1 .. ]
  | i <- [0 .. n - 1]
  ]

main :: IO ()
main = print.last.last $ map reverse $ mylist 4000
~~~

~~~
$ ghc -O2 muda.hs && time ./muda
[1 of 1] Compiling Main             ( muda.hs, muda.o )
Linking muda ...
15996001

real    0m0.002s
user    0m0.000s
sys     0m0.000s
~~~
Ubuntu のpastbin client `pastebinit' の利用メモ

pastebin.com でファイルから貼りつけしようと思ったけどファイル指定が見つからずそういえばclient あったよなーと試してみたメモ．

#導入

>
$ sudo apt-get install pastebinit

# stdin からペースト

>
$ pastebinit 
test
test
.
^d
http://paste.ubuntu.com/1359876/

※^d はCtrl+d

# ファイルを指定してpaste

>
$ pastebinit -i /var/log/vbox-install.log 
http://paste.ubuntu.com/1359869/

# pastebin サービスを選択
以下のように指定すると使いたいpastbin が使える．  
※デフォルトでは `paste.ubuntu.com' が使われる．

>
$ pastebinit -b http://pastebin.com -i /var/log/vbox-install.log
http://pastebin.com/xzfYnRMU

# サポートされるpastebin

>
$ pastebinit -l
Supported pastebins:
- cxg.de
- fpaste.org
- p.defau.lt
- paste.debian.net
- paste.drizzle.org
- paste.kde.org
- paste.openstack.org
- paste.pocoo.org
- paste.pound-python.org
- paste.ubuntu.com
- paste.ubuntu.org.cn
- paste2.org
- pastebin.com
- pastie.org
- pb.daviey.com
- slexy.org
- sprunge.us
- yourpaste.net
mongoDB で日毎に集計


以下のように日付を表すキーを作って `mapReduce` することで、ドキュメントの数を日毎に集計できます。

```js
function map() {
  var dateKey = function (d) {
    var yy = d.getFullYear();
    var mm = d.getMonth() + 1;
    var dd = d.getDate();
    if (mm < 10) mm = '0' + mm; 
    if (dd < 10) dd = '0' + dd; 
    
    return yy + '-' + mm + '-' + dd; 
  };  
  emit(dateKey(this.created_at), 1); 
}
function reduce(key, values) {
  return Array.sum(values);
}

var daily_counts = db.logs.mapReduce(map, reduce, { query: {}, out: { inline: 1 } });
daily_counts.results.forEach(function (day) {
  print(day._id + ', ' + day.value);
});
```

同じような感じで月毎や曜日毎などでも集計できるはずです。

また、ドキュメントの数でなく、売り上げ金額など何らかの数値を集計したい場合は `map` の最後で以下のようにするといいと思います。

```js
emit(dateKey(this.created_at), this.amount);
```
mongoDB でリストの複数の値のうちどれかにマッチするクエリ


`$in` を使います。

下の例では、名前が Taro, Jiro, Saburo のどれかであるユーザを抽出しています。

```js
var names = ["Taro", "Jiro", "Saburo"];
var users = db.users.find({ name: { $in: names } });
```
rails3_acts_as_paranoid は counter_cache も考慮してくれている

```:ruby
# -*- coding: utf-8 -*-

require "active_record"
require "rails3_acts_as_paranoid"

# ActiveRecord::Base.logger = ActiveSupport::BufferedLogger.new(STDOUT)
ActiveSupport::LogSubscriber.colorize_logging = false
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
ActiveRecord::Migration.verbose = false

ActiveRecord::Schema.define do
  silence_stream(STDOUT) do
    create_table :users do |t|
      t.integer :articles_count, :default => 0
      t.datetime :deleted_at
    end
    create_table :articles do |t|
      t.belongs_to :user
      t.datetime :deleted_at
    end
  end
end

class User < ActiveRecord::Base
  acts_as_paranoid
  has_many :articles, :dependent => :destroy
end

class Article < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :user, :counter_cache => true
end

user = User.create!
user.articles.create!
user.articles.create!
user.reload
user.articles_count            # => 2

user.articles.first.destroy
user.reload
user.articles_count            # => 1
```

すばらです。
gitの作業状態を他のリポジトリにコピーする

ノートPCとデスクトップなど、複数のPCで開発する際に、中途半端な状態のままPCだけ移動したいと思うことはありませんか？
終電が迫っていて持ち帰りたいとか、バグを他の人にちょっと見て欲しい時とかありますよね。いちいちコミットを作成してもいいですが、ちゃんと動作しないものをコミットに含めるのには抵抗がありますし、後で正式なコミットに切り分けるのも面倒です。
ずっと悩んでいましたが、[こちら](http://git.661346.n2.nabble.com/Move-git-stash-from-one-machine-or-working-copy-to-another-td5947946.html)を見て意外に簡単な方法で実現できることに気づきました。

まず、元のPCで`git diff > /path/to/current.diff`でHEADとの差分を取り、差分ファイルを別のPCにコピーします。
そして別のPC（リポジトリ）でHEADをpullしてから、`git apply /path/to/current.diff`で同じ状態になります。
diffの保存先をDropboxなどにすれば手間はほとんどかかりません。
こんなシェルスクリプトを書いて運用しています。

```sh:git-stashdiff
#!/bin/sh
current_dir=`pwd`
repository_name=`basename $current_dir`
utc_time=`date +%s`
target_dir=$GIT_DIFF_PATH/$repository_name
if [ ! -d $target_dir ]; then
  mkdir $target_dir
fi
git diff > "${target_dir}/${utc_time}.diff"
```

環境変数GIT_DIFF_PATHにdiffの保存先（Dropboxなど）を入れておいて下さい。
gitはパスの通ったディレクトリにgit-xxxというコマンドがあればgit xxxというサブコマンドにしてくれるので、git stashdiffで実行することもできます。

なお、gitにはstashという機能があり、`git stash save`で現在の作業状態を保存できますが、stashを他のリポジトリに移動するにはやや面倒な手順を踏まなくてはなりません。
それについては上記のスレッドに書いてあるので参考にして下さい。
git的にはこちらの方法が正しいのかも知れません。
あとで作る画像をとりあえず仮で速攻作る

    convert -background '#eee' -fill '#000' -size 468x60 -font mikachan.ttf -pointsize 12 label:"あとで作る" banner.png

![](http://25.media.tumblr.com/tumblr_mehgoz8pOI1rs2hx9o1_500.png)

画像がまだないのでレイアウトの確認ができないような場合は、上のコマンドで先に作っておけば作業が楽。

labelに日本語を使わない場合は -font xxx.ttf はいらん。
Ruby 2.0 のキーワード引数を補完するプラグインを書いた

neco-ruby-keyword-args というプラグインを作りました．

[neco-ruby-keyword-args](https://github.com/rhysd/neco-ruby-keyword-args)

Ruby 2.0 では，引数を名前で指定するキーワード引数が追加されました．今まではハッシュを引数にすることで擬似的に名前渡しを実現していましたが，もうそんなことをする必要はありません．

```ruby
# ハッシュのような書き方で引数の名前とデフォルト値を指定
def test(tsura: 'poyo', yaba: 'poyo')
  puts tsura+yaba
end

# 指定しないとデフォルト値が使われる
test #=> poyopoyo
# 名前で指定するので順番は意識しなくて良い
test yaba: 'dameda', tsura: 'mou' #=> moudameda
```

これにより，引数の順序を守らないといけないなどの煩わしさから開放され，どの引数が何の値を示しているのか呼び出し側で明示できます．しかし，当然ですが代わりに引数に付けられた名前を覚えておかなければなりません．そこで，ソース内の引数名を収集し，自動で補完してくれるプラグインを作りました．
neocomplcache のソースとして実装しているので，neocomplcache を使っていることが前提です．

使用中のスクリーンショットはこんな感じです．
![スクリーンショット](https://raw.github.com/rhysd/neco-ruby-keyword-args/master/screenshot.jpg)

少し分かりにくいですが，一番下の行で `test` メソッドの `tsura` 引数を補完しようとしているところです．
補完候補の `[K]` というのがキーワード引数補完のマークで，その次にデフォルト値が `'poyo'` であることが表示されています．

なお，現在このソースが補完できるのは，Vim 内で開いている Ruby ソースに定義が書かれたメソッドのみです．require 先やメソッド呼び出しからも候補収集できそうですが，そういうのは追々やっていきます．
readymadeでnodejs+express環境でlessとかを自動コンパイル

[readymade](http://poulejapon.github.com/readymade/)を使うと、lessとかcoffescriptを自動的にcssやjsにコンパイルしてくれる

```javascript

app.configure(function() {
...
app.use(require('readymade').middleware({root: "public"}));
...
});
```

とやっておくと、たとえば `public/less/hoge.less`は、`/public/less/hoge.css`で外部から参照できる
AquaSKKをSKK日本語FEP互換の記号入力無双にする

> ## 2015年9月28日追記
> [codefirst/aquaskk](https://github.com/codefirst/aquaskk)にこの記事の設定が取り込まれました！ 最新版に更新しよう
> [📦AquaSKK 4.2.7: SKK日本語入力FEP互換の記号入力 - みずぴー日記](http://mzp.hatenablog.com/entry/2015/09/27/091030)

[AquaSKK](http://aquaskk.sourceforge.jp/)とはMac向けのかっこいい日本語入力システムです。かっこいいですね。

ところで、Windowsには[SKK日本語入力FEP](http://coexe.web.fc2.com/skkfep.html)といふ、さらにかっこいい日本語入力システムがあります。

どちらも[SKK](http://openlab.ring.gr.jp/skk/index-j.html)のクローンなので基本的にほとんど同じ操作感で日本語を入力することができますが、SKK日本語入力FEPはさらに意欲的にさまざまな機能を取り入れてゐます。

その一つとして、SKK日本語入力FEPでは`z`と特定のキーの組合せでさまざまな約物(記号)が2ストローク(打鍵)で入力できるやうになることがあります。

Google日本語入力では`z/`で[・]、`z.`で[…]、`z[hjkl]`で[←↓↑→]が入力できることをご存じかもしれません。そして、これらのキーバインドはSKKの基本的な初期設定です。

AquaSKKでは上記のキーバインドなどのいくつかの約物(記号)しかありませんが、SKK日本語入力FEPではそれに加へて、実に多彩な約物を入力することができます。

たとへば「**ひだまりスケッチ×☆☆☆** (ひだまりすけっちほしみっつ)」といふ文字列を入力しようと思ったとき、「えっと、ひだまりすけっち、かける、ほし、ほし、ほし」などといちいち変換する必要がありません。SKK日本語入力FEPでは[☆]は`z6`、[★]は`z&`(*日本語キーボードの場合*)、[×]は`z*`です。

といふことで、`hidamariqsukettiqz*z6z6z6`と入力してやることで、目的の**ひだまりスケッチ×☆☆☆**と入力してやることができます。やりましたね。

で、ここからが本題です。この溢れんばかりの記号入力パゥワーをAquaSKKにも導入しませう！

~~導入はかんたん。AquaSKKを導入済みの環境で `Terminal.app` などを開いて次のワンライナーを動かしてやるだけです！~~

> ## 2015年9月28日追記
> [codefirst/aquaskk](https://github.com/codefirst/aquaskk)では設定が取り込まれたのでインストールは不要です！
> [📦AquaSKK 4.2.7: SKK日本語入力FEP互換の記号入力 - みずぴー日記](http://mzp.hatenablog.com/entry/2015/09/27/091030)

あとはツールバーのAquaSKKのメニューバーの「設定ファイルの再読み込み」をしてから環境設定を開いて、「かな入力規則」で 「SKK日本語FEP互換の記号入力を使う」にチェックをつけてやります。もしこれが出てなければ、お手数ですがユーザのログアウトをして再度ログインしてやってください。

これでAquaSKKにもSKK日本語入力FEPと同様の約物入力パワーを手に入れることができたのですが、ひとつだけ`z¥`(または`z\`)で[￥]は再現できませんでした… **AquaSKKの仕様はちゃんと調べてない**。

それと、この記事を書きながらやっと気がついたんですが、これJISキーボードじゃないとSKK日本語入力FEP互換になりませんよね…? ってことでUSキーボードユーザの方、お許しください！
Titanium mobileアプリをsublime text2で開発する（設定編）

Titanium Studioを起動するのが面倒だったので、
最近使ってるsublime text2で開発できるようにしたのでメモ。

###【１】TitaniumのSDKをまず3.0以上に上げる

※現状beta版なので注意

下記DLサイトからインストールすると簡単。アップデートの内容は開発者ブログで確認。
[DLページ](http://preview.appcelerator.com/studio/)
[開発者ブログ](http://developer.appcelerator.com/blog/2012/11/titanium-sdkstudio-3-0-0-beta-now-available.html)


###【２】Node.jsをインストール

色々インストールの方法はあれど、きっと一番迷わないので公式からインストール。
[公式サイト](http://nodejs.org/)

```
$node -v
```

バージョンが表示されればインストールOK。
一応最近の物を入れる。(11月15日現在　v0.8.14)


###【３】npmからTitanium CLI をインストール

node.jsがインストールできたらnpmからTitanium CLI をインストール

・インストール

```
$sudo npm install -g titanium
```

・確認（コマンドの一覧が出ればインストール成功）

```
$titanium
```

・設定

```
$titanium setup

What is your name? (名前)
What is your email address used for logging into the Appcelerator Network? (E-mail)
What would you like as your default locale?(ja-jp)
What Titanium SDK would you like to use by default? (3.0以上を選択)※必須
Path to your workspace where your projects should be created (作業用フォルダパス)
Path to the Android SDK (Android SDKまでのパス)

```



###【４】プロジェクトの作成

インストール、設定ができたのでプロジェクトを作成する。

```

$titanium create

Target platforms: (android,ios,ipad,iphone,mobileweb) (iphone)
App ID: (App ID)
Project name: (プロジェクト名)

[INFO] Creating Titanium Mobile application project
[INFO] Project 'testProject' created successfully in XXms

```

###【５】ビルド

今回はひと通りの設定ができるようにするためなので
そのままビルドをためす。

```

$titanium build -d プロジェクトフォルダのパス

Target platform [android,iphone,mobileweb]:( iphone)

```

これでビルドが出来れば設定が完了。
好きなエディタでTitaniumアプリを開発できる。

---

今回はまったく出て来なかったが
次回はsublime text2のおすすめ設定を記載する予定です。

---

素敵参考サイト様
[imthinker.net](http://imthinker.net/)
Unique


ID作る系。

```haskell:
% runhaskell
import Data.Unique

main :: IO ()
main = do
  loop 10 $ do u <- newUnique
               print $ hashUnique u
  where loop :: Int -> IO () -> IO ()
        loop n action = if n == 0
                        then return ()
                        else action >> loop (n - 1) action

【実行結果】
1
2
3
4
5
6
7
8
9
10
```
ruby で IRC に繋いでみた


IRCSocket という gem があったので試してみた。

`gem install irc-socket`

IRC の仕様は RFC を見ながら理解していく。
[RFC1459 Internet Relay Chat Protocol](http://www.haun.org/kent/lib/rfc1459-irc-ja.html "RFC1459 Internet Relay Chat Protocol")

```ruby:rom_irc.rb
require 'irc-socket'

server, port, nick, user = ARGV

irc = IRCSocket.new( server, port )
irc.connect

if irc.connected?
  irc.pass "hoge" # need to send PASS before you send NICK/USER
  irc.nick nick
  irc.user user, 0, "*", "Mr.${user}"
  irc.join "#hoge"

  while line=irc.read
    puts line
  end
end

```
IRCSocket のドキュメントにある例では PASS の送信が端折られているが、これが無いと接続を切られる。

ひとまず、上記のプログラムで、チャンネル #hoge のログが出るようになる。

`ruby rom_irc.rb irc.example.com 6667 yancya yancya`

しかし、このままだと、NICK や USER や JOIN に対するエラーリプライへの対応が全く出来ていない。
例えば、設定しようとしたニックネームがすでに使われている場合などにはそのまま接続が切れる。
あと、サーバーから PING メッセージが来たときに、速やかに PONG メッセージを返さないと接続を切られるので、対応が必要。
Google chart apiのテスト


E ステップ: 現在推定されているパラメータの分布θ(t)のもとで、尤度関数の、条件付き確率 P(z|x) に関する期待値を計算する。
![math formula image](http://chart.googleapis.com/chart?cht=tx&chf=bg%2Cs%2Cffffff00&chco=000000ff&chs=30&chl=Q(+%5Ctheta+%7C+%5Ctheta+%5E%7B(t%29%7D+%29+%3D+E_%7B+Z%7Cx%2C%5Ctheta%5E%7B(t%29%7D+%7D+%5Blog+L(%5Ctheta%3B+x%2C+Z%29+%5D "math formula image")

M ステップ: 下記の量Qを最大化するパラメータを求める。
 ![math formula image](http://chart.googleapis.com/chart?cht=tx&chf=bg%2Cs%2Cffffff00&chco=000000ff&chs=30&chl=Q%5E%7B(t%2B1%29%7D%3Darg_%7B+%5Ctheta+%7Dmax+Q(+%5Ctheta+%7C++%5Ctheta+%5E%7Bt%7D+%29 "math formula image")
PCL(PointCloudLibrary)をhomebrewでインストールする (修正)

なかなかの難易度を誇る[PCL](http://pointclouds.org)も、homebrewなら楽ちん

```
wget http://dev.pointclouds.org/attachments/download/1052/pcl.rb -O /usr/local/Library/Formula/pcl.rb
brew install -v pcl --head
```

コンパイルに超時間かかるので注意.

stableなバージョンはコンパイル通らなくなってるので、おとなしくPCLはtrunk使いましょう。
NSNotificationCenterの通知でMainThread実行


Notificationを使ってUIの更新をしたい場合、`NSNotificationCenter`から`performSelectorOnMainThread`を呼んであげると良い。##例```Objective-C    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];    [center performSelectorOnMainThread:@selector(postNotification:)                             withObject:[NSNotification notificationWithName:@"name" object:nil]                          waitUntilDone:NO];```期待通りUIが更新される。##良くない例```Objective-C	NSNotificationCenter *center = [NSNotificationCenter defaultCenter];	[center postNotification:@"name"];```通常の呼び方だと新スレッドでメソッドが実行されるようなので、これだとUIがうまく更新されない。##利用するシーン自分の場合は、
C言語のライブラリを使っていて、「C言語のcallbackからどうやってUI更新するんだ？」と悩んでいたところ、これで解決。

NotificationからUI更新という利用シーンは多いはずなので、カテゴリあたりでラップしてあげるともっと使いやすくなりそう。
Mac版EmacsのTRAMP (ange-ftp) とExtended Passive Mode

## 困ってること
Mac OS XのEmacsでTRAMP (ange-ftp) を使っているとたまに`Entering Extended Passive Mode`などと言われて操作がブロックされることがある (接続先のサーバによるようです)。

Extended Passive Modeを切ってやる、具体的にはftpプロセスに対して`epsv4 off`を送りつけてやるとこれが解決する。が、ange-ftpにそのような機能はない。

[解決策](http://www.kit.hi-ho.ne.jp/amist/ "idx")らしきものを見つけたのだがどうもhookを実行してくれていない。何故なのか深く追いかけていないので謎。ange-ftpのコードを読む限りでは呼んでるっぽいんですがね…。しょうがないのでadviceを使ってやることにした。

## 解決
```Lisp:~/.emacs.d/init.el
;;;                                                                                                                                    
;;; TRAMP関連の設定                                                                                                                    
;;;                                                                                                                                    
(setq ange-ftp-try-passive-mode t)      ; 必ずpassive modeに                                                                           
(when (equal system-type 'darwin)       ; Macのftpはextended passivemodeで酷いことになるのでそれをoffにする                            
  (defadvice ange-ftp-passive-mode (before ange-ftp-epsv4-off)
    (ange-ftp-raw-send-cmd proc "epsv4 off"))
  (ad-activate 'ange-ftp-passive-mode))
```

見ればわかるが、passive modeにするための関数 (`ange-ftp-passive-mode`) に引っかけている。なので`ange-ftp-try-passive-mode`や`ange-ftp-passive-host-alist`などを使ってpasive modeでやりとりするように設定しなければなりません。

## バージョン
これはGnu Emacs 24.2.1とMac OS X 10.7.5 (Lion) での話です。でも多分他のバージョンでも起こると思います。

## 参考文献
* [idx](http://www.kit.hi-ho.ne.jp/amist/) `add-hook`を使った解決策。でもうちのでは動かない。why?
* [Entering Extended Passive Modeで詰まった場合](http://d.hatena.ne.jp/mir/20070622/p2) 
* [pkgsrc 関連のネットワークの設定](http://d.hatena.ne.jp/obache/20071123/1195795599) 最後の方にextended passive modde及びftpの初期化ファイル~/.netrcについての記述がある。ただしange-ftpは`macdef init`行以下を無視するので設定したとしても解決しない。
準クォートとTemplate Haskell

TemplateHaskellとか準クォートに興味があったので触ってみました。
型プログラミングの手助けになるモジュールを作ってみたいな、と思いつつ今回はとりあえず**型の表示**をさせてみることにします。

```haskell:TypeChecker.hs
{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
module TypeChecker where

import Language.Haskell.TH
import Language.Haskell.TH.Quote

import Text.Regex.Posix
import qualified Data.Text as Text

type FunctionList = [Name]

parseFunc :: String -> Maybe FunctionList
parseFunc s = do
  mList <- mayToList s
  return $ map mkName mList

mayToList :: String -> Maybe [String]
mayToList s =
  case s =~ "^\\[(.*)\\]$" :: Bool of
    True -> Just $ (map (Text.unpack . Text.strip) s'')
    False -> Nothing
    
  where
    s'' :: [Text.Text]
    s'' = Text.splitOn (Text.pack ",") (Text.tail $ Text.init s')
    
    s' :: Text.Text
    s' = Text.pack s

fList :: QuasiQuoter
fList = QuasiQuoter { quoteExp = parseExp,
                      quotePat = undefined,
                      quoteType = undefined,
                      quoteDec = undefined }

parseExp :: String -> ExpQ
parseExp s =
  case parseFunc s of
    Just fs -> do
      info <- mapM reify fs
      runIO $ putStrLn $ pprint info
      return $ AppE (VarE 'return) (ConE '())
    Nothing -> undefined
```

ghciで起動させるなら -XTemplateHaskell -XQuasiQuotes のオプションと import Language.Haskell.TH が必要です。
[fList|[a,b,c,d]|]などとすれば、定義済みの函数a,b,c,dの型を表示してくれます。

---------
実行例

```bash
~$ ghci -XTemplateHaskell -XQuasiQuotes
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> import Language.Haskell.TH
Prelude Language.Haskell.TH> :l TypeChecker.hs 
[1 of 1] Compiling TypeChecker      ( TypeChecker.hs, interpreted )
Ok, modules loaded: TypeChecker.
*TypeChecker Language.Haskell.TH> [fList|[print, curry, $, mapM]|]
Loading package array-0.4.0.0 ... linking ... done.
Loading package deepseq-1.3.0.0 ... linking ... done.
Loading package bytestring-0.9.2.1 ... linking ... done.
Loading package containers-0.4.2.1 ... linking ... done.
Loading package transformers-0.2.2.0 ... linking ... done.
Loading package mtl-2.0.1.0 ... linking ... done.
Loading package regex-base-0.93.2 ... linking ... done.
Loading package pretty-1.1.1.0 ... linking ... done.
Loading package regex-posix-0.95.1 ... linking ... done.
Loading package text-0.11.1.13 ... linking ... done.
Loading package template-haskell ... linking ... done.
System.IO.print :: forall a_0 . GHC.Show.Show a_0 =>
                                a_0 -> GHC.Types.IO ()
Data.Tuple.curry :: forall a_1 b_2 c_3 . ((a_1, b_2) -> c_3) ->
                                         a_1 -> b_2 -> c_3
GHC.Base.$ :: forall a_4 b_5 . (a_4 -> b_5) -> a_4 -> b_5
infixr 0 GHC.Base.$
Control.Monad.mapM :: forall (m_6 :: * -> *) a_7 b_8 . GHC.Base.Monad m_6 =>
                                                       (a_7 -> m_6 b_8) -> [a_7] -> m_6 ([b_8])

```
FQLのtime型データをNSDateで扱うには


[FQL](https://developers.facebook.com/docs/reference/fql/ "FQL")で取得したtime型のデータを整形して、iOSで表示させる為の方法。ちなみに、time型はepochtimeです。

**開発環境**
1. Xcode 4.5.2
2. facebook SDK Ver3.1

**調べてわかった事**
1. NSDateは[initWithTimeIntervalSince1970](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDate/initWithTimeIntervalSince1970 "initWithTimeIntervalSince1970")を使って初期化する事ができる。これは、double型でepochtimeを引数に指定する事ができる。
2. NSStringには[doubleValue](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/doubleValue "doubleValue")メソッドがある。

**ゆるい予想**
とりあえずNSStringにデータを放り込んでしまえば、後は何とかできるのでは？

ということで、考えたのが下の方法。

```objectivec
NSString* date = [[NSString alloc] initWithFormat:@"%@", [[self.data objectAtIndex:indexPath.row] objectForKey:@"created_time"]];
NSDate* starTDateTime = [[NSDate alloc] initWithTimeIntervalSince1970:[date doubleValue]];
NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy/MM/dd"];
```

1行目 : FQLで取得したcreated_timeを引数にして、NSStringオブジェクトを生成。self.dataにはFQLで取得したデータが格納されている。
2行目 : initWithTimeIntervalSince1970でNSDateオブジェクトを生成
3,4行目 : 表示したい書式で後は適時処理。

3行目の後にFQLで取得したデータとNSDateをNSLogで表示させた結果。

```
FQL 1350908264
NSDate 2012-10-22 12:17:44 +000
```
django + uwsgi で AutoReload


# インストール
## Django
```bash
sudo pip install Django
```
## uwsgi
``` bash
sudo pip install uwsgi
```

# 環境
## Django Project の作成
``` bash
cd ~/dev/sandbox
django-admin.py startproject hello_wsgi
```

## ディレクトリ構成
``` bash
tree hello_wsgi
├── hello_wsgi
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
└── manage.py
```

Django 1.4 からは、wsgi.py が作成される
ファイルチェック用のライブラリを Django Project ?reload
Top ディレクトリに配置する。
参考:http://yoshi.o-oi.net/Entry/11/

``` bash
cd ~/dev/sandbox
curl -O http://projects.unbit.it/uwsgi/export/ad7c6d18232ed1321497c8892c038628a9110891/uwsgidecorators.py
```

次に、ソースコードが変更されたら、reload するタスク用ファイルを作成します。
参考:http://projects.unbit.it/uwsgi/wiki/TipsAndTricks
xrange 使っているから、Python3 の場合は、python3 のものを使用すること。

``` bash
cd ~/dev/sandbox
vim task.py
```

ファイルの内容
task.py

``` python
import uwsgi
from uwsgidecorators import timer
from django.utils import autoreload

@timer(3)
def change_code_gracefull_reload(sig):
    if autoreload.code_changed():
        uwsgi.reload()
```

uwsgi の設定ファイルの作成
参考:http://projects.unbit.it/uwsgi/wiki/Doc

django.ini

``` iniファイル
[uwsgi]
# set the http port
http = :8000
# change to django project directory
chdir = /Users/toku/dev/sandbox/hello_wsgi
# load django
module = hello_wsgi.wsgi
import = task
master = True
```

hello_wsgi/urls.py の、urlpatterns に以下を追加します。

``` python
url(r'^$', 'hello_wsgi.views.home', name='home'),
```

hello_wsgi/views.py に、以下のメッソドを用意します。

``` pyrhon
from django.http import HttpResponse
import datetime

def home(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s! changed!" % now

    return HttpResponse(html)
```


uwsgi の起動

``` bash
uwsgi --ini django.ini
```

これで、Django Project で使用しているファイルが更新された場合、自動更新されるようになりました。
views.py を更新し、ブラウザをリロードすることで変更内容が反映されていることが確認できます。

最終的なディレクトリ構成

``` bash
hello_wsgi/
├── hello_wsgi
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── django.ini
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── views.py
│   ├── views.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
├── manage.py
├── task.py
├── task.pyc
├── uwsgidecorators.py
└── uwsgidecorators.pyc
```
第五回オフラインリアルタイムどう書くの解答(C++)

```cpp

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

namespace
{
typedef std::map<std::string, std::string> m_t;
typedef m_t::iterator it_t;
const std::string Jo = "o";

std::string get_hand(const std::string& s, const bool hand)
{
    std::string::const_iterator it = std::find(s.begin(), s.end(), ',');
    return hand ? std::string(++it, s.end()) : std::string(s.begin(), it);
}

bool stronger(const std::string& h, const std::string& f)
{
    const std::string ranks = "3456789TJQKA2o";
    return ranks.find(f) < ranks.find(h);
}

std::string get_field_rank(const std::string& s)
{
    std::string field_rank = s.substr(1,1);
    if(field_rank == Jo)
    {
        if(s.length() == 2)
        {
            return Jo;
        }
        field_rank = s.substr(3,1);
    }
    return field_rank;
}

m_t get_usable_hand(const std::string& h, const std::string& f)
{
    m_t m;
    std::string field_rank = get_field_rank(f);
    if(field_rank == Jo)
    {
        return m;
    }
    for(size_t i=1; i<h.length(); i+=2)
    {
        std::string hand_rank = h.substr(i,1);
        if(stronger(hand_rank, field_rank))
        {
            m[hand_rank] += h.substr(i-1,2);
        }
    }
    const size_t num_of_field_cards =
            m[Jo].empty() ? f.length()/2 : f.length()/2-1;
    for(m_t::const_iterator it = m.begin(); it != m.end(); ++it)
    {
        if(it->second.length()/2 < num_of_field_cards && it->first != Jo)
        {
            m.erase(it->first);
        }
    }
    return m;
}

void depth_first_search(
        int d, int i, const std::string& h, const size_t n,
        const std::string& str, std::set<std::string>& s)
{
    if(d == i)
    {
        if(str.length() == n)
        {
            s.insert(str);
        }
        return;
    }
    depth_first_search(d, i+2, h, n, str, s);
    depth_first_search(d, i+2, h, n, str + h.substr(i, 2), s);
}

std::string solve_impl(const std::string& h, const std::string& f)
{
    std::set<std::string> s;
    depth_first_search(h.length(), 0, h, f.length(), "", s);
    std::string ret = "";
    for(std::set<std::string>::iterator it = s.begin(); it != s.end(); ++it)
    {
        ret += *it + ",";
    }
    return ret;
}

std::string solve(const std::string& s)
{
    std::string hand = get_hand(s,true);
    if(hand.empty())
    {
        return "-";
    }
    std::string field = get_hand(s,false);
    m_t m = get_usable_hand(hand,field);
    std::string ret = "";
    for(it_t it = m.begin(); it != m.end(); ++it)
    {
        if(!m[Jo].empty() && 4 <= field.length() && it->first != Jo)
        {
            it->second += m[Jo];
        }
        ret += solve_impl(it->second, field);
    }
    return ret.empty() ? "-" : ret.substr(0,ret.length()-1);
}
}

BOOST_AUTO_TEST_CASE( solve_test1 )
{
    BOOST_CHECK_EQUAL(solve("DJ,"), "-");
}

```
RVMを使ったRubyのアップデート

古いのは残す方向で

##RVM自体のアップデート
```
rvm update stable
```

##インストール可能なバージョンのリスト
```
rvm list known
```

##インストール
```
rvm install 1.9.3-p327
```

##インストールされたRubyの確認
```
rvm list
```

##gemsetのコピー
```
rvm gemset copy 1.9.3-p286 1.9.3-p327
```

##新しいRubyへの切り替え
```
rvm use 1.9.3-p327
```

##デフォルトの切り替え
```
rvm 1.9.3-p327 --default
```
AndroidでContentResolver経由しての速度調査

AndroidのContentResolver経由でDBアクセスしたときの速度調査を行なったので、記録。

## 条件
* Android 4.1.2 エミュレータ上
* 使用URI content://com.android.browser/bookmarks
* レコードとして20000件登録。うち10000件を削除状態(deleted=1)。

##比較対象
ContentResolver#query()の第5引数"sortOrder"を
1. null
2. "_id asc" 
で確認。

以下、3回実施しての平均値(ms)。

### 全件取得
1. 1981
2. 1133

### 10件取得(先頭から)
1. 2219
2. 81

### 100件取得(先頭から)
1. 1441
2. 90

### 1000件取得(先頭から)
1. 1470
2. 198

### 10件取得(8000件目から)
1. 1498
2. 223

### 100件取得(8000件目から)
1. 1841
2. 246

### 1000件取得(8000件目から)
1. 1540
2. 338

## まとめ
ソートを入れない方が、全体的に検索結果が遅くなる。
さらに、取得件数や取得位置といった条件に比例した時間とならず、不安定な結果に見える。
エクスプローラーで何もないところを右クリックしたときにGit Bash Hereを出す

Git for Windowsを入れるときにgit-cheetahを選択すると、コンテキストメニューの一階層目にドバーッと色々出されてうざいので、Git Bash Hereを使っている人もそれなりにいると思います。

が、これはこれでフォルダーアイコンを右クリックしないとGit Bash Hereが出てこないので、一旦上の階層に移動して、目的のフォルダーアイコンを右クリックしなければならず、面倒です。

実は、Git for WindowsのGit Bash Hereはレジストリによって実現されているので、何もないところを右クリックしたときに表示する設定をGit Bash Hereのものと同じようにすれば、フォルダーの何もないところを右クリックしたときにGit Bash Hereを出すことが可能です。

以下手順。

1. regeditを開く
2. HKEY_CLASSES_ROOT\Directory\shell\git_shell\commandの「(既定)」のデータをコピーする
3. HKEY_CLASSES_ROOT\Directory\background\shell\git_shellというキーを作る
4. 右のペインの「(既定)」をダブルクリックし、「Git Bash Here」と入力する
5. HKEY_CLASSES_ROOT\Directory\background\shell\git_shell\commandというキーを作る
6. 右のペインの「(既定)」をダブルクリックし、コピーした文字列を貼り付ける
7. HKEY_CLASSES_ROOT\Directory\background\shell\cmd\commandを見ると%1ではなく%Vを使っているので、それに合わせて%1は%Vに変更する

これで、フォルダーの何もないところを右クリックしたときにGit Bash Hereが出るようになります(Win7からできた「ライブラリ」からたどった場合は出ないので注意)。

ちなみに、自分はConsole2を使っているので、

```
"D:\Apps\Console2\Console.exe" -t "git bash" -d "%V"
```

こんな感じになっています。
SublimeText2でのEmmetのラップ変換(wrap with abbreviation)

**SublimeText2**(Mac版)の**Emmet**(varsion: 2012.11.01.16.19.32)で、コマンドの中に**ラップ変換(wrap with abbreviation)**コマンドが見当たらなく、公式のショートカット`⇧⌘A`もアサインされていないので、大変困っていたんだけど

https://github.com/sergeche/emmet-sublime/issues/39

ここの情報によると、`^⌥return`(`control+option+return`)でできました。Windowsの場合は`Ctrl+Alt+Enter`らしいです。

コマンドパレットにリストアップされないのはバグなのか、見落としなのか、修正されるのか不明ですが、とりあえずショートカットは有効になっていて安心。これだけの為に**ZenCoding**にダウングレードするのは勿体無い。

どなたかもっと詳しい方がいらっしゃったらご指摘ください。
iOS6のCoreImageは相当進化していた（今更）

iOS6のSDKが使えるようになって結構たちましたが、
今更CoreImageの追加要素に驚いていました

In iOS 6, Core Image adds the following filters to the set provided in iOS 5:
(iOS6では以下のフィルターがiOS5に加えて追加される）
CIAffineClamp, CIAffineTile, CIBarsSwipeTransition, CIBlendWithMask, CIBloom, CIBumpDistortion, CIBumpDistortionLinear, CICircleSplashDistortion,CICircularScreen, CIColorMap, CIColorPosterize, CICopyMachineTransition, CIDisintegrateWithMaskTransition, CIDissolveTransition, CIDotScreen, CIEightfoldReflectedTile, CIFlashTransition, CIFourfoldReflectedTile, CIFourfoldRotatedTile, CIFourfoldTranslatedTile, CIGaussianBlur, CIGlideReflectedTile, CIGloom, CIHatchedScreen, CIHoleDistortion, CILanczosScaleTransform, CILineScreen, CIMaskToAlpha, CIMaximumComponent, CIMinimumComponent, CIModTransition, CIPerspectiveTile, CIPerspectiveTransform, CIPinchDistortion, CIPixellate, CIRandomGenerator, CISharpenLuminance, CISixfoldReflectedTile, CISixfoldRotatedTile, CISmoothLinearGradient, CIStarShineGenerator, CISwipeTransition, CITriangleKaleidoscope, CITwelvefoldReflectedTile, CIUnsharpMask, CIVortexDistortion

Also in iOS 6, Core Image allows the creation of CIImage objects that reference Open GL texture objects via the imageWithTexture:size:flipped:colorSpace: method of the CIImage class.
（また、iOS6ではCoreImageはOpenGLのテクスチャオブジェクトからCIImageオブジェクトを作成することが許された[imageWithTexture:size:flipped:colorSpace:メソッド]）

画像処理系のアプリの作成がはかどりそうですね
F#でuntilめいたもの

> イケてないけど、F# の until を書いてみた。 > ideone.com/yGVoJ5

とのことだったので書いてみた。

```fsharp
// 1 ..< 3 みたいに使う。う、いけてない記号の選択・・・
let (..<) init last = seq { init..(last-1) }
```

QiitaにF#の投稿が少ないのは、QiitaがF#のシンタックスハイライトに対応してないからな気も。。。
MacBook Tip (Sleepからの起動スピードをより速く）

MacBookでHibernateモードを無効にして，Sleepからの起動スピードを驚くほど速くすることができる．これでHibernate用に作成されるディスクイメージもいらなくなり，4GB程度節約することができるTipだ！
※  [Hibernate (休止状態)について](http://bit.ly/1hvsXB "Hybernate")


1. まずは，Power Management Settingsツールで Hibernateモードが有効化どうかを確認．
$pmset -g | grep hibernatemode
「0」以外の場合は有効です．

2. Macがスリープ状態に入ったときにHibernateにならないように設定．
$sudo pmset -a hibernatemode 0

2. 既に作成されているディスクイメージを削除する場合 (任意)．
$ sudo rm /var/vm/sleepimage


**【注意】**
Hibernateを無効にすると，Macの電源が切れたときにRAMに保存されていたすべてのデータが消えてしまうので，Hibernateを無効にするかどうかをご自身の責任で判断してくださいね．


これでSleepからの起動がめちゃくちゃ速くなって快適です！
Rails3.2と俺と愉快なgems

メモ。

## thin
はやい。gem 'thin' するだけでrails serverした時の鯖がthinになってお手軽。

## haml-rails
これ導入してから俺もデザイナーも「hamlないとしぬ」とかいう軟弱者になってしまった。cssメタ言語はもちろんSass。hamlボーイとsassねーちゃんのおねショタカプおいしいです。

## devise
railsを初めて触った頃からのお付き合いだけど、未だにとっつきにくい点も。モデルは好きだけどコントローラーが拡張性弱い気がする。というか本来はメソッドオーバーライドでアレするべきなんでしょう。

## bootstrap-sass
bootstrapをassets に加えてくれる。railsの勉強用に作ったアプリでよく入れる。今ガチプロダクトの方でassets:precompileでうまくいかない点があったので、ちょっと微妙な気もする。

[UPDATED 11/19]　嘘。ぜんぜん微妙じゃないのでみなさんつかいましょう。

## compass-rails
まだ使ってないけど、俺的にはこれ使えるようになりたいと思っている。だってプログラマーでもちょっと素敵なサイト作れそうじゃない。

## rails-backbone
ディレクトリは深くなるけれど、assets:precompileでクライアントサイドのコードコンパイルできて基本的に爆速なので、すごく魅力的だけど、俺まだjsのテスト書けないし、jsよくわからんし、新規にアプリを作るなら導入してもいいけど、途中からこいつ導入するのはめっちゃ重い。でも部分的・段階的導入できるよ。

## rspec-rails, spork-rails
TDD/BDD見習いなので意識して使っているところだけど、sporkないとちょっと不便ね。guardはやりすぎ感があったりする。sublime text2 からrspec --drb hoge_spec.rbするプラグインないかなー(絶対ある)

## acts_as_hogeable
こういうの名前gemたくさんありますよね。これで作ったモデルは便利なメソッドがわさわさ生えてるし、「自分でも作れるけどなんか便利そう」って感じのgemはローリスクで導入できる安心ある。
重み付け乱択


重み付け乱択は、2段階で改良できます。
まず、1段階目として、リストを1回走査するだけで（重みの合計値を求めながら）
乱択することができます。

http://codepad.org/pnoridMZ

```python
import random

def random_weight_choice(L):
    choice = None
    total = 0

    for item, p in L:
        total += p
        if random.random() * total < p:
            choice = item

    return choice

def test_random_weight_choice():
    from collections import defaultdict

    X = [('A', 3), ('B', 2), ('C', 5)]
    count = defaultdict(int)

    for _ in xrange(100000):
        item = random_weight_choice(X)
        count[item] += 1

    print count

if __name__ == '__main__':
    test_random_weight_choice()
```

この段階では、走査が1パスになっただけで、計算量は O(n) のままです。
同じ重み付けリストから乱択をなんども繰り返す場合は、事前に専用のデータ構造を
作成することで、 O(log n) や O(1) に計算量を落とすことができます。

Python の場合、 bisect というモジュールで2分探索が簡単にできるので、
それを使えば O(log n) の乱択を簡単に実装できます。
http://codepad.org/TTjAK1mV

```python
import random
import bisect

class Choicer(object):

    def __init__(self, L):
        total = 0
        self.probs = []
        self.items = []

        for item, p in L:
            total += p
            self.probs.append(total)
            self.items.append(item)

    def choice(self):
        r = random.random() * self.probs[-1]
        idx = bisect.bisect(self.probs, r)
        return self.items[idx]

def test_random_weight_choice():
    from collections import defaultdict

    X = [('A', 3), ('B', 2), ('C', 5)]
    choicer = Choicer(X)
    count = defaultdict(int)

    for _ in xrange(100000):
        item = choicer.choice()
        count[item] += 1

    print count

if __name__ == '__main__':
    test_random_weight_choice()
```
Qt4.x => Qt5 での変更箇所

この情報は昨日リリースされたばっかりの Qt 5.0 beta2 を使ったものです。

### 個人的に変更する必要があった点

 - QApplication が QtGui から QtWidgets に移動
  - 大半の GUI 系のクラスは QWidgets モジュールに移動
 - QtConcurrent に属するクラスは QtConcurrent のインクルードが必須
 - QMouseEvent::posF から QMouseEvent::localPos に変更
 - qInstallMsgHandler から qInstallMessageHandler に変更
  - さらにコールバック関数の形式も変更されている
 - QAbstractItemView の reset が beginResetModel/endResetModel に変更
  - reset は QTextStream に属するグローバル関数になった

### Qt 5.0 以降でよくなった点

少なくとも OSX での話ですが、以下の点が個人的によくなった点

 - OSX Lion から追加されたフルスクリーンモードに標準対応
 - clang に標準対応
  - Qt 4.8 でも mkspec 的には unsupported 扱いで対応していた

また、[Qt 4.8 では Windows での QtOpenGL で QGLFunctions にバグがあり、使い物にならなかったが Qt 5.0 で改修されたらしい](https://bugreports.qt-project.org/browse/QTBUG-5729)（まだ確認できていない）

### Qt 5.0 以降で微妙になった点

これも OSX での話

 - テキストレンダリングエンジンが変更された
  - 少なくとも OSX が持つレンダリングエンジンではなさげ。変更可能かどうか要調査

### Qt 5.0 以上であるかをマクロレベルで確認する方法

Qt 5.0 以上であるかは以下のマクロを使って確認できる

```cpp
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
  // This code is compiled with Qt 5.0 or above
#else
  // This code is compiled with Qt 4.x
#endif
```
第五回オフラインリアルタイムどう書くの回答例(ruby)

第五回オフラインリアルタイムどう書く( http://atnd.org/events/32979 )。
問題は下記 URL。
http://nabetani.sakura.ne.jp/hena/ord5dahimi/
で。
ruby で事前に書いておいたものを手直ししたもの。

```ruby
def strength c
    c.map{ |x| "3456789TJQKA2o".index( x[1] ) }.min
end

def legal_hand cand 
    ( cand.size==1 ||
        (cand-["Jo"]).map{ |i| strength [i] }.uniq.size==1 )
end

def solve i 
    f,hand=i.split(',').map{ |e| e.scan(/../) }
    sf=strength f
    (hand||[]).combination( f.size ).select{ |cand|
        legal_hand( cand ) && sf<strength(cand)
    }.map{ |i| i.join }.join(",").tap{ |r| 
        return '-' if r.empty? 
    }
end

def normalize a 
    a.split( ',' ).map{ |i| i.scan( /../ ).to_a.sort }.sort
end

DATA.each{ |line|
    num,input,expected = line.split( /\s+/ )
    actual=solve(input)
    unless [actual, expected].map{ |i| normalize( i ) }.uniq.size==1
        print "**EXPECTED** : "+expected+" : " 
    end    
    print "%s %s -> %s"%[num,input,actual]
    puts
}
__END__
1   DJ, -
10  Jo,HAC8DJSJDTH2 -
11  S4Jo,CQS6C9DQH9S2D6S3   DQCQ,D6S6,H9C9
18  HTST,SJHJDJCJJoS3D2 DJCJ,SJDJ,JoHJ,CJHJ,SJJo,HJSJ,DJJo,JoCJ,JoD2,SJCJ,DJHJ
26  H3D3Jo,D4SKH6CTS8SAS2CQH4HAC5DADKD9 HASADA
30  D4H4S4C4,S6SAH6HAD6DAC6CAJo C6H6S6D6,SAJoDACA,S6H6C6Jo,SACAJoHA,HADASAJo,HADAJoCA,CADAHASA,D6C6JoH6,S6D6C6Jo,H6JoS6D6
```

いつもどおり、テストデータの大半を省略。

入力を parse したら、手札を combination して select して join したら出来上がり、という作戦。

combination メソッドがあるのがずるい感じ。
strength の実装は、nidouchi さんの実装( http://qiita.com/items/70b75b0a4f6d304bf38f )を見て真似した。
ReadP


型合わせただけのレベルだけども。

```haskell:
% runghc
module Main where
import Text.ParserCombinators.ReadP

degit :: ReadP Char
degit = foldl (+++) (char '0') (map char "123456789")

main :: IO ()
main = do
  let parser = do seisu <- many degit
                  char '.'
                  syosu <- many degit
                  eof
                  return $ seisu ++ '.' : syosu
  let parsed = readP_to_S parser "123.456"
  print parsed

【実行結果】
[("123.456","")]
```
PostfixでSMTP Relayで外に出るIPを固定する設定

デフォルトの設定から変えるのは

 - inet_interfaces で外部からの接続を許可して
 - mynetworks で内部のIPアドレス設定して
 - relayhost Relay元サーバは relayhost でRelay先指定して
 - smtpd_relay_restrictions = permit_mynetworks, で mynetworksを許可する。
    
グローバルIPアドレスを持っているサーバがひとつしかない時とか
たまに使うのでメモ。
   

```main.cf
--- a/main.cf
+++ b/main.cf
@@ -113,10 +113,12 @@ mail_owner = postfix
 #inet_interfaces = all
 #inet_interfaces = $myhostname
 #inet_interfaces = $myhostname, localhost
-inet_interfaces = localhost
+#inet_interfaces = localhost
+inet_interfaces = all
 
 # Enable IPv4, and IPv6 if supported
-inet_protocols = all
+# inet_protocols = all
+inet_protocols = ipv4
 
 # The proxy_interfaces parameter specifies the network interface
 # addresses that this mail system receives mail on by way of a
@@ -264,6 +266,7 @@ unknown_local_recipient_reject_code = 550
 #mynetworks = 168.100.189.0/28, 127.0.0.0/8
 #mynetworks = $config_directory/mynetworks
 #mynetworks = hash:/etc/postfix/network_table
+mynetworks = 192.168.0.0/24, 127.0.0.0/8
 
 # The relay_domains parameter restricts what destinations this system will
 # relay mail to.  See the smtpd_recipient_restrictions description in
@@ -315,6 +318,7 @@ unknown_local_recipient_reject_code = 550
 #relayhost = [mailserver.isp.tld]
 #relayhost = uucphost
 #relayhost = [an.ip.add.ress]
+#relayhost = [192.168.0.100]
 
 # REJECTING UNKNOWN RELAY USERS
 #
@@ -674,3 +678,10 @@ sample_directory = /usr/share/doc/postfix-2.6.6/samples
 # readme_directory: The location of the Postfix README files.
 #
 readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
+
+smtpd_relay_restrictions = permit_mynetworks,
+    permit_sasl_authenticated,
+    reject_unauth_destination,
+    reject_unknown_hostname,
+    reject_unauth_destination
```
第五回オフラインリアルタイムどう書くの回答例(Haskell)

お題はこちら http://qiita.com/items/5c10c132e1f78131563f
テストにパスするのは確かめたんですが、brushupはまだできてないのでいろいろ雑…。

```haskell:Answer.hs

module Answer(solve, input_cards) where

import Data.List

rank '3' = 1
rank '4' = 2
rank '5' = 3
rank '6' = 4
rank '7' = 5
rank '8' = 6
rank '9' = 7
rank 'T' = 8
rank 'J' = 9
rank 'Q' = 10
rank 'K' = 11
rank 'A' = 12
rank '2' = 13
rank 'o' = 14

rank_char n = "-3456789TJQKA2o" !! n

join_string _ [] =  "-"
join_string d ws =  foldr1 (\w s -> w ++ d:s) ws

join_string' [] =  ""
join_string' ws =  foldr1 (\w s -> w ++ s) ws

combination n = filter (\x -> length x == n) . subsequences

rank_of_list [(_,r)] = r
rank_of_list ((_,r):xs)
    | r1 == rank 'o' = r
    | r  == rank 'o' = r1
    | r  == r1       = r
    | otherwise      = 0
    where
        r1 = rank_of_list xs

input_cards [] = []
input_cards "-" = []
input_cards (s:r:xs) = (s, rank r):(input_cards xs)

input (',':xs) = ([], input_cards xs)
input (s:r:xs) = let (fs, hs) = input xs in ((s, rank r):fs, hs)

solve xs = join_string ',' $ map (\xs -> join_string' xs) $ map (\xs -> map (\(s,r) -> [s, rank_char r]) xs) $  filter (\hs -> fr < (rank_of_list hs)) hss
    where
        (fs, hs) = input xs
        fr       = rank_of_list fs
        hss      = combination (length fs) hs
```

```haskell:test.hs

module Main where

import Data.List
import Test.HUnit
import Answer

split :: (a -> Bool) -> [a] -> [[a]]
split f s =
    case dropWhile f s of
         [] -> []
         s' -> w : split f s''
               where (w, s'') = break f s'

doAssert :: [String] -> Assertion
doAssert (name:input:expected:_) = assertEqual name e a
    where
        e = sort $ map (\x -> sort $ input_cards x) $ split (== ',') $ expected
        a = sort $ map (\x -> sort $ input_cards x) $ split (== ',') $ solve input
doAssert _ = error "Specify a list which contains more than 3 items."

main :: IO ()
main =
    readFile "patterns.tsv"
    >>= runTestTT . test . map (doAssert . split (== '\t')) . lines
    >>  return ()
```
OS X(homebrew)でROS fuerte turtle(のbase)をビルドする

基本的には[ここ](http://www.ros.org/wiki/fuerte/Installation/OSX/Homebrew/Source)に従っていけばOK

ここでやってる変更は、ちゃんとパッチを投げます。

## homebrewを入れる

```bash
ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)
brew update
```

## 環境変数を設定する

```bash
export PATH=/usr/local/bin:$PATH
export PYTHONPATH="/usr/local/lib/python2.7/site-packages:/usr/local/lib/python:$PYTHONPATH"
```

## f-turtleのtapをいれる

```bash
brew tap ros/fuerte
```

## また環境変数を設定する

```bash
export ROS_OS_OVERRIDE=osx:homebrew
```

## python環境を整える

```bash
sudo chown -R $USER /Library/Ruby /Library/Perl /Library/Python
easy_install pip setuptools
brew install libyaml
pip install --upgrade PyYAML
pip install mercurial
pip install --upgrade empy nose
```

## homebrewでインストール

```bash
brew install cmake boost log4cxx qt ros/fuerte/swig-wx
```

ここで、gtestは現在homebrewにパッケージとして含まれ亡くなってることに注意

## バイナリをいれる
[wxPython](http://downloads.sourceforge.net/wxpython/wxPython2.9-osx-2.9.2.4-cocoa-py2.7.dmg)をいれる

環境変数も設定

```bash
export PATH=/usr/local/lib/wxPython/bin:$PATH
```

[Cg](http://developer.download.nvidia.com/cg/Cg_3.0/Cg-3.0_February2011.dmg)も入れときましょう

## rosinstall, rospkg, rosdepを入れる

```bash
pip install -U rosinstall
pip install -U rospkg
pip install -U rosdep
```

## rosinstallを走らせる
公式のrosinstallファイルが間違ってるので修正したものを利用

```bash
rosinstall --catkin ~/ros-underlay http://garaemon.github.com/garaemon-ros-pkg/rosinstalls/fuerte-ros-full.rosinstall
```

## パッチを当てる

### ~/ros-underlay/roscpp_core/rostime/CMakeLists.txtを修正
boost_systemが必要

```cmake
find_package(Boost REQUIRED COMPONENTS date_time thread system)
```

### ros_comm/tools/rosbag/src/recorder.cppを修正

`boost::TIME_UTC`を`boost::TIME_UTC_`にする.

[参考](https://svn.boost.org/trac/boost/ticket/6940)

## コンパイルする

```bash
cd ~/ros-underlay
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/ros/fuerte
make -j4
sudo make install
```

## 動作確認

```
. /opt/ros/fuerte/setup.sh
roscore
```
Re: 無限2: 13日の金曜日を見つける

## 本当に無限に見つけるバージョン

```ruby
require 'date'
def mugen_date(start=nil)
  d = start || Date.today
  loop { yield(d); d = d.succ }
end

mugen_date_enum = enum_for(:mugen_date)

# never return
puts mugen_date_enum.select{|d| d.day == 13 and d.friday? }.first 10

# displays:
# 2013-09-13
# 2013-12-13
# 2014-06-13
# 2015-02-13
# 2015-03-13
# 2015-11-13
# 2016-05-13
# 2017-01-13
# 2017-10-13
# 2018-04-13
puts mugen_date_enum.lazy.select{|d| d.day == 13 and d.friday? }.first 10
```

## see also

* http://route477.net/files/matrk03/#21
Mac OSX 10.7 系で Xdebug をインストールする方法


参考: http://d.hatena.ne.jp/hrsth/20100508/1273290871


コマンドで /etc/php.ini をさわります。パーミッションの関係で `sudo vi /etc/php.ini` になるかと思われ。

変更箇所:

1. 942 行目の「;」を削除
2. 1903 行目の「;」を削除
3. 1904 行目の「;」を削除

以上




つーか `/usr/lib/php/extensions/no-debug-non-zts-20090626/` 以下の状態が私の環境では、

```shell
$ ls -R /usr/lib/php/extensions/no-debug-non-zts-20090626/
./		../		mecab.so	mongo.so	phpcups.so*	xdebug.so*
```

となってて、mecab.so や mongo.so はインストールした記憶あるし、でもphpcups.so と xdebug.so はインストールした記憶ないし少し混乱中。

間違ってたらごめんね。
ブック全体置換

```VBA
Public Sub ブック全体置換(ByRef ブック As Workbook, ByVal 何を As String, ByVal 何に As String)
    Dim シート As Worksheet

    For Each シート In ブック.Worksheets
        Call シート全体置換(シート, 何を, 何に)
    Next
End Sub

Public Sub シート全体置換(ByRef シート As Worksheet, ByVal 何を As String, ByVal 何に As String)
    シート.Cells.Select
    Selection.Replace What:=何を, Replacement:=何に, LookAt:=xlPart, _
                        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                        ReplaceFormat:=False
End Sub
```
コマンドラインから画像ファイルの中身をクリップボードに転送する。

コマンドラインからファイル名を指定すれば、画像をクリップボードにコピーします。
gnuplot等、別のプログラムで作った画像ファイルの中身をWord等に貼り付けるとき、これをかます事で「ペイントで開く→全指定→コピー」の手間を減らします。

```fsharp:img2clip.fs
open System.IO
open System.Drawing
open System.Windows.Forms
open System

let copy_image (fname: string) = 
    try
        use fs = new FileStream(fname,FileMode.Open, FileAccess.Read)
        use bmp = new Bitmap( System.Drawing.Image.FromStream(fs) ) ;
        Clipboard.SetData("Bitmap", bmp)
    with
        :? System.ArgumentException -> 
            printfn "can't open %s" fname
            exit 1

let main =
    let args = Environment.GetCommandLineArgs()
    if args.Length <> 2 then
        printfn "usage:img2clip imgfile" |> ignore
        Environment.Exit  1
    let infile = args.[1]
    copy_image infile

[<STAThread>]
do main
```
Sinatra でカスタムセッター/ゲッターを定義したり、それにより処理をフックしたりする

Sinatra においては、 `foo=(val)`, `foo` といったカスタムセッター/ゲッターをModuleのメソッドとして定義してregisterできる。

`enable :foo` は結局 `set :foo, true` と同義なので、 `foo=` の内部でコールバック処理を定義できたりもする。

```ruby:app.rb
require 'sinatra'

module Sinatra::HookSample
  # should write setter and getter by self
  # https://github.com/sinatra/sinatra/blob/master/test/settings_test.rb#L104
  def foo=(bool)
    if bool
      puts "hook is called!"
    end
    @foo = bool
  end

  def foo
    @foo
  end
  alias foo? foo

  Sinatra.register Sinatra::HookSample
end

configure do
  enable :foo
end

get '/' do
  "foo is: #{settings.foo}"
end
```

# フックがコールされる

```sh
$ ruby app.rb
hook is called!
[2012-11-13 14:07:27] INFO  WEBrick 1.3.1
[2012-11-13 14:07:27] INFO  ruby 1.9.3 (2012-04-20) [x86_64-darwin11.4.0]
== Sinatra/1.3.3 has taken the stage on 4567 for development with backup from WEBrick
[2012-11-13 14:07:27] INFO  WEBrick::HTTPServer#start: pid=51396 port=4567
```

gemとかでSinatra Extensionを公開して、なおかつ`enable`で設定を制御したりもできるような気がする。
ActiveRecordをutf8mb4で動かす


もうMySQL 5.5 GAが出てから一年が経ち、MySQL 5.6 GAもそろそろ出るころだし、新規で作るアプリケーションはutf8mb4でいきたいのでその方法。

まず、mysql2が0.3.11以前のバージョンではutf8mb4に対応してないので、それより新しいバージョンを使う必要があります。

```Gemfile
gem 'mysql2', '>= 0.3.12b4'
```

これで`encoding: utf8mb4`で接続できるようになります。

つぎにActiveRecord::Migrationでutf8mb4なデータベースを作成するようにコンフィグで`charset`と`collation`を指定します。

```yaml:config/database.yml
development:
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  reconnect: false
  database: kamipo_development
```

そうすると、schema_migrationsがインデックス張れないエラーでこけます。

```
Mysql2::Error: Index column size too large. The maximum column size is 767 bytes.: CREATE UNIQUE INDEX `unique_schema_migrations` ON `schema_migrations` (`version`)
```

MySQL側のinnodb_large_prefixオプションでキープレフィックスを3072バイトまで拡張できるのでmy.cnfで指定します。

```my.cnf
[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
```

このオプションはROW_FORMATがDYNAMICかCOMPRESSEDのとき有効なので、create_tableメソッドで'ROW_FORMAT=DYNAMIC'がデフォルトで指定されるようにしておきます。

```ruby:config/initializers/ar_innodb_row_format.rb
ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters

    class AbstractMysqlAdapter
      def create_table_with_innodb_row_format(table_name, options = {})
        table_options = options.merge(:options => 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
        create_table_without_innodb_row_format(table_name, table_options) do |td|
          yield td if block_given?
        end
      end
      alias_method_chain :create_table, :innodb_row_format
    end

  end
end
```

これでとりあえずutf8mb4で動きます！

### 参考
- [MySQL(InnoDB) で "Index column size too large. The maximum column size is 767 bytes." いわれるときの対策 - かみぽわーる](http://blog.kamipo.net/entry/2012/11/13/102024)