OmniAICreator/Qiita-1.07M huggingface dataset:
DJangoメモ：はじめから（モデル設定編）

[DJangoメモ：はじめから](http://qiita.com/juniskw/items/58ea1df4c5801aee411f)の続きです。

### モデルの作成と適用 ###
以下のコマンドでアプリケーションを作成。プロジェクトは複数のアプリケーションから成る（たぶん）。

```
python manage.py startapp [polls]
```

[polls]（ \__init__.py models.py views.py が入ったディレクトリ）が作られるので、このmodels.pyを編集。

###### モデルの作成（models.py） ######

```py
from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __unicode__(self):
       return self.question

    def was_published_today(self):
       return self.pub_date.date() == datetime.date.today()


class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

    def __unicode__(self):
       return self.choice
```

これらのクラスがモデルとなり、このモデルをもとにデータベーステーブルが構成される模様
ただ、この時点ではまだモデルを定義しているだけなので、今度は適用するためにsettings.pyを編集。

###### モデルの適用（settings.py） ######

```py
# この部分を修正
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',   # ここと
    'polls'   # ここ。プロジェクトのルートディレクトリから辿っているらしい
)
```

ここでもう一度

```
python manage.py syncdb
```

を実行。すると以前作ったデータベースにテーブルが追加される。

##### データベースAPIの勉強 #####
参考：http://www.djangoproject.jp/doc/ja/1.0/topics/db/queries.html#topics-db-queries
iOSに於けるユーザコメントについて

==========================

### 文字コード
Exifのユーザコメントは先頭8バイトに文字コードが埋め込んである仕様です。
文字コードはASCII文字列で、16進数でそれぞれ次のようになっています。

- ASCII ・・・ (41 53 54 49 00 00 00) “ASCII   ”
- Shift-JIS・・・ (4A 49 53 00 00 00 00 00) “JIS     “
- Unicode・・・(55 4E 49 43 4f 44 45 00) “UNICODE “
- 未定義・・・(00 00 00 00 00 00 00 00)

###   iOSでは次のようにExifのユーザコメントが埋め込めます。

```Objective-C
NSMutableDictionary *exif = metadata[(NSString *)kCGImagePropertyExifDictionary];
exif[(NSString *)kCGImagePropertyExifUserComment] = userComment;
```

### ただし、文字コードを自動判別するようです。
日本語のみ、または英字のみの場合は何も問題がありませんが、混合するとお問題が生じます。試してみると次のようになります。

- OKの場合

1. あいうえお —> あいうえお
2. あabcdeいうえお —> あabcdeいうえお
3. １abcdeいうえお —> １abcdeいうえお (先頭全角１)
4. Zabcdeいうえお —> １abcdeいうえお (先頭全角Z)

-NGの場合

1. abcdeあいうえお —> abcde????? 
2. ＠abcdeいうえお —> @abcde???? (先頭全角＠)
3. ＃abcdeいうえお —> #abcde???? (先頭全角＃)

### データ文字数

シミュレータで実行するとこれでほぼOKなはずですが、実機で実行するとさらに問題が生じます。

#### iPhone4 (iOS7)では、次のようになります。

1. 123456789012345678901234567890 —> 123456789012345678901234567890
2. あいうえおかきくけこ —> あいうえ
3. あいうえおかきくけこ□□□□□□ —> あいうえおかき
4. あいうえおかきくけこさしすせそたちつてと —> あいうえおかきくけ

#### 初代iPad mini (iOS6)では、次のようになります。

先頭に日本語を入れればうまくいくようです。

1. あいうえお —> あいうえお
2. あabcdeいうえお —> あabcdeいうえお

OS依存なのか、機種依存なのかは、今後検証する必要があります。
PhpStorm上からPull Requestが発行出来る！


PhpStorm7からの新機能です。

Find Action -> Create Pull Request
から、Pull Requestが発行出来るよ！

![Create_Pull_Request_と_au_header.php_-_nanapi_-____www_nanapi_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/78f6ae8a-ca02-af03-5f0f-df095665b462.png "Create_Pull_Request_と_au_header.php_-_nanapi_-____www_nanapi_.png")

OKすると、

![スクリーンショット_2013_10_25_18_11.png](https://qiita-image-store.s3.amazonaws.com/222/20074/8e19dc2c-5b4f-ea84-2a1f-333d74aa6485.png "スクリーンショット_2013_10_25_18_11.png")


こんなポップアップ出るので、リンククリックでGitHubに直に飛べます。
PhpStorm内で完結出来ますね！超便利。
Bookmarkを使いこなす


普通に開発していると、複数のファイルの特定の箇所を何回も行き来したり参照したりすることは多いですよね。
そんな時Bookmark機能を使うとファイルの行き来が行指定のピンポイントで移動出来たり、ファイルを開かずとも前後を参照出来たりするので便利です。

まずはショートカットから。
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/20074/f9419a70-d493-d91e-4c93-9618479d6b07.png "Preferences.png")

結構多くのショートカットがデフォルトで割り振られています。
とはいえ自分が作成したブックマークの番号を全部覚えながら作業するのでは逆に効率が悪くなってしまうと思うので、ブックマーク番号はあまり意識しないほうが良いと思います。
僕自身は[Toggle Bookmark With Mnemonic]と[Show Bookmarks]のみにショートカットを割り振っています。以下もこの2つを使って説明します。

## ブックマークを付ける

![TitlesController.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/3a4f47c4-9756-29fd-1520-358a85bc94c4.png "TitlesController.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")

TitleControllerの11行目を選択した状態で[Toggle Bookmark With Mneommic]を実行した状態です。
このブックマークの位置に0〜9の数字、もしくはA〜Zまでの名前を割り振れます。ここでは1を設定してみます。
これで完了です。

## ブックマークを表示する

![TitlesController.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/2d3d69db-ec20-d1c7-1be3-205d3c7900ed.png "TitlesController.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")

[Show Bookmarks]でポップアップがこんな感じで表示されます。
わざわざファイルを開かずとも、ブックマークを設定した付近の行が見れます。指定したBookmark名(数字)を入力、もしくはEnterでそのファイルに飛べます。
また、このウィンドウ内でファイル名の文字列絞り込みも出来ます。超便利。

明日は[@crifff](https://twitter.com/crifff)さんです。お楽しみに！
OSXのドックを一時的に非表示にする

```
⌘+option+d
```

ドックが非表示になりマウスを下側に移動させると表示されるようになる。
元に戻す(常に表示させたい)時はもう一度押す。

## 参考文献
- [ドックの表示・非表示：ショートカットキー：Mac Tips：MacでWeb制作](http://www.hirx.net/mactips/0111indicatedock.php)
Xamarin.AndroidでAndroid.Media.MediaplayerでStreamingを流す方法

Xamarin.AndroidでAndroid.Media.MediaplayerでStreamingを流す方法についてです。
markdown記法の練習として書いてます。

手順としては

*  usingディレクティブにAndroid.Mediaを定義
*  MediaPlayerで再生、停止の処理を指定

と至って簡単です。

再生については、まず準備として
Android.Media.MediaPlayerで

```csharp:
SetAudioStreamType(Stream.Music);
SetDataSource(Uri.EscapeUriString(Mediaurl));
```

とAudioStreamTypeをStream.Musicにして、DataSourceにエスケープしたstreamingのURIを設定します。
そしてPrepareAsync()として非同期に準備します。

再生する際は、準備出来たらStart()してあげればいいようです。
停止については、Stop()して、Reset()してあげればいいようです。
なお、Reset()を忘れるとエラーが出ました。

まとめると以下のようになります。(PlayButton,StopButtonというButtonを使用しています)

```csharp
～略
using Android.Media;
～略			
MediaPlayer Mp = new MediaPlayer ();
string Mediaurl = "streamingのURI"

//Playbuttonの処理
PlayButton.Click += (object sender, EventArgs e) => {
	if (Mp.IsPlaying || Mediaurl == string.Empty) {
		return;
	}

	Mp.SetAudioStreamType(Stream.Music);
	Mp.SetDataSource(Uri.EscapeUriString(Mediaurl));
	Mp.PrepareAsync();
};

//stopbuttonの処理
StopButton.Click += (object sender, EventArgs e) => {
	if (Mp.IsPlaying) {
		Mp.Stop ();
		Mp.Reset ();
	}
};

Mp.Prepared += (object sender, EventArgs e) =>{
	Mp.Start();
};
～略
```

###なんだよ中華タブレット
実はメインでデバッグに使用している中華タブレットで上記のコードでは再生できず、他のエミュレータやSony Tablet Pでは再生されるという現象が発生しました。カスタムファームを使っているからかもしれません。
ただ、

http://developer.appcelerator.com/question/139668/timediacreateaudioplayer--unknown-file-format-error

でも同様現象が起こっているようです。
記載されているshoutcastでの回避方法を取るとshoutcastのみなら再生出来ました。

一体何なんだろう。
Hashって便利ですねぇ

業界4か月、知識も経験もない自分が便利だなぁと思ったことやメモをゆるっと書着とめて行こうと思います。

まぁ
無いバージョンは適当にVenderなりなんなりリネームして突っ込めばバージョンアップでも干渉しないし…
特に使うのはextractです
Cakeのfindallはこれ使わないと値取り出すのにforeach地獄になってソース見にくくなるからなぁ…

```php:hoge.php
$data = array(
    array('Model' => array('id' => 1)),
    array('Model' => array('id' => 2)),
    array('Model' => array('id' => 3))
);
$path = '{n}.Model.id';
$result = Hash::extract($data, $path);
pr($result);
```

```
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
```

あと配列コネコネするのにcombineもよく使います
mapやfilterをうまく使いこなしたいなぁと思いつつも中々使いどころが難しい
map用のコールバックメソッドを上手く作れるようになればこねくり回すのに便利だろうなぁ


------加筆------
内容うっすいので足そうと思ってたら編集途中だったｏｒｚ
紹介してなかったcombineの応用で、配列のグループ化が簡単に行えます。
selectボックス用のoption値にグループ化して突っ込んだりすると非常に楽で綺麗。
わざわざeachやarray_mapとかやるとソースがきちゃなくなるので。
配列地獄な2系もコレで安心

```php:hoge.php
$data = array(
	0 => array(
		'Member' => array(
			'id' => 1
		),
		'MemberInformation' => array(
			'prefecture' => 'ホゲ県',
			'address' => 'ホゲ市'
		)
	),
	1 => array(
		'Member' => array(
			'id' => 2
		),
		'MemberInformation' => array(
			'prefecture' => 'ホゲ県',
			'address' => 'フガ市'
		)
	)
);
pr(Hash::combine($data, '{n}.Member.id', '{n}.MemberInformation.address', '{n}.MemberInformation.prefecture'));
```

```
Array
(
    [ホゲ県] => Array
        (
            [1] => ホゲ市
            [2] => フガ市
        )
)
```

------更に加筆------
Hash:combineって内部でHash::formatするオプションがあるので、文字結合が出来たりしちゃいます

```php:hoge.php
$data = array(
	0 => array(
		'User' => array(
			'id' => 1,
			'name_sei' => 'テスト',
			'name_mei' => '太郎'
		)
	),
	1 => array(
		'User' => array(
			'id' => 2,
			'name_sei' => 'テスト',
			'name_mei' => '次郎'
		)
	)
);

pr(Hash::combine($data, '{n}.User.id', array('%s %s', '{n}.User.name_sei', '{n}.User.name_mei')));
```
```
Array
(
    [1] => テスト 太郎
    [2] => テスト 次郎
)
```
フカシギの通行止め(2012.9.16の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの9日目です。

今日の問題は http://qiita.com/Nabetani/items/9c514267214d3917edf2 にあります。

```hs
module Doukaku.Hukashigi (solve) where
import Data.Char (ord)
import Data.List.Split (splitOn)
import qualified Data.Set as Set

type Pt = (Int, Int)

areaSize :: Int
areaSize = 5

solve :: String -> String
solve input = show $ walk areaSize stop (0, 0) Set.empty
  where
    stop = parse input

parseChar :: Char -> Pt
parseChar = flipTupple . flip divMod areaSize . (subtract $ ord 'a') . ord
  where
    flipTupple (x, y) = (y, x)

parse :: String -> Set.Set (Pt, Pt)
parse input = Set.fromList . map parse' $ stops
  where stops = filter (not . null) . splitOn " " $ input
        parse' (x:y:_) = (parseChar x, parseChar y)

isStop :: Set.Set (Pt, Pt) -> Pt -> Pt -> Bool
isStop stop p1 p2 = Set.member (p1, p2) stop || Set.member (p2, p1) stop

walk :: Int -> Set.Set (Pt, Pt) -> Pt -> Set.Set Pt -> Int
walk size stop current@(x, y) done
  | current == (size - 1, size - 1) = 1
  | x < 0 || x >= size || y < 0 || y >= size = 0
  | otherwise = walk' (x, y - 1) + walk' (x, y + 1)
                + walk' (x - 1, y) + walk' (x + 1, y)
  where
    done' = Set.insert (x, y) done
    walk' pt' = if pt' `Set.member` done || isStop stop current pt'
                then 0
                else walk size stop pt' done'
```

この問題にはsimpath( https://github.com/hiratara/p5-Simpath )という大変効率のよいアルゴリズムが存在しているのですが、今回は素朴な探索で解いています。行き止まりとすでに行った頂点の管理に`Data.Set`を使っています。

問題ページに他の方の回答もありますので、見ると参考になるでしょう。
logwatchに感動した

# インストール

```bash:インストール
$ sudo apt-get install logwatch
```

バージョン確認

```
$logwatch --version
Logwatch 7.4.0 (released 03/01/11)
```

* lm_sensorsも入れると良い。

# 設定

```bash:ひな形をコピー
$ sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
```

```diff:/etc/logwatch/conf/logwatch.conf
- Format = html
+ Format = text
+ MailTo = root
- Detail = Low
+ Detail = Med
+ Service = "-postfix" #postfixのログを除外
+ mailer = "/usr/sbin/sendmail.postfix -t"
```


# 動作テスト

```bash:標準出力
$ sudo /usr/sbin/logwatch --output stdout
```

```bash:debian
$ sudo /etc/cron.daily/00logwatch
```

```bash:centos
$ sudo /etc/cron.daily/0logwatch
```

注意点
=========

```bash:作業用ディレクトリ確認
TmpDir = /var/cache/logwatch
```

処理を途中で中断してしまった場合、`$TmpDir/logwatch?????`という一時ディレクトリが作成され、
次回以降実行ができなくなるので、一般ユーザーで実行してしまった->中断
をした場合など注意。

# ログファイル追加

```bash:ひな形からコピー
cp /usr/share/logwatch/default.conf/logfiles/http.conf \
 /etc/logwatch/conf/logfiles/http.conf
```

```diff:/etc/logwatch/conf/logfiles/http.conf
+LogFile = httpd/*/access_log
+LogFile = httpd/*/error_log
+Archive = httpd/*/access_log.1.gz
+Archive = httpd/*/error_log.1.gz
```

除外したいログがある場合は以下のように書く。

```bash:
LogFile = httpd/[!sv]*/access_log
Archive = httpd/[!sv]*/access_log.1.gz
```

* CentOS4のlogwatchは /etc/log.d/conf/logfiles/


# Disk space にチェック対象を追加

* CentOS6.5にて確認。sambaでマウントしたものが監視対象になっていなかった。
* [centos - Add drive to Logwatch disk space check - Server Fault](http://serverfault.com/questions/367083/add-drive-to-logwatch-disk-space-check)

```bash:スクリプトをコピー
sudo cp -a /usr/share/logwatch/scripts/services/zz-disk_space /etc/logwatch/scripts/services/
```

```diff:/etc/logwatch/scripts/services/zz-disk_space
 sub DiskSpace ()
 {
    if ($OSname eq "Linux") {
-      $df_options = "-h -l -x tmpfs";
+      $df_options = "-h -x tmpfs";
```

```bash:動作確認
sudo /etc/cron.daily/0logwatch
```
アプリカティヴとしての(->)とApplicative Styleの意味


# Applicative Styleで試してみる

`(->)`アプリカティヴに定義された`<*>`の中身は

```hs:
(<*>) f g = \x -> f x (g x)
```

だということを意識しながら、典型的なApplicative Styleの場合：

```hs:
f <$> g <*> h
```

がどんな函数を産みだすのかを（文系情弱なので）愚直に一歩一歩確認してみる。まず`(<$>) f g`は忠実に `(<*>) (pure f) g`として、`\x -> pure f x (g x)` になるが、`(pure f)`は引数を無視してfを返す函数（`(->)`アプリカティヴの`pure`は`f`の実質を変えずに引数の項数だけを形式的に増やす作用だ）なので、`\x -> f (g x)`になる。これはもちろん`(<$>)`が`(.)`と等価なことと平仄が合っていて`f.g`にほかならないが、このラムダ形式のまま次に進む：

```hs:
f <$> g <*> h =

(\x -> f (g x)) <*> h
```

で、次に`<*>`を適用してやると：

```hs:
f <$> g <*> h =

(\x -> f (g x)) <*> h =

\y -> (\x -> f ( g x )) y (h y)
```
ここで`(\x -> f (g x)) y`の部分はまさにyに対するラムダ式の無名函数の適用なのでそうしてやれば：

```hs:
f <$> g <*> h =

(\x -> f (g x)) <*> h =

\y -> (\x -> f ( g x )) y (h y) =

\y -> f (g y) (h y)
```

おお。これはわかりやすい！　これはつまり：

```hs:
f <$> g <*> h $ x =

f (g x) (h x)
```

ということだ。引数に g を作用させたものと 引数に h を作用させたものとを  f に引き渡すような函数が構成された、というわけなんだな。hがなければ、引数にgを作用させたものをfに引き渡すだけだから、函数合成 f.g になるのはもちろんだ。だからこれは函数合成を一般化した形式を提供していることになる。もちろん f はApplicativeな適用先(g ,h, …)と少なくとも同じだけの項数を持った函数である必要がある。

```hs:
f <$> g <*> h <*> i $ x =

f (g x) (h x) (i x)
```

で、たとえば`f = \ x y z -> [x, y, z]`とかにすると、この函数は引数`x`を取って`[g x, h x, i x]`を返してくれるものになるわけだ。つまり、ある同じ引数を同時に多数の函数に引き渡して、そのそれぞれの結果を加工してまとめ上げる、という用途に使えるんだな（おお、なにやらモナドの気配がしてきたような……）。

しかし、そう考えると`(->)`アプリカティヴ・ファンクターの`<*>`の定義とpureの定義は実に巧妙に噛み合ってることになる。凄い。
macでphpunitをインストールする際にpcntlが必要って言われたら

http://phpunit.de/manual/current/ja/installation.html#installation.composer
に従って、composerでインストール中に、
invokerのところで、pcntl入れろと言われる

http://www.php.net/manual/en/pcntl.installation.php

上記を参考にすると成功する

で、再度

```
composer install
```

で終わり

ちなみに、composer.jsonの中身は以下

```
{
    "require-dev": {
        "phpunit/phpunit": "3.7.*",
        "phpunit/dbunit": ">=1.2",
        "phpunit/php-invoker": "*",
        "phpunit/phpunit-selenium": ">=1.2",
        "phpunit/phpunit-story": "*"
    }
}
```
Facadeをつくる

Eloquentじゃない人も、Modelじゃなくてもなんでもですが
独自にFacadeを作成することもできます。
ディレクトリもどこでも良いんですが、app下にextensionsを作ったとします。
(composer.jsonに追加してください)

facadeを通じて使いたいものをこんな感じで作るとします。
laravel4の機能を使いたければ適当にuseしてください

```php:app/extensions/Facades/Hoge/Hoge.php
namespace Hoge;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;

class Hoge
{  
    /**
     * @return string
     */
    public function getHoge()
    {
        return get_class();
    }
}
```

続いてServiceProvider, アクセサ

```php:app/extensions/Facades/Hoge/Facades/Hoge.php
namespace Hoge\Facades;

use Illuminate\Support\Facades\Facade;

class Hoge extends Facade 
{

    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'hoge';
    }
}
```

```php:app/extensions/Facades/Hoge/Provider/Hoge.php
namespace Hoge\Provider;

use Illuminate\Support\ServiceProvider;

class HogeServiceProvider extends ServiceProvider 
{
    
    public function register()
    {
        $this->app->bindShared('hoge', function($app) {
                return new \Hoge\Hoge;
            }
        );
    }
}
```
composer.jsonをデフォルトの状態で利用している方は、忘れずに実行しましょう。

```bash:
php composer dump-autoload 
#またはphp composer.phar dump-autoload
```

providersに追加します

```php:app/config/app.phpまたはapp/config/環境/app.php等
    'providers' => [
        'Illuminate\Foundation\Providers\ArtisanServiceProvider',
        'Illuminate\Auth\AuthServiceProvider',
        'Illuminate\Cache\CacheServiceProvider',
// ~~~
        'Hoge\Provider\HogeServiceProvider',
],
```

任意のcontrollerからcallしてみましょう。

```php:任意のController.php
Hoge::getHoge();
```

という具合で簡単に作る事ができます。
Eloquentを使わずにQueryBuilderや、通常のDB::select() 愛用の方、 
Database操作以外もmodelsに書く方(modelはDatabase操作専用じゃありませんよ！)は
Controllerからは普通に

```php
protected $hoge;

public function __construct(\Model\Hoge $hoge){
    $this->hoge = $hoge;  
}

// もしくは
public function __construct(){
    $this->hoge = App::make("\Model\Hoge");  
}
```

で使ってる人が多いんじゃないかと思います。
*Testを考えたらnewするのもちょっとあれですよね
ロジックすべてをmodelsとしている方はFacadesを独自で作るという方はあまり居ないかもしれませんが、
Facadeを通じて使える様にすると、bladeからも使う事ができますので、
Utilみたいなのを作ったりとかするのがいいのではないかと
ちょっとしたメモ的に使えるプラグイン Scratch


http://plugins.jetbrains.com/plugin/4428

## なにができるの

PhpStorm内でメモ帳的に使えます。
任意の名前が付けれて、自動的に保存してくれます。
プロジェクトを問わず共有しているので結構便利。
デフォルトでは.txt形式で保存されますが、[New Scratch]で作成時に任意の拡張子を付けることで各言語のシンタックスハイライトも適応されます。

ちょっとした作業したり、ちょっと書き留めて置きたい内容とか保存するのにいい感じです。

![全画面_2013_12_09_7_33-2.png](https://qiita-image-store.s3.amazonaws.com/0/20074/58c734d6-c261-3451-052b-93256d10176e.png "全画面_2013_12_09_7_33-2.png")
Cross Platform MIDI Tools Advent Calendar #7: rtmidi-sharp

まだパフォーマンスの観点で少なからず不満点はあるものの、Xwtまわりの作業がそれなりに落ち着いたところで、rtmidiのサポートに真面目に取り組むことにした。何しろ全く動かしていなかったので、まともに使えるかどうか不透明だったのである。そして実際まともに使えなかった。

rtmidiはportmidiとは実装のアプローチがだいぶ異なる。rtmidiにはtimestampのサポートが無い。タイミングが重要な場合は、常に自分で調整しなければならない。portmidiでは一応porttimeというタイマー実装がある…のだけど、実はこれはかなりstaticおじさん設計になっていて、具体的には2つのタイマーを同時に使うことが出来ない(!)。複数デバイス・複数ポートをサポートしようと思ったら、実質的に使い物にならない。そんなわけで、この意味ではportmidiにアドバンテージは無い。メッセージに使われないtimestampが入っている分、かえって邪魔なだけだ。

rtmidiはバイトストリームを受け取るだけなので、portmidiのようにsysexメッセージまわりでややこしい処理を加える必要がない。portmidiはメッセージにtimestampが付いてデータをデバイスに直接送信できないため、sysexを送信する命令は別途定義されていて、この扱いが煩雑になる（rtmidiなら愚直に送るだけ）。

rtmidiにはもうひとつメリットがある。rtmidiはデバイスリストの取得をきちんと動的に行う。呼び出された時点でのデバイスリストがきちんと返ってくる。portmidiはそうなっていない。最初に呼び出された時点でのデバイスリストがキャッシュされ、毎回それが返ってくる。ということは、portmidiを使うアプリだと、起動してデバイスリストを見て「あ、しまった、MIDI楽器を接続し忘れた」と思って、接続して、アプリケーションに戻ってきても、アプリケーションを終了しない限り、過去のリストが残り続けて結局使えないということになるわけである。これは好ましくない。

rtmidiが劣る部分もある。rtmidiはデバイスとポートを別々に扱うようになっていて、一見妥当そうに見えるのだけど、実際に「デバイス」の名前に対応しているのはMIDIドライバーの種類であって、たとえばLinuxならalsaまたはjackだ。それは明らかにデバイスではない。そしてそれぞれのデバイスにポートがある。portmidiでは同一のデバイスがinputとoutputを兼ねるものがあれば、同一のデバイスIDでポートを開くことが出来た。rtmidiでは、inputとoutputは、仮に実際には同一であったとしても区別され、別々のポートIDが割り当てられる（前述の通りrtmidiの「デバイス」はMIDIドライバー種別なので、異なるデバイスは実際にはポートのみで区別される。何とも誤解を招くAPIだ）。

いずれにしろ、筆者としてはさっさとrtmidiに移行したかったわけである（デバイスIDの混乱には目をつぶって）。もっとも、いくつか問題を解決する必要があった。

まず、rtmidiはC++のライブラリであるため、そのままではC#から使えない。P/Invokeするには、Cで書かれたAPIのようにアクセスできる必要がある。C++のライブラリをP/Invokeするためには、名前空間をサポートするために導入された、各種C++コンパイラで使われている命名規則に従ってシンボル名を加工したもの（この加工作業をmanglingという）を指定しなければならず、実質的には無理だ（manglingのルールはコンパイラに依存するから。msvc方式とかgcc方式とかいろいろある）。そんなわけで、単純にrtmidiのAPIを呼び出してcdeclでの呼び出しが可能になるような[rtmidi-c](https://github.com/atsushieno/rtmidi-c)というライブラリを作った。実のところまだOSXビルドもWindowsビルドも用意していないので、正直まだクロスプラットフォームとは言いがたい。そのうちMakefileをいじってビルドできるようにしようとは思っている。（rtmidiのconfigureオプションを変えてリンクするライブラリのフラグを変える程度だ。）

実はC++でビルドされたライブラリのAPIを.NETから使えるようにするためのプロジェクトがあって、過去にはCxxiと呼ばれていて、今はCppSharpと呼ばれているのだけど（名前が変わった理由は日本人にとってはどうでもいいのだがcxxiがsexyと同じ発音になるのが気に入らなかったらしい。あほらしい）、なぜか現状Windowsでしか使えないというイミフな状態になったので、今回は最初から考慮の対象外だった。

rtmidiにはportmidiのようにデバイス管理情報のAPIが整備されていなかったので、portmidi-sharpのAPIに近いものを、rtmidi-sharpの中でも追加することにした。この時、例のデバイスIDとポート番号まわりで少なからず混乱が生じて、デバイスにアクセスするなり落ちたりして、多少対応に時間を取られたものの、その辺りを片付けたら、何とかノートメッセージを送れるようになった。

ただ、ノートメッセージは処理されるようになったものの、なぜか音色変更などが正しく行われない。よく見ると、rtmidiから何かしらエラーがstdoutあるいはstderrに出力されていた（うーん、それは困るかも…）。一体どのメッセージが処理できていないのか調べてみると、どうやらプログラムチェンジ (PC; 0xB0) で失敗しているようだった。ふと思い出して調べてみると、案の定というべきか、PCのメッセージサイズは2バイトだった(!)　portmidiの時は、メッセージを受け取ったportmidiの実装側がよろしくやってくれていたわけである。PCの他にチャンネルプレッシャー (CAf; 0xC0) も2バイトだった。

というわけで、StatusByteの値が0xB0, 0xC0だったら2バイト、他は3バイトで送ることで、この問題は解決…するはずだったが、何やら解決したのは一部の音だけだった。…よく考えてみたら、StatusByteにはチャネルも含まれるので、0xB0, 0xC0 ではなく 0xBx, 0xCx でなければならないわけだ。ありがちな失敗だった。

ともあれ、それらの問題を全て修正した結果、rtmidi-sharpは何とか動くようになった。

とりあえず、rtmidi-sharpは過去のリポジトリではrtmidi-cと一緒くたになっていたのだけど、rtmidi-cだけを独立したリポジトリに含めるようにして、rtmidi-sharpはportmidi-sharpと並べてmanaged-midiに含めることにした。そして最新版のxmdspではrtmidi-sharpを使うようにした。
とあるゲームジャムでやった走り調整

# 今回のお話

* UnityAdventCalender2013 9日目の記事です。
* http://www.oculusgamejam.jp/blog/?p=13
* あまりUnityは関係ない
* RazerHydraの入力をなんとなく扱いやすくした時の話。

## 使ったもの

* Oculus Rift
* RazerHydra
* Unity3d

### 今回の走り調整はどういうものか

RazerHydraのx,y,zの移動量を数フレーム分保持しておいて保持している移動量の平均によって移動量が決まる。


### なんとなく今回のコード
```csharp:走ってよいかどうかを返す関数


// 最終的な走る時の計算に使う値
float averageVelocity = 0;
// 変化量保持用リスト
Queue<foat> velocityCache = new Queue<float>();

// RazerHydraの前回の入力を保持する為の配列
Vector3[] lastPosition = new Vector3[2];

	bool IsMove()
	{

		float velocity = 0;
		for ( uint i = 0; i < 2; i++ )
		{
			if ( SixenseInput.Controllers[i] != null )
			{
				if ( SixenseInput.Controllers[i].Enabled )
				{
					// rhVelocityFilter　入力A、B の差分がしきい値未満あるいはあまりにも大きな変化料の場合は0を、そうじゃない時は差分をそのまま返す
					var diff = rhVelocityFilter (SixenseInput.Controllers[i].Position, lastPosition[i]);
					velocity += Mathf.Abs (diff.magnitude);
				}
				
				lastPosition[i] = SixenseInput.Controllers[i].Position;
			}
		}
		// RazerHydraは入力2つなので1つ分の入力として扱うために2で割る。
		velocity = velocity / 2.0f;

		// ※ノイズの除去 
                // しきい値以上の値の場合のみ変化量保持キューに追加。そうじゃない場合は何もしない。
		if (velocity > velocityLowBorder)
		{
			velocityCache.Enqueue(velocity);
			deltaTime = 0;
		}
		else
		{
			deltaTime += Time.deltaTime;
		}
		
		// キューが保持する予定の最大数を超えたら一番古いのを消す。
		if (velocityCache.Count > cacheCapacity)
			velocityCache.Dequeue();
		// もしも一定時間しきい値以上の入力がなかった場合は変化量保持キューの中身を空っぽにする。
		if (deltaTime > queueResetTime)
			velocityCache.Clear();
		
		// ※ 現在保持している変化量達の平均を出す。
		float total = 0;
		foreach(var vel in velocityCache)
		{
			total+= vel / cacheCapacity;
		}
		
		averageVelocity = total;
		
		// 変化量の平均がしきい値以上だったら動いてよし！
		if (averageVelocity > velocityLowBorder)
			return true;
		else
			return false;
	}

```

自分はこんな感じで移動して良いかどうかの中でそのまま移動の際に使う値も計算してますがきっと行儀悪い…
最終的にはaverageVelocityを実際のプレイヤーが移動する部分で更に各ゲームに合わせた感じで直してやると良いのかも
（自分はここの値を更に計算で変えている）


### 大事そうな所

ずらずら並べた割にはそこまで重要な所は多くなくて
大きく2点
* ノイズの除去
* 一定フレーム分保持されたデータの利用。

この2つなんじゃないかと思います。
ノイズの除去は入力していないつもりの時に勝手になにかしたりするのを防いだりあらぬ操作の元を断つ為に
（どんなゲーム、デバイスでも同じことだと思う）
後者の一定フレーム分保持されたデータの利用は今回は数フレーム分の平均を今回のフレームの移動量の係数にする形を撮っていたけどゲームによってはきっと平均にしなくてもいいと思う。


と、こんな感じで係数はこんな感じで出していたよというお話でした。
ゲームによって様々だと思いますがなんかちょっとした参考になれば幸いです(;´Д｀)


以上ありがとうございました。m(_ _)m
rbenv global 2.1.0-preview2 した話

Ruby 2.1.0 のリリースが目前に迫ってきたので、2.1.0 の現状をまとめました。

続きは [rbenv global 2.1.0-preview2 した話](http://sixeight.hatenablog.com/entry/2013/12/09/031705) で。
簡単サーブレット（WLS）

簡単サーブレット（WLS）
過去にWeblogicでJavaアプリを作って動作確認とかしたログ。
応用して手でDB連携Java書いたりして結合テストや一気通貫のテストで活用した。
機会があれば、その際に使用したJavaのソースをアップできればいいなぁ。

##●簡単なJAVAアプリ作成

**1.JAVAサーブレットを作成する**

```Java:HelloServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Hello World!表示サーブレット **/
public class HelloServlet extends HttpServlet {
 public void doGet (HttpServletRequest req, HttpServletResponse res)
   throws ServletException, IOException {
   PrintWriter out;

   res.setContentType("text/html; charset=UTF-8");
   out = res.getWriter();

   out.println("<html><body>");
   out.println("<h1>Hello World!</h1>");
   out.println("<p>Servletのサンプル（HelloServlet.java）</p>");
   out.println("</body></html>");
 }
}
```

**2.コンパイルする**

```
　$ javac HelloServlet.java
```
   HelloServlet.classというファイルが生成されます。
   mainメソッドがある、通常のJAVAアプリの場合、

```
　$ java HelloServlet
```
で実行できますが、この例の場合、mainメソッドがねえと怒られます。

**3.xmlファイルを作成する**

```:web.xml
<servlet>
 <servlet-name>HelloServlet</servlet-name>
 <servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>HelloServlet</servlet-name>
 <url-pattern>/HelloServlet/</url-pattern>
</servlet-mapping>
```


```:weblogic.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app
http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd>
<weblogic-web-app>
</weblogic-web-app>
```

**4.アプリケーションを構成する**
以下のようなディレクトリ構成にします。

HelloServlet
|
|-WEB-INF
||weblogic.xml
||web.xml
||
||-classes
|||HelloServlet.class
|||

**5.アプリケーションを作成します。**
　HelloServletにcdします。

```
　$ pwd
　HelloServlet
　$ ls
　WEB-INF
　$ jar cvf ../HelloServlet.war *
```

**6.作成したアプリケーションをWebLogicにデプロイしてください。**
http://weblogicサーバ:port/Webアプリケーション名/url-pattern名

```:ex.
http://hogehoge.net:8080/HelloServlet/HelloServlet
```
で、Webアプリにアクセス出来ます。

2011/11/13 up
cocos2d-xのBox2Dサンプルはいくつのcubeで30fpsに落ちる？(Unity2Dとの比較あり

## Box2DのサンプルでCubeの数をどこまで増やすと30fpsに落ちてしまうのか
ふと気になって試してみました。

![IMG_3259.PNG](https://qiita-image-store.s3.amazonaws.com/0/19692/c60a6ccf-376d-5d13-781a-35c6a25c7105.png)

|項目|値|
|:------|-----|
|テスト端末|iPhone4S|
|テスト方法|XCode5 Debugging Tools|

## サンプル変更箇所
- Debug表示の消去
 - 純粋なcube表示のみをテストするため
- Tap Screen表示の消去
 - 同じくcube表示のみをテストするため
- CCBatchNodeのキャパシティを300に変更

## いざテスト
Cubeの数が110を超えたあたりでCube発生時に黄色(-55fps)程度に落ちました

![スクリーンショット 2013-12-09 2.06.13.png](https://qiita-image-store.s3.amazonaws.com/0/19692/cde48b5a-d4d6-1d20-7e0c-7f7ad6bcacff.png)

Cubeの数が170を超えた時点で常に赤色(-29fps)に落ちました

![cocos_scr.png](https://qiita-image-store.s3.amazonaws.com/0/19692/d69426ba-6ea3-12ea-adb2-6b5fd9358f37.png)

![cocos_red.png](https://qiita-image-store.s3.amazonaws.com/0/19692/aef7ff53-2c30-df55-15a5-4e421f94c9ed.png)

## Unity2Dでも試してみました
Unity2DはBox2DをつかっているとTechhillsの資料で見たのですが・・

Cubeの数が275を超えた時点で画面がいっぱいに・・
まだCube発生時に55fpsに落ちる程度。
カスタマイズされているのか？cocos2d-xの元のサンプルが効率悪いのか？

![unity_scr.png](https://qiita-image-store.s3.amazonaws.com/0/19692/e3e7af7f-1c39-9c96-2b61-709809791e28.png)

![Unity2D_scr.png](https://qiita-image-store.s3.amazonaws.com/0/19692/0ab848f4-e029-92d9-4c5f-c60157496540.png)

とはいえ100個も使えればどちでも充分な気がする
おわり

--
Unity比較用プログラムはこちら
https://github.com/keidroid/advent2013
英語が苦手でもできるドキュメント翻訳、2つの方法


こんにちわ。んんつぐです。
僕は英語はさっぱりできませんが、最近いくつかのプロダクトの翻訳チームにジョインしてみました。

"英語が苦手でもできるドキュメント翻訳、2つの方法"
を紹介させていただきます。
英語は苦手でOKです。プロダクトへ貢献したいという思いだけでOK。

#目次

1. 英会話学校を活用する
2. 監訳者と知り合う
3. 翻訳チームへのジョイン方法(随時更新予定)




#1.英会話学校を活用する

いきなりこんなんでごめんなさい。
英語ができないなら、英語がわかる人を連れてきたら良いんです。
昔、ドイツ語の試験にドイツ人を持ち込んだ人がいると聞いた事があります。そういう事です。

とはいえ、

* 英会話学校は高い！
* 先生が日本語をわかってくれないとツラい。。

という方も多いと思います。僕もです。

と、いうわけで、僕は比較的安価で、日本語を話せる講師がメインのオンライン英会話サービス、[ワールドトーク](https://www.worldtalk.jp/)を使用しています。

　　[ワールドトーク](https://www.worldtalk.jp/)

* サイトトップには月額5000円からとありますが、月額3000円のお試しプランもあり
* 日本語で会話可能な講師ばかりなので、英語がわからなくても意思疎通が簡単です。従って、ドキュメントの翻訳に協力してもらうことも容易
* 英会話を始めるきっかけに良いかもしれません


#2.監訳者と知り合う

##監訳者って？
どのプロダクトの翻訳チームにも、監訳者という役割の方がいることが多いです。
そして監訳者は、

* 翻訳チームメンバーが訳した文のレビューをする人。この人のレビューをクリアすると翻訳完了
* 翻訳元と翻訳先(ex. 英語と日本語)に通じている事が多い


一緒に翻訳作業をすることで下記のようなメリットを得られます。

* 翻訳を通してプロダクトに貢献できる
* 英文法やニュアンスに精通している人が多く、レビューのフィードバックを受けることで効率よく英語の学習をすることができる


##どうやって知り合うの？

* 翻訳チームにジョインする
* 翻訳会に参加してみる

Symfonyの場合、下記のような翻訳会が不定期で開催されています。

　　Symfony作業場(翻訳会)
　　http://www.zusaar.com/event/1237006

たいていの場合、監訳者もしくはそれに近い人が主催されています。


#翻訳チームへのジョイン方法(随時更新予定)
##Symfony
##Phalcon PHP
[Phalcon PHPの翻訳チームにジョインした話](http://qiita.com/nntsugu@github/items/77ed9c389d173af3c4f4)
MapBox for iOS SDK を使って、OpenStreetMap を iPhone で表示する


[OpenStreetMap Advent Calendar](http://qiita.com/advent-calendar/2013/osm) 用の記事です。

去年、route-me というSDKを使って OpenStreetMap (OSM) を表示する記事、[地図SDKは MapKit だけじゃない！OSMやBingが使える iOS用 Map SDK、route-me のセットアップ方法](http://qiita.com/hal_sk/items/8f0d1e5b6d90bb93d883) という記事を書いたのですが、だいぶ経っていますので、今回は今をときめく MapBox の iOS SDK を使うという選択肢を紹介します。MapBox iOS SDK は、 route-me をベースに、MapBox の地図を呼び出しやすくする改良を加えたものです。

https://www.mapbox.com/tour/#section-mobile
![MapBoxSDK sample](https://dl.dropboxusercontent.com/u/442212/qiita/mapbox-sdk-sample.png)


# MapBox で地図をデザインする
まず、 https://www.mapbox.com/ にアクセスし、アカウントを作りましょう。サイト右上の Sign up ボタンから簡単に作れます。
ログイン後、「Make a map →」というボタンなどから、早速地図のデザインを行います。
画面のような MapBox editor が立ち上がり、地図のデザインを変更できます。
![MapBox editor](https://dl.dropboxusercontent.com/u/442212/qiita/mapbox-editor.png)
デザインの仕方はそれほど難しくはありませんので、詳しくは解説しません。幾つかプリセットのデザインもありますし、ベースレイヤーを変更したり、水域、道路、建物などの色を個別に変更することもできます。
デザインが決まったら、Save ボタンを押して保存しましょう。
次に、Share ボタンを押し、「Code」タブから **Map ID** をメモしておきます。

地図のベースレイヤーが Streets の場合、Setting画面内Advanced メニューの中にある `Force @2x scale for MapBox Streets`をチェックしておくと、Retina に最適化されます。

# iOS SDK のインストール
次に、iOS 側の設定をしていきましょう。
MapBox iOS SDK は CocoaPods に対応しているので、下記の Podfile でインストールできます。

```Podfile
platform :ios, '5.0'
pod 'MapBox'
```

```shell
pod install
```

# マップを表示
早速MapBoxのマップを表示してみましょう。最初のステップでメモしておいた、Map IDをここで使います。
呼び出し方はとても簡単です。
1. MapBox.h を include する
`#import <MapBox/MapBox.h> `
2. RMMapBoxSource を、initWithMapID でインスタンス化する
3. RMMapView を、2で作ったsource を与えてインスタンス化する
4. 3 のインスタンスを view に加える
のみです。

ソースコードの例

```objective-c:GRViewController.m
//
//  GRViewController.m
//  MapBoxSample
//
//  Created by Haruyuki Seki on 12/9/13.
//  Copyright (c) 2013 Georepublic. All rights reserved.
//

#import "GRViewController.h"
#import <MapBox/MapBox.h> 

@interface GRViewController ()
{
RMMapView *_mapView;
}
@end

@implementation GRViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    RMMapBoxSource *tileSource = [[RMMapBoxSource alloc] initWithMapID:@"メモしておいた Map ID"];
    _mapView = [[RMMapView alloc] initWithFrame:self.view.bounds andTilesource:tileSource];
    [_mapView setZoom:5];
    [self.view addSubview:_mapView];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
```

実行してみると、以下のように地図が表示されるはずです。

![iphone画面](https://dl.dropboxusercontent.com/u/442212/qiita/mapbox-iphone.png)

やりましたね！

MapBox 側でデザインを修正すれば、iOS 側でも反映されます。

また、MapKitライブラリと同じく、マーカーやポリゴンの設置や地図操作の検知なども可能です。
その他、MapBoxで作った複数の地図をレイヤーとして重ねることもできます。

https://www.mapbox.com/mapbox-ios-sdk/examples/ に数多くのサンプルがありますので、是非見てみて下さい。
MapBox を使うと色々できるので、反響次第で続きを書こうかと思っています。
FMX と OpenCV でリアルタイムに顔認識

・![SnapShot.png](https://qiita-image-store.s3.amazonaws.com/0/31414/8a372193-4f3a-ee20-66f3-9b7e05da73c1.png)
オープンソースのコンピュータビジョン用ライブラリ OpenCV を利用して、WEBカメラ の映像からリアルタイムに人の顔を認識してみます。もちろん原理的に、与えられた写真(静止画)から、写っている顔を抽出するといった用途にも応用できます。
・[リアルタイムに顔認識](http://www.luxidea.net/delphi-lab/facedetect/) @ [LUXIDEA institute](http://www.luxidea.net/)
RecSys Handbook Chapter1 1.3

前回の続きです。
引き続きイントロダクションです。
前回分はこちら↓↓
**Chapter1 1.1~1.2**　http://qiita.com/ru_pe129/items/14d502ac4069389f0327
* * *
##1.3 Data and Knowledge Sources
RSに用いることができるデータの多様性が高まってきたため、うまく推薦できるかどうかは推薦手法に大きく依存すると言えるが、RSに用いられるデータも手法によって様々である。用いるデータの例としてはアイテムに対するユーザーの評価、社会的関係、アクティビティ、制約条件などがあげられる。一般的に、アイテム、ユーザー、トランザクションの３つに分けることができる。

**アイテム**：アイテムは推薦によって示すもののことである。アイテムには常にコストがかかる。実際に商品などを購入する時のコストはもちろんだが、検索や閲覧によって生じる「認知コスト」も考慮しなければならない。認知コストが低いアイテムの例としては映画やCDが例として挙げられる。認知コストが高いアイテムの例としては、パソコン、旅行、投資などが挙げられる。

**ユーザー**：それぞれのユーザーは異なった目的を持っており、パーソナライズした推薦を行うことが重要である。RSはユーザーの好みに応じて推薦を行うものであるが、ユーザーをモデル化するツールとみなすことも出来る。

**トランザクション**：ここではユーザーとRSのやりとりをトランザクションと定義する。ユーザーとRSのやりとりで生まれるデータやアイテムに対するユーザーの評価もトランザクションに含まれる。トランザクションをRSに用いることでユーザーの行動を推薦に用いることができ、さらにユーザーからのフィードバックによってRSを磨くことが可能となる。

* * *

メモを書きながら読むとスピードがすごく落ちるので、もう少しざっくりとしたメモにしていきたいですね…
イントロダクションはしかたないといえばしかたないですが…
mruby-clearsilver を作ってみた

この投稿はmruby Advent Calendar 2013の9日目の記事です。

# mruby-clearsilver について

Apache モジュールでアプリケーションを実装するためにいくつか調査していたときに、HTML のテンプレートエンジンはないかなーと思い、探していたところ ClearSilver にたどり着きました。
既に更新が止まっていますが、それなりに安定して使えるとは思います。

https://github.com/qtakamitsu/mruby-clearsilver.git https://github.com/qtakamitsu/mruby-clearsilver

機能はシンプルで、HDF というデータに埋め込むデータをセットして、CS でレンダリングするというもの。  

    hdf = ClearSilver::HDF.new
    hdf.set_value "aaa", "000"
    hdf.set_value "name", "Administrator"
    hdf.dump

    cs = ClearSilver::CS.new(hdf)
    cs.parse_file('Welcom to ClearSilver, <?cs var:name ?>!')
    r = cs.render()
    puts r


# 作った経緯なんか
mruby を Apache 上で動かせたり、DB につなぐためのライブラリがあったり、キャッシュするための redis ライブラリがあったりと、これだけライブラリがそろっているなら mruby でアプリケーションが作れないかなと思い立ったのが経緯です。それに、別のことで HTML のテンプレートエンジンについて調査していたので。

# 作ってみた感想など
作ってみたものの、ClearSilver の更新がないことや古いことは、実用から考えると弱いと思います。
ただ、mruby ライブラリ作成の経験としてはシンプルで良かったのかなとは思いました。
T-Code から愛を追放する。

# T-Code から愛を追放する。

 [2013 漢直 Advent Calendar](http://connpass.com/event/4074/) 8日目のエントリーです。

T-Codeを使っていて色々打ち損じを行うのは、私のような半端T-Coderにはよくある。
「クラス」を「クスス」と入力したりLRをRLにRLをLRの打鍵のように左右の打鍵の順序を逆に入力してへんな文を入力してしまったりとかだ。
別に意味不明な文になるならまあいいけど、文の終りに「。」を入力しようとして「愛」が入力されることがしばしばある。
これが痛烈なのは、週報とかフォーマルな文章でたまにやらかす。推敲をあまり入れないのでそのまま公開される。
するとフォーマルな文体の中に愛が突然出てくる。恥かしい。人間が対象の文だった場合は特に参るね。

しかし、[T-code best practices その3 (漢直advent calendar 7日目) ](http://htn.to/yHXwtS) を見て即効解決!
「愛」も「。」に吸収統一だ。

```
(add-hook 'tcode-after-load-table-hook
          (lambda ()
            (when (eq tcode-input-method 'tcode)
	    (tcode-set-action-to-table '(23 25) "。"))))
```

標準の辞書使っていると愛が部首合成入力しにくくなるからbushu.revにでも次のように入れとくといいんじゃないかと。
`愛受友` or `愛受心`

これで安心して業務でT-Codeを使えるようになります。
PixilangでやるAudio Visual Programming

# ピクセル指向プログラミング言語 Pixilang
[Pixilang](http://www.warmplace.ru/soft/pixilang/)はロシア発のプログラミング言語で、グラフィックスとかサウンド系の簡単なアプリを作るのとかに使える感じの言語です。この間[窓の杜のレビューで取り上げられていた](http://www.forest.impress.co.jp/docs/review/20131129_625740.html)シンセアプリ[PixiTracker](http://www.warmplace.ru/soft/pixitracker/)もPixilangで作られていて、頑張ればしっかりしたアプリも作れるみたいです。
Pixilangについては過去に僕のブログでちょっと紹介しているのでとりあえずそれを読んでみてください。[ブログ内をPixilangで検索](http://mandel59.hateblo.jp/search?q=Pixilang)
# ピクセル指向
もともとは非プログラマーだとかデモ製作者とかデザイナーだとかをターゲットにした言語だそうです。でもまあ本当のプログラミング未経験者が簡単にグラフィックスとかサウンドとか華やかな作品を手軽に作りたいって思うなら、Processingのほうが向いているんじゃないかなと思います。ドキュメントも機能も沢山あるし。
Pixilangには、円を書くみたいな命令もなくて、プリミティブな命令ばかりです。それでも、頑張れば色々な機能が実装できるし、実際に優れたアプリが開発されているので、機能が足りないわけではないと思います。pixel-orientedなので、自分でドットを打って絵を書いたり、PCM波形を書き込んで音を鳴らしてください。そういう言語なので、プチコンやHSPみたいなのものでプログラミングするのが好きな人に向いていると思います。
# 構文
ぱっと見Cっぽい。文末のセミコロンはあってもなくてもいい。改行は無視される。ローカル変数の頭には$が付く。for文は無いみたいだからwhile文で代用すること。などなど、詳しくは[マニュアル](http://code.google.com/p/pixilang/wiki/PixilangV3Manual)読んだり、実際に使いながら覚えるのが早いと思う。
注意点として、

```
x + 1
```

という文があったら、これはC言語でいう

```
x += 1
```

の意味です。
# コンテナ
Pixilangのデータは全部数値で、データ構造は全部コンテナ（配列）です。新しいコンテナはnewで生成し、removeで削除します。GCなんて機能は付いていないので、newし続けてremoveしないと、コンテナIDを使いきってエラーになるので、ちゃんとremoveするように頑張ってください。
「文字列」の実体はコンテナです。コンテナにはIDが振られていて、これは数値です。たとえば次のプログラム。

```
i = 0
while i < 10 {
  x = "hello"
  printf("%d %s\n", x, x)
  x[0] + 1
  x[1] + 1
  x[2] + 1
  x[3] + 1
  x[4] + 1
  i + 1
}
```

実行結果はこうなります。（実行前後にVMのメッセージが表示されますが省略しています。）

```
7 hello
7 ifmmp
7 jgnnq
7 khoor
7 lipps
7 mjqqt
7 nkrru
7 olssv
7 pmttw
7 qnuux
```

while文の中にx = "hello"という文があるのですが、コンテナがhelloという内容に初期化されるのは1回だけで、あとは同じコンテナIDがxに代入されるだけです。この性質を理解していないとはまります。printfの書式指定子の指定次第で、コンテナIDが表示されたり、コンテナの中身を文字列と解釈して表示したりしていることにも注目してください。

# 使ってみた
[春学期の実験でPixilangを使いました](https://gist.github.com/mandel59/7709562)。使う必要全くない実験だったんですけど、まあなんとなくOpenCV使いたくなくて、Pixilangで直接画像いじればいいや的な感じで使いました。

Kinect叩くためにVisual C++でラッパーDLLを作って、それを呼び出しています。ついでに画像処理も一部C++で実装しています。モダンな機能なんて全然ないけど、まあC言語でプログラミングできるなら使えなくはない。グローバル変数使いすぎな感じがするけど、この程度の規模のプロジェクトならまあ許容してください。ピクセル指向なんで……

# 移植性
PixilangはWindows, Mac OS X, Linux, Android, iOS, WinCEと、多くの環境に対応しています。Pixilangでアプリを作ったら、それにVMのバイナリを付けてそのまま配布できちゃいます。いいですね。もちろんDLL叩いている場合とかは、環境ごとにコード切り替える必要ありますけどね。

# 興味が出てきたら
とりあえずPixilangをダウンロードして、サンプルを動かしてみてください。そしてソースコード読む。
[Soul Resonance](http://www.warmplace.ru/music/soul_resonance/)っていうAudio-visualアルバムも、Pixilangで実装されていて、これはソースコードが読めます。こういったプログラムを参考ににして、PixiTrackerや[SunVox](http://www.warmplace.ru/soft/sunvox/)で作った楽曲をビジュアライズしてみてはいかがでしょうか?
SystemCでカーネルをカスタマイズするときに役に立つ技

こんばんは@pasonatsutanです。参加者の皆様がHDLバリバリなので、gkbrですが、ぼくは、HDLのことはほとんど知らないので、臆せずにsystemc寄りの記事を書いていきたいと思います。

# SystemCを自分用にコンパイルする
SystemCを使っていると、自分用にシミュレータに手を入れたくなりますよね。その時、元のSystemCの環境と手を入れたSystemCの環境を間違えてリンクしてしまうかもしれません。そんなときは、systemc-2.3.0/src/sysc/kernel/sc_ver.h の文字列を書き換えてSystemCをコンパイルしましょう。

```cpp:systemc-2.3.0/src/sysc/kernel/sc_ver.h
#define SYSTEMC_2_3_0
#define SC_API_VERSION_STRING sc_api_version_2_3_0_custom //ここを好きな文字列に
```

#間違えてinclude、もしくは linkすると
include しているヘッダーファイルと、リンクしようとしているライブラリのバージョンが違うときはこのようなエラーがでます。

```
g++ -o test.exe -L. -L../lib-cygwin -lsystemc -lm  test.o /lib/libtcl.a
test.o:test.cpp:(.text+0x34): `sc_core::sc_api_version_2_3_0_custom::sc_api_version_2_3_0_custom()' に対する定義されていない参照です
collect2: ld はステータス 1 で終了しました
Makefile:15: recipe for target `test.exe' failed
make: *** [test.exe] Error 1
```

逆にいうと、普通にSystemCを使っていてこのようなエラーが出たときは、インクルードしているバージョンと、リンクしているバージョンが違います。
Recruit Programming Contest でハマった話

本日 12/08 は [Recruit Programming Contest](http://progexercise.dev.indeed.net/progcontest/problems) というものに参加してきました。登録した時は他にネタを考えようと思っていた (研究で使っているコードの一部を解説するとか) のですが、これに参加することを決めたので他に準備できませんでした。

プログラミングコンテストというのは制限時間内に仕様に沿うプログラムを書くゲームです。[AtCoder](http://atcoder.jp/) をはじめ、色々なプログラミングコンテストでD言語を使っている人が増えています。

## A: 部分和
### 問題
非負整数のリストが与えられる。最上位の桁が同じ数字である数のみを足すことによって得られる和のうち最大のものを求めよ。
### 解答
最上位の桁は高々10個なので、和を全て求めて最大値をとればよい。first_digit なる関数を再帰で定義してループ1回で10個の和を求める。最大は reduce!max ですね。

## B: ゴーストライティング
### 問題
テキストがいくつか与えられる。最初のものと平均単語長が最も近いものを求めよ。
### 解答
平均単語長は line.split().map!(a => a.length) してから reduce!((a, b) => a + b) / length すれば OK 。
#### どう書こう?
いくつかの候補 x[i] から、ある関数 f による評価 f(x[i]) が最小 (最大) になるものについて、g(x[i]) を求めるという問題は多い。状態変数を持ってループで回しているが、もっといい書き方はないだろうか?

## C: DivMultSub
### 問題
カードを順に引いていくゲームがある。勝者のスコアを求めよ。
### 解答
素直にシミュレーションすればよい。label つきループの break label; や std.bigint : BigInt, そして foreach より細かく制御できる empty-front-popFront トロイカを使った。

## D: 重なり合った矩形
幾何あんまり得意じゃない。スキップ。

## E: 期待リスク
### 問題
戦闘ゲームがある。終了時に残る自分の兵士の期待値を求めよ。
### 解答
(自分の残り兵士の数, 相手の残り兵士の数) を引数にした関数の std.functional : memoize で OK!
#### しかし…
しかし関数内の関数を memoize しても、親の呼び出しを通じて共通の memo が使われてしまうという仕様のため、std.functional : memoize をそのまま使うことはできない。と思って自分で memo を書いた。が、実はこの問題では単に memoize でよかった。

memoize と関数内関数との相性を良くする方法は [k3_kaimu 氏によるシンプルな実装](http://dpaste.dzfl.pl/91637e94) がある。

## F: ホットキーとコールドコール
### 問題
いくつかの単語が与えられる。すべての単語が同じ行の文字で構成されるようなキー配列が存在すれば求めよ。
### 解答
同じ単語に含まれる文字は同じ行にならなければならない。これは Union Find を使う。のが普通だが、そうではない実装で char[] を sort して uniq しようとしていたらコンパイルエラーに。Union Find で回避できたが、どの文字集合をどの列に割り当てるかを探索する方法が思い浮かばなかったので正解できず。
#### char[] は sort できない
[mono_shoo さんが教えてくれたところ](https://twitter.com/mono_shoo/status/409585087269703680) によると、char[] は1要素が1文字に対応しているとは限らないため無造作には sort できないことになっているとのこと。to!dchar[] または cast(ubyte[]) を経由すれば sort できる。

## G: ACME Puzzle Box
### 問題
完成したパズルを接着して保管したい。接着コストは接着部分によって異なる。必要最小限の接着コストを求めよ。
### 解答
最小全域木だ! ということはわかったが実装が間に合わず終了。

## H: 冷たいマシン
手も足も出ず。

## 結果
4問正解で144人中65位。

## 結論
より「D言語らしい」コードを目指すために、D言語erの方々はぜひ競技プログラミングで活躍して手本を見せてください!
サインオシレータを作る

ソフトシンセを作りたいのでその準備．
まずはサインオシレータを作ってみた

```c++:occilator.cpp
#include <iostream>
#include <math.h>

class Occilator
{
    private:
        double x1;
        double x2;
        double k;
        double kk;
        double amp;
        double freq;
    public:
        Occilator();
        ~Occilator();
        void start();
        void setFreq( double );
        void setAmp( double );
        double getNext();
};

Occilator::Occilator()
{
    x1 = 0;
    x2 = 0;
    freq = 0;
    amp = 1.0;
}

Occilator::~Occilator( )
{
}

void Occilator::start()
{
    x1 = 1.0;
    x2 = k ;
}

void Occilator::setFreq( double f )
{
    freq =  f;
    k = cos( 2 * M_PI * f );
    kk = k * k;
}

void Occilator::setAmp( double a )
{
    amp = a;
}

double Occilator::getNext()
{
    double nx;
    double ny;
    double tmp;

    tmp = ( 1.0 - kk );
    nx = k * x1 + tmp * x2;
    ny = -x1 + k * x2;
    x1 = nx;
    x2 = ny;

    double p;
    double g;

    p =( x1 * x1 ) + tmp * ( x2 * x2 );
    g = 1.5 - p;

    x1 = g * x1;
    x2 = g * x2;

    return amp * x1;
}

int main(int argc, char const* argv[])
{
    Occilator os1;
    Occilator os2;

    os1.setFreq( 0.005 );
    os1.setAmp( 0.1 );
    os1.start();

    os2.setFreq( 0.1 );
    os2.setAmp( 3.5 );
    os2.start();

    for( int i = 0; i < 400; i++ )
    {
        std::cout << os1.getNext() * os2.getNext()  << std::endl;
    }

    return 0;
}
```
結果は以下の感じ
![sin.png](https://qiita-image-store.s3.amazonaws.com/0/16415/e02e2d12-3571-06ec-0a06-02f74d7021fd.png)
git-jumpですぐ編集


元々考えていたネタがボツになってしまったので急いで書き上げました
内容が薄くてすみません…

diff-highlight
---

↓のエントリを見てをdiff-highlightを設定したところ、ライフがチェンジングになった人は多いのではないでしょうか。

[Git の diff を美しく表示するために必要なたった 1 つの設定 #git - 詩と創作・思索のひろば (Poetry, Writing and Contemplation)](http://motemen.hatenablog.com/entry/2013/11/26/Git_%E3%81%AE_diff_%E3%82%92%E7%BE%8E%E3%81%97%E3%81%8F%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%9F%E3%81%A3%E3%81%9F_1_%E3%81%A4%E3%81%AE%E8%A8%AD)

あらためて考えると、contribの中身をマジメに見たことがなかったことに気付き、軽く覗いてみることにしました。  

contribの中身
----

環境はMacOSX、git 1.8.5.1(homebrew 利用)です

~~~
$ tree -L 1 /usr/local/share/git-core/contrib
.
├── README
├── buildsystems
├── completion
├── contacts
├── convert-objects
├── credential
├── diff-highlight
├── diffall
├── emacs
├── examples
├── fast-import
├── git-jump
├── git-resurrect.sh
├── git-shell-commands
├── gitview
├── hg-to-git
├── hooks
├── mw-to-git
├── p4import
├── persistent-https
├── remote-helpers
├── remotes2config.sh
├── rerere-train.sh
├── stats
├── subtree
├── svn-fe
├── thunderbird-patch-inline
├── vim
└── workdir

25 directories, 4 files
~~~

completion、credentialあたりはすでに使っている人も多そうですね。  
軽く見てみたところ、便利そうなコマンドがありましたので、そちらを共有したいと思います。

git-jump
---

条件に合うファイルを即エディタで開いてくれるコマンドです   

### 使い方

~~~
$ git jump diff # 変更があるファイルをエディタで開く

$ git jump merge # コンフリクトが起きているファイルをエディタで開く

$ git jump grep <pattern> # patternにマッチしたファイルをエディタで開く
~~~

コマンド1発ですぐエディタが開くので、探す→エディタ立ち上げという1手間が減るので便利になるシーンもありそうです。

終わりに
---

本当はもっとcontribの中身を調べたかったのですが、時間がなかったので1つのコマンドだけを紹介しました  
他にもhttps接続を高速化するpersistent-httpsや、.git/remotesを書き換えるremotes2config.shなど、はまれば便利になりそうなツールがあるので、一度git-core/contribを覗いてみてはいかがでしょうか


次は @camelmasa さんです。
ご家庭でFluentd


多くの方はFluentdを業務で利用しているかと思います。私も普段の業務で使っており、ログの収集、転送、分析、加工にと大変はかどっています。
その話もどこかでノウハウをまとめて共有しようと思っていますが、ここでは扱いません。

このエントリーでは私の家庭でのFluentd活用の話をします。家にあるサーバと手元のノートでFluentdを動かしており、連携させながら、プライベートな処理をぐりぐり動かしています。

自由度高くかつ心配事少く気軽に運用がはかどっているので、その一端をご紹介しします。

## Fluentdを動かす環境

Raspberry PiにRaspbianを入れ、rbenv + ruby-buildでRubyを導入した上で、Fluentdをインストールしています。
Fluentd本体やプラグインを含め、全てのgemの管理はbundlerにゆだねています。

## このマシンで完結する処理の場合

Raspberry Piは速くない、SDカードしか指してないのにストレージに限りがあるという問題以外は、普段仕事で使っているのと同じく、プラグインを入れて、fluent.confを書いてやるだけです。

## 他のマシンのFluentdと連携させたい場合

普段使いのノートPCのストリームをRaspberry PiのFluentdに流しています。といっても、out/in_forwardでつなげているわけではないです。
外に向けて待ち受けるものを作ると不安事や対策しなければならない事が増えるので、そういう事はやりたくありませんでした。

そこで、https://github.com/ixixi/fluent-plugin-sqs を用いて、Amazon SQSを利用しています。これによってキューという状態を持つ部分を管理しなくて済み、ごちゃごちゃになりがちなプライベート環境をImmutableに仕立てやすくなります。また流し込まれる側はポートを開いて待ち受ける必要がないので運用時の不安事が減ります。

### config例

ノートPCからはAmazon SQSにストリームを流し、Raspberry PiはAmazon SQSからストリームを取り出しています。

具体的には、ノートPCが稼働している間、ハートビートをRaspberry Pi経由で色々なところに流し込んでいます。この例ではidobataに流しています。

#### ノートPC側

````
  <match maclate2010.**>
    type copy
    <store>
    type sqs
    aws_key_id XXXXXXXXXXXXXXXXX
    aws_sec_key YYYYYYYYYYYYYYYYYYYYYYY
    queue_name VVVVVVVVVVVVVVVVVVVVVVVV
    sqs_endpoint sqs.ap-northeast-1.amazonaws.com
    </store>
    <store>
      type stdout
    </store>
  </match>

  <source>
    type exec
    command date | tail -n 1
    keys k1
    tag maclate2010
    run_interval 300s
  </source>
```

#### Raspberry Pi側

```
  <match bash0C7.**>
    type copy
    <store>
      type idobata
      webhook_url https://idobata.io/hook/ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
      message_template <%= record[:body] %>
    </store>
    <store>
      type null 
    </store>
  </match>
  <source>
    type sqs
    aws_key_id XXXXXXXXXXXXXXXXX
    aws_sec_key YYYYYYYYYYYYYYYYYYYYYYY
    sqs_url https://sqs.ap-northeast-1.amazonaws.com/VVVVVVVVVVVVVVVVVVVVVVVV
    sqs_endpoint sqs.ap-northeast-1.amazonaws.com
    receive_interval 30
    tag bash0C7
  </source>

```

なお現時点では、https://github.com/ixixi/fluent-plugin-sqs のSQS Input Pluginはgemとしてまだリリースが行われていないので、Gemfileでgithub側を指すようにしてください。

## もちろんスタンドアロンでも捗る！

Twitter検索 -> 画像取得 -> tumblr投稿を自作railsアプリからFluentdベースに移植した話は後で書きます。

## 次回予告

明日は私の元"向かいの人"で、技術の高さに熱意の凄さにと常々リスペクトしている [@suzu_v](https://twitter.com/suzu_v) 先生です。寒い冬を沸かせる超絶技巧エントリを期待しましょう。

## 参考資料

このエントリーの内容を含む話を、[Fluentd Casual Talks #3](http://atnd.org/events/45386) でLTしました。
資料は下記で公開していますのでご参照ください。

https://speakerdeck.com/bash0c7/fluentd-in-my-sweet-home
ARモデルにおけるゲインの決定

ARモデルで信号を近似するたびにゲインをどうするか悩んでいる気がするので,
備忘録をかねてここに載せておく事にした.

信号x(n)に対するp次の線形予測信号$\hat{x}(n)$と誤差信号$e(n)$は以下の様に表現される.

![form01.png](https://qiita-image-store.s3.amazonaws.com/0/16415/35687b55-06fb-93f0-3fd1-a7b4f4f5e6e3.png)

ここで，上述の式に対してZ変換を適用すると

![form02.png](https://qiita-image-store.s3.amazonaws.com/0/16415/7651ed49-c837-a834-6f55-345da33018f0.png)

次に，以上の結果をもとにARモデルによって信号$X(z)$を近似する事を考える．
ここで，合成フィルタを$H(z)$，合成信号を$Y(z)$，励起信号を$\tilde{E}(z)$とすると，以下の関係が成立する．

![form03.png](https://qiita-image-store.s3.amazonaws.com/0/16415/4419cfb2-3b27-9f3d-085b-0e3b53979428.png)

このとき，$\tilde{E}(z) = E(z)$であるならば，$Y(z) = X(z)$である．
したがって，ホワイトノイズやパルス列など誤差信号以外を励起信号として用いる場合においても，励起信号のエネルギーをE(z)のエネルギーと等しくすることにより，より良好な近似が可能となる．

ここで，分散が1であるホワイトノイズを励起信号として用いる場合を考える．すると，合成フィルタH(z)は以下の様に修正される．なお，以下の式においてGは合成フィルタのゲインを表す．

![form04.png](https://qiita-image-store.s3.amazonaws.com/0/16415/db6f4a6a-985f-1e56-4299-9a1a808d84a2.png)

上述の結果より，合成フィルタのゲインは誤差信号の振幅と対応する事から，以下の関係が成立する．なお，$r_{xx}$は$x(n)$の自己相関関数である．

![form05.png](https://qiita-image-store.s3.amazonaws.com/0/16415/39d847ad-3984-c8d3-1a6c-4d46d42bf459.png)  

通常，自己相関関数$r_{xx}(n)$はレビンソン-ダーヴィンアルゴリズムを用いる際に既に計算済みである．
したがって，その計算結果を利用する事が可能である．
OpenCVをソースコードから導入するメモ

##なにわともあれgit clone
OpenCVもいつの間にかgithubで管理されているらしいので，自分のリポジトリにForkしてCloneする．
昔はSubversionだった気がするんだけど気のせい？？

```sh
$ git clone https://github.com/ar90n/opencv.git
```
##静的ライブラリでビルド & 動作確認
ちょこちょことライブラリ自体を改変することを考慮すると，静的ライブラリで作成したほうが楽な気がしたので.aを作成する方向で進める．
静的ライブラリを作成するためには，cmake に -DBUILD_SHARED_LIBS=no を設定してやると良いっぽい．
あと，今回は/opt/local/以下にインストールすることにした．

```sh
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/local -DBUILD_SHARED_LIBS=no 
$ make
```
なお，pkg-config は デフォルトでは OpenCV を見つけてくれないので，PKG_CONFIG_PATH に /opt/local/lib/pkgconfig/ を追加する．
あとは適当にサンプルを動かして動作を検証した．

```sh
$ cd sample/cpp
$ g++-4.9 edge.cpp `pkg-config --libs --cflags opencv`
$ ./a.out
```
![opencv_result.jpg](https://qiita-image-store.s3.amazonaws.com/0/16415/0e8446cc-ee4c-72cc-c6af-c15064e70b3a.jpeg)
C++による簡単実習 3次元CG入門　第2版のサンプルをMacで動かす

##はじめに
色々とあって，[C++による簡単実習 3次元CG入門　第2版](http://www.morikita.co.jp/books/book/2149)って本を読んで軽く3DCGを勉強中．
CGの基礎から実装方法まで書かれていて非常に良い本なんだけど，サンプルコードの動作に必要なライブラリがWindows向けとLinux向けしかリリースされていないので，Mac向けにちょっと移植してみた．

##バックエンドはHighGUIで
この本のサンプルコードはWinクラスというウィンドウ関連の処理を行うクラスを利用しているのだが，
このWinクラスの実装がwin.aというバイナリで提供されているため，Macでは動作しない．
そこで，今回はこのwin.aに相当する部分をHighGUIで実装することにした．
幸いなことに，サンプルコードがpimplイディオムを使用していたので，もとからある部分は全く修正せずにサクッと実装できた．
興味のある方は[こちら](https://github.com/ar90n/HighGUI3DCG)からどうぞ．

##実行結果
トーラスと球をフラットシェーディング，グーローシェーディング，フォンシェーディングでレンダリングした結果．なかなかそれっぽく動作してる．

![flat.jpg](https://qiita-image-store.s3.amazonaws.com/0/16415/998d14f5-8e61-8693-3788-0c26bfc0b369.jpeg)
![gouraud.jpg](https://qiita-image-store.s3.amazonaws.com/0/16415/0ca666a6-3257-5827-7dd2-0b34353d0482.jpeg)
![phong.jpg](https://qiita-image-store.s3.amazonaws.com/0/16415/cebedd6b-6ec7-8e73-6879-367e535c4e45.jpeg)
TestLink の REST API を触ってみた

数日前に TestLink の XML-RPC についての記事を書かしてもらいましたが、
現状のTestLinkにあるREST もどんな状況なのかな？
というのが気になったので、触ってみました。

## 結論
結論から言うと、まだまだ業務に使用できるほどの機能は実装されていない
という感じです。

逆に、今のうちにゴリゴリ実装して、pull リクエストでも投げてみたら
取り込んでもらえる可能性大ってところでしょうか。

## やったこと
### REST API ソースチェック
REST API のソースは TestLinkディレクトリから `lib/api/rest/v1` と辿った先にある
`tlRestApi.class.php` がそれです。

その中のコンストラクタの中に使える api の一覧があります。
私の環境では以下の通りでした。

| Type | API | 内容 | Api Key の指定 |
| -------+-------+------+-------------------------------------------------|
| GET | /who | *ltRestApi : Get Route /who* の文字列を返す | 必要なし |
| GET | /whoAmI | *ltRestApi : Get Route /whoAmI* の文字列を返す | 必要 |
| GET | /testporjects | テストプロジェクト情報の一覧を取得 | 必要 |
| GET | /testprojects/:id | :id で指定したテストプロジェクト情報を取得 | 必要 |
| POST | /testprojects | *未調査 ( テストプロジェクトを作成する ? ) * | 必要 |
| POST | /executions | *未調査 ( テスト結果を記録する ? ) * | 必要 |
| POST | /testplans | *未調査 ( テスト計画を作成する ? ) * | 必要 |
| POST | /testplans/:id | *未調査 ( テスト計画を編集する ? ) * | 必要 |
| POST | /testsuites | *未調査 ( テストスイートを作成する ? ) * | 必要 |
| POST | /testcases | *未調査 ( テストケースを作成する ? ) * | 必要 |

### Ruby で REST API にアクセス
以下のようなサンプルプログラムを作成しました

```rb:test.rb
require 'net/http'
require 'uri'
require 'pp'
require 'json'

class TestLinkRestBase
  class << self
    attr_accessor :site
    attr_accessor :prefix
    attr_accessor :collection_name
    attr_accessor :header

    def start
      url = URI.parse(site)
      api_url = "#{prefix}/#{collection_name}"
      p api_url
      Net::HTTP.start(url.host, url.port) { |http|
        http.get(api_url, header)
      }
    end
  end
end

class Who < TestLinkRestBase
  self.site = 'http://localhost/'
  self.prefix = '/testlink-1.9.9/lib/api/rest/v1/'
  self.collection_name = 'who'
end

class WhoAmI < TestLinkRestBase
  self.site = 'http://localhost/'
  self.prefix = '/testlink-1.9.9/lib/api/rest/v1/'
  self.collection_name = 'whoAmI'

  self.header = {
    "PHP-AUTH-USER" => "XXXXXXXXX" # ここはTestLinkで生成したAPIキーを指定
  }
end


puts "Get /who"
res = Who.start
pp res.body #=> "tlRestApi : Get Route /who"
# who の 結果はJSONでパースできない文字列で返ってきます

puts "Get /whoAmI"
res = WhoAmI.start
pp JSON.parse(res.body) #=> {"name" => "tlRestApi : Get Route /whoAmI"}
```