OmniAICreator/Qiita-1.07M huggingface dataset:
Vimproc を適切にロードする

3種類のOS上でVimを使っているために、vimproc.dll のロード時に以下のようなエラーがでるのを何とかしたくて、調べてみました。
こんなので困るの私ぐらいだと思いますが、備忘録としてメモ。

![エラー画面](https://lh4.googleusercontent.com/-99u0-Kn3k2k/UDEACm3k7lI/AAAAAAAAEjs/0OB8Jtodi4k/s800/2012-08-16_22h36_11.png)

# 設定例

OSの種類に応じて適切なvimproc がロードされるように、以下のように書きます。

パスは適宜ご自分の環境に合わせてください。

* Mac OS X Mountain Lion
* Windows7(32bit)
* Windows7(64bit)

```vim:.vimrc
if has('mac')
  let g:vimproc_dll_path = $VIMRUNTIME . '/autoload/vimproc_mac.so'
elseif has('win32')
  let g:vimproc_dll_path = $HOME . '.vim/bundle/vimproc/autoload/vimproc_win32.dll'
elseif has('win64')
  let g:vimproc_dll_path = $HOME . '.vim/bundle/vimproc/autoload/vimproc_win64.dll'
endif
```
C# の using文をVimで良い感じにソートする

C# の using文をVimで良い感じにソートしたい！

* 重複行は除去したい
* using System; が一番下に来ないように(普通に :sort すればわかります)

ノーマルモードにて、 using 行の上で以下のようにタイプすればOK！！

```vim 
vip:sort iru /\s[a-zA-Z0-9\.]\+/    
```

いちいちタイプするのも面倒くさいので .vimrc に以下のように書いておけば、`CTRL+S`だけでソートできるようになって便利。

```vim:.vimrc 
" sort using lines. (C#)
autocmd FileType cs map <C-S> vip:sort iru /\s[a-zA-Z0-9\.]\+/<CR>
```

# 説明

## ノーマルモードのコマンドの説明

* `vip` ビジュアル選択(文節全体) (ip=inner paragraph)

## :sortコマンドのオプション

* `i` ソート時に大文字小文字を区別しない
* `r` ソート時に指定した正規表現にマッチした部分でソートする
* `u` ソート時に重複行を削除する

## 正規表現の説明

* `\s` ホワイトスペース文字
* `\+` 一回以上の繰り返し(Perl等の正規表現と違って\ によるエスケープが必要)
* [] の内側に `\w` と書いてもなぜか英数字としてマッチしなかったので、このような書き方に。(エレガントな書き方があれば教えて下さい)

# 使用前

```csharp
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using log4net;
using System.Windows.Forms;
using Rohinomiya;
using System.Xml;
```

# 使用後

```csharp 
using log4net;
using Rohinomiya;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Windows.Forms;
using System.Xml;
```

# 参考

* [VIMで選択行をソートする #Vim - Qiita](http://qiita.com/items/f6c175e1f7d529cb15f0)
* [Vimで使える正規表現 - Archiva](http://archiva.jp/web/tool/vim_regexps.html)
* [vimのText-objectがわからない - ゆるやかにくちてゆくこの世界で　あがく僕の唯一のかつろ](http://d.hatena.ne.jp/kajisuke/20090624/1245798471)
* [useやusingなどの宣言を綺麗にソートする(Vim編) - TIM Labs](http://labs.timedia.co.jp/2010/12/sort-using-declarations-by-vim.html)
Rubyでメソッドをフックして、validate機能は別のところでやりたい。


まず、最初にcreateメソッドを定義する。そのあと、aliasで新しい名前、before_createというのをつける。次に、再び、createメソッドを再び定義する。
before_createがtrueを返したら、データが作られる、before_createがfalseを返したら、データが作られない、となる。


```

class User 
	@@users = []

	class << self
		def create(info)
			if info[:age] < 20
				p "sorry,Child can't create."
				return false
			end
			return true
		end

		alias :before_create :create

		def create(info)
			user = {name: info[:name],age: info[:age]} 
			@@users.push(user) if before_create(info)
		end

		def all
			return @@users
		end

	end
end


User.create(name: "nobi",age:23)
User.create(name: "nobinobiru",age:19)
p User.all

```
bundlerでpgをインストールする


pgをインストールするにはgemのオプションでpg_configへのパスを指定しなければなりません。しかしbundlerでインストールする場合はどう渡したものか…。

調べてみると以下のように bundle install に先立って [bundle config](http://gembundler.com/man/bundle-config.1.html)  すればいいみたい。

```
$ bundle config build.pg --with-pg-config=/usr/local/bin/pg_config
$ bundle install
```

やってみたらすんなりとOKでした。その他のgemでも同様のやり方でオプションを渡せばいいみたいです。

参考：http://stackoverflow.com/questions/9234960/gem-install-pg-with-pg-config-works-bundle-fails
コマンドが存在するかしないかを判定して, 条件分岐する構文のまとめ

# Vim

[`executable()`関数](https://vim-jp.org/vimdoc-ja/builtin.html#executable())を使う.

```vim:~/.vimrc
" コマンドが存在すれば
if executable('git')
    NeoBundle 'mattn/gist-vim'
endif
```


# Emacs

[`executable-find`関数](https://www.gnu.org/software/emacs/manual/html_node/elisp/Locating-Files.html#index-executable_002dfind)を使う.

```emacs-lisp:~/.emacs.d/init.el
(when (executable-find "terraform") ; コマンドが存在すれば
  (el-get-bundle terraform-mode)
  )
```


# sh

`hash`や`type`, `which`, `command -v`などを使う.

### ワンライナー

```sh:
type htop > /dev/null 2>&1 && echo Success!
# コマンドが存在すれば
```

```sh:
type htop > /dev/null 2>&1 || echo Error!
# コマンドが存在しなければ
```

### 複数行

```sh:
type htop > /dev/null 2>&1
if [ $? -eq 0 ] ; then # コマンドが存在すれば
    echo Success!
    alias top=htop
else                   # コマンドが存在しなければ
    echo Error! >&2
    exit 1
fi
```

簡潔に書くと:

```sh:
if type htop > /dev/null 2>&1; then # コマンドが存在すれば
    echo Success!
    alias top=htop
else                                 # コマンドが存在しなければ
    echo Error! >&2
    exit 1
fi
```


# PowerShell

### ワンライナー
`&&`や`||`に対応するものはたぶんない ?

### 複数行

`Get-Command` (`gcm`) コマンドレットを使う.

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/get-command

```powershell
gcm perldoc -ea SilentlyContinue | Out-Null
if ($? -eq $true) { # コマンドが存在すれば
    Write-Output 'Success!'
    perldoc perldoc
} else {            # コマンドが存在しなければ
    Write-Error 'Error!'
    exit 1
}
```

簡潔に書くと:

```powershell
if (gcm perldoc -ea SilentlyContinue) { # コマンドが存在すれば
    Write-Output 'Success!'
    perldoc perldoc
} else {                                # コマンドが存在しなければ
    Write-Error 'Error!'
    exit 1
}
```


# コマンドプロンプト

`where`コマンドを使う.

https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/where

### ワンライナー

```powershell:
where /q perldoc && echo Success!
rem コマンドが存在すれば
```

```powershell:
where /q perldoc || echo Error!
rem コマンドが存在しなければ
```

### 複数行

```powershell:
where /q perldoc
if %errorlevel% == 0 ( :: コマンドが存在すれば
    echo Success!
    perldoc perldoc
) else (               :: コマンドが存在しなければ
    echo Error! >&2
    exit /b 1
)
```
オフラインリアルタイムどう書く#3 の参考問題の解答例

オフラインでリアルタイムに「どう書く」をやるイベント。
http://atnd.org/events/31590
の参考問題
http://qiita.com/items/ebd8a56b41711ba459f9
を、自分でも解いてみた。というか、出題前に解いてます。

```ruby
#!ruby

def baba( q )
  q.chars.inject([[0,0,0]]){|s,b|
    nx={
      's'=> ->x{[x[0],x[1]+1,x[2]]},
      'f'=> ->x{[x[0],[2,x[1]+1].min,x[2]]},
      'b'=> ->x{[x[0],x[1],x[2]+1]},
      'p'=> ->x{[x[0]+1,0,0]},
      'h'=> ->x{[x[0],0,0]}
    }[b].call(s.last.dup)
    nx=[nx[0]+1,0,0] if 2<nx[1] # 3 strikes
    nx=[nx[0],0,0] if 3<nx[2] # 4 balls
    nx=[0,0,0] if 2<nx[0] # 3 outs
    s<<nx
  }.drop(1).map{|i| i.join }.join(',')
end

DATA.each{ |line|
  q,expected=line.split(/\-\>/).map( &:strip )
  actual=baba q
  raise "#{q}->#{actual} ( expected : #{expected} )" if expected!=actual
  puts "%s -> %s"%[q,actual]
}

__END__
sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100
```

本当はテストもっとあるけどここでは省略。
ストライク3つとかアウト3つとか、そういう処理をしなくてもいいところでやっているところがしょぼい感じ。
case..when をつかわずに map+lambda にしたのはただなんとなく。
HPricotでスクレイピングするスクリプト

スクレイピング・・・Webページの特定の一部分だけを抽出して抜き出す技術
RSS等を使用して他のページにある情報を自分のホームページに流用して使用することが可能

```
require 'rubygems'
require 'hpricot'
require 'open-uri'

doc = Hpricot(open(http://sample.com/).read)

(doc/"table").each do |p|
  puts p.inner_html
end
```
Wordpressに投稿するスクリプト

```postWordPress.rb
def postWordPress
  user = 'user'
  post = 'post'
  date = Time.parse('2012/01/01 10:00')
  publish = 0 #0:下書き,1:公開 
  description = '内容'
  
  server = XMLRPC::Client.new('sample.com', '/xmlrpc.php') #/(スラッシュ)は必須

  struct = {
    'title' => 'title',
    'description' => description,
    'dateCreated' => date
  }

  id = server.call("metaWeblog.newPost",1,user,pass,struct,publish)
  puts "Posted ID: #{ID}"
end
```
xmlrpc.phpの指定の直前のスラッシュは指定がないと400 Bad Requestが出てしまう

```post.rb
load postWordPress
postWordPress
```
で投稿可能
オフラインリアルタイムどう書く第三回の参考問題解答(scala)

オフラインリアルタイムどう書く第三回の参考問題
http://qiita.com/items/ebd8a56b41711ba459f9

haskellと似たパターンだけれどscala版

```scala
object Baseball {
  def main(args: Array[String]) {
    for(e <- args) {
      println (bb(e.toSeq, List((0,0,0))))
    }
  }

  def bb(ls:Seq[Char], hs:List[(Int,Int,Int)]):List[(Int,Int,Int)] = {
    val c = hs.head
    ls match {
      case Seq(' ', _*) => hs.reverse.tail
      case Seq('s', xs@_*) => 
        c match {
          case (2,2,b) => bb(xs, (0,0,0)+:hs)
          case (o,2,b) => bb(xs, (o+1,0,0)+:hs)
          case (o,s,b) => bb(xs, (o,s+1,b)+:hs)
        }
      case Seq('b', xs@_*) => 
        c match {
          case (o,s,3) => bb(xs, (o,0,0)+:hs)
          case (o,s,b) => bb(xs, (o,s,b+1)+:hs)
        }
      case Seq('h', xs@_*) => 
        c match {
          case (o,s,b) => bb(xs, (o,0,0)+:hs)
        }
      case Seq('p', xs@_*) => 
        c match {
          case (2,s,b) => bb(xs, (0,0,0)+:hs)
          case (o,s,b) => bb(xs, (o+1,0,0)+:hs)
        }
      case Seq('f', xs@_*) => 
        c match {
          case (o,2,b) => bb(xs, (o,2,b)+:hs)
          case (o,s,b) => bb(xs, (o,s+1,b)+:hs)
        }
    }
  }
}

Baseball.main(
Array("s -> 010",
      "sss -> 010,020,100",
      "bbbb -> 001,002,003,000",
      "ssbbbb -> 010,020,021,022,023,000",
      "hsbhfhbh -> 000,010,011,000,010,000,001,000",
      "psbpfpbp -> 100,110,111,200,210,000,001,100",
      "ppp -> 100,200,000",
      "ffffs -> 010,020,020,020,100",
      "ssspfffs -> 010,020,100,200,210,220,220,000",
      "bbbsfbppp -> 001,002,003,013,023,000,100,200,000",
      "sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100",
      "ssffpffssp -> 010,020,020,020,100,110,120,200,210,000")
)
```
Scheme手習いメモ (5章 - *すごい*星がいっぱいだ) 

この章ではネストしたリストを再帰する手法を学ぶ。

##rember*
アトム `a` とリスト `l` を引数にとり、`l` に含まれる `a` と等しい要素をすべて取り除く関数 `rember*` を定義する。ここで、 `l` は入れ子になったリストの可能性がある。

```Lisp:rember*.scm
(define rember*
  (lambda (a l)
    (cond
      ((null? l) (quote ()))
      ((atom? (car l))
       (cond
         ((eq? (car l) a)
          (rember* a (cdr l)))
         (else (cons (car l)
                     (rember* a (cdr l))))))
      (else (cons (rember* a (car l))
                  (rember* a (cdr l)))))))

(define a 'cup)
(define l '((coffee) cup ((tea) cup) (and (hick)) cup))
(print (rember* a l))
```

出力は `((coffee) ((tea)) (and (hick)))` 。

##occur*
`occur*` はリスト `l` とアトム `a` を引数にとり、`l` に含まれる `a` と等しい要素の個数を計算する関数である。ここで、 `l` は入れ子になったリストの可能性がある。

```Lisp:occur*.scm
(define occur*
  (lambda (a l)
    (cond
      ((null? l) 0)
      ((atom? (car l))
       (cond
         ((eq? (car l) a)
          (add1 (occur* a (cdr l))))
         (else (occur* a (cdr l)))))
      (else (o+ (occur* a (car l))
                (occur* a (cdr l)))))))

(define a 'cup)
(define l '((coffee) cup ((tea) cup) (and (hick)) cup))
(print (occur* a l))
```

##member*
同じ要領で、リストに特定の要素が含まれるか調べる関数を定義する。

```Lisp:member*.scm
(define member*
  (lambda (a l)
    (cond
      ((null? l) #f)
      ((atom? (car l))
       (or (eq? (car l) a)
           (member* a (cdr l))))
      (else (or (member* a (car l))
                (member* a (cdr l)))))))
```

##srember
S式のリスト `l` から任意のS式 `s` を取り除いたS式のリストを返す関数を定義する。

```Lisp:srember.scm
(define srember
  (lambda (s l)
    (cond
      ((null? l) quote())
      ((equal? (car l) s) (cdr l))
      (else (cons (car l)
                (srember s (cdr l)))))))

(define s 'cup)
(define l '((coffee) cup ((tea) cup) (and (hick)) cup))
(print (srember s l))
```

出力は `((coffee) ((tea) cup) (and (hick)) cup)`

##感想
そろそろ注意深く読んでいかないとハマりそうな予感。
POSTメソッド投げて、画像を取得するのは簡単だった

Javaよりも簡単にできるね！！

でも、VBAって時点っでもうやる気がでない・・・VBAがマストなんだけど・・・

```vbnet:post.bas
'指定したURLからファイルをダウンロードする.
'srctUrl : ダウンロード先のURL
'distFilename : ダウンロード先のファイルパス
'postBody : 中身
'返り値 : 成功すればtrue
Function requestHttpPost(srcUrl As String, distFilepath As String, postBody As String) As Boolean
    Dim i As Long, bLength As Long 'ループカウンター,バイト長
    Dim fileNum As Integer '保存先ファイルのファイル番号
    Dim responseBody As String 'レスポンスの中身
    Dim temByte() As Byte  '一次バイト保存先
    Dim winHttp As Object  '通信用のオブジェクト
    
    
    Set winHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    
    winHttp.Open "POST", srcUrl, False
    winHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    winHttp.Send postBody
    
    'HTTP Status Code が200 -399の場合のみ処理を行う
    If winHttp.Status > 199 And winHttp.Status < 400 Then
        bLength = LenB(winHttp.responseBody)
        fileNum = FreeFile()
        Open distFilepath For Binary Access Write As #fileNum
        temByte() = winHttp.responseBody
        Put #fileNum, , temByte()
        Close #fileNum
        requestHttpPost = True
    Else
        requestHttpPost = False
    End If
    Exit Function
```

という訳で、画像に保存可能。

チョットわからないのが

```vbnet
        temByte() = winHttp.responseBody
        Put #fileNum, , temByte()
```
なにこれ？なんで一旦バイト配列に落としてるの？
`winHttp.ResponseBody()`ではなぜ駄目なんだ？
Greasemonkey で直接 CoffeeScript を書く方法


（追記1）~~Firefox 21 以降 E4X がサポートされなくなったため、現行の Firefox では本記事のコードは動きません~~
（追記2）E4X を使わずに記述する方法に変更しました。

```coffeescript:greasecoffee1.user.js
//;###
// ==UserScript==
// @name        coffeetest
// @namespace   http://example.com/coffeetest
// @include     *
// @grant       none
// @require     http://coffeescript.org/extras/coffee-script.js
// @version     1
// ==/UserScript==
CoffeeScript.eval((function(){/*
# coffeescript from here ###

class User
  constructor: ->
    @name = 'Coffee'

  call_name: ->
    alert "Mr. " + @name

(new User()).call_name()

# end of coffeescript #*/}).toString().split("\n").slice(1, -1).join("\n"));
```

# 使い方
`class User` の行から `(new User()).call_name()` の部分までが CoffeeScript として解釈されるので、この箇所に任意の処理を記述してください。また、`==UserScript==`で囲まれている部分は coffeescript の読み込み行を除いて、greasemonkey で定める通り自由に書くことができます。それ以外の箇所は、例えばただのコメントのように見える最後の行も変換に必要なので、消したり変更しないでください。

# 動作環境
上記のコードは単体で greasemonkey(javascript) としても coffeescript としても動作します。

Greasemonkey で書くのは基本的に小物スクリプトなので、わざわざ CoffeeScript を使う必要があるのかどうかはわかりませんが、どーーーしても CoffeeScript で書きたい僕のような人は使ってみてください。

## 補足1
毎回コンパイルするのが気になる人は、コンパイル結果を GM_setValue, GM_getValue すると良いです。

```coffeescript:greasecoffee2.user.js
__js_code__ = (function(){/*
# coffeescript from here ###

alert 'hoge'

### end of coffeescript #*/}).toString().split("\n").slice(1, -1).join("\n");
if (GM_getValue('__last_js_code__') !== __js_code__) {
  GM_setValue('__last_js_code__', __js_code__);
  GM_setValue('__last_compiled__', CoffeeScript.compile(__js_code__));
}
eval(GM_getValue('__last_compiled__'));
```

## 補足2
先頭の行で `//;###` としているのは、javascript では1行コメントとして扱われる一方、coffeescript では正規表現オブジェクトのあとにブロックコメントが続くようにするため。（両方の言語で構文エラーにならないようにするためのハック）

# 参考リンク
http://jashkenas.github.com/coffee-script/
http://wiki.greasespot.net/Metadata_Block
オフラインリアルタイムどう書く第三回の参考問題解答(haskell)

オフラインリアルタイムどう書く第三回の参考問題
http://qiita.com/items/ebd8a56b41711ba459f9

最近勉強中のhaskell。
パターンマッチでscalaの@が使いたいなと思ったら使えた。さすが本家。

```haskell
main = print $ map baseball probs

baseball prob = bb prob [(0,0,0)]

bb :: [Char]->[(Int,Int,Int)]->[(Int,Int,Int)]
bb (' ':xs) hs = tail $ reverse hs
bb ('s':xs) hs@((2,2,b):_) = bb xs ((0,0,0):hs)
bb ('s':xs) hs@((o,2,b):_) = bb xs ((o+1,0,0):hs)
bb ('s':xs) hs@((o,s,b):_) = bb xs ((o,s+1,b):hs)
bb ('b':xs) hs@((o,s,3):_) = bb xs ((o,0,0):hs)
bb ('b':xs) hs@((o,s,b):_) = bb xs ((o,s,b+1):hs)
bb ('h':xs) hs@((o,s,b):_) = bb xs ((o,0,0):hs)
bb ('p':xs) hs@((2,s,b):_) = bb xs ((0,0,0):hs)
bb ('p':xs) hs@((o,s,b):_) = bb xs ((o+1,0,0):hs)
bb ('f':xs) hs@((o,2,b):_) = bb xs ((o,2,b):hs)
bb ('f':xs) hs@((o,s,b):_) = bb xs ((o,s+1,b):hs)

probs = [
      "s -> 010",
      "sss -> 010,020,100",
      "bbbb -> 001,002,003,000",
      "ssbbbb -> 010,020,021,022,023,000",
      "hsbhfhbh -> 000,010,011,000,010,000,001,000",
      "psbpfpbp -> 100,110,111,200,210,000,001,100",
      "ppp -> 100,200,000",
      "ffffs -> 010,020,020,020,100",
      "ssspfffs -> 010,020,100,200,210,220,220,000",
      "bbbsfbppp -> 001,002,003,013,023,000,100,200,000",
      "sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100",
      "ssffpffssp -> 010,020,020,020,100,110,120,200,210,000"]
```
Scheme手習いメモ (4章 - 数遊び)

この章では、Schemeにおける数値を用いた再帰について学ぶ。

##add1, sub1
いわゆるインクリメントとデクリメントをする関数定義する。

```Lisp:add1.scm
(define add1
  (lambda (n)
    (+ n 1)))

(define sub1
  (lambda (n)
    (- n 1)))

(print (add1 10))
(print (sub1 10))
```

数値はアトム。整数も小数も数値でありアトムである。でも3章では0以上の整数のみ扱う。

##o+, o-
上記の `add1`, `sub1` を用いて整数同士の加算と乗算を定義する。

```Lisp:o-.scm
(define o-
  (lambda (n m)
    (cond
      ((zero? m) n)
      (else (sub1 (o- n (sub1 m)))))))

(print (o+ 4 3))
(print (o- 4 3))
```

出力は `7 1` 。

##addtup
数値のリストをタップという。空のタップ `()` を空タップという。タップに含まれるすべての数値を加算した結果を返す関数 `addtup` を定義する。

```Lisp:addtup.scm
(define addtup
  (lambda (tup)
    (cond
      ((null? tup) 0)
      (else (o+ (car tup) (addtup (cdr tup)))))))

(print (addtup '(10 20 40)))
```

##x
自然な乗算を定義する。

```Lisp:x.scm
(define x
  (lambda (n m)
    (cond
      ((zero? m) 0)
      (else (o+ n (x n (sub1 m)))))))

(print (x 10 20))
```

##tup+
ふたつのタップ `tup1`, `tup2` を引数にとり、それぞれのタップのn番目の要素同士を加算した新しいタップを返す関数 `tup+` を定義する。

```Lisp:tup+.scm
(define tup+
  (lambda (tup1 tup2)
    (cond 
      ((null? tup1) tup2)
      ((null? tup2) tup1)
      (else
        (cons (o+ (car tup1) (car tup2))
              (tup+
                (cdr tup1) (cdr tup2)))))))


(define tup1 '(3 7))
(define tup2 '(4 6 8 1))
(print (tup+ tup1 tup2))
```

出力は `(7 13 8 1)` 。
サイトのリクエスト情報をエクセルで見れるようにする


Chromeのデベロッパーツールの「Network」タブ。
Web制作している時は、基本的に開きっぱなしにしているが、この情報をきちんと集計して、エクセルかなにかでドキュメントにしたい。

( 他のブラウザの事は知らぬ )

### 1.データの保存

+ ネットワクークタブで右クリック
+ メニューから「Save All As HAR」

とすると、HARファイルという形式で保存できる。
( ちなみにこのファイルの表示だけなら[こんなサイト](http://www.softwareishard.com/har/viewer/)もある )

### 2.ファイルの確認
このファイルをテキストエディタで開くと、中身はJSONのようなので、これを適当に整形するプログラムを書く。

```javascript:sample.har
{
	"log": {
		"version": "1.2",
		"creator": {
		"name": "WebInspector",
		"version": "537.1"
	},
	"pages": [
		{
			// ...
		}
	],
	"entries": [
		{
			"startedDateTime": "2012-08-….",
			"time": 24,
			"request": {
				// ...
			}
		},
		{
			// ...
		}
}
```

### 3.整形するプログラム

JSONが解析できれば何でも良いのですが、今回はJavaScriptでTSVにでも変換。

```javascript:parser.js
/**
 * harファイルのパースと tsv出力
 */
var global = this,
	stdin;

// stdin
stdin = (function () {
	
	var line	= "",
		stdin	= "";
	
	while (line = global.readline()) {
		stdin += line;
	}
	
	return stdin;
}());

// main
(function (instr) {
	
	var	SEPARATOR	= "\t",
		root		= JSON.parse(instr).log,
		entries		= root.entries,
		entry,
		bodySize	= 0,
		status200	= 0,
		status304	= 0,
		status_other	= 0,
		i;
	
	for (i = 0; i < entries.length; i++) {
		entry		= entries[i];
		bodySize	+= entry.response.bodySize;

		if(entry.response.status == 200){
			status200++;
		}else if(entry.response.status == 304){
			status304++;
		}else{
			status_other++;
		}
	}

	pageTimings = root.pages[0].pageTimings;

	global.print([
		entries.length,
		status200,
		status304,
		status_other,
		bodySize,
		pageTimings.onContentLoad,
		pageTimings.onLoad
	].join(SEPARATOR));

}(stdin));
```

これを実行して、さっきのHARファイルを読ませる

```shell
$ /path/to/jsc parsehar.js < sample.har 
94	70	0	24	1600953	703	4653
```


後は、要件に合わせて出力する項目を修正したり、複数ファイルをまとめて処理できるようにしたり etc…
dataURIを作る

data uri schemeを手作業で作ってもそれほど面倒じゃない。
でも、コピペやAlt+Tab が多くて嫌になるので、コマンドにした

```ruby:base64_embed_datauri.rb
#!/usr/bin/env ruby

require 'base64'
require 'rubygems'
require 'mime/types'
require 'optparse'

##初期化
with=nil
####引数処理
opt = OptionParser.new
opt.on(
	"--tag=[TAG]",
	"タグに埋め込んだ状態で出力する.デフォルト<img>(MIME判別) ")
	{|arg| 
		case arg
			when nil
				with = "img"
			when false
				with = false
			else
				with = arg
		end
	}
	
opt.on("--css", "CSS埋め込み用に展開する .url(\"data:image/png;base64,XXXX\") "){ |arg| with = "css"|| arg if arg }
opt.parse!(ARGV)

###メイン処理
data_type =  MIME::Types.type_for(ARGF.path).first.to_s
if with != false then
	with = "script" if data_type =~/script/i
	with = "img"    if data_type =~/image/i
	#with = "embed"  if data_type =~/flash/i # no browser support swf in data uri scheme
	with = "svg"    if data_type =~/svg/i
end

data_str  =  Base64.encode64(ARGF.read).gsub /\n/,""
src_str =  "data:#{data_type};base64,#{data_str}"
##出力処理
case with
	when "img"
		puts "<img src=\"#{src_str}\" />"
	when "script"
		puts "<script src=\"#{src_str}\"></script>"
	when "css"
		puts "url(\"#{src_str}\""
	when "object"
		puts "<object data='#{src_str}' type='#{data_type}'> </object>"
	when "embed"
		puts "<embed src='#{src_str}' type='#{data_type}' />"
	when false
		puts src_str
	else
		puts "<#{with} src=\"#{src_str}\" />"
end

```
オフラインリアルタイムどう書く第三回の参考問題解答(Ruby)

オフラインリアルタイムどう書く第三回の参考問題
http://qiita.com/items/ebd8a56b41711ba459f9
haskellで書きたかったけれど、酔っ払っているので無理。rubyで。

```ruby
def solve(q)
  q.split('').inject([]) {|hist, e|
    o,s,b = hist.empty? ? [0,0,0] : hist.last
    case e
    when 's'
      s += 1
      if s == 3
        s = b = 0
        o += 1
      end
    when 'b'
      b += 1
      s = b = 0 if b == 4
    when 'h'
      s = b = 0
    when 'p'
      s = b = 0
      o += 1
    when 'f'
      s += 1 if s < 2
    end
    o = s = b = 0 if o == 3
    hist << [o,s,b]
  }.map(&:join)
end

DATA.readlines.each do |line|
  q,a = line.chop.split(' -> ')
  puts "#{q} -> #{solve(q).join(',')}"
end

__END__
s -> 010
sss -> 010,020,100
bbbb -> 001,002,003,000
ssbbbb -> 010,020,021,022,023,000
hsbhfhbh -> 000,010,011,000,010,000,001,000
psbpfpbp -> 100,110,111,200,210,000,001,100
ppp -> 100,200,000
ffffs -> 010,020,020,020,100
ssspfffs -> 010,020,100,200,210,220,220,000
bbbsfbppp -> 001,002,003,013,023,000,100,200,000
sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100
ssffpffssp -> 010,020,020,020,100,110,120,200,210,000
```
一度だけ評価するプロパティ

phpでよくあるコードで、こんなものがあります。

```php
<?php
class Foo {
	private $_bar = null;
	public function getBar() {
		if ($this->_bar === null) {
			$this->_bar = Bar::getFromFooId($this->getId());
		}
		return $this->_bar;
	}
}

$foo = new Foo();
$foo->getBar();
$foo->getBar(); // キャッシュが利用される.
```

特に Twig などのテンプレートエンジンではテンプレート内で ``{{ foo.bar }}`` と書いたら ``$foo->getBar();`` が実行されるので、キャッシュをしておかないとなんども同じクエリをDBに発行する可能性があります。

Python で同じことをプロパティを利用して実現するとしたら、次のようになります。

```python
class Foo(object):
	_bar = None
	@property
	def bar(self):
		if self._bar is None:
			self._bar = Bar.from_foo_id(self.id)
		return self._bar

foo = Foo()
foo.bar
foo.bar # キャッシュが利用される
```

これをもっと簡潔にするのが、 ``werkzeug`` というライブラリにある ``werkzeug.utils.cached_decorator`` というデコレータです。 (実際には、 ``Bar.from_foo_id()`` が ``None`` を返した時も正しくキャッシュできるので、より優れています)

```python
from werkzeug.utils import cached_property

class Foo(object):
	@cached_property
	def bar(self):
		return Bar.from_foo_id(self.id)
```

php で7行のコードが、 Python では 3行になりました。キャッシュを実現するための退屈なコード (boilerplate code) がなくなって、本質的なコードだけを書くことができるので、読みやすく、バグを埋め込みにくく見つけやすい、メンテナンス性が高いコードになっています。

この ``cached_property`` はデコレータとディスクリプタという機能を使って実装されているのですが、 Python 組み込みの ``property``, ``staticmethod``, ``classmethod`` も同じ機能を使って実装されています。

プロパティを持っている言語は幾つかありますし、 php も将来実装するかもしれませんが、 Python は一段階メタな言語機能を実装して、プロパティのような機能は単にその言語機能を利用する組み込みオブジェクトとして実装しているので、構文はシンプルなのに、より柔軟で、現実世界のゴチャゴチャしたアプリケーションをよりすっきり書くことを可能にする能力を持っています。

----
この記事は主に php や Java のようにオブジェクトシステムが静的な言語のユーザーに Python に興味を持ってもらうことを目的として書いています。 (php は動的型付けだがそれ以外の部分はむしろJavaに近い静的言語)

JavaScript や Ruby のような動的言語なら同じようなことができると思うので、ぜひその方法を紹介してください。できるだけ「こんな書き方もできるぜ（でも実際には使わないけどな）」じゃなくて、現実世界の日々のプログラムを楽にしてくれるような polished な方法をお願いします。
オフラインリアルタイムどう書く第三回の参考問題


オフラインでリアルタイムに「どう書く」をやるイベント。
またやります
http://atnd.org/events/31590

で。例によって参考問題。
難易度と分量はこれを目安に。

# ボールカウント(野球)

## 問題の説明

野球のボールカウント・アウトカウントの遷移を計算する。（得点・ランナー・イニング の計算は不要）
ただし、ストライク・ボール・ファウル・ヒット・ピッチャーフライしかない。
細かいルールは下記の通り：

* ストライクが３つになったらアウトが増え、ストライクとボールがゼロになる。
* ボールが4つになったらフォアボールになり、ストライクとボールがゼロになる。アウトは増えない。
* ヒットを打ったらストライクとボールがゼロになる。アウトは増えない。
* ピッチャーフライを打ったらストライクとボールがゼロになり、アウトが増える。
* アウトが3つになったら、アウト・ストライク・ボール全てゼロになる。
* ファウルの場合、もともとストライクが1以下の場合はストライクが増え、ストライクが2の場合には変化なし。
* 入力は "sbsfbhsshssbbffbbssbs" のように、ひとつながりの文字列として与えられる。
* s, b, f, h, p がそれぞれ ストライク、ボール、ファウル、ヒット、ピッチャーフライ を意味する。
* 出力は、アウト・ストライク・ボールの順にカウントをつなげたものをコンマで区切る。例を参照。
* 不正入力には対処しなくてよい。
* 最終回を超えることも考慮しなくてよい。

## 入力と出力の例
以下、入力 -> 出力 の形式で例を示す。

s -> 010
sss -> 010,020,100
bbbb -> 001,002,003,000
ssbbbb -> 010,020,021,022,023,000
hsbhfhbh -> 000,010,011,000,010,000,001,000
psbpfpbp -> 100,110,111,200,210,000,001,100
ppp -> 100,200,000
ffffs -> 010,020,020,020,100
ssspfffs -> 010,020,100,200,210,220,220,000
bbbsfbppp -> 001,002,003,013,023,000,100,200,000
sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100
ssffpffssp -> 010,020,020,020,100,110,120,200,210,000

※ 解答例をコメント欄に（ソースではなく）リンクの形で書いてくださるとありがたいです。
※ そのうち ruby か groovy で解答例を投稿するつもり。
関数データ解析のライブラリ fda の利用メモ


関数データ解析用の便利ライブラリ fda を利用した際のメモ。

```r:fda1.r
library(fda)


## データの準備
x <- 2*pi/8*1:7
y <- sin(x)
curve(sin, xlim=c(0,2*pi))
points(x, y, col=2)

## 基底関数を作る
bsp <- create.bspline.basis(breaks=x,
                            norder=4,
                            rangeval=c(0, 2*pi))

## 基底関数を用いて (x,y)を回帰
fd <- Data2fd(x, y, bsp)
lines(fd, col=3)
    
## 補間関数の微分を計算
new.x <- seq(0, 2*pi, len=100)
fd.1 <- eval.fd(new.x, fd, 1)
lines(new.x, fd.1, col=4)

fd.2 <- eval.fd(new.x, fd, 2)
lines(new.x, fd.2, col=5)

fd.3 <- eval.fd(new.x, fd, 3)
lines(new.x, fd.3, col=6)
```

norder-1次多項式をbreaksで滑らかに繋いだ関数が得られる。ここでは、3次多項式を利用。なので、2階微分は区分的直線、3階微分は区分的定数。
-clipboardなVimでもクリップボードを使う

いろいろな方法があると思いますが、
Ubuntu12.04でapt-getしてきたVim7.2において有効だった方法を紹介します。

# apt-getなVimは-clipboard？

Ubuntuでapt-getしてきた私のVimは-clipboardでコンパイルされていました...orz
このままでは、.vimrcに下記を追記してもクリップボードが使えません。

```.vimrc
set clipboard=unnamed,autoselect
```

有効化するためにはリビルドする必要があり、
これまで我が子のように愛情を注いできたVimをリビルドなんて僕にはできませんでした。


# そこでxselを使います

コピーしたい箇所を選択後、`:w !xsel -ib`というコマンドで選択範囲をクリップボードに渡すことができます。

xselは`sudo apt-get install xsel`などでインストールできます。

.vimrcに下記のように設定すると便利でおすすめです。

```.vimrc
vmap <C-c> :w !xsel -ib<CR><CR>
```

これで、Control + C で選択箇所がクリップボードに共有されます。
gistの貼り付けタグのScriptからHTMLにする。

Gistの貼り付けタグは で、 document.writeオン・パレードです。これでは、検索にインデックスに反映されないし、なによりdocument.writeは嫌過ぎるので、gistの貼り付けタグから、貼り付け用のHTMLタグを生成することにした。

```ruby:gist2html.rb
!/usr/bin/env ruby
coding:utf-8

require 'openssl'
 require 'open-uri'
 require 'rubygems'
 require 'json'

if ARGV.size < 1 || ! (/([0-9]+)/ =~ ARGV[0])
 puts "Usage : Gist のIDを指定。"
 puts "以下のように指定"
 puts " #{FILE} https://gist.github.com/3033059 "
 puts " #{FILE} https://gist.github.com/3033059.js "
 puts " #{FILE} https://gist.github.com/3033059.json "
 puts " #{FILE} 3033059 "
 exit
 end

id = $1
 json = open("https://gist.github.com/#{id}.json").read
 data = JSON.load json
 puts '<link rel="stylesheet" href="https://gist.github.com/stylesheets/gist/embed.css"/>'
 puts data["div"]
 ```
関数の引数の数を取得


`length` プロパティで取得できます。すごく基本的なことなのに知りませんでした。

```js
(function () {}).length
// -> 0

(function (a, b, c) {}).length
// -> 3
```

関数の中では `arguments.callee.length` で取得できます。実際に渡された引数の数とは別モノです。

```js
(function (a, b, c) {
  return [arguments.callee.length, arguments.length];
})('Hello, World!');
// -> [3, 1]
```
Mountain Lion NotificationCenter


Mountain Lionで通知センターに投稿するアプリを作ってみました。

    NSUserNotification *notification = [[NSUserNotification alloc] init];
    [notification setTitle:@"タイトル"];
    [notification setInformativeText:@"表示する内容"];
    [notification setDeliveryDate:[NSDate dateWithTimeInterval:0 sinceDate:[NSDate date]]];
    [notification setSoundName:NSUserNotificationDefaultSoundName];
        
    NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter];
    [center scheduleNotification:notification];

とりあえず、上記の様にしてボタンを押すようなアプリを作れば、通知センターにセットしたい物を表示できます。

実際に作ったアプリは評判を見て公開しようと思います。
Sublime Text 2 の便利な設定例


## 保存時に行末スペースを削る

```json:Preferences.sublime-settings
{
  "trim_trailing_white_space_on_save": true,
}
```

## タブをスペースに変換

```json:Preferences.sublime-settings
{
  "translate_tabs_to_spaces": true,
}
```
Make Modular app  with require.js





```javascript

require.config({
		paths:{
			jquery: "lib/jquery-1.8.0",
			underscore:"lib/underscore",
			backbone:"lib/backbone",
			todo: "models/todo",
			todo_view: "views/todo_view"
		},
		// 依存関係、外部に出す変数を設定する
		//exportsはnode.jsのmodule.exportsと同じ考え.
		shim:{
			// "backbone" refer to paths["backbone"]
			"backbone":{
				// set dependency module.
				deps:["underscore","jquery"],
				// It's same as exports = Backbone
				exports: "Backbone"
			},
			// exports _.
			"underscore":{
				exports: "_"
			}
		}
});

```


```html
<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<script data-main="app/config" src="app/lib/require.js"></script>
		<script>
			// call main.js.
			require(["main"]);
		</script>
		</meta>
	</head>
	<body>
	</body>
</html>
```

```main.js
define(["jquery","underscore","backbone"],function($,_,Backbone){

	// write some great code!


});

```
GCDとBlocksを使って画像を読み込むメソッド書いてみた

GCD使えば非同期通信系が簡単に書けるので試してみた。

```
-(void)loadImageGCD :(UIImageView *)iv :(CGRect)rect :(NSString *)url{
    dispatch_queue_t q_global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_queue_t q_main = dispatch_get_main_queue();
    iv.frame = rect;

    dispatch_async(q_global, ^{
        NSString *imageUrl = url;
        UIImage *image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];

        dispatch_async(q_main, ^{
            iv.image = image1;
        });
    });
}
```

これで引数のUIImageViewをaddChildとかしておけば、UIImageがよみこまれたら、そこに表示されます。
Apache上で、Rails3を動かす


ローカル等で開発したRails3アプリケーションをApache上で動かそうとすると、以下のようなエラーが出力されることがあります。

>The requested URL /rails/info/properties was not found on this server.

/rails/info/propertiesは、Rubyのバージョンや、アプリケーションのrootディレクトリ、Environment等の設定が記載されているファイルです。

Passengerをインストールすることで解決しました。
.htaccessの設置やenvironment.rbの編集は不要でした。

```
$ gem install passenger
```

passengerがインストールできたら、Apache2モジュールのインストーラを起動します。
2回くらいEnterを押します。

```
$ passenger-install-apache2-module

[Enter]
[Enter]
```

最後に表示される以下のようなパスをApacheに読み込ませます。
confファイル名は適当で構いません。
ファイルを保存後、Apacheを再起動してください。

```
--------------------------------------------
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/is0me/.rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15/ext/apache2/mod_passenger.so
   PassengerRoot /home/is0me/.rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15
   PassengerRuby /home/is0me/.rvm/wrappers/ruby-1.9.3-p194/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
```

```console:/etc/httpd/conf.d/passenger.conf
LoadModule passenger_module /home/is0me/.rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15/ext/apache2/mod_passenger.so
PassengerRoot /home/is0me/.rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15
PassengerRuby /home/is0me/.rvm/wrappers/ruby-1.9.3-p194/ruby
```
PHPのHTMLパーサは PHP Simple HTML DOM Parser が結構便利だった


備忘録的なかんじで。

[PHP Simple HTML DOM Parser](http://simplehtmldom.sourceforge.net/)

jQueryみたいなセレクタだったりメソッドチェーンを使えたりというのが素敵です。

こんなかんじで書けます。

```sample.php
<?php
require_once 'simple_html_dom.php';

$html = file_get_html('test.htm');
$data = $html->find('ul li');
foreach($data as $d){
  echo $d->find('a', 0)->href;
}

```
くわしくはこちらを参照ください。
http://simplehtmldom.sourceforge.net/manual.htm
submodule の submodule を submodule として追加する

```
git submodule foreach "git config -f .gitmodules --get-regexp ^submodule\\.modules/.*\\.url$ || :" | grep ^submodule | sed 's/^\S\+\s//' | sort | uniq | sed 's/\(\([^\\/]\+\)\?\)$/\1 modules\/\2/; s/\.git$//; s/^/git submodule add /' | sh
```

収束するまでくりかえそう!

modules/* の modules/* を modules/* として追加します。こういう機能ないかと聞いたけどなかったので書いてみた。
aptでインストールしたmongodbがすぐに起動しないようにする、journal対策

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。


10genが配布しているmongodb、[aptなどで導入](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian-or-ubuntu-linux/)できて楽なんだが`Ver.2.0`以降ではjournalがデフォルトで有効になっている。

journal有効『= aptで入れた瞬間**3GBのDisk確保**に走る』ため(`/var/lib/mongodb`以下)、導入対象によっては結構な地雷となるのでこれを防ぐ。


## 起動スクリプトを確認する
Upstart用の起動スクリプトを見ると、`ENABLE_MONGODB`が文字列"yes"ならば起動するとあり、直後に`default`から設定を取得しようとしている。

```shell"/etc/init/mongodb.conf
-- snip --
script
  ENABLE_MONGODB="yes"
  if [ -f /etc/default/mongodb ]; then . /etc/default/mongodb; fi
  if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec  /usr/bin/mongod -- --config /etc/mongodb.conf; fi
end script
-- snip --
```

## 導入直後の起動を制限する
読むふりをしつつも`/etc/default/mongodb`はインストールパッケージに含まれていないので、なんでも良いので用意する。

```shell:/etc/default/mongodb 
ENABLE_MONGODB=断る
```

上記ファイル設置の後、`apt-get install mongodb-10gen`としてインストールすれば勝手には起動してこない。
Jasmineで書く遅延処理のテスト


waitsForの第一引数のfunctionを、timeout時間分絶えず実行し、trueが返れば続くrunsを実行。timeoutした場合はエラーを表示、という流れ。これで非同期のテストができる。

```javascript
var flg = false;
it('test', function () {
    setTimeout(function () {
        flg = true;
    }, 3000);
    waitsFor(function () {
        console.log(flg); //これが繰り返し呼ばれる
        return flg;
    }, 'Timed out', 1000);

    runs(function () {
        expect(flg).toEqual(true);
    });
});

```
長いこと知らなかったRの便利関数

## with関数
with(x, y)で、xの内容を含んだ環境の中でyを評価して返してくれる。attachじゃちょっとやり過ぎという状況で便利。

```R:
> with(iris, Sepal.Width + Petal.Width)
  [1] 3.7 3.2 3.4 3.3 3.8 4.3 3.7 3.6 3.1 3.2 3.9 3.6 3.1 3.1 4.2 4.8 4.3 3.8 4.1 4.1 3.6
 [22] 4.1 3.8 3.8 3.6 3.2 3.8 3.7 3.6 3.4 3.3 3.8 4.2 4.4 3.3 3.4 3.7 3.7 3.2 3.6 3.8 2.6
 [43] 3.4 4.1 4.2 3.3 4.0 3.4 3.9 3.5 4.6 4.7 4.6 3.6 4.3 4.1 4.9 3.4 4.2 4.1 3.0 4.5 3.2
 [64] 4.3 4.2 4.5 4.5 3.7 3.7 3.6 5.0 4.1 4.0 4.0 4.2 4.4 4.2 4.7 4.4 3.6 3.5 3.4 3.9 4.3
 [85] 4.5 5.0 4.6 3.6 4.3 3.8 3.8 4.4 3.8 3.3 4.0 4.2 4.2 4.2 3.6 4.1 5.8 4.6 5.1 4.7 5.2
[106] 5.1 4.2 4.7 4.3 6.1 5.2 4.6 5.1 4.5 5.2 5.5 4.8 6.0 4.9 3.7 5.5 4.8 4.8 4.5 5.4 5.0
[127] 4.6 4.8 4.9 4.6 4.7 5.8 5.0 4.3 4.0 5.3 5.8 4.9 4.8 5.2 5.5 5.4 4.6 5.5 5.8 5.3 4.4
[148] 5.0 5.7 4.8
```

## local関数
テンポラリな環境を作って、その中で式を評価する事が出来る。

```R:
> x <- "abc"
> z <- 100
> local({
+   x <- 1
+   y <- 2
+   x + y + z
+ })
[1] 103
> x
[1] "abc"
> ls()
[1] "x" "z"
```

## subset関数
データフレームから、特定の条件に合致する部分を抜き出す

```R:
> subset(iris, Species=="virginica")
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
101          6.3         3.3          6.0         2.5 virginica
102          5.8         2.7          5.1         1.9 virginica
103          7.1         3.0          5.9         2.1 virginica
略
```
PHPで使うGoFパターン ひとり Advent Calendar - コンポジット


コンポジットってなに?
--

再帰的に内包される内容物と器を同一視するということですね。はい、さっぱり分からない。要するにディレクトリもファイルもシンボリックリンクも同じように扱うということです。XMLのノードもアトリビュートも同じように扱うということです。組織図の中の部署に部長を立てて人間として扱い、課も係も、それぞれ代表を立てて、属する社員と同じように扱うということです。会社を法人として扱い、その中に属する社員も人間として扱うので同じように扱うことになるということです。抽象論としてはそんなところですね。天井も床も擬人化することでヤオイすることが出来るということです。要するに擬人化です。そういうことです。擬人化パターンと覚えておくと良いと思います。

コンポジットの構造
--
このパターンを説明するサンプルコードは大体ファイルシステムを例にとるので反逆しようと思ったのですが、他に良い例が思い付かなかったので、やっぱりファイルシステムにします。これが大人になるということですね。

- 共通インターフェース - 擬人化して同一視するための鍵ですね。インターフェースです。
- 実クラス達 - 擬人化されたいオブジェクト達です

```
<?php
interface IRemovable {
  public function remove ();
}

class Directory implements IRemovable{
  public function __construct ( $path ) {
    if ( !is_dir ( $path ) ) 
      throw new Exception ( 'ディレクトじゃないもん' );
    $this->_Path = preg_replace ( '#/$#', '', $path );
  }

  public function getList () {
    $result = array ();
    $d = opendir ( $this->_Path );
    while ( $f = readdir ( $d ) ) {
      if ( preg_match ( '#^\.+$#', $f ) ) continue;
      $path = $this->_Path . '/' . $f;
      if     ( is_file ( $path ) ) $result[] = new File ( $path );
      elseif ( is_dir ( $path ) )  $result[] = new Directory ( $path ); 
      else                      throw new Exception ( 'ファイルでもディレクトリでもないもん' );
    }
    return $result;
  }

  public function remove () {
    foreach ( $this->getList () as $obj ) $obj->remove();
    rmdir ( $this->_Path );
  }

  public function makeDirectory ( $name ) {
    mkdir ( $this->_Path . '/' . $name );
  }
}

class File implements IRemovable {
  public function __construct ( $path ) {
    if ( !is_file ( $path ) ) throw new Exception ( 'ファイルじゃないもん' );
    $this->_Path = preg_replace ( '#/$#', '', $path );
  }

  public function remove () {
    unlink ( $this->_Path );
  }

  public function saveFile ( $name, $data ) {
    file_put_contents ( $this->_Path . '/' . $name, $data );
  }
}

$dir = new Directory ( '/etc/tmp' );

// これで /etc/tmp 以下にファイルが有ろうとディレクトリが有ろうと、
// 全部削除出来ますね。
$dir->remove ();
```
ダミーテキスト(Lorem ipsum)

ダミーテキストとして使われる文言(Lorem ipsum)です。
よく忘れてしまうので、備忘録代わりに投稿しておきます。

```text:Lorem_ipsum.txt
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
```
javascript での関数部分適用

javascript での関数の部分適用([カリー化の説明を参考](http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96))は比較的カンタンにできます。
サンプルコードは CoffeeScript で書いています。

``` coffeescript
partial = (f) ->
  require_length = f.length
  partialized = (args...) ->
    if require_length <= args.length # 関数に必要な引数がすでに足りている
      g = f.apply(null, args.slice(0, require_length)) # 適用して結果を取り出す
      if typeof g is "function" # 結果、関数が返ってきた
        # args の余りから、次の関数を更に部分適用して返す
        partial(g).apply(null, args.slice(require_length)))
      else 
        g # 関数以外のものがきたら、適用しきった事にしてオブジェクトを返す
    else
      # 引数が足りてない場合、足りない引数を待ち受ける関数を返す
      partial_apply = (adds...) -> partialized.apply(null, args.concat(adds))
```

この `partial` は先に[β簡約](http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E8%A8%88%E7%AE%97#.CE.B2-.E7.B0.A1.E7.B4.84)を行い、正規形になるまで部分適用した関数を返す仕組みです。正確には [s-m-n定理](http://ja.wikipedia.org/wiki/S-m-n%E5%AE%9A%E7%90%86) と部分適用の組み合わせじゃないかとは思います。

また、一見 末尾再帰のように見えますが、関数かオブジェクトをすぐに返すのでコールスタックが深くなるような事はありません。

### 部分適用を利用したライブラリの実装例
``` coffeescript:cps.js
# 継続渡し Array forEach
cps_each = partial (iterator, callback, array) ->
  limit = array.length
  index = 0
  count = 0
  finished = no
  while index < limit
    next = (error) ->
      count += 1
      if not finished and (error or count >= limit)
        finished = yes
        callback error
    iterator next, array[index], index, array
    index += 1

# 継続渡し Array map
cps_map = partial (iterator, callback/*, array */) ->
  results = []
  mapping = null
  cps_each (next, value, index, iterable) ->
    mapping = (error, x) ->
      unless error
        results[index] = x
      next error
    iterator mapping, value, index, iterable
  , (error) -> callback error, results
```

`partial` 以下は普通の関数の書き方で宣言が書けます。この時、`partial` に渡す関数の仮引数の数は必要最小限で宣言するようにします。`cps_map` の例は「最終的に必要となる仮引数」を /* */ で伏せ、ソースの可読性を損なわないようにしています。

### 利用例
``` coffeescript:use_cps.js
# {number} を二乗して次の処理に渡す
# value が {number} でない場合、エラーオブジェクトを次の処理に渡す
cps_square = (next, value, index) ->
  unless typeof value is "number"
    next new TypeError "require number , but typeof value is {#{typeof value}: #{value}} at [#{index}]"
  else
    next null, x * x

# Array.<number> の各要素を二乗して次の処理に渡す
cps_square_map = cps_map cps_square/*, callback, array*/
# callback, array 共に現時点では指定されていない
# cps_square_map の後処理となる callback 、
# 具体的にイテレータを回したい array は
# 後から決める事ができる

cps_log = (error, result) ->
  console.log if error then "!!!ERROR!!! #{error}" else ":::SUCCESS::: #{result}"

square_map = cps_square_map cps_log

square_map [1, 2, 3] # 正常系
#=> :::SUCCESS::: 1, 4, 9

square_map [10, "dummy", 30] # 異常系
#=> !!!ERROR!!! TypeError: require number, but type of value is {string: dummy} at [1]

# 必要な引数を一気に渡しても当然よい。
cps_map cps_square, cps_log, [1, 2, 3]
#=> :::SUCCESS::: 1, 4, 9
```

以上のように、汎用性と応用に富む強力なユーティリティーを提供することができます。
CoffeeScript より後発で、より関数指向プログラミングを目的とした [LiveScript](http://gkz.github.com/LiveScript/) は `(x, y, z ...) -->` という書式で、カリー化された関数にコンパイルしますが、冒頭のような「引数を余らせたら更に適用できるか試す」ような実装にはなっていません。あと、あれもカリー化と部分適用の誤用な気がする…。
また、この実装には オプショナルな可変長引数に対して弱い面がありますが、それは別のエントリーで解説します。
PHP で複数のプロセスを並列して起動

[React](https://github.com/react-php/react) の真似事です。

PHP にスレッドはありませんが、[stream_select()](http://php.net/stream_select) と [stream_set_blocking()](http://php.net/stream_set_blocking) を使用することで、IO を多重化させ、並列処理を行うことができます。

初めに 1 秒置きに標準出力に出力し、最後に標準エラー出力に出力するだけの簡単なプログラムを用意します。
引数に渡した数値の数だけループします。

```ruby:slow.rb
ARGV[0].to_i.times do |n|
  STDOUT.puts n
  STDOUT.flush
  sleep 1
end
STDERR.puts "Bye"
STDERR.flush
```

次にこれを並列に起動するプログラムを PHP で実装します。
かなり汚いですが。

```php:parallel_proc.php
<?php
class ProcLoop
{
    private $procs = array();
    private $pipes = array();
    private $stdoutCallbacks = array();
    private $stderrCallbacks = array();
    private static $fdSpecs = array(
        1 => array('pipe', 'w'),
        2 => array('pipe', 'w'),
    );

    public function addProc($cmd, $stdoutCallback, $stderrCallback)
    {
        $this->procs[] = proc_open($cmd, static::$fdSpecs, $pipes);
        stream_set_blocking($pipes[1], 0);
        stream_set_blocking($pipes[2], 0);
        $this->pipes[] = array($pipes[1], $pipes[2]);
        $this->stdoutCallbacks[] = $stdoutCallback;
        $this->stderrCallbacks[] = $stderrCallback;
    }

    public function run()
    {
        $count = count($this->procs);
        while ($this->isAnyPipeAvailable()) {
            for ($i = 0; $i < $count; $i++) {
                $ret = stream_select($tmp = $this->pipes[$i], $write = NULL, $except = NULL, 1);
                if ($ret === false) {
                    throw new RuntimeException;
                } else if ($ret !== 0) {
                    foreach ($this->pipes[$i] as $sock) {
                        if ($buf = fread($sock, 4096)) {
                            if ($buf) {
                                if ($sock === $this->pipes[$i][0]) {
                                    call_user_func($this->stdoutCallbacks[$i], $buf);
                                } else {
                                    call_user_func($this->stderrCallbacks[$i], $buf);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private function isAnyPipeAvailable()
    {
        foreach ($this->pipes as $pipe) {
            if (feof($pipe[0]) === false || feof($pipe[1]) === false) {
                return true;
            }
        }
        return false;
    }
}

$loop = new ProcLoop;

$echoStdout = function ($buf) {
    echo "\033[34m[STDOUT]\033[0m " . $buf;
};

$echoStderr = function ($buf) {
    echo "\033[31m[STDERR]\033[0m " . $buf;
};

$loop->addProc('ruby slow.rb 3', $echoStdout, $echoStderr);
$loop->addProc('ruby slow.rb 6', $echoStdout, $echoStderr);
$loop->addProc('ruby slow.rb 9', $echoStdout, $echoStderr);
$loop->run();
```

これを実行すると、以下のような出力が得られます。

http://gyazo-yuyat.heroku.com/ad14ab7f96ad46856ea233a92a25db3f.png

3 つのプロセスが同時に起動し、起動時間の短いものから順番に終了していることがわかります。
全てのプロセスが終了した時点 (というかパイプが終端に到達した時点) でこの PHP スクリプトも終了します。

React でこういうのをやる場合、どんな書き方をするのがキレイなのか知りたい (というかまだ用意されていない?)

### See also

[php-uv](https://github.com/chobie/php-uv)
iOSでAPIのテストを気軽にかこう！


こんばんは！8/17担当の dealforest こと森本です。
Qiita に投稿はありませんが決してスパムアカウントではありませんのであしからずw

さて、本題ですが iPhone アプリを作成していると API の連携が必要なケースが頻繁にあるかと思います。
テストを書くためにロジックに手を加えないといけないのは**相当いけていない**からなるべくやりたくありません。

自社サービスの API ならまだ融通がきくと思います。
しかしードパーティの API ともなると色々と制限があったりそうもいってられないケースもあるでしょう。
Twitter の場合だと API 通信の回数に制限もあったりし、テストのためとはいえ気軽に叩くのはいかんともしがたいものがあります。

という状況もあり自分に言い訳をしテストをかかなかった時も僕にはありました。

そんなときに Ruby の [FakeWeb](http://rubygems.org/gems/fakeweb) に出会いました。(深夜の通販風w)

FakeWeb はロードし対象の URL を登録するだけで、リクエストを偽装してくれる優れものです。
そのためロジックは何も修正する必要なく処理を実行することができます。
めっさいけてるやん！！と inspire し作りました。
本家の機能をほぼ実装しています。

[dealforest/iOS-FakeWeb](https://github.com/dealforest/iOS-FakeWeb)

使い方などは[README](https://github.com/dealforest/iOS-FakeWeb/blob/master/README.markdown)や[テストケース](https://github.com/dealforest/iOS-FakeWeb/tree/master/FakeWebTests/Spec)などをみてもらえればと思います。
現状は **ASIHTTPRequest** と **NSURLConnection** を利用した場合に対応しています。
Core でそれらを使っているのなら利用することができます。

以下、軽くさわりだけでもどうぞ。

### 例

Twitter の publick timeline にアクセスするだけの method をもったクラスがあったとします。

```ObjectiveC:TwitterClient.h
@interface TwitterClient

-(NSString *) fetchPublicTimeline;

@end
```

```ObjectiveC:TwitterClient.m
#import "ASIHTTPRequest.h"

@implementation TwitterClient

-(NSString *) fetchPublicTimeline {
	NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"];
	ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
	[request startSynchronous];
	return [request responseString];
}

@end
```

##### 通常のリクエスト

```ObjectiveC
TwitterClient *client = [[TwitterClinet alloc] init];
NSLog(@"%@", [client fetchPublicTimeline]);
```
[このようなレスポンス](https://dev.twitter.com/docs/api/1/get/statuses/public_timeline)が反ってくると思います。

##### リクエストを偽装した場合

```ObjectiveC
#import "ASIHTTPRequest+FakeWeb.h"

[FakeWeb registerUri:@"http://api.twitter.com/1/statuses/public_timeline.json" method:@"GET" body:@"hoge" staus:200];

TwitterClient *client = [[TwitterClinet alloc] init];
NSLog(@"%@", [client fetchPublicTimeline]);
// hoge
```

### まとめ

このように FakeWeb のカテゴリ(AHIHTTPRequest+FakeWeb.h or NSURLConnection+FakeWeb.h)を import し registerUri:method:body:status: で登録するだけでリクエストを偽装することができます。
テストなのでリクエストを送信しないように等、**ロジックをいじる必要がまったくありません。**

実装するに辺り **Swizzle** を利用し initialize 時に method を差し替えているのですが、その辺りは近々ブログにでも書きます。

API のレスポンスをファイルに直接書くのも微妙なので curl 等でリクエストした結果をファイルに保存しておき FakeWeb にはファイルから読み込み登録するようにすれば、ある程度きれいに書けるかと思います。

これで安心して気軽に何度もテストを回すことができますね！
CI との相性も良いかと思います。

### TODO

* 現状だと**ARC**必須になっているので**非ARC**環境でも動くようにする
* AFNetworking での動作検証(最近はやってますね)
* CocoaPods の対応

またバグ、改善等あれば気軽に pull req や連絡くださーい。

ということで最近は [dealforest/iOS-FakeWeb](https://github.com/dealforest/iOS-FakeWeb) と [allending / Kiwi](https://github.com/allending/Kiwi) を用いて先にロジック部分をがっつり作るようになりましたとさ。

それでは良い週末を!
Vimからmilkodeのgmilkコマンドを使う(Unite版)

* [Vimからmilkodeのgmilkコマンドを使う(Quickfix版) #Vim #milkode #gmilk - Qiita](http://qiita.com/items/5a2b48f6f93c4ecc983b)

上記の記事の続き。

Uniteプラグインと、以下のUnite source をインストールすれば、以下のソースコードで、gmilk コマンドの実行結果を Unite インターフェースで表示してくれます。

# 必要なプラグインのインストール

(neobundle.vim のインストール方法は省略します)

```vim:.vimrc
NeoBundle 'Shougo/unite.vim'
NeoBundle 'sgur/unite-qf'
``` 

```vim
:NeoBundleInstall
``` 

* [Shougo/unite.vim · GitHub](https://github.com/Shougo/unite.vim)
* [sgur/unite-qf · GitHub](https://github.com/sgur/unite-qf)

# ソースコード

.vimrc にでも記述してください。

```vim
" gmilk コマンドの結果をUnite qf で表示する
command! -nargs=1 Gmilk call s:Gmilk("gmilk -a -n 200", <f-args>)

function! s:Gmilk(cmd, arg)
  silent execute "cgetexpr system(\"" . a:cmd . " ". a:arg . "\")"
  if len(getqflist()) == 0
	echohl WarningMsg
	echomsg "No match found."
	echohl None
  else
	execute "Unite -auto-preview qf"
	redraw!
  endif
endfunction
```

# 実行例

```vim
:Gmilk [検索語句]
```

# 実行結果

![このようにUniteインターフェースで表示されます](https://lh6.googleusercontent.com/-WrgtW5TYNpo/UC0YgAQYi8I/AAAAAAAAEhw/tMrz2xwtxOw/s800/2012-08-17_00h55_04.png)

`p`キーで該当ソースのプレビューができるのですごく便利！

# 追記

 -auto-preview オプションを追加したので、 `p`キーを押す必要なくなりました。