OmniAICreator/Qiita-1.07M huggingface dataset:
CでEtherフレームを理解する

#概要
EtherフレームはOSI参照モデルのレイヤー2に位置します。
直接通信する機器間でデータをやり取りする為の情報が入ったフレームです。
この記事ではC言語によるEtherフレームの解析を行い、Etherフレームについて理解を深めてみます。

#環境構築
CentOSを想定しています。
フレームの取得にはlibpcapというCライブラリを利用します。

```bash
yum -y update
yum install -y gcc vim wget tar flex byacc
wget http://www.tcpdump.org/release/libpcap-1.6.2.tar.gz
tar zxvf libpcap-1.6.2.tar.gz
cd libpcap-1.6.2
./configure
make -j 8
make install
```

#Etherフレームについて
##フレームフォーマット
Etherフレームの内容(IEEE802.3形式)は以下となっています。

| 概要 | サイズ | 説明 |
|:-----------|------------:|:------------|
| プリアンブル | 7byte | タイミングを取るための固定ビット列 |
| SFD         | 1byte | タイミング用。<br>次のビットからデータが開始されるよ的な。 |
| 宛先MAC     | 6byte | 通信先の機器を識別する為の番号 |
| 送信元MAC   | 6byte | 通信元の機器を識別する為の番号 |
| Etherタイプ | 2byte | 上位のプロトコルを表す値。<br>但し1500以下だったらデータサイズを表す |
| データ      |  可変 | カプセル化した中身のデータ |
| FCS      |  2byte | 受け取り側でエラーが発生してないかをチェックする用 |

###Etherタイプ(一部)
defineはnet/ethernet.hに定義されています。
以下はその値と説明についてです。

| 値            | define         |説明               |  
|:--------------|:---------------|:-----------------|
| 0x0000-0x05DC | -              | フレームの長さ     |
| 0x0800        | ETHERTYPE_IP   |IPパケット         |
| 0x0806        | ETHERTYPE_ARP  |ARPパケット        |
| 0x8100        | ETHERTYPE_VLAN |dot1Q VLANフレーム |
| 0x86DD        | ETHERTYPE_IPV6 |IPv6パケット       |

###Etherフレーム構造体
CでEtherフレームを扱う場合、net/ethernet.hに構造体が定義されています。

```c:net/ethernet.h
struct ether_header
{
  u_int8_t  ether_dhost[ETH_ALEN];      /* destination eth addr */
  u_int8_t  ether_shost[ETH_ALEN];      /* source ether addr    */
  u_int16_t ether_type;                 /* packet type ID field */
} __attribute__ ((__packed__));
```

