OmniAICreator/Qiita-1.07M huggingface dataset:
Node.jsでつくるIoT - Part2: Beagle Bone BlackとSensorTagとBLE

Ubuntuをインストールした[Beagle Bone Black](http://beagleboard.org/black)もしばらく放置していました。Connected Hardwareな感じが薄れますが、IoTも最初はLinuxが動くマシンを使うと敷居が低く入りやすいです。そこでBeagle Bone BlackをIoTのConnected Hardwareとして使っていこうと思います。まずは良い事例やチュートリアルがないか調べます。


## 参考サイト

[SensorTag](http://www.tij.co.jp/ww/wireless_connectivity/sensortag/index.shtml)とBluetooth LE使ったサンプルをいくつか探しました。

* [BlueMix Internet of Things Workshop with Texas Instruments BeagleBone and SensorTag](https://deskinhursley.wordpress.com/2014/05/20/bluemix-internet-of-things-workshop-with-texas-instruments-beaglebone-and-sensortag/)
* [BeagleBone with SensorTag](https://developer.ibm.com/iot/recipes/ti-beaglebone-sensortag/)
* [Bluetooth Low Energy on BeagleBone Black](http://blog.revealinghour.in/bluetooh-low-energy/2014/06/05/bluetooth-low-energy-on-beaglebone-black/)
* [Using DevOps Tools to Monitor a Polytunnel](http://blog.risingstack.com/using-devops-tools-to-monitor-polytunnel/)

[IBM IoT Foundationのレシピ](https://developer.ibm.com/iot/)はチュートリアルのページとBluemixが連携しているので、アカウントを持っている人にはとても便利な仕組みです。こういったレシピは最近よく見かけますが情報共有にとても有効です。Riemann+InfluxDB+Grafanaの組み合わせは気に入っているので、Raspberry Piを使ったビニルハウス監視を参考にしてみます。


## デバイス側の準備

Beagle Bone BlackにはタイプAのUSBポートが一つしかありません。現在は無線LANドングルを挿して使っています。SensorTagとBLEで通信するためUSBポートを空けたいので、インターネット接続はWindowsやOSXとUSBシリアル接続経由で行います。USBシリアル接続はBeagle Bone Blackの電源供給も兼ねるので開発用途には便利ですが、単独で使えないので設置場所が限られてしまいます。とりあえずSensorTagとBLEの練習用です。


### Ubuntu 14.04.1のインストール

現在はBeagle Bone BlackにUbuntu13.10をインストールしているので、新しいイメージを再インストールします。

### SensorTagの購入

Texas Instrumentsの[TI Store](http://www.tij.co.jp/ww/wireless_connectivity/sensortag/index.shtml)から、SensorTagを購入します。送料無料というブログもありましたが、今購入すると送料は$20.00かかります。FAQの[Why are you now charging shipping and handling?](http://www.ti.com/lsds/ti/store/faq-ti-store-orders.page#shippingHandling)によると送料無料はコストに合わなくなったのでやめたそうです。合計$45.00でした。


### Bluetooth LE USBドングルの購入

Raspberry PiやBeagle Bone Blackで実績があるらしい、Planexの[BT-Micro4](http://www.amazon.co.jp/dp/B0071TE1G2)をAmazonから購入します。1,343円です。

## バックエンド側の準備

### DIYの場合

今のところIoTデータストアにはInfluxDBにする予定です。以前用意したRiemann、InfluxDB、Grafana用のDockerコンテナを使います。

### クラウドサービスを使う場合

[PubNub](http://www.pubnub.com/)のブログから[freeboard](https://freeboard.io/)をダッシュボードに使ったサンプルを見つけました。

* [Realtime IoT Monitoring for Devices with PubNubf](http://www.pubnub.com/blog/realtime-monitoring-of-internet-of-things-devices/)

PubNubもfreeboardもFREEプランがあるので、サーバーサイドは自分で構築しなくても使えそうです。
linux > POSIX Programmer's Manualを見る > man 3p getwd

動作確認

    CentOS 6.5

`man`のコマンドでマニュアルを見ている時、`man 3`と`man 3p`で異なるマニュアルを見ることができると気付いた。

    man 3 getwd
と実行すると`Linux Programmer's Manual`が表示される。

    man 3p getwd
と実行すると`POSIX Programmer's Manual`が出てくる。

二者の記載内容も異なる。

どちらを見るべきなのかなどについてはわかりません。
Ctrl+wを押した時にスラッシュまでを削除するようにするbash設定

### 前提

* 自分のMacでの動作を確認
 * Mac OS X ver 10.9.5
* windowsでの動作検証を行っていませんが、bash環境なら同じ適用ができるはず…

### やりたいこと
`/hoge/foo/bar`
の末尾で`Ctrl+w`を押した時、
デフォルトでは全て消えてしまうが
`/hoge/foo/`
のようにスラッシュまで（1つ上の階層まで）消したい場合の設定方法

### やること
`~/.bashrc`（ない場合は作成して下さい）に以下を記述
`stty werase undef
bind '"\C-w": unix-filename-rubout'`

次にそのbashを適用
`source ~/.bashrc`

これでスラッシュまでの削除になります！

この手の記事はいくつかありますが（これとか：http://qiita.com/ironsand/items/98a48e7a13be3d034688
bashに書く時のシングルクォーテーションとダブルクォーテーションに注意です。

### 説明
---
ざっくり説明すると
`stty werase undef`
これで元々の`Ctrl+w`のキーバインドを削除
`bind '"\C-w": unix-filename-rubout'`
これで新しく`Ctrl+w`を設定
`unix-filename-rubout`の箇所は他にも色々な設定がある
詳しくは以下URL
https://www.gnu.org/software/bash/manual/html_node/Commands-For-Killing.html
ハイフンやアンダースコア区切りもあるっぽい
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（１３）開発モードと静的モード

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# 編集モードを切り替える
enforceには、ゲームを開発するための「**開発モード**」と、設置したり配布するための「**静的モード**」の2つがあります。
開発モードでは「**index.php**」を使い、読み込むライブラリが動的になっています。
静的モードに切り替えますと「**index.php**」から「**index.html**」を生成し、そちらが使用されます。
静的モードでも開発することは出来ますが、新規に作成したキャラクタオブジェクト（クラス）が反映されません。
その代わりにPHP5を使用しないので、ローカル環境のブラウザで実行させることが出来ます。
切り替え方は、ゲームのトップディレクトリ直下（**game01**直下）で、

$ **enforce static**

を実行することで静的モードに切り替わります。

$ **enforce develop**

を実行すると開発モードに戻ります。

# 開発モードでのライブラリのアップデート
「**enforce**」がアップデートされた場合に、過去に作っていたゲームにも最新のライブラリを適用する場合は、ゲームのトップディレクトリ配下（**game01**直下）で、

$ **enforce update**

を実行します。
これは、開発モードでのみ実行することが出来ます。
静的モードではエラーになります。

# デバッグモード
チュートリアルではなく「**環境設定処理**」に書いてありますが、「**開発モード**」と「**静的モード**」以外に「**デバッグフラグ**」というものがあり、「**environ.coffee**」で設定出来ます。
このデバッグフラグが**false**の場合は、スプライト枠が表示されなく（enchant.jsの場合）なり、「**JSLog()**」関数が実行されなくなります。


[チュートリアル（１２）](http://qiita.com/digitarhythm/items/79b8c39c491ed66106cb) <--- ⬛︎ ---> [チュートリアル（１４）](http://qiita.com/digitarhythm/items/d61feb5a568b9f5d894b)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
linux > あるキーワードが載っているmanページを見つける > man -K キーワード

動作環境

    CentOS 6.5

あるキーワード(例として`h_name`)が載っているmanのページを見つけたい時、以下のように実行する

    man -K h_name
実行後、一つ一つのgzファイルに対して以下のように聞かれる。

    /usr/share/man/man1/perllocale.1.gz? [ynq]

- `y` ：そのmanページを見る
- `n` : そのmanページはスキップする
- `q` : 中止

のようだ。入力せずにEnterだけ押すと'n'と同じ動作となった。

manページに入ってからは`/h_name`のようにして、該当箇所に飛んで、`n`で次検索、`Shift+n`で前検索、`q`でmanから抜ける。

manページから抜けた後は、それ以降のファイルについて同じ質問が繰り返される。

<hr>
上記で一度見たmanページを選んで再度見るには
- `/usr/share/man/man1/perllocale.1.gz`の場合は`man 1 perllocale`
- `/usr/share/man/man3p/write.3p.gz`の場合は`man 3p write`
のようにページ(1や3p)を指定すればいい。

<hr>
h_nameを含む構造体の説明をmanページで見つけようとして、こういう機能があることを知った。
Proc#curry について


# カリー化ってなに?

    複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること
[カリー化 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)


## サンプル(Javascript)

```js
var func = function(x, y) { return x * y; }
var curried = function(x) { 
  return function(y) {
    return func(x, y);
  }
}

curried(2)(3); // 6
```


# 部分適用とカリー化の違い

    カリー化は部分適用と混同されやすい。部分適用とは、複数引数ある関数の引数の一部だけに実引数を適用する操作のこと
    一方、カリー化は、引数への値の適用までは行わない
[カリー化 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)



## サンプル(Javascript)

```js
var func = function(x, y) { return x * y; }

// 部分適用の為の関数(curried)を作る所までがカリー化
var curried = function(x) { 
  return function(y) {
    return func(x, y);
  }
}

// カリー化された関数を使って、部分適用された関数(partialized)を作る
var partialized = curried(2);
partialized(3); // 6

```

# Ruby でカリー化

```rb
pr = -> x, y { x * y }          # Proc.new のシンタックスシュガー
puts pr.(2,3)                   # -> 6 : .() は、Proc#call のシンタックスシュガー

# Proc インスタンスのカリー化
pr_crrried = pr.curry          

# Proc インスタンスの部分適用
pr_partialized = pr_crrried.(2) 

puts pr_partialized.(3)         # -> 6
```

# カリー化すると何が得なの?

## 複数の引数を持つ関数に予め引数を渡しておける

複数の引数を持つ関数をmapしたい場合

```rb
pr = -> x, y { x * y }
p [1, 2, 3].map {|x| pr.(x, 3) } # -> [3, 6, 9]
```

Proc#curry を使うとブロックを使わなくて良くなる

```rb
pr = -> x, y { x * y }
[1,2,3].map(&pr.curry.(3)) # -> [3, 6, 9]
```

## 似たような関数を複数用意すること無く、部分適用を使って動的に生成できる

たとえば、FuzzBuzz
Proc#=== は、Proc#call と同じなので、case文のwhen式は、caseに渡した式を引数とするProcを渡す事ができる

```rb
fuzzbuzz = -> n {
  case n
  when -> n { (n % 15).zero? } then 'fuzzbuzz'
  when -> n { (n % 3).zero? }  then 'fuzz'
  when -> n { (n % 5).zero? }  then 'buzz'
  else
    n
  end
}

p (1..100).to_a.map(&fuzzbuzz) # -> [1, 2, "fuzz", 4, "buzz", "fuzz" ...
```

when文に渡しているProcは部分適用を使えば、こんな風に書ける

```rb
fuzzbuzz = -> n {
  curried = Proc.new {|base, n| (n % base).zero? }.curry
  case n
  when curried.(15) then 'fuzzbuzz'
  when curried.(3)  then 'fuzz'
  when curried.(5)  then 'buzz'
  else
    n
  end
}
p (1..100).to_a.map(&fuzzbuzz) # -> [1, 2, "fuzz", 4, "buzz", "fuzz" ...
```









# 参考


- [「関数型Ruby」という病(3) - カリー化(Proc#curry, Proc#flip) - ( ꒪⌓꒪) ゆるよろ日記](http://yuroyoro.hatenablog.com/entry/2012/08/10/232443)
- [カリー化と部分適用の違いと誤用 - Togetterまとめ](http://togetter.com/li/183700)
- [カリー化 != 部分適用 - kmizuの日記](http://kmizu.hatenablog.com/entry/20091216/1260969166)
- [Ruby - case文でProc#curryを使うと便利かもしれない - Qiita](http://qiita.com/umanoda/items/d7d4df073d0e6336e976)
- [Rubyのcaseを〇〇(言語名)のswitch文だと思っている人たちにぼくから一言ガツンと申し上げたい](http://melborne.github.io/2013/02/25/i-wanna-say-something-about-rubys-case/)
[css,html5] placeholder属性のテキストカラーを変更

 

####フォントカラー変更
```css:css

/* 各ベンダープレフィックスが取れた標準版！！(http://caniuse.com/#search=placeholder-shown) */
:placeholder-shown {
    color: red; }

/* Google Chrome, Safari, Opera 15+, Android, iOS */
::-webkit-input-placeholder {
    color: red; }

/* Firefox 18- */
:-moz-placeholder {
    color: red; opacity: 1; }

/* Firefox 19+ */
::-moz-placeholder {
    color: red; opacity: 1; }
 
/* IE 10+ */
:-ms-input-placeholder {
    color: red; }
```

####スタイルも付けれます
```css:css
::-webkit-input-placeholder {
    color: red;
    background-color: #ddd;
    font-size: 20px;
    font-style: italic;
    font-weight: 100;
    line-height: 1;
    letter-spacing: 0.2em;
    border: 2px solid #000;
    box-shadow: 0 1px 5px blue;
    border-radius: 50px;
}
```

####フォントカラーのsass mixin
```scss:scss
/*
 * Mixin for placeholder
 * @include placeholderColor(#00ff00);
 */
@mixin placeholderColor($color) {
    &:placeholder-shown {
        color: $color;
    }
    &::-webkit-input-placeholder {
        color:$color;
    }
    &:-moz-placeholder {
        color:$color;
        opacity: 1;
    }
    &::-moz-placeholder {
        color:$color;
        opacity: 1;
    }
    &:-ms-input-placeholder {
        color:$color;
    }
}
```
####使い方
```scss:scss
@include placeholderColor(#00ff00);
```

####スタイル指定できるsass mixin
```scss:scss
@mixin placeholder {
    &:placeholder-shown {
        @content;
    }
    &::-webkit-input-placeholder {
        @content;
    }
    &:-moz-placeholder {
        opacity: 1;
        @content;
    }
    &::-moz-placeholder {
        opacity: 1;
        @content;
    }
    &:-ms-input-placeholder {
        @content;
    }
}
```
####使い方
```scss:scss
@include placeholder {
    // ここに書く...
    color: #00ff00;
    font-size: 20px;
    line-height: 1;
}
```

####IE9 ~ 6でもplaceholder属性を使えるようにする方法
[HTML5 の placeholder 属性を jQuery でクロスブラウザに](http://terkel.jp/archives/2010/07/html5-placeholder-fix-with-jquery/)
[HTML5 Placeholder jQuery Plugin@github](https://github.com/mathiasbynens/jquery-placeholder)

####参考
[Stackoverflow | Change an input's HTML5 placeholder color with CSS](http://stackoverflow.com/questions/2610497/change-an-inputs-html5-placeholder-color-with-css)
[Internet Explorer Dev Center](https://msdn.microsoft.com/en-us/library/ie/hh772745(v=vs.85).aspx)
[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/CSS/:-moz-placeholder)
[CSS-Tricks](http://css-tricks.com/almanac/selectors/p/placeholder/)
OS X のパッケージマネージャー Homebrew(ホームブルー) をインストールする

どこにでもある[Homebrew](http://brew.sh/index_ja.html)（ホームブルー）のインストール方法です。
Homebrewのホームページから辿れる[インストール説明](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md)を見ればできると思います。
では、説明に手順に入っていきます。

#0. Homebrewとは
まずHomebrewとはです。
Homebrew（ホームブルー）とは、OS X用のパッケージ管理システムの1つです。
これを利用することにより、OS X標準搭載されていないパッケージや最新のパッケージなどが用意にインストールすることができるようになります。
他のパッケージ管理システムにはMacPortsなどがあります。

#1. インストール環境について
今回は、MacBook Pro（Retina, 13-inch, Mid 2014)へインストールです。
現在までにインストールしているソフトウェアは、[Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)と[Google 日本語入力](http://www.google.co.jp/ime/)だけの状態です。
OS Xはバージョンアップしており、OS X Yosemite v10.10.1となっています。

#2. インストール準備
Homebrewのトップページだけ見るとコマンドライン一発な感じがしますが、残念ながらひと手間いります。
（こちら[インストール説明](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md#installation)に記述されています）
最低限 Command Line Tools for Xcode が必要になります。

##2.1 Xcodeインストール
Command Line Tools for Xcode が必要になるので、最新のXcodeをインストールしましょう。
Mac App Store より手に入れましょう。
![スクリーンショット 2015-01-19 19.06.20.png](https://qiita-image-store.s3.amazonaws.com/0/26668/d3b2a1b4-3bfd-4562-f0b1-ce35e247c817.png)

インストール後にLaunchpadを開いたらアイコンが追加されています。
![スクリーンショット 2015-01-19 19.38.38.png](https://qiita-image-store.s3.amazonaws.com/0/26668/be79f129-89d9-f4bf-ff11-fa61183ce817.png)

##2.2 Xcode設定
Xcodeを起動して、各種変更を終了させましょう。
![スクリーンショット 2015-01-19 19.38.59.png](https://qiita-image-store.s3.amazonaws.com/0/26668/2a1cf28f-16a1-4bb2-7c49-6891263fdc97.png)

##2.3 Command Line Tools for Xcode のインストール
ターミナルを開いて．．．
![スクリーンショット 2015-01-19 19.42.12.png](https://qiita-image-store.s3.amazonaws.com/0/26668/259c940a-99fa-aa05-65c9-94165bd3914d.png)

インストール．．．

```
  $ xcode-select --install 
```

![スクリーンショット 2015-01-19 19.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/26668/dda34d5d-183d-c3c8-a1b9-c5d473e269ed.png)

インストールされたら終わりです。
![スクリーンショット 2015-01-19 19.44.51.png](https://qiita-image-store.s3.amazonaws.com/0/26668/b34c10fd-138f-99a9-8158-9effba422821.png)

#3. Homebrewインストール
さて、Homebrewをインストールします。

##3.1 1ライナー実行
ホームページに載っている1ライナーを実行します。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

2度ほどインストールが停止し継続確認やパスワード入力があります。

```
==> Installation successful!
```

と出力されていればインストール終了です。

##3.2 インストール状態確認
Homebrewのインストールされて状態を確認します。

```
$ brew doctor
```

下記のように表示されたらOKです。

```
$ brew doctor
Your system is ready to brew.
$
```
Homebrewは、日々更新されますので、良く確認することになります。

以上で、インストールは終了です。

#4. 番外編
もしHomebrewを完全に削除したい場合のために。

##4.1 アンインストール方法
アンイストールについて書かれています。
https://github.com/Homebrew/brew/blob/master/docs/FAQ.md#how-do-i-uninstall-a-formula

##4.2 通常インストールから削除するには
gistからscriptを持ってきて実行するだけです。
持ってくるスクリプトは[ここ](https://gist.github.com/mxcl/1173223)にあります。

実行するとこんな感じ。

```
$ sh ./uninstall_homebrew.sh
Already on 'master'
Pruned 0 dead formulae
Tapped 172 formulae
Pruned 0 symbolic links and 2 directories from /usr/local
$
```
Mac ディスプレイ明度調整をなにかしらにバインディングする

## アプリ探した

* [Mac App Store - Brightness Slider](https://itunes.apple.com/jp/app/brightness-slider/id456624497?mt=12 "Mac App Store - Brightness Slider")
  * MacBook Pro + Apple Thunderbolt display みたいな環境だと、両方の設定値を個別に設定できないのが不便


## Karabiner でなんとかしようとした 

`/Applications/Karabiner.app/Contents/Resources/include/checkbox/pointing_device.xml` とかに 
`VK_CONSUMERKEY_BRIGHTNESS_UP` という指定で明度調整するプリセットがあったので、それを参考にして自分のキーバインドを設定しようとした。

Karabiner でキーバインド設定しようとしたけど、モディファイアキーに <kbd>Shift</kbd> や <kbd>Option</kbd> が入ると、 

1. 何も起こらない
2. 通常より細かく明度が変わる
3. メインディスプレイの明度が普通に変わる

というかんじで挙動がかわってしまうので、モディファイアキーなしでマッピングせざるを得なくなり、
さすがにディスプレイの明度調整のために、押しやすいキーをグローバルに使ってしまうのはなーと思った。


## けっきょく BetterTouchTool にした

けっきょく BetterTouchTool で次の設定をしてごまかすかんじに。

* TrackPads - Global に Five Finger Tap - Brightness Up
* TrackPads - Global に Five Finger Click - Brightness Down


![BetterTouchTool 設定](https://qiita-image-store.s3.amazonaws.com/0/3189/13b9a371-9974-0616-9568-eb612f6df0ca.png)

ここでもモディファイアキーが入ると、精密な値調整になったり、動作しなかったりということが起こるんだけど、
なぜか <kbd>Ctrl</kbd> の有無で、プライマリ/セカンダリ のディスプレイ明度調整ができるからとりあえずこれでいいやとなった。微妙だけど。


## ディスプレイ - キーボード間の対応があるぽい

* MBP 本体ディスプレイ - MBP 本体キーボード
* MBP に接続してる Apple Thunderbolt Display - MBP に接続してる HHKB

ふつうに明度調整する機能を使った場合、操作してるキーボードによって、明度調整する対象のディスプレイが変わるぽい。

<kbd>Ctrl</kbd> を押すと対応してるディスプレイじゃないほうのディスプレイの明度調整ができる。

MBP + Apple Thunderbolt Display x2 みたいな環境だとこのあたりどうなるんだろうという疑問がある。
Debug時にimshowいらず、ImageWatchを試してみる(Visual Studio 2013, C++, OpenCV)

#ImageWatch
Visual Studio 2013のプラグインにImageWatchというのがある。デバッグ時にimshowしなくても、画像を表示してピクセル値の確認や拡大縮小などができる優れもののようだ。

#ダウンロード
[ここ](https://visualstudiogallery.msdn.microsoft.com/e682d542-7ef3-402c-b857-bbfba714f78d
)からダウンロードできる

#実行
VIEW→Other Windows→ImageWatchで表示できる。
[ここのサンプルコード](http://docs.opencv.org/doc/tutorials/introduction/windows_visual_studio_image_watch/windows_visual_studio_image_watch.html)を書いてDebugで実行してみたのだが、表示されず。。invalid!!（F10で一行ずつ実行できる）
![imagewatch.png](https://qiita-image-store.s3.amazonaws.com/0/63863/eecec6d5-d557-632a-d113-3a2afe50ed06.png)

#考察
VS2012でしか動かんのかなあ。。
(参考)http://www.atinfinity.info/blog/archives/date/2013/04

VS2013とあるのに。。
![imagewatch2.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/d1aab853-aea2-e9ea-66a4-6856afccb377.png)

動いた人教えてください。(>_<)ノ

---
Visual Studio 2013 Tips

- Ctrl+Shift+Bでビルド
- F5で実行
- F10で一行ずつ実行
ShinobiLayer: Customer Portalへのアクセス履歴を取得するスクリプト

#はじめに
SoftLayerのカスタマーポータルは、権限を持っているユーザーでログインしてしまえば、注文でもキャンセルでもパスワードの閲覧もできてしまいます。よって、カスタマーポータルに対して、

* どの時間帯にどんなユーザーがどこからアクセスしているか
* 攻撃と思われるようなアクセス試行がされていないか（大量のログイン失敗が発生していないか）

などを知り、不正な攻撃を受けていないかどうかを確認することはセキュリティ管理の上で重要なことだと考える方がいらっしゃるかもしれません。そういう攻撃対象のユーザーは、場合によっては一時的に使用不可にするなどといった対処も必要になるでしょう。今回は、そういった履歴情報を取得するためのサンプルスクリプトを作ってみたので紹介します。

####（参考）ステータスの変更方法

Account -> Users -> （対象ユーザー）にて、Status欄を変更します。
![ChangeUserStatus.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e2a1991a-f191-d12e-9923-92cacfecb225.jpeg)

Active/Disabled/Inactive/VPN Onlyの意味は、以下のリンクに記載されています。
http://knowledgelayer.softlayer.com/faq/what-are-available-categories-users-status-within-customer-portal

#アクセス履歴取得スクリプトサンプル

```py:getPortalAuditLogs.py
import SoftLayer
from prettytable import PrettyTable
client = SoftLayer.create_client_from_env()
table = PrettyTable(['Login Time',
                     'User Name',
                     'First Name',
                     'Last Name',
                     'Current Status',
                     'From IP',
                     'Auth Result'])
_filter={
    'loginAttempts': {
        'createDate': {
            'operation': 'betweenDate',
            'options': [
                {'name': 'startDate', 'value': ['01/24/2015 00:00:00']},
                {'name': 'endDate',   'value': ['01/24/2015 23:59:59']}
            ]
        }
    }
}

users=client['Account'].getUsers(mask='id,firstName,lastName,userStatus')
for user in users:
    loginAttempts = client['User_Customer'].getLoginAttempts(id=user['id'], filter=_filter)
    loginAttempts = sorted(loginAttempts, key= lambda x: x['createDate'], reverse=False)
    for loginAttempt in loginAttempts:
        table.add_row([
            loginAttempt['createDate'],
            loginAttempt['username'],
            user['firstName'],
            user['lastName'],
            user['userStatus']['name'],
            loginAttempt['ipAddress'],
            loginAttempt['successFlag']
        ])

print(table)
```

#出力結果
![accessLog.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4bdeffd2-a560-ec0a-6fdc-1348a15b3b56.jpeg)

以下注意点

* ユーザーごとに、アクセス日時順で並べています。ユーザーの数だけgetLoginAttemptsが呼び出されるので、ユーザー数が多い場合は、検索範囲を変更したり（もともとあまり広範囲にしない方が良い）、現在Activeなユーザーだけ探索するというのも１つの方法だと思います。
* 範囲指定で'01/24/2015 00:00:00'～'01/24/2015 23:59:59'にしているにも関わらず、1/25のデータが取得されている理由は、このAPIでの範囲指定がGMT-6:00を基準とされているからだと思われます。以下の記事も併せてご一読下さい。
http://qiita.com/testnin2/items/aa3c735977d602350d8a
プロパティシートの作成方法（Visual Studio 2013, OpenCV, C++, Kinect）

# props（プロパティーシート）の作成
props（プロパティーシート）を作成しておくことで、
プロジェクト作成時に毎回同じプロパティを記述する必要がなくなる。
読み込むだけでOKなので、Labで統一しとけば便利。

# やってみよう
VIEW→Other Windows→Property Managerを選択
出てきたProperty Managerのプロジェクト名を右クリックし、
Add New Property Sheetを選択、任意の名前(OpenCVなど)で作成する。
作成した名前のところをダブルクリックし、いつものようにインクルードディレクトリとライブラリディレクトリを追加する。
![propstips2.png](https://qiita-image-store.s3.amazonaws.com/0/63863/e2fe246e-51ea-fb1a-129b-2fed294ca3a7.png)
![propstips1.png](https://qiita-image-store.s3.amazonaws.com/0/63863/b21cba7c-216f-ab28-47af-10f833577acd.png)

Inputするライブラリ（.lib）はopencv_lib.hppをincludeしている。

---
opencv_lib.hpp
    
    // バージョン取得
    #define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

    // ビルドモード
    #ifdef _DEBUG
    #define CV_EXT_STR "d.lib"
    #else
    #define CV_EXT_STR ".lib"
    #endif

    // ライブラリのリンク（不要な物はコメントアウト）
    #pragma comment(lib, "opencv_calib3d"    CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_contrib"    CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_core"       CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_features2d" CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_flann"      CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_gpu"        CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_highgui"    CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_imgproc"    CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_legacy"     CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_ml"         CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_nonfree"    CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_objdetect"  CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_ocl"        CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_photo"      CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_stitching"  CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_superres"   CV_VERSION_STR CV_EXT_STR)
    //#pragma comment(lib, "opencv_ts"         CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_video"      CV_VERSION_STR CV_EXT_STR)
    #pragma comment(lib, "opencv_videostab"  CV_VERSION_STR CV_EXT_STR)

---

これを$(OPENCV_DIR)\build\includeの下に置いておき、

    #include <opencv_lib.hpp>

で読み込む。

# 参考文献
- http://blog.livedoor.jp/tmako123-programming/archives/25551388.html
- http://buaiso.blogspot.jp/2012/08/opencv2-c.html

次にプロジェクトを作成したときは、Property Managerを開き、
Add Exsisting Property Sheetで読み込めばいい。

---
システム環境変数の設定を忘れずに！設定後は再起動！
OPENCV_DIR　C:\opencv249\
OPENCV_VER　249
Path　%OPENCV_DIR%\build\x86\vc12\bin;

---

# OpenCVの開発環境の構築

- http://unanancyowen.com/?p=97
- http://www.buildinsider.net/small/opencv/02
- http://docs.opencv.org/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html#windows-visual-studio-how-to
Geobufタイルの可能性

手元で趣味で実験してみたところ、GeoJSONタイルをGeobufタイルに変換することで、データサイズが35%程度になるようだ。機械的な変換を通すだけで、転送量65%削減・テキストパージングの計算負荷を全体で1/N（N: ユーザ数）とすることができそうだ。Geobufタイルがコモディティになるようなことがあれば、有力な選択肢になると思う。

https://github.com/mapbox/geobuf

あと、最近悩んでいるのは、ベクトルタイルとマーカークラスターの組み合わせができないかということ。

# 参考
- mapbox/geobuf が提供（npm install -g geobuf）する json2geobuf （旧称：geojson2geobuf）について、FeatureCollection が扱えるようになったことがありがたい。
- また、新しい json2geobuf を使ってみて、初めて日本語（UTF-8）がしっかりラウンドトリップ（| json2geobuf | geobuf2json |）することを確認できた。
メールを送信するシェルスクリプト

## 口上
よく使うのでメモ。サブジェクト日本語対応。なんとなく関数化。

## 環境
- CentOS6
- yumでpostfixと`nkfコマンド`が入っている


## コード

```bash
#!/bin/bash

export PATH=$PATH:/usr/sbin

MAIL_TO="ore@gmail.com"
MAIL_FROM="noreply@hogehoge.com"
SUBJECT="メールテスト"
DATA="データ"

mail_send () {

cat << EOD | nkf -j -m0 | sendmail -t
From: ${MAIL_FROM}
To: ${MAIL_TO}
Subject: ${SUBJECT}
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit


メールが送信されます。
ここに${DATA}が入るよ。

EOD
}

mail_send

exit 0
```

## 実行例

```shell-session
$ sh -x mail_send.sh
+ MAIL_TO=ore@gmail.com
+ MAIL_FROM=noreply@hogehoge.com
+ SUBJECT=$'\343\203\241\343\203\274\343\203\253\343\203\206\343\202\271\343\203\210'
+ DATA=$'\343\203\207\343\203\274\343\202\277'
+ mail_send
+ cat
+ nkf -j -m0
+ sendmail -t
+ exit 0
```


## メール受信
gmailだとこんな感じ。
![cap01.png](https://qiita-image-store.s3.amazonaws.com/0/63023/9d5f4b4e-50a4-b9a5-4625-7eb46a830c5c.png)
エンジニアの大地へ

:octocat: **最低限こういったレベル感で経験者としては欲しい、というようなメモ**
・括りは非常にざっくり
・さらに括りによって項目がばらついている
・設計実装経験、コミュニケーション能力？などの「短」時間ではいまいち判断つかない項目に関しては、本当にできる方と1度飯などに行ってもらって判断するのがいいのかも
:speech_balloon: 抜け漏れ有ります

#エンジニア
* 簡単なアルゴリズムが組めれば良い
* 変なコーディングしない(ex. gotoなど)
* 設計・実装・リリース経験があること
* 社内で扱われている言語の経験があればなお良い
* Web出身であるとなお良い

## サーバサイド
* 得意言語を持っていること、他言語を変換できるレベル
* パッケージ構成
* SQL文をチューニングできる
* JS,リアルタイム通信,HTMLなどの簡単な保守ができること
* Linuxは触れるしシェルも組めること
* AWSのようなクラウドサービスを扱えること
* {Java, PHP} + Ruby on Rails
* {Java, PHP} + Python

## フロントサイド
* FW
* ビルドやパッケージなどを管理できること
* HTML,JS,CSSをパフォーマンスも踏まえて実装できること

## インフラサイド
* Linuxなどの構築・運用経験、ネットワークなどの基礎知識など
* パフォーマンスを考慮した保守、チューニングなど
* ミドルウェア
* Javaなどで保守できる
* 監視ツールなどの導入

## スマフォサイド
* UI/UX
* ネイティブプログラミング(iOS/Android)
* サーバとの連携
* 自分で作っているアプリ見せてもらう

## よく使うWeb用の言語

```
HTML5/CSS/JS, PHP, Ruby, Python, Node.js, Perl, Java, Scala
```
Cで強制終了を回避(出来るだけ)

#はじめに
##概要
ユーザの操作によってCプログラムが終了してしまうのを(可能な限り)回避する方法をCソースで解説します。
この記事を参考にすると例えばCプログラムを実行中にCtrl+Cを押下した際でも
終了することなく動作し続けるプログラムが作れます。

##目的
以下の用途に使える(かもしれない)。

- 絶対に途中で止めてはならぬバッチ処理
- [プロンプト機能を実装する](https://qiita.com/Ki4mTaria/items/36feda5f6aa54643775a)場合

#仕組み
通常、Terminal上でプログラムが動作している際に*Ctrl + C*を押下すると、
対象プログラムのプロセスにSIGINTシグナル(プロセスを管理するための信号的なもの)が配送されます。
SIGINTシグナルを受け取ったプログラムはOSによって処理が強制終了されます。

今回はシグナル処理設定をCプログラム上で変更し、
SIGINTシグナルを受け取っても終了しないようにOSにお願いする(無視してもらう)感じで
強制終了を回避します。

#シグナルの種類
シグナルはSIGINTだけではなく様々なシグナルが存在します。
強制終了に関係しそうな一部を以下に示します。

| シグナル    |    概要                        | どうやって配送？ |
|:-----------|:-------------------------------|:--------------------------|
| SIGINT     | キーボードからの割り込み           | Ctrl + C 押下              |
| SIGQUIT    |   キーボードによる中止            |Ctrl + '\'またはCtrl + '4'押下|
| SIGTSTP    |  端末（tty）から入力された一旦停止  | Ctrl + Z押下    |
| SIGTERM    |  終了                          | (コマンド) kill pid       |
| SIGKILL    |   強制終了                     | (コマンド) kill -KILL pid |
| SIGSTOP    |   一時停止                     | (コマンド) kill -s SIGSTOP pid |

他にもSIGPWR(電源喪失)などがあったりします。
詳しくは[こちら](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/signal.7.html)を参考ください。

#シグナル処理の変更(上書き)
(途中)
先ほど挙げたシグナルを受け取った際の動作を無視する事が可能です。
例えばSIGINTを受け取った際の処理を無視するには以下のようになります。

**signal()よりもsigaction()を使った方が良いみたいです。参考程度に。。**

```c:ign_sigint.c
    // Ctrl + C を無視
    sig = signal( SIGINT , SIG_IGN );
    if( SIG_ERR == sig ){
        exit(-1);
    }
```

##強制終了回避(出来るだけ)
signal()またはsigaction()を使用しても、
SIGKILL(強制終了)とSIGSTOP(一時停止)に関しては無視できないみたいです。
とりあえず出来るだけ無視してみたコードは以下になります。

**signal()よりもsigaction()を使った方が良いみたいです。参考程度に。。**

```c:sigchg.c
#define _GNU_SOURCE      // sighandler_tを使用する為に定義
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int main( void ){
  sighandler_t sig = 0;

  // Ctrl + C を無視
  sig = signal( SIGINT , SIG_IGN );
  if( SIG_ERR == sig ){
    exit(-1);
  }
  // kill pidを無視
  sig = signal( SIGTERM , SIG_IGN );
  if( SIG_ERR == sig ){
    exit(-1);
  }
  // Ctrl + '\'を無視
  sig = signal( SIGQUIT , SIG_IGN );
  if( SIG_ERR == sig ){
    exit(-1);
  }
  // Ctrl + Zを無視
  sig = signal( SIGTSTP , SIG_IGN );
  if( SIG_ERR == sig ){
    exit(-1);
  }
  while(1){
    pause();
  }
  return 0;
}
```

別ターミナルからは終了できてしまいますが、
プログラムを起動したターミナル側では動き続けるようになるはずです。
以上です。
プログラマになること#16 gcc先は長いががんばろう。


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#gcc
とにかく基本はｃなのです。
でもね。実はコンパイラコレクションなんだねー。
いろんなコンパイルが出来るのです。
でも、わからんよね。よかよか。
https://gcc.gnu.org/
![スクリーンショット 2015-01-28 1.49.51.png](https://qiita-image-store.s3.amazonaws.com/0/33317/206679ee-aba4-fddc-a6a2-f38b4173d05a.png "スクリーンショット 2015-01-28 1.49.51.png")

##Win環境
なかなかにまとまってますね。
http://uturo2.nevernothing.jp/mingw32/
![スクリーンショット 2015-01-28 1.57.25.png](https://qiita-image-store.s3.amazonaws.com/0/33317/dde3eb27-0930-48da-505b-9ed9e7c36a38.png "スクリーンショット 2015-01-28 1.57.25.png")

##Linux
Sublime+gcc以上終わり。

##Mac
Xcode+Sublime以上終わり。

#このシリーズ終わらんな…多分
読んでくれた人すんません。今日は時間無さ過ぎざんす。
後日を待つべし。
Embulk - ソースコードリーディング No.1

Treasure DataよりEmbulkというOSSが発表されました
（詳細：http://www.slideshare.net/frsyuki/embuk-making-data-integration-works-relaxed）
このOSSはFluentdを開発された古橋さんが携わっており、「バッチ版のFluentd」と呼べるSWです

Fluentdはストリームでデータ連携を実施しますが、こちらはバッチ処理にて同様にデータ連携を行います
※もちろんFluentdと同様にプラグインで拡張

非常に面白く将来的に流行りそう＆仕事で早く使いたいというのもありソースコードリーディングを始めました

当Blogでは備忘がてら内容を記載していきたいと思います

# 今日のリーディング範囲

手始めに以下のコマンドで表示されるhelpまでとします

```shell-session:
 java -jar embulk.jar --help
```

# リーディング内容

### githubリポジトリ

まずembulkのgithubリポジトリは下記にあります

https://github.com/embulk/embulk/

### mainメソッド

コマンドを見てわかるようにembulkはJavaですので起動の起点となるmainメソッドがあります

https://github.com/embulk/embulk/blob/master/embulk-cli/src/main/java/org/embulk/cli/Main.java


```java:Main.java
    public static void main(String[] args)
    {
        // TODO set GEM_HOME to point the internal gem repository created by gem-maven-plugin?

        // $ java -jar jruby-complete.jar classpath:embulk/command/embulk.rb "$@"
        String[] jrubyArgs = new String[args.length + 1];
        jrubyArgs[0] = "classpath:embulk/command/embulk.rb";
        System.arraycopy(args, 0, jrubyArgs, 1, args.length);
        org.jruby.Main.main(jrubyArgs);
    }
```

ここで重要なのはjrubyをCallしているというところですね
つまりここからRubyのソースコードになっていきます

```java:Main.java
        jrubyArgs[0] = "classpath:embulk/command/embulk.rb";
```

に示すようにembulk.rbを次に実行します

### embulk.rb

embulk.rbは以下にあります

https://github.com/embulk/embulk/blob/master/lib/embulk/command/embulk.rb

ここでは冒頭で環境変数を取得しています

```ruby:embulk.rb#1
bundle_path = ENV['EMBULK_BUNDLE_PATH'].to_s
bundle_path = nil if bundle_path.empty?
```

この環境変数はembulk_generate_bin.rbで設定しているようですが、通っていないのでここではnilになるのでしょう

でnilだと以下のコードで同一階層のembulk_run.rbをrequireしています
＃ちなみに上記環境変数に値がある場合は絶対パスでrequireしていますね

```ruby:embulk.rb#37
require_relative 'embulk_run'
```

そして最後にrequireしたembulk_runのrun関数を実行しています

```ruby:embulk.rb#40
Embulk.run(ARGV)
```

### embulk_run.rb

https://github.com/embulk/embulk/blob/master/lib/embulk/command/embulk_run.rb

実行時に--helpを指定していると以下のコードにかかります

```ruby:embulk_run.rb#17
i = argv.find_index {|arg| arg !~ /^\-/ }
usage nil unless i
```

ここでusage関数が実行されます
正規表現を見ればわかると思いますが--helpじゃなく、--helだったり--hogeでもヘルプが表示されます

ちなみに--helpと一緒に定義されていないオプションを指定すると、unlessではなく後続のエラー処理にかかります
その場合はusage関数にはnilではなく、エラーメッセージが渡され、helpの文言の後にエラーメッセージが表示されます

そしてusage関数内のputsでメッセージが表示されるということになります

```ruby:embulk_run.rb#225
  def self.usage(message)
    STDERR.puts "usage: <command> [--options]"
    STDERR.puts "commands:"
    (省略)
```

# 〆

ひとまずhelpまで読んでみました

私は伝統的なSIをやっている企業に所属しているものなのでこういうrubyのコードを読むのが新鮮で、楽しくてたまりませんので引き続きコードリーディングを続けたいと思います
Kinoma Create: シミュレータ

Kinoma Create は21,600円するのでお小遣いでなかなか買いづらいですよね。
https://www.switch-science.com/catalog/2000/

でも、大丈夫です。
Kinoma Create がなくても、Kinoma Studio(http://kinoma.com/studio/)
があれば雰囲気は楽しめます。
以下、MacOS での利用方法です。Windowsでもだいたい同じでしょう。

Kinoma Studio をインストールして、起動すると最初にプログラムを保存するフォルダを聞いてきます。指定してOK押すと、オレンジ色の Welcome Page がでてきます。(このページは、タイトルバーの[Help]->[Welcome]で出てきます。)
![kobito.1422374597.277082.png](https://qiita-image-store.s3.amazonaws.com/0/60968/cc447eef-50b3-7c20-0635-2679e6588dce.png "kobito.1422374597.277082.png")

Examples の方の丸をクリックして、ここは、スクロールして下の方にある
PWM Tricolor LED
を選びましょう。
![kobito.1422374775.771089.png](https://qiita-image-store.s3.amazonaws.com/0/60968/c1d8fead-2be0-61ed-db33-fea4ffd21fc6.png "kobito.1422374775.771089.png")

なんか聞かれるので、OK を押しましょう。
![kobito.1422375979.739927.png](https://qiita-image-store.s3.amazonaws.com/0/60968/6c1b49b3-d127-c46b-691d-b22ee0f7df16.png "kobito.1422375979.739927.png")

こんな感じの画面が出てくるので、Kinoma Create の横の "Run >"ボタンを押しましょう。
![kobito.1422375063.580503.png](https://qiita-image-store.s3.amazonaws.com/0/60968/4d166e4c-b941-328b-7303-bba47dfed62f.png "kobito.1422375063.580503.png")

こんなウィンドウが立ち上がります。
Kinoma Create の方の赤、緑、青の丸をドラッグしてみましょう。
それに応じて、左側のなんとも味のある絵の LED の色が変わります。

![kobito.1422375320.151365.png](https://qiita-image-store.s3.amazonaws.com/0/60968/8264fcdd-42f9-a162-3564-e82c788ef098.png "kobito.1422375320.151365.png")

実物では、ここのページの動画のようになるものをシミュレートするとこうなるということです。
http://kinoma.com/create/samples/pwm-tri-color-led/

というわけで、このシミュレータの説明が　Youtube で、
日本時間の今週土曜日１月３１日の朝６時からライブ配信の予定だそうです。
http://blog.kinoma.com/2015/01/kinoma-create-webinar-3-hardware-pins-simulators/
朝早いので、なかなかチェックできないとは思いますが、
前回同様(https://www.youtube.com/watch?v=R5v9oEsOtgo)
に後からでもみれるようになるはずです。
CocoaPods 小技巧 - Library 設定 (2/2)

[前一篇](http://qiita.com/vc7/items/c21a04e6644c6037d39c) 筆記寫到怎麼基本的指定 library 以及使用的版本，今天第二部分則會提到如何設定可以協助日常開發。

<!-- more -->

今天一樣以 AFNetworking 作為範例。

# 本地引用

``` ruby
pod 'AFNetworking', :path => '../AFNetworking'
```

在 `:path` 指定的位置是在本地端資料夾的位置，所指到的位置裡面必須有 `.podspec` 檔案來協助主專案安裝。

這是我滿常使用的方式，函式庫在開發期間便可以即時搭配主專案開發；不用像 git submodule 一樣，函式庫的 git repo 不用等 commit 就可以即時看出來使用的結果，這是最吸引我使用的原因之一。

## Development Pods 目錄

<center><p><img src="https://farm8.staticflickr.com/7376/15758620734_a2a271ef2c_o.png"><br><small>CocoaPods - Development</small></p></center>

當透過 `:path` 指定本地位置的時候， CocoaPods 會自動幫你在主 workspace 中 Pods 下建立一個 Development Pod 目錄，這邊就會存放所加入的本地 library 。顧名思義，他也是一個用來開發的資料夾，因此搭配開發函式庫使用，我覺得是最合適的方式之一。

# 外部或自有資源 &gt; :git, :svn 等

``` ruby
pod 'AFNetworking', :git => 'https://github.com/username/AFNetworking.git' # Git
pod 'AnotherLibrary', :svn => 'https://another-library.googlecode.com/svn/trunk/' # SVN
```

當公司或是自己有自行開發或是 fork 他人的 library 來用，就可以指定自己 repository 的位置。

根據[官方的 source code](https://github.com/CocoaPods/CocoaPods/blob/79d2b1f6afe88e4b1a8b2f0719464b265893b8ad/spec/unit/external_sources_spec.rb#L29) 則看出來 .podspec 中可使用的安裝方式除了 Git 和 SVN, 還有其他的版本控制可以使用：Mercurial, Bazaar, 甚至可以直接透過 HTTP 下載 source 來安裝；在 Podfile 中 :git 及 :svn 皆有使用過，其他的方式應該我猜也是都可以使用。

# 指定位置 &gt; :commit, :branch, :tag

除了第一部份的文章提到可以使用 :version 來指定 library 的版本，使用這三個方式，都可以指定自己想要的位置

``` ruby
pod 'AFNetworking', :git => 'https://github.com/username/AFNetworking.git', :commit => 'c1b3541'

pod 'AFNetworking', :git => 'https://github.com/username/AFNetworking.git', :branch => 'release'

pod 'AFNetworking', :git => 'https://github.com/username/AFNetworking.git', :tag => 'v1.0'
```

# 參考資料

- [CocoaPods Guides - The Podfile](http://guides.cocoapods.org/using/the-podfile.html)
- [external_sources_spec.rb - CocoaPods](https://github.com/CocoaPods/CocoaPods/blob/79d2b1f6afe88e4b1a8b2f0719464b265893b8ad/spec/unit/external_sources_spec.rb#L29)

## 同步發布

- [CocoaPods 小技巧 - Library 設定 (2/2)](http://blog.kumaya.co/2015/01/27/cocoapods-tips-library-setting-2-of-2/)
groovyならrubyのeach風に配列を処理できる

「rubyが好きだけどandroidアプリを書くにはググって出てくる先行事例が少ない…」と悩んでいてJVM言語でgroovyというのがあったな？と思いだして試してみた。

最近ではAndroidアプリの開発でビルドに使うgradleもこの言語で実装されている。

windowsでのインストールはchocolatelyが手軽。現時点ではgroovy v2.3.6が入る。macならhomebrewがおすすめ。
なお、筆者は横着してcmder上のcmdで実行したら見事にエラーだったので、素直に管理者権限でcmdを立ち上げて実行すること。

```
choco install groovy
```

groovyshを実行する際に下記のような感じのエラーが出たら管理者権限で立ち上げたcmd上でgroovyshを実行しておくと出なくなる。
参考: http://dechnostick.hatenablog.com/entry/2015/01/25/015715

```
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
```

rubyでのirbに当たるのがgroovysh。コマンドでブラウザでドキュメントを開いたりもできる。

```groovy
groovy:000> [1, "two", 3].each{ println it }
1
two
3
===> [1, two, 3]
groovy:000> 1.toInteger()
===> 1

groovy:000> 1.toInteger　// 引数なしメソッドはカッコ必須
ERROR groovy.lang.MissingPropertyException:
No such property: toInteger　 for class: java.lang.Integer

groovy:000> "hoge,piyo".split "," // 引数ありの場合はカッコを省略できる
===> [hoge, piyo]
groovy:000> "hoge,piyo".split(",") // カッコあり
===> [hoge, piyo]

groovy:000> System.out.println("hello groovy!") //printlnはjavaのsystem.out.println
hello groovy!
===> null

groovy:000> Math.class
===> class java.lang.Math
groovy:000> :doc java.lang.Math
http://docs.oracle.com/javase/1.7.0/docs/api/java/lang/Math.html
groovy:000>
```
大小比較の可能なcase class


こういうことがしたい。

```scala
Version(1, 0, 0) > Version(0, 9, 0)
```

で、こんなふうにやればいいんじゃないかと教えてもらったんだけど、

```scala
case class Version(major: Int, middle: Int, minor: Int)

object Version {
  import scala.math._
  implicit val ordering: Ordering[Version] = Ordering.by(v => (v.major, v.middle, v.minor))
  implicit def orderingToOrdered(v: Version) = Ordered.orderingToOrdered(v)(ordering)
}
```

ちょっと黒魔術っぽくてもっといい方法無いのかなーとか思って考えたら、こういうのを思いついた。

```scala
case class Version(major: Int, middle: Int, minor: Int) extends Ordered[Version] {
  import scala.math.Ordered._

  def compare(that: Version): Int = {
    (major, middle, minor).compare((that.major, that.middle, that.minor))
  }
}
```

最初の方法と違って、等号を持つ`case class`の拡張として不等号を持つ`Ordered`がくっついているんですよということが一目で分かることが良いと思う。

`(major, middle, minor)`と`(that.major, that.middle, that.minor)`という似た記述を2回やってるのはイケてないけど。
EC2のAuto Scalingで増えたサーバにCapistrano3からGateWay経由でデプロイする

EC2のAuto Scalingで作られたインスタンスにCapistrano3でデプロイするための設定メモ。
インスタンスは外部から直接ログインできず、GateWay（NAT)経由でアクセスする必要があったため、
SSHのオプション設定も追加で設定。

# 参考にさせていただいたサイト

* [Ruby - Capistranoで指定タグのEC2インスタンスにデプロイ - Qiita](http://qiita.com/STAR_ZERO/items/2616bdd365f557bd9d20)
* [Capistrano 3で多段sshしたい | BLOG.QuelLENcode](http://blog.quellencode.org/post/74816990164/capistrano-3-ssh)

# 設定例

* タグのkeyやvalueはAuto Scalingで設定した値に変更すること。
* gatewayには~/.ssh/configで「ssh my_gateway」でログインできるようにしてある。

```RAILS_ROOT/config/deploy/production.rb
require 'aws-sdk-core'
require 'net/ssh/proxy/command'

# auto scalingで作られたサーバのプライベートIPアドレス一覧を取得する。
ec2 = Aws::EC2::Client.new
f = -> (t) { t.key == "name" && t.value == "some_name" }
reservations = ec2.describe_instances.reservations.select{|r| r.instances.first.tags.any?{|t| f[t]}}
web_servers = reservations.map{|res| res.instances.map(&:private_ip_address)}.flatten.compact
role :web, web_servers

# Default branch is :master
set :branch, 'master'

# Custom SSH Options
# gateway経由でデプロイする。
set :ssh_options, {
  user: 'hoge',
  keys: %w(/Users/hoge/.ssh/id_rsa),
  forward_agent: true,
  auth_methods: %w(publickey),
  proxy: Net::SSH::Proxy::Command::new('ssh my_gateway -W %h:%p')
}
```
Qiita Markdownのコードハイライト部分にXSS脆弱性


はじめてQiitaに日記を投稿します。よろしくお願いします。

先日友人から「レポートを生成するためにQiita Markdownを使っているが、どこかにXSSがある気がする」という話を聞き、これは面白そうだとQiitaを覗きに来てみると、投稿画面にはプレビュー機能が付いているようです。Qiita Markdownをインストールする手間が省けたぞと喜んだあと、Qiita Markdownには一体どんな追加機能があるのだろうかとGoogleというサイトで検索して調べました。

技術系の記事を投稿するためのサービスなだけあって、真っ先にコードハイライトするための記法が見つかったので、それをQiitaの投稿ページに入力してみました。

```
```py
print('test')
~```
```

```py
print('test')
```

するとプレビュー画面には等幅フォントで入力した文字列が綺麗にハイライトされて表示されました。どのような方法でコードハイライトを行っているのか気になったので、HTMLのソースコードを見てみることにしました。

```html
<div class="code-frame" data-lang="py">
  <div class="highlight">
    <pre>
      <span class="k">print</span>
      <span class="p">(</span>
      <span class="s">'test'</span>
      <span class="p">)</span>
 ...
```

書式が違う文字ごとにspanとclassでうまくスタイルを変更しているようです。ここで私はdata-langという属性が存在することを発見し、もしかしてと思いながら編集画面に次のような文字列を入力してみました。ここまでの間数分だったと思います。

```
```py"onmouseover="alert(1)
print('test')
~```
```

するとあら不思議、プレビュー画面のコードの上をマウスカーソルが通過するたびにアラート画面が表示されます。data-lang内の文字列のエスケープに不具合があり、スクリプトが実行されてしまう状態だったのです。

しばらくの間、他にも似たような不具合がないか調べたところ、コードハイライトの言語設定だけではなく、ファイル名の指定部分にも似たような不具合があることを発見しました。

これらの不具合をQiitaのサポートに報告すると、すぐに対応が始まりQiita Markdownのリポジトリには修正版がコミットされました。またしばらくの後、サポートからQiitaのサービス側でも修正が終わったという内容の返事を頂きました。

Qiita Markdownのリポジトリを見ると、フィルタの適用の順番に間違いがあったようです。直接HTMLやJavaScriptを出力するようなページではエスケープミスが発生しやすいので注意しましょう。


以上で今日の日記を終わりにします。

-----
この日の出来事はQiita Markdownのgithubリポジトリからも見ることが出来ます。
[CHANGELOG.md - Qiita Markdown](https://github.com/increments/qiita-markdown/blob/master/CHANGELOG.md)
Chrome拡張 | 基礎

## :musical_score: 概要
Chrome 拡張の基礎
## <i class="fa fa-question-circle" style="font-size:1em;"></i>Chrome拡張 とは？
HTML, JavaScripot, CSS などによってブラウザの機能を変更・強化する。
Chrome 拡張はユーザーインターフェースをほとんど持たない。

Chrome Web Store に公開するために、 Chrome Developer Dashboard から Chrome 拡張を配布できる。

## <i class="fa fa-cubes" style="font-size:1em;"></i> 構成
### <i class="fa fa-cube" style="font-size:1em;"></i> manifest file
manifest file は JSON 形式のメタデータを記述するファイルです。
ファイル名は manifest.json です。

#### manifest file の扱う項目

* version
* Chrome 拡張の名前
* Chrome 拡張の説明
* actions
    * browserAction: アドレスバーの右のメニューアイコンに設定します
    * pageAction: アドレスバーの中にメニューアイコンに設定します
* permissions
    * tabs: ブラウザのタブシステムへのパーミッションを取得します
    * activeTab: ユーザーが Chrome 拡張を実行した時にアクティブなタブのパーミッションを取得します

#### サンプル
私が公開している、 
<i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-google" style="font-size:1em;"></i> [qiita ( ˘ω˘)ﾉ"Y☆Yヾ(˘ω˘ ) twitter](https://chrome.google.com/webstore/detail/qiita-%CB%98%CF%89%CB%98%EF%BE%89y%E2%98%86y%E3%83%BE%CB%98%CF%89%CB%98-twitter/acoblfmcdfihphocnnbcokdchegphalf)
の manifest file です。

~~~json
{
  "name": "qiita ( ˘ω˘)ﾉ\"Y☆Yヾ(˘ω˘ ) twitter",
  "version": "1.0.0",
  "manifest_version": 2,
  "description": "You can easily get one's qiita article.",
  "icons": {
    "16": "icons/icon-16.png",
    "48": "icons/icon-48.png",
    "128": "icons/icon-128.png"
  },
  "browser_action": {
    "default_icon": "/icons/icon-48.png"
  },
  "background": {
    "scripts": ["js/jquery-2.1.1.min.js", "js/background.js"]
  },
  "content_scripts": [{
    "matches": ["https://twitter.com/*"],
    "js": ["js/jquery-2.1.1.min.js", "js/contentscript.js"]
  }],
  "permissions": [
    "tabs"
  ]
}
~~~

#### Manifest File の詳細フォーマットについては下記を参照。
<i class="fa fa-external-link" style="font-size:1em;"></i> [Manifest File Format](https://developer.chrome.com/extensions/manifest)

### <i class="fa fa-cube" style="font-size:1em;"></i> Load the extension
Extension の読み込み方法について。

#### <i class="fa fa-gear" style="font-size:1em;"></i> chrome://extensions/ を開く
#### <i class="fa fa-check-square" style="font-size:1em;"></i> 右上にある「デベロッパーモード」のチェックボックスを有効化する

![extension1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/6eabadab-b95e-1459-b3e9-68b9fa563ae0.png)

#### <i class="fa fa-refresh" style="font-size:1em;"></i> パッケージ化されていない拡張機能を読み込む、を選択する

![extension1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/6eabadab-b95e-1459-b3e9-68b9fa563ae0.png)

#### <i class="fa fa-hand-o-up" style="font-size:1em;"></i> 自作した Chrome 拡張を選択する
※ドラッグ & ドロップも可能

#### <i class="fa fa-trophy" style="font-size:1em;"></i> 完了
以上で、自作した Chrome 拡張を読み込むことができます

## :books: 外部資料
<i class="fa fa-external-link" style="font-size:1em;"></i> [What are extensions?](https://developer.chrome.com/extensions/index)
Ansible Vaultに保存した値を標準出力に出力するワンライナー

# 前書き

ここのところAnsible Vaultを各種パスワードの保管場所にしている。
勝手にアプリをインストールできるような環境ならKeePassとか使うのだけど、Ansible Vaultでも保管したたくさんのパスワードを1つのマスタパスワードで取り出すくらいの役には立つ。

しかしansible-vault edit(あるいはview)で一々開いてコピペするのがそろそろ面倒になってきたのでワンライナーで取り出すようにしてみた。

# 下準備

Ansible Vaultから値を取り出して出力させるにはansibleコマンドを使うのが良い。

ansibleコマンドでAnsible Vaultを使うには、ansibleコマンドを実行するディレクトリにhost_varsディレクトリかgroup_varsディレクトリが必要になる。
ここではhost_varsディレクトリを作っておく。

```
$ mkdir host_vars
```

host_varsディレクトリの中には`ansible-vault create`で作ったyamlファイルを配置する。
他から持ってきても良いし、新しく作っても良い。
配置するファイル名のxxxの部分はホスト名にしておけばそのホストに対して処理を行う際にキーの名前だけで値にアクセスできるが、今回の用途ではlocalhostが処理対象になるだけなので適当な名前で問題ない。

```
$ ansible-vault create host_vars/xxx.yml
```

中身はどんなキーでも良いし、いくつあっても構わない。

```yaml:host_vars/xxx.yml
"host1": "password1"
"host2": "password2"
```

さっきのxxxと同じ文字列を書いたインベントリファイルを作る。

```
$ echo 'xxx' > hosts
```

`ansible-vault create`の際に設定したパスワードだけを書いた適当な名前のファイルを作る。

```
$ echo 'password' > vault
```

このファイルはパーミッションを400にしておくとより良いだろう。

```
$ chmod 400 vault
```

# ワンライナー

ここまで準備しておけば以下でAnsible Vaultに保管した適当な値を取り出して標準出力に出力することができる。

```
$ ansible localhost -i hosts --vault-password-file vault -o -m debug -a 'var=hostvars.xxx.host1' | head -n 1 | sed -r 's/^.+: "(.*)"}$/\1/'
```

軽く解説すると、

* 値を取り出すだけなので処理するホストはlocalhostで良い。
* --vault-password-fileオプションでAnsible Vaultのパスワードを書いたファイルを指定することでパスワード入力をしないで良いようにしている。
* -oは滅多に使わないオプションだが、出力結果を1行で表示するものである。
* 別のファイルや別のキーから値を取り出す場合はvar=hostvars.xxx.host1のxxx.host1の部分を書き換えれば良い。
* head -n 1しているのは後ろに余計な空白行がくっついているのでそれを削るためである。
* sedは出力から値の部分だけ取り出すものである。

利用例。sshpassを使ってパスワード認証でSSHログインする。

```
sshpass -p $(ansible localhost -i hosts --vault-password-file vault -o -m debug -a 'var=hostvars.xxx.host1' | head -n 1 | sed -r 's/^.+: "(.*)"}$/\1/') ssh user@hostname
```
WindowsのAnacondaとMinGWでpy.testを動かす


科学計算用ライブラリがコミコミでインストールできるPythonディストリビューション [Anaconda](https://store.continuum.io/cshop/anaconda/)のWindows版をMinGWから使おうとした時に発生した問題のメモ。

## 実行ファイルが *.bat だった

今回 [pytest](http://pytest.org/) をインストールしたところ、`C:/Anaconda/Scripts/py.test.bat` が生成された。

この場合、`py.test` コマンドをWindowsのコマンドプロンプトから実行することは可能なのだが、gitも入れている手前MinGWのコンソールから常にpythonを実行しているためテストもMinGW上で実行したかった。

コマンド自体は認識されるものの、当然Windowsバッチファイルでは動かない。そこで、別のLinux環境から`py.test`を移植して使ってみることにした。

## 移植版 `py.test`

`C:/Anaconda/Scripts/py.test` を次のように作成。注意すべきは改行コードが扱えるエディタを使ってLFで保存すること。

```bash:py.test
#!/usr/bin/env python
# EASY-INSTALL-ENTRY-SCRIPT: 'pytest==2.6.4','console_scripts','py.test'
__requires__ = 'pytest==2.6.4'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('pytest==2.6.4', 'console_scripts', 'py.test')()
    )
```

移植時に変更したポイントは1行目のシバンのみ。元のファイルではシステム内の`bin/python`へのフルパスが書かれていた。

## 別の解決方法

今回の pytest モジュールの場合は `py.test` コマンドを使わない別の解決方法もある。以下にあるように、`python setup.py test` として統合してしまえば、ライブラリが読み込まれれば完了する。

http://pytest.org/latest/goodpractises.html
各種シェアボタンを独自デザインで設置する


## Facebook

```html:
<a href="http://www.facebook.com/share.php?u=[URL]" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;">
	<img src="facebook.png" alt="">
</a>
```

## Twitter
```html:
<a href="http://twitter.com/share?url=[URL]&amp;text=[ツイート内容]" onclick="window.open(this.href, 'TWwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;">
	<img src="Twitter.png" alt="">
</a>
```

- IEで動作しなくなるので全角文字はURLエンコードする
- ハッシュタグは `%23` でつける

## Google+
```html:
<a href="https://plusone.google.com/_/+1/confirm?hl=[言語]&url=[URL]">
	<img src="GooglePlus.png" alt="" />
</a>
```

- 日本語は `hl=ja`

## mixi
### チェック
```html:
<a href="javascript:void(0);" onclick="window.open('http://mixi.jp/share.pl?u=[URL]&amp;k=[mixiキー]','share',['width=650','height=456','location=yes','resizable=yes','toolbar=no','menubar=no','scrollbars=no','status=no'].join(','));" >
	<img src="mixi.png" alt="">
</a>
```

### つぶやく
```html:
<a href="http://mixi.jp/simplepost/voice?status=[text]" target="_blank">
	<img src="mixi.png" alt="">
</a>
```

## はてなブックマーク
```html:
<a href="http://b.hatena.ne.jp/entry/[URL]" data-hatena-bookmark-title="[title]" data-hatena-bookmark-layout="simple" title="このエントリをはてなブックマークに追加">
	<img src="hatena.png" alt="">
</a>
```

## Pocket
```html:
<a href="http://getpocket.com/edit?url=[URL]&title=[title]" onclick="window.open(this.href, 'PCwindow', 'width=550, height=350, menubar=no, toolbar=no, scrollbars=yes'); return false;">
	<img src="Pocket.png" alt="" />
</a>
```

## LINE
```html:
<a href="http://line.me/R/msg/text/?[text]">
	<img src="LINE.png" alt="" />
</a>
```
- PCでは使えない

## Weibo
```html:
<a href="http://service.weibo.com/share/share.php?url=[URL]&appkey=[AppKey]&title=[text]&pic=[URL]" onclick="window.open(this.href, 'Weibo', 'width=600, height=400, menubar=no, toolbar=yes, scrollbars=yes'); return false;">
	<img src="Weibo.png" alt="">
</a>
```
VBScriptでProcessIDからHWNDを取得する。

#はじめに
VBScriptでは、「CreateObject("WScript.Shell").Exec(EXEのパス名)」で他のEXEを起動する事ができます。
しかし、画面の最大化・最小化表示、最前面への移動など、EXEを操作する為のメソッドはあまり用意されていません。
そのため、ExecuteExcel4Macro/Callを通してWindowsAPIにHWNDを渡し、自動操作を実現したい所です。
しかし、Execで取得できるオブジェクトのメンバーにはProcessIDしかありません。
そこで、ProcessIDからHWNDを取得するコードを公開致します。

#コード
```vbs:PID2HWND.vbs
'EXCELオブジェクトを用意する
Set excel = WScript.CreateObject("Excel.Application")

'HWNDをプロセスIDで取得する
Private Function GetHWNDByPID(pId)
  Dim hwnd, pIdLast
  hwnd = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetDesktopWindow"", ""J"")")
  hwnd = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetWindow"", ""JJJ"", " & CStr(hwnd) & ", 5)")
  GetHWNDByPID = 0
  Do While (0 <> hwnd)
    pIdLast = GetPIDByHWND(hwnd)
    If (pId = pIdLast) Then
      GetHWNDByPID = hwnd
      Exit Do
    End If
    hwnd = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetWindow"", ""JJJ"", " & CStr(hwnd) & ", 2)")
  Loop
End Function

'HWNDからプロセスIDを取得する
Private Function GetPIDByHWND(hwnd)
  GetPIDByHWND = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetWindowThreadProcessId"", ""2JN"", " & CStr(hwnd) & ", 0)")
End Function
```  

引用元：[PaperTester/PaperTester.vbs at master · nezuQ/PaperTester](https://github.com/nezuQ/PaperTester/blob/master/PaperTester.vbs)


#備考
ExecuteExcel4Macro/CALLの3番目の引数（ex.JJJ）は「返り値・引数1・引数2……」のデータ型を表しているそうです。返り値の部分を数字にする事で、指定のインデックスの引数に格納された値が返ってくるようになります。参照型（ByRef）の引数はこれで対応できます。

#おまけ
SendKeysでのショートカット操作やシェルコマンドを通じた日本語文字列のコピー&ペーストなど、EXEを操作するコードは下記のライブラリに記載しています。

[nezuQ/PaperTester - Excelテスト仕様書からIE/EXE自動操作用のVBScriptコードを自動生成する。](https://github.com/nezuQ/PaperTester/blob/master/PaperTester.vbs)
Railsのsecrets.ymlめも

最近secrets.ymlとか.secretとかでひっかかりまくりなのでメモっとく。

***

#どんなファイルか
* Rails4.1の新ファイル
* アプリケーションのsecret_key_baseを書く
* 外部APIのアクセスキーを書く

らしい。
[Railsのリリースノート](http://guides.rubyonrails.org/4_1_release_notes.html#config-secrets-yml)によると。

***
###secret_key_baseってなんだっけ
* セッションの改ざんを防ぐためにキーを設定(セッション変数の暗号化に使われるらしい)
* デフォルトはランダム
* production環境は環境変数で記載し、developmentやtestは直書きしたりする
* Rails.application.secretsからアクセスできる
Windowsでアクティブになっているアプリケーションの名前をRubyでWin32APIを使って取得

RubyにてWin32APIを叩いて、アクティブになっているアプリケーション名を1秒おきに出力するスクリプトを書いてみた。

Ruby + Win32APIについての日本語の資料とRuby2.0以降のコードが見つからなかったので何かの参考になるかもしれない。
Ruby2.1でも動作確認済み。Ruby2.2は未確認
Windows環境はWindows7を使用、Windows8環境下で動くかは未確認です。

ソースコードは下記

```main.rb
require 'Win32api'

hwnd = Win32API.new('C:\\Windows\\System32\\user32.dll', 'GetForegroundWindow', [], 'N')
GetWindowText       = Win32API.new('C:\\Windows\\System32\\user32.dll', 'GetWindowText', 'LPI', 'I')
GetWindowTextLength = Win32API.new('C:\\Windows\\System32\\user32.dll', 'GetWindowTextLength', 'L', 'I')

loop{
  buf_len = GetWindowTextLength.call(hwnd.call)
  str = ' ' * (buf_len + 1)

  result = GetWindowText.call(hwnd.call, str, str.length)
  puts str.encode(Encoding.default_external)

  sleep 1
}
```

最後に、Ruby2.0以降は Win32API ではなく、Fiddleを使用してWindowsで使用する関数を呼び出すように切り替わったようです。
ですので、Win32API を使用すると下記のような文言が最初に出力されます。

```
DL is deprecated, please use Fiddle
```

Fiddleで記載方法も書きましたので気になる方は、[こちらへ](http://qiita.com/hayabusa333/items/f30f1d6cc8869d916447)