OmniAICreator/Qiita-1.07M huggingface dataset:
Luaであけましておめでとうございます！

あけましておめでとうございます。
毎年、適当な言語を選んで、あけましておめでとうメールを送っています。
今年は、Luaにしてみました。

## 環境

* CentOS Linux release 7.1.1503 (Core) x86_64
* lua-5.1.4-14.el7.x86_64
* lua-socket-3.0-0.10.rc1.el7.x86_64

## インストール

```shell-session
$ sudo yum install lua lua-socket
```

## コード

```lua

local socket = require 'socket'
local smtp = require 'socket.smtp'

Mail = {}
function Mail:send(name, to)
   local mesgt = {
       headers = {
            to = to,
            subject = "I wish you a Happy new year 2016!",
            ["Content-Type"] = 'text/plain; charset="utf-8"'
       },
       body = string.format("%s\n\n%s", name, self.body)
   }

   local ok, err = smtp.send {
       from = self.from,
       rcpt = to,
       source = smtp.message(mesgt),
       user = self.user,
       password = self.password,
       server = self.server,
       port = self.port
   }
   return ok, err
end

function Mail.new(server, user, password, port)
   local obj = {
     server = server,
     user = user,
     password = password,
     port = port
   }
   return setmetatable(obj, {__index = Mail})
end

m = Mail.new("smtp.example.com", "username", "password", 587)
m.from = "dharry@example.com"

emails = {
  {"bressler", "bressler@example.com"},
  {"scorpio", "scorpio@example.com"},
  {"chico", "chico@example.com"},
}

m.body = [[
2016年01月01日になりました。
あけましておめでとうございます。
]]

for key, val in pairs(emails) do
  name = val[1].."さん"
  email  = val[2]
  print(email)
  print(name)
  ok, err = m:send(name, email)
end
```
D + SDL2 + OpenGL3 + Assimp3 でD言語くんを描く

