OmniAICreator/Qiita-1.07M huggingface dataset:
AmazonLinuxにおいてX ForwadingでJMeterを動かしてみる

EC2でJMeter動かしたら性能測定しやすいかなと思って試してみる

## やった手順
 * EC2インスタンス(micro、64bit)作成
 * X Forwading準備

```bash
$ sudo yum -y update
$ sudo yum -y install xorg-x11-xauth xorg-x11-server-utils
$ exit
```

 * ~/.ssh/configの該当ホストにForwardX11 yesを追加しておく

```bash
例:
Host *.compute.amazonaws.com
  Port 22
  IdentityFile ~/.ssh/aws.pem
  User ec2-user
  ForwardX11 yes 
```

 * JMeter起動

```bash
$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//jmeter/binaries/apache-jmeter-2.9.tgz
$ tar xvfz apache-jmeter-2.9.tgz
$ sh apache-jmeter-2.9/bin/jmeter.sh
```
 * 結果
  * 一応JMeterのGUIが表示される
  * microインスタンスなせいか凄いもっさい
注意！e1071のsvmでLOOCVやったとき、accuraciesの順番はランダム

最近気づいたんですが、e1071 パッケージの svm で LOOCV やったときの accuracies ってサンプルの順番を保存しているわけではなくて、ランダムなんですね。

```r
data(iris)

library(e1071)
k <- nrow(iris)
# cross 引数を使って LOOCV を行う
model1 <- svm(Species ~ ., data=iris, cross=k)
# 各サンプルの判別結果は accuracies でわかる（100:判別成功、0:誤判別）
accs1 <- model1$accuracies / 100

# LOOCV を自分でやってみる
accs2 <- integer(k)
for(i in seq_along(accs2)) {
  model2 <- svm(Species ~ ., data=iris[-i, ])
  pred <- predict(model2, iris[i, ])
  accs2[i] <- pred == iris$Species[i]
}
# 各サンプルの判別結果は accs2

# accs1 と accs2 は一致しているはずだが・・・
table(accs1, accs2)
```

```:結果
     accs2
accs1   0   1
    0   0   5
    1   5 140
```
結果は異なる！
ちなみに、model1 を何度作成しなおしても、accuracies の順番は変わりません。
なので、accuracies の順番はサンプルの順番だと誤解してしまう人がいるのではないでしょうか？

モデルを作成する際に、seed を指定してみると、

```r
model3 <- svm(Species ~ ., data=iris, cross=k, seed=123)
accs3 <- model3$accuracies / 100
table(accs1, accs3)
```

```:結果
     accs3
accs1   0   1
    0   0   5
    1   5 140
```
accuracies の順番が異なるようになりました！
つまり、LOOCV するときだけ、なんらかの原因で seed が固定されるということのようです。
要注意ですね～。
Ruby (MRI) における 4、それは

ときどき

```
blog.author_id #=> 4
```

あれ、author_id 4 なんて存在しないのになんで 4 が入ってるんだろ、というような挙動に出くわすことがあります。

これは、

```
blog.author_id = author.id
```

のようなコードがあり、validation が書かれていないと、Ruby (MRI 1.8)の場合

```
[1] pry(main)> RUBY_VERSION
=> "1.8.7"
[2] pry(main)> nil.id
(pry):2: warning: Object#id will be deprecated; use Object#object_id
=> 4
```

という挙動になってしまいます。そのため author が nil なら 4 が代入されてしまうわけです(Rails なら whiny_nils を設定することで防げます)

Ruby 1.8 を新規開発で使うことはいまさら無いとは思いますが、一時期 1.8 を使っていた場合、場合により 4 が入っていることもあるので、みなさん気をつけましょう。

Ruby (現状の MRI) における 4。それは nil の object_id の値でした。

ちなみに、facebook における id = 4 はマーク・ザッカーバーグです！

- https://graph.facebook.com/4
コマンドラインからWiFiをオンオフする

http://d.hatena.ne.jp/kinneko/20121011/p1
↑これを再編集したものです。

　まぁ、あれだ、マウスもキーボードもないAndroidドングルだと、adbのコマンドラインからWiFiをオンオフしたいということもあるじゃないか。

　いままでは、無線の設定画面を開いて、リターンを送るなどというどんくさい方法でやっていた。

> $ am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
> $ input keyevent 66

　これでも用事は足りるのだけど、この手は/dev/inputがあるシステムでないと使えない。

　もっといい方法があった。

　オンにする。

> $ svc wifi enable

　オフにする。

> $ svc wifi disable

　svcコマンドでは、他に何ができるのだ？

> $ svc help
> Available commands:
> help Show information about the subcommands
> power Control the power manager
> data Control mobile data connectivity
> wifi Control the Wi-Fi manager

　電源管理、回線制御、無線LAN制御ができるようだ。

　システムの環境によっては、root権限でないと動作しないかもしれないけどね。
Ubuntu Serverで、コンソールがブラックアウトしちゃうのを抑止する

http://d.hatena.ne.jp/kinneko/20121018/p1
↑こいつの結論を整理したものです。

テスト環境：Ubuntu Server 12.04.1

　UbuntuServerを実機や仮想マシンにインストールした時に、コンソールがスリープに入ってブラックアウトしてしまうのはめんどくさいものです。特に、キーボードが接続されていないようなサーバー用途やヘッドのみで運用するラインで使うシステムなどでは、ちょっと状態を確認したい場合に致命的だったり。

　setterm、/etc/kbd/config、console-toolsなどを試してみましたが、いずれもうまくいきませんでした。

　kernelのbootoptionに *"consoleblank=0"* を渡してやると解決できます。

　設定結果は、"/sys/module/kernel/parameters/consoleblank" で確認できます。

何もしないと、デフォルトは600秒=10分です。

> $ cat /sys/module/kernel/parameters/consoleblank
> 600

*"consoleblank=0"* を設定すると、こんな感じにゼロになります。

> $ cat /sys/module/kernel/parameters/consoleblank
> 0
Javaでオブジェクトの集合を扱う

Javaにはリストやセット、マップなどのオブジェクトの集合を扱う仕組みがあります。
それぞれの特徴と使用例は以下のようになります。

## ArrayList (リスト)
ArrayListは一般的な配列を表します。

```java
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

String x = list.get(1);
System.out.println("Bを出力:" + x);

for (int i = 0; i < list.size(); i++) {
	// A, B, C
	System.out.println(list.get(i));
}

if (list.contains("A")) {
	System.out.println("値にAが含まれていれば呼び出される");
}

// 全ての要素を削除する
list.clear();
```

LinkedListもArrayListと同じように使うことができます。LinkedListは挿入や削除を頻繁に行う場合はArrayListよりも高速です。しかし、get()を使う場合はArrayListの方が高速です。

## HashSet (セット)
HashSetは要素の重複が許されない、順序の保証がない配列を表します。

```java
HashSet<String> set = new HashSet<String>();
set.add("A");
set.add("B");
set.add("C");

Iterator it = set.iterator();
while (it.hasNext()) {
    // A, B, C 順不同
	System.out.println(it.next());
}

if (set.contains("A")) {
    System.out.println("値にAが含まれていれば呼び出される");
}

// 全ての要素を削除する
set.clear();
```

TreeSetもHashSetと同じように使うことができます。TreeSetは要素が自動的にソートされるのが特徴です。

### 注意点
大量のデータを扱う時はArrayListよりHashSetの方が処理を高速に行えます。

## HashMap (マップ)
HashMapはキーと値の組み合わせの連想配列を表します。

```java
HashMap<String, String> map = new HashMap<String, String>();
map.put("AL1", "A");
map.put("AL2", "B");
map.put("AL3", "C");

String x = map.get("AL1");
System.out.println("Aを出力:" + x);

Iterator it = map.keySet().iterator();
while(it.hasNext()) {
	String key = (String)it.next();
    // AL1:A, AL2:B, AL3:C 順不同
	System.out.println(key + ":" + map.get(key));
}

if (map.containsKey("AL1") || map.containsValue("A")) {
	System.out.println("キーにAL1か値にAが含まれていれば呼び出される");
}

// 全ての要素を削除する
map.clear();
```

TreeMapもHashMapと同じように使うことができます。TreeMapは要素がキーによって自動的にソートされるのが特徴です。
並行性と並列性についてオレオレ定義してみる

並行性と並列性の違いについて調べていたら、ググってみるとなんか誤解のある内容のブログがトップに引っかかって来たりして、なんでだろう？と思ってたら

http://docs.oracle.com/cd/E19683-01/816-3976/mtintro-6/index.html

