OmniAICreator/Qiita-1.07M huggingface dataset:
Haxeでライブラリをつかう


jQuery や CreateJS をライブラリとして使うには haxelib をセットアップする必要があります。

http://haxe.org/com/haxelib/setup

```sh
$ sudo mkdir -p /usr/lib/haxe/lib
$ sudo haxelib setup
```

haxelib を格納するディレクトリを作成して、setup コマンドを実行。
haxelib の場所を聞いてきますが、デフォルトのままならエンター。
これで準備完了。

![haxe-lib.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/f320a84b-820f-9f5b-06bf-80d7407b64e2.jpeg "haxe-lib.jpg")


jQuery ライブラリがあるか検索してみる。

```sh
$ haxelib search jQuery
```

いくつかでてきますが、最新のjQuery （確認時 2.0.3）を使えるっぽい jQueryExtern を使ってみます。

```sh
$ haxelib info jQueryExtern
```

で情報がでてくるので github は軽くのぞいておきます。
http://github.com/andyli/jQueryExternForHaxe

どうやら　jQuery のインターフェイスの定義？をしているだけのようで、jQuery 本体は自分で用意するらしいです。
Haxe のライブラリはこういうものなんですかね。
定義されていないJSライブラリがあった場合どうしたらいいんだろ…

```sh
$ haxelib install jQueryExtern
```

いろいろ落ちてきたら準備完了。
こんな感じの Main.hx を作成して jQuery をたたいてみる。

```Haxe:Main.hx
import jQuery.*;

class Main {
    static public function main():Void {
        trace(new JQuery('body'));
    }
}
```

jQueryExtern の wiki には CDN の使用例が乗っているので、その通りにします。

```HTML:index.html
<html>
<head>
<title>Haxe JS</title>
</head>
<body>

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript" src="main.js"></script>

</body>
</html>
```

ビルドファイルを下記のようにして haxe compile.hxml する。

```
-js main.js
-lib jQueryExtern
-main Main
```

HTML を開いてみるとコンソールに jQuery がでてました。

