OmniAICreator/Qiita-1.07M huggingface dataset:
WordPress で記事プレビュー画面がリダイレクトループする件

WordPress でリダイレクトループってもはやあるある過ぎて・・・

「WordPress アドレス (URL)」と「サイトアドレス (URL)」を変えただけでもリダイレクトループにはまるケースがありますが、今回はまた別の要因。

# Summary

- WordPressの記事投稿プレビューが見れなかった
- リバースプロキシかけてリクエストURI変えると事故りますよ注意してね


# Details
## プレビューが見れない

管理画面で記事を投稿する際、右カラムに「プレビュー」というボタンがあります。
ここを押した時、本来であれば現在投稿している記事のプレビューが見れるはずなのですが・・・

見れないと。Chrome の Network で見てみると、どうやらリダイレクトループしていると。

## なんで？

あろうことか 301 リダイレクトをしてくれているので、301 で検索した所見事に引っかかりました。

```wp-includes/canonical.php
446   $redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url );
447 
448   if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
449     return false;
450 
451   if ( $do_redirect ) {
452     // protect against chained redirects
453     if ( !redirect_canonical($redirect_url, false) ) {
454       wp_redirect($redirect_url, 301); // <= こいつ
455       exit();
456     } else {
457       // Debug
458       // die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) );
459       return false;
460     }
461   } else {
462     return $redirect_url;
463   }
```

どうも正規化をしてくれているはずの箇所で、どうも誤判定している？
しかしちょっと待て、ちょっと上を見てみると・・・ 

```php
448   if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
449     return false;
```

ご丁寧に書いてくださってるではないか。
`request_url` と `redirect_url` がどっかのタイミングで別物になってるからいつまで経ってもここを抜けだせないのね。

原因を遡ると・・・

```wp-includes/canonical.php
 45   if ( !$requested_url ) {
 46     // build the URL in the address bar
 47     $requested_url  = is_ssl() ? 'https://' : 'http://';
 48     $requested_url .= $_SERVER['HTTP_HOST'];
 49     $requested_url .= $_SERVER['REQUEST_URI'];
 50   }
```

お前か。`$request_url`を自動作成しやがって。

## 原因は？

リバースプロキシがそもそもの原因でした。

訳あってwebサーバA からプロキシかけてwebサーバB（WordPress）に飛ばしていたのですが、その際に rewrite かけて リクエストURI を変えてしまっていたのが問題。

という訳で、泣く泣く webサーバB 側でゴニョゴニョするハメに・・・。
GitのTips。

o git commitしたコミットをやり直す。
あるファイルを修正している途中に、依存関係があるファイルのコミットが行われ、それを反映したい時、今あるファイルの修正をいったんgit commitしてからでないとgit pullできない。が、本当はまだgit commitできる状態ではないので、このコミットを取り消す。といった場合によくやっている。きっともっとまともなやり方があるはずだが残念ながら知らない。
- git reset --soft
ワークツリーの内容はそのままでコミットだけを取り消す。
- git reset --hard
コミットを取り消して、かつワークツリーのの内容も戻す。
processingでellipseを使わないで円を書く

```sketch.pde
size(500,300);
background(255);
strokeWeight(5);
smooth();

float radius = 100;
int centX = 250;
int centY = 150;

stroke(0,30);
noFill();
ellipse(centX,centY,radius*2, radius*2);

stroke(220,50,70);
radius = 10;
float x,y;
float lastX = -999;
float lastY = -999;
for (float ang = 0; ang <= 1440; ang += 5){
	radius += 0.5;
	float rad = radians(ang);
	x = centX + (radius*cos(rad));
	y = centY + (radius*sin(rad));
	if (lastX > -999){
		line(x,y,lastX,lastY);
	}
	lastX = x;
	lastY = y;
	lastY = y;
}
```
Facebook, Twitter, Instagram等がどうやってIDを生成しているのか まとめ

### まえがき

