OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Viewportを利用したWorldPoint(position)の画面外のposition

##ソースコードの一部抜粋

using UnityEngine;
using System. Collections;


public class GM : MonoBehaviour {

	public static Camera mainCamera;

	public static float startWorldPointX;
	public static float endWorldPointX;
	public static float startWorldPointY;
	public static float endWorldPointY;


	void Start () {

		mainCamera = GameObject .FindGameObjectWithTag("MainCamera" ).GetComponent <Camera> ();

		// Viewポートの一番左のX座標
		GM.startWorldPointX = GM.mainCamera.ViewportToWorldPoint(new Vector3 (0.0f, 1.0f, GM .mainCamera. nearClipPlane)).x;
		// Viewポートの一番右のX座標
		GM.endWorldPointX = GM.mainCamera.ViewportToWorldPoint(new Vector3 (1.0f, 1.0f, GM .mainCamera. nearClipPlane)).x;
		// Viewポートの一番上のY座標
		GM.startWorldPointY = GM.mainCamera.ViewportToWorldPoint(new Vector3 (0.0f, 0.0f, GM .mainCamera. nearClipPlane)).y;
		// Viewポートの一番下のY座標
		GM.endWorldPointY = GM.mainCamera.ViewportToWorldPoint(new Vector3 (0.0f, 1.0f, GM .mainCamera. nearClipPlane)).y;
	}
}

