OmniAICreator/Qiita-1.07M huggingface dataset:
getBytes("MS932") での文字列分割とDBへのinsertではまった話

JDK 1.5.0_12, ojdbc14 での話。

``` DevideString.java
/** 分割開始インデックス */
static final int DIVISION_BYTE_START_INDEX = 0;
/** 分割後文字長 */
static final int DIVISION_BYTE_LENGTH_ADDR = 10;

/**
 * 引数の文字列を［分割後文字長(byte)］以下にカットする。
 * 扱う文字コードは MS932 とする。
 *
 * @param str 文字列（MS932）
 * @return String ［分割後文字長(byte)］以下の文字列
 */
String getDivideStringByBytes(String str) {

  if(str == null) {
    return null;
  }

  String result = "";

  try {
    // バイト配列化
    byte[] byteAddr = address.getBytes("MS932");

    if(byteAddr.length > DIVISION_BYTE_START_INDEX) {
      // byte文字列が分割開始インデックス以上の長さである

      if(byteAddr.length > DIVISION_BYTE_START_INDEX + DIVISION_BYTE_LENGTH_ADDR) {
        // byte文字列が分割したい文字長以上の長さである
        result = new String(byteAddr,
                        DIVISION_BYTE_START_INDEX,
                        DIVISION_BYTE_LENGTH_ADDR,
                        "MS932").trim();

      } else {
        // 必要文字長に満たない場合
        result = new String(byteAddr,
                        DIVISION_BYTE_START_INDEX,
                        byteAddr.length - DIVISION_BYTE_START_INDEX, // 長さ：文字長 - 分割(開始)位置
                        "MS932").trim();

      }

      // いわゆる“おまじない”コード（恥）
      // result = new String(result.getBytes("MS932"));

    } catch(UnsupportedEncodingException ue) {
      throw new IllegalArgumentException(ue);

    }

    return result;
  }
}

```

引数の文字列において、分割される文字列に半角文字（1byte文字）を奇数個含むと、切り口の文字がぶった切られて文字化けする。
例：

```

"あい うえおかき" → 10 byteで分割 → "あい うえ?"

```

これをそのままデータベース（oracle）へ insert しようとしたところ、ORA-12899 エラーになった。

データベースの文字コードは Shift_JIS（JA16SJISTILDE）。
カラムに定義された文字長＝分割文字長であり、たとえば上記の例であれば：

```

ORA-12899： 列"DEV"."HOGETABLE"."COLUMN1"の値が大きすぎます（実際： 11、最大： 10）

```

JDBC（ojdbc14）で insert する直前の値を確認したとき、以下の２パターンが存在した。
前者は末尾の文字が全角の「？」になっている：

```

1) あい うえ？
2) あい うえ?

```

1 の場合に ORA-12899 エラーが発生している。

1 は、上記のコードで生成された文字列を用いている。
2 は、上記のコードの おまじない を有効にした場合の文字列を用いている。

1 と 2 の文字列は、（JDBCへ渡す前は）全く同じ文字列に見える：

```

1) あい うえ? → byte化（MS932）：82 a0 82 a2 20 82 a4 82
2) あい うえ? → byte化（MS932）：82 a0 82 a2 20 82 a4 82

```

しかし、String#equals で比較すると「異なる」と判断される。
String#equals は各文字を char で比較する。char にしたときの各文字は 以下のようになる：

```

1) 'あ' 'い' ' ' 'う' 'え' '･'
2) 'あ' 'い' ' ' 'う' 'え' '?'

```

そもそもマルチバイトの文字を byte で分割しようとしてるのがアレなのか…
JDBC が余計なことしてくれるのがいけないのか。

別に最後の文字は化けててもいいから、10 byte として突っ込んでくれればいいのに…と思ってしまう。

あと String#equals の挙動も気になる。
Node.jsで外部への通信がボトルネックになっていそうな場合

http://blog.96q.org/2011/12/25/10-tips-for-faster-performance-node-js/
によると、デフォルトでソケットプーリングが有効（5本通信できる）のようなので、これをカットすることでかなり改善できる。

```js
    http.get({
        host:'...',
        path:'...',
        agent: false //これでソケットプーリングOFF。
    }, function (res) {
```
NSStringのsubstring系メソッドの挙動メモ

ToIndex は指定したインデックスの【前】まで。(つまり指定したインデックスは含まれない)
FromIndex は指定したインデックス【から】。(つまり指定したインデックスを含む)
Range は指定したインデックス【から】指定した【文字数分】。(第一引数を含めて第二引数分)

```
NSString *hoge = @"0123456789";
[hoge substringToIndex:1] : 0
[hoge substringFromIndex:4] : 456789
[hoge substringWithRange:NSMakeRange(3, 6)] : 345678
```

```
NSString *piyo = @"0";
[piyo substringToIndex:1] : 0
[piyo substringFromIndex:4] : // エラー
[piyo substringWithRange:NSMakeRange(3, 6)] : // エラー
```

```
NSString *fuga = @"0123456789";
[fuga substringToIndex:9999] : // エラー
[fuga substringFromIndex:\-5] : // エラー
[fuga substringWithRange:NSMakeRange(3, 50)] : // エラー
```

```
NSString *neko = @"012345";
[neko substringToIndex:neko.length - 1] : 01234
[neko substringToIndex:neko.length] : 012345
[neko substringToIndex:neko.length + 1] : // エラー
```

ToIndex の仕様が気持ち悪いのは自分だけか？(なぜ指定したインデックスが含まれないのか？)
Subversionの「.svn」ディレクトリを全部削除する

Subversion で管理しているプロジェクトのルートフォルダまでターミナルで移動し、
以下のコマンドで、「.svn」ディレクトリを検索する。

```:コマンド１
find . -type d -name .svn
```

このコマンドでズラッと「.svn」ディレクトリが抽出されることを確認したら、
以下のコマンドで全て消す。

```:コマンド２
find . -type d -name .svn -print0 | xargs -0 rm -rf
```

このコマンド２を実行後にもう一度コマンド１を実行すると何も検索されなくなるはず。

※-print0 や -0 は、パスに半角スペースが含まれている場合の対策で、
　例えば、「abc▲def.txt」(▲は半角スペースの意味)があるディレクトリで、
　「find . -name *.txt | xargs ls」コマンドを
　実行してみるとわかると思う。
taskkill コマンドで、プロセスを強制終了する

Excelを操作するアプリケーションとか開発していたりすると、画面非表示の excel.exe のプロセスが残ってしまうことがあります。

これを終了させるためには、`CTRL`+`SHIFT`+`ESC`キー → Windowsタスクマネージャー →右クリック→プロセスの終了 でも良いのですが、
頻繁に行う必要があったり、大量のプロセスを終了させる必要があるのであれば、コマンドプロンプトから taskkillコマンドを使う方が便利です。

# 使い方

## プロセスイメージ名を直接指定する場合

```bat:taskkill_sample.bat
taskkill /F /T /IM excel.exe
```

## フィルター名を使ってワイルドカード選択する場合

```bat:taskkill_sample2.bat
taskkill /F /T /FI "IMAGENAME eq note*.exe"
```

詳細は、`taskkill /?` でヘルプを見て下さい。
Listメモ書き その２


http://qiita.com/items/a8a46173c53830f7d465 の続き

## 不要な要素を削除

```python
>>> fa = ["a", "b", None, "c", "e", None, None, None, "d"]
>>> [i for i in fa if i]
['a', 'b', 'c', 'e', 'd']
```


## 特定ディレクトリ以下にある、指定した拡張子のファイル一覧を取得

```python
>>> # 作業ディレクトリ以下にある `.eml` という拡張子のファイル一覧を取得
>>> for root, dirs, files in os.walk(os.path.abspath(".")):
...     buff += [os.path.join(root, fname) for fname in files if os.path.splitext(os.path.join(root,fname))[1] == '.eml']
... 
>>> buff
['/path/to/1.eml', '/path/to/2.eml']
```
Windows8 を完全にシャットダウンする方法

コマンドプロンプト、または「ファイル名を指定して実行」ダイアログに次のコマンドを入力します。

    shutdown /s /full /t 0

Windows8 では GUI から「シャットダウン」をポチっても、
実際にはハイバネートのような状態になるだけ。

完全にシャットダウンするには shutdown コマンドを使用します。
ランダムなパスワードを生成するmkpasswdコマンド


## 使い方

~~~~~~shell-session
hash$ mkpasswd
Y2=SzhZ?

hash$ mkpasswd 16
6ytG2PY9r=Oj>=ke
~~~~~~

