OmniAICreator/Qiita-1.07M huggingface dataset:
mobmapでデータ読み込むするときの注意点

mobmapのデータ読み込み時において、オリジナルデータを読み込む際によくはまりがちなエラーについて。タイムスタンプ（時間表記）に誤りがあることによる読み込みエラー。

例）
（正）2014-02-27 18:54:00
（誤）2014/02/27 18:54:00　　#”-(ハイフン)"ではなく、"/(スラッシュ)"が使われている
（誤）2014-02-27 18:54　　　 #秒が入っていない

Excel等の表計算ソフトで編集を行うと、自動変換で文字が一部削られてしまうことがあるため、注意。編集にはテキストエディタを使うことをおすすめ。
CoffeeScriptでNode.js+Expressを今更ながら始めて見た。


##モチベーション
なんとなく避けてきた感があったのですが笑
最近、周りでCoffeeScript使いが増えて来ていて、めちゃ進められるので今更ながらやってみます。

普段はNode.jsを書いているのでNode.jsをCoffeeScriptで記述していきます。
Node.js+CoffeeScriptといっても調べてるとやはりexpress3系の記事がまだ多いですね。

![](http://i.gyazo.com/57fb406b89b06131feda1e856690f5ad.png)

## 準備
* 公式サイトはこちら http://coffeescript.org/

### インストール

* 普段Node.jsを使っている人なら以下のコマンドでインストール出来ます。

```
$ npm i -g coffee-script
```

### 今回の環境

* Node.js: v0.10.35 (←アップデートしてみた)
* CoffeeScript: v1.8.0
* express: v4.10.6


##実装

とりあえずexpressをインストールしておきます。

```
$ npm i express
```

* メインのapp.coffeeを記述

```app.coffee
app = require('express')()
http = require('http').Server(app)
port = 3000

app.get '/', (req, res) ->
  res.sendfile 'coffeeTest.html'

http.listen port, ->
  console.log "listening on *:", port
```

* 表示するhtmlファイルを作る。

```
$ echo 'hello coffee' > coffeeTest.html
```

###実行

```
$ coffee app.coffee
listening on *: 3000
express deprecated res.sendfile: Use res.sendFile instead app.coffee:11:16
```

* http//localhost:3000 にアクセスして確認

![](http://i.gyazo.com/3b8e6c9676e1db38bf2096b498eaacfc.png)

## まとめ
かなりカンタンに書けますね。
毎回コンパイルする必要があるかと思っていたのですが、coffeeコマンドで直接Node.jsを実行出来たんですね。
もっと応用出来るようにCoffeeScriptで記述頑張ってみます。

## 比較(蛇足)

* 元にしたapp.js

```app.js
var app = require('express')();
var http = require('http').Server(app);
var port = 3000

app.get('/', function(req, res){
  res.sendfile('coffeeTest.html');
});

http.listen(port, function(){
  console.log('listening on *:',port);
});
```

* CoffeeScript(app.coffee)からコンパイルしたapp.js

```
// Generated by CoffeeScript 1.8.0
(function() {
  var app, http, port;

  app = require('express')();

  http = require('http').Server(app);

  port = 3000;

  app.get('/', function(req, res) {
    return res.sendfile('coffeeTest.html');
  });

  http.listen(port, function() {
    return console.log("listening on *:", port);
  });

}).call(this);
```

returnは自動的に追記されるっぽいですね。
callメソッドについてイマイチ理解しきれて無いのですが、即時関数な呼び方っぽいですね。

[即時関数をcall(this)で呼ぶことについて](http://qiita.com/osakanafish/items/7c0240f195f36e66b101)
この辺詳しく解説してくれる人がいるとうれしいです苦笑
[tmlib.js] ManagerSceneでのシーン管理

tmlibのシーン管理についてちょうど数日前に良い方法を知れたので共有しておこうと思います。

# 今までのシーン移動
ほんとはもっとスマートな方法もあるんでしょうが自分はだいたい以下の2パターンくらいでした。

```js
// 直接シーンを指定する。基本はコレ
app.replaceScene(HogeScene());
```

```js
// ちょっと動的にやってみる
var sceneList = {
    "hoge": HogeScene,
    "piyo": PiyoScene,
    "fuga": FugaScene,
}

var sceneName = "hoge";
app.replaceScene(sceneList[sceneName]());
```

なんかイケてない…。

# tm.scene.ManagerScene!?
なんかDocsに謎の存在が！
[tm.scene.ManagerScene - tmlib.js docs]
(http://phi-jp.github.io/tmlib.js/docs/index.html#!/api/tm.scene.ManagerScene)

イマイチ使い方わからないのでちょうど日本語版が出たスタック・オーバーフローで質問してみたらphiさんから直接返答もらえました。
[javascript - tmlibのScene管理について - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/2053/tmlib%e3%81%aescene%e7%ae%a1%e7%90%86%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6?rq=1)

ManagerSceneは名前の通りシーンを管理するもので、どうやらver0.4.0から追加された機能のようです。


## 基本的な使い方

初期化時にscenesにどう遷移させるか指定し、各シーンでpopScene()すれば自動でシーン切り替えができるようです。
この時argumentsに値を指定してあげることで特定のパラメータを各シーンに渡すことができます。
[runstant: ManagerSceneのサンプル](http://goo.gl/c8vEpW)

```js:簡易版サンプルコード
tm.define("MainScene", {
    superClass: "tm.scene.ManagerScene",
 
    init: function() {
        // scenesにどう遷移するか指定してあげる
        this.superInit({
            scenes: [
                {
                    className: "tm.scene.TitleScene",
                    label: "title",
                },
                {
                    className: "HogeScene",
                    arguments: {
                        name: "Game1",
                    },
                    label: "scene1",
                },
                // 更にどんどん追加していける
            ],
        });
    },
});
```

### 遷移先のシーン操作とパラメータの受け渡し
特定のパラメータに値を設定することで好きなシーンへ遷移し、パラメータも渡すことができます。
こちらもスタック・オーバーフローで質問して教えてもらいました。
~~他人の褌で記事を書くって素敵ですね。~~

[javascript - tmlib.jsのManagerSceneによるシーンの遷移先の指定とパラメータの受け渡しについて - スタック・オーバーフロー]
(http://ja.stackoverflow.com/questions/2230/tmlib-js%e3%81%aemanagerscene%e3%81%ab%e3%82%88%e3%82%8b%e3%82%b7%e3%83%bc%e3%83%b3%e3%81%ae%e9%81%b7%e7%a7%bb%e5%85%88%e3%81%ae%e6%8c%87%e5%ae%9a%e3%81%a8%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf%e3%81%ae%e5%8f%97%e3%81%91%e6%b8%a1%e3%81%97%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6)


そのまま使うと初期化時に追加した順でしかシーン遷移しませんがpopScene()時にパラメータを設定すれば次に遷移するシーンを操作することができます。

```js
onpointingstart: function() {
    // nextLabelに値を入れてあげると次はscene2へ遷移する
    this.nextLabel = "scene2";
    this.app.popScene();
},
```

また遷移時に好きなパラメータも渡すことができます。
この時、初期化時に指定したargumentsと同じパラメータを渡すと上書きで渡してしまうので注意です。

```js
onpointingstart: function() {
    // nextArgumentsに値を入れてあげるとパラメータも渡せる
    this.nextArguments = {
        name: "scene!!!",
        fontSize: 32,
    };
    this.app.popScene();
},
```

スタックオーバーフローで回答時にこれ以上ない！ってくらいのサンプルを作ってもらえていたのでパク…そのまま紹介しておきます。
[runstant: http://goo.gl/H7TcpW](http://goo.gl/H7TcpW)



# さいごに
ぶっちゃけシーン管理は始めの直接シーンを指定する方法でも全然問題無いと思います。
ただ各シーンの依存関係を減らし、一括で管理できるManagerSceneを使うといつか幸せになれることがある、かもしれませんね。

## ついでに
tmlibをしばらく使ってませんでしたがバージョンアップが頻繁に行われていて良いですね。
久々にやるかーと見てみると大体便利な機能が複数追加されてます。

さらにrunstantができて気軽に動作確認できて共有もしやすくなりました。
スタックオーバーフローでの質問時にもめっちゃ役に立って便利でした。

### 捨て台詞
今回色々あって諦めたアイマス版のスクフェスを次のtmlib.js Advent Calendarがあれば完成させたいです。
Mongoidを利用してfriendly_idのようにしたい時のgem

```:環境
Rails 4.1
mongoDB 4.0.0
```

## friendly_idとは？
https://github.com/norman/friendly_id

```rb:id
# GET /states/4323454
```

↓ こういうふうにするやつ

```rb:friendly_id
# GET /states/washington
```

しかし、ActiveRecordと連携する為、Mongoidを利用した場合にfriendly_idが作成できない。

## mondoid-slugを使おう

mongoidを利用している場合、以下のmongoid-slugを利用することでfriendly_idと同等の動作が出来た。

https://github.com/digitalplaywright/mongoid-slug

しかも、friendly_idでは専用のテーブルを作成する必要があるが、mongoid-slugでは必要ない。一手間抜いた分、こちらの方が簡単に感じた。
MapDB - とりあえず触る

[MapDB](http://www.mapdb.org/)とは、Javaのコレクションをファイルに永続化してくれたり、DBのようなトランザクションを提供してくれるライブラリです。
なかなか面白いです。なぜか日本語の情報はほぼないですが・・・。
（ちょっとずつ情報載せていければと思います）

# 必要なライブラリ
とにもかくにもMapDB触ってみましょう。
MapDBは、jar（mapdb-X.Y.Z.jar）を一つclasspathに追加するだけで使えます。

# ファイルベースの永続化をする
以下のサンプルは、"testdb"というデータベース（実体はファイル）に、"collectionName"という名前を付けたMapにデータを格納する例です。（"testdb"がDBのインスタンス名、"collectionName"がテーブル名というイメージで良いと思います）
DB#commit のタイミングでファイルに永続化され、DB#rollbackすると永続化されません。

## サンプルコード
```java
import java.io.File;
import java.util.concurrent.ConcurrentNavigableMap;

import org.mapdb.DB;
import org.mapdb.DBMaker;

public class MapDBSample1 {

    public static void main(String[] args) {
        
        // まずは格納するためのDBを作る（すでにあれば使いまわす）
        DB db = DBMaker.newFileDB(new File("testdb"))
                .closeOnJvmShutdown()
                .make();

        // open existing an collection (or create new)
        ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("collectionName");

        System.out.println("#0: " + map);

        map.put(1, "one");
        map.put(2, "two");
        // map.keySet() is now [1,2]

        db.commit(); //persist changes into disk

        System.out.println("#1: " + map);

        map.put(3, "three");

        System.out.println("#2: " + map);

        db.rollback(); // rollback!

        System.out.println("#3: " + map);  // -> rollback後なのでMapにkey=3のデータが無い

        db.close();
    }

}
```

実行結果（初回）

```
#0: {}
#1: {1=one, 2=two}
#2: {1=one, 2=two, 3=three}
#3: {1=one, 2=two}
```

## サンプルコードのおおまかな流れ

* DBの生成（または取得）
 * まずはDMakerというクラスを利用してデータを格納するためのDBを生成しています。（すでに存在するものであれば、そのDBを使いまわします）

```java
DB db = DBMaker.newFileDB(new File("testdb"))
                .closeOnJvmShutdown()
                .make();
```

* 操作するオブジェクトの生成（または取得）
 * 操作したいCollectionをDBから取得します。この際にコレクションの名前を指定します。

```java
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("collectionName");
```

* データの登録
 * 普通のコレクションの操作でデータを格納できます

```java
map.put(1, "one");
```

* Commit / Rollback
 * commitして永続化領域へ格納します。（またはrollbackして永続化しないようにする）

```java
db.rollback();
```


* DBのclose
 * プログラム（アプリケーション）終了時にDBをcloseします

```java
db.close();
```

## サンプルコードを再度実行すると
このプログラムを再度実行すると以下の出力結果が得られます

実行結果（2回目）

```
#0: {1=one, 2=two}
#1: {1=one, 2=two}
#2: {1=one, 2=two, 3=three}
#3: {1=one, 2=two}
```

プログラム開始時点で Mapにデータが格納されているのが分かります。
これは初回に永続化されたデータが復元されているということです。


# まとめ
MapDBを使うととても簡単にJavaのCollectionを永続化できました。
MapDBは他にもいろいろ機能を持っているので、少しずつ紹介できたらと思います。
Perl入学式いってみて

この記事は [Perl入学式 Advent Calendar 2014](http://qiita.com/advent-calendar/2014/perl-entrance) の 23日目です。
昨日の記事は@hoto17296さんの「[プログラミングを教えるということ](http://hotolab.net/blog/perl_entrance/)」でした。教える立場になった分かる景色ですね、それに自分が成長したと実感できる瞬間ですね。

こんにちは、Perl入学式の第3期を受講している@veryblueです。
Webの業界にはいるのですが、数人規模の小さな会社でなんでもやる器用貧乏人です。
Perlには以前からあるシステムで少しぐらいは見てはいたものの、
「できれば動いているものは触りたくない！」って気持ちでした。

独学でいままできていたので、
ちゃんと勉強したいなぁと思っていた時に出会ったのがPerl入学式です。

そんな私がPerl入学式に行ったらどうなったかを話をしようと思います。

## Perl入学式いってみて

### 感じた事

- サポーターさんたちが、楽しんでやってる
- とても優しい
- オープン＆シェア
- 聞ける人がいる事のありがたさ
- アウトプット大事
- Perlに対する愛

個人的な感覚なので、人によっては違う感覚でしょう。
特にサポーターの方々が楽しんで運営しているはとてもよい雰囲気です。


### 受講してみて良かった事

#### 環境構築

最初に環境構築があるのがとても親切です。
独学で詰まると自力で解決するのにすごく労力がかかります。
（勉強したいプログラムで詰まる分にはいいのですが、
　その前の動かす前で詰まると、勉強が始まらず挫折してしまいがちです。）

Macだと環境構築はすごく簡単なので、
Windowsも使っている人は、最初の第1回はWindowsで出た方が勉強になるかと思います。

#### 聞ける人がいるという環境

「分からない事があったら、すぐ言ってください」と、
すぐ聞ける、気軽に聞けるという優しい環境です。
受講生同士でも分からない場所を教えあったりもしてます。

今まで独学でやってきていると、
気軽に聞ける人がいるっていう環境は、とても貴重だと思います。


## そして、どうなったか

### プログラムに興味が強くなった

前は動いてればいいかと考えていたのですが、
今はよりコードがキレイになる方法とか、再利用しやすく作るには・・・とか考えてます。

### 勉強会に行くようになった

Perl入学式以外の勉強会も探して行くようになりました。
他の方が工夫したものを吸収するのに良い場所です。


### 勉強するようになった

前からしてましたけど、加速した感じがします。
いい書籍を教えてもらったりとか。

### twitterを使うようになった

今更・・・って思うかもしれないけど、使ってみたら情報収集に便利だった。


### 会社に貢献

社内のPerlで動いているレガシーなシステムを、
Perl入学式で教わった内容に合わせてコードを書き換えています。
とてもいい貢献になってるんじゃないかと勝手に思ってます。


## できる事からはじめよう

いきなり大きなことは出来ないので、小さなことから、できる事からはじめてみましょう！
1つ1つ工夫をしていくことで、そのうち大きなことも出来るようになるはず！

プログラムを勉強したい方がいましたら、Perl入学式おすすめです！
実際に現地に行けない人でも、GitHubにある資料で勉強することができます。


明日は @kordycloudさんの「[Perl入学式という勉強会の在り方に学んだ事。](http://chickenlion-enqe.movabletype.biz/2014/12/perl-entrance.html)」です！
USBキーボードの挿抜でキーマップを切り替える

私はMacbook Airを使っているのですが、Viモードのキー操作を多用しているので、escキーを押す機会が多くあります。
指が短いので、左小指でescキーを押そうと思うと、気持ち的には二のばししなければいけない感じです。

そこで、[Karabiner]を使って、Back-tickキーとescキーを入れ替えています。
ところが、家に帰ると、[Happy Hacking Keyboard]を使っているので、その入れ替えを無効にしなければなりません。

初めはメニューバーから切り替えていたのですが、煩わしいので自動化しました。

まず、[Keyboard Maestro]をインストールします。
それから、Karabinerのキーマップ一覧を取得します。
````
$ /Applications/Karabiner.app/Contents/Library/bin/karabiner list
0: Air
1: HHK
````
"The USB device is attached"トリガーを選択し、キーボード名（システムリポートのUSBセクションに表示されています）を指定します。Actionにはコマンドラインでキーマップを選択します。

![Keyboard_Maestro_Editor1.png](https://qiita-image-store.s3.amazonaws.com/0/38240/571d5877-d38c-1ee2-ac3e-b8d1744b4d65.png)

後は、"detached"トリガーで元に戻す設定も行います。
![Keyboard_Maestro_Editor2.png](https://qiita-image-store.s3.amazonaws.com/0/38240/7e3dd9fc-14e5-cc32-a38f-2be83f7cfe86.png)

これで、USBキーボードを抜き差しするたびにキーマップを切り替えることができます。

[Karabiner]:https://pqrs.org/osx/karabiner/index.html.ja
[Happy Hacking Keyboard]:http://xahlee.info/kbd/i/happy_hacking_keyboard_us_layout.jpg
[Keyboard Maestro]:http://www.keyboardmaestro.com/main/
zphotoのCSSによる簡易実装

# はじめに
高林哲さんが作成された<a href="http://0xcc.net/zphoto/">zphoto</a>というフリーソフトウェアがあります。
このソフトウェアを使用して手元でアルバムを作成して楽しんでいたのですが、

> 今時のCSSを使えば似た感じの物が作れるのではないか？

と考えて試行錯誤した所、簡易的にですが再現できました。

# 簡易実装

```css:animation.css

img.graphic {
  z-index: 0;
  -moz-transition: all 1s;
  -webkit-transition: all 1s;
  -o-transition: all 1s;
  -ms-transition: all 1s;
}

img.graphic:hover {
  z-index: 999;
  -moz-transform: scale(2.0, 2.0);
  -webkit-transform: scale(2.0, 2.0);
  -o-transform: scale(2.0, 2.0);
  -ms-transform: scale(2.0, 2.0);
}

```

```html:animation.html
<head>
<link rel="stylesheet" href="animation.css" type="text/css" media="all">
</head>

<body>
<a href="hoge.html"><img class="graphic" src="hoge.jpg" title="2014/01/01 00:00:00"/></a>
</body>
```

あとはtable使うなり適当に。
Bundle Seed ID を取得する方法


仕事でBundle Seed IDだけを取得する必要が出て、いろいろ調べたのですが、ネット上にあまり情報がありませんでした。
かなりニッチな情報っぽいですが、せっかくなのでその方法をQiita初投稿のエントリとして共有することにします。



### 前提
- Xcode 6.1.1
- Swift 1.1

### ポイント
Bundle Seed IDだけを取得するAPIは用意されていないようです。
そのため、Keychainに適当なデータを保存し、その登録結果(NSDictionary)に含まれるKeychainAccessgroupの値からBundle Seed IDを抜き出すということをしています。

## 実装
UIApplicationのextensionとして実装しました。

```swift:UIApplicationExtensions.swift
import UIKit
import Security
 
extension UIApplication {
    
    class var bundleSeedId: String {
        struct Static {
            static var token : dispatch_once_t = 0
            static var identifier: String!
        }
        
        dispatch_once(&Static.token) {
            
            let query: NSDictionary = NSDictionary(objects: [kSecClassGenericPassword, "Bundle Seed ID", kCFBooleanTrue], forKeys: [kSecClass, kSecAttrAccount, kSecReturnAttributes])
            
            var result: Unmanaged<AnyObject>?
            var status: OSStatus = SecItemCopyMatching(query as CFDictionaryRef, &result)
            
            if status == errSecItemNotFound {
                status = SecItemAdd(query as CFDictionaryRef, &result);
            }
            
            if status == errSecSuccess {
                if let op = result?.toOpaque() {
                    let resultDict: NSDictionary = Unmanaged<NSDictionary>.fromOpaque(op).takeUnretainedValue()
                    
                    if let accessGroup = resultDict[kSecAttrAccessGroup as NSString] as? NSString {
                        let components = accessGroup.componentsSeparatedByString(".")
                        Static.identifier = components[0] as String
                    }
                }
            }
        }
        
        return Static.identifier
    }
}
```


### サンプルコード
使い方はこんな感じです。

```
let bundleSeedId = UIApplication.bundleSeedId
NSLog("Budle Seed ID: \(bundleSeedId)")
```


**P.S.**
社内SDKを作っているような人間しかKeychainを使って複数のアプリでデータを共有なんてことはしないのかもしれませんね。
エンジニアスキルアップのための3つの習慣

# はじめに
アプレッソ開発部部長の吉田です。「パッケージソフトウェア開発 Advent Calendar」も残すところ3日となりました。

 *パッケージソフトウェア開発 Advent Calendar* 
 *http://qiita.com/advent-calendar/2014/packagesoftdev* 

私もエンジニアですので、いつまでもスキルアップし続けたいと思っています。今回は私がスキルアップを考える際に気をつけている3つの習慣についてご紹介したいと思います。

# ラストマンになる
アプレッソではよく「ラストマンになりましょう」や「私は○○のラストマンになります」という言葉が出てきます。ラストマンについては、アプレッソ小野のblogの

 *持続可能な成長を実現する「ラストマン」という自分戦略: 八百屋になりたい人が肉屋に入ってしまったらどうするか?*
 *http://blog.livedoor.jp/lalha/archives/50140618.html*

をご覧ください。

ラストマンとは「ある所属組織内で自分が一番(最後に立っている人)」のことを指し、ポイントは「自信をつけながらストレスが少ない形で成長していける」ところにあります。

私もラストマン戦略に則って良かったと思います。私の場合、アプレッソに入った当初、周りにはすごいエンジニアばかりでまったく付いていける気がしませんでした。どこから手を付けていいのかもわからず、ただただもがいているだけだったような気がします。

ある日小野から「Webアダプタを作って欲しい。あと吉田さんはWebの技術でラストマンになって欲しい」という話がありました。当時強いて言えば大学の研究でもやっていたのでWebの技術には少し詳しいかもという状況でした。製品をひとつ作るので、ちょっと勉強したレベルでは歯が立たず、プロトタイプを作りまくったり、RFCや本を読みまくったり、人に聞きまくったりと、試行錯誤しながらなんとか完成させました。

そうすると、周りの人が私にその分野についてのことを聞きに来てくれるようになり、いろんな人が私を頼りにしてくれるようになりました。とてもうれしくて、自信にもなりました。

ひとつのラストマンになると、次のスキルアップへ、気持ちの部分でも積極的に取り組め、達成したスキルアッププロセスをベースにさらに磨きをかけることもできるようになりました。

# 「やりたいこと」と「できること」を一致させる
若いときには「やりたくはないけど、○○だから、やらざるを得ない」という状況でやってしまうことがあると思います。例えば以下のようなものです。

+ やりたくはないけど、上司の指示だから、やらざるを得ない
+ やりたくはないけど、誰もやらないから、やらざるを得ない
+ やりたくはないけど、困っている人がいるから、やらざるを得ない

このような状況でやってしまうことは組織やチームとしてみれば悪いことではありません。むしろ良いことのように見えます。また「尽くす人」や「良い人」なることがやりたいことであれば全く問題ありません。とてもすばらしいことです。ただそうではない場合も多いと思います。やったことはいずれ「経験」や「スキル」になり、自分がやりたい、やりたくないに関わらず、それが自分の「キャリア」になってしまいます。

年を取っていくと、残念ながらそのキャリアにしかお金を払ってもらえなくなります。私もそうですが、いつまでもやりたいことをやってお金をもらいたいものです。そうするためには、若いときからやりたいことをやり続けるほかありません。

「やりたいこと」をやり続けるためには、

+ 「やりたくないこと」は本当に「やりたくないこと」なのかじっくり考えてみる
+ その上で「やりたくないこと」は「やらない」と言ってみる

という流れになると思います。一見やりたくないことをよくよく考えてみると自分の目標達成には欠かせないやりたいことであることも多くあります。また時間が経てばやりたいことに変わることも多くあります。そのあたりは自分でじっくり考えなければなりません。

じっくり考えた結果「やらない」と言ってみた場合、上司や周りの人が「この人はこんなことがやりたいんだ。じゃ今後そのようなことがあればこの人にやってもらおう」といった良い流れが生まれることもあります。もちろん逆にリスクもあります。評価が下がったり、周囲と合わなくなったりすることもあるでしょう。やりたいことを達成するために一時的に我慢できるのであれば我慢するのも手ですし、我慢できないのであればもしかするとそこは自分の「やりたいこと」を実現できる「場」ではないのかも知れません。

# 常に手を抜かない
+ 製品になぜかテスト向けに作ったコードが残っちゃった・・・
+ 製品になぜかプロトタイプ向けに作ったコードが残っちゃった・・・
+ 製品になぜか後で直そうと思ったコードが残っちゃった・・・

なんてことはないでしょうか？ 私も身に覚えがあります・・・。製品コードではきちんと書こうと思っても、プロトタイプやテスト向けのコードを書いてから時間が経っていることもあり、修正することすら忘れていることもあると思います。忘れていなかったとしても製品コードとして改めて作るためには予想よりも多くの時間がかかってしまうこともあります。

そのようなことをなくすためにも、テスト用、プロトタイプ用に書くコードも製品コードに入れても良いレベルのコードを書くようにしています。そうすることで、上記の課題が解決すると同時に、製品コードが手に馴染んできて、逆にクオリティの良くないコードを書くことが指が許してくれなくなります。

私は現在管理職なのでコードを書く以外の仕事も多くあります。それぞれの仕事も同様で、手を抜いてしまうと、いざというときに良い成果が出せなくなったり、よい成果を出すために多くの時間がかかることもあります。そのため、どんなに小さな仕事でも常に手を抜かないことを習慣としています。

# 最後に
今回はエンジニアのスキルアップの習慣について書きました。習慣に関して私の好きな言葉を引用して締めくくりたいと思います。

 *思考に気をつけなさい、それはいつか言葉になるから* 
 *言葉に気をつけなさい、それはいつか行動になるから* 
 *行動に気をつけなさい、それはいつか習慣になるから* 
 *習慣に気をつけなさい、それはいつか性格になるから* 
 *性格に気をつけなさい、それはいつか運命になるから*
 *- マザー・テレサ -*
Sencha Ext JS 5 のスプレッドシード

Sencha Advent Calendar 2014 23日目
http://www.adventar.org/calendars/490

## スプレッドシード セレクション モデル

こんにちはxenophyの菅井です。

先日Ext JS 5.1リリースされました。
いくつか新しい機能が追加されましたが、今回はその中で
グリッドをスプレッドシートのように操作できるようになる
スプレッドシード セレクション モデルを使ってみたいと思います。

## グリッドの作成

スプレッドシード セレクション モデルはグリッドの`selModel`に設定する形で利用します。
なのでまずはベースとなるグリッドを以下のように作成します。

    Ext.create('Ext.grid.Panel', {
        renderTo: Ext.getBody(),
        title: 'スプレッドシート',
        width: 250,
        columns: [
            {text: 'A', dataIndex: 'a', width: 50},
            {text: 'B', dataIndex: 'b', width: 50},
            {text: 'C', dataIndex: 'c', width: 50},
            {text: 'D', dataIndex: 'd', width: 50},
            {text: 'E', dataIndex: 'e', width: 50}
        ],
        store: {
            fields: [{
                name: 'a',
                type: 'string'
            }, {
                name: 'b',
                type: 'string'
            }, {
                name: 'c',
                type: 'string'
            }],
            data: [
                {a: 'A-1', b: 'B-1', c: 'C-1', d: 'D-1', e: 'E-1'},
                {a: 'A-2', b: 'B-2', c: 'C-2', d: 'D-2', e: 'E-2'},
                {a: 'A-3', b: 'B-3', c: 'C-3', d: 'D-3', e: 'E-3'},
                {a: 'A-4', b: 'B-4', c: 'C-4', d: 'D-4', e: 'E-4'},
                {a: 'A-5', b: 'B-5', c: 'C-5', d: 'D-5', e: 'E-5'}
            ]
        }
    });

![grid](http://goo.gl/7k4g5X)

この時点ではまだ普通のグリッドなのでデフォルトの行選択になっています。

## スプレッドシード セレクション モデルの設定

では次に作成したグリッドに対してスプレッドシード セレクション モデルの設定を追加します。
以下のように`requires`で`SpreadsheetModel`クラスを利用できるようにして
`selModel`の`type`に'spreadsheet'を指定しています。
さらに列ごとの選択も可能となるよう`columnSelect`をtrueにしています。

        requires: [
            'Ext.grid.selection.SpreadsheetModel'
        ],
        selModel: {
            type: 'spreadsheet',
            columnSelect: true
        },

![ss1](http://goo.gl/47M3ym)

![ss2](http://goo.gl/lRssdR)

上記の設定だけで列や行を横断してスプレッドシートのように
カラムを選択することができるようになりました。

## クリップボード プラグイン

スプレッドシード セレクション モデルを設定したグリッドに対して
クリップボード プラグインを利用するとグリッドで選択したセルを
簡単にクリップボードに保存できるようになります。
以下のように`requires`と`plugins`を追加します。

        requires: [
            'Ext.grid.selection.SpreadsheetModel',
            'Ext.grid.plugin.Clipboard'
        ],
        selModel: {
            type: 'spreadsheet',
            columnSelect: true
        },
        plugins: 'clipboard',

先ほどのグリッドのセルを選択してコピペしてみた結果が以下になります。

>貼り付け結果
A-2	B-2	C-2	D-2
A-3	B-3	C-3	D-3
A-4	B-4	C-4	D-4

## 最後に

今まで苦労して実装してきた機能がExt JS 5になって次々と追加されていっているので
今回のようなスプレッドシード セレクション モデルとクリップボード プラグイン等で
よりExt JSのデスクトップアプリケーションでの有用性が高まったと思います。

※今回のSencha Fiddle です。
https://fiddle.sencha.com/#fiddle/ffo

明日は@martini3ozさんです。
MoonScriptしようや...

# MoonScript!?

![image](https://camo.githubusercontent.com/4af51706dd39969c7bb6573906b940b85d0e94fd/687474703a2f2f6c6561666f2e6e65742f64756d702f7361696c6f726d6f6f6e7363726970742e706e67)
AltJSよろしく、AltLuaな
Luaへの言語トランスレータです。

# 環境構築

luarocksでの環境構築が必須です。
Mac OSであり、homebrewの環境構築が済んでいるなら
以下のコマンドでインストール可能ですm(_ _)m

```
> brew install luarocks
```

## moonscriptインストール

luarocksをインストールした状態で、
moonscriptをインストールしましょう。

必要そうなやつ全部入れてしまう。(luarocksよくわからんな...)

```
> luarocks install luasocket
> luarocks install lapis
> luarocks install lpeg
> luarocks install moonscript
```

これでmoonコマンドが使えるようになりました。

# moonscriptをお試し

## リスト内包表記

リスト内包表記(List Comprehensions)が使えます

### コード例

```moon:odd.moon
data = {1,2,3,4,5,6,7,8,9,10}
odd = [v for i, v in ipairs(data) when i % 2 != 0]

for i, v in ipairs(odd)
  print(v)
```

### 実行結果

```
> moon odd.moon
1
3
5
7
9
```

## switch構文

Switch構文を使うことができます。
(評価結果がSwitchのブロックから戻ってくるようになる)

### コード例

```moon:switch.moon
type = "Hello world"

message = switch type
  when "Hello world"
    "Welcome!"
  when "Welcome to underground"
    "Go to hell..."
  else
    "????"

print message
```

### 実行結果

```
> moon switch.moon
Welcome!
```

## class表現

Luaそのものだと擬似クラス表現になりますが、
MoonScriptではclass構文を使えます。

### コード例

```moon:class.moon
class Bucket
  new: =>
    @box = {}
    
  inc: (item) =>
    if @box[item]
      @box[item] += 1
    else
      @box[item] = 1

  count: (item) =>
    @box[item]

bucket = Bucket!
bucket\inc "hoge"
bucket\inc "hoge"
bucket\inc "fuga"

print bucket\count "hoge"
print bucket\count "fuga"
```

### 実行結果

```
> moon class.moon
2
1
```

なお、
**@**がインスタンス自身(self)で
**@@**がクラス(self.__class__)に当たる。

# 全体的に

**end**が省略可能だったり、forの**do**が省略できたりする。
組み込み向けスクリプティング用途ではなく、
Webアプリケーションを書くための用途、つまるところ
Lua単体でアプリを提供する場合に使うと良いのではと思う。

# 参考

[MoonScript - Language Guide](http://moonscript.org/reference/)
Google Driveでディレクトリごとまるっとコピーしてやるぜ！


## きっかけ

Advent Calendarで何を書こうか迷っていた時に、こんなツイートを見たわけです。

https://twitter.com/sinmetal/status/544314381379452929

## Google Driveには、ディレクトリのコピーがメニューにない
Google Driveでディレクトリで右クリックしてみました。

![マイドライブ_-_Google_ドライブ.png](https://qiita-image-store.s3.amazonaws.com/0/11925/49674297-91f1-0a63-1e28-a50f9ac4fb05.png "マイドライブ_-_Google_ドライブ.png")


ファイルを右クリックすると「コピーを作成」がある。
![chugoku-gtug_-_Google_ドライブ.png](https://qiita-image-store.s3.amazonaws.com/0/11925/7aa71328-ac96-45ab-1170-f24d228cfea9.png "chugoku-gtug_-_Google_ドライブ.png")


## Google Apps Scriptで実現するしかなさそう
ということで、作ってみました。

```js:コード.gs
function myFunction() {
  var folders = DriveApp.getFoldersByName("コピーサンプルデータ");
  var dest = DriveApp.createFolder("コピーサンプルデータのコピー");
  while(folders.hasNext()) {
    var folder = folders.next();
    folderCopy(folder, dest);
  }
}

function folderCopy(folder, dest) {
  // var folders = DriveApp.getFolders();
  var folders = folder.getFolders();
  var files = folder.getFiles();
  
  while(files.hasNext()) {
    var file = files.next();
    // file.makeCopy(dest);とすると、****のコピーというファイル名になるので…。
    file.makeCopy(file.getName(), dest);
  }
  
  while(folders.hasNext()) {
    var subFolder = folders.next();
    var folderName = subFolder.getName();
    var copyFolder = dest.createFolder(folderName);
    folderCopy(subFolder, copyFolder);
  }  
}


```

### 承認が必要なので
Driveへのアクセスの承認をして下さい。

![許可のリクエスト.png](https://qiita-image-store.s3.amazonaws.com/0/11925/84dc08c0-edb3-f2fe-5408-c9932b93732c.png "許可のリクエスト.png")

## 解説
### DriveAppにはフォルダのコピーAPIがない。
DriveAppにはフォルダのコピーを作るというAPIがないので、同じ名前でフォルダを作ってやらないといけません。
ということで、フォルダを階層を維持したまま別の所にコピーするのを実現するには、フォルダを探索する再帰呼び出しをしてやります。

### DriveApp.getFolders()/Folder.getFolders()はフォルダしか取得できない。
当然ですが、getFolders()を呼び出してもファイルは取得されないので、フォルダの探索と同時にファイルの探索File.getFiles()を呼び出して、ファイルのコピーを作っています。

### File.makeCopy(dest)にすると、****のコピーというファイル名になるので…。
FileにはmakeCopy()というAPIがありますが、名前を指定しないものを呼び出すと"****のコピー"というファイル名になってしまいます。（その方が都合が良い場合もありますが）コピーを作る時は、同じファイル名で作ると思いますから、File.makeCopy(name, dest)の方を呼び出してファイル名が変わらないように制御します。

### ただし、弱点が
コピーを作る先がルートフォルダになる。これは、destの指定がまずいだけですが、DriveApp.createFolder()を使うと、ルートディレクトリにFolderを作ってしまうので、パスを指定してFolderを作る方法があればもう少し便利になるかもしれない。

## 結論
今年は「早すぎる男」になれませんでした…。

## Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）
私のJavaScript情報の集め方

ちょっと趣向を変えてJavaScriptの情報をどうやって集めているかという話を書きたいと思います。

## 使っているもの

* Twitter
* RSS(feedly)
* Pocket
* はてブ

TwitterはただフォローしてTL見ていたり検索してたまに見ているだけでリストを作ったりはしてなくて暇な時に見ている感じです。

RSSはこれから紹介するようなサイトとかこの人のブログ面白い！というものだけを登録しています。未読が100件増えると消化する気がどんどんなくなっていくので...。

PocketはTwitter、RSSで気になったものを後で読むためにとりあえず突っ込むのに使っています。
こうすることでRSSはすぐに終わるので、その後で時間があればPocketで読みます。

```
Twitter--
        |-- Pocket -- はてブ -- Twitter(はてブ連携)
RSS -----
```

Pocketに溜まった記事はちょっとした合間に読んだりしていて、たまにまとめて読んだりして消化しています。
今見ると20件くらいあるのでそろそろ整理したい感じです。


## Webで情報を集める

まぁ色々登録していたりするのですがよさそうなサイトを一部紹介します。

### JserInfo
* http://jser.info/
* [@azu](https://twitter.com/azu_re)さんによるフロントエンドの情報を網羅的に週一でまとめられているサイトです。
* [@azu](https://twitter.com/azu_re)さんの情報収集力がスゴいのでぶっちゃけこれだけ見ていても十分キャッチアップすることが出来ます。本当スゴいです...。いつもありがとうございます！

### DailyJS
* http://dailyjs.com/
* 毎日JavaScriptのライブラリなどを紹介してくれるサイトです。見ている人も多いのではないでしょうか。
* 毎回3つくらいでコンパクトなので気軽に読むことが出来ます。たまにがっつりエントリが書いてあったりして面白いです。

### Echo JS
* http://www.echojs.com/
* 色々なJavaScriptの情報がPOSTされるサイトで3年くらいやっているそうです。面白いエントリやスライドなどを見つけることが出来たり、タイトル見てるだけでも動向がわかってきます。

### reddit
* redditではjavascriptとかnodeとかreactjsとか知りたいtopicを購読しています。Echo JSと被ってる部分も多いですが。
  * http://www.reddit.com/r/javascript/
  * http://www.reddit.com/r/node/
  *  http://www.reddit.com/r/reactjs/
  * ...

### stackoverflow
* http://stackoverflow.com/
* 自分が気になっているもののtagを購読してどういった問題があるのかとwatchしていたりします。
  * たいていタイトルだけ見て中身は読んでないですが...

### github
* https://github.com/
* 一部のrepositoryをwatchしてissueを見ています。ただ、すぐ未読が増えてくるのでそんなにちゃんと見てないです。

## Twitterで情報を集める

特にリスト作ったりしてるわけではなくてただTL眺めているだけですが、よくTweetにあるリンク見てるなという人を厳選してみました。いつもお世話になってます！

* [@azu_re](https://twitter.com/azu_re)
* [@teppeis](https://twitter.com/teppeis)
* [@Jxck_](https://twitter.com/Jxck_)
* [@mizchi](https://twitter.com/mizchi)
* [@t_wada](https://twitter.com/t_wada)
* [@yosuke_furukawa](https://twitter.com/yosuke_furukawa)
* [@ahomu](https://twitter.com/ahomu)
* [@agektmr](https://twitter.com/agektmr)


あとは適当に検索メモをたまに眺めたりもしています。「react.js OR reactjs OR vue.js OR ...」みたいな。


## Podcastを聴いてみる

通勤時などに聴いていて正直全然聞き取れてないのであんまり意味ないのですが、JavaScript関連だと英語の勉強としてこんな感じのものを聴いています。

rebuild.fmとmozaic.fmはもちろん聴いています。

### JavaScript Jabber
* http://devchat.tv/js-jabber
* JavaScript系のTopicが取り上げられていて興味深いものが多いです。

### 5 Minutes of JavaScript
* http://five-js.envylabs.com/
* 毎週JavaScriptのネタを5分くらいでいろいろ紹介しているPodcastです。短いので気軽に聴けていいです。
* 毎回エンディングの曲がご機嫌な感じです。

### NodeUp
* http://nodeup.com/
* Node.js関連の話題を中心にNetflixのチームについてなどアーキテクチャみたいな話もあって面白いです。

### CodeWinds
* http://codewinds.com/podcast.html 
* そんなに頻繁に配信されてるわけではないですが、JSConfの話があったりします。


英語の勉強として聴くなら「5 Minutes of JavaScript」がおすすめです。短いし聞き取りやすいです。

## 情報の海に沈まない

日々の日課として情報収集やPodcastを聴き始めると**やらなければ**という気持ちになってだんだんしんどくなって結局やらなくなるということってよくあると思います。

RSSだったらニュース系などを登録しすぎると毎日未読が3桁という感じになるので徐々に増やしていったり、配信する記事の多過ぎるものは消したりといったことも必要かなと思います。

自分のペースを見つけることが大事かなと思います。
自分の場合はRSSだと数日放置しても5分くらいで消化出来るくらいです(実際に読むのは1割ないくらい)。



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

というわけでこんな感じで普段情報を集めています。
まぁ情報収集もありますが英語の勉強のためというのも大きかったりします。
あと、趣味みたいな感じです。日々、新しいことが出て来て面白いので。

JavaScriptあんまり関係なくなってしまった...。
マルチモードでout of sourceビルドができるMakefileテンプレ

Makefile

```Makefile
CC := clang
CFLAGS := -Wall -Wextra
CFLAGS_DEFAULT := -O3 -g
CFLAGS_DEBUG := -O0 -g -D__DEBUG__
LDFLAGS := -lpthread

BUILD_DIR := ../build/
TARGET := main
SOURCES := $(wildcard *.c)
HEADERS := $(wildcard *.h)

define rules
BUILD_DIR_$(1) := $(BUILD_DIR)$(1)/
TARGET_$(1) := $$(BUILD_DIR_$(1))$(TARGET)
OBJS_$(1) := $$(SOURCES:%.c=$$(BUILD_DIR_$(1))%.o)
.PHONY: $(1)
$(1): $$(TARGET_$(1))
$$(TARGET_$(1)): $$(OBJS_$(1))
	$$(CC) $$(CFLAGS) -o $$@ $$+ $$(LDFLAGS)
$$(BUILD_DIR_$(1))%.o: %.c $(HEADERS)
	@mkdir -p `dirname "$$@"`
	$$(CC) $$(CFLAGS) -o $$@ -c $$<
endef

# $(info $(call rules,default))
$(eval $(call rules,default))
$(eval $(call rules,debug))

default: CFLAGS += $(CFLAGS_DEFAULT)

debug: CFLAGS += $(CFLAGS_DEBUG)
debug:
	$(TARGET_debug)

.PHONY: clean
clean:
	rm -rf $(BUILD_DIR)
```

ビルドはmakeまたはmake debugで実行できます。
makeはmake defaultと同義です。

ビルド後のディレクトリ構造はこうなります

```text
build
	debug
		inc.o
		main
		main.o
	default
		inc.o
		main
		main.o
src
	inc.c
	inc.h
	main.c
	Makefile
```

evalに聞き覚えがない人はこちらのリンクを参考してください。
https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
擬人化で考えるオブジェクト指向

クラスベースの静的型付けオブジェクト指向についてまとめてみました。
わかったつもりを目指して書いているため厳密な定義では書いておりません。

[擬人化で考えるオブジェクト指向](http://www.slideshare.net/yamada28go/ss-42951539)
RubyMineでリファクタリングいくつか


ここ3ヶ月ほどRubyMineでRubyを書いてますが、まだまだ使いこなせてない機能がたくさん、、
今回は、リファクタリング関連で使えそうなショートカットや機能について、いくつか紹介させて頂きます！

### クラス名、メソッド名、変数名のリネーム
```shift``` + ```F6```

![スクリーンショット 2014-12-23 11.03.58.png](https://qiita-image-store.s3.amazonaws.com/0/7410/8decc623-7a6f-330a-0e2c-02e603972fdc.png "スクリーンショット 2014-12-23 11.03.58.png")

routingのファイルやspecなどからも、関連範囲を検索して置換してくれます。

![スクリーンショット 2014-12-23 11.14.00.png](https://qiita-image-store.s3.amazonaws.com/0/7410/b11e83f9-9f9b-a4e8-fdd8-21883319e76d.png "スクリーンショット 2014-12-23 11.14.00.png")


### 独立したメソッドにロジックを切り出し
```command``` + ```option``` + ```M```

![201412172355.gif](https://qiita-image-store.s3.amazonaws.com/0/7410/6a46eb9d-d0ad-df7d-174b-5935c0b0735f.gif "201412172355.gif")


### 変数を抽出して切り出し
```command``` + ```option``` + ```V```

![201412231201.gif](https://qiita-image-store.s3.amazonaws.com/0/7410/812cea21-5ab7-0e14-68bc-735b878d60b9.gif "201412231201.gif")


### viewもサクッとpartial化
```Refactor``` -> ```Extract``` -> ```Partial```

共通化したいところをサクッとpartialにしてくれます。

![201412231216.gif](https://qiita-image-store.s3.amazonaws.com/0/7410/c538c1ce-7f2c-2cbe-b9f7-8f3a543a5d12.gif "201412231216.gif")


### 他のリファクタリング
```control``` + ```T```

基本的なメニューが表示されます。

![スクリーンショット 2014-12-23 12.38.53.png](https://qiita-image-store.s3.amazonaws.com/0/7410/d002375c-4429-41e2-8340-f71fb54e50ba.png "スクリーンショット 2014-12-23 12.38.53.png")

### クイックフィックス(Intention)を呼び出す
```option``` + ```Enter```

![intentionBulb.png](https://qiita-image-store.s3.amazonaws.com/0/7410/ff37d8b0-415b-e112-83e2-dc9ad6eb71d8.png "intentionBulb.png") 修正可能なコードに対して、コードの書き換えを提案してくれます。

![201412172351.gif](https://qiita-image-store.s3.amazonaws.com/0/7410/648bdea0-5ff3-6ffe-f449-f5344668cf3c.gif "201412172351.gif")


### 参考
- http://pivotallabs.com/automated-refactorings-in-rubymine/
- https://www.jetbrains.com/ruby/webhelp/intention-actions.html
iPad持て余してるエンジニアにぜひ！サブディスプレイ化アプリの決定版Duet Displayを試してみた

by @mixiappwchr

![スクリーンショット 2014-12-23 12.59.59.png](https://qiita-image-store.s3.amazonaws.com/0/37731/2ce3cdf7-6eb8-5867-25af-0206ae451c91.png)

今まで微妙に使ってないiPadを必死に有効活用しようとしてサブディスプレイ化するために、いろいろアプリを試してきたのですがどれもWiFi接続でパフォーマンスがとても満足いく物がなく挫折してきていました。

そこに画期的なアプリが登場しました!

Duetdisplay
http://www.duetdisplay.com/

これはWiFiではなくUSB経由で出力するので高速ということです。

どれくらい高速なのか同じくサブディスプレイ化するアプリのDisplayPadと比較してみました。

https://www.youtube.com/watch?v=8fYolSc_TG8&feature=youtu.be

ちなみに使用したのはiPad第三世代です。最近のiPadだともっと高速かも

あとこちらはiPhone版もあります！！

https://www.youtube.com/watch?v=EujwgaC4dgk&feature=youtu.be

くそでかいiPhone6Plusを持て余してる方にもおすすめ


iPhone版
<a href="https://itunes.apple.com/jp/app/duet-display/id935754064?mt=8&uo=4&at=10lnU3" target="itunes_store">Duet Display - Rahul Dewan</a>

iPad版
<a href="https://itunes.apple.com/jp/app/duet-display/id935754064?mt=8&uo=4&at=10lnU3" target="itunes_store">Duet Display - Rahul Dewan</a>
ansible playbook for yum update (ntp vulnerability)

# ansible playbook for yum update (ntp vulnerability)

https://alas.aws.amazon.com/ALAS-2014-462.html


```
---
# update.yml

- name: yum update for all hosts
  hosts: all
  remote_user: ec2-user
  sudo: yes
  vars:
    pkg: ntp

  tasks:
    - name: yum clean
      shell: yum clean all

    - name: before-check
      shell: yum list "{{pkg}}"
      register: before_check
    - debug: msg="{{before_check.stdout_lines}}"

    - name: update "{{pkg}}"
      yum: name="{{pkg}}" state=latest

    - name: Check again
      shell: yum list "{{pkg}}"
      register: after_check
    - debug: msg="{{after_check.stdout_lines}}"
```

* ansible-playbook -i hosts --private-key=~/.ssh/xxxx.pem update.yml
Java8移行に伴う環境構築


前回、[brew caskでJava8をインストール](http://qiita.com/shuntaro_tamura/items/60b8c19f62edfd942c2e)という記事を書きましたが、Java8を入れた後の環境構築までセットで行う必要があります。

※　下記内容は「mavenプロジェクト」を「Eclipse」で管理している場合に有効かと思われます。

# 1. MavenでコンパイルするJavaのバージョンを8にする
`pom.xml`のpluginのsourceとtargetを1.8にする。

```pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>
```

mavenを書き換えたら、

```
1. 修正を加えたpom.xmlを含むディレクトリを右クリック
2. Maven　→　Update Project…　をクリック
```

の手順により、変更内容をEclipseに読ませてあげる。

# 2. Eclipse環境設定をJava8にする
- Java > Compiler：Compiler compliance levelを`1.8`にする
- Java > Installed JREs：Java8のJVMを追加する

# 3. おまけ
Eclipseが、`An internal error occurred during: "Building workspace". GC overhead limit exceeded`というエラーを吐き出すことがある。
この時、`eclipse.ini`のXms・Xmx・MaxPemSizeの内容を

```
-Xms512m
-Xmx1024m
-XX:MaxPermSize=1024m
```

などとし、数値を大きくしてあげることでGCエラーを回避出来うる。
2014年 主要脆弱性 - Heartbleed, Shellshock, POODLE - への対策

#Heartbleed

- OpenSSLのバグ
- https://www.openssl.org/news/secadv_20140407.txt

##対策

OpenSSLをアップデート（1.0.1gへ）するか、OpenSSLをオプション`-DOPENSSL_NO_HEARTBEATS`付きでリコンパイルする

- Ubuntu 14.04では`openssl version -a`の結果1.0.1fと表示されるが、対策はなされており、脆弱ではない

#Shellshock

- Bashのバグ
- http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271
- http://askubuntu.com/questions/528101/what-is-the-cve-2014-6271-bash-vulnerability-shellshock-and-how-do-i-fix-it

##対策

Bashをアップデートする。4.3-7ubuntu1.4, 4.2-2ubuntu2.5, 4.1-2ubuntu3.4 以上で安全。

- Ubuntuの場合 `sudo apt-get update && sudo apt-get install bash`

#POODLE

- SSL3.0のバグ
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566

##対策

SSL3.0に対応しないようにする

- Nginxの場合 `ssl_protocols TLSv1 TLSv1.1 TLSv1.2;`
- Apache httpd + mod_ssl の場合 `SSLProtocol All -SSLv2 -SSLv3`
- AWS ELBの場合 `ELBSecurityPolicy-2014-10`を使用
ステータスバーに通知メッセージを表示したい



NotificationCompat.Builder で通知を組み立てるときに setTicker() を呼び出せば良い。

```
        builder = new NotificationCompat.Builder(this)
                .setSmallIcon(getResources().getIdentifier("notify", "drawable", getPackageName()))
                .setContentTitle("GCM Notification")
                .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                .setContentText(msg)
                .setTicker(msg); // この内容がステータスバーに表示される
```
Mac覚え書き


環境：Mac OS X 10.9.4

## 1. OS X ディレクトリ構成

|Directory        |Description                                                         |
|:----------------|:-------------------------------------------------------------------|
|/User/[User Name]|ユーザーのホームディレクトリ                                             |
|/Application     |アプリケーションがインストールされるディレクトリ                            |
|/bin             |基本的なコマンドが置かれているディレクトリ                                 |
|/sbin            |基本的な管理系コマンドが置かれているディレクトリ                            |
|/usr/bin         |一般的なコマンドが置かれているディレクトリ                                 |
|/usr/sbin        |一般的な管理系コマンドが置かれているディレクトリ                            |
|/usr/local       |ユーザーが自分で管理している、比較的規模が小さいソフトウェアを配置するディレクトリ|
|/opt             |ユーザーが自分で管理している、比較的規模が大きいソフトウェアを配置するディレクトリ|

## 2.Finderにパスバーを表示する
Finderのメニューバー「表示」ー「パスバー表示」を選択する

## 3.OS Xでスクリーンショットを撮る

1. 画面全体を撮る  
command (⌘) + shift + 3」でスクリーンショットがデスクトップに追加される。
2. 画面の一部を撮る  
「command (⌘) + shift + 4」、十字ポインタをドラッグして領域を選択。
「shift」「option」または「space」バーを押しながらドラッグ、選択した領域のサイズを変更。
取り消しは、マウスボタンを放す前に「escape (esc)」キーを押す。
3. 特定のウインドウを撮る  
「command (⌘) + shift + 4」、「space」バーを押し、カメラのポインタをウインドウの上に移動してハイライト後、クリックする。
√
4. メニューのスクリーンショットを撮る
メニューをクリックしてコンテンツを表示、「command (⌘) + shift + 4」、十字ポインタを領域上にドラッグします。
タイトルを除いてメニューのスクリーンショットを撮るには、メニューの上に移動し、「command (⌘) + shift + 4」キーおよび「space」バーを押します。
取り消すには、クリックする前に「escape (esc)」キーを押します。

## 4.キーボードショートカット

|ショートカット               |説明                         |
|:------------------------:|:---------------------------:|
|「Command」＋「←」          |カーソルを行の先頭に移動する      |
|「Command」＋ 「→」         |カーソルを行の最後に移動する      |
|「Shift」＋「Command」＋「←」|カーソルから行の先頭までを選択する |
|「Shift」＋「Command」＋「→」|	カーソルから行の最後までを選択する |

## 5.その他
- バックスラッシュ（\）の入力はoptionキーを押しながら、"¥"キーを押す。
jQuery に slice() メソッドがあるのを知らなかった


http://api.jquery.com/slice/

たいへんお恥ずかしい話ですが。
1.1.4 からあったにも関わらず。

配列ではなく要素集合から指定範囲を選択するもの。
リストの一部を非表示にしておいて「もっと見る」でトグルしたりするのが楽になります。

http://codepen.io/yosukesannohe/pen/GgjgbE
npmコマンド覚え書き


npm とは Node Package Manager の略で Node で 作られたパッケージモジュールを管理するためのツールです

## 1. npmのバージョンを確認する

```bash
$ npm -v
1.4.9
```

## 2.パッケージのインストールする

### 2.1.パケージのインストール（ローカル）
```bash
npm install package_name
```

### 2.2.パッケージのインストール（グローバル）
-gオプションを指定すると、グローバル領域にインストールされる。

```bash
npm install -g package_name
```

### 2.3.パッケージをインストールし、package.jsonへ書き込む
--saveオプションを指定して、package.jsonのdependenciesにバージョン付きで書き込む

```bash
npm install --save package_name
```

--save--devオプションを指定して、package.jsonのdevDependenciesにバージョン付きで書き込む
このオプションは開発時のみに利用するライブラリのバージョンを管理します。

```bash
npm install --save--dev package_name
```

### 2.4.グローバルインストールされたパッケージを確認する

```bash
$ npm ls -g
/Users/my_user/.nvm/v0.10.33/lib
├─┬ coffee-script@1.8.0
│ └── mkdirp@0.3.5
├─┬ express@4.10.2
│ ├─┬ accepts@1.1.3
│ │ ├─┬ mime-types@2.0.3
（略）
├─┬ js2coffee@0.3.3
│ ├─┬ coffee-script@1.7.1
│ │ └── mkdirp@0.3.5
│ ├── file@0.2.2
│ ├─┬ nopt@3.0.1
│ │ └── abbrev@1.0.5
│ └── underscore@1.6.0
└─┬ npm@1.4.28
  ├── abbrev@1.0.5
（略）
```

### 2.5.対話形式でプロジェクトの初期設定を行う

対話形式で項目を週力してpackage.jsonを作成する。

```bash
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (sample) sample
version: (1.0.0) 
description: log4js sample project.
entry point: (index.js) app.js
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /Users/my_user/Development/node.js/sample/package.json:

{
  "name": "sample",
  "version": "1.0.0",
  "description": "sample project.",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes
```
NVMコマンド覚え書き


## 1.nvmのバージョンを確認する

```bash
$ nvm --version
0.10.0
```

## 2.インストール可能なNode.jsのバージョンを確認する

```bash
$ nvm ls-remote
v0.1.14
v0.1.15
v0.1.16
:
:
v0.11.12
v0.11.13
```
## 3. Node.jsのインストール

```bash
$ nvm install v0.11.13
######################################################################## 100.0%
Now using node v0.11.13
```

## 4.インストールしたNode.jsのバージョンを表示する

```bash
$ nvm ls
->  v0.10.26
    v0.11.13
```
「 **->** 」は現在使用中のNode.jsのバージョン

## 5.使用するNode.jsを切り替える

```bash
$ nvm use v0.11.13
Now using node v0.11.13
```

## 6. 現在使用中のバージョンを表示する

```
$ nvm current
v0.10.26
```
"Not posting notification with icon==0:"と言われて通知が出ない



# 問題

以下のようなログが出て通知領域に通知が出ない。

```
11:07:12.517      490-490/? E/NotificationService﹕ Not posting notification with icon==0: Notification(pri=0 contentView=info.snaka.unitygcmplugindemo/0x1090064 vibrate=null sound=null defaults=0x0 flags=0x0 kind=[null])
12-23 11:07:12.517      490-490/? E/NotificationService﹕ WARNING: In a future release this will crash the app: info.snaka.unitygcmplugindemo
```


# 解決

NotificationCompat.Builder で .setSmallIcon() が抜けていたため。
以下のようにsmallIcon()を追加。

```
builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("GCM Notification")
                .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                .setContentText(msg);

```


# 問題2

上記を解決した後、今度は R$drawable が無いって言われる。

```
ava.lang.NoClassDefFoundError: info.snaka.unitygcmpluginlib.R$drawable
```

# 解決2

Unityがビルド時にリソースを置き換えてるっぽいので、Resourcesクラス使ってリソースを取得。

Assets/Plugins/Android/res/drawable に notify.png を用意して

先ほどの通知を作成している箇所を以下のように変更。

```
builder = new NotificationCompat.Builder(this)
                .setSmallIcon(getResources().getIdentifier("notify", "drawable", getPackageName()))
                .setContentTitle("GCM Notification")
                .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                .setContentText(msg);
```

参考: [UnityのAndroid用プラグインを作るときにリソースを含める方法](http://sixeight.hatenablog.com/entry/2013/10/12/215456)
プチコン3号　備忘録

プチコン3号 MMLリファレンス
プチコン3号MML用参考、プチコン2号のサウンド関係マニュアル
http://smileboom.com/special/ptcm2/co_manual/p10.php#3

プチコン3号MMLメモ
:コマンドは、:0～:15　の16ch指定可能
ポルタメントについて。
　・L16C_Gで、
　　・発音時間：16分音符2個ぶん
　　・ポルタメントタイム：16分音符2個ぶん
　　・つまりポルタメントがかかるのは16分音符2個ぶんの間ずっと
　・ポルタメントタイムを短くしたいなら、L16C32_G32
　・もっとポルタメントタイムを短くしたいなら、L16C64_G32.
　・挙動が表記に比べ複雑。詳しいことはぐぐるといいのかも
スラーとピッチベンド(をデチューンを使って実現)について
　・例 O5C& @D32C& @D64C&
プリセットPCM音色にはどんなものがあるか
　・MMLで@で使えるPCM音色は0～511(ユーザ音色や空を含む)
　・128～130の3つはdrum setで、ノートナンバーごとに別PCM音色
　・0～511とdrumそれぞれ音色旨みのわかるピッチはまちまち
デチューンコマンドについて
　・HELPにある「1音」とは、「全音1つ」の意味、つまり200centの意味である。
　・半音(100cent)デチューンしたいなら、+64か-64を指定する。
WAVSETAする波形について
　・16384サンプルのバッファに256周期で波形を書いて、基準ノートナンバー69で登録した場合、
　　@D-4O4C で、プリセット波形のO4Cと概ね同じピッチになる。

プチコン3号MML以外のメモ(3.02以降で未確認かも)
　SMILEボタンから起動した場合のみの仕様
　　・LOADで他プロジェクトのファイルをLOAD可能。
　　　例：LOAD"PRG1:WORK/AAA" ※WORKというPROJECTのAAAというファイルをSLOT1にロード。"PRG1:"のようにSLOTを明示的に指定しないとエラー。
　　・EXECで他プロジェクトのファイルをEXEC可能。
　　　・LOAD同様、"PRG1:"のようにSLOTを明示的に指定しないとエラー。
　　　・このとき、カレントプロジェクトは、他プロジェクトのものになる。
　　　・EXECしたプログラムが終了したあとは、カレントプロジェクトは、
　　　　実行直前のプロジェクトに戻る。
　　　・EXECでSLOTを指定しているため、
　　　　指定SLOTにプログラムがあったらそれは上書きされて消える。
　　　　・備考：EXECで、SLOT指定せず、SMILEボタンに登録したツールと同じプロジェクトのファイルを実行した場合、
　　　　  つまり通常SMILEボタンを使う流儀の場合は、
　　　　  内部的にはSLOT4にプログラムがロードされるため、
　　　　  SLOT0～3のプログラムは上書きされない。
　　・参考 http://d.hatena.ne.jp/eidaht/20160320/1458432429
　FILESの隠し仕様
　　・FILESの第一引数にプロジェクト名を指定できる。
　　　例：FILES"WORK"で、WORKというPROJECTのファイル一覧を取得できる。
　　　　　配列変数に格納して利用することも可能。
　現SLOTを知る方法
　　プログラム先頭でBACKTRACE実行後にCHKCHR命令で画面に表示されたスロット番号を取得
　　BACKTRACE:SLOT=CHKCHR(CSRX,CSRY-1)-48

(3.02で解決済み、備忘)ハング原因と対策
　・BGMPLAY 128直後にBGMSET 128実行を繰り返すとハング
　・再現コード（実行すると保存していないプログラムは消えるので、電源落としてもいい状態にしてから実行すること）＞ FOR I=0 TO 99999:IF I MOD 99==0 THEN ?I:ENDIF:BGMSET 128,"CDE":BGMPLAY 128:NEXT 
　・応急対策はBGMSET直後にWAIT 1を入れること。これでハングしなくなった
　・バージョン3.02では、上記は修正された。上記コードでハングしなくなったことを確認した。上記にWAIT 1を入れる必要はなくなった。
(3.02で解決済み、備忘）VSYNCちらつきバグ対策
　　VSYNC後にfor空ループ999回を実行　※New3DSでVSYNCが想定より短時間で終了するバグ。3.02で修正済み

プチコン3号公開キー
　ソフトシンセWAVLPF：V3EN3JK1 ※Cutoff+reso、簡易オートメーション付
　　DEMO SOUND： https://soundcloud.com/cat2151/wavlpf-demo-20150301
　　説明書： https://miiverse.nintendo.net/posts/AYIHAAAEAAA5VHwlAmxH8Q
　簡易リズムシーケンサ開発中：S344FD
　処理落ちチェックツール（関数）：N3ANEDRS 
　MICオシロスコープ： QKADJ3KD ※autoGain,noiseGate付
　MML移調： BA5XE33J ※scale変更付
　SPANIMやWAVSETの10行～1画面サンプルTIPS集： PE3X3NQE
　MENU関数： T45XA3R4　※簡易仕様。関数 MENU$() を呼ぶだけで使えます

リンク
プチコン3号　備忘録（Github.Gist版）
https://gist.github.com/cat2151/d35667ee8227919165c3
プチコン3号　備忘録（Qiita版）
http://qiita.com/cat2151/items/c289b650d28006b78f92
BLEデバイスにIPが付与されると何がうれしいのか？

BLEデバイスにIPが付与されると何がうれしいのか？

先日Bluetooth 4.2の情報を翻訳したのですが、4.2からIPベースになりそうなので、それによって広がる世界を妄想してみます。

[IoT - Bluetooth 4.2 クイックリファレンス 日本語 - Qiita](http://qiita.com/kazuph/items/6235c090cbfa18db3347)
[BLE - Bluetooth 4.2 FAQ 日本語 - Qiita](http://qiita.com/kazuph/items/966b0652ac4144be5aa0)

妄想ですので、実際にそうなるかはわかりませんが、4.2以降のバージョンアップによって実現するものも多くあると思います。

## Bluetooth 4.2によって入ったIPサポートによってBLEとネットの区別がなくなる

Bluetooth 4.2から正式にIPv6をサポートします。これによって室内にBLEデバイスが溢れかえったとしても、湯水のごとく湧くユニークなIPがすべての端末に割り振られますので、デバイスの識別とデバイス間の通信が容易になります。

またWebの概念が導入されてBLEを操作するための標準化されたRESTなAPIも準備されれば、WebエンジニアがそのままIoTの世界にこれるので、学習コストが大幅にさがるようになるでしょう。

## BLEデバイスが自律的にネットワーク越しの他のBLEデバイスと協調しやすくなる

BLEの電波が届かない範囲のデバイスとネットワーク越しに協調動作が可能になります。

IPベースですので、見えるIPを持つBLEデバイスに対して気軽に通信できるようになります。

BLEの電波の届かない1階から3階に対して、電気をつけたりエアコンを消したり、3階の状況から1階の状況を変化させることもできるでしょう。

今までできなかったわけではないですが、IPベースで実装できるの格段に楽になりそうです。

## BLEデバイスのデータがそのままクラウドへ

今まではスマフォや専用ゲートウェイが周辺のBLE機器のデータを収集する、そういう実装を行うことによって情報をネットに上げる必要がありましたが、IPベースになることによってゲートウェイがあるだけで、デバイスのAPIを直接叩くことができるので、データの収集が容易になります。

これもまた実装の簡単化ですかね。

## メッシュ/ゴシッププロトコル

インフラの世界でserfというものがありますが、これは自分がつながっているサーバークラスタにゴシップ（噂）を流すことができます。ゴシップが到達することをきっかけとして、それに対応する処理を各サーバーが取るというものです。

例えばスマフォを持った人が家に入った（クラスタ内に追加された）ことがわかれば、家中にゴシップが流れて、それと連動して電気をつけたり、お風呂を沸かし始めたり、コーヒーを入れたり、暖房をつけたりと、各々のデバイスが追加イベントと連動した処理を行うことができます。

クラスタ内にあるデバイスが入った・出たという情報に起因する各デバイスのイベントのみ登録しておけば、あとはよしなに処理を行ってくれる世界があるわけです。

概念的いうと、中央集権的に一つのデバイスが他のデバイスたちに命令を行うのではなく、予め自分の役割を知っているデバイスたちが無数にあって、一つの情報（ゴシップ・噂）をきっかけにデバイスたちが自律的に動作しやすくなります。

これも実装の話かもしれませんが、それがやりやすいという環境があるだけでそのような利用が加速するでしょう。

ゴシッププロトコルはWebの技術ですが、BLEデバイスがIPベースになることで、BLEデバイス版が登場するかもしれませんね。

## まとめ

- IPが付与されることでネット越しにAPIを叩くかのように通信できる（ようにするのが簡単になる）
- BLEデバイス同士がIPベースでやりとりすることで協調動作が簡単に（実装できるように）なる

以上、短いですがIPベースになることで描ける世界を妄想してみました。

ほぼ実装の話かな？という感じなのですが、各デバイスがオリジナルの識別子（IP）を持つという概念が、サービスにかなり大きな影響を与えそうだなと思います。

そういう意味で今回のこのBluetooth 4.2は今後大きな意味を持ってくると思っています。
今はまだ各BLEチップベンダーからの提供待ちなわけですが、4.2が採用されたデバイスが世界中に広がるとおもしろいですね。
AWS EC2インスタンス作成時 User DataによりタイムゾーンをJSTに変更する

■はじめに
===

お疲れ様です。
AWSのEC2インスタンスをAmazonLinuxで作成した場合、デフォルトのタイムゾーンはUTCになっております。

EC2インスタンス初回起動の際、User DataによりタイムゾーンをJSTに変更する設定メモです。

Launch Instanceで作成したEC2インスタンスのタイムゾーンはデフォルトでUTCになっております。

```
$ date
Tue Dec 23 01:30:39 UTC 2014
$ cat /etc/sysconfig/clock
ZONE="UTC"
UTC=true
$
```

■使用したAMI
===

・Amazon Linux AMI 2014.09.1 (HVM) - ami-4985b048

■Launch Instanceの際にUserDataに貼り付ける設定
===

[AWS Management Console] -> [AWSアカウントにEC2インスタンス作成権限を持つIAMユーザーでログインする] -> [EC2] -> [Instances] -> [Launch Instance]を選択する。

EC2インスタンス作成画面の中で[Step 3: Configure Instance Details]の[Advanced Details]を選択します。

[User data]に[As text]で、以下のコマンドを貼り付けて、EC2インスタンスを作成します。


```
#!/bin/sh

echo "User Data start"

yum -y update

unalias cp
cp -f -p /usr/share/zoneinfo/Japan /etc/localtime

cat << _EOT_ > /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
_EOT_

chmod 644 /etc/sysconfig/clock

/etc/init.d/crond restart

echo "User Data end"
```

■User Dataを設定して作成したEC2インスタンスのタイムゾーン
===

ECインスタンスを作成すると、User DataによりタイムゾーンがJSTとして起動されます。

```
$ date
Tue Dec 23 11:19:45 JST 2014
$ cat /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
$

$ sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest                                         | 2.1 kB     00:00
amzn-updates/latest                                      | 2.3 kB     00:00
No packages marked for update
$
```

なお、User Dataの実行ログは以下で確認可能です。

```
cat /var/log/cloud-init-output.log
```

また、EC2インスタンスに設定しているUser Dataの内容は以下でも確認出来ます。

```
cat /var/lib/cloud/instance/user-data.txt
```
Vue.js + jQueryプラグイン


業務でIE9〜の案件が降ってきたので、vue.jsを使ってみた。
よくあるスライド切替をvue.js + jQuery + jQuery.bxSliderで。    
  
###スライド画像が繰り返される部分に`v-repeat`を設定

```jade:index.jade

ul(id='slide')
	li(v-repeat='photos')
		img(src="{{photo}}", alt="{{title}}")
		
```

###`vue.js`で要素を描画してからjQueryプラグインを適用
```javascript:index.js

var slide = new Vue({
		el: '#slide',
		data: {
			photos: [
				{
					"photo": "画像1のパス",
					"title": "画像1の名前"
				},
				{
					"photo": "画像2のパス",
					"title": "画像2の名前"
				}
			]
		}
	});
	jQuery("#slide").bxSlider();

```

これで行けました。
VC++装飾名のデマングルツール

[undname.exe](http://msdn.microsoft.com/ja-jp/library/5x49w699.aspx)

```
> undname /show_flags
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Usage: undname [flags] fname [fname...]
   or: undname [flags] file

where flags are the following OR'd together:

0x0001  Remove leading underscores from Microsoft extended keywords
0x0002  Disable expansion of Microsoft extended keywords
0x0004  Disable expansion of return type for primary declaration
0x0008  Disable expansion of the declaration model
0x0010  Disable expansion of the declaration language specifier
0x0060  Disable all modifiers on the 'this' type
0x0080  Disable expansion of access specifiers for members
0x0100  Disable expansion of 'throw-signatures' for functions and pointers to
        functions
0x0200  Disable expansion of 'static' or 'virtual'ness of members
0x0400  Disable expansion of Microsoft model for UDT returns
0x0800  Undecorate 32-bit decorated names
0x1000  Crack only the name for primary declaration
        return just [scope::]name.  Does expand template params
0x2000  Input is just a type encoding; compose an abstract declarator
0x8000  Disable enum/class/struct/union prefix
0x20000 Disable expansion of __ptr64 keyword
```