##参考画像
![graphics_fundamentals_viewport_3dscene.png](https://qiita-image-store.s3.amazonaws.com/0/18411/5d41c0ef-2de2-247e-18c9-3f8def6f1a5e.png)

##参考サイト
http://answers.unity3d.com/questions/589485/understanding-3d-world-and-gui-camera-space.html
blockレベル要素をinlineにしたときに生じる隙間をなくすCSS

備忘録として。
blockレベル要素をdisplayでinlineにしたときに隙間が生じる。
これの原因はソース内でblockレベル要素を改行しているから。

```html:test1.html
<!-- このように改行していると隙間が発生する -->
<div> hoge </div>
<div> fuga </div>

```

簡単に解決するには改行をなくせばいい

```html:test2.html

<div> hoge </div><div> fuga </div>

```

でもこれじゃ属性とかいっぱい付けたときにひどく可読性が悪くなる。
そこでCSSのletter-spacingで一手間加えて隙間をなくす手法をとる。

```html:test3.html

<!-- まずはインラインにしたい要素を囲む -->
<div id="container">
<div> hoge </div>
<div> fuga </div>
</div>

```

```scss:test.scss

div#container {
  letter-spacing: -.40em;
  div {
    display: inline-block;
    letter-spacing: normal;
  }
}


```

こうするとうまいこと隙間が消えてちゃんと隣り合って横に並んでくれる。
HerokuのNew Relic Add-onが、Heroku Dev Centerの手順に従っても動かないときに


Java、それもMavenプロジェクトをHerokuにデプロイして、New Relicで監視しようとしたのですが、うまくいかなかったときのメモです。

[Heroku Dev Center](https://devcenter.heroku.com/articles/newrelic#java-configuration)に従って設定しても、New Relicが動きませんでした。

現象としては、Setupの画面が表示され、いつまで経ってもアプリケーションの一覧が表示されませんでした。

アプリはJavaのMavenプロジェクトです。

結局、javaagentの設定を```heroku config:set```で設定するのではなく、```Procfile```に書くことで解決しました。
"プログラミングErlang" 8章 練習問題 回答案

ブログ を書いて結果をインターネットに公開しよう! とあったので、公開してみる。

手元の環境だと

- bench(10000, 1000): time=5.7 (6.235) msec.
- bench(1000, 10000): time=4.6 (5.096) msec

大丈夫っぽい。

```erlang
bench(Nproc, Mloop) ->
	Ring = create(Nproc, Mloop),
	start(Ring, testtest).

create(Nproc, Mloop) ->
	spawn(fun() -> create_node0(Nproc, Mloop) end).

start(Pid0, Message) ->
	statistics(runtime),
	statistics(wall_clock),
	Pid0 ! Message.

create_node0(N, M) ->
	Pid0 = self(),
	Pid1 = spawn(fun() -> create_node(2, N, M, Pid0) end),
	loop(Pid1, M),
	{_, Time1} = statistics(runtime),
	{_, Time2} = statistics(wall_clock),
	U1 = Time1 / 1000,
	U2 = Time2 / 1000,
	io:format("time=~p (~p) msec.~n", [U1, U2]).

create_node(N, N, M, Pid0) ->
	loop(Pid0, M);
create_node(I, N, M, Pid0) ->
	PidNext = spawn(fun() -> create_node(I+1, N, M, Pid0) end),
	loop(PidNext, M).

loop(Pid, 0) ->
	%io:format("finished:~p~n", [Pid]);
	void;
loop(Pid, M) ->
	receive
		Any ->
			%io:format("Received:~p~n", [Any]),
			Pid ! Any,
			loop(Pid, M-1)
	end.
```
sudo yum install mysql-devel でインストール出来ない

sudo yum install mysql-devel




Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
base                                                     | 3.7 kB     00:00     
extras                                                   | 3.4 kB     00:00     
pgdg93                                                   | 3.6 kB     00:00     
updates                                                  | 3.4 kB     00:00     
updates/primary_db                                       | 2.0 MB     00:06     
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mysql-devel.x86_64 0:5.1.73-3.el6_5 will be installed
--> Processing Dependency: mysql = 5.1.73-3.el6_5 for package: mysql-devel-5.1.73-3.el6_5.x86_64
--> Finished Dependency Resolution
Error: Package: mysql-devel-5.1.73-3.el6_5.x86_64 (updates)
           Requires: mysql = 5.1.73-3.el6_5
           Installed: mysql-5.5.36-1.el6.remi.x86_64 (@remi)
               mysql = 5.5.36-1.el6.remi
           Available: mysql-5.1.71-1.el6.x86_64 (base)
               mysql = 5.1.71-1.el6
           Available: mysql-5.1.73-3.el6_5.x86_64 (updates)
               mysql = 5.1.73-3.el6_5
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
rubyinstaller for windows de ruby2.1

バイナリがなかったメモ。

##準備
* windowsっぽく [GitHub for Windows](http://windows.github.com/) を使ってみる。

##インストール

+ `Git Shell` を起動してclone、cd

```
$ git clone https://github.com/oneclick/rubyinstaller.git
$ cd rubyinstaller
```

+ rake Task で提供されている

```
$ rake -T
```

+ devkit を確認

```
$ rake devkit:ls
```

+ devkit を指定してコンパイル

```
$ rake ruby21 dkver=mingwbuilds-32-4.7.3
```

+ 配置（ `Git Shell` のデフォは `PowerShell` だった）

```
$ cp -r .\sandbox\devkit C:\Ruby210
$ cp .\sandbox\ruby21_mingw\* C:\Ruby210\. -recurse -force
```

+ `PATH` 追加（[ツール](http://www.rapidee.com/)）

```
C:\Ruby210\bin
C:\Ruby210\mingw\bin
```

## セットアップ等
+ `HOMEPATH` に `.gemrc`
+ `gem update --system; gem pristine --all`
+ `gem update`
など
AndroidのIntel Atom(x86)エミュレータを使う (VT-x有効化でエラー)

　結構躓いたのでメモします。

　前々からSDK Managerに項目があったことは知っていたのですが、一度使ってみたらかなりもっさりしていたのでそれ以来触っていませんでした。
しかし久々に気になって調べてみたら、アクセラレータを使わないといけないと知り、それならもう一度試してみようと思ったのが罠でした。(よく考えたらデバッグ端末たくさんあるから必要なかったんだよなぁ…)

　まず、Android SDKをインストールしていることが前提です。その説明はしないので、別の資料をお読み下さい。次にインストールですが、[Intelの公式資料](http://software.intel.com/en-us/android/articles/speeding-up-the-android-emulator-on-intel-architecture)を併せてお読み下さい。日本語がないので、英語などを読めない人のためにざっくり説明しますと、

[Windows 8.1以外のWindows,Mac]
1. SDK Managerから任意のバージョンの「Intel x86 Atom System Image」と書かれたものと、下方Extras内の「Intel x86 Emulator Accelerator(HAXM)」と書かれたものをチェックします。
2. SDK_PATH\extras\Intel\Hardware_Accelerated_Execution_Manager内にあるIntelHaxm.exe(MacならIntelHAXM.dmg)をクリックし、インストールを行って下さい。
3. インストールが無事成功した場合は完了です。お疲れ様でした。

[Windows 8.1]
上記1において、SDK ManagerからHAXMをダウンロードするのではなく、[ここ](http://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager)から「Hotfix for Windows 8.1 only (1.0.7)」を選択してダウンロードし、インストールを行って下さい。

[Linux]
試していないので、別の資料をお読み下さい。

　といった感じです。ですが、この資料を読んでいる方は恐らくインストール時に「Intel Visualization Technology (VT-x) is not turned on.」などと怒られたのだと思います。他のエラーの場合は、恐らくデバイスが対応していなかったりなので諦めるか他の記事を読んでいただけるとありがたいです。
調べたところ、このエラーが発生するのには、次の2パターンがあるようでした。

1. BIOS(UEFI)設定でVT-xが有効になっていない。(Intel公式資料に書かれているパターン)
2. VT-xを使うソフト(?)がある。

　1番はBIOS設定を変更するだけで大丈夫です。BIOSの起動方法がわからない人は、自分の持っているPCのBIOS起動方法を調べて下さい。BIOSのCPU関連の設定箇所に「Visualization Technology」などの文字があると思うので、それをEnableにしてみてください。極稀に、Disableで有効になるマザーボードがあるらしいので、動かない場合はそちらも試してみてください。
　問題は2番です。もしかするとここで挙げている以外のソフトでもこの症状が起こるかもしれないということをご理解下さい。
　まず、 コントロールパネル→プログラムと機能→Windows の機能の有効化または無効化 の順にクリックし、Hyper-Vにチェックが入っていないか確認して下さい。もしもチェックが入っていた場合は、そのチェックを外して再起動をすれば、VT-xが有効になると思います。
　もしもチェックが入っていなかった場合、Avastを使っていないでしょうか？ Avastの設定→トラブルシューティング→ハードウエアによる仮想化支援機能を利用する のチェックを外し、再起動すればVT-xが有効になると思います。

　いかがでしたでしょうか。Androidのarmeabiのエミュレータは評判が悪いので、できるだけ多くの方がまだマシなx86エミュレータをお使いになればいいなと思います。
(本来x86エミュレータはあくまでNDKを利用した場合にx86での動作を確かめるものだとは思いますが…)

【ソース】
[Speeding Up the Android* Emulator on Intel® Architecture | Intel® Developer Zone](http://software.intel.com/en-us/android/articles/speeding-up-the-android-emulator-on-intel-architecture)
[windows - VT Not Supported when Installing HAXM - Stack Overflow](http://stackoverflow.com/questions/20019231/vt-not-supported-when-installing-haxm)
Chromeを簡易電卓にする。(検索エンジンのカスタマイズでJavaScript疑似プロトコルを使ってみる)

#概要
Google Chromeは検索エンジンを自由にカスタマイズできる。
**chrome://settings/searchEngines**
↑これをアドレスバーに貼り付けると設定ページが開く。 

これに疑似プロトコルが使えることを知ったのでちょっと使ってみた。

##検索エンジンのカスタマイズについて
アドレスバーにキーワードを打ってスペースを押し、検索したい文字列を入力してエンターを押すと
設定したURLの「%s」の部分がその文字列に置換されてアドレスバーに入力される、というだけ。
複数「%s」があれば全て置換される。

普通はこんなふうに登録する。

|項目|入力内容|
|:--|:--|
|名前|ゆーちゅーぶ|
|キーワード|y|
|URL|http://www.youtube.com/results?search_query=%s|

キーワードを打ってスペース、という動作が何となく気持ち良くて好き。
ちなみにアドレスバーにはWindowsなら「ctrl+l」Macなら「command+l」で移動できる。

#簡易電卓にする
`javascript:void(prompt('%s',eval('%s')))`

「1+1」みたいに入力すれば答えが表示される。
これで簡単な計算のためにわざわざGoogle先生を召喚する必要は無いし、答えは即コピーできる。

「"abc".length」とか「"abc".match(/.c/)」みたいに文字列を使うことも一応可能。
(文字列には「"」派なので「'」で囲んだ)

ボタンはどっちも押しても消えるだけ。エンター押しても消せる。
エラーが出たら何も表示されないので注意。

#その他

###コンソールに出力するには
`javascript:console.log("%s")`
コンソールはWindowsなら「control+shift+j」、Macなら「command+option+j」で表示できる。
WindowsではF12を押してConsoleタブを表示するのと同じ。

###検索エンジンで検索するには
`javascript:location.href="http://search.yahoo.co.jp/search?p=" + "%s"`
このままだと全く意味ない。

###JavaScriptを一行実行するには
`javascript:(function(){%s})()`
ブックマークレット作ってるとき、Chromeだと「javascript:」で始まる文字列をアドレスバーに貼り付けると省略されてしまうので。
一行実行したいだけならコンソール使ったほうがいいけど、いちいち表示するのめんどくさいときとか。。

###URLの長さ
とりあえず10000文字では実行できた。
糞長いスクリプトで使うものではないと思うのであまり調べてない。
ちなみに、インデントや改行は消さなくてもそのまま動く。

###応用すればできそうな(気がする)こと
- URLに検索文字列が含まれない検索エンジンで検索する (メソッドがPOSTのとこ)
- 普通は文字化けするサイトでも文字化けせず検索する (URLエンコードがUTF-8じゃないとこ)
- Twitterにつぶやいたりする ⇒ **make_now_justさんが作ってくれました！** [
Chromeの検索バーからツイートしてみた](http://qiita.com/make_now_just/items/c97240692baa1745d4e0)
freebsdのports collectionからのインストールをできるだけほったらかす方法。

freebsdのports collectionからのインストールをできるだけほったらかす方法。

1. 設定をスキップ（デフォルトの設定値を採用）
`make -DBATCH`・・・なんだかんだで一番使える。

2. 事前に全部の設定をする
`make config-recursive`・・・なるべくほったらかしたいけど設定はしたい場合。

3. 以前設定したときの設定値を再利用
`/var/db/ports/`以下の設定ファイルを再利用・・・何台も同じバージョンで環境を複製するときは使えそう。完全自動化するならこれ。でも完全自動化するぐらいならバイナリパッケージ自分で作った方がいいのかな？それともカスタムインストールメディア？？いやいや仮想マシンイメージ？？？夢は膨らむ。

パッケージの設定って「こんな機能があるのか」とか「容量and/orビルド時間節約したいからこの機能はいらないや」とかすごく便利だけど、開発環境みたいにあらかじめ決まった環境を構築する場合はいちいち入力を待たれるとつらい（時間がかかるのはしょうがないとしてもほったらかしたい）。

`-DBATCH`で大量のパッケージをスクリプトでインストールすると、`fsck`コマンドの`-y`オプションを初めて知ったときのような爽快感を得られること請け合い。

あぁカスタムインストールメディア作りたい。やり方知ってる方いらっしゃったら、ぜひ教えてください。(この辺？[release(7)](http://www.freebsd.org/cgi/man.cgi?query=release&sektion=7)）
iOS7でViewController単位でStatus Barを表示したり非表示にしたりする


* `Project-Info.plist`の`UIViewControllerBasedStatusBarAppearance`の **NO** に設定する。
* Status Barの表示を制御したいViewControllerに次のようなコードを追加

```objectivec
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // 表示するときは`setStatusBarHidden`のパラメタを **FALSE** に設定する
    [[UIApplication sharedApplication] setStatusBarHidden:TRUE
                                            withAnimation:UIStatusBarAnimationFade];
}
```
pythonでイテレータをチャンクに分割する

pythonでイテレータをイテレータのチャンクに分割するコードです。リストをチャンクに分割するコードはネットでいくつか見つけましたが、イテレータをチャンクに分割するコードが見つからないので書いてみました。

最初からリストであるものをチャンクに分割するなら、インデックスを使えば良いし、イテレータをリスト化しつつ分割するのも簡単です。ただ、イテレータをイテレータのまま分割するためには、サブイテレータからベースとなるイテレータに対してStopIterationを通知しなければならず、この方法に苦労しました。結局、ちょっと気持ち悪い方法を使っています。

何が気持ち悪いかというと、subiterの中から外に値を渡すために、exhausted = [False]というリストを使っていることです。普通にbool値として持たせると、中から外に書き込めないため、可変オブジェクトであるリストを使っています。pythonの公式ドキュメントの、[itertools.groupby](http://docs.python.jp/3.3/library/itertools.html#itertools.groupby)の参考実装だと似たような状況でclassを使っているので、その方がpythonらしい実装なのかもしれません。

リスト化すると巨大になりすぎ、パフォーマンスに影響するようなケースでも気軽に使えるのが特徴です。

```py3
def chunk(it, n):
    it = iter(it)
    exhausted = [False]
    def subiter(it, n, exhausted):
        for i in range(n):
            try:
                yield next(it)
            except StopIteration:
                exhausted[0] = True
    while not exhausted[0]:
        yield subiter(it, n, exhausted)
```
Cygwin64bitではopensslが動かない

Cygwin(64bit)のopensslパッケージが壊れていました。

```
$ apt-cyg install openssl
$ openssl
(反応なし)
$ echo $?
127
$ openssl --version
(反応なし)
$ echo $?
127
```

最新版のopensslを自前でビルドしてみたけどこれもダメでした。

```
$ wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz
$ tar xvfz openssl-1.0.1f.tar.gz
$ cd openssl-1.0.1f
$ ./config
$ make

gcc -I. -I.. -I../include  -DOPENSSL_THREADS  -DDSO_DLFCN -DHAVE_DLFCN_H -DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM   -c -o cryptlib.o cryptlib.c
cryptlib.c:1:0: エラー: 選択した CPU は x86-64 命令セットをサポートしていません
 /* crypto/cryptlib.c */
 ^
cryptlib.c:1:0: エラー: 選択した CPU は x86-64 命令セットをサポートしていません
<builtin>: recipe for target 'cryptlib.o' failed
make[1]: *** [cryptlib.o] Error 1
make[1]: Leaving directory '/home/DK/src/openssl-1.0.1f/crypto'
Makefile:278: recipe for target 'build_crypto' failed
make: *** [build_crypto] Error 1
```

どうもこれは既知のバグようです。
http://openssl.6102.n7.nabble.com/openssl-org-3110-Adding-support-for-x86-64-Cygwin-td46131.html

v1.0.2で修正が行われているという話です。

これから検証してみます。
並列圧縮(gz,bz2,xz)


# pigz,pbzip2,pixzを使用して並列圧縮

## .tar.gz
tar zvf directory.tar.gz  --use-compress-prog=pigz directory

## .tar.bz2
tar jvf directory.tar.bz2 --use-compress-prog=pbzip2 directory

## .tar.xz
tar Jvf directory.tar.xz  --use-compress-prog=pixz directory

memo: xzの並列圧縮コマンドは、pixzとpxzを比べた場合、pixzの方が良いらしい
https://github.com/vasi/pixz を参照

# Linuxカーネルソースコードを圧縮した時間とファイルサイズの結果

| テストに用いたコマンド                                                        | 時間(CPU)| 圧縮したファイルのサイズ|
|---------------------------------------------------------------------------|---------|-------------------|
| tar zcf linux-3.14-rc4.tar.gz linux-3.14-rc4/                             |18.101   |114M(119322475byte)|
| tar zcf linux-3.14-rc4.tar.gz  --use-compress-prog=pigz   linux-3.14-rc4/ |3.684    |114M(119383009byte)|
| tar jcf linux-3.14-rc4.tar.bz2 linux-3.14-rc4/                            |48.804   |89M(93301912byte)  |
| tar jcf linux-3.14-rc4.tar.bz2 --use-compress-prog=pbzip2 linux-3.14-rc4/ |10.822   |89M(93617487byte)  |
| tar Jcf linux-3.14-rc4.tar.xz  linux-3.14-rc4/                            |3:57.41  |77M(80815884byte)  |
| tar Jcf linux-3.14-rc4.tar.xz  --use-compress-prog=pixz   linux-3.14-rc4/ |53.438   |77M(82428744byte)  |

## テスト環境
- CPU: Intel Xeon E5-1620 v2(Ivy Bridge-EP 4コア)
- MEM: 32GB
- メモリ上(/tmp以下)にLinuxカーネルソースコードを置いた。
言語別 0埋め数字を作成する方法


すぐ忘れるのでメモってみたらほとんど書き方が同じだった、っていう。

## Java

コードそのものはシンプルだけど前後に書くことが多い…

```
System.out.println(String.format("%04d", 10));
```

## Groovy

Javaよりお手軽だけど実行までにちょっとタイムラグがあるのが難点…

```
groovy -e "printf('%04d', 10)"
```

## Ruby

rubyマジで自由すぎる。特に3つめ。

```
ruby -e "puts format('%04d', 10)"
```

```
ruby -e "printf('%04d', 10)"
```

```
ruby -e "puts '%04d' % 10"
```

## shell

shellでも出来るとは思わなんだな。

```
printf %04d 10
```
Cythonで内部的にC++のvector、unordered_mapを用いて処理を高速化する


## 概要

[Cython](http://cython.org/)を用いると、Pythonを事前に等価なC/C++コードにコンパイルして利用することができます。Pythonの文法はほぼ全てサポートされており、既存のPythonコードをそのままCythonでコンパイルするだけで、数十％の実行速度が向上するとのことです。

Cythonの面白い点の一つは、CやC++のデータ型を直接Python(Cython)コードから利用できるようになる点です。

今回は、Pythonのdictの代わりに、C++のunordered_map、listの代わりにvectorをCythonコードから直接利用してみます。

## 実験

それぞれ、配列としてlistとdict、連想配列としてvectorとunordered_mapを使用して、100万回ずつintのキー配列を生成し、それらをキーとして連想配列に代入及び参照することで、パフォーマンスを比較してみます。

Cythonコードでは、.pyの代わりに.pyxを用いるため、ファイル名はcython_stl_experiment.pyxとなっています。


```python:cython_cpp_experiment.pyx
# distutils: language=c++
# -*- coding: utf-8 -*-

import time
from libcpp.vector cimport vector
from unordered_map cimport unordered_map


cdef vector[int] cpp_keys = [k for k in range(1000000)]
keys = [k for k in range(1000000)]

cdef unordered_map[int, bint] cpp_dict
py_dict = {}


cpdef test_python_dict_set():
    for key in keys:
        py_dict[key] = True


cpdef test_python_dict_lookup():
    for key in keys:
        assert py_dict[key] == True


cpdef test_cpp_umap_set():
    cdef int key
    for key in cpp_keys:
        cpp_dict[key] = True


cpdef test_cpp_umap_lookup():
    for key in cpp_keys:
        assert cpp_dict[key] == True


def run():
    start = time.clock()
    test_python_dict_set()
    print 'test_python_dict_set:', time.clock() - start

    start = time.clock()
    test_python_dict_lookup()
    print 'test_python_dict_lookup:', time.clock() - start

    start = time.clock()
    test_cpp_umap_set()
    print 'test_cpp_umap_set:', time.clock() - start

    start = time.clock()
    test_cpp_umap_lookup()
    print 'test_cpp_umap_lookup:', time.clock() - start

```

上記コードを実行してみます。

```
In [1]: import cython_cpp_experiment
In [2]: cython_cpp_experiment.run()
test_python_dict_set: 0.116818
test_python_dict_lookup: 0.064986
test_cpp_umap_set: 0.094401
test_cpp_umap_lookup: 0.01363
```

連想配列への代入時間は2割弱程度の変化しかないものの、ルックアップ処理は約5倍程度高速化できました。

## さいごに

Cythonでは、文字列(バイト)型とstd::string、listとstd::vectorなどをコンテクストに応じて自動的に変換してくれる機能が実装されてきており、比較的Python的な記述を保ったまま、C++のデータ型を直接使用することが出来たりして、とても便利です。

上記のコードでも、vectorを`for … in …`でPython的なsyntaxで扱っています（内部的にはC++のイテレータが生成されて処理されます)。

参考:
Using C++ in Cython / Standard library: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library

Cでエクステンション書けばいいんじゃない、とか、ctypes使えばいいんじゃない、という声も聞こえてきそうですが、Pythonで繰り返しなどの一部のコードのみ高速化できるCythonは、いろいろ利用しどころがあるのではないかと思います。

また、今回使用したコードはこちらにあります。
https://github.com/ikuyamada/cython-cpp-experiment
Objective Cでmixin

## なぜmixinが必要なのか？
ベースとなるViewControllerに共通の変数＋メソッドを追加したかった

* UIViewController
* UITableViewController
* UICollectionViewController

カテゴリ＋AssociatedObjectでも出来なくはないけど、面倒。

## 実現方法

mixin定義をoptionalなprotocolとして定義し、それを実装するmixin用オブジェクトを定義する。

```objc
@protocol SampleMixinProtocol<NSObject>

@optional

@property BOOL aBool;

@end

@interface SampleMixin : NSObject<SampleMixinProtocol>

@end
```

インスタンス変数としてmixinオブジェクトを持つようにし、必要に応じてメソッド呼び出しをフォワードする。
＃mixinオブジェクトの生成コードは省略しています。

```objc

@interface SampleViewController : UIViewController<SampleMixinProtocol>

@property SampleMixin *mixin;

@end

@implementation SampleViewController

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    [self.mixin setValue:value forKey:key];
}

- (id)valueForUndefinedKey:(NSString *)key
{
    return [self.mixin valueForKey:key];
}

- (void)forwardInvocation:(NSInvocation*)inv {
    if ([self.mixin respondsToSelector:[inv selector]]) {
        [inv invokeWithTarget:self.mixin];
    } else {
        [super doesNotRecognizeSelector:[inv selector]];
    }
}

- (NSMethodSignature*)methodSignatureForSelector:(SEL)sel {
    return [self.mixin methodSignatureForSelector:sel];
}

@end
```

ちゃんとコード補完も効くので、ほぼmixinっぽく使えています。
NGramFilterFactoryの挙動について


現在、使用している3.6から4.6にバージョンアップしようと思い、移行を進めていたところ、NGramFilterFactoryの挙動がバージョン間で異なっていたので簡単に調べてみた。

schema.xmlは、次のように修正した。

```xml
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
      <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="2"/>
      </analyzer>
    </fieldType>
```

3.6.2

```xml
<str name="querystring">name:こぶくろ</str>
<str name="parsedquery">PhraseQuery(name:"こぶ ぶく くろ")</str>
```

4.2.1

```xml
<str name="querystring">name:こぶくろ</str>
<str name="parsedquery">PhraseQuery(name:"こぶ ぶく くろ")</str>
```

4.3.1

```xml
<str name="querystring">name:こぶくろ</str>
<str name="parsedquery">PhraseQuery(name:"こ ぶ く ろ こぶ ぶく くろ")</str>
```

4.5.1

```xml
<str name="querystring">name:こぶくろ</str>
<str name="parsedquery">(name:こぶ name:ぶく name:くろ)/no_coord</str>
```

4.6.1

```xml
<str name="querystring">name:こぶくろ</str>
<str name="parsedquery">(name:こぶ name:ぶく name:くろ)/no_coord</str>
```

4.5.1から、autoGeneratePhraseQueries="true" にしても、BooleanQueryになってしまっている。4.3.1は、PhraseQueryになっているものの、minGramSizeが無視されているような結果だ。

さて、どうするか。Solr4.4以降のNGramTokenizeeFactoryは、フィールドの文字列長が1024バイトを超えてもトークナイズをするように、不具合修正されているとのことなので、それを使ってみることに。
（@johtaniさんから助言いただきました）

改めて、4.6.1のschema.xmlは、次のように修正した。

```xml
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
      <analyzer>
        <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
```

4.6.1

```xml
<str name="querystring">name:こぶくろ</str>
<str name="parsedquery">PhraseQuery(name:"こぶ ぶく くろ")</str>
```

期待した結果（PhraseQuery）となるが、WhitespaceTokenizerFactoryからトークナイザが変更されているため、これまでと一緒と言うわけにはいかない。そのため、検索結果の検証が必要。しばらく、動作検証してみる。

3.6から4.6にバージョンアップして驚いたのが、インデックスの圧縮率の高さ。42GBあったインデックスが36GBまで圧縮された。WhitespaceTokenizerFactoryのときは、27GBまで圧縮されていた。（NGramTokenizerで仕方がないが、増加したのは残念）これだけでも、4.6系が使いたかったので、どうにか活路が見つかって一安心した。autoGeneratePhraseQueriesを指定しても、PhraseQueryにならなかったときは、相当焦った。

Solrでの全文N-Gram検索は、NGramTokenizerFactoryを使用するということになりそうだ。
アプリ内の画面にURLを与えるといろいろ捗る

## segueの不満点
Storyboardのsegueはちょっとした遷移を書くのには便利なのですが、viewの状態遷移が複雑な場合にはあっという間にスパゲッティ状態になります。また、状態遷移にパラメタをつけたい場合、prepareForSegueを用いるのは結構面倒です。

## 実例
うちの会社で作っている「[Poin](http://www.poin.co/r/appstore)」というアプリケーションの場合、「User」「Book」「Page」を表示するViewControllerに、様々な経路で状態遷移します。ざっと挙げても下記の通りで、実際にはこの倍近い経路があります。

* Top -> Book
* Top -> User
* User -> Book
* User -> User
* Book -> User
* Book -> Page
* Page -> User
* Page -> Book
* Notification -> User
* Notification -> Book
* Notification -> Page

「User」「Book」「Page」にはそれぞれIDを与える必要があるため、segueで書くと泣ける状態になります。
このようなブラウザ的なアプリケーションには、今回紹介するURLを用いる方法は絶大な効果があります。

## 対応策
すべてをsegueで制御せずに、要所となるviewにはURLを定義します。URLには引数をつけることができるので、IDも問題なくURLに含めることができます。上記の例の場合には、下記三つだけを考えれば良くなります。

* -> User
* -> Book
* -> Page

あとは、目的に応じてUIApplicationか、Application DelegateのどちらかのopenURLに状態遷移を記述します。たったそれだけで、アプリ内のどこからでもURLで指定したviewに遷移できるようになります。

さらに、一つのStoryboard内はsegue、異なるStoryboard間はURLで結合させると見通しが良くなります。

## 余談
Poinではアプリ外からのURL起動を先に実装していたので、「アプリ内でもこのURL使える！！」と気付いた後は、あっという間にリファクタできました。さくさくsegueを消して行くのは壮快でしたよ。

## 補足
Twitterで、「そこまでやるならaddSubviewでよくない？」というコメントを頂いたので追記。
Poinの場合、画面遷移は基本的にStoryboardで記述しており、各画面には固有のIDを持たせてState Restoreを行っています。個人的には、これがStoryboardの最大のメリットだと思っています。
そのため、画面遷移はUIViewController単位とし、Restoreの必要ないviewのみsubviewとして使っています。
バッチファイルによるスタブのパターン

パッケージ管理システムが実行可能なツールをインストールするとき、Windows版ではスタブとなるbat、cmdファイルを生成することがある。

各言語のパッケージ管理ファイルでどのようなスタブを生成しているのか調べてみる。


# Ruby(gem)

```bat:bundle.bat
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"ruby.exe" "C:/HashiCorp/Vagrant/embedded/bin/bundle" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"ruby.exe" "%~dpn0" %*
```

https://github.com/rubygems/rubygems/blob/master/lib/rubygems/installer.rb
で生成されている模様。

"%~dpn0"は、拡張子を除くフルパス。bundle.batと同じディレクトリにあるbundleという名前のrubyプログラムを実行している。

GOTOしないルートは、おそらくWin95/98/Me向け（動くのかは知りませんが）。


# Node(npm)

```bat:grunt.cmd
@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\grunt-cli\bin\grunt" %*
) ELSE (
  node  "%~dp0\node_modules\grunt-cli\bin\grunt" %*
)
```

https://github.com/ForbesLindesay/cmd-shim
がやっているっぽい。
スタブファイルと同じディレクトリにnode.exeがあればそれを使う。

"%~dp0"は、ドライブ＋パス（ファイル名と拡張子は除く）

# PHP(Composer)

```bat:phpunit.bat
@ECHO OFF
SET BIN_TARGET=%~dp0/../phpunit/phpunit/composer/bin/phpunit
php "%BIN_TARGET%" %*
```

https://github.com/composer/composer/blob/master/src/Composer/Installer/LibraryInstaller.php
でやっている模様
SalesforceでSObjectやフィールドへのアクセス権限を取得する方法

apexコード中でデータを作成・更新・削除などする場合は
実行しているユーザにその権限があるかどうかを判定してから行うようにしないと
セキュリティコードスキャナーで指摘されます。

ということで、オブジェクトレベルでのアクセス権限(CRUD)および
フィールドへのアクセス権限(FLS)の取得方法をまとめてみます。

このへんが参考になります。
（`isDeletable()` を `isDelet"e"able()` と書いてますがスペルミスです）

- [JP:Testing CRUD and FLS Enforcement - developer.force.com](http://wiki.developerforce.com/page/JP:Testing_CRUD_and_FLS_Enforcement)
- [セキュリティ早見表](http://developerforcejp.s3.amazonaws.com/developer/cheatsheets/JP_SF_security_cs-2Pg_HR.pdf)


```java:sample.cls
// すべてのSObjectを取得する場合
Map<String, Schema.SObjectType> sMap = Schema.getGlobalDescribe();

// SObjectの種類を指す
Schema.SObjectType eventType = Event.SObjectType;
// または、インスタンスから取得
SObject sObj = new Account();
Schema.SObjectType accountType = sObj.getSObjectType();

// Schema.DescribeSObjectResultというクラスを経由する
Schema.DescribeSObjectResult result = eventType.getDescribe();

// ----SObjectへのアクセス権限(CRUD)----
System.debug(result.isCreateable());
System.debug(result.isAccessible());
System.debug(result.isUpdateable());
System.debug(result.isDeletable());

// SObjectのフィールドを取得
// 以下のようにするとMap型で取得できる
Map<String, Schema.SObjectField> fieldMap = result.fields.getMap();

// ----フィールドへのアクセス権限(FLS)----
String fieldName = 'isRecurrence';
Schema.DescribeFieldResult fieldResult = fieldMap.get(fieldName).getDescribe();
System.debug(fieldResult.isCreateable());
System.debug(fieldResult.isAccessible());
System.debug(fieldResult.isUpdateable()); // (!)システム管理者でもfalse
```

オブジェクトでもフィールドでも
Describe***Resultクラスがそういったメソッドを持つ、と覚えれば良さげ。

# 公式リファレンス

- [DescribeSObjectResult Class](https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_sobject_describe.htm)
- [DescribeFieldResult Class](https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_fields_describe.htm)
[iOS7]特定のViewControllerで、特定条件時にステータスバーを非表示にする

iOS7の特定のViewControllerで、特定条件時にステータスバーを非表示にする方法です。

## info.plistの設定
info.plist に ”View controller-based status bar appearance” という項目を追加し、値を ”YES” に。これでViewControllerごとにステータスバーの表示を制御可能になる。

## ViewController.m 
ステータスバーの表示を制御したいViewControllerにて、”statusbarHidden” のようなステータスバーの表示/非表示のフラグ用のプロパティを用意しておく。

```objc:ViewController.m 
@interface ViewController ()

@property BOOL statusbarHidden;

@end
```


さらに ”prefersStatusBarHidden" というメソッドを実装し、戻り値を "_statusbarHidden" とする。

```objc:ViewController.m 
- (BOOL)prefersStatusBarHidden {
    return _statusbarHidden;
}
```


あとは状況に応じて、"_statusbarHidden" に "YES" か "NO" をセットし、ステータスバーの画面更新メソッド "setNeedsStatusBarAppearanceUpdate" を呼べばOK。以下はiPhoneを横向きにした場合にステータスバーを非表示にする例。

```objc:ViewController.m 
- (void)viewWillLayoutSubviews {
    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
    switch (interfaceOrientation) {
        case UIInterfaceOrientationPortrait:
            _statusbarHidden = NO;
            [self setNeedsStatusBarAppearanceUpdate];
            break;
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            _statusbarHidden = YES;
            [self setNeedsStatusBarAppearanceUpdate];
            break;
        default:
            break;
    }
}
```
AndroidSDKが、ファイルを参照しているプログラムがあるとかでインストール出来ない時の対処法

最近android開発をしているのですが、AndroidSDKが、ファイルを参照しているプログラムがあるとかでインストール出来ない時の対処法について私のブログにまとめてみました。↓

http://infotech776.blog.fc2.com/blog-entry-43.html

このエラー以外にも、よくわからないエラーがADTで出るという事象もこれで解決出来ました。
良かったら読んでみてください！
歴史の闇から消えた変更を救う


## ストーリー

はーい、master に rebase しますねー
psuh -f しますねー

…


30分後

…



もしかして…あの変更が消えているのでは…



となった。解決したのでメモ

## 解決方法

`git reflog` すれば、復活できる可能性大。


それでも該当コミットが見つからない場合、

`git fsck | awk '{print $3}' | xargs -n1 git show`

して闇に消えた変更を全部眺めて、それっぽいのをコピペしてもう一回コミットをつくる。


## メモ

* (当たり前だけど)ローカルの変更しか拾えない
* サーバ側にあるアンリーチャブルなコミットをローカルにクローンする方法はあるのだろうか
Eclipseでエラーを直しても出続ける時の対処法

Eclipseで明らかにエラーを直してもエラーが出続ける時の対処法について私のブログにまとめてみました↓
http://infotech776.blog.fc2.com/blog-entry-44.html

御存知の方も多いと思いますが参考までに！
やっとOpenShiftにRedMineの無料環境作れた（メモ）

openshiftアカウント作成

その後、下記ページに従って実行
●https://github.com/openshift/openshift-redmine-quickstart

しかし、git Cloneが一向に作られない・・・・
これ入れたらうまくいったけど、
GitコマンドWindowsで打つにはこれが必要なんかなあ（謎）
●https://code.google.com/p/msysgit/downloads/list

　msysGit-fullinstall-1.8.5.2-preview20131230.exe


それ以外にもSSHの認証ファイルを作ってopenshiftに紐づけないといけないっぽい
下記参考
●http://git-scm.com/book/ja/Git-サーバー-SSH-公開鍵の作成
●http://gihyo.jp/dev/serial/01/engineer_toolbox/0025

もう１回GitHubに従って１からやり直し、
http://redmine-$yournamespace.rhcloud.com 
yournamespaceは自分のアプリ作成時に決めた名前
アクセスして、ユーザー名：admin パスワード：admin　で
管理者としてログイン


はあー、５時間かかってやっとできました。
iPhone端末内にアプリがある場合はアプリを、ない場合はAppStoreを開くコード

iPhoneの端末内にあるアプリをURLスキームによる起動を試みる。
起動が可能ならばそのまま起動する。
起動できなければAppStoreへ遷移させる。
もちろん、対象のアプリにURLスキームが設定されていなくてはいけない。


```objc
    // URLスキームでアプリを開けるなら開く
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"~URLスキームの値~"]]) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"~URLスキームの値~"]];
    }else{
        // URLスキームでアプリを開けないならAppStoreを開く
        NSURL *url = [NSURL URLWithString:@"https://itunes.apple.com/jp/app/id[~アプリのID~]&mt=8"];
        [[UIApplication sharedApplication] openURL:url];
    }
```
GASでトリガーを使って、スプレッドシートの内容をメールで送信

* 事前準備
 * スプレッドシートのA1にメール件名、B1にメール本文書いとく

</br>

* はじめにやること
 * Spread Sheet開いて、「ツール」→「スクリプトエディタ」

</br>

# ↓1行で内容
## mailsend関数をtriggerset関数でトリガー登録 　→ トリガー登録した時間に、mailsend関数が実行され、メールが自動で送信される

</br>
</br>

#### スクリプト↓

```js

// トリガー(スケジューリング)設定関数
function triggerset(){

  // 新しいトリガーを作成し、
  // 実行する関数に、下で作成するメール送信関数名を指定します
  var trigger = ScriptApp.newTrigger('mailsend');  


  // 時間を指定します
  // 毎日、21:52に送信するようにします　その時間の理由は忘れました
  trigger.timeBased()  
         .everydays(1)  // 毎日
         .atHour(21)  // 時
         .atminute(52)  //分
         .create();  
}





// メール送信関数
function mailsend(){
  // アクティブなスプレッドシートを取得　(URLで取得などからも可能ですが)
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // A1セルからメール件名取得
  var subject = ss.getRange("A1").getValue();

  // B1セルから本文取得
  var contents = ss.getRange("B1").getValue();

  // メール送信：宛先,件名,本文　(送信元は今のアカウントで送信します)
  MailApp.sendEmail("xxxx@xxmail.com", subject ,contents )

  
}
```
Git の mirror 関連のオプションや設定

## `git clone --mirror $URL`

 1. bare リポジトリが作られる
     - `git init --bare` と大体同じ
 2. --mirror オプション付きでリモートリポジトリが追加される
     - `git remote add --mirror origin $URL` と大体同じ
 3. リモートリポジトリが fetch される
     - `git fetch origin` と大体同じ

## `git push --mirror $NAME`

 - ローカルリポジトリの refs/ がそのままリモートリポジトリの refs/ にプッシュされる
    - `git push $NAME "refs/*:refs/*"` と大体同じ

## `git remote add --mirror=push $NAME $URL`

 - config の `remote.$NAME` に下記が追記される

        url = $URL
        mirror = true

## `git remote add --mirror=fetch $NAME $URL`

 - config の `remote.$NAME` に下記が追記される

        url = $URL
        fetch = +refs/*:refs/*

## `git remote add --mirror $NAME $URL`

 - --mirror=push と --mirror=fetch の両方
    - ただし使うなと警告が表示される

## config の `mirror = true` の効果

 - git push で自動的に --mirror オプションが指定されたように振る舞う

## config の `fetch = +refs/*:refs/*` の効果

 - git fetch でリモートリポジトリの refs/ がローカルリポジトリの refs/ にそのまま保存される
    - 通常はリモートリポジトリの refs/heads/ がローカルリポジトリの refs/remotes/*/ に保存される
    - つまり リモート追跡ブランチ＝追跡ブランチ＝ローカルブランチ となる

## まとめ

### リモートをローカルにミラー

    git clone --mirror $URL

または

    git init --bare
    git remote add --mirror=fetch origin $URL
    git fetch origin

### ローカルをリモートにミラー

    git remote add --mirror=push origin $URL
    git push origin

### ローカルをリモートにミラーのダメな例

    git remote add origin $URL
    git push --mirror origin

この手順だと `git remote add origin $URL` で config に `fetch = +refs/heads/*:refs/remotes/origin/*` が追記されます。

そのため、git push でリモートリポジトリを更新した後にローカルリポジトリにリモート追跡ブランチが作成されます。

push の --mirror オプションは refs/ をすべてプッシュするため、もう一度 git push するとリモート追跡ブランチまで一緒にリモートリポジトリにプッシュされます。
（ローカルリポジトリ・リモートリポジトリ共に refs/remotes/origin/master のようなブランチが作成される）

### リモートＡをローカルを経由してリモートＢにミラー

    git clone --mirror git@example.com:repo.git
    cd repo.git
    git remote add --mirror=push new git@example.net:repo.git
    git push new

## さいごに

git push の --mirror オプションの存在意義がわからない。

## おまけ

### リモートＡをローカルを経由してリモートＢにミラー、ただしローカルはワーキングツリーを持つ（not bare）

    git clone git@example.com:repo.git
    cd repo.git
    git remote set-head -d origin
    git remote add new git@example.net:repo.git
    git push --tags new "refs/remotes/origin/*:refs/heads/*"
springのbinstubオプションとparallel_testsを同時に使うと死ぬ

この記事は以下のバージョンにおいて再現する問題です

- spring v1.1.1
- parallel\_tests v0.16.10

しばらく前に、Railsのコマンドを高速化するgemの[spring](https://github.com/rails/spring "rails/spring")の推奨インストール方法が変わった。
多分、Rails 4.1.0から標準になるからだと思うが。

で、今の公式のインストール方法によるとこんな感じ。

```ruby
gem "spring", group: :development
gem "spring-commands-rspec", group: :development
gem "spring-commands-cucumber", group: :development
```

```sh
$ bundle install
$ bundle exec spring binstub --all
```

binstubを作ってWrapしておけば、透過的に早くなって楽だよねって感じです。
で、rspecとかcucumberにspringを対応させるgemを入れておけば、この二つもbinstubを作ってくれるのですが、これが問題です。

parallel\_testsでrspecの実行コマンドを探すコードがこうなってます。

```ruby
def determine_executable
  cmd = case
  when File.exists?("bin/rspec")
    "bin/rspec"
  when File.file?("script/spec")
    "script/spec"
  when ParallelTests.bundler_enabled?
    cmd = (run("bundle show rspec-core") =~ %r{Could not find gem.*} ? "spec" : "rspec")
    "bundle exec #{cmd}"
  else
    %w[spec rspec].detect{|cmd| system "#{cmd} --version > /dev/null 2>&1" }
  end

  cmd or raise("Can't find executables rspec or spec")
end
```

つまり、binstubで作られたコマンドが最初に引っ掛かります。
そうすると、勝手にspring経由でrspecが実行されて環境変数が切り替わらなくなります。
結果、データベースをプロセスごとに切り替えられなくなって、DB競合で死にます。

というわけで、binstubを使う場合は、rspecとかcucumberは外しておいた方が良さそうです。
parallel\_testsを使わない場合は便利なんですけどね…。
eclipseが特定のワークスペースで起動できなくなった

# eclipseが特定のワークスペースで起動できなくなった

うかつにeclipse上でドでかいファイルを開いてしまった際にeclipseが突然終了して
同じワークスペース指定でeclipseを起動しようとしても、
起動実行->起動中ゲージが1/10くらい進んだところで突然終了->以降は何度やっても同じ
という現象になりました。
パッと調べてもわからずご愁傷様です、と思い、ついでにJunoからKeplerに移行してeclipseの環境を再構築したのですが
結局気になって調べて対処することができたのでメモしておきます。

## ログを確認する

とりあえず何はともあれログ確認。
`${workspace}/.metadata/.log`あたりにログが出力されているので
これを確認するとだいたいぬるぽが出ていたり何かしらエラーが出ていたりします。
これで特定できれば良いのですが場合によってはなかなかわからないこともあります。

## cleanオプションで起動してみる

いったんcleanオプションを付けて起動してみましょう、これで問題なく起動できればラッキーです。
windowsの場合はeclipse.exeのショートカットを作成して、
![eclipse01.PNG](https://qiita-image-store.s3.amazonaws.com/0/11757/80df26ef-eb39-019b-b5ac-d6fa76449f63.png)
上記のように`-clean`を付ければ良いです。

## 全部削除してみる

このあたりまででかなり調べてそれでも起動できないと、
もう諦めて最新版のeclipseをダウンロードして再構築しようとか考え始めます。
となれば、怪しいファイルをガッツリ削除してみようと思うのですが
特定さえできていないので`${workspace}/.metadata/`をまるっと削除してみれば
eclipse自体に何か影響が出てしまったのか、それともワークスペースだけの問題なのか
判別することはできるかなという体でストレス発散で削除をしてみます。
当然、パースペクティブの設定やワーキングセットの設定等全部消し飛ぶので
起動はできたもののこれ何も解決していないよね、、と落ち込みます。

## 一時保存ファイルを削除してみる

ともあれ、`${workspace}/.metadata/`内のどこかのファイルを駆逐すれば
このワークスペースでも起動することができるだろうとポジティブになってみます。
配下のディレクトリやファイルを更新日時でソートしてみたり
ファイル名でgrepしてみたりググってみたりして、
あとはバックアップをとっていくつかのファイルの削除を試してみます。
今回の場合は`${workspace}/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi`を削除することで
少しの犠牲（パースペクティブの設定）を払ってワークスペースを復活させることができました。

## まとめ

起動できなくなった時がアップデートの時期。eclipseあるある
Ab(Apache Bench)を使用した負荷テストのやり方


## Ab(Apache Bench)とは

Apacheで標準でついてくる負荷テストツール。単一ページに対しての負荷テストのみ実行可能であるため、あまり難しいことはできないが手軽に使える。

## 実行方法

一番簡単な実行方法

```
ab -n [総リクエスト数] -c [同時リクエスト数] [URL]
```

同時10接続で、100リクエスト発行するならこうなる。

```
ab -n 100 -c 10 http://localhost/test.php
```

Keep Aliveを有効にするには、-k をつける。

```
ab -n 100 -c 10 -k http://localhost/test.php
```

他にもいくつかオプションはあるが、基本はこの形。

## 実行結果の見方

実行するとこんな結果が戻ってくる。

```
[vagrant@localhost ~]$ ab -n 1000 -c 100 http://localhost/test.php

Benchmarking localhost (be patient).....done

Server Software:        Apache/2.2.15
Server Hostname:        localhost
Server Port:            80

Document Path:          /test.php
Document Length:        48 bytes

Concurrency Level:      100
Time taken for tests:   34.093 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      240000 bytes
HTML transferred:       48000 bytes
Requests per second:    29.33 [#/sec] (mean)
Time per request:       3409.323 [ms] (mean)
Time per request:       34.093 [ms] (mean, across all concurrent requests)
Transfer rate:          6.87 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.7      1       7
Processing:  1006 3227 632.8   3020    4024
Waiting:     1001 3226 633.3   3018    4023
Total:       1008 3228 632.1   3022    4030

Percentage of the requests served within a certain time (ms)
  50%   3022
  66%   3025
  75%   3982
  80%   3984
  90%   3992
  95%   3997
  98%   4009
  99%   4016
 100%   4030 (longest request)
```

まずは、この２つの値を見て見る。

- Failed Requests：
失敗したリクエスト数。これが発生している場合は、サーバが処理できる能力を超えている。
- Requests per second：1秒あたりに処理したリクエスト数。

「Failed Requests」が0、「Request per second」がより大きい数値になるようにチューニングする。
【iOS】 コールバック地獄から脱出する為のライブラリ一覧

Blocksのコールバックを使ってるとコールバック地獄に陥りやすいですよね。
（例：ボタンタップ→アラート確認→通信→通信結果を元に...）

この問題を解決する為のライブラリを作るにあたって、
参考にさせていただいたライブラリを尊敬の念をこめつつ以下に挙げておきます。

## 実現したいこと
引用ですが、以下のことをiOSで実現したいと考えています。

> 非同期処理を同期的に書く
>「同期的に」とはどういうことか？　代表的な要件としては

> * ネストが入れ子にならない
> * 上から下に読んで実行フローが把握できる
> * 非同期処理の結果得られた値を次の処理に引き回せる
> * try/catchで素直に例外を捕捉できる

[generatorとJavaScriptの非同期処理]
(http://qiita.com/hitsujiwool/items/316f3e8a41fb7dc3a119)

## future/promise, jQuery.Deferredについて

既存のiOSライブラリは、ほとんどがJavascript界隈での同種の問題解決に用いられているjQuery.Deferred
(future/promiseパターンを実装したもの）を参考にしているようです。
これらの理解が無かった場合、ライブラリの解読と使用は苦労すると思います。（経験談）
僕が勉強させていただいたサイトを載せておきます。

* [future](http://ja.wikipedia.org/wiki/Future)
* [爆速でわかるjQuery.Deferred超入門](http://techblog.yahoo.co.jp/programming/jquery-deferred/)
* [【翻訳】DeferredはjQueryにおける最も重要なクライアントサイドツール](http://blog.toshimaru.net/jquerydeferred-is-most-important-client/)

では以下ライブラリ一覧

#STDeferred
https://github.com/saiten/STDeferred

2012年という先見性と使い勝手に脱帽。
UIパーツに持たせてUIパーツのイベント発火まで一連の処理を待たせるなんかも出来る。
ただ、コードが僕のような中の下レベルでは難解。（pipe周り）

参考
[Objective-CでDeferredライブラリを作ってみた](http://qiita.com/saiten/items/c2ac4df40ad001179afa)

#Bolts-iOS
https://github.com/BoltsFramework/Bolts-iOS

最近(2014年2月)発表されたParse社(現 Facebook傘下）のフレームワーク。
Androidなんかのもある。
https://github.com/BoltsFramework

参考記事
 [Parse、iOSとAndroid用の低レベルライブラリ集、Boltsを発表](http://www.infoq.com/jp/news/2014/02/parse-announces-bolts?utm_reader=feedly?utm_source=infoq&utm_medium=popular_links_homepage)

#OMPromises
https://github.com/b52/OMPromises

CommonJSのPromises/Aにインスパイアされたそうです。
比較的コードが追いやすい。勉強になります。

#Sequencer
https://github.com/berzniz/Sequencer

コードが超シンプル。やれる事もシンプル。
潔さも勉強になる。

#KSDeferred
https://github.com/kseebaldt/deferred

詳細不明。

#objc-promise
https://github.com/mproberts/objc-promise#objc-promise

詳細不明。

#MAFuture
https://github.com/mikeash/MAFuture

詳細不明。
2010年に作られている。知ってる中では一番早い。
MRC(not ARC)。

#PromiseKit
https://github.com/mxcl/PromiseKit

最近(2014年５月時点)出てきた模様。
サイトもある。
Swift対応してる！

[PromiseKit](http://promisekit.org)

##その他の方法
アプローチは上記ライブラリとは違ってきますが、ReactiveCocoaでも実現可能なのでは？と思ってます。
（検証していません）

https://github.com/ReactiveCocoa/ReactiveCocoa
[ReactiveCocoaとFunctional Reactive Programmingについて](http://safx-dev.blogspot.jp/2013/12/reactivecocoafunctional-reactive.html)

##参考
以下が興味深く読めて勉強になりました。

* [コールバック……駆逐してやる…この世から…一匹…残らず!!](http://qiita.com/KDKTN/items/4c6986049d204f0645d8)
* [結局jQuery.Deferredの何が嬉しいのか分からない、という人向けの小話](http://qiita.com/yuku_t/items/1b8ce6bba133a7eaeb23)
* [generatorとJavaScriptの非同期処理]
(http://qiita.com/hitsujiwool/items/316f3e8a41fb7dc3a119)


##自作してみた
自作したものを公開してみました。
明らかに参考にしたライブラリには劣りますが、分かりやすい実装にはなったかなと。
よかったら見てみて下さい。指摘等頂ければ感謝します。

[ARNDeferred](https://github.com/xxxAIRINxxx/ARNDeferred)
cocos2dx v3.0環境設定メモ

###当方環境
* OS X Marvericks  
* HomeBrew  
* zsh  
* cocos2d v3.0  
* Xcode5  
* IntelliJ12  
* AndroidSDK  
* AndroidNDK  

###最初にやること
AndroidNDKのパスを通しておく  

```~/.zprofile  
	export NDK_ROOT=/path/to/android-ndk
	export ANDROID_HOME=/path/to/android-sdk
```

###次にやること
マルチプラットフォームプロジェクトを作成する。  

```project/  
	./create_project.py -n Name -k com.example.name -l cpp -p /path/to/yourworkspace
```

###できるディレクトリ構成
* Classes  
* CMakeLists.txt  
* cocos2d  
* proj.android  
* proj.ios_mac  
* proj.linux  
* proj.win32  
* Resouces  

###共通
C ++ファイルはClassesに追加。  
リソースファイルはResoucesに追加。  

###Android対応
Classesに追加したファイルを記述する。

  
```proj.android/jni/Android.mk
	LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/GameScene.cpp \
                   ../../Classes/Config.cpp \
                   ../../Classes/BlockSprite.cpp \
                   ../../Classes/CCPlaySE.cpp
```

  

ビルドする。
  
```proj.android/  
	./build_native.py
```


参考本
cocos2d-xによるiPhone/Androidアプリプログラミングガイド
清水 友晶
Rhino/JavaScriptをMacアプリに仕上げる方法

# 概要

AppleScriptを利用することで、RhinoのプログラムをMacアプリのように実行することができます。
これによって、ファイルのドラッグアンドドロップで、Rhinoのプログラムを実行できます。

# 実現方法

AppleScriptを利用して、シェルスクリプトからRhinoのプログラムを実行します。
そのため、Rhinoを起動するシェルスクリプトをはじめに作ります。

```sh:test.sh
#!/usr/bin/java -Dfile.encoding=UTF-8 -cp ./js.jar org.mozilla.javascript.tools.shell.Main

//
// ここに Rhino/JavaScriptのコードを記述
//
```

シェルスクリプトを起動するAppleScriptを記述します。

```applescript:exec-rhino
on main(input)
	-- スクリプトの名前
	set mainScript to "test.sh"
	-- 親ディレクトリの取得
	tell application "Finder" to set parentDirPos to parent of (path to me) as text
	set parentDir to ((alias parentDirPos)'s POSIX path)
	try
		do shell script "cd " & parentDir & ";./" & mainScript & space & input
	end try
end main

on open argv
	repeat with aFile in argv
		main(quoted form of POSIX path of aFile)
	end repeat
end open

on run
	-- ファイル選択を行う場合
	-- main(quoted form of POSIX path of (choose file))
	-- 引数をつけない場合
	main({})
end run
```

さらに、スクリプトをAppleScriptエディタで記述し、ファイルフォーマットを「アプリケーション」として保存します。

# 参考

AppleScriptを使う方法以外に、Automator.appを使う方法があります。

- [Automatorを使う場合](http://d.hatena.ne.jp/nakamura001/20101229/1293605644)

## その他のリソース

- [AppleScriptを使う場合](http://qiita.com/mattintosh4/items/072c01af22df6a7f5ffc)
- [Rhinoをバッチファイルで実行する](http://kujirahand.com/blog/index.php?%E6%94%B9%E3%82%81%E3%81%A6Rhino%E3%81%A7%E3%83%90%E3%83%83%E3%83%81%E3%82%92%E4%BD%9C%E3%82%8B%E6%99%82%E3%81%AETips)
DockerfileでADDとchown/chmodの順序には気をつけよう


はじめに
=======

バグなのだと思うのですが（仕様としてはおかしいと思うので）、Dockerfileを書いていて、ADDとchownやchmodの順序によって意図しない挙動になることがあるので共有します。

動作Version
----------

* docker
	* Docker version 0.8.0, build cc3a8c8d8ec57e15b7b7316797132d770408ab1a
* docker host os (Mac)
	* boot2docker: 0.5.4

現象
=====

例えば、centosユーザ、の .ssh ディレクトリに authorized_keys を置いて、Permissionなどを設定したいということがあります。
その場合少なくとも下記の条件を満たす必要があります。

* ~/.ssh DIR は mode 700 でなくてはならない
* ~/.ssh DIR 以下の Owner は centosユーザでなくてはならない

それを以下のように書いたとします。


```
RUN mkdir -p /home/centos/.ssh
RUN chmod 700 /home/centos/.ssh
ADD centos.pub /home/centos/.ssh/authorized_keys
RUN chown centos:centos -R /home/centos
```

すると、Dockerfileのbuild 自体は成功するのですが、そのImageにログインして、
.ssh DIRにアクセスしようとすると、


```sh
# su - centos
% cd .ssh
cd: 許可がありません: .ssh
```

とエラーになってしまいます。
OwnerもPermissionも想定通りなのですが、何度やっても同じ現象になります。

また、

```sh
% sudo mv .ssh a
% mv a .ssh
% cd .ssh
```

とすると、今度はちゃんとcdできます。明らかに尋常ではないです。

解決法
=====

https://github.com/dotcloud/docker/issues/1295
にも少し書いてありますが、順番を変えると直りました。

```
RUN mkdir -p /home/centos/.ssh
ADD centos.pub /home/centos/.ssh/authorized_keys
RUN chown centos:centos -R /home/centos
RUN chmod 700 /home/centos/.ssh
```

どうも `ADD` との順序が重要みたいです。

なんで、、という気分ですが、まあ、直ったということで良しとします。
皆さんもお気をつけ下さい。
暗号化されたCSVファイルを復号化する

CSVとBase64とOpenSSL::Cipherを組み合わせる
========================================

追記：色々直しました。引数にファイル名が必須でしたが、標準入力も読みます。空のカラムで例外が出ていましたが直しました。復号だけだと意味わからんと思うので暗号化も足しました。

各ライブラリについてはマニュアルを参照のこと。

* OpenSSL http://docs.ruby-lang.org/ja/2.1.0/library/openssl.html
* CSV http://docs.ruby-lang.org/ja/2.1.0/class/CSV.html
* Base64 http://docs.ruby-lang.org/ja/2.1.0/library/base64.html

なお、暗号化モードECBは脆弱性があるので絶対に使ってはいけないそうです。
下記のように使用して（おおよそ）元のCSVが戻ってきたら正常に動作しています。

```shell-session
$  ruby ~/encrypt_csv.rb xx.csv | ruby ~/decrypt_csv.rb

```

```ruby:decrypt_csv.rb
# encoding: utf-8

require 'openssl'
require 'base64'
require 'csv'

$cipher = OpenSSL::Cipher.new("AES-128-ECB")
$KEY = 'ABCDEFGHIJKLMNOP'

class String
  def decrypt
    str = if /=$/ =~ self
      $cipher.reset
      $cipher.decrypt
      $cipher.key = $KEY
      ret = $cipher.update(Base64.decode64(self)) + $cipher.final
      ret.force_encoding 'utf-8'
      ret
    else
      self
    end
  end
end

CSV.filter do |cols|
  cols.map!{|x|x ? x : ""}.map!(&:decrypt)
end

```

```ruby:encrypt_csv.rb
# encoding: utf-8

require 'openssl'
require 'base64'
require 'csv'

$cipher = OpenSSL::Cipher.new("AES-128-ECB")
$KEY = 'ABCDEFGHIJKLMNOP'

class String
  def encrypt
    return self if self.empty?

    $cipher.reset
    $cipher.encrypt
    $cipher.key = $KEY
    Base64.strict_encode64($cipher.update(self) + $cipher.final)
  end
end

CSV.filter do |cols|
  cols.map!{|x|x ? x : ""}.map!(&:encrypt)
end

```

今日の知見
=========

CSV.filterは便利。ブロックに与えられる引数(row)はmap!等で書き換えないとoutputに反映されないのがわかった。
Rhino/JavaScriptをWindowsバッチファイルで起動する方法

# 概要

Javaで実装されたJavaScriptの処理系Rhinoを手軽に実行するためのバッチファイルのひな形を紹介します。

# Rhino起動コードのひな形

Javaのランタイムを起動する際に、文字コードShift_JISを与えることになります。基本的には、以下のようなコードになるでしょう。Rhinoの本体「js.jar」を同じフォルダに配置します。以下のように書くと、バッチファイルに対して、ファイルをドラッグ・アンド・ドロップでスクリプトに渡すことが可能になります。

```:exec-rhino-js.bat
rem Rhino起動バッチファイル
java -Dfile.encoding=MS932 ^
  -cp .;js.jar
  org.mozilla.javascript.tools.shell.Main (Rhinoのソース) %*
```

# バッチファイル自身にJavaScriptのコードを書く場合

```js:exec-rhino-js.bat
rem=0;/* --- ここはRhinoの起動コード ---
cd /d "%~dp0"
java -Dfile.encoding=MS932 ^
  -cp .;js.jar ^
  org.mozilla.javascript.tools.shell.Main %0 %*
pause
exit
rem */
// --- ここからJSのコード
print("Hoge");
```

# 注意点

Windows系で、バッチファイル（*.bat）に作業対象ファイルをドロップして、Rhinoのプログラムを起動する場合、ドロップされたファイルのパスは、Shift_JISとしてコマンドラインに渡されますので、文字コードをShift_JIS(MS932)と指定します。プログラム作成時にある程度、文字コードを意識する必要があります。


# 参考リンク

[Rhinoでバッチファイルを作る](http://kujirahand.com/blog/go.php?649)
ViewとViewControllerとの通信にBlocksを使う


ViewControllerがなにがしかのカスタムUIViewを生成するケースは様々あると思います。
その中に、ボタンなどが配置されているケースも多いでしょう。
そのときにどうやってタップされた、などのイベントをViewControllerに伝えるべきか。

色々議論があると思いますが、最もシンプルなのはUIView側にBlocksのプロパティを定義して、ViewController側でBlocksを渡してやることでしょうか。

```objc
// カスタムUIView

@interface HogeView : UIView

@property (copy, nonatomic) void (^onClick)(NSString *info);

@end
```

```objc
// UIViewController

- (void)viewDidLoad
{
	HogeView *view = [[HogeView alloc] init];
	view.onClick = ^(NSString *info) {
		NSLog(info);
	};
}
```

循環参照にならないように注意する必要がありますが、delegateなどに比べてシンプルに書けるのが一番のメリットでしょう。
Playframework2.2でmemcachedを利用する

こちらで紹介されているMemcached Plugin

http://www.playframework.com/documentation/2.0.4/Modules

これが2.2でそのまま動作するか確認してみました。
https://github.com/mumoshu/play2-memcached

ここのREADMEを読んで2.1.xと同じ記述で動作することが確認できました。

```scala:project/Build.scala
val appDependencies = Seq(
    "com.github.mumoshu" %% "play2-memcached" % "0.3.0.2"
  )
  val main = play.Project(appName, appVersion, appDependencies).settings(
    resolvers += "Spy Repository" at "http://files.couchbase.com/maven2"
  )
```

```yaml:conf/play.plugins
5000:com.github.mumoshu.play2.memcached.MemcachedPlugin
```

```yaml:conf/application.conf
ehcacheplugin=disabled
memcached.host="127.0.0.1:11211"
```

後はplay.cache.Cacheクラスのgetとsetをそのまま利用できます。

memcachedを複数ホストでクラスタする場合は下記のように記述するようです。

```yaml:conf/application.conf
memcached.1.host="mumocached1:11211"
memcached.2.host="mumocached2:11211"
```

この記述方法には賛同しかねる。
MySQLでqueueっぽい機能を実装する

MySQLでqueueのような仕組みを実装するのは最適ではないとわかっていますが、それでもやらないといけないときのためのメモです。

テーブル定義は以下のとおり

```sql
create table queue (
  id INT UNSIGNED AUTO_INCREMENT,
  data BLOB NOT NULL,
  status TINYINT UNSIGNED NOT NULL default 0,
);
```

以下のようなクエリでqueueのリストを取ってきます。

```sql
SELECT id,data FROM queue WHERE status=0 LIMIT 100;
```

実行したいqueueに対して以下のようなクエリを発行します。

```sql
UPDATE query SET status=1 WHERE id=xxxx AND status=0;
```

このクエリのaffected_rowsが
 **1なら自身が取得できたqueue** なので実行、
 **0なら他のプログラムに取得されてしまったqueue** なのでこのqueueに対しては何もしない、
という形で判別可能です。
あとは実行後にqueueを消すなり、statusを終了状態にするなりして終了。
コーディングのお供（基本Mac）

みんな何使ってるんだろうって思ったので、まずは自分（Mac）のお供を一覧にしてみました。

#画像関係

##favicon.iconを作ろう
マルチアイコンや透明のfaviconも作れる。
http://ao-system.net/favicon/

##ImageOptm
pngやjpg、GIFアニメーションのファイルサイズ最適化／圧縮。
GIFアニメーションは試したことないけど・・・
http://imageoptim.com/

##縮小専用AIR
ファイルサイズを選んで圧縮できる。
http://labo.i-section.net/shukusen-air/

#ファイル関係

##cowsee
差分抽出ツール。
巻き戻しとかには対応できないので、そこは自力で対応を。
http://utweb.jp/air/cowsee/

##WinArchiver Lite
Macで納品するとゴミファイル入ることがあるので、それを削除するツール。
https://itunes.apple.com/jp/app/winarchiver-lite/id414855915?mt=12

##DiffMerge
ソースコードの比較。
https://sourcegear.com/diffmerge/

##integrity
リンク切れの確認
http://peacockmedia.co.uk/integrity/

##The Unarchiver
解凍ソフト。
lzhの圧縮やWindows ユーザーからのファイルも文字化けがない。
http://the-unarchiver.softonic.jp/mac

##SiteSucker
サイトを一括ダウンロード。
http://www.sitesucker.us/home.html

#コーディング関係

##Emmet
section>h1{Emmet}+p{Emmetの説明}というかんじでコードが簡単に書け、展開できるツール？
昇順の連番や途中からの連番がいつも思い出せなくなる・・・
DWが職場の共通エディタなので、そこに入れてます。
[DW5.5の入れ方はこちら](http://mania-ku.info/?p=707)

#FTP/バージョン管理関係

##FileZila
FTP。
「表示」→「ファイル名のフィルター」でアップしたくないファイルを指定できる。
http://sourceforge.jp/projects/filezilla/

##FireFTP
FTP。
FileZilaほど機能は多くないかもしれないが、Firefoxのブックマークから立ち上げれるのがいい。
ただ日本語が苦手で、ファイルやフォルダ名が日本語だと文字化ける可能性がある。
https://addons.mozilla.org/ja/firefox/addon/fireftp/

##SVN
Macで使いやすいアプリが見つからないので、探しているところ。

##Git
SourceTree
https://itunes.apple.com/jp/app/sourcetree-git-hg/id411678673?mt=12&ign-mpt=uo%3D8

#サーバ関係

##MAMP
ローカルサーバが必要な時に。
http://www.mamp.info/en/index.html
[複数使いたいときはこちら](http://qiita.com/ituki_b/items/2af20821338266747f99)

#ソーシャル

##Facebookのデバッガー
キャッシュをクリアする。
https://developers.facebook.com/tools/debug

##OGP画像シミュレータ
1200×630以上の画像を用意する。
http://ogimage.tsmallfield.com/

#その他

##スマホやCSS3関係
http://qiita.com/ituki_b/items/5f9a0dda32ec6fb323cf#1-1

##FontPrep
フォント変換（Mac）
http://fontprep.com/

##OTEdit
フォントを作成。
http://opentype.jp/otedit.htm

##WOFFコンバータ
フォントとWOFFの相互変換。
http://opentype.jp/woffconv.htm

##Jedit
テキストエディタ。
全角カタカナを半角カタカナに変換したり。
http://www.artman21.com/jp/jedit_x/

##ターミナル
マウスオーバー用に画像を一括リネームしたり、サイトマップ作ったり、ページ数聞かれたとき何かに。
http://qiita.com/ituki_b/items/b5c577c7520a0fd30460