OmniAICreator/Qiita-1.07M huggingface dataset:
Android Wearのエミュレータが起動出来るようになるまで

http://blog.btrax.com/jp/2014/12/16/develop-watch-face/

Android Wearをどんな感じで作ろうかいろいろぐぐってたらこちらのサイトがあったので参考にしながら作ってみようかと思ったので、基本的に作りながら、詰まった所を中心にメモしていきます。

一通り終わるまで書こうと思ってたけど、途中で息切れしたので、開発環境の構築が終わるまでをメモ。


# 開発環境構築中に出たエラー
http://lab.adn-mobasia.net/?p=3750

こちらをもとに上からやっていった時に出たエラーと対応について書いていきます。

## Error:Failed to find: com.android.support:appcompat-v7:21.+ というエラーが発生

以下のようなメッセージが出てた。

```
Error:Failed to find: com.android.support:appcompat-v7:21.+
Install Repository and sync project
Open File
Open in Project Structure dialog
```

`Install Replository and sync project`の部分がリンクになっていたので、ここをクリックすると必要なものをインストールする画面になったので、インストール！
リンクになっている事を気にせずに普通にググっていたので、地味に余計な事をしてしまっていた。。。


## JDK 7を使ってくださいよ的なエラー

```
/Users/mapyo/dev/android/sample/AndroidWearBijinSample/mobile/build.gradle
Error:compileSdkVersion android-21 requires compiling with JDK 7
Open SDK Settings
Open File
```

これも、`Open SDK Settings`がリンクになっていて、クリックすると設定画面が出てくるので、そこでパスを設定。

インストールされてたら、以下のコマンドで確認出来ます。
```sh
$ /usr/libexec/java_home -v 1.7
/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home
```

## Android Wearのエミュレータを作る時に出たエラー
AndroidStudioから「AVD Manager」を起動後AndroidWearのエミュレータを作るべく、ポチポチやって設定が終わったあと、
いざ起動しようとすると、以下のエラーが。

```
Cannot launch AVD in emulator.
Output:
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure Intel HAXM is properly installed and usable.
CPU acceleration status: HAX is not installed on this machine (/dev/HAX is missing).
```

