OmniAICreator/Qiita-1.07M huggingface dataset:
Cloudera Managerを使った複数クラスタの管理と設定の差分

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の5日目です。

Cloudera Manager（以下CM）を使えば、1台のCM上で複数クラスタの管理が可能です。たとえば分析基盤と検索基盤のように、各クラスタには任意の名前をつけられます。

![alt](https://lh3.googleusercontent.com/1yATvbf-9yEt7Fm6S7_nD1pSKEwbklU3-TMqy3QOFAwc4aqB5tY93pBoxhVTFHcvpCRYR4ESchZAOpwxUrVPtit1yO6DvBiT4-z3fqlAXgYI-arUgKCUMZXfucK4V2JwTohNXwST8L9uV9AtYZeDJXwyw0NreMYwnqPAA716Z2okzLfe6qhV0nTeRmWtz09TQkaF22iMEGSF6-hw5NmEwE7sGxDLagPet9IwASYNqy3ee73faIoFPw5N_RqawYzLCc84-V8QUblX4TQigYcTWJO8t2AoSZc6oSOKy7td1YaNRlP8l6oQmn9UbB6FD3AfrOSta4d056gvMvKLWZUncf7skU6rCRO4b05uqG26iq3yEiWE_SvZZe2VExZaYYDUK7iKf15Feq-4arLk0jTSryuqJ3sM50Uf348LJgcQBJycLWkprnpgw4C9fEMTpYfnkKVw4DRqYrv4cDT2mUTNHbRiLaOSLwqN5DsU16yUpuLww59AVEc144bKwMatRevJgETil3RSw7sRx_2etC5kG5K5NKZNU7G-9VLz6JM=w513-h736-no)

さて、CMでは管理しているクラスタ間での設定差分も確認できます。パフォーマンスの調査を行うときなどには期待通りに動いているクラスタとの違いを確認したいことがままあります。今回はHiveの設定差分を確認してみましょう。クラスタ一覧から、分析基盤のHiveサービスを選択します。

![alt](https://lh3.googleusercontent.com/IWnE_73n5zk3ZuLPcecWwV24bp-o_eALLi6FP6xYNYS4hpQBeTvUmE1VJs18xX84Jr2eL3W-siShpppcsjtdwDpbLcWkBlwVE0WgI9Qfkqly_OYPd3S2Zwf03-OWc4M4Zl9Knl9V51TDXLBuxJwPVaoRFlyXClE-QfY2LLvI6Py3rIlcVa09sHxItReO9jJkfo23UCGd1ZXLFlWjDxaxVm80zKqdcd8A6d-8gKRRESiCUIjvNZLjn5ru4I7lyz2TOamqgPdEB9MyaoEVSeBjw8p65mqG8T8dc6Hg_xoFag8v7mzk3qHD5L35pPSBY1sA4GUYCcr-el3oEKfnGKnuA_g8y7zY4aKN0KwIyT5YRG1UOlyb5S_Be5Ev0ER1AazqI-FxLAtrtE-43nm6QMaPkGbzzu9T90LNHjGk1xC-V17hTCI32R17MvgJ8fJzTAk7hvTqk37AfobPV9V809OJV_VwKsAQ8JmePraf9ls0cIJRuwU-EYPwWDM18dsK8XOsSJXGd3F3swsbxJrRQcaP9FF3JMYveknERITmMrA=w614-h421-no)

設定画面から、「検索基盤のHiveとの差分」を選択すると、差分がすべて表示されます。

![alt](https://lh3.googleusercontent.com/ZzrHbYCLTU645PcaBsS4jQFmENtWnVJPtiLkWJgTiwob2IFrnSpTAcKdnNLZ3EgIvPYKCl2wfDLY712W4l0bzorgy3_0-ewmPo_JccppKKbWjWN4SPLlsJ1go5ivZAGn-mxEbFnS0sdk_PenSzk40gXym3QjfZaBwmXAuG9ddCikxD3085TvAHQW_cl741fZEDORPsCzGPpIcZzdZ3yNQBMsDnG7sOJfzqBkacD8zXYIqcGqDMo4kFzrE7r0MKnxRjw_FhnGeW2LRUv5gYGfYPjyXKyyzj0hjfy_fRUheubCN_56Zaa1tziu-1-SWYckYK8vURZr2cWQuzmhYnqFc4uluUeSSGYRzQ6J15xin-0L0m32TZAX6CpexIXXqGj20YvcuT3x0QueBxOYMoapvzD8rNqgVfInJi5IXYzrg88x8CjtnVI84GGlrywV-IY1aAjuUaw6JUJkLi8OfP3K0t6fHOULPq86068fI_D-9REG-RsTtJmUzX4Ud7QEC835YdWPGXH3S9Ap86UH_LzDHvDCsW4YUjTjM12SXDM=w372-h385-no)

ここでは特に「ヒープサイズ」について差分を絞り込んでみましょう。もちろん日本語での検索にも対応しており、以下のようにMetastore Serverのヒープサイズに違いがあることがわかりました。

![alt](https://lh3.googleusercontent.com/iR4Y2jno-diOdtihS-oLappfc-KYrI5CyCID-aLOLrxY3GsC5YEVYUMgfaH4bi1-l_o0fKsTcjAppohVUgjrhQY-yNDo3MgZ9E6G4LvEeXWjh-AbYpkoP5BdK_k5ujJFv5mompH5k8frFUycn2LN-kwUg5SnuWDDz0ijQqzLexAzPSBbJdxnSr7wxi48U_4lSdXeBJKSsPYN2svqIxwT8wILycdMdn_1Nul-guFFOYkSEYegN9b7iHWXyU5Ju8gyAagIT93alY4W905aH0i1Y00Xcn_S4EcGmmr0dtsPjZH1tizdWqX_FXL3QmxKAH7m4hGa_Nt6-frrZx61LP52rwA9eakaRU-3_g4xVAXG8quZ0FU_ycawL0uif0_BQ2o-yDQ-Jxl_8yW6DoElGO9CHWRIn50i60fumc_pwD30OZawsa8zY9blzaS2npLQZ3Zdf9OR67XdFT2I4K_Y0nq4rLox_I9gQIfaW8bOnxCbuzg8I9rCtI4rV92HPCtwSV406tCg1EoyI_mMwHkpvZRWE9KDOS3N3MebzmvmiaMRG-BAzSlikjCpQ0Ycf_Mgi-qr=w901-h470-no)

# 最後に

CMを使った複数クラスタの管理と、設定差分について紹介しました。CMにはいろいろな機能があるので使い込むほどに便利さが実感できます。
CydiaSubstrate target.


この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の4日目の記事です。

## ターゲット
SIMBLもそうですが、当然dylibをロードしたいプロセスとそうでないプロセス、つまりターゲットがあります。
CydiaSubstrateではdylibと同名のplistファイルに所定の書式で記述しておくことでターゲットのフィルタリングがされます。

### フォーマット
OpenStep方式でフルに書くと以下のようになります。※厳密にはCoreFoundationVersionキーを使う場合はOpenStep形式では小数点のある数値を扱えないのでXMLで書く必要があります。

````
{
  Filter = {
    Bundles = ("com.apple.mobilesafari", "com.apple.springboard");
    Executables = ("backboardd", "mediaserverd");
    Classes = ("WKWebView", "AVPlayer");
    CoreFoundationVersion = (1140.00, 1240.00);
    Mode = "Any";
    Flags = 2;
  };
}
````

### Bundles
`NSBundle.mainBundle.bundleIdentifier`で得られるStringでターゲットを記述します。Arrayなので複数をターゲットに出来ます。

### Executables
`NSBundle.mainBundle.bundleIdentifier`が設定されていないプロセス（おもにデーモン）をターゲットにする場合にその実行ファイル名を記述します。Arrayなので複数をターゲットに出来ます。

### Classes
プロセスに記述したクラスがロードされているかどうかでフィルタリングします。[NSClassFromString()がNULLかどうか](https://github.com/r-plus/substrate/blob/master/DarwinLoader.cpp#L346)になります。Arrayなので複数をターゲットに出来ます。

### Mode
その昔は前述の3種類のフィルター、Bundles, Executables, Classesは1種類のみを利用する事を想定されていました。判断順序はExecutables -> Bundles -> Classesの順なので例の場合backboarddとmediaserverdのみがターゲットとなりSpringBoardやSafariそしてWKWebViewかAVPlayerクラスがロードされているプロセスへはロードされない実装でした。
これを組み合わせて使えるようにModeパラメータが追加されました。取りうる値は"Any"のみで、これが指定されていると3種類のフィルターのどれかに合致すればロードされます。

### CoreFoundationVersion
先日説明したkCFCoreFoundationVersionでiOSバージョンに応じてフィルタリング出来ます。Arrayで値を1つか2つ記述します。
1つの場合はgreater判定のみで上述の例だと`1140.00 > kCFCoreFoundationVersionNumber`になります。
2つ記述がある場合はgreater thanとless equalになり
`1140.00 > kCFCoreFoundationVersionNumber && 1240.00 <= kCFCoreFoundationVersionNumber`になります。
1140.10がiOS 8.0で1240.10がiOS 9のバージョンなのでそれぞれ少し値を減らす事で例ではiOS 8.xがターゲットになります。

### Flags
隠しパラメータのFlagsキー。2を指定するとロードせずにスキップしてくれます。デバッグ用でしょうか。Stringで記述するとエラーになりますのでIntegerで書く必要があります。	

````xml
<key>Flags</key>
<integer>2</integer>
````

### 注意
元祖CoreFoundationVersionフィルター機能がこのターゲットフィルターの記述ですが、PreferenceLoaderにおけるCoreFoundationVersionフィルターはgreater than, less equalではなくgreater equal, less thanとなっていますのでご注意を。個人的にはPreferenceLoaderの形式の方が使いやすいと思います。
いろいろクラウド事情 [社内導入編]

[dots girl Advent Calendar 2015](http://qiita.com/advent-calendar/2015/dots_girls) の5日目を担当します！

個人で使う場合はあまり気にしない部分
クラウド利用に慎重な現場に導入するために、顧客ガイドラインや社内ガイドラインと格闘していろいろ調べてみました。
クラウド事業者もいろいろありますが、アプリ開発でよくお世話になるIaaSに力を入れている有名どころの３つでご紹介します。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/91552/485b43b5-b462-a361-c21c-7cd0ecfbc3e6.jpeg)

| サービス名 | 略称 |
|:------------:|:------------:|:
|Amozon Web Service|AWS|
|Microsoft Azure|Azure|
|Google Cloud Platform|GCP|

#考慮が必要になる法規制
・個人情報保護法
・不正競争防止法
・外国為替および外国貿易法（外為法）
・著作権
・e-文書法
・米国愛国者法
・EUデータ保護法

詳しくは[経済産業省クラウドガイドライン](http://www.meti.go.jp/press/2013/03/20140314004/20140314004.html)を見てみてください。

#データの場所
・物理的にどの国にデータを置くか、データセンターやリージョンのことです。
・通信速度にも影響します。やっぱり日本は早いです。

| AWS | Azure | GCP |
|:------------:|:------------:|:------------:|
|東京が選択可能|西日本、東日本が選択可能|日本にまだない|

#情報セキュリティマネジメント体制
・日本での信頼性を評価するための判断基準が必要になります。
・ISO27001やプライバシーマーク（Pマーク）を認定を受けているかなどです。
・主要3社は日本、アメリカで使用できる認定はクリアしてます。

[AWS コンプライアンス](https://aws.amazon.com/jp/compliance/)
[Microsoft Azure セキュリティ センター: コンプライアンス](https://azure.microsoft.com/ja-jp/support/trust-center/compliance/)
[Google Cloud Plarform が取得している第三者認証について](http://www.cloud-ace.jp/report/detail11/)

#準拠法と管轄裁判所
・クラウド利用の中で法律の判断が必要になった場合、どこの国/どこの地域の法律を使うかということです。
・日本の販売代理店などを通じて使用することで、準拠地を日本できるので、必要に応じて利用してもいいと思います。

| AWS | Azure | GCP |
|:------------:|:------------:|:------------:|
|アメリカ|日本|アメリカ|
|ワシントン州法|日本国憲法|カリフォルニア州法|
|ワシントン州キング郡州裁判所                  |東京地方裁判所             |調査中|


まだまだ調査中ですので、↓↓ここで詳しくご報告する予定です！！！！
[【満席御礼☆増枠！】dots.女子部 - オールジャンル女子エンジニア集合！tips共有会！！]
(http://eventdots.jp/event/575187)

いろんなバックグラウンドをもった女子が集まるdots.女子部！
わたしたちと一緒にもくもくしたい女子の入部をお待ちしていますヾ(＠⌒ー⌒＠)ノ
[Twitterやってます♪](https://twitter.com/dotsgirls)
[Facebookもやってます♪](https://www.facebook.com/dots%E5%A5%B3%E5%AD%90%E9%83%A8-457992851057604/)




それでは、明日は[＠sd_ts1017](http://qiita.com/sd_ts1017)さんです。よろしくお願いします(^^♪
Visual Studio Code: Task 機能に複数の任意のコマンドを簡単に仕込む方法

# 概要

Visual Studio Code の Task に「複数の任意のコマンド」を仕込む簡単な方法を紹介する。

## 背景

Visual Studio Code の Task は1つの command に対して複数の arguments を与えて実行する仕様であり、コマンド自体を任意に実行したい一般的な用途には一見すると向かず引数に応じて処理を分岐するスクリプトを中間に仕込む必要があるかのように見える。

しかしながら、本稿で紹介する方法を用いれば Visual Studio Code の Task に事実上「任意のコマンド」をより簡単に定義して使用可能な事を確認したので紹介したい。

# 方法

例として `sh` を使用可能な一般的な環境について `ls -la` を実行する `task la` 等の仕込み方を提示する。例示する `sh` のほかこの手法は `bash` や `zsh` または `cmd.exe` や `powershell.exe` でも可能である。

.vscode/.task.json

```json
{ "version": "0.1.0"
, "command": "sh"
, "isShellCommand": true
, "showOutput": "always"
, "args": [ "-c" ]
, "tasks":
  [ { "taskName": "la"
    , "suppressTaskName": true
    , "args": [ "ls -la" ]
    }
  , { "taskName": "hoge"
    , "suppressTaskName": true
    , "args": [ "echo hoge" ]
    }
  , { "taskName": "build"
    , "suppressTaskName": true
    , "args": [ "mkdir -k build; cd build; cmake ..; make" ]
    }
  , { "taskName": "debug"
    , "suppressTaskName": true
    , "args": [ "cd build; gdb bin/my-executable" ]
    }
  ]
}
```

## 解説

- `sh` 等のシェルコマンドは任意のコマンドを実行するオプションを持っている。
    - `sh`, `bash`, `zsh` などの一般的なシェル: `-c`
    - `cmd.exe`: `/C`
    - `powershell.exe`: `-Command`
- ~~シェルコマンドへ渡すコマンドライン文字列は文字通りシェルコマンドの外からは文字列として渡すため`"`で囲み1つの文字列として渡している。~~ (†1)

> (†1): 実験中に必要と判断して付けていたが、記事掲載後に [@felixfbecker からの指摘](https://github.com/Microsoft/vscode/issues/981#issuecomment-162862957) により vscode の task 機能では自動的にエスケープされるため不要と判明した。

## 利点

この方法を使うと Visual Studio Code の Task に複数の任意のコマンド実行タスクを簡単に仕込み易く便利が良い。

# 参考

- [Visual Studio Code](https://code.visualstudio.com/)
    - [Microsoft > ja-JP > Visual Studio Code](https://www.visualstudio.com/ja-jp/products/code-vs.aspx)
- [@IT : Visual Studio Codeの使い勝手をよくするツール](http://www.atmarkit.co.jp/ait/articles/1509/08/news019.html)
- 各種シェルコマンドのヘルプ
    - `sh --help`
    - `cmd.exe /?`
    - `powershell.exe /?`
- [github : Microsoft/vscode > Issues > #981 Cannot define multiple commands in tasks.js](https://github.com/Microsoft/vscode/issues/981)
    - Qiita へのポストからしばらく後に本家 Issues でも類似の要求を発見、本手法を紹介しつつ、その後クロスプラットフォーム対応やクォート不要のフォローアップを頂くなどのやり取りがあった。

----

# 付録

## `cmd` の場合の具体的な `tasks.json` の例

- https://github.com/Microsoft/vscode/issues/981#issuecomment-162331586
    - @danielschmitz が書いてくれました :+1: 

## 任意のサブタスクをキーボードショートカットへ割り当てる方法

↑の `cmd` の例で @danielschmitz が以下の例を挙げてくれたのでついでに紹介。

```json
{ "key": "ctrl+shift+alt+o", "command": "workbench.action.tasks.runTask/taskName" } 
```

これまで知らずに buildとtestを割り当てたタスク以外は、`runTask`の割り当てを呼んでからタスク名を明示的に打ち込んで実行していました。これを知っていると器用さが向上して良いですね :+1:
Unsuffixed integer literalの型

整数リテラルの型について、Cでは、規格のバージョン・処理系のメモリモデル・リテラルの基数表現（10進か16進か8進か）によって一意に決定されますが、Rustではどうなんだろ？と気になったので、簡単に実験してみました。

##バージョン
```bash:
$ rustc --version
rustc 1.4.0 (8ab8581f6 2015-10-27)
```

##型のサイズ

型のサイズは、`std::mem::size_of::<i8>`、`std::mem::size_of::<u32>`などで取得できます。

```
Type |Size  
-----+-------
char |     4
i8   |     1
u8   |     1
i16  |     2
u16  |     2
i32  |     4
u32  |     4
i64  |     8
u64  |     8
f32  |     4
f64  |     8
```

Cでは`sizeof(char) == 1`であることが規格で定義されていますが、Rustの`char`型のサイズは`4`のようです。

##整数型の表現可能な値の範囲

整数型の最小値や最大値は、`i8::min_value()`、`u32::min_value()`などで取得可能です。

```:整数型の表現可能な値の範囲
Type |Min Value            |Max Value           
-----+---------------------+--------------------
i8   |                -128 |                 127
u8   |                   0 |                 255
i16  |              -32768 |               32767
u16  |                   0 |               65535
i32  |         -2147483648 |          2147483647
u32  |                   0 |          4294967295
i64  |-9223372036854775808 | 9223372036854775807
u64  |                   0 |18446744073709551615

```

##Unsuffixed integer literalの型

`i32`の表現可能な範囲を越えた整数リテラル（サフィックスなし）を、型を明示しない変数`a`に代入してみます。`i32`で表現可能な範囲を超えているため、`u32`か`i64`に型推論してくれる？と思いきや…

```rust:
fn main()
{
    let a = 2147483648;
// => warning: literal out of range for i32, 
// #[warn(overflowing_literals)] on by default

    println!("a = {}", a); 
// => a = -2147483648
}
```

まず、コンパイル時にオーバーフローの警告が出ました。かまわず実行した結果が`-2147483648`です。

unsigned 32 bitの`2147483648`に相当するビット表現を、2の補数で表現されたものとして解釈し、`-2147483648`と表現したものと推測されます（警告が出ている以上、未定義動作なのであくまで推測ですが）。

整数型変数について、型を明示しない場合の整数型は`i32`ですが、整数リテラルについては、コンテキストから型推論できない（サフィックスで型を明示せず、初期化する変数の型も明示されない）、かつ、そのリテラル整数が`i32`で表現可能な範囲（`-(2^31)`～`(2^31)-1`）を越える場合、自動的に`u32`または`i64`に変換される…わけでないようです。

`i32`で表現可能な範囲を越える整数リテラルを扱う場合、リテラルにサフィックスをつけるか、初期化する変数の型を明示するか、あるいは両方か、にしたほうが良さそうです。

##INT_MINについて
`int32`の最小値であるリテラル整数`-2147483648`は、C言語だと、単項マイナス演算子のオペランドに`2147483648`が指定された式として解釈されるため、（`2147483648`がintの範囲を超えるため）通常の算術変換が発生し、long型に暗黙の型変換されてしまいます。Rustの場合、

```rust:
let a = -2147483648i32;
```
と書いても、期待通りに`int32`として解釈されます。ちなみに、Rustに単項プラス演算子`+`は存在しません。
25分だけ集中するための作業用BGM

ポモドーロ・テクニックという言葉をお聞きになったことがあるでしょうか。

>紙と鉛筆とキッチンタイマー、これだけで仕事の効率を改善します！ 紙と鉛筆とキッチンタイマーを使ってアナタの生産性を画期的に高める時間管理術。 それがポモドーロテクニックです。 キッチンタイマーをセットして、25分間集中。 たったこれだけのことが、あなたの人生を変えます!　
http://www.amazon.co.jp/dp/4048689525

仕事でも、日常生活でも、
**「やるべきことは山程あるのに、なかなか重い腰が上がらない...」**
ということが、恥ずかしながら、わたしはよくあります。

そんな時、「とりあえず25分やってみよう」と時間を区切って始めると、取り掛かれることが多いのです。

本来のポモドーロテクニックは、この25分を必要に応じて休憩を挟みながら何セットも繰り返し、それを記録するというものらしいのですが、今回は、「25分集中する」ためにわたしが使っているBGMのひとつをご紹介します。本当はたくさん紹介したかったのですが....アドベントカレンダーは明日以降も続くので、曲の紹介は他の方にお任せします！
 
### ドヴォルザーク 弦楽四重奏曲第12番「アメリカ」
（画像はYouTubeへのリンクです）
[![Dvořák - American Quartet, Prazak Quartet](http://img.youtube.com/vi/pV-kbAydcwk/0.jpg)](http://www.youtube.com/watch?v=pV-kbAydcwk)

### さいごに
このエントリも、この動画を聴きながら25分で書き上げました！

6日目は[long_long_float](http://qiita.com/long_long_float)さんです。

##参考エントリ
- [アジャイルな時間管理術 ポモドーロテクニック入門](http://www.amazon.co.jp/dp/4048689525)
- [時間管理術入門～ポモドーロテクニックを例として～](http://qiita.com/omokawa_yasu/items/a1e83faa8bb7a14154f8)
- [QiitaにYouTubeを埋め込む（MarkdownにYouTubeを埋め込む）](http://qiita.com/tnarihi/items/762b6ba4ac0a160eef5b)
Dockerストレージドライバー

# dockerのストレージドライバーについて

docker 1.9に更新になり、ドキュメントが強化されました。
非常に詳しくdocker ストレージについて記載されています。

https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/

ぜひ参照ください。
[*Cordova*] バッテリー状態プラグインを使ってみる

# はじめに
環境構築はできたので、プラグインで遊んでみます。
簡単そうなバッテリープラグインから

# プロジェクト作成
プロジェクトを作成してプラットフォームとしてiOSを追加。
そしてバッテリー状態プラグインを追加。

```bash
$ cordova create batteryPush com.example.batteryPush -d
$ cordova platform add ios
$ cordova plugin add cordova-plugin-battery-status
```

# コード

```html:index.html
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
		<meta name="format-detection" content="telephone=no">
		<meta name="msapplication-tap-highlight" content="no">
		<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
		<link rel="stylesheet" type="text/css" href="css/index.css">
		<meta charset="utf-8">
		<title>Battery</title>
	</head>
	<body>
		<div class="app">
			<h1>Battery</h1>
		</div>
		<script type="text/javascript" src="cordova.js"></script>
		<script type="text/javascript" src="js/index.js"></script>
	</body>
</html>
```

```js:index.js
var app = {
	// コンストラクタ
	initialize: function() {
		this.bindEvents();
	},
	// devicereadyはCordovaを全部読み込んでから発火
	bindEvents: function() {
		document.addEventListener('deviceready', this.onDeviceReady, false);
	},
	// バッテリーの残量が変化したら呼ばれるように設定
	onDeviceReady: function() {
		window.addEventListener("batterystatus", onBatteryStatus, false);
	},
};

app.initialize();


function onBatteryStatus(info) {
	alert("バッテリー残量：" + info.level + ", デバイスの接続：" + info.isPlugged)
}
```

# 取得できる値

|キー|値|
|:--|:--|
|level|バッテリー残量|
|isPlugged|デバイスが接続されているか|

# イベントの種類

|種類|説明|
|:--|:--|
|batterystatus|バッテリー残業が変化した時、デバイスが接続されたまたはされなくなった時にイベントが発生。|
|batterycritical|バッテリー残量がとても少なくなった時にイベントが発生。基準はデバイスに依存する。|
|batterylow|バッテリー残量が少なくなった時にイベントが発生。基準はデバイスに依存する。|

# 実行結果
バッテリー残量が変化した時にイベントが発生する。
MacにPCを接続して、Xcodeから実行しiPadで見ているのでデバイスの接続はtrueになる。
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/48912/732c1d82-c60e-685a-614d-a8095bfba7bc.png)

# まとめ
アプリ起動時のバッテリー残量は取れないのでしょうか。

# 参考
* [cordova-plugin-battery-status](https://www.npmjs.com/package/cordova-plugin-battery-status)
RPi > 消費電流 > 322mAから515mA (2012年の計測)

raspberry Piの消費電流について気になった。

http://raspberrypi.stackexchange.com/questions/341/whats-the-current-draw-and-supply-voltage-tolerance
に様々な計測結果が出ている。

ただし、2012年のものなので、Pi2はどうかは分かっていない。

一部抜粋

> 322mA at 5.09V - at login prompt on Arch, idle CPU, nothing plugged but power (1.64 Watt).
...
> 475mA ~ 515mA - LXDE/X11 on!, composite video, ethernet, PS2 KB&Mouse together on one USB port, mouse in use + CPU stress, LXDE/X11 on.


CHARGER Doctorで計測でどのくらいの精度で分かるのだろうか?

今考えている、以下のものを接続した時がどうなるか。

- USBシリアルケーブル x 2
- WiFiドングル (クライアント接続用)
RPi > GPIO > 通常はpull_up_down=GPIO.PUD_UPをすることで,プルアップで3.3Vにつられている


http://razzpisampler.oreilly.com/ch07.html

> The input pin is normally pulled up to 3.3V by the optional argument pull_up_down=GPIO.PUD_UP in GPIO.setup.

>```py
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
```
シェルでMyDNSにIP通知

サーバーは借りてるけど、ドメインは無料…そんな私向けの備忘録です(笑)
## 前提条件
* DNSは[MyDNS](http://www.mydns.jp)を使っている
* サーバーは固定IP
* Linuxを使っている

## コマンド
```
#!/bin/bash

while :
do
    status=`curl -o /dev/null -w %{http_code} -s --user $user:$pass www.mydns.jp/login.html`
    if [ $status -eq 200 ]; then
        break
    fi
done

```
## ちょこっと解説
```
while :
```

無限ループしてくれます。

```
curl -o /dev/null -w %{http_code} -s
```

「-o /dev/null」で出力を無効にします。
「-w %{http_code}」で出力をステータスコードにします。
「-s」はサイレントモードの指定です。
（多分…）
## こんなシェルを作った経緯
MyDNSは、どうも固定IPを設定しても定期的に通知が必要なようです。
（メールが飛んできました。）
そこで当初、こんな簡易なシェルでやってました。

```
#!/bin/bash

curl --user $user:$pass www.mydns.jp/login.html
```

cronで月曜日と木曜日に流し、約2ヶ月は問題なく運用できてました。
ところがある日「IP通知してね」のメールが…
「え？？やってますけど…」と思いcronのログを確認したところ、401エラーが∑(￣□￣|||)
どうも正しいユーザー：パスワードを設定しても、たまにエラーになっていたようです。
（1週間以内に通知しておけばメールが来ないため、月曜日か木曜日が成功すればメールは来なかった。）
そこで、無限ループで200が返ってくるまで繰り返す…というシェルにしてみました。
## 最後に…
もし「MyDNSで固定IPを設定したら通知は不要」という方法をご存知の方がいらっしゃいましたら、ご連絡お待ちしております♪
つまんない記事ではりますが、誰かのお役に立ちましたら。。。
mruby で簡単にオリジナルの CLI を作る

[この投稿は Sansan Advent Calendar 2015 の 5 日目の記事です。](http://qiita.com/advent-calendar/2015/sansan)

# 概要
最近は [mruby-cli](https://github.com/hone/mruby-cli) でマルチプラットフォームの実行バイナリを作成できるようになり、ちょっとした CLI のコマンドを作成する機会が増えたのではないかと思います。

そこで、オリジナルの CLI を簡単に作れるようなライブラリを作ってみました。
お気付きの方もいるかもしれませんが、Ruby の thor のようなものです。

[qtkmz/mruby-hogun](https://github.com/qtkmz/mruby-hogun)

# 準備
まずは mruby-hogun を組み込んだ mruby を用意します。

以下のような build_config.rb を作成し、mruby を作ります。

```rb
MRuby::Build.new do |conf|
  toolchain :gcc

  enable_debug

  conf.gem '../mruby-hogun'

  conf.gembox 'default'
end
```

# 使い方

```rb
class FooCLI < Hogun
	desc "hello NAME", "say hello to NAME"
	def hello(name)
		puts "Hello #{name}"
	end
end

FooCLI.start
```

のような mycli.rb ファイルを用意し実行してみます。

## 実行例 1. 引数なしで実行する

```bash
$ mruby mycli.rb
Commands:
  mycli.rb hello NAME  # say hello to NAME
  mycli.rb help [COMMAND]  # Describe available commands or one specific command
```

## 実行例 2. コマンドを実行する

```bash
$ mruby mycli.rb hello Sansan
Hello Sansan
```

## 実行例 3. コマンドのヘルプを表示する

```bash
$ mruby mycli.rb help hello
Usage:
  mycli.rb hello NAME

say hello to NAME
```


# 今後
最後の一枠に滑り込みで参加することになったので、ネタに困りライブラリを作ってみましたが、thor と比べるとまだまだ至らないことがあり、実用はまだかなと思うところもあります。
そんなわけでこれからは、[mruby-cli](https://github.com/hone/mruby-cli) に組み込めるようにしたり、bin にも組み込めるようにして、より mruby で自作のコマンドラインツールが作りやすいようにしていこうと思います。
Google Apps SMTP リレーサービスとCakePHP3のEmailを併用するときの注意

# 公式ドキュメントの項番7で、__IPアドレス認証のみ__を選択した場合
[認証] セクションで、以下のいずれかまたは両方のチェックボックスをオンにして認証方法を設定します。
_https://support.google.com/a/answer/2956491?hl=ja_

## 正しい書き方

```php:config/app.php
'EmailTransport' => [
        'default' => [
            'className' => 'Smtp',
            'host'      => 'smtp-relay.gmail.com',
            'port'      => 25,
            'timeout'   => 30
        ],
    ],
```

## ダメな書き方

```php:config/app.php
'EmailTransport' => [
        'default' => [
            'className' => 'Smtp',
            'host'      => 'smtp-relay.gmail.com',
            'port'      => 25,
            'timeout'   => 30,
            'username'  => '',
            'password'  => ''
        ],
    ],
```

# 解説
CakePHP3は```username```と```password```カラムが存在すると、
LOGIN AUTHコマンドをSMTPサーバに送信します（ver 3.1.5まで確認済み）。
_https://github.com/cakephp/cakephp/blob/master/src/Mailer/Transport/SmtpTransport.php_

そのため認証不要である```smtp-relay.gmail.com```が落ち、
Mailオブジェクトが```Cake\Network\Exception\SocketException```を吐きます。

パスワード認証不要のSMTPサーバに対して接続しようとして失敗する場合に同様の手順が使えるでしょう。
ContorGPSで撮影した動画ファイルからnmeaを取り出す

## 始めに・背景
ContorGPSで撮影した動画ファイルにはnmea形式のGPS情報が埋め込まれていて、通常、それを取り出すにはContor Starytellerを使って動画をインポートする必要があります。

↓動画ファイルに埋め込まれたnmea形式の文字列
![動画ファイルに埋め込まれたnmea](https://qiita-image-store.s3.amazonaws.com/0/29682/9b76465e-58ef-0b51-476a-1b8a30192faa.png)

ところが、OSをWindows10にアップグレードしたところStarytellerがまともに動かなくなってしまいました。

そこで、仕方がないので動画ファイルからnmeaファイルを取りだすプログラムを作成しました。ニッチ過ぎて需要があるかわかりませんがせっかく作ったのでシェアします。そんなに高機能ではないです。

## ソース
```NmeaExporter.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PushbackInputStream;

public class NmeaExporter {

	public static void main(String[] args) throws FileNotFoundException, IOException {
		if (args.length == 0) {
			usage();
			System.exit(1);
		}
		
		try (PushbackInputStream is = new PushbackInputStream(new FileInputStream(args[0]), 256)) {
			export(is);
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private static void export(PushbackInputStream is) throws IOException {
		while (true) {
			byte[] buf = new byte[6];

			// ファイル終端に達したら終了
			int bytes = is.read(buf);
			if (bytes < buf.length) {
				break;
			}

			// 欲しいデータじゃなければスキップ
			if (!equals(buf, "$GPGGA") && !equals(buf, "$GPRMC")) {
				is.unread(buf, 1, buf.length - 1);
				continue;
			}

			// ここまで来ると欲しいデータなので改行文字(\r\n)まで出力
			System.out.print(new String(buf));
			while (true) {
				buf = new byte[2];
				is.read(buf);
				if (equals(buf, "\r\n")) {
					break;
				}
				System.out.print((char) buf[0]);
				is.unread(buf, 1, 1);
			}
			System.out.println("");
		}
	}

	private static boolean equals(byte[] buf, String str) {
		if (buf.length != str.length()) {
			return false;
		}

		for (int i = 0; i < buf.length; i++) {
			if ((char) buf[i] != str.charAt(i)) {
				return false;
			}
		}

		return true;
	}

	private static void usage() {
		System.err.println("ファイルパスを渡してください。");
	}

}
```


## 使い方
ソースをコンパイルして次のコマンドを実行すると。[出力ファイル]で指定したパスにnmeaが出力されます。

```
java NmeaExporter [入力ファイル] > [出力ファイル]
```

## 解説
やっていることはいたってシンプルです。動画ファイルの中から
``$GPGGA``や``$GPRMC``といったnmeaの文字列を探して、見つかれば逐次出力しています。


ちなみに、Storytellerが出力するnmeaファイルの中には``$GPEMT``という謎のレコードが含まれるのですが、動画ファイルの中にそんな文字列は含まれていません。そもそもnmeaの仕様にすらないようなので無視しちゃいました。

一文字一文字探していくので、大きな動画ファイルからnmeaを取り出すには結構時間がかかります。探索アルゴリズムを工夫すれば(BM法とか)もう少し高速化できそうですが、いずれにせよ計算量はlog(n)なので数倍速くなる程度でしょう。
CakePHP3 の Http Client でオレオレ証明書のサーバにSSL接続

今回は、CakePHP 3 の小ネタになります。

おそらく PHP 5.6 以降の問題になると思うのですが、OpenSSL 関連の仕様変更に伴い少しハマった場合の対処法を紹介しようと思います。

Cake\Network\Http\Client でオレオレ証明書のサーバに接続しようとして以下のエラーが発生してしまいました。

```

Exception: fopen(): Peer certificate CN=`hogehoge' did not match expected CN=`fugafuga' 
fopen(): Failed to enable crypto

```

内部で利用しているストリームラッパーが PHP 5.6 からデフォルトで証明書とホスト名をチェックするようになったようです。
参考：http://php.net/manual/ja/migration56.incompatible.php#migration56.incompatible.peer-verification

そこで、オプションで証明書とホスト名を無視する設定が必要なのですが、Client の内部で使用されている Stream クラスは、ホスト名を無視するための verify_peer_name を渡すことができないようです。

同様の問題が CakePHP 2.x でも起こっていて issue が上がっていましたが、却下されてしまいました。
https://github.com/cakephp/cakephp/issues/7078

サーバーや証明書は、取引先が用意したものなので修正はできません・・・。さて、どうしようかと悩んだのですが、Client に Stream クラスを継承したアダプタをセットすることにしました。

```php:CustomAdapter.php
<?php
use Cake\Network\Http\Adapter\Stream;
use Cake\Network\Http\Request;

class CustomAdapter extends Stream
{
    protected function _buildSslContext(Request $request, $options)
    {
        parent::_buildSslContext($request, $options);

        // 強制的にオプションを設定
        $this->_sslContextOptions['verify_peer'] = false;
        $this->_sslContextOptions['verify_peer_name'] = false;
    }
}

```

使うときは、

```php
// オプション指定
$client = new Client(['adapter' => 'CustomAdapter']);
```
とオプションに指定します。ただし、証明書を無視する設定は、セキュリティ的によろしくないので、このアダプターは開発時のみに使用し、本番には指定しないようにしましょう。

このように、CakePHP のクラスのメソッドやパラメータは、public か protected で定義されているので、困った時は継承して、柔軟に対応することができるます。

コアのソースを追って行けば案外なんとかなって、いいフレームワークですね！
TableauでRedshiftに実行されたクエリを確認する

TableauでRedshiftにつなぎにいっていろいろ確認しているときに、Tableauが発行しているSQLを確認したいときがあります。例えば以下の場合です。

* psqlでRedshiftにつなぎにいくときに、長ったらしい、JOINをかくのが面倒なので、TableauでGUI上で作成してものを流用したい
* Tableauが意図した通りのSQLを発行しているか確認したい

上記のような場合にポイントとなるのは、 **どこでRedshiftは発行したクエリを保持しているのか** と、 **Tableauはどのようにクエリを発行しているか** ということです。

# どこでRedshiftは発行したクエリを保持しているのか

[svl_statementtext](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_SVL_STATEMENTTEXT.html) のテーブルにシステムで実行されたすべての SQL コマンドが入っています。
ただ、このテーブルは長いSQLは200文字で分割されて別々のレコードに格納されているので、文字列を結合する必要があります。

# Tableauはどのようにクエリを発行しているか

Tableauはcursorを発行してクエリを取得しています。例えば、SQL_CUR0x7ffeb2f68c60という名前のカーソルを宣言し、fetch文を発行しレコードを取得しています。以下が例です。

    fetch 1000 in "SQL_CUR0x7ffeb2f68c60"

Cursorは[DECLARE](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/declare.html)で宣言するので、その場所を特定できれば発行しているSELECT文が分かりそうです。

# 結局どのようにすればいい？

以下でいけます。SQL_CUR0x7ffeb2f68c60の部分は適宜、Tableauが発行するクエリをAWSコンソールのGUIから確認すれば出来ます。

    SELECT
        *
    FROM
        (
        SELECT
            DISTINCT
            xid,
            pid,
            starttime,
            LISTAGG(text) WITHIN GROUP (ORDER BY sequence) OVER (PARTITION BY starttime) AS sql_text
        FROM
            svl_statementtext
        GROUP BY
            xid,
            pid,
            starttime,
            sequence,
            text
        ) as t
    WHERE
        sql_text LIKE '%SQL_CUR0x7ffeb2f68c60%' AND sql_text LIKE '%declare%'
スマホを基板操作やロボットにするための準備

基板を触ってみたいけど怖い。ただの文鎮にしそうだ。
そんなあなたに向けて、お手持ちのスマートフォンで出来るものを考えてみます。

まずは、お手持ちのスマートフォンの機種をご確認ください。
# iOSの方
こちら外部の機器をつなげるにはいろいろ厄介ではありますが、可能です。
そう、**イヤホンジャック** があります。
こちらから信号をWebAudioAPIで出し、機器を制御する事が可能です。
お手軽に使うには以下のサーボモーターのセットがおすすめです。
[プチロボ2](http://prod.kyohritsu.com/WR-S2ESi.html)

こちらをイヤホンジャックに刺し、以下のライブラリを使えばJavaScriptだけでサーボモーターを好きな角度で止める事ができます。
https://github.com/wakasamasao/audioServo/

# Androidの方
ご自分の機器がOTG(On The Go)というものに対応してるかどうかで変わります。
このあたりは以下のページをご覧ください。
[USB OTGを知ってますか？　Androidで生かせるクールな5つの使い方](http://www.lifehacker.jp/2015/11/151128_usb_otg5.html)
していなかった場合は上記の [iOSの方] を参考にしてみてください。
OTGに対応していたら複雑な制御ができる基板を利用できます。
以下のページを参考にArduinoをスマホのブラウザから簡単に制御する事ができるようになります。
[超簡単！Arduino UNOをMIDIコントローラーにしよう！](http://qiita.com/tadfmac/items/9136f47ae1eea99a4ef7)

# WindowsPhoneの方
IEしか使えないという所をいろいろ乗り越える必要があります。
Windows10 mobileを持っていないので検証したいのでサンタさん・・ください・・・。

という形で、お手持ちのスマホで、ちょっとだけパーツを買う事で基板操作ができます。
もちろんスマホじゃなく普通のPCでも可能ですが、感動するところとしてはスマホの方がおすすめです。

では、楽しいJavaScriptライフを！
技術英語 > [at the north end of] Strawberry Fields. / dead end / leftmost / at the other end of the spectrum

@ LOE > July 20, 2012
http://loe.org/shows/shows.html?programID=12-P13-00029
> there’s three of them <font color=red>at the north end of</font> Strawberry Fields.

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=dead+end
> dead end
> 1. 〔通りなどの〕行き止まり、袋小路、終端

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/left-most
> leftmost
> いちばん左の

<hr>
関連して思い出したのは

http://ejje.weblio.jp/sentence/content/other+end+of
> at the other end of the spectrum
> 対極にある

「spectrum」は、分光の分野にて可視域の波長(400nmから700nmあたり)の端と端というイメージからきている気がする。
プリズムで分光した時のイメージ。

http://www.chm.davidson.edu/vce/coordchem/color.html
にある上から5つ目の画像。
openFrameworks 0.8.4 / 0.9.0 を El Capitan + Xcode6 / 7 で動かしてみる

#環境
Yosemite / El Capitan
Xcode6 / 7
openFrameworks0.8.4 / 0.9.0
OS X 10.10.sdk / 10.11.sdk 

#Yosemite + Xcode6
このときは、openFrameworks0.8.4も0.9.0も、きちんと動きます。

#El Capitan + Xcode6

YosemiteからEl Capitanにして、
最初に開こうとすると、このようなダイアログが出てきます。
![5c570084-0545-fa4d-4633-65e9145a2c68.png](https://qiita-image-store.s3.amazonaws.com/0/96807/894bc271-a625-f1f8-5a1f-ae57a12ab7c1.png)

Installを選択します。

その後、ファイルを開いてRunすると、そのままビルドが通ります。

#El Capitan + Xcode7
Xcodeを6から7にあげます。

Xcode7をインストールすると、こちらが出てきます。
![2cb577f6-772d-d5f3-1e4b-66c65d3d63e7_のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/96807/38cb0631-4245-5a32-8226-72aadb4e0eda.png)

Agreeを選択します。


まず、openFrameworks0.9.0をビルドしてみると、すんなりとビルドが成功します。

次に、openFrameworks0.8.4をビルドしてみると、失敗します。
以下を参考にいじります。
1.http://qiita.com/totepo18/items/d92de308d027ef86c9aa
2.http://qiita.com/coa00@github/items/c91adb9505e72d057da9
今回は1だけでは成功しなかったので、2もやったところ、成功しました。

ちなみに、Yosemite + Xcode7でも、同じようにしたら成功しました！

#注意
openFrameworks0.8.4で作成したプロジェクトを、そのままopenFrameworks0.9.0へコピーしてビルドすると失敗しました。

![oF_0.9.0_error.png](https://qiita-image-store.s3.amazonaws.com/0/96807/eec084fe-e4e8-b868-e635-30f14d5e6f42.png)

とのことなので、
PROJECTのInfoからDeployment Targetを10.7へ変更します。
![a6952e94-5ebd-7e02-1d5b-2315af43294b.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/2c53b920-2597-b6fc-09b4-b0e90d1717fa.jpeg)


すると、ビルドが成功しました！

#おまけ
KinectもLeapMotionも、このように設定したら、きちんと動きました！よかった！
意外と便利なコンパイル指示子 "@class"

時々、クラスを型として使いたいときがあります。
そんなときに、<b>*<span>@</span>class*</b> (クラスの前方宣言)というコンパイル指示子を使うと
ちょっと嬉しくなります。



普通な感じだと、下記のように該当するクラスをimportして使ってたりしますが

```objc:Example.h
#import "ClassA.h"

@interface Example : NSObject

@property ClassA *classA;

- (void)methodA:(ClassA*)classA;

@end
```



<b>*<span>@</span>class*</b> を使うと、下記のようにちょっとカッコよくなりました。

```objc:Example.h

@class ClassA;

@interface Example : NSObject

@property ClassA *classA;

- (void)methodA:(ClassA*)classA;

@end
```

もちろん "," で複数のクラスを定義することもできます。

```objc
@class ClassA, ClassB, ClassC;
```

##メリット
* 循環参照を防止
* コンパイル速度が向上する
* イケてるエンジニアに見えるかも (笑)

ご存知の通り、hファイルにはクラス名の定義以外に様々な定義が書かれていることがあります。
とくに、hファイルの中で別のhファイルを読み込むようにすると、hファイルを再帰的に、
読み込まなければならないため、コンパイル時の処理が必要以上に重くなることもあります。
また、循環参照の発生を防ぐ有効的な手段とも言えます。
aliasにできないならsub-commandにすれば良い


私事だが、`git status`を`git sta†us`とtypoしてしまうことが稀によくある。
typoしないように治すことは大変そうなので、`git sta†us`が`git status`の動作をするようにしてしまおうと思った。

## Gitのalias

Gitにはコマンドのエイリアスを設定することができる。
(詳しくは[こちら](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)を参照)
例えば

```bash:example-to-set-alias
$ git config --global alias.st status
```

と設定しておくと

```bash:git-st-output
$ git st
On branch master
nothing to commit, working directory clean
```

というように、`git st`で`git status`の動作をするようになる。

#### git configの文字制限
では、冒頭に書いた問題は、`git sta†us`が`git status`の動作をするようにエイリアスの設定をすれば解決するかというと、残念ながらそうはいかない。

`git config`のmanページには次のような記載がある。
> The variable names are case-insensitive, allow only alphanumeric characters and -, and must start with an     alphabetic character.

alias(に限らず、`git config`で設定する変数名)はアルファベット・数字・ハイフンで構成されていなければならない。(そして変数名はアルファベットから始まる必要がある)

つまり、`git sta†us`というエイリアスは設定できない。

## サブコマンドの設定

gitには、ユーザの作成したサブコマンドを実行する機能がある。
詳しくはこちらを参照([How to integrate new subcommands](ftp://www.kernel.org/pub/software/scm/git/docs/v2.4.0/howto/new-command.html))

簡単に説明をすると、PATHの通った場所に git-hoge という実行可能ファイルを作っておけば、

```
$ git hoge
```
で、それが実行されるというもの。

サブコマンドはスクリプトでも良いし、実行可能なバイナリでも良い。
サブコマンド名に使用できる文字はファイルシステム次第。

冒頭の問題解決のために `git-sta†us` というスクリプトを作成した。

```sh:git-sta†us
#!/bin/sh
git status $@
```

実行してみると

```bash:result-output
$ git sta†us          
error: invalid key: pager.sta†us
On branch master
Your branch is behind 'origin/master' by 357 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
nothing to commit, working directory clean
```

このように、(エラーが1行表示されはするが)git statusの動作をする。

なお、git関連コマンドの一覧を表示する `git help -a` で、自作のサブコマンドも表示される。
alias の一覧を表示したい場合は `git config --list | grep '^alias\.'`

## おまけ
`git ls-files` を `git sl-files` とtypoした際に、slが走らないことを寂しいと感じている人は多いと思う。
そこで、git-sl-files というサブコマンドを作ってみた。

#### 作成したスクリプト

```sh:git-sl-files
#!/bin/sh
which sl > /dev/null
if [ $? -eq 0 ]; then
	sl
else
	git clone https://github.com/mtoyoda/sl.git
	cd sl
	make
	./sl
fi
```

#### 動作説明
```bash:flow-chart
+-----------------------+
|    Does sl exist?     | -+
+-----------------------+  |
  |                        |
  | no                     |
  v                        |
+-----------------------+  |
| Clone sl from Github. |  |
+-----------------------+  |
  |                        |
  |                        | yes
  v                        |
+-----------------------+  |
|      Compile sl.      |  |
+-----------------------+  |
  |                        |
  |                        |
  v                        |
+-----------------------+  |
|        Run sl.        | <+
+-----------------------+
```

slがインストールされている場合は、そのslを起動。
インストールされていない場合はGithubからソースコードを取得し、コンパイルした後、実行する。
【厳選】Photoshopを早く操作するために本当に覚えるべきショートカットベスト5

突然だが、あなたは「Photoshopのショートカットが多くて覚えられない」「結局よくつかうショートカットが何だかわからない」と悩んでないだろうか？

実は、Photoshopを触りだした時の私がそうで、沢山あるPhotoshopのショートカットが中々覚えられなかった。
特に、使用頻度が少ないショートカットはすぐに忘れてしまっていた。

本日は、毎日の業務でPhotoshopを触っている私が
「仕事で最も多く使うショートカットを厳選して5つ」ご紹介する。

効率よくPhotoshopを早く操作するための必須といえるショートカットなので
ぜひ覚えてほしい。

それでは、早速見て行こう。

`本記事のショートカットはMacを基準にしているが、Macでのcommandキーはほとんどの場合Windowsのctrlに相当する。今回の記事はcommandで表記している。`

#覚えてほしいショートカットベスト5

##使用頻度【第1位】
**ツール選択のショートカット**
[V]キー(移動ツール)
[T]キー(文字ツール)
[P]キー(ペンツール)
[B]キー(ブラシツール)

これは業務で一番よく使うショートカットである。
このショートカットを覚えて、ツールバーを非表示で触れるくらいになればベストだろう。
ツールバーを非表示にすれば画面も広く使えるし、かなりオススメできるショートカットである。

##使用頻度【第2位】
**オブジェクトのサイズを変更する**
[command] + [T]

これも業務でよく使うショートカットである。

##使用頻度【第3位】
**レイヤーをグループ化**
[command] + [G]

レイヤー整理のためのグループ化は頻繁につかうので、
是非覚えておいてほしい。

##使用頻度【第4位】
**画面表示を100%表示**
[command] + [1]

特に、Webの画面を制作する時は常に100%表示で確認することをオススメする。
全体をみるために引きで見た後、100%表示に戻す時などはこちらのショートカットは頻繁につかう。

##使用頻度【第5位】
**フォントサイズを1ptずつ大きく、または小さくする**
[command] + [Shift] + [<] or [>]

こちらは文字サイズの調整で役立つ。

#まとめ
いかかだっただろうか。
本記事では、毎日Photoshopを触っている私が、
厳選して5つに絞ってご紹介した。

簡単なショートカットだが、本当に毎日使うので
ぜひ覚えてほしいと思う。

もっと便利なショートカットを覚えたいという方は、
こちらの記事もオススメする。

[Photoshopのオリジナルショートカット](http://www.syumpei.com/blog/2013/12/photoshop-shortcut.html)
ebiでORM

ebiはORMとしてDaoモデルが用意されています。ActiveRecordスタイル”ではありませんが”シンプルにデータベースとやり取りすることが出来ます。

最初にモデルを定義します。ここでは libs/model に User.phpモデルを定義してみましょう。

```User.php
<?php
namespace model;

class User extends \ebi\Dao{
	protected $id;
	protected $name;
}
```

Daoモデルにどのテーブルを使用するか指定していないことに注目してください。Daoモデルには少しだけ規約があり、そのうちの一つは「データベース名はモデル名」というものです。単純でしょう！
お好みのデータベース管理ツールを使い、userテーブルに数行のデータをインサートしてください。Daoで取得し、ビューに渡してみましょう。

では、routes.php を開き（または作成し）ルートを定義してください。

```routes.php
<?php
include('ebi.phar');

\ebi\Flow::app([
	'users'=>[
		'action'=>function(){
			$users = \model\User::find_all();
			
			return ['users'=>$users];
		},
		'template'=>'users.html'
	]
]);
```

これは、最初にfind_allメソッドをUserモデルに使用し、userテーブルから全レコードを取得します。
次に取得したレコードを連想配列で名前をつけてreturnします。returnされた連想配列はビュー(tempalte)で使用できる変数となります。


### データの表示

では users をビューで使用してみましょう。

```resources/templates/users.html
<html>
<body>
<table rt:param="{$users}" rt:var="user">
<thead>
<tr>
	<th>id</th>
	<th>name</th>
</tr>
</thead>
<tbody>
<tr>
	<td>{$user.id()}</td>
	<td>{$user.name()}</td>
</tr>
</tbody>
</table>
</body>
</html>

```

echo文はどこかと不思議に思えるでしょう。用意されたTemplateを使えば中括弧で囲んだ変数/メソッドをecho出来ます。
Webブラウザーで routes.php/users へアクセスすればレスポンスとしてユーザー達の名前が表示されます。

> ![スクリーンショット 2015-12-05 5.41.41.png](https://qiita-image-store.s3.amazonaws.com/0/32758/0dc0e097-110e-3562-8cad-ad7585a4bbc7.png)


参考:
https://github.com/tokushima/ebi
http://readouble.com/laravel/4/2/0/ja/quick.html
UE4でのキャラクターのフェードイン・アウトする方法

#概要
UE4でキャラクター（マテリアル）をフェードイン・アウトするプロジェクトを配布しました。
キャラクター死亡時とか演出系で使えるかなと思います。

TopDownテンプレートを使用してます。Versionは4.9.1
「Dynamic Material Instance」を使用しています。
参考公式ドキュメント
https://docs.unrealengine.com/latest/JPN/Engine/Rendering/Materials/MaterialInstances/index.html

#動作画面
https://twitter.com/WassyPg/status/646506564728188941
ツイッターの動画機能なのでそちらをご参照ください。

#解説
下記の画像は、キャラクターブループリントのEventBeginPlayでマテリアルを動的に設定出来るようにする処理（二個設定しているのは、デフォルトキャラクターはマテリアルを2つ設定しているため。胸のエンブレム部分が地味に別マテリアル）

![_EventBeginPlay.png](https://qiita-image-store.s3.amazonaws.com/0/49072/f786d764-aaaa-4109-d891-96fcde799a58.png)

下記の画像は、キャラクターブループリントでキャラクターのメッシュに設定しているマテリアルをフェードイン・アウトしている処理です。


![_FadeInOut.png](https://qiita-image-store.s3.amazonaws.com/0/49072/ab9b5e4e-bb56-0baf-caef-0a6e55ae7094.png)


下記の画像は、キャラクターのメッシュに設定しているマテリアルの画像です
（今回は、簡単にするためにテクスチャは使用してません）


![_Material.png](https://qiita-image-store.s3.amazonaws.com/0/49072/2bd2c562-4463-b700-787a-a36ccdb4ee90.png)


#その他
あと、コントローラーで「マウスホイールでズームイン・ズームアウト」
「キャラクターブループリントでカスタムイベント」を使用しているので、
その点も多少役に立てるかなと思います。

#プロジェクト配布
プロジェクト配布場所：https://github.com/wasman3/UE4DynamicMaterialTestPrj
Download Zipボタンでプロジェクトをダウンロードできます。
スプライト画像とSVGを効率良く書き出し・コーディングするための考察 [書き出し編]


まず素材を書き出すためのツールについて

3つのアイコン素材を以下の3種類の形式で書き出すことを目標にする。

| image | name |
|:-----------:|:------------:|
| ![icon-facebook.png](https://qiita-image-store.s3.amazonaws.com/0/20726/7281ea08-de00-338d-f95b-0ddbdc2fe399.png "icon-facebook.png") | icon-facebook |
| ![icon-twitter.png](https://qiita-image-store.s3.amazonaws.com/0/20726/09d6bdeb-8c36-54ce-1692-eb74abbb2420.png "icon-twitter.png")  | icon-twitter |
| ![icon-github.png](https://qiita-image-store.s3.amazonaws.com/0/20726/691c3ba6-9c21-0a2c-a5fa-18ec05955143.png "icon-github.png") | icon-github |


形式
- 1xサイズ (48px x 48px) のPNG
- 2xサイズ (96px x 96px) のPNG
- 2xサイズのSVG


## PhotoshopのGenerator機能を使った書き出し

[Photoshopのアセット書き出し機能の設定](http://qiita.com/soheikitada/items/d5570e35c6361d59a6e7)で紹介した方法でPNG、SVGを一括で書き出す。

サイズ、形式ごとに書き出し先を初期設定で指定する方法がなさそうだったので今回は、

`2x/icon-facebook.png, 50% 1x/icon-facebook.png, 100% svg/icon-facebook.svg`

というようなレイヤー名で素材ごとに指定。


####メリット

- **任意のフォルダに複数のサイズのPNGとSVGを同時に書き出せる。命名もコントロールできる。**


####デメリット

- Generator機能でSVGを書きだそうとすると、マスクによる矩形領域の指定が正しく認識されない。

*参考: [SVG export doesn't honor bounding box (layer mask) #354](https://github.com/adobe-photoshop/generator-assets/issues/354)*


####まとめ

- 上記デメリットにより、CSS上で個別にアイコンの位置調整をする必要が生じて、コーディング、運用に悪影響である。
- **現状のPhotoshopはコーディング用のSVGを書き出すのには適さないので、PNGのみの書き出しに限定する。**
- **どうしてもSVGを使用したい箇所は、Illustratorで素材作成、書き出し?**
- SVGの自動書き出しはあと半年待ってみる。

あたりが現状の解決策?


## Illusratorのアートボードを使った書き出し

イラレの `ファイル > 書き出し` でアートボードごとにPNGやSVGを書き出す。


####メリット

- **SVGも意図した矩形領域で書き出すことができ、手数は多いがPNG、SVGともに意図した見え方で書き出せた。**


####デメリット

- PNG, SVGは同時に書き出せず、順番に書き出す必要がある。
- ファイル名がaiファイル名に依存する (アートボード名とは連動しない) のでリネームが面倒。
- リサイズ書き出しする機能がないので、1x素材はあとからPhotoshopのバッチ処理で処理。
- **丁寧に作業しないとアートボードの位置やサイズに小数点が入る恐れあり**


####まとめ

- ファイル点数が少ない場合は良いが、たくさんあるときは適さない。
- **ロゴなど要所要所でIllustratorで素材管理・書き出しするのがベター?** 
- なお、書きだされたファイル名に振られる連番は、アートボードの重ね順に依存する。

####課題

**大量のアイコンデータをイラレで作成して、PNG、SVGで書き出し・素材管理したい場合のベストソリューションを知りたい。** → 自分でスクリプト書く?

→ **[12/6追記]** スクリプトを導入して、書き出しが出来ました。
[イラレで作ったアイコンをアートボードごとにSVGで書き出す](http://qiita.com/soheikitada/items/7a707288fa0095cce795)

## Sketchを使った書き出し

Sketchにもスライスを書き出す機能があります。

####メリット

- **複数のサイズ、形式を指定して、一括書き出し可能。**
- たぶんサードパーティのスクリプトでもっと効率化の余地がある。

####デメリット

- サイズ、形式ごとに書き出し場所を変えられない。(suffixと拡張子で区別)
- **[Sketchメインでデザインワークができない欠陥](http://sketchtalk.io/discussion/1544/sketch-3-4-line-height-bug) がある**

####まとめ

あと一息でPhotoshopを捨てて、Sketchに完全移行できる日がくるかもしれない。

## 今回作成したサンプルファイル

https://www.dropbox.com/sh/23ni45bsavkcy12/AADUYcZk5IUZeXOyvcDrqlHma?dl=0

使用アプリ: Photoshop CC 2015, Illustrator CC 2015, Sketch 3.4.2
入力のユレを極力排除するような工夫をしておかないと後々苦労します


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の5日目

5日目にして早くもネタ切れ感半端ない(笑
いろいろ思いつくんだけど、文字に落とし込めない(泣

# 入力のユレを極力排除するような工夫をしておかないと後々苦労します
自分だけが使うデータベースはともかく、いろいろな人が使うデータベースは入力のユレを極力排除するような工夫をしておかないと後々苦労します
検索にひっかからなかったり、集計値がおかしくなったり..
「全置換って機能があるんでしょ」みたいなことを安易に考えているとうっかりやらかしてしまいます

## 入力値の制限
まず思いつくのがこれ
フィールド定義の「入力値の制限」
![151205-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/a50e1fea-a346-d8ab-2d2d-a961bcb7904a.png)
当てはまる条件があってこれで要件を満たせば、一番簡単にできます
「制限値以外の...」で設定しておけば
![151205-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/4c1184df-5c38-bdec-d184-a08e70e66a2d.png)
みたいなこともできるんですが、よく知らない人が使ってると「なんじゃこれ？」ってなることも
[フィールド復帰]は該当するフィールドが選択されるとして[はい]とか[いいえ]ってのは結局なんぞ？
[はい]か[いいえ]で結局次に進めるじゃん(「データの入力時にユーザーによる上書きを許可する」にチェックが入っている場合)みたいなことにも
だったら「データの入力時にユーザーによる上書きを許可する」のチェックを外しておけば完璧
という訳にもいかないようです

## 入れられては困るものを置換、変換する
入れられては困るものは置換、変換してあげればいい
ハイフン(-)は入れない、必ず半角で入力させたい等
この場合フィールド定義の「入力値の自動化」の「計算値」に変換させる計算値を仕込んでおけばやってくれます

[ ホーム > リファレンス > 関数リファレンス > テキスト関数](http://www.filemaker.com/help/13/fmp/ja/html/func_ref3.33.48.html#703686)

- ハイフン(-)は入力させない(ハイフンを空文字に置換する)

```
Substitute ( Self ; "-" ; "" )
```

たまにハイフン(-)の代わりに音引き記号(ｰ)を使ったりする変わり者もいたりするので

```
Substitute ( Self ; [ "-"  ; "" ] ; [ "ｰ"  ; "" ] )
```

みたいにまとめて書いておくこともできます

- 半角文字しか入力させない(入力された数字、アルファベット、記号を半角に変換する)

```
RomanHankaku ( Self )
```

## 入力させない
置換？、変換？、生ぬるいわ
そもそも入力させなければ揺れるはずもない なぜそれが判らん
な御仁にはこれ

```
Filter ( Self ; "123456789-" )
```

※数字123456789とハイフン(-)のみ入力できる

いろいろやっているとFileMakerでもそろそろ簡単な正規表現が使えるといいなぁと思ったりします
[正規表現 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)

## １周回って
なんだかんだで結局これが一番効果的だったりします
![151205-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/907571b2-1b7e-010e-2a3c-0db12f0863e9.png)
Kotlin Extension for Android で View の参照が正しく出来ない場合

Kotlin Extension for Android を使用していると、View の解決がうまく出来ない場合がある。

- In Activity:
  ![unresolved-type.png](https://qiita-image-store.s3.amazonaws.com/0/21297/17ec9ae0-91e6-f491-ab37-b50b0f232b52.png)

- In Fragment:
  ![unresolved-in-fragment.png](https://qiita-image-store.s3.amazonaws.com/0/21297/7e7f2bfa-4d5c-1d74-107f-0c2c625cfb3f.png)

対処
====

Android Studio でコードを開きっぱなしにしたままプロジェクトを閉じ、再度プロジェクトを開いた際に、開きっぱなしにしていたコードに対して起こることがある様子。
プロジェクトを閉じる際はタブを全て閉じ、再度プロジェクトを開いた際に Gradle Sync が走り終えるのを待ってからコードを開くと今のところ防ぐことが出来ている。

発覚と調査
=========

Kotlin Extension for Android は以前からずっと愛用していて、最近は Kotlin Plugin 側にも取り込まれたらしい。ずっと愛用してるんだけどずっと頭を悩ませている問題として、View の参照がうまく出来なくなることがよく起きていた。

プロジェクトのクリーンビルドに始まり、git clean、プロジェクトの再インポート、Android Studio/Kotlin/Extension/Java SDK のバージョン確認、Win/Mac 両環境での違いなどを試して、直る時もあればそうで無い時もあっていまいち再現が取れていなかった。結局うまくいってた時は無意識に上記の操作をしていた時なのでは、という気がしてきている。

調査していた時の内容で、生成されたらしきコードや IDE のバージョン、エラーの SS 等を貼りまくった gist は以下。

https://gist.github.com/0xBADDCAFE/fa32a566f893c4f53e42

ちなみにこの時は Mac で動いていて Windows で起きていたので OS 依存と考えて調査していて書き方が偏向している。Mac は Android Studio を起動しっぱなし、Windows はよく閉じる運用だったので Windows で起きやすかったらしい。
IBM Swift Sandboxを触ってみた

初投稿です。
もっとがっつり書きたかったんだけど、最初なのでシンプルに。

米国時間の2015年12月3日にSwiftがオープンソース化されましたね。

自分は業務上でもアプリ作成でPythonを少し、Node.jsはちょこちょこ、scalaは見よう見まね on Bluemixでやってたりしますが、そのうちSwiftも触ってみたいなと思ってました。

でもどこから始めようかと思っていながら、最近ハマっているApache SparkでTwitterストリームの結果を眺めていたところ、どうも本日ぐらいから以下のサイトに対するつぶやきが挙がってくるようになりました。

IBM Swift Sandbox Beta
http://swiftlang.ng.bluemix.net

以下のIBMさんのdevelopWorksの記事で紹介されていますが、IBM Cloud上(どめいんからみてBluemix)のDockerで動いているとのこと。みんなDocker大好きですね。

Introducing the IBM Swift Sandbox
https://developer.ibm.com/swift/2015/12/03/introducing-the-ibm-swift-sandbox/

実際にちょっと触ってみましたが、Swift初心者がまずはいろんなサンプルをいじってみるのはちょうど良い環境なのかもと印象でした。左上にサンプルが数種類用意されていて、サンプルを選んで真ん中の「RUN」をクリックすると、右側の「RESULT」に実行結果が表示されるシンプルな仕様です。

<img width="1386" alt="スクリーンショット 2015-12-05 3.26.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/c59eae17-29ce-d417-1fe4-08bfc3d71f24.png">

もちろんソースコードはサンプルではなく自分で書いても問題ないみたいです。以下のスクリーンショットを見てもらえればわかるように、printしてるだけだけど特に日本語も化けずに処理できている模様。

<img width="1384" alt="スクリーンショット 2015-12-05 3.39.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/0d2c2633-5d5c-1fbe-f1c9-7c0c615b39bb.png">

手元に実行環境がないときでも好きに試せるのは非常に良いかなと思いました。ただ、Dockerで動いているらしいのだが、肝心のDockerイメージが見当たらず。。まあSwiftのDockerイメージ自体はDockerHubに何個かあるので、いまはそちらを使うか自分で作るしかないってことなのかな。

以上です(_ _)
WebAPIでHTTPステータス200と404、どっちを返せばいいのか迷った話

サブタイトル **~はじめてWebAPIを開発することになった僕が、返すHTTPステータスで迷った話~**

この記事は[株式会社アイスタイルアドベントカレンダー](http://qiita.com/advent-calendar/2015/istyle)の6日目の記事です。

新卒1年目、業務ではWebAPIを開発している@YuyaAboが書きます。

## 迷ったこと

例えば、ブログサービスのAPIがあったとして、こんなシチュエーションを考えてみてください

1. 存在しない記事が指定された `articles/show/987654321`
2. 記事を検索したら無かった `search/articles?id=987654321`
3. あるユーザーの書いた記事は0件だった `articles/list/200`
4. 存在しないユーザーの書いた記事は0件だった `articles/list/123456789`

このとき無知な僕は次のように考えます。

「1の場合、記事がないんだから、HTTPステータスとしては`404 Not Found`を返してあげるのが自然なはずだ！！！」

「2も1と同じように記事がないんだから404だよね」

「3も、ユーザーの書いた記事はなかったんだし、これも404かな・・・」

「4・・・これも3と同じでいいのかな・・・」

## 200と404の意味を考えてみる

まず僕は、HTTPステータスの200と404を理解することから始まります。

HTTPステータスの200と404は、下記の通りRFCで定義されていて、各種HTTPクライアントや実際にAPIを使う開発者は、下記の定義通りの意味で返ってくることを期待して実装を行います。

- 200:OK リクエストが成功
- 404:Not Found 指定したリソースが見つからない

次に、URI（APIエンドポイント）について考えてみます。

## URIの意味を考えてみる

**「URIはリソースを表している」**ということを考えるととてもすっきりします。すると、最初に提示した4つの例は、以下のように考えることができます。

1. 記事ID=987654321という記事が存在しないということは、**`articles/987654321`というリソースが存在しない**わけなので、`404 Not Found`を返してあげる
2. 1と同様に存在しない記事IDが指定されているけど、**search**という単語が使われているようにこのAPIは検索のためのものであり、リソースそのものが存在しない1の場合とは異なるため、`200 OK`を返してあげる
3. 指定したユーザーの書いた記事は0件だったけど、`articles/list/200`というリソース自体は存在するから`200 OK`を返してあげる
4. 存在しないユーザーが指定されているので、1と同様`articles/list/123456789`というリソースが存在しないから`404 Not Found`を返してあげる

（そもそもURIに「search」という単語を使うことについては、URIがリソースであるということを考えると少し特殊な気もしますが、このAPIは検索をするためのものです！ということが分かりやすく伝わるため、TwitterやInstagramのAPIでも「search」という単語が使われています。）

## 例：Twitter REST API

例として、実際に公開されている[Twitter REST API](https://dev.twitter.com/rest/public)を上の4つに当てはめてみると以下のようになります。

1. 指定したツイートを取得する`statuses/show/:id`は存在しないツイートIDを指定すると`404 Not Found`が返る
2. ツイートを検索するAPI`search/tweets`は、検索結果が0件だった場合も`200 OK`が返る
3. 指定したユーザーがいいねしたツイートを取得する`favorites/list`は、指定したユーザーにいいねが一つも無くても`200 OK`が返る
4. 存在しないユーザーを`favorites/list`で指定すると`404 Not Found`が返る

## まとめ

「200と404どっち返せばいいんだ・・・」と迷った場合は、URIはリソースであるということを意識し、さらに**リソースが0件であることと、リソースがそもそも存在しないということを分けて考える**ことが重要だと思います。

そして、そのどちらに当てはまるかを考えると良いのではないでしょうか（0とnullの違いみたいな！）。

## おわりに

今回はHTTPステータスの200と404で迷っていましたが、例えばQiitaのAPIでは、前回から更新されていないことを意味する304が使われていますし、実際にAPIを設計する際にはHTTPステータスについてもっともっと考えなければいけないことがあるでしょう。また外部公開のAPIなのか、内部向けのAPIなのかでも違ってくるはずです。

必要に応じてHTTPボディに適切な情報をくっ付けるなど、クライアント側にとって分かりやすいデータを返してあげることも大切ですね！

以上、読んでいただいてありがとうございました。明日のアイスタイルアドベントカレンダーは、@nirastamoさんです！！！
大好きな言語コミュニティについて書きます

[Geek Woman の Advent Calendar](http://www.adventar.org/calendars/875) 4日目としてこの記事を書いています。
今日は私の大好きな言語コミュニティについて書こうと思います。
私は株式会社ユビレジというiPadをレジにするアプリとそれに伴うサービスを提供する会社で Ruby on Rails のプログラマをしています。
そうです。私の大好きな言語コミュニティというのは Ruby コミュニティのことです。

## Ruby 言語

Rubyという言語は「まつもとゆきひろ」さんが作った言語です。
そうなのです。Ruby は日本人が作った言語なのです。そのおかげで、Rubyのコミッターには日本人が多くRubyのコミュニティに参加するとRuby(自体)の開発者がそのへんにいたりするのです！こんなチャンスは(日本では)他の言語ではめったにありません。

## 私とRubyコミュニティ
私がRubyコミュニティに関わるようになったのは、2007年頃。当時はRuby on Railsが日本でも注目されはじめたころで、私も気になっていてRuby on Rails 東京勉強会などに参加するようになりました。
当時Ruby on Railsは10分でブログをつくる動画とともに驚きをもってエンジニアのあいだで話題になりました。とは言っても実際にどう使っていってよいのか？ベストプラクティスは？という感じて手探りで学んでいく感じでした。それゆえに当時のコミュニティでは活気のある議論がされていたのを覚えています。
そんな感じでRubyやRuby on Railsのコミュニティに参加するようになり、その年の日本Ruby会議2007に参加しました。
このとき私はただ参加するだけではなく、何か手伝えることはないかということで[速報ログ](http://jp.rubyist.net/RubyKaigi2007/Log.html)をお手伝いしました。
このときの経験は今でも私の中で大きなインパクトを持って心のなかに残っています。
とにかく多くの人の熱気。RubyやRuby on Railsの将来に対する期待。そしてこのコミュニティを盛りあげていこうとする人々の真摯な姿勢。そしてRubyへの愛。
愛なんて大げさな言いかたですが、そこにはまさにRubyという言語を中心としたコミュニティへの愛にあふれていました。
コミュニティというのは人間の集合体です。そしてそこに参加する人々にはさまざまな思惑や興味があると思います。
しかしこのときRubyコミュニティはRubyという一つの絆によって強く結びつけられていたように感じられました。

その当時、私はJavaプログラマとして仕事をしていました。Rubyコミュニティから多くの刺激を受けつつもそれを昇華する方法は仕事の中に求められました。
そうして、また、Rubyコミュニティからは逆に遠ざかることになりました。

そして、去年の5月に転職して、今度は仕事でRubyを書くようになりました。
この転職はもちろん2007年頃のあのRubyコミュニティの熱気をいまだ夢みていたため、Rubyを使う仕事を選んだ結果でした。
そして7年ぶりに訪ずれたRubyコミュニティは少し大人になっていて、また新しく参加した人達も多くいて若々しく活発でもありました。
でも、なによりも嬉しかったことは、今でも変らず私を暖く受けいれてくれたことでした。
Rubyのコミュニティは今では沢山ありますが、どのコミュニティも初参加の人でも暖く迎えいれてくれて、素敵な交流ができる場となっています。
その中でも、私が特によく参加しているコミュニティについてすこし書きます。

私が転職するにあたって最初に訪ずれたのは、Asakusa.rbという地域コミュニティでした。
私自身が浅草の近辺に居住しているということもありAsakusa.rbを選んだのですが、主催している松田さんを始め、YARV作者の笹田さんなど錚々たるメンバーがいて、ちょっと怖けづいたもののすぐに馴染むことができました。
それは実を言うと私の他にも女性の参加者がいらしたことも大きいのですが、特にこのあと私が[Rails Girls Tokyo](http://railsgirls.com/tokyo)というイベントのオーガナイザーをやる切っ掛けとなった江森さんとの出会いもありました。
そう、Rails Girlsについてもここで話さなければなりません。Rails Girlsは世界中でおこなわれている、プログラミングをしたこともないような初心者の女性にRailsをつかってプログラミングの楽しさを体験してもらうワークショップです。
江森さんがオーガナイザをした東京でのRails Girls Tokyo 4thから引き継いでRails Girls Tokyo 5thを私がオーガナイズしました。
プログラミングを楽しむたくさんの女性たちの笑顔を見ることができて、ほんとに開催してよかったと思いました。その様子については、[ブログ](http://blog.railsgirls.jp/post/131413988812/rails-girls-tokyo-5th)に書いたのでそちらも見てください。

ほかにもここには書ききれない沢山のコミュニティがあります。私はRubyのコミュニティが好きですが他の言語や技術のコミュニティでもすばらしいコミュニティはたくさんあります。
こうしたコミュニティが私にすばらしい体験をもたらしてくれました。私もいつかそれを他の人に与えられる人間になれるとよいなと思います。

## あとがき
自分の好きなコミュニティについて伝えようと思ったけど、取り留めなくなってしまいました。
もう12/4を過ぎて午前3時ということもあります。美容によろしくないのでそろそろ寝ようと思います。
マルウェアの耐解析機能


最近のマルウェアは普通に耐解析機能をもっているらしい。
日本年金機構でのEmdiviもしかり。

sandboxによる解析を検出したり、OllyDbgやSoftIce, WireSharkなども検出するようだ。
さらに、パックされてるし、一定期間は動作しないなどもあり、そりゃ解析する方も大変だよね。

##どうやって耐解析機能をもたせるんだろう

純粋に技術としての興味です。
何がどうリスクなのか、それはどの程度なのかを正確に把握するには、攻撃手法を知る必要がある。

ググって見つけた[この資料](http://expo.nikkeibp.co.jp/secu-ex/2008/forumpdf/B10.pdf)がちょっと古いけど興味深かった。
(基本、ここではWindowsの話として)

+ APIによるデバッガの検出
>  それようのAPIが用意されているのであれば素直な方法よね。

+ Winでは構造化例外の処理が異なるらしい
>  何が違うんだろう？わからんね。

+ 実行時間計測
>  処理時間が想定より長ければ、デバッグされていると判定。これもわかりやすいけど、いたるところに置かれたら解析は大変そう。

+ デバッガ読み込み妨害
>  そういう手もあるのか。不正なPEにすることで、実行はできるがOllyDbgでは読み込めないとか、かなりトリッキーだな。

+ INT3検出
>  INT3(ソフトウェアブレークポイント)の数を定期的に数えてデバッグを検出するって。これも解析する側にとってはきついね。ブレークポイントかけると、発動しないんだよね、とかなりそう。ハードウェアブレークかければいいのかもだけど。
 
   
などなど。かなり賢い。   

マルウェアは、OSや他のアプリの脆弱性（仕様？）も積極的に使って自分を隠そうとする。今やこんなに高度なことをやってるのね。

おわり。