OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-CS



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

# Objective-CSとは
@e_swickさんが作成しているObjective-C++のスーパーセット言語です。

LogosはperlによるpreprocessによりObjC, ObjC++のコードを生成する手法をとっています。

翻ってObjective-CSはClangに手を入れた（Objective-CS言語としてObjective-Cの特定の記述に対するパーサーの追加とLLVM IR(AST)の生成）clang-objcsがその実体です。
手を加えた部分以外はClangのAST生成をそのまま使用する事でObjective-C, Objective-C++をそのまま利用出来、バックエンドはそのままLLVMを利用する形です。

[Spec](https://github.com/eswick/Objective-CS)の中ではAdding Properties at RuntimeとDirect Instance Variable AccessについてLogosにない機能であると便利なこと間違いないです。

が、まだ[clang-objcs](https://github.com/eswick/clang-objcs)の実装はまだそこまで進んでいません。

# で、どうなの
コンパイラフロントエンドなのでLogos(perl)とくらべると敷居が高いのは間違いないでしょう。コントリビュートは受けにくいと思います。
Clangをforkしている以上ClangはLLVMの(大きな)サブプロジェクトなのでこれからも進化しXcodeと共に配布されていく時に、その進化についていけるのかが問題になってきます。基本はrebaseしていくだけだとは思いますが。

メンテナンスが滞った場合Clangの進化を享受出来なくなっていくリスクと天秤にかけると大分Logosに傾くかと思ってます。
普及させるにはclangのバイナリ配布も必要になると思いますがいまのところない(完成してないからだとは思います)点も現時点では不確定要素です。流石にclangのビルドはめんどそう。

とはいえ、面白い試みではあるので果たして自身に課したSpecを実装しきれるのか、バイナリ配布はあるのかのあたりを見守りたいですね！

明日からは[wa_kinchan](http://qiita.com/wa_kinchan)ですね！楽しみです！
sbtでEclipseプロジェクトとしてインポートする方法。ライブラリソース付き。

いろんなマシンで何度も同じ操作を繰り返している気がするため自分用にメモ。

### 1. sbtをダウンロードする。

 http://www.scala-sbt.org/download.html
 WindowsであってもMSIインストーラ版は使用しない。zip版をダウンロードし展開する。
 (インストーラ版は、C:\Program Files (x86)などのスペース付きフォルダにインストールされてかつ環境変数PATHも自動では設定してくれないため結構不便）


### 2. 展開したsbtにPATHを通す。

MacやLinuxであれば、~/.bash_profileの末尾にでも以下を追記する。
>export PATH={sbtのパス}/bin:$PATH

### 3. ユーザー単位でのsbtの設定

~/.sbt/0.13/plugins/plugins.sbtというファイルを作り以下を記載する。
>addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

最新バージョンがいくつかは、公式のgithubを見る。
https://github.com/typesafehub/sbteclipse

### 4. プロジェクトファイルの生成

sbtで作成されたプロジェクトフォルダ上で以下のコマンドを実行する。
>sbt "eclipse with-source=true"

もろもろダウンロードするためしばらく時間掛かりますが、
ライブラリのソースコードもインポートされた状態のEclipseプロジェクトファイルが生成されます。
BEAR.Resourceとは

#このソフトは何と呼ぶのが適切でしょうか？

[BEAR.Resource](https://github.com/bearsunday/BEAR.Resource)を作った時の話です。最初は**Service layer framework**という名前で呼んでたのですが、**Hypermedia library**と呼ぶようになりました。

しかし、そもそもこれをフレームワークと呼ぶべきなのか？ライブラリと呼ぶべきなのか？そもそもライブラリ、フレームワークはどう区別すべきでしょうか。よく言われる呼ぶ/呼ばれるの区別は適切でしょうか。

[#15 How do we call this software ?](https://github.com/bearsunday/BEAR.Resource/issues/15)とissueを立てて他の人の意見を聞いてみました。

## @lorenzoさんの提案

CakePHP3のコアディベロッパーの@lorenzoさんが提案してくれたのは以下の名前です。

* **Object to ReST Resource framework and Resource linker library**
* **Object ReST-ifier**
* **Stateless PHP objects library**

オブジェクトがRESTのリソースの振る舞いをする**ライブラリ**としての命名です。

「通常のオブジェクト志向のアプローチとは違ったものとして、つまりアプリケーションをビルドするためにオブジェクト間のメッセージプロトコルをリソースとして統一したものにしている」と考えたとすると、という違う観点でも名前を考えてもらいました。

 * **Objects as a service**
 * **ReST protocol interface for any PHP object**
 
この中でピンときたのは**Objects as a service**でした。「サービスとしてオブジェクトを扱う」これが最も本質的なものだと思いました。一方、RESTやリソースという言葉がないのは少し気になりました。

## @nateabeleさんの提案

そしてLithiumフレームワークのリードで、AngularUIの@nateabeleさんは、これは**フレームワーク**とはっきり言います。その理由は it imposes a set of design constraints on end-user code.つまりフレームワークの定義は「**エンドユーザーのコード全体に制約を与えるもの**」と明快です。

* **Hypermedia framework**

「Hypermediaは目的を表し、それはエンドユーザーのコード全体に制約を与える」- これも明快です。

# 決定

そもそも簡単に答えられるような問いではないと思ってたのですがこの二人の答えは流石で、どちらかだけを選ぶのが難しいように思いました。

またソフトウエアは、技術的な観点の他にもユーザーサイドから、またマーケッティングの観点からも違った見方が可能で、それらの多面性を反映した名前にしたいと思いました。そこで二人の提案をそのまま連結しました。

**Hypermedia framework for objects as a service**

「**オブジェクトをサービスとして扱うハイパーメディアフレームワーク**」- BEAR.ResourceはBEAR.Sundayフレームワークの最もコアなコンポーネントです。フレームワークの作り手として長い間活躍している両御大からいただいた名前として誇りを持って名乗っています。
[*Monaca*] Monaca概要

# はじめに
Monacaが便利なので重宝します。

# Monacaとは
ハイブリッドアプリを開発しやすい環境が整っている。
クラウドIDEがあり、インターネットにさえ繋がっていれば環境構築をしなくてもアプリの開発が始められる。
Gitなどでのバージョン管理を行いたい場合はMonaca Localkitなどを使用すればできるが、無料体験のあとは有料となっている。

なにより日本の会社のものなので、ドキュメント等が日本語なのがよい。

# 使用言語・フレームワーク等

* Cordova
* Onsen UI
* Angular JS
* HTML
* JavaScript (jQuery)
* CSS

# 画面
左にツリーがあり、ファイルを開ける。
ファイルを編集して保存すると即座に右のプレビュー画面に反映されるのでデバッグが容易。
![スクリーンショット 2015-12-06 19.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/48912/929d0707-5eff-d5f8-5eac-c25fc000cee4.png)

Cordovaプラグインの追加はコマンドを叩くのではなく、以下のような画面から追加できる。
![スクリーンショット 2015-12-06 19.52.36.png](https://qiita-image-store.s3.amazonaws.com/0/48912/27d8b602-f28a-9db8-a459-a458eac2db3c.png)

Amazon Web Serviceなどの外部サービスとの連携も可能。
![スクリーンショット 2015-12-06 19.54.37.png](https://qiita-image-store.s3.amazonaws.com/0/48912/cb9f02e4-1144-d0c6-bac4-e819484aaae2.png)

# その他
* 無料版ではプロジェクトは３つまで作成可能。
* クラウドIDEではGitなどでバージョン管理はできない。
* チームメンバーとプロジェクトを共有できる。
* 実機でデバッグできる環境も整っている。

# まとめ
保存するとすぐに結果がプレビューに反映されるので便利。
これで遊んでいたらもうこれでしか遊びたくなくなるなりました。
クラウドIDE開いた時とファイルに変更を保存した時にプレビューに反映されるのですが、AngularJSがよくわからなかった時に適当にネットから拾ったコードを貼り付けて保存した結果、プレビュー時にエラーで落ちてIDE動かなくなるのループを起こしたことがあって、あの時はちょっと困りました。
そんなこともありましたがプレビュー便利です。

ただ、バージョン管理をしようと思うとお金がかかるので、社内で採用されることは無いんだろうなぁと。
お金はかけずに利益は得たいのが会社…。便利だけどなぁ。
Spring BootのTomcatのバージョンを調べてみる

最近Spring Bootを始めてちょいちょい気になることが出てくるので備忘として。
Spring BootではTomcatが組み込まれており、いちいちTomcatを入れて設定してうにゃうにゃみたいな作業がないので便利。ただ、そもそもTomcatのバージョンっていくつよ？って気になって調べてみた。

基本的に起動時のコンソールにこんな感じで出力されている(最後の方)。

```コンソールから抜粋
2015-12-07 22:34:57.396  INFO 3276 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.28
```

これはこれでいいのだが、pom.xmlから辿ってみた。

```xml:pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-tomcat</artifactId>
	<scope>provided</scope>
</dependency>
```

バージョンの指定がないから親Pomを見てみる、親Pomはこんな感じで定義されているので、、、

```xml:pom.xml
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>1.3.0.RELEASE</version>
</parent>
```

以下を見に行く。
https://github.com/spring-projects/spring-boot/blob/v1.3.0.M2/spring-boot-starters/spring-boot-starter-parent/pom.xml
orzここでも定義されていない。。。
よく見ると更に親Pomがあるようだから今度はそれを見に行く。
ちなみにこんな感じで指定してあった。

```xml:親pom.xml
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-dependencies</artifactId>
	<version>1.3.0.M2</version>
	<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
```

以下を見に行く。
https://github.com/spring-projects/spring-boot/blob/master/spring-boot-dependencies/pom.xml

すると、、あった！

```xml:おじいちゃんpom.xml
<tomcat.version>8.0.28</tomcat.version>
～
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-core</artifactId>
	<version>${tomcat.version}</version>
</dependency>
```

こんなことしなくてもきっとドキュメントとかに書いてあるのかもしれない。。。
libvmod-headerとlibvmod-cookieのCentOS 7用rpmをcoprでビルド・配布してみた

[nginx.orgのrpmをカスタマイズしてfedora coprでビルド・配布するのを試してみた - Qiita](http://qiita.com/hnakamur/items/336758b1d9564b759d49)に続いて、今日はvarnishのVMODのうち以下の2つのrpmをcoprでビルド・配布してみました。

* [Cookie | Varnish Community](https://www.varnish-cache.org/vmod/cookie)
    * coprプロジェクト: [hnakamur/libvmod-cookie Copr](https://copr.fedoraproject.org/coprs/hnakamur/libvmod-cookie/)
    * githubレポジトリ: [hnakamur/libvmod-cookie-rpm](https://github.com/hnakamur/libvmod-cookie-rpm)
* [Header manipulation | Varnish Community](https://www.varnish-cache.org/vmod/header-manipulation)
    * coprプロジェクト: [hnakamur/libvmod-header Copr](https://copr.fedoraproject.org/coprs/hnakamur/libvmod-header/)
    * githubレポジトリ: [hnakamur/libvmod-header-rpm](https://github.com/hnakamur/libvmod-header-rpm)

varnishはepelのは古いので[Installation on RedHat | Varnish Community](https://www.varnish-cache.org/installation/redhat)から4.1をインストールしておく前提です。

## rpmのインストール方法

今回ビルドしたVMODのインストール方法は以下の通りです。

### libvmod-cookie

```shell-session
sudo curl -sL -o /etc/yum.repos.d/hnakamur-libvmod-cookie.repo https://copr.fedoraproject.org/coprs/hnakamur/libvmod-cookie/repo/epel-7/hnakamur-libvmod-cookie-epel-7.repo
sudo yum install libvmod-cookie
```

### libvmod-header

```shell-session
sudo curl -sL -o /etc/yum.repos.d/hnakamur-libvmod-header.repo https://copr.fedoraproject.org/coprs/hnakamur/libvmod-header/repo/epel-7/hnakamur-libvmod-header-epel-7.repo
sudo yum install libvmod-header
```

## coprでのrpmのビルド・配布について
詳細は[Travis CIとcopr.fedoraproject.orgを使ってrpmをビルド・配布するのを試してみた · hnakamur's blog at github](https://hnakamur.github.io/blog/2015/11/26/use_travis_and_copr_to_build_and_host_rpm/)をご参照ください

### coprでrpmをビルドする際にサードパーティのyumレポジトリに依存させる方法

[Can I depend on other packages, which are not in Fedora/EPEL?](https://fedorahosted.org/copr/wiki/UserDocs#CanIdependonotherpackageswhicharenotinFedoraEPEL)に説明がありました。

以下の2つの方法で設定可能です。

* coprのプロジェクト編集画面でExternal Repositoriesに `https://repo.varnish-cache.org/redhat/varnish-4.1/el7/$basearch` のようなURLを設定する。
* `copr-cli` コマンドの `--repo` オプションで  `https://repo.varnish-cache.org/redhat/varnish-4.1/el7/$basearch` のようなURLを指定する。
    * [copr-cli - man page](https://www.mankier.com/1/copr-cli)

今回は後者の方法で指定しています。
https://github.com/hnakamur/libvmod-cookie-rpm/blob/b23c63b27c720544e90fcbb092dab1ae37c21a42/copr-build.sh#L22

## まとめ
VMODを利用する場合はcoprでrpmにしておくとインストールが楽なのでお勧めです。
Slackで個人アイコンEmojiとSlack Bot Responsesを使って抽選機能を作る

Slackで個人アイコンEmojiとSlack Bot Responsesを使って抽選機能を作ります

## <i class="fa fa-user" style="font-size:1em;"></i> 個人アイコンEmoji
Slackでの個人アイコンEmojiの利用については、まず下記の記事を参照ください。

<i class="fa fa-external-link" style="font-size:1em;"></i> <a href="http://tbpgr.hatenablog.com/entry/2015/12/06/225130" target="_blank">Slackで個人アイコンをEmoji登録するとホクホクできる話 - Tbpgr Blog</a>

## <i class="fa fa-slack" style="font-size:1em;"></i> Slack Bot Responses
Slackでは、Botに対して「A」というメッセージがきたら「B」という発言する、
という設定をプログラム不要で設定できます。

<i class="fa fa-external-link" style="font-size:1em;"></i> <a href="https://get.slack.help/hc/en-us/articles/202026038-Slackbot-your-assistant-notepad-programmable-bot" target="_blank">Slackbot: your assistant, notepad & programmable bot - Slack Help Center</a>

この際に、レスポンス内容を複数設定しておくとその中からランダムでレスポンスすることになります。

## <i class="fa fa-refresh" style="font-size:1em;"></i> 抽選機能の設定
* メニューの**Customize Your Team**
* **Slack bot Responses**のタブを選択
* **Add new response**を選択
* **When someone says**に `抽選` と入力
* **Slackbot responds**に全員分の個人アイコンEmojiを改行区切りで入力

※画像は、仮に個人アイコン以外のものを設定しています。

![icon_response_settings.png](https://qiita-image-store.s3.amazonaws.com/0/43480/42914244-07e3-2838-f27c-c3d989871764.png)

## <i class="fa fa-play-circle" style="font-size:1em;"></i> 試行

![chusen.png](https://qiita-image-store.s3.amazonaws.com/0/43480/4644dc9e-acdb-74d8-cd8b-21148aed90d7.png)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> <a href="https://get.slack.help/hc/en-us/articles/202026038-Slackbot-your-assistant-notepad-programmable-bot" target="_blank">Slackbot: your assistant, notepad & programmable bot - Slack Help Center</a>
* <i class="fa fa-external-link" style="font-size:1em;"></i> <a href="http://tbpgr.hatenablog.com/entry/2015/12/06/225130" target="_blank">Slackで個人アイコンをEmoji登録するとホクホクできる話 - Tbpgr Blog</a>
Universal Links に対応するときに考慮したいこと

この記事は [Wantedly Advent Calendar](http://qiita.com/advent-calendar/2015/wantedly) 7日目の記事です。

旬が過ぎた感がありますが、Universal Links の話です。Wantedly でも対応しました。例えば、メールに含まれる募集リンクをタップするとアプリで募集が開くようになっています。

とりあえず動かすところまでは Apple のドキュメントや[Qiitaの記事](http://qiita.com/mono0926/items/2bf651246714f20df626)を参考にすんなり行ったのですが、そこから先もいくつか難しい点がありました。対処を考えたものは対処方法と一緒に書いておきます。

## TL; DR

- 開くページと開かないページを細かく区別することは現状難しい
- さくっと導入できるかは、ウェブとアプリの機能の違いや、URL構造などによる
- ウェブページが開くところすべてで Universal Links が起動するわけではない

## JSONに記述するパス

どのページをアプリで開くかという話です。

### 基本的な方針

まず、基本方針として以下の二つのどちらかを選ぶことになると思います。

1. 開きたいページだけリストに書く（ホワイトリスト）
2. まず全てを開いて、開けないページだけアプリからSafariに制御を戻す（ブラックリスト）

アプリは機能を削ったものを出しているというような場合、ウェブにはあるけどアプリには対応する画面がないようなページが結構あると思います。その場合は1の方法が良いと思います。

2の場合は渡ってきたURLが開けない場合は、Safariで開くコードを書きます（この時、再び Universal Links が起動して無限ループにならないか、という懸念がありましたが、ならないことを確かめました）。

この場合の挙動ですが、一度アプリに遷移し直後にSafariに遷移するというようなアニメーションになります。iOS9からアプリ間遷移は右からPushされるアニメーションになりましたが、それが連続して起こります（個人的には思ったよりシームレスでした）。

### ホワイトリストの場合

いまのところ表現できるパターンが貧弱（全てにマッチ`*`と一文字マッチ`?`のみ）なので、できないことがあります。URLに特定のパラメータが含まれるかを見ることはできないのと、パスで判定する場合も、次のような場合は難しいです。

- `/companies/123` はアプリで開きたい
- `/companies/123/employees/1` はアプリで開きたくない（開けない）

この場合は、どちらも開かないという判断をするか、一旦 `/companies/*` をアプリで開くようにして、開けない場合は Safari に制御を戻す必要があります。

## Universal Links の起動する文脈

現状、Universal Links の起動する文脈がちょっと分かりにくいという話です。

### Safari での遷移

以下は、基本的には WebView も同じだと思います。

- リンクをタップしたら起動する
  - ただし、同一ドメイン内での遷移では起動しない
- Safari の「戻る」にも同様のトリガーがある（9.1で修正された模様）

また、Facebook でも Twitter でも WebView を最初に開く時点では Universal Links は起動しませんでした。

### ラベルと実装の問題

Universal Links は `openURL:` でも起動しますが、これを呼ぶアクションボタンのラベルが「Safari で開く」だったりすると、Safari で開くと言いつつアプリで開く…ということになります。逆に `openURL:` っぽく見えても違う実装だから起動しない（例：Googleアプリの検索結果）パターンもあります。

## その他

以下は Universal Links をデバッグする上で知っておいた方がいいです。

- [Universal link に潜む罠っぽい iOS9 の仕様 - Qiita](http://qiita.com/takkyun/items/354fa916367e2593601f)

また、Handoff に対応している場合には別の落とし穴があるようなので、読んでおいた方が良さそうです。

- [iOS9 のリリースでクックパッドに起きたこと - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2015/10/21/120000)
read.tableやread.csvで読み込まれるdataframeの列数は最初の5行で決まるらしい

概要 - 列数はどうやって決まっているのか
---

先日研究室でR言語を使っていて、3列のデータを持つCSVから`read.csv`関数でdataframeを作ろうとしたところ**なぜか2列のデータとして認識されてしまう事案が発生**しました。
このCSVの3列目は一部のレコードで存在し、それ以外の行はデータが入っていない(読み込むと`NA`になる)というものです。
例えばこんな感じで、**col3にはデータが入っている行といない行があります**。

```text:test.csv
col1,col2,col3
lorem,10
ipsum,18
dolor,30,true
sit,40
amet,23,false
```

`read.csv("./test.csv", sep=",", header=F)`を実行した結果

|col1|col2|col3|
|:--|:-:|:--|
|lorem|10|NA|
|ipsum|18|NA|
|dolor|30|true|
|sit|40|NA|
|amet|23|false|

ちなみに上記の例ではきちんと3列のデータとして読み込まれました。

また上記と同様のCSVを複数持っていたのですが、**あるCSVでは3列で認識され、あるCSVは2列で認識される**という現象が起きたため「そもそもRのdataframeってどうやって行数判断されてるんだ??」という疑問が生まれたのでした。

結論 - 最初の5行が判断材料
---

`read.csv`(`read.table`でも同様)の[公式リファレンス](https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html)では以下のような説明がされています。

> The number of data columns is determined by looking at the first five lines of input (or the whole input if it has less than five lines), or from the length of `col.names` if it is specified and is longer. This could conceivably be wrong if `fill` or `blank.lines.skip` are true, so specify `col.names` if necessary (as in the ‘Examples’).

翻訳すると
『列数は**入力データの最初の5行(全体が5行未満ならば全ての行)を見て決定される。** もしくは**`col.names` が指定されており、かつそれが最初の5行で決められた列数よりも長ければ、そのcol.namesの長さから決定される。**ただし `fill` または `blank.lines.skip` オプションに`TRUE`が指定された場合はこの限りではないかもしれない。』
となります。

したがって要約すると

* 「`col.names`が指定されていない」 OR 「5行未満」 : **「5行目までの列数」 = 「dataframe全体の列数」**
* 「`col.names`が指定されている」 AND 「5行以上」 : **「`length(col.names)`行目までの列数」 = 「dataframe全体の列数」**

になるそうです。
うーんこれは知らなかった。
つまり冒頭の現象は、**あるCSVでは最初に3列目が現れるのが6行目以降だったので2列と判定され、別のCSVでは5行目までに3列目のデータが現れていたため3列と認識されていた**ようでした。

### 3列として認識される例

```text:3列のデータとして認識される例
col1,col2,col3
lorem,10
ipsum,18
dolor,30,true
sit,40
amet,23,true
consectetur,7,NA
```

`read.table`した結果

|col1|col2|col3|
|---|:-:|---|
|lorem|10|NA|
|ipsum|18|NA|
|dolor|30|true|
|sit|40|NA|
|amet|23|true|
|consectetur|7|NA|

### 2列のデータとして認識される例 (5行目までに3列目が現れない)

```text:2列と認識されてしまう例
lorem,10
ipsum,18
dolor,30
sit,40
amet,23
consectetur,7,true << 6行目以降のため無視される
```

`read.table`した結果

|col1|col2|
|---|:-:|
|lorem|10|
|ipsum|18|
|dolor|30|
|sit|40|
|amet|23|
|consectetur|7|

ここでもし**`col.names`に`c("col1", "col2", "col3")`を指定すれば3列のデータとして認識されます**。

一部データが空の列への対処法 - カンマをつけるか列名をベクトルで指定する
---

また引用したリファレンスにもあったように、一部のデータ(特に最終列)が欠けたデータで正しく列数を認識させる方法は2つあると思います。

1. 最終列が存在しない行では最後にカンマを入れる
1. `col.names`を(列名をベクトルで)指定する

前者の方法を用いる場合は**データ生成元でログの吐き出し方を変えるなどの対処が必要**でしょう。
そのため既存の実装を変更する必要があります。
一方後者の方法はある種の列数指定ですので、冒頭に示したような最後にカンマのないデータに対しても列数を強制的に指定できるという点で有利ですが、**`col.names`の長さ分の行までしか検出されない**のでかなり後方のデータになって初めて現れる場合は前者の方法を使うしかありません。

参考
---

* [Data Input - The R manual DEVELOPMENT Versions (英語版公式リファレンス)](https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html)
* [非公式の日本語訳](http://www.is.titech.ac.jp/~mase/mase/html.jp/temp/read.table.jp.170.html) (ご指摘により翻訳が誤っていたことが判明しましたので本文中からは削除させていただきました)
findとfind_byの小さな違い



百聞は一見に如かず。コードを書きました。

# find
```ruby
[0] pry(main)>User.find(1000)
ActiveRecord::RecordNotFound: Couldn't find User with 'id'=100
```
エラーになる。

# find_by
```ruby
[0] pry(main)>User.find_by(id: 1000)
nil
```
エラーにならないで、nilが返る。


# まとめ
パラメーターなどが、nilになる場合があるときにfind_byを使うとエラーにならずに済みます。
些細ですが、意外と必要になるシチュエーションがあるかもしれません。
ハッカソン初心者による、言いたい放題！

この記事は、[Hackathon Advent Calendar 2015](http://www.adventar.org/calendars/956)の8日目です。
8好きなのでキープできて地味に嬉しい。いえーい。
振り返りと、「こんなハッカソンあったら良いな」について書きます。

# ハッカソン参加振り返り
## 参加履歴
・2015/09/24 アイデアソン体験&ハッカソンLT
　　この体験会がなければきっと、
　　怖くて本ちゃんのハッカソンには参加できてなかった・・
・2015/10/10 NEWS Hack 〜知るのではなく、感じるニュース
　　後述です
・2015/11/07 神戸×チームワークハッカソン
　　「ゲームを通じて神戸市民のチームワークを活性化し、観光客を盛り上げる！」で、
　　最優秀賞いただきました！
　　楽しかったー。。

## NEWS Hackのアイデア
アイデア的に印象に残っているのが、
興味のなかった新聞・ニュースがテーマだったNEWS Hackです。（2択だけど）
新聞読まない・ニュース見ない私でも見たくなる情報って何だろう？を妄想して、
 **「記事のクラウドファンディング」** をアイデアスケッチ。
さらにチームのアイデア、
 **「作った記事を、ファウンダーのみでなくみんなに公開していく」**
を加えたことで、最優秀賞をいただきましたm(__)m
私は新聞はまったく読まないけど本にはかなりの投資するし、
周りの人もFacebookでニュース記事を積極的にシェアしています。
これだけ活発な情報交換が行われる今であれば、
「価値ある情報ならお金を払ってでも知りたい」という人はきっといるはず！という妄想からアイデアを出しました。
記事書く人の中にポスト青木薫さん（サイエンス読み物を魅力的に訳す方）的な方がいらっしゃったら、私はきっとポチる笑。
「でっち上げ記事になったらどうするのか」
「制約がある中で書き手のやる気が損なわれないか」など賛否両論ありましたが、
 **「自分たちで価値ある情報を支えていく」** というコンセプトの可能性に賞をいただきました。
ニュースの発信者が「世間はどんな情報ならお金を払うのか」を知るだけでも、
ネットニュースは変わっていくのではないかと思っています。

# 参加しての結論。人見知りだから、ハッカソン
人見知りでも、おもしろいこと主張できる。
人見知りでも、おもしろい人と話できる。
人見知りでも、おもしろい技術と出会える。
人見知りだからこそ、ハッカソンに行こう。
　※以上、短く書いたけど、ちょう重要。

# こんなハッカソンあったら、また参加したい
まだハッカソンの一部の一部しか見られていないので、
こんなハッカソンがあったら情報ほしいの意味も込めて書いてみます。

## 「デザイン思考」を試してみようハッカソン
「左脳でつくった企画」から「右脳でつくった企画」がヒットするらしい最近、よく目にする「デザイン思考」。
作る→感じる→また作るというプロセスがハッカソンと親和性高いように思うので、
いっそそれをテーマにするハッカソン（もはや勉強会？）があったら参加してみたいです。
アイデア出しはいつも指針があるので困ることはないのですが、
チームビルディングされたあと、どう話を切り出して形にしていくかが未だによくわからず。。
案を出すためのハックは充実していると思うので、
つぎは **案を発展させるためのハック** ができないかと常々思っています。
参考本：[21世紀のビジネスにデザイン思考が必要な理由](http://www.amazon.co.jp/21%E4%B8%96%E7%B4%80%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%81%AB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E6%80%9D%E8%80%83%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E7%90%86%E7%94%B1-%E4%BD%90%E5%AE%97-%E9%82%A6%E5%A8%81/dp/4844374214)

## 遺伝的アルゴリズムにのっとったアイデアソン
遺伝的アルゴリズムといえば、プログラマ界では[これ](http://gigazine.net/news/20150616-mari-o/)が有名らしいです。
・数ある中からスコアの良いやつだけ残す
・ランダム要素を加える
を繰り返して作っては壊し、そこに時々不確定要素を入れる
というのがなんかアイデアソンっぽいと思いました。
2回参加しただけですが、
「アイデア出しが得意な人」と「アイデアを発展させるのが得意な人」がいるかなと思ったので、
全員でアイデアスケッチ→ハイライト法でアイデア絞る＋情熱枠（不確定要素）を取り入れる
というのを2回くらい繰り返したうえでチームビルディングしてみたら
もっと良い案でないかなあという妄想です。
逆に幅がなくておもしろくなくなったりして笑。

## 「１テーマ×１技術」限定のハッカソン
「カフェ×人感センサー」「水産業×LeapMotion」「地方活性化×機械学習」etc..
あえて縛りをきつくすることでプロダクトの「良い」「悪い」
が明確になっておもしろかったりしないかなあ、という妄想。
縛ると競争してる感に煽られて、はらはらどきどきできそう。

# 来年は・・
就活がんばるぞ。（たぶん）
[小ネタ]xxでファイル名のみ検出する

# grepでファイル名のみ検出する
`grep -l [pattern] [ファイル名]`

# gitで変更したファイル名のみ表示する
`git diff  [比較コミット] --name-only`
`git diff  [ブランチ名] --name-only`
音でメッセージを送るアプリを作った話


今年(2015年)の春くらいに、会社の後輩と一緒に作った[Cloudnアプリコンテスト](http://www.cloudn-service.com/cam04-deven/decon/)応募用のAndroidアプリのことを書こうと思う。

だいぶ今更感があるし、弊社の技術戦略なんかともまったく関係がないけれども、
Advent Calendar用のネタが間に合わなかった
せっかく頑張ったので、何か書いておくことにした。

※ソースコードはお見せできる状態でないので公開していません。すみません。

# 経緯

元は後輩2人がコンテストへの応募を企画していたところに僕が割り込み、3人チームになった。
何を作るか相談していたときに後輩のうち一人が「Androidで音声処理をしてみたい」と言ったことから、「Android端末で音を使って通信するアプリ」になった。
（他の案として「いびきを録音するアプリ」があったが、すでに存在したのと面白みを出しづらいので没になった。）

# コンセプト
音で通信するアイデアはもちろんすでにあり、代表的なものに、電話で使われている[DTMF](https://ja.wikipedia.org/wiki/DTMF)があるほか、最近では超音波を使った通信も実用されているらしい。

今回のアプリのアプローチはDTMFに近いが、DTMFよりも「聽いて楽しい」可聴音通信を目指してみた、というのがひとつのテーマとなっている。

# 作ったアプリ

[Melodian](http://a3os.com/melodian/)

Android専用アプリ。以下の機能を持つ。

* メッセージ文字列を「音」に変換し、Android端末のスピーカーから鳴らす
* 鳴らされた「音」をマイクで拾い、元のメッセージ文字列を復元する
* 作った「音」をWebで共有し、同じアプリを持っている人にメッセージを伝える
    * 例: 文字列「ぬるぽ」を共有した例 http://a3os.com/melodian/share.html?melody_code=53,84,70

![Melodian](https://qiita-image-store.s3.amazonaws.com/0/41617/2db318ea-6b74-d788-280f-aed3539af704.png)

# 仕組み
## メッセージを音にする
* 音階の「ドレミファソラシド」の8音のうちいくつかを同時に鳴らし、どれが鳴っているかの組み合わせで情報を表現する。
    * 1信号(一度の発音)で8bitの情報を表現できる。
* 1信号で1文字を転送したかったので、文字の種類を平仮名(+一部の記号)に限定し、1文字を8bit以内で表現できるような対応表を作った。
    * 例
        * 「ぬ」→ ファ+ラ
        * 「る」→ ド+ミ+ファ
        * 「ぽ」→ ファ+ソ+ラ
* 1信号の長さは0.25秒とした。(これ以上短いと復元が不安定になる)
    * つまり、1秒で4信号(=32bit)転送できる。転送効率は32bpsということになる。

## 音からメッセージを復元する
* マイクからの入力音をリアルタイムで[FFT](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B)し続ける[^1]
* 周波数の分布から「ドレミファソラシド」のそれぞれに対応する8つの周波数帯(たとえば、「ラ」なら440±5Hz)の音量を取り出し、閾値を超えていた音の組み合わせから文字を復元する。
    * 例: ド+ミ+ファ → 「る」
* 上記のことを0.25秒おきに繰り返す。

[^1]: Javaの音声処理ライブラリ [TarsosDSP](https://github.com/JorenSix/TarsosDSP)を使用。

## 音を共有する
* 「メッセージを音にする」部分をJavaScriptでも実装
* メッセージ全体をパラメータに含むURLを作成し、それを共有用WebページのJavaScriptで読み取って音を流す仕組み。
* Androidアプリにて上記のURLを生成してTwitterなどへの投稿を促すことで、あたかも音を共有しているように見える。
    * http://a3os.com/melodian/share.html?melody_code=53,84,70

## WebViewを使ったUI
AndroidアプリのUIは素直にJavaで書くかCordovaなどを使うのが一般的だと思うが、今回は[こういう方法](http://akabeko.me/blog/2014/01/android-webview/)を試してみたくなり、

* アプリのUIはすべてHTML+JavaScriptで作って`assets`に入れ、WebViewで表示
* 音声処理部分は、Javaで実装し、`JavaScriptInterface`を使って必要に応じてUIから呼ぶ

という構成にした。(この判断のせいで、後で苦労することになった・・・。)

アプリの中で音をビジュアライズ(音に合わせてシャボン玉のようなものを表示)する部分があるが、ここは[Paper.js](http://paperjs.org/)を使った。

# 振り返り
## がんばった点：信号の切れ目の検出
* どこで文字が変わったかを検出するのが難しい。
    * 同じ文字が連続すると同じ音が連続するので、「音が変わった」という判定基準は駄目。
* 結局、「一定時間同じ音が続いたら信号として検出」のようなロジックを地道に積み重ねることになった。

## 反省すべき点：WebViewの罠
UIにWebViewを使ったことで

* ローカルのURLに対してはクエリパラメータを渡せない
* Androidのマイナーバージョンによって挙動が異なる
* Canvasが遅い

などWebViewの面倒くさい仕様に振り回され、コンテスト申し込みの締め切り直前はデバッグ作業に追われることになってしまった上に、妙にモッサリとしたアプリになってしまった。
WebView+HTMLでUIのコーディング量が減ったかというと全然そんなことは無かったというかむしろJavaScriptとJavaを繋ぐブリッジを書く手間が増えたし、素直にJavaで書けばよかったと思う。

# 最後に

「音を合成/解析する」という方向は、アイデア次第で面白いことができそうなので、今後もたまに手を出していきたい。(音楽情報処理とか)

@社内外のエンジニア各位:
来年もまた似たようなことをするかもしれないので、興味を持たれた方はぜひお声かけください！

---
Jenkinsでログイン設定してログインできなくなった時の対処

# Jenkinsでログイン設定
グローバルセキュリティ設定から
![Jenkinsの管理Jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/25454/58e70afa-2521-c48d-0423-d1f8af188fbd.png)


LDAP設定しーの
![グローバルセキュリティの設定  Jenkins .png](https://qiita-image-store.s3.amazonaws.com/0/25454/5126a502-dd29-3b19-89fc-e67783716024.png)


ログイン済みだけにしーの
![グローバルセキュリティの設定Jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/25454/a2d1684e-3d2e-96e3-ecc1-efc04cc37ac9.png)

# ログインエラー

この状態で、LDAP設定を間違えてるなどでログインエラーになると
グローバルセキュリティ設定自体さわれなくなってしまう
![ログインエラー  Jenkins .png](https://qiita-image-store.s3.amazonaws.com/0/25454/b44873f0-1ae7-807e-527f-1efec7dd51a7.png)

# config.xml をいじってログイン可能にする
https://wiki.jenkins-ci.org/display/JA/Disable+security

```xml
# /var/lib/jenkins/config.xml
<useSecurity>true</useSecurity>
↓
<useSecurity>false</useSecurity>
```

再起動

```
service jenkins restart
```

# コメント

いきなり「ログイン済みユーザに許可」にするんじゃなくて、
「全員に許可」にしておいてログイン確認してから変更しよう
gitのmerge --no-ff のススメ

2015年も終わりになって、gitの基本的な使い方の話に更なる需要があるとは思っていないのですが

本日が私のAdventCalender担当日であることと、本日偶然遭遇したトラブルの都合上、もしかしたらまだ需要が微レ存かもしれないと思い記事を書いていきたいと思います。

# まとめ
```sh
git config --global --add merge.ff false
git config --global --add pull.ff only
```

皆しとくといい。

# git のデフォルト設定はどうなっているか
gitはデフォルトではmergeコマンドを使った際に、mergeコミットを発生させる必要がない場合mergeコミットを発生せずにmergeを行うfast-forwardでのmergeを行うようになっている。
--no-ffというオプションを付けることで意図的にfast-forwardを行わないコミットをすることが出来る。

## どういうトラブルが起こるか
仮にmasterにtopicAブランチをmergeしたとする。

* fast-forwardであるmergeの場合mergeのコミットが発行されないため、masterがその後更新されていった場合にtopicAブランチで行われた作業を参照するのが面倒になる。
* mergeの取り消しを行いたいと思った場合かなり面倒。

###mergeコミットが存在すると？
* mergeコミットのdiffを見るだけでそのブランチで行われた作業を見るのが容易
* mergeコミットを取り消すことでmerge作業自体をなかったことにしたい場合も簡単

##というわけで
**--no-ffでmergeしよう**


作業ブランチの用なブランチ特定の意味を持たない場合は、fast-forwardのmergeでも全く問題ないと思っています。

# 設定に入れて自動化しよう
毎回 --no-ff と付けてmergeするのは面倒だし忘れることもあります。

```sh
git config --global --add merge.ff false
```
を実行することで、デフォルトの設定を書き換え、指定無しでmergeを行った場合に--no-ffのmergeを行うことが出来るようになります。

また、--ffを付けることで意図的にfast forwardなコミットを行うことも可能です。

## mergeだけ自動化した時に起こる問題
* pullを行った時に行われるmergeにも--no-ffが有効になるため、pullを行う度にmergeコミットが発行されてコミットログが荒れる
* Macのbrewの用なgitで管理されているシステムを利用した場合に、mergeコミットを発生させてしまう。

## pull の時は除外しよう
pull の時は--no-ffオプションを使わないようにしましょう

```sh
git config --global --add pull.ff only
```
と実行することで pullの時はfast forwardが可能な時はfast forwardでmergeを行ってくれるようになります。

# 再度まとめ
```sh
git config --global --add merge.ff false
git config --global --add pull.ff only
```

皆しとくといい。
Ext JSのテーマ遍歴

こんにちは、江川です。
ExtJSは早くもバージョン6。

バージョンごとにテーマも大きく変わってきました。
今回はそのテーマの移り変わりを振り返ってみたいと思います。

### Ext JS 3

Classicテーマ

![スクリーンショット 2015-12-07 20.01.13.png](https://qiita-image-store.s3.amazonaws.com/0/20136/38eade6c-2c41-ebdc-3715-48803697aad2.png)

レガシーなExt JS3のテーマ。classicテーマとして以降のExtJSでも使用できます。

### Ext JS 4

Neptuneテーマ

![スクリーンショット 2015-12-07 21.15.30.png](https://qiita-image-store.s3.amazonaws.com/0/20136/74e50120-ef5c-98d4-dd81-8e50140d079d.png)

グラデーションがなくなり、フラットになりました。


### Ext JS 5

Crispテーマ

![スクリーンショット 2015-12-07 22.12.42.png](https://qiita-image-store.s3.amazonaws.com/0/20136/6fa19b0e-8226-5fb4-1b1b-2e5e1bbc64ce.png)

iOSのUIのようなデザイン。ボタンもよりフラットになる。

### Ext JS 6

Tritonテーマ

![スクリーンショット 2015-12-07 21.04.58.png](https://qiita-image-store.s3.amazonaws.com/0/20136/61a3dd23-2d36-9bac-2e20-e15044edf47e.png)

ExtJS6で新たに追加されたテーマです。

<img width="265" alt="スクリーンショット 2015-12-07 22.08.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/20136/788a18af-1f9c-53f4-e2e7-04be98ed91ec.png">

モバイル端末ではこのようなレイアウトになります。

次回は、コンポーネントごとの違いを見てみます。
Perl6 でN進法に変換するワンライナー

こんばんは :whale2: 

[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の7日目ぐらいです。

新人さんに2進法とか16進法のクイズを出したのですが、その答え的なワンライナーです。

## 16進法のFFFFって10進でいくつでしょう

```
$ perl6 -e 'say :16("FFFF")'
65535
```

## 2進法の1010って10進でいくつでしょう

```
$ perl6 -e 'say :2("1010")'
10
```

## 10進法の1000って16進でいくつでしょう

```
$ perl6 -e 'say 1000.fmt("%x");'
3e8
```

### 10進法の8って2進でいくつでしょう

```
$ perl6 -e 'say 8.fmt("%b");'
1000
```

おわりです。

## 参考と注釈

* [Non-decimal radices/Output - Rosetta Code](http://rosettacode.org/wiki/Common_number_base_formatting#Perl_6)
* [Documentation for method fmt](http://doc.perl6.org/routine/fmt)
* [Day 2: The beauty of formatting - Perl 6 Advent Calendar 2009](https://perl6advent.wordpress.com/2009/12/02/day-2-the-beauty-of-formatting/)
RxSwiftでメモリリークを起こさないようにする関数を用意しました。


RxSwiftにおいて、mapやflatMapで処理を繋いでいくと、クロージャが結構な数になると思います。
RxSwiftはしっかりとルールを守ることで、クロージャのキャプチャは解放される設計になっていますが、
様々なケースを考えると`[weak self]`しておくのが、やっぱり安全だったりします。

しかし、毎回weakにするとちょっと面倒ですよね。。
以下のようなコードはよくあると思います。

```swift

create { observer in

    return NopDisposable.instance
}
.map {
    self.~~
}
.map {...}
.map {...}

```

これをmapの中でweakにすると以下のようになります。

```swift

create { observer in

    return NopDisposable.instance
}
.map { [weak self] in
    guard _self = self else {
        throw <# ErrorType #>
    }
    _self.~~
}
.map {...}

```

これで全然良いのですが、
毎回書くのはちょっと面倒なので、
以下のグローバル関数を用意しました。
objが取得できなければthrowするというコードです。

```
extension String: ErrorType {

}

func strong<T>(obj: T?) throws -> T {
    
    guard let obj = obj else {
        
        throw "deallocated"
    }
    
    return obj
}
```

これを利用することで、

```swift

create { observer in

    return NopDisposable.instance
}
.map { [weak self] in
    try strong(self).~~
}
.map {...}
```

という感じで短く書けるようになりました。


毎回これを必ず使用するというわけではありませんが、
selfのキャプチャが多く、心配なときに利用していこうと思っています。
チームでの開発においては、`基本にweakにする`とかルールを決めてしまったほうが、
考えるコストを削減出来るメリットもありそうです。


以上、RxSwiftというよりかは、Swiftのクロージャについてのtipsでした。


ちょっとした宣伝ですが、
Filという写真編集アプリを開発しています。
是非使ってみてください😇

[Fil - App Store- ](http://apple.co/1RphFKD )
underscoreコードリーディング（filter）

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



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


##filterとは


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

こんな説明。
>####_.filter(list, predicate, [context]) Alias: select 
Looks through each value in the list, returning an array of all the values that pass a truth test (predicate).

```javascript
var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
```

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

selectにエイリアスが張られている。
listのすべての値に対してテストをし、そのテストを通ったもので形成されたArrayを返します。

[Array.prototype.filter](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)も存在する（IE9以上で利用可なので、IE8サポートの場合などはまだこっちを使うといいかも。）

###[underscore.filter](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L223)
コード的にはこのあたり。

```javascript
_.filter = _.select = function(obj, predicate, context) {
  var results = [];
  predicate = cb(predicate, context);
  _.each(obj, function(value, index, list) {
    if (predicate(value, index, list)) results.push(value);
  });
  return results;
};

```

返り値用のArray resultsを作成。
処理自体は_.each(_.forEach)に処理を任せていて、_.eachで処理をする中で条件に引っかかったものに関してだけresultsに値をpushしている。

その結果を最終的にreturnしている

_.eachを内部で実行しているので、_.filterもArray/objectの両方で利用できる。

object(連想配列)で_.filterを実行した場合は、valueが **Array** で返ってくるので、その点だけ注意。

こんな感じ

```javascript:filter.js
'use strict';
var _ = require( "underscore" );

var arr = { "a": 1, "b": 2, "c": 3 };

var hoge = _.filter( arr, function( num, key ) {
    return num >= 2;
});

console.log( hoge );
```

```bash:shell
$ node filter.js
[ 2, 3 ]
```
Scss(Sass)でretinaで綺麗な1pxの線を引く


<img src="https://qiita-image-store.s3.amazonaws.com/0/47955/2e1dd22d-ec6c-2baf-b278-5f1e62daddee.png" width="800px" />


かなり前に、[Retina Display向け.5pxのborderまとめ](http://qiita.com/tyshgc/items/7d130a87938ff26228d3)という記事を書きましたが、Desktop版も含めると色々綺麗なborderにならなかったりします。

そこで、別の方法でできないかと調べたところ以下の方法で実現が可能らしいということがわかりました。

- Svg, Gifを使う
- transform: scale()を使う

というわけで、mixinつくってみました。IE/Android Browserは見てないです。
それ以外はだいたい大丈夫でわと（テキトー…）。
というわけでとりあえずSass(Scss)版。そのうちStylus版くらい用意するかも。

```
/**
 * # retinaで綺麗な1pxのborderを敷くmixin
 * @color: hex, rgb(a)/ default #000
 * @direction: top,left,right,bottom/ default 'top'
 * @pseudo: before,after/ default 'before'
 */

@import 'media-retina';

@mixin border-hairline(
  $color: "#000",
  $direction: 'top',
  $pseudo: 'before'
){
  $background-svg: repeat-x top left url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='.5' height='.5'><rect fill='#{$color}' x='0' y='0' width='.5' height='.5'/></svg>");

  position: relative;

  // default: not retina
  &:#{$pseudo} {
    content: ' ';
    position: absolute;

    @if($direction == 'top') {
      top: 0;
      left: 0;
    }
    @if($direction == 'bottom') {
      bottom: 0;
      left: 0;
    }
    @if($direction == 'left') {
      top: 0;
      left: 0;
    }
    @if($direction == 'right') {
      top: 0;
      right: 0;
    }
    @if($direction == 'top' or $direction == 'bottom') {
      background: $background-svg;
      height: 1px;
      width: 100%;
    }
    @else {
      background: $background-svg;
      background-repeat: repeat-y;
      height: 100%;
      width: 1px;
    }
  }

  @include media-retina {
    &:#{$pseudo} {
      @if($direction == 'top') {
        transform: scaleY(.5);
      }
      @if($direction == 'left') {
        transform: scaleX(.5);
      }
      @if($direction == 'bottom') {
        transform: scaleY(.5) translateY(.5px);
      }
      @if($direction == 'right') {
        transform: scaleX(.5) translateX(.5px);
      }
    }
  }
}
```

ちなみに、ググったらretinaの1pxってhairlineって言うっぽいです。
Tomcatの管理ツールProbeについて

# 概要

PSI Probeは、オープンソース(GPLv2)のTomcat管理ツールです。以前はLambda Probeとして開発されていたソフトウェアのコミュニティ主導のフォークです。Tomcatインスタンスの管理・監視を簡単にし、Tomcatマネージャを置き換え、拡張する意図で開発されているようです。

![Screenshot-Probe - JVM memory usage - Mozilla Firefox.png](https://qiita-image-store.s3.amazonaws.com/0/43869/07b22f31-0a25-57e9-6a7c-0640851da014.png)

他の多くのサーバ監視ツールとは異なり、PSI Probeは、既存のアプリケーションを変更する必要がありません。以下からダウンロードして、デプロイするだけで全ての機能の利用できます。

https://github.com/psi-probe/psi-probe/releases

# 機能

主な機能は次のとおりです。

* リクエスト：アプリケーション毎に、リアルタイムにトラフィックの監視。
* セッション：属性の閲覧/検索、IPアドレス、有効期限、見積もりサイズの表示。
* JSP：閲覧、ソースの表示、コンパイル。
* データソース：プールの使用量の表示、クエリの実行。
* ログ：ログの内容表示、ダウンロード、実行中のログレベル変更。
* スレッド：実行スタックの表示、スレッドの停止。
* コネクタ：ステータス、使用状況、グラフの表示。
* クラスター：ステータス、使用状況、グラフの表示。
* JVM：メモリ使用量のグラフの表示、GCへのアドバイス
* Javaサービス・ラッパー：JVMの再起動。
* システム：CPU、メモリ、スワップファイルの使用状況の表示。

# インストール
## 管理ユーザーの追加

$CATALINA_HOME/conf/tomcat-users.xmlの<tomcat-users>タグの中に以下を追記します。

```bash
  <role rolename="probeuser" />
  <role rolename="poweruser" />
  <role rolename="poweruserplus" />
  <role rolename="manager-gui" />
  <user username="admin" password="password" roles="manager-gui" />
```
## JMXの有効化

PSI Probeは、メモリ使用量、コネクションプール、アクティブなスレッドなどの情報を収集、表示するために、リモートJMXが必要です。次のJVMオプションを使用して、リモートJMXを有効にすることができます。

```bash
-Dcom.sun.management.jmxremote=true
```
## Probeのダウンロードとデプロイ
GitHubからProbeの圧縮ファイルをダウンロードして、解凍後作成されたwarファイルをTomcatにデプロイします。

```bash
wget https://github.com/psi-probe/psi-probe/releases/download/2.4.0/probe-2.4.0.zip
unzip probe-2.4.0.zip
cp probe.war /usr/share/tomcat6/webapps/
```
# 動作確認
次のURLにアクセスすると、IDとパスワードの入力を求められるので、先ほど作成したadminユーザーでログインします。
http://localhost:8080/probe/

ログインが完了すると、以下のような画面が表示されます。

![Screenshot-Probe - Installed applications - Mozilla Firefox.png](https://qiita-image-store.s3.amazonaws.com/0/43869/995a8cd0-6b7e-6c3f-1be8-60175d65de57.png)

# 参考
PSI Probe - GitHub
https://github.com/psi-probe/psi-probe
怠惰に動かそう

アドベントカレンダーが空いていたので、なんとなく投下してみます。

# プログラマの3大美徳
Perlの作者であるラリー・ウォール氏は、こんな言葉を残しています。

> プログラマの3大美徳は、怠惰・短気・傲慢である。

ただし、この3つは、どれも通常の意味ではありません。今回は、この「怠惰」を掘り下げてみます。

# 極論: プログラムは正しく動けばいい
実用品としてプログラムを書く場合[^1]、そのプログラムの価値は、作るのにかかった時間やコードの分量に比例するものではありません。例えば、仮にある人が2ヶ月かけて、Windowsのメモ帳と全く同じ動作をするプログラムを書き上げたとしましょう。きちんとできあがったとしても、Windows環境下では「すでにメモ帳がある」ということになってしまって、あまり意味がありません。

プログラムは（多くの場合）実用品です。内部の処理がどうとかどんなツールを使ったかとか、そういうことは内輪受けこそするかもしれませんが、その選択で高速化した、あるいは多様な環境に対応できたなどの**結果**となって初めて、エンドユーザーへの価値を持ちます。

逆に同じ動作が得られるのであれば、何から何までコードを書いて作ったものも、既存のフレームワークに乗っかって手軽に作ったものも、まったく同等のものとなります。「がむしゃらに作る」ことは、むしろ報われない世界です。

# 巨人の肩の上に立つ
多くの分野で、既存のライブラリが多数存在しています。これらを十全に活用することで、

* 同じことを書かずに済むので、開発が速く進む
* UIまわりで既存ライブラリを使うことで、他のものとUIを統一化できる
* ライブラリ側のアップデートで、高速化や機能向上することもある

などのメリットがあります。逆に、既存のもので実現できることを自分で書いても時間の浪費になるだけで、新たな価値には繋がらない作業でしかないものです[^2]。

# コピペする、その状況に
1つのプロジェクト内で、ソースコードをコピペすることがあるかもしれません。それにはいろんな状況があるかと思います。

* 別なものを作るひな形にするために、古いところからコピペする
* 同じ処理が違うところに出てきたのでコピペ

前者の場合、そのパターンをあまりによく使うのであれば、どこかでくくりだして共通処理とすることで、いちいちコピペしなくても同じ物を作れるようになります。

後半についてですが、プログラムは作る時より、保守するときのほうが圧倒的に手数がかかるものです。コピペで作った場合、その箇所を**すべて**修正しなければいけないという、大きな手間を残してしまうことになります。同じ処理をまとめておけば、修正の時も1箇所で済みます。

一方で、YAGNI（You ain't gonna need it）という言葉もあります。いたずらに汎用化を志向しても、無駄な工数になってしまう可能性が大きいものです。汎用のライブラリ自体を作る状況でなければ、実際に必要になってから共通化していったほうがいいでしょう。

# 結論
手を抜けるようにするための手間は惜しまないほうが、いいかも。

[^1]: 趣味で書く場合、「あえて妙な環境や条件でプログラムを書く」など、「プログラムを書くこと自体が1つの目的となる」ことも多いですが、そういう場合は置いておきます。
[^2]: むろんこれも、あくまで「実用品としてのプログラムを作る」という状況下の話であり、学習や趣味として既存のものを再現することは、むしろやるべきことです。
form_helpeがparent_builderを返さなくなった

```
2015/11/23 14:31:33 [INFO] ::   Rendered vpcs/_show.html.erb (90842.4ms)
2015/11/23 14:31:34 [ERROR] :: ref:[9a0-70b4] type:[APPLICATION_ERROR] ご迷惑をおかけいたします。
エラーが発生しました。, undefined local variable or method `parent_builder' for #
2015/11/20 10:31:05 [INFO] ::
        /poge/hoge/workspace/version/app/pogeapl/app/helpers/common_form_builder.rb:350:in `edit_hoge?'        /poge/hoge/workspace/version/app/pogeapl/app/helpers/common_form_builder.rb:259:in `editable_text_frame'
        /poge/hoge/workspace/version/app/pogeapl/app/views/vpcs/_detail_fields.html.erb:30:in `block (2 levels) in _app_views_vpcs__detail_fields_html_erb___2935103686744868076_70167887423400'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0rails/gems/actionpack-4.0.13/lib/action_view/helpers/capture_helper.rb:38:in `block in capture'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0rails/gems/actionpack-4.0.13/lib/action_view/helpers/capture_helper.rb:200:in `with_output_buffer'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0rails/gems/actionpack-4.0.13/lib/action_view/helpers/capture_helper.rb:38:in `capture'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0rails/gems/actionpack-4.0.13/lib/action_view/helpers/form_helper.rb:435:in `form_for'
        /poge/hoge/workspace/version/app/pogeapl/app/views/vpcs/_detail_fields.html.erb:9:in `block in _app_views_fields_html_erb___2935103686744868076_70167887423400'
        /poge/hoge/workspace/version/app/pogeapl/app/helpers/application_helper.rb:1638:in `block (3 levels) in widget_box_frame'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0rails/gems/actionpack-4.0.13/lib/action_view/helpers/capture_helper.rb:38:in `block in capture'
```
- parent_builderを返さなくなった？ [objectのみで判定する](https://github.com/rails/rails/blob/v4.0.13/actionpack/lib/action_view/helpers/form_helper.rb)

```
   def edit_hoge?
-    obj = (parent_builder ? parent_builder.object : object )
-    obj.errors.any?
+    object.errors.any?
   end
```

- objectで直接判定すると判定できる
Capistrano で Rails アプリケーションのデプロイをした時に起きたエラー

デプロイスクリプトを走らせたときに起きたエラー

## 「rbenv version 2.2 1 is not installed」
`config/deploy.rb`にバージョン指定を書くことで解決

```
set :rbenv_ruby, '2.2.3'
```

## 「rbenv: version `2.2.3' is not installed (set by RBENV_VERSION environment variable)」
`config/deploy.rb`にrbenvのパスを書くことで解決

```
set :rbenv_path, '/home/your/.rbenv/'
```

## 参考
- [Capistrano Reference](https://github.com/capistrano/rbenv/)
How to install py3exiv2

##boost
wget 'http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.bz2?r=http%3A%2F%2Fwww.boost.org%2Fusers%2Fhistory%2Fversion_1_59_0.html&ts=1449484215&use_mirror=jaist'
tar --bzip2 -xf boost_1_59_0.tar.bz2
cd boost_1_59_0
./bootstrap.sh --with-libraries=python --with-python=python3 --with-python-version=3.4
sudo ./b2 install include="$VIRTUAL_ENV/include/python3.4m"

##exiv2
wget ftp://rpmfind.net/linux/fedora/linux/development/rawhide/source/SRPMS/e/exiv2-0.25-1.fc23.src.rpm
sudo yum install graphviz
rpmbuild --rebuild exiv2-0.25-1.fc23.src.rpm
sudo rpm -i rpmbuild/RPMS/x86_64/exiv2-{0*,d*,l*}

##pip
pip install py3exiv2
export LD_LIBRARY_PATH=/usr/local/lib/

##python
import pyexiv2
data = pyexiv2.metadata.ImageMetadata('1.jpg')
data.read()
data['Iptc.Application2.Caption'].value
必要なアイコンだけSVGで用意して使う

# 動機
Webでよく使うアイコンはせいぜい数種類なのに、Font AwesomeやMaterial Design Iconsなどの「どんどん増えていくWebフォント」を使うのはどうなんだろうと思い、ためしにReactを使ってSVGのアイコンセットのようなものを作ってみました。
結果、アイコンが表示されるまでのラグもなく、タイプ数も若干減らせそうでいい感じです。

# デモ
[jsfiddleにデモ](https://jsfiddle.net/momunchu/mk0p05cp/)を準備しました。（デモは仕方なくJavaScript1.7です）
アイコンは[Material Design Icons](https://materialdesignicons.com/)のSVGを使っています。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/24284/7e390c8a-1135-c0ee-2cef-7cd9041c1a7b.png)


# 実用的な使い方
下記のようにモジュールに分け、browserifyとbabelifyを使うのが便利だと思います。

```js:icon.js
import React from 'react';

const Icon = (props) => (
  <svg style={{width: '24px', height: '24px', verticalAlign: 'bottom'}} viewBox="0 0 24 24">
    <path fill={props.color || "#000000"} d={props.d} />
  </svg>
);

export const Image = (props) => (
  <Icon {...props} d="M8.5,13.5L11,16.5L14.5,12L19,18H5M21,19V5C21,3.89 20.1,3 19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19Z" />
);

export const Heart = (props) => (
  <Icon {...props} d="M12,21.35L10.55,20.03C5.4,15.36 2,12.27 2,8.5C2,5.41 4.42,3 7.5,3C9.24,3 10.91,3.81 12,5.08C13.09,3.81 14.76,3 16.5,3C19.58,3 22,5.41 22,8.5C22,12.27 18.6,15.36 13.45,20.03L12,21.35Z" />
);

export const Ban = (props) => (
  <svg style={{width: '24px', height: '24px', verticalAlign: 'bottom'}} viewBox="0 0 24 24">
    <path fill={props.color || "#000000"} d="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z" />
    <path fill={props.color || "#ff0000"} d="M12,0A12,12 0 0,1 24,12A12,12 0 0,1 12,24A12,12 0 0,1 0,12A12,12 0 0,1 12,0M12,2A10,10 0 0,0 2,12C2,14.4 2.85,16.6 4.26,18.33L18.33,4.26C16.6,2.85 14.4,2 12,2M12,22A10,10 0 0,0 22,12C22,9.6 21.15,7.4 19.74,5.67L5.67,19.74C7.4,21.15 9.6,22 12,22Z" />
  </svg>
);
```

Iconを使うところは、下記のようなイメージです。（Bootstrap4を使っています）

```js:script.js
import React from 'react';
import ReactDOM from 'react-dom';

import * as Icon from './icon';

const MdiButtons = React.createClass({
  render() {
    return (
      <div>
        <button type="button" className="btn btn-link"><Icon.Image /></button>
        <button type="button" className="btn btn-link"><Icon.Heart color="pink" /></button>
        <button type="button" className="btn btn-danger-outline"><Icon.Ban /> Ban</button>
      </div>
    );
  }
});

ReactDOM.render(<MdiButtons />, document.getElementById('container'));
```

```html:参考html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <link rel="stylesheet" href="https://cdn.rawgit.com/twbs/bootstrap/v4-dev/dist/css/bootstrap.css">
  </head>
  <body>
    <div id="container"></div>
    <script src="bundle.js"></script>
  </body>
</html>
```

下記は、browserifyでbundle.jsを準備する例です。
`$ browserify script.js -o bundle.js -t [ babelify --presets [ es2015 react ] ]`

（gulp等を使う方がもっと実用的です。）

# おわりに
もともと用意されている「使い方」とは外れてしまうため、管理面等でリファレンスを作るといった手間が増えてしまうかもしれません。
ただ、それを上回るメリット、例えば本記事のような「アイコンのスタック」がしやすいなどのカスタマイズ性が魅力で、もう少しコードを洗練すれば、もっと便利になるんじゃないかと考えています。
また、変にCSSを汚染しない点も気に入っています。
レスキューダイビング的にサポートを考えてみた

サポートの中の人です。

スクーバダイビングの「レスキュー」スキルと、サポート運営が似ているなーと思ったので書き綴ってみます。
※担当日を勘違いしていて、連続投稿途切れるところでした。
## はじめにスクーバダイビングの「レスキュー」スキルとは
ダイビングは(時間と少しの銭があれば)手軽に始めることができます。
しかし、遊ぶフィールドは自然の中なので、人間ではどうにもこうにもできない場合があります。
たとえば、急に潮の流れが変わり海底に引き込まれたり、猛毒を持つ生物に刺されたりする可能性があります。

また、人間は水中で息をすることができない生物です。
このため、器具を使って水中で呼吸できるようにしていますが、メンテナンス不足や外的要因により
正常に動作しない場合があります。

これらのように、(ちょっとした)トラブルで心理的ストレスを受けると正常な判断ができなくなり、
安全に海面にあがることができず、後遺症をもたらしたり、まれに死ぬ可能性があります。

そのようなことにならないため、より安全に、より楽しく遊ぶために、
各ダイビング団体では「レスキュー」というレベルを設けて、スキルを身につけられるようにしています。

ここでは、この「レスキュー」のスキルを通して、サポート運営を考えてみた話をします。

## 「レスキュー」レベルに求められるもの
あるレジャーダイビング団体では、「レスキュー」レベルに以下のスキルを求めています。

1. 自分自身の安全性確保
2. 他のダイバーを気遣う意識
3. トラブルを未然に防ぐ能力
4. 負傷したダイバーの救助
5. 緊急時の応急処置
6. 水中捜索方法

この中から、3、4、5 をサポート運営に置き換えてみます。
1、2 は社会生活の基本なので特に取り上げません。6 は調査方法に相当し範囲が広くなるので別の機会に…

### 「トラブルを未然に防ぐ能力」

ダイビングでの「トラブルを未然に防ぐ能力」として、身体に異常が発生した場合の対処方法や、
機器トラブルの際のダイビングスキル、レスキュー時の手順書作成と運用があげられます。

サポート運営的な視点では、ひっくるめて対応手順の作成、運用ですね。
サポート対応をおこなっていると、手順書なしでもトラブル対応できるようになります。
しかし、外的要因により正常な判断をすることが難しくなる場合や、
病気や天候などで業務を継続することが難しくなる場合があります。

　*たとえば、外部から「あーだこーだ」とステータス異常の呪文を唱えられ思考低下、
　キャラクター特性として、あたふたくるくる踊り出すなど、ありますよね。
　鉄柱が線路に横たわる、線路の下にあるべき土石が流されて電車動かないとかとか。*

そのような場合、手順書を用意しておけば抜け漏れを防ぎ、引き継ぎすることができるようになります。

また、手順書を公開しておくと、「同時に多数の質問が入ってきて物理的に対応することが困難な場合」などに
手順書を案内して、**切り分けしてね**と(やさしく)回答することができます。

さらに、自己解決してもらう方が、サポートとのやりとりが発生しないため、
結果として問題解決にかかる時間が短くなることが多いです。
このため、弊社ではサポートサイトにチェックリストや FAQ を公開し
できるだけ早期に対応できるようにしております。

もちろん、回答時に抜け漏れがないかのチェックにも使っています。

### 「負傷したダイバーの救助」
では、実際にトラブルが発生した場合の「負傷したダイバーの救助」です。
ダイビングでは、海峡や負傷具合などを観察して情報を集め、最適な手段を検討し救助します。
間違った手段を使うと、負傷したダイバーに後遺症をもたらす可能性、自分も負傷する可能性、
最悪全滅の可能性があります。

サポート的視点では、業務への影響を極力小さくするために、必要な情報を最小のコストで収集して、
最適な手段をとることです。
ダイビングと同じく、情報が重要です。特に、事実が重要です。
推測や憶測、根拠のない確信などは極力排除します。
その上で、仕様をもとに仮定し、再現確認をおこない回答します。

情報量が少ない場合、仮定そのものが難しくなり再現確認の数が増えるため対応に時間がかかります。

サポート運営としては、必要な情報を最小コストでご連絡いただくために、
問い合わせフォームを工夫し、チェックリスト、FAQ を増やす施策をとっています。

### 「緊急時の応急処置」
それでもダイビングでトラブルが発生した場合には、やれることは少ないです。
過去事例をもとに、生存率が高い方法をとる。シンプルですね。

一方サポートでは、生死を分けるようなトラブルはないので、業務を行える状態にする方法を案内します。
たとえば、設定誤りによって発生しているなら設定方法を、
データ依存で発生しているならデータの修正や分割を案内しています。
それでも、どうにもならない場合は、運用で対応してもらう方法を案内します。

問題点は何か、切り分けが済んでいれば、回答までの時間は短くなります。

### まとめ
・ダイビングとサポートを絡めて書いたらカオスになった


・事前準備や問題解決手順の共有をすることで、初動を早めることが期待できます。
・情報は吟味する必要があります。不確定情報が多ければ多いほど調査に時間がかかります。
・問題の本質を切り分ければ、対応策は(ほぼ)確定します。

ということで、サポートの中の人、お問い合わせいただくご担当者様ともに、
早期解決を目指して頑張りましょう。
[小ネタ]perlワンライナーにシェル変数を渡す

`-s`オプションを使います

```bash

echo -e "hogehoge\nfugafuga" > myfile.txt

```

```bash
var="hogehoge\n";cat myfile.txt | perl -pse 's/$shell_var//' -- -shell_var=$var
```

出力は`fugafuga`となります

`--`以降で変数の中身を指定していますが、これは~~シェル一般に共通する記法ではなく、特殊な記法だと思われます~~

訂正:シェル組み込みの文法ではないですが、コマンドラインツールの作成時に推奨されている記法のようです。(以下を参照)
Aruba Instant の MIB について

この記事はエムスリーAdvent Calendar 2015の7日目の記事です。

# 概要
Aruba Instant のMIBを簡単に紹介します。

# Aruba Instant とは
Wifiアクセスポイントの管理手法は大きく自律型とコントローラ型に分かれます。
Aruba Instant 独立したコントローラを配置しなくてもクラスタを構成するアクセスポイントの内一台がコントローラの役割を果たしてコントローラなしでコントローラ型の機能を実現するArubaの独自機能となります。ただし、本業のコントローラに比べると管理できる台数や機能には若干の違いが存在します。

# Aruba Instant のMIB
Aruba Instant のMIBはArubaの[サイト](https://support.arubanetworks.com/Documentation/tabid/77/DMXModule/512/Default.aspx?EntryId=5808)から参照可能です。6.4.3.4-4.2.1.0のドキュメントは[こちら](https://support.arubanetworks.com/Documentation/tabid/77/DMXModule/512/Default.aspx?EntryId=19684)です。Aruba Instant MIB Reference Guide というPDFにMIBの情報がまとまっています。

SNMPの情報をポーリングする場合管理対象となる機器単体の情報を取得できるのが一般的ですが、Aruba Instantはコントローラとなるため管理対象となるアクセスポイントの情報を一つのOIDから取得することができます。

例えばアクセスポイントの無線出力であれば ``aiRadioTransmitPower`` なので ``1.3.6.1.4.1.14823.2.3.3.1.2.2.1.5`` から取得可能です。

取得される結果は以下の通りです。

```
SNMPv2-SMI::enterprises.14823.2.3.3.1.2.2.1.5.A.B.C.D.E.F.0 = INTEGER: 21
SNMPv2-SMI::enterprises.14823.2.3.3.1.2.2.1.5.A.B.C.D.E.F.1 = INTEGER: 9
```

A,B,C,D,E,FにはアクセスポイントのMACアドレスを10進数で表示した値が入ります。

``aiAPName(1.3.6.1.4.1.14823.2.3.3.1.2.1.1.2)`` にはアクセスポイントの名前が格納されていますのでMACアドレスとアクセスポイントを紐付けることが可能です。

Cacti の様な管理ツールを使用する場合機器名と取得する値を紐付ける必要がありますので、MACアドレスの と アクセスポイント名を配列に格納して利用します。

実際に有る一台のアクセスポイントの aiRadioRxBad(1.3.6.1.4.1.14823.2.3.3.1.2.2.1.18) をCactiで出力したグラフが以下の通りです。
(青が2.4GHz、赤が5Ghzです)
![rx_error.png](https://qiita-image-store.s3.amazonaws.com/0/103627/5626137a-ed2b-d406-dc65-157dd3fa70a4.png)

日中になるとエラーが増えていることがわかります。

# クライアントのIPアドレスを監視する

Aruba Instant のMIBには接続しているクライアントの情報も格納されています。
``aiClientIPAddress(1.3.6.1.4.1.14823.2.3.3.1.2.4.1.3)`` には接続しているクライアントのIPアドレスが入っています。

先日Wifi環境でDHCPの応答がなくなり接続がクライアントが通信ができなくなる問題発生したのですが、クライアントのIPアドレスがリンクローカルアドレスになっているかで監視を行うことが出来そうです。

```ruby:client_addr.rb
require 'snmp'
require 'ipaddr'

class YuIPAddr < IPAddr
        def ipv4_linklocal?
                range = IPAddr.new("169.254.0.0/255.255.0.0")
                return range.include?(self)
        end
end

SNMP::Manager.open(:Host => '192.168.1.1',:Community => 'community', :timeout => 1, :retries => 1) do |manager|
        manager.walk('1.3.6.1.4.1.14823.2.3.3.1.2.4.1.3') do |row|
                addr=YuIPAddr.new(row.value.to_s)
                if addr.ipv4_linklocal?
                        puts addr.to_s
                end
        end
end
```

# まとめ
Aruba Instant は豊富はMIB情報を備えているのでSNMPで様々な管理を行うことが可能です。ArubaにはAirWaveという管理機能がありますがMIBを活用することで似たような時系列でのデータの収集が可能です。
transformClassesWithInstantRunForDebugでClassNotFoundException

Android StudioでInstant Runが使えるようになって喜んでいたのもつかの間．
突如 `transformClassesWithInstantRunForDebug` というタスクでClassNotFoundException を吐き出し，ビルドが通らなくなりました．
GitでInstantRun対応の後と前のコミットで行き来したのが原因？

エラーとなったclassは VolleyのNetworkImageView．

調べてみると IssueやらStackOverFlowにも投稿が見つかります．

- https://code.google.com/p/android/issues/detail?id=195044&q=label%3APriority-Medium&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
- http://stackoverflow.com/questions/34059352/android-studio-2-0-preview-apptransformclasseswithinstantrunfordebug-failed

明確な解決法は特に書かれていないようです．
（特にStackOverFlow，「Instant Runをdisableに」って，違う，そうじゃない）

## 解決

プロジェクトのクリーンでは直らず，お約束の `File -> Invalidate Caches / Restart` で直りました．

頻繁に起きるようだとツラいなぁ…
[SQL]1行で主キーを変更する

#主キーを変更したい
新規実装に当たって既存の主キーを変える必要が出てきた。
が、調べてもなかなか変える為の構文が出てこない。
解決法はシンプルだったので備忘録として残しておく。

#構文
```lang:SQL
ALTER TABLE table_name DROP PRIMARY KEY, ADD PRIMARY KEY (id);
```
やっていることはいたってシンプルで、主キーを削除して主キーを追加しているだけ。