#EtherフレームのDump
フレームの受信処理は[コチラ](http://qiita.com/Ki4mTaria/items/dabee07097acbab469d9)を参照してください。
以下ではフレームを受信した後、コールバック関数内でEtherヘッダ内容をDump表示しています。

```c:ether_hdr.c
#include <netinet/if_ether.h>
#include <arpa/inet.h>
#include <string.h>
char * convmac_tostr(u_char *,char *,size_t);

void start_pktfunc( u_char *user,                 // pcap_loop関数の第4引数
                    const struct pcap_pkthdr *h , // 受信したPacketの補足情報
                    const u_char *p               // 受信したpacketへのポインタ
                  ){
  char dmac[18] = {0};
  char smac[18] = {0};
  struct ether_header *eth_hdr = (struct ether_header *)p;
  
  printf("ether header---------\n");
  printf("dest mac %s\n",convmac_tostr(eth_hdr->ether_dhost,dmac,sizeof(dmac)));
  printf("src mac %s\n",convmac_tostr(eth_hdr->ether_shost,smac,sizeof(smac)));
  printf("ether type %x\n\n",ntohs(eth_hdr->ether_type));
}
char * convmac_tostr(u_char *hwaddr,char *mac,size_t size){
  snprintf(mac,size,"%02x:%02x:%02x:%02x:%02x:%02x",
                     hwaddr[0],hwaddr[1],hwaddr[2],
                     hwaddr[3],hwaddr[4],hwaddr[5]);
  return mac;
}
```
Gitでcommitをまとめてみる



## rebase -i

```bash
$ git log --oneline
980c127 third commit.
cee9bf2 second commit.
9948182 first commit.

$ git rebase -i HEAD~~
[detached HEAD 01773a5] second commit.
 2 files changed, 2 insertions(+)
 create mode 100644 fuga.csv
 create mode 100644 hoge.csv
Successfully rebased and updated refs/heads/master.

$ git log --oneline
01773a5 second commit.
9948182 first commit.
```

## git merge --squash

```bash
$ git branch
* feature/hoge
  master
  
$ git log --oneline
685f2cd branch second.
3db2c11 branch first.
81ce98c third commit 2.
01773a5 second commit.
9948182 first commit.

$ git merge --squash feature/hoge
Updating 81ce98c..685f2cd
Fast-forward
Squash commit -- not updating HEAD
 branch.csv | 1 +
 branch.tsv | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 branch.csv
 create mode 100644 branch.tsv
 
$ git ci -a
[master b18e876] Squashed commit of the following:
 2 files changed, 2 insertions(+)
 create mode 100644 branch.csv
 create mode 100644 branch.tsv
 
$ git log --oneline
b18e876 Squashed commit of the following:
81ce98c third commit 2.
01773a5 second commit.
9948182 first commit.
```


## 参考

* [5. rebase -i でコミットをまとめる](http://www.backlog.jp/git-guide/stepup/stepup7_5.html)
* [7. merge --squash](http://www.backlog.jp/git-guide/stepup/stepup7_7.html)
PhysicsJSで「上から見下ろしだとしたときの摩擦」を表現するbehaviour

gravityはデフォルトでも用意されているが、ビリヤードみたいに上から見下ろしたとした時の摩擦を表現する方法は、デフォルトではない。

書いた。

```coffeescript
Physics.behavior 'constant-friction', ( parent ) ->
  defaults = {f: 0.00002}
  init: ( options ) ->
    parent.init.call( this );
    @options.defaults( defaults );
    @options( options );
    @_v = new Physics.vector();

  behave: ( data ) ->
    bodies = this.getTargets();
    f = 0.0002

    for body in bodies
      ax = 0
      ay = 0
      cof = body.cof

      if body.state.vel.x > 0
        ax -= f * cof
      else if body.state.vel.x < 0
        ax += f * cof

      if body.state.vel.y > 0
        ay -= f * cof
      else if body.state.vel.y < 0
        ay += f * cof

      @_v.clone {x: ax, y: ay}
      body.accelerate( @_v );
```

これを参考にした。だいたいどんなビヘイビアでも書けそう。
https://github.com/wellcaffeinated/PhysicsJS/blob/master/src/behaviors/constant-acceleration.js#L41

```coffeescript
friction = Physics.behavior 'constant-friction', {}
world.add [
  friction
]
```
DockerHubRegistryイメージサイズのメモ

Docker割と使うようになってきたのですが、気になるのがイメージサイズ。
特にローカルPCだと気になりますよね。

そこで、公式のDockerイメージから
主要な（？）Linuxディストリビューションをダウンロードし
サイズを測ってみました。
どのイメージを利用するかによってもだいぶ変わりますが、
今回は結構適当に公式っぽいものやダウンロード数が多いものをピックアップしてみました。

<br>

## 表
| イメージ名  | 中身 | タグ | サイズ |
|:-----------|-------|------------:|:------------:|
| [ubuntu](https://registry.hub.docker.com/_/ubuntu/)     | ubuntu14.04 |        latest |     192.7 MB     |
| [debian](https://registry.hub.docker.com/_/debian/)     | debian7.7 |       latest |    85.1 MB    |
| [centos](https://registry.hub.docker.com/_/centos/)    | centos7  |  latest |   224 MB    |
| [fedora](https://registry.hub.docker.com/_/fedora/)    |  fedora20 |  latest |   374.1 MB    |
| [vettl/amazon-linux](https://registry.hub.docker.com/u/vettl/amazon-linux/)   |  amazon-linux-201403  |   latest |    607.8 MB    |
| [coreos/etcd](https://registry.hub.docker.com/u/coreos/etcd/)   |  coreos   |  latest |      456.7 MB      |
| [busybox](https://registry.hub.docker.com/_/busybox/)    |  ?  | latest |   2.433 MB    |
| [progrium/busybox](https://registry.hub.docker.com/u/progrium/busybox/)    | ?  |  latest |   4.808 MB    |
| [phusion/baseimage](https://registry.hub.docker.com/u/phusion/baseimage/) | ubuntu | latest  |  289.4 MB    |

busybox、中身はあんまりよくわかってないのですがサイズはとても小さいです。
progrium/busyboxの方にはopkg-installというパッケージ管理ツールが同梱されているようなので
多少使い勝手が良さそうです（まあそれでも他のパッケージツールより使いづらい…）。


## で、どれ使ったらいいの？

debianかubuntu使っておけば間違いないのでは。
どうしても小さいサイズで作りたければ
progrium/busybox で頑張るのも手かもしれません[^1]

[^1]: [consul](https://github.com/progrium/docker-consul)などもこれ使っています
マルチパラダイム言語Haskellを入門するぜ!、やべぇ、超手続きなんすけど!!!!

いやいや、みなさい、最近どうだい? 今日はとりあえず、テンションを上げて記事書いていくよ!

いやー、最近ね。なんか、みんな、変なことばっかり言ってるでしょ? もー、どうしようもなくどーでも良いんだそれ。**壁に毛生えてるらしい騒ぎ**みたいなのを眺めてたら、なんか変なこと言ってるしね。みんな。もぉーわけんわかんないよね! サンショートーメーとか!フックサヨウとか、チエンヒョーカとかさ! お経かよ!

そんなの、ドーデモ良いからさ、楽しい話題するよ!

なんだって、いまいろんなところで、**話題沸騰中のHaskellだよ!**たのしーよ!

なんかね、僕チンの周りでは「**手続き型言語だよ!**」って言われたんだ。なんのこっちゃわからなかったけど、**C言語っぽく**書けるやしーぜ!やべー、**頭悪い僕でもできる**!やるしかないねこりゃ。

# Hello World

さて、なにからって、もちろん、Hello Worldからさ! 見てごらん!

```helloworld.hs
main = print "Hello World"
```

ほら見てごらん! 簡単だねー! 
え?焦らしてことが、大人だってぇ? じゃあ焦らしながら表示させるよ?

```helloworld2.hs
main = do
  print "Hello"
  print " "
  print "World"
```

ね?どうだい、手続きだろ?

# じょーけんぶんき!

まぁ、プログラミングって条件分岐するよね! Haskellも条件分岐できるよ! みてごらん! "stop"って言えば止ってくれるプログラムだよ! 

```stop.hs
main = do
  input <- getLine
  if input == "stop" then
    print "ok"
  else
    main
```

# ループだよ!

いやね、やっぱりプログラムってループしてこそ、ナンボでしょ!いやーHaskellにもforがあるよ見てごらん! 1から10まで数えるよ!

```count10.hs
import Control.Monad

main = do
  forM_ [1..10] $ \i  -> do
    print i
```

## 例題:FizzBuzz
HaskellでFizzBuzzやるよ! 見てごらん!

```fizzbuzz.hs
import Control.Monad

main = do
  forM_ [1..100] $ \i -> do
    if mod i 15 == 0 then
      print "fizzbuzz"
     else if mod i 5 == 0 then
      print "buzz"
     else if mod i 3 == 0 then
      print "fizz"
     else
      print i
```

わー、すごい簡単だね☆

# まとめ

Haskellは簡単で、たのしいからみんなやろうね☆!

# 最後に

なんかね、**関数型言語は短かく書ける**らしいから、記事も短くかいちゃった。

けど、しょーじき短く書けるかシラネ。
Ruby | dotenv gem で 環境変数をスマートに管理 #ruby #dotenv

# dotenv gem で環境変数をスマートに管理
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
dotenv gem で環境変数をスマートに管理します。

他のエントリでの dotenv gem の登場頻度が増えてきたので、一度詳細にまとめようと思います。

## <i class="fa fa-check-circle" style="font-size:1em;"></i> なぜ dotenv gem が必要か？・・・の前に
dotenv gem がなぜ必要か、という話の前提に ***twelve-factor app*** に触れておく必要があります。
dotenv の README.md の出だしで

~~~
Storing configuration in the environment is one of the tenets of a twelve-factor app.
~~~

と記述されています。

twelve-factor app は Heroku が提唱しているモダンなアプリケーションを構築するための 12 のマニュフェストです。
詳細は下記をご確認ください。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [twelve-factor app (和訳)](http://twelve-factor-ja.herokuapp.com/)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [twelve-factor app (原文)](http://twelve-factor-ja.herokuapp.com/)

さて、上記の 12 項目の中に

~~~
III. 設定 (Config)
設定を環境変数に格納する
~~~

というものがあります。
DBや認証の設定などはコードから隔離して、環境変数に設定します。
しかし、開発環境やステージング環境で環境変数を設定するのが現実的ではない場合があります。

## :rage1: そこで dotenv gem の出番
dotenv gem を利用すると、 .env ファイルからロードした値を ENV に設定することができます。
このように、 dotenv gem は development での利用を意図して作られています。

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> Installation

~~~bash
$ gem install dotenv
~~~

or 

* Add dotenv gem to Gemfile

~~~ruby
source "https://rubygems.org"

gem "dotenv"
~~~

* And install

~~~bash
bundle install
~~~

## :scroll: Usage

### :baby_chick: 開発環境の場合 
.env ファイルをプロジェクトルートに作成します

~~~
KEY1=dev_value1
KEY2=dev_value2
~~~

### :chicken: Staging 環境の場合 
.env ファイルをプロジェクトルートに作成します

~~~
KEY1=staging_value1
KEY2=staging_value2
~~~

### :dragon_face: プロダクション環境の場合 
環境変数を設定します。

~~~bash
export KEY1=production_value1
export KEY2=production_value2
~~~

### <i class="fa fa-code" style="font-size:1em;"></i> ソースコード
開発環境共、Staging環境、プロダクション環境に同じコードで環境変数 or .env ファイルから値を取得できます。

~~~ruby
require 'dotenv'
Dotenv.load

p ENV['KEY1'] # => dev_value1 or staging_value1 or production_value1
p ENV['KEY2'] # => dev_value2 or staging_value2 or production_value2
~~~
CでMySQLにアクセスする


#概要
MySQLのCドライバを使って
MySQLにアクセスするサンプルを作りましたので、そのソースと手順などを共有したいと思います。

#開発環境構築
MySQLとドライバをインストールします。

```bash
yum -y update
yum -y install mysql-devel mysql-server gcc
service mysqld start
```

Ubuntu(docker ubuntu:14.10)

```bash
apt-get update
apt-get -y upgrade
apt-get -y install libmysqlclient-dev mysql-server gcc
/etc/init.d/mysql start
```

##テスト用データの入力
テスト用なので適当にデータを入れてください。

```bash
mysql -uroot
create database db_test;
use db_test
create table tb_test(id int,name varchar(256));
insert into tb_test(id,name) values(1,"aaa");
insert into tb_test(id,name) values(2,"bbb");
insert into tb_test(id,name) values(3,"ccc");
exit
```

#MySQLへアクセス
```c:mysql.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
int main(void){
  MYSQL *conn     = NULL;
  MYSQL_RES *resp = NULL;
  MYSQL_ROW row;
  char sql_str[255];
  char *sql_serv  = "localhost";
  char *user      = "root";
  char *passwd    = "";
  char *db_name   = "db_test";
  
  memset( &sql_str[0] , 0x00 , sizeof(sql_str) );

  // mysql接続
  conn = mysql_init(NULL);
  if( !mysql_real_connect(conn,sql_serv,user,passwd,db_name,0,NULL,0) ){
    // error
    exit(-1);
  }
  
  // クエリ実行
  snprintf( &sql_str[0] , sizeof(sql_str)-1 , "select * from tb_test" );
  if( mysql_query( conn , &sql_str[0] ) ){
    // error
    mysql_close(conn);
    exit(-1);
  }
  
  // レスポンス
  resp = mysql_use_result(conn);
  while((row = mysql_fetch_row(resp)) != NULL ){
    printf( "%d : %s\n" , atoi(row[0]) , row[1] );
  }
  
  // 後片づけ
  mysql_free_result(resp);
  mysql_close(conn);
  return 0;
}
```

##コンパイル、実行
「/usr/lib64/mysql/」の部分はfind /-name "libmysqlclient.so"等で
ライブラリの配置場所を探してパスを指定します。

```bash
gcc -Wall -o mysql mysql.c -lmysqlclient -L/usr/lib64/mysql/
./mysql
1 : aaa
2 : bbb
3 : ccc
```
[Latex] Latex Mark

Memo for Latex mark [here](http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/chara.html)

Note:

In the qiita, can use the latex like this:

    ```math
    (\dfrac {a} {b} * c) \% m
    ```

Result:

```math
(\dfrac {a} {b} * c) \% m
```

More about qiita Latex: [here](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E6%95%B0%E5%BC%8F%E3%81%AE%E6%8C%BF%E5%85%A5)
Android Studio + Google App Engine でお手軽バックエンドサーバ構築


# はじめに
モバイルアプリを作っていると、ちょっとしたバックエンドサーバを構築したいことってよくありますよね。そんなときにおすすめの方法を紹介します。

本投稿は、下記サイト、ブログ、動画で紹介されている導入部分の手順を簡単にまとめたものです。

https://www.youtube.com/watch?v=KBhOkfbbZLk#t=516
http://android-developers.blogspot.jp/2014/12/build-mobile-app-services-with-google.html
https://cloud.google.com/mobile/

下記のようなメリットがありますので、Android エンジニアにとってはとても嬉しいのではと思います。

* アプリ開発で使用している Android Studio をそのまま使える
* プラグインの追加不要
* 慣れ親しんた IDE で開発できる
* Android Studio 上から Google App Engine に簡単にデプロイできる
* Google App Engine は無料枠の範囲ならお金がかからない

サンプルアプリのデプロイであれば、ビルド時間を除けば 5分もかからずできると思います！

## 導入手順

### 新規モジュールの追加

対象のアプリのプロジェクトから新規モジュールの追加を選択します。

![gae1.png](https://qiita-image-store.s3.amazonaws.com/0/39324/ee9c6e20-70a3-c8ff-6aac-e45a9ec0903b.png "gae1.png")

### モジュールタイプの選択

Google Cloud Module を選択し次に進みます。

![gae2.png](https://qiita-image-store.s3.amazonaws.com/0/39324/b3cf0804-9e9f-57ba-02b2-afa5c34b2dad.png "gae2.png")

### モジュールの設定
モジュールの設定を行います。Module type は App Engine Java Endpoints Module を選択します。

![gae4.png](https://qiita-image-store.s3.amazonaws.com/0/39324/dbcfec30-b473-2cfa-b478-4e2f00780427.png "gae4.png")

完了後、さきほど作成したモジュールが追加されます。

![gae10.png](https://qiita-image-store.s3.amazonaws.com/0/39324/df09df63-7d32-9703-17c0-00058c8fdc2a.png "gae10.png")

### ローカルで動作確認する

ローカルで動作確認する場合は、backend モジュールを選択し、実行ボタンをクリックします。

![gae6.png](https://qiita-image-store.s3.amazonaws.com/0/39324/94d2532e-7368-67e0-bf76-312810358a54.png "gae6.png")

http://localhost:8080/ にアクセスすると、下記のページが現れます。

![gae11.png](https://qiita-image-store.s3.amazonaws.com/0/39324/d324ce0e-4082-cf25-73db-e98b83a5d4db.png "gae11.png")

画面上段の Google Cloud Endopoints API Exploer をクリックすると、API のメソッドが表示されます。

![gae14.png](https://qiita-image-store.s3.amazonaws.com/0/39324/12b1e622-825a-8e09-b908-2bef0ab77e1a.png "gae14.png")


### App Engine にデプロイする

[Build] - [Deploy Module to App Engine] を選択します。

![gae7.png](https://qiita-image-store.s3.amazonaws.com/0/39324/5c735c17-07a5-ef05-c93d-692e8ed41a03.png "gae7.png")

Deploy to から App Engine のどのプロジェクトにデプロイするかを選択します。初回は認証が必要です。

Deploy ボタンを押せばデプロイ完了です！！簡単！！

![gae8.png](https://qiita-image-store.s3.amazonaws.com/0/39324/7469fcab-85ea-26ae-cff0-65570ae34d08.png "gae8.png")


App Engine ってそもそも何という方はこちらをどうぞ。
https://cloud.google.com/appengine/?hl=ja
ページフォールト処理


1. ハードウェアは、プログラムカウンタをスタック上に保存してカーネルへトラップをかける。
大半のマシンでは、実行されていた命令の状態についての情報も特殊なレジスタに保存している。
2. アセンブリコードルーチンを実行。OS の破壊を防止するため、汎用レジスタとその他の揮発性の情報を保存してから手続き呼び出しの形で OS を呼び出す。
3. OS はページフォールトが発生したことを認識する。そして必要とされる仮想ページを見つける。
1つのハードウェアレジスタがこの情報を持っていることが多い。持っていない場合は、OS はプログラムカウンタを調べてその命令を取り出す。
ページフォールト時にその命令が何をしていたかはハードウェアで解析することになる。
4. ページフォールトを発生させた仮想アドレスを知った後、システムはそのアドレスがそのアクセスに対して保護を含めて正しいアクセスかどうかをしらべる。
正しいアクセスでなければ、そのプロセスにシグナルを送るか強制終了させる。
正しいアクセスであれば、システムは空きページフレームを探す。
空きフレームがなければ、ページ置き換えアルゴリズムを起動して追い出しページを決める。
5. 選択されたページフレームがダーティであれば、そのフレームをディスクへの転送のためにスケジュールしてコンテキストスイッチをかける。
つまりフォールトを起こしたプロセスをサスペンドさせ、他の1つのプロセスをディスク転送完了まで実行する。
この時、そのフレームは他の目的に使用されないようにビジーとマーキングされる。
6. ページフレームがクリーンになると、OS は要求されたページがディスクのドコにあるかを調べる。
そしてそれを持ってくるようにディスク操作をスケジュールする。
そのページをロードしている間はフォールトを起こしたプロセスはサスペンドにされ、もし必要があれば他のユーザプロセスを実行する。
7. メモリへのページロード完了を通知する割り込みがディスクからかかると、マッピングを変更するようにページテーブルを更新する。
そしてそのページフレームは通常の状態であるとマーキングされる。
8. フォールトを起こした命令をフォールトが始まった時の状態に戻し、プログラムカウンタをその命令を指すように再設定する。
9. フォールトを起こしたプロセスをスケジューリングして、OS は呼び出し元のアセンブリコードルーチンへ戻る。
10. アセンブリルーチンはレジスタ内容とその他の状態を復元してからユーザ空間に戻り、フォールトがなかったかのようにプログラムを再開する。
HttpURLConnectionでCookieの取得、使用

# はじめに
CookieHandlerとかCookieManagerとかあったが上手く使いこなせなかった・・・
なのでgetHeaderFieldsでCookieを取得しています。

# やりたいこと
- ニコニコ動画にログインしてCookieの取得
- apiを叩いて結果取得

# ソースコード（Cookie取得部分のみ）
```scala:NicoAuth.scala
package auth

import java.io.PrintStream
import java.net._
import javax.net.ssl.HttpsURLConnection
import scala.util.control.NonFatal

import scala.collection.JavaConversions._
/**
 * Created by FScoward on 15/01/05.
 */
object NicoAuth {

  def authenticate(mail: String, password: String): Option[Cookie] = {

    val loginUrl = "https://secure.nicovideo.jp/secure/login?site=niconico"

    try{
      val connect = new URL(loginUrl).openConnection().asInstanceOf[HttpsURLConnection]
      // POST可能にする
      connect.setDoOutput(true)

      val outputStream = connect.getOutputStream
      // postするデータの作成
      val postData = s"mail=$mail&password=$password"
      val printStream = new PrintStream(outputStream)

      // データをpostする
      printStream.print(postData)
      printStream.close()

      // postした結果の取得
      connect.getInputStream
      val cookie = connect.getHeaderFields.get("Set-Cookie").filter(_.matches("user_session=user_session.*")).mkString.split(";")

      // case classにぶちこむ
      Option(
        Cookie(
          cookie(0),//.replace("user_session=", ""),
          cookie(1),//.replace("expires=", ""),
          cookie(2),//.replace("path=", ""),
          cookie(3)//.replace("domain=", "")
        ))
    } catch {
      case NonFatal(e) => None
    }
  }
}
```

# 実行結果
![スクリーンショット 2015-01-06 23.42.46.png](https://qiita-image-store.s3.amazonaws.com/0/39243/036361b1-f15f-f306-2fdb-21246aea8293.png)

## 結果の一部をデコード

765プロなんだしミリ うぽーつ オワタン&#x30b4w; 最高の娯楽・涼ちん.. ","length":"12:17","title_short":"【アイマス】歌姫ペダル PCM2013 (41)","description_short":"あけましておめでとうございます。今年も動画編集頑張っていきたいと思います。&#x524dsm25154617;　?\/21(水)0:00予定マイリスト:mylist\/39561422コミュ:co372085Twitter:xs...","thumbnail_style":null,"is_middle_thumbnail":true}],"count":38067,"has_ng_video_for_adsense_on_listing":true,"related_tags":["iM@S架空戦記","iM@S架空戦記シリーズ","iM@S架空戦&#x8a18Part1;","iM@S架空戦記支援","iM@S架空戦記最終回リンク","iM@S架空戦記ウ&#x30bdPart1;","iM@S架空戦&#x8a18OP;&#x30fbED;リンク","iM@S架空戦&#x8a18Part0;","iM@S架空戦記一発ネタ","iM@S架空戦記ランキング
# 全容
https://github.com/FScoward/Niconico4s
three.js+vr.jsにおけるカメラの向き

主要ブラウザでNPAPIが非サポートになるのと共に、順次オワコンになることが確実視されているvr.jsだが、私が作っているWebGLフレームワーク「[enforce3D](https://github.com/digitarhythm/enforce3d)」では今のところSafariとFirefoxでは動くので使用している。
で、普通にthree.jsのカメラとOculusRift DK1のジャイロをシンクロさせているのだが、どうやってもリセットされた状態のカメラの向きが90度右を向いた状態になっている。
RICOHのTHETAで撮影した動画や、ネットで拾ってきた全天球動画を使っても同じなので、これはvr.jsの初期位置が右を向いてしまっているのではないだろうか。
で、初期状態を左向きにしたいがどうやってもそれが出来ない。
どなたか分かる方がいれば教えて欲しい（stackoverflowみたいになってしまった）。
Perl でアンダースコアのみの変数をみた

たまたま http://cpansearch.perl.org/src/LBROCARD/Net-Amazon-S3-0.53/lib/Net/Amazon/S3/Bucket.pm のソースを読んでいたら、`_` のみの変数名がでてきた。

```pl
sub _content_sub {
    my $filename  = shift;
    my $stat      = stat($filename);
    my $remaining = $stat->size;
    my $blksize   = $stat->blksize || 4096;

    croak "$filename not a readable file with fixed size"
        unless -r $filename and ( -f _ || $remaining ); # ココ！
    my $fh = IO::File->new( $filename, 'r' )
        or croak "Could not open $filename: $!";
    $fh->binmode;
```

はて、こんな文法あったっけ？と思って調べると、例えばここ http://www.tutorialspoint.com/perl/perl_special_variables.htm には、

> The special filehandle used to cache the information from the last stat, lstat, or file test operator. 

という説明がある。直前のファイルテスト演算子でテストしたファイルを `_` で呼び出せるとのこと。


```pl
if -f $filename && -r $filename && -s $filename

```

なんかは、


```pl
if -f $filename && -r _ && -s _

```

と書けちゃうってことですね。

知らんかった・・・。
Pyramidでjsonを返す

PyramidのViewでjsonを返す。

```python
from pyramid.view import Response
from pyramid.view import view_config

@view_config(route_name='json')
def func(request):
  body = u'''
{{
"key": "value"
}}
  '''
  return Response(body=body, headerlist=[('Content-Type', 'application/json')])
```

Responseクラスを使って返却します。
nodeでredisにリストをrpushしたい



##ベース
基本コード

```node
var redis = require('redis');
var client = redis.createClient();
var _ = require('lodash');


var sample = _.range(1, 1000);
//このサンプルをredisのlistにしておきたい

```

###方法1

毎回redisにコマンドが投げられて激重

```node
_.each(sample, function(value){
	client.rpush('test', value);
}); 

```


###方法2

最後にまとめるのでredisの実行自体は重くはないけど、for文の部分が重い


```node
var multi = client.multi();
_.each(sample, function(value){
	multi.rpush('test', value);
}); 

multi.exec();
```


方法3
重くはない

```node
client.rpush.apply(client, ['test'].concat(sample));
```
Emacsで忘れがちなアレを記録する個人的メモ


#### 設定をせずにアドホックに多段SSHでファイル編集をする

```C-x C-f /ssh:user@bastion|ssh:you@remotehost:/path```

http://www.gnu.org/software/emacs/manual/html_node/tramp/Ad_002dhoc-multi_002dhops.html#index-multi_002dhop_002c-ad_002dhoc-181
Google Container Engine の API Endpoint をブラウザで開くワンライナー

Google Container Engine でクラスタを作成すると、API Endpoint というか、kubernetes のコンテナの配置を見れる画面にブラウザからアクセスすることができます。

↓こんな感じの画面。
![スクリーンショット 2015-01-06 20.21.21.png](https://qiita-image-store.s3.amazonaws.com/0/25774/a4dc4eb5-7305-f8e9-e2c1-318edec85745.png)

ここにアクセスするには、以下の形式の URL にアクセスします。

```
https://user:password@[api endpoint の IP]/static/#/groups/host/selector/
```

本当は /static/index.html でも良いんだけど、それだと`/static/#/groups//selector/` にリダイレクトされて表示がホストごとでなくなるので、自分の好みでこうしている次第。

で、IPとユーザ情報は gcloud 経由で取ってこれるのですが、いちいちコピペするのも面倒なので、Mac OS X 限定ですが、ワンライナーで書いてみました。なお、gcloud とは別に、[jq](http://stedolan.github.io/jq/)コマンドが必要です。

```
open `gcloud preview container clusters describe CLUSTER_NAME --zone ZONE --format json | jq '{endpoint, user: .masterAuth.user, password: .masterAuth.password}' | jq -r '"https:////" + .user + ":" + .password + "@" + .endpoint + "/static/#/groups/host/selector/"'`
```

自分は以下のようにシェル関数とその alias を定義して、

```
function google-container-engine-open() {
  open `gcloud preview container clusters describe $1 --zone $2 --format json | jq '{endpoint, user: .masterAuth.user, password: .masterAuth.password}' | jq -r '"https:////" + .user + ":" + .password + "@" + .endpoint + "/static/#/groups/host/selector/"'`
}
alias gkeopen="google-container-engine-open"
```

こんな感じで使ってます。

```
gkeopen CLUSTER_NAME ZONE
```

地味に便利。
Windows8ストアアプリでGoogle APIライブラリを使用する

# ストアアプリでGoogle API

通常なら `WebAuthenticationBroker.AuthenticateAsync` とか使うんですが。
NuGetにもある、[Google APIライブラリ](https://developers.google.com/api-client-library/dotnet/get_started)群を使用するとアクセスがかなり楽になります。
その使い方のメモ。

*文字だけでスクリーンショットとかは撮ってません。*
*UIがコロコロ変わるのでもう面倒くさいのですよ。*

## Googleの設定

### Projectを作る

まずは、[Google Developers Console](https://console.developers.google.com/project)に行き、プロジェクトを作成します。
使い方は、まあ、その。
フォースを信じよ。

### APIを使用できるように設定する

プロジェクトを作成したら、そのプロジェクトを開き、左側のメニューの中から「APIと認証」の中の「API」を選んでAPIの一覧を出してください。
その中で必要なAPIの行の右端の「ステータス」の列のスイッチをオンにしてください。

### クライアントIDを作成する

同じく「APIと認証」の中の「認証情報」を選び、OAuthの「新しいクライアントIDを作成」します。
すると、適当なClient IDとClient Secretが作成されます。
これでアプリから認証できるようになりました。
作られたClient IDの情報はJSONで使いますので「JSONをダウンロード」をクリックして情報をダウンロードしておきます。

気が向いたら同じく「APIと認証」の中の「同意画面」とかカスタマイズして遊びましょう。

## ストアアプリの設定

### ストアアプリのプロジェクトを作成する

Windows Storeアプリが作れる適当なVisual Studioを起動してプロジェクトを作成します。
この辺はもう、ご自由に。
そこそこカスタマイズして楽しんだら前の項でダウンロードしたJSONファイルをAssetsに追加します。
適当なファイル名に変更して追加してください。

プロパティで
*ビルドアクション：コンテント*
*出力ディレクトリへコピー：新しい時*
とか設定しておいてください。

### Google APIライブラリを追加

プロジェクトの中からNuGetを起動し、検索入力窓に `google` と入力します。
Google API関連のライブラリがずらずら出てきますので、今回は試しにCalendar APIを使ってみましょう。
リストの中から、 `Google.Apis.Calendar.v3 Client Library` をインストールします。
ぞろぞろと依存関係で入ってきますが、まあ、よきに計らってくれます。
他にもAPIの種類ごとにライブラリがありますので、見てみてください。

### 認証とAPIの使用

後はコードで認証とAPIを使います。
ざっと以下のようになります。

```csharp
var cred = await GoogleWebAuthorizationBroker.AuthorizeAsync(
    new Uri("ms-appx:///Assets/client_secret.json"),
    new string[] { CalendarService.Scope.Calendar },
    "user",
    CancellationToken.None);
	
var service = new CalendarService(new BaseClientService.Initializer()
{
    HttpClientInitializer = cred,
    ApplicationName = "Calendar Sample",
});
	
CalendarList cals = await service.CalendarList.List().ExecuteAsync();
foreach (CalendarListEntry cal in cals.Items)
{
    Debug.WriteLine("title:" + cal.Summary);
}
```

1. `GoogleWebAuthorizationBroker.AuthorizeAsync` で認証
1. `CalendarService` で認証とAPIを結び付け
1. `ExecuteAsync` でAPI呼び出し

実に簡単。
あとはもう、credと各IDとライブラリ内の関数使って自由にデータを扱えばよろしい、と。
他のAPIもほとんど同じ流れで使えるはず。

気を付けるのは、2行目のUri。
Assetsに置いたファイルを見に行くようになりますので、間違えないようにして下さい。
Underscore.js テンプレート機能でfunction (n){return a.call(this,n,h)} と表示される。

[ドットインストール](http://dotinstall.com/)で ~~遊んで~~ 勉強している時にエラーが出てきたので対処した話。

# 環境
Windows7 64bit
ブラウザ Chrome
javascript node v0.10.35
Underscore.js v1.7.0
Underscore.js v1.4.4

# 勉強していた動画
[Underscore.js入門
＃10 テンプレート機能を使ってみよう]
(http://dotinstall.com/lessons/basic_underscorejs/22310)

# 問題
コンソールに
function (n){return a.call(this,n,h)}
と表示される。

# 解決
Stack Overflowにありました。

[javascript - underscore template error: function (n){return a.call(this,n,h)} - Stack Overflow]
(http://stackoverflow.com/questions/26560838/underscore-template-error-function-nreturn-a-callthis-n-h)

要は、第二引数のuserが読み込まれてないのでもう1段階間にいれる。

## 問題部分

```js:Underscore.html（抜粋）

var tpl = "<li><%- name %> (<%- score %>)</li>";
var x = _.template(tpl, user);
console.log(x);
```
↓
## 修正

```js:Underscore.html（抜粋）
var tpl = "<li><%- name %> (<%- score %>)</li>";
var answer = _.template(tpl);
var result = answer(user)
console.log(result);
```


## ソース

```js:Underscore.html
<!doctype html>
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
	<script src="underscore-min.js"></script>
	<script>
		(function() {

			var x;
			var user = {
				name: 'taguchi',
				score: 80,
				web: 'http://www/dotinstall.com'
			};
			var tpl = "<li><%- name %> (<%- score %>)</li>";

			var answer = _.template(tpl);
			var result = answer(user)
			console.log(result);

		})();
	</script>
</body>
</html>
```


後記
ソースを眺めてみても間違ったところはないし、動画と結果が違うし何が悪いのか、ChromeDeveloperToolsでみても代入される文字列は想定とは違うものが代入されている、Underscore.jsのバージョンまで合わせて探してきて使ってみたが結果は同じ。
ググってみてようやく何とかなったが、なぜ第二引数のデータが読み込まれなかったのか？動画と何故違いが出たのか？は謎のまま。
Install RMagick on mac


ImageMagickは、ここからバイナリ落としてインストール
http://cactuslab.com/imagemagick/


```Gemgile
gem 'rmagick', '2.13.4', require: 'RMagick'
```


```
export PKG_CONFIG_PATH=/opt/ImageMagick/lib/pkgconfig/
bundle install
```
jQuery-UIのソートに触れてみる。



# jQuery-UIのソート機能を使ってみる。
http://jqueryui.com/ を参考にソート昨日のお勉強。

```
$("要素").sortable();
```
これでその子要素がソート対象になる。
### サンプル
```
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery UI Sortable - Default functionality</title>
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  <script src="http://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css">
  <style>
  #sortable1, #sortable2 {
    border: 1px solid #eee;
    width: 142px;
    min-height: 20px;
    list-style-type: none;
    margin: 0;
    padding: 5px 0 0 0;
    float: left;
    margin-right: 10px;
  }
  #sortable1 li, #sortable2 li {
    margin: 0 5px 5px 5px;
    padding: 5px;
    font-size: 1.2em;
    width: 120px;
  }
  </style>
  <script>
  $(function() {
    $( "#sortable1, #sortable2" ).sortable().disableSelection();
  });
  </script>
</head>
<body>
 
<ul id="sortable1" class="connectedSortable">
  <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li>
  <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li>
  <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li>
  <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li>
  <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li>
  <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li>
  <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li>
</ul>

<ul id="sortable2" class="connectedSortable">
  <li class="ui-state-highlight"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li>
  <li class="ui-state-highlight"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li>
  <li class="ui-state-highlight"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li>
  <li class="ui-state-highlight"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li>
  <li class="ui-state-highlight"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li>
  <li class="ui-state-highlight"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li>
  <li class="ui-state-highlight"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li>
</ul>
 
 
</body>
</html>
```
上記サイトのサンプルにちょっとだけ手を加えてみた。sortable1またはsortable2のIDを持つulの子要素、つまり内部のliがソート対象。
2つのリストはソートはできるがリスト間は行き来できない。
それぞれのulにconnectedSortableクラスが用意されている。大方の想像通りこれを利用して連結できる。

```
<script>
$(function() {
  $( "#sortable1, #sortable2" ).sortable({
    connectWith: ".connectedSortable"
  }).disableSelection();
});
</script>
```
connectedSortableクラスを持つもの同士は繋げられますよとconnectWithなる定義することで、さっきまで完全に別々のリストとして扱われていた２つのリスト間を自由に行き来できるようになりましたとさ。

ソートを扱うときに必要に最低限覚えておけばよさげなのはこのあたりだと思う。引き続き触ってみて追記するかも。
Apacheのmod_vhost_aliasでログをバーチャルホスト単位で分割できない問題をmod_mrubyで解決する

# mod_vhost_alias

Apacheのmod_vhost_aliasのVirtualDocumentRootは非常に便利で
一つの設定でapacheの再起動なしに複数のVirtualHostを運用する事ができます。

しかし、mod_vhost_aliasにはその特性上からかいくつか欠点があり、そのうちの一つとして
「アクセスログ、エラーログがVirtualHost単位で分割できない」
という問題があります。

最悪アクセスログに関しては`LogFormat`にて`%v`を指定する事でVirtualHostのServerNameをログに出力させる事ができるので、フィルターなりを行うとなんとか取得可能なのですが、エラーログについてはApacheの仕様で`LogFormat`を変更できないという事がありどうしようもない状態でした。

今回はmod_mrubyを使用してmod_vhost_aliasのどうしようもないエラーログをVirtualHost単位に出力させる方法を検証しました。

# mod_mruby
mod_mrubyは@matsumotory氏が開発を始めたApacheの拡張モジュールです。mrubyでApacheのモジュールが書けちゃいます。

(mod_mruby) https://github.com/matsumoto-r/mod_mruby
(document)  https://github.com/matsumoto-r/mod_mruby/wiki

## mod_mrubyのインストール

```
# debian
apt-get install ruby bison libhiredis-dev
# centos
yum install ruby bison hiredis-devel

cd /usr/local/src
git clone git://github.com/matsumoto-r/mod_mruby.git
cd mod_mruby
sh build.sh
make install

```

modules/mod_mruby.soが作成され、httpd.confに

```
LoadModule mruby_module       modules/mod_mruby.so
```

の行が追加されます。

## apacheの設定

```
<VirtualHost *:80>
    VirtualDocumentRoot /home/%0/public
    mrubyInsertFilterMiddle /path/to/vhost-log.rb
</VirtualHost>
```

mod_vhost_aliasは、上記のような設定です。
ちなみに、ここでErrorLog ディレクティブを設定しちゃうと、mrubyでの別ファイルへのerror_log出力は動かなくなったので記述はしないようにしています。
mrubyInsertFilterMiddleという部分はフックするタイミングで、続いて、実行するmrubyスクリプトのパスを記述します。

今回のエラーログ分割では、ここで`mrubyInsertFilterMiddle`としなければうまく動きませんでした。
具体的には`mrubyLogTransactionMiddle`ですと、うまくふりわけきれないような挙動となりました。(なんでだろう・・)

## vhost-log.rb

```rb
# coding: utf-8

r = Apache::Request.new

unless Dir.exist?("/usr/local/apache2/logs/" + r.hostname) then
  Dir.mkdir("/usr/local/apache2/logs/" + r.hostname , 0705)
end

r.error_log_into "/usr/local/apache2/logs/" + r.hostname + "/error_log"

Apache::return(Apache::OK)
```

r.error_log_into というメソッドにてApacheのエラーログを任意のファイルに書き出す事ができます。(@matsumotory氏にtwitterにて教えて頂きました)
また r.hostname メソッドにて接続中のServerNameを取得し、その値に応じてディレクトリを作成しログの出力先を変更しています。

## テスト

ここでApacheを再起動。
エラーが出るようなtest.cgiに接続してエラーログが振り分けられるかをテストしました

http://hoge.com/test.cgi

```
cat /usr/local/apache2/logs/hoge.com/error_log

[Tue Jan 06 19:41:37 2015] [error] [client 192.168.56.1] (13)Permission denied: exec of '/home/hoge.net/public/test.cgi' failed
[Tue Jan 06 19:41:37 2015] [error] [client 192.168.56.1] Premature end of script headers: test.cgi
```

http://fuga.com/test.cgi

```
cat /usr/local/apache2/logs/fuga.com/error_log

[Tue Jan 06 19:43:42 2015] [error] [client 192.168.56.1] (13)Permission denied: exec of '/home/fuga.com/public/test.cgi' failed
[Tue Jan 06 19:43:42 2015] [error] [client 192.168.56.1] Premature end of script headers: test.cgi
```

ばっちり！

# おわりに

まだ検証不足ではありますが、mod_vhost_aliasの問題を一つ解決できました。
僕はC言語はまったくできないですし、rubyもペーペーですがそれでも簡単に実装でき驚いています。
今回はエラーログの振り分けがなんとかならないか調べていてmod_mrubyにたどり着きましたが、
mod_mrubyのドキュメントを読めば読むほどその可能性にわくわくしてきました。
これからいろんなところで使ってみたいと思います。

参考

* [mod_mruby ngx_mruby Advent Calendar 2014](http://qiita.com/advent-calendar/2014/mod-ngx-mruby)
* [Apacheによるバーチャルホスト構築レシピ mod_mruby編](http://dev.classmethod.jp/server-side/apache-virtual-host-mod_mruby/) アクセスログの出力はこちらが非常に参考になりました
Picassoでサムネ->オリジナル画像をシームレスに表示させる

##やりたいこと
最初にサムネを表示させて,解像度の大きな画像はロードが完了してから表示させたい。
例えばMaster画面のサムネが並んだリストを選択したあと,Detail画面で大きな画像を表示させるとき。すでにメモリに読んでるはずのサムネを表示しておいて、ロード完了まで何も表示されないのを避けたい。

##実装
Picassoの導入とかはほかにまかせます。

```java
Picasso.with(mContext).load(thumbUrl).into(imageView, new Callback(){
    @Override
    public void onSuccess() {
        Drawable drawable = imageView.getDrawable();
        Picasso.with(mContext).load(originalUrl).placeholder(drawable).into(imageView);
    }

    @Override
    public void onError() {
        Picasso.with(mContext).load(originalUrl).into(imageView);
    }
});
```

Callbackを使ってサムネのロード後にオリジナル画像を読み込むようにします。
また,サムネロードした直後にload(originalUrl).into(imageView)するとサムネの表示がされないので、サムネをdrawableとして取得してplaceholderに設定します。
リリース用apkファイルの作成から、実機deployするまで

リリース用apkファイルの作成から、実機deployするまで

# 0. Disclaimer
Android SDKとJava SDKはインストール済みであることを前提とします。
IDEはAndroid Studioです。
又、Deploy方法はmacからのUSB接続による直インストールです

# 1. keystoreファイルの作成
いきなりで恐縮ですが、ここは省略します。
[こちら](http://memo.pandako.com/?p=196)をご参照ください。
[Android Studio で手動で署名付きapkをビルドする](http://qiita.com/hntn/items/9387c29e8c8fe7bb6f12)もすごく参考になります。
作成されたら適当なフォルダに置いておきましょう

# 2. リリース版APKファイルの作成
## 2.1 メニューのBuildから"Generate Signed APK Wizard"を選択する
![スクリーンショット 2015-01-06 19.29.52.png](https://qiita-image-store.s3.amazonaws.com/1448/59166/f6fd4f6f-3f85-83b5-a8bf-b3df9ad453dc.png "スクリーンショット 2015-01-06 19.29.52.png")

## 2.2 "Next"を押下する
![スクリーンショット 2015-01-06 19.32.14.png](https://qiita-image-store.s3.amazonaws.com/1448/59166/5e72198c-eeeb-a9e5-0865-169dba0dd9d0.png "スクリーンショット 2015-01-06 19.32.14.png")

## 2.3 作成したkeystoreの情報などを入力する。
入力したら"Next"を押下する
![スクリーンショット 2015-01-06 19.34.32.png](https://qiita-image-store.s3.amazonaws.com/1448/59166/24a77b66-875b-6c7a-8589-e0050cf49ed4.png "スクリーンショット 2015-01-06 19.34.32.png")

## 2.4 APKを収納するフォルダを選択、"Build Type"に"release"を選択する
選択したら"Finish"を押下する
![スクリーンショット 2015-01-06 19.36.21.png](https://qiita-image-store.s3.amazonaws.com/1448/59166/3778f081-1c68-8fdb-8850-b1298196d931.png "スクリーンショット 2015-01-06 19.36.21.png")

# 3. 作成されたAPKファイルの実機インストール(USB接続)
## 3.1 adbツール(Android Debug Bridge)にパスを通す。
ダウンロード済みのandroid sdkのplatform-toolsにパスを通す。

`% export PATH=$PATH:/hogehoge/android/sdk/platform-tools`

## 3.2 adbコマンドを叩いてインストールする
`% adb install hoge.apk `

## 3.3 おしまい
後は実機でアプリを動作させる。

# 4 その他
Qiita初投稿となります。言い訳のつもりはございませんが、不手際等ございましたらご指摘ください。
Chrome + Lollipopでタブの色を変えるtheme-colorタグ

Android LollipopのChromeで何気なくGoogleのサイトを見ていたら、タブの色が変更されていることに気づいた。
https://www.google.com/get/cardboard

| Lollipop | Kitkat |
|----|----|
|![Screenshot_2015-01-06-18-55-31.png](https://qiita-image-store.s3.amazonaws.com/0/52410/95523bc0-a9e0-1e4b-d88b-ed73cbe2926a.png) | ![Screenshot_2015-01-06-19-29-57.png](https://qiita-image-store.s3.amazonaws.com/0/52410/619414a4-efdd-a2b7-183d-942aed7b5655.png) |

おわかりいただけただろうか。


## theme-colorタグ

さっそくソースを見て何をしているか確認してみましょう。
CSSかMETAタグだと思いますが、わかりやすいと嬉しいです。。。


...
......
.........

とてもわかりやすい感じでした。

```html
<meta content="#FF6E40" name="theme-color">
```

editey.comでおもむろにデプロイしたhtmlにぺったり貼ったところ、見事に再現できました。

![Screenshot_2015-01-06-19-15-18.png](https://qiita-image-store.s3.amazonaws.com/0/52410/fe2533ed-3a90-ad78-5875-7e539558c0f6.png)

良い感じだクマー


## 詳細

HTML5Rockニキが2ヶ月前にまとめてた件。

http://updates.html5rocks.com/2014/11/Support-for-theme-color-in-Chrome-39-for-Android
gem にその場しのぎのパッチを当ててインストールする方法

gem の native extension のビルドがコケる、けどPRを送ったりフォークしたりは面倒くさい、今すぐインストールできればそれでいい、というときはこうする。

```
cd ~/tmp

# gem を取得して展開
gem fetch $gem
gem unpack $gem-x.y.z.gem

# 適当に修正
cd $gem-x.y.z
edit_as_you_want

# gem をパッケージングしてインストール
gem build $gem.gemspec
gem install ./$gem-x.y.z.gem

# 後片付け
cd ..
rm -r $gem-x.y.z{,gem}
```

Bundler でインストールする gem にパッチを当てたいなら、 `bundle install` の前に上記手順を実行する。 gem のインストール先は `gem install -i /path/to/vendor/bundle ...` のように指定する。
PBOX手順書目次

# 顧客向けマニュアル

## 一般ユーザ用

[PC端末のファイルの同期を開始するには？](http://qiita.com/katagirik/items/6d6d9f4ff4224872b7a9)

[Web画面からフォルダを作成するには？](http://qiita.com/katagirik/items/35f58c5382c2a6b02201#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E4%BD%9C%E6%88%90)

[Web画面からファイルをアップロードするには？](http://qiita.com/katagirik/items/35f58c5382c2a6b02201#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89)

[Web画面からバージョン履歴機能の利用するには？](http://qiita.com/katagirik/items/35f58c5382c2a6b02201#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%B1%A5%E6%AD%B4%E6%A9%9F%E8%83%BD%E3%81%AE%E5%88%A9%E7%94%A8)

## 管理者用

[Web画面からグループの管理をするには？](http://qiita.com/katagirik/items/35f58c5382c2a6b02201#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E7%AE%A1%E7%90%86)

[Web画面から共有URL機能を利用するには？](http://qiita.com/katagirik/items/35f58c5382c2a6b02201#%E5%85%B1%E6%9C%89url%E6%A9%9F%E8%83%BD)

# システム運用マニュアル

[初期セットアップ手順書](http://qiita.com/katagirik/items/6c374e2c72fc0d3a3644)

[システム運用マニュアル]()
AWS Amazon S3にTransmit4から接続したいのにUserを作成しただけでは接続できない場合の対処法

AWS Amazon S3にTransmit4から接続しようとして、ググって出てくる方法では接続できなかったので、メモ。
[AWSのアカウント作成](http://aws.amazon.com/jp/register-flow/)や[Transmit](http://panic.com/jp/transmit/)については、ここでの本題ではないので割愛します。

#Amazon S3 Bucketを作成
#####※既存のBucketを割り当てる場合は、ここはスルーしてください。

[AWS Management Console](https://console.aws.amazon.com/console/)から「S3」を選択します。
![Amazon S3 Bucketを作成](https://qiita-image-store.s3.amazonaws.com/0/37964/8511f756-4973-8cec-61a7-40dc0c3229ed.png)

左上の「Create Bucket」を選択するとBucket NameとRegionの設定ウインドウが開くので、任意のBucket NameとRegionを設定し、「Create」を選択するとBucketの作成が完了します。
![Amazon S3 Bucketを作成](https://qiita-image-store.s3.amazonaws.com/0/37964/2d38d1d7-4f21-c767-b1e2-2adb21cf9ae1.png)

#Transmit用のUserを作成
#####※既にUserも作成している場合は、ここもスルーしてください。

右上のプルダウンから「Security Credentials」を選択します。
![Transmit用のUserを作成](https://qiita-image-store.s3.amazonaws.com/0/37964/552adfbd-3955-3cd8-155a-73324a4fdc6c.png)

ウインドウが開くので「Get Started with IAM Users」を選択します。
![Transmit用のUserを作成](https://qiita-image-store.s3.amazonaws.com/0/37964/a569ba9c-5f10-86ba-010d-e015547724c8.png)

「Create New Users」を選択し、ユーザー名入力画面で任意のユーザー名を入力。「Create」を選択し、Userを作成します。
![Transmit用のUserを作成](https://qiita-image-store.s3.amazonaws.com/0/37964/15673405-5528-e7cc-783a-e4d54d33bf96.png)

次画面で**Access Key ID**と**Secret Access Key**が発行されるので保存します。（Download CredentialsでCSV形式のダウンロードもできます）
![Transmit用のUserを作成](https://qiita-image-store.s3.amazonaws.com/0/37964/e4c9ee61-49ed-fba2-8cc1-3222ab8b3259.png)


#Groupを作成し、Permissionsを設定する（ここが重要）
先の画面で「Close」を選択すると管理画面に戻るので、「Groups」→「Create New Group」を選択します。
![Groupを作成する](https://qiita-image-store.s3.amazonaws.com/0/37964/b767c3dc-6712-d922-ca04-e8105de248d3.png)

Group Nameを設定し、「Next Step」を選択します。
![Groupを作成する](https://qiita-image-store.s3.amazonaws.com/0/37964/9c457c93-e7ac-95ce-e6d3-9f903df58050.png)

Policy Nameを変更したければ変更し、「Next Step」を選択します。
![Groupを作成する](https://qiita-image-store.s3.amazonaws.com/0/37964/d532f3a5-f8d2-f59c-e1e5-00b9f3616f43.png)

Set Permissionsで**Administrator AccessかPower User Access**を選択。
※「個人での利用かつ、Transmit4で読み書きを可能にする」前提での説明なので、ここでは各自の環境毎に設定してください。
![Groupを作成する](https://qiita-image-store.s3.amazonaws.com/0/37964/e6897274-dcb4-9fff-353e-3a6e4d71ba6a.png)

確認画面（Review）で問題なければ「Create Group」を選択し、Groupの作成が完了です。

#UserにGroupを紐付ける（ここも重要）
管理画面に戻り、「Users」を選択。作成したUser Nameをチェックし、「User Actions」→「Add User to Groups」を選択します。
![UserにGroupを紐付ける](https://qiita-image-store.s3.amazonaws.com/0/37964/5bf5640d-4f68-e300-0820-1982f1aea2f7.png)

作成したGroupをチェックし、「Add Users」を選択。これでAWS側の準備は完了です。
![UserにGroupを紐付ける](https://qiita-image-store.s3.amazonaws.com/0/37964/dc6e1928-5705-7c6c-bf5d-3637d651aacf.png)

#TransmitでAWS Amazon S3に接続する
「S3」タブを選択。サーバはそのまま、アクセスキーIDに**Access Key ID**、シークレットに**Secret Access Key**を入力すれば、接続できます。
![TransmitでAWS Amazon S3に接続する](https://qiita-image-store.s3.amazonaws.com/0/37964/ccf397e2-970b-c555-7817-cd2e438f7323.png)
MySQLユーザのためのPostgreSQLチートシート


## 情報取得系コマンド

| mysql | psql |
|---|---|
| show tables | \dt |
| desc table | \d+ table <br>  もしくは <br> select * from pg_table_def where tablename = \<tablename\> |
| show index | select * from pg_indexes |
| show processlist | select * from pg_stat_activity |
| show variables | show ALL; |
| desc \<query\> | explain \<query\> |



## CLIコマンドラインオプション

| mysql | psql |
|---|---|
|-u, --user|-U, --username|user|
|-P, --port|-p, --port|port|
|-p, --password|-W, --password|password|
|-h, --host|-h, --host|host|
ジェネレータが使用できない時にオプションを自動で付け直す


function*の方式で関数が定義できるかをevalで調べて、だめなら--harmonyオプションを付けてforkするというサンプルです。

そもそもサポートしていない環境ではリトライが永遠に続くため、環境変数を設定して環境変数があれば諦めるということをやっています。

```javascript
(function(){
	try{
		//ジェネレータが利用できるかをチェック
		eval("var a = function*(){}");
	
		//利用できればビジネスロジック	
		setTimeout(function(){
			console.log("OK", process.argv.slice(2));
		}, 1000);
	}catch(e){
		//既にリトライならばジェネレータがサポートされていない環境であるため終了
		if(process.env.NODE_WITH_HARMONY_OPTION){
			console.log("Unsupported");
			process.exit();
			return;
		}
	
		//利用できない場合はfork
		console.log("Retrying");
	
		//引数の処理
		var execArgv = process.execArgv.concat("--harmony");
		var modulePath = process.argv[1];
		var argv = process.argv.slice(2);
		var env = process.env;
		env.NODE_WITH_HARMONY_OPTION = 1;
	
		//fork
		var fork = require("child_process").fork;
		fork(modulePath, argv, {execArgv : execArgv, env : env});
	}
})();
```
※付け直すオプションは--harmony_generatorsの方が良いかもしれない。
非同期処理におけるglobalとdomainを使ったトリック


##domainのおさらい
非同期処理を行う際にdomainと紐付けておくと、domain単位でエラーハンドリングでき、さらにそのdomainに紐付けられた非同期処理の中から呼び出された非同期処理も、同じdomainに紐付きます。

```javascript
var Domain = require("domain");

//エラーハンドラ
var handler = function(e){
	console.log(e);
};

//TEST
var test = function(code, wait){
	var d = Domain.create();
	d.on("error", handler);
	d.run(function(){
		setTimeout(function(){
			setTimeout(function(){
				setTimeout(function(){
					//非同期で例外をスロー
					throw new Error(code);
				}, wait);
			}, wait);
		}, wait);
	});
};

test(1, 40);
test(2, 140);
test(3, 70);

//1,3,2の順番にhandler関数が呼ばれる
```

パラメータを渡して業務処理を行うとすると、以下のようなコードになります。

```javascript
var Domain = require("domain");

//業務処理
var work = function(code){
	console.log(code);
};

//TEST
var test = function(code, wait){
	var d = Domain.create();
	d.run(function(){
		setTimeout(function(){
			setTimeout(function(){
				//業務処理の呼び出し
				work(code);
			}, wait);
		}, wait);
	});
};

test(1, 40);
test(2, 140);
test(3, 70);
//1,3,2の順番で業務処理が呼び出される
```

##domainに値を設定
もし何らかの事情でwork関数は非同期呼び出ししかできず、さらにパラメータを渡すのも難しい場合、domainに値を追加するという方法があります。

```javascript
var Domain = require("domain");

//業務処理
var work = function(){
	//process.domainは現在の実行domainがセットされている
	console.log(process.domain.code);
};

//TEST
var test = function(code, wait){
	var d = Domain.create();
	//値を追加する。domainオブジェクトの関数上書きに注意
	d.code = code;
	d.run(function(){
		setTimeout(function(){
			//業務処理の呼び出し
			setTimeout(work, wait);
		}, wait);
	});
};

test(1, 40);
test(2, 140);
test(3, 70);
```
このコードでは作成したdomainのcodeに値をセットし、process.domain.codeから値を参照しています。

##globalを使ってグローバル変数のように参照
ここからがトリックになります。globalにgetterを設定し、そのgetterでprocess.domain.codeを返すようにすると、グローバル変数のように扱えます。

```javascript
var Domain = require("domain");

//業務処理
var work = function(){
	//globalのメンバーは直接参照可能
	console.log(code);
};

//globalオブジェクトにプロパティを設定
Object.defineProperty(global, "code", {
	get : function(){
		//ここで現在の実行ドメインを返す
		return process.domain.code;
	}
});

//TEST
var test = function(code, wait){
	var d = Domain.create();
	d.code = code;
	d.run(function(){
		setTimeout(function(){
			setTimeout(function(){
				setTimeout(work, wait);
			}, wait);
		}, wait);
	});
};

test(1, 40);
test(2, 140);
test(3, 70);
```
globalを使用するのはトリッキーではありますが、DSLを作成する際などに便利かと思います。
Apache Spark - RDDのjoin関数が見つからずコンパイルエラーになる場合の対処方法


Spark RDDのjoin関数が見つからずエラーが発生する場合の対処方法について以下に記述します

# 現象

SparkにはRDD(K,V)とRDD(K,W)を結合してRDD(K, (V,W))を作成するjoinという関数があります

例えば以下のように使います

```scala:test.scala
    case class tbla(key:String, val:Int)
    case class tblb(key:String, val2:Int)

    (中略)

    val tblaWithKey = tbla.map(n => (tbla.key, n))
    val tblbWithKey = tblb.map(n => (tblb.key, n))

    tblaWithKey.join(tblbWithKey)
```

しかしこのソースをコンパイルすると

```text
error: value join is not a member of org.apache.spark.rdd.RDD[(String, Int)]
```

というエラーが発生して止まることがあります

# 対応方法

以下のimport文を追加してください

```scala:test.scala
import org.apache.spark.SparkContext._
```

このjoin関数はRDDのメンバ関数ではなく、PairRDDFunctionsというクラスのメンバになります
Importしていない場合、このPairRDDFunctionsが見つからず結果joinも使えなくなってしまうというわけです
FuelPHP1.7のDB検索時、クエリビルダーを使わないパターンのセキュリティ対策

**クエリビルダー内でSQLインジェクション対応している**

FuelPHPのDB検索時、クエリビルダーを使用するとSQLインジェクション対策をフレームワーク側でやってくれるので安心です。以下Fuelドキュメントページからの抜粋

>Fuel は、Database クラスのメソッドの1つに渡されるすべての値をエスケープすることにより、SQLインジェクションから保護します。 これは Fuel の中心となるクエリビルダーのレベルで起こるため、クエリビルダーを使うすべてのコード、Fuel の ORM パッケージを含みます、は自動的にエスケープされます。

**但し、クエリビルダーから対応しきれないクエリは別途対策が必要**

UNIONなどはクエリビルダーの機能から存在しません。
http://fuelphp.jp/docs/1.7/classes/database/qb_select.html

検索クエリでUNIONを使用してテーブルを統合するかつ、ブラウザからのキーワードなどがSQLに使用される場合は、必ず別途対策が必要です。

**どうやるの？**

+ mysqli prepare ステートメントを使用する。以下PHPドキュメントから抜粋

```php
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* プリペアドステートメントを作成します */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* マーカにパラメータをバインドします */
    $stmt->bind_param("s", $city);

    /* クエリを実行します */
    $stmt->execute();

    /* 結果変数をバインドします */
    $stmt->bind_result($district);

    /* 値を取得します */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* ステートメントを閉じます */
    $stmt->close();
}

/* 接続を閉じます */
$mysqli->close();
?>
```

+ ブラウザから入力された検索キーワードをエスケープする。
PHPのバージョン5.5以上からmysqlクラスは非推奨になってます。mysqliクラスの使用をおすすめします。

```php
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$keyword = mysqli_real_escape_string($link, $keyword);
mysqli_close($link);
?>
```

そのほかにも対応策はいろいろありますが、重要なのは**FuelPHPクエリビルダーを使用しない場合は別途セキュリティの対策が必要**だということです。
UIから重い処理をする場合のプログラミング比較(C#, Android Java, iOS Swift)

# Android Java
```
public void onClick(View v) {
    new HeavyWorkTask().execute();
}
private class HeavyWorkTask extends AsyncTask<Void, Void, Void> {
    void onPreExecute() { doPreWorkInUIThread(); }
    /** The system calls this to perform work in a worker thread and
    * delivers it the parameters given to AsyncTask.execute() */
    protected void doInBackground() { doHeavyWork(); }
    /** The system calls this to perform work in the UI thread and delivers
    * the result from doInBackground() */
    void onPostExecute() { doPostWorkInUIThread(); }
}
```
# iOS Swift
```
@IBAction func onClick(sender: AnyObject) {
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
    doPreWorkInUIThread()
    dispatch_async(backgroundQueue, {
        doHeavyWork()
        dispatch_async(dispatch_get_main_queue(), 0), {
            doPostWorkInUIThread()
        })
    })
}
```
# C`#`
```
public async void onClick(object sender, EventArgs e) {
    doPreWorkInUIThread();
    await Task.Run({ () => doHeavyWork(); });
    doPostWorkInUIThread();
}
```
# まとめ
もっとも流れるように書けるのは、async/awaitパターンを有しているC#ちゃん！
Android JavaとかiOS Swiftはちょっち野暮ったいっすね＾w＾
Ruby 2.2.0 で json gem がインストールできなかったので対処した

Ruby 2.2.0 で CocoaPods のインストールに失敗した。 cocoapods-0.35.0 が依存する json-1.8.1 の native extension のビルドに失敗するようだ：

```
% gem install cocoapods
Building native extensions.  This could take a while...
ERROR:  Error installing cocoapods:
        ERROR: Failed to build gem native extension.

（略）

compiling generator.c
In file included from generator.c:1:
./../fbuffer/fbuffer.h:175:47: error: too few arguments provided to function-like macro invocation
    VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                              ^
（略）

make failed, exit code 2

Gem files will remain installed in /Users/uasi/.rbenv/gems/2.2.0/gems/json-1.8.1 for inspection.
Results logged to /Users/uasi/.rbenv/gems/2.2.0/extensions/x86_64-darwin-14/2.2.0-static/json-1.8.1/gem_make.out
```

以下の手順で json-1.8.1 に[パッチ](https://github.com/flori/json/pull/231)を当てて対処した：

```
cd ~/tmp

# json gem を取得して展開
gem fetch json -v 1.8.1
gem unpack json-1.8.1.gem

# ソースにパッチを当てる
cd json-1.8.1
curl -s https://patch-diff.githubusercontent.com/raw/flori/json/pull/231.patch | git --git-dir= apply -

# gem をパッケージングしてインストール
gem build json.gemspec
gem install ./json-1.8.1.gem
#gem install -i ../vendor/bundle ./json-1.8.1.gem # Bundler 向け

# 後片付け
cd ..
rm -r json-1.8.1 json-1.8.1.gem

# cocoapods をインストール
gem install cocoapods
```