OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7調査(12)<=>演算子の新設

PHP7から<=>という2項演算子が導入されます。他の言語では宇宙船演算子などと呼ばれることもありますね。

これは2値を==で比較して、等しければ0を、左の方が大きければ正値を、右の方が大きければ負値を返すような演算子です。strcmp()の==版だと考えるのが手っ取り早いでしょう。

この演算子を使えば、usort()に渡すソート関数が簡単に書けるようになります。RFCに載っているサンプルを紹介します。

```php
<?php
if (($handle = fopen("people.csv", "r")) !== FALSE) {
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
         $data[] = $row;
    }
    fclose($handle);
}
 
// Sort by last name:
usort($data, function ($left, $right) {
     return $left[1] <=> $right[1];
});
```

# 参照

* [PHP RFC: Combined Comparison (Spaceship) Operator](https://wiki.php.net/rfc/combined-comparison-operator)
コミットログにredmineのチケット番号(refs #XXX)が入っていないとコミットできないようにする。


##やりたいこと
コミットログにredmineのチケット番号(refs #XXX)が入っていないとコミットできないようにしたい。
→ client側のhookを強制的に設定したい。(主にpre-commit, commit-msg)

##手順
# 1 /.git/hooks/commit-msg
コミットメッセージのチェックを行うhookscriptのcommit-msgを使う。

```commit-msg.sh
#!/bin/sh

exec 2>&1

function redmine_err() {
	echo -e "\x1b[0;41m ERROR : please input tichet number..\x1b[0;49m";
	echo -e "  example : refs #[0-9]";
	exit 1
}

/bin/grep "refs #[0-9]" $1 > /dev/null || redmine_err;

exit 0
```

##課題
あくまでclient側のhookなので、複数人で開発を行っている場合は各人でhookを設定しなければならない。

うーむ。。。面倒くさい。

# 打開策1
今回の開発ではソースのbuildを行う際にshellを叩くので、そこに一手間加える。

1. gitの環境に.githooksという名前のディレクトリの下にhookscript(commit-msg, pre-commit)を登録しておく
2. 下記のシェルスクリプト(setup.sh)も.githooksの配下に一緒に登録しておく。
3. buildのシェルでsetup.shを叩いて.git/hooksに.githooks配下のスクリプトをシンボリックリンク。

```setup.sh
#!/bin/sh

GITHOOK_DIR=.git/hooks
COMMITMSG=${GITHOOK_DIR}/commit-msg
PRECOMMIT=${GITHOOK_DIR}/pre-commit

git config --list |/bin/grep "commit.template" > /dev/null || \
git config --local commit.template .githooks/git_commit_msg_template

#シンボリックリンクを設定
if [ ! -f .git/hooks/commit-msg ]; then
	echo "### Create symbolic linx ${COMMITMSG}"
	ln -s ../../.githooks/commit-msg ${COMMITMSG}
fi

if [ ! -f ${PRECOMMIT} ]; then
	echo "### Create symbolic linx ${PRECOMMIT}"
	ln -s ../../.githooks/pre-commit ${PRECOMMIT}
fi
```

```git_commit_msg_template
refs #
o 
```

# 所感
結局client側のhookをcloneした段階で強制的に設定する方法はわからなかった。。
今回たまたまbuild時にshellを叩くようにしていたためclient側(cloneした人)の意思に関係なく設定できたが、完全解決とは言えないので調査続行中٩(’ω’)و init.templatedirを強制するとか。。
\# あとperlとかruby、pythonとかでも書き直したい ♪(´ε｀ )
camunda の rest api を試してみた。

camunda の rest api を試してみた。
まずは ruby の rest_client で get だけ。
- https://gist.github.com/katoy/4b1578c17fb75803f7ed

基本的な呼び出しと response の取得は問題なく出来た。
次は、タスクの作成、承認処理を進める といったことができるかを試す。
PHP7調査(11)??演算子の新設

PHP7で2項演算子「??」が新設されます。左オペランドがnull以外の値であればその値を、そうでなければ右オペランドを返すようなものです。

```php
<?php
var_dump(null ?? false ?? true); // false
```

これはPHP 5.3で導入されたエルビス演算子「?:」と少し似ています。エルビス演算子は真偽の判断を行いますが、??演算子はnullかどうかの判断を行う点が異なっています。

```php
<?php
var_dump(null ?: false ?: true); // true
```

それだけでなく、??演算子はisset()と同様に未定義値をチェックしてもエラーになりません。これは非常に大きな違いで、??演算子があれば今までのisset()地獄から解放されるかもしれません。

```php
<?php
var_dump($arr["foo"] ?: "bar"); // 未定義だとUndefined variableかUndefined indexで怒られちゃう
var_dump(isset($arr["foo"]) ? $arr["foo"] : "bar"); // 結局こう書いてたよね…

var_dump($arr["foo"] ?? "bar"); // PHP7ではこれで動く！
```

# 参照

* [PHP RFC: Null Coalesce Operator](https://wiki.php.net/rfc/isset_ternary)
CoreGraphicsでRetina対応した画像を生成する

#概要
CoreGraphicsで画像を作るにあたり、Retinaディスプレイに対応したものを出力させます。

基本的には、

>スクリーンのスケール*1を元に、
スケール倍の縮尺で画像を生成、UIImage格納時にスケールを指定する。

>_*1 Retinaなら2.0_

と考えてください。

#UIGraphicsBeginImageContextの場合
概要のとおり、
サイズ定義でスケール倍し、UIImage格納時にスケールを指定しています。

```objc
// メインスクリーンのスケールを取得
float scale = [[UIScreen mainScreen] scale];
// 生成画像のサイズ定義（スケール倍する）
const CGSize ICON_SIZE = CGSizeMake(24 * scale, 24 * scale);
const CGRect ICON_RECT = CGRectMake(0, 0, 24 * scale, 24 * scale);

/* 中略 */

// コンテキストよりイメージ取得
CGImageRef imageRef = CGBitmapContextCreateImage(context);
// UIImageの取得（スケールを指定）
UIImage *image = [UIImage imageWithCGImage:imageRef
                                     scale:scale
                               orientation:UIImageOrientationUp];

```

#CGBitmapContextCreateの場合
コンテキスト開始を、`UIGraphicsBeginImageContext`ではなく`UIGraphicsBeginImageContextWithOptions`を用い、第3引数にスケールをセットします。

この一行だけで、自動的にスケール倍したイメージが生成され、UIImageへの格納もスケール指定は不要です。
また、第3引数が0なら、自動的にメインスクリーンのスケールが参照されます。

```objc
// 生成画像のサイズ定義（スケール倍は不要）
const CGSize ICON_SIZE = CGSizeMake(24, 24);

// コンテキストの開始（第3引数に0）
UIGraphicsBeginImageContextWithOptions(ICON_SIZE, NO, 0);

/* 中略 */

// 生成されたイメージの取得（スケール指定は不要）
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

```
トクヤマ試験

# 問題1 : 以下のRuby問題に取り組んでください。
(1)コインをn回振った時に、以下の例ようにn回分の表または裏を表示させるプログラムをつくってください。
例)コインを3回振ったときの出力結果
表 裏 裏

以下のような出力画面を出して下さい。
①
コインを投げる回数を決めてください
<!--(ここに回数を入力)-->

②出力画面
n回分の表または裏が出力される
<!--(ここに結果を出力)-->

###トクヤマ試験はまだまだ続きます。次は模擬質問に移ります。
jQueryMobileとmobile safariのキャッシュと初期化イベントではまった話


mobile safariでは、backボタンで戻るとキャッシュを無効にしても、キャッシュを使ってしまうことがあります。

httpヘッダの設定もダメ。

```
Cache-Control: no-cache,no-store
```

headタグの設定もダメ。

```
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache,no-store">    
<meta http-equiv="Expires" content="-1">
```

実際のところ、キャッシュされてもいいんです。

ページが表示されたことを補足できればjsでなんとかなるわけです。
jquery mobileでは、ページが表示されると、表示するページ(id=page)にpageshowイベントが発火されることになっています。これが使えると思ったら動きません。

```
$('#samplepage').on('pageshow', function() {
	// ページが表示されたよ。backでは呼ばれない
});

```

結局、jqmらしくなく、windowでフックすることで捕捉できました。

```
$(window).on('pageshow', function() {
	// ページが表示されたよ
});

```

今回は、jqmのdom管理を無効にしていたからよかったけど、dom管理を有効にしていると厄介なことになるかも。
XcodeのDocSetが最新版に更新できない場合の対応


Xcodeのメジャーバージョンアップ時にDocSetも更新できますが、何だか毎回高確率で失敗して最新にアクセス出来なくなりどうやって復帰させるんだっけかなって毎回調べ直しているような気がするのでその覚書。

環境: Xcode6.3

### DocSetのダウンロードはXcodeのPreference内から

	Xcode -> preference... -> Downloads -> Documentation

### XcodeでDocSetがダウンロードされているかの判定

	~/Library/Developer/Shared/Documentation/DocSets/Library/Receipts

### DocSetファイル

	~/Library/Developer/Shared/Documentation/DocSets

`Receipts`内のファイルを削除すれば`Xcode`から再ダウンロードすることができます。ただDocSetファイルが壊れているせいか再ダウンロードしてもアクセス出来ないこともある。その場合はDocSetファイルも削除して再ダウンロードすればよい。

[Dash](https://itunes.apple.com/jp/app/dash-api-docs-snippets/id458034879?mt=12)の`preference...`内の`Docsets`をRescanすると`~/Library/Developer/Shared/Documentation/DocSets`を見てくれてるっぽい。
ListPreferenceで設定してある内容を表示

androidの設定でListPreferenceは割りとよく使われていると思います。
でも「設定してある内容がダイアログを開かないと見えない」っていう微妙なところがありますよね。
summaryに、設定してある内容を表示するってのはよく見かけますが、設定の変更をListenerで監視したりめんどくさい処理が多いですし、ListPreferenceにsummaryとして書きたかった内容は書けなくなります。そこでsummaryは維持しつつ右側に内容を表示しちゃおう！って話です。

##実装##
まずはListPreferenceを継承したPreferenceを作ります。

```java:ParamReadableListPreference.java
public class ParamReadableListPreference extends ListPreference {

	@TargetApi(Build.VERSION_CODES.LOLLIPOP)
	public ParamReadableListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
		super(context, attrs, defStyleAttr, defStyleRes);
	}

	@TargetApi(Build.VERSION_CODES.LOLLIPOP)
	public ParamReadableListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}

	public ParamReadableListPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ParamReadableListPreference(Context context) {
		super(context);
	}

	@Override
	protected View onCreateView(ViewGroup parent) {
		setWidgetLayoutResource(R.layout.param_readable_list_preference);
		return super.onCreateView(parent);
	}

	@Override
	protected void onBindView(View view) {
		super.onBindView(view);
		TextView textView = (TextView)view.findViewById(R.id.valueView);
		textView.setText(getEntry());
	}
}
```

次にlayoutのxml  

```xml:param_readable_list_preference.xml
<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:textAppearance="?android:attr/textAppearanceSmall"
	android:layout_gravity="center"
	android:padding="16dip"
	android:id="@+id/valueView"/>
```

あとはPreferenceのxmlで

```xml
<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
	<ListPreference
		android:key="key"
		android:defaultValue="sample-value1"
		android:title="sample"
		android:summary="summary"
		android:entries="@array/sample"
		android:entryValues="@array/sample_value" />

	<com.sample.ParamReadableListPreference
		android:key="key"
		android:defaultValue="sample-value1"
		android:title="sample"
		android:summary="summary"
		android:entries="@array/sample"
		android:entryValues="@array/sample_value" />
</PreferenceScreen>
```
でこんなかんじに。
![Screenshot_2015-04-11-12-15-32.png](https://qiita-image-store.s3.amazonaws.com/0/74791/92bfd150-172c-35a9-9663-763925596d4b.png) ![Screenshot_2015-04-11-12-28-31.png](https://qiita-image-store.s3.amazonaws.com/0/74791/641c0abd-3635-ed96-25ad-6f3a7ac9f14a.png) ![Screenshot_2015-04-11-12-28-36.png](https://qiita-image-store.s3.amazonaws.com/0/74791/fedb1575-1c40-d77c-1349-8f81860591d8.png)

これで右側に設定内容が表示されます。
サマリーも表示出来ますし、コードもそれなりに綺麗にまとまりますし、表示もわりと綺麗です。

##最後に##
このサンプルの設定のxmlでは、keyを同値にしているのでListPreferenceの方の設定を変更すると、ParamReadableListPreference側の値の表示が変更されなければなりませんが、変更出来ません。ただしParamReadableListPreferenceで値を変更すれば表示も更新されますし、同じkeyを1つの画面で何度も使うような状況はそう無いので、そこまで細かい実装はしてありません。もし必要でしたらListenerをいい感じに実装する必要があるかと思います。
EmacsでPythonコードをPEP8に準じたコードへ自動整形


Pythonには、PEP8にという標準のコーディング規約があります。
この規約に準じてコーディングすると、コードのスタイルが統一され読み易くなります。
各エディターには、PEP8に準じたコードへ自動整形できる拡張ツールが大抵あります。

Emacsでは、py-autopep8を利用することで以下のように自動整形を実現できます。

![py-autopep8.gif](https://qiita-image-store.s3.amazonaws.com/0/37724/f86bc181-3c38-81db-0f46-5e6f7aa862f5.gif "py-autopep8.gif")

## py-autopep8に機能ついて

標準のpy-autopep8には以下の機能がありました。
- バッファ全体を自動整形
- 保存時にバッファ全体を自動整形

ただ上記機能だと、さわりたくないコードも自動整形されて
意図しないcommit履歴ができてしまうので
リジョン選択で自動整形できる機能をforkして追加しました。

## 導入方法

autopep8をインストール

```sh
$ pip install autopep8
```

以下から、py-autopep8.elを落してelispのload-path先へ配置

https://github.com/fujimisakari/py-autopep8.el/blob/master/py-autopep8.el

init.elへ追記

```el
(require 'py-autopep8)
(define-key python-mode-map (kbd "C-c F") 'py-autopep8)          ; バッファ全体のコード整形
(define-key python-mode-map (kbd "C-c f") 'py-autopep8-region)   ; 選択リジョン内のコード整形

;; 保存時にバッファ全体を自動整形する
(add-hook 'before-save-hook 'py-autopep8-before-save)
```
Golangのnet/httpで予期しない大きなサイズのリクエストを防御する

例えばファイルアップロード処理などでクライアントから予期しない大きなリクエストが送られてくると、サーバー側リソースを浪費させられてしまう。

net/httpパッケージのMaxBytesReader関数でリクエストのBodyをwrapしてやると、Readで制限サイズに達したらnon-EOF errorを返す様になる。

```go
func upload(c web.C, w http.ResponseWriter, r *http.Request) {
	r.Body = http.MaxBytesReader(w, r.Body, maxUploadSize)

	// 残りの処理
```

制限に達した際のerror文字列は`"http: request body too large"`

リクエストのContent-Lengthヘッダチェックと併用するのがいいかな。
Swift さくっと確認したい基礎文法 [タプル(Tuple)]



# タプル(tuple)

複数の値を一個の定数、または変数で扱えるようになる。
配列(Array)や辞書(Dictionary)と似た目的で使えるが、
タプルは値を追加、削除するなど値の個数を変えることができない。

```swift
let drink = ("coffee", 320)
var price = (240,360,1000)
```


## タプルの種類と取り出し方


### var 変数名 = (値1,値2,値3)
```swift
var price = (240,360,1000)

println(price.0) // 240
println(price.1) // 360
println(price.2) // 1000

```

### var 変数名 = (値1,値2,(値3,値4))

下記のように、タプルの中にタプルを入れることも可能です。

```swift
var price = (240,360,("hoge",350))

println(price.0) // 240
println(price.1) // 360
println(price.2) // (hoge,350)
println(price.2.0) // hoge

```

### (変数名,変数名) = (値1,値2)

```swift
var (price, product) = (320, "coffee")

println(price) // 320
println(product) // coffee

```

### var 変数名 = (ラベル：値1, ラベル:値2, ラベル:値3, ...)

```swift
var drink = (coffee:320, tea:240, latte:420)

println(drink.coffee) // 320
println(drink.tea) // 240
println(drink.latte) // 420

```

### var 変数名 : (ラベル：型, ラベル:型, ...)

型を指定したタプルを持つ変数drinkを宣言。

```swift
var drink : (name: String, price: Int)

drink.name = "coffee"
drink.price = 320

println(drink) // (coffee, 320)

```




## その他 

### 型の指定


```swift
let drink: (String, Int) = ("coffee", 320)
var price: (Int, Int, Int) = (240,360,1000)
```

タプルも型推論されるため、
下記の場合、エラーを起こす。
※(String, Int)に(String, Double)を代入しようしたため。


```swift
let drink = ("coffee", 320) // (String, Int)
drink = ("tea",200.0) // エラー (String, Double)
```

### ワイルドカードで不要な値を無視

下記のようにワイルドカード『_』を使うことで
不要な値は無視できる。

```swift
let status = (200, "OK")

let (code, _) = status
println(code)

let (_, message) = status
println(message)
```
``` 出力
"200"
"OK"
```
Swift さくっと確認したい基礎文法 [型推論,定数,変数]



## 変数

```swift
var a = "hoge" // String
var b = 1234   // Int
```

```objective-c
NSString a = @"hoge"; // NSString
NSInteger b = 1234; // NSInteger
```

Swiftは宣言時に設定された値によって
『型』を推論して決めてくれる。
なので基本的には、objective-cのように型を指定する必要がない。
これを **『型推論』**という。

### 型推論でのエラー
```swift
var id = 1234 // 型推論でIntに
id = "1234ABCD" // エラー
```
型推論でInt型になったidに
Stringを代入したため、エラーになる。


```swift
let tax = 0.08 // Double
var candy = 100 // Int
var count = 5 // Int
var price = candy * count * (1+tax) // エラー
```

DoubleとIntが混在しているため、
priceの型が決まらずエラーになる。


```swift
let tax = 0.08
var candy = 100
var count = 5
var price = Double(candy * count) * (1+tax)
var intPrice = Int(price)
```
この場合、上記の`Int(price)`ように型を変換してあげる。
型の変換のことを **キャスト**と呼ぶ。


## 定数

```swift
let constString = "hoge" // String
let constInt = 1234   // Integer 
```

```objective-c
#define CONST_STRING @"hoge"
// または
NSString * const constString = @"hoge";
```

後から変更できない定数は上のように書く。

## 型の指定

基本的には宣言時に型を指定しないが、
指定することもできる。

```swift
var a:String = "hoge"  // String
var b:Integer = 1234   // Integer 
```
vagrant upをバックグラウンドで実行する

#大枠の方針
PCであるソフトを開きながらも起動を待ちながら、別のソフトを開いて、そちらで作業をしている、というように、`vagrant`の起動時間も別のことをできるようにします。そのためにはバックグラウンドで起動させておく必要があり、その方法について書いていきます。

#フォアグラウンドジョブとは？

> LinuxやMac OS Xといったマルチタスク対応のOSにおいて、ユーザーが操作対象にできるジョブを「フォアグラウンド・ジョブ」といいます

まさにいま私はchromeを開いてQiitaでこの記事を書いているのですが、この場合フォアグラウンドジョブはchromeということになります。

![スクリーンショット 2015-04-11 10.36.46.png](https://qiita-image-store.s3.amazonaws.com/0/34879/9659dded-e4ff-2805-e578-96f9b45d5c68.png)


#バックグラウンドジョブとは？

> 一方，操作対象になっていませんが、処理を継続しているジョブを「バックグラウンド・ジョブ」といいます。

chrome以外にもterminalやsublimeText、evernoteなどを開いていますが、こちらは私の操作対象になっておりませんので、バックグラウンドジョブということになります。

![スクリーンショット 2015-04-11 10.36.17.png](https://qiita-image-store.s3.amazonaws.com/0/34879/177a2636-06a0-c9fe-e258-f20f149377ca.png)

#linuxでやってみる
上記の説明はMac OS上でGUIだったので非常に直感的だったかと思いますが、Linux OSでやっていることも全く一緒です。
vimコマンドを実行してvimのバージョン情報を表示させる例をやってみます。

##フォアグラウンドでvimのバージョン情報を表示させる
単に`vim`と打ち込めばvimのバージョン情報が確認できます。

```linux
[yusuke@Yusukes-MBP myLocalEnvironment]$ vim
```

![スクリーンショット 2015-04-11 11.12.01.png](https://qiita-image-store.s3.amazonaws.com/0/34879/e90c1696-dca0-1cb4-0186-bbbe61243256.png)

簡単ですね。

##バックグラウンドでvimのバージョン情報を表示するジョブを実行する

バックグラウンドで実行するためにはコマンドの最後に`&`をつけます。

```linux
[yusuke@Yusukes-MBP myLocalEnvironment]$ vim &
```

![スクリーンショット 2015-04-11 11.12.11.png](https://qiita-image-store.s3.amazonaws.com/0/34879/fe10aede-411a-59c1-a1f8-5b0cfd62a54e.png)

そうすると上の画像のように処理がバックグラウンドに周り、すぐに次の入力が可能な状況になっています。バックグラウンドにあるジョブをフォアグラウンドに持ってくるためには`fg`コマンドを使います。

```linux
[yusuke@Yusukes-MBP myLocalEnvironment]$ fg 2
```

![スクリーンショット 2015-04-11 11.12.34.png](https://qiita-image-store.s3.amazonaws.com/0/34879/c0d2c31a-5ce9-b52e-9cda-308df8dc4fb1.png)

これで確認することが出来ました。

# 標準出力を伴うジョブ
`vagrant up`のような標準出力を伴うジョブはバックグラウンドで起動させていても、出力が表示されてしまいます。

```linux
[yusuke@Yusukes-MBP myLocalEnvironment]$ vagrant up &
```

![スクリーンショット 2015-04-11 11.43.55.png](https://qiita-image-store.s3.amazonaws.com/0/34879/02916e59-c548-e996-7d76-7df8beaed252.png)

この場合は出力先を標準出力から別のファイルへリダイレクトさせなくてはいけません。適当なファイルを作ってそちらへ出力させてもいいのですが、それだと起動するたびにファイルに書き込みがなされていって、無駄に容量を食うことになってしまいます。このようなときのために、いくら書き込んでも、書き込まれたデータを全て捨ててしまうスペシャルファイルのnullデバイスというものが存在します。

> /dev/null（nullデバイスとも呼ばれる）は、Unix系オペレーティングシステムにおけるスペシャルファイルの1つで、そこに書き込まれたデータを全て捨て（write システムコールは成功する）、読み出してもどんなプロセスに対してもデータを返さない（EOFを返す）。DOSやWindowsではこれとほぼ同等な機能を提供するNULデバイス[1]がある。

ですので、今回は下記のように起動してやるとバックグラウンドで正常に処理が実行されます。

```linux
[yusuke@Yusukes-MBP myLocalEnvironment]$ vagrant up > /dev/null &
```

![スクリーンショット 2015-04-11 11.50.27.png](https://qiita-image-store.s3.amazonaws.com/0/34879/a920ed05-8fa4-10ef-aa16-7b810e3167da.png)

上の画像のように起動中のすぐに他の作業に移れるようになっています。また実際に作業していても終了時にはしっかりアラートしてくれます。

![スクリーンショット 2015-04-11 11.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/34879/e69d9029-f61e-701e-f398-415dad180f5b.png)



#コマンド一覧
バックグラウンドやフォアグラウンド関連でよく使うコマンドは下記です。

|コマンド  |内容
|---|---|
|&|コマンドに&をつけることでバックグラウンドで実行する|
|jobs|バックグラウンドで実行しているジョブの一覧|
|fg [ジョブ指定]|ジョブをフォアグラウンドに持ってくる|
|bg [ジョブ指定]|一時停止中のジョブをバックグラウンドで実行する|
|ctrl+Z|フォアグラウンド中のジョブを一時中断する|
|ctrl+C|フォアグラウンド中のジョブを終了する|
|kill [ジョブ指定]|ジョブを強制終了させる|
PHP7調査(10)名前空間のuseをまとめて書けるようになった

PHP7から、名前空間を使うときに複数のuseを中カッコでまとめて書くことができます。

具体的には次のように書けるようになりました。

```php
<?php
use Symfony\Component\Console\{
    Input\InputInterface,
    Input\InputArgument,
    Input\InputOption,
    Output\OutputInterface,
    Output\ConsoleOutputInterface
};
```

これまで、特に大物ライブラリを使うときにuseが長大になる傾向があったので、これは良い変更ですね。

ちなみに中カッコのネストはできません。

# 参照

* [PHP RFC: Group Use Declarations](https://wiki.php.net/rfc/group_use_declarations)
地理空間表現主義宣言 Geospatial Expressionism Manifesto 


## 経緯
2015年4月に「「納品」をなくせばうまくいく」を読んでいくなかで 161 ページに「アジャイルソフトウェア開発宣言」を改めて見たことと、地理空間情報を扱うにあたって、データをRDBMSに取り込むところに労力を消耗してしまう現実を改めて認識したこと、RDBMS取り込みのスキル習得のためにウェブ地図ライブラリーのスキル習得が後回しになっているような状況が見られたことから、つまり地理空間情報の表現を最初に考えて、そこからさかのぼる形でスキル体系を構築し、実践を進めていくべきであると考え、「表現主義」と「未来派宣言」と「アジャイルソフトウェア開発宣言」の意匠を借りて、このような考え方が広がることを支えたいと思い、次のような案文をまとめてみた。

## 地理空間表現主義宣言 Geospatial Expressionism Manifesto（案文）
私たちは、ウェブ時代の地理空間情報の提供と活用の実践あるいは実践を手助けする活動を通じて、地理空間情報のよりよい提供と活用の方法を見つけ出そうとしている。この活動を通して、私達は以下の価値に至った。

システムの構成や構造の特定よりも　具体的な活用の目的の特定を
データの設計や構造よりも　具体的な活用におけるデータの表現を
データのストア技術よりも　データのトランスファーと表現の技術を
計画を定めてそれに従うよりも　技術の進化への対応を
インプットよりも　アウトプットを
SQLよりも　JavaScriptを

価値とする。すなわち、左記のことがらに価値があることを認めながらも、私たちは右記のことがらにより価値をおく。

## 署名者募集
「アジャイルソフトウェア開発宣言」では、宣言の下に署名者が続く。署名者を募集したい。また、案文の修正提案も歓迎したい。

## HISWIP シンドローム
地理空間方面では、"Here is the solution, what is the probmem?" といったことがある、という言い回しがされることがあった。これは、表現主義が治癒したい問題である。このことを短く表現するために、「HISWIPシンドローム」という言葉を作ってみよう。つまり、個別の問題をあまり見ることなく、汎用だが実際には適用がむずかしいソリューションを考え作ってしまうことを指すことばである。

## See Also
###Manifesto for Agile Software Development
http://agilemanifesto.org
http://agilemanifesto.org/iso/ja/

### Expressionism, especially der Blaue Reiter
http://ja.wikipedia.org/wiki/表現主義
http://ja.wikipedia.org/wiki/青騎士

###Futurist Manifesto, or Manifesto del futurismo
http://ja.wikipedia.org/wiki/未来派宣言
Berkshelfを使ってvagrant環境に、MySQL5.5を入れる


**Berkshelf は、chef-DKで入れることを推奨**

## Berkshelf って何?

- Cookbookの管理をする
- Cookbookの依存関係を管理する

良くCookbookのgemとか言われる

## 作業用ディレクトリ作成

```sh-session
mkdir mysql_server
```

## 初手

```sh-session
vagrant init
vim Vagrantfile
```

```Vagrantfile
Vagrant.configure(2) do |config|
  config.omnibus.chef_version = :latest
  config.vm.box = "chef/centos-7.0"
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = './chef-repo/cookbooks' # ここに、Berkshelfで生成される Cookbook が置かれる
    chef.add_recipe 'setup_mysql'
  end
end
```

## インストール用のレシピを作成

```sh-session
knife cookbook create setup_mysql -o cookbooks/
cd cookbooks/setup_mysql
```

ここの内容に従い、Berkshelfで落としてきたMySQLのcookbook を使って、MySQLをインストールするためのレシピを作成

- [mysql Cookbook - Chef Supermarket](https://supermarket.chef.io/cookbooks/mysql#readme)

```metadata.rb
name             'setup_mysql'
maintainer       'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures setup_mysql'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'
depends          'mysql'
```

```recipes/default.rb
#
# Cookbook Name:: setup_mysql
# Recipe:: default
#
# Copyright 2015, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
mysql_service 'default' do
  version '5.5'
  initial_root_password ''
  action [:create, :start]
end

mysql_client 'default' do
  action :create
end
```

## Berkshelf作業用ディレクトリを生成

```sh-session
mkdir chef-repo/
cd chef-repo
vim Berksfile
```

### Berksfile に必要なCookbookを列挙

```Berksfile
source "https://supermarket.chef.io"
cookbook 'mysql' # supermarket.chef.io から取得
cookbook 'setup_mysql', path: '../cookbooks/setup_mysql' # 自前のcookbook(MySQLインストール用)
```

### Berkshelfの情報を元にcookbookを生成

```sh-session
berks vendor cookbooks
```

## サーバ起動 & provision

```sh-session
vagrant up
```

## 動作確認

```sh-session
vagrant ssh
mysql -u root
```

## 参考

- [mysql Cookbook - Chef Supermarket](https://supermarket.chef.io/cookbooks/mysql#readme)
- [Chef memo4 - Qiita](http://qiita.com/watanayu19700101/items/5305d737116040e5d5dd)
R による分析環境構築 (RStudio Server)

# はじめに
今回は R でアドホックなデータ分析を行うための環境を仮想環境上に構築する。
開発・分析環境に RStudio Server を利用する。

インストール先のマシンとして、今回は VirtualBox + Vagrant を利用した仮想環境を利用する。

# 作業環境
今回は以下の環境で行った。

MacBookPro Retina 13 (Late 2013)
OSX Yosemite
CPU: Core i5 2.6GHz
メモリ: 16GB
仮想環境のOSとして、Debian 7.6.0 (64bit)を選択した。

# インストール
VirtualBox と Vagrant のインストールまでは
[Python (IPython notebook + Pandas) によるデータ分析環境構築](http://qiita.com/Salinger/items/6ff05a572c7ba9531275)と同様の手順でOK。
仮想マシンにログインできたところからスタートする。

下記コマンドを実行していく。

```
$ sudo apt-get -y install r-base
$ sudo apt-get -y install gdebi-core
$ wget http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl0.9.8_0.9.8o-4squeeze14_amd64.deb
$ sudo dpkg -i libssl0.9.8_0.9.8o-4squeeze14_amd64.deb
$ wget http://download2.rstudio.org/rstudio-server-0.98.1103-amd64.deb
$ sudo gdebi rstudio-server-0.98.1103-amd64.deb
Reading package lists... Done
Building dependency tree        
Reading state information... Done
Building data structures... Done 
Building data structures... Done 


RStudio Server
 RStudio is a set of integrated tools designed to help you be more productive with R. It includes a console, syntax-highlighting editor that supports direct code execution, as well as tools for plotting, history, and workspace management.
Do you want to install the software package? [y/N]:y
...
```

これで必要なパッケージのインストールは完了。

※ libssl0.9.8 は 1.0.0 がインストール済みでも依存関係が出たため、別途このバージョンをインストールした。

# 設定作業
まず、 RStudio Server で作業するためのユーザーを作成する。下記コマンドを実行する。
パスワード以外は空欄のまま Enter で OK 。

```
$ sudo adduser rstudio
Adding user `rstudio' ...
Adding new group `rstudio' (1001) ...
Adding new user `rstudio' (1001) with group `rstudio' ...
Creating home directory `/home/rstudio' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for rstudio
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] 
```


ローカルマシンのブラウザから [http://192.168.20.10:8787](http://192.168.20.10:8787) にアクセスすると、次の画面が見える。


![Kobito.RqyAAN.png](https://qiita-image-store.s3.amazonaws.com/0/58390/ad95ea60-744a-b986-64e0-e86ac9a4aafe.png "Kobito.RqyAAN.png")

ここで先ほど登録した rstudio ユーザー(と設定したパス)でログインする。

![Kobito.aljJa7.png](https://qiita-image-store.s3.amazonaws.com/0/58390/1e54103d-6350-7dc4-91d8-70a80d1015fa.png "Kobito.aljJa7.png")

これで、RStudio Server による分析環境が構築できた。


# 参考文献
* [RStudio 公式](http://www.rstudio.com)
* [RStudio Server インストール方法](http://www.rstudio.com/products/rstudio/download-server/)
* [Python (IPython notebook + Pandas) によるデータ分析環境構築](http://qiita.com/Salinger/items/6ff05a572c7ba9531275)
PHP7調査(9)整数で除算する関数intdivの新設

整数同士の剰余を求める演算子「%」があるのに、それに対応する除算がPHPだとできない！ということでPHP7からintdiv()関数ができました。

```php
<?php
printf("13÷4 = %dあまり%d\n", intdiv(13,4), 13%4);
```

提案者はできれば演算子にしたかったようですが、投票で却下されてしまいました。

# 参照

* [PHP RFC: intdiv()](https://wiki.php.net/rfc/intdiv)
atom-shellでWebサイトのスクリーンショットを撮る

atom-shell v0.22.3で、マニュアルを見ながら、Webサイトのスクリーンショットを撮ろうと思ったのですが、マニュアルがまだ更新されてないらしく、エラーになったので調査して修正したサンプルを作ってみました。

# 正しく動くサンプル

```js
// 変数などの宣言
var TARGET_URL = "https://atom.io";

// モジュールの取り込み
var app = require('app');
var BrowserWindow = require('browser-window');
var fs = require('fs');

// メインウインドウを起動
var win = null;
app.on('ready', function(){
  win = new BrowserWindow({width:1024, height:800});
  win.loadUrl(TARGET_URL);
  // ページがロード完了したらキャプチャする
  win.webContents.on('did-finish-load',capture);
});
// キャプチャ処理
function capture() {
  win.capturePage(function(img) {
    console.log(img);
    fs.writeFileSync('screenshot.png', img.toPng());
  });
}
```

ちなみに、動かなかったのはマニュアルの「remote.md」の中の、スクリーンキャプチャを撮るサンプルでした。（2015/04/11時点））

https://github.com/atom/atom-shell/blob/master/docs/api/remote.md

原因は、capturePageのコールバック関数の引数が、NativeImageになったからでした。toPng()メソッドで、PNGデータを返す必要があります。
vim で csv を編集する試み


エクセルのでセルの入力中にesc押すと入力が全部キャンセルされるのつらい。

vimでcsvを編集する試み。

```.vimrc
nnoremap tl f,l       "右セルに移動
nnoremap th F,h       "左セルに移動
nnoremap td F,lvf,hd  "セル内削除
nnoremap ts F,lvf,hc  "セル内削除してインサートモード
nnoremap ty F,lvf,hy  "セル内コピー
nnoremap tp F,lvf,hp  "セル内にペースト
```

あんまり便利じゃなかった。
ブラウザ間のメソッドやプロパティの違いを三項演算子を使って吸収する

leafletのサンプルコードを読んでて知った方法。

ブラウザによってinnerTextだったりtextContentだったりを使い分けないといけない時に三項演算子を使ってプロパティやメソッドの違いを吸収する

```js
var textarea = document.querySelector("textarea");
textarea["innerText" in textarea ? "innerText" : "textContent" ] = "text";
```

input要素のoninputとonchangeの違いなんかもこれで行けるらしい。

```js
var input = document.querySelector("input");
input['oninput' in input ? 'oninput' : 'onchange'] = function(){
	console.log(this.value);
};
```
PHP7調査(8)16進数が数値文字列として扱われなくなる

PHP7から16進文字列が数値文字列として扱われなくなります。これにより、==の挙動が変わったりします。

```php
<?php
var_dump("0x10"=="16"); // PHP5: true, PHP7: false
var_dump(is_numeric("0x10")); // PHP5: true, PHP7: false
```

もともと誰も得しない仕様だったので、「今さら変えるなよ！」ってこと以外は特に問題ないように思います。

ちなみに、「1.2e3」のような浮動小数点数の指数表記は今まで通り数値文字列とみなされます。片手落ちな気もしますね…。

# 参照

* [PHP RFC: Remove hex support in numeric strings](https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings)
PHP7調査(7)64bit環境における整数型のサイズ調整

64bit Linux環境で64bitバイナリのPHP5を利用した場合、整数型は64bitになります。一方、64bit Windows環境ではPHP5の整数型は32bitになっていました。これは、過去経緯からPHPの整数型がCのlong型に対応していたためです。

PHP7では、このサイズを統一することになりました。64bit OSで64bitバイナリを使っていれば、PHPの整数型はWindowsでもLinuxでも常に64bitになります。

文字列の最大長もこれまで環境によってバラバラでしたが、これも64bit環境であれば64bitに統一されました。

# 参考

* [PHP RFC: 64 bit platform improvements for string length and integer in zval](https://wiki.php.net/rfc/size_t_and_int64_next)
Clojure/Javaでショートカットキー（Global Hotkey）を作る

Clojure/Javaでお手軽にGlobal Hotkey（フォーカスなくても動くショートカットキー）を作るには[JKeyMaster](https://github.com/tulskiy/jkeymaster)が便利です。

※ClojureでラップしたKeymaster-cljもありますが、バージョン0.1.0だとバグっててresetしたときにハングします

JavaのサンプルはJKeyMasterのページにあるのでClojureのサンプルを作ってみます。
依存設定は`[com.github.tulskiy/jkeymaster "1.1"]`です。

```hotkey.clj
(ns hotkey.sample
  (:import [com.tulskiy.keymaster.common Provider HotKeyListener]
           [javax.swing KeyStroke]))

(def provider (atom nil))

(defn- get-arity [f]
  (let [^java.lang.reflect.Method m (-> f class .getDeclaredMethods first)]
    (count (.getParameterTypes m))))

(defn- ^HotKeyListener make-listener [f]
  (reify HotKeyListener
    (onHotKey [this hotKey] (apply f (take (get-arity f) [hotKey])))))

(defn register [^String key-code f]
  (when (nil? @provider)
    (reset! provider (Provider/getCurrentProvider true)))
  (let [^Provider p @provider]
    (.register p (KeyStroke/getKeyStroke key-code) (make-listener f))))

(defn reset []
  (when-let [^Provider p @provider]
    (.reset p)
    (.stop p)
    (reset! provider nil)))
```

これを使うと`(register "ctrl shift 1" #(println %))`のようにしてキーが登録できます。
※`get-arity`で関数の引数の数を算出しているのは引数が0個の関数と1個の（hotKeyが渡される）関数の両方を使えるようにするためです。

使えるキーは[javax.swing.KeyStroke](http://docs.oracle.com/javase/jp/8/docs/api/javax/swing/KeyStroke.html)を見るとわかります。
shift | control | ctrl | meta | alt | altGraph と[KeyEvent](http://docs.oracle.com/javase/jp/8/docs/api/java/awt/event/KeyEvent.html)の`VK_*`の組み合わせなどができます。

クリップボードを取得するプログラムと組み合わせるといろんな作業の定型化で楽できそうな予感がします。
Riot 2.0 のホームページを読んでみる

https://muut.com/riotjs/ 
軽量JavaScript UIライブラリらしいRiotのバージョン２を試していきます。3.5KBでReactのようなユーザインターフェースが提供できるらしいです。まずはRiotのホームページを読んで、どのようなものか理解していきましょう。

# Why Riot?
そしてなぜ新しいUIライブラリが必要なのか
##1. Custom tags
RiotはIE８は始めとする全てのブラウザにカスタムタグを提供します。

```
<todo>

  <!-- layout -->
  <h3>{ opts.title }</h3>

  <ul>
    <li each={ item, i in items }>{ item }</li>
  </ul>

  <form onsubmit={ add }>
    <input>
    <button>Add #{ items.length + 1 }</button>
  </form>

  <!-- logic -->
  <script>
    this.items = []

    add(e) {
      var input = e.target[0]
      this.items.push(input.value)
      input.value = ''
    }
  </script>

</todo>
```

カスタムタグはHTMLとJavaScriptを関連付け、再利用可能なコンポーネントを提供します。React + Polymer よりもより楽しくより学びやすくなっています。

###Human-readable
カスタムタグは高度なビューを提供します。実際のコードは次のようになるでしょう。

```
<body>

  <h1>Acme community</h1>

  <forum-header/>

  <forum-content>
    <forum-threads/>
    <forum-sidebar/>
  </forum-content>

  <forum-footer/>

  <script>riot.mount('*', { api: forum_api })</script>
</body>
```

HTMLは、事実上、Webの共通言語であり、UIを構築するためにデザインされています。そのシンタックスは皆が熟知しており、また言語レベルでネストを許容し、さらにオプションをタグの属性として、カスタムタグにわかりやすい形で提供できます。
Note：カスタムタグは表示される前にJavaScriptに変換されます。

###Virtual DOM
* 更新するDOMの量を可能な限り少なくします
* 単方向フロー：親から子への単方向で更新は伝播されます
* ハイパフォーマンスのために、カスタムタグは事前にコンパイルされ、キャッシュされます。
* よりコントロールするためにライフサイクルイベントが提供されます
* カスタムタグはサーバサイドでレンダリングされます

###Close to standards
* 固有のイベントシステムはありません
* IE8用にイベントは標準化されます
* レンダー後のDOMはその他のライブラリで操作可能です
* レンダー後のDOMはオリジナルなタグやdata-属性などは使いません
* jQueryと共存できます

##Use your favorite tools
*  CoffeeScript, Jade, Typescript, LiveScript, ES6 そのほか好きな言語でカスタムタグを記述できます
*  NPM, CommonJS, AMD, Bower そのほか好きなツールでインテグレートできます
*   Gulp, Grunt, Browserify pluginでビルドできます

#2. Simple and minimalistic
他とかけ離れてRiotは小さい
##1. Enjoyable syntax
可能な限り小さなタグでパワフルな機能を提供するのがゴールの１つです
* ショートカット：`class={ enabled: is_enabled, hidden: hasErrors() }`
* renderなど余計なことに気を使わない
* 内記法: Add #{ items.length + 1 } or class="item { selected: flag }"
* scriptタグは必要ないなら使わない
* コンパクトなES6のメソッドシンタックス

##2. Small learning curve
RiotはAPIが他より１０から１００程度少ない
1. 学ぶことが少ない
2. Riot固有のことが少ない

##3. Tiny size
react.min.js – 127KB
polymer.min.js – 120KB
riot.min.js – 6.7KB
1. バグが少なくなる
2. パースが早くダウンロードも安価
3. 埋め込み可能。ライブラリはアプリケーションより小さいべきである。
4. メンテナンスが容易。実際、我々は小チームだ。

#4. Small, but complete
近代的なクライアントサイトアプリケーションのための機能を全て備えている
* UIを構築するための”反応的”なビュー
* モジュール化のためのイベントライブラリ
* URLとバックボタンをケアできるルータ

Riotはオープンスタックであり、特定のフレームワークのイディオムを回避したいユーザのためにあることを意味します。一般的なツールを使い、デザインパターンを適応できます。Facebook Fluxのようなシステムを自分で作れるのです。

#Conclusion
Riotは軽量なReact + Polymer + models + routingです。現状ではIE8ですら動きます。死ぬほど簡単で重さもほとんどありません。車輪の再発明ではなく、いいとこどりのよりシンプルなツールです。
> “Templates separate technologies, not concerns.”

関連するロジックとレイアウトを同じコンポーネントで定義することでシステム全体がわかりやすくなります。我々はReactのこの考えを尊重します。

以上になります。次回は実際にRiotを使いたいと思います。
次回：[Compiler編](http://qiita.com/kazusa-qooq/items/e1f3ca2990b3aed0e300)
自作の[Getting Started](http://qiita.com/kazusa-qooq/items/935ce99c5f0a7a8ca2c2)
PHP7調査(6)文字列中にコードポイントでUTF-8の1文字を書けるようになった

PHP7では文字列中にUnicodeコードポイントでUTF-8の1文字を記述することができます。

Unicodeコードポイントというのは、Unicodeの文字1文字に対して割り当てられている16進数のことです。たとえば全角空白であれば「U+3000」のように表記されているのを見ると思いますし、[unicode.org](http://unicode.org/charts/)のPDFでもおなじみですね。

たとえば、U+301CとU+FF5Eの2文字が次のように表現できます。

```php
<?php
$wave_dash="\u{301c}";
var_dump($wave_dash); // string(3) "〜"
$fullwidth_tilde="\u{ff5e}";
var_dump($fullwidth_tilde); // string(3) "～"
```

PHP5で同じことを書こうと思うと「\x??」のスタイルで3バイト記述するしか無かったのが、PHP7では読みやすく書けてステキですね。

# ちなみに

* 中カッコは必須です
* 絵文字などBMP外の文字（U+10000以降）にも対応しています
* mbstringとは無関係な実装なので、mbstringの設定がどうであろうとUTF-8の1文字（1バイトから4バイト）になります。

# 参考

* [PHP RFC: Unicode Codepoint Escape Syntax](https://wiki.php.net/rfc/unicode_escape)
swiftからJASidePanelsでMenu作成


JASidePanelsで表示したtableViewをMenuにするとして、選択したCellからの遷移の実装を知る。
仕事でios開発できないのでせっかく作ったけど忘れやすいのでメモ

https://github.com/picopicorobot/JASidePanels_Menu_Sample

## 前提
* cocoapodsはinstall済
* xcode6.2
* swift使う
* swiftでcocoaPodsのライブラリJASidePanels使ってみる

## 手順
### JASidePanelsインストール
* 新規プロジェクト作成：JASidePanels_Menu_Sample
* Podfile新規作成

```Dir
.
├── JASidePanels_Menu_Sample
├── JASidePanels_Menu_Sample.xcodeproj
├── JASidePanels_Menu_SampleTests
└── Podfile
```

```Podfile
pod 'JASidePanels'
```

```
$ pod install
```
![install.png](https://qiita-image-store.s3.amazonaws.com/0/32138/89cdf90d-be99-c62f-8594-f9453f804d27.png "install.png")



インストール後に開くプロジェクトは.xcworkspaceになる

### Bridging-Headerを作る
これしないとswiftでcocoaPodsのライブラリが使えない

* JASidePanels_Menu_Sample.xcworkspaceでプロジェクトを起動

以下ページを参考にBridging-Headerを作る
http://qiita.com/tamanyan/items/201bdd8063452d620a66

```JASidePanels_Menu_Sample-Briding-Header.h
#import "JASidePanelController.h"
#import "UIViewController+JASidePanel.h"
```

### sidePanelの実装

メニューから遷移するのは３画面。
表示するcenterViewController1〜3はStoryboad上でNavigetionControllerを３つ作ってそれぞれのStoryboad IDをcenterViewController1〜3にしたもの。
色分けしてわかりやすくしている。

#### JASidePanelControllerを親クラスにMySidePanelControllerViewControllerを作成

```MySidePanelControllerViewController
override func awakeFromNib() {
	self.leftPanel = self.storyboard?.instantiateViewControllerWithIdentifier("MenuViewController") as UIViewController
	self.centerPanel = self.storyboard?.instantiateViewControllerWithIdentifier("centerViewController1") as UIViewController
    }
```

#### menu部分
UITableViewControllerで作った。
Cellを押下して表示するコントローラー部分は以下のような感じで出し分ける。


```MenuViewController

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    switch indexPath.row {
    case 0:
        self.sidePanelController.centerPanel = self.storyboard?.instantiateViewControllerWithIdentifier("centerViewController1") as UIViewController
        break
    case 1:
        self.sidePanelController.centerPanel = self.storyboard?.instantiateViewControllerWithIdentifier("centerViewController2") as UIViewController
        break
    case 2:
        self.sidePanelController.centerPanel = self.storyboard?.instantiateViewControllerWithIdentifier("centerViewController3") as UIViewController
        break
    default:
        break
}
```


### おしまい
これを使ってはやくそれっぽいアプリを作れるようになりたいものです。
rails g コマンドでテストを作らないようにする方法

例えば、モデルを作成するときにrails g/rails generateコマンドで生成するときtest_unitでテストファイルも一緒に生成されてしまう。

```bash
$ rails g model user
invoke  active_record
create  db/migrate/YYYYMMDDHHMMSS_create_users.rb
create  app/models/user.rb
invoke  test_unit
create  test/unit/user_test.rb
create  test/fixtures/users.yml
```

テストが必要のない場合ちょっと困る。

## railsプロジェクトを作るときに取り除く場合
```bash
$ rails new . -T
```

-T オプションで解決。

## 運用中のサービスから取り除く場合

config/application.rbの

```rb(application.rb)
require 'rails/all'
```

と書かれている部分を

```rb(application.rb)
require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"
```

というように変更する。
allですべて読み込んでいたコンポーネントを必要なものだけ読み込めるようになる。
test_unitにコメントアウトを付けて解決。
Node.jsでmochaを使ってBDDスタイルのユニットテスト

## mocha
mocha(モカ）と読む。Javascriptの単体テストフレームワーク。

## mochaの特徴
- node.jsやブラウザから実行可能できる。
- 非同期のテストもできる。
- TDDやBDDスタイルでテストを記述できる。
- テスト結果も多くの形式で出力できる。
- mocha自体はアサーション機能を持たない。  
→　値の検証には標準のassertやchai、shouldを使用する。

## mochaをインストール
mochaをグローバルインストールする。

```bash
$ npm install -g mocha
```
## chai
chaiはBDD / TDDスタイルで記述できるアサーションライブラリ。
BDDスタイルは、expect / shouldが用意されており、TDDスタイルはassertで表現する。

### shouldとexpectの違い
sholudはObject自身を拡張して、sholudメソッドを追加して実装されている。
英語の文法に近い記述ができる。
メモ：どうもIEとはは相性がよろしくないみたい。

```js:shouldの例
// 「fooがbarと等しくなければいけない」ことをテスト。
foo.should.equal('bar');
```

expectは関数で、引数に評価する値を渡す。

```js:expectの例
expect(foo).to.equal('bar'); 
```

## chaiをインストール

```bash
$ npm install chai
```

chai自体はTDDとBDDに対応していが、まずは、BDDスタイルのshouldでテストを作ってみた。

## 実装とテスト

### プロジェクトの作成

```
sample-mocha
├── src
│   └── calculation.coffee
└── test
    └── calculation-bdd-should.coffee
```

### テスト対象の作成

```coffeescript:calculation.coffee
class Calculator

  constructor: () ->
    console.log 'Calcクラスのインスタンスを生成する。'

  add: (a, b) ->
    ans = a + b
    return ans

  multiply: (a, b) ->
    ans = a* b
    return ans

module.exports = Calculator
```

### テストコードを書いてみる

mochaではBDD向けのスタイルとして以下が提供されている。

|関数|概要|
|:--|:--|
|describe|ネスト管理可能な階層。テスト対象を宣言する。|
|before|describeの前に実行される。前提条件を記述する。|
|after|describeの後に実行される。後処理を記述する。|
|beforeEach|各describeの前に実行される。前提条件を記述する。|
|afterEach|各describeの後に実行される。後処理を記述する。|
|it|検証内容を記述する。|

```coffeescript:calculation-bdd-should.coffee
should = require('chai').should();

Calculator = require '../src/calculator'

# テスト対象を宣言
describe 'Calculator', () ->

  calc = null

  # 各describeの前
  before () ->
    console.log 'before method'
    calc = new Calculator()

  # 各describeの後
  after () ->
    console.log 'after method'
    calc = null

  # 各itの前
  beforeEach () ->
    console.log 'beforeEach method'

  afterEach () ->
    console.log 'afterEach method'

  # 実行するテストコード
  it '1 + 2 = 3', () ->
    calc.add(1, 2).should.equal(3)
  it '1 * 2 = 2', () ->
    calc.multiply(1, 2).should.equal(2)
```

## テストの実行

```bash
$ mocha --compilers coffee:coffee-script/register test/

  Calculator
before method
Calcクラスのインスタンスを生成する。
beforeEach method
    ✓ 1 + 2 = 3
afterEach method
beforeEach method
    ✓ 1 * 2 = 2
afterEach method
after method


  2 passing (7ms)
```
Aureliaでプロジェクトを始める時

# Aurelia

AureliaはAngularの開発者が開発したフレームワークで、その特徴として、**未来志向(Forward-thinking)**であることが知られています。

まだまだ日本語の資料は少ないですが、ドキュメントには既に[日本語版](https://github.com/aurelia/documentation/tree/master/Japanese)が存在します。

# 実際に使用する時

チュートリアルでは[skelton-navigation](https://github.com/aurelia/skeleton-navigation)を使用しているので、実際に使用する際にもこのリポジトリを参考にして始めたいと思うでしょう。

しかし、このリポジトリはgulpの設定等にaurelia本体と同じものが使用されているため、あまり一般的ではない（と私は思う）設定がされています。

例えば、prepare-releaseなどのgulp taskが用意されていますが、通常は不要でしょう。不要なだけで害があるわけではありませんが、使わないものを残しておくのは後々の混乱のもとなので削除しておきましょう（もちろん、Aureliaと同じ方式を採用するならばそれらを削除する必要はありません）。

## build/tasks/prepare-relase.js

リリースに関するタスクが定義されています。バージョンを更新したり、CHANGELOGを更新したりしています。

削除してしまって問題ないでしょう。

## build/tasks/dev.js

正しく理解できているかはわかりませんが、どうやらaurelia自体をリポジトリからローカルにコピーしたりしているようです。

削除して問題ないと思います。

## build/tasks/doc.js

`doc`タスクでは、`doc-generate`タスクでドキュメントを生成した後に、生成されたドキュメントをAurelia独自のツールで整形しているようです。`doc-generate`タスクも実際にはドキュメントを作成するのではなく、パース段階で止めてjsonのみを出力しています。

docタスクはプロジェクトに合う形に変更するのがよいでしょう。また、aurleria-toolsへの依存は`doc.js`と`dev.js`にしかありませんので、`package.json`のdevDependencesから削除してしまうとよいでしょう。

## その他

テスト周りは見ていないので、そこにもあまり一般的でない設定があるかも知れません。

# まとめ

あくまでチュートリアル用なので、0から作れる人は自分で0から作ったほうが結果的には良いかも知れません。

私のように、gulp-task自分で作れないよって人は、ここで挙げた変更をしてから少しずつ設定していけばいいと思います。
ffmpegにOpenH264をリンクしてビルドする

[OpenH264](http://www.openh264.org/)は、CiscoがBSDライセンスでオープンソースにしているH.264の実装です。
ffmpegでH.264のエンコードにはx264を利用する場合が多いですが、OpenH264もサポートされるようになっていたので試してみます。

ubuntu12.04 32bitで試しています。

## OpenH264をインストール
```
sudo apt-get install build-essential nasm
wget https://github.com/cisco/openh264/archive/v1.4.0.tar.gz
tar zxf v1.4.0.tar.gz
cd openh264-1.4.0
make
sudo make install
sudo ldconfig
```

## ffmpegをビルドする

```
sudo apt-get install pkg-config automake autoconf zlib1g-dev libtool yasm
wget http://ffmpeg.org/releases/ffmpeg-2.6.tar.bz2
tar xjf ffmpeg-2.6.tar.bz2
cd ffmpeg-2.6
./configure --enable-libopenh264
make
sudo make install
```

※
[Libav Adds OpenH264 Encoder Support: Good Performance, BSD Licensed](http://www.phoronix.com/forums/showthread.php?112023-Libav-Adds-OpenH264-Encoder-Support-Good-Performance-BSD-Licensed) によると、OpenH264を使った場合、x264に比べてCPU使用率は低いが、baselineプロファイルしかサポートされていない、といった違いがあるそうです。
ffmpegをubuntuでビルドする

apt-getでも入ったと思いますが、ソースからインストールする方法を紹介します。
ubuntuは14.04 64bit の場合になります。

h264のエンコーダにx264を使う場合を想定します。

```
sudo apt-get update
sudo apt-get install build-essential automake autoconf zlib1g-dev libtool libx264-dev yasm
wget http://ffmpeg.org/releases/ffmpeg-2.6.tar.bz2
tar xjf ffmpeg-2.6.tar.bz2
cd ffmpeg-2.6
./configure --enable-libx264 --enable-gpl
make
sudo make install
```
ffmpegをOSXでビルドする

ffmpegをOSX(Yosemite)にインストールする場合brewで直接入れるのが簡単ですが、以下はソースからインストールする方法になります。

    brew install x264 automake autoconf libtool pkg-config yasm
    wget http://ffmpeg.org/releases/ffmpeg-2.6.tar.bz2
    tar xjf ffmpeg-2.6.tar.bz2
    cd ffmpeg
    ./configure --enable-libx264 --enable-gpl
    make
    sudo make install
ScalaでfoldLeftを使ってみた

# 文字列中のキーワードを変換して文字列を返すコードを書きたい
変換したいキーワードが複数ある時Mapをforeachで回せば良いじゃんと思って下のコードを書きました、ところがforeachは返り値が無くてうまくいきませんでした。

```scala
val keywords = Map("foo" -> "bar", "baz" -> "qux")
val text = "foo is baz."
val changedText = keywords.foreach { map => text.replace(map._1, map._2) }
println(changedText)
```

そこでfoldLeftを使って書き直すと

```scala
val keywords = Map("foo" -> "bar", "baz" -> "qux")
val text = "foo is baz."
val changedText = keywords.foldLeft(text){ (tex, map) => tex.replace(map._1, map._2) }
println(changedText)
```

と書けて

```
bar is qux.
```

うまく変換された文字列が返ってきてます、foldLeft便利ですね。
コマンドラインからAndroid Studioで開けるstudioコマンドが便利

MacでGithubに上がっているプロジェクトを試したいときに
1. ターミナルでクローン
2. Android Studio起動
3. Import project
4. ディレクトリ選択する
という手順になって若干めんどうです。

事前準備だけ行えば以下のように開くことができます。

```
git clone https://github.com/takahirom/DevInfoNotification.git
studio DevInfoNotification
```

他にも
`studio diff file1 file2`
を行うことでAndroidStudio上でdiffを表示させたりできるようです。

# 事前準備
Android Studioを起動して、Tools->Create Command-line Launcherを選択して、OKを押すだけです
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/3e1816dc-5f96-44b7-fd6f-29878f39bcf2.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/8f222c30-9c24-145b-19df-00dae512cd09.png)
MacにPlayFrameworkをインストールする

---
### 【前提】

- Javaがインストールしてある
- macbrewがインストールしてある

### playのインストール
>$ brew install typesafe-activator

### プロジェクトを作成する
- For Java

>$ activator new ProjectName play-java

- For scala

>$ activator new ProjectName play-scala

### 起動する
>$ cd ProjectName
>$ activator
開眼！JavaScriptの2.1のまとめ オブジェクトへのプロパティの格納について

開眼！JavaScriptの2.1のまとめです。

##2.1　オブジェクトはすべての値をプロパティとして格納できる
*オブジェクトは、JavaScriptであらわすことができるすべての値を格納（もしくは参照）することができる。
String()、Number()、Boolean()の値でさえも、new演算子でオブジェクトとして生成されたのであれば同様の操作を行うことができる。*

実際にString()、Number()、Boolean()を格納して出力

```
var myFunction = function(){};

myFunction.myString = new String();
myFunction.myString2 = new String("string");
myFunction.myBoolean = new Boolean();
myFunction.myBoolean2 = new Boolean(true);
myFunction.myNumber = new Number();
myFunction.myNumber2 = new Number(100);

console.log(myFunction.myString,myFunction.myString2,myFunction.myBoolean,myFunction.myBoolean2,myFunction.myNumber,myFunction.myNumber2);
```
結果（見やすいように改行しています）
String {length: 0, [[PrimitiveValue]]: ""} 
String {0: "s", 1: "t", 2: "r", 3: "i", 4: "n", 5: "g", length: 6, [[PrimitiveValue]]: "string"} 
Boolean {[[PrimitiveValue]]: false} 
Boolean {[[PrimitiveValue]]: true}
Number {[[PrimitiveValue]]: 0}
Number {[[PrimitiveValue]]: 100}
【俺メモ】SublimeTextに入れているパッケージ

今回は本当にメモやで。
環境作りなおすときにあのパッケージなんやったけ？ってならんようにな。

主な作業は

* HTML、CSS(LESS)、JavaScript(AngularJs)によるクライアントサイドの開発
* JavaScript(Node.js)によるサーバサイトの開発
* Gitによるソース管理

# 入力系
* Alignment - 特定の文字で整列
* All Autocomplete - サジェスト強化
* AngularJS - AngularJSの開発向け入力補完
* Auto File Name - ファイル名の自動補完
* DocBlockr - JSDocの自動入力
* Emmet - 強力html入力
* Pretty JSON - JSONを見やすく整形
* Tag - 終了タグの自動補完
* Trailing Spaces - 行末のスペースを表示

# 表示系
* BracketHighlighter - 囲み記号をハイライト
* Color Highlighter - 色の表示
* LESS - LESSのハイライト

# ファイル操作系
* SideBarEnhancements - サイドバーの右クリックメニュー強化
* RecentActiveFiles - 最近開いたファイルの操作
* Sublime Files - ファイル検索小窓追加

# Git
* Git - Gitを利用可能に
* Git Gutter - Gitの差分確認など

# Markdown
* Table Editor - テーブル表記の整列
* Markdown extended -  マークダウンのハイライトなど
MySQLのSET型を使ってブログの記事にタグを付ける

# タグ付きの記事を作る

ブログのシステムを作っていたら「記事にタグを付けれるようにしてくれ」と言われたんですよ～。

仕方ないので最初は以下のように素直にテーブルを作りました。

## article

|id|subject|body|
|---|---|---|
|1|題名1|本文1|
|2|題名2|本文2|

## tag

|id|name|
|---|---|
|1|HTML|
|2|CSS|
|3|JavaScript|

## article_tag

|article_id|tag_id|
|---|---|
|1|1|
|1|3|
|2|2|

これでidが1の記事はHTMLとJavaScriptのタグを持ち、idが2の記事はCSSのタグを持つ、という感じですね。

# MySQLのSET型でテーブルをひとつにまとめる

しかし運用してゆくうちに、タグは決め打ちで名称が変わることがない、ということが分かってきたので、面倒になってテーブルをひとつにまとめてしまいました。

## article

|id|subject|body|tags|
|---|---|---|---|
|1|題名1|本文1|HTML,JavaScript|
|2|題名2|本文2|CSS|

tagsカラムは文字列型ではなく、以下のような定義のSET型です。
```SET('HTML', 'CSS', 'JavaScript')```
ひとつのカラムに複数の文字列の組み合わせを持つことが出来ます。

挿入は見たまま、文字列をカンマで繋いで行います。
```INSERT INTO article(tags) VALUES('HTML,CSS')```


検索は、例えばHTMLというタグがある記事を探すには
```SELECT * FROM article WHERE tags LIKE '%HTML%'```
もしくは、
```SELECT * FROM article WHERE FIND_IN_SET('HTML', tags) > 0```
です。

# おわりに

拡張性や汎用性（MySQL限定なので）は低くなりますが、小規模な場合は使ってみるとスッキリする場合があるかも知れない、と思います。
p5.jsでマイクインプットに合わせて般若心経の練習

p5.jsではマイクのインプットができます。

インスタンスを作って・・・

```js
  //マイクインプット開始
  mic = new p5.AudioIn();
  mic.start();
```
これだけでボリュームが拾えます。

```js
  var vol = mic.getLevel();

```

これ英語のリーディングとかに使える？
と思って作ってみました般若心経

![eee.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/ff5834ba-88be-bdcd-5f05-11c573fc6c38.gif)

jsdoit : http://jsdo.it/hp0me_/872t

マイクの許可を忘れずに
![スクリーンショット 2015-04-10 22.38.26.png](https://qiita-image-store.s3.amazonaws.com/0/57193/c399cbb8-d206-7091-1a2b-fcf637f21e2b.png)


##コード
```js:sketch.js
//般若心経を用意     
var scripts = ["観","自","在","菩","薩","行","深","般","若","波","羅","蜜","多","時","照","見","五","蘊","皆","空","度","一","切","苦","厄","舎","利","子","色","不","異","空","空","不","異","色","色","即","是","空","空","即","是","色","受","想","行","識","亦","復","如","是","舎","利","子","是","諸","法","空","相","不","生","不","滅","不","垢","不","浄","不","増","不","減","是","故","空","中","無","色","無","受","想","行","識","無","眼","耳","鼻","舌","身","意","無","色","声","香","味","触","法","無","眼","界","乃","至","無","意","識","界","無","無","明","亦","無","無","明","尽","乃","至","無","老","死","亦","無","老","死","尽","無","苦","集","滅","道","無","智","亦","無","得","以","無","所","得","故","菩","提","薩","埵","依","般","若","波","羅","蜜","多","故","心","無","罣","礙","無","罣","礙","故","無","有","恐","怖","遠","離","一","切","顛","倒","夢","想","究","竟","涅","槃","三","世","諸","仏","依","般","若","波","羅","蜜","多","故","得","阿","耨","多","羅","三","藐","三","菩","提","故","知","般","若","波","羅","蜜","多","是","大","神","呪","是","大","明","呪","是","無","上","呪","是","無","等","等","呪","能","除","一","切","苦","真","実","不","虚","故","説","般","若","波","羅","蜜","多","呪","即","説","呪","曰","羯","諦","羯","諦","波","羅","羯","諦","波","羅","僧","羯","諦","菩","提","薩","婆","訶","般","若","心","経","fin.."];
               
var scIndex = 0;
var textObj;
var input;
var inputFlg = 0;
var analyzer;

function setup() {

  //キャンバスを作る
  createCanvas(500, 200);
  textObj = new Hannnya();

  //マイクインプットのインスタンス化&スタート
  mic = new p5.AudioIn();
  mic.start();
}

function draw() {

  background(255);

  var vol = mic.getLevel();

  //ボリュームが閾値を超えたら次のフェーズへ
  if(vol>0.1){
    inputFlg = 1;
  }

  //ボリュームが閾値以下に戻ったら次のフェーズへ
  if(vol<0.1 && inputFlg==1){
    inputFlg = 0;
    console.log("grounding");
    //次の文字を出す
    textObj.frameInc();
  }

  fill(127);
  noStroke();
  textObj.draw();
}

//class for label
function Hannnya(){

  this.currentFrame = 0;
  this.str = scripts[this.currentFrame];

  this.frameInc = function(){
    this.currentFrame++;
    if(this.currentFrame >= scripts.length)
      this.currentFrame = 0;
  };

  this.draw = function(){
    textSize(102);
    noStroke();
    //文字を出す
    text(scripts[this.currentFrame], 30, 100);
    this.guide(this.currentFrame);
  };
    
  this.guide = function(currentIndex){
      textSize(30);
      fill(127);
      var tx = "";

      //未来10個分の文字を出す
      for(var i = 1; i <= 10; i++){
        tx += scripts[this.currentFrame+i];
      }
      text(tx, 30, 150);
      fill(25,50,50,50);
  }
}

```
PHP7調査(5)整数型の引数のオーバーフローがエラーになった

PHP7では、組み込み関数の整数型引数に整数で表現できない値を渡した場合にエラーになります。

```php:float1.php
<?php
var_dump(array_fill(10000000000000000000, 3, "foo"));
```

```php:string1.php
<?php
var_dump(array_fill("10000000000000000000", 3, "foo"));
```

これらを実行すると次のようなエラーが帰ってきます。

```
PHP Warning:  array_fill() expects parameter 1 to be integer, string given in /tmp/string1.php on line 2
NULL
```
```
PHP Warning:  array_fill() expects parameter 1 to be integer, float given in /tmp/float1.php on line 2
NULL
```

array_fillの第一引数はint型ですが（PHPマニュアルの「[array_fill](http://php.net/manual/ja/function.array-fill.php)」参照）、これに整数以外の値を渡してエラーになっているのがわかります。

これはint型のタイプヒントの場合も同様です。

```php:float2.php
<?php
function foo(int $i) {}
foo(10000000000000000000);
```

```
PHP Fatal error:  Uncaught TypeException: Argument 1 passed to foo() must be of the type integer, float given, called in /tmp/float2.php on line 3 and defined in /tmp/float2.php:2
Stack trace:
#0 /tmp/float2.php(3): foo(1E+19)
#1 {main}
  thrown in /tmp/float2.php on line 2
```

こうしたエラーメッセージを見ると浮動小数点数や文字列を渡したせいで怒られているように見えますが、実際には整数にキャストできない値を渡したせいで怒られています。具体的には、[PHP_INT_MIN, PHP_INT_MAX]の範囲外だと怒られます。

下記のように、整数の範囲内であれば浮動小数点数や文字列を渡しても期待通りに動きます。

```php:float3.php
<?php
var_dump(array_fill(1.9, 3, "foo"));
/*
array(3) {
  [1]=>
  string(3) "foo"
  [2]=>
  string(3) "foo"
  [3]=>
  string(3) "foo"
}
*/
```

```php:string3.php
<?php
var_dump(array_fill("1e10", 3, "foo"));
/*
array(3) {
  [10000000000]=>
  string(3) "foo"
  [10000000001]=>
  string(3) "foo"
  [10000000002]=>
  string(3) "foo"
}
*/
```

ちなみにPHP5までは、整数の範囲外の値を持つ浮動小数点数を整数にキャストした場合の挙動は未定義でした。実際に手元で試してみると非常に小さな整数にキャストされます。

```
$ php56 -r 'var_dump(array_fill(NAN, 3, "foo"));'
array(3) {
  [-9223372036854775808]=>
  string(3) "foo"
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "foo"
}
```

これに対応するPHP5のCソースコードを見ると、単にdoubleからlongにキャストするような処理になっています。このようなキャストでdoubleがlongの範囲外の場合の挙動はC言語として未定義で、結果は処理系依存・環境依存ということになります。Cレベルで未定義の挙動をPHPプログラマに提供してきたこと自体が残念仕様だったと思いますので、今回の修正は当然とも言えるでしょう。

#　参考

* [PHP RFC: ZPP Failure on Overflow](https://wiki.php.net/rfc/zpp_fail_on_overflow)