OmniAICreator/Qiita-1.07M huggingface dataset:
git log の表示とか色をがんばる

* (追記 2014/10/09) 履歴見るのは tig や SourceTree のが快適だなーとやはり思うので [Search Result of tag:tig - Qiita](http://qiita.com/search?utf8=%E2%9C%93&amp;sort=rel&amp;q=tag%3Atig "Search Result of tag:tig - Qiita") なども参考にしてみてください
  + tig だと履歴みるだけでなく stage/unstage が楽
* (追記 2014/07/14) 最近は tig 使っちゃってるので、あまりこれのお世話にならなくなっている

やりたかったこと
--------------------------------------------------------------------------------

1. 表示色に reverse を使い視覚的なアクセントとして可読性をよくしたい
2. カラー表示するために毎回 `--color` を指定しないで済ませたい

結果
--------------------------------------------------------------------------------

もう少しターミナルアプリ側の色設定で低彩度寄りに調整したほうがいい気がする。

![がんばった結果](https://qiita-image-store.s3.amazonaws.com/0/3189/5f03dee9-1f85-9975-1c7f-1e1894ded114.png "がんばった結果")

1の解決 : オレオレ git log フォーマット を作った
--------------------------------------------------------------------------------

``` console
$ git log --pretty=format:'%C(red reverse)%d%Creset%C(white reverse) %h% Creset %C(green reverse) %an %Creset %C(cyan)%ar%Creset%n%C(white bold)%w(80)%s%Creset%n%n%w(80,2,2)%b'
// 参考: man git-log の "PRETTY FORMATS" のあたり
```

1. 上のようなカスタムフォーマットをつくった
2. この長いカスタムフォーマットを毎回指定するのは面倒なので、プリセットとして追加
3. フォーマット指定以外の便利そうなオプションも一緒に含めた alias を設定

``` console
// git log のフォーマットプリセット medium-reverse を新規作成
$ git config --global pretty.medium-reverse  "format:%C(red reverse)%d%Creset%C(white reverse) %h% Creset %C(green reverse) %an %Creset %C(cyan)%ar%Creset%n%C(white bold)%w(80)%s%Creset%n%n%w(80,2,2)%b"

// 作成したプリセット名を試して有効化できたことを確認
$ git log --pretty=medium-reverse

// 細かい表示オプションも合わせて指定する alias 設定を作成
$ alias gl="git log --pretty='medium-reverse' --graph --name-status"
```

* `--graph` : branch のグラフを表示
* `--name-status` : commit に含まれるファイル名、ステータスを表示


2 の解決 : カラー表示をデフォルトに設定する
--------------------------------------------------------------------------------

カラーにしてほしいに決まっている。

``` console
$ git config --global color.ui auto  
```

これで `git log` のみならず、`git diff` とか `git status` なんかの git コマンド全般でカラー表示が適用できるものは、勝手にカラーで表示してくれます。


あとがき
--------------------------------------------------------------------------------

黒い画面と zsh が好きな、デザイン/軽めのフロントエンド担当です。

git クライアントは便利なものがたくさんありますが、ターミナルに慣れておくと次のようなメリットがあります。

  * OSを問わず使える
    + いつも使ってるアプリ以外ではあの機能どうやったら利用できるの、ということがない
  * git の仕組みを深い部分から理解する手助けになる
    + git についての資料や情報をみたとき、何を話しているのか理解しやすい

単色の文字がずらずら並んでいることにあまり抵抗はないという CUI のプロの方もたくさんいそうですが、主にデザインを扱う人間としては、素の git の設定のままではやはり見づらいと思います。

そこで、GUI のクライアントも 5,6個試しましたが 、CUI でもここまで出来るのなら必要ないな、と思うきっかけとなったのが今回の設定です。


どうでもいい話
--------------------------------------------------------------------------------

この場合の `pretty format` ってどういうニュアンスなんでしょうね。
次のいずれの解釈も間違っている気がするけど、妥当なのがおもいつかない。

1. かわいい形式
2. かなり形式
3. ほぼ完全に形式
4. もう少しで形式

ディ・モールト 形式。
Macのlocalにgitのリモートリポジトリを構築する 



Macで自分自身にssh接続出来るようにしておく

`jobeet`     プロジェクトディレクトリ
 `jobeet.git` 空のディレクトリ

```
$ pwd
/Users/本名/Sites/php/symfony
$ ls
jobeet     jobeet.git
$ cd jobeet.git
$ git init --bare
# リモートリポジトリが作られる
```

```
$ cd ..
$ cd jobeet
$ git init
$ git add .
$ git ci
$ git remote add origin localhost:Sites/php/symfony/jobeet.git
$ git push origin master
$ git push
```



```
$ git show
$ cd ..
$ cd jobeet.git/
$ git show
```
tmux を使用しているとシミュレータでアプリが起動しない


tmux を使用していると `rake` コマンドでシミュレータを起動しようとすると、以下のようなログが表示されたきり、その後アプリが動き出すこともないしシミュレータが前面に表示されることもないようです。

```
$ rake
     Build ./build/iPhoneSimulator-6.0-Development
   Compile ./app/app_delegate.rb
   Compile ./app/hello_view.rb
   Compile ./app/hello_view_controller.rb
    Create ./build/iPhoneSimulator-6.0-Development/Hello.app
      Link ./build/iPhoneSimulator-6.0-Development/Hello.app/Hello
    Create ./build/iPhoneSimulator-6.0-Development/Hello.app/Info.plist
    Create ./build/iPhoneSimulator-6.0-Development/Hello.app/PkgInfo
      Copy ./resources/icon.png
    Create ./build/iPhoneSimulator-6.0-Development/Hello.dSYM
  Simulate ./build/iPhoneSimulator-6.0-Development/Hello.app
```

CPU 使用率が跳ね上がることもなく、`rake debug=1` や `rake mode=release` といろいろ起動方法を変えても相変わらずシミュレータはうんともすんとも言ってくれません。どうやら tmux の問題らしく、@satococoa さんに教えていただいた回避方法は、

```
$ brew install reattach-to-user-namespace
$ echo 'set-option -g default-command "reattach-to-user-namespace -l $SHELL"' >> ~/.tmux.conf
```

知らないとずっとハマってしまいそうな現象です。
ServletInputStreamモック化

JUnitなどでServletのテストを行う時にServletRequestをモック化します。
その際にServletInputStreamから読み出す文字列を、呼び出し側で指定できるようにフックしたものです。

```java:TestUtil.java
public static ServletInputStream createServletInputStream(String s, String charset) {
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	try {
		baos.write(s.getBytes(charset));
	} catch (Exception e) {
		throw new RuntimeException("No support charset.");
	}

	final InputStream bais = new ByteArrayInputStream(baos.toByteArray());

	return new ServletInputStream() {

		@Override
		public int read() throws IOException {
			return bais.read();
		}
	};
}
```

Mockitoを使ってモック化する場合、下記のように使用します。

```java:HogeTest.java
String xml = "....";
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
when(request.getInputStream()).thenReturn(TestUtil.createServletInputStream(xml, "UTF-8"));
target.doPost(request, response);
```
KVO (Key-Value Observing, キー値監視) の受信処理がメインスレッドで処理されるのを保証する

Viewもしくは、View Controllerでは、UIKitに対する処理を扱うため、メインスレッドでの処理が求められる場合が多いです。

KVOの受信処理が行なわれるスレッドは、通知処理が行なわれたスレッドに依存します。Viewもしくは、View Controller内では、KVOの受信処理がメインスレッドで処理されるのを保証するのが安全であると考えられます。

※参考：[UIKit とスレッドのお約束 (フェンリル | デベロッパーズブログ)](http://blog.fenrir-inc.com/jp/2010/09/uikit-and-thread.html)

メインスレッド以外からの通知を受けた場合、GCDを利用してメインスレッドで処理するように再度メッセージを呼ぶのが良いでしょう。

以下はGCDを利用した受信処理の記述例です。

````objec:KVO_ForViewOrViewController.m
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (![NSThread isMainThread]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        });
        
        return;
    }

    // KVOに関する処理
}
````
エラーの内容に応じて表示するHTMLを変更する

500.html以外を表示したい場合。

