OmniAICreator/Qiita-1.07M huggingface dataset:
Three.js で影がでないときに確認すること

Three.js で多粒子のアニメーションの勉強中。

その際、どうやっても **影** が表示されずに困ったのでメモまで。
以下のサイトでもハマリどころが紹介されているが、今回は別の原因だった。

* [WebGL] Three.jsで影を表示する
    * http://qiita.com/edo_m18/items/44b4292e2970912eafa3
* Three.js 　影ができない原因
    * http://gupuru.hatenablog.jp/entry/2013/12/16/210348

## ライトの影設定

Lightオブジェクトの影設定 `castShadow` をOnにする。
デフォルトではOff (false) になっている。

```js
var light = new THREE.DirectionalLight(0xFFFFFF);
light.position.set(0, 0, 1000);
light.castShadow = true; // これ!!
scene.add(light);
```

あと、基本ですが、Lightの位置も念のため確認しておく。
床面に影を出したい場合、

* ライト -> 物体 -> 床

の順になっていないと、当然影は出ない。 


## 物体の影設定

これも明示的にOn (true) にしておくのがよい。

```js
var cubeObj = new THREE.Mesh(
	   new THREE.CubeGeometry(10,10,10),
	   new THREE.MeshLambertMaterial({color: 0xff0000, ambient:0xFF0000}));
cubeObj.castShadow = true; // これ!
scene.add(cubeOjb);
```

## 床面の影設定

こちらは影の受け手 (描画される方) としての設定をOnにする。

```js
var plane = new THREE.Mesh(new THREE.PlaneGeometry(100, 100, 5, 5),
	new THREE.MeshLambertMaterial({color: 0x999999, ambient:0x050505}));
plane.receiveShadow = true; // これ!
```

## Rendererの影設定

Rendererにも影設定がある。何個あるねん...

```js
var renderer = new THREE.WebGLRenderer({antialias: true});
 :
renderer.shadowMapEnabled = true; // これ！
```

ちなみに、最新のThree.js (執筆時はr73) では、`shadowMapEnabled` から `shadowMap.enabled` に置き換わった模様。`shadowMapEnabled` だと置き換える旨のWarningがログ出力される。

```js
renderer.shadowMap.enabled = true;
```

## ShadowMapの設定

上述のところまでやると大抵の場合は影が出るはず。
なのに影が出ない...

今回、多粒子のサンプルを作っていたが、一個一個のオブジェクト(Sphere) のサイズが小さい場合、デフォルトのライト設定だと影が表示されなかった。

オブジェクトのサイズは変えたくない場合、以下のようにライトの影設定を変更するとよい。

```js
var light = new THREE.DirectionalLight(0xFFFFFF);
light.position.set(0, 0, 1000);
light.shadowMapWidth = 2048; // これ!
light.shadowMapHeight = 2048; // これ!
light.castShadow = true;
scene.add(light);
```

`shadowMapWidth` および　`shadowMapHeight` のデフォルト値は `512`。
どのぐらいのオブジェクトサイズで、どのぐらいの値がよいかは、表示したい影の質感と相談で決めるとよい 。
paiza (クソ)プログラミングで彼女を作る C言語

半年ぶりにC言語触った&なんも書けない&これ以上短くできない
インデントは見やすくした方がいいのか迷ったけどぐちゃっとしました
[元サイト]http://paiza.jp/poh/ando
***

#釣り目
```
#include<stdio.h>
int main(void){int n,i; scanf("%d",&n); for(i=0;i<n;i++) printf("Ann");return 0;}
```

#ショートカット
```
#include<stdio.h> 
int main(void){int a,b;scanf("%d""%d",&a,&b);printf("%d",a+b);return 0;}
```
#ロングヘア
```
#include <stdio.h>
#include <string.h>
int main(void){char str[3];int a=0;int i;
  for(i=0;i<5;i++){scanf("%s",str);
      if(strcmp(str,"yes")==0)a++;else{a--;}}
          if(a<0)printf("no");else printf("yes");return 0;}
```
#ポニテ
```
#include <stdio.h>
int main(void){int n,i;scanf("%d",&n);
for(i=n;0<i;i--){printf("%d\n",i);if(i==1)printf("0!!");}return 0;}
```
#ツインテ
```
#include <stdio.h>
int main(void){double a,b,c,d;scanf("%lf""%lf""%lf""%lf",&a,&b,&c,&d);
    if(a/b<c/d)printf("2");else printf("1");return 0;}
```
#セーラー服
```
#include <stdio.h>
int main(void){char str[10];int n,i;scanf("%d",&n);
    for(i=0;i<n;i++){scanf("%s",str);printf("%s",str);
        if(i!=n-1)printf("_");else printf("\n");}return 0;}

```
#カーディガン
```
#include <stdio.h>
int main(void){int n,i;int a=1;scanf("%d",&n);for(i=n;1<i;i--)a *=i;printf("%d",a);return 0;}

```
何かありましたらコメントください。大いに喜びます。
MecabのGoバインディングを作成した

# 要点

Go から MeCab の形態素解析の機能を利用可能にする。

# 特徴

Mecab の全機能を提供する。
リソースの解放を行う。

# 前提

Mecabをインストールする

## Macの場合

    $ brew install mecab
    $ brew install mecab-ipadic

# インストール

    $ go get github.com/mkitawaki/mecab-go

# mecabライブラリィへのリンク（2016/01/10 追加しました）

mecab-go/mecabフォルダにmecabライブラリィのincludeフォルダ、binフォルダのシンボリックリンクを作成する

```
$ ln -s /usr/local/Cellar/mecab/0.996/include $GOPATH/src/github.com/mkitawaki/mecab-go/mecab/include
$ ln -s /usr/local/Cellar/mecab/0.996/bin $GOPATH/src/github.com/mkitawaki/mecab-go/mecab/bin
```

# サンプルアプリ実行

    $ cd $GOPATH/src/github.com/mkitawaki/mecab-go
    $ go run main.go

# 注意（2016/01/10 修正しました）

~~homebrew以外でMecabをインストールした、あるいはMac以外のOSで実行する場合~~
mecabライブラリィへのリンクにより不要になりました
Reduxを使ってみたのでざっと概要をまとめる

