OmniAICreator/Qiita-1.07M huggingface dataset:
Play Framework アプリの Selenium 用テストを、異なる WebDriver で同じテストコードを実行する時のテンプレート

[Play Framework 2.x](http://www.playframework.com) の [Selenium](http://docs.seleniumhq.org) 用テストを [Specs2](http://etorreborre.github.io/specs2/) で書いたとき、異なる [WebDriver](http://docs.seleniumhq.org/projects/webdriver/) で同じテストコードを実行したいときの実装の仕方。

#### 実装

基本は Play Framework が標準で用意している Selenium をサポートする [WithBrowser](http://www.playframework.com/documentation/2.1.x/api/scala/index.html#play.api.test.WithBrowser) クラスを活用する。

テストを抽象クラスとして作り `WebDriver` の `ClassTag` を暗黙の引数にすることで、具象実装は型パラメータをあてて拡張するだけとなる。

```scala:AuthenticationSpec.scala
import org.specs2.mutable._

import play.api.test._
import play.api.test.Helpers._
import scala.reflect.ClassTag

/** 認証の統合テストの抽象実装 */
abstract class AuthenticationSpecBase[D <: org.openqa.selenium.WebDriver: ClassTag] extends Specification {
  protected val webDirverClass = implicitly[ClassTag[D]].runtimeClass.asInstanceOf[Class[D]]

  "ブラウザによる認証画面の操作 with " + webDirverClass.getSimpleName should {
    "ユーザー名とパスワードを入力してログインするとホームが表示される" in new WithBrowser(webDirverClass) {
      val form = browser goTo("http://localhost:" + port) $ "form#login-form"
      form find "input[name=name]" text "test-user"
      form find "input[name=password]" text "password"
      form find "input[type=submit]" click()

      browser.title must_== "ホーム"
    }
  }
}

// 実装別テストクラス
import org.openqa.selenium.firefox.FirefoxDriver

/** HtmlUnit で実行する認証の統合テスト */
class AuthenticationWithHtmlUnitSpec extends AuthenticationSpecBase[HtmlUnitDriver]

/** FireFox で実行する認証の統合テスト */
class AuthenticationWithFireFoxSpec extends AuthenticationSpecBase[FirefoxDriver]
```

#### 実行方法

* HtmlUnit のだけ実行： `$ test-only AuthenticationWithHtmlUnitSpec`
* FireFox のだけ実行： `$ test-only AuthenticationWithFireFoxSpec`
* 全部実行： `$ test-only Authentication*`

*全部実行したときの出力例*

```bash
[testapp] $ test-only Authentication*
[info] AuthenticationWithHtmlUnitSpec
[info] 
[info] ブラウザによる認証画面の操作 with HtmlUnitDriver should
[info] + ユーザー名とパスワードを入力してログインするとホームが表示される
[info]  
[info]  
[info] Total for specification AuthenticationWithHtmlUnitSpec
[info] Finished in 7 seconds, 236 ms
[info] 1 example, 0 failure, 0 error
[info] 
[info] AuthenticationWithFireFoxSpec
[info] 
[info] ブラウザによる認証画面の操作 with FirefoxDriver should
[info] + ユーザー名とパスワードを入力してログインするとホームが表示される
[info]  
[info]  
[info] Total for specification AuthenticationWithFireFoxSpec
[info] Finished in 10 seconds, 645 ms
[info] 1 example, 0 failure, 0 error
[info] 
[info] Passed: : Total 2, Failed 0, Errors 0, Passed 2, Skipped 0
[success] Total time: 23 s, completed ...
```

#### 感想

抽象クラスの `[D <: org.openqa.selenium.WebDriver: ClassTag]` の部分はスペックごとに書かなければならないので、 結局コピペは必要になるところが、まだいまひとつなところです。
Litaで突然の死

# Lita
![Lita](https://github-camo.global.ssl.fastly.net/7ba277e0a3758da076b9ecc80a69af0a5ba678cf/687474703a2f2f662e636c2e6c792f6974656d732f3063323731613250336b325631383042315230582f6c6974612e6a7067)

最近仕事でもプライベートでも、[jimmycuadra/lita](https://github.com/jimmycuadra/lita)をhipchat上に常駐させています。

基本的には[github/hubot](https://github.com/github/hubot)と同じようなchat bot frameworkなのですが、
hubotがjavascript/coffeescriptでbotの挙動を実装するのに対して、
litaはrubyで記述できる(使い慣れたgemを使用できる)ところが気に入っています。

## 突然の死

例えば、litaが常駐しているroomで`suddenly 突然の死`という発言を拾って例のあれを表示するためのhandlerはこんな感じに書きます。

```rb
# http://rubygems.org/gems/pebbles-suddenly_death_string
require 'pebbles/suddenly_death_string'

module Lita
  module Handlers
    class Suddenly < Handler
      route /^suddenly\s+(\S.*)+/, :suddenly_death

      def suddenly_death(response)
        word = response.matches[0][0]
        response.reply word.to_suddenly_death
      end
    end
    Lita.register_handler(Suddenly)
  end
end
```

![Screen Shot 2013-09-30 at 15.07.45.png](https://qiita-image-store.s3.amazonaws.com/0/7567/a4a692a4-55c2-d675-4e06-3ae8d1ea9642.png)
Sublime Text2でPHPマニュアルを表示

Sublime Text2始めました。多機能でいいですね。

Sublime Text2でPHPマニュアルを表示するプラグインはGoto DocumentationとかPManとかあるっぽいですが、私の環境（Win7+64bit)で動かなかったので他のプラグインを入れてみました。

https://github.com/sefus/PhpManual

導入方法：
[Preference]-[Browse Package]で表示されるフォルダで以下のgitコマンドを実行。

```Git:
git clone https://github.com/sefus/PhpManual.git
```

特に設定とかいらずに、キーワードを選択して右クリック→[PHP Manual]で http://www.php.net を検索しにいきます。strposなどの定義済み関数なら直接関数のマニュアルが表示されます。便利！

F1キーで表示させたい場合は、以下のキーマップを追加してください。

```py:PHPManualキーマップ
[
    { "keys": ["f1"], "command": "php_manual" }
]
```
jQuery.uploadで「Uncaught SyntaxError: Unexpected token <」というエラーが出たら


### before

```js:jquery.upload-1.0.2.js
    switch (type) {
      case 'xml':
        data = parseXml(data);
        break;
      case 'json':
        data = window.eval('(' + data + ')');
        break;
    }
    return data;
```

### after

```js:jquery.upload-1.0.2.js
    switch (type) {
      case 'xml':
        data = parseXml(data);
        break;
      case 'json':
        // 自動挿入タグ除去
        data = data.replace(/<pre style="word-wrap: break-word; white-space: pre-wrap;">/g, '')
        data = data.replace(/<pre>/g, '')
        data = data.replace(/<\/pre>/g, '')

        data = window.eval('(' + data + ')');
        break;
    }
    return data;
```
Javascriptで言語を見てリダイレクト


静的ページでコンテンツネゴシエーション的なことがやりたかった。トップページに来たときにJavascriptでブラウザの言語を見て/jaにリダイレクトしてみる。


```javascript
(function ($) {
    function redirectPage(dest){
        if (window.location.replace) {
            window.location.replace(dest);
        }
        else {
            window.location = dest;
        }
    }
    var referer = document.referrer || '';
    if ($.type(referer) == 'string') {
        if (referer.indexOf(document.location.origin) !== 0) {
            var lang = navigator.language || navigator.userLanguage;
            var langCodes = ['ja'];
            for (i = 0; i < langCodes.length; i++){
                if (lang.substr(0,2) == langCodes[i]){
                    redirectPage('/' + langCodes[i]);
                    break
                }
            }
        }
    }
})(jQuery);
```

/を英語、/jaを日本語としている都合上、英語サイト閲覧したい場合を想定してリファラをチェックして内部リンクからトップページに来た時はリダイレクトしないようにしている。

クロスブラウザ対応できているのかは不明。

参考: http://www.webdeveloper.com/forum/showthread.php?174600-Browser-Language-Redirect
[Go] UTCの時刻を日本時間に変換する

日本でローカルで普通に動かすとtime.Now()はJSTになるのですが、Google App Engineの開発サーバーdev_appserver.pyや http://play.golang.org/ ではUTCになります。

以下のようにすればJSTに変換できます。

- [time.FixedZone(name string, offset int) *Location](http://golang.org/pkg/time/#FixedZone)でタイムゾーンを作成
- [func (t Time) In(loc *Location) Time](http://golang.org/pkg/time/#Time.In)を使って指定したタイムゾーンでの日時を取得

```go
package main

import (
    "fmt"
    "time"  
)       

func main() {
    now := time.Now()
    fmt.Println(now.Format(time.RFC3339))

    nowUTC := now.UTC() 
    fmt.Println(nowUTC.Format(time.RFC3339))

    // This fails with "panic: unknown time zone Asia/Tokyo" at play.golang.org
    // jst, err := time.LoadLocation("Asia/Tokyo")
    //if err != nil {               
    //  panic(err)
    //}                                 
                                            
    jst := time.FixedZone("Asia/Tokyo", 9*60*60)

    nowJST := nowUTC.In(jst)                        
    fmt.Println(nowJST.Format(time.RFC3339))

    // results at local                                 
    // 2013-09-30T02:21:12+09:00                            
    // 2013-09-29T17:21:12Z
    // 2013-09-30T02:21:12+09:00
    //                                                          
    // results at http://play.golang.org/
    // 2009-11-10T23:00:00Z                                         
    // 2009-11-10T23:00:00Z
    // 2009-11-11T08:00:00+09:00                                        
}
```

[func LoadLocation(name string) (*Location, error)](http://golang.org/pkg/time/#LoadLocation)も試してみたのですが、play.golang.org ではAsia/Tokyoはunkown time zoneとエラーになってしまいました。

http://play.golang.org/p/-e7unXO1f9 このリンクをクリックするとGo playgroundで試せます。
IntelliJのエディタにSublimeText風のmini-mapを表示するプラグイン

## インストール手順

Settings -> Plugins -> Browse repositories... -> CodeGlance

## 開発元

githubでソースが公開されています。スクリーンショットもあります。

[Vektah/CodeGlance](https://github.com/Vektah/CodeGlance)

## 配布元

JetBrainsのプラグインリポジトリです。こっちも同じスクリーンショットがあります。

[CodeGlance](http://plugins.jetbrains.com/plugin/7275)
特定のディレクトリをzip化するスクリプトを書いたときにぶつかった問題とその対処法

# 概要
複数のディレクトリを別々にzip化するスクリプト組んだら思いの外はまったので、備忘録的に、勉強メモ的に記録しておきます。

#内容
「特定のディレクトリ」を「カレントディレクトリにある全てのディレクトリ」だとしましょう。

## はじまりのスクリプト

```
$ find . -type d -depth 1 | xargs -I% zip -r % %
```

`-type d` はディレクトリ指定、`-depth 1`はカレントディレクトリにあるもの、という条件指定です。`-depth 1`がないとカレントディレクトリ自体もヒットするので注意（もちろんカレントディレクトリを外すやり方は他にもいっぱいあると思いますが）
これでうまくいったように見えたんですが、特定のディレクトリ名で失敗していました。
その一つは、失敗する条件はよく分かってないんですが、`zip`の第一引数に`.zip`を省略せずに書いた場合に収まりました。

```
$ find . -type d -depth 1 | xargs -I% zip -r %.zip %
```

他にも失敗する場合があり、これは別エントリにしました。

* [Zsh - Macのxargsの-Iオプションに潜む罠 - Qiita [キータ]](http://qiita.com/takc923/items/2e14b9807a5033ef95e1)

一言で言うと、ディレクトリ名が長い時、Macのxargsの仕様上`%`が展開されないので、失敗することがありました。これはMacで`xargs`を使う限りどうしようもなさそう。

## xargsがだめならforを使えばいいじゃない
次に、書いたのがこれ。

```
$ for dir in `find . -type d -depth 1`; do zip -r $dir.zip $dir; done
```

xargsでやっていたところをforループで置き換えてみました。が、これもうまく行きませんでした。何故なら`find . -type d -depth 1`でヒットするディレクトリ名にスペースが含まれていて、それが別々に$dir変数に入っていたからです。

## 空白で区切られてしまうなら、デリミタを変えればいいじゃない
さらに調べていると、`$IFS`という変数でループする時のデリミタを変えられることが分かったので、$IFSをヌル文字にして、`find`の出力を`-print0`オプションでヌル文字区切りにしてみました。

```
$ IFS="\0"; for dir in `find . -type d -depth 1 -print0`; do zip -r $dir.zip $dir; done
```

しかしこれも成功せず、何故か`0`区切りでループが回ってしまいました。謎。
あと$IFSを改行文字にして、`xargs`のオプションを`-print`にしてやってみたりしましたが失敗。

## 突如現れたread
で、さらにぐぐって調べてみるといい感じなものを見つけました。

* [Re: Setting IFS to the null character](http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-05/msg00676.html)

要約すると「$IFSにヌル文字入れてみても上手くいかないんだけどどうしたらいい？」って質問対する答えに`read`を使ったスクリプトが提示されています。これを参考に書いてみる。

```
$ find . -type d -depth 1 | while IFS= read -r dir; do zip -r $dir.zip $dir; done
```

ｋｔｋｒ！成功しました。ここに来るまで長かった。。。

## よく考えたら-execでよくね
あとになって`-exec`使えばよくね？って気づきました。

```
$ find . -type d -depth 1 -exec zip -r {}.zip {} \;
```

普通に動く。これが一番シンプルで良さそう。
ただ、`read`を使う方が柔軟性はありそうです。
zsh の補完メニューを hjkl で移動

zsh の補完メニューを hjkl で移動するための設定。

```zsh
zmodload -i zsh/complist
autoload -Uz compinit && compinit
zstyle ':completion:*:default' menu select=2

# 補完時にhjklで選択
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'j' vi-down-line-or-history
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
```
MAMPでApacheだけを起動する方法


##コメントアウトで無理矢理解決

調べても出てこなかったのでそれっぽいファイルを探して無理矢理解決。
これで正しいのかはわかんないけど、一応できたのでメモ。

<br>

以下のフォルダを開く。

```
/Applications/MAMP/bin/ 
```

赤丸のファイルに注目。

![bin_と_bin.png](https://qiita-image-store.s3.amazonaws.com/0/12542/4311dc61-9a00-5af1-b06f-436b8eb7125e.png "bin_と_bin.png")

[Sublime Text](http://www.sublimetext.com/) などで `startMysql.sh` のファイルを開き、
MySQLの起動コマンドらしきものをコメントアウト。

```startMysql.sh
# /bin/sh
/Applications/MAMP/Library/bin/mysqld_safe --port=3306 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --lower_case_table_names=0 --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log &
```

↓

```startMysql.sh
# /bin/sh
#/Applications/MAMP/Library/bin/mysqld_safe --port=3306 --socket=/Applications/MAMP/tmp/mysql/mysql.sock --lower_case_table_names=0 --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --log-error=/Applications/MAMP/logs/mysql_error_log &
```

これでMySQLは起動しなくなりました。

![kobito.1380464448.600496.png](https://qiita-image-store.s3.amazonaws.com/0/12542/a663e682-5cff-127c-6fa0-778b2b2229a2.png "kobito.1380464448.600496.png")
ビューのスクリーンショットを保存する

アニメーションなどの経過状況をPNGファイルに保存したい時ってありますよね？え、ない？

そんなときのためにビューのスクリーンショットをPNGイメージとして保存するためのクラスを作ってみました。
Runnableインターフェースを実装しているのでHandler#postDelayed()メソッドの引数に指定出来ます。

```java:SavePictureRunner
public class SavePictureRunner implements Runnable {
	private File mFileName;
	private View mView;

	public SavePictureRunner(View view, File filename) {
		this.mView = view;
		this.mFileName = filename;
	}

	@Override
	public void run() {
		FileOutputStream output = null;
		try {
			output = new FileOutputStream(mFileName);

			Bitmap saveBitmap = null;
			mView.setDrawingCacheEnabled(true);
			mView.setDrawingCacheBackgroundColor(Color.WHITE);
			saveBitmap = Bitmap.createBitmap(mView.getDrawingCache());
			saveBitmap.compress(CompressFormat.PNG, 100, output);
			output.flush();
		} catch (IOException e) {
			Toast.makeText(mView.getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
			e.printStackTrace();
		} finally {
			mView.setDrawingCacheEnabled(false);
			if (output != null) {
				try {
					output.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
```

んで、こんな風に使います。なお、R.id.frameは、ビューグループ、R.id.animateはframeに内包されるImageViewとします。

```java:使用例
Animation animation;
animation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
animation.setDuration(4000);
File path = new File(
		Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
		"AppName");
if (!path.exists()) {
	path.mkdir();
}

View view = findViewById(R.id.frame);
Handler h = new Handler();
for (int i = 0; i < 5; i++) {
	h.postDelayed(new SavePictureRunner(view, new File(path, i + ".png")), i * 1000);
}

ImageView animate = (ImageView)findViewById(R.id.animate);
animate.startAnimation(animation);
```

アニメーションが終わると、次の五つのタイミングで、frameビューのスクリーンショットが/Pictures/AppName/配下に保存されます。

 * 0.png:アニメーション開始前の画像
 * 1.png:アニメーション開始1秒後の画像
 * 2.png:アニメーション開始2秒後の画像
 * 3.png:アニメーション開始3秒後の画像
 * 4.png:アニメーション終了時の画像(ただし、タイミングによってはアニメーション終了後に画像になることがある)

ちなみに、アニメーションさせる対象となるビューのスクリーンショットを撮ってもアニメーションの様子は分かりませんので注意(アニメーションしていないように見える)
SublimeTextでMarkdownを便利に書くときに便利なパッケージ

## カラースキーマ

SublimeText は SyntaxHighlight で Markdown を指定してもほとんど色付けしてくれないことが多い。
そこで [Monokai Extended](https://sublime.wbond.net/packages/Monokai%20Extended) か [Perv](https://sublime.wbond.net/packages/Perv%20-%20Color%20Scheme) を使うのがおすすめ。

どちらも Markdown に色付けをしてくれる。

### Markdown 中のコードを SyntaxHighlight したい

[Markdown Extended](https://sublime.wbond.net/packages/Markdown%20Extended) をいれよう。

## Markdown のプレビュー

[Markdown Preview](https://sublime.wbond.net/packages/Markdown%20Preview) が定番 ?

## 入力補助など

日本語が微妙なので僕は使ってないけど次のパッケージを使っている人も多いみたい。

- [MarkdownEditing](https://sublime.wbond.net/packages/MarkdownEditing)
- [SmartMarkdown](https://sublime.wbond.net/packages/SmartMarkdown)
free-gameでフルスクリーン表示

__この記事は[free-game-0.9.3.5](http://hackage.haskell.org/package/free-game-0.9.3.5)について書いてあります__

[free-game](http://hackage.haskell.org/package/free-game)というのは、HaskellでFreeモナドを使ってゲームを作れるライブラリです。それ以上の説明は<del>面倒</del>本題ではないので割愛します。ググって下さい。

で、フルスクリーンにする方法です。Twitterでぼやいてたら[@fumieval]氏が教えてくれました。ありがとうございます。

```windowed.hs
import Data.Function
import Graphics.UI.FreeGame

main = do
  font <- loadFont "VL-PGothic-Regular.ttf"
  -- GUIParamの_windowedをFalseにするとフルスクリーンになる
  -- デフォルトはTrue
  -- （ウィンドウモードか、ってことらしい）
  -- 途中で変更は（多分）できない。
  runGame (def {_windowed = False}) $ fix $ \loop-> do
    translate (V2 50 300) $ colored black $ text font 40 "Push Q to quit"
    tick
    
    bracket 
    q <- keyChar 'Q'
    unless q loop
```

[@fumieval]: http://twitter.com/fumieval
[GroovyとProcessing] フレームレートの設定

フレームレートを設定する

動画リスト：[LWJGLのチュートリアル](http://www.youtube.com/playlist?list=PL19F2453814E0E315)
動画は[ココ](http://www.youtube.com/watch?v=G4g3i4n7l28)

```groovy:DisplayTest.groovy
package episode002

import groovy.swing.SwingBuilder
import processing.core.PApplet

import javax.swing.*

class DisplayTest extends PApplet {

    def void setup() {
        frameRate(60)
    }

    def void draw() {
        background(0, 0, 0)
    }

    def static void main(args) {
        def display = new DisplayTest()
        new SwingBuilder().frame(
                title: 'Episode 2',
                defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
                size: [640, 480], show: true) {
            widget(display)
        }
        display.init()
    }
}
```

![grocessingGL002.png](https://qiita-image-store.s3.amazonaws.com/0/17179/5d3d81fc-55c7-9415-898a-68db0f61387e.png)
文字コードが原因でzipファイルをunzipで解凍出来ない場合はMacならunarを使えばいい

Macでzipファイルをunzipで解凍する場合、文字コードが原因でちゃんと解凍出来ない場合があります。
ぐぐるとpatch入れてビルドしたunzipならいけるとか出てきますが、面倒です。

* [Mac 向け文字化けしない unzip コンパイル | モチログ]
(http://www.flogedge.org/blog/2013/02/17/mac%E5%90%91%E3%81%91%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%97%E3%81%AA%E3%81%84unzip%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/)

また、普通にGUIのソフトウェア(The Unarchiver等)を使えば問題なかったりしますが、大量のファイルをスクリプト組んで処理したい場合はGUIツールは向きません。

で、どうしようかなーと思ってたんですが、unarというThe Unarchiverのコマンドラインツールがあったのでそれを使うと解決しました。

というわけでやり方。インストールはbrewでいけます。

```
brew install unar
```

使い方は引数にアーカイブファイルを渡すだけ

```
unar test.zip
```

解凍先のディレクトリの指定とかも出来ます。

```
unar -o dir test.zip
```

詳細は`man unar`で。
欠点はunzipほど高性能ではない点でしょうか。
MacでPython環境構築メモ


virtualenvをつかって複数の環境を切り替えて使えるようにします。


## Homebrewをインストール
手順は[公式サイト](http://brew.sh/index_ja.html)にありますが、

```
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
```
でインストールできます。
あと、xcodeが入ってない時は、[Command Line Tools](https://developer.apple.com/downloads/)も入れます。

```
$ brew doctor
```
で警告が出たら対応して、
Your system is ready to brew. 
と出るようにします。

## Python2.7のインストール

```
$ brew install python
```
でpython2.7がインストールされます。
easy_installやpipも同時にインストールされます。

```
Setuptools and Pip have been installed. To update them
  pip install --upgrade setuptools
  pip install --upgrade pip

To symlink "Idle" and the "Python Launcher" to ~/Applications
  `brew linkapps`
```
のように表示されたら指示に従ってコマンド実行します。

## virtualenv環境の構築
virtualenvとvirtualenvwrapperをpipでインストールします。

```
$ pip install virtualenv virtualenvwrapper
```
virtualenvwrapper.shを読み込む必要があるので、
.bashrcなどに設定します。

```
export VIRTUALENVWRAPPER_PYTHON=/usr/local/Cellar/python/2.7.5/bin/python2.7
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
export VIRTUALENV_USE_DISTRIBUTE=true
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi
```

## 複数のpythonインストール
通常は、python2系の最新バージョン、python3系の最新バージョンしかインストール出来ません。
以下のコマンドで他のバージョンもインストールできるようにします。

```
$ brew tap homebrew/versions
```

出来るようになったら使いたいバージョンをインストールします。

```
$ brew install python25 python26 python3
```
コレでpython2.5, 2,6, 3.3がインストールされます。

## virtualenvで環境切替

```
$ mkvirtualenv --python='/usr/local/Cellar/python26/2.6.8/bin/python' py26
```
とすると、py26という名前でPython2.6の仮想環境ができます。

この環境を使うには、

```
$ workon py26
```
とします。

通常環境に戻るには

```
$ deactivate
```
です。
M7 と少しだけ戯れてみた

9/20 に無事に iPhone 5s Space Gray 64GB を手に入れました。前日の14時過ぎぐらいからヨドバシ梅田界隈をうろうろし、閉店少し前から列に並び、希望端末の整理券1番を Get し、9時くらいには現品 Get しました。

## CMStepCounter と CMMotionActivityManager

そんなことはさておき本題。
iPhone 5s にしか搭載していない M7。これがないと動かない機能が CMMotionActivityManager と CMStepCounter あたりの API です。せっかく iPhone 5s を手に入れたので少し触ってみました。

### CMStepCounter

CMStepCounter はその名の通り雑にいうと歩数計。計測自体は特にこのクラスを使わなくても iPhone 5s を持っていると OS 側がカウントしているようです。購入後20日午前中に実行しただけでも2000歩程度カウントされてました。

使い方は超シンプルです。

`isStepCountingAvailable` で利用可能かどうか確認。

OS の設定画面のプライバシーのところに「モーションアクティビティ」という項目があります。

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/4820/1bb2cb9b-a486-a468-dcce-5e1625af0271.png)

以下のようにリストアップされます。

![motion_activity_setting.png](https://qiita-image-store.s3.amazonaws.com/0/4820/6114596a-1b8c-20f3-3614-bd521273aaa4.png)


`startStepCountingUpdatesToQueue:updateOn:withHandler:` で歩数カウントの更新取得開始です。第1引数が第3引数に渡す handler を呼び出す queue を指定します。
第2引数には handler が呼び出される基準（スパン）の指定です。必ずしも指定した歩数間隔ごとに handler が呼び出されるわけではありません。
第3引数には歩数カウントの更新取得時に呼び出される Blocks を指定します。Blocks にはそのスタート以降の累計歩数、タイムスタンプ、エラーが返ってきます。

`stopStepCountingUpdates` ストップです。

`queryStepCountStartingFrom:to:toQueue:withHandler:` は任意の期間の歩数の集計ができます。
第1引数に開始日
第2引数に終了日
第3引数に第4引数に渡す handler を呼び出す queue を指定
第4引数に集計結果を受けとる Blocks を指定します。Blocks には歩数合計とエラーが返ってきます。

API や実際の挙動を見る限り、リアルタイムに（といってもタイミングとしては誤差あり）歩数情報を取得する必要がなければ、`queryStepCountStartingFrom:to:toQueue:withHandler:` だけで十分に歩数計的な用途として使えそうです。

実際に歩数を測りながら歩いてみましたが僕の場合ほぼ実際の歩数と同じくらいの測定精度に感じました。

### CMMotionActivityManager

CMMotionActivityManager はユーザーの移動に関する情報を取得できます。情報の種別としては以下の通りです。

* stationary・・・静止状態
* walking・・・徒歩
* running・・・ランニング中
* automotive・・・自動車や電車等の乗り物に乗っている状態
* unknown・・・不明

CMMotionActivityManager の提供する API に関しては CMStepCounter とほぼ同じです。 MotionActivity の更新タイミングの通知受けとりの開始と停止。それと任意の期間の情報取得です。
CMMotionActivityManager はその Motion 情報を `CMMotionActivity` というモデルクラスに格納して返します。

#### CMMotionActivity

先に挙げた5種類の状態情報を BOOL で返すインターフェイスと

* startDate・・・発生時間
* confidence・・・データの精度

を持っています。

状態情報がなんで enum じゃなく BOOL なのかと思ったのですが、リファレンスによると車で移動中の信号待ちなどでは automotive 且つ stationary という状態があるということなので enum じゃないようです。

用途としてはリファレンスにも書かれているようにナビゲーション系のアプリでユーザーの移動手段に応じたルートの提案等に使えると書かれています。

## まとめ

CMStepCounter と CMMotionActivityManager も API としては非常にシンプルです。あとはこれをウマく使えるアイディア次第でおもしろい物が作れるかもしれませんね。

## サンプルコード

手っ取り早く試してみたい方は以下にサンプルをおいてますので試してみてください。

[griffin-stewie/M7MotionSample](https://github.com/griffin-stewie/M7MotionSample)


## 余談

翌日 21 日の昼過ぎにヨドバシ梅田に行ったら Space Gray は容量問わず予約なしですぐに持ち帰れる状況でした ＼(^O^)／

妻が言ってくれました「リヴァイ兵長もこんな事を言ってたじゃない」

    結果は誰にもわからなかった…　だから… まぁ せいぜい… 悔いが残らない方を自分で選べ
    
僕は当日に iPhone 5s Space Gray 64GB が手に入らなければ悔いが残ってしまっていたわけでしたからこれでいいのです。
Rubyで外部コマンドに渡すフラグをRubyっぽくメソッドに渡す

Rubyから外部コマンドを呼ぶときに`-foo`のようなフラグと`-bar 0`のような引数をとるものが混在したときにどうRubyで表すかという問題です。

結論としては

```ruby
def baz *args
  arr = []
  hash = { }
  args.each do |e|
    if e.instance_of? Hash
      hash.update e
    else
      arr << e
    end
  end
  options = ""
  hash.each{|k,v| options += "-#{k} #{v} "}
  arr.each{|e| options += "-#{e}"}

  system "command #{options}"
end

baz :foo, bar: 0
```

のように可変長引数で受ければ両者がごちゃまぜになったものを受け取れるのでそれを整理して整形してあげます。

用途によっては整理と整形を分けずにそのまま文字列化してもいいでしょう。

ちなみに先に引数なしのフラグ、後に引数ありのフラグの順じゃないとArgumentErrorになるようです。
[Go言語] deferに関する実験

## 実験1：最後に書いたものが

最後に書いたものが最初に呼ばれるよ。

http://play.golang.org/p/gb8tbGk4wr

```go
package main

import "fmt"

func f() {
	defer fmt.Println("1")
	defer fmt.Println("2")
	defer fmt.Println("3")
}

func main() {
	f()
}
```

## 実験2：引数の評価は

引数の評価は、`defer`で関数の呼び出しが予約される時に行なわれるよ。

http://play.golang.org/p/-MPMro0vUy

```go
package main

import "fmt"

func f() {
	i := 0
	defer fmt.Printf("i is %d", i)
	i = 100
}

func main() {
	f()
}
```

http://play.golang.org/p/FXKl3S4mi0

```go
package main

import "fmt"

func f() (ret int) {
	defer func(n int) {
		fmt.Println(n)
		fmt.Println(ret)
	}(ret) // retはゼロ値で初期化されている

	return 100
}

func main() {
	fmt.Println(f())
}
```

## 実験3：メソッドオブジェクトでも

メソッドオブジェクトでも`defer`呼び出しはいける

http://play.golang.org/p/ewH2vlyWsL

```go
package main

import "fmt"

type Hoge struct {
	N int
}

func (h *Hoge) PrintN() {
	fmt.Println(h.N)
}

func f() {
	h := &Hoge{100}
	m := h.PrintN
	defer m()
	h.N = 200
}

func main() {
	f()
}
```
XY-Sort

```

# XY-Sort
# http://nabetani.sakura.ne.jp/hena/ord7xysort/
# http://qiita.com/Nabetani/items/7b08b0eb9ef84d7cfe49
#

TABLE = [
	[ 4, 1, 4, 2, 1, 3 ],
	[ 7, 3, 2, 0, 5, 0 ],
	[ 2, 3, 6, 0, 6, 7 ],
	[ 6, 4, 5, 7, 5, 1 ],
	[ 3, 1, 6, 6, 2, 4 ],
	[ 6, 0, 5, 5, 5, 1 ],
]

ROWS = [*"A".."F"]
COLS = [*"u".."z"]

DISPATCH_TBL = {}
ROWS.each_with_index { |c, i|
	DISPATCH_TBL[c] = [:sort_by_row, i]
}
COLS.each_with_index { |c, i|
	DISPATCH_TBL[c] = [:sort_by_col, i]
}

class Array

	def sort_by_col(col)
		self.sort_by.with_index { |row, i| [row[col], i] }
	end
	
	def sort_by_row(row)
		self
			.transpose
			.sort_by_col(row)
			.transpose
	end

	def dispatch(cmd)

#		if ROWS.include?(cmd)
#			sort_by_row(ROWS.index(cmd))
#		elsif COLS.include?(label)
#			sort_by_col(COLS.index(cmd))
#		end

		send(*DISPATCH_TBL[cmd])

	end
	
	def dump
		if $DEBUG
			rowbody = [COLS] + self
			rowhead = [" "] + ROWS
			puts (
				rowbody.map.with_index { |row, i|
					rowhead[i] + row.join
				}.join("\n")
			)
			puts
		end
	end
	
end

def xy_sort(command)

	(table = TABLE).tap { |t| t.dump }
	
	table = command.chars.reduce(table) { |t, cmd|
		t.dispatch(cmd).tap { |t| t.dump }
	}

	table[0].join

end

def test(input, expected)
	result = xy_sort(input)
	print (result == expected) ? "." : "E"
end

test( "AvEx", "305027")       # 0
test( "A", "112344")          # 1
test( "C", "241413")          # 2
test( "F", "134214")          # 3
test( "u", "236067")          # 4
test( "w", "732050")          # 5
test( "y", "414213")          # 6
test( "yx", "732050")         # 7
test( "ux", "236067")         # 8
test( "EF", "131424")         # 9
test( "DF", "134124")         # 10
test( "Au", "055165")         # 11
test( "uA", "023667")         # 12
test( "By", "234114")         # 13
test( "yB", "114342")         # 14
test( "yBy", "357020")        # 15
test( "yByB", "350072")       # 16
test( "AuBvCw", "131244")     # 17
test( "FAuFBvFCw", "300527")  # 18
test( "AuBv", "112344")       # 19
test( "CwDx", "515056")       # 20
test( "FzyE", "324114")       # 21
test( "uAwDyB", "114324")     # 22
test( "zExCvF", "073520")     # 23
test( "uFxEv", "002357")      # 24
test( "DyCwB", "076362")      # 25

```
[Go言語] 埋め込んだときに、メソッド名が被っててインタフェースを実装できない場合はどうするのか？


## 明示的に判別ないとインタフェースの型として振る舞えない

以下のように、同じ`Name`というメソッドを持つ構造体を埋め込むと、`Named`という`Name`を持つインタフェースを実装できない。
なぜならば、`Hoge`の`Name`を呼べばいいのか、`Piyo`の`Name`を呼べばいいのか分からない。
もちろん、`Foo`型として振る舞っているときは明示的に埋め込んでいる型を指定すれば、呼び出せる。

http://play.golang.org/p/oRWf4VQnql

```
package main

import "fmt"

type Named interface {
	Name() string
}

type Hoge struct {
}

func (_ *Hoge) Name() string {
	return "Hoge"
}

func (_ *Hoge) HogeMethod() {
	fmt.Println("Hoge Method!")
}

type Piyo struct {
}

func (_ *Piyo) Name() string {
	return "Piyo"
}

func (_ *Piyo) PiyoMethod() {
	fmt.Println("Piyo Method!")
}

type Foo struct {
	*Hoge
	*Piyo
}

func hello(named Named) {
	fmt.Println("Hello", named.Name())
}

func main() {
	hoge := &Hoge{}
	piyo := &Piyo{}
	foo := &Foo{hoge, piyo}

	fmt.Println(foo.Hoge.Name())
	fmt.Println(foo.Piyo.Name())

	foo.HogeMethod()
	foo.PiyoMethod()

	hello(foo)
}
```

## 明示的に定義する

どっちか分からないなら`Foo`のメソッドとして、明示定義してやればいい。

http://play.golang.org/p/xYMbf7oO3J

```
func (f *Foo) Name() string {
	return f.Piyo.Name()
}
```
Macのxargsの-Iオプションに潜む罠

どういう罠か、とりあえず実例を示します。

```
$ echo "64byte string.**************************************************" | xargs -I% echo %%%%
64byte string.**************************************************64byte string.**************************************************64byte string.**************************************************%
```

最後の%が`64byte string***`に展開されてません。これはxargsで`-I`オプションを使うと引数にとるパイプから受け取った文字列を展開したコマンドが、256byte以上になることを許さないからです（日本語むずかしい）

manの`-I`オプションの項目に記述されています。

```
XARGS(1)                  BSD General Commands Manual                 XARGS(1)

NAME
     xargs -- construct argument list(s) and execute utility

SYNOPSIS
     xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] [-L number] [-n number [-x]] [-P maxprocs] [-s size] [utility [argument ...]]

...

-I replstr
    Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is specified) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to the constructed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not contain replstr, and furthermore, no replacement will be done on utility itself.  Implies -x.
```

そもそも`-I replstr`オプションは`replstr`で指定した文字列を(SYNOPSISの)`utility`節に記述するとpipeから受け取った文字列をそこに展開する、というものです。で、今回このエントリで言ってることは `The resulting arguments, after replacement is done, will not be allowed to grow beyond 255 bytes;` という部分です。要は`-I`オプション使ってやたら長いコマンド（or pipeからやたら長い文字列を受け取るコマンド）を記述したらpipeから受け取った文字列が展開されないよ、という話です。

ちなみにLinux(debian6)のxargsのmanを見たところこの制限の記述はなく、実際試してみても展開されました。

```
-I replace-str
    Replace occurrences of replace-str in the initial-arguments with names read from standard input.  Also, unquoted blanks do not terminate input items; instead  the  separator  is  the newline character.  Implies -x and -L 1.
```

```
$ echo "64byte string.**************************************************" | xargs -I% echo %%%%
64byte string.**************************************************64byte string.**************************************************64byte string.**************************************************64byte string.**************************************************
```
第14回オフラインリアルタイムどう書く C++11 による実装


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/43076 )を行いました。

問題は「眠れるモンスターを狩る」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord14linedung/
です。

他の実装は
http://qiita.com/Nabetani/items/0597bd3af481e5834ae1
から辿れます。

ちなみに次回 http://atnd.org/events/43825 は 11/1(金) です。

で。

```C++
// clang++ -std=c++11 -Wall
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <map>

using namespace std;

auto killableMonster( char w )->char
{
  return w - 'a' +'A' + 1;
}

auto solve( string const & src )->string
{
  vector<char> x( src.begin(), src.end() );
  sort( x.begin(), x.end(), []( char a, char b ){ return tolower(a)<tolower(b); } );
  auto pos = find_if( x.begin(), x.end(), []( char c ){  return islower(c); } );
  if ( pos == x.end() ){
    return "0" ;
  }
  std::map<char,bool> canHunt;
  canHunt[ killableMonster(*pos) ] = true;
  int hunted=0;
  for( int i=0 ; i<x.size() ; ++i ){
    int ix = ( i+pos - x.begin() ) % x.size();
    if ( canHunt[ x[ix] ] ){
      ++hunted;
      canHunt[ x[ix]=='L' ? 'B' : x[ix]+2 ] = true;
    }
    if ( islower( x[ix] ) ){
      canHunt[ killableMonster( x[ix] ) ] = true;
    }
  }
  stringstream ss;
  ss << hunted;
  return ss.str();
}

void test( std::string const & src, std::string const & expected )
{
  std::string actual = solve( src );
  bool ok = actual == expected;
  cout << ( ok ? "ok  " : "***NG***  " ) << src << "-> " << actual << " / " << expected << endl;
}

int main()
{
/*0*/ test( "gLDLBgBgHDaD", "6" );    
/*1*/ test( "DBcDLaLgDBH", "6" );    
// 中略
/*48*/ test( "LDFLBLLeBLDBBFFBLFBB", "4" );
  return 0;
}
```

いつも通り、テストデータの大半は省略。

当日その場で書いたもの。
武器の名前とモンスターの名前が
a→B→c→D→e→F→g→H→i→J→k→L→a
と、アルファベット順になっていることを全面的に利用した。

アルファベット順に整列し最初に見つかった武器からぐるりと一周する。
`map<char,bool>` なのは若干不本意で `set<char>` にしたいんだけど、`end()` との比較が面倒なので `map` を採用。

C++11 なら `set` にruby の `include?` のようなものがあるのではないかとも思ったんだけど、調べるのサボった。
軽量ウィンドウマネージャーtwmを使う

twmはウィンドウマネージャーのひとつで、特にこれがすごいというところがないのがすごい。

Wikipediaを見るとメンテナンスされていないとか書いてあるけど、2013年9月の頭ぐらいに1.0.8が出たぐらいメンテナンスされている。

# 導入

twmのいいところは自分で気に食わないところを勝手に改造できるところ。まぁこれは別にオープンソースソフトウェアだったら当たり前だけど、でも大体複雑過ぎていじれる気がしない。Google Chromeのこの部分ちょっと弄りたいと思っても割といじれない。でもtwmのいいところは割と理解しやすいように書かれているので、今までXとか知らなくても割となんとか改造できる。

なのでtwmを使うときは、とりあえずGitで最新版を取ってきてそれをコンパイルして使うようにするのが良いと思う。使っているうちに「あーここ使いにくいなぁ」と思ったら、適当に該当箇所探して自分でパッチ当てて使いやすくする。GitのRepositoryはこちら:

* [xorg/app/twm](http://cgit.freedesktop.org/xorg/app/twm/)

X11については次のサイトをみるとよい:

* [X11](http://xjman.dsl.gr.jp/X11R6/X11/)

こんなかんじのコマンドでだいたいコンパイルできる。ヘッダが足りない場合があるので、別途インストールする必要があったりする:

```bash
cd ~/src
git clone git://anongit.freedesktop.org/xorg/app/twm
cd twm
./autogen.sh
make
```

自分はこれでコンパイルしたtwmをstartxコマンドで立ち上げている。startxはXサーバーを立ち上げて~/.xinitrcを実行するだけみたいなコマンド。~/.xinitrcでtwmを立ち上げるように指定する。twmと同時に立ち上がって欲しいプログラムがあれば、それも一緒に指定する。自分の.xinitrcから抜粋するとこんな感じになっている:

```bash
xset -b
xset r rate 170 50

udiskie &
xbindkeys
ibus-daemon -d -x
conkey -d -c ~/...
xclock ... &
~/src/twm/src/twm
```

# 設定

twmは~/.twmrcを読み込む。どんな設定があるかは`man twm`を見よう。(上の方法だとインストールしてないからこれだと見れないと思う。インターネットで検索しよう。)

自分のお気に入りはleftzoomとrightzoomで、WindowsであるWindowsキー+右とかで現在のウィンドウを右半分で最大化するみたいな機能だ。自分は標準のsrc/system.twmrcに加えて、次のような設定にしている:

```
RandomPlacement

"Tab"   = m     : all : f.raiselower
"Tab"   = m | s : all : f.raise
"Up"    = m4    : all : f.fullzoom
"Left"  = m4    : all : f.leftzoom
"Right" = m4    : all : f.rightzoom
"Down"  = m4    : all : f.iconify
"w"     = m4    : all : f.delete
"k"     = m4    : all : f.destroy

NoTitle {
  "evince"
  "xclock"
  "google-chrome"
}
```

# twm以外のプログラム

残念ながらtwmは全部入りラーメン的なウィンドウマネージャではないので、ちょっと不満が出てくる。なので他のプログラムを一緒に使うことでそれを補完していく。

上の.xinitrcで出てきたxclockとかconkyはまぁ時計ぐらいはみたいとか、CPU負荷をみたいとかで入れている。それ以外のところはこんなかんじだ:

* xbindkeys

  グローバルなキーバインドを提供するプログラム。例えば自分はCtrl+Enterでターミナルが立ち上がるようにしているし、Ctrl+Shift+EnterでGoogle Chromeが立ち上がるようにしている。あとAlt+Spaceでdmenuっていうランチャーも立ち上がるようにしている。

* dmenu

  上からうにょって出てくるランチャー。自分はターミナルとブラウザが立ち上がれば良いのであんまり使うことはない。

* xlock

  画面をロックする何か。Windows+Lに割り当ててる。

# twmの改造

twmは最初に言ったように改造しやすいのが良くて、自分もちょっと改造して使っている。twmを触る前まではXがどうなっているかとか全然わからなかったけど、適当にインターネットみてればわかる。

今のところきちんと動いているのは2つのパッチで:

* ibus-mozcのウィンドウフォーカスがおかしい問題を無理矢理なおすパッチ
* zoom系のコマンドがXinerama(複数モニターに対応するためのX拡張)に対応してなかったので対応させるパッチ

それ以外にもXrandr対応させて、プロジェクタにつないだら自動的にtwmだけ再起動させるパッチとか書いてるんだけどうまく動いてない。ちょっと弄りたいというときに結構わかりやすいのでXがどうなっているのか知るという意味でも結構手頃なソースコードだと思う。(xrandrコマンドのソースはわかりにくい)

# まとめ

最初OSXから移行するときは「夜フクロウが〜」とか「iTunesが〜」とか思ってたけど、夜フクロウはMikutterとかTweetDeckとかで割と代用できて、iTunesは諦めてiPod touchで聞けばいいかというようにしたら結構すんなり移行出来た。逆にtwmのSloppy focus?に慣れると、他の環境が微妙に使いにくい。

あと、「twm使ってます」っていうとある年齢より上のおじさまたちが反応するので、キラキラしたアイドル的な人はtwm使うと受けが良いと思います。
iOS7でステータスバーの文字の色を変える方法

1. Set UIViewControllerBasedStatusBarAppearance to NO.
1. Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];


[How to change Status Bar text color in iOS 7](http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7)
みんなhomebrew-caskって知ってるか？



複数人数で開発を行っている場合、新しい人が参加した時にこのアプリだけは入れておいてね！！ってことはありますよね？
大体の場合はwikiとかにさらっと

```
#事前にインストールするもの
hoge
```

みたいなこと書かれてると思いますが
これがいっぱいあると

# ダルいしメンテナンスかったるい。。。

のでosxで一般的になってる[homebrew](http://brew.sh/)の拡張[homebrew-cask](https://github.com/phinze/homebrew-cask)を使用して
コマンド一発で開発に必要なアプリインストールできるよ！！ってできることがわかったのでメモ

[homebrewのパッケージをGemfileみたく管理したい -> brewdlerがあった…](http://qiita.com/futoase/items/9a52ddd8bb19863372d0)で存在を知ったので感謝感謝

※brewdlerは今[Homebrew/homebrew-bundle](https://github.com/Homebrew/homebrew-bundle)になっています


## 環境

* macosx10.8(ホストOS)

## 参考にしたサイト

* [homebrewのパッケージをGemfileみたく管理したい -> brewdlerがあった…](http://qiita.com/futoase/items/9a52ddd8bb19863372d0)
* [homebrew-cask](https://github.com/phinze/homebrew-cask)

## 事前準備に必要なもの

* [homebrew](http://brew.sh/) ※入れていない方は何も考えずに```/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"```と打とう

## インストール手順

本家のままですぐ使えます(ターミナル開いて打ってね)

```
brew install caskroom/cask/brew-cask
```

### 使いたいアプリを探す

下記のコマンドで探せます

```
brew cask search

caffeine   wireshark   google-chrome    mysql-workbench    virtualbox
….
….
```

### homebrew-caskでインストールしたアプリ一覧を見る

パッケージ名を引数で指定するとパッケージの詳細な情報が出ます

```
brew list
ansible		chrome-cli	libyaml		openssl		wget
autoconf	curl		nkf		pkg-config
brew-cask	git		nmap		pyenv
```

### Caskでインストールする

コマンド一発です

```
brew cask install google-chrome
```

簡単ですね！！！

### brew-caskのインストールディレクトリについて

brew-caskでインストールしたアプリはデフォルトだと

```
~/Applications
```

にはいります。
これだとLaunchpadでインストールしたアプリがでてきません。
そんなときは ``` .zshrc ``` もしくは ``` .bashrc ``` に下記を記載するとインストール先ディレクトリを変更できます。

```.zshrc
export HOMEBREW_CASK_OPTS="--appdir=/Applications"
```

### brew-caskのアプリの管理方法について

[homebrew/homebrew-bundle](https://github.com/Homebrew/homebrew-bundle)を使ってGemfileみたいに管理することができます。

以下homebrew-bundleのインストール方法
(公式ほぼ引用です)

```
# brewにbundleコマンドが使えるようにする
brew tap Homebrew/bundle
# homebrewのGemfileみたいなファイルを作る
touch Brewfile
```

以下Brewfileサンプル

```Brewfile
cask_args appdir: '/Applications'
tap 'caskroom/cask'
tap 'telemachus/brew', 'https://telemachus@bitbucket.org/telemachus/brew.git'
brew 'emacs', args: ['with-cocoa', 'with-gnutls']
brew 'redis', restart_service: true
brew 'mongodb'
brew 'sphinx'
brew 'imagemagick'
brew 'mysql'
cask 'google-chrome'
cask 'java' unless system '/usr/libexec/java_home --failfast'
cask 'firefox', args: { appdir: '/Applications' }
```




### 【補足】使いたいアプリがない場合

公式の[ココ](https://github.com/caskroom/homebrew-cask/blob/master/CONTRIBUTING.md#adding-a-cask)にcaskの追加方法が記載されています。
眠れるモンスターを狩る

```rb:hena14.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/0597bd3af481e5834ae1
#http://nabetani.sakura.ne.jp/hena/ord14linedung/
STDOUT.sync=true
while gets
	l=$_.chomp
	monsters={}
	l.scan(/[A-Z]/).group_by{|e|e}.each{|k,v|monsters[(k.ord-'B'.ord)/2]=v.size}
	weapons={}
	weapons_queue=[]
	l.scan(/[a-z]/).uniq.each{|k,v|
		weapons[(k.ord-'a'.ord)/2]=1
		weapons_queue<<(k.ord-'a'.ord)/2
	}
	# gLDLBgBgHDaD
	# monsters={5=>2, 1=>3, 0=>2, 3=>1}
	# weapons={3=>1, 0=>1}
	# weapons_queue=[3, 0]
	n=0
	while weapons_queue.size>0
		weapon=weapons_queue.shift
		if monsters.has_key?(weapon)
			n+=monsters.delete(weapon)
			weapons_queue<<(weapon+1)%6 if !weapons.has_key?((weapon+1)%6)
		end
	end
	puts n
end
```
ffmpegで静止画に音声をつけて動画にする方法

```shell-session
$ ffmpeg -i audio.mp3 -loop 1 -i image.jpeg -shortest -c:v libx264 -crf 20 -tune stillimage -c:a copy -preset veryfast output.mov
```

# 参考文献
- [FFmpeg: The ultimate Video and Audio Manipulation Tool](http://blog.superuser.com/2012/02/24/ffmpeg-the-ultimate-video-and-audio-manipulation-tool/)
- [Join Audio and Image -> Output as Video using FFmpeg](http://superuser.com/questions/187985/join-audio-and-image-output-as-video-using-ffmpeg)
- [FFmpeg Cheat Sheet](http://rodrigopolo.com/ffmpeg/cheats.php)
Clojureの「..」「doto」「->」「->>」マクロの使い方覚え書き

..マクロ
==============================

```clj
    ;; before -- getの引数とレシーバがわかりにくい.
    (.get (.getChildren pane) 2)
    ;; before2 -- こう書くことも出来るけど`(.`が連続して読みにくい
    (. (. pane getChildren) (get 2))

    ;; after -- ..マクロを使うとこう書ける. macroexpandするとbefore2に等しくなる
    (.. pane getChildren (get 2))
```

```java
    // Java
    pane.getChildren().get(2)
```

* 前置記法のわかりにくさ回避. 左から右, メソッドチェイン風に書ける.
* 引数をとる関数適用は`(func arg)`という形で置く.
* 引数なしの関数適用は`func`を単体で書けば良い.
* Javaメソッド(or フィールドの参照)にのみ使える
  * この点を除けば -> マクロとほぼ同じ.
  * Javaメソッドであることを明示でき可読性up.
  * ..マクロは必ずJavaメソッドを呼ぶので, 単独での利用時に頭につけていたドットが不要に.


dotoマクロ
==============================

使用例: tableに対する破壊的操作が連続してる.

```clj
    (.. table (getColumns (addAll [titleColumn artistColumn releaseColumn])))
    (.. table (setItems albums))
    (.. table (setEditable true))
```

これをdotoでまとめると

```clj
    (doto table
      (-> .getColumns (.addAll [titleColumn artistColumn releaseColumn]))
      (.setItems albums)
      (.setEditable true))
```

となり, コードを読む際に副作用ある式のマーカーとして可読性を上げてくれる.
なお「..マクロ」を使わなくなったのでJavaメソッドを呼ぶ頭のドットが復活している.

ちなみに上の例をmacroexpandするとこうなる.

```clj
(let* [G__1278 table] ;; 破壊的操作を加えるのでtableをコピー
  (-> G__1278 .getColumns (.addAll [titleColumn artistColumn releaseColumn]))
  (.setItems G__1278 albums)
  (.setEditable G__1278 true)
  G__1278) ;; 最後に破壊的操作を加えたtableをreturn
```

最後に破壊的操作を加えた結果を返してくれるので, let中で初期化と同時にいろいろパラメータをセットしてやるときに便利.

```clj
(defn drawCircle [i pane]
  (let [circle (doto (Circle. (* (+ 50 i) 10))
                     (.setFill (Color/color (- 1.0 (/ i 10.0))
                                            0
                                            (/ i 10.0))))]
  (.. pane getChildren (add circle))))
```

こんな感じに.


->マクロ
==============================

* 左から右にメソッドチェイン. 「..マクロ」とほぼ同じ

```clj
    ;; 使用例
    (-> "../resources/layout.fxml" io/resource FXMLLoader/load)

    ;; 動作理解のための意味のない例
    (-> 3 (+ 3)) ;; => 6
    (macroexpand '(-> 3 (+ 3))) ;; => (+ 3 3)
    (macroexpand '(-> 3 (+ 1 2))) ;; => (+ 3 1 2)
```


->>マクロ
==============================

->マクロ とは作用順序が異なる. 

```clj
    (macroexpand '(->  3 (+ 1 2))) ;; => (+ 3 1 2)
    (macroexpand '(->> 3 (+ 1 2))) ;; => (+ 1 2 3)
```

作用順序によって結果が異なるケースの例

```clj
    (macroexpand '(->  10 (* 10) (- 1))) ;; => (- (clojure.core/-> 10 (* 10)) 1)  ;; 100 - 1
    (macroexpand '(->> 10 (* 10) (- 1))) ;; => (- 1 (clojure.core/->> 10 (* 10))) ;; 1 - 100
    (->  10 (* 10) (- 1)) ;; => 99
    (->> 10 (* 10) (- 1)) ;; => -99
```

 `->>`はここで必要なのか！という例にまだ出会ってないので, 見つけたら追記する.
gemファイルのインストール場所を調べたりする方法

`$ gem environment` を使うとOK

```
ironsand@osx gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.3
  - RUBY VERSION: 2.0.0 (2013-06-27 patchlevel 247) [x86_64-darwin11.4.2]
  - INSTALLATION DIRECTORY: /Users/ironsand/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0
  - RUBY EXECUTABLE: /Users/ironsand/.rbenv/versions/2.0.0-p247/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/ironsand/.rbenv/versions/2.0.0-p247/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-11
  - GEM PATHS:
     - /Users/ironsand/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0
     - /Users/ironsand/.gem/ruby/2.0.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - "install" => "--no-ri --no-rdoc"
     - "update" => "--no-ri --no-rdoc"
  - REMOTE SOURCES:
     - https://rubygems.org/
```

あと `$ gem help commands` すると色々教えてもらえて便利！

## 参考

ruby - How can I find where gem files are installed? - Stack Overflow
http://stackoverflow.com/questions/19072070/how-can-i-find-where-gem-files-are-installed/19072136?noredirect=1#19072136
CakePHP - CakeDC searchプラグインではまったこと


CakeDCのsearchプラグインを使おうと思い、サンプルに合わせて記述していったら下記のようなエラーになったので回避方法メモ。

```
Notice (8): Indirect modification of overloaded property ArticlesController::$paginate has no effect
```

readmeのサンプルでは下記のように書けと書いてある。

```
public function find() {
  $this->Prg->commonProcess();
  $this->paginate['conditions'] = $this->Article->parseCriteria($this->Prg->parsedParams());
  $this->set('articles', $this->paginate());
}
```

`$this->paginate['condition']`という書き方をやめて直接`paginate()`の変数に渡すことで解決した。

```
public function find() {
  $this->Prg->commonProcess();
  $this->set('articles', $this->paginate($this->Article->parseCriteria($this->Prg->parsedParams())));
}
```
`C:\fakepath`ってなんやねん。

uploadコントローラーを使ってファイルをアップロードするときにディレクトリ名をは取得できないようになったので取得しようとしてると`C:\fakepath`が表示されるよ！

ということらしいです。

## 参考

File Uploads and C:\fakepath\
http://davidwalsh.name/fakepath
シンボリックリンクのリンク先を示す文字列を置換する

Macのユーザー名を変えた時に旧ユーザー名を含んだシンボリックリンクがたくさんあったので、

`/home/old_user/sh/foo.sh` -> `/home/new_user/sh/foo.sh` にシンボリックリンクを変更する方法が知りたかったので聞いてみた。

```
ln -sfn "$(readlink existing_link | sed s/foo/bar/)" "existing_symlink"
```

でOK。 `readlink` なんてのがあったんですね。

## 参考

symlink - Is there way to replace value of symbolic link? - Unix & Linux Stack Exchange
http://unix.stackexchange.com/questions/92643/is-there-way-to-replace-value-of-symbolic-link/92648?noredirect=1#92648
Widgetでリモート画像を表示する(ImageViewを使う)


```
setImageViewUri(R.id.imageview,Uri.parse("http://www.hogehoge.com/hoge.jpg");
```
とやっても、画像がうまく表示されない。
なので、Bitmapか、Drawableをセットするメソッドを使う。

しかし、

Widgetのviewを更新する際に利用するRemoteviewには、
setImageViewDrawableみたいなメソッドが存在しない。

setImageViewBitmapを使う

```
URL neturl = new URL(url);
Drawable drawable = Drawable.createFromStream(neturl.openStream(),"src");
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
remoteViews.setImageViewBitmap(R.id.isImage, bitmap);
```
Corona: タッチ位置に矩形を移動させる


```
--- タッチ位置に矩形を移動するサンプル

local SIZE = 30 -- 矩形サイズ
local rect = nil

function onTouch(event)
    if event.phase == "ended" then
        local t = system.getTimer()
        local function onComplete(target)
            print("Time elapsed: " .. (system.getTimer() - t))
        end
        transition.to(rect, { time=1000, x=event.x, y=event.y, onComplete=onComplete })
    end
end

Runtime:addEventListener("touch", onTouch)

function main()
    local w = display.contentWidth
    local h = display.contentHeight
    rect = display.newRect(w/2-SIZE/2, h/2-SIZE-2, SIZE, SIZE)
end

main()
```

`transition.to` で矩形オブジェクトを移動させます。上のコードでは、タッチ位置まで 1000 ミリ秒かけて移動し、完了後に `onComplete` をコールするように指定しています。

ログ出力は以下です。

```
2013-09-29 01:42:34.515 Corona Simulator[27530:707] Time elapsed: 1000.698
2013-09-29 01:42:36.033 Corona Simulator[27530:707] Time elapsed: 1013.599
2013-09-29 01:42:37.981 Corona Simulator[27530:707] Time elapsed: 1014.573
2013-09-29 01:42:39.697 Corona Simulator[27530:707] Time elapsed: 1025.53
2013-09-29 01:42:41.743 Corona Simulator[27530:707] Time elapsed: 1020.299
```
第14回オフラインリアルタイムどう書くの問題をRubyで解く

リアルタイム現場で頂いた意見で少し修正しています。

```rb
def battle(ms, ws)
  mh = {:B=>:a,:D=>:c,:F=>:e,:H=>:g,:J=>:i,:L=>:k}
  wh = {:B=>:c,:D=>:e,:F=>:g,:H=>:i,:J=>:k,:L=>:a}
  ms_k, ms_a = ms.partition{|m| ws.include?(mh[m])}
  return 0 if ms_k.size == 0
  ws_a = ms_k.map{|m| wh[m]}
  battle(ms_a, ws_a) + ms_k.size
end

def solve(q)
  ms, ws = q.chars.map(&:to_sym).partition{|e| (:A..:Z).include?(e)}
  battle(ms, ws)
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	gLDLBgBgHDaD	6
1	DBcDLaLgDBH	6
2	JJca	0
```
[Go] 文字がテキストターミナル上で全角幅か半角幅を調べるライブラリを作りました

[東アジアの文字幅 - Wikipedia](http://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85)を見ると、 [EastAsianWidth.txt](http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt) でカテゴリがW, F, Aのものを全角幅として扱えば良いようです。
（このあたりよく分かっていないので間違っているかもしれません。間違っている場合はご指摘いただけるとありがたいです）

そこでこれらのカテゴリに含まれる文字を[unicode.RangeTable](http://golang.org/pkg/unicode/#RangeTable)として実装し、[unicode.Is(rangeTab *RangeTable, r rune) bool](http://golang.org/pkg/unicode/#Is)と組み合わせて、全角かどうかの判定関数
```IsFullwidth(r rune) bool```を実装しました。

ソースは[hnakamur/unicodeutil](https://github.com/hnakamur/unicodeutil)にあります。
Ruby で bundle install とか gem install で SSL 証明書のエラーが出る


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

```
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
```

SSL 証明書を入れてあげることで解決します。

```
$ brew install curl-ca-bundle
$ ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE' # どこに置けばいいのか調べる
"/usr/local/etc/openssl/cert.pem"
$ cp /usr/local/opt/curl-ca-bundle/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
```
PCRE関数（preg系関数）で Unicode なコードを16進で指定

PCRE関数（preg系関数）で `\x{hhh...}` の形式で Unicode なコードを16進で指定できます。

```php
<?php
preg_match('/[\\x{3044}-\\x{3048}]+/u', 'あいうえお', $m);
var_dump($m[0]); // いうえ
```

サロゲートペアのような、エディタでの表示が困難な文字を指定するときに便利です。

```php
<?php
// UTF-16 のサロゲートペアな文字
$u32 = hex2bin('000201A2');

$u08 = mb_convert_encoding($u32, 'UTF-8', 'UCS-4BE');
var_dump($u08); // でかい ^ みたいな文字
var_dump(bin2hex($u08)); // f0a086a2

$u16 = mb_convert_encoding($u32, 'UTF-16', 'UCS-4BE');
var_dump(bin2hex($u16)); // d840dda2

// 正規表現を `\x{hhh...}` の形式で指定
$r = preg_match('/\\x{201A2}/u', $u08, $m);
var_dump($r, $m[0]);

// 文字列リテラルのエスケープシーケンスで UTF-8 のコードを指定
$r = preg_match("/\xF0\xA0\x86\xA2/u", $u08, $m);
var_dump($r, $m[0]);
```

UTF-8 なバイトシーケンスを `"/\xF0\xA0\x86\xA2/u"` などと指定するより楽です。

### 参考

 - [http://www.pcre.org/pcre.txt](http://www.pcre.org/pcre.txt) の *Non-printing characters* の辺り
AWS SDK for Ruby で Spot Request を送るときのそれっぽい値段を出す

東京リージョンのVPC内に t1.micro のスポットリクエストを送るときに使う
それっぽい値段を出す

AZ片側だけで判定(ap-northeast-1a)
立ち上げるマシンはLinux

Ruby2.0.0-p247
aws-sdk 1.22.0

~~~ruby
require "aws-sdk"

AWS.config(
  :access_key_id     => "access_key_id",
  :secret_access_key => "secret_access_key",
  :region            => "ap-northeast-1"
)

def soreppoi_price
  ec2 = AWS::EC2.new
  options = {
    :instance_types    => ["t1.micro"],
    :availability_zone => "ap-northeast-1a",
    :start_time        => (Time.now - 60 * 60 * 24).iso8601,
    :filters           => [
      {
        :name   => "product-description",
        :values => ["Linux/UNIX (Amazon VPC)"],
      }
    ],
  }
  resp = ec2.client.describe_spot_price_history(options)
  resp[:spot_price_history_set].each {|history|
    return history[:spot_price].to_f + 0.005
  }
end

puts soreppoi_price
~~~

参考にしたもの
http://itsneatlife.blogspot.jp/2013/08/aws-sdk-rubyspot-instancepricing-history.html
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Client/V20131001.html#describe_spot_price_history-instance_method
http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSpotPriceHistory.html (Supported Filters)
AWS SDK for Ruby で VPC 内に Spot Request を送る

東京リージョンのVPC内に $0.005/h を上限とする t1.micro のスポットリクエストを送る

Ruby2.0.0-p247
aws-sdk 1.22.0

~~~ruby
require "aws-sdk"

AWS.config(
  :access_key_id     => "access_key_id",
  :secret_access_key => "secret_access_key",
  :region            => "ap-northeast-1"
)

ec2 = AWS::EC2.new
options = {
  :instance_count => 1,
  :spot_price     => "0.005",
  :launch_specification => {
    :image_id           => "ami-xxxxxxxx",
    :key_name           => "Key pair name",
    :instance_type      => "t1.micro",
    :security_group_ids => ["sg-xxxxxxxx"],
    :subnet_id          => "subnet-xxxxxxxx",
  },
}
ec2.client.request_spot_instances(options)
~~~
rsync したいときの秘伝のタレ

秘伝のタレ

    /usr/bin/rsync -vau -e 'ssh -c arcfour256' /hoge/fuga/ catatsuy@catatsuy.org:/hoge/fuga/

ディレクトリの最後に `/` があるかないかで挙動が違うので必ずつけましょう

オプション | 意味
----|----
`-v`, `--verbose` | ファイルの情報と、最後にサマリーが表示される
`-a`, `--archive` | よくあるオプションをひとまとめにしたものでいい感じにしてくれる
`-u`, `--update` | 新しいファイルだけコピーする
`-e`, `--rsh` | リモートシェルに接続するプログラムを指定する