OmniAICreator/Qiita-1.07M huggingface dataset:
日本語をＵＲＬ用ローマ字に変換するgem Zipangを作った

railsでブログみたいなものを作っているとURLにidだけではなくタイトルを使いたいなって時がよくあるんですが、そのまま日本語として使うと%だらけで読みにくい

```
URI.escape "日本語のタイトル"
=> "%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB"
```

これでもいいのかどうかは人それぞれなんですが、個人的にあんまりやりたくないんですよね。
なので以下のようになるgemを作りました

```
Zipang.to_slug "日本語のタイトル"
=> "nihonngo-no-taitoru"
```

__zipang | RubyGems.org__
http://rubygems.org/gems/zipang

slugという名称は一般的なのかわかりませんが、WordPressでよく出てくるやつでこれにぴったりだと思ったので採用しました。

kuromoji と romaji に依存しています

__kuromoji | RubyGems.org__
http://rubygems.org/gems/kuromoji

__romaji | RubyGems.org__
http://rubygems.org/gems/romaji
AWS SDK for PHP v3 Preview with JSON support

[AWS SDK for PHP v3](https://github.com/aws/aws-sdk-php/tree/v3) で非同期を試してみたのと、ブランチで開発された json サポートをパッチとして適用してみて動作確認してみた。

## composer.json

```json
{
    "require": {
        "aws/aws-sdk-php": "~3.0@dev"
    }
}
```

## jsonサポートをパッチとして適用してみる

```bash
$ cd vendor/aws/aws-sdk-php
$ wget https://github.com/aws/aws-sdk-php/commit/fb0d0b98918477af3b46165036928493c6b8a72b.diff
$ patch -p1 < fb0d0b98918477af3b46165036928493c6b8a72b.diff
patching file src/DynamoDb/Marshaler.php
patching file tests/DynamoDb/DynamoDbClientTest.php
patching file tests/DynamoDb/MarshalerTest.php
```

## DynamoDBにデータを入れてみる

```php
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Marshaler;

$ddbClient = DynamoDbClient::factory([
    'region'  => 'ap-northeast-1',
    'version' => 'latest',
    'key'     =>  '<your aws key>',
    'secret'  =>  '<your aws secret>'
]);

$doc = <<<JSON
{
  "content": {
    "to": ["123412"],
	"id": "4444",
	"text": "ほげほげ",
	"createdTime": 1418790948656,
  },
  "createdTime": 1418790948679,
  "id": "1234",
  "to": ["12341234"]
}
JSON;

/** @var \Aws\Common\FutureResult $ddbResult */
$ddbResult = $ddbClient->putItem([
    'TableName' => 'table_name',
    'Item' => [
        'id'          => [ 'S' => $id ],
        'createdTime' => [ 'N' => (string)$createdTime ],
        'doc'         => [ 'M' => (new Marshaler)->marshalDocument(json_encode($doc)) ],
    ],
    '@future' => true
]);

$dbbResult->then(
    function ($result) {
        /** @var Aws\Common\Result $result **/
        echo 'done';
    },
    function (\Exception $e) {
        echo 'fail';
    }
);
```

createdTime のところを文字列にキャストしているのは、```Error executing Aws\DynamoDb\DynamoDbClient::putItem() on "https://dynamodb.ap-northeast-1.amazonaws.com"; SerializationException (client error): class java.lang.Long can not be converted to an String``` って起こられたので...。


こんな感じにデータが入りましたとさ

![スクリーンショット 2014-12-17 14.32.58.png](https://qiita-image-store.s3.amazonaws.com/0/4725/68392eda-2d6b-f74e-92f7-99e00cc42d6e.png)
サーバ上のファイルの文字コードを確認する

## 1. 概要

`nkf`コマンドを用いて、サーバ上のファイルの文字コードを確認する方法を示す。

## 2. インストール方法

`yum`によりインストールできる。

```
$ yum install nkf
```

Amazon Linux AMIの場合など、パッケージが見つからない場合は`rpm`よりインストールする。

```sh:インストール
$ wget http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm
$ rpm -ivh nkf-2.0.8b-6.2.el6.x86_64.rpm
```

## 3. 使用方法

```
$ nkf -g test.txt
UTF-8 (LF)
```

## 4. オプションについて

- http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230849/

## 5. 参考

- http://tkuchiki.hatenablog.com/entry/2012/12/01/004833
zabbix-java-gatewayでtomcat7を監視する

zabbix_java_gatewayを使って、zabbixでtomcat7の監視を行います。
zabbix-serverとtomcat7はインストール済みとし、
zabbix-java-gateway・zabbix-server・tomcatは全て同じEC2インスタンスにインストールします。

#hostnameの確認
```
hostname -i
10.0.10.39
```
127.0.0.1でなく、複数IPではないことを確認します。

#zabbix_java_gatewayのインストールと設定
`yum install zabbix-java-gateway`
zabbix_java_gatewayを起動させます。
`/etc/init.d/zabbix-java-gateway start`
zabbix_java_gatewayをDaemonに登録します。
`chkconfig zabbix-java-gateway on`

zabbix-server側の設定を行います。

```lang:/etc/zabbix/zabbix_server.conf
JavaGateway=10.0.10.39[zabbix java gateway ip]
JavaGatewayPort=10052[zabbix java gateway default port]
StartJavaPollers=1
```
設定を反映させるために、zabbix-serverの再起動を行います。
`/etc/init.d/zabbix-server restart`

#tomcat側設定
起動ファイルにJVMの設定を追加記載します。

```lang:/etc/init.d/tomcat
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=12345  -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
```
設定反映のために、tomcatを再起動します。
`/etc/init.d/tomcat restart`

#zabbixの管理画面のJMX設定
* zabbixの管理画面にログインし、「設定> ホスト > Zabbix server」をクリックします
![スクリーンショット 2014-12-17 13.09.06.png](https://qiita-image-store.s3.amazonaws.com/0/63175/72af6968-dc97-cdb3-4a6b-86b75ce2586d.png)

* JMXのインタフェースを追加します
　tomcat7をインストールしているサーバーのipアドレスと、
　CATALINA_OPTSで指定したポート(jmxremote.port=12345)を入力して下さい。
![スクリーンショット 2014-12-17 13.30.58.png](https://qiita-image-store.s3.amazonaws.com/0/63175/71ab0baf-90e1-ce25-f94a-a15ae4aeeb31.png)

* テンプレートの追加を行います
　zabbixにはデフォルトでJMX tomcatテンプレートとJMX Genericテンプレートがあるので、追加します。
![スクリーンショット 2014-12-17 13.14.19.png](https://qiita-image-store.s3.amazonaws.com/0/63175/8a068e54-f60c-9fe1-5369-5cd8da080077.png)
「更新ボタン」を押せば、登録は完了です。

#テンプレートの書き換え
tomcat7ではmanagerのステータスを取るxmlが変わっています。
デフォルトのテンプレートにあるname=http-8080では、ステータスが取れません。
なので、テンプレートのname=http-8080を「name="http-bio-8080""」に
書き換えてあげる必要があります。

```lang:http-8080-threads-max
jmx["Catalina:type=ThreadPool,name=\"http-bio-8080\"",maxThreads]
```

あとは、プロジェクトごとに必要なトリガーやグラフを作成すれば、設定完了です！
Qiitaのomniauthを作ってた

みんな大好きomniauthのQiitaを作って忘れてました。

## omniauth
Railsでソーシャルログインするときにスタンダードになってる方法としてomniauthがあります。
色々な認証の統一的手法を目指しているomniauthですが、なかでもoauth2に対応しているものとしてfacebook等の有名サービスがあります。

QiitaにもOAuth2認証のAPIがあり、omniauthに対応させることができそうですね。

## omniauth_qiita
ということで作ったのが[こちら](https://github.com/tmiyamon/omniauth_qiita)。
少し前に作ったのですがハッカソン参加してたり意外に忙しかったりで周知してませんでした。

### install
いつものとおり
```
gem 'omniauth_qiita'
```

### auth_hash
```rb
{
  :provider => "qiita",
  :uid => "tmiyamon",
  :info => {
    :nickname => "tmiyamon",
    :name => "Takuya Miyamoto",
    :location => "Tokyo, Japan",
    :image => "https://....",
    :description => "An awesome engineer",
    :urls => {
      :Facebook => "https://www.facebook.com/...",
      :Github => "https://github.com/tmiyamon",
      :Twitter => "https://twitter.com/..."
    }
  },
  :credentials => {
    :token => "abc...",
    :expires => false
  },
  :extra => {
    :raw_info => {
      :description => "An awesome engineer",
      :facebook_id => "...",
      :followers_count => 5,
      :followees_count => 0,
      :github_login_name => "tmiyamon",
      :id => "tmiyamon",
      :items_count => 3,
      :linkedin_id => "",
      :location => "Tokyo, Japan",
      :name => "Takuya Miyamoto",
      :organization => "",
      :profile_image_url => "https://...",
      :twitter_screen_name => "...",
      :website_url => "http://tmiyamon.github.io"
    }
  }
}
```
auth_hashの中身はできるだけ[omniauthのスキーマ](https://github.com/intridea/omniauth/wiki/Auth-Hash-Schema)に沿うように作ってあります。
first_nameとlast_nameはnameをsplitすることで取れそうですが、片方が空だった場合nameからは判別できなくなるのでinfoには入れてありません。
詳しくはREADME及びsourceをご覧ください。
Raspberry PiでScalaを試してみる

#目的
Raspberry Pi(以下、RasPi)でScalaを動作、また開発を行える環境を整えてみる。

#インストール
##apt-getによるインストール
raspbianにおいてはScalaのパッケージが公開されているので、apt-getでインストールができます。とりあえずこれでScalaをRasPi上で動作させ、開発を行うことができます。

##sbtをインストール
Scalaのパッケージ単体でも開発を行えますが、やはりsbtが欲しいのでsbtを入れてみます。
[始めるsbt](http://www.scala-sbt.org/release/tutorial/ja/Installing-sbt-on-Linux.html)を見てみると、インストールする方法としては以下の方法があるようです。

* 手動インストール
* DEBパッケージ

とりあえず両方試してみたのでそれぞれについて。

###手動インストール
[手動インストール](http://www.scala-sbt.org/release/tutorial/ja/Manual-Installation.html)に従って設定したところ特に苦もなく動作しました。

###DEBパッケージによるインストール
debパッケージを[始めるsbt](http://www.scala-sbt.org/release/tutorial/ja/Installing-sbt-on-Linux.html)よりダウンロードしてきて`#gdebi sbt-0.13.7.deb`(2014/12/17現在)としてインストールを実行。(確かgdebiは標準で入っていないのでapt-getでgdebi-coreを入れた。)
これで`$sbt`で実行できるはずですが、実際に試したところ以下のエラーメッセージを吐いて終了してしまいました。

```
Java HotSpot(TM) Client VM warning: INFO: os::commit_memory(0x83540000, 715915264, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 715915264 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/pi/Temp/hs_err_pid6009.log
```

どうやらメモリが確保できなかった様子なので、メモリの設定を変更することに。
DEBパッケージでインストールした場合、設定ファイルは`/etc/sbt-launcher-packaging/`以下に置かれます。(実体は`/usr/share/sbt-launch-packageing/conf/`)
ここにある`sbtopts`に`-mem 512`と追記することで確保するメモリ容量を変更できます。
`512`は一例なので環境に合わせて変更してください。

これでsbtが実行できるようになりました。

##動作について
やはりというか動作がかなり遅い。
起動するだけで分単位で時間がかかるので、やはり快適な開発環境とは言えないようです。
sbtの起動やコンパイルに時間がかかるだけなので、アプリケーションを実行させるだけなら十分という感じがします。

sbtが動いたということで、PlayFrameworkを動作させてみましたが、一つのページを表示させるのに数分かかるので、実用は難しそうでした。
LaravelのEloquent ORMでCASE式を使う。

Laravel4.2のORMを使っていて全面的に生SQLを書きたくなったが、我慢した時のメモ。
結果、部分的にDB:raw()を使うだけです。

## コントローラー 
```php:app/controllers/UserController.php
<?php
namespace LaravelTest\Controllers;

use Illuminate\Routing\Controller;
use LaravelTest\Models\User;

/**
 * ユーザーコントローラー
 * @package LaravelTest\Controllers
 */
class UserController extends Controller {

  /**
   * ユーザー一覧
   * @return void
   */
  public function getUsers() {
    // ユーザ一覧取得
    $users = User::myPage();
    print_r($users->toArray());// dd($users);
  }
}
```

## モデル
```php:app/models/User.php
<?php
namespace LaravelTest\Models;

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
use Eloquent;
use DB;

/**
 * ユーザーモデル
 * @package LaravelTest\Models
 */
class User extends Eloquent implements UserInterface, RemindableInterface {

	use UserTrait, RemindableTrait;

	/**
	 * The database table used by the model.
	 *
	 * @var string
	 */
	protected $table = 'users';

	/**
	 * The attributes excluded from the model's JSON form.
	 *
	 * @var array
	 */
	protected $hidden = array('password', 'remember_token');
  
  // マイページ用の一覧
  public function scopeMyPage($query) {
    return $query->get([
      'name',
      DB::raw("DATE_FORMAT(created_at,'%Y.%m.%d') AS date"),
      DB::raw("(CASE sex WHEN 0 THEN '男性' WHEN 1 THEN '女性' END) AS sex")
    ]);
  }
}
```

さあみんなで名前空間を書く方のモダンなPHPerになりましょう。
[iOS] [Objective-C] Facebook API経由でmessageを送信する

## 結論
調べた限りはできないっぽい。

### chat api は 2015年4月でdepricated
chat api というものを使うとできたのかもしれないが、これは2015年4月にdeprecateされる。
https://developers.facebook.com/docs/chat?locale=ja_JP
代わりの案をFacebookが提供してくれるかは未定らしい(2014/12/17現在)

### URL Scheme
URL Scheme経由でデフォルトの友人とメッセージを設定して、messangerアプリを起動できたらいいなと思った。しかし、デフォルトの友人は設定できるが、メッセージの設定ができないようだ。
http://stackoverflow.com/questions/25467445/custom-uri-schemes-for-the-facebook-messenger

### 代替案
```objc
[FBDialogs presentMessageDialogWithLink:name:caption:description:picture:clientState:handler];
```

を使うしかないという結論になった。
これは送る友人を設定はできないが、送りたいURLは設定できる。
https://developers.facebook.com/docs/reference/ios/current/class/FBDialogs/

　


注：上記はあくまで僕が2014/12/17に調べた限りの結論です。
BitbucketやGithubにPUSHしたらサーバー側で自動PULLするNode.jsでのミニマム構成


BitbucketやGithubにPushしたときにサーバー側で自動pullさせたいときってよくあります。

けっこう処理複雑そうなイメージはありますが、 httpでPOSTを受け取ったらupdate()でコマンド実行って感じです。

**注意: 全体的にノンセキュリティなやり方なのでこのままやる場合は気をつけましょう。**

## 以下のソースコードをコピペ
サーバーに設置して実行しましょう。
3行目のcmdにコマンドを文字列で代入しておきます。 この場合`/var/www/htmlに移動`して `git pull` してますね。
Node.jsではexec()でコマンド実行出来るのでこれを利用しています。 ポートは3000です。

```deploy.js
var exec = require('child_process').exec
var http = require('http');
var cmd = 'cd /var/www/html && git pull origin master'; //git>コマンド設定

/*コマンド実行関数*/
function update() {
    return exec(cmd, {timeout: 90000},
        function(error, stdout, stderr) {
            console.log('stdout: '+(stdout||'none'));
            console.log('stderr: '+(stderr||'none'));
            if(error !== null) {
                console.log('exec error: '+error);
            }
        }
    )
};

http.createServer(function (req, res) {
  if(req.method == 'POST'){
        update();
  }
}).listen(3000);
```

###実行

通常起動

```
$ node deploy.js
```

or

デーモン化 (ex; pm2)

```
$ pm2 start deploy.js
```

##ホスティング側設定
### Bitbucketの場合
リポジトリのSetting -> フック -> POST -> ホックを追加 
でURLに`ホスト名(or IPアドアレス):ポート名`を設定します。
![](http://i.gyazo.com/48b0c1e35a7d7b80866816734cafaaad.png)

### Githubの場合
リポジトリのSetting -> Webhooks & Services -> Webhooks -> Add webhook 
でPayk¥load URLに`ホスト名(or IPアドアレス):ポート名`を設定します。あとはデフォルトのままで大丈夫です。 
![](http://i.gyazo.com/cd81a71703b844320419f1348fec6a0d.png)

## 注意: 全体的にノンセキュリティなのでこのままやる場合は気をつけましょう。
これだと全てのHOSTからでもpostされるので攻撃されちゃいます。また全てのpushが自動pullされるので注意してください。


## まとめ
カンタンに試すくらいなイメージで使ってください。
mitmproxy を使ってアプリの API を無理やり開発環境に向ける

# mitmproxy とは

mitmproxy は Man in the Middle Attack の要領で HTTP リクエストのを覗いたり改ざんするための HTTP プロキシサーバーです。
mitmproxy が生成する証明書を端末にインストールすることで、HTTPS 通信も同様に扱えます。

mitmproxy のインストール等についての詳細は以下の記事が参考になります。

* [iOS実機のSSL通信をプロキシによって傍受したり改ざんする方法](http://qiita.com/yimajo/items/c67cb711851f747c35e5)

# 今回やりたいこと

mitmproxy によるリクエストの改ざんは、Python スクリプトを書くことで行えます。
今回は以下のようなケースを想定して、手順を解説します。

* Web API へのリクエストを伴うスマートフォンアプリをデバッグしたい
* そのデバッグには手元の開発環境で動いている Web API を使いたい
* その開発環境を向いたアプリのビルドを用意することができない

機能ブランチ等から開発環境用のビルド・配布を自動化するなどして、解決することもできるでしょう。
ですが、そういった環境が用意できていないこともあるでしょう。
また、そういう環境があったとしても、複数の環境を何度も切り替えながら確認したいときなどは、複数のアプリを立ち上げなおしたりしてやるよりも、リクエストの改ざんで済ませた方が楽なこともあります。

# 手順

## mitmproxy をインストールする

前述の[iOS実機のSSL通信をプロキシによって傍受したり改ざんする方法](http://qiita.com/yimajo/items/c67cb711851f747c35e5)などを参考にしてください。

## リクエスト改ざん用の Python プログラムの用意

今回やりたいのは、「アプリ上で行われる Web API のリクエスト先を開発環境に向けかえたい」ということです。
この場合、以下の 2 点を行う必要があります。

1. TCP/IP リクエスト対象となるホスト名を改ざんする
2. HTTP リクエストヘッダ中の Host を改ざんする

これを行うのが以下の Python プログラムです。
ホスト名等は必要に応じて変更してください。

```python:replace_host.py
def request(context, flow):
    # 元のホスト名 (本番環境)
    original = "example.com"
    # 置換後のホスト名 (開発環境)
    replace  = "dev.example.com"

    if original in flow.request.host:
        if original in flow.request.headers["Host"]:
            # リクエスト先ホスト名
            flow.request.host = replace
            # HTTP リクエストヘッダ中の Host
            flow.request.headers["Host"] = [replace]
```

リクエストヘッダについては、Host 以外でもこれと同様に改ざんが可能です。
このとき注意が必要なのは、`flow.request.headers` はヘッダ名をキーとして、値には *文字列の配列* が入るということです。
HTTP ヘッダにおいては、同一のキーで複数の値がセットされることがあり得ます。
(Set-Cookie 等)

## mitmproxy を起動する

用意した Python スクリプトを読み込ませながら起動します。

```
$ mitmproxy -p 8080 -s replace_host.py
```

あとはこのプロキシを使ってアプリをデバッグするのみです。

## おまけ: 特定のパスにおいてのみリクエストを改ざんする

先ほどのプログラムでは、「特定のホストへのリクエストのみ」を条件に改ざんを行っていました。
さらに、「特定のパスにおいて」という条件も追加する場合、以下のようになります。

```python:replace_host.py
def request(context, flow):
    # 元のホスト名 (本番環境)
    original = "example.com"
    # 置換後のホスト名 (開発環境)
    replace  = "dev.example.com"
    # 改ざんを行うパス
    target_path = '/api/foo'

    if original in flow.request.host:
        if original in flow.request.headers["Host"]:
            # 特定のパスにおいてのみ
            if flow.request.path == target_path:
                # リクエスト先ホスト名
                flow.request.host = replace
                # HTTP リクエストヘッダ中の Host
                flow.request.headers["Host"] = [replace]
```

`flow.request.path` の値をチェックすることで実現できます。
ここでは `==` による完全一致をチェックしていますが、正規表現で特定のディレクトリ以下全てを対象にするなど、様々な応用が可能でしょう。

mitmproxy の公式ドキュメントにはこの辺のレシピ集的なものが集まってれば便利なのになー、と思ったり。
C#のEnumeratorを、C++のvector配列なんかのイテレータっぽく使うサンプル

```csharp
List<int> list = new List<int> { 0, 1, 2, 3, 4 };
 
foreach(int i in list)
	System.Console.Write(i + ", ");
System.Console.WriteLine("");
 
int[] array = list.ToArray();
foreach(int i in array)
	System.Console.Write(i + ", ");
System.Console.WriteLine("");
 
var e = list.GetEnumerator();
 
for(int i = 0; i < 4; ++i)
	e.MoveNext();
 
List<int>.Enumerator enu = e;
 
System.Console.WriteLine(e.Current);
System.Console.WriteLine(enu.Current);
 
list.RemoveAt(0);
 
foreach(int i in list)
	System.Console.Write(i + ", ");
System.Console.WriteLine("");
 
System.Console.WriteLine(e.Current);
System.Console.WriteLine(enu.Current); 
```
googleアプリから見るナビゲーションドロワーのマテリアルデザイン

##背景
ナビゲーションドロワーのデザインが最新のサポートライブラリv7から変わりました。ActionBarを利用するとデフォルトではハンバーガーがなくなり、矢印がくるりとアクションします。Actionbarの上にドロワーは乗らないのは以前と同様です。
こういうアクションのあるデザインはマテリアルデザインの一つと言えます。
一方で、[マテリアルデザインガイドライン](http://www.google.com/design/spec/layout/structure.html#structure-side-nav)ではナビゲーションドロワーはバーの上に乗っかります。

~~一体Googleはどっちのデザインを使わせたいの？と思って、Google製のアプリがどうなっているか調べてみました。~~
(追記：ご指摘をいただき再度確認したところ、Googleアプリはほとんどがナビゲーションドロワーはバーの上に乗っかるデザインでした。
サポートライブラリでの矢印が回転するデザインは過渡期のものだったのかもです。
タイトルとは内容が違ってしまいますが、情報は残しておきます。)

##調査
Android 4.2が入ったGalaxy S3で調べました。

###Gmail
~~上に乗らないデザイン~~
上に乗るデザイン
![Screenshot_2014-12-17-14-03-57.png](https://qiita-image-store.s3.amazonaws.com/0/39433/1c3bf698-395e-02fa-cd64-4dd15d04a8b4.png)


###Google Map
上に乗るデザイン
![Screenshot_2014-12-17-12-05-32.png](https://qiita-image-store.s3.amazonaws.com/0/39433/5e3420c3-d903-ef57-e25d-5b87fe804d76.png)


###Google+
ドロワーがない
![Screenshot_2014-12-17-12-06-06.png](https://qiita-image-store.s3.amazonaws.com/0/39433/442705ca-9663-8bee-52d1-2c9491162c66.png)


###Play Store
~~上に乗らないデザイン~~ 最新では上に乗るデザインです。コメント参照
![Screenshot_2014-12-17-12-07-45.png](https://qiita-image-store.s3.amazonaws.com/0/39433/f13c470a-f1f2-b82a-6b59-6d08ce90c837.png)

###Play Books
上に乗るデザイン

![Screenshot_2014-12-17-12-07-56.png](https://qiita-image-store.s3.amazonaws.com/0/39433/be34b842-2fcd-4c82-956d-29c2cf011b09.png)

###Play Movie & TV
上に乗るデザイン
![Screenshot_2014-12-17-12-08-09.png](https://qiita-image-store.s3.amazonaws.com/0/39433/493caac5-8547-6416-1c5d-d932fefce4b5.png)


###Play News Stand
上に乗るデザイン

![Screenshot_2014-12-17-12-07-33.png](https://qiita-image-store.s3.amazonaws.com/0/39433/ba6a2c51-bff7-a164-d81f-e3433a7c2d25.png)

###Play Game
上に乗るデザイン

![Screenshot_2014-12-17-12-06-35.png](https://qiita-image-store.s3.amazonaws.com/0/39433/7c394a20-fab5-170d-b417-19b819b6f24a.png)

###Youtube
上に乗るデザイン

![Screenshot_2014-12-17-12-08-37.png](https://qiita-image-store.s3.amazonaws.com/0/39433/eee39432-b67a-473c-016d-018c07a764e4.png)


###Google I/O
リリース版
上に乗らないデザイン
![Screenshot_2014-12-17-12-45-18.png](https://qiita-image-store.s3.amazonaws.com/0/39433/c3b937bf-b613-ce78-81ba-a71a66eb8e2b.png)

オープンソース版
上に乗るデザイン

![device-2014-12-17-124839.png](https://qiita-image-store.s3.amazonaws.com/0/39433/c83933f9-b6bf-eab7-0c34-a358bfe67e51.png)


##結論

|アプリ|ドロワーがバーの上？|
|:----|:-----|
|Gmail|◯|
|Google map|◯|
|Google+|バーがない|
|Play store|◯(上に乗るデザインですが自分の実機では確認できませんでした)|
|Play books|◯|
|Play Movie|◯|
|Play News Stand|◯|
|Play game|◯|
|Youtube|◯|
|Google IO|オープンソースは◯|

ドロワーがActionBarの上に乗るデザインがほぼ採用されていますが、例外もありました。
最新のサポートライブラリでは矢印がアクションするデザインが導入されましたが、ドロワーがActionbarの上に来るのがやはり正統派なのではないでしょうか。
けど最近マテリアルデザインを標榜しているアプリの多くが下に来るデザインを採用しているので、流れは変わるかもですね。
個人的には上に乗るデザインの方がファーストビューでのドロワーのコンテンツ量が増えるし見た目もシンプルなので、そちらが良いと思っています。

#蛇足
ドロワーがActionBarの上に乗るデザインですが、ゆっくり動かすとドロワーの後ろで矢印がこっそり回転しています。なんでやねん。
[FuelPHP]Uri::base(false)はconfigのbase_urlを返す

#Uri::base(false)はconfigのbase_urlを返す

Uri::base(false)を使って、
http://xxxx.jpを取得しようとしたが、できなかった。
URLから自動取得してくるわけではなく、
configのbase_urlの値を返すんだね。。。
$A.utilオブジェクトのメソッド

`$A.util`オブジェクトには様々な便利そうなメソッドが含まれているようです。
プレビュー画面のブラウザーコンソールにて下記のような関数を定義し、`getProperties($A.util)`のように呼び出すと関数名と引数を見ることができます。

```:JavaScript
function getProperties(obj) {
	var properties = [];
	for (var prop in obj){
		if (!$A.util.isFunction(obj[prop]))
			continue;

		properties.push(prop + ": " + obj[prop].toString().replace(/{[\s\S]*/, ""));
	}
	return (properties.sort().join("\n"));
}
```

一部$で始まるメソッドはprivate利用を意図していると思われるので使用しない方が良いでしょう（そもそもドキュメント化されていない時点ですべて使わない方が良いという話もありますが）。

APIマニュアルにて内容を確認することができます。$で始まるものも一部だけ含みますが。
[auradocs (Util type)](https://na16.lightning.force.com/auradocs/reference.app#reference?topic=api:Util)
実装はaura_proddebug.jsまたは[GitHubに公開されているauraのソース](https://github.com/forcedotcom/aura/tree/master/aura-impl/src/main/resources/aura/util)をご覧ください。

なんだかprototype/jQuery以前のJavaScriptライブラリーのようなインターフェイスですね。どこのJavaScriptライブラリーを元にしているのかな…。createPromise()/when()メソッド辺りではpromiseオブジェクトを使えるようです。これは場合によっては使えるでしょうか？？

なお、このAPIマニュアルではJavaScript API欄としてUtil以外にも色々なオブジェクトが紹介されていますが、実際にはアクセスできないものも多いようです。ほかに便利そうなオブジェクトがありましたら教えてください。

2014/12/23追記: $で始まるメソッドはデバッグ版でなくなると関数名が変わるので利用できなくなります。
JQuery  $(":checkbox").attr("checked", "") でチェックをはずす

ブランク、null、未定義値の場合 removeに流す

```js
$(document).ready(function(){
/*
	$.fn.origAttr = $.fn.attr;
	$.fn.attr = function(key,value) {
		if (value == "" || value == null || value == undefined) {
			this.removeAttr(key);
		} else {
			this.origAttr(key, value);
		}
		return $(this);
	}
*/
	$.fn.origAttr = $.fn.attr;
	$.fn.attr = function(key, value) {
		var keys = [ 
			"checked", "selected", "requred", "multiple", "readonly", 
			"disabled", "standby", "compact", "declare", "defer", "ismap", 
			"nohref", "noresize", "noshade", "nowrap" 
		];
		var regexpKeys = "/(" + keys.join("|") + ")/ig";
		if (typeof key == "string") {
			if (key.match(regexpKeys) == null) {
				$(this).origAttr(key, value);
			} else if (value == 0 || !!value){
				$(this).origAttr(key, value);
			} else {
				$(this).removeAttr(key);
			}
		} else {
			$(this).origAttr(key, value);
		}
		return $(this);
	};
});
```
Android OS バージョン別年間推移（2014年）

たまたま Android OS バージョン別の推移を調べてました。ついでなので2014年の年間推移なども作ってみましたので是非ご利用ください。（表が画像でごめんなさい。面倒でしたのでキャプチャしました。）

* 参考
    * http://juggly.cn/archives/tag/android%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%88%A5%E3%82%B7%E3%82%A7%E3%82%A2
    * https://developer.android.com/about/dashboards/index.html 

* 注意
    * 日本のシェアではなく、Google が発表している世界的なシェアとなります。 

# Android OS バージョン別年間推移（2014年）
## 推移：表
![kobito.1418785325.566237.png](https://qiita-image-store.s3.amazonaws.com/0/39380/09103c35-eae4-fda0-b58a-7306c4841233.png "kobito.1418785325.566237.png")

## 推移：グラフ（折れ線）

![kobito.1418785417.202948.png](https://qiita-image-store.s3.amazonaws.com/0/39380/130e7930-caa1-b2a2-21b2-0ad4f190acd1.png "kobito.1418785417.202948.png")

## 推移：グラフ（100%棒グラフ）
![kobito.1418786393.829085.png](https://qiita-image-store.s3.amazonaws.com/0/39380/a8d168ce-1207-9def-c06e-87a895445d81.png "kobito.1418786393.829085.png")


# Android OS バージョン4以上と4未満年間推移（2014年）
都合により、ver4以上と4未満のシェア推移を知りたかった整理しています。そちらも共有します。

## 推移：表
![kobito.1418785602.032415.png](https://qiita-image-store.s3.amazonaws.com/0/39380/b5953e64-fc53-ab7a-1218-3976e13cc032.png "kobito.1418785602.032415.png")

## 推移：グラフ（折れ線）
![kobito.1418785625.849188.png](https://qiita-image-store.s3.amazonaws.com/0/39380/4b9adf20-3ec5-bf0d-97fc-88fe9e962569.png "kobito.1418785625.849188.png")

## 推移：グラフ（100%棒グラフ）
![kobito.1418786413.703486.png](https://qiita-image-store.s3.amazonaws.com/0/39380/b77b29dc-ac15-1c5e-636f-b5b210cc931f.png "kobito.1418786413.703486.png")


## 所感
4未満のシェアですが、次の通りです。

* 1年間で：25.5% → 9.6%（-15.9%）
* 直近の半年で：14.2% → 9.6%（-4.6%）

世界的なシェアではありますが、さらに半年するとバージョン4未満は5%台まで落ち込んでくる可能性は高そうですね。これからのアプリ開発においてターゲットOSバージョンの参考になれば幸いです。
Xcode6から古いプロビジョニングプロファイルを削除する


参考: http://stackoverflow.com/questions/18923095/delete-provisioning-profile-from-xcode-5


Xcode を立ち上げ、いちど削除したいプロビジョニングプロファイルを選択し、その後ドロップダウンリストの中から[other...]を選択

![kobito.1418785762.546435.png](https://qiita-image-store.s3.amazonaws.com/0/8219/c7199436-9fd5-1afb-4146-e64cee980c84.png "kobito.1418785762.546435.png")

すると上記のようにID(?)が表示されるので控えておくなどする。

念のためXcodeを閉じ、その後、`~/Library/MobileDevice/Provisioning Profiles` をFinderなどで開いて、先ほどのIDに該当するファイルを削除する。

![kobito.1418785595.635862.png](https://qiita-image-store.s3.amazonaws.com/0/8219/8e731816-92c5-2d1f-5016-e7d849b3329c.png "kobito.1418785595.635862.png")


ちゃんとしたやり方があれば教えてください。
action_args を rspec3 で使う時にエラーが出たら、action_args_controller_spec.rb のカスタムテンプレートで回避できる

[Ruby - Rails開発で有用な便利Gem一覧：2014年版 - Qiita](http://qiita.com/shu_0115/items/b9dd17c01e1e6bd65e71)

で紹介されていた、[action_args](https://github.com/asakusarb/action_args)。

`Rspec3` 環境では動かないようだ。下記のエラーが出る

```rb
(erb):8:in `template': undefined local variable or method `example_valid_attributes' for #<Rspec::Generators::ScaffoldGenerator:0x007fcb128f0c98> (NameError)
```

template の中で rspec3 では 削除されたメソッドを使っているようだ。

`rspec-rails 2.14` にはあったが、`rspec-rails 3.1.0` には無かった(grep 調べ)。

template だけなので、上書きすれば良いと思い、下記のファイルを用意したが、使われなかった。

```
lib/templates/rspec/scaffold/controller_spec.rb
```

aciton_args からは `action_args_controller_spec.rb` が呼ばれているので、
そちらを定義することで上書きできた。

```
lib/templates/rspec/scaffold/action_args_controller_spec.rb
```

これで rspec3 でも使える。
IntelliJ IDEA 14 インストール時に Java SE 8 入れてるのに Java SE 6 インストールしろと怒られたら

MacOSX Yosemite + Java SE 8 環境で、IntelliJ IDEA 14 のインストールを試みたら、
起動時に Java SE 6 を要求された。

Java SE 8 はインストールしてあるので、Java SE 8 でも動くようにゴニョゴニョする。
 
以下のファイルを開く。

`/Applications/IntelliJ\ IDEA\ 14\ CE.app/Contents/Info.plist`

```
<key>JVMVersion</key>
<string>1.6*</string>
```

となっているところがあるので、次のように書き換える。

```
<key>JVMVersion</key>
<string>1.8*</string>
```

その後、起動したら無事に起動した。
middleman : 多言語化（i18n）

備忘録的にメモ。

```
locales/
 + ja.yml
 + en.yml
source/
 + localizable/
  + index.html.erb
```

`locales/ja.yml`

```
ja:
    title: 'これはテストです'
    contents:
        p: 'ほげ'
    array:
        - 'アイテム その1'
        - 'アイテム その2'
        - 'アイテム その3'
    images:
        - src: 'image_a.png'
          alt: '代替テキスト'
        - src: 'image_b.png'
          alt: '代替テキスト'
        - src: 'image_c.png'
          alt: '代替テキスト'
```

`locales/en.yml`

```
en:
    title: 'This is the test'
    contents:
        p: 'hoge'
    array:
        - 'item no.1'
        - 'item no.2'
        - 'item no.3'
    images:
        - src: 'image_a.png'
          alt: 'alternative'
        - src: 'image_b.png'
          alt: 'alternative'
        - src: 'image_c.png'
          alt: 'alternative'
```

`source/localizable/index.html.erb`

```
<!-- 通常 -->
<h2><%= t(:title) %></h2>

<!-- ハッシュ -->
<p><%= t('contents.p') %></p>

<!-- 配列 -->
<ul>
    <% t('array').each do |item| %>
    <li><%= item %></li>
    <% end %>
</ul>

<!-- 配列とハッシュ -->
<ul>
    <% t('images').each do |image| %>
    <li><%= image_tag image[:src], :alt => image[:alt] %></li>
    <% end %>
</ul>
```
自作のgemをCIサービスを使ってガチガチに補強してみた

* TravisCIなどのCIサービスを使ってgemの品質を高める試みです
* バッチが沢山ゲット出来てなんかカッコいい気がします！(気のせいです)

### 利用するサービス
| サービス                               | 説明 |
|:--------------------------------------|:--|
|[TravisCI](https://travis-ci.org/)     |言わずと知れた老舗CIサービス|
|[CodeClimate](https://codeclimate.com/)|コードの品質チェック |
|[Coveralls](https://coveralls.io/)     |テストカバレッジ計測 |
|[Gemnasium](https://gemnasium.com/)    |使用しているgemの更新情報を教えてくれる、脆弱性があればわかる(こともありそう) |

### 導入
* 基本的にはどれもgithubアカウントでサインアップしてリポジトリを登録するだけです
   * CodeClimateはサインアップ不要です
* バッジはそれぞれのサービスの各リポジトリの画面あるいはその設定画面にあるのでREADMEのフォーマットにあったものを取得してください

#### [TravisCI](https://travis-ci.org/)
* OSS(publicなリポジトリ)なら無料で始められます

1. TravisCIの準備
    1. 右上の [Sign in with Github](https://travis-ci.org/#) からサインインします
    1. あとはCIを始めたいリポジトリを選択すればTravisCI側でやることは完了です
    1. バッジはリポジトリの画面にあります
1. リポジトリ側の準備
    * .travis.ymlを用意する必要があります
        * これについては他に沢山書かれていると思うので割愛しますが、gemの場合はrvmで複数バージョンのrubyで実行するようにすると良いと思われます
        * 公式は[こちら](http://docs.travis-ci.com/user/build-configuration/)です

#### [CodeClimate](https://codeclimate.com/)
* OSSなら無料で始められます、この場合サインアップは不要です

1. [Pricing](https://codeclimate.com/pricing) の下の方に [Add your Open Source GitHub repo.](https://codeclimate.com/github/signup) があるので、そこからリポジトリを登録します
1. バッジはリポジトリの画面にあります

#### [Coveralls](https://coveralls.io/)
* こちらもOSSならば無料です

1. Coverallsの準備
    1. [トップページ](https://coveralls.io/)の中程に目立つ[SIGN UP NOW](https://coveralls.io/sign-up) からサインアップします
    1. あとは他と同様にリポジトリを選択するだけです
    1. バッジはリポジトリの画面にあります
1. リポジトリ側の設定
    * Coverallsでリポジトリを追加すると以下の様なメッセージが表示されるはずです、それに従いgemのインストールとspec_helper.rbなどへ変更を加えます
    * 変更をpushすれば、TravisCIでジョブが実行されるとCoverallsが更新されるはずです(反映までは多少時間がかかるようです)

```
require 'coveralls'
Coveralls.wear!

# Your code here.
```

* ただし、ここに書かれている通りにやるとローカルでテストを実行した時にはSimpleCovのような結果は得られません
* http://blog.ruedap.com/2013/09/02/travis-ci-coveralls-code-climate-github-badge にあるようにすることで対応可能です

#### [Gemnasium](https://gemnasium.com/)
サービスについては[こちら](http://chocoby.jp/blog/2013/03/02/gemnasium/)で詳しく紹介されています

* OSS以外でもある程度は無料で始められます
* 詳しくは [Plans & pricing](https://gemnasium.com/pricing) を御覧ください

1. 右上の[SIGN UP](https://gemnasium.com/users/sign_up)からサインアップします
1. 他と同様にリポジトリの設定をすれば設定は完了です
1. バッジはリポジトリの設定画面のBadgeタブから確認できます

* CUIツールの [Toolbelt](https://github.com/gemnasium/toolbelt) を使うことで他のCIツールとの連携もできそうで夢が広がります、これはまた機会があれば
市販されているユニークなBLEデバイスまとめ

ibeaconをきっかけに技術として注目されることが多くなったBLEですが、実際に私達の日常生活においてどれくらい使われているのでしょうか？今回は、すでに発売されているBLE対応デバイスの中でも、特徴的なものをまとめてみました。(すでに市販されている製品のみが対象で、kickstarterに出ている製品は覗いています。)

#### [adidus myCoach smart ball](http://micoach.adidas.com/smartball/)
![alt](http://micoach.adidas.com/loassets/images/smartball/product-04.png)

センサー内臓のサッカーボールです。ボールの軌道、スピン、ストライク点などをリアルタイムで確認することができます。

#### [Helios Bars](http://www.ridehelios.com/)
![alt](http://www.ridehelios.com/img/topview_black.png)

Heliosが提供しているのは、LEDライトを内蔵の自転車のハンドル型のデバイスです。自転車搭載型のデバイスが数多くある中、ハンドルごと付け替えるタイプは珍しかったので紹介させていただきました。Heliosバーを取り付けることでGPS情報をロギングしてくれるだけでなく、近づいたらLEDライトが自動で点灯する機能、速度によってLEDの色を変える機能、などが利用できるようになります。

#### [BACtrack BT-M5](http://www.bactrack.com/products/bactrack-mobile-breathalyzer)
![alt](http://cdn.shopify.com/s/files/1/0177/6214/products/mobile_0026_medium-new_53d2752e-ddb3-440a-96a3-7dcb65d73b19_large.jpg?v=1409174807)

アルコールを検知する携帯用Breathalyzerです。デバイスに息を吹きかけることで、素早く簡単に血中のアルコール濃度を測定することができ、いつ0%になるかも算出できます。

#### [AirSonea](http://airsonea.com.au/)
![alt](http://airsonea.com.au/css/images/section-bg.jpg)

Airsoneaは、喉に接触させて呼吸音を測定することで、喘息の兆候を検知できるというデバイスです。測定したデータは自動的に保存され、医師に提供することで治療に役立てることができます。

#### [Braun Oral-B](http://oralb.braun.co.jp/products/oral/black/top.html)
![alt](http://ecx.images-amazon.com/images/I/61U2Cf9JWlL._SL1000_.jpg)

Oral-Bはbluetooth対応の歯ブラシです。アプリと連動して、まだ磨いていない場所をナビゲートしてくれたり、歯を磨く強さを計測して適切な強さを教えてくれます。

#### [MyQ](https://www.liftmaster.com/For-Homes/MyQ-Connected-Home)
![alt](https://www.liftmaster.com/LiftMaster/media/LiftMaster/LiftMaster%20Images%20-%20For%20Homes/Connected%20Home/MyQHome_Hero_1.jpg?width=1400&height=420&ext=.jpg)

MyQはガレージの開閉装置にデバイスを取り付けることで、スマートフォンからガレージの開閉ができるようになるというものです。着眼点がアメリカっぽいですね。

#### [F-PLUG](http://www.bsc.fujitsu.com/services/f-plug/)
![alt](http://www.bsc.fujitsu.com/imgv3/jp/group/bsc/services/f-plug/plug-02.gif)

FUJITSUが提供するF-PLUGをコンセントに取り付けると、PCに消費電力のデータをリアルタイムで送信することができます。付属のパソコンソフトを用いて、電気の使用量、電気料金、CO2換算値、温度、湿度、照度の確認ができます。

#### [Kevo](http://www.kwikset.com/kevo/default.aspx)
![alt](http://uncrate.com/p/2013/05/kevo-xl.jpg)

Kevoはスマートロックと呼ばれる分野の先駆けの存在で、ドアに設置することでスマートフォンにより鍵を開け閉めすることができます。スマートロックは国内でも[Akerun](http://akerun.com/)、[Qrio](https://fabcross.jp/news/2014/12/20141216_qrio_smart_lock.html)などが徐々にプレイヤーが出始めていますね。

#### [Kitchen Thermometer mini](http://idevicesinc.com/kitchen-thermometer/mini/)
![alt](https://idevicesinc.com/images/bigcommerce/product_pages/kitchen_thermometer_mini/gallery_2.jpg)

食材がいつ最適な温度の達したかを測定するための、キッチン用の温度計です。食材の温度情報をリアルタイムでスマートフォンで確認することができます。

#### [Flower Power](http://www.parrot.com/jp/products/flower-power/)
![alt](http://www.modernity.jp/wp/wp-content/themes/modernity/images/brand/parrot/product/Parrot_Flower_Power/11.jpg)

flower powerは植物の状態をモニタリングするためのデバイスです。植木鉢に挿しておくだけで、太陽光量、外気温度、肥料濃度、土湿などを測定、スマートフォンに通知してくれます。

#### [iBobber](http://reelsonar.com/)
![alt](http://cdn.shopify.com/s/files/1/0240/7519/t/2/assets/slideshow_2.jpg?3083)

iBobberは簡易の魚群探知機です。専用デバイスを水面に投げ入れることで、周辺の魚群を探知してくれます。水面温度、気温なども計測でき、釣りをする人にはもってこいのデバイスです。
ofxBlackMagicの色の調整

いつも便利に使わせていただいているkylemcdonaldさん作のofxBlackmagicですが、
DeckLinkを使いHD-SDI 1080iにてキャプチャした画面の色が、どうもおかしい、、、（全体的に輝度が低い感じ）

確認すべくMacからHDMIにて出力（モニター設定のカラーはsRGBを選択）
それをBarco ImagePro2にてHD-SDIに変換後、
BlackMagic UltraScopeに入れてみたら、やはり色があっていない。

波形モニタを見ながら、KyleさんのofxBlackMagic内　ColorConversionDeinterlace.cppを
調整しました。
(github わからんので、folkとかなんやら　してません、、、あしからず）
```lang:ColorConversionDeinterlace.cpp
unsigned char map1(float value) {
    
#include "ColorConversionDeinterlace.h"
#include <math.h>

unsigned char clamp(int value) {
	if(value > 255) return 255;
	if(value < 0)   return 0;
	return value;
}

unsigned char map(float value) {
    
    float outVal = ((value - 16) / (219) * (255));
    /*もともとはfloat outVal = ((value - inputMin) / (inputMax - inputMin) * (outputMax - outputMin) + outputMin);　これを簡略　
(value - 16)の16はBlackmagicから入ってくる最低値*/
    
    if( outVal > 255 )return 255;
    else if( outVal < 0 )return 0;
    
    return outVal;
	
}


bool yuvReady = false;
unsigned char yuvRed[256][256];
unsigned char yuvGreen[256][256][256];
unsigned char yuvBlue[256][256];

void createYuvLookupTables(){
	if(yuvReady) {
		return;
	}
    int yy, uu, vv, ug_plus_vg, ub, vr, val;
	for (int y = 0; y < 256; y++) {
        for (int v = 0; v < 256; v++) {
            yy = y << 8;
            vv = v - 128;
            vr = vv * 397;
            val = (yy + vr) >>  8;
            yuvRed[v][y]  = map(val);
        }
    }
    for (int y = 0; y < 256; y++) {
        for (int u = 0; u < 256; u++) {
            for (int v = 0; v < 256; v++) {
                yy = y << 8;
                uu = u - 128;
                vv = v - 128;
                ug_plus_vg = uu * 44 + vv * 128;
                val = (yy - ug_plus_vg) >> 8;
                yuvGreen[u][v][y] = map(val);
            }
        }
    }
	for (int y = 0; y < 256; y++) {
        for (int u = 0; u < 256; u++) {
            yy = y << 8;
            uu = u - 128;
            ub = uu * 470;
            val = (yy + ub) >> 8;
            yuvBlue[u][y] = map(val);
        }
	}
	yuvReady = true;
}
//以下は一緒
```
やっていることは、もともと使われていたClampに変わり、mapを制作。
DeckLinkから入って来る色がRGBの255段階で表現すると16から236くらいでした。
これを0-255へマップしています。

またcreateYuvLookupTables()内を波形を見ながら調整しました。
ので、波形合わせにっているので
YUVからRGB変換しているところの数値は、何の後ろ盾もありません。
とにかく波形モニタを見ながら数値調整して行った感じです。

これでDeckLinkでカラーバーをキャプチャした時にほぼしっかり色が出ました。
若干　255段階のローレベルで色のふらつきは出ていますが、概ね　大丈夫そう。

DeckLink付属のソフトウェアでキャプチャすると、色は綺麗に出るので、
きっと、もっとスマートな方法があると思うのですが、、、

ご存知の方いらっしゃいましたら　教えてください。。。。。
[Unity] MonoDevelop のおかしなインデント補完を回避する方法

いきなりですが言わせて頂きます.
とにかく使いづらい...

謎な補完でインデントおかしくなるし,
愛用している macbook air だと unity と connect するだけでフリーズするし...

とはいえ一応 IDE なので MonoDevelop からコミットしたり,
VisualStudio 的な便利機能も一通りあるわけで.

きっと自分が無知だから使いづらいんだ!

って愚痴は置いといて, インデント補完がおかしいのを直したメモです.
よかったら参考にしてください.


## おかしなインデント補完を回避せよ！

普通にデフォルトの MonoDevelop を使っていると
関数定義や if 文, for 文などを書いたときにインデントがズレるのに気づくかと思います.
(私はこの時点で一度 MonoDevelop を捨てる選択をしました)

![format-before.png](https://qiita-image-store.s3.amazonaws.com/0/7756/718e166d-b2c9-eaeb-4e50-00166ab32f00.png)


これはソリューションのオプションを変更することで簡単に直すことができます.
サイドにあるソリューションを右クリックして

[ソリューション] -> [オプション]

を選択します.

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/7756/1f6a9be2-018a-b6d5-2c61-485e2f18f09f.png)

オプションを設定する画面が出てくるので
[ソースコード] -> [コード フォーマッティング] -> [C#ソースコード]
を選択します.

こんな感じの設定画面が出てきます.

![setting-before.png](https://qiita-image-store.s3.amazonaws.com/0/7756/91193165-3054-a09a-bf62-9b9ad3efce2b.png)


見て分かると思うのですがなぜか Indent width が 8 になっています.
これが元凶ですね.

以下のように設定を変えましょう

- `'Text file' のデフォルト設定を使用` のチェックボックスを外す
- Indent width を 8 から 4 に変更
- ついでに`タブをスペースに変更`にもチェックを入れちゃいましょう!


![setting-after.png](https://qiita-image-store.s3.amazonaws.com/0/7756/86b7931c-d715-4112-a804-ddf97355a7bc.png)

これで快適にコーディングできるようになります.

![format-after.png](https://qiita-image-store.s3.amazonaws.com/0/7756/0cc66975-a296-a19a-9f05-47298bf09b61.png)
aptでインストールできるバージョン一覧がみたい

apt-cache policy hogehoge
でできる。

	# apt-cache policy mongodb-org
	mongodb-org:
	  Installed: (none)
	  Candidate: 2.6.6
	  Version table:
	     2.6.6 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.5 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.4 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.3 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.2 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.1 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.0 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.0~rc3 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.0~rc2 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.0~rc1 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
	     2.6.0~rc0 0
	        500 http://downloads-distro.mongodb.org/repo/ubuntu-upstart/ dist/10gen amd64 Packages
JSFのEL式でOR,AND条件を使う

JSFでEL式は頻繁に使う。(JSFだけでなく、テンプレートではよく使いますね)

OR, AND条件で何度か引っかかったのでメモしておきます。

説明しやすいように、前提としてobjオブジェクトはboolean型のflg1,flg2を持っているとします。

#AND条件

`rendered="#{obj.flg1 && obj.flg2}"`
これで出来るだろうと思っていましたが、これだとダメでした。(エスケープとかの問題？)

`rendered="#{obj.flg1 and obj.flg2}"`
これは成功。AND条件は"and"にする必要があります。小文字で"and"です。

#OR条件
`rendered="#{obj.flg1 or obj.flg2}"`
AND条件と同様に小文字で"or"を指定すると問題なく判定されます。

しかし、ORの場合は以下のような式でも正しく判定されました。
`rendered="#{obj.flg1 || obj.flg2}"`


以上、EL式の条件でした。
Becky（Win）からThunderbird（Mac）への移行

Windowsで使っていたメーラーのBeckyからの乗り換え方法です。
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
（参考）
http://manbowakemasa.cocolog-nifty.com/blog/2012/04/beckythunderbir.html
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
#1. Beckyのデータをeml形式でエクスポート
##1-1. プラグインをダウンロード
下記サイトより「CircleBecky」をDLして展開します。
http://www.vector.co.jp/soft/dl/win95/net/se252604.html
※展開するときにfailed to run setsuppin みたいなエラーが出た場合は、
　一旦閉じて、ダウンロードフォルダから再度展開しなおしてください。

##1-2. プラグインをインストール
インストールウィザードが表示されますが、

* B2 フォルダ下のPlugInsフォルダにインストール
* データフォルダ下のPlugInsフォルダにインストール
* 解凍のみ

上記の中で、「解凍のみ」しか選択できない場合は、一旦解凍してください。
解凍のみ以外が選択できる場合は、PlugInsフォルダにインストールしてください。

解凍のみしかできなかった場合は、
PCのBeckyの格納ディレクトリ（\Becky!\username\）を開き、
「PlugIns」フォルダを新規作成し、
先ほど解凍したファイル（CircleBecky.dll）を格納し、Beckyを再起動してください。
例）Becky!\username\PlugIns

正常にインストールされていれば、
Beckyのメニューバー「ツール」→「プラグイン」の中に
CircleBecky Pluginが表示されているはずです。

##1-3. エクスポート
エクスポートしたいディレクトリを右クリック（全体の場合は「受信箱」を右クリック）して
「拡張エクスポート」を選択。
エクスポート先を指定すれば、エクスポート完了です。
※メールの量にもよりますが、かなり時間かかります。
　そしてBecky!がかたまりますがちゃんと動いてますのでゆっくり待ちましょう

#2. Thunderbird へのインポート
##2-1. アドオンのダウンロード
下記サイトよりアドオンをダウンロードします。
https://addons.mozilla.org/ja/thunderbird/addon/importexporttools/
##2-2. アドオンのインストール
Thunderbirdのメニューバー「ツール」→「アドオン」をクリックし、アドオンマネージャを起動します。
画面上部のカスタムアイコンをクリックし「ファイルからアドオンをインストール」を選択し、
ダウンロードしたファイルを選択します。
すると画面上部にプログレスバーが表示され、
インストールが終わると「再起動」ボタンが表示されるのでクリックします。
##2-3. インポート
受信トレイを右クリック（Ctrl+クリック）し
「ImportExportTools」→「ファイルからすべてのemlファイルをインポート」→「サブフォルダも含む」を選択
『1-3』でエクスポートしたディレクトリを選択し、「開く」をクリック

これで完了です。

#3. パスワードの設定
おまけでパスワードの設定です。
##3-1. アドオンのダウンロード
下記ページ中ごろより、Thunderbird用のアドオンをダウンロードします。
https://nic-nac-project.org/~kaosmos/profilepassword-en.html
##3-2. アドオンのインストール
『2-2』と同じ手順にて、ダウンロードしたアドオンをインストールします。
##3-3. パスワードの設定
アドオン内の「ProfilePassword」の設定画面を開き、
パスワードを入力すれば完了です。
PHP用のエディタ/IDE/プラグイン

PHP用のエディタ/IDE/プラグインのメモ。
とりあえず備忘録的に。

#vim
*　[VimをPHP用にカスタマイズする vim使いこなしたいvim初心者へ](http://tech.basicinc.jp/PHP/2013/06/17/vim-php/)
*　[vimのPHP開発環境](http://kaworu.jpn.org/vim/vim%E3%81%AEPHP%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)

#Eclipse
* [pleiades](http://mergedoc.sourceforge.jp/)
* [PDT](https://eclipse.org/pdt/)
* [Windows版SubclipseでSVN+SSHにアクセスする方法] (http://symfony.jobweb.jp/?p=646)

#Visual Studio Code
* [Visual Studio Code で置換で改行する](https://rksoftware.hatenablog.com/entry/2019/02/10/192256)
* [VS CodeでMarkdownをプレビューするには？](https://www.atmarkit.co.jp/ait/articles/1804/20/news030.html)
* [VSCodeで複数リポジトリを扱うなら結局Open Recentコマンドが最強という話](https://yigarashi.hatenablog.com/entry/vscode-open-recent)

#Sublime Text
* [【SublimeText2】PHPコーディング向けのカスタマイズ](http://f-retu.hatenablog.com/entry/2013/05/16/085649)
* [Sublime Textに導入しているオススメのプラグイン23選](http://ottan.xyz/sublime-text-plugin-321/)
* [Sublime Text 3初期導入](http://qiita.com/syamaoka/items/28ae4f5625acd2dc87d6v)
* [Sublime Text3で構文エラーをチェックするプラグインが超絶便利](http://liginc.co.jp/web/js/73704)
* [Sublime Text 3 で構文エラーチェックする設定のまとめ](http://qiita.com/Sugima/items/e3ad6c0405c3939dee3b)
* [SUBLIMELINTERがPHPについて動かない（文法チェックをしてくれない）場合の解決法](http://blog.lunarians.net/pc_it/1198.htm)
* [SublimeText 3をより快適に使うための設定方法](http://blog.nest-online.jp/17055)
[iOS] アプリ名を変更する

〜アプリ名を１種類だけ使いたい、とりあえずアプリ名を変更したい人向け〜

作業は設定を1つ変更するだけでアプリ名を変更できます。Swiftも、Objective-cも同じ方法です。
変更方法としては3つあります。

もし、以下の項目を複数変更した場合は優先順が高いものが選択されます。
優先度は1が一番高く、順に低くなっていきます。

◎sample2という名前のプロジェクトを前提にします


###1.「 Bundle name 」を新規作成###
・場所
　Supporting Files > Info.plist > +で新規生成 Builed display Name　 (初期設定 なし )  

![スクリーンショット 2014-12-17 11.34.39.png](https://qiita-image-store.s3.amazonaws.com/0/61148/bdf92041-d9a8-141a-d60b-4ad34db6d391.png)


###2.「 Bundle name 」　を変更###
・場所
　Supporting Files > Info.plist > Builed Name　 (初期設定 $(PRODUCT_NAME) )  

![スクリーンショット 2014-12-17 11.14.35.png](https://qiita-image-store.s3.amazonaws.com/0/61148/700f6df8-692a-49b6-2e59-6a0637848120.png)  


###3. 「ProductName」　を変更###
・場所
　TARGETS > sample2 > Builed Settings > ▼ Packaging > ▶ ProductName　 (初期設定 $(TARGET_NAME) )  

・影響内容
　Product nameを変更すると別アプリとして生成されます。
　そのため管理ややこしくなる可能性がありますので、前のバージョンを上書きしたくない時など、上手く利用してください。  

![スクリーンショット 2014-12-17 11.05.57.png](https://qiita-image-store.s3.amazonaws.com/0/61148/b45b6171-5ff0-3a16-69c0-0b45e016777e.png)


###国（言語）ごとにアプリ名を変更したい場合###

[iOS] アプリ名を国ごと変更したい時場合(Swift, Objective-c)
http://qiita.com/hiroo0529/private/da9909f6787f2dce75e3
oauth2clientのVer.問題でbqとgsutilが共存出来ない場合の対処


<blockquote class="twitter-tweet" lang="ja"><p>bigqueryがoauth2clientの1.2に依存していて，gsutilがoauth2clientの1.4.1以上に依存していて，pkg_resources.DistributionNotFound祭りで死んでる←</p>&mdash; a_macbee (@a_macbee) <a href="https://twitter.com/a_macbee/status/542167488666931200">2014, 12月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

って感じに困ってる人のためのメモ．
恐らく`pip`で`gsutil`導入すると，こういう事態が起きるはず・・・です！ (2014年12月17日現在)

`gsutil`では最新Ver.の4.7から`oauth2client >= 1.4.1`を利用する形式に変更されているのですが，これが`bigquery`が依存する`oauth2client==1.2`とconflictしてどちらか一方しか動かないみたいな事態が起きます．
これを避けるために，`gsutil`は一つ下のVer.である4.6を利用するようにしています．

```
$ pip install 'gsutil==4.6'
```

`bigquery`のVer.が上がるのが待ち遠しい．

ちなみに，GCSでは，以下のコミットからoauth2clientを利用するよう改変されています．
[Add oauth2client 1.4.1 submodule and six dependency, remove google-api-p... ·  07e4f9b · GoogleCloudPlatform/gsutil · GitHub](https://github.com/GoogleCloudPlatform/gsutil/commit/07e4f9bc905fc1429bff2dee99112048e97bc7ba)
【Facebook】GraphAPI v1.0とv2.0のユーザIDの違い

# 概要

[【Facebook】GraphAPI2.0利用申請のしてみた=>通った【成功例】](http://qiita.com/ogawatti/items/65c015808072c1bf13d7)で、GraphAPI v2.0が利用できるようになった。
これでv2.0エンドポイントを叩くと、ログイン時にユーザーIDがアプリ専用に発行されるようになった。
(参考 : [Facebookプラットフォーム変更ログ 2014年4月30日 - APIバージョン2.0#グラフAPI](https://developers.facebook.com/docs/apps/changelog?locale=ja_JP#v2_0_graph_api))

つまり、本来のユーザーIDとは異なった値がアプリに渡されることになる。

# 疑問

[Facebookプラットフォーム変更ログ 2014年4月30日 - APIバージョン2.0#グラフAPI](https://developers.facebook.com/docs/apps/changelog?locale=ja_JP#v2_0_graph_api)から抜粋。

```
v1.0からv2.0への変更点

* アプリ専用のユーザーID: 利用者の情報の保護を強化するため、利用者が、グラフAPIをv2.0にアップグレードしたアプリにログインする場合、Facebookではその利用者の元のIDではなく、アプリ専用IDを発行するようになりました。ただし、以前にアプリにログインしていた利用者の場合、ユーザーIDは変更されません。
```

"以前にアプリにログインしていた利用者の場合" <= これはFacebookアプリを削除しても適用されるんだろうか？

具体的には、**v1.0でアプリにログインして、v2.0移行までにFacebookアプリを削除、v2.0移行後に再度ログインした場合**、ユーザIDはどうなる？

# 結論

**ユーザーIDは、Facebookのバージョン関係なく、始めてアプリログインしたときにアプリへ渡したものが以降も使われ続ける。**

* v1.0で始めてアプリログインした場合、本来のユーザIDが使われ続ける
* v2.0で始めてアプリログインした場合、専用に発行されたユーザIDが使われ続ける
* アプリ削除しても以降渡されるユーザーIDは変わらない
BIG-IPのAct/Stb構成構築手順


最近よくBIG-IPを初期構築する機会があるので、備忘録として。。。
また、今回はLANを介してのHA構成になります。
これならラックが離れていてもHAが組める！って当たり前か(´・ω・`)

<h2>設定</h2>
<h4>Device Trust</h4>
1. 'Device Management' -> 'Device Trust' -> 'Peer List'.
2. Click 'Add'
3. HA構成組む対向先のIPとID/PASSを入力
4. Click 'Retrieve Device Information'

<h4>Device Group</h4>
※Act/Stb両機で必須
1. 'Device Management' -> 'Device Groups'.
2. Click 'Create'.
3. Nameに"device-groups(任意)", 'Group Type'に"Sync-Failover"を選択。"Members'に全てのDeviceを'includes'に追加
4. Enable 'Network Failover'. ※VIPRIONの場合はこちらのチェックを外してもAct/Stb構成が組めるが、チェックは使用
5. Click 'Finished'

<h4>Create HA Interface</h4>
※Act/Stb両機で必須
1. 'Network' -> 'VLANs' -> 'Create'
2. <b>General Properties</b>の'Name'に"HA(任意)", 'Tag'に"100(好きなVLAN番号)を入力。
3. <b>Resources</b>の'Interfaces'は対向先とつながるリンクを"tagged or untagged"のどちらかを選択。
4. Click 'Finished'
5. 'Network' -> 'Self IPs' -> 'Create'
6. 'Name'に"HA(任意)"、'IP Address & Netmask'に通信可能なセグメントを入力。'VLAN / Tunnel'で"HA"を、'Port Lockdown'には"Allow Default"を選択。
7. Click 'Finished'

<h4>Device Connectivity Config</h4>
※Act/Stb両機で必須
1. 'Device Management' -> 'Devices' -> Click Self Device -> 'Device Connectivity' -> 'ConfigSync'
2. 'Local Address' -> 先ほど作ったHA Interfaceを選択。
3. Click 'Update'
4. 'Device Management' -> 'Devices' -> Click Self Device -> 'Device Connectivity' -> 'Network Failover'
5. <b>Failover Unicast Configuration</b>の'Local Address'にHA InterfaceとManagement IPを追加。2つのアドレスを指定する理由は、どちらか一方接続が切れてもAct/Stbの切り替わりが発生しないようにするため。
6. Click 'Update'
7. 'Device Management' -> 'Devices' -> Click Self Device -> 'Device Connectivity' -> 'Mirroring'
8. 'Primary Local Mirror Address'にHA Interfaceを選択。
9. Click 'Update'

これで準備は完了で後は、
'Device Management' -> 'Overview' からSyncをすればAct/Stbが構成されるはず。

Traffic Groupsの'Failover Method'で'Load Aware、HA Order、HA Group'の3つが選択できるが、
私の場合は切り替わりが一番はやいと言われているHA Groupで作成しました。

あと、注意するべきポイントはHA Interface作成時の'Port Lockdown'の指定を'Allow None'ではなく、'Allow Default'にすること。
UDP/1026 (network failover)
TCP/1029-1043 (connection & persistence mirroring)
TCP/4353 (CMI – peer communication)
こいつらがHA組むとき必要みたいなので。。。あと、NTP同期は必須みたいです。

以上っす(｀･ω･´)ゞ

参照先URL
[BigIP F5 LTM - High Availability / DSC (v11.x)](https://www.fir3net.com/Loadbalancers/F5-BIG-IP/bigip-f5-ltm-high-availability-v11x-dsc.html)
[Overview of port lockdown behavior (10.x - 11.x)](https://support.f5.com/kb/en-us/solutions/public/13000/200/sol13250.html?sr=42434498)
[Transport protocol used for BIG-IP connection and persistence mirroring](https://support.f5.com/kb/en-us/solutions/public/7000/200/sol7225.html?sr=42434670)
ActiveRecord4 の uniqueness の validation で TypeError が発生する

###ActiveRecord4 の uniqueness の validation で TypeError が発生する
* ActiveRecord 4 から uniqueness の validation に value の型を変換する処理が追加されていて、Hash や Array が与えられた場合、TypeError の例外が発生してしまう
* 対策としては、validation に if のオプションで 文字列などの型の指定をつけるなど
    * 参考 URL： https://github.com/rails/rails/blob/master/activerecord/lib/active_record/validations/uniqueness.rb#L63
【目的別】おすすめBLE開発環境まとめ(2/2)

[前回の記事](http://qiita.com/koichi222/items/4fec3103be13de7e7b17)に引き続き、目的別おすすめBLE開発環境を紹介させていただきます。

## 目的２：製品化を見据えた試作開発
#### 対象とする人
 * 将来的な製品化を見据えて、量産品の試作を開発したい人
 * 自作の基板にBLE通信部分を追加したい人  
 
#### まとめ
 * ファームウェアの作り込みは後回しに、一旦BLEでの通信のみ確認したい場合 or シリアル通信で通信したい場合
   * → BLE Serialがおすすめです。
 * ファームウェアに関してこの段階で作りこみたい場合
   * → koshianがおすすめです。

#### BLE Serial(http://www.robotsfx.com/robot/BLESerial.html)
![alt](http://www.robotsfx.com/robot/img/radio/BLESerial/BLESerial.jpg)

製品化を見据えた試作となると、設計した基板での開発が増えてくるかと思います。
GATTプロファイルの設計などファームウェアのfixは後回しに、一旦BLEでの通信のみ確認したい場合はBLE Serialがおすすめです。シリアル通信が可能なため、処理の自由度が大きいです。iphone/androidと通信するサンプルコードも公開されており、実装の参考になります。

#### koshian(http://www.m-pression.com/ja/solutions/boards/koshian)
![alt](http://www.m-pression.com/image/image_gallery?uuid=b35a5cf2-a7a1-4a72-aa53-0c3916de48bd&groupId=10157&t=1417438100660)
koshianはkonashi互換のファームウェアが書き込まれているため、konashiのsdkを通じて通信する限りはファームウェアの書き換えは必要ありません。konashiと異なるのは、Broadcom社のSDKを通じてファームウェアの書き換えが可能なことです。(konashiは、BroadcomのBLEモジュールであるBCM20737Sをベースになっているため) これにより、プロトタイピングをkonashi互換ファームウェアで開発→量産品の試作はファームウェアを書き換えて作り込みという使い方が可能になります。もちろんkonashiとの連携もサポートしていますが、koshian自体に端子も付いているため、直接ブレッドボードや万能基板への取り付けも可能なのが優れた点かと思います。


## 目的３：製品化
#### 対象とする人
 * 量産する製品に搭載するBLEモジュールの選定を行いたい人

#### まとめ
このフェーズになると、実際に製品に搭載するモジュールの選定のための評価という意味合いが強くなってきます。基本的に各チップには開発ボードが存在するので、それを用いた開発になるでしょう。開発の敷居もこの段階から一気に高くなるため、本気で製品化を目指す場合でなければ、上記で上げた開発環境を使用するのがおすすめです。どのモジュールが優れているかは、製品の要件とターゲットコストによっても大きく変わり一概におすすめはしづらいため、代表的なBLEモジュールの紹介に留めさせていただきます。

#### bluegiga社製 BL112(https://www.bluegiga.com/en-US/products/bluetooth-4.0-modules/ble112-bluetooth--smart-module/)
![alt](https://bluegiga.studio.crasman.fi/file/dl/c=product_big/IPWKDA/yRSUEV3YDmRDTKlSR0TR6A/BLE112_M_RGB_front.jpg)

BL112はbluegiga社製のBLEモジュールで、発売されてから時間がたっていることもあり製品への導入事例も多く、ネット上の日本語での情報も一番多いのではないでしょうか。開発環境としては、プロファイルの定義をxml、ファームウェア部分はBGScriptというBASICライクな言語で行います。専用のIDEなどは提供されていません。

#### Texsus instuments CC2541(http://www.tij.co.jp/product/jp/cc2541)
![alt](http://www.ti.com/graphics/folders/partimages/CC2541.jpg)

SensorTag Development Kitというセンサ付きの開発よう端末なども提供されています。
個人的な印象としては、アメリカ製の製品ではよく使われているのを見かけます。

#### BroadCom社 BCM20737S(http://www.broadcom.com/collateral/pb/WICED-Sense-PB100.pdf)
![alt](http://www.mouser.jp/images/broadcomcorporation/lrg/BCM20737S.jpg)
koshianにも搭載されているBCM20737Sですが、発売が最近ということもあり他のモジュールと比べて高機能です。ファームウェア開発については、EclipseベースのIDEが提供されており、broadcom社の提供するsdkを使用することでc言語での開発ができます。Broadcomメンバーシップを持っているユーザ向けのフォーラムではドキュメントとFAQが充実しているので、開発の参考になるでしょう。他のモジュールと比べて価格が高め(市販価格で約500〜600円/個)なのがネックかもしれません。

以上、目的別おすすめBLE開発環境まとめになります。
いかがでしたでしょうか？みなさんのBLE開発の参考になれば幸いです。