OmniAICreator/Qiita-1.07M huggingface dataset:
XXX_path()メソッドでクエリ文字列を追加する



config/routes.rbに

```
resources :hoges
```

のようなルーティング設定されている場合

```
hoge_path(hoge.id, :fuga => 'piyo')
```

ってやると

```
http://localhost:3000/hoge/1?fuga=piyo
```

という感じのURLが生成される。
ニコニコ動画の動画をダウンロード


ニコニコ動画の動画をダウンロードするコードを書いたので説明
## 動画の保存場所の入手
動画の保存場所を入手するgetflvというAPIがあります
http://flapi.nicovideo.jp/api/getflv/sm#{id}
ニコニコ動画のAPIを使う準備としてとりあえず、ニコニコ動画にログインする
ログインをしてるCookieとその動画へのアクセスが無いと動画などを保存しているURLなどを返してくれない
楽がしたいのでとりあえずmechanize

```Ruby
require 'rubygems'
require 'mechanize'

mail = "ニコニコ動画に登録してるメールアドレス"
pass = "ニコニコ動画に登録しているパスワード"
agent = Mechanize.new;
agent.post("https://secure.nicovideo.jp/secure/login?site=niconico","mail"=>mail,"password"=>pass);
agent.get("http://www.nicovideo.jp/watch/sm#{id}");
```

あとはgetflvにアクセスすると動画の保存されてるURLを教えてくれる

```Ruby
moviedate = agent.get("http://www.nicovideo.jp/api/getflv?v=sm#{id}");
```

そうすると

>thread_id=1173108780&l=319&url=http%3A%2F%2Fsmile-com42.nicovideo.jp%2Fsmile%3Fv%3D9.0468&link=http%3A%2F%2Fwww.smilevideo.jp%2Fview%2F9%2F16899326&ms=http%3A%2F%2Fmsg.nicovideo.jp%2F10%2Fapi%2F&ms_sub=http%3A%2F%2Fsub.msg.nicovideo.jp%2F10%2Fapi%2F&user_id=16899326&is_premium=0&nickname=%E3%81%8D%E3%81%BF%E3%81%A8%E3%81%BC%E3%81%8F%E3%81%AE%E4%B8%83%E6%97%A5%E9%96%93&time=1363070293743&done=true&hms=hiroba01.nicovideo.jp&hmsp=2527&hmst=1000000003&hmstk=1363070353.H4EKrVgto621n76tb4IRpYJ7h_0&rpu=%7B%22count%22%3A1886330%2C%22users%22%3A%5B%22%5Cu30e9%5Cu30b9%5Cu30af%22%2C%22huto%22%2C%22EX%5Cu3059%5Cu305a%5Cu304d%22%2C%22%5Cu30d2%5Cu30ed%22%2C%22%5Cu3044%5Cu3061%5Cu3054%22%2C%22yamasan%22%2C%22%5Cu30a8%5Cu30fc%5Cu30b9%22%2C%22%5Cu672a%5Cu7d17%22%2C%22%5Cu30bb%5Cu30c3%5Cu30ad%5Cu30fc%22%2C%22Wen+Chi%22%2C%22%5Cu3068%5Cu3089%5Cu3053%22%2C%22%5Cu5bdd%5Cu5e8a%22%2C%22dieu%22%2C%22%5Cu304d%5Cu306e%5Cu3053%22%2C%22%5Cu30c1%5Cu30e3%5Cu30d4%5Cu30bf%5Cu30f3%22%2C%22%5Cu3082%5Cu3049%5Cu3061%5Cu3083%5Cu3093%22%2C%22%5Cu86ed%5Cu5b50%28%5Cu30d2%5Cu30eb%5Cu30b3%29%22%2C%22kai%22%2C%22abe%22%2C%22%5Cu304e%5Cu308b%5Cu3055%5Cu3093%5Cu2462%22%5D%2C%22extra%22%3A9%7D

