OmniAICreator/Qiita-1.07M huggingface dataset:
10人の平均点と合格人数と合格率

10人（固定）の点数を入力した際の平均点と、合格人数（60点以上）と合格率

>
10人分の点数を入力してください。
0 0 0 0 0 60 60 60 60 60
点数の平均点は30.0点です。
合格者数は5人です。合格率は50.0%です。

```java:Score.java
import java.util.Scanner;
class Score{
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		System.out.println("10人分の点数を入力してください。");
		
		int i,j,k,l;

		j = 0;
		k = 0;
		l = 0;
		for(i=0;i<10;i++){
			j = scan.nextInt();
			if(j > 59){
				l = l+1;			
			}
			k = k + j;
		}

		double f,g;		
		f = (double)k/10;

		System.out.println("点数の平均点は"+ f + "点です。");

		g = (double)l/10*100;		
		System.out.println("合格者数は"+ l + "人です。合格率は" + g + "%です。");
	}
}
```

手直し

>
1人目の点数を入力してください
0
2人目の点数を入力してください
0
3人目の点数を入力してください
0
4人目の点数を入力してください
0
5人目の点数を入力してください
0
6人目の点数を入力してください
60
7人目の点数を入力してください
60
8人目の点数を入力してください
60
9人目の点数を入力してください
60
10人目の点数を入力してください
60
点数の平均点は30.0点です。
合格者数は5人です。合格率は50.0%です。

```java:Score2.java
import java.util.Scanner;
class Score2{
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int i,j=0,k=0,l=0,m=10;

		for(i=0;i<m;i++){
			System.out.println(i+1 + "人目の点数を入力してください");
			j = scan.nextInt();
			if(j >= 60){
				l++;			
			}
			k = k + j;
		}

		double f;		
		f = (double)k/m;

		System.out.println("点数の平均点は"+ f + "点です。");
		System.out.println("合格者数は"+ l + "人です。合格率は" + (double)l/m*100 + "%です。");
	}
}
```

10人目入力したかわからなくなりそうだったが、
手直し後は一人づつ入力を求めたことで、間違えへりそうだ。

合格点60点以上なのだから
`j > 59`よりも`j >= 60`のほうが正確でした。

変数のカウントアップも
`l++`だけでよいのね

出力の中でも式使えるのね。
`System.out.println("合格者数は"+ l + "人です。合格率は" + (double)l/m*100 + "%です。")`
bash: バックグランドジョブの数を制限する



    #!/bin/bash

    # ジョブ数が$1未満になるまでブロックする
    wait_until_jobn_lt () {
      local max_jobn=$1
      while [[ "$(jobs | wc -l)" -ge "$max_jobn" ]] ; do
        #       実行中のジョブ数    >=   最大ジョブ数  
        sleep 1
      done
    }

    # デモ用ジョブ (数秒sleepするだけ)
    start_dummy_job () {
      local title="job #$1"
      echo "$(date) starting $title"
      sleep $(( 1 + $RANDOM % 5 ))
      echo "$(date) finished $title"
    }

    for job_no in {1..5} ; do
      wait_until_jobn_lt $(nproc)
      #                  ^プロセッサー数
      start_dummy_job $job_no &
    done
    wait
    echo "all finished"

-------------------------

