OmniAICreator/Qiita-1.07M huggingface dataset:
gitでリモートリポジトリ間の同期状況を確認

分散リポジトリでそれぞれ好きなように進化していけるのがgitの良いところだと思うけど、それでも運用上同期を取らないといけない場合がある。

そんなときの運用は、
1. 定期的にmergeする
2. 片方のリポジトリにコミットがpushされたら自動的にもう一方にmergeする
などが考えられる。

もちろん2.の方法がベターなんだけど、過渡期だからあんまりアグレッシブなことがしたくないとか、リリース前だから片方のリポジトリは触れないとかの制約が厳しくて2.の方法がとれない場合、1.の方法を取ることになる。

前置きが長くなったが、その場合は下記のようにすればリモートリポジトリ間の差分があるかどうかを確認できるので、下記のコマンドを定期的にまわし、差分があるときだけアラートを投げるようにすれば運用の手間が少しは減らせる。

    mkdir remote-sync-check
    cd remote-sync-check
    git init --bare
    git remote add origin1 /homge/GIT/sample-repo1.git
    git remote add origin2 /homge/GIT/sample-repo2.git
    git fetch --all
    git ls-remote origin1 > ls-remote-origin1.txt
    git ls-remote origin2 > ls-remote-origin2.txt
    diff -u ls-remote-origin1.txt ls-remote-origin2.txt

ぶっちゃけ本質は最後の３行だけ。`git ls-remote リポジトリ`でリモートリポジトリの全ブランチのSHA1-IDが出力されるので、その出力結果を比較すればOK。タグの情報も出力してくれるので、タグが一方にしかうたれていない状況にも気づける（そのことが問題になる場合、そのことが問題になる運用自体に問題がありそうだけど）。もちろん実際にこのチェックを定期的に行う場合はfetch以下だけで十分。

ブランチやリポジトリの差分は大きくなればなるほどmergeがめんどくさくなっていくので、あるべき姿でなくなっているなら早めに気づけるようにしておきたい。

ちなみに最後の3行は、下記のようにすれば１行にまとめられるけど、diffの出力がわかりにくくなるのであまりオススメしない。

    diff -u <(git ls-remote origin1) <(git ls-remote origin2)