オラクルさんのサイトで誤解がありそうな内容。元ネタはここらしい。

というわけで並行性と並列性についてオレオレ定義をしてみることにします。

まず、オラクルさんの誤解がどういうことかということを説明すると、

> マルチスレッドプロセスがシングルプロセッサ上で動作する場合は、プロセッサが実行リソースを各スレッドに順次切り替えて割り当てるため、プロセスの実行状態は並行的になります

並行性ということはシングルプロセッサで動作することを規定しているわけではないと思っています。
オレオレ解釈では、並行性というのは並行動作をすることができるプログラムの状態そのもので、スレッドという仕組みがまさに並行性をプログラムに与えるための仕組みだと思っています。なのでオレオレ定義で並行性を定義するなら、

> ## 並行性
> プログラム中の複数の処理ブロックが論理的に並行動作可能な状態。それぞれの処理ブロックは処理順序に関係なく実行することができ、共有するリソースの競合を回避することができる。

という感じでしょうか。スレッドはこの条件を満たすためのプログラム言語上の仕組みということが言えます。

では並列性とは、何でしょう？

並列性というのは、並行性をもつプログラムがマルチプロセッサやマルチコアのプロセッサによって時間的に並列で動作することです。なので、オレオレ定義では

> ## 並列性
> 並行性をもつプログラムが時間的に同時に動作することが出来る複数のプロセッサによって並列に実行される状態

といえます。
オレオレ定義なので言葉の定義の厳密性はあんまり突っ込まないでほしいと思います。
vagrant

## VirtualBoxのインストール
https://www.virtualbox.org/wiki/Downloads

## vagrantをインストールして、UbuntuのVMを立ち上げる
```bash
$ sudo gem install vagrant
$ vagrant box add ubuntu http://opscode-vagrant-boxes.s3.amazonaws.com/ubuntu10.04-gems.box
$ vagrant init ubuntu
$ vagrant up
```
ここまでできた。

box の URLは http://www.vagrantbox.es/ 参照

で、問題は

```bash
$ vagrant ssh
```

でパスワードが求められる。
どうすればいい？ ？
と思ったら、"vagrant"でいけました。
PHPでMsgPackでキャッシュする

すでに皆さんのset_include_pathあるいはcomposer.jsonに記述されてるZend Frameworkを使います。

``` php
<?php

$storage = Zend\Cache\StorageFactory::factory(array(
                'adapter' => array(
                    'name' => 'Filesystem',
                    'options' => array('cache_dir' => __DIR__.'/cache')
                ),
                'plugins' => array(
                    'serializer' => array(
                        'serializer' => 'Zend\Serializer\Adapter\MsgPack'
                    )
                ),
            ));

$storage->setItem('foo', 'bar');

```

PHPで実行することによりignore_user_abort()もごくごく自然に組み合わせられます。

``` php
<?php
$storage->addPlugin(new Zend\Cache\Storage\Plugin\IgnoreUserAbort);
```
Chefのtemplateにrecipeからデータを渡すvariablesについて

> 検証環境
> Chef v11.4.0

Chefにて、同じcookbookを使い、異なった複数の値を与えて
結果を異なったファイルに出力する場合は、**variables**を利用する。

当初、この課題に対する解決方法として、
複数の _role_ を作成し、その *role* 内で異なった値をJSONに入れることにより
実現できると思い込んでいたのだが、run_listでは複数のrecipeとして理解されず、
複数のroleで同じcookbookを利用した場合には後者のみが採用され、
最初に読み込まれた *role* は認識されなかった。

## variablesを利用したレシピをみていこう

JSONには **ports** というkeyに対して、"6379"と"6380"という複数のvalueをもたせる

```redis.json
{
    "redis": {
       "ports": [
         "6379", "6380"
       ]
    },
   "run_list": [
      "recipe[redis]"
   ]
}
```

recipe内で
`ports.each do |port|`と分解して実行するように記述する
また、わかりづらいのだが

```
    variables({
      :port => port
    })
```

このように *port* 、この場合でいえば "6379" 、 "6380" の値を
**@port** に代入している。

```/redis/cookbook/recipe/default.rb
 
package "redis"
 
### 色々
 
directory "/etc/redis" do
  owner "redis"
  mode  0644
end
 
ports.each do |port| ### portsを分解して実行させる
 
  template "/etc/redis/#{port}.conf" do
    owner "root"
    mode  0644
    source "redis.conf.erb"
 
    variables({
      :port => port  ### ここで代入している
    })
  end
 
end
```

template内で、代入された **@port** を利用する 

```cookbooks/redis/templates/default/redis.conf.erb
 
pidfile /var/run/redis_<%= @port %>.pid
 
port <%= @port %>
logfile /var/log/redis/redis_<%= @port %>.log
dir /var/lib/redis/<%= @port %>
```

上記内容の結果、出力ファイルとして

```/etc/redis/6379.conf
pidfile /var/run/redis_6379.pid
 
port 6379
logfile /var/log/redis/redis_6379.log
dir /var/lib/redis/6379
```

```/etc/redis/6380.conf
pidfile /var/run/redis_6380.pid
 
port 6379
logfile /var/log/redis/redis_6380.log
dir /var/lib/redis/6380
```

期待した通り、複数のvalueを受け取り
それぞれ異なったファイルに出力されることが確認できた。

もう少しエレガントな方法があるように思うので
他の方法などがあれば、是非是非コメントを頂きたい。
NSDateFormatter ローカライズされた各種日付情報の取得


NSDateFormatterを使用すると各ロケールに対応するローカライズされた各種日付情報が取得出来ます。
曜日に関するメソッドを例に上げると

	– weekdaySymbols
	– shortWeekdaySymbols
	– veryShortWeekdaySymbols
	– standaloneWeekdaySymbols
	– shortStandaloneWeekdaySymbols
	– veryShortStandaloneWeekdaySymbols	

のように様々なパターンが用意されています。

日本語(ja)と英語(en)はこんな感じです。

	– weekdaySymbols
		日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日 
		Sunday Monday Tuesday Wednesday Thursday Friday Saturday

	– shortWeekdaySymbols
		日 月 火 水 木 金 土
		Sun Mon Tue Wed Thu Fri Sat 

	– veryShortWeekdaySymbols
		日 月 火 水 木 金 土 
		S M T W T F S 