![Android_Wear_Square_API_21_と_mobile_…_MainActivity_java_-__mobile__-_AndroidWearBijinSample_-____dev_android_sample_AndroidWearBijinSample_.jpg](https://qiita-image-store.s3.amazonaws.com/0/6878/dec5ab48-38eb-fec2-368b-80a26e461415.jpeg)



SDKマネージャーの`Intel x86 Emulator Accelerator(HAXM installer)`にチェックを入れてインストール。


![Android_SDK_Manager_と__無名____-_VIM.jpg](https://qiita-image-store.s3.amazonaws.com/0/6878/edb8f52b-2281-d2f4-c860-da7f2ae8d4c3.jpeg)



これだけだと使えるようにならないっぽい。。。

http://developer.android.com/tools/devices/emulator.html#vm-mac

マニュアルに、書いてあったのだが、それとフォルダ構成がちょっと違っていた。。。

```
{sdk入れたパス}/sdk/extras/intel/Hardware_Accelerated_Execution_Manager/IntelHAXM_1.1.1_for_10_9_and_above.dmg
```

まぁ、こういうdmgがあったので、それをダブルクリックしてインストール。

（このフォルダに、readme.txtやsilent_install.shというファイルなども置いてあって、readme見ると、silent_install.shを使って入れるっぽい事を書いてあった。。。けども、シェルスクリプトの中身をみると、dmgを入れてるっぽかった。）

とりあえず、エミュレータ起動出来たのでめでたしめでたし！



![2015_01_15_5_09.jpg](https://qiita-image-store.s3.amazonaws.com/0/6878/ef9a5bac-a08d-68b6-047e-a828189771bf.jpeg)




## 所感
AndroidWearのエミュレータを起動させた状態で、GenymotionでAndroidのエミュレータを起動させると、AndroidWearの方が動かない状態に。。。

この辺よくわからず。。。

また、エミュレータのみで開発するためにはいろいろ頑張らないといけないようだ。。。
Rails ローカル開発環境からHerokuのDBに接続 / Rakeタスクとコンソール

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2128">元の記事はコチラ</a>
- - - - - - - - - - - 
rakeタスクを書いて、herokuにpushしてコンソール開いて実行ってのがめんどくさいので、自分のローカル開発環境から直接プロダクションのDBをさわりたかった。チームでやってると良くないと思うけど、個人プロジェクトならまぁいいかってことで。

<!-- extract -->

config/database.yml

```yml
production_local:
  adapter: postgresql
  encoding: utf8
  port: 5432
  pool: 5
  database: YOUR_DB_NAME
  username: YOUR_DB_USER_NAME
  password: YOUR_DB_PASSWORD
  host: ec2-00-000-00-000.eu-west-1.compute.amazonaws.com
  sslmode: require
```

以下は適宜変えてください。
- production_local（environmentの名前）
- YOUR_DB_NAME
- YOUR_DB_PASSWORD
- YOUR_DB_PASSWORD
- ec2-00-000-00-000.eu-west-1.compute.amazonaws.com

　　
ホスト名の取得　↓

```
$ heroku config
```

とすれば、HEROKU_POSTGRESQL_COLOR_URL が取得できる。
hostはここの部分。
ec2-00-000-00-000.eu-west-1.compute.amazonaws.com


###コンソール

これはオプションつけて実行すればいいだけ。

```
$ rails c -e production_local
```

でも

```
config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly:

  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test environment)
  * production - set it to true
```

　　
と言われたので、configを足しておいた。
config/environments/production_local.rb

```ruby
Yourapp::Application.configure do
  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both thread web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true
end
```

```
$ rails c -e production_local
$ Post.last
  => Herokuのデータベースのレコード
```


###Rakeタスク

```ruby
namespace :your_task do
  desc "Test task for production_local"
  task test: :environment do
    test
  end
end

# Check if production_local environment works
def test
	ActiveRecord::Base.establish_connection(:production_local)
	puts "This is test"
	post = Post.last
	puts "#{post.id} #{post.title}"
end
```

　　
実行するとHerokuのデータベースに接続した結果が得られるはず。

```
$ rake your_task:test
```

以上です。

###参考
[heroku / アプリから別のアプリのデータベースに接続する | Workabroad.jp](http://www.workabroad.jp/posts/2047)
[rails consoleにて、dbをproductionに接続する。 - Qiita](http://qiita.com/ron214_ron/items/aa273baff030e253ae96)
[postgresql - Connect local rails app on my laptop to heroku database - Stack Overflow](http://stackoverflow.com/questions/18570634/connect-local-rails-app-on-my-laptop-to-heroku-database)
　　

 → <a href="http://workabroad.jp/posts/2128">http://workabroad.jp/posts/2128</a>
linux でデスクトップ背景を変更するコマンド[強化版]

以前
["background hoge.png" で背景を変える [zsh]](http://qiita.com/elzup/items/c66b371875f8aab88f9d)
[ShellScript - デスクトップの解像度を取得するワンライナー](http://qiita.com/elzup/items/f25d219009585f778ca3)

を投稿したがコレを組み合わせる

```zsh
# get screen resolution 解像度
alias screensize="xdpyinfo | grep 'dimensions' | egrep -o '[0-9]+x[0-9]+' | head -1"

# change background
alias background="display -window root -resize \`screensize\`"
```

これで

```shell-session
background [url or filepath]
```
とかで画面に合わせたサイズで背景を変えられる
Python でトランプクラス(比較つき)

こちらの投稿に影響されて
http://qiita.com/jay/items/ee5bd3bbabb0d57f294d


```py3:Trump.py
import random


class Trump:
    """ Trump Card class
    """

    MARK_SPADE = 'S'
    MARK_CLUB = 'C'
    MARK_DIA = 'D'
    MARK_HEART = 'H'

    MARK_LIST = [MARK_SPADE, MARK_CLUB, MARK_DIA, MARK_HEART]
    EFUDA_LIST = ['A'] + list(map(str, range(2, 11))) + ['J', 'Q', 'K', 'A']

    card_stacks = []

    def __init__(self, mark=None, num=None):
        self.mark = mark if mark is not None else random.choice(Trump.MARK_LIST)
        self.num = num if num is not None else random.randrange(1, 13)

    def get_efuda(self):
        return Trump.EFUDA_LIST[self.num]

    def stack_init():
        Trump.card_stacks = [Trump(mark=m, num=n + 1) for m in Trump.MARK_LIST for n in range(13)]
        random.shuffle(Trump.card_stacks)

    def stack_draw(num=1):
        cards = Trump.card_stacks[0:num]
        Trump.card_stacks = Trump.card_stacks[num:]
        return cards

    def __str__(self):
        return "<Trump: %s-%s>" % (self.mark, self.get_efuda())

    def __repr__(self):
        return self.__str__()


class IndianTrump(Trump):

    # クラブ＜ダイア＜ハート＜スペードの順に強くなる。
    MARK_RANK = {Trump.MARK_SPADE: 4, Trump.MARK_CLUB: 1, Trump.MARK_DIA: 2, Trump.MARK_HEART: 3}

    def __lt__(self, other):
        if self.mark is not other.mark:
            return IndianTrump.MARK_RANK[self.mark] < IndianTrump.MARK_RANK[other.mark]
        return (self.num - 1) % 13 < (other.num - 1) % 13

    def stack_init():
        IndianTrump.card_stacks = [IndianTrump(mark=m, num=n + 1) for m in IndianTrump.MARK_LIST for n in range(13)]
        random.shuffle(IndianTrump.card_stacks)

    def stack_draw(num=1):
        cards = IndianTrump.card_stacks[0:num]
        IndianTrump.card_stacks = IndianTrump.card_stacks[num:]
        return cards


    def __str__(self):
        return "<IndianTrump: %s-%s>" % (self.mark, self.get_efuda())


if __name__ == '__main__':
    print("--- Trump Draw ---")
    Trump.stack_init()
# ランダムに5つカードを引く
    cards = Trump.stack_draw(5)
    print(cards)
    print(len(cards))
# 残り全てのカードを引く
    cards = Trump.stack_draw(52)
    print(cards)
    print(len(cards))
# もうカードは空
    cards = Trump.stack_draw()
    print(cards)
    print(len(cards))
# スタックをリセット
    Trump.stack_init()
# 1枚カードを引く
    cards = Trump.stack_draw()
    print(cards)
    print(len(cards))

    print("--- Indian Porker ---")
    IndianTrump.stack_init()
    for i in range(8):
        card_a, card_b = IndianTrump.stack_draw(2)
        print("CardA: " + str(card_a), "CardB: " + str(card_b))
        print("CardA %s CardB" % (">" if (card_a > card_b) else "<"), "\n")

```
Unityでゲームパッドの接続台数を調べる

# What's this
Unityでゲームパッドの接続台数を調べる方法。（そのまま）
Input.GetJoystickNames()の戻り値配列の長さを調べれば分かるみたいです。

#コード
```csharp

var controllerNames = Input.GetJoystickNames();

Debug.Log(controllerNames.Length);
```

#他
見当たらなかったため記事作成。
Pepper実機かバーチャルロボットかの判定方法


## はじめに

* みなさん、Pepper実機かバーチャルロボットかの判定ってどうしているのしょうか？
* ~~とりあえず、以下のようにバーチャルロボットでは失敗する処理で判定できそうな気がするのですが、もっとそれ用の何かないのでしょうか。~~
* その2 「Get Name」が良さそうな感じでしょうか。
* Pepper実機では未確認です。

## その1 判定用ボックスの作成

Python ボックスを作成して、バーチャルロボットでは失敗する処理を例外で拾います。

![2015011901.png](https://qiita-image-store.s3.amazonaws.com/0/20418/1034951b-04f5-c170-8102-236449a22aaf.png "2015011901.png")

```python
    def onInput_onStart(self):
        try:
            ALProxy("ALMemory").getData("Device/DeviceList/ChestBoard/BodyId")
            self.onResult("Yes")
        except Exception as e:
            self.onResult("No")
```

バーチャルロボットで実行した場合、ログビューアに "No" と表示されました。

```
[INFO ] behavior.box :onInput_message:27 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1140606581456304__root__Log_1: Message text: No
```

## その2 「Get Body ID」「Get Name」ボックスを使用

その1 を試してから気づいたのですが、advanced タブに「Get Body ID」「Get Name」ボックスというのがありました。

![2015011902.png](https://qiita-image-store.s3.amazonaws.com/0/20418/22766445-ac6e-750d-cc74-675f01e5daea.png "2015011902.png")

Get Body ID はエラーになりますが、それぞれ「NoBodyID」「virtual-robot」と表示され、これで判定できそうですね。

```
[INFO ] behavior.box :onInput_message:27 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1140606578425744__root__Log_1: Message text: NoBodyID
[INFO ] behavior.box :onInput_message:27 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1140606578425744__root__Log_1: Message text: virtual-robot
```

## 感想

* 何でもっとはやく「Get ...」ボックスに気づかなかったのか。
SwiftでSimplenoteクライアントアプリを作ってみた

SwiftとiOSアプリ開発の学習のため、オンラインメモ帳サービス[Simplenote](http://simplenote.com/)のクライアントアプリを作ってみました。iOSアプリの作成自体初めてなので色々はまりましたが、年明けから作り始めて一通り形になったので、同じように学習中の方に参考になればと思い、以下に公開します。

https://github.com/alpha22jp/Simplenote-Swift

このアプリには、以下のような要素が含まれています。

* テーブルビュー-詳細ビュー形式の画面構成・画面遷移
* [Alamofire](https://github.com/Alamofire)を用いたサーバーへのアクセス
* [SwiftyJSON](https://github.com/SwiftyJSON)を用いたJSONデータの処理
* [Markingbird](https://github.com/kristopherjohnson/Markingbird)によるMarkdown形式のHTML変換とUIWebViewによる描画
* サーバーから取得したデータをCore Dataのハンドリング
* NSFetchedResultsControllerを用いたCore Dataとテーブルビューの同期
* スタティックセルのテーブルビューを用いた設定画面の構築
* UISearchController (iOS8から導入) による検索バーの実装

なお、現時点ではノートの編集機能やタグのサポートはありません。また、見栄えに関してもあまり考慮していません。Simplenoteには既にiOS用公式アプリがありますので、実用面で役に立つものではないです (Markdown表示に関しては、公式アプリにはありませんが)。あくまで、Swiftを使ってどのようにきれいにコーディングするかを目的として作成しています。

作ってみて感じたのは、やはりプログラミング言語の学習は単に文法を理解することだけではなく自で分で使ってみることが重要ですね。そうすることで、何故そのような言語仕様になっているか、どの機能をどのような場面で使えばよいかが分かってきます。機会があれば、このアプリを作成する上でポイントになった箇所などを紹介していきたいと思います。
Swiftのクラスと構造体の使い分けについてのメモ


Swiftでは、クラスと構造体が同じようなことができる印象があります。
基本的にはクラスを使えばいいのでしょうが、
では、構造体はどんなときに使うんだというのが疑問になったので調べたメモになります。

# 比較表

||クラス|構造体|
|:--|:--|:--|
|参照型/値型|参照型|値型|
|継承|◯|×|
|プロトコル実装|◯|◯|
|拡張|◯|◯|
|プロパティ(格納型)|◯|◯|
|プロパティ(算出型)|◯|◯|
|タイププロパティ(格納型)|×|◯|
|タイププロパティ(算出型)|◯|◯|
|メソッド|◯|◯|
|タイプメソッド|◯|◯|

上記の中で特に意識すべきところは、
変数に入れるときに「参照型/値型」のどちらになるか。
クラスは、参照型なので、参照を渡すだけだが、
構造体は常にコピーを渡す。


# 構造体を使うパターン

* 小さくて単純なデータをカプセル化をしたい場合
* 参照渡しより値渡し(コピー)がいい場合
* 継承が必要ない場合

# 構造体を避けた方がいいパターン

* データが大きい
* プロパティが多い

理由としては、以下の2つ

* 構造体は変数にセットする度にコピーされるため、データが大きいと処理時間が遅くなる
* 構造体はスタック領域に確保されるため、データが大きいと溢れる可能性が高くなる

なので、APIやDBの取得データなどは構造体ではなく、クラスで作成したほうがよさそう

結論としては、
プロパティが数個のもので、カプセル化させると扱いやすいケース
メソッドはそのデータの加工を行うような場合に実装する


# 例えば・・・
イベントの開催日時と終了日時のデータをカプセル化しつつ、開催状態が分かるメソッドも用意する

イベント開催日時の構造体を作成

``` Swift
// イベント開催日時
struct EventDate {
    var startDate : NSDate
    var endDate : NSDate
    
    // イベント開催状態
    func state() -> EventState {
        let now = NSDate();
        let startCompareResult = now.compare(startDate)
        let endCompareResult = now.compare(endDate)
        
        // 開催日時と終了日時がどちらも未来の場合、開催前
        if (startCompareResult == NSComparisonResult.OrderedAscending 
        && endCompareResult == NSComparisonResult.OrderedAscending) {
            return EventState.NotStart
        }
        // 開催日時と終了日時がどちらも過去の場合、イベント終了
        else if (startCompareResult == NSComparisonResult.OrderedDescending 
        && endCompareResult == NSComparisonResult.OrderedDescending) {
            return EventState.Finish
        }
        // それ以外は、開催中
        else {
            return EventState.Now
        }
        
    }
}

```

実行結果

``` Swift
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm"

var start = dateFormatter.dateFromString("2015/01/01 10:00")
var end = dateFormatter.dateFromString("2015/01/01 12:00")

var eventDate = EventDate(startDate: start!, endDate: end!)
var eventState = eventDate.state()
print(eventState.rawValue) // Finish

```

# ちなみに、Swiftでのデータ型は構造体で作成されている
* String
* Array
* Dictionary
* Bool
* Int
* Double
* Float

などなど

なので、これらのものは、変数に入れる度にコピーされています。

こういうデータ型を自分で作成したい場合に構造体を使うといいんでしょうね。

# さいごに
本当は、列挙型もメソッド定義ができるので、一緒にまとめたかったが、時間なくてできなかった。
時間ができたらここに追加します。
[忙しい人向け] 30行から始めるWebGL

WebGL を試そうと思って、ポリゴン１枚書こうとしたら、100行以上のコードを目のあたりにして、挫折した人も多いのではないかと思います。

ただ、初期化処理やエラー処理を省いたら、ポリゴン１枚書く程度であれば、30行程度で行えたりします。

忙しい人向けに、あらゆる贅肉をそぎ落とした簡易版のコードを書いてみました。

### ポリゴン１枚を描画する WebGL コード

```javascript:index.js
var c, gl;
var v = "attribute vec3 position; void main() { gl_Position = vec4(position, 1.0); }";
var f = "precision mediump float; void main() { gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); }";

function initWebGL() {
    c = document.getElementById("c");
    gl = c.getContext("experimental-webgl");
}

function initShaders() {
    var p = gl.createProgram();
    var vs = gl.createShader(gl.VERTEX_SHADER);
    var fs = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(vs, v);
    gl.shaderSource(fs, f);
    gl.compileShader(vs);
    gl.compileShader(fs);
    gl.attachShader(p, vs);
    gl.attachShader(p, fs);
    gl.linkProgram(p);
    gl.useProgram(p);
    gl.bindAttribLocation(p, 0, "position");
    gl.enableVertexAttribArray(0);
}

function draw() {
    var data = [ 0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0 ];
    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
    gl.drawArrays(gl.TRIANGLES, 0, 3);
    gl.flush();
}

initWebGL();
initShaders();
draw();
```

推奨するコードではないですが、学習用に短いコードで試したいという用途であれば、使えるのではないかと思います。

実際は、もう少し削れるのですが、これ以上消すと、意味不明なコードになるので、そこまではしないでおきます。

### コードのダウンロード
実際に動作するコードは ~~jsdo.it~~ github にアップしてありますので、ご利用ください。
[[簡易版] 30行で WebGL を試してみるテスト](https://cx20.github.io/jsdo.it-archives/cx20/oaQC/)
※ jsdo.it のサービス終了に伴い、リンク先を github に変更しました

### JS1k について
さらなる、圧縮を目指したいという方がいらっしゃいましたら、JS1k の作品を解析するのがよいのではないかと思います。

[[WebGL寄稿] JS1k 作品で見つけた WebGL 超絶圧縮コードを紐解いてみる](http://webgl.souhonzan.org/entry/?v=0113)
コードレビューの際によく指摘するポイントについて

このドキュメントについて
---------------
レビューポイントっていうのは周囲のレベルや使っている技術によりまったく異なるのですが、割と汎用的に使えそうな部分について今の開発チーム向けに書いたドキュメントを共有


レビューチェックポイント(機能)
---------------
- 仕様と実装が合っているか
	- 仕様が不明瞭な部分について勝手な仕様で実装をしていないか
	- 違和感のある実装になっていないか
- ロジック・アルゴリズムが合っているか
	- そもそも論理構造が破綻していないか
- 画面表示に違和感がないか
	- 奇妙な文言、ユーザ視点で奇妙な動きになってないか
- 不正なユーザ入力で問題が発生しないかFatalErrorにならないか
	- 入力に対し適切なvalidationが行なわれているか

レビューチェックポイント(コード)
---------------
- 意味の無いロジックが含まれていないか
	- コピペでコードを持ってきた場合にコピペ元の不要なコードが入っていないか
	- そもそも基本コピペはNG
	- コピペで持ってくる場合には論理的に意味の無いコードは消すこと
- 不要になったロジックが残ってしまっていないか
	- 後で見た人にとって謎のロジックが含まれてしまうので不要になったらちゃんと消すこと
- 同一のロジックが2箇所以上で書かれていないか
	- Don't repeat yourself(DRY)原則を守ろう
	- 複数箇所に同じ修正を入れ続けなければいけない苦痛を考えると同じ処理は一カ所にまとめた方がいい
	- ただし特定期間中しか使わないコードなど保守されずに書き捨てられるようなコードなら無理に守らなくても良い
- コメントが適切か
	- 第三者が見た時に理解できるコメントになっているか
		- 特殊なロジックが入っている場合には何故そうしたのかについてコメントで書かれているか
		- コードに何か使用上の注意点がある場合にはコメントに注記する
	- 関数が何をInputとし、何をOutputとするのかについて適切に書かれているか
		- ArrayやJson Objectを使っていて返す構造が不明瞭な場合にはコメントにどのような形式で返ってくるのか明記する
- 命名が適切か(変数名・メソッド名・定数名など)
	- 他のモジュールで使われている名前と別の名前になっていないか
		- できるだけシステム内での統一言語(ユビキタス言語)になることを意識する
- メソッド名が適切か
	- メソッド名から返ってくる値が予測できること
		- getXXXMessage()の返り値でintegerが返ってきていたりしないか
- メソッド名から想定しづらいような副作用が存在しないこと、もしくはドキュメント化されていること
	- getメソッド中でsetをしているとか
- 単体テストが書かれているか
	- 正常系のテストが書かれていること
	- 容易に起こり得る異常系のテストが書かれているか

レビューチェックポイント(インフラ・パフォーマンス)
---------------
- 指定されているデータ型が適切か
- Databaseがレプリケーションをしている場合slave遅延が考慮されているか
- 同時に複数端末で実行して不正な状態にならないか
	- 複数のリソースを同時に変更する場合にはロックをかける必要がある
	- トランザクションが使えるシステムならトランザクションを使用する
- 重い処理が入っていないか
	- 以下の条件にあてはまる場合には改善が必要
		- メソッドレベルで200msec以上かかる
		- HTTPリクエストレベルで1sec以上かかる
	- 改善策
		- 計算結果をキャッシュに詰めて2回目以降はそれを使用する
		- 外部リソースへのアクセスは一回にまとめて実行する
			- 100回insert文を実行するよりも100レコード文のbulk insertの方が速い、など
Vagrant で作った VM 上で service iptables start できない問題

## 症状

iptables の設定をするような chef のレシピを書いて Vagrant で作った VM 上で実行したら、次のようなエラーが出た。iptables サービスを起動できていないようだ。

```
  ================================================================================
    Error executing action `start` on resource 'service[iptables]'
    ================================================================================
    
    Mixlib::ShellOut::ShellCommandFailed
    ------------------------------------
    Expected process to exit with [0], but received '6'
    ---- Begin output of /sbin/service iptables start ----
    STDOUT: 
    STDERR: 
    ---- End output of /sbin/service iptables start ----
    Ran /sbin/service iptables start returned 6
```

試しに手動で `$ sudo service iptables start` してみると、なんのメッセージも表示されない。

## 原因

`/etc/sysconfig/iptables` が存在しないと `/etc/init.d/iptables` がエラーを吐くから。

```bash

# Do not start if there is no config file.
[ ! -f "$IPTABLES_DATA" ] && return 6
```

参考: http://serverfault.com/questions/405791/service-iptables-doesnt-display-message

Box ファイルにもよるのかもしれませんが、僕の手元の VM にはデフォルトで iptables ファイルが存在しませんでした。

## 解決策

`not_if` で条件を付けつつ templete リソースから notifies する。

```rb
service "iptables" do
  supports :status => true, :restart => true, :stop => true
  action [:enable, :start]
  only_if "ls /etc/sysconfig/iptables"
end

template "#{node[:iptables][:path]}/iptables" do
  source "iptables.erb"
  owner "root"
  group "root"
  mode "0644"
  notifies :restart, "service[iptables]"
end
```

一瞬 service リソースの action を nothing にしようかとも思ったけど、そうすると「何らかの理由で手動で iptables を止めて、かつ設定ファイルに変更がない」場合に chef-solo 実行でサービスが起動できないのでやめました。
AFNetworkingのPOSTでJSONが空になってしまう場合

# はじめに
iPhoneアプリからサーバ側処理呼び出しを実装しました。

JSONのパラメータでPOSTリクエストし
レスポンスでもJSONを受け取る形です。

呼び出し部分にはAFNetworkingを使用したのですが
その時にサーバ側に値が渡せず空になってしまっていました。

呼び出し方が悪いのか
サーバ側の受け方が悪いのか...

試行錯誤した結果、成功したので共有します。

# 補足
サーバ側は、Azure上にWorkerロールを動作させています。C#で実装しました。

「タイムアウトの指定をしたい」という要件もありました。

データが渡せなかったのは単純に自分の理解ミス・実装ミスの可能性あります。

# 失敗した実装(AFHTTPRequestOperationManagerを使用)

```lang:呼び出し部分
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

NSDictionary *param = @{@"key":@"xxx",
                        @"user":@{@"user_id":@"yyy"}};

[manager POST:@"http://http://XXX.cloudapp.net/YYY/get_user" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"success: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"fail: %@", error);
    }];
```

# 成功した実装(AFHTTPRequestOperation)

```lang:WCFUtil.m
+ (AFHTTPRequestOperation *)makeRequestOperation:(NSString *)command param:(NSDictionary *)param timeoutInterval:(NSTimeInterval)timeoutInterval
{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://XXX.cloudapp.net/YYY/", command]];

    NSError *err = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:param options:NSJSONWritingPrettyPrinted error:&err];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:timeoutInterval];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:jsonData];
    
    return [[AFHTTPRequestOperation alloc] initWithRequest:request];
}
```

```lang:サーバ側処理呼び出し部分
NSDictionary *param = @{@"key":@"xxx",
                        @"user":@{@"user_id":@"yyy"}};

    AFHTTPRequestOperation *operation = [WCFUtil makeRequestOperation:@"get_user" param:param timeoutInterval:30];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *op, id responseObject) {

        NSError *parseError = nil;
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&parseError];

        if ([json[@"result"] isEqualToString:@"OK"]) {
            // 正常完了時処理
        }
        else {
            // 失敗時処理
        }

    } failure:^(AFHTTPRequestOperation *op, NSError *error) {
        NSLog(@"Error: %@", [error localizedDescription]);
    }];

    // 実行
    [operation start];
```

# おわりに
AFNetworking、Azure Workerロール、JSON
この組み合わせの実装で躓いた人に役立つかもです。

何かの参考になりましたら幸いです。
chef の not_if とか only_if は何を基準に真偽を判定してるのか

## 概要

chef で使う `not_if` とか `only_if` は何を基準にして真偽を判定してるのかがずっと謎でした。例えば

```rb
not_if grep hoge piyo.txt
```

は何となく piyo.txt に hoge と書かれてなければ実行されるっぽいのですが、厳密にはどこを見て真偽を決めているのかがわかっていませんでした。

## 結論

実は UNIX コマンドには戻り値が存在し、それが 0 のとき true, それ以外のとき false として扱われます。

また、戻り値は端末上でコマンドを実行したあと `echo $?` を実行すると確認できます。

```bash
$ ls chef-repo/
Berksfile  Berksfile.lock  cookbooks  data_bags  environments  nodes  readme.md  roles  site-cookbooks

$ echo $?
0

$ ls chef-repoooooooooooooooo/
ls: cannot access chef-repoooooooooooooooo: そのようなファイルやディレクトリはありません

$ echo $?
2
```

知らなかったのは自分だけでしょう。
最近投稿したリマインダーを取得する

登録されているリマインダー全てを取得して、登録日降順に並び替えています。


``` objective-c

func sortedReminders(){
    
    self.reminders = [];
    var eventStore : EKEventStore = EKEventStore()
    var calendars:NSArray = eventStore.calendarsForEntityType(EKEntityTypeReminder)
    var predicate = eventStore.predicateForRemindersInCalendars(calendars)
    eventStore.fetchRemindersMatchingPredicate(predicate, completion: { (reminders: [AnyObject]!) -> Void in

        let sortedReminders = reminders.sorted({ (item1 , item2 ) -> Bool in
            let calendar = NSCalendar(identifier: NSGregorianCalendar)!
            let compare = calendar.compareDate(item1.creationDate, toDate: item2.creationDate, toUnitGranularity: NSCalendarUnit.MinuteCalendarUnit)
            return compare == NSComparisonResult.OrderedDescending
        })

        for reminder in sortedReminders {
            println(reminder.creationDate)
            self.reminders.append(reminder as EKReminder)
        }
    })
    
}


```
カレントディレクトリをDocumentRootとして簡単にHTTPサーバを建てる

これだけ。

```rb
$ ruby -run -e httpd . -p 8080
```

runっていうか、``` require "un" ``` でKernel.httpdメソッドが生えるのね。
こういうネーミングセンスは見習いたいですね。

http://docs.ruby-lang.org/ja/2.1.0/library/un.html

**追記**
探したら類似記事がありました。
http://qiita.com/sudahiroshi/items/e74d61d939f18779970d
phpマイクロフレームワークSlimのmodeによる設定について


設定に関するメモ。slimフレームワークの動きを変える設定もあるが、ここでは独自の設定に関して書きます。

##設定の取得/追加
slimインスタンスに対して、独自の設定値の追加と取得について。方法は次の２通りがあります

* コンストラクタに設定の配列を渡す
* Slim::configメソッドを利用する

サンプルコード

```php
<?php
require 'vendor/autoload.php';

$app = new \Slim\Slim(array(
    // コンストラクタで独自設定を追加
    'my' => 'hoge',
));

// Slim::configメソッドで追加
$app->config('my2', 'foo');

$app->get('/', function() use ($app) {
    // Slim::configを利用して取得も可能
    echo sprintf('my=[%s], my2=[%s]', $app->config('my'), $app->config('my2'));
});

$app->run();
```

```
$ curl http://localhost:8000/
my=[hoge], my2=[foo]
```

2つのタイミングでの設定の追加／取得が確認できました。上記のサンプルでは、key/valueでセットしていますが、第1引数に配列を指定することもできます。

##環境(mode)に応じて設定を変える
slimのmodeとslim::configureModeを利用することで、development/productionなどの環境応じて設定値を変えることができます。

DBの接続情報の違いに利用したり、Slimインスタンスも無名関数内で参照できるので、ルーティングやミドルウェアの追加も可能です。

サンプルコード

```php
<?php
require 'vendor/autoload.php';

$app = new \Slim\Slim(array(
    // modeの設定を行う
    'mode' => 'development',
));

// modeに応じて設定を追加
// Slim::configureModeは、第1引数で指定した文字列が
// modeと一致した際に第2引数の関数を実行する
$app->configureMode('development', function() use ($app) {
    $app->config('msg', 'mode is development');
});
$app->configureMode('production', function() use ($app) {
    $app->config('msg', 'mode is production');
});

$app->get('/', function() use ($app) {
    // 設定を取り出して出力
    echo $app->config('msg');
});

$app->run();
```

```
$ curl http://localhost:8000/
mode is development
```

こちらも確認ができました。サンプルコードのmodeをproductionに変更すると「mode is production」が出力されます。
Logrusで標準出力とファイルの両方にログ出力する方法

Goでロギングライブラリを探してみて、
https://github.com/sirupsen/logrus
が使いやすそうだったのですが、標準出力とファイル両方にログ出力しようとして困りました。

標準出力とファイルをio.MultiWriterでラップして、logrusのLoggerに渡せばいいと思い、試してみたところ、標準出力とファイルの両方に出力することはできましたが、以下のようにファイルにもコンソールカラー表示のためのエスケープシーケンスが入ってしまいます。
`
[34mINFO[0m[0000] [ログメッセージ] 
`
Loggerのフォーマッターを

```go
logger.Formatter = &logrus.TextFormatter{DisableColors: true}
```

のようにすれば、エスケープシーケンスはなくなりますが、当然、標準出力もカラー表示されなくなります。
標準出力にはカラーで表示し、ファイルにはエスケープシーケンスなしに出力するには、Loggerを分けてそれぞれ出力する方法しかわかりませんでした。とはいえ、ログ出力時に毎回、それぞれのLoggerのメソッドを呼ぶのは面倒すぎますので、複数のLoggerをラップするLoggerを作ってみました。
https://github.com/learnin/go-multilog

コンストラクタで複数のLoggerを渡して、各ログ出力メソッド実行時に各Loggerの出力メソッドを呼んでいるだけです。
とりあえず、これでやりたいことはできましたが、もっといいやり方があれば知りたいです。

なお、そもそもlogrusではなく、https://github.com/golang/glog や https://github.com/cihub/seelog や https://github.com/alecthomas/log4go 等を使えばこのような問題はなかったのかもしれませんが、設定の方法がコマンドラインオプションだったりXMLファイルだったりする点が好みではなく試していません。
ReactiveCocoa サンプル実装

# ReactiveCocoaのサンプル実装
基本的にほかのサイトを参考にさせてもらって実装しただけなので先に参考サイトを上げておきます。

## 参考サイト
http://ios.caph.jp/articles/mvvm-using-reactivecocoa
http://dev.classmethod.jp/smartphone/iphone/reactivecocoaintroduction/

###まずはpodのインストール <br>
```
$ sudo gem install cocoapods
$ pod setup
```
うまくいかない人は
http://qiita.com/yimajo/items/e89749079d7d5f6cd481
gemのバージョン上げればだいたいOK
### 適当な場所に新規プロジェクトをxcodeから作成<br>
```
$ cat Podfile
pod 'ReactiveCocoa'
```
<br>
xxxx.xcodeprojと同じフォルダに上のようなファイルを設置<br>
```
$ pod install
```
<br>とすると、xxx.xcworkspaceができるので次回以降はそこからOpenしてください
### xxx.xcworkspaceをひらいてViewController.mを以下の内容で編集します。<br>

```lang:ViewController.m
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>

@interface ViewController () <UITextFieldDelegate>
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 120, 40)];
    textField.delegate = self;
    
    [self.view addSubview:textField];
    
    RACSignal *signal = RACObserve(textField, text);
    [signal subscribeNext:^(id x) {
        NSLog(@"value changed to %@", x);
    }];
    
    textField.text = @"sample1";
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

@end
```
これをビルドして実行すれば、textフィールドへ入力した値を監視してNSLogに落とせることが
確認できます。
### ボタンのタップを検出する<br>
さっきのファイルに下記を追加する。

```lang:ViewController.m
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(120, 200, 80, 40);
    [button setTitle:@"Push" forState:UIControlStateNormal];
    [self.view addSubview:button];
    button.rac_command =
    [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        NSLog(@"Tapped");
        RACSignal *retSignal = [RACSignal empty];
        return retSignal;
    }];
```
シミュレータ起動してタップするたびにログが吐かれることがわかると思います。
イチイチメソッド作らなくて済むのがミソ！

5. sequenceをためす

```lang:ViewController.m
    NSArray *charArray = [@"A B C D E F" componentsSeparatedByString:@" "];
    RACSequence *charSequence = charArray.rac_sequence;
    RACSequence *doubleCharSequence =
    [charSequence map:^id(NSString *value) {
        return [value stringByAppendingString:value.lowercaseString];
    }];
    RACSignal *signalFromDoubleCharSequence = [doubleCharSequence signal];
    
    [signalFromDoubleCharSequence subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];

```
実行すれば「A B C D E F」が順に処理されて「Aa Bb ...」と出力されるのがわかると思います。
いかにも関数型ぽい処理ができてます。
for文書かないのが素敵なわけですね。
ActiveRecord の attribute 更新方法まとめ


ActiveRecord の attribute 更新方法ってどんなものがあって、それぞれどんな違いがあるかご存じですか？

案外色々とあったので表にまとめてみました。リファレンスやソースコードを参考にしつつ、Rails 4.2 でテストしています。

### 単一の attribute 更新

|メソッド|保存|バリデーション(*1)|コールバック(*2)|readonly チェック(*3)|updated_at の更新|補足|使用例|
|-------|:--:|:---------:|:-----------:|----|-----|---|---|
|attribute=|x|-|-|-|-|  |article.title = 'title'|
|write_attribute|x|-|-|-|-|private メソッド。attribute= はこれを呼び出している。タイプキャストを行う。例えば integer なカラムの attribute に `"5"` を渡すと数値の `5` に変換する。|`write_attribute(:title, 'title')` `write_attribute(:rate, "5")`|
|self[:attribute]|x|-|-|-|-|write_attribute の alias。こちらは public。|article[:title] = 'title'|
|raw_write_attribute|x|-|-|-|-|private メソッド。渡された値のタイプキャストを行わない。例えば integer なカラムの attribute に `"5"`を渡しても数値の `5` に変換しない。|`raw_write_attribute(:title, 'title')`, `raw_write_attribute(:rate, "5")`|
|update_attribute|o|x|o|o|o|dirty な attribute をすべて保存する。readonly な attribute の場合は例外が発生する。|article.update_attribute(:title, 'title')|
|update_column|o|x|x|o|x|update_columns(name => value) に相当。詳細については次の表へ。|article.update_column(:title, 'title')


### 複数の attribute をまとめて更新

|メソッド|保存|バリデーション(*1)|コールバック(*2)|readonly チェック(*3)|updated_at の更新|補足|使用例|
|-------|:--:|:---------:|:-----------:|----|-----|----|---|
|assign_attributes|x|-    |-    |-  |-  | |`article.assign_attributes(title: 'title', body: 'body')`|
|attributes=|x|-   |-   |-   |-  |assign_attributes の alias|`article.attributes = { title: 'title', body: 'body' }`|
|update|o|o|o|o|o|save を呼び出す|`article.update(title: 'title', body: 'body')`|
|update_attributes|o|o|o|o|o|update の alias|`article.update_attributes(title: 'title', body: 'body')`|
|update!|o|o|o|o|o|update と同じ処理を行うが、save ではなく save! を呼び出す。そのため例外が発生する。|`article.update!(title: 'title', body: 'body')`|
|update_attributes!|o|o|o|o|o|update! の alias|`article.update_attributes!(title: 'title', body: 'body')`|
|update_columns|o|x|x|o|x|UPDATE SQL を発行して DB を更新するため最も速い。新しいオブジェクトの場合は例外が発生する。readonly の attribute が更新対象に含まれる場合は例外が発生する。|`article.update_columns(title: 'title', body: 'body')`|

### クラスメソッド

|メソッド|保存|バリデーション(*1)|コールバック(*2)|readonly チェック(*3)|updated_at の更新|補足|使用例|
|-------|:--:|:---------:|:-----------:|----|-----|----|---|
|update|o|o|o|o|o|readonly な attribute を指定すると無視される|`Article.update([1, 2], [{ title: 'title1', body: 'body1' }, { title: 'title2', body: 'body2' }])`|
|update_all|o|x|x|x|x|対象のリレーション中すべてのレコードに対して UPDATE SQL を発行する。ActiveRecord のインスタンスを作成しないためバリデーションやコールバックの呼び出し、タイプキャストなどは行われない。そのため、そのまま DB に保存して良い値しか渡すべきではない。|`Article.where(category: 'rails').update_all(title: 'title', body: 'body')`|

(*1) 保存時にバリデーションが行われるかどうか。
(*2) 保存時に各種コールバックが呼び出されるかどうか。
(*3) attr_readonly で指定した readonly な attribute が更新されない場合は o。される場合は x。

----

何かミスにお気づきの際はコメントしていただけると助かります。
javascriptのDateを使って日付を出力する

大したことはないのですが・・・JSのDateのgetMonth()とかで、ちょっと混乱したのでメモ。

```js
var date = new Date('2015/1/1');
console.log(date.getMonth()); // 1を期待していたら0
console.log(date.getDay()); // 1を期待していたら4
```

JSの月は、０〜１１で処理されているので、

```js
console.log(date.getMonth() + 1); //これで1
```

とする必要があります。
で、日付は、getDay()ではなく、getDate()でした・・・（getDay()は曜日）。

```js
console.log(date.getDate()); //これで1
```
楽観ロックのデメリット、プログラムで制御する必要があるとは？

javaプログラミング初心者です。 

排他的制御の楽観ロックについて勉強しているのですが、 
デメリットのひとつである、 
「プログラムで制御する必要がある」 
とはどういうことでしょうか？ 


ネットで調べていますが、うまく見つけることができません。 
わかる方がいればよろしくお願いします。
SwiftでNSNotificationを利用してクラス間の処理を連携する

備忘録です

画面内で別クラスで定義している２つのVIEW（仮にAとBとします）があって、
A側がスクロールされると、B側のVIEWのデータを更新する、という処理を下記のように実装

参考にさせていただいたリンク
http://dev.classmethod.jp/references/ios-8-swift-nsnotification-userinfo/
http://qiita.com/_tid_/items/a650900c9f2b57f1a22e
//Objective-Cですがわかりやすい説明で助かりました
http://iphone-tora.sakura.ne.jp/nsnotificationcenter.html

```lang:swift
■通知を送る側

//NSNotificationのインスタンスを作成。["value":100]という辞書型のデータを持たせる
var n : NSNotification = NSNotification(name: "dummy", object: self, userInfo: ["value": 100])
//通知を送る
NSNotificationCenter.defaultCenter().postNotification(n)


■通知を受け取る側

//initなどでNSNotification登録
NSNotificationCenter.defaultCenter().addObserver(self, selector: "update:", name: "dummy", object: nil)

//関数で受け取った時のアクションを定義
func update(notification: NSNotification)  {
　if let userInfo = notification.userInfo {
  　let result = userInfo["value"]! as Int
  　println("受信した数値：\(result)")
  }
}
```

■わかっていないこと
・userInfoは辞書型である必要があるのかわからない（現状は辞書型）

====追記＝＝＝＝＝＝＝＝
通知を受け取る側において、initでNSNotificationを登録した場合、
deinitでNSNotificationを開放しておかないと、画面遷移して戻ってきた時などに
エラーになりました。

```lang:swift
    deinit {
        println("deinit call")
        //イベントリスナーの削除
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
```
NSNotificationは後片付けが大事なのですね。

参考：
http://qiita.com/mo_to_44/items/dbc3446e0334c5e07547
http://www.hawk-a.com/exception_code/archives/1349
http://swift-salaryman.com/nsnotificationcenter.php
トランザクションがつかめないとは？

javaプログラマー初心者です。
言葉の使い方の質問です。
先輩社員が以前
「トランザクションをつかめない」
と言っていたのですが、
それはどういう意味でしょうか？

かなり漠然な質問で状況や使っていたタイミングも覚えていないので答えにくいかもしれませんが、わかる方がいればよろしくお願いします。
Dockerコンテナ内のrails4.2のアプリをproxyするときにハマったこと

#Intro
Dockerコンテナ内のrailsアプリをproxyしてホスト側から動作確認しようとした時に
ちょっとだけハマったメモ。

#環境
- rails 4.2 + centos6.6(コンテナ側)
- centos6.3(ホスト側)
- docker1.3(ホスト側)

#内容
下記環境で動作確認しようとしたら動かなかった。。

|-|ポート(tcp)|備考 | 
|:----|:---|:---|
|*コンテナ側*|3000 |railsをdevelopment環境で立ち上げ(`bundle exec rails s`)|
|*ホスト側*|51001|コンテナ側の3000番を51001ポートで待ち受け|


コンテナ立ち上げ時のコマンド

```bash
docker run -t -i -d -p 51001:3000 --name hoge "イメージ名" /bin/bash
```

ブラウザから意気揚々と動作確認しようとしたら、、

```
http://{ホスト側IP}:51001/
```

ダメでした...telnet/curlしてもdisconnectされました。
コンテナ内ではlocalhost指定で見れるのに。

#原因
参考URLにある通りrackバージョン1.6での[仕様変更](https://github.com/rack/rack/commit/28b014484a8ac0bbb388e7eaeeef159598ec64fc)のせいでした。
3000番ポートがループバックアドレスの127.0.0.1でlistenされていました。

#解決策
rails立ち上げ時にbindアドレスを指定しました。

```bash
bundle exec rails server -b 0.0.0.0
```

無事見れました。

#参考URL
とてもわかりやすく参考になりました。

http://www.techscore.com/blog/2014/09/12/rails4-2beta1%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E6%9C%80%E5%88%9D%E3%81%AB%E3%81%AF%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8/
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」システム定数／変数

# システムで用意されている定数／変数

### addObjectの「**type**」で指定するオブジェクトの種類
CONTROL
SPRITE
LABEL
PRIMITIVE
COLLADA

### 「**rigid**」がtrueの場合に「**kind**」で指定する種類
DYNAMIC_BOX
DYNAMIC_CIRCLE
STATIC_BOX
STATIC_CIRCLE

---
### addObjectの「**type**」が「**PRIMITIVE**」の時の「**model**」
BOX
CUBE
SPHERE
CYLINDER
TORUS
PLANE

---
### addObjectの「**scene**」で指定する値
TOPSCENE
GAMESCENE_SUB2
GAMESCENE_SUB1
GAMESCENE
BGSCENE_SUB2
BGSCENE_SUB1
BGSCENE

---
### 数式
RAD
DEG

---
### ユーザーグローバル変数
GLOBAL

---
### ゲームパッド情報が格納されている配列
PADBUTTONS
PADAXES
ANALOGSTICK

---
### ゲームパッドの方向キー情報を取得する時に使う定数
HORIZONTAL 
VERTICAL
**PADAXES[n][HORIZONTAL]** のように使う。

---
### ブラウザの大分類
_browserMajorClass

---
### ゲーム起動からの経過時間（小数点以下二桁）
LAPSEDTIME

---
### ゲームを起動した時のUNIXTIME
BEGININGTIME

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
Kinoma Create で温度計を作る

手元にアナログ出力の温度センサー LM61CIZ があったので、この値を表示してみる。
スタートアップメニューから辿れるサンプルプログラムのなかに、analog-temperature というそれらしき物がある。

ホーム画面の Front Pins でピンを設定して、センサーをつなぐ。左から、Power, Analog, Groundとする。
![kinoma1.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/dc732683-4eda-994d-a1ff-6cb28ca899a3.jpeg)
が、実行してみると動くがどうも値がずれている。使っているセンサーが違うので、あたりまえといえばあたりまえ。プログラムを変更するしかない。

温度計を表示するプログラムは、analog-temperatureというサンプルプログラムがここにある。
http://kinoma.com/develop/samples/
リンクをクリックしても他のサンプルプログラムと違い、GitHub に飛ばされるだけだが。
https://github.com/Kinoma/KPR-examples/tree/master/analog-temperature

というわけで、早速開発環境の Kinoma Studio をインストールして変更してみる。開発環境 Eclipse をベースに作られているようなので、僕にはなじみ深い。
Eclipseと同じ要領で、プロジェクトをインポートする。

基本的には３つのファイルで構成されているようだ。

|ファイル名|説明|
|:-----------|:------------|
|application.xml|プログラムの名前とかのメタ情報の記述|
|src/main.xml| 名の通り、メインファイル。xmlの中にjavascriptが埋め込まれている。|
|src/analog.js| いまいち何をしてるかよくわからない。|


というわけで、main.xml を覗いて、センサー値を取って、計算しているところを探す。

```xml:main.xml
<container id="MainContainer" top="0" left="0" bottom="0" right="0">
        <skin color="white"/>
        <label left="0" right="0" string="'- - -'">
            <style font="46px" color="black"/>
            <behavior>
            	<method id="onAnalogValueChanged" params="content,result"><![CDATA[
            		//Converts voltage result to temperature. 
                    var temp = 100 * ( result * 2.8 ) - 50;
                    content.string = temp.toFixed(2) + " °C";
                ]]></method>
			</behavior>
        </label>
    </container>
```

result というのが、センサーの値のようだ。マニュアルによると、アナログ値のセンサーの値は 0から1 の間の値をとるそうだ。で？何ボルトなの？おそらく、ベース電圧の3.3Vが 1 の値をとるのだろう。3.3倍するとボルト数が得られる。さらに、1000倍して ミリボルト数が得られる。

(ミリボルト数) = result*3.3*1000

このセンサーは、測定範囲が、-30°Cから100°Cで、1°Cあたり10mV上昇するとのこと。0°Cのとき 600mv になる。すなわち、以下の式で求められる。

((result*3.3*1000)-600)/10  ---簡略化---> (result * 3.3 * 100) - 60;

さらに、小数点以下一桁だけ表示させる様に変更。

```js:main.xml
                    var temp = (result * 3.3 * 100) - 60; 
                    content.string = temp.toFixed(1) + " °C";    
```

Kinoma Studio では、同一のネットワークに繋がっている Kinoma Create を自動的に探して表示してくれる。bento と名前をつけた Kinoma Create の横の 'Run >' ボタンをクリックすると、リモートでプログラムを実行できる。

![kinoma.png](https://qiita-image-store.s3.amazonaws.com/0/60968/8b7dfb2c-b28d-de4b-07ef-b91897613083.png)

動いた！

![kinoma1.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/adc86622-b505-f217-07de-eece3e77b051.jpeg)

だけど、表示がたまにチラチラして、19.0 になることがある。
分解能がたりないのか？

![kinoma2.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/7bb0c17b-5d85-dee1-f6fa-6f153b308e04.jpeg)

動いたから、とりあえずいいや。
Sphereモデルを天球として利用するシェーダー

THETAなど、手軽に360度画像を撮影できる機材も増えてきました。
これらの360度画像をUnity標準のSphereモデルに張り付けて、お手軽に360度画像を再現したいけど、カメラがSphereの内側に入ると画像が表示されなくなってしまう（バッククリップ）・・・。
そんな時に便利なShaderです。

**Unity5.xでは手順が下記のように変更になりました。**
1. Assets>Create>Shader>UnlitShaderでシェーダーを作成
2. Tagsの下に *Cull Front* の1行を追加
3. vert()内に *v.uv.x = 1-v.uv.x;* の１行を追加

* 初めから左右が逆のテクスチャを使用する場合、3は不要です。

```shader:UnlitTextureCullFrontMirror.shader
Shader "Unlit/TextureCullFrontMirror"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		Cull Front //<-
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			// make fog work
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				UNITY_FOG_COORDS(1)
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata v)
			{
				v.uv.x = 1-v.uv.x; // <-
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				// sample the texture
				fixed4 col = tex2D(_MainTex, i.uv);
				// apply fog
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
			ENDCG
		}
	}
}
```
以上で、球の内側をレンダリングするシェーダーができました。
![スクリーンショット 2016-01-23 18.12.15.png](https://qiita-image-store.s3.amazonaws.com/0/59911/277dc2f8-01ad-0040-a353-fe5897b2fa52.png)


***
**下記はUnity4.xの手順です。shaderはUnity5.xでもそのまま使用できます**
１．Assets>Create>Shaderでシェーダーを作成
２．Tagsの下に *Cull Front* の1行を追加
３．*o.Albedo* を *o.Emission* に変更
４．surf() 内に *IN.uv_MainTex.x = 1-IN.uv_MainTex.x;* の1行を追加

* ライトの影響を受けるようにしたい場合、３は不要です。
* 初めから左右が逆のテクスチャを使用する場合、４は不要です。

```shader:UnlitTextureCullFrontMirror.shader
Shader "Unlit/TextureCullFrontMirror" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		Cull Front
		
		CGPROGRAM
		#pragma surface surf Lambert

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) {
			IN.uv_MainTex.x = 1-IN.uv_MainTex.x;
			half4 c = tex2D (_MainTex, IN.uv_MainTex);
			o.Emission = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	} 
	FallBack "Diffuse"
}
```
ファイルの制限値設定

nginx+unicornで大量のリクエスト投げるとエラーになっていたのを、ファイルの最大オープン数設定を変更して対応した。
以下を参考。

[Nginx: 24: Too Many Open Files Error And Solution](http://www.cyberciti.biz/faq/linux-unix-nginx-too-many-open-files/ "Nginx: 24: Too Many Open Files Error And Solution")

soft、hard については、以下を参考

[ユーザーのプロセス暴走やメモリ食いつぶし防ぐ - それマグで！](http://takuya-1st.hatenablog.jp/entry/20101020/1287562768 "ユーザーのプロセス暴走やメモリ食いつぶし防ぐ - それマグで！")
Chrome拡張がWindowsでのみインストール時にエラーになる

現象
----

WindowsのChromeのみ下記のように「パッケージが無効です。詳細 拡張機能を解凍できませんでした」というエラーが出ます。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/5df13123-2811-8189-4fe5-6e1ffa9e1ce0.png)

原因
----

ChromeストアにアップロードしたZIPファイルがCRXファイルという形式でダウンロードされるようになるんですが、このファイルの中にWindowsでは読めないファイル等があるとこのようなエラーになるようです。

http://stackoverflow.com/questions/7984320/chrome-extension-invalid-package-detailscant-unzip-the-extension

Give Me CRXというChrome拡張で自分のCRXファイルをダウンロードし7ZIPで解凍してみたところ、自分の場合はnode_modulesにWindowsではファイル名が長すぎるファイルが紛れ込んでいたようです。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/48e14ec3-98a1-8aaf-acf9-bd71746c8ce2.png)

対処
----

今回の自分の場合は、bowerやbrowserifyを利用していたんですが、bower_componentsやnode_modulesなどのフォルダは拡張の機能では直接使うことはないためこれらを全て消して対処しました。不要なファイルやフォルダは含めるなっていうことですね。

公開し直したところWindowsでも無事インストールできました。
遠い世界の数式 (RubyVM::InstructionSequence.load)


問題：http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/

解法として、まじめに構文解析するか、正規表現を使うか( http://qiita.com/cielavenir/items/ad6338a8cc4fa9c99704 )、Rubyのevalを何とかして使うかということになると思う。

Rubyのevalを利用したい場合、(鍋谷さんの解法のように数値を全て別クラスに分岐することをしなければ)このように、どうしてもモンキーパッチが必要になる　~~(Refinementで可能かどうかの確認はしていない)~~。

20230523: Refinementで書き直しました.

```rb:kanagawarb_evalex_eval.rb
#!/usr/bin/ruby
#http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/

Fixnum=Integer if !defined?(Fixnum)
module FixnumHack
	refine Fixnum do
		alias_method :or_real,:|
		alias_method :and_real,:&
		alias_method :plus_real,:+
		alias_method :mult_real,:*
		def |(other) self.mult_real(other) end
		def &(other) self.plus_real(other) end
		def +(other) self.and_real(other) end
		def *(other) self.or_real(other) end
	end
end
class Impl
	using FixnumHack
	def solve(s)
		eval(s.tr('*+&|','|&+*'))
	end
end

while gets
	p Impl.new.solve $_
end
```

既存メソッドの上書きを何とか回避できないものかと考えるうちに、「コンパイルされたバイトコードを上書きする」方法を考えついた。そのためには、librubyのrb_iseq_loadをRubyの世界から見えるようにすれば良い。

```rb:kanagawarb_evalex_iseq.rb
#!/usr/bin/ruby
#http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/

begin
	require 'iseq'
rescue LoadError
	require 'fiddle'

	class RubyVM
		class InstructionSequence
			addr = Fiddle.dlopen(nil)['rb_iseq_load']
			fn   = Fiddle::Function.new(addr, [Fiddle::TYPE_VOIDP] * 3, Fiddle::TYPE_VOIDP)
			define_singleton_method(:load) do |dat, par=nil, opt=nil|
				fn.call(Fiddle.dlwrap(dat), par, opt).to_value
			end
		end
	end
end

while gets
	bytecode=RubyVM::InstructionSequence.compile($_.tr('*+&|','|&+*')).to_a
	bytecode[13].map!{|e|
		if e[1].is_a?(Hash)&&e[1].has_key?(:mid)
			e[1][:mid]=e[1][:mid].to_s.tr('*+&|','|&+*').to_sym
			e[0]={:* => :opt_mult,:+ => :opt_plus,:& => :opt_send_simple,:| => :opt_send_simple}[e[1][:mid]]
		end
		e
	}
	p RubyVM::InstructionSequence.load(bytecode).eval
end
```

##最後に
わかっているとは思いますが、RubyVM::InstructionSequence.load解法はネタです(これ以上邪悪な方法はないと思います)。実務ではやらないようにして下さい^^;;
Raspberry Piをヘッドレスで使うためのソフトのインストール（Linux Mint）

忘備録）

Windowsの場合はCygwinをインストールすれば良いとのことですがLinuxだったので個別にインストールしました。

## SSHソフトのインストール

デフォルトでインストールされているとのことで、sshコマンドを実行してみた所、OK！

## プロキシソフト「Squid」のインストール

`$ sudo apt-get install squid`

## イメージ取得ソフト「gddrescue」のインストール

`$ sudo apt-get install gddrescue`

##シリアル通信ソフト「jerm」のダウンロード

http://www.bsddiary.net/jerm/
からダウンロード

追記）
FABLIBのサイトからもコンパイル済みのjermが手に入るようです。
http://sourceforge.jp/projects/fablib/releases/p14384

## ext4ファイルシステムアクセスソフトウェア

Linux は登録必要なし☆
EC2(AmazonLinux)のタイムゾーンを変更するItamae・Chefのレシピ


ItamaeでもChefでも同じレシピでいけます。

# 要件
* デフォルトのタイムゾーンUTC -> JSTへ
* glibcの更新によってタイムゾーンがUTCに巻き戻らないようにする
	* 参考:[Amazon EC2(Linux)システム管理で知らないとハマる5つの環境設定](http://dev.classmethod.jp/cloud/five-confs-of-ec2-linux-sysops/)

# レシピ

```Ruby
execute "change localtime to JST" do
  user "root"
  command <<-EOC
  cp -p /usr/share/zoneinfo/Japan /etc/localtime
  echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
  echo 'UTC=false' >> /etc/sysconfig/clock
  EOC
end
```
可変長引数を定義して、引数を渡さないとメソッド内では空配列になる。

タイトルの通りです。
可変長引数の引数に配列を渡した時に、*を付けなかった場合と付けた場合で試してみました。

**①で `b.inspect` が空配列になっています。**

# ① *を付けなかった場合
`可変長引数*b`には値が渡されていません。

```rb
def foo(a, *b)
  puts "a:#{a.inspect}, b:#{b.inspect}"
end

data = [1, 2, 3]
foo(data)
```
```bash:結果
a:[1, 2, 3], b:[]
```

# ② *を付けた場合
`可変長引数*b`に、配列[2, 3]が渡されています。

```rb
def foo(a, *b)
  puts "a:#{a.inspect}, b:#{b.inspect}"
end

data = [1, 2, 3]
foo(*data)
```
```bash:結果
a:1, b:[2, 3]
```

# 補足
inspectじゃなくても同じでした。

```rb
def foo(a, *b)
  puts "a:#{a}, b:#{b}"
end

data =[1, 2, 3]
foo(data)
foo(*data)
```
```bash:結果
a:[1, 2, 3], b:[]
a:1, b:[2, 3]
```
シェルを持たないユーザで一時的にコマンドを実行方法

`/etc/passwd` で `/sbin/nologin`のユーザーで、そのユーザーとしてコマンドを実行する方法

```
$ su - [user] --shell=/bin/bash -c [command]
```

[[nginx][linux][小ネタ]シェルを持たないユーザで一時的にコマンドを実行させる | (っ´∀｀)っ ゃー | nullpopopo](http://nullpopopo.blogcube.info/2013/05/su-command-option.html "[nginx][linux][小ネタ]シェルを持たないユーザで一時的にコマンドを実行させる | (っ´∀｀)っ ゃー | nullpopopo")
キーワード引数の引数にキーだけしか書かないとArgumentError

キーだけしか書かない場合でも、勝手に値をnilにしてくれるかなと思ったけどそんなことはなかった。

# キーだけしか書かない例
```rb
def foo(a:, b:123)
  p a
  p b
end
foo(b:456)
```

```bash:結果
4.rb:7:in `<main>': missing keyword: a (ArgumentError)
```

# キーと値をどっちも書いた例

```rb
def foo(a:nil, b:123)
  p a
  p b
end
foo(b:456)
```

```bash:結果
nil
456
```

# 参考
パーフェクトRuby p.105 3-5-10 キーワード引数にも同じこと書いてあった。

```rb
def keywords(alice: nil, bob: nil) 
  {alice: alice, bob: bob}
end

keywords alice: 'アリス', bob: 'ボブ' 
# => {:alice=>"アリス", :bob=>"ボブ"}

keywords
# => {:alice=>nil, :bob=>nil}
```

>
 **キーワード引数にはデフォルト値を指定する必要があります。**上記の例では各キーワード引数に nil を指定していました。何かデフォルト値を指定してみましょう。
>

```rb
# デフォルト値は仮引数に直接指定する
def keywords(alice: 'ありす', bob: 'ぼぶ') 
  {alice: alice, bob: bob}
end

keywords bob: 'ボブ' 
# => {:alice=>"ありす", :bob=>"ボブ"}
```
【小ネタ】.htaccess ファイル単位で認証

.htaccess を使ってファイル単位で認証する方法。
いつか使うかもしれない小ネタ。

気づいた時は目からウロコだった。

例えばすでにインストールしてしまった WordPress の wp-login.php だけに、プラグインを使わずに認証をかける場合。

```
<Files ~ "wp-login.php$">
    AuthUserFile /path/to/.htpasswd
    AuthGroupFile /dev/null
    AuthName "てきとうな名前（英語が無難）"
    AuthType Basic
    require valid-user
</Files>
```
いつもディレクトリごとに認証かけてたので気づかなんだ。
モジュール内のメソッドにsuperを書いた場合と書かなかった場合の違い

モジュール内でsuperが書かれている時にエラーが出たり出なかったりするので試してみた。

# ①モジュール内のメソッドにsuperが書かれていないケース。
クラスAのfooメソッド内のsuperで、includeしているモジュールの同名メソッドが呼ばれてる。

```rb
module M
  def foo
    puts "モジュールM#foo"
  end
end

class A
  include M
  def foo
    super
    puts "クラスA#foo"
  end
end

p A.ancestors
A.new.foo
```

```bash:結果
[A, M, Object, Kernel, BasicObject]
モジュールM#foo
クラスA#foo
```
# ②モジュール内のメソッドにsuperを書いたケース。(エラー発生)
①と違いは、モジュールMのfooメソッドにsuperが書かれてるとこ。
クラスAインスタンスの継承関係でモジュールMのsuperclassが存在しないのでエラーが出てるみたい。

```rb
module M
  def foo
    super
    puts "モジュールM#foo"
  end
end

class A
  include M
  def foo
    super
    puts "クラスA#foo"
  end
end

p A.ancestors
A.new.foo
```
```bash:結果
[A, M, Object, Kernel, BasicObject]
sample_module_super.rb:3:in `foo': super: no superclass method `foo' for #<A:0x007fd9921fd790> (NoMethodError)
	from sample_module_super.rb:11:in `foo'
	from sample_module_super.rb:17:in `<main>'
```

# ③ モジュール内のメソッドにsuperを書いて、別途クラスを追加したケース。
②との違いはクラスBを定義して、クラスAにクラスBを継承させた。
クラスAインスタンスについての継承関係だと、モジュールBのsuperがクラスBになっている。

```rb
class B
  def foo
    puts "クラスB#foo"
  end
end

module M
  def foo
    super
    puts "モジュールM#foo"
  end
end

class A < B
  include M
  def foo
    super
    puts "クラスA#foo"
  end
end

p A.ancestors
A.new.foo
```

```bash:結果
[A, M, B, Object, Kernel, BasicObject]
クラスB#foo
モジュールM#foo
クラスA#foo
```

# ④ 別途クラスを追加して、モジュール内のメソッドのsuperは消したケース。
③と違いは、モジュールMのfooメソッドのsuperを消したとこ。

```rb
class B
  def foo
    puts "クラスB#foo"
  end
end

module M
  def foo
    puts "モジュールM#foo"
  end
end

class A < B
  include M
  def foo
    super
    puts "クラスA#foo"
  end
end

p A.ancestors
A.new.foo
```
```bash:結果
[A, M, B, Object, Kernel, BasicObject]
モジュールM#foo
クラスA#foo
```

# 感想
モジュール内のメソッドにsuperを書くとエラーが出る可能性があるのでよろしくない気がする。


# 参考サイト
## [Ruby]やったーRuby技術者認定Gold受かったよー＼(^o^)／
http://d.hatena.ne.jp/rightgo09_ruby/20121226/p1
「superはincludeされてるモジュールは呼ばれる？」

> superclassでは出てこないから、呼ばれないと思ってたけど…。

```rb
module M
  def hoge
    puts "module M"
    super
  end
end

class Hoge
  def hoge
    puts "class Hoge"
  end
end

class Fuga < Hoge
  include M
  def hoge
    puts "class Fuga"
    super
  end
end

Fuga.new.hoge
```
```bash:結果
class Fuga
module M
class Hoge
```

> げげ呼ばれた…。モジュールもsuperの対象になるのか…。この辺で3問くらいミスった気がするな。