みたいな感じの物が返ってくるのでその中から正規表現で*=*となっている物を取り出せば良いのでscanコマンドで頑張ってみる
この返ってくる文字列は&で区切られてるのでそれで頑張る、[Rublar](http://www.rubular.com/)っていうRubyの正規表現が試せるページがあるのでこれで試行錯誤しながらがんばったら

```Ruby
map = {};
moviedate.body.scan(/([^&]+)=([^&]*)/).each do |i|
  map[i[0]] = i[1];
end
```

みたいな感じになるのでそれをmapに保管しとく

## 動画のファイル形式を入手
あとは、この保存するファイルの形式の所得をして保存するだけ
動画の形式を知るのはgetthumbinfoっていうAPIを使う
http://ext.nicovideo.jp/api/getthumbinfo/sm#{id}

```Ruby
require 'open-uri'
require 'rexml/document'

doc = REXML::Document.new(open("http://ext.nicovideo.jp/api/getthumbinfo/sm#{id}"));
filetype = doc.elements['nicovideo_thumb_response/thumb/movie_type'].text.to_s;
```

## 動画の保存

```Ruby
require 'cgi'

title = doc.elements['nicovideo_thumb_response/thumb/title'].text.to_s
open("#{title}.#{filetype}","wb") do |i|
  i.print agent.get_file(CGI::unescape(map["url"]));
end
```

cgiはmapに入れられたurlの文字列がURLエンコードされているのをデコードしてる
これでニコニコ動画の動画が保存出来たよ,
動画のIDは保存したい動画のIDに変えてねっ、
vimの起動がおそいときに--startuptimeで計測して対処


```
vim filename --startuptime [logfilename] 
```

みたいな感じでやるとログでて、
どこらへんで起動に時間かかっているか分かる。

僕の場合は、hamlだけ開くの遅かったので、

```
vim index.html.haml --startuptime index.html.haml.log
```

みたいな感じでやったら原因判明した。
はやくなかったらvimじゃない！
Quickfixを知ってからfugitiveを使うと捗る

vimgrepとQuickfix知らないVimmerはちょっとこっち来い - http://qiita.com/items/0c1aff03949cb1b8fe6b

こんな記事が上がっていたので、勝手に応用編を書いてみる。
まあ、以前LT等で話したことをQiitaに書き移してるだけですが。

## QuickFixの拡張
[QFixGrep](https://sites.google.com/site/fudist/Home/grep)というプラグインがあります。
これを入れていると、以下のような事が出来ます。

- QuickFixバッファで選択した検索対象をプレビューして確認できる
- QuickFixの表示を更に絞り込んで検索
- QuickFixの表示をファイル名、更新時間、内容でソートする

他にもいくつか機能がありますし、Windowsで利用するのに便利な解説などもあります。


また、以前自分のブログなどで書きましたが、[qfreplace](https://github.com/thinca/vim-qfreplace)というプラグインがあります。
QuickFixで出力されている各行をまとめて置換することが出来ます。
メソッド名の変更のお供に。


## fugitiveの真価
[fugitive](https://github.com/tpope/vim-fugitive)というvimからgitを操作するためのプラグインがあります。
導入した後で、以下のようなコマンドを打ってみましょう。

- :Glog | copen (現在開いているファイルの過去の編集履歴をQuickFixで参照)
  - 選択するとその時点でのファイルの断面を開く
- :Glog -- | copen (gitリポジトリのコミットログの一覧をQuickFixで参照)
  - 選択するとログとdiffの内容を表示するバッファが開く
- :Glog master..HEAD -- | copen (masterから現在のブランチまでのコミットログの一覧をQuickFixで参照)
  - 選択するとログとdiffの内容を表示するバッファが開く
- :Ggrep hoge | copen (hogeでgit grepした結果をQuickFixで参照)
  - 選択するとヒットした箇所に移動する
  - qfreplaceでまとめて置換可能

(GlogのQuickFix機能はQfixGrepのプレビューとは余り相性が良くない)

gitのコミットをvimから直接扱えるので、過去の編集履歴から削除したコードを持ってきたりできるわけです。
過去の編集履歴を参照している状態でGdiffコマンドを使えば、即座に現在の状態との差分を確認する事も可能です。

これで、gitのコミットの活用が捗りますね。
PNG画像を一括で軽量化する

pngcrushを使う
`brew install pngcrush`でインストール
`pngcrush -brute -d "out" *.png`で同一ディレクトリ内

で、実際にほぼ劣化なく軽くは成るんですが
Xcodeにもpngcrushが入っていてビルド時に
やってくれているような気がしなくも無いような・・・
今更 virtualenv を使ってみる



pypy 突っ込んで見たものの、よく考えたら環境変数変えるだけでpythonを変えれるvirtualenvよくね？と今更ながらに思ったのでインストール


順番とか割と適当。前提として `XCode`、`HomeBrew` および `pip` はインストール済み。

まず pypy インストール

```shell
$ pip install pypy
```

次に `virtualenv` のインストール

```shell
$ sudo pip install virtualenv
Password:
Downloading/unpacking virtualenv
  Downloading virtualenv-1.9.1.tar.gz (2.0MB): 2.0MB downloaded
  Running setup.py egg_info for package virtualenv

    warning: no previously-included files matching '*' found under directory 'docs/_templates'
    warning: no previously-included files matching '*' found under directory 'docs/_build'
Installing collected packages: virtualenv
  Running setup.py install for virtualenv

    warning: no previously-included files matching '*' found under directory 'docs/_templates'
    warning: no previously-included files matching '*' found under directory 'docs/_build'
    Installing virtualenv script to /usr/local/bin
    Installing virtualenv-2.7 script to /usr/local/bin
Successfully installed virtualenv
Cleaning up...
```


で、後は既存のPythonを集めて環境設定

```shell
$ virtualenv -p `which pypy` pypy
Running virtualenv with interpreter /usr/local/bin/pypy
New pypy executable in pypy/bin/pypy
Installing setuptools............done.
Installing pip...............done.

$ virtualenv -p `which python` python_2_7_1
Running virtualenv with interpreter /usr/bin/python2.7
New python executable in python_2_7_1/bin/python
Installing setuptools............done.
Installing pip...............done.

$ virtualenv -p `which python2.6` python_2_6_7
Running virtualenv with interpreter /usr/bin/python2.6
New python executable in python_2_6_7/bin/python2.6
Also creating executable in python_2_6_7/bin/python
Installing setuptools............................done.
Installing pip...............done.
```

で、最後に実行するpythonを変更する。

```shell
[yasui@yasui-MBA: ~][13:23] $ source ~/pypy/bin/activate
(pypy)[yasui@yasui-MBA: ~][13:23] $ python -V
Python 2.7.2 (341e1e3821ff, Jun 07 2012, 15:42:54)
[PyPy 1.9.0 with GCC 4.2.1]
(pypy)[yasui@yasui-MBA: ~][13:24] $

(pypy)[yasui@yasui-MBA: ~][13:24] $ source ~/python_2_7_1/bin/activate
(python_2_7_1)[yasui@yasui-MBA: ~][13:24] $ python -V
Python 2.7.1
(python_2_7_1)[yasui@yasui-MBA: ~][13:24] $

(python_2_7_1)[yasui@yasui-MBA: ~][13:24] $ source ~/python_2_6_7/bin/activate
(python_2_6_7)[yasui@yasui-MBA: ~][13:26] $ python -V
Python 2.6.7
(python_2_6_7)[yasui@yasui-MBA: ~][13:26] $
```
boost coroutine

面白いですね、
macでとりあえず実行できたけど、ビルドがよくわからない。
オプションとか、iphone用とか・・・cinder用とか・・・


```

#include <iostream>
#include <boost/coroutine/coroutine.hpp>

typedef boost::coroutines::coroutine<void(void)> CoRoutine;
int main(int argc, const char * argv[])
{
    CoRoutine func([](CoRoutine::caller_type& yield)
                   {
                       yield();
                       for(int i = 0 ; i < 10 ; ++i)
                       {
                           std::cout << i << std::endl;
                           yield();
                       }
                   });
    
    func();
    func();
    func();
    func();
    return 0;
}

output:
0
1
2
3


```
LEFT OUTER JOINする


## 関連するBのレコードが存在しないAを抽出する

SQL的には

```sql
SELECT A.*
FROM A LEFT OUTER JOIN B 
       ON A.id = B.id
WHERE B.id is NULL
```

これを、Railsでやるには

Rails5以降

```rb
A.left_joins(:b).where(b: { id: nil })
```

Rails4まで（ただし「includesはLEFT JOINのためのメソッドではなくeager loadingのためのものなので、余計なActiveRecord::Baseインスタンスを生成してしまい余計なメモリを消費してしまう」ため注意）

```rb
A.includes(:b).where(b: {id: nil})
```


## 参考

[Ruby Tips - LEFT OUTER JOIN with ARel](http://ruby.ryanbigg.com/post/1468788928/left-outer-join-with-arel)
[MetaWhere Is About To Get Func-y - Ernie Miller](http://erniemiller.org/2010/11/02/metawhere-is-about-to-get-func-y/)
Windows の Ruby を 2.0.0-p0 にしたら Capistrano が色づいた

さて、タイトルそのまんまですが、Windows の Ruby を 2.0.0-p0 にしたら Capistrano が出力していた文字色変更用の制御文字がちゃんと出るようになって、色がつくようになりました。これで [32m やら [0m やら目にしなくて済みます。

バイナリは [RubyInstaller](http://rubyinstaller.org/) のものです。本家リリース後に速攻で 2.0.0-p0 対応してくれた RubyInstaller.org に感謝します。

![キャプチャ](http://s24.postimage.org/rx7cv21gl/cap.png) [画像](http://postimage.org/image/gkurd9srl/)

で、注意なんですが、64ビット版の Ruby と pageant を組み合わせるとこんなエラーが出てしまいます。32ビット版を使ったほうがよさそうです。

```
connection failed for: xx.xx.xx.xx (Net::SSH::Authentication::AgentError: unknown response from agent: 1, "\0\0\0,\x01\0\0\0'SSH-2.0-Ruby/Net::SSH_2.6.6 x64-mingw32")
```

Ruby 自体のバージョンアップによるものなのか、依存パッケージによるものなのか、理由は分かってませんが、ともかく 2.0.0 にしておけばよさそうです。バンザイ！1.9.3 は爆発四散した。
Emacs の Org ファイルを platex と dvipdfmx で PDF 化する設定．

org-beamer を使っていると，`C-c C-e d` で作成途中のプレゼンを PDF プレビューすることがよくあります．しかし，この `C-c C-e d` (`org-export-as-pdf-and-open`) はデフォルトでは pdflatex を利用するため，dvipdfmx を想定している場合などは，PDF をうまく生成できません．そんなときには，`org-latex-to-pdf-process` を設定して `org-export-as-pdf-and-open` で好みのコマンドを使いましょう．

私は platex と dvipdfmx との組合せで使っているので:

    (require 'org-latex)
    (setq org-latex-to-pdf-process '("platex %b" "platex %b" "dvipdfmx %b"))

のような設定にしています．

## 参考

https://github.com/tnoda/.emacs.d/blob/master/tnoda.org#use-platex-and-dvipdfmx-to-process-a-latex-file-to-a-pdf-file
shebang

スクリプトの先頭行に書かれている `#!/bin/sh` の事を shebang (シェバング) と呼びます。
古くはプログラムが実行された際にローダがファイルの先頭 2 バイトを参照してファイルの形式を調査した事に由来しているらしく、例えば FreeBSD や Linux の最近の実行可能ファイルであれば **7f45(16)** になっています (その後 **4c46(16)** と続いているので、ファイルをダンプすると **ELF** と読めます)。
ファイル先頭のこの値の事を magic number とも呼び、初期の *file(1)* コマンドはこの magic number を読み取ってファイルの種類を報告していたそうです (今の *file(1)* も基本は magic number を利用している筈です)。

shebang は通常はスクリプトを実行するインタプリタのパスを記述しますが、実は実行可能なプログラムであればインタプリタ以外も記述できるので、あるプログラムの設定ファイルの先頭にプログラム名自身を書いておくとその設定でプログラムが実行できて実は便利です。

例えば *sshd(8)* を **/usr/local/etc/sshd/mysshd.conf** を設定ファイルとして起動したい場合、

```sh:
# /usr/sbin/sshd -f /usr/local/etc/sshd/mysshd.conf

```
    
通常はこの様に起動します。

ところが設定ファイル **/usr/local/etc/sshd/mysshd.conf** の先頭に shebang として **#!/usr/sbin/sshd -f** を追加して /usr/local/etc/sshd/mysshd.conf に実行権限を与えると、設定ファイルを実行する事で *sshd(8)* が起動できるので便利です。

```sh:
# cat /usr/local/etc/sshd/mysshd.conf
Port        20022
Protocol    2
    :
# ex -s !$ <<- EOF
ex -s /usr/local/etc/sshd/mysshd.conf <<- EOF
>  0i
>  #!/usr/sbin/sshd -f
>  .
>  w!
>  EOF
# head !$
head /usr/local/etc/sshd/mysshd.conf
#!/usr/sbin/sshd -f
Port        20022
Protocol    2
    :
# chmod 755 !$
chmod 755 /usr/local/etc/sshd/mysshd.conf
# !$
/usr/local/etc/sshd/mysshd.conf
# netstat -anf inet | egrep '^Active|^Proto|\.20022'
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  *.20022                *.*                    LISTEN
    
```

> この実行例では /usr/local/etc/sshd/mysshd.conf の先頭1行目に shebang を挿入するために *ex(1)* をヒアドキュメントと共に利用していますが、*ex(1)* は中身は *vi(1)* と同じですのでこの使い方を覚えておくと何かと便利です。

一時期 shebang に `#!/usr/bin/env` を記述する方法が一部で流行した様ですが個人的には**絶対にお勧めしません**。
*env(1)* は実行している環境に影響を受けるので、異なる環境で実行した場合にインタプリタが変わってしまう可能性があり、動作が一意に決定できない危険性があるからです。
例えば個人の環境で開発したスクリプトを *cron(8)* に設定した際にインタプリタが異なってしまい動作しなくなった等の実例が沢山あります。
以前別な投稿でも書きましたがスクリプト内部で利用するコマンドはフルパスで指定した方が良いと思います。
Node.jsのモジュールを探すのに便利なサイト

自分がよく使うサイトを紹介します。もし他にも便利なサイトがあれば教えてください。

* [Node.JS Modules](https://nodejsmodules.org/)

    タグのインクリメンタル検索機能が便利。希望の機能を持ったモジュールが探しやすくなっています。

* [The Node Toolbox](http://nodetoolbox.com/)

    カテゴリ毎にモジュールが分類されています。また、githubリポジトリのFork数やWatch数も表示されるので、人気度合いや信頼性の目安も量れます。
    ただ、サイトが若干重めなのがたまにキズ。

* [npm registry](https://npmjs.org/)

    npm本家です。過去1日、1週間、1ヶ月のダウンロード数が分かるので、こちらも似たようなモジュールの中でどれを使おうか悩んだ時の参考になります。

* [github - connect Contrib Middleware](https://github.com/senchalabs/connect/wiki)

    connectのミドルウェアに限定したモジュール一覧です。自分でミドルウェアを作る前に、すでに同じような機能のものがないか探したりします。
Objective-C 三項演算子の活用


[三項演算子(条件演算子)](http://ja.wikipedia.org/wiki/条件演算子)使ってますか？
可読性が落ちたり向上したりと使いどころを考える必要がありますが、個人的には結構好きで使ってます。

## 三項演算子とは
	<条件式> ? <真式> : <偽式>

if文で書くと…

	if (<条件式>) {
		<真式>
	} else {
		<偽式>
	}

## よく使う例

初期化とか

	// 大きい値の方がsizeに入る
	CGFloat size = width < height ? height : width;

NSLog内とか

```objectivec:
BOOL selected = YES;
NSLog(@"状態は？ %@", selected ? @"選択されている" : @"選択されていない");
```

メソッドとか

```objectivec:
- (void)setHidden:(BOOL)hidden animated:(BOOL)animated
{
	// durationが0だとアニメーションにならない
    [UIView animateWithDuration:animated ? 0.3f : 0.f animations:^{
        self.alpha = !hidden;
    }];
}
```

使いどころによっては、簡潔に書けるかと思います。
分数を小数にする。

分数を小数にする方法です。
循環小数は、循環部を {, } で囲んで表記することにします。

例： 1/3 -> 0.{3}
　　https://github.com/katoy/node-rational/blob/master/test/testParseRepeatStr.coffee
　　　には 1/n (n = 1, ... 120) の小数表現の一覧があります。

coffee-script で書いてます。

https://github.com/katoy/node-rational/blob/master/src/Rational.coffee から引用（145 行目付近）

```katoy/node-rational/blob/master/src/Rational.coffee
  @getRepeatString: (a, b) ->
    # See - http://ja.doukaku.org/9/                                                                                                                
    #       > 分数を小数に展開 (循環小数は 0.{3} のように {} で循環部を示す)                                                                        

    a = bignum(a) unless a instanceof bignum
    b = bignum(b) unless b instanceof bignum
  
    sign = if (a.div(b).ge(0)) then "" else "-"
    a = a.abs()
    b = b.abs()
  
    return "#{sign}#{a}" if b.eq(1)
  
    m = []  # 余りを保存する                                                                                                                        
  
    r = "#{a.div(b).toString()}."
    a = a.mod(b)
  
    while a.gt(0)
      m.push a.toString()
      a = a.mul(10)
      r += "#{a.div(b).toString()}"
      a = a.mod(b)
  
      i = m.indexOf(a.toString())
      # console.log "------ i=#{i}, #{util.inspect(m, false, null)}"                                                                                
      if i >= 0  # 余りが繰返えされたので...                                                                                                      
        r = r.substring(0, i+2) + '{' + r.substring(i+2) + "}"
        break
  
    "#{sign}#{r}"
```

テスト
======
https://github.com/katoy/node-rational/blob/master/test/testParseRepeatStr.coffee から引用 (165行目付近)

```katoy/node-rational/blob/master/test/testParseRepeatStr.coffee
describe "getRepeatString", ->
  it "1/3 -> 0.{3}", ->
    assert.equal Rational.getRepeatString(1, 3), "0.{3}"

  it "1/2 -> 0.5", ->
    assert.equal Rational.getRepeatString(1, 2), "0.5"
```
Chrome ExtensionとOn Demand JavaScript

# Chrome Extension + On Demand JavaScript

extensionにおいて、content scriptは唯一表示中のコンテンツ(要するにDOM)を参照/更新することが可能なコンポーネントである。

しかし、content scriptはDOMへのアクセスは可能だが、windowオブジェクトは共有しない。
例えば、extension側のcontent scriptに下記を書いたとして、

```js:SomeContent.js
var hoge = "hoge";
```

現在表示しているページ内のスクリプトに下記が仮に書いてあったとしても、上記で定義したhogeは表示されない。

```js:Original.js
console.log(hoge) // ->undefined
```

extensionで自作のJavaScriptと表示中のページのjsソースにて、windowオブジェクトを共有するには、下記のようにする。

```js:manifest.json
"content_scripts":[{
  "js":["loader.js"], // 読み込み用のjs
  "mathces":"http://example.com/*",
  "run_at":"document_start"
}],
"web_accessible_resources":[
  "loadee.js" //グローバル変数を共有する.js
]
```

以下のloader.jsで、読み込み対象のjs(ここではloadee.js)を読み込む(所謂 On Demand JavaScriptの方法)。

```js:loader.js
var targets = ['loadee.js'];

targets.forEach(function(js){
	var scriptElement = document.createElement('script');
	scriptElement.setAttribute('src', chrome.extension.getURL(js));
	document.documentElement.appendChild(scriptElement);
});
```

なお、exstension内の.jsをページからロードさせるためには、manifest.jsonのweb_accessible_resourcesに名称を記載しておく必要がある(loader.jsとmanifest.jsonの両方に'loadee.js'が登場するのはイケてないが。。。)。

また、複数のjsファイルをこの方法でロードさせても、1つ1つのscript読み込み処理が非同期で進行されるため、ロード完了の順序性が保証されない点に注意。
cocos2d-xをXcodeで開発する際のリソース

cocos2d-xをXcodeで開発する時にリソースは、
ファイルのフォルダ階層を維持してくれた方が都合が良い
（androidのリソースはフォルダ階層を使っての参照っぽい）

androidビルド時のスクリプトをイジって、
iOSと同じようにフォルダ階層を消す方法もあると思うが、
間違えそうだし、個人的にめんどくさい。

なので、
フォルダ階層をそのまま維持してくれる方法
http://eien.seesaa.net/article/238085999.html

ファイルを追加する時に、
「Create folder references for any added folders」
コッチを選択して追加。

こうする事で、アプリになってもフォルダ階層を維持してくれる。

今まで全然使ってなかった設定だ^^;
Ubuntu12.04にPython3.3をインストール

[パーフェクトPython](http://www.amazon.co.jp/dp/477415539X/)の解説を参考に、Ubuntu12.04にPython3.3を入れる。

### 現状チェック

```
$ which python
/usr/bin/python
$ python --version             
Python 2.7.3
```

### インストール
ソースから入れる

```
$ sudo apt-get install zlib1g-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev libbz2-dev libgdbm-dev tcl-dev
$ wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tar.bz2
$ tar xjf Python-3.3.0.tar.bz2
$ cd Python-3.3.0
$ ./configure --prefix=$HOME/python/python3.3
$ make && make install
```

### 仮想環境とpip

pyvenvで仮想環境を作る。
rbenvとかperlbrewみたいなもの
defaultという名前で作る。

```
$ cd ~/programing/projects
$ ~/python/python3.3/bin/pyvenv default
$ source default/bin/activate
```

[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)だと、この時点で行頭に(default)と表示されるようになった。
どうやら、環境が切り替わったらしい

```
(default) $ which python
/home/da1/programing/projects/default/bin/python
(default) $ python --version
Python 3.3.0
```

できてる。

pipのインストール
easy_install -> pipの順で

```
$ wget http://python-distribute.org/distribute_setup.py
$ python distribute_setup.py
$ easy_install pip
```

最後に、対話環境のIPythonのインストールしておしまい

```
$ pip install ipython
```
C言語の不思議な仕様


```c
#include <stdio.h>

int main(){
  (&puts)("&puts");
  (puts)("puts");
  (*puts)("*puts");
  (****puts)("****puts");

  return 0;  
}
```

怪しげで不自然だけど、正しいC言語ではコンパイルエラーにならない。
4つの `puts` はきちんと呼び出され、引数の文字列が標準出力に出る。

```c
#include <stdio.h>

int main(){
  int a=12;
  int b={34};
  int c={{56}};
  printf( "%d %d %d\n", a, b, c );
  return 0;
}
```

こっちは今ひとつ自信がないけど、これもたぶん全部合法。
a, b, c は 12, 34, 56 で初期化される。
PreloadJSを使ってらくらく非同期読み込み


##### PreloadJSを使えば非同期ファイル読み込みと、その処理がとっても楽に書けるようになる(はず)
---

[http://www.createjs.com/#!/PreloadJS](http://www.createjs.com/#!/PreloadJS "PreloadJS")
---
#### コードサンプル:画像を読み込むたびにbodyに追加していく


``` preload.html
<!DOCTYPE html>
<html>
	<head></head>
	<body>
		<script src="./preloadjs-0.3.0.min.js"></script>
		<script src="./preload.js"></script>
	</body>
</html>
```

```preload.js
function init(){
	// LoadQueueのインスタンス作成
	// 引数にfalseを指定するとXHRを使わずtagによる読み込みを行います
	var queue = new createjs.LoadQueue(true);

	// 読み込むファイルの登録。
	var manifest = [
		{"src":"./image1.jpg","id":"image1"},
		{"src":"./image2.jpg","id":"image2"},
		{"src":"./image3.jpg","id":"image3"}
	];
	// src,idともに省略可能。省略した場合はパスがsrcとidにセットされる
	// var manifest = ["./image1.jpg","./image2.jpg","./image3.jpg"];

	// manifestの読込
	queue.loadManifest(manifest,true);
	// 任意のタイミングで読込を開始したい場合、第2引数にfalseを指定し、queue.load()を実行する
	// queue.loadManifest(manifest,false);
	// queue.load();

	// ファイルが1つ読込完了するたびにfileloadイベントが発生
	// fileloadイベントにメソッドを割り当てる
	queue.addEventListener("fileload",handleFileLoad);	
	// 全ファイルの読み込みが終わった時completeイベントが発生する
	queue.addEventListener("complete",handleComplete);

	// ファイルが1つ読込完了すると呼ばれる。引数にファイルの読込結果を含むオブジェクトが渡される
	function handleFileLoad(event){
		// .itemにはファイルの情報が格納されています。詳細は後述
		var item = event.item;
		if(item.type === createjs.LoadQueue.IMAGE){
			document.body.appendChild(event.result);
		}
	}

	// ファイルがすべて読込完了すると呼ばれる
	function handleComplete(event){
		// completeハンドラに渡される引数が持っているgetResult()にidを指定してファイルオブジェクトを取得する
		// var file = event.getResult(id); manifestで指定したid
	}

	window.addEventListener('load',function(){
		init();
	});
}
```
### おまけ
#### .itemのもつプロパティ

```omake.js
	function handleFileLoad(event){
		var item = event.item;		// loadしたファイルの情報をもつitem
		var type = item.type;		// 'image'や'javascript'や'css'などファイルの種類
		var ext  = item.ext;		// 拡張子　('jpg'などドットを含まない拡張子)
		var id   = item.id;			// loadManifest()登録時に指定したid
		var src  = item.src;		// loadManifest()登録時に指定したURL・パス
		var tag  = item.tag;		//　読み込んだファイルを扱えるtag名 (画像なら'img' CSSなら'style'
		// この中でも特にtypeはファイルの種類に応じた処理を行うためによく使うことになると思います

		// typeはcreatejs.LoadQueueが持つ定数と比較することで種類のチェックが行えます		
		// createjs.LoadQueueの定数(種類)の一覧と中身
		createjs.LoadQueue.CSS				// "css"
		createjs.LoadQueue.IMAGE			// "image"
		createjs.LoadQueue.JAVASCRIPT		// "javascript"
		createjs.LoadQueue.JSON				// "json"
		createjs.LoadQueue.SOUND			// "sound"
		createjs.LoadQueue.SVG				// "svg"
		createjs.LoadQueue.TEXT				// "text"
		createjs.LoadQueue.XML				// "xml"
}
```

PreloadJSで快適非同期ライフを(・ω<)☆彡
Passenger Standaloneを使ってみた


使ってみたよ。「gem install passenger」一発だったので楽ちんでした。

## インストール

    gem install passenger

必要に応じて rbenv rehash などを行う。

## 使い方

Railsアプリケーションのディレクトリ移動し、起動。

    passenger start


ポートを指定する場合は -p オプションを使う。

    passenger start -p 8080

ヘルプ。

    passenger --help

## デーモンとして起動

--daemon または -d オプションをつけるとデーモンとして起動してくれる。

    passenger start --daemon

停止。

    passenger stop  

### デーモンの停止とポート番号

start時にポート番号を指定してデーモンを起動した場合、stopにもポート番号を指定する必要がある。

ポート3001を指定して起動した場合、

    passenger start -p 3001 -d

ポート番号を指定せずに stop すると「3000番で起動してる passenger は無いよ」と怒られる。

    passenger stop
    #=> 3000番で起動してる passenger は無いよと怒られる

正しく停止するにはポート3001を指定して stop する。

    passenger stop -p 3001


## 参考

- passenger user guide
  - http://www.modrails.com/documentation/Users%20guide%20Standalone.html
読み込みパーミッション

linuxには読み込みパーミッションがあります。
このパーミッションはファイルをリードする際に必要になるパーミッションです。

```:bash
--wxr-xr-x.  1 hogehoge hogehoge    32  3月 11 21:18 test.txt
```

のようなファイルに対してopenシステムコールをするとエラー番号(EACCES)が発生して
エラーとなります。これは、元々のファイルがオーナーに対して読み込み権限がないのでこの結果はうなずけます。

パーミッションを途中で書き換えるとどうなるのか？

```:bash
-rwxr-xr-x.  1 hogehoge hogehoge    32  3月 11 21:18 test.txt
```

のようなファイルに対してopenシステムコールをするとこれは、成功してファイルディスクリプタが返ります。次にreadシステムコールを呼ぶ直前にtest.txtの読み込み権限をなくします。これで、上と同じ状態です。この時は、エラーにならず中身が読めます。

readシステムコールは、エラー番号(EACCES)を返すことがないようなので、これはおそらく仕様みたいです。今まで知らなかった。
同じコードは２回まで DRY! -いいエンジニアを目指してみるなう-


#同じコード（処理）は２回しか書かない

##１回目は普通に実装し、２回目で共通・抽象化する　DRY!\(Don't Repeat Yourself!)

重複を見たら疑うこと。

ライブラリを作るときは特にそうだけれど、
実は、プロダクションコードでも大事な気がする。

### 実例 外部APIのアクセスキーが分散して記述してある

例えば、開発用にと思って、とりあえずAPIのアクセスキーをベタ書き（ハードコーディング）をしていた。
その後、途中で設定ファイル・基底クラスを作り、他のコードはそちらを参照するようになった。（前に書いたコードは直し忘れた）

リリース・テスト時は、開発時とアクセスキーが変わらないので気づかない。（ちゃんと動く）


その後、アクセスキーが更新されると、、、、
#####・一部だけが動かない（エラー）
または、
#####・一部だけがおかしい（データ・挙動など）
前者だったら気づきやすいからまだいいけれど、後者は特に大規模になってくるとわかりにくい。

おそらく、再現条件に共通項目が少ないため、この重複が原因だと発見するのに時間がかかる。
ヘタすればバグに気づかない可能性すらあり。

これはテストでも網羅しづらい実装バグ。（結合テストの領域になるのかな？）
こういうのはリファクタの対象になるコードだけど、きちんと動くこともあり、「まあいっか」ってことで優先度低めになりがち。

### 日頃から重複するコードを書かない癖が大事なのでは。重複したら「なんかおかしいかも・ベストプラクティスじゃないかも」と疑ってみる。

注：ただし、DRYは原理原則というほどではなく、時と場合にもよるようです
[DRY原則の利用: コードの重複と密結合の間]
(http://www.infoq.com/jp/news/2012/05/DRY-code-duplication-coupling)

 See also [Don't repeat yourself - Wikipedia]
(http://ja.wikipedia.org/wiki/Don't_repeat_yourself)
Pygments を使ってコマンドライン上でシンタックスハイライト

HTML上のシンタックスハイライトによく使われている [pygments](http://pygments.org/) ですが、 HTML 以外の Formatter も持っています。

ターミナル上でファイルの中身を表示したい、でも vim 等のフルスクリーンエディタは立ち上げたく無い場合は、 `pygments ファイル名` と実行すると、そのファイルがターミナル上にシンタックスハイライトされて表示されます。
GitLabをサブディレクトリで動かすときの罠

GitLab 5.0からインストールが簡単になるらしいので、フライング気味ですがmasterの最新を入れてみました。
インストール自体は、[README](https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md)を参考にして比較的スムーズにいきました。

ただ、http://example.com/gitlab/ のようにサブディレクトリのURLに割り当てたところ、gitのcloneやpushがうまくいきませんでした。
下記のようなエラーが出ます。

```
http:// ... /hoge.git/info/refs not found: did you run git update-server-info on the server?
```

どうも未修正のバグらしく、[こちらのパッチ](https://github.com/gitlabhq/gitlabhq/issues/1228#issuecomment-14555439)を当てたら直りました。

ほかにも[通知メールのURLが間違っている](https://github.com/gitlabhq/gitlabhq/issues/3171)など、サブディレクトリで起動するといくつか地雷があるようです。

手元では他に大きな問題は起きていませんが、
できればサブドメインを割り当て、ルートディレクトリで起動するのが無難かもしれません。
find + sed で一斉置換

```bash:sh
# カレントディレクトリ以下のファイルすべての中の HOGE を MOGA に置換
$ find . -type f -print0 | xargs -0 sed -i -e "s/HOGE/MOGA/"
```

```bash:sh
# 対象ファイルをファイル名のパターンで限定する場合は find にオプションを
$ find . -type f -name "*.yaml" -print0 | xargs -0 sed -i -e "s/HOGE/MOGA/"
```

```bash:sh
# 置換時にバックアップファイルを作成する場合は sed の -i に拡張子をつける
$ find . -type f -print0 | xargs -0 sed -i.bak -e "s/HOGE/MOGA/"
```

おまけ

```bash:sh
# find + grep で HOGE を内容に含むファイルを探す(調べたファイル名を出力しつつ)
$ for file in `find /path/to/dir -name "*.gz" -type f`; do echo $file; less $file | grep 'HOGE'; done;
```
日時をファイル名に付ける

ファイル名などに日付をつけて保存したい場合が結構あります。
バックアップを作成するときに今日の日付を使うとかです。
dateコマンドを使えばよいようです。
下記例は、引数で指定したディレクトリに日付をつけて圧縮して保存するスクリプトです。

```bash
#!/bin/bash

if [ $# -ne 1 ]; then
	echo "Usage : $0 directory"
	exit 1
fi

if [ ! -d $1 ]; then
	echo "$1 Not found!!"
	exit 1
fi

tar jcvf $1_`date +%Y_%m_%d`.tar.bz2 $1
```
PHPUnitで関数が呼び出されたことをテストする

# テスト対象コード
```php:Sample.php
<?php

class Sample
{
    public function error()
    {
        $this->redirect();
    }
    
    public function redirect()
    {
        header("Location: http://github.com/");
    }
}
```
- error() は redirect() を呼び出すことを検証したい

# テストコード
```php:SampleTest.php
<?php

require_once 'Sample.php';

class SampleTest extends PHPUnit_Framework_TestCase
{
    public function testCallRedirectWhenError()
    {
        $sample = $this->getMockBuilder('Sample')
                       ->setMethods(array('redirect'))
                       ->getMock();
        $sample->expects($this->once())->method('redirect');

        $sample->error();
    }
}
```

# テスト実行結果
```console
$ phpunit SampleClassTest.php 
PHPUnit 3.7.13 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.50Mb

OK (1 test, 1 assertion)
```

- redirect()のheader()を無害化しつつredirect()の呼び出しについての検証結果を得ることができた
QiitaMail 0.3.0 - 出力メッセージ調整、From:を指定出来るように

QiitaMailを0.3.0にアップデートしました。

## インストール

```
gem install qiita_mail
```
## 特徴
- email_from: 属性を追加(From:を指定可能に、必要無い人は設定しなくても大丈夫です)
- 出力メッセージに現在時刻を追加([定期実行](http://qiita.com/items/984e02f4d8ce33def6a0) する時に便利)

[[記事本文へ]](http://ongaeshi.hatenablog.com/entry/2013/03/11/191732)
Objective-Cの文字列を＋（プラス演算子）で連結できるようにするフレームワークを作ってみた

NSStringを+で連結するためのフレームワークを作ってみました。
具体的には @"hoge" + @"piyo" で @"hogepiyo" になります。
現状iOSとiOSシミュレータ向けUniversal Frameworkです。

使い方はこんな感じです。

### 1. 落としてきます
下記リンク先のZIPボタンを押して、フレームワークを落としてきます。
[oden/OCppOperator - GitHub](https://github.com/oden/OCppOperator "oden/OCppOperator - GitHub")

### 2. プロジェクトに追加します
落としてきたZIPファイルを解凍するとOCppOperator.frameworkというフォルダがあるので、
それをXcodeのプロジェクトのFrameworkグループへドラッグアンドドロップで追加します。

### 3. 使います
Objective-C++を用いているので、＋で文字列連結するソースの拡張子は、
*.mmに変更してください。

具体的な使用例としては下記のような感じです。

```objc:main.mm
//
//  main.mm
//  Perorist
//
//  Created by oden on 13/03/11.
//  Copyright (c) 2013年 JITAKUKEIBI INC. All rights reserved.
//

#import <OCppOperator/OCppOperator.h>
// MARK: 1.フレームワークのヘッダファイルを#importします

int main(int argc, char *argv[])
{
    // MARK: 2.先頭のオブジェクトをID型にキャストすると、+で文字列結合できます。
    NSString* azpr = (ID)@"あずにゃん" + @"（＾ω＾）" + @"ｐｒｐｒ";
    NSLog(@"%@", azpr);
    // 結果: あずにゃん（＾ω＾）ｐｒｐｒ
    
    // MARK: 3.キャストの代わりにこんなんでも行けます。
    NSString* kbpr = @"こばとちゃん".ID + @"（＾ω＾）" + @"ｐｒｐｒ";
    NSLog(@"%@", kbpr);
    // 結果: こばとちゃん（＾ω＾）ｐｒｐｒ
    
    // MARK: 4.ついでにNSNumberも行けます。
    NSString* ykpr = @"長門".ID + @"（＾ω＾）" + @"ｐｒｐｒ" + @" x " + @(15532);
    NSLog(@"%@", ykpr);
    // 結果: 長門（＾ω＾）ｐｒｐｒ x 15532
    
    return 0;
}
```

キャストが微妙にカッコ悪いですが（括弧だけにっ！）、
気が向いたら使ってあげてください。

また、ご意見・ご要望等を頂けると、泣いて喜びます。
Rails3.0.x -> 3.2.x (´∀｀∩)↑age↑



## Rails3.0.x -> 3.1.x の変更

http://ja.asciicasts.com/episodes/282-upgrading-to-rails-3-1

下記の行を削除するかコメントアウトします。

```ruby:app/config/environments/xxx.rb
#  config.action_view.debug_rjs             = true
```

## Rails3.1.x -> 3.2.x の変更

http://railscasts.com/episodes/318-upgrading-to-rails-3-2?language=ja&view=asciicast

開発用の環境に以下の行を追加します。

```ruby:app/config/environments/development.rb
config.active_record.mass_assignment_sanitizer = :strict
config.active_record.auto_explain_threshold_in_seconds = 0.5

```

テスト用の環境に下記の行を追加します。

```ruby:app/config/environments/test.rb
config.assets.allow_debugging = true
```

　
---
　
　
　
## トラブルシューティング(上記の対応で解決)

#### ■ エラー

```Bash:log
undefined method `debug_rjs=' for ActionView::Base:Class
```

#### 対応
下記の行を削除するかコメントアウトします。

```ruby:app/config/environments/xxx.rb
#  config.action_view.debug_rjs             = true
```
---

#### ■ エラー

```Bash:log
undefined method `page_cache_extension' for ActionController::Base:Class
```

#### 対応
開発用の環境に以下の行を追加します。

```ruby:app/config/environments/development.rb
config.active_record.mass_assignment_sanitizer = :strict
config.active_record.auto_explain_threshold_in_seconds = 0.5
```

テスト環境に下記の行を追加します。

```ruby:app/config/environments/test.rb
config.assets.allow_debugging = true
```

---

#### ■ エラー

```Bash:log
undefined local variable or method `trans_sid' for ApplicationController:Class
```

#### 対応

jpmobileのバージョンを上げると動きます。

---

#### ■ エラー

```Bash:log
DEPRECATION WARNING: You have Rails 2.3-style plugins in vendor/plugins! Support for these plugins will be removed in Rails 4.0. Move them out and bundle them in your Gemfile, or fold them in to your app as lib/myplugin/* and config/initializers/myplugin.rb. See the release notes for more on this: http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released. (called from <top (required)> at /Users/me/myapp/config/environment.rb:6)
```

#### 対応

gemの置き場所が変わるよ（Rails 4.0.xではサポートされなくなるよ）という警告。問題はなさそう。
node.js開発環境を整理 yeomanの導入

# node.jsの削除と再インストール

Ubuntuのapt経由で入れていたnode.jsが古くなっていたので
`sudo aptitude purge nodejs nodejs-dev npm`
で消して

http://nodejs.org/
で最新版を確認

nave経由でインストールする

```bash
cd repos
git clone https://github.com/isaacs/nave.git
cd nave
./nave.sh install 0.8.22
./nave.sh use 0.8.22
node -v
```

# 開発支援系パッケージのインストール

ついでにyeoman, grunt.js, bowerなどの開発支援系パッケージも入れてみる
`npm install -g yo grunt-cli bower `

http://yeoman.io/
http://gruntjs.com/
http://twitter.github.com/bower/

scssをコンパイルするにはrubyとcompass gemが必要
`sudo gem install compass`

# yeomanをつかうテスト

```bash
mkdir yo-webapp
cd yo-webapp
yo webapp

npm install && bower install

grunt
grunt server
```

http://localhost:9000/
を開くと生成されたscaffoldが表示できた。

`yo webapp`っていうのはデフォルトでwebappのscaffoldがインストールされているから使える
angular.jsなどを使いたいと思ったら

```bash
npm install generator-angular
mkdir yo-angular
cd yo-angular
yo angular
npm install && bower install
grunt
grunt server
```

yeoman 0.9まではbackboneにも対応していたようだが、1.0になってから動かなくなっている。。

-----

# yeomanでできること

基本的にWebアプリのscaffoldジェネレーター。
yeoman0.9とyo1.0以降で作法がだいぶ変わっている。

npm, bower, gruntのラッパーのような動きをする。

`yo webapp`コマンドで
npmの設定ファイルpackage.jsonと、
bowerの設定ファイルcomnponent.jsonと、
gruntの設定ファイルGruntfile.jsとを生成し、
index.htmlやcssなど他のファイルを配置する。

`npm install && bower install`コマンドを実行することで
gruntのライブラリやjavascriptライブラリを取得し配置する。


Webアプリケーションフレームワークを使うのであればそれぞれの配置の作法があるだろうから、
ちょっとしたjsを活用したWebサイトを作る時の最初の手間を省いたり、
クライアントサイドとサーバーサイドでくっきり分かれているような時にクライアントサイドを作るのに使うのがいいのではないだろうか。。


# bowerでできること

クライアントサイドのjsライブラリのパッケージ管理・バージョン管理ができる。



# gruntでできること

gruntも0.3と0.4でだいぶ作法や機能が変わったようだ。

- jsのlint (文法チェック）
- jsのtesting（プラグインで任意のテストドライバーを選択可能）
- css preprocessorのコンパイル（rubyのcompass gemを呼び出す）
- css & js build ( minify )
- serverを立ててブラウザで開く
- ファイルの変更を監視して更新
- シェルコマンドの実行

以上のような、javascriptのコミット、リリース、デプロイにむけた準備全般が可能。
公開されているプラグインによってタスクを追加できる。

jsテストに関して、phantomjsは必要であればnpmパッケージのgrunt-lib-phantomjsなどの依存でバイナリがダウンロードされて実行可能な状態になるからインストールなどは気にしないでOK。

gruntはJavascript/Web開発に関しては非常に万能で強力なんだけど、設定ファイルは書くのが結構大変で、プロジェクトのディレクトリ構成などによってはどうしても他の人が書いたものそのままでは困ることがある。
そこである程度、標準的なディレクトリ構成などの作法を提供しようというのがyeomanの方向性だと思われる。
FuelphpでControllerからViewに値を渡す

副題：kitcometalsから値段を持ってくる(3)
完成しただけで不満はいっぱいあるよ！ということで改良編。

環境
・Windows7Pro
・Xampp 1.8.1（英語）　apacheとmysqlを稼働させておく。
・fuelphp 1.5.3

前回は"C:\xampp\htdocs\kitco\fuel\app\views\kitco\_form.php"に数字を取りに行く処理を書いたけど、これだとEditの時等のように必要がない時であっても_formが呼び出されるたびに再計算しに行くので読み込みが遅くなるという話があり（１秒程度ですが）。こんなスマートじゃない話があってたまるか！「俺はエレガントに解決するんだ」とやり直しを決意。
余談ですが高校の時の数学教師に「問題はエレガントに解決するものだ」と教えられたせいでこんな子になりました。

そもそもこれは本来"C:\xampp\htdocs\kitco\fuel\app\views\kitco\create.php"でやればいいんだろうと思って打ち込んだものの、どうやら値を引きついでくれないらしいのでとり会えずということでフォームの表示直前で処理したという話。つまるところコントローラ側で計算して引き渡せばいいんじゃないのと。

いろいろ調べた結果、
http://core-tech.jp/gijutsublog/2012/07/18/29

の方法で実装。具体的には
1.Controllerのaction_create()で計算する（詳細略）
2.データを$dataに配列として入れる

```
$data = array();
$data['value'] = $value;
$data['daybefore'] = $daybefore;
```

3.`View::forge('kitco/create',$data);`して引き継がせる
4.create.phpで`render('kitco/_form', $__data);`して再引き継ぎ

３までの情報はかなり落ちてるんだけど、４の情報が抜け落ちてるのか古くて対応してないのかで正解にたどり着くまで大分時間を食いました……が、コレで必要な時だけ外部アクセスするようになっていろいろな意味で良い感じになるかと。
Macで android chrome のリモートデバッグを利用するシェルスクリプト

もろもろリモートデバッグを利用する設定は終わっている状態
（やり方は色んな所で案内されています）
で、下記のシェルスクリプトを作成。

    #!/bin/sh

    /Applications/adt-bundle-mac-x86_64/sdk/platform-tools/adb forward tcp:9222 localabstract:chrome_devtools_remote
    open /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome http://localhost:9222/

(パスは適宜修正してください)

あとは実行権限をつけて実行する。
unlink(tempdir(), recursive = TRUE)

Rのセッション中に利用される
一時フォルダは__一つ__だけなので，

```r
unlink (tempdir(), recursive = TRUE)
```

などと *recursive* を ON にして実行してしまうと，
そのセッションでは，これ以降一時フォルダを
利用する関数類は使えなくなってしまうのであった．．．

```r
> # tempdir は有効
> fun <- cxxfunction(signature(vx = "integer"), body = src, plugin= "Rcpp")
> fun(1L:10L)
[1] 3628800
> unlink (tempdir(), recursive = TRUE) # tempdir()を削除してしまう
> fun <- cxxfunction(signature(vx = "integer"), body = src, plugin= "Rcpp")
 以下にエラー file(file, ifelse(append, "a", "w")) : 
   コネクションを開くことができません 
 追加情報:   警告メッセージ： 
In file(file, ifelse(append, "a", "w")) :
   ファイル '/tmp/RtmpGc6Qlv/file1f2395bf85d.cpp' を開くことができません: そのようなファイルやディレクトリはありません 
```
文字ベクトルをテキストファイルに偽装


RMeCabの文章行列作成関数は，インプットとして
フォルダないしファイルを想定している．

ただ文字ベクトルを指定して，文書行列を作成
したい場合があったりする．Rには
textConnection()
という関数があって，文字ベクトルをファイルに見せかける
方法があるのだけど，RMeCabの関数内部ではfile.exists()を
使ってチェックを行なっているので，偽装が効かない．

それで文字列ベクトルの要素数が少なければ，以下のように
一時フォルダに一時ファイルを作成して，処理できるかな．

```
dummy <- c ("私は真面目な学生です。", "彼女は数学専攻の学生です。", "彼らは物理学を専攻している。")
tmpdir <- tempdir ()

for (i in seq(dummy) ){
  td <- tempfile("tmp", tmpdir = tmpdir)
  write( dummy [i] ,  file = td)
}

library (RMeCab)

x <- docMatrix (tmpdir)
unlink (tmpdir, recursive = TRUE)  # tmpファイルを削除
```
RPubs に投稿するとき SSL エラーが出る場合の対処法

[RPubs](http://rpubs.com/) に投稿しようとしたとき、

> SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

というエラーが出た場合、ドキュメント(`.Rmd`)ファイルと同じ場所にある `.Rprofile` ファイルに下記を追加すればうまくいくようになります。
この文をただ実行するのではなく、`.Rprofile` に追加しなくてはなりません。

```r
options(rpubs.upload.method = "internal")
```

`.Rprofile` がドキュメントと同じ場所に無い場合は、新しくファイルを作成して下さい。
グローバル `.Rprofile` に追記してもいいようです。

参考：
http://support.rstudio.org/help/discussions/problems/4917-publishing-to-rpubs
wget(1) でファイル送信

*wget*(1) でファイルを送信する方法です。
想定しているのは 

```html:
<input type='file' enctype='multipart/form-data'>

```

が指定されたフォームによるファイル送信処理です。

通常の http ヘッダ以外に **Content-Type** と **boundary** を *wget*(1) の --header オプションで指定し、multipart/form-data 形式に整形した送信するファイルの内容を --post-data オプションで、もしくは格納したファイルのファイル名を --post-file オプションで指定するだけで送信できます。
Content-Type は **multipart/form-data**、boundary は送信するデータの中に含まれない任意の文字列を指定すれば問題ない様です。

multipart/form-data 形式は以下の形式に整形します。

```
--任意の文字列
Content-Disposition: form-data; name="フォーム名"; filename="ファイル名"
Content-Type: text/plain
(空行)
ファイルの中身
(空行)
--任意の文字列

```

シェルスクリプトなどから利用する場合は関数にしてしまうのが良いと思います。
ファイルの中身が少ない場合はバウンダリ情報などを全てシェル変数に格納して --post-data オプションによる指定をする事も可能ですが、シェル変数にはセットできる文字数に制限があるのでファイルの中身が大きい場合全ての情報をファイルに出力して --post-file オプションによる指定をして転送する必要がああります。

```sh:sample.sh
#
# ファイルのアップロード処理
#   $1: アップロードファイル
#   $2-: URL 情報など
#
upload()
{

	local   _boundary _data

	# バウンダリ文字列は日付時間を利用する
	_boundary="boundary-`date '+%Y%m%d'`"
	# 情報を格納するファイル
	_data="${TMP:-/tmp}/_putifle.${1##*/}"

	{
		cat <<EOF
--${_boundary}
Content-Disposition: form-data; name="${element}"; filename="${2}.tgz"
Content-Type: application/octet-stream

EOF
		cat ${1}
		cat <<EOF

--${_boundary}
EOF
	} > ${_data}

	# ファイル名を shift
	shift

	wget "--header=\"Content-Type: multipart/form-data; boundary=${_boundary}\"\
         --post-file=\"${_data}\"" ${*}

}

```

実際の処理ではエラーハンドリングなどが必要になると思いますので動作の骨子のみとなりますが、これで無事に転送できると思います。
Dartでオフラインリアルタイムどう書く第四回の参考問題 

第四回 オフラインリアルタイムどう書くの参考問題をDartで解いてみました。
http://qiita.com/items/9c514267214d3917edf2

```dart
import "dart:math";

final List<int> xs = [0, 1, 0, -1];
final List<int> ys = [1, 0, -1, 0];
final int WIDTH = 5;
final int HEIGHT = 5;
final int shiftSize = (log(WIDTH * HEIGHT) / LN2).ceil().toInt();

main() {
  test("", 8512);
  test("af", 4256);
  test("xy", 4256);
  test("pq qr rs st di in ns sx", 184);
  test("af pq qr rs st di in ns sx", 92);
  test("bg ch di ij no st", 185);
  test("bc af ch di no kp mr ns ot pu rs", 16);
  test("ab af", 0);
  test("ty xy", 0);
  test("bg ch ej gh lm lq mr ot rs sx", 11);
  test("ty ch hi mn kp mr rs sx", 18);
  test("xy ch hi mn kp mr rs sx", 32);
  test("ch hi mn kp mr rs sx", 50);
  test("ab cd uv wx", 621);
  test("gh mn st lq qr", 685);
  test("fg gl lm mr rs", 171);
  print("ok");
}

test(String input, int expect) {
  assert(countPath(input) == expect);
}

int str2node(String chr) => chr.codeUnitAt(0) - "a".codeUnitAt(0);

int pos2node(int x, int y) => y * WIDTH + x;

int node2path(int from, int to) {
  return (from < to) ? (from << shiftSize) + to : (to << shiftSize) + from;
}

int parsePath(String path) => node2path(str2node(path[0]), str2node(path[1]));

int countPath(String input) {
  Set<int> visited = new Set.from([0]);
  Set<int> stop = new Set();
  if(input != "") {
    stop = new Set.from(input.split(" ").map(parsePath));
  }
  return count(0, 0, visited, stop);
}

int count(int x, int y, Set visited, Set stop) {
  if(x == WIDTH - 1 && y == HEIGHT - 1) return 1;
  int sum = 0;

  for(var i = 0; i < 4; i++) {
    int nx = x + xs[i];
    int ny = y + ys[i];
    if(0 <= nx && 0 <= ny && nx < WIDTH && ny < HEIGHT) {
      int curNode = pos2node(x, y);
      int nextNode = pos2node(nx, ny);
      int path = node2path(curNode, nextNode);

      if(!visited.contains(nextNode) && !stop.contains(path)) {
        visited.add(nextNode);
        sum += count(nx, ny, visited, stop);
        visited.remove(nextNode);
      }
    }
  }
  return sum;
}
```
bash-completion install memo

macbook Air（OS-X 10.8.2）を利用している筆者の環境で、インストールした際のメモです。

モジュールゲット
curl -o bash-completion-2.0.tar.bz2 http://bash-completion.alioth.debian.org/files/bash-completion-2.0.tar.bz2

解凍＆展開
tar xvfj bash-completion-2.0.tar.bz2

./configure
make
make check
sudo make install

~/.bashrc insert follow lines
#Use bash-completion, if available
[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && ¥
    . /usr/share/bash-completion/bash_completion

bash_completionはdeclareやcompleteコマンドを利用して実現している。
しかし、bashの４系列でサポートされ始めたオプション（連想配列:
declare -Aや、補完文字のdefaultを設定するcomplete -D)を利用しているため、bash3系列では実行できない

もちろん、シェルを修正することで実行できるようにすることは可能と思ったが、それってbash-completionの1.3と同じになるんじゃねって疑問が拭えずに、1.3を利用することにしたw
 モジュールは、上記URLを2.0を1.3に変更するだけ。

インストール手順も基本は同じ、ただ、install先のdefault等が異なっている。
シンボリックリンクもうまくはれていないので、install後に手動でシンボリックリンクを張ってあげる

./configure
make
make check
sudo make install
sudo -s /usr/local/etc/bash_completion /etc/bash_completion
sudo -s /usr/local/etc/bash_completion.d /etc/bash_completion.d

以下、~/.bashrcに追加
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
jquery-rails で jquery 1.8系の最新を探す場合、CHANGELOG.md を見よう

jquery-rails で使用している jquery のバージョン情報は CHANGELOG.md に乗っています。

https://github.com/rails/jquery-rails/blob/master/CHANGELOG.md

これで確認すると, jquery 1.8 系は 現在jquery-railsの2.1.4 となっているようです。

なのでGemfileにバージョン情報を追記しておきましょう。

```ruby:Gemfile
gem 'jquery-rails', '2.1.4'
```

これで気軽にbundle updateを打ってもjquery 1.9系に変更されず、jquery 1.8系で作業が可能です。
rbenvでRubyのバージョンを指定する方法


rvmからrbenvに切り替えてみたのでrbenvがどういう方法でRubyバージョンを指定したり、状況によって切り替えることができるのか確認してみた。基本 https://github.com/sstephenson/rbenv/ の要約および動作確認、バージョンは0.4.0。

## shims

~/.rbenv/shimsにあるスクリプトが使うコマンド(irb, gem, rake, rails, rubyなど)を振り分けてくれる。shimsが振り分けた先を知るには```rbenv which```を使う。

```
$ rbenv which ruby
~/.rbenv/versions/1.9.3-p392/bin/ruby
```

**bundle**などgemでインストールして新しいコマンドが増える場合は~/.rbenv/shimsに振り分けるスクリプトを置かないといけないので```rbenv rehash```を唱える必要がある。


## RBENV_VERSION

ドキュメントによると **RBENV_VERSION** 環境変数が使うバージョンを決める。従ってコマンドラインからだと以下で切り替えられる。

```
$ export RBENV_VERSION=1.9.3-p392
$ ruby -v
ruby 1.9.3p392 ...
```

## global/local/shell

実際のところRBENV_VERSIONは直接意識しなくてもいいようになっている。

使うデフォルトのバージョンを固定したい場合は **global** を使う。すると *~/.rbenv/version* に使うバージョンが書き込まれる。

```
$ rbenv global 1.9.3-p392
```

プロジェクトで特定のバージョンを使いたいときは、 **local** を使う。すると、カレントディレクトリの *.ruby-version* に使うバージョンが書き込まれる。

```
$ rbenv local 1.8.7-p371
```

コマンドラインから一時的に切り替えたい場合は **shell** を使う。すると、環境変数 *RBENV_VERSION* に設定される。

```
$ rbenv shell 2.0.0-p0
```

localおよびshellに指定したバージョンは--unsetオプションにより取り消せる(globalは取り消せなかった、後述のsystemに戻すことで代用できる)。なおlocalの場合は *.ruby-version* ファイルが削除される。

```
$ rbenv local --unset
$ rbenv shell --unset
```

念のため実験したところ優先順位はちゃんとshell > local > globalの順で適応された。つまりは 環境変数 *RBENV_VERSION* > カレントディレクトリの *.ruby-version* > *~/.rbenv/version* の順に優先されることになる。

## system

ディストリビューションなどで例えば/usr/bin/rubyにRubyがインストールされていることがある。こういったRubyは **system** というキーワードで指定することができる。

```
$ rbenv shell system
$ rbenv local system
$ rbenv global system
```

```rbenv global --unset```の代わりとして```rbenv global system```が利用できる。

## 古い.rbenv-version

互換性のために.rbenv-versionから.ruby-versionを使うようになっている。

* .rbenv-versionと.ruby-versionの両方が存在する場合
 * .ruby-versionが優先される
 * ```rbenv local```使った場合は.ruby-versionのみ更新される
 * ```rbenv local --unset```使った場合は.ruby-versionも.rbenv-versoinも削除される
* .rbenv-versionだけがある場合
 * ```rbenv local```を実行すると.rbenv-versionが削除され.ruby-versionが作成される。
 * ```rbenv local --unset```使った場合は.rbenv-versoinが削除される。
ShaderToyForiOS

ピクセルシェーダーをリアルタイム実行できるサイト
ShaderToy (https://www.shadertoy.com/)
のシェーダーをiOS上で動かすプロジェクトを作りました。
https://github.com/Ushio/ShaderToyForiOS

ShaderToyのシェーダーをコピペすると、
うごきます。

ただごついシェーダーは重くて動かない＆落ちたりもします。
awk(1) 小技


色々と便利な *awk*(1) のちょっとした小技を紹介してみます。

## **system()** を利用する際の注意

*awk*(1) の中で外部コマンドを実行する場合は組み込み関数 **system()** が利用できますが、この関数を利用して外部コマンドを実行すると入出力 stream がオープンされるので、ファイルディスクリプタが消費されてしまいます。
ですので *awk*(1) 内で何度も **system()** を実行すると、オープンできるディスクリプタの上限を超過してしまい、 *awk*(1) の実行が中断されてしまう可能性があります。
ですので、 **close()** を利用して **system()** がオープンした stream を閉じれば良いのですが、 *awk*(1) の **system()** では stream を明示的に扱いません。その様な場合は **system()** で実行したコマンドを **close()** の引数で指定する事で stream を閉じる事ができます。

```sh:
awk '{
		:
	# コマンドを生成
	command = sprintf("%s %s %s", command, arg1, arg2);
	# コマンドを実行して結果を取得
	buf = system(command);
	# stream をclose
	close(command);
		:
}'

```
                

## 関数内ローカルな変数の使用

*nawk*(1) は **function** を利用する事で内部関数を作成する事ができますが、関数内でローカルな変数を明示的に定義する事ができません。
ところが関数宣言の仮引数部に変数を定義する事で、関数内ローカルの変数として利用できます。

```sh:
awk '{
		:
	# 関数 foo の定義
	#   num: ループ数
	# 以下ローカル変数
	#   i: ループウンタ
	function    foo(num,        i)
	{
		# i はローカル変数扱いなので呼出元の i は影響を受けない
		for(i=0; i<1num; i++)
			:
	}
		:
	foo(num);
		:
}'
```

但し関数呼び出し時と関数定義時に引数の数が等しくないので、後に混乱しないためにコメントで明記するなどの処置は必要でしょう。
kitcometalsから値段を持ってくる(2)

前回の続き。

とりあえずやろうとしていること：
http://www.kitcometals.com/charts/nickel_historical_large.html#30days
の数字を記録する（ちなみに上司に提出する）。前回、
１：ページそのものを引っ張ってくる
２：中身をスクレイピングして欲しい数字を算出する
３：日付を添えてデータベースにぶち込む
のうち２までが出来たので、とりあえず手間なくデータベースにぶち込むようにするところまで。整備とかは後からゆっくり考える。

とりあえず何も考えずにfuelphp（ http://fuelphp.com/ ）を使って実装することにする。
昔はちいたん（ http://php.cheetan.net/ ）と使用してたし実際楽なんだけど、勉強も兼ねて後からゆっくり動作解析したいと思ったんで初採用。

自分の動作環境
・Windows7Pro
・Xampp  1.8.1（英語）　apacheとmysqlを稼働させておく。
・fuelphp 1.5.3

とりあえずfuelphpをダウンロード・解凍して、"C:\xampp\htdocs\kitco"にdocs以外を設置。dosプロンプトで
`php oil g scaffold kitco value:float(6,4) date:date`

scaffoldは足場って意味なのね。とりあえず雛形を自動生成させる。次に使用データベースの設定、"C:\xampp\htdocs\kitco\fuel\app\config"に行って２ファイルいじる。

```config.php
<?php
return array(
 'always_load' => array(
  'packages' => array(
   'orm',
  )
 )
);
```
コレを入れないと表示時にデータベースにormがないよ的エラーが出る。詳細よくわかってないが多分必須なんだろう。

```development\db.php
<?php
return array(
	'default' => array(
		'connection'  => array(
			'dsn'        => 'mysql:host=localhost;dbname=kitco',
			'username'   => 'hoge',
			'password'   => 'fuga',
		),
	),
);
```
もちろんデータベース名とほげとふがは適当に。何もいじってない人は多分'root'と''。あとはデータベース作っておかないと行けないので作成しておく。面倒ならxamppのmysqladminに行って作成。作成後は
`php oil r migrate`
が通るので、これでデータベースのテーブル設定も終わり。最後に前回書いた実際のコードを置くために

1."C:\xampp\htdocs\kitco\public"にphpQueryフォルダ以下を設置（前回参照）
（requireできるなら別にここじゃなくてもいい）
2."C:\xampp\htdocs\kitco\fuel\app\views\kitco"に移動し、_form.phpを以下のように書き換える

```_form.php
<?php echo Form::open(); ?>

<?php
require_once('phpQuery/phpQuery.php');
$html = phpQuery::newDocumentFile('http://www.kitcometals.com/');
mb_language('Japanese');
$lists = $html['table:eq(15)']; //テーブル決め打ち
$hoge = $lists['tr:first td:eq(1)'];
$current = pq($hoge)->text();
$hoge = $lists['tr:eq(1) td:eq(1)'];
$change = pq($hoge)->text();
$value = $current - $change;

$date = date_create();
if($date->format("w")== 1) // 月曜日の時は金曜日を指示
	$date->modify('-3 day');
else
	$date->modify('-1 day');
$daybefore=$date->format("Y/m/d");
?>
	<fieldset>
		<div class="clearfix">
			<?php echo Form::label('Value', 'value'); ?>

			<div class="input">
				<?php echo Form::input('value', Input::post('value', isset($kitco) ? $kitco->value : $value), array('class' => 'span4')); ?>

			</div>
		</div>
		<div class="clearfix">
			<?php echo Form::label('Date', 'date'); ?>

			<div class="input">
				<?php echo Form::input('date', Input::post('date', isset($kitco) ? $kitco->date : $daybefore), array('class' => 'span4')); ?>

			</div>
		</div>
（以下は同じ）
```

数値算出のために３行目からのブロックを追加し、空白時の値に算出した数字を出すようにする変更。営業日の計算はとりあえず適当に書いたものなんで、後で手を入れるかもしれないしほっとくかもしれない。

とりあえず目的達成のためのシンプルなアプリケーションはできたので、あとは適当に手を入れることがあったら更新かなぁ。
cvs や svn のリビジョン番号

プログラムを作成する際、特にまだ未完成で頻繁に修正とコンパイルを繰り返している間は、どのリビジョンのプログラムを実行しているのか知りたい事はよく有ると思います。
そんな時に、例えば実行時オプションとして **-v** を指定すると cvs や svn のリビジョン番号とコミットした日時が表示されると便利でしょう。
しかし、多くの場合において **-v** オプションを解析し実行するだろう main 関数が含まれるファイルが最終修正されているとは限らないので、main 関数の含まれるファイル中に

```c:
static	char	*id = "$Id$";

```

などと定義しておいて commit 時に **$Id$** を展開したとしても、必ずしも最新のリビジョンにはならない場合が多いと思います。

そこで **-v** オプションのハンドラ部分では

```c:
static	char	*id = "revision: " REVISION ", " COMMITED ;

```

と記述としておいて make 時に自動で *REVISION* と *COMMITED* を全てのソース/ヘッダファイル中の cvs や svn の **$Id$** キーワードから取得して設定する方法を検討してみました。

build 時に必ず実行する必要がある処理なので Makefile に記述して、 make 中で自動的に実行してしまうのが楽でしょう。

```sh:Makefile
	:
	:
# 変数定義
PROGRAM  = myprog
OBJECTS  = sub.o pthread.o common.o util.o
HEADER   = myprog.h const.h config.h
 
# 全ソース/ヘッダ中の `$Id' 行から最大のリビジョンを取得する
REVISION = $(shell awk '/\$$Id/{ if($$4 ~ /[[:digit:]]/) \
			if(max < $$4) max = $$4 } END{ print max }' \
			$(OBJECT:.o=.c) $(HEADER) $(PROGRAM).c)
# 全ソース/ヘッダ中の `$Id' 行から最大のリビジョンのコミット日時を取得する
COMMITED = $(shell awk '/\$$Id.*'$(REVISION)'/{ \
			print $$5 " " $$6; exit }' \
			$(OBJECT:.o=.c) $(HEADER) $(PROGRAM).c)
# コンパイルオプション(REVISIONとCOMMITEDを定義)
CFLAGS   = -g -Wall -Wextra -Werror -Wno-unused-parameter -I.-O2 \
			-DREVISION=\""$(REVISION)"\" -DCOMMITED=\""$(COMMITED)"\"
    :
    :
# ターゲット(デフォルトターゲットは touch と $(PROGRAM)に依存
all: touch $(PROGRAM)

# $(PROGRAM).o ファイルの削除（$(PROGRAM).o ファイルは必ずコンパイルする）
touch:
	rm $(@).o

$(PROGRAM): $(OBJECTS)
	$(CC) $(CFLAGS) -o $(@) $^ 

$(OBJECTS): $(HEADER)
	:
	:

```

これでどのファイルを commit した場合でも必ず最新のリビジョンとコミット日付が **-v** で表示される様になります。




え? git ? 何それ美味しいの?