OmniAICreator/Qiita-1.07M huggingface dataset:
iPhone Simulator で zoom モードを再現するまでの過程

[自分の記事](http://blog.dealforest.net/2014/10/process_zoom_mode_iphonesimulator/)からの転載です。

<a href="http://d.hatena.ne.jp/shu223/20141002/1412209257" target="_blank">「Xcode 6 時代のマルチデバイス対応 ～Size Classとベクター画像～」</a>を参考にしながら 6/6 Plus に最適化させようとしていたのですが、iOS 8 から追加された zoom/standard モードを iPhone Simulator でデバッグするにはどうすればいいのかを調べていてカオスってたのでメモ。
そもそも iPhone Simulator で zoom/standard モードの切り替えができないのがどうかと思うけど。。。

先にまとめだけいうと、<b>zoom モードにした実機でするのが一番確実</b>。

さて 6/6 Plus の解像度に対応しようとすると zoom/standard モードのサイズを考慮する必要があります。
サイズは 6 Plus の UIScreen の bounds です。
* zoom モード(375x667)
* standard モード(414x736)
* 解像度を対応させない(320x568)
 
<h2> 6/6 Plus の解像度に対応させる方法</h2>
<a href="http://d.hatena.ne.jp/shu223/20141002/1412209257" target="_blank">「Xcode 6 時代のマルチデバイス対応 ～Size Classとベクター画像～」</a>より引用
<blockquote>
* Launch 画像を登録する
* Launch Screen Fileを指定する
</blockquote>
 
<h2>対応表</h2>
zoom/standard モードで解像度を対応している/いないかで [UIScreen mainScreen].bounds.size, [UIScreen mainScreen].scale, [UIScreen mainScreen].nativeBounds.size, [UIScreen mainScreen].nativeScale のそれぞれ値を取得してみました。


<h3>iPhone 6 Plus</h3>
<table>
<tr>
  <th></th>
  <th>bounds</th>
  <th>scale</th>
  <th>nativeBounds</th>
  <th>nativeScale</th>
</tr>
<tr>
  <td>zoom - 非対応</td>
  <td>320x568</td>
  <td>2.000000</td>
  <td>921.60004x1635.8401</td>
  <td>2.880000</td>
</tr>
<tr>
  <td>zoom - 対応</td>
  <td>375x667</td>
  <td>3.000000</td>
  <td>1080x1920.9601</td>
  <td>2.880000</td>
</tr>
<tr>
  <td>standard - 非対応</td>
  <td>320x568</td>
  <td>2.000000</td>
  <td>834.78265x1481.7391</td>
  <td>2.608696</td>
</tr>
<tr>
  <td>standard - 対応</td>
  <td>414x736</td>
  <td>3.000000</td>
  <td>1080x1920.0001</td>
  <td>2.608696</td>
</tr>
</table>
<br>

<h3>iPhone 6 Plus Simulator</h3>
iPhone 6 Plus Simulator では standard モードのみ実行可能。

<table>
<tr>
  <th></th>
  <th>bounds</th>
  <th>scale</th>
  <th>nativeBounds</th>
  <th>nativeScale</th>
</tr>
<tr>
  <td>standard - 非対応</td>
  <td>320x568</td>
  <td>2.000000</td>
  <td>960x1704</td>
  <td>3.000000</td>
</tr>
<tr>
  <td>standard - 対応</td>
  <td>414x736</td>
  <td>3.000000</td>
  <td>1242x2208</td>
  <td>3.000000</td>
</tr>
</table>
<br>
そこで zoom モードの解像度を再現するために Resizable Simulator を使えば可能なのでは？！と思いたって試してみました。
<br>

<h3>Resizable Simulator</h3>
起動後に w375 x h667 に変更して試してみました。

<table>
<tr>
  <th></th>
  <th>bounds</th>
  <th>scale</th>
  <th>nativeBounds</th>
  <th>nativeScale</th>
</tr>
<tr>
  <td>非対応</td>
  <td>768x1024</td>
  <td>2.000000</td>
  <td>1536x2048</td>
  <td>2.000000</td>
</tr>
<tr>
  <td>対応</td>
  <td>768x1024</td>
  <td>2.000000</td>
  <td>1536x2048</td>
  <td>2.000000</td>
</tr>
</table>
<br>

Simulator のサイズは変わってるけど、UIScreen の bounds が。。。
おそらくバグだと思われるけど UIScreen でほしいサイズはは Resize した後のサイズなのに。。。
UIScreen の bounds を元にしてコード上で自分でレイアウトしている場合はこれだと再現できないですね。

<h2>まとめ</h2>
AutoLayout のレイアウト確認くらいだと Resizable Simulator で確認できる。
とはいえ scale が 2 になっているためおそらく @2x を使いそうなので、その辺りの動作確認は zoom モードにした実機で確認するのが一番確実だと思います。
自力でレイアウトしている場合は何も考えずに実機でやりましょう。

あと Storyboard の preview も standasrd/zoom の切り替えはサポートしてないみたいですね。

何かいい方法があったりしたら教えてください。
SourceTreeとGitHubアカウント

#SourceTreeでGitHubのリモートリポジトリにプッシュしたら困った話
##問題
　SourceTree使ってGitHubのリモートリポジトリにプッシュしたら、想定と違うアカウントでプッシュされていた。（一度必要に迫られてメインアカウントと別のアカウントをつくってたことがありまして、アカウントを２つ持ってた。）

##解決
　SourceTreeの設定ではなくて、Macのキーチェーンの設定が問題でした。
　SourceTreeはキーチェーン利用してGitHubにログインしてたんですね。
　
　Lunchpad >　キーチェーンアクセス　>　ログインタブ　>　github.com　を編集で解決
Unity4.5.4f1 で Xcode6 を自動ビルドする方法

Unity4.5.4f1 ＋ Xcode6 環境でビルドすると、以下のエラーが発生して Xcode の自動ビルドに失敗します。

> UnityException: Launching iOS project via Xcode4 failed. Check editor log for details

下記サイトから入手できるパッチを使えば自動ビルドに成功します。
http://unity3d.com/unity/qa/patch-releases

ただ、諸事情でどうしても Unity4.5.4f1 を使いたい（使わないといけない）場合があるかもしれません。

そんなときは、
`/Applications/Unity/Unity.app/Contents/PlaybackEngines/iOSSupport/Tools/OSX/Unity4XC.xcplugin/Contents/Info.plist`
`DVTPlugInCompatibilityUUIDs`
に
`C4A681B0-4A26-480E-93EC-1218098B9AA0`
を追加すればビルドが通るようになります。
【目覚まし】cron + シェルスクリプトで任意の音声ファイルを再生・停止する


iTunes で毎朝オーディオを再生しようとするとどうも面倒（何やらツールを使う必要がある）なので、cron から普通にシェルで実行できないものかとスクリプトを書いてみました。

要件としては、以下のような感じです。

* cron で実行できるよう、普通にシェルのコマンドで実装する
* 再生の停止を、Ctrl-C はともかく、コマンドラインからもできるようにする
* 停止の際には、ちゃんとサブコマンド一式も停止すること
* pid ファイルはゴミになりがちだから使いたくない

使い方としては、`alarm start` でフォアグラウンドで再生を開始、Ctrl-C、もしくは `alarm stop` で再生を停止します。

以下は Mac OS X 用ですので afplay(1) コマンドを使っていますが、そこと、オーディオファイルの拡張子（以下では *.m4a になっている）さえ変えれば、*NIX 系のシステムならば動くと思います。

子プロセスと Ctrl-C の関係とかは、右記なんぞを参照してください。 ∥ [Ctrl+Cとkill -SIGINTの違いからLinuxプロセスグループを理解する | ギークを目指して](http://equj65.net/tech/linuxprocessgroup/)

~~~~bash:alarm
#!/bin/bash

## このディレクトリ下のファイルを連続再生する
path="/Users/knaka/Dropbox/iTunes/岡崎律子/for RITZ/"

## 適当に、ユニークな名前。これをターゲットに kill をする
process_name="AlarmProcessHogeFuga"

## ID で指定したプロセスの子孫プロセス ID 全てを再帰的に返す
function get_children() {
	for pid in $(pgrep -P $1)
	do
		echo $pid
		get_children $pid
	done
}

subcmd=$1

case $subcmd in
	## 再生を開始する
	start )
		## シンボリックリンクを解決し、シェルスクリプトのフルパスを求める
		self="$(p="$0";while true;do t="$(readlink "$p")";cd "$(dirname "$p")";test -z "$t"&&break||p="$t";done;echo "$(pwd -P)/$(basename "$p")")"
		## Bash のプロセスは、exec しなおさないと名前を変えられない
		exec -a "$process_name" bash "$self" _play
		;;
	## 再生を停止する
	stop )
		pid=$(pgrep -f "$process_name")
		kill $pid $(get_children $pid)
		;;
	## exec しなおした際に、実際に再生を開始する
	_play )
		for i in "$path"/*.m4a # 拡張子はお好みで
		do
			## 単純な再生コマンド。これは OS X の場合
			afplay "$i"
		done
		;;
esac
~~~~

子プロセスの停止は、シグナルハンドラで行なった方が良かったかな…。まあいいか。

もっと簡単な実装方法がありますよー、という方がいらっしゃったら教えていただけるとありがたし。

では。
android studio のサポートライブラリの追加位置

android studioを使い始めてハマったところで

サポートライブラリの追加位置についての備忘録

android studio を開き build.gradle を開き、dependenciesの中に（なかった書き足す）

　compile 'com.android.support:support-v4:20.+'

を書く。

ここまではいろんなサイトに書いてあるから大丈夫なんだけど

このbuild.gradle・・・appの中のものを変更しないとMainActivityで読み込めない模様、なんでだろうね汗

作成したプロジェクトの子要素にも同じようにbuild.gradeがあるんですが、ここをずっと変更してハマりました。

どなたか分かる方がいらっしゃいましたらコメントください

（android developerのサイトにはこう書けばうまくいく！しか書いてなかったようなので・・・）

##追記
2015/07/02

android studioのバージョンが1.0になり（今は1.10)ファイル構成も変更になりました。

ということで書く場所も変わり

bulid.gradle(Module:app)

で変わらずでいけます。
iOS お手軽 push 通知テスト

##こんなとき便利

・iPhone側がpush通知を受け取ったときの挙動を確認したい
・特定の人にpushしたい

## スクリプトを叩いてpushしてみる

まず

```
gem install apns
```

します。

"server_certificates.pem"と同じディレクトリに下記のようなスクリプトを用意します。

```
require 'apns'
APNS.host = 'gateway.push.apple.com'
APNS.pem = 'server_certificates.pem'
token = '(iPhoneから取得したtoken)'
APNS.send_notification(token, 
	:alert => 'test',
        :other => {:hoge => "hogehoge", :fuga => "fugafuga", :piyo => "piyopiyo"}
	)
puts "finish"
```

あとはこのスクリプトを実行するだけでpush通知を送信できます。

たとえば push.rb というファイル名なら `ruby push.rb` です。

`:alert`はpush通知の文言、otherは渡したい独自パラメータを、他に`:badge`(バッジの数)や`:sound`(push受信時の音)があります。
Yahoo!ショッピングWebAPIのWADL・クライアントライブラリ

現在、JavaのバッチプログラムからYahoo!ショッピングWebAPIへの連携を予定しており、
作業負荷を減らす為、自動生成またはクライアントライブラリ(もし提供されていれば)を検討しております。
(AmazonMWSクライアントライブラリの様な物があれば利用したいと思っております)

教えて頂きたいのですが、WADLもしくはJava用のクライアントライブラリなど御座いますか？
safari 7.1でturbolinks使用時のformの挙動がおかしい

[環境]
safari 7.1
rails 4.0.4
ruby 2.1.0p0
turbolinks 2.2.0

[症状]
turbolinksが機能した時だけ
form 〜 /form
より後に書いたソースが、form 〜 /formの中にネストされてしまう。
例えば

````
<form></form>
<div>test</div>
うぉおん
````

と書くと

````html.erb
<form>
</form>
<div>test</div>
うぉおん
````

を期待しているのに、

````html.erb
<form>
  <div>test</div>
  うぉおん
</form>
````
といった感じで出力されてしまう。
F5更新等で読み込み直した時はこの症状は出ない。
safari7.1でのみこの症状が起こる。
後に書いてあるソースが全てネストされてしまうので、場合によってはページがぶっ壊れる。


私の認識がなんか間違ってるのかな…
治るまで待つか、対策するか…
私の環境だけがおかしいのか…
OTL

form_forやform_tagでも同様になる。

とりあえずformタグをdivで囲ったりすると対策できそうだけどめんどくさいん(´・ω・｀)

[追記]
turbolinksを2.4にアップデートしたら治りました。
bundle update turbolinks
fuelphpでpackageをいじっていたら、Exception thrown without a stack frame in Unknown on line 0が出た

fuelphpで、ちょっとカスタムを試したくて
packageの中で Config::get('db'); をしてみたら
**Exception thrown without a stack frame in Unknown on line 0**
が発生しました。

結論を言うとConfigから取得した値を、arrayキャストをすることで治りました。

状況は、
こんな感じの処理を書いていたんですが

```lang:orm/classes/model.php
$dbs = Config::load(’db');
if(is_array($dbs)) {
  foreach($dbs AS $db)
  {
  }
}
```
$dbsを取ってくるまでは問題がないのに、foreachを書くと上記エラーが発生。
is_arrayをかけてチェックをしているのに、エラーが出ます。

いろいろ試した結果、以下の感じで、arrayキャストかけたら治りました。

```lang:orm/classes/model.php
$dbs = Config::load(’db');
if(is_array($dbs)) {
  foreach((array)$dbs AS $db)
  {
  }
}
```
Macでポートを開いてるプロセスをkillする方法

例えばポート番号 **1080** の場合

```
lsof -i -P | grep 1080
```

ヒットしたら表示されます。

```
java  5328 narikei 5u IPv6 0x1d1d1d1d1d1d1d1d1d 0t0  TCP *:1080 (LISTEN)
```

PIDが分かったので**KILL**

```
kill -9 5328
```
Running swift/swiftc on Xcode 6.0


Xcode 6.0でswift/swiftcを起動する

Never run this procedure on Mountain Lion or former, or you will have unexpected behavior.
Mountain Lion以下では絶対に実行しないでください。

In short, you can just copy everything.

```bash:setup_macosx10_10.sh
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
sudo mkdir MacOSX10.10.sdk
cd MacOSX10.10.sdk
sudo cp ../MacOSX10.9.sdk/SDKSettings.plist ./
sudo sed -i -e 's/10\.9/10.10/' SDKSettings.plist
sudo ln -s ../MacOSX10.9.sdk/System
sudo ln -s ../MacOSX10.9.sdk/usr
```

And you are all set. Just execute `xcrun -sdk macosx10.10 swift program.swift`! Have fun!

(You should remove this before updating to upcoming 6.1)

```bash:remove_macosx10_10.sh
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
sudo rm MacOSX10.10.sdk/*
sudo rmdir MacOSX10.10.sdk
```

## Broken SDK path?

If `xcrun -sdk macosx10.9 --show-sdk-path` is pointed to MacOSX10.10.sdk for some reasons (like `<unknown>:0: warning: no such SDK: '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk'`), executing `xcrun --no-cache -sdk macosx10.9 --show-sdk-path` will fix the issue.

SDKのパスが異常な値になった場合は、`xcrun --no-cache -sdk macosx10.9 --show-sdk-path`によって復旧することができます。
Safari for iOS 8での画面回転とイベント

# ショッキングな出来事

以前、Qiitaに投稿した記事「[モバイルブラウザで画面の縦長・横長を検出する方法を再確認してみた](http://qiita.com/tomoyukilabs/items/916215e933b8fb0af8ca)」にて、iOSとAndroidで画面回転時に発生するイベントの順序について触れたのですが...

**iOS 8では、また変わってしまっています...**

# おさらい

* iOS 7.x以前の場合は、画面リサイズが完了してから、`orientationchange`や`resize`といったイベントが発生する。
* Androidの場合は、`orientationchange`イベント→画面リサイズ→`resize`イベント、といった順序で処理が行われる。

# Safari for iOS 8では

* iOS 8では、**`resize`イベント発生→`orientationchange`イベント発生→画面回転・リサイズ**の順序で処理が行われる。

そして、**`resize`イベントの段階では`window.orientation`の値が回転前のまま**になっていたりします。`orientationchange`イベントの段階では回転後の値に更新されています。

## 追記 (2015-11-17)
改めて、iOS Simulatorで挙動を確認してみると、どうもiOS 8.1では現象が改善されて、**リサイズ→`resize`イベント発生→画面回転→`orientationchange`イベント発生**の順序になっているようです。

`window.orientation`の値が`resize`イベントの段階では変わっていないのは相変わらずで、iOS 9でも同様のようです。

# さて、どうするか

そうなると、**iOSでは`orientationchange`イベント、それ以外では`resize`イベントの時に`window.orientation`の値を判定する**等のような対策が考えられます。前回記事のサンプルコードを次のように変えてみます。

```js:orientation.js
var defaultOrientation; // window.orientationが0または180の時に縦長であればtrue

// 初期化処理
window.addEventListener('load', function() {
  if('orientation' in window) {
    var o1 = (window.innerWidth < window.innerHeight);
    var o2 = (window.orientation % 180 == 0);
    defaultOrientation = (o1 && o2) || !(o1 || o2);
    checkOrientation();
  }
  // もしあれば、その他Webアプリの初期化処理
}, false);

// iOSの場合とそれ以外とで画面回転時を判定するイベントを切り替える
var event = navigator.userAgent.match(/(iPhone|iPod|iPad)/) ? 'orientationchange' : 'resize';

// 画面回転時に向きをチェック
window.addEventListener(event, checkOrientation, false);
function checkOrientation () {
  if('orientation' in window) {
    // defaultOrientationがtrueの場合、window.orientationが0か180の時は縦長
    // defaultOrientationがfalseの場合、window.orientationが-90か90の時は縦長
    var o = (window.orientation % 180 == 0);
    if((o && defaultOrientation) || !(o || defaultOrientation)) {
      // ここに縦長画面への切り替え処理を記述
      console.log('portrait');
    }
    else {
      // ここに横長画面への切り替え処理を記述
      console.log('landscape');
    }
  }
}, false);
```
STL  reverse_iteratorでのインデックス算出

久しぶりに利用してちょっと混乱したので、自分向けのメモです。

昔の知識なので、より簡単にインデックスを取得する方法があるのかもしれません。

```cpp
// std::vector<int> _array; // = {0, 1, 2, 3, -1};

// arrayを後ろから前に探索して、最初の-1のreverse_iteratorを返す.
auto ite = std::find(_array.rbegin(), _array.rend(), -1);

ite - _array.rbegin(); // 後ろから何番目か. この場合0.
_array.rend() - ite - 1; // 見つかったインデックス.この場合4.
```
LXC上のCentOS7起動が1時間かかるのでpull reqしといた

* [[lxc-devel] [PATCH] Various fixes for Fedora/CentOS/OpenSUSE templates and systemd.](https://lists.linuxcontainers.org/pipermail/lxc-devel/2014-September/010261.html)を当ててLXCをビルドする

* lxc.cap.drop から setpcapを外せばよい。(fedora.common.confが参考になる。)
* pull requestした。
  * https://github.com/lxc/lxc/pull/342
  * https://github.com/lxc/lxc/pull/341
* issue報告
  * [big big login delays in CentOS 7 systemd. · Issue #340 · lxc/lxc](https://github.com/lxc/lxc/issues/340)

## lxc 1.0.6の場合

```diff:/usr/share/lxc/config/centos.common.conf
- lxc.cap.drop = mac_admin mac_override setfcap setpcap
+ lxc.cap.drop = mac_admin mac_override setfcap
```

## lxc 1.1.0の場合

```diff:/usr/share/lxc/config/centos.common.conf
- lxc.cap.drop = setfcap setpcap sys_nice sys_pacct sys_rawio
+ lxc.cap.drop = setfcap sys_nice sys_pacct sys_rawio
```

* setpcapをコメントアウトしない場合
  * ネットワークが有効にならなかった。
  * また、systemctlコマンドも`Failed to get D-Bus connection: Failed to authenticate in time.`となった。
* 試しにこれでCentOS6も動かしてみたが動作はした。
  * CentOS7を動かすとlxc-stopがキッカリ1分かかるが、起動に1時間かかるよりかは良い。

構築手順: [ArchLinuxでLXCを動かしてみた - Qiita](http://qiita.com/tukiyo3/items/4946996dbb8b48dca5db)

## 同現象

* [[lxc-users] Centos-7 x86_64 container slow and buggy start](https://lists.linuxcontainers.org/pipermail/lxc-users/2014-July/007443.html)
* [build on centos7 container · Issue #68 · SolidCharity/LightBuildServer](https://github.com/SolidCharity/LightBuildServer/issues/68)


```bash:
$ sudo lxc-start -n centos7
systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
Detected virtualization 'lxc'.

Welcome to CentOS Linux 7 (Core)!

Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.
[  OK  ] Reached target Remote File Systems.
[  OK  ] Listening on /dev/initctl Compatibility Named Pipe.
[  OK  ] Listening on Delayed Shutdown Socket.
[  OK  ] Reached target Encrypted Volumes.
[  OK  ] Listening on Journal Socket.
         Mounting Debug File System...
         Mounting POSIX Message Queue File System...
         Mounting Huge Pages File System...
         Starting Journal Service...
[  OK  ] Started Journal Service.
         Mounting Configuration File System...
         Starting Create static device nodes in /dev...
[  OK  ] Reached target Swap.


         Starting Remount Root and Kernel File Systems...
[  OK  ] Created slice Root Slice.
[  OK  ] Created slice User and Session Slice.
[  OK  ] Created slice System Slice.
[  OK  ] Reached target Slices.
[  OK  ] Created slice system-getty.slice.
[  OK  ] Mounted Debug File System.
```

ここまでで20分・・・
Node.js でファイルを保存する方法

ちょっとした備忘録♪

## テキストファイルを保存

text の内容を保存して hoge.txt を作るスクリプト.

```js:script
var fs = require('fs');

var text = "hoge foo bar";
fs.writeFile('hoge.txt', text);
```

出力結果

```txt:hoge.txt
hoge foo bar
```

## json ファイルを保存

json の内容を保存して hoge.json を作るスクリプト

```js
var fs = require('fs');

var data = {
    hoge: 100,
    foo: 'a',
    bar: true,
};
fs.writeFile('hoge.json', JSON.stringify(data, null, '    '));
```

出力結果

```js:hoge.json
{
    "hoge": 100,
    "foo": "a",
    "bar": true
}
```

`JSON.stringify(data)` でも良いんですが
出力後のファイルを見やすくするために `JSON.stringify(data, '', '    ')` としています.
[Scala]SecureSocialを使ってTwitterにログインするメモ[Play]



## SecureSocial関連リンク

### 本家
http://securesocial.ws/guide/getting-started.html
https://github.com/jaliss/securesocial/tree/a0ec77207c648c9eef974723e1d3685503c19ea4/module-code/app/securesocial

### ブログ等
http://tech.noriakihoriuchi.com/securesocialdao-ru-shimashita-dao-ru-madenochiyutoriaru
http://tech.noriakihoriuchi.com/securesocialderoguinhua-mian-woshang-shu-kishitai

http://krrrr.hatenablog.com/entry/2014/08/17/182628

http://tkawachi.github.io/blog/2013/11/17/play-2-dot-2-scala-user-login/



## Twitter API関連リンク

https://dev.twitter.com/rest/reference/get/account/verify_credentials

## MySQLの文字化け関連リンク

http://ver321.com/web/517

http://blog.goo.ne.jp/ucchanx/e/a0fb540a76dc90f9ee0669fe18943886

http://blog.livedoor.jp/xcode2501/archives/752454.html

http://blog.k11i.biz/2012/11/utf-8-mysql-jdbc.html

http://d.hatena.ne.jp/takihiro/20080306/1219295452


## GitHub関連（おまけ）

http://relx.jp/blog/?p=405

http://lab.bizreach.co.jp/739/

## pac4jとか（ついで）

http://alfa.hatenablog.jp/entry/2013/06/23/025925
Spark - mustacheでbootstrapを使う方法


- Sparkのテンプレートエンジンであるmustacheにbootstrap導入に少しハマったのでメモ

## ハマった理由
- JavaのほうでCSSやJSのファイルのパスを指定していなかった。
- 指定の方法を知らなかった。
- mustacheファイルでそのまま呼びだそうとしても出来ない！？← (localhost/hoge)にアクセスしていので当然といえば当然だが
- 友達にeternalStaticFileLocationというものがあることを教えてもらったけどどうやって使うんだ...

## 解決方法
- new File(".").getCanonicalPath()で追跡すればよかった
- コード例

```java:
try{
	externalStaticFileLocation(new File(".").getCanonicalPath() + "/src/main/resources/templates");
}catch(IO Exception e){
}
```

- あとはmustacheファイルのほうで呼び出せばおｋ

![mustache.png](https://qiita-image-store.s3.amazonaws.com/0/45373/c4fa53d7-5a9a-6d76-295c-7ea5693dae4b.png)

- 読み込めてる
画面キャプチャを保存する方法


unityで画面キャプチャを保存してソーシャルシェアしたい。なんてことがあるんじゃないかと思います。

```C#
public IEnumerator CaptureAndShare(string fileName)
{
	// ここでウィジェットを隠したり画面キャプチャの前処理

	// レイアウト設定のために1フレーム待つ
	return yield new WaitForEndOfFrame ();
	
	Application.CaptureScreenshot (fileName);

	// キャプチャを保存する処理として１フレーム待つ
	return yield new WaitForEndOfFrame ();

	// 保存先のpathを取得
	string path = Application.persistentDataPath + "/" + fileName;

	// ここでシェアなど
}

```


呼び出す側からは、

```C#
StartCoroutine(CaptureAndShare());
```

なんかを使ってコルーチンを使って呼び出します。
Vagrant+Chef Soloを爆速で開始する(だけ)

# Install

```
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
$ sudo /opt/chef/embedded/bin/gem i knife-solo
```

# Ready...

```
$ vagrant plugin install vagrant-omnibus
$ cd vm/directory
$ vagrant init
$ knife solo init .
$ knife cookbook create hoge -o site-cookbooks
```

最後のコマンドは任意の名前で作成する。

# Vagrantfile

```
  config.omnibus.chef_version = :latest
  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = "./site-cookbooks"
    chef.run_list = ["hoge"]
    chef.custom_config_path = "guest_chef.conf"
  end 
```

SSLのWarningを消すための設定ファイル: guest\_chef.conf (ファイル名は任意)

```
Chef::Config.ssl_verify_mode = :verify_peer
```

# Recipe

```
$ vi site-cookbooks/hoge/recipes/default.rb
```

# Go

```
$ vagrant up --provision
$ vagrant provision
```

Chef Solo+Vagrantの記事が長々したものしかなく困っていたのでまとめてみました。(Chef Zero?気にしない。)

レシピの書き方はここにはないです。

# 参考記事

* [Windows版Vagrant+Chef SoloでCentOS 6.5上にjava7+tomcat7環境を作る | infoScoop開発者ブログ](http://www.infoscoop.org/blogjp/2014/05/29/vagrant_chef_java_tomcat_install/ "Windows版Vagrant+Chef SoloでCentOS 6.5上にjava7+tomcat7環境を作る | infoScoop開発者ブログ")
* [今っぽい Vagrant + Chef Solo チュートリアル - Qiita](http://qiita.com/tai
ki45/items/b46a2f32248720ec2bae "今っぽい Vagrant + Chef Solo チュートリアル - Qiita")
* [vagrant - chef-solo ssl warning when provisioning - Stack Overflow](http://stackoverflow.com/questions/22991561/chef-solo-ssl-warning-when-provisioning "vagrant - chef-solo ssl warning when provisioning - Stack Overflow")
Jenkinsでジョブを遅れて実行させる

JenkinsでジョブA → ジョブBの実行でジョブBの実行を遅延させたかったのでいろいろ試してみた。

# 方法0：[番外]ジョブ中でsleepする

ジョブ中でシェルの実行などで本処理前にsleepして待つ。
シンプルだが以下のデメリットがあるためしない方が良さそう。

 1. ジョブが実行状態になり続けて実行枠を占有する。
 1. 待機中か処理実行中か判断し辛くキャンセルしにくい。
 1. ジョブの「ソースコード管理」機能を利用したscmの取得などは遅延できない。

これよりあとの方法だとビルドキューにつまれてビルドを待つため状態がわかりやすい。

# 方法1：ジョブに設定する

以下のように設定する。

* 「プロジェクトの高度なオプション」の「高度な設定」で待機時間(秒)を設定する

ジョブの実行方法によって効く場合と効かない場合があるらしい。
ジョブをブラウザ上から直接実行する時と定期実行はその指定した瞬間に実行させたいだろうということで効かせてないのかな？

| 実行方法 | 待機する/しない |
|:--------|:-------------|
| 他のプロジェクト(上流)からのジョブの実行 | する |
| ジョブをブラウザ上から直接実行 | しない |
| 定期実行で実行      | しない |
| リモートでジョブ実行 | する |
| SCMのポーリング実行 | する |

遅延時間が一定で良い場合はこの方法でいけそう。

# 方法2：ブラウザからのジョブ実行時に指定する

パラメータ指定ありでの実行だと、パラメータ指定時にURLのdelayの値を変えてリロードして実行すればOK
パラメータ指定なしでの実行だと、ビルドのURLをコピってdelayの値を変えてブラウザに指定する。

手動実行の場合はこの方法でコントロールできそう。

# 方法3：リモートでのジョブ実行時に指定する

以下のような感じで実行する。

```bash
# パラメータ無し、認証なし
$ curl '[Jenkins URL]/job/[jobname]/build?delay=60sec'

# パラメータ無し、認証あり(トークン) 
$ curl '[Jenkins URL]/job/[jobname]/build?token=[token]&delay=60sec'

# パラメータ有り、認証なし
$ curl '[Jenkins URL]/job/[jobname]/buildWithParameters?delay=60sec&[parameters]'

# パラメータ有り、認証あり(トークン)
$ curl '[Jenkins URL]/job/[jobname]/buildWithParameters?token=[token]&delay=60sec&[parameters]'
```

方法4がダメなので遅延時間を可変にしてジョブを手動以外で実行したい場合はこの方法しかなさそう。
ジョブを指定した時間に実行させることにも使えるのかな。

## はまった

URLを''で囲っていなくて意図したパラメータが反映されていなかった。
シェル上で&が特別な意味を持ってしまうので後ろのパラメータが無視されていたのが原因。

# 方法4：[失敗]Parameterized Trigger Pluginで指定する

[Parameterized Trigger Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin)でパラメータにdelayを指定してやろうとしたが出来なかった。
Predefined Parametersでdelay=60secなどと指定したが効かなかった。
うまく指定できないのだろうか。
BasecampのText Documentsに画像を埋め込む方法


ウェブ上からアクセスできる画像に対してブラウザでD&Dするとembedできます。

[Adding files](https://basecamp.com/help/guides/projects/files) から画像をアップロードします。ローカルにあるファイルはText Documentsからは見えないので埋め込めません。

![](https://basecamp.com/help/images/projects/file-upload-list.png)

アップロード先はどこでもいいです。既存のページの画像などもD&Dできます。

![スクリーンショット 2014-10-09 2.06.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/4c0f7ba8-e7fd-4722-f9d3-ce5498037624.png "スクリーンショット 2014-10-09 2.06.07 PM.png")

![スクリーンショット 2014-10-09 2.06.19 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/c770372e-1c6e-d49a-d2ca-65d70ffe9ccb.png "スクリーンショット 2014-10-09 2.06.19 PM.png")

アップロードしたファイルを開いて、別のウィンドウで編集しているText Documentsに向けてD&DすればOKです。

## 例:

![スクリーンショット 2014-10-09 2.00.03 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/296a81ee-70e0-7c35-ef56-fa28efd22648.png "スクリーンショット 2014-10-09 2.00.03 PM.png")
git, github操作覚え書き

自分用のgit操作メモ．

# ローカルmasterをリモートmasterにそろえたいとき
```
git fetch origin
git reset --hard origin/master
```

# その際，現在の作業を他のブランチに残しておきたいとき
```
git commit -a -m "Saving my work, just in case"
git branch my-saved-work
```

# リモートブランチからローカルブランチを作成
リモートに存在するブランチ名を指定するだけ．
```
git checkout branch-name
```

# ローカルブランチの削除
```
git branch -d branch-name
```

# リモートブランチの削除
```
git push origin :branch-name
```

# リモートを含めたブランチ一覧
```
git branch -a
```

# 削除済みリモートブランチをリストから消したいとき
リモートブランチを削除した環境以外ではリンクが残ってしまうことがある．下記コマンドで解決．

```
git fetch --prune
```

# コミットをまとめたいとき

```
git rebase -i <hash>
```

```
$ git rebase -i HEAD~~
```
でHEADからHEAD~~までの修正ができる．

```
$ git rebase --abort
```
で作業をキャンセル．



# 直前のコミットメッセージの修正

```
git commit --amend -m "new message"
```

# タグをつける

```
git tag -a 1.0.0 -m 'message'
```

# タグ情報をリモートにプッシュ

```
git push --tags
```


# References
- http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
- http://www.backlog.jp/git-guide/reference/remote.html
- http://blog.koogawa.com/entry/2014/03/08/121751
- http://d.hatena.ne.jp/rela1470/20111201
codegangsta/cliでサブコマンドをとらないコマンドをつくる


GoのCLI作成用モジュールの[codegangsta/cli](https://github.com/codegangsta/cli)は

```
$ mycmd list
$ mycmd add hoge
$ mycmd remove hoge
```

のようなサブコマンドを取るのが前提になっているようで、サブコマンドを何も登録しなくても`help`サブコマンド（サブコマンドごとのhelpを表示するサブコマンド）がデフォルトで設定され、helpも次のように表示される。

```
$ mycmd -h
NAME:
   mycmd - A new cli application

USAGE:
   mycmd [global options] command [command options] [arguments...]

VERSION:
   0.0.0

COMMANDS:
   help, h      Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h           show help
   --version, -v        print the version
```

サブコマンドいらないのでオプション以外は全部argsとして受け取るようなコマンドを作りたい、でもFlagsとかshow helpの機能は便利なのでcodegangsta/cliを使いたい。

まずはデフォルトのhelpコマンドを無効にする。

```go
func main() {
	app := cli.NewApp()
	app.Name = "mycmd"
	app.HideHelp = true // これ
	app.Action = func(c *cli.Context) {
		log.Println(c.Args())
	}
	app.Run(os.Args)
}
```

HideHelpをtrueにすると`--help`のフラグもなくなるので、こっちは有効にしたい。`cli.HelpFlag`を`Flags`に追加する。

```go
app.Flags = []cli.Flag{
	cli.HelpFlag,
}
```

これで期待通りの動作にはなるんだけど、helpメッセージは相変わらずサブコマンドを取るようなメッセージになるので、これも書き換える。

```go
cli.AppHelpTemplate = `NAME:
   {{.Name}} - {{.Usage}}

USAGE:
   {{.Name}} [options] [arguments...]

VERSION:
   {{.Version}}{{if or .Author .Email}}

AUTHOR:{{if .Author}}
  {{.Author}}{{if .Email}} - <{{.Email}}>{{end}}{{else}}
  {{.Email}}{{end}}{{end}}

OPTIONS:
   {{range .Flags}}{{.}}
   {{end}}
`
```

これでオプション以外の引数はArgsになってhelpメッセージはこうなる。

```
$ mycmd --help
NAME:
   mycmd - A new cli application

USAGE:
   mycmd [options] [arguments...]

VERSION:
   0.0.0

OPTIONS:
   --help, -h           show help
   --version, -v        print the version
```
Oculusをつけている時と外している時の判定をジャイロで判断させてみる

Oculusをつけている時と外している時の判定をとりたいと思うんだけども
デバイスくっつけないで何か判定できないかな？っと思った時にジャイロで判断させようと思います。

ただ、Oculusをそこら辺に置いておいても微妙にジャイロが判定されてしまうので
回転値(0,0,0)で考えると失敗してしまいます。
そこで、Quaternion.Angleを使って角度が0.1よりも動いたのか、それとも動いてないのかでOculusをユーザーがつけているのかどうかを判定する事にしました。

判定するカメラは、OVRCameraControllerの子にあるレフトカメラを使いました。
![スクリーンショット 2014-10-09 13.25.50.png](https://qiita-image-store.s3.amazonaws.com/0/38279/2cc0526a-c5e7-3204-ace2-ce622c4803e8.png)

※サンプルとしては、適当にカウントアップさせて値を超えたら別シーンへ移動としています。

```csharp
using UnityEngine;
using System.Collections;

public class OculusGyroStatus : MonoBehaviour {
    //セッティング
    private Transform CameraLeft_; 
    //角度
    private Quaternion prevRotation;
    //動いてるのか、止まっているのかを判断する為のカウント
    private float count = 0;
    //スタート時間からの差分をはかる為のフラグ
    private bool flg = false;
    
    void Start () {
         //OVRCameraControllerの子にあるレフトカメラを参照にする
        CameraLeft_ = transform.FindChild ("CameraLeft");
    }
    
    void Update () {        
        //現在のレフトカメラと保存している回転角度を測定して何度なのか調べる
        float angle = Quaternion.Angle(CameraLeft_.rotation, prevRotation);
        
        if (angle < 0.1f)
        {
            if (flg == false)
            {
                count++;
                if (count >=  1000)
                {
                    NextScene();
                }
            }
            
        } else
        {
            count = 0;
        }
        //カメラの回転を保存する
        prevRotation = CameraLeft_.rotation;
    }
    
    void NextScene(){
        flg = true;
        Application. LoadLevel("nextscene");
    }
}
```

これも、ソース自体はかなり簡単ですね。
Firefoxの開発ツールでページ全体のスクリーンショットを作成する

Firefoxの32より開発ツールにページ全体のスクリーンショットを撮影する機能が追加され、アドオンなしで、ページ全体のスクリーンショットを作成することができるようになりました。

このエントリでは、スクリーンショットを作成する手順を記述します。

開発ツールの設定(①)を開き、「ページ全体のスクリーンショットを撮影する」(②)にチェックを入れます。チェックを入れると、カメラのアイコンが表示されます。

![Qiita_1.png](https://qiita-image-store.s3.amazonaws.com/0/9610/0a11e143-abd8-f7d8-8272-4511e130a855.png)

カメラのアイコンをクリックすると、ブラウザーの既定のダウンロードフォルダーにファイルが保存されます。アイコンをクリックした時の押した感があまりありませんが、スクリーンショットはちゃんと取れているので連射しなくても大丈夫です。

![Qiita_2.png](https://qiita-image-store.s3.amazonaws.com/0/9610/f3b1a1c3-4e14-b534-9249-29330f7809a0.png)

![Downloads_1.png](https://qiita-image-store.s3.amazonaws.com/0/9610/6e0eaac5-ca30-9e5d-faba-31a532a6785d.png)
Rubymineでindex作成対象からフォルダを除外する


# やり方
除外するフォルダで右クリック→Mark Directory As→Excluded

![スクリーンショット 2014-10-09 13.01.11.png](https://qiita-image-store.s3.amazonaws.com/0/9186/e0f6adbb-7729-cb61-e06c-16922a53efa0.png "スクリーンショット 2014-10-09 13.01.11.png")

# 復活の方法
preferences(cmd + ,)→Project StructureでExcluded Folderがあるのでそこで戻したい奴の右の×をクリック

ここでexcludedの指定も出来る。

![スクリーンショット 2014-10-09 13.02.49.png](https://qiita-image-store.s3.amazonaws.com/0/9186/42e874b7-b7d3-63c4-73c8-fb863aa929b7.png "スクリーンショット 2014-10-09 13.02.49.png")
コライダーの範囲内か範囲外なのかを取得して動画を再生させる

Unityでコライダーの範囲から出てしまった時に動画を再生させてサンプルを作ってみました。
こんな感じでカメラがcubeのボックスコライダーを出てしまった時に動画を再生させてみます。

![スクリーンショット 2014-10-09 12.58.18.png](https://qiita-image-store.s3.amazonaws.com/0/38279/c3379537-1f66-1a98-0d73-add59ee80d5f.png)



```csharp
using UnityEngine;
using System.Collections;

public class TestTriggerMovie : MonoBehaviour {
    //settings
    public GameObject _trigger;
    public GameObject _target;
    //objects
    private Bounds TriggerBounds;

    void Start ()
    {
        TriggerBounds = _trigger.transform.collider.bounds;
        _target = this.transform.FindChild("Plane").gameObject;     
    }

    void Update () {
        this.transform.position += new Vector3(0, 0, 1); 
        Vector3 pos = this.transform.localPosition;
        //Debug.Log(pos);    
        if (TriggerBounds.Contains(pos) == false)
        {
            Debug.Log("Fire");
            MovieTexture movieTexture = _target.renderer.material.mainTexture as MovieTexture;
            //movieTexture.loop = true;
            movieTexture.Play();
        } 
    }

}
```
このような感じでカメラを出たら動画が再生されるようにしました。
ちなみに、カメラの子にしているPlaneのマテリアル設定は、particles/Additiveにしています。

![スクリーンショット 2014-10-09 13.01.15.png](https://qiita-image-store.s3.amazonaws.com/0/38279/8f8d6ed5-ac40-837e-5cef-b8a9981526b3.png)

とまあ、毎度の事ながらすごく簡単ですね。
Ruby-Java BridgeのMacへのインストール

# Ruby Java Bridgeとは

Ruby から Java の機能を呼び出す機能をもったソフトウエアで、[rjb](https://github.com/arton/rjb)というGemが存在します。

インストールにちょっとはまったので備忘録

# インストール

```
xcode-select --install
```

## Java SE6 Runtime

Java SE6のランタイムを入れないとダメみたい。

下記URLからインストールできます。

- http://support.apple.com/kb/DL1572?viewlocale=en_US&locale=en_US

[2014年12月11日 23:26追記]
Intel x86 Emulator Accelerator が Rev.5 になってインストーラがちょっと変わった

この記事は Mac 向けです。

Android のエミュレータには、arm と atom と mips の 3 つの CPU があって、atom に関しては、Intel が配信しているアクセラレータを SDK Manager でダウンロードし、dmg をマウントしてインストールするようになっています。この辺の作業の話はネットに沢山転がっているのでそちらを参考にしてください。

さて、最近(昨日今日くらいの話) そのアクセラレータである Intel x86 Emulator Accelerator(HAXM) のインストーラのバージョンが上がり、Rev.5 になりました。更新されたので中身を見に行ってみると、インストーラの dmg ファイルが 2 つに増えていることがわかると思います。

以下のような名前の dmg ファイルがあります。

![スクリーンショット 2014-10-09 12.42.49.png](https://qiita-image-store.s3.amazonaws.com/0/31829/b9a8b626-7442-4c66-004e-9a73fd8cffc3.png)

`IntelHAXM_1.1.0_below_10.10.dmg`
`IntelHAXM_1.1.0_for_10.10.dmg`

below_10.10 と for_10.10 の `10.10` は MacOS X のバージョン番号で、つまり、Yosemite 向けとそれより前のバージョン向けとで dmg が異なっています。

Yosemite はまだ正式リリースされていませんが、これから HAXM をインストールされる方やインストールし直す方はご注意くださいませ。

changelog にも以下のような記述があります。

> ```On Mac, two *.dmg files will be copied to the folder, 1 for 10.9 and below, the other for 10.10, users can choose according to the host Mac OS version. 
```

ちなみに今回のアップデートでは、以下の対応が含まれています。

> `-Add 64 bit Guest Support - Able to boot 64 bit Kernel and User space`
OS バージョン別、iTunes Store(itms)スキーマの検索エンドポイント

OS バージョン毎に変わるので調査メモ。

## iOS 6
http://itunes.apple.com/WebObjects/MZSearch.woa/wa/search

## iOS 7
itms://search.itunes.apple.com/WebObjects/MZSearch.woa/wa/search

## iOS 8 
itms://itunes.apple.com/WebObjects/MZStore.woa/wa/search

※iOS 8 ではタブが選択されない。
Ruby2.2 ではアレが死ぬほど使いやすくなるの！

そうです、`Matrix`（行列）クラスに色々入る予定のようです.

....

いやもっと伝えるべきモノが他にあるとの怒号が今にも聞こえて来そうですが...

![20140702162053.jpg](https://qiita-image-store.s3.amazonaws.com/0/30440/a7fff4f4-2d5c-0630-029e-5e7cb92d31cc.jpeg)


「すみません今日の所は行列の紹介をさせて下さい.」

多くの方は興味もないであろうけど、

Rubyには行列やベクトルを扱う `Matrix` クラスというものがありまして、

Ruby2.2では色々新機能やバグfixが入るようです.

### **「行列ベクトル演算するならRubyよね」**

と言われるくらいのモノにはなるのではないでしょうか？

本日はRuby2.2以前にあるものも含め`Matrix`のマジですごい所を紹介します.

## 使わないともったいない！すごいMatrix, 楽しく学ぼう！

### 1. LU分解
LU分解が出来るという事は...

#### n元連立方程式をいとも簡単に解く事が出来ちゃうの

```rb
# 2x + y = 2
# x + 2y = 3

Matrix[
        [2, 1],
        [1, 2]
      ].lup.solve([2, 3])

# => Vector[(1/3), (4/3)]

```

ステキやん？

(2.1にもあります.）

### 2. ラプラス展開
これは推したい、色々な数値計算ソフトを使ってきましたが、

ラプラス展開を標準でのせているものは多くはないのでは？

（その割に使用頻度高い）

しかも

展開に用いる行、列の要素は数字に限らなくて、

`*` が定義されているオブジェクトが納められている行か列に対して展開出来ます.

無駄にスゲー.

####だからこんな事が出来ちゃうの

```rb
v1 = Vector[1, 0]
v2 = Vector[0, 1]

Matrix[
        [v1, v2],
        [2, 3]
      ].laplace_expansion(row: 0)

#=> Vector[3, -2]
```

`row: n` で `n行`沿いの、`column: n` で `n列`沿いの展開というインターフェイスの良さ.

ステキやん？

(2.2で入ると思われます.）

### 3. 余因子展開
非常によく使われる演算の一つ、余因子展開がついに実装されました.

```rb
Matrix.diagonal(9, 5, -3, 4).cofactor(1, 1)
# => -108
```
統計解析で分散共分散行列を扱う時など便利ですネ！

(2.2で入ると思われます.）

### 4. 余因子行列
こちらはパッチを見ていただいてる最中で、まだ分かりませんが入れたいと思っています.

```rb
Matrix[ 
        [7, 6],
        [3, 9]
      ].adjugate

# => 9 -6
#    -3 7

```

行列式に対する微分演算に関する事や逆行列との関係など重要なかなり重要な性質をもつ演算の一つです.

(僕がちゃんとやれば2.2で入ると思われます.）

### 5. スペクトル分解

アノ、対角行列と固有値行列に分けるアレです.

きわめて大事ですよね、

```rb
A = Matrix[
            [-1, 2], 
            [-6, 6]
          ].eigensystem

P, D, P_inv = A.eigensystem

(P * D * P_inv).round(5) == A

#=> true
```

ステキ

（Ruby2.1 にも入ってる）

### 6. 行列式や逆行列などその他基本演算も当たり前

とりわけ触れる必要は無さそうですが、基本的な線形演算は大体あります.

```rb

# 行列式
Matrix[
        [7, 6],
        [3, 9]
      ].det
# => 45

# 階数
Matrix[
        [7, 6],
        [3, 9]
      ].rank

# => 2

# 逆行列
A = Matrix[
            [7, 6],
            [3, 9]
          ]

A * A.inv == Matrix.I(2)
# => true

v1 = Vector[1,2,3]
v2 = Vector[4,5,6]

# 内積
v1.inner_product(v2)
# => 32

# 外積
v1.cross_product(v2)
# => Vector[-3, 6, -3]

...

```
### 7. 複素行列も当たり前
今までお話した事はすべて、複素行列に対しても言えます！！

（Rubyの複素数は地味にすごい）

#### エルミート転置とかユニタリ行列とかも楽勝に扱えちゃうの

```rb
A = Matrix[
            [2i, 3],
            [2, 5i]
          ]
A.conjugate
# => -2i 3
#    2 -5i


A = Matrix[
            [0, (0+1i)],
            [(0+1i), 0]
          ]

A.unitary?
# => true

```

* Ruby2.1から複素数を`2i`の様な形式で扱える（！！

さてこんな素晴らしい Ruby 2.2 は今年の12月のクリスマス？にリリース予定らしいです.

自前でビルドすれば実際にいじくる事も出来るので、是非いじくり倒してみるとよいです！
（プレビュー期間？とやらなので）


行列に限らずもっと素晴らしいモノが沢山入っているのでその辺りも気が向いたら紹介します！



後、行列や`Math`周りで欲しい機能があったら言って頂ければ僕が代わりにパッチ投げますヨ
（コミッターでも何者でもない僕ですが....この辺りはもっと盛り上げたいです.）

おやすみ.
Excelのセル書式と長さzeroの文字列の関係について

書式により、長さzeroの文字列の扱いが変わるのに気づいたので記念に投稿♪

イミディエイトウィンドウにて

sheets(1).cells(2,2)=null
sheets(1).cells(2,3)=""
?(sheets(1).cells(2,2)=sheets(1).cells(2,3))
True

まぁ・・・こんな結果が帰ってくる。

PG的に null="" ってのはものすごく違和感があるのだが、
ここで、該当セルの書式を 標準 から 文字列に変更し、
イミディエイトウィンドウより同じコトをやってみる。

sheets(1).cells(2,2)=null
sheets(1).cells(2,3)=""
?(sheets(1).cells(2,2)=sheets(1).cells(2,3))
True

結果は変わらない。ココまでは良いんだけど・・・

sheets(1)にて CTRL+矢印キーを押下したとき、書式を文字列
とした場合は

sheets(1).cells(2,3)

でアクティブセルが停止する。
Excelから見たとき、ココには何か入っているらしい。

書式を 標準 に戻して、DELキーによりクリア、再度実行すると
アクティブセルは停止しなくなる。
PHP7調査(4)メモリマネージャの書き直し

PHP7からメモリマネージャが一新されます。これはDmitryが新規に書いたもので、masterブランチには2014-08-26に取り込まれています。

https://github.com/php/php-src/pull/777 に性能比較が書いてあるんですが、アプリケーションによっては5%から10%の性能アップとなっており、すごい成果だといえるでしょう。

## 概要

内容についてどうこう言えるほどの知識は無いのですが、`Zend/zend_alloc.c`の先頭に次のようなコメントがありました。「jemallocやtcmallocからアイデアをもらった」だそうで、最近の速いmalloc実装と同等の実装を行ったということのようですね。

```c
/*
 * zend_alloc is designed to be a modern CPU cache friendly memory manager
 * for PHP. Most ideas are taken from jemalloc and tcmalloc implementations.
```

## 速度の比較

開発最新版のPHPでは、環境変数USE_ZEND_ALLOCを0に設定することで新規実装したmallocを使わず、システムが提供するmallocを使うことができます。

この両者の性能を実際に比較してみましょう。下記はMacOSX 10.9.5（Mavericks）上での結果です。

```
$ php -v
PHP 7.0.0-dev (cli) (built: Oct  1 2014 18:09:49)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.8.0-dev, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
$ php Zend/bench.php
simple             0.093
simplecall         0.025
simpleucall        0.054
simpleudcall       0.058
mandel             0.263
mandel2            0.327
ackermann(7)       0.074
ary(50000)         0.008
ary2(50000)        0.010
ary3(2000)         0.120
fibo(30)           0.175
hash1(50000)       0.017
hash2(500)         0.018
heapsort(20000)    0.071
matrix(20)         0.067
nestedloop(12)     0.155
sieve(30)          0.043
strcat(200000)     0.010
------------------------
Total              1.587
$ USE_ZEND_ALLOC=0 php Zend/bench.php
simple             0.093
simplecall         0.030
simpleucall        0.059
simpleudcall       0.057
mandel             0.264
mandel2            0.326
ackermann(7)       0.082
ary(50000)         0.008
ary2(50000)        0.007
ary3(2000)         0.119
fibo(30)           0.186
hash1(50000)       0.027
hash2(500)         0.018
heapsort(20000)    0.062
matrix(20)         0.063
nestedloop(12)     0.157
sieve(30)          0.048
strcat(200000)     0.023
------------------------
Total              1.629
```

テスト内容によって差はありますが、新しいmallocの方が総じて速いと言えそうです。
BIG-IPで故障したDiskが情報知りたい

<h2>便利コマンド</h2>
```
[admin@BIG-IP:/S1-green-P:Active] ~ # smartctl -i /dev/sda
smartctl 5.39.1 2010-01-28 r3054 [i686-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     WDC WD3000BLHX-01V7BV0
Serial Number:    WD-XXXXXXXXXXXX
Firmware Version: 04.05G04
User Capacity:    300,069,052,416 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Thu Oct  9 10:48:34 2014 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

```

さらに、下記コマンドでもSerialがわかる！

```
[admin@BIG-IP:/S1-green-P:Active] ~ # tmidiag -s
info: Disk summary. 
DRIVES
name  id                            disk  bus  KiB         cylinders flags host   sn                            
----  --                            ----  ---  ---         --------- ----- ----   --                            
HD1   ATA     WDC WD3000BLHX-0      sda   scsi 293036184   36481     BF.   scsi0  WD-XXXXXXXXXXXX               

(Flag legend: B=boot, F=fixed, H=hpa-error)

DMRAID
======
dm device     array name          type      
---------     ----------          ----      

block device  array name          
------------  ----------       
```

こうやって、Tipsを増やしていくか。
以上っす(｀･ω･´)ゞ

参照先URL
[disk errors, how to determine which slot](https://devcentral.f5.com/questions/disk-errors-how-to-determine-which-slot)
JavascriptBattleのルールを日本語訳してみた

[ミラー](http://dev.jgs.me/posts/translated-javascriptbattle-rules-in-japanese/)

https://github.com/JavascriptBattle/hero-starter

JavascriptBattle という AI を作って戦わせる系のゲームを発見して、結構面白そうだったので遊んでみている。

参加するのは簡単で、[Javascript Battle](http://www.javascriptbattle.com/) から Github のアカウントで Join できる。Join したら、[JavascriptBattle/hero-starter](https://github.com/JavascriptBattle/hero-starter) を fork して、`hero.js` を書き換えて push すれば OK。

最初は `hero.js` でコメントアウトされている移動関数を書き換えて試していくとなんとなく掴める。とはいえ、ルールをちゃんと分かってないと AI つくるもなにもないので、ちゃんと読むついでに[日本語訳](https://github.com/e-jigsaw/hero-starter/blob/358cfaa45d11aeba50359b9171b135e06e40cb0f/RULES.ja.md)してみることにした。合ってるか分からないので誰かチェックしてもらえると嬉しい。いつでも PR あげてください。

ルールとしては結構単純で、自分がなるべくダメージくらわないように敵ヒーローを殴るプレイか、マイン掘って1250ターン耐えるか、みたいなあたりが大きな戦略としてあって、それを基にどんな AI を作るかというところがポイントになるとおもう。

CLI だと将棋盤みたいな味気ない画面なんだけど、Web だとチマチマヒーローたちが動くプレイヤーもついてるので面白い。
チームで Eclipse を使うときのdefault設定を定める

チームで Eclipse を使うときのワークスペースに残る設定をどうにかすべく調べた。

Eclipse起動時に(毎回)必ずプラグインの設定を行うことが出来たのでとりあえず入れてみた。

eclipse.iniの-vmargs前に

```
-pluginCustomization
plugin_customization.ini
```

を追加する。

plugin_customization.ini を作成する

```ini:plugin_customization.ini
# タブでスペースを挿入 (一般＞エディター＞テキスト・エディター)
org.eclipse.ui.editors/spacesForTabs=true

# テキスト・ファイルのエンコード (一般＞ワークスペース)
org.eclipse.core.resources/encoding=UTF-8

# 新規テキスト・ファイルの行区切り文字 (一般＞ワークスペース)
# 動かない…
# see: http://www.eclipse.org/forums/index.php/t/369308/
# org.eclipse.core.runtime/line.separator=\n

# コメントはコンバートしない (プロパティエディタ)
jp.gr.java_conf.ussiy.app.propedit/notConvertComment=true
```


# 参考したサイト

http://d.hatena.ne.jp/ihiroky/20110627

http://d.hatena.ne.jp/kompiro/20090705/1246776498
https://gist.github.com/kompiro/140852/revisions
AppleがSwiftアプリ開発の入門ビデオを公開


[![Building_Your_First_Swift_App_Video_-_Swift_Blog_-_Apple_Developer.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/764a9952-ab4b-ccc7-3e7a-f8c2176d3745.jpeg "Building_Your_First_Swift_App_Video_-_Swift_Blog_-_Apple_Developer.jpg")](https://developer.apple.com/swift/blog/?id=16)


Xcode6で新規プロジェクトの作成から始めまる、手取り足取り丁寧に解説された６分ほどのビデオです。AppleのSwift啓蒙活動は気合が入っていますね！


[Building Your First Swift App Video](https://developer.apple.com/swift/blog/?id=16)

Swiftとはまったく関係がありませんが、ストリートボードでビューコントローラを簡単にナビゲーションコントローラに内包するやり方がチップスとして参考になりました。

![Building_Your_First_Swift_App_Video_-_Swift_Blog_-_Apple_Developer.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/a01e40d0-9442-d494-84eb-f831341f42d6.jpeg "Building_Your_First_Swift_App_Video_-_Swift_Blog_-_Apple_Developer.jpg")
xamppのphpMyAdminをローカルネットワークに公開する


```C:\xampp\apache\conf\extra\httpd-xampp.conf
<LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
	ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
	Order deny,allow
	Deny from all
	Allow from 127.0.0.0/8
	Allow from 192.168.11.0/24  <--公開する相手のIPアドレス
</LocationMatch>
```
var の使いどころ

varって便利そうだけど、使い方を誤りやすい臭いがプンプンする。
ということで改めて調べて整理してみた。

#var とは
VB等でお馴染みのVariant型ですが、C#にも var というキーワードがあります。

```csharp
var patientName = "山田太郎";    // stringとして扱われる
```
　
C#における var は、VBにおけるVariant型とは違って、コンパイル時に型の評価が行われます。
なので、以下のようなVBではコンパイルエラーとならないコードも、

```java:varSamle.bas

Dim a, b

a = 1
b = "2"
Debug.Print a + b    // 3

a = "1"
b = 2
Debug.Print a + b    // 3

a = "1"
b = "2"
Debug.Print a + b    // 12

```
　
C# で同様のコードを書くと、コンパイルエラーとなります。

```csharp:varSample.cs

var a = 1;
var b = "2";

a = "1";   // エラー  型 'string' を型 'int' に暗黙的に変換できません
b = 2;    // エラー  型 'int' を型 'string' に暗黙的に変換できません

a = "1";    // エラー  型 'string' を型 'int' に暗黙的に変換できません
b = "2";

```

#var を使うべきシーン

例えば以下のようなコードがあるとします。

```csharp
Dictionary<string, List<StringBuilder>> stringToBuilderMap = new Dictionary<string, List<StringBuilder>>();
```
上記は Dictionary\<string, List\<StringBuilder>> という型の「stringToBuilderMap」という変数を初期化しています。このように、

- 単なる初期化なのにきわめて長いコードになる場合
- 長い文字数の同じ型を２回も書かなければいけないような場合

は、人間の目には非常に冗長なコードとなり、読みやすさを損ねることがあります。

このような場合に var を使うことで可読性を損ねることなく問題を解消できることがあります。
以下は同じ内容のコードを var を使って書いています。

```csharp
var stringToBuilderMap = new Dictionary<string, List<StringBuilder>>();
```
　
つまり、**右辺で初期化が行われ** かつ **その変数の型が人間の目から見て自明**な場合が、
var の使いどころであると言えます。

~~**決して手抜きで var を使用して、可読性を損ねるような使い方をしないようにしましょう。**~~

なので、以下のようなコードでは var は使うべきではないです。

```csharp
var targetInfo = GetTargetInfo();    // 何の型かわからない
```
 
~~また、私は以下のような場合でも var を使わないようにしています。~~
~~var ptid = "00001";    // 手抜きしないで string って書こうよ~~

変数の型が代入の右側を見て明らかである場合等はむしろ var を使えとの旨が[MSDNのコーディング規約](https://msdn.microsoft.com/ja-jp/library/ff926074.aspx)にありました。
なので今後は、型が明確に読み取れる場合は基本的に var を使っていこうと思います。
※ @HazakuraKeitaさん、ご指摘ありがとうございました。

```charp
var id = "00001";
```

#その他の注意点

var を使って宣言する変数は初期化されなければいけない。

```csharp
var a;  // コンパイルエラー
```

なので、var の複数宣言もできません。

```csharp
var a, b;  // コンパイルエラー
```

#参考
[varによる変数宣言とコレクション初期化子](http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_03/csharp30_03_02.html)
[[雑記] 型推論の是非](http://ufcpp.net/study/csharp/sp3_var.html)
共変・反変・上限境界・下限境界の関係性まとめ

# はじめに
ScalaはJavaと違って共変・反変が定義できるため、型パラメータの取り扱いが一段と複雑になっている（なおJavaでは配列のみ共変の振る舞い）。
Scaladocを読んでは[+A]、[-B]、[A1 >: A]、[B1 <: B]のようなものを華麗にスルーする毎日にさよならをつげるためにまとめてみた。
※なお、共変・反変・上限境界・下限境界とはなにか、どんな効能があるのかについては事前に知っているものとし細かい説明は省略している。

とりあえず先にまとめておくと、これを覚えておけばScalaにおける型パラメータを使ったプログラムにおいて困ることはだいぶ減ると思う。
以降でそれぞれの理由を見ていくことにする。

|変位|指定可能位置|制約|制約突破条件|
----|----|----|----
共変[+T]|主に戻り値|引数型に使用出来ない|下限境界定義により設定可能 [T1 >: T]
非変[T]|どこでも|共変や非変のような代入が出来ない|無し
反変[-T]|主に引数|戻り値型に使用出来ない|上限境界定義により設定可能 [T1 <: T]

なお、説明のために以降では以下のクラスを使うこととする。

```scala
class Creature
class Animal extends Creature
class Cat extends Animal
```

# 反変と共変の制約
## なぜ反変定義の型は戻り値型に使用できないのか
上記のCreature - Animal - Catといったクラスを取りうるコンテナクラスとして以下のものを用意した。

```scala
class Container[-T]
```

ここでContainer[-T]の型Tが戻り値型に指定できるとするとどういう問題が起こるかを考えてみる。

その前に当たり前すぎるかもしれないがひとつ確認しておきたいことがある。
仮にこのような定義の関数があったとする。

```scala
def foo(x: Animal): Animal
```

この場合、引数および戻り値について以下の二点の事が言える。

- 【原則1】 引数xの型はAnimalなのでAnimal型のインスタンスかCat型のインスタンスを渡すことが可能。間違ってもCreature型インスタンスを渡すことは出来ない。
- 【原則2】 戻り値の型はAnimalなので実際にnewして返すことが出来るのはAnimal型のインスタンスかCat型のインスタンス。間違ってもCreature型インスタンスを返すことは出来ない。

この当たり前過ぎることを踏まえた上で、反変の続きに戻ることとする。

```val c: Container[Animal] = new Container[Creature]```が出来るのが反変だったので表向き、利用者からはTはAnimal型に見えるが実体はCreatureである。
戻り値にTが使えるとすると実体の方からはCreatureインスタンスが返ってくることとなるが、表向きはAnimal。ここで型の矛盾を起こしてしまう（【原則２】に違反する）。これが反変に指定された型が戻り値に使用できない理由である。

一方引数はというと、利用者からはAnimalに見えているので引数に渡ってくる可能性があるのはAnimalとCat、しかし実体はCreatureなので当然それら２つはCreatureのサブクラスであり問題なく受け付けることが出来る。
よって反変は戻り値型には指定できないが引数型には指定できるということになる。

## なぜ共変定義の型は引数型に使用できないのか
基本的には反変の説明の逆となる。

```val c: Container[Animal] = new Container[Cat]```が出来るのが共変だったので表向き、利用者からはTはAnimal型に見えるが実体はCatである。

先ほど同様以下のコードで考えてみると

```scala
def foo(x: Animal): Animal
```

引数にT（今回はAnimal）が使えるとすると、表向きはAnimalに見えているので利用者が渡してくる可能性があるのはAnimalとCat。
しかしTの実体はCatなのでAnimalが渡された場合に対応できない(【原則１】に違反する)。

一方、戻り値の方は、Animal型なので許容できるのはAnimalかCat。今回はCatが返ってくるがAnimalとして利用者側は受け取っても何の問題もない。

# 上限境界と下限境界
## なぜ上限境界を設定すると反変定義した型が戻り値で使えるようになるのか
先に定義を書いておくと、こうすれば使えるようになる。

```scala
class Container[-T] {
  def foo[T1 <: T](x: T1): T1 = x
}
```

【原則２】に則ると、戻り値にはTの型およびそのサブ型のみ来ることを保証してやれば良い。
合わせて、今回の例では来たものをそのまま返す事をやりたいので引数もT1にする必要がある(Tで受け取ってT1で返すことは定義上矛盾するのでコンパイルエラーとなる)。

```scala
val c: Container[Animal] = new Container[Creature]

c.foo(new Creature) // コンパイルエラー inferred type arguments [Creature] do not conform to method foo's type parameter bounds [T1 <: Animal]
c.foo(new Animal) // OK
c.foo(new Cat) // OK
```

## なぜ下限境界を設定すると共変型が引数で使えるようになるのか
基本的には反変の逆になるだけ。
定義はこう。

```scala
trait Container[+T] {
  def foo[T1 >: T](x: T1): Unit
}
```

こちらは【原則１】に準拠するというよりは、最初から色んな物が来ることを想定するように定義しておく、といったところか。

定義上はTまたはTのスーパークラスということだが、Tにはもともとサブクラスも含まれるのでCatも渡せる。
T(Animal)のスーパークラスということはAnyRefなんかも含まれるので、ということはStringもOK。
つまりなんでもOK。

```scala
val c: Container[Animal] = new Container[Cat]

c.foo(new Creature) // OK
c.foo(new Animal) // OK
c.foo(new Cat) // OK

c.foo("hello") // これもOK
```

# Scalaのクラス
## Function1
引数型のT1は反変で戻り値方のRは共変定義。

```scala
trait Function1[-T1, +R] extends AnyRef

abstract def apply(v1: T1): R
```

## List

```scala
sealed abstract class List[+A] extends ...

def contains[A1 >: A](elem: A1): Boolean
```
Android volleyで、JsonObjectRequestを、mapのパラメータでpostできるようにする。

com.android.volley.toolbox.JsonObjectRequest を使ってpostでリクエストしようとしたら、なんかできなかった。
ソースを見てみたら、どうもJSONObject をコンストラクタで渡さないと自動的にgetになるという仕様。
https://android.googlesource.com/platform/frameworks/volley/+/5bd5325bd61414480091b262204f1a45d57c1884/src/com/android/volley/toolbox/JsonObjectRequest.java

私はmapでパラメータを渡したいのです。既存のソースの流用的に。
というわけで、mapのパラメータでリクエストして、JSON形式で返してくれるというクラスを作ってみました。
もっといい方法があったら誰か教えて。

```
package com.gring.volley.toolbox;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonRequest;

import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;

/**
 * JsonObjectRequestを、mapのパラメータでpostできるように対応しました。
 * 
 */
public class JsonObjectRequest extends com.android.volley.toolbox.JsonObjectRequest{

    /**
     * パラメータのマップ
     */
    private Map<String, String> mParams;

    public JsonObjectRequest(int method, String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
        super(method, url, null, listener, errorListener);
        mParams = params;
    }

    @Override
    protected Map<String, String> getParams() {
        return mParams;
    }

    /**
     * リクエストパラメータの形式を、JSON形式ではなく、通常のPOSTに変更する。通常のJSONObjectRequestではこの設定ができない。
     * Request.javaから引用
     * @return
     */
    public String getBodyContentType() {
        return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();
    }

    @Override
    public byte[] getBody() {
        Map<String, String> params = getParams();
        if (params != null && params.size() > 0) {
            return encodeParameters(params, getParamsEncoding());
        }
        return null;
    }
    /**
     * Converts <code>params</code> into an application/x-www-form-urlencoded encoded string.
     */
    private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {
        StringBuilder encodedParams = new StringBuilder();
        try {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
                encodedParams.append('=');
                encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
                encodedParams.append('&');
            }
            return encodedParams.toString().getBytes(paramsEncoding);
        } catch (UnsupportedEncodingException uee) {
            throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
        }
    }
}

```