OmniAICreator/Qiita-1.07M huggingface dataset:
.bat（バッチファイル）で、setコマンドを使いこなすための５つの豆知識

　setコマンドはバッチファイルに必須のコマンドです。
　そこで、setコマンドの豆知識的な機能を紹介します。

#１．set /aに関して
##その数自身を計算するときは、簡単な書き方ができる。

```bat
set /a num=num+1
set /a num+=1
```
　上のふたつは同じ結果になります。

##複数の計算は１行にまとめられる！

```bat
set /a num1*=2
set /a num2-=10
```
　という２つの計算は、

```bat
set /a num1*=2,num2-=10
```
　とまとめられます。
　カンマでまとめられるのは/aだけです！

##数値に限り多重展開できる！

```bat
set num1=123
set num2=456
set num3=789
をfor文で展開してすべての和をsumに出力したい。
for /l %%i in (1,1,3) do (
	set /a sum+=num%%i
)
```
　何が言いたいかというと、遅延展開を使って!num%%i!とする必要がないんですよね。
　なので、例えば

```bat
set num1=100
set name100=hoge
set hoge=123456789
とあってnum1から123456789を導いてresultに出力したいとき、/aを使わないと

call call set result=%%%%%%name%num1%%%%%%%

としなければならないのですが、/aを使うと

set /a result=!name%num1%!

とできるわけです。
```
　まあ極端な例ですが…

##/aは遅延展開される！

```bat
@echo off
set a=1
if 1 == 1 (
	set /a a+=1

	set b=%a%
	set /a c=a
)
echo %a%,%b%,%c%
pause >nul
exit
```
　このバッチファイルでは、if文のカッコの中でaの値が変わっています。
　()内は１文とみなされるので、```set b=%a%```のaは１のまま。
　しかし、その下の```set /a c=a```はその場で展開されるのです。そのため、最後のechoの結果は

```
2,1,2
```
　となります。つまり、**数値に限り、遅延展開の記号を使わなくても遅延展開できる**のです。

#２．set /pに関して
##改行無しのechoもどきができる！（加筆あり）

```bat
set name1=タカシ
set name2=ハナコ
set name3=ジロウ
：
：
set name1000=ジュンイチ

というデータを、スペース区切りで「１行で」表示したい。

普通だと

echo %name1% %name2% ..... %name999% %name1000%

と面倒な入力が必要ですが、set /pとforを合わせると

for /l %%i in (1,1,100) do set /p n=!name%%i! <nul

という短い文章で済みます。
```
　使い方は、```set /p 適当な変数(ダミー)=表示したい文字列<nul```

**DamashiGami様からの情報**

```bat
set /p<nul="表示したい文字列"
で、ダミーの変数が不要になる。
```
@media print,screen and (max-width: 768px)が作動しない

Webページのスマホ対応で

```css

@media print,screen and (max-width: 768px) {
....
}

```

を入れてみた。が、全然作動しない。
結果的に以下を追記すれば動作した。

```html
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
```

各項目の意味はこちらにわかりやすく書かれている。
http://stackoverflow.com/questions/22777734/what-is-initial-scale-user-scalable-minimum-scale-maximum-scale-attribute-in
Kotlinでマイナンバーのチェックディジットを計算する


みなさんのところにはマイナンバーは届きましたか？

ということで ~~ネタがないので~~ 先日うちにもマイナンバーが届いたので、[Ruby - マイナンバーのチェックデジットを計算する - Qiita](http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64)などの記事をみてKotlinでも実装してみました。