この記事は[Gizumoエンジニア Advent Calendar 2015](http://www.adventar.org/calendars/919)の10日目の記事です。

僕のここ最近の心境として、今はフロントエンドエンジニアとしてひたすらSPAを書きまくっていたいなあというのがあってとりあえず自分のブログをSPAで作り直してみよっかなと思い立ったのでReact使ってやりましょうとなってそしてフレームワークはReduxを使ってみた。

なんでReactとReduxを選んだのかってのは特にしっかり考えたわけではなく、流行ってるので勉強としてとりあえず使ってみようって感じ。
しかしやってみて気付いたことだが事前になんの考えもなくとりあえず導入してSPA作ろうみたいなのは確実に間違っているということ。ブログの管理画面をSPAにするならまだしもユーザーがなんの状態も持たないただのブログの表側と管理画面をいっしょくたにSPAにしちゃった僕の考えは浅はかだと言わざるを得ない。

いやまあ勉強のためにやっただけだからいいんだけれど。
とりあえず言えることとしては、業務で使うのであればなんのためにSPAにするのか、なんのためにそのフレームワークを選定するのかってとこで明確な理由・メリットを提示できなければ導入なんてするもんじゃないんだなっていう、そんなわかりきってることを学びました。

そんなわけで本題に入ります。


# はじめに

fluxをとりあえず勉強してそのままReduxに入ったら概念がいろいろごっちゃになってしまったのでまずそれぞれに出てくる単語の役割をまとめようと思う。

## flux

- Store
- Action Creators
- Dispatcher
- React Views

### Store

StoreはMVCでいうModelみたいなものだけれど同じではない。
Action Creatorsからのイベントの通知を受けて状態を変更して状態の変更をReact Viewsに通知するっていう役割に徹する。

### Action Creators

ユーザーの操作によって起こるイベントをReact Viewsから受け取ってStoreに対して通知を送る。

### React Views

描画の役割。MVCのViewと同じ。ここでReact使う。
Storeから状態の変更の通知を受け取ったらDOMの再描画。
ユーザーの操作が起きたらAction Creatorsにイベントを通知する。

### Dispatcher

EventEmitterと考えて良い。
それぞれの要素をイベントの発火と監視によって繋げる役割。


それぞれの役割はこれだけだと思う。
fluxの特徴はデータが一方向にしか流れないということであってこれさえ確実に守っていればおっけーだと思う。

そんでfluxを勉強するためにfacebookのexampleの実装を見て真似したりしてた。
[facebook/flux example](https://github.com/facebook/flux/tree/master/examples)

fluxはアーキテクチャであってフレームワークとかではないので自分でぱぱっと実装できちゃう。一応Dispatcherの部分だけfacebookが提供しているけれどEventEmitterでいいのではって感じではある。
とりあえずやってみて理解できたのかできてないのかどうなんだろうってところでいろんな人の記事とか見てみた結果わりとみんな好きなようにオレオレ実装をやっていて、やっぱり一方向にデータが流れるっていうところだけ押さえとけばいいのかってなった段階でfluxの勉強はもうやめた。

次のReduxが本題。


## Redux

Reduxはfluxのフレームワーク。fluxのフレームワークは色々出てきたけどみんな口を揃えてRedux良いって言ってるイメージ。
状態管理に重きを置いているフレームワークということです。
Reduxには以下の要素がある。fluxのフレームワークなのでfluxの言葉を使っているんだけれど役割がわりと違っている。

- Action
- Reducer
- Store
- Middleware

### Action

ただのオブジェクトを返すピュアな関数。どんなイベントが起きたかというtypeとそしてそのときの値を渡す。

### Reducer

それまでの状態とアクションを受け取って次の状態を返すピュア関数。
Reducerはピュアな関数でないといけないので、もらった引数の中身を変えたりAPIを読んだりルーティングの遷移をしたり`Date.now()`とか`Math.random()`とかそういうの全部だめ。
同じ引数が渡されたら毎回同じ値を返すものでないといけない。

### Store

fluxのStoreと違ってアプリケーションの全ての状態を一つのステートツリーとして保持するシングルトンなStore。

### Middleware

Middlewareを使うことでdispatchする前や後に好きな処理を追加することができる。非同期処理を書いたり状態更新のたびにログだしたりとか色々とできる。


概念としてはこんな感じ。
それぞれの要素が簡単な処理でできていてそれらを連結してく感じなのでやることはそこまで難しくないけど始めは理解するの大変だった。

Reduxはドキュメントがすごく充実していて公式のexampleをやれば大体理解できる。

[rackt/redux examples](https://github.com/rackt/redux/tree/master/examples)

examplesを見るとViewがcomponentとcontainerに分かれていて、最初はよくわからなかったけれどreduxと絡む部分はcontainer、reduxと絡まない部分はcomponentとなるみたい。
大体Viewの子要素はcomponentになる。


# おわりに

ほんとはここから概念はわかったからじゃあ実際に実装はどんな感じにするのかって話をしようかと思っていたのだけれど、なかなか遅々として実装が進まない状態なので今日はこれくらいで終わりにします。

またSPAのブログが完成したらgithubと実際のサイトを出した状態で実装についてまとめようかなーと思う。

正直redux知らない人がこの記事読んでもまったくわからないと思うのですがとにかくReduxは公式のドキュメントがとても良いからそっち見ろと言いたい。以上です。
DNSキャッシュのクリア方法

独自ドメインでのWEBサーバーへの接続テストをする場合など、DNS情報の浸透状況のほかに、クライアントのDNSキャッシュが邪魔をすることがある。
ここでは、このDNSキャッシュのクリア（フラッシュ）方法について記述する。


##Windows 向け

次のコマンドをコマンドプロンプトから実行する。

```
C:\> ipconfig /flushdns
```


#####おまけ（キャッシュ情報を表示する）
```
C:\> ipconfig /displaydns
```

表示例

```
    www.facebook.com
    ----------------------------------------
    レコード名 . . . . . . . : www.facebook.com
    レコードの種類 . . . . . : 5
    Time To Live  . . . . . .: 16
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    CNAME レコード . . . . . : star-mini.c10r.facebook.com


    レコード名 . . . . . . . : star-mini.c10r.facebook.com
    レコードの種類 . . . . . : 1
    Time To Live  . . . . . .: 16
    データの長さ . . . . . . : 4
    セクション . . . . . . . : 回答
    A (ホスト) レコード. . . : 31.13.82.36
```

-----

##Linux 向け

Linux(ここではCentOS)では、DNSサーバー（例：BIND）をローカルDNSキャッシュサーバーとして構成しているか否かによる。構成している場合は、そのサービス(例：named)を再起動するとよい。構成していない場合は、ローカルDNSキャッシュ自体存在しない。

##Linux (ubuntu20.04) 向け

基本は上記「Linux 向け」と同じであるが、BINDでローカルDNSキャッシュサーバーとして構成している場合、以下のコマンドでキャッシュの統計およびキャッシュのクリアができる。

#####DNSキャッシュの統計表示
```
root@localhost:~# systemd-resolve --statistics
```

表示例

```
DNSSEC supported by current servers: no

Transactions               
Current Transactions: 0    
  Total Transactions: 11692
                           
Cache                      
  Current Cache Size: 3    
          Cache Hits: 6603 
        Cache Misses: 5129 
                           
DNSSEC Verdicts            
              Secure: 0    
            Insecure: 0    
               Bogus: 0    
       Indeterminate: 0    
```

#####DNSキャッシュのクリア
```
root@localhost:~# systemd-resolve --flush-caches
```
ページ中の<a>タグの<href>属性を全て取得する方法

##Yahoo！JAPANページを対象にCSSセレクタを利用してページ中のaタグのhref属性を全て取得できます。
```lang:crawl.rb
require 'nokogiri'
require 'open-uri'

doc = Nokogiri.HTML(open("http://www.yahoo.co.jp/"))

doc.css('a').each do |element|
	puts element[:href]
end
```
[D言語]UFCSを自分なりにメモ

#はじめに
D言語のUFCSについて気になったことを適当に書いていきます。メモ書きなので、てきと～ですが気が向いたときに適宜更新。(完全に他サイトの引用集です 笑)

#UFCSについて
参考: [D言語のUFCSが好きだ！](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)

#よく使われるモジュール
##std.algorithm
[std.algorithm](http://www.kmonos.net/alang/d/phobos/std_algorithm.html)のコマンドを使ってメソッドチェーンを使っている人が多い気がします。あとで自分もまとめたいと思っていますが、mapとか調べれば出てくるかと。

##プロパティ
プロパティとは型やオブジェクトの特徴や特性を表わすものです。これをちゃんと付けてあげないと要素がコピー出来ないなんてことがよくあります.
詳しいことは参考にありますがここでは要素をコピーするのに必要なプロパティをまとめておきます。

<dl>
 <dt>.dup</dt>
 <dd>配列を確実にコピーするときに</dd>

 <dt>.array</dt>
 <dd>Rengeを配列に変換する.これがなくてうまくうごかないこともあり</dd>
</dl>


参考:
[プロパティ](http://www.kmonos.net/alang/d/property.html)
[配列](http://www.kmonos.net/alang/d/arrays.html)
[D言語友の会-プロパティ](http://dusers.dip.jp/modules/wiki/?Articles%2FD%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7%2F%E7%AC%AC18%E7%AB%A0%20-%20%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3)

#コード集
C++でいうresize(size,'a')の処理

```d
//'a'をn回繰り返した配列を作る
char[] str = 'a'.repeat(n).array;
```

テキスト入力

```d
import std.file, std.string, std.algorithm, std.array;

//チェインメソッドを使わない処理
string[] text = splitLines(readText("text.txt"));
string[] hoge;

foreach(int i; text){
    hoge[i] = text[i];
}


//最初にデータをすべて読み込んで一気に分割する方法
//対象ファイルが大きいと結構メモリを食うらしい
string[] text2 = splitLines(readText("text.txt")).map!strip.array;

//各行を順々に処理
auto strippedLines = File("text.txt").byLineCopy().map!strip.array;
```

参考: [弱小PHPerのD言語挑戦記4](http://qiita.com/kiridaruma/items/2acd43f9cc505f0eccf1)

キーボード入力？

```d
import std.string, std.algorithm, std.array, std.conv;

//任意の要素をint型に変換して格納
//入力するときはスペースで区切る
//もっといいやり方あるよね...
string[] input = readln().split;
int num = input[0].to!int;

//intの配列に代入
int[] a = readln().split.map!(to!int).array
```

※readln()について
buf = readln()という形にするよりreadln(buf)のほうが高速らしいです
TWE-Lite 2525AでUARTの透過モードを使用する時はI2をGNDに落とさないといけない

# TWE-Lite-2525Aではどうやら入力ピンI2がGNDに落ちてるみたいです

TWE-Lite-2525AのプログラムをUartアプリに書き換えて、チャットモードは出来るけど

透過モードにすると通信がうまくいかない(通信出来ない)


　　
結論としては、**受信機側の入力ピン(I2)をGNDに落としてやれば**通信出来るようになります

自分は受信機としてはTWE-Lite DIPを用いたので、16番ピンをGNDに落としてやれば、2525Aからの透過モードでの送信データを受信することが出来ます

# 使用したもの

[TWE-Lite-2525A]
(http://mono-wireless.com/jp/products/TWE-Lite-2525A/) (送信機)
[TWE-Lite DIP]
(http://mono-wireless.com/jp/products/TWE-Lite-DIP/index.html) (受信機)
[TWE-Lite R]
(http://mono-wireless.com/jp/products/TWE-Lite-R/index.html) (2525の書き込みと通信用)
[USBシリアル変換アダプタ]
(https://www.switch-science.com/catalog/1032/) (TWE-Lite DIPの通信用に用いた)
ブレッドボード
ジャンパー線適量
USB Aオス-microBオス 2本



# 送信機(TWE-Lite-2525A)の準備

###Uartアプリを書き込む


まず、TWE-Lite-2525Aは下記リンクを参考にしてアプリの書き込みを行います
http://mono-wireless.com/jp/products/TWE-Lite-2525A/firmware_update.html

書き込むアプリは、シリアル通信アプリ(App_Uart)です
http://mono-wireless.com/jp/products/TWE-ZERO/App_Uart/index.html

TWE-Lite-R があると書き込みが便利です(これ以外はやったことないですががんばれば出来るかも)

###インタラクティブモードでの設定

シリアル通信ソフト上で"+++"を押してインタラクティブモードに入って

・モードを透過モードに変更(mキーを押してからT、enterキー)
・Device IDを120に設定(iキーを押してから120、enterキー)

にしてください、↓のようになるはずです

```
 a: set Application ID (0x67720103) 
 i: set Device ID (120=0x78) 
 c: set Channels (18) 
 x: set RF Conf (3) 
 r: set Role (0x0) 
 l: set Layer (0x1) 
 b: set UART baud (9600) 
 B: set UART option (8N1) 
 m: set UART mode (T) 
 k: set Tx Trigger (sep=0x0d, min_bytes=0 dly=100[ms])
 h: set handle name [] 
 C: set crypt mode (0) 
 o: set option bits (0x00000000) 
---
 S: save Configuration
 R: reset to Defaults

```

これで2525A側の準備は完了

#受信機側(TWE-Lite DIP)の設定

### インタラクティブモードで設定

インタラクティブモードで透過モードに変更して、Device IDは121に設定してください

↓のようになるはずです

```
 a: set Application ID (0x67720103) 
 i: set Device ID (121=0x79) 
 c: set Channels (18) 
 x: set RF Conf (3) 
 r: set Role (0x0) 
 l: set Layer (0x1) 
 b: set UART baud (38400) 
 B: set UART option (8N1) 
 m: set UART mode (T) 
 k: set Tx Trigger (sep=0x0d, min_bytes=0 dly=100[ms])
 h: set handle name [] 
 C: set crypt mode (0) 
 o: set option bits (0x00000000) 
---
 S: save Configuration
 R: reset to Defaults
```

### 入力ピンI2をGNDに落とします

TWE-Lite DIPの場合、I2は16番ピンなのでGNDに落としてあげないといけません
なので、ブレッドボード上などがやりやすいと思いますのでブレッドボードで行います

1ピン(GND): GNDに接続
3ピン(RX): USBシリアル変換アダプタのTXに接続
10ピン(TX): USBシリアル変換アダプタのRXに接続
16ピン(DI2, デジタル入力2): GNDに接続
28ピン(電源): 電源ラインに接続(USBシリアル変換アダプタのVCC(3.3V)が便利です)

以下の写真のようになると思います
![image1.JPG](https://qiita-image-store.s3.amazonaws.com/0/44492/0b9eceeb-1ec6-8915-967d-6d0f9f4c80ad.jpeg)



これで準備ができたので、後は通信してみると、透過モードで通信出来るはずです
大したことではないですがつまづいたので(^_^;)

# TWE-Liteの入力ピン

最初、2525Aをシリアル通信アプリにしてもチャットモードは出来るけど
透過モードに変更すると通信できない・・・

ということがあって、調べていると

透過モードの説明のページで以下のものがあって
http://mono-wireless.com/jp/products/TWE-ZERO/App_Uart/mode_transparent.html

「もしかしたら2525AはどれかがGNDに落ちてるのかもなー」
と思ってやってみたら出来たのですが

実際はI2ピンをGNDに落とした状態でI3やI4ピンをGNDに落としても
透過モードでの通信が出来たので
詳しいところはまだ良くわかってないです(^_^;)

(回路図も眺めてみたのですがまだわからなかった・・・)


間違ってるとこもあるかもしれませんのでわからないとこなどありましたらコメントなりTwitterなりでお願いしますー
CS-Cart: 日本語版は「姓」がfirst name「名」がlast nameになっている

CS-Cartの日本語訳は「姓」がfirst name「名」がlast nameになっているので注意。

おそらく、入力欄の並びを考えて、あえて、First nameを「姓」、Last name「名」と翻訳していると思われる。

氏名を表示するときは `$firstname` `$lastname`の順で出すようにする。
FuelPHPでcurlのPUT or POSTリクエストをJSONで投げる

POSTはCURLOPT_CUSTOMREQUESTをPOSTに変換する。

```php
$url = 'http://hoge.com';
$json = {"id": "aaa", "token": "eee"}

$conn = curl_init();
// オプション
curl_setopt($conn, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($conn, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);
curl_setopt($conn, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($conn, CURLOPT_COOKIEJAR, "cookie");
curl_setopt($conn, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($conn, CURLOPT_COOKIEFILE, cookie_file_name);
curl_setopt($conn, CURLOPT_POSTFIELDS,  $json);
curl_setopt($conn, CURLOPT_URL, $url);
// レスポンス取得
$res = curl_exec($conn);
```
curlでcookieセットしながらJSONでPUT, POSTする

##GET

curl -b {cookie_info} -X GET {url}

```bash
curl -b 'some_id=hoge; some_token=fuga' -X GET http://hoge.com
```

##PUT

curl -b {cookie_info} -H {header_info} -X PUT -d {json} {url}

```bash
curl -b 'some_id=hoge; some_token=fuga' -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"id":100,"name":"bar"}' http://hoge.com
```

##POST

curl -b {cookie_info} -H {header_info} -X POST -d {json} {url}

```bash
curl -b 'some_id=hoge; some_token=fuga' -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100,"name":"bar"}' http://hoge.com
```
あんまり知られてないけど有用な composer の機能

# あんまり知られてないけど有用な composer の機能

※ 下記の内容はすべて公式マニュアルに書かれています
※ 社内向けに書いたので若干整合性が怪しい


## create-project

知られていないどころか超有名な機能ですが、尺稼ぎで `create-project` から。

フレームワークをいじってると

> 下記のコマンドでインストールします
> `composer create-project symfony/framework-standard-edition my_project_name`

のような文言によく出くわします。
これがなにしてるかは http://qiita.com/DQNEO/items/74f4bb8fe447e4582a97 が詳しい。

要するに git で引っ張ってきてその中で `composer install` してるだけのようです。
使うことはあまりないと思うけど、覚えておくと便利。


## autoloader-suffix

```json
{
  "config": {
    "autoloader-suffix": "hoge"
  }
}
```

のような指定をすると composer が生成するクラスローダ名を固定することが出来ます。


```php:未指定時autoload.php
<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer' . '/autoload_real.php';

return ComposerAutoloaderInit417b46943594f4f4c0f3cb6c377dd5ea::getLoader();
```

```php:指定時autoload.php
<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer' . '/autoload_real.php';

return ComposerAutoloaderInithoge::getLoader();
```

これで何が嬉しいかというと、リリース時の安心感が増える点です。
`autoload.php` が先に転送されてしまうと（たとえ些細な変更でも瞬間的に）「class not found」の嵐になってしまうので、固定するのはアリだと思います。


## config/platform

```json
{
  "config": {
    "platform": {
      "ext-gd": "2.0.0"
    }
  }
}
```

のような指定をすると、「あたかも gd 2.0.0 が入っているかのように」依存関係を解決します。
つまり composer を騙すことが出来ます。

ライブラリの composer.json で `require` でエクステンションが書かれているが、その機能を一切使用しない時に有用です。
逆に言えば「なんかエラーが出るからとりあえず指定」程度の認識では使うべきではありません。

また

```json
{
  "config": {
    "platform": {
      "php": "5.3.0"
    }
  }
}
```

のようにすると php 自体のバージョンも騙せます。

「騙す」というと感じが悪いですが、依存関係も含めてすべて 5.3.0 として振る舞ってくれるので、別環境で composer.lock を吐いてる人は指定しても良いかもしれません。

例えば私は普段 Windows 機で開発をしていて、 `composer install/update` も Windows 上でやってしまうことが多いです。
しかし悲しきかな、私の Windows に入っている php は 5.5.9 です。案件が 5.5.9 とは限りません。
そんな時、案件に合わせた `config/platform/php` を指定することで依存関係を解決しています。


## scripts

`composer` コマンド実行時のイベントをフックすることが出来ます。

https://getcomposer.org/doc/articles/scripts.md を読めとしか言いようが無いですが…。

イベントは大量にありますが、

|イベント名       |実行タイミング                     |
|:----------------|:----------------------------------|
|pre-install-cmd  |`composer install` コマンドの実行前|
|post-install-cmd |`composer install` コマンドの実行後|
|pre-update-cmd   |`composer update`  コマンドの実行前|
|post-update-cmd  |`composer update`  コマンドの実行後|

だけ知っていればよろしいです。`composer install/update` の前後です。

似たようなものに pre-package-install ってのもありますが、これはパッケージ単位です。
require に書かれたパッケージ分実行されます。

なお、イベントは**伝播しません**（考えれば当たり前ですが）。
何かライブラリを作って `scripts` を指定したとしてもそれを使う側の親プロジェクトでは決して実行されないことに注意しましょう。

実は composer 内部にはフックスクリプト用のクラスがあり、かなり高度な事ができるのですが、ここに書く範囲を超えているので割愛します。


## branch as 1.0

```json
{
  "require" : {
    "vendor/product": "branch-name as 3.0.0"
  }
}
```

とすると `vendor/product` の `branch-name` を「バージョン 3.0.0」だとみなしてくれます。
fork したプロジェクトでバージョンが切られていない場合などに使えると思います。

ただし、その場合はどう考えても黒魔術的（前後関係から考えて、fork 先でバージョンが切られていない状況はほぼあり得ない）であり、実験的に使うのが良さそうです。
Android の Google Licensing Library (LVL) でタイムアウトする件の解決策

Android で Google Licensing Library (LVL) をそのまま使ってると、タイムアウトが頻繁に発生するようになりました。

解決したのでメモメモ。

#解決策

LicenseChecker.java を修正。

```java:LicenseChecker.java
mService.checkLicense(
  validator.getNonce(), validator.getPackageName(),
  new ResultListener(validator));
mChecksInProgress.add(validator);

// ↑これを
// ↓こう

mChecksInProgress.add(validator);    // 上に持ってきた
mService.checkLicense(
  validator.getNonce(), validator.getPackageName(),
  new ResultListener(validator));
```

mChecksInProgress.add(validator) を上に持ってきただけですね。

#説明

validator を mChecksInProgress に登録してますが、
これが走る前に verifyLicense が呼び出されることがあったようです。
結果、正常に処理された validator が、登録されていないと判断されスルーされていたと。

…まあ LVL くらい独自で書けよって話ですよね。
Eclipse MarsでJDK 6のAntを外部ツールで実行する

# Eclipse MarsでJDK 6のAnt実行をする方法
 Eclipseの最新バージョンのMarsからAnt実行がJDK 7以上のサポートとなりJDK 6では、Ant実行ができなくなってしまった。
 このままでは、Eclipseの最新バージョンを使えなくなってしまったので、外部ツールで実行できるように設定して対応する方法を記載する。

_前提条件として、「ANT_HOME」をOSの環境変数に登録しておくこと_

1. 外部ツール構成を開く
2. 「プログラム」を選択して、新規作成
3. メインタブの設定をする
4. 環境タブの設定をする
5. build.xmlを選択して、外部実行

## メインタブの設定をする
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/99629/f7c9c80c-76b0-e000-d8c1-b685ed37b3fc.jpeg)

| 項目 | 値 |
|:-----------|:-----------|
| 名前 | 外部Ant ビルド |
| ロケーション | ${env_var:ANT_HOME}\bin\ant.bat |
| 作業ディレクトリー | ${project_loc} |
| 引数 | -f ${selected_resource_name} |

## 環境タブの設定をする
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/99629/a5cd8d5f-c385-b43b-cf7f-e4acebd3b034.jpeg)

| 変数 | 値 |
|:-----------|:-----------|
| JAVA_HOME | C:\Program Files\Java\jdk1.6.0_45 |

## 共通タブのお気に入りメニューに表示をしておくと便利
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/99629/345ed25c-e5de-8d59-7d72-5c7fa0895e25.jpeg)


あとは、build.xmlを選択して、外部ツールの構成から実行する。
【調べてみた】スマホで明朝体を使いたい。【つ Webフォント】

そういえば、PCサイトでしか明朝体使ったことないなーと思って、ざっくり調べてみた。

＿人人人人人人人人人人人人＿
＞ Android 4 世代には　　 ＜
＞ 明朝体搭載されてない！ ＜
￣ＹＹＹＹＹＹＹＹＹＹＹＹ￣

※「ゴシック体」と「丸ゴシック体」のみ搭載。
※タイトルや本文に明朝体を使っているいくつかのサイトで検証してみたところ、Android 5.0 からは明朝体も表示できました。
　
なぜ表示できたのか、どう対応するのかは、これから調べます。
（ちなみに、iOS は 5 から搭載。デフォルトが明朝体。）


　
## → 追記（2016.03.02.）
記事を書いてからちょっと時間が経ったので、調べなおしてみた。

＿人人人人人人人人人人人人＿
＞ Android 6 世代にも　　 ＜
＞ 明朝体搭載されてない！ ＜
￣ＹＹＹＹＹＹＹＹＹＹＹＹ￣

(´；ω；`)


### ■ Android 4.0 から搭載されているシステムフォント
**・半角英数字「Roboto」　←角ゴシック
・日本語、全角英数字「モトヤフォント」　←丸ゴシック**
　- モトヤマルベリ（モトヤLマルベリ3等幅）
　- モトヤシーダ（モトヤLシーダ3等幅）※機種による　←角ゴシック
＋
・機種によっては違うフォントが「標準フォント」としてインストールされている場合もあります。（だいたいゴシック系）

明朝体が入っているごく一部の機種も、「システムフォントを明朝体」に設定しないと使えないようでした。（社内にある機種で検証。※その場合はゴシック体は表示されず、全部明朝体になります。）


### ■ Android 6.0 (Marshmallow) からは…
**・「Noto Sans CJK」　←角ゴシック**
「モトヤフォント」から、Adobe と Google が共同開発した「Noto Sans CJK」に変更されました。フォントの丸さがなくなったので、随分印象が変わるかも。


### ■ 結論
Android で明朝体を使いたかったら**「Webフォント」**！

［参照］
・日本語webフォントが表示できない場合の解決方法。なんとか明朝体webフォントを設置編 | デザインのブログ〜フォントや素材制作
http://www.flopdesign.com/blog/font/3812/
・【厳選】明朝体の日本語フリーフォント15書体まとめ【商用OK】 - フォント無料ダウンロード｜Typing Art
http://typingart.net/?p=179

 
## → 追記（2016.11.08.）
「Google Fonts + 日本語 早期アクセス」で明朝体も使えるようになりました。
https://googlefonts.github.io/japanese/

テストページを複数の実機で検証してみましたが、Android に搭載されているデフォルトフォントと明朝系フォントを混ぜて使うと違和感がすごい。
どうしても「Google Fonts +」で明朝体を使いたい場合は、多数の漢字にも対応している**「さわらび明朝」**一択。

（1）使いたいフォントを選ぶ。
［例］さわらび明朝

（2）HTML の head内に以下のような記述を追加する。

```html
<link href="https://fonts.googleapis.com/earlyaccess/sawarabimincho.css" rel="stylesheet" />
```

（3）CSSで設定する（「serif」は iOS、PC向けの保険）

```css:
.wf-sawarabimincho { font-family: "Sawarabi Mincho", serif; }
```

（完成！）

 
## → 追記（2017.06.19.）
...ものすごく...今更ですが...。

今年の4月にリリースされた「源ノ明朝」というシンプルな明朝体も使えるようになりました。
「さわらび明朝」はクセが強かったので、こちらなら断然使いやすい！
https://source.typekit.com/source-han-serif/jp/


### ■ Xperia だけの問題？
Android 6.0 以降は、標準搭載されているはずの「Noto Sans CJK JP」ですが、
Xperia だけは搭載されていないようです。
（安心して使えると思ってたのにー）（Xperia のシェア高いのにー！）

［参照］
・Xperia(Android 7)のフォントがウェブ制作者にとって残念 - Togetterまとめ
https://togetter.com/li/1106385
Railsのアセットパイプラインを使って、ビュー別にJavaScriptを指定する


最近Qiitaにお世話になることが増えました。
自分で書いてみたくなったので、Railsをいじっていて気になったことを少々。

## 1. やりたいこと
Railsのアセット(アセッツ？)パイプライン機能ですが、デフォルトのjsファイル(`application.js`)は`assets/`以下の全てのjsを読むようになっています。

「このビューではFoo.jsとBar.jsとBaz.jsを使いたい」
「また別のビューはFoo.jsだけを使いたい」

のようなことを実現してみます。


## 2. 前提
- こんなjsファイルがあったとして:
	- `/app/assets/javascripts/utils/Foo.js`
	- `/app/assets/javascripts/utils/Bar.js`
	- `/app/assets/javascripts/utils/Baz.js`

- こんなビューにjsをロードしたいとします:
	- `/app/views/hoge/fuga.erb` = Foo.jsとBar.jsを使いたい
	- `/app/views/hoge/piyo.erb` = Bar.jsとBaz.jsを使いたい

fugaとpiyoは同じデフォルトのレイアウトを使うとします。


## 3. 対応

### 3.1. 画面ごとのルートjsファイルを定義

application.jsは `require_tree .` 記述によってすべてのjsをロードしてしまうので、
fuga.erbとpiyo.erbそれぞれが必要なファイルをロードするためのjsファイルを作ります。


```/app/assets/javascripts/Fuga.js
//
//= require jquery
//= require utils/Foo
//= require utils/Bar
```

```/app/assets/javascripts/Piyo.js
//
//= require jquery
//= require utils/Bar
//= require utils/Baz
```


### 3.2. ルートjsファイルをプリコンパイル指定
ファイルをひとまとめにするアセットパイプライン機能を使うために、
先に作ったjsをプリコンパイル指定します。

```/config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( Fuga.js )
Rails.application.config.assets.precompile += %w( Piyo.js )
```

webrickの場合は再起動しないとこの設定は反映されないとのこと。
Apache等別のHTTPサーバは未確認です。


### 3.3. レイアウトからjsのロード記述を除去
fuga.erbとpiyo.erbは同じデフォルトのレイアウトを使うので、
そのままだとapplication.jsが読まれてすべてのjsがロードされてしまいます。削除。

```/app/views/layouts/application.html.erb
<!-- ↓これ消しちゃう -->
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
```


### 3.4. ビューファイルにjsのロード記述を追加
それぞれのビューファイルが別々のルートjsファイルをロードするようにします。

```/app/views/hoge/fuga.erb
<!-- ↓これ追加 -->
<%= javascript_include_tag 'Fuga', 'data-turbolinks-track' => true %>
```

```/app/views/hoge/piyo.erb
<!-- ↓これ追加 -->
<%= javascript_include_tag 'Piyo', 'data-turbolinks-track' => true %>
```


以上です。
ガルーンのスマホ版の脆弱性

[脆弱性"&'<<>\ Advent Calendar 2015](http://www.adventar.org/calendars/811) 10日目の記事です。

<a target="_blank" href="https://qiita-image-store.s3.amazonaws.com/0/25276/7400aba1-39df-200d-1baa-2096793c8d2f.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/25276/7400aba1-39df-200d-1baa-2096793c8d2f.png" width="320"></a>

`%5c`は`\`。ソースを見ると、

```js
    grn.Component.Autocomplete.AutocompleteUserFaci.Msg = {
        'place_holder': 'ユーザー/施設検索',
        'search_text':  '\x3cimg src\x3dx onerror\x3dalert(location)\x3e'
    };
```

このような箇所がある。ページを開いただけでは動かないけれど、虫眼鏡アイコンをクリックして、検索欄を出すとスクリプトが動作する。JavaScriptの文字列を動的に生成するのは[危険](http://kusano-k.hatenablog.com/entry/2014/12/01/000356#advent21)。

PC用とスマホ用でページが別になっている場合に、スマホ版の脆弱性が見逃されて残っていることが多い気がする。スマホならもちろん攻撃は成立するし、このようなサイトではPC用のURLにスマホでアクセスしたときはスマホ用のURLにリダイレクトするけれど、スマホ用のURLにPCでアクセスしたときはリダイレクトしないことが多いので、PCも攻撃できる。
JS製HTMLテンプレートエンジンJadeをwindowsで使うまで

## Jade

Installing
1. [NodeJS公式サイト](https://nodejs.org/)でNodeJSをインストール
2. [Git for Windows](https://git-for-windows.github.io/)でGitをDownloadする
3. git bashを開いて、`npm install jade -g`
4. `jade --version`でバージョンが表示されたら、インストール完了

##便利な便利なJadeの使い方
1. Git Bashを開く
2. jadeを使いたいディレクトリに cd Document/Jadeのようにしてエンターを押して移動（tabキーを押せばディレクトリ名を補完してくれます）
3. `jade -w Jade` (Jade部分はjadeを使いたいディレクトリを指定。Jadeファイルを更新するたびに、自動的にhtmlにレンダリングしてくれます)

ディレクトリ構造
Document/jade/index.jade
Git Bashで以下を実行しておく

```bash
cd Documents/
jade -w jade/
```

## 書き方
```jade:index.jade
doctype html
html(lang="ja")
  head
    meta(charset="UTF-8")
    title Jade Sample
  body
    div#jade
      h1 Hello Jade
```

実行結果

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>Jade Sample</title>
  </head>
  <body>
    <div id="jade">
      <h1>Hello Jade</h1>
    </div>
  </body>
</html>
```
Theta SのストリーミングをHDMI経由でキャプチャするときの接続手順

正しい順序で繋がないとちゃんと映像が出ないので注意が必要。

##環境
+ MacBookPro 10.9.5
+ Blackmagic UltraStudio Mini Recorder
+ RICOH Theta S

##手順
1. Theta SをLIVEモードで起動
2. MacとMini RecorderをThunderboltケーブルでつなぐ
3. Theta SとMini RecorderをHDMIケーブルでつなぐ
4. Theta SにUSBケーブルをつなぐ

4.で給電のためのUSBケーブルを先につなぐと、USB経由でのストリーミングになってしまい解像度等が下がるので注意。
USB経由：1,280×720/15fps
HDMI経由：1,920×1,080/30fps
[Swift] resignFirstResponder 以外でキーボードを隠す


表示しているキーボードを隠すとき　resignFirstResponder 使いますよね。

ただ 1つの ViewController に複数の textField があったりする場合、resignFirstResponder を使うと隠すのが面倒です。

```
   textFieldA.resignFirstResponder()
   textFieldB.resignFirstResponder()
   textFieldC.resignFirstResponder()
```

### 1つのメソッドをキーボードを隠す

endEditing(Bool) を使うとどの UITextFiled がフォーカスされてるかを気にせずキーボードを隠すことができました。

```
   view.endEditing(true)
```

※view は ViewController の view

こちらのほうが楽ですね。
Elasticsearchで部分一致を検索する。

SQLで言うところのlike文をElasticsearchで実現しようと思った。
term, matchを使えばできるかと思ったがうまくいかない。fuzzy関連もどうも用途が違う。
そんなこんなでちょっとめんどくさかったので共有。

## 実行環境

* Elasticsearch 1.7.3

## Queryで部分一致

`bool`クエリの中でワイルドカードを使って検索する。

```json
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "FIELD": {
              "name": "*hoge*"
            }
          }
        }
      ]
    }
  }
}
```

これで「hoge」という文字列がnameプロパティに含まれているものを取ってくることができる。

## Filterで部分一致

`regexp`クエリで正規表現が使えるので、無理矢理検索する。

```json
{
  "post_filter": {
    "regexp" : {
      "comment" : ".*fuga.*"
    }
  }
}
```

今回はcommentプロパティが「fuga」という文字列を含んでいるものを取得してくる。

## 感想

多分だけれども、もっと簡単にできる気がしている。
TensorFlowを理解するための基礎情報共有（２）

前回はTensorFlowの最初の利用方法紹介である「GET STARTED」を題材にしてスカラー・ベクトル・テンソルの違いに言及しました。

　前回　http://qiita.com/MATS_ELB/items/dfc50149d52e47e5a07b

その「GET STARTED」ではスカラー量（ひとつの数字で表現できる）を使ってTensorFlowの挙動が説明されていますが、その後のチュートリアルでは急にテンソルを使った数字の画像認識が題材となっていて、テンソルの扱い方が理解しにくくなっているように思います。なので、「GET STARTED」で扱われたケースを少しだけ改造してテンソル版にしたものを掲載し、日本語でコメントを記載します。

2018/01/31 追記： TensorFlow ver 1.5のSyntaxに対応してコードをアップデートしました。

```python:introduction_vector.py
# -*- coding: utf-8 -*-

# tfという名前で参照できるようにtensorflowを、npという名前で参照できるようにnumpyをインポート
import tensorflow as tf
import numpy as np

# y_data = W_data * x_data + b_data というx_dataとy_dataの関係になるようにあらかじめ
# W_dataとb_dataの値を定める。機械学習が適切に行われるとWはこのW_dataに、bはこのb_dataに近づく
# なお、W_dataは２行２列のテンソル、b_dataは２行１列のテンソル
W_data = np.array([[0.1, 0], [0, 0.1]])
b_data = np.array([0.3, 0.3])

# 乱数生成を利用して0から1の間の数値を持つ２行１列の行列「X_data」を浮動小数として100個生成
x_data = np.random.rand(100, 2, 1).astype("float32")

# その後で、生成した100個のxに対して、行列版でのy=0.1x+0.3となるようなyを100個生成
y_data = W_data * x_data + b_data

# 上記で生成したxとy（共に２行１列のテンソル）の組を学習データとして用いる

# 機械学習で最適化するWとbを設定する。Wは２行２列のテンソル。bは２行１列のテンソル。
W = tf.Variable(tf.random_uniform([2, 2], -1.0, 1.0))
b = tf.Variable(tf.zeros([2]))
y = W * x_data + b

# 学習において、その時点での学習のダメ程度を表すlossを、学習データのyとその時点でのyの差の２乗と定義
# Wとbの最適化のアルゴリズムを最急降下法（勾配法）とし、その１回の最適化処理にoptimizerと名前を付ける
# 上記の最適化処理の繰り返しによりlossを最小化する処理をtrainと呼ぶことにする
loss = tf.reduce_mean(tf.square(y_data - y))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 学習を始める前にこのプログラムで使っている変数を全てリセットして空っぽにする
init = tf.global_variables_initializer()

# Optional: Macbook ProでCPU使用で実行すると出ることがあるメッセージを表示しないようにする
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# Launch the graph.（おきまりの文句）
sess = tf.Session()
sess.run(init)

# 学習を1000回行い、100回目ごとに画面に学習回数とWとbのその時点の値を表示する
for step in xrange(1001):
    sess.run(train)
    if step % 100 == 0:
        print step, sess.run(W), sess.run(b)

# Learns best fit is W: [[0.1, 0], [0, 0.1]], b: [0.3, 0.3]
```

これを実行すると下記のような出力（学習の結果としてのWとb）が得られます。

0 [[ 0.06333046  0.27613732]
 [ 0.27408534  0.65764177]] [ 0.12632947  0.0456607 ]
  :
 中略
  :
1000 [[  1.00000262e-01   2.38718428e-07]
 [  2.14710980e-07   1.00000240e-01]] [ 0.29999986  0.29999986]

読みやすいように改行を調整したりしますと

学習回数　1000
Wの値　　[[  1.00000262e-01   2.38718428e-07], [  2.14710980e-07   1.00000240e-01]]
bの値　　[ 0.29999986  0.29999986]

ということで、学習結果のWはW_dataの値（というかテンソル）に、近づいていっています。
というように、テンソルを使ってTensorFlowを使う場合、基本的には「GET STARTED」で扱われたスカラーのケースと同じです。ただ、行列の計算は行・列の数に整合性を求めるのでそこの帳尻が合っているかに気をつけたいです。

以上、どなたかのお役に立てればと思い記載致しましたが、私、このサイトの投稿が初心者なので上手くなくて申し訳ありません。今後も学習しながらお役に立てるように情報共有して参ります。アドバイスなどありましたら是非是非いただきたく。

　続編はこちらへ　http://qiita.com/MATS_ELB/items/e5761be146a400586392
【JavasScript】use strictとは


```
*もくじ*
1 概要
2 使い方
3 注意点
4 参考URL
```


## 1 概要
JavaScript(以下、JS）内で`use strict`を宣言すると、コードがstrict（厳格）モードで実行されるようになる。
strictモードでは、より的確なエラーチェックが行われる。
これまでエラーにならなかったような曖昧な実装がエラー扱いになります。



####何が厳格になったの？
1. withの使用の禁止
2. eval内で宣言された変数のスコープ
3. 単純名の削除の禁止
4. いくつかの識別子を予約語に
5. arguments の単純化
6. セキュアな JavaScript 作成の容易化
7. 8進数表記の禁止 etc..

####メリット）
- コード内に存在する潜在的な問題を早期に発見しやすくなります。
- strictモードのコードは高速に実行することができる場合がある（JSエンジンによる最適化処理を困難にする誤りを修正するため）

## 2 使い方
- ECMAScript5からの対象
- スクリプト全体/各関数に`use strict;`と書くだけ

####ポイント）
- strict 非対応ブラウザーでも、問題なくコードは動作する。
- strictモードは、JSの次期バージョンに備え、正しいコーディングのみを許可するモード。

## 3 注意点
- use strict宣言は各関数スコープにつき1回　※重複してもエラーにはならないが、「不要な宣言」であると警告がでる。
- strictモード非準拠のコードも存在するのでスクリプト全体にstrict宣言をするより、各関数ごとにするほうが良い。

## 4 参考URL
>1. https://developer.mozilla.org/ja/docs/Web/JavaScript/Strict_mode
>2. https://msdn.microsoft.com/ja-jp/library/br230269(v=vs.94).aspx
>3. http://analogic.jp/use-strict/
NCMB Android 通知タップで起動したアクティビティでJSONを取得する


通称NCMB, Nifty Cloud Mobile Backendを使用すると簡単にプッシュ通知を実装できます。
しかも無料枠がとてーも大きく、ほんとお世話になっております。


で、実装方法

プッシュ通知(Android)
http://mb.cloud.nifty.com/doc/current/push/basic_usage_android.html

だいたいこの通りやればOKなのですが、通知処理が完全にCustomGcmListenerServiceに隠蔽されていて
どうやれば

```AndroidManifest.xml
<!-- プッシュ通知タップ時に起動するActivityの設定 -->
<meta-data android:name="openPushStartActivity" android:value=".MainActivity"/>
```

で設定したActivityでプッシュ通知に設定したJSONデータを取得すればいいのかわかりません。


で、CustomGcmListenerServiceのコードを見てみました。

https://github.com/NIFTYCloud-mbaas/ncmb_android/blob/master/ncmb-core/src/main/java/com/nifty/cloud/mb/core/NCMBGcmListenerService.java#L122

抜粋

```CustomGcmListenerService.java
//通知エリアに表示されるプッシュ通知をタップした際に起動するアクティビティ画面を設定する
Intent intent = new Intent(this, startClass);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
ComponentName componentName =
        new ComponentName(packageName, activityName);
intent.setComponent(componentName);
intent.putExtras(pushData);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
        PendingIntent.FLAG_CANCEL_CURRENT);
```

どうやらdataをextrasにまるごと放り込んである模様。

であれば呼び出されたActivityでそれを取り出してあげれば良さそうです。

AppCompatActivityを継承したクラスの場合

```java
    @Override
    protected void onPostResume() {
        super.onPostResume();
        Intent intent = getIntent();
        if (intent == null) {
            Log.d("tag","no intent.");
            return;
        }
        Bundle data = intent.getExtras();
        if (data == null) {
            Log.d("tag","no bundle data.");
            return;
        }
        if (!data.containsKey("com.nifty.Data")) {
            Log.d("tag","no nifty data.");
            return;
        }
        try {
            JSONObject json = new JSONObject(data.getString("com.nifty.Data"));
            Iterator keys = json.keys();
            while (keys.hasNext()) {
                String key = (String) keys.next();
                String value = json.getString(key);
                Log.d("tag", "key: " + key);
                Log.d("tag", "value: " + value);
            }
        } catch (JSONException e) {
            //エラー処理
        }
    }
```

参考になれば。
ActiveAdminでhas_oneでアソシエーションしているモデルを親モデルとまとめてデータを更新する方法


## 目的
UesrオブジェクトがUserInfoオブジェクトをhas_oneで持っており
ActiveAdminのUserオブジェクトの編集画面で、has_oneでつながっているUserInfoオブジェクトを更新したい

この時、状態でUserInfoのレコードが存在しない場合に、UserInfoを新規作成したい場合
ActiveAdminのフォーム設定で少しトリッキーな書き方をする必要がある


## サンプルコード

```user.rb
class User < ActiveRecord::Base
  has_one user_info

  # accepts_nested_attributes_for でuserの子要素も連動して作成できるようにする
  accepts_nested_attributes_for : user_info
  
  #	Userレコードを削除したタイミングでhas_oneでつながっているuser_infoがあれば削除する
  after_destroy do
    user_info.destroy if user_info.present?
  end
  
  省略
end
```


```user_info.rb
class UserInfo < ActiveRecord::Base
  belongs_to user
  
  省略
end

```

ActiveAdminのform要素配下のように設定する

```admin/users.rb
form do |f|
  f.inputs "User Info" do
    f.input :first_name
    f.input :last_name
    省略
  end

  # user.user_infoが存在しない場合、UserInfoをブジェクとを初期値として設定しておく
  # for 内の配列の一つ目に対象のオブジェクトのクラスを指定、
  # 2つ目の配列にhas_oneで繋がっているアソシエーションのオブジェクトを指定する、アソシエーションがnilの場合は||で繋いで新規作成する
  f.inputs "UserInfo", for: [:user_info, f.object.user_info || UserInfo.new({user_id: f.object.id, some_attr: "デフォルト値", 省略})] do | user_info |
    user_info.input :some_attr
    省略
  end
  f.actions
end
```

## まとめ
ActiveAdminのカスタマイズは闇が深い
カスタマイズが大きくなってきたら素直に普通にViewとControllerを書いたほうが効率が良い気がする
エディタスクリプトでPlayerSettingsのScripting Backendの値を取得したり更新する

# はじめに
*PlayerSettings*クラスあたりにIL2CPPとそうじゃないのを切り替えるためのプロパティないかと調べていたらなかったので、無理やり値を取ったり更新する処理を組んでみる。

**あくまで無理矢理です。本当にこれでいいのかは自己判断してください**

# 取得と設定の関数を探す
Google先生に聞いたら、フォーラムにそれらしきものを見つける。
http://answers.unity3d.com/questions/1037288/how-do-i-check-for-the-il2cpp-scripting-backendset.html

*PlayerSettings.SetPropertyInt*で設定、*PlayerSettings.GetPropertyInt*で取得、と。
つまり、直接設定を更新するためのプロパティが公開されていないので、このようなやり方になる模様。

```csharp:SetScriptingBackendProperty.cs
PlayerSettings.SetPropertyInt("ScriptingBackend",
    (int)ScriptingImplementation.IL2CPP, 
    EditorUserBuildSettings.selectedBuildTargetGroup
);
```

# まだ動かない
で、エディタスクリプトで*SetPropertyInt*と*GetPropertyInt*を使ってみたのだけれど、コーンソールに「初期化されていないプロパティだゾ」と真っ赤なエラーログ。

初期化必要ようです。
エラーログに「*InitializePropertyInt*」で初期化しろって書いてあるけど・・・。

**この関数も公開されていない。**

# 初期化の関数を無理やり動かす
ILSpyで*UnityEditor.PlayerSettings*クラスの中身を見てみる。![image](https://qiita-image-store.s3.amazonaws.com/0/47557/454dc7a5-9226-bcb1-e6c0-1f0e51e1b357.png)

いた。こいつ。
（Scripting Backendの項目は*ScriptingImplementation*という列挙型使っている）

さて、こいつをReflectionで呼び出す。

```csharp:CallInitializePropertyEnum.cs
	private static void InitScriptingBackendProperty()
	{
		var typeObject = typeof(PlayerSettings);
		var method = typeObject.GetMethod("InitializePropertyEnum", BindingFlags.Static | BindingFlags.NonPublic, null, new System.Type[] { typeof(string), typeof(object), typeof(BuildTargetGroup) }, null);

		method.Invoke(null, new object[] { "ScriptingBackend", (object)ScriptingImplementation.Mono2x, (object)EditorUserBuildSettings.selectedBuildTargetGroup });
	}
```

動作確認。
あとは、さっきの*SetPropertyInt*読んであげれば、エディタスクリプトで一応更新できたように見える。
ビルドをすると、ちゃんとコンバートされているのも確認。

# 最後に
昔のメカニムとかメッシュのロード時のGameObjectの最適化あたりみたいに、そのうちプロパティが公開されるのかな。
Debian デスクトップ環境の wheezy から jessie へのアップグレードメモ

# X設定

解像度設定の保存ができないので手動で。


現在の状態を確認。

```bash
zsh % xrandr                                                                [~]
Screen 0: minimum 8 x 8, current 2560 x 1600, maximum 16384 x 16384
DVI-I-0 disconnected (normal left inverted right x axis y axis)
VGA-0 disconnected (normal left inverted right x axis y axis)
DVI-I-1 connected primary 2560x1600+0+0 (normal left inverted right x axis y axis) 641mm x 401mm
   1280x800      59.91 +
   2560x1600     59.97* 
HDMI-0 disconnected (normal left inverted right x axis y axis)
```

.xprofile に設定

```bash
xrandr --output DVI-I-1 --mode 2560x1600
```

# 文字入力

SCIM + Anthy

キーマップ設定がusになっていたので変更。

.xprofile

```bash
setxkbmap -layout jp
```

前は日本語入力時、Shift + Space で半角空白が入力できていたんだけど、できなくなった。
設定を逆にすると Shift + Space で全角空白が入力できて space で半角空白が入力できない状態になるので、キーバインド設定が効いてないわけではなさそう。
F2 や Ctrl+e に割り当てたら動いて、Alt + Space など space を絡めたら動かない。
かなり困るけども直し方が分からない…。
あとEmacs上では入力できる。これもよく分からない。



キーボードレイアウトもおかしかったのでここでに設定。

# 自動起動設定

```bash
insserv -d rc.local
```

http://ubuntuforums.org/archive/index.php/t-1625046.html
これを設定していたのだが、/sys/fs/cgroup が自動マウントされるように変わったようなので。

```bash
mkdir -p -m 0777 /sys/fs/cgroup/cpu/user
echo "/usr/local/bin/cgroup_clean" > /sys/fs/cgroup/cpu/release_agent

exit 0
```

.bashrc や .zshrc も変更する。


# Chrome設定

URL欄(omnibox)の入力が超絶遅いので、何とかする。

[Google Chrome、Linux下での速度問題のまとめと回避方法](http://ja.hideki.hclippr.com/2015/01/29/google-chrome%E3%80%81linux%E4%B8%8B%E3%81%A7%E3%81%AE%E9%80%9F%E5%BA%A6%E5%95%8F%E9%A1%8C%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A8%E5%9B%9E%E9%81%BF%E6%96%B9%E6%B3%95/)
どうもフォントキャッシュのバグで遅いらしい。

```bash
gnome-tweak-tool
```

Courier、DejaVu、Rictyなどでとりあえず回避。

履歴とかブックマークとか拡張とか色々消したけど、あまり意味なかったかも。

# その他

VirtualBoxなどパッケージで入れたGUIアプリはそのまま使えた。
VMwareは起動したときに再コンパイルを促されてGUI画面でボタンを押すだけだった。

とりあえず今日はここまで。




## 追記

別のIMを試した。
結局 SCIM　に戻るという…。

### uim-anthy

Shiftを押しながら入力で英字入力ができない。

ツールバー選択

```bash
update-alternatives --config uim-toolbar
```

### ibus-anthy

Shiftを押しながら英数入力中にspaceで変換されてしまう。
cakephp3 + nginxで、さくらVPSの設定conf


CakePHP3とNginxの設定で苦労したので、覚え書きです。

```nginx:/etc/nginx/conf.d/virtual.conf
server {
    listen       80;
    server_name   example.com www.example.com;

    root   /var/www/example.com/webroot;
    index  index.php index.html;

    location / {
        try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args; 
    }
    location ~ \.php$ {
	include /etc/nginx/fastcgi_params;
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_index index.php;
	fastcgi_param CAKE_ENV "production";
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   }
}
```
Macのbashでautocdしたい


初期インストールされているbashはバージョンが4.0以降ではないので`shopt -s autocd`が設定できない。

```bash:プリインストールされているbash
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.
```

なので、brewから最新版をインストールする。

```bash:bash
$ brew update
$ brew install bash
```
インストールされた場所がどこかと、bashのバージョンが4.0以上であることを確認して、最後に`/etc/shells`へパスを書き込む

```bash:bash
$ which bash
...
$ /usr/local/bin/bash --version
...
$ echo /usr/local/bin/bash | sudo tee -a /etc/shells
...
```
ここまで問題なければchshコマンドでシェルを変更して、`shopt -p`で一覧の中に`autocd`があることをチェックしておわり。

```bash:bash
$ chsh -s /usr/local/bin/bash
...
$ shopt -p
...
```

### byobuを使っている場合
macでbyobuを使っていると常に`/bin/bash`からシェルを起動しようとしてくるので、こいつを_bashか何かにリネームして`/usr/local/bin/bash`からここへbashとしてシンボリックリンクでも貼るとよい◯
reveal.jsでMarkdown中に数式を書く時のエスケープ

数式を書くプレゼンを作っていて、reveal.jsが対応しているMathJaxとMarkdown記法を併用したら一部の数式が変換されなくて困ったので、その原因と対策です。

reveal.jsはv1.3.1を使いました。

## 発端
画像のフーリエ変換のプレゼンを作っていて、フーリエ変換の式をMathJaxで書いたところ、1次元のフーリエ変換の式は期待通り表示されるのに、2次元のフーリエ変換の式はいつまで経っても数式にならなくて困りました。

ソースはこんな感じです。
※ちなみに Atom + markdown-preview-plus + mathjax-wrapper では、HTMLタグを除いたソースでどちらの式も表示されています。

```html
<section data-markdown>
  <script type="text/template" >
    # フーリエ変換
    $$
      F(u) = \int_{-\infty}^{\infty} f(x)\mathrm{e}^{-j2\pi ux}dx
    $$
    
    # 2次元のフーリエ変換
    $$
      F(u,v) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} f(x,y)\mathrm{e}^{-j2\pi (ux + vy )}dxdy
    $$
  </script>
</section>
```

## 原因と対応
実際に表示して見ると、

```
$$ F(u,v) = \int{-\infty}^{\infty} \int{-\infty}^{\infty} f(x,y)\mathrm{e}^{-j2\pi (ux + vy )}dxdy $$
```

と表示されて、しかも最初の`\int`のあとの`{-\infty}^{\infty} \int`の部分が斜体となっていました。

つまり、積分の範囲を示すつもりの`_`が、Markdownの強調記述として処理されてしまったわけです。
これを`\_`とエスケープすることで、期待通り表示できました。

```html
<section data-markdown>
  <script type="text/template" >
    # フーリエ変換
    $$
      F(u) = \int\_{-\infty}^{\infty} f(x)\mathrm{e}^{-j2\pi ux}dx
    $$
    
    # 2次元のフーリエ変換
    $$
      F(u,v) = \int\_{-\infty}^{\infty} \int\_{-\infty}^{\infty} f(x,y)\mathrm{e}^{-j2\pi (ux + vy )}dxdy
    $$
  </script>
</section>
```

1次元の式は`_`が1つだけで強調の構文と判断されなかったようで、期待通りに表示されたようです。
下にまとめていますが文字として表示するためにはエスケープが必要になる`\`も、直後の文字がエスケープ対象でなければMarkdownの処理後もそのまま残されるようで、`\\int` などと書かなくても済んでいますがその分混乱を招いてくれました。

## エスケープの一覧表
実際には`_`以外にもエスケープは必要だったので、確認しているものをまとめておきます。

|通常の書き方|Markdown中での書き方|
|:-:|:-:|
|_|\\_|
|*|\\*|
|`|\\`|
|\\|\\\\|
|\\\\|\\\\\\\\|
|\\{ , \\}|\\\\{, \\\\}|
|a = b\\\\<br>> c|a = b\\\\<br> \\> c|

エスケープ大事、です。

他にも表示できないものがあれば教えていただけると助かります。

しかし、Atomのプラグインみたいにエスケープなしには出来ませんかねぇ……(同時に処理する必要があるから難しいか)。
WindowsパッケージマネージャーScoopでEmacsを使う

Windowsのパッケージマネージャといえば `Chocolatey`があって、便利なんですがパッケージのメンテナンスがめんどくさいようで、せっかく入れてもバージョンが古いから新しいのを手動で入れるはめになったりすることが多くて結局使わなくなってたんですよ。

### Emacsの入れ方

なんか色々説明しようかと思ったんですが、この記事をEmacs入れながら書いてて、つまりEmacsがない環境で書いてるので非常に文字が打ちづらくてストレス貯まるのでやり方だけ書いときます。

```
PS C:\Users\ironsand> scoop install emacs
couldn't find manifest for emacs
```
「ないっすよEmacsとか」と言われるので検索してみるとExtraパック使うといいらしい。GUIが必要なのはExtraに入ってるんだって。EmacsにGUIが必要とかいうと石が飛んできそうだけど、いりますよねGUI？ Windowsで使うなら。

```
PS C:\Users\ironsand> scoop bucket add extras
git is required for buckets. run 'scoop install git'.
PS C:\Users\ironsand> scoop install git
...
PS C:\Users\ironsand> scoop install emacs
git (2.6.2.windows.1) was installed successfully!
Notes
-----
To get Git to recognise OpenSSH, you will need to run

scoop install openssh
```
今度はOpenSSH入れろって言われる。はじめに言っといてくださいよ。

```
PS C:\Users\ironsand> scoop install openssh
openssh (5.4p1-1) was installed successfully!
PS C:\Users\ironsand> scoop bucket add extras
PS C:\Users\ironsand> scoop install emacs
```

はい、これでできた。
AWS CLI のアップデート方法（Linux）


### はじめに
AWS CLI は結構な頻度でバージョンがあがりますし、
新しい機能をCLIで使うには当然アップデートする必要があります。
作業自体は非常に簡単ですが、備忘録も兼ねメモしておきます。

### アップデート方法

1. バージョンを確認する
``$ aws --version``

1. 最新バージョンへアップデートする
``$ sudo pip install -U awscli``
※バージョンを指定する場合は以下の通りとなる
``$ sudo pip install awscli==x.x.x``

### ちなみに
Windows版のアップデートは最新版の[msiファイル](https://s3.amazonaws.com/aws-cli/AWSCLI64.msi)を取得して再インストールすれば完了です。
大学祭に展示したSiv3D製のゲームを作った話

# はじめに
私は某大学の某サークルでゲームを作っている者です.今回は自分の大学の大学祭に出したゲームをSiv3Dで作ったので紹介をします．
# どんなゲームか?
今回作ったゲームは他に類を見ないジャンルのゲームです．

その名も!ガベこれ!
![Game2.png](https://qiita-image-store.s3.amazonaws.com/0/101297/eb4a88a3-224c-4651-ff27-21b8a4b77d37.png)


えー，一体どういったゲームなのかというとこれは普段プログラミングをやっている人にしか理解してもらえないかもしれません(笑)
このゲームはプレイヤーがガベージコレクタになって不要なオブジェクトを破棄してメモリ不足を防ぐゲームです．まあ，パズルゲームに近い感じです．
ガベこれはガベージコレクションを略して名づけました．
ダウンロードはこちらから-> [ガベこれ](https://github.com/GabeColle/GabeColle)

# Siv3Dを使ってよかったこと
### 当たり判定がメソッド一つで実装できる
今回ゲームを作る上で便利だったのが当たり判定のメソッドです．
マウスカーソルと図形，図形と図形の当たり判定などがメソッドに最初からあって今までDxライブラリを使っていた者としてはとても感動しました．

### エフェクト管理のクラスでフレーム管理をしなくて済んだ
Siv3Dにはエフェクトのインタフェースがあって面倒くさいフレーム管理などをしなくて済みました．フーリエ変換も関数一つでできたのでヴィジュアライザも簡単につくれました．
### シーンマネージャでシーンの管理が捗った
継承するだけでシーンが管理できました．Dxライブラリの時はシーンマネージャは自前で実装していました．
### 素材
Siv3Dにはいろんなタイプの図形が最初から用意されていました．もちろん全部クラスで．
### 準備がダウンロードしてダブルクリックするだけで終わった
Siv3Dをダウンロードしてインストーラーを起動してインストールしたらもう使えます．              Visual StduioのプロジェクトにSiv3Dを選べば使えました．
### リファレンスが親切だった
それぞれの機能に対してサンプルプログラムと実行結果が載せてあって分かりやすかったです．
全体的にDxライブラリよりも良かったです(笑)Dxライブラリは全部関数だったのに対してSiv3Dはクラスでできていてしかも一つ一つのクラスのメソッドが充実してました．
# 改善してほしい点
Siv3Dという名前なのに3Dのリファレンスが不足していた．更新途中でリファレンスが完成していなくてちょっと困りました(笑)
KotlinでMutableSetを作る

Setの場合は専用の`setOf()`を使えば作れるけども`mutableSetOf()`的なやつが見つからなくて15分くらい時間を使ってしまった。`Set#toMutableSet`を使えばOKっぽい。

```kotlin
val hoge: MutableSet<String> = setOf<String>().toMutableSet()
```
Visual Studio CodeでES6を使うときはjsconfig.jsonを作る


![vscode.png](https://qiita-image-store.s3.amazonaws.com/0/1423/278d627c-953b-6265-6cc5-beac98b3bbd6.png)


波なみ線がいっぱい出てきて、カーソル合わしたらjsconfig.json-file作ってねって言われたのでぐぐったら出てきた。

```jsconfig.json
{
  "compilerOptions": {
    "target": "ES6"
  }
}
```

[JavaScript - Visual Studio Code](https://code.visualstudio.com/docs/languages/javascript
)
Eclipseを使って（プロキシ環境で）rails new

　
備忘録代わりにまとめておきます。
Eclipseを使う場合のrails newの手順です。

#環境
- windows 7(32bit)
- Ruby 2.1.5
 * Bundler 1.10.6
- Eclipse Luna SR2 4.4.2
 * Aptana Studio 3 プラグイン 3.6.0

RailsはBundlerでインストールします。因みにプロキシ環境です。


#手順

- プロジェクトのフォルダを新規作成

最初はコマンドプロンプトでの操作になります。

- bundlerの雛形作成

```
bundle init
```

- gemfileをrailsがインストールできるよう書き換え
railsのコメントアウトを外します。

- プロキシ用設定、bundlerでのインストール

```
set http_proxy=http://proxy.hostname:port
bundle install --path vendor/bundle
```

ここからEclipse上での操作になります。

- 「ファイル」→「インポート」→「新規プロジェクトとして既存のフォルダーを使用」でrailsプロジェクトとして開く

- railsコンソールを開く
スクリプト・エクスプローラーでプロジェクトを選択していると
「実行」内に「Rails console」の項目があります。あるはずです。

- プロキシ用設定をしてからrails new

```
export http_proxy=http://proxy.hostname:port
bundle exec rails new .
```

- gemを上書きしていいか聞かれるので`y`


　
ようやくできました。アプリを作っていきましょう！
Ruby | String には grep じゃなく match

文字列の中から検索する時。

String#grep は存在しない。

```rb
'ABC'.grep /B/ 

# => NoMethodError: undefined method `grep' 
```

String#match を使うこと。

```rb
'ABC'.match /B/

# => #<MatchData "B">
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
pry10系でpager output error が出た時の対処法

`Hirb`と`pry`を使っていて、
pryを 0.9 -> 0.10系に移行した時に```binding.pry```をすると以下のようなエラーが出ていた。

```
(pry) output error: #<NoMethodError: undefined method `pager' for nil:NilClass>
```

# 対処法

.pryrcの`Pry.config.print`の部分を以下のように書き直せば良い。

```rb:.pryrc
require 'hirb'

Pry.config.print = proc do |output, value, _pry_|
  Hirb::View.view_or_page_output(value) || Pry::DEFAULT_PRINT.call(output, value, _pry_)
end
```
Python2.7系でtimedeltaの除算

# Python2.7.9でtimedeltaの除算が出来ずハマる

時間幅が与えられた時に、それが何日間以上かを求めるために、以下のようにした。

```py:test.py
import datetime

oneday = datetime.timedelta(days = 1)
delta = datetime.timedelta(minutes = 3000)
print delta // oneday
```

リファレンスを見る限りこれで行けるかと思ったが、エラー。
`TypeError: unsupported operand type(s) for //: 'datetime.timedelta' and 'datetime.timedelta'`

2.7系から追加されたtotal_secondsメソッドなどを用いて解決した。

```py:test.py
import datetime

oneday = datetime.timedelta(days = 1)
delta = datetime.timedelta(minutes = 3000)
print delta.total_seconds() // oneday.total_seconds()
```

3.x系では最初から通るので、除算は3から追加されたのかなと。
x10のArrayListの要素挿入・削除のコスト

## 概要

x10で可変長の配列を扱うためのクラスとして `ArrayList` というクラスがある。
要素の挿入や削除のコストが気になるので、どのように実装されているか調査した。
結論としてはC++のvectorと同じように配列で実装されており、先頭や中間の要素の挿入・削除のコストはO(N)。

## 参考文献

- https://github.com/x10-lang/x10/blob/master/x10.runtime/src-x10/x10/util/ArrayList.x10
- https://github.com/x10-lang/x10/blob/master/x10.runtime/src-x10/x10/util/GrowableRail.x10

## コードリーディング

ArrayListのコードを読んでいく。
まず冒頭で`a`という値としてGrowableRailを保持していることがわかる。これが配列のデータの実体。

```x10:ArrayList.x10
public class ArrayList[T] extends AbstractCollection[T] implements List[T] {
    private val a: GrowableRail[T];
    ...
```

GrowableRailの方も見ていくと

```x10:GrowableRail.x10
public final class GrowableRail[T] implements CustomSerialization {
    private var data:Rail[T];
    ...
```

というように `Rail[T]` の変数を保持していて、ここにデータ保持されている。
GrowableRailクラスには、要素数が変わるたびに必要に応じて `data`変数を別のサイズのRailに移していく。
（C++のSTLのvectorみたいなもの。）

dataのリサイズ処理は `grow`, `shrink` というメソッドで実装されていた。該当部分を引用すると

```x10:GrowableRail.x10
    public def grow(var newCapacity:Long):void {
        assert (newCapacity >= capacity());
        var oldCapacity:Long = capacity();
        if (newCapacity < oldCapacity*2) {
            newCapacity = oldCapacity*2;
        } 
       ...
```

と実装されており、２倍ずつcapacityを増やしていく実装となっている。shrinkもほぼ同様。

つまり、ArrayListに対して`add`や`removeLast`を呼ぶと、典型的にはO(1)、最悪ケースでO(N)の時間がかかる。

当然ながら、内部でRail（配列）を利用しているので要素の先頭への挿入や削除にはO(N)かかる。
要素の挿入・削除は以下のように実装されていた。

```x10:ArrayList.x10
    public def addBefore(i: Long, v: T): void {
        a.add(v);
        for (var j:Long = a.size()-1; j > i; j--) {
            a(j) = a(j-1);
        }
        a(i) = v;
    }

    public def removeAt(i: Long): T {
        val v = a(i);
        for (var j: Long = i+1; j < a.size(); j++) {
            a(j-1) = a(j);
        }
        a.removeLast();
        return v;
    }
```

### コメント

QueueやListの実装は標準ライブラリにはないのだろうか？