OmniAICreator/Qiita-1.07M huggingface dataset:
FutureでDartのevent-loopを理解しようとしてるなう


※とりあえず調べながら書着始めた感じなのであとでまとめます。
※たぶん間違いを含んでるとは思う

## memo
* `event queue` と `microtask queue` がある
* `event queue` contains many `microtask queue`s な認識
* NodeでいうとこのsetTimeout()とproess.nextTick()的な違い
* FutureがFuture返すと、返されたFutureが何返すか待つ

## `event queue` と `microtask queue`
> As the following figure shows, when main() exits, the event loop starts its work. First, it executes any microtasks, in FIFO order. Then it dequeues and handles the first item on the event queue. Then it repeats the cycle: execute all microtasks, and then handle the next item on the event queue. 

超意訳。間違ってたらごめんてへぺろ

(次の図が示すように、） `main()` が実行されイベントループが開始されます。
まず最初に、全ての `microtask` が `FIFO`(First-In-First-Out) の順番で実行されます。
そして一番最初の`event queue`が取り出され処理されます。
そして、これら(全ての`microtask queue`を実行し、次の`event queue`に移る)が繰り返されます。

### つまり何

```dart
import "dart:async";

void main() {
print('main #1');
  new Future(()=> print('computation #1')).then((_) => print('then #1 - 1')).then((_)=> print('then #1 - 2'));
  new Future.microtask(()=> print('comupataion #2')).then((_) => print('then #2 -1')).then((_)=> print('then #2 - 2'));
  new Future(()=> print('computation #3')).then((_) => print('then #3 - 1')).then((_)=> print('then #3 - 2'));
  print('main #2');
}
```

この結果が

```
main #1
main #2
comupataion #2
then #2 -1
then #2 - 2
computation #1
then #1 - 1
then #1 - 2
computation #3
then #3 - 1
then #3 - 2
```

になる。

`main #1（#2)`に関しては最初に出力されるのはそんなに難しくない。
次に、`new Future()` で作った `computation #1` ではなくて、
`new Future.microtask()` で作った `computaion #2` が先に出力されてるのがポイント。

`new Future()` は内部では `Timer.run()` で登録していて、
Nodeでいう`setTimeout(hoge,0)` 的な動きをする。

`new Future.microtask()` は内部では `scheduleMicrotask` というトップレベル関数を叩いてて、
Nodeでいう`process.nextTick()` 的な動きをする。

`FIFO`なので`computation #1` -> `computation #3` の順番になってる。


1. `main()`の`microtask`(print/new Futuer**)を実行
2. `Future.microtask`で登録された`#computation #2`を、同じ`event queue`内で実行
3. やる事なくなったんで次の`event queue`である`computation #1`の`Future`を実行
4. またやる事なくなったんで、次の`event queue`である`computation #3`の`Future`を実行

的な感じだと理解してるなう。


## 参考資料
* https://www.packtpub.com/web-development/mastering-dart
* https://www.dartlang.org/articles/event-loop/
	* ↑This is GOOD. So, this is GOD な資料

# あとがき

* いろいろあとで書こうとしてましたが [The Event Loop and Dart の翻訳を書いた](http://qiita.com/takyam/items/6ad155678c95bba4047f) んで、そっち見てください。
screen -r で attach できないときの対処


screen を使用中にクライアントから通信を切断したりした場合などに、セッションは残っているが `Attached` となっていてそれをそのまま attach できなくなることがある。

```
$ screen -ls
There are screens on:
        11119.pts-8.ip-10-10-10-10        (Attached)
        11520.pts-1.ip-10-10-10-20        (Detached)
2 Sockets in /var/run/screen/S-foobar-user.

$ screen -r 11119.pts-8.ip-10-10-10-10
There is a screen on:
	11119.pts-8.ip-10-10-10-10	(Attached)
There is no screen to be resumed matching 11119.pts-1.ip-10-10-10-10.
```

このような場合には attach したい pts のプロセスを `kill` してやるとよいです。

(pts とは接続している仮想端末のこと)

`ps aux|grep pts|grep sshd` で attach したい pts/N のプロセスを探します。

```
$ ps aux|grep pts|grep sshd
foobar-user 12393  0.0  0.0 111576  1992 ?        S    15:53   0:00 sshd: ec2-user@pts/8
foobar-user 12685  0.0  0.0 111576  1992 ?        S    16:10   0:00 sshd: ec2-user@pts/0
foobar-user 12788  0.0  0.0 114500   896 pts/0    S+   16:12   0:00 grep sshd
```

この場合、pts/0 は grep で使っているこのシェルなので今回は pts/8 のプロセスを `kill` します。

```
$ kill 12393
```

attach します。

```
# Attach したいセッションが(Detached) になっていることを確認
$ screen -ls

# attachする
$ screen -r 11119.pts-8.ip-10-10-10-10
```

これで attach できるようになりました。

### Ref
* http://d.hatena.ne.jp/alexei-karamazov/20130512/1368321943
* http://bayashi.net/wiki/linux/screen/recover_screen
JavaScriptではエルビス演算子を論理演算子で代用できる


## 前提

* 特記しない限り、本記事ではエルビス演算子の実装としてPHP 5.3以降を例にします。
* 本記事はエルビス演算子と同等の動作を論理演算子で代用できる事だけを示すものであり、その是非については問いません。

## 概要

エルビス演算子(Elvis operator,`?:`)は2つの値を指定し、左の値がtrueと評価されるものであれば左の値を、falseと評価されるものであれば右の値を返すものです。
三項演算子の2項目が省略されたようなもので、比較対象の値がfalse相当の場合のデフォルト値を設定するような用途に使えます。

以下がその例になります。

```php:エルビス演算子
$c = $a ?: $b;
```

これは、以下のコードと意味的に等価です。

```php:三項演算子の場合
$c = $a ? $a : $b;
```

```php:if文の場合
if($a){
	$c = $a;
}else{
	$c = $b;
}
```

## コード

上記の例を、JavaScriptで表現すると以下になります。
(`var`宣言は省略しています)

```js
c = a || b;
```

### 詳細

JavaScriptでは、論理演算子`&&` `||`の比較対象としてBoolean以外の値を指定した場合、その値をBooleanに変換せず返します。
よってJavaScriptでは論理演算子`||`をエルビス演算子の代わりとして用いることが出来ます。

## 備考

論理演算子`&&` `||`がBoolean以外の値を返すのはJavaScriptに限った話ではありません。
他のプログラミング言語でもこのような実装になっている言語が存在します。
よってこの記事で紹介したテクニック(と呼べるほどの事かは疑問ですが)はJavaScript以外の言語でも利用できます。
bitof 演算子がほしい

きょうはWINAPIを久しぶりにさわった。
そのときにLOWOED、HIWORD、MAKELONGマクロをつかった。
これはマクロじゃなくてもいいとおもった。

```
#ifndef __cplusplus
#include <stdint.h>
#else
#include <cstdint>
#endif

typedef uint8_t byte;
typedef uint16_t word;
typedef uint32_t dword;
typedef uint64_t qword;

word loword( const dword arg )
{
  return arg & ~ ( word ) 0;
}
word hiword( const dword arg )
{
  return arg >> bitof( word );
}
dword make_long( const word low, const word high )
{
  return low | ( high << bitof( word ) );
}
```

ここで、bitof演算子がほしいと思った。

しかし、これだけはどうしてもマクロに頼らずをえなかった。
`#define bitof( arg ) ( sizeof( arg ) * 8 )`

わたしはマクロは必ず大文字に統一しているのだが、sizeof演算子と差をつけたくなかったので小文字にしたいのだがマクロは他と絶対的な区別が欲しいので大文字が良いのだけれどやっぱりsizeof演算子と同じにbitof(型)をしたいがためにマクロを使っているのでsizeof演算子と区別したくない……というジレンマがある。
こういう気持ち悪さが気に入らないので、bitof演算子がほしいとおもった。

コンパイルエラーで分岐といえばC++のSFINAEなのだけれど、ぱっと解決策が思い浮かばないので難しいか不可能なのではないかとおもう。
[XCode] 絶対パス→相対パスに変更する方法



## 解決方法

* Hogehoge.xcodeprj/project.pbxproj の中を絶対パスが含む文字列(/Users/とか)で検索するとわかりやすい。
* 設定を変更してから、ビルドした後に確認する


### 方法1. $SRCROOT を使う

* \$PROJECT_DIR から \$SRCROOT に変更する
* [例] Build Settings -> Library Search Path -> クリック -> パスを変更

### 方法2. Xcodeから変更

* 該当のライブラリのフォルダをクリック
* 右ペインを表示させる
* Identity and Type のLocation のプルダウンを Abosolute Path から、Relative to Project等に変更する
開眼!JavaScriptから学ぶ: JS言語仕様と本質のまとめ



オライリー本の「開眼!JavaScript 言語仕様から学ぶJavaScriptの本質」の私的まとめ

(執筆途中)


# 1章

## 1.1 オブジェクトの生成

* オブジェクトとは、名前と値を持つプロパティを格納するコンテナにすぎない。(p.2)
* JavaScriptでの「メソッド」は、オブジェクト上で動作するよう意図した関数オブジェクトを持ったプロパティと定義されています。
 (注) ECMA-262 Edition 3 4.3.3に記述
* JavaScriptで表現されるほとんどの値がオブジェクトである (p.3)
* 'foo'や5、trueのようなプリミティブ値も存在しますが、それぞれの型に対応するラッパーオブジェクトが存在します (p.3)
* JavaScriptはオブジェクトで値を表現する 
* JavaScriptは、String() と Object() のコンストラクタ関数を言語そのものに組み込むことでString()オブジェクトやObject()オブジェクトの生成を単純化しています。(p.4)

## 1.2 コンストラクタ関数はオブジェクトインスタンスを構築して返す
vshufps


src1, src2 の 512bit 内の 128bit に含まれる32bit値4個をそれぞれまぜまぜして、src1 を混ぜた結果と、src2 を混ぜた結果をあわせます。x86の伝統に従い、128bit 境界は超えられません。


_mm512_shuffle_epi32 と _mm512_shuffle_ps は似た挙動をしそうですが、あんまり似てないです。おいAVX512キモいぞ、と思ったのですが、SSE2からの伝統でした。問題無いですね。


```cpp
#include <immintrin.h>
#include <stdio.h>

float in0[16] = {100,
                 101,
                 102,
                 103,
                 104,
                 105,
                 106,
                 107,
                 108,
                 109,
                 110,
                 111,
                 112,
                 113,
                 114,
                 115};

float in1[16] = {200,
                 201,
                 202,
                 203,
                 204,
                 205,
                 206,
                 207,
                 208,
                 209,
                 210,
                 211,
                 212,
                 213,
                 214,
                 215};

float out[16];

static inline __attribute__((always_inline)) void
test(const int imm)
{
    __m512 v0 = _mm512_loadu_ps(in0);
    __m512 v1 = _mm512_loadu_ps(in1);

    __m512 v = _mm512_shuffle_ps(v0, v1, imm);
    int i;

    _mm512_storeu_ps(out, v);

    for (i=0; i<16; i++) {
        printf("imm=%d%d%d%d, out[%d] = %f\n",
               (imm>>6)&0x3,
               (imm>>4)&0x3,
               (imm>>2)&0x3,
               (imm>>0)&0x3,
               i,
               out[i]);
    }
}

int
main()
{
    test(_MM_SHUFFLE(3,2,1,0));

    test(_MM_SHUFFLE(2,2,0,0));

    test(_MM_SHUFFLE(0,0,0,0));
}
```

```
imm=3210, out[0] = 100.000000
imm=3210, out[1] = 101.000000
imm=3210, out[2] = 202.000000
imm=3210, out[3] = 203.000000
imm=3210, out[4] = 104.000000
imm=3210, out[5] = 105.000000
imm=3210, out[6] = 206.000000
imm=3210, out[7] = 207.000000
imm=3210, out[8] = 108.000000
imm=3210, out[9] = 109.000000
imm=3210, out[10] = 210.000000
imm=3210, out[11] = 211.000000
imm=3210, out[12] = 112.000000
imm=3210, out[13] = 113.000000
imm=3210, out[14] = 214.000000
imm=3210, out[15] = 215.000000
imm=2200, out[0] = 100.000000
imm=2200, out[1] = 100.000000
imm=2200, out[2] = 202.000000
imm=2200, out[3] = 202.000000
imm=2200, out[4] = 104.000000
imm=2200, out[5] = 104.000000
imm=2200, out[6] = 206.000000
imm=2200, out[7] = 206.000000
imm=2200, out[8] = 108.000000
imm=2200, out[9] = 108.000000
imm=2200, out[10] = 210.000000
imm=2200, out[11] = 210.000000
imm=2200, out[12] = 112.000000
imm=2200, out[13] = 112.000000
imm=2200, out[14] = 214.000000
imm=2200, out[15] = 214.000000
imm=0000, out[0] = 100.000000
imm=0000, out[1] = 100.000000
imm=0000, out[2] = 200.000000
imm=0000, out[3] = 200.000000
imm=0000, out[4] = 104.000000
imm=0000, out[5] = 104.000000
imm=0000, out[6] = 204.000000
imm=0000, out[7] = 204.000000
imm=0000, out[8] = 108.000000
imm=0000, out[9] = 108.000000
imm=0000, out[10] = 208.000000
imm=0000, out[11] = 208.000000
imm=0000, out[12] = 112.000000
imm=0000, out[13] = 112.000000
imm=0000, out[14] = 212.000000
imm=0000, out[15] = 212.000000
```

そろそろ読んでる人達も飽きてきたと思うので、次回、@tanakmura がついに登場した最強のshuffleである vpermt2b について書いてshuffleを終わらせようと思います。
iTunes Connect ビルドのステータス


2014年11月現在

Test Flight


##4つのステータスの種類

1. 準備中
2. 非アクティブ
3. アクティブ  (30 (残り日数))
4. レビュー審査待ち


## 各ステータスの説明

## 1. 準備中

バイナリーをアップロードして、10分位?このステータス

## 2. 非アクティブ

準備中が終わった状態

## 3. アクティブ

「TestFlight ベータ版テスト」をオンにした状態?

## 4. レビュー審査待ち

多分、外部のみ?
Appleが審査しているのだと思う。
開発環境

BEAR.SundayのPHP開発環境を紹介します

### Disclaimer

開発環境のベストプラクティスのようなものに興味があるのですが、結局のところ良く分かりません。個人によって多様で「最強の開発環境」というコンセンサスはないように思えます。フレームワーク開発者のリードデベロッパーの多くもテキストエディタのみという方が多いような感じがします(Fabienさんとかpmjonesとかマシューさんとか）

なのでここで紹介する環境も「おすすめPHP開発環境」ではありません。BEAR.Sundayの開発をこのようにしてるという記事です。
 
### 環境

#### IDE

PHPStormを2012年の10月頃から使っています。PHPStormを知ったきっかけは@akkieさんという方がRay.DiのPRの時に「ヨーロッパではとてもポピュラーだよ、[使ってみたら？](https://github.com/koriym/Ray.Di/issues/16)と教えてくれたからです。PHP開発は最初期からIDEでZend Studio 2.0(!)の時かから使っています。

プラグインはphpunitのカバレッジをサイドに表示できるものと、アノテーションの補完を可能にするものと２つ入れています。

#### OS

OSXで開発を行っています。Vagrant等使っていません。

#### PHP

php-osx(liip.ch)のバイナリパッケージを使っています。元々自分たちが使うために作ったそうで(最近のliipではVagrantを使ってるみたいです）開発者がしっかりコミットして作られたパッケージという印象を受けます。インストールされる拡張も多く、かなり長期間使っていますが不便や不満を感じたことはありません。

#### QA Tool

 * phpmd
 * phpcs
 * php-cs-fixer

各プロジェクトにantのbuild.xmlを含めているので普段は引数を省略して下記のように使用できます。PHPStormから使うこともあります。

```
$ ant phpcs
$ ant phpmd
```

#### CI

 * travis
 * scrutinizer

http://php-osx.liip.ch/
https://github.com/liip/php-osx

PHPの環境切り替えツールは使いません。必要あれば複数バージョンのPHPをPHP-OSXでインストールします。その時はグローバルのPHPに依存しないで、phpunitやbuit-in webサーバーでバイナリのPHPを直接指定しています。ほとんどの場合、ローカルのPHP環境は１つだけにして複数でのテストはCIサーバーで行います。

#### Gitクラアント

メインは[GitHub製のクライアント](https://mac.github.com/)です。良くできてると思います。PHPStormのクライアントも最近使い始めました。使いこなすといいような感じもしています。git flowやrebaseなどはコンソールで。

#### デバッガー

デバッガー（Xdebug）は多用しています。ユニットテストだけでなくwebスクリプトやコンソールスクリプトでも良く使います。トレースも良くします。

*TIPS*

`ArrayObject`は注意です。格納された値がIDEのデバッガで確認できずPHPStormの対応の問題だと思っていたのですがこれは仕様上の問題らしくIDEでは対応できないそうです。

#### SQL

 SQLを作成するのにはDBブラウザの[NaviCat](http://jp.navicat.com/store)を使っていました。静的なクエリーはPHPのクエリービルダーライブラリ等を使用せずに、DBブラウザでGUIでクエリーを作成して確認、保存してそのSQLを張っていました。

### まとめ

重視するのはイテレーションの速さとストレスの少なさです。コーディング、実行、デバック、カバレッジ確認、等が全て同一環境のIDEで行います。

（ライブラリ開発では特に）ローカルの環境をOSX、CIをUbuntuと変えることで早期に環境開発をロックして依存が隠れないようにしています。またVMを使わないOSXローカル開発は負荷が低く、最も低スペックの4G RAMのMacBookAirでIDEを使ってもストレスがありません。

あえておすすめするとしたらXdebugです。あまり使われてる印象ありませんが個人的にはPHPStorm上でPHPUnitをXdebug+トレースで使うのは、PHPStormのあり/なしぐらいのパワーを感じます。（**しかし**そうやって多用するのが筋がいいのか悪いのか、確信がありません）
vagrant + virtualbox で仮想環境の構築


## install

* [virtualbox](https://www.virtualbox.org/)
* [vagrant](https://www.vagrantup.com/)

## vagrant box 

http://www.vagrantbox.es/

ご利用は自己責任で。

## vagrant boxの登録 (box add)

```sh
$ vagrant box add CentOS64_i386 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-i386-v20131103.box

# add が終わると以下のディレクトリにboxが保存される
$ ls ~/.vagrant.d/boxes/
entOS64_i386

$ vagrant box list
CentOS64_i386 (virtualbox, 0)
```

## vagrant 起動 (init / up)

```sh
$ vagrant init CentOS64_i386
$ ls
Vagrantfile
$ vagrant up
```

## vatgrant 各種コマンド
* status
* suspend
* resume
* halt
* up
* destroy

## vagrant に接続
```sh
$ vagrant ssh
[vagrant@localhost ~]$
```

## vagrant 環境上で Web サーバ立ち上げてローカルから閲覧
```
[vagrant@localhost ~]$ sudo yum -y install httpd
[vagrant@localhost ~]$ sudo chkconfig httpd on
[vagrant@localhost ~]$ sudo service httpd start
[vagrant@localhost ~]$ sudo service iptables stop
[vagrant@localhost ~]$ sudo chkconfig iptables off
[vagrant@localhost ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:5A:FB:02
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          ...
```
10.0.2.15 ではアクセス出来ない...

## vagrant の network設定変更
Vagrantfileの以下を有効化(コメントアウトを外す)

```
  config.vm.network "private_network", ip: "192.168.33.10"
```

Vagrant の再起動

```
$ vagrant reload

default: Warning: Connection timeout. Retrying...
default: Warning: Connection timeout. Retrying...
default: Warning: Connection timeout. Retrying...
```

なんかsshがらみの設定でtimeoutでる...がとりあえず気にせず...

```
$ vagrant ssh
[vagrant@localhost ~]$ ifconfig
eth1      Link encap:Ethernet  HWaddr 08:00:27:04:12:1D
          inet addr:192.168.33.10  Bcast:192.168.33.255  Mask:255.255.255.0
```

http://192.168.33.10/ にて無事にvagrant上で動作している httpd にアクセスできました。
CPUのはなし

この記事は[OUCC Advent Calender](http://www.adventar.org/calendars/449 "OUCCAC") 9日目の記事です．

はじめまして，ネムレスと申します．
これを機会にTwitterアカウントを設立しました．

一応，OUCC所属なのでなにか書こうかなーと思い登録しましたが
特にネタがないので，適当な事書いてお茶を濁します．ごめんなさい．

## CPUアーキテクチャ

なんか目の前にいくつかの種類のアーキテクチャのプロセッサが転がってたのでこれについて書きます．

CPUのアーキテクチャとはどのようなものか聞かれて答えられますか?

主に次のような事項が上げられます．

- 命令アーキテクチャ
- デコードパイプライン
- 演算アーキテクチャ
- キャッシュ
- データパス
- レジスタ
- etc...

### 命令アーキテクチャ

CPUの機械語がどういう機械語かという事です．
これはCPUの演算器(ALU)だとか，レジスタとか，そういったものがどういうデータパスで接続されて，どういう指示を与えてメモリから実行していくかに大きく依存します．

皆さんが使ってるIntelのx86_64アーキテクチャ以外に様々な物があります．

- Itanium64
- SPARC
- ARM，AArch64
- MIPS
- PowerPC，POWER
- AVR32
- SH
- Alpha
- S390
- MC68000
- etc etc

思い付くものを上げてみましたが色々あります．
x86_64はIntelとAMDが主に作ってますが，VIAとかも作っています．
他にもSPARCは元はSunが作っていましたが今はFujitsuがHPCで良く使ってたり，ARMはスマートフォン向け等で近年多くの企業が製造していますね．

命令アーキテクチャを新たに作らず，既存の物と互換のある設計にしたりして複数の企業がその命令セットを採用するということは，既にコンパイルしたバイナリが動作したりするといったソフトウェア資産の面で大きなメリットがあります．

しかし，命令セットが同じだとしても中身はまったく高性能化したり複雑化して別物であったりします．IntelのCPUはi8086以来命令セットは後方互換を持ちつづけていますが，ご存知の通りまるで中身はベツモノです．

## デコードパイプライン

命令アーキテクチャが決まると，その機械語をデコードしてCPUの各モジュールをオンにしたりオフにしたりメモリを読み込むといった具体的な動作をさせる信号を流します．そのためのデコードというのは実は重要な部分で，命令が高性能かつ高機能になればなるほどデコードは複雑になってしまうというトレードオフになります．

デコードを単純にして多くの命令を沢山実行させるのがRISC，ひとつひとつの命令を高機能にして高速化を図るかわりにデコードが複雑で並列実行が苦手なのがCISC，と伝統的に区別されてきました．

RISCはMIPS，ARM，PowerPCなど
CISCはx86_64，MC68000などがそうです．

デコードが複雑だと電力消費が増えるとかどうしても1命令を高機能に複雑にしていく方向は限界があると言われていましたが，
スーパースカラを取り入れベクトル命令を取り入れとRISC化してきたx86_64に対し，
どうみても複雑な命令をどんどんん取り入れたりThumb2命令とARM命令で命令長が異なりRISCは固定長命令では……となってしまうARMがいたり，互いに互いの良いところを吸収する形で発展しており両者の違いは曖昧になっています．

## 演算アーキテクチャ，キャッシュ，レジスタ

演算器はCPUのコアとなります．
昔は浮動小数点数演算ユニット(FPU)のみ別売りのコプロセッサとして販売されたりして，PC-98時代などはi286とかにそれを付けて高性能化!等としていましたが，今やスーパーコンピュータで使われていたベクトル命令すら取り入れられています．
演算ユニットを何個，どこに配置するか，またはどんな方法で設計された回路を使うか，様々な考えがあります．

また，ALUにレジスタやキャッシュをどう接続するかは考えものです．x86_64のように並列化命令(SIMD)のためのレジスタを追加したりしていると考える事も多いでしょう．

キャッシュも，メモリとCPUの間に設置されますが，どういうデータパスで接続されるのか，どういうメモリをどのくらいの容量で配置するか，様々なトピックがあります．

## おわりに

思いついた適当に書きましたがCPUの設計については素人なのでちゃんと理解できてない部分がおおいです．
しかしながら，たまにはこういう部分に目を向けて欲しいな，せめて自分がつかってる端末やマシンのCPUがx86だったりARMだったりのどのアーキテクチャで動いてるのかぐらいは考えてみて欲しいと思ったりしてこの記事書きました．

そんなわけでたまには低レイヤな話でした．
Selmerを使ったローカルHTMLテンプレート

Selmerではタグを簡単に作れるので結構便利です。
`{% include %}`タグを使えば外部ファイルをテンプレートとして使えますが、ローカルにテンプレートを定義できるタグを作ってみます。

変数を%～～%のように定義できる、以下のようなテンプレートを作れるようにします。

```sample.html
{% tmpl row %}
<div class="row">
    <div class="col-md-2">%name%</div>
    <div class="col-md-4">
        %content%
    </div>
    <div class="col-md-2">%value%</div>
</div>
{% endtmpl %}

{% tmpl text %}
{% use tmpl="row" name="住所" value="abc" %}
<input id="%id%" class="form-control" type="text">
{% enduse %}
{% endtmpl %}

{% use tmpl="text" id="address" %}{% enduse %}
```

結果としては以下が出力されるようにします。

```:html
<div class="row">
    <div class="col-md-2">住所</div>
    <div class="col-md-4">
        
<input id="address" class="form-control" type="text">

    </div>
    <div class="col-md-2">abc</div>
</div>
```

Clojureのコードは以下のとおり。
`add-tag!`でtmplタグとuseタグを追加しています。
ちなみに閉じタグが不要なものを作る場合は最後の`:endtmpl`や`:enduse`のようなものはいりません。

```sample.clj
(ns sample
  (:require [selmer.parser :as p]
            [clojure.string :as s]))

(def tmpl-map (atom {}))
(p/add-tag! :tmpl
            (fn [args context-map content]
              (when-let [k (first args)]
                (swap! tmpl-map assoc k
                       (get-in content [:tmpl :content]))
                nil))
            :endtmpl)

(p/add-tag! :use
            (fn [args context-map content]
              (let [h (->> (mapcat #(let [[k v] (s/split % #"=")] [k (read-string v)]) args)
                           (apply hash-map)
                           (into {"content" (get-in content [:use :content])}))]
                (when-let [tmpl (get @tmpl-map (get h "tmpl"))]
                  (reduce-kv (fn [m k v] (s/replace m (str "%" k "%") v)) tmpl h))))
            :enduse)
```
各パッケージにおける RBF カーネルのパラメータ名の違い

R で SVM を使おうとして RBF カーネルのパラメータの設定に手間取ったのでメモ．RBF カーネルの一般的な定義における文字の使い方と，各パッケージにおける文字の使い方が異なるため，対応関係を整理します．

# 一般的な形

```math
k\left(\mathbf{x_1}, \mathbf{x_2}\right) = \exp\left(-\frac{\|\mathbf{x_1} - \mathbf{x_2}\|^2}{2\sigma^2}\right) = \exp\left(-\gamma \|\mathbf{x_1} - \mathbf{x_2}\|^2\right)
```

RBF カーネルはガウス関数の形をしているので，正規分布を意識した表し方で定義するのが一般的だと思います．この定義では，文字 $\sigma$ は標準偏差っぽい値として使われており，$\gamma = 1 / 2\sigma^2$ と置くことで定義を簡潔化しています．さらにマイナスを含めて $\gamma = -1 / 2\sigma^2$ とする場合もあります．

# e1071

```math
k\left(\mathbf{x_1}, \mathbf{x_2}\right) = \exp\left(-\gamma \|\mathbf{x_1} - \mathbf{x_2}\|^2\right)
```

e1071 の `svm` では RBF カーネルのパラメータとして `gamma` を指定することができますが，この `gamma` が表しているのは一般的な定義でいうところの $\gamma$ です．

一般的な定義における文字の使い方と，`svm` における文字の使い方が一致しているので，特に混乱することはありません．

なお，デフォルトでは `gamma` に特徴ベクトルの次元数の逆数がセットされます．

# kernlab

```math
k\left(\mathbf{x_1}, \mathbf{x_2}\right) = \exp\left(-\sigma\|\mathbf{x_1} - \mathbf{x_2}\|^2\right)
```

kernlab の `ksvm` では RBF カーネルのパラメータとして `sigma` を指定することができますが，この `sigma` が表しているのは一般的な定義でいうところの $\gamma$ です．

一般的な定義における文字の使い方と，`ksvm` における文字の使い方が異なるので，注意が必要です．

なお，デフォルトでは `sigma` の値は `sigest` 関数で推定された値がセットされます．
riot apiを使ったWebアプリケーション

# ごあいさつ
いつもはJavascriptやphpを書いているPinonです。
夜中の１時ごろによくLeagueOfLegendsをやっています。
好きなChampionはAniviaです。　Aniviaちゃんかわいい。
~~sliver5の雑魚です~~

riot apiのAdventCalenderということで、
riot apiを使ったものを~~やっとまともになったので~~紹介します。

# 作ったもの

[lol-name-db](http://lol-name-db.herokuapp.com/)というものを作りました

夜中の１時ごろに友人とよくNormalをしているのですが、
その時によく
**「この人…前戦った相手じゃない…？」**
と話をしています。

しかしゲームクライアントから見れるmatchingHistoryは最新の10件しか表示されません。
そこで、戦った人全てを保存しておくアプリケーションを作りました。

登録しておけば１時間に１回（仕様）更新され、どんどん増えていくはずです。

# 使ったもの
* [riot api](https://developer.riotgames.com/)
* [DataDragon]()
* [laravel](http://laravel.com/) - phpのframeworkを勉強したかった
* [jquery](http://jquery.com/) 
* [foundation](http://foundation.zurb.com/) - css framework
* [heroku](https://www.heroku.com/) - ドメインを取ったりするのがめんどうだったので

# 苦労した点
1. APIのリクエスト上限が　
 ``10 request(s) every 10 second(s)
500 request(s) every 10 minute(s)
``
という仕様で、APIを叩いている時にすぐ上限がきてしまう。
 + sleepを挟んで処理を遅らせた。
* 時間の比較が[strtotime](http://php.net/manual/ja/function.strtotime.php)で同じ時間の時は弾く処理をしていたが、何故か弾かれない条件があった。
 + [Carbon](https://github.com/briannesbitt/Carbon)をつかった。これは他のものにも使えそう
* CUSTOM MODEでbotのみと戦うと、JSONの中にfellowPlayersは無い。
 * これを見つけるのに苦労した。何故かJSONの中に無かったのはriot plzと思った。 

# 残タスク
* lol-name-dbっていう名前をかっちょいいのにしたい
* namelistが増えるとどうしても縦長になるのでページネーションを入れる
* おされなfaviconがほしい。
* 削除、ログアウト、SummonerNameを変更できるようにする。
などなど

# 感想とか
好きなゲームで、アプリケーションが作れるということがすごく楽しかった。
好きなモノだとモチベが上がる。

APIを公開することは別のゲームとかでもやってほしいなーと思います。
技術についてはたくさん勉強になった。
laravelの使い方を１から教えてくれたhamada君や、
デバッグを行うためにNormalに付き合ってくれたFriendのみんなには本当にお世話になりました:)
Windowsでgem installするとSSLエラーが出る場合の解決策


## エラー内容
Windowsで`gem install`(`bundle install`)すると、

```
Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
```

というSSLエラーが出て、Gemをインストールできない。

### 環境
Windows上のRuby 2.1.5([RubyInstaller](http://rubyinstaller.org/)版)


## 解決策
[Ruby - bundle install がこけるようになった - Qiita](http://qiita.com/akaneko3/items/25c86e6991e35df33c3b)の[コメントで紹介されている](http://qiita.com/akaneko3/items/25c86e6991e35df33c3b#comment-56c0dce2b85eba0286cc)、以下のページの通りにやればOK。

[Workaround RubyGems' SSL errors on Ruby for Windows (RubyInstaller)](https://gist.github.com/luislavena/f064211759ee0f806c88)


## 手順

### 1. 新しい証明書ファイルをダウンロードする
[Step 1: Obtain the new trust certificate](https://gist.github.com/luislavena/f064211759ee0f806c88#step-1-obtain-the-new-trust-certificate)から、「AddTrustExternalCARoot-2048.pem」を右クリックし名前を付けて保存でダウンロードする。

`.pem`という拡張子でなければならないので、きちんとこの拡張子でダウンロードされているか確認する。

### 2. RubyGemsがあるフォルダに移動する
エクスプローラーを開き、上のパスが表示されているバーをクリックして、

```
C:\Ruby21\lib\ruby\2.1.0\rubygems
```

と入力しEnterを押して、RubyGemsがあるフォルダに移動する(Ruby 2.1の場合)。

Ruby 2.1以外や標準のフォルダ以外にインストールしている場合は、

```
'C:\Ruby21\lib\ruby\2.1.0\rubygems' は見つかりません。
```

と言われるので、

コマンドプロンプトから`gem which rubygems`を実行してRubyGemsの場所を確認し、`.rb`を抜いたフォルダに移動する

```
C:\>gem which rubygems
C:/Ruby21/lib/ruby/2.1.0/rubygems.rb
```

→`C:/Ruby21/lib/ruby/2.1.0/rubygems`に移動する

(そのままコマンドで`start C:\Ruby21\lib\ruby\2.1.0\rubygems`とすればエクスプローラーが開くらしいが、自分の環境ではうまく動かなかった)

### 3. ダウンロードした証明書ファイルをコピーする

移動したフォルダに`ssl_certs`フォルダがあるので、ダウンロードした「AddTrustExternalCARoot-2048.pem」をそこにコピーする。

### 4. 確認
再度`gem install`(`bundle install`)を実行し、無事エラーが出なければ成功。


## 補足：なぜこの不具合が起きているのか
上のサイトにこの不具合の背景も載っていたので、軽く訳した。(英語弱いので超意訳注意)

> 最近、[rubygems.org](https://rubygems.org/)で使用するSSL証明書の更新が行われた。これに対応した新しい証明書はRubyGemsの最新バージョンに付属しているが、困ったことにWindowsではこの最新バージョンにバグがある。
> そのため、RubyInstallerに付属するRubyGemsが更新できず古いバージョンのままになっており、このSSLエラー問題が起きている。
> 修正バージョンがリリースされても、それをRubyGems経由でインストールするにはSSL接続が必要なので不可能、という鶏卵問題になってしまっている。

なので、WindowsでのRubyGemsのバグが修正され、さらにRubyInstallerに付属するRubyGemsが最新バージョンに更新されれば、この問題は解決すると思われる。
それまでは上の手順を行って凌ぐ必要がある。


## 参考
- [Workaround RubyGems' SSL errors on Ruby for Windows (RubyInstaller)](https://gist.github.com/luislavena/f064211759ee0f806c88)
MacでVagrant(chef/centos-6.5)使ってみる

#Intro
単なる構築メモです。
chefがメンテしているCentOS6.5のイメージを入れてみます。

#必要な物
[VirtualBox](http://easyramble.com/install-vagrant-virtualbox-on-mac.html)

#環境
* MacBook Pro Retina, 15-inch, Late 2013
* OS X 10.9.5（13F34）
* iTerm or Terminal

#手順

##1.Vagrantダウンロード
http://www.vagrantup.com/downloads.html
からdmgをダウンロードし、インストール。(現時点では1.6.5)

```bash
$ vagrant --version
Vagrant 1.6.5
```


##2.Vagrant用のディレクトリ作る
今回はホームにVagrantディレクトリを作ることにした。
```
mkdir -p ~/Vagrant
```

##3.boxイメージをダウンロード
[es](http://www.vagrantbox.es/)のボックスイメージから落とそうと思ったが
メンテナンスが適当らしい。

https://vagrantcloud.com/discover/
からとってくるのが簡単らしい。今回はchefがメンテしてるCentOS6.5を使う。

下記コマンドでboxイメージなければダウンロードまで行ってVMを起動してくれる。
すごい!!時間がちょっとかかります。

```bash
cd ~/Vagrant
mkdir chef-centos-6.5
cd chef-centos-6.5
vagrant init chef/centos-6.5
vagrant up
```
正常終了すればOK

起動が終わるとboxが追加されてるのがわかります

```bash
$ vagrant box list
chef/centos-6.5 (virtualbox, 1.0.0)
```

##4.ログインテスト
普通にログインできればOK

```bash
$ vagrant ssh
Last login: Fri Mar  7 16:57:20 2014 from 10.0.2.2
[vagrant@localhost ~]$
```

##5.sshの設定しておく

```bash
vagrant ssh-config >> ~/.ssh/config
```

```bash:~/.ssh/config
Host centos65 #ここを任意に変える
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/takaito/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

```bash
ssh centos65
```
でssh接続できればOK

##6.Vagrantファイルをいじる
開発用途(ElasticSearch/fluent/rubyなどいろいろいじる）なのでメモリ増加やIPの設定など。

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

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.5"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "public_network"
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.customize ["modifyvm", :id, "--memory", "4096"]
  end
end

```

##7.その他コマンドまとめ

```bash
#起動
vagrant up

#サスペンド
vagrant suspend

#停止
vagrant halt

#再起動
vagrant reload

#状態確認
vagrant status

#rootの初期パスワード
vagrant

```


#追記
chefのboxはbentoに移行されていた！
https://atlas.hashicorp.com/bento/boxes/

#参考URL
http://www.vagrantbox.es/
https://vagrantcloud.com/discover/popular
http://easyramble.com/install-vagrant-virtualbox-on-mac.html
org-modeとopen-junk-fileで始める快適メモ生活


org-modeとopen-junk-fileを組み合わせた作業ログの書き方についてまとめてみました。

[[記事本文へ]](http://ongaeshi.hatenablog.com/entry/org-and-open-junk-memo-life)
 
![org-02.gif](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20141210/20141210004229.gif)

![org-01.png](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20141210/20141210003420.png)
ChromeでGamepad API を叩く

今更かもしれないけどChromeでデバッグ中にnavigator.getGamepads() 生えてるの気づいて調べた。

リファレンス見るのも面倒なので簡単にスニペットで動作確認。ゲームパッド指してこれを叩く。

```
// ボタンを抑えながら
> navigator.getGamepads()[0].buttons.map(function(b){return b.pressed})
[true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

// キーを押しながら
> navigator.getGamepads()[0].axes
[-0.9249231815338135, -0.380154013633728, 0, 0]
```

最初に気づかなかったけど、ポーリングしないとダメ。getGamepads()した時点のステータスが帰ってくる


あとはこれをみて察してくれ

```
Gamepad {buttons: Array[17], axes: Array[4], mapping: "standard", timestamp: 10712509240, connected: true…}axes: Array[4]0: 01: 02: 03: 0length: 4__proto__: Array[0]buttons: Array[17]connected: trueid: "Xbox 360 Controller (STANDARD GAMEPAD Vendor: 028e Product: 045e)"index: 0mapping: "standard"timestamp: 10712509240__proto__: Gamepad
```

Macに箱コン繋いでChromeのGamepad API 叩いてるの、業界オールスター感ある

参考
- [Using the Gamepad API - Web developer guide | MDN](https://developer.mozilla.org/ja/docs/Web/Guide/API/Gamepad "Using the Gamepad API - Web developer guide | MDN")
choroplethr - Vignettes - d) アメリカの郵便番号に基づく地図

Rのパッケージ`choroplethr`のビネットの翻訳です．
( 原文: http://cran.r-project.org/web/packages/choroplethr/index.html )

* a) [イントロダクション](http://qiita.com/nakamichi/items/23730349f31a377fb071)
* b) [アメリカの州単位コロプレス図](http://qiita.com/nakamichi/items/b8267674b610ef6e1cab)
* c) [アメリカの郡単位コロプレス図](http://qiita.com/nakamichi/items/2f63dcfb7b1cc407d87c)
* d) [アメリカの郵便番号に基づく地図](http://qiita.com/nakamichi/items/889d3883e9b2ff8e2cdf)
* e) [国家単位のコロプレス図](http://qiita.com/nakamichi/items/5090b4dadeed42c2e13c)
* f) [国勢調査の地図](http://qiita.com/nakamichi/items/de929da9335f96f6468c)
* g) [世界銀行データの地図](http://qiita.com/nakamichi/items/66fa782bb3104dd815bf)
* h) [コロプレス図の動画](http://qiita.com/nakamichi/items/02ca0f678933405cf18f)
* i) [自分の地図を作る](http://qiita.com/nakamichi/items/99ff93769f4f67b97d18)
* j) [行政区画レベル1の地図を作る](http://qiita.com/nakamichi/items/8fde40a12c6aca2abbd3)

----------

# d) アメリカの郵便番号に基づく地図 #

`zip_map`関数によってアメリカの郵便番号を可視化することができます．

```{r}
library(choroplethr)

?df_pop_zip
data(df_pop_zip)

?zip_map
zip_map(df_pop_zip)
```

![us-zip-pop.png](https://qiita-image-store.s3.amazonaws.com/0/58917/7dc77314-300d-f106-917d-500691954967.png)

上で示したように，`zip_map`に必須の引数はデータフレームだけです．
オプション引数は`?zip_map`とタイプすれば見ることができます．

この地図は散布図であり，各点は郵便番号に対応する緯度と経度を表していることに注意してください．
また，州の境界は描かれていますが，それぞれの郵便番号に属する地域の境界は描かれていないため，この図は正式にはコロプレス図ではありません．


## データ要件 ##

`zip_map`関数に渡すデータフレームは"region"と"value"という名前の列を持っている必要があります．
"region"列の要素は`zipcode`パッケージの郵便番号と**厳密に**一致している必要があります．
というのは`choroplethr`は緯度と経度を`zipcode`パッケージから取得しているからです．

```{r}
library(zipcode)

?zipcode
data(zipcode)
head(zipcode)
```

```{r}
##     zip       city state latitude longitude
## 1 00210 Portsmouth    NH  43.0059  -71.0132
## 2 00211 Portsmouth    NH  43.0059  -71.0132
## 3 00212 Portsmouth    NH  43.0059  -71.0132
## 4 00213 Portsmouth    NH  43.0059  -71.0132
## 5 00214 Portsmouth    NH  43.0059  -71.0132
## 6 00215 Portsmouth    NH  43.0059  -71.0132
```

要するに，5桁の郵便番号を使用する必要があります


## データの探索 ##

`zip_map` 関数にはデータの探索を助ける二つの引数が用意されています．`buckets`と`zoom`引数です．
`buckets`の値はデフォルトでは7です．これは7種類の色が使用され，それぞれの色で等しい数の郡が塗り分けられるということです．
`buckets`が1の場合は連続的なカラースケールが使用されます．
`zoom`はデフォルトでは`NULL`であり，全ての郡が表示されます．
`zoom`には有効な州の名前のベクトルを指定することができます．
州の名前は`state.regions`オブジェクトの"region"列で定義されているものを使用する必要があります．


例として，`choroplethr`でアメリカ西海岸の郵便番号に対応する地域の人口を表示してみましょう．


```{r}
zip_map(df_pop_zip,
        title   = "2012 Population Estimates",
        legend  = "Population",
        buckets = 1,
        zoom    = c("california", "washington", "oregon"))
```

![us-zip-pop-zoom.png](https://qiita-image-store.s3.amazonaws.com/0/58917/25e10456-0d6f-e2ed-9a49-b3284f66d230.png)


## 高度なオプション ##

上で例示したオプション引数によるカスタマイズ以上のことがしたい場合は，`ZipMap`オブジェクトを作成する必要があります．
`choroplethr`はオブジェクト指向プログラミングを活用するために`R6`を使っています．
以下の例ではパレットをカスタマイズするために`Choropleth`基底オブジェクトを
`ggplot2_scale`を使って拡張しています．

```{r}
library(ggplot2)

choro = ZipMap$new(df_pop_zip)
choro$title = "2012 Population Estimates"
choro$ggplot_scale = scale_color_brewer(name="Population", palette=2)
choro$render()
```

![us-zip-pop-green.png](https://qiita-image-store.s3.amazonaws.com/0/58917/75f0eddd-487b-9db7-d3e2-d3a77d1333d5.png)
Task ‘’ not found in root project ‘ProjectName’ の解消方法(Android Studio)

Task ‘’ not found in root project ‘ProjectName’ というようなエラーがAndroid Studioで出た時の対処方法について
自分のブログにまとめました。

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

使っているAndroid Studioのバージョンは昨日(2014年12月9日)リリースされたばかりの1.0です。
ご参考までに。
VagrantでAnsibleを使うときのSSH鍵の登録方法

VagrantとAnsibleを使ってVMの構築するとき、SSH鍵の登録に躓いたのでメモっとく
VagrantでAnsibleを実行するのは、〜/.vagrant.d/insecure_private_keyを使って認証するのだが、
<pre>
vagrant ssh-config >> ~/.ssh/config
</pre>
だけだと、ansible実行時SSH失敗する。
このとき設定で、HostNameを通信先のホストのIP、domainにする。
<pre>
Host 適当
  HostName <対象ホストip/domain>
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile $HOME/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
</pre>
AndroidStudio1.0ではここが変わった

*見つけ次第追記予定*

###プロジェクトサブウインドウの表示が変わった。
appソースディレクトリとgradleスクリプトディレクトリに別れてツリー表示されるようになった。β版では、プロジェクトツリーに全部がごっちゃりｗと詰まっており、修正するファイルの特定に意外と手間取る面があったので、これは良い改変。

### AndroidSDKツールの画面デザインが変わった。
特にエミュレーター選択起動画面で表示される情報が整理され、Androidのバージョンや画面サイズが判りやすくなり、テスト対象としてどれを使うのが良いのか選択しやすくなった。

### Androidテスト起動コマンドのキャッシュ化
まず、Androidテスト起動時、AndroidStudioでは内部で処理しているエミューレータとIDE間でやり取りされるコマンドを見ることができる。これはβ版から変わってはいない。が、1.0ではこのテスト時に実行する起動コマンド群をキャッシュ化しており、同じエミュレータに対して処理を行う場合、テスト実行時の開始時間を大幅に短縮することに成功している。なので、テストを回数繰り返してもストレスが発生せず、効率が良い。
JavaScriptで動的にスタイルシートを作成する

以前、JavaScriptで他のアプリケーションで作成されたテキストデータの中身を表示する際に、動的にスタイルシートを生成する機会があったので、その時に書いたコードを元に実装コードの例と[デモ](http://jsdo.it/tom-konda/dynamicStyleDemo)を載せます。
今回の実装では、*ランダムでデータを作成し文字色もランダムという設定*で実装しています。

```js
$(function(){
    // 動的に設定するスタイルシートの作成
    $('head').append('<style id="randomStyle">');
    var buttonEvent = function(){
        // スタイルのリセット
        $('#randomStyle').empty();
        $('#result').empty();
        
        /*
          document内のスタイルシートの取得と適当な長さの配列作成
          randomArrayは実データを元にする場合はそのデータの取得を行う
        */
        var styleSheets = document.styleSheets,
            randomArray = new Array(getRandNum(10, 'ceil'));
        // 0で埋める
        randomArray.fill(0, 0);
        /*
          データ1つ1つのスタイル設定を行う
          実データの場合、これはデータの種類ごとに処理することになると思われる
        */
        randomArray.forEach(
            function(cell, index, array){
                /*
                  RGBカラーコードの設定
                  実データの場合、スタイル情報はデータと異なる場所に設定があると思われる
                */                
                var colorCode = [getRandNum(255),getRandNum(255),getRandNum(255)].join();
                $('#result').append('<p class="type-'+index+'">'+index+'番目の要素</p>');
                // 動的なスタイルシートにルールを追加
                this.insertRule('.type-'+ index + '{ color:rgb(' + colorCode + ');}', this.cssRules.length);
            }, styleSheets[styleSheets.length - 1]
        );
    };
    
    var getRandNum = function(max, type){
        switch(type){
            case 'ceil' :
                return Math.ceil(Math.random() * max);
                break;
            default:
                return Math.round(Math.random() * max);
        }
        
    }
    
    $('#random-Button').on(
        'click',
        buttonEvent
    );
});

/*
  Array.prototype.fill() Array.prototypeの Polyfill は省略
*/
```

上記のコードでも示しましたが、実データを読み込んでブラウザで表示する場合では以下の点が相違となると思われます。

* 表示するデータはデータ内にスタイルを記録した場所がファイル内にあると思われるためそれをスタイル設定に使用
* データ1つごとのスタイル設定ではなくデータの種類ごとにスタイルを設定が必要

スタイル設定をする場合の注意点としては、**CSSで使用するプロパティ名とDOMで使用するCSSのプロパティ名が異なる**（例:CSSのfloatはDOMではcssFloatとなる）ため、[CSS Properties Reference](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Properties_Reference)などを見ながら設定をしないと動作しなくなる可能性が高いです。
Sublimergeのインストールと、まずはDiffを取るだけのメモ

App Storeが台頭してからというもの、野良アプリも真っ当には使えないことが増え、MacintoshでいざDiffを取ろうとすると、程良いツールがなくて結構大変なんです。そんなときにSublime Textのプラグイン。 **Sublimerge** は手軽で重宝します。

# 前提
Sublime Textに[Package Controlを導入済み](http://qiita.com/Shoesk/items/3e766206531dc2dcd338#3-%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%82%A6%E3%82%A4%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AB%E4%BB%A5%E4%B8%8B%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6returnenter%E3%82%92%E6%8A%BC%E3%81%99)であること。

# プラグインのインストール
##### 1. メニューバーから **Tools > Command Palette...** を選択するか、短縮コマンド **Shift＋Command＋P** でコマンドパレットを呼び出す。ここに **install** と入力すると **Package Control: Install Package** と出てくるのでこれを選択。
![SublimergeのインストールとDiffを取るだけのメモ](https://qiita-image-store.s3.amazonaws.com/0/37964/f28e1bbd-79c8-df61-3a7e-0d0774b94d68.png)

##### 2. さらに **sublimerge** と入力すると **Sublimerge Pro** というプラグインが見つかるので、これを選択する。
![SublimergeのインストールとDiffを取るだけのメモ](https://qiita-image-store.s3.amazonaws.com/0/37964/f35fd9ff-049c-03ac-bb46-cacd3f64a026.png)

##### 3. **Package Control Messages** が表示されれば、プラグインのインストールは完了。
![SublimergeのインストールとDiffを取るだけのメモ](https://qiita-image-store.s3.amazonaws.com/0/37964/f1579c65-a454-2228-79ae-d8f5cc26650f.png)

# Diffを取る
##### 1. Sublimergeで比較したい2ファイルを開く。
![SublimergeのインストールとDiffを取るだけのメモ](https://qiita-image-store.s3.amazonaws.com/0/37964/1285d282-f11f-51b9-ca37-adfa5aacff9e.png)

##### 2. 開いたファイルを同一ウインドウにする。
![SublimergeのインストールとDiffを取るだけのメモ](https://qiita-image-store.s3.amazonaws.com/0/37964/8589205d-1e6c-108c-7315-a5e61160dcb0.png)

##### 3. メニューバーから **Tools > Command Palette...** を選択するか、短縮コマンド **Shift＋Command＋P** でコマンドパレットを呼び出す。ここに **Sublime** と入力すると **Sublimerge: Compare to View...** と出てくるのでこれを選択。
![SublimergeのインストールとDiffを取るだけのメモ](https://qiita-image-store.s3.amazonaws.com/0/37964/cf11b901-61a9-95e1-bff3-cc463ae1572a.png)

##### 4. Diffが取れます。
![SublimergeのインストールとDiffを取るだけのメモ](https://qiita-image-store.s3.amazonaws.com/0/37964/51b5de44-16f4-08ec-cdf7-b5fb85994b85.png)
岩手でTitaniumがアツいらしいのであえてCordovaを触ってみた。


[@isseium](http://qiita.com/isseium)や[@ganezasan](http://qiita.com/ganezasan)が岩手で活動的にしているおかげで、[岩手Titanium勉強会](http://iwatetitanium.doorkeeper.jp/)とか Titaniumユーザー会代表のスライドに岩手が登場したりと、岩手でTitaniumがアツいみたいですね。 ![](http://i.gyazo.com/1235d6c2bd598302c1d9270a99fc098a.png)

[TitaniumとNode.jsは兄弟](http://www.slideshare.net/ToshiroYagi/node-gakuen)

そんなこんなでTitaniumとは違いますが似た様な系統のCordovaを触ってみたのでメモしておきます。

>ホントは盛岡や岩手っぽいものをやりたかった

##Cordovaとは
コルドバって聞くとなんとなくシャーマンキングを思い出すのは私だけでしょうか。

CordovaはPhoneGapから派生したオープンソースプロジェクトです。今はApache Cordovaというみたいです。

HTML/CSS/JSといったWeb技術を使ってネイティブ機能を呼び出すことができ、iOSやAndroidなどマルチプラットフォームでアプリ開発が出来ます。

![](http://i.gyazo.com/7b5be617e8d9225825574a52117ea332.png)

## 準備

###Cordovaのインストール
CordovaはNode.jsで動作します。予めインストールしておきましょう。

```
$ npm i cordova -g
$ cordova -v
4.1.2
```

これだけでCordovaのインストールは完了です。カンタンですね。

### ios-simのインストール

```
$ brew install ios-sim  
$ npm i -g ios-sim
```

(片方だけでもいいかも...?)

### ios-deployのインストール

```
$ npm i -g ios-deploy
```


### その他
XcodeなどiOS開発が出来る環境は準備しておきましょう。

## プロジェクトの作成

* プロジェクトの新規作成は以下のように入力。

```
$ cordova create hello com.example.hello HelloWorld -d
$ cd hello
```
helloフォルダが出来るので移動しておきます。


* プラットフォームの追加

```
$ cordova platform add ios
```

android開発を行う場合は`cordova platform add android`です。

* プラットフォーム確認

```
$ cordova platform ls
Installed platforms: ios 3.7.0
Available platforms: amazon-fireos, android, blackberry10, browser, firefoxos

```

対応プラットフォームを確認出来ます。

## プロジェクトのビルド

```
$ cordova run
```

![](http://i.gyazo.com/fa25f1e4aab649cf53c7fa97d17a9315.gif)
シュミレーターが起動して、Cordovaアプリのデフォルト画面が立ち上がりました!!

参考: http://qiita.com/aKyoichiroIizuka/items/b6274d9780e2942398c3
SourceTreeのWindows版だけでSSL routines:SSL23_GET_SERVER_HELLO:reason(1112)エラーが発生する場合

私の場合は、GitBucketをサーバに組み込み使おうとしていたのですが、自分のMacで正常に使えるので、うまいことセットアップできたぞ、と思っていたらWindowsユーザから接続できないとクレームが！
改めて自分のWindows環境で確認すると確かに接続できない。

![capture1.png](https://qiita-image-store.s3.amazonaws.com/0/2300/b601a5be-71cc-01ee-a48f-901eb1f63ec2.png)

無情にも「error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)」というエラーが。
色々調べてみても、curlなら-3を付けろとか、どうにもこうにもたどり着きません。
Apacheの設定を色々変えてみてもさっぱり。そもそもMacやブラウザ（Firefox, chrome）で正常にアクセスできているのですから謎です。

よく落ち着いて考えてみると、MacとWindowsの大きな違いはgitです。Macは内蔵していますが、WindowsはSourceTreeが自分が使う分をインストールします。
Macでのバージョンを調べてみると

```
$ git --version
git version 2.0.4
```

2.0.xですが、一方のSourceTreeを見てみると、

![capture2.png](https://qiita-image-store.s3.amazonaws.com/0/2300/a73fd6a5-e3d8-74b8-bc39-fc984d3344d3.png)

1.8.xです。

もしかして古いんちゃうん、と「内蔵Gitを更新」を押してみますが、再インストールされてもバージョンは上がりません。

というわけで、[git for Windows](http://msysgit.github.io/)をインストールします。
1.9.4previewと出ますが気にしません。
途中で色々とインストーラに聞かれますが、気にしません。（とりあえずはこれが原因かどうかを突き止めないと）

インストールが完了し、「システムGitを使用」を押すとバージョンが1.9.4に変わります。

![capture3.png](https://qiita-image-store.s3.amazonaws.com/0/2300/5af51892-efe2-3f1d-46cf-06161f74c8ea.png)

これでフェッチしてみると、エラーが出なくなりました。

私の場合はWindowsでのgitはSourceTreeかNetbeansでしか使わないので、インストールレスが理想※ではありましたが、逆にあっさりインストールできたので、これぐらいは許容範囲にします。
（※Netbeans遣いとしては、いちいち色々インストールしないと使えないのは、人に勧めにくいので避けたい）

早くSourceTreeがアップデートされるといいなぁ。
ターミナルで複数行のコピーがしたいときのコマンド

■ YYでコピー

■ Y[任意の数字]Yで複数行のコピー

例: Y5Y　で5行をまとめてコピー
    Y3Y  で3行をまとめてコピー

■ Pでペースト

■ UでUndo(元に戻す)
Intel Edisonを（かわいい声で）しゃべらせる

　ネットワークにつなげる端末は，可能性が無限大だ．

# 準備
　今回は[node.js](http://nodejs.org/)でやります．
　[以前の記事](http://qiita.com/yoneken/items/88165cebbadcc8d6878c)を参考に，EdisonからUSBオーディオを使えるようにしておいてください．

$ mkdir ~/voice
$ cd ~/voice
$ npm init

　何か色々と聞かれるので，適当に答えておいてください．

$ npm install Buffer --save
$ npm install request --save
\# apt-get install alsa-utils

あと，スクリプトを実行するユーザーがaudioデバイスを扱えるグループに所属しているかを

$ id

で調べて，audioのグループに所属していなかったら，

\# usermod -aG audio *username*

で，所属させておいてください．

# プログラム
 （かわいい声の）音声合成ですが，今回は，[NICTの杉浦さんの「非モノローグ音声合成」](http://komeisugiura.jp/software/software_jp.html)を利用させてもらいます．これは，ロボット用の音声合成ソフトウェアとして開発されたもので，私が以前に書いた記事は[こちら](http://blog.livedoor.jp/k_yon/archives/52494323.html)．
　今見たら，PythonやC++はサンプルコードがありましたね．わざわざnode.jsで再実装する必要なかったな．

```javascript:index.js
var req = require("request");
var Buffer = require("Buffer");
var fs = require("fs");
var exec = require("child_process").exec;

if(process.argv.length < 3){
	console.log("At least 1 argument is required.");
	return;
}

var word = process.argv[2];
console.log(word)

function playVoice(language, message){
	req.post( {
		url : "http://rospeex.ucri.jgn-x.jp/nauth_json/jsServices/VoiceTraSS",
		form : JSON.stringify({
			method : "speak",
			params : ["1.1", {"language" : language, "text" : message, "voiceType" : "*", "audioType" : "audio/x-wav"}]
		}),
		json : true
		},
		function(error, response, body){
			if(!error && response.statusCode == 200){
				buf = new Buffer(body["result"]["audio"], "base64");
				fs.writeFile("voice.wav", buf);

				exec("sleep 1");
				exec("aplay ./voice.wav -D plughw:1", 
					function(err, stdout, stderr){
						console.log(stdout);
						console.log(stderr);
					});
			}
		}
	).on("response", function(res){
		console.log(res.statusCode);
	}).on("error", function(err){
		console.log(err);
	});
}

playVoice("ja", word);
```

$ node index.js *こんにちは*

上記のように起動してください．このプログラムはサーバーとデータをやりとりするので，Edisonをインターネットと接続する必要があります．

　NICTのサーバーに言葉を投げると，イイ感じにかわいくなった声のデータがbase64エンコードされて返ってきます．それをvoice.wavという名前でローカルに保存し，aplayで再生します．このとき，間にsleepをはさまないと失敗することが多かったです．

# 実験
　動画は[こちら](https://twitter.com/k_yone/status/542312196605493249)．
　左上のスピーカーの表示が，ミュートになってないことを確認してください．

# まとめ
+ NICTすげぇ
EspruinoでJSを分割して書くときはSprocketsが良いのではないか

Espruinoでも多少凝ったものを書こうとするとプログラムが結構な長さになってきますね。そうなるとだんだんJSを分割して書きたくなってくる訳です。「Espruinoで動く」を前提条件にすると、sprocketsなんか良いのではないのかと思いましたので紹介します（今更）

## mobule/requireでの分割は何かと面倒

Espruinoではnode.jsのように各機能をモジュールとして記述して、`require`で利用することができます。ただしこの方法には制約があり、USB起動の場合はインターネットでアクセスできる場所に、スタンドアロンで利用している場合はSDカードに、各種モジュールファイルを配置しておかなければなりません。汎用で使えるライブラリを記述するのであれば多少目はつむれるかもしれませんが、アプリ固有のビジネスロジック的なものを分割記述するのに、これはなかなか面倒です。

## そこで sprockets

と、いうことで分割したJSファイルをビルドして一つにまとめるというアプローチが欲しくなってくる訳ですが、ご存知の通りJSが走るのはEspruinoの上なので、生成されるファイルは可能な限りプレーンなjavascriptであることが望ましいです。

そこで **[sprockets](https://github.com/sstephenson/sprockets)**です。

```js
//= require "./hoge.js"
var hoge = new Hoge();
```

JSファイルの上部のようなコメントを記述すると、sprocketsでビルドしたときに、`hoge.js`の内容をそっくりそのままもってきてくれます。それでいて、２度以上同じファイルに対する読み込みが記述してあっても一度しか読み込まないのでその辺りも気にせずにすみます。

## Example

[Github](https://github.com/rockymanobi/Espruino-Sprockets-Sample)にサンプルプロジェクトとして上げてみました。READMEを見れば使えるかと思います。`build.sh`には簡単なビルドコマンドが記述してあります。

`src`フォルダ直下を常に監視して、変更があったら自動でビルドするようにするステップについては今後書こうかと思っています。
Mac のターミナルで tmux や screen を使っている場合、バッファスクロールが出来ない場合に試すこと


いやまぁ、 [linux - How can I page up or down in tmux with Terminal.app? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/81540/how-can-i-page-up-or-down-in-tmux-with-terminal-app) を見ただけなんですが。

tmux や screen のセッションの中にいるとして、

----

1. tmux のデフォルトキーバインドなら `Ctrl + b`, screen なら `Ctrl + z`
2. `[`
3. `Shift + fn + ▲ (カーソルの上キー)`

----

これで PageUp 出来た。

PageDown は 上記順序の (3) のところで `Shift + fn + ▼`

一行ずつアップダウンしたい場合は、同じく上記順序の (3) のところで、カーソルキーの上下を押すだけ。

以上。
文字列から数値へ変換。文字列から数値だけを取り出す。

#数字だけの場合
parseIntはブラウザによっては先頭に0がついていると8進数になってしまうため、
第二引数に10を渡して、明示的に10進数に変換するようにしたほうが良いです。

```js
var str = "-123.123";

//Numberを使う
Number(str); //-123.123

//+演算子(Numberと多分同じ)
+str; //-123.123

//parseInt
parseInt(str, 10); //-123

//parseFloat
parseFloat(str); //-123.123
```

#後ろにpxなどが付いている場合

```js
var str = "-123.123px";

//ダメな例
Number(str); //NaN
+str; //NaN

//良い例
parseInt(str, 10); //-123
parseFloat(str); //-123.123

```

#前になにか付いている場合
滅多にないと思いますが一応

```js

var str = "@-123.123";

//ダメな例
Number(str); //NaN
+str; //NaN
parseInt(str, 10); //NaN
parseFloat(str); //NaN

```
今までのやり方だと全滅していまいます。
正規表現を使って何とかします。

```js
//-がいらない場合
var str2 = str.replace(/[^0-9^\.]/g,""); //"123.123"
//-が欲しい場合
var str3 = str.replace(/[^-^0-9^\.]/g,""); //"-123.123"

parseInt(str2, 10); //123
parseFloat(str2); //123.123

parseInt(str3, 10); //-123
parseFloat(str3); //-123.123

```

ちなみにこのやり方だと、数字以外の文字がどこにあってもできます。
(すべて結合されてしまいますが)

#「.」が前に付いている場合
実は`/[^0-9^\\.]/g`だと「.」が残ってしまうので
`"...123.123"`みたいなときにNaNになってしまいます。
こんなケースは稀ですが、気になったので考えてみました。

```js
var str = "<...(-123.123px)...>";
//-がいらない場合
var str2 = str.match(/\d+/g).join("."); //["123","123"].join(".")→"123.123"
//-が欲しい場合
var str3 = str.match(/-?\d+/g).join("."); //["-123","123"].join(".")→"-123.123"

Number(str2); //123.123
+str2; //123.123
parseInt(str2, 10); //123
parseFloat(str2); //123.123

Number(str3); //-123.123
+str3; //-123.123
parseInt(str3, 10); //-123
parseFloat(str3); //-123.123

```

このやり方は文字列の中に数字が一つの時だけ使えます。
ここまでできれば文字列から数値を取り出すのに困ることは、ほとんどないと思います。

#なんでもイケるやり方
コメントにあったものから紹介させて頂きます。

```js
var str = "098<123.123>-567.89____-1..123";

//-がいらない場合
var array = str.match(/[0-9]+\.?[0-9]*/g);
for(var i = 0; i < array.length; i++) {
  console.log(parseFloat(array[i]));
}
/*
98
123.123
567.89
1
123
*/

//-が欲しい場合
var array2 = str.match(/-?[0-9]+\.?[0-9]*/g);
for(var i = 0; i < array2.length; i++) {
  console.log(parseFloat(array2[i]));
}
/*
98
123.123
-567.89
-1
123
*/

```
Ext JSのコンポーネントの継承先を変更する場合の注意点

# Ext JSのコンポーネントの継承先を変更する場合の注意点

Ext JSのコンポーネントの継承先を ``Ext.panel.Panel`` から ``Ext.grid.Panel`` のように変更し、そのコンポーネントの ``initComponent()`` で ``this.callParent()`` する場合、コンポーネントの必須項目が変わるため動かなくなることがある。

コンポーネントの必須項目に関しては、Ext JS APIドキュメントの該当クラスの｢Configs｣で、｢REQUIRED｣ラベルがついているものである。
Ver4.2.3の ``Ext.grid.Panel`` に関しては、 ``columns`` 、 ``store`` が必須コンフィグとなっている。 下記APIドキュメントを参照のこと。

http://docs.sencha.com/extjs/4.2.3/#!/api/Ext.grid.Panel
言語やプロジェクトごとにインデントなどの設定を変える方法

# 言語単位の設定変更

現時点では [syntax-settings](https://atom.io/packages/syntax-settings) を使うのが一番良さそうです。

config.csonの記述例:

```cson
'syntax-settings':
  'source':
    'perl':
      'editorSettings':
        'tabLength': 4
        'softTabs': 4
  'text':
    'html':
      'php':
        'editorSettings':
          'tabLength': 4
          'softTabs': 4
```

# プロジェクト単位の設定変更

Vimにおける`:set ts=4 sw=4 sts=0`でカレントバッファの設定を変更、的なことは出来ませんが（たまに欲しい時あるので作ろうかなぁ）、プロジェクト単位で設定を変える方法はいくつかあります。

## [project-manager](https://atom.io/packages/project-manager)

私自身は使ったこと無いのですが、圧倒的star数のプロジェクト管理パッケージです。↓よりもオススメです。

## [local-settings](https://atom.io/packages/local-settings)

拙作。プロジェクトルートに、config.csonの任意の設定を記述した.atomrc.csonというファイルを置き、その設定を現在の設定に上書き適用できるパッケージです。

**自分で作っておいてなんですが、使ってないです。**

（思ったほどプロジェクトごとに設定変えたいという需要が自分にあまりなかったものでして…。）
Laravel4 の Command でコマンドから別のコマンドを呼ぶ時に値なしオプションを指定する



本文では *引数 (arguments)* については触れない。

結論から言うと、

```php
$this->call('command:name', ['-o' => null]);
```

のように指定する。


コマンドとオプションについて
--------
**コマンド** というのは、

```console
$ php artisan foo --option
```

という形式でシェル上で実行されるプログラム。
`php artisan command:make FooCommand` という感じで作れる。
作り方は、 http://laravel.com/docs/4.2/commands に書かれている。

オプションというのは、

```console
$ php artisan foo --option=bar --option=baz
```

というコマンドがあったとして、

`--option=bar` や `--option=baz`

の部分のこと。
**オプションの値 (value)** というのは、上記の `bar` や `baz` の部分。

このオプションの値には、「値なし」という形式も指定できて、

```console
php artisan foo --option
```

という書式も実現できる。

オプションの形式には「値なし」も含めて

- InputOption::VALUE_NONE: 値なし
    - (`-o` または `--option` のようにオプション名のみを指定する)
- InputOption::VALUE_REQUIRED: 必須
- InputOption::VALUE_OPTIONAL: 任意
- InputOption::VALUE_IS_ARRAY: 複数

がある。


コマンドプログラム内部から別のコマンドを呼び出す際に、オプションに「値なし」を指定したい
--------
http://laravel.com/docs/4.2/commands#calling-other-commands に書いてあるように、

`php artisan command:make FooCommand`

で作られたコマンド用クラスには、

```php
$this->call('command:name', array('argument' => 'foo', '--option' => 'bar'));
```

と書くことで別のコマンドを呼び出せる。

上記はオプションの **値がある** から、`'--option' => 'bar'` みたいに書く。


### `値なし = InputOption::VALUE_NONE` を指定している場合

冒頭に書いたように、 配列のキーにオプションの名前、値に `null` を指定する。

```php
$this->call('foo:command', ['-o' => null]);
```

これで、

```console
php artisan command:name -o
```

したのと同じになる。  
(`-o` について: オプションには省略記法も設定できるのでハイフンが1つのオプションをここでは引き合いに出している)

以上。
エクスプローラでログファイルがプレビューされるようにする

##1.経緯
Windows7のエクスプローラーにはプレビュー画面がありますが、プレビューが表示されるファイルの種類は限られています。
個人的に、TeraTermでは自動ログ取得の設定をしており、決まったフォルダに大量にログファイルが溜まっていくのですが、拡張子が.logの為、そのままではプレビュー画面で表示されません。

プレビュー画面で簡易的に内容が表示されると便利なので、設定変更して表示できるようにしました。


##2.設定変更
プレビュー画面の設定はレジストリに保存されているようなので、Preview Handler Association Editorというツールを使って設定をしました。

### □ツール

Preview Handler Association Editor - Stephen Toub - Site Home - MSDN Blogs
http://blogs.msdn.com/b/toub/archive/2006/12/14/preview-handler-association-editor.aspx

使い方は、[MTG Blog: ◆エクスプローラのプレビューウインドウにログファイル(Log)を表示させる](http://madogiwatosan.blogspot.jp/2012/09/log.html) を参照のこと。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/53823/1fd024dd-0aa2-509a-8fa4-6714d547709b.png)


### □プレビュー画面のフォント

ターミナルログは等幅フォントで表示したいもの。

プレビュー画面のフォントは、メモ帳の設定を使っているようなので、メモ帳 → 書式 → フォント、から、フォントの設定（種類、サイズ）をすれば、OKです（メモ帳はそのまま閉じてOK）

参考：[個人的な φ(｀д´)ﾒﾓﾒﾓ…: Window7のプレビューペインを使いこなす](http://yamori-jp.blogspot.jp/2011/04/window7.html)


***
おしまい。