そのまま実行すると8文字、
引数を渡すと任意の文字数のランダムなパスワードを生成

## 作り方

~~~~sh:~/bin/mkpasswd
#!/bin/bash

if [ $# -eq 0 ]; then
  keta=8
else
  keta=$1
fi
jot -r -c $keta 48 122 | tr -d '[:space:]'; echo
~~~~

* jot オプション
  * -r: ランダム
  * -c: 与えられた番号のASCII文字
      * 48(0)から122(z)まで
      * 「:;<=>?@[\]^_`」の記号を含む
* tr
    * -d '[:space:]'で改行、空白を詰める

## 参考

* [ASCII文字対応表](http://e-words.jp/p/r-ascii.html)
EditText/TextViewに絵文字を入力＆表示する

```java
EditText edit = new EditText();
Bunble bunble = et.getInputExtra(true);
if ( bunble != null ) bunble.putBoolean("allowEmoji",true); // 絵文字
```

絵文字が含まれる文字列をTextViewに表示するのはそのままでいいっぽい。

```java
String s = edit.getText().toString();
text.setText(s);
```

ただし、表示される絵文字はもちろん端末依存というかキャリア依存。

デコメ絵文字も`bunble.putBoolean("allowDecoEmoji",true);`で入力できるようになる、
とdocomoのページにはあるが、IS12Sは入力できるようにならなかった。
http://www.nttdocomo.co.jp/service/developer/smart_phone/service_lineup/decoemojimanager/guide/textview/index.html#p02

標準IMEが対応してないっぽい？
対応入力ソフトとか入れると出るのかな？
'brew install cabal-install' がコケる

エラー内容
-----------

```
brew install cabal-install                                                                                                                                
==> Downloading http://www.haskell.org/cabal/release/cabal-install-0.14.0/cabal-install-0.14.0.tar.gz
Already downloaded: /Library/Caches/Homebrew/cabal-install-0.14.0.tar.gz
==> sh bootstrap.sh
Could not find task "__numeric_version".
Could not find task "__numeric_version".
bootstrap.sh: line 81: [: too many arguments

Error during cabal-install bootstrap:
Version mismatch between ghc and ghc-pkg If you set the GHC variable then set GHC_PKG too
==> Build Environment
CPU: dual-core 64-bit penryn
MacOS: 10.7.4-i386
Xcode: 4.3.2
CC: /usr/bin/clang
CXX: /usr/bin/clang++ => /usr/bin/clang
LD: /usr/bin/clang
CFLAGS: -Os -w -pipe -march=native -Qunused-arguments
CXXFLAGS: -Os -w -pipe -march=native -Qunused-arguments
MAKEFLAGS: -j2
Error: Failed executing: sh bootstrap.sh (cabal-install.rb:12)
These existing issues may help you:
    https://github.com/mxcl/homebrew/issues/12155
Otherwise, please report the bug:
    https://github.com/mxcl/homebrew/wiki/reporting-bugs
```

解決
-----------

`Version mismatch between ghc and ghc-pkg If you set the GHC variable then set GHC_PKG too` が直接の原因っぽい。

```
GHC=/usr/local/bin/ghc brew install cabal-install
```

としたら入った

原因
-----------

わかった。
`which ghc` が `~/.gem/ruby/1.9.1/bin/ghc` だった

http://rubygems.org/gems/github_cli
"Glasgow Haskell Compiler" ではない(ズコー)
DebianにTFTPサーバを入れる手順


ネットワーク機器のconfigや、PXEブートとかで結局使ったりするtftpサーバを立てる手順 (xinetd経由)

```sh:インストール
sudo aptitude -y install tftpd
sudo aptitude -y install xinetd
```

```text:/etc/xinetd.d/tftpd
service tftp
{   
    disable = no
    log_type = File /var/log/tftpd
    log_on_success = HOST
    log_on_failure = HOST
    socket_type = dgram
    protocol = udp
    wait = yes
    user = root
    server = /usr/sbin/in.tftpd
    server_args = -s /tftpboot
    per_source = 11
    cps = 100 2
    flags = IPv4
}
```

```sh:
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
sudo /etc/init.d/xinted restart
```

## tftpd-hpaの場合
tftpdよりもこっちの方が機能が豊富

```sh:
aptitude -y install tftpd-hpa
```

```text:/etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c --secure"
```
LANG=ja_JP.UTF8でeucjpで書かれたものをlessしたいとき

``` shell:.zshrc.part
# lessがeucjp扱えなくて死にたいのでlvで全部まかなう
export PAGER='lv'
export LV='-Ou8'
alias less='lv'
alias source-highlight='source-highlight --failsafe'
function lvc() {
    source-highlight --infer-lang -f esc --style-file=esc.style -o STDOUT -i $1 | /usr/bin/lv -c
}
alias lv='lvc'
```
ポイントはlvc内でのlvをフルパスで書く。そうしないと再起呼び出ししまくりでしスタック食いつぶす
GitHubユーザーのためのhubコマンド

hubコマンド([defunkt/hub](https://github.com/defunkt/hub))を入れるとGitHubの操作あれこれをコマンドラインでできるようになる．

## インストール&設定
インストールは https://github.com/defunkt/hub#installation の通り．
`hub XXX`を`git XXX`で使えるようにするために以下を.bashrcや.zshrcに書く

```bash:~/.XXXrc
function git(){hub "$@"} # zsh
eval "$(hub alias -s)" # bash
```

ちなみにプロンプトにブランチ名を表示している場合は，プロンプト表示速度の低下を避けるために以下の設定を忘れずに．
[hubコマンドを利用&&プロンプトにgitのブランチ等を表示している人向けのzsh高速化 - Qiita](http://qiita.com/yaotti/items/0af5d50f4f52d22a46fe)



## よく使うコマンド

### hub browse [user/repo]
`hub browse`でいまいるレポジトリのgithubページを開く．`hub browse defunkt/hub`みたいにレポジトリ指定もできる．
`browse`は打ちにくすぎるので，seeにエイリアスしてる

```bash
$ git config --global alias.see browse
```

### hub clone user/repo
`git clone https://github.com/rails/rails.git`と同じことを`hub clone rails/rails`でできる．ちょっと便利．
gemのcloneなら`gem-browse`コマンドを入れるともっと便利．
参考: [gem の github のコードを簡単に clone する](http://qiita.com/items/d19efc9842d0939290b8)

### hub pull-request
pull requestをコマンドラインから送ることができる．
ブランチをGitHubにpublishしたあとに`hub pull-request`を実行するとエディタが立ち上がり，メッセージを入力するとpull requestが送られる．便利．

### hub fork
clone後にローカルで開発してpull requestを送る準備ができたら，hub fork -> git push <myname> <branch> -> hub pull-request，という流れでコマンドラインのみで完結できる．

## こちらも参考に
- [hub README](https://github.com/defunkt/hub/blob/master/README.md)
- `git help hub`
- `hub --noop XXX`
 - `hub XXX`によりどういうコマンド/処理が実行されるか表示する．実際に実行はしない．
UIViewの座標を取得

``` objectivec:ViewController.m

@implementation ViewController

// タッチされた座標を取得
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
	CGPoint locationPoint = [[touches anyObject] locationInView:self.view];
	NSLog(@"touchesBegan = %lf,%lf\n", locationPoint.x, locationPoint.y);
}

// ドラッグ中の座標を取得
-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
	CGPoint locationPoint = [[touches anyObject] locationInView:self.view];
	NSLog(@"touchesMoved = %lf,%lf\n", locationPoint.x, locationPoint.y);
}

// 指が離れた時点の座標を取得
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
	CGPoint locationPoint = [[touches anyObject] locationInView:self.view];
	NSLog(@"touchesEnded = %lf,%lf\n", locationPoint.x, locationPoint.y);
}

@end
```
Enumerable.each_with_object の使い道


同じvalueを持つkeyがたくさんあるようなHashを初期化したいときに、
keyのArrayに対してinjectを使うと、
ブロックの最後でhashを返すのを忘れてしまってエラーになることが多いw

```ruby
value = "xxx"
hash_keys = %[ key1 key2 key3 ]

hash = hash_keys.inject({}) do |_hash, key|
  _hash[key] = value
  _hash # これを忘れがち
end
```

だけど、each_with_objectを使うと忘れても大丈夫

```ruby
hash = hash_keys.each_with_object({}) do |key, _hash|
  _hash[key] = value
end
```

ちなむと、破壊的メソッドで引数のオブジェクトを更新していくだけなので、
immutable なやつとかには使えないし、
文字列操作も普段使わないような破壊的なやつを使わないといけない。

ので、いまのところHashに同じ値を挿入するくらいしか使ったこと無い。

なお、以下のようなコードが一般的だろうがなんとなく好きではない。

```ruby
hash = {}
hash_keys.each {|key| hash[key] = value }
```

※ ちなみにeach_with_objectのブロック引数の順番が覚えられないので備忘録ついでに書いたエントリです
jsonをhtmlに変換する関数


jsonからdomに簡単に同期させたいということです。なるべくjsonの操作にDOM操作を隠蔽したい。イチイチjson解析してjQueryでdom操作みたいなたんぽぽ刺身なお仕事やってられんですよ。
遅ればせながら再帰とjson,domの相性の良さを確認した。
引数のjsonが持つプロパティはtag,id,class,text(子要素)。
\#既存でもうちょっとよさげなやつがあった
\#https://github.com/Jxck/html2json

####課題
jsonの中の変更にイベントをしかけることはできないのか
それができたらjsonいじるだけでよくなってdomを触らなくてすむ

####実行結果

```javascript:実行結果
>json2dom(testobj)
<ul class=​"ul_class" id=​"ul_id">​
<li class=​"li_class" id=​"no1">​list1​</li>​
<li class=​"li_class" id=​"no2">​list2​</li>​
<li class=​"li_class" id=​"no3">​list3​</li>​
<li class=​"li_class" id=​"no4">​list4​</li>​
<li class=​"li_class" id=​"no5">​list5​</li>​
<li class=​"li_class" id=​"no6">​list6​</li>​
<li class=​"li_class" id=​"no7">​list7​</li>​
<li class=​"li_class" id=​"no8">​list8​</li>​
<li class=​"li_class" id=​"no9">​list9​</li>​
<li class=​"li_class" id=​"no10">​list10​</li>​
</ul>​
```

####本体

```coffeescript:json2dom.coffee
json2dom =  (o)->     
  e = if o.tag? then $("<#{o.tag}/>") else $('<div/>')
  if o.class? then e.addClass o.class
  if o.attr? then e.attr o.attr 
  if o.text instanceof Array
    e.append(json2dom(c)) for c in o.text
  else
    e.append(o.text)
  return e
```

```javascript:json2dom.js

json2dom = function(o) {
  var c, e, _i, _len, _ref;
  e = o.tag != null ? $("<" + o.tag + "/>") : $('<div/>');
  if (o["class"]) {
    e.addClass(o["class"]);
  }
  if (o.attr != null) {
    e.attr o.attr);
  }
  if (o.text instanceof Array) {
    _ref = o.text;
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      c = _ref[_i];
      e.append(json2dom(c));
    }
  } else {
    e.append(o.text);
  }
  return e;
};

```
AutoHotKey(Basic)とAutoHotKey_Lの違い

久々に[AutoHotKey公式サイト](http://www.autohotkey.com/)を訪れたら、デザインが変わっていますね。

お困りの方を見かけたので、AutoHotKeyとAutoHotKey_Lの違いについて書いておきます。

![AutoHotKey公式サイトトップページ](https://lh6.googleusercontent.com/-xZHay8x-AKE/T8fz89EPL5I/AAAAAAAAEK4/SRwSo36iI4Y/s640/2012-06-01_07h37_38.png)

![Downloadsページ](https://lh4.googleusercontent.com/--i2LfUZy-6w/T8fz8owOUiI/AAAAAAAAEK0/no9VOPBKxWE/s640/2012-06-01_07h40_08.png)

ここに説明をつけたとおり、AutoHotKeyは 2種類あります。

# AutoHotKey の違い

## AutoHotKey(Basic)

* AutoHotKeyのオリジナル
* __マルチバイト非対応(日本語が文字化けする)__ 
* 以下のツールが同梱されている
	* AutoScriptWriter (recorder)
	* AutoIt3 Window Spy

## AutoHotKey_L

* AutoHotKeyの派生改良版。
* マルチバイト対応（Unicode）
* __ 上記ツールが同梱されていない__ 


いま AutoHotKey といえば、実質 AutoHotKey_L の方をことを指していると言っても過言ではないと思います。

文字化けは嫌だけど、上記ツールは使いたいので、私はAutoHotKey(Basic) をインストールしたあとに、AutoHotKey_L を上書きインストールして使っています。

# 閑話休題

多くの方々が AutoHotKey に興味を持って、Qiitaにもっと投稿してくれると嬉しいなぁ・・・
Webサーバで指定すべきヘッダ


セキュリティ対策などでWebサーバ側で指定した方が良いヘッダー。
ありそうでまとめられてなかったので投稿しておきます。

2016-02-05 update
まだストックされる方がたまにいるようなので、簡単に更新しました。

## XSS対策

* nginx

```
add_header X-XSS-Protection "1; mode=block";
```

* Apache

```
Header set X-XSS-Protection "1; mode=block"
```

## クリックジャッキング

例ではDENYにしているが、他にSAMEORIGIN、ALLOW-FROMなど

* nginx

```
add_header X-Frame-Options DENY;
```

* Apache

```
Header set X-Frame-Options DENY
```

[X-Frame-Options レスポンスヘッダ - HTTP | MDN](https://developer.mozilla.org/ja/docs/HTTP/X-Frame-Options)

## IEで発生するコンテンツタイプSniffing対策

* nginx

```
add_header X-Content-Type-Options nosniff;
```

* Apache

```
Header set X-Content-Type-Options nosniff
```

## Content-Security-Policy

[CSP (Content Security Policy) - Security | MDN](https://developer.mozilla.org/ja/docs/Security/CSP)
[弊社のホームページにContent Security Policy(CSP)を導入しました | HASHコンサルティングオフィシャルブログ](http://blog.hash-c.co.jp/2013/12/Content-Security-Policy-CSP.html)

## 以下https採用時

### Public Key Pining

SSL証明書などからbase64に変換後。オプションがいくつかあるので、サイトにあった形で。

* nginx

```
add_header Public-Key-Pins "pin-sha256='base64==xxxxxxxxxxxxxxxxxxxxxx='; max-age=5184000";
```

[Public Key Pinning - Web security | MDN](https://developer.mozilla.org/ja/docs/Web/Security/Public_Key_Pinning)

### Strict-Transport-Security

* nginx

```
add_header Strict-Transport-Security max-age=15768000;
```

[HTTP Strict Transport Security - Security | MDN](https://developer.mozilla.org/ja/docs/Security/HTTP_Strict_Transport_Security)
deviseを使ったコントローラのテスト

deviseを使って認証しているコントローラのテストを書くには、[wikiに書いてある通り](https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3-%28and-rspec%29)以下のようにすれば良い。

**spec/supportにcontroller_macros.rbを追加**

```ruby:controller_macros.rb
module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      sign_in FactoryGirl.create(:user)
    end
  end
end
```

**spec_helperに以下を追加**

```ruby:spec_helper.rb
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
  # 以下略
```

**controller_specのテストしたい箇所に以下を追加**

```ruby:users_controller_spec.rb
  describe "ログインしている場合" do
    login_user

    # 以下略
```

が、コントローラで`before_filter :authenticate_user!`にしているとsign_inしているにも関わらずroot_pathにリダイレクトされてしまう。それを防ぐには、controller_macrosにスタブを追加する。

```ruby:controller_macros.rb
module ControllerMacros
  def login_user
    before(:each) do
      controller.stub(:authenticate_user!).and_return true
      @request.env["devise.mapping"] = Devise.mappings[:user]
      sign_in FactoryGirl.create(:user)
    end
  end
end
```

ただしこれがベストプラクティスかどうかは自信がない・・・
現在のレイアウト名での挙動を設定する (ManageHook)

特定のレイアウトでの挙動を指定できます。
例は、"Float" という名前のレイアウトでは、ウィンドウを中央に Float させるという意味不明なもの。

```haskell:layoutName.hs

import qualified XMonad.StackSet as SS

layoutName :: Query String
layoutName = liftX $ gets (description . SS.layout . SS.workspace . SS.current . windowset)

myManageHook :: ManageHook
myManageHook =
  composeAll
    [ layoutName =? "Float"             --> doCenterFloat
    .... ]
```
[無変換]キー+αで、COCOA キーバインド風にカーソル移動を行う

カーソルキーやEnterキーに手を伸ばすの面倒くさい！！

というわけで、
AutoHotKeyをインストールして、以下のスクリプトを実行して常駐させると、
[無変換キー]＋α で、色々できるようになります。

例えば、

*  `無変換` + `f` / `b` / `n` / `p` : カーソル移動
*  `無変換` + `o` / `m` : `ENTER` を押したのと同じになる

あとは以下のソースコードを見て__なんとなく察してください。__
詳しい説明書いてる暇ない。

```ahk:use_muhenkan_key_like_cocoa.ahk
; [無変換]キー+αで、COCOA キーバインド風にカーソル移動を行う

; --- HotKeys
; ^ Control
; ! Alt
; # Win
; + Shift
; $ 再起処理防止(RegisterHotkey()ではなく、強制的にキーボードフックでイベントを取得する

; vk1dsc07b 無変換
; Send {Blind} avoids releasing Alt/Control/Shift/Win if they started out in the down position

; 無変換+q : アプリを終了
vk1dsc07b & q:: Send !{F4}

vk1dsc07b & b:: Send {Blind}{Left}
vk1dsc07b & n:: Send {Blind}{Down}
vk1dsc07b & p:: Send {Blind}{up}
vk1dsc07b & f:: Send {Blind}{Right}

vk1dsc07b & d:: Send {Del}
vk1dsc07b & h:: Send {BackSpace}

vk1dsc07b & a:: Send {Blind}{Home}
vk1dsc07b & e:: Send {Blind}{End}

;vk1dsc07b & p:: Send {Blind}{RollUp}
vk1dsc07b & v:: Send {Blind}{RollDown}

vk1dsc07b & m:: Send {Blind}{Enter}
vk1dsc07b & o:: Send {Blind}{Enter}

vk1dsc07b & k:: Send +{End}^x
vk1dsc07b & y:: Send ^v
vk1dsc07b & z:: Send ^z

;vk1dsc07b & .:: Send {Blind}{Esc}

; 無変換 : 無変換キーをそのまま送る
vk1dsc07b:: Send {Blind}{vk1dsc07b}
```

# 参考

* [無変換キーを鬼のように使い倒すスレ](http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1203851654/)
Google Map API 地図四隅の緯度経度取得


```javascript
function initialize() {
    var latlng = new google.maps.LatLng(35.689488, 139.691706);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
     map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
    
    //getBoundsは、地図の描画が終わってからでないと正確な値がとれないので、bounds_changedイベントに登録する。  
    google.maps.event.addListener(map, 'bounds_changed', function() {
		var info = document.getElementById("info");
		info.innerHTML = "左上　"+map.getBounds().getNorthEast().lat();
		info.innerHTML += ",　" + map.getBounds().getNorthEast().lng();
		info.innerHTML += "<br>";
		info.innerHTML += "右下　" + map.getBounds().getSouthWest().lat();
		info.innerHTML += ", " + map.getBounds().getSouthWest().lng();    
		info.innerHTML += "<br>";
		info.innerHTML += "中心　" + map.getBounds().getCenter().lat();
		info.innerHTML += ", " + map.getBounds().getCenter().lng();    
    });
    
         
  }

initialize();

```

[sample](http://jsdo.it/_shimizu/tGX0)
python レシピブックめも


URIエンコード
------------
```python
urllib.quote('いろはにほへと')
> いろはにほへと
```
URIデコード
------------
```python
 urllib.unquote('いろはにほへと')
> いろはにほへと
```

zip関数
------------
```python
sample = ['aaa', 'bbb']
sample2 = ['222', '333']

print zip(sample, sample2)
> [('aaa', '222'), ('bbb', '333')]
```

enumerate関数
-------------
```python
sample = ['aaa', 'bbb']

for num, sam in enumerate(sample):
	print num, sam
> 0 aaa
> 1 bbb
```
rake specを用意してtravis-ciを利用する


練習がてら次世代FizzBuzzこと「世界のナベアツ」を実装しようと思って、ついでにtravis-ciを利用してみた。

リポジトリは https://github.com/a2ikm/nabeatsu にある。
Ruby力がまだまだ低い…。

## rake specを用意する

travis-ciを利用するには`rake`のデフォルトがRSpecの実行になっている必要がある（なので正確には`rake spec`が必要というわけじゃない）。

で、どうやればいいのかというと、RSpecに用意されているrakeタスクをrequireすればOK。

```ruby:Gemfile
source "https://rubygems.org"

gem 'rake',  :require => false
gem 'rspec', :require => false
```

```ruby:Rakefile
task :default => [:spec]
begin
  require 'rspec/core/rake_task'
  RSpec::Core::RakeTask.new(:spec) do |spec|
    spec.pattern = 'spec/**/*_spec.rb'
    spec.rspec_opts = ['-cfs']
  end
rescue LoadError => e
end
```

こうすると`rake`でも`rake spec`でもRSpecが実行される。

ちなみにファイル構成は次のようにしている。
spec_helper.rbはRakefileには顔を出さないけど、毎回評価される。

```
+- README.md
+- Gemfile
+- Rakefile
+- lib/
|   +- nabeatsu.rb
+- spec/
    +- spec_helper.rb
    +- lib/
        +- nabeatsu_spec.rb
```


## travis-ciを有効にする

travis-ciについては http://mochizblog.heroku.com/21 が詳しいのでそちらを参照。

ざっくりと書くと次のような感じ。

1. githubにpush
2. travis-ciにサインアップして、テストしたいリポジトリを選
3. 実行を待つ（pushされるたびに実行される）

リアルタイムで処理が走ってるのが見てて面白い。

あとはREADME.mdにテスト結果を表示できるので、 http://about.travis-ci.org/docs/user/status-images/ を参考に、以下をREADME.mdに記載した。

```
[![Build Status](https://secure.travis-ci.org/a2ikm/nabeatsu.png)](http://travis-ci.org/a2ikm/nabeatsu)
```

これはMarkdown用の記法なので、ほかの記法については上記ページを参照。
Rails製CMS「Locomotive CMS」

LOCOMOTIVEというRailsベースのCMSが気になったのでいれてみました。サイトの[Getting started](http://doc.locomotivecms.com/installation/getting_started)の手順に従った内容になります。

## 環境

Rails: 3.2.3
Ruby: 1.9.3
OS: Ubuntu11.04

## インストール

まず、DBにMongoDBを使っているのでいれておきます。

```
$ sudo apt-get install mongodb
```

それから、railsコマンドで新しいプロジェクトを作成します。

```
$ rails new myapp --skip-active-record --skip-test-unit --skip-javascript --skip-bundle
$ cd myapp
```

`Gemfile`に下記を追加します。

```ruby:Gemfile
gem 'locomotive_cms', '~> 2.0.0.rc7', :require => 'locomotive/engine'
gem 'unicorn', :group => 'development'
gem 'compass-rails', '~> 1.0.0.rc.3', :group => 'assets'
gem 'therubyracer', '>= 0.8.2'
```

`bundle install`します。

```
$ bundle install
```

作成したrailsプロジェクトにlocomotive関連のファイル類をインストールします。

```
$ bundle exec rails g locomotive:install
```

## サイトに接続

ローカルでサーバを起動します。

```
$ bundle exec unicorn_rails
```

`http://localhost:8080/`に接続します。初回の起動時にアカウントの作成を促す画面が表示するので、それに従ってアカウントを作成します。作成したアカウントでログインします。

## 感想

管理画面がいけてますね。また、もうちょっとさわってみたら感想をあげたいと思います。Herokuでも動くらしいのでそのあたりもいじってみよう。

あと、はじめてMongoDBさわったのですが、migrationいらないのですね。ちょっと感動しました。
ブランチ切り替えに（やや）強いscssコマンド

```ruby:scss
#!/usr/bin/env ruby
require 'sass'
require 'sass/exec'

require 'sass/plugin'
%w[
  updating_stylesheets
  not_updating_stylesheet

  creating_directory

  updating_stylesheet
  updated_stylesheet

  template_modified
  template_created
  template_deleted
].each do |cb|
  Sass::Plugin.send "on_#{cb}" do |*args|
    # イベント発生の調査用
    $stderr.puts "on_#{cb} (#{args.join(', ')})"
  end
end
Sass::Plugin.on_compilation_error do |error, template, css|
  puts error.class
  if error.instance_of? Errno::ENOENT
    exec "bundle exec ./scss --watch sass:css"
  end
end

opts = Sass::Exec::Sass.new(ARGV)
opts.parse!
```
最初から履歴を追いやすいリポジトリをつくる


ふつうに `git init` して「最初の」コミットをつくると、最初のコミットの差分が見れない。

たとえばRailsなど、ジェネレータがいろいろつくる場合、どういうファイルが生成されたのか、という記録が残っていると嬉しい。

`git-commit` に `--allow-empty` というオプションがあって、これを渡すと空のコミットオブジェクトがつくられる。

空のコミットを最初に作っておくことで、リポジトリにおける実質的な最初のコミットの差分を見ることができる。便利。

[git-flow](https://github.com/nvie/gitflow)というツールをつかってリポジトリをつくるとデフォルトで空のコミットがつくられる。

git-flowを用いずにリポジトリをつくる場合、以下のようにしてリポジトリをつくることが多い。

```sh
git init -q && git commit -q --allow-empty -m 'Initialize repository'
```
コマンドラインから、デバイスとプリンター画面を呼び出す

コマンドプロンプトから、以下のコマンドを実行するだけで、デバイスとプリンター画面が表示されます。

```bat:printers.bat
control printers
```

![](https://lh4.googleusercontent.com/-5zBuebvykRc/T8YhbU4o8uI/AAAAAAAAEKo/tTKYxssJBxE/s400/2012-05-30_22h32_07.png)

# 参考

* [コントロール・パネル・アイテムをコマンドラインから呼び出す](http://www.atmarkit.co.jp/fwin2k/win2ktips/585cplcmd/cplcmd.html)
通常使うプリンタをコマンドプロンプトから切り替える

印刷を 紙に出力したり PDFに出力したりをこまめに切り替えたい場合、マウスで設定変更するの面倒くさい！！

以下のバッチファイルを使えば、__通常使うプリンタを一瞬で切り替えることができます。__

```bat:change_default_printer.bat
> rundll32.exe printui.dll,PrintUIEntry /y /n "[プリンタ名]"
```

![プリンタ名](https://lh3.googleusercontent.com/-hcVC_WWIf2o/T8Yc_Win18I/AAAAAAAAEKc/445WwtvbVp4/s800/2012-05-30_21h41_57.png)

## 参考

* [Rundll32 の printui.dll,PrintUIEntry](http://technet.microsoft.com/ja-jp/library/ee624057\(v=ws.10\).aspx)
* [コマンドラインからでプリンタの全てをコントロール](http://lightbox.matrix.jp/ginpro/patio.cgi?mode=past&no=24&w=720)
PECL::memcacheの管理インターフェースにtypoがあるため動かない

[PECL::memcache](http://pecl.php.net/memcache)の[最新版(3.0.6)](http://pecl.php.net/package/memcache/3.0.6)の管理インターフェース([memcache.php](http://svn.php.net/viewvc/pecl/memcache/tags/RELEASE_3_0_6/memcache.php))には、get_host_port_from_server関数の返り値の変数に「$」がついておらず、変数ではなく変数名の文字列が返ってしまうため、そのままでは動かない、という大変しょうもないエラーがある。

「`Cant connect to:v:a`」というエラーがでるので何事かと思いきや、ただそれだけのことで腰が砕けた。

[Trunkでは修正されている](http://svn.php.net/viewvc?view=revision&revision=309747 "rev. 309747")ので、そちらを利用すれば問題ない。

```sh
svn cat http://svn.php.net/repository/pecl/memcache/trunk/memcache.php > memcache.php
```
subversionがなければ、wgetかcurlで。

```sh:wget
wget "http://svn.php.net/viewvc/pecl/memcache/trunk/memcache.php?view=co" -O memcache.php
```
```sh:curl
curl "http://svn.php.net/viewvc/pecl/memcache/trunk/memcache.php?view=co" > memcache.php
```
数字のフォーマット（小数点含む！）

`number_format`にただぶっ込むと、勝手に小数点以下が四捨五入されて整数で返ってくるんですね。*（お客さんに怒られました。）*

```hoge.php
<?php
echo number_format(1234.567); // 1,235
?>
```

小数点以下も含むには、第二引数に小数点以下の桁数を書くそうです。

```hoge.php
<?php
echo number_format(1234.567,2); // 1,234.57
?>
```

これならいいですね。

しかし。
こう言う場合はどうでしょう？

```hoge.php
<?php
echo number_format(1200.5,2); // 1,200.50
?>
```

気持ち悪いですね…

小数点以下の末尾の0は取っ払いましょう。

```hoge.php
<?php
$number = number_format(1200.5,2); // 1,200.50
$number = preg_replace("/\.?0+$/","",$number); // 1,200.5
?>
```

これですっきりですね！

[PHP: number_format - Manual - http://php.net/manual/ja/function.number-format.php](http://php.net/manual/ja/function.number-format.php)

>`string number_format ( float $number [, int $decimals = 0 ] )`
`string number_format ( float $number , int $decimals = 0 , string $dec_point = '.' , string $thousands_sep = ',' )`
この関数は 1 つか 2 つもしくは 4 つのパラメータを受け取ります (3 つはありません) :
パラメータが 1 つだけ渡された場合、 number は千位毎にカンマ (",") が追加され、 小数なしでフォーマットされます。
パラメータが 2 つ渡された場合、number は decimals 桁の小数の前にドット (".") 、 千位毎にカンマ (",") が追加されてフォーマットされます。
パラメータが 4 つ全て渡された場合、number はドット (".") の代わりに dec_point が decimals 桁の小数の前に、千位毎にカンマ (",") の代わりに thousands_sep が追加されてフォーマットされます。
ファイル名がかぶった場合にバッファ名をわかりやすくする

uniquifyはEmacsに同梱されているようなので特にインストールは不要でした。

設定ファイルに下記を追加してEmacsを再起動します。

```common-lisp:.emacs.d/init.el
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)`
```

これで同じファイル名だとディレクトリ名も表示してくれます。

これは便利すぎる。いままで知らなかったのが悔やまれる。
C-a C-aしてバッファーの頭に移動する

sequential-command.elをauto-installでインストールします。

```
M-x auto-install-batch sequential-command
```

設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.el
(require 'sequential-command-config)
(sequential-command-setup-keys)
```

Emacsを再起動して、`C-a C-a C-a`とかすると、行頭にいって、バッファーの頭にいって、元に戻ります。

なにげに便利だ。
カスタムビューを使用時に、GraphicalLayoutでClassCastExceptionや”Tip: Use View.isInEditMode() in your custom views to skip code when shown in Eclipse”と出る場合の対処

NumberPicker,DatePickerをSDKから抜いてきてアプリに組み込んでる時に遭遇。
実行するとちゃんと出る。

どうやらADTのバグらしい。
http://code.google.com/p/android/issues/detail?id=6894

仕方ないので、try～catchで囲み、必要ならnullチェックしましょう。

```java:NumberPicker.java
        try{
	        mIncrementButton = (NumberPickerButton) findViewById(R.id.increment);
	        mIncrementButton.setOnClickListener(clickListener);
	        mIncrementButton.setOnLongClickListener(longClickListener);
	        mIncrementButton.setNumberPicker(this);
        }catch(ClassCastException issue6894){
        	// ADTのバグで落ちるようなので無視
        }

        try{
	        mDecrementButton = (NumberPickerButton) findViewById(R.id.decrement);
	        mDecrementButton.setOnClickListener(clickListener);
	        mDecrementButton.setOnLongClickListener(longClickListener);
	        mDecrementButton.setNumberPicker(this);
        }catch(ClassCastException issue6894){
        	// ADTのバグで落ちるようなので無視
        }

        try{
	        mText = (EditText) findViewById(R.id.timepicker_input);
	        mText.setOnFocusChangeListener(focusListener);
	        mText.setFilters(new InputFilter[] {inputFilter});
	        mText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
        }catch(ClassCastException issue6894){
        	// ADTのバグで落ちるようなので無視
        }

```
後からデフォルト値を追加する

以下のようなマイグレーションを書く。

```add_default_age_to_user.rb
class AddDefaultAgeToUser < ActiveRecord::Migration
  def change
     change_column :users, :age, :integer, :default => 30
  end
end
```

もちろんdb:migrate以前に追加したエントリについてはデフォルト値は適用されない。
homebrew+phpbrewで複数バージョンphpをインストールとxdebug、phpunitのインストール、phpstormの設定まで

Homebrewをインストール
[Homebrew — MacPorts driving you to drink? Try Homebrew!](http://mxcl.github.com/homebrew/ "Homebrew — MacPorts driving you to drink? Try Homebrew!")

PHPBrewをインストール
[c9s/phpbrew](https://github.com/c9s/phpbrew "c9s/phpbrew")

Requirementsの足りないものをhomebrewでインストール
phpbrewのインストールをhomebrew経由にするためFormulaを追加
[Formula for phpbrew — Gist](https://gist.github.com/2215820 "Formula for phpbrew — Gist")

ダウンロードして/usr/local/Library/Formulaに追加

```
brew install --HEAD phpbrew
```
以降のphpインストール、切替は[phpbrew](https://github.com/c9s/phpbrew "c9s/phpbrew")を参照

本当はphp-versionとphp-buildで管理したかったけど、
うまく行かなかったのでとりあえずこれで落ち着いた

xdebugのインストール

```
brew install php54-xdebug
```
指示に沿ってphp.iniにxdebugの設定を追記

PHPUnitをインストール
[PHPUnit PEAR Channel](http://pear.phpunit.de/ "PHPUnit PEAR Channel")
[The symfony project PEAR channel](http://pear.symfony-project.com/ "The symfony project PEAR channel")

```
pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com
pear install symfony/YAML
pear install phpunit/PHPUnit
```
こっちのやり方のほうがスマート
[sebastianbergmann/phpunit](https://github.com/sebastianbergmann/phpunit "sebastianbergmann/phpunit")

phpstormの設定
設定 > PHP > Development environment > Interpreterでインストールした各バージョンを指定する
コマンド1つでRails開発用tmuxパネルを構築する


## 追記

[tmuxinatorで一瞬で開発環境を起動する](http://qiita.com/items/869b00fdde27c2225989)にあるtmuxinatorを使うと，gemを入れてyamlファイルを書くだけで以下のようなことができるようです．
**追記ここまで**

以下のファイルを`~/.tmux/ror.conf`などに保存し，tmuxを立ち上げてから`tmux source-file ~/.tmux/ror.conf`を実行すると，ログ用ウィンドウやpry用ウィンドウなどを作ってくれる．

# 利用しているツール
- tmux v1.6
- powder v0.1.6
 - https://github.com/rodreegez/powder
- spork v1.0.0rc2
- pry v0.9.9.6

# 設定ファイル

```config:ror.conf
# Settings for Rails project
# $ tmux source-file ~/.tmux/ror.conf
# 
# Set up 3 windows
# 1: LOG: rails logs with powder
# 2: TEST: execute spork
# 3: pry (rails c) & rails-sh

# To create three new windows
# neww
# neww
# neww

# 0
select-window -t 0
send-keys 'git status' C-m

# 1
select-window -t 1
rename-window LOG
split-window -h
send-keys -t LOG.0 'powder applog | grep -vE "(^\s*$|asset)"' C-m
send-keys -t LOG.1 'powder log' C-m

# 2
select-window -t 2
rename-window TEST
split-window -h
send-keys -t TEST.0 'bundle exec spork' C-m
send-keys -t TEST.1 'bundle exec spec'

# 3
select-window -t 3
rename-window PRY_RAILS-SH
split-window -h
send-keys -t PRY_RAILS-SH.0 'rails c' C-m
send-keys -t PRY_RAILS-SH.1 'rails-sh' C-m

# Back to 0
select-window -t 0
```

tmuxで特定ウィンドウ/paneでコマンドを実行する方法は http://qiita.com/items/5e3e047569aa15187c49 を参考にした．
`tmux send-keys -t name.0 'ls' C-m`
よく使うgit履歴チェック方法

```
git log --pretty=oneline origin..mybranch
# ブランチを切った後で、今までで何が変更されたかが1ラインごとに確認可能。

git rev-list origin..mybranch
# これでも確認可能。上記との違いはsha1sumだけとれるところ。
```
リモートで消されたブランチが手元で残ってしまう件を解消する

よそからcloneしてきたリポジトリでは、remotes/origin/xxxという名前でoriginのブランチが参照される。

```bash
$ git branch -a
* master
  remotes/origin/hoge
  remotes/origin/fuga
```

だが、他の人がhogeブランチを削除してoriginにpushしても、既にそのブランチが手元にある人のローカルリポジトリからは普通にpullしても消えてくれない。

そういった既にリモートで削除されているブランチを消したい場合は、以下のどちらかの操作を実行すればちゃんと消えてくれる。

## git fetchもしくはgit pullにpruneオプションをつける

--pruneオプションをつけると、fetchやpullする際に自動的にリモートで削除されているリモートブランチを削除してくれる。

```bash
$ git fetch --prune
 x [deleted]         (none)     -> origin/hoge
```

## git remote pruneを実行する

```bash
$ git remote prune origin
 x [deleted]         (none)     -> origin/hoge
```
VSSから最新を取得するバッチ

```bat
@echo off

REM  VSSのユーザ名
set ssUser=hoge_user

REM  VSSのパスワード
set ssPwd=hoge_pass

REM  VSSのDBが格納されたディレクトリ
set ssDir=\\hoge_server\VSSDB\

REM ss.exeが格納されたディレクトリに移動
cd /d "C:\Program Files\Microsoft Visual SourceSafe"

REM  最新を取得
ss Get "$/hoge_project/src" -W -R -I-Y -GL"C:\hoge_project\src"

REM 自身が格納されたディレクトリに移動
cd /d %~dp0
```
PHP5.4をインストール



PHP5.4については2012年5月現在、PHP5.4.3がremi-testリポジトリからインストールできる。
まずはremiリポジトリをインストールしておく。


```
$ wget http://rpms.famillecollet.com/enterprise/5/remi/x86_64/remi-release-5-8.el5.remi.noarch.rpm
$ rpm -Uvh remi-release-5-8.el5.remi.noarch.rpm
```


続いて、yumでremi-testを有効にしてインストールする(下はphpのみだがお好みでパッケージを追加する)。

```
$ yum –enablerepo=remi-test install php
```

PHP5.3以降が予めインストールされている場合でも、よしなにアップグレードしてくれる。
MySQLでもゆのっちといっしょ


MySQLのインタラクティヴ・シェルのプロンプトは、対話実行環境で動的に設定する以外にいくつか方法があって、/etc/my.cnf か $HOME/.my.cnf で設定するか、`MYSQL_PS1` という環境変数を定義するとよい。

色をつけると見やすくなるので色をつけたい。シェル上で実行される場合、エスケープシーケンスが有効なのでそれを使うとよさそう。

my.cnfにバックスラッシュを書く場合、バックスラッシュ自身をエスケープしたほうがよい、と書いてあって、面倒そうなにおいを感じるので、環境変数を設定することにする。

Vimだと `<C-v><C-[>` で `\e` にあたる文字を入力できるが、`git-diff` などでもエスケープシーケンスが有効になってちょっと危険なので直接入力せずに済む方法を考えてみる。

```zsh
export MYSQL_PS1="$(echo -e "<\\\U> [\\\d]\\\n(L:\\\c) \e[33mX | _ | X\e[m < ")"
```

これでゆのっちと共に、
BLASTの結果っぽい文字列の表示

試しに。
複数の同じ長さの文字列を並べて表示したい時のための方法。BLASTなどの結果と似た感じの出力。

```py
from math import ceil
 
hoge = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
fuga = "abcdefghijklmnopqrstuvwxyz"

def multi_line(str_list, col_length):
    # str_list内の文字列の長さは同じとする
    for k in range(int(ceil((float(len(str_list[0])))/col_length))):
        e = (k + 1)*col_length if (k+1)*col_length < len(str_list[0]) else len(str_list[0])
        for s in str_list:
            print s[k*col_length:e]
        print "\n"

multi_line([hoge, fuga], 13)
# This will produce:
# ABCDEFGHIJKLM
# abcdefghijklm
#
# NOPQRSTUVWXYZ
# nopqrstuvwxyz
#
```
Picasaウェブアルバムにメールから投稿する方法

私は、Qiitaに記事を投稿する際に、Picasaウェブルバムに画像を置いているので、作業を効率化するためにもメモ。

## Picasaウェブアルバム 側の設定

[Picasaのサイト](https://picasaweb.google.com/home)にログインし、以下の手順で、メールで写真をアップロードできるように設定します。

最後に[変更を保存]ボタンを押すのをお忘れなく。


![](https://lh5.googleusercontent.com/-er3UO561HIk/T8Teqi8CmpI/AAAAAAAAEKM/m6e49N9YDfE/s640/2012-05-29_23h24_47.png)

そして、写真のメール送信先アドレスを控えておきます。


## 画像をメールで送信する際の注意

写真をメールで先ほど控えたアドレス宛に送信すれば、ウェブアルバムに投稿されます。
ただし、__メールの件名を、投稿したいアルバム名と同じにして__送信してください。

![](https://lh6.googleusercontent.com/-y85Q1vM_eAI/T8TeqqHTi-I/AAAAAAAAEKI/1oPeAvZ6q1c/s800/2012-05-29_23h30_09.png)
VMwarePlayer に CentOS6.2を最小構成にするとブリッジ接続できない

VMwarePlayer に CentOS 6.2 を最小構成でインストールしたらVMware Player側でいくらブリッジ接続を選んでも外部ネットワークに一切つながらなかった。
(`ifconfig`で`eth0`が表示されない状態。)

こちらで解決しました。あざっす♪
[VMware Playerを使ってCentOS6.2(minimal)をインストールする｜ヘビィ・ＳＭＤ！](http://ameblo.jp/smd310/entry-11182382161.html)

最小構成にする場合、CentOS側でネットワークの設定が必要ということで、インストール中と、インストール後の２つの方法がある。

---

1. インストール途中のホスト名を設定する画面で左下にある [Configure Network]ボタンから「ネットワーク接続」を開き、`System eth0`を選んで [編集...] ボタンをクリック。

2. 「□ 自動接続する」にチェックを入れて、[適用...]ボタンをクリック。[閉じる]ボタンをクリックして、「ネットワーク接続」を閉じる。

---

インストールを完了している場合、ifcfg-eth0を編集する。

1.ネットワークデーモンを停止する

```
/etc/rc.d/init.d/network stop
```

2.ifcfg-eth0を編集

```
vi /etc/sysconfig/network-scripts/ifcfg-eth0
```

```
ONBOOT="yes"
BOOTPROTO="dhcp"
```

3.ネットワークデーモンを起動

```
/etc/rc.d/init.d/network start
```

おかげさまで、`yum -y update`が出来るようになりました。感謝！
Rubyのflymakeが正しく動作しない時

具体的にはRuby1.9以降のハッシュ記法

```ruby:hash.rb
{ key: value }
```

がエラー行と見なされていた。
実はflymakeはrubyを呼び出していて、Ruby1.9はrvmで入れていたので、システムのRuby1.8.7が呼び出されていた。
rvm.el https://github.com/senny/rvm.el
をloadpathの通った所に入れて、.emacsに

```elisp:rvm-settings.el
;; rvm
(when (require 'rvm nil t)
  (rvm-use-default))
```

で解決。
さくら VPS に Minecraft サーバーを構築


[さくらの VPS](http://vps.sakura.ad.jp/) を使って、Minecraft サーバーを立てる方法を紹介します。
さくらの VPS への登録は済ませておいてください。

## 前提知識
- 基本的な UNIX コマンドの知識

## Ubuntu 10.04 をインストール

VPS コントロールパネルの「OS 再インストール」のところから、「カスタムOSインストールへ」
「OS選択」で「Ubuntu 10.04 amd64」を選んでインストール。

インストールの設定は http://support.sakura.ad.jp/manual/vps/mainte/custom_ubuntu.html を参照してください。

## Java のインストール

Ubuntu の OS インストールが終わったら、Java をインストール。
Java は Minecraft を実行するために必要です。

```
$ sudo apt-get install openjdk-6-jdk
```
を実行すると、
インストールされるものがワーっと出てきて、`Do you want to continue [Y/n]?` と聞かれるので、「Y」と入力して Enter。

終わったら

```
$ which java
```

を実行して、

```
/usr/bin/java
```

と出ればインストール成功。


## 25565 番ポートの解放

Minecraft サーバーは、25565 番ポートを使用するので、このポートを空ける設定をします。
以下のコマンドを実行してください。

```
$ sudo ufw default deny
$ sudo ufw allow 22
$ sudo ufw allow 25565
$ sudo ufw enable
```

`Command may disrupt existing ssh connections. Proceed with operation (y|n)?` と聞かれるので、「y」と打って Enter。

22 番ポートはサーバーにログインするために必ず必要。
他にも、例えば 80 番ポートを開きたかったら、ここで `sudo ufw allow 80` としてください。

```
$ sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
25565                      ALLOW       Anywhere

```

となったら OK。


## Minecraft サーバーのインストール

以下のコマンドを実行すると、`/home/<Ubuntuのユーザーネーム>/minecraft/` の中に、`minecraft_server.jar` がダウンロードされます。

```
$ wget https://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar -P ~/minecraft
```

次に、Minecraft を起動するためのスクリプトを用意します。

```
$ sudo nano /etc/init/minecraft.conf
```

と実行すると nano というエディタが開くので、次のように書いて保存。
（Minecraft に割当てるメモリ量を増やすには、1024M となっているところを適宜変えてください）

```/etc/init/minecraft.conf
description "Minecraft server"

chdir /home/<Ubuntuのユーザーネーム>/minecraft

exec java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui

start on startup
```

保存するには「control + o」を押したあと Enter、エディタを閉じるには「control + x」。

## Minecraft サーバーの起動
```
$ sudo start minecraft
```
とすれば、Minecraft サーバーが立ち上がります！
これで、PC の Minecraft から、今回用意したサーバーにマルチプレイで繋げることができるようになります。

Minecraft サーバーを止めるときは、

```
$ sudo stop minecraft
```

## 関連記事
[Minecraft サーバーを Amazon EC2 上に構築](http://qiita.com/items/d88f4d2778e738efe2eb)
macのSketchUpで、rubyコードを自動実行する


macで実行中のGoogleSketchUpをアクティブにし、Rubyコードエディタを表示させ、クリップボードのテキストをコピーして実行させるAppleScriptです。

使用方法：

1. VimなどでSketchUp用Rubyを作成する
2. コード全体をクリップボードにコピーする
3. このスクリプトを呼び出す

Vim側でこれを呼び出すプラグインは、現在作成中です。
QuickRunなどと連携できたら最高ですが、ただのRubyファイルと紛らわしいので、独自に実装するほうがいいかも知れません。


``` ~/bin/activate_sketchup.scpt
if application "SketchUp" is running then
	tell application "SketchUp"		activate	end tell
else 
	return
end iftell application "System Events"	get properties	get every process	if UI elements enabled then		tell process "SketchUp"			set frontmost to true		end tell				(*日本語版専用*)		tell process "SketchUp"			tell menu bar 1				tell menu bar item "ウィンドウ"					tell menu "ウィンドウ"						click menu item "Ruby コンソール"					end tell				end tell			end tell		end tell		tell application "System Events"			keystroke "v" using {command down}			keystroke return		end tell			else		tell application "System Preferences"			activate			set current pane to pane "com.apple.preference.universalaccess"			display dialog "UI element scripting is not enabled. Check \"Enable access for assistive devices\""		end tell	end ifend tell
```
Locale の設定 (Ubuntu)

```
$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
```

という表示される場合、

```
$ sudo update-locale LC_ALL=en_US.UTF-8
```

とすれば、再ログイン後に、

```
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
```

となって、`warning: setlocale: LC_CTYPE: cannot change locale (UTF-8)` というエラーがでなくなります。
Ubuntu 12.04 インスタンスに ec2-api-tools をインストール


Ubuntu 12.04 インスタンスに ec2-api-tools, ec2-ami-tools をインストールする方法のメモ。
起動するインスタンスは、Ubuntu Server 12.04 LTS (ami-60c77761) です。

## レポジトリをアップデート

sources.list を編集するので、バックアップをしておきます。

```
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
```

/etc/apt/sources.list の中の、コメントアウトされている以下の6行を有効にします。

```/etc/apt/sources.list
deb http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise multiverse
deb-src http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise multiverse
deb http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates multiverse
deb-src http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates multiverse

deb http://security.ubuntu.com/ubuntu precise-security multiverse
deb-src http://security.ubuntu.com/ubuntu precise-security multiverse
```

レポジトリをアップデート。

```
$ sudo apt-get update
```

## ec2-api-tools のインストール

ec2-api-tools, ec2-ami-tools をインストール。

```
$ sudo apt-get install ec2-api-tools ec2-ami-tools
```

入ったか確認。

```
$ which ec2-describe-images
/usr/bin/ec2-describe-images
```

入りました :-)
東京アメッシュの画像をrmagickで解析して雨が降っているかどうか調べる

```ruby:amesh.rb
require 'open-uri'
require 'RMagick'
include Magick

# 現在アクセス可能な雨量画像のファイル名一覧を含むjsを取得 現在時刻から計算することも可能っぽい
times_url = "http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js"
times_js = open(times_url).read()
times = times_js.sub("Amesh.setIndexList([", "").sub(");", "").chomp!.chomp!.split(",").map!{|t| t[1..-2].to_i}

# でかいほうのgif画像最新一件を取得 /100/じゃなくて/000/にすると小さくなる
gif_url = "http://tokyo-ame.jwa.or.jp/mesh/100/#{times[0]}.gif"
amesh_gif = open(gif_url).read()
amesh_magick = Magick::Image.from_blob(amesh_gif).first

# 色と雨量の対応関係
color_precipitation_map = {
  Magick::Pixel.new(0, 0, 0, 0)             => 0,
  Magick::Pixel.new(0, 0, 257, 65535)       => 0,
  Magick::Pixel.new(52428, 65535, 65535, 0) => 3,
  Magick::Pixel.new(26214, 39321, 65535, 0) => 10,
  Magick::Pixel.new(13107, 13107, 65535, 0) => 20,
  Magick::Pixel.new(0, 65535, 0, 0)         => 30,
  Magick::Pixel.new(65535, 65535, 0, 0)     => 40,
  Magick::Pixel.new(65535, 39321, 0, 0)     => 50,
  Magick::Pixel.new(65535, 0, 65535, 0)     => 80,
  Magick::Pixel.new(65535, 0, 0, 0)         => 100,
}
# ここで必要だったら magick_image.corp(x, y, w, h) などで切り抜く
target_area = amesh_magick
# 切り出し領域のピクセル全部で、色から雨量への換算をする
target_area.each_pixel do |px, col, row|
  precipitation = color_precipitation_map.fetch(px, -1)
  case precipitation
  when 0
  when 1..100
    # 雨が観測されている地域の雨量と画像内の座標
    p [precipitation, col, row]
  when -1
    # 未知の色が使われ始めた?
    p [px.to_color, px, col, row]
  end
end
```
Ubuntu12.04でimage-magickとrmagickを入れる

rmagick gemをインストールする際、Magick-configがないとかMagicWand.hがないとかで怒られることが多い

```
Can't install RMagick 2.13.1. Can't find Magick-config
Can't install RMagick 2.13.1. Can't find MagickWand.h
```
などのエラーがおきる

apt使うのを諦めてソースから入れている事例も多いが以下のようにパッケージを入れれば問題なかった

```bash
sudo aptitude install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev
sudo gem install rmagick
```
scaffoldでcontrollerのみを作成する

*rails g scaffold_controller User*

通常のscaffold同様、index,show,new,edit,create,update,destoyアクションを含むコントローラと、それぞれに対応するviewやテストなどが生成される。
モデルやマイグレーションは一切手を付けない。
ただしroutes.rbだけは更新されない模様。
手動でresources :usersなどを追加する必要がある。（routing_specは作成される）

既にあるモデルにCRUDアクションを付け加える場合などに便利。
StrictMode & android.os.NetworkOnMainThreadException

Android 3.0からはStrictModeがデフォルトで有効になっており、UIスレッド上でネットワーク処理を行おうとすると 
android.os.NetworkOnMainThreadException という例外が投げられる。

StrictModeを無効にするには後述のコードを書けばいいけれど、テスト以外ではAsyncTaskなどを使いUIスレッド外で処理した方が良いと思う。

```
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
```
JavaScriptで array_key_exists を実現

転載元：http://d.hatena.ne.jp/nantekkotai/20081205/1228500694

```javascript:array_key_exists.js

function array_key_exists (key, search) {
    // Checks if the given key or index exists in the array  
    // 
    // version: 1109.2015
    // discuss at: http://phpjs.org/functions/array_key_exists    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Felix Geisendoerfer (http://www.debuggable.com/felix)
    // *     example 1: array_key_exists('kevin', {'kevin': 'van Zonneveld'});
    // *     returns 1: true
    // input sanitation
    if (!search || (search.constructor !== Array && search.constructor !== Object)) {
        return false;
    }
 
    return key in search;
}
```
Excel VBAでnslookup

使い慣れないので記録を取っておく意味でエントリーしておく．
自前の関数は「標準モジュール」に配置する... と．

```　nslookup.bas
Option Explicit

Function nslookup(ip As String) As String

  Dim wsh, exec, cmd, res As String, i As Integer
  Dim buf() As String

  Set wsh = CreateObject("WScript.Shell")
  cmd = "nslookup " & ip

  Set exec = wsh.exec("%ComSpec% /c " & cmd)

  Do While exec.Status = 0
    DoEvents
  Loop

  res = exec.StdOut.ReadAll

  buf = Split(res, vbCrLf)

  For i = 0 To UBound(buf)
    If Left(buf(i), 5) = "Name:" Or Left(buf(i), 3) = "名前:" Then
      host_name = Mid(buf(i), 10)
    End If
  Next i

End Function
```
背景をCanvasにする

背景をCanvasにしてグリグリ動かすとインパクトがあって良い。([これ](http://mohayonao.herokuapp.com/perfume3)とか[こういう](http://mohayonao.github.com/timbre/examples/002_rhythmsequencer.html)感じ)
少し工夫しないとCanvasが前面に来てボタンの操作とかができなくなるので、下記のようなHTML/CSSを書いてやる。

```html
<body>
  <canvas id="canvas"></canvas>
  <section id="body>
    /* 実際のbodyはここに書く */
  </section>
</body>
```

```css
#canvas { position:fixed;    top:0; left:0; width:100%; height:100%; }
#body   { position:absolute; top:0; left:0; }
```

キャンバスサイズを小さめにしておくと拡大されてボワッとした感じになるけどそのぶん軽量。

```js
var canvas = document.getElementById("canvas");
canvas.width  = 480;
canvas.height = 320;
```
コンテンツタップでヘッダー・フッターが消える挙動を禁止する設定


jQuery Mobile 1.1 の場合。

```
$("[data-role=header]").fixedtoolbar({ tapToggle: false });
$("[data-role=footer]").fixedtoolbar({ tapToggle: false });
```

jQuery Mobile 1.0 の場合

```
$.mobile.fixedToolbars.setTouchToggleEnabled(false);
```

それぞれのバージョンに合った設定をしないと反応しないので、注意！
PHPのメモリの上限を変更する


```
$ vi /etc/php.ini
$ /memory_limit
----------------------
memory_limit = 128M
```

CentOSだとデフォルトで128Mに設定されているので、この部分を変更する。

```
memory_limit = 256M
----------------------
$ :wq
$ service httpd restart
```

これで完了。
特定のプログラムの実行時のみメモリを変更したい場合は.htaccessに記載するか、もしくはプログラム中で、

```php
ini_set('memory_limit', '256M');
```

として動的に設定することが可能。
Logging basic config の設定例



## Info Log を標準出力

```python
logging.basicConfig(level = logging.INFO,
	format = '%(asctime)s %(levelname)s %(message)s')
```


## Warn 以上をファイルに出力

```python
logging.basicConfig(format='%(asctime)s %(module)s[%(lineno)d] [%(levelname)s]: %(message)s',
                    filename = '/var/tmp/branch.txt',
                    level = logging.WARN)
```
mruby が変わってた (on Ubuntu)

前の投稿 http://qiita.com/items/ad40f5e11e0fafcc0bf7 から 1 ヶ月少々が経過し，最新の mruby を取得してきてビルドしてみようとしたら出来なくなってたので修正を．

まず Hello World のサンプルコードですが，GitHub 上の Wiki にありました．
https://github.com/mruby/mruby/wiki/Hello-World

しかし include ディレクトリの中に compile.h が無いのでコメントの指示通り

```c:hello-world.c
#include <stdlib.h>
#include <stdio.h>

/* Include the mruby header */
#include <mruby.h>
#include <mruby/proc.h>
#include <mruby/data.h>
#include <mruby/compile.h> /* ここが変更された */

int main(void)
{
  struct mrb_parser_state *p;
  mrb_state *mrb = mrb_open();
  char code[] = "p 'hello world!'";
  printf("Executing Ruby code from C!\n");

  p = mrb_parse_string(mrb, code);
  int n;
  n = mrb_generate_code(mrb, p->tree);
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
  if (mrb->exc) {
    mrb_p(mrb, mrb_obj_value(mrb->exc));
  }
  return 0;
}
```

と変更します．後は，hello-world.c を mruby ディレクトリに置いてそこで

```sh
gcc -Iinclude hello-world.c lib/libmruby.a -lm
```

そして

```sh
./a.out
```

すれば

```
Executing Ruby code from C!
"hello world!"
```

と表示され Hello World プログラム無事成功です．
ファイルの先頭に文書をインサートする


```ruby:output.rb
open("./output.txt", "r+") do |file|
  # insert current time to head line
  lines = file.readlines
  lines.unshift("hello\n")
  file.rewind
  
  lines.each do |line|
    file.write line
  end
end
```

なんかもっといい手がありそう。