OmniAICreator/Qiita-1.07M huggingface dataset:
【commons-lang3】 ObjectUtils のよく利用する（しそう）メソッド

メモ
おもに null safe ( java 8で使わなくなる可能性高いなぁ）

```java

import org.apache.commons.lang3.ObjectUtils;

public class Main {

	public static void main(String[] args) {
		String a = null;
		String b = null;
		String c = "null";

		// 複数のオブジェクトで null ではない一番左の Object を取得する。
		System.out.println(ObjectUtils.firstNonNull(a, b, c));
		;
		// null safe な object#hashCode
		System.out.println(ObjectUtils.hashCode(c));
		// null safe な object#hashCode ( 複数ハッシュ計算 )
		System.out.println(ObjectUtils.hashCodeMulti(a, b, c));
		// null safe な object#toString
		System.out.println(ObjectUtils.toString(c));
		// null safe な object#toString ( null の場合の文字列指定 ）
		System.out.println(ObjectUtils.toString(c, "-"));
		// null safe な compare
		System.out.println(ObjectUtils.compare(a, b));

		// StringUtils#defaultIfNull の Object版
		System.out.println(ObjectUtils.defaultIfNull(b, c));

		// 一致しない
		System.out.println(ObjectUtils.notEqual(b, c));
		// 一致する
		System.out.println(ObjectUtils.equals(a, b));

	}
}
```
QuickFixウィンドウの文字化け対策


外部grepを使って検索した結果のQuickFixが文字化けしている場合の対処方法
※ソースがsjisなど

```vim
set shellpipe=2>\&1\|nkf\ -uw>%s
```
のようにフィルタをかませておけばいいみたい。
【commons-lang3】 ArrayUtils のよく利用する（しそう）メソッド

メモ

```java


import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

public class Main {

	public static void main(String[] args) {

		// 配列の末尾に追加する。（単数）
		int[] array = ArrayUtils.add(ArrayUtils.EMPTY_INT_ARRAY, 1);
		// 配列の末尾に追加する。（複数）
		int[] array4 = ArrayUtils.addAll(array, 2, 3, 4);
		// int -> Integer
		Integer[] array2 = ArrayUtils.toObject(array);
		// Integer -> int
		int[] array3 = ArrayUtils.toPrimitive(array2);

		System.out.println(StringUtils.join(array2, ", "));
		System.out.println(StringUtils.join(array3, ", "));
		System.out.println(StringUtils.join(array4, ", "));
	}
}
```
Listの最後の要素を取得


```Java
E e = list.get(list.size() - 1);
```

Guavaが使えるなら

```Java
lastElement = Iterables.getLast(iterableList);
```

# 参考
[java - How to get the last value of Arraylist - Stack Overflow](http://stackoverflow.com/questions/687833/how-to-get-the-last-value-of-arraylist)
先月のgitログ一覧(行数付き)


```
git log --author=名前 --since="1 month ago" --until="0 month ago" --pretty=oneline --reverse | cat -n | lv
```

月次のコミット状況調査などに。数値を調整して先々月も。

## 以下、追記

[一日のGitコミットをMarkdownに変換するワンライナー - Qiita \[キータ\]](http://qiita.com/yuku_t/items/7c2077e31b2480a2689e?utm_content=bufferf2196&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
を参考にmarkdownでも出力してみました。

### 注意
* 必要なさそうなものなどいくつか機能を削っています。
* GitHubではなく、ALMinium限定版です。  
（さらに、環境固有になっている可能性もありなのでご参考程度に。）

```bash
#!/usr/bin/env bash
AUTHOR=$(git config user.email)
#AUTHOR=名前
URL=$(git config remote.origin.url | sed 's|/git.*||')
PROJECT=$(git config remote.origin.url | sed 's|.*/git/||')
SINCE='1 months ago'
UNTIL='0 months ago'
echo "no | hash | comment | date"
echo "-----|-----|------|------"
RESULT=$(git log \
    --since="$SINCE" \
    --until="$UNTIL" \
    --author=$AUTHOR \
    --date=iso \
    --pretty="format:[%h]($URL/projects/$PROJECT/repository/revisions/%h) | %s | %ad")
i=0
echo "$RESULT" | while read LINE
do
    i=$(($i + 1))
    echo "$i | $LINE"
done
```
キャメルケースのファイル名を探す


例)カレント配下のJSPファイルで

```sh
 find . -name '*.jsp' | grep -E '[a-z]{1,}[A-Z]'
```

# 参考
[bash - Oneliner to detect camelcase variables - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/44337/oneliner-to-detect-camelcase-variables)
「iPhoneのカメラからの入力をリアルタイム処理する」ための実装を超簡単にする ofVideoGrabber

iPhoneのカメラからの入力をリアルタイムに取得し、何らかの画像処理を行う、つまり **iOSアプリで動画処理を行う** のは、なかなか面倒です。

下記記事を見るとわかりますが、

<a href="http://d.hatena.ne.jp/shu223/20121202/1354436478" >シャッター音の鳴らないカメラアプリの実装方法 - Over&Out その後</a>

AVFoundation を用いて、 **カメラからの入力を毎フレーム取得しようとするだけで、かなりやることが多い** です。デリゲートメソッドに渡されてくる画像データが CMSampleBufferRef という型で渡ってくるのも（個人的には）ハードルを感じる部分で、毎回「どう取り扱うんだっけ？」とググってしまいます。

さらに、毎フレーム送られてくる画像情報をリアルタイムに処理をしようとすると、やっぱり **OpenGL ベースで処理** する必要が出てきて、これまた（個人的には）気が重くなってしまうところです。

ところが、videoGrabberExample という openFrameworks に同梱されているサンプルのソースを見ると、実にシンプルな実装で、カメラからの入力のリアルタイム処理が実現されていました。

<a href="http://qiita.com/shu223/items/e28110bf729fdf8712e0" >openFrameworks for iOS のサンプル一覧 - Qiita [キータ]</a>

こりゃ便利そう、ということで、その使い方と、チラッとソースをのぞいてみた内容を以下にまとめます。


##実装

こんな感じで、カメラからの入力に対してリアルタイムに反転処理をかけ、左下に表示するための実装手順です。（基本的には videoGrabberExample のコードをシンプルにしてコメントつけただけです）

![](http://f.cl.ly/items/1s3d3X1W1l26173Q130B/videograbber.jpg)


###セットアップ

メンバ変数に

````
ofVideoGrabber grabber;
ofTexture tex;
unsigned char * pix;
````

を定義しておき、

````
void testApp::setup(){

    // ofVideoGrabberを初期化
    grabber.initGrabber(480, 360, OF_PIXELS_BGRA);

    // テクスチャをallocate
    tex.allocate(grabber.getWidth(), grabber.getHeight(), GL_RGB);

    // バッファ確保
    pix = new unsigned char[ (int)( grabber.getWidth() * grabber.getHeight() * 3.0) ];
}
````

###カメラからの入力を取得して画像処理

````
void testApp::update(){
    
    // カメラからの入力を取得
    grabber.update();
    unsigned char * src = grabber.getPixels();
    
    // 画素数 x チャンネル数
    int totalPix = grabber.getWidth() * grabber.getHeight() * 3;
    
    // 反転処理
    for(int k = 0; k < totalPix; k+= 3){
        pix[k  ] = 255 - src[k];
        pix[k+1] = 255 - src[k+1];
        pix[k+2] = 255 - src[k+2];        
    }
    
    // テクスチャデータ生成
    tex.loadData(pix, grabber.getWidth(), grabber.getHeight(), GL_RGB);
}
````

上記コードではフレーム毎の入力を取得して、そこに各画素値を反転させる処理を行っています。


###描画

````
void testApp::draw(){    

    // カメラからの入力を描画    
    grabber.draw(0, 0);
    
    // 生成したテクスチャを描画
    tex.draw(0, 0, tex.getWidth() / 4, tex.getHeight() / 4);
}
````

##ソースの中身をのぞいてみる

先日書いた [こちらの記事](http://qiita.com/shu223/items/52ec9ae8585d7424c393) で、一部の oF クラスに、 **単なるラッパー疑惑** を抱いたのですが、これはその逆ですごく便利なので、どんな感じにラップされてるのかソースの中身をみてみました。

###AVFoundationVideoGrabber

ソースは `addons/ofxiOS/src/video/AVFoundation` にあるのですが、AVFoundation まわりの諸々はこの AVFoundationVideoGrabber というクラスでラップされてました。


###ofxiOSVideoGrabber

このクラスのソースは `addons/ofxiOS/src/video` にあります。

上記の AVFoundationVideoGrabber へのポインタを持っています。ofBaseVideoGrabber を継承していて、オーバーライドしている各メソッドの中身では、AVFoundationVideoGrabber のメソッドを呼んでいます。


###ofVideoGrabber

ソースの場所は `libs/openFrameworks/video`

iOS環境の場合に、ofxiOSVideoGrabber をインスタンスとして持つように実装されています。

````
#ifdef OF_VIDEO_CAPTURE_IOS
    #include "ofxiOSVideoGrabber.h"
    #define OF_VID_GRABBER_TYPE ofxiOSVideoGrabber
#endif
````

````
if( grabber == NULL ){
    setGrabber( ofPtr<OF_VID_GRABBER_TYPE>(new OF_VID_GRABBER_TYPE) );
}
````

AVFoundation **以外** の諸々（OpenGLのテクスチャとしての描画とか）はここに実装されています。


##いずれ調べる

iOS アプリで OpenGL で画像／動画処理をする場合、GPUImage を利用することが多いので、それと併用するにはどうやるのがいいか（何かしらの共通フォーマットにすればいいと思うので、それを、どのタイミングで、どのフォーマットにするのがいいか）というのをいずれ調べようと思います。
Mighty Mouseで上スクロールできなくなったとき

http://qiita.com/sasaplus1/items/2b022bec28b30087952b
を参考にしたが、直らず。


今度は適当にそこらへんにあったペーパータオルを1枚、少し水で濡らして上で机の上に敷いて、ボールの部分を強く押し付けながら良い感じにボールを転がすことで直った。
openSUSE:コマンドラインで日本語を含むテキストファイルをPDF化する

コマンドラインから日本語を含むテキストファイルをPDF化したくなってしまった日の記録。

Ubuntuを使っている方の多くはnkfで文字コードをeuc-jisに変換したテキストファイルをe2psに食べさせ
出来上がった.psファイルをlprコマンドで出力されているようですが、openSUSEではe2psがパッケージとして用意されていないため今回はuniprintを利用しました。

【環境】
■OS：openSUSE 13.1
■利用したソフトウェア：CUPS-PDF、uniprint

【CUPS-PDFのインストール・設定】
CUPS-PDFが無いことを確認し、openSUSEの[wiki](http://en.opensuse.org/SDB:Printing_to_PDF)を参考にCUPS-PDFをインストール

```
lpstat -p -d
sudo zypper ar -f http://download.opensuse.org/repositories/Printing/openSUSE_13.1/Printing.repo
zypper search cups-pdf
sudo zypper install cups-pdf
```

CUPS-PDFを利用できるようlpadminコマンドでppdファイルを指定

```
lpadmin -h localhost -p cups-pdf -v cups-pdf:/ -P /usr/share/cups/model/CUPS-PDF.ppd -E
```

 PDFファイルの出力先と、ファイル名に付与するJOB IDを設定

```
vim /etc/cups/cups-pdf.conf 
(出力先を変更する場合は、Outの部分を${HOME}/PDFなどに変更するなど分かりやすい場所を指定。
ファイル名にJOB IDを付与する場合は、Labelのレベルを変更)
```

CUPSを再起動

```
sudo /etc/init.d/cups restart   
```

CUPS-PDFがidle状態になっていることを確認

```
lpstat -p -d
```

【uniprintのインストール・設定】
uniprintコマンドはyuditパッケージに含まれているので、yuditをインストール

```
zypper search yudit
sudo zypper install yudit
```

フォルトでは日本語は豆腐になって出力されるので、フォントの設定を実施

```
vim  /usr/share/yudit/config/yudit.properties (yudit.font.TrueTypeに日本語フォントを追加)
```

【出力】

```
uniprint -in multibyte.txt -printer CUPS-PDF
 (フォントを指定する場合、-fontオプションを付けフォントのパスを指定)
```
herokuのdbを操作する


dbへアクセス

```
$ heroku pg:psql
```

SHOW DATABASES

```
=> \d
```

SELECT * FROM foos

```
=> SELECT * FROM foos;
 # (MySQLと一緒)
```

実際にログインしたところ

```
$ heroku pg:psql
---> Connecting to HEROKU_POSTGRESQL_CRIMSON_URL (DATABASE_URL)
psql (9.1.5, server 9.3.2)
WARNING: psql version 9.1, server version 9.3.
         Some psql features might not work.
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.


da41a3g4hv191h=> \d

                   List of relations
 Schema |       Name        |   Type   |     Owner
--------+-------------------+----------+----------------
 public | calls             | table    | iqpuweabqkjiie
 public | calls_id_seq      | sequence | iqpuweabqkjiie
 public | schema_migrations | table    | iqpuweabqkjiie
(3 rows)

da41a3g4hv191h=> select * from calls;

 id |                                                                                          message                                                                                           |    to     |         created_at         |         updated_at
----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+----------------------------+----------------------------
  1 | oh                                                                                                                                                                     |           | 2013-12-09 15:34:05.42589  | 2013-12-09 15:34:05.42589
  2 | yeah                                                                                                                                                         |           | 2013-12-09 15:36:23.067689 | 2013-12-09 15:36:23.067689
  3 | fugafuga                                                                                                                                                         |           | 2013-12-09 15:36:47.679216 | 2013-12-09 15:36:47.679216

```

とりあえずこれだけ。
CoffeeScript のアンドキュメントな記法

## 即時関数の引数に別名をつける

外部のスコープで宣言された変数を別名でスコープに取り入れる。

```coffeescript:CoffeeScript
do ($ = jQuery) ->
  console.log $
```

コンパイルすると...

```js:JavaScript
(function($) {
  return console.log($);
})(jQuery);
```

jQuery のプラグイン書くときとかに使う。

## オブジェクトを作るショートハンド

変数名をキー名として取り入れる。

```coffeescript:CoffeeScript
a = 3
b = true
c = 'bar'
console.log {a, b, c}   # { a: 3, b: true, c: 'bar' }
```

## 分解代入[^destructuring-assignment]で変数宣言

[^destructuring-assignment]: 分解代入については [CoffeeScript - Destructuring Assignment - Qiita [キータ]](http://qiita.com/minodisk@github/items/26a1bcceb5c3391c5488) を参照

複数の変数を宣言する。

```coffeescript:CoffeeScript
[ a, b, c ] = []
```

コンパイルすると...

```js:JavaScript
var a, b, c, _ref;

_ref = [], a = _ref[0], b = _ref[1], c = _ref[2];
```

## super を引数付きでコールする

`super()` ではなく `super` と書くことで引数を引き継いでコールしてくれる。

```coffeescript:CoffeeScript
class Foo
  constructor: (@a) ->

class Bar extends Foo
  constructor: ->
    super

bar = new Bar 3
console.log bar.a  # => 3
```

便利な反面、`super` と書いた時点で継承元の関数が実行されることに気をつけなければならない。

```coffeescript:CoffeeScript
class Foo
  func: ->
    console.log 'executed!!'
    'foo'

class Bar extends Foo
  func: ->
    @superFunc = super
    console.log @superFunc

bar = new Bar()
bar.func()  # => 'executed!!'
            # => 'foo'
```

このように `super` を `@superFunc` に格納するつもりで書いたコードを実行すると、
`super` を実行した戻りが `@superFunc` に格納されることになる。

## 比較演算子

複数の条件をまとめて比較する。

```coffeescript:CoffeeScript
a <= b < c
```

コンパイルすると...

```js:JavaScript
(a <= b && b < c);
```

## 分解代入[^destructuring-assignment]とクラスの this 代入の合わせ技

```coffeescript:CoffeeScript
class Foo
  constructor: ({@a})->

foo = new Foo {a: 3}
console.log foo.a   # 3
```

## Array comprehensions とそのシュガー

配列を生成します。ここまではドキュメント通り。

```coffeescript:CoffeeScript
countdown = (num for num in [10..1])
```

本末転倒気味だけど、括弧を書きたくない場合などは即時関数で書くことができる。

```coffeescript:CoffeeScript
countdown = do -> num for num in [10..1]
```


## 引数の並置
```coffeescript:CoffeeScript
# pattern1
a 1, 2, 3

# pattern2
a 1,
  2,
  3

# pattern3
a 1,
  2
  3
```

これらはコンパイルすると...

```js:JavaScript
a(1, 2, 3);
```

pattern3 は使う気起きない。柔軟というよりは曖昧なコンパイラ。
HomeBrewで入れたJenkinsをデーモン化


### 手動で起動
```
alias jenkins_server='java -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpPort=8081'
```
上記のようなaliasを切って手動で起動していたが、時々忘れるのでデーモン化してみた。
※ポートは8081にカスタマイズ。

### デーモン化

brew infoで情報取得

```
-> % brew info jenkins
jenkins: stable 1.541, HEAD
http://jenkins-ci.org
/usr/local/Cellar/jenkins/1.541 (5 files, 188M) *
  Built from source
From: https://github.com/mxcl/homebrew/commits/master/Library/Formula/jenkins.rb
==> Caveats
Note: When using launchctl the port will be 8080.

To have launchd start jenkins at login:
    ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
Then to load jenkins now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
Or, if you don't want/need launchctl, you can just run:
    java -jar /usr/local/opt/jenkins/libexec/jenkins.war
```

言われた通り実行してみる

```
-> % ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
-> % launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```

が、mvnのパスが通ってない、日本語が化ける、色々と問題あり。
手動で起動していた場合は、ユーザが設定した環境変数がそのまま渡るが、デーモン化すると上手く渡らない模様。

### 環境変数を渡す
ググッてみた所、
`/etc/launchd-user.conf `
や
`/etc/launchd.conf `
をいじればいいとのこと、実際にやってみるが何故か渡らない。

試行錯誤の末、最終的に
`~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist`
をカスタマイズすることで解決した。

差分はこんな感じ

```
-> % diff homebrew.mxcl.jenkins.plist homebrew.mxcl.jenkins.plist.org
5,13d4
<     <key>EnvironmentVariables</key>
<     <dict>
<       <key>PATH</key>
<       <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin/:/opt/X11/bin</string>
<       <key>JAVA_TOOL_OPTIONS</key>
<       <string>-Dfile.encoding=UTF8</string>
<       <key>MAVEN_OPTS</key>
<       <string>-Djava.awt.headless=true</string>
<     </dict>
23d13
<       <string>--httpPort=8081</string>
```

###### コメント
・PATH
mvnにパスを通すため。
`export PATH=/usr/local/bin:$PATH` のように展開させたかったが出来なかった。
あと、`/etc/paths` もなぜか無視される。

・JAVA_TOOL_OPTIONS
`-Dfile.encoding=UTF8`: 日本語の文字化け対応

・MAVEN_OPTS
`-Djava.awt.headless=true`: mvn起動時に変なコーヒーカップのウィンドウが立ち上がるのを防ぐ

・その他
`~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist`
はカスタマイズしたので、念のためシンボリックリンクじゃなくてコピーを取っておいたほうがいいと思います。
【JavaScript】【解決】無名関数と、配列に新しい要素を追加するpush

こんにちは。
ちょっと昨日から悩んでいるのですが
正直お手上げ状態です・・・。

タイトルどおりの問題なのですが、
まず無名関数で配列の中身をそれぞれ取り出せない。。

※配列への格納はpushを使わなければいけない。

昨日まで・・・

```js
var makeArray = function() {
  var result = [];
  for(var i = 0; i < arguments.length; i++) {
    result.push(makeArray) ;
  }

  return result;

}

var resultArray = makeArray(1, -9, 67, 3, -21);
output(resultArray);
```

出力結果

```
function () {

  var result = [];
  for(var i = 0; i < arguments.length; i++) {
    result.push(makeArray) ;
  }

  return result;

}
```

上記が5回

これはなんとなく、argumentで5を判定して、
それをmakeArrayで呼び出しているからというところまでは理解できました。

今日の朝

```js
var makeArray = function() {

  var result = [];
  for(var i = 0; i < arguments.length; i++) {
    result.push(makeArray[i]) ;
  }

  return result;

}

var resultArray = makeArray(1, -9, 67, 3, -21);
output(resultArray);
```

iの回数分まわしているからmakeArrayにiを添え字として与えれば・・・
でも出力結果は

```
=>[,,,,]
```


そして先ほどようやく近いところまできた。

```js
var makeArray = function(makeArray) {

  var result = [];
  for(var i = 0; i < arguments.length; i++) {

  result.push(makeArray) ;
  }
  return result;
}

var resultArray = makeArray(1, -9, 67, 3, -21);
output(resultArray);
```

出力結果

```
[1,1,1,1,1]
```

ようやく数字が出てきたが、正直混乱中です。
引数にmakeArrayを入れなければいけないのか。

ん～・・・
なかなか起き上がれないですね、、手口を発見するのが難しいです。
もしよろしければアドバイスくださると幸いです。

それではこれからもよろしくお願いいたします。

*****
追記：
解決しました。


すばやいご回答ありがとうございます！
無事に解決することができました。

pushで入れる箇所に、入れるべきものが間違ってた模様。

```js
function(makeArray){
... }

 result.push(makeArray) ;
```
ではなく

```js
function(){
...}

 result.push(arguments[i]) ;
```

これで入れていくようです。
いつもありがとうございます！
最新VersionのDirにsymlinkを張るときの覚書


はじめに
===

`ln -nsf` は便利だよ、というお話です。

内容
====

あるDirにVersion毎のDirがあって、最新Versionをsymlinkで示しておきたい、ということがあります。
例えばこんな感じです。

```
lrwxrwxr-x   1 ken  staff   22 12 10 10:36 current@ -> /Users/ken/tmp/xx/ver1
drwxrwxr-x   2 ken  staff   68 12 10 10:34 ver1/
```

このときの symlink を作るときに普通に `ln -s <SOURCE> <SYMLINK PATH>` で

```bash:shell
% cd ~/tmp/xx
% ls -l
drwxrwxr-x   2 ken  staff   68 12 10 10:34 ver1/
% ln -s ~/tmp/xx/ver1 current  
% ls -l
lrwxrwxr-x   1 ken  staff   22 12 10 10:36 current@ -> /Users/ken/tmp/xx/ver1
drwxrwxr-x   2 ken  staff   68 12 10 10:34 ver1/
```

とすると、ぱっと見問題ないのですが、もう一度実行すると、

```bash:shell
% ln -s ~/tmp/xx/ver1 current  
% ls -l ver1 
lrwxrwxr-x  1 ken  staff   22 12 10 10:38 ver1@ -> /Users/ken/tmp/xx/ver1
```
`ver1/ver1@` というsymlink ができてしまい、
さらにもう一度実行すると、

```bash:shell
% ln -s ~/tmp/xx/ver1 current  
ln: current/ver1: File exists
```

と怒られてしまいます。

そういう時は `-nsf` というOptionで実行すると良いです。

```bash:shell
% rm current ver1/ver1   # clean up
% ln -nsf ~/tmp/xx/ver1 current  
% ln -nsf ~/tmp/xx/ver1 current  
% ln -nsf ~/tmp/xx/ver1 current  
% find . -type l       # . 以下の symlink を検索
./current              # これだけ
% ls -l                # ちゃんと作られてる↓
lrwxrwxr-x   1 ken  staff   22 12 10 10:45 current@ -> /Users/ken/tmp/xx/ver1
drwxrwxr-x   2 ken  staff   68 12 10 10:44 ver1/
```

さらに、 ver2 というDirが増えた時も気にせずに実行できます。

```bash:shell
% mkdir ver2
% ln -nsf ~/tmp/xx/ver2 current 
% ls -l
                                                         ↓ちゃんと更新されている
lrwxrwxr-x   1 ken  staff   22 12 10 10:47 current@ -> /Users/ken/tmp/xx/ver2  
drwxrwxr-x   2 ken  staff   68 12 10 10:44 ver1/
drwxrwxr-x   2 ken  staff   68 12 10 10:47 ver2/
```

便利です。
Golang でコマンドライン Fuzzy Finder 「gof」作った。

この記事は Go Advent Calendar 2013 の 10 日目の投稿です。

# はじめに

業務のツールや連携させる一部の機能として golang を使い出している方もチラホラ現れ始めました。
golang でウェブアプリケーションを書く人も多いですが、実はコマンドラインアプリケーションやバックグラウンドサーバを書くのに非常に役立ちます。

本記事では、golang を使うとどの様に簡単にバックグラウンドサーバや UI が書けるのかを紹介したいと思います。

# 非同期処理

例えば長い処理の終了を判定して画面を更新したいとします。長い処理を行っている間、キーボードイベントの判定や別の入出力処理、タイムアウト判定等を実行出来る様にする場合、C言語で書くと結構なコード量になり得ます。
しかし golang を使う事でこういった複雑な処理を簡単に実装出来てしまいます。
golang の特徴と言えば goroutine と channel になるのですが、長い処理を goroutine で追い出して終了時に channel を使って通信します。

```go
done := make(chan bool)
go func() {
	// blocking
	done <-blockingJob()
}()
```

true/false を返す関数 blockingJob の結果を done という channel を使って外側に引き継ぎます。
メイン処理側ではこの done を select で待ちます。

```go
select {
case <-done:
	// 処理が完了した場合の処理
case time.After(10 * time.Duration):
	// タイムアウト(10秒)
}
```

`time.After` は channel を返します。select では複数の channel を一度に問い合わせる事が出来ます。
もちろん、blockingJob を途中で中断するにはソケットを閉じて明示的にエラーを出させたりする必要があります。

# UIでの非同期処理

`time` パッケージには便利な関数が多くあり例えば

* キーをタイプされたら即座に再描画したい
* 別の goroutine でファイルを検索し見つかった度に再描画したい

こういったイベントが輻輳する処理に対してタイマを使う事が出来ます。

```go
// 再描画タイマ
timer := time.AfterFunc(0, func() {
	redraw_screen()
})

for {
	select {
	case ev := <-keyTyped: // キーイベント
		// 再描画条件を変更して
		key_typed(ev)
		// すぐさま再描画
		timer.Reset(1 * time.Microsecond)
	case fc := <-fileChanged:
		// ファイルを足して
		add_file(fc)
		// ちょっと後に再描画
		timer.Reset(200 * time.Microsecond)
	}
}
```

こうしておけば連続でファイルが見つかった場合でも再描画処理による負荷を掛けず、かつキーをタイプした場合には即時に再描画するという UI が出来上がります。
通常、キーボードイベントおよびタイムアウトをそれぞれ検知する必要がありますが、channel を使う事で可読性も高く、拡張性も高い処理になりました。
別のイベントを追加したい場合でも、channel を作って select に追加するだけになります。

# Fuzzy Finder "gof"

さて、先日コマンドラインから Fuzzy Finder する [fzf](https://github.com/junegunn/fzf) というアプリケーションを見つけたのですが、Windows で動かないのでﾑｷｰってなったので golang で作ってみました。
今回説明している処理パターンを使っています。

https://github.com/mattn/gof

![](https://gist.github.com/mattn/7883653/raw/0bc557ab8ca7139ef12634f7c76c9e63fa3a88b8/gof.gif)

```
$ vim `gof`
```

の様にして使えます。単独で

```
$ gof -e
```

としてもいいですし

```
$ gof /tmp | gof
```

の様にして指定の一覧で絞り込む事も出来ます。おまけ機能として

```
$ gof -l
```

でアプリケーションランチャーにもなります(~/.gof-launcher に設定を記述)。

はじめは簡単に書けるか疑問でしたが、意外とすんなりと実装出来ました。

宜しければ使ってみて下さい。Windows でも動きます。
積み木の水槽(2013.9.6の過去問)

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

今日の問題は http://nabetani.sakura.ne.jp/hena/ord13blocktup/ にあります。

```hs
module Doukaku.Aquarium (solve) where
import Data.Char (digitToInt)
import qualified Data.Map as Map
import Control.Monad.State (State, get, modify, evalState)
import Control.Monad (forM)

data Cell = Empty | Wall | Water | Unknown | Checking deriving (Show, Eq)
type Aquarium = Map.Map Int (Map.Map Int Cell)

hight :: Int
hight = 10

solve :: String -> String
solve input = show count
  where
    aquarium = parse input
    count = flip evalState aquarium $ do
      cells <- forM [(x, y) | y <- [0 .. hight - 1], x <- [0 .. Map.size aquarium - 1]]
                    (\(x, y) -> getCell x y)
      return . length . filter (== Water) $ cells

parse :: String -> Aquarium
parse input = Map.fromList . zip [0 .. ] . map (Map.fromList . line) $ input
  where
    line c = let h = digitToInt c
             in map (\n -> if n < h then (n, Wall)
                                    else (n, Unknown) ) [0 .. hight - 1]

getCell :: Int -> Int -> State Aquarium Cell
getCell x y = do
  aquarium <- get
  if x < 0 || Map.size aquarium <= x || y < 0 || hight <= y
    then return Empty
    else do
      let cell = aquarium Map.! x Map.! y
      if cell /= Unknown
        then (return cell)
        else do
          modify (setCell x y Checking)
          thisCell <- loopD False False False
          modify (setCell x y thisCell)
          return thisCell
  where
    loopL True True True = return Water
    loopL True  r d = loopR True r d
    loopL False r d = do
      c <- getCell (x - 1) y
      case c of
        Empty    -> return Empty
        _        -> loopR True r d
    loopR True True True = return Water
    loopR l True  d = loopD l True d
    loopR l False d = do
      c <- getCell (x + 1) y
      case c of
        Empty    -> return Empty
        _        -> loopD l True d
    loopD True True True = return Water
    loopD l r True  = loopL l r True
    loopD l r False = do
      c <- getCell x (y - 1)
      case c of
        Checking -> loopL l r False
        Empty    -> return Empty
        _        -> loopL l r True

setCell :: Int -> Int -> Cell -> Aquarium -> Aquarium
setCell x y cell aqua = Map.insert x newCol aqua
  where
    newCol = Map.insert y cell (aqua Map.! x)
```

穴の開いているところで分離して、最大値を取る点でsplitしていくのが正しい戦略ですが、状態を扱ってみたくなったので`State`使って書きました。が、大失敗。セルの周りの状態だけで自分の状態を決められるかと思ったのですが、隣り合うセルで相互参照が行われるために無限再帰してしまいます。テストは全部通しましたが、微妙なバランスを変えると実行が止まらなくなる感じです。長く生きていればこんな日もありますよね！！

http://qiita.com/Nabetani/items/936e7885f4c607472060 に他の方の回答もありますので、見ると参考になるでしょう。
In App PurchaseのAuto-renewable subscriptionsを実装して気づいたこと

はじめまして、iOS Second Stage Advent Calendar 2013に参加ということで初めてQiitaに投稿しました@sabichemともうします。

今回は、In App PurchaseのAuto-renewable subscriptionsを利用したアプリを制作してて、その時に気づいたことを紹介したいと思います。

プログラムソースとかはいろんなサイトに紹介されているので今回は割愛。

#はじめにご注意！
以下の情報は、公式ドキュメントを探しきれず、一部実体験を元に書いています。
誤りがあるかもしれませんのでご注意を。

##テストユーザーで購読管理ができない
アプリのデバッグ中の動作検証ではテストユーザーをiTunes Connectで作成して利用するのは知られているとおりなのですが、このテストユーザーでiOS端末からAppStoreでログインしようとしてもアカウント情報を表示することが出来ません。
以前はできてたようなのですが、やり方が悪いのか、どうしても私の環境でテストユーザーでのアカウント情報の表示が出来ませんでした。
そのため、Auto-renewable subscriptionsで必要な購読管理を確認することが出来ないので、注意が必要です。
じゃあ解約などのテストが出来ないのかと言われるとそうではないのでご安心を。

##テスト中は、購読期間を基に自動で購読状態が変わる
実際に動かしながらテストしていくと、状態が切り替わることに気づきます。
どうも購読期間に比例して短縮された間隔で購読状態が変わるようです。
この時間の正確な値が見つけられませんでした。
[公式ドキュメント](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267-CH7-SW6 "In-App Purchase Programming Guide")上には短いサイクルで更新が発生するとしか書いていません。
####2013/12/10 11:41 追記
https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/13_ManagingIn-AppPurchases/ManagingIn-AppPurchases.html#//apple_ref/doc/uid/TP40011225-CH4-SW13
コメントで購読期間に対しての記述場所を教えていただきました。
[sora0077@github](http://qiita.com/sora0077@github "sora0077@github")さんありがとうございます！


この情報について何かご存じの方は教えていただけると嬉しいです。
では具体的な例を紹介します。

###１ヶ月の購読期間の場合

1. 購読登録後、最初の約５分程度で購読の自動更新が行われます。

1. その後、約５分くらいで購読期間が終わります。

1. 次の4.の状態になる前に購読を再契約すれば、また自動更新が行われます。

1. そして最後に、購読期間終了から約１０分程度（この時間がわかりません）経つと、完全に購読情報がなくなり、初めての購読からテストできるようになります。1へ

という感じで、購読の状態が変わっていき、色々なパターンのテストが出来ます。
購読期間中にアプリを消して入れなおせば復元のテストも可能です。

##番外編 突然、カリフォルニアからの電話。でも日本語で会話出来た！
このアプリを申請して数日後、急にカリフォルニアから電話がかかってきてかなり焦りました。その時は別用で取ることが出来なかったんですが、勇気を出して電話して会話してると、僕が英語でのコミュニケーションがザンネンなのを察知したのか、相手のお姉さんが日本語で会話してくれました。
これにはホント助かりました。
なので、みなさんももしカリフォルニアから電話がかかってきても勇気を出して取りましょう。
（ただ全員が日本語を話せるのかはわからないのでその点はご了承を）

ちなみに、電話を取らないとその後メールで、「電話折り返してきてね」ってくるので電話代を心配しないといけません。
できることなら海外との通話料が安い０５０系の電話番号を利用するほうがいいですね。
でも申請時に登録した電話番号をチェックしてるのか、違う電話番号で折り返すと受けてくれないかもしれないのでそこも注意です。
僕は申請時に携帯の電話番号を登録して、ケチって０５０でかけ直したらつながりませんでした。。。
その後メールで０５０の番号を伝えて無事につながりましたが。

#まとめ
公式ドキュメントに記載されている情報を参考に丁寧に作っておけば、思わぬ挙動で慌てることもないですし、細かいご指摘をAppleさんからいただけるので、ぜひみなさんもトライしてみてください。
RecSys Handbook Chapter1 1.6~1.8


前回分はこちら↓↓
Chapter1 1.4~1.5  http://qiita.com/ru_pe129/items/39d0fb03ff1285e6d77d
* * *
##1.6 Recommender Systems and Human Computer Interaction
　前述したように、研究者はRSを開発する際に多くのことを考慮しなければならない。しかし、RSの根底にあるのは、「推薦が正しければユーザーは必ず推薦を受け入れる」という前提である。これは極端な話ではあるが、ただ推薦をするだけとはわけが違う。しかし、ユーザーには十分な知識や経験がなく、推薦を必要としていることは事実である。そして、ユーザー自身が推薦されたものを評価することも難しい。

　RSの効果は推薦アルゴリズムの良し悪しとは異なる要素に依存していると指摘した研究も存在する。つまり、推薦したアイテムをユーザーが選択するように「説得」する必要があるのだ。他の表現で言い換えれば、RSに対する信頼を勝ち取る必要があるということである。RSの効果はアルゴリズムの正確さだけでは評価することが出来ないということである。

###1.6.1 Trust, Explanations and Persuasiveness
　本書で扱う信頼には2種類ある。RSを利用する他のユーザーへの信頼とRSの提供する推薦にたいする信頼である。FacebookなどのSNSはユーザー間の信頼を推薦に利用している。詳細は省くが、ユーザー間の信頼を利用することでRSにたいする信頼も向上する傾向にある。信頼を獲得するということは、推薦する側としては最終的目標を達成するということである。推薦した商品をユーザーが買ってくれるようになれば勝ったも同然ということだろうか。いずれにせよ、RSの価値（精度）を上げることが信頼度を高めることは言うまでもない。

###1.6.2 Conventional Systems
　RSで推薦に用いるデータを一度しか集めないように設計されているという、厳しい制限を多くのアルゴリズムが抱えている。多くの場合、ユーザー自身も一度の推薦で自分の好みに気づくことは少ない。また、推薦結果が間違っていた場合、ユーザー自身がプロフィールなどを編集することによって推薦の改善に協力する場合もある。後の章で取り扱われるないようなので1.6.2章については詳細を省く。

###1.6.3 Visualization
　本章で述べてきたように、RSにおいてユーザーに対する推薦結果の見せ方は非常に重要である。多くのRSにおいて推薦結果はランクづけされたリストの形でユーザーに提供されるが、その場合は各アイテムが持つ多くの情報が失われている。推薦結果の表現方法についても後の章で取り扱う。
　

##1.7 Recommender Systems as a Multi-Disciplinary Field
　これまで述べてきたように、RSでは多くの分野の知識を必要とする。ここでは、いくつかの分野を取り上げてRSとの関係について述べる。

**機械学習(Machine Learning)とデータマイニング(data mining)**
人工知能分野の一部であり、データや例を用いることでコンピューターに学習させることが出来る。多くのRSは機械学習やデータマイニングのアルゴリズムを利用している。
**情報検索（IR）**
ユーザーがコンテンツを保存したり検索したりするのを支援することを目的としたもの。情報検索は検索対象を非常に大きな単位でとらえているが、検索対象をランクづけしてユーザーに提供するという点ではRSと共通した部分も多い。また、推薦システムで用いる情報検索に応用することで情報検索におけるユーザーの満足度は非常に高くなるだろう。

##1.8 Emerging Topics and Challenges
###1.8.1 Emerging Topics Discussed in the Handbook
###1.8.2 Challenges
　1.8は基本的に他の章の概要を説明をしているだけなので省略

* * *
Chapter1が終わりました。
私なりの要約をすると、以下の4つがChapter1の主な内容だったのではないでしょうか。
・　RSは多くの分野の知見を必要とする。
・　一口にRSと言っても様々な切り口がある
・　RSを利用するには対象分野の知識を持っておくこと
・　大切なのはアルゴリズムだけではない

次回からはChapter2を読んでいきます。
イントロが終わったのでペースを落とす予定です。
引き続きよろしくお願いいたします。
VagrantでUbuntu & Docker環境を構築する


公式ドキュメントに書かれていることをそのまま実行しているだけですが、備忘録として。


## 環境

* Mac OS X 10.9
	* ホストOS
* VirtualBox 4.2.18
* Vagrant 1.3.5
* Ubuntu 12.04 LTS (Precise) 64bit
	* ゲストOS
* Docker 0.7.1


## 手順

### Ubuntuのセットアップを行う

```bash:Mac
$ mkdir vagrant-ubuntu
$ cd vagrant-ubuntu
$ vagrant init precise64 http://files.vagrantup.com/precise64.box
```


#### Vagrantfileを編集する

```
# 以下の行のコメントを外す
# config.vm.network :private_network, ip: "192.168.33.10"
```


#### サーバを立ち上げる

```
$ vagrant up
```


### SSHの設定

ホストOS上の `~/.ssh/config` に以下を追記します。

```
Host 192.168.33.*
  IdentityFile ~/.vagrant.d/insecure_private_key
  User vagrant
```


### UbuntuにDockerをインストールする

UbuntuにSSHでログインします。

```Mac
$ ssh 192.168.33.10
$ sudo su -
#
```

DockerはLinuxカーネル 3.8で動作しますが、Ubuntu 12.04のLinuxカーネルは3.2であるため、アップデートを行います。

```Ubuntu
# apt-get update
# apt-get install -y linux-image-generic-lts-raring linux-headers-generic-lts-raring
# reboot
```

次に、

* DebianのパッケージからDockerをインストールするため、リポジトリのキーをキーチェーンに追加する
* Dockerのリポジトリをソースリストに追加して、`lxc-docker` をインストールする

という処理を行ってくれる以下のコマンドを実行して、Dockerをインストールします。

```Ubuntu
# apt-get install -y curl
# curl -s http://get.docker.io/ubuntu/ | sudo sh
```


おしまい。


## 参考

* http://docs.vagrantup.com/v2/getting-started/index.html
* http://docs.docker.io/en/latest/installation/ubuntulinux/
AngularJSでPOSTした時にRailsのCSRFトークンを付与する


なんかタイトルが変ですが。

## 問題
Railsで（Railsに限らずですが）、POSTリクエストしようとするとCSRFのトークンが必要になります。

通常のRailsのPOSTであれば、問題ないのですが、
angularJSから(`$resouce`とか`$http`で) *何もせず*、POSTした場合に、
`Can't verify CSRF token authenticity`というWARNがrails側で発生します。

これはリクエストにCSRFトークンが含まれていないため。

失敗した場合はreset_sessionが実行される（はず）。

## 解決方法
で、angular側でCSRFトークンを付けるには`$httpProvider`のheaderでトークンをセットする。

```coffeeScript
app = angular.module(‘App’, [])
app.config ["$httpProvider", ($httpProvider) ->
  $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content')
]

```
上記の場合だとGETにも付いてしまうので、
GETメソッド以外に付ける場合は以下のようにする

```coffeeScript
app.config ["$httpProvider", ($httpProvider) ->
  csrfToken = $('meta[name=csrf-token]').attr('content')
  $httpProvider.defaults.headers.post['X-CSRF-Token'] = csrfToken
  $httpProvider.defaults.headers.put['X-CSRF-Token'] = csrfToken
  $httpProvider.defaults.headers.patch['X-CSRF-Token'] = csrfToken
  $httpProvider.defaults.headers.delete['X-CSRF-Token'] = csrfToken
]
```
-

ネタ元：
[Rails CSRF Protection + Angular.js: protect_from_forgery makes me to log out on POST](http://stackoverflow.com/questions/14734243/rails-csrf-protection-angular-js-protect-from-forgery-makes-me-to-log-out-on)

※ただ、こちらのスレッドではRails側でCookieを使ったやり方の方が評価されてます。お好みで！
文字列型の時刻からyoda-timeのDateTimeをつくる

# DateTimeのparseメソッドを使う方法

```java
String targetDateTime = "2013-12-10 01:00:00"; //DateTimeに変換する文字列
DateTimeFormatter targetDateTimeFormat = 
      DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); //対象となる時刻のフォーマット
DateTime resultDateTime = DateTiem.parse(targetDate, targetDateTimeFormat);
```

# DateFormatterのparseDateTimeを使う方法

```java
String targetDateTime = "2013-12-10 01:00:00"; 
DateTimeFormatter targetDateTimeFormat = 
      DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); 
DateTime resultDateTime = targetDateTimeFormat.parseDateTime(targetDateTime);
```

***
どちらもやっている処理は同じなので、好みによって使い分ければいいと思います。
個人的には、DateTime(targetDate, targetDateTimeFormat)というコンストラクタがあってくれた分かりやすいと思った。
baserCMSエディタプラグインをつくってみた


※この記事は[baserCMS Advent Calendar 2013](http://www.adventar.org/calendars/222)の9日目の記事です。

## baserCMS v3.0.0の新機能 エディタプラグイン

2013年12月にv3.0.0がリリースされた国産オープンソースCMSの[baserCMS]()のプラグインを作ってみました。

v3.0.0になっていろいろと機能が増えましたが個人的に気に入っているのが、エディタつまり管理画面の記事入力を変更できるようにするプラグイン機能です。

baserCMSはcakePHPベースなのでViewをフォルダ側で上書きすることができます(詳しくないので仕組みは省略)。なので管理画面のView自体を上書いてしまえば管理画面の変更も可能ではあったのですが、それをプラグインとしてエディタだけ単体でインストールや有効化や無効化ができるようになりました。 **しかもかなりシンプルに！**

## AceEditor for baserCMS を作ってみました。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/5548/0bfe45c7-e14e-c17b-6d19-15ba588eb169.gif)


githubにリポジトリを公開しているのでDLして使えます。

[AceEditor for baserCMS](https://github.com/YusukeHirao/AceEditor)

このプラグインは、入力のテキストエリアをWYSIWYGではなく[Ace](http://ace.c9.io/)というブラウザ上で動くプログラミング用テキストエディタに置き換えただけのものです。AceはGithubやWikipediaで導入実績のある世界最高峰のブラウザベースエディタです。シンタックスハイライトはもちろんのことHTML編集では[Emmet](http://emmet.io/)が使えます（これがホント便利）。

## インストール方法

1) DLしてきたプラグインフォルダを一式 `app/Plugin`へ移動します。
2) フォルダ名は`AceEditor`に必ずします。 

![baser_ace.png](https://qiita-image-store.s3.amazonaws.com/0/5548/a425f4b7-4731-a66d-e293-893c7446d84f.png)

3) 管理画面を開いて「プラグイン管理」画面を開きます。
4) インストールアイコンをクリックしてインストール画面へ移動します。

![baser_ace2.png](https://qiita-image-store.s3.amazonaws.com/0/5548/96aa44fb-5a77-70bd-393a-b13c03c5da1a.png)

5) インストールします。一瞬で完了するはずです。

![baser_ace3.png](https://qiita-image-store.s3.amazonaws.com/0/5548/ecdc9b1e-b986-8b7d-bc62-32c05fb50cbf.png)

6) 「システム管理」画面を開きます。
7) オプションを開きます。

![baser_ace4.png](https://qiita-image-store.s3.amazonaws.com/0/5548/53410aae-d447-38f1-4516-5d23c7b70062.png)

8) エディタ設定関連のエディタタイプに「Aceエディタ」が表れるのでそれを選択します。（ここでいつでもWYSIWYGや通常のプレーンテキストエディタに切り替えられます。便利ですね♪）
9) 保存して完了です。

![baser_ace5.png](https://qiita-image-store.s3.amazonaws.com/0/5548/a5adbf82-ed86-2625-d06c-c406cc164b1e.png "baser_ace5.png")

これでAceEditorが使えます;-)

## WYSIWYGが使いづらい・性に合わないという方は是非

ご利用下さい。

バグなどございましたら[github issue](https://github.com/YusukeHirao/AceEditor/issues)へご連絡下さい。

## 来週は

今回のをベースに **エディタプラグインの作り方** を書こうと思います。

よろしくどうぞ。
仮売上（オーソリ）を使ったサービス設計

突然ですが、みなさん、仮売上って知ってますか？

仮売上と通常の売上処理の違いとは一体何なのか、
『仮』という文字が付いている意味をまず解説して活用方法をご紹介したいと思います。

仮売上は、オーソリ（注）などと呼ばれることがあるクレジットカード決済の一つの機能です。

> 注: オーソリとはauthorization（オーソリゼーション）の略です

もともと仮売上やオーソリは、[信用照会](http://ja.wikipedia.org/wiki/%E4%BF%A1%E7%94%A8%E7%85%A7%E4%BC%9A)業務として偽造・盗難カードや期限切れのカードなどの不正利用を防止するためにある機能でした。しかし、最近ではサービス内にうまく組み込むことで決済業務に活用されています。


『仮』という文字からもこの処理が行われても売上が確定していないようなイメージを持たれると思います。実際にそのイメージは正しく、あくまで『仮』に計上された売上だと思って頂いて結構です。

クレジットカード所有者側から見たときの仮売上された状態とは、クレジットカード会社から付与された与信枠を確保された状態を指します。日本の一般的なクレジットカードには与信枠と呼ばれる利用限度額が設定されています。これは個人の収入状況や貯蓄によってクレジットカードカード会社が個別に設定しています。一種のクレジットスコアと考えてもいいでしょう。

次は、活用方法に進む前に仮売上のユースケースを確認しましょう。

もっとも身近で利用されている例は、ECサイトのユーザの購入処理から商品の発送業務へのフローの中でしょう。多くのECサイトではクレジットカード情報を入力して決済をすると購入金額で仮売上を行っています。ECサイトで発送準備を終えた際に、仮売上で計上していた売上を実際の売上に変更する処理を行っています。

オフラインの決済でも仮売上を活用している例があります。代表的なものはホテルのチェックインです。ホテルのチェックイン時にクレジットカード求められた経験はありませんか？これは、ホテル側が宿泊者の支払い能力をチェックするために行っているものです。クレジットカードの有効性だけをチェックしたり、一定金額を仮売上として計上しておいてチェックアウト時に仮売上を取り消したりしています。

それでは本論に入って行きましょう。

# 仮売上の活用方法

仮売上の使いどころはユースケースからも推察されていると思いますが、まさに後払い化や信頼性の確保です。実際にクレジットカードで支払わない場合でも、クレジットカードの入力を求めることでユーザの実在性や本人性を確認することできるため、架空の登録や本人以外による登録を抑止するのに役立ちます。

実際には、物々交換やオークションサービスのようなサービスの設計に活用することで、信用度の低いユーザの排除を行うことができます。

また現地で現金支払が前提の座席の予約サービスのようなサービスでも、ユーザによる無断のキャンセルを抑制するために使うことができるでしょう。これを応用すると、[イベントアテンド(ATND)](atnd.org)のようなサービスで問題になる無断欠席を抑止することにも利用できそうですね。

# WebPayで仮売上を使う

最後にWebPayで仮売上をする方法を紹介したいと思います。

```
curl "https://api.webpay.jp/v1/charges" \
-u "test_secret_eHn4TTgsGguBcW764a2KA8Yd": \
-d "amount=1000" \
-d "currency=jpy" \
-d "card[number]=4242-4242-4242-4242" \
-d "card[exp_month]=11" \
-d "card[exp_year]=2017" \
-d "card[cvc]=123" \
-d "card[name]=SOWASOWA SOWAWA" \
-d "capture=false"
```

これだけです。とっても簡単ですね。（「えっ！？」「curlが入ってない？」rubyでもPHPでもできるので[WebPayのドキュメント](https://webpay.jp/docs/uncaptured_payments)を参考にプログラムを書いてみましょう）

次は仮売上を無効化する方法です。

```
curl "https://api.webpay.jp/v1/charges/{charge_id}/refund" \
-u "test_secret_eHn4TTgsGguBcW764a2KA8Yd": \
-X POST -H 'Content-Length: 0'
```

{charge_id} には一つ目を実行した時に取得したJSONの`ch_*********`を入力しましょう。

最後は、仮売上を実際の売上として計上する方法です。

```
curl "https://api.webpay.jp/v1/charges/{charge_id}/capture" \
-u "test_secret_eHn4TTgsGguBcW764a2KA8Yd": \
-X POST -H 'Content-Length: 0'
```

すでに仮売上を無効化してしまった人は1つ目をもう一度実行して仮売上を行ってから売上として計上してみましょう。

# 参考

[Wikipedia 信用照会](http://ja.wikipedia.org/wiki/%E4%BF%A1%E7%94%A8%E7%85%A7%E4%BC%9A)
[WebPayの仮売上の解説](https://webpay.jp/docs/uncaptured_payments)
Xamarin Component Store の紹介


Titanium に [MarketPlace](https://marketplace.appcelerator.com/home) があるように、Xamarin のマーケットプレイスとして Xamarin Components があります。

* [Xamarin Components](http://components.xamarin.com/)

これは、Xamarin Studio とも連携していて、開発中にIDEから、コンポーネントを探す→ダウンロード＆組み込み、が速やかに行えるようになっています。

今日は、Components の中から主なもの、私が使ったことがあるものを少し紹介します。

### [Json.NET](http://components.xamarin.com/view/json.net)

.NET で Json を扱うのに必須のライブラリ。Nuget にもあるし、こっちにもあります。

### [ZXing.Net.Mobile](http://components.xamarin.com/view/zxing.net.mobile)

定番の1次元/2次元バーコードリーダーライブラリ。

### [SQLite.NET](http://components.xamarin.com/view/sqlite-net)

こちらも定番の SQLite 用ライブラリ。.NET ですからデータ・プロバイダ準拠の API です。

### Google Maps

Google Map を使うためのライブラリ。決して Google Maps JavaScript API のラッパじゃないですよ。

* iOS版 - [Google Maps](http://components.xamarin.com/view/googlemapsios)
* Android版 - [Google Play Services](http://components.xamarin.com/view/googleplayservices)

これらは過去に使い方の記事を書きました。

* [Xamarin.Android での Google Map(というか Play Service) 利用が、本家より簡単になった件](http://qiita.com/amay077/items/14191c808e9cac4eae2c)
* [Google Maps SDK for iOS を Xamarin.iOS で使う](http://qiita.com/amay077/items/db2c2d5d0060ba65a0e8)

### [Xamarin.Mobile](http://components.xamarin.com/view/xamarin.mobile)

アドレス帳、位置情報、カメラへの、プラットフォームに依存しない API を提供します。

### [Azure Mobile Service](http://components.xamarin.com/view/azure-mobile-services)

Azure を冠しているせいで Parse などに比べてイマイチ知名度がない(と勝手に思っている) Microsoft の BaaS を使うためのライブラリ。

### [Reactive Extensions (Rx) for Xamarin](http://components.xamarin.com/view/rxforxamarin)

LINQ を更に使い倒したいなら必須ですね。

### [Android iBeacon Service](http://components.xamarin.com/view/xamarin-android-ibeacon-service)

IBeacon を Xamarin.Android で使えるようにするライブラリ。[android-ibeacon-service](https://github.com/RadiusNetworks/android-ibeacon-service) の Javaバインディング。

## Components と PCL

Components を使う上での注意点です。

最近、PCL が Xamarin.iOS と Android に対応しましたが、この Components で配布されているライブラリは、PCL とは限りません。

Json.NET, ZXing, SQLite とか、PF固有ロジックを含まないので同一バイナリでいけそうなものですが、実際にそうなっているかは分かりません（たぶん参照してるアセンブリをアセンブリブラウザで確認すればわかると思うけど）。ので、自分のアプリでPF依存を減らしたいならば、Nuget から PCL版を持ってくるか、ソースを入手して自分でビルドする必要があります。

Xamarin.Mobile も、各PFで使い方は全く同じながら、共通なデータクラスが各PF毎のDLLにパッケージされてしまっているので、同じバイナリでは使えません。これの分離については後日書きます。

Rx は…自前でビルドしようと挑戦しましたが、``IObservable`` は誰のもの？で躓いて早々に諦めました（^_^;

## More…

企業やコミュニティが公開している .NET のライブラリも Xamarin で使えるかも知れません。画面が絡むものは確実にムリですが、通信や計算に特化したものはそのまま、あるいは軽微な修正のみで使える可能性があります。

Xamarin では、既存の DLL や exe がどのくらい再利用できるかを計測する “Mobility Scanner” を公開しています。

* [How mobile is your .NET?] (http://scan.xamarin.com/)
* [Blog post](http://blog.xamarin.com/how-mobile-is-your-.net-code/)

高得点が出るライブラリなら、そのまま使えるんじゃないでしょうか。

## まとめ

とここまで書いて、過去にこんな

* [Xamarin Component Store を眺めてみる](http://qiita.com/amay077/items/811cdd8ab3d1243045b6)

記事を書いたのを思い出しました。内容ダブってますがまあいいや、リファインってことで。
JSのライブラリをJSXに移植してみた (MD5編)

JSのMD5をJSXに移植してみました。いくつかハマった点があるのでメモとしてアドベントカレンダーに残します。

## Original JavaScript

* https://github.com/blueimp/JavaScript-MD5/blob/master/js/md5.js

MD5のC実装をJSに移植したものですが、オリジナルとかなりちがっていてちょっとこれを選んだのは失敗だったかなあと思います。定数なども、もともとuint32な16進数で書かれていたものをint32な10進法として書いているので、JSの数値事情はあるにせよちょっとオリジナルとの対比を面倒にしています。が、ともかくこれを移植しました。

## JSX

* https://github.com/jsx/mizuki/blob/master/lib/mizuki/digest/md5.jsx

結果出来上がったのはこちら。hmacに関する部分は除いています。また、utf8 encode/decodeはmizukiにもともとあるユーティリティを使いました。

## ハマりどころ

### UTF8 encode/decode

これはJSX特有の事情ではないのですが、そもそも MD5 digest はバイト列に対する処理です。そしてJS/JSXの文字列はバイト列ではありません。よって文字列をバイト列に変換する処理が必要です。それが `StringUtil.encode_utf8()` で、もともと用意してたので今回はこれを呼び出すだけですみました。ただしメソッド名を見ての通りencode処理はutf8として決め打ちなので、サーバーサイドとの照合の際は注意が必要です。

***JSの文字列はバイト列ではない*** ということははまりがちですし、JSXを使ってもそれはなんとかしてくれたりはしないということですね。

### 空の配列要素

JSの場合、空の配列要素を初期化せずビット演算（整数演算）にまぜても大丈夫だったりしますが、JSXはこれを許しません。
```
var a = []
a[0] |= 1; // JSだとOK, JSXだと実行時例外
```

そこで移植の際には以下のように二項条件演算子を使ってしのぎました。

```
var a = [];
f(a[i] ?: 0);
```

ハマったところはこのくらいでした。逆に言えば、それ以外のところではほぼハマることはなく、ほぼコピペして関数シグネチャを整えるだけで済みました。使った時間は1時間くらいです。

今回簡単に移植できたのは、MD5がもともとC由来のライブラリだったからというのも大きいと思いますが、動的型付けやメタプログラミングに依存したコードでなければ移植はそれほど難しくないでしょう。

## SEE ALSO

*  [RFC1321](http://www.ietf.org/rfc/rfc1321.txt)