OmniAICreator/Qiita-1.07M huggingface dataset:
変数展開時の単語分割（word split）をマスターする

シェルスクリプトは、スペース区切りの文字列が代入された変数を展開するとき、文字列をスペースの位置で分割して複数の文字列のように扱う。この挙動は Bash （をはじめとする Bourne shell 系のシェル）と Zsh とで異なってくる。

# 普通の変数について

Bash では、展開する変数をクォートしなければ単語分割が起きる。クォートすれば単語分割は起きず、スペースを含む1つの文字列として展開される。 Zsh では、変数をクォートするかしないかにかかわらず単語分割は起きない。ただし、 `SH_WORD_SPLIT` オプションをオンにすると Bash 準拠の挙動に変わる（デフォルトでオフ）。以下に単語分割の例を示す：

```bash
### 下準備

# 第1引数を echo する関数
function echo_first {
    echo $1
}

# スペース区切りの文字列を含む変数
var="a b c"



### Bash の場合

echo_first  $var  # => a
echo_first "$var" # => a b c

for v in $var; do
    echo $v
done
# => a
# => b
# => c

for v in "$var"; do
    echo $v
done
# => a b c



### Zsh （SH_WORD_SPLIT がオフ）の場合

echo_first  $var  # => a b c
echo_first "$var" # => a b c

for v in $var; do
    echo $v
done
# => a b c

for v in "$var"; do
    echo $v
done
# => a b c
```