```ruby
#/lib/exceptions.rb
module Exceptions
  class PaymentGatewayError < StandardError; end
end

#/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  rescue_from Exceptions::PaymentGatewayError do |exception|
    render(:file => "#{Rails.root}/public/payment_error", :layout => false, :status => 500)
  end
end

#/public/payment_error.html
<html><body>決済エラー</body></html>
```

これで`raise Exceptions::PaymentGatewayError`とかってやるとpayment_error.htmlが表示される。
Railsでmemcacheを使ってobjectをキャッシュ


- Page Cache
- Action Cache
- Fragment Cache

とかじゃなくて普通にObjectをStoreしたいんだよって時に。

```ruby:Gemfile
gem 'dalli'
```

```:config/environments/production.rb
config.cache_store = :dalli_store
```

として以下のように使う。

```ruby:
Rails.cache.read("key")   # => nil
Rails.cache.write("key", [1,2,3], expires_in: 1.hour)  # １時間で消える。
Rails.cache.read("key")   # => [1, 2, 3]
```

キーはシンボル(i.e. `:key`)にしてもOK

実際使うときは

```ruby:
hoge = Rails.cache.read("hoge_key")
if hoge.nil?
  hoge = get_hoge_value(xxx)
  Rails.cache.write("hoge_key", hoge, expires_in: 1.hour)
end
```

ってな感じになるはず。
これは`fetch`を使って、以下のようにも書ける。

```ruby:
hoge = Rails.cache.fetch("hoge_key", expires_in: 1.hour) do
  get_hoge_value(xxx)
end
```

基本はこっちしか使わないはず。

writeやfetchのオプションに`compress: true`を渡すとデータを圧縮してくれる。encode/decodeの時間はかかるだろうけど、通信量が削減されるので結果速くなることも。
実際、デフォルトで16Kの`:compress_threshold`が設定されてるらしいので、元データが圧縮済みのデータじゃない限り、つけておけばいい気がする。

## 参照
http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html
http://guides.rubyonrails.org/caching_with_rails.html
本番機などで外部と余計な通信をしたくない時にbundlerを使う場合

privateなgithubリポジトリのgemを参照していたのだが、本番機に余計な秘密鍵を置きたくなかったので、
スマートにローカルから参照する方法を調べてみたところ、
bundlerの1.2.0からbundle package --allというものが使えるようになっていて、
gitのリポジトリやpathで参照しているgemもまとめてvendor/cacheにパッケージングしてくれるようになった。

つまり、こんな感じ。

```sh
# CIサーバー等
bundle package --all

## capistranoのcopy方式等で本番機側にアプリケーションをデプロイする。
## capistranoのレシピ上で、以下の形でbundlerを実行させるようにする。
bundle install --deployment
```

これで、vendor/cacheに入ってるgemを参照して、そこからインストールを行うため、
外部と全く通信する必要が無くなる。

bundlerの基本コマンドをちゃんと追っかけていれば、自明のことだったが、
普段あんまり考えずに使っていたので、調べなきゃ気付かなかった。
[Capistrano]単一サーバに対しシェルコマンドを並行して実行したい

## 状況

* 踏み台サーバがあり、各個別サーバにはそこ経由でしか入れない
* MySQLサーバが4つある
* MySQLサーバ4つに対し、たとえば `mysqldump` したい
* 逐次実行でもいいけどえらい時間がかかるな〜って思っている
* 踏み台サーバには、GNU parallel が入っていない……

## `parallel` というDSLがすでにある

これは、複数サーバに対し並行実行するので、単一サーバには向かない。
gemもいい感じのものが無さそうに見える。

## こんなの書いた

```ruby
def run_parallel(parallel_size)
  threads = []
  parallel_size.times do |i|
    threads << Thread.new do
      logger.info "starting concurrent task in #{parallel_size} threads"
      logger.info "started - thread #{i}"
      yield i
      logger.info "finished - thread #{i}"
    end
  end
  threads.each {|t| t.join }
end
```

## Usage

```ruby
run_parallel 4 do |i|
  run 'sleep 120'
end
```

* ちゃんと4並行で `sleep` が走る！
* 結果、１２０秒前後で全ジョブが終わるはず

## TODO

Good name
C#のコードをVSのプロジェクトを作らずに実行できるSublimeText2プラグイン

##  C#のコードを超カンタンに実行できるプラグイン

C#でコードを書く場合、

* VisualStudioを起動します
* プロジェクトを作ります
* コードを書きます
* ビルドをします
* Exeを起動します

という、VSありきの数ステップに渡る手順が必要です。

真面目にアプリケーションを作る場合にはこれで問題はないのですが、サンプルコードやクラスの動きを確認したい、なんて時には結構面倒くさかったりしますよね。

そこで、

###  CSharpreter

の登場です。

CSharpreterはSublimeText2のプラグインです。

実を言うと、SublimeText2でなんとかC#を書きやすいプラグインがないかなぁ、と探してところ発見したプラグインなのですが。。。



## 使い方

SublimeText2で新規にファイルを作成し、

> Console.WriteLine("Hello CSharpreter!");

とだけ書きます。
ファイルを保存する必要はありません。

この状態から、Command+Shift+"P" でコマンドパレットを呼び出し、
Charpreter::Interpretを実行すると、コンソールが起動し、


> Hello CSharpreter!
> 
> Press any key to exit...



と表示されます。

つまり、CSharpreterのほうで、下記のようなCSファイルを作ってコンパイルして起動までやってくれるってことみたいです。

```C#:sample.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{ 
  static void Main(string[] args)
  {
    
    Console.WriteLime("Hello SublimeText2!");

    Console.WriteLine();
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
  }
}
```






デフォルトの設定はJSONで記述されていて、このC#のコードに当てはめる形で実行されるみたいです。

 {
        "msbuild_path":"C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe",
    "default_usings":
    [
        "System", "System.Collections.Generic", "System.Linq"
    ],
    "main_end":
    [
        "Console.WriteLine();",
        "Console.WriteLine(\"Press any key to exit...\");",
        "Console.ReadKey();"
    ]
}


usingとか実行前後に処理を加えたい場合はこのJSONに手を入れればいいですね。

ちょっとしたときにあると便利、そんか感じのプラグインでした。
Guardがすべてのテストを走らせるの止める

Guardが起動時などに全部のテストを走らせるのを止める方法。
Guardfileで`:all_after_pass`と`all_on_start`をfalseにしてやればよい
もちろん普通にドキュメントに書いてある。
https://github.com/guard/guard-rspec#list-of-available-options

```ruby
guard 'rspec', :all_after_pass => false, :all_on_start => false do 
end
```
拡張子を指定してrm,mv


例えばswpファイルを削除したい場合
```
find . -name '*.swp' -ok rm {} \; -print
```

同じ要領でlogファイルをmvしたい場合

```
find . -name '*.log' -ok mv {} your_ directory/ \; -print
```

いちいち許可を求めてくるので確認取らずに実行してもらいたい場合は-okの部分を```-exec```にする
Macで以前入力したWiFiのパスワードを見る方法

ユーティリティの中にあるキーチェーンアクセスを起動、アクセスポイント名で検索して見つかった結果をダブルクリックすると保存されたパスワードの表示が出来る。
なお表示の際にはそのMacの管理者パスワードが必要になる。
XCode4.5でArchive時にStaticLinkLibraryのヘッダーが見つからない場合

StaticLinkLibraryのプロジェクト名がMyLibだとすると、
Build SettingのHeader Search Pathsに
${SHARED_PRECOMPS_DIR}/../../MyLib/IntermediateBuildFilesPath/UninstalledProducts/MyLib
を追加して大丈夫そう。
イラレでOpenTypeフォントの字詰め設定


プロポーショナルメトリクスの ON/OFF に関わる部分。
ついうっかりチェック忘れることが多いので整理。

##ツメ組み時
- カーニング：自動
- プロポーショナルメトリクス：ON

##ベタ組み時
- カーニング：和文等幅
- プロポーショナルメトリクス：OFF


###参考資料

- よくわかる！Adobe Creative Suite 3 Design Edition
http://www.adobe.com/jp/special/creativesuite/portal/guides/illustrator04_05.html
- Illustrator/InDesignの自動カーニングあれこれ - DTP Transit
http://www.dtp-transit.jp/adobe/illustrator/post_1411.html
Terminalのlsコマンド


```
ls -1FGR
```