![Screen Shot 2016-01-01 at 2.29.13 AM.png](https://qiita-image-store.s3.amazonaws.com/0/3735/43db0080-ff06-63cf-46f7-9ab35faf4ccb.png)

# D言語でD言語くんを描く

[D言語くんAC](http://qiita.com/advent-calendar/2015/d-man)が盛況でしたが、D言語でD言語くんを描画した人があまりいなかったようなので、やってみました。

## ソースコード

https://github.com/outlandkarasu/ddoom

## コンセプト

Blenderで作ったD言語くんのモデルデータを読み込んでGLSLで表示しています。

ライブラリは以下を使用しました。

* SDL2(derelict)
* OpenGL3(derelict)
* Assimp3(derelict)
* gl3n(線形代数計算用)

## 言い訳

いろいろあって年明けまで引っ張ってしまいました。ごめんなさい。

あと、ボーン変形アニメーションもAssimpで読めているので技術的にはできるはずなのですが、実装にはまだまだ時間が掛かりそうなので諦めました。

プロジェクト名がDDoomとなっているのは、本当はD言語くんが敵キャラとして出てきてプレーヤーを瞬殺するDoomクローンにしたかったためです。
(D言語くんは穴が空いていて当たり判定が無いので、FPSでは最強だと思われます)

## 感想など

Assimpが思いのほか使いやすかったですが、最新のBlenderのファイルの読み込みには多少不具合があるようです。
(マテリアルを複数持つメッシュがおかしくなる)
今回はobjやfbxに変換して表示しました。

D言語らしい事はあまりできていないのですが、Assimpのノードを読み込む部分でalgorithmが大活躍でした。
また、ボーン情報をOpenGLのバッファに渡す部分でstd.experimental.allocatorを使用しています。
std.allocatorがあれば一時バッファの管理が簡単にできて、ゲーム用途で役に立ちそうですね。

D言語らしくGLSLをコンパイル時に生成したり、逆にGLSLソースのuniform変数や頂点属性をパースして自動でプログラムクラスを定義できたりすると便利かもしれません。技術的には十分可能なはず。

今回でとりあえずD言語でモデルデータを表示するサンプルができたので、何か作ってみたい人は適当にいじってみてください。

## 参考サイト

http://www.opengl-tutorial.org/
http://ogldev.atspace.co.uk/
http://assimp.sourceforge.net/lib_html/index.html
Homebrew-caskの移行手順

Homebrew-caskでskypeをインストールしようとしたらエラーが出ました。

    brew cask install skype
    Error: Cask 'skype' definition is invalid: Bad header line: parse failed
    
公式によるとcaskはHomebewに含まれるようになったとのことです。
http://caskroom.io/
https://github.com/caskroom/homebrew-cask

早速Githubに記載されている内容にしたがってcaskを移行させましょう。
```brew uninstall --force brew-cask; brew update```

上手くいきませんでした。。。

    Uninstalling brew-cask... (2,731 files, 1.4M)
    Error: The /usr/local directory is not writable.
    Even if this directory was writable when you installed Homebrew, other software may change permissions on this directory. Some versions of the "InstantOn" component of Airfoil or running Cocktail cleanup/optimizations are known to do this.

    You should probably change the ownership and permissions of /usr/local
    back to your user account.
      sudo chown -R $(whoami):admin /usr/local

どうやら書き込み権限がなくて怒られてる様でした。
念のため`brew doctor`を叩いてみます。

    Warning: The /usr/local is not writable.

    You should probably change the ownership and permissions of /usr/local
    back to your user account.
      sudo chown -R $(whoami) /usr/local

    Warning: The /usr/local directory is not writable.
    Even if this directory was writable when you installed Homebrew, other software may change permissions on this directory. Some versions of the "InstantOn" component of Airfoil or running Cocktail cleanup/optimizations are known to do this.

    You should probably change the ownership and permissions of /usr/local
    back to your user account.
      sudo chown -R $(whoami):admin /usr/local

Warningが2つ出てますが、実質叩くべきコマンドは
`sudo chown -R $(whoami):admin /usr/local`
ですね。

上記のコマンドを実行後、再度
`brew uninstall --force brew-cask; brew update`
を実行します。

    brew uninstall --force brew-cask; brew update
    Updated 1 tap (caskroom/cask).
    No changes to formulae.

無事caskが移行されたようです。
ちゃんとインストールできるか試してみます。

    brew cask install skype
    ==> Downloading https://www.skype.com/go/getskype-macosx.dmg
    ######################################################################## 100.0%
    ==> No checksum defined for Cask skype, skipping verification
    ==> Symlinking App 'Skype.app' to '/Applications/Skype.app'
    🍺  skype staged at '/opt/homebrew-cask/Caskroom/skype/latest' (4911 files, 107M)

これで今までどおりhomebrew-caskが使えるようになりました。
デザインパターン #7 〜Builder〜

第７回目 **Builderパターン**
# 概要
Builder パターンは、同じ作成過程で異なる表現形式の結果を得るためのパターンです。

# サンプル
```Director.java
public class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    public void construct() {
        builder.setName(“YamadaTaro");
        builder.setAge(18);
    }
}
```
```Builder.java
interface Builder {
    public abstract void setName(String name);
    public abstract void setAge(int age);
    public abstract People getResult();
}
```
```PeopleBuilder.java
public class PeopleBuilder implements Builder {
    private People people = new People();
    public void setName(String name) {
        people.setName(name);
    }
    public void setAge(int age) {
        people.setAge(age);
    }
    public People getResult() {
        return people;
    }
}
```
```People.java
public class People {
    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        Builder builder = new PeopleBuilder();
        Director director = new Director(builder);
        director.construct();
        People people = director.getResult();
        System.out.println(people.getName());
        System.out.println(people.getAge());
    }
}
```
# 結果
```
Yamada
18
```
デザインパターン #6 〜Prototype〜

第６回目 **Prototypeパターン**
# 概要
Prototypeパターンは、あらかじめ用意しておいた「原型」からインスタンスを生成するようにするためのパターンです。

- new でオブジェクトを生成すれば Abstract Factory./ Factory Method.
- clone をつかう場合の Prototype.

# サンプル
```Client.java
    private HashMap<String,Prototype> hash = new HashMap<String,Prototype>();
    public void putObject(String key, Prototype proto) {
        hash.put(key, proto);
    }
    public Prototype create(String key) {
        return hash.get(key).createClone();
    }
```
```Prototype.java
interface Prototype extends Cloneable {
    public abstract void message(String s);
    public abstract Prototype createClone();
}
```
```Prototype.java
class ConcretePrototype implements Prototype {
    private String key;

    public ConcretePrototype(String key) {
        this.key = key;
    }

    public void message(String s) {
        System.out.println(s);
    }

    public Prototype createClone() {
        Prototype p = null;
        try {p = (Prototype)clone();}
        catch(CloneNotSupportedException e) {e.printStackTrace();}
        return p;
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        Client client = new Client();

        client.putObject("typeA", new ConcretePrototype('A'));
        client.putObject("typeB", new ConcretePrototype('B'));
        client.putObject("typeC", new ConcretePrototype('C'));

        Prototype prototype1 = client.create("typeA");
        Prototype prototype2 = client.create("typeB");
        Prototype prototype3 = client.create("typeC");

        prototype1.message("message1");
        prototype2.message("message2");
        prototype3.message("message3");

    }
}
```
# 結果
```
message1
message2
message3
```
デザインパターン #5 〜Singleton〜

第５回目 **Singletonパターン**

# 概要
Singletonパターンはそのインスタンスが1つしか存在しないことを保証するためデザインパターンです。
# サンプル
```SingletonObject.java
public class SingletonObject {
    private static SingletonObject object = new SingletonObject();
    private SingletonObject() {
    }
    public static SingletonObject getInstance(){
        return object;
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        SingletonObject object1 = SingletonObject.getInstance();
        SingletonObject object2 = SingletonObject.getInstance();
        System.out.print(object1.equals(object2))
    }
}
```
# 結果
```
true
```
CircleCIに秘密鍵登録しようとしてもエラーでるやつ

何回登録してもinvalidって出る

```id_rsa
-----BEGIN RSA PRIVATE KEY-----
hoge~
ここに秘密鍵があるじゃん？
~fuga
-----END RSA PRIVATE KEY-----
```

それでhogeからfugaまで貼り付けてもダメダメってでて・・・


```id_rsa
-----BEGIN RSA PRIVATE KEY-----
どうやら↑のこれも
↓のこれも全部貼り付けろって事らしい
-----END RSA PRIVATE KEY-----
```

なんじゃそりゃ。俺の２０分返せ。
テストファイル作るときに楽したい


メモメモ程度に。。。

````make_testfile.sh
#!/bin/bash
#
# Creating test file
#
# make_testfile.sh
#
############################################

INFILE="./INFILE.txt"
# INFILEは YYYYMMDD 形式
DIR=""
TIME="1200"

while read line; do
	DT=`echo $line | awk '{print substr($0, 5)}'`
	touch -t ${DT}${TIME} ${DIR}${line}.txt
done < ${INFILE}

echo Success!!
exit
````

````INFILE.txt
20160101
20160102
20160103
20160104
20160105
20160106
20160107
20160108
20160109
20160110
20160111
20160112
20160113
20160114
20160115
20160116
20160117
20160118
20160119
20160120
20160121
````

こんな感じ。

````
MacBookAir:test user$ ll
total 0
-rw-r--r--  1 user  staff  0  1  1  2016 20160101.txt
-rw-r--r--  1 user  staff  0  1  2  2016 20160102.txt
-rw-r--r--  1 user  staff  0  1  3  2016 20160103.txt
-rw-r--r--  1 user  staff  0  1  4  2016 20160104.txt
-rw-r--r--  1 user  staff  0  1  5  2016 20160105.txt
-rw-r--r--  1 user  staff  0  1  6  2016 20160106.txt
-rw-r--r--  1 user  staff  0  1  7  2016 20160107.txt
-rw-r--r--  1 user  staff  0  1  8  2016 20160108.txt
-rw-r--r--  1 user  staff  0  1  9  2016 20160109.txt
-rw-r--r--  1 user  staff  0  1 10  2016 20160110.txt
-rw-r--r--  1 user  staff  0  1 11  2016 20160111.txt
-rw-r--r--  1 user  staff  0  1 12  2016 20160112.txt
-rw-r--r--  1 user  staff  0  1 13  2016 20160113.txt
-rw-r--r--  1 user  staff  0  1 14  2016 20160114.txt
-rw-r--r--  1 user  staff  0  1 15  2016 20160115.txt
-rw-r--r--  1 user  staff  0  1 16  2016 20160116.txt
-rw-r--r--  1 user  staff  0  1 17  2016 20160117.txt
-rw-r--r--  1 user  staff  0  1 18  2016 20160118.txt
-rw-r--r--  1 user  staff  0  1 19  2016 20160119.txt
-rw-r--r--  1 user  staff  0  1 20  2016 20160120.txt
-rw-r--r--  1 user  staff  0  1 21  2016 20160121.txt
MacBookAir:test user$ 
````
gulp + coffeescriptでお気楽フロント開発環境構築

![a1380_000742.jpg](https://qiita-image-store.s3.amazonaws.com/0/107575/8f2d8dc5-91bb-48bf-98d4-8b08f2cc42c1.jpeg)

普段家では開発しない私ですが, あまりにしょうもなくて会社では開発できない小規模アプリやプラグインを開発したいことがあります.

今回, そんな家でのお気楽開発環境としてCoffeeScript + gulpを採用したので, 概要や導入方法をメモりました.

# CoffeeScriptとは？
CoffeeScriptは, AltJSと呼ばれるJavaScriptの高級代替言語(しょっぱいJavaScriptをもっといい感じにした言語)の１つです. AltJSにはTypeScript, Dart, JAXなど他にもいくつかありますが, 今回はお気楽開発ということで一番シンプルに記述できるものを選びました. ちなみに普段の業務では, お気楽とは程遠いGoogle Closureを利用しています.

AltJSに共通するのは, コンパイル後にJSを出力する点で, ブラウザは結局出力されたJSを利用します. ちなみにDartだけは, JS出力を残しつつも次世代のWebフロント言語としてJavaScriptを駆逐するという野心を持って開発されていたのですが, 2015年3月にそれを諦める宣言がなされました. 残念ですね.
http://news.dartlang.org/2015/03/dart-for-entire-web.html

# gulpとは？
Node.jsベースのビルドツールです. CoffeeScriptやSassをコンパイルしたりlintしたり, jsをまとめて圧縮したりできます. Gruntと同じようなものですが, ビルドスクリプトが直観的で分かりやすく, フットワークが軽いので選びました.

# 開発環境構築
## Node.jsのインストール
gulpを利用するためにまずNode.jsをインストールします.
https://nodejs.org/en/

## プロジェクトの作成
下記のような構成で作成します.

- build/js
 - app.min.js  -> ビルド成果物
- lib/js -> Jquery等の3rdParty置き場
- src/js
 - app1.coffee -> アプリコード1
 - app2.coffee -> アプリコード2
- package.json -> Node.js設定ファイル
- gulpfile.coffee -> gulp設定ファイル
- index.html -> テスト用HTMLファイル

## gulp用ライブラリのインストール
```bash
# 基本セット
npm install --save-dev gulp gulp-coffee
# 圧縮用
npm install --save-dev gulp-concat gulp-uglify gulp-sourcemaps
# エラー処理
npm install --save-dev gulp-plumber gulp-notify
# その他ユーティリティー
npm install --save-dev gulp-util run-sequence
```

## gulpのビルドスクリプトの記述
gulpfileはCoffeeScriptで記述します. CoffeeScriptの基本文法は下記が参考になります.
http://www.buildinsider.net/web/rubyonrails4/0901

```coffeescript:gulpfile.coffee
# ライブラリのロード
gulp    = require "gulp"
coffee  = require "gulp-coffee"
concat  = require "gulp-concat"
notify  = require "gulp-notify"
util    = require "gulp-util"
plumber = require "gulp-plumber"
sourcemaps   = require "gulp-sourcemaps"
uglify  = require "gulp-uglify"
runSequence = require "run-sequence"

# エラー時にGUIでポップアップ表示.
errorProcess = 
  errorHandler: notify.onError "Error: <%= error.message %>"

# CoffeeScriptをJSに変換し, src/jsに出力
gulp.task "coffee", ->
  gulp.src "src/js/*.coffee" #対象ファイル
    .pipe plumber errorProcess #エラー処理
    .pipe coffee() #coffeeをjsにコンパイル
    .on "error", util.log 
    .pipe gulp.dest "src/js/" #出力先

# ビルド物生成
gulp.task "js.build", ->
  gulp.src [ "lib/js/*.js", "src/js/*.js" ]
    .pipe plumber errorProcess
    .pipe sourcemaps.init() # sourcemaps作成
    .pipe concat "app.min.js" # ファイルを結合 
    .pipe uglify() #圧縮            
    .pipe sourcemaps.write "./"　#app.min.js.mapの書き出し
    .pipe gulp.dest "build/js/" #app.min.jsの書き出し

# CoffeeScriptのコンパイルからビルド物生成まで
gulp.task "build", -> runSequence "coffee", "js.build"

# CoffeeScriptファイルに変更があったら, jsを随時ビルド(結合圧縮まですると時間がかかるのでしない)
gulp.task "watch", ->
  gulp.watch "src/js/*.coffee", ["coffee"]
```

## ビルドと監視
gulpタスク実行のため, package.jsonに下記プロパティを追加します.

```json:package.json
{
# ...
  "scripts": {
    "build": "gulp build",
    "watch": "gulp watch"
  },
# ...
}
```

```bash:ビルドと監視
#ビルド
npm run build
#監視
npm run watch
```
gulpをglobal installして直接gulpを蹴る方法もありますが, 環境に依存してくるので上記のようにnpm経由で実行する方が良いです.
Bootstrap でスマートフォンサイトの幅が少しだけ広くなってしまう現象


Bootstrap を使用していて、何故か以下の画像のように、スマートフォンサイトで幅が画面よりも少しだけ広くなってちょっとだけ横スクロールできてしまう現象が発生しました。

![スクリーンショット 2016-01-01 0.53.22.png](https://qiita-image-store.s3.amazonaws.com/0/31613/1fa89248-fde3-3188-b141-e58d818123ce.png "スクリーンショット 2016-01-01 0.53.22.png")


どうやら `form-group` と `container` を組み合わせると発生するようです。

```html
<div class="container">
  <div class="row">
    <form action="#" class="form-horizontal">
      <div class="form-group container"><!-- ここが問題 -->
        <label for="input-name" class="col-sm-2 control-label">おなまえ</label>
        <div class="col-xs-12 col-sm-8">
          <input type="text" class="form-control" id="input-name" placeholder="おなまえ" maxlength="80" required="required">
        </div>
      </div>
```

これを以下のように、`form-group` と `container` を `div` タグで入れ子にすることで回避することができました。

```html
<div class="container">
  <div class="row">
    <form action="#" class="form-horizontal">
      <div class="container"><!-- container と -->
        <div class="form-group"><!-- form-group を分ける -->
          <label for="input-name" class="col-sm-2 control-label">おなまえ</label>
          <div class="col-xs-12 col-sm-8">
            <input type="text" class="form-control" id="input-name" placeholder="おなまえ" maxlength="80" required="required">
          </div>
        </div>
      </div>

```

![スクリーンショット 2016-01-01 0.59.37.png](https://qiita-image-store.s3.amazonaws.com/0/31613/406cede6-97e5-49c0-a427-53231324d812.png "スクリーンショット 2016-01-01 0.59.37.png")
VB.NETで困ったこと（ひょっとしたらいいこと？）

# 以前これではまった
メンバーが書いたコードで、単純化すると以下の様なコードがあってはまったことがあった。

```vbnet:ng_return_value.vb
Function FuncA() as Boolean
  Return -1
End Function

If FuncA() = True Then
  'こちらが実行
Else
  'こっちにはこない
End If
```

コードトレースしても一度目では気づかず、よくよく見なおして判明。
まさか、-1がTrueになるなんてそんなぁ！という私はC/C++出身。

# 以下の書き方には注意

```vbnet:ng_return_value.vb
Module Module1
    Sub Main()
        If (funcBool("10") = True) Then
            ' True
        End If

    End Sub
    Function funcBool(ByVal bVal As Boolean) As Boolean
        Return 0
        Return 1
        Return -1
        Return True
    End Function
End Module
```
これ、funcBool()は、戻り値Booleanで宣言しているのに、
Retrun 0 でも
Return 1 でも
Return -1 でも
エラーにならず、コンパイル（ビルド）が通ります。
もちろん、
Return True
はコンパイル通ります。

また、Boolean値をパラメータに受け取るのですが、
funcBool("10") と文字列でもコンパイルは通ります。
Fertile Forest Model (10/n) ツリー構造の修復

# ツリー構造が破損した際の修復

従来のモデルでは、ツリー構造カラムによる参照整合性が保証されていません。最も簡潔なテーブル設計である「隣接リストモデル」でさえ、親子関係が循環指定される不整合の可能性があります。

FF モデルもこの点では例外ではありませんが、「参照整合性の破損個所」を検索して見つけることができます。これは、他のモデルを圧倒している特徴です。

## Fertitle Forest モデルにおける参照整合性の破損

FF モデルに於けるツリー構造データの破損は、次のふたつのケースに限定されます。

> 1. QUEUE が重複したケース
> 2. 根ノードではない親ノードが削除されて、子ノードの所属ノードがなくなるケース

上記のふたつのケースが招じた個所を、検索して取得できます。検索で特定できるなら、後は PHP や Ruby などのスクリプト言語を使って一列に並べて表示させることで、目視で破損個所を確認できます。参照整合性が破損している部分をハイライトさせるのも容易です。

実例を示すのは、文章で解説すると冗長な上に理解し難いものです。この件については、ライブラリで破損データ表示スクリプトを作成して配布する予定です。(2016年01月01日現在）

## DEPTH の整合性を修復するには

FF モデルでは、 DEPTH の整合性を修復するための UPDATE 文が書けます。事前に SELECT 文を発行してノードの破損状況を取得した後、 UPDAPTE 文一回で修正できます。「隣接リストモデル」には及びませんが、「経路列挙モデル」「入れ子集合モデル」「閉包テーブルモデル」の修正に比べると、圧倒的な簡易さです。

UPDATE 文の定義は、後日まとめる予定です。(2016年01月01日現在）
ES6の新機能: 「let」「const」宣言を調べてみた

JavaScript はES6によっていろいろと機能が充実することになっているのですが、classとかgeneratorとかがよく取り上げられていると思っ立てたので、てっきりこれだけだと思ったのですよ。
まさか他にも機能があるとは。。。

というわけで、あまり話題に登っていないように見える新機能。。。というか新宣言について調べてみました
まさかの記事書きで年越すとは・・・

# 宣言が追加されてた！

JSの宣言文といえば、「var」しかなかったのですが、なんとES6にて、「let」「const」が追加されていたようです。
いまのところ、```'use strict'```を使わないと動きませんでした。

## let ・・・ 「再宣言」が不可

まずは「let」宣言です。
こいつは端的にいうと、「再宣言ができない」宣言です。
簡単な例を以下に示しています。

```
'use strict'

var spam = 12;// 当然よろしい
var spam = 13;// これもオッケー

console.log(spam);//13

let ham = 15;//大丈夫
ham = 17;//問題なし

console.log(ham);

let ham = 12;//こいつはダメ
```

見てわかるように、「var」で宣言された変数は再宣言してもエラーを起こしません。
一方で、「let」で宣言された変数は値を代入しなおしても問題ありませんが、もう一度宣言することは許されていません。
「Identifier 'ham' has already been declared」というエラーメッセージが出てきます。

## const ・・・ 「再宣言」も「再代入」も不可

次にconstですが、これは定数を意味しています。
つまり、「再宣言」どころか「再代入」やってはいけません。
以下にその例を示します。

```
'use strict'

var spam = 12;// 当然よろしい
spam = 13;// これもオッケー

console.log(spam);//13

const ham = 15;//問題なし

console.log(ham);

ham = 17;//だめ
```

これを動かすと、
「TypeError: Assignment to constant variable.」
というエラーが出てきます。

## スコープ

let, constの宣言は、これ以外にスコープについても特徴を持っています。
以下のコードを見てみましょう

```
'use strict'

if (1) {
  var i = 10;
}

console.log(i);//10

if (1) {
  let j = 10;
}

console.log(j);// ReferenceError

if (1) {
  const k = 10;
}

console.log(k);// ReferenceError

let x = 11;
const y = 13;

if (1) {
  console.log(i);// 当然大丈夫
  console.log(x);// これは大丈夫
  console.log(y);// これも大丈夫
}
```

どうでしょうか。
「var」だと、if ブロックの中で宣言しても、その外で使えてしまいます。
ところが、「let」「const」宣言だと、ifブロックの中で宣言した変数・定数を、ブロックの外で使用することはできません。
これは他のブロックでも同じです。

## オブジェクトと宣言

オブジェクトのconst宣言には少しだけ注意が必要です。

```
'use strict'

var a = {one: 1, two: 2};
a.one = 11;// OK
a = 1;// OK
console.log(a);

let b = {one: 1, two: 2};
b.one = 11;// OK
console.log(b);
b = 11;// OK
console.log(b);

const c = {one: 1, two: 2}
console.log(c);
c.one = 11;// OK
console.log(c);
c = 11;// これはエラー
```

例えconstで宣言していても、**オブジェクトの要素に対しては変更を入れることが可能**です。
変数の仕組み上、そうなるんでしょうが・・・もしかしたらハマるかもしれませんな

# まとめ

というわけで、ES6で追加される宣言文「let」「const」について、一通り調べてみました。
どの宣言を使うかは場合によると思いますが、基本的にはconstを使うのが良さそうです。いや、NetBeansとか使っていると、PHPでも「値の再代入はバグのもとです」って警告貰うので。。。
ただし、分岐内で値の代入値が変わるようであれば、letを使うことになりそうです。
varは極力使わないほうが良いように思いました。

class定義の時どうなるかとかあるのですが、そのへんは長くなりそうなので、回を改めようと思います。

arrow関数について書きました
[ES2015の新機能: 関数の新しい書き方「arrow 関数」](http://qiita.com/niisan-tokyo/items/4aec6e01c2c8ffc5fc73)

# 参考
https://medium.com/ecmascript-2015/let-const-35bca3b4a3c6#.17hlgzf8n
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/const
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let
http://techblog.yahoo.co.jp/javascript/nodejs/Node-es6/
Crystal 言語  2016年の初夢

#今年は申年です
愛知県三河 豊田市の北方に[猿投山](https://ja.wikipedia.org/wiki/%E7%8C%BF%E6%8A%95%E5%B1%B1)が鎮座します。　その山麓には[猿投神社](https://ja.wikipedia.org/wiki/%E7%8C%BF%E6%8A%95%E7%A5%9E%E7%A4%BE)が開創されており、申年の縁起で初もうでがにぎわっています。　歴史は意外と興味深く、[ヤマトタケル尊](https://ja.wikipedia.org/wiki/%E3%83%A4%E3%83%9E%E3%83%88%E3%82%BF%E3%82%B1%E3%83%AB)の兄[大碓皇子](https://ja.wikipedia.org/wiki/%E5%A4%A7%E7%A2%93%E7%9A%87%E5%AD%90)が美野（現在の美濃地方(当時は尾張國之三野という地域)）に父12代[景行天皇](https://ja.wikipedia.org/wiki/%E6%99%AF%E8%A1%8C%E5%A4%A9%E7%9A%87)から遣わされて、最期は山頂西宮に埋葬されているという古事記にも登場する古い歴史があります。　少し長くなりますが、その前11代[垂仁天皇](https://ja.wikipedia.org/wiki/%E5%9E%82%E4%BB%81%E5%A4%A9%E7%9A%87)の時代に出雲出身の[野見ノ宿祢](https://ja.wikipedia.org/wiki/%E9%87%8E%E8%A6%8B%E5%AE%BF%E7%A6%B0)という、お相撲を考案し普及させたことで有名なかたが同じ愛知県豊田市野見町に[野見神社](https://ja.wikipedia.org/wiki/%E9%87%8E%E8%A6%8B%E7%A5%9E%E7%A4%BE)で祭られています。　どうもその一族は三川衣と縁があり、住み着いた経緯がある模様です。　豊田市は昔挙母町であった時代があり、その前は拳呂母と呼ばれ、さらにそれ以前　三川の衣という地名（あるいは豪族名(三川衣君という表現が古事記にあります)）であった時代がやはり古事記に残っており、[別分命（おしわけのきみ）](https://ja.wikipedia.org/wiki/%E7%A5%96%E5%88%A5%E5%91%BD)が垂仁天皇の三川(三河）または小治(尾張）出身の妃の一人の子供で、衣(豊田市)に古墳で埋葬されているという地元 [児の口神社](https://ja.wikipedia.org/wiki/%E5%85%90%E3%83%8E%E5%8F%A3%E7%A4%BE)の言い伝えが残っています。　昔から蚕の養蚕が盛んで絹の産地（衣）であったイメージが想像されます。　これらはたぶん紀元４００年よりちょっと前の話と思われます。

長くなりましたが、

#なぜかその猿投山の麓に私はいました
#そして目の前の老猿が2016年申年 [Crystal 言語](http://ja.crystal-lang.org/) がどうなるのかを予想し、集まった猿たちに話していました。
#こんなかんじに
#Rubiniusは Ruby と C++で記述されてるけど、Crystal言語で書き直される [CRubinius]()　プロジェクトが始まるぞ

#CRuby は Cで記述されてるけど、それが Crystal言語ライブラリ構築するFFIが始まって、そののち Crystal言語で書き直される[C*²Ruby]()　プロジェクトが始まるぞ

#そして、CRubyniusと C*²Rubyは統合されて、[Ruby2.99]()(LLVM-JIT)と呼ばれるぞ~

#@\^-*;@

#そうか今年は、とうとう　猿でもわかる[Crystal](http://ja.crystal-lang.org/)　になる年なのか．．．

#ここでふっと我に返り目が覚めましたが、あまりにリアルなヴィジョンでした．．．．

#という [Crystal言語](http://ja.crystal-lang.org/)の壮大な妄想初夢を見たのでした


*この初夢は[Crystal 言語の 2015年を振り返ってみて](http://qiita.com/yahhonob/items/dd115c8ca040c7634a9a) で使われた過去データをもとにAIが勝手予測したものです。
[Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800) の 5 日目の記事　[”Crystal 言語周辺の妄想的雑談”](http://qiita.com/yahhonob/items/d46a737ecadca1813b37)　に続くシリーズでした

#[PyPy](https://ja.wikipedia.org/wiki/PyPy) や[Topaz](http://el.jibun.atmarkit.co.jp/rails/2013/02/5-pythonrubytop-0220.html) が [RPython](https://ja.wikipedia.org/wiki/PyPy#RPython) で記述されているのだから、[Crystal](http://ja.crystal-lang.org/) いつかありえますよね


#Crystal 関連リンク
[これから Crystal を始める方へ: Crystal 日本語情報まとめ](http://qiita.com/pine613/items/7407e56771b504bed82f)　by Pine613 さん

#Crystal コミュニテイ
[Crystal-JP](http://crystal.connpass.com/)
[Crystal 情報交換用 Slack チーム Crystal-jp](https://crystal-jp.slack.com)
[-> 登録：Crystal-jp.slack.com 日本語で Crystal の情報交換を行うチャットルームです。　ご自由にお入りください](http://crystal-jp.pine.moe/)
[Gitter Crystal 情報交換用  Crystal-jp]
(https://gitter.im/crystal-jp/issues)
[Crystalに関する意見や質問、議論などをする場所] (https://github.com/crystal-jp/issues)
テトリスをつくってみました　説明２　tetris.js

時系列に説明ができません（それが一番いいが、思い出せない）
ので、上から順にいきます。

tetris.js

```js


var CANVAS_H = 600, CANVAS_W = 300;
var COLS = 10, ROWS = 20;
var RECT_W = 4;			 //blockShape配列で、テトリスブロックのx座標要素幅
var CUBEUNIT_LENGTH = CANVAS_H / ROWS ; 		// 30px

var INIT_BACKCOLOR = ' white ';


```

SHAPESの一列め（最初の４つの要素に０を入れてます）
tetris16版というのに合わせた回転にしました。



```js

var SHAPES = [
	[0,0,0,0,
	 1,1,1,1],
	[0,0,0,0,
	 1,1,1,0,
	 1],
	[0,0,0,0,
	 1,1,1,0,
	 0,0,1],
	[0,0,0,0,
	 0,1,1,0,
	 0,1,1],
	[0,0,0,0,
	 1,1,0,0,
	 0,1,1,0],
	[0,0,0,0,
	 0,1,1,0,
	 1,1],
	[0,0,0,0,
	 1,1,1,0,
	 0,1]
];

var COLOR = ['red', 'orange', 'blue', 'yellow', 'green', 'purple', 'cyan'
];

```




```js

var TETRIS_BLOCK = [];
(function () {
		for ( var i = 0; i < SHAPES.length; i++) {
		TETRIS_BLOCK [i]= {
			blockShape : SHAPES[i],
			blockColor : COLOR[i],
		};
		}
})();

```

即時関数
[即時関数(function(){ ... })()の別の書き方いろいろ](http://blog.tojiru.net/article/197270788.html)

これは必須学習項目です。

テトリスブロックは、色と形をもっている。ってことで、TETRIS_BLOCKとして組み立てています。



```js
var Board = [];
( function () {
	for ( var i = -3; i < 13; i++) {
		Board [i] = [];
	}
})();

```

Board[ i ][ j ] が　０　ならブロックなし、　１　ならあり

```js

var BoardWithColor;
(function () {
	BoardWithColor = [];
	for (var i = -3; i < COLS + 3; i++) {
		BoardWithColor [ i ] = [];
		for (var j = -1; j <ROWS + 3; j++) {
			BoardWithColor [ i ] [ j ] = [];
			
			Object.defineProperty ( BoardWithColor [ i ] [ j ], 'Board' , {
				
				get () { return Board [this.i] [this.j]; },
				set (value) { Board [this.i] [this.j] = value; },
			});
			
			BoardWithColor [ i ] [ j ].i = i;
			BoardWithColor [ i ] [ j ].j = j;

			
		}
	}
})();

```

ここは3日間悩んだところです。ちょい学習量が多いので、読む速度を落としてください。

BoardWithColorを組み立てています。

BoardWithColor　と　Board[ i ][ j ]

Board[ i ][ j ]に、色情報を加えたものがそれです。

BoardWithColor[ i ][ j ].Board　としたら、　Board[ i ][ j ]　が取り出せる。そうしたかったんです。
これが難問難問。


BoardWithColor[ i ][ j ].Board()
最後が関数になっています。これなら簡単に分かります。だけど、Board[ i ][ j ]　ですよ。なんでおなじ物を参照するのに向こうは関数なしでこっちは関数ありなんだと。ダサイ。ってかなにか術があるはず。

答えは、getterとsetter

以下の二通りがある。

・var obj = {
// プロパティの読み出し用
get propertyName() { /* 関数本体 */ },
// プロパティの設定用
set propertyName(v) { /* 関数本体 */ }
}

・Object.defineProperty メソッド


今見ると、独習javascript」にもひっそりのってる。けど、使いどころとしての書き方が欠けてるからひっかからない。

プロパティの参照で、関数を実行できるようになっている。つまり
BoardWithColor[ i ][ j ].Board()　を
BoardWithColor[ i ][ j ].Board　こう書ける
ようになったんです。

（つまり、関数とは、参照することであり。逆もそう。同じことだったんですね。そう思っても問題ないですね）


2つ目の山にいきます。
読む速度を落としてください。

```js

Object.defineProperty ( BoardWithColor [ i ] [ j ], 'Board' , {
				
				get () { return Board [this.i] [this.j]; },
				set (value) { Board [this.i] [this.j] = value; },
			});
```
最初はこう書いてました。

```js

Object.defineProperty ( BoardWithColor [ i ] [ j ], 'Board' , {
				
				get () { return Board [i] [j]; },
				set (value) { Board [i] [j] = value; },
			});
```

なぜ下でダメか。それは、Board [i] [j]が評価（実行）されるのは、

続く
UE4 で入力周り考察(2)

# 環境
UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 を触ってみて動作を確認する
入力周り考察(1)の続き
http://qiita.com/maprog/items/56c8e6d91b81c74e8f07

# 本文
## 入力管理クラスの確認
アプリケーションで管理している(はず)の入力を管理している場所を探していた所
FSlateApplication クラスを見つけた。このクラスは、各種プラットフォーム毎
に実装しなければならないアプリケーションのフレームワークを抽象化したクラス
のようだ。
メンバ関数を確認してみると PollGameDeviceState という関数がある。察するに
これが各種入力デバイスを、各種プラットフォームの API から取得する関数だと
思われる。という事は、このクラスが各種プラットフォームの入力データを管理して
いる可能性は高い。幸いにしてこのクラスはシングルトンなのでアプリケーション側
からアクセスは簡単にできる。

## FSlateApplication にアクセスしてみる
とりあえず、インスタンスにアクセスして、コンパイルしてみる

[コード]
※ SlateApplication.h　をインクルードする事
const FSlateApplication& rApp = FSlateApplication::Get();

すると、リンクエラーが発生する。
Visual Studio 2015 Express だからか、リンクエラーのメッセージが文字化け
していてはっきりしないが、リンクエラーなのでモジュールが見えていないのだろう。
いつものようにライブラリを追加するのか？と思ったが UE4 のビルドシステムは通常
のアプリケーションと違う為、確認が必要だと思い再び調査を開始

## UE4 のビルドシステム
UE4 のビルドシステムは、どうなっているのだろうか？
コードのホットリロードに対応している事から、エディタで作成したコードはモジュール
化されている事は明白だ。windows の場合は dll として出力されている。
dll 出力の際に、いくつかのビルドシステムが連携している。
とりあえず Build.cs を確認してみると、以下のコードがあった。

[コード]
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

PrivateDependencyModuleNames.AddRange(new string[] {  });

上記コードでは、モジュール作成の際に依存関係を持つモジュールをリンクするものだと
推察される。FSlateApplication にアクセスする場合、ここにモジュールを追加すれば
参照できるに違いない。コードを以下のように修正して、プロジェクトをリビルドしてみた。

[コード]
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Slate" });

PrivateDependencyModuleNames.AddRange(new string[] {  });

無事、リンクエラーを回避できた。


## マウスカーソルの値を取得する
ようやく本題に戻る。
FSlateApplication クラスからマウスカーソルの座標をログとして表示する関数を作成して
みた。アウトプットログにマウスのスクリーン座標が表示されるはず。

[コード]
void Func()
{
    const FSlateApplication& rApp = FSlateApplication::Get();

    FVector2D pos = rApp.GetCursorPos();
    UE_LOG(LogTemp, Warning, TEXT("cursor pos : %f %f"), pos.X, pos.Y);
}


# まとめ
FSlateApplication クラスはアプリケーションを抽象化したクラス。
アクセスするには Build.cs に "Slate" モジュールを追加する必要がある。
シングルトンなので、アクセスできれば後は必要な関数を呼び出すだけで良いようだ。
実際にHTML&CSSを書きながら考えていること

デザインによる表現を大切にしたマークアップをしているときに頭の中で考えていることをまとめました。

#共通のCSSを利用するのかを判断
1.Webページのデザインから情報設計の意図を逆引きし、役割ごとにグループ化します。

2.既存のフレームワークの中から、同じ役割を担っているパーツを探します。
もし、同じ役割を担っているパーツがあった場合は、ビジュアル表現を再現できるかを検討します。
同じビジュアル表現ができる場合にはフレームワークを転用あるいはCSSの一部をオーバーライドします。

3.他のサイトでも使えたら便利なんじゃないかというパーツではないか？
既存のフレームワークにはないが、すべてのサイトで共通して利用することが可能な場合にはフレームワークに新しく実装します。この際には、このサイト特有のデザイン意図を排除した部分のみをフレームワークに実装し、このサイト特有のデザイン意図はCSSをオーバーライドして実装します。

4.他のサイトでは使えないけど、このサイトでは使えるんじゃないか？
別のサイトでの再利用性は低いが当サイト内で再利用する可能性がある場合はサイト内共通パーツとして実装します。id名やclass名を親からの継承から外します。

5.このページでしか使えないパーツ
このページのこの場所にあることに価値があるパーツの場合はこのページ用のid名やclass名で実装します。

上記で、フレームワークを転用するか新規に実装するのかという点と、id名とclass名が決まります。

#ビジュアルと情報の切り分け
##imgタグ？background？
このデバイス上での『ビジュアル表現』なのか、ユーザーに認識してほしい『情報』なのかによって、imgにすべきか、backgroundにすべきかを判断します。
##どの要素にpaddingやmarginを付ける？
デザイナーの意図する余白感、空気感から各要素のトーン＆マナーを設定していきます。
* paddingやmarginはどの要素に持たせるか？
* line-heightの範囲なのかpaddingの範囲なのか？

#今後の更新を想像し、拡張性を与える
* どこがどのように更新される可能性があるのか？
* パーツが増える、減る、書き換えられるに耐久できるか？
* marginはrightとbottomだけを指定することで大枠対処できる。

#具体的にHTMLを記述する
・文言間違えがないか確認しながら入力する。

#実際のHTML&CSSの記述と考える時間のバランス
##順番どおりにやるなら
1. デザインをじっくりと眺めて役割ごとのグループを考える。
2. デザインデータに余白を書き込んで、デザイナーの意図を認識してみる。
3. いくつかのまとまりごとにHTMLとCSSを作成しながら、ブラウザで動作確認する。

正直、１．と２．の時間がマークアップじゃないじゃんという感じはする。けど、実際ここが重要。外部の人間だとここをやってくれないからめちゃくちゃなものやあとから更新できないものが上がってくる。

##実業務としてやるなら
1. デザイン上の文字情報をテキストファイルに書き写す。書き写しつつ、頭の中でマークアップを思考。
2. 書き写し途中で固まった部分はHTML化。そのままCSSもメモ書きで記述。画像もスライス。
3. それがひと段落着いたら１．に戻る。
4. ある程度できてきたら、ブラウザでCSSの動作確認。CSSを本詰めする。
IntelliJの設定を端末間で共有する

<img width="1261" alt="スクリーンショット 2016-08-09 11.45.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/35293/9455a4be-7eea-e184-79ba-a1d973b43a9c.png">

# 目的
IntelliJを複数台の端末に入れていると、キーマップ等を同期したくなります。
この記事では[Setting Repository(GitHub)](https://github.com/develar/settings-repository)プラグインを使って同期する方法を共有します。
（基本的には上記GitHubリポジトリのREADMEを読んでそのまま設定するだけです）
PyCharm/PhpStorm/RubyMine等のJetBrainsの他製品についても同じように設定を共有できると思います（未確認）

【注】Qiita等で例えば[こちらの記事](http://qiita.com/Vexus2/items/ed6e2d0ddebe4e250f28)のようにConfiguration pluginを使った同期方法が書いてありますが、現在はDeprecatedのようです。

# Setting Repositoryのインストール
（製品によっては最初からインストール済の場合もあるようです。ma7ma7pipipiさんよりコメント欄にて教えて頂きました）

[Settings] => [Plugins] => [Browse repositories] => Settings Repositoryで検索

<img width="822" alt="スクリーンショット 2015-12-31 22.33.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/35293/84d3ad14-81d7-4cee-7bad-0f83657ad554.png">

インストール後再起動します。

# 設定
[File] => [Setting Repository]から設定をします。

<img width="1280" alt="スクリーンショット 2015-12-31 22.48.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/35293/970977ff-be3b-a4fb-64be-f4fbd576bad7.png">

共有用のUpstream URLが要求されます。githubのリポジトリが使えるので、空のリポジトリを用意し、URLを入力します。

<img width="1280" alt="スクリーンショット 2015-12-31 22.48.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/35293/f936ace8-d965-b96c-26fa-211e920aecb1.png">

ここでgithubへのusername/passwordが求められますが、トークンを使ったアクセスが推奨されています。
githubでトークンを発行し、**usernameにトークンを入力、passwordは空**でOKを押して完了です。
（githubでのトークンの発行の仕方は[こちら](https://help.github.com/articles/creating-an-access-token-for-command-line-use/)に書いてあります。[Settings] => [Personal access tokens]から作れます。）
<img width="1280" alt="スクリーンショット 2015-12-31 23.05.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/35293/fcf98239-564d-fbe8-845f-f32a96bfdd67.png">

これで設定は終わりです。同じ設定を複数台に行うことで同期が出来ます。

# 同期

同期のタイミングは

> - after successful completion of "Update Project" or "Push" actions,
> - on application exit or project close.

となっています（[GitHub: Setting Repository](https://github.com/develar/settings-repository)より）。

ただ、僕は今のところ他端末の変更（リポジトリ上の変更）がローカルに反映されるためには明示的に[VCS] => [Sync Settings] => [Overwrite Local]してからでないと反映に成功していません。
（変更のレポジトリへの反映には明示的な操作（[VCS] => ...）は必要ないようです）

## 同期がうまくいかないとき...
localのリポジトリの中のkeymapのファイルを直接gitのコマンドで同期させるのも出来ます。
ファイルの場所の[こちらの記事](https://www.jetbrains.com/help/idea/2016.1/project-and-ide-settings.html)にかいてあります。
Macなら ```Library/Preferences/IntelliJIdeaXXXX/settingsRepository/repository``` になります。
Unixコマンド:よく使うもの一覧

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2015/12/31/unix_cmd/)のほうで更新します。

よく忘れるので、思いついたのを書いていきます。

# フォルダ以下にあるファイル名一覧書き出し

下記は、Testフォルダ以下の、[*.jpg]ファイルをlist_jpg.txtに書き出しています。

```:コマンド
$ cd /Users/Test/
$ find . -name "*.jpg" > list_jpg.txt
```

```:出力例(list_jpg.txt)
./test1.jpg
./test2.jpg
```

# フォルダ以下にあるファイルを同じコマンド実行

下記は、Testフォルダ以下の、[*.jpg]ファイルを削除しています。

```:コマンド
$ cd /Users/Test/
$ find . -name "*.jpg" -print0 | xargs -0 rm
```

# バイナリファイル表示

下記は、jpgファイルをバイナリ(16進数)表示しています。
moreとする事により、画面に表示する分のみ表示されるため、もの凄いデータ量を一気に捌かなくても良くなります。
※最初の頭だけ見たいとかに使えます。

| オプション | 説明 |
|:----------|-----:|
| -c | 文字 |
| -h | 16進数 |


```:コマンド
$ cd /Users/Test/
$ od -h test1.jpg | more
```
経験者 ヒアリング フィードバック


○ニアショア作業について○
主にコミュニケーション、情報伝達に関して。
スカイプで進捗報告等を実施。
画面の共有もおこなっている。
ニアショア先の進捗率はスカイプ等の報告によってまかなっているが、
実際の作業度合いなどについて、明確に把握は仕切れていない。
→そのため細かい作業の度合いはニアショア人材の自己報告に委ねる部分が多いので、コミュニケーション面、自己報告が不十分な方の場合こちら側で状況が把握できない事態に陥る。こちら側と認識がずれたまま作業が進む可能性あり。

・地方とこちらの温度差について。
進捗があまり芳しくない状況下での業務に対する意識の差違が若干だが感じられる。
→こちら側と、作業の緊張感が違うように思われる。
・改善・実施したいこと。
業務中の基本的なやりとりはスカイプのチャットであるが、
ニアショア先の現場ともっと一体感、同じ場所にいる感覚が
あった方が良いので音声回線等を常時繋いだままのようにしたりする。
作業の疑問点、細かく共有したい情報について相手側のPCを遠隔操作出きるような
ツール等を活用していくのも一つの手かもしれない。
今後ニアショアを続けていくにあたって、もっと自社社員の割り当てが必要と思われる。

○まとめ
作業での問題としては、情報伝達、ニアショア先とのコミュニケーションが
ほとんどである。
チャットベースであったり、何か細かい粒度で質問、情報共有するとした時になかなか上手く伝わらない事がある模様。
Terraformを用いたネットワーク構築・インストールと基本使い方

# 概要
- Terraformのインストール / 基本の使い方(VPC + subnet作成)までを書きます。

```bash
mkdir ~/install
cd ~/install/

# Mac用はダウンロード用URLが異なるので注意
wget https://releases.hashicorp.com/terraform/0.8.1/terraform_0.8.1_linux_amd64.zip
unzip terraform_0.8.1_linux_amd64.zip
sudo mv * /usr/bin/

# 確認
$ which terraform
/usr/bin/terraform

$ terraform -v
Terraform v0.6.8
```
eclipse mars/neon on mac で lombok インストーラが動かない時の対処法

## はじめに
年末年始の休みで Spring を勉強し直そうかと思い、手元の mac の Java 開発環境の最新化から始めたのですが、思いのほか苦戦したので、メモがてら Qiita に初めての投稿を上げてみます。

## バージョン情報
- Mac OS X El Capitan (10.11.2)
- Eclipse IDE for Java Developers Mars.1 Release (4.5.1)
- lombok 1.16.6

## 困ったこと
どうせだから eclipse 最新版の mars を使おうとしたのですが、 lombok インストーラで eclipse 認識せず・・・

![スクリーンショット 2015-12-31 22.24.44.png](https://qiita-image-store.s3.amazonaws.com/0/19086/cfe3ef4c-4286-b4fe-228f-8b746b866ef1.png)

以前のバージョン（ luna とか）だと、`eclipse.app`という実行ファイルがちゃんと選べるのですが、 mars では、ディレクトリ構成が変更になったようで、`Eclipse.app`という名前のディレクトリの下にいろいろなファイルが配置されています。

## やったこと
ターミナルから、手動で lombok.jar を配置。

```
$ cp <lombok保存ディレクトリ>/lombok.jar <eclipseインストールディレクトリ>/Eclipse.app/Contents/MacOS/lombok.jar
```

eclipse.ini を編集して、 vmargs の配下に下記の記述を追加。

```
$ vi /<eclipseインストールディレクトリ>/Eclipse.app/Contents/Eclipse/eclipse.ini
```

```
-vmargs

... いろいろ設定が書いてある

-javaagent:lombok.jar          ← 追加
-Xbootclasspath/a:lombok.jar   ← 追加
```

これで eclipse を再起動すれば、 lombok が使えるようになっています。

## 参考にしたもの
- https://github.com/rzwitserloot/lombok/issues/864  
- http://stackoverflow.com/questions/22310414/how-to-configure-lombok-in-eclipse-luna

## 2016/08/20 追記
neon でも同じ手順で導入可能でした。
Groongaで学ぶ全文検索 2015-12-18 に参加しました


少し前になりますが、[Groongaで学ぶ全文検索 2015-12-18](https://groonga.doorkeeper.jp/events/35021)に参加しましたのでそのことを書きます。

この回のテーマは 「ドリルダウン（ファセット検索）」でした。

はじめに
--
今回、仕事で20分ほど遅刻してしまいました。ごめんなさい。。
遅刻してしまったこともあって、理解したと自信を持って言えず、須藤さんの目が見れませんでした。。
なので今日は反省文を書きます。ドリルダウンのことは少しだけ書きます。

ドリルダウン（ファセット検索）ってなに？
---
```
先生「ドリルダウンって知ってますか?」
私　「・・・」
先生「どっち？」
私　「・・・聞いたことあるけどよくわかりません」
```
まずはじめに、知ってるふりをしようとしてしまいました。ごめんなさい。。
遅刻した上に知らないなんて言いにくいと思ってしまいました・・・。
　　
　　
「ドリルダウン」とは、「データ集計や分析で用いる手法の一つで、集計範囲を一段階絞ってより詳細な集計を行うこと。（IT用語辞典より）」で、BIとか大量な情報を集計したり分析したりするときに使われるそうです。

私がイメージしやすかったアパレルのECサイトの例をあげてみます。
アパレルECサイトでこんなものがあるとします。

```
> MEN（100）
> WEMEN（100）
> KIDS（100）
```

で、これの「MEN」をクリックすると

```
> MEN（100）
　> アウター（10）
　> トップス（20）
　> ボトム（30）
　> グッズ（40）
> WEMEN（100）
> KIDS（100）
```

「MEN」で絞り込まれた情報を、別の切り口で集計されたものを見ることができたりします。
これはユーザーが商品を探しやすいように、ある切り口で探したいものの条件が用意されており、
さらに段階を絞って詳細な集計情報をみることができるというものです。

データを以下のように持っているとしたら、最初は「性別」で集計したものを表示しておき、「MEN」をクリックした際には「MEN」で絞り込み、「カテゴリー」で集計したものを表示している、というかんじです。


| 性別 | カテゴリー | アイテム |カラー|
|:-----------|------------:|:------------:|:------------:|
| MEN       |        トップス |     セーター     |赤
| MEN     |      トップス |    シャツ    |白
| MEN       |        トップス |     シャツ     |青
| MEN         |          ボトム |      パンツ      |黒
| WEMEN       |       トップス |    セーター    |黒
| WEMEN    |     ボトム |   パンツ    |白
| WEMEN    |     ボトム |   スカート    |青





行指向と列指向（カラム指向）
---
上記のような集計処理をするのがドリルダウンですが、**Groongaでは集計処理に適した「列指向」を採用しています。**

そもそもデータベースには行指向と列指向がありますのでその特徴を比較してみます。



* **行指向**
　- データを行方向のまとまりでもっています。
　- 上記表でいうと「MEN,トップス,セーター,赤」といったまとまりになります。
　- 追加・更新・削除処理が得意です。
　　-　行単位で操作できるため更新・削除時のレコードを特定しやすく、その特定のレコードに対して処理を行えばよいので、更新・削除が得意です。
　　-　追加時も追加したい情報をまとめて追加すればいいだけなので列指向にくらべて追加処理も得意です。
　- 集計処理が苦手です。
　　- データを一行ずつ取り出してみていくため時間がかかります。


* **列指向（カラム指向）**
　- データを列方向のまとまりでもっています。
　- 上記表でいうと「MEN,MEN,MEN,MEN,WEMEN,WEMEN,WEMEN」といったまとまりになります。
　- 追加・更新・削除処理が苦手です。
　　- 各カラムに対して処理が必要なため時間がかかります。
　- 集計処理が得意です。
　　- データがカラムごとにまとまっているため、集計したいデータが隣り合っており、集計処理が早くなります。 
　　- 「性別」で集計する場合「性別」の列をみればいいだけ！




まとめ（反省）
---
* 遅刻をしないこと！！！
* わかっているふりはほどほどに！（わかっているふりをしたせいで結局理解できたことが少なかった・・・せっかくの勉強会なのにもったいない。）
* ツールとかは事前に使えるようにしておく（MacでQiita使おうとしたのですが、MacもQiitaも不慣れでわたわたしてました。。。）
* 遅刻したのに再度説明してくださったりと、いろいろと配慮していただき感謝です。ご迷惑おかけしてすいませんでした(>_<)
* ぎりぎり年内にまとめかけました。今は自分のためのまとめですが、来年は誰かの役に立つような上手なまとめを書きたいです。
* よいお年を！
Skyway iOS SDKをswiftで使うには

Xcode7.2とSkyway iOS SDK 0.2.1で動作確認した方法です。
サンプルがObjective-Cしか公開されていなかったので・・・

# SDKを追加する
SkywayのSDKを追加する

# BridgingHeaderを追加する
- Bridging-Header.hを追加する
- Bridging-Header.hに`#import <SkyWay/SKWPeer.h>`を追加する
- Build Settings -> Swift Compiler -> Objective-C Bridging Headerに`Bridging-Header.h`を設定する

# 必要なライブラリを追加する
- GLKit.Framework
- VideoToolbox.framework
- libsqlite3.0.tbd
- libicurcore.tbd
- libc++.tbd
- libstdc++.6.0.9.tbd

# 設定を変更する
- Build Settings -> Build Options -> Enable Bitcodeを`No`に設定する
- Build Settings -> Linking -> Other Linker Flagsを`-ObjC`に設定する
Reactで発生する`Uncaught Invariant Violation: addComponentAsRefTo(...)`エラーの対応策


つまりはこれ。
> Uncaught Invariant Violation: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).

随分はまってしまったので忘れないようにメモとして残しておきます。
結論から言うとwebpackのexternalsで回避しました。

## バージョン

| モジュール | バージョン |
|-------|---------|
| React | 0.14.5 |
| Webpack | 1.7.0 |
| react-bootstrap | 0.28.1 |
| redux-devtools-log-monitor | 1.0.1 |

## 起因
[react-bootstrap](https://react-bootstrap.github.io/)や[redux-devtools-log-monitor](https://github.com/gaearon/redux-devtools-log-monitor)を`npm install`してwebpackで依存性を解決した際に突然発生しました。

## 原因
リンク先の[jimfb/react-refs-must-have-owner.md](https://fb.me/react-refs-must-have-owner)にある、`2. Multiple copies of React`が理由でした。

### 詳細
いくつか前提条件があります。

* 以下のようにwebpackでreactなどライブラリを(開発時のビルド時間短縮などの目的で)`vendor.bundle.js`と`app.bundle.js`のような形で複数ファイルにビルドしている。

   ```html
   <html>
     <head>
       <!-- reactやjQueryなどのライブラリを個別にビルドして読み込み -->
       <script src="/dist/vendor.bundle.js"></script>
     </head>
     <body>
       <div id="app"></div>
       <!-- 実際の実装は別にビルドして読み込み -->
       <script src="/dist/app.bundle.js"></script>
     </body>
   </html>
   ```
* ライブラリ内部でreactの依存関係をrequireなどで読み込んでいる
  例えば[react-bootstrapのAlert](https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Alert.js)などは、`import React from 'react';`などの様に読み込んでいる。

### はまった理由
`npm ls | grep react`で確認しても複数のreactモジュールを読み込んでいませんでした(だって別に読み込んでいる訳ですし)。

## 対策
webpackの[externals](https://webpack.github.io/docs/library-and-externals.html)を使って、外部モジュールを解決させます。

```javascript
{
  externals: [
    {
      "react": "React",
      "react-dom": "ReactDOM"
    }
  ]
}
```

こうするとビルド結果がこんな感じになります。

```javascript
function(module, exports) {

	module.exports = React;

/***/ }
```

## オチ
内容を整理してこの投稿を書いているときにスレッドを追ってみるとちゃんと[コメント](https://gist.github.com/jimfb/4faa6cbfb1ef476bd105#gistcomment-1650211)されてましたorz...。

以上です。
webpackバンザイ。
ESP-WROOM-02で抵抗けちって動かなかった件


# はじめに
最初のATコマンドを通すまでえらい苦労したのでなにかの参考になればと思います。

# 結論
途中の迷走した経緯は後で書く(長文)として、いきなり結論書いておきます。

3.3Vから抵抗1本でプルアップ必要な端子に接続していましたがこれでは動作しませんでした。
![WROOM02_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/cffaf23d-4331-0196-5ab1-7a70d4ecdeff.png)

このようにプルアップ必要な端子それぞれに抵抗を接続しプルアップしたところ動作しました。
![WROOM02_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/08f9e04f-bc12-4844-bbfa-1af2fdcc6edb.png)

ここから下はつらつらと動かすまでの迷走を書いていますので、興味のない人はすっ飛ばしてください。

# 動かすまでの道のり
twitterとかをつらつら眺めているとちょくちょくESP-WROOM-02が話題に上がっていました。
ちょっと調べると安いしすぐ動きそうだしということで、SwitchScienceさんにESP-WROOM-02ピッチ変換済みモジュール《フル版》を発注しすぐ届きました。
(ついでにmbedボードとUSB-Serial-FTDIも買っておきました。)

はんだ付けは得意なのでピンヘッダーをちゃつちゃっとはんだ付けし、Webに上がっている先人の方々の配線図を見ながらブレッドボード上に組み立てます。

## 1. Mbedから3.3Vをとり、TXD,RXDも制御する －＞ 敗退
mbedから3.3V出ているのでこれでESP-WROOM-02動かせばいいやと思い接続。また送信受信はmbedで115200bpsでシリアル通信するプログラムを書きました。
ドキドキしながらmbed USB接続します。

TeraTerm立ち上げて AT[CR]

あれ？なにも出ないぞ？？？．．．お、GNDつなぐのを忘れてた。mbedとESP-WROOM-02のGNDつないで再度トライ。あれやっぱりダメだ。配線を何回も確認しますが問題なし。mbedのところでTXDとRXDをループさせるとちゃんとTeraTermで応答が帰るのでmbedのプログラムは問題なし。さてどうするか。

## 2. USB-Serial-FTDIから3.3Vをとり、TXD,RXDも制御する －＞ 敗退
mbedと相性が悪いのかな～と思い、USB-Serial-FTDIとWROOMつないでみました。

しかし．．．動きません。

USB-Serial-FTDIのところでループバックさせるとTeraTermで応答が帰ってきます。
ESP-WROOM-02なんか壊したかなぁと思始めました。念のため端子電圧見てみようとテスターでWROOMの端子を当たっていくとなんとなく電圧が不安定です。USB-Serial-FTDIのIC仕様書見るとあまり電流とれないようです。
ググると「ESP-WROOM-02は結構電流食うのでしっかりした電源じゃないとダメ」のような情報を発見しました。

## 3. USB-Serial-FTDIから5.0Vをとり3端子レギュレータで3.3Vへ、TXD,RXDも制御する －＞ 敗退
手持ちの0.5A位とれる3端子レギュレータがあるのでそれを使うことにしました。
USB-Serial-FTDIのジャンパーピンを変えるとVCCに3.3Vでなく5Vが出てきます。
レギュレータを使うようにブレッドボード線を変えてトライします。

でもでも．．．動きません。

一応オシロでTXD,RXD見てみるかと調べると、あれTXD,RXDが5Vになってる？？？
USB-Serial-FTDIの回路図とデータシート見直して判明。ジャンパー設定を5VにするとVCCだけ5Vになると思い込んでいたのですが、TXD,RXDのインターフェースも合わせて5V I/Fになるのでした。

壊したかもしれん。


## 4. USB-Serial-FTDIから5.0Vをとり3端子レギュレータで3.3Vへ、mbedでTXD,RXDを制御する －＞ 敗退
とりあえず電源はこのままで、TXD,RXDを3.3Vにするためにmbedへ。
完全に迷走状態です。この組み合わせにしてもやっぱり動きません。
もうダメかも。と思いつつオシロでいろいろ触ってました。

あれ？電源に妙にノイズが載ってるな？？？。いくらなんでも大きすぎるだろ。
(実際はもっとバラバラとノイズ載ってました。)
![WROOM02_5.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/d3afb8f2-8a3e-c6e4-190e-bd2c5a8d9894.png)

で、プルアップしている端子も触っていくと
なんじゃこりゃー、発振してる！。対策せにゃ。
(実際はもっとめちゃくちゃになまってました。)
![WROOM03_6.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/ebae2c27-495e-bc08-fe3a-8e8d80af34b1.png)


## 5. USB-Serial-FTDIから5.0Vをとり3端子レギュレータで3.3Vへ、mbedでTXD,RXDを制御する。プルアップ抵抗をプルアップ端子ごとに分離 －＞ 勝利
これはプルアップした端子同志でなにか悪影響してるに違いない。ということでプルアップ端子ごとに抵抗を配置するようにしてトライ。

AT[CR]
OK

おおっつ、帰ってきました。
いろいろATコマンドを入れてみましたが問題無いようです。ヤッター(^^)/

# まとめ
+ 電源はしっかりしたものを使いましょう。
+ 抵抗はケチらず1プルアップに1本を配置しましょう。
+ オシロスコープは必須です。一家に一台(^^)。

#
ViewPager+SwipeRefreshLayoutで残像が残るときの対応方法

# 現象
ViewPager内にSwipeRefreshLayoutがある場合、こんなことが起きることがあります。
![SwipeRefreshLayout.gif](https://qiita-image-store.s3.amazonaws.com/0/22848/440e63c9-00d5-3d8d-c956-72819e85dc30.gif)


# 手順
1. スワイプしてリフレッシュする。
2. リフレッシュ中に2ページ以上切り替えて、元のページに戻る。
3. 元のSwipeRefreshLayoutと（上では）ListViewが最前面に表示され続ける。ViewのHierarchy内には存在しない。

リフレッシュ中でなければ、発生しません。

# 現象が起きるソース
最小構成で書くと以下の通り。
ViewPager内にSwipeRefreshLayoutを持つFragmentがいるだけ。
Fragment使ってますが、使わない場合でも発生します。

`SwipeRefreshLayout.OnRefreshListener#onRefresh`内は適当な処理の代わりに5秒後に`SwipeRefreshLayout.setRefreshing(false)`を呼んでいます。

```java:Activity
public class SampleActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_sample);

        ((ViewPager) findViewById(R.id.pager)).setAdapter(new SamplePagerAdapter(getFragmentManager()));
    }
}
```

```java:PagerAdapter
public class SamplePagerAdapter extends FragmentPagerAdapter {

    public SamplePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        return new SampleFragment();
    }

    @Override
    public int getCount() {
        return 3;
    }
}
```

```java:Fragment
public class SampleFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

    private SwipeRefreshLayout mSwipeRefreshLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mSwipeRefreshLayout = (SwipeRefreshLayout) inflater.inflate(R.layout.fragment_sample, container, false);
        mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE);
        mSwipeRefreshLayout.setOnRefreshListener(this);

        final ListView listView = (ListView) mSwipeRefreshLayout.findViewById(R.id.list);
        listView.setAdapter(new SampleAdapter());

        return mSwipeRefreshLayout;
    }

    @Override
    public void onRefresh() {
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(false);
            }
       }, 5000);
    }
}
```

# 対応方法
`Fragment#onDestroyView()`で`SwipeRefreshLayout#removeAllViews()`を呼び出します。

```java:Fragment
@Override
public void onDestroyView() {
    mSwipeRefreshLayout.removeAllViews();

    super.onDestroyView();
}
```
【よいお年を】役立ちシェルスクリプトコマンドを年の瀬にまとめるメモ

2015年も残り数時間になりました。
みなさん、今年もよい一年でしたか？

# きっかけ
- シェルスクリプトの役立つ記事や、シェル芸人の楽しい記事に触れた
- 最近知って役に立ったコマンドを、2015年のQiita納めとしてまとめておきたい

# tldr

TL;DRは、"Too Long; Didn't Read".「長すぎて読んでないよ」の略だそう。
長いmanコマンドを一から読むよりも、
実例とともにコマンドの使い方を示してくれた方が分かりやすい時もあるよね、
ということで、初心者だったり急いでいる人がすぐにコマンドを使えるように、
有志の方々がまとめてくれた「コマンド使用例一覧」とも言えるもの。
[Github](https://github.com/tldr-pages/tldr)からインストールできます。

```:
Node.js client : npm install -g tldr
Python client : pip install tldr
Python client: pip install tldr.py
Go client: go get github.com/pranavraja/tldr or platform binaries
...
C++ client: brew tap tldr-pages/tldr && brew install tldr
...
```
[Webブラウザ上でも](https://ostera.github.io/tldr.jsx)使えるようです。

## 使用例1
「肥大化したログファイルを.gz形式に変換したいけど、tarコマンドのオプションってどうすれば良かったっけ？」

```bash:
$ tldr tar

Archiving utility Optional compression with gzip / bzip

create an archive from files
tar cf {{target.tar}} {{file1 file2 file3}}

create a gzipped archive
tar czf {{target.tar.gz}} {{file1 file2 file3}}

extract an archive in a target folder
tar xf {{source.tar}} -C {{folder}}

extract a gzipped archive in the current directory
tar xzf {{source.tar.gz}}

extract a bzipped archive in the current directory
tar xjf {{source.tar.bz2}}

create a compressed archive, using archive suffix to determine the compression program
tar caf {{target.tar.xz}} {{file1 file2 file3}}

list the contents of a tar file
tar tvf {{source.tar}}
```
「czf」か、なるほど。

## 使用例2
「awkコマンド使いたいけど、区切り文字の指定はどうするんだっけ？」（初心者っぽい質問w）

```bash:
$ tldr awk

A versatile programming language for working on files

Print the fifth column in a space separated file
awk '{print $5}' {{filename}}

Print the third column in a comma separated file
awk -F ',' '{print $3}' {{filename}}

Sum the values in the first column and print the total
awk '{s+=$1} END {print s}' {{filename}}

Sum the values in the first column and pretty-print the values and then the total
awk '{s+=$1; print $1} END {print "--------"; print s}' {{filename}}
```
「-Fで指定できるよね、なるほど。」

# :(コロン)

シェルスクリプトの役立つ記事からの引用ですが、
>: というコマンド(？)を利用すると、何もせずに終了ステータス0(つまり正常終了)を返します。

こういうコマンド(?)があるみたいです。


## 使用例
「バックアップを取ったので、ログファイルを空にしよう」

```bash:
# ファイルを初期化する
: > app.log
```

ちなみに。

```bash:
echo "" > app.log
```
のようにしないのは、ログファイルにログを吐いているアプリサーバのプロセスを奪ってしまわないように
(echoで0バイトにすると、正常にログが出力されなくなり、アプリサーバの再起動が必要になる場合がある)。



# おわりに
みなさん、よいお年を！

# 参考
シェルスクリプトの役立つ記事: [初心者向け、「上手い」シェルスクリプトの書き方メモ](http://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d)
シェル芸人の楽しい記事: [【たのしいな】様々なコマンド達を何も考えずにつないで遊ぶ](http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72)
underscoreコードリーディング（compact）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##compactとは


###[underscorejs.orgのcompact](http://underscorejs.org/#conpact)

こんな説明。
>####_.compact(array) 
>Returns a copy of the array with all falsy values removed.
>In JavaScript, false, null, 0, "", undefined and NaN are all falsy.


```javascript
_.compact([0, 1, false, 2, '', 3]);
=> [1, 2, 3]
```

------------- 
arrayのfalsyな値以外のコピーの配列を返す。
JavaScriptにおいてfalsyとはfalse, null, 0, "", undefined ,NaNのことを指す。


###[underscore.compact](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L462)

コード的にはこのあたり。


```javascript
  // Trim out all falsy values from an array.
  _.compact = function(array) {
    return _.filter(array, _.identity);
  };
```


_.filterを用いて、_.identityの値のみを返却する。
テトリスをつくってみました　説明１　まずどうする？

まず、おったち野郎さん」のプログラムをできる限り盗みます。

ーーーー真似から入る。
一番の近道、そして、挫折しないためにもよいです。これ大事と思います。



一体どこから書きますか？
答えは、どこからかいてもOK。

書いてみないと、先は見えません。全体を考えて」などできません。もしあなたがどうも手につかないとすれば、それにはまっています。

僕は、まずrenderオブジェクトから書きました。

・テトリスのブロックって、なんの情報をもたせればいいんだ？
・描画するとき、2次元配列でやればいい。が、色情報がそれだともてないぞ


いろいろ持ち上がってきます。

とにかく説明を進めたほうがよさそうです。次へどうぞ。