OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS6.xでEPELリポジトリ入れたときのエラー対処

# 現象

CentOS6.xで以下を実行して

```
$ sudo yum -y install epel-release
```
以下などを実行すると

```
$ sudo yum -y update
```

以下のエラーが発生します。

```
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
```

#解決
以下のエントリーのおかげで解決しました。
[CentOS 6.3 Instance Giving "Cannot retrieve metalink for repository: epel" Error](https://community.hpcloud.com/article/centos-63-instance-giving-cannot-retrieve-metalink-repository-epel-error)

EPELリポジトリがSSL3.0を使っているのが原因とのことで、記事の通り以下を実行してhttps→httpに変更することで解決しました。

```
$ sudo sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo
```
Rails4.2のプロジェクトで、elasticsearch を yosemite と heroku で使う 1

日々のメモです。（拙い英語で書いてますorz...）

**Install elasticsearch to Yosemite!**

# Yosemite

```
$ brew install elasticsearch
```

```rb:Gemfile
# Elasticsearch Client
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
gem 'bonsai-elasticsearch-rails'
```

```rb
$ bundle install
```

## Plugin

### Japanese Character Adaptor

[The Japanese (kuromoji) Analysis plugin](https://github.com/elastic/elasticsearch-analysis-kuromoji)

```rb
$ plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.5.0
```

### Elasticsearch monitor

[A web front end for an Elasticsearch cluster](https://github.com/mobz/elasticsearch-head)

```rb
$ plugin --install mobz/elasticsearch-head
```

after installing, access to url below and check something on elasticsearch

```rb
http://localhost:9200/_plugin/head/
```

# start

```rb
$ elasticsearch -f
```

then you can access url above and view screen like below.

![Screen_Shot_2015-03-26_at_11_32_24.png](https://qiita-image-store.s3.amazonaws.com/0/18705/c15de1c8-d139-6ab6-3023-ec6ab2b63a70.png)



continued....

# References

- http://qiita.com/k-shogo/items/8657e0a5fdf20a25bba0
- https://devcenter.heroku.com/articles/bonsai
C++で領域を自動拡張するバッファクラス

#概要

自動で領域を拡張するバッファクラス。
https://github.com/0xfffffff7/AutoExtensionBuffer

今作ろうとしているOSSで使いたくなったので作った。



#目的
パフォーマンス。
なるべく動的確保しない。
ソケットから取得したバッファをそれ以上コピーせずにそのまま使い回す。
ソケットのrecvで繰り返し受け取りながら、何も気にせずサイズを内部で拡張してくれるバッファが欲しかった。



#特徴

●最初に4096バイトの内部静的領域を使う。

●4096バイトを超えたらダイナミックにバッファを確保してそちらを使う。

●ポインタに直接書き込む場合はtransction()とcommit()をセットで使う。

●1.2倍の猶予で拡張するので頻繁な動的確保を減らせる。

●あらかじめ使う領域が分かっている場合はreserve()で最初に予約もできる。



#サンプル

```

AutoExtensionBuffer buf;

std::string str = "abcde";

// これはスタティックバッファを使う.
buf.write((int8_t*)str.c_str(), str.length());


// 先頭取得.
int8_t* p = buf.front();

// 書き込める最新の位置を取得.
p = buf.get();

// キャパシティの末尾を取得.
p = buf.last();


// 4096以上の文字列
str = "abcde.......";

// 内部でスタティック領域をやめて動的領域を使う。
buf.write((int8_t*)str.c_str(), str.length());


// これからソケットで書き込むサイズを指定
// 内部で領域を拡張.[(_length(実データ長) + 指定バイト) * 1.2]まで拡張する.
// キャパシティ内なら拡張されない.
p = buf.transaction(1024);

int r = socket.recv(p, buf.get_writable_size());

// 実際に書き込んだバイト数をコミットして実データ長を更新.
buf.commit(r);


// 少しずつコミット.
p = buf.transaction(1024);

// pに100バイト書き込む.

// コミット
buf.commit(100);

// pに200バイト書き込む.

// コミット
buf.commit(200);

```
HTML1ソースでつくるときに、PCとSPでcssを完全に分けたいとき


```HTML
<link rel="stylesheet" href="pc.css" media="only screen and (min-width: 640px)" type="text/css">
<link rel="stylesheet" href="sp.css" media="only screen and (max-width: 640px)" type="text/css">
<!--[if lte IE 8]>
<link rel="stylesheet" href="pc.css" media="screen" type="text/css">
<![endif]-->
```

メディアクエリーで分けるとIE8以下にスタイルが適用されなくなってしまうので、
条件つきコメントでIE8以下にも読み込まれるようにする。
Unity 5 でNCMB UnitySDK をAndroidもiOSもプッシュ通知を試しました！

元投稿：[NCMB コミュニティ投稿](https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/134)

[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)のUnity SDKはプッシュ通知対応しているとドキュメントにて見ました。いつか使ってみたいなと思いましたが、ちょうど最近リリースしたUnity5でちょっと遊んでみて、Android, iOSプッシュ通知を試しました！

Unity 5ダウンロードはこちらの[リンク](http://japan.unity3d.com/unity/download/)
Unityを共存インストールしたいので、この[リンク](http://docs.unity3d.com/ja/current/Manual/InstallingMultipleVersionsofUnity.html)を参考しました
SDKダウンロードはこちらの[ドキュメント](http://mb.cloud.nifty.com/doc/sdkdownload_unity.html#/Unity/)
日本サイトはダウンロードリンクの更新はちょっと時間がかかりましたが、今ダウンロードできるようになりました。全部無料版でもプッシュ通知を使いました。

# 試した環境

```
Unity 5.0.0
Xcode 6.1.1
iOS 8.1..2
Unity SDK 1.1.3
iOS SDK 2.0.9
Android SDK 1.3.7
```

# 実施方法

参考した手順は[こちら](http://mb.cloud.nifty.com/doc/sdkguide/unity/push.html)

SDKのプッシュ通知のところを参考して、その通りにやってみましたが、やはり上手くビルドしなかったところがありました！調べたりして、それぞれの対策をまとめました。

## ios

プロジェクトをビルドし、コンパイルすと、 - #include "iPhone_OrientationSupport.h" 　-> “file not found ERROR"が発生

　対策： 
<pre>
//#include "iPhone_OrientationSupport.h" 
//#include "iPhone_Profiler.h" iOS7.0 rich push: ダイアログを開き、ローディング中、次の画面になる
</pre>

## Android

Build and Runすると、以下のエラーが発生：

```
 Build error: CommandInvokationFailure: Failed to re-package resources. See the Console for details. /Users/sci01445/android-sdks/build-tools/21.1.2/aapt package --auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S "res" -I "/Users/sci01445/android-sdks/platforms/android-21/android.jar" -F bin/resources.ap_ stderr[ AndroidManifest.xml:22: error: Error: No resource found that matches the given name (at 'value' with value '@integer/google_play_services_version'). ] stdout[ Configurations: (default)
```

対策：
 To fix this error, you have to copy the version.xml file from android-sdk/extras/google/google_play_services/libproject/google-play-services_lib/res/values/ into Assets/Plugins/Android/res/values/ your Unity project's folder. 

参考：[StackOverFlow URL](http://stackoverflow.com/questions/20728725/cant-use-google-play-services-on-unity-java-plugin)

# まとめ
とりあえず、上記の手順＋暫定的な対策で、一通りビルドと端末登録、プッシュ通知受信ができました！！ちょっと感動です＾＾
少しのメモですが、参考になればうれしいです。

> ぜひ今後ビルドエラーなくSDKがUnity 5ちゃんと対応できるといいなと思いました
【Unity】Unity Performance Casual Talk 「ドローコール伝説の終わり」 レポート


# レポート一覧

* [Live2Dの描画の裏側の話](http://qiita.com/baba_s/items/0de1702e6055a4503167)
* [Unityカジュアルゲーム・ケーススタディ](http://qiita.com/baba_s/items/9289f1eab711f04faec8)
* [ドローコール伝説の終わり](http://qiita.com/baba_s/items/5260807ced7fc3c02ca6)

# GREE Tech Talk #07 : Unity Performance Casual Talk

http://techtalk.labs.gree.jp/07/

## niconico LIVE

http://live.nicovideo.jp/watch/lv214504347

## パフォーマンスの最適化

* (描画の)パフォーマンス最適化は大きく分けて2種類
	1. CPUが遅い
	2. GPUが遅い


## ドローコールとは

描画に関する何か
↓
描画が遅いっぽい
↓
ドローコールを減らせば何とかなる
↓
__ではない！__

* 描画処理の__CPU側__の処理
* 厳密にいうと、__CPU側のドライバー__がGPUに描画内容を渡す処理
* glDrawElements()とかが該当

## CPU側の描画処理

----
Unity
　　マテリアルの設定
　　頂点データ、テクスチャ、カラー、マトリックスなど

----
↑
| ←こっちの処理のほうがだいたい重たい
↓

----
OpenGL ドライバ
　　リソースのロック
　　設定のバリデーション
　　データのコピー
　　ステートの保存
　　ここもMetal/DX12/Vulkanでマシになる(はず)

----
| 
| ←ドローコールの範囲はここだけ
| ←ドライバーの進化、Metal/DX12/Vulkanでどんどん高速になっている
↓

----
GPUで描画

## では、重いところは何か？

__SetPass__


## CPU側の描画処理

----
Unity
↑
| ← SetPass
↓
ドライバ

----
Unity
↑
| ← SetPass
↓
ドライバ

----
|
| ← デカイ頂点を動的にまとめたり
| ← 送信する処理の方がCPUコストが高い
| ← (小さいオブジェクトは今まで通りまとめる)
↓
GPU

----

1回のSetPassを共有したドローコールは
大きな問題にはならない(今後さらに減る)

## Unity5での具体的変更

* 描画量の最適化
	* Static Batchingはドローコールの最適化を必ずしもしない
		* ドローコール自体は安いが、Static Batchingで繋ぎすぎると
毎回デカいメッシュを送ることになる→GPUに悪影響
		* 十分に小さいオブジェクトはBatchingする
* ユーザーがやるべきこと
	* Draw callよりSetPass Callに気を配る
	* Umbraによるオクルージョンカリングを活用する(デザイン含む)

## GPU側の描画の問題

* Rendererがいっぱい(ピクセル描画が重い)
* Tilerがいっぱい(頂点量が多すぎ)
* __ドローコールを減らしても解決しない__

## GPU側の描画の問題か確認するには？

* Xcode & Instruments
* GPU Profier(Adreno, PowerVR, nVIDIA...)

## GPU側の描画の問題

* Rendererがいっぱい(ピクセル描画が重い)
	* fragment shaderが複雑すぎる
	* テクスチャのキャッシュミスがひどい
		* PVRTCなどのフォーマットの方がテクスチャのキャッシュにヒットしやすい
		* Cube mapのようにランダムアクセスするテクスチャはキャッシュミスがひどい
	* ピクセル描きすぎ(オーバードロー)
* Tilerがいっぱい
	* 送信している頂点数が多すぎる

## お約束

* モバイルは半透明に弱い(discardのコストが高い)
	* 2DはUnity 2Dを使う(半透明のピクセルを極限まで減らす)

## 重い描画と重くない描画の発見

* Rendererがいっぱい(ピクセル描画が重い)
	* fragment shaderを簡単にする - 発見方法：GPUベンダーのプロファイラ
	* テクスチャのキャッシュミス - 発見方法：GPUベンダーのプロファイラ
	* ピクセル描きすぎ(オーバードロー) - フレームデバッガ、Xcode、シーンビュー
* Tilerがいっぱい
	* 送信している頂点数が多すぎる - フレームデバッガ、Xcode等

## 結論

* 描画が重い=ドローコールではない
* 重い原因に気を配ろう(思いどローコールと重くないドローコールの切り分け)
* 重い原因を解決しよう
* 原因の発見にはUnityのProfiler,Frame Debugger,GPUメーカーやベンダーのProfilerを使おう

## おまけ

* Unity5でGL Frame Capureを使うには
	* Unity 5.0p2以上を使用
	* __Player Settings__でGraphics APIを__OpenGLES 2.0__に設定
* Unity5でInstrumentsでシンボルを見るには
	* 出力されたXcodeのプロジェクト設定でDebug Information Formatを
「DWARF with dSYM File」に設定
見間違い > (adr + 15) & -15 > (adr + 15) & ~15だった

人のコードを見ていて、以下のような処理があったのだが、やっていることの意味がよく分からなかった。

```
adr2 = (adr1 + 15) & -15;
```
よく見ていると上記は
```
adr2 = (adr1 + 15) & ~15;
```
だった。右側の15の前は-(マイナス)でなく~(チルダ)だったのだが、sublime textで見ていてもマイナスに見えてしまっていた。

adr1に入れた値と計算されるadr2の値は以下のようになる。

| adr1 | adr2 |
|------|------|
| 0 | 0 |
| 1 | 16 |
| 2 | 16 | 
| 3 | 16 |

上記の結果だとコードの意図が理解できる。
BootStrap3のテーマを使うには？

現在Java、Seasar2(SAStrats/S2JDBC)、JSP、PostgreSQLで
DBを使ったWebアプリケーションを作っています。

そこで質問なのですが、
結論から言うと


**BootStrap3のテーマを今作っているアプリケーションに反映するにはどうしたらいいでしょうか？**
<br>

ざっくりしすぎているので説明すると
現在Bootstrap CDNを使ってBootstrap3をJSPに反映させ、ボタンやフォームなどを鮮やかなデザインにすることはできています。

次は画面全体的に鮮やかなデザインにしたく、Bootstrap3のテーマの使用を考えています。

しかし、調べても今の自分の環境に反映させる方法が見つかりません。


方法そのもの、あるいは関連サイトなど教えて頂ける方がいればよろしくお願いします。

<br>
---
<br>
これ(現状)を
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/60528/97a69f74-f09f-11aa-6159-a1d365f5498f.png)


↓
こんな感じにしたい。こういうのを反映させたいです。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/60528/94bbe5ec-0ab9-111c-4055-f450b4abca15.png)
よろしくお願いします。
Mac に RMagick をインストールする

Rails4で作っているプロジェクトで、Carrierwaveを使おうとすると、RMagickも一緒に使うことが多いかと思います。
それらのセットアップ時のトラブルです。

# エラーたち

## bundle installが落ちる

```rb
$ bundle install --path vendor/bundle
----

An error occurred while installing rmagick (2.13.4), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.13.4'` succeeds before bundling.
```

↑なエラーが出ます。

## gem install rmagick -v '2.13.4' が落ちる

```rb
$ gem install rmagick -v '2.13.4'
----

Fetching: rmagick-2.13.4.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing rmagick:
	ERROR: Failed to build gem native extension.
```

# 対応

```rb
$ brew install pkg-config
$ brew install imagemagick
$ gem install rmagick -v '2.13.4'
$ bundle install
```

↑これで通りました。
あらかたこれでうまくいくようですが、そうでないこともありますので、その際はエラー表示を読んで、ググって対応しなきゃですね。
価格を100円単位の切り上げにする

案件で地味に使います

```php:util
    /*
     * 100円単位切り上げにする
     *
     * 例)
     * 9801円の場合は9900円
     * 10199円の場合は10200円
     * 1010円の場合は1100円
     * 1000円の場合は1000円
     */
    public static function roundupPriceBy100($price)
    {
        return $price + (100 - $price%100)%100;
    }
```
yum update で Beanstalkのgit aws.push がコケた場合 (ImportError: cannot import name check_output)


yum update したら、git aws.push で下記のエラーが出るようになった。

```
$ git aws.push
Traceback (most recent call last):
  File ".git/AWSDevTools/aws.elasticbeanstalk.push", line 21, 

   :
   :

ImportError: cannot import name check_output
```

検索したら、↓ここに解決策書いてあった。

http://stackoverflow.com/questions/25539442/getting-importerror-cannot-import-name-check-output-git-aws-push-on-eb-cli


一応直ったが、いい加減eb コマンドアップデートしろってことか。
（version 3が出てる）
MacでZIPファイル圧縮したとき.DS_Storeを含めないようにする

MacOSXには標準でZIPファイルの圧縮機能がありますが、対象フォルダを一度でも Finder で開いていると .DS_Store ファイルができるため、このまま圧縮すると他OSユーザに渡すときに残念なことになります。

.DS_Store を含めないで圧縮するには、コマンドラインで以下のようにします。
``$ zip -r hogehoge.zip * -x *.DS_Store``

この場合 .DS_Store をのぞくカレントフォルダの全ファイル・フォルダを hogehoge.zip に圧縮しています。
RubyistがPython+bottle+MySQLで簡単APIを作ってみた


![python-framework.png](https://qiita-image-store.s3.amazonaws.com/0/1418/ffb502b1-1f13-fc0c-6e81-5553aa6a2af3.png "python-framework.png")


##背景
普段はRubyで開発をしているけど、ビッグデータの解析系の仕事が増えてきたので、pythonをいじる必要性が出てきて、まずは軽量フレームワークのbottleで簡単なAPI的な役割のシステムを作ってみようと思い立ちました。

##雑感
めちゃくちゃ軽量で、手軽なので、pythonのいい部分だけ使ってあとはメインの言語でってことも可能。

##作ったものの概要
①rubyのアプリケーションからAPIを叩く
②pythonで書いたアプリでMySQLにあるデータを取得
③pythonで計算
④rubyのアプリケーションに計算結果を返す

##実装

１．virtualenvで仮想環境を作成

```console
pip install virtualenv
virtualenv bottle_sample
cd bottle_sample
source bin/activate
```

２．bottleのインストール

```	console
pip install bottle
```

３．/updateでデータを更新

```score_calculator.py
# -*- coding: utf-8 -*-
from bottle import route, run
import networkx as nx

db_name = {DATABASE名}
host = {DATABASEのホスト}
username = {MySQLのusername}
passwd = {MySQLのpassword}

@route('/update')
def update
  g = nx.DiGraph()
  import mysql.connector
  connect = mysql.connector.connect(db=db_name, host=host, port=3306, user=username, passwd=passwd)

  cur=connect.cursor()
  cur.execute("select from_user_id,to_user_id from awesome_graph_data)                                                                                      
  rows = cur.fetchall()
  for row in rows:
    if row[0] is not None:
      g.add_node(row[0])
      g.add_node(row[1])
      g.add_edge(row[0],row[1])

    cur.close()
    connect.close()
  pr=nx.pagerank(g,alpha=0.85,personalization=None, max_iter=500)
  
  for id, score in pr.items():
    print id,score #今回は割愛するけど、ここでmysqlに保存すればいい
  return str(pr)
```

これで、有向グラフからpagerankを算出して、mysqlに保存できた。

４．/score/{user_id}でscoreを取得

```score_calculator.py
@route('/score/<user_id>')
def score
  import mysql.connector
  connect = mysql.connector.connect(db=db_name, host=host, port=3306, user=username, passwd=passwd)

  cur=connect.cursor()
  cur.execute("select score from scoda_data where user_id = {{user_id}}")                                                                                      
  score = cur.fetchall()
  return score

```
これで特定のuser_idのscoreが取得できるように。


##まとめ
非常に簡単なアプリケーションなら、python+bottleで簡単に作れる。
他にも、viewファイルを作って、Webサプリケーションを作成することも簡単にできる。

rubyでは相性の良くなかった色んな計算を外出ししてしまうって手も面白いと思いました。
Python+Flask+Herokuで簡単webアプリ

# あいさつ

Rubyからの視点で色々備忘を綴ります.

## pip, pip3

gemみたいなやつ、

python3に同梱されているヤツはpip3


## virtualenv

Bundlerみたいなやつ
    
    $ pip3 install virtualenv


bundle init みたいなコマンドでisolatedな環境を作る

    $ virtualenv venv

bundle exec みたいなコマンドを打つ

    $ source venv/bin/activate


## Flask

Sinatraみたいなやつ

    $ pip install flask


## Gunicorn

webサーバー、unicornみたいなやつ

    $ pip install gunicorn


# アプリを作り始める
`test_app`という名前だとします.

    $ mkdir test_app; cd test_app

    
    $ touch main.py Procfile


```py:main.py
import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World!'
```

```:Procfile
web: gunicorn main:app --log-file=-
```

# 起動

    $ foreman start

簡単や...


## Gemfile.lock的なものを作る

    $ pip freeze > requirements.txt

## git

    $ git init

    $ echo 'venv\n*.pyc' > .gitignore


## heroku

    $ heroku create test-app

    $ git push heroku master

    $ heroku open


あとは

http://flask.pocoo.org/docs/0.10/
secure coding > size = sizeof(x++); > sizeof演算の()の中の式は実行されない

組込みソフトウェア開発向けコーディング作法ガイド [C言語版] 初版第1刷

この本のp129に「例2. 実行されない式を記述」の例として以下のものがある。

```c:cのコード
size = sizeof(x++);
```

説明では「sizeof演算の()の中の式は、式の型のサイズが求められるだけで、式の実行は行われません。」とある。

ideoneでコードを書いてみると ([link](http://ideone.com/mFG3ac))、確かにx++は実行されていなかった。

ただ、sizeof(x++)というxを加算しながらsizeofを取る必要性が自分の関連するものとしては思いつかない。
brew install済みのformula一覧を元にbrewfile.shを作るワンライナー

`brew leaves`という、他のformulaに依存されてないformulaを一覧するコマンドがあります。
これさえ知ってれば「あとは分かるな……」です。

```bash
brew leaves | ruby -e 'puts "#!/bin/sh";ARGF.each{|s| puts "brew install #{s}"}' > brewfile.sh
```

`brew cask`で入れてる方は、依存関係とか気にしなくていいはずなんで、`brew cask list`でいいんじゃないかと思います。
Android 5.1.0 r3がリリースされてたので、r1からの差分とった


差分というかコミットログですね。
`$ repo forall -pc 'git log --oneline --numstat --no-merges android-5.1.0_r1..android-5.1.0_r3'
`
# project build/
**d61ef57** "LMY47I"
1	1	core/build_id.mk
__8d5f0f9__ "LMY47H"
1	1	core/build_id.mk
__16eea6e__ LMY47G
1	1	core/build_id.mk
__be9ec01__ "LMY47F"
1	1	core/build_id.mk
__7b2e9f0__ LMY47E
1	1	core/build_id.mk

# project cts/
__cc8bdfa__ Add android.hardware.cts.SensorTest#testBatchAndFlush to knownfailures
7	0	tests/expectations/knownfailures.txt

# project development/
__fcc638d__ Fix the build
2	1	samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java

# project external/apache-harmony/
__4a932e7__ Fix flaky test ThreadStartTest
30	23	jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/ThreadStartTest.java

# project frameworks/base/
__0590e4e__ Changing usage of carrier name field of SubInfoRecord
2	1	telephony/java/android/telephony/SubscriptionInfo.java
__f1f0c57__ Keyguard: Use plmn/spn broadcast when no SIMs
23	3	packages/Keyguard/src/com/android/keyguard/CarrierText.java
__ceb1699__ Fix change IME content description
1	0	packages/Keyguard/res/layout/keyguard_password_view.xml
3	0	packages/Keyguard/res/values/strings.xml
0	2	packages/SystemUI/res/values/strings.xml
__e34c3bc__ Remove TrustAgent whitelisting API
0	2	api/current.txt
0	2	api/system-current.txt
2	0	core/java/android/app/admin/DevicePolicyManager.java

# project frameworks/opt/telephony/
__a081eb7__ Lightweight fix for incorrect locale changes - DO NOT MERGE
38	14	src/java/com/android/internal/telephony/MccTable.java
__af94615__ Notify subscriptionInfoChanged in setPlmnSpn even without sim.
4	1	src/java/com/android/internal/telephony/SubscriptionController.java
__36d48c6__ Set carrierName of subInfo to null while creating/updating subInfo.
1	9	src/java/com/android/internal/telephony/SubscriptionController.java
3	9	src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java

# project packages/apps/Settings/
__2fc5bc6__ Use TelephonyManager api to get SPN of sim to display in UI.
7	1	src/com/android/settings/sim/SimSettings.java

# project prebuilts/sdk/
__d9486e6__ Remove TrustAgent whitelisting API
0	2	api/22.txt
0	2	system-api/22.txt
DBから単一SELECTする関数の型をFuture[何]にすれば良いのか悩む


プロジェクトで一つの書き方に統一したくて悩んでいる。ちなみにまだどれも実際に使ったことがないので下の感想は想像レベル。

## Future[Option[...]]派

http://www.slideshare.net/seratch/non-blockingjdbcinscala-26542623/17

![歌舞伎座_tech_1_LT_-_ScalikeJDBC_Async___Skinny_Framework__kbkz_tech.jpg](https://qiita-image-store.s3.amazonaws.com/0/5978/2f63743e-e864-c499-7905-97189de667bf.jpeg "歌舞伎座_tech_1_LT_-_ScalikeJDBC_Async___Skinny_Framework__kbkz_tech.jpg")

### 良いところ

* 同期バージョンの型をOption[...]にしていたらFuture[Option[...]]にするのは比較的考えることが少なそう
* 複数取得するときの型をFuture[List[...]]にするとmapとかの見た目上対称性のあるコードになりそう（？）

### 悪いところ

* コードが煩雑になりがち
	* 2つの型クラスに包まれているとforを使いにくい

```scala
repository.resolveAsync(id).map {
  maybeRecord => maybeRecord.map { ... }
}
```

## Future[Either[...]]派

http://d.hatena.ne.jp/xuwei/20140919/1411136788

>
* play2とか使ってると、Futureがよく出てくる
* Futureをそこら中でAwaitしたらFuture使う意味がないので、Future[A]をmapやflatMapなどでどんどん連鎖させて、メソッドの型にFutureが大量に出現！
* Futureは非同期に行われる処理であり、そこで例外発生したら、その中に例外を含むしかない(単純に例外投げるわけにはいかないというか不可能)
* Scala標準ライブラリのFutureは、Throwable型で例外を保持できるようになってる
* 逆にいうと、Throwableでしか保持できない
* 例外の種類が多くなってきて、プログラムが複雑になった場合、Throwableではなくもっと限定された独自のエラー型で表現したい
* すると Future[ Either[エラーの型, 結果型] ] にしたくなる
* しかし、それはそれで、Future と Either が混ざった型をうまく扱う方法がわからずに死

### 良いところ

* 「例外の種類が多くなってきて、プログラムが複雑になった場合、Throwableではなくもっと限定された独自のエラー型で表現したい」というときに便利なのかも？

### 悪いところ

* だいぶ複雑になりそう
* モナドトランスフォーマー？
	* scalazに依存したくないし、かと言ってモナドトランスフォーマーを自分で定義すると初心者お断りコードになりそう

## 単なるFuture[...]派

http://labs.gree.jp/blog/2013/12/9354/

> 
リポジトリには、次のような集約ルートであるエンティティ(以下 ルートエンティティ)を永続化(保存したり読み込んだり)するI/Fを定義します(Mには、同期型I/Oならscala.util.Try、非同期型I/Oならscala.concurrent.Futureを指定することができます)。それらは、ルートエンティティを”保存する(save/store)”もしくは”識別子で解決する/読み込む”などの永続化の言葉に対応します。SQLのinsert,updateより抽象度が高い言葉です。


```
trait Repository[M[+ _], ID <: Identity[_], E <: Entity[ID]] {
  type This <: Repository[M, ID, E]
  // 識別子を指定してエンティティへの参照を取得する
  def resolve(identity: ID)(implicit ctx: EntityIOContext): M[E]
  // エンティティを保存する
  def store(entity: E)(implicit ctx: EntityIOContext): M[(This, E)]
  // 識別子を指定してエンティティを削除する
  def delete(identity: ID)(implicit ctx: EntityIOContext): M[(This, E)]
}
```

### 良いところ

* mapとかの数が減ってコードの見通しが良くなりそう
* 最初から同期版がOptionではなくTryにしていた場合はFutureにするのは手間がかからない

### 悪いところ

* Optionと違って、取得対象のレコードが存在しなかったことを表すのに独自の例外を定義しないといけない
	* それ以外の、例えばDBに接続できなかった例外などは別にハンドリングせずにユーザーにエラーを見せても良いというスタンスの場合、これだけのために例外を一つ定義するのが微妙な気がする

## 所感

どれを選ぶかによってコードがだいぶ変わってくるので、あとで別のに変えるのが大変そう。

同期のところを非同期にするのにもだいぶ大幅な書き換えになるので、またやるのはつらい。

もしかしてほんとうに欲しかったものはFutureではなくてC#のasync/awaitだったのではという気もする。

（とは言えコールバッククラスのインスタンスを渡したりするのよりはFutureのほうがよっぽどマシだけど）

定番があるなら合わせたい。
スタックでの計算（iMops編)

最近、大学でS先生に**プログラム言語** を作りたいです！！と言ったら構文解析をゼロから教えていただく機会があった。
それも投稿していきたいと思っているが今回はiMopsという言語を使ったスタック指向のプログラム作成をしていきたいと思う。

スタックやキューとかこの記事を見ている方は多分私よりも１００倍ほど知っていると思う。
なので今回はiMops中心に解説をしていけたらと思う。
***

iMopsとは[Forth](http://ja.wikipedia.org/wiki/Forth)をベースに開発されたスタック指向言語であるらしい。
[Forth](http://ja.wikipedia.org/wiki/Forth)から影響を受けているということもあり、iMopsはForthの書き方でもそのまま使えることもあるようだ。（S先生より）
どっかのサイトによればiMopsはForthをベースとしているが機能はForth以上だとも書いていた。日本語を表示できたりなどするのも柔軟性が高い。

兎にも角にもプログラム言語をスタック指向で作れば面白いんじゃないということでこの勉強が始まった。

早速コードを書いていきたい。

`(3+5)*5`という計算をしたい場合iMopsでは次のようにする。

```forth:iMops
3 5 + 5 *
```

となる。
これは最初は戸惑うと思う。でもコンピュータにとってはこちらほうが理解しやすい。

次はワードの定義の仕方を解説する。多分[こっち](http://www.geocities.jp/naosacra/mops/Manual/tutorial/definingnewword.html)見たほうがわかりやすいと思うけど・・・

```iMops:iMops
: BMI  { w h -- } w 10000 * -> w w h / h / ;
```

これはw(体重）とh(身長)を渡してあげればBMI(どれだけ太ってるかを表す指標みたいなもの）を定義している。
(´・ω・`)ほげほげぇ〜〜〜

ワードとはC言語で言う関数、Javaでいうメソッドみたいなものである。
一回定義したら基本は何回でも使い倒せるもの。もちろんワードからワードを呼び出すことも可能。

: NAME という感じで定義する。ワードの名前は大文字にする。そして一番大事なのが
:←のあとに必ずスペースを入れることに注意して欲しい
これはコンパイラが:が来てスペースを区切った次の大文字の文字列をワード名にするとプログラムされているからである。
{ w h --}も同様で｛のあとには必ずスペースを入れる。そしてこのカギカッコの中には引数をいれる。そして--はコメントを表していて--のあとにはコメントを書けるようになっている。慣習としては--を書くようにするといいらしい。

{}内で引数（変数）を書いた後は自由に使える。二度使うこともできる。
w 10000 *でスタックにw 10000を格納してその積を格納するという処理。
その後の->というのは->のスペースを挟んだ後の変数にその結果を入れるということ。
つまりw と10000の積をwに代入するということをここで行っている。

そしてその後はw hをスタックに格納してその２つの変数を除算してさらにそれをhで除算するという処理を行っている。これがBMIというワードの流れである。

そして次はそのBMIをしようしてBMI2というものを作成していく。
BMI2ではBMIで求めた指数を利用して値の幅によってfat、normal,slimの表示を分けることをする。

```Forth:iMops
: BMI2 { w h -- }
  w h bmi
  19 <= 
  IF ." slim." 
  ELSE w h bmi 25 <=
    IF ." normal."
    ELSE ." fat." 
    THEN cr
  THEN cr ;
```

突然IF文が出てきて戸惑っているだろう。当たり前だ。~~なぜなら私もIF文を正しく認識していないのだから~~

>[引用] 
http://www.geocities.jp/naosacra/mops/Manual/tutorial/conditionals.html

多分IF文に関しては上のURLのチュートリアルをみながらやったほうが断然いいはずｗｗｗ

MopsのIF文はゼロではないときに真になり、ゼロのときに偽となるらしい。
したがってURLにあるテストの意味は

```MOPs:iMops
: TEST
  IF ." There is a non-zero number on the stack."
  THEN cr  ;
```
スタックに格納されたもので判別する。
実行方法は
ワードの小文字をタイプするだけ

`test`だけでよい

もし 3 5 0という順番で格納されていた場合は
0は偽であるのでTHENの改行で終了。
`test`
次の5はゼロではないの真となりThere is a non-zero number on the stack.が表示される
`test`
次は3なので同じくThere is a non-zero number on the stack.が表示される。

つまりさっきのBMI2ではまず
`w h bmi `で w h をBMIワードに渡して値がスタックに格納される
そして19 <= で１９以下の時-1が返される
もしも18が格納されていれば-1で真となるslimが表示される。
もしも22が格納されていれば0が返されて偽となり下のELSEが実行される
そしてこのとき最初のw h bmiで得た値がなくなっているのでもう一度　w h bmi をする。
そして１９以上かつ２５以下の場合に−１が返されそうでなければ０が返される。
0の場合はnormalで-1の場合はfatが表示される。その後に改行して、また改行して終了となる。

最後のTHENはIF文の対応を考えると何かしら書かないといけないようなので改行をしているということ

***
という感じで今大学で学んでいます。学んでいると言っても授業ではなくてゼミのような感じで教えて頂いている感じでとても有り難く思っています。
S先生には日頃から感謝しています。専門は人工知能やVRなのに本当に幅広く教えて頂いて感激していて将来的にはS先生のような教員になりたいと思っています。
今は大学１年生でこれから新２年になるところですが、気合と情熱を入れてスタックを勉強していきますのでよろしくお願いします。

こんな雑なガキが書いた記事を最後まで読んでくれてありがとうございました！！＾＾
Rails Tutorial メモvol.2

5.3.2 Railsのルート から５章最後まで

ルートの自動生成のメモ。

<font color=”#0000cd”>config/routes.rb</font>で<font color="#006400">match</font>を使用してパスを自動生成する。
具体的には
<pre>match '/about', to: 'static_pages#about',  via: 'get'</pre>
を記述するわけだが
これは（Tutorialにそのまま書いてあるが）
<pre>about_path -> '/about'
about_url  -> 'http://localhost:3000/about'</pre>
<font color="#006400">about_path</font>と<font color="#006400">about_url</font>という名前で、URLへのパスを自動生成している。
この章では、トップページからAboutページに行くだけなので、<font color="#006400">about_path</font>をつかう。
rootページは<font color="#0000cd">http://localhost:3000</font>となっている。
rootページの自動生成は5.2.4を参照。（rootだけ記述方法が違う）

次は完全な凡ミスをしたところ。。。
<font color="#0000cd">app/views/layouts/_header.html.erb</font>
で、ヘッダーに、今まで#を置いておいたリンクに、正しいものを追加するわけだが、ここで注意!
<pre><%= link_to "About", about_path %></pre>
の<font color="#ffoooo">about_path</font>に「シングルクォーテーション」が付いていない！笑
すこしハマりました・・・。
猫語をBrainf*ckの派生言語にする (Orenono使用)


一部で猫語しか話せなくなる感染症が発生しているようで、その症状に「Brainf*ckのようだ」という感想があったのでBrainf*ck化してみた。

- [Brainfuck - Wikipedia](http://ja.wikipedia.org/wiki/Brainfuck)

ソースコード

```hello_world.nya
にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ

「にゃっにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃっにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃっにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃんにゃんにゃんにゃー」

にゃっにゃ。
にゃっにゃにゃにゃにゃにゃ。
にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。
にゃ。
にゃにゃにゃにゃにゃにゃにゃ。
にゃっにゃーにゃ。

にゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃ。
にゃんにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。
にゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃ。
にゃにゃにゃにゃにゃにゃにゃ。
にゃーにゃーにゃーにゃーにゃーにゃーにゃ。
にゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃ。
にゃっにゃにゃにゃ。
```

実行結果

> Hello, world!

## 解説

`にゃにゃ` - ポインタが指す値をインクリメントする
`にゃー` - ポインタが指す値をデクリメントする

`にゃっ` -  ポインタをインクリメントする
`にゃん` - ポインタをデクリメントする


`にゃ。` - ポインタが指す値を出力
`にゃ、` - 入力から1バイト読み込み、ポインタが指す先に代入

`「` - ポインタが指す値が0なら、対応する`」`の直後にジャンプ
`」` - ポインタが指す値が0でないなら、対応する`「`（の直後）にジャンプ

# Orenono

Brainf*ckの派生言語は、`Orenono`というRuby Gemで簡単に作成できる。

- [Ruby で Brainf*ck の派生言語を作成するための gem 『orenono』を作成してみた - Qiita](http://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c)
- [tbpgr/orenono](https://github.com/tbpgr/orenono)


## インストール

```
gem install orenono
```

## 設定

以下を`Orenonofile`というファイル名で保存するだけで完成。

```ruby:Orenonofile
increment "にゃにゃ"
decrement "にゃー"
next_cursol "にゃっ"
previous_cursol "にゃん"
display "にゃ。"
read "にゃ？"
start_loop "「"
end_loop "」"
```

# 実行

`Orenonofile`があるディレクトリで`orenono execute`する。

```
$ orenono execute hello_world.nya
Hello, World!
```

# ソースコードの自動生成

`orenono generate`で、指定した文字列を出力するソースを自動生成してくれる。(ascii限定)

```
$ orenono generate "meow meow"
にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ「にゃっにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃんにゃー」にゃっにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。にゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃ。にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。にゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃ。にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。にゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃーにゃ。にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。にゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃにゃ。
```



# 感染が疑われる人物
- [にゃにゃにゃにゃにゃー :: 阿澄日和｜yaplog!（ヤプログ！）byGMO](http://yaplog.jp/asumibiyori/archive/493)
- [にゃにゃにゃにゃ！｜小岩井ことりオフィシャルブログ「ゆめはキミの太陽。」by Ameba](http://ameblo.jp/koiwai-kotori/entry-12005913053.html)
- [五十嵐裕美(いがらしひろみ)さんはTwitterを使っています: "にゃーにゃ、にゃにゃにゃにゃ、にゃにゃにゃにゃー❤"](https://twitter.com/HiRoMi_ig/status/580613544510636032)
- [井澤詩織さんはTwitterを使っています: "にゃーにゃーにゃにゃっにゃにゃにゃにゃにゃにゃ！にゃにゃにゃにゃにゃにゃにゃー！"](https://twitter.com/shiori_izawa/status/580603131890892800)
railsめも（コントローラ生成）

**コントローラ生成コマンド**
プロジェクトルートで以下を実行

```ターミナル
rails generate controller コントローラ名
```

実行するといくつかのファイルが生成される。
その中の_controller.rbが対象のコントローラになる。

**アクションの定義**
コントローラに書くメソッドのこと。
またアクションの場合はpublicとする。特に指定しない場合は
publicとなる。


**generate時に同時にメソッドも作成するには**
rails generate controller コントローラ名 *メソッド名*

上記のコマンドで*テンプレート*も同時に作成される。
railsめも(アプリケーションの起動）

**RubyOnRailsの起動メモ**
## 1 ルート・ディレクトリに移動

## 2 サーバー起動
rails server

## 3 以下にアクセス
http://localhost:3000/

## 4 サーバ停止
Ctrl]+[c]
Androidのコードを 見やすく！ 書きやすく！ するアノテーション

Android開発をしていると、同じint型でもDrawableのidだったりLayoutのidだったり、はたまたアプリ内で使う独自の数値であったりと様々な使い分けを求められるシチュエーションが多々あります。
Android Support libraryにはそんなときに便利なコードを見やすく、書きやすくするアノテーションがandroid.support.annotation パッケージの中に入っています。
その一部の使い方をまとめてみました。

2016/03/22 追記
その2も記載しました
[Androidのコードを 見やすく！ 書きやすく！ するアノテーション その２](http://qiita.com/teao26/items/f1221fc73ff61ca2ffb6)

## メソッドの引数にNullを許容しない
`@NonNull`
メソッドの引数にNullを許容しないことを明示できます。
これを指定していると呼び出し側が引数にNullを指定した場合に
Lintで Probable bugs の警告が出ます。
![NonNull.png](https://qiita-image-store.s3.amazonaws.com/0/50067/a5df428b-6bd8-8d80-0f3d-461559bd9609.png)

## 引数や戻り値を特定のリソースIDに限定する
`@AnimRes` `@ColorRes` `@DrawableRes` `@IdRes` `@MenuRes` `@LayoutRes` `@StyleRes` `@IntegerRes` etc...
int型の内容を絞ることができます。
メソッドの引数に`@DrawableRes`を付与した場合、受け取る値をdrawableのIDとして定義したものに限定することが出来ます。
呼び出し側でDrawableのリソースIDとして定義していないものをわたそうとした場合にエラーが表示されるようになります。
![drawableres.png](https://qiita-image-store.s3.amazonaws.com/0/50067/4452f4d0-e85f-ab87-a005-c0008cd0b889.png)
また、メソッドに`@DrawableRes`を付与した場合には、戻り値をdrawableのIDとして定義したものに限定することが出来ます。
retrun区でリソースIDとして定義していないものを返そうとした場合にエラーが表示されるようになります。
![drawableres2.png](https://qiita-image-store.s3.amazonaws.com/0/50067/2aebdcd7-4789-a721-2f47-bcc2dbf06e41.png)
他のアノテーションも同様なので、用途によって使い分けると良いでしょう。

## 独自制約の作成
`@IntDef` `@StringDef` 
使い方としてはEnumに近いです。
定数として定義した int もしくは String の値のうち使用できるものを指定することで、使える値を限定した独自のアノテーションを定義することが出来ます。
ここで生成した独自アノテーションをメソッドの引数に付与すると、受け取る値を指定した定数だけに限定することが出来ます。
呼び出し側は、指定した定数だけをわたすことができるようになります。定数と同じ値であっても定数を使わなければエラーになります。
![def.png](https://qiita-image-store.s3.amazonaws.com/0/50067/98bb8883-138a-cd71-04ad-84e086a8af4e.png)
また、独自アノテーションをメソッドに付与することで戻り値を限定することが出来ます。
引数のときと同じく、return区には指定した定数だけを記述することが出来ます。
![def2.png](https://qiita-image-store.s3.amazonaws.com/0/50067/5851d8a7-9f39-9aca-cf3b-9a93ed1f26cf.png)
AndroidのImageViewの画像を変更しても画像が変わらない時の対応

ImageViewにURIを設定して画像を表示しているときに、そのURIの画像を更新して、URIを設定し直してもImageViewに表示される画像は変わりません。

これは、ImageView#setImageURI()の実装上、同じURIを設定したときに画像が変更されないようになっているためです。


このことに対応するためには、下記のように一旦ImageViewのURIにnullを設定してから、もう一度URIを設定します。

```java
imageView.setImageURI(null);
imageView.setImageURI(uri);
```

こうすることで強制的にImageViewの画像を更新することができます。
「あの言語のアレはこの言語でいうコレだよね」まとめてみた（開発環境・テスト）

## 経緯
いろんな言語を使う人と交流するときに、別の言語でたとえることが多いな、思った。

「Python でいう pip が Ruby の gem だよ。 Perl でいうところの cpan だね」みたいな説明をする。

自分にとっての母語と外国語の対応がわかると、理解が断然早くなるはず。

せっかくなので、いろんな言語でまとめてみた。

とりあえずは主に開発環境・テストについて。必要だったら他のフレームワークとかも列を増やしたいなー。

## まとめてみた

|言語|パッケージ管理|専用パッケージ形式|ビルド|仮想環境|複数バージョン管理|シンタックスチェック|テスト|
|:--|:--|:--|:--|:--|:--|:--|:--|
|Python|pip, pipenv|wheel, egg|setup.py, scons|virtualenv|pyenv, pythonbrew|pep8, pyflakes, flake8, mccabe, pylint|tox, nose, py.test|
|Ruby|gem, bundler|gem|rake|bundler|rbenv, rvm, rubybrew|robocop|rspec, appraisal|
|Go|go get, godep||go build||goenv|golint|go test|
|Perl|cpan, cpanminus|||carton|plenv, perlbrew|perlcritic|prove|
|Node.js|npm, bower (web)||grunt, gulp, webpack (web) |npm (node_modules)|nvm, nodeenv, nodebrew |eslint, jshint, jslint|mocha|
|PHP|pear, composer|phar|phing|onion|phpenv, phpbrew|phplint|phpunit|
|Java|maven|jar|ant, maven, gradle||jenv|lint4j|java -cp junit.jar|


コマンドラインで打つときのイメージなので、基本的に全て小文字に揃えています。
例えば、 ```RSpec``` という技術名ではなく ```rspec``` のようにコマンド名で記載しています。
逆引き Mac キーボードショートカット

# メニューバーの操作

|やりたいこと|キー操作|
|----------|-------|
|メニューバーにフォーカス|Ctrl + F2|
|メニューバー内を移動|カーソルキー|
|メニューバー内で決定|スペースバー|

# Docの操作

|やりたいこと|キー操作|
|----------|-------|
|Docにフォーカス|Ctrl + F3|
|Doc内を移動|カーソルキー左右|
|Doc内で決定|スペースバー|
|アプリケーションメニューを開く/移動|カーソルキー上下|
|メニュー内確定|スペースバー|

# スクリーンショット

|やりたいこと|キー操作|
|----------|-------|
|全体をキャプチャ|Cmd + Shift + 3|
|指定範囲をキャプチャ|Cmd + Shift + 4 で範囲選択開始、クリックで範囲確定|

# スクリーンの操作

*Ejectキーが無いキーボードでは、パワーキーで代用できます*

|やりたいこと|キー操作|
|----------|-------|
|スリープ|Command + Option + Eject|
|ディスプレイのみスリープ|Ctrl + Shift + Eject|
|全画面表示のアプリケーションを切り替え|Ctrl + カーソルキー左右|
CircleCIからGitHubにipaファイルをリリースする

[hub](https://github.com/github/hub) コマンドを利用します。

## アクセストークンの準備

GitHubの画面にて、Personal access tokensを取得しておいて下さい。
CircleCI側のEnvironment variablesにて、

- Name: GITHUB_ACCESS_TOKEN
- Value: GitHubにて取得したPersonal access tokens

を設定しておきます。

## circle.ymlの設定

```circle.yml
dependencies:
  pre:
  - brew install hub
deployment:
  master:
    branch: master
    commands:
      - ./scripts/add-key.sh
      - ./scripts/build-deploy.sh
      - ./scripts/remove-key.sh
```

## 実際のスクリプトの設定

```bash:scripts/build-deploy.sh
... # $APP_DIR/$APPNAME.ipa にipaファイルを作成したり

echo "********************"
echo "*  GitHub Release  *"
echo "********************"
export HUB_CONFIG="$PWD/hub_config"
echo "github.com:" > $HUB_CONFIG
echo "- user: $CIRCLE_PROJECT_USERNAME" >> $HUB_CONFIG
echo "  oauth_token: $GITHUB_ACCESS_TOKEN" >> $HUB_CONFIG
hub release create -p -a $APP_DIR/$APPNAME.ipa -m "Build: $CIRCLE_BUILD_NUM" "v`date '+%Y%m%d%H%M%S'`"
```

としておくと、
`v20150325232207` といったタグが作成され、
`Build: 39` といった名前で、
ipaファイル付きの
Releaseが作成されます。
（ [こんな感じ](https://github.com/noboru-i/kyouen-ios/releases/tag/v20150325235816) に見える）
SonarQubeドキュメント和訳 ソースコードの解析 - Analyzing Source Code

SonarQube(http://www.sonarqube.org/ )のドキュメントを翻訳していきます。

こちらはSonarSource社の提供する下記のページの翻訳です。
http://docs.sonarqube.org/display/SONAR/Analyzing+Source+Code


---
SonarQubeのインストールが完了し、analyzerをインストールすれば、プロジェクトを解析する準備はできています。

#解析のスコープ：ファイルの型とデータ
SonarQubeは20以上の言語の解析を実行できます。
この解析の結果は品質の尺度と課題(コーディングルール違反)になるでしょう。
しかし、解析結果として得られるものは言語によって異なります。：

* 全ての言語で、解析対象のデータはSCMプロバイダーから自動的にインポートされます。GitとSVNは自動的にサポートされます。ほかのプロバイダーはプラグインを追加する必要があります。 
* 全ての言語において、ソースコードの静的解析が実行されます(Javaファイル、COBOLプログラムなど)。
* コンパイルされたコードの静的解析もいくつかの言語で実行できます(Javaの.classファイルやjar,C#の.dllファイルなど)。
* 動的解析もいくつかの言語で実行可能です(JavaやC#での単体テストの実行など)


#解析のスコープ：どのファイル?
SonarQubeの解析には3つの違ったパラダイムが存在します。
全解析(もしくは通常の"解析"),プレビュー分析,そして増分分析です。
"sonar.analysis.mode"の設定値に下記の3つの解析用パラメータのうち1つを指定することで、3つのモードを切り替えます。：

* analysis -デフォルト値です。このモードでは対象になっている言語の解析可能なものは
全て解析し、結果をデータベースに保存します。
* preview - これはたとえば、Gitのmasterにmergeするかの判断など、そのコードの変更が次に進むために十分正しいか測定するために使います。
* incremental - 増分分析は開発者のローカル環境で変更されたファイルで技術的負債が増えているかを、チェックインする前に検査するために使います。


#解析中
解析中はサーバからデータが要求され、対象のファイルが分析され、結果のデータがサーバに送られます。これらの相互作用はほとんどが同期して発生します。
しかし、いくつかの更新は解析の完了後に保存され、バッチファイルでサーバに送信され、非同期で処理されます。これらのバッチファイルはキューに格納されシーケンシャルに処理されます。
そのため、解析完了ログが出力されたあと、更新された値がSonarQubeのプロジェクト上で見えない期間をかなり短くすることが可能です。

#解析の実行
まず、直接ダウンロードするか、アップデートセンターを通して、解析されるプロジェクトの言語のpluginをインストールします。
そして、解析方法を選びます。可能な方法は下記の通りです。
※訳注：リンク先は本家のサイトです

* [Analyzing with SonarQube Runner](http://docs.sonarqube.org/display/SONAR/Analyzing+with+SonarQube+Runner) (recommended analyzer)
* [Analyzing with SonarQube Ant Task](http://docs.sonarqube.org/display/SONAR/Analyzing+with+SonarQube+Ant+Task)
* [Analyzing with Maven](http://docs.sonarqube.org/display/SONAR/Analyzing+with+Maven)
* [Analyzing with Gradle](http://docs.sonarqube.org/display/SONAR/Analyzing+with+Gradle)
* [CI Engines](http://docs.sonarqube.org/display/SONAR/Continuous+Integration)


#互換性のマトリクス
このチャートは各解析エンジンの現在のバージョンとの下位互換を示します。

|SonarQube Version|3.7 <br>LTS|4.0|4.1|4.2|4.3|4.4|4.5<br>LTS|5.0| 
|:-----------|:------------|:-----|:----|:-----|:----|:----|:----|:----|
|SonarQube Ant Task|2.2|2.2|2.2|2.2|2.2|2.2|2.2|2.2|
|Maven|2.2.x,<br>3.0.x,<br>3.1+|2.2.x,<br>3.0.x,<br>3.1+|2.2.x,<br>3.0.x,<br>3.1+|2.2.x,<br>3.0.x,<br>3.1+|2.2.x,<br>3.0.x,<br>3.1+|2.2.x,<br>3.0.x,<br>3.1+|2.2.x,<br>3.0.x,<br>3.1+|3.0.x,<br>3.1+|
|SonarQube Runner|2.4|2.4|2.4|2.4|2.4|2.4|2.4|2.4|


---
※こちらの翻訳の元のページとその著作権表示は下記の通りです
http://docs.sonarqube.org/display/SONAR/Requirements
© 2008-2014, SonarSource S.A, Switzerland.
form_forにFormオブジェクトを渡したとき、method属性に適切な値が入らなかった


form_forにActiveRecord::Baseのオブジェクトを渡せば、
新規登録の場合は`method="post"`、編集の場合は`method="patch"`に自動設定してくれる。
けれども以下のように定義したFormオブジェクトを渡すと、
新規の場合も編集の場合も`method="post"`になってしまっていた。

```ruby:user_form.rb
class UserForm
  include ActiveModel::Model
end
```

結論として、`persisted?`メソッドを定義していなかったのが原因だった。

http://railsdoc.com/references/persisted%3F

`form_for`メソッド内で、`persisted?`メソッドの結果によって、
method属性を決定している。

DBからデータを読み込んで、Formオブジェクトを生成したときは、
`persisted?`メソッドが`true`になるように実装すれば良い。
Celluloid::Loggerのerrorがthorのerrorに負ける

[celluloid](https://github.com/celluloid/celluloid)を使う機会が出たので、ついでにCelluloid::Loggerを使ってみたところ、Celluloid.logger.errorがthorのerrorに優先されてしまい期待通りの動きをしてくれなかった。

### 期待通り動かない場合
* 以下を実行するとsample.logにerrorが出力されずにstdoutに出力される

```rb
require 'thor'
require 'celluloid'
include Celluloid::Logger
Celluloid.logger = ::Logger.new("sample.log")

class SampleThor < Thor
  desc "test", "sample"
  def test
    error "test"
  end
end

SampleThor.start(ARGV)
```

* Celluloid.loggerのerrorでなくThor::Shell::Basicのerrorが呼ばれてしまうため  
https://github.com/erikhuda/thor/blob/master/lib/thor/shell/basic.rb#L289-L291

### それならばThor::Shell::Basicをoverrideしてしまえ
* Thor::Shell::Basic.errorをCelluloid.logger.errorにしてしまう

```rb
Thor::Shell::Basic.class_eval do
  def error(statement)
    Celluloid.logger.error(statement) if Celluloid.logger
  end
end
```

* 上のサンプルを書き換えると期待通りsample.logにエラーが出力される  
debug,info,warnはCelluloid::Loggerのものがそのまま使える

```rb
require 'thor'
require 'celluloid'
include Celluloid::Logger
Celluloid.logger = ::Logger.new("sample.log")

Thor::Shell::Basic.class_eval do
  def error(statement)
    Celluloid.logger.error(statement) if Celluloid.logger
  end
end

class SampleThor < Thor
  desc "test", "sample"
  def test
    error "test"
  end
end

SampleThor.start(ARGV)
```
paperclipのURI Obfuscationするときはmysqlのmillisecondsに気をつけよう


URIを曖昧化したいので、よくやります。

## require

- [paperclip](https://github.com/thoughtbot/paperclip)
- rails


## やろうとしていること

https://github.com/thoughtbot/paperclip#uri-obfuscation

avatar画像をユーザーごとに一意性を担保＋セキュリティ担保のために曖昧化したい。

## 問題点

更新時にインスタンス上に持っていた値と、
なんでかDB上のavatar_file_updated_atとインスタンス上に持っていたavatar_file_updated_atが１秒ずれる


```rb
  def update_resource(resource, params)
    unless params[:password].blank?
      resource.update_with_password(params)
    else
      resource.update_without_password(params)
      puts "###############################"
      puts resource.avatar.updated_at.to_i
      puts resource.reload.avatar.updated_at.to_i
      puts "###############################"
      binding.pry
      resource
    end
  end

###############################
1427116216 
1427116217 #-> あれぇぇぇ？
###############################

```

## 原因

で、そのハッシュを作るには主に、hash_secretとhash_dataを使います。

https://github.com/thoughtbot/paperclip/blob/e195ef66978636ac93cab949bf322568ed291f1c/lib/paperclip/attachment.rb#L317

```ruby
    def hash_key(style_name = default_style)
      raise ArgumentError, "Unable to generate hash without :hash_secret" unless @options[:hash_secret]
      require 'openssl' unless defined?(OpenSSL)
      data = interpolate(@options[:hash_data], style_name)
      OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get(@options[:hash_digest]).new, @options[:hash_secret], data)
    end
```

そのhash_dataはこんな感じです。

https://github.com/thoughtbot/paperclip/blob/e195ef66978636ac93cab949bf322568ed291f1c/lib/paperclip/attachment.rb#L19

```rb
        :hash_data             => ":class/:attachment/:id/:style/:updated_at",
```

で、これのupdated_atが含まれているからhash値が変わってしまう。

## 解決策

generate migrationにある`t.attachment :avatar`はよく考えればmicrosecond対応していない。

こいつのせいで丸められてしまっている忘れてた。なので、mysql側をちゃんとmicrosecondに対応させるだけです。

```rb
  def up
    change_column :suppliers, :avatar_updated_at, :datetime, limit: 6
  end
```

postgreに早く変えたい。
unix command

# chattr ファイルにimmutable属性を付ける.そのファイルは root権限でも rmできない。ext2,3,4
````
$ sudo touch hoge
$ sudo chattr +i hoge
$ sudo rm -f hoge
rm: cannot remove ‘hoge’: Operation not permitted
$ sudo chattr -i hoge
$ sudo rm -f hoge
````

# プロセスが使用しているファイルを探す。
ghostの件でlibcを探した
```
 lsof | grep libc | awk '{print $1}' | sort | uniq
```
Homesteadの設定を変更する

homesteadをインストールしたディレクトリにVagrantファイルがあるので、これを変更することでVMの設定を変更できる。例えばVMが上手く起動しない場合などは

```
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
...
  config.vm.provider :virtualbox do |vb|
    vb.gui = true
  end
end
```

と書いておけばGUIモードで起動する。

homesteadをインストールしたディレクトリは、composer globalグローバルでインストールしていれば以下のコマンドで調べられるCOMPOSER_HOMEの下の`/vendor/laravel/homestead/`となる。

```
$ composer config --global home
```
ScalatraでFormDataを受け取る(その2)

[前回](http://qiita.com/nemuzuka/items/75321316e161cfd6e490)、multiParamsで取るような配列の要素を送るときは...
なんて勿体ぶりまりましたが、要素がダブって設定されるという事象が生じます。

具体的には、

```html
<form action="/file" method="post" enctype="multipart/form-data">
    <input type="text" name="datas" value="abc">
    <input type="text" name="datas" value="def">
    <input type="text" name="datas" value="123">
    <button value="submit">submit</button>
</form>
```

というようなformをpostした時に、
multiParams["datas"]で取得すると、

> index 0:[abc]
index 1:[def]
index 2:[123]

という3つの要素の配列が取得できると思っていたのですが、

実際には
> index 0:[abc]
index 1:[def]
index 2:[123]
index 3:[abc]
index 4:[def]
index 5:[123]

と要素の数が倍になってしまいました。

バグだったのでしょうが、とりあえずの対応としては、

> 配列の個数もリクエストパラメータにのせ、サーバ側でslice

というなんともはや、な処理をする必要がありました。
(checkboxとか面倒なことこの上なし)


**後日談**
何とかこのことを伝えたい、でも英語でissue書けないよ...と思ったところ、Scalatraのメンテナをされている瀬良さん(@seratch_ja)に辿り着き、いきなりメールを送りつけたにもかかわらず、対応してもらいました！

[2.3、2.4系に取り込まれた](https://github.com/scalatra/scalatra/pull/474)みたいですね。
これでScalatraを使わない理由が１つ無くなりました。
jsonデコード（go-simplejson利用）

こんにちは。
goでjsonデコードを行ってみました。go-simplejsonを利用して取り込んだデータをデコードし文字列へ変換しています。（元の入力内容が出力されれば正常）

```
$ go run json2str.go "{\"key\": {\"country\": \"日本\", \"n\": 0}, \"values\": [1,2]}"
{"key":{"country":"日本","n":0},"values":[1,2]}
```

```json2str.go
package main

import (
  "os"
  "fmt"
  "strings"
  "encoding/json"
  "github.com/bitly/go-simplejson"
)

func main() {
	for _, arg := range os.Args[1:] {
		j, err := simplejson.NewJson([]byte(arg))
	    if err != nil {
	        panic(err)
	    }
	    fmt.Println(json2str(j))
	}
}

func interface2json(x interface{}) *simplejson.Json {
	j := simplejson.New()
	j.SetPath([]string(nil), x)
	return j
}

func json2str(j *simplejson.Json, prependstr ...string) string {
	data := j.Interface()
	str := strings.Join(prependstr, "")
	sep := ""
    switch data.(type) {
    case json.Number:
		str = fmt.Sprint(str, data.(json.Number))
    case float64:
		str = fmt.Sprint(str, data.(float64))
    case bool:
		str = fmt.Sprint(str, data.(bool))
    case nil:
		str = fmt.Sprint(str, "null")
    case string:
		str = fmt.Sprint(str, "\"", data.(string), "\"")
    case []interface{}:
		str = fmt.Sprint(str, "[")
        for _, v := range data.([]interface{}) {
            str = json2str(interface2json(v), str, sep)
			sep = ","
        }
		str = fmt.Sprint(str, "]")
    case map[string]interface{}:
		str = fmt.Sprint(str, "{")
        for k, v := range data.(map[string]interface{}) {
            str = json2str(interface2json(v), str, sep, "\"", k, "\":")
			sep = ","
        }
		str = fmt.Sprint(str, "}")
    default:
    }
	return str
}
```
DOMに依存しない理想のイベント処理を考察

#はじめに

「文書構造はHTMLに、処理はJavaScriptにしっかり分離しましょう。 HTMLにonclickとか書くのはダメ」と覚えてから、これまで当たり前のようにそういう考え方でやってきましたが、AngularJSを触りだした頃から、その感覚に変化を感じてます。

AngularJSを見ていると、例えばngClickなどはHTMLに呼び出す関数を書くスタイル（宣言的なイベントハンドラ）がデフォルトで、HTMLから分離していません。


```html:html
<button ng-click="test()">click</button>

```
```rb:js

$scope.test = function() {
      alert("hello");
};

```

けれども、この手法に従うなら、test()という関数がコントローラに登録されていて、DOMセレクタのことをいちいち考える必要はありませんし、挙動（振る舞い）を直接HTMLのノードに適用するだけなので、実装もメンテナンスも楽に感じます。
DOMとの面倒なやり取りも省略できますし、とにかく分かりやすい。


#一般的な概念では分離するのが基本

「文書構造はHTMLに、処理はJavaScriptにしっかり分離する」という概念に基づけば、
このような形が一般的でしょう


```html:html

<button id="test">click</button>

```
```ruby:js

document.getElementById("test").onclick = function (){
	alert("hello");
}

```

jQueyだとこんな感じかな

```js:

$("#test").on("click",function(){
	alert("hello");
});



```
しかし、何故こういうコードを追い求めるのか？
おそらく以下のように思っている方が多いのでは無いかと

- javascriptをオフにしている人がいる
- イベント処理の呼び出し方法がブラウザごとに異なる
- 文書構造と挙動（振る舞い）をミックスさせると、難読で保守しづらいコードができあがる

ですが、今時javascriptをオフにしている人なんて殆どいませんし、イベント処理の呼び出し方法も知識さえ身につけておけば、ブラウザごとの解釈の差は回避できますし、読みづらくなる・スパゲティ化するというならば、jQueryのセレクタのような、DOMのノードツリーに依存するコードの方が、読みづらくなる・スパゲティ化の原因になることが多いように感じます。

例えば

```
$("li.katsuo").parent("#isono").next("#isasaka")

```
#####"カツオが暮らす磯野家の隣家の伊佐坂家"　みたいな



#プログラムの原点に立ち戻って

書くなら、このような形でしょう。

```html:html

<button onclick="test()">click</button>

```

```ruby:js

function test(){
	alert("hello");
}

```
でも、何か違う。タグ内にスクリプトを書くのは気持ち悪い。
ではどうするか？

次のような要素の挙動を制御する記述的属性を適用するのが理想だと思います。

```html:html

<button data-alert="hello">click</button>
<button data-alert="world">click</button>
・・・・
・・・・
```

```js:js

var alertObj = document.querySelectorAll('[data-alert]');
for(var i in alertObj) {
	alertObj[i].onclick = function (){
		alert(this.dataset.alert);
	}
};

```

これなら要素が変動しても、data属性を付与さえすれば済みますし、属性の値と処理をバインディングできるので、シンプルで保守的です。

前述したように最近はHTML内部のこのようなロジックが好きです。
これまで長い間、コンテンツ（HTML）と挙動・振る舞い（JavaScript）を分離し、（CSSもそうですが）インラインのスクリプティングを避け、とにかく「外部ファイル化！外部ファイル化！」声高らかに叫んできましたが、実際に考えをちょっと変えてやってみると大幅に時間を節約でき、尚かつコンポーネント自体も柔軟になることが分かりました。

#まとめ

jsのロジックをHTMLに埋め込んでもいいんじゃないか。
ただ、HTMLに埋め込むだけではなく、設定を付与する形で。
Capistrano 3でパスワードつきsudoをする方法

Capistrano 3はパスワード入力が必要な`sudo`をサポートしていない訳ですが、不便なので、パスワードつき`sudo`するための[sshkit-sudo](https://github.com/kentaroi/sshkit-sudo)というgemを作ってみました。

このgemを入れ、`Capfile`内で`require 'sshkit/sudo'`すると、SSHKitに`sudo`コマンドが追加され、Capistrano 3のタスク内から`sudo`コマンドを呼び出すことができるようになります。

以下のように使います。

```rb
namespace :nginx do
  desc 'Reload nginx'
  task :reload do
    on roles(:web), in: :sequence do
      sudo :service, :nginx, :reload
    end
  end
end
```

github: [sshkit-sudo](https://github.com/kentaroi/sshkit-sudo)
使い方: [Capistrano 3でパスワード付きsudoを実行する方法](http://kentaroimai.com/articles/11-Capistrano%203でパスワード付きsudoを実行する方法)
モバイルアプリ用UIフレームワークの簡易比較

今回はモバイルアプリ作成時に使用できるUIフレームワークの違いや特徴を（大雑把に）まとめてみます。※あくまでも個人的な意見です。
対象のフレームワークは以下の4つです。

* jQueryMobile：[http://jquerymobile.com/](http://jquerymobile.com/)
* Ionic：[http://ionicframework.com/](http://ionicframework.com/)
* OnsenUI：[http://ja.onsen.io/](http://ja.onsen.io/)
* Famo.us：[https://famo.us/](https://famo.us/)

上記4つはまず2つに大別できます。
すなわち、**jQuryMobile** or **その他(Ionic, OnsenUI, Famo.us)**です。

## **jQueryMobile** or **その他のフレームワーク**
この2つはどちらもスマートデバイス用アプリ向けUIの作成を目的としていますが、主な違いとして
jQueryMobileは**Webアプリ**用のUIの作成を主目的としており、Ionicなどは**ハイブリッドアプリ**用UIの作成を主目的としていることが挙げられます。

もちろん、jQueryMobileでハイブリッドアプリのUIを作ったり、その他のフレームワークでスマートデバイス用のWebアプリのUIを作成することは可能です。

また、jQueryMobileは一般的にパフォーマンスがよくないと言われており、これに対してIonicなどはパフォーマンスを改善する工夫が凝らされているということにも注目すべきかと思います。

## **Ionic** or **Onsen UI** or **Famo.us** ##
これらは全てハイブリッドアプリのUIを作成することを主目的としているフレームワークです。
まずはそれぞれの特徴を以下にまとめます。
### **Ionic** ###
* AngularJSをベースとしている
* Android 4.0以上(2.3系にも一部対応)、iOS 6以上に対応している
* Cordova, PhoneGap, Trigger.ioをサポートしている
* GUIベースでIonicアプリのテンプレート(UI)が作成可能な、Ionic Createrを提供している
* SASS(Syntactically Awesome Style Sheets)を用いて独自のUIを実装できる
* 公式のフォーラムが活発で、StackOverflowなどの投稿も多く比較的情報が探しやすい

### **Onsen UI** ###
* AngularJS, jQueryで利用できる
* Android 2.3以上、iOS 6以上に対応の他、FirefoxOS, Chrome, Safariに対応している（Windows Mobile 8.1にも対応予定）
* Cordova, PhoneGapをサポートしている
* Monaca IDEを使用してテンプレートをカスタマイズできる
* CSS周りに、パフォーマンス重視のTopcoatライブラリを使用している
* 和製のフレームワークである（日本語のドキュメントがある）

### **Famo.us** ###
* AngularJSとの連携が可能
* Android 4.1以上、iOS 4.3以上、Kindle, FirefoxOSに対応している
* Cordova, PhoneGap, Trigger.io, Crosswalkをサポートしている
* 独自のレンダリング技術を採用し、60fpsの高パフォーマンスを発揮できる
* 3D物理エンジンが組み込まれており、より直観的なアニメーションを実現できる

以上がそれぞれの特徴としてあげられますが、ここからは個人的な意見を述べたいと思います。

まず**Ionic**ですが、上記3つのフレームワークの中で最初に登場したこともあり、コミュニティが広くかつ活発で、情報が見つけやすい（学習しやすい）というのが最大のメリットではないかと思います。
また、公式のGet Startedが非常にシンプルでわかりやすく、比較的すぐに試せるということもよい点ではないでしょうか。
反面、パフォーマンスの観点から見ると他2つのフレームワークよりも多少見劣りするという印象を受けました。

続いて**Onsen UI**ですが、現時点での対応プラットフォームが多く、iOSやAndroidなどのモバイルアプリのみでなくChromeやSafariといったWebブラウザ上での動作もサポートしていることがメリットだと思います。
また、日本人としてはやはりドキュメントが日本語で用意されているのは嬉しいポイントですね。
ただ、Ionicと比べると普及具合に難があり、インターネット上でサンプルやバグの情報などを探すのには多少骨が折れそうだという印象を受けました。

最後に**Famo.us**ですが、特筆すべきメリットはなんといってもパフォーマンスの高さです。[こちら](http://codepen.io/befamous/)にあるサンプルをいくつか試してみましたが、圧倒的な滑らかさに驚かされました。
3つの中で最も後発ということもあり、Onsen UI同様サンプルなどを探すことが難しかったり、デフォルトのテンプレートやGetting Startedのドキュメントが不足していたりと、比較的敷居が高い印象は受けましたが、今後が一番楽しみであるフレームワークと言えそうです。

***
最後になりますが、どのフレームワークもそれぞれのメリットを持っており、それゆえに何を使えばよいか迷うことは避けられないと思います。
そんなとき、今回の内容が少しでも役に立つことを願っています。
※記載している情報に間違いなどあれば、ご指摘いただけると嬉しいです。

参考：
[http://www.gajotres.net/ionic-vs-onsenui/](http://www.gajotres.net/ionic-vs-onsenui/)
[http://www.gajotres.net/best-html5-mobile-app-frameworks-famo-us-review/](http://www.gajotres.net/best-html5-mobile-app-frameworks-famo-us-review/)
[https://www.airpair.com/ionic-framework/posts/hybrid-apps-ionic-famous-f7-onsen](https://www.airpair.com/ionic-framework/posts/hybrid-apps-ionic-famous-f7-onsen)
Javaで暗号化（ハッシュ）

Javaで暗号化（ハッシュ値取得）しなきゃならなくなりまして、面倒だなぁと思いながらも調べてみたら簡単にできました。
忘れても大丈夫なように残しておきます。
パラメータ`algorithmName`に標準名でアルゴリズムを指定すればそのアルゴリズムで暗号化してHex化した文字列を取得できます。

使えるアルゴリズムは[標準名 > MessageDigest](https://docs.oracle.com/javase/jp/6/technotes/guides/security/StandardNames.html#MessageDigest)のところに書いてありまが、下記の通りです。

* MD2
* MD5
* SHA-1
* SHA-256
* SHA-384
* SHA-512

```java:exsample.java
private String toEncryptedHashValue(String algorithmName, String value) {
    MessageDigest md = null;
    StringBuilder sb = null;
    try {
        md = MessageDigest.getInstance(algorithmName);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    md.update(value.getBytes());
    sb = new StringBuilder();
    for (byte b : md.digest()) {
        String hex = String.format("%02x", b);
        sb.append(hex);
    }
    return sb.toString();
}
```

16進文字列化の部分は`Hex.encodeHex@org.apache.commons.codec.binary.Hex`を使えば自前で作る必要ないですが、諸事情でライブラリ追加ができないのでこうなりました。
バカほど呼び出される関数というわけでもないのでこれでよしとしておきます。