参考：[標準入力同士の diff](http://qiita.com/bsdhack/items/55d5eced2fb3e6625d74)
iOSのアプリの四隅を角丸にする

## 概要

iOS6のときは何もしなくてもアプリの四隅が角丸になっていたと思いますが、iOS7からなくなってしまいました。私のように角丸の方が好みだったーという方、いますよね？

AppDelegate.m に２行足すだけでアプリ全体が角丸になりますよ。

## コード
```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    self.window.layer.masksToBounds = YES; // ビューをマスクで切り取る
    self.window.layer.cornerRadius = 4.0; // 角丸マスクを設定(数値は角丸の大きさ)
    
    return YES;
}
```

## 結果
![before.png](https://qiita-image-store.s3.amazonaws.com/0/27326/abfa5162-9d25-5a37-02cd-db987903886a.png)![after.png](https://qiita-image-store.s3.amazonaws.com/0/27326/ce56a46a-8ea3-0df0-345a-6d0c4645a108.png)
cat コマンド

由来：「concatenate」一群の資料を一緒にまとめる

### 複数ファイルを読む
```Bash
/etc (456) $ ls {syslog,nfs,ftpd}.conf
ftpd.conf	nfs.conf	syslog.conf
/etc (457) $ cat notify.conf
#
# Notification Center configuration file
#

reserve com.apple.system. 0 0 rwr-r-
monitor com.apple.system.timezone /etc/localtime
monitor com.apple.system.info:/etc/hosts /etc/hosts
monitor com.apple.system.info:/etc/services /etc/services
```

### オプション
- `-n` オプション 行番号

```Bash
/etc (461) $ cat -n {syslog,nfs,ftpd}.conf
     1	# Note that flat file logs are now configured in /etc/asl.conf
     2
     3	install.*						@127.0.0.1:32376
     1	#
     2	# nfs.conf: the NFS configuration file
     3	#
     1	# match umask from Mac OS X Server ftpd
     2	umask all 022
/etc (462) $
```

- `-v` オプション タブや改行など画面に表示できない文字を目に見える形で表示する
Manual berkshelf caching on chefspec 

Chefspec 3.2.0 introduced berkshelf integration lately.  However this will decrease the test speed as chefspec will setup and teardown berkshelf all the time. 

Below is a snipped to similar [chefspec#242](https://github.com/sethvargo/chefspec/issues/242) .  But in addition, I removed the vendoring of the cookbook in development.   Here is my [rake task](https://github.com/aespinosa/aspnet_skeleton/blob/master/Rakefile#L9-L13) to do that build:

    task :build do
      File.open("chefignore", "a").write("*aspnet_skeleton*")
      berksfile.install path: "vendor/cookbooks"
      FileUtils.rmdir "vendor/cookbooks/aspnet_skeleton"
    end

This approach has several advantages: [1] chefspec doesn’t need to build the vendored directory everytime rspec is invoked, [2] you can run the test against the source code directory for a fast TDD feedback cycle, and [3]  build and test phases for your CI pipeline can be separated.

Here’s how chefspec consumes the vendored cookbook_path and cookbook-in-development [simultaenously](https://github.com/aespinosa/aspnet_skeleton/blob/master/spec/default_spec.rb#L6):

    RSpec.configure do |config|
      config.cookbook_path = %w(vendor/cookbooks ../)
    end


Original post in http://amespinosa.wordpress.com/2014/02/16/manual-berkshelf-caching-on-chefspec/
ディスク内のパーミッション(アクセス権)を気にせずにファイルシステム全体を検索したい場合


```bash
$ sudo find / -name makewhatis -print
Password:
/usr/libexec/makewhatis
$
```

sudoコマンドを付けずに`find`コマンドを実行すると、権限が与えられていないディレクトリ内をfindコマンドが検索しようとして無数のエラーメッセージが表示される。

## 参考
[入門 Unix for OS X](http://www.oreilly.co.jp/books/9784873116440/)
/tmpがnoexec指定されていてrbenv installなどがコケるとき

`/tmp`が`noexec`でmountされていて`rbenv install`がコケるときは、環境変数`TMPDIR`に別のディレクトリを指定してあげればおk。

----

コケたときのコンソールの出力はこんな感じ。

```shell-session
$ rbenv install 2.1.0
Downloading yaml-0.1.5.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/24f6093c1e840ca5df2eb09291a1dbf1
Installing yaml-0.1.5...

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20140216215447.28528
Results logged to /tmp/ruby-build.20140216215447.28528.log

Last 10 log lines:
yaml-0.1.5/tests/run-scanner.c
yaml-0.1.5/tests/Makefile.am
yaml-0.1.5/tests/Makefile.in
yaml-0.1.5/tests/example-reformatter-alt.c
yaml-0.1.5/tests/run-parser.c
yaml-0.1.5/tests/example-reformatter.c
yaml-0.1.5/tests/example-deconstructor.c
yaml-0.1.5/tests/test-version.c
/tmp/ruby-build.20140216215447.28528/yaml-0.1.5 /tmp/ruby-build.20140216215447.28528 ~
/var/lib/fluentd/.rbenv/plugins/ruby-build/bin/ruby-build: line 416: ./configure: Permission denied

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20140216215447.28528
Results logged to /tmp/ruby-build.20140216215447.28528.log

Last 10 log lines:
yaml-0.1.5/tests/run-scanner.c
yaml-0.1.5/tests/Makefile.am
yaml-0.1.5/tests/Makefile.in
yaml-0.1.5/tests/example-reformatter-alt.c
yaml-0.1.5/tests/run-parser.c
yaml-0.1.5/tests/example-reformatter.c
yaml-0.1.5/tests/example-deconstructor.c
yaml-0.1.5/tests/test-version.c
/tmp/ruby-build.20140216215447.28528/yaml-0.1.5 /tmp/ruby-build.20140216215447.28528 ~
/var/lib/fluentd/.rbenv/plugins/ruby-build/bin/ruby-build: line 416: ./configure: Permission denied
```

`Permission denied`と言ってお亡くなりになるので一瞬考える。
が、mountオプション確認してみると`noexec`指定で`/tmp`がmountされていることに気づく。

```shell-session
# mount | grep /tmp
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime)
```

なのでexecute可能な別のディレクトリ(マウントポイント)を`TMPDIR`として指定する。

```shell-session
$ TMPDIR="${PWD}/tmp" rbenv install 2.1.0
```

これで大丈夫、たぶん。
iTunes Store/Google play storeなどの売上データをAppfigures経由で取ってくるためのgemを作りました

iTunes storeに出しているアプリのインストール数などのデータを、iTunes storeから直接取ってこようと思ったら、（2014/02/16現在）ブラウザからアクセスするか、Javaで作られた取得用のプログラムを使うかのどちらかになります。

自動化を考えた時、前者はかなりわかりづらいJSのからむスクレイピングが必要、後者はJavaの環境を用意する必要があるため、どちらも（それだけのためにやるには）まあまあハードルが高いです。

[Appfigures](http://appfigures.com/)というサービスがあり、登録・設定すると、iTunes storeやGoogle play storeから定期的に自動で売上レポートを取得し、統合的に見ることができます。
そしてこのAppfiguresにはAPIが用意されています。
アクセスするためのgemもあったのですが、deprecatedなバージョンのAPIにしか対応してなかったので、最新のものにアクセスできるgemを作ってみました。
[appfigures_accessor](https://rubygems.org/gems/appfigures_accessor)と言います。

使い方は[README](https://github.com/skuroki/appfigures_accessor/blob/master/README.md)を見てください。
APIは数多く存在しますが、アクセス部分の実装はとりあえず自分に必要なものをいくつかしか行っていません。
ForkとPRは歓迎です。
インラインのコメントから coffeelint の設定を有効/無効化する

インラインのコメントから設定を有効/無効化する機能は、他言語の lint だったら、当たり前の様にあるので、無いはずないだろうと思っても、ドキュメントではどこにも見当たらず、テストコードを見たら、実装されていました。

[test/test_comment_config.coffee on master](https://github.com/clutchski/coffeelint/blob/master/test/test_comment_config.coffee)

```coffeescript
# coffeelint: disable=no_trailing_semicolons
a 'you get a semi-colon';
b 'you get a semi-colon';
# coffeelint: enable=no_trailing_semicolons
c 'everybody gets a semi-colon';
```

a, b は無視されるそうな。

逆も可能で、

```coffeescript
# coffeelint: enable=no_implicit_parens
a 'implicit parens here'
b 'implicit parens', 'also here'
# coffeelint: disable=no_implicit_parens
c 'implicit parens allowed here'
```

今度は、a, b が怒られ、c は無視される。


更に `enable` とだけ言うと、全部 (??) 有効化できる風。

```coffeescript
# coffeelint: disable=no_trailing_semicolons,no_implicit_parens
a 'you get a semi-colon';
b 'you get a semi-colon';
# coffeelint: enable
c 'everybody gets a semi-colon';
```

テストコードは無いですが、きっと `disable` もできるんでしょう。

これの有効範囲がどこまでなのか気になります。見た感じ、一度、有効/無効化した設定は、もう一度逆のことを設定してやらない限り、そのまま引き継がれるっぽいです。

[coffeelint.coffee#171 付近](https://github.com/clutchski/coffeelint/blob/master/src/coffeelint.coffee#L171) で実装されているようで、じっくり読書して理解を深めたいですが、今日は寝るので、今度調査します。
ファイルの保護と共有

# `chmod`コマンドによるパーミッション(アクセス権)の設定

## 全ユーザーから書き込み許可を取り除く
誤ってファイルを変更されないように保護  

```Bash
chmod a-w ファイル名
```


## オーナーである自分だけに書き込み許可を追加する
編集したいにもかかわらず書き込み許可を持たないファイルを所有しており、かつ、他の人びちに対する書き込み許可を変更したくない


```Bash
chmod u+w ファイル名
```

## そのディレクリに対し、自分自身から書き込み許可を取り除く
自分が所有する重要なディレクトリ内に、以後、変更を行わないように保存しておきたい。
間違って内部のファイルを削除してしまったり、不必要なファイルを内部に追加してしまったり、勘違いからファイルの名称を変更してしまったりする不注意を避ける  

```Bash
chmod u-w ディレクトリ名
```

## ディレクトリへの書き込み許可をすべて取り去る
他のユーザーも書き込み許可を持っているようなら次のコマンドを使い、ディレクトリへの書き込み許可をすべて取り去る事ができる

```Bash
chmod a-w ディレクトリ名
```

## 望むパーミッション（アクセス権）そのものを直接設定
自分の作業ディレクトリ内にある全ファイルに対して、自分と自分が属するグループ(g)の利用者たちが読み出しと書き込みを行えるようにしたい場合
ファイル名にワイルドカード(*)を併用して、「対象となるディレクトリ内に存在するものすべて」に対し、一度で同じ設定を指定する

```Bash
chmod ug=rw *
```

## ファイル名を直接指定
半角空白記号で区切って全て列挙する

```Bash
chmod ug=rw ファイルa ファイルb ファイルc
```

## グループ(g)ならびに他(o)のユーザーすべてから、読み出し、書き込み、実行の許可を取り去る
あるディレクトリ内に存在する全ファイルと、そのサブディレクトリに含まれるすべてのものを、自分に与えられているパーミッションはそのまま残し、同じシステムを使っている他のユーザーから保護する
 

```Bash
chmod go-rwx ディレクトリ名
```

同じ処理をもっと簡単に。何も許可を与えないことを意味する。

```Bash
chmod go= ディレクトリ名
```

## ディレクトリのオーナーには全パーミッションを許可し、グループ(g)ならびにその他(o)のユーザーに対しては読み出しと実行の許可だけを与える
あるディレクトリにすべてのユーザーがアクセスできるように設定したい。ただし同じシステムを使っている他のユーザーは、そのディレクトリ内にあるものが読めても、それらに対して名前の変更や削除、追加できないようにしたい。しかし、ディレクトリにはアクセスできるので、そこに含まれているファイル自体のパーミッションに読み書き許可が設定されていると、自分以外のユーザーもそこに含まれているファイルを読んだり変更できたりしてしまうことに注意する。

```Bash
chmod u=rwx,go=rx ディレクトリ名
```
android monkeyrunner 使ってみた

# monkeyrunner とは
* android テストのためのツール
    * 座標指定で UI 制御が可能
* Python で記載したプログラムを使用し、画面遷移の自動テストなどを可能にする
    * 下記コマンドで実行可能

    > "Android SDK の path"/tools/monkeyrunner sampletest.py

# サンプルプログラムの書き方
* monkeyrunner で呼び出す sampletest.py の書き方
* 参考サイト : http://developer.android.com/tools/help/monkeyrunner_concepts.html

```py:sampletest.py
# 使用する monkeyrunner モジュールをインポート
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# デバイスに接続
device = MonkeyRunner.waitForConnection()

# android package をインストール
device.installPackage('myproject/bin/MyApplication.apk')

# package の名前をセット
package = 'com.example.android.myapplication'

# package 内の activity の名前をセット
activity = 'com.example.android.myapplication.MainActivity'

# 起動するアプリの activity の名前をセット
runComponent = package + '/' + activity

# apk の起動
device.startActivity(component=runComponent)

# テストしたい処理(例)
for i in range (1, 5):                    # 下 2 行の処理を 4 回繰り返す
    MonkeyRunner.sleep(5)                 # 5[sec] 停止する
    device.touch(85, 200, "DOWN_AND_UP")  # 座標(85, 200) の位置をタップする

# スクリーンショットを撮る
result = device.takeSnapshot()

# 撮ったスクリーンショットを保存する
result.writeToFile('myproject/shot1.png','png')
```

* 上記の例では、任意のアプリを起動し、指定したポイントを繰り返しタップしている

# 座標の位置特定には
* MonkeyRunner クラスを用いることでボタン押下などのテストが自動化できることはわかった
* しかし、上記のサンプルではタップする座標はあらかじめ把握しておく必要がある
* そこで、タップした座標の位置を知るために MonkeyRecorder というクラスが有用である
* 使用方法は、以下の様な python ファイルを用意しておき、MonkeyRunner と同じように呼び出す

```py:samplerecorder.py
from com.android.monkeyrunner import MonkeyRunner
from com.android.monkeyrunner.recorder import MonkeyRecorder
device = MonkeyRunner.waitForConnection()
MonkeyRecorder.start(device)
```

* 上記ファイルを実行すると以下のように、接続しているデバイスの画面の操作の履歴画面が表示される

![monkeyrecorder_スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/28573/6f87f2a5-5383-a4a8-268b-59c655dbdd6a.png)

* 左側にはデバイス画面が表、右には操作履歴が表示され、操作履歴はタップした位置の座標も表示される
* これを用いて MonkeyRunner を使用する際に知りたい座標の取得が可能となる


# まとめ
* monkeyrunner の MonkeyRunner クラスを使えば、"スイッチの ON/OFF を 1000 回繰り返す" といったようなことも容易に可能となる
* MonkeyRecorder を使用することでデバイスの座標取得なども手軽にできる
アプリ名に変な検索ワードは散りばめない！

初めまして。Qiita初投稿です。よろしくお願いします。

私は大した技術も無いため、あえて上げるとしたら情けない失敗談ばかりなので、
どうせならそれを共有させて頂き、笑いネタにでもしてもらえたらと思います。

第１弾は表題の通りです。

アプリをどのようにしたらDL数が稼げるか、そんなことを調べているとある記事を見つけたのです。

▼App Store SEOを改善する方法(初級者編)
http://www.slideshare.net/searchmanseo/appstore-seo-13848208

こちらの記事を参考にAppNameにそれっぽい単語を散りばめた訳です。
結果、それらのワードをきちんと書き込まないと検索にひっかかりませんでした。
要はそれらの文言をきちんと入力しないと検索にすら引っかからない状態になりました。

てっきり「おすすめアプリ」と入れればそのワードにひっかかるつもりでいたのですが…
何かご助言がありましたら教えて頂けると幸いです。。

★まとめ★
AppNameはアプリ名をそのまま書きましょう。
Circle CIを使ったNode.jsプロジェクトのテスト


話題のCircle CIをNode.jsで試してみる。
[Continuous Integration and Deployment - CircleCI](https://circleci.com/)


### Githubプロジェクトの用意
まず、Githubにプロジェクトを用意。

今回は以下のような最小限のプロジェクトを用意。テストライブラリはMochaを利用。

calc.js : テスト対象

```js
exports.add = function(x, y){
  return x + y;
}
```

test/calc.js : テストスクリプト

```js
var expect = require('expect.js');

describe('calc', function(){
  it('add', function(){
    expect(1+1).to.be(2);
  });
});
```

test/mocha.opts : Mochaのオプションファイル

```
--reporter spec
--ui bdd
--timeout 3000
```


package.json : 依存ライブラリとテストスクリプトの設定を記述

```json
{
  "name": "circle-node",
  "devDependencies": {
    "mocha": "~1.17.1",
    "expect.js": "~0.2.0"
  },
  "scripts": {
    "test": "./node_modules/.bin/mocha"
  }
}

```

### Circle CIの画面上の操作

Circle CIは２週間であればトライアルで無料で使える。

プロジェクトの追加画面から対象のプロジェクトの"Setup"ボタンをクリックするとさっそくビルドが始まる。

![gaishimo_-_CircleCI.png](https://qiita-image-store.s3.amazonaws.com/0/10393/842fcf86-3e6f-6f93-7d14-083cd133adf7.png "gaishimo_-_CircleCI.png")


しばらくすると、、、


テストが無事、実行された！

とてもあっけなく。。

![_3_-_gaishimo_circle-node_-_CircleCI.png](https://qiita-image-store.s3.amazonaws.com/0/10393/b1fc0faf-3f39-042f-68bb-9a152ed41e2b.png "_3_-_gaishimo_circle-node_-_CircleCI.png")


package.json で scripts.test の記述をしておけば、Circle CIが自動で判断してくれてそれを実行してくれる。また、npm install も勝手にやってくれるので特に設定をする必要はない。


### circle.yml
もしも細かな独自設定が必要になった場合は、circle.ymlファイルに記述する。
[Configuring CircleCI - CircleCI](https://circleci.com/docs/configuration)


例えばNode.jsのバージョンを指定する場合は以下のように記述する。

```
machine:
  node:
    version: 0.11.11
```
Windowsのプロキシ情報取得について


少し前にハマったのでメモ。
何でもVistaからプロキシの設定箇所が増えたらしい。

#### 今まで
* インターネットオプション

だけだったのが

#### Vista以降
* netsh コマンド

でも設定できるようになった。
しかも、インターネットオプションとは別扱いらしい。
コマンドプロンプト上でのnetsh上の設定確認方法は

```dos
netsh winhttp show proxy
```
となる。



今までJavaでHttpConnectionクラス等を使用して外部と通信をする時にシステムに登録されているプロキシ情報を使用する場合は
接続前に環境設定でシステムのプロキシ設定の使用を有効化していれば、Windowsの場合はインターネットオプションに設定されているプロキシ設定を自動的に取得・使用してくれる。


```java:システム環境設定使用の有効化
System.setProperty("java.net.useSystemProxies", "true")
```

が、netshコマンドで設定された値は上記では取得出来ない模様。。。

対応として、今のところ以下の物を確認出来ているが
正しい方法が他に有るかどうかは未確認。。。

* JNIを使用する
* Runtimeでnetshコマンドを叩いて文字列をスクレイピング

JNIについては、工数の関係上作成出来なかったが市販のライブラリにて取得出来る事は確認出来ている。
結局、今回はRuntimeの方を実装したけど正式な方法とかあるのかどうか、、、
Java8だったら`java.net.useSystemProxies`で取得できるようになってるのかな？
ファイルやディスクの容量計算

`du` (disk usage)
ファイル容量を調べることができる

```Bash
$ du Documents/Outline.doc
300 Documents/Outline.doc 
```

容量は512バイトを1ブロックとしてブロック単位に表示  
上記の場合、約300ブロック使用しているということ。

- `-s`オプション  
ディレクトリが使っている総容量だけが知りたい場合。要約(summarize)を示す。  
- `-h`オプション  
人間に取って読みやすい形式で書きだす。
  
  
```Bash
$ du -s /Library/* | sort -rn  
```

使用量が大きなディレクトリから順番に表示させることができる  

```Bash
$ du -s /Library/* | sort -rn | head  
```
最大使用量の上位10個だけを表示させることができる


## ディスク空き容量の計算
`df -h` ディスクに対して空き容量を計算したい  
(`-h`オプションはより人間に見やすい形式で書き出させるため)

```bash
$ df -h
Filesystem      Size   Used  Avail Capacity  iused   ifree %iused  Mounted on
/dev/disk0s2   233Gi  228Gi  4.3Gi    99% 59952046 1117394   98%   /
devfs          192Ki  192Ki    0Bi   100%      664       0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%        0       0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%        0       0  100%   /home
/dev/disk2s2    39Mi   28Mi   10Mi    74%     7285    2625   74%   /Volumes/Sublime Text
```

|カラム名|説明|
|:---|:---|
|Filesystem|ボリュームに付けられたUnixデバイス名|
Size|ディスク容量の総合計
Used|現在使用中のディスク容量
Avali|利用可能な空き容量
Capacity|現在使用中のディスク容量が全体に対して占める割合。使用率が100％になっているdevfsなどは通常のディスクではないUnixデバイスなので気にする必要はない。注意すべきは起動ディスク（ここでは/dev/disk2s3）の使用率。
Mounted on|使っているOS Xにマウントされたボリュームを参照する際に使うパス名が表示される

- `-h` オプション  容量計算において、コンピュータ数値上、正確に表示できる2で割る方式
- `-H` オプション  もっと普段の生活になじみ深い10で割る方式を使って計算し表示
- `-m` オプション  1MBというブロックの単位でディスクの情報を表示。devfsといったOS上の小さなパーティションはすべて、値が0に切り捨てられて示される。

## ファイルのパーミッション（アクセス権）
> 「ディレクトリは、内部に存在している全ファイルの管理情報を記録しているファイルにすぎない」と考えるのです。  
ファイルを追加したりファイルの名前を変更したりファイルを削除したりといった操作は、つまるところ、ディレクトリが記録している内容を変更する操作となるわけです。もしディレクトリに書き込みが許されていなければ、ディレクトリが記録している内容を変更できなくなってしまうのです。

## 参考
[入門 Unix for OSX](http://www.oreilly.co.jp/books/9784873116440/)
SechaTouchアプリにbower経由でカスタムコンポーネントを読み込む


## 前提
* [bower](http://bower.io/)がインストール済み
* [senchacmd](http://www.sencha.com/products/sencha-cmd/download)がインストール済み
* [sencha sdk](http://www.sencha.com/products/touch/)がダウンロード済み

## 新規アプリ作成

```bash
$ mkdir ${appname}
$ sencha -sdk {senchatouch_skd_path} generate app ${appname} ./
```

## .bowerrc作成

追加されたコンポーネントが`ux`フォルダーに入るように`.bowerrc`を追加

```bash
$ vi .bowerrc
```

```.bowerrc
{
  "directory": "ux"
}
```

## bower.jsonの作成

```bash
$ bower init
```

## インストール

※ 今回は、[sencha-list-scroll-reset](https://github.com/kashiro/sencha-list-scroll-reset)を追加するとして話を進めます。

```bash
bower install --save sencha-list-scroll-reset
```

これで`ux`フォルダー内にインストールコンポーネントが追加されていきます

```
├── .bowerrc
├── bower.json
└── ux
    └── sencha-list-scroll-reset
        ├── .bower.json
        └── bower-dist
            └── ux
                └── touch
                    └── ListScrollReset.js
```

### アプリ側で利用する設定

`app.js`に読み込んだアプリのpathを設定する

```bash
$ vi app/app.js
```

```app.js
Ext.Loader.setConfig ({
    enabled: true ,
    paths: {
        'Ext.ux.touch.ListScrollReset': 'ux/touch/ListScrollReset.js'
    }
});
```

### 読み込み

コンポーネントを利用するクラスで`requires`指定に追加する

```Main.js
'use strict';
Ext.define('SenchaListScrollReset.view.Main', {
    extend: 'Ext.Panel',
    xtype: 'main',
    requires: [
        'Ext.Toolbar',
        'Ext.ux.touch.ListScrollReset', // ← 追加
        'Ext.dataview.List',
        'Ext.data.Store'
    ],
```

### ビルド設定

上記設定のままだとビルドコマンドを実行すると下記エラーがでる

```bash
Failed to find file for Ext.ux.touch.ListScrollReset
```

ビルド用にpathを設定する

```bash
$ vi .sencha/app/sencha.cfg
```

最後に`,ux`を追加する

```sencha.cfg
app.classpath=${app.dir}/app.js,${app.dir}/app,ux
```
Hamlの基礎知識


初めてHamlのファイルを見ると結構とまどいますよね。
でも慣れるとすっごく楽に書けるようになりそう！
ということで、基本の基本だけですが、書き方をメモしておきますφ(..)

###基礎知識
* ``!!!`` DOCTYPEの指定
* ``%`` 開始タグと終了タグ
* \<div>は省略可
* ``#`` id
* ``.`` class
* ``-`` 表示はしないがRubyでなにかしらの処理をする
* ``=`` ``#{}`` Rubyの処理結果を表示
* ``/`` コメント

###例
上が、上記の基礎知識を使ってhamlで書いたもの、下がそれをhtmlに変換したものです。

```haml
!!!
%html
  %body
    #hoge.piyo
      %p hello
      - X = 100
      %p= x
      %p １足す１は #{1 + 1}
  / コメント
```
※字下げできちんと親子関係を指定しないとエラーになります。

↓↓↓これをhtmlで見てみると

```html
<!DOCTYPE html>
<html>
  <body>
    <div class="piyo" id="hoge"></div>
      <p>hello</p>
      <p>100</p>
      <p>１足す１は 2</p>
  </body>
  <!-- コメント -->
</html>
```

どうでしょうか？？
今までerbを使っていると慣れるまでかなり抵抗があって読みにくいですが、
実際に使ってみると、その楽チンさに驚きます！！！
覚えることも意外と少ないので、積極的に取り入れたいですね(･∀･)
UnityをC#で超入門してみる #0　超目次

#UnityをC#で超入門してみる #0　超目次
UnityをC#で超入門してみる の目次をこちらに分離しました。

## #1.Unity入門の章
http://qiita.com/hiroyuki_hon/items/0718a50e6569b6c5037a

## #2.ゲームオブジェクトの章
http://qiita.com/hiroyuki_hon/items/5211a1853647eee38d51

## #3.計算の章
http://qiita.com/hiroyuki_hon/items/3326206dcedb4e5013d4

## #4.GUIの章
http://qiita.com/hiroyuki_hon/items/af0a52c1cb9e856f32b2

## #5.時間と入力の章
http://qiita.com/hiroyuki_hon/items/17e573842faf39bb3d21

#目次俯瞰
### #1.Unity入門の章
http://qiita.com/hiroyuki_hon/items/0718a50e6569b6c5037a
・はじめに
・変数
・メソッド
・クラス

### #2.ゲームオブジェクトの章
http://qiita.com/hiroyuki_hon/items/5211a1853647eee38d51
・カメラ
・ゲームオブジェクト

### #3.計算の章
http://qiita.com/hiroyuki_hon/items/3326206dcedb4e5013d4
・C#の文法
・mathfクラス

### #4.GUIの章
http://qiita.com/hiroyuki_hon/items/af0a52c1cb9e856f32b2
・GUI
・シーン遷移

### #5.時間と入力の章
http://qiita.com/hiroyuki_hon/items/17e573842faf39bb3d21
・時間
・入力


#目次全体

## #1　Unity入門の章
http://qiita.com/hiroyuki_hon/items/0718a50e6569b6c5037a
　はじめに・変数・メソッド・クラス

####はじめに
　Unityの入門書籍について
　Unityでスクリプトを書いてみよう　Hello World!
　コメントアウトをしよう

####変数
　変数を使ってみよう
　コンポーネントを変数の型として使おう
　Inspectorを使って変数を操作してみよう(1)(2)

####メソッド
　メソッドを使ってみよう
　メソッドの引数を取ろう
　メソッドの呼び出し時にウェイトをかけてみよう

####クラス
　クラスを作ってみよう
　ある時に呼ばれる、呼ばれ続ける関数達を知ろう(オーバーライド関数)
　void Updateを使って継続的にプログラムを再生しよう
　衝突判定をみてみよう
　トリガーを処理しよう


## #2　ゲームオブジェクトの章
http://qiita.com/hiroyuki_hon/items/5211a1853647eee38d51
　カメラ・移動・変形・削除・色・やりとり


####カメラ
　カメラを調整しよう
　カメラでターゲットを追ってみよう

####ゲームオブジェクト

　ゲームオブジェクトの情報を取得しよう
　スクリプトの有効、無効を設定してみよう
　ゲームオブジェクトのタグをチェックしよう

　Find()でゲームオブジェクトを取得しよう
　スクリプトでコンポーネントを追加しよう
　スクリプトからプリミティブオブジェクトを生成しよう
　　違うプリミティブオブジェクトを表示してみよう
　スクリプトでオブジェクトのtransformを取得しよう
　　個別にx,y,zの値を取得しよう

　移動させてみよう
　Cubeを回転させ、Inspectorから数値を変更しよう
　ゲームオブジェクトを削除しよう
　　自分自身（スクリプト）を削除しよう
　　一定時間後に削除されるようにしよう

　スクリプト色を付けよう
　　色をRGBAで指定しよう
　　ランダムに色をつけてみよう
　他のオブジェクトとのやりとりについて
　自身と違うオブジェクトを取得して操作しよう

　インスタンスを生成しよう
　　nameについて
　ここまでをまとめ
　ボタンクリックでインスタンスを生成しよう
　画面外に出たインスタンスは削除しよう
　　WebCamTextureを使ってみよう

　ゲームオブジェクトを無限に生成しよう
　ゲームオブジェクトを回転させよう
　ボタン押下でゲームオブジェクトを回転させよう

　x秒後にゲームオブジェクトを破棄しよう
　カラーを指定してマテリアルを生成しよう
　プレハブをスクリプトから生成しよう
　触れたものを破壊するオブジェクトを作ろう

## #3　計算の章
http://qiita.com/hiroyuki_hon/items/3326206dcedb4e5013d4
　演算・制御・配列・ランダム・比較

####C#の文法

　演算、制御してみよう
　　値が同じかを調べる
　配列を試してみよう
　　配列からランダムに取りだそう
　時間を表示しよう

####mathfクラス

　ランダムを生成しよう
　べき乗（指数）を計算しよう
　円周率をもとめよう
　大きい方を返す、小さい方を返す


## #4 GUIの章
http://qiita.com/hiroyuki_hon/items/af0a52c1cb9e856f32b2

####GUI
　ラベルで文字列を表示しよう
　座標をRectクラスから指定しよう

　GUITextに文字列を代入しよう
　GUITextureを表示しよう
　GUITextureについてのメモ

####シーン遷移
　シーンを移動しよう
　シーン間を移動をするためのボタンを作ろう


## #5 時間と入力の章
http://qiita.com/hiroyuki_hon/items/17e573842faf39bb3d21

####時間
　時間を取得してみよう
　時間を表示しよう
　時間に沿って動かしてみよう
　一時停止してみよう
　時間に沿って色を変えてみよう

####入力
　入力をしてみよう
　入力でオブジェクトを動かしてみよう
　入力でオブジェクトを生成しよう
　入力でメソッドを呼びだそう
　タッチした場所の座標を取得しよう
　//レイを打とう

#つづきます
## #1.Unity入門の章
http://qiita.com/hiroyuki_hon/items/0718a50e6569b6c5037a
GoogleAPIでTexを使う。


`<div class='tex'>`なタグをすべて、GoogleAPIで数式画像を生成し、imgタグに置換するコードです。
`<div class='tex'>`なタグの中身はTexのコード。
jQueryのeachメソッド使うことで簡単に画像に置換できるのは便利ですね...。

```html:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  </head>
  <body>

<div class='tex'>
f(x)=\int_0^{x}g(t)\,dt
</div>

<div class='tex'>
\frac{d^2\phi(x)}{dx^2} = 
\frac{2m}{\hbar^2} \bigl\{ \frac{1}{2}m\omega^2 x^2 - E \bigr\} \phi(x)
</div>

<script type='text/javascript'>
$('.tex').each(function(i,obj){
  var base = 'http://chart.apis.google.com/chart?cht=tx&chl=';
  var url = base + encodeURIComponent($(obj).html());
  $('<img>').attr('src',url).insertAfter(obj);
  $(obj).remove();
});
</script>

  </body>
</html>
```
Gnuplot で Terminal type set to 'unknown' と出力されてグラフが表示されないときは

Ubuntu13.10 で Gnuplot をインストールしたら、起動はするもののグラフを描画しようと思ってもウィンドウが開かない。

起動するときに `Terminal type set to 'unknown'` と表示されるのでこれが原因のようだ。

解決策は gnuplot-x11 をインストールするだけでよい。

```bash
$ sudo apt-get install gnuplot-x11
```
Readable#pipe の豆知識


Node の Stream 周りでちょっと面白い問題に行き当たったので、メモしておきます。

https://github.com/Bockit/cacheify/issues/6

簡略化すると・・・

```
someStream.once('error', function (err) {
  console.log('You\'ve got an error:', err);
});
someStream.pipe(otherStream);
```

としていて、`someStream.emit('error', err);` すると、stream error が throw されるという問題です。

`pipe` は他にエラーハンドラーが登録されていないと stream error を throw するのですが、`once`, `pipe` の順番が直接の原因でした。

原理は以下のような感じです。

1. `once` がエラーハンドラーを登録する。
2. `pipe` が内部でエラーハンドラーを登録する。
3. `error` イベントが `emit` される。
4. 1. のエラーハンドラーがまず実行される。
5. `once` なので、1. のエラーハンドラーが削除される。
6. 2. で登録されたエラーハンドラーが他のエラーハンドラーの有無をチェックするが、見つからないので stream error を throw する。

解決するには、以下のどちらかです。

- `once` のかわりに `on` を使う。
- `pipe`, `once` の順番にする。2. 1. 3. 6. 4. 5. の順番で実行され、6. ではまだ 1. のエラーハンドラーが登録されているため stream error が起きません。

Stream2 の `Readable` や `Transform` を使っていれば `error` が複数回 `emit` されることはないようですが、Stream の実装によっては複数回 `emit` されるので、`on` を使っておくのが無難なんですかね。
rubyでtwitter/json-streamを使用し、Streaming APIからmongoDBに保存


TwitterのStreaming APIを使用するにあたって、取得したツイートすべてをmongoDBに保存するにはtwitter/json-streamを使うのが簡単そうだったので…

```ruby:main.rb
# encoding: utf-8
#! ruby -Ku

require "rubygems"
require "bundler"
require "twitter/json_stream"
require "json"
require "mongo"
Bundler.require

#.envファイルより環境変数load
Dotenv.load

#mongodb接続用定義
db = Mongo::Connection.from_uri(ENV["MONGODB_URL"]).db(ENV["MONGODB_DB"])
#コレクション定義
@items = db.collection(ENV["MONGODB_COLLECTION"])

#EventMachine
EM.run do
  #Twitter Streaming APIのsampleStremの定義
  samplestream = Twitter::JSONStream.connect(
    :host => "stream.twitter.com",          #接続ホスト
    :path => "/1.1/statuses/sample.json",   #接続ホスト以降のURL
    :ssl => true,                           #SSL通信
    :oauth => {                             #oauth認証情報
      :consumer_key => ENV["CONSUMER_KEY"],
      :consumer_secret => ENV["CONSUMER_SECRET"],
      :access_key => ENV["ACCESS_KEY"],
      :access_secret => ENV["ACCESS_SECRET"]
    }
  )

  #sampleStreamより取得したアイテムをmongodbへ挿入
  samplestream.each_item do |item|
    tweet = JSON.parse(item)  #ツイートの内容をjson形式に変換
    if tweet["lang"] == "ja"  #日本語ツイートのみ取得対象とする
      @items.insert(tweet)    #json形式に変換したツイートをmongodbへ挿入
    end
  end
end
```

Gemfileに使用するgemを記載

```ruby:Gemfile
ruby "2.1.0"

source "https://rubygems.org"

gem "twitter-stream"
gem "json"
gem "mongo"
gem "bson"
gem "bson_ext"
gem "dotenv"
```

.envファイルにはmongoDB接続及びTwitterの認証キーをセットする

```.env
#mongoDB
MONGODB_URL = "mongodb://<uid>:<password>@localhost/db_name"
MONGODB_DB = "db_name"
MONGODB_COLLECTION = "collection_name"

#Twitter
CONSUMER_KEY = "xxxxxxxx"
CONSUMER_SECRET = "xxxxxxxx"
ACCESS_KEY = "xxxxxxxx"
ACCESS_SECRET = "xxxxxxxx"
```

実行する時は以下のコマンド
`bundle install`
`bundle exec ruby main.rb`
IDLEで以前に入力したコマンドを使用する

Pythonでコードをちょっとテストしたい場合、インストール時についてくるIDLEを使用しているのですが、ショートカットが覚えられず毎回困っているので覚え書き。

このようなコードを入力していると、yieldは履歴から編集したほうが早い。。

```py:yield_test.py
def yield_test():
    yield "Number one"
    yield "Number two"
    yield "Number three"
```

**ショートカット**
Alt+P ： 履歴を戻る
Alt+N ： 履歴を進む
Tomcatをforceオプションで強制停止する


shutdown.shを使用してTomcatの停止をすると、停止がうまくいかない場合がある。
確実に停止させるには、shutdown.shに「-force」をつけると、強制停止(kill)することができる。

### 強制停止の仕組み

Tomcat起動時に自身のプロセスIDをファイルに書き込み、停止時にファイルに記載されたプロセスをkillするという仕組みになっている。

### 環境変数 CATALINA_PIDを設定する

forceオプションを使用するには、プロセスIDを書き込むファイルを環境変数「CATALINA_PID」で指定しておく必要がある。

CATALINA_PIDは、「CATALINA_HOME/bin/setenv.sh」に記載するのがよい。
(setenv.shはデフォルトでは存在しないためなければ作成する。)

```setenv.sh
CATALINA_PID=/var/run/catalina.pid
```

### Tomcatを起動する

Tomcatの起動は通常と同じ。

```
[vagrant@localhost bin]$ sudo ./startup.sh 
Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.50
Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.50
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.50/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/apache-tomcat-7.0.50/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.50/bin/tomcat-juli.jar
Using CATALINA_PID:    /var/run/catalina.pid
```

プロセスIDが、catalina.pidに記録されている。

```
[vagrant@localhost bin]$ more /var/run/catalina.pid 
2639
```

### Tomcatを停止する

Tomcatの停止時には、「-force」オプションを付ける。

```
[vagrant@localhost bin]$ sudo ./shutdown.sh -force
Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.50
Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.50
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.50/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/apache-tomcat-7.0.50/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.50/bin/tomcat-juli.jar
Using CATALINA_PID:    /var/run/catalina.pid
```

最後の行で、catalina.pidに記載されたプロセスが強制killされている。
Androidのアプリ開発中にsqlite3のデータをPCで確認する方法

開発中のアプリでのみ利用出来ます。
AndroidManifest.xmlのandroid:debuggableをtrueにして下さい。

アプリのパッケージからSDカードにデータを移す

```shell-session
adb -d shell "run-as パッケージ名 cat /data/data/パッケージ名/databases/データベース名.db > /sdcard/app.db"
```

コピーしたデータをパソコンにもってくる

```shell-session
adb pull /sdcard/app.db
```

後はsqlite3を使ってdbにログインし、SQLを実行してデータを参照する事ができます

```shell-session
sqlite3 app.db
```
Cocos2d-x + Android でAdMobを表示するメモ


>参考：
>http://android.roof-balcony.com/admob/admob-set/
>http://kumacoro.blogspot.jp/2012/11/android-sdk-imageview.html
>http://techbooster.org/android/ui/13182/
>http://ohwhsmm7.blog28.fc2.com/blog-entry-380.html
>http://www.cocos2d-x.org/forums/6/topics/13233
>http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

ソースのみ（AdMobに関係するところだけ）。

>AdMobのSDKなどはあらかじめ設定しておくこと。

```java:
public class MyGame extends Cocos2dxActivity {
    private WindowManager wm;
	private AdView adView;

    private static Cocos2dxActivity me = null;

    public static final String AD_APPID = "xxxxxxxxxxxxxxxx";  //AdMobのID

    protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		me = this;
		
        try{
            adView = new AdView(me.getApplicationContext());
    		adView.setAdUnitId(AD_APPID);
    		adView.setAdSize(AdSize.BANNER);
            
//    		AdRequest adRequest = new AdRequest.Builder().build();  // 実際にストアにだすとき用
    		AdRequest adRequest = new AdRequest.Builder()           // For DEBUG
    			.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)        // All emulators
    			//.addTestDevice("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")  // テスト用実機のMD5値（？）
    			.build();
    		adView.loadAd(adRequest);

    		// 重ね合わせするViewの設定を行う
    	    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();  
    	    layoutParams.gravity = Gravity.TOP | Gravity.CENTER;
    	    layoutParams.x       = 0; // 表示位置 x  
    	    layoutParams.y       = 0; // 表示位置 y  
    	    layoutParams.width   = WindowManager.LayoutParams.WRAP_CONTENT;
    	    layoutParams.height  = WindowManager.LayoutParams.WRAP_CONTENT;
    	    layoutParams.type    = WindowManager.LayoutParams.TYPE_TOAST;  // ゲーム画面より前面に表示
    	    layoutParams.flags   = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;  // 自分以外のところがタッチされたとき、背後のビューにタッチイベントを渡す。
             
            // WindowManagerを取得する
            wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
            // WindowManagerにAdMobのビューを追加する。
            wm.addView(adView, layoutParams);  

        }catch (Exception e) {
            // エラーログでも吐いとく。
        }
    }
    
    @Override
    public void onPause() {
      adView.pause();
      super.onPause();
    }

    @Override
    public void onResume() {
      super.onResume();
      adView.resume();
    }

    @Override
    public void onDestroy() {
    	// サービスが破棄されるときには重ね合わせしていたViewを削除する
        wm.removeView(adView);

    	adView.destroy();

    	super.onDestroy();
    }
}
```
CentOS6.4にmemcachedをインストールしPHPで利用できるようにするまで

CentOS6.4にmemcachedをインストールし、phpで利用できるまで。

最初に、yumパッケージにはmemcachedが入っていなかったので、rpmを追加

```shell-session
rpm -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
```
memcachedの追加

```shell-session
yum install memcached
```

またpeclでmemcacheをインストールする際に必要となるパッケージを追加

```shell-session
yum install php-pecl-memcached
yum install gcc
yum install automake
yum install autoconf
yum install libtool
yum install make
yum install zlib-devel
```

また、peclでmemcacheを入れる際に、warning出たので回避のためre2c追加

```shell-session
cd /usr/local/src/
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

#指定して使用するようにデフォルトは無効とする
vi /etc/yum.repos.d/rpmforge.repo

# 設定のenabledを0に
enabled = 0
```
re2cインストール

```shell-session
yum --enablerepo=rpmforge install re2c
```

memcacheインストール

```shell-session
pecl install memcache
```

起動設定

```shell-session
/etc/init.d/memcached start
chkconfig memcached on
```

これで、phpでmemcacheを利用出来るようになりました。

```shell-session
# php -i | grep memcache

/etc/php.d/memcached.ini,
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => standard => standard
memcache.max_failover_attempts => 20 => 20
memcached
memcached support => enabled
libmemcached version => 0.31
Registered save handlers => files user memcache memcached
```

後は環境に合わせて設定の変更を行なう。
Ractive.js で ハッシュをリスト展開して表示するベストプラクティスを教えて下さい


[Ractive.js](http://www.ractivejs.org/)のハッシュをリストに展開して表示するのはどうするのがスマートなんだろうか？

【追記】tekkoc さんに正当な方法を教えてもらいました。 tekkoc さんのコメントを参照ください(2014.02.14)

```html
<!doctype html>
<head>
<title>Ractive.js - hash to list</title>
<script src="../bower_components/ractive/Ractive.js"></script>
</head>
<body>

<main id="main">
<script id="template" type="text/ractive">
    <h2>ハッシュのリスト表示</h2>
    <ul>
    {{# toList(hash) }}
        <li>
            <span style="font-style: italic;">{{.}}</span>
            :
            <span style="font-weight: bold;">{{hash[.]}}</span>
        </li>
    {{/ end of hash}}
    
    {{^ toList(hash) }}
        <h4>no list :(</h4>
    {{/ end of hash}}
    </ul>
</script>
</main>

<script>
var ractive = new Ractive({
    el: 'main'
  , template: '#template'
  , data: {
        hash: {
            a: 'AA'
          , b: 'BB'
          , c: 'CC'
        }
      , toList: function (hash) {
            return Object.keys(hash)
        }
    }
})
</script>

</body>
```

これでも ハッシュのキーと値をリスト表示できるし、ハッシュの値を変更すれば、リスト表示も変わるようになるけど、正当なやり方なんだろうか？
Linuxでdummy net driverを使った仮想ブリッジを複数作る方法

dummy net driverを使った仮想ブリッジを複数作る方法のメモ。
[Linuxで物理NICを使わずに仮想ブリッジを作る方法](http://qiita.com/mazgi/items/c81857af3cbddd73e7d2)の続きです。

----

_※以下はGentoo Linuxでの方法なので各ディストリビューションに合わせた読み替えが必要です。_

前回([Linuxで物理NICを使わずに仮想ブリッジを作る方法](http://qiita.com/mazgi/items/c81857af3cbddd73e7d2))のように、`CONFIG_DUMMY`が有効なカーネルで、

```shell-session
[root@TALISKER] # zgrep CONFIG_DUMMY\= /proc/config.gz
CONFIG_DUMMY=m
[root@TALISKER] # modprobe dummy
[root@TALISKER] # lsmod | grep -i dummy
dummy                   1997  0 
```

こんなsymlinkを張って、

```shell-session
[root@TALISKER] # ls -al /etc/init.d/net.[dummy,br]*
lrwxrwxrwx 1 root root 6 Feb 16 13:05 /etc/init.d/net.br0forLXC -> net.lo*
lrwxrwxrwx 1 root root 6 Feb 16 13:10 /etc/init.d/net.br1forVPN -> net.lo*
lrwxrwxrwx 1 root root 6 Feb 16 13:18 /etc/init.d/net.dummy0 -> net.lo*
lrwxrwxrwx 1 root root 6 Feb 16 13:18 /etc/init.d/net.dummy1 -> net.lo*
```

こんなネットワーク設定を書けば、

```shell-session
[root@TALISKER] # grep -E '(dummy|br[0-9]for)' /etc/conf.d/net
config_dummy0=(null)
bridge_br0forLXC="dummy0"
config_br0forLXC="172.30.0.1/23"
config_dummy1=(null)
bridge_br1forVPN="dummy1"
config_br1forVPN="172.30.2.1/23"
```

物理NICを節約しつつ仮想ブリッジが作れます。

```shell-session
[root@TALISKER] # /etc/init.d/net.br0forLXC start
 * Bringing up interface br0forLXC
 *   Destroying bridge br0forLXC ...                                      [ ok ]
 *   Creating bridge br0forLXC ...
 *   Adding ports to br0forLXC
 *     dummy0 ...                                                         [ ok ]
 *   172.30.0.1/23 ...                                                    [ ok ]
```

が、しかし、2つ目以降の仮想ブリッジでエラーになってしまいます。

```shell-session
[root@TALISKER] # /etc/init.d/net.br1forVPN start
 * Bringing up interface br1forVPN
 *   Creating bridge br1forVPN ...
 *   Adding ports to br1forVPN
 *     dummy1 ...
 *     Cannot add non-existent interface dummy1 to br1forVPN
 * ERROR: net.br1forVPN failed to start
```

そんなときは、モジュールを一回unloadして、 `numdummies=<num>` というオプションを指定してloadしてあげればいいらしいです。

```shell-session
[root@TALISKER] # modprobe -r dummy
[root@TALISKER] # modprobe dummy numdummies=2
[root@TALISKER] # /etc/init.d/net.br1forVPN start
 * Bringing up interface br1forVPN
 *   Destroying bridge br1forVPN ...                                      [ ok ]
 *   Creating bridge br1forVPN ...
 *   Adding ports to br1forVPN
 *     dummy1 ...                                                         [ ok ]
 *   172.30.2.1/23 ...                                                    [ ok ]
```

で、その設定は `/etc/conf.d/modules` に書いとけば次回起動から適用されるらしいです。
(Gentoo Linuxの場合)

```shell-session
[root@TALISKER] # tail -3 /etc/conf.d/modules
# Dummy NICs
modules="dummy"
module_dummy_args="numdummies=8"
```
CentOSにrbenvでruby2.1.0インストール, あとnginxも。

最小構成のVMに色々いれて遊ぶ。

# VM環境
- CentOS 6.5
- ネットワーク設定以外はまっさら。

# やること
1. rubyインストール
2. nginxインストール

rubyはせっかくなので流行り(?)のrbenvでバージョン管理する。
コマンドはすべて一般ユーザー（rootじゃない）でやることを想定。

## rbenvをいれてruby2.1.0をインストール

とりあえずコンパイルにgccが必要。あとrbenvを落としてくるのにgitが必要。
vimは好きで入れてる。

```console
$ sudo yum -y install gcc git vim
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

.bash_profileの設定を読み込む

```console
$ exec $SHELL -l
```

次にrbenvにruby-buildプラグインを入れる。あとrubyコンパイル準備。

```console
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ sudo yum -y install libyaml libyaml-devel zlib zlib-devel readline readline-devel openssl openssl-devel libxml2 libxml2-devel libxslt libxslt-devel
```

いよいよruby2.1.0入れるよ。長いので気長に待つ。

```console
$ rbenv install 2.1.0
$ rbenv rehash
$ rbenv global 2.1.0
```

## nginxをインストール

nginxのインストールと80番ポートをあける。

```console
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo yum install nginx
$ sudo vi /etc/sysconfig/iptables #80番ポートをあける
$ sudo /etc/init.d/iptables restart
```

## とりあえずglobalのgemにbundlerだけ入れとく。
こうしておけば、あとはプロジェクトごとにbundle initして、bundle install --path vendor/bundle的なことをすればglobalのgemを汚さないで済む。

```console
$ rbenv exec gem install bundler
$ rbenv rehash
```


# 試しにsinatraとsqlite3でも入れて簡易APIサーバーたてる準備（だけ）やってみる

ほげほげと調べたところ、nginx + unicornの組み合わせが良いらしいのでとりあえずunicornも入れとく。
（どうせここで書くのは準備だけ...）

```console
$ sudo yum install -y sqlite-devel
$ mkdir ~/project_name
$ cd ~/project_name
$ bundle init
$ vim Gemfile
gem "sqlite3"
gem "sinatra"
gem "unicorn"

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

こんな感じでrubyプロジェクトがんがん作っていける環境ができたよ！
Safari Extensionの通信


ややこしい上に[公式ドキュメント](https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW1)では分かりにくいし、ネット上にも情報が少ないのでメモ。

間違っていたら指摘お願いします。

#1.PopOver編

##popoverが呼び出される際に起こるイベントのリスナー

```javascript
//popover.html
safari.application.addEventListener("popover", functionName, true);
```

popoverのHTMLに記述。popoverのHTMLに関数を置く


##popover内からglobalページにアクセスする

```javascript
//popover.html
safari.extension.globalPage.contentWindow.hoge();
```

hoge();はglobalページ内の関数。引数や戻り値の設定も可。

##popoverを呼び出す

```javascript
//global.html
safari.extension.toolbarItems[i].showPopover();
```

globalページなどで呼び出す。
iはボタンの配列。(ボタンが1個なら0)
popoverのコンテンツをglobalでダイナミックに作る場合も、最後にこれを叩く。


#2.Message編

##injectからglobalへ

```javascript
//inject.js
safari.self.tab.dispatchMessage(name,hoge);
```

nameはmessageの名前。
hogeは送信する変数。


```javascript
//global.html
function huga(e){
	console.log(e.message);
	console.log(e.name);
}
safari.application.addEventListener("message",huga, false);
```

hugaは関数名。e.messageで渡された変数を受信。
e.nameでmessageの名前を参照。

##globalからinjectへ

```javascript
//global.html
safari.application.activeBrowserWindow.activeTab.page.dispatchMessage(name,hoge);
```

nameはmessageの名前。
hogeは送信する変数。

```javascript
//inject.js
safari.self.addEventListener("message",huga,false);
```

hugaは関数名。
Pimple 1.xと2.xの違い

Pimple 2.xではshare()メソッドが削除され、サービスがデフォルトで共有されるようになった。

SilexなどPimpleに依存しているプログラムは、アップデートの際に注意が必要。

ただし修正は（たぶん）簡単。

# Pimple 1.xの場合

```php
$services = new Pimple();

// デフォルトではキーにアクセスするたび違うインスタンスが返却される.
$services['default'] = function ($services) {
    return new \stdClass();
};
var_dump($services['default'] === $services['default']); // false

// share()でサービス定義をラップすると、キーにアクセスするたび同じインスタンスが返却される.
$services['shared'] = $services->share(function ($services) {
    return new \stdClass();
});
var_dump($services['shared'] === $services['shared']); // true
```

# Pimple 2.xの場合

```php
$services = new Pimple();

// デフォルトではキーにアクセスするたび同じインスタンスが返却される.
$services['default'] = function ($services) {
    return new \stdClass();
};
var_dump($services['default'] === $services['default']); // true

// factory()でサービス定義をラップすると、キーにアクセスするたび違うインスタンスが返却される.
$services['monopolized'] = $services->factory(function ($services) {
    return new \stdClass();
});
var_dump($services['monopolized'] === $services['monopolized']); // false
```
"Railsのユーザ認証deviseを用いた簡単かつ突っ込んだ実装"を試してみる

こちらの記事「[Railsのユーザ認証deviseを用いた簡単かつ突っ込んだ実装](Railsのユーザ認証deviseを用いた簡単かつ突っ込んだ実装)」をRails4で試している。
こちらの記事を書いたema25さんに感謝。
一部コードの編集が必要だったので備忘としてメモ。

## 修正点
+ factories.rbの変更
+ spec/factories/items.rbの削除
+ spec/controllers/welcome_controller_spec.rbの変更

## factories.rbの変更
factory_girlの記載方法が変わっているので下記のように変更。

```rb:spec/factories.rb
require 'factory_girl'

FactoryGirl.define do
  factory :user, class: User do
    id 2
    name "Test User"
    email "user@test.com"
    password "foobar"
    password_confirmation "foobar"
  end

  factory :item, class: Item do
    name "Test Item"
    user_id 2
  end
end
```

## spec/factories/items.rbの削除
上記を修正し、rake db:migrate RAILS_ENV=testを実行すると、"Factory already registered: item"というエラーとなる。

```
rake aborted!
Factory already registered: item
```

これはテスト用データが重複している、というメッセージ。
itemのデータについては、上記factories.rbで記載しているので、spec/factories/items.rbを削除。

## spec/controllers/welcome_controller_spec.rbの変更
こちらもfactory_girlの記載方法が変わっているので下記のように変更。

```rb:spec/controllers/welcome_controller_spec.rb
require 'spec_helper'

describe WelcomeController do
  before (:each) do
    user = FactoryGirl.create(:user)
    sign_in user
  end

  describe "GET 'index'" do
    it "should be successful" do
      get 'index'
      response.should be_success
      assigns[:signin].should == "ok"
      # pp response
    end

    it "all items finded" do
      FactoryGirl.create(:item)
      get 'index'
      response.should be_success
      assigns[:items].count.should == 1
      assigns[:items].first.name.should == "Test Item"
    end
  end
end
```
Oracle SQL Developer 4.0 を Linux にインストールする

Oracle SQL Developer 4.0をLinux Mintにインストールする際、若干のエラー回避が必要だったのでメモ。

##ダウンロード
Oracle SQL Developer ダウンロード
http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html

##debファイルに変換
RPMしかないので、alienで入れる。

```
$ sudo apt-get install alien
```

```
$ sudo alien --to-deb --scripts sqldeveloper-4.0.0.13.80-1.noarch.rpm
sqldeveloper_4.0.0.13.80-2_all.deb generated
```

##起動のエラー回避
###エラーメッセージ

```
 Oracle SQL Developer
 Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.

 LOAD TIME : 746#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007ff71884e320, pid=24403, tid=140699596678912
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  0x00007ff71884e320
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /tmp/hs_err_pid24403.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
/opt/sqldeveloper/sqldeveloper/bin/../../ide/bin/launcher.sh: line 1193: 24403 Aborted                 ${JAVA} "${APP_VM_OPTS[@]}" ${APP_ENV_VARS} -classpath ${APP_CLASSPATH} ${APP_MAIN_CLASS} "${APP_APP_OPTS[@]}"
```

###ググった結果
Oracle SQL Developer 4.0 Is Finally Here
http://www.thatjeffsmith.com/archive/2013/07/oracle-sql-developer-4-0-is-finally-here/

###回避方法
/opt/sqldeveloper/sqldeveloper.shに、「unset GNOME_DESKTOP_SESSION_ID」を入れる。

```bash:/opt/sqldeveloper/sqldeveloper.sh
#!/bin/bash
unset GNOME_DESKTOP_SESSION_ID
cd "`dirname $0`"/sqldeveloper/bin && bash sqldeveloper $*
```
【質問】Rubyの"Hello world"スクリプトが動かない（Apache経由）

調べてみたのですが、突破口を見いだせないのでお分かりになる方がいらしたら教えて下さい。

# 事象
- Vagrant(CentOS 6.5) + rbenv + ruby-buildでruby環境を構築
- Apache2経由でブラウザから"Hello world"したindex.rbファイルを見ても`500 Internal Server Error`が出て動作しない
  - ![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/32141/2678f256-86e2-7975-cb9c-4075c7328fa3.png)
- `ruby index.rb`するときちんと出力される


- フォルダやファイルへのパーミッションは問題ない（755）
- perlはApache経由で見てみましたがちゃんと動作しました

```rb:index.rb
#!/usr/bin/env ruby

print "Content-Type: text/html\n\n";
print "Hello World\n";
```

Apacheのエラーログ

```log:/var/log/httpd/error_log
[Sun Feb 16 12:44:35 2014] [error] [client 192.168.33.1] /usr/bin/env:
[Sun Feb 16 12:44:35 2014] [error] [client 192.168.33.1] ruby
[Sun Feb 16 12:44:35 2014] [error] [client 192.168.33.1] : No such file or directory
[Sun Feb 16 12:44:35 2014] [error] [client 192.168.33.1]
[Sun Feb 16 12:44:35 2014] [error] [client 192.168.33.1] Premature end of script headers: index.rb
```

# 調査結果
Apacheのエラーログでぐぐってみると、1行目のrubyへのパス記述が原因の模様。考えられる原因は以下。

1. 改行コードがLFではなくCR+LFになっているため、動作しない。
2. パスが間違っている

1はLFだと確認できているので問題なし（GNU nanoで作成）。
2がおそらく問題ぽいのですが、いろんなパスを試してみても同じ状況です（/usr/bin/rubyや/usr/local/bin/rubyも試しました）

```.htaccess
Options +ExecCGI
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
AddHandler cgi-script .rb
```

```.bash_profile
# .bash_profile

# User specific environment and startup programs
export PATH="/usr/local/rbenv/bin:$PATH:$HOME:/usr/bin"
eval "$(rbenv init -)"
```

rubyの場所は以下です（rbenvなのでホームディレクトリ以下）。[rbenvで導入したRubyのパス - べたな雑記帳](http://yami-beta.hateblo.jp/entry/2013/05/14/203600)によると、`#!/usr/bin/env ruby`で良いらしいですが・・

```shell-session
# which ruby
~/.rbenv/shims/ruby
```

なお、Rubyは以下を見てインストールしました（コマンド内容も含め一緒）
http://brightechno.com/blog/archives/10

# 追記：解決しました

コメント欄で親切に教えていただき、解決しました。

まず`/etc/sysconfig/httpd`に以下を追加
`export PATH=/home/vagrant/.rbenv/shims:$PATH`
そして再起動（`sudo service httpd restart`）

次にApacheがホームディレクトリにアクセスできるようにしてやる
`sudo chmod a+rx /home/vagrant`

これで解決しました。
ManagedObjectの属性値検証


ManagedObjectの属性値を検証したい場合は、下記のメソッドを使用します。
通常、saveメソッドを呼ぶタイミングで検証が行われます。
任意のタイミングで検証したい場合は、こちらのメソッドを使用してください。

|メソッド|内容|
|:----|:----|
|validateForInsert|Insertできるか|
|validateForDelete|Deleteできるか|
|validateForUpdate|Updateできるか|
|validateValue|属性は正しいか|
※個別に属性の検証を実装したいときは、validate属性名という名前のメソッドを実装します。


```objectivec:ManagedObject派生クラスの実装
- (BOOL) validateForInsert:(NSError **)error
{
	BOOL result = [super validateForInsert:error];
	printf("validateForInsert call\n");
	return result;
}

- (BOOL) validateForDelete:(NSError **)error
{
	BOOL result = [super validateForDelete:error];
	printf("validateForDelete call\n");
	return result;
}

- (BOOL) validateForUpdate:(NSError **)error
{
	BOOL result = [super validateForUpdate:error];
	printf("validateForUpdate call\n");
	return result;
}

- (BOOL) validateClassNumber:(NSNumber **)classNumber error:(NSError **)error
{
	if (*classNumber == nil) {
		return YES;
	}
	if ([*classNumber intValue] == 2) {
		NSError *e = [NSError errorWithDomain:@"HKStudentDomain" code:1 userInfo:nil];
		*error = e;
		return NO;
	}
	return YES;
}
```



```objectivec:値のチェック
		NSNumber *classNumber = @100;
		NSError *error = nil;
		if ([student validateValue:&classNumber forKey:@"classNumber" error:&error] == NO) {
			printf("invalid %s\n", [[error localizedDescription] UTF8String]);
			classNumber = @1;
		}
		student.classNumber = classNumber;
		save(moc);
		
		classNumber = @2;
		error = nil;
		if ([student validateValue:&classNumber forKey:@"classNumber" error:&error] == NO) {
			printf("invalid %s\n", [[error localizedDescription] UTF8String]);
			classNumber = @1;
		}
		student.classNumber = classNumber;
		save(moc);
		
		NSString *name = @"A";
		if ([student validateValue:&name forKey:@"name" error:&error] == NO) {
			printf("invalid %s\n", [[error localizedDescription] UTF8String]);
			name = @"AB";
		}
		student.name = name;
		save(moc);
		
		NSDate *birthday = [NSDate dateWithString:@"2002-03-31 23:59:59 +0900"];
		if ([student validateValue:&birthday forKey:@"birthday" error:&error] == NO) {
			printf("invalid %s\n", [[error localizedDescription] UTF8String]);
			birthday = [NSDate dateWithString:@"2002-04-01 00:00:00 +0900"];
		}
		student.birthday = birthday;
		save(moc);
		
		printf("validateForDelete check\n");
		student.classNumber = @100;
		if ([student validateForDelete:&error] == NO) {
			printf("invalid %s\n", [[error localizedDescription] UTF8String]);
		}
		
		printf("validateForInsert check\n");
		if ([student validateForInsert:&error] == NO) {
			printf("invalid %s\n", [[error localizedDescription] UTF8String]);
		}
		
		printf("validateForUpdate check\n");
		if ([student validateForUpdate:&error] == NO) {
			printf("invalid %s\n", [[error localizedDescription] UTF8String]);
		}
```
javascriptで画面サイズを図る


$(document).height() - $(window).height() 

これでブラウザの画面下部からの距離になる。

http://programming.ironsand.net/2012/difference-between-window-width-and-document-width/

$(document).height() →ページ全体の高さ
$(window).height()→ブラウザの表示領域


ページ全体＞ブラウザの表示領域が通常。

ブラウザの画面下部は

ページ全体の高さーブラウザの表示領域

で算出される。

ただし、ブラウザの表示領域は下に行くほど大きくなり、最終的にページ全体の高さとおなじになる。

$(window).height()で引数なしに設定しているのは、ブラウザの表示領域を最終的にページ全体の高さとして取り扱うことができるためである。