OmniAICreator/Qiita-1.07M huggingface dataset:
EC2インスタンス上にて、npmでpackageをinstallしようとするとKilledって返ってくる問題


解決策がわかんなくてハゲそうだったので、Qiitaに書いて整理してたら解決しました。Qiitaすごい！！！！！

# 環境

- OS
  - CentOS 6.4, x86_64
    - EC2インスタンスです
- node.js
  - v0.10.21
  - nvmでuserディレクトリにinstallしてます
- npm
  - v1.3.11


# 症状

たとえばjshintをinstallしようとすると、こんなかんじです。

```bash
$ npm install -g jshint
npm http GET https://registry.npmjs.org/jshint
npm http 304 https://registry.npmjs.org/jshint
npm http GET https://registry.npmjs.org/jshint/-/jshint-2.3.0.tgz
npm http 200 https://registry.npmjs.org/jshint/-/jshint-2.3.0.tgz
Killed
```

当該packageはDLできてるっぽいんですけど、そのあとしばらく停止して`Killed`って返ってくる…

## 試しにcurrentにinstallしてみる

gオプションつけないでやってみた

```bash
$ mkdir jshint
$ cd jshint/
$ npm install jshint
npm http GET https://registry.npmjs.org/jshint
npm http 304 https://registry.npmjs.org/jshint
npm http GET https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/shelljs
npm http GET https://registry.npmjs.org/cli
npm http GET https://registry.npmjs.org/minimatch
npm http GET https://registry.npmjs.org/console-browserify
npm http 200 https://registry.npmjs.org/console-browserify
npm http 200 https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz
npm http 200 https://registry.npmjs.org/cli
npm http 200 https://registry.npmjs.org/shelljs
npm http 200 https://registry.npmjs.org/minimatch
Killed
```

依存packageも解決しようとしてるけど、DLまでいけてないかんじ…？

# 原因＆解決

「なんだこれまじでハゲそう」と思いながらググってたら、"Killed"ってレスポンスはどうやらnpm自体というよりはNode.js自体から返ってきてそう、みたいな予感がしてきた。たぶんプロセスが途中で落ちてる。

で、そういえばEC2インスタンスってswapないんだよなあ、なんてことを思い出して、それ（swap）使えないことでメモリ足りなくなって落ちてるんじゃね？とか思い始めて、以下のエントリを参考にswapを作ってみた。

