OmniAICreator/Qiita-1.07M huggingface dataset:
apkファイルからjavaソースコードを見られるようになるまで

やんごとなき事情（汗）から、自分が作成して端末にインストールしていたapkから、Javaソースコードを復元する必要に迫られたので、作業メモ。

最終的には、javaファイルは生成されていないが、コピペして元のプロジェクトに入れつつ、コメントを戻したりGOTO文wを直したりして復元完了(予定)。

## 注意事項

これはいわゆる「リバースエンジニアリング」と言われる手順です。
他者及び他社の作成したapkをリバースエンジニアリングすることは、法律に触れる場合が多いですので、あくまでも、ご自分のapkや社内製の成果物に対してのみ行って下さい。
自己責任でお願いします。

## 作業環境

Mac
JDK7必須

##ステップ1 リソースファイルを復元

apkからresフォルダを復元します。
　*※resフォルダ、特にstrings.xmlの復元が不要な場合は、このステップはやらなくてOK。*

**必要ツール**

* apktool (https://code.google.com/p/android-apktool/downloads/list)

これを書いている時点(2015/01/31)の最新バージョンはv2.0.0RC3のようです。

(1) apktoolをDLし、任意のフォルダに解凍する

(2) apktool.jarに実行権限を付与する

```
# chmod +x apktool.jar
```

(3) 以下コマンドを実行

```
# apktool d 変換したいapkファイル名
```

>このステップだけで、リソース関連が完全復活できたので、この先のdex2jarでちょっとハマったとき、ここまでで諦めるところだった。
レイアウト調整にdimension切りまくってたから、その作業がもっとも「二度とやりたくない」作業だったので(--;


##ステップ2 smali → dex

dex2jarにかけるために、いったんdexに変換する。

**必要ツール**

* smali (https://code.google.com/p/smali/downloads/list)

(1)smali-XXXX.jarを任意のフォルダにDL

(2)以下のコマンドを実行

```
# java -jar smali-XXXX.jar -o 作成するdexファイル名 dexに変換したいsmaliフォルダ
```

apktoolで変換した場合、smaliフォルダは、apkファイル名のフォルダが出来ていると思うので、その直下にあります。

>ここまではすんなり進行。

**追記:**
kimama1997様に、apkをzip解凍するとdexファイルがあるということをコメント頂きました！
なので、このステップは、単純に以下だけでOKです。

```
# unzip apkファイル名
```

すると、解凍フォルダ内に、classes.dexというdexファイルがあるので、それを以降のステップで使えます。

##ステップ3 dex → jar

いよいよjarに変換。

**必要ツール**

* dex2jar (http://sourceforge.net/projects/dex2jar)

(1)dex2jarを任意のフォルダにDL＆zip解凍する

(2)解凍したフォルダ以下すべてのファイルに実行権限を付与する

```
# chmod +x *
```

(3)以下のコマンドを実行

```
# sh dex2jar-2.0-SNAPSHOT/d2j-dex2jar.sh ステップ2で出来たdexファイルパス
```

dexファイル名-dex2jar.jarが出来ていれば成功。

>dex2jarで検索すると、古いプロジェクトを紹介しているサイトがほとんどで、例外はいて落ちてしまうので、ここでいったん諦めかけました^^;
2015/01/31時点でのアクティブなプロジェクトサイトは上記サイトになりますのでご注意を。

なお、jarファイルはコマンドを実行したディレクトリに作成されます。

##ステップ4 jar → class

ステップ3で出来たjarファイルの拡張子をzipに変更して、解凍する

##ステップ5 class → java

やっとソースコードが読めます。

**必要ツール**

* JavaDecompiler (http://jd.benow.ca/)

(1)JD-GUIをDLして実行、appファイルを任意のフォルダに移動して起動

(2)ファイルアイコンをクリック

(3)ステップ4で出来た任意の.classファイルを指定(何か1つ指定すると、全部見られるようになります)

無事、javaっぽいソースコードが見られれば成功！
場合によってはEclipseやIntelliJのプラグインを入れてもいいですね。

>ネット上では、jadでやる方法が多く見られますが、java1.5以上には対応していないっぽいので、こちらの方法にしました。

##その他

バックアップは大切。
手戻りが発生しても痛くない時点で、さっさとソース管理なりに登録しましょう・・・。゜(゜´Д｀゜)゜。
gitでmasterへのpushを防ぐhook

# やりたいこと

* masterにpushしようとしたときに弾く
    * ただしurlがあるパターンにマッチした場合は弾かないようにする

よくあるhookの例としてmasterブランチにいるときに弾く設定はあるけど、masterブランチにいなくてもmasterにpushはできるし、masterにいてもmaster以外にpushしたいことがあるので、このようなhookを使った。

# pre-hook

```sh:pre-hook
#!/usr/bin/env bash
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push for master branch.
remote="$1"
url="$2"
 
allow=$(git config --get-all prevent-push-master.allow)
for pattern in $allow
do
    if [[ $url =~ $pattern ]]; then
        exit 0
    fi
done
 
read local_ref local_sha remote_ref remote_sha
if [[ $remote_ref =~ 'master' ]]; then
    echo 'Prevented push for master branch!'
    exit 1
fi
```

* 参考にしたコード
    * https://github.com/git/git/blob/master/templates/hooks--pre-push.sample

# pre-pushを設置する

上のスクリプトをGitリポジトリの.git/hooks以下に置いて、実行権限をつける。

```sh
$ cd <Gitリポジトリ>/.git/hooks
$ vim pre-push
# コードを貼り付けて保存して終了
$ chmod +x pre-push
```

毎回手でセットするのが面倒な場合はtemplatedirの設定をして、そこにスクリプトを置く。

```
$ git config --global init.templatedir '~/.git_template'
$ mkdir -p ~/.git_template/hooks
$ cd ~/.git_template/hooks
$ vim pre-push
# コードを貼り付けて保存して終了
$ chmod +x pre-push
```

こうしておくと、`git init`や`git clone`した時に、.git/hooksにシンボリックリンクを貼ってくれる。
すでにあるGitリポジトリに対しても`git init`してやるとシンボリックリンクを貼る。

# 設定

mersterへのpushを許可したいユーザーやリポジトリがある場合は

```
$ git config --global prevent-push-master.allow 'tmsanrinsha'
$ git config --global --add prevent-push-master.allow 'repo2'
```

のように設定する。remoteのURLが上記の設定のどれかに部分一致すると、masterへのpushが許可される。

あとは通常通り`git push`してみる。ただ、設定がうまくいってなくて、masterにpushされてしまうと大変なので、
問題のないリポジトリに対して、まずは試して下さい。
#PPx 開いているタブをListfileで表示してインクリメンタルサーチ

# Paper Plane xUI において開いているタブをListfileで表示してインクリメンタルサーチ

たくさんタブを開いていると、タブの選択もインクリメンタルサーチを使いたくなるのでListFileを使ってなんとかしてみた。

[#PPx fenrir を使ってインクリメンタルサーチでタブを選択 - hokorobiの日記](http://d.hatena.ne.jp/hokorobi/20130404/1365080874) を使っていたけれど fenrir の起動が遅くて嫌になった。

こんなスクリプトを *script で実行。

```js
//!*script
// 開いているタブをListfileで表示してインクリメンタルサーチ
// fenrir を使っていたけど、起動が遅いので ListFile を使ってみる。
// PPx 1.41 x64 + Script Module R14

var tabs = PPx.Pane.Tab;
if (tabs.Count < 3) PPx.Quit();  // 非表示のタブがなければ何もしない


// 重複を除いた非表示のパスを取得。

// path をkeyとする連想配列作成。0 は表示されているパス、1 は非表示のパス。
var paths = {};
var tab = '';
var path = '';
for (var i = 0; i < tabs.Count; i++) {
    tab = tabs.Item(i);
    path = tab.Extract('%D');
    if (paths[path] != undefined && paths[path] == 0) continue;
    tab.Type == -2 ? paths[path] = 1 : paths[path] = 0;
}

// 非表示のパスがなければ何もしない
// Object.keys(paths).length は使えなかった。
var pathscnt = 0;
for (var path in paths) pathscnt++;
if (pathscnt < 3) PPx.Quit();

// ListFile 作成
fso = new ActiveXObject('Scripting.FileSystemObject');
var tmpfile = fso.BuildPath(fso.GetSpecialFolder(2), fso.GetTempName());
var f = fso.OpenTextFile(tmpfile, 2, true);
for (var path in paths) {
    if (paths[path] == 1) f.Write(path + '\n');
}
f.Close();

// リストファイルを表示してインクリメンタルサーチを実行

// こいつだと駄目だった。
// PPx.Execute('*ppc -k *jumppath ' + tmpfile + '::listfile /noasync /nofixpath %%: %%K"/J"'); //tmpfileの親ディレクトリが表示される。インクリメンタルサーチにはなる
// PPx.Execute('*ppc -k *jumppath ' + tmpfile + '::listfile /noasync /nofixpath'); //この形ならlistfileには入れる

// TODO: タブを選択したいので、新しく開いてしまうタブを消したい。無理かな
// PPx を -single で起動して、元のPPxのタブを変更した後に -single を閉じるとか考えたけど無理そう。
// -choose: で任意のコマンドを実行して終了ということができれば可能性はあるか。
// TODO: Listfileが最後のディレクトリ名だけ表示される。フルパスにしたい。
// XC_pmsk で指定できるが別のListFileは表示方法を変えたい。
// -k 以降が、なぜこうすると動くのかよくわからん……
// これだと %%K"/" は設定によって変えないといけないと思う。
PPx.Execute('*ppc ' + tmpfile + '::listfile -k %%K"/"');
```

こんな感じでインクリメンタルサーチが始まった状態になる。

![DIB BITMAP.png](https://qiita-image-store.s3.amazonaws.com/0/24711/739fed2f-8a76-44c2-f30b-89a68a42af4c.png)
golang 1.4で追加されたtestingの便利機能(テストの初期化とお片づけ)

golangのtestingパッケージはシンプル主義のgoならではといった、最小限の機能のみを提供しています。実際のところこれまでも(ほぼ)充分な機能を提供してきたわけですが、テスト前の初期化を明確に定義できないなど、不満もありました。

そういうわけで、1.4からこの不満を解決する```testing.M```と```TestMain(*testing.M)```が追加されています。これがかなり最高便利です。

# 従来のテクニック
当然、これまでもテストの"初期化"や"お片づけ"を書きたいという要求は当然ありました。それに対しては、```go test```コマンドがファイルをabc...順に読みこむことを利用して、ファイル名を工夫するというちょっと裏ワザ的な手法が一般的でした。
すなわち、最初に実行したいテストが書かれたファイルは「a_test.go」にして、最後に実行したいテストを「z_test.go」とするわけです。この方法はジョークっぽいのですが、実際に[golang 1.3のnet/httpパッケージ](https://github.com/golang/go/tree/release-branch.go1.3/src/pkg/net/http)など、本流でも盛んに使われているいわば公式テクニックでした。

# より良い方法
現在は21世紀なので、もっと良い方法が提供されました。パッケージ内のどこかで```TestMain(*testing.M)```という関数が定義されていれば、これが```go test```コマンドのエントリーポイントとして機能するようになったのです。この```testing.M```には```Run()```というメソッドが生えていて、これを叩くと今までどおりのユニットテストが走り出します。テストを走らせるタイミングを変えることができるようになったことで、その前後にイロイロな処理を挟むことができるようになりました。
＃ ちなみに```go test```は成否でプロセスのexit codeが変化するので、ケアが必要。

```go
func TestMain(m *testing.M) {
    // ここにテストの初期化処理
    code := m.Run()
    // ここでテストのお片づけ
    os.Exit(code)
}
```

そういうわけでひと目でテストの初期化と終了処理が判るようになって読みやすくなりましたし、なんかこう納得感のある造りになりました。

もちろん[先に紹介したnet/httpパッケージもTestMainを使って書き直されています。](https://github.com/golang/go/blob/release-branch.go1.4/src/net/http/main_test.go)。

# 応用編
この```testing.M```オブジェクトのもうひとつ良い所は、テストを繰り返し実行できることです。これまで"環境を変えて同じシナリオテストを繰り返す"みたいなテストケースでは、かなり無理のあるテストを書く必要がありました。たとえば、

```go
func TestAllEnvironments(t *testing.T) {
    for _, env := range environments {
        setEnv(env)
        testA1(t)
        testA2(t)
        // ....
    }
}

func testA1(t *testing.T) {
    // ...
}

func testA2(t *testing.T) {
    // ...
}
```

のようなケースです。```go test```から呼ばれる親の```TestA1```が環境の切替を行いつつ、テストそのものが書かれた関数を叩いていくような構造ですね。このようなテストを書くと、せっかくのtestingパッケージの仕組みに乗り切っていない･･･となんだかしょんぼりします。
しかし、```testing.M```の登場で、全て通常通りの"Test*"として扱っても同様なテストを実現できるようになりました。

```go
func TestMain(m *testing.M) {
    for _, env := range environments {
        setEnv(env)
        exit := m.Run()
        if exit != 0 {
            os.Exit(exit)
        }
    }
}

func TestA1(t *testing.T) {
    // ...
}

func TestA2(t *testing.T) {
    // ...
}
```

このように書くと、```TestA1()```と```TestA2```は```m.Run()```の回数だけ実行されるので、全ての環境で同じテストを、testingパッケージの仕組みの上に乗せて実現できます。（例は簡略化して書いたんですが、ホントはexitコードにかかわらず全て実行して、最後に死んだほうが良いですね！）

まぁやっぱり上手く扱えないコーナーなケースも思いつくっちゃ思いつくんですが、だいぶ良くなりましたよね。僕は非常に満足しています。
＃ 特にプロダクションで便利ですね。環境差異チェックをスバッと通せます。

目下、趣味で開発中のSQLクエリビルダのDBとの結合テストにも採用してみました。sqliteとMySQLで同じテストを通しますが、golangのtestingの仕組みの上でシンプルに実装することができたと思います。
https://github.com/umisama/go-sqlbuilder/blob/master/integration_test/integration_test.go#L18-L63

# まとめ
golang 1.4からテストの初期化・後片付けや、繰り返しテストをするケースがとても便利になりました。その仕組みである```*testing.M```と```TestMain(*testing.M)```を紹介しました。

リリースノート、packagesの所で小さく取り上げられてただけなので見落としていたんですが、```go generate```よりも個人的には使い手のある機能という感じがしてきていて、なんで気づかなかったんだろうという感じです。
特に手元のプロダクションは無理に書いた子がたくさん居るので、古いコードはドンドン置き換えていきたいなぁ。
カメラモードのせいで、2Dのタッチ操作がずっとできなかった件

2Dでスワイプ操作をしたくて

>http://albatrus.com/main/unity/6541

Physics2D.Raycast とか試してたけど
自分の作った処理ではうまく動かず・・・

他に何か資料が無いかと探してみると・・・


>http://bribser.co.jp/blog/tappobject/

>※CameraのProjectionを**Orthographic**にする


これか！
カメラのモードが重要だったのね。情報の取得を
レイキャストじゃなくてコライダーに変更してもできなかったのはこいつのせい！（by マニュアルを読まない野郎）


***


※あと
2Dだからって Vecor2 で位置を取得する必要は無く、Physics2D.OverlapPoint で Vector3 の位置情報を Collider2d の位置情報として使えるッぽい
【swift】そういえばClassとStructの違いは？

もちろん継承できることだったり方のキャストだったりはあるけど、それ以外の実装時に気づき難いのは何があるかな〜って調べてたら

・Class ▶︎ 参照型
・Struct▶︎ 値型

だった。C++とかだと使えるプロパティのアクセさとかで明確に違うけど、swiftでこういう仕組みになっているのは何か理由があるのかな？型推論をいい感じに実現する上で出来たんやろか

詳しくはコチラのリンク。http://stackoverflow.com/questions/24217586/structure-vs-class-in-swift-language

```

import UIKit

struct TestStruct {
    var aa = 0
    var bb = ""
    init(a:Int, b:String){
        self.aa = a
        self.bb = b
    }
}

class TestClass {
    var aa = 0
    var bb = ""
    init(a:Int, b:String){
        self.aa = a
        self.bb = b
    }
}

var ss = TestStruct(a: 10, b: "test")
var cc = TestClass(a: 10, b: "test")

var s = ss
var c = cc

s.aa = 0
c.aa = 0

print(ss.aa)
print(cc.aa)
```
Netbeansのデバッグ機能をCakePHPで使う

# echoで変数表示してデバッグはつらい
すぐ始められるデバッグ方法としては、echoやログを使用して怪しい部分にデバッグ用のコードを挿入し、実行→確認 をバグが見つかるまで繰り返す方法がありますが、これは効率が悪い上にけっこう辛いです。

## echoでのデバッグ

1. 処理が怪しい所に当りをつけて、echoで変数等を表示する処理を入れる。
2. 表示する。
3. 値は正しかった、違う所が原因だと事が分かる。1に戻る。<br>
……<br>

99.原因となる処理を見つける。
 
(たまに)redirectがあったのを忘れてて表示を見る前にリダイレクトされる。echoでの表示からログファイルの書き込みに変える。

## Netbeansでのデバッグ

1. 処理が怪しい所で実行を一時停止する。
2. 使用中の変数一覧の値を確認
3. 処理を1ステップずつ進め、バグの原因となる処理を見付ける。
4. 終わり。

楽な上に効率も良く、嫌なデバッグ時間を短縮できます。


## デバッグ機能を使用するのに必要な環境

* Xdebugが有効となっているWebサーバ
* netbeans-connectorが利用可能なウェブブラウザ
* Netbeansの設定で、xdebugとCakePHPが上手く動くようにする。

の3点です。

### xdebug有効・無効の確認と設定
phpinfo() を表示し、xdebugの項目があればすでに有効となっています。
XAMPP環境の場合は、xdebugはインストールされていますが初期状態では無効となっているので、[10分でできるXAMPPとXdebugのインストール](http://d.hatena.ne.jp/pinoyuki/20120416/p1)を参考に、Xdebugを有効にします。

NetbeansでXdebugを動かすには、Xdebugの設定が以下となっている必要があるので、php.iniの該当部分を編集し、webサーバの再起動を行います。

```php:php.ini

xdebug.default_enable = 1
xdebug.remote_enable  = on
; xdebug.remote_host    = 127.0.0.1
xdebug.remote_port    = 9000
xdebug.remote_handler = dbgp
xdebug.remote_autostart = 0
xdebug.remote_connect_back=1
```
debug.remote_host はXdebugに接続できるクライアントを制限するためのものですが、
LAN環境等、安全が環境であればコメントアウトをおすすめします。

### netbeans-connector が利用可能なブラウザ
現在では

* Chrome
* Netbeans込み込みのWebKitブラウザ

のみです。Chromeを使用する場合は、[こちら](https://chrome.google.com/webstore/detail/netbeans-connector/hafdlehgocfcodbgjnpecfajgkeejnaa)から入手します。


### Netbeansの設定で、xdebugとCakePHPが上手く動くようにする。
CakePHPはmod_rewriteの機能を使用してブラウザからのアクセスをルータスクリプトに転送しています。Netbeansはこの挙動を自動検出できないため、開始ファイルにルータースクリプトのパスを明示的に指定する必要があります。
プロジェクトを右クリックし、構成→カスタマイズから実行環境を選び、開始ファイルを設定します。

### CakePHP2の場合
![スクリーンショット 2015-01-31 13.21.44.png](https://qiita-image-store.s3.amazonaws.com/0/65326/c32f35c9-169c-fa26-1cd2-c7fcf04a7cba.png)

開始ファイルはCakePHPのバージョンで異なるので、バージョンに合わせ、

* CakePHP2: app/webroot/index.php
* CakePHP3: webroot/index.hp

をそれぞれ指定します。


また、デフォルトではデバッグを開始する毎に最初に実行したphpプログラムの先頭で一時停止します。
このため、CakePHPを使用していると毎回フレームワーク部分で停止し、効率が悪くなります。
この動作を止める場合は、preferencesz→PHP→デバッグ で「最初の行で停止」のチェックを
外します。


## デバッグ実行

デバッグを開始するには、予め一時停止させたい行の行番号をクリックし、ブレークポイントを設定した状態で、「プロジェクトをデバッグ」を押します。これで Xdebugを使用して、NetbeansでCakePHPのデバッグができるようになります。
デバッガの詳しい使用方法は、[NetBeans IDEでのPHPソース・コードのデバッグ](https://netbeans.org/kb/docs/php/debugging_ja.html)を参照してください。

![debug.png](https://qiita-image-store.s3.amazonaws.com/0/65326/c1a3c026-c689-40d5-ae7f-8dcb6980ab75.png)

# 番外 Norton Internet Securityを利用している場合

xdebugで利用するポート9000がNortonでも利用されているため、上記では動作しません。
デバッグ開始時にポートがすでに利用されている旨の警告が出ます。

Netbeansのxdebugポートと、サーバ側のxdebug.remote_port を開いてるポートに変更して対応します。
Chromeでスクロールバーを細くする


scss

```css
.narrow-scrollbar {
    &::-webkit-scrollbar {
        overflow:hidden;
        width:1px;
        background:#fafafa;

        &:horizontal {
            height:1px;
        }
    }

    &::-webkit-scrollbar-button {
           display:none;
    }

    &::-webkit-scrollbar-piece {
            background:#eee;
            &:start {
                    background:#eee;
            }
    }

    &::-webkit-scrollbar-thumb {
            background:#333;
    }

    &::-webkit-scrollbar-corner {
            background:#333;
    }
}
```

![](http://i.gyazo.com/f59948af1b3429540e9bd8e9d57b1f08.png)

参考:

Webkit独自拡張でスクロールバーのデザインを変更する ｜ Developers.IO http://dev.classmethod.jp/client-side/webkit-scrollbar-design/
AWS API のログフォーマットを変更する

AWS API を使っているとこういうログが吐かれると思いますが、

```
[AWS SimpleEmailService 200 0.580066 0 retries] list_verified_email_addresses() ...
```

もっと詳しくリクエストやレスポンスの内容を見たいとか、ログが長過ぎるという事があると思います。そういうときは

```rb
AWS.config(log_formatter: "#{ログフォーマット}")
```

と設定するとログのフォーマットを変える事が出来ます。
sdk に用意されているフォーマットは 4 通りです。

##### 1. `AWS::Core::LogFormatter.default`
初期設定のフォーマット

##### 2. `AWS::Core::LogFormatter.short`
`default` よりも短いログになります。サービス名、HTTP ステータス、かかった時間、オペレーション、エラーがあればエラーのクラスが出力されます。`default` と違いエラーメッセージは出力されません。

```
[AWS SimpleEmailService 200 0.494532] list_verified_email_addresses
```

##### 3. `AWS::Core::LogFormatter.debug`
詳細なログを出力します。レスポンスだけでなくリクエスト内容まで見れるので、かなり冗長になりますが、エラー調査の際に重宝します。

```
+-------------------------------------------------------------------------------
| AWS us-east-1 SimpleEmailService list_verified_email_addresses 0.429189 0 retries
+-------------------------------------------------------------------------------
|   REQUEST
+-------------------------------------------------------------------------------
|    METHOD: POST
|       URL: https://email.us-east-1.amazonaws.com::443:/
|   HEADERS: {"content-type"=>"application/x-www-form-urlencoded" ...
|      BODY: Action=ListVerifiedEmailAddresses&Timestamp= ...
+-------------------------------------------------------------------------------
|  RESPONSE
+-------------------------------------------------------------------------------
|    STATUS: 200
|   HEADERS: {"x-amzn-requestid"=>["..."], ...
|      BODY: <ListVerifiedEmailAddressesResponse ...
```

##### 4. `AWS::Core::LogFormatter.colored`
ログに色がつきます。出力される内容は `default` と変わらないんですが、`[AWS SimpleEmailService 200 0.580066 0 retries]` の部分が太文字の青色になるんで、とっても探しやすい！

## 自分でフォーマットをカスタマイズする
用意されているフォーマットじゃ満足できない場合、自分でフォーマットを決める事も出来ます。
例えばリクエストの Body だけ見たいって人はこんな感じ

```rb
AWS.config(log_formatter: AWS::Core::LogFormatter.new("REQUEST BODY: :http_request_body"))
```

`LogFormatter` に自分の好きな形で文字列を渡してあげればいいです。リクエストのヘッダが見たいとか、レスポンスは HTTP ステータスだけで良いとか、好きに決められます。もちろん色も変えられます。`debug` や `colored` を参考にすれば簡単に作れるでしょう。

## 参照
* [AWS::Core::Configuration docs](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/Core/Configuration.html)
* [aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby/blob/6c55efba0393611850df07dcdbf97d8e196f3703/lib/aws/core/log_formatter.rb)
Android5.0で`Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.app.name.permission.C2D_MESSAGE pkg=com.app.name]`と表示されたときの対応


しょうもないところでハマったのでメモ。

http://stackoverflow.com/questions/27154990/android-l-permission-conflict-between-release-and-debug-apks

Android5.0にしてから開発版と製品版が同居できなくなった！と思ったら↑が原因だと思います。

## 対応

Manifestファイルに書いてるパッケージ名が重複していることが原因なので、`${applicationId}`に置き換えてやれば大丈夫って話です。

こんな感じ

```xml:AndroidManifest.xml
<receiver
	android:name=".gcm.GcmBroadcastReceiver"
	android:permission="com.google.android.c2dm.permission.SEND">
		<intent-filter>
			<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
			<category android:name="${applicationId}"/>
		</intent-filter>
</receiver>

<permission
	android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
```
GCC 拡張アセンブラ構文

GCCによる拡張アセンブラ構文

> `asm` `(` _AssemblerTemplate_ `:` [_OutputOperands_] [ `:` [_InputOperands_] [ `:` [_Clobbers_] ] ] `)`


```c
// for IA-32(x86)
uint32_t code, feature[2];
code = 1;
asm volatile (
  "cpuid"
  : "=c"(feature[0]), "=d"(feature[1])
  : "a"(code)
  : "eax", "ebx");
```

参考サイト

- https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
- http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
- http://www.sci10.org/on_gcc_asm.html
- http://caspar.hazymoon.jp/OpenBSD/annex/gcc_inline_asm.html
- http://d.hatena.ne.jp/kikairoya/20100220/1266668559
静的ページと動的ページの簡単に見分ける方法について

静的ページと動的ページの簡単に見分ける方法について


プログラミング経験１年の者です。

静的ページと動的ページの違いは細かく言うと、いろいろとあると思うのですが
簡単に見分ける方法として

URLの末尾が
.htmlなら静的ページ
それ以外なら動的と言っていいでしょうか？

ただ、そういったサイトも検索フォームやリンクがあって他のサイトに飛べたりするので動的なのかなと思ったりしました。
まずその概念が違うのでしょうか？

動的ページはページが更新されたり、ボタン(サブミットボタン)を押すと他のページに飛んだりできるようなイメージを持っています。掲示板など。

逆に静的ページは文言や画像だけで構成されているといったイメージを持っています。（リンクや検索フォーム、ボタンはいいのかな？）

わかる方がいればよろしくお願いします。

参考サイト
http://hononon.lolipop.jp/acsougolink-2.html
VagrantでPermission Denied系のエラーが出る場合 & 存在するはずのboxが見つからないと言われる場合

一部環境において、以下のようなエラーが出る場合がある。

`Permission denied - /Users/<username>/.vagrant.d/data/machine-index/index (Errno::EACCES)`

このようなエラーは、`~/.vagrant.d/` 以下のファイルのうちいずれかが、ログインユーザー以外のもの(root)になっていることが理由である。

また、すでに作ったはずのVagrant Boxが見つからず、vagrant upしようとしたタイミングで新たにImageをVagrantbox.esからダウンロードし始める場合もある。
これも`~/.vagrant.d/boxes/`というディレクトリがログインユーザー以外のものになっていることが原因なので、chownでパーミッションをログインユーザーにすれば直る。

なお、こうなってしまう原因は不明。どこかでライブラリか何かの兼ね合いでsudoしたままセットアップしてしまったかな？
Scalaでの例外処理

# はじめに
新米のわっちがScalaで書く例外処理の書き方について。
この前話をしていて例外処理を処理の流れに含めるかどうかの違いが一番大きいのかなって気づいたっぽい。

# 書き方の具体例

## Javaっぽい
処理に例外処理を含めない感じ。
あとtryの値をvalでキャッチしないっぽい。

```scala:れーがい.scala

    var contents: BufferedSource = null
    try {
      contents = scala.io.Source.fromURL("htp://www.yahoo.co.jp")
    } catch {
      case e: Exception =>
        printWithLogger(e)
    }
    if (contents != null) {
      val linesAddedWords = contents.getLines().map(_.concat("add words after the line"))
      saveToDatabase(linesAddedWords)
    }

```


## Scalaっぽい
処理に例外処理を含めるっぽい感じ。

```scala:れーがい.scala

   Try {
      scala.io.Source.fromURL("htp://www.yahoo.co.jp")
    }.map(_.getLines.map {
      _.concat("add words after the line")
    }) match {
      case Success(s) =>
        saveToDatabase(s)
      case Failure(e) =>
        printWithLogger(e)
    }

```

## 補足
* saveToDatabaseからは例外が発生しない仮定で書いたっぽい。
* あとTryには議論の余地があるみたい。[Try.map violates functor composition law](https://issues.scala-lang.org/browse/SI-6284)

* catching......

# まとめ
Javaっぽい例外処理とScalaっぽい例外処理について書いてみた。
例外処理の考え方について学びたい。
Vagrantの導入メモ～仮想マシンへの接続まで




#VirtualBoxのインストール
* インストーラーをダウンロード ->[VirturalBox ダウンロードサイト](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)
* Nextポチポチでインストール
* コマンドラインを開き、パスが通っているか確認。

```
$ virtualbox
```
上記コマンドでvirtualboxが開いたらok。もし通ってなかったら
環境変数VBOX_INSTALL_PATHを定義し、パスを通す。

#vagrantのインストール
* インストーラーをダウンロード -> [Vagrant](https://www.vagrantup.com/downloads.html)
* ポチポチインストール
* コマンドラインを開き、パスが通っているか確認。

```
$ vagrant -v
```
上記コマンドでvagrantのバージョンが表示されたらok。もし通ってなかったらパスを通す。

# vagrantのBOXを取得
* 配布サイトから取得したいBOXのURLをCopyする。 -> [vagrantbox.es](http://www.vagrantbox.es/)
* コマンドラインからBOXを取得する。

```
$ vagrant box add {任意のボックス名}　{コピーしたボックスURL}

// 入力例
$ vagrant box add centos https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box
```

# BOXから仮想マシンを起動。
* 仮想マシン用のフォルダを作成し、そこに移動する。

```
$ mkdir centos && cd centos
```
*  BOXの初期化

```
$ vagrant init ｛ボックス名｝

// 入力例
$ vagrant init centos
```
上記コマンド実行後、Vagrantfileがフォルダ上に作成されていればok。

* 仮想マシンの起動。

```
$ vagrant up
```

※もし失敗する場合、Vagrantfileを開き、「config.vm.box」の値がボックス名と同じかを確認。

 
# 仮想マシンに接続する。

```
$ vagrant ssh
```






***
参考サイト
* [VirtualBoxの導入からOSインストールまでのチュートリアル解説](http://success.tracpath.com/blog/2013/10/15/virtualbox%E3%81%AE%E5%B0%8E%E5%85%A5%E3%81%8B%E3%82%89os%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%BE%E3%81%A7%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2/)
モジュールのキャッシュコントロール


モジュールはrequireを実行すると、キャッシュされていればキャッシュを返し、キャッシュになければロードして返されます。

例えばhttpサーバにおいてリクエスト毎にrequireを実行しても毎回ロードが実行されるわけではありません。このモジュールのキャッシュを自由にコントロールできれば自由に読みなおす事ができ、ダウンタイムなしでサーバの更新を行うことも可能です。

#モジュールのキャッシュ

require.cacheにモジュールが含まれます。モジュールのロード時のファイル名がキーとなり、モジュールが値になります。この要素を削除すればrequire時に再度ロードされます。

```javascript:main.js
require("./hello");
require("./hello");
```

```javascript:hello.js
console.log("hello");
```

この場合、一度しかhelloは出力されません。しかし以下の様なコードでキャッシュを削除すれば二度helloが出力されます。

```javascript:main.js
require("./hello");
delete require.cache[__dirname + "/hello.js"];
require("./hello");
```

```javascript:hello.js
console.log("hello");
```

#ロードの監視

モジュールのロードが監視できれば、そのキャッシュに使用されるファイル名がわかります。

```javascript:main.js
//モジュールのクラスを取得する
var Module = module.constructor;
//モジュールのプロトタイプのloadを入れ替える
var load = Module.prototype.load;
Module.prototype.load = function(){
	//オリジナルのロードを呼び出す
	load.apply(this, arguments);

	//ファイル名を出力
	console.log(arguments[0]);
};

//モジュールをロード
require("./hello");

```

requireによってModuleのインスタンスが作られload関数が呼び出されますので、これをフックすることでファイル名を取得することができました。

#ロードされたモジュールのファイルの監視

ファイル名が取得できるようになりましたので、fs.watchを使用して自動でロードしたファイルの変更を監視することができます。

変更の通知を受けた時にキャッシュを破棄することで、キャッシュ破棄の自動化が完成します。

```javascript:main.js
var fs = require("fs");

//モジュールのクラスを取得する
var Module = module.constructor;
//モジュールのプロトタイプのloadを入れ替える
var load = Module.prototype.load;
Module.prototype.load = function(){
	//オリジナルのロードを呼び出す
	load.apply(this, arguments);

	//ファイルを監視
	var filename = arguments[0];
	var watcher = fs.watch(filename);
	watcher.on("change", function(){
		//キャッシュを破棄して監視を終了
		delete require.cache[filename];
		watcher.close();
	});
};

//モジュールをロード(1秒おきに)
var test = function(){
	require("./hello");
	setTimeout(test, 1000);
};
test();

```

これを実行すると、hello.jsが一度だけ読み込まれhelloが出力されます。hello.jsを修正すると再度ロードされるのが確認できます。
(Mac OS XではFSWatcherのchangeイベントが二度発生する事があります）

#応用例

例えばExpressのルータでリクエストを受けた時にrequireでロードしたモジュールに委譲するようにすると、ビジネスロジックの修正をゼロダウンタイムで行うことが可能です。

```express.js
app.get("/", function(req, res){
	require("./handler")(req, res);
});
```
go mobileをdockerでビルドする

# はじめに
Go 1.4からAndroidで動作するバイナリをgoのコードからビルドできるようになりましたが、ビルドの手順が煩雑です。[README](https://github.com/golang/mobile/blob/master/README.md)を読んでいたところ、dockerでビルドできるようなので試してみました。

# 手順
以下OS Xでの手順です。go, boot2docker, dockerは予めインストールされているものとします。

golang.org/x/mobileとfreetypeをgo getします。

	$ go get golang.org/x/mobile
	$ go get code.google.com/p/freetype-go/freetype

Docker Hubの[golang/mobile](https://registry.hub.docker.com/u/golang/mobile/)レジストリをpullしてbashで入ります。その際、$GOPATH/srcをコンテナ側で/srcになるようにマウントします。

	$ docker run -it -v $GOPATH/src:/src golang/mobile /bin/bash

dockerの実行が成功するとコンテナ内にbashで入れますので、サンプルのディレクトリに移動してmake.bashを実行します。

	root@a418b5149537:/src/golang.org/x/mobile# cd example/basic/
	root@a418b5149537:/src/golang.org/x/mobile/example/basic# ./make.bash
	[armeabi] Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
	[armeabi] Gdbsetup       : libs/armeabi/gdb.setup
	[armeabi] Prebuilt       : libbasic.so <= jni/armeabi/
	[armeabi] Install        : libbasic.so => libs/armeabi/libbasic.so
	Buildfile: /src/golang.org/x/mobile/example/basic/build.xml
	 :
	(略)
	 :
	BUILD SUCCESSFUL
	Total time: 4 seconds

Antが正常終了していればbinの下にapkが作成されているはずです。

	root@a418b5149537:/src/golang.org/x/mobile/example/basic# exit
	exit
	$ cd $GOPATH/src/golang.org/x/mobile/example/basic/bin
	$ ls -al 
	total 3648
	drwxr-xr-x  13 kn1kn1  staff     442  1 30 12:37 .
	drwxr-xr-x  15 kn1kn1  staff     510  1 30 12:37 ..
	-rw-r--r--   1 kn1kn1  staff     856  1 30 12:37 AndroidManifest.xml
	-rw-r--r--   1 kn1kn1  staff     128  1 30 12:37 AndroidManifest.xml.d
	-rw-r--r--   1 kn1kn1  staff     179  1 30 12:37 build.prop
	-rw-r--r--   1 kn1kn1  staff  919637  1 30 12:37 nativeactivity-debug-unaligned.apk
	-rw-r--r--   1 kn1kn1  staff     276  1 30 12:37 nativeactivity-debug-unaligned.apk.d
	-rw-r--r--   1 kn1kn1  staff  919637  1 30 12:37 nativeactivity-debug.apk
	-rw-r--r--   1 kn1kn1  staff     807  1 30 12:37 nativeactivity.ap_
	-rw-r--r--   1 kn1kn1  staff     132  1 30 12:37 nativeactivity.ap_.d
	drwxr-xr-x   2 kn1kn1  staff      68  1 30 12:37 res
	drwxr-xr-x   2 kn1kn1  staff      68  1 30 12:37 rsLibs
	drwxr-xr-x   2 kn1kn1  staff      68  1 30 12:37 rsObj


手順は以上です。慣れてきたら[README](https://github.com/golang/mobile/blob/master/README.md)にあるように、bashで入らずに、

	$ docker run -v $GOPATH/src:/src golang/mobile /bin/bash -c 'cd /src/your/project && ./make.bash'

でも良いかもしれません。

また、golang.org/x/mobileに[Dockerfile](https://github.com/golang/mobile/blob/master/Dockerfile)もあるので、pullせずにbuildでも良いかもしれないですね。
pillowをインストール


pilは、最近の流行り（？）だと、pillowを入れるらしい。

で、何も考えずにインストールすると、

```
    --------------------------------------------------------------------
    PIL SETUP SUMMARY
    --------------------------------------------------------------------
    version      Pillow 2.7.0
    platform     linux 3.4.0 (default, Apr 11 2014, 13:05:11)
                 [GCC 4.8.2]
    --------------------------------------------------------------------
    *** TKINTER support not available
    *** JPEG support not available
    *** OPENJPEG (JPEG2000) support not available
    --- ZLIB (PNG/ZIP) support available
    *** LIBTIFF support not available
    *** FREETYPE2 support not available
    *** LITTLECMS2 support not available
    *** WEBP support not available
    *** WEBPMUX support not available
    --------------------------------------------------------------------
    To add a missing option, make sure you have the required
    library, and set the corresponding ROOT variable in the
    setup.py script.
```

幾つかライブラリが足らないと言われるので、

```bash
$ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
```

これで、とりあえず、


```
    --------------------------------------------------------------------
    PIL SETUP SUMMARY
    --------------------------------------------------------------------
    version      Pillow 2.7.0
    platform     linux 3.4.0 (default, Apr 11 2014, 13:05:11)
                 [GCC 4.8.2]
    --------------------------------------------------------------------
    *** TKINTER support not available
    --- JPEG support available
    *** OPENJPEG (JPEG2000) support not available
    --- ZLIB (PNG/ZIP) support available
    --- LIBTIFF support available
    --- FREETYPE2 support available
    --- LITTLECMS2 support available
    --- WEBP support available
    --- WEBPMUX support available
    --------------------------------------------------------------------
    To add a missing option, make sure you have the required
    library, and set the corresponding ROOT variable in the
    setup.py script.
```

になるので、あとは、jpeg2000を使えるようにしたいので、

```bash
$ wget http://downloads.sourceforge.net/project/openjpeg.mirror/2.0.1/openjpeg-2.0.1.tar.gz 
$ tar zxvf openjpeg-2.0.1.tar.gz
$ cmake .
$ make
$ sudo make install
```

これで、JPEG2000対応になります。

TkInterは使う予定がないので未対応です。
クリップボード履歴の管理ソフト「Clibor」が便利

## 概要

仕事やプライベートでPCで作業を行う際、
作業効率の観点からコピー＆ペーストを使用する機会が多いと思います。
しかし、クリップボード上では直前にコピーしたもの1つしか
データを保持することができません。
※直前にコピーしたデータしか貼り付けることができません。

そこで今回、「Clibor」を使用することにより、
クリップボードの履歴を管理できるようにします。



## 「Clibor」のDL → 配置 → 起動

1. [窓の社](http://www.forest.impress.co.jp/library/software/clibor/ "窓の社") で「Clibor」をDL
2. DLした「clibor.zip」を解凍
3. 解凍した「clibor」フォルダを任意の場所(C:\Program Files\に置きました)に配置し「Clibor.exe」を起動


## 「Clibor」の特徴

* タスクトレイに常駐し、必要な時だけ呼び出し邪魔にならない
* 「Ctrl」キーを2回連続で押すことで、呼び出し可能
* クリップボードの履歴は最大1,000件まで保存可能
* クリップボード履歴・定型文の検索が可能
* 定型文の登録が可能(グループ分けや、メモを付けることが可能)
* クリップボードの編集・削除・整形・変換が可能
* インストール不要でレジストリを汚さず、ライブラリ等不要でダウンロード後すぐに使用可能

etc...

「Clibor」の基本的な使い方はこちらを参考にしてください。
http://www.amunsnet.com/soft.html

あとは、スタートアップに登録しておけば再起動後も気にせず使えます。
URIをRESTっぽくするアレ

こんなクラスがあるとして、

```php:sample.php
<?php
class Sample
{
    public function method()
    {
        echo json_encode(["Hello"]);
    }
}
```

URIを`/sample/method`と書くと実行してくれるディスパッチャというのをよく書くのだが、ちょっとシンプルに書き直してみる。

その当時に参考にしてたのは、こちら

http://www.objective-php.net/mvc/dispatcher

まず、.htaccessにReWriteRuleを書き足す。

```:.htaccess
RewriteRule ^app/([a-zA-Z]+)/(.+)$ index.php?class=$1&method=$2 [L]
```

で、ディスパッチャ側。

```php:index.php
<?php
class Dispatcher
{
    public function dispatch()
    {
        $className = $_GET['class'];
        $methodName = $_GET['method'];

        require_once $className.'.php';
        $Instance = new $className();
        $Instance->$methodName();
    }
}

$dispatcher = new Dispatcher();
$dispatcher->dispatch();
?>
```

もちろん、このまま使うと脆弱性の宝庫なので、用途に応じて$_GETにバリデーションを施したり、HTTPヘッダを付けるとかする必要ですね。

[今夜つける HTTPレスポンスヘッダー （セキュリティ編）](http://d.hatena.ne.jp/sen-u/20131130/p1)
formのplaceholderに色つけたい

stylusです

mixin

```css
placeholder()
  &::-webkit-input-placeholder
  &:-ms-input-placeholder
  &::-moz-placeholder
    {block}
```

使い方

```css
.search-input
  +placeholder()
    color red
```

結果

```css
.search-input::-webkit-input-placeholder,
.search-input:-ms-input-placeholder,
.search-input::-moz-placeholder {
  color: #f00;
}
```

stylusの謎構文まじつらい
AndroidとiOSのアプリバージョン周りについてまとめてみた



AndroidとiOSで設定できるバージョンについてちょっとややこしかったのでまとめてみた。
まだ情報が足りないかもしれないけど、わかったら追記する予定。

## Android
 - 記入場所：AndroidManifest.xml
   - android:versionCode
   - android:versionName

Androidの場合は、「versionCode」と「versionName」の2種類。
それぞれの意味は以下のとおり。

 - versionCode：内部バージョン(整数)
   - 内部のバージョン番号でユーザに見せるものではない。
   - 何回目のアップロードかを表す整数で、リリースをするたびに値を増やす必要がある。
 - versionName：表示用のバージョン(文字列)
   - ユーザに示すバージョン番号でGooglePlayに表示される。
   - 文字列であり一般的にx.y.zのようにつける。
      - x(major).y(minor).z(point)
      - 世に出ているアプリを何種類か調べたけど、だいたいはこの形式で登録している。

### 参考
 - http://developer.android.com/tools/publishing/versioning.html


## iOS
 - 記入場所：info.plist
   - CFBundleVersion
   - CFBundleShortVersionString

iOSの場合は、「Bundle version」と「Bundle versions string, short」の2種類。
それぞれの意味は以下のとおり。

 - Bundle version：内部バージョン(文字列)
   - 内部のバージョン番号でユーザに見せるものではない。
   - リリースの時に特に利用されていない。
   - ユニークである必要はない([*1](#補足説明))。 
 - Bundle versions string, short：表示用のバージョン(文字列)
   - ユーザに示すバージョン番号でAppStoreに表示される。
   - リリース時に使用し、前回のバージョンより値が増えてないといけない([*2](#補足説明))。
   - 多言語対応ができる(らしい([*3](#補足説明)))。
   - x.y.zのようにつけることを推奨している。



XcodeのGeneralにあるIdentifyに表示されているVersion、Buildの対応は以下のとおり。
 
 - Version
   - Bundle versions string, short
 - Build
   - Bundle Version

### 補足説明
 - (*1)
   - あるバージョンのリリース時にパッケージを複数個アップロードすることができ、その中から審査対象を選ぶことができる。その時に、Bundle versionがすでにアップ済みのものと同じだとアップロードすることができない。
 - (*2)
   - iTunesConnectの登録時にはユニークチェックはしているが、前回と比べて増加していないといけないといったチェックはしていない(ただし、アプリのアップロード時にエラーになる)。
 - (*3)
   - 参考資料によると多言語対応ができると書いているが、例えばiTunesConnectでEnglishで1.0.5にするとJapaneseでも1.0.5になってしまう。

### 参考
 - https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html


## まとめ

|項目|Android<br>versionCode|Android<br>versionName|iOS<br>Bundle version|iOS<br>Bundle versions string, short|
|:----|:----|:----|:---|:--|
|マーケットに表示される|x|o|x|o|
|リリース時に利用<br>(前回より値が増えている必要あり)|o|x|x|o|
|型|整数|文字列|文字列|文字列|
関数合成むずかしいです。

関数プログラミングを学ぼうと思って数週間。関数合成の考え方、捉え方でいつもハマる。もっと周辺知識を蓄えるまで後回しにしようとも思ったが、現時点の自分の理解として整理することにした。

## とにかくややこしい
まず、おさらいとして、これは、わかる。

```hs
f :: b -> c
g :: a -> b
f . g :: a -> c
```

なぜなら、このように

```hs
(.) :: (b -> c) -> (a -> b) -> a -> c
```

`(.)` 演算子が「 1引数渡すと、`g` の値を経由して`f` の値を返す関数」を返すことが単純にわかるから。

## では、この場合は？
```hs
f :: a -> b
g :: c -> d -> f
f . g ::　??? 
```

うーん。やはり整理すらできない。幾つかのサイト・書籍を参考にさせていただき、考察する。


---

ヒントはカリー化による部分適用にあるようだ。`g` は、部分適用により **1引数渡すと、1引数関数を返す関数** であるとも言える。そのため、`f.g` といった合成をした場合、 **1引数渡すと、`g` の返り値（1引数関数)を経由して、`f` の値を返す関数**となる。つまり、`f` の1引数が関数になる事を強制していて、これを満たさない場合にはコンパイルできない。
よって、このような実装は実現しない。

```hs
let f = \x -> x + 2
let g = \x y -> x * y -- \x -> (\y -> x * y) カリー化されてこのように扱われる
(f . g) 3 4 -- 本当は14になってほしいが...
```
```
<interactive>:283:1:
    No instance for (Num (a0 -> a0)) arising from a use of ‘it’
    In a stmt of an interactive GHCi command: print it
```
思った通りに合成したいなら **`g` の返り値が値となるような工夫**が必要となる。
例えば、

```Haskell
g 3 :: Num a => a -> a
(f . (g 3)) 4
```
このようにすれば、`14` が求まる。ただし、この式は`f.g` や `g` が1引数関数であることを強調しすぎていて、本質的な意味では分かりにくい。

一方、次のようにすることで、**引数（値) を渡すと、`g`の値（1引数関数)を経由して、1引数関数を返す関数を合成する** こともできる。

```Haskell
((f.) . g) 3 4 -- 14が求まる
```

これは、`(.)`演算子に`f` を部分適用すると、`(f.) :: Num c => (a -> c) -> a -> c` となる性質を利用したものである。これを踏まえて上の例をもう一度見てみると、カリー化により`((f.) . g) 3` が1引数関数を返すので、その関数に`4` を渡すことでようやく値としての`14` が求まる。

## 参考サイト・書籍
###サイト
[Haskell の関数合成でひっかかってたこと](http://d.hatena.ne.jp/ruicc/20111004/1317752261)
[Haskellの関数合成](http://jutememo.blogspot.jp/2008/06/haskell_29.html)
### 書籍
[関数プログラミング実践入門](http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%94%80%E2%94%80%E7%B0%A1%E6%BD%94%E3%81%A7%E3%80%81%E6%AD%A3%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB-WEB-PRESS-plus/dp/4774169269)
アイコンを入れるのが楽になるAndroid Drawable Importerの話


最近見つけたもので、これはと思ったAndroid Drawable Importerの紹介をします。Android Studioのプラグインで、Projectにアイコンや画像などDrawableを入れるのが楽になります。

##機能
以下の4つがAndroid Studioにて利用可能になります。

#### AndroidIcons Drawable Import
[AndroidIcons](http://www.androidicons.com/)のアイコンを簡単にプロジェクトにインポートできます。
画面からassetと色を選べば解像度別にdrawableに置いてくれます。
![スクリーンショット 2015-01-31 11.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/2743/cc896b53-1a69-5d7a-b7a3-7721bdcccca8.png "スクリーンショット 2015-01-31 11.41.53.png")


#### Material Icons Drawable Import
AndroidIconsと同様に、[Material Icons](https://google.github.io/material-design-icons/)をインポートしてくれます。
Material Iconsはカテゴリ分けされているので、カテゴリから必要なassetを選び、さらに色とサイズ、あとは解像度を選びます。
![スクリーンショット 2015-01-31 11.46.38.png](https://qiita-image-store.s3.amazonaws.com/0/2743/97f56f50-43c5-8e34-8219-b6034e41fedf.png "スクリーンショット 2015-01-31 11.46.38.png")




####Scaled Drawable
9-Patchのファイルを指定すると、各解像度用によしなに変換してくれます。


####Multisource-Drawable
複数のimageを、同じ名前にしてdrawable-**に置いてくれます。
例えばデザイナーから渡されたアイコンが、解像度別に名前つけされていたら。

``` bash:
root/
   ./drawable_ldpi.png  
   ./drawable_mdpi.png  
   ./drawable_hdpi.png  
   ./drawable_xhdpi.png  
```
通常ならばres以下に解像度ごとのディレクトリを作り、それぞれ画像を移動させた上で同じ名前にリネームしなければなりません。
Multisource-Drawableの機能を使うことで、各解像度に対する画像を指定し名前を決めれば勝手にやってくれます。

全機能共通ですが、必要なディレクトリ(drawable-hdpiとか)は補完して作ってくれます。

##導入方法
####インストール
Android Studioにて、Preferences>PluginsからBrowse repositoriesを選び`Android Drawable Importer`を検索しインストールします。
インストール後はAndroid Studioの再起動が必要です。
![スクリーンショット 2015-01-28 22.56.18.png](https://qiita-image-store.s3.amazonaws.com/0/2743/66c7ce64-db59-6f23-63e9-0b52c2a3ca5f.png "スクリーンショット 2015-01-28 22.56.18.png")

####設定
`AndroidIcons Drawable Import`,`Material Icons Drawable Imporet`を使うには元のアイコンファイルを設定する必要があります。
Preferences>Android Drawable Importerから設定します。
![スクリーンショット 2015-01-31 12.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/2743/87ab7605-1c18-a235-8526-9d719094717b.png "スクリーンショット 2015-01-31 12.21.02.png")

`Download AndroidIcons` `Download Material Icons`ボタンを押すとそれぞれのページに飛ぶので、お好きな場所にダウンロードして`Asset home`に設定してください。正しく設定されれば画像のように`Found assets`に表示されます。

####使用
インポートしたいプロジェクトにて右クリック>Newに上記の4つの機能が追加されているのでここから利用します。
![スクリーンショット 2015-01-31 12.25.27.png](https://qiita-image-store.s3.amazonaws.com/0/2743/fbf73921-66b0-f106-f093-486a21a70190.png "スクリーンショット 2015-01-31 12.25.27.png")



##まとめ/感想
本記事ではAndroid Drawable Importerを紹介しました。
このプラグインを用いることで、4つの機能からIconや画像などのDrawableを入れるのが簡単になりました。

特にAndroidIcons/Material Iconsのインポートが強力だと感じています。
これらは高品質のアイコンがたくさん含まれているということで非常に有用でしたが、その中から自分のイメージにマッチするものを探すのにも一苦労でした。さらに解像度別にProjectに入れなければならないというのは非常に面倒です。
Android Drawable Importerを使うことによって、Android Studioの画面から直接アイコン画像を確認しそのままインポートできるようになりました。

(僕のようにデザイン苦手な)プログラマーにとって、デザイン関係のことにストレスを感じずに実装できるのは非常にいいですね。

##参照
https://github.com/winterDroid/android-drawable-importer-intellij-plugin
HTML5 Conference 2015に参加してきました #html5j


http://events.html5j.org/conference/2015/1/


主催	html5j
開催日時	2015年1月25日（日）10:00 ～ 19:00
会場	東京電機大学 千住キャンパス


資料まとめ
http://unsolublesugar.com/20150125/104819/


---

**所感**
Web系に興味はあって発表を聞きにいっても、普段従事している組み込み系の業務に関係する話を聞けることは少なかった。
ただ、今回はロボット制御や自動車への組み込みアプローチなど身近な話題が多かった。
いずれは「組み込みはJavaやC/C++ができれば良い」という時代ではなくなってくるのかなと感じた。
IT技術分野でもWeb系の技術は進歩が早いので、その進歩の速度が組み込み業界の進歩も早めてくれることを期待したい。

---

#悩める組み込み機器向けウェブコンテンツのパフォーマンス
羽田野 太巳氏

http://www.slideshare.net/futomihatano/20140125-html5-conference2015-43866729

組み込み機器向けのウェブコンテンツを作成する際に意識すべき注意点などの発表。
最近のテレビはほとんどブラウザが組み込まれている。（ハイブリットキャストなど）
CES2015でも各TVにAndroidやFirefoxOSの導入することが発表されており、
スマートフォンのようにTVもOSを積んでいるのが当たり前になるかもしれない。
WiiUもブラウザを組み込んでいて、HTML5を用いてゲームアプリが作成できる。

しかし、TVなどはスマートフォンなどに比べてCPU、GPUの性能が低い。
そのような低スペックなハードに向けてウェブコンテンツを作成するコツやTipsの発表だった。

また、以下理由で対象となる機器のスペックをあまり頼れないとのこと。

- 組み込み機器内のブラウザは基本的にアップデートされないこと
- （スマフォなどと比較して）ハードのライフサイクルが長いこと


IT技術分野においてWeb系の技術は進歩が速いという認識だが、
その恩恵を受けられない（使えるとは限らない）というのは厳しい開発分野だと感じた。



#HTML5によるロボット制御
本間 雅史氏
http://www.slideshare.net/honmamasashi1/html5-conference-2015

ロボット制御はC++などのネイティブが主流だが、HTML5でも制御できるようになってきたよという発表。ロボットにかぎらずハード制御が可能。
現在W3CでWebAPIの標準も作成中。

**Browsers and Robotics Community Group**
http://www.w3.org/community/browserobo/

会場ではルンバを用いてデモを行なっていた。
具体的には、ROSというライブラリをWebSocketを経由してJavaScriptで操作する。
http://www.ros.org/
http://wiki.ros.org/ja

モーターの電圧などの制御も行える。
JavaScriptのようなフロントエンド寄りの言語でも機械制御を行えるのには驚いた。
だいぶROSライブラリでハードの抽象化などをしてくれているようだ。
回線遅延、操作中のコネクションの切断などはどうなるんだろう…？


#大きく変動する車載情報機器、そしてHTML5の役割
中鉢 善樹氏、藤井 義也氏



車載機器をHTML5で開発する紹介。Cordovaをベースに車体情報を取得する独自プラグインを追加して開発を行なっている。

W3Cで標準APIも策定している。

**Automotive and Web Platform Business Group**
http://www.w3.org/community/autowebplatform/

自動車がIT化する中で、UIもスマホのような機能を求められる。 そのなかでHTML5を選択するのは自然な発想。
なかなか珍しい分野のため、以下のような条件を満たしているWeb技術も魅力的

- エコシステムとして開発者が多い
- ベンダーロックインがない
- 柔軟性
- クロス開発が可能 etc...

車載機器に求められる安全性とセキュリティの確保は独自のマイクロカーネルOSで確保している。

車体情報の取得部分をメーカーごとにラップできるデザインにしておけば、
UIについてはCSSで変更して、差分開発が行えると思われる。



#転ばぬ先のエンタープライズWeb開発プランニング
小川 充氏、酒巻 瑞穂氏

http://html5bizj.github.io/planning-a-frontend-javascript-application/


最近のエンタープライズWeb開発の近況や各プロセスで抑えておきたいチェックリストなど。

粒度は違うが、主に気になった点は以下。

**ソフトウェアマネジメントツール**
gitlab,JIRA,Stash,GoogleDrive,Confulence,Hipchat,Bamboo,Jenkins,yammer&ハングアウトなど

**基本仕様**
HTML5になってオフライン機能、アクセシビリティについての言及が増えた。
Auth認証も種類が多くなっているので選定を注意する

**パッケージ管理**
proxyなどで外部から断絶された企業では、閉鎖空間を想定した運用構成をする必要がある。
npm、bowerのプライベートリポジトリを社内に構成することもできる。

**テスト・ツール**
Karma, jasmine, Moch, istanbul, Phantom.js, Protoractor/Selenium(WebDriver)


**タスクランニングツール**
GRUNT, Gulpを使わないとやることが多すぎて間に合わない
ヨーマンYEOMANをカスタムして使う！


**課題**

- コストパフォーマンス
- 既存のWeb開発とくらべてコスト・リスクが高くなりがち
- スクラッチ部分が多い
- 品質担保の仕組みが確立されていない
- 人材が不足している
SoftLayerのAuto Scale Groupを一覧するスクリプト

ホントは他のことをしようと思ってて、それにはAuto Scaleの情報が必要だったのだけど、SoftLayer CLIにAuto Scale関連のコマンドがまだないようなので、ついでにスクリプトを作ってみた。
とりあえず、Auto Scaleで追加されたメンバーの情報を取得する方法は分かった。

```py:sl_as.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from prettytable import PrettyTable
import SoftLayer
import sluser

SL_USERNAME = sluser.SL_USERNAME
SL_API_KEY = sluser.SL_API_KEY

_maskAutoScaleGroup = '''
    virtualGuestMemberCount
    '''

client = SoftLayer.Client(username=SL_USERNAME, api_key=SL_API_KEY)
autoScaleGroups = client['Account'].getScaleGroups(mask=_maskAutoScaleGroup)

_tableHeader = [
    'id',
    'asg name',
    'dc',
    'status',
    'min',
    'max',
    'now',
    'member prefix',
    'members',
    ]

# Table definition
table = PrettyTable(_tableHeader)
table.padding_width = 1

for asg in autoScaleGroups:
    m = ""
    ms = ""
    for a in asg['virtualGuestMembers'][0:]:
#        m =  str(a['virtualGuest']['id']) + ":" + a['virtualGuest']['hostname'][-4:]
        m =  a['virtualGuest']['hostname'][-4:]
        ms = m + ' ' + ms

    table.add_row(
        [
            asg['id'],
            asg['name'],
            asg['virtualGuestMemberTemplate']['datacenter']['name'],
            asg['status']['keyName'],
            asg['minimumMemberCount'],
            asg['maximumMemberCount'],
            asg['virtualGuestMemberCount'],
            asg['virtualGuestMemberTemplate']['hostname'],
            ms,
        ]
    )

print(table)
exit()
```


```text:result
+-------+------------------+-------+-----------+-----+-----+-----+---------------+---------+
|   id  |     asg name     |   dc  |   status  | min | max | now | member prefix | members |
+-------+------------------+-------+-----------+-----+-----+-----+---------------+---------+
| 54654 | autoscale_grp01  | hkg02 | SUSPENDED |  1  |  5  |  0  |    asserver   |         |
| 34158 |   TK-as-group    | sng01 |   ACTIVE  |  1  |  5  |  1  |  TK-as-member |  e727   |
| 34758 | autosacle_yasuda | sng01 | SUSPENDED |  1  |  1  |  0  |    sh1nobu    |         |
|  8254 |   dai39-group    | sng01 |   ACTIVE  |  1  |  1  |  1  |  dai39-scale  |  cca8   |
+-------+------------------+-------+-----------+-----+-----+-----+---------------+---------+
```

membersのところは、Auto Scaleでの仮想サーバー追加時に作成される仮想サーバーのホスト名が prefix + "-xxxx" という名前で作られますが、そのxxxxの部分です。
Plone 4 をデプロイする方法


Ploneをサービスとして公開する方法を書きます。
実運用に合わせて各種設定を調整する必要はありますが、最低限の方法として以下のとおりです。

# 前提

以下の環境とする

- OS: CentOS 6.0 / RHEL 6.0
- Plone 4.3.4
- Unified Installer を用いて、サービスとしてインストール(sudoしてインストール)
- Plone のインスタンス(Zope上のルートフォルダのPloneオブジェクト)の名前を `Plone` とする

# Plone の設定

## 概要

Ploneの設定には、 `buildout.cfg` にて行います。
Plone 2のころは、 `etc/zope.conf` に書いていた起動設定やプロダクトの導入などすべてを、  `buildout.cfg` または `base.cfg` に設定を記載します。
`buildout.cfg` を書き換えたら、 `buildout` コマンドで設定を反映させます。


## 重要な設定項目

### zserver-threads の変更

同時にアクセスが多い場合、thread数の変更を行います。
base.cfgの[instance_base] セクションに追記

```base.cfg
zserver-threads = 10
```

### プロダクトのインストール

```buildout.cfg
eggs = 
    ...
    PACKAGE_NAME
```

### 独自プロダクトのインストール

egg形式のパッケージをインストールします。

- `zinstance/src` 以下にパッケージを設置します。

- 設定を書きます。

```buildout.cfg
eggs = 
    ...
    YOUR_PACKAGE
...
develop =
    ...
    src/YOUR_PACKAGE
```


## 必要に応じて変更する設定項目

### 起動ユーザの変更

デフォルトでPloneユーザになっているはずです。

```buildout.cfg
effective-user = plone
```


### ポート番号の変更

```buildout.cfg
http-address = 8080
```


## 設定変更の反映コマンド

```
$ cd /usr/local/Plone/zinstance
$ sudo vi buildout.cfg # ここで設定を記載

$ sudo ./bin/buildout -N
```

これで、 `zope.conf` が、一旦削除され、新規に作成されます。同時に必要なモジュールのインストールなども行われます。
-N オプションは、必要以上に新バージョンのモジュールをインストールしないというオプションです。


# Plone の起動方法

## 単独で起動

起動コマンド

```
$ cd /usr/local/Plone/zinstance
$ ./bin/plonectl start
```

停止コマンド

```
$ cd /usr/local/Plone/zinstance
$ ./bin/plonectl stop
```

## サービスの登録

### 起動スクリプトの設置

Unified Installerを解凍したフォルダ内に `init_scripts/RedHat-FedoraCore/plone-standalone` がある。
`plone-standalone` ファイルを `plone` というファイル名で `/etc/init.d/` に配置。

その後、chkconfigでサービスへの登録

具体的な方法

```
$ sudo cp plone-standalone /etc/rc.d/init.d/plone
$ sudo chmod 755 /etc/rc.d/init.d/plone
$ sudo /sbin/chkconfig --add plone
```

起動

```
$ sudo service plone start
```

# HTTP(S) ポートでのサービス

Ploneは標準で、8080番ポートで立ち上がるアプリケーションです。
HTTP(S) つまり、80番ポート / 443番ポートでサービスを行うために、フロントのHTTPサーバと組合せます。

## HTTPサーバの種類

以下の2つで使いやすい方を選べば良いです。

### Apache

多くのサービスで使われているHTTPサーバ。多くの機能を持つ物。
以下に設定の例を示します。詳しくはApacheのドキュメントを確認ください。

```plone.conf
<VirtualHost *:80>
ServerName www.example.com
 <IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteRule ^/(.*) http://localhost:8080/VirtualHostBase/http/%{SERVER_NAME}:80/Plone/VirtualHostRoot/$1 [L,P]
 </IfModule>
</VirtualHost>
```

再起動

```
$ sudo service httpd restart 
```

### nginx

高速に動作するHTTPサーバ。静的コンテンツとリバースプロキシーに特化した物。設定ファイルを簡潔に記載できる。
以下に設定の例を示します。詳しくはnginxのドキュメントを確認ください。

```plone.conf
server {
    listen 80;
    server_name www.example.com;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        proxy_redirect off;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:8080/VirtualHostBase/http/www.example.com:80/Plone/VirtualHostRoot/;
    }
}

```

再起動

```
$ sudo service nginx restart 
```
raspberry piでgit最新版を使う

追記：完全上位互換の記事があった。そちら参照。
[RaspberryPi - Raspberry Piに最新版の各種ツール・言語・ライブラリをインストールする - Qiita](http://qiita.com/kb10uy/items/976a52f687bcb7745fc7 "RaspberryPi - Raspberry Piに最新版の各種ツール・言語・ライブラリをインストールする - Qiita")
あちらのようにlibcurlの位置を指定するなら、<a href="https://packages.debian.org/wheezy/armel/libcurl4-openssl-dev/filelist">Debian -- File list of package libcurl4-openssl-dev/wheezy/armel</a>あたりを参考に。

いつものようにdotfilesをダウンロードしたらこんなエラーを吐いた。

```shell-session
error: Malformed value for push.default: simple
error: Must be one of nothing, matching, tracking or current.
fatal: bad config file line 8 in /home/user/.gitconfig
```

gitが1.8より古いと出るとのこと。
試しに`git --version`すると`git version 1.7.10.4`とのこと。aptにある2015年1月現在最新がこれ。

仕方ないので野良ビルド。依存関係にあるものは以下

```sh
$ sudo aptitude install autoconf automake ncurses-dev gettext libghc-zlib-dev libcurl4-openssl-dev
```

[Index of /pub/software/scm/git](https://www.kernel.org/pub/software/scm/git/ "Index of /pub/software/scm/git")からgit-2.2.2.tar.gzを落としてきて

```
$ gzip -dc git-2.2.2.tar.gz | tar xvf -
$ cd git-2.2.2
$ ./configure --prefix=/usr/local --with-curl --with-expat
$ make
$ sudo make install
```

これで快適gitライフ。

```shell-session
$ git --version
git version 2.2.2
```
MacのStartup Manager(ブートメニュー)でアイコンを表示する方法


`icns`を作るか、ダウンロードしてきます。

[https://www.iconfinder.com/icons/386477/mac_os_x_icon](https://www.iconfinder.com/icons/386477/mac_os_x_icon)


##Macのディスクにアイコンを設定する



```bash:
$ sudo cp 設定したいファイル /.volumeicon.icns
```

##復旧ディスクにアイコンを設定する

```bash:
$ diskutil list

$ mkdir mnt

$ sudo mount -t hfs /dev/disk0s3 ./mnt

$ sudo cp 設定したいファイル ./mnt/.volumeicon.icns
```

##Macを消して、Linuxを入れている場合



```bash:
$ fdisk -l

$ sudo mkdir -p /mnt/efi

$ sudo mount /dev/sda1 /mnt/efi

$ sudo cp 設定したいファイル /mnt/efi/.volumeicon.icns
```
クラスの中でなぜか複数かメソッドが呼ばれる


という現象が起きてしまっていて発見するまで時間がかかったのでメモしておきます。

まず、現象としては、

メソッドは、viewDidLoadの中で、

	- (void)viewDidLoad
	{
	    [super viewDidLoad];

		[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(callHogehoge:)
                                                 name:@"kCallHogehoge"
    }
    
と宣言しておきます。

	-(void)callHogehoge
	{
		// ほげほげ
		self.hogehoge = 1;
	}

としておいて、
別のスレッドで、

	-(void)callHogehoge
	{
		[[NSNotificationCenter defaultCenter] postNotificationName:@"kCallHogehoge" object:nil userInfo:info];
	}
	
と一回だけ呼んでるのに、callHogehogeが何回も実行されるという現象でした。
どこかで別スレッドで呼ばれているのかと思ったのですが、メインスレッドで呼ばれています。

次に疑ったのが、self.hogehoge として保存してる値。別のところで値を書き換えているのにもかかわらず、callHogehogeが呼ばれるときは値が元に戻ってます。よくよく見ると、selfで指してるClassのポインタが違います。


このクラスは、別のところでinitされて呼ばれ、終わったらdismissしてるのですが、そうです、initした回数分だけオブジェクトが残っていて、全部で受信してるようでした。

そのためpostNotificationを受けているためでした。

	- (void)viewWillDisappear:(BOOL)animated
	{
    	[ self removeNotificationObserver ];
	}
	
とビューを閉じる前にNotificationの登録を削除してあげることで解決しました。
とちょっと不安はあるものの、一旦は解決です。
bc > 8.0の三乗根の計算 > e(1/3*l(8.0))

動作環境

    CentOS 6.5
    bc 1.06.95

`bc`コマンドで三乗根を求めたい。でも、bcでは`**(1/3)`を使えないようだ。
8の三乗根はbc上では以下を実行すると良い。

    $ bc -l
    e(1/3*l(8.0))
    (bcの出力)1.9999999999

tのalpha乗 = exp(alpha * log(t))
という計算式を使っている。

反対に`e(3*l(2.0))`で7.99999となる。

乗数が3とか整数の場合は`2.0^3`でも計算できる。乗数が整数以外の計算はエラー(non-zero scale)となる。