データにIDを持たせたいとき、単純な方法としては、DBの提供するauto incrementを使う場合や[UUID](http://ja.wikipedia.org/wiki/UUID)を利用することがある。それぞれの方法の利点欠点は以下の通り。

##### データベースのauto incrementを使う場合
利点: 
特別な実装が必要ない

欠点: 
DBを1台で運用するとデータベースがパフォーマンス・障害のボトルネックになる
DBを二台にするとIDのユニークさや順序の保証が困難

##### UUID(v4)<sup><a href="#1" name="#1-ret">※1</a></sup>を利用する場合
利点:
分散環境で各々がIDを生成しても衝突しない
IDを公開したくない場合に、推測されにくいIDを生成できる

欠点:
128ビット必要、DBのインデクシングやプログラミング言語で扱うときに不利なことがある
IDから時間の情報が失われる、例えば2つのIDを比べてどちらが古い投稿か判断できない

---- 

### 世界の大企業がどうしてるか

調べてみると多くの企業がブログなどで自分たちのやり方を公開していた。

大きく分けて２通りの方法があった

- Twitterのsnowflakeに端を発するタイムスタンプから一意なIDを生成する方法
- Facebook, FlickrのDBごとに利用できる値の範囲を区切った上でauto incrementを利用する方法

各社のやり方を以下にまとめる。

### Twitter
[snowflake](https://github.com/twitter/snowflake/)をOSSとして公開 (現在は非公開)
タイムスタンプに基づいて一意なIDを生成するためのプログラム、専用サーバーでの動作を想定
[日本語解説スライド](http://www.slideshare.net/moaikids/20130901-snowflake)
タイムスタンプ、マシンID, 同一マシン内でのシーケンスIDを元に64ビットの一意なIDを生成

- IDから時系列比較可能
- IDから時間の復元が可能
- 69年でオーバーフロー

#### SmartNews
[Twitterのsnowflakeを参考にRedis+Luaでshakeflakeを開発し運用](http://developer.smartnews.be/blog/2013/07/31/shakeflake-is-a-tool-for-generating-unique-id-numbers/)

### Instagram
http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram
Twitterのsnowflakeを参考にPL/PGSQL (PostgreSQLでサポートされるプログラミング言語)で独自に実装
DBのテーブルをいくつかの論理的な[shard](http://en.wikipedia.org/wiki/Shard_(database_architecture))に分けた上で

- タイムスタンプ
- テーブルのshard ID
- 同一テーブル内でのauto incrementする値のmod

をもとに64bitの数を生成

### Flickr
http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/
Ticket serverというのを運用している
これはMySQLのauto increment機能を使ってユニークなIDを発行する専用のサーバー
MySQLのreplace intoクエリを使って、DB上の一つのデータをひたすら上書きしつつ、auto incrementされたIDのみを取得
負荷分散のために2台のticket serverをround robinで回している
2台のticket serverはそれぞれ偶数と奇数を担当

結構単純というか愚直っぽい戦略。"dumbest possible thing that will work (動作する最も単純なやり方)"というFlickrのモットーの現れなんだ、とのこと

### Facebook
分散環境に対応できるように、MySQLサーバがあらかじめ利用できるIDのプールを持っておく、その上でauto_incrementを利用

出典: [QuoraでHarrison Fisk (FBのDBパフォーマンスチーム所属)が回答](http://www.quora.com/How-does-Facebook-generate-unique-IDs-across-all-of-their-models)


---------
#####注釈

※1. 投稿時には単にUUIDとしれっと書いてましたが、[UUIDは1から5までのバージョンがあり、バージョンごとに特性が異なります](http://en.wikipedia.org/wiki/Universally_unique_identifier)。
rubyの[SecureRandom.uuidはversion 4のUUIDを返す](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html#method-c-uuid)ため、暗にv4を想定した書き方になってましたが、
UUID v1は時間とMACアドレスを元にIDを生成するため、上記のInstagramの方法などと近く、
ランダム性がなく時間の情報を残した形になっています
<a href="#1-ret" name="1">↩</a>
FlashのASC2での条件付きコンパイルでハマったこと

Adobe Flex 4.6使ってたのをApache Flex 4.11に変更したら一部のソースがコンパイルできなくなりました。
どーもコンパイラが変わったようで、それが原因っぽいです。

エラーがこんな感じで原因不明でした。環境はFlashDevelop4.6です。

    Error: Sanity Failed
    Build halted with errors (fcsh).

しらみつぶしにソースを減らしていって、以下のような記法がダメなことがわかりました。

    CONFIG::DEBUG import jp.foo.bar;

そんで、以下のように直したら、コンパイルできました。

    CONFIG::DEBUG
    {
        import jp.foo.bar;
    }


もしかして、最初の記法が間違ってたのかな? (´・ω・｀)
BroadcastReceiverの処理結果を受け取る方法


# BroadcastReceiverの処理結果が取れる？
ある日、`BroadcastReceiver.setResult()`があることに気がついた。
ずっとBroadcastの結果は取れないものだと思っていたが、`Context.sendOrderedBroadcast()`を使用することでその結果を受け取ることができるようだ。

# 概要
大まかな処理手順はこうだ。
まず、`sendOrderedBroadcast()`では`BroadcastReceiver`がその優先順位にしたがって呼び出される。
それぞれの`BroadcastReceiver`は`onReceive()`の最後に`setResult()`によって処理結果を**追記**する。
`sendOrderedBroadcast()`では一番最後に処理を行う`BroadcastReceiver`を直接指定することができるため、その`onReceive()`の中で`getResultCode()`,`getResultData()`,`getResultExtras()`を参照することですべてのBroadcastの最終的な処理結果を受け取ることができる。

# 優先順位設定
Broadcastの優先順位は`IntentFilter.setPriority()`で行う。
数字の大きいものが優先度が高く、デフォルトは0。
おそらく`IntentFilter.SYSTEM_HIGH_PRIORITY`から`IntentFilter.SYSTEM_LOW_PRIORITY`の間で設定したほうが良いと思う。

````java
BroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MY_ACTION);
// 優先度を高めに設定
intentFilter.setPriority(100);
registerReceiver(receiver, intentFilter);
````

# BroadcastReceiverの実装
`BroadcastReceiver`側の処理は`setResult`系の処理をする事以外は何もしなくて良い。
先に実行された`BroadcastReceiver`の処理結果は`getResultCode()`,`getResultData()`,`getResultExtras()`で取得できる。
**setResult()した場合、値はすべて上書きされることに注意**

````java
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // onReceive処理

        // 前のBroadcastReceiverの判定を引き継ぐ
        setResultCode(getResultCode());

        // Extrasに何か入れてみる
        // 引数をtrueにするとnullの場合自動生成してくれる
        Bundle extras = getResultExtras(true);
        extras.putString("key", "value");
        setResultExtras(extras);
    }
````

何らかの理由で以降の`BroadcastReceiver`を実行しないようにするには`abortBroadcast()`で以降のBroadcastに処理が伝達されないようにすれば良い。
ただし、確実に止められるのは自分より優先度が低い`BroadcastReceiver`のみとなる。
優先度が等しい`BroadcastReceiver`は自分より前に実行されている可能性があるため。

````java
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // onReceive処理

        if(FAILED){
            // 失敗したのでこのReceiverで処理を終了したい

            // RESULT_CANCELEDにするのが良いかも？
            setResultCode(Activity.RESULT_CANCELED);

            // これより優先順位が低いBroadcastReceiverは実行されない
            abortBroadcast();
        }
    }
````

# Broadcastの送信
`Context.sendOrderedBroadcast()`は2種類あるが、処理結果を扱えるのは[1種類](http://developer.android.com/reference/android/content/Context.html#sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle))だけだ。
引数が多いが、第3引数の`resultReceiver`が最後に実行される`BroadcastReceiver`になる。`initial〜`系の引数は処理結果のデフォルト値を格納する。

````java
public abstract void sendOrderedBroadcast (Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
````

結果は当然、`resultReceiver`に指定した`BroadcastReceiver`で受け取る。
`abortBroadcast()`された場合でも`resultReceiver`は実行されるようだ。
(`IntentFilter`でBroadcastを受信しているわけではないので当然か)

````java
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // 処理結果
        getResultCode();
        getResultData();
        getResultExtras(false);
    }
````

# まとめ
便利そうだけど使い道が思いつかない。
システムならともかく、アプリでどう使うべきなんだろう。
iOS8でUIAlertViewはこうやってUIAlertControllerに置き換える

iOS8対応をするに至って`UIAlertView`を`UIAlertController`に置き換えなければいけないのでメモ。

Objective-Cだと、こう。

```objc
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"タイトル" message:@"メッセージ" preferredStyle:UIAlertControllerStyleAlert];

[alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    // ボタンが押された時の処理
}]];

[self presentViewController:alert animated:YES completion:^{
    // 表示完了時の処理
}];
```
あとはOSのバージョンとかで分岐すればOK。


ちなみにSwiftだと、こう。

```swift
var alert:UIAlertController = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: {
    // ボタンが押された時の処理
}))

self.presentViewController(alert, animated: true, completion: {
    // 表示完了時の処理
})
```
Objective-Cよりもシンプル。


ボタンの追加も分かりやすいし、何よりデリゲートで処理しなくてよくなったのはめちゃくちゃ良いと思う。
Array#count の実行時間について


気になったので調べた。
検証コードはこんな感じ

```ruby
array_size = ARGV[0].to_i

cup = array_size.times.inject([]){ |cup, i|
  cup << Random.rand(0..(i+1))
}

t1 = Time.now.usec
cup.count
t2 = Time.now.usec - t1

p "size : #{array_size} .. Time : #{t2}μs"
```

なんか雑だけどまぁそんな感じ。で、わかったこと

|array_size|μs|
|:--|--:|
|10|4|
|100|4|
|1,000|3|
|10,000|7|
|100,000|6|
|1,000,000|6|
|10,000,000|9|
|100,000,000|8|

後半は配列を生成するほうが時間かかって辛い。
で、だいたい直感的には **#count** の実行時間(計算量？)はあんまり爆発しない。
詳しいこと(*O()とか*)とか知ってる方いたら、教えてください。


---
riocampos さん、ms -> us 修正ありがとうございます。
Shell Script で exif 情報から GPS の緯度/経度情報を削除する

例によって blog からの転載です。

写真などの Exif 情報から GPS の緯度/経度情報を削除するための Shll Script です。
Shell Script だって *無理すれば* バイナリデータを編集できるという事を示したモノで、殆どネタとしか思えない様なスクリプトになっていますが、シェルスクリプトでバイナリデータを扱うさらにもう一つの方法なので参考になればと思い投稿してみます。

処理内容は、画像ファイルに格納されている Exif 情報を簡単に解析して GPS 情報を格納している領域 (GPSInfoIFD) から緯度/経度情報だけをゼロに置換する処理となっています。

```sh
#!/bin/sh

#
# Endian を考慮して 4 バイト数字を取得する
#   一度 od(1) で 16 進数に変換しバイト並びを修正した後に 10 進数に変換する
#
#   $1: ファイル
#   $2: オフセット
#
get4Byte()
{

    if [ ${endian} = "MM" ]
    then
        printf "%d" `dd if="${1}" bs=1 skip=${2} count=4 2> /dev/null | od -x |
            sed -n "s/^0000000 *\(..\)\(..\)[   ]*\(..\)\(..\)/0x\2\1\4\3/p"`
    else
        printf "%d" `dd if="${1}" bs=1 skip=${2} count=4 2> /dev/null | od -x |
            sed -n "s/^0000000 *\(..\)\(..\)[   ]*\(..\)\(..\)/0x\1\2\3\4/p"`
    fi
        

}

#
# Endian を考慮して 2 バイト数字を取得する
#   一度 od(1) で 16 進数に変換しバイト並びを修正した後に 10 進数に変換する
#
#   $1: ファイル
#   $2: オフセット
#
get2Byte()
{

    if [ ${endian} = "MM" ]
    then
        printf "%d" `dd if="${1}" bs=1 skip=${2} count=2 2> /dev/null | od -x |
            sed -n "s/^0000000 *\(..\)\(..\)/0x\2\1/p"`
    else
        printf "%d" `dd if="${1}" bs=1 skip=${2} count=2 2> /dev/null | od -x |
            sed -n "s/^0000000 *\(..\)\(..\)/0x\1\2/p"`
    fi

}

#
# 任意の長さの文字列を取得する
#
#   $1: ファイル
#   $2: オフセット
#   $3: 文字列長
#
getString()
{

    dd if="${1}" bs=1 skip=${2} count=${3} 2> /dev/null

}

#
# GPSInfoIFD の解析を行い緯度/経度情報をクリアする
#
#   $1: ファイル
#   $2: GPSInfoIFD のタグ数
#   $3: GPSInfoIFD のオフセット位置
#
gps()
{

    local   i   j   offset  tag val

    i=0

    while [ ${i} -lt ${2} ]
    do
        # GPSInfoIFD のタグ情報
        offset=`expr ${3} + 14 + \( ${i} \* 12 \)`
        tag=`get2Byte "${1}" ${offset}`
        # タグ種類
        #   2: 緯度
        #   4: 経度
        if [ ${tag} -eq 2 -o ${tag} -eq 4 ]
        then
            # データの数とデータのオフセットを取得
            # 緯度/経度情報は値のタイプに RATIONAL(8バイト長) が指定されている
            num=`get4Byte "${1}" \`expr ${offset} + 4\``
            val=`get4Byte "${1}" \`expr ${offset} + 8\``

            # 情報を削除するためにオフセットから 8 * データの数をゼロクリア
            dd if=/dev/zero of="${1}" bs=1 conv=notrunc \
                seek=`expr ${val} + 12` count=`expr ${num} \* 8` 2> /dev/null
        fi
        i=`expr $i + 1`
    done

}

#
# 0th IFD データの解析処理
#
#   $1: ファイル
#   $2: 0th IFD のタグ数
#
ifd()
{

    local   i   offset  count   position

    i=0

    while [ ${i} -lt ${2} ]
    do
        # 0th IFD のタグ情報
        offset=`expr 22 + \( ${i} \* 12 \)`
        # GPSInfoIFDPointer の場合はオフセットとタグ数を取得
        if [ `get2Byte "${1}" ${offset}` -eq 34853 ]
        then
            position=`get4Byte "${1}" \`expr ${offset} + 8\``
            count=`get2Byte "${1}" \`expr ${position} + 12\``

            gps "${1}" ${count} ${position}
        fi
        i=`expr $i + 1`
    done

}

# 処理開始
if [ "`getString "${1}" 6 4`" = "Exif" ]
then
    endian=`getString "${1}" 12 2`

    ifd "${1}" `get2Byte "${1}" 20`
fi
```

###実行結果###

| 処理前 | 処理後 |
|:-----:|:-----:|
|  ![処理前](http://blog.bsdhack.org/entries/images//before.jpg)  |  ![処理後](http://blog.bsdhack.org/entries/images//after.jpg) |
DxPortLibを使ってマルチプラットホームゲーム開発

#DxPortLibとは
mauvecowさんが開発したマルチプラットホームなゲーム開発ライブラリです。(https://github.com/mauvecow/DxPortLib)
Windowsではおなじみのゲーム開発用ライブラリDxLibと同じ関数、構造体を使うことができます。

MacやLinuxなどでC++やCでゲーム開発しようとすると、今までOpenGLやSDLをいじる
必要がありましたが、このライブラリを用いることにより比較的簡単なDxLibと同じような
感じで開発できるようになります。(最近は現代的で使いやすいSiv3Dなども出てきているようですが、Linuxのサポートは今のところ予定されていないようです...)

#Fedoraに導入(たぶんUnix環境ならだいたい同じはず)
##前提条件
あらかじめ次のライブラリが導入されていることが前提です。

- SDL2
- SDL2_image
- SDL2_ttf
- Vorbisfile

また、今回使うツールとしては

- cmake

を使います。当然gccなどのコンパイラも必須です。

##導入
まずは適当なディレクトリにgitから落とします。

```bash
$ git clone https://github.com/mauvecow/DxPortLib.git
```

DxLibPortのライブラリをコンパイルするためにcmakeとautomaketools版が提供されていますが、
今回はcmakeを使います(個人的に慣れているため)
automaketools版の方を用いるとtestまでコンパイルしてくれるようなので気になる方はそちらも試してみてください。

```bash
$ cd DxPortLib/
$ mkdir lib
$ cd lib
$ cmake ..
$ make
```

とここまでして

```bash
$ ls *.so
libDxPortLib.so
```

と出力され確かにライブラリが生成されていることが確認できます。

##動作テスト
とりあえずウィンドウを表示するだけの簡単なサンプル

```cpp
//main.cpp
#include "DxLib.h"

int main(int argc, char **argv) {


    SetUseCharSet(DX_CHARSET_EXT_UTF8);
    SetWindowSizeChangeEnableFlag(TRUE);
    SetWaitVSyncFlag(TRUE);
    SetGraphMode(640, 480, 32);
    
    SetWindowText(_T("DxPortLib Test"));
    
    ChangeWindowMode(TRUE);
    
    DxLib_Init();
    
    while (ProcessMessage() == 0) {
        
        
        WaitTimer(1);
    }
    
    DxLib_End();
    
    return 0;
}
```

ここでも例のごとく簡単のためcmakeをつかってコンパイルします。
次のようにCMakeLists.txtを記述します。

```cmake
cmake_minimum_required (VERSION 2.8)

project(DxPortLibTest)

set(CMAKE_CXX_FLAGS "-std=c++1y")

link_directories( <path_toDxPortLib>/lib/)
include_directories(path_toDxPortLib>/include)

add_executable(a.out main.cpp)

target_link_libraries(a.out SDL2 libDxPortLib.so)
```

最新の機能をつかいたいのでc++1yオプションつけていますが、
マルチプラットホームで開発したいならVSで使えない機能使ってても
きづけないのでc++11あたりにしとくのが無難かもしれません。

あとは

```bash
$ mkdir build
$ cd build
$ cmake ..
$ make
$ ./a.out
```
でウィンドウがでたら成功です。
次期Re:VIEW parserに関するメモ

メモなので適当です。本家にマージされたら本気出す。

# Parserについての変更

## ASTを作る

旧parserでは構文解析と出力生成を別処理に分けずに、正規表現を駆使して解析しながら出力もやっていました。
次期parserではまず最初にParserがASTを作ります。現状はkpegライブラリを利用してます。ASTができた後で出力文字列を生成します。

主な流れは以下の通り。

```
テキストを渡す
　　↓
AST(Nodeクラスのオブジェクト)に変換
　　↓
ASTレベルの変換処理(ASTを別のASTに変換する)を行う
　　↓
文字列化（Node#to_docを再帰的に適用）
```

ASTはReVIEW::NodeクラスのオブジェクトとArrayから成り立っています。
Arrayには`Array#to_doc`と`Array#to_raw`が追加されます。これは、各要素にそれぞれのメソッドを再帰的に適用し、結果を文字列として連結するものです。

JS版との互換性は考慮したいのですが、どうなるかは未定です。

（詳しくはあとで書くかも）

# Builderについての変更

## 各Builderとエスケープについて、Builder内のハンドラ（メソッド）には引数として解析済みの文字列が渡される

旧builderではエスケープというか解析されていない文字列が渡されてきているので、Builderのハンドラ内で追加の解析処理を行っていました。要するにParseをもう一回行うような感じです。それはさすがにアレなので、Parseは一回だけ全体を一度に行うことになります。

問題はParseではなく結果の文字列の生成で、これをどのタイミングで行うかになりますが、結果的にはハンドラ内ではその部分文字列、つまりコマンドブロック内の文字列や引数の文字列については変換後の文字列を受け取るようにします。そうしないといろいろ辛いので。

ただし、変換前の文字列が必要になるものもあります。例えば文字列をIDとして使いたいとか、特殊な文字列（TeX風数式）を渡したい、といった場合に、そこにエスケープ済みの文字列が渡されると辛いことになります（特にLaTeX）。そこで以下が導入されます。

### ハンドラ内でのcompile_inlineなどは削除

上記に付随して、今までハンドラ内でcompile_inlineを使っていたところは修正が必要です。

## ASTを引数とするハンドラを作れるようにする

`//foo` に対して`def foo`で定義していたものが、`def node_foo`というふうになります。
インライン記法については`@<hoge>{}`は`def inline_hoge`だったものが、`def node_inline_hoge`になります。

ただし、とりあえずは古いメソッドも使えるようにします。その場合、ブロック記法ならlinesと各引数のparse済み文字列を引数としたメソッド、インライン記法なら文字列1つを渡すメソッドになります。

fooとnode_fooが両方ある場合、node_fooが優先されます。これにより、node_fooで上書きすることもできる、という形です。

インライン記法の処理については、旧APIはparseが微妙なので、カンマ区切り文字列等を渡すものはAST中心にした方がいいかもしれません（１引数のインライン記法であれば旧APIでも問題なさそう）。

## ブロックのハンドラとインラインのハンドラは文字列を返す＆print/putsは使用不可

旧Builderではハンドラの実装として、putsやprintを使って返すものと、文字列を返すものが混在していましたが、前者は撤廃されます。putsやprintでは出力順序が実行順序に依存してしまうので、これだといろいろ困るのでした。

理由はどうあれ、各ハンドラの仕組みがシンプルになるのはメリットかと。

# 実装上の注意点

## Builder

* compile_inline、escapeは原則削除
* rawの扱いについて、`\n`は改行に、`\\`は`\`に、`\}`と`\]`は'}'と'\]'に（インラインかブロックかで異なる）、それ以外はそのまま

### LATEXBuilder

* 旧パーサでは複数行のparagraph内の改行文字が（実は）残っていた一方で、新パーサでは改行を落とすようにする
    * `foo\nbar\n`といった文字列が、`foobar\n`になる
    * HTMLBuilderではすでにこの挙動だったので、これに合わせる形になる

## Test

* raw_resultは使わない
* helperメソッドを使うようにする？
*
Gitリポジトリの作者メールドメイン別コミット数を集計・可視化する「Git Analysis」


Gitリポジトリのコミットログを元に、作者のメールアドレスのドメイン名別に集計し、コミット数と割合を表示するサイトを作成しました。
これにより、Gitリポジトリをどのような企業が開発しているかおおよそ推測することができます。

### [Git Analysis](http://volanja.github.io/git_analysis/)

## 概要
Gitリポジトリのコミットログを元に、作者のメールアドレスのドメイン名別にコミット数と割合を表示します。
表示ルールは次の通りです。

* コミットログから抽出
* ブランチはclone時の初期ブランチ。
* マージコミット含む。
* メールドメイン別の上位5グループを表示。
* それ以外は「Others」に集約。

例えば、Chefであれば「opscode.com」が最も多いので「現Chef社(旧:Opscode社)」が開発に多く携わっていることが推測できます。
一方でAnsibleであれば「gmail.com」が最も多いので個人開発者が開発に多く携わっていることが推測できます。(開発初期はAnsible社の社員でもgmailアカウントを使っていることもありますが。。)

なお、内部的には[git_analysis](https://rubygems.org/gems/git_analysis)というGemを作成して利用しています。
このGemの紹介もいずれ書きたいと思います。

このGemはGitのコミットログからAuthorのメールアドレスを抽出し、メールアドレスのドメイン別に分類しています。
誰がという意味では`git shortlog -sne`でリスト表示できますが、どのグループかは分かりませんでした。
同様にGithubのContributorsも個人の活動実績が主です。
このGemにより、どの企業がOSSを支えているのか、ということがわかりやすくなったと思います。


## 掲載済みOSS(順不同)
個人的に興味があるGitリポジトリを掲載しています。
自動化できていないので、追加は手動です。
もし要望あれば[Issue](https://github.com/volanja/git_analysis/issues/new)に書いて頂けると対応します。

* Chef
* Ansible
* Riak
* MongoDB(mongo)
* elasticsearch
* Kibana
* ServerSpec
* Fluentd
* Norikra
* jquery

## 掲載予定
* Linux kernel
* KVM
* Ruby

あと、追加/削除行数もGemで取れるので、それも表示したい。

## 作った背景
### ChefはOSSか？
[Chefはオープンソースではない](http://postd.cc/chef-is-not-open-source/)
以前、この記事が話題となっていました。Chefはソースコードを公開しているけれども、その開発手法/エコシステムはOSS的であると言えるのか、という提起でした。
Chefだけでなく、AndroidやMySQLも同様の仕組みで開発が進められていますが、果たして他のソフトウェアなどはどうなのか、gitのログから推測できないだろうか、という疑問がきっかけでした。

### 勤務先での調査
こちらは私的な理由ですが、勤務先でOSSを使用する場合、OSSはどの企業が主に作成しているのか、または個人開発者の集合なのか調査したい場合がたまにあるので。。
Pythonでキー入力

先日ブログで公開した内容をQiitaにも。
~~詳しくは[ブログ](http://fantmsite.heteml.jp/blog/2014/08/python%E3%81%A7%E3%82%AD%E3%83%BC%E5%85%A5%E5%8A%9B/)に掲載しています。~~(ブログは公開終了しました)

Pythonでキー入力を可能にするのは2つの書き方があります。ひとつは、`input()`を利用する書き方。もうひとつは、`raw_input()`を利用する書き方です。

この2つの書き方の違いは、
`input()`は、数値のみの入力に使用できます。(* コメント欄でこの部分は指定を頂いています。)
`raw_input()`は、数値の入力も文字の入力にも使用できます。

ただし、`raw_input()`で入力されたものは数値も文字も全て文字としての扱いとなります。

```lang:inputWord.py
# -*- coding: utf-8 -*-
if __name__ == "__main__":
     
    print ('＝＝＝raw_inputを使って文字入力＝＝＝')
    print ('何か文字を入力してください。')
    input_test_word = raw_input('>>>  ')
    print ('入力されたのは ') + input_test_word + (' です。')
    input_test_word_b = input_test_word*2
    print ('input_test_wordに') + input_test_word + (' を格納して、input_test_word*2した実行結果は') + input_test_word_b + ('となります。')
 
    print ('＝＝＝inputを使って文字入力＝＝＝')
    print ('何か数値を入力してください。')
    input_test_number = input('>>>  ')
    print ('入力されたのは %d です。') % (input_test_number)
    input_test_number_b = input_test_number*2
    print ('input_test_numberに %d を格納して\ninput_test_number*2した実行結果は %d となります。') % (input_test_number,input_test_number_b)

```

***
Twitter :[@fantmsite](https://twitter.com/fantmsite)
~~ブログ：FantmSite-BLOG~~
pythonで特定のサイトURLから画像を一括ダウンロード

取得したURLが相対バスか絶対パスかを判定して、相対パスなら絶対パスにするという作業は今回はせずに、
取得したいサイトではimgのパスは絶対パスだけを利用していることを条件に作成したプログラムなので相対パスを使っているサイトから画像を取得しようとするとERRORになるので気をつけてください。
~~コードの詳しい説明(？)は下記にリンクを貼ってあるブログの方に書き留める予定です。~~(ブログ公開終了しました)
(2014.08.11現在の予定)

```py:downloadImg.py
# -*- coding: utf-8 -*- 

import urllib
import urllib2
import os.path
import sys
from HTMLParser import HTMLParser

def download(url):
    img = urllib.urlopen(url)
    localfile = open(os.path.basename(url),'wb')
    localfile.write(img.read())
    img.close()
    localfile.close()

class imgParser(HTMLParser):

    def __init__(self):
        HTMLParser.__init__(self)

    def handle_starttag(self,tagname,attribute):
        if tagname.lower() == "img":
            for i in attribute:
                if i[0].lower() == "src":
                    img_url=i[1]
                    # 取得した写真のURLを集めたファイルの作成
                    f = open("collection_url.txt","a")
                    f.write("%s\t"%img_url)
                    f.close()
        
if __name__ == "__main__":

    print('写真を取得したいサイトのURLを入力してください。')
    input_url = raw_input('>>>  ')
    serch_url = input_url
    htmldata = urllib2.urlopen(serch_url)
    
    print('現在画像ファイルを取得中です...')

    parser = imgParser()
    parser.feed(htmldata.read())

    parser.close()
    htmldata.close()

    # 生成したファイルの読み込み
    f = open("collection_url.txt","r")
    for row in f:
        row_url = row.split('\t')
        len_url = len(row_url)
    f.close()

    number_url = []

    for i in range(0,(len_url-1)):
        number_url.append(row_url[i])

    for j in range(0,(len_url-1)):
        url = number_url[j]
        download(url)

    print('画像のダウンロードが終了しました。')

    # ファイルの削除
    os.remove("collection_url.txt")
```

***
Twitter :[@fantmsite](https://twitter.com/fantmsite)
~~ブログ：FantmSite-BLOG~~
build.gradle の設定の書き方がよくわからなかったので調べた

## なぜ設定ファイルの書き方がこんな構文なのか

groovyとかDSLとか、ほとんど触ったことがないので、android の build.gradle に書いてある

    buildscript {
        repositories {
            jcenter()
        }
    }

みたいな設定がどうしてこんな構文でかかれてて動くのかわからなかったので調べてみた。

# 調べた結果
1. `buildscript` とか `repositories` はメソッド
    + groovy ではメソッドの引数がひとつ以上ある場合、括弧を省略できる
2. `{}` で囲われている部分はクロージャー
    + 0引数のクロージャならば，-> を省略してよい。
3. メソッドの最後の引数がクロージャになっている場合、そのメソッドをクロージャをつけて呼び出すことができる
    + なので、`buildscript({ここがクロージャ})` の場合、`buildscript(){ここがクロージャ} とかける

## これらを踏まえて省略されていない形で、かつメソッドっぽく書き直してみる

    buildscript({ -> 
      repositories({ -> 
        jcenter()
      })
    })

1. `jcenter()` を実行するためのクロージャがある
2. (1を引数にもつ `repositories()` メソッド)を実行するためのクロージャがある
3. 2を引数にもつ `buildscript()` メソッドがある


### まとめ
+ gradle の設定は groovy の構文でかかれているので、こまったらgroovy調べよう！
    + (訳：groovy を調べないと構文の意味がわからなくてものすごく躓く・・・)

#### 参考
[Gradle User Guid](http://gradle.monochromeroad.com/docs/userguide/userguide_single.html#sec:shortcut_notations)
[Japanese Closures](http://groovy.codehaus.org/Japanese+Closures)

クロージャーとかあんまりよくわかっていないところもあるので、何か間違っているところがあったらご指摘お願いします！
SwiftのProtocolについての簡単な整理


自分自身が、`Swift`の基本的な言語仕様の理解が曖昧なので(Java言語仕様任せ w)`protocol`の復習から。
`protocol`とは、おそらく`Java`で言うところの`interface`である。

##Protocolの実装##

```MyProtocol.swift
protocol MyProtocol{
    func protocolFunction01()
    func protocolFunction02()
}
```

##Classの実装##

次に、`protocol`を継承した`class`を作ってみる。

ここでは試しに`protocol`を実装した`class`から、わざと1つのメソッドを欠落させてみる。
当然、`protocol`に宣言した全てのメソッドを定義しないとエラーになる。

![スクリーンショット 2014-08-10 20.52.37.png](https://qiita-image-store.s3.amazonaws.com/0/3184/d46433fa-4d86-1ce9-62bb-ce1ab370b899.png "スクリーンショット 2014-08-10 20.52.37.png")

と言うことで、基本通り全てのメソッドを宣言する。

```MySuper.swift
class MySuper:MyProtocol{
    func protocolFunction01() {
        
    }
    func protocolFunction02() {
        
    }
}
```

当然のようにエラーは消える。

![スクリーンショット 2014-08-10 20.56.58.png](https://qiita-image-store.s3.amazonaws.com/0/3184/0bfca363-4313-9ce7-f885-872f05adb2d9.png "スクリーンショット 2014-08-10 20.56.58.png")


##Protocol イニシャライザの宣言##

次に`init`イニシャライザを`protocol`に定義してみる。
ここでは、特に意味は無いが`String`を引数にしてみた。

```MyProtocol.swift
protocol MyProtocol{
    init(str:String)
    func protocolFunction01()
    func protocolFunction02()
}
```

クラス`MySuper`では、`init(str:String)`が無いために当然のようにエラーとなる。

![スクリーンショット 2014-08-10 21.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/3184/1efe927b-0a6c-5369-567f-b63f3b5ceb74.png "スクリーンショット 2014-08-10 21.04.26.png")

そこで`protocol`で定義した`init(str:String)`をクラスに定義してみた。
しかし、別のエラーが発生した。

`Initializer requirement 'I' can only be satisfied by a 'required' initializer in non-final class 'X'`

どうやら、`required`なイニシャライザでないとダメらしい。

![スクリーンショット 2014-08-10 21.08.48.png](https://qiita-image-store.s3.amazonaws.com/0/3184/17c1ea92-0a2c-4d8a-3d00-c99e89934a65.png "スクリーンショット 2014-08-10 21.08.48.png")

そこで、`required`修飾子を付けてみる。

![スクリーンショット 2014-08-10 21.10.47.png](https://qiita-image-store.s3.amazonaws.com/0/3184/43fb1e3b-e44b-379c-7f68-364f402e7107.png "スクリーンショット 2014-08-10 21.10.47.png")

##ポイント##
ここでのポイントは、`protocol`で宣言されたイニシャライザ`init`には、`required`修飾子が必要なようだ。
Firefox OSのAPN

Firefox OS flame を「みおふぉん」と組み合わせて使っているのですが、APN の設定はデフォルトのままでは使えず、[パッチ](https://github.com/dynamis/firefoxos-patch)を当てて使っています。せっかくなので、少し追いかけてみました。

apn.json は基本的には android で使われている apns_conf.xml から変換したものだそうです。[gaia/shared/resouces/apn/README.md](http://git.mozilla.org/?p=releases/gaia.git;a=blob;f=shared/resources/apn/README.md )によると。

ほうほうなるほどと思って、upstreamであるところの Android を眺めてみると、最近の Android では「APN タイプ」という設定項目があるんですね。エンドユーザが設定できるものなのだと。近頃はそうなってるんですね。

パッチでは「type=default,supl」を追加していましたが、他にどんなものがあるかなども気になってきてしまいます。

設定画面では先ほどの apn.json と window.navigator.mozSettings から `ril.data.cp.apns` をキーとして取り出した値を検査しているようです。

設定画面では次のキーを[見ている](http://git.mozilla.org/?p=releases/gaia.git;a=blob;f=apps/settings/js/carrier.js#l1006)ようです。

```js
    var kUsageMapping = {
      'data': 'default',
      'mms': 'mms',
      'supl': 'supl',
      'dun': 'dun',
      'ims': 'ims'
    };
```

設定画面のメニュー名と付き合わせるとこんな感じ。

* default = data = Data settings
* mms = mms = Messege settings
* supl = supl = A-GPS settings
* dun = dun = Tethering settings （テザリング）
* ims = ims = IMS settings

パッチでは default と supl を設定しているので、確かに「データ通信」と「A-GPS」でメニューに出てくるようになっている。全部指定すれば、全部出るんだろうな。

SIM + APN 設定が、どの機能に対応しているかは、どう調べればいいんだろう？
AFNetworkingのSwift版とも言えるAlamofireを試してみた


`AFNetworking`の作者であるMattt ThompsonさんがHTTP通信用ライブラリとしてSwiftで開発した`Alamofire`を試してみました。

`Alamofire`はこちらからDLできます。

https://github.com/Alamofire/Alamofire

Sourceディレクトリ直下にある`Alamofire.swift`をXcodeプロジェクトにドラッグするだけで使用できます。

使い方は例を見てもらえば分かると思いますが非常にシンプルです。
下記はレスポンスを`NSData`で取得する例です。

```swift
Alamofire.request(.GET, "http://...")
         .response { (request, response, data, error) in
                     println(request)
                     println(response)
                     println(error)
                   }
```

`String`でレスポンスを取得したい場合、`responseString`を使用します。

```swift
Alamofire.request(.GET, "http://...")
         .responseString { (request, response, string, error) in
             println(string)
         }
```

JSON形式で取得した場合、`responseJSON`を使用します。

```swift
Alamofire.request(.GET, "http://...")
         .responseJSON {(request, response, JSON, error) in
             println(JSON)
         }
```

メソッドチェーンを利用して下記のように複数の形式での結果を同時に処理できます。

```swift
Alamofire.request(.GET, "http://...")
         .responseJSON { (request, response, JSON, error) in
             println(JSON)
         }
         .responseString { (request, response, string, error) in
             println(string)
         }
```

パラメータを設定する場合は下記のように`parameters`を設定します。

```swift
Alamofire.request(.GET, "http://...", parameters: ["foo": "bar"])
```

パラメータをJSONにしたい場合、下記のようにJSONでエンコードするように設定します。

```swift
Alamofire.request(.POST, "http://...", parameters: parameters, encoding: .JSON(options: nil))
         .responseJSON {(request, response, JSON, error) in
            println(JSON)
         }
```

ベーシック認証も簡単に設定できます。

```swift
let user = "user"
let password = "password"

Alamofire.request(.GET, "https://...")
    .authenticate(HTTPBasic: user, password: password)
    .response {(request, response, _, error) in
        println(response)
    }
```

`NSURLCredential`と`NSURLProtectionSpace`を使った認証は下記のように設定します。

```swift
let user = "user"
let password = "password"

let credential = NSURLCredential(user: user, password: password, persistence: .ForSession)
let protectionSpace = NSURLProtectionSpace(host: "...", port: 0, `protocol`: "https", realm: nil, authenticationMethod: NSURLAuthenticationMethodHTTPBasic)

Alamofire.request(.GET, "https://...")
    .authenticate(usingCredential: credential, forProtectionSpace: protectionSpace)
    .response {(request, response, _, error) in
        println(response)
}
```

ソースコードは一つのファイルに集約されており、使い方も非常にシンプルで使いやすいです。
もっと詳細を知りたい方は直接ソースコードを見るのが一番よいかと思います。

SwiftでHTTP通信周りを実装するのはこれまでのように`AFNetworking`でも特に問題ありませんが、`Alamofire`はSwiftのみで実装されており、シンプルかつ使いやすいです。
今後Swiftで開発を行うのであれば、この`Alamofire`を利用するのもよいと思います。
Qiita Widget作った

# Qiita Widget
## なにをするもの？
言うまでもなくQiitaの投稿をサイトに埋め込めるやつ。

## Repo
https://github.com/kimama1997/qiita-widget

## 使い方

```html
<div data-qiita-widget="widget" data-name="your-url-name"></div>
<script src="https://rawgit.com/kimama1997/qiita-widget/master/dist/qiita-widget-simple.min.js" async="async"></script>
```

デフォルトの取得件数は10件。`data-count`で件数を指定すれば最大100件まで取得可能。

## 中身

 1. ✝コード見てね(汚いけど)
 1. Coffeeで書いた
 1. `ViewQiitaWidget`っていうClassを作る
 1. [いろんな種類](https://github.com/kimama1997/qiita-widget/tree/master/dist)を排出してるよ()
 1. ウィジェットはDOMを組み立てて出力するよ
 1. 一応bowerも使えるよ(`bower install https://github.com/kimama1997/qiita-widget.git --save`)
 1. QiitaAPIにXHRで直接リクエストしてるんで鯖に掛ける負荷の心配もアクセスの多いサイトでのレートリミットの心配も無用。
 1. ちなみに作ってる時に間違えて`rm qiita-widget.coffee`しちゃったよ
   - 運よく`npm install -g`を間違ってしてしまってたおかげで復活できたよ
 1. IE9以降に対応させるつもりでXHR書いたらクロスドメイン拒否って言われたので修正しなきゃいけない。

## 副産物
Wordpressウィジェットも出来た。
https://github.com/kimama1997/Qiita-Widget-wp

 - ~~とりあえず[自分のブログ](http://blog.hinaloe.net/)に貼ってみた~~


## @todo

 - Read more on Qiitaを追加できるようにする
 - user iconを表示出来るようにする
 - IE対応←重要

P.S.

[suinさんの](http://qiita.com/suin/items/f44b9ee388668fd277a6)の方が絶対イイ（
チャネルに対するcapとlenについて #golang


## チャネルの容量

　Go言語のチャネルには容量というものが指定できます．通常，チャネルを作成するには，組込み関数の`make`を使いますが，その第2引数で容量を渡すことができます．第2引数を省略した場合は，容量0のチャネルとなります．

```
// 容量0
ch1 := make(chan int)
// 容量10
ch2 := make(chan int, 10)
```

　チャネルの容量は中に保持しておけるバッファのサイズを指しており，バッファがいっぱいになるとチャネルの送信はブロックされます．また，バッファ内に値がない場合は，チャネルからの受信はブロックされます．

```
ch := make(chan int, 1)
ch <- 100 // ブロックしない
ch <- 200 // ブロックする
```

## capとlen

　チャネルに対して，組込み関数の`cap`を呼び出すと，チャネルの容量を取得することができます．

[Go Playgroundで実行](http://play.golang.org/p/9ZME5tj0jm)

```
ch1 := make(chan int, 10)
// 10
fmt.Println(cap(ch1))

ch2 := make(chan int)
// 0
fmt.Println(cap(ch2))
```

　また，組込み関数の`len`を呼び出すとバッファ内にある値の数を取得することができます．

[Go Playgroundで実行](http://play.golang.org/p/copdal-lVQ)

```
ch := make(chan struct{}, 10)
ch <- struct{}{}
// cap: 10 len: 1
fmt.Println("cap:", cap(ch), "len:", len(ch))
<-ch
// cap: 10 len: 0
fmt.Println("cap:", cap(ch), "len:", len(ch))
```
PHPのdate関数みたいなものをjavascriptで実現する

# (注意)こっちにブクマしてる方用に一応記事を残してます

すいません移転です

こちらの記事を参考にしてください
[(祝日・和暦・営業日計算対応) 日付・日時のフォーマット](http://qiita.com/cocottejs/items/a2ae1acac8bbb1c1f9bf)
bjamでmysql_configの結果を使う

はじめに
==========

MySQLのライブラリーをビルドするには次のようにしてくださいとマニュアルには書いてあります。

```
shell> gcc -c `mysql_config --cflags` progname.c
shell> gcc -o progname progname.o `mysql_config --libs`
```

http://dev.mysql.com/doc/refman/5.6/en/c-api-building-clients.html

でも、実際には簡単なテストプログラムだとしても手でgccとかを実行する人はいないわけで、Makefileなどを作ると思います。

Makefileだとシェルスクリプトを書くのは容易なため困りませんが、bjamだとどう書くのか分からなかったので調べてみました。

やったこと
======

意外と簡単でした。COMMAND (or SHELL) という組み込みルールがあってそれを使えばよいらしいです。

```txt:Jamroot.jam
import testing ;
import os ;

local MYSQL_C_FLAGS = [ COMMAND "mysql_config --cflags" ] ;
local MYSQL_LD_FLAGS = [ COMMAND "mysql_config --libs_r" ] ;

ECHO "MySQL options detected:\n" ;
ECHO "mysql_config --cflags:\n" $(MYSQL_C_FLAGS) ;
ECHO "mysql_config --libs_r:\n" $(MYSQL_LD_FLAGS) ;

run  mysql_test.cpp
    :
    :
    :
    <cflags>$(MYSQL_C_FLAGS)
    <linkflags>$(MYSQL_LD_FLAGS)
    <threading>multi
    ;
```

```cpp:mysql_test.cpp
#include <mysql.h>

int main()
{
    MYSQL mysql;
    mysql_init(&mysql);
    mysql_close(&mysql);
}
```

こちらに書いてあります。

http://www.boost.org/boost-build2/doc/html/jam/language.html

おわりに
=======

分かってしまえば、あるいは、知っていれば簡単なのですが、情報をみつけるのが難しいのがbjamの欠点ですね。

他の検索結果を辿っていて、今回も偶然みつけたようなものです。
JavadocをAPIドキュメントに変換する

# Gradleを使う

Gradleで管理しているプロジェクトで、

```
  gradle javadoc
```

コマンドを実行すれば、build > docs > javadoc にドキュメントが生成される。

## 生成されたAPIドキュメント
![JUnitPractice_1_0_0-SNAPSHOT_API_と_Macintosh_HD.png](https://qiita-image-store.s3.amazonaws.com/0/48812/2fbf4fab-b0fa-2b43-9ff3-8591e0c0df49.png)

![JUnitPractice_1_0_0-SNAPSHOT_API.png](https://qiita-image-store.s3.amazonaws.com/0/48812/d1cf5ebe-c704-35d0-3ecf-3659566fa2b4.png)

![JUnitPractice_1_0_0-SNAPSHOT_API？.png](https://qiita-image-store.s3.amazonaws.com/0/48812/b87de42f-c7b2-a0dc-31a2-e8ef619036cb.png)

Java7、Java8のAPIドキュメントっぽく生成される。


PJをUTF-8でつくってるんだけど、日本語文字列のエンコードでエラーになった。
build.gradleに以下のEncodingの設定を追加したら解決した。

### 追加した設定

```
javadoc {
    options.encoding = "UTF-8"
}
```

発生したエラー

```
/Users/syobochim/dev/JUnitPractice/src/main/java/ch06/ItemStock.java:6: ???: ??????????????ASCII?????????
     * ??????????????????????????????????????????
        ^                
```
  
  
# maven を使う

maven で管理しているプロジェクトで

```
mvn javadoc:javadoc
```

のコマンドを実行すれば target > site > apidocs にAPIドキュメントが生成される。

## 生成されたAPIドキュメント
![sample_1_0-SNAPSHOT_API.png](https://qiita-image-store.s3.amazonaws.com/0/48812/b96fb1ed-810e-3dab-6915-59febc40a3c0.png)


### 追加した設定

Encodingのエラーは

```
[ERROR] * maven ?????????????????????????????????
[ERROR] ^
[ERROR] /Us
```


pom.xmlに以下の設定を追加したらなおった。

```xml
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
```
Unityで2点間に壁があるかの判定

###概要
2つのGameObjectの間に壁があるかを判定する処理のメモ
Raycastを使用する場合は、方向ベクトルを求める必要がある

###スクリプト
```RayTest.cs

using UnityEngine;
using System.Collections;

public class RayTest : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
		// ターゲットのオブジェクトを検索
		GameObject TragetObject = GameObject.Find ("Target");
		if (TragetObject) {
			RaycastHit hit;

			// ターゲットオブジェクトとの差分を求め
			Vector3 temp =  TragetObject.transform.position - this.transform.position;
			// 正規化して方向ベクトルを求める
			Vector3 normal = temp.normalized;

			if (Physics.Raycast (this.transform.position, normal, out hit, 10)) {

				if (hit.transform.gameObject == TragetObject) {
					// TargetObjectを見つけた
					print ("Found TargetObject");
				} else {
					// TargetObject以外を見つけた
					print ("Hit Wall");
				}
			}
		}
	}
}

```
###プロジェクトのスクリーンショット
![Raytest.png](https://qiita-image-store.s3.amazonaws.com/0/49072/c2e53333-9c9e-eb9d-14ae-6867346b438a.png)
enthumbleキーカスタマイズ例(HJKL配列)

完全に自分専用設定になってしまったので、この設定が役に立つかどうかわかりませんが、現在のenthumbleの設定を公開してみます。

「,」でctrl + shift + tab
「.」でctrl + tab

でアプリでのタブ移動が快適にできるのが気に入っています。

環境はWindows8.1やUbuntuなどを主に使い、vimも軽く触るプログラマです。

Win + qの検索機能を呼び出すのも利用頻度が高いので「カナ」に割り当てました(20140913更新)
Win + 数字の利便性が高いので7まで追加した(20150221)

```lang:HJKL.iniの設定
[HowToUse]
Check=http://www.enthumble.com/keylist
[KEY]
Space={Enter}
Muhenkan={Esc}
Henkan={Esc}
Hiragana={LWin Down}{q}{LWin Up}
  ;Windows8の検索を開く
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={}
F11={}
F12={}
F13={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={F7}
8={F8}
9={F9}
0={F10}
-={F11}
Hat={F12}
¥={Insert}
Q={LWin Down}{1}{LWin Up}
W={LWin Down}{2}{LWin Up}
E={LWin Down}{3}{LWin Up}
R={LWin Down}{4}{LWin Up}
T={LWin Down}{5}{LWin Up}
Y={LWin Down}{6}{LWin Up}
U={LWin Down}{7}{LWin Up}
I={Home}
O={End}
P=^p
@={}
LB={}
A=^a
S=^s
D=^e
  ;Onenoteでノート検索、firefoxはタブグループをctrl+eに設定、sublimetextはfile検索をctrl+eに設定
F=^f
G=^{End}
H={left}
J={down}
K={up}
L={right}
Semicolon={PgUp}
:={}
RB={}
Z=^z
X=^{F4}
C=^c
V=^v
B={BackSpace}
N=^n
M={Del}
,={ctrl down}{shift down}{Tab}{ctrl up}{shift up}
  ;タブ切り替え可能なアプリケーションで前のタブに切り替える
.={ctrl down}{Tab}{ctrl up}
  ;タブ切り替え可能なアプリケーションで次のタブに切り替える
/={PgDn}
Backslash={}
Up={}
Down={}
Left={}
Right={}
LButton={}
MButton={}
RButton={}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Backspace={Delete}
Enter={}
Escape={}
Hankaku={}
Tab={LWin Down}{ctrl down}{right}{LWin Up}{ctrl up}
Capslock={LWin Down}{ctrl down}{left}{LWin Up}{ctrl up}
Lwin={}
Rwin={}
Insert={}
```
【Titanium】バーコードスキャナーモジュールの導入

## 前書き
Scanditが提供しているバーコードスキャナーモジュールの導入まで。
モジュールは[AppceleratorのMarketplace](https://marketplace.appcelerator.com/home)で検索することができます。
Titaniumのバーコードスキャナーモジュールで有名なのは[TiBar](https://code.google.com/p/tibar/)ですが、どうやらiOSしか対応していない模様。
ScanditのモジュールはiPhoneとAndroid共に対応していました。
キーが必要になるため、アカウントを作る必要はありますが、UPCコード、EANコード、QRコードの読み取りは無料で使うことができます。
他のモジュールを使用していないので他との比較は出来ませんが、バーコードの認識精度は高すぎるくらい高い上に読み取り精度も高いので試してみる価値はあると思います。
ドキュメントは[こちら](http://docs.scandit.com/)。
## 導入方法
### ダウンロード
[こちら](http://www.scandit.com/pricing/)からダウンロードすることができます。
プランが3つあり、それぞれ特徴があるのでダウンロードページを参考に必要なプランを選んでダウンロード。
### インストール
解凍したら、Titaniumのモジュールフォルダに移動します。
/Users/ユーザ名/library/Application Support/Titanium/modules がモジュールを格納するフォルダになっているので、modulesフォルダ以下にあるiphoneフォルダとAndroidフォルダ、それぞれに対応するフォルダを置きます。

どうやらApplication Support/Titanium以下にzipファイルを置く方法が[公式](https://wiki.appcelerator.org/display/guides2/Using+Titanium+Modules#UsingTitaniumModules-InstallingModules)のよう。
こちらを確認せずに解凍したフォルダを直接置く方法をとってしまいましたが、今のところ問題なく動作しています。

次にモジュールを使いたいプロジェクトのtiapp.xmlでモジュールの設定をします。
xmlファイルに書き込むこともできますが、OverViewタブのModulesのところで「+」ボタンから設定すると簡単にできます。
### キーの設定
ダウンロード実行時にアカウントを作成したと思いますが、そのアカウントでScanditの[アカウントページへログイン](https://ssl.scandit.com/account/sessions/new)します。
アカウントページのDownloadリンク下にApp keyリンクがあり、キーはそこから入手することができます。
[こちら](http://docs.scandit.com/titanium-integrate.html)にサンプルコードが載っているので、そのコードをTitaniumのプロジェクトに持ってきて
>// Initialize the barcode picker, remember to paste your own app key here.
    picker.init("enter Scandit SDK APP KEY here" - sign up at www.scandit.com, 0);

この部分の`enter Scandit SDK APP KEY here`のところに入手したキーをコピペすれば完了です。
RubyOnRails初めての人のためのRailsTutorial環境構築ガイド(主にWindowsユーザー)

RailsというよりWebサービス開発自体ほとんどやったことがなく、環境構築だけでかなり時間がかかったので、同じような状況の人のためにメモを残します。
Tutorialを一通り理解したら、自分へのご褒美にMacを買いたいなと思ってます。

# 前提条件

- Tutorialの最初でrails serverが実行できるところまでをカバー
- とにかく初心者向け最小構成ということでrbenvやRVMは不使用（というか、それらを使ってるくらいの人なら自分で何とかする気がします）
- 仮想マシンを使わなくてもWindows上で開発はできますが、後から今回の環境構築よりも厄介な問題が起きそうなので、仮想マシンを利用
- Windows上で実行しましたが、仮想マシンを使ったので汎用性は高いかと
- ほとんど誰にでもわかるように書いたので、冗長なところはご勘弁

# 開発環境

ゲストOS以外の部分までは自分で何とかしてください

- ホストOS - Windows7 64bit
- 仮想マシン - OracleVM VirtualBox 4.3.12
- 仮想環境 - Vagrant 1.6.3
- ゲストOS - CentOS6.5 または Ubuntu precise 64（お好きなほうをどうぞ）
- バージョン管理 - Git（SourceTree）

# ゲストOSの準備

以下、全てコマンドプロンプトから実行

## BOX（ゲストOS）の追加

- CentOS
> vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

- Ubuntu
> vagrant box add precise64 http://files.vagrantup.com/precise64.box

## Vagrantfileの作成

コマンドプロンプトを触ったことが無い人向けに……

- 指定した下のフォルダに移動（フルパスで指定すればどこでも移動可能）
> cd フォルダ名

- 親フォルダに移動
> cd ..

- フォルダ作成
> mkdir フォルダ名

仮想マシンを作成したいフォルダで以下のコマンドを実行

- CentOS
> vagrant init centos65

- Ubuntu
> vagrant init precise64

Vagrantfileが作成される

## 仮想マシンへのログイン

- VagrantfileをSublimeTextあたりで開いて以下のコメントを外す（#を削除）
> \# config.vm.network "private_network", ip: "192.168.33.10"
↓
> config.vm.network "private_network", ip: "192.168.33.10"

- 仮想マシンを作成したフォルダで以下のコマンドを実行して仮想マシンを起動
> vagrant up

- 同じく仮想マシンを作成したフォルダで以下のコマンドを実行して仮想マシンにログイン
> vagrant ssh

## アップデートと基本的なパッケージのインストール

- CentOS
> sudo yum update -y
> sudo yum install -y wget

- Ubuntu（GRUB関連で警告画面が出てきたのでアップグレードはわからなければやらなくてもいいかもしれません）
> sudo apt-get update
> sudo apt-get upgrade -y
> sudo apt-get install -y git build-essential

## sudoの設定変更（CentOSのみ）

- sudoの設定ファイルを開く
> sudo visudo

- secure_pathを検索
> /secure_path(Enter)

- secure_pathにディレクトリを追加（iを押すと入力モードになる）
> Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
> ↓
> Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

- 保存して終了
> Esc-> ZZ または :wq(Enter)

# Rubyのインストール

- 必要なライブラリのインストール（CentOSのみ）
> sudo yum install -y openssl-devel gdbm-devel

- ソースコードをダウンロードするディレクトリに移動
> cd /usr/local/src

- ソースコードのダウンロード
> sudo wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p481.tar.gz

- ソースコードの解凍
> sudo tar zxvf ruby-2.0.0-p481.tar.gz

- ダウンロードしたファイルの削除
> sudo rm /usr/local/src/ruby-2.0.0-p481.tar.gz

- 解凍したディレクトリに移動
> cd /usr/local/src/ruby-2.0.0-p481

- コンパイルとインストール
> sudo ./configure
> sudo make
> sudo make install

## RubyGemsの設定

- 新しくファイルを作成
> vi ~/.gemrc

- 以下の行を追加してgemでドキュメントが生成されないように設定(iを押すと入力モードになる)
> install: --no-rdoc --no-ri
> update:  --no-rdoc --no-ri

- 保存して終了
> Esc-> ZZ または :wq(Enter)

- RubyGemsのバージョンをTutorialにあわせる
> sudo gem update --system 2.0.3

# Railsと必要なパッケージのインストール

- Railsのインストールは、かなり時間がかかって進んでいるのかわかりにくいので-Vオプションをつけておく
> sudo gem install -V rails --version 4.0.5

- 必要なパッケージのインストール（CentOS）
> sudo yum install -y sqlite-devel nodejs

- 必要なパッケージのインストール（Ubuntu）
> sudo apt-get install -y libsqlite3-dev nodejs

# 共有フォルダ（仮想マシンを作成したホストOSのフォルダ）へ移動

- 何かと都合がよさそうなので、共有フォルダを作業フォルダにする
> cd /vangrant

- お疲れ様です！
HuaweiのTecal ES3000(PCIe SSD)のドライバー設定方法

　


#概要　　
　　
サーバにHuaweiのTecal ES3000(PCIe SSD) を差した際の、ドライバー設定方法です。
　
導入事例がまだ少ないため参考資料が乏しいので、投稿しておきます。
__※簡易版のメモみたいなものなので、参考になるかはわかりません。__

　

##手順：
・ ドライバ/ファームウェアを、ダウンロードサイトから入手
・ ドライバのインストールとバージョン確認 
・ ファームウェアのアップグレード
・ 最後に...

　

#ドライバ/ファームウェアを、ダウンロードサイトから入手
　

##ダウンロードサイト
[http://support.huawei.com/enterprise/#tabname=softwaredownload ](http://support.huawei.com/enterprise/#tabname=softwaredownload )　
 
　
 
1.タブのSoftwareをクリックし、その下にあるProduct SoftwareメニューのITをクリックします。
　
![スクリーンショット 2014-08-10 21_Fotor.jpg](https://qiita-image-store.s3.amazonaws.com/0/40480/02f25448-d713-7086-d1e4-a4ef48d601d7.jpeg)

　

2.次に、ServerメニューにあるAcceleratorのTecal ES3000をクリックします。
　
![スクリーンショット 2014-08-10 21_２.jpg](https://qiita-image-store.s3.amazonaws.com/0/40480/9e4612b6-3c46-0977-92ab-292b914204cc.jpeg)
　

3.各バージョンのパッケージが出てきますので、最新版をクリックして下さい。
　
![スクリーンショット 2014-08-10 21.50.10.png](https://qiita-image-store.s3.amazonaws.com/0/40480/881b7296-78df-0e72-3e64-4fef62b6644c.png)
　

4.この中にある、Tecal ES3000 FirmwareとTecal ES3000 Driverをダウンロードして下さい。
 インストール先のフォルダは、任意のもので構いません。
　
![スクリーンショット 2014-08-10 21.50.35.png](https://qiita-image-store.s3.amazonaws.com/0/40480/694a0260-c9dc-b53e-e36a-e8ee7c2be5a9.png)

__※Tecal ES3000 Driver SRCは必要ありません__

 
　


　

#ドライバのインストールとバージョン確認

__※CentOS6.5の場合、バージョンを6.4にダウングレードして下さい。依存関係の部分ではまる
可能性がありますので、6.4が確実です。__
　
　
##1.ファイルの解凍と確認
　　

```
 # unzip Tecal_ES3000_Driver_2.0.0.41.zip
```

解凍が終了すると、OS毎のフォルダとその下にディストリビューション毎のフォルダが生成されます。インストールに使用するドライバはそれぞれのOS環境に合わせたものを選択して下さい。

　

##2.インストールの実行
　

```
 # yum -y install irqbalance
 # rpm ivh hio-2.0.0.41-2.6.32_358.el6.x86_64.rpm
 # hio_info  //バージョン確認
```

デバイス情報が確認出来ましたら、インストールは完了です。
　
　
　
#ドライバのインストールとバージョン確認
　
##1.ファイルの解凍
```
 # unzip Tecal_ES3000_Firmware_328.zip
```
　

##2.ファームウェアのアップグレード
```
  # hio_firmware -d /dev/hioa -f hio_fw_328
```
　
　
##3.再起動
```
  # reboot
```
　
　
##4.バージョン確認
```
  # hio_info
```
最新バージョンが確認できたら、アップグレード終了です。
　
　
　

#最後に...
　
　
・コマンドhio_infoのオプション

```
-d　:　　　　デバイスを限定して表示する　　　(引数は、/dev/hioa)
-h　:　　　　コマンドのヘルプを表示する
-V　:　　　　コマンドのバージョンを表示する
```
railsでVue.jsを使ってみる


今話題ののvue.jsを既存のrailsのアプリケーションで使ってみたかったので、使う際の手順を書いておきます。

vue.jsに関しては、かなりまとめられた記事があるのでそちらを参考にしてください。

参考：
[Vue.js概要？](http://qiita.com/asip2k25/items/bd4bdccd5201d542953c)
[はじめよう　Vue.js](http://qiita.com/kitfactory/items/9c9b9312ace03e731b33)
[Vue.jsから手軽に始めるJavaScriptフレームワーク](http://qiita.com/icoxfog417/items/49f7301be502bc2ad897)

##インストール
まずはvue.jsをインストールしましょう。
[本家サイト](http://vuejs.org/guide/installation.html)からインストールしてきても良いかと思いますが、今回は[Rails Assets](https://rails-assets.org/)を使ってインストールします。

####Rails Assetsとは？
Rails Assetsは少し前に話題になった、Bower(※Twitter社が作ったフロントエンド用のパッケージマネージャ)で管理しているパッケージをbundlerでインストールできるサービス。

Rails Assetsに関しての参考記事：
[bowerパッケージをbundlerで管理するRails Assetsを使ってみた](http://qiita.com/joker1007/items/8d2fa9960f3d53b8cb57)
[Railsプロジェクトでassetsファイルを効率的に管理する](http://kazu69.net/blog/memo/2000)
[Rails Assets を使って Rails プロジェクトに AngularJS をインストール](http://tnakamura.hatenablog.com/entry/2014/06/19/113000)

Bowerに関しての参考記事：
[Bower入門(基礎編)](http://yosuke-furukawa.hatenablog.com/entry/2013/06/01/173308)
[パッケージマネージャー「Bower」が大変便利で捗りそうです](http://blog.mach3.jp/2013/01/29/bower.html)

Gemfileに下記を追加。

```Gemfile
source 'https://rails-assets.org'

gem 'rails-assets-vue'
```
```
$ bundle install

...

Installing rails-assets-vue 0.10.6

...
```
無事vue.jsが入った。
application.jsに下記を追加すれば完了。

```app/assets/javascripts/application.js 
//= require vue
```

##実際に書いてみる

簡単なコードを実際に書いてみる。
rubyのテンプレートエンジンをerbであれば{{msg}}を書けば問題ないが、slimにしていたので、ちょっとだけ手こずったw
="{{}}"こう書かないとだめみたいです。

```app/assets/javascripts/tests.js.coffee
$ ->
  new Vue(
    el: '#hoge',
    data:
      msg: 'Hello Vue.js!'
  )
```

```app/views/tests/hoge.html.slim
div#hoge
  = "{{msg}}"
```

無事表示されました。これでvue.jsが使える(´ω｀)=3
jade と Assemble の比較


『静的な HTML を出力するためのツール』としての比較です。

これまで静的な HTML の出力には jade を使っていたのですが、「HTML は HTML として書きたい」と思うようになり Assemble を導入してみました。まだ使い始めて一週間ほど。

jade を使い始めた理由は「ヘッダー/フッターなんかの共通箇所は一個だけ書いて include したい。修正があるとき全ページ変更するのめんどうだし」というだけのもの。express を使っていたわけでもないので、 haml でも slim でもよかったんですが node で動いてるしなんとなく。

## jade でちょっと不満だったところ

### 入れ子が深くなってくると見通しが悪くなる

「HTML は HTML として書きたい」と思った一番の理由。大きいコンテナ要素が続くときにインデントがよくわからなくなってくる。

### あらゆる *.jade ファイルがhtmlに出力されてしまう

これは知らないだけの可能性も大いにありますが、
たとえば ```extends``` の継承元の ```layout.jade``` というものがあったとして、いちいち ```layout.html``` が出力されるというもの。
```grunt``` で『```_``` で始まるファイルは出力しない』設定にしたうえで ```_layout.jade``` としていたのでまったく困ってはいなかったのですが仕様としてそういうのがあればいいなと思っていました。

## Assemble でよかったところ

### htmlとして書ける

閉じタグってありがたいものですね

### published: false を指定したファイルは出力されない

```YAML front matter``` で ```published: false``` と書いておけばそのファイルは出力されません。
```layout``` や ```partial``` で有用。


## Assemble でちょっと不満なところ

まだ使い始めて日が浅いので誤解してたらごめんなさい

### なんとなくその場で適当にループができない

jade はファイル内で ```for```文が使えるので「ここは ```<li>``` タグ3つ、あっちは7つ」とか柔軟にできるけど Assemble だと ```config.yml``` などに書いたものを ```{{#each config.list}}ループの中身{{/each}}``` みたいに回すしかない？

### mixin がない

jade でよくやっていたのが以下のようなパンくずの mixin

```jade
mixin breadcrumb(list)
  .breadcrumb
    ul
      - for(var i = 0; i < list.length; i++) {
        - if(i === list.length-1) {
          li.last-child
            span #{list[i]}
        - } else {;
          li
            a(href="#") #{list[i]}
        - };
      - };

```

こう使います

```jade

+breadcrumb(['トップ', '商品一覧', '商品詳細'])
```

こういうことができない。いや、Helpers でいける？よくわかってません。


## 今後はどちらを使うか

最初は下調べ不足で「やっぱり jade 使っておくべきだった...」と思う場面も多かったですが、調べればちゃんと代替となる機能はある印象でした（```{{#extend}}{{/extend}}```もないものと思ってた）。

今後は Assemble でやってみようと思います。
Unity C# Animatorを扱う時のなにがし


## AnimatorのParameterを操作

詳しくは [公式リファレンス](http://docs-jp.unity3d.com/Documentation/ScriptReference/Animator.html) を参照するとよいけど、
以下を覚えておくだけでも結構いける。

```C#
using UnityEngine;

public class Sample : MonoBehaviour {

    [SerializeField]
    Animator mAnimator; // InspectorでAnimatorを指定しておく

    void Start () {

        mAnimator.SetBool("Hoge", true); // HogeというBool値パラメーターをtrue

        mAnimator.SetTrigger("goHoge"); // goHogeというTriggerをon

        mAnimator.SetInteger("HogeRandom", 1); // HogeRandomというInt値パラメーターを1
    }
}
```

## 現在実行中のアニメーション名を確認

どのアニメーションを実行しているかで処理を変えたい場合。

```C#
using UnityEngine;

public class Sample : MonoBehaviour {

    [SerializeField]
    Animator mAnimator; // InspectorでAnimatorを指定しておく

    void Update () {

        AnimatorStateInfo stateInfo = mAnimator.GetCurrentAnimatorStateInfo(0);
        // レイヤーのインデックスを引数に指定

        if( stateInfo.IsName("Base.foo") ) {

            Debug.Log("Baseレイヤーのfooを実行中");
        }
    }
}

```

AnimatorStateInfoの詳しい機能は[ここ](http://docs-jp.unity3d.com/Documentation/ScriptReference/AnimatorStateInfo.html)を参照！