- `-1`
リストを1行ずつ改行して表示
- `-F`
ファイル別に判定し、マークを付ける。（ディレクトリなら「/」）
- `-G`
フォルダを色分け
- `-R`
サブディレクトリも表示
Terminalでzip圧縮


圧縮したいデータのあるディレクトリに移動し、以下のコマンドでzip圧縮できます。

```
zip -r9 hoge.zip hoge
```
※圧縮するhogeはディレクトリ。

生成するzipファイルはもちろん、`/Volumes/Drive/hoge.zip`のように別ドライブを指定してもOK。




##オプションについて

- `-r`
ディレクトリの中身も含めて全て圧縮。
- `-1`
圧縮率を指定。1～9までで、数字が大きいほど高圧縮率ですが、時間がかかります。
IE8で明朝体がひどすぎる件


IEは相変わらずダメダメな訳ですが、CSSで表示フォントに明朝体を指定すると文字がおかしくなるってお前…　以下に回避のためのCSS指定。詳しくは引用元のサイト様が分かりやすくて素敵です。


```CSS
hoge {
	font-family: "ヒラギノ明朝 Pro W3", "Hiragino Mincho Pro", "ＭＳ Ｐ明朝", "MS PMincho", serif;
}
```

>引用元
[明朝体にしたつもりが、IE8ではひどいことに by Inquisitor](http://www.unfindable.net/~yabuki/blog/2010/04/ie8.html)


…IEはもう入ってくんな。
変数などをチェックするconsoleコマンド


コンソールにメッセージを表示します。変数を渡せば変数の中身が表示されます。
オブジェクトを渡せばオブジェクトの中身が表示されます。

```javascript
var hoge = 'ほげ';
console.log( hoge );

var fuga = jQuery( 'body' );
console.log( fuga );
```

firebug などのお供に。
要素の縦横センタリング


##寄せる要素のサイズが分かる時
50%の位置に固定させ、要素のサイズの半分だけネガティブマージンで飛ばすだけ。
※要素は``width:200px; height:100px;``と仮定

```css
.hoge {
	margin-top: -50px;
	margin-left: -100px;
	position: fixed;
	top: 50%;
	left: 50%;
}
```

##寄せる要素のサイズが不明の時（IE8以降）
ゴーストエレメント使って高さが100%の要素を作り、それに対して `vertical-align: middle;` で真ん中に飛ばすべし。

```css
.hoge {
	text-align: center;
	background: #eee;
	height: 500px;
}
.hoge:before {
	vertical-align: middle;
	content: '';
	display: inline-block;
	height: 100%;
	margin-right: -0.4em; /* スペースの調整 */
}
.center {
	vertical-align: middle;
	display: inline-block;
}​
```

```HTML
<div class="hoge">
	<div class="center">
		<h1>真ん中に寄りなさい。</h1>
		<p>ほら、早く真ん中にお寄りなさい。</p>
	</div>
</div>
```

##寄せる要素のサイズが不明の時（IE7にも対応）
不本意ながら、ゴーストエレメント（空のspan要素）やスターハックを使用。IE7め…

```css
.hoge {
	text-align: center;
	vertical-align: middle;
	display: block;
	height: 500px;
	background: #eee;
	letter-spacing: -0.4em;  /* inline-blockの隙間対策 */
}
.hoge * {
	vertical-align: middle;
	display: inline-block;
	height: 100%;
	*display: inline;  /* IE7用ハック */
	*zoom: 1;          /* IE7用ハック */
	letter-spacing: normal;  /* inline-blockの隙間対策 */
}
.center {
	vertical-align: middle;
	height: auto;
}
```

```HTML
<div class="hoge">
	<span></span>
	<p class="center">真ん中に寄りなさい。</p>
</div>
```
QiitaのiPhoneクライアントを作ってみた


## 概要
先日のQiita Hackathonで作成したiPhoneアプリを公開しました。
https://github.com/yuch/qiiman

プログラミングの師匠を求めて というタイトルで発表させていただきました。
特定の分野についての知見に長けた人を探す、というのがこのアプリを作成した目的です。

## 使用ライブラリ
* AFNetworking
* SDWebImage
* LKBadgeView
* ATMHud

## スクリーンショット

![Screenshot](https://raw.github.com/yuch/qiiman/master/ss/1_tags.png)

![Screenshot](https://raw.github.com/yuch/qiiman/master/ss/2_users.png)

![Screenshot](https://raw.github.com/yuch/qiiman/master/ss/3_profile.png)

![Screenshot](https://raw.github.com/yuch/qiiman/master/ss/4_items.png)

## 感想
ハッカソンというものに参加したのは初めてでしたが、会場はいい感じに音楽が流れていたり、レッドブルをいただいたり、とても集中して開発をすることができました。
もっともっと作り込みたかった部分もありましたが、1人日8時間くらいというのもガッツリ集中できる丁度いい時間かなぁと思いました。
今回作成したアプリを公開するかどうかはまだ考えていませんが、また機会があれば参加したいと思います。
jQueryを使ってDOM要素をクリックしたときに編集できるようにする

jQueryを使って「inplace editor」を作る。

```javascript
(function(documet){
    
    $(document).ready(function(){
           $(target_id).click(edit_togle());
    });


    function edit_togle(){
        var edit_flag = false;
        return function(){
            if(edit_flag) return;
            var $input = $("<input>").attr("type","text").val($(this).text());
            $(this).html($input); 
            
            $("input", this).focus().blur(function(){
                save($(this).val());
                $(this).after($(this).val()).unbind().remove();
                edit_flag = false;
            });
            edit_flag = true;
        }
    }    
    
    function save(value){
        alert("「"+value+"」を保存しました"); //保存する処理をここに書く
    }
})(document);

```

参考
 [jQueryを使ってテーブルのセルをクリックしたときに編集できるようにする（Edit in Place）](http://shimz.me/blog/?p=1505)
AWS ELBにMacから発行したSSLオレオレ証明書を登録する

opensslコマンドはどこかでインストールしてください。

# 証明書の発行

### パスフレーズ付きプライベートキーを発行する
```shell
openssl genrsa -des3 -out server.orig.key 2048
```

### プライベートキーからパスフレーズを除去
```shell
openssl rsa -in server.orig.key -out server.key
```

### csrファイルの発行
```shell
openssl req -new -key server.key -out server.csr
```

### crtファイルの発行
```shell
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
```

# AWSでの登録

Load Balancer Protocolで443(HTTPS)を追加するのを忘れずに

Upload a new SSL Certificateで以下の項目を入力

+ Certificate Name:* [任意]
+ Private Key:* [server.keyの内容をコピペ]
+ Public Key Certificate:* [server.crtの内容をコピペ]
+ Certificate Chain: [空欄]

忘れても大丈夫そうだけど一応・・・
Webクライアントのテストに使えるシンプルなサーバー

https://github.com/aya-eiya/SimpleTestModules

SimpleTestWebServer
-------------------

テスト用のHttpサーバを立ち上げます。

URIとレスポンスを文字列として与えると、指定したURIにアクセスした際に指定したレスポンスを返すHttpサーバーを立ち上げます。

Httpsサーバーは未実装です。

以下のようなテストが可能です。

```java
public class SampleTest {	

	@Test
	public void test() throws Exception {
		SimpleTestWebServer server = new SimpleTestWebServer();
		server.setHandler("http://localhost:8080/test","Hello Test Server!");
		String respose = getResponse("http://localhost:8080/test");
		assertEquals("Hello Test Server!",respose);
		server.stop();
	}

	private String getResponse(String path) throws Exception {
		URI uri = URI.create(path);
		HttpURLConnection con = (HttpURLConnection)uri.toURL().openConnection();
		BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
		String respose = reader.readLine();
		reader.close();
		return respose;
	}

}
```

複数のテストのためにサーバーを立ち上げる場合は、

https://github.com/aya-eiya/SimpleTestModules/blob/master/test/SampleHttpTest.java

のコードを参考にしてください。
NSDictionaryやNSArrayが初期化時にクラッシュする要因

症状：
　NSDictionaryにint型やNSInteger型の整数をぶち込もう（initWithObjectsAndKeys使用）
　↓
　その初期化変数でクラッシュ。
　NSArrayで似たような初期化処理を行うもクラッシュ。

原因：
　int型/NSInteger変数を[NSNumber numberWithInt:数字]に置き換えたら解決。
　NSIntegerもたしかlongのtypedefみたいなものだったので、Cな変数はダメっぽい。
GASの煩雑なURLをShortURLにして共通ナビゲーションメニューを作る

###事前準備

+ Google URL Shortener API用にAPIキーを取得する
+ ナビゲーションメニュー用 Google Appsスクリプトを新規作成
+ 新規スクリプトの「Google APIを使用」メニューでAPIキーを入力
+ URL Shortener APIをON

```navigationMenu.gs
function getShortURL(url) {
    var long = UrlShortener.newUrl();
    long.setLongUrl(url);
    var short = UrlShortener.Url.insert(long);
    return short.getId();
}

function getNavigationMenu(){
  var cache = CacheService.getPublicCache().get("cache-navi");
  if(cache==null){
    cache = HtmlService.createTemplateFromFile("navi").evaluate().getContent();
    CacheService.getPublicCache().put("cache-navi", cache, 60*60*24*365);
  }
  return cache;
}
```

汎用メニューのキャッシュ期間は一年間にした。
次にHTML。

```navi.html
<ul id="navigation-menu" class="ui-widget-header ui-corner-all ui-buttonset">
  <li><a href="<?=getShortURL('https://script.google.com/macros/s/hogehoge1/exec') ?>">HOME</a></li>
  <li><a href="<?=getShortURL('https://script.google.com/macros/s/hogehoge2/exec') ?>">INDEX</a></li>
  <li><a href="<?=getShortURL('https://script.google.com/macros/s/hogehoge3/exec') ?>">BLOG</a></li>
</ul>
```

　\<a\>タグのURLは貼りたいリンクのURLを入れる。

上記gsとhtmlが出来たらプロジェクトキーを ファイル>プロジェクトプロパティ メニューから取得。※1

###本体GAS準備

1. 挿入したいGoogleAppsScriptを開く
2. リソース>ライブラリ管理メニューでプロジェクトキー※１を入力。
3. 識別子を「NavigationMenu」にする。

あとは作ってあるHTMLの <HTML><body> タグ一行目に

```
<? output.append(NavigationMenu.getNavigationMenu()); ?>
```

を挿入します。
\<head\>タグにJQueryとJQueryUIスクリプトを埋め込んであるとなおよい。
あと、JQueryUI用CSSとか・・・

```
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"> </script>
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.min.js"></script>
```

```
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/smoothness/jquery-ui.css" type="text/css" />
```

で、最後にCSSで調整します。たとえばこんな感じ。

```css
    body,div,ul,li {
      margin: 0;
      padding: 0;
      border: 0;
    }
    #navigation-menu  {
      padding: 2px 2px 2px 2px;
    }
    li {
      display :inline;
      font-size:12px;
    }

```


たぶんこれでdoGetでevaluate()したHTML上部にナビゲーションメニューがついているはず。
文字列からクラスのインスタンスを生成する。


Hogeというクラスのインスタンスを生成する場合の例。

``` objective-c:Sample

Class aClass = NSClassFromString(@"Hoge");
id obj = [[aClass alloc] init];
if ([obj isMemberOfClass:[Hoge class]]) {
    NSLog(@"Hogeだよ");
}

```
スマホ・タブレットのみにCSSを適用する


```JavaScript
var UA = navigator.userAgent;
if ( UA.indexOf('iPhone') != -1 || UA.indexOf('iPad') != -1 || UA.indexOf('iPod') != -1 || UA.match(/Android/) || UA.indexOf('Windows Phone') != -1 ) {
	document.write('<link rel="stylesheet" type="text/css" href="css/smartphone.css">');
}
```


##[オマケ]viewportの設定

```HTML
<!-- 画面を拡大できないように設定 -->
<meta name="viewport" content="width=device-width; initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">

<!-- 画面を拡大できるように設定 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">

```
RailsのI18nで読み込まれているYAMLファイルをすべて調べるには


consoleから`I18n.load_path`とすればよい。外部のgem経由で読み込まれているファイルも含めて、arrayで返ってくる。

```
[1] pry(main)> I18n.load_path
=> ["/Users/foo/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/activesupport-3.2.8/lib/active_support/locale/en.yml",
 "/Users/foo/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/activemodel-3.2.8/lib/active_model/locale/en.yml",
 "/Users/foo/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/activerecord-3.2.8/lib/active_record/locale/en.yml",
 "/Users/foo/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_view/locale/en.yml",
...
```

上記ログにある、Railsの本体関連のgem経由で読み込まれてる奴のソースは以下。

- https://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml
- https://github.com/rails/rails/blob/master/activemodel/lib/active_model/locale/en.yml
- https://github.com/rails/rails/blob/master/activerecord/lib/active_record/locale/en.yml
- https://github.com/rails/rails/blob/master/actionpack/lib/action_view/locale/en.yml


Rails Guidesの[Rails Internationalization (I18n) API
](http://guides.rubyonrails.org/i18n.html)も参照。
Eclipse3.7 (Indigo)の既存プロジェクトをMavenで管理

調べるといろいろ出てきますが，3.7ではMaven用のプラグインがEclipse本体と統合されているらしく，簡単にMaven用のプロジェクトを作成することができます．

1. プロジェクトを右クリックして*Configure -> Convert to Maven Project*
groupIdにはプロジェクトのパッケージ名を，artifactIdにはjarファイルの名前を指定するのが普通らしい．
2. 生成されたpom.xmlを右クリックして*Maven -> Add Dependency* 利用する外部ライブラリを指定します
3. (自分の環境だけかもしれません)
srcディレクトリがビルド対象から外れてしまっているので，srcを右クリックして*Build Path -> Use as a Source Folder*
Javaコンパイラのバージョンが変わってしまうので，プロジェクト名を右クリックして*Property -> Java Compiler*
offsetを計算する

```php

<?php

/**
 * offsetを計算します。
 * 
 * @param int $page     何ページ目なのか
 * @param int $rowCount 1ページいくつ出すのか
 * @return int
 */
protected function getOffset($page, $row_count)
{
    $page     = ($page > 0)     ? $page     : 1;
    $row_count = ($row_count > 0) ? $row_count : 1;
    $limit  = (int) $row_count;
    $offset = (int) $row_count * ($page - 1);
    return $offset;
}
Google+ API with OAuth


OAuthを使ってGoogle+ APIを叩く。

## 認証用URL
```
https://accounts.google.com/o/oauth2/auth?
client_id=**********.apps.googleusercontent.com&
redirect_uri=http://exsample.com/oauth2callback&
response_type=token&
approval_prompt=auto&
scope=https://www.googleapis.com/auth/plus.me
```

## 手順
1. [Google Console](https://code.google.com/apis/console/)にログイン
2. アプリケーションを登録（Webアプリケーション）
3. Client IDを発行
4. Redirect URLを登録

Client IDの発行とRedirect URLの指定ができたら、上記URLのようにURLを生成し、それにアクセスする。
（client_idは言わずもがな。Redirect URLに指定するのは、上記4で指定したURLを指定）
認証が通るとRedirect URLで指定されたURLにaccess_tokenなどが付与された状態で自動で遷移する。そこからaccess tokenを拾って、あとはAPIを叩くだけ。
(e.g. https://www.googleapis.com/plus/v1/people/me/activities/public?access_token=*****************)


## 情報を取得
### Access tokenから情報を取得（IDなど）
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=****

### Access tokneを使ってGoogle+ APIを叩く
https://www.googleapis.com/plus/v1/people/me?access_token=****

## [参考]
[Google Accounts Authentication and Authorization](https://developers.google.com/accounts/docs/OAuth2UserAgent?hl=ja)

[Google+ Platform - Activities: list](https://developers.google.com/+/api/latest/activities/list)
new 演算子を使いつつ可変長引数っぽいことをするには？

[applyメソッドとnewを使ってインスタンスを生成するコードの例 - Qiita](http://qiita.com/items/20786162689948efc6a8) へのコメントです。長くなったので記事にしました。

```new-and-apply-pattern.js
var a = new (function () { return Array.apply(this, [1,2,3]); })();
```

これ、一見うまくいってるように見えますが、間違ってますね。

```bad-example.js
function Hoge (a) {
  this.x = a;
}
var a = new (function () { return Hoge.apply(this, ["hoge"]); })();
a instanceof Hoge; // => false
```

最初のパターンがうまくいっていた（```Array```のインスタンスが返ってきていた）ように見えたのは、組み込みの ```Array``` 関数が「配列オブジェクト」を返すためです。実は```new``` 演算子の結果は、コンストラクタ関数がオブジェクトを返す場合はそのオブジェクトになり、それ以外の場合にコンテキストオブジェクト（i.e. ```this```）になります。

つまり、最初の例は実は以下のコードとほぼ等価だったということになります:

```javascript
a = Array.apply(null, [1,2,3]);
```

では逆に、上で挙げた ```Hoge``` の例の場合はどうでしょうか。この関数 ```Hoge``` は ```return``` 文をもたないので、返り値は ```undefined``` でオブジェクトではありません（もちろん ```Hoge``` のインスタンスでもない）。そのため、```new``` 演算子を使うと、新しく生成された空のコンテキストオブジェクト ```this``` に ```Hoge``` を適用してプロパティが追加されたものができあがります。これは ```Hoge``` のインスタンスではなく、外側の無名関数のインスタンスになります。結局、次のコードと等価なことをしていることになります:

```javascript
a = new (function () { return; })();
Hoge.apply(a, ["hoge"]);
```

こういうキモい挙動が色々あってメンドクサイので、「邪悪な ```new``` 演算子は使うな！」という人もいます（つまり Crockford 先生のことですが）。

----

では任意のコンストラクタ関数に引数を配列で与えつつ ```new``` するにはどうすればいいか？その答えの一つが、[JavaScriptでリフレクション - Qiita](http://qiita.com/items/e1aaf2a438a2d5b9f39e) の方でコメントしたように、```Function.prototype.bind``` を活用することです。

```new-and-bind-pattern.js
var a = new (Hoge.bind.apply(Hoge, [null].concat(["hoge"])))();
a instanceof Hoge; // => true
```

まぁ ```bind``` を使わないといけないので、古いブラウザだと動かないかもしれません。MDN に載ってるように等価なメソッドを定義してやれば行けると思いますが。

\# 私はこれ以外には ```eval``` で無理を通す方法しか知りません。

----

# 参考文献
- [bind - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind)
each を遅延評価しながら複数スレッドで並行処理


# 目的

to_a できないが each できるリストについて、複数スレッドで処理したい。

具体的なユースケースは AWS::S3::ObjectCollection の処理で、これは each すると 1000 回ごとに AWS の API を呼び出す。to_a すると、いちどきに連続して API を呼び出し、巨大な配列をつくってしまうので避けたい。

# だめだった方法

- parallel gem : 内部で最初に to_a しているため、each は遅延処理されず、すべてのオブジェクトを入れる配列 (+結果を入れる配列) が必要になる。
- Enumerator / Fiber : スレッドをまたいで使えない

# 解決方法

標準ライブラリ thread で追加される SizedQueue をつかう。これは固定サイズのキューで、複数スレッドから扱うことができ、また値の追加時にキューがいっぱいなら待ってくれる。

これを利用し、サブスレッドはキューから次に処理するオブジェクトを取得して処理、メインスレッドは each で得たオブジェクトを (サブスレッドの処理を待ちつつ) キューに追加、というようにする。

# 実装例

```ruby
require "thread"

TERMINATOR = Object.new # キューの終わりを示すオブジェクト
COUNT = 10 # 処理するスレッド数

def each_in_multi_threads(enumerable)
  queue = SizedQueue.new(COUNT)
  threads = COUNT.times.map{
    Thread.new {
      while true
        v = queue.shift
        break if v.equal?(TERMINATOR) # TERMINATOR だったらこのスレッドの仕事は終わり
        yield v
      end
    }  
  }
  enumerable.each{|v| queue << v }
  COUNT.times{ queue << TERMINATOR } # キューの最後にすべてのスレッド分 TERMINATOR を追加
  threads.each(&:join)
  enumerable
end

enumerable = 1..(1.0 / 0) # 無限リスト
each_in_multi_threads(enumerable) do |v|
  p v
  sleep 1 # 時間のかかる処理
end
```

同じ仕組みで each_with_index や map も可能 (map はどうしても結果の配列を作ることになるけど)。

parallel のように fork 使って複数プロセスで処理できるといいんだけど、Marshal.dump して子プロセスに渡す必要があるから、ちょっと用途が限られてしまう。
値渡しと参照渡し

#include<iostream>
using namespace std;

void Val(char ch){
ch ='X';
};

void Refp(char *pch){
*pch = 'Y';
};

void Refr(char &rch){
rch = 'Z';
};

int main(){
char Char = 'A';
Val(Char);
cout << Char <<endl;
Refp(&Char);
cout << Char <<endl;
Refr(Char);
cout<< Char <<endl;

return 0;
}
MacOSX Lion に最初から入ってるab(apache bench)が腐ってる件

最初から入ってる奴を使うと

    $ which ab
    /usr/sbin/ab
    $ ab -n 1000 http://localhost:9999/
    This is ApacheBench, Version 2.3 <$Revision: 655654 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)
    apr_socket_recv: Connection reset by peer (54)
    Total of 2 requests completed

なんだこりゃ、となるので

    $ sudo port install apache2
    $ /opt/local/apache2/bin/ab -n 1000 http://localhost:9999/
    This is ApacheBench, Version 2.3 <$Revision: 655654 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests


    Server Software:        SimpleHTTP/0.6
    Server Hostname:        localhost
    Server Port:            9999

    Document Path:          /
    Document Length:        105 bytes

    Concurrency Level:      1
    Time taken for tests:   0.784 seconds
    Complete requests:      1000
    Failed requests:        0
    Write errors:           0
    Total transferred:      290000 bytes
    HTML transferred:       105000 bytes
    Requests per second:    1274.70 [#/sec] (mean)
    Time per request:       0.784 [ms] (mean)
    Time per request:       0.784 [ms] (mean, across all concurrent requests)
    Transfer rate:          361.00 [Kbytes/sec] received

    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.0      0       0
    Processing:     1    1   2.0      1      51
    Waiting:        0    1   1.6      0      35
    Total:          1    1   2.0      1      51

    Percentage of the requests served within a certain time (ms)
      50%      1
      66%      1
      75%      1
      80%      1
      90%      1
      95%      1
      98%      1
      99%      4
     100%     51 (longest request)

めでたしめでたし
データデフラグを行うCompactコマンド

ver2.0からの機能であるcompactコマンドについて調べたのでまとめ
(ver2.2で内部的な動きに少し変更あり）

http://docs.mongodb.org/manual/reference/command/compact/
基本はここの日本語訳

# Compactコマンド
*The compact command rewrites and defragments a single collection. Additionally, the command drops all indexes at the beginning of compaction and rebuilds the indexes at the end.*

- 1つのコレクションに対して rewrites and defragments を行う
- そのコレクションに貼られているindexを全部dropして貼り直す
- RDBで言うところのバキューム

# 実行方法
開始

```javascript
db.runCommand ( { compact: '<collection>'})
db.runCommand ( { compact: '<collection>', [option]})
```

終了

```javascript
db.killOp()
```
（もしくは処理が完了する前にサーバーをrestartする）

- ジャーナル機能を有効にしている場合、compactコマンドの処理を途中で止めてもジャーナルデータは整合性が保たれていて有効（indexは手動で振り直す必要がある）。
- ジャーナル機能を有効にしていない場合、途中終了した場合のデータの一貫性は保証できない。
- いずれにせよ 途中停止すると空き領域が使用不可能になる可能性がある 。その場合、空き領域をの復元のためにcompactコマンドを再実行して完了させなければいけない。

## Option
### force
- force = true にするとprimary nodeに対してcompactコマンドを実行できる,ただし　primary nodeに対して実行されるその他の命令は全てエラーになる

### paddingFactor, paddingBytes
- ver2.2からのオプション
- padding sizeを決める(paddingFactorは計算式の定数, paddingBytesはバイトサイズ指定)
- document size + padding size = record size, 
 - データが更新されるごとにサイズが増えることが予測されている場合は padding sizeの確保がパフォーマンスに影響する
- デフォルト値（paddingについて指定なし）だと、全ての paddingが除去される。
 - " This may impact performance if the documents grow regularly."
- 将来的に追加されるコレクションやデータに対しての影響はない

# Note

## repairDatabaseとの比較

- repairDatabaseコマンドと比較して、ディスク容量を使用しない・(repairDatabaseよりは)速い。
- しかし、高速とはいえず、他のDBをブロックするので(ver.2.2以前)定期メンテ以外での使用は避けるべき。
- compactコマンドは 実行中に追加のディスクスペースは必要ないが、repairDatabaseと異なりファイルシステムの空き領域を開放しない

## replica setとの関係
- セカンダリに対してcompactコマンドを実行するのが望ましい（プライマリに対して実行するときはforceオプションを使う）
- セカンダリに対してcompactコマンドを実行すると、クライアントからのアクセスを防ぐため、自動的に「リカバリー（回復中ディスク）」になる。実行が終了したら自動的にセカンダリに戻る。
- sample https://github.com/mongodb/mongo-snippets/blob/master/js/compact-example.js
- compactコマンドの実行結果は波及しない (プライマリでのコマンド実行結果がセカンダリにコピーされない）
- それぞれのDBに個別にcompactコマンドを実行する必要がある

## Disk Sizeについて
*compact may increase the total size and number of our data files, expecially when run for the first time. However, this will not increase the total colletion storage space since storage size is the amount of data allocated within the database files, and not the size/number of the files on the file system.*

- compactコマンド *初回実行時は合計サイズやデータファイル数が増加するかもしれない* がこれはDBファイルに割り当てられたストレージサイズであり、ファイルシステムのサイズではない。

## その他
- **コマンド実行前に全バックアップを取ること**
- 実行中のログは mongod log fileで確認できる。もしくは db.currentOp() を他のシェルから実行してのぞける
- compact処理の前後でcollstatsコマンドを実行するとコレクションのストレージサイズがどう変化するかを確認することができる
- compactコマンドは **他の処理を全てブロックする** （ver2.2からは自分のDBの処理のみブロックする）
- compactコマンドはmongodに対して発行されるコマンド。Sharding環境では、メンテナンス時にそれぞれのshardに対してcompactコマンドを実行すること。
- もともとpadding領域がないcappedコレクションに対してcompactコマンドを実行してもサイズ圧縮はできない。cappedコレクションのドキュメントはフラグメント化の影響を受けない。

# 実行結果

全てのコレクション・全てのRepSetに対してcompactコマンドを実行するスクリプトを作成して流してみました。

https://gist.github.com/3825128

実行結果は以下

- storageSize => 25% 増
- fileSize => 10% 増
- numExtents => 75% 減
- indexSize => 30% 減

あまり頻繁に更新されないコレクションが多かったことや、1回目のコマンド実行だったことが影響しているのかなぁ。
dateコマンドの色々様々


拡張が無いと無理らしいですが、便利なのでメモ。
日付をスクリプトのコマンドライン引数に渡したりとかしたいことありますよね。


dateコマンドで一日前のタイムスタンプを取得する
--

```shell
date "1 days ago" +"%s"
```

dateコマンドで二日前の日付をスラ区切り
--

```shell
date "2 days ago" +"%Y/m/d"
```

シェルスクリプト内での利用例
--

```shell
#!/bin/bash
target_date="$1"
if [ -z $target_date ]; then
  target_date=`date -d "1 days ago" +"%Y/%m/%d"`
fi
echo $target_date

/path/to/command1 $target_date
/path/to/command2 $target_date
/path/to/command3 $target_date
/path/to/command4 $target_date
/path/to/command5 $target_date
```
ファイルのタイムスタンプを取得する（SunOS 5.10）

これ。

```sh:shell
TIMESTAMP=`ls -E hoge.txt | sed -e 's/  */ /g' | cut -d " " -f 6-7 | cut -c 1-19`

echo $TIMESTAMP
```

## 以下、解説っぽいもの

### 1. SunOSだと --time-style や --full-time オプションが使用できない。

ls の -E オプションでタイムスタンプを ISO 8601形式に固定して出力できる。

```
-bash-3.00$ ls -E hoge.txt
-rw-r--r--    1 foo    users        0 2010-08-06 13:45:15.341837000 +9000 hoge.txt
```

### 2. このままだと、半角スペースの数がまちまちで必要な文字列だけをカットするのが面倒なので、区切り文字として整えてやる。

「sed -e 's/ */ /g'」で複数の半角スペースを1つに置換します。

* 置換対象の正規表現には「△△*」半角スペース２つ入ってます。

```
-bash-3.00$ ls -E hoge.txt | sed -e 's/  */ /g'
-rw-r--r-- 1 foo users 0 2010-08-06 13:45:15.341837000 +9000 hoge.txt
```

### 3. 区切り文字が半角スペース１個だということがはっきりしたので、cutコマンドで区切り文字に半角スペースを指定して、必要なフィールド（区切り文字で区切った何番目の文字列か）を指定してやる。

「cut -d " " -f 6-7」がそれ。日付と時刻が入っているのは６、７番目のフィールド。

```
-bash-3.00$ ls -E hoge.txt | sed -e 's/  */ /g' | cut -d " " -f 6-7
2010-08-06 13:45:15.341837000
```

### 4. ここまででもいいのだけど、ナノ秒は使用しなかったので切り落とした。

「cut -c 1-19」。1～19文字目を抜き出す。

```
-bash-3.00$ ls -E hoge.txt | sed -e 's/  */ /g' | cut -d " " -f 6-7 | cut -c 1-19
2010-08-06 13:45:15
```

というわけで、最終的に「yyyy-mm-dd hh:mi:ss」形式のタイムスタンプが取得できました。めでたしめでたし。

[※この記事の内容は2010年8月に自分で書いた文章を転記したものです。](http://wiki.tmd45.jp/wiki.cgi?page=%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%A5%E1%A5%E2)
RubyのURI::escapeとCGI::escapeの違い

URI::escapeではスラッシュなどはエスケープされない。CGI::escapeではスラッシュなども全てエスケープする。

```
irb(main):003:0> require 'uri'
=> true
irb(main):004:0> URI.escape("http://example.com/foo/あああ/")
=> "http://example.com/foo/%E3%81%82%E3%81%82%E3%81%82/"
irb(main):005:0> require 'cgi'
=> true
irb(main):006:0> CGI.escape("http://example.com/foo/あああ/")
=> "http%3A%2F%2Fexample.com%2Ffoo%2F%E3%81%82%E3%81%82%E3%81%82%2F"
irb(main):007:0>
```

組み立てたURIを最後に一括でエスケープするときはURI::escape、http://example.com?redirect=http%3A%2F%2F... のようなURIを組み立てる必要があるときはCGI::escapeでやる、といった感じでいいんだろうか。
RubyのFaradayというHTTP Clientが良さそう

JSONを返すAPIを作っていて、APIを実際に叩いてみるのに何かいいものはないかと思い、FaradayというHTTPクライアントライブラリが良さそうだったので使ってみた。使用するミドルウェアの設定やリクエスト、レスポンスを宣言的に記述することができて、すっきりと書ける感じ。また、FaradayMiddleware::ParseXmlやFaradayMiddleware::ParseJsonを使えば結果のXMLやJSONをHashに変換することができるので、結果を使った処理をする前に自前で変換書かなくてもいいのが良い。OAuthにも対応していたり、他にも色々と便利そう。

```ruby:apirunner.rb
require "rubygems"
require "faraday"
require "faraday_middleware"
require "pp"

conn = Faraday::Connection.new(:url => 'http://example.com') do |builder|
  builder.request :url_encoded
  builder.response :logger
  builder.response :xml,  :content_type => /\bxml$/
  builder.response :json, :content_type => /\bjson/
  builder.adapter Faraday.default_adapter
end

#GET  http://example.com/foo/bar?limit=100
response = conn.get do |req|
  req.url '/foo/bar'
  req.params['limit'] = 100 
end
puts response.body["hoge"][0]["hage"]
```
ビルド時にCommand /bin/sh failed with exit code 1で落ちる場合

```
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 96: ordinal not in range(128)
Command /bin/sh failed with exit code 1
```
このようなエラーが出た場合は日本語（マルチバイト）文字絡みな場合が多い
日本語ファイル名が含まれていないかチェックする
スキーマのdefault値を取得する

調べたらありました。

```ruby
Model.column_defaults
```
以下のようなHashオブジェクトが取得できます。
`{"カラム名" => default値, ...}`

[http://apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/column_defaults](http://apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/column_defaults)
case文では && を and にそのまま書き換えられない


Rubyの論理演算子である `&&` と `and` は同じ動作をします。
たとえば、以下のようなメソッドであればどちらも同じ挙動になります。

````ruby
def use_amp(a, b)
  a && b
end

def use_and(a, b)
  a and b
end

puts use_amp true, true  # => true
puts use_amp true, false # => false

puts use_and true, true  # => true
puts use_and true, false # => false
````

しかし、挙動は同じでも優先順位が異なる(`and`の方が低い)ため、常に互換性があるとは限りません。
たとえば、case文の場合は `&&` を `and` にそのまま置き換えると構文エラーが発生します。

````ruby
def case_amp(a, b)
  case
  when a && b
    1
  else
    0
  end
end

def case_and(a, b)
  # 構文エラーが起きる
  # syntax error, unexpected keyword_and, expecting keyword_then or ',' or ';' or '\n'
  #  when a and b
  #            ^
  # warning: else without rescue is useless
  # syntax error, unexpected keyword_end, expecting $end
  case
  when a and b
    1
  else
    0
  end
end
````

これを正しく動作させるためには、`when (a and b)` のように括弧で囲む必要があります。

````ruby
def case_amp(a, b)
  case
  when a && b
    1
  else
    0
  end
end

def case_and(a, b)
  case
  when (a and b)
    1
  else
    0
  end
end

puts case_amp true, true  # => 1
puts case_amp true, false # => 0

puts case_and true, true  # => 1
puts case_and true, false # => 0
````

この問題に遭遇した時、しばらくの間「なんで構文エラーになるんだ!?」と頭を抱えてしまったので、Ruby初心者の方はご注意ください。
衝撃の事実!? "# -*- encoding: utf-8 -*-"じゃなくてもいいんです！


Ruby 2.0以降ではデフォルトのエンコーディングがutf-8になったため、マジックコメントが不要になりました。（utf-8でスクリプトを書くのであれば）

本記事はRuby 1.9以前の場合、と考えてください。

参考：[Ruby 2.0.0-p0 リリース](https://www.ruby-lang.org/ja/news/2013/02/24/ruby-2-0-0-p0-is-released/)

<hr>

みなさんご存知だと思いますが、日本語を含むRubyスクリプトの場合、ファイルの先頭にファイルのエンコーディングを表すマジックコメントがないとエラーになります。

````encoding_spec.rb
require 'rspec'

describe 'Japanese' do
  subject {'日本語'}
  it {should == '日本語'}
end
````

````bash
# 実行結果(エラーになる)
$ rspec encoding_spec.rb 
/Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load': /Users/mypc/dev/sandbox/encoding_spec.rb:4: invalid multibyte char (US-ASCII) (SyntaxError)
/Users/mypc/dev/sandbox/encoding_spec.rb:4: invalid multibyte char (US-ASCII)
/Users/mypc/dev/sandbox/encoding_spec.rb:4: syntax error, unexpected $end, expecting '}'
  subject(:japanese) {'日本語'}
                         ^
	from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `block in load_spec_files'
	from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `map'
	from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load_spec_files'
	from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:22:in `run'
	from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:69:in `run'
	from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:8:in `block in autorun'

````

###マジックコメントは"# -\*- encoding: utf-8 -\*-"だけじゃない！
ネットの情報を見ていると、エンコーディングを指定するマジックコメントは、`# -*- encoding: utf-8 -*-`のように書かれていることが多いので、これを使っている人も多いと思います。


が！この書式が必須というわけではありません。


実は `# coding: utf-8` だけでもOKなんです。


````encoding_spec.rb
# coding: utf-8
require 'rspec'

describe 'Japanese' do
  subject {'日本語'}
  it {should == '日本語'}
end
````

````bash
# 実行結果(ちゃんと動く)
$ rspec encoding_spec.rb
.

Finished in 0.00042 seconds
1 example, 0 failures
````


ちなみに、`coding`の前には任意のプレフィックスを付けられるので、`# encoding: utf-8`と書いても正しく動きます。
また、大文字小文字を区別しないので、以下のようなマジックコメントでも動作します。

````encoding_spec.rb
# HOGEHOGECODING: UTF-8
require 'rspec'

describe 'Japanese' do
  subject {'日本語'}
  it {should == '日本語'}
end
````

###おまけ
ネットのサンプルコードとかでよく見かける `-*-` は、Emacsで使われる「エンコーディング指定プラグラマ」というものみたいです。
チームで開発するなら、Emacs固有のおまじないを埋め込むのはどうなんですかね〜？？・・・なんて発言すると、宗教戦争が起きそうなので聞かなかったことにしてください。

というわけで、Rubyのエンコーディング指定に関するちょっとしたトリビア(?)でした！

###参考文献
プログラミング言語Ruby
http://www.amazon.co.jp/dp/4873113946

Emacsのエンコーディング指定プラグマを挿入する
http://d.hatena.ne.jp/syohex/20091002/1254496402
Emacsと色設定と$TERM

Emacsの色設定には環境変数の$TERMが関係してくる。僕は普段solarizedを使っているが、環境変数の`$TERM`が違うと、色も全然変わってくる。しかも、`$TERM`によって、色が256色使えたり、5色しか使えなかったりする。
で、よく色んなサイトで紹介されるEmacsで256色使うためにTERMに設定する値として、xterm-256colorとかscreen-256colorというのがある。なんだけど、この2つに設定すると本来の色にならない。

本来のsolarized
![本来のsolarized](http://ethanschoonover.com/solarized/img/solarized-vim.png "本来のsolarized")
$TERM=xterm-256colorのsolarized
![$TERM=xterm-256colorのsolarized](http://cdn-ak.f.st-hatena.com/images/fotolife/t/takc923/20121021/20121021020322.png "$TERM=xterm-256colorのsolarized")

`$TERM`をxtermにしたら、256色は使えないが本来の色になるので、そうやって我慢していた。
で、さっき256色使って自分の好みな色を使う設定を見つけた。それは`TERM=xterm-256color`の環境下で、Emacsを`env TERM=xterm emacs`で起動するという方法。
正直なんでこうすれば色が変わるのか分からんけど、これで色々捗りそう。

ちなみにaliasは本当は

    alias emacsd='env TERM=xterm emacs --daemon'
    alias emacs='emacsclient -t'

としている。
Express で ejs のつもりなのに jade が入っちゃう時


```
$ express -t ejs myapp
```
で ejs を入れたつもりが、```views/index.jade``` とかが入っちゃう。

```
$ express -tejs myapp
            ^スペース空けない
```
と、正しく ejs が使われる。

なんなのよこれ。express が rc だから？

##0:51追記
あーっ、ヘルプ見たら ```express -e myapp``` が正しいのね。

```
$ express -h
```

>  Usage: express [options]
>
>  Options:
>
>    -h, --help          output usage information
>    -V, --version       output the version number
>    -s, --sessions      add session support
>    -e, --ejs           add ejs engine support (defaults to jade)
>    -J, --jshtml        add jshtml engine support (defaults to jade)
>    -H, --hogan         add hogan.js engine support
>    -c, --css <engine>  add stylesheet <engine> support (less|stylus) (defaults to plain css)
>    -f, --force         force on non-empty directory

##環境
* Mac OS X 10.8.2
* node v0.9.2
* express 3.0.0rc5
Windows版Sublime Text 2のvintageモード、Escでコマンドモードに戻った時にIMEを切る

Sublime Text 2をvintageモード(viっぽいモード)で使っている際、日本語コメントを入力し終えてからEscでコマンドモードに戻ってもIMEがONのままのため即座に移動その他が出来ず微妙にストレスがマッハなので改善を試みた。

##前準備
キー送信をエミュレートして実現するので、押すたびにIMEがON/OFFで切り替わるキーではなく、押すと常にIME OFFになるキーを一つ用意する。

Google日本語入力だったら、Properties > General > Customize > EditからCommandがDeactivate IMEになるキーを登録。自分は常に"無変換"キーを押すとIMEがOFFになるようMode毎に六個登録している。

##手順
%APPDATA%\Sublime Text 2\Packages\Vintage\vintage.pyに

```
class ExitInsertMode(sublime_plugin.TextCommand):
    def run_(self, args):
        edit = self.view.begin_edit(self.name(), args)
        try:
            self.run(edit)
        finally:
            self.view.end_edit(edit)

        # Call after end_edit(), to ensure the final entry in the glued undo
        # group is 'exit_insert_mode'.
        self.view.run_command('glue_marked_undo_groups')
```

という部分があるので、ここに二行追加して

```
class ExitInsertMode(sublime_plugin.TextCommand):
    def run_(self, args):
        edit = self.view.begin_edit(self.name(), args)
        try:
            self.run(edit)
        finally:
            self.view.end_edit(edit)

        # Call after end_edit(), to ensure the final entry in the glued undo
        # group is 'exit_insert_mode'.
        import ctypes
        ctypes.windll.user32.keybd_event(29, 0, 0, 0)
        self.view.run_command('glue_marked_undo_groups')
```

とする。'29'は'無変換'キーのコードなので、それ以外のキーを登録した場合は適宜変更。

変更してセーブするとすぐ有効になります。

本当はpluginを作ってrun_commandを乗っ取ったり？ するのが良いのかなぁ、と思ったけどやり方が分からなかったのと、取りあえず動くようなので。
JavaScriptでリフレクション

```javascript
var params = ["hoge", "fuga", "aaa"];
Class = function () {};
Class.reflection = function (classname, params) {
    var args = [];
    for(var i=0; i < params.length; i++) args.push("params[%d]"); 
    return eval("new " + classname + "(" + args.join(",").replace(/%d/g, (function () {
        var i=0; return function () { return i++; };
    })()) + ")");
}
var a = Class.reflection("Array", params);
document.write(a.join(","));
```
Web server setting for mac (snow leopard)


1. system preferences -> 共有 -> Web共有のチェックをON
2. http://localhost/~usernameで公開されるファイルは、~/Sites以下に置く。
3. Symbolic linkで別ディレクトリにあるDropbox管理下のディレクトリにリンクを貼る

```
ln -s src dest
```
-s忘れない。
4. apacheの設定ファイルを変更する。

```
/private/etc/apache2/users/username.conf
```
FollowSimLinksを追加する。

```
<Directory "/Users/mariko/Sites/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
```
~/Sites/以下でなく、全体の設定ファイルは

```
/private/etc/apache2/httpd.conf
```
にある。
5. Dropbox用ディレクトリのデフォルト状態だと、ディレクトリにapacheがアクセス出来ないので、

```
chmod 705 DropboxDir
```
する。
6. system preferences -> 共有 -> Web共有のチェックをOFF,ONして、apache再起動。
Sinatraでhaml中にmarkdownテンプレートを使う時の注意点

markdownに日本語が含まれる場合、そのままだと`Encoding::CompatibilityError`が出てしまう。
文字コードが違うからみたい。
なので解決方法としてとりあえず、

```haml
= markdown(:filename).force_encoding("utf-8")
```

とするとエラーは回避できる。ただこれを毎回書くのは冗長になるのでもっといい方法ないか要検討。
Sass でリストのリスト


Sass でオブジェクト指向っぽく書きたいときに便利です。`,` の方が半角スペースよりも優先されるのがポイント。

```scss
$fruits: orange #fe8a06 12px, apple #aa101b 16px, banana #fff516 20px;

@each $fruit in $fruits {
  $name: nth($fruit, 1);
  $color: nth($fruit, 2);
  $pad: nth($fruit, 3);
  .#{$name}-desc {
    color: $color;
    padding-left: $pad;
  }
}
```
Android版Google ChromeでRemote Debugする方法


* USBでPCと接続後、ターミナルで以下を実行。
* Android版Chromeでデバッグを有効に。
* 下記で指定したポートにアクセス（e.g. http://localhost:9222）

```shell
$ adb forward tcp:9222 localabstract:chrome_devtools_remote
```
Google ChromeのWeb Inspectorのカラースキームをカスタマイズする


* Mac OSX: ~/Library/Application Support/Google/Chrome/Profile 1/User StyleSheets/Custom.css
* Windows: C:/Users/AppDataLocal/Google/Chrome/User Data/Default/User StyleSheets/Custom.css
* Ubuntu: ~/.config/chromium/Default/User StyleSheets/Custom.css

Make DevTools your own, [customize the color scheme.](http://darcyclarke.me/design/skin-your-chrome-inspector/)
ローマ字（英語）の都道府県を選択するselectとoptionタグ

```html
<select name="prefecture">
	<option value="hokkaido">Hokkaido</option>
	<option value="aomori">Aomori</option>
	<option value="iwate">Iwate</option>
	<option value="miyagi">Miyagi</option>
	<option value="akita">Akita</option>
	<option value="yamagata">Yamagata</option>
	<option value="fukushima">Fukushima</option>
	<option value="ibaraki">Ibaraki</option>
	<option value="tochigi">Tochigi</option>
	<option value="gunma">Gunma</option>
	<option value="saitama">Saitama</option>
	<option value="chiba">Chiba</option>
	<option value="tokyo">Tokyo</option>
	<option value="kanagawa">Kanagawa</option>
	<option value="yamanashi">Yamanashi</option>
	<option value="nagano">Nagano</option>
	<option value="niigata">Niigata</option>
	<option value="toyama">Toyama</option>
	<option value="ishikawa">Ishikawa</option>
	<option value="fukui">Fukui</option>
	<option value="gifu">Gifu</option>
	<option value="shizuoka">Shizuoka</option>
	<option value="aichi">Aichi</option>
	<option value="mie">Mie</option>
	<option value="shiga">Shiga</option>
	<option value="kyoto">Kyoto</option>
	<option value="osaka">Osaka</option>
	<option value="hyogo">Hyogo</option>
	<option value="nara">Nara</option>
	<option value="wakayama">Wakayama</option>
	<option value="tottori">Tottori</option>
	<option value="shimane">Shimane</option>
	<option value="okayama">Okayama</option>
	<option value="hiroshima">Hiroshima</option>
	<option value="yamaguchi">Yamaguchi</option>
	<option value="tokushima">Tokushima</option>
	<option value="kagawa">Kagawa</option>
	<option value="ehime">Ehime</option>
	<option value="kochi">Kochi</option>
	<option value="fukuoka">Fukuoka</option>
	<option value="saga">Saga</option>
	<option value="nagasaki">Nagasaki</option>
	<option value="kumamoto">Kumamoto</option>
	<option value="oita">Oita</option>
	<option value="miyazaki">Miyazaki</option>
	<option value="kagoshima">Kagoshima</option>
	<option value="okinawa">Okinawa</option>
</select>
```
VimでGoのコードを書くときにやっておきたいこと

**この記事は古いです。現在は `misc/vim` は存在しません。 vim-go を使うことを推奨します**

## 準備: GOROOT と GOPATH の設定

vim にかぎらず、 Go を使う場合はGOROOT と GOPATH を設定しておきましょう。

GOROOT は Go をインストールした場所に、 GOPATH はあとで go get するときにインストールする場所を指定します。

```.bashrc
export GOROOT=$HOME/local/go
export GOPATH=$HOME/_go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

ただし、 Go を自分でビルドした場合は、 GOROOT の設定はいりません。 go をビルドした時のターゲットディレクトリが自動的に使われます。
GOROOT を設定しないことで、複数のバージョンの go をインストールしても、起動する go  を変えるだけでよくなります。 (GOROOT を設定していると、バージョン切り替えには GOROOT の切り替えが必要になります)

## 基本: go に同梱されいてる vim の設定を利用する

GO の misc/vim に vim 用の設定ファイルが存在します。これを利用しましょう。 `.vimrc` に次の設定を書いておきます。

```vim
if $GOROOT != ''
  set rtp+=$GOROOT/misc/vim
endif
```

## もっと便利に: gocode を使う

gocode をインストールすると補完ができます。

```
$ mkdir -p $GOPATH/bin
$ go get github.com/nsf/gocode
$ ~/_go/src/github.com/nsf/gocode/vim/update.sh
```

これで Omni 補完がコンテキストを理解して賢く補完してくれます。
Omni 補完は多分デフォルトでは `C-x C-o` などになっていますが、 neocomplcache などを利用している場合はそちらで Omni 補完を有効にしましょう。