OmniAICreator/Qiita-1.07M huggingface dataset:
grunt-initの .writePackageJSON について


## こまったこと

grunt-initでは、```package.json```を吐き出す際に```grunt.writePackageJSON```というメソッドを使う。
例えばこんな感じ。

```javascript:template.js
grunt.writePackageJSON('package.json', {
    name: 'mogemoge',
    version: '0.1.0',
    dependencies: {
        async: '~0.2.8'
    }
})
```

ところがこの```writePackageJSON```、 **scriptsを指定しても反映されないことに気がついた。**
```npm test``` でテストとか、```npm start```でサーバー起動とか好きなのにー。

## 調べよう

というわけで、ソースを読む。(grunt-initの中身)
```ack writePackageJSON```したところ、```tasks/init.js```に患部があるらしい。


```javascript:tasks/init.js
      writePackageJSON: function(filename, props, callback) {
        var pkg = {};
        // Basic values.                                                                  
        ['name', 'title', 'description', 'version', 'homepage'].forEach(function(prop) {
          if (prop in props) { pkg[prop] = props[prop]; }
        });
        // Author.                                                                        
        var hasAuthor = Object.keys(props).some(function(prop) {
          return (/^author_/).test(prop);
        });
        if (hasAuthor) {
          pkg.author = {};
          ['name', 'email', 'url'].forEach(function(prop) {
            if (props['author_' + prop]) {
              pkg.author[prop] = props['author_' + prop];
            }
          });
        }
(以下略)
```

こんなかんじで、どうやら与えたオブジェクトをまるっと書きだすのではなく、
決まったプロパティだけ選んでちまちまjsonにしているみたい。まめだのう。
しかしそれならscriptsもプロパティに入れといて欲しい。。


そして公式も読むと、以下のような記述が。