マイナンバーのチェックディジットの定義などは他の方々が詳細に書いてらっしゃるので[そちら](http://qiita.com/yumetodo/items/600ca0df422010cbc4c1)を参考にしてください。


```kotlin:MyNumberValidator
object MyNumberValidator {

    fun validate(str: String): Boolean = str
            .apply {
                if (length != 12) { throw IllegalArgumentException() }
                if (!all { it.isDigit() }) { throw IllegalArgumentException() }
            }
            .take(11)
            .reversed()
            .map {it - '0'}
            .zip(1..11)
            .map{
                val n = it.second
                val p = it.first
                val q = if (n <= 6) { n + 1 } else { n - 5 }
                p * q
            }
            .sum()
            .let { 11 - it % 11 }
            .let {
                val checkDigit = str.last() - '0'
                when (it) {
                    0, 1 -> 0 == checkDigit
                    else -> it == checkDigit
                }
            }
}


fun main(args: Array<String>){

    check(!MyNumberValidator.validate("123456789010"))
    check(!MyNumberValidator.validate("123456789011"))
    check(!MyNumberValidator.validate("123456789012"))
    check(!MyNumberValidator.validate("123456789013"))
    check(!MyNumberValidator.validate("123456789014"))
    check(!MyNumberValidator.validate("123456789015"))
    check(!MyNumberValidator.validate("123456789016"))
    check(!MyNumberValidator.validate("123456789017"))
    check(MyNumberValidator.validate("123456789018"))
    check(!MyNumberValidator.validate("123456789019"))
    check(MyNumberValidator.validate("023456789013"))
}

```

KotlinたしくSingle expressionで書いてみました。
ポイントは長さのチェックやすべて数字かどうかのチェックはapply式の中で行ってチェックに引っかかったらExceptionを投げつつ、最後のlet式で末尾のcheck digitと比較を行ったBooleanで結果を戻しているとこでしょうか。

ソースは[こちら](https://github.com/yamamotoj/kotlin-my-number)に置いておきます
babelでコンパイルしたnpmモジュールをTravisCIからリリースする


初めてnpmパッケージを作ってみて、わりといろいろやることがあったのでメモします。
ES2015のコードで開発して、babelでES5にコンパイルしています。


ここに動いているコードは置いてあります。 https://github.com/mookjp/multi-proxy

## 前提

babelを使って、以下のようなパッケージ構成でES2015でnpmモジュールを開発しているものとします。

```
.
├── dist # babelでコンパイルしたコードを配置
├── package.json
└── src # ES2015のコードを配置
    ├── main
    │   ├── lib
    │   ├── main.js
    │   └── middleware
    └── test
        ├── lib
        └── middleware

```

## パッケージの設定

### package.json

`"scripts"`に、`babel-cli`を使ってES2015のコードをコンパイルする処理を追加します。
また、`"main"`にはコンパイル後のコードを指定します。

```
// 省略
"main": "dist/main.js", # babelでコンパイルしたコード
"scripts": {
// 省略
    "build": "babel src/main -d dist" # dist以下に出力
},
"devDependencies": {
    "babel-cli": "^6.3.17",
	// 省略、テスト用パッケージ等
}
```

### .gitignore

ES2015で開発しているモジュールなので、babelでコンパイルした後のコードはバージョン管理は不要だと思います。
`.gitignore`にはbabelでコンパイルしたコードは含めないようにします。

```
// 省略
dist/
```

### .npmignore

`npm publish`するとき、パッケージのルートディレクトリに

* `.npmignore`がない
* `.gitignore`がある

場合は、`.gitignore`で無視されているファイルが`npm publish`時にも無視されます。
（参考: [developers | npm Documentation](https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package)）

今回は

* npmモジュールとしては`dist/`以下にビルドしたES5のファイルを配布したい
* 逆にgitリポジトリに含めているES2015のソースコードは無視したい

ので、以下のような`.npmignore`を書きます。


```
// 省略
# dist/
src/ # ES2015のソースコードが配置されているディレクトリ
```

## TravisCIの設定

### .travis.yml

deployフェーズの設定をします。
以下の例ではTravisCIが標準で用意している、npmパッケージをデプロイできるproviderをそのまま使っています。


```
language: node_js
node_js:
    - "4.1"
after_success:
  - npm run-script build
deploy:
  provider: npm
  email: "mookjpy@gmail.com"
  api_key: $NPM_API_KEY
  skip_cleanup: true # `run-script build`で生成したES5のコードを消さないようにする
  on:
    tags: true
```

### TravisCIのプロジェクト設定

TravisCIのプロジェクトごとの環境変数設定項目に、`$NPM_API_KEY`をあらかじめ設定しておきます。
プロジェクトの設定は https://travis-ci.org/your-username/project/ の、右側に`settings`というリンクがあるのでそこから行うことができます。

![Screen Shot 2015-12-24 at 23.32.43.png](https://qiita-image-store.s3.amazonaws.com/0/5882/6f28437d-2dec-da79-a6e4-bc94d30c852a.png "Screen Shot 2015-12-24 at 23.32.43.png")



`$NPM_API_KEY`は自分のマシンで`npm login`した後に以下のコマンドから確認することができます。

```
cat ~/.npmrc
//registry.npmjs.org/:_authToken=<Your key>
```

## babel6からのdefault exportの扱いについて

babel6からは`export default`でexportしたモジュールに`require`でアクセスする際の挙動が変わっています。
以下のようにES2015の`export default`を使った時は

```mybar.js
export default myVar;
```

以下のように`require`で取得したオブジェクトの`default`を参照する必要があります。

```importing.js
// var myVar = require('myVar'); これはbabel6からは使えない

var myVar = require('myVar').default; // defaultオブジェクトを指定する
```

今回例にしているプロジェクトをbabel6を使ってコンパイルする際は、`src/main/main.js`を以下のように書くことができます。
これはES5のコードなので、babelのコンパイラを通してもそのまま`dist/main.js`に書きだされます。


```src/main/main.js
module.exports = require('./lib/my_util').default; // ユーザー側からrequireを使ってアクセスされるであろうモジュール
```

npmモジュールのユーザーは普段通りの感覚で`require`を使うことができます。

```
npm install great-package
```

```main-by-user.js
var myUtil = require('great-package');
```
React Native - アプリ設計

今日はReact Nativeでどのようにアプリを作っていくのかを**個人的見解**で説明したいと思います。

# アプリ設計

## 0) アプリの概略を決める

マーケットチャネル、収益モデルなどのビジネス面を考慮して、どのようなアプリを作るか考えます。React Nativeの場合、どのプラットフォームでリリースするのか、iOSなのか、Androidも作るのかを決めないといけません。

## 1) 技術的なリサーチ

それを実現するために、そのアプリにどのような機能が必要でどのモジュールを使えば実現できるのかをリサーチします。Facebook LoginはReact Nativeにあるかなどを調べます。ただ昨日説明したようにNativeのコードとの連携は難しくありません。どこをネイティブで書かなければならないのかを考え、手を動かしつつ、コアな技術の動きを把握します。

現時点でAndroidアプリを作るには公式にサポートしてるモジュールが少ないので、iOSよりも入念に調べる必要があります。

## 2) ワイヤーフレームを書く

ワイヤーフレームを書き、アプリがどのような遷移をするのか、どこにボタンを置くのか考えます。iOSとAndroidではタブの位置などガイドラインが違います。それぞれ作ると良いと思います。

![IMG_0090.JPG](https://qiita-image-store.s3.amazonaws.com/0/13663/d7ec9e4b-2f2b-663b-90a0-0914894b33e7.jpeg)

## 3) コンポーネントの役割を決める

ReduxのDan氏のポスト[Smart and Dumb Components](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.nml2e6l9x)で語られてますが、コンポーネントを２つの役割に分けることでコードがすっきりして再利用可能になります。この２つは、どのようなものかというと、

### Smart Component
 * 他のSmart,dumbコンポーネントを含む
 * 状態を保ち、dumbコンポーネントに受け渡す
 * Flux actionを持つ
 * 自身にスタイルを持たない
 * レイアウトはDumbコンポーネントにさせる
 * 例えば、UserPage, FollowersSidebar, StoryContainer, FollowedUserList.

### Dumb Component
 * Fluxのaction/storeのようなものに依存しない
 * 子要素になる
 * propsによってデータやコールバックが受け渡される
 * スタイル（CSS）を持つ
 * 自身のコンポーネントに状態(state)を持つことがほぼない
 * 他のDumb Componentを使いうる
 * 例えば、page, Sidebar, Story, UserInfo, List

これはWebだけでなくNativeにも当てはまります。あとで学んだ大事なことの一つに**NavigatorのRouteのScene一つ一つはSmart Componentになります**　これを理解すると大分考えやすくなると思います。

![IMG_0091.JPG](https://qiita-image-store.s3.amazonaws.com/0/13663/cb12f86e-0da4-9038-3f5b-87b7416bc1c5.jpeg)

私はsmartコンポーネントは、`containers`ディレクトリ以下、dumbコンポーネントは`components`以下に入れています。この時点でコンポーネントの名前も決めておくと良いと思います。

## 4) アプリの状態/stateを考える

コンポーネントが決まったら、アプリの状態/stateを考えます。Reduxを使えば、状態は一つのオブジェクトになるので非常に考えやすいです。例えば、下記のようにこのアプリが持つ状態を書き出します。loggingInの時は、indicatorを回すみたいにコンポーネントの中身を考えながら作っていきます。

```
{
  currentUser: {
    isLoggedIn: bool,
    logginIn: bool,
    data: {
      firstName: String,
      ...
    }
  },
  Story: {
    list: [{
      chapter: number,
      ...
```

## 5) コーディング開始

設計が終わり、実際にコーディングしていきます。

App Reviewなどは早い段階でApp Reviewを出してしまいます。OTAを使えば、後からでもコード内容を変更できるのは便利です。


## Summary

以上、ざっくりですがどのようにアプリを実際作っていくのかを見てみました。一旦、Fluxに慣れてしまえばサクサク書けて、Loginなどのコンポーネントは後で再利用できて非常に楽しくコーディングできます。
【FileMaker】使いやすいFileMakerのために

FileMaker Advent Calendar 2015 25日目、ラスト記事です。

FileMakerの良さと改善して欲しいところを改めて考えてみました。

# FileMakerの良さ

## 見たままのレイアウトで画面を表示できる
これ、非常に大事ですよ。
FileMakerどっぷりの方は想像できないと思いますが、WebサイトなどはWebデザイナーがデザインした画面をそのまま使うことはできません。画像形式で納品されるので、HTMLコードに書きおこさないとなりません。
自動でやってくれるソフトもありますが、そこを業者に頼むととんでもなくお金がかかります。
なので、自力でやっているWebエンジニアもいます。

## スクリプトを組まなくても動いてくれる
自分でコードを書かなくてもすでに用意されている関数をポチッとするだけで大体機能するんですから、ありがたいです。
他言語ではだいぶ楽になりましたが、キーボードを打って自分でスクリプトを指定したり書いたりします。

## 画面設計もスクリプトも一つのツールでできる
「これ一つで」誰でもシステムが作れる幸せ！
あれこれツールを用意しなくても一人で一つのツールで仲間と会話できるので、意思疎通が楽ですよね。

## デザインリポートが自動でできてくれる(Advancedバージョン)
他言語の機能には負けている感はぬぐえませんが、レイアウトやスクリプトなど自分が作ったものについて自動でリポートしてくれるので、最低限の開発仕様として使えるところがいいですよね。

## あまり考えなくてもデバイス対応ができる
これもステキです。
関数が用意されているので、デバイス用のレイアウトとスクリプトでちょっとコントロールするだけでデバイス対応ができるのは、短期間開発、短納期を実現できる一つの理由だと思います。


まだまだありますが、ここら辺で改善して欲しいところも。

# 改善して欲しい

## スクリプト環境をもっと強固に
すみません、他言語出身ですので、スクリプト開発環境があまりに貧弱なのに愕然としました。
会社の片隅でちょっとしたツールを作るには不便はないと思いますが、仕事としてガリガリ書く場合はとてもじゃないけど貧弱すぎますので、Advancedバージョンだけでもいいので他言語開発環境あたりまでボトムアップしてほしです。

## リポジトリがない
つまり、世代管理ができないんですよね。
世代管理をするのにお高いツールを別途買うなんて、他言語ではほとんどありえません。
GitやCVS,Subversionを始めとするリポジトリで差分管理ができるようになってほしいです。
こちらもAdvancedバージョンだけで十分だと思いますので、ぜひとも整えて欲しいところです。

## 複数人開発に対応してほしい
FileMakerは一人で開発する分にはなにも考えずにサクサクできますが、同じシステムを複数人で開発するときに誰かが使っているから更新できないとか、レイアウトやスクリプトを分散開発できない（ファイルをサーバにアップして共有指定すればなんとかなるけど）とか、ちょっと勘弁して欲しいです。
大きなシステムをFileMakerで使うことも多くなってきた昨今、複数人開発を考慮して欲しいです。


みなさんも他の視点から諸々あるかと思いますが、ぜひとも[FileMakerの製品アイディア](https://community.filemaker.com/community/international_discussions/ja/product-ideas)に登録して実現を心待ちにしましょう。

今年もFileMaker Advent Calendarを書かせていただき、ありがとうございました。
結局最後まで独走でしたが、とても楽しく記事をかけました。
来年もFileMakerの記事を書けるとうれしいな、と思っています。

では、また来年！
Ruby on Railsに触れてみる

# 今日の目標
Ruby on Railsに触れてみる

# 使ったもの
* Ruby 2.2.3
* Rails 4.2.5
* Eclipse(Pleades) mars 4.5
* Aptana Studio 3

# 参考
* [Ruby on Rails Tutorial](http://railstutorial.jp/)
* [小学生でもわかるRuby on Rails入門](http://openbook4.me/projects/92/sections/485)
* [Ruby Development Kit](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit)

# 触る前に
Ruby on Railsとは

>Ruby on Rails（ルビーオンレイルズ）は、オープンソースのWebアプリケーションフレームワークである。RoRまたは単にRailsと呼ばれる。その名にも示されているようにRubyで書かれている。またModel View Controller（MVC）アーキテクチャに基づいて構築されている。
実アプリケーションの開発を他のフレームワークより少ないコードで簡単に開発できるよう考慮し設計されている。Railsの公式なパッケージはRubyのライブラリやアプリケーションの流通ルートであるRubyGemsにより配布されている。（[Wikipedia-Ruby on Rails](https://ja.wikipedia.org/wiki/Ruby_on_Rails)）

# 触ってみる

## 準備
gemを使ってRails入れます。バージョン指定しないで最新版を入れます。コマンドプロンプトで`gem install`を実行。

```> gem install rails```

プロンプトが戻ってきたら準備終わり。

と思ったんですが、この後のRailsプロジェクト作成でerrorが出たのでもういっちょ。

[Developer Kit](http://rubyinstaller.org/downloads)をダウンロードして展開します。
展開したところで下記コマンドを打ちます。

```
> ruby dk.rb init
> ruby dk.rb install
```


## Railsプロジェクト作成
IDEどうしようかな、と思ったのですが、EclipseにAptanaプラグインを入れているので、それを使おうかなと思います。

Eclipseで`新規->その他->Railsプロジェクト`を選択。
![rails2.png](https://qiita-image-store.s3.amazonaws.com/0/97937/9bcee328-2abb-4871-fa71-8c5cf37f908c.png)

プロジェクト名として`hello-app`を記述して、完了します。
![rails3.png](https://qiita-image-store.s3.amazonaws.com/0/97937/83900b48-69de-0ae4-9eb7-e76b1988b737.png)

すると、`rails new`が実行されて、プロジェクトが作成されます。

## Hello, World

すでに`controllers/application_contoroller.rb`ができてるため、これを書き換えます。helloメソッドを追加。

```application_controller.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  def hello
    name = "torinist"
    render text: "Hello, #{name}, Welcome to Ruby!"
  end
end
```

`config/routes.rb`にも一行追加します。rootの後の`application#hello`は、【controller名#メソッド名】を表してます。こうしておくと、`/`にアクセスすることで`application_controllerクラス`の`helloメソッド`が実行されます。

```routes.rb
Rails.application.routes.draw do
  root 'application#hello'
end
```

## 起動

サーバはコマンドプロンプトで下記を実行すると起動するみたいです。

```> rails s```

ブラウザでアクセスします。
```localhost:3000```
![rails4.png](https://qiita-image-store.s3.amazonaws.com/0/97937/32894d1a-faf8-4fdf-09d5-a5407ee2e7d8.png)

表示されました。

---
Railsは使うものが多くてちょっと面倒ですね…。RubyとRailsさえインストールしていれば良い、というわけではないし。といっても、コマンド打てば環境が整備できるので楽は楽なのかもしれませんね。


---

さて、本日でAdvent Calendar25日間終了です！
この25日間で興味を持った言語について、少しずつ触っていきたいと思います。（今のところはGroovyかな）

このAdvent Calendarに興味を持っていただきありがとうございました！以上！
selenium webdriver 実行時に「unable to obtain stable firefox connection in 60 seconds」って言われたときの対処法


この記事は[Selenium/Appiumアドベントカレンダー2015](http://qiita.com/advent-calendar/2015/selenium)の25日目の記事です。

selenium 実行時、表題のエラーが発生した際のトラブルシューティングです。

### **現象**

selenium 実行時に下記のエラーが発生。

![seleniumerror.png](https://qiita-image-store.s3.amazonaws.com/0/40852/2154ad8a-710a-c0e4-8ad6-bc77ddd7f422.png)

### **原因**

使用しているFirefoxのバージョンが新しいため、selenium webdriverがfirefoxのバージョンに対応していない。

### **対処法**

selenium webdriver最新化する

```
gem update selenium-webdriver              # webdriver最新化
gem uninstall selenium-webdriver -v 2.xx.x # 念のため古いやつけしとく
```

gemfileで管理していれば、 ``` bundle update ``` とかして頂ければ、selenium webdriverが最新化されるでしょう。

### **最後に**

アドベントカレンダー最終日にこんな小ネタですいません。
読んで頂いた方、ありがとうございました。
キーボードを立ち上げたときに、UITextFieldがキーボードに隠れないようにする処理

検索すると情報は出るものの、だいたいのものがView自体の位置を変更しているため、
そのまま実行すると隠れた情報などをユーザーがスクロールで閲覧することができない。

## 解決

キーボードを立ち上げた際に、キーボードの高さ分Viewの高さを狭くして
スクロール位置を調整する。

### キーボード立ち上げ時

```
let keyboardRect = (notification?.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
tableView.frame = CGRectMake(0, 0, tableView.frame.width, tableView.frame.height - keyboardRect.size.height)
tableView.contentOffset.y = keyboardRect.size.height / 4 // 要調整
```

### キーボード終了時

```
tableView.frame = CGRectMake(0, 0, tableView.frame.width, self.view.bounds.height)
```
おわりのことば

もっと他の方に書いて欲しかったんですけど、結局自分一人がポエムをまき散らしただけになってしまいました。

フリーランスとしてもう５年以上働いていますけど、良かったこと、辛かったこと、挫けたこと、死にたくなったこと、いろいろありました。

仕事でお金を支払って貰えなかったり、突然大きな金額を請求されたり。
弁護士のお世話になったり、自宅に内容証明が送りつけられたり。

もう生きていくのが辛い時も多いです。

だって、**人間だもの**。

フリーランスってカッコイイイメージがあると思うんですよ。
まあ、自分が「その理想と幻想をぶちこわしてやる！」て感じで書きました。


今なら私の来年の予定、全部空いてますよ！！泣きたいくらい白紙です。マジで。
こんな偏屈おじさんと一緒に仕事してみたい会社さん連絡くださいｗ

もっとフリーランスの仕事紹介場所ってあってもいいと思うんですよ。
結局、サラリーマン時代のコネクションや、ユーザーズグループの集まりで目立った芸人が
仕事を貰えるシステムの円環の理から脱出したいというか、ぶち壊したい。

もっともっとフリーランスエンジニアの地位向上と、仕事紹介のオープン化。
それをやりたいなぁ。。。

あ、中抜きのシステムは嫌いなので、1000円〜10000円くらいの手数料だけで
仕事を仲介できるシステムを作りたいな。

そうでないと、**フリーランスのエンジニアって言っても、保障も何もない不安定な社畜**でしか
ないっすよ。。。


来年も生きていたら。また会いましょう。
来年は書いてくれる人が増えるといいな。
megasquirtモドキ

#概要
業界では、有名なオープンソースのフルコン「MEGASQUIRT」のフェイクです。
見た目、フルコンをセッティングしているように、見えます。
OBD2のライブデータを表示しています。
arduino　unoとelm327を使ってます。
tunnerstudioからは、megasquirtに見えます。
#写真
![20151117211011273.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/c29c5f51-a0aa-4591-4a60-9a9269d4d820.jpeg)
![20151117211004883.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/8490fdef-60bb-3bf4-71b4-303da5bf71b1.jpeg)
#ムービー
https://www.youtube.com/watch?v=1HTn73HCVV8
#回路図

![elm.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ef77f129-4bd1-7c1d-5f47-bcebc7ccc495.jpeg)

#サンプルコード
```
#include <SoftwareSerial.h>
#include <Obdsquirt.h>

Obdsquirt squirt;
int n = 0;
void setup()
{
	pinMode(13, OUTPUT);
	squirt.begin();
	while (!squirt.init());
}
void loop()
{
	int value;
	digitalWrite(13, HIGH);
	if (Serial.available())
	{
		squirt.command();
	}
	if (squirt.isLoop())
	{
		switch (n)
		{
		case 0:
			if (squirt.read(PID_RPM, value))
			{
				squirt.currentStatus.RPM = value;
			}
		break;
		case 1:
			if (squirt.read(PID_THROTTLE, value))
			{
				squirt.currentStatus.TPS = value;
			}
		break;
		case 2:
			if (squirt.read(PID_COOLANT_TEMP, value))
			{
				squirt.currentStatus.coolant = value + 40;
			}
		break;
		case 3:
			if (squirt.read(PID_INTAKE_TEMP, value))
			{
				squirt.currentStatus.IAT = value + 40;
			}
		break;
		case 4:
			if (squirt.read(PID_INTAKE_MAP, value))
			{
				squirt.currentStatus.MAP = value;
			}
		break;
		default:
		break;
		}
	}
	n++;
	if (n > 4) n = 0;
}

```
POSIX の非同期 I/O がイケてない理由

これは [ACCESS Advent Calendar](http://qiita.com/advent-calendar/2015/access) の最終日の記事です。

僕は株式会社 ACCESS 開発本部 IoT 開発1課の三原と申します。
今日は POSIX の非同期 I/O について述べさせていただきます。

# POSIX の非同期 I/O はイケてないと言われますが……

非同期 I/O って夢のある言葉です。不要な時は寝てて、必要になったら起床して仕事して、仕事が終われば寝る。無駄のない動きの理想です。

POSIX には非同期 I/O が定義され、各種 OS で使用できます。ところが……　正直、使っている人を見ることはほとんどありません。POSIX の非同期 I/O を使うくらいなら同期 I/O を使う、設計が「イケてない」、そう言われます。

不要な時は寝てて、必要になったら起床して仕事して、仕事が終われば寝る、そんな API が作られたら使うと皆さんおっしゃいます。

その声に僕は疑問を持ちます。そんな非同期 I/O 、現実に実装できるんですか?

仕事を実行した後、結果を受けて反応するにはどうしましょう。反応する、そこに大きな問題があるんです。

# 既存のスレッドに非同期に通知する方法はない

まず考えるのは、動いているプログラムに通知してもらうことです。POSIX なら動作の単位はスレッドです。さて既存のスレッドに通知するにはどうしましょう?

POSIX API は C 言語で使用できなければいけないという絶対の決まりがあります。

C 言語の特性について[拙筆](http://qiita.com/aKatsuhiroMihara/items/211b109da64fdc297fcd)で述べさせていただいたのですが、**C 言語のスレッドは、変数も関数も、自分が使うと決めたものだけを、自分が使うと決めた順序でしか、参照しません。自分が見たいものしか見ません。**処理の順序は決まっていて例外もありません。

ここで人間を思い浮かべてみましょう。他の人をからかって、こんなことをしたことはありませんか? 背中をつついて、相手が振り返ったところで頬に指をあてる。他愛ないいたずらです。人間は背中をつついて気付かせることができます。経験から、人間は、何か実体があると、外部から刺激して気づかせることができると考えます。

しかし C 言語のスレッドの背中をつつくことはできません。C 言語のスレッドに気づいてもらうには、あらかじめ「ここを見て」と指図したうえで、指示した場所に情報を書き込むしかないのです。

スレッドで動いているプログラムが自発的に結果を見に行くなら、同期 I/O を使っても同じことができます。非同期 I/O でしかできないことがなくなるんです。

既存のスレッドに通知しようとしたら非同期 I/O の意味がなくなるなら、処理の流れを新たに作ることを考えるかもしれません。POSIX なら割込みか新規スレッド生成になります。さて、うまくいくでしょうか?

# 割込みは処理の制限が多い

POSIX の割込みについては JPCERT に記事があります。

[SIG30-C. シグナルハンドラ内では非同期安全な関数のみを呼び出す](https://www.jpcert.or.jp/sc-rules/c-sig30-c.html)

割込みを受けたシグナルハンドラの中は、通常のスレッドとは異なる環境であり、呼び出せる関数、平たく言えば機能が大きく制限されます。制限を無視して関数を呼び出せば、動作は未定義、つまりどんなバグが発生してもアプリケーションの責任です。それだと脆弱性が生じるので JPCERT が警告しているんです。

処理に必要な関数が呼び出せなければ、通常のスレッドに処理してもらうしかありません。では、どうやってスレッドに通知しましょう?　ここで先の問題に戻ってしまいます。

シグナルハンドラ内に処理を書くというのは時折使われる手法ですが、汎用的にはできないので、広くお勧めできません。

# スレッド生成すれば I/O 自体より処理が重い

割込みで制限があるならスレッドを生成すれば、という話になります。

POSIX でスレッドを生成するのは極めて重い処理です。I/O 自体より重い処理です。

I/O のイベントが発火するたびにスレッドを生成していたのでは、鈍重なプログラムとなってしまいます。

スレッド同期が問題になる前に、性能面で実用になりません。

# POSIX というプラットフォームの性格上、イベントループを強制できない

イベントへの対応が C 言語の関数呼び出しだったらどうでしょう?

十分軽量です。 [libev](http://software.schmorp.de/pkg/libev.html) という広く使われているイベント処理フレームワークもあります。

POSIX もそうすればいいとおっしゃるかもしれませんが代償があります。アプリケーションプログラマにイベントループのアーキテクチャを強制することになるんです。

iOS や Windows の GUI アプリならイベントループのアーキテクチャが決まっていても文句は言われませんが、POSIX というプラットフォームは利用者が違います。特定のイベントループのアーキテクチャを強制すれば使ってもらえません。

# 結果

POSIX の非同期 I/O はイケてないと言われます。しかし、**C 言語の実行モデルが決められて、POSIX の割込みモデルと Pthreads モデルが決められて、イベントループのアーキテクチャを強制できなければ、イケてる非同期 I/O は実装できないんです。**C 言語の実装モデルの決まりとイベントループを強制できない点について気づかない人が多いです。

POSIX のプラットフォームレベルで設計される非同期 I/O はどうしたってよくならないので、同期 I/O で頑張るか、libev などフレームワークの活用を考えるしかありません。

夢のような話は、夢のままでしたね。

***

[ACCESS Advent Calendar](http://qiita.com/advent-calendar/2015/access) を最後までお読みいただき、感謝申し上げます。
QWERTY配列は老害

http://qiita.com/advent-calendar/2015/dvorak

Dvorak Advent Calendar 25日目（最終日）

-----

## 一般的な市販のキーボードが負の遺産を引き継ぎ過ぎてる

つまり現行の一般的なキーボードは老害の塊なのです．
キーボードは格子配列であるべきだしQWERTYも打ちにくい（覚えにくい）

実は，これらはタイプライターの文化をそのまま引きずってる．
     

### キーボードが上下の段がズレてる理由

レンガ積みみたいな上下の段が揃っていない作りになっている理由は，タイプライターの作りの制約を受けている為です．
今，キーボードがその制約を引き継ぐ必要は全くないし，格子配列（上下左右綺麗に揃ってる配列）のが覚えやすいし押し易いです．

[タイプバスケット上タイプバーとキー間の配置関係規則性原則。アップストライク式はディッカーソンによる - 霊犀社２](http://blog.goo.ne.jp/raycy/e/c11db5b33d4a1d67900e568ab0dc6273)


### QWERTY配列の理由

何故，QWERTY配列なのか？
QWERTY配列もタイプライターの仕様上の制約を受けています．タイプライターのアームの衝突を避ける為に考えられた配列で，人間の打ち易さなどは考えられていません．

[QWERTY配列が生まれた本当の理由 : ギズモード・ジャパン](http://www.gizmodo.jp/2013/05/qwerty.html)


### キーボードが奥から手前に掛けて傾斜になっている理由

キーボードが奥から手前に掛けて傾斜になっているのは打ち易くする為ではなく **キートップの印字を見え易くする為** 
つまりタッチタイピングできない初心者に合わせた作りになっています．
手前に向かって下り坂にする必要は全く無く，上り坂（キーボードの手前の下にモノを敷く（下駄を穿かせる））方が良いと言うユーザーも多いです．

![](https://qiita-image-store.s3.amazonaws.com/0/9497/dc92bcd9-a8ef-6933-f6b4-162bc47e692e.jpeg)
↑サイドから見るとこんな感じ．デスクに対して並行〜やや奥に傾けるくらいが打ちやすいと言う意見をよく見ます．


また，キーボード裏側の億にチルトスタンド（足）のあるキーボードも多いですが，これも当然立てる必要は全くありません．
余計に手首に負担が掛かります．

[「手首が疲れない」は気のせい!? キーボードに角度を付けるあの小さな足が必要な「本当の理由」 ｜ ライフハッカー［日本版］](http://www.lifehacker.jp/2013/06/130624keyboard_stand.html)


-----

このように負の遺産を引き継いで何十年も使われてきているキーボード配列…
今一度，少しでも人間に合わせた環境で打鍵してみてはいかがでしょうか？


Hallelujah!!
Crystal - Enumerable - max_of

Crystalの標準ライブラリの `Enumerable#max_of` について

## <i class="fa fa-cubes" style="font-size:1em;"></i> Enumerable#max_of
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Enumerable#max_of - Crystal API Docs](http://crystal-lang.org/api/Enumerable.html#max_of%28%26block%3AT-%3EU%29-instance-method)

Rubyの標準ライブラリの `Enumerable` には見当たらないこのメソッド。
`max_by` は要素のもともとの値を返しますが、 `max_of` はブロックの戻り値を返します。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
```ruby
class Person
  property :name, :age
  def initialize(@name, @age)
  end
end

people = Array(Person).new
people.push(Person.new("tanaka", 32))
people.push(Person.new("sato", 42))
people.push(Person.new("suzuki", 22))

pp people
pp people.max_by{|e|e.age}
pp people.max_of{|e|e.age}
```

### <i class="fa fa-files-o" style="font-size:1em;"></i> 出力
```ruby
people = [#<Person:0x936cfd0 @name="tanaka", @age=32>, #<Person:0x936cfb0 @name="sato", @age=42>, #<Person:0x936cfa0 @name="suzuki", @age=22>]
people.max_by(&.age) = #<Person:0x936cfb0 @name="sato", @age=42>
people.max_of(&.age) = 42
```

<i class="fa fa-external-link" style="font-size:1em;"></i> <a href="https://play.crystal-lang.org/#/r/otr" target="_blank">Crystal Playground 実行結果</a>

## <i class="fa fa-github-square" style="font-size:1em;"></i> GitHub
Crystalの `Enumerable#max_of` の実装が気になる方はこちら。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [enumerable.cr - Crystal GitHub](https://github.com/manastech/crystal/blob/master/src/enumerable.cr#L525-L533)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Enumerable#max_of - Crystal API Docs](http://crystal-lang.org/api/Enumerable.html#max_of%28%26block%3AT-%3EU%29-instance-method)
ヒープダンプから、その瞬間の各オブジェクトの持っている状態を調べよう


デバッグ中、何か良からぬ挙動を発見した時に、怪しげなオブジェクトの持っている状態がどうなっているかを調べる場合において、デバッガをアタッチして調べることが困難なことがあります。例えば、その怪しい挙動に再現性のない場合を考えてみると、再度同じ挙動を起こすまでに膨大な時間が必要になるかもしれません。そもそも、どこが悪いのかも分からないのに無闇にデバッガをアタッチしていては、検証にかかる時間が無駄に伸びてしまう可能性もあります。

この記事では、怪しい挙動を発見した瞬間に、デバッガに頼らずともオブジェクトの持っている状態がどうなっているかを調べたい人のための手順をまとめます。

## AndroidStudio でヒープダンプを取る

AndroidStudio には、それぞれのプロセスがどのくらいメモリや CPU、GPU のリソースを消費しているかを可視化してくれるツールが組み込まれています。普段 Logcat を使うことが多いかもしれませんが、画面下部の Android Monitor というメニューの中に、Logcat 以外に「メモリ」「CPU」「GPU」「ネットワーク」のタブがあり、それぞれ、見てみたいプロセスごとにグラフが表示されるようになっています。

![Android Monitor 上のメモリ使用量のグラフ](https://qiita-image-store.s3.amazonaws.com/0/31829/f85f4b20-595f-f998-741d-ca587ed1c403.png)

横軸は時間ですので、放っておくとグラフが流れていきます。

このグラフ、実は単にメモリ使用量の様子を可視化してくれるだけではありません。このグラフの左側を見ると、幾つかのボタンが有ることがわかります。

![Dump Java Heap](https://qiita-image-store.s3.amazonaws.com/0/31829/eca73b18-e214-efdc-34a0-1893c4acb73e.png)

この内、下矢印のついている上から 3 番目のボタンが、ヒープダンプを取るためのボタンになります。

ヒープダンプを取ってみると、ボタンのアイコンがグラフ上に現れます。

![ヒープダンプ取得の瞬間も可視化される](https://qiita-image-store.s3.amazonaws.com/0/31829/4dd8e2b7-6784-45f9-5be4-6947c7cd2fce.png)

このアイコンが表示されたタイミングのヒープダンプが取得できたことがわかります。

## ヒープダンプから、状態を調べたいクラスを探す

ヒープダンプが終わると、hprof ファイルが自動で開かれます。
デフォルトでは、アプリケーションのヒープにある各クラスの一覧が表示されるはずです。

![ヒープに乗っているオブジェクトのクラスが一覧表示されている](https://qiita-image-store.s3.amazonaws.com/0/31829/ca6b9398-53e1-d1fc-5219-c52698c7e5d4.png)

ここでどれかひとつクラス名をクリックしてみると、ヒープに乗っているインスタンスの一覧が右側に表示されます。

![ずらりと並ぶインスタンスの一覧](https://qiita-image-store.s3.amazonaws.com/0/31829/fcdcf235-1a61-7165-312f-1bf06dea3408.png)

## インスタンスの一覧を展開して、それぞれの状態を調べる

インスタンス一覧のどれかひとつをクリックすると、リストが展開され、そのインスタンスの内部の様子が表示されます。

![インスタンスの状態が見て取れる](https://qiita-image-store.s3.amazonaws.com/0/31829/e688a2a1-7fe0-26eb-0612-3cef7d3b936c.png)

これで、そのインスタンスの状態がどうなっているかを覗き見ることが出来ました。あとは、どのプロパティが不正な値になっているかを調べたりすることで、おかしな挙動を見つけていくことになります。

## 目的のクラスにたどり着くまでの方法

幾つか方法があります。

1. クラス名一覧にフォーカスを当て、見たいクラス名をタイプする  
   AndroidStudio では、いたるところで直接文字列をタイプして検索をかけることが出来るようになっています。プロジェクトパネルにフォーカスがある場合は、各モジュールの中から文字列に一致する部分をハイライトしてくれたりします。これと同じ要領で、ヒープダンプのクラス一覧から対象のクラスを探しだすことが出来ます。
2. クラス一覧の表示をパッケージごとに切り替えて探す  
   クラス一覧の他に、パッケージ一覧の表示もできるようになっています。クラス一覧の上にある「Class List View」の部分を、「Package List View」に切り替えれば簡単に表示が変えられます。

![パッケージ一覧](https://qiita-image-store.s3.amazonaws.com/0/31829/04e0cce2-4c58-db3c-0279-0713a6ec98dd.png)

## まとめ

ヒープダンプと言うと、どうしてもメモリリークの調査に主眼をおきがちになりますが、AndroidStudio を使えば、メモリに乗っているオブジェクトの状態も見ることが出来ます。もちろん、どうしてそういう状態になったのかを調べるためには、デバッガをアタッチして状態の変化するところにブレイクポイントを張り、変化した時のスタックトレースをみるなどの方法も重要ではありますが、そもそも何がどう悪くなっているかを調べるには、ヒープダンプを活用するほうがいくらか手軽にできます。

## さいごに

今年も一年お疲れ様でした。来年も良い年でありますように🙏
Data::Validatorを使うときにハッシュスライスで引数をすっきりさせる

この投稿は[Perl 5 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl5)の24日目のものです。

### バリデーション

言語自体にサブルーチンの引数の型を明確にする機能が無い[^1]Perlですが、そこもライブラリを作る人がいるのがPerl界。
[Data::Validator](https://metacpan.org/pod/Data::Validator)や[Smart::Args](https://metacpan.org/pod/Smart::Args)、[Params::Validate](https://metacpan.org/pod/Params::Validate)などがありますが、個人的によく使っているのはData::Validatorです。

Data::Validatorを使うと下記のように引数の型をチェックしたり、デフォルト値を設定したりといろいろできます。
Data::Validatorは非常に高機能で他にも機能がたくさんありますが、この投稿の趣旨とは違うので割愛します（詳しくはモジュールのドキュメントにて）。

```perl
sub plus {
  state $v = Data::Validator->new(
    a => { isa => 'Int' },
    b => { isa => 'Int', default => 1 },
  );
  my $args = $v->validate(@_);

  return $args->{a} + $args->{b};
}

plus(a => 1, b => 2); #=> 3
plus(a => 1);         #=> 2
plus(a => "hoge");    #=> error
```

### ハッシュスライスですっきり

良い感じに扱えて大好きなData::Validatorなのですが、引数が全てハッシュリファレンスに入るため`$args->{hoge}`というように書かなければいけないため、地味に読みにくかったりタイプがだるかったりします。ハッシュスライスを利用することで、ハッシュ内の値を全て1行で変数に移すことができます。

ハッシュスライスの構文はこうです。

```perl
my %hash = (a => 1, b => 2, c => 3);
my @sliced1 = @hash{'a', 'b'}; #=> (1, 2)
my @sliced2 = @hash{qw/a c/};  #=> (1, 3)
```

ハッシュスライスを使って引数の変数をすっきりさせたのがこの例です。サブルーチンの本体が短いためこの例だけ見ると微妙感がありますが、もう少し長くなると読みやすさに差が出てきます。

```perl
sub plus {
  state $v = Data::Validator->new(
    a => { isa => 'Int' },
    b => { isa => 'Int', default => 1 },
  );
  my $args = $v->validate(@_);
  my ($a, $b) = @$args{qw/a b/};

  return $a + $b;
}
```

### 終わりに

ちょっとしたtipsですが地味に好きだったので紹介しました。
最終日の明日は[@karupanerura](https://twitter.com/karupanerura)さんによる「マルチプロセスでもカジュアルにデータを共有したい - Test::SharedObject」です。


[^1]: プロトタイプや実験的機能のサブルーチンシグネチャが一応あります。
How to Install the Latest Version of NodeJS and NPM  on the Raspberry Pi

```
$ wget https://s3-eu-west-1.amazonaws.com/conoroneill.net/wp-content/uploads/2015/02/node-v0.12.0-linux-arm-pi.tar.gz
$ tar -zxvf node-v0.12.0-linux-arm-pi.tar.gz
$ cd node-v0.12.0-linux-arm-pi
$ sudo cp -R * /usr/local/

$ node -v
v0.12.0
$ npm -v
2.5.1
```
Facebook Canvas アプリ開発手順


## Merry Christmas!

クリスマスイブなのでネタ記事にしようかと思って煽り系の記事を書いてたのですが、使いたいAPIの仕様上厳しそうだったので断念しました。私はできるかどうかちゃんと調べる前に作りたいとこから作り始めるクセがあるようで来年はこのクセを治すのを目標にしようと思います。

ということで、書きかけで断念していた記事がKobitoに眠っていたので完成させて今日のAdvent Calendarということにしたいと思います。

「Facebook内のアプリ」別名「Facebook Canvas」をRailsで作った話です。

## 自己署名証明書の作成

次の「アプリ登録」の項でFacebookアプリを登録しますが、その中の必須項目にSecure Canvas URLという項目があり、 https:// でないと通りません。 http://localhost:3000/ とかでうまくいってほしいところですが、このように設定する方法を調べてもなかったので、「ローカル環境で https:// が使えるようにする」という方向で進めます。

[オレオレ証明書をopensslで作る（詳細版） - ろば電子が詰まっている](http://d.hatena.ne.jp/ozuma/20130511/1368284304) を参考に、下記コマンドで自己署名証明書を作ります。

```bash
$ mkdir certs && cd certs
$ openssl genrsa 2048 > localhost.key
$ openssl req -new -key localhost.key > localhost.csr
$ openssl x509 -days 3650 -req -signkey localhost.key < localhost.csr > localhost.crt
```

このとき、 `Common Name (e.g. server FQDN or YOUR name) []:localhost` としておきました。

## WebRickで作成した証明書を使用するよう設定

次に作成した証明書を使用してHTTPS接続を受け付けるよう、 `bin/rails` を編集します。

```ruby:bin/rails
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'

require 'rubygems'
require 'rails/commands/server'
require 'rack'
require 'webrick'
require 'webrick/https'
require 'webrick/ssl'

module Rails
  class Server < ::Rack::Server
    def default_options
      super.merge(
        Port: 3000,
        environment: (ENV['RAILS_ENV'] || "development").dup,
        daemonize: false,
        debugger: false,
        pid: File.expand_path("tmp/pids/server.pid"),
        config: File.expand_path("config.ru"),
        SSLEnable: true,
        SSLVerifyClient: OpenSSL::SSL::VERIFY_NONE,
        SSLPrivateKey: OpenSSL::PKey::RSA.new(File.open("certs/localhost.key").read),
        SSLCertificate: OpenSSL::X509::Certificate.new(File.open("certs/localhost.crt").read),
        SSLCertName: [["CN", 'localhost']]
      )
    end
  end
end

require 'rails/commands'
```

あとはいつものように起動します。

```bash
$ bin/rails s
```

起動したら https://localhost:3000/ で確認します。自己署名証明書なので警告が出ますが気にしないことにします。

## アプリ登録

Secure Canvas URLには `https://localhost:3000/` と指定しました。

Facebookアプリで表示されることを確認します……。といけばいいのですが、ハマりポイントがあります。

### HTTPメソッドがPOST

なので、 POST を受けられるようにしないとだめです。こんな感じでしょうか。

```ruby:config/routes.rb
  post '/', controller: :users, action: :new
```

### X-Frame-Optionsヘッダが勝手につく

Railsはデフォルトで `X-Frame-Options: SAMEORIGIN` ヘッダをつけてレスポンスするようで、他のドメイン内から iframe で埋め込まれるのを拒否するようになっています。なので、 `application_controller.rb` に下記のようにいれておきます。

```ruby:app/controllers/application_controller.rb
  before_action def allow_iframe_requests
    response.headers.delete('X-Frame-Options')
  end
```

と、こんな感じでひとまずFacebook内でRailsアプリを動かせました。

# 参考文献

- [オレオレ証明書をopensslで作る（詳細版） - ろば電子が詰まっている](http://d.hatena.ne.jp/ozuma/20130511/1368284304)
- [ruby - How do you configure WEBrick to use SSL in Rails? - Stack Overflow](http://stackoverflow.com/questions/3640993/how-do-you-configure-webrick-to-use-ssl-in-rails)
- [Railsのローカル環境にhttps(SSL)を導入する方法 - Qiita](http://qiita.com/GenTamura84/items/a1af6e9b5eb69d5469b7)
Dart x simplegamelib でミニゲームを作成してみる

僕自身、ミニゲーム用のライブラリでも作ろうかなぁ〜。的な事を考えてた時に出会ったライブラリ。

* デモのリンク
http://divingintodart.blogspot.co.uk/p/simplegamelib-homepage.html

実際に、作りたいミニゲームって、このくらいの機能で実現できるものではないですか?
そんな方は、simplegamelib を使いましょう。コードも少ないから、全てコントロールできると思いますよ!!





## 試してみよう

```
$ git clone https://github.com/daftspaniel/simplegamelibdemos
$ cd simplegamelibdemos
$ pub get
$ pub upgrade
$ pub serve 
```

Dartiumで開くと、以下のように表示されます。

![スクリーンショット 2015-12-24 23.20.09.png](https://qiita-image-store.s3.amazonaws.com/0/54192/0c6db133-f11b-9835-9a6b-bd9db5c3c70d.png)


![スクリーンショット 2015-12-24 23.20.29.png](https://qiita-image-store.s3.amazonaws.com/0/54192/33e7f740-21b7-0315-385e-50a9c3c634c7.png)

# コードもみてみましょう。

キャニクターが左から右へ移動するデモ1のコードをみてみましょう。

```
import 'dart:html';
import 'package:simplegamelib/simplegamelib.dart';

void main() {
  Game game = new Game("My Game", '#surface');
  Sprite player = game.createSprite("images/ninjadude.png",48,48);

  player
    ..position = new Point(0, 10)
    ..movement = Movements.east;
  print('starting game...');

  game.start();
}
```

超シンプルですね。


# ほそく
* https://pub.dartlang.org/packages/simplegamelib
* https://github.com/daftspaniel/simplegamelib
* https://github.com/daftspaniel/simplegamelibdemos



<br>
<br>
-------
Kyorohiro Work
http://kyorohiro.strikingly.com/
ScriptableObjectを継承して作ったクラスが読み込まれない？

さっき起きた出来事で「？？？」と頭を抱えた事案があったので
メモを残しておこうと思います（戒め）

夜遅く(**22時**)に仕事をしていたところ、ScriptableObjectを継承したクラスが何故か読み込まれない現象に陥りました。
しかもScriptableObjectクラスを継承して作った自作クラス全てではなく、特定の１クラスのみ。

こんな感じ。

```lang:hoge_Init.cs
using UnityEngine;
using System.Cillections;

namespace Hoge
{
      // ScriptableObjectを継承したhogehogeをさらに継承してhoge_initを作成
      public class hoge_init : hogehoge
      {
　　　　　　// Activeになった際に呼び出される(hogehogeよりoverride)
           public override void OnActivate()
           {
                 hoger();
           }
      }
}
```
こんな感じでhogehogeを継承して作られたクラスがいくつもあり、それらをScriptableObjectに格納して使っていたとします。
この時、ScriptableObjectの中にhogehogeを継承してクラスを登録出来るListがあり、その中にhoge_intを追加しました。
そして動作を確認し（問題なく挙動することを確認）、Save Assetsを入念に行い、assetを更新しました。
したはずです。
絶対にしました。

しかし、一旦unityを終了し、再度立ち上げると・・・一番最初に登録したhoge_initは消えていました。
入れ直したり、Save Assetsしてなかったんじゃないかと思い、**shift+alt+S**（macショートカット）を連打しましたが、結果は変わらず。

そこで一緒に仕事している方が気づきました。
「あれ？Initとinitになってない？」
ファイル名は「**hoge_Init.cs**」
クラス名は「**hoge_init**」


***あっ***

クラス名に寄せる形でファイル名を「**hoge_init.cs**」に直したところ、登録したhoge_initが消えなくなりました。
この現象が起きている時に、hoge_initを追加している.assetファイルの中身などを見ていると、hoge_initに対してguidが振られておらず、他のhogehogeクラスを継承したクラスのオブジェクトにはguidが振られていました。
Unityを起動して、.assetファイルを読み込む際にクラス名と同一のファイル名があるかなどを調べていたりするのだろうか………
普段はクラス名とファイル名を合わせる習慣がついているので気づきませんでした。


なかなか限定的な現象な気がしますが、また起きた時に**わわっ**ってなりたくないので、
メモ代わりに残しておきます。



クリスマス……イブ……
Swift で パースしたり初期値を設定する時に if let を使わない


# パーサーを作る時によく使う if let

パーサーを作る時によく if let を使っていました。こんな感じです。

```
    class func parse(param: Dictionary<String,AnyObject>) -> SomeClass {
        let someClass = SomeClass()
        
        if let val = param["name"] as? String { // name が存在するなら
            someClass.name = val
        }else{
            someClass.name = "default value" // 存在しないならデフォルト値を設定
        }        
        ...
	}
```

# ?? を使う

最近こんな書き方もできることが分かりました。

```
　optinal型の変数 ?? 初期値
```

実際に書くとこんな感じです。

```
    class func parse(param: Dictionary<String,AnyObject>) -> SomeClass {
        let someClass = SomeClass()
        
        someClass.name = param["name"] as? String ?? "default value"
        ...
	}

```

こちらの方が簡潔に書けてよさそうです。
Cloudera Manager APIでローリングリスタート

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の24日目の記事になります。

# はじめに

株式会社サイバーエージェントの秋葉原ラボに所属している梅田と申します。
普段はHBaseクラスタの運用したり、HBaseを用いたグラフデータベースの開発・運用をしていたりします。
今年1月に共著で[HBaseの入門書](http://www.amazon.co.jp/HBase%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Hadoop%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%81%AB%E3%82%88%E3%82%8B%E9%AB%98%E9%80%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E5%AE%9F%E7%8F%BE-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88-%E9%88%B4%E6%9C%A8-%E4%BF%8A%E8%A3%95/dp/4798138827/ref=tmm_jp_oversized_meta_binding_title_0)を出したりしました。

弊社では複数のHBaseクラスタを運用していますが、Cloudera Managerで管理していたり、自力(気合)で管理していたりします。
Cloudera Managerは優れもので、無料版であるClondera Expressエディションでもそれなりに運用できます。
ただし、Clondera Enterpriseエディションでないとローリングリスタート機能が使えなかったりします。
設定変更などをオンラインで行う上でローリングリスタート機能がないと結構不便なので、Cloudera Manager APIを用いたローリングリスタートスクリプトを作ってみたので紹介してみたいと思います。

# Cloudera Manager API

Cloudera Managerには、Cloudera Manager APIというAPIが用意されており、ほとんどの操作をAPI経由で実行することができます。

[Cloudera Manager API](http://cloudera.github.io/cm_api/)

さらにこのAPIのクライアントとして、JavaクライアントやPythonクライアントが用意されています。
今回は、pythonクライアントを用いてローリングリスタートスクリプトを作りました。
クライアントの詳細な情報については以下を参照してください。

[Cloudera Manager API Client](https://github.com/cloudera/cm_api)


# ローリングリスタートスクリプトの概要

私が管理しているクラスタは、基本的にはHDFS、HBase、YARN、Zookeeperで構成されています。
このうち、HDFS、HBase、YARNについてはちょくちょく設定変更するため、ローリングリスタートスクリプトではこれらのプロセスを再起動する仕様にしています。

スクリプトの概要は以下になります。

- HBase関連のプロセス再起動
    - Masterプロセスの再起動
    - RegionServerプロセスの再起動
         - プロセス停止前にRegionのunloadを行う
         - プロセス開始後にRegionのloadを行う
         
- HDFS関連のプロセス再起動
    - NameNodeのプロセス再起動
        - NameNodeのフェイルオーバも行う
    - DataNodeのプロセス再起動

- YARN関連のプロセス再起動
    - ResourceManagerのプロセス再起動
    - NodeManagerのプロセス再起動
    - HistoryServerのプロセス再起動

# 前提条件

- CDH5のクラスタのみ対象
- NameNodeがHA化されていること

# ローリングリスタートスクリプト

gitで公開しているので、興味のあって実験できる環境を持っている方は動かしてみてください。
インストール方法については、READMEを参照してください。

[ローリングリスタートスクリプト](https://github.com/Eisuke-Umeda/hbase-rolling-restart)

※ 残念ながら動作保証はできません。自己責任でお願いします。

# おわりに

Cloudera Manager APIの活用方法の一例として、自作のローリングリスタート機能を紹介しました。
もうちょっと頑張れば、ローリングアップグレードもできるようになるんじゃないかと思っています。
今後もいろいろ試していこうと思います。
.gitconfig にユーザー名とパスワードのエイリアスを登録する


githubにpushするたびにユーザー名とパスワードを入力するのは面倒です。
originのurlを以下のように登録することで入力を回避しましょう。

```shell-session

git remote set-url origin git://<userid>:<passwd>@github.com/user/myapp.git`

```

だいぶ楽になります。Bitbucketなどでも同じ記法が使えます。
しかし、新しいgithubレポジトリを作成するたびに上記のコマンドを打つのは面倒です。
`git config`で`.insteadOf`を使うとエイリアスをconfigに登録することができます。

```shell-session

git config --global url."https://<userid>:<passwd>@github.com".insteadOf "https://github.com"

```

シェルなのにチェイン構文みたいで独特ですね。
.gitconfigにパスワードが書かれるので、ドットファイルをオープンリポジトリで管理している場合はパスワードは設定せずにユーザー名だけにしておきましょう

```shell-session

git config --global url."https://<userid>@github.com".insteadOf "https://github.com"

```
開発作業用クラシックBGMについて考えてみる


この記事は[作業用BGM(個人or社内) Advent Calendar 2015](http://qiita.com/advent-calendar/2015/bgm)の23日目です。

投稿日が一日遅れました。ごめんなさい！

***

開発をする上で作業用BGMの存在は非常に大きいと思います。でも、そこにクラシック曲を使用している方ってあまりいないのではないのではないでしょうか。完全に僕の勝手な思い込みです。はい。

せっかくなので、作業用BGMとして使えそうなクラシック曲を開発のシーンごとに大真面目に考えてみることにしました。

出来るだけメジャーどころから、数曲ご紹介することにします。


# 作業開始時に聴くBGM

開発作業の開始時にスムーズにエンジンをかけるためには、まずは指が自然と動いてしまうようなBGMを聴きたいですね。指を動かして叩くものといえばキーボードですが、クラシック音楽にもキーボードは登場します。

そう、ピアノです。

## ベートーヴェン ピアノ協奏曲第5番「皇帝」

https://www.youtube.com/watch?v=X-grVMQXLa0

プログラミングって常にキーボードを叩いてる訳ではなく、書いては考え、書いては調べ、という形で書く時と書かない時が交互にやってくるものですよね。そう考えるとただのピアノ曲よりは他の楽器と切り変わりながらの演奏となる協奏曲が適しているように思います。

中でも最初から大きな盛り上がりを見せるこの曲は最適です。開幕のピアノソロに合わせてとりあえず手を動かして、弦楽にバトンタッチしたらその日の実装方針を考えましょう。

個人的には18:15あたりからのホルンとピアノの絡みが大好きです。


# テスト駆動開発をするときのBGM

テスト駆動開発はテンポが大事。ユニットテスト作成→実装→リファクタリングの流れをいかに小気味よく回していけるかが勝負です。

曲の節目がはっきりと、定期的に訪れる曲が良いですね。

## ラヴェル「ボレロ」

https://www.youtube.com/watch?v=RGZnE-tblHY

メロディの定期的な繰り返しと言えばこの曲。様々な音が折り重なって最終的に盛大な成果物が生まれていくあたりも、まさしくプログラミング向きと言えるでしょう。

なお、リンク先のパリ音楽院管弦楽団の演奏は個人的に最高の名演です。特に1:55過ぎからのバソンの音！一般的に用いられるファゴットとはまた違う、美しい音を奏でています。うっとり。


# デスマーチを乗り切るためのBGM

プロジェクトが炎上してどうしようもない時ってあると思います。そんな時には心に勇気を与えてくれるような、そんなBGMが欲しくなりますよね。

## シベリウス 交響詩「フィンランディア」

https://www.youtube.com/watch?v=ilvcobXhdqc

帝政ロシアの圧政下にあったフィンランドの独立へ向けた闘争と勝利をイメージして書かれたと言われるこの曲は、金管メインの深い絶望から始まり、そして弦楽による長い苦しみが訪れます。

それに耐えて耐えて、遂に4:00前後からの勇ましい旋律をもって立ち上がり、6:10からの小さくはあるが、確かにそこある希望を見出していく。まさにデスマーチを乗り越えるのにふさわしい曲と言えるでしょう。


# クラシック音楽を聴いてみませんか？

世の中には多彩な音楽が溢れていますが、クラシック音楽ほど多くの顔を持つジャンルは無いと思います。楽曲の多彩さもそうですが、演奏者・指揮者によって同じ曲でも全く違う聞こえ方をすることもあります。（この辺は面白い比較動画がYouTubeにたくさん挙がっているので聴き比べてみると良いでしょう）

そもそも「クラシック」の1ジャンルにあれだけ長くの音楽の歴史を詰め込んでしまうのが間違いでもあるのですが・・・。

何から聴いたら良いかわからない人向けに、オススメの聴き広げ方を二種類ご紹介します。といってもごく普通の方法ですが。

* 好きな曲を1曲見つけて、同じ作曲家の曲をひたすら聞く。そこからその作曲家に影響を与えた人と、その作曲家から影響を受けた人に手を広げていく。
* 好きな楽器を決めて、協奏曲を色々と聞く。そこから交響曲などへ手を伸ばし、全体の中でその楽器が活躍するシーンを見つけることに喜びを見出す。

ちなみに僕は前者で、交響曲の父と呼ばれるハイドン大先生が大好きでした。交響曲104番は神。


# 余談：僕が普段聴いてる作業用BGM

ところで色々語ってるお前は普段一体何聴いてるんだ、という話ですが、 **ぶっちゃけゲームミュージックしか聴いてないです。**

最近のおすすめは浅野隼人先生の四文字熟語シリーズでしょうか。

紫電清霜
https://www.youtube.com/watch?v=RUjFC_jMr-A
雲烟飛動
https://www.youtube.com/watch?v=WUhAKVY2DMg

あとコーディングで乗ってる時は目黒大明神の激しめの曲を聴きます。
YouTubeじゃないですがアバタールチューナーのバトルBGMとか。
http://www.nicovideo.jp/watch/sm2423971

お後がよろしいようで。
Titanium AppからGoogleのAPIを叩いてユーザのdisplayNameを取得してくる


きっかけ
--
最近あまりTitaniumを触っていなかったのですが，某Titaniumおじさんから[サンタさん](https://santatracker.google.com/?hl=ja#tracker)が日本に到着するまでにTitanium AppからGoogleのAPIを叩いてdisplayNameを取得してほしいと言われた(2015/12/24 18:00ごろ)のがきっかけです．

ユーザ情報を取得してくるためのURL
--
決め打ちで一人のユーザの情報を取得してくるだけなら`https://www.googleapis.com/plus/v1/people/123456789?key=apiKey`のようにユーザIDとGoogle Developers Consoleで作ったAPI keyを書いておけば取得してこれます．
しかし，今回は決め打ちではなくアプリ内でログインしたアカウントの情報を取得してきたかったので`https://www.googleapis.com/plus/v1/people/me?access_token=hogehoge`とて，ログインしているアカウントの情報を取得してこれるようにしました．
後者ではなぜか`key=apiKey`がいらないらしいです．後でいらない理由を調べてみようかなと思います．

お借りしたライブラリ
--
流石にログインAPI叩くところからやり始めるとサンタさんが日本を通り過ぎてしまうと思ったので調べてみたら，GitHubに[ejci/Google-Auth-for-Titanium](https://github.com/ejci/Google-Auth-for-Titanium)なるライブラリがあったのでありがたく使わせていただきました．

書いたソースコード
--

そこまでガリガリと書いたわけでもないのですが，とりあえず `app/controller/index.js` の中身を載せておきます．
まあ，ほとんど[ejci/Google-Auth-for-Titanium](https://github.com/ejci/Google-Auth-for-Titanium)のreadmeに書いてあることをそのまま書いただけなんですが...^^;

```javascript:app/controller/index.js
var GoogleAuth = require('googleAuth');
var googleAuth = new GoogleAuth({
  clientId: 'CLIENT-ID', /* Google Developers Consoleで発行されたクライアントIDをここに */
  propertyName: 'googleToken',
  scope: [
    "https://www.googleapis.com/auth/plus.login",
    "https://www.googleapis.com/auth/plus.me",
    "https://www.googleapis.com/auth/userinfo.profile",
  ],
});

var url = "https://www.googleapis.com/plus/v1/people/me";

$.button.addEventListener('click', function(){
  googleAuth.isAuthorized(function(){
    getDisplayName(function(displayName){
      alert(displayName);
    });
  }, function(){
    googleAuth.authorize(); /* ログインしていないとこっちの処理が実行される */
  });
});

$.index.open();

function getDisplayName(cb){
  var xhr = Ti.Network.createHTTPClient({
    onload : function(e) {
      cb(JSON.parse(this.responseText).displayName);
    },
    onerror : function(e) {
      Ti.API.debug(e);
    },
    timeout : 5000
  });
  xhr.open('GET', url + '?access_token=' + googleAuth.getAccessToken());
  xhr.send();
}
```

View側は`alloy new`で生成された`index.xml`の中の`Label`の`id`を`button`に変更しただけなので省略します．

おわりに
--
なんとかサンタさんが来る前にプログラムは書き終えられました．(2015/12/24 20:00ちょいすぎ)
が，この記事を書いている間にサンタさんは日本を通り過ぎてしまいました．あー悲し．

今回は書いていませんが，コードを書く前に色々と準備が必要です．例えばGoogle Developers Consoleでプロジェクトを新規作成して，iOSのBundle IDを発行したりとかとか...
ただ，そういったのは探せば日本語の記事が結構あるのでそちらを見てもらえればと思います．[こちら](http://www.notice.co.jp/archives/3759)とかとか．
Dart x Bridge で、Webサービス を作成してみよう。

Bridge というイケてる子がリリースされたらしい。

https://github.com/dart-bridge/framework
http://dart-bridge.io/
https://medium.com/@emilniklas


# Bridge は　Ruby and Rails、Django のようなもの
* Server side framework
* Host SPAs and REST APIs
* Deliver classic websites
* Host command line application
* Decoupled Service Architecture
* Reflection Based Dependency Injection
* Realtime CLI engine
* Build-in libraries

Ruby and Rails , Django 的なものを、Dartで提供します。

また、Dartを使うので、クライアントサイド、サーバーサイドも
全て同じ言語で書くことができますね。Dartは便利ですね。


# 始めよう
https://www.youtube.com/watch?v=92IXvGN6tdo
Youtubeの動画の中で、その場でチャットアプリ作っています。

これを、訳そうかとも思ったのですが、今回はHello Worldだけ。
http://dart-bridge.io/docs/hello-world
を試してみた。

```
$ pub global activate new_bridge
$ new_bridge demo_chat
$ cd demo_chat/
$ dart bridge
=start
=watch
```

http://localhost:1337にアクセスすると、
![スクリーンショット 2015-12-24 21.56.33.png](https://qiita-image-store.s3.amazonaws.com/0/54192/7635be0b-3801-5a3c-2128-7f4df96d435d.png)

というページが表示されます。

```
#別Window
$ emacs ./lib/main/main.dart
library main;

import 'package:bridge/bridge.dart';
import '../app.dart';
part 'pages_controller.dart';

class Main {
  SkyIsTheLimit skyIsTheLimit;
  PagesController controller;

  Main(this.controller, this.skyIsTheLimit);

  routes(Router router) {
    router.get('/', (){return "Hello";});
  }

  tether(Tether tether) {
  }
}
```

とすると、以下のように表示されます。
![スクリーンショット 2015-12-24 22.25.18.png](https://qiita-image-store.s3.amazonaws.com/0/54192/7c01e509-4d93-f589-2890-e1652b3b91be.png)


※ watchを指定していると、変更が自動で反映されます。


# 感想
申し訳ありません。
本文は、「Hello World」を試しただけでした。
公式の"Hello World"を読むのと大差ないですね。


もう少しこった事をして、せめて、「チャットアプリをさらっと作るみたいな事」をしたかったのですが、Advent Calender の期限に間に合わないので、諦めました。

ごめんなさい。

まぁ、Dartから離れてしまった人とかに、こんな動きがあったのかー。
的なのを感じでもらえれば良いかな。


<br>
<br>
-------
Kyorohiro Work
http://kyorohiro.strikingly.com/
Atomで透過ウインドウにする

デフォルトでは設定できないが、ソースコードからビルドすることで可能。

**手順**

(1) Githubの[リポジトリ](https://github.com/atom/atom.git) から clone する。

```
$ git clone https://github.com/atom/atom.git
```

(2) atom-window.coffee を編集。場所は ```src/browser/atom-window.coffee```。
constructorの中を以下のように編集する。

```coffeescript

    options =
      frame: true
      transparent: true
      show: false
      title: 'Atom'
      'web-preferences':
        'direct-write': true
```

```frame: false``` にしてもいいが、バグがでやすくなるので注意。

(3) そしてビルド。

```shell-session

$ ./script/build
```

ビルドが終わるまでしばし時間がかかるので待機。もしかしたら python のバージョンが 2.7.6 じゃないとビルドできない依存パッケージがあるかもしれないので、もしエラーがでたら```$ pyenv local 2.7.6```などで対処。

(4) ビルドが終わると、 ```/Applications```フォルダに Atom.app が入っています。アイコンの色はキレイな青色。

(5) これで背景透過できるAtomは手に入ったので、後は自分でテーマ less を作るなり、編集するなりすればOK。```background-color```では透過できないところもあったので、そこは```opacity```を設定しています。

```css
/* 一部抜粋 */

html, body, atom-workspace, atom-pane-container atom-pane {
  background: rgba(0, 0, 0, 0.25) !important;
}

atom-text-editor, :host {
  background-color: rgba(0, 0, 0, 0.25) !important;
}

atom-panel.left {
  background: rgba(0, 0, 0, 0.5);
  opacity: 0.75;
}

.tab-bar {
  opacity: 0.9;
}
```

(6) 下記の画像のようにできました。
![Screen Shot 2015-12-24 at 22.36.33.png](https://qiita-image-store.s3.amazonaws.com/0/2171/a5dbe626-815d-e320-e537-d12f71d53204.png)
Rubyコーディングアンチパターン

## アンチパターンとは？
人間が読みやすいコードを書く為に、避けるべき書き方

## なぜアンチパターンを定義しておく必要があるのか？

###Rubyは書き方の自由度が高い言語 = 同じ処理でも人によって書き方がバラバラ = 読みずらい！


を防ぐ為。

## 引数を囲む括弧を省略しない。
```
#悪い
dog  = Dog.find 101

#良い
dog  = Dog.find(101)
```

##  and、or、not を使わない
論理積: ==, and
論理和: ||, or
否定: !, not

やっていることは同じだが、書き方によってはインタプリタの解釈が異なってしまう場合がある。

```
#&&の場合
result = 1 && 2

puts result # => 2
#result = (1 && 2) と解釈された

#andの場合
result = 1 and 2
puts result # => 1

# (result = 1) and 2 と解釈された
```

```
object = 'BAR'
foo = 'FOO'
bar = 'BAR'

#&&の場合
if object.eql? foo && bar
# この節は実行される
end

#andの場合
if object.eql? foo and bar
# この節は実行されない
end
```

## クラス変数を使わない
@@valiable: クラス変数
@valiable: インスタンス変数
valiable: ローカル変数

``` クラス変数を使った例
class Foo
# クラス変数は宣言(代入)を行っておく必要がある
  @@variable = nil

  def self.value
    @@variable
  end

  def self.value=(value)
    @@variable = value
  end
end

Foo.value # => nil
Foo.value = 1
Foo.value # =>1

class Bar < Foo #サブクラス
end

Bar.value # => (1 スーパークラスFooの影響を受けてしまう)
Bar.value = 2

Bar.value # => 2
Foo.value # => (2 サブクラスBarの影響を受けてしまう)

```

``` インスタンス変数を使った例
class Foo
  def self.value
    @variable
  end

  def self.value=(value)
    @variable = value
  end
end

Foo.value # => nil
Foo.value = 1
Foo.value # =>1

class Bar < Foo #サブクラス
end

Bar.value # => nil
Bar.value = 2
Bar.value # => 2
Foo.value # => 1
```

## Enumerableモジュールのメソッドの別名

###Enumerableモジュールとは？
Rubyにおいて繰り返し処理のメソッド群

そのなかでも、別名が付けられているものがある。 あくまでも別名が付いているだけなので、どちらを使っても処理に違いはありません。具体的には次の4種。

・map と collect
・reduce と inject
・find と detect 
・find_all と select

動作は同じだが、チームもしくはPJ内でどちらを使うべきかを決めておくと、ベター！

## 複数行の文字列の連結
長い文字列リテラルを記述する際、1行が長くなりすぎるとソースコード上で読みづらくなるため、複数行に分けて記述することがあります。

文字列リテラルを連結する方法はいくつかある。

```例
string = 'loooooooooooooooooong ' +
'text'

string = 'loooooooooooooooooong ' <<
'text'

string = 'loooooooooooooooooong ' \
'text'
# '\'はメソッドではない。
```


## 複数行のメソッドチェインのドット位置
```
#改行後の行頭にドットを置く場合
string.downcase
      .gsub(' ', '_')

#改行前の行末にドットを置く場合
string.downcase.
       gsub(' ', '_')
```

### 改行後の行頭に置くメリットとデメリット
**メリット**
・ソースコードを上から下にざっと眺めた際の可読性に優れる
**デメリット**
・コードをirbやpryなどにコピー&ペーストした際に、1行目のみ実行されてしまい、後続の行がエラーになってしまう。

### 改行前の行頭に置くメリットとデメリット
**メリット*
該当の行を単独で読んでいるときに、行末まで読んだ段階で次の行を見なくともメソッドチェインしていることがわかる。

## おまけ
**スタイルガイド**
・[Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide)
・[Cookpad](https://github.com/cookpad/styleguide/blob/master/ruby.ja.md)
・[Github](http://qiita.com/edwardkenfox/items/33bfadd5fe7c10b9acc5)

**Ruby Style Guideに則しているかをチェックしてくれるツール**
[RuboCop](http://batsov.com/rubocop/)