Zsh で変数を強制的に単語分割するには `${=var}` のように書く。記法の詳細ついては [`man zshexpn`](http://linux.die.net/man/1/zshexpn) の "Parameter Expansion" を参照のこと。

# 特殊変数 `$*` と `$@` について

シェルスクリプトへのコマンドライン引数を格納する特殊変数 `$*` と `$@` は、それ自体がクォートされている場合の単語分割の挙動が異なる。 `"$*"` は、単語分割が起きずに1つの文字列として展開される。 `"$@"` は、引数に **クォートされていないスペース** が含まれる場合、そこで単語分割が起きる。

`$*` または `$@` がクォートされていない場合、 Bash はスペースの位置で単語分割する。 Zsh はクォートされていないスペースの位置で単語分割する。

以下に例を示す：

```bash:wordsplit.sh
### クォートされたスペースを含む引数を与えて実行してみる

bash wordsplit.sh "a b" c
zsh  wordsplit.sh "a b" c



### Bash の場合

# $*: スペースで分割
for v in $*; do
    echo $v
done
# => a
# => b
# => c

# "$*": 分割なし
for v in "$*"; do
    echo $v
done
# => a b c

# $@: スペースで分割
for v in $@; do
    echo $v
done
# => a
# => b
# => c

# "$@": クォートされていないスペースで分割
for v in "$@"; do
    echo $v
done
# => a b
# => c



### Zsh （SH_WORD_SPLIT がオフ）の場合

# $*: クォートされていないスペースで分割
for v in $*; do
    echo $v
done
# => a b
# => c

# "$*": 分割なし
for v in "$*"; do
    echo $v
done
# => a b c

# $@: クォートされていないスペースで分割
for v in $@; do
    echo $v
done
# => a b c

# "$@": クォートされていないスペースで分割
for v in "$@"; do
    echo $v
done
# => a b
# => c
```
Rails3のログがApacheで複数プロセス走ると混ざって解析できなくなるのに対応する方法


config/application.rb or config/enviroments/production.rb

````ruby
config.log_tags = [:uuid]
````

とすると、以下のように

````
[fdfb18680c27a2e0edb94bd2f1bdccd4] Started GET "/" for 127.0.0.1 at 2013-02-01 19:00:57 +0900
[fdfb18680c27a2e0edb94bd2f1bdccd4] Processing by Home::EntriesController#index as HTML
[00af38e7a0fc3b52757706e58cc17ab3] Started GET "/groups/my.js?_=1359712869432" for 127.0.0.1 at 2013-02-01 19:01:09 +0900
[00af38e7a0fc3b52757706e58cc17ab3] Processing by Home::GroupsController#my as JS
````

先頭にリクエストごとに一意になる uuid が付与されるようになるので、複数プロセスのログが混ざりこんでも、どのログが１トランザクションなのか分かるようになります。
ソースコードのヘッダコメントブロック例


ソースコードを書く時、とりあえず埋め込んどくべきかと思ったので
**自分用に**簡略化して整理。[PEARの例](http://pear.php.net/manual/ja/standards.header.php)を参考にしました。


## 例
```
/**
 * Short description for file
 *
 * Long description for file (if any)...
 *
 * PHP versions 4 and 5
 *
 * @category   CategoryName
 * @package    PackageName
 * @author     Hogehoge <hoge@hoge.com>
 * @copyright  2010-2013 Hogehoge
 * @license    http://www.opensource.org/licenses/mit-license.html  MIT License
 * @version    0.1
**/
```


## 解説
- PHPのバージョンや@category, @packageは必要に応じて。
- ライセンスは基本、MITで。ちゃんと全文載せる場合は[こちら](https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt)をコピペで。
- その他の項目やライセンスについては、[PEARの例](http://pear.php.net/manual/ja/standards.header.php)を参照のこと。


## 参考・引用
- [PEAR - Manual :: ヘッダコメントブロック](http://pear.php.net/manual/ja/standards.header.php)
- [Latest topics > オープンソースなライセンスやコピーレフトなライセンス、クリエイティブコモンズについて、他のライセンスとどう組み合わせられるのかを図にしてみた - outsider reflex](http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2008-04-02_license.htm)
compass使う人こそ、TincrでのCSSコーディングがかっこいい


わりと最近までCSSは、chromeの「Sources」タブで、
リアルタイムに変更を見ながら書くのが最高だと思ってました。

が、compass/Sassを覚えるとやっぱりこれも捨てがたい。

というわけで、compassで書きつつもリアルタイム確認ができるツール探したら、ありました。
chrome拡張機能Tincrです。

- Tincr Chrome Extension [http://tin.cr/](http://tin.cr/)
- Chrome ウェブストア - Tincr [https://chrome.google.com/webstore/detail/tincr/lfjbhpnjiajjgnjganiaggebdhhpnbih](https://chrome.google.com/webstore/detail/tincr/lfjbhpnjiajjgnjganiaggebdhhpnbih)


こいつをインストールすると、おなじみchromeの開発者ツールに「Tincr」タブが追加されます。
タブごと追加するというあたりイケメンですね。

[http://gyazo.com/3566609e9da93c1bf915def9a43a60f7](http://gyazo.com/3566609e9da93c1bf915def9a43a60f7)

そして現在書いているサイトのルートディレクトリを指定してあげれば、
ルートディレクトリ以下のCSSとJavascriptを監視して、
ファイルへの変更があったらそのファイルだけリロード・してくれます。
もちろん、CSSが更新されたらなら即座にリレンダリングされますよ。

ファイル変更があった時に、ページ丸ごとのリロードではなく、
**変更されたファイルだけリロードされる**というのがいいですね。
Javascriptも存分に使っているサイトの場合、そこまでやり直されるとうっとおしい。

----

そんなわけで、

1. scssを変更する
2. compass watchが感知してcss更新
3. Tincrが感知してレンダリング更新

という、テクノロジーに頼り切った感じで書いております。
CSV を解析する

```csv:data.csv
1111,1122,1133
2211,2222,2233
3311,3322,3333
4411,4422,4433
```

```sh
#!/bin/sh

for record in `cat data.csv`; do
     echo "${record}" | nawk -F , '{print "1列目:" $1 "3列目:" $3}'
done
```

```:実行結果
1列目:1111 3列目:1133
1列目:2211 3列目:2233
1列目:3311 3列目:3333
1列目:4411 3列目:4433
```
　↓
そもそもループなんて要りませんでしたー

```sh
nawk -F , '{print "1列目:" $1 "3列目:" $3}' data.csv
```

[awk歴一日の初心者が語るawk理解のポイント - 睡眠不足？！](http://d.hatena.ne.jp/sleepy_yoshi/20110918/p1)
herokuアプリケーションの名前を変更する

herokuアプリケーションの名前を変更する方法についてのドキュメントです。
といっても大した事は無く、昔はちょっと面倒だったようですが、現在はコマンド一発です。
ということをお伝えしたくて記事にしました。

## 1. herokuアプリの名前を変更する。

herokuアプリのディレクトリ内で変更する場合

```
$ heroku rename 新しい名前
```

herokuアプリのディレクトリ外で変更する場合

```
$ heroku rename 新しい名前 --app 古い名前
```

herokuの管理画面でrenameすることもできますが、その場合だと、herokuコマンドが--app 新しい名前 を付けないと動作しないようになってしまいます。

また、以前は以下の２のステップも必要でしたが、現在は、前者のherokuアプリのディレクトリ内でheroku renameした場合は、２のステップもherokuが自動的にやってくれるようです。

## 2. gitのリモートのURLを変更する（現在は不要）

```
$ git remote rm heroku
$ git remote add heroku git@heroku.com:新しい名前.git
```

## 謝辞

以下のサイト様の情報を大部分使わせていただきました。ありがとうございます。
[T.I.D.](http://tokkonopapa.github.com/blog/2011/12/21/heroku-app-name/)様

私が追記した情報がとても少なくて、なんか申し訳ないです（汗）
このドキュメントの功績の大部分はT.I.D.様にあります^^;
URI.joinでちょっとはまった

```ruby
URI.join("http://www.yahoo.co.jp/foo/", "/bar/baz") # http://www.yahoo.co.jp/bar/baz
URI.join("http://www.yahoo.co.jp/foo/", "bar/baz") # http://www.yahoo.co.jp/foo/bar/baz
URI.join("http://www.yahoo.co.jp/foo", "/bar/baz") # http://www.yahoo.co.jp/bar/baz
URI.join("http://www.yahoo.co.jp/foo", "bar/baz") # http://www.yahoo.co.jp/bar/baz
```

完全に勘違いしてました。
http://www.yahoo.co.jp/foo/ に対して /bar/baz をただ結合するのではなくて、
http://www.yahoo.co.jp/foo/ に対して /bar/baz はどこを指してるのか、を返すんですね。
http://www.yahoo.co.jp/foo なら、少なくともディレクトリではないので、
/bar/baz だろうが bar/baz だろうが http://www.yahoo.co.jp/bar/baz になる、と。
require されている gem のインストールパスを取得する

ちょっとしたツールを作っていて、ruby の中で今使っている gem のインストールパスを取得する必要に迫られたので、同じことをやっているはずの ```gem which``` コマンドの中をのぞいてパクることにしました。

必要なところだけ抜き出すと、こう。

```ruby
Gem::Specification.find_by_path(<GEM_NAME>).full_gem_path
```

参考: [rubygems/commands/which_command.rb on github]( https://github.com/rubygems/rubygems/blob/master/lib/rubygems/commands/which_command.rb)
Cellsで定義したViewの内部でhelperメソッドを使う方法


以下の２つの比較的メジャーなgemを合わせて利用している時の話。
- [cells](http://cells.rubyforge.org/)
- [devise](https://github.com/plataformatec/devise)

例えばユーザプロフィール用の表示をCellsで定義して、ログインしている、していないで表示を分けたい場合など。DeviseのメソッドをCellsのviewで使いたい場合がある。利用するためにはCellsの「hoge_cell.rb」内で下記の様に記述すれば良い

```ruby:user_signed_in?メソッドを使う場合
class HogeCell < Cell::Rails
  include Devise::Controllers::Helpers
  helper_method :user_signed_in?

  …
end
```

同じくApplicationHelperに定義しているメソッドを使いたい場合

```ruby:
class HogeCell < Cell::Rails
  helper ApplicationHelper
  
  ...
end
```
robocopy による同期

作業フォルダと対象フォルダ内のファイル郡を更新時刻が新しいファイルで同期する

```bat
@echo off
call :rcopy "%userprofile%" file1 file2 file3
call :rcopy "%ProgramFiles%\vim" vimrc 

exit

:rcopy
	set tf=%*
	set td=%1
	call set tf=%%tf:%td%=%%
	robocopy %1 . %tf% /XO
	robocopy . %1 %tf% /XO
goto :eof
```
Oracleのビューをバージョン管理

プログラムのコードはみんなバージョン管理してると思いますけど、DBに入ってるビューはバージョン管理してますか？
ビューの中でコメント入れてコメントアウトして管理してたり、DumpやExportだけって方が実際は多いのでは？

うちはビューの中身をテキストに書きだして、Gitで管理してます。

定期的に出力して自動でコミットさせても、変更かけた時に手動で取り出してコメント付けてコミットしてもどっちでもいいけど、テストしにくいビューはすぐに戻せるようにしておくと精神的に楽です。

ホストとユーザー名,パスワード、それと取り出したいスキーマを指定してやると、更新があった時だけファイルを書き換える仕様です。

```perl
use strict;
use warnings;
use DBI;
use FindBin;
use Data::Dumper;
use Digest::MD5;

my $host   = 'XXX.XXX.XXX.XXX';
my $user   = 'XXXXX';
my $pass   = 'XXXXX';
my @schemas = qw/schema list XXXX/;

my $dbh = DBI->connect(
  "dbi:Oracle:host=$host;sid=$sid",
  $user, $pass, {
    LongReadLen => 1024 * 1024 * 10})
  or die "Unable to connect: $DBI::errstr";


foreach my $schema (@schemas) {
  my $sql =<<EOF;

-- SQL --
SELECT VIEW_NAME
      ,TEXT
  FROM SYS.ALL_VIEWS
 WHERE OWNER = '$schema'

EOF

  my $sth = $dbh->prepare($sql);
  $sth->execute();
  while (my $result = $sth->fetchrow_hashref) {
    if ($result) {
      my $view_name = $result->{VIEW_NAME};
      my $filename = $schema . "." . $view_name . ".sql";
      my $file_exist = 0;
      my $file_md5 = Digest::MD5->new;
      if (-e $filename) {
        open FILE, $filename;
        $file_md5->addfile(*FILE);
        close FILE;
        $file_exist = 1
      }

      my $text  = "CREATE OR REPLACE VIEW $schema.$view_name AS\n";
      $text .= $result->{TEXT};
      my $text_md5 = Digest::MD5->new;
      $text_md5->add($text);

      if ($file_exist = 0 || $file_md5->digest ne $text_md5->digest) {
        open OUT, "> $filename" or die "Can't open file $filename";
        print OUT $text;
        close OUT;
      }
    }
  }
}
```
yamahaルーターでポートフォワーディング設定


###静的IPマスカレード設定  フォワーディング先のIP 192.168.0.10 ポート番号 5432
nat descriptor masquerade static <NATディスクリプタ番号> <静的IPマスカレードエントリの識別番号> <フォワーディング対象のIPアドレス> <プロトコル> <ポート番号>

    nat descriptor masquerade static 1 10 192.168.0.10 tcp 5432

###フィルタリング
####フィルター設定
ip filter <フィルタの番号> <pass/reject> <送信元IP> <宛先IP> <プロトコル> <送信元ポート> <宛先ポート>

    ip filter 10 pass * * * * *
    ip filter 100 pass 許可IPアドレス * tcp * 5432
    ip filter 101 reject * * tcp * 5432

### フィルターの有効化
PPPoE接続を利用しているので、ppインターフェイスにフィルターを有効化する
※ デフォルト：フィルター設定をしていない場合はすべての通信を許可している

* ルール
 * フィルターを有効化された場合には暗黙のdenyが存在するので注意が必要
 * フィルターは割り当てられた順番で適応される ※フィルターの順番でかわってくるので注意

以下の準備で設定、特定IPからの5432を許可し、他のIPからの5432は拒否、その後すべての通信許可設定。

    ip pp secure filter in 100 101 10

※ PPインターフェイスで静的IPマスカレードを設定済みであること

    ip pp nat descriptor 1

この設定状態で、許可IPアドレスホストから5432ポートへの接続を確認し、他のIPからはアクセスできないことを確認できました。
秘密鍵、X509証明書 作成


## 秘密鍵の精製
```
openssl genrsa -rand rand.dat -des3 2048 > hoge.key
```

## X509証明書の作成
```
openssl req -new -x509 -out hoge.crt -key hoge.key
```

## 秘密鍵へのパスフレーズ挿入
```
openssl rsa -in hoge.key -out hoge.key 
```
EC2 EBSボリューム拡張手順


1. インスタンス停止

EC2のインスタンスが起動している場合は停止します。

- Instances > Instance Actions ＞ stop 

2.スナップショット取得

対象のインスタンスでEBS ID vol-xxxxを確認後、EBSボリュームを選択し、Snapshotを取得します。

- Volumes > 対象Volumeを選択 > More.. > Create Snapshot > nameとDescriptionを入力し、create

3.EBSボリュームの作成 

2で作成したスナップショットから容量を拡張したEBSボリュームを作成します。※ Availability Zoneが異なるとアタッチできないので注意

- Snapshots > 2で作成したsnapshotを選択 > Create Volume > Size、AZ、Snapshot、Volume Type を選択し、 Yes Create

4.EBSボリュームの付け替え
拡張前のEBSボリュームをデタッチし、新しく作成したEBSボリュームをインスタンスにアタッチします。

- Volumes > 対象ボリュームを選択 > more… > Detach Volume

- Volumes > 新しいボリュームを選択 > more… > Instancesを選択、Device /dev/sda1 

5.追加した容量分をOSに認識させる
拡張したEBSをマウントした状態で起動しただけでは、OS上では認識されない。その為、resize2fsコマンドでファイルシステムのサイズを変更する

- resize2fs /dev/sda1
GASでDocumentsからHTMLへ変換する

GASではDocumentsやSpreadsheetから`pdf`に変換可能な`getAs`というメソッドがあります。

```javascript
    var pdfBlob = SpreadsheetApp.getActive().getAs("application/pdf");
```

これはこれで便利なのですが、他のフォーマットに変えたい場合もあります。
しかし現在のところgetAsメソッドはpdfの変換しか対応していません。確か

なので今回はGoogle Drive APIを利用してDocumentsからHTMLに変換してみようと思います。

# コード

```javascript
var KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; //developer key , get from https://code.google.com/apis/console/b/1/ 
var FILE_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // drive file id
function convertDocuments2() {
  
  var oauthConfig = UrlFetchApp.addOAuthService('drive');
  
  //Create oauth config for drive api
  var scope = 'https://www.googleapis.com/auth/drive';
  oauthConfig.setConsumerKey('anonymous');
  oauthConfig.setConsumerSecret('anonymous');
  oauthConfig.setRequestTokenUrl('https://www.google.com/accounts/OAuthGetRequestToken?scope='+scope);
  oauthConfig.setAuthorizationUrl('https://accounts.google.com/OAuthAuthorizeToken');    
  oauthConfig.setAccessTokenUrl('https://www.google.com/accounts/OAuthGetAccessToken');  
  //1gC166L6sjPzhKlZB-ux2L7wsqnYn5eZ_bqbe5BjgwSM
  var param = {
    method:'get',
    oAuthServiceName: 'drive',
    oAuthUseToken: 'always',
  };
  
  //Get file 
  var res = UrlFetchApp.fetch('https://www.googleapis.com/drive/v2/files/' + FILE_ID + '?fields=exportLinks&key='+KEY, param);
    
  //this response body format is json , and it has file id. Please see https://developers.google.com/drive/v2/reference/files#resource
  var fileDataResponse = JSON.parse(res.getContentText());
  
  var res = UrlFetchApp.fetch(fileDataResponse.exportLinks["text/html"] + "&key=" + KEY,param);
  
  return res.getContentText();
  
}
```

# 軽い解説
`KEY`に[Google APIs Console](https://code.google.com/apis/console/)から取得したAPI KEYを設定し、
`FILE_ID`にはDocumentsのID(URLのkey)を設定してください。

あとはOAuthして、Google Drive APIを利用してファイルのメタデータを取得、変換用のリンクを使って、HTMLバージョンを取得しています。

#補足
* ちゃんとメソッド化してないけど許してください。
* 他の変換については[こちら](https://developers.google.com/drive/manage-downloads#downloading_google_documents)を参照してください。
mocha+testling-ciでブラウザテストを自動化する


結果的にはこの様なバッジが出来ます、githubにpushする度更新されるので便利。
![ブラウザとの相性](http://ci.testling.com/haokang-den/constant.png)

環境を整える
------
コマンドラインからもcoffeeやmochaは実行したいのでこの二つはグローバルに入れる。詳細は前の[投稿](http://qiita.com/items/8ecedf0a589cc0b21e2e)で。

```
$ git init
$ npm init

$ npm install coffee-scirpt -g
$ npm install mocha -g
$ npm install chai --save-dev
```

package.jsonにtestling設定を追加。
------
欲張りすると無駄に重なるので注意。

```package.json
{
  "testling": {
    "browsers": {
      "ie": [ 6, 7, 8, 9, 10 ],
      "ff": [ 12, 13, 14, 15, 16, 17 ],
      "chrome": [ 20, 21, 22, 23 ],
      "opera": [ 10, 11, 12 ],
      "safari": [ 5.1 ]
    },
    "harness" : "mocha",
    "files": "test/*.coffee"
  },
  "devDependencies": {
    "chai": "*",
    "mocha": "*",
    "coffee-script": "*"
  }
}

```

githubのプロジェクトページで[webhookを設定](http://ci.testling.com/#hook)
------

プロジェクトページ > settingボタンをクリック > サイドバーからservice hooks > WebHook URLに

> http://git.testling.com

と入力。

詳細はgithubの[公式ドキュメント](https://help.github.com/articles/post-receive-hooks)参照。

完成
------

これでgithubにpushする度以下のURLで結果が見れます、テスト待ちに少々時間がかかります。

>http://ci.testling.com/ユーザー名/プロジェクト名

README.mdにはこう書きますとテスト結果が画像で表示されます。

```markdown:README.md
[![browser support](http://ci.testling.com/USER/PROJECT.png)](http://ci.testling.com/USER/PROJECT)
```

詳細は[公式ドキュメント](http://qiita.com/items/ebc4f1b14b5297886fad)を参照。


作者は[browserify](https://github.com/substack/node-browserify)などを作った[browserling](https://browserling.com)
Subversion リポジトリのURLを変更する

参考サイト：[Subversion でリポジトリの場所が変わったら](http://webos-goodies.jp/archives/50513024.html)
参考サイト：[svn_switch](http://www.caldron.jp/~nabetaro/svn/svnbook-1.4-final/svn.ref.svn.c.switch.html)
参考サイト：[Subversion_FAQ](http://subversion.apache.org/faq.ja.html)

#概要
サーバが老朽化したとか、あっちのサーバに統合するとかで、
リポジトリのURLが変わるのはよくあること。
ローカルの作業ディレクトリを一旦亡き者にして、再度チェックアウトしてもいいのだけど、
SVNで管理してたのは、ソースだけだったので実行モジュールとか消えてしまっても本当にいいか不安がある。

作業ディレクトリがこっそり持っているリポジトリのURLだけを変更できればいいのならば、もっとスマートにやりたい。

#コマンド

```bash:svnコマンド
$ svn switch --relocate <古いリポジトリ> <新しいリポジトリ>
```

これで変更が可能なんだが、、、、、
実際にやってみると

```bash:svn実行結果
$ svn switch --relocate svn://old.com/trunk svn://new.jp/trunk
svn: PROPFIND リクエスト (相手: '/trunk') が失敗しました
svn: PROPFIND (URL: '/trunk'): 403 Forbidden (http://new.jp)
```

エラーがでてしまった(/_;)
いろいろ情報を探していたら、どうやらsvnのキャッシュに以前にアクセスした
ユーザID等が残っていて、更新対象の作業ディレクトリのユーザID等がキャッシュと
違ったために認証に失敗していたらしい。

というわけで、ユーザID等を指定すれば、うまくいくはず。

```bash:ユーザID、パスワード付きswitchコマンド
$ svn switch --relocate --username <ユーザID> --password <パスワード> svn://old.com/trunk svn://new.jp/trunk
```

で、解決できればよかったのだけど、
自分は変更前のユーザID、パスワードを知らないのでこの方法が使えなかった。
それで、どうしたかというとキャッシュを覗いて無理やり書き換えて対応した。

キャッシュの場所:```~/.subversion/auth/svn.simple/<英数字の羅列>```

```bash:認証情報をそーっと覗いてみる
$ cat ~/.subversion/auth/svn.simple/<英数字の羅列>
※英数字の羅列のファイルは一つづつ中身を確認してください

K 8
passtype
V 6
simple
K 8
password
V 7
old_pass
K 15
svn:realmstring
V 41
<http://old.com:80> Subversion Repository
K 8
username
V 7
old_user
END
```

これをよくみるとsvn:realmstringの後にリポジトリの配置先があって、同じようにユーザIDとパスワードもある。
ここから古いリポジトリのユーザIDとパスワードを新しいリポジトリのキャッシュに手で書き換えて```svn switch```。
OKこれでできた。

。。。。ってセキュリティ的にこれでいいのか？と思ってたらやっぱり同じ考えの人がいた。しかも６年前に。
[簡単に復号できても平文よりマシ](http://n.h7a.org/blog/entry/1398)

パスワードを完全に暗号化するのは無理でも、難読化するパッチはおそらくコレ
http://svn.haxx.se/dev/archive-2006-10/0508.shtml

・・・ソースからコンパイルしなおす必要があるのですネ。
・・・６年前のパッチだから、今のバージョンでもそのままパッチが当てられるのか検討する必要があるのですネ。
UITableViewやUICollectionViewでUIRefreshControlを使う

iOS6 からメールアプリに実装されている「下に引っ張って更新」が
UIRefreshControl を使って簡単に実装できるので
UITableViewController や UICollectionViewController で使ってみる。

```objc
- (void)viewDidLoad
{
    // UIRefreshControl の初期化
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl = refreshControl;
    [refreshControl addTarget:self action:@selector(refreshOccured:) forControlEvents:UIControlEventValueChanged];
    // tableViewの中身が空の場合でも UIRefreshControl を使えるようにする
    self.tableView.alwaysBounceVertical = YES;
    [super viewDidLoad];
}

- (void)refreshOccured:(id)sender
{
    [self xxx]; // 更新する処理を呼ぶ
    [self.refreshControl endRefreshing];
}
```

**self.tableView.alwaysBounceVertical の設定を書かないと
tableView や collectionView の中身が
空の場合やセルの数が少ない場合に UIRefreshControl が機能しないので注意。**

UITableView や UICollectionView をそのまま使っている場合は

```objc
[tableView addSubview:refreshControl];
```

のようにすれば実装できる。
Githubで絵文字を簡単に使おう


![emoji-cheat-sheet](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130220/20130220233608_original.jpg?1361370979)

[Emoji cheat sheet for Campfire and GitHub](http://www.emoji-cheat-sheet.com/)

好きな絵文字をクリックすると、コマンドがクリップボードにコピーされます。
Mac OS X 10.8でSubversionリポジトリをMercurialのリポジトリに変換する


## 準備

### SubversionとPythonのsubversion bindingをインストール

Homebrewで`--python`オプション付きでSubversionをインストールする。このオプションがないとPythonのsubversion bindingがインストールされないので変換できない。

すでに`--python`オプション無しでSubversionをインストール済みであればアンインストールしてからインストールし直す。

```
brew install --python subversion
sudo sh -c 'echo /usr/local/lib/svn-python > /Library/Python/2.7/site-packages/subversion.pth'
```

### convert拡張を利用可能にする

`~/.hgrc`に以下の内容を追加

```
[extensions]
hgext.convert =
```

## 変換の実行

```
hg convert リポジトリURL
hg update
```


## 参考

- [Hgsubversion bindings errors on Mountain Lion] (https://confluence.atlassian.com/display/SOURCETREEKB/Hgsubversion+bindings+errors+on+Mountain+Lion)
PowerShellでファイル名を複雑なパターンで置換する方法

ファイル名を切ったり貼ったりして加工してファイル名を置換する場合、コマンドプロンプトでは難しかったのでPowerShellで実装しました。
忘れかけてたので個人的なメモがてら。

```ReplaceFile.ps1
# カレントディレクトリに移動
cd "対象ディレクトリ";

# 各ファイルに対して操作
Get-ChildItem | ForEach-Object
{
	# ファイル名を'-'で区切ってみたり
	$data = $_.Name.Split('-');
	
	# ファイル名が"H"で始まってたら除外したり
	if($data[0][0] -ne 'H')
	{
		# 新しいファイル名を並び替えで作ったり
		$newname = $data[1] + "-" + $data[0] + "-" + $data[2];
		
		# pdfじゃなかったら末尾に"-abs.pdf"を追加したりして
		if(!($newname.EndsWith(".pdf")))
		{
			$newname += "-abs.pdf";
		}
		
		# ファイル名を変更
		Rename-Item $_ -newName $newname;
	}
}
```
Unicornの再起動時の問題をbefore_forkで対応する


Unicornは軽量、かつダウンタイム無しで再起動可能ということでよく利用しています。
ただ、再起動のためにUSR2シグナルを送るとゾンビプロセスが発生します。
とりあえず色々調べて対処した記録。

## 方法
unicornのconfigに以下を追記します。

``` ruby:config/unicorn.rb
 
before_fork do |server, worker| 
  # workerの数が1以上ならTTOUを送ってworkerを減らす
  # workerの数が1なら古いmasterをkillする
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      puts "Sending #{sig} signal to old unicorn master..."
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
 
  # 順次workerをkillするために、forkされる速度を落とす
  sleep 1
end

after_fork do |server, worker|
  ActiveRecord::Base.establish_connection if defined?(ActiveRecord::Base)
end
```

この設定をしておけば、あとは再起動時に古いプロセスをkillしてくれます。

```
kill -USR2 `cat /tmp/unicorn.pid`
```


## 参考
http://codelevy.com/2010/02/09/getting-started-with-unicorn.html
https://gist.github.com/jamiew/626672
Firefoxが勝手に不足しているタグを挿入することによる弊害

# 問題の概要
table直下にtrがある場合FirefoxがDOM上でtbodyタグを補完します。
そのため、Firebug等を用いてXPathやCSSパスをコピペしようとする際に実際のパスと異なったものが取得されます。
Firebug等からコピペしたパスを使ってWebページのスクレイピングを行うコードを書くときなどは注意してください。

## Firefoxで開く前のHTMLソース
```html:table.html
<table>
 <tr>
  <th><br></th>
  <th>列-A</th>
  <th>列-B</th>
  <th>列-C</th>
 </tr>
 <tr>
  <td>行-1</td>
  <td>A1</td>
  <td>B1</td>
  <td rowspan=2>C1-C2</td>
 </tr>
 <tr>
  <td>行-2</td>
  <td>A2</td>
  <td>B2</td>
 </tr>
 <tr>
  <td>行-3</td>
  <td>A3</td>
  <td colspan=2>A3-B3</td>
 </tr>
</table>
```

## Firebug上で取得したHTMLソース
```html:table.html
<table>
 <tbody><tr>
  <th><br></th>
  <th>列-A</th>
  <th>列-B</th>
  <th>列-C</th>
 </tr>
 <tr>
  <td>行-1</td>
  <td>A1</td>
  <td>B1</td>
  <td rowspan="2">C1-C2</td>
 </tr>
 <tr>
  <td>行-2</td>
  <td>A2</td>
  <td>B2</td>
 </tr>
 <tr>
  <td>行-3</td>
  <td>A3</td>
  <td colspan="2">A3-B3</td>
 </tr>
</tbody></table>
```

tbodyタグが勝手に挿入されていることが分かります。
omniauth-facebookでのログインで、NoMethodError（`ssl?`メソッド）が出た時の解決法


omniauth-facebookを利用したログインで、

```
A NoMethodError occurred in #:

 undefined method `ssl?' for #<Rack::Request:0x00000016927848>
 omniauth (1.1.2) lib/omniauth/strategy.rb:408:in `full_host'
```

というエラーが出るようになってしまった。その解決法のメモ。

## 環境
rails v3.0.20

```
$ bundle list
Gems included by the bundle:
...
  * oauth2 (0.8.0)
  * omniauth (1.1.2)
  * omniauth-facebook (1.4.1)
  * omniauth-oauth2 (1.1.1)
…
  * rack (1.2.8)
  * rack-mount (0.6.14)
  * rack-test (0.5.7)
  * rails (3.0.20)
...
```

## 原因
どうやらインストールされているrackのバージョン(1.2.8)が古いため、`ssl?`メソッドを持っていないらしい。(v1.4以降から定義されている)

## 解決法

`config/initializers`ディレクトリ以下に新しいファイルを作成し、`ssl?`メソッドを定義する。

```ruby:config/initializers/rack_path.rb
require 'rack'

Rack::Request.class_eval do
  def ssl?
    scheme == 'https'
  end
end
```

これで一応解決した。

まあrackの最新版を使えって話ですかね。。
sinatraでファイルをダウンロードさせるだけの簡単なサーバを書く


## サーバのコード

```ruby:file_server.rb
requre 'sinatra'

get '/:file_name' do |file_name|
  send_file(file_name)
end
```

## 実行例

以下のようにサーバを起動

```
$ ruby -rubygems file_server.rb
```

`http://localhost:4567/hoge.png`のようにブラウザからアクセスすると、サーバを起動したディレクトリ配下から該当ファイルをダウンロードしてくれる。

## 参考

[Method: Sinatra::Helpers#send_file — Documentation for sinatra (1.3.4)](http://rubydoc.info/gems/sinatra/Sinatra/Helpers:send_file)
jubaclassifier 起動スクリプト （スタンドアロン）

# 前置き
 * RHEL系を対象としたスクリプトです
 * configurationのJSONファイルは、/etc/jubatusに置かれる前提です
 * jubaclassifierのみを対象としています
 * スタンドアロンのみを対象としています

# 設置
/etc/init.d　に置く。

# 使い方
$ sudo service jubatus-classifier
Usage : /etc/init.d/jubatus-classifier (start|stop|status|restart)

$ sudo service jubatus-classifier start
Starting jubatus-classifier:                               [  OK  ]

$ sudo service jubatus-classifier status
jubatus-classifier (pid  11575) を実行中...

$ sudo service jubatus-classifier stop
Stopping jubatus-classifier:                               [  OK  ]

$ sudo service jubatus-classifier restart
Stopping jubatus-classifier:                               [  OK  ]
Starting jubatus-classifier:                               [  OK  ]

# ランレベルへの登録など
$ sudo chkconfig --add jubatus-classifier

$ sudo chkconfig --list jubatus-classifier
jubatus-classifier      0:off   1:off   2:off   3:off   4:off   5:off   6:off

$ sudo chkconfig --level 345 jubatus-classifier on

$ sudo chkconfig --list jubatus-classifier
jubatus-classifier      0:off   1:off   2:off   3:on    4:on    5:on    6:off

$ sudo chkconfig --del jubatus-classifier


```jubatus-classifier
#!/bin/sh
#
# chkconfig: - 99 32

# Source function library
. /etc/init.d/functions

SERVICENAME="jubatus-classifier"
RETVAL=0

PIDFILE=/var/run/jubatus-classifier.pid
JUBACLASSIFIER=/usr/bin/jubaclassifier

CONFIG=/etc/jubatus/config.json
#LOGDIR=/tmp
MODELDIR=/tmp
LOGCONFIG=/usr/share/jubatus/example/log/log4cxx.xml

start() {
	echo -n "Starting ${SERVICENAME}:"
	${JUBACLASSIFIER} -f ${CONFIG} -d ${MODELDIR} -g ${LOGCONFIG} &
	RETVAL=$?
	if [ ${RETVAL} = 0 ]; then
		success
		touch /var/lock/subsys/${SERVICENAME}
		/sbin/pidof ${JUBACLASSIFIER} > ${PIDFILE}
	else
		failure
	fi
	echo
}

stop() {
	echo -n "Stopping ${SERVICENAME}:"
	killproc $JUBACLASSIFIER -TERM
	RETVAL=$?
	if [ ${RETVAL} -eq 0 ]; then
		rm -f /var/lock/subsys/${SERVICENAME}
		rm -f ${PIDFILE}
	fi
	echo
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	status)
		status ${SERVICENAME}
		;;
	restart)
		stop
		start
		;;
	*)
		echo "Usage : $0 (start|stop|status|restart)"
		RETVAL=1
esac

exit ${RETVAL}
```
Cakefileサンプル


Cakefileのサンプル。

```shell
$ cake
````
で実行できる。
基本的な動作はnode.js上で実行されるので、node.jsの内容をそのまま記述できる。
`{exec} = require 'child_process'`はCoffeeScriptの分割代入をrequireメソッドに使っているだけ。


```coffee
{exec} = require 'child_process'

files = [
    'js/coffee/main.coffee'
]

exec "coffee -o js/ -j main.js -c #{files.join ' '}", (err, stdout, stderr) ->
    throw err if err
    console.log stdout + stderr

```
Railsで記事のpreviewとか作る時


元々のフォームはsubmitしたくない。フロントとかサーバーとかで二重送信防止してたりすると、previewしたら二度とsubmitできないみたいな感じになってしまうと思う。

form内にリンク置いといて、それクリックしたらフォームをcloneして、actionだけ変えてsubmitするというのはまあまあ汎用的に使えて良いのではないかという風に思いついて書いてみた。

```ruby
# config/routes.rb
resources :posts
  collection do
    post :preview
  end
end
```

```ruby
# app/controllers/posts_controller.rb
def preview
  @post = Post.new(post_params)
  render :show
end

private
def post_params
  params.require(:posts).permit(:title, :body)
end
```

```erb
# app/view/posts/new.html.erb
<%= form_for(@post) do |p| %>
  <%= p.text_field :title %>
  <%= p.text_area :body %>
  <%= link_to('Preview', preview_posts_path, :class => 'preview_btn') %>
  <%= p.submit :disable_with => 'Sending...' %>
<% end%>
```

```coffeescript
# app/assets/javascript/posts.js.coffee
$ ->
  $preview_btn = $ '.preview_btn'
  $preview_btn.on 'click', (evt)->
    evt.preventDefault()
    $target = $ evt.target
    $form = $target.closest('form')

    # こうしないと謎にtextareaのvalueがcloneされない
    $form.find('textarea').each (index, node)->
      $node = $ node
      $node.text $node.val()

    $preview_form = $form.clone().hide().attr({
      action: $target.attr('href'),
      target: '_blank'
    })
    # edit時とかだと <input name="_method"> のvalueがputになっている
    $preview_form.find('[name=_method]').val 'post'
    $('body').append $preview_form
    $preview_form.submit()
    $preview_form.remove()
    $preview_form = null
ネットワークが切り替わっても VirtualBox 内で名前解決できるようにする

外側のネットワーク接続先が切り替わると VirtualBox 内で DNS 名前解決ができなくなって困ってたのですが

```
> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm hogehoge --natdnspassdomain1 off --natdnshostresolver1 on
```

(hogehoge は VM 名)

としたら良いらしいと聞いて、試してみたら確かに解決してました。
お問い合わせメールから商品番号を正規表現で抜き出す

>これらの商品の購入を考えていますが、大量発注できますか？
>
>商品番号：foo, bar, hoge

こんな感じの問い合わせメールが送信されるとして、
この文章から商品番号（ここでは foo と bar と hoge）を正規表現で抜き出したい。
サンプルを書いて、正規表現を試した。

```java:FindProductNoSample.java
import java.util.regex.*;
public class FindProductNoSample {
    public static void main(String[] args) {
        String s = "商品番号：foo, bar, hoge";
        String p = "(?:^商品番号：|\\G, )(\\w+)";
        Pattern pt = Pattern.compile(p);
        Matcher mt = pt.matcher(s);
        while (mt.find()) {
            System.out.println(mt.group(1));
        }
    }
}
```

実行結果はこうなる。
foo
bar
hoge

参考URL
[java - RegEx Advanced : Positive lookbehind - Stack Overflow](http://stackoverflow.com/questions/2683592/regex-advanced-positive-lookbehind)
[Pattern (Java Platform SE 7 )](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)
Subversionを使用する際に cannot set LC_CTYPE locale と警告が出る場合

# 問題の概要
Subversionを使用する際に cannot set LC_CTYPE locale と警告が出ることがある。

```
$ svn update
svn: warning: cannot set LC_CTYPE locale
svn: warning: environment variable LANG is ja_JP.UTF-8
svn: warning: please check that your locale name is correct
```

これは使用している環境に環境変数LANGで指定しているロケールが存在しないため発生する。

# 対処法
環境変数LANGに正しいロケールを指定する。（例は en_US.UTF-8 を指定した場合）

```
$ export LANG=en_US.UTF-8
$ svn update
At revision 4584.
```
Gitで既にmasterにマージされている使用済みブランチを消す方法


ブランチいっぱい作っているとどれがマージ済みで削除していいかわからなくなったりしますよね。そんな時のためのTipsです。


## 使用済みブランチの削除関係Tips

リモートリポジトリ名を`origin`とする。

- ローカルのマージ済みブランチを(currentとmaster以外)消す

(現在のブランチにマージ済みなものを消すので通常`git checkout master`後に使う）

```
git branch -d $(git branch --merged | grep -v master | grep -v '*')
```

- リモートのマージ済みブランチを消す

```
git push origin $(git branch -r --merged | grep origin/ | grep -v master | sed s~origin/~:~)
```

- リモートで消されたブランチをローカルに反映

```
git remote prune origin
```

- fetchする時についでに反映（`-p`は`--prune`)

```
git fetch -p origin
```

## 合わせ技

ローカルのmasterをリモートのマスターに同期するのと同時に、既にmasterにマージされたブランチをローカル、リモート共に消す。
自分はmasterを同期させたいタイミングではいつもこのコマンドを使っています。

```
git checkout master && git pull origin master && git fetch -p origin && git branch -d $(git branch --merged | grep -v master | grep -v '*') && git push origin $(git branch -r --merged | grep origin/ | grep -v master | sed s~origin/~:~)
```
unite.vimでファイルの新規作成を候補に出す方法

前々からUniteでファイルの新規作成できたらなあと感じていたんですが、最近、`:Unite file`なら新規作成ができることに気づきました

で、よくマニュアルをみたらsourceに`file/new`っていうのがありました

例えば

```
noremap :uff :<C-u>UniteWithBufferDir file file/new -buffer-name=file<CR>
```
とかしておけば、:uffで、現在のバッファと同一ディレクトリにないファイル名なら[New File]が候補に現れます

あと、ファイル名の変更は変えたいファイル名でtabを押して`rename`でOK
moveやcpもできますね
@mixinや@ifでレスポンシブなcssとそうでないcssで共通ファイルを作成する

偶々そういう案件に出くわしたので備忘録がてらに。

例えば
共通で読み込ませたいcss、`common.css`を全ページに使用している。
けれど作成中のサイトにはレスポンシブなページと、そうでないページがある……でもデザインは同じ。
そういうときは以下のようにすれば一元管理が少しは容易になるかと。
以下は例。

## まずはsettingで必要な変数を定義します。

```scss:_setting.scss
$baseWidth: 960px;
$spWidth: 768px;
```

## 次にmixinを作ります。
`mq-desctop`, `mq-mobile`などは[クラスメソッドさん謹製のmixinファイルを使ってます。](http://dev.classmethod.jp/tool/diffecult-media-queries-scss-mixin/ "Media Queriesの記述を少し楽にしてくれるSCSS（Sass） Mixin（自作）")

```scss:_parts.scss
@mixin common-main($value) {
	#main {
		@extend .clearfix;
		clear: both;
		margin: 0 auto;
		@if $value == dynamic {
			max-width: $baseWidth;
			width: 100%;

			@include mq-desctop {
				a:hover img {
					@include opacity(.6);
				}
			}
			@include mq-mobile {
				max-width: $spWidth;
			}
		} @else if $value == static {
			width: $baseWidth;

			a:hover img {
				@include opacity(.6);
			}
		}
	}
}
```

## 読み込ませたいファイルにincludeします。

```scss:common-dynamic.scss
.clearfix::after {
	content: "";
	display: table;
	clear: both;
}
@include common-main(dynamic);
```

```scss:common-static.scss
.clearfix::after {
	content: "";
	display: table;
	clear: both;
}
@include common-main(static);
```

## こうなります

```css:common-dynamic.css
.clearfix::after,
#main::after {
	content: "";
	display: table;
	clear: both;
}
#main {
	clear: both;
	margin: 0 auto;
	max-width: 960px;
	width: 100%;
}
@media screen and (min-width: 769px) {
#main a:hover img {
	filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
	opacity: 0.6;
}
}
@media screen and (max-width: 768px) {
#main {
	max-width: 768px;
}
}
```

```css:common-static.css
.clearfix::after,
#main::after {
	content: "";
	display: table;
	clear: both;
}
#main {
	clear: both;
	margin: 0 auto;
	width: 960px;
}
#main a:hover img {
	filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
	opacity: 0.6;
}
```

`common-dynamic.scss`を修正して…あ、`common-static.scss`のほうも修正しなきゃ…なんて事がなくなるので、こういった場合は`@if`を使わずとも`@mixin`は非常に便利ですね。
ただこのままだと、`_parts.scss`は`@if`だらけになる可能性が無きにしも非ず。

こんなのレスポンシブなんてやめてスマホとPCサイトわけて作れよ！ってのは言わない約束だよ。もう遅いんだ。

もっと頭良い書き方あったら是非教えて下さい！
Githubで間違えてgit push -f origin masterしてしまった時の対応


`origin`が`https://github.com/[username]/[reponame]`というgithub上で管理しているリモートリポジトリだとする。

ここで誰かが間違えて、必要な変更を失ってしまうような`git push -f origin master`をやってしまった場合の話。

```
force-pushed branch master of [username]/[reponame] from 1e6753 to 8cec0c
```

`8cec0c`ではなく`1e6753`の状態に戻したいが、`1e6753`は誰のローカルにも存在しなく、github上でもタグや名前が付けられてないのでfetchしてくることが出来ないとする。

https://github.com/[username]/[reponame]/commit/1e6753
にアクセスすれば、`1e6753`がどんなコミットであったか分かる。

ここでは、`1e6753`が255番目のMerge Pull Requestだと分かったとする。
直接、masterにpushするというような運用をしていななければ、たいてい最新のmasterは何らかのMerge Pull Request後であると思う。

```
$ git ls-remote origin
```

でremote originにある全てのreferenceがわかり、Github上には`ref/pull/番号/merge`と`ref/pull/番号/head`が全てのpull requestに対してあるというのがわかる。
これらは全てローカルにfetchしてくることが出来るので、あとは

```
$ git fetch origin refs/pull/255/merge
From github.com:[username]/[reponame]
 * branch            refs/pull/255/merge -> FETCH_HEAD
$ git checkout FEACH_HEAD
$ git checkout -b old_master
$ git log (確認)
$ git push -f origin old_master:master
```

とやれば`1e6753`と同じ内容にmasterが戻る。


実例で説明できない分ちょっとわかりにくくなってしまったが、これは実際に起った問題で、意外とWeb上に情報がない問題だったりする。実際にこうやることで直せたので誰かの役に立つことを期待。`push -f`はたまに必要だったりするけど怖い・・・。
Apacheのアクセスログの形式をLTSVにしてみる

 * 以下のサイトを読んでアクセスログの形式をLTSVにすると解析がしやすそうなのでしてみた。
  * [LTSV FAQ - LTSV って何? どういうところが良いの? - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20130209/1360381374)

## やったこと

 * Apacheのconfig設定

```apacheconf
# LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "host:%h\tident:%l\tuser:%u\ttime:%t\trequest-first-line:\"%r\"\tstatus:%>s\tresponse-size:%b\trefer:\"%{Referer}i\"\tuser-agent:\"%{User-Agent}i\"" ltsv

# CustomLog logs/access_log combined
CustomLog logs/access_log ltsv
```

 * Apacheのreload

```shell
$ sudo /etc/init.d/httpd reload
```

 * アクセスログの確認
  * 以下のような形式に

```
host:192.168.0.1	ident:-	user:-	time:[19/Feb/2013:12:41:50 +0000]	request-first-line:"GET /icons/small/folder2.gif HTTP/1.1"	status:404	response-size:342	refer:"http://www.example.com/icons/"	user-agent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"
```

* アクセスログを見やすく表示してみる
 * ltsview gemはruby1.8はサポートしておらず1.8では動作しなかった

```shell
$ sudo gem1.9 install ltsview

$ sudo tail /var/log/httpd/access_log | ltsview 
---
:host: 192.168.0.1
:ident: ! '-'
:user: ! '-'
:time: ! '[19/Feb/2013:12:41:52 +0000]'
:request-first-line: ! '"GET /favicon.ico HTTP/1.1"'
:status: '404'
:response-size: '330'
:refer: ! '"-"'
:user-agent: ! '"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.17
  (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"'

$ sudo tail /var/log/httpd/access_log | ltsview -k host,user
:host: 192.168.0.1
:user: ! '-'
---
:host: 192.168.0.1
:user: ! '-'

$ sudo cat /var/log/httpd/access_log | ltsview -k host -r request-time:[0-9]\{6,\} 
# => request-timeが6桁以上の数値のものをフィルタリング
```
Cocos2d-xでシングルトンによる画面間データ連携


やっとできたので共有しておきます♪

参考記事
Cocos2d-xでシングルトンによる画面間データ連携
http://xcode555.sblo.jp/article/62645292.html
(この時点では.cppが貼り間違いでした…)

Singleton in cocos2d-x Android
http://stackoverflow.com/questions/9434436/singleton-in-cocos2d-x-android



```cpp:GameManager.h
//
//  GameManager.h
//  SingletonTEST
//
//  Created by prototechno on 2013/02/20.
//
//

#ifndef __SingletonTEST__GameManager__
#define __SingletonTEST__GameManager__

typedef enum{
    GameModeMenu ,
    GameModeNagasa ,
    GameModeKasa ,
}GameMode;

#include "cocos2d.h"

class GameManager
{
private:
    GameManager();
    static GameManager* m_mySingleton;
    
public:
    static GameManager* sharedGameManager();
    
    GameMode gameMode;
    
    int count;
    
    float gameTime;
    
};

#endif /* defined(__SingletonTEST__GameManager__) */
```


```cpp:GameManager.cpp
//
//  GameManager.cpp
//  SingletonTEST
//
//  Created by prototechno on 2013/02/20.
//
//
#include "SimpleAudioEngine.h"
#include "GameManager.h"

using namespace cocos2d;
using namespace CocosDenshion;

//All static variables need to be defined in the .cpp file
//I've added this following line to fix the problem
GameManager* GameManager::m_mySingleton = NULL;

GameManager::GameManager()
{
    
}

GameManager* GameManager::sharedGameManager()
{
    //If the singleton has no instance yet, create one
    if(NULL == m_mySingleton)
    {
        //Create an instance to the singleton
        m_mySingleton = new GameManager();
    }
    
    //Return the singleton object
    return m_mySingleton;
}
```

使い方はこんな感じ… gameTimeでタイマーを実装した時の記録。

```cpp:sample.cpp

#include "GameManager.h"

void Play5::countTimer(float time)
{
    GameManager::sharedGameManager()->gameTime += time;
    
    //時間を表示する
    CCString* timeString = CCString::createWithFormat("%8.0f秒", GameManager::sharedGameManager()->gameTime);
    CCLabelTTF* timerLabel = (CCLabelTTF*)this->getChildByTag(kTagTimerLabel);
    timerLabel->setString(timeString->getCString());
}
コマンドラインからtwitter投稿


```python:tweet.py
#!/usr/bin/env python
# -*- coding:UTF-8 -*-

from urllib import urlencode
from oauth2 import Client, Consumer, Token

consumer_key = ""
consumer_secret = ""
user_key = ""
user_secret = ""
client = Client(Consumer(consumer_key, consumer_secret),
        Token(user_key, user_secret))

message = raw_input()
client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST',
        urlencode({'status': message}))
```

twitterを壁に向かって独り事いうだけのツールと考えればTLを見る必要も投稿結果を確認する必要もないので、本当に投稿するだけの機能しかないです。


```python:tweet2.py
#!/usr/bin/env python
# -*- coding:UTF-8 -*-

from urllib import urlencode
from oauth2 import Client, Consumer, Token
import sys

consumer_key = ""
consumer_secret = ""
user_key = ""
user_secret = ""
client = Client(Consumer(consumer_key, consumer_secret),
        Token(user_key, user_secret))

client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST',
        urlencode({'status': sys.argv[1]}))
```

微調整版です。コマンドライン上で一行で完結し、かつ全角文字もdelキー、BSキーも大丈夫になりましたが今度は()など記号が混ざるとダメで顔文字が使えなかったりします。むーーーー
用法
`$ tweet2.py すぐにココに入力できます。BS出来ます。ですが半角記号弱いです`

また何か他のことをしている時に解決できそうか？思いついたら微調整をします。
CoffeeScriptのfor文の罠


イテレーション中に関数定義すると、JSと同様ハマりどころとなる

```
hoge = []
for i in [0..3]
    hoge.push -> return i

alert hoge[0]() #=> 4
```

##解決法その1
Array.forEachを使う
Array.forEachがない環境は[Polyfill](https://developer.mozilla.org/ja/docs/JavaScript/Reference/Global_Objects/Array/forEach)を使う

```
hoge = []
[0..3].forEach (v, i)->
    hoge.push -> return v

alert hoge[0]() #=> 0

```

##解決法その2
doを使う

```
hoge = []
for i in [0..3]
    do(i)->
        hoge.push -> return i

alert hoge[0]() #=> 0
```
osx 10.8(mountain lion)でgem installできない

##環境
- 10.6からのupgrade install
- xcodeは4.6にupgrade済
- xcodeのコマンドラインツールもinstall済
- `rvm`でrubyは管理（`$HOME/.rvm/`以下）
- homebrewは`$HOME`以下で管理

##出るエラー

```
ERROR: Failed to build gem native extension
```

同時に`rvm install`もできなくなった

##原因

-  `/usr/bin/gcc`のリンク先が、`llvm-gcc-4.2`になった
- `/usr/bin/gcc-4.2`が無くなった
- ビルド時に`gcc-4.2`を使うことを前提にしてるgemがある

##解決方法

- homebrewで`gcc-4.2`をインストール（`brew install apple-gcc42`）
- `gcc-4.2`はhomebrew公式にないので、リポジトリを追加（`brew tap /homebrew/dupes`)
- シンボリックリンク作成
```
sudo ln -s $HOME/homebrew/bin/gcc-4.2 /usr/bin/gcc-4.2
```

##もとに戻したときは。。

他で影響出た場合に作成したシンボリックを削除

```
sudo rm /usr/bin/gcc-4.2
```

## To Do

- `sudo`を使わないやり方に置き換える
- `cc=gcc-4.2 gem install xcodeproj`はエラー出てダメ
- `rvm install`は`rvm reinstall 1.9.3 --with-gcc=$HOE/homebrew/bin/gcc-4.2`で成功

##参考

[error: failed to build gem native extension when installing rails on mac mountian lion os](http://stackoverflow.com/questions/11802918/error-failed-to-build-gem-native-extension-when-installing-rails-on-mac-mountia)
Android Style

#####書く場所
res/values/style.xml

```xml:style.xmlの書き方
<?xml version="1.0" encoding="utf-8"?>
<resources>
　　<style name="スタイル名" [parent="@style/親スタイル名"]>
　　　　<item name="要素名">設定値</item>
　　</style>
</resources>
```
https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/styles.xml
http://developer.android.com/guide/topics/ui/themes.html

|要素名|内容|設定値の例|
|:-----------|:------------|:------------|
|android:textStyle|文字列のスタイル|italic|
|android:textColor|文字色|#ffffff|
|android:textSize|文字サイズ|24sp|

        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
  <item name="android:windowBackground">@color/custom_theme_color</item>
    <item name="android:colorBackground">@color/custom_theme_color</item>


http://techbooster.jpn.org/unclassified/7468/

```xml:style.xmlの書き方
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="my_theme" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/my_actionbar_style</item>
    </style>
    <style name="my_actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">#000000</item>
    </style>
</resources>
```
NSDate 指定日以降の1週間を曜日指定で取得


NSDateのカテゴリにしました。
NSDateが保持する日付を含むその日からの1週間を曜日指定で配列で取得出来ます。
NSDateとNSDateComponentsを行ったり来たり。
NSDateだけで取得とかもっと簡潔な方法ないのかな。

```objectivec:NSDate+Extras.h
typedef enum {
    YSWeekdayTypeSunday = 1 << 0,
    YSWeekdayTypeMonday = 1 << 1,
    YSWeekdayTypeTuesday = 1 << 2,
    YSWeekdayTypeWednesday = 1 << 3,
    YSWeekdayTypeThursday = 1 << 4,
    YSWeekdayTypeFriday = 1 << 5,
    YSWeekdayTypeSaturday = 1 << 6,
} YSWeekdayType;

@interface NSDate (Extras)

- (NSDateComponents*)dateAndTimeComponents;
- (NSArray*)oneWeekDateWithEnableWeekdayType:(YSWeekdayType)type;

@end
```

```objectivec:NSDate+Extras.m
@implementation NSDate (Extras)

- (NSDateComponents*)dateAndTimeComponents
{
    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    return [cal components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit ) fromDate:self];
}

- (NSArray *)oneWeekDateWithEnableWeekdayType:(YSWeekdayType)type
{
    if (type == 0) {
        return nil;
    }
    // selfを含むその日からの1週間を取得
    NSUInteger oneWeekNum = 7;
    NSMutableDictionary *oneWeekDict = [NSMutableDictionary dictionaryWithCapacity:oneWeekNum];
    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    for (int i = 0; i < oneWeekNum; i++) {
        NSDateComponents *comp = [self dateAndTimeComponents];
        [comp setDay:comp.day + i];
        NSDate *newDate = [cal dateFromComponents:comp];
        NSDateComponents * newComp = [newDate dateAndTimeComponents];
        [oneWeekDict setObject:newComp forKey:[NSString stringWithFormat:@"%d", newComp.weekday]];
    }
    
    // 取得した1週間から有効な曜日のみを抜き出す
    NSMutableArray *resultArr= [NSMutableArray array];
    YSWeekdayType compType = type;
    // NSDateComponentsのweekdayの値は1〜7(日〜土)
    for (int i = 1; i <= oneWeekNum; i++) {
        if (compType % 2 == 1) {
            NSDateComponents *comp = [oneWeekDict objectForKey:[NSString stringWithFormat:@"%d", i]];
            [resultArr addObject:[cal dateFromComponents:comp]];
        }
        compType >>= 1;
    }
    return resultArr;
}

@end
```

```objectivec:呼び出し例
// 月, 火, 水を指定
NSLog(@"%@", [self.datePicker.date oneWeekDateWithEnableWeekdayType:YSWeekdayTypeMonday | YSWeekdayTypeTuesday | YSWeekdayTypeWednesday]);

/* 今日は2/19(火)で2/19(火), 2/20(水), 2/25(月)を取得
NSLog
 "2013-02-25 14:46:00 +0000",
 "2013-02-19 14:46:00 +0000",
 "2013-02-20 14:46:00 +0000"
*/
```
起動中のアプリ一覧

現在起動中のアプリケーションの一覧を取得する。

```objectivec:Objective-C
// 自分自身のプロセス
ProcessSerialNumber ourPSN;
GetCurrentProcess(&ourPSN);

// 起動中のプロセスを一覧
ProcessSerialNumber nextPSN = {kNoProcess, kNoProcess}; // 初期化
while (GetNextProcess(&nextPSN) == noErr)
{
	Boolean processIsUs = false;
	SameProcess(&ourPSN, &nextPSN, &processIsUs);
	if (processIsUs)
	{
    	// 自分自身のプロセス
	}
	else
	{
		CFDictionaryRef info;
		info = ProcessInformationCopyDictionary(&nextPSN, kProcessDictionaryIncludeAllInformationMask);
		if (info)
		{
			NSLog(@"PSN:%@", CFDictionaryGetValue(info, CFSTR("PSN")));
			NSLog(@"Flavor:%@", CFDictionaryGetValue(info, CFSTR("Flavor")));
			NSLog(@"Attributes:%@", CFDictionaryGetValue(info, CFSTR("Attributes")));
			NSLog(@"ParentPSN:%@", CFDictionaryGetValue(info, CFSTR("ParentPSN")));
			NSLog(@"FileType:%@", CFDictionaryGetValue(info, CFSTR("FileType")));
			NSLog(@"FileCreator:%@", CFDictionaryGetValue(info, CFSTR("FileCreator")));
			NSLog(@"pid:%@", CFDictionaryGetValue(info, CFSTR("pid")));
			NSLog(@"LSBackgroundOnly:%@", CFDictionaryGetValue(info, CFSTR("LSBackgroundOnly")));
			NSLog(@"LSUIElement:%@", CFDictionaryGetValue(info, CFSTR("LSUIElement")));
			NSLog(@"IsHiddenAttr:%@", CFDictionaryGetValue(info, CFSTR("IsHiddenAttr")));
			NSLog(@"IsCheckedInAttr:%@", CFDictionaryGetValue(info, CFSTR("IsCheckedInAttr")));
			NSLog(@"RequiresCarbon:%@", CFDictionaryGetValue(info, CFSTR("RequiresCarbon")));
			NSLog(@"LSUserQuitOnly:%@", CFDictionaryGetValue(info, CFSTR("LSUserQuitOnly")));
			NSLog(@"LSUIPresentationMode:%@", CFDictionaryGetValue(info, CFSTR("LSUIPresentationMode")));
			NSLog(@"BundlePath:%@", CFDictionaryGetValue(info, CFSTR("BundlePath")));
			NSLog(@"kCFBundleExecutableKey:%@", CFDictionaryGetValue(info, kCFBundleExecutableKey));
			NSLog(@"kCFBundleNameKey:%@", CFDictionaryGetValue(info, kCFBundleNameKey));
			NSLog(@"kCFBundleIdentifierKey:%@", CFDictionaryGetValue(info, kCFBundleIdentifierKey));
			CFRelease(info);
		}

		// ローカライズされたプロセス名が取得できる
		CFStringRef name;
		if (CopyProcessName(&nextPSN, &name) == noErr)
		{
			NSLog(@"name:%@", name);
			CFRelease(name);
		}
	}
}
```
現在のブランチで加えた変更を見る

`master`から`fix/foo`ブランチを切ったとする
## 履歴表示: git log
```sh
git log master..fix/foo # two dots
```

## 差分表示: git diff
```sh
git diff master...fix/foo # three dots
```

`diff <commit>..<commit>`はblob同士の差分表示，`diff <commit>...<commit>`は`git diff $(git-merge-base A B) B`と同じ (ref: git help diff)
`git log`, `git diff`どちらも`HEAD`と比較するなら`fix/foo`は省略可能．

こういったリビジョンの範囲指定シンタックスは`git help revisions`で見られます．
CoronaSDKでグループに対するマスクをかける

 [CoronaSDKへの要望](http://nijibox.jp/smap/2013/02/coronasdk_request/)で、「グループオブジェクトにマスクをかけたい」という項目があって、あれ？できなかったけ？と思ったので検証しました。で、できました。
バージョンは2012.971です。

```main.lua
local group = display.newGroup()
 
local rect1 = display.newRect(0, 0, 50, 1000)
rect1:setFillColor(255, 0, 0)
local rect2 = display.newRect(0, 0, 1000, 50)
rect2:setFillColor(0, 255, 0)
 
group:insert(rect1)
group:insert(rect2)
 
local mask = graphics.newMask("mask.png") -- 256x256
group:setMask( mask )
```

maskを外してみると矩形が長くなるのでmaskが有効になっている事が確認できるはずです。
mask.pngは適当に作って頂くか、Coronaのサンプルにでもついてるマスク画像を使ってもらえば確認できると思います。

(mask.pngごとサンプルコードアップできる手頃な場所が無かった…gistで複数ファイルはできるけど、pngは添付できなかったので)

前にmaskかけた中のオブジェクトのアルファ変更しても効かなかった覚えがあって、それが故に使ってはいなかったんですが、今やってみたら効きますね。うーん、なんか条件があったんだろうか…
Avoid name mangling 


`extern "C"`というコードを最近良く見かけるので少し調べてみた。

簡単にいうとこれはCとC++のソースを混在させてコンパイルするときのいわゆるマングリングを解決するための表現だ。

## What is Mangling?
マングリングとは、C++のソースをコンパイルしたときにできるオブジェクトファイルの中のシンボルにいろいろ変なものがつくことをいう。
例えば以下のようなC++のソースがあったとする。

```
#include <iostream>
int add(int a, int b){	
    return a+b;
}
int main(void){	
    std::cout << add(1,2) << std::endl;
    return 0;
}
```

これをコンパイルした実行ファイルの中身を`nm`で見るとこんな感じになっている。

```
0000000100000d00 T __Z3addii
// 省略
0000000100000d50 T _main
// 省略
```

add関数とmain関数を定義したのでその２つのシンボルができる。このときmainはあまり変な感じになっていないのに、addはなんだかごちゃっとしたものが付いている。これはC++では関数のオーバロードや名前空間の概念があるため、同じ関数名でもシンボルを分ける必要があるからだ。
ところがCではこんなことしないので、Cのコンパイラは`_add`というシンボルを探してしまう。そこで`extern "C"`が役に立つ。
addの関数宣言の際にヘッダファイルとして

```
extern "C" int add(int, int);
```
とやるとなんとマングリングを行わずにシンボルを作成してくれる。
C,C++が混在しているような場合に効果を発揮する宣言なのです。
ActiveRecord::Base.include_root_in_json = falseを設定せずにto_jsonで出力されるjsonにノード名を入れないようにする


BackboneでActiveRecordのデータを使いたい場合は

> ActiveRecord::Base.include_root_in_json = false

と設定しておけと言われるけどプロジェクトに途中からBackboneを導入したい場合は影響でか過ぎるよ！
そんなに気軽にネストの深さ変えられないよ！

と、いう時はto_jsonをするときに`:root => false`を渡すとノード名が入らないjsonを取得できる。

こんな感じ

```
user.to_json(:root => false)
```

ノード名だけでなくもっと色々細かにカスタマイズしたい場合は各ActiveRecordのモデル内でas_jsonをオーバーライドしよう
Google Maps API v2 のマーカーの Anchor を探る


Google Maps API の Marker には、[Anchor](https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/MarkerOptions#anchor(float, float) というプロパティがあり、緯度経度と、画像のどの位置をマッピングさせるかを設定する事ができます。

Marker の既定の画像は、よく見るピンみたいなやつですが、既定の Anchor は、0.5f/1.0f になっています。設定値は、画像に対する「x軸の割合」と「y軸の割合」で、言わんとすることは、「緯度経度の位置を画像の、横方向はちょうど真ん中、縦方向は最下部に合わせる」という事です。

![Marker.anchor の設定値](https://dl.dropbox.com/u/264530/qiita/marker_anchor.png)

以下のように、設定値を変更すると、それぞれマーカーの表示位置が変わります。(Android SDK に同梱される Google Maps API v2 のサンプルをベースにしています)

```Java:anchor_center_bottom.java
mAdelaide = mMap.addMarker(new MarkerOptions()
	.position(ADELAIDE)
    .title("Adelaide")
    .snippet("Population: 1,213,000")
    .anchor(0.5f, 1.0f)); // 既定値と同じ
```
```Java:anchor_left_top.java
mAdelaide = mMap.addMarker(new MarkerOptions()
	.position(ADELAIDE)
    .title("Adelaide")
    .snippet("Population: 1,213,000")
    .anchor(0.0f, 0.0f)); // 左上
```
```Java:anchor_right_middle.java
mAdelaide = mMap.addMarker(new MarkerOptions()
	.position(ADELAIDE)
    .title("Adelaide")
    .snippet("Population: 1,213,000")
    .anchor(1.0f, 0.5f)); // 右中
```

![Marker.anchor examples](https://dl.dropbox.com/u/264530/qiita/marker_anchor_sample.png)

## v1 ではどうだったっけ？
Google Maps API v1 では、[ItemizedOverlay](https://developers.google.com/maps/documentation/android/v1/reference/) の ``boundCenter`` と ``boundCenterBottom`` に相当する機能ですね。こちらはメソッド名の通り、「中央/中心」と「中央/下部」しか対応してなかったので、より柔軟になったと言えます。

## ハマりどころ
* 最初、anchor はピクセル指定だ、と勝手に勘違いして、画像のサイズを取得してゴニョゴニョやってたのは内緒。
* 0.0〜1.0 の範囲であることを忘れて、0〜100 の値を設定すると、**「マーカーが全部消えます」**