OmniAICreator/Qiita-1.07M huggingface dataset:
全テーブルのCreate Table文を作成する

ManagementStudioで出力した感じのスクリプトを作成します。
参考にしたサイト：[SQL Server PowerShell を使用した管理手法 第 2 回 実践編](http://technet.microsoft.com/ja-jp/sqlserver/ff730155.aspx)

```powershell:CreateTable.ps1
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")

$serverName = "localhost\SQLEXPRESS"
$databaseName = "AdventureWorks"

$scriptFile = "D:\テーブル.sql"

#追記するので既にファイルがある場合は出力ファイルを削除する
if (Test-Path $scriptFile) {
    Remove-Item $scriptFile
}

#データベース選択のコマンドを出力
Add-Content -Path $scriptFile -encoding Unicode -Value "USE [$databaseName]"
Add-Content -Path $scriptFile -encoding Unicode -Value "GO"


$server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverName)
$db = $server.Databases[$databaseName]

$scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter($server)
#出力するスクリプトの設定
$scripter.Options.FileName = $scriptFile          #出力先ファイル
$scripter.Options.Indexes = $true                 #インデックスを含める
$scripter.Options.ClusteredIndexes = $true        #クラスター化インデックスを含める
$scripter.Options.WithDependencies = $false       #依存オブジェクトを含めない
$scripter.Options.DriAll = $true                  #参照整合性の出力を含める
$scripter.Options.ToFileOnly = $true              #コンソール出力しない
$scripter.Options.Triggers = $true                #トリガーを含める
$scripter.Options.AnsiPadding = $true             #
$scripter.Options.AppendToFile = $true            #ファイルに追記する

[Microsoft.SqlServer.Management.Smo.SqlSmoObject[]]$db.Tables | 
%{
    $datetime = (Get-Date).ToString("MM/dd/yyyy hh:mm:ss.fff")
    $schema = $_.Schema
    $tableName = $_.Name

    #Drop文を出力
    Add-Content -Path $scriptFile -encoding Unicode -Value "/****** Object:  Table [$schema].[$tableName]    Script Date: $datetime ******/"
    $scripter.Options.ScriptDrops = $true
    $scripter.Script($_)

    #Create文を出力
    Add-Content -Path $scriptFile -encoding Unicode -Value "/****** Object:  Table [$schema].[$tableName]    Script Date: $datetime ******/"
    $scripter.Options.ScriptDrops = $false
    $scripter.Script($_)
}
```
Corona SDKのTableView + strict.luaでエラーが出た場合

Corona SDK（2012.894）のTableViewをstrict.luaと組み合わせて使ったところ、タップしたときに以下の様なエラーが出た。
（もしかしたら`'tableView'`は使っている変数によって異なるかも）

```
Runtime error
    variable 'tableView' is not declared
stack traceback:
    [C]: ?
    [C]: in function 'error'
    ...path/to//strict.lua:37: in function <...path/to/strict.lua:35>
    ?: in function '?'
    ?: in function '?'
    ?: in function <?:3095>
    ?: in function <?:229>
```

どう回避するかというと、これは未宣言の`tableView`に値が代入されようとしているというエラーなので、適当なグローバルの場所（functionの外）で`tableView`を宣言しておいてあげればいい。

```Lua
tableView = 1
```
PHPerがMacを買ったら、まずやるべきことまとめ


※ ネタです(独断と偏見に満ちています)


Xcode を インストールする
--
Mac OSX は 強そうなネコ科の動物の名前が付いてますが、そのままではgccも動かない牙を抜かれたニャンコちゃんなので入れ歯をしておきます。AppStoreでXcodeをインストールしておきます。なにはなくとも、これだけは必須。
Xcodeをインストールしたら「Preferences」→「Downloads」から「CommandLineTools」をインストールすれば入れ歯で強そうになったネコになります。

MacVimを入れる
--
香り屋さんに行ってMacVimを入れます。
これを入れないことには通常のテキスト編集ですら苦しみます。

http://code.google.com/p/macvim-kaoriya/

.vimrc の 設定、プラグインのインストールをやっておきましょう。
僕は、あまり変態的な設定は行わない派なので入れるモノは決まりきっておりますが、
Qiitaでvimタグを追うと面白いモノが見付かるかも知れません。

http://qiita.com/search?utf8=✓&q=vim


AquaSKKを入れる
--
これが無いと変換精度のアレな「ことえりさん」に翻弄されて日本語入力がママなりません。素直にSKKを入れて気持ち良い日本語入力ライフを送りましょう。

http://aquaskk.sourceforge.jp/

iTermを入れる
--
通常のTerminal.appだと、AquaSKKを使っている時にアレしてしまうのでAquaSKK対応版を入れましょう。

http://d.hatena.ne.jp/mrkn/20110707/iterm2_with_aquaskk

zshを既定のシェルにする
--
なんで、デフォルトがそうじゃないのか分からないのだけれど zshではないという現実を受け止めて素直にzshにしときましょう。

Mac => アカウント(ユーザーとグループ) => 鍵外す
  => 右クリック => 詳細オプション
    => ログインシェル => /bin/zsh
 変えたら ~/.zshrc を変更しておきます。
前の.zshrcが見当らなければ、

http://news.mynavi.jp/column/zsh/024/index.html

を参考にしてカスタマイズしましょう。

pearをインストールする
--
iTermが入って普通にオペレーション出来るようになったはずなので、pearを入れておきます。通常、他人の作ったプログラムを動かす時に、こいつに頼ると訳の分からないハマり方をするので、苦手な人も多いでしょうがPHPUnitをインストールするために使います。

```
sudo php /usr/lib/php/install-pear-nozlib.phar
sudo pear upgrad pear
sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover pear.symfony-project.com
sudo pear channel-discover components.ez.no
sudo pear install --alldeps phpunit/PHPUnit
```

LibreOfficeをインストールする
--

このWiki全盛時代に何故かOffice文書で共有されることもあるので、とりあえずOffice文書を開けるようにしましょう。そして社内Wikiに転載して素早い情報共有をしてOffice文書撲滅運動に参加しましょう。定型パターンが有るようならば、閲覧 => 転載 => メーリングリストに投げるところまで上手くスクリプトが書けると良いです。

http://ja.libreoffice.org/


kobitoをインストールする
--

Macを使っていて、これを使わない手は無いでしょう。markdowで、ちょっとした共有したい文書(社内向けの共有だろうと、機密に限らないものならQiitaに上げれば良いと思います)や、自分用のメモや使い捨てスクリプトなんでも放り込んでおきましょう。書くだけでも強く記憶に残るし、いざとなれば検索出来る。プレビューを見ながらwiki的に編集してシンタックスハイライトまで効くのは嬉しいです。

※ markdownよりtextileの方が好きです
※ 自宅のkobitoと同期したいです
※ ジャンクスクリプトをkobitoに入れておいて、そのまま実行したいです

http://kobitoapp.com/

今後のupdateに期待します
ラジオボタンの項目数が多すぎてもsimple_formでそこそこすっきり書く方法


ラジオボタンを[simple_form](https://github.com/plataformatec/simple_form)で表現するときは以下のような感じで書くと思います。

```ruby:app/views/surveys/new.html.haml
simple_form_for @survey do |f|
  - fav_dog_list = [["ラブラドールレトリバー", :a1], ["ゴールデンレトリバー", :a2], ["スタンダードプードル", :a3]
  f.input :fav_dog, as: :radio_buttons, collections: fav_dog_list
  # ...
end
```

これだと国際化対応するときに面倒なことになるし、しなくてもビューが荒れるので、こんな感じで分けて書くようになると思います。

```ruby:config/locales/simple_form_ja.yml
ja:
  simple_form:
    options:
      survey:
        fav_dog:
          a1: "ラブラドールレトリバー"
          a2: "ゴールデンレトリバー"
          a3: "スタンダードプードル"
```
```ruby:app/views/surveys/new.html.haml
simple_form_for @survey do |f|
  - fav_dog_list = [:a1, :a2, :a3]
  f.input :fav_dog, as: :radio_buttons, collections: fav_dog_list
  # ...
end
```

多少スッキリしましたが、`simple_form_ja.yml`にも選択項目の値が書いてあるのに、ビュー側にも書いてあるのは何だかDRYじゃない気がします。

そこで以下のようなモンキーパッチを施します。

```ruby:config/initializer/simple_form_expand.rb
# -*- coding: utf-8 -*-
module SimpleForm
  module Inputs
    class CollectionRadioButtonsInput < SimpleForm::Inputs::CollectionInput
      def input
        _collection = collection
        # translateが登録されている場合は、項目値としてtranslateのキー値を使用する
        if translate(:options).present?
          _collection = translate(:options).to_a.map { |elem| [elem.last, elem.first] }
        end
        label_method, value_method = detect_collection_methods

        @builder.send("collection_#{input_type}",
          attribute_name, _collection, value_method, label_method,
          input_options, input_html_options, &collection_block_for_nested_boolean_style
        )
      end
    end
  end
end
```

するとビュー側では以下のように書けるようになります。

```ruby:app/views/surveys/new.html.haml
simple_form_for @survey do |f|
  f.input :fav_dog, as: :radio_buttons
  # ...
end
```

ラジオボタンが100個ぐらいある入力システムを作っているときは便利ですね！
threadedにすると何故か遅い

-threadedでコンパイルすると何故か遅くなる。
2通りの実装書いたけど、どっちもだいたい同じパフォーマンスと傾向。

~~~ {haskell}
{-# LANGUAGE OverloadedStrings #-}

import           Control.Applicative
import           Control.Concurrent       (threadDelay)
import           Control.Concurrent.Async (async, race_, wait)
import           Control.Monad
import qualified Data.ByteString          as S
import           Data.ByteString.Char8 ()
import           Data.Conduit
import           Data.Conduit.Network
import           Network
import           System.Environment
import System.IO

main :: IO ()
main = withSocketsDo $ do
  [tn, rn] <- map read <$> getArgs
  server `race_` do
    threadDelay 1000
    mapM_ wait =<< replicateM tn (async $ client rn)

{-
server :: IO ()
server = runTCPServer (ServerSettings 12345 "*") $ \src sink -> src $$ sink

client :: Int -> IO ()
client n = runTCPClient (ClientSettings 12345 "localhost") $ \src sink ->
  src $$ cond =$ sink
  where
    cond = replicateM_ n $ do
      yield "hello"
      void await
-}

server :: IO ()
server = do
  ssock <- listenOn $ PortNumber 12345
  forever $ do
    (h, _, _) <- accept ssock
    let go = do
          bs <- S.hGetSome h 1024
          when (not $ S.null bs) $ do
            S.hPut h bs
            hFlush h
            go
    void $ async go

client :: Int -> IO ()
client n = do
  h <- connectTo "localhost" (PortNumber 12345)
  replicateM_ n $ do
    S.hPut h "hello"
    hFlush h
    _ <- S.hGetSome h 1024
    return ()
  hClose h
~~~
UbuntuのUnityのオーバーレイスクロールバー無効化

スクロールバーが出たり出なかったりという最近のUIが苦手な場合、UbuntuのUnityではこのようにします。

```sh:~/.xprofile
LIBOVERLAY_SCROLLBAR=0
export LIBOVERLAY_SCROLLBAR
```

これはXのセッションを通して保持していればよい環境変数で、一度設定したら変更する必然性はそうそうありません。ですので、~/.bashrcなどより~/.xprofileに書くほうがよいでしょう。liboverlay-scrollbarパッケージを削除したり、/etc/X11/Xsession.d配下にスクリプトを置いたりという方法も紹介されていますが、個人の好みの問題であることを考えると、やはり~/.xprofileがおすすめです。

筆者は（Mac ）OS Xでもスクロールバーが出たり出なかったりというのが苦手で、こちらは「システム環境設定」で調整しました。
Railsで大量のレコードに対してeachしたい時のfind_each

数千行とか数万行のレコードに対して何かしたい時にeachを使うとメモリがやばいときがあるでしょう、そんな時のために`find_each`というのがあります。

```ruby
Post.where(:deleted_at => nil).find_each do |post|
  puts post.subject
end
```

さらに、1レコードずつやってたら時間かかりすぎるわって場合は0～10000レコードぐらいずつ処理してくれる`find_in_batches(options = {}) `というのもあります。
(normal-top-level-add-subdirs-to-load-path)を使うときはdefault-directoryをletで束縛しておく必要がある

`(normal-top-level-add-subdirs-to-load-path)`を使うときは`default-directory`をletで束縛しておく必要があります。

```el:~/.emacs.d/init.el
(let (major name path)
  (setq major (number-to-string emacs-major-version))
  (setq name (concat "emacs" major))
  (setq path (concat "~/share/" name))
  (setq my-user-lisp-dir
    (expand-file-name (concat path "/user-lisp")))
  (if (file-directory-p my-user-lisp-dir)
    (progn
        (add-to-list 'load-path my-user-lisp-dir)
        (let ((default-directory my-user-lisp-dir))
          (normal-top-level-add-subdirs-to-load-path)))))
```

そうしないと何が起こるか、答えは「いまいるディレクトリ配下のすべてを`load-path`に追加しようとする」です。

~/.emacs.d/init.elに書いてしまったらたぶん、Emacsが始まらなくなります。
insync beta

Googleドライブのファイルを手元のLinuxマシンと同期できる
[insyncのβ4がリリースされた][1]のでインストールしてみた。

  [1]: https://forums.insynchq.com/discussion/1437/insync-for-linux-beta-4-0-9-19

手元のマシンは64ビットのUbuntuなので
[insync-beta-ubuntu_0.9.19_amd64.deb][2]をダウンロードして、そのまま
「dpkg -i insync-beta-ubuntu_0.9.19_amd64.deb」でインストールするだけ。
依存しているパッケージは「libappindicator3-1」「xdotool」「nautilus」
「python-nautilus」の4つだが、通常のUbuntuであれば入っており、手元のマ
シンでも特に考慮する必要はなかった。

  [2]: http://s.insynchq.com/builds/insync-beta-ubuntu_0.9.19_amd64.deb

KDEユーザの場合は「Tested on MintKDE and Kubuntu.」である
「insync-beta-kde_0.9.19_{amd64|i386}.deb」を使うことになるが、Xfceユー
ザについてはケアされていない様子。

Dashから「insync」と入力するとinsyncのアイコンがあらわれるのでそのまま
クリックして起動する。起動するとインジケータ領域にアイコンがあらわれる。
一旦ブラウザに制御が移り、GoogleアカウントでのログインとInsyncへの権限
移譲を済ませたあと、Dropboxと同じように同期をとりはじめる。

ログイン時に起動しておきたければ、端末で~/.config/autostartに移動して以
下のようにしてautostart内に/usr/share/applications/insync.desktopへのシ
ンボリックリンクを作成すればよい。

    h12o@bethel:~/.config/autostart$ ln -s /usr/share/applications/insync.desktop .

では使ってみようか…と思ったのだが、ここでトラブルが発生。

Insyncは文書だと「.doc」に、スプレッドシートは「.xls」に、それぞれ拡張子を自動でつけてくれる。で、これをLibreOfficeで開くとどうなるかというと、実はうまく開かない。これは、LibreOfficeはInsyncがダウンロードしたドキュメントを、拡張子が「.doc」「.xls」であることから、「Office 2003以前の形式のOfficeドキュメントだ」と認識するのだけれど、実際のところInsyncがダウンロードしたドキュメントがOffice 2007形式であることによるもの。

原始的ではあるけれど、Insyncフォルダからファイルをローカルにコピーして、拡張子を「.ods」「.xlsx」にしてそれぞれLibreOfficeで開くことを試してみると、「.xlsx」にすることで開くことが分かる。拡張子でいえば「.docx」「.xlsx」になっているのが正しいのだけれど、そうなっていない様子。意図的なものなのかバグなのか、理由はよく分からない。
振舞駆動、cucumberで描くBDD受け入れテスト

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

[cucumber](http://cukes.info/)は受け入れテストにいい。
開発者が書くのはまったくもってよろしくないが、承認側としては読めないプロダクション用のコードをレビューするより実用的だ。

## 受け入れ側の書くシナリオ

冗談のようだが日本語でいい。
`ssl_check.feature`というファイルには正にこのように書いてある。


```cucumber:ssl_check.feature
# language: ja
機能: 証明書期限のテスト
  証明書の更新漏れを確かめるために
  利用者の立場から
  期限を確かめたい

シナリオ: 証明書期限について
  前提 my.z-cloud.jp にアクセスして
  もし 証明書の情報がとれた
  ならば 期限が 360 日より長いか確認する

シナリオ: 証明書期限について
  前提 my.z-cloud.jp にアクセスして
  もし 証明書の情報がとれた
  ならば 期限が 30 日より長いか確認する
```

## 受け入れテストを実施する

先ほどのシナリオを実行する。

```
$ cucumber 
# language: ja
機能: 証明書期限のテスト
  証明書の更新漏れを確かめるために
  利用者の立場から
  期限を確かめたい

  シナリオ: 証明書期限について           # features/ssl_check.feature:7
    前提my.z-cloud.jp にアクセスして # features/step_definitons/steps.rb:2
    もし証明書の情報がとれた            # features/step_definitons/steps.rb:17
    ならば期限が 360 日より長いか確認する   # features/step_definitons/steps.rb:21
      証明書の残り期限は 34日 のようです (RuntimeError)
      ./features/step_definitons/steps.rb:23:in `/^期限が (\d+) 日より長いか確認する$/'
      features/ssl_check.feature:10:in `ならば期限が 360 日より長いか確認する'

  シナリオ: 証明書期限について           # features/ssl_check.feature:12
    前提my.z-cloud.jp にアクセスして # features/step_definitons/steps.rb:2
    もし証明書の情報がとれた            # features/step_definitons/steps.rb:17
    ならば期限が 30 日より長いか確認する    # features/step_definitons/steps.rb:21
      証明書の残り期限は 34日 あります

Failing Scenarios:
cucumber features/ssl_check.feature:7 # Scenario: 証明書期限について

2 scenarios (1 failed, 1 passed)
6 steps (1 failed, 5 passed)
0m0.206s
```

想定したシナリオ通りになっていないものをFailさせる。
Ubuntu 12.04 に StumpWM をインストールする

Readme の通りに最新版をインストールしようとすると CLX のインストールでエラーが大量に出た。StumpWM のインストールは Quicklisp を利用したほうが良さそうだ。
https://wiki.archlinux.org/index.php/Stumpwm の With Quicklisp に従えばうまくインストールできた。
Postfixのsaslauthdを利用したSMTPAUTHが失敗する場合のチェックリスト

※ Ubuntu 12.04 LTSの場合

* master.cfを確認してsubmissionなどがchrootになっている場合は、/etc/default/saslauthd のコメントに書かれているように、「OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"」とする。
* /var/run/saslauthdにアクセスできるよう、sasl groupにpostfixユーザを加える。
Xcode4.5でiOSデバイスのクラッシュログを読むには

symbolicatecrashを使用する

##位置
```vim:path
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/Current/Resources/symbolicatecrash
```
なので

```vim:path
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/Current/Resources

```
にパスを通しておくと便利

##dSYMの位置（シミュレーターの場合）
プロフェクトファイル/build/iphone/build/Debug-iphoneos内
これを適当な場所にコピーしとくと良い

##参考URL
http://icecocoamix.blogspot.jp/2012/10/symbolicatecrash.html
mergeコミットをrevertする

Git flowなんかを使っているとこんな感じのコミット履歴ができあがる

```
--A--------M
    \     /
     B---C   <- feature/foo  branch
```

ここでブランチ `feature/foo` 自体が要らなくなったと場合は次のように revert する

```
git revert -m 1 M
```

すると

```
--A--------M---M'
    \     /
     B---C
```

となり、コミット `M'` と `A` は同じ状態になる。

詳しくは [revert-a-faulty-merge.txt](http://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt)
ハイフン区切り形式の MAC アドレスを取得する -1 liner 編-

一応 `uuid.getnode()` を使えば MAC アドレスは取得できますが、結果は 48bits の 10 進整数です。
ifconfig や getmac コマンドの XX-XX-XX-XX-XX-XX という
ヒューマンリーダブルな形式で表示したい！というわけで作ってみました。

```python:getmac.py
import struct, sys, uuid; sys.stdout.write( "-".join( [hex( fragment )[2:].zfill( 2 ) for fragment in struct.unpack( "BBBBBB", struct.pack( "!Q", uuid.getnode() )[2:] )] ) + "\n" )
```

確認してみましょう。
まずは getmac の出力です。
(プロンプトがしょんぼりしているのは仕様です。突っ込まないでください)

```cmd
(´･ω･`)o( getmac

物理アドレス        トランスポート名
=================== ==========================================================
00-25-22-E0-A0-F5   \Device\Tcpip_{0C99CB65-8BF1-4AE6-AD00-8A3D7369C745}
```

では次に getmac.py を実行してみます。

```cmd
(´･ω･`)o( getmac.py
00-25-22-e0-a0-f5
```

アルファベットが大文字か小文字かの違いはありますが、
MAC アドレスとしては同じ値が得られました。

なお、PYTHONSTARTUP で読み込むファイルに次のコードを追加しておくと
Python インタラクティブシェルの中で `getmac()` 一発で取得できるようになります。

```python:startup.py
import struct
import uuid
getmac = lambda : "-".join( [hex( fragment )[2:].zfill( 2 ) for fragment in struct.unpack( "BBBBBB", struct.pack( "!Q", uuid.getnode() )[2:] )] )
```

2012-10-03 16:40
print 文だと Python 3.x 系で動作しないため修正しました。

2012-10-04 10:58
Python 3.x 系だと string モジュールに zfill がないので修正しました。
互換性を大きく損なう仕様変更は、本当に勘弁してもらいたいものです。
メモ：Modern Objective-C

## Apple LLVM compiler 4.0 (Xcode 4.4, 実質 Lion 以降) から使える新しい記法

- @synthesize 省略可（自動的にやってくれる）
- NSArray, NSDictionary, NSNumber 用の新しいリテラル（NSStringみたいに@でかけるやつ）
- NSArray, NSDictionary の要素にC言語配列みたいに [] でアクセスできる

## その他

- IBOutlet / IBAction の宣言も .m 内に記述、.h には必要最低限公開していい分だけ
- IBOutlet はプロパティで良い気がする
- プロパティに対応する暗黙に作られるインスタンス変数は、"_プロパティ名"
- 無名カテゴリ
- .m に無名カテゴリで @interface {} を追加していたが、@implementation に直接 {} つけられる模様
- `メニューバー` > `Edit` > `Refactor` > `Convert to Modern Objective-C Syntax…` で Modern 記法に変換できるが、精度はどこまで信用できるかは分からない
- Blocks, 積極利用しよう。Delegate めんどくさい（Delegate を完全に置き換えるものではない）
- ARC（そろそろ勉強しよう）
- Fast Enumeration (for-in)
- Method Swizzling / ポージング廃止（SIMBL 系プラグイン、ハックで活躍？）

Mac OS X 10.4 Tiger の頃の Objective-C と比べると、だいぶ様変わりした感がある。
chmodで設定する権限の書き方

`chmod [権限] [FileName]`

[権限]は「ユーザーと権限を指定するもの」と「数字表記」2通りの書き方がある。

# ユーザーと権限を指定するもの

`[誰に][どんなふうに][どの権限を]`

* 誰に u(ser), g(roup), o(thers), a(ll)
* どんなふうに +, -, =
* どの権限を r, w, x

ex)

```
chmod u+x hoge.sh
chmod a+w index.html
```

# 数字表記

`[所有者][グループ][その他]`

* 権限によってポイントが積み上がる
 * r = 4
 * w = 2
 * x = 1

読出・書込・実行が可能であれば 4+2+1=7
読出・実行が可能であれば 4+1=5
読出のみなら 4 ...とかそんなかんじ

ex)

```
chmod 744 hoge.sh
chmod 655 index.html
```

いつもパッと頭に浮かんでこないのでまとめておく
parallel_testsとsimplecovを同時に使うとcoverageが正しく計算されない問題を解決する

parallel_testsを使うと、プロセスが複数立ち上がるため、
設定無しでsimplecovと併用すると、coverageが上書きされてしまって、一つのプロセス分しか結果が残らない。
なので、多少ハックが要る。
実は、githubのissueにちゃんと解決策が書いてあるんで、使い込んでる人には既知だと思うけど、
英語なので日本語化プラス自分が使ってる方法ということで書いておく。

```ruby:spec_helper.rb
Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'

  # for SimpleCov
  unless ENV['DRB']
    require 'simplecov'
    SimpleCov.merge_timeout 3600
    SimpleCov.command_name "rspec_#{Process.pid.to_s}#{ENV['TEST_ENV_NUMBER']}"
    SimpleCov.start 'rails'
  end

  # ... 以下、ライブラリの読み込みとか、RSpec.configureとか
  # ... 中略
end

Spork.each_run do
  if Spork.using_spork?
    ActiveSupport::Dependencies.clear
    ActiveRecord::Base.instantiate_observers
    FactoryGirl.reload
  end

  # This code will be run each time you run your specs.

  # for SimpleCov
  if ENV['DRB']
    require 'simplecov'
    SimpleCov.merge_timeout 3600
    SimpleCov.command_name 'rspec'
    SimpleCov.start 'rails'
  end
end
```

sporkを使ってない場合は、最初の`require 'simplecov'`以下をspec_helperの頭に書いておけばいいと思う。
要は、以下の設定が必要。

- カバレッジの結合時間のタイムアウトを指定して、その時間以内のテスト実行ならマージされるようにする。
- プロセスIDやテスト実行番号を使ってカバレッジ結果が別々のコマンドで実行されたように見せる。
- bundlerで勝手にrequireしないように、`:require => false`を渡しておく

cucumberでもsuppot/env.rbに同様の設定をすれば、parallel_testsに対応できる。

しかし、guard-sporkでテスト回してる時はカバレッジ出たり出なかったりする。
cucumberでは出るのにrspecでは出ないとか、よくわからない・・・。
まあ、parallelで回す時はspork使えないから別にいいかと細かい所は諦めている。
もうちょっといいやり方をご存知の方は、是非御教授をお願いします。

参考:
[Automatically detect the usage of parallel tests and modify setup · Issue #64 · colszowka/simplecov](https://github.com/colszowka/simplecov/issues/64)
Eclipse Plugin 開発で外部 jar を利用する

データベースのドライバを利用した Eclipse Plugin を作成・使用するとき，今までは使用する Eclipse にそのドライバをインストールしてから Plugin をインストールしていた (プラグイン側ではこれを依存関係に追加していた) のだが，sqlite-jdbc-3.7.2.jar を使用したいと思ったときにこれを plugins フォルダに突っ込んでも利用できなかったので色々調べてみた．どうやら外部 jar を使用する方法はこの方法と違うらしい．

外部 jar をプラグインで使用する方法は以下の通り．

1. プロジェクト内に jar ファイルを配置 (/lib など)
2. パッケージエクスプローラで使用したい jar ファイルをクラスパスに追加
3. plugin.xml の Runtime タブの右下の Classpath で，クラスパスに追加した jar ファイルを選択
4. 同じく Runtime タブの左側の Exported Packages で使用するパッケージを追加
5. Build タブで追加した jar ファイルにチェックをつける

しっかり確認していないが，sqlite-jdbc-3.7.2.jar に対してこれを行ったところ，Class.forName("org.sqlite.JDBC") がうまくいった．
営業日を計算するモジュールとかググってみた

ざっと10分程度ググってみたメモ

pearとかcpanでは検索してない

検索対象はプライベートと仕事でよく使うPerlとPHPとExcel

## Excel

Excelには営業日計算する関数があるらしい

* 営業日計算のための日付関数テクニック [エクセル（Excel）の使い方] All About
http://allabout.co.jp/gm/gc/297798/

## PHP

PHPではめぼしい情報はなかった。一応以下の記事がヒット

* ウェブレン社長 ３６０°ブログ » 営業日計算プログラム（PHP)
http://www.360walk.com/index.php?itemid=13

ただ、これは事前に休日情報をCSVで用意しないといけないらしい。めんどくさい

## Perl

* 実働日（営業日）を判定するモジュールを書いてみた - Perl勉強メモ アルパカDiary出張版
http://d.hatena.ne.jp/tori243/20110604/1307204562

任意で休日追加できるみたいだし、モジュールってことで好きなとこに組みこめられそうな感じ

まずはこれを使ってみよー
Mailmanのwithlistコマンドによる一括設定変更

組織の運用ポリシーの変更などによりメーリングリストのアーカイブを削除することになった場合など、複数のメーリングリストの設定変更が必要になることがありますが、Webの管理画面からいちいち各メーリングリストに対して行うのは困難です。

このような場合に、Mailmanではwithlistコマンドが利用できます。

まずは1つのメーリングリストを対象にして、設定変更ができることを確認します。バイナリ形式で保存されている現在の設定を、dumpdbコマンドで確認します。

```
# cd /var/lib/mailman
# bin/dumpdb -p lists/mlname/config.pck | grep archive
    'archive': True,
    'archive_private': 0,
    'archive_volume_frequency': 1,
```

現在mlnameというメーリングリストではアーカイブが有効になっています。これを無効に変更します。

準備として、設定変更の処理をPythonスクリプトで用意します。引数としてメーリングリストのオブジェクトが渡されるので、Lock()とSave()の間で設定変更を行います。

```python:disable_archive.py
def disable_archive(mlist):
    mlist.Lock()
    mlist.archive = False
    mlist.Save()
```

withlistコマンドでPythonスクリプトに書かれた処理を適用します。

```
# withlist -r disable_archive mlname
Importing disable_archive...
Running disable_archive.disable_archive()...
Loading list mlname (unlocked)
Unlocking (but not saving) list: mlname
Finalizing
```

これで設定変更ができました。念のため確認してみます。

```
# bin/dumpdb -p lists/mlname/config.pck | grep archive
    'archive': False,
    'archive_private': 0,
    'archive_volume_frequency': 1,
```

設定変更ができることが確認できたら、今度は全てのメーリングリストに対して適用するため、メーリングリスト名の代わりに「-a」オプションを利用します。

```
# withlist -r disable_archive -a
Importing disable_archive...
Running disable_archive.disable_archive()...
Loading list ml1 (unlocked)
Loading list ml2 (unlocked)
Loading list ml3 (unlocked)
(省略)
Loading list ml99 (unlocked)
```

これで全てのメーリングリストで設定変更が行われました。念のため、いくつか適当にサンプリングして設定が変更されていることを確認します。

```
# bin/dumpdb -p lists/ml1/config.pck | grep archive
    'archive': False,
    'archive_private': 0,
    'archive_volume_frequency': 1,
```

大丈夫のようです。

Mailmanは通常はWebの管理画面から操作することが多いですが、コマンドラインでの操作ができると一気に運用が楽になります。
即時関数 (function($){ ... })(jQuery); をcoffeescriptで書く

WordPressなどの`$`が使えない、またプラグイン内部など`$`を使うべきでない環境で、即時関数の中でだけスコープを有効にする記法

```js
(function($) {

  ...

})(jQuery);
```
をcoffeescriptで書くとき、

```coffeescript
do ($ = jQuery) ->
  ...

```

で記述できます。
自前でラップしたのでコンパイル時はbareオプション -b を付けて

```sh
coffee -bc jquery.xxx.coffee
```

とするのがベター。
pythonで二分探索

初の二分探索を。
アルゴリズムの絵本の161PのC言語で書かれているものを自分なりにpythonに。
リストにない数字が入力された場合は機能しません。
リストの数字が昇順で並んでいること前提です。

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

x = [1, 8, 14, 23, 44, 55, 67, 88, 103, 146]
print x
print "探したい数字を入力"
i = int(raw_input())

low = 0
high = len(x)
# t は中央番目の数
t = (low + high) / 2 

# 探索の下限のlowが上限のhighになるまで探索
# lowがhighに達すると数は見つからなかったということ
while (low<=high):
    if (i==x[t]):
        break
    elif (i > x[t]):
        low = t + 1
    elif (i < x[t]):
        high = t - 1
    t = (low + high) / 2

if (i==x[t]):
    print str(t + 1) + "番目にあります"
else:
    print "ありません"
```
符号関数の速度比較

符号関数 sign(x) の実装方法2つのベンチマーク。

ベンチマークスクリプト
---

```perl:sign.pl
#!/usr/bin/env Perl

use 5.014;
use Benchmark qw/cmpthese/;

my @rands; push @rands, rand(10) for 1 .. 1000;
cmpthese(-5, +{
  div_by_abs => sub { my @signs = map { $_ ? $_ / abs : 0 } @rands },
  spaceship => sub { my @signs = map { $_ <=> 0 } @rands },
});
```

各手法の説明
---

- `div_by_abs` - 教科書通り。`x / |x|`
- `spaceship` - 大小比較で -1, 0, 1 を返す宇宙船演算子を利用

結果
---

```
             Rate div_by_abs  spaceship
div_by_abs 3336/s         --       -26%
spaceship  4490/s        35%         --
```

まとめ
---

想定通り。0除算回避の分岐もないし、組み込み演算子なので順当なところかと思います。
GitPythonでsubmoduleをforeach的にupdateする


```python:submodule_update.py
import git

repo = git.Repo(PATH_TO_REPO)

for sub in repo.submodules:
			sub.update(recursive=True, init=True, to_latest_revision=True,progress=None, dry_run=False)
```

テストしてないけど多分こんな感じ。
delete演算子についての覚え書き

## 1. delete演算子の特徴
* 文ではなく演算子（式中で使える）
* 削除できるのは"オブジェクトのプロパティ"だけ
* 変数や関数、組み込みプロパティを削除することはできない
* 参照先のデータ自体は削除されない

## 2. delete演算子で削除できるのはオブジェクトのプロパティ
### オブジェクトのプロパティだけを削除することができる
```js
var my_obj = {};

my_obj.a = "test 3";
delete my_obj.a;
my_obj.a; // undefined

my_obj.b = function() { return "test 4"; };
delete my_obj.b;
my_obj.b(); // Error!!
```
### 変数や関数、組み込みプロパティは削除できない
StrictモードではSyntax Errorとして扱われる。

```js
var x = "test 1";
delete x; // false, 削除できない
x; // "test 1"

function y() {
	return "test 2";
}
delete y; // false, 宣言された関数は削除できない
y(); // "test 2"

var list = [ 1, 2, 3, 4, 5 ];
list; // [ 1, 2, 3, 4, 5 ]
list.length; // 5
delete list.length; // false, 組み込みオブジェクトのプロパティは削除できない
list; // [ 1, 2, 3, 4, 5 ]
list.length; // 5
```
## 3. 特殊なケース
```js
var GLOBAL_OBJECT = window;
(function() {
	GLOBAL_OBJECT.x = "test 4";
	x; // "test 4", スコープチェーンにより上の式で設定した x になる
	delete x; // true, 削除できる

	// 1つでも同じ変数名を宣言したvar文があると、削除できなくなる。
	GLOBAL_OBJECT.y = "test 5";
	y; // undefined
	delete y; // false, 前後関係なく宣言した変数が優先されるため削除できない
	GLOBAL_OBJECT.y; // "test 5"

	var y = "test 6";
	y; // "test 6"

	delete y; // false
	delete GLOBAL_OBJECT.y; // true
	GLOBAL_OBJECT.y; // undefined
})();
```
var文で宣言した変数は、関数が実行される直前にundefinedとして初期化されているため、グローバルオブジェクトに設定した名前ではなく宣言した変数が優先される。
## 4. 参照先のデータ自体は削除されない
```js
var my_obj = {};
my_obj.a = [ 't', 'e', 's', 't' ];
my_obj.b = my_obj.a; // my_obj.aとmy_obj.bは同じデータを参照している
	
my_obj.a; // [ 't', 'e', 's', 't' ]
my_obj.b; // [ 't', 'e', 's', 't' ]
my_obj.a.push('2'); // '2'を追加
my_obj.a; // [ 't', 'e', 's', 't', '2' ]
my_obj.b; // [ 't', 'e', 's', 't', '2' ], 同じデータを参照しているので反映される

// my_obj.aを削除しても参照していたデータは残っている
delete my_obj.a;
my_obj.a; // undefined
my_obj.b; // [ 't', 'e', 's', 't', '2' ]
	
delete my_obj.b;
my_obj.a; // undefined
my_obj.b; // undefined
```
どこからも参照されなくなったデータがメモリから削除されるタイミングは、実行環境のガベージコレクションによる。
## 5. 参考
* [Understanding delete](http://perfectionkills.com/understanding-delete/)
* [JavaScript の変数と delete 演算子](http://nanto.asablo.jp/blog/2008/01/09/2552470)
githubでリポジトリを削除する方法

試しにgithubでリポジトリを作ったらどう削除していいかわからなくなりました

そこでリポジトリを削除する方法を紹介します

1.リポジトリのページで"Setting"を選びます
![admin](https://docs.github.com/assets/images/help/repository/repo-actions-settings.png)

2."Delete this repository"をクリック
![delete_repo](https://github-images.s3.amazonaws.com/help/repository/repo-delete.png)

3.警告を読んで、消したいリポジトリの名前を入力します
![readWarningAndEnterTheNameOfRepository](https://docs.github.com/assets/images/help/repository/repo-delete-confirmation.png)

4."I understand the consequences, delete this repository"をクリック

これでリポジトリを削除することができました。

参考文献
https://docs.github.com/en/repositories/creating-and-managing-repositories/deleting-a-repository
mochaとchaiを使ってcoffeescriptでBDD


coffeescriptでTDD/BDDをする場合の選択肢としては、jasimine-nodeなどがあるが、今回はmochaとその補完モジュールのchaiをためしてみる

* mocha http://visionmedia.github.com/mocha/
* chai http://chaijs.com/

インストール

```
$ sudo npm install -g mocha
$ sudo npm install -g chai
```

今回のファイル構成は下記。例としてTaskというクラスを作る

```
.
├── Cakefile
├── src
│   └── task.coffee
└── tests
    └── task_test.coffee
```


テストファイルを書く。Jasmineと同じようなexpectスタイルと、全てのObjectにshouldメソッドを追加するRSpec的なスタイルと両方使える

```coffeescript:tests/task_test.coffee
chai = require 'chai'
expect = chai.expect
chai.should() 
# add should method to Object.prototype

Task = require("../src/task").Task

describe 'Task',->
  t = null

  before ->
    t = new Task("foo bar")

  it "expects true is true like Jasmine", ->
    expect(true).be.true

  it "should be true like RSpec", ->
    true.should.be.true

  it "should rutern item string with toString",->
    t.toString().should.equal("foo bar")


  it "should return true with #did after done", ->
    t.did.should.not.be.true
    t.done()
    t.did.should.be.true
```

実装ファイル

```coffeescript:src/task.coffee
root = exports ? window

class root.Task
  did: false

  constructor: (item) ->
    @item = item

  toString: ->
    @item

  done: ->
    @did = true

```

テストを実行する

```
$ export NODE_PATH=/usr/local/lib/node_modules 
$ mocha --compilers coffee:coffee-script  tests/
```

オプションが面倒なのでCakefileを書いておく。


```coffeescript:Cakefile

process.env.NODE_PATH = '/usr/local/lib/node_modules'

cp = require 'child_process'

task 'test','run tests', ->
  cp.spawn "mocha"
    ,[ "--compilers","coffee:coffee-script","tests/"]
    ,{ stdio: 'inherit' }
```

すると下記のように実行できるようになる

```
$ cake test
```
Inline Assembly Code


Snippets 的に書いてみます。

オリジナルはこちら
http://www.barik.net/archive/2004/11/25/185507/

## Source And Destination

%eax を %ebx にコピー

```assmble:
mov %eax, %ebx 
```

## GCC Syntax

Inline Assembly の書き方

```C:
asm ( assembler template
      : output operands
      : input operands
      : list of clobbered registers       
     );
```

## 	Simple Inline Assembly

```C:
asm ("shrl $8, %0"
     : "=r" (answer) 
     : "r" (operand) 
     : "cc");
```

shrl（右シフト命令）を実行するためのアセンブラ。そのインプットが operand (Cの変数)で出力が answer。ダブルクオートの中身は、使用するレジスタ。r は特定のレジスタを指定せず動的に割り当てる。出力には = を書きましょう。cc は実行条件。$8 ＝ ８ビットシフト（たぶん）。

## Optimization

コンパイラに最適化を任せると良いけど、アセンブラで書いた方がメリットがある例としてMSBの求める。

```C:
int msb(int number)
{ 
  asm ("bsrl %1, %0" 
       : "=r" (position) 
       : "r" (number));

  return position
}
```

を for で書くと大変でしょ？っとことで。

```C:
long i;
for (i = (number >> 1), 
        position = 0; i != 0; ++position)
  i >>= 1;
```

## どうしてこうなった

カーネルコードでアセンブラ読むのをいつもあきらめてたので、そろそろ調べようかと思いまして。bsrl で検索したわけで。読みたかったのはこちら。

```C:arch/x86/include/asm/bitops.h
static inline int fls(int x)
{
        int r;
#ifdef CONFIG_X86_CMOV
        asm("bsrl %1,%0\n\t"
            "cmovzl %2,%0"
            : "=&r" (r) : "rm" (x), "rm" (-1));
#else  
        asm("bsrl %1,%0\n\t"
            "jnz 1f\n\t"
            "movl $-1,%0\n"
            "1:" : "=r" (r) : "rm" (x));
#endif 
        return r + 1;
}
```

メモ："m" はスタティックメモリ。"&"はインプットとアウトプットを別のレジスタにする。

上のコードを crash で見るとこんな感じでコンパイルされてる。

```assemble:
mov    $0xffffffff,%ebx
bsr    %r8d,%eax
cmove  %ebx,%eax
```

関数が inline されているので、```%r8d = "rm" (x)``` の代入部は呼び出し側のコードで都度変わるので省略。

## 合わせて読みたい
こちらもオリジナルのサイトから。感謝の気持ちが止まらない。
* [Linux Assembly HOWTO](http://www.tldp.org/HOWTO/Assembly-HOWTO/index.html)
* [Inline assembly for x86 in Linux](http://www-106.ibm.com/developerworks/library/l-ia.html)
* [x86.org Processor Manuals](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)

その他、ARMだけど。
* [ARM GCC Inline Assembler Cookbook](http://www.ethernut.de/en/documents/arm-inline-asm.html)

そして日本語が一番詳しかったとか orz
* [GCC Inline Assembler](http://caspar.hazymoon.jp/OpenBSD/annex/gcc_inline_asm.html)
ラムダおじさんの面白Proc#===講座

Ruby1.9 から `Proc#===` が追加され、 case 句の when の後ろにProcオブジェクトが使えるようになった。

以下のように利用できる。

```ruby
def say_odd_or_even(num)
  case num
  when :even?.to_proc
    puts "#{num} is even"
  when :odd?.to_proc
    puts "#{num} is odd"
  else
    puts "WTF"
  end
end
```

で、 `to_proc` がかなりダサいので、こういうのはどうかと

```ruby
module Kernel
  alias is lambda
end

def say_odd_or_even(num)
  case num
  when is(&:even?)
    puts "#{num} is even"
  when is(&:odd?)
    puts "#{num} is odd"
  else
    puts "WTF"
  end
end
```

思ったけど、やり過ぎ感高い。　〜完〜

## 追記

で、whenの後ろって確か「#===を実装しているオブジェクトなら何でもヨイ」はずだったので、

```ruby
class Symbol
  def ===(obj)
    self.to_proc.call(obj)
  end
end
```

こうしたんですよ、そうしたらやっぱり、

```ruby
(irb):4:in `call': undefined method `EXPR_BEG' for :EXPR_BEG:Symbol (NoMethodError)
```

って言われて irbごと(「Rubyごと」から修正)落ちました。同じようなことをする人がいたら危険なので共有します。！
挿入する画像のパスをルートからのパスにする


WordPress HTTPS プラグインで管理画面を https にすると、記事やページに挿入する画像のパスまで https になってしまい困ります。

以下のスクリプトを functions.php に。

```functions.php
function delete_host_from_attachment_url($url) {
  $regex = '/^http(s)?:\/\/[^\/\s]+(.*)$/';
  if (preg_match($regex, $url, $m)) {
    $url = $m[2];
  }
  return $url;
}
add_filter('wp_get_attachment_url', 'delete_host_from_attachment_url');
add_filter('attachment_link', 'delete_host_from_attachment_url');
```

サイトの移行の際にもパスを書き換えなくてすむので、便利です。

出典
http://www.warna.info/archives/20/
Reachabilityで通知が取れない場合

Reachabilityを利用してWifiやインターネットの通信可能・不可能を取る事ができる。これの通知を取る事が出来なくて数時間を無駄にしてしまったので記す。

```objc
Reachability *internetReach = [Reachability reachabilityForInternetConnection];
```

のように作成したReachabilityのインスタンスは、インスタンス変数にしておく等してメモリ上に継続して保持していなければいけない。上記の用にローカル変数に確保したままにして保持しなかった場合、アプリが落ちるのではなく通知が来ないという結果になる。

こんな簡単な事に気づくのに時間がかかってしまった。
変更があったファイルだけエクスポートする


以下のコマンドで、OLD_COMMIT と NEW_COMMIT の間に変更があったファイルだけ取り出せる。
OLD_COMMIT バージョンが old ディレクトリに、NEW_COMMIT バージョンが new ディレクトリに出力される。

```sh
OLD_COMMIT=$1
NEW_COMMIT=$2
for file in `git diff --name-only $OLD_COMMIT $NEW_COMMIT` ; do
	git archive --prefix=old/ $OLD_COMMIT $file | tar -xf - ;
	git archive --prefix=new/ $NEW_COMMIT $file | tar -xf - ;
done
```

* `git diff --name-only` で違いがあるファイルの名前だけを取得する
* `git archive` でそのファイルを取り出す

# 補足：git archive コマンド

`git archive` コマンドはちょっと癖があるけど、うまく使うと便利。

* 標準出力に tar 形式で出力されるので、個々のファイルとして取り出すには tar コマンドにパイプする必要がある
* ファイル名を指定すると、特定のファイルだけを取り出せる（tar 展開なのでいちいち mkdir しなくてもディレクトリが生成されるのが嬉しい）
* prefix オプションで出力先ディレクトリを指定できる（このとき、最後にスラッシュを付ける必要がある）
haxenode でエラー window is not defined

[HaxeでつくるWebアプリ開発(node.js + Express) | 深追い Fukaoi.org](http://blog.fukaoi.org/2012/06/19/haxe_nodejs_express) を参考に、[haxenode](http://haxenode.org/)を使ってみたときにハマったこと。

```as:rootnode.hx
import js.Node;

class RootNode {
	static function main() {
	 var server = Node.http.createServer( function(
	      req:NodeHttpServerReq, res:NodeHttpServerResp){
	        res.setHeader("Content-Type","text/plain");
	        res.writeHead(200);
	        res.end(Hoge.print());
	      }
	    );
	 
	    server.listen(1337,"localhost");
	    trace( 'Server running at http://127.0.0.1:1337/' );
   	}	
}

@:keep
@:expose
class Hoge {
	public static function print():String {
		return "Hello World.\n";
	}
}
```

こんな感じでサンプル作って、

	node rootnode.js

を実行したところ、


>/.../bin/haxenode.js:53
	var o = window;
	        ^
ReferenceError: window is not defined
    at $hxExpose (/.../bin/haxenode.js:53:10)
    at /.../bin/haxenode.js:13:1
    at Object.<anonymous> (/.../bin/haxenode.js:62:3)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

こんなエラーが出ました。

いろいろ試したところ、Hoge クラスに ```@:keep``` と ```@:expose``` をどちらも指定するとダメみたい。どちらか片方だけなら正常。
[--dead-code-elimination](http://haxe.org/doc/compiler) をあきらめて、minify とかすればいいのかな。
```@:keep``` と ```@:expose``` は意味が被る、というか expose は keep を包括するような感じなので、@:expose だけでよさそうな気もします。

##参考
* [Tips and Tricks - Haxe](http://haxe.org/manual/tips_and_tricks)
コミットメッセージに指定した言葉を含むコミットを表示

```
$ git log --grep=word
```

用途としてはredmine等のチケット番号で運用していれば(refs, ブランチ名など)、その番号などを指定しても良い。

個人的にはdiffを見たい事が多いので次のオプション(-p)も追加

```
$ git log -p --grep=word
```

[参考:Stackoverflow (How to grep git commits for a certain word)](http://stackoverflow.com/questions/1337320/how-to-grep-git-commits-for-a-certain-word)
イテレーター非同期

[イテレーター非同期](http://ufcpp.net/study/csharp/misc_asyncflow.html#iterator)

BeginCheckWithIteratorメソッドの実装ですが、これは単純に、Actionを先頭から実行していってる。

CPSをモナドと見るならば、sequence_ と同じ。
sequence_ はfoldrで実装されているので、同じようにするならこう。
（ただし、無駄にややこしい）

```c#:EnumerableEx.cs
    public static class EnumerableEx
    {
        public static TResult FoldRight<TSource, TResult>(this IEnumerable<TSource> source, TResult seed, Func<TSource, TResult, TResult> func)
        {
            Stack<TSource> stack = new Stack<TSource>(source);
            foreach (TSource element in stack)
                seed = func(element, seed);
            return seed;
        }

        public static TResult FoldRightStrict<TSource, TResult>(this IEnumerable<TSource> source, TResult seed, Func<TSource, TResult, TResult> func)
        {
            var iter = source.GetEnumerator();
            Func<TResult> rec = null;
            rec = () => (iter.MoveNext())
                ? func(iter.Current, rec())
                : seed;
            return rec();
        }

        public static TResult FoldRightNonStrict<TSource, TResult>(this IEnumerable<TSource> source, TResult seed, Func<Func<TSource>, Func<TResult>, TResult> nonStrictFunc)
        {
            var iter = source.GetEnumerator();
            Func<TResult> rec = null;
            rec = () => (iter.MoveNext())
                ? nonStrictFunc(() => iter.Current, rec)
                : seed;
            return rec();
        }
    }
```

```c#:CPS.cs
    public delegate void CPSAction(Action continuation);

    public static class CPS
    {
        public static CPSAction Bind(this CPSAction m, Func<CPSAction> k)
        {
            return c => m(() => k()(c));
        }

        public static CPSAction Sequence_(this IEnumerable<CPSAction> source)
        {
            CPSAction seed = c => c();
            Func<CPSAction, CPSAction, CPSAction> bindDiscard = (m, k) => m.Bind(() => k);
            return source.FoldRight(seed, bindDiscard);
        }

        public static CPSAction NonStrictSequence_(this IEnumerable<CPSAction> source)
        {
            CPSAction seed = c => c();
            Func<Func<CPSAction>, Func<CPSAction>, CPSAction> bindDiscard = (m, k) => m().Bind(() => k());
            return source.FoldRightNonStrict(seed, bindDiscard);
        }
    }
```

で、こう呼び出す。

```c#
CheckIterator(onComplete).NonStrictSequence_()(() => { });
```
JenkinsサーバーでAndroid SDKをupdateする


JenkinsをEWSのubuntuで動かしたときの話し。
まず、Jenkinsを入れる。
JenkinsのAndroid pluginを入れると、Android SDKが入る。
しかしこれだと、一つのAPIバージョンしか入らなかった。
自分のケースでは、API10。（どういう基準でこれなのか・・）
なので、updateをして最新やら抜けてるバージョンのSDKを入れたい。

```
android update sdk --no-ui
```
これで怒涛のupdateが始まるわけだが、UIで行うみたいに必要な対象だけを選ぶことができない。のでやたらめったら長いです。
途中でMotorolaのサイトにログインして、SDKを取得するプロンプトが出たりしますが、ひたすらエンターを連打すると抜けられます。
と、これを書いてる間もまだupdateが続いてる。３０分以上はかかるかな。
Thorでサブコマンドを定義する


Thorでは以下のようなサブコマンド、サブサブコマンドも簡単に作ることができます。

```zsh
$ ./foo bar baz qux
qux
```


```ruby:foo
require 'thor'
require 'thor/group'

class Baz < Thor
  namespace 'bar baz'

  desc 'qux', 'qux!!!'
  def qux
    puts 'qux'
  end

  def self.banner(task, namespace = false, subcommand = true)
    super
  end
end

class Bar < Thor
  namespace :bar
  register(Baz, 'baz', 'baz [COMMAND]', 'subcommad for baz')

  def self.banner(task, namespace = false, subcommand = true)
    super
  end
end

class Foo < Thor
  register(Bar, 'bar', 'bar [COMMAND]', 'commands for bar')
end
Foo.start
```
Haskellで遺伝的アルゴリズム

Randモナドを使えばもっときれいに書けそう…

```haskell:ga.hs
import Control.Applicative
import Control.Arrow
import Control.Monad
import Data.Function
import Data.List
import Data.Array
import Data.Tuple
import System.Random

type Mapping = Array Char Int

dom = ('a', 'z')
cod = (-2, 8)

mutate :: Mapping -> IO Mapping
mutate = (<$> fmap pure point) . (//)
    where
        point = (,) <$> randomRIO dom <*> randomRIO cod

crossoverUniform :: (Mapping, Mapping) -> IO (Mapping, Mapping)
crossoverUniform = elems *** elems >>> uncurry zip
    >>> map pure >>> zipWith (<*>) (repeat ch)
    >>> sequence >>> fmap (unzip >>> listArray dom *** listArray dom)
    where
        ch = ([id, swap]!!) <$> randomRIO (0, 1)

choice :: Ord f => (a -> f) -> Float -> [a] -> IO a
choice f e xs = (xs'!!) . floor . (* fromIntegral (length xs))
    . exp . (*e) . log
    <$> randomRIO (0.0, 1.0)
    where
        xs' = sortBy (compare `on` f) xs

nextGeneration :: Float -> Float -- crossover rate, mutational rate
   -> ([Mapping] -> IO Mapping) -- selector
   -> ((Mapping, Mapping) -> IO (Mapping, Mapping)) -- crossover
   -> (Mapping -> IO Mapping) -- mutation
   -> [Mapping] -- current generation
   -> IO [Mapping]

nextGeneration rC rM fS fC fM p = collect (length p)
    $ repeat (randomRIO (0.0, 1.0) >>= operate)
    where
        operate x
            | x < rM      = fmap pure $ fS p >>= fM
            | x < rM + rC = fmap g    $ (,) <$> fS p <*> fS p >>= fC
            | otherwise   = fmap pure $ fS p
            where
                g (a, b) = [a, b]
        
        collect 0 _ = return []
        collect _ [] = return []
        collect 1 (x:_) = take 1 <$> x
        collect n (x:xs) = x >>= \v -> (v ++) <$> collect (n - length v) xs

firstGeneration :: IO [Mapping]
firstGeneration = repeat <$> listArray dom
    <$> (rangeSize dom `replicateM` randomRIO cod)
```
Pygments.rb を使う

シンタックスをハイライトしたいとき便利。PythonのpygmentsにFFIで繋ぎにいっているそうです。狂気じみてていいですね。

## Python をインストール

独自の便利ツールを入れます。[こちらの記事に詳しいです](http://d.hatena.ne.jp/tell-k/20110418/1303121778)。 homebrewで入れる時は、`easy_install`をはじめとした色々な実行ファイルが謎のディレクトリ(`/usr/local/share/python`)に配置されるのでシンボリックリンクなどを貼るか`$PATH`をいじる。

## Pygments のインストール

```sh:setup
pip install pygments
ln -s /usr/local/share/python/pygmentize /usr/local/bin/pygmentize
```
## やってみよう

```ruby:kaiseki.rb
require 'pygments'

Pygments.start '/usr/local/bin/pygmentize'

code = File.read '/Users/udzura/.rvm/gems/ruby-1.9.3-p194@samples/gems/sinatra-1.3.3/lib/sinatra/base.rb'
puts Pygments.highlight code, lexer: 'ruby', formatter: 'terminal'
```

![http://gyazo.udzura.jp/ad1d5ced39ece3d296eef4ebd6b51e5a.png](http://gyazo.udzura.jp/ad1d5ced39ece3d296eef4ebd6b51e5a.png)

## おまけ

pry-coolline というルッビージェムでは、自作で構文解析器とかを実装してるっぽくて[ヤバそう](https://github.com/pry/pry-coolline/blob/master/lib/pry-coolline/paren_match.rb)。

## 言及

[Rubyでコードブロックに色を付けるときのこと](http://hibariya.github.com/entries/20120317.html) で「ときどきSegmentation faultになる」と言っているが、そんなに落ちるような印象を受けなかった。バージョンが上がり安定しているのかもしれない。「pythonの環境をちゃんと整えれば」がどれくらい整える感じなのか分からない……。
AdobeのSource-Code-ProのフォントをMacにインストール


#Githubからソースを取ってくる
```
% git clone https://github.com/adobe/Source-Code-Pro.git
```

#makeotf等のツールのインストール
http://www.adobe.com/devnet/opentype/afdko/eula.html
ここから、Mac用のZIPファイルをダウンロード

展開すると、FDKと言うフォルダができるので、このフォルダを適当な場所に置く（私は、Applicationフォルダに置きました）

ターミナルを開いて、FDKフォルダ無いにある、FinishInstallOSXをターミナルにドラッグして、Enterを押すと、インストールが終了。

ホームのbinの下にFDKのリンクが張られる形になるかと思います。

フォントのmakeに必要なので、PATHを通しておきます。

```
% export PATH=PATH=~/bin/FDK/Tools/osx:$PATH
```

#フォントの作成
先ほど、Cloneした所に移動して、次のコマンドを実行

```
% chmod 755 build.sh
% ./build.sh
```

#フォントのインストール
targetフォルダにフォントが出来ているはずなので、それをダブルクリックしてインストール。
RingoJS v0.8でのファイルアップロード

# RingoJSのv0.8でそれまでとAPIが変わった模様
そんなわけで、Stackoverflowとかにもサンプルないので、自力で解決した
際の備忘録

``` fileupload.js
var httpUtils = require('ringo/utils/http');

if(httpUtils.isFileUpload(req.headers["content-type"])) {		
        var params = {};
        httpUtils.parseFileUpload(req,params);       
}
```

# アップロード用のHTML（念のため）

``` fileup.html
<form action="http://ファイルアップロードのサーバURL"
         enctype="multipart/form-data"
         method="post"> 
<input type="file" name="pics">
             <input type="submit" value="アップロード">
</form>
```

これでparams['pics'].valueにアップロードしたファイルの
内容が入力される。
GoogleAdMobAdsSdkiOS‑6.2.0.zip


https://developers.google.com/mobile-ads-sdk/download

Link binary With Librariesで
AdSupport.framekが必要。



[GADObjectPrivate changeState:]: unrecognized selector　が出る

->

http://stackoverflow.com/questions/12635283/admob-crashes-with-gadobjectprivate-changestate-unrecognized-selector

```
You need to add -ObjC to the Other Linker Flags of your application target's build setting. Here you can see how to do it: https://developers.google.com/mobile-ads-sdk/docs/admob/mediation
```
【初心者速報】Rails実行しようとしたらExecjsがどうとか…

環境：仮想CentOS(Red Hat)、ホストはWindows8、TeraTerm上で実行、ruby 1.9.3-p194、Rails 3.2.8

Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

というエラーが出て、なんかこんなエラー前にもみたわ…ほらexecjsって書いてあるし…と思った今日この頃。
今回はCentOS上でのできごとですので、ちょっと勝手が違いました。

apptestというRailsファイルを作っていたので、

cd apptest
~@localhost apptest]$ vi Gemfile

のあとに、

gem 'execjs'
gem 'therubyracer'

を書き加える。そして編集を終えて、

~@localhost apptest]$ bundle install

これで実行できました。
【初心者速報】ああ？無効なホスト名だろ！と怒られた…仮想OS構築

ホストOS：Windows8
ゲストOSとして構築したい環境：CentOS(Red Hat)
使用ソフト：TeraTerm、VirtualBox、HostsFileManager、CyberDuck

ドットインストールの教えに従って構築しようとしたら、
Teratermを起動しようとしても無効なホスト名だのなんだの怒られた。

centos.devというホスト名をHostsFileManagerに記録していたが、これではログインできなかった。
解決策は単純で、IPアドレスを直接入力すればよい。
サーバー立てて実行するときとかめっちゃめんどいがこっちのほうが確実。
【初心者速報】仮想OSでRails環境つくるときに詰まったこと

Railsをインストールしようとするたびにlibyamlを入れろよおお！！！！と言われて一日が経ちました。
たぶん仮想OSだけではないですが、インストールする手順は書いておいたほうがよさそうですね。

毎回毎回

/Users/k/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.

と言われたので、心が折れそうでした。

ですが、以下の手順を踏んだら治りました。

1．まずrubyをアンインストール
2．libyamlをインストール
3．rubyをインストール
4. railsをインストール

まあ言われている通りでしたが、なかなか詰まった詰まった。
ちなみにrvm経由でのインストールです。

$ sudo gem install libyaml
$ rvm remove 1.9.3-p194
$ rvm install 1.9.3-p194
$ rvm --default use 1.9.3-p194

ここまででrubyをインストール。
そのご、gem install railsでRailsがインストールされる。
めっちゃ時間かかります。PCには僕が寝ている間に仕事してもらいました。
画像の縦横比を保って縮小するjQuery拡張

##imgに指定されているheightとwidthの値によって縦横比を保ちながら縮小するスクリプト
#サーバーでサムネ画像を生成することができないときとかに。
クロスブラウザ対応してます。


```js
(function($) {
		
	$.fn.fixAspect = function(option) {
		
		var init = function(){
			var self = $(this);
			// 表示時の大きさ
			var _height = $(this).attr('height');
			var _width = $(this).attr('width');
			var trueHeight ,trueWidth  = 0;
			
			var img = new Image();
				img.onload = function(){
				trueHeight = this.height;
				trueWidth = this.width;
				
				// 縦またはどちらも同じの場合
				if(_height >= _width){
					d = _height / trueHeight;
					trueHeight = trueHeight * d;
					trueWidth = trueWidth * d;
					self.attr('height',trueHeight);
					self.attr('width',trueWidth);
				}
				// 横の場合
				else{
					d = _width / trueWidth;
					trueHeight = trueHeight * d;
					trueWidth = trueWidth * d;
					self.attr('height',trueHeight);
					self.attr('width',trueWidth);
				}
				
				// とどめたいサイズ内におさまっていない場合
				if(trueWidth > _width || trueHeight > _height){
					// 縦横どちら基準で縦横比を変更するのか
					
					// 縦またはどちらも同じの場合
					if(trueHeight >= trueWidth){
						d = _height / trueHeight;
						trueHeight = trueHeight * d;
						trueWidth = trueWidth * d;
						self.attr('height',trueHeight);
						self.attr('width',trueWidth);
					}
					// 横の場合
					else{
						d = _width / trueWidth;
						trueHeight = trueHeight * d;
						trueWidth = trueWidth * d;
						self.attr('height',trueHeight);
						self.attr('width',trueWidth);
					}
					
					if(trueWidth > _width){
						d = _width / trueWidth;
						trueHeight = trueHeight * d;
						trueWidth = trueWidth * d;
						self.attr('height',trueHeight);
						self.attr('width',trueWidth);
					}

					if(trueHeight > _height){
						d = _height / trueHeight;
						trueHeight = trueHeight * d;
						trueWidth = trueWidth * d;
						self.attr('height',trueHeight);
						self.attr('width',trueWidth);
					}
					
				}

				if(option.parentFixture == true){
					self.parent().css('height',_height);
					self.parent().css('width',_width);
					self.parent().css('text-align','center');
					self.css('padding-top',(_height/2)-((trueHeight)/2)+'px');
				}
			}
			img.src = $(this).attr('src');
			
		}

		this.each(function(){
			init.apply($(this));
		})
		
		return this;
	};
})(jQuery);

```

#使い方
対象のimgタグをセレクタで選択してこういう感じで使ってください。


```html
(function($){
	$('.fixAspect').fixAspect({parentFixture: true});
})(jQuery);
```


##オプションについて
* parentFixture　trueを指定すると親要素を元のimgタグに指定されているwidthとheightの大きさにし、text-align:centerの属性を付与します。
（2012年10月2日）縦位置が親要素（元の画像の縦の大きさ）を加味して縦中央位置に配置されるように修正を加えました
Android アプリ内の簡単なデータ保存

```
//保存
android.content.SharedPreferences sp = getSharedPreferences("fileName", MODE_PRIVATE);
sp.edit().putString("hoge", "fuga").commit();
sp.edit().putInt("integer", 100).commit();

//取得
String hoge = sp.getString("hoge", null);

//削除
sp.edit().remove("integer").commit();
```

参考
http://yuubiseiharukana.blog.shinobi.jp/Entry/607/
シンボリックリンクでApacheのVirtualHostsをお手軽管理



```
/etc/apache2/extra
├── httpd-vhosts
│   ├── ?.local -> /Users/suin/Dropbox/Suin/Projects/Private/localhost
│   ├── local.pack2011 -> /Users/suin/Dropbox/Suin/Projects/Private/pack2011/html
│   ├── local.suinpress -> /Users/suin/Dropbox/Suin/Projects/Private/suinpress/Public
│   ├── local.xoopsilex -> /Users/suin/Dropbox/Suin/Projects/GitHub/xoopsilex-sample/html
│   └── localhost -> /Users/suin/Dropbox/Suin/Projects/Private/localhost
├── httpd-vhosts.conf
└── httpd-vhosts.php
```

のようなファイル構成で `httpd-vhosts` ディレクトリにシンボリックリンクで「ホスト名」と「ドキュメントルート」を表現する。


あとは下記の `httpd-vhosts.php` の標準出力を `httpd-vhosts.conf` に向けて実行するだけ。追加削除もシンボリックを増減すればいいだけ。


```php:httpd-vhosts.php
#!/usr/bin/env php
<?php


ob_start();
?>
<VirtualHost *:80>
	ServerName   %hostname%
	DocumentRoot %document_root%
	ErrorLog     /var/log/apache2/%hostname%-error_log
	CustomLog    /var/log/apache2/%hostname%-access_log common
</VirtualHost>
<VirtualHost *:443>
	ServerName   %hostname%
	DocumentRoot %document_root%
	ErrorLog     /var/log/apache2/%hostname%-error_log
	CustomLog    /var/log/apache2/%hostname%-access_log common
	SSLEngine on
	SSLCertificateFile "/usr/local/Cellar/httpd/2.2.22/etc/apache2/server.crt"
	SSLCertificateKeyFile "/usr/local/Cellar/httpd/2.2.22/etc/apache2/server.key"
</VirtualHost>
<?php
$template = ob_get_clean();

?>
NameVirtualHost *:80
NameVirtualHost *:443
<?php

$dir = new DirectoryIterator('glob://./httpd-vhosts/*');

foreach ( $dir as $fileinfo )
{
	if ( $fileinfo->isLink() )
	{
		$hostname = $fileinfo->getBasename();
		$hostname = strtr($hostname, '?', '*');
		$path     = $fileinfo->getRealPath();
		
		if ( $path === false )
		{
			throw new DomainException(sprintf('Link target not found: %s', $hostname));
		}
		
		$variables = [
			'%hostname%'      => $hostname,
			'%document_root%' => $path,
		];
		
		echo str_replace(array_keys($variables), array_values($variables), $template);
	}
}
```