(2コアPCの場合こんな感じになる）

    Sat Feb 27 22:28:54 JST 2016 starting job #1
    Sat Feb 27 22:28:54 JST 2016 starting job #2
    Sat Feb 27 22:28:56 JST 2016 finished job #1
    Sat Feb 27 22:28:56 JST 2016 starting job #3
    Sat Feb 27 22:28:57 JST 2016 finished job #2
    Sat Feb 27 22:28:57 JST 2016 starting job #4
    Sat Feb 27 22:29:01 JST 2016 finished job #3
    Sat Feb 27 22:29:01 JST 2016 finished job #4
    Sat Feb 27 22:29:01 JST 2016 starting job #5
    Sat Feb 27 22:29:06 JST 2016 finished job #5
    all finished
Swift - 运算符重载


```Swift
//  Created by Kxx.xxQ 一生相伴 on 16/2/27.
//  Copyright © 2016年 Asahi_Kuang. All rights reserved.
//

import Foundation

// Swift - 运算符重载

/**
*   让已有的运算符(+ - * /等)也可以对自定义的类和结构进行运算，称为运算符重载。
*/


// 中置运算符函数

struct point {
    var x = 0.0
    var y = 0.0
}

func + (left: point, right: point) ->point {
    return point(x: left.x + right.x, y: left.y + right.y)
}

let pointLeft = point(x: 2.1, y: 1.9)
let pointRight = point(x: 2.0, y: 5.0)
let pointResult = pointLeft + pointRight
print(pointResult)
// 输出 point(x: 4.1, y: 6.9)


class PointClass {
    var x = 0.0
    var y = 0.0
    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }
}

func + (left: PointClass, right: PointClass) ->PointClass {
    return PointClass(x: left.x + right.x, y: left.y + right.y)
}
let one = PointClass(x: 2.1, y: 5.4)
let two = PointClass(x: 2.9, y: 4.6)
let three = one + two
print(three.x, three.y)
// 输出 5.0 10.0



// 前置和后置运算符(eg. -a; a++)

// 前置运算符
prefix func - (vector:point) ->point {
    return point(x: -vector.x, y: -vector.y)
}

let prefixNum = point(x: 20.0, y: 20.0)
let nagativeNum = -prefixNum
print(nagativeNum)
// 输出 point(x: -20.0, y: -20.0)

// 后置运算符
postfix func ++ (aPoint: point) ->point {
    return point(x: aPoint.x + 1.0, y: aPoint.y + 1.0)
}
let postfixNum = point(x: 100.0, y: 50.0)
let addedNum = postfixNum++
print(addedNum)
// 输出 point(x: 101.0, y: 51.0)


// 组合赋值运算符。 ps. 因为需要这里的参数需要在运算符函数内直接进行修改，所以需要关键字 inout
func += (inout left: point, right: point) {
    left = left + right
}

var left = point(x: 1.0, y: 2.0)
let right = point(x: 99.0, y: 98.0)
left += right
print(left)
// 输出 point(x: 100.0, y: 100.0)


// 比较运算符重载
func == (left:point, right:point) ->Bool {
    return (left.x == right.x) && (left.y == right.y)
}

let first = point(x: 2.0, y: 3.0)
let second = point(x: 2.0, y: 3.0)
print(first == second)
// 输出 true



// 自定义运算符。 ps. 只能使用/=-+*%<>&|^。~。
infix operator ^。^ {}

func ^。^ (left: point, right: point) ->point {
    return point(x: left.x + right.x, y: left.y + right.y)
}

let frontNum = point(x: 5.0, y: 2.5)
let beyondNum = point(x: 83.0, y: 85.5)
let number = frontNum ^。^ beyondNum
print(number)
// 输出 point(x: 88.0, y: 88.0)
```
Electronでシンプルな動画プレイヤーを作ってみた（機能編）


Electronでシンプルな[動画プレイヤー](https://github.com/y-takey/shokushu)を作ってみたので、その機能記事と[技術記事](http://qiita.com/takeyuichi/items/12865a36127ed3d8a7e8)を書こうと思います。本記事はその機能編です。

https://github.com/y-takey/shokushu

ローカルの動画ファイル(.mp4とか)を管理＆再生するシンプルな動画プレイヤーです。どういった動画を想定しているかは名称から察して下さい。とは言え、普通の動画にも使えます。

主な特徴とか機能は以下です。

# タグ

* もちろんタグも見られてはまずいものなので、間違ってもMacのFinderでタグ付けすることはできません。

![タグ](https://qiita-image-store.s3.amazonaws.com/0/25588/b6cda066-48bc-2a8c-adaf-54af1f22cefd.png)


# ソート＆フィルタ

* 左ペインのSORTのところで、名前、お気に入り度、登録日によるソートができます。もう一度クリックすると降順・昇順が変わります。
* 左ペインのFILTERのところで、お気に入り度と任意のタグによるフィルタをかけることができます。もう一度クリックすると解除されます。

![ソート＆フィルタ](https://qiita-image-store.s3.amazonaws.com/0/25588/022f419d-3cbe-fb27-8085-7269c19f63ad.png)


# ライブプレビュー

* 一般的な名称は分かりませんが、Youtubeなどで実装されているシークバーにマウスを乗せると再生中の動画はそのままに、ホバー位置のシーンをポップアップで表示するアレです。
* 動画を楽しみながらも周辺視野で次のいいシーンを探したいです。
* 今回作ろうと思った一番の動機がこれです。

![ライブプレビュー](https://qiita-image-store.s3.amazonaws.com/0/25588/241f2847-1f4a-220f-16f2-3795ae56c74a.png)


# ブックマーク

お気に入りのシーンを登録したり、途中でコト切れた時のためにブックマークをつけることができます。これで変なペース配分などする必要がありません。

![ブックマーク](https://qiita-image-store.s3.amazonaws.com/0/25588/9f8ffb0c-7ca9-b091-79f0-0b9143b1fcd7.png)


# キーボードフレンドリ

ショートカットキーが使える動画プレイヤーはたくさんありますが、どれも結構複雑でした。有事の際に、やれCmdだ、やれShiftだの押してられませんし、状況に応じて右手のみ・左手のみで操作したいです。(きっとショートカットをカスタマイズできるプレイヤもあるでしょうけど)

| キー | 動作 |
|:--| :-- |
| Enter | 動画の再生・停止 |
| ←,→ | スキップ(10秒単位) |
| ↑,↓ | 再生位置の前後のブックマークへジャンプ |
| B | 現在の再生位置をブックマーク |
| F | フルスクリーンモード、ESCで解除 |
| Space | ママキタモード |


# ママキタモード

俗にいうママキタボタンを実装しました。といっても実際にはボタンはなく、SPACEキーでママキタモードに切り替わります。再生中であった動画は一時停止状態になっているので、ママが去った後に同じ位置からお楽しみいただけます。

![ママキタモード](https://qiita-image-store.s3.amazonaws.com/0/25588/45d72988-a1d0-94ca-54e7-bb351512ca02.png)

（画像の貼り間違いではありません）

# データのexport & import


タグやブックマークなどのメタデータは内部ではjsonに保持しており、このJSONファイルをexport,importできます。一旦JSONをはいて、使い慣れたエディタで整理すると捗ります。

--

今後つけたい機能

視聴回数などを記録して、GithubのPublic contributions graphみたいなのを表示したいです。どれだけ、いわゆる「草を生やして」いるかを可視化したいと思っています。
Support Library 23.2でToolbarにあるデフォルトのアイコンが黒くなってしまった時の解決法

特に何もせずSupport Libraryを23.2にあげたら矢印とmoreのアイコンが黒くなってしまった…

![device-2016-02-27-213249.png](https://qiita-image-store.s3.amazonaws.com/0/106546/ed444b7c-07c0-b6f0-41d4-02f967133ac3.png)

これは，Vector Drawablesのサポートに関する記述をbuild.gradleに追加せず，
Lollipopより前のバージョンの端末で動かした場合に起こる現象のようです．

記述の仕方は[Android Developers Blogの記事](http://android-developers.blogspot.jp/2016/02/android-support-library-232.html)に載ってるのでここでは割愛します．
記事にあるように正しく記述すれば，以下のようにちゃんとアイコンが表示されます．

![device-2016-02-27-214210.png](https://qiita-image-store.s3.amazonaws.com/0/106546/1c3bee85-a33f-b65c-d20b-9448500cba3e.png)

詳しい情報は[このissue](https://code.google.com/p/android/issues/detail?id=201851)にあります．

何かおかしい点などあればコメントお願いします🙇
Softlayerの資格 Foundations of SoftLayer V1 を取得するためにやったこと


IBMのイベントでSoftlayerの試験を受験してきました。その際に準備した内容です。


## 資格試験情報

試験範囲、サンプル問題はIBMのサイトから確認できます。試験範囲にAWSが含まれるところが面白いですね。

* [試験概要](http://www-03.ibm.com/certify/tests/eduC5050-100.shtml)
* [サンプル問題](http://public.dhe.ibm.com/partnerworld/pub/certify/samC5050-100.pdf)

## Makers

基本的にこのサイトの第1部から第4部を読んで勉強しました。

* [https://www.change-makers.jp/docs](https://www.change-makers.jp/docs)


## Qiita

Qiitaには200を超えるSoftlayer関連記事が登録されていますが、その中でも特に勉強になった記事です。

* [SoftLayer 2015年振り返り](http://qiita.com/kkitase/items/8c465fab0ac66c9681c2)
* [SoftLayerを使う際に知っておくといいこと](http://qiita.com/nsas454/items/0427280701231aea33a0)

## SlideShare

SlideShareにも勉強になるスライドがたくさんありました。

* [基礎から徹底解説！SoftLayerの使い方と活用方法](http://www.slideshare.net/kkitase/softlayer-basic?related=1)
* [Japan SoftLayer Girls Group Meetup Vol.2 SoftLayer Introduction](http://www.slideshare.net/yuichitamagawa/japan-softlayer-girls-group-meetup-vol2-softlayer-introduction)
* [SoftLayer最新動向と賢い利用方法](http://www.slideshare.net/kkitase/softlayer-latest-updates-at-fukuoka-meetup)
* [SoftLayerBluemixSummit はじめてのSoftLayer「ネットワーク編」](http://www.slideshare.net/hideakitokida/softlayerbluemixsummit-softlayer)
* [SoftLayer Bluemix Summit 2015 はじめてのSoftLayer（サーバー、ストレージ編）](http://www.slideshare.net/yuichitamagawa/softlayer-bluemix-summit2015-softlayer-server-storage)


## Youtube

準備時間の関係で全部は見れず、Softlayer 101の最初の数本を見ました。Softlayerいずれも英語ですが、字幕をつけることができます。

* [SoftLayer 101](https://www.youtube.com/playlist?list=PL6j6__J0kCu_yfau-LShdnZCOhFYh-RZa)
* [SoftLayer Tutorial Twenty Five](https://www.youtube.com/channel/UC2GorQbisaxmLREYmbBfn7A)
指定したサイズのダミーファイルを作成するには（Windows編）

## 実現したいこと

Windows7で指定したサイズのダミーファイルの作成したい

## 実現方法および解決方法

PowerShellでfsutilコマンドを利用して指定したサイズのファイルを作成する

## 実行コマンド

- Windows7でWindows PowerShellを"管理者として実行"する


```
fsutil file createnew testfile 10737418240
```

## 情報源

http://www.atmarkit.co.jp/ait/articles/0209/28/news002.html

## 補足

ファイル生成ごときで、UAC（管理者として実行）を利用しないといけないため2ステップ余分にコストがかかるのであまり使いたくない。
パッケージングしたElectronアプリケーションでファイル操作時にpermission deniedになった場合の対処

Electronで[lowdb](https://github.com/typicode/lowdb)を使ってローカルのjsonファイルを読み書きしていたのですが、開発時は問題なく動いていたのにパッケージングしたアプリケーションでは`EACCESS permission denied` と実行時エラーになりました。

```js
const low = require('lowdb')
const storage = require('lowdb/file-sync')

const db = low('db.json', { storage })  // permission denied!!!
```

ルートディレクトリ見に行ってしまっているのかなと思い、`./db.json` を試してみましたがダメでした。ググるって見ると、`__dirname` を使えばいいよ！というポストを見つけたのですが、これもダメで・・・(ポストではelectronのバージョンがちょっと古かったのでそのせいかもしれません。)
ちなみに `__dirname` は`"/"` になっていて、やはりルートディレクトリをみているようでした。

メインプロセス(main.js)でのほぼお決まりの `mainWindow.loadURL(`file://${__dirname}/app/index.html`)` ではちゃんとなっているっぽいのに・・・
と書きながら思ったのですが、レンダラプロセスだからダメだった？今度調べよう。

でようやく対処法ですが

```js
const remote = require('remote');
const app = remote.require('electron').app;
// pathを使っているのは半分好みなので必須ではありません。
const path = remote.require('path');
const low = require('lowdb')
const storage = require('lowdb/file-sync')
const dbFilename = path.join(app.getAppPath(), 'db.json');
const db = low(dbFilename, { storage });
```

要は自分の場所が分からないならappに教えてもらおうということです。
Docker上で実行しているPHP7のリモートデバッグを行う

**（2016/03/04 追記） Xdebug 2.4.0が正式版になりました。動作確認済です。**

***

PHP7に暫定対応しているXdebug2.4.0RC4でリモートデバッグをやってみました。出来ないという噂も聞いていたのですが、問題なく実行できたので、メモがてら手順を書いておきたいと思います。

## 検証環境
今回はDocker（OSXにインストールしたdocker-machineにてDockerホストを作成）上のPHPで実行していますが、手順さえ取り違えなければVagrantでも問題なく実行できるかと思います。

* OSX El Capitan（ホストマシン）
* docker-machine 0.6.0 (Docker 1.9.1)
* CentOS 7.2（コンテナOS）
* Apache 2.4.6
* PHP 7.0.3
* Xdebug 2.4.0RC4
* Lumen 5.2
* PHPStorm 10.0.3

## Xdebugをインストールする
バイナリからインストールすることも出来ますが、CentOSでPHPを動かしている人はだいたいremirepoからインストールしているかと思います。2.4.0RC4もすでに公開されていますので、特別な事情がなければそのままyumからインストールすればいいと思います。

```bash
yum install --enablerepo=remi-php70 php-xdebug
```

## php.iniに設定を追記する
php.iniに対してリモートポートなどの情報を追加します。設定値は[こちらのサイト](http://www.karakaram.com/phpstorm-vagrant-remote-debug)を参考にさせて頂きました。

IPアドレスはルーターなどから割り当てられているIPアドレスを指定するのではなく、virtualboxが生成したNICに割り当てられているIPアドレスを指定します。調べる方法なのですが、`var_dump($_SERVER)`して、`HTTP_X_REAL_IP`の中身を入れればOKです。

ポートはデフォルトで9000を使っているようですが、PHP-FPMもデフォルトで9000を使っていたりする関係上、結構衝突することがあるようです。では代わりにどこを使うかというところなのですが、[Wikipediaのポート番号一覧](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7)を見てみると、49152からIANAで管理されていないプライベートなポート番号だと書かれていますので、個人的に49152-65535の帯域から適当に選んで使っています。

ただし、ホストに公開するポート番号は重複が許されていないため、コンテナ毎にポート番号を変更しておく必要が出てくるかと思います。

```txt:/etc/php.ini
[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host="$_SERVER['HTTP_X_REAL_IP']を見てセット"
xdebug.remote_port=49190
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"
xdebug.max_nesting_level=1000
xdebug.idekey="PHPSTORM"
```

## コンテナを起動する
Dockerホストに対してphp.iniで指定したポートを公開してコンテナを起動します。先ほどのポート番号であれば`-p 49190:49190`をいつもの起動コマンドに付け足せばOKです。EXPOSEは必要ありません。

Vagrantで行う場合はファイアウォールを設定していない限りはDockerのようなポート開放の操作は必要ないと思います。

## PHPStormで設定する
あとはPHPStormの設定画面でコンテナのIPアドレスとポート番号を設定すればいけるはずです。ちなみに、PHPUnitでユニットテストを行った際のコードカバレッジ算出・レポート出力なんかも見ている限りでは問題なく出来ているようです。
Rubyでは文字列でもできるだけ'(シングルクオーテーション)を使おう


Rubyに限らないのだけれど、

```Ruby:
p "#{1+1}"
=> "2"
p '#{1+1}'
=> "\#{1+1}"
```

"(ダブルクオーテーション)では式が評価されたりする。これが意図しないバグを含むかもしれないからできるだけ'(シングルクオーテーション)を使おうということ。文字列を表すのに"(ダブルクオーテーション)を使う言語と同時に使っていると、ついつい"(ダブルクオーテーション)を使ってしまうがそれはダメ。

と自分に戒める。反省。
dots.カンファレンス　チーム開発を支える技術に参加したよー 午前の部

![dots.png](https://qiita-image-store.s3.amazonaws.com/0/93976/d874dd7e-e6d1-1105-e44e-8a4bf4158c4f.png)

dots.カンファレンス、[チーム開発を支える技術](http://eventdots.jp/event/580338?utm_source=event_580338&utm_medium=social&utm_campaign=feed&utm_content=t_dots)に参加してきました！

午前の部、午後の部、と別れており

```
* 午前は技術運用部分のDevOpsに関する内容
* 午後は技術マネージメントに関する内容
```

とうまく分かれていて、両方の観点からすごく勉強させていただきました。

```
**注**
寝坊したため、午前の部はNewsPicksさんのセッションからの参加となりました・・・
```

**講演 #午前の部**

-----

11:45 株式会社ニューズピックス 松原 孝司氏

**企画+開発手法**

```
・エンジニア同士で使うpull requestにも、非エンジニアも参加出来るように
SlackのBotを利用して情報の収集とgithub issueの発行を行っている

・他にChatOps（Bot）の機能として、インスタンスの起動・終了などをできるようにしており、
属人性の排除を実施している

・エンジニアのルーチンワーク（定期的なオペレーション）は全てChatOpsを利用している

・スマホからアプリケーションのメンテナンスなども！？
```

### パネルディスカッション

```
ランサーズ株式会社 横井 聡氏（進行）
Connehito株式会社 島田 達朗氏
Kaizen Platform Inc. 石橋 利真氏
株式会社ニューズピックス 松原 孝司氏
```

```
Q.
文系・営業の方ですが、その方達がエンジニアを理解する必要性を本セッションで感じられた。
非エンジニアに理解を促すためにどのような手法を使っているか
```

```
A.
1.エンジニアから非エンジニアからの質問を集約するツールを使い
（今回はQiitaTeam）それを勉強会として展開促している。
2.エンジニア・非エンジニアのMTGを行い、技術でどのようなアプローチが可能かを
実体験（成功体験）を促している
3.あまり質問を受けすぎるのも良くない。線引きが必要です！
雑多な技術相談窓口という事になりがちなのでエンジニアメンバーが週交代で交互に行っている。
調べる力（Google検索力や調べる力）を促す
```

```
Q. 
エンジニアが利用するツールの選定について
```
```
A.
1.スタンダードはWEB上で沢山発信されているので「技術者がこれは使える！」というものを采配している
2.使うツールには結論は出ていない、変遷はありRedmine → Like → Google Drive
まだ「これ」というものはない、GDriveからまた変わるかも
3.GoogleDrive スプレッドシートは便利、GASも使え非エンジニアも使える。
共通として使う
まとめ：ツールの選定は技術者に任せるべき。管理部門選定で結果使われないことが多くなってしまう。※経験則
```
```
Q
エンジニアの採用について　どこから見つけ・技術を見ているのか
```

```
・エンジニア不足で同じパイを取り合っていて、難しい。各社の色付けが必要
・またその各社の色を定期的に発信していくことが大事
```

### 懇親会

ビール、飲食が出ましたー　うれしー＞＜

ケーキ、サンドイッチにCA MOBILEさんのロゴ入り！！

![groumet1.jpg](https://qiita-image-store.s3.amazonaws.com/0/93976/fc0b45b5-f313-f3ad-d223-eed74a5f2d87.jpeg)

![groumet2.jpg](https://qiita-image-store.s3.amazonaws.com/0/93976/a0aa76e2-2ca7-7c16-f3d1-0a42b47ad46c.jpeg)


株式会社ニューズピックス松原さんとお話しできました。

いろいろ質問をしても気さくに回答いただきました＞＜
ありがとうございますm(_ _)m

お話しを聞いていると、
DevOpsは進化を遂げており、単なるAlertの通知やPRの通知だけではないこと。。。
非エンジニアからのissue発行やpush/deployなども当たり前に行っているようです（凄い！

またSlackルームごとでBotに対して叩けるコマンドもあり、非エンジニア層でもある程度運用を担当しているようです。

また何より驚いたのが、皆さん当たり前のように 

# SQL文を叩ける！！

私が講演を聞けなかった、他社さんもそのようでした。

だって、営業の方や企画者がSQL叩いて集計して、提案するのが一番いいですもんね。集計したい項目だって、時期や年齢層、場所とか利用端末とかとか様々で統計データ取りたいその本人が実行することで、納得のいくデータが取れますよね。

## 第一部のカンファレンスに参加して

全部は聞けてはいませんが、DevOps(ChatOps)は当たり前に存在していて、それで行うことが2step いや 3step以上進んでいました orz

```
ps.あっ。。。Mac電源忘れたので明日取りに行きます。。。
今日は眠いので（遅刻したくせに・・・）明日午後の部、書きます！
```
人数と合計金額から100円単位で一人当たりの割り勘計算

人数と合計金額を入力すると100円単位での割り勘金額を出力する。

>
人数と合計金額を入力してください
7 10000
一人あたりの金額は、1428.5714285714287円です。
100円単位では、一人当たり1400円、ひとりだけ1600円です。

```java:Calc.java
import java.util.Scanner;
class Calc{
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);

		System.out.println("人数と合計金額を入力してください");
		int i,j,l,n;
		i = scan.nextInt();
		j = scan.nextInt();		

		double f,g;		
		f = (double)j/i;
		System.out.println("一人あたりの金額は、" + f + "円です。");
		l = (int)Math.round(f/100)*100;
		n = j-l*(i-1);
		System.out.println("100円単位では、一人当たり" + l + "円、ひとりだけ" + n + "円です。");
	}
}	
```

`new Scanner(System.in)`とか`scan.nextInt()`とか`Math.round`とか理解はあまいがとりあえず進もう。
RPGツクールMVで自由に漢字入力を行うテキストボックスをツクろう！ 【CSS改造編１】

> #前回までの概要

[前回](http://qiita.com/fftfantt/private/2a8348b64d66f5816350)は、１１１(gamecome)さんのサイトで公開されている「キーボード入力のプラグイン」を利用して、実際にテキストを入力したあと、CSS(スタイルシート)を改造して、よりゲームに合った見た目にしようという記事を記載しました。

今回は、既存のCSSの内容を理解し、改造するためのツールを導入するところまでやってみましょう。
<br>

> #既存のCSSを理解する

CSS(スタイルシート)は主に、ホームページの見た目を細かく指定するときに使用します。
ということは、これの指定次第でゲームに合った見た目に変えられる（かもしれない）わけです。
早速**111_InputForm.css**の中身を見てみましょう。

```css
#_111_input{
    position: absolute; /* */
	z-index:999; /* */
	font-size: 15px;
	width : 20em;
	height : 1.5em;
}
#_111_submit{
	position: absolute; /* */
	z-index:999; /* */
}
```

まず、**#_111_input**がテキストボックスで、**#_111_submit**がボタンです。
{ }で囲まれた中に、必要な設定値が書かれていますね。
テキストボックスの方から、1行1行見ていきましょう。

**position**はテキストボックスの位置の指定方法で、指定値の**absolute**は左上からの絶対位置指定です。
左上から、どのくらいのところに配置するかを決めて、ウィンドウのサイズを変えても動きません。

```css
position: absolute;
```

**z-index**は重なりの優先度で、数字が大きいほど上になり、値は**999**が指定されています。
ちなみに最大値は現行のブラウザの規格だと2147483647だそうです。

```css
z-index:999;
```

**font-size**は名前のとおりフォントサイズです。
ただ、メモ帳やワードなどで使っているフォントサイズとは単位が違います。
メモ帳等ではポイント(pt)という単位が使われていますが、CSSではピクセル(px)という単位が使われています。
(他にも相対的に変わるemやらremやらありますが)
ワードで一般的な初期値の11ptは14.67pxなので、大体ワードの初期値と同じぐらいの大きさが指定されてます。


```css
font-size: 15px;
```

**width**は幅、**height**は高さで、emという値が指定されていますが、ここでは1emは1文字分という意味です。
なので幅が**20文字分**の300pxで、高さが**1.5文字分**の22.5pxになります。

```css
    width : 20em;
    height : 1.5em;
```


ということで、テキストボックスの設定は以下のようになってます。

```css
/*テキストボックス*/
#_111_input{
    /*位置指定*/
    position: absolute;
    /*重なり優先度*/
    z-index:999;
    /*フォントサイズ*/
    font-size: 15px;
    /*幅*/
    width : 20em;
    /*高さ*/
    height : 1.5em;
}
```


ボタンについても、今までの知識で確認できますね。

```css
#_111_submit{
    /*位置指定*/
	position: absolute;
    /*重なり優先度*/
	z-index:999; 
}
```
<br>

> #改造に役立つソフトをインストールする

お好きなテキストエディタを使用していただいて構いませんが、Wiondowsのメモ帳は非推奨です。
理由は、開いたときに改行されないからです。
さすがに見づらくないですか？
<img width="703" alt="SnapCrab_NoName_2016-2-27_18-58-9_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/106542/11f8660a-376c-e3a5-a774-0dfb051491e7.png">


[サクラエディタ](http://sakura-editor.sourceforge.net/)なんか昔からよく使われてて、軽くてシンプルで見やすいです。
改行されるし見やすくないですか？
<img width="382" alt="SnapCrab_NoName_2016-2-27_19-1-19_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/106542/c7b29837-0b95-2b26-e09e-9408a2a6a765.png">


私は、[Visual Studio Code](https://www.visualstudio.com/ja-jp/products/code-vs.aspx)使ってますが、軽くて強調表示もされて色つきで見やすいです。
ただしメニューが英語です(^_^;)

結構設定してますがこのような感じです。
<img width="363" alt="SnapCrab_NoName_2016-2-27_19-3-3_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/106542/478d16a4-95da-72d7-f442-ebf3f97308cc.png">

インストールしたら、いよいよ次回は実際にテキストボックスとボタンを改造していきましょう。

[CSS改造編２へ進む](http://qiita.com/fftfantt/private/e44aa63097ad5603ab31)
実数型で変数定義したのに整数型になる。

変数を実数型で定義しても、式が整数型のみであれば、結果は整数型となってしまうので
注意。

>
12.0
12.5

```java:Variable.java
class Variable {
	public static void main(String[] args){
		int i,j;
		double f,g;

		i=10; j=15;
		f=(i+j)/2;
		g=(i+j)/2.0;
		System.out.println(f);
		System.out.println(g);
	}
}
```



`g=(i+j)/2.0`としたり、`g=(double)(i+j)/2`としたりすればよい。
RPGツクールMVで自由に漢字入力を行うテキストボックスをツクろう！ 【はじめに】

> #はじめに

TwitterでRPGツクールMVのアンケートを取らせてもらったところ、漢字を使用したいという要望は意外に多いようで、自分のアカウントの割には結構な数の回答をいただきました。

ただ、やっぱりゲーム内のウィンドウで漢字を選ぶというより、自由にキーボードなどで入力できる形式にするという需要の方が多かったので、今回はそちらの実現方法について記載します。

というか・・既にプラグインあるんです！ 

１１１(gamecome)さんが運営している、サイトで公開されています。

[RPGツクール素材メモ](http://gamecome.hateblo.jp/)のサイト内で「キーボード文字入力」のカテゴリーから、「キーボードでテキストフォームを入力」をクリック

説明を見るとウェブで使用しているテキストボックスがそのまま使える！
ということで、早速ツクールに導入してみました。
<img width="336" alt="SnapCrab_NoName_2016-2-27_22-19-51_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/106542/bf2645a0-d913-e5ee-09ad-f72333a3ceb6.png">

おお！ なんか見覚えのあるボックスとボタンがツクールの中に追加された！！
適当に文字を入力して「決定」ボタンを押すと、ちゃんと指定した変数に入ってくる。
<img width="405" alt="SnapCrab_NoName_2016-2-27_22-20-22_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/106542/77e482a8-e555-be39-6e2b-e67d3ee767ff.png">



というわけで、これを使いましょう！でいいと思うのですが、CSS(スタイルシート)で見た目も変えられるので、ツクールMVの見た目に合うようにCSSを作ってみましょうというのが今回の趣旨です。（前置き長ッ！）

[CSS改造編１へ進む](http://qiita.com/fftfantt/private/aa7e5320b6f1fe798110)
Electronでアプリケーションメニューの処理をreduxのフローで行う方法

Electronにおいてメインプロセスでアプリケーションメニューを設定し、そのメニューが選択された場合の処理をreduxのフローで制御したいなと思い、やり方を調べました。
公式ドキュメントなどは組込処理の呼び出しばかりで、やり方を見つけるのに苦労しました。

### 1. メインプロセスでメニューイベントをハンドリングし、reduxアプリケーションへ橋渡し

```js:main.js
app.on('ready', () => {
  mainWindow = new BrowserWindow({});
  menu = Menu.buildFromTemplate([{
    label: 'Awesome menu',
    submenu: [{
      label: 'my menu',
      click() {
        // 適当なイベント名を付けて送ります。引数があれば第二引数以降に渡します。
        mainWindow.webContents.send('my-menu', "hoge");
      }
    }]
  }]);
  Menu.setApplicationMenu(menu);
})
```

以下、[electron-react-boilerplate](https://github.com/chentsulin/electron-react-boilerplate)を例に説明します。

### 2. reduxアプリケーションのエントリポイント(storeを作っているところ)

```js:app/index.js
// ipcRendererをインポート
import { ipcRenderer } from 'electron';
import configureStore from './store/configureStore';

const store = configureStore();

// ipcRendererに対してイベントハンドラを登録。
ipcRenderer.on('my-menu', (event, param) => {
  // イベントをdispatchする。引数はactionで返すものと同じ形式で `type + 任意の引数` (typeは適宜const化)
  // 場合によってはactionに書いて、ここではactionを呼び出す形のほうがキレイかも
  store.dispatch({ type: 'MY_MENU', param });
});
```

### 3. reducerで処理する

```js:app/reducer/counter.js(適切な場所がなかったのでcouter.jsを間借り)
export default function counter(state = {}, action) {
  switch (action.type) {
    case 'MY_MENU':
      // メニューの処理
      console.log(`my awesome menu param:${action.param}`);
      // 必要に応じて新しいstateを作って返す
      return state;
    default:
      return state;
  }
}
```
海外でもニコニコの公式アニメが見たい

# 海外でもニコニコの公式アニメが見たい

##  海外に行った時にニコニコを見ようと思ったら海外IPのせいで公式アニメチャンネルから弾かれたので日本にあるサーバからプロキシを通して視聴した話.

[polipo](http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/)を各自お使いのOSにインストールして,コンフィグファイルを弄ればできる.
僕はarch linuxを使っているので,`sudo pacman -S polipo`で一発だった.
コンフィグファイルは/etc/polipoにconfig.sampleがあるので同じディレクトリにconfigという名前でコピーして以下のようにいじった.

```
 proxyAddress = "0.0.0.0"    # IPv4 only

# If you do that, you'll want to restrict the set of hosts allowed to
# connect:

allowedClients = 127.0.0.1, 134.157.168.0 
# allowedClients = 127.0.0.1, 134.157.168.0/24

# Uncomment this if you want your Polipo to identify itself by
# something else than the host name:

 proxyName = "your domain"<

# Uncomment this if there's only one user using this instance of Polipo:

 cacheIsShared = false
```


終わったら`sudo systemctl start polipo`をやった.
サーバ側はこれで出来た.僕はiptablesなどのファイアウォールを使用してないので,使用している人は各自適切に設定してください.

ブラウザやOSの方でプロキシの設定をIPアドレスor自分のドメイン:8123にすればニコニコでアニメが見られる.
Hello World!

初めてのプログラミング。java。

>
Hello world!

```java:Hello.java
class Hello {
	public static void main(String[] args){
		System.out.println("Hello world!");
	}
}
```

`public static void main(String[] args)`は、まだ呪文。
今ここで時間をかける意味ものなさそうなので先に進みましょう。
Linux上にCIFS共有を公開してWindowsから参照するまでの手順

Linux上にCIFS共有を公開し、LAN内のWindows機器から参照(マウント)するまでの手順。
※セキュリティ設定等は別途必要

# 実施環境
項目|値
---|---
OS|Ubuntu 16.04
sambaバージョン|4.3.11+dfsg-0ubuntu0.16.04.13

# インストール
sambaパッケージをインストールする。

```console
$ sudo aptitude install samba
```

## sambaの状態確認
```console
$ sudo systemctl status samba-ad-dc
● samba-ad-dc.service - LSB: start Samba daemons for the AD DC
   Loaded: loaded (/etc/init.d/samba-ad-dc)
   Active: active (exited)
```

※`samba-ad-dc`は`samba`とは別のサービスであることに注意。

# samba設定
## 設定ファイル
`/etc/samba/smb.conf`に以下を追記する

```text:smb.conf設定
[homes]
        comment = Home directory
        path = /home/hoge/
        browseable = yes
        public = yes
        read only = no
        writable = yes
```

## sambaユーザ追加
```console
$ sudo pdbedit --create <user-name>
new password:
retype new password:
<成功すると色々情報が出力される>
```

## sambaグループ作成
```console
$ sudo groupadd smbgroup
$
```

## sambaグループにユーザ追加
```console
$ sudo gpasswd --add <user-name> smbgroup
ユーザ <user-name> をグループ smbgroup に追加
$
```

## 所有者設定
公開するディレクトリの所有者をsambaユーザ・グループにする。

```console
$ sudo chown -R <user-name>.smbgroup /home/hoge/
```

## samba再起動
```console
$ sudo systemctl restart samba-ad-dc
```

# WindowsからCIFS共有に接続
Windowsのコンソールから、Linux上のCIFS共有に接続する例。

```
>net use k: \\192.168.xxx.xxx\homes /user:<user-name>
'<user-name>' のパスワードを入力してください。'192.168.xxx.xxx' に接続します:
コマンドは正常に終了しました。
```
久しぶりにGoogleChartToolsを動かしてみた


# はじめに
かなり久しぶりに使ってみましたがまだ動いているようです。使うときがあるかもしれないので忘れないためにメモ的に残しておこうと思いました。こうゆうのは動的に使えないと意味がないだろうということで数値を動かすとそれに合わせてグラフも変化するようにしました。けっこう便利なツールだと思いますがあまり使われていないように感じますね。

# 見た目
![gct.png](https://qiita-image-store.s3.amazonaws.com/0/112959/63fae01a-15e7-a510-b571-c7283c18213a.png)


# コード

```gct.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Google Chart Tools サンプル</title>
<script src="https://www.google.com/jsapi"></script>
<script>
google.load('visualization', '1', {packages:['corechart']});
google.setOnLoadCallback(drawChart);
function drawChart() {
  var score1 = document.getElementById("score1").value;
  var score2 = document.getElementById("score2").value;
  var score3 = document.getElementById("score3").value;
  var ary = [
    ["Aさん", parseInt(score1)],
    ["Bさん", parseInt(score2)],
    ["Cさん", parseInt(score3)],
  ];
  var data = new google.visualization.DataTable();
  // タイトル行
  data.addColumn('string', 'プレーヤー');
  data.addColumn('number', '点数');
  // データ
  data.addRows(ary);
  var chart = new google.visualization.PieChart(document.getElementById('graph1'));
  chart.draw(data);
}
</script>
</head>
<body>
<h1>円グラフの作成</h1>
Aさん:<input id="score1" type="number" value=0>
Bさん:<input id="score2" type="number" value=0>
Cさん:<input id="score3" type="number" value=0>
<input type="button" onclick="drawChart();" value="データ更新">
<div id="graph1" style="width:400px"></div>
</body>
</html>

```
JQuery いつでも.onメソッド

#.onメソッドについて
最近自分の中だけで流行ってる**.onメソッド**について簡単なまとめ

##.onメソッドとは
まずは書き方

```js:js
$(function(){
	$('button').click(function(){
		//何らかの処理
	});
});
```
これを　![やじるしー](https://qiita-image-store.s3.amazonaws.com/0/106705/0b325975-1f46-348a-3190-b88eb348866e.png)

```js:js
$(function(){
	$('body').on('click','button',function(){
		//何らかの処理
	});
});
```
こんなふうにかける

##何がいいのか
いろいろあるけど
**動的に作られた要素に対して、イベントを割り当てることができる** ←これ

```js:js
$(function(){
	$('button').click(function(){ //ボタンをクリックしたら
		var p = $('<p>').text('テキスト').addClass('js-text'); //変数pに代入
		$(this).after(p); //クリックしたボタンの後に<p class="js-text">テキスト</p>
	});

	$('document').on('click','.js-text',function(){
		$('.js-text').css("color","red");
	});

});

```
この場合、.onメソッドを使って書かないとボタンをクリックして出てくるテキストの色をかえることができない
###簡単な解説
####普通に.clickで書いた場合

- （.readyをつかってるのでDOMが全て読まれたあとに処理が実行される）
- このjsが読まれた時点では追加されるtextは存在してない → 追加のテキストが認識されない

てかんじでテキストの色をかえるjsが効かない

####そこを.onでかいてやると
イベントが親セレクター（親要素）によって管理されるので、
配下の子要素が増減しても、そのイベントを監視できる
（この場合、$('document') 以下を監視）

##いつ使うのか
いつでも使うことをお勧めします。
なにも考えずいつでもどこでも.onしましょう
htmlかdocument、bodyに対して使っとけば間違いない


###**ただし、**
**SPサイトに関してはこの限りではありません。**
iphone、iosの問題によるもので
bodyとかdocumentに対してこれが使えない
イベントが設定できない、というかバブリングが伝番されないのが理由らしい

ということで、上記以外の親セレクターに対して設定すればOKなんだけど
どこにしよう…ってなるので（考えるのめんどくさい）
SPサイトは必要なときだけ使えばいいと思う。
PiZero > File Messenger (doc v0.2) > Auto File Copy

This article is for my entry to Pi Zero contest 2016.
https://hackaday.io/project/9526-bring-your-own-pizero-byop

## File Messenger

Auto File Copy

### Related
[directory and data file format](http://qiita.com/7of9/items/5ed170cd98335357b434)

### Steps to use

When the program is running,

- Prepare the USB flash having `name.txt` and `send.txt`
- Connect the USB flash to the PiZero
  - File Messenger will overwrite the `name.txt` in the PiZero
  - File Messenger will overwrite the `send.txt` in the PiZero
  - File Messenger will overwrite the `rcvd.txt` in the USB Flash

No need for HDMI monitor, nor to ssh to the PiZero in order to change files in the PiZero.

### Copy source and destination

| file | source | destination |
|:-:|:-:|:-:|
| name.txt  | USB flash  | PiZero  |
| send.txt  | USB flash  | PiZero  |
| rcvd.txt  | PiZero  | USB flash  |

### Volume name of USB flash: BYOP

Use `BYOP` for the volume name of the USB flash.

(or modify the code accordingly)

### Trigger of the copy

The `os.path.isdir(usbpath)` is checked every 0.5 second.
Likewise the button push check to avoid chattering, the isdir is checked in sequence three times.

The combination of (False, False, True) for the isidr() is the trigger to copy files.
PHPUnitでprotectedなメンバー変数、メソッドをテストする


PHPunitでテストを書いているとprotectedなメンバー変数、メソッドをどうやってテストしようか悩むときがあるでその方法を覚書。

## まずは手段
1. まっとうにやるならReflectionを使う
2. クラスを継承してprotectedにアクセスできるようにする
3. そもそもprotectedは使わないで実装する

１は正攻法、これができれば一番いいかもしれない。
でもうちの会社ではテストが分かりづらくなるから使わない方針になってしまっている。

３はないな、うん、ない。

ということで２の方法でやるとこにする。

## クラスを継承してprotectedにアクセスできるようにする
この方法もGoogle先生に聞くといろいろ出てくる。
そこで一番簡単な方法が以下である。

```php:php
class Hogehoge extends Hoge {
    // メンバー変数にセット
    public function __set($name, $value) {
        return $this->$name = $value;
    }
    // メンバー変数取得
    public function __get($name) {
        return $this->$name;
    }
    // メソッドの呼び出し
    public function __call($name, $args) {
        return call_user_func_array( array($this, $name), $args);
    }
}
```
Hogeクラスにprotectedなメンバー変数とメソッドがある想定ですが、
それを継承して上記をコピペすればpublicな感覚でアクセスすることができるようになります。

あとはHogehogeクラスでテストを書いていけばよいわけです。

久々にPHPのマジックメソッドいいね！と思えました。

ただ、これはprotectedに関してだけ使える方法なのでprivateは別の方法でアクセスできるようにする必要がある。
CLOB型の列 を 1行だけ取得する リテラルSQL を 引数にして、その CLOB型のデータを 2000文字ずつ分解して 複数レコードとして返却する Table Function を作成

うーん、タイトルからしてダーティな作りやね 彡(-)(-)

CLOB型の列 を 1行だけ取得する リテラルSQL を 引数にして、
その CLOB型のデータを 2000文字ずつ分解して 複数レコードとして
返却する Table Function を 作成します。

```sql:
-- Package定義
CREATE OR REPLACE PACKAGE clob_2_mrow_vc2
IS
  -- Table Function が 返す型定義
  TYPE tp_mr_vc2 IS TABLE OF VARCHAR2(4000);
  -- Table Function の 定義
  FUNCTION sql_2_mr_vc2(
      in_v_sql IN VARCHAR2
  )
  RETURN tp_mr_vc2 PIPELINED;
END clob_2_mrow_vc2;
/

-- Package本体の定義
CREATE OR REPLACE PACKAGE BODY clob_2_mrow_vc2
IS
  -- Table Function本体
  FUNCTION sql_2_mr_vc2(
      in_v_sql IN VARCHAR2
  )
  RETURN tp_mr_vc2 PIPELINED
  IS
    -- 変数定義
    rec        VARCHAR2(4000); -- Table Function が 返す行
    c_clob     CLOB;           -- CLOBデータ
    i_length   INTEGER;        -- CLOBデータのバイト数
    i_offset   INTEGER;        -- CLOBデータ操作時のoffset
  BEGIN
    --動的SQLを実行してCLOBを取得
    EXECUTE IMMEDIATE in_v_sql INTO c_clob;
    -- 初期化
    i_length := DBMS_LOB.GETLENGTH(c_clob);
    i_offset := 1;
    --CLOBデータ を 2000文字ずつ 切り出して レコードとして返却
    LOOP
      rec := DBMS_LOB.SUBSTR(c_clob, 2000, i_offset);
      PIPE ROW(rec);
      i_offset := i_offset + 2000;
      EXIT WHEN i_offset > i_length;
    END LOOP;
    RETURN;
  END sql_2_mr_vc2;
END clob_2_mrow_vc2;
/
```

実行結果は以下の通り。想定通り動いたけど、結局使い道無いやな…彡(-)(-)

```sql:
SQL> SET LINESIZE 300
SQL> SET PAGESIZE 1000
SQL> SELECT LENGTH(COLUMN_VALUE) FROM TABLE(
  2    clob_2_mrow_vc2.sql_2_mr_vc2(
  3      'SELECT SQL_TEXT FROM DBA_HIST_SQLTEXT WHERE DBID = 2461204241 AND SQL_ID = ''grtrhkkshy2wh'''
  4    )
  5  );

LENGTH(COLUMN_VALUE)
--------------------
                2000
                2000
                2000
                2000
                  ：
                2000
                2000
                2000
                 498

57 rows selected.

SQL>
```
FishのDesign Documentを読んでみた

前回、[初心者が Shell を知り Fish と Fisher を導入するまで](https://qiita.com/nutsinshell/items/5f111184b50f7081c92f) にて、Shell について学び、プラグインマネージャを入れてみるまでの流れを、ざっくりではありますが書いてみました。

今回は初心者ながらにいろいろチャレンジしてみたいと思います。

## ところで Fish、やっぱり良い

前回、Fish の魅力として**補完機能の高性能さ**を挙げましたが、実際使ってみるとすごくイイ！
具体的に、こんな感じです。

このまっさらなコマンド
![](https://qiita-image-store.s3.amazonaws.com/0/86088/1fcf68c1-14bb-bb52-ea6f-7a4e7499e7a5.png)

`f`と一文字打つと
![](https://qiita-image-store.s3.amazonaws.com/0/86088/f52d029a-a4a1-c38a-fcaa-9c4b1b47f655.png)
前回の履歴を出してくれる。

これで OK なら ▸ キーを押せば
![](https://qiita-image-store.s3.amazonaws.com/0/86088/4ede0285-38ae-53e0-6e94-713b5732d399.png)
ほらよっつって！

この例のように `search` 等で末尾だけ変えたい時は、普通に書き換えればよし。

これ、実際使ってみると想像してたよりずっと便利です。`gcc -o filename filename.c`とか何回も打って泣きそうになることありませんでしたか。

**もうあんな思いはしない。**

ちなみに ▸ キーではなく <kbd>Tab</kbd> キーを押すと
![](https://qiita-image-store.s3.amazonaws.com/0/86088/f2780875-5c56-3cbe-638d-a365ec17b055.png)

その文字で始まるものを提案してくれます。

## Fish の設計図を読んでみた

ご存知のとおり、Fish は非常にユーザーフレンドリーです。

どんな風に作ってあるのかな。Fish の [Design Document](http://fishshell.com/docs/current/design.html)を見てみました。本当に重要視して設計されているようです。

意訳してみました。ざっとですのでご了承ください。
難しい文章だったので、要点をわかりやすく伝えるために口語調にしました。:speech_balloon:

### Fish の設計書

#### Overview

Fish は設計において、３つのハイレベルなゴールを掲げている。

1. 他のシェル言語で出来る全てのことは、Fish でも可能であるべきだ。
2. Fish はユーザーフレンドリー、かつ、そのことと機能性を引き換えにしたりしない。その問題は、慎重に設計することで回避できる。
3. Fish は可能な限りこのゴールを壊さず、POSIX の構文をフォローする。<br>（[Posix](https://ja.wikipedia.org/wiki/POSIX)とは UNIX のツールで、プログラムの設計ツール。Bash 等はこれを 100％フォローしている。）

このゴールのための独自の信念は、以下の通り。

#### ❶ The Law of Orthogonality

Shell 言語において、いろいろな特徴はミニマムの方がいい。

（例えば JS とか他の言語みたいに、）沢山バリエーションを作ってもいいけど、複雑になってしまう。

だから用途がかぶるものは１つに絞って、できるだけ少なくしよう。
汎用性の高いものを最小限に抑えて使うことで、シンプルで迷わない設計ができる！
ソースコードが膨らむと、プログラムのメンテナンスが大変になるしね。

#### ❷ The Law of Responsiveness

Fish はいつでもレスポンシブル。

Shell はいつでもユーザーにとってレスポンシブであり続けるべきだ。
何かに対処している時も、ファイルシステムが反応しない場合にも、インターフェイスは通常通り動き、ユーザーの作業を遮らない。
例えば、何かのアップデート中でも、画面をブロックしたりしないよ。
悪いパフォーマンスは、ユーザーにフラストレーションを与え、スピードも落としてしまう。

#### ❸ Configurability is the Root of All Evil

設定は災いのもと

プログラムにおいて設定オプションは、ユーザーが本当に欲しいものをわかってない。
プログラムもプログラマーも、失敗しがちだし、メンテナンスも悪夢だ。
だからもっともノーマルでベストな設定を最初から使えるように用意しておくぜ。

#### ❹ The Law of User Focus

首尾一貫

プログラムのデザインにおいて一番に考えるべき事は、どのように直感的でパワフルにするか。
だからどんなシチュエーションでも、ユーザーから見えるインターフェイスは可能な限り、統一したほうがいいよね。
難易度が増してきたり、プロセスが重なることで表現が変わってくるようなことは良くない。
プロセスを効率的に簡略化し、すべての言語を統一することでそれを解決するよ。

#### ❺ The Law of Discoverability

見つけやすさ

なにか探すときには、見つけやすい、予測しやすいほうがいい。できるだけ直感的で、予想通りで、簡単なインターフェイスや言葉を使おう。
特に新しいユーザーがよく使うメニューは、すぐわかるように設計する。全てのコマンドは tab-completable。
エラーは赤く表示するし、エラーメッセージもわかりやすい言葉で伝える。

あとドキュメンテーションも、文章だけじゃなくサンプルをつけてわかりやすくしておくね。

以上です。

かなり根本的なところから、ユーザーフレンドリーを貫いていますね。新しいユーザーへも配慮したりしてくれていますし、どうりで初心者にも使いやすいわけです。

## 感想

Fish、今後使っていくうちにいろんな気づきがありそうで楽しみです。

プラグインは活用はともかく、導入は比較的スムーズにできました入れてみると、使いこなしたい！と思うようになりますね。:muscle:

色々試してみたいなぁと考えているのでオススメのプラグインや、初心者でも活用できる方法などあったら是非教えて頂けたら嬉しいです。
また、記事についてもなにかご指摘などあればコメント頂けたらと思います。
Android の定期購入アイテムを値上げする方法について調査した件（Google Play 課金）

# 「定期購入アイテム」の値上げ方法について

[DroidKaigi 2016](https://droidkaigi.github.io/2016/) のスポンサーブースに Google Developers の方々がいらしていたので、Android アプリ内の定期購入アイテムの値上げ方法について質問してみました。
結果「詳しくは Google のヘルプセンターに問い合わせてみて下さい」という回答をいただいたので、後日ヘルプセンターにメールを送ってみました。

> 定期購入アイテムに関して質問があります。 

> [定期購入や定期的な請求の追加 - Play Console ヘルプ](https://support.google.com/googleplay/android-developer/answer/140504?hl=ja) にて

> > 設定した定期購入料金は変更できません。また、定期購入を非公開にすることはできません。

> と明記されていますが、定期購入アイテムの値上げを行いたい場合は、「[Google Play Console](https://play.google.com/apps/publish/) の [アプリ内アイテム] から [新しいアイテムを追加] した後、アプリ側で新規に追加した値上げ後の定期購入アイテムしか購読できないようにする」という方法しかないのでしょうか？

> またアプリ側で 500 円に値上げした定期購入アイテムしか購読できないよう制限したとしても、既に 300 円の定期購入アイテムを購読しているユーザーは 300 円のままサービスを受け続けることができるのでしょうか？


:email: メール送信から約３時間後に返信が届きました。


> この度は Google Play デベロッパー サポートにお問い合わせいただきありがとうございます。
お送りいただきました定期購入アイテムに関するご質問に回答いたします。

> 定期購入アイテムの値上げを行われる場合には、ご理解の通り、新価格で新しく定期購入アイテムを作成いただきそちらのみがアプリ内で購入可能といった形でご対応いただく必要があると存じます。
また、300 円の定期購入アイテムを既に購入済みのユーザー様につきましても、基本的にご理解の通り、定期購読を解約しない限り 300 円が毎月請求されます (=サービスを受け続ける権利を有する)。

> もし新しい定期購入アイテムやプランにユーザー様を移行させることをお考えの場合には、ご確認いただいているヘルプ記事でご紹介している、アップグレードの機能のご利用もご検討ください。

> 定期購入や定期的な請求の追加
定期購入のポリシー：現行の定期購入プランをアップグレードまたはダウングレードする
https://support.google.com/googleplay/android-developer/answer/140504?hl=ja

> In-app Subscriptions:
Subscription Upgrade/Downgrade
http://developer.android.com/intl/ja/google/play/billing/billing_subscriptions.html#upgrade


> 具体的にどのような実装にされるかは各アプリの開発者の方々が検討の上で決定される内容であると存じますが、以下の様な方法でご利用いただいているデベロッパー様もいらっしゃると認識しております。

> - 新しい価格の定期購入アイテムを作成し、アプリ内で新しい価格とサービス内容について告知する。
- アプリ内からは新しい価格の定期購入アイテムのみを購入可能に変更する。
- ユーザーに新しい価格のアイテムにアップグレードするように促す。
- 一定期間が経過後に、旧価格の定期購入アイテムを継続利用しているユーザーについては以下の API を利用して強制的に定期購読を解約する。

> Subscriptions and In-App Purchases API
http://developer.android.com/intl/ja/google/play/developer-api.html#subscriptions_api_overview

> 以上のことを既存のユーザー様に対して周知徹底の上で実施されることも一案かと存じます。


> なお、アプリの実装における具体的な API の利用方法や技術的なご質問につきましては、こちらの窓口ではサポートのご提供ができかねます点をご了承ください。
技術的なご質問につきましては、以下の様なオンラインのコミュニティなどをご利用いただくようにお願いしております。
http://ja.stackoverflow.com/


> 何卒宜しくお願いいたします。

> Google Play Developer Support
Did you know we offer chat support in English? Chat with us from Monday through Friday, 6 am to 5 pm PT by going to 
https://support.google.com/googleplay/android-developer/?hl=en#contact=1

定期購入の「値上げ/値下げ」は「アップグレード/ダウングレード」で対応できるということでした。

# 「定期購入」が実装されている Android アプリ

- [Eight - 100万人が使う名刺アプリ](https://play.google.com/store/apps/details?id=net.eightcard)
- [RCC広島カープ for Android](https://play.google.com/store/apps/details?id=jp.ne.rcc.carpsp.rcccarpsp)
- [AbemaTV-無料インターネットテレビ局](https://play.google.com/store/apps/details?id=tv.abema)
  - 30 日間の試用期間あり
- [クックパッド - 無料レシピ検索で料理・献立作りを楽しく！](https://play.google.com/store/apps/details?id=com.cookpad.android.activities)
  - 30 日間の試用期間あり
- [GANMA! - オリジナル漫画が全話無料で読み放題](https://play.google.com/store/apps/details?id=com.COMICSMART.GANMA)
  - 7 日間の試用期間あり

# 関連項目

- http://qiita.com/84d010m08/items/ed116296bfd21f26e0ee
- http://qiita.com/84d010m08/items/a28bb8be44ba15b83ded
matplotlibで1枚の画像中に複数のグラフを表示する2通りのやり方

# デモ
|方法①|方法②|
|:--:|:--:|
|![demo.png](https://qiita-image-store.s3.amazonaws.com/0/40987/43c5dc49-7547-69a4-5eaa-bb101aabbbcf.png)|![demo2.png](https://qiita-image-store.s3.amazonaws.com/0/40987/0ede8d50-410c-2e91-70fa-b660bab34b91.png)|


# 方法① インタラクティブな方法
1つのグラフを表示するときと同様に`matplotlib.pyplot`モジュールを使ってグラフを描画する。

```py:demo.py
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0., 10., 0.1)
s = np.sin(x)
c = np.cos(x)

plt.subplot(211)
plt.plot(x, s)
plt.ylim(-3, 3)

plt.subplot(212)
plt.plot(x, c)
plt.ylim(-3, 3)

plt.show()
```

# 方法② オブジェクト指向な方法
`Axes`オブジェクト（`ax1`, `ax2`）を生成し、`Axes`オブジェクトを使ってグラフを描画する。

```py:demo2.py
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0., 10., 0.1)
s = np.sin(x)
c = np.cos(x)

fig = plt.figure()

ax1 = fig.add_subplot(211)
ax1.plot(x, s)
ax1.set_ylim(-3, 3)

ax2 = fig.add_subplot(212)
ax2.plot(x, c)
ax2.set_ylim(-3, 3)

plt.show()
```

# 両者の相違点
前者は記述量がやや少なく手軽な方法だが、自分が今どのグラフの作業をしているかが明示的でない。一方、後者はグラフごとに`Axes`オブジェクトが割り当てられるため、どのグラフを操作しているかが明示的である。

最近のmatplotlib関連の書籍では後者のオブジェクト指向な方法がよく採用されている（[『Pythonによるデータ分析入門――NumPy、pandasを使ったデータ処理』](http://www.oreilly.co.jp/books/9784873116556/)など）。

# 参考
Pyplot tutorial — Matplotlib 1.5.1 documentation
http://matplotlib.org/users/pyplot_tutorial.html

matplotlib入門 - りんごがでている
http://bicycle1885.hatenablog.com/entry/2014/02/14/023734
BigQueryをSpark処理の入力ファイルにする

# 前置き
Sparkの入力ファイルはしてはHDFSを始めAmazon S3やGoogle Cloud Storage（GCS）を利用する手段もありますが今回はGoogle BigQueryをデータソースする方法を解説します。
# サンプル
まずはサンプルを見てもらうとわかりやすいかと思います。

```scala
val bbq = new BeBigQuery("project-id" , "servic-account", new File("path/file.p12"))
bbq.query("select * from dataset.table where condition=11")
    .exportToGcs("tempDataset", "tempTable", "gcsBucket", "gcsPath/*");
val textFile = sc.textFile("gs://gcsBucket/gcsPath/")
```
BeBigQueryというライブラリを使ってクエリの結果をGCSにエクスポートしてからそれをsc.textFileで読み込むというやり方です。
BeBigQueryのコンストラクタ引数はGoogleの認証に必要な情報です。
exportToGcsメソッドの引数は以下の通りで、クエリの結果を直接はGCSにエクスポートできないため先にテーブルにエクスポートする必要があるためそれらの情報になリます。
1. tempDataset : クエリ結果をエクスポートするBigQueryのDataset名
2. tempTable : 上記のテーブル名
3. gcsBucket : エクスポートするGCSのBucket名
4. gcsPath : 上記のパス

# ライブラリのセットアップ
SBTの場合

```
libraryDependencies += "com.github.kamiru78" % "be-bigquery" % "0.5.0"
```
SBT以外の場合、最新バージョの確認は以下から。
http://mvnrepository.com/artifact/com.github.kamiru78/be-bigquery

# gs://を使うには
GCEやDataprocのGoogleのプラットフォームの場合はそのまま使えると思いますがそれ以外の場合は
http://x1.inkenkun.com/archives/806
か
https://cloud.google.com/hadoop/google-cloud-storage-connector
が参考になると思います。

#本家のやり方
Google Dataproc限定っぽいですが以下の方法でできるようです。ただ結構コード量が多いですね。
https://cloud.google.com/hadoop/examples/bigquery-connector-spark-example

# 最後に
今回紹介したBeBigQueryは私が作成したライブラリです。
よかったらGitHubでスターをお願いします。
https://github.com/kamiru78/be-bigquery
Canvasでデカ目・小顔・美白

### デカ目・小顔・美白 画像加工ツール [こちら](http://pie.karou.jp/m.html)
### モナリザでの実行結果
![a.png](https://qiita-image-store.s3.amazonaws.com/0/54926/82c2bb54-98a2-4eeb-6a7c-a95c07d1c735.png)
### 処理の流れ
-------
1. Clipboard API、File APIで画像を入力
2. 顔認識ライブラリ(js-objectdetect)で顔や目の位置情報を取得
3. WebGL Filterライブラリ(glfx.js)で画像の一部を拡大縮小
4. ガンマ補正で全体を明るく調整
MacBookにバージョン違いのnodeをインストールする


# TL;DR

- 目的
開発時にnode.jsのバージョンを柔軟に利用したい


- 環境
Mac OS X EL Capitan バージョン10.11.3

- この資料の範囲
nvmの利用まで

# 方法

nvm(node version manager)を使います。

# 手順

- gitHubからソースコードをcloneしてくる

```bash
git clone https://github.com/creationix/nvm.git ~/.nvm
```

- bashrcに読み込ませる

```bash
vim .bashrc

source ~/.nvm/nvm.sh
```

- インストールしたいバージョンを選択してインストール

[nvm ls-remote] でインストール可能なバージョンを調べられます。

```bash
[~/bohelabo 19:14:52]$ nvm install v4.3.0
Downloading https://nodejs.org/dist/v4.3.0/node-v4.3.0-darwin-x64.tar.gz...
######################################################################## 100.0%
Now using node v4.3.0 (npm v2.14.12)

Creating default alias: default -> v4.3.0
[~/bohelabo 19:15:53]$ nvm install v5.6.0
Downloading https://nodejs.org/dist/v5.6.0/node-v5.6.0-darwin-x64.tar.gz...
######################################################################## 100.0%
Now using node v5.6.0 (npm v3.6.0)
```


## 利用するバージョンを選択する


```bash
[~/bohelabo 19:27:13]$ nvm ls
->     v0.10.42
         v4.3.0
         v5.6.0
         system
default -> v4.3.0
node -> stable (-> v5.6.0) (default)
stable -> 5.6 (-> v5.6.0) (default)
iojs -> N/A (default)


[~/bohelabo 19:27:16]$ nvm use v4.3.0
Now using node v4.3.0 (npm v2.14.12)


[~/bohelabo 19:27:45]$ nvm ls
       v0.10.42
->       v4.3.0
         v5.6.0
         system
default -> v4.3.0
node -> stable (-> v5.6.0) (default)
stable -> 5.6 (-> v5.6.0) (default)
iojs -> N/A (default)
[~/bohelabo 19:27:48]$ node -v
v4.3.0

```

## デフォルトバージョンの設定

```bash

vim .bashrc

nvm alias default v4.3.0

```

## どのバージョンを使えば良いの？

Node最新トピックス
http://www.slideshare.net/shigeki_ohtsu/node-58017154

長く安定して利用したいなら、その時の最新LTSを選んでください、ということです。
# (おまけ)4コマ漫画連載中on東洋経済オンライン

東洋経済オンラインで「エンジニア夫婦のあるある日記」を連載中です

[エンジニア夫婦のあるある日記](http://toyokeizai.net/category/diary)

![あるある日記.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/14d59814-449c-7cec-c463-59650d3ab1a3.jpeg)
nginxでaccess_logの出力先を条件によって分ける設定。if=conditionを使う。

# 概要

apacheの設定で良くある、envによってヘルスチェック等のログを出さないor別ファイルに出す設定。nginxのaccess_logではif=conditionというオプションが使える。
動機は、mod_pagespeedが生成する内部アクセスのログがうっとおしいから、分けてやろう、というところから。

# 条件判定の設定

まずは条件判定が必要。他にも変数がいろいろ使える。

## アクセス元IPアドレスで分ける

geoモジュールが使える。

http://nginx.org/en/docs/http/ngx_http_geo_module.html

僕のところでは、localhostとdocker0経由のヘルスチェック（自分も含む）のログをメインのログに出したくないので、以下の判定を「http」セクションに設定（※serverセクションではない）。

```nginx:nginx.conf
    geo $internal_access {
        default off;
        127.0.0.1 on;
        172.17.0.0/16 on;
    }
```

## User-Agentで分ける。

mapで分ける。

http://nginx.org/en/docs/http/ngx_http_map_module.html

mod_pagespeedが生成する「Serf/1.3.8 mod_pagespeed/1.10.33.2-7599」みたいなUAからのアクセスを判定する。

```nginx:nginx.conf
    map $http_user_agent $internal_access {
        default off;
        "~Serf.*mod_pagespeed.*" on;
    }
```

# ログ出力設定

ここが若干、apacheとは異なるところで、apacheのSetEnvIfは「!env」が使えるが、nginxのaccess_logは基本、0/1で出す・出さないの判定しかしてくれない。

http://nginx.org/en/docs/http/ngx_http_log_module.html

なので、前述の判定を行った結果を以って、フラグ変数をもう一度定義して分ける。

```nginx:nginx.conf
    map $internal_access $mainlog {
        off 1;
        default 0;
    }

    map $internal_access $internallog {
        off 0;
        default 1;
    }

    access_log  logs/blog-access.log main if=$mainlog;
    access_log  logs/internal-access.log main if=$internallog;
```

これで各々のログにUAなりアクセス元IPなりで分かれてログが出力されるようになる。

# まとめ

!envができないのかなぁ、というのが疑問。確かに、フィルタと考えれば今の形でも表現はできてるんだけど、やっぱり条件式は少ないほうが嬉しい。確かに、apacheでも記述レベルは同程度（!envの分だけ、1行、条件が少ない）なので、気にするレベルでは無いかな、とも思う。
コマンドラインからWeb検索

英単語の意味など、端末からささっと検索したいことってありませんか？
Go言語製の[s](https://github.com/zquestz/s)なんてのもありますが、自分でも勉強の為に書いてみました。シェルスクリプトなので、パスが通ってるところに置いてあげればいいです。

* [ssh0/s.sh](https://github.com/ssh0/s.sh)

使い方
---

### 一番簡単な使い方

```
s foo bar
```

とすれば、環境変数`$BROWSERCLI`で指定したブラウザ(w3m等)でGoogle検索("foo bar")して、tmuxの中だったらペインの大きさに応じて分割、あるいは新規ウィンドウで検索結果を表示します。

### 検索先を変えたい

```
s m 東京スカイツリー
```

のように、第一引数に検索先のalias("m")を指定することもできて、上の例の場合、環境変数`$BROWSER`で指定したGUIのブラウザ上でGoogle Mapで"東京スカイツリー"を検索できます。

この対応は例に倣って[providers](https://github.com/ssh0/s.sh/blob/master/providers)というファイルに書くことにしました。このファイルを編集することで、どんどん新しい検索先を追加していくことができます。

フォーマットは以下のようにしました。
","で区切られた1番目の部分をエイリアスとして使い、二番目の領域を使用するURLに、3番目の領域はGUIで表示されるべきものかどうかを指定するようにしました。

```
A,url,{true|false}
|  |    |
|  |    +--- Open in GUI browser or not.
|  +--- Set the search providers url. Search query is placed in "%s".
+--- Alias for the provider.
```

例:

```
m,https://www.google.com/maps/place/%s,true
```

### Zsh補完関数

ただ、それだけだと忘れてしまう検索先もあると思うので、Zsh用補完関数`_s`も書きました。`_describe -t`を使うことで、新たに検索先が追加されても、この補完関数自体を編集する必要はありません。

> 参考: [zsh: 20 Completion System](http://zsh.sourceforge.net/Doc/Release/Completion-System.html)の`_describe`の項

補完のオプションで

```zsh
zstyle ':completion:*' verbose yes
```

として、コマンドの説明も表示するようにしておけば、`providers`ファイルに書いた説明がそのまま補完で使われるようになります。
`$fpath`の通ったディレクトリに置くことを忘れずに。

![screen_003.png](https://qiita-image-store.s3.amazonaws.com/0/54869/2fa0b758-d398-7dba-8f68-b89a6a04bbec.png)


`providers`のコメントフォーマットは以下のようになっています。区切りには": "を使うことにしました。
`# "`で始まる行が補完関数で使用される対象となります。

```
 +--- Line that matches with '^# \"' is used for printing providers lists.
 |   +--- After ': ' parts is also used for printing providers lists.
 |   |                      +--- After the second ': ' is real comment.
 |   |                      |
# "A": Some description here: This field is ignored by completion.
```

例:

```
# "m": Google Map: Search with Google Map and open page in GUI browser.
```

最後に
---

個人的にはZsh補完関数についてさらに調べられたので良かったです。

最初に紹介したGo製のツールよりはかなりシンプルで、自分でいろいろ検索先を追加できると思うので、興味のある人はどんどんカスタマイズして使ってみてください。
dropzone.jsでファイルアップロードUIをつくる


## dropzone.jsとは
ドラッグ&ドロップのファイルアップロードUIが作れるjsのライブラリ。
## dropzone.jsでできること
1. ドラッグ&ドロップによるファイルアップロードUIの提供
2. アップロードしたファイルを非同期でサーバへpost
3. アップロードしたファイルのプレビュー表示
4. アップロードの進捗ステータスを表示

## ダウンロード
[dropzone.js公式サイト](http://www.dropzonejs.com/)からダウンロード

## 使い方
```html:HTML
<script src="jquery.js"></script>
<script src="dropzone.js"></script>

<form class="dropzone" id="my-awesome-dropzone">
  <input name="file" type="file" id="my-awesome-dropzone" multiple />
</form>
<div class='drag-and-drop-area'></div>
```

```coffee:CoffeeScript
# Dropzone設定
Dropzone.autoDiscover = false
# Dropzoneフォームのidをキャメルケースで記述
Dropzone.options.myAwesomeDropzone = {}

# Dropzone初期化(urlはpost先を指定)
myDropzone = new Dropzone '.drag-and-drop-area', {url: '/images/upload'}
```

これでドラッグ&ドロップ可能なUIと非同期でサーバにファイルをpostできるようになる。簡単。

## 実装サンプル
![Tumblr.png](https://qiita-image-store.s3.amazonaws.com/0/57806/e4891e3d-8825-cc7b-280e-65671d0c5831.png "Tumblr.png")

```html:sample.html
<div class="drag-and-drop-area drag-and-drop-area-out">
  <span>
    <i class="fa fa-image"></i>
    Drag and drop your files
  </span>
</div>
```

```css:style.css
.drag-and-drop-area {
  color: #ccc;
  height: 200px;
  margin: 30px 0 20px;
  border-style: dashed;
  border-width: 2px;
  line-height: 200px;
  text-align: center;
  cursor: pointer;
}

.drag-and-drop-area-over {
  border-color: #0000FF;
}

.drag-and-drop-area-over span {
  opacity: 0.2;
}

.drag-and-drop-area-out {
  border-color: #ccc;
}

.drag-and-drop-area-out span {
  opacity: 1;
}
```

```coffee:file_upload.coffee
$ ->
  Dropzone.autoDiscover = false
  Dropzone.options.myAwesomeDropzone = {
    paramName : "file"
    parallelUploads: 1
    acceptedFiles: 'image/*'
    maxFiles: 10
    maxFilesize: 0.5
    dictFileTooBig: "uploaded file is too large({{filesize}}MiB). limit: {{maxFilesize}}MiB."
    dictInvalidFileType: "Image file only"
    dictMaxFilesExceeded: "10 files limit"
  }

  myDropzone = new Dropzone ".drag-and-drop-area", {url:"/images/async_upload"}

  $('.drag-and-drop-area').on {
    click: (e)->
      $('#file_input').click()
    mouseover: (e)->
      $(this).removeClass('drag-and-drop-area-out')
      $(this).addClass('drag-and-drop-area-over')
    mouseout: (e)->
      $(this).removeClass('drag-and-drop-area-over')
      $(this).addClass('drag-and-drop-area-out')
    dragover: (e)->
      $(this).removeClass('drag-and-drop-area-out')
      $(this).addClass('drag-and-drop-area-over')
    dragleave: (e)->
      $(this).removeClass('drag-and-drop-area-over')
      $(this).addClass('drag-and-drop-area-out')
  }
```

## おしまい
他にもオプションやコールバックが用意されているので、カスタマイズして色々遊べそう。
公式サイト : http://www.dropzonejs.com/