[AWS - １分でできる！AmazonEC2のmicroインスタンスでswap領域を作る - Qiita [キータ]](http://qiita.com/DQNEO/items/be026d978ef5dcf1e44 "AWS - １分でできる！AmazonEC2のmicroインスタンスでswap領域を作る - Qiita [キータ]")

そうすると、

```bash
$ npm install -g jshint
（中略…）
$HOME/.nvm/v0.10.21/bin/jshint -> $HOME/.nvm/v0.10.21/lib/node_modules/jshint/bin/jshint
jshint@2.3.0 $HOME/.nvm/v0.10.21/lib/node_modules/jshint
├── console-browserify@0.1.6
├── underscore@1.4.4
├── shelljs@0.1.4
├── minimatch@0.2.12 (sigmund@1.0.0, lru-cache@2.3.1)
└── cli@0.4.5 (glob@3.2.6)
```

あっ、installできた。

# おわりに

必要以上に騒ぎ立てた感満載なエントリですが、とりあえずswap領域は大事なんだなあ、と実感した出来事でした。
（たぶんnpmが再帰的にpackageをたくさんinstallするような動きをするので、メモリが足らなくなったんだろうなあ）

おわり。
Karabinerの設定を晒す会(2015更新)


[Karabiner](https://pqrs.org/osx/karabiner/) 旧名KeyRemap4MapBook でキーボードのカスタマイズをしているので、その設定を晒します。（自分用記録)

![Karabiner.png](https://qiita-image-store.s3.amazonaws.com/0/7946/fb46c786-b78e-ccc9-33ad-867aa9c0d18d.png "Karabiner.png")



* emacs的なキーバインドにしたい
* Terminalの中のemacsでCommand+Qとかうっかりタイプするので、自分に都合良くCommandとOptionを入れ替え。
  * 日本語でコメントが書いてあるのは、自分で設定ファイルを書いたから。
* ~~円マークをバックスラッシュに変更~~
  * これはOSの設定で変更できるようになっていたのでそっちで設定
![キーボード.png](https://qiita-image-store.s3.amazonaws.com/0/7946/5d12b330-345a-55d5-f7cb-b3c3a9046d7d.png "キーボード.png")


自分で書く設定ファイルは、Misc&Uninstall の中の"Open private.xml"で開きます。上記設定のprivate.xmlは https://gist.github.com/taktamur/4017168 から取得できます。

![KeyRemap4MacBook-2.png](https://qiita-image-store.s3.amazonaws.com/0/7946/0946d6c8-fe9d-176c-af4b-fcdde1712991.png "KeyRemap4MacBook-2.png")
APICacheで頻度を抑えながらキャッシュを効かせてWeb APIを叩く

公開Web APIをプログラムから叩きたい。
けどうっかり「連打」してしまって(要するにsleep入れずにループまわしてリクエスト連投)…
サービス提供者に迷惑をかけたらどうしよう…
この種のプログラムのテストは少しだけ不安があります。
同じリクエストを繰り返し送ることもあり得るので、結果のキャッシュもしたい。

こういった理由で、リクエスト頻度を抑え、結果をKVSなどでキャッシュしつつAPIを叩くプログラムを自作しようとしたらすでに同様なことを実現するRuby Gemがありました。
APICache[(api_cache)](https://github.com/mloughran/api_cache)です。

READMEを読んでこれは使えそうだと思い、簡単なプログラムを書いてみました。動作はしましたが、実はかなり使いにくいものであることもわかりました。

# APICacheサンプルプログラム

`localhost:9292`というダミーのWebサービスにAPICacheでアクセスしてみます。このWebサービスはGETするたびランダムな文字列を返すだけの役に立たないものです。

```ruby:api_cache_hello.rb
require 'api_cache'
require 'moneta'

APICache.store = Moneta.new(:Daybreak, file: "db")

def get_random_id
  # 以下で、 cache < period とする意味はないが、
  # period の効果を確認するためわざとそうしている。
  option = {
    :cache => 5,          # 5秒経ったらAPI叩いて新しいデータを取りにいく。
    :valid => :forever,   # キャッシュの有効期限は無期限とする。
    :period => 10,        # APIは10秒以上間隔を空ける。
    :timeout => 5,        # 5秒でタイムアウト。
    :fail => "Fail Whale" # 例外発生時に返される値。
  }
  APICache::get('http://localhost:9292', option)
end

puts get_random_id
sleep 3
puts get_random_id # 前回と同じ文字列を得るはず。
sleep 3
puts get_random_id # APIを叩くが10秒経過していないのでエラーとなる。
sleep 5
puts get_random_id # 新しい文字列を得る。
```

* テスト段階で本物のWebサービスを使いたくないので、ここでは`http://localhost:9292`という
ローカルで走るダミーサービスを叩いています。
* キャッシュ層の指定は`APICache.store`に対して行います。ここではDaybreakバックエンドのMonetaインスタンスを与えています。
`db`という名前でキャッシュファイルが生成されます。
* APICache::getは実際にリクエストを送るか、期限切れでないキャッシュがあればそれを返します。

# ランダムな文字列を生成するダミーサービス

rackupで手っ取り早く適当なサーバを作ります。

```ruby:random_id.ru
# Example:
# $ rackup -s webrick -p 9292 random_id.ru
require 'rack/response'

class RandomID
  def call(env)
    Rack::Response.new.finish do |res|
      res.write ('a'..'z').to_a.shuffle[0, 8].join
    end
  end
end

run RandomID.new
```

`rackup -s webrick -p 9292 random_id.ru`などとして起動します。

# 実行結果

上記ダミーサーバを起動した上で、サンプルプログラムを動作させます:

```bash:command-line
$ ruby api_cache_hello.rb
sarljvch
sarljvch
I, [2013-10-22T22:33:24.738347 #18162]  INFO -- : APICache http://localhost:9292: Exception raised (Cannot fetch http://localhost:9292: queried too recently - APICache::CannotFetch)
sarljvch
nbixczgt
```

3回目はリクエスト間隔が短すぎるというエラーログが出ています。この場合もキャッシュされた結果が得られます。

キャッシュの中身を見てみます:

```bash:command-line
$ ruby -rdaybreak -e 'Daybreak::DB.new("db").tap{|db| db.each{|k,v| p k; p v;}; db.close}'
"http://localhost:9292_queried_at"
2013-10-22 22:33:29 +0900
"http://localhost:9292_queried_at_created_at"
2013-10-22 22:33:29 +0900
"f1bb1c78a060f52be2480ca45091338e"
"nbixczgt"
"f1bb1c78a060f52be2480ca45091338e_created_at"
2013-10-22 22:33:29 +0900
```

クエリ結果をキャッシュするとともにその時刻を記録していることがわかります。これをもとにキャッシュの有効性およびリクエスト発行可否を判断しているのでしょう。

# 問題点

キャッシュは`APICache::get`に渡したキーごとに作られます。この点は問題ないのですが、ソースを読んでいると、リクエスト時刻もキーごとに記録しているようです。そのため、URLのパラメータだけ変更してリクエストする場合、それは新規のリクエストと扱われ、直ちにサーバへのアクセスが発生してしまうのでは…。毎回同じURLから「新着情報」を確認するという場合にしか使えない気がします。

# 補足

APICacheでキャッシュできるのはHTTPリクエストだけではありません。APICache::getはブロックを取ることもでき、ブロックの実行結果がキャッシュされます。この場合getの第1引数がキャッシュのキーになります。
詳しくは[Github](https://github.com/mloughran/api_cache)で確認できます。
homebrew の upgrade や reinstall が libc++ の件で全くすすまないとき。 

OSを更新したことが原因か不明だが、brew upgrade で以下のようなメッセージが出た。

```
$ brew reinstall avidemux
Error: avidemux dependency libvpx was built with the following
C++ standard library: libstdc++ (from clang)

This is incompatible with the standard library being used
to build avidemux: libc++ (from clang)

Please reinstall libvpx using a compatible compiler.
hint: Check https://github.com/mxcl/homebrew/wiki/C++-Standard-Libraries
```

メッセージにしたがって brew reinstall をやっていたが、
思いのほか沢山あったので以下のようパイプを使って brew reinstall を実行するようにした。

```
$ brew reinstall avidemux 2>&1 | grep "Please reinstall" | awk '{print "brew reinstall",$3}'| sh
```

それでも面倒臭くなったので最終的には以下のようにした。

```bash
while brew reinstall avidemux 2>&1 | grep "Please reinstall" > /tmp/result.txt
do
  $(awk '{print "brew reinstall",$3}' /tmp/result.txt) 
done
```

終了条件がちょっと不安だけど、多分これで無事に reinstall されるはず
KVSの統一インターフェースを提供するMonetaというRuby Gemを使ってみる

Gem漁りをしていたら興味深いものを見つけました。[Moneta](https://github.com/minad/moneta)というものです。Monetaとは様々な種類のデータベースを統一的なインターフェースで使用することができるRuby Gemです。使用することができるのはKVSだけではなく、Sqlite3など一部のRDBにも対応しているようです。

メリットとして主張されているのは、バックエンドの容易な切り替えです。最初はインメモリストアでテストし、後でKVSに切り替えるといったことが、最小の変更でできるでしょう。
そのような切り替えを実際にやるかどうかはさておいて、バックエンドタイプによらない統一的なプログラミングというのはそれだけで魅力に感じました。KVSの選択に迷っている段階でもコードを書き始めることができるからです。

ここではとりあえずPStore, Daybreak, KyotoCabinet, LevelDB(選択は適当…)の4種に対して書き込みと読み込みのプログラムを書いてみました。
統一的なプログラミングが可能であるというメリットを確認しようと思ったのですが、後述するように注意点もあります。

# データベース作成のサンプル

まずは書き込みから。

```ruby:moneta-write.rb
require 'moneta'

STORE = {
  PStore: {file: "tmp/pstore"},
  Daybreak: {file: "tmp/daybreak"},
  KyotoCabinet: {file: "tmp/kc.kch"},
  LevelDB: {dir: "tmp/leveldb"}
}

def make_db(store_type)
  store = Moneta.new(store_type, STORE[store_type])
  store.clear
  store["Hello"] = "there"
  store["It"] = "works"
  store["See"] = "you"
ensure
  store.close unless store.nil?
end

if ARGV[0].nil?
  puts "Usage: ruby #{__FILE__} [#{STORE.keys.join('|')}]"
else
  make_db ARGV[0].to_sym
end
```

このプログラムを`ruby moneta-write.rb KyotoCabinet`などとして実行すると、バックエンドタイプに応じたファイルが`tmp`ディレクトリ以下に作成されます。

プログラムは一見してわかるように、MonetaのインスタンスをHash風に操作するのみ。非常に簡単です。
コンストラクタにはバックエンドのタイプ(シンボル)とファイル名などのオプション(Hash)を渡します。
オプションはバックエンドタイプに依存するようです。ファイル名のキーはほぼfileですが、LevelDBはディレクトリを作成するのでdirというキーで指定する必要があります。

# データベース読み取りのサンプル

```ruby:moneta-read.rb
require 'moneta'

STORE = {
  PStore: {file: "tmp/pstore"},
  Daybreak: {file: "tmp/daybreak"},
  KyotoCabinet: {file: "tmp/kc.kch"},
  LevelDB: {dir: "tmp/leveldb"}
}

def show_db(store_type)
  store = Moneta.new(store_type, STORE[store_type])
  puts "Hello " + store["Hello"]
  puts "It " + store["It"]
  puts "See " + store["See"]
ensure
  store.close unless store.nil?
end

if ARGV[0].nil?
  puts "Usage: ruby #{__FILE__} [#{STORE.keys.join('|')}]"
else
  show_db ARGV[0].to_sym
end
```

やっていることはほぼ`moneta-write.rb`と同じです。

# 注意点

* 「素の」データベースとの互換性が一部ない(?): Monetaで作成したKyotoCabinetのファイルは素の(Monetaでラップしていない)KyotoCabinetで読めそうですが、残念ながら正しく読めません。LevelDBも同様です。逆に素のKyotoCabinetで作成したファイルもMonetaでは正しく読めません。PStoreとDaybreakについては問題ないようです。これらはMonetaと素のDBの間に互換性があります。
* サポートされないメソッド: 一部KVSでは使用できるメソッドでもMonetaでは使用できないことがあります。例えば`#each`など。

# 補足

* KVSのパフォーマンス比較: [ここ](https://travis-ci.org/minad/moneta)にMonetaのテストとベンチマークの結果があります。`SCRIPT='benchmarks …'`のジョブを覗いてみると、各種バックエンドのベンチマーク結果が一覧でき、比較できます。KVSのパフォーマンス比較をしたいときに参考になるかもしれません。

* 興味深い応用: [APICache](https://github.com/mloughran/api_cache) GemなどがMonetaをキャッシュ層に利用しています。これによりユーザーは自分好みのKVSをキャッシュ層に組み入れることができます。
ブート時に暗号化されたディスクを cryptmount で勝手にマウントする

よく分からんので作業メモ。

cryptmount でディスクを暗号化する方法は一般的っぽい。説明は省く。

/etc/init.d/cryptmount というのもある。ここで指定すると service cryptmount start でマウント出来る

ただ、この時必ずパスワードを聞かれる

今回やりたいのは、ブート時に勝手にマウントしてくれること。パスワードはファイルに書いておくんだ聞くな、的な。用途としては外付けディスクを暗号化するんだけど、普段は本体につけっぱなしなので、その本体の中には鍵置いといてもいーじゃん、とかそういう。本体のディスクはもっとがっつり暗号化されてるとしとく。

http://askubuntu.com/questions/177022/auto-mount-cryptmount-encrypted-loop-device を元に試しに以下のようにディスクを作ってみた。

    > sudo dd if=/dev/zero of=/etc/cryptmount/testdisk2.fs bs=1M count=1024 >/dev/null 2>&1
    > sudo dd if=/dev/random of=/etc/cryptmount/testdisk2.key bs=1024 count=1
    > sudo cryptsetup luksFormat --batch-mode --key-file /etc/cryptmount/testdisk2.key --cipher aes-xts-plain64 --size 512 /etc/cryptmount/testdisk2.fs
    > sudo cryptsetup luksOpen --key-file /etc/cryptmount/testdisk2.key /etc/cryptmount/testdisk2.fs testdisk2 
    > sudo mkfs.ext4 /dev/mapper/testdisk2
    > sudo mount /dev/mapper/testdisk2 /media/testdisk2
    > sudo touch /media/testdisk2/test
    > sudo umount /media/testdisk2
    > sudo cryptsetup luksClose testdisk2

上の方法で暗号化した後、/etc/cryptmount/cmtabに以下のように書く

    testdisk2 {
        dev=/etc/cryptmount/testdisk2.fs
        dir=/media/testdisk2
        fstype=ext4
        fsoptions=default
        cipher=aes-xts-plain64
        keyformat=luks
        flags=user,nofsck
    }

これでパスワードレスのほとんどは終わってる。

    sudo cat /etc/cryptmount/testdisk2.key | sudo cryptmount -w 0 --mount testdisk2

でも、/etc/init.d/cryptmount にはこれを行う方法がないっぽい。/etc/init.d/ 配下に別のinitスクリプトを書くハメになる

なんかねーか。

 # 追記: 最後の sudo cat の下りが結局必要になるのなら前半のcryptsetupの部分は必要ない。
Android レイアウトエディタでカスタムビューを使用しているときにExceptionのログが表示されている場合の対処法

## レイアウトエディタ内で以下エラーログが発生した場合の対処法

```
The following classes could not be instantiated:
- jp.xxxx.xxxxx (Open Class, Show Error Log)
See the Error Log (Window > Show View) for more details.
Tip: Use View.isInEditMode() in your custom views to skip code when shown in Eclipse

java.lang.NullPointerException
    at xxx.xxxx.android.util.xxxx.xxxxx(WebUtil.java:23)
    at xxx.xxxx.android.view.xxxx.<init>(xxxxx.java:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(    at sun.reflect.NativeConstructorAccessorImpl.newInstance(    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(    at java.lang.reflect.Constructor.newInstance(    at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:422)
    at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:179)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:135)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:755)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:727)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:373)
```

```java
//コンストラクタ内で何か処理を入れている場合isInEditMode()で判定してやらないと上記ログが表示される
public CustomView(Context context) {
    super(context);
    // レイアウトエディターでisInEditMode()で判定しないとエディター内でExceptionが発生する
    if (!isInEditMode()) {
        // カスタムユーザーエージェントをセットする
        init();
    }
}
```
publicでないメソッドをクラス外から実行する


PHPはReflectionMethodを使うと、publicでないメソッドをクラス外から実行できるようになります。
protectedやprivateメソッドのテストコードを書きたいときに使えます。

次のsampleMethodのユニットテストを書く例です。

```SampleClass.php
namespace SampleNamespace;

class SampleClass {
	private function sampleMethod() {
		return true;
	}
}
```

ReflectionMethodのコンストラクタ引数で対象クラスとメソッドを指定。
setAccessible(true)でアクセス可能になり、invokeで実行できます。

```SampleClassTest.php
require_once('SampleClass.php');

class SampleClassTest extends PHPUnit_Framework_TestCase {

	public function test_sample() {
		$sample = new \SampleNamespace\SampleClass();
		$reflection_method = new ReflectionMethod('SampleNamespace\SampleClass', 'sampleMethod');
		$reflection_method->setAccessible(true);
		$this->assertTrue($reflection_method->invoke($sample));
	}
}
```

setAccessibleメソッドのドキュメントが参考になりました。
http://jp.php.net/manual/ja/reflectionmethod.setaccessible.php
NSJsonSerialization JSONパース時の、型調査


NSSerialization JSONObjectWithDataでJSONをパースした時に、JSONの型がObjective-cのどの型に対応するか調査してみた。
iOS7でやってます。

こんなJSONを用意して・・・

```
{
   "IntAsString":"100",
   "IntAsNumber":100,
   "DoubleAsString":"0.03043054930804984029",
   "DoubleAsNumber":0.03043054930804984029,
   "BoolAsString":"false",
   "BoolAsBool":false,
   "NullAsString":"null",
   "NullAsNull":null,
   "String":"String",
   "Array":[
      0,
      0,
      0,
      0
   ],
   "Object":{
      "Hoge":"Fuga",
      "Foo":0
   }
}
```

こんなコードで型を列挙

```
 NSString *tJsonTest = @"{\"IntAsString\":\"100\", \"IntAsNumber\":100, \"DoubleAsString\":\"0.03043054930804984029\", \"DoubleAsNumber\":0.03043054930804984029, \"BoolAsString\":\"false\", \"BoolAsBool\": false, \"NullAsString\":\"null\", \"NullAsNull\":null, \"String\": \"String\", \"Array\": [0,0,0,0], \"Object\": {\"Hoge\":\"Fuga\", \"Foo\":0}}";
NSDictionary *tDict = [NSJSONSerialization JSONObjectWithData:[tJsonTest dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];

for(NSString *tKey in tDict.allKeys) {
    NSLog(tKey);
    NSLog(NSStringFromClass([tDict[tKey] class]));
}

```

するとこんなログが。

```
2013-10-23 19:13:58.489 TestApp[33436:a0b] NullAsString
2013-10-23 19:13:58.491 TestApp[33436:a0b] __NSCFString
2013-10-23 19:13:58.491 TestApp[33436:a0b] String
2013-10-23 19:13:58.492 TestApp[33436:a0b] __NSCFString
2013-10-23 19:13:58.492 TestApp[33436:a0b] Array
2013-10-23 19:13:58.492 TestApp[33436:a0b] __NSCFArray
2013-10-23 19:13:58.493 TestApp[33436:a0b] IntAsNumber
2013-10-23 19:13:58.494 TestApp[33436:a0b] __NSCFNumber
2013-10-23 19:13:58.494 TestApp[33436:a0b] IntAsString
2013-10-23 19:13:58.495 TestApp[33436:a0b] __NSCFString
2013-10-23 19:13:58.495 TestApp[33436:a0b] BoolAsString
2013-10-23 19:13:58.496 TestApp[33436:a0b] __NSCFString
2013-10-23 19:13:58.496 TestApp[33436:a0b] NullAsNull
2013-10-23 19:13:58.496 TestApp[33436:a0b] NSNull
2013-10-23 19:13:58.497 TestApp[33436:a0b] Object
2013-10-23 19:13:58.497 TestApp[33436:a0b] __NSCFDictionary
2013-10-23 19:13:58.498 TestApp[33436:a0b] DoubleAsString
2013-10-23 19:13:58.498 TestApp[33436:a0b] __NSCFString
2013-10-23 19:13:58.499 TestApp[33436:a0b] DoubleAsNumber
2013-10-23 19:13:58.499 TestApp[33436:a0b] __NSCFNumber
2013-10-23 19:13:58.499 TestApp[33436:a0b] BoolAsBool
2013-10-23 19:13:58.500 TestApp[33436:a0b] __NSCFBoolean
```
VimでMarkdown, ブラウザでプレビュー


Qiitaを使い始めてからというもの、[Markdown記法](http://kojika17.com/2013/01/starting-markdown.html)って便利だなあ、と感じるようになりました。  
折角なので普段のメモなどもMarkdownで記述しよう、ってなわけでVimにMarkdownのシンタックスハイライトを導入し、ついでに編集内容をブラウザでプレビューできるように環境構築してみました。  
ちなみにこの記事も今までのKobitoでなくVimで編集しました。

## 参考にさせていただいたサイト
* [VimにてMarkdown形式でmemoをとり、QuickRunで確認する](http://c4se.hatenablog.com/entry/2013/06/01/221504)
* [Hack #230: Markdown形式の文書を書く2 (quickrun0.5.0対応版)](http://vim-users.jp/2011/09/hack230/)

## Vim-Markdown、QuickRunの導入
すっかりお世話になりっぱなしのNeoBundleを利用して導入します。
後程説明しますが、ブラウザでプレビューするためにopen-browserというプラグインも導入しておきます。

```.vimrc
NeoBundle 'tpope/vim-markdown'
NeoBundle 'tyru/open-browser.vim'
NeoBundle 'thinca/vim-quickrun'
```

Vimを起動して`:NeoBundleInstall`で完了です。


## Markdownパーサのインストール
Markdown記法をHTMLに変換するパーサをインストールします。
参考サイト様によると、quickrun0.5.0では以下のMarkdownパーサをサポートしているようです。
$PATHにこれらのコマンドがあると、それを使って変換が行われます。  
優先順位はこのリストの上から順番です。

* Markdown.pl
* kramdown
* bluecloth
* redcarpet
* pandoc

今回はRubyでも使えるkramdownにしてみました。

```
$ sudo gem install kramdowm
```
なお、会社などで一時的にProxyを使いたい場合は`-p http://your.proxy:8080`などのオプションを付ければOKです。

## ブラウザプレビュー設定
再度`.vimrc`を編集します。


```.vimrc
" -------------------- QuickRun ----------------------------- "
let g:quickrun_config = {}
let g:quickrun_config['markdown'] = {
      \   'outputter': 'browser'
      \ }
```

以上で準備完了です。

## Hello,Markdown!
それではマークダウンを書いてみます。拡張子`.md`とか`.mkd`とすると勝手にMarkdown形式としてシンタックスハイライトを行ってくれると思います。  
`$vim hello.md`

```hello.md
## Hello,Markdown!

おはようございます。

* リスト
* リスト
  - 入れ子もできるYO
```

編集完了したら編集モードに戻って、`\r`と入力してみてください(\はバックスラッシュです)。
kramdownを使ったHTML変換が行われ、`.html`に関連付けられたブラウザでプレビュー可能になると思います多分。  
うわー便利。

## .vimrcも整形しなきゃなあ…

`.vimrc`もそろそろ超初心者なりに綺麗にしたいです。
こう何から何まで初心者だと覚えることが多すぎて時間が足りず、なかなか本題のRubyのお勉強に入れないですね。でも楽しいです。
4年間もSIで何やってたんでしょ、というツッコミは置いといて。。
全画面に表示される質問に次々と答えるっていうスクリプト例

アンケートとかそういう用途。。大量のラジオボタンが並ぶよりは気分良いんじゃないか。あとは全体の進捗（あとどれくらいで終わるのか）がわかれば。

デモ:

* http://jsfiddle.net/ginpei/mw6de/show/

コード:

* http://jsfiddle.net/ginpei/mw6de/
Android UserAgentの設定方法

## UserAgentの設定方法

ユーザーエージェント(UA)の設定方法は、
既存のユーザーエージェントに上書きして設定するみたいです。
基本的には
` カスタムUA = 既存のUA ＋ 定義したい文字列`
でOKです。

```java
WebView webView = new WebView(getApplicationContext());
webView.getSettings().setUserAgent(webView.getSettings().getUserAgent() + "定義したい文字列");

```
"入門Chef Solo - Infrastrueture as Code"を読んでてメモ

完全に自分用。
新しいvagrantを使ったら、色々コマンドとか変わったみたい。

- p.404 vagrantはRubyから入れない
- p.413 vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box
- p.422 config.vm.network :private_network, ip: '192.168.33.10'
- p.459 vagrant plugin install sahara
macでIPアドレスを複数割り当てる方法

追加
--------

```bash:
sudo ifconfig en0 alias 192.168.0.99 netmask 0xffffff00
```

確認

```bash:
/sbin/ifconfig en0
```

削除
----------

```bash:
sudo ifconfig en0 -alias
```

# その他

## 通信速度確認

```bash:
ifconfig -m
```

## デバイス一覧表示

```bash:
ifconfig -lu
```
[tmlib.js] tmlib.js におけるクラス定義

tmlib.js では `tm.define()` というメソッドを使ってクラス定義することができます.

クラスの定義, 継承はもちろんのこと, 文字列で namespace を含めた名前で
定義することもできます.

## Usage


### 定義

```js
tm.define(クラス名, {
	superClass: 継承元となるクラス名(省略可)

	// 初期化処理
	init: function() {
		superInit(); // 継承もとの初期化

		// TODO: 処理を書いていく

	}
});
```

### 使い方

```js
var hoge = クラス名();
```


## Example

### [Demo](http://jsdo.it/phi/sCZh)

```js
// food 名前空間に Fruit クラスを定義
tm.define("food.Fruit", {
	price: 0,  // メンバ変数

    init: function(price) {
    	this.price = price;
    },
    
    // メンバ関数
    getPrice: function() {
    	return this.price;
    }
});

// food 名前空間に Fruit を継承した Apple クラスを定義
tm.define("food.Apple", {
	superClass: "food.Fruit",

	init: function() {
		this.superInit(100); // 親の初期化を呼ぶ
	}
});

// メイン処理
tm.main(function() {
    // apple クラスを生成(tmlib では new は省略可)
	var apple = food.Apple();
    // 値段を表示
	document.write(apple.getPrice());	// 100 と表示される
});

```
wheezyインストール時、ファームウェアを用意する必要が有る場合

インストール時、ファームウェア(以下FW)を要求されることがあります。

例) サーバー用LANアダプター、ファイバーチャネルカード

以下の方法があります。

FWをダウンロードしUSBメモリに解凍。
--------------
[download](http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/wheezy/current/firmware.tar.gz)

またはFWが含まれているインストーラーを使用する
--------------
[download](http://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/7.2.0/amd64/iso-cd/firmware-7.2.0-amd64-netinst.iso) 64bit
OS X 10.9 Marvericksでzlibがない


```
configure: error: could not find zlib.h
```

のエラーが出た人向け

    xcode-select --install

でツールのインストールを行えばおっけー


参考

<http://stackoverflow.com/questions/17066849/command-line-tools-for-new-10-9-osx-for-ruby-gems>

<https://github.com/mxcl/homebrew/issues/20431>
コマンドラインでTravisCIを操作したいときは、The Travis Clientを使うのが便利

GitHubのレポジトリにTravisCIを導入するとき、

1. .travis.ymlを書く
2. https://travis-ci.org/ にアクセスする
3. AccountのページからSync Nowして、接続できるレポジトリを同期する
4. TravisCIが動くようにレポジトリのスイッチをONにする

というプロセスが必要になるわけですけども、毎回サイトにアクセスして設定するのは面倒です。本当に面倒です。
なので、色々探しましたが、公式が僕の要望にピッタリなrubygemを用意してくださっていました。
https://github.com/travis-ci/travis

インストール

```zsh
$ gem install travis
```

travisコマンドを使うことで、Sync Now や、.travis.ymlの作成、レポジトリの設定などがコマンドラインで簡単に出来ます。

詳しい使い方は [公式](https://github.com/travis-ci/travis) にお任せするとして、

まずはログインします。

```
$ travis login
```

TravisCIを動かしたいレポジトリのディレクトリに移動して、
有効なレポジトリを同期させます。(そのディレクトリはGitHubに公開されている必要があります)

```zsh
$ travis sync
```

ruby用に.travis.ymlを作成し、そのレポジトリで<span class="deco" style="font-weight:bold;">TravisCIが動く</span>ようにします(enable)

```zsh
$ travis init ruby
```

レポジトリでTravis CIが動くようにします。

```zsh
$ travis enable
```

ブラウザを開きます。

```zsh
$ travis open
```

![スクリーンショット 2013-10-14 2.44.34.png](https://qiita-image-store.s3.amazonaws.com/0/9578/85bcb574-913f-3c1c-678c-4f6577ab89e6.png)
Android WebViewのクッキー取得方法

## WebViewでクッキーを取得する場合の方法

WebViewでクッキーを取得する場合は、CookieManagerを使用します。

```java
WebView webView = findById(R.id.webview);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url){
                // Cookieを取得
        String[] cookies = CookieManager.getInstance().getCookie(url).split(";");
        for(String cookie : cookies){
            Log.d("", cookie);
        }
    }
} 
```
Git のデーモンをさくらのVPSのCentOS6.4にインストール

基本はここのとおりにやっていけばOK
http://www.mk-mode.com/octopress/2012/12/07/centos-construct-git-server/

途中の
```
$ git remote add origin ssh://masaru@vbox.mk-mode.com/var/lib/git/public_git/test.git
```

だけが `ssh://masaru@vbox.mk-mode.com:10022/var` のようにポート番号を指定しないと自分の環境では上手く動かなかった。

## 参考

git remote add origin ssh://masaru@vbox.mk-mode.com/var/lib/git/public_git/test.git
http://www.mk-mode.com/octopress/2012/12/07/centos-construct-git-server/

git remote add with other ssh port - Stack Overflow
http://stackoverflow.com/questions/3596260/git-remote-add-with-other-ssh-port
Ruby on Railsのサーバーをバックグラウンドで動かしたり止めたり

`rails server`ないし`rails s`でWEBRickを起動するけど、daemonとして起動するとコンソールを引き続き利用出来るので便利。

## コマンド

### daemonとしてサーバーを起動

```bash
rails s -d
```

### サーバーを停止

```bash
kill `cat tmp/pids/server.pid`
```

正式なやり方あったら教えてください。
TextareaのPlaceholderのフォントがinput text のPlaceholder と異なる場合の対応方法


###すぐ確認できた環境で確認した結果

| 環境 |  input text  | textarea |
|:-----------:|:------------:|:------------:|
| Windows IE 10  | 親要素のfont-familyが適用 | 何も適用されない |
| Windows Chrome     |      親要素のfont-familyが適用 |   何も適用されない    |
| Mac Safari       | 親要素のfont-familyが適用 |     親要素のfont-familyが適用     |
| Mac Chrome         |  親要素のfont-familyが適用 |      親要素のfont-familyが適用      |

※valueのCSSではなく、親要素のfont-familyが適用された様子。

###対応策

```CSS:以下のようにして対応
::-webkit-input-placeholder{
	font-family: "Verdana",  sans-serif;
}
:-moz-placeholder {
	font-family: "Verdana",  sans-serif;
}
```

###他にも指定できた要素として確認できたものは以下

* padding
* font-weight
* font-color
* line-height
vim-smartinputはスニペットの代わりになるような設定もできなくはないかもしれない


制御構文とかの記述に、スニペットを利用している人は多いかと思います。
ただ、スニペットは柔軟な設定がしにくいように思えて（例えばclassの有無だとか）いまいち僕は使いこなせていないです。

もっと定型的なスタイルとか、ライセンスの文面とか、そういったところはスニペットに任せた方が良いですが、細かい構文とかは手で打った方が早いですね。

しかし、決まりきった記述であるならば出来るだけ楽をしたいものです。なので最近はsmartinputの設定をチマチマ強化しています。
smartinputとは`inomap [] []<Left>`みたいな設定をもっといい感じに出来るようにしやすくしてくれるイカしたプラギンです。入れるだけで基本的な設定が入ってくれるので便利ですが、使用感を大きく変えるので好き嫌いの分かれるプラグインな気がします。

僕はよくPythonを使うので、以下のような設定を入れています。

```vim
" classとかの定義時に:までを入れる
call smartinput#define_rule({
\   'at'       : '^\s*\%(\<def\>\|\<if\>\|\<for\>\|\<while\>\|\<class\>\|\<with\>\)\s*\w\+.*\%#',
\   'char'     : '(',
\   'input'    : '():<Left><Left>',
\   'filetype' : ['python'],
\   })
" が、すでに:がある場合は重複させない. (smartinputでは、atの定義が長いほど適用の優先度が高くなる)
call smartinput#define_rule({
\   'at'       : '^\s*\%(\<def\>\|\<if\>\|\<for\>\|\<while\>\|\<class\>\|\<with\>\)\s*\w\+.*\%#.*:',
\   'char'     : '(',
\   'input'    : '()<Left>',
\   'filetype' : ['python'],
\   })
" 末尾:の手前でも、エンターとか:で次の行にカーソルを移動させる
call smartinput#define_rule({
\   'at'       : '^\s*\%(\<def\>\|\<if\>\|\<for\>\|\<while\>\|\<class\>\|\<with\>\)\s*\w\+.*\%#:$',
\   'char'     : ':',
\   'input'    : '<Right><CR>',
\   'filetype' : ['python'],
\   })
call smartinput#define_rule({
\   'at'       : '^\s*\%(\<def\>\|\<if\>\|\<for\>\|\<while\>\|\<class\>\|\<with\>\)\s*\w\+.*\%#:$',
\   'char'     : '<CR>',
\   'input'    : '<Right><CR>',
\   'filetype' : ['python'],
\   })
```

これで、関数宣言なんかの時の入力がなんかいい感じになってくれる感じです。
すげーちょっとした感じの設定ですけど、こういうの好きです。def hoge():みたいなのは一日に百回以上は書くので、ここを快適にしておくことで将来の腱鞘炎リスクに備える事が出来ますね。

![gif](http://gifzo.net/PAWVjhyB8e.gif)
IP メッセンジャーでブロードキャストできなかった（けど、できた）

http://witworks.blogspot.jp/2010/06/ruby-wake-on-lan.html ままですが、取り急ぎ、メモ。

※ コード整理は後程…

```ruby:ip_messenger.rb
# coding: utf-8
require "socket"

class IPMessenger
  def initialize(host, user = nil, group = nil)
    @port, @version, @command = 2425, 1, 32
    @sock  = UDPSocket.new
    @host  = host
    @user  = user
    @group = group
    @num = $$ || 0
  end

  def sendmsg(host, msg)
    @num += 1
    str = sprintf("%d:%d:%s:%s:%d:%s", @version, @num, @user, host, @command, msg).encode('Shift_JIS')
    @sock.send(str, 0, host, @port)
  end

  def login
    @num += 1
    command = 6291713
    msg     = "#{@user}\00#{@group}"
    str = sprintf("%d:%d:%s:%s:%d:%s", @version, @num, @user, @host, command, msg).encode('Shift_JIS')
    @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
    @sock.send(str, 0, '255.255.255.255', @port)
  end

  def logout
    @num += 1
    command = 861706453
    msg     = ''
    str = sprintf("%d:%d:%s:%s:%d:%s", @version, @num, @user, @host, command, msg).encode('Shift_JIS')
    @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
    @sock.send(str, 0, '255.255.255.255', @port)
  end
end
```
TortoiseGitでファイルの一部をコミットする方法 (git add -p相当の機能）

TortoiseGitは便利なツールだけど、ときたま git コマンドのとある機能と同じことするのにどうやるんだろう？と分かりづらかったり、そもそもそういう機能が実装されてなかったりするので、そのあたり調べたことを記録しておこうとおもう。

まずは git add -p 相当の機能。
これは、あるファイルの一部だけをコミットしたいときなどコミット箇所を対話的に選択する機能。

ということで、まずはいつものようにエクスプローラーから右クリックしてコミット画面を出す。

次に、通常コミット対象のファイルをダブルクリックして差分を確認すると思うけど、ここで「あぁこのファイル複数のバグいっぺんに修正しちゃってるなぁ...分けてコミットしなきゃなぁ」などと本来あってはならないことが発生することがたまにある（よね？）。

その場合、一旦差分画面閉じて（閉じなくてもいいけど）、先ほどのコミット画面を出して対象となるファイルを右クリックして、Restore after commitというのを選ぶ。
![Select Restore after commit](https://qiita-image-store.s3.amazonaws.com/0/3090/48cb377f-92b2-f6cb-4066-ea3d123a6557.png)

するとコミット画面の対象となるファイルのアイコンがちょっと変わると思うけど、再度このファイルをダブルクリックして差分画面を出す。

自分は WinMerge大好きっ子なので下記のような画面だけど、デフォルトの差分画面でもやることは同じ。
![差分画面](https://qiita-image-store.s3.amazonaws.com/0/3090/33e29f9b-7957-a15e-f9e2-80a2971940df.png)

ここで元のファイルのコミットしたくない部分を削除して保存。

以上、下ごしらえが済んだらコミットを実行。

すると先ほどの削除した部分が復活して元のファイルに戻るので、再度残りの部分をコミットすればオッケー。
アニメーション比較: transform vs それ以外CSS vs jQuery

左右に移動するブロックを、以下の三種類の方法で実装し並べた。

* CSS `animation` + `transform:translateX()`
* CSS `animation` + `left`
* `jQuery.fn.animate()`

デモ:

* http://jsfiddle.net/ginpei/GdgYm/

やっぱり`transform`だとなめらか。
Google公式のSEOスターターガイドがいい感じ

Googleが公式でSEOのスターターガイドを公開してました。

- [Google 検索エンジン最適化 スターターガイド - PDF](https://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.co.jp/ja/jp/webmasters/docs/search-engine-optimization-starter-guide-ja.pdf)

内容は基本的なことが多いですが、基本は大事＋Googleの公式だから信頼性が高いので、これからSEOとかやってみようかなという人は参考にしてみるとよさそうです。
ちなみに公開されたのは [2010年](http://googlewebmastercentral-ja.blogspot.jp/2010/09/seo.html) のようです。
物理演算で使われる公式とかざっくりまとめ

色々公式とかたくさん出てきて忘れてしまうのでただのまとめメモ。

##力

```math
f = ma
```

##質量

```math
v は体積、p は密度。 \\
m = \int_v p(x)dx \\
\\
密度が物体内で一定の場合はシンプルに、\\
\\
m = vp
```

##運動量

```math
v は速度。\\
p = mv
```

```math
\frac{dp}{dt} = \frac{dmv}{dt} = ma = f(t)
```

##撃力（インパルス）

```math
\int_{\Delta t} \frac{dp}{dt}dt = \int_{\Delta t} \frac{dmv}{dt}dt = m\Delta v = \int_{\Delta t} f(t)dt \\
\\
m\Delta t = \int_{\Delta t} fdt \\
= f\Delta t \\
\\
つまり、瞬間に働く「力」。
```

##モーメント

```math
x = \frac{m_0 x_0 + m_1 x_1}{m_0 + x_0} \\
x = 0 のとき、重心。
```

##トルク

```math
τ = I\alpha \\
τ = r \times f \\
\\
I は慣性テンソル
```

##慣性テンソル
```math
ある軸から距離 r にある質量 m の質点の軸周りの慣性テンソル
\\
I = mr^2
```

##原点に対する慣性テンソル$I_0$
```math
I_0 = \sum m_i(x_i^2 + y_i^2) \\
\\
I = mr^2 の式より、全密度の質点の慣性テンソルの合計を計算する。
```

##角速度
```math
\frac{\partial\theta}{\partial t} = \omega
```
CSSだけで（送信中のAjaxなフォームの）ボタンにくるくるを表示する例

※表示の制御はスクリプトで。

![loading.gif](https://qiita-image-store.s3.amazonaws.com/0/10765/d8e56961-c7ae-e773-75c4-72ddeb700e20.gif)

デモ:

* http://jsfiddle.net/ginpei/LREJf/show/
* [コード](http://jsfiddle.net/ginpei/LREJf/)

```css
.submit.loading::before {
    background-color: rgba(0,0,0,.5);
    content: "";
    display: block;
    height: 100%;
    left: 0;
    position: absolute;
    top: 0;
    width: 100%;
}
.submit.loading::after {
    animation: rotate 1s infinite linear;
    content: "*";
    color: #fff;
    height: 100%;
    left: 0;
    position: absolute;
    top: 0;
    width: 100%;
}
@keyframes rotate {
    0% { transform: rotate(0); }
    100% { transform: rotate(360deg); }
}
```

`::before`でオーバーレイを表示して、`::after`に`animation`を設定してくるくる。
Proxmox3.3環境をDebian7.7にインストール

proxmoxが配布しているISOでインストールする場合、以下問題があるのでWheezy入れてからインストールしてみた。

* 任意のパーティションにできない
* EFIにインストールできない
 
[firmware-7.7.0-amd64-netinst.iso](http://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current/amd64/iso-cd/firmware-7.7.0-amd64-netinst.iso)を使用しOSインストール。
自分はインストールの際、taskselの選択は`sshサーバー`のみ選択しました。

手順
=====

* [Install Proxmox VE on Debian Wheezy - Proxmox VE](https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Wheezy)
* 最初にBIOSのプロセッサオプションを確認しKVMが使えるようにVTを有効にしておく。

```bash:準備
apt-get install -y vim sudo patch
```

```diff:/etc/sudoers
+ vagrant ALL=(ALL) NOPASSWD: ALL
```

```bash:sources.list追加
# cat > /etc/apt/sources.list.d/proxmox.list <<EOF
deb http://download.proxmox.com/debian wheezy pve-no-subscription
EOF
```

```bash:key追加
wget -q -O- "http://download.proxmox.com/debian/key.asc" | apt-key add -
```

```bash:
apt-get update
apt-get dist-upgrade -y
apt-get install -y pve-kernel-2.6.32-34-pve pve-firmware
```

ファームウェアが見つからないとのエラーが出た場合
--------------

```diff:/etc/apt/sources.list
-deb http://ftp.jp.debian.org/debian/ wheezy main
+deb http://ftp.jp.debian.org/debian/ wheezy main non-free
```

```bash:
apt-get update
apt-get install -y firmware-linux-nonfree firmware-b43-installer
```

再起動。grubで`Debian GNU/Linux, with Linux 2.6.32-34-pve`を選択し起動。

再起動後
=====

```bash:不要なkernelを削除
apt-get remove -y linux-image-amd64 linux-image-3.2.0-4-amd64
```

自分のホスト名のIPアドレスをhostsに記入(192.168.11.3)
----------------

```diff:/etc/hosts
-127.0.1.1    proxmox
+192.168.11.3 proxmox
```

```bash:ツール群をインストール
apt-get install -y \
 proxmox-ve-2.6.32 ntp ssh lvm2 postfix ksm-control-daemon vzprocps open-iscsi bootlogd screen
```

```bash:一応openVZのtemplateリストをupdateしとく
pveam update
```

webUIのパッチ
-----------------

```bash:
$ wget -q https://raw.github.com/tukiyo/proxmox/master/pvemanagerlib.js.patch.2 && \
sudo patch /usr/share/pve-manager/ext4/pvemanagerlib.js < pvemanagerlib.js.patch.2
```

kvm用設定
==========

vmbr0の設定
----------------
proxmoxはvmbr0を使う。以下のように設定しておく。

```bash:/etc/network/interfaces
# network interface settings
auto lo
iface lo inet loopback

iface eth0 inet manual

auto vmbr0
iface vmbr0 inet static
	address  192.168.11.3
	netmask  255.255.255.0
	gateway  192.168.11.1
	dns-nameservers 192.168.11.1
	dns-search myhome.co.jp
	#
	bridge_ports eth0
	bridge_stp off
	bridge_fd 0
```

OS再起動
------------
* kvmを有効にするため、OS再起動します。


webUIにアクセス
--------------

https://192.168.11.3:8006
にアクセスし、rootでログインできることを確認。


* [Download/template/precreated - OpenVZ Linux Containers Wiki](http://openvz.org/Download/templates/precreated)
OS X 10.9 Mavericksを導入したらvirtual boxのホストオンリーアダプダが無効になったので対応

意気揚々とOS X 10.9 Mavericksを導入したらvirtual boxのホストオンリーアダプダが無効になったので対応しました。

やったことはvirtual boxを再インストールするだけです。

原因はたぶんvirtualboxインストール時にホストOSに構成される「VritualBox Host-Only Network」という仮想イーサネットアダプタがなくなったためかと。。
Makefile for Scala executable jar

やること
=======

makefileによるビルドでScalaコードから実行可能なjar形式を作る。

モチベーション
============

Scalaを勉強するときに簡単なプログラムを書くだけでsbtをセットアップしたり、実行するのにscala ~~するのが面倒。

あとソースファイル数個で済みそうなツールに大げさで融通の効かないプロジェクトを作りたくない。

なので昔ながらのmakefileで実行可能ファイルを作るスタイルをとりたい。

参考 [ScalaをJar化してみる - ゲーム作ろうよ](http://d.hatena.ne.jp/mitsu_chie/20100719/1279552867 "ScalaをJar化してみる - ゲーム作ろうよ")

ディレクトリ構成
==============

- Main.scala
- makefile
- scala/

ここで scala/ ディレクトリはscala-library.jarを解答したもの。先の参考の手法を踏襲している。

makefile
=======

```mf:makefile
target=training
objects=Main.class
manifest=MANIFEST.MF
SCALACFLAGS=-deprecation

all: $(target)

$(target): $(objects) $(manifest)
	jar cfm $@ $(manifest) $(objects:%.class=%.scala) *.class scala
	chmod +x $@

%.class: %.scala
	scalac $(SCALACFLAGS) $<

clean:
	rm -f $(target)
	rm -f *.class

.PHONY: all clean
```

これでvim上で :make でコンパイル。 :!./training で実行という感じで学習を進められる。
ちょっとしたツールを作って自分のLinux環境で使う時なんかも make install を作ればいい。

弱点とか課題とか
==============

- scala-libraryを同梱しているのでファイルサイズが大きくなる
- sbtと違ってscalacをいちいち呼び出すのでコンパイルが遅い。
- 実行可能jarだと-Xmxとかが指定できないっぽい（諦めるしかない？）。
- cmakeでのスタイルを確立させたい。
Redmineチートシート


# チケットのステータスを変更する

```sh
curl -s -f -X PUT -H "Content-Type: application/json" -H "X-Redmine-API-Key: yourapikey" --data '{"issue": {"status_id": 1}}' "http://localhost:3000/issues/${issue_id}.json"
```


# git commitでチケットのステータスをセットする

* closes -> Resolved
* fixes -> Resolved
Cassandraのユーザーパーミッションの挙動


ユーザーAliceを作成

```
$ cqlsh -u admin -p <password>

# ユーザーAliceを作成
cqlsh> create user Alice with password 'alice';

# キースペースAliceDBを作成し、AliceにALL権限を与える
cqlsh> create keyspace AliceDB with replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh> grant all PERMISSIONS ON KEYSPACE alicedb TO 'Alice';

# bobdbを作成、データを挿入
cqlsh> create keyspace AliceDB with replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh> use bobdb;
cqlsh:bobdb> create table BobTable(id varchar PRIMARY KEY, var varchar );
cqlsh:bobdb> insert into bobtable (id,var) values ('key-1','a');
```

作成されたユーザーAlice(AliceDBにALL権限を持つ)でログインし、挙動を調査する

```
$ ./bin/cqlsh -u Alice -p alice;

# 新規Keyspaceの作成に失敗する
cqlsh:alicedb> create keyspace AliceDB2 with replication = {'class': 'SimpleStrategy', 'replication_factor': 1};                          
Bad Request: User Alice has no CREATE permission on <all keyspaces> or any of its parents

# alicedb上での新規Table作成に成功する
cqlsh> use alicedb;
cqlsh:alicedb> create table AliceTable(id varchar PRIMARY KEY );

# bobdb Keyspaceでの新規Table作成とSELECTに失敗する。
cqlsh:alicedb> use bobdb ;
cqlsh:bobdb> create table AliceTable(id varchar PRIMARY KEY );
Bad Request: User Alice has no CREATE permission on <keyspace bobdb> or any of its parents
cqlsh:bobdb> select * from bobtable ;
Bad Request: User Alice has no SELECT permission on <table bobdb.bobtable> or any of its parents
```

期待通りのパーミッション動作になっていることを確認した

* `ALL KEYSPACES`リソースでの`CREATE`権限を持っていない限り新規KeySpaceは作れない
* `CREATE`権限を持っているKeySpace上では自由にTableが作れる
* `SELECT`権限を持っていないKeySpace上のリソースは参照できない
* `describe keyspaces`すると全てのKeyspaceの全てのTableのスキーマが取れるようなので、ACLでスキーマ情報を隠蔽することは出来ない。
README.mdを予め作るシェルスクリプトを作る

README.mdにいつもGemnasiumやTravisCIのバッジをくっつけてますけども、
毎回この作業やるのしんどいので、シェルスクリプトで一発!!ってなるようにしました。

なお、current_repositoryとかは、oh-my-zshのgitプラグインをそのまま利用しています。

```zsh:makereadme
#!/bin/zsh
CURRENT_REPOSITORY () {
	ref=$(git symbolic-ref HEAD 2> /dev/null)  || ref=$(git rev-parse --short HEAD 2> /dev/null)  || return
	echo $(git remote -v | cut -d':' -f 2)
}
 
CURRENT_REPOSITORY_USER_NAME () {
	echo ${$(CURRENT_REPOSITORY | awk '{print $1}')%.git}
}
 
CURRENT_REPOSITORY_DIRECTORY=`git rev-parse --show-toplevel`
CURRENT_REPOSITORY_NAME=$(basename $CURRENT_REPOSITORY_DIRECTORY)
rm README.md
 
touch README.md
cat << EOT >> README.md
${CURRENT_REPOSITORY_NAME}
===============
 
[![Build Status](https://travis-ci.org/$(CURRENT_REPOSITORY_USER_NAME).png)](https://travis-ci.org/$(CURRENT_REPOSITORY_USER_NAME))
[![Dependency Status](https://gemnasium.com/$(CURRENT_REPOSITORY_USER_NAME).png)](https://gemnasium.com/$(CURRENT_REPOSITORY_USER_NAME))
 
EOT
```
[tmlib.js] Keyboard クラスでサクッとプレイヤーを移動させてみよう

tmlib.js 2.0 で `tm.input.Keyboard` クラスに `getKeyDirection()` method を
追加しました.

これを使えばサクッとキーボードでプレイヤーを動かすような
ゲームを作ることができます.


## Example

#### [Demo](http://jsdo.it/phi/UI9F)

```js
/*
 * tmlib.js 0.2.0
 */

/*
 * contant
 */
var SCREEN_WIDTH    = 465;              // スクリーン幅
var SCREEN_HEIGHT   = 465;              // スクリーン高さ
var SCREEN_CENTER_X = SCREEN_WIDTH/2;   // スクリーン幅の半分
var SCREEN_CENTER_Y = SCREEN_HEIGHT/2;  // スクリーン高さの半分

/*
 * main
 */
tm.main(function() {
    var app = tm.display.CanvasApp("#world");
    app.resize(SCREEN_WIDTH, SCREEN_HEIGHT);
    app.fitWindow();
    
    app.replaceScene(MainScene());
    
    app.run();
});

/*
 * main scene
 */
tm.define("MainScene", {
    superClass: "tm.app.Scene",
    
    init: function() {
        this.superInit();
        
        // プレイヤー生成
        this.player = tm.display.TriangleShape().addChildTo(this);
        this.player.setPosition(SCREEN_CENTER_X, SCREEN_CENTER_Y);
    },

    update: function(app) {
        var direction = app.keyboard.getKeyDirection(); // 向きを取得
        direction.mul(8);
        this.player.position.add(direction); // 移動
    }
});
```
xibファイルを使って表示さす




(http://qiita.com/torshinor/items/26cdb8d3968beafa740c)

1. xibファイル作成
2. XcodeからInterface Builderを利用してUIをごにょごにょ
3. resoucesにxibファイルを配置
4. コードを弄る
5. rakeしてxibファイルからnibファイルを作成する

```ruby:app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    # このコードからnibファイルをよびだす
    @window.rootViewController = AboutViewController.alloc.initWithNibName("AboutViewController",
                                                                           bundle: nil)
    @window.rootViewController.wantsFullScreenLayout = true
    @window.makeKeyAndVisible
    true
  end
end
```

```ruby:about_view_controller.rb
class AboutViewController < UIViewController
  def viewDidLoad
    super
  end
end
```

そもそもxibファイルを配置するだけでは
Interface Builderで作成したUIをRubyMotionに反映させることはできなくって、
きちんとrubyファイルは作らないといかんのでした。
AOJの練習問題の挿入ソート

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_1_A

はい、練習問題？消化中です。

```py:a.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#from __future__ import print_function
import time
import sys
import io
import re
import math
#i = 0
N=int(raw_input())
l=map(int, raw_input().split())
print ' '.join(map(str, l))
for j in range(1,len(l)):
    key=l[j]
    i=j-1
    while i>=0 and l[i] > key:
       l[i+1]=l[i]
       i-=1
    l[i+1]=key
    print ' '.join(map(str, l)))

```

提出一回目はよくみておらず。ちょっともったいないミスを。
そろそろ毎日なにか書くことに無理を感じてきた。
smartinput で endwise ぽく Ruby の end を補完するルール定義


[endwise](https://github.com/tpope/vim-endwise) で実装されている正規表現パターンを参考に、[smartinput](https://github.com/kana/vim-smartinput) のルールを書き起こした。とりあえず Ruby のみ。

```vim
" module, class, def, if, unless, case, while, until, for, begin に対応する end を補完
call smartinput#define_rule({
\ 'at': '^\%(.*=\)\?\s*\zs\%(module\|class\|def\|if\|unless\|case\|while\|until\|for\|begin\)\>\%(.*[^.:@$]\<end\>\)\@!.*\%#$',
\ 'char': '<CR>',
\ 'input': '<CR>end<Esc>O',
\ 'filetype': ['ruby'],
\ 'syntax': ['rubyBlock']
\ })

" do に対応する end を補完
call smartinput#define_rule({
\ 'at': '\<do\ze\%(\s*|.*|\)\=\s*\%#$',
\ 'char': '<CR>',
\ 'input': '<CR>end<Esc>O',
\ 'filetype': ['ruby'],
\ 'syntax': ['rubyDoBlock']
\ })
```
tmlib.js + CoffeeScript での引数の処理の妙

CoffeeScriptは、引数を処理するときに名前付きにすることができますね。

```CoffeeScript
func1 = (args) ->
  console.log "#{args.msg} #{args.num}"

func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1, msg: 'hello') #-> "hello 1"
```

やってることは、結局 Hash になってるだけですが、関数呼び出しの時に CoffeeScript が空気読んでくれるから名前付きぽい呼び出し方に。

さらに、Hash の代入処理でも空気読むので…

```CoffeeScript
func1 = (args) ->
  {
    msg
    @num
  } = args
  console.log "#{msg} #{@num}"

func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1, msg: 'hello') #-> "hello 1"
```

なんてことも

これだと、引数に何が指定できるのか Hash だけどわかりやすい
必要なものを最初に全部書いておくようにすれば…だけど
ローカル変数も、インスタンス変数もできるし。便利。
（ただ、hash のキーは文字列なので、変数にできない文字列だと無理）

でもって、この次
それぞれの引数に初期値（デフォルト値）をつける。

```CoffeeScript
func1 = (args={}) ->
  {
    msg
    @num
  } = {
    msg: 'bye'
    num: 2
  }.$extend args

  console.log "#{msg} #{@num}"

func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1) #-> "bye 1"
```

これには、tmlib.js の $extend メソッドを使ってるけど、いろんなフレームワークで、似たような機能ありますね。
Hash をマージするメソッド。

```CoffeeScript
    msg: 'bye'
    num: 2
```

と、言う hash に args をマージするので、無ければ、デフォルト値として利用可能。

さらにさらに

tmlib.js には、AssetManager があるので…

```CoffeeScript
func1 = (args='assset.name') ->
  args = tm.asset.AssetManager.get(args) if typeof args == 'string'
  {
    msg
    @num
  } = {
    msg: 'bye'
    num: 2
  }.$extend args

  console.log "#{msg} #{@num}"

func1(msg: 'hello', num: 1) #-> "hello 1"
func1(num: 1) #-> "bye 1"
func1('hoehoe.asset') #-> hoehoe.asset の Asset オブジェクトで初期化
```

前に書いた、json ファイルの Asset化で、json Asset を指定するだけで、いろいろ引数のカスタマイズが可能に

その Asset のデフォルトもついでに用意

```CoffeeScript
ASSETS =
  'assset.name':
    _type: 'json'
    msg: 'bye'
    num: 2

func1 = (args='assset.name') ->
  args = tm.asset.AssetManager.get(args) if typeof args == 'string'
  {
    msg
    @num
  } = {}.$extend(ASSETS['assset.name']).$extend args
```

と言う感じにしてみました。面白い。
ASSETS を AssetManager でロードしておいても良いし、ロードしてなくても、デフォルト値はこれが利用される。
便利ぽい。



ただ、たまに引っかかるのが、Object.defineProperty で、setter が作成されてると @num とかに、代入したときに、もちろん setter が動く点。
もう、いろいろ大変。継承とかしてると、さらにどう動くのか…とか、たまに混乱の元。へふ～
yumモジュールでenablerepoを複数指定する場合の小ネタ


#正しい書き方
**(2013/12/07)[yteraoka](http://qiita.com/yteraoka)さんのご指摘で、正しい動作はこちらであることを確認しました。**
CLI上でのyum同様、リポジトリの指定はカンマ区切りとなります。

環境

```bash
$ ansible-playbook --version
ansible-playbook 1.4.1 (1.4.1 7bf799af65)
```

```
- name: Install Redis
  yum: pkg={{ item }} state=present enablerepo=remi,epel
  with_items:
    - redis #in remi
    - gperftools-libs #in epel dependency
    - libunwind #in epql dependency
    - libunwind-devel #in epel ??
```



#間違った書き方

**(2013/12/07)以下は掲載当初のもので間違った書き方です。使用しないでください。**

ansibleのyumモジュールで複数のリポジトリを指定する場合は以下のようにします。

```
- name: Install Redis
  yum: pkg={{ item }} state=present enablerepo=remi enablerepo=epel
  with_items:
    - redis #in remi
    - gperftools-libs #in epel dependency
    - libunwind #in epql dependency
    - libunwind-devel #in epel ??
```

コマンドラインからのyumと違うので注意が必要です。
コマンドラインだとカンマ区切りで指定できます。

```
$ yum install redis --enablerepo=remi,epel
```
第15回オフラインリアルタイムどう書くの参考問題 with ruby


オフラインリアルタイムどう書く
第15回(11月1日) http://atnd.org/events/43825
の、参考問題「回文の発掘」
http://nabetani.sakura.ne.jp/hena/ord15subpalin/
の実装例。

rubyで。

他の言語などの解答例は
http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230
から辿れます。

で。

```ruby
#!ruby

def solve_impl( s )
  return s.size if s.size<2
  return 2+solve_impl( s[1..-2] ) if s[0]==s[-1]
  last_ix = s.rindex( s[0] )
  [ solve_impl( s.drop(1) ),
    case last_ix
    when 0; 0
    when 1; 2
    else; 2+solve_impl( s[1,last_ix-1] )
    end ].max
end

def solve( s )
  solve_impl( s.chars ).to_s
end

$stdout.sync=true

DATA.each do |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual==expected;
  puts "%s %s->%s ( %s )" % [ ok ? "ok" : "***NG***", src, actual, expected ]
end

__END__
0 I_believe_you_can_solve 9 evo_n_ove
1 a 1 a
39  8086_6502_6809_Z80  11  8086_2_6808
40  xcode_visualstudio_eclipse  11  ce_iutui_ec
41  word_excel_powerpoint_outlook 9 ol_opo_lo
42  abcdefghijklmnopqrstuvwxyz0123  1 3
```

いつも通り、テストデータの大半は省略。

概ね順当な実装のつもりの再帰。

ただ、何もしないと遅くなりすぎるので、両端が同じなら迷わず利用するというコード
`  return 2+solve_impl( s[1..-2] ) if s[0]==s[-1]`
を入れて高速化を目論んでみた。
これを入れるとかなり速くなるんだけど、計算量のオーダーはよくわからなくなる。
Image#drawとset_colorの関係 - RubyKokuban Memo


mrubyを使ってインタラクティブアプリケーションを作ることが出来ます。
インストール方法は[こちら](https://github.com/ongaeshi/rubykokuban-gem)をどうぞ。 → [[最新記事]](http://ongaeshi.hatenablog.com/entry/rubykokuban-image)

Image#drawの際はset_colorも合わせて設定する必要があるので注意して下さい。(openFrameworksの特性をそのまま引き継いでいます。)
set_colorで設定された色と **乗算** された結果で描画されます。

```ruby
def draw
  @image ||= Image.load("sample.png")
  set_color(0, 255, 255)
  @image.draw(0, 0)
end
```

サンプルではset_color(0, 255, 255)のため、R成分が0になった状態で描画されます。

```
$ kokuban exec image002.rb
```

表示されました。

![image002.png](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20131020/20131020174011.png)

## 目次
- [RubyKokuban Memo - 目次](http://ongaeshi.hatenablog.com/entry/rubykokuban-memo)
ansibleでselinux=enforcingかつ/etc/sysconfig/iptablesを直接変更したあとにはrestoreconを実行すべき。


環境  ```CentOS 6.4 64bit```

ポート80番で動くWebサーバへのアクセスを許可するために、以下のようにiptablesへの修正を直接行う時の注意です。

```
- name: insert iptables rule
  lineinfile: dest=/etc/sysconfig/iptables state=present regexp="80"
              insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport 80 -j ACCEPT"

- name: restart iptables
  service: name=iptables state=restarted
```

iptablesの再起動で失敗し、以下のようになりました。
メッセージにはPermission deniedとでましたが、パーミッションは変更していません。

```
failed: [192.168.0.108] => {"failed": true, "item": ""}   
msg: Can't open /etc/sysconfig/iptables: Permission denied
```

実際にSSHでアクセスして、実行しても同じ結果になります。

```bash
# service iptables restart
Can't open /etc/sysconfig/iptables: Permission denied
```

パーミッションは前と同じなのにパーミッションで拒否となると怪しいのはselinuxなので、selinuxの稼働状況とselinuxのラベルを確認します。

```bash
# getenforce 
Enforcing #稼働状態
# ls -Z /etc/sysconfig/iptables
-rw-------. root root unconfined_u:object_r:user_tmp_t:s0 /etc/sysconfig/iptables
```

ラベルで```user_tmp_t```となっているところがあります。
次のコマンドでselinuxのラベルを元に戻します。(2014/04/25修正)

```bash
# restorecon /etc/sysconfig/iptables
-rw-------. root root unconfined_u:object_r:system_conf_t:s0 /etc/sysconfig/iptables
```
これで実行できるようになります。

```bash
# service iptables restart
iptables: Applying firewall rules:                         [  OK  ]

```


ただ、そもそも論としてansibleで/etc/sysconfig/iptablesを直接編集するよりコマンド実行したほうが良いかもしれません。
SpriteKit入門 -8-

前回、岩が次々に落ちてくるようにしましたが、
画面から消えた岩は表示はされませんが、
削除はされていないので物理計算は実行されてしまっています。
ですので、徐々に岩の物理計算でCPUに負荷がかかってしまいます。

画面から見えなくなった岩を削除するために下記のメソッドを実装します。
didSimulatePhysicsメソッドは物理計算が終わった後に呼ばれます。

```objectivec:SpaceshipScene.m
- (void)didSimulatePhysics
{
    [self enumerateChildNodesWithName:@"rock" usingBlock:^(SKNode *node, BOOL *stop) {
        if (node.position.y < 0) {
            [node removeFromParent];
        }
    }];
}
```

今回はここまで。
SpriteKit入門 -7-


newSpaceshipメソッドに下記の記述を追加します。

```objectivec:SpaceshipScene.m
hull.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hull.size];
```

実行すると、スプライトが重力により下に落ちていきます。

![実行結果](https://lh3.googleusercontent.com/-YRoMxqUCKAU/UmaGvThHq4I/AAAAAAAAAeQ/cL_FUNUXa2A/w498-h648-no/spritekit_016.jpg "実行結果")

newSpaceshipメソッドに下記の記述を追加してみます。

```objectivec:SpaceshipScene.m
hull.physicsBody.dynamic = NO;
```

すると、スプライトは重力の影響を受けなくなります。

createSceneContentsメソッドに下記の記述を追加します。
シーンもノードなのでアクションを実行できます。
addRockメソッドを繰り返し呼び出すアクションです。

```objectivec:SpaceshipScene.m
	SKAction *makeRocks = [SKAction sequence:@[
		[SKAction performSelector:@selector(addRock) onTarget:self],
		[SKAction waitForDuration:0.10 withRange:0.15]]];
	[self runAction:[SKAction repeatActionForever:makeRocks]];
```

addRockメソッドを実装します。
岩をシーンに追加します。
衝突も検出するので、岩と灰色のスプライトがぶつかる様子が見れます。

```objectivec:SpaceshipScene.m
static inline CGFloat skRandf() {
    return rand() / (CGFloat)RAND_MAX;
}

static inline CGFloat skRand(CGFloat low, CGFloat high) {
    return skRandf() * (high - low) + low;
}

- (void)addRock
{
    SKSpriteNode *rock = [[SKSpriteNode alloc] initWithColor:[SKColor brownColor] size:CGSizeMake(8,8)];
    rock.position = CGPointMake(skRand(0, self.size.width), self.size.height-50);
    rock.name = @"rock";
    rock.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rock.size];
    rock.physicsBody.usesPreciseCollisionDetection = YES;
    [self addChild:rock];
}
```

実行するとこんな感じです。

![実行結果](https://lh4.googleusercontent.com/-BI5zN5G3pgI/UmaLCIBV8CI/AAAAAAAAAew/mWYl-we5O9s/w498-h648-no/spritekit_017.jpg "実行結果")

今回はここまで。