OmniAICreator/Qiita-1.07M huggingface dataset:
ブロックパラメータを複数取るEnumerableメソッドのあとにEnumeratorメソッドを重ねたときのブロックパラメータの指定方法（余談としてブロックローカル変数の宣言のこと）

タイトル長いなw
#きっかけ
hash.map.with_indexとかでブロック内に渡すパラメータがどうなるか悩んだことがありまして。
#結論
```
hash.map.with_index do |(key, value), i|
  puts "#{i}: #{key} => #{value}"
end
```
のように **丸括弧** でくくってしまえばOK。
##参考
るりまにちゃんと書いてある。
>```
with_index(offset = 0) {|(*args), idx| ... } -> object
```
[instance method Enumerator#with_index](http://rurema.clear-code.com/1.9.3/method/Enumerator/i/with_index.html)

#いままでやってた書き方
```
hash.map.with_index do |kv, i|
  key, value = kv
  puts "#{i}: #{key} => #{value}"
end
```
いちいちブロック内で別の変数に渡してました。

#余談
##名称
まず名称が分からなかったw 「ブロック変数」「ブロックローカル変数」「ブロックパラメータ」…
ですがMatzが「ブロックパラメータ」と書いてるので「ブロックパラメータ」と書きますw
[第6回 Ruby 1.9に起きた変化 - O'Reilly Japan Community Blog](http://www.oreilly.co.jp/community/blog/2009/05/changes-on-ruby-1-9.html)
##ブロックローカル変数宣言
まだ1.9.3を使っているのですが、これ忘れてましたw
ブロック外で使っている変数名をブロックローカルで使うことも出来るんですね。
>ブロックパラメータの後にセミコロンと変数名の列を書くことで，ブロックパラメータ以外にブロックローカルな変数を宣言する機能もあります。

>```
foo = "bear"
# ブロックローカル変数fooを宣言する
3.times do |x; foo|
  # ブロックローカル変数fooは毎回nilで初期化される
  p foo #=> nil
  foo = "dog"
  # ブロックの終了毎にブロックローカル変数fooは消える
end
# 外側のローカル変数は変更されない
p foo  #=> "bear"
```
[第3回　Ruby1.9の新機能ひとめぐり（中編）：洗練された文法と意味論：Ruby Freaks Lounge｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/ruby/0003)

つまり

```ruby
3.times do |x|
  foo = nil
  p foo
  foo = "dog"
end
```
と同様。いつも、こんな感じで初期化してましたw
外側のローカル変数と同じ変数名をブロックローカル変数として使うことはまずないけれども、宣言だけでブロック冒頭の初期化が不要になるのは少しうれしいです。

そして、この記法はどうやらこの記事が起源らしい（いま知った）。
>デフォルトはスコープローカル、明示的に指定した場合だけブロックローカル、 というものを採用する気になった。

>* ブロックパラメータの後ろに「;」を置き、そこに続けた変数はブロックローカル変数

>ハックしてたら30分でできてしまった。 
>[Matzにっき(2007-01-12)](http://www.rubyist.net/~matz/20070112.html#p04)

30分…w
Xamarin Monoでのbyte配列MP3の再生

初めまして。C#とXamarinでMacのプログラムを開発していましたがどうしても行き詰ってしまったので初めて投稿してみました。
Swfの解析を行っていたのですが,MonoMacでSwf2Xna(https://github.com/debreuil/Swf2XNA)
というライブラリを使って以下のようなコードを書いてました
```csharp
var reader = new SwfReader(Swfのファイル名);
var swf = new SwfCompilationUnit(reader);
var lstSound = swf.Tags.FindAll(x => x.TagType == TagType.DefineSound);
var tagData = lstSound[3];
var soundData = tagData as DefineSoundTag;
byte[] myByteArray = soundData.SoundData;
```
ここで確認したところ、myByteArrayはMP3のようでこれをファイルに書き込まず確認のために再生を行うようにしたいのですがどうしたらいいでしょうか。
NIST SP800-57


暗号鍵管理方法についてのガイドラインを少しだけざっくり訳してみた

5.3 Cryptoperiod 暗号期間(暗号化期間)

暗号期間は特定のキーが与えられたシステムが、有効な事業体、またはキーの使用が許可される時間のスパン
適切に定義された暗号期間とは、

1. キーによって保護される情報の量を制限します
2. ひとつのキーが侵害されたときの影響を制限します
3. 特定のアルゴリズムの使用を、見積もった実効寿命に制限します
4. 不正なアクセスから鍵を保護する物理的、手続き的、および論理的アクセス機構に入り込もうとする試行時間を制限します
5. 不注意による開示で情報が損なわれる可能性がありますが、この期間を制限します
6. (長期キーの保護を必要としないアプリケーションでは) コンピュータを利用した暗号解析攻撃が可能な時間を制限します

5.6.4 新しいアルゴリズムとキーサイズへの移行

アルゴリズムセキュリティライフタイムが存在する
このライフタイムの間は、アルゴリズムによってデータが保護されることを期待している
アルゴリズムやキーサイズの失効日が近づいているなら、新しいアルゴリズムとキーサイズへの移行を計画する必要がある。

IPAが「安全な暗号鍵のライフサイクルマネージメントに関する調査」に関する報告書
というものを公開しているので、こちらも合わせて読むのがよいでしょう
https://www.ipa.go.jp/security/fy19/reports/Key_Management/
JailBreakを検知するメソッド

iOSアプリ開発で不正利用防止の為、JailBreakを検知したいことがあると思います。

JailBreakを検知するには下記の３点をチェックすればほぼ間違いなく検知できるでしょう。
・Cydia.appがインストールされているか
・カスタムURLスキーム「cydia://」が開けるか
・「/bin/bash」パスが存在するか

これらをチェックしてbooleanで返却するメソッドを作ってやれば良いです。

```objc
- (BOOL)isJailBroken
{
#if TARGET_IPHONE_SIMULATOR
    //iPhoneシミュレータの場合は問答無用でNOを返却
    return NO;
#endif
    //Cydia.appが存在するか？
    BOOL isJailbroken = [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"];
    
    if (!isJailbroken) {
        //cydia: URLスキームが開けるか？
        isJailbroken = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]];
    }

    if (!isJailbroken) {
        // /bin/bashパスが存在するか？
        isJailbroken = [[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"];
    }

    return isJailbroken;
}
```

**追記
ryochinさんより情報提供（コメント欄参照）
Crackifyの方が厳密なチェックが行えそうです。
プライベート領域にファイル作成・書き込みを試行したり色々してるみたいです。
PHPでは関数の引数の個数がチェックされない

PHPの再勉強中。

今までさらっと流してきたけれど、PHPの関数やメソッドの引数の扱いがちょっと変わっているのに今更ながらに気がつきました。

```php
<?php

# 引数を二つとる関数を定義
function two_args_func($a, $b)
{
  echo "{$a}:{$b}" . PHP_EOL;
}

# 関数を呼び出す。
two_args_func("hoge", "fuga"); # => hoge:fuga

# 引数を一つだけで呼び出してみる
two_args_func("hoge"); # => hoge: 

# 三つの引数で呼び出してみる
two_args_func("hoge","fuga","piyo"); # => hoge:fuga
```

引数を2つとる関数を定義して、引数の数を変えて呼び出してみました。常識的にはエラーになる筈ですが、PHPではエラーになりません。引数の数が足りない場合は、"Missing argument"のWarningが発生しますが致命的なエラーにはならず、2つ目の仮引数の値が未定義のまま処理が継続します。また、仮引数が多い分にはWarningすら発生しないようです。

これはおそらく可変長引数をサポートするための仕様なんだと思われますが、キチンと引数の個数チェックが行われる他の言語に慣れてしまっているとちょっと戸惑います。

実際に渡された引数の数は、`func_num_args()`関数を呼び出すことで取得できるので、
これを利用して関数側で引数の数をチェックすることはできます。

```php
function two_args_func($a, $b)
{
	$args_count = func_num_args();
	if ($args_count == 2)
	{
		echo "{$a}:{$b}" . PHP_EOL;
	}
	else
		throw new Exception("Invalid number of arguments."); 
}
```

また、渡された引数の値は関数定義の仮引数の有無に関わらず、`func_get_arg()`関数、`func_get_args()`関数で取得することが可能です、

```php
<?php

function func($a)
{
	$arg1 = func_get_arg(0);
	$arg2 = func_get_arg(1);
	echo "a:{$a} arg1:{$arg1} arg2:{$arg2}" . PHP_EOL;
}

func("hoge","fuga");  # => a:hoge arg1:hoge arg2:fuga
```

`func_get_arg()`関数、`func_get_args()`関数は引数の値を返します。引数が値渡しである場合はとくに問題はありませんが、参照渡しの場合でも参照ではなく値が返されるので注意が必要です。

```php
<?php
function func1(&$n)
{
   $n *= 2;
}

function func2(&$n)
{
  $arg = func_get_arg(0);
  $arg *= 2;
}

$a = 1;
func1($a);
echo $a . PHP_EOL;  # => 2
func2($a);
echo $a . PHP_EOL;  # => 2
```

例えば上の例だと、`func1()`、`func2()`ともに引数は参照渡しで渡されますが、仮引数を利用する`func1()`では呼び出し元の変数`$a`の値を変更してしまうのに対して、`func_get_arg()`を利用する`func2()`では呼び出し元の変数`$a`の値は変化しません。

また、`func_num_args()`関数や`func_get_arg()`関数などはデフォルト引数については感知しないという特性があります。

```php
<?php

function func_with_default_arg($a = 100)
{
	$args_count = func_num_args();
	echo "Number of args:{$args_count} / Value:{$a}" . PHP_EOL;
}

func_with_default_arg();     # => Number of args:0 / Value:100
func_with_default_arg(200);  # => Number of args:1 / Value:200
```

デフォルト付きの引数が省略された場合、仮引数にはデフォルト値が設定されますが、`func_get_arg()`関数ではデフォルトの値を取得することはできません。

PHPでは、`func_num_args()`関数や`func_get_arg()`関数を利用して可変長引数をサポートしているので、可変長引数のための特別な構文は存在しませんが、その代わりに関数呼び出し時に引数の個数がチェックされないのだとしたら、何だか納得しずらいです。

関数の引数の個数をチェックしない（或いは可変長引数のための特別な構文を導入しない）ことに積極的な理由があるんでしょうか？

---

**追記 22:30**

参照渡しの記述が完全に勘違いでしたので書き直しました。
また、PHP5.6では可変長引数用の構文が用意されるとのことです。
vim自分用メモ

忘れっぽいいのでメモ書き

# vimで文字列置換

## 一括置換したいとき
> %s/対象文字列/置換文字列

## スラッシュを文字列置換したいとき
> s;対象文字列;置換文字列

## 置換文字列に改行を使いたいとき
> 改行を　ctr+V　ctr+M　で入力

## 行を指定して文字列置換したいとき
> 開始行,終了行s/対象文字列/置換文字列

#　編集機能

## 入力補完
> 対象語句にカーソルを合わせて ctr+n で変換候補を表示 

##行追加
> コマンドモードで o を入力

## インデント修正
> コマンドモードで gg=G
VPS上(CentOS6.4)にIRCからSkypeをする環境を構築する


参考
- [CentOS6.4にSkypeを入れてbotでお話させる - /dev/null](http://gitpub.hatenablog.com/entry/2013/07/13/224437)

Skypeの起動に必要な物を入れる

```
$ sudo yum install -y glibc.i686 nss-softokn-freebl.i686 alsa-lib.i686 libXv.i686 libXScrnSaver.i686 libtiff.i686 glib2.i686 libSM.i686 libXrender.i686 fontconfig.i686 pulseaudio-libs.i686 alsa-plugins-pulseaudio.i686
$ sudo ln -s /usr/lib/libtiff.so.3 /usr/lib/libtiff.so.4
```

Skype本体のインストール + シンボリックリンクを張る

```
$ cd /tmp/
$ wget http://download.skype.com/linux/skype_static-4.0.0.8.tar.bz2
$ cd /opt/
$ sudo tar xjvf /tmp/skype_static-4.0.0.8.tar.bz2
$ sudo mv skype_staticQT-4.0.0.8/ skype
$ sudo ln -s /opt/skype /usr/share/skype
$ sudo ln -s /opt/skype/skype /usr/bin/skype
$ sudo mkdir /var/db/skype /var/run/skype /var/log/skype
$ sudo chown user:user /var/db/skype /var/run/skype /var/log/skype
```

Skype起動スクリプトの導入

```
$ mkdir ~/script/
$ cd ~/script/
$ wget https://gist.githubusercontent.com/moriyoshi/557242/raw/9c5b74769969efcf4e982949c0470561ed6c096c/launch-skype.sh
$ vi launch-skype.sh
DAEMON_USER, USERNAME, PASSWORDを編集
- DBPATH=/srv/skype/conf
+ DBPATH=/var/db/skype
$ chmod +x launch-skype.sh
```

VNC環境の構築

```
$ sudo yum -y install xorg-x11-xauth xorg-x11-server-Xvfb
$ sudo yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
$ sudo yum install -y x11vnc ipa-gothic-fonts
$ sudo yum install -y fluxbox
```


Skypeのプロセスを立ち上げ、VNCで接続して規約に同意するボタンを押す

```
$ sudo ./launch-skype.sh start
$ sudo ufw allow 5900
$ x11vnc -nopw -display :20
```

Skype4Py, python-irclibを入れる(pip, easy_installではpython-irclibのインストールでエラーを吐く)

```
$ sudo pip install Skype4Py
$ cd /tmp
$ wget -4 http://sourceforge.net/projects/python-irclib/files/python-irclib/0.4.8/python-irclib-0.4.8.zip
$ unzip python-irclib-0.4.8.zip
$ cd python-irclib-0.4.8
$ sudo python setup.py install
```

IRCサーバのインストール, 設定

```
$ sudo yum -y install ngircd
$ sudo vi /etc/ngircd.conf
- ;Ports = 6667, 6668, 6669
+ Ports = 6668
$ sudo /etc/init.d/ngircd start
```

SkypeをIRCにミラーリングするBOTを導入

```
$ cd ~/script
$ wget https://gist.githubusercontent.com/tigberd/3c9b9961b0c676559634/raw/skype_irc_mirror.py
$ vi skype_irc_mirror.py
IRCチャンネルやSkypeチャットIDを適当に設定

$ chmod +x skype_irc_mirror.py
$ env DISPLAY=:20 XAUTHORITY=/var/run/skype/Xauthority ./skype_irc_mirror.py
(VNCでSkypeへのアクセスを許可するかのダイアログが出るので許可を押す)
```

IRCサーバにクライアントから接続
nend Unityプラグインで広告を表示するメモ


nendSDK Unity Plugin ver 1.0.2についてのメモ

# Gameウインドウでは広告は表示されない

SDKに同梱されているサンプルを動かしてみても、UnityのGameウインドウでは広告は表示されない。iOS実機やシミュレータで実行した際に広告が表示されるようになっている。

サンプルにはサンプル用のAPIキーがあり、実行することでダミーの広告が表示される。

ちなみに、Unityのエディタ上でここにキーをペーストすることができないと思い込んでいたけど、実際はペーストできる。すでに文字列が入力されている状態でそれを選択状態にしている場合に限ってペーストが出来る様子。逆にまったく文字列が入力されてないところにペーストはできない。


# 表示するステージごとに切り替える

## 表示・非表示のメソッド


ステージを開始する際に広告を表示するために、NendAdBannerやNendAdIconクラスのShowメソッドとResumeメソッドを実行し、次のステージに遷移する際に、広告を停止するためにHideメソッドとPauseメソッドを実行する。

Resume,Pauseはそれぞれ広告のローテーションの再開と停止をしている。

## フラグ

サンプルによるとステージ遷移の停止時には

```
isResumeNeeded = true;
```

としておき、Startメソッドでそのフラグがtrueであれば実行し、フラグをfalseにしている

```
isResumeNeeded = false;
```

おそらくAutomatic Display時に2重にShowをしてしまわないためにフラグを使っている様子。


# 参考

nend メディアパートナー向け資料
http://nend.net/dl/mediapartner/
VagrantのCentOS6.5にJenkinsをインストール


#Mac側での作業
[こちら](http://qiita.com/kijitoraneko/items/c5520c4e75e26176d7e1#1-4)を参照いただきCentOS6.5のVagrant環境を構築して下さい。
Macで作業していますが、以降のVagrantでの作業はWindowsでも共通ですので、
Windowsの場合はWindowsにVagrant環境を構築してください。

#Vagrant(CentOS6.5)での作業
##ルートになって作業
```
su
Password:パスワード入力（vagrantと入力）
```

##Javaのインストール
```
yum install java-1.7.0-openjdk
```


##バージョン確認

```
java -version
java version "1.7.0_55"
OpenJDK Runtime Environment (rhel-2.4.7.1.el6_5-x86_64 u55-b13)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
```


##wgetのインストール
```
yum install wget
```


##Jenkinsインストール
```
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key 
yum install jenkins
```


##Jenkins起動
```
service jenkins start
```

##起動確認
http://192.168.33.10:8080
にアクセスしJenkinsの画面が表示されることを確認します。

##追加事項
今回使用したVagrantのBoxではiptablesの設定がなされていないようで、
アクセス制御は一切なされていませんでした。

実運用では[こちら](http://qiita.com/shimohiko/items/ec672655edb84578a82e)などを参照して設定する必要があるかと思います。





<br><br><br>
Macのhfs+をCentOSでマウント

## hfsplusファイルフォーマットを使えるようにする

```bash:kmod-hfsplusをインストール
$ sudo rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
$ sudo rpm -Uvh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
$ sudo yum install -y kmod-hfsplus
```

## GPTパーティションはfdiskでは見ることができない。

```bash:
$ sudo fdisk -l /dev/sde

警告: GPT (GUID パーティションテーブル) が '/dev/sde' に検出されました! この fdisk ユーティリティは GPT をサポートしません。GNU Parted を使ってください。


ディスク /dev/sde: 1500.3 GB, 1500301910016 バイト
ヘッド 255, セクタ 63, シリンダ 182401
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sde1               1      182402  1465138583+  ee  GPT
```

## partedを使う

```bash:
$ sudo parted /dev/sde print
モデル: BUFFALO HD-PCTU3 (scsi)
ディスク /dev/sde: 1500GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt

番号  開始    終了    サイズ  ファイルシステム  名前                  フラグ
 1    20.5kB  210MB   210MB   fat32             EFI System Partition  boot
 2    210MB   1500GB  1500GB  hfs+              1.5tb
```

# mount

```bash:
$ sudo mount -o ro /dev/sde2 ~/mac
```
AWS Elastic BeanstalkのAmazon Linuxアップデート


## 正しい方法

* Create New Environment
  * Start from -> Predefined configurationでTomcatなどを選択
![スクリーンショット 2014-05-08 11.00.24.png](https://qiita-image-store.s3.amazonaws.com/0/21577/92435780-7f5d-1ddb-3be6-d03dc9f006f8.png "スクリーンショット 2014-05-08 11.00.24.png")
  * (もし古いバージョンのAmazon Linuxを使用したいならば,
Change Defaultsのリンクをクリックするとプルダウンで選択できるようになる)
  * 移行の設定は既存の環境と同じ設定にし、新しい環境を作成を完了する
  * Environment PropertiesやEC2 security groupsなどはStatusがGreenになってから改めて設定する。インスタンスが再生成されて二度手間だけど仕方がない。
 * Swap Environment URLsで新旧の環境を入れ替える

## 誤った方法

* Configuration -> Instances -> Custom AMI ID で新しいバージョンのAmazon LinuxのAMI IDを指定する
* インスタンスの初期化に失敗する
 * /var/log/cfn-init.logに以下のようなエラーが出る
 * [ERROR] Yum failed. Output: Loaded plugins: priorities, update-motd, upgrade-helper
 * [ERROR] Error encountered during build of TomcatContainerSwitchJavaVersion: Could not successfully install/update yum packages (return code 1) 
* StatusがGrayのままになり、設定変更が一切できなくなる
 * 設定変更しようとすると「Unable to validate settings: Environment named xxxxxxxxxx is in an invalid state for this operation. Must be Ready.」
![スクリーンショット 2014-05-08 10.49.32.png](https://qiita-image-store.s3.amazonaws.com/0/21577/26c0b605-a277-a115-d073-882362db7760.png "スクリーンショット 2014-05-08 10.49.32.png")
 * Swap Environment URLsもLoad Configurationもできない
* Rebuild Environmentはできるが、結局初期化に失敗してStatusはGrayのまま
* 結局 **Terminate Environment** するしかない。

※もしStatusがGrayの状態から復旧させる方法があれば教えてください。
![スクリーンショット 2014-05-08 10.54.34.png](https://qiita-image-store.s3.amazonaws.com/0/21577/bef6f6d0-f510-ec10-6c9a-d7990d65fa38.png "スクリーンショット 2014-05-08 10.54.34.png")
ややこしいHashをirbで綺麗に表示

でかめのハッシュを`irb`で表示すると親子関係とかとても見にくい。そんなの時の対処法。

## 簡単なの

```rb
require 'pp'
pp hash
```

## ちょっとだけめんどくさいの
`$ gem i awesome_print`

```rb
require 'awesome_print'
ap hash
```

## 参考

<a href="http://stackoverflow.com/questions/8842546/best-way-to-pretty-print-a-hash">ruby - Best way to pretty print a hash - Stack Overflow</a>
JSONの書式メモ

自分向けへのメモです。

# Objective-cでの読み込み方

標準ライブラリのNSJSONSerializationを利用する。
使い方は[Objective-CでJSONを使う](http://qiita.com/edo_m18/items/f42ec916a3e9ee16d193)を参照してください。


# jsonにはコメントがない.

[JSONにはコメント構文がない](http://qiita.com/guimihanui/items/f9a10edf2315be0a2a64)...らしい。

# 配列

JSON文字列
```json
// データは数値
[10,20,30]
// データは文字列
["10","20","30"]
```

## 動作確認

```objc
// 文字列の場合
-(void)testJsonArrayStr
{

    NSString* json = @"[\\"10\\",\\"20\\",\\"30\\"]";
    NSData* data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSArray* array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    
    XCTAssertEqualObjects(@"10", array[0]);
    XCTAssertEqualObjects(@"20", array[1]);
    XCTAssertEqualObjects(@"30", array[2]);
}
```

```objc
// 整数値の場合
-(void)testJsonArrayNum
{
    NSString* json = @"[10,20,30]";
    NSData* data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSArray* array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    
    XCTAssertEqualObjects(@10, array[0]);
    XCTAssertEqualObjects(@20, array[1]);
    XCTAssertEqualObjects(@30, array[2]);
}
```

# ハッシュ

ハッシュのキーは必ず文字列であること。
他に:とすべきところを,をしたりすると×。

JSON文字列
```json
// データは整数値
{ "val": 1 }
// データは文字列
{ "val" : "str" }
// データは配列
{ "val" : [1,2,3] }
// データはハッシュ
{ "val" : {"name": "Sugamo taro",
            "age": 35} }
```

## 動作確認
```objc
// データは整数値
// { "val": 1 } 
-(void)testJsonHashNum {
    NSString* json = @"{\\"val\\": 1}";
    NSData* data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSObject* val = dict[@"val"];
    XCTAssertEqualObjects(@1, val);
}
```

```objc
// データは文字列
// { "val" : "str" }
-(void)testJsonHashStr {
    NSString* json = @"{\\"val\\": \\"str\\"}";
    NSData* data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSObject* val = dict[@"val"];
    XCTAssertEqualObjects(@"str", val);
}
```

```objc
// データは配列
// { "val" : [1,2,3] }
-(void)testJsonHashArray {
    NSString* json = @"{\\"val\\": [1,2,3]}";
    NSData* data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSObject* val = dict[@"val"];
    NSArray* expect = @[@1,@2,@3];
    XCTAssertEqualObjects(expect, val);
}
```

```objc
// データはハッシュ
//{ "val" : {"name": "Sugamo taro",
//            "age": 35} }
-(void)testJsonHashHash {
    NSString* json = @"{\\"val\\": 
      {\\"name\\": \\"Sugamo taro\\",
       \\"age\\": 35}}";
    NSData* data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

    NSDictionary* expect = @{@"val": @{@"name": @"Sugamo taro", @"age":@35}};
    XCTAssertEqualObjects(expect, dict);
}
```

# 余談
- Objective-Cにはヒアドキュメントが無くて不便。
- 開発中のXCode5.1版のxvimでは\が入力できないっぽい...。
iTerm2 のタブタイトルを変更する


こちらを参考に変更しました。
[How to change the title of an xterm](http://www.faqs.org/docs/Linux-mini/Xterm-Title.html)
と言ってもとくにこだわりがないので[4.3 bash](http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss4.3)に書いてあるものをそのまま使ってます。 

```
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
```
[Objective-C] MPMoviePlayerControllerで動画を再生する


最低限のコードで動くサンプルを[Github](https://github.com/edom18/MPMoviePlayerControllerTest)に上げてあります。

## MediaPlayer.frameworkを使う

MPMoviePlayerControllerは、MediaPlayer.frameworkを使います。
冒頭でこれをimportします。

```objc
#import <MediaPlayer/MediaPlayer.h>
```

また、生成したMPMoviePlayerControllerを保持するためにプロパティを宣言します。

```objc
@property (strong, nonatomic) MPMoviePlayerController *player;
```

そして、動画のURLでMPMoviePlayerControllerを初期化し、再生します。

```objc
NSURL *url = [NSURL URLWithString:@"http://hoge.com/sample.mp4"];

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];

// MoviePlayerを保持
self.player = player;

// 動画読み込み後に呼ばれるNotification
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePreloadDidFinish:)
                                             name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                           object:player];

// 動作の再生終了時に呼ばれるNotification
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlayerPlaybackDidFinish:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:player];

player.view.frame = CGRectMake(0, 0, 320, 200);
[self.view addSubview:player.view];

// 再生開始
[player prepareToPlay];
```



## ハマったメモ

なんでかハマったのでメモ。
最初、適当に調べてきたコードをそのまま使って実行してみるも動画再生できず。
動画自体に問題なのか、まったく原因特定できず。

### 単なるシミュレータの問題でした

色々調べていたら、最初ダメだったけど時間たったらなぜか動いた的な記事を見つけて、もしかしてシミュレータの問題か？　と思い実機で実行すると・・普通に動いたorz
原因は不明だけど、コード自体にはまったく問題なかった模様。

誰かの役に立てばと思い、とりあえずメモしておきます。


### `initWithContentURL:`するとクラッシュする

`MPMoviePlayerController`を初期化する際、`initWithContentURL:`にURLを渡して生成し、さらに`movieSourceType`を`MPMovieSourceTypeStreaming`を指定するとクラッシュする、という問題。

初期化時ではなく、`movieSourceType`プロパティを設定したあとに改めて`contentURL`を設定すると問題なく動いた。

*※ちなみに`MPMovieSourceTypeFile`を指定する場合は`initWithContentURL:`を使っても問題ありませんでした。*
SimpleAuthでサブドメインをまたぐ


hoge.comでログイン画面を出してログインと同時にadmin.hoge.comにリダイレクトしたい。
そしてadmin.hoge.comでもログイン情報を保持したいtips。
調べれば方法は出るものの、また探すのﾏﾝﾄﾞｸｾので自分用メモ。

## 原因
SimpleAuthのログイン情報はSessionで持っている。
サブドメインをまたぐときにセッションが切れてしまうので、ログイン情報を維持できない。

## 対処

```app/config/config.php
// (185行目付近)
	/**
	 * Cookie settings
	 */
	'cookie' => array(
		// Number of seconds before the cookie expires
		// 'expiration'  => 0,
		// Restrict the path that the cookie is available to
		// 'path'        => '/',
		// Restrict the domain that the cookie is available to
		'domain'      => '.hoge.com',	// 変更
		// Only transmit cookies over secure connections
		// 'secure'      => false,
		// Only transmit cookies over HTTP, disabling Javascript access
		// 'http_only'   => false,
	),
```

cookieの項目がコメントアウトされていたら（多分デフォルトがそう）、該当部分のみアンコメントしてください。
domain部分にドメインを記述します。今回は.hoge.comと書き換えました。

```app/config/session.php
// (42行目付近)
	// cookie domain  (optional, default = '')
	'cookie_domain' 	=> '.hoge.com',	// 14.05.08 変更
```

ファイルが存在しない場合はcore/config/session.phpをコピーして持ってきて書き換えます。
このように書き換えることで、サブドメイン間でのセッションの維持が可能になります。

session.phpがconfig下に無かったのでしばらくはまってしまった(´@ω@｀;)
FuelPHPの構造を理解しきっていないとこういうどうでもいいところでつまります。
jiraのfooterに入っている"Report a problem"のリンクを編集する方法

JIRAのfooterに入っている"Report a problem"っていうリンク、クリックしてもissue createに飛ぶだけで邪魔だと思っていた。
![bonfire-screenshot-20130319-120345-502.png](https://qiita-image-store.s3.amazonaws.com/0/36604/b1ea4213-6d64-032f-8b0c-2c96c9ce9c6d.png)


これを編集して、すきなリンクに飛ばすようにしたい。

`<jira>/atlassian-jira/WEB-INF/classes/templates/plugins/footer/footer.vm`
このファイルを編集したらいけた。

```html
        <li>
            #if ($isSysAdmin)
                #set ($url = "${req.contextPath}/plugins/servlet/stp/view/")
            #elseif ($showContactAdminForm)
                #set ($url = "${req.contextPath}/secure/ContactAdministrators!default.jspa")
            #else
                #set ($url = "${req.contextPath}/secure/CreateIssue!default.jspa")
            #end
            <a id="footer-report-problem-link" href="$url">Report a problem</a>
        </li>
```
この部分を、

```html
        <li>
            #if ($isSysAdmin)
                #set ($url = "${req.contextPath}/plugins/servlet/stp/view/")
            #elseif ($showContactAdminForm)
                #set ($url = "${req.contextPath}/secure/ContactAdministrators!default.jspa")
            #else
                #set ($url = "${req.contextPath}/secure/CreateIssue.jspa?pid=10100&issuetype=17")
            #end
            <a id="footer-report-problem-link" href="$url">Inquiry to JIRA admin!!</a>
        </li>
```

こういうふうに書き換えて、再起動する。すると、意図したようにissueを作らせられるリンクにできた。
bash/vim 初心者の為のTips


bashやvimは多くのショートカットやTipがありますが、初心者の自分がよく使うものだけ抜粋してみました。

# bash
## カーソル移動、削除のShortcut
* `Ctrl+a` 行頭に移動
* `Ctrl+e` 行末に移動
* `Ctrl+u` カーソル位置から行頭までを削除

## Command historyの後方検索
`Ctrl+r`で後方検索モードに入り、検索文字を入力。複数の候補がヒットする場合、`Ctrl+r`を押すたびに次の候補になります。

## Alias
`.bashrc`によく使うコマンドのショートカットを登録しておきます。

```shell:.bashrc
alias term="ssh username@terminal.domain"
```

## その他
* `cd -`で1つ前のcurrent directoryに移動できます。

# vim
大文字のものは`Shift`と一緒に押して下さい。
## カーソル移動
* `k` 上に移動
* `j` 下に移動
* `h` 左に移動
* `l` 右に移動
* `0` 行頭に移動(インデント無視)
* `^` 行頭に移動(インデントの最後に移動)
* `$` 行末に移動
* `gg` ファイルの先頭に移動
* `G` ファイルの最後に移動
* `数字``gg` 指定した数字の行に移動

## エディタ設定
* `:se nu` 行番号を表示
* `:noh` 検索結果のハイライトを消去
* `:se paste` 貼り付けモードに移行。自動インデントされてしまう場合などに利用。
* `:se nopaste` 貼り付けモード解除

## モード
* `I` カーソル行の先頭に移動して入力モードに。行頭に追加する場合に。
* `A` カーソル行の最後に移動して入力モードに。行末に追加する場合に。
* `o` カーソル行の下に空行を追加して入力モードに。
* `O` カーソル行の上に空行を追加して入力モードに。

## 編集系
* `dd` カーソル行を削除
* `数字``dd` カーソル行から数字行分削除
* `d$` カーソル位置から行末までを削除
* 複数行に一括追加 (e.g. 先頭に#を追加、など)
 1. `Ctrl+v`で矩形選択モードに入る
 2. 追加したい行を複数選択して、`I`または`A`
 3. 追加する内容を入力して`Esc`

----
他にも思いついたら随時追加していきます。
SpriteKit入門 -16-


SKTextureクラスのpreloadTextures:withCompletionHandler:メソッドの使い方が理解できなかったので、次のようなテストコードを書いてみました。

```objectivec:SpriteViewController.m
- (void)viewDidAppear:(BOOL)animated
{
	__block NSDate *dateStart = [NSDate date];
	__block SKTexture *texture = nil;
	texture = [SKTexture textureWithImageNamed:@"bomb.png"];
	texture = [SKTexture textureWithImageNamed:@"japanese-chess-02.jpg"];
	texture = [SKTexture textureWithImageNamed:@"Spaceship.png"];
	texture = [SKTexture textureWithImageNamed:@"stretchable_button.png"];
	NSLog(@"complete1[%.2fs]", [[NSDate date] timeIntervalSinceDate:dateStart]);
	[SKTexture preloadTextures:@[
								 [SKTexture textureWithImageNamed:@"bomb.png"],
								 [SKTexture textureWithImageNamed:@"japanese-chess-02.jpg"],
								 [SKTexture textureWithImageNamed:@"Spaceship.png"],
								 [SKTexture textureWithImageNamed:@"stretchable_button.png"]
								 ]
		withCompletionHandler:^{
			NSLog(@"complete2[%.2fs]", [[NSDate date] timeIntervalSinceDate:dateStart]);
			texture = [SKTexture textureWithImageNamed:@"bomb.png"];
			texture = [SKTexture textureWithImageNamed:@"japanese-chess-02.jpg"];
			texture = [SKTexture textureWithImageNamed:@"Spaceship.png"];
			texture = [SKTexture textureWithImageNamed:@"stretchable_button.png"];
			NSLog(@"complete3[%.2fs]", [[NSDate date] timeIntervalSinceDate:dateStart]);
			texture = [SKTexture textureWithImageNamed:@"bomb.png"];
			texture = [SKTexture textureWithImageNamed:@"japanese-chess-02.jpg"];
			texture = [SKTexture textureWithImageNamed:@"Spaceship.png"];
			texture = [SKTexture textureWithImageNamed:@"stretchable_button.png"];
			NSLog(@"complete4[%.2fs]", [[NSDate date] timeIntervalSinceDate:dateStart]);
			texture = [SKTexture textureWithImageNamed:@"bomb.png"];
			texture = [SKTexture textureWithImageNamed:@"japanese-chess-02.jpg"];
			texture = [SKTexture textureWithImageNamed:@"Spaceship.png"];
			texture = [SKTexture textureWithImageNamed:@"stretchable_button.png"];
			NSLog(@"complete5[%.2fs]", [[NSDate date] timeIntervalSinceDate:dateStart]);
			HelloScene *hello = [[HelloScene alloc] initWithSize:CGSizeMake(768, 1024)];
			SKView *spriteView = (SKView *)self.view;
			[spriteView presentScene:hello];
	}];
}
```

実行結果はこのようになりました。

```
complete1[0.00s]
complete2[0.03s]
complete3[0.04s]
complete4[0.04s]
complete5[0.04s]
```

つまり、textureWithImageNamed:メソッドはテクスチャの読み込みは行わずSKTextureオブジェクトを作成して返すだけということのようです。
テクスチャを使うとiOSが判断したときに、バックグラウンドで自動的に読み込みが発生するという仕組みです。

それだと、大きなテクスチャの読み込みが発生したときに、描画までに間に合わないなどの問題が発生しそうな場合は、preloadTextures:withCompletionHandler:メソッドで先読みさせておくという使い方をするみたいですね。
なるほど。

今回はここまで。
[Vagrant 1.x] メモリーサイズを上げる

macbook airにvagrantとvirtual boxでvmを立てて、CentOSを入れてRailsのプロジェクトを動かしているのですが、割りと初期からよくこんなエラーが出てました。

```rb
/home/hoge/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/application.rb:153:in `fork': Cannot allocate memory - fork(2) (Errno::ENOMEM)
```

メモリー系のエラーな様です。

調べてみたら対応策として、2つのことが挙げられていました。

# Swap領域の確保

```pl
$ sudo swapon -s # スワップの現状確認
$ df # ディスク使用状況確認
$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=256k # スワップ用のファイル作成
$ sudo mkswap /swapfile # 作成したファイルをスワップとして初期化
$ sudo swapon /swapfile # スワップを有効化
$ swapon -s # 確認
```

再起動時でもSwap領域を使えるようにするには

```pl
$ sudo sh -c "echo '/swapfile swap swap defaults 0 0' >> /etc/fstab"
```

こうすると、確かに動きます。
でもわたしの場合は、しばらくするとこれでも動かなくなりました。
swapのサイズも足りないのか??

# メモリーサイズを増やす

そもそもメモリーがこれ以上割り当てられないと怒られているので、メモリーを増やして上げればいいんじゃないかということです。

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.provider :virtualbox do |vb|
    ・
    ・
    vb.customize ["modifyvm", :id, "--memory", 1024]
  end

  # :
  # other settings
  # :
end
```

とりあえず1GB割り当てました。
これでなんとか動きました。

初期設定はOS推奨の最小値になっているらしいので、限界もくるのもわからなくもないかな。


あとは

```pl
$ vagrant reload
```

で反映されるはずです。
OSX上のopenocdから FM3スティックに繋がらない時の対処法


Spansion社が販売している SK-FM3-48PMC-USBSTICK (以下 FM3スティックと略記)は，値段も手頃で入手性も悪くない評価ボードです．

しかし，どんな評価ボードにも難点はあるもので，このFM3スティックの場合は，オンボードのJTAGアダプタが鬼門です．

## 問題の背景

FM3スティックのオンボードJTAGアダプタは，FTDI社のFT2232という，廉価帯のJTAGアダプタではお馴染みのチップが使われています．
このチップは多機能で，シリアルポートにもなりますし，パラレルポートにもなりますし，JTAGアダプタとしても使えます．

FT2232はは，USB の個体識別に必要な VID/PID を，外部の SPIフラッシュメモリに保存します．フラッシュメモリが実装されていなければ，FTDI社が所有している VID/PID (0403:6010) が割り振られます．

OSX 側は，FM3スティックが挿さったとき，VID/PID (0403:6010) を認識して，デバイスドライバをロードします．このとき，OSXは VID/PID が 0404:6010 のデバイスをシリアルポートとして認識し，シリアルポート用のドライバを選択します．

そのため，openocd では JTAG デバイスとして認識できなくなります．例えば下記のようなメッセージが出ます．

```sh
$ openocd 
Open On-Chip Debugger 0.8.0 (2014-05-08-01:30)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
jtag_ntrst_delay: 500
trst_only separate trst_push_pull
adapter speed: 500 kHz
   TapName             Enabled  IdCode     Expected   IrLen IrCap IrMask
-- ------------------- -------- ---------- ---------- ----- ----- ------
 0 mb9bfxx2.cpu           Y     0x00000000 0x4ba00477     4 0x01  0x0f
#0 : mb9bfxx2.flash (fm3) at 0x00000000, size 0x00000000, buswidth 0, chipwidth 0
cortex_m reset_config sysresetreq
Error: libusb_claim_interface() failed with -3
Error: unable to open ftdi device with vid 0403, pid 6010, description 'Dual RS232' and serial '*'
in procedure 'init'
$
```

上のログで， ```$``` は，コマンドプロンプトです．(下記も同様)

## 解決

最もシンプルな方法は，デバイスをアンロードする解決法です．
まず，FTDI 関連のドライバで，ロードされているものを探します．

```sh
$ kextstat|grep FTDI
  227    0 0xffffff7f82650000 0x8000     0x8000     com.FTDI.driver.FTDIUSBSerialDriver (2.2.17) <105 37 5 4 3 1>
```

私の手元では，```com.FTDI.driver.FTDIUSBSerialDriver``` しか出てきませんが，環境によっては，いくつかのドライバが出てきます．

それらをアンロードします．管理者権限が必要です．

```sh
$ sudo kextunload -bundle com.FTDI.driver.FTDIUSBSerialDriver
Password:
```

そののち，openocd を起動します．openocd.cfg は，[bitbucket にあるリポジトリ](https://bitbucket.org/NSaitoNmiri/openocd-configuration-file-for-fm3-usbstick/raw/a1e3ff247e918b2b34dc6d125cd10b5f67c83694/sk-fm3-48pmc-usbstick.cfg)が参考になります．

```sh
$ openocd 
Open On-Chip Debugger 0.8.0 (2014-05-08-01:30)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
jtag_ntrst_delay: 500
trst_only separate trst_push_pull
adapter speed: 500 kHz
   TapName             Enabled  IdCode     Expected   IrLen IrCap IrMask
-- ------------------- -------- ---------- ---------- ----- ----- ------
 0 mb9bfxx2.cpu           Y     0x00000000 0x4ba00477     4 0x01  0x0f
#0 : mb9bfxx2.flash (fm3) at 0x00000000, size 0x00000000, buswidth 0, chipwidth 0
cortex_m reset_config sysresetreq
Info : clock speed 500 kHz
Info : JTAG tap: mb9bfxx2.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : mb9bfxx2.cpu: hardware has 6 breakpoints, 4 watchpoints
```

繋がりました．

## 参考資料

OSX と FTDI ドライバの関係については，Oversea Publishing のサイトで[詳しく紹介](http://www.oversea-pub.com/free/environment/2083.html)されています．
秋月のBlueBoardでprintf

　秋月のBlueBoardのI/Oをmbedプロジェクトで試すために、UART0を使ってprintfしてみました。

http://nora66.com/mbed/mbed-src.html#2014/05/08orange

　あまりに簡単。
　やっぱりmbedはすっげぇ！
Spring BatchでのUnitTest

## できること

Spring Batchの各Stepを単独で実行できる。もちろんJobの実行も。

## 手順
1. まずは普通にUnitTestクラスを作る。
1. @RunWithの指定に、SpringJUnit4ClassRunnerを設定。
（mavenを使ってる場合は、dependencyにspring-testが必要）

1. @ContextConfigurationで、SpringBatch定義と、テスト用のJobLauncherTestUtilsの設定ファイルを指定。(mavenを使っている場合は、dependencyにspring-batch-testが必要)

1. UnitTestクラスに@AutowiredでjobLauncherTestUtilsをDIさせる。

## サンプルコード

```lang:test-context.xml
	<bean id="jobLauncherTestUtils" class="org.springframework.batch.test.JobLauncherTestUtils">
		<property name="job" ref="sampleJob" />
		<property name="jobRepository" ref="jobRepository" />
		<property name="jobLauncher" ref="jobLauncher" />
	</bean>
```

```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/batch-context.xml", "/test-context.xml" })
public class SampleTest {

	@Autowired
	private JobLauncherTestUtils jobLauncherTestUtils;

	@Test
	public void testStep() throws Exception {
		// 単独のStepの実行
		jobLauncherTestUtils.launchStep("sampleStep");
	}

	@Test
	public void testJob() throws Exception {
		// Jobの実行 もちろんパラメータ設定もできる
		jobLauncherTestUtils.launchJob(new JobParameters());
	}
}
```

```
tmlib.js が 0.2.0 になってたのでアップデートしてみた。

# はじめに

リアルタイムに develop は追ってないけど、リリースされた物にはついて行こうかと。

どこが変わったとか、あまり把握してないので、とりあえず交換してテストしてみる。自動テスト。
案の定というか、普通には通りませんね＾＾

と、言うわけで、バージョンアップです！（tmlib-rpgで現在使ってる範囲のみの変更点まとめ）

# 変更点その１ AssetManager

tm.asset.AssetManager が tm.asset.Manager と tm.asset.Loader になってたよ。

これは良い感じ。

溜めて置く所と、読み込む処理を、分けることで Loader が必要な時にだけインスタンス化すればいい感じになってました。
Manager には、Loader からじゃなくても登録できるので、無理やり json ファイルと、json のオブジェクトを読ませる必要はなくなった感じ。

本番は、json ファイルを読ませて、とりあえず試したいときは、事前に必要なのを入れておけば～的な。

ちなみに、tm.asset.AssetManager は、Manager のインスタンスになってるので、get しかしてないなら、今まで通り(AssetManager)でも動くはず。

load と、regist を使ってる場所は、Loader への変更を～（インスタンス化してからね）

# まとめ

上記の AssetManager 周りを修正したら、ほぼテストが動き始めました。(80%くらい)
きっと、いろいろ変わってる部分は、あると思うのだけど、tmlib-rpg では、ほぼ影響無い感じ。たぶん 0.1.8 からだから？

福山の作った、自動テストは、キーボード操作を、tmlib.js の Keyborad クラスの setKey でエミュレートしてて、
このメソッドには、実はバグがあったらしく、修正されてます。で、そのコミットとマージしたバージョンで動かしてたのだけど
0.2.0 のリリースには、入ってなかったみたい。
エラーになったのは、その影響で、そのコミットをもう一度当てなおしたら、100%になりました。
Gitでpush漏れを防ぐ

ターミナルでGitを使っていると、時々push漏れする時がある。なので、pushしてないのがわかるように、プロンプトに表示してしまおう。

[Show Current Git Branch or Tag in Shell Prompt](http://kopepasah.com/tutorial/show-current-git-branch-or-tag-in-shell-prompt/)

上記の設定だとpush漏れしているかどうかわからないため、少々手を加える。
対象は **bash**

```bash
parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

parse_git_tag () {
  git describe --tags 2> /dev/null
}

if_modified () {
  git status -uall 2> /dev/null | grep -E "(modified|Untracked)" > /dev/null 2>&1
}
if_pushed () {
  git log origin/$1..$1 2> /dev/null | grep -E "commit" > /dev/null 2>&1
}

parse_git_branch_or_tag() {
  local BRANCH="$(parse_git_branch)"
  if [ "$BRANCH" = "" ]; then
    return 0;
  fi

  local OUT="($BRANCH)"
  if [ "$OUT" == " ((no branch))" ]; then
    OUT="($(parse_git_tag))";
  fi

  if_modified
  if [ $? -eq 0 ] ; then
    local MOD_MARK="*"
    OUT=$OUT$MOD_MARK
  fi

  if_pushed $BRANCH
  if [ $? -eq 0 ] ; then
    local NON_PUSH_MARK="  NOT YET PUSHED!!!"
    OUT=$OUT$NON_PUSH_MARK
  fi
  echo $OUT
}
```
~/.bash/git-promptに保管。

```bash
source ~/.bash/git-prompt
PS1="[\W\[\033[32m\]\$(parse_git_branch_or_tag)\[\033[0m\]] "
```

Push漏れがあると、NOT YET PUSHED!!!とでる。
Spring Batch:バッチ実行時の各種プレースホルダ

Spring Batchでは、バッチ実行時の各フェーズで使用できるプレースホルダがある。bean定義で設定することも、@Valueのアノテーションを使用して取得することも可能。

**注意点**

使用したいbean定義のスコープをSpringBatch拡張の **step** にする

**使用できるプレースホルダ**

| 記法                                | 説明 |
|:------------------------------------|:------------|
| #{stepExecutionContext[name]} | StepExectutionContextにセットされた値を参照する。主にStepListenerで値は設定される。Step内でのみ有効な値。 |
| #{jobExecutionContext[name]}  | JobExecutionContextにセットされた値を参照する。Jobを通じてStepをまたいで参照可能。JobExecutionContextはStepExectutionContextから参照可能。|
| #{jobParameters[name]}       |SpringBatch実行時に引数として渡された値を参照。|

**設定例**

```xml
 <bean id="..." class="..." scope="step">
        <property name="parent" ref="#{stepExecutionContext[helper]}" />
 </bean>

 <bean id="..." class="..." scope="step">
        <property name="name" value="#{stepExecutionContext['input.name']}" />
 </bean>

 <bean id="..." class="..." scope="step">
        <property name="name" value="#{jobParameters[input]}" />
 </bean>

 <bean id="..." class="..." scope="step">
        <property name="name" value="#{jobExecutionContext['input.stem']}.txt" />
 </bean>
```

**@Value使用例**

```java
	@Value("#{jobParameters['userId']}")
	public void setUserId(String userId) {
		this.userId = userId;
	}
```

@Valueを使うときは、context:annotation-config を忘れずに。

[参考](http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/scope/StepScope.html)
Spring Batch:Readerで読み込んだItemを読み飛ばしたいとき

ItemProcessorを実装して、processメソッドでnullを返すと、Writerに渡らないためスキップされる。

**実装例**

```java
public class SampleItemProcessor implements ItemProcessor<SampleEntity, SampleEntity> {
	
	/**
	 * 読み飛ばすかどうか
	 */
	@Override
	public SampleEntity process(SampleEntity item) throws Exception {
		if (item.isInvalid()) {
			return null;
		}
		return item;
	}
}
```

**設定例**

```xml
<batch:step id="sampleStep">
    <batch:tasklet >
        <batch:chunk writer="sampleWriter" reader="sampleReader" processor="sampleItemProcessor" commit-interval="1000" />
    </batch:tasklet>
</batch:step>
<bean id="sampleItemProcessor" class="jp.canetrash.sample.SampleItemProcessor"/>
```
Spring Batch:FlatFileItemWriterで一つのItemで複数行書き出したいとき

FlatFileItemWriterを使っていて、Writerに渡されるitem一つに対して複数行書き出したい時がある。
ItemのフィールドにあるListの要素の数だけ、書き出したい場合など。

自前で、LineAggregatorを実装して解決してみる。

**実装例**

```java
public class SampleEntity {
    private String id;
    private List<SampleDto> list;
    ....
}

public class SampleDto {
    private String skuCode;
    private String name;
    private String validFlag;
    ....
}

public class MultiLineAggregator implements LineAggregator<SampleEntity> {

	private static final String DEFAULT_LINE_SEPARATOR = System.getProperty("line.separator");
	
	@Override
	public String aggregate(SampleEntity item) {
		StringBuilder sb = new StringBuilder();
		for (SampleDto dto : item.getList().values()) {
			sb.append(item.getId()); // itemのフィールドを書き出し
			sb.append(DelimitedLineTokenizer.DELIMITER_TAB);
			sb.append(dto.getSkuCode());
			sb.append(DelimitedLineTokenizer.DELIMITER_TAB);
			sb.append(dto.getName());
			sb.append(DelimitedLineTokenizer.DELIMITER_TAB);
			sb.append(dto.getValidFlag());
			sb.append(DEFAULT_LINE_SEPARATOR);
		}
		return StringUtils.chomp(sb.toString()); // 最後の改行コードを削る
	}
}
```

**Spring Batchの設定例**

```xml
<bean id="couponSkuWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" value="file:${output.base.path}/${fileName}" />
    <property name="shouldDeleteIfEmpty" value="true"/>
    <property name="lineAggregator">
        <bean class="jp.canetrash.sample.batch.impl.transform.MultiLineAggregator" />
    </property>
</bean>
```
メモ：Docker 0.11.1 がリリースされたけど、

Docker 0.11.0 がリリースされたけど、互換性の問題が発生するので、サーバー側(boot2docker 等)もバージョンアップされるまで元に戻す。

```
Error: client and server don't have same version (client : 1.11, server: 1.10)
```

```
$ curl -O https://get.docker.com/builds/Darwin/x86_64/docker-0.10.0 
$ chmod +x docker-0.10.0
$ mv docker-0.10.0 /usr/local/bin/docker
```
Spring BatchのFlatFileItemReaderでタブ区切りファイルを読み込む時の設定

よく使われる、DelimitedLineTokenizerはデフォルトのデリミタがカンマになっている。それを、設定でタブに変更する。

```xml
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
    <property name="delimiter">
        <util:constant static-field="org.springframework.batch.item.file.transform.DelimitedLineTokenizer.DELIMITER_TAB"/>
    </property>
</bean>
```

上記の書き方だと、utilのネームスペース使うので、

xmlns:util="http://www.springframework.org/schema/util

を忘れずに。
HadoopのJob設定時のConfigurationの注意点

org.apache.hadoop.util.Toolなどを使って、Jobの設定をしている時の注意点。

```java
Job job = new Job(new Configuration(), "jobName");
job.getConfiguration().set("name", "value");
```
上記のコードだと、設定内容が反映されないため、Mapperや、Reducerからは設定した値が取れない。

```java
new Job
```
とする前に、Configurationに値を設定する。

```java
Configuration conf = new Configuration();
conf.set("name", "value");
Job job = new Job(conf, "jobName");
```

これで、context.getConfiguration().getStrings("name")で値がとれる。
crontabの書き方まとめ

### cronについて
設定した時間になったら定期的にコマンドを実行してくれる。

CakePHPなどのフレームワークでは、コマンドからプログラムを実行する仕組みがあるので
特定の日だけメールを配信するプログラムを実行、などが出来る。

### cron設定の確認

```
crontab -e 
```

### 設定の書き方
分 時 日 月 曜日 コマンド

```
1-59 分 
0-23 時
1-31 日
1-12 月
0-6 曜日（日曜日が0）
```

### 設定例

```
5 5 * * 2 
毎週火曜日の5時5分に実行

5 5 5 * *
毎月5日の5時5分に実行

10 0 * * * 
毎日 0時10分 

00 0-23/3 * * *  
3時間に1回 
```
TypeScript: デフォルト引数と Rest 引数

「デフォルト引数」と「Rest 引数」… TypeScript 1.0 でサポートされています(動作します)。

[ECMAScript6 Harmony機能まとめ](http://chikathreesix.com/?p=121) より引用

```text
Default Function parameters

今までありそうで無かった機能！　関数のデフォルト引数。
今までこいつが無いことで、いちいち関数の頭でa = a || 1とかやって初期化しなきゃいけなかった訳です。

function add(a, b = 1){
  return a + b;
}
console.log(add(2)); //3
```

同じく [ECMAScript6 Harmony機能まとめ](http://chikathreesix.com/?p=121) より引用 (let を var に修正しています)

```text
Rest Parameters

これまで可変長の引数をとる関数を定義することは多々ありましたが、argumentsを使って引数を判別していました。
rest parametersを使えば、残りの引数を一つの配列にまとめることが出来ます。

Rubyだと*（アスタリスク）を付けることで実現出来るアレです。

function sum(base, ...rest){
  for(var i = 0; i < rest.length; i++){
    base += rest[i];
  }
  return base;
}
console.log(sum(1, 2, 3, 4, 5)); //15
```
HaxeのAbstractで、暗黙の型変換でFizzBuzzした話

# HaxeのAbstractで、暗黙の型変換でFizzBuzzした

ぼんやり書いてみた。
思った以上に、さっさと書けた。

## HaxeのAbstractを説明しながら解説

### abstractのポイント

* 抽象クラスを定義している訳ではない。

* Abstractは型を定義している。

* @:from は任意の型から定義している型への型変換を書く。staticじゃないとダメらしい。

* @:to は@:fromの逆で、定義している型から任意の型への型変換を書く

### FizzBuzzTypeの説明

* @:fromでInt型からFizzBuzzTypeへの型変換を書く

* @:toでFizzBuzzTypeからString型への型変換を書く。このとき、FizzBuzzの分岐をさせる。

以上です。

```hx:FizzBuzz.hx

abstract FizzBuzzType(Int){
    inline function new(i:Int) this = i;

    @:from public static function fromInt(i:Int) 
        return new FizzBuzzType(i);

    @:to public function toString() : String
        return
        if( this % 15 == 0 ) "FizzBuzz"
            else if( this % 3 == 0 ) "Fizz"
                else if( this % 5 == 0 ) "Buzz"
                    else Std.string( this ); 
}

class FizzBuzz{
    public static function main(){
        for( i in 1...100 ){
            var fizzbuzz : FizzBuzzType = i;
            trace( fizzbuzz );
        }
    }

```


### JSにコンパイル したやつ。

ふつーに、型変換しているところに型変換の関数を埋め込んでいる感じ。

```js
(function () { "use strict";
var _FizzBuzz = {};
_FizzBuzz.FizzBuzzType_Impl_ = function() { };
_FizzBuzz.FizzBuzzType_Impl_._new = function(i) {
	return i;
};
_FizzBuzz.FizzBuzzType_Impl_.fromInt = function(i) {
	return i;
};
_FizzBuzz.FizzBuzzType_Impl_.toString = function(this1) {
	if(this1 % 15 == 0) return "FizzBuzz"; else if(this1 % 3 == 0) return "Fizz"; else if(this1 % 5 == 0) return "Buzz"; else if(this1 == null) return "null"; else return "" + this1;
};
var FizzBuzz = function() { };

FizzBuzz.main = function() {
	var _g = 1;
	while(_g < 100) {
		var i = _g++;
		var fizzbuzz = _FizzBuzz.FizzBuzzType_Impl_.fromInt(i);
		console.log(_FizzBuzz.FizzBuzzType_Impl_.toString(fizzbuzz));
	}
};
})();
```
WindowsでLessコンパイラを使う

[Less](http://lesscss.org/)のコンパイラlesscをWindows機(Windows 7)にインストールした際のメモです。

# おおまかな手順
1. Node.jsをインストールする
2. lesscをインストールする
3. コンパイルする

# 詳細な手順
## 1. Node.jsをインストールする
### 1.1 バージョン管理ツールnodistをインストールする
Node.jsはバージョンアップが頻繁なので、バージョン管理ツール[nodist](https://github.com/marcelklehr/nodist)を使ったほうが良いらしい、という[ブログ記事](http://nantokaworks.com/p1039/ "WindowsでNode.js(npm)触るならnodistを使うといいかもしれない")に従って入れてみた。単にインストールするだけなら、[公式サイト](http://nodejs.org/)のインストーラーで入れた方が早いのかもしれない。

GitHubからクローン。(あるいはZIPをDL、展開。)

```
> git clone git://github.com/marcelklehr/nodist.git
```

クローンしたものがnodistの実行ファイル一式となる。
`nodist\bin`にパスを通す。

パスが通っているのを確認。

```
> nodist -v
0.4.8
```

npmや依存ファイルを最新化するために下記を実行する。

```
> nodist update
```

### 1.2 nodistでnode.jsをインストールする
下記で安定版がインストールされる。

```
> nodist stable
```
確認してみる。

```
> node -v
v0.10.28
```

## 2. lesscをインストールする

```
> npm install -g less
```
npmはnode.jsのパッケージ管理ツール。オプション`-g`はnode.js環境でグローバルにパッケージをインストールするという意味。

## 3. コンパイルする

```
> lessc [入力ファイル(.less)] > [出力ファイル(.css)]
```

出力をminifyしたい場合は、`-x`あるいは`--clean-css`オプションを使う。

#参考
[WindowsでNode.js(npm)触るならnodistを使うといいかもしれない](http://nantokaworks.com/p1039/)
PECL Packageのつくりかた


だいたい公式のドキュメントに書いてあるんだけどメモ

## これを読む対象の方

* 自前でPHP拡張のラッパーを書いたりしてOSSとして出しててPECLにリストしたい、って人
* 会社でつくった拡張をPECLにしてOSSに還元したい、って人

たぶん限りなくすくないはず

## やり方

* 既存のpackage.xmlを参考にして手書きで書いてください
* pecl pacakgeコマンドでパッケージングする

公式には自動でpackage.xmlをよしなに作るツールはなかったりする。どうせ一回つくったらあとあんまり更新しないんでがんばりましょう。

## PECLに申請するには？

* http://pecl.php.net/account-request.php
* http://git.php.net/?p=php-src.git;a=blob_plain;f=CODING_STANDARDS;hb=HEAD

この2つよんでからMLに投げてみて。もちろん#php.pecl@erisに参加するのも忘れずに。

よさそうだったらkarma持ってる人がapproveするよ！って言ってくれるのでそうなったらアカウントの作成申請をすればOKです。

## 必要なもの

* ディレクトリ構成はリポジトリ直下にソースコードを置くようにしてください
* 各種ソースファイルのヘッダにはLICENSE表記を忘れずに
* LICENSEファイルも忘れないようにしてください
 * ライセンスはBSD系かPHPライセンスが好ましいです

## そのほか

リクエストがあればもうちょっとまともに書く。
個別に相談してくれてもおっけーです

## そういえばPyrusは？

まだreleaseされてないし、放置気味だったりするのでとりあえずパッケージングに関しては忘れよう
Angularjs(クライアントサイドMV*)が起こした変化

Angularjsを使い始めて、今までのjavascriptと変わったなと感じたところがあったので、それについて投稿します。

なお、私はBackbone.jsやEmberなどAngularjs以外のクライアントサイドMV*フレームワークに触れたことがありません。
そのため、この投稿はAngularjsと題していますが、他のフレームワークでも共通する項目は多いと思います。

#ビューとモデルの分離
まず、一番初めに感じたのがビューとモデルの分離についてです。
MV*フレームワーク(MVW)を名乗るように、Angularjsではビューとモデルを分離することに成功しています。

## 以前

MV*フレームワーク以前、変数の変更と同時にDOMの変更することが普通で、関数内で値を変更し、同時にjQueryのDOM操作を行うことが一般的でした。
しかし、この状態では、ビューを考慮した変数の管理が必要で、変数変化によるビューの動作変化を意識する必要がありました。
また、ビューと密接に関連付けられているため、HTMLの要素の位置が変更されるとjsも書き換える必要がありました。

![クラサバ.png](https://qiita-image-store.s3.amazonaws.com/0/14254/7cf571eb-b5da-8258-5fa0-082962477dfa.png "従来のビューとモデル")

## Angularjs以降

Angularjsではビューとモデルを分離し、ビューがモデルを参照し、モデルはビューを参照しない構造をしています。

具体的には、以下の機能を明示的に分離しています

+ ビュー: 参照するモデルの状態を基に変化する。
+ モデル(のようなもの): コントローラの指示を基に値を変更する。
+ コントローラ: ビュー・モデルから渡された情報を基に、ビュー・モデルへ指示を出す

このような処理を徹底することで、
モデルとビューのどちらかのみを変更することが可能です。
また、副次効果として値管理のみのテストが簡単です。(DIにより更に簡単になっています)

![MVフレームワーク.png](https://qiita-image-store.s3.amazonaws.com/0/14254/fab969f5-ee3f-ad5b-9884-f9e27a227606.png "MV*フレームワーク")

#データによるページ表示

Angularjsのおかげで、API構成がとてもやりやすくなりました。

## javascript初期

Ajaxが使用される前、サーバーサイドで作成されたマークアップ情報を受け取り、Webページはそれを表示する事が主な仕事でした。
javascriptはリンク先の変更や、フォーム送信時の内容チェックや補填、入力補完などに使われました。

## Ajax期

マークアップを含まないデータのみを取得し、ビューを変更する機会が出来ました。
サーバーサイドで作成されたマークアップを補填する動きが主でしたが、先進的な場所ではAPIサーバーを主としたWebページが作成されるようになりました。

## Angularjs以降

APIサーバーとAjaxにより静的ファイルを読み込んでからデータ部分の処理を行うことが簡単になりました。
モデルとビューの分離に伴い、以前よりも簡単に表示方法を操作することが出来るようになったのです。

![データによるページ表示.png](https://qiita-image-store.s3.amazonaws.com/0/14254/033a4e2a-f5f2-c974-4050-bf06546a6304.png "データと表示")

#ピラミッド型監視

Angularjsの登場により、クライアントの動きを監視することが容易になりました。
従来はユーザーがページ遷移のような大きな動きが無ければサーバー側はユーザーの動きを知ることが出来ませんでしたが、
Angularjsの登場により、
クライアントのコントローラがユーザーの挙動や時間のような小さな動きを監視し、それをサーバーに伝え、
サーバーのコントローラが、自身のデータの動作を制御しつつ、クライアントとの通信を基にクライアントの動きを把握できます。
そのため、サーバーのコントローラがサーバーとクライアント双方を制御することが可能になりました
(そのうち、クライアントがサーバーをコントロールするようになるかもしれません)

![階層監視.png](https://qiita-image-store.s3.amazonaws.com/0/14254/6b125c84-fbd2-78c6-a790-2f20226f03ae.png "ピラミッド型監視")


#まとめ

このように、Angularjsのおかげで、ビューとモデルの分離が簡単にでき、そこから派生してAPIや監視も簡単にできるようになりました。
まだ、Angularjsをバリバリに使えるわけではありませんが、とても良いものが出来たことをとてもありがたく思います。
Webページで更に多くのことが出来そうです。
MiddlemanでLessを使う


Gemfileファイルにless、therubyracerを追加して

```Gemfile
gem 'less'
gem 'therubyracer'
```

bundleインストール

```コンソール
bundle
```

あとは、ファイル名に.lessをつけるだけ

![Gemfile_-__supereigoWeb2__-_supereigoWeb2_-____Dropbox_develop_supereigoWeb2_.png](https://qiita-image-store.s3.amazonaws.com/0/41550/88cb2d4e-1143-872e-d3ac-e6b1cc5d55a4.png "Gemfile_-__supereigoWeb2__-_supereigoWeb2_-____Dropbox_develop_supereigoWeb2_.png")




## 参考にしたサイト
[Detecting LESS Changes with Middleman](
http://spin.atomicobject.com/2013/10/31/detecting-less-changes-middleman/)
remoteObjectで地理位置情報項目の値を取得する

remoteObjectだけの話ではありませんが、地理位置情報の項目は単純に『Location__c』というように指定しただけではエラーになってしまいます。

地理位置情報の項目の情報を取得するときは次のように緯度と経度を別々に取得します。

* Location__Latitude__s
* Location__Longitude__s

remoteObjectでもこの方法できちんと値を取得できました。

```
<apex:remoteObjectModel name="User" jsShorthand="User" fields="Id">
  <apex:remoteObjectField name="Location__Latitude__s" jsShorthand="Location__Latitude__s" />
  <apex:remoteObjectField name="Location__Longitude__s" jsShorthand="Location__Longitude__s" />
</apex:remoteObjectModel>
```

remoteObjectで取得した値をAngularJSをつかってで表示するときはこんな感じ。

```
{{user.Location__Latitude__s}},{{user.Location__Longitude__s}}
```
sedによる記号マッチング

```bash
sed -e 's/\([ ()]\|\[\|\]\)/\1/g')
```

[]はエスケープしたとしても[]の中に入れられないっぽい
つまり

```bash
sed -e 's/\([\[\]]\)/\1/g')
```

みたいなのはできない
なので[]のどっちかにマッチさせる、みたいなのは|を使って

```bash
sed -e 's/\(\[\|\]\)/\1/g')
```

とするみたい
zshのプロンプトに定時を教えてもらう

## 定時退社
定時になったらダッシュで帰りたい！！！！！
気づくと定時すぎてるなんてことは嫌だ！！！！
そうだ、定時になったらプロンプトに定時って表示しよう！！！！
![スクリーンショット 2014-05-07 23.31.57.png](https://qiita-image-store.s3.amazonaws.com/0/6717/5e3ef220-13fa-cf47-26c7-9b906c628a40.png)

## 表示させる
.zshrcとかに適当にこんなん書く

```zsh
PROMPT='%{${fg[cyan]}%}%n@%{${fg[green]}%}%~ %{${fg[yellow]}%}$(if [ $(date +"%k") -gt 19 ] ; then echo "定時だ帰るぞ!!!!"; fi) %{${fg[cyan]}%}    \$ %{${reset_color}%}'
```

重要なのはここだけ

```zsh
%{${fg[yellow]}%}$(if [ $(date +"%k") -gt 18 ] ; then echo "定時だ帰るぞ!!!!"; fi)
```
dateコマンドで時間見て、現在時刻が18以上だったら表示する(この例では19時が定時)

こんな感じになる
![スクリーンショット 2014-05-07 23.36.31.png](https://qiita-image-store.s3.amazonaws.com/0/6717/ea31bf44-25e4-f34f-a3a1-8dfe0df9038f.png)

## さいごに
もっといい感じにするのありそう
CLIでプログレスバーみたいのを出力する


コマンドラインのツールつくるときとかに、ダウンロード中の進捗をパーセントで表示したかったんだけど、表示をクリアして再描画する方法がわからなかったので調べた。

`\r`で現在の行をクリアできるらしい。<ins>追記：行のクリアじゃなかった。[コメント](http://qiita.com/hokaccha/items/3abd55aa23894b57ffd1#comment-00bb23380f8b3b7cc489)参照</ins>

rubyなら

```ruby
100.times do |num|
  print "working... #{num}%\r"
  sleep 0.05
  STDOUT.flush
end
```

Node.jsだと

```javascript
var i = 0;
setInterval(function() {
  process.stdout.write('working... ' + i + '%\r');
  i++;
  if (i === 100) process.exit();
}, 50);
```

こんな感じになる。

![fc9afe8ffc3baef7f2898a7f3d03f38b.gif](https://qiita-image-store.s3.amazonaws.com/0/12262/4bec2dfe-cd6f-3abc-2070-7f798eee7d3c.gif "fc9afe8ffc3baef7f2898a7f3d03f38b.gif")