OmniAICreator/Qiita-1.07M huggingface dataset:
[Gimp] Pythonでスクリプトをはじめる

すごく簡単なスクリプトを作成してみます。

# スクリプト作成場所
スクリプトを作成する場所は
「編集」-「設定」-「フォルダー」-「プラグイン」で表示されている場所に配置します。
バージョンは2.8です
![gimp_config.png](https://qiita-image-store.s3.amazonaws.com/0/17192/d8fcdc1b-e6dd-fd1a-8bc6-d87155ed7221.png)

# スクリプト
Gimpに登録することで実行できるようになるようです。
registerメソッドの引数に色々設定します。
詳しくはドキュメントなどを参照ください。

```py
#coding: UTF-8
from gimpfu import *

def plugin_main(timg, tdrawable):
    pdb.gimp_message("TEST")

# Gimpに登録する
register(
        "python_fu_resize",  # コマンドラインまたはスクリプトから呼び出す場合のコマンドの名前
        "",  # プロシージャブラウザに表示されるプラグインに関する情報
        "",  # プロシージャブラウザに表示されるプラグインに関する情報
        "o-kuhiiro",  # 著者の名前
        "o-kuhiiro",  # 著作権保持者の名前
        "2015",  # 著作権の年
        "<Image>/test.py",  # メニューの中でプラグインに使用されるラベル 
        "RGB*, GRAY*",  # プラグインで処理する対象となる画像のタイプ
        [],  # 引数
        [],  # 戻り値
        plugin_main  # 関数名
)

main()
```

# 実行
適当な画像をGimpで開きます。そうするとメニューに
![gimp_py_run.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/2c701a46-31a5-c6a8-2365-89b1904569c5.png)
とでるので実行できるようになります。

あと、「フィルター」-「Python-Fu」-「コンソール」で対話モードが起動できます
MySQLでジョブキューを作る時に、処理する行にマークする話

## やりたいこと
MySQLを使ってジョブキューを実装する時（など）に、テーブルのある行を何らかの理由でマークしたいことがあります。例えば各行が処理するジョブを表しているとして

- 処理されていないジョブに、処理中マークを付ける
- 処理が終わったジョブに、処理済みだとマークを付ける

などなど。そしてジョブ処理は並列に行われることにすると、マーク処理はアトミックでなければなりません（複数のスレッドが、自分がマークに成功したと思い込むと、ジョブの処理が複数動きかねません）。

もちろん強いトランザクションを付ければ原理的にはどうとでもなるのですが、ジョブが複数のスレッド・プロセスで分散実行する場合を考えると、同期によるコストを極力下げたいものです。

こんな感じの前提のもと、MySQL/SQLではマーク処理をどう書くのか、という点について調べてみました。

## ざっくりした方針
問題をもう少し分割します。
1. マークされていない行をどうやって見つけるのか
2. 行を極力低コストにマークするにはどうすればいいのか

1.については、何らかのタイミングでSELECT文が発行されているものとします。例えば定期的に……。効率的な方法については、この記事では検討しません。理想的にはイベント駆動になるとよさそうですが。

2.については、ロックフリーのアルゴリズムで見られるような、Compare-And-Swap(CAS)に類似したテクニックでマークをします。つまり「指定した行が期待通り未マークであったなら、マーク済みの行へと更新する」ということをアトミックにやります。もちろん実際は行レベルでのロックが入っているはずですが、実行コストは極力抑えられると期待されます。

## 具体的な実装例
ジョブを表すテーブルを用意します。テーブルには、ジョブを一意に決定する`id`と、マーク済みかどうかを表す`marker`があります。

```sql
CREATE TABLE job_table (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  marker BOOLEAN
) ENGINE=InnoDB;
```

未マークのジョブがあるかどうかを調べるには、SELECT文を発行します。ここでは単に最大1件取得します。

```sql
SELECT id, marker FROM job_table WHERE marker=0 LIMIT 1;
```

取得した未マークのジョブをマークするには、次のUPDATE文を使います。

```sql
UPDATE job_table SET marker=1 WHERE id=<id> AND marker=0;
```

`<id>`には、SELECT文で取得したマークしたいジョブのIDを与えます。WHERE節に`marker=0`があることで、未マークであることを確認しつつマークを付けることができるようになっています。

マークが成功したかどうかは、SQL文発行後のいわゆるrows affectedを調べればいいです。JDBCでいえば`executeUpdate()`かな。1が返ってくればマークできたことになります。

## まとめ
例では単なる2値をとる`marker`でしたが

- 自分が期待している値であることを`WHERE`節で表す
- UPDATEによって、UPDATEのWHERE節に引っかからないように行を書き換えることで、UPDATE操作が1回のみ成功する

これらのテクニックは汎用性があるもののように感じますし、もっと複雑な状態変化をつくることもできます。

## 参考
- http://www.engineyard.co.jp/blog/2013/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/
    - この記事に書いたロックの問題以外にも、MySQLのテーブルをキューとして利用する場合の典型的な問題についての方針が述べられています
Pycharmで日本語入力ができなかった時

ルートでインストールしたせいか起動後日本語入力ができなかった。
（Geditもrootやwwwで日本語ができなかった）
以下のコマンドでとりあえず日本語使えるようになった（ターミナル上）。

```shell-session
sudo XMODIFIERS=@im=ibus GTK_IM_MODULE=xim pycharm&
```

なお文頭にこれつけないと日本語はアスキーなんちゃらエラーだった。

```shell-session
# coding=utf-8
```

テンプレの変更は、
file -> setteings -> File and Code templates

ついでにpipからのモジュールのインストールは
file -> setteings -> project interpreter -> configure interpreters -> install 
先の下段でモジュールを検索して突っ込む感じみたいだ。

mecabを突っ込もうとしたらエラー
元々入れてた奴とバッティングしたっぽい＞＜

うーん
VMwareを新しく立ちあげてやった方がよかったのかも...

今のところubuntuのみ確認
UUID version1の生成アルゴリズム

# きっかけ
友「IDの採番にMySQLのAUTO INCREMENT使ってるけど、インサートしないとIDが作れないから面倒。」
友「UUID v1で採番するのってありだと思うんだけどどうだろう」
俺「けどUUIDってシーケンシャルじゃないからMySQLに格納するなら相性悪いで[^1]」
友「UUID v1ってタイムスタンプとMACアドレスから生成するからシーケンシャルだと思うけど」
俺「え、そうなん？」

というわけで調べたらシーケンシャルじゃなかったんだけど、せっかく調べたのでUUID v1なIDの作り方をまとめる。

# UUIDとは？
UUIDはこんなID

```
b39fc2e2-1cd6-11e5-9a21-1697f925ec7b
```

で、形式はこれなんだけど生成方法が5種類あって、よく使われるのはversion1と4。[RFC4122](http://tools.ietf.org/html/rfc4122.html)で規定されている。このエントリではv1の方の作り方をまとめる[^2]。

# 生成アルゴリズム
UUIDのフォーマットは4つハイフンで区切られた5つのセクションに分かれるが、これはそれぞれ

- タイムスタンプ(後述)の下位32bit
- タイムスタンプの真ん中の16bit
- versionが4bitとタイムスタンプの上位12bit
- クロックシーケンス16bit(後述)
- MACアドレス48bit

となる。
タイムスタンプは普通のunixtimeではなく、1582/10/15 00:00:00 UTCからの100ナノ秒単位のタイムスタンプ。
クロックシーケンスは同じ時間同じMACアドレスでIDを生成しても別のIDになるためのビット。前回のUUID生成時のタイムスタンプとクロックシーケンスが分かり、かつ現在のタイムスタンプが前回のタイムスタンプより小さい場合にインクリメントする。普通に現在のタイムスタンプが前回より大きかったら前回のクロックシーケンスをそのまま使う。前回のタイムスタンプかクロックシーケンスがわからない場合はランダムな値を使う。

# 実際に作ってみる
タイムスタンプを計算する。

```
$ echo "obase = 16; ibase = 10; $(date -d'1582/10/15 00:00:00 UTC' +%s) * -10000000 + ($(date +%s%N) / 100)" | bc
1E51CF5E4A5E520
```

で、上から12bit, 16bit, 32bitと分割すると1E5 1CF5 E4A5E520。で、バージョンが1なので、UUIDの最初の部分がE4A5E520-1CF5-11E5-...になる。

でクロックシーケンスはとりあえず今は何でもいいから0000にしておく。
実験に使ってるvmのMACアドレスが今08002700bc01。

```
$ ifconfig | grep HWaddr
eth0      Link encap:Ethernet  HWaddr 08:00:27:00:bc:01
```

というわけで全部くっつけると、E4A5E520-1CF5-11E5-0000-08002700BC01となる。
uuidgen -tってコマンドでUUID v1の生成が出来るので、タイムスタンプ生成した時間とほぼ同時にid生成すると

```
$ uuidgen -t
e4a668b8-1cf5-11e5-b07c-08002700bc01
```

うん、あってる。

[^1]: プライマリーキーにすると強制的にインデックスが作られる。で、インサートされる位置がランダムだとインデックスの更新にコストがかかる。と思ってたけどぐぐったら検証した人がいて環境にもよるんだろうけど思ったほどのパフォーマンス低下じゃないらしい - [MySQLテーブルの主キー(Primary Key)をUUIDにした場合のパフォーマンス - Annadel](http://www.kamomeapps.com/blogs/annadel/mysql%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%B8%BB%E3%82%AD%E3%83%BCprimary-key%E3%82%92uuid%E3%81%AB%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E/)

[^2]: v4はランダム性が高くて、はなからシーケンシャルにならないのは分かってたので。
T2.smallインスタンスでDeep Security Agentを動かしてみた

こんにちは、ひろかずです。

社内でt2.smallを使いたい話が出たので、一筆書きます。

AWSインスタンスファミリーにT2インスタンスが追加されました。
smallインスタンスについては、メモリが1GB(t1.small)から2GB(t2.small)へと倍増されたため、ワークロードの少ないサーバについては、t2.smallの利用が選択肢に入ってくると思います。

T2インスタンスの特色として、CPUクレジットが目を引きます。

[公式リリース](http://aws.typepad.com/aws_japan/2014/07/low-cost-burstable-ec2-instances.html)から引用しますと、

```
t2.smallインスタンスは、2.5 GHz(ターボモードで最大3.3GHz)のIntel Xeonプロセッサのシングルコアの20%へアクセスすることができます。
```
とあり、

```
CPUクレジット
上記の表に示すように、各T2インスタンスは、インスタンスのサイズによって決定される速度でCPUクレジットを受け取ります。 1CPUクレジットは1分間の完全なCPUコアのパフォーマンスを提供します。
```
とあります。

[公式リリース](http://aws.typepad.com/aws_japan/2014/07/low-cost-burstable-ec2-instances.html)を読む限り、CPU利用率のベースライン(t2.smallは20%)を超過すると、CPUクレジットを使用してバーストするようです。

#検証目的とスコープ
t2.smallを使用した場合、Deep Securityの動作によりCPUクレジットをどれくらい使用するかを明らかにする。

Deep Security Agent側でCPUを主に使用すると言われている機能のうち、定常的に動作させることが想定される、以下機能を使用した時のCPUクレジット使用状況の確認する。

- 不正プログラム検索機能のスケジュールスキャン
- 予約タスクで実行する変更検索タスク

#環境情報
- Deep Securityは、9.5sp1を使用しました。
- Deep Security ManagerとAgentは、同一VPC内に配置します。
- Deep Security Agentを導入するインスタンスは、Ubuntu(3.13.0-53-generic)を使用しています。
- Deep Security Agentを導入するインスタンスには、nginxが導入されていますが、サービスリクエストは流入していません。
- Deep Security Agentを導入するインスタンスのストレージはEBS(Standard)で、サイズは8GBにしています。
- 不正プログラム検索設定は、`Default Schedule Scan Configration`を使用します。
- 変更検索タスクの対象は、「Trend Micro Deep Security 9.0 変更監視ルール スターターガイド」掲載のディレクトリを対象とします。(URL確認中)

#検証手法
- 毎時20分に不正プログラム検索を実行する。
- 毎時45分に予約タスクにて変更検索を実行する。
- 試験期間は24時間とする。

#結果
![CPU-Credit.png](https://qiita-image-store.s3.amazonaws.com/0/46611/e2a67d95-1dbb-7a6c-9e85-c41ebe0bc58d.png "CPU-Credit.png")
右肩上がりの青い線がCPUクレジットです。
オレンジのスパイクしている線がCPUクレジットの使用を示しています。
大きいスパイクが不正プログラム検索を実行した時点のもので、1回あたり1.4クレジット程度を消費しています。
小さいスパイクは、変更検索タスクを実行した時点のものです。

CPUクレジットが粛々と蓄積されていることから、本検証の条件下では、Deep Securityの動作単体でのCPUクレジット消費はあまりない事が分かります。

2時間程度にズームすると以下のようになります。
![CPU-Credit-zoom.png](https://qiita-image-store.s3.amazonaws.com/0/46611/e486c77d-10c8-74ee-e54f-a39ca329fde1.png "CPU-Credit-zoom.png")

CPU利用率を見てみると、t2.smallのベースライン(20%)を超過していることがわかります。
![CPU-Util-t2small.png](https://qiita-image-store.s3.amazonaws.com/0/46611/8f01df7f-aa14-a079-b5ee-9ae2c00585b5.png "CPU-Util-t2small.png")

#最後に
今回の検証では、Deep Securityの動作がCPUクレジットをそれほど消費しないことが分かりました。

一方で、CPU利用率が20%を超えた時点でCPUクレジットを使用することも分かりました。
CPU利用率を常時20%を超えるワークロードが発生する環境では、CPUクレジット枯渇によるパフォーマンス劣化が予想されます。

t2.smallを利用する際は、CPUクレジットの残高推移をウォッチして、適切なインスタンスサイズに変更できる余地を残しておくのがいいと思われます。

本日はここまでです。
お疲れ様でした。
ROS (Robot Operating System) のインストール


## はじめに

* ROS (Robot Operating System) の環境を作ってみました。
* 先日、Pepper くんも正式対応というニュースがありましたので、少し勉強しておこうか、という感じです。

 [PepperがROSに正式対応！ - ソフトバンク](http://www.softbank.jp/robot/news/developer/20150615a/)

## ROS

* [ROS.org](http://wiki.ros.org)

> ROS (Robot Operating System) provides libraries and tools to help software developers create robot applications. It provides hardware abstraction, device drivers, libraries, visualizers, message-passing, package management, and more. ROS is licensed under an open source, BSD license.

* [Robots Using ROS](http://wiki.ros.org/Robots)

上のリンクを見ながら、ロボットの種類もたくさんあるのですねー、と思っていたら・・・。

![2015062801.png](https://qiita-image-store.s3.amazonaws.com/0/20418/34e4f5b2-dd9a-bd74-f6e3-c966084ba7f7.png "2015062801.png")

吹きそうになりました。実に Pepper くんらしい（？）。

* [Robots Using ROS > Pepper](http://wiki.ros.org/action/show/pepper?action=show&redirect=Robots%2FPepper)


## ROS インストール

今回、公式サポートのプラットホームである Ubuntu 15.04 (Vivid Vervet) 上にインストールしてみます。

### 参照ドキュメント

日本語のドキュメント「[ROS Indigo の Ubuntu へのインストール](http://wiki.ros.org/ja/indigo/Installation/Ubuntu)」を見ながら始めようかと思ったのですが、いきなり Ubuntu 15.04 の場合が書いてなくて戸惑いました。15.04 用のコマンドの予想はできましたが、一応、英語のドキュメント「[Ubuntu install of ROS Jade](http://wiki.ros.org/jade/Installation/Ubuntu)」を確認したところ、15.04 も対応していたので、こちらドキュメントで進めます。

### sources.listを設定する
```bash
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```

### 鍵の設定と、apt-get を最新版に
```bash
$ sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116
$ sudo apt-get update
```

### フル版でインストール
```bash
$ sudo apt-get install ros-jade-desktop-full
```

### rosdepの初期化
```bash
$ sudo rosdep init
$ rosdep update
```

### 環境変数の設定
```bash
$ echo "source /opt/ros/jade/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

### rosinstallの準備
```bash
$ sudo apt-get install python-rosinstall
```

## ROS チュートリアル

* [チュートリアル](http://wiki.ros.org/ja/ROS/Tutorials)

取り急ぎ、「初級」をさらさらと半分くらい読んで、turtlesim を触りつつ、ノードやらトピックやらを確認した感じになります。

![2015062802.png](https://qiita-image-store.s3.amazonaws.com/0/20418/b289f4b9-d49b-0c68-095f-3aad948acf97.png "2015062802.png")


## 感想

* ほとんどドキュメント通りですんなり行きました。
* まだ全然分かっていませんが、想像していたモノとは少し違いました。もっと面白そうなモノのようです。
SSL証明書の内容をopensslで確認する

# 発行されたSSL証明書の内容
　サーバSSL証明書の購入をベンダに申し込み、めでたく発行されたらサーバに挿すわけだが、そもそもベンダに渡したCSRが手違いであったりして、万が一誤った内容の証明書が発行されていた場合、サーバに挿しても動かない（HTTPSアクセス不可、警告表示など）という悲惨な目に合ってしまう。
　発行された内容が正しいかどうかをopensslコマンドで確認する方法があるので、是非覚えておきたい。
（正直コマンドをよく忘れてしまうので、このエントリはその備忘目的。）

## ハッシュ値の確認
秘密鍵、証明書、CSRの3つは全て同じハッシュ値が取れるようになっている。
これによりCSRをもとに作成された秘密鍵及び証明書が正しくできているかを確認することが出来る。

以下、それぞれのファイルのハッシュ値確認方法。
（ハッシュ値は適当）

### 秘密鍵のハッシュ確認

```bash
$ openssl rsa -noout -modulus -in {private_key} | openssl md5
(stdin)= a1b2c3d45e6f7a8b9c0d1e2f3a4b5c6d
```
### 証明書のハッシュ確認

```bash
$ openssl x509 -noout -modulus -in {certificate_file} | openssl md5
(stdin)= a1b2c3d45e6f7a8b9c0d1e2f3a4b5c6d

```
### CSRのハッシュ確認
```bash
$ openssl req -noout -modulus -in {CSR_file} | openssl md5
(stdin)= a1b2c3d45e6f7a8b9c0d1e2f3a4b5c6d
```

## 証明書の期限確認
発行された証明書の期限は申請通りになっているか？
有効期限だけなら以下のコマンドですぐ調べられる。

```bash
$ openssl x509 -noout -dates -in {certificate_file}
notBefore=Jul 10 08:59:59 2014 GMT
notAfter=Jul 10 09:00:10 2024 GMT
```

## 証明書全内容確認（対象ドメインなど）
最後に証明書の内容全体を確認する方法も。
（出力内容は適当）

```bash
$ openssl x509 -text -noout -in {certificate_file}
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 01234567890123456789 (0xabcdef0123456789)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, L=Hogehome-ku, O=hogehoge.com, OU=Ops, CN=hogehoge.com
        Validity
            Not Before: Jul 10 08:59:59 2014 GMT
            Not After:  Jul 10 09:00:10 2024 GMT
        Subject: C=JP, ST=Tokyo, L=Hogehome-ku, O=hogehoge.com, OU=Ops, CN=hogehoge.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:
                                     ・
                                     ・
                                     ・
                    00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:
                    ff:00
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
         00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:
                                ・
                                ・
                                ・
         00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:
         aa:00:99:bb
```
ちょっとRuby on Railsの流れが見えてきた（気がする） 

本を読みながらコード書いたり、動かしたりしていても細かい動きが解らなくて、わかったようなわからないようなそんな感じだったのですが、細かく見ていくと何となく見えてきたような。。。
理解が足りないところなど、ご指摘いただければ助かります。

```Ruby:UsersController.rb
  def index
    @users = User.all
  end
```

```index.html.erb:
<h1>Users</h1>

<ul>
  <% @users.each do |u| %>
    <li>
      <%= link_to u.name, user_path(u.id) %>
    </li>
  <% end %>
</ul> 
```

コントローラの`index`内で作られた`@users`をビューのindex.html.erbに渡す流れなのですが、こう単純に見ると繋がりが見えやすいと思います。
コントローラの`index`内で明示的に`render`を書かないと対応するテンプレートが自動で呼び出されるそうです(index.html.erb)。

```index.html.erb:
<h1>Users</h1>

<ul>
  <% @users.each do |u| %>
    <li>
      <%= link_to u.name, user_path(u.id) %>
      <%= link_to "[Edit]", edit_user_path(user.id) %>
    </li>
  <% end %>
</ul> 
```

```Ruby:UsersController.rb
  def edit
    @user = user.find(params[:id])
  end
```

`link_to "[Edit]", edit_user_path(user.id)`から`edit_user_path(user.id)`にページ移動する時の`edit`内の`params[:id]`。ここの`params`はリンクによるパラメータの受け渡しで`params[:id]`と`edit_user_path(user.id)`の受け渡しをしているみたいです。


```Ruby:user.rb
class User < ActiveRecord::Base
  validates :name, presence: { message: "未入力" }, 
                      length: { minimum: 3, message: "3文字以上" }
end
```

```edit.html.erb:
<h1>Edit</h1>
<%= form_for @user do |f| %>
  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
    <% if @user.errors.any? %>
      <%= @user.errors.messages[:name][0] %>
    <% end %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>
```

```Ruby:UsersController.rb

  def update
    if @user.update(user_params)
      redirect_to user_path
    else
      render 'edit'
    end
  end

  def edit
    @user = user.find(params[:id])
  end

  def user_params
    params[:user].permit(:name)
  end
```

`edit`が`@user = user.find(params[:id])`でuser情報を保持してedit.html.erbを表示。`form_for`でフォームを生成、`if @user.errors.any?`でエラーのチェックをしてますが、Userモデルでのvalidatesの設定を見ているようです。`@user.errors.messages[:name][0]`で各エラーの`message:`を拾えるみたいです。`f.submit`はリファレンスによると、引数を指定しないと、対象のモデルが保存済みかを調べて、「Create モデル名」「Update モデル名」のどちらかを表示するようです。
CompassとNodeJSをHerokuに環境構築した


初めてのNodeJSをHerokuへデプロイしてはまりました。
express4とsass(node-compass)をHeroku上にデプロイしたら、CSSの出力箇所でプロセスごと落ちてしまいApplication Errorが表示されるという事態になりました。
そういえばRubyのCompassが必要だったのを思い出し、どうやってCompassインストールするんだろうとググっていたら
以下のURLで解決しました。
https://stackoverflow.com/questions/28953002/heroku-express-app-error-spawn-compass-enoent/29046807#29046807
備忘録。

# 手順
コンソールで以下のコマンドを打ちます。

```bash:Console
heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
```

プロジェクトフォルダ直下に以下の2つのファイルを作成しgit add。

```text:.buildpacks
https://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-ruby.git
```

```ruby:Gemfile
source "https://rubygems.org"
gem "compass"
```

プロジェクトフォルダ直下で以下のコマンドを打ちます。(bundleコマンドはRubyのbundlerというパッケージに含まれている)

```bash:Console
bundle install
```
すると直下にGemfile.lockという名前のファイルができるのでgit addします。


##Git Push
```bash:Console
git push heroku master
```
以上でうまく動きました。
# その他
デプロイを何度か失敗したら以下のようなエラーが発生しましたが、コンソールで解決しました。
heroku[router]: at=error code=H14 desc="No web processes running" method=GET path=...

```bash:Console
heroku ps:scale web=1
```
playのアクション合成を使って、localhostからのリクエストに制限

バッチ処理用のAPIや管理ツールなどは、一般のユーザにはアクセスさせず、デプロイしているサーバ上からのみなど、リクエストを制限したいことがあります。

reverse proxyを使っているなら、プロキシのルールでコントロールできますが、play単体で実現するやり方です。

アクション合成を使います。
https://www.playframework.com/documentation/ja/2.3.x/JavaActionsComposition

リクエストのホスト情報をみて、「localhost」から始まってるときだけ後続のアクションに渡すようにします。

```lang:LocalAction.java
public class LocalAction extends Action.Simple {

    public Promise<SimpleResult> call(Http.Context context) throws Throwable {
        String host = context.request().host();
        if (host.startWith("localhost")) {
            return delegate.call(context);
        } else {
            Logger.info("illegal access from " + host);
            return Promise.<SimpleResult>pure(badRequest());
        }
    }

}
```

あとは@Withアノテーションで、合成します。Controllerクラスにつけても、特定のアクションメソッドにつけてもよいです。

```lang:AdminController.java

@With(LocalAction.class)
public AdminController extends Controller {

    // 管理ツールへのログイン画面
    public static Result login() {
        ...
    }
    
    
}

```

#### 蛇足

play scalaなら、フィルターでも同様のことができます。下記にもあるように、特定のアクションを制限したいという目的であれば、アクション合成の方が自然のようです。
https://www.playframework.com/documentation/ja/2.2.x/ScalaHttpFilters

play javaでもscalaコードを混ぜてもいいなら、上のフィルターを使うやり方もありです。

最新のplay2.4.xでは、javaのフィルター機能が追加されたのがありがたいです。
Elixirでファイルの読み込みを試してみる


まずは簡単な文字が記述されたテキストファイルを準備。

```sample.txt
ABCDEFG
abcdefg
ほげほげ
ぴよぴよ
```

`iex`を起動して、`File`モジュールでファイルを読み込む。
ちなみに、変数`contents`に戻り値であるファイル内容を取り出している。

```
iex(1)> File.read "sample.txt"
{:ok, "ABCDEFG\nabcdefg\nほげほげ\nぴよぴよ\n"}

iex(2)> {:ok, contents} = File.read "sample.txt"
{:ok, "ABCDEFG\nabcdefg\nほげほげ\nぴよぴよ\n"}

iex(3)> contents
"ABCDEFG\nabcdefg\nほげほげ\nぴよぴよ\n"
```

直接、ファイル内容を取り出すこともできる。

```
iex(4)> c = File.read! "sample.txt"
"ABCDEFG\nabcdefg\nほげほげ\nぴよぴよ\n"

iex(5)> c
"ABCDEFG\nabcdefg\nほげほげ\nぴよぴよ\n"
```


当然、存在しないファイルを読み込もうとするとエラーになる。

```
iex(6)> c = File.read! "unknown.txt"
** (File.Error) could not read file unknown.txt: no such file or directory
    (elixir) lib/file.ex:245: File.read!/1
```

だんだん`Elixir`に慣れてきた感じ。まだまだ先は長い。
dweet.ioでIoTデータをカジュアルに可視化する

# IoTデータをカジュアルに可視化する方法です。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/8572ede5-518d-094b-9353-780243f5f201.png)

## [dweet.io](https://dweet.io/)って？
dweet.ioはIoTデータ可視化サービスです。
dweet.ioのAPIを叩くことで、IoTデータをガシガシ登録することができ、自動でグラフ表示してくれます。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/d7079920-b056-7a1f-3a98-5d6ddf1d6463.png)

また、グラフは、[freeboard.io](http://freeboard.io/)とも連携しているので、ダッシュボードを作成することもできます。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/cf1a566e-8925-cc79-8ec9-d93ea69b8d9b.png)

結構おしゃれにもできます。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/ac196c85-cb50-67b6-bacf-d6fc5024807a.png)

# dweet.ioでできること
## Dweeting
 * データ登録のこと
 * `https://dweet.io/dweet/for/my-thing-name?hello=world` の my-thing-nameを自分の好きなものに変えることで自分のデータを登録することができます。**Lock（有料）をかけないとデータは誰でも見ることができ、誰でも対象のURLにデータを登録することができます。**
 * JSONのデータも登録できます。
 * レスポンス

```
{
  "this": "succeeded",
  "by": "dweeting",
  "the": "dweet",
  "with": {
    "thing": "my-thing-name",
    "created": "2014-01-15T17:28:42.556Z",
    "content": {
      "hello": "world",
      "foo": "bar"
    }
  }
}
   ```

## Getting Dweets
 * データ取得
 * 最新データ`https://dweet.io/get/latest/dweet/for/my-thing-name`と、全過去データ`https://dweet.io/get/dweets/for/my-thing-name`の取得ができます
 * レスポンス

```
{
  "this": "succeeded",
  "by": "getting",
  "the": "dweets",
  "with": [
    {
      "thing": "my-thing-name",
      "created": "2014-01-15T18:41:17.166Z",
      "content": {
        "this": "is cool!"
      }
    },
    {
      "thing": "my-thing-name",
      "created": "2014-01-15T18:41:01.583Z",
      "content": {
        "hello": "world",
        "foo": "bar"
      }
    }
  ]
}
```


> **Note that dweet.io only holds on to the last 500 dweets over a 24 hour period. If the thing hasn't dweeted in the last 24 hours, its history will be removed.**

とあるようにデータは削除されていきます。

## Real-time Streams
* データのリアルタイム取得

## Alerts(有料)
* 通知
* メールアドレスに通知することができます。

## Client Libraries
* Node.js
* JavaScript
* Python
* Ruby

があります。お好きなクライアントからデータを登録できます。
軽く試すぐらいなら、[Play](https://dweet.io/play/)からブラウザ経由でデータを登録できます。

# dweet.ioのブラウザからできること
## Play
 * dweet.ioの各種APIを試せます。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/17270c67-7b61-4fae-8849-5fca4e6a18ab.png)

## Lock
* Lockの取得、設定ができます
* 1Lock/month あたり$0.99です。
* Lockをかけることで、

> Locks allow you to protect and reserve your thing so that only people (and things) with special keys can access it. Once you lock a thing, the name of that thing cannot be used by anyone else.

とあるように、URLを自分専用にでき、データをプライベートにすることができます。

## Discover
* publicになっているIoTデータを見ることができます。
* このページの一番最初の画像も公開されているURLのものです。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/1f95f781-c75b-1c73-8043-e4d8fee1846d.png)

# まとめ
自作した電子工作機器のデータを手軽に登録して、可視化したいときなどに使えそうです。
趣味の用途として使う分には便利かと思います。
データを可視化しようとすると、環境作って、ちょめちょめなど結構大変ですが、dweet.io使えばAPI叩けばいいだけなのでお手軽です。
また、Raspberry Piなどを使えば、最初からPythonも入っているのでdweet.ioのPythonクライント使って簡単にデータ登録開始できます。
コールバックベースの関数をプロミスオブジェクトに変換する

## 参考書籍
http://www.amazon.co.jp/Node-js-Design-Patterns-Mario-Casciaro/dp/1783287314

## 記事の背景
プレーンなJavaScriptだけだと、ちょっと非同期処理が連続するプログロムを書こうとした時にコードの可読性が著しく落ちてしまうことがある。
そこで、外部ライブラリ`bluebird`を使うことでこの問題を改善しよう、ということで、`Promise`を試してみた。

なお挙動理解のため、本来はすでにライブラリに実装してある`promisify`を自作している (`utilities.js`)。

ケースとしては単純で、任意のURLのコンテンツをダウンロードし、所定のディレクトリ（なければ作成）にセーブする、という一連のタスクが、Promiseを使う対象になる。

## コード

```js:utilities.js
var Promise = require('bluebird');

module.exports.promisify = function(callbackBasedApi) {
    return function promisified() {
        // promisified() に渡る引数を配列に変換する
        var args = [].slice.call(arguments);
        return new Promise(function(resolve, reject) {
            args.push(function(err, result) {
                if (err) {
                    return reject(err);
                }
                // このarguments には、err と result(単体のオブジェクト、または配列)が入っている
                if (arguments.length <= 2) {
                    resolve(result);
                } else {
                    // arguments の index の1以降を配列として resolve の引数に渡す
                    resolve([].slice.call(arguments, 1));
                }
            });
            // 上で詰めたコールバック関数も含めて、引数にAPIを適用する
            callbackBasedApi.apply(null, args);
        });
    };
};
```

```js:download.js
var path = require('path');
var Promise = require('bluebird');
var utilities = require('./utilities');

// callback-based-api を promisify する！
var request = utilities.promisify(require('request'));
var mkdirp = utilities.promisify(require('mkdirp'));
var fs = require('fs');
var readFile = utilities.promisify(fs.readFile);
var writeFile = utilities.promisify(fs.writeFile);

// データをダウンロードして
// 保存ディレクトリを作成し
// データを書き込み
// 後処理する
// というタスクを逐次的に行っている。
function download(url, filename) {
    console.log('Downloading ' + url);
    var body;
    return request(url)
        .then(function(results) {
            body = results[1];
            return mkdirp(path.dirname(filename));
        })
        .then(function() {
            return writeFile(filename, body);
        })
        .then(function() {
            console.log('Downloaded and saved: ' + url);
            return body;
        });
}

download('http://qiita.com', './sample/index.html');
```

##実行結果
このプログラムを実行したディレクトリ配下に、`sample`ディレクトリが作成され、index.htmlファイルが格納される。

##終わりに
コードを眺めるとややこしい、またはよくわからないものがあったので、個別に調べ、補足を入れることにした。
###new Promise(function(resolve, reject) {});
これは、 引数に取る関数に基づいて、 fullfil または reject する promise オブジェクトを作るコンストラクタで、
あとで呼び出されるthen() 関数の引数として渡されるコールバック関数がこのコンストラクタの実引数となる（ と思う）。
この関数の文脈では、callback-based-api のコールバック関数定義の中に、`resolve`と`reject`を包んで、`apply()`していることになる。
この関数は、`function (err, result) {}`のようなコールバック関数をとる非同期処理全般に利用することができる。

### [].slice.call(arguments);
この式単体で出てくるとなんのことかさっぱりわからなかったが、これについてとてもわかりやすい記事があった。
http://lealog.hateblo.jp/entry/2014/02/07/012014
[Ruby][注意！私的なネタ] みんな！rejectされたことあるんだぜ？


半年以上前のことですが、Matz直々のRejectを頂戴した貴重な体験だったので貼っておきますね。
https://bugs.ruby-lang.org/issues/10393
ぐうの音も出ないコメントだったのでreopenしてませんw
Elixir で無名関数を試してみる。


下記の例を見たら一目瞭然。

変数`f`に、`fn`と`end`の予約後で囲まれた無名関数を代入。
そして関数の実行には、ちょっと違和感があるが `f.()`のようにドット付きで呼び出す。

戻り値を変数`c`で受ければそのままである。

```
iex(1)> f = fn a, b -> a * b end
#Function<12.90072148/2 in :erl_eval.expr/5>

iex(2)> f.(2,3)
6

iex(3)> c = f.(2,3)
6

iex(4)> c
6
```

ここまでは簡単。

そして、今度はタプル`{}`を返してみた。リバースしてみる。

```
iex(5)> f = fn a, b -> {b, a} end
#Function<12.90072148/2 in :erl_eval.expr/5>

iex(6)> c = f.(2,3)
{3, 2}

iex(7)> c
{3, 2}
```

リストもリバース。

```
iex(8)> f = fn [a,b,c] -> [c,b,a] end
#Function<6.90072148/1 in :erl_eval.expr/5>

iex(9)> d = f.([1,2,3])              
[3, 2, 1]

iex(10)> d
[3, 2, 1]
```

`Elixir`の独特な感じが、なかなか良い感じ。今日はここまで。
Eclipseプラグイン作成

※Qiita始めたのでHatenaやめようと思ったので昔の写しです。

最近、Eclipseプラグインを作った。
とりあえず初歩の初歩だけど、jarにするまでの手順を書く。
（使ってるのはEclipse3.7の日本語化です。）

# プロジェクトを作る
Eclipseから、
「ファイル」→「新規」→「プラグイン・プロジェクト」
「プロジェクト名」を決めて「次へ」。

「ID」に適当にいれる。（アクティベーターのパッケージ名とかにするといい感じかも。）
「名前」に何プラグインなのかいれる。
「アクティベーター[^1]」にプラグインのアクティベータークラス名をいれる。
「次へ」。


次に選ぶのはテンプレート。
テンプレートを選んで作成すればかなり簡単に始められる。
いくつか試した奴だけ下記に説明する。

|テンプレート名||
|:--|:--|
|<b>インクリメンタル・プロジェクト・ビルダー付きプラグイン|Eclipseのビルドに乗っけて何かやれるプラグインを作るならここから始めるのがいい。|
|<b>エディター付きプラグイン|何かのファイルのエディターを作るならここから始めるのがいい。|
|<b>ビュー付きプラグイン|Eclipseの「ウィンドウ」→「ビューの表示」で出てくるビューを作るならここから始めるのがいい。|
|<b>Hello,Worldコマンド|Eclipseのメニュー・ツールバーにアクションを乗っけたいならここから始めるのがいい。|
|<b>カスタム・プラグイン・ウィザード|複合的にいろんなテンプレートをいっぺんに使いたい場合はここから始める。<br>普通のテンプレートには無い「設定ページ」があったりする。<br>（実は後でどうにでもなるので、作る範囲が決まってなければメイン部分のテンプレートで始めるといい）|


この次は、どのテンプレートを選んだかで入力項目が違うので勘で入れてく。
どうしてもわからなければ、一旦捨てプロジェクト作って試すといいと思う。


「完了」するとプロジェクトができてる。

# javaじゃないファイル
いくつかよくわからないファイルができてると思う。
基本的にはEclipseさんがUIで入力できるようにしてくれているので
気にせず突き進んでもいいけど、
一応なんとなくわかることだけ書く。

|ファイル名||
|:--|:--|
|<b>MANIFEST.MF|プラグインのIDとか名前とか持ってる。<br>他には、入ってなきゃいけないプラグイン（依存関係）とか<br>jar使ったりするならここに書かれる。|
|<b>plugin.xml|どんなプラグイン拡張があるか、それぞれどのクラスで動くか、ここに書いてある。<br>エディターがあって、このクラスですよ。とか、<br>ビューがあって、このクラスですよ。とか。|
|<b>build.properties|たぶんエクスポートの時に必要。<br>「javacDefaultEncoding.. = UTF-8」って追記しないと<br>プラグインのエクスポートでエラー[^2]になることがある。|

# デバッグ
plugin.xml（MANIFEST.MF）をダブルクリックすると、
プラグイン情報用のUIがエディタ領域に出てくる。
「概要」タブの右チョイ下に
「Eclipseアプリケーションをデバッグモードで起動」をクリックするとデバッグできる。

# プラグインをjarファイルにする（エクスポート）
デバッグと同じく「概要」タブの右下の
「エクスポート・ウィザード」をクリックして、
「宛先」（出力先）を適当に選んで「完了」するとjarができる。


# 参考
[Eclipseプラグイン開発メモ(Hishidama's Eclipse Plugin develop Memo)](http://www.ne.jp/asahi/hishidama/home/tech/eclipse/plugin/develop/index.html)
[Eclipse/プラグイン開発のTIPS集 - きのさいと](http://www.masatom.in/pukiwiki/Eclipse/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%B3%AB%C8%AF%A4%CETIPS%BD%B8/)
[Eclipseプラグイン開発](http://yoichiro.cocolog-nifty.com/eclipse/)
[ファイルツリー: blancoSqlEditorPlugin/trunk/src/blanco/plugin/sqleditor/editors/ (head) - blancofw (svn) - blanco Framework - SourceForge.JP](http://sourceforge.jp/projects/blancofw/scm/svn/tree/head/blancoSqlEditorPlugin/trunk/src/blanco/plugin/sqleditor/editors/)

[^1]: Activator。AbstractUIPluginを継承して作成されるクラス。プラグインの中心クラス
[^2]: Eclipseの環境によるっぽい。MS932で記載してたら要らないのかな？
Meteorの情報交換のため、日本語チャットルームを作った

最近巷を騒がせているMeteor。一昔前は完全に試作品オンリーだったこのフレームワークも、ドキュメントが増えてます。日本人開発者の方々も結構いるのではないかと。

日本人開発者の方々が気軽に情報交換できる場所が欲しかったので、Gitterでルームを作りました。よかったら使ってみてください

https://gitter.im/endows/meteor-jp
![スクリーンショット 2015-06-27 22.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/36652/d0ef6550-1252-d5ac-cfad-903dafc4c44c.png)
GitLab CI で CI 環境構築

以前からCIをやってみたいと思っていて、
最近個人プロジェクトの環境が整ってきたので、
CIの環境構築をしました。

# 構築前の状況
- Railsアプリの作成を始めて、最小限の機能ができたところ
- ソースはgitlab.comのプライベートリポジトリで管理
- RSpecで一通りテストも作ってある
- Capistranoでproduction環境へのデプロイもできるようになった

# CIサービスを選ぶ
GitHubを使っている場合は Travis CI や Circle CI が選べるのですが、
これらはGitLabとは連携できなさそうで、どうしようかと思っていたら
GitLabは独自に GitLab CI を提供しているようです。

# GitLab CIにプロジェクトを登録
https://ci.gitlab.com/
GitLabのアカウントでサインインすると、ダッシュボードが表示されて
自分のプロジェクトの中からCIに登録するものが選べるようになっています。

# GitLab CI Runner
プロジェクトを選んで設定を進めていくと、どうやらRunnerというのを
用意する必要があるようです。
説明文にあるリンクを辿っていくといろいろなRunnerが選べるようですが、
普通に Official GitLab Runner をパッケージでインストールすることにしました。
インストールが終わるとRunnerが自動的に起動して、
特に設定などしなくてもそのまま最後まで使えました。

# ジョブの設定
プロジェクトの設定に戻ってくると、先ほどインストールしたRunnerがもう使えるようになっています。
この後は実行するジョブを指定していくわけですが、
どうも最近になって指定する方法が変わって、
以前は設定画面で直接指定していたのが、
今はリポジトリ直下に.gitlab-ci.ymlというファイルを作る方式になったようです。
このファイルの仕様についてはGitLabでもまだ検討中のようで、
ちゃんとした説明が見つからなくて困りましたが、
いろいろ試行錯誤して何となく動くものができたので、
ちゃんとした書き方になっているか自信はないですが、載せておきます。

```..gitlab-ci.yml
before_script:
  - ruby -v
  - cp /var/rails/MyApp/shared/.env .
  - cp config/database.yml.ci config/database.yml
  - bundle install --path vendor/bundle

rspec:
  script:
    - bundle exec rake db:setup RAILS_ENV=test
    - bundle exec rake spec
  tags:
    - ruby
    - mysql

production:
  script:
    - bundle exec cap production deploy
  tags:
    - capistrano
    - debian
  only:
    - master
```

# その他の環境設定
- RSpecのテストでMySQLを使うようにしているので、
Runnerの環境のMySQL用にdatabase.yml.ciを作って、
テストを始める前にdatabase.ymlにコピーするようにしました。

- CapistranoはデプロイするときproductionサーバにSSHで接続するのですが、
Runnerからproductionサーバに接続するときにパスワード認証が発生して
デプロイがエラーになってしまったので、Runnerのアカウントがパスワード認証なしで
接続できるようにしました。
Eclipseプラグインで作ったEditorで外部ファイルを開きたい。

※Qiita始めたのでHatenaやめようと思ったので昔の写しです。

普通に「エディター付きプラグイン」で作ったエディタだとプロジェクト外のファイル開くとエラーになる。


TextEditorから継承されたクラスの<init>でsetDocumentProvider()してるところを

```java
setDocumentProvider(new TextFileDocumentProvider());
```
にしたら行けた。

IDocumentPartitionerが設定できなくなるけど、
僕は今、IDocumentPartitionerの使い道がわからないので別に困らない。
org.eclipse.jface.text.rules.IRule

※Qiita始めたのでHatenaやめようと思ったので昔の写しです。

EclipseプラグインのEditor作るとき色つけたくて
ScannerでIRuleをポイポイぶっこんだので、
使って覚えたことを書きます。[^1]

#標準クラス
|クラス|説明|
|:--|:--|
| <b>NumberRule</b> | 数字文字列のルール |
| <b>WordRule</b>|指定文字列のルール<br/>使い方はこっち見るといい<br/>[Eclipseプラグイン DMDLEditor キーワード(Hishidama's Eclipse Plugin DMDLEditor Memo)](http://www.ne.jp/asahi/hishidama/home/tech/eclipse/plugin/develop/dmdleditor02_keyword.html#h_WordRule)|
|<b>MultiLineRule</b>|開始文字と終了文字を指定したルール。行を跨いでscanする|
|<b>SingleLineRule</b>|開始文字と終了文字を指定したルール。こっちは行を跨がない|
|<b>WhitespaceRule</b>|空白のルール。スキップとかに使うのかな？|


#自力で作った場合
evaluateで対象文字数分scanner.read()して、
対象だったらそのままITokenを返す。
そうするとevaluateに入ってきた文字列indexから
index+(scanner.read()回数分)までの文字をITokenで装飾してくれる。

対象でなければ、scanner.unread();で開始文字まで戻して、
Token.UNDEFINEDでも返しておく。（たぶん何でもいい）
scanner.unread()で正しく戻さないと、次のルールの開始位置がずれたりしちゃうので注意。


一文字（?マーク）だけ判断するクラスを張ってみる。

```java
public class QuestionRule implements IRule {

	protected IToken fToken;

	public QuestionRule(IToken token) {
		Assert.isNotNull(token);
		fToken = token;
	}

	/*
	 * @see IRule#evaluate(ICharacterScanner)
	 */
	@Override
	public IToken evaluate(ICharacterScanner scanner) {
		int c = scanner.read();
		if (c == '?') {
			return fToken;
		}
		scanner.unread();
		return Token.UNDEFINED;
	}
}
```

[^1]: 大体は[hishidama](http://www.ne.jp/asahi/hishidama/home/tech/eclipse/plugin/develop/dmdleditor02_keyword.html)とか見たほうが早い
Go を使ってコマンドラインツール wordc を作ってみた

## 2015/06/29 追記

同名のソフトウェアを確認したので、
名前を変更しました。
s/wcnt/wordc/g

また、デモを差し替えました。

## ここから元の記事

Go Conference 2015 summer で楽しそうな話題が豊富に流れてきて、
羨ましかったので Go の勉強を兼ねてコマンドラインツールを作ってみた。

## wordc について

[wordc](https://github.com/flaflasun/wordc) は単語別出現回数を出力するコマンドラインツールです。

Go のチュートリアル [A Tour of Go](https://go-tour-jp.appspot.com/#1) の[#41 Exercise: Maps](https://go-tour-jp.appspot.com/#41) に
単語別に出現回数を返す関数の問題があり、CLIで使えたら便利だなと思ったので作りました。

個人的な用途としては、英語のドキュメントを読むときに
事前に出現頻度の高い英単語の意味を調べるために使ってます。

## インストール

インストールは go get から

```bash
go get github.com/flaflasun/wordc
```

Go を入れていない人は今すぐ [Go](http://golang-jp.org/doc/install) をインストール。

## デモ

![wordc-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/55283/ba51483e-9a89-4fcf-23d2-fd45aa3d052a.gif)

単語数が多いと出力行が多くなるので [peco](https://github.com/peco/peco) と組み合わせると便利です。

## 利用した外部パッケージ

Go でコマンドラインツールについてググると大体、[codegangsta/cli](https://github.com/codegangsta/cli) が出てくるので使ってます。
help メッセージを生成してくれて便利でした。
ただ、サブコマンドを作らなかったので、標準パッケージの flag でも良かったかなと。

## 感想

コマンドラインツール思ったより簡単に作れて Go 便利。
Go 楽しく作れてとても良い。もっと色々作っていきたい。
とりあえず今はテストが無いのでテストを書きたい。
try-with-resourcesと等価コード

※Qiita始めたのでHatenaやめようと思ったので昔の写しです。

try-with-resourcesの使い方を昨日初めて知りましたorz
残念なあまりバイトコードまで読んで等価のコードを読み取ってみたよ[^1]。

とりあえず

```java
try (InputStream input = new FileInputStream("ファイル.txt")) {
    // 処理
}
```
な書き方ができるのがtry-with-resources
いままでは

```java
InputStream input = new FileInputStream("ファイル.txt");
try {
    // 処理
} finally {
    input.close();
}
```
って書いてたね[^2]。

でもこの二つは等価じゃないみたい。

バイトコードから読み取った感じだと、

```java
Throwable e1 = null;
Throwable e2 = null;
try {
	InputStream input = new FileInputStream("ファイル.txt");
	try {
		// 処理
	} catch (Throwable e) {
		e1 = e;
		throw e1;
	} finally {
		if (input != null) {
			input.close();
		}
	}
} catch (Throwable e) {
	e2 = e;
	if (e1 == null) {
		e1 = e2;
	} else {
		if (e1 == e2) {
			e1.addSuppressed(e2);
		}
	}
	throw e1;
}
```
のような感じ。

※超厳密にいうと、変数宣言[^3]とtry catch finallyの範囲の指定[^4]がjavaコードから書くのはたぶん不可能だったりする。
基本的にバイトコードのほうが効率的になっている

[^1]: 間違ってる可能性大
[^2]: ええ僕は一昨日まで書いてましたよorz
[^3]: Throwable eという変数はバイトコードには存在しない。次の行でe1、e2に代入しているがバイトコードではcatchで直接代入している。「} catch (e2) {」っとか書きたい。e1の扱いはなかなか難しい。
[^4]: input.close()前のfinallyは本当はfinallyではないし、catchの書き方も厳密には違う（どういうコード書いたらそういうバイトコードになるのかわからない。）記載したコードは残念ながらgotoとfinally扱いがいくつか多くなる。
Enumのabstract method

※Qiita始めたのでHatenaやめようと思ったので昔の写しです。

javaのEnumってabstract methodが書けるね。

こんなのだね。

```java
public class Otameshi {
	public enum E {
		A {
			@Override
			void method() {
				System.out.println("A method");
			}
		},
		B {
			@Override
			void method() {
				System.out.println("B method");
			}
		};

		abstract void method();
	}

	public static void main(String[] args) {
		for (E e : E.values()) {
			e.method();
		}
	}
}
```

で、なんとなく気になってクラスファイルを覗いたら案の定クラスがEnum宣言分増えてたよ。
つまり、

```java
public class Otameshi {
	public enum E {
		A {
			@Override
			void method() {
				System.out.println("A method");
			}
		},
		B {
			@Override
			void method() {
				System.out.println("B method");
			}
		};

		abstract void method();
	}

	public static void main(String[] args) {
		for (E e : E.values()) {
			System.out.println(e.getClass());
		}
	}
}
```
ってやると
>
class Otameshi\$E\$1
class Otameshi\$E\$2

ってなる。
Node.js: compression middlewareで静的リソースをお手軽に圧縮し、expressのレスポンスを改善する。更にキャッシュも設定する

# Node.jsで作ったサイトのレスポンス性能をあげるために、配信する静的リソース（HTML,JavaScript,CSSなど）をお手軽に圧縮する方法です。

# compressionモジュールを使ってお手軽に圧縮
Node.jsのための、Webフレームワークexpressでは、4系からconnectモジュールが分割され、
今までそのまま使えたモジュールを別途npmでインストールする必要があります。

* リソースを圧縮するためのmiddlewareであるcompressionをインストールします。
* https://www.npmjs.com/package/compression

`npm install compression`

これで準備は完了です！
別途expressをまだインストールしていない場合は、インストールしてください。

# Webサイトのパフォーマンスを確認するために、Googleの[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)を利用します。
* compressionモジュールで圧縮する前は以下のような感じです。
 ![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/cd5f28f4-9e67-ee52-54c6-03740b881ce4.png)

* PageSpeed Insightsはご丁寧に、Webサイトの改善ポイントを教えてくれるので、とても便利です。
使い方は、以下が参考になります。
> http://liginc.co.jp/web/useful/137177

# 実際に圧縮してみる
compressionモジュールでは、オプションを設定できます。
ここでは、圧縮レベルのみ指定しています。

```js:

var http = require("http");
var express = require("express");
var compression = require('compression')

//サーバー構築
var app = express();
var port = process.env.PORT || 8080;

// ここでcompressionモジュールを使う
// 圧縮レベルは9まで
app.use(compression({level: 6}));

// routesを設定 
var maxTime = 86400000 * 30;
// maxAgeで、キャッシュの保持期間を設定。ここでは30日に設定
app.use(express.static(__dirname + "/public", { maxAge: maxTime }));

var server = http.createServer(app);
server.listen(port);

console.log("http server listening on %d", port);

```

ポイントは**compressionをかけてから、routesを設定することです。**
順番が逆だと、圧縮がかかりませんでした。

# 圧縮結果
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/50d3b5e8-f3ef-9fb7-d06b-f49ebd86684a.png)
サイトのパフォーマンスが改善されました！
まだ修正箇所はありますが、これでだいぶパフォーマンスがあがりました。
あとは、画像自体を圧縮したり、JSファイルを圧縮したりすればもっとパフォーマンスは良くなります。

# express3系はここが参考になります。
> compressミドルウェアでexpressのレスポンスを良くしよう
http://blog.craftgear.net/4f81982a61933ced0d000001/title/compress%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A7express%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92%E8%89%AF%E3%81%8F%E3%81%97%E3%82%88%E3%81%86
IntelliJでのGit連携


# 概要
IntelliJ IDEAでGit連携を行います。
個人的なメモ程度のものですので親切さが色々欠けています。

# 必要なもの
msysgit
https://msysgit.github.io/
TortoiseGit
https://code.google.com/p/tortoisegit/
TortoiseGit 日本語言語パック
https://code.google.com/p/tortoisegit/
IntelliJ IDEA
https://www.jetbrains.com/idea/?fromMenu

TortoiseGitは必須ではありませんが、使いやすいので一緒に導入します。

# インストール
http://tracpath.com/bootcamp/learning_tortoisegit.html
こちらのサイトが非常に丁寧にまとめています。
※Gitリポジトリの作成は必要に応じて行って下さい。

# ローカルリポジトリの作成
IntelliJを開、既存のプロジェクトを開く or 新規プロジェクトを作成します。
その後、以下の操作を行います。

`
VCS-> Enable Version Control Integration...
-> Select a version control system to associate with the project root: Git
-> OK
`

これで、ローカルリポジトリが作成されます。

# ローカルリポジトリへのコミット
コミット対象に追加：`プロジェクトを右クリック -> Git -> Add`
コミット：`プロジェクトを右クリック -> Git -> Commit Directory...`
プッシュ：`プロジェクトを右クリック -> Git -> Repository -> Push...`
※プッシュ時にリポジトリのアドレスを新規設定する必要があります。

# 備考
BitBucketは`htps://[user]@bitbucket.org/[user]/[repository].git`がURLなんですね…。
それを知らずちょっと詰まりかけました。お恥ずかしや。
数学の証明についてメモ

"科学の真理は揺さぶられるが,数学の定理として証明された事柄は,2000年以上たってもその真理としての性格が揺らぐことはない.
事実で検証できることをきちんと検証してきたこと,事実に合わない事を反証をあげて検証してきたことこそが科学の確かさを保証している.
証明はこのような「数学の真理の絶対性」を保証する手段と考えられてきた."

"現代数学では公理は「絶対的な心理」という立場を失い,「理論の出発点となる仮定」という意味になった.
したがって,現代数学的な視点で見れば,数学の定理とは仮定された約束(公理)から導かれる総体的な真実ということ.つまり
#数学における証明とは
##「こういうことを仮定すれば,理論的にこういうことを導くことができる」  
という内容になった.こうして,
#現代数学的な立場では,証明とは
##「仮定された命題から出発して,論理的な約束にしたがって命題をいろいろな形に変形して,定理と呼ばれる新しい命題を手に入れていく手続き」  
という意味に変わった.  

定理を導くための論理的に約束として何が許され,何が許されないのかははっきりと決まっている.  
この経験的立場からは,証明とは正しい事実から出発し,新しい事実を論理的に手に入れていく手続きという見方は変わっていないと思われる."  

# トートロジー
トートロジーとは,内容を問わず形式的にいつでもただしくなるほかはない命題.
一般に,ある複合命題が,その中に含まれている命題変数の真偽のいかんに関わらず,いつでも正くなるとき,その複合命題をトートロジー(恒真式)という.
トートロジーを同義語反復ということがあるが,内容の如何に関わらずいつでも形式として正しいということになれば,トートロジーを「正しさ」の1つの判断基準として採用することができる.
すなわち,万人が認める正しさとはその命題がトートロジーになっていることだとする.  

#演繹論理 「Aである.AならばBである.したがってBである.」
(A ∧ (A ⇒ B)) ⇒ B
トートロジーであり,形式的にはまったく正しい論理.  

#帰納論理 「Bである.AならばBである.したがって多分Aだろう.」
(B ∧ (A ⇒ B)) ⇒ A
トートロジーにはならない.
帰納論理は論理的には推測でしかない.  
実験を何回も繰り返し,そのたびに同じ結論が得られるならば,Aは真だろうということの蓋然性はだんだんと高くなっていく.
これが自然科学の実験における論理.
数学ではこのような実験科学の帰納論理は使うことはできない.

#数学的帰納法 「P(1)である.P(k)ならばP(k+1)である.したがってP(n)である.」
数学的帰納法は,いわゆる帰納論理とは違い,純粋に自然数の構造に依存した演繹論理の一種.
数学的帰納法も論理記号を使い,内容を表すことができる.

#仮説論理
A ∧ B ⇒ (A ⇒ B)
トートロジーである.
具体例で見る限り,現実の仮説論理は正しくない場合もある.
現実問題の仮説論理では,どうしてもAとBの因果関係をはっきりさせる必要がある.
つまり「ならば」という言葉の日常的な意味と数学上の意味の違いが仮説論理の不思議さを作り出している.  
純粋な数学研究の場合,多くの数学者は帰納論理などにより確信があるのでAならばBは仮説論理として正しい命題になっている.
しかし今度も,その中間を演繹論理として細かに示して,数学として具体的に論理の鎖を完成する必要がある.
仮説論理は想像力.

# ならば
数学用語としての,"ならば"は時間経過を含まない.
"ならば"という言葉は日常経験では因果関係を表す.
因果関係である原因と結果は,常識として,原因は結果の前にあり,時間経過も含んでいることに注意.
記号論理用語の"ならば"は数学として因果関係を表さなくてもよい

"あるいは"は日本語としても時間経過を含んでいない.  
***
# 公理もしくは公準
推論の基礎となる規則のこと.
個人の間で共有できる最低限の正しいこと.
数学では1番初めに,いくつかの命題を証明なしに真であると認めて議論を展開していく,特別な命題のこと.  
# 公理系  
公理の集まり.
# 排中律
全ての主張は,「正しい」か「正しくない」の二者択一しかない,を主張する法則.
# 背理法
背理法の基本は,結論を否定し,矛盾を出す.
背理法は,排中律を使って,数学的な定理を証明する.
無限を相手にした証明には基本的に背理法のスタイルを取らざるを得ないものがたくさんある.
***
以降,『これはすごい!数学が使える人の問題解決法』第4章に書かれていた背理法についての内容だが,個人的に少し考える必要を感じている.
***
背理法を現実に使ってはいけない.背理法の考え方が「排除の原則」にもとづいているから.
数学の論理では真か偽かの2つの場合しか考えないが,現実の世界ではそうはいかない.
数学の論理的な発想を単純に現実世界に使うのは適切ではない.
日常の会話で背理法を使う人がいたら気をつけなくてはならない.背理法のような強力に見える証明法でも,その得意な範囲が決まっている.

***
#### 参考文献
1) 瀬山 士郎:『[なっとくする数学の証明](http://amzn.to/1hRfEeE)』講談社, 2013.
2) 柳谷 晃:『[これはすごい!数学が使える人の問題解決法](http://amzn.to/1KpdpeU)』丸善, 2005.
3) 大栗 博司:『[数学の言葉で世界を見たら](http://amzn.to/1NVgDX3)』幻冬舎, 2015.
BigDecimalがゼロかどうか？

※Qiita始めたのでHatenaやめようと思ったので昔の写しです。

BigDecimalがゼロかどうかの判定が意外とめんどくさいのと、
やりかたがいろいろあるので記事書くことにしました。

# ダメなやり方
```java
BigDecimal value = new BigDecimal("0.0");
if ( value.equals(BigDecimal.ZERO) )
    System.out.println("true");
else
    System.out.println("false");

```
scaleが違うと一致とみなさないのでうまくいかない。
（scaleまで比較してほしいなら正しい）

# よく見るやり方※1
```java
BigDecimal value = new BigDecimal("0.0");
if ( value.compareTo(BigDecimal.ZERO)==0 )
    System.out.println("true");
else
    System.out.println("false");

```
これだとscale関係なく0かどうか判定で来てハッピー！

さらに、
# 今日知ったやり方※2
```java
BigDecimal value = new BigDecimal("0.0");
if ( value.signum()==0 )
    System.out.println("true");
else
    System.out.println("false");

```
※1と結果は同じ。
速度的にはcompareTo:signum⇒10:6ぐらいの感じだった。

ゼロかどうか？正かどうか？負かどうか？を判定するならsignum()使った方が速いっぽい。
ただ職場で使うなら何やってるかわかりやすいcompareTo使う[^1]かなー。

[^1]: 日本語にしたらそれぞれcompareToは「ZEROと比べて差がないなら0」signumは「符号がなければ0」だから前者の方がまだマシかと。
OS X 版 Google Chrome の起動時に立ち上がるウインドウをシークレットモードに

2015-07-04 追記

この方法では OS X 上での Selenium が正常に動作しなくなった。
また、 Chrome Secure Storage へのアクセス権の問題も発生することがわかった。

筆者はこの方法をやめ、また方法を模索中……。。

-----

シークレットモード (Incoginito Window) は便利。
常にシークレットモードで立ち上がるようになると嬉しい。

次のような方針

1. もしGoogle Chrome が起動しているなら停止する。
2. Google Chrome.app/Contents/MacOS/Google Chrome を別の名前 (.orig) にして退避
3. Google Chrome.app/Contents/MacOS/Google Chrome 自体はシェルスクリプトにする。
4. シェルスクリプトの内容は ```--incognito``` オプションを付与して退避したオリジナルを起動するように書く。
5. あとは通常通りの Google Chrome の起動 (アイコンをクリック, Spotlight, Launchpad ...)

```bash:Google_Chrome.app/Contents/MacOS/Google_Chrome 
#!/usr/bin/env bash
cd "${0%/*}" && exec ./Google\ Chrome.orig --incognito
```

```console
$ cd /Applications # Homebrew Cask で入れている場合は適当に調整必要
$ cd Google\ Chrome.app/Contents/MacOS
$ mv Google\ Chrome{,.orig}
$ cat <<'EOT'
#!/usr/bin/env bash
cd "${0%/*}" && exec ./Google\ Chrome.orig --incognito
EOT
$ chmod +x Google\ Chrome
```

今のところ良さそう。

# 免責

Google Chrome のアップデートによって動作に問題が生じないか等は、これから使っていくことで身を持って知る予定。
なので、シェル操作に慣れていて、自分で直せそうな方のみ自己責任でお試しください。
Rubyにないもの

Rubyを使っていると、他の言語にあるけどRubyにはない機能、というのがときおり見受けられます。

# 明示的な参照、値型
Rubyの変数は、複雑なオブジェクトから、整数や`nil`に至るまで、すべてが**オブジェクトへの参照**として（概念上は[^1]）構成されています。つまり、Rubyの変数は、常に何かしらのオブジェクトを指すもので、JavaScriptでの数値や`null`のような「値」となるものは存在しません。

```rb:Numericの計算の場合

# 「3を意味するオブジェクト」をaが指すようになる
a = 3

# aに入った「3を意味するオブジェクト」とリテラルの「4を意味するオブジェクト」の間で演算が行われ、
# その結果生成した「7を意味するオブジェクト」がbに入る
b = a + 4
```

逆に、Rubyではメソッド呼び出しの際の評価戦略も、いわゆる「参照の値渡し」（変数としては別だけど、指すオブジェクトは同じ、つまり別の変数に代入したのと同じ状態）しかなく、値渡しや参照渡しにすること、そして変数への参照を取ることはできません。言い換えれば、メソッドの呼び出し前と呼び出し後で、引数として渡したものの`.object_id`が変わることはありません[^2]。

```rb:参照の値渡し

foo = 'foo'
p foo.object_id
puts foo

some_method foo
p foo.object_id #呼び出し前とは変わり得ない
puts foo # 変化しうる

```

## インクリメント・デクリメント
上のような背景もあって、「ある変数に入った数値を変える」ことがすなわち「ある変数の指すオブジェクトを変えること」であり、それを代入以外で行うのがすっきりしないという事情、さらには`each`や`upto`などが整っていて、ループカウンタを自分で回す必要がないということも手伝って、インクリメント・デクリメントが構文にありません。`a += 1`のように書くほかありません。

# 多次元配列
配列を配列に入れることが容易にできるからなのかも知れませんが、Rubyを含めた多くのスクリプト言語で、多次元配列を直接に扱う方法がありません。

もちろん、「配列を配列に入れる」という解決策もあるのですが、特定の形の配列（9*9、3*3*3などのように次元の組み合わせが決まっている）を使うのであれば、`Array`を継承した上で、`[]`演算子をオーバーロードして、位置を計算して1次元配列に流しこむ、という手段もありえます。

# 無限ループ専用の構文
C言語系統の場合、`for(;;)`とすると、真ん中に式がないのにきちんと無限ループするという意味で、無限ループ専用の構文となっています。

一方、Rubyにも`loop`という無限ループに使えるものがありますが、これは**メソッド**です。下のようにすれば自分で作れます。

```rb:my_loop.rb
def my_loop
  while true do
    yield
  end
rescue StopIteration
  nil
end
```



[^1]: 整数やSymbol、`nil`といったものは変更不可能なので、内部的には参照先のオブジェクトを持たない即値として処理されることもありますが、プログラム上からは（特異メソッドを作れないことを除いて）違いはありません。
[^2]: `binding`を取って呼び出し元の環境を書き換える、あるいはProxyオブジェクトなどで、渡したオブジェクトの`.object_id`自体が上書きされていた、などの特殊事情については、ひとまず置いておきます。
gitWatch > mongodbのSERVER-XXXって何だろう?

https://github.com/mongodb/mongo/commits/master?page=3

コミットメッセージのほとんどに「SERVER-XXX (XXX:数値が入る)」が付いているが、意味が分からない。

同じ人のコミットは同じ番号かと思ったが、同じ人のコミットで違う番号もある。

コミットメッセージが読みにくいように思うが、何か利点があるのだろうか?
TeraTerm ログインマクロテンプレート


# TeraTerm ログインマクロテンプレート

``` template.ttl
Host = 'ホスト名'
User = 'ユーザー'
Port = '22'

_Name = User
strconcat _Name '@'
strconcat _Name Host


;パスワードでログインの場合下記をコメントアウト
;Auth = '/auth=password '
;秘密鍵でログインの場合下記をコメントアウト
;Auth = '/auth=publickey /keyfile="秘密鍵のフルパス"'

;パスワードを毎回入力する場合
;passwordbox 'Enter password' 'Input Password'
;Password = inputstr
;パスワードを保存する場合
;getpassword 'password' _Name Password


; SSH login
msg = Host
strconcat msg ':'
strconcat msg Port
strconcat msg ' /ssh '
strconcat msg Auth
strconcat msg ' /passwd='
strconcat msg Password
strconcat msg ' /user='
strconcat msg User

connect msg
```

#保存したパスワードの変更または削除
パスワードを変更または削除するにはマクロ実行フォルダのpassword.datファイル自体を削除
![01.png](https://qiita-image-store.s3.amazonaws.com/0/20339/87c6200b-7170-d9c8-8bda-efe42611af03.png)

一部の削除

変更前

``` password.dat
[Password]
qiita@192.168.56.11=ZN@#j3!cPg;~H^Ml;v
qiita@192.168.56.12=)OG[6>@R~X2;:g

```

```diff
[Password]
-qiita@192.168.56.11=ZN@#j3!cPg;~H^Ml;v
qiita@192.168.56.12=)OG[6>@R~X2;:g

```

次回ログイン時にもう一度パスワードが聞かれます
gitWatch > tearDown()

https://github.com/square/Valet/commit/e83c93444ba25ed31535378b484124019e6f6682

```objc
+- (void)tearDown;
+{
+    [super tearDown];
+    
+    for (VALValet *additionalValet in self.additionalValets) {
+        [additionalValet removeAllObjects];
+    }
+}
+
```

tearDown()はCode Completeだかで見た気がする。 setupしたリソースを最終的に解放する時に呼ばれていたと思う。


http://stackoverflow.com/questions/7784709/what-do-these-words-mean-in-programming-context

> Tear down - refers to the process of freeing resources after they're no longer required.
...
> Tear down -> means destroy objects! It's fundamentally related to Unit Testing frameworks... they have a tearDown() method into which is possible to release/destroy object used for the test
The SSCCE: Short, Self Contained, Correct (Compilable), Example

http://sscce.org/

> If you are having a problem with some code and seeking help, preparing a Short, Self Contained, Correct Example (SSCCE) is very useful. But what is an SSCCE?
>
> It is all in the name, really. Take a look at each part. The version prepared for others to see should be:
>
> - Short (Small) - Minimise bandwidth for the example, do not bore the audience.
> - Self Contained - Ensure everything is included, ready to go.
> - Correct - Copy, paste, (compile,) see is the aim.
> - Example - Displays the problem we are trying to solve.
[iOS][swift]SpriteKitで近接攻撃の当たり判定

**はじめてのゲームプログラミングなので、もっといいやり方があったら教えてください。**

よくある横スクロールのゲームを作っていたが、何しろソースが少ないので手探り。
弾を発射して当たったらどうこうするっていうのは簡単。didBeginContact()で判定すればよい。
でも飛び道具じゃない判定はどうすればいいんだろう？？？

```swift

let attackRange: SKSpriteNode!
attackRange = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake(40, 100))
attackRange.position = CGPoint(x: player.position.x + 50, y: player.position.y)

self.addChild(attackRange)

// enemy: SKSpriteNode
if (attackRange.intersectsNode(enemy)) {
  // ここに当たった時の動作を書く
}

attackRange.removeFromParent()

```

とりあえずこれで動いた。
具体的には、プレイヤーの位置から当たり判定を作って、その中に敵がいれば動作するって感じ。
色が付いて当たり判定が見えるし、割と簡潔に書けた。
403エラーでハマった話


nginx+unicronでrailsを動かそうと思って
nginxでdev01というユーザーのホームディレクトリにサービスを配置しようと思った時の話

ググると必ず出てくる対処法:権限がないのでパーミッションを追加してね

権限がないのか〜と言われるままに、僕はchmod -R 755 でユーザーディレクトリ以下すべてのファイル+ディレクトリの権限を変更しましたw <- とりあえず動く状態にして、一つ一つパーミッションを落として検証していくつもり。
しかし **動かない...**
nginxのシンプルなエラーページがじっと僕を見つめています。

結局はホームディレクトリdev01のパーミッションがユーザー作成時に755になっていたことが原因で、これを700(744)にすれば正常に動きました。
 **権限がない**という言葉に踊らされずただ権限を与えない、どこか権限の設定がおかしいよみたいなイメージで403エラーを捉えるきっかけになったのでメモしました!

wikipediaによるとパーミッション以外にも原因は考えられるみたいです
ex)アクセス多いとか
https://ja.wikipedia.org/wiki/HTTP_403
AngularFireで$firebaseArrayの$watchをしてたら２度まわる件について



#引っかかった
[AngularFire](https://www.firebase.com/docs/web/libraries/angular/)してて少し詰まったとこをメモします。

下での`hoge`の配列に10個の要素が入っていたとすると、ロード時に`"watch"`が10個consoleに吐かれます。

```js
let hoge = $firebaseArray(ref);
hoge.$watch(() => {
	console.log("watch");
});
```

ですので、`$loaded`というものを使います。

```js
function loaded() {
	hoge.$watch(() => {
		console.log("watch");
	});
}
let hoge = $firebaseArray(ref);
hoge.$loaded().then(() => {
	//init
	loaded();
});
```

これでロード時に一度しか読まれなくなります。consoleに吐かれる`"watch"`は1個になります。
ですが、要素が付け加えられた時など、更新時に`"watch"`が2回現れます。[ここら辺](https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-watchcb-context)を見るとわかるのですが、`$watch`は4つのイベントにフックします。`child_added, child_moved, child_removed, or child_changed`。
お気づきかと思いますが、`child_changed`と`child_added`が両方発動します。
なので、私は、

```js
function loaded() {
	hoge.$watch((event) => {
		if( event.event === "child_added"){
			console.log("watch");
		}
	});
}
let hoge = $firebaseArray(ref);
hoge.$loaded().then(() => {
	//init
	loaded();
});
```

という形で回避しています。
間違っていたり、もっといい方法があれば教えてください。
以上。
[ATOM] 自作packageからRangeを指定して開いてるファイルの行を装飾したいけど、常に1行目しか変化しない課題を解決する


## 環境
* OS X Yosemite 10.10.3
* Atom 1.0.0
* 中の人＝CoffeeScript初心者。自作package初挑戦なので大絶賛修行中でっす。 

## 概要
自作packageの開発中、表題の事象に直面しました。例えば次のようなコードがあった場合、

```ore.coffee
  getEditor: ->
    atom.workspace.getActiveTextEditor()

  createDecoration: ->
    range = new Range([9, 0], [10, 0])
    marker = @getEditor().markBufferRange(range, invalidate: 'never')
    @getEditor().decorateMarker(marker, type: 'line', class: 'myClass')
```

アクティブなエディタの9行目にmyClassが適用されることを期待したのですが、実際はrangeの値に関係なく1行目にのみ適用されます。

## 原因
変数rangeはAtom API Rangeのインスタンスだと思っていたのですが、なんと中身はネイティブのRangeになっており、start, endが効いていませんでした。

## 解決方法
前述のore.coffeeの先頭に以下の行を追加します。

```ore.coffee
{ Range } = require 'atom'
```

## 余談
* 最初はconsole.log(foo)などと書いてDeveloper ToolsのConsoleでデバッグしていたのですが、同じくDeveloper ToolsのSourcesでブレークポイント＆ステップ実行、変数のウォッチができるのを知って効率がアップしました。
$PATHのhuman readble化

`PATH`を読みやすくするために個人的に便利だなと思ったコマンド。(というかテンプレート)

```zsh
$ echo $PATH | tr ':' '\n'
/Users/myname/.rbenv/shims
/Users/myname/.nvm/versions/node/v0.12.2/bin
/anaconda/bin
/Users/myname/.rbenv/bin
/Users/myname/.local/bin
/Users/myname/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Users/myname/.rbenv/bin
/Users/myname/.local/bin
/Users/myname/bin
```