[Project Scaffolding - Grunt: The JavaScript Task Runner](http://gruntjs.com/project-scaffolding#init.writepackagejson)
> Save a package.json file in the destination directory. The callback can be used to post-process properties to add/remove/whatever.
>
``` 
init.writePackageJSON(filename, props[, callback])
```

ふむふむ。コールバックを使うとパラメータを少し弄って出力できるのね。
そんなわけで以下のようなコードを試した。

```javascript:template.js
var pkg = {
    name: 'mogemoge',
    version: '0.1.0',
    dependencies: {
        async: '~0.2.8'
    },
    scripts: {
        test: 'NODE_ENV=test mocha',
        start: 'node server'
    }
};

// write package.json                                                             
init.writePackageJSON('package.json', pkg, function (pkg, props) {
    pkg.scripts = props.scripts;
    return pkg;
});
```

これで無事、scriptsも含まれたpackage.jsonを出力できますよ、と。

## まとめ

```writePackageJSON``` は、ちゃっかりbower.jsonの出力にも使えたりするので、
もうすこし柔軟なメソッドなのかと思ってたけど、案外けちくさかった。

ちなみに、```scripts.test```については、
grunt-initのpropsの方で```npm_test```を設定しとくと、勝手に入るみたい。
testしか使わないならこちらでもいいかもね。
MYLAPS Sports Timing ChipX Decoderプロトコル


**ご注意。この投稿はネット上のあちこちにあるフォーラム、実機から取得したパケットを元にまとめた情報で、MYLAPS Sports Timing社の正式な仕様ではありません。この資料を元に発生したトラブル、苦情等は一切受け付けません。MYLAPSへのお問い合わせなどもしないでください。**

# ChipX Decoderの動作について

ChipX Decoderはシリアル出力、TCP/IP出力が行える。

某所の計測チームにおじゃまして状況を確認。ChipX DecoderをTCP/IPモードで動作させた場合、ChipX DecoderはTCP/IPサーバとして動作する。quick hackしたクライアント（pythonスクリプト）でデータ採取。以下を確認した。

* TCPでsocket接続できること
* ChipX decoderから定期的にデータが送信されること
* 取得可能なデータは独自バイナリ形式であること

# ChipXデコーダのethernet情報

ARPからMACアドレス採取。

<pre>? (192.168.10.201) at 0:4:b7:xx:xx:xx on en0 ifscope [ethernet]</pre>

Vendor IDは`00-04-B7`でAMB i.t.（現[MYLAPS Sports Timing社](http://www.mylaps.com/en)）で間違いなし。

AMB i.t.（オランダ）Mac Address vendor ID

<pre>  00-04-B7   (hex)		AMB i.t. Holding
  0004B7     (base 16)		AMB i.t. Holding
  				Zuiderhoutlaan 4
				PJ Haarlem 2012
				NETHERLANDS</pre>

----

# ネット上の解析資料まとめ

## バイナリについて

可変長マルチレコードのバイナリ。エンディアンはリトル。

フォーラム一定時間ごとにデータをグルーピングして送信する仕様と推測される（実機もおおよそそのような動作をする）。

## メッセージヘッダについて

バイナリにはメッセージヘッダが付与される。データタイプ、バージョン、長さ、チェックサムなど。次のデータではType Of Recordは0x0001(Passing) 0x0005(ClearPassing)が確認できる。

| Header | |
|:--|:--|
| 8e | SOR (Start of Record) |
| 02 | Version |
| 33:00 | length of record = 00 33 = 51 |
| cf:02 |CRC = 02 cf |
| 00:00 | Flags = 00 00 |
| 01:00 | TOR (Type of Record) = 00 01 |


## データレコードについて

ヘッダに続けてトランスポンダデータが飛んでくる。

| data | |
|:--|:--|
|01| PASSING_NUMBER|
|04| length 4 bytes|
|b2:9b:01:00| 00 01 9b b2 なんだこりゃ？|
|03|  TRANSPONDER |
|04 | length 4 bytes|
|27:fc:70:00 | 00 70 fc 27 (7404583) トランスポンダーID? |
| 04 | RTC_TIME |
|08 | length 8 bytes |
|e8:19:e6:bd:8a:75:04:00 |  00 04 75 8a bd e6 19 e8 = Sat Oct 10 01:37:38 UTC+0000 2009 |
|05 |  STRENGTH |
| 02 | length 2 bytes |
|33:00 | 00 33 = 51 |
|06 |  HITS |
|02 | length 2 bytes |
|10:00 | 00 10 = 16 |
|08 | FLAGS |
|02 | length 2 bytes |
|00:00 | 0000 |
|81 |  DECODER_ID |
|04 | length 4 bytes |
|fc:05:04:00 |  00 04 05 fc |
|8f |  EOR (End of Record) |


## チェックサム

未解析。

ネット上の調査によれば0x8a-0x8fのレンジは、直前に0x8dを差し込んでエスケープされる。さらに、その直後のバイト（エスケープされるバイトの1バイト後）は0x20が加算される仕様。これはいかがなものかと…。

----

# 参考資料

* [DataCollector 3.0仕様](http://support.mylaps.com/kb/en/b2b/Manuals/DataCollector_ENG.pdf) Passing Recordの項を参照のこと。
* [AMB Protocol?](http://www.hobbytalk.com/bbs1/archive/index.php/t-73738-p-2.html) こいつは興味深いスレッド
* [AMB MyLaps tester](https://play.google.com/store/apps/details?id=com.skoky&hl=ja)
* [schaatsnacht](http://sourceforge.net/projects/schaatsnacht/)
Nexus7を手動でAndroid4.4に更新する方法

自動アップデートが降ってこない場合は、更新用ファイルを使い手動でインストールすることもできる。

[Googleサービスフレームワークを利用したアップデート確認](http://www.lifehacker.jp/2012/10/121001andoirdcheck.html)でもなかなかアップデートできない人向け。

## 1. HomebrewでAndroid SDKをインストールする
Homebrewのインストールは[こちら](http://qiita.com/is0me/items/475fdbc4d770534f9ef1)

```
$ brew install android-sdk
```

## 2. Android SDK Managerで、adbをインストールする

```
$ android
```

Toolsの中にある、Android SDK Toolsと、Android SDK Platform-tools、Android SDK Build-toolsをインストールする。

インストール後、adbコマンドが使えるようになる。

## 3. Android4.4のダウンロード
Nexus7(2012)はこちら
http://android.clients.google.com/packages/ota/google_nakasi/13088e35942c77e4752aa1fdf51d54472509b941.signed-nakasi-KRT16O-from-JWR66Y.13088e35.zip

Nexus7(2013)はこちら
http://android.clients.google.com/packages/ota/google_razor/3a3951e8243c82bc01a620ab858f4454c8ebd65c.signed-razor-KRT16O-from-JSS15R.3a3951e8.zip

## 4. Nexus7をリカバリモードで起動する
電源をオフにし、ボリュームアップ、ボリュームダウン、電源の3つを同時に押し続ける。
起動するとモードを選択するメニューになるので、Recovery Modeを選択する。

## 5. リカバリメニューからApply update from ADBを選択
同時押しではなく、電源を押しながら、ボリュームアップを押してリカバリメニューを開く。
Apply update from ADBを選択すると、sideloadコマンドの実行を促すメッセージが表示される。

## 6. Nexus7をMacに繋ぎインストール
Nexus7をUSBケーブルで繋ぎ、

```
$ adb devices
```
を実行すると、List of devices attachedに、sideload状態の端末IDが表示されれば認識されている。
あとは、ダウンロードしたAndroid4.4の更新ファイルをsideloadで指定する。

```
$ adb sideload ~/Donwload/13088e35942c77e4752aa1fdf51d54472509b941.signed-nakasi-KRT16O-from-JWR66Y.13088e35.zip
```

最後に、Install from ADB completeが表示されれば完了。

![IMG_20131115_165751.jpg](https://qiita-image-store.s3.amazonaws.com/0/1818/cb32cf25-8aea-475b-6f0b-cb4e0cf1f11d.jpeg)
カメラでシャッター音を強制的に鳴らす

# 1.takePicture()を利用する場合

要は普通にカメラで撮影する場合。

##ICSまで
takePicture()をコールするとシャッター音が必ず鳴るので特にコード上で意識することはない。

##ICS以降
takePicture() に Camera.ShutterCallback を設定しないとシャッター音が鳴らない。
Camera.ShutterCallback の中身は空でよい。コードは以下のような感じ。


```Java:Camera.java
/** シャッターコールバックとピクチャコールバックの定義 */
private Camera.ShutterCallback mShutterListener =
    new Camera.ShutterCallback() {
        public void onShutter() {
            // 空でOK。
        }
    };

private Camera.PictureCallback mPictureListener =
    new Camera.PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            // ここは通常通り撮影時の処理をいろいろ記述。
        }
    };

```
```Java:Camera.java
/** 撮影 */
mCamera.takePicture(mShutterListener, null, mPictureListener);
```

なぜこのような仕様変更が発生したのかは謎。

***
よってどのOSバージョンでもシャッター音が鳴るようにするためには Camera.ShutterCallback を必ず記述すればよい。

# 2.takePicture()を利用しない場合

実際はプレビューキャプチャをしているが、撮影している風の演出をしたい場合など。シャッター音に限らず、端末のボリューム設定に関係なく音を鳴らしたいときに応用可能。
ただリフレクションを利用するため正攻法とはいえない。

***
音源を SoundPool を利用して音を鳴らす。このとき、Sound Pool コンストラクタの streamType 引数に特殊な値を設定してやる、というのが基本的な方針。

```Sample.java
    /** StremType の取得 */
    int streamType = AudioManager.STREAM_SYSTEM;  // ここは各アプリの方針に合わせて適切に設定
    try {
        Class asClass = Class.forName("android.media.AudioSystem");
        Field sseField = asClass.getDeclaredField("STREAM_SYSTEM_ENFORCED");
        streamType = sseField.getInt(null);
    } catch (Exception e) {
        // 例外処理
    }

    /** 読み込み */
    SoundPool soundPool = new SoundPool(2, streamType, 0);
    int soundID = soundPool.load(this, R.raw.shutter_sound, 1);

    /** 再生 */
    soundPool.play(soundID, 1.0f, 1.0f, 0, 0, 1.0f);
```

カメラアプリであればシャッターボタンを押したタイミングや ShutterCallback 内などで再生してやればよい。

***
Android のソースコードを読むと分かるが AudioSystem.java に STREAM_SYSTEM_ENFORCED という定数が定義してある。この値をアプリから強引に設定しようというのが上記サンプルのアプローチ。

```AudioSystem.java
    /* @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */
    public static final int STREAM_SYSTEM_ENFORCED = 7;
```

STREAM_SYSTEM_ENFORCED は eclair からソースには入っており、端末メーカが故意に外さない限りは生きているであろう定数。@hide なパラメータだけに今後どうなるかは不明。
Jadeのメモ

自サイトのHTMLを直接書きたくなくなったので、Jadeで置き換えようといろいろ調べてみての成果というか。

```jade
mixin linkSection(sectionName, dataList)
  section
    h2 #{sectionName}
    dl
      - for (var i = 0; i < dataList.length; ++i) {
        dt
          a(href="#{dataList[i].uri}") #{dataList[i].linkTitle}
        dd
          != dataList[i].description
      - }

+linkSection("Twitter", [
  {
    linkTitle: "@sasaplus1",
    uri: "//twitter.com/sasaplus1/",
    description: "いろいろツイートしています。<a href=¥"/¥">タグも書ける。</a>"
  }
])
```

Jadeすごい。
でもここまでやるのはちょっとやり過ぎかな……
tmuxのバッファ内容をVIMで開く

シェルから下記コマンドを入力するだけの簡単なお仕事です。

```sh
tmux capture-pane -S -10000\; show-buffer | vim +10000 -Rc 'set ts=8 nolist nonu' -
```

alias例

``` sh:~/.zshrc
alias zp="tmux capture-pane -S -10000\; show-buffer | vim +10000 -Rc 'set ts=8 nolist nonu' -"
# vimshellを導入している人向け(シンタックスハイライトが付きます)
alias zp="tmux capture-pane -S -10000\; show-buffer | vim +10000 -Rc 'set ft=vimshell ts=8 nolist nonu' -"
```
Maven を使った Java project 作成方法


# はじめに

Maven の Archetype Plugin を使って Java project を作成する方法と、その project に対する Maven の基本操作について説明する。

Maven のコマンドを1つ実行するだけで、
Hellow World プログラムの source file と test file が自動で作成される。

# Project の作成

以下の Maven コマンドを実行すると、 Java project が作成される。

    mvn archetype:generate \
      -DarchetypeArtifactId=maven-archetype-quickstart \
      -DinteractiveMode=false \
      -DgroupId={group-id} \
      -DartifactId={project-name}

例えば、 `{group-id}` を com.sample 、 `{project-name}` を hello とする場合は、以下のコマンドを実行すればよい。

    mvn archetype:generate \
      -DarchetypeArtifactId=maven-archetype-quickstart \
      -DinteractiveMode=false \
      -DgroupId=com.sample \
      -DartifactId=hello

生成されるディレクトリとファイルの構成は以下の通り。

    hello
    |-- pom.xml
    `-- src
        |-- main
        |   `-- java
        |       `-- com
        |           `-- sample
        |                   `-- App.java
        `-- test
            `-- java
                `-- com
                    `-- sample
                            `-- AppTest.java

# Maven の基本操作
## コンパイルと実行

以下のコマンドを project のトップディレクトリ(上記の例の hello ディレクトリ)で実行すると、src ディレクトリ配下にあるアプリケーションの source file がコンパイルされる。

    mvn compile

トップディレクトリ配下に target ディレクトリが作成され、その配下に class file が生成される。


    hello
    |-- pom.xml
    |-- src
    |   |-- main
    |   |   `-- java
    |   |       `-- com
    |   |           `-- sample
    |   |                   `-- App.java
    |   `-- test
    |       `-- java
    |           `-- com
    |               `-- sample
    |                       `-- AppTest.java
    `-- target
        `-- classes
            `-- com
                `-- sample
                        `-- App.class

トップディレクトリで以下のコマンドを実行すれば、自動生成された class ファイルを実行できる。

    java -cp target/classes/ com.sample.App

## テスト

    mvn test

test ディレクトリ配下のテストコードをコンパイルし、実行する。

## clean

    mvn clean

target ディレクトリを削除し、 build data を全て削除する。

# 補足

Maven 3.1.1 をインストールした環境で、上記コマンドの動作確認を行った。

# 参考
 * [Maven - Download Apache Maven](http://maven.apache.org/download.cgi)
   * Maven のダウンロードページ。
   * Maven のインストール方法についても書いてある。

 * [Maven - Maven Getting Started Guide](http://maven.apache.org/guides/getting-started/)
   * Maven の基本的な使い方について。

 * [How to create a Java project with Maven](http://www.mkyong.com/maven/how-to-create-a-java-project-with-maven/)
   * Maven の Archetype Plugin を使って Java project を作成する方法について説明している。
Google Drive にアップしたテキストファイルの見栄えをよくする (1.PDF化)

ここ1-2ヶ月で Google Drive を使いはじめたのですが
あまりの便利さに, すっかり手放せなくなってしまいました.

PC で作成したメモ書きを, ところ構わず iPhone で読めるのがいいです
ファイルの同期も一瞬ですし

Google Drive を使う前は, 作成したメモをメールに貼付けて 自分宛にメールしていましたが
今後はドライブにファイルをガンガン突っ込んで, 
スマホで閲覧というスタイルでメモを運用しようと思います.


さて そのテキストファイルなのですが, 実は iOS 上でみるとあまりきれいに表示されません.
一手間かけて PDF 化すると少しだけ読みやすくなります.

左が iOS Google Drive アプリ上で見たテキストファイル, 右が PDF ファイルです.

![compareTxtPdf_.png](https://qiita-image-store.s3.amazonaws.com/0/8510/4f399c32-ffdf-a56a-d833-b7256fdbec91.png)

PDF ファイルが ちょっとだけ見栄えがいいですね.
（PDF は後述の手順で作成したもの. PDF のほうが行間詰まっていて, ページ単位で画像になっているのでピンチズームしたときの見えかたが自然）

とは言え
テキストファイルを編集するたびに PDF を作成するのはめんどうくさいです.

そこで, Google Drive 上の所定のフォルダに テキストファイルを配置すると
閲覧用 PDF ファイルが自動作成される処理を仕掛けてみることにしました.

二回に分けて, 方針とサンプルを記します.

#### 方針
- - - 

- 処理のトリガーは, PC上の所定フォルダにファイルを配置したタイミング. フォルダアクションでこれを実現する
- テキストファイルから PDF ファイルの作成処理は, Mac OS X デフォルトで利用できる `cupsfilter` を利用

#### 1. テキストファイルから PDF を作成する
- - -

以下のコマンドで 作成できます.

`cupsfilter input.txt > output.pdf`

対象がテキストなので, 処理は一瞬です.

```bash
# 実行時のコンソール出力
$ cupsfilter memo.txt > memo.pdf
DEBUG: argv[0]="cupsfilter"
DEBUG: argv[1]="1"
DEBUG: argv[2]="tgck"
DEBUG: argv[3]="memo.txt"
DEBUG: argv[4]="1"
DEBUG: argv[5]=""
DEBUG: argv[6]="memo.txt"
DEBUG: envp[0]="<CFProcessPath>"
DEBUG: envp[1]="CONTENT_TYPE=text/plain"
DEBUG: envp[2]="CUPS_DATADIR=/usr/share/cups"
DEBUG: envp[3]="CUPS_FONTPATH=/usr/share/cups/fonts"
DEBUG: envp[4]="CUPS_SERVERBIN=/usr/libexec/cups"
DEBUG: envp[5]="CUPS_SERVERROOT=/private/etc/cups"
DEBUG: envp[6]="LANG=en_US.UTF8"
DEBUG: envp[7]="PATH=/usr/libexec/cups/filter:/usr/bin:/usr/sbin:/bin:/usr/bin"
DEBUG: envp[8]="PPD=/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/Resources/Generic.ppd"
DEBUG: envp[9]="RIP_MAX_CACHE=8m"
DEBUG: envp[10]="USER=tgck"
INFO: cgtexttopdf (PID 13078) started.
DEBUG: Page = 612x792; 17,19 to 595,773
DEBUG: No italic font!
DEBUG: No bold-italic font!
DEBUG: No bold font!
INFO: cgtexttopdf (PID 13078) exited with no errors.
$
```

そもそも cupsfilter って何者？　って疑問がありますが
Unix で標準化された印刷システム である, CUPS に含まれるツールとのこと.

```bash
$ which cupsfilter
/usr/sbin/cupsfilter
```

`cupsfilter` の他の PDF 作成ツールで
`ghostscript` 、`txt2pdf.pl` も試してみたのですが
日本語の変換（とフォント指定の面倒さ）がうまくクリアできませんでした.
また, 必要なリソースをインストールしなければならない, というのも不採用理由です.


次回に続きます.


#### 余談 : CUPS について
- - - 

ウィキペディアのリンク：
[ Common Unix Printing System ] (http://ja.wikipedia.org/wiki/Common_Unix_Printing_System)
→ Web共有できる PDF 生成サーバらしい

ブラウザで次の URL にアクセスすると, 設定画面が表示される
http://localhost:631/

```bash
# デーモンはこれですかね
$ ps -ef | grep cupsd | grep -v grep 
    0 13009     1   0   0:00.02 ??         0:00.03 /usr/sbin/cupsd -l
$ 
```
railsでi18nを使う

日本語に設定

```rb:config/application.rb
config.i18n.default_locale = :ja
```

モデル関連

```yaml:hoge.yml
ja:
  activerecord:
    models:
      hoge: ほげ
    attributes:
      hoge:
        huga: ふが
```

```haml:hoge.html.haml
= Hoge.model_name.human # => ほげ
= Hoge.human_attribute_name(:huga) # => ふが
```

その他

```yaml:foo.yml
ja:
  label:
    foo: ふー
  messages:
    bar: ばー
```

```haml:foo.html.haml
= t('label.foo') # => ふー
= t('messages.bar') # => ばー
```
ニコニコ生放送の視聴中にgateページを開くブックマークレット

目的
===================

放送はじまると視聴画面からタイムシフトの予約ができないんじゃああああああああああああ！！！！！

何年おなじ事言わせるんじゃぼけえええええええええええええええええ！！！！！！！！！！！！！！

動作
===================

ニコニコ生放送の視聴ページ（例 : http://live.nicovideo.jp/watch/lv159613497 ）でこのブックマークレットを使うといわゆるゲートページ（例:  http://live.nicovideo.jp/gate/lv159613497 ）を新規ウィンドウで開きます。それ以外のURLではなにもしません。

Chromeのみで動作を確認しています。

使い方
===================

以下のソースをブックマークしてください。ニコニコ生放送の視聴ページでこのブックマークを開くと動作します。

```js
javascript:if((/http:\/\/live.nicovideo.jp\/watch\/lv/.exec(location.href))!=null){url=location.href.replace("watch","gate");window.open(url)}
```

Chromeならブックマークバーを右クリックして「ページを追加」を選んで「URL」に上のソースをペーストするとよいでしょう。タイトルは「ニコ生ゲートを開く」とか、まぁお好みで。

解説
===================

特になし。正規表現でマッチしたらURLのwatchをgateに置換してウィンドウを開くだけ。もうちょっと短く書けるかもね。 :-P
AppleScript で AirDrop ウインドウを起動する

いちいち Finder に戻って AirDrop ウインドウを開くのがたるいので、Automator や AppleScript 実行ファイルにして Dock から起動できるようにした。

既存の Finder ウインドウが使われるのが嫌なのとサイドバーが邪魔なので、新規ウインドウを作りつつサイドバーを自動で隠すようにした。

ただし、Finder が活性化するので Finder ウインドウがすべて最前面に来てしまうという問題がある。

```applescript:AppleScript
-- Finder を活性化し、⌘Nで新規ウインドウを実行
tell application "Finder" to activate
tell application "System Events"
	keystroke "n" using {command down}
end tell

-- Finder の最前面のウインドウのサイドバー幅を取得
tell application "Finder"
	set sideWidth to get sidebar width of Finder window 1
	
	-- もしサイドバー幅が0でなければ、⌥⌘Sでサイドバーを隠す
	if sideWidth is not 0 then
		tell application "System Events"
			keystroke "s" using {command down, option down}
		end tell
	end if
	
	-- ⇧⌘R で AirDrop を起動
	tell application "System Events"
		keystroke "r" using {command down, shift down}
	end tell
end tell
```

AirDrop の情報ウインドウからアイコンをコピーして、Automator で書き出した .app のアイコンに貼付けて Dock に追加。
![c1.png](https://qiita-image-store.s3.amazonaws.com/0/3603/a1b23b1c-1ef9-4add-dc56-ca00aefc5c31.png)
![c2.png](https://qiita-image-store.s3.amazonaws.com/0/3603/c6198e43-9fed-3881-843a-03d077c153f7.png)


---- 

AppleScript を書いたのは何年ぶりだろう……。
FacebookSDKを使ってMessageを送信する方法

FacebookのJavascriptSDKを使って、Message送信を実装する方法です。

```
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({
    appId  : 'appID',
    status : true, 
    cookie : true,
    xfbml  : true  
});

function sendMessage(){
      FB.ui(
      { 
          method: 'send', 
          to: '送りたい相手のID',
          link: "https://developers.facebook.com",
          picture: "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-snc4/174597_20531316728_2866555_q.jpg"
      }, 
      function(param){
        //callback
      }
      );
}
</script>
<input type="button" value="sendMessage" onclick="sendMessage();">
```
FBのダイアログが出て、メッセージの内容を打ちこんで送信することができます。
注意: mobileのデバイスでは使えないみたいです。WebViewで使いたかった。。。iOSのアプリからFBのMessage送れる方法あるんであれば教えてほしいですm(__)m

参照: https://developers.facebook.com/docs/reference/dialogs/send/
gitで登録したaliasコマンド一の覧や内容をイイ感じに確認できるようにしてみた

.gitconfigなどに登録したaliasを確認する方法をググってみたところ、

```bash
git config --list | grep ^alias\.
```

とか

```bash
git config --get-regexp ^alias\.
```

みたいなのがありましたが、これって.gitconfigに書いた内容を(ほぼ)そのまま表示するだけでなんかショボい感じがしたので、個人的にイイ感じに確認できるようなaliasを書いてみました。

長いですけど、.gitconfigにこんなaliasを登録してください。

```bash
[alias]
  alias = !"if test -z $1; then loop=; for k in `git config --get-regexp ^alias\\. | sort | sed -e 's/^alias\\.\\(\\S*\\).*/\\1/g'`; do echo -n $k; loop="${loop}1"; if test ${#loop} -lt 5; then echo -n '\t'; else echo; loop=; fi; done; exit; fi; git config --list | grep ^alias\\.$1= | sed -e s/^alias\\.//; exit;"
```

登録されているalias一覧を確認する場合は、引数なしで`git alias`と打ちます。

すると、

```bash
$ git alias
alias   back    br      ci      ciom
cm      cmfix   co      coclean df
dfd     dfdc    dfdp    dff     dfw
dump    hist    l24     lall    lg
lga     ll      lp      ls      ltd
rbr     resh    ress    rl      st
sync    tagdel  type    update  update2
```

こんな感じでイイ感じの一覧表示になりました。

で、この中の特定のaliasのコマンド内容を確認する場合は、`git alias`の後にaliasコマンド名を入れてください。

```bash
$ git alias ll
ll=log --decorate --oneline
```

というように登録内容が表示されます。

※ なお、動作確認したのはWindows7のmsysgitと、ubuntuのbashという環境だけなので、Macやらzshやらで動くかどうかは分かりません。

というか、そもそも「それ、git標準の機能でアルヨ！」とかそんな突っ込みがあったらやさしく慰めてください(1時間半かけて作ったので)。
Firefoxで使える2つのyieldの挙動の違いについて


最近ES6のことをちょっと勉強していて気づいたことをメモ

ES6から`yield`が導入されるらしく非同期の処理などが楽になるのではないかと期待しているのですが、
最近`firefox`でyieldを試していると、挙動が違う2つの`yield`があることに気づきました。

*Firefox 27で試しています。

ES6から導入された`yield`は返り値として`done`と`result`の2つの値ををもつオブジェクトを返します。

```javascript
funciton * gen(){
	yield 1;
	yield 2;
}

g = gen();

g.next();  // {done: false, result: 1}

g,next(); // {done: false, result: 2}

g.next(); // {done: true, result: undefined} つぎのyieldがないとdone: trueになる
```


しかし、Firefoxは実はJavaScript1.7(2006年!)から`yield`が使えたらしく

```javascript
funciton gen(){
	yield 1;
	yield 2;
}

g = gen();

g.next();  // 1

g,next(); // 1

g.next(); // Exception: [object StopIteration]
```

こちらは `function * `ではなく`function`で宣言すれば使える。

違いとしては
- 次に実行する`yield`がなくなると例外が発生する
- 返り値は値が返ってくるだけ


個人的にはES6のほうが好みなので改善?してよかったなぁと
Canvasを画像に変えたい

## 少し書きます

囲碁を実装する際に、碁盤や碁石の画像を作る必要がありました。それについて少し書きたいと思います。

まず、[Saving canvas data to image file](http://www.nihilogic.dk/labs/canvas2image/)を読みました。ここに期待できそうな記事がありましたが、碁盤や碁石の画像を用意することはむずかしそうでした。直線を手で引くことがむずかしかったからです。（英語だったので理解できていなかったかもしれません。。。）

しかし、「Canvasを画像に変えることはできる」ということがわかりました。

次に、[HTML5のCanvasで作る、Flash不要のお絵かきツール](http://ascii.jp/elem/000/000/513/513377/index-5.html)を読みました。このサイトにはサンプルコードがあります。このサンプルコードを少し変更して自分の作りたい画像を作りました。作ったものは[create-picture](https://github.com/t-mochizuki/create-picture)にあります。

## これから

形の違う画像を集めて、一枚の画像のように見せることを実装できないかと考えています。クリックして画像を変えてもよいと思いますが、どこかの画像をクリックすると、そのクリックをきっかけに一枚の画像のように見えていた画像全体が動き始めるというのもおもしろそうです。
色んな表記ゆれを無視して比較する (String拡張)

```rb
# [Example]
#   "one two three 4 5 ".eql? "ONE ＴＷＯ ｔｈｒｅｅ ４ 五 　\t"
#      # => false
#   "one two three 4 5 ".neql? "ONE ＴＷＯ ｔｈｒｅｅ ４ 五 　\t"
#      # => true
#   "ONE ＴＷＯ ｔｈｒｅｅ ４ 五 　\t".flattening
#      # => "ONE TWO THREE 4 5 "

# Mojiモジュールが必要。作成者である「Gimite 市川」様に感謝！
# (公式HP) http://gimite.net/gimite/rubymess/moji.html
require "moji"
# ZenToIモジュールが必要。作成者である「yoshitsugu」様に感謝！
# (公式HP)  https://github.com/yoshitsugu/zen_to_i
require "zen_to_i"

class String

  # 表記ゆれを無視した上で、文字列の比較を行う
  def nearly_equal?(other_str)
    self.flattening == other_str.flattening
  end
  alias_method :neql?, :nearly_equal?

  # 表記ゆれをなくした文字列を返す
  def flattening
    target = self
    # 全角大文字英字, 全角小文字英字, 半角小文字英字 -> 半角大文字英字
    # 全角数字 -> 半角数字
    target = Moji.zen_to_han(target, Moji::ZEN_ALNUM).upcase
    # 半角カタカナ -> 全角カタカナ
    target = Moji.han_to_zen(target, Moji::HAN_KATA)
    # 全角スペース,タブ -> 半角スペース
    target.gsub!(/[\s　]+/, ' ')
    # 漢数字 -> 半角数字
    target.zen_to_i
  end

  # 表記ゆれをなくし(破壊的変更)、かつ、文字列を返す
  def flattening!
    self.replace(self.flattening)
  end
end
```
GitHubでいつYour Contributionに反映されるのか

GitHubのユーザページには「Your Contribution」という項目が存在しています。
ここを見ればそのユーザがどのくらいGitHubで活動しているのかの概要を一目で知ることができます。

私もここをかなり参考にしていたのですが、自分で作業をしていた時にYour Contributionに反映されていないことがあり気になったので調べてみました。

調べたところGitHub公式で説明されていましたので、この記事ではその内容を日本語訳したいと思います。

公式ドキュメント→[Why are my contributions not showing up on my profile?](https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile)

続きは[ブログで書いてます](http://tech-tec.com/archives/1011)のでそちらへお越しください。
@2xのretina画像から一括で、non retina画像を作成するRuby Script

アプリ開発中にRetina画像だけ用意して、Non Retina画像をさぼって用意していない場合に実行すると一括でNon Retina画像を生成します。

```ruby:non-retina.rb
#/bin/ruby

require 'rubygems'
require 'RMagick'

PATH = "Resource"

def findRetinaImage( directory )
    Dir.foreach( directory ){ | child |
        if( child != "." && child != ".." )
            child = directory + "/" + child
            if( FileTest::directory?( child ) )
                findRetinaImage( child )
            else
                if( child.end_with?("@2x.png") )
                    generate_file = child.sub("@2x" , "" );
                    if( FileTest::exists?( generate_file ) == false )
                        image = Magick::Image.read(child).first
                        image.resize!(0.5);
                        image.write( generate_file );
                        puts generate_file
                    end
                end
            end
        end
    }
    
end

findRetinaImage( PATH );
```
Play! framework のフォームを正規表現でバリデーションする

Play! framework には、クエリ文字列などフォームの入力を処理するための仕組みがありますが、正規表現でチェックが可能です。公式ドキュメントに載ってなかったのでここで紹介します。

``` scala
package controllers

import play.api._
import play.api.mvc._

import play.api.data._
import play.api.data.Forms._
import play.api.data.validation._

case class Hoge(hoge: String, fuga: Option[String])

object Application extends Controller {

  def index = Action { implicit request =>
    val form = Form(
      mapping(
        "hoge" -> text.verifying(Constraints.pattern("[a-z]+".r)),
        "fuga" -> optional(text.verifying(Constraints.pattern("(HOGE|FUGA|PIYO)".r)))
      )(Hoge.apply)(Hoge.unapply))
    form.bindFromRequest.fold(
      formWithErrors => BadRequest("error"),
      hoge => Ok(hoge.toString)
    )
  }
}
```

text.verifying に、Constraints.pattern(正規表現) を指定すると正規表現で verify してくれます。オプショナルな場合でも、optional(text.verifying...) と記述することで、省略可能な形でチェックしてくれます。

ちなみにユニットテストとしては以下のような感じになります。

``` scala
package controllers

import org.specs2._
import specification._

import play.api.test._
import play.api.test.Helpers._

class ApplicationSpec extends script.Specification with Grouped {
  def is = s2"""
  + 正しいクエリ文字列を渡した場合、Ok になる
  + 間違ったクエリ文字列を渡した場合、BadRequest になる
  + オプションにも対応
"""

  "" - new group {
    eg := status(Application.index()(FakeRequest(GET, "/?hoge=abc"))) == OK
    eg := status(Application.index()(FakeRequest(GET, "/?hoge=ABC"))) == BAD_REQUEST
    eg := contentAsString(Application.index()(FakeRequest(GET, "/?hoge=abc&fuga=HOGE"))) == "Hoge(abc,Some(HOGE))"
  }
}

```
vagrantのbox addで引っかかった


ふとvagrantをさわってみようとしたら、最初の最初でつまづいたのでメモ。

ローカルのファイルでもリモートのファイルでも、vagrant box add をしようとすると以下の様なメッセージが出てうまくいかなかった。

```
Downloading or copying the box...
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

Failed writing body (0 != 16383)
```

色々調べたりしたんだけど、結局のところ ~/.vagrant か ~/.vagrant.d 以下のディレクトリがrootの権限のまんまだったのが原因っぽい。

面倒なので両方のフォルダとその中身を全部自分の権限に変更しといた。

適当でごめんね。
正常系・異常系

# 正常系
正しい(想定している？)操作。正常系のテストと言った場合は想定通りの手順で動かして想定通りのアウトプットなり状態になるかなりをチェックする

# 異常系
エラーが出る操作。異常系のテストは不正な入力を検出したり、入力が正しくても何かしらの理由で途中でコケた場合に正しくエラーを吐くなりの動作が行なわれるかをチェックする
Mac で SourceColon を使う

# 準備: Java のインストール

OS の標準は Java SE 6。SourceColon は Java SE 7。

JDK インストーラを使うとデフォルトの java のバージョンが変わって気持ち悪いので、手動でインストールする。

http://www.oracle.com/technetwork/java/javase/downloads/index.html
から jdk-7uXX-macosx-x64.dmg をダウンロードし、マウントする。

パッケージからファイルを抽出する:

```zsh
% pkgutil --expand /Volumes/JDK\ 7\ Update\ XX/JDK\ 7\ Update\ XX.pkg /tmp/0
% ditto -x --bom /tmp/0/jdk170XX.pkg/Bom /tmp/0/jdk170XX.pkg/Payload /tmp/1
```

適当なところにコピー:

```zsh
% cp -ir /tmp/1/Contents ~/.jdk
```

# 準備: excuberant ctags のインストール

```zsh
% brew install ctags
% PATH=/usr/local/bin:$PATH  # brew でインストールした ctags を使用する
```

# SourceColon を使う

```
% cd /opt
% git clone https://github.com/watermint/SourceColon.git
% cd SourceColon
% JAVA_HOME=$HOME/.jdk/Home ./gradlew -Ptarget=/path/to/source
```

`Started SelectChannelConnector@0.0.0.0:8080` と出力されれば成功。
http://localhost:8080/ を開く。

# トラブルシュート: UnknownHostException で止まる
`ping $(hostname)` で失敗するなら、自分のホスト名の解決ができていないので、/etc/hosts へ追加
Mavericksにアップデートしたら、Genymotionが起動しなくなったときの対処法

Mountain LionからMavericksにアップデートしたら「Unable to load VirtualBox engine.」
というエラーメッセージが出てしまい、Genymotionが起動しなくなりました。

そんな時はみんな大好きな黒い画面を出して以下の呪文を唱えるだけで直ります。

```
$ sudo /Library/StartupItems/VirtualBox/VirtualBox restart
Unloading VBoxUSB.kext
Unloading VBoxDrv.kext
/Applications/VirtualBox.app/Contents/MacOS/VBoxAutostart => /Applications/VirtualBox.app/Contents/MacOS/VBoxAutostart-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxBalloonCtrl => /Applications/VirtualBox.app/Contents/MacOS/VBoxBalloonCtrl-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxDD2GC.gc => /Applications/VirtualBox.app/Contents/MacOS/VBoxDD2GC.gc-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxDDGC.gc => /Applications/VirtualBox.app/Contents/MacOS/VBoxDDGC.gc-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxExtPackHelperApp => /Applications/VirtualBox.app/Contents/MacOS/VBoxExtPackHelperApp-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxHeadless => /Applications/VirtualBox.app/Contents/MacOS/VBoxHeadless-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxManage => /Applications/VirtualBox.app/Contents/MacOS/VBoxManage-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxNetAdpCtl => /Applications/VirtualBox.app/Contents/MacOS/VBoxNetAdpCtl-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxNetDHCP => /Applications/VirtualBox.app/Contents/MacOS/VBoxNetDHCP-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxSVC => /Applications/VirtualBox.app/Contents/MacOS/VBoxSVC-amd64
/Applications/VirtualBox.app/Contents/MacOS/VBoxXPCOMIPCD => /Applications/VirtualBox.app/Contents/MacOS/VBoxXPCOMIPCD-amd64
/Applications/VirtualBox.app/Contents/MacOS/VMMGC.gc => /Applications/VirtualBox.app/Contents/MacOS/VMMGC.gc-amd64
/Applications/VirtualBox.app/Contents/MacOS/VirtualBox => /Applications/VirtualBox.app/Contents/MacOS/VirtualBox-amd64
/Applications/VirtualBox.app/Contents/MacOS/VirtualBoxVM => /Applications/VirtualBox.app/Contents/MacOS/VirtualBoxVM-amd64
/Applications/VirtualBox.app/Contents/MacOS/vboxwebsrv => /Applications/VirtualBox.app/Contents/MacOS/vboxwebsrv-amd64
Loading VBoxDrv.kext
Loading VBoxUSB.kext
Loading VBoxNetFlt.kext
Loading VBoxNetAdp.kext
```

あとは通常通りGenymotionを起動してあげれば動くかと思います。
メタプログラミングRubyメモ


##Object#extend

```ruby
module MyModule
  def my_method; 'hello'; end
end
```
を使いたいときに

```ruby
class MyClass
  class << self
    include MyModule
    ….
  end
end
```
↓

```ruby
class MyClass
  extend MyModule
  ….
end
```

これでもMyClassの特異メソッドとしてmy_methodを呼べる。
( MyClass.my_method #=> 'hello' )
　


## falseの時なにか決まったものを返すとき、三項演算子じゃなくていいよ！的な
```ruby
class MyClass
  def initialize
    @hoge = false
  end

  def hoge?
    @hoge || false
  end
end

irb(main):009:0> MyClass.new
=> #<MyClass:0x007ff499890fe0 @hoge=false>

irb(main):010:0> a = MyClass.new
=> #<MyClass:0x007ff49987a8d0 @hoge=false>

irb(main):011:0> a.hoge?
=> false
```

って感じでいける。or演算子やから当たり前やけど、こう書けてなかったな、、っていう自分のレベルの低さを感じたのでメモ
　

## alias :m(新しいメソッド名) :my_method（古いメソッド名）

★アラウンドエイリアス

```ruby
module Kernel
  alias gem_original_require require
  
  def require(path)
    gem_original_require path
  rescue LoadError => load_error
    if load_error.message =~ /#{Regexp.escape path}\z/ and
        spec = Gem.searcher.find(path)  then
      Gem.activate(spec.name, "= #{spec.version}")
      gem_original_require path
    else
      raise load_error
    end
  end

end
```

エイリアスは元のメソッドを変更するのではなく、新しいメソッドを定義して元のメソッドの名前をつける。
なので元のものをラップして新しいのに飛ばすようなことができてアラウンドエイリアスと呼ぶ。
　

## クラスマクロ

クラスマクロはクラス定義の中で使えるクラスメソッド

```ruby
class Book
  def self.deprecate(old_method, new_method)
    ..
  end

  deprecate :GetTitle, :title
end 
```

attr_accessorとかがそう。

```ruby
module CheckedAttributes
  
  def self.included(base)
    base.extend ClassMethods # baseにはincludeしたクラスが入ってくるのでそれにたいしてClassMethodsを渡してる。
                                            # こうすることで渡ってきたクラスのクラスメソッドにClassMethodsを設定できる   
  end

  module ClassMethods
    def attr_checked(attribute, &validation)
      define_method "#{attribute}=" do |value|
        raise 'Invalid attribute' unless validation.call(value)
        instance_variable_set("@#{attribute}", value)
      end
      
      define_method attribute do
        instance_variable_get "@#{attribute}"
      end
    end
  end

end
```
　
これで

```ruby
class Person
  include CheckedAttributes

  attr_checked :age do |v|
    v >= 18
  end
end
```

とかできるようになるわけ。
EC2でknife-soloを使う際にKeyPairを設定ファイルで指定する方法


knife-soloでcookbookをリモートホストに実行する際に、毎回 -i オプションでKeyPairファイルを指定するのがめんどくさかったので設定ファイルに記述する方法を調べた。

##  knife の設定ファイルを作成

knife configre コマンドでknifeの設定ファイルを作成する。

```
$ knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/home/user_name/.chef/knife.rb]
Please enter the chef server URL: [https://your_hostname:443]
Please enter an existing username or clientname for the API: [user_name]
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem]
Please enter the path to a chef repository (or leave blank):
```

## knife の設定ファイルにKeyPairの設定を記述する

設定の方法は公式サイト([knife ssh — Chef Docs]( http://docs.opscode.com/knife_ssh.html))に書いてあった

公式サイトによるとknife confireを実行した際に作成したknife.rbに対して以下のようにknife[:identity_file]の記述をする。

```/home/user_name/.chef/knife.rb
...
knife[:identity_file] = 'IDENTITY_FILE_PATH'
...
```

## knife soloの実行
設定が終わったので実行してみる。
設定前と設定後を一応並べてみる。

* knife[:identity_file]の設定前

```
$ knife solo cook -i IDENTITY_FILE_PATH remote_hostname
```

* knife[:identity_file]の設定後

```
$ knife solo cook remote_hostname
```

これで毎回 -iでIDENTITY_FILE_PATHを指定しなくて済むようになった。
TimeMachineのお供に、低速HDDとUSB給電ケースは如何？


これまで [このHDD](http://www.iodata.jp/product/hdd/hdd/hdc-eun/) にTimeMachineのバックアップをしていました。このHDDも静穏で高速（らしい）のですが、自分の使い方では少し欠点がありました。

* HDDが回ってるときは静かで良いのですが、省電力モードで止まるとき/使って動き出すときに、モータの回りだす、わずかな「ちきちき」っと音がします。
* 外部電源が必要なので、コンセント１つ使います＝ケーブル１本増えます

で、最近 [Logitec HDDケース 2.5型SATA用 HDD/SSDケース LHR-PBGU2](http://www.amazon.co.jp/gp/product/B004D67YH4/ref=oh_details_o05_s00_i01?ie=UTF8&psc=1)を買いました。これUSBからの給電のみで動いて、電力足らないときにはもう1口のUSBからの給電ができるすぐれものです。これに[東芝 TOSHIBA 2.5インチHDD(SerialATA)/容量:1TB/回転数:5400rpm/キャッシュ:8MB MQ01ABD100](http://www.amazon.co.jp/gp/product/B007XBU69O/ref=oh_details_o03_s00_i00?ie=UTF8&psc=1)を入れてMacMiniにUSB接続してTimeMachineつかってます。

速度は出てないはずですが、TimeMachineでのバックアップなら十分です。なにより低速HDDが「つねに回ってる」状態、省電力とか気の利いたことはしないので、静かですし、電源ケーブルも１本減らすことができました。

ケースの黒がちょっと浮いちゃってますけどね。
OS X Marvericks + OS X Server 3.0 + Redmine

インストールに必要な作業はredmineの以下にあるのでそれ以外で設定したこと
[Installing Redmine on OS X 10.9 Mavericks Server](http://www.redmine.org/projects/redmine/wiki/RedmineInstallOSXMavericksServer)

# OS X の Apacheの設定
redmineの説明では以下の2ファイル
/Library/Server/Web/Config/apache2/httpd_server_app.conf
/private/etc/httpd.conf
を修正としているがOS X Serverがupdateされるとhttpd_server_app.confがもとに戻される？ようなので以下がいいと思う

```apache:/Library/Server/Web/Config/apache2/other/httpd_passenger.conf
   LoadModule passenger_module /Library/Ruby/Gems/2.0.0/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
   PassengerRoot /Library/Ruby/Gems/2.0.0/gems/passenger-4.0.23
   PassengerDefaultRuby /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby

   PassengerDefaultUser _www
   RackBaseURI /rack
   RackBaseURI /redmine
```

# database.ymlの記載
MySQLは5.6.14を入れていました。
adapterをmysql2にしないとエラーがでる部分がありました。

```:database.yml
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: MYPASSWORD
  socket: /tmp/mysql.sock
```
JavaScript、森でClojureに出会う


[Mori](http://swannodette.github.io/mori/)というライブラリを見つけた。

どうやら、[Clojure](http://clojure.org/)の[永続データ構造](http://ja.wikipedia.org/wiki/%E6%B0%B8%E7%B6%9A%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0) (persistent data structure)をJavaScript環境に提供するモノらしい。ライブラリ自体はClojureScriptで書かれていて、それがJavaScriptやCoffeeScriptから使えるようになっている。

永続データ構造は「不変オブジェクト(immutable object)」とも呼ばれるが、要は作成後に値が変更できないデータ。C++のconst指定された変数やJavaのString Classのインスタンスがそれに当たる。Clojureでは基本的にデータはimmutableで、オブジェクトに操作が加わる度に新しいオブジェクトができる。

「それって非効率！」って思うがそれ相当の利点もある。例えば、JavaScriptで以下の操作を考える。

```
var a = [1,2,3];
var b = a;
b.push(4);
console.log(b); // --> [1,2,3,4]  (bに4が追加された)
console.log(a); // --> [1,2,3,4]  (aも変わっちゃった！)
```

aとbは同じオブジェクトを参照しているので当たり前の結果だが、こういった参照コピーを繰り返すと思わぬところでの変更が他に波及したりする。まぁ、それが起きないように設計するのが筋なのだが、bだけに変更を加えるにはコピーしてから使うか、Array.concat()の様に元のデータに影響を与えないメソッドを使うしかない。

で、Clojureが取っているのは後者のアプローチ。つまりデータを直接いじるメソッドは無い。代わりにデータを受け取り、変更して返す関数を色々と取り揃えている。

効率に関しても、元データがimmutableであることが保証されるとコピーの際も元のデータを参照した上で変更分だけ記録なんてことができるのでそれほどおかしな事にはならない。

そしてMoriはそれをJavascriptの世界に持ってきた。

以下はnode.jsで使う場合だが、まずインストールはいつもの様にnpmで。

```
$ npm install mori
```

そして上記の例はこうなる。

```
var mori = require("mori");

var a = mori.vector(1,2,3);
var b = mori.conj(a, 4);
console.log(b); // --> [1,2,3,4] (bに4が追加された)
console.log(a); // --> [1,2,3] (aの値は不変)
```

さらにfunctional programming 風にこんなことも。

```
var mori = require("mori");

var inc = function(n) {
  return n+1;
};
var sum = function(a, b) {
  return a + b;
};

var a = mori.list(1,2,3,4,5);
var b = mori.map(inc, a);
var c = mori.reduce(sum, b);

console.log(a); // --> (1 2 3 4 5) (もちろんaの値は不変)
console.log(b); // --> (2 3 4 5 6) (それぞれの値に1が足されている)
console.log(c); // --> 20 (bの値の総和)
```

当然CoffeeScriptでも使えて、上記例を思いっきり短くするとこうなる。

```
mori = require "mori"

inc = (n)-> n+1
sum = (a, b)-> a+b

c = mori.reduce sum, mori.map inc, mori.list 1,2,3,4,5
console.log c # --> 20
```

さすがにここまでカッコを省略すると判りにくいか ...
Yokohama.rb #38 メモ

Yokohama.rb で話題になったことと、別に話題にはなってないけど勝手にやってたこと。

# inject に :+

```ruby
[1,2,3].inject(:+) => 6
```

inject だけは &:+  ではなく :+ でよいらしい。

# each_with_index と each.with_index

```ruby
%w( a b c ).each_with_index(2).to_a #=> ArgumentError
%w( a b c ).each.with_index(2).to_a #=> [["a", 2], ["b", 3], ["c", 4]]
```

each_with_index には初期値が入れられないけど、with_index には初期値を入れられる。

# Ratinalの発音
「ラショナル」のような感じ。「レイショナル」だと思ってた。とほほ。

# remainder

```ruby
10.remainder( -3 ) # => 1
(-10).remainder( -3 ) # => -1
(-10).remainder( 3 ) # => -1
(-10) % 3 #=> 2
```

常に正の剰余を返すのが便利なので、普通は `remainder` ではなく `%` を使えばいいのか。

# quo

```ruby
10.quo 2 #=> (5/1)
10.0.quo 2 # => 5.0
Complex(12,3.4).quo(56) # => ((3/14)+0.060714285714285714i)
```

Float の quo が役に立つ場面が思いつかない。
Complex については、まあそうするしかないと思うけど、役に立つ場面が思いつかない。

# 単項マイナス演算子

```ruby
x=2
-x.abs #=> -2 ( - は単項演算子 )
-2.abs #=> 2 ( - はリテラルの一部 )
- 2.abs #=> -2 ( マイナスのあとに空白があると、単項演算子 )
-0x2.abs #=> 2 ( 16進数リテラルでも - はリテラルの一部 )
```

`-x.abs` は `-(x.abs)` だけど、 `-2.abs` は `(-2).abs` になるという罠。

# Symbol にも succ

```ruby
:a.succ # => :b
:x.succ # => :y
:z.succ # => :aa
```

役に立つ場面はあまりないと思う。
Mac OS Xで複数バージョンのPythonを利用する（２）利用編

前回
[Mac OS Xで複数バージョンのPythonを利用する（１）複数Verインストール編](http://qiita.com/redtree/items/3927e042b2ca18f03b8c)
はhomebrewを使って, バージョンごとにPythonをインストールする手法を記載しました。

ではそれらを具体的に使ってPythonの実行環境を作るところまでをやっていきます。

## 前提
開発のスタイルには色々あると思うんですが, Pythonに関しては「グローバル環境は使わず, virtualenvを使ってプロジェクトごとに固有の環境を構築して利用する」が現状では楽なんじゃないかと思っています。

＃Python3.3から公式で個別の環境構築が可能になってきているので, いずれそちらに移行していくかもしれません。

## virtualenvとは？
virtualenvとは独立したPythonの実行環境を, グローバルのものとは別にいくつも構築することのできるツールです。
Pythonのバージョンのみならず各種必要なライブラリ等もこの環境ごとに別にできるので, プロジェクト毎にvirtualenvで作った環境を個別に用意し, 商用でのデプロイまで含めてvirtualenv下の環境でプログラムを動作させることが多いのではないでしょうか。

virtualenvは、自身のインストール環境とは別にPythonのインタプリタを指定できます。要するに「Python2.7環境にインストールしたvirtualenvでPython3の仮想環境を作る」といったようなことが可能なのでPython2, 3系両方にvirtualenvを入れる必要はありません。

今回もvirtualenvは2.7の方にだけ入れて以降の作業を行います。

## virtualenvのインストール

```
[~] pip install virtualenv
```
この一行で, 終わりです。
pip はpythonのライブラリ管理ツールです。python2.7の環境下にvirtualenvがはいりました。

## 固有の環境を作ってみる
インストールできたら, 以下のコマンドで新しい環境を作ることができます。

```
[~] virtualenv --python=/usr/local/bin/python3 testenv
```
--pythonのオプションで使用したいPythonインタプリタのPathを指定（今回は前回homebrewからインストールしたPython3.3）しています。

testenvは今回作る固有の環境の名前です。

このコマンドを実行すると, 実行したディレクトリの直下にtestenvというフォルダができていて, その中に独立したPythonの実行環境が詰まっています。

## 環境を切り替える

```
[~] source testenv/bin/activate
(testenv)[~] 　←testenv環境に入った
(testenv)[~] python --version
Python 3.3.2


(testenv)[~] deactivate
[~] 　←testenv環境を抜けてグローバル環境に戻った
```

これもたった一行です。
(仮想環境名)/bin配下にあるactivateを実行するだけで今回作ったtestenv環境に入ることができます。今居る環境がカッコで表示されるのでわかりやすいですね。

Pythonのバージョンが, --pythonで指定したインタプリタのものになっていることに注目してください。抜けるときにはdeactivateでいけます。

以上です！

現状特定のプロジェクトが無い、Pythonで色々遊びたいだけなんだけど…って人は, とりあえず

* Python2.x系 → sandbox2
* Python3.x系 → sandbox3

とでも環境名をつけて、その中に色々ライブラリをインストールすれば良いかと思います。ライブラリのインストールは

```
pip install (ライブラリ名)
```
で。

```
sudo pip install (ライブラリ名)
```
だとせっかく固有に環境切ったのにグローバルに入っちゃうので, 注意してください。


＃おまけ
virtualenvwrapperとかってvirtualenvを管理できるラッパーもあって, workonコマンド一発で

* 環境の一覧出力
* 各環境への切り替え

が可能だったりします。<del>環境はまとめてどこかのディレクトリに作るようにすればそこまで煩雑にはならないし, 十分シンプルだと思うので自分は使ってませんが, 興味のある方は検索してみてください。</del>
前言撤回です(^^;ゞ
便利なので、興味のある方は[こちらの記事](http://qiita.com/_rdtr/items/5f3a9a9e2cb5a24f284e)の方にインストール方法と使い方をまとめたので見てみてください。
TitaniumにおけるWindow間のデータの受け渡し


Window間のデータの受け渡しには以下の二つの方法がある

* 参照渡し
* イベント

# 参照渡し

生成したウインドウのプロパティー(myAlertMessage)にメッセージ変数の参照を保存

``` javascript:app.js
var message = "Hi world!";
var w = Titanium.UI.createWindow({ url: "foo.js" });
w.myAlertMessage = message;
```

currentWindowを経由して、設定されたmyAlertMessageを参照できる

```javascript:foo.js
alert(Titanium.UI.currentWindow.myAlertMessage);
```

# イベント

データを受け取りたいWindow上でカスタムイベント(下の例ではfooというイベント)に対するイベントハンドラを定義

``` javascript:bar.js
Titanium.UI.currentWindow.addEventListener('foo',function(e)
{
  Titanium.API.info("foo event received = "+JSON.stringify(e));
});
```

データを送信する側からfireEvent()でイベントを発火し、別Windowにイベントハンドラに経由でデータ(イベントハンドラの引数として)を渡すことができる

``` javascript:app.js
var window = Titanium.UI.createWindow({
  url:'bar.js'
});
window.open();
window.fireEvent('foo',{a:'b'});
```

# Reference

Titanium.UI.Window
http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.Window
[メモ]ScalaでコンパイルしたクラスファイルをJavaのコードがから呼び出す

Scalaでコンパイルしたクラスファイルを、Javaのコードが呼ぶためのテスト

##### Scalaでコンパイル
以下のようなファイルをテスト用に用意して、コンパイル。

```scala
 object HelloWorld {
  def test() = {
    "This is the test."
  }
}
```

Helloworld.class含むクラスファイルが出力される。

##### Javaのファイルを用意

```java
public class ScalaTest {
	public static void main(String... args){
		System.out.println( HelloWorld.test());
	}
}
```

先ほど作成したクラスファイルと、scala-library.jarを環境変数CLASSPATHに含めて、コンパイル、実行すればOK

```shell-session
 $ javac  ScalaTest.java
 $ java   ScalaTest
this is the test
```

以上
Window と Context と Threadと


TitaniumにおけるWindow, Context, Threadについて調べた事を書き出してみました。
大いに間違ってる可能性があるので、ご注意ください。

# Window

* Window毎にjavascript contextとthreadを分けられる
* UI処理はmain thread で、その他の処理はwindowまたはapp.jsで処理されている
* Windowが破棄される際に、対象となるWindowで確保されたリソースは破棄される
* app.js上で確保されたリソースはアプリ終了まで解放されないので注意
* Windowを分け、urlプロパティを用いる事で別のJavascriptファイルに処理を分割することができる

# ContextとThread

* Titanium は マルチスレッドで動作する
* UIのレンダリングの処理は１つのUIスレッド(又はメインスレッド)が処理する
* Titanium におけるContext は１つのネイティブスレッド(メインUIスレッドではない)を意味する
* UIに関連しない処理は"Context"上で実行される


# Reference
As a Titanium developer, I want to understand how threading works in Titanium
https://jira.appcelerator.org/browse/TIDOC-653

Titanium.UI.Window
http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.Window
Mac OS Xで複数バージョンのPythonを利用する（１）複数Verインストール編

Pythonインストールネタ。
Mac OS X MavericksでPythonの環境を入れなおしたのでまとめておきます。

##インストール方法について
pyenvとかpythonzとか, 複数バージョンのPythonを入れるためのツールが出ているわけですが, Pythonの2大潮流である2.7x系, 3.x系が使えれば良いって時にはみんな大好きHomebrewでいいんじゃないかと思ってます。

```
brew install python
brew install python3
```

これでpython2.x系, 3.x系の最新がそれぞれインストールされます。
うまくインストールされているかどうかはwhich pythonで確認できます。

```
[~] which python3                                            
/usr/local/bin/python3　← homebrewで入れたPath

[~] which python
/usr/bin/python　←なんか違う
```
どちらもうまくいく人もいれば, 上記のようになる人も居ると思います。この場合はpythonがhomebrewでインストールした2.xではなく, Macにデフォルトでインストールされている方を指してしまっていますね。

原因はPATHの設定で usr/binがusr/local/binより先に記述されていて優先されてしまっていることです。

```
[~] vim /etc/paths

/usr/local/bin ←/usr/binより上に記述
/usr/bin
/bin
/usr/sbin
/sbin
：
```

PATHを直接修正して, ター~ミナルを起動しましょう。

```
[~] which python
/usr/local/bin/python
```

これでpython2.x系もhomebrew経由でインストールしたものを使っていることがわかります。

このPythonをもとに、次回
[Mac OS Xで複数バージョンのPythonを利用する（２）利用編](http://qiita.com/redtree/items/22d99c6164af18c7e791 "利用編")
では実際に開発に使う環境を, virtualenvを用いて作っていきます。
【fluentd初心者】td-agentでつまずいた

本来なら複数のサーバにたまっているログをtd-agentなどで管理し、fluentdで一カ所にまとめていい感じだよねっていうのが、最近のオシャレなログ管理らしい。

[統合ログ管理基盤としてのFluentdを試してみました。](http://tech.aainc.co.jp/archives/1981)

一回のぽんこつアプリエンジニアの僕には何の事だかさっぱりだが、
最近仕事でここら辺いじる機会があったので検証がてら以下を元に導入してみた。
[さくらサーバーのVPS環境にfluentdとMongoDBをインストール](http://netdiever.com/archives/12241)

しかし一向にログが出ない、何度 $ ls /var/log/fluent と叩いてもログファイルが出てこない
行った何がいけないのだろうかと悩みに悩んだところ、原因は以下だった。

#td-agentが起動偽装してる！！
Linuxなんて全然詳しくなくて、apacheの起動にもいちいちコマンド調べている僕には何が起きてるかわからなかったがとりあえず現象は以下。


```bash:td-agentの起動
$ /etc/init.d/td-agent start
Starting td-agent:                                         [  OK  ]
```
参考URLを元にtd-agentを導入しプラグインを入れ、ログが出るか試してみたが一向にでない。
しかし・・・

```bash:td-agentの再起動
$ /etc/init.d/td-agent restart
Shutting down td-agent:                                    [失敗]
Starting td-agent:                                         [  OK  ]
```

```bash:td-agentの確認
$ /etc/init.d/td-agent status
td-agent が停止していますが pid ファイルが残っています
```

再起同時にはシャットダウンが失敗してるけど、起動はできてる？あれ？ということはそもそも起動してなくね？ってことでtd-agentのログを見る事に

```bash:td-agentのログ
$ /var/log/td-agent/td-agent.log
~ 省略 ~
013-11-16 14:21:22 +0900 [info]: adding source type="forward"
2013-11-16 14:21:22 +0900 [info]: adding source type="http"
2013-11-16 14:21:22 +0900 [info]: adding source type="debug_agent"
2013-11-16 14:21:22 +0900 [info]: adding source type="tail"
2013-11-16 14:21:22 +0900 [warn]: 'pos_file PATH' parameter is not set to a 'tail' source.
2013-11-16 14:21:22 +0900 [warn]: this parameter is highly recommended to save the position to resume tailing.
2013-11-16 14:21:22 +0900 [info]: adding match pattern="td.*.*" type="tdlog"
2013-11-16 14:21:22 +0900 [info]: adding match pattern="debug.**" type="stdout"
2013-11-16 14:21:22 +0900 [info]: adding match pattern="mongo.**" type="mongo"
2013-11-16 14:21:22 +0900 [info]: adding match pattern="apache.access" type="file"
2013-11-16 14:21:22 +0900 [error]: unexpected error error_class=Mongo::ConnectionFailure error=#<Mongo::ConnectionFailure: Expected response 1 but got 1852141647>
  2013-11-16 14:21:22 +0900 [error]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/mongo-1.8.6/lib/mongo/networking.rb:167:in `receive_header'
~ 省略 ~
```

なんかエラー出てた。教えてくれよtd-agentちゃん・・・
ということで改めてFluentdを入れて、td-agent.confを以下のように変更

```bash:td-agent.conf
<source>
  type tail
  format apache
  pos_file /var/lib/fluent/access.pos
  path /var/log/httpd/access_log
  tag mongo.apache
</source>

<match mongo.**>
  type mongo

  database apache
  collection access

  host localhost
  port 27017

  flush_interval 10s
</match>
```

  pos_file /var/lib/fluent/access.pos
というのがあるがこれはtd-agent側で用意してくれない一時ファイルなので自分で作って
chmod 777 あたりでいじれるようにする。これで出来た。

なのでtd-agentが動いたように見せかけてくる時は、statusで起動してるのか確認して
td-agent.logを見て、fluentを入れて起動するか確認して、td-agent.confを書き直して、
td-agent.confで使うファイル・ディレクトリの権限が正しいか確認するといい

現象としてはけっこうあるらしく以下でも紹介されている。
[【CentOS】Fluentd (td-agent) で 「td-agent が停止していますが pid ファイルが残っています」のエラー](http://d.hatena.ne.jp/pospome/20131019/1382165509)
こっちはポートが使われている的な話。
複数音声を持つmp4をffmpegで作る、もといmapオプションの説明

いつも忘れるのでffmpeg で多言語とかのマルチトラックの作る方法と、その時に必要な map オプションの使い方の説明。

## まずやり方
video.mp4(ビデオのみ)
audio-ja.m4a(音声のみ)
audio-en.m4a(音声のみ)

のファイルがあった時に複数言語の動画を作るには
`ffmpeg -i video.mp4 -i audio-ja.m4a -i audio-en.m4a -c copy -map 0:0 -map 1:0 -map 2:0 output.mp4`

でOKです。

## map の使い方

ffmpeg は `-i`で指定したファイルの順番を0から数えます。
またそれぞれのファイルのストリームの順番も0から数えます。

なので` -map 0:0 -map 1:0 -map 2:0` と言うのは、
0つ目のファイルの、0番目のストリームと
1つ目のファイルの、0番目のストリームと
2つ目のファイルの、0番目のストリームをマージするという意味になります。

ストリームの順番が知りたい時は

`ffmpeg -i foo.mp4` とすると `Stream #1:0: Audio` みたいな所で見えます。
【質問】MacでブラウザとVirtualBoxの素早い切り替え方法

MacのVirtualBox使われている方教えてください。

MacOSのブラウザ→VirtualBoxの切り替えは command + tab　で素早くできますが、
VirtualBox→MacOSのブラウザ　だと command + tab が virtualBoxのキーが反応してしまい、
素早く切り替えることができません。

解決方法としては、以下の様な方法があるようですが、

http://tobysoft.net/wiki/index.php?Ubuntu%2FVirtualBox%2FAlt%2BTab%A4%CA%A4%C9%A4%C7%A5%DB%A5%B9%A5%C8OS%A4%C8%A4%CE%A5%BF%A5%B9%A5%AF%C0%DA%A4%EA%C2%D8%A4%A8%A4%AC%A4%B7%A4%C5%A4%E9%A4%A4%B7%EF

そうすると、他の用途面で不都合が出てきそうです。

他に良い「こんな方法がある」というものがあれば教えてください。
nilと0についての考察


rubyのnilと0がおもしろい
どう面白いかというと

```ruby

pp 'hoge' if true
#=> "hoge"

pp 'hoge' if false
#=> nil

```

これは当然ですね

次に

```ruby

pp 'hoge' if 0
#=> "hoge"

pp 'hoge' if nil
#=> nil

```

おもしろい

0　は　true　を返し
nil　は　false　を返すようです

まだ基本ですね

次に

```ruby

pp 'hoge' if nil.to_i
#=> "hoge"

pp 'hoge' if nil
#=> nil

```

おもしろい

nil.to_i　が　0　を返すように定義されているので
if nil.to_i　は　true　で
if nil　は　false　なんですね

nil.to_i　はDBにNULLとか保存しちゃっててそれを含んだ和を計算したいときに強制的に0に変換してくれて例外処理的に便利なのかなって思ってます。

ついでに

```ruby

''.to_i
#=> 0

true.to_i
#=> undifined method error

false.to_i
#=> undifined method error

```

なんかも知っておくと良いでしょう

個人的には

```ruby

nil.nil?
#=> true

```

なんかが好きですね

誰もいない空間に「誰もいないよねー？」
って聞いたら
「うん、いないよー！」
って

ホラーですね
Chef で "yum-dump Locking Error!" がでる

Chefでがーっとインストールしていると，yumで```yum-dump Locking Error!```というのがでる．

```

Chef::Exceptions::Package: Yum failed - #&lt;Process::Status: pid 5261 exit 200> - returns: ["yum-dump Locking Error! Couldn't obtain an exclusive yum lock in 10 seconds. Giving up.\n"] 
```

要はChefがyumを実行している時にタイムアウトしてしまうらしい．
タイムアウトに設定されている時間は，エラーログに書いてあるように10秒．
ちょっと，これは短いのでなんとか変更する方法はないかと，いろいろ探してたが情報があんまりなかった．

[こういうissue（CHEF-3193）](https://tickets.opscode.com/browse/CHEF-3193)があって，
最終的にはattributeとかで設定出来るようにするべきだよねって話がされてた．
が，今（2013/11/06）の状態はConfirmed．

最終的には，
```/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.0/lib/chef/provider/package/yum-dump.py```に記述されている，

```

# Seconds to wait for exclusive access to yum
LOCK_TIMEOUT = 10
```

の値を30くらいに変更した．

## 追記(2015/12/17)

現在は設定値に `timeout` を設定できるようになっているっぽい。

>```ruby
yum_package 'name' do
  allow_downgrade            TrueClass, FalseClass
  arch                       String, Array
  flush_cache                Array
  notifies                   # see description
  options                    String
  package_name               String, Array # defaults to 'name' if not specified
  provider                   Chef::Provider::Package::Yum
  source                     String
  subscribes                 # see description
  timeout                    String, Integer
  version                    String, Array
  action                     Symbol # defaults to :install if not specified
end
```

- [Chef doc: resource_yum](https://docs.chef.io/resource_yum.html)