OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studio で Kotlin を使ってみる

# Overview
[Kotlin](http://kotlinlang.org/) がイケてると聞いてどんなものか試してみることにしました。

## Android Studio に Kotlin Plugin をインストールする
まずは、今使っている Android Studio に Kotlin Plugin をインストールします。
とても簡単です。
ちなみに、私が使っている Android Studio は `2.0 Preview5` です。
公式ページ通りに行うといいですね。
http://kotlinlang.org/docs/tutorials/kotlin-android.html
Kotlin Extensions For Android(obsolete) という Plugin もありますが、書いてある通り今は使われてなく、Kotlin Plugin の方にマージされているようです。
インストールが終わったら Android Studio を再起動します。

## 新規作成したプロジェクトの Java File を Kotlin File に変換する
同じ JVM 上で動作する言語ということもあって Java File から Kotlin File に変換することできます。(すごい・・)
上記の tutorial でも記載されていますが [Find Action](https://www.jetbrains.com/idea/help/navigating-to-action.html) で Convert Java F Kotlin で Kotlin File に変換されます。
既存プロジェクトでこれから追加開発する部分は Kotlin で書く、または既存コードを Kotlin でリファクタリングしていくみたいなこともできそうで夢が広がりますね。

## 新規作成したプロジェクトを Kotlin で動かしてみる
~~Android Studio 2 から Instant Run が追加されたのですが、Kotlin Plugin ではまだ対応していないらしく(要調査) Instant Run を外してビルドとなりました。~~
`2.0 Preview6` にバージョンアップしたら `Instant Run` 動きました。
Alpine Linuxで動作するfluentdでcertificate verify failedエラー

# 現象
fluentdをDockerで運用していると、AWS SDK for Rubyを利用したpluginで下記のようなエラーが発生するようになった。

```shell-session
$ 2016-03-04 12:49:53 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2016-03-04 12:49:52 +0000 error_class="Seahorse::Client::NetworkingError" error="SSL_connect returned=1 errno=0 state=error: certificate verify failed" plugin_id="object:3fe59dea15c4"
```

# 解決策
SSL証明書の場所をDockerfileなどで環境変数を指定してあげる。（apkで`ca-certificates`をインストールしている前提）
```
ENV SSL_CERT_FILE /etc/ssl/certs/ca-certificates.crt
```

# 参考文献
http://qiita.com/toshihirock/items/ce85c5b66b0236839ec0
analogRead()用の関数作ってみた3

[Arduino(?)に繋いだ可変抵抗を本当に回した時だけ値を受けとるには？](http://qiita.com/tadfmac/items/0aa8b07385dc557ff387)
[analogRead()用の関数作ってみた](http://qiita.com/ttatsf/items/c20a2f41ba2641c069a9)
[analogRead()用の関数作ってみた2](http://qiita.com/ttatsf/items/5010ad62ac622f7cd6db)の続きです。

すっきりいかない感じ、わかりました。
変にオブジェクト的にしなくちゃと考えすぎてました。
間違っていました。
自分の欲しいのは、記憶しておいてくれるちょっと賢い関数でした。

#クラスを分割する
っていうか違う考えで作りなおしたほうが良い。
何となく可変抵抗(VR)というモノでひとくくりにしてたけど、データの流れで見れば、getAverage()はデータをフィルタで加工しているし、isChanged()は出力メータを監視しているようなものだ。
で、FilterとMeterに分割してみました。

```cpp
#include <MIDIUSB.h>
class Filter
{
  static const int MODULUS_AVERAGE = 8;
  private:
    int val_hist[MODULUS_AVERAGE];
    int sum;
    byte i_average;
  public:
    Filter();
    int getAverage(int val);
};
Filter::Filter(){
  for(int i = 0; i < MODULUS_AVERAGE; i++) val_hist[i] = 0;
  sum = 0;
  i_average = 0;
}
int Filter::getAverage(int val){
  sum += ( val - val_hist[i_average] );
  val_hist[i_average] = val;
  i_average = ++i_average % MODULUS_AVERAGE;
  return sum / MODULUS_AVERAGE;
}

class Meter
{
  static const int MODULUS_CHANGED = 4;
  private:
    int val2_hist[MODULUS_CHANGED];
    byte i_changed;
  public:
    Meter();
    boolean isChanged(int val);
};
Meter::Meter(){
  for(int i=0;i < MODULUS_CHANGED; i++) val2_hist[i] = 0;
  i_changed = 0;
}
boolean Meter::isChanged(int val){
  val2_hist[i_changed] = val;
  i_changed = ++i_changed % MODULUS_CHANGED;
  for(int j = 0; j < MODULUS_CHANGED - 1; j++){
      if( val == val2_hist[ (i_changed + j)  % MODULUS_CHANGED ] ) return false; 
  };
  return true;
}
```

字数は多くなったものの、名前と機能が何となく関連付いているように見えてきて、見易くなったような気がする...
#使い方
FilterとMeterを必要な数だけインスタンス化して、あとは同じ考えです。

```cpp
Filter filter[4];
Meter meter[4];
const int ANAPIN[4]={0,1,2,3};
const byte CHANNEL = 0;
const byte CC[4] ={25,26,27,28};
 
void setup() {
  Serial.begin(115200);
}

void loop() {
  int temp;
  for(int i=0;i < 4; i++){
    if( meter[i].isChanged( temp = filter[i].getAverage( analogRead(ANAPIN[i]) >> 3 ))){
      controlChange(CHANNEL,CC[i],temp);
      MidiUSB.flush();
    };
  delay(10);
  };
}

//controll value or velocity
// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}
```

これだったら後で見ても、何をしたかったか読みとれそう...
少なくともVSでは関数定義を無理してヘッダーに書かないようにする必要はなさそうだ

# 初めに
関数定義をcpp/ccファイルに書くか、h/hppに書くかたまに悩むことがあると思うんですが、コンパイル速度的にはどうなんよ、ということで検証しました。

# 調査対象

定義をヘッダーに書いていたもの
https://github.com/YSRKEN/KanColleSimulator_KAI/commit/7a37a02343c224018c3962aa04addad0c77894c4

定義をcppファイルに移したもの
https://github.com/YSRKEN/KanColleSimulator_KAI/commit/a14223991c37a1eb64c4df4d97fedd47db3c1ac5

# 使うコンパイラ

- Visual Studio 2015 community Update 1
- Visual Studio 2015 community Update 1 Clang with Microsoft CodeGen (January 2016) (clang3.7)

この2つのコンパイラ ✕ x86/x64 ✕ Debug(-O0)/Release(-O2)
の計8通りの構成を作り、VSのバッチビルド機能ですべてリビルドした時間を測定

# 測定環境
http://freesofutotravel.blog94.fc2.com/blog-entry-9.html

# 計測方法
[アマレコTV](http://www.amarectv.com/)を用いてコンパイル時のlogウィンドウを録画する。録画コーデックは[UtVideo Codec Suite 15.3.0 YUV420 BT.709 VCM](http://umezawa.dyndns.info/wordpress/?cat=28)。

これをAviUtlにて取り込みカット編集、AviUtlに表示される総時間と総frame数を記録する。なおAviUtlの読み込みプラグインには[L-SMASH Works](https://github.com/VFR-maniac/L-SMASH-Works) File Reader r785を利用した

# 結果
ヘッダーに定義を書いたもの　3:58.59[7158frame]
![def_at_header](https://pbs.twimg.com/media/Cct1PPqVIAAP1bE.jpg:large)
cppに定義を書いたもの　3.57.80[7134frame]
![declear_only](https://pbs.twimg.com/media/Cct1PQ_VIAAglZH.jpg:large)

有意な差は出なかった(ヘッダーに書くと+0.3%コンパイル時間増加した)

# 結論
コンパイラは十分優秀なのでどっちでもいいんじゃないか。
templateが絡む関数を公開するととどうせヘッダーに書くしか無いのだから、ヘッダーに定義を書くことへの罪悪感をもし持っている人がいたら少しは減ったかな？

他のコンパイラでも(gccとかgccとかgccとか)多分同じなんじゃなかろうか。
Vimperatorのtabmoveをcount指定で実行するユーザーコマンド



## :tabmoveの問題
いつも20個前後のタブを開いていることが多いのですが、2つのページを比べたり、1つのページをちょくちょく見ながら別のページで作業する際など、Vimperatorでタブの位置を移動させるコマンド`:tabmove +N|-N`をよく使います。

ただ、このコマンドはカウント指定をサポートしておらず、たくさん移動する時に不便なんです。今までは下記のようにキーマッピングしていて、タブ位置を10個分左に移動させる時は、Cmd+Shift+Hを10回叩いてました。同じキー入力を10回も繰り返すなんて、Vimp力の低さに悲しくなりますよね。

```vim:.vimperatorrc
nnoremap <M-S-h> :tabmove -1<CR>
nnoremap <M-S-l> :tabmove +1<CR>
```


## :commandでユーザーコマンドを追加
悲しくなってるだけじゃダメなので、`:command`で追加できるユーザーコマンドで、`:tabmoveleft`と`:tabmoveright`を実装し、カウントを渡せるようにしてやればいいんじゃないかと考え、以下の様なユーザーコマンドを追加してみました。

```vim:.vimperatorrc
command -count tabmoveleft :tabmove -<count>
command -count tabmoveright :tabmove +<count>
nnoremap <M-S-h> :tabmoveleft<CR>
nnoremap <M-S-l> :tabmoveright<CR>
```
これで、タブ位置を10個分左に移動させる時は、`10,Cmd+Shift+H`と叩けばよくなりました。いい感じです。

と思ったのもつかの間、これだとカウントを指定しなかった場合`<count>`に数字が渡らないので、`:tabmove`の引数チェックにはじかれ`Trailing characters`というエラーになってしまうんです。1個分左に移動させるのに`1,Cmd+Shift+H`と入力するのは、Vimp力の低い私でもさすがに嫌です。

そこで、引数のところを式展開してくれないかなぁと淡い希望をもって、下のように変更してみたのですが、`Trailing characters`となってダメでした。当たり前ですね。どうにかして式展開する方法があればこの方法で解決できそうですが、残念ながらそんな方法は見つかりませんでした。(`-count=1`とVimライクに初期値を追加する方法はサポートされていません)

```vim:.vimperatorrc
" // these command won't work
command -count tabmoveleft :tabmove -1+1*(<count> || 0)
command -count tabmoveright :tabmove +1+1*(<count> || 0)
```

##JavaScriptでユーザーコマンドを追加
Githubなどに公開されてる.vimperatorrcなどを見て、JavaScriptでユーザーコマンドを追加できるというのは知っていたのですが、ちょっとめんどくさそうなので敬遠していました。今回は他に方法が見つからなかったので、Vimp力を上げるためにもトライしてみました。

コマンド実行時に指定した引数やカウントは、vimperatorがパースしてからユーザー定義の関数に引数として渡されるようになっており、カウントは`args.count`で参照可能でした。そのため、カウントを取得して`+`や`-`記号をくっつけてtabmoveに渡してあげるだけOKでした。結構簡単ですよね？

`addUserCommand`に渡すパラメータや、ユーザーコマンドから他のVimperatorコマンドを実行する方法は、Vimperatorのソースを見て真似しました。パラメータ値などの確認はWebコンソールを使いました。Vimperator用のJavaScriptコード内からは`content.window.console.log()`でWebコンソールに出力できます。



```js:tabmove.js
// tabmove with [count] support

;(function() {

  liberator.modules.commands.addUserCommand( ["tabmr[ight]"], "[count]Move tab right   (same as :tabmove +N)",
    function(args) {
      let arg = "+" + (args.count || 1);
      commands.get("tabmove").execute(arg, args.bang); 
    },
    { argCount: 0, bang: true, count: true },
    true
  );

  liberator.modules.commands.addUserCommand( ["tabml[eft]"], "[count]Move tab left   (same as :tabmove -N)",
    function(args) {
      let arg = "-" + (args.count || 1);
      commands.get("tabmove").execute(arg, args.bang); 
    },
    { argCount: 0, bang: true, count: true },
    true
  );

})();
```

.vimperatorrcで上記のJavaScriptをロードして、お好きなキーマッピングを追加すれば完成です。タブ位置を一番最初と一番最後に移動させるコマンドと一緒に使えば便利なんじゃないかと思います。


```vim:.vimperatorrc
"tabmove with count
source ~/.vimperator/scripts/tabmove.js
nnoremap <M-S-h> :tabmleft!<CR>
nnoremap <M-S-l> :tabmright!<CR>
nnoremap <M-S-C-h> :tabmove 0<CR>
nnoremap <M-S-C-l> :tabmove<CR>
```

意外と簡単にJavaScriptでコマンドを拡張できるので、これを期に色々と試してみようかと思います。


##参考資料
[Vimperatorのソース](https://github.com/vimperator/vimperator-labs)
[addUserCommand_for2.0pre - Vimperator](http://seesaawiki.jp/w/shin_yan/d/addUserCommand_for2.0pre)
Spring Boot の application.properties (yml) でプロパティが重複したときの挙動

Spring Boot のコンフィグレーションファイルとなる `application.properties` または、`application.yml` は、`application-{profileName}.properties` という命名で、プロファイルごとに設定を用意、切り替えができることは広く知られているところ。

公式のドキュメントにも同様のことが書いてあります。
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties

Spring Boot のプロファイルに関するプロパティは2つあり、それぞれ以下のような機能を持ちます。

| プロパティ                 | 機能                     |
|---------------------------|--------------------------|
| `spring.profiles.active`  | プロファイルを切り替える。 |
| `spring.profiles.include` | プロファイルを取り込む。   |

今回問題にするのは、`spring.profiles.include` の方で、このプロパティを設定して、取込む側と、取込まれる側で、同じプロパティが設定された場合に、どちらの設定値が有効になるか、というものです。
以下のようなファイルをイメージしてもらうと良いかと思います。

```properties:application.properties
spring.profiles.include=test
server.port=8080
```

```properties:application-test.properties
server.port=18080
```

![3.png](https://qiita-image-store.s3.amazonaws.com/0/47993/5f7fb301-9e37-c138-78d4-056f9ad6bdd3.png)

結果はと言うと、取込まれる側の値が有効になります。
つまり先の例であれば、`server.port` の値は、"18080" が有効になります。

`include` というプロパティ名から、取込む側の値が有効になるかと思いきや、include 先である取込まれる側の値が有効になるので注意が必要です。
この挙動をうまく使うと、記述する設定値の量を減らすこともできるので、おさえておきたい。
【UE4】 コンポーネントの情報を編集中に表示する方法

![コンポーネントビジュアライザー.gif](https://qiita-image-store.s3.amazonaws.com/0/66029/9520679f-8300-1578-0ca0-428ca66f10ce.gif)
# ゲームモジュール
```cpp:HogeComponent.h
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class TTLEXTENSION_API UHogeComponent : public UActorComponent
{
	GENERATED_BODY()
public:	
	UHogeComponent();
	UPROPERTY(EditAnywhere, Category = "Variable")
	float Radius;
};

```
# エディターモジュール

* コンポーネントを表示する為のコード

```cpp:HogeComponentVisualizer.h
#include "UnrealEd.h"
#include "ComponentVisualizer.h"
class FHogeComponentVisualizer
	: public FComponentVisualizer
{
public:
	virtual void DrawVisualization(const UActorComponent* Component, const FSceneView* View, FPrimitiveDrawInterface* PDI) override;

};
```

```cpp:HogeComponentVisualizer.cpp
void FHogeComponentVisualizer::DrawVisualization(const UActorComponent* Component, const FSceneView* View, FPrimitiveDrawInterface* PDI)
{
	if (const UHogeComponent* Hoge = Cast<UHogeComponent>(Component))
	{
		if (AActor* Owner = Hoge->GetOwner())
		{
			// 球体を表示
			DrawWireSphere(PDI, Owner->GetActorLocation(), FColor::Yellow, Hoge->Radius, 16, SDPG_World);
		}
	}
}
```

* コンポーネント表示を有効にする為のコード

```cpp:モジュール.cpp
virtual void FHogeModule::StartupModule() override final
{
	if (GUnrealEd)
	{
		GUnrealEd->RegisterComponentVisualizer(UHogeComponent::StaticClass()->GetFName(), MakeShareable(new FHogeComponentVisualizer));
	}
}
	
void FHogeModule::ShutdownModule()
{
	if (GUnrealEd)
	{
		GUnrealEd->UnregisterComponentVisualizer(UHogeComponent::StaticClass()->GetFName());
	}
}
```
* プロジェクトの読込タイミング
UnrealEdが読み込まれるより早く、モジュールの開始が行われると、GUnrealEdがnullptrになってしまうためコンポーネントの表示が有効になりません。
モジュールの読込タイミングのパラメータを"LoadingPhase": "PostEngineInit"にしてください

```json:プロジェクト名.uproject
	"Modules": [

		{
			"Name": "エディターモジュール",
			"Type": "Developer",
			"LoadingPhase": "PostEngineInit"
		},
		(以下省略
	]
}
```

# 実行結果
![ezgif-2708807382.gif](https://qiita-image-store.s3.amazonaws.com/0/66029/7eec9c2a-ac15-1ecd-f0d8-2c008c0cab58.gif)
Haxeでオペレータオーバーロードする

最近のプログラミング言語にはオペレータ（`+`とか`-`みたいなやつ）を上書きして独自の機能を提供することができたりします。

Haxeでも抽象型を利用することで、オペレータを上書きする機能が利用出来ます。

例えば、Dateクラスの抽象型を作って、`+`オペレータをオーバーロードすることで、
`date + n`とすればn日後の日付が取得出来るようになります。

```hx
abstract AbsDate(Date) from Date to Date {
    @:op(A + B) public inline function add(step: Int): AbsDate {
        return Date.fromTime(this.getTime() + (864000000 * step));
    }

    public inline function concretization(): Date {
        return this;
    }
}

class Main {
    static function main() {
        var date: AbsDate = new Date(2016, 1, 1, 0, 0, 0);
        trace(date);      // Mon Feb 01 2016 00:00:00 GMT+0900 (JST)
        trace(date + 1);  // Tue Feb 02 2016 00:00:00 GMT+0900 (JST)
        trace(date + 2);  // Wed Feb 03 2016 00:00:00 GMT+0900 (JST)
        trace(date + 3);  // Thu Feb 04 2016 00:00:00 GMT+0900 (JST)
    }
}
```

このような感じでオブジェクトのドメインに対して意味を持つオペレータを定義することが出来るようになります。

ちょっと残念なのは、抽象型では抽象元となるクラスのメソッドは所持していないため、
抽象元となったクラスのメソッドを呼びたい場合に、具象化してあげなければなりません。

上記のサンプルでは`concretization`というメソッドを持たせて実現していますが、
この他に、抽象元となった型を指定した変数に代入することでも元のクラスを取得することが出来ます。

```hx
var date: AbsDate = new Date(2016, 1, 1, 0, 0, 0);

// メソッドをチェーンするならこんな感じ
trace((date + 1).concretization().getTime()); // Tue Feb 02 2016 00:00:00 GMT+0900 (JST)

// 代入で型を解決するとこんな感じ
var next_date: Date = date + 1;
trace(next_date.getTime()); // Tue Feb 02 2016 00:00:00 GMT+0900 (JST)
```

# 抽象元のメソッドも呼べた

@musou1500 より`@:forward`使えばいけるとの金言頂きました。
やった！

```hx
@:forward abstract AbsDate(Date) from Date to Date {
    @:op(A + B) public inline function add(step: Int): AbsDate {
        return Date.fromTime(this.getTime() + (864000000 * step));
    }
}

class Main {
    static function main() {
        var date: AbsDate = new Date(2016, 1, 1, 0, 0, 0);
        trace((date + 1).getTime()); // 1455116400000
    }
}
```

---

オブジェクトに対してオペレーターの意味が変わるというのは、新しい言語を生み出しているような感覚でなかなか楽しいものです。
適切に活用していきたい機能ですね。
複数のGoogleカレンダーをまとめる

# 複数のGoogleカレンダーをまとめる方法

## 背景
- 複数のGoogleカレンダーを色分けして使うことで自分の予定を把握しています．
    - プライベートカレンダー，仕事カレンダー，イベントカレンダーなど
- 友人や同僚とカレンダーを共有するとき，全てのカレンダーを共有設定する必要があり，しかも一人で複数の色使っていて見づらくなってしまっていました．
- 複数のカレンダーを一つのカレンダーにまとめられれば，それを共有できて解決するのに．．．
- どうやら**GoogleAppsScript**なるものが解決してくれそう．
- ということで作ってみた．

## 方法 
- GoogleDriveで適当なスプレッドシートを作成
- ツールタブからスクリプトエディタを選択
- エディタ内で以下を実装
   - まとめる先のカレンダーの予定を削除
   - 複数のカレンダーから1つずつイベントを取得
   - わかりやすいようにカレンダー名をつけたイベントをまとめる先のカレンダーに作成

- こんな感じです．https://github.com/kdotsaito/GAS

- リソースタグからトリガーを適当に設定(僕は6時間に1回のペースに設定しています)することで定期的に更新してくれます．

## 感想
- GoogleAppsScriptの存在自体知らなかったけどとても便利そう．
- こんなこともできるよみたいなことあったらほしいです．
LaravelのHomesteadを試す


# Homestead

LaravelではHomesteadというローカル開発環境VMが用意されているので使ってみる。
Lumen(Laravel製マイクロFW)でも使えるみたいなので、とりあえず環境を構築しておく。

公式ドキュメント: [Laravel Homestead](https://laravel.com/docs/master/homestead)

# 環境

* Mac(OSX10.11)
* Vagrant
* VirtualBox

# Included Software

Homesteadに含まれるもの

* Ubuntu 14.04
* Git
* **PHP 7.0**
* HHVM
* Nginx
* MySQL
* Sqlite3
* Postgres
* Composer
* Node (With PM2, Bower, Grunt, and Gulp)
* Redis
* Memcached
* Beanstalkd

# VagrantBox

```
# vagrant box add laravel/homestead
```

実行時に、プロバイダー(virtualboxとかVMWareとか)を聞かれるので、表示される番号を入力する。

# インストール

globalインストールだと`~/`に設定ファイル作成してしまうので、プロジェクトごとにインストールする方法を採用。

```
# mkdir homestead
# cd homestead
# curl -sS https://getcomposer.org/installer | php
# php composer.phar require laravel/homestead --dev
```

設定ファイルを確認

```shell-session:Homestead.yaml
---
ip: "192.168.10.10"
memory: 2048
cpus: 1
hostname: homestead
name: homestead
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: "/Users/terada/dev/api/laravel/homestead"
      to: "/home/vagrant/homestead"

sites:
    - map: homestead.app
      to: "/home/vagrant/homestead/public"

databases:
    - homestead

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp
```

hostsを変更しておく

```shell-session:/etc/hosts
192.168.10.10    homestead.app
```

makeコマンド実行してVM起動

```
# php vendor/bin/homestead make
# vagrant up
```

# 動作確認

```
# vagrant ssh
$ cd /home/vagrant/homestead/
$ mkdir public
$ echo -e "<?php\nphpinfo();" > public/info.php
$ chmod 755 public/info.php
```

ブラウザで`http://homestead.app/info.php`が表示されればOK.
KotlinでJDBCをちょっといい感じに使える気がするライブラリを作った

少し前にKotlinのreified type parameterというものに関する記事を書きました。

[Kotlinで関数に渡された型パラメータによって処理を分岐させる方法](http://qiita.com/devneko/items/7f9dfb4f46e050a2aa40)

これを活かせばちょっと面白いJDBCラッパーが作れそうだなぁと思いつき作ってみました。

GitHub: https://github.com/dotneet/devneko-kotlin-jdbc

#主な機能
- 名前付きプレースホルダー  
  JDBCでは"?"をプレースホルダーに使いますが、わかりにくいので名前付きプレースホルダーを使います。
- StatementやResultSetに対するシンプルなパラメータ設定/取得  
  Statement#setInt()などのように型ごとに定義されたset/getメソッドを呼ぶ必要がなくなります。
- レコードのデータクラスへのマッピング  
  SELECT項目を使って自動的にインスタンスを生成してくれます。

#コード例

##準備
```kotlin
// DBテーブルに対応するデータクラス
// post(id:INTEGER, userId:INTEGER, body:VARCHAR2(255), created:DATETIME) 
data class Post(
  id:Int,
  userId:Int,
  body:String,
  created:Date
)

// ヘルパークラスを生成する。connectionはjava.sql.Connection
val helper = SqlHelper(connection)

```

##SELECT
```Kotlin
// すべて取得してクラスにマップ
val results:List<Post> = helper.query("SELECT * FROM post WHERE id = :id") {
  set("id", 1)
}.readAll()

// ひとつ取得してクラスにマップ
val post:Post = helper.query("SELECT * FROM post WHERE id = :id") {
  set("id", 1)
}.readOne()

// query()はResultSetを拡張したオブジェクトを返す。
val rs = helper.query("SELECT * FROM post WHERE id = :id") {
  set("id", 1)
}
while ( rs.next() ) {
   val id:Long = rs.get("id")
   println(id)
}
```

##INSERT
```Kotlin
helper.insert("post") {
    set("id", 1)
    set("user_id", 1)
    set("body", "body")
    set("created", java.util.Date())
}
```

##UPDATE
```Kotlin
helper.update("post") {
    set("body", "new body")
    where("id = :id") {
      set("id", 1)
    }
}
```

##DELETE
```Kotlin
helper.delete("post", "id = :id") {
  set("id", 1)
}
```
Terminal.appのビープ音を消す

##環境
```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.3
BuildVersion:	15D21
```
***
以下のファイルを作成し，Terminal.appを再起動する

```lang:~/.inputrc
set bell-style none
```
ある程度は消えてる.

環境設定 > プロファイル > 詳細 > ベル > オーディオベル のチェックを外せばビープ音を完全に消すことができる.
だが，CUIでやることにこだわりたい為，他にいい方法はないだろうか...
Swiftはじめたい...その２２ カリー化？美味しいの？


# swiftの記事見てたらカリー化ってのがありました。

+ なんですか？それは？？

## currying

> カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること（あるいはその関数のこと）である。クリストファー・ストレイチーにより論理学者ハスケル・カリーにちなんで名付けられたが、実際に考案したのはMoses Schönfinkelとゴットロープ・フレーゲである。
> ごく簡単な例として、f(a, b) = c という関数 f があるときに、F(a) = g（ここで、g は g(b) = c となる関数である）という関数 F が、f のカリー化である。
>
> [引用元:Wikipedia](https://ja.wikipedia.org/wiki/カリー化)

+ 意味わかりません...食べるカレー(curry)とスペルが一緒ということはわかりました。

+ でもf(a,b)をF(a)とg(b)に分解するってのは、その２１のとこで試しましたよ？

```swift:これのこと？
let add5 = { (x:Int) -> (Int -> Int) in
    return { (y:Int) -> Int in x + y }
}

print(add5(1)) // (Function)
print(add5(1)(2)) // 3
```

+ …で、だからなんなんでしょう？？

## どこが美味しいの？

+ できるのはわかったんですが何が美味しいのかがよくわかりません...

```swift:こんなの試してみます。
let add = { (x:Int) -> (Int -> Int) in
    return { (y:Int) -> Int in
        x + y
    }
}

var arr = [1, 2, 3, 4 ,5]
print( arr.map{add($0)}.map{$0(1)}.reduce(0, combine: {(a,b)->Int in a+b}) ) // 20
```

+ 次の処理の引数に関数が渡せるんだ〜```map{$0(1)}```のところでは思いますが、特に美味しくありません...下のと一緒ですもんね。

```swift:こっちのほうが簡単じゃね？
var arr = [1, 2, 3, 4 ,5]
let add1 = { (x:Int,y:Int) -> Int in x + y }
print( arr.map{add1($0,1)}.reduce(0, combine: {(a,b)->Int in a+b}) ) // 20
```

+ う〜〜む…

## まとめ

+ 理論的にはいろいろあるようですが、実際のプログラムでのメリットを教えて下さい…
npm run deploy で GitHub Pages にお手軽デプロイ

# [gh-pages](https://www.npmjs.com/package/gh-pages)

`npm run deploy` とコマンドラインで打つだけで GitHub Pages にデプロイするために、 [gh-pages](https://www.npmjs.com/package/gh-pages) を使う。

インストール:

```
npm install gh-pages --save-dev
```

# 使い方

package.json の scripts を以下のように書く

```
"scripts": {
    "deploy": "gh-pages -d dist"
  }
```

`dist` が GitHub Pages として公開したいディレクトリ。
ここを自分に公開したいディレクトリを指定する。
これだけで dist ディレクトリが gh-pages ブランチとして GitHub に Push される。

これで `npm run deploy` ができるようになる。

# 実例

現在開発中の [starhoshi/AlcatrazSearch](https://github.com/starhoshi/AlcatrazSearch) は `npm run deploy` でデプロイしている。
package.json は以下のように設定している。

```
  "scripts": {
    "dev-server": "node webpack/dev-server.js",
    "build": "NODE_ENV=production webpack --config webpack/webpack-production.config.js --progress --profile --colors",
    "deploy": "npm run build && gh-pages -d build/public",
    "test": "./node_modules/.bin/typings install && ./node_modules/.bin/tsc && ./node_modules/.bin/mocha  --require test-setup --recursive ./dist/**/__spec__/**/*-spec.js"
  }
```

`build` で `build/public` に `webpack` でごにょごにょしたファイルが設置され、 `gh-pages -d build/public` を行い GitHub Pages にデプロイしている。
Macで readlink -f を作る（シェルスクリプト）

こんにちは。
「[Macでもreadlink -f](http://qiita.com/edvakf@github/items/b8400f7dfe9210aadddd)」をそのまま引き写して、-f (canonicalize) 指定可能な MacOSX 用 ```readlink``` をシェルスクリプトで作ってみました。```-f``` を指定すると、ファイル（リンクファイルであればその源）のフルパスを出力します。

```readlink.sh
#!/bin/sh

# readlink -f 
__readlink_f() {
  target="$1"
  while test -n "$target"; do
    filepath="$target"
    cd $(dirname "$filepath")
    target=$(readlink "$filepath")
  done
  /bin/echo $preventNewLine $(pwd -P)/$(basename "$filepath")
}

# parsing optional arguments
while [ $# -gt 0 ]
do
  case "$1" in
    '-f' )  canonicalize="canonicalize" ;;
    '-n' )  preventNewLine="-n" ;;
    * ) break ;;
  esac
  shift
done

# main
if [ -z "$canonicalize" ]; then
  readlink "$@"
else
  for file in "$@"; do
    __readlink_f "$file"
  done
fi

exit $?

```
vvvv用のgitignoreを作る

# Gitのコミット時にいらないファイルを消すのが面倒 gitignoreを作ろう

vvvvのパッチやプラグインをgitで管理をしているが、gitignoreを作るのが面倒臭かったので、コミットをする必要が無いファイルを手動で消していた。
やっぱりコミットをする度にファイルを削除したり、コミット対象から外したりは面倒臭いので、gitignoreを作ろうと思った。
![Gitignore.png](https://qiita-image-store.s3.amazonaws.com/0/111261/552fe703-eb0c-5a96-92cd-82e393df2325.png)

## vvvv用のgitignore
今までの作業が何だったのかと思うくらい簡単に作れた。
もっと早くに対応していればよかった。。。

```bash:.gitignore
# .v4p backup files
*~.xml

# Dynamic plugins .dll
bin/
```

この.gitignoreファイルをリポジトリ直下に置けば、コミットしたくなかったファイルがコミット対象から外れる。

![Gitignore02.png](https://qiita-image-store.s3.amazonaws.com/0/111261/19aed17d-ac06-3445-e1ac-4bcdd644eb75.png)

## (補足)コミットしたくないファイルはいつ出来るのか

### ~.xml (バックアップファイル)
パッチを保存
![DotXML01.png](https://qiita-image-store.s3.amazonaws.com/0/111261/10869816-00b2-c905-265f-4523a93a32ae.png)

パッチを修正して保存したタイミングで前回の情報が~.xmlファイルとして作成される。
![DotXML02.png](https://qiita-image-store.s3.amazonaws.com/0/111261/5c560c8c-767c-c1b9-5515-4ba73a574249.png)


### bin/ (ダイナミックライブラリ)

Pluginを開発するためのTemplateをCloneする。
![PluginGitignoreFiles01.png](https://qiita-image-store.s3.amazonaws.com/0/111261/23fa3eba-04fd-7e66-cba6-bab83c8ae849.png)

Pluginフォルダが作成される。
![PluginGitignoreFiles02.png](https://qiita-image-store.s3.amazonaws.com/0/111261/409dfdc0-f4f7-4367-b183-5a4f7644710a.png)

変更して保存するたびにbin/配下に新しいファイルが作成される。
![PluginGitignoreFiles03.png](https://qiita-image-store.s3.amazonaws.com/0/111261/d8104108-2241-4bd0-f887-0cc831e7d867.png)

※gitをcloneした際にプラグインを開いて保存して、bin配下を作成した方がよさそう。
JavaScriptにおける非同期処理の取り扱い

# はじめに
この記事ではJavaScriptにおける非同期処理の取り扱いを紹介します。

# 第0世代: sync
`fs`の`readFileSync`のように一部のライブラリでは、非同期関数に加えて同期関数が用意されています。ビルドスクリプトのように高い処理性能が要求されない場面では、あえて非同期にしないというやり方も現実的な選択肢だと考えます。

**メリット**

- 自然な記述が可能

**デメリット**

- ブロックが発生する

**例**

```js
'use strict';

var fs = require('fs')

var buffer = fs.readFileSync(__filename)
var text = buffer.toString()

console.log(text)
```

# 第1世代: callback
関数の呼び出し時に引数としてコールバック関数を指定します。コールバック関数は、処理終了時やエラー発生時に呼び出されます。現在のNode.jsにおける標準的な非同期の取り扱い方法です。

**メリット**
- とってもシンプル
- 大体いつでも使える(Node.js & ブラウザ)

**デメリット**
- 非同期処理が続くとインデントが深くなる
- 複数の非同期処理を扱うには工夫が必要

**例**

```js
'use strict';

var fs = require('fs')

var buffer = fs.readFile(__filename, function (err, buffer) {
  if (err) {
    console.error(err.stack)
  }

  var text = buffer.toString()
  console.log(text)
})
```

# 第2世代: promise
`Promise`というオブジェクトを生成し、`then`や`catch`などのメソッドをつなげて記述するのが特徴です。深いインデントの解消や複数の非同期処理の並列実行が可能になる点などcallbackのデメリットを補うことができます。

**メリット**

- 深いインデントの解消
- `Promise.all`関数により複数の非同期処理の並列実行が可能

**デメリット**

- コードを書く量が増える
- Promiseを知らないと「?」となる
- ブラウザでは`Q`や`bluebird`などの外部ライブラリが必要

**例**

```js
'use strict';

var fs = require('fs')

new Promise(function (resolve, reject) {
  fs.readFile(__filename, function (err, buffer) {
    err ? reject(err) : resolve(buffer)
  })
})
  .then(function (buffer) {
    var text = buffer.toString()
    console.log(text)
  })
  .catch(function (err) {
    console.error(err.stack)
  })
```

# 第3世代: yield
ES6の`yield`キーワードと`co`というライブラリによって実現されます。syncのわかりやすさとpromise並の細やかな制御が可能な点を兼ね備えています。

**メリット**
- 自然な記述
- promise並の細やかな制御が可能

**デメリット**
- `co(function *() {})`でくくる必要がある
- 知らない方には`promise`以上に「?」となる
- 基本的にブラウザでは使用できない(`regenerator`を使うなど方法は有)

**例**

```js
'use strict';

var fs = require('fs')
var co = require('co')

co(function *() {
  var buffer = new Promise(function (resolve, reject) {
    fs.readFile(__filename, function (err, buffer) {
      err ? reject(err) : resolve(buffer)
    })
  })

  var text = buffer.toString()
  console.log(text)
})
  .catch(function (err) {
    console.error(err.stack)
  })
```

# co + Qが現状では使い勝手が良い
`Q`というライブラリの`Q.nfcall`という関数を使用して、記述量をさらに減らすことができます。

```js
'use strict';

var fs = require('fs')
var Q = require('q')
var co = require('co')

co(function *() {
  var buffer = Q.nfcall(fs.readFile, __filename)
  var text = buffer.toString()

  console.log(text)
})
  .catch(function (err) {
    console.error(err.stack)
  })
```

# おわりに
状況に合わせて適切な非同期の取り扱いを!
ES2015(ES6) + mocha + gulpで test coverage出す

いろいろ迷ったのでメモ。結局 [gulp-istanbul](https://www.npmjs.com/package/gulp-istanbul) と [isparta](https://www.npmjs.com/package/isparta)を使った

[istanbul](https://www.npmjs.com/package/istanbul)もispartaもコードカバレッジツールだが、
ispartaがes2015対応なので、instrumenterにispartaのものを使っている


## インストール
```
npm install --save-dev gulp-istanbul 
npm insatll --save-dev isparta       
```

Version

```
$node -v
  v0.12.0 
$npm list
  ...
  ..mocha@2.3.4
  ..gulp@3.9.0
  ..gulp-istanbul@0.10.3
  ..istanbul@0.4.2
  ..isparta@4.0.0
```


## gulpfileを編集
```gulpfile.js
import gulp     from 'gulp'
import mocha    from 'gulp-mocha'
import istanbul from 'gulp-istanbul'

const SOURCES    = 'src/**/*.js'
const TEST_FILES = 'test/**/*.js'

gulp.task('pre-test-coverage', () => {
  return gulp.src(SOURCES)
             .pipe(istanbul( { instrumenter: require('isparta').Instrumenter }))
             .pipe(istanbul.hookRequire());
})

gulp.task('test:coverage', ['pre-test-coverage'], () => {
  return gulp.src(TEST_FILES)
             .pipe(mocha())
             .pipe(istanbul.writeReports())
             .pipe(istanbul.enforceThresholds({ thresholds: { global: 90 } }));
})
```

## 実行
`gulp test:coverage`
analogRead()用の関数作ってみた2


[analogRead()用の関数作ってみた](http://qiita.com/ttatsf/items/c20a2f41ba2641c069a9)の続きです。
複数の可変抵抗を付けるときにはどうしたらいいか考えてみました。
前回と同じことをクラスを使ってしてみます。
#クラスを作る

```cpp
class VR
{
  static const int MODULUS_AVERAGE = 8;
  static const int MODULUS_CHANGED = 4;
  private:
    int val_hist[MODULUS_AVERAGE];
    int sum;
    byte i_average;
    int val2_hist[MODULUS_CHANGED];
    byte i_changed;
  public:
    VR();
    int getAverage(int val);
    boolean isChanged(int val);
};
```
VRクラスを作って、前回使ってた定数、変数を、全部ぶちこみました。
最後のセミコロンが重要らしいです。打ち忘れててコンパイルエラー出ました。
#コンストラクタ

```cpp

VR::VR(){
  for(int i = 0; i < MODULUS_AVERAGE; i++) val_hist[i] = 0;
  sum = 0;
  i_average = 0;
  for(int i=0;i < MODULUS_CHANGED; i++) val2_hist[i] = 0;
  i_changed = 0;
}
```

変数を0で初期化しました。

#移動平均を出力する関数

```cpp
int VR::getAverage(int val){
  sum += ( val - val_hist[i_average] );
  val_hist[i_average] = val;
  i_average = ++i_average % MODULUS_AVERAGE;
  return sum / MODULUS_AVERAGE;
}
```

この辺は前のと同じです。
#値が変ったかを判定する関数

```cpp
boolean VR::isChanged(int val){
  val2_hist[i_changed] = val;
  i_changed = ++i_changed % MODULUS_CHANGED;
  for(int j = 0; j < MODULUS_CHANGED - 1; j++){
      if( val == val2_hist[(i_changed + j) % MODULUS_CHANGED] ) return false;
  };
  return true;
}
```
#使い方
最近使えるようになった32u4,ARM用の[MIDIUSB](https://www.arduino.cc/en/Reference/MIDIUSB)を使ってみます。
まず、頭にこいつを書きます。

```cpp
#include <MIDIUSB.h>
...
```
可変抵抗を四つ、A0~A3に付けて、それぞれCC25~28を出力するとします。

```cpp
VR vr[4];
const int ANAPIN[4]={0,1,2,3};
const byte CHANNEL = 0;
const byte CC[4] ={25,26,27,28};
 
void setup() {
  Serial.begin(115200);
}

void loop() {
  int temp;
  
  for(int i=0;i < 4; i++){
    if( vr[i].isChanged( temp = vr[i].getAverage( analogRead(ANAPIN[i]) >> 3 ) ) ){
      controlChange(CHANNEL,CC[i],temp);
    };
    
  delay(10);
  };
}

//controll value or velocity
// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}
```

核心部分がこみいってますが、

+ ピンをanalogRead()して
+ 3だけ右シフト(=8で割る)して
+ 移動平均を求めて
+ tempに入れて
+ もし値が変化してたら
+ tempをCCの値としてMIDI OUTする

という目論見です。

手元にあったastar32u4単体で試してみました。
良さげな可変抵抗がなかったからですが、ふらふら出ているデータを見るとちゃんと動いている感じです。
#まとめ
普段使ってない脳みそを使って疲れました。
ちょっと関数が値を覚えておいてくれるだけでいいのに...
もっと楽なやりかたがきっとあるんだろうな...
JSCSのエラーメッセージの日本語

##validateQuoteMarks
ダブルコーテーションをシングルコーテーションに直す

##validateIndentation
インデントが足りない

##disallowlineBeforeBlockStatements
中括弧の前部分は改行してはいけない

##requireCamelCaseOrUpperCaseIdentifiers
変数の宣言形式ミス

例

```
OK: var camelCase  = 1 ;
    var camelcase_ = 1 ;
    var _camelcase = 1 ;
    var CamelCase  = 1 ;
    var CAMEL_CASE = 1 ;  
NG: var camel_case = 1 ;
    var Camel_case = 1 ;
    var camel_Case = 1 ;
```

##disallowSpacesInsideParentheses
丸括弧の中に書いたオブジェクトの前カッコの後ろと閉じカッコの前にはスペースを置いてはいけない

##disallowSpacesInsideObjectBrackets
中括弧の中に書いたオブジェクトの前カッコの後ろと閉じカッコの前にはスペースを置いてはいけない

##maximumLineLength
一行あたりの最大文字数が多い

##requireSpaceBeforeObjectValues
オブジェクトキーの後にスペースが必要

##requireSpacesInFunctionExpression
{}や()を書く前に前カッコの前にスペースが必要

##disallowSpaceAfterObjectKeys
宣言したオブジェクトキーの後ろに不要なスペースがある

##disallowMultipleVardecl
複数のvarの宣言（forループを除く）を禁止

##requireCurlyBraces
文の後に中括弧が必要です。

##parseError
宣言が不明

##requireLineFeedAtFileEnd
カレントファイルの末尾には改行を置くことが必須

##disallowKeywordsOnNewLine
新しい行に配置されることを禁止されている引用符で囲まれたキーワードを指定します
日本標準時刻を取得する

端末時刻じゃなくて現在時刻を取得したかったので書いてみました。
NICTの日本標準時プロジェクトが公開しているWebAPIを使用しました。
Newtonsoft.Jsonを使用しています。

```csharp

    public class TimeService
    {
        /// <summary>
        //  現在時刻を取得します。
        /// </summary>
        /// <returns></returns>
        public async Task<DateTime> GetNow()
        {
            try
            {
                HttpClient client = new HttpClient();
                client.Timeout = TimeSpan.FromSeconds(3);
                var result = await client.GetAsync("https://ntp-a1.nict.go.jp/cgi-bin/json");
                if (result.IsSuccessStatusCode)
                {
                    var time = JsonConvert.DeserializeObject<NitcTime>(await result.Content.ReadAsStringAsync());

                    var now =
                        new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(Convert.ToDouble(time.st))
                            .ToLocalTime();

                    return now;
                }
            }
            catch
            {                
            }
            return DateTime.Now;
        }

        public class NitcTime
        {
            public string id { get; set; }
            public decimal it { get; set; }
            public decimal st { get; set; }
            public int leap { get; set; }
            public decimal next { get; set; }
            public int step { get; set; }
        }
    }
```
pyenv & Anacondaの環境でOpencv 3.1.0を導入

anacondaにおいてOpenCV3をインストールすることが出来たので残します．
# 環境
Ubuntu 15.10
pyenv
anaconda3-2.5.0

# インストール手順
pyenvによりanaconda3-2.5.0を導入しセットする．

```
pyenv install anaconda3-2.5.0
pyenv global anaconda3-2.5.0
```

その後に，condaを使いOpenCV3を導入する．

```
conda install -c https://conda.anaconda.org/menpo opencv3
```

# 確認

```
~$ python
Python 3.5.1 |Anaconda 2.5.0 (64-bit)| (default, Dec  7 2015, 11:16:01) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.1.0'
>>> 
```

インポートがされていれば成功です．
HHKBでCaps Lockのトグル(Mac OS)

Happy Hacking Keyboardを使ってて、カッコつけてCaps Lockキー無効にしてるのに、唐突にCaps Lockになるときあるよね〜
直し方わからなくて、焦るときあるよね〜


そんなときは
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・
　　・


```
fn + ⌘ + ⌥ + ⇧ + TAB
```

でCasp Lockトグルできるんだよ！！！

めでたしめでたし。
herokuでrake db:reset や rake db:migrate:reset 出来ないので代替操作


## はじめに
Railsアプリを開発していて、開発環境のDBをリセットするのに
rake db:reset や rake db:migrate:resetを行うことがあるが、

これがサービスリリース前や、ステージグ環境のheroku環境上で実行すると
実行するとこんな権限エラーが出る

> FATAL:  permission denied for database "postgres"
> DETAIL:  User does not have CONNECT privilege.

これを解決する方法を紹介する

### 前提条件
* Ruby(動作確認はv2.2.3)
* Railsアプリ(動作確認はRails4.2.5)
* DBMSはherokuのpostgresを使用

### 実行コマンド
リセットコマンド

```
> heroku pg:reset DATABASE_URL -a YOUR_APP_NAME
```

リセットに成功したら、マイグレーションを実行することが出来る

```
heroku rake db:migrate  -a YOUR_APP_NAME
```

その後seedファイルの入力したり、seed_fuをしたりできる

```
heroku run rake db:seed -a YOUR_APP_NAME
```
AWS SDK for PHP でドットを含むバケット名だとエラーになる理由

諸般の事情により下記のとおり古いバージョンで試しています。最新版だとどうなるかはわかりません。

- PHP 5.3.3
- AWS SDK for PHP 2.8.27

AWS SDK for PHP で S3 の操作をしようとしたところ、バケット名にドットが無ければ成功するのに、ドットを含むと下記のようなエラーで失敗しました。

> The bucket you are attempting to access must be addressed using the specified endpoint.
> Please send all future requests to this endpoint: "oreore.s3.example.com.s3.amazonaws.com".

つまり、`oreore-s3` なら大丈夫で、`oreore.s3.example.com` みたいなのならダメ、ということです。

## 原因

http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html

S3 はバケット名をバーチャルホストスタイルとパススタイルのどちらかで指定できます。

- バーチャルホストスタイル
    - `https://BUCKET.s3.amazonaws.com/KEY`
- パススタイル
    - `https://s3-ap-northeast-1.amazonaws.com/BUCKET/KEY`

バーチャルホストスタイルではリージョンを意識する必要がありませんが、パススタイルだとリージョンによってエンドポイントが異なります。

バーチャルホストスタイルでは、バケット名にドットを含んでいなければ https が可能です。次のようなワイルドカード証明書があるからです。

- `*.s3.amazonaws.com`

一方、ドットを含む場合は https 不可です。次のようなワイルドカード証明書は不可能だからです。

- `**.s3.amazonaws.com`

AWS SDK で次の条件でバーチャルホストスタイルとパススタイルが使い分けられています。

- https://github.com/aws/aws-sdk-php/blob/2.8.27/src/Aws/S3/BucketStyleListener.php#L63
  - DNS のパートとして有効
  - HTTPS ではない または ドットを含まない
    - 以上の条件に合致するならバーチャルホストスタイルを使用する

バーチャルホストスタイルが使用される場合、前述の通りリージョンを意識する必要がないので、コード上でもリージョンを指定する必要はありませんが、パススタイルが使用される場合はリージョンを指定する必要があります。

パススタイルが使用されるにも関わらず（＝バケット名にドットを含む）、リージョンを指定しなかった場合は、前述のようなエラーになります。

## 解決方法

次のようにリージョンを指定します。

```php
$s3 = S3Client::factory(array(
    ClientOptions::REGION =>Region::AP_NORTHEAST_1,
));
```

もしくは、http を使います。

```php
$s3 = S3Client::factory(array(
    ClientOptions::SCHEME => 'http',
));
```
Railsで未使用の画像ファイルを洗い出して削除するRake


## はじめに
Webサービスを数年運用すると、いつの間にか全く使っていない画像ファイルが出てくる
一つ一つ本当に使っていないか調べるのは骨が折れるのでRakeタスクでまとめて使ってない画像ファイルをあぶり出して削除する

Rakeタスクはローカル環境で実施し、コミットする

今回はファイル検索のコマンドにthe silver searcherを利用している。
the silver searcherは.gitignoreをチェックして無視される対象のファイルは検索対象にしないので
gemを /vender/bundler以下にインストールしている場合など検索対象から外せて高速に処理できる


## 前提条件
Gitで管理されたRailsプロジェクトが対象
the silver searcherがインストールされていること

### homebrewでthe silver searcherをインストール

the silver searcherがインストールされていない場合、homebrewで簡単にインストールできる

```
brew install ag
```

## Railsで未使用の画像ファイルを洗い出して削除するRakeファイル

## Rakeファイル本体
```ruby
# It requires AG - https://github.com/ggreer/the_silver_searcher
task :find_unused_images do
  images = Dir.glob("app/assets/images/**/*")

  images_to_delete = []
  images.each do |image|
    unless File.directory?(image)
      puts "Checking #{image}"
      # -G でチェックする拡張子を指定　--rubyや--sassでも検索できる
      result = `ag -G "slim|erb|js|css|sass|scss|rb" #{File.basename(image)} .`

      if result.empty?
        images_to_delete << image
      end
    end
  end
  puts "Delete unused files running the command below:"

  puts images_to_delete.join(" \n").to_s

  puts "-----------------------------------"
  puts "rm #{images_to_delete.join(" ")}"
end

```

### 使い方

```
> bin/rake find_unused_images
```

### 実行結果
```
# 検索中のファイル
Checking app/assets/images/xxx1.png
Checking app/assets/images/xxx/xxx2.png
..
.
# 使われていないファイル一覧
Delete unused files running the command below:
app/assets/images/xxx1.png
app/assets/images/xxx/xxx2.png
..
.
# 使われていないファイルを一発で削除するrmコマンド
rm app/assets/images/xxx1.png　app/assets/images/xxx/xxx2.png
```

ref: ackコマンドで実施する方法(これをthe silver searcherに適用した) - https://gist.github.com/stereodenis/10846043
CakePHP3 プラグイン開発

#プラグイン開発
ただ、つまづいたところを重点的に書いているだけで、すんなりいったところはほぼ触れていませんので、他のサイトを参考にしてください。

では、開発用のプロジェクトとテスト用のプロジェクトを分けたい場合を想定して、課題を挙げて解決していきます。

長いので、最初に結末を書いておきます。
``composer.json``内に、``repositories``タグを追加し、``symink``オプションを付与します。ただし、VisualPHPUnitを使用する際には問題が発生しますが、この先の本文で回避しています。

```ruby:composer.json
{
    "name": "vendor/plugin-name",
    ...
    "repositories": [
        {
            "type": "path",
            "url": "D:/WorkSpace/Project/",
            "options" : {
                "symlink" : true
            }
        }
    ],
    ...
    "require": {
```

##Composerで取得でき、オートローダーに登録できるパッケージの開発を目指す。
Githubに挙げられている先行開発者のリポジトリを見ると、ルートにプラグインのsrcフォルダ等が並んでいます。
これにならって開発用のプロジェクトを作成した時に、さてテストはどうしよう？と立ち止り

```
テストする為には、通常通り動作するCakePHP3の環境がほしい。
しかし、プラグインの置き場所とプロジェクトのフォルダ構成が悩ましい。
さらに、オートローダーで解決するためには、Composerを使用するのが望ましい。
なら、開発用のフォルダとテスト用のフォルダは分けよう。
```

と安易に考えましたが、手間が増えることを嫌う自分は、この後ドつぼにはまりました。

##Composerで取得する為には、Packagistに登録する必要があるのか？
答えは、「いいえ」でした。
Composerはデフォルトで、Packagistに登録されているパッケージを取得してくれます。
しかし、一般公開したくないものや諸事情でPackagistを使用したくない場合もあります。
そんなとき、ローカルコンピュータ上にてパッケージを管理し、使用することができます。

管理といっても大げさな作業は何もありません。
フォルダを用意し、``composer.json``ファイル(※1)を作成、その場所をComposerに伝えるだけです。
Composerに場所を伝えるには、パッケージを引用する側のプロジェクトに``composer.json``ファイル(※2)を用意します。
そして、``composer.json``ファイル(※2)内に ``repositories``タグを追加します。

```ruby:composer.json(※2)
{
    "name": "cakephp/app",
    ...
    "repositories": [
        {
            "type": "path",
            "url": "D:/WorkSpace/Project/",
            "options" : {
                "symlink" : true
            }
        }
    ],
    ...
    "require": {
```

ここでは、``type``タグに、``path``を指定しました。``url``には、先ほど作成した(※1)が入っているフォルダを指定します。
この状態では、Composerの仕事であるバージョン解決ができませんが、最新のファイルでテストしたかった自分には十分なのであります。
また、``"symlink" : true``をオプションとして与えることで、vendorフォルダ内に取り込まれたパッケージのフォルダをジャンクション(シンボリックリンク)として、(※1)のフォルダにリンクしています。
これで、オリジナルファイルの更新ミスなどソースファイルの２重管理が原因となるミスを回避できます。
以上で、テスト用のプロジェクトと、プラグイン作成用のプロジェクトを分けることができました。

ちなみに、``typu``には他にも、``vcs``,``git``,``pear``などを指定することもできます。
``vcs``や``git``を指定すると、Packagistからバージョン管理されたパッケージを取得するときと同じように、バージョン管理ソフトのロジックを使用してバージョンを解決してくれます。
その分、開発コードとテスト環境が分離されるので、いろいろメリット・デメリットがでてきます。

***
##失敗事例
###テストの準備、そしてVisualPHPUnit、なんでそうなるの？
コマンドライン版のPHPUnitをインストールしてテストしようとしたところ、いろいろつまづきながらではありますが、先駆者の方々が書かれているような方法で解決できました。

次に、VisualPHPUnit2を使えるようにしたかった自分は、これまたテスト用のフォルダ構成とは、別に用意してあるVisualPHPUnit2のフォルダに設定を追加していきました。
そして、開始画面を表示させてみたのですが、テストケースのクラスファイルが表示されるはずのツリーには、``undefined``と表示されていました。クリックしてもフォルダが展開されません。
始めてみる光景に理由が分からず、途方にくれましたが、``undefined``となっていない部分もあり、それらの違いを一つづつ検証すること、数十分、答えは、前項で作成したジャンクションでした。

###VisualPHPUnit2では、Windowsのジャンクション機能に注意。
テストケースのフォルダを指定するとき、Windowsのジャンクション機能を使用したパスを指定すると、”undefined”という表示になり正しく機能しません。
これは、存在しないパス名を指定したときと同じ動作です。

本家PHPUnitでは、問題なく動作しましたので、ツリー表示を構築する際に、ファイル／フォルダの判断をしているはず、その際にジャンクションを想定していないのかもしれません。
Unix系のシンボリックリンクについては未確認です。
***

##ともあれ、解決策はありました。
もともとオートローダーを意識して作成されているPHPファイルですから、テストケースを実装したクラスのソースファイルをrequireすればいいだけなのです。
ということで、テストケースのフォルダをジャンクションを介さずに、直接指定することで、回避することができました。
(個人メモ)統計学のための数学勉強会#01


個人的なまとめ。2016/03/02に実施。
[connpass](http://math-for-stat.connpass.com/event/26837/)

## 概要


## イントロダクション

* 統計流行ってる
* でもp値とかよくわからない
* 統計の前の数学が欠けているからだよね
* 初頭統計学の前に数学
* だから数学を基礎からやるお

### 本勉強会のゴール

* SVMとか回帰とかベイズ統計とかがある程度理解できるといいね

### 勉強会の範囲

* 統計的手法の基礎である数学の理解
* 記述統計について理解
    * Σ記号の処理とか
    * 基本的な確率論とか
    * 極限・積分とか

### やらないこと

* 推測統計を超える範囲はやらない
* Pythonなどでの実装方法
* 大学数学の範囲
    * 線形代数(ベクトル・行列)
    * 偏微分・多重積分
    * 対数関数

### 進め方

* 輪読形式
* インフォーマル
* 1か月に1回くらいを目安
* ページ数的に10回くらい

## テキストp1-16

* 脱ゆとり世代は統計学を学んでいる
* 代表値とデータのばらつきが記述的統計学ではよく出る

### 平均とは

* 数学的には、合計 / 個数
* 外れ値の影響を受ける

### 割り算の意味

* 6/3 =2 の解釈は二つに分かれる
* 等分除
    * 6個の饅頭を3セットに分けると2個ずつ
    * **一つ当たりの量**を求める計算

* 包含除
    * 6個の饅頭を3個ずつに分けると1セットは2個
    * **一つ当たりの量**を求める計算

* 異なる単位同氏は等分除(400mlで120円)
* 同じ単位同士は包含除(60人中50人など)
* この概念は算数を学ぶこどもが持ってほしいものらしい
* 統計の時は単位の意識づけにかかわる部分

## テキストp17- ( @f_nishiharaさん)
* http://fnshr.info/

### グラフの目的
* データをわかりやすく伝える
* データの中から情報を見つけ出す

### グラフを学ぶときの注意点
* グラフがどんなデータを表すか(what)
* グラフはデータをどのように表すのか(how)

### グラフの種類
#### 棒グラフ
* 対象データ
    * 定点から積み上げていく大小のあるデータ

* どのようにして
    * 棒の長さで表現

#### 折れ線グラフ
* 時系列(等)で変化を表現するグラフ
* 単位をいじって傾きを誇張するとゆがむ

#### 円グラフ
* 比率を表現する
* 中心角の角度で表現

#### 帯グラフ
* 割合を比べるグラフ
* 円グラフとの違いは
    * 棒の長さで表現
    * 単独使用では円グラフとそこまで変わらない
    * 複数並べて比較しやすい

* 人間は角度より長さのほうが識別しやすい
    * 円グラフで微量な差は識別しづらい
    * 円グラフは統計の分野ではあまり積極的には使われない
        * 正方形のスペースいるし・・

### グラフこぼれ話

* 3Dのグラフの視点を変えて表示すると遠近法も重なって数字以上に伸びて見える
* 2軸のデータに3Dを使う理由はある

### ヒストグラム

* データ全体の分布を表すグラフ
* 平均が同じでも傾向が違うことを明らかにする
* 棒グラフは要素の量を表し、ヒストグラムはデータ全体を示す
* ヒストグラムはデータを長さだけでなく、面積で表すこともある
    * 疎な区間の複数の棒をまとめて表示したりする
    * [参考](http://jsciencer.com/unimath/toukeigaku/4439/)

* 棒グラフは要素が連続していないので、本来はそれぞれの棒を離すべき
* ヒストグラムは値が連続しているのでつなげる
jQuery MobileでTwitter認証につまづいたがAjaxを切って解決した話

# きっかけ

　RoRでjQueryMobileを使ったモバイルサイトを作っていたが、（参考ページ：http://ruby-rails.hatenadiary.com/entry/20140805/1407200400 ）Twitter認証をするときに認証時のページを読み込ませようとすると、エラーとなって読み込まれない。
試しにjQueryMobileを利用しないでみると、ちゃんと読み込まれる。なぜだ！？

# 検索

　『jQueryMobile Twitter認証』あたりのキーワードでググっても解決方法が出てこない。
　そういえばjQueryMobileを使うとリンクが特殊な動作をするような気が、という記憶の片隅に引っかかっていた情報で試しに検索してみる。『jQueryMobile リンク』でググるとビンゴ！
http://www.buildinsider.net/web/jquerymobileref/05
が引っかかった。
　詳しくはリンク先を読んでもらうのが一番だが、同一ドメインに対してリンクするときは自動的にAjax式のリンクになるとのこと。それがどうやら原因らしい。

# Ajaxを切るには
　上記ページにAjaxを切るための4つの方法が紹介されていたが、今回は同一ドメイン同一アプリ内のページ遷移のため、4番目の方法を採用。aタグに`data-ajax="false"`を設定する。
　link_toを使ってこれを設定するには、

```erb:hoge.html.erb
<%= link_to "認証", "/auth/twitter", data: {ajax: "false"} %>
```

でOK。

# できた！
　これで無事にjQueryMobileを使ったままTwitter認証ができるようになりました。
private def method

Rubyでプライベートメソッドを作る方法はいくつかありますが、Ruby 2.1から可能となった新たな方法が、今までのより便利だなと感じました。

# 一長一短な2手法
Rubyでプライベートメソッドを作るには、`Module#private`というメソッドを使います。そして、このメソッドは引数ありとなしで挙動が大きく違います。

* 引数のない場合…これから作られるメソッドをプライベートにする（C++の`private:`と同じような感じです）
* 引数のある場合…シンボルや文字列を1つ以上渡して、指定のメソッドをプライベートに切り替える。

前者で「モード切り替え」をする場合、いきおいプライベートメソッドが1箇所に固まることになります。あるパブリックメソッドからしか呼ばないようなプライベートメソッドが、呼び先と離れてしまって、コードが読みづらくなる、という事態にもなりかねません。

もう一方の場合にも、予めメソッドを定義してからそれをプライベートに切り替えるということで、同じメソッド名を2箇所に書くことになって、DRYにならない、というカッコ悪さがありました。

# Ruby 2.1で可能となった書き方

```rb
class SomeClass
  # これでOK
  private def some_private_method
    # do stuff
  end
end
```

JavaやPHPのように、メソッド定義の直前に`private`を付けることができるようになりました。
## どう解釈される？
こんな書き方をしていると、`private`はメソッドに見えないのですが、Ruby 2.1でも`private`は[`Module`のインスタンスメソッド](http://docs.ruby-lang.org/ja/2.1.0/class/Module.html#I_PRIVATE)のままです。…ということで、実は**`def`が値を返す**のです。

Ruby 2.1で採用された[Issue](https://bugs.ruby-lang.org/issues/3753)で、`def`が「宣言したメソッド名のシンボル」を返すようになりました。そして、その`def`の返り値を`private`が拾ってプライベートメソッド化する、という寸法です。

この書き方なら、どこに書いてもプライベートにできますし、メソッド名を2度書く必要もありません。そして、他言語の書き方に似ていることもあってか違和感がほぼないので、Ruby 2.1以上に限定できる環境なら積極的に使っていきたいと思いました。
munin 障害時の確認ポイント

# 概要
* munin のグラフがいつまで経っても作られない時に確認したポイント
* cronは設定されているのにいつまでたってもグラフ生成されない原因を探しハマったのでメモ
* cronで実行される `/usr/bin/munin-cron` と ステータス情報を出力してくれる `munin-node`サービスの確認がキモのはず。
* munin-node : ステータス情報を生成する。
* munin-cron : munin-node で生成された情報を集める。

## munin-nodeの設定を疑う
* /etc/munin/munin-node.conf
* munin-node のサービスは動いているのかを確認
* ログのチェック /var/log/munin-node/* 更新されてる？内容は？

```
service munin-node status
service munin-node stop
service munin-node start
```

* munin-nodeの動作している対象ノードにアクセスしてステータスが出るか？telnet ${host} 4949
 
```
telnet localhost 4949
```

* ホスト名、その他情報を確認できればmunin-nodeでのステータスの生成は出来ている。
* munin-node は動いているが別のホストから munin-cron で値を拾えないのであれば munin-node の動いているホストと tcp/4949 の疎通ができるか確認。

## munin-cronの設定ファイルを疑う
* /etc/munin/munin.conf  
* ログのチェック: /var/log/munin/* 更新されてる？内容は？
* ログのチェック: /var/log/cron エラー出てない？

### munin-cronをデバッグモードで手動実行
* どこの処理でコケているかを見る

```
sudo su - munin --shell=/bin/bash
/usr/bin/munin-cron --debug

～
not a reference at /usr/share/perl5/vendor_per/Munin/Master/Utils.pm line 866

といったようなエラーが出て止まる
```

基本的には munin-node サービスが正常に動いてさえいればOKなはずだが…

## ホスト名を疑う
* 参考: https://bugzilla.redhat.com/show_bug.cgi?id=955902
* バージョンによっては監視対象のホスト名に "_" が入っているとmunin動作が正常に行えない場合があるようです。
* 自分の場合はコレが原因でした。

```
not a reference at /usr/share/perl5/vendor_per/Munin/Master/Utils.pm line 866
```

デバッグモードで実行した際に上のエラーが出て止まり、munin-node サービスも起動しているし設定のおかしい箇所も無かったのですが、ホスト名に含まれていた "_" を除外したらうまく動いてくれました。

### 参考にしたサイト等
* https://www.ramuda.co.jp/techlabo/archives/755
* http://d.hatena.ne.jp/yk5656/20140528/1402808409
Ginの Middleware と HandlerFunc でデータの受け渡し

`gin.*Context.Set`と`gin.*Context.Get`で、同一リクエストに限ったデータの受け渡しが可能。

## ユーザー認証で使用する例
Middleware でユーザーを認証して、HandlerFunc で認証済みのユーザーを取得。

```go
package main
import 	"github.com/gin-gonic/gin"

// Midleware
func AuthRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		// Some authorization in Authorization
		user := Authorization()
		c.Set("AuthorizedUser", user)
	}
}

// HandlerFunc
func GetProfile(c *gin.Context) {
	user := c.Get("AuthorizedUser")
}


func main() {
	r := gin.Default()
	r.Use(AuthRequired())
	r.GET("/profile", GetProfile)
	r.run()
}
```
Realm for Javaでupdate操作の時に注意すべきこと

2017/06/16追記
いつの間にかこのような場合の正しい方法が公式docに記載されてました。
今後はこっちを参照してもらうほうが良いです。
https://realm.io/docs/java/latest/#iterations--snapshots

ただし、何らかの理由で、新しいバージョンが使えない人たち向けにこの情報は残しておきます。

古い情報だよ！
---


Realmを使っていて、ある条件にヒットするデータを探して、検索に使用した値をアップデートしたいことってよくあると思います。

具体的に言うとこういうコードの場合

```java
mRealm.beginTransaction();
RealmResults<Obj> results = mRealm.where(Obj.class).equalTo("status", 0).findAll();
int resultCount = results.size();

for (int count = 0; count < resultCount; ++count) {
  Obj obj = results.get(count);
  obj.setStatus(1);
}
mRealm.commitTransaction();
```

これ、行けそうに見えて、実際に実行すると、java.lang.ArrayIndexOutOfBoundsExceptionが発生してひどく悲しい気分になれます。

某所で質問したところ、最初の検索条件に使用しているパラメーターを途中で書き換えているために`RealmResults<Obj>`自体が更新され配列が減っているために起こっているとのこと。

なので正解のコードはこんな感じになるらしい。

```java
mRealm.beginTransaction();
RealmResults<Obj> results = mRealm.where(Obj.class).equalTo("status", 0).findAll();

while(results.size() > 0){
  Obj obj = results.get(0);
  obj.setStatus(1);
}
mRealm.commitTransaction();
```

iteratorを使えという話はこんなことになっているので無理ということで。
**ConcurrentModificationException when using iterators methods #640**
https://github.com/realm/realm-java/issues/640

自動更新を止めるAPI追加の方向で動いているらしい
https://github.com/realm/realm-java/commits/stk/waitforchange
Linuxデスクトップでの画像ビューアー Geeqie

# 概要

Linuxデスクトップ環境で、画像を数十枚確認したかった。

# 結論

Geeqie
というソフトを使ってみた。
[Geeqie Image Viewer](http://geeqie.sourceforge.net/)

かなりサクサクうごいてくれてよかった。

Debian なら

```
apt-get install geeqie
```

いまは使う用途がないが RAWも読めるみたい。

# 参考

* [第336回　軽量で高機能な画像ビューアー「Geeqie」を使う：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0336)

* [便利で高速な画像ビューアー Geeqie | レンズの向こう](http://www.taga-works.com/archives/1117)