すべての[ISO言語コード(Wiki)](http://ja.wikipedia.org/wiki/ISO_639)に対応するローカライズされた曜日を表示するサンプルです。

```objectivec:Sample.m
- (void)log
{
	for (NSString *lang in [NSLocale ISOLanguageCodes]) {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        df.locale = [[NSLocale alloc] initWithLocaleIdentifier:lang];
        NSMutableString *allWeekday = [NSMutableString string];
        for (NSString *weekday in df.weekdaySymbols) {
            [allWeekday appendFormat:@"%@ ", weekday];
        }
        NSLog(@"%@ -> %@", lang, allWeekday);
		// ログ抜粋
		// ja -> 日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日
		// en -> Sunday Monday Tuesday Wednesday Thursday Friday Saturday
    }
}
```
XHR2でクロスドメイン通信する際のサーバ側の設定


APIなどを提供しているサーバサイドにいくつかHeaderの設定が必要。
かつ、JSでのリクエストも少しHeaderをいじる必要がある。

##サーバサイド

###Apache

```.htaccess
Header append Access-Control-Allow-Origin *
Header append Access-Control-Allow-Headers Content-Type
```

###nginx
```setting.conf
location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
        add_header 'Access-Control-Allow-Method' 'GET, POST, OPTIONS, PUT, DELETE';
}
```

##クライアントサイド

###JavaScript

モダンブラウザであれば、特に意識することなく通信できる。

```XHR.js
var xhr = new XMLHttpRequest();

xhr.open('POST', 'http://hoge.com/', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

xhr.send('hoge=fuga');
```

####for IE8

IE8はクロスドメイン通信用に`XMLHttpRequest`の代わりに`XDomainRequest`というオブジェクトを用意しているので、そちらを使う必要がある。

ただ、jQueryなどのライブラリを使っている場合は若干分岐がめんどくさいので、下記の記事を参考にラッパーオブジェクトを作り、さらにjQuery.ajaxで使われるように設定してやるといい。

参考: [IE8+jQueryによるクロスドメイン通信とXDomainRequestラッパーの作成](http://www.netagent-blog.jp/archives/51509761.html)

```XHR.js
if( window.XDomainRequest ){
    var xdr = new XDomainRequest();
    xdr.onerror = function(){
        alert( "error" );
    }
    xdr.onload = function(){
        alert( xdr.contentType + "\n" + xdr.responseText );
    }
    xdr.open( "get", "http://remote.example.com/data.txt" );
    xdr.send( null );
}
```
リスト内に特定の要素があるかでif分岐

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

#とりあえずの適当なリスト
list = ['dog', 'cat', 'bird']

#分岐条件にしたい要素
a = 'dog'

"""
a in listが真(listの中にaの要素が含まれている)ならifが実行されて、偽ならelseが実行される。
a not in listとも書けてlistの中にaが含まれていない場合が真になる。
"""
if a in list:
    print 'if_do'
else:
    print 'else_do'
```
ステータスバーを隠してから透過設定してもうまくいかない？

まず透過の設定（フルスクリーン）やってからだとうまくいった。
そういうもの？

※ その他の処理が影響している可能性もあるが、そこまで調査していない。

```objectivec:だめだった
- (void)viewDidLoad
{
	[super viewDidLoad];
	
	[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
	
	self.wantsFullScreenLayout = YES;
	[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
	//…
}
```

```objectivec:うまくいった
- (void)viewDidLoad
{
	[super viewDidLoad];
	
	self.wantsFullScreenLayout = YES;
	[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
	
	[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
	//…
}
```

ちなみに statusBarHidden は画面タップ等で切り替わる。
sed でグリッチ画像を作成する

よく知られている通り、JPEG フォーマットの画像は比較的堅牢で、多少壊れたデータでも一般的なビュワーで表示することができます。
その性質を利用して `sed` コマンドを使って簡単にグリッチ画像を作成する方法を紹介します。

```sh:terminal
$ sed "s/x/y/g" original.jpg > glitch.jpg
```

以下は上記のコマンドを適用した例です。上の画像を下の画像に変換することができました。

![](http://dl.dropbox.com/u/3140330/original.jpg)
![](http://dl.dropbox.com/u/3140330/glitched.jpg)

簡単ですね。
NSFileManager の fileExistsAtPath: は壊れた symlink に対して NO を返す

NSFileManager の fileExistsAtPath: は壊れたシンボリックリンクに対して NO を返す。
そういう場合も YES が欲しければこんな感じで。

```objc
#import <sys/stat.h>

+ (BOOL)fileExistsAtPath:(NSString*)path
{
    struct stat st;
    int result=lstat([path fileSystemRepresentation], &st);
    return result==0;
}
```

このコードにはエラーの種類に関わらずエラーが発生すると NO になる罠があるよ！
LSUIElement を変更せずに Dock アイコン表示を切り替え

Info.plist の <code>LSUIElement</code> を変更せずに Dock のアイコン表示を切り替える方法。
<code>LSUIElement=YES</code> にして基本は非表示にしておき、設定を見て切り替える。

```objc
- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    //show in dock
    if ([[NSUserDefaults standardUserDefaults]boolForKey:@"showDockIcon"]) {
        ProcessSerialNumber psn = { 0, kCurrentProcess };
        TransformProcessType(&psn, kProcessTransformToForegroundApplication);
    }
}
```

ちなみに逆の挙動も可能。つまり <code>LSUIElement=NO</code> にしておいて、Dock に表示させない場合に <code>kProcessTransformToUIElementApplication</code> で呼ぶ。これでも機能はするが、一瞬 Dock に現れかけて消えるのでやめておいた方がよい。
AWSのセキュリティグループに未登録のCIDRだけ追加するスクリプト

特定のリージョンのサーバを全部登録したいが、一部は既に追加済みなので未登録分を一括登録したくて書いた使い捨てスクリプトです。

当初AWS SDK for Rubyを使って書こうとしたのですが、セキュリティグループ内の許可済みCIDR一覧がなぜかうまくとれなかったので、てっとり早くec2-*コマンドを使って実装しています。rubyを使っているのは、CIDRの配列の差分を中間ファイルを作らずに計算したかったからです。

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

SG_NAME = 'SSH'
PROTOCOL = 'tcp'
PORT = 10051

def records(command)
  IO.popen(command) do |io|
    io.readlines.map do |line|
      line.chomp!
      line.split("\t")
    end
  end
end

def ip_permissions(sg_name, protocol, min_port, max_port=nil)
  max_port ||= min_port
  records("ec2-describe-group").select do |fields|
    fields[0] == 'PERMISSION' && fields[2] == sg_name &&
    fields[4] == protocol &&
    fields[5].to_i == min_port && fields[6].to_i == max_port &&
    fields[8] == 'CIDR'
  end
end

def public_ip_addresses(region)
  records("ec2-describe-instances --show-empty-fields --region=#{region}").
      select{|fields|fields[0]=='INSTANCE'}.map{|fields|fields[16]}
end

granted_cidrs = ip_permissions(SG_NAME, PROTOCOL, PORT).map{|fields|fields[9]}

ec2_tokyo_region = 'ap-northeast-1'
target_cidrs = public_ip_addresses(ec2_tokyo_region).map{|ip|"#{ip}/32"}

diff_cidrs = target_cidrs - granted_cidrs
auth_cmd = "ec2-authorize #{SG_NAME} -P #{PROTOCOL} -p #{PORT} %s" %
    diff_cidrs.map{|cidr| "-s #{cidr}"}.join(' ')
records(auth_cmd).each do |fields|
  puts(fields.join("\t"))
end
```
herokuで独自ドメイン


# 1. herokuのカスタムドメイン機能を使う方法

### ドメイン追加

コマンドラインからなら

	$ heroku domains:add hoge.mydomain.com


### DNSレコード変更

#### サブドメインを割り当てる場合
	cname hoge hoge.herokuapp.com.

#### すべてのドメインを割り当てる場合
	cname @ hoge.herokuapp.com.
	
**注意** 　最後のピリオド忘れずに！！！！
[Easy Setup for VALUE DOMAIN Users ](http://setup.value-domain.com/index.php?p=websrv)


以上でできるはず。

---


# 2. zerigo-dnsアドオンを使う方法

### アドオン追加

コマンドラインからなら

	$ heroku addons:add zerigo_dns:basic
	Installing zerigo_dns:basic into myapp...done.


### ドメイン追加

コマンドラインからなら

	$ heroku domains:add mydomain.com


### ネームサーバー変更

以下の５つを設定。

	a.ns.zerigo.net
	b.ns.zerigo.net
	c.ns.zerigo.net
	d.ns.zerigo.net
	e.ns.zerigo.net

[Herokuアプリに独自ドメインを割り当てる(VALUE-DOMAIN編)](http://qiita.com/items/e60e9c71108ac48559de)


### DNSレコード設定
以下にアクセスし、configureをクリックし、DNSレコードの設定をする。（`yourappname`は自分のherokuアプリの名前）
https://api.heroku.com/myapps/`yourappname`/addons/zerigo_dns:basic

**注意**
zerigo-dnsアドオンのbasicプランではサブドメイン指定しかできない（ワイルドカード指定ができない）ので注意。有料ならできる。
Rubyでのハマりポイント


俺的ハマリポイントをつらつらと記録していきます。
ハマり次第追記していきます。
適宜ツッコミをよろしくお願いいたします！

------------------------------------

# invalid multibyte char (US-ASCII) (SyntaxError)

これは、ソースファイルに日本語が含まれる場合のエラー。
該当ソースファイルの先頭に以下のおまじないを追加

```ruby:
# -*- coding: utf-8 -*-
```

[Ruby 1.9上のRailsでinvalid multibyte char (US-ASCII)の対処](http://d.hatena.ne.jp/kaorumori/20110623/1308848676)

------------------------------------

# odd number list for Hash (SyntaxError)

このエラーがSyntaxエラーが原因じゃないときは、Rubyのバージョンを疑った方がいい。
[これからRubyを始めるためにやったことメモ3（miからRubyの最新版が呼べない）](http://d.hatena.ne.jp/honeniq/20120415/1334500216)

```
$ rvm use 1.9.2 --default
```

1.8.xの時にエラーが出てた。なので新しいバージョンにセットしてやる。（なぜか戻っちゃうことがあるんだけどなぜ？）

------------------------------------

# NameError - uninitialized constant Object::Something

これは、Rubyの規則があるらしくって、「モデルの名前は単数系にするべきだという、Railsの規約を守っていなかっただけ」で出るらしい。先頭大文字にしてもダメだった。Ruby奥深いよRuby。
[Railsメモ：多対多の関連を利用したときにNameError: uninitialized constant](http://stonhair.blogspot.jp/2011/10/railsnameerror-uninitialized-constant.html)


------------------------------------

# syntax error, unexpected tIDENTIFIER, expecting keyword_end (SyntaxError)

コメントアウトを間違えて `//` にしたら出た。 `#` にしたら直った。

[他の言語に慣れた人がRubyを使ったときにつまずきがちな点](http://paulownia.hatenablog.com/entry/20120127/1327671167)


------------------------------------

# blockとかProcとかlambdaとかなによ
[Rubyのblock、Proc、lambdaを理解する](http://d.hatena.ne.jp/shunsuk/20090101/1230816826)


------------------------------------

# データの永続化が出来ない
[HerokuでRubyしてみてわかったこと](http://blog.livedoor.jp/maru_tak/archives/51251643.html)


------------------------------------

# no such file to load -- config (LoadError)

```
13:18:40 web.1  | web.rb:3:in `require': no such file to load -- config (LoadError)
```

パスを明示化しないといけない。この場合だと、

```	
$ require 'config'
```

を

```
$ require './config'
```

------------------------------------

# なんかよくわからんとこでLoadErrorとかでる
rubyのバージョンが古い可能性なので新しくする。

```
$ ruby --version
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10]

$ rvm use 1.9.2 --default
```
`--default`オプションをつけるとデフォルトでそのバージョンになる。

------------------------------------

# heroku 参考集

- [HerokuでWebアプリ開発を始めるなら知っておきたいこと (6)ステージング環境](http://blog.ruedap.com/entry/20110504/ruby_heroku_web_app_development_tips_6)
- [HerokuでWebアプリ開発を始めるなら知っておきたいこと (5)環境変数ENV](http://blog.ruedap.com/entry/20110503/ruby_heroku_web_app_development_tips_5)

------------------------------------
# bundle install 関連

```
$ bundle install
Resolving dependencies...
Your Gemfile has no remote sources. If you need gems that are not already on
your machine, add a line like this to your Gemfile:
    source 'https://rubygems.org'
Could not find gem 'capistrano (>= 0) ruby' in the gems available on this machine.
```

`bundle install`で`Could not find gem `と怒られたら、
`Gemfile`の先頭に下記を追加。

```Gemfile
source 'https://rubygems.org'
```
HerokuのGitリポジトリと別のリモートGitリポジトリを関連付ける


手順としては下記のようにやればよい。
[Heroku にある Git リポジトリを楽に remote に設定する](http://qiita.com/items/2ad2826329abeb49dfa2)


1. リモートリポジトリから`git clone`
2. heroku app作成
3. herokuのリモートリポジトリも追加する

```
$ git remote add heroku git@heroku.com:APPNAME.git
```

または

```
$ heroku git:remote --app APPNAME
```

以降、`push`したいときは以下のようにする。

``` herokuにpushしたい場合
$ git push heroku master
```

``` 別のリモートリポジトリにpushしたい場合
$ git push origin master
```



--- 

ここで、個人的に間違った手順でいままでやっていたことに気づく…

### やらかしたこと：

1. リモートリポジトリから`git clone`
2. ローカルリポジトリで`.git`以下を消去して
3. `git init`してherokuに`push`してた

なので、herokuともう一個別のリモートリポジトリも使うための方法を探ったら以下のようになった。ちなみにリモートリポジトリがbitucketの場合。

```
$ git remote add origin git@bitbucket.org:YOUR_ACCOUNT/REPOSITORY.git
```


## 参考

[ローカルの既存のgitリポジトリをbitbucketに放り込む方法](http://mugijiru.seesaa.net/article/228914090.html)
[git remote 使い方](http://transitive.info/article/git/command/remote/)


---

# リモートのリポジトリを変更したい場合

リモートのリポジトリ名を変更したい場合（そんなケースある？）は下記のとおりに。

```
$ git remote
hoge
origin

#リモートリポジトリ hoge から fuga に変更
$ git remote rename hoge fuga
$ git remote
fuga
origin
```

リポジトリ名はそのままにしたくてリポジトリのURLを変更したい場合は、結局よくわからなくて一旦削除してから追加したらできた。（もっといいやりかたあったら教えてください…）

```
$ git remote -v

hoge  git@hoge.com:hoge.git (fetch)
hoge  git@hoge.com:hoge.git (push)
origin  git@abc.org:xyz/hoge.git (fetch)
origin  git@abc.org:xyz/hoge.git (push)

#リモートリポジトリを一旦削除して、fuga.git を追加
$ git remote rm hoge
$ git remote add hoge git@hoge.com:fuga.git
$ git remote -v

hoge  git@hoge.com:fuga.git (fetch)
hoge  git@hoge.com:fuga.git (push)
origin  git@abc.org:xyz/hoge.git (fetch)
origin  git@abc.org:xyz/hoge.git (push)
```
配列の ｎ 個目以降を取得


ってどうやるのかなぁと思ったら教えてモラタ

```ruby
[1] pry(main)> [1,2,3,4,5][1..-1]
=> [2, 3, 4, 5]
```
すごい！！！
`1..-1` とか `Range` としておかしそうなのに！！
Ruby すごい！！

ちなみに

```ruby
[2] pry(main)> [1,2,3,4,5][10..-1]
=> nil
```

`nil` 帰ってくることあるから気をつけてねと教わりました！！

<ins>追記</ins>
Rails というか ActiveSupport では 

```ruby
[1] pry(main)> [1,2,3,4,5].from(1)
=> [2, 3, 4, 5]
[2] pry(main)> [1,2,3,4,5].from(10)
=> []
```
というのがあると教えてもらいますた！！！
こちらは範囲外では空配列返ってくるんですね！！

```ruby
def from(position)
  self[position, length] || []
end
```

コードみたらこんなでした！！

Rails 凄い！！ 驚き最大限！！！
GitHubをMercurialで使う


Mercurialのhg-gitエクステンションを使うと、GitHub上のリポジトリをMercurialのリポジトリに変換して使うことができる。


## 準備

### Mercurialのhg-gitエクステンションをインストール

```
hg clone https://bitbucket.org/durin42/hg-git
cd hg-git
sudo python setup.py install
```

### ~/.hgrc にプラグインを追加

```
[extensions]
hggit = /Library/Python/2.7/site-packages/hg_git-0.4.0-py2.7.egg/hggit
```

### Mercurialのユーザー名とメールアドレスの関連づけ

hg-gitをデフォルトの状態で使うと、GitHubにはauthorのメールアドレスが `none@none` で送信されるため、GitHub上でauthorが `invalid-email-address` と表示されてしまう。

GitHubのユーザー名が正しく表示されるよう設定を行う。

``` .hg/hgrc
[git]
authors = .hg/authors.txt
```

``` .hg/authors.txt
somebody = foobar@example.com
```

※メールアドレスはGitHubのアカウントに登録されているものであること。


## 利用

### GitHubリポジトリのclone

`hg clone` でgitリポジトリをcloneしてMercurialのリポジトリに変換できる。

なお、Mercurial 2.5.1とhg-git 0.4.0の環境では、空のgitリポジトリをcloneすることはできなかった。

```
# sshの場合
hg clone git+ssh://git@github.com:user/repository.git
# httpsの場合
hg clone git+https://github.com/user/repository.git
```

### GitHubリポジトリへのpush

```
hg push
```

### 既存のMercurialリポジトリをGitHubにpush

リポジトリの `.hg/hgrc` でGitHubのリポジトリURLを設定してから `hg push` を実行する。

``` .hg/hgrc
[paths]
default = git+ssh://git@github.com:user/repository.git
```


### gitブランチの扱い

gitリポジトリのブランチはMercurialリポジトリではbookmarkに変換される。Mercurialリポジトリでbookmarkを作ってpushすると、gitリポジトリでブランチが作成される。


### ローカルのgitリポジトリの所在

hg-gitでpull/pushを行っているMercurialリポジトリには、変換作業用のgitリポジトリ `.hg/hgrc/git` が存在する。


## 参考

- [TortoiseHgでgitを使う](http://tdoc.info/blog/2012/12/12/tortoisehg_git.html)
Microsoftレポートのテーブルの列ヘッダページ繰り返しを設定する

**Microsoft Visual Studio**の**Microsoft レポート**において、テーブル列ヘッダのページ繰り返しを設定する方法が難解なので覚書。

1. **Microsoft レポート**のデザインを開く。(ソリューションエクスプローラー上でrdlcファイルのダブルクリックなど)
1. テーブルを選択する。(いらないかも)
1. グループの設定の横にある**▼**から**詳細設定モード**を有効にする。
1. 行グループに**(静的)**と言う固定行の設定が出現する。
1. 行グループから列ヘッダに該当する**(静的)**(テーブル先頭行であれば最上位？)を選択する。
1. プロパティの**RepeatOnNewPage**を**True**に設定する。
UIViewの位置取得・操作のための便利カテゴリー

UIViewの位置を操作するとき

```objc
CGRect frame = view.frame;
frame.origin.x = 10;
view.frame = frame;
```

みたいにすると思うのですが、いちいちめんどくさいので、カテゴリーにしてみました。

```objc:UIView+Origin.h
@interface UIView (Origin)

@property (nonatomic) CGFloat top;
@property (nonatomic) CGFloat right;
@property (nonatomic) CGFloat bottom;
@property (nonatomic) CGFloat left;

@end
```

```objc:UIView+Origin.m
@implementation UIView (Origin)

- (CGFloat)top
{
    return self.frame.origin.y;
}

- (void)setTop:(CGFloat)y
{
    CGRect frame = self.frame;
    frame.origin.y = y;
    self.frame = frame;
}

- (CGFloat)right
{
    return self.frame.origin.x + self.frame.size.width;
}

- (void)setRight:(CGFloat)right
{
    CGRect frame = self.frame;
    frame.origin.x = right - self.frame.size.width;
    self.frame = frame;
}

- (CGFloat)bottom
{
    return self.frame.origin.y + self.frame.size.height;
}

- (void)setBottom:(CGFloat)bottom
{
    CGRect frame = self.frame;
    frame.origin.y = bottom - self.frame.size.height;
    self.frame = frame;
}

- (CGFloat)left
{
    return self.frame.origin.x;
}

- (void)setLeft:(CGFloat)x
{
    CGRect frame = self.frame;
    frame.origin.x = x;
    self.frame = frame;
}

@end
```

これを使うと、例えば縦にならぶviewの位置を操作するとき、

```objc
#import "UIView+Origin.h"

viewA.top = 10;
viewB.top = viewA.bottom + 10;
viewC.top = viewB.bottom + 10;
```

なんて書けます。このカテゴリーを使わないとかなりめんどくさいです。
HTML5について、お勉強した。

1. HTML5ってなんだ？
2. HTML5になって何が変わった？
3. HTML5になって何ができる？
4. HTML5になって楽しい？

##1. HTML5ってなんだ？
HTML5 は *WHATWG* によって2004年に定められた Web Applications 1.0 に Web Forms 2.0 を取り入れたものが W3C の専門委員会に採用され、W3C より2008年1月22日にドラフト（草案）が発表された。現在、2014年までの正式勧告を目指して策定が行われている。

####※WHATWGって？
Web Hypertext Application Technology Working Groupの頭文字をとった、Apple、Mozilla、Operaのブラウザベンダーによって設立されたグループ。HTML5を作成している。

##2. HTML5になって何が変わった？
####1. マークアップがよりセマンティックに
[よりシンプルに](http://www.htmq.com/html5/003.shtml)
[よりわかりやすく](http://www.html5-memo.com/mdn/mdn10/)
[より検索されやすく](http://jp.techcrunch.com/archives/20120516google-just-got-a-whole-lot-smarter-launches-its-knowledge-graph/)

[廃止要素一覧](http://www.tagindex.com/html_tag/basic/absent.html)

####2. フォームがよりリッチに
[種類の拡充](http://www.htmq.com/html5/005.shtml)
[属性の拡充](http://www.htmq.com/html5/sample/005_2.html)

今までjavascriptで頑張っていたことがHTML5だけで完結する。

####3. プラグイン無しでマルチメディアファイルが利用可能に
[動画・音声がjavascriptで制御可能](http://www.htmq.com/video/)

##3. HTML5になって何ができる？
####様々なAPIが追加された
[canvas -フラッシュもどきな2D描画＆アニメーション-](http://www.ozoneeleven.com/graphics/23-inspiring-html5-experiments/)
[WebGL -ブラウザで3D表現を実現-](http://www.chromeexperiments.com/tag/webgl/)
[Geolocation API -位置情報の取得-](http://html5demos.com/geo)
[Drag and drop -一番厄介で一番やりたい動作がデフォルトに-](http://html5demos.com/dnd-upload)
[Web Strage -データをローカルに保存できる-](http://blog.anmix.net/wp-content/raw/webstorage_demo/)
Indexed Database API -インデックス貼ったりトランザクション処理できるデータベースだって置けちゃう-
[Offline Web Applications -オフラインでも使えるアプリケーション？-](http://www.htmq.com/offline/)
[The WebSocket API -専用プロトコルで通信だ！-](http://html5demos.com/web-socket)
[Web Workers -javascriptプログラムをバックグラウンドで-](http://japan.internet.com/webtech/20120229/1.html)
HTML5 Web Messaging -異なるWindow間でもやりとりできる-
[The Media Capture API -カメラとかマイクとか使えちゃう-](http://o24.me/app/camera/)

[ターミナル](http://www.htmlfivewow.com/demos/terminal/terminal.html)
[CSS3D](http://www.addyosmani.com/resources/googlebox/)

[※各ブラウザの対応状況](http://www.findmebyip.com/litmus/)
AWSで特定のリージョンの全ホストのIPアドレスを一覧表示するスクリプト

## 事前準備

.bashrcなどで以下の環境変数を設定しておきます。

```sh
export AWS_ACCESS_KEY=${Your_access_key_here}
export AWS_SECRET_KEY=${Your_secret_key_here}
export EC2_URL=${Your_region_url_here}
```
[Regions and Endpoints - Amazon Web Services General Reference](http://docs.aws.amazon.com/general/latest/gr/rande.html#ec2_region)

## スクリプト

awk版

```sh:show_hosts_ip.sh
#!/bin/sh
ec2-describe-instances --show-empty-fields | awk '
$1=="INSTANCE" { public_ip=$17; private_ip=$18 }
$1=="TAG" {
  host=$0; sub("^.*Name\t", "", host); sub("\t.*", "", host);
  printf("%s\t%s\t%s\n", host, public_ip, private_ip)
}' | sort
```


gawk版

```sh:show_hosts_ip.sh
#!/bin/sh
ec2-describe-instances --show-empty-fields | gawk '
$1=="INSTANCE" { public_ip=$17; private_ip=$18 }
$1=="TAG" { 
  host = gensub("^.*Name\t([^\t]*).*$", "\\1", 1)
  printf("%s\t%s\t%s\n", host, public_ip, private_ip)
}' | sort
```
CloudWatchのAPI叩いてメトリクスを手に入れる

こんな感じで取得できます。

与える値と返ってくる値の中で、手に入れたい値(例えば対象のメトリクスの最新の数値)
を取り出すまでに苦労しました。

```get_cloudwatch_rds.rb
#!/usr/bin/env ruby

require 'aws-sdk'

ACCESS_KEY_ID     = "YOUR_AWS_KEY_ID"
SECRET_ACCESS_KEY = "YOUR_AWS_SECRET_KEY"
ENDPOINT          = "YOURENDPOINT"

cw = AWS::CloudWatch.new(
  :access_key_id        => ACCESS_KEY_ID,
  :secret_access_key    => SECRET_ACCESS_KEY,
  :cloud_watch_endpoint => ENDPOINT
).client

statistics = cw.get_metric_statistics({
  :namespace   => 'AWS/RDS',
  :metric_name => 'CPUUtilization',
  # default RDS metric
  # CPUUtilization, FreeStorageSpace, DiskQueueDepth, FreeableMemory, SwapUsage, ReadIOPS, ReadLatency, ReadThroughput, WriteIOPS, WriteLatency, WriteThroughput
  dimensions_name DBInstanceIdentifier
  :statistics  => ['Average'],
  :dimensions  => [
    { :name => "DBInstanceIdentifier", :value => "RDSNAME" },
  ],
  :start_time  => (Time.now - 120).iso8601,
  :end_time    => Time.now.iso8601,
  :period      => 60
})
# p statistics[:datapoints][0][:average]
p statistics
```

```get_cloudwatch_ec2.rb
#!/usr/bin/env ruby

require 'aws-sdk'

ACCESS_KEY_ID     = "YOUR_AWS_KEY_ID"
SECRET_ACCESS_KEY = "YOUR_AWS_SECRET_KEY"
ENDPOINT          = "YOURENDPOINT"

cw = AWS::CloudWatch.new(
  :access_key_id        => ACCESS_KEY_ID,
  :secret_access_key    => SECRET_ACCESS_KEY,
  :cloud_watch_endpoint => ENDPOINT
).client

statistics = cw.get_metric_statistics({
  :namespace   => 'AWS/EC2',
  :metric_name => 'CPUUtilization',
  # default EC2 metric
  # CPUUtilization, FreeStorageSpace, DiskQueueDepth, FreeableMemory, SwapUsage, ReadIOPS, ReadLatency, ReadThroughput, WriteIOPS, WriteLatency, WriteThroughput
  :statistics  => ['Average'],
  :dimensions  => [
    { :name => "InstanceId", :value => "YOURINSTANCEID" },
  ],
  :start_time  => (Time.now - 120).iso8601,
  :end_time    => Time.now.iso8601,
  :period      => 60
})
p statistics[:datapoints][0][:average]
# p statistics
```
Amazon AMI Linuxのsrpm取得

予めyumでrpmをインストールしておいて、以下のコマンドを実行すると /usr/src/srpm/debug/ 以下にsrpmを取得出来ます。

```
get_reference_source -p ${rpm_name}
```

情報源
* [AWS Developer Forums: Amazon Linux SRPMS ...](https://forums.aws.amazon.com/message.jspa?messageID=406444)
* [ec2-downloads.s3.amazonaws.com/AmazonLinuxAMIUserGuide.pdf](http://ec2-downloads.s3.amazonaws.com/AmazonLinuxAMIUserGuide.pdf)
同一グラフを複数ホスト分並べるzabbixスクリーンxml生成スクリプト

一種類のグラフを複数ホストの分だけ並べるスクリーンのxmlを生成するための書き捨てrubyスクリプトです。パラメータを適宜編集して実行します。生成したxmlをzabbixでインポートすればさくっとスクリーンが作れます。

generate_screen_xml.rb > output.xml

```ruby:generate_screen_xml.rb
#!/usr/bin/env ruby
require 'erb'
require 'date'

screen_name = 'CPU Utilization'
graph_name = 'CPU Utilization'
hostnames = (1..4).map {|i| "app%02d" % i}
graph_count = hostnames.size
cols = 2
rows = (graph_count - 1) / cols + 1

ERB.new(DATA.read, nil, 2).run

__END__
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
    <version>2.0</version>
    <date><%= DateTime.now.iso8601 %></date>
    <screens>
        <screen>
            <name><%= screen_name %></name>
            <hsize><%= cols %></hsize>
            <vsize><%= rows %></vsize>
            <screen_items>
<% hostnames.each_with_index do |hostname, i| %>
                <screen_item>
                    <resourcetype>0</resourcetype>
                    <width>500</width>
                    <height>100</height>
                    <x><%= i % cols %></x>
                    <y><%= i / cols %></y>
                    <colspan>1</colspan>
                    <rowspan>1</rowspan>
                    <elements>0</elements>
                    <valign>0</valign>
                    <halign>0</halign>
                    <style>0</style>
                    <url/>
                    <dynamic>0</dynamic>
                    <sort_triggers>0</sort_triggers>
                    <resource>
                        <name><%= graph_name %></name>
                        <host><%= hostname %></host>
                    </resource>
                </screen_item>
<% end %>
            </screen_items>
        </screen>
    </screens>
</zabbix_export>
```
virtualbox(centos)でrbenvインストールメモ

環境 centos6.3（ゲストOS）macosx10.8(ホストOS)

chef使ってみたーい。という動機で触ったこともないrubyを入れてみようと思いました。
何やら色々調べるとrubyはバージョンによって色々変わるらしいので
最近流行りのrbenvで入れた時のメモ。

## 注意事項

* ここから先は全てroo(権限)ユーザーで実行しています
* epel,remiのリポジトリが必要です。入れていない場合は[外部リポジトリの追加（remi,epel）](http://qiita.com/items/662e41376efa97251575)を参考にして入れてみてください。
* 要git,gcc
* 開発環境構築の話です。本番環境などはもっと詳しいブログをみつけてください。

## 参考にしたサイト
* [rbenv を CentOS 6.3 にインストール](http://d.hatena.ne.jp/katsuren/20121027/1351319825)※ほとんどこの記事みてやりました。
* [rbenv と ruby-build を使って Ruby の環境を構築してみた](http://tnakamura.hatenablog.com/entry/20120227/rbenv_ruby_build)


## rbenvをgitからクローンする

ズバッと

```shell: 
cd /usr/local/
git clone https://github.com/sstephenson/rbenv.git
```


## rbenvのパーミッションの設定

```shell
chmod -R g+rwxXs /usr/local/rbenv/
```

## ruby-buildプラグインをインストール

```shell
mkdir /usr/local/rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git
```

## rbenvのPATHを通す

```shell:/etc/profile.d/rbenv.sh
vim /etc/profile.d/rbenv.sh

export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

## rubyのインストール

上記設定を反映させるために一旦再起動してください。

```shell
which rbenv
/usr/local/rbenv/bin/rbenv
```

rbenvにPATHが通ったのでインストール

```shell
rbenv install 1.9.3-p286
```

結構長いです。辛抱しましょう。

##rubyのデフォルトのバージョン設定

コマンド一発

```shell
rbenv global 1.9.3-p286 
rbenv rehash
```

## rubyのバージョン確認

```shell
ruby -v
ruby 1.9.3p385 (2013-02-06 revision 39114) [x86_64-linux]
```

rubyのインストールができました。
以外とインストールに面倒なイメージなrubyですが以外とシンプルに出来ました。
本当に[rbenv を CentOS 6.3 にインストール](http://d.hatena.ne.jp/katsuren/20121027/1351319825)には助かりました。
mac版のIntelliJ IDEA + IdeaVimで^[が効かない

# 原因

キーボードがJIS配列でもUS配列として認識されてしまうため、`[`の位置のキーを`]`と認識されています。

# 解決方法

## 機械に合わせる

US配列の`[`の位置のキーを押せばよいので、JIS配列では`^@`を入力します。

## 機械を合わせる

### v0.33以降

IdeaVIM v0.33からキーの割り当て方法が変わり、次のいずれかのファイルにキーマップを設定します。
更にv0.35から`~/.vimrc`と`~/_vimrc`は使われなくなりました。

* `~/.ideavimrc`
* `~/_ideavimrc`
* ~~`~/.vimrc`~~
* ~~`~/_vimrc`~~

macのJIS配列キーボードは`¥`で円記号、`Option+¥`でバックスラッシュが入力されて不便なので、ついでに入れ替えてしまいます。

```vim:~/.ideavimrc
inoremap <c-]> <esc>
inoremap ¥ \
inoremap \ ¥
```

参考ページ

* [IdeaVIM v0.33がリリースされました](http://d.hatena.ne.jp/masanobuimai/20140429/1398758972)
* [IdeaVIMがmapコマンドによるモード別キーマップに対応した](http://www.karakaram.com/ideavim-map-supported)

### v0.33未満

`Settings -> Keymap -> Editor Actions -> Escape`に`^[`を割り当てます。
リモートにあるgemのリストを確認する


参考
[ruby - list all versions of a gem available at remote site - Stack Overflow](http://stackoverflow.com/questions/9146012/ruby-list-all-versions-of-a-gem-available-at-remote-site)

[Rails3 事始め: [Rails3] Gem ファイルリストを表示する](http://rails3try.blogspot.jp/2011/06/rails3-gem.html)


リモートのgemファイルのリストを取得 

```
gem list SOMEGEMS --remote
```

リモートのgemファイルのリストの全てのバージョンを表示

```
gem list SOMEGEMS --remote --all
```
svn:ignore から .gitignore を生成するRubyスクリプト

svnだとignore設定を一覧しにくかったりするのでそういう時にも使う。

[Gist: svnignore2gitignore.rb](https://gist.github.com/ongaeshi/5030011#file-svnignore2gitignore-rb)

使い方 

```
$ cd ~/Documents/tortoisesvn
$ svnignore2gitignore.rb > .gitignore
```

出力例

```
.tx
Desktop.ini
MYBUILD
Tools
bin
cov-int
default.build.user
default.user
gpgpassphrase.txt
obj
signinfo.txt
tools
version.build
src/AsyncFramework/*.user
doc/xsl/es/userconfig.xml
ext/openssl/*.bat
ext/openssl/*.bak
ext/openssl/Makefile
ext/openssl/MINFO
ext/openssl/inc32
.
.
```


[Oneliner to convert svn:ignore into .gitignore](https://gist.github.com/iegik/3450385) が、一つのディレクトリに複数のignore設定がある時に上手く動かなかったので作った。
テストコードと依存するライブラリをjarにまとめてCLIで実行する

タイトルのまんま。

テストだけ単体でCLIで実行できるようにしておけば、デプロイ用のchefのrun_listの中にレシピとして含めることができていろいろ捗ると思ったのでやってみた。

設定項目を全部理解して使ってるわけではないので、もっとうまい方法や設定があるのかもしれないけど、とりあえず取っ掛かりとして。

使ったmaven-pluginは、[maven-assembly-plugin](http://maven.apache.org/plugins/maven-assembly-plugin/)。依存関係をまとめてパッケージ化したい時に使うpluginで、java使いにとってこれ自体は珍しいものではないでしょう。普通は実行可能なjarを作成したりするときに使うのかな？今回はテスト実行用のjarをこれで作る。

pomはこんな感じ。

```
<build>
...
<plugins>
...
<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <descriptors>
      <descriptor>src/test/resources/assembly.xml</descriptor>
    </descriptors>
  </configuration>
</plugin>
...
```
で、assembly.xmlは以下のとおり。

```
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>test-jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>test</scope>
    </dependencySet>
  </dependencySets>
</assembly>
```

mave-assembly-pluginには、元々jar-with-dependenciesという識別子であらかじめ定義されたアセンブリのルールがあるのだけど、それをベースに、`<scope />`を変えた。もともとは`<scope>runtime</scope>`で実行時に必要なもの、というルールなのだけど、そこを`<scope>test</scope>`に変えるとテスト実行時に、という設定に変わるようだ。

これでmvn installを実行すると、testコード、テスト用のライブラリ（UIテストなのでseleniumとかgebとかspockとか）が含まれたjarが出来上がる。拡張子jarをzipに変えて展開してみると確かに含まれているのがわかると思う。

上記方法で作成したテストコードを実行するには、先ほど作成したjarがあるフォルダで

```
java -cp 上で作ったjar org.junit.runner.JUnitCore テストが記載されたクラス名
```

もう少し具体的な例としては、

```
java -cp smoke-test-0.0.1-SNAPSHOT-test-jar-with-dependencies.jar org.junit.runner.JUnitCore sample.smoketest.SampleSpec
```

テストクラスを直指定しているところは改善の余地ありだけど、とりあえずこれでやりたいことはできそうな感じ。
GoogleAnalyticsで非同期トラッキングのコールバックを受け取る

## 概要

そんな気はしてたけど、下記のように`onclick`で`_gaq.push()`するとページ遷移でトラッキングが中断されて計測漏れすることがあるらしい。

```html:
<a href="hoge.html" onclick="_gaq.push(['_trackPageview', 'click/hoge']);">hogeへ</a>
```

`_trackPageView`や`_trackEvent`のコールバックを設定できるようになったので、トラッキング完了してからページ遷移することで計測漏れをなくせるはず。

```js:
_gaq.push(['_trackPageview', {
  page       : 'click/hoge',
  hitCallback: function () {
    console.log('トラッキング完了!');
  }
}]);
```

## コールバックを使ってトラック完了後にページ遷移する

注意点としては、`Ctrl`や`Command`を押下しながらのリンククリックや、`target`が`_self`以外の時は別窓で開くのでそもそもコールバックで何かする必要はないということ。同じ窓でページ遷移する場合のみコールバックでページ遷移する(`if`内の処理)。

```js:
$.extend($, {
  gaPageview: function(page, callback) {
    _gaq.push([
      '_trackPageview', {
        page: page,
        hitCallback: callback
      }
    ]);
  }
});
$.fn.extend({
  gaPageview: function(attr) {
    return this.on('click', function(e) {
      var $el, callback, page, target;
      $el = $(this);
      page = $el.attr(attr);
      if (page == null) {
        return;
      }
      if ($el.is('a')) {
        target = $el.attr('target');
        if (!e.ctrlKey && !e.metaKey && (!target || target === '_self')) {
          e.preventDefault();
          callback = function() {
            location.href = $el.attr('href');
          };
        }
      }
      $.gaPageview(page, callback);
    });
  }
});
```

こんな感じでjQueryを拡張しておくと、下記のように設定も楽。

```js:
$(function () {
  $('a[data-ga]').gaPageview('data-ga');
});
```

```html:
<ul>
  <li><a href="#hoge" data-ga="internal">internal</a></li>
  <li><a href="dummy.html" data-ga="none">none</a></li>
  <li><a href="dummy.html" target="" data-ga="empty">empty</a></li>
  <li><a href="dummy.html" target="_self" data-ga="_self">_self</a></li>
  <li><a href="dummy.html" target="_blank" data-ga="_blank">_blank</a></li>
  <li><a href="dummy.html" target="dummy" data-ga="dummy">dummy</a></li>
</ul>
```

## 関連記事
[Googleアナリティクス非同期コードにおける新しいAPIについて｜コラム アユダンテ株式会社](http://www.ayudante.jp/column/2012-05-17/18-03/ "Googleアナリティクス非同期コードにおける新しいAPIについて｜コラム アユダンテ株式会社")
[Advanced Configuration - Web Tracking (analytics.js) - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced?hl=ja#hitCallback)
[JavaScript - この夏Google Analyticsが新しくなるって知ってた？Universal Analyticsを予習しよう - Qiita [キータ]](http://qiita.com/yuku_t/items/128ad659e1474c7e20d6)
Firefoxでブラウザ側のUserAgentが変更されない件

拡張機能の「UserAgent Switcher」とabout:configの`general.useragent.override`を直接書き換える方法で試しましたがどちらも結果は同様です。

具体的には、

* サーバーに送信するリクエストヘッダのUserAgentは変更される
* ブラウザのJavaScriptで取得する`navigator.userAgent`の値は変更されない

という状態です。

自分の記憶ではFirefox18になった時からこのような状態になったと思いますが、この辺りははっきりしません・・・

仕様かバグか分からないですし、一般向けには影響はないですが、開発時にUserAgentをスマホのものに切り替えてチェックという手法を取っており、かつブラウザのJavaScriptで`navigator.userAgent`によるスマホ判定をしている場合なんかに変な挙動をする可能性があります。
jqGridの4.4.4はIE6対応をやめたそうです

1月の末にjqGridの新しいバージョンが出ていたので何気なくチェンジログを確認してみると、なんとIE6への対応をやめておりました。
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:change#jqgrid_4.4.4_changes_and_fixes
英断と言えば英断ですが使ってる身としてはちょっと困ってしまいますね。おそらくこういうことはこれから増えるんだろうなと。
Ruby2.0.0 + Rails3.2.12 + Puma + Heroku

* [A Modern, Concurrent Web Server for Ruby - Puma](http://puma.io/)
* [puma/puma · GitHub](https://github.com/puma/puma)
* [@ctshryock | Running Rails with Puma on Heroku](http://ctshryock.com/posts/2012/07/12/running-rails-with-puma-on-heroku.html)
* [Better Performance On Heroku: Thin vs. Unicorn vs. Puma - Ylan Segal - on.code && such](http://ylan.segal-family.com/blog/2012/08/20/better-performance-on-heroku-thins-vs-unicorn-vs-puma/)

----

* [Mike Subelsky: Setting up Puma & Rails on Heroku](http://www.subelsky.com/2012/10/setting-up-puma-rails-on-heroku.html)

----

* `vi Gemfile`

```
gem 'puma'
```

```
bundle install
```

```
rails s puma
```

* `vi Procfile`

```rb
web: bundle exec puma -p $PORT -e $RACK_ENV -C config/puma.rb
```

* `vi config/environments/production.rb`

```rb
  # For Puma
  config.threadsafe!
```

* `vi config/puma.rb`

```rb
require "active_record"
cwd = File.dirname(__FILE__)+"/.."
ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
ActiveRecord::Base.establish_connection(ENV["DATABASE_URL"] || YAML.load_file("#{cwd}/config/database.yml")[ENV["RACK_ENV"]])
ActiveRecord::Base.verify_active_connections!
```

* NewRelic

```
heroku config:add NEWRELIC_DISPATCHER=Puma
```
gitの出力に色をつける


Macをクリーンインストールしたら git の出力がモノクロになってしまった。なんだかさみしいので以下の手順で色をつけた。

```
git config --global color.ui true
```

そうすると ~/.gitconfigに以下が追加される。

```
[color]

  ui = true
```
Ubuntuのクリップボードからのコピペ

Ubuntu12.04上でRを使っているんだけど，ExcelファイルをOpenOfficeで開いて，
範囲指定してRに読み込むには，Windows の場合と同様

```
x <- read.table("clipboard")
```

とすればいい訳だが，コピー範囲に日本語が含まれていると，文字化けする．
xclipboardからの変換が効かないようなので，結局，クリップボードユーティーリティーを追加．

```
sudo apt-get install xclip
```

んで，Mac版Rで read.table(pipe("pbpaste"))  とするように

```
x <- read.table (pipe ("xclip -o"))
```

とすれば，化けないことは化けない．ただ，多分，使わない．

__そのまま読みこみゃいいんだよ！！__


```
library (XLConnect)
x <- readWorksheetFromFile("Book1.xlsx", sheet = "シート")
```
全ての形容動詞と、その位置を見つける

こういうの無いかなあと思って調べたらそのままあったのでメモ。

> もし、パターンにマッチするものについて、マッチしたテキスト以上の情報を得たいと考えたとき、文字列ではなく MatchObject のインスタンスを返す finditer() が便利です。以下に例を示すように、なにかの文章の全ての副詞と、 その位置を 調べたいと考えたとき、下記のように finditer() を使います。 :

```python
>>> text = "He was carefully disguised but captured quickly by police."
>>> for m in re.finditer(r"\w+ly", text):
...     print '%02d-%02d: %s' % (m.start(), m.end(), m.group(0))
07-16: carefully
40-47: quickly
```

日本語を含むテキストの場合、decodeを使ってunicodeへ変換する。

```python
text = "これはテストです"
regex = "テスト"
a = re.finditer(regex.decode('utf8'), text.decode('utf8'))
for i in a: print i.group(), i.start(), i.end()
```

結果は、

```
テスト 3 6
```

## 参考
+ http://docs.python.jp/2/library/re.html#id9
c switch

C、Objective-Cではswitchの中で宣言を行う場合はcaseを波括弧で囲う必要あるようなので注意

```objective-c:Objective-C
- (IBAction)buttonAction:(UIButton*)sender{
	switch (sender.tag) {
		case BTN_WRITE:{
			NSData *data = [self str2data:[_txtField.text]];
			break;
		}
		case BTN_READ:{
			NSData*	data = [self file2data:@"test.txt"];
			[_txtField setText:[self data2str:data]];
		}
		default:
			break;
	}
}
```
CPANでモジュールインストール時の自動yes選択

CPANでモジュールをインストールする時に、何度も[Yes]を押さないとならないのが面倒だったので。

```
o conf prerequisites_policy follow
o conf build_requires_install_policy yes
o conf commit
```

最初のprerequisites_policy followで、依存モジュールをインストール
次のbuild_requires_install_policy yesで、ビルド時に必要なモジュールをインストール
最後のcommitで設定保存。
Android - jsonicとSharedPreferences

jsonicとSharedPreferences
====================

Androidアプリ開発していて中規模くらいになってくるとSharedPreferencesが大量になってきますよね。そういうとき、まとめられるデータならJSON形式で保存するようにしてます。
KEY管理も楽になるし。
ということで、jsonicとSharedPreferencesを使ったサンプルです。
処理としては、インストールしてから三日たって、ログインしたとき評価してなかったら、評価してねってダイアログだすときに使ってます。

```java:
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

//エンコードとSharedPreferencesへの登録
Map<String, String> login = JSON.decode(pref.getString(KEY_LOGIN,String.format("{'timestamp':'%s', 'evaluate':'0'}", DateTime.now())));
login.put("evaluate", ON);
Editor e = pref.edit();
e.putString(KEY_LOGIN, JSON.encode(login));
e.commit();

//デコード
Map<String, String> login = JSON.decode(pref.getString(KEY_LOGIN,String.format("{'timestamp':'%s', 'evaluate':'%s'}", DateTime.now().toString(), OFF)));
```
HTML5 Navigation Timing API を使って CUI からベンチマークする


HTML周り/JS周りのベンチマークをとるとき、みなさんどうやってますか？いわゆる開発者ツールを開いてリロード、リロード… そんな事をしてる人も多いと思います。(僕もそうです）

しかしながら、wbench というツールを使うことで、CUI から or Ruby の API から HTML5 Navigation Timing API を利用してベンチマーク出来ます。

# 利用方法
- https://github.com/desktoppr/wbench

に全部のってるので嫁ば終わり！

# どう実装されてるか

- capybara + selenium driver でブラウザ立ち上げて実行
- ベンチマークの結果の取得部分は
- selenium driver が対応して、window.performance.timing が存在すればどのブラウザでも！(といっても firefox, chrome だけかな…)

## データの取得

```ruby
timing_json = @browser.evaluate_script('window.performance.timing')
```

わおーこんなにお手軽に…。
git: 'pull' is not a git commandと出たときの対処法


```
$ git pull origin master

git: 'pull' is not a git command. See 'git --help'.  
  
Did you mean this?  
    shell  
```

と言われてしまいました。
git-coreのパスが通ってなかったのが原因。

```
$ locate git-core
```
で探して、

```
export GIT_EXEC_PATH=/path/to/git-core
``` 

通してあげると、いけました。


参考：
http://blog.absolutedisaster.co.uk/git-pull-is-not-a-git-command-fix-centos-5
Python - Django css・jsをコンプレス

django-css
------------

css・jsをコンプレスしてくれます。ページアクセス時にキャッシュを生成している。
settings.pyでDEBUG = Trueを指定している場合は圧縮しません。

1 pipでinstallする

```sh:
    $ pip install django-css
```

2 settings.pyを編集する

```python:
    # MEDIA_ROOT、MEDIA_URLは適切に設定されていることを確認
    MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'www')
    MEDIA_URL = '/www/'

    INSTALLED_APPS = (
        # 'compressor'を追記する
        'compressor',
    )
```

3. テンプレートでの使い方

```html:
    {% load compress %}
    {% compress css %}
    <link rel="stylesheet" href="/media/css/one.css" type="text/css" charset="utf-8">
    <link rel="stylesheet" href="/media/css/two.sass" type="text/css" charset="utf-8">
    {% endcompress %}

    {% load compress %}
    {% compress js %}
    <script src="/media/js/one.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" charset="utf-8">obj.value = "value";</script>
    {% endcompress %}
```

4. ページアクセス時のソースコードで圧縮されていることを確認

```html:
    <link rel="stylesheet" href="/media/CACHE/css/f7c661b7a124.css" type="text/css" media="all" charset="utf-8">
    <script type="text/javascript" src="/media/CACHE/js/3f33b9146e12.js" charset="utf-8"></script>
```

*参考文献*

[Package Index django-css 2.3.1](http://pypi.python.org/pypi/django-css/)
私的メモ・Animoを使って生成されたイメージの着色

CoronaでAnimo(旧Spritelog)使ってる人なんて、日本に何人いるのか謎ですが、自分メモとして...。
AnimoのサイトにあるFlash用のJSFL「Export layout for Corona」を使って吐き出されたluaで配置した場合のイメージ全体にfillColorしたい場合

```
local hoge = require('exportLayoutForCoronaLuaFile');
local img   = loqsprite.newFactory('spriteImageFromAnimo');
local fuge = hoge.createLayout(img)
for k,v in pairs(fuge.elements) do
    v:fillColor(0,200,0);--色は適当に
end 
```

ってやれば色ぬれる。
もどしたいときは255,255,255でぬればもどる。
【構想編】自動メール返信プログラム、メイドちゃんを作ろう!!

## なぜ作ろうと思ったか？

「さくら荘のペットな彼女」に出てくる、自動メール返信AIをみて、すげぇこれ。欲しいって思ってしまったため。
忙しい現代人には最も必要なものな気がしたから。

## 現状

作る時間がないので、とりあえず構想レベルで！！(ゴメンよ)

## 言語

以下のどれかを想定

* PHP <-- だって簡単でしょ？
* Ruby <-- みんな好きなんでしょ？
* Rython <-- GMail使うし、Googleって言ったらねぇ・・・そうでしょ？

## 作中の仕様

* メールを受信してから1秒以内に返信する
* 受信したメールに対して適切な返答をする
* 自己学習

## 現実的な仕様

作中の仕様そのまんまは無理だと思うので、

* 1〜5分に1回、Google様に問い合わせを行う。(Google様に怒られない程度)
* いくつかのパターンを用意しておいて、
* 対応パターンにあてはまらないものはログとして残す(開発者が学習)
* 返信相手は予め登録したものに限る
 * ビジネス相手とかに送ってしまったら、ちょっと痛い子
 * スパムとか迷惑メールに間違って送ったら怖い

## 名称

Google用メイドちゃんなので、

* GMaido
* メイドちゃん for GMail

かな？