![Haxe_JS-2.png](https://qiita-image-store.s3.amazonaws.com/0/20773/e849c4fa-fc47-b07e-4691-824b2945b510.png "Haxe_JS-2.png")

利用できる haxelib はここで確認できます。
http://lib.haxe.org/
自前のPHPテンプレート作ってみた。（Excel連携）


HTML書き出すためのPHPのテンプレートはさっくり作ってみました。
Excelのデータと実際のHTMLを連携しつつ書き出すテンプレートになります。

Excelからデータの読み込みはこちらに書いたものをそのまま使用しています。
・ ExcelをPHPで読み込んで1行目を連想配列のキーにするクラス書いたよ。
http://qiita.com/wilf312/items/65643f2ee300cdabbdcd

## 使い道
文字コードはUTF8で作業して、
最後のHTML出力で文字コード一括変換かけるだけなので、意外と便利。
Analytics、計測タグのON,OFF、DB連携、Excel連携などなどカスタマイズ可能かと思います。


## サンプルコード

```html:template.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<!-- [[ PRINT PAGE DATA ]] -->
</head>
<body>
<!-- [[ PRINT NAVIGATION ]] -->
</html>

```
```php:template.php
<?php

// ------ 設定関連
define( “IS_SJIS” , false);    // SJISに変換する場合はtrue
require ‘path/to/excel.php’; // Excelデータ取得クラス読み込み

// メタデータ作成関数
function getMetaData($url) { 

	// 全体の配列を取得する
	$metaData = EXCEL::getXls(dirname(__FILE__). '/myxls.xlsx', XLS_META);

	// 現在のページデータ取得
	$pageData = $metaData[$url];

	// HTMLの生成 （OGPが必要であればここに追記する）
	$metaHtml =<<<META
<title>{$pageData[‘keywords’]}</title>
<meta name="keywords" content=“{$pageData[‘keywords’]}” />
<meta name="description" content="{$pageData[‘keywords’]}" />
META;
	
	return $metaHtml;
}


// ------ 変換候補の設定
// key(HTMLコメント) → valueに置換 
$arrChange = array(
    '<!-- [[ PRINT NAVIGATION ]] -->'=> '<ul><li>about</li><li>items</li><li>contact</li></ul>',
    '<!-- [[ PRINT PAGE DATA ]] -->'=> getMetaData($_SERVER[‘SCRIPT_NAME’])
);

// ------ テンプレートの取得
$template = file_get_contents(‘index_tpl.html’);

// ------ 変換実行
$htmlData = strtr($htmlData, $arrChange);

// ------ 文字コード変換（必要あれば）
if (IS_SJIS) {
	$htmlData = mb_convert_encoding($htmlData, ‘SJIS’, ‘UTF-8’); 
}

// ------ 出力
file_put_contents('index.html', $htmlData);

```

```html:index.html.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>トップ</title>
<meta name="keywords" content=“fugafuga1” />
<meta name="description" content=“hoge100” />
</head>
<body>
<ul><li>about</li><li>items</li><li>contact</li></ul><!— ここに出力 —>
</html>

```
hubを使ってコマンドラインでプルリクエストを作る


### install

```sh
brew install hub 
```

### 使い方
以下は今までの作業

```sh
# masterからcheckout
$ git checkout -b pr-test
# 何か編集して下さい
$ git add .
$ git commit -m 'pr-test'
$ git push origin pr-test
```

ここからhubを使った作業

```sh
$ hub pull-request
# エディタが立ち上がるので、1行目はプルリクのタイトル、２行目は空行。３行目から、本文の内容を入れる
# 編集が終わると以下のようなurlが出るのでこれをコピペしてブラウザで開く！
https://github.com/mapyo/helloworld/pull/14
```

これで、`pr-test`ブランチから`master`ブランチへのプルリクを送る事が出来る！
vimで本文も入れられるのがありがたい〜！

### もうちょっとやりたい事
URLがターミナルに表示されるだけなので、ついでにブラウザで勝手に開くようになって欲しい。
以下のようにやってみたがどうも上手くいかなかった。。。
vimだからなのかなぁ。。。

```sh
$ open `hub pull-request` 
Vim: Warning: Output is not to a terminal 
```

とか、

```sh
$ hub pull-request | xargs open
Vim: Warning: Output is not to a terminal
```

とかしても上手くいかなかった。。。どなたか知っている方がいれば教えてください〜

### memo
GHEの場合は別途設定が必要。

- http://shibayu36.hatenablog.com/entry/2012/11/22/174319

## thanks
- https://github.com/github/hub#installation
- http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3
- http://pchw.github.io/blog/2013/07/12/hub/
array_merge_recursive



キーが被っていなければ問題が起きることは少ない。

キーが被るとオブジェクトが配列化されるというビックリな挙動する。

``` php:array_merge_recursive.php
$obj = new stdClass;
$obj->hoge = 'moge';
$a = array('xxx' => 'val');
$b = array('xxx' => $obj);
$c = array('yyy' => $obj);

var_dump(array_merge_recursive($a, $b));

/*
array(1) {
  'xxx' =>
  array(2) {
    [0] =>
    string(3) "val"
    'hoge' =>
    string(4) "moge"
  }
}
*/

var_dump(array_merge_recursive($a, $c));

/*
array(2) {
  'xxx' =>
  string(3) "val"
  'yyy' =>
  class stdClass#1 (1) {
    public $hoge =>
    string(4) "moge"
  }
}
*/
```
FuelPHPの初期処理作成(コントローラとルーティング)


ここでは、fuelPHPのコントローラの実行、およびルーティングの設定方法について記載します。

実行環境はapache2.x × PHP5.3を使っています。

## 1.Controllerの作成

Controllerは下記のようにして作成します。

```PHP
<?php

/**
 * 初期処理を行うコントローラ
 */
class Controller_Init extends Controller
{

	/**
     * 初期処理を実行する
	 *
	 * @access  public
	 * @return  Response
	 */
	public function action_index()
	{

        print_r('action index is called.');
	}

}
```

ポイントは下記の点でしょうか
* クラス名はController_Hogeの形式で記述する
* Controllerクラスを継承する(他にもControllerの用途によって幾つか用意されていますが、ここでは普通のControllerクラスを使用します)
* ブラウザからの実行メソッドはaction_fugaの形式で記述する
* このとき、エントリポイントは[http://XXXX.jp/hoge/fuga/](http://XXXX.jp/hoge/fuga/)となる

また、「action_index」と記載すると、エントリポイントにコントローラ名を記載するのみで実行されます。

つまり、この場合だと
http://XXXX.jp/init/
がこのコントローラのエントリポイントとなります。ds

これでコントローラの準備はOKです。

## 2.ルーティング
実際にWebサイトを公開する際は、初期ページは
http://XXXX.jp/
のみで指定したい、という場合が多いと思います。

こうしたルーティングの設定は、routes.phpというファイルで行います。
routes.phpは/path/fuel/app/config配下にあります。

もともとデフォルトだと「welcome」というコントローラを実行するよう設定されたファイルが置かれていますね。
こちらの「_root_」の部分の記述を下記のように変えます。

```php
<?php
return array(
//	'_root_'  => 'welcome/index',  // The default route
    '_root_'  => 'init',
	'_404_'   => 'welcome/404',    // The main 404 route
	
	'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),
);
```

これでルーティングも設定完了です。

## 3.確認
では、実際に
http://XXXX.jp/
にブラウザからアクセスしてみましょう。

![スクリーンショット 2014-01-12 20.22.47.png](https://qiita-image-store.s3.amazonaws.com/0/30307/8e08aa35-6ca1-f2ce-9920-4f7235ac0a86.png "スクリーンショット 2014-01-12 20.22.47.png")

コントローラが正常に実行されたようです。


今回はここまで。
気が向いたらまた何か書きます。
play framework 1.x＠heroku

試してみましたが、herokuでplay framework 1.xのJobは問題無く動作するようです。

普通のDyno 1個で、コントローラへのアクセスとバックグラウンドのジョブを両方実行可能です。

つまり、無料の範囲内で以下の事が可能です。

- ウェブアプリケーション作成
- 自由にスケジュール可能なバックグラウンドジョブの実行
- 無料のDB（PostgreSQL／データ件数10,000件まで）
uim-anthy で句読点をカンマドットに変える

今日この頃よく論文とかを書く都合，いい加減，点丸派からカンマドット派に乗り換えようと思いました．動作環境は Debian jessie/sid, uim-anthy 1:1.8.6-4 です．

調べると，```$HOME/.uim``` にほげほげを記述せよとかそういうことを言っている人が出てきますが，これは古いスタイルの設定ファイルです．この設定ファイルを作成すると，新しいスタイルの設定ディレクトリ ```$HOME/.uim.d``` が有効でなくなるようです．設定ディレクトリは，GUI で uim-anthy の設定内容を変更できる uim-pref-gtk で使われるので，こちらの方が便利でしょう．

ということで，uim-pref-gtk で句読点をカンマドットに変えればいい訳なんですが，設定項目が多すぎて見つけづらいです（というか，実際 ```.uim.d``` の中を眺めてようやく見つけました）．結論を言うと，「ローマ字 - かな変換」の「対応規則の種類」で， **カスタム** を選択します．

![2014-01-12-190252_1024x768_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/2251/6f61f06d-515b-d6e5-f1e4-23247c1c4067.png)

あとはこのカスタム対応規則から，句読点のルールを編集します．

![2014-01-12-190745_1024x768_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/2251/83b57f96-29db-fd37-e742-c1de23243389.png)

ちなみに，設定ディレクトリの方を直接いじる場合，```$HOME/.uim.d/customs/custom-ja-rk-rule.scm``` を編集すればいいです．
コマンドラインからWebプロキシの設定

頻繁にWebプロキシの設定を変更する場合、いちいちシステム環境設定から行うのは面倒です。
コマンドラインからのWebプロキシの設定方法は以下のとおりです。

■Webプロキシの設定
$ sudo networksetup -setwebproxy Wi-Fi &lt;domain&gt; &lt;port&gt; on &lt;user&gt; &lt;pass&gt;

■Webプロキシの状態取得
$ networksetup -getwebproxy Wi-Fi

■Webプロキシの入切り
$ sudo networksetup -setwebproxystate Wi-Fi off
$ sudo networksetup -setwebproxystate Wi-Fi on

上記全て Wi-Fi の部分は、有線Lanでは Ethernet として下さい。
詳しくは下記を参照

■ネットワークデバイスの一覧表示
$ networksetup -listallnetworkservices
dependencies.ymlにbugsnagを追加

こう書いて

```yaml:dependencies.yml
require:
    - play
    - com.bugsnag -> bugsnag 1.2.1
```

このコマンドを実行
`$ play dependencies`

すると`bugsnag-1.2.1.jar`が`lib`ディレクトリに放り込まれる。
C#でSetWindowsHookEx(KEYBOARD_LL,...)をしてみる。



```csharp:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace Testhook
{
    static class TestHook{
        [STAThread]
            static void Main(string[] args)
            {
                Application.Run(new MainForm());
            }
    }

    class MainForm : Form{
        public delegate int HookHandler(int code, IntPtr message, IntPtr state);

        [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr SetWindowsHookEx(int hookType, HookHandler hookDelegate, IntPtr module, uint threadId);

        [DllImport("user32.dll", SetLastError = true)]
            public static extern bool UnhookWindowsHookEx(IntPtr hook);

        [DllImport("user32.dll")]
            public static extern int CallNextHookEx(IntPtr hook, int code, IntPtr message, IntPtr state);

        [StructLayout(LayoutKind.Sequential)]
            public class KBDLLHOOKSTRUCT
            {
                public uint vkCode;
                public uint scanCode;
                public KBDLLHOOKSTRUCTFlags flags;
                public uint time;
                public UIntPtr dwExtraInfo;
            }

        [Flags]
            public enum KBDLLHOOKSTRUCTFlags : uint {
                LLKHF_EXTENDED = 0x01,
                LLKHF_INJECTED = 0x10,
                LLKHF_ALTDOWN = 0x20,
                LLKHF_UP = 0x80,
            }

        HookHandler hookDelegate;
        IntPtr hook;

        public MainForm()
        {
            const int KEYBOARD_LL = 13;
            hookDelegate = new HookHandler(OnHook);
            IntPtr hMod = Marshal.GetHINSTANCE( System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
            hook = SetWindowsHookEx(KEYBOARD_LL, hookDelegate, hMod, 0);
            if (hook == IntPtr.Zero){
                int errorCode = Marshal.GetLastWin32Error();
                throw new Win32Exception(errorCode);
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            if (hook != IntPtr.Zero)
            {
                UnhookWindowsHookEx(hook);
            }
        }

        int OnHook(int nCode, IntPtr wParam, IntPtr lParam)
        {
            KBDLLHOOKSTRUCT kb = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));

            Console.WriteLine("vkCode={0}", kb.vkCode);

            return CallNextHookEx(hook, nCode, wParam, lParam);
        }
    }
}
```

* http://msdn.microsoft.com/ja-jp/library/cc430012.aspx
* http://d.hatena.ne.jp/hiroki0/20100307/1267910248
* http://hongliang.seesaa.net/article/7539988.html
* http://qa.atmarkit.co.jp/q/1872
* http://ntcoder.com/bab/2007/06/12/wh_keyboard_ll/
* http://stackoverflow.com/questions/2079868/marshal-ptrtostructure-throwing-system-argumentexception-error
* http://msdn.microsoft.com/ja-jp/library/cc430103.aspx
* http://d.hatena.ne.jp/myugaru/20071130/1196434749
* http://msdn.microsoft.com/ja-jp/library/2zhzfk83(v=vs.110).aspx
ROSチュートリアル第三回 — ROSのビルドシステム


## ビルドシステムの重要性
誰かが実装したソフトウェアをコンパイルして実行する、単純なことだが依存ライブラリが増えてくるとコンパイルするだけで数日を使ってしまうことはよくある。
「画像処理にはこのライブラリが必要で、このデバイスを読むためにはあれが必要で、行列計算にはこのライブラリが…」という作業は、aptやyumで全てがインストールできれば良いが、研究者コミュニティのソフトウェアではそうも行かないことが多い。

この問題を解決するため、ROSはビルドシステムを提供する。これはROSを定義づける上で非常に重要な部分である。

## ROSのパッケージシステム
ビルドシステムに触れる前に、ROSのパッケージシステムについて理解する必要がある。
ROSはソフトウェアをpackageという単位で構成する。
例えば、あるpackageは実行ファイルを提供し、あるpackageはヘッダのみを提供し、あるpackageは共有ライブラリを提供する、といったように。

そしてpackage間には依存関係が記述されているため、コンパイル時(や実行時)にその依存関係を解決することでソフトウェアのビルド(や実行)を容易にしている。

## ROSのビルドシステム
ROSのビルドシステムには歴史的な経緯から2つのシステムがある。
* [catkin](http://wiki.ros.org/catkin) (Recommended)
* [rosbuild](http://wiki.ros.org/rosbuild) (Deprecated)

rosbuildは以前から使われていたシステムで、catkinは最近登場した新たなビルドシステムである。
ROSはcatkinへ移行するようにユーザに言っている(ユーザからしたらrosbuildでいいじゃんと思うのだが…).

現在はrosbuildからcatkinへのビルドシステムの移行期のため、どちらも併用することができる。

簡単に言うと、パッケージの中に`package.xml`があったらcatkin, `manifest.xml`があったらrosbuildである。

catkinに移行する利点としては、コードをgithubで管理していると、[bloom](http://wiki.ros.org/bloom)と呼ばれる仕組みでaptのパッケージを生成することができる点である。

基本的なパッケージはcatkinへの以降が終了しているが、まだ多くのパッケージがrosbuildで残されているというのが現状である。

具体的なこれらのビルドシステムの使い方についてはより詳細なチュートリアルで触れたいと思う。
OS XのFunctionキーとOptionキーとかの組み合わせまとめ（一発ディスプレイミラーリングなど）


Functionキーは普通に押すと、ディスプレイの明るさの変更やデスクトップの表示、Mission Controlの表示などができますが、Control、Option、Shift、Commandの組み合わせでさらなる機能を発揮します。

## Fn系

| キー | 通常              | Optionで設定画面を開く | Option+Shiftで少しずつ増減 | Command                  |
|------|-------------------|------------------------|----------------------------|--------------------------|
| F1   | ディスプレイ輝度↓ | ○                      | ○                          | ディスプレイミラーリング |
| F2   | ディスプレイ輝度↑ | ○                      | ○                          | ターゲットディスプレイ   |
| F3   | Mission Control   | ○                      | ×                          | デスクトップを表示       |
| F4   | Launch Pad        | ×                      | ×                          | -                        |
| F5   | キーボード輝度↓   | ○                      | ○                          | VoiceOver                |
| F6   | キーボード輝度↑   | ○                      | ○                          | -                        |
| F7   | 巻き戻し          | ×                      | ×                          | -                        |
| F8   | 再生・一時停止    | ×                      | ×                          | -                        |
| F9   | 早送り            | ×                      | ×                          | -                        |
| F10  | ミュート          | ○                      | ×                          | -                        |
| F11  | 音量↓             | ○                      | ○                          | -                        |
| F12  | 音量↑             | ○                      | ○                          | -                        |

※F3/F4はShiftでアニメーション速度を遅くする

## Fn以外

### Power

| Modifier        | 機能                         |
| ---             | ---                          |
| なし            | コンピュータをスリープ       |
| (2秒押し)       | システム終了ダイアログを表示 |
| Control         | システム終了ダイアログを表示 |
| Control + Shift | ディスプレイをスリープ       |

http://hints.macworld.com/article.php?story=20131025154203251

### Power (Lionまでの場合？)

| Modifier | 機能                         |
| ---      | ---                          |
| なし     | システム終了ダイアログを表示 |
| Option   | コンピュータをスリープ？     |
|          | ほかは同じ？                 |

### Esc

| Modifier                 | 機能                                                   |
| ---                      | ---                                                    |
| Command + Option         | 「アプリケーションの強制終了」ダイアログを表示         |
| Command + Option + Shift | (Lionまで？) 3秒押しで現在のアプリケーションを強制終了 |

## その他

[Apple公式のキーボードショートカット一覧](http://support.apple.com/kb/ht1343?viewlocale=ja_JP)
２倍速から８倍速の動画を作成する方法

## 前提
* x1 ディレクトリに標準速度の動画が格納
* 元の動画は、 flv
* 新たに作る動画は mp4
  * エンコーディングは 映像：mpeg4 (x264)  音声： AAC
* ffmpeg を利用。環境変数 PATH を適切に設定
* Windows + [Mingw/MSYS](http://www.mingw.org/wiki/MSYS)

## 特徴
* 0.5倍から8倍まで簡単に速度を調整可能
* x2 x3 等のディレクトリは自動生成
* 作成済みの場合はスキップ
* ファイル作成中で異常終了したときはそのファイルの最初からやり直し

## スクリプト
```sh

function filter(){
  local -r speed=$1

  local v="[0:v]setpts=PTS/${speed}[v]"

  if [ $speed -le 2 ]; then
    local a="[0:a]atempo=${speed}[a]"
  elif [ $speed -le 4 ]; then
    local a="[0:a]atempo=2,atempo=$speed/2[a]"
  elif [ $speed -le 8 ]; then
    local a="[0:a]atempo=2,atempo=2,atempo=$speed/4[a]"
  fi

  echo -filter_complex "$v;$a" -map [v] -map [a]
}

function speedup(){
  local -r src=$1
  local -r dst=$2
  local -r speed=$3

  local -r tmp=$(basename $dst .mp4)_tmp.mp4
  [ -f $tmp ] && rm $tmp

  local -r  config="-crf 23 -c:a libvo_aacenc -ar 44100 -b:a 64k -c:v libx264 -qcomp 0.9 -preset slow -tune film -threads auto"

  local -r args="-i $src $config $(filter $speed) $tmp"
  ffmpeg $args && mv $tmp $dst
}

for speed in 2 3 4 5 6 7 8; do
  for file in $(find ./x1 -name \*.flv) ; do
    dst=$(echo $file | sed s/x1/x${speed}/ | sed s/flv$/mp4/ )
    dir=$(dirname $dst)
    mkdir -p $dir

    [ -f $dst ] && continue
    speedup $file $dst $speed
  done
done

```

## 解説
* ffmpeg 関連
  * setpts と atempo による速度の調整の詳細は、[ffmpeg のWiki](https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video) を参照
  * atempo は 0.5 から 2.0 までしか指定できないが、連鎖させることで5倍速なども可能
  * 5倍速の計算とかを *2*2*5/4 にすることで計算処理を単純化
* X264 のパラメータ関連
  * crf は画質に関するパラメータ。23は高画質。29だとかなり低画質。 26 くらいでも全然かまわないかも。
  * qcomp ビットレート変動量。デフォルト値が低すぎるので、 0.9 とか設定すると良いらしい。
  * -preset slow ちょっと遅いが圧縮率がまずまず高くなる。medium とか fast とか veryfast とかも指定できる。
  * -tune film を指定すると実写向けに最適なパラメータに。他に animation とかもある
  * これだけ指定すれば他のパラメータはくわしく知らなくてもよさげ。
* シェルスクリプト関連
  * x1 以下の flv をすべて処理するために find を利用
  * && を利用することで、行数をちょっと減らしている
  * basename の第2引数の指定は便利
  * エンコは一旦、 ～_tmp.mp4 に対してすることで完了済みか処理途中の異常終了かを判断
  * function で変数を使うとき local -r を使うと、行儀のいい、いい子ちゃんに見える

## ひとりごと
* $((5 / 4)) とかだと、整数型でしか計算できないので結果が 1 になって困った
* perl とか bc を使う案もあったけど、ffmpeg に計算させることにした
* bc はそもそも Msys-git に含まれていなかった
* ffmpeg は Windows 版だと x264 や aacenc が最初からバンドルされていて便利
* x264 でのエンコは求める画質を crf で指定して、preset を slow するのが最適との結論
  * 指定の簡単さ、エンコ速度、画質、出力ファイルサイズのバランスが取れている
  * ビットレートを固定して two-pass にするのはエンコに時間かかる上に、画質がコントロールしづらい
  * エンコ速度が重要なら veryfast とかも良い。（ファイルサイズは大きくなるが、画質は crf で指定したかんじになる）
ROSチュートリアル第二回 -- ROSの通信モデル


## ROSにおけるプロセス間通信の重要性

ROSで推薦されている開発スタイルは以下の様なものである。
1. とにかくプロセス(ROSではこれをNodeと呼ぶ)を立ち上げまくる
2. プロセス間のデータはネットワーク経由で通信する

![ros_flow_chart.png](https://qiita-image-store.s3.amazonaws.com/0/6025/2514e6a0-ed0a-a644-0e78-78cd404fbcc4.png "ros_flow_chart.png")

例えば、上の図のようなシステム構成を考えてみよう
これは、ステレオ視によって外部の三次元の環境を認識し、それを回避するような動作計画を行うロボットシステムである。
このようなシステムをROSで実装する場合、角丸で囲われているものがそれぞれ独立したプロセスとして実行される。
そして、矢印で繋がれた部分がプロセス間通信である。


このようなスタイルで開発されたシステムにおける利点は、
1. 特に何も考えなくてもマルチコアの恩恵を受けられる
2. システムの一部(あるプロセス)がバグで死んでも、システム全体は死なない
3. 複数マシンでの分散システムに自然と拡張できる
4. コードの再利用性が高くなる
といったものがあげられる。

このような開発スタイルを実現するために、ROSはネットワーク経由でメッセージをやりとりできる通信ライブラリを各種プログラミング言語(C++. Python, etc)に提供している。


よくある質問に、「一つの計算機でわざわざ複数プロセスを立てて、間をTCP/IPで通信するのは無駄じゃないか?」というのがあるが、
自分でマルチスレッドのコードをメンテナンスすることを考えると、プロセス単位でモジュール化したほうが得策であろう(ﾏﾙﾁｽﾚｯﾄﾞﾑｽﾞｶｼｲﾖ)。

また、通信に関しては「なぜ共有メモリを使わないのか?」といった質問もよく見るが、「localhostでの通信は結構速いっぽいよ」というのがROS開発者の一貫した答えである。
たしかに、TCP/IPではリアルタイム性の要求が厳しい部分で不都合が発生するが、ROSではUDPベースの通信も実装されているので、それを利用することができる。

また、[nodelet](http://ros.org/wiki/nodelet)というスレッド単位の並列処理の枠組みも用意されているので、通信負荷を減らす必要があればこちらを利用することもできる。

## ROSの基本的な通信モデル

ROSには大きく分けて二つの通信モデルがある。
1. [pub/sub型のメッセージング](http://ja.wikipedia.org/wiki/%E5%87%BA%E7%89%88-%E8%B3%BC%E8%AA%AD%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB)
2. [RPC(リモート関数呼び出し)](http://ja.wikipedia.org/wiki/RPC)

### topicを利用したpub/sub型のメッセージング
ROSのほとんどのプロセス間通信はtopicを通じたpub/subによって行われる。

Nodeはtopicに対してデータを書き込む(これをpublishと呼ぶ)、およびデータを読み込む(これをsubscribeと呼ぶ)という二つの操作をする。

一つのtopicに対し、複数のNodeがpublish/subscribeを実行する。
あるNodeがあるtopicに対してデータをpublishすると、そのtopicをsubscribeしている全Nodeにデータが渡される。

![topic.png](https://qiita-image-store.s3.amazonaws.com/0/6025/2d24994a-e492-29b9-e49a-5e2ad1b1280d.png "topic.png")

図のような例だと、Node Aがtopic Hogeにデータをpublishすると、HogeをsubscribeしているNode、つまりCとDに対してデータが渡される。

topicによる通信は、基本的に非同期で行われる。つまり、topicをpublishするNodeは、勝手に自分のタイミングでデータをpublishする。topicをsubscribeしているNodeは、データがきたら特定の処理を実行するcallbackを呼び出す。

pub/sub型の通信モデルだと、publishしている側はどのNodeにデータが行ったのか、subscribeしている側からはどのNodeからデータが来たのかを基本的には知ることが出来ない(気にする必要がない)。

### serviceを利用したリモート関数呼び出し
topicを利用した通信だと、publishしている側から見るとデータが他のNodeに伝わったのかを知ることは基本的にできない。

これに対し、データの受け渡しを保証したい場合にserviceを用いる。

serviceは典型的な[リモート関数呼び出し(Remote Procedure Call, RPC)](http://ja.wikipedia.org/wiki/RPC)と呼べる。

![service.png](https://qiita-image-store.s3.amazonaws.com/0/6025/32d7b94e-2a6c-0231-a2cc-d64cfcca5cd8.png "service.png")

serviceによる通信では、Nodeは呼び出し側(Caller)とサーバ側(Callee)に分けられる。

サーバNodeはserviceを宣言することで外部からそのserviceを呼び出すことができるようになる(図だとHogeというserviceを提供している)。

serviceは呼び出すための引数と戻り値の二つによって型が決定される。クライアントNode(Caller)は、serviceに対して引数を与え戻り値を得る。

このリモート関数呼び出しの間、基本的にクライアントは同期的に処理がなされる。つまりクライアントはserviceを呼び出して戻り値を得るまでの間処理がブロックされる。

また、リモート関数呼び出しのため、クライアントは引数がサーバに渡ったこと、サーバから戻り値が返ってくることを保証できる。何かしらかの問題によって、例えばサーバが存在しないなど、通信に問題が会った場合はエラーとして報告される。

serviceでの通信は一対一の通信に限られる。つまり、serviceは一つのサーバNodeによってのみ提供されているということである。
clang-formatをemacsで使おうとすると“End of file during parsing”と出てファイルが消える

対処法をメモっておく。環境は以下

* emacs24.3.1
* Ubuntu 12.04 64bit LTS
* clang3.3

結論としては、.elファイルはclangのインストールと一緒についてきた.elファイルを使いましょうということ

ぐぐると、例えば以下のようなファイルが出てくるけれど、
[clang-format.el](https://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/clang-format.el)

これはclang-3.3では動かない様子。

clang-3.3の場合は、
http://packages.ubuntu.com/saucy/amd64/clang-format-3.3/filelist
にあるように

```
/usr/share/emacs/site-lisp/clang-format-3.3/clang-format.el
```
を使えばOK。
Three.jsのRaycasterを使って、画面内のオブジェクトを得る


Three.jsのRaycasterクラスを使って、画面内のオブジェクトを取得するサンプル。
ざっくり手順を書くと、

1. マウス位置を取得
2. マウス位置をWebGL内の座標系に変換
3. マウス位置からまっすぐに伸びる光線ベクトルを生成
4. その光線とぶつかったオブジェクトを得る

という手順。色々めんどくさいこともThree.jsがやってくれるので、以下のようにするだけで該当オブジェクトをさくっと得ることができる。

[2015.01.18 upate]
`unproject`メソッドは、`Vector`クラスに移動したようです。

```raycast-sample.js
function onmousemove(e) {

    var rect = e.target.getBoundingClientRect();

    // スクリーン上のマウス位置を取得する
    var mouseX = e.clientX - rect.left;
    var mouseY = e.clientY - rect.top;
    
    // 取得したスクリーン座標を-1〜1に正規化する（WebGLは-1〜1で座標が表現される）
    mouseX =  (mouseX/window.innerWidth)  * 2 - 1;
    mouseY = -(mouseY/window.innerHeight) * 2 + 1;
    
    // マウスの位置ベクトル
    var pos = new THREE.Vector3(mouseX, mouseY, 1);

    // pos はスクリーン座標系なので、オブジェクトの座標系に変換
	// オブジェクト座標系は今表示しているカメラからの視点なので、第二引数にカメラオブジェクトを渡す
    // new THREE.Projector.unprojectVector(pos, camera); ↓最新版では以下の方法で得る
    pos.unproject(camera);
    
    // 始点、向きベクトルを渡してレイを作成
    var ray = new THREE.Raycaster(camera.position, pos.sub(camera.position).normalize());

    // 交差判定
	// 引数は取得対象となるMeshの配列を渡す。以下はシーン内のすべてのオブジェクトを対象に。
    var objs = ray.intersectObjects(scene.children);
	
	//ヒエラルキーを持った子要素も対象とする場合は第二引数にtrueを指定する
    //var objs = ray.intersectObjects(scene.children, true);

    if (obj.length > 0) {
        // 交差していたらobjsが1以上になるので、やりたいことをやる。
        objs[0].object.position.x = 10;
    }
}
```
Ruby で Growl に通知するサンプル

[ruby-growl](http://rubygems.org/gems/ruby-growl) を使って通知するためのスクリプト。こんな感じ

```rb:rgrowl-test.rb
#! /usr/local/ruby200/bin/ruby
# coding: utf-8
#
require 'ruby-growl'

g = Growl::GNTP.new "localhost", "ruby-growl"
g.add_notification "notification", "ruby-growl Notification",
                     URI.parse('https://gravatar.com/avatar/d203ebd5ab7bc53ae59327780edc19b3')
g.notify "notification", "Ruby スクリプトからの通知",
          "ruby-growl を使ったテストメッセージです。", 0, true, nil, 'http://www.asahi.com'

exit 0
```

ググると Growl.new するサンプルが多いけど、それだと callbacks の URL 指定が怒られてしまうので Growl::GNTP を使いました。
既存クラスにメソッド追加


http://www.ne.jp/asahi/hishidama/home/tech/scala/def.html

##例1: Doubleクラスに単位変換メソッドを追加

```定義
implicit def convert(d:Double) = new {
  //ミリ→ポイント変換
  def mmToPoint = {d * 2.835}
  //ポイント→ミリ変換
  def pointToMm = {d * 0.353}
}

```

```利用方法

val originalMm = 100d
val point = originalMm.mmToPoint

val originalPoint = 100d
val mm = originalPoint.pointToMm

```
iOS7からcachesディレクトリ自体を消す事が出来なくなった


iOS7から実機でcachesディレクトリ自体を削除しようとするとパーミッションエラーになる。

cachesディレクトリ直下にそのまま画像などをキャッシュしていた場合は列挙させて削除していくようにした（そもそもcachesディレクトリ自体を消すのが間違っていた）。

```objc
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{
    NSArray *cacheDirPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    //複数のファイルを返すメソッドのためArrayで返ってくるが、特定のディレクトリなため0コ目しか存在しない
    NSString *cacheDirPath = [cacheDirPaths objectAtIndex:0];
    
    NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:cacheDirPath];
    
    for (NSString *fileName in fileEnumerator) {
        //jpgやgifなら削除
        if ([fileName hasSuffix:@".jpg"]
            || [fileName hasSuffix:@".jpeg"]
            || [fileName hasSuffix:@".gif"]) {
            
            NSError *error = nil ;
            NSString *removeFilePath = [cacheDirPath stringByAppendingPathComponent:fileName];
            BOOL remove = [[NSFileManager defaultManager] removeItemAtPath:removeFilePath
                                                                     error:&error];
            
            NSLog(@"remove %d", remove);
            NSLog(@"error %@", error);
        }
    }
});
```

SDWebImageなどのライブラリを見るとcachesディレクトリの下に専用の画像キャッシュディレクトリを作り、ディスクキャッシュをクリアする場合はそのディレクトリを消すようにしていてシンプルにできてる。
Active Model にカスタムバリデータを適用したい

Active Recordなら独自のバリデーションを追加する文献がググるとたくさんあるけど、Active Modelでやる方法が見つからない・・・。

下記コードで出来ました。

例：入力された値を配列で受け取り、その配列数が4以上の場合はエラーを出すバリデーションを実装

```ruby:app/model/hoge_form.rb
class HogeForm
  include ActiveModel::Model
  attr_accessor :keyword

  validates :keyword,     :presence => {message: "キーワードを入力してください"}
  validate :keyword_max

  def keyword_max
    if @keyword.count > 3
      errors[:keyword] =  '指定できるワードは３つまでです'
    end
  end
end
```

ActiveRecordと同じようにvalid?でバリデーションチェックが出来ます

```ruby:app/controller/hoge_index.rb
form = new HogeForm(:keyword=>[1,2,3,4])
if form.valid?
  puts 'エラー'
end
```

## 余談

phpのsymfony使っているとwidgetが欲しくなる・・・
てことで、Active Modelのファイル名をxxxxForm.rbっていう共通な名前にして
widgetみたいな振る舞いにしています。他に、いい方法はないか模索中
Supervisorでサービスのautostartとautorestartがtrueか調べる

Supervisorの設定を見て、

* autostartがtrueかつ
* autorestartがtrue

の時に`0`で終了し、それ以外の時に`1`や`2`で終了するようなスクリプト。

```py
import sys
import supervisor
from supervisor.options import ServerOptions

if len(sys.argv) != 2:
  sys.stderr.write('Usage: python %s PROGNAME\n' % sys.argv[0])
  sys.exit(2)

progname = sys.argv.pop()
options = ServerOptions()
options.realize()

configs_list = [configs for configs in options.process_group_configs if configs.name == progname]
if len(configs_list) == 0:
  sys.stderr.write('no config\n')
  sys.exit(1)

configs = configs_list[0].process_configs[0]
if not configs.autostart:
  sys.stderr.write('autostart disabled\n')
  sys.exit(1)

if configs.autorestart == supervisor.datatypes.RestartUnconditionally:
  sys.stderr.write('enabled\n')
  sys.exit(0)
else:
  sys.stderr.write('autorestart disabled\n')
  sys.exit(1)
```

何に使うかと言うと、[serverspec]で

```rb:nginx_spec.rb
describe service('nginx') do
  it { should be_enabled.by('supervisor') }
end
```

と書けるようにしたいわけです。

もちろんgrepで頑張るのもできるんだろうけど、includeセクションがコメントアウトされていないか？　とか、ちゃんと`program:nginx`のセクションに書かれているか？　とか考え始めると、実際内部で使われるプログラムにめんどうみてもらったほうが確実だなあと。

初めてPython書いたのでなんかおかしいとかもっといい書き方あるとかあったら教えてもらえると嬉しいです。

自分の今の用途にはいらないけど、

* 設定ファイルのパスは指定できるようにした方がいいかなあ。
* プロセスグループ内のプロセスも細かくめんどうみたほうがいいかなあ。
* virtualenv使っているとどうなるのかよく分かんない。

というのが気になっているといえば気になっています。
ま、自分の今の用途にはいらないので、必要になるまで足さないと思うけど。

（Supervisor自体に、プログラム名と設定項目を指定して内容を出力するようなコマンドかXML-RPCのインターフェイスが添付されててほしいなあ……誰かPython得意な人……）

[serverspec]: http://serverspec.org
CSS よく使う id名 class名

#全体を囲う要素に使えそうな名前
* wrapper
* wrap
* page
* container
* all
* body
* box
* layout

#上部の要素に使えそうな名前
* header
* head
* top
* sitemast
* pagetop
* intro

#ナビゲーション要素で使えそうな名前
* globalNavi
* gnavi
* gnav
* navigation
* navi
* nav
* topNav
* navcontainer
* contentNavi

#本文、メイン要素で使えそうな名前
* maincontent
* content
* contents
* main
* maincol
* mainbox

#サイド要素で使えそうな名前
* menu
* sub
* subNav
* links
* linkList
* sidebar
* ashtray
* col

#下部要素で使えそうな名前
* footer
* foot
* copyright
* head

#その他
* entry
* entryBody
* entryBlock
* entryDate
* item
* column
* contents-inner
* inner
ExpressでfacebookAPIのパース


faceookのapiはものによってはhttps通信じゃないと行けないみたいなのでhttpsをrequireします．
facebookはグループのAPIです．アクセストークンを使います．

```routs/index.js
var https = require('https');
var url = 'https://graph.facebook.com/(グループのID)/feed?access_token=(アクセストークン)';
var response = https.get(url, function(res){
	var body = '';
	res.setEncoding('utf8');

	res.on('data', function(chunk){
		body += chunk; //console.log(body);←元データ
	});

	res.on('end', function(res){
		ret = JSON.parse(body);
		response = ret.data;
		//console.log(response);
	});
}).on('error', function(e){
	console.log(e.message); //エラー時
});

exports.index = function(req, res){
	console.log(response);
	res.render('index', { title: 'Express', data: response});
};
```

これでdataの中身をviewで利用することが出来ました．
vagrantにknife-soloする時のhostnameを設定

よく忘れるので残しとく。

```shell-session
knife solo cook vagrant@hostname
```

↑の`hostname`を設定する方法

```shell-session
vagrant ssh-config --host hostname >> ~/.ssh/config
```

− `hostname`は任意
- sshポートやipアドレスは適宜調整
- Windowsの場合、`~/.ssh/config`を適宜調整

> これをやっておかないと`berkshelf`もおかしな動きをする
ある整数の各桁ごとに四則演算した結果を全パターン求める

```rb
class Integer
	def operations
		os = operators_series
		ns = self.to_s.each_char.map{|i| i.to_f}
		os.inject([]) {|r, e| r << ns.zip(e).flatten.compact.join}
	end
	
	private
	def operators_series
		length = self.to_s.length
		return self if length < 2
		operators = %w(+ - * /)
		length = self.to_s.length
		(length - 2).times
			.inject(operators) {|r, i| r.product(operators)}
			.flatten(length - 2)
			.each_slice(length - 1)
			.to_a
	end
end

# 小町算
20140112.operations.
	reject{|e| eval(e).infinite? || eval(e).nan?}.
	select{|e| eval(e) == 10.0}.
	each{|e| p e + " = " + eval(e).to_s}

# =>
"2.0+0.0+1.0+4.0+0.0+1.0+1.0*2.0 = 10.0"
"2.0+0.0+1.0+4.0+0.0+1.0*1.0+2.0 = 10.0"
"2.0+0.0+1.0+4.0+0.0+1.0/1.0+2.0 = 10.0"
"2.0+0.0+1.0+4.0+0.0*1.0+1.0+2.0 = 10.0"
"2.0+0.0+1.0+4.0+0.0/1.0+1.0+2.0 = 10.0"
"2.0+0.0+1.0+4.0-0.0+1.0+1.0*2.0 = 10.0"
"2.0+0.0+1.0+4.0-0.0+1.0*1.0+2.0 = 10.0"
"2.0+0.0+1.0+4.0-0.0+1.0/1.0+2.0 = 10.0"
"2.0+0.0+1.0+4.0-0.0*1.0+1.0+2.0 = 10.0"
"2.0+0.0+1.0+4.0-0.0/1.0+1.0+2.0 = 10.0"
"2.0+0.0+1.0*4.0+0.0+1.0+1.0+2.0 = 10.0"
"2.0+0.0+1.0*4.0-0.0+1.0+1.0+2.0 = 10.0"
"2.0+0.0*1.0+4.0+0.0+1.0+1.0+2.0 = 10.0"
"2.0+0.0*1.0+4.0-0.0+1.0+1.0+2.0 = 10.0"
"2.0+0.0/1.0+4.0+0.0+1.0+1.0+2.0 = 10.0"
"2.0+0.0/1.0+4.0-0.0+1.0+1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0+0.0+1.0+1.0*2.0 = 10.0"
"2.0-0.0+1.0+4.0+0.0+1.0*1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0+0.0+1.0/1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0+0.0*1.0+1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0+0.0/1.0+1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0-0.0+1.0+1.0*2.0 = 10.0"
"2.0-0.0+1.0+4.0-0.0+1.0*1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0-0.0+1.0/1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0-0.0*1.0+1.0+2.0 = 10.0"
"2.0-0.0+1.0+4.0-0.0/1.0+1.0+2.0 = 10.0"
"2.0-0.0+1.0*4.0+0.0+1.0+1.0+2.0 = 10.0"
"2.0-0.0+1.0*4.0-0.0+1.0+1.0+2.0 = 10.0"
"2.0-0.0*1.0+4.0+0.0+1.0+1.0+2.0 = 10.0"
"2.0-0.0*1.0+4.0-0.0+1.0+1.0+2.0 = 10.0"
"2.0-0.0/1.0+4.0+0.0+1.0+1.0+2.0 = 10.0"
"2.0-0.0/1.0+4.0-0.0+1.0+1.0+2.0 = 10.0"
DownloadManagerの妙な挙動


DownloadManagerでダウンロード完了したはずなのにファイルが無くなっている現象が起きていたので調べてみました。

```
D/DownloadResultReceiver( 1585): onReceive: intent=Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.example.downloadtest cmp=com.example.downloadtest/com.example.downloadtest.receiver.DownloadResultReceiver (has extras) }
D/DownloadResultIntentService( 1585): handleDownloadComplete: id=803
D/DownloadResultIntentService( 1585): status=8, reason=0, bytes=12805521, localUri=file:///storage/sdcard0/Android/data/com.example.downloadtest/files/test.mp4

D/DownloadResultReceiver( 1585): onReceive: intent=Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.example.downloadtest cmp=com.example.downloadtest/com.example.downloadtest.receiver.DownloadResultReceiver (has extras) }
D/DownloadResultIntentService( 1585): handleDownloadComplete: id=803
D/DownloadResultIntentService( 1585): status=16, reason=1008, bytes=12805521, localUri=null
```

同じリクエストID(id=803)でDOWNLOAD_COMPLETEのブロードキャストインテントが2度来ていて、最初はstatus=8(STATUS_SUCCESSFUL)だけどその後のはstatus=16(STATUS_FAILED)になっていてダウンロードしたファイルも削除されています。

余談ですがSTATUS_SUCCESSFULが2回来るケースもありました。アプリ内でダウンロード完了時に処理をする場合には注意した方がいいでしょう(´・ω・｀)


いろいろぐぐって見たところAndroidのバグっぽい
https://code.google.com/p/android/issues/detail?id=18462
https://code.google.com/p/android/issues/detail?id=34791

どうもサーバー側でETagを設定しないと消される場合があるみたい
http://papaya-backend.net/2013/04/12/why-http-etag-header-may-cause-your-downloading-apps-on-android-failed/

ただ、今回はダウンロード元が外部のサーバーでそうするわけにも行かないので

1. 一時ファイルをDownloadManagerに渡してダウンロード
2. DOWNLOAD_COMPLETEでダウンロード完了した際にファイル名をrenameしてDownloadManagerが削除できないようにする

という形で逃げましたがrenameしたのにDownloadManagerが一時ファイルをfilesize=0の状態で作ってしまうので定期的に空ファイルのお掃除は必要かもしれません
(編集中)playframework(2.2) をherokuへデプロイ


## アカウントを作成
https://id.heroku.com/signup

## ツールキットの導入（コマンドラインツール）
https://toolbelt.heroku.com/
適切なものをDLして導入してください・

## Procfileファイルを用意

```[playproject]/Procfile

web: target/universal/stage/bin/[playproject] -Dhttp.port=$PORT -Dconfig.file=conf/production.conf

```
※公式ページに書いてあることは２．１までのことなので注意。２．２の場合は↑
http://stackoverflow.com/questions/19085213/scala-play-2-2-application-crashes-after-deploying-in-heroku-target-start-no-su

※本番用と開発用で、設定ファイルを切り替えるため、-Dconfig.fileオプションをつけている。
http://stackoverflow.com/questions/14673722/maintaining-seperate-dev-prod-config-files-on-heroku-doesnt-work
http://swn.mahata.net/article/20130508



## MongoHQアドオンの追加

* herokuに支払い情報（クレジットカード）を登録

https://dashboard.heroku.com/account

（billingのところ）

* アドオン追加（MongoDB)

https://addons.heroku.com/
にログイン

https://addons.heroku.com/mongohq

planを選んで（free)、下のほうのプルダウンでアプリ名を選択、Add MongoHQ Sandbox for Freeのボタンを押下

* アドオン追加（Redis)

https://addons.heroku.com/redistogo

planを選んで（free)、下のほうのプルダウンでアプリ名を選択、Add Nano for Freeのボタンを押下

## デプロイ
（すでにgitリポジトリにはなっている前提で）

git push heroku master

## 状態確認
heroku ps
引数はオブジェクトで渡したいが、普通に順番に並べて渡したりもしたい

* APIとしては基本的に引数はオブジェクトで渡したい
* 必須の引数が1個とか2個のときにはオブジェクトで渡すのは面倒
* 内部的にはオブジェクトで渡されると面倒

という感じで試行錯誤してみたらこんなかんじに。
`getParams`は[JavaScript - 関数の引数名を取得する - Qiita [キータ]](http://qiita.com/chick307/items/1902fb32d252310d516d)から借りました。

```js
function getArguments(args, propertyNames) {
  if (Object.prototype.toString.call(args[0]) === '[object Object]') {
    var params = args[0];
    return propertyNames.map(function(name) {
      return params[name];
    });
  } else {
    return args;
  }
}

function defun(propertyNames, fn) {
  if (typeof propertyNames === 'function') {
    fn = propertyNames;
    propertyNames = getParams(fn);
  }
  return function() {
    return fn.apply(this, getArguments(arguments, propertyNames));
  };
}

var foo = defun(['a', 'b', 'c'], function(a, b, c) {
  console.log(a, b, c);
});

foo(1, 2, 3);
foo({a: 1, b: 2, c: 3});

var bar = defun(function(a, b, c) {
  console.log(a + b + c);
});

bar(3, 4, 5);
bar({a: 6, b: 7, c: 8});
```

最近話題のSweet.jsでマクロ化してしまうというのありかもしれません。
Qiitaの自分の投稿の直近100件から、特定のタグを含む投稿を抽出してMarkdownとして整形するスクリプト


以下の様なリンク集を作るスクリプトです

```markdown
2013-12-27 [Go言語: 単体テストの始め方！Gospelを使ってBDDをやってみよう](http://qiita.com/suin/items/71f28f06e7a49414cc93)
2014-01-06 [Go言語：単体テストを複数のパッケージに対して実行する](http://qiita.com/suin/items/850b39625c92437d2362)
2014-01-06 [[教えて]Go言語:なぜインターフェイスはポインタにできない?](http://qiita.com/suin/items/68ed7020d21dca047a73)
2014-01-07 [Go言語:変数が関数かどうかを返す関数](http://qiita.com/suin/items/468108496cd0dc002f64)
2014-01-07 [Go言語:メソッドの引数の型を調べる方法](http://qiita.com/suin/items/ec2070fde6700ffc4a7f)
2014-01-08 [Go言語:自分のライブラリをGitHubで公開する方法+drone.ioで継続的インテグレーション](http://qiita.com/suin/items/1237f210ef9e81b6475d)
2014-01-10 [Go言語:Riakに書き込む](http://qiita.com/suin/items/942773fd059272825eb8)
2014-01-11 [動的言語だけやってた僕が、38日間Go言語を書いて学んだこと](http://qiita.com/suin/items/22662f43b6a6e8728798)

```

```
<?php

$tag = 'go'; // 探すタグ

$filename = 'https://qiita.com/api/v1/users/suin/items?per_page=100';

$contents = file_get_contents($filename);

$items = json_decode($contents, 1);

$items = array_filter($items, function (array $item) use ($tag) {
	foreach ($item['tags'] as $_tag) {
		if (strtolower($_tag['name']) == $tag) {
			return true;
		}
	}
	
	return false;
});

$items = array_map(function (array $item) {
	return [
		'url' => $item['url'],
		'title' => $item['title'],
		'created_at' => $item['created_at'],
	];
}, $items);

usort($items, function ($item1, $item2) {
	$created1 = new DateTime($item1['created_at']);
	$created2 = new DateTime($item2['created_at']);
	
	return ($created1 >= $created2) ? 1 : 0;
});

$markdown = '';

foreach ($items as $item) {
	$date = new DateTime($item['created_at']);
	$markdown .= sprintf('%s [%s](%s)', $date->format('Y-m-d'), $item['title'], $item['url']). PHP_EOL;
}


echo $markdown;

```
Issue を Pull Request に

### hub を使う
https://github.com/github/hub

```
$ brew install hub
```

### .zshrc とか、お使いのターミナルのrcに1行追加

```
$ eval "$(hub alias -s)"
```

rcを再読み込みして

```
$ source ~/.zshrc
```

### Issue を ぷるりにしよう

```
$ git pull-request [branch名] -i [issue番号]
```
例） fix_branch というブランチで #133 の Issue を pull requestにする

```
$ git pull-request fix_branch -i 133
```

- 考えてみれば当たり前なのだが、ブランチをpushしてからじゃないとできない（ちょっとハマってた…
- あとこの場合、ぷるりを送った人は、元のIssueを立ち上げた人ということに形式上、なる。

### 追記

これ叩いた時のログを良く読んだらこう書いてあった。

```
Warning: Issue to pull request conversion is deprecated and might not work in the future.
```

なんかGitHub的にはあんましよくないから近々この機能なくなるかもってことなのだろうか…。
えー、便利なのに…

はぶよ( ˘ω˘)"
WordPressにおけるパーミッション設定などの試行メモ　〜プラグインがインストールできない〜

WordPressでとにかく行き詰まって頭にくるのがパーミッションの設定。
今回も様々に行き詰まったので、主な解決法をメモしておく。

# FTPを経由しないでプラグインをインストールする
管理画面からプラグインをインストールしようとすると、場合によってはFTPのアカウントを入力しろとか云々という画面が出る。
サーバの設定によるが、FTPのアカウント、パスワードを適切に入力することによって、通るケースもあった。
（もちろんFTPクライアントでも、生の？FTPを使って通る）
しかし、sshログインによるFTP（22番ポート、SFTP）を使っていたりすると、とたんに通らなくなる。
そこで、FTP情報入力画面を経由しないでインストールする方法を試してみる。

[WordPress FTPなしでプラグインダウンロードできる設定](http://qiita.com/mzdakr/items/41d64e5d79557b8de6ef)
[WordPress プラグインの自動インストール・アップグレードができない。](http://blog.doli.jp/blog/2012/post588/)

この場合は、wordpressフォルダ以下、オーナーはapache実行ユーザでなくても良いが、グループをapache実行ユーザ（私の場合はwww-data）に、パーミッションを775にしておかなければならない。

# sshアップローダを使う
私自身は結局使わなかったが、一応メモしておく。
ssh経由のプラグインアップローダ、のプラグインがあるようだ。
もちろん、管理画面からプラグインがインストール出来ないのだから、このプラグインはターミナルからsshで入ってwordpress>wp-content>pluginsにアップロードする必要がある。
[SSH SFTP Updater Support](http://wordpress.org/plugins/ssh-sftp-updater-support/installation/) 
インストールして有効化すると、管理画面のFTP情報入力画面で、SFTPが選べるようになる。

# wordpressフォルダ以下のオーナーをapache実行ユーザにする
最も手っ取り早い方法と思われる。FTP云々の画面も現れなくなる。
[「要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。 」って怒られた](http://qiita.com/hyperkinoko/items/bb332e592f620ee99e68)

```zsh:
sudo chown -R www-data:www-data wordpress
```

これは逆に、手作業でのアップロードの際に、ファイル書き込みができなかったり、フォルダ操作ができなかったりするので、その点は注意が必要。


****

結局、私は1番目の解決法を選びました。
色々試してみてください。
RubyのNet::HTTPにおけるHTTP Compressionサポート

Net::HTTPには空気を読んで自動的に[HTTP compression](http://en.wikipedia.org/wiki/HTTP_compression)を有効にして通信する機能がある。

リクエストのヘッダーに`accept-encoding`や`range`を設定しなければ、自動的に`accept-encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3`がセットされ、圧縮されたレスポンスは自動的に展開される。Net::HTTPを内部で使っているライブラリ（open-uriや、faradayのNet::HTTPのアダプターなど）も`accept-encoding`や`range`をセットしていなければHTTP Compressionに対応している。

ただし、1.9.3でこの機能が有効になるのはNet::HTTP#getを使用するときだけ。Net::HTTP.getやNet::HTTP::Get（open-uriはこれを使っている）などを使う場合は有効にならない。[faradayのNet::HTTPアダプター](https://github.com/lostisland/faraday/blob/40bee8fed7a0f88cd2bf9158d3e9369932e0fb56/lib/faraday/adapter/net_http.rb#L77-L78)は可能ならNet::HTTP#getを使うようになっている。2.0以降はすべての場合でHTTP Compressionが有効となる。

## 関連するコミットログとissue

* [Automatically inflate gzip and deflate-encoded response bodies.](https://github.com/ruby/ruby/commit/b1a0509b5465ce77f52e0384159237889a8d60ec#diff-5c08b4ae27d2294a8294a27ff9af4a85)
* [Do not handle Content-Encoding when the user sets](https://github.com/ruby/ruby/commit/f58d39807541d8f50ba682183ab9097ddcb52698#diff-5c08b4ae27d2294a8294a27ff9af4a85)
* [Feature #6494: Send Accept-Encoding for all HTTP requests - ruby-trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/6494)
* [Feature #6492: Inflate all HTTP Content-Encoding: deflate, gzip, x-gzip responses by default - ruby-trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/6492)

## ドキュメント

* [Class: Net::HTTP (Compression)](http://ruby-doc.org/stdlib-2.1.0/libdoc/net/http/rdoc/Net/HTTP.html#class-Net::HTTP-label-Compression)
* [Class: Net::HTTP (public instance methods:get)](http://ruby-doc.org/stdlib-2.1.0/libdoc/net/http/rdoc/Net/HTTP.html#method-i-get)

## 検証に使ったコード

```rb
require 'webrick'
require 'open-uri'
require 'thread'
require 'pp'

uri = URI("http://127.0.0.1:9292/")

Thread.new do
  server = WEBrick::HTTPServer.new(BindAddress: uri.host, Port: uri.port)
  server.mount_proc(uri.path) do |req, res|
    pp req.raw_header
    res.body = "foo"
  end
  server.start
end

sleep 1

header = {}

open(uri.to_s, header.merge("User-Agent" => "open-uri"))
Net::HTTP.start(uri.host, uri.port){|h|
  h.get(uri.path, header.merge("User-Agent" => "Net::HTTP#get"))
}
```

---

<p>
  This document is licensed under
  <a rel="license"
     href="http://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.
</p>
fast forward mergeが可能かどうかを判定する方法

`git-rev-list` を使うと2つのリビジョン間の差分が分かります。この例の場合はmasterからみてorigin/masterが1つ先にあることを意味します。

```bash
% git rev-list --count master..origin/master
1
```

これを応用するとfast forwardかどうかを判定することができます。

```bash
% git rev-list --count branch..master
0
```

これはbranchからみてmasterがどれだけ先にあるかを返します。これが0であるということはbranchがmasterに至るために必要なコミットが存在しないという意味なので、fast forwardなmergeが可能であることが分かります。
RailsのAssets Pipelineや静的ファイルがうまく動かないときにチェックすべき項目

新しいRailsプロジェクトを作ると、よくAssets Pipelineや静的ファイルのホストあたりでうまくいかず悲しい思いをするのでぼくがよくぶつかった問題をまとめておきました。主に、「developmentではうまくいくのにproductionでうまくいかない」場合のことを書きます。

## assets/ 以下においた javascripts, stylesheets がコンパイルされない

特に何も考えず開発すると、 application.js, application.css のみがコンパイル対象になり、読ませたいファイルはここからrequireしていく必要があります。requireされていないもので assets/ の中に勝手においたものはコンパイルされません。 javascript, stylesheet 以外はすべてコンパイルされますので画像は勝手において大丈夫です。

## public/ 以下においた静的ファイルが認識されない

[Rails4＋Herokuでは何も考えないとこの現象になる気がします](https://devcenter.heroku.com/articles/rails4)。また、（ApacheやNginxを使っていない場合と思いますが、）Railsのアプリケーションサーバに静的ファイルを配信したい場合は、config/environments/production.rbに下記を設定する必要があります。

```ruby
serve_static_assets = true
```

ただ、静的ファイルが見つからない場合に全部アプリケーションサーバに問い合わせが飛ぶのであまりよろしくはないです。

フィードバック歓迎です！
日本のガラスマでrootを取らずにMVNO回線にbluetoothテザリングできるかもしれない方法メモ

日本のガラスマはアホなことにテザリングするとAPNがビルトインの隠された設定に変更されてしまうのでroot取って書き換えでもしない限りMVNOのSIMな回線へテザリングできない。しかしbluetoothテザリングならできる。で、それができるアプリはすでにあるんだけど、結構面倒なので自前で簡単に使える専用アプリを作れないか考えてみたメモ。実質的な方法はおそらく現行の方法と同じ。

###サーバ側

1. bluetoothのサーバソケットを待ち受け
1. L2TPを分解、データだけ取り出した上で同種、同ポートのソケットへ転送(クライアントから転送されてくるソケットが新規ならソケットを作成、切断あるいはタイムアウトしたらソケットを削除するなどソケットを管理する必要がある)

###クライアント

1. L2TPあたりのサーバソケットを待ち受け
1. VPNクライアントを自分に向けて設定
1. bluetoothクライアントソケットとL2TPサーバの間を転送

動作的にはVPNを装ったProxyってとこ。
...って思ったんだけど、L2TP単体の接続って設定できなかったりするみたい。
同一機器内でIPSecとかアホらしいけど仕方がなさそう。
OS X コマンドライン版cc (Clang LLVM cc)のインストール方法 (Xcode CLI / Command Line Tools for Xcodeのインストール)



Xcode GUIインストール不要でBoxenをインストールする準備。
***
※以下の手順の前にADC (Apple Develoer Connection)には登録済みとする。

##ダウンロードとインストール
1. https://developer.apple.com/downloads/
を開く。
![kobito.1389416179.886084.png](https://qiita-image-store.s3.amazonaws.com/0/13514/c239ce90-7629-db3c-c817-05370d6d19a0.png "kobito.1389416179.886084.png")
2. 検索窓に「xcode」と入力する。
3. 検索結果から

> Command Line Tools (OS X Mountain Lion) for Xcode - October 2013

とか

> Command Line Tools (OS X Marvericks) for Xcode - Late October 2013

を選択。
4. アイコンをクリックしてファイルをダウンロードする。
5. dmgを開いてインストーラを起動。
6. 使用許諾を読んで同意したらインストールする。
![kobito.1389416539.232677.png](https://qiita-image-store.s3.amazonaws.com/0/13514/771d4e88-c1dd-c755-5637-9c18cc51d505.png "kobito.1389416539.232677.png")
7. 途中でsudoパスワードを聞かれるので入力する。

![kobito.1389416669.268595.png](https://qiita-image-store.s3.amazonaws.com/0/13514/147e449f-a6ab-e4db-b605-3ba71b50711b.png "kobito.1389416669.268595.png")

##確認
8. terminalを起動する。

```bash:
$ cc --version
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.4.1
Thread model: posix
```

インストール完了。

##アンインストール
念のためにアンインストール方法も。

> もしも、Xcode GUIもインストール済みの場合は、以下でツール削除。[出典](https://discussions.apple.com/thread/3784638?tstart=0)
> 
> ```bsah:
> $ sudo /Developer/Library/uninstall-devtools --mode=all
> ```

1. terminalを起動する。
2. インストール済みのファイルを確認。

```bash:
$ sudo lsbom /var/db/receipts/com.apple.pkg.DeveloperToolsCLI.bom
``` 
3. 削除する

```bash:
$ cd /
$ sudo lsbom /var/db/receipts/com.apple.pkg.DeveloperToolsCLI.bom | awk -e '{print $1}'|xargs -s 2048 sudo rm

```

上と同じ方法の削除ツール。[yoneken / remove_CLI_tools.sh](https://gist.github.com/yoneken/3284561)
実行方法

```bash:
curl "https://gist.github.com/yoneken/3284561/raw/db665bb64f93e38ce138b5ca620b9edd18dc31e4/remove_CLI_tools.sh" | sudo sh
```
iOS7移行ガイドの公式日本語訳が面白い


Apple公式の日本語訳がかなりひどいので面白い。訳した人がテクニカルタームと気付かず想像で書いてしまっている。
他にもあるだろうから見つけ次第追記していきたい。

# iOS7から追加されたViewControllerのプロパティの説明がひどい

[外観および動作](
https://developer.apple.com/jp/devcenter/ios/library/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW2)の項目でUIViewControllerのautomaticallyAdjustsScrollViewInsetsプロパティの説明が面白い

```
automaticallyAdjustsScrollViewInsets

スクロールビューの装飾（立体的にくぼんだような表示）は自動調整されますが、これが望ましくない場合は、automaticallyAdjustsScrollViewInsetsをNOと設定してください（automaticallyAdjustsScrollViewInsetsのデフォルト値はYES）。
```

[訳される前のiOS 7 UI Transition Guide](https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1)は

```
 automaticallyAdjustsScrollViewInsets

If you don’t want a scroll view’s content insets to be automatically adjusted, set automaticallyAdjustsScrollViewInsets to NO. (The default value of automaticallyAdjustsScrollViewInsets is YES.)
```

これ普通に読むと「スクロールビューのcontent insetsが自動的に調整されるのが嫌ならNOにしたらいい（デフォルトはYES）」としか書いてない。

content insetsはUIScrollViewのcontentInsetsのことなんだけど、意味を理解しないまでもそのまま「コンテンツの余白」と訳してもらったほうがまだ分かりやすい。それを「装飾（立体的にくぼんだような表示）」とか実際のiOS7とは違う訳者の勝手な想像が混じってて混乱させられる。あれ立体的にどこがくぼんでんのかなーとか思ってしまった。
OMakeでSphinxを自動継続ビルドしてみよう

* [映像奮闘記: OMakeでSphinxを自動継続ビルドしてみよう](http://mglab.blogspot.jp/2009/11/omakesphinx.html)の記事を参考に実践してみた。

Omakeを[download](http://omake.metaprl.org/download.html)しインストール。

```bash:
$ omake --install
```

OMakefileを以下の内容に書き換える。

```conf:OMakefile
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_a4) $(SPHINXOPTS) .

SRCS = $(glob *.rst)

.DEFAULT: $(SRCS)
    $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
```

```bash:ファイルの変更を監視し自動ビルド
$ omake -P --verbose
```

rstファイルを書き換えてビルドが実行されることを確認。
sweet.jsでshift/reset: 限定継続を使ってコールバック地獄から抜け出す

![sweetjs_shift_reset.png](https://qiita-image-store.s3.amazonaws.com/0/10690/7b454277-6524-b523-cdf5-f65296f6fe5e.png)

ブログの方に書きました。
[sweet.jsでshift/reset: 限定継続を使ってコールバック地獄から抜け出す -- 標高+1m](http://ympbyc.hatenablog.com/entry/2014/01/11/sweet_js%E3%81%A7shift/reset%3A_%E9%99%90%E5%AE%9A%E7%B6%99%E7%B6%9A%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E5%9C%B0%E7%8D%84%E3%81%8B%E3%82%89%E6%8A%9C)