OmniAICreator/Qiita-1.07M huggingface dataset:
自分がMacを買ってからやった設定

最近Macを買ったので、何入れたかとかのメモ。

# Macの簡単な設定

* _環境設定_ の _キーボード_ で _F1~12_ と _Fn+F1~12_ の機能を入れ替える設定を行う。
* Dockを自動的に隠す。
* _共有_ にあるコンピュータ名を変更。
* _Mission Control_ でダッシュボード無効化、自動並び替え無効化。
自動並び替え、しばらく使ってましたがあんまり意味なかったです。

# AppStoreからインストールするもの

## Xcode

今回、仕事でiOSアプリを開発して欲しいと頼まれてMacを使うことを始めたので、とりあえずXcodeを入れておきます。
技術者ならとりあえず入れておいて損はないはず。

### とりあえずやった設定。
* 黒ベースが最近好きなので Preference から Dark のカラーテーマを選択

書こうと思ったらそんなになかった。
### Command Line Tools for Xcode
後述するHomebrewのために必要なのでとりあえずインストール。というか、これこそ必須ですね。

単体でダウンロードする手段もありますが、PreferenceのDownloadから落とすのが正攻法のようです。（←今知った

Command Line ToolsはXcodeから入れるとHomebrewから使えないそうなのでApple Developerサイトから落とさないとダメなようです。

__このへんを入れるとGitとかが使えるようになります。便利。__

## その他

いきなりその他だよ！そんなにAppStoreで入れたアプリなかった！

* ClamXav
* Alfred
* Growl
* Evernote
* ATOK Pad

スティッキーズよりATOK Padのほうがいい気がします。

# AppStoreで入れられないもの（コマンドラインを除く）

## VMware Fusion

WindowsやLinuxとの共存に。
VirtualBoxやParallelsでもいいんですが、WindowsではVMware Player使ってるので。

## Google日本語入力

インストールしたら即 _言語とテキスト_ の _入力ソース_ からことえりを消しGoogle日本語入力のひらがなと半角英数だけ残す。

どうせ他の入力使わないし、必要なら変換で出せばいいという考えです。

## Chrome

ブラウザ、じつはMac買うまではFirefoxに統一してました。でもFirefox 13はMissionControlに非対応だったのです！
あと、Macだと新メニューの恩恵も受けれないようで、いろいろ不便すぎてChromeに乗り換えることにしました。

これに関して特に特筆する事項はないです。はい。

## [iTerm2](http://www.iterm2.com/#/section/home "iTerm2")

__これです！これがないと！__

ターミナルソフトウエアです。
Windowsでいうところのputtyやckwやコマンドプロンプトにあたります。
__背景画像を表示できるので作業が捗ります。__ ←これ重要。

これも黒ベースのPastelカラープリセットを使っています。

あとRegular Fontに _Inconsolata_ 、それ以外は _ヒラギノ角ゴ_ を指定しています。
これだけで見た目結構変わるんですよね。綺麗なフォントです。

ちなみにWindowsだとMeiryoKe_Console使ってたりします。

## [MacVim-kaoriya](http://code.google.com/p/macvim-kaoriya/ "MacVim")

必須です！
コンソールしか使わない人でも、普段使う大体のオプションが有効化されていて便利。

コンソールからでもエイリアスを貼れば使えるので、Vimmerは入れたほうが便利では？
GVimとしても便利ですし。

# コンソールアプリケーションの設定

## [オレオレdotfiles](https://github.com/deflis/dotfiles "deflis/dotfiles")をインストール

```sh
cd ~/
git clone git@github.com:deflis/dotfiles.git
cd dotfiles
./setup_mac.sh
```

・・・これでは説明不足ですよね。

大雑把にいえば __.zshrcと.vimrcをコピーした上でhomebrewとかをインストールしてくれて、vimprocのビルドまでしてくれる便利スクリプト__ です。

これじゃアレなのでMac向けに特別に作っている設定をいくつか説明しましょう。

## [Homebrew](http://mxcl.github.com/homebrew/ "homebrew")

Mac用のパッケージマネージャー。aptとかyumとかportsとかemanageみたいなもの。

```sh
/usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"
```
でインストール可能。

Gentoo PrefixやMacPortsも検討したんですが、なんとなく周りではこれ使ってる人が多かったのでこれに。

## zsh

漢なら黙ってシェルはzsh！！とまで言われているzshです。

`brew install zsh` で簡単インストール！Homebrew便利。

`sudo vi /etc/shells` して、
最終行に `/usr/local/bin/zsh` を入れてから
`chsh -s /usr/local/bin/zsh`
でインストール完了です。

## vim

```sh:.zshrc
if [ -d /Applications/MacVim.app/Contents/MacOS/ ]; then
    alias vi='env LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim -u $HOME/.vimrc "$@"'
    alias vim='env LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim "$@"'
    alias ctags='/Applications/MacVim.app/Contents/MacOS/ctags "$@"'
fi;
```

これでMacVimがあるときはMacVim使ってくれます。便利。

# 終わりに

Mac楽しいです。

__今までVMware+Ubuntu+Puttyでやってた環境がVMなしで動くって素敵！__

逆にいえばそれ以上でもそれ以下でもないわけなんですけど。
まぁメインマシンはVMあっても快適なんで、Macにすることはないんだろうと思います。
FQL: いろいろな条件式

FacebookのFQLで役に立つ条件式

*** 特定の文字列や値の一致***

```
select name from user where strpos(lower(name), 'imoto') >= 0 and uid in (select uid2 from friend where uid1 = me() )
```

***appを利用しているuserのみを抽出***

 ```
select name from user where is_app_user=1 and  uid in (select uid2 from friend where uid1 = me() )
```

***8月5日が誕生日の人***

```
select  uid , name , birthday from user where uid in (select uid2 from friend where uid1 = me() ) AND substr(birthday_date, 0, 5) = "08/05"
```

***offset , order , limit の利用***

```

select  uid ,  name  from user where uid in (select uid2 from friend where uid1 = me() ) order by uid desc limit 2 , 2

```

***自分のwallで見える、友だちからの投稿に対して、いいね！を付けた日付順***

```
SELECT created_time , post_id, actor_id, target_id, message  FROM stream WHERE  likes.user_likes=1  and  source_id in (select uid2 from friend where uid1 = me()  ) AND created_time >1341602545 order by created_time desc LIMIT 50

```

***自分が過去に”いいね！”を押したFacebook page***

```

SELECT name, description , website , fan_count FROM page WHERE page_id in ( SELECT id  FROM object_url WHERE url in (select url from url_like where user_id=me() ))
```
最初の一回だけ実行される関数を生成する関数

地味によく使う

```javascript
var toExecutableOnce = function(f){
    var called = false, result = undefined;
    return function(){
        if(!called){
            result = f.apply(this, arguments);
            called = true;
        }   
        return result;
    };  
};
var greeting = toExecutableOnce(function(){
    console.log("hello");
    return "world";
});
console.log(greeting());// hello world
console.log(greeting());// world
```
Qiita の Advent Calendar 投稿時には、自分で「△日目の記事です」と書かなくてよいと思う


一般に Advent Calendar の記事では、冒頭に「この記事は 〇〇 Advent Calender の△日目の記事です」と書くのが通例になっています。

しかし Qiita の Advent Calendar では、スタッフの方によってそれが追加されるようになっています。このため、投稿者が自分で書かなくてもよくなっています。

さらに、Advent Calendar の記事一覧ページも用意されており、各記事の最初の数行が表示されます。このため、最初に記事の概要が書いてあると、一覧ページがより便利になります。

そんなわけで、Qiita の Advent Calendar 投稿時には、「△日目の記事です」という記述を省略して、最初に記事の概要を書くのが良いのではないかと考えます。
「どう書く」をこう書いてみた

コードにするのに30分ぐらいでした。が、昨夜のうちに問題をちらっと見てしまっていたので考えてた時間は結構長いです。

お題はこちらです。
http://nabetani.sakura.ne.jp/hena/1/

…。
ちょっとミスってたのでコソっと修正。

```
#include <iostream>
#include <string>

enum Result { FAUL_X_WON, FAUL_O_WON, O_WON, X_WON, DRAW_GAME };

Result doukaku(const std::string& t)
{
    int board[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    for(int i = 0; i < 9; ++i)
    {
        if(board[t[i] - '0' - 1] != 0)
        {
            return static_cast<Result>(i % 2);
        }
        board[t[i] - '0' - 1] = i % 2 + 1;
        if( (board[0] & board[1] & board[2]) ||
            (board[3] & board[4] & board[5]) ||
            (board[6] & board[7] & board[8]) ||
            (board[0] & board[3] & board[6]) ||
            (board[1] & board[4] & board[7]) ||
            (board[2] & board[5] & board[8]) ||
            (board[0] & board[4] & board[8]) ||
            (board[2] & board[4] & board[6]))
        {
            return static_cast<Result>((i % 2) + 2);
        }
    }
    return DRAW_GAME;
}

int main(int, char* [])
{
    std::string s;
    while((std::cin >> s).good())
    {
        switch(doukaku(s))
        {
        case FAUL_X_WON: std::cout << "Faul: x won.\n"; break;
        case FAUL_O_WON: std::cout << "Faul: o won.\n"; break;
        case X_WON:      std::cout << "x won.\n";       break; 
        case O_WON:      std::cout << "o won.\n";       break;
        default:         std::cout << "Draw game.\n";   break;
        }
    }

    return 0;
}
```
Ruby で無限 Range

Ruby の Range は無限大を扱うことができます．

```ruby
(-Float::INFINITY..Float::INFINITY) #=> -Infinity..Infinity

(0..Float::INFINITY) === 817049871230948719384719274389123874198741 #=> true
(0..Float::INFINITY) === -1 #=> false

# 負の無限大も OK
(-Float::INFINITY..0) === -841794879213748747847321751947365 #=> true
```

どういう時に使うのかというと，case 文の when 節では `===` でマッチングを行うので，そこで使えます．

```ruby
a = 10000

case a
when 0 ... 100
  "0 〜 99"
when 100 ... 1000
  "100 〜 999"
when 1000 .. Float::INFINITY
  "1000以上"
else
  "負数"
end

#=> "1000以上"
```
第一回 オフラインリアルタイムどう書くの解答例。C++で。

第一回 オフラインリアルタイムどう書く( http://atnd.org/events/30285 )。
問題は http://nabetani.sakura.ne.jp/hena/1/
当日発表しなかった、C++ による解答例。

```c++
#include <iostream>
#include <string>
#include <vector>

using namespace std;

char side( size_t ix )
{
    return ix%2 ? 'x' : 'o';
}

bool same( vector<char> const & board, int offset, size_t a, size_t b, size_t c )
{
  return board[a+offset] 
    && board[a+offset]==board[b+offset] 
    && board[b+offset]==board[c+offset];
}

bool succeeded( vector<char> const & board )
{
  for( int ix=0 ; ix<3 ; ++ix ){
    if ( same( board, ix*3, 0, 1, 2 ) )  return true;
    if ( same( board, ix, 0, 3, 6 ) )  return true;
  }
  if ( same( board, 0, 0, 4, 8 ) )  return true;
  if ( same( board, 0, 2, 4, 6 ) )  return true;
  return false;
}

string
titato( string const & hands )
{
  vector<char> board(9);
  for( size_t i=0 ; i<hands.size() ; ++i ){
    char hand=hands[i]-'1';
    if ( board[hand] ){
      return string("Foul : ")+side(i+1)+string(" won.");
    }
    board[hand]=side(i);
    if ( succeeded( board ) ){
      return side(i)+string(" won.");
    }
    if ( i==8 ){
      return string("Draw game.");
    }
  }
  return string("In game.");
}

int main()
{
  while( ! cin.eof() ){
    string hands;
    cin >> hands;
    if ( hands.size() ){
      cout << hands << ":" << titato(hands) << endl;
    }
  }
}

```

vector じゃなくていいよねとか、sameの実装が見苦しいとか、
いろいろ不満はあるものの、まあこんなもんだよねとも思う。
pに一工夫加えて見やすくする


Rubyの便利な機能の一つにpがあります。よく分からないものはとりあえずpして内容を確認します。

```ruby:p1.rb
# 何でも表示出来る
p 1          #=> 1
p 1.5        #=> 1.5
p "str"      #=> "str"
p Time.now   #=> 2012-07-02 01:12:42 +0900
```

個人的に不便な所が一つあって、複数の値をカンマ区切りで渡すと改行区切りで出力されてしまいます。一行にまとめて表示したい時はどうすればよいのでしょうか。

```ruby:p2.rb
x = 1
y = "2"
z = 3.0

# まとめて表示！！
p x, y, z

# 改行されて表示されてしまう・・
# 1
# 2
# 3.0
```

# 配列リテラルで囲むと1行で表示出来る
そのような時は関連する値を配列リテラルで囲んでしまいましょう。

```p3.rb
p [x, y, z]

# 一行で表示出来る！
# [1, "2", 3.0]
```

また、ハッシュリテラルを使えば名前付きで表示することも出来ます。
文法的な理由によりハッシュ渡しの時は括弧を省略出来ないことに注意して下さい。

```p4.rb
p ({:x=>x, :y=>y, :z=>z})

# 名前付きで表示
# {:x=>1, :y=>2, :z=>3.0}

# Ruby1.9ならJavaScriptと同じ書き方でも書けます
p ({x: 1, y: 2, z: 3.0})
```

# 応用:必要な値を絞り込んで表示する
応用として、ライブラリ等で提供される大きなオブジェクト(ここでは大量のプロパティやメソッドが存在しているもののことを差す)から、今確認したい値だけを絞り込んで表示することを考えてみます。

```ruby:p5.rb
# 応用、クラスから必要なメンバだけを表示する
require 'stringio'
io = StringIO.new "A String"

# 望まない結果
p io                            # #<StringIO:0x0000010084e6c0>

# 表示したいプロパティを配列リテラルで囲む
p [io.string, io.size, io.pos]  # ["A String", 8, 0]

# 名前付き
p ({:string => io.string, :size => io.size, :pos => io.pos} ) #=> {:string=>"A String", :size=>8, :pos=>0}
```

``io.string``, ``io.size``, ``io.pos`` それぞれ個別にpするよりも見やすくなりました。

※ 前日は [y_uuki_](http://qiita.com/users/y_uuki_)さんの[Vimで快適なRailsライフを](http://qiita.com/items/57e726312ffe47592867)でした！ 明日は [sora_h](http://qiita.com/users/sora_h) さんです。
WinJS.Namespace に 関数を登録するときのトラップ - Metro App (javascript)

WinJS.Namespace.define() には関数も登録できるけれども、exception が発生してしまう。

### エラーメッセージ
> WinJS.Utilities.requireSupportedForProcessing: Value is not supported within a declarative processing context, if you want it to be supported mark it using WinJS.Utilities.markSupportedForProcessing.

親切にも WinJS.Utilities.markSupportedForProcessing を使うようヒントをくれているので、素直に従いましょう～

### サンプル
```example.js
WinJS.Utilities.markSupportedForProcessing(onItemClicked);
WinJS.Namespace.define('SampleData', {onItemClicked: onItemClicked});
```

### APIリファレンス
[WinJS.Utilities.markSupportedForProcessing function](http://msdn.microsoft.com/en-us/library/windows/apps/Hh967819.aspx)
Metroアプリ起動時の状態遷移 - Metro App (Javascript)

Metro アプリ の起動時の状態遷移は以下の順でイベントハンドラがコールされる。

### 起動時のイベント順
1. WinJS.Application._onloaded_
2. WinJS.Application._onactivated_
3. WinJS.Application._onready_

ちなみにDOMの読み込みが終わるのは、_onready_ のタイミングです。
なので、document.getElementBy("#itemA") など、DOM要素を操作したいときにはここ。



### 余談 : javascriptでのイベントリスナ登録について

js側でイベントリスナを登録するタイミングについて、以下に記載がありました。
http://msdn.microsoft.com/en-us/library/windows/apps/hh465402.aspx
ここを参照すると、 WinJS.Application.onactivated のイベントリスナで、WinJS.UI.processAll().done() 内で行うように推奨されてますね。

#### サンプル引用
> args.setPromise(WinJS.UI.processAll().done(function () {
>     var button1 = document.getElementById("button1");
>     button1.addEventListener("click", button1Click, false);
>     })
> );

もうちょっと詳しく見てみます。
GitHubチートシート

## オリジナルリポジトリの変更に合わせてForkしたリポジトリを最新状態にする

```
オリジナル: git://github.com/konoha-project/konoha.git
```

### オリジナルリポジトリをupstreamという名でリモートに追加
```
git remote add upstream git://github.com/konoha-project/konoha.git
```

### オリジナルとマージ
```
git fetch upstream
git merge upstream/master
```
tig blameが良い

git blame -> git showが簡単にできる．

`tig blame FILENAME`するとgit blame表示してくれる&気になる行にカーソルを合わせてEnterを押すとそのコミットのgit showを表示してくれる．

## tig blame lib/resque.rb
![](http://dl.dropbox.com/u/164559/screenshots/20120706_161627.png)

## 適当な行でEnter押したところ
![](http://dl.dropbox.com/u/164559/screenshots/20120706_161720.png)
jmapでヒープダンプ

良く忘れるので・・

```sh
${JAVA_HOME}/bin/jmap -dump:format=b,file=/tmp/heapdump-`date '+%Y%m%d_%H%M%S'`.hprof  [PID]
```
オプションなど詳しくはここ
http://java.sun.com/javase/ja/6/docs/ja/technotes/tools/share/jmap.html
Objective-Cでiosアプリ開発 おれおれスペニット

## Function Menu を整理する
```objective-c
#pragma mark - HogeFugo -
```

## 任意のコードからAppDelegateを参照する
```objective-c
  AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
```

## deallocではrelease後に確実にnilにしておくこと
```objective-c
- (void) dealloc
{
    [_var release], _var = nil;
}
```

## I18n参照
```objective-c
[self setTitle:NSLocalizedString(@"key_for_your_string", "explain for this string")];
```

## UIWebViewのUserAgentを指定
AppDelegateのinitializeでしか変えられない。

```objective-c
# AppDelegate.m
+ (void)initialize 
{
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"your_user_agent", @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    
}
```

## gist

* [UIUtilitiy](https://gist.github.com/3058199)
* [facebook-ios-sdk sample](https://gist.github.com/3058189)
* [DEBUG or not](https://gist.github.com/3147667)
Objective-Cでiosアプリ開発 おれおれメモ

## assets
* [iOSでの開発に必要なアセット](http://qiita.com/items/6ddfc6fa726911d5d7fd)

## oauth
* [スマートフォン ネイティブアプリからの OAuth 認証についての悩み](http://qiita.com/private/fa3615b928bcc0237992)

## UIWebView
* [UIWebViewなどで使うクッキーを再起動しても維持する方法](http://tech-gym.com/2011/10/objective-c/506.html)

## environment
* [CocoaPods ではじめる Objective-C ライブラリ管理 (1)](http://d.hatena.ne.jp/Watson/20111204/mac_dev_jp_advent_calendar_cocoapods01)

## library
* [AFNetworking](https://github.com/AFNetworking/AFNetworking/)
* [AsyncImageView](https://github.com/nicklockwood/AsyncImageView)
* [facebook-ios-sdk](https://github.com/facebook/facebook-ios-sdk/)
	* [facebook-ios-sdk sample](https://gist.github.com/3058189)

## test
* [Installing CHUnit](http://gabriel.github.com/gh-unit/docs/index.html)
* [GHUnitで単体テストをしてみよう](http://alpha.mixi.co.jp/2012/10858/)

## book
* [詳解 Objective-C 2.0 第3版](http://www.amazon.co.jp/gp/product/4797368276)
	* Objective-C自体を学ぶために必読
* [改訂2版 Objective-C逆引きハンドブック](http://www.amazon.co.jp/gp/product/4863541058)
* [iOSプログラミング逆引きリファレンス108 ~知りたいことがすぐわかるiPhoneプログラミングテクニック~](http://www.amazon.co.jp/gp/product/483993777X)
	* 上記のObjective-C逆引きハンドブックとは違いiOSで書くときの逆引き集。
	* まぁそれなりに参考になるかも知れない
* [よくわかるiPhoneアプリ開発の教科書【Xcode 4対応版】](http://www.amazon.co.jp/gp/product/4839939039)
	* 頻繁に改定されているのでもっと新しいモノあるかも知れない
	* iosアプリの作り方を超ざっくり知るには良い
* [
iOSデバッグ＆最適化技法 for iPad/iPhone ](http://www.amazon.co.jp/gp/product/4798028053)
	* デバック方法に言及してる唯一の書籍かも知れない
	* メモリリークのこととかちゃんと教えてくれる。
	* メモリリークを意識して開発するためにはマジ必読感ある
* [iOS開発におけるパターンによるオートマティズム](http://www.amazon.co.jp/gp/product/4861007348)
	* 実践的なパターン集
	* 特にCoreData周りが良い
* [iPhoneアプリ設計の極意 ―思わずタップしたくなるアプリのデザイン](http://www.amazon.co.jp/gp/product/4873115027)
* [iOSプログラミング 第2版](http://www.amazon.co.jp/gp/product/4864010498)
	* 圧倒的に良い。
	* 実践的で良い
	* Amazon古い記述があるという批判あるけど、そんなもん読み替えろ。もしくは原書の新しい方を読めという印象
	* iOSでの開発の実践書という意味でマジ必読感ある
* [エキスパートObjective-Cプログラミング ― iOS/OS Xのメモリ管理とマルチスレッド](http://tatsu-zine.com/books/objc)
	* 読んだ本がARCに対応していなくて、、、みたいなひとはこれ読んで、読み替えればok
	* BlocksはAFNetworkingでガンガン使うので覚えておくと良い
Amazon EC2 Microインスタンスの挙動について

いくつかの調査をした結果，

- 直近の100秒のCPU使用率が20%を超えている場合は低速モードに移行する，
- 低速モードはCPU使用率の97%が使えない状態(steal)になる，

というものが得られた．おそらく制御は秒単位だと思う．CPUの種類はm1.mediumと同じものが多い．ただ同じ種類のインスタンス同士でも違うCPUが割り当てられるので時期によって異なると思う．

値段はスポットインスタンスの安さが目立つ．2012年7月現在だと，アメリカ東部では

- オンデマンド: 0.020ドル/時 = 1.6円/時 ≒ 38.4円/日 ≒ 14,000円/年
- スポット: 0.003ドル/時 = 0.24円/時 ≒ 5.76円/日 ≒ 2,100円/年

といった具合．

# ジャッジシステム(AtCoder)で用いる上での問題点
- TLEが20秒以上の問題は原理的に計測不可能
- メモリ容量が小さいので上限が300MB程度になる
- コンテスト中の値段の大半はI/Oに対する値段になるのではないか(EBSボリュームしか使えないため)
Emacsでファイルを自動保存する auto-save-buffers-enhanced

auto-save-buffersの機能追加版です、私はこっちを使っています。

[auto-save-buffers-enhanced更新 - antipop](http://d.hatena.ne.jp/antipop/20080222/1203688543)

## インストール

```
(auto-install-from-url "https://raw.github.com/kentaro/auto-save-buffers-enhanced/master/auto-save-buffers-enhanced.el")
```

## 設定

[auto-shell-command](http://d.hatena.ne.jp/tuto0621/20120514/1336983541)と一緒に使いたかったのでアイドルタイムを0.5→1秒に伸ばしました。ここは大切なので再調整するかも。auto-shell-commandは実行を一時的にサスペンド出来るのでその機能と組み合わせながら使うことになりそうです。

```:init.el
(require 'auto-save-buffers-enhanced)
(setq auto-save-buffers-enhanced-interval 1) ; 指定のアイドル秒で保存
(auto-save-buffers-enhanced t)
```
rvm環境下でbinを実行する

シェルスクリプトの中でrvmで管理されているコマンドを叩きたい場合は `rvm wrapper` を使う。

例えば `1.9.3@qiita` というgemsetをuseしているときに使われる `bundle` を起動するには

```shell
rvm wrapper 1.9.3@qiita bootup bundle
```

と実行する。bootupは名前空間なので好きに選ぶ。
すると `~/.rvm/bin/bootup_bundle` もしくは `/usr/local/rvm/bin/bootup_bundle` が作成されるので、シェルスクリプトの中では

```shell
/usr/local/rvm/bin/bootup_bundle exec rake -T 
```

みたいな感じで書いておくと、このシェルスクリプトを起動したユーザによらずrvmの設定が使えるようになる。
MouseGetPosコマンドで、コントロール名を正しく取得するための注意

AutoHotKeyJpに載っている MouseGetPos コマンドのサンプルがうまく動作しなかったので、調べた結果を補完。

# 経緯

下記ページに書かれているサンプルコードでは、グループボックス内のコントロールのウィンドウハンドルがうまく取得できませんでした。

* [MouseGetPos - AutoHotkeyJp](https://sites.google.com/site/autohotkeyjp/reference/commands/MouseGetPos)

```ahk:wrong_example.ahk
MouseGetPos,x,y,hwnd,ctrl,3
SendMessage,0x84,0,%lp%,,ahk_id %ctrl%
If ErrorLevel=4294967295
  MouseGetPos,,,,ctrl,2
```

# 解決策

3行名に書かれている `%lp%` とはなんぞや？と思っていたのですが、上の行にコードが抜けていたようです。

```ahk
lp := (y << 16) | x
```

# 成功したコード

それを生かして、マウスカーソル上の各種情報を取得する関数を作成したのでそこまで載せておきます。

```ahk:GetInfoAtMousePosEx.ahk
; マウスカーソル位置の各種情報を取得(座標＝アクティブウィンドウからの相対位置)
GetInfoAtMousePosEx(ByRef X, ByRef Y, ByRef WinHWND, ByRef ControlHWND, ByRef ControlClassNN, ByRef WinTitle, ByRef ControlText, ByRef ClassName)
{
  WM_NCHITTEST=0x84
  ERROR=0xFFFFFFFF

  ; Get ControlHWND
  MouseGetPos,X,Y,WinHWND,ControlHWND,3
  lParam := (Y << 16) | X
  SendMessage,%WM_NCHITTEST%,0,%lParam%,, ahk_id %ControlHWND%
  If ErrorLevel=%ERROR%
    MouseGetPos,,,,ControlHWND,2

  ; Get ControlClassNN
  MouseGetPos,,,,ControlClassNN

  ; Get othe info.
  WinGetClass, ClassName, ahk_id %WinHWND%
  WinGetTitle, WinTitle, ahk_id %WinHWND%
  ControlGetText, ControlText, , ahk_id %ControlHWND%

  return True
}
```

AutoHotKeyJpは、日本語で AutoHotKey の情報が書かれているサイトで大変重宝しております。感謝。

# 参考
* [AutoHotkey スレッド part13 - まとめ](http://datlog.net/t/software/1317156599/m/)
* [WM_NCHITTEST wrapping: what's under a screen point? • AutoHotkey Community](http://www.autohotkey.com/community/viewtopic.php?t=22178)
Windows7でエクスプローラで、検索ボックスを選択する

前にも一度書きましたが、今度は画像つきで。
地味に使うのでメモ。

* `Ctrl`＋`E` : 検索ボックスを選択する

![](https://lh3.googleusercontent.com/-9QmfDTEW3bI/T_WwqHzVM-I/AAAAAAAAEPk/Dt-vFmqPhjg/s800/2012-07-06_00h18_17.png)
keyremap4macbookの独自設定xml


###コロンとセミコロンのswap
vim用。2年くらい前にデフォルトのswapが壊れていたので自分で書いた。
###command + JKでcommand←→
terminalのタブの切替用。
カーソルキーに指を伸ばすのは前世の罪が重たい証拠。

```xml
<?xml version="1.0"?><root>  <list>    <item>      <name>Swap JIS_Colon and Semicolon</name>      <identifier>private.swap_jis_colon_and_semicolon</identifier>      <autogen>--KeyToKey-- KeyCode::SEMICOLON, ModifierFlag::NONE, KeyCode::JIS_COLON</autogen>      <autogen>--KeyToKey-- KeyCode::JIS_COLON, ModifierFlag::NONE, KeyCode::SEMICOLON</autogen>  	</item>    <item>      <name>Swap command cursor and jk</name>      <identifier>private.swap_command_cursor_and_jk</identifier>      <autogen>--KeyToKey-- KeyCode::J, ModifierFlag::COMMAND_R, KeyCode::CURSOR_LEFT, ModifierFlag::COMMAND_R</autogen>      <autogen>--KeyToKey-- KeyCode::K, ModifierFlag::COMMAND_R, KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_R</autogen>  	</item>  </list></root>
UnicornにUSR2シグナル送っても無視される（Bundler::GemfileNotFound）


久しぶりにQiita書くよ！

ruby (1.9.3p194)
rails (3.2.2)
capistrano (2.12.0)
unicorn (4.3.1)

--

## なにがおこっていたか

Unicornを再起動（人によってはリロードと呼ぶ）をするときUSR2シグナルを送りますよね。

```bash
kill -s USR2 `cat unicorn.pid`
```

みたいな。

んで、これでだいたいはうまくいっていたんだけど、
アプリケーションコードの再読み込み時々うまくいかないことがありました。

下記みたいに無理やり再起動すりゃいんだけど。

```bash
kill -s QUIT `cat unicorn.pid`
unicorn_rails ...
```

気持ち悪いので調べてみたら、UnicornがログでBundler::GemfileNotFoundを吐いていた。

今まで気づかなくてゴメン！！！って感じです。
ヤバイんで止まらずに動いててくれたって感じっすね。

--

## どうしたか

ぐぐったら普通にでてきました。
素晴らしい記事。

FIXING THE GEMFILE NOT FOUND (BUNDLER::GEMFILENOTFOUND) ERROR
http://blog.willj.net/2011/08/02/fixing-the-gemfile-not-found-bundlergemfilenotfound-error/

この人も苦労したみたいだけど、
要するにcapistranoの前のデプロイ先のGemfileを参照しているから問題なんだよ！って話。

だから無理やりsymlinkを通した指定をしてあげましょう。

```ruby:deproy.rb
before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "/path/to/app/current/Gemfile"
end
```

設定変えた後はUSR2じゃなくて一度設定読み直さなきゃいけないので、一度落としましょ。
（HUPシグナルでもいけんのかな？試してないので分からん）

--

## 感想

capistrano-unicornってgemあったけど、うまくハマらなかったので結局入れなかったんだよねー
そういうcapistrano integration系のgemでスッキリいくと楽なんだが。

このdeploy.rbでゴリゴリ対応するあたりが楽しく感じつつも苦しかったり。
でもでも、解決法がだいたい提示されているRubyコミュニティってすごい。

こんな感じでした。
ナビゲーションバーの「戻る」ボタンのデザインを変更する（画像をあてる）


UIButtonのインスタンスを生成し、UIBarButtonItemのCustomViewとして指定、得られたUIBarButtonItemをself.navigationItem.leftBarButtonItemに入れてあげれば良い。
self.navigationItem.rightBarButtonItemにも同様の方法で設定出来る。


``` objc:SampleBackBtn

@implementation SampleBackBtn

- (void)setBackBtn {
    UIButton *customBackButtonView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 54, 31)];
    [customBackButtonView setBackgroundImage:[UIImage imageNamed:@"back_btn.png"] forState:UIControlStateNormal];
    [customBackButtonView addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customBackButtonView];
    self.navigationItem.leftBarButtonItem = backButtonItem;
}

- (void)back {
    [self.navigationController popViewControllerAnimated:YES];
}

@end

```
rvmのwrapperを使って特定のGemsetでfluentdを起動

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

ほぼ本家[Using RVM with God](https://rvm.io/integration/god/) からの引用。



```bash:cli
rvm wrapper 1.9.3-p194@fluentd bootup fluentd 
```

とすると`/usr/local/rvm/bin/bootup_fluentd` というラッパーコマンドが完成する。

中身はこう。

```bash:/usr/local/rvm/bin/bootup_fluentd
#!/usr/bin/env bash

if [[ -s "/usr/local/rvm/environments/ruby-1.9.3-p194@fluentd" ]]
then
  source "/usr/local/rvm/environments/ruby-1.9.3-p194@fluentd"
  exec fluentd "$@"
else
  echo "ERROR: Missing RVM environment file: '/usr/local/rvm/environments/ruby-1.9.3-p194@fluentd'" >&2
  exit 1
fi
```

rvmのbin以下にもshbang用のアレコレあるけど、UPstart等から起動するにはこうしておくのがいい。

```
$ ruby
-bash: ruby: command not found
$ /usr/local/rvm/bin/bootup_fluentd --version
fluentd 0.10.24
```

このようにRuby．．．なにそれ？という状態からも一発稼働。
ナビゲーションバーの戻るボタンのタイトルを変更する

ナビゲーションバーの戻るボタンのタイトルを変更するには、
【戻るボタンが表示される前の画面】で設定する。

例：ViewController1 から ViewController2 に遷移する場合

ViewController1 の viewDidLoad などで

UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] init] autorelease];
backButton.title = @"前の画面に戻ります";
if(iOS5以降なら)
{
    // 戻るボタンの色を変えたい場合は、tintColor に UIColor をセットする 
    backButton.tintColor = [UIColor redColor];
}
self.navigationItem.backBarButtonItem = backButton;
zabbix 2.0 を CentOS 6.2 へインストールする

zabbix 2.0 を CentOS 6.2 へインストールしたときのメモ。

## サーバ側

### 下準備
まずは依存パッケージをインストールしておく。
<del>データベースは SQLite を選択。</del>
動かなかった (動かすまでの力量が無かった) のと既に MySQL があったので、結局データベースは MySQL にすることにした。

> sudo yum install php php-xml php-mbstring php-gd php-bcmath php-pdo sqlite
> sudo yum install php-mysql

SSH, HTTP, SNMP 監視に必要なパッケージをインストール。

> sudo yum install libssh2 libssh2-devel libcurl libcurl-devel net-snmp net-snmp-devel

zabbix ユーザを追加。

> sudo groupadd zabbix
> udo useradd -g zabbix -d /var/www/html/zabbix -s /sbin/nologin -M zabbix

### DB のセットアップ
> <del>cd database/sqlite3/
> sqlite3 /var/tmp/zabbix.sqlite < schema.sql 
> sqlite3 /var/tmp/zabbix.sqlite < images.sql 
> sqlite3 /var/tmp/zabbix.sqlite < data.sql
> sudo chown zabbix:zabbix /var/tmp/zabbix.sqlite</del>

SQLite は断念し、MySQL の設定を以下のようにした

> mysql> create database zabbix character set utf8;
> mysql> use zabbix
> mysql> grant all on zabbix.* to 'zabbix'@'localhost' identified by 'zabbix';
> mysql> quit;
> cd database/mysql/
> mysql -uzabbix -pzabbix zabbix < schema.sql
> mysql -uzabbix -pzabbix zabbix < images.sql
> mysql -uzabbix -pzabbix zabbix < data.sql



### zabbix 本体のビルドとインストール

http://www.zabbix.com/download.php から zabbix-2.0.1.tar.gz をダウンロードする。

> tar zxvf zabbix-2.0.1.tar.gz
> cd zabbix-2.0.1
> <del>./configure --enable-server --with-net-snmp --with-libcurl --with-sqlite3 --with-ssh2</del>
> ./configure --enable-server --with-net-snmp --with-libcurl --with-mysql --with-ssh2
> make
> sudo make install

### Web Interface のインストール

> sudo mkdir /var/www/html/zabbix
> cd frontends/php
> sudo cp -a . /var/www/html/zabbix
> sudo chown -R apache:apache /var/www/html/zabbix
> sudo vim /etc/php.ini
> \# "date.timezone = Asia/Tokyo" を指定。
> sudo /etc/init.d/httpd restart \# php の有効化

### 設定
/usr/local/etc/zabbix_server.conf を編集。
DBName=zabbix, DBUser=zabbix, DBPassword=zabbix を指定。

<del>DBName に DB のセットアップで指定した sqlite DB のパスを指定する。</del> SQLite は断念。

### zabbix-server の起動
> sudo -u zabbix /usr/local/sbin/zabbix_server

停止はこんなかんじ。

> sudo -u zabbix kill \`cat /tmp/zabbix_server.pid\`

### WebUI から zabbix の設定
表示された通りに設定していけば OK

### ログイン
User: Admin
Password: zabbix
Jenkins+GitHubのプライベートリポジトリ


悪戦苦闘しつつようやく動くようになったので、とりあえずはまったポイントをメモしておきます。

## jenkinsユーザのSSH key生成

```
sudo -u jenkins -H ssh-keygen -t rsa -C jenkins@hoge.com
cat ~jenkins/.ssh/id_rsa.pub
```

## GitHubのSSH Key設定

複数のリポジトリを利用したい場合、GitHubリポジトリ設定のdeploy keysだと重複エラーが出てうまくいかない。なので、自分のGitHubユーザアカウント設定のSSH Keysにjenkinsのkeyを追加する。


## ジョブのリポジトリ設定
設定/ソースコード管理システム/Git RepoのURLに注意

こっちじゃなくて

```
https://github.com/hoge/hoge/
```

こっちね！

```
git@github.com:hoge/hoge.git
```

## GitHubとSSH通信できるようにしておく

```
sudo -u jenkins ssh -T git@github.com
```

## gitのユーザ設定をしておく

```
sudo -u jenkins git config --global user.email "jenkins@hoge.com"
sudo -u jenkins git config --global user.name "jenkins"
```
rails 3.2以降で、submit_to_remoteやlink_to_remote等を動かす方法

rails 2まではsubmit_to_remoteでAjaxを使用していた方もいるかと思います。ところが、このsubmit_to_remoteは、rails 3以降、削除されてしまいました。

これらを再実装するには、「prototype_legacy_helper」というgemをインストールしてやるという方法があります。

https://github.com/rails/prototype_legacy_helper


ところが、これでも動かない場合があります。この「prototype_legacy_helper」の中では、remote_functionというメソッドが使用されているのですが、このremote_functionも、rails 3.1.0より上では削除されているのです。

http://railsdoc.com/references/remote_function


そのため、submit_to_remoteを使用するためには、rails 3.1.0以降では、prototype_legacy_helperだけでは足りません。
このremote_functionを復活させる必要があり、それには「prototype-rails」というgemをインストールするという方法があります。

https://rubygems.org/gems/prototype-rails

とりあえず、この「prototype-rails」をインストールしてやると、私の環境では動きました。
大した方法でもありませんが、なぜかこの「prototype-rails」というgemを紹介している日本語情報が見当たらなかったので（もっと詳しく探せばあるかもしれませんが）、書いてみました。


なお、remote_functionを動かすのだけが目的という場合は、gemをインストールしなくても、直接githubから「prototype-rails」をダウンロードして、解凍後、

/lib/action_view/helpers/prototype_helper.rb

以上のファイルの「module PrototypeHelper」の部分だけを抜き出して、railsアプリの「/app/helpers」とかに放り込んでやるだけでも動きます。
バージョンが上がるに従って、この方法でも動かなくなる可能性はありますが、参考になればと思います。

標準でメソッドが削除されたのなら、素直にそのメソッドを使わない方向に向かうべきなのかもしれませんが、早急にrails 2系のアプリをrails 3系に対応したいのならば、暫定的に利用するというのも有りかと思います。
namespace配下でform_forを使う方法


ルータでnamespaceを区切ったコントローラでform_forを使う場合、form_forが期待するリクエスト先URLにnamespace名を挟むには以下のように書けば良い。

(ex exampleモデルを扱うdashboard/examplesコントローラの場合

```ruby:config/routes.rb
namespace 'dashbord' do
  resources :examples
end
```

```ruby:controller/dashboard/examples_controller.rb
class Dashboard::ExampleController < ApplicationController

  def new
    @example = Example.new
  end

  …

end
```

```ruby:view/dashboard/examples/_form.html.erb
<%= form_for [:dashboard, @example] do |f| %>
```
PHPで使うGoFパターン ひとり Advent Calendar - ビルダー


## ビルダーってなに?

要するにインスタンスを生成するための手順を隠蔽するパターンのひとつですね。
ビルダーそのものの抽象度が高いところに面白さがあります。

## ビルダーの構造

* ディクレター - ビルダーを使う機能を持つ
* ビルダー - インスタンスを生成して目的に応じたプロパティを設定する機能を持つ
* 生成物 - 生成されるもの


### ディレクター, ビルダーインターフェース, ビルディングまで
```php
<?php

/* Builder */
interface IDataStoreBuilder {
  public function setDriver ();
  public function getResult ();
}

/* Direcotr */
class DataStoreDirector {
  private $_Builder = null;
  public function __construct ( $builder ) {
    if ( !( $builder instanceof IDataStoreBuilder ) ) 
      throw new Exception ( 
        'ビルダーじゃなきゃ嫌だもん' 
      );
    $this->_Builder = $builder;
  }

  public function build () {
    $this->_Builder->setDriver ();
    return $this->_Builder->getReslt();
  }
}

/* Building */
class DataStore {
  private $_Driver = null;

  public function __construct () {
  }

  public function setDriver ( $driver ) {
    $this->_Driver = $driver;
  }

  public function addRow ( $row ) {
    $this->_Driver->addRow ( $row );
  }

  public function deleteRow ( $row_num ) {
    $this->_Driver->deleteRow ( $row_num );
  }

  public function updateRow ( $row_num, $row ) {
    $this->_Driver->updateRow ( $row_num, $row );
  }

  public function find ( $filter ) {
    $this->_Driver->find ( $filter );
  }
}
```

### 実ビルダー
```php
<?php

/* builders */
class FileStoreBuilder implements IDataStoreBuilder {
  private $_DataStore = null;
  public function __construct () {
    $this->_DataStore = new DataStore ();
  }

  public function setDriver () {
    $this->_DataStore->setDriver ( new FileDriver ( '/path/to/store' ) );  
  }
  public function getResult () {
    return $this->_DataStore;
  }
}

class DBStoreBuilder implements IDataStoreBuilder {
  private $_DataStore = null;
  public function __construct () {
    $this->_DataStore = new DataStore ();
  }

  public function setDriver () {
    $this->_DataStore->setDriver ( new DBDriver ( new DBConnection ( 
      'mysql://user:pass@server/db' 
    )));  
  }

  public function getResult () {
    return $this->_DataStore;
  }
}

// DBとかFileとかの実クラスは省略 m(_ _)m
```

### コンローラ (クラスじゃないけど)
``` <?php
$fd = new DataStoreDirector ( new FileStoreBuilder() );
$dd = new DataStoreDirector ( new DBStoreBuilder() );

$file = $fd->build();
$db   = $dd->build();
```
TabSpec#setContentに渡すIntentに他のアプリを起動する物を書いてはいけない

ブラウザとかもダメとのこと。

×

```Java
Uri uri = Uri.parse(Consts.WEBTOP_URL);
Intent intent = new Intent(Intent.ACTION_VIEW, uri).addCategory(Intent.CATEGORY_BROWSABLE);
TabSpec spec = tabHost.newTabSpec(Consts.TAG_WEBTOP)
 		.setIndicator(tabWidgetIndicator).setContent(intent);
```

ダミーのActivityを用意してそのonResumeなどで起動しないとダメみたい。
Railsのバッチ処理: whenever

Railsでバッチ処理をするのに`whenever`というgemを使用したのでまとめておきます。

## 導入

Gemfileに下記を追加します。

```ruby:Gemfile
gem 'whenever', :require => false
```

`bundle install`します。

```
$ bundle install
```

## 設定ファイル

下記を実行します。

```
$ wheneverize .
```

そうすると、`config/schedule.rb`というファイルが生成されます。定期的に実行したいコマンドをこのファイルに記述していきます。

下記にサンプルを示します。

```ruby:config/schedule.rb
set :output, 'log/cron.log'

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
  runner "SomeModel.ladeeda"
end

every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
  runner "Task.do_something_great"
end

every '0 0 27-31 * *' do
  command "echo 'you can use raw cron syntax too'"
end
```

runnerやrakeで実行するコマンドや、commandでシェルスクリプトやアプリケーションを実行することもできます。

また、outputを指定することで出力するファイルを指定することができます。

## 設定した内容の確認

whenenverコマンドを実行することで、実際にcronに登録する内容を確認することができます。

```sh
$ whenever
0 * * * * /bin/bash -l -c 'cd /home/hirotaka/workplace/rails-project && script/rails runner -e production '\''SomeModel.ladeeda'\'' >> log/cron.log 2>&1'

0 0,3,6,9,12,15,18,21 * * * /bin/bash -l -c 'cd /home/hirotaka/workplace/rails-project && script/rails runner -e production '\''MyModel.some_process'\'' >> log/cron.log 2>&1'

0 0,3,6,9,12,15,18,21 * * * /bin/bash -l -c 'cd /home/hirotaka/worksplace/rails-project && RAILS_ENV=production bundle exec rake my:rake:task --silent >> log/cron.log 2>&1'

0 0,3,6,9,12,15,18,21 * * * /bin/bash -l -c '/usr/bin/my_great_command >> log/cron.log 2>&1'

30 4 * * * /bin/bash -l -c 'cd /home/hirotaka/workplace/rails-project && script/rails runner -e production '\''MyModel.task_to_run_at_four_thirty_in_the_morning'\'' >> log/cron.log 2>&1'

0 12 * * 0 /bin/bash -l -c 'cd /home/hirotaka/worksplace/rails-project && script/rails runner -e production '\''Task.do_something_great'\'' >> log/cron.log 2>&1'

0 0 27-31 * * /bin/bash -l -c 'echo '\''you can use raw cron syntax too'\'' >> log/cron.log 2>&1'

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.
```

## Capistranoでのデプロイ

本番環境に反映するには、Capistranoのレシピを使用します。

deploy.rbを編集して、以下をロールを定義している下あたりに追加します。

```ruby:config/deploy.rb
set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"
```

これで`cap deploy`すれば`config/schedule.rb`の内容がcrontabに反映されるようになります。


## まとめ

whenenverを使えば、バッチ類がschedule.rbにまとまっていて、どういったバッチがどういう周期でまわっているのか一目瞭然なのでいいですね。

いままで、手動でcrontabに書いたので、このあたりがcapistranoで反映ができるのも便利です。
sigilの是非


最近の言語はsigil (シジル; 変数の先頭につく記号) が無いほうが主流だが、果たしてどちらがよいのか。

## sigilのメリット

* 変数と関数の区別がつきやすい
  * 一般に、変数の参照は副作用がないため、区別できるのは望ましい
  * しかし、関数がファーストクラスオブジェクトの言語では $foo->() とすることができてしまい、これはすでに関数呼び出しである

* キーワードや関数と名前が衝突しないことが保証されている
  * 変数名を考えるコストが少ない
  * Perl5の場合は $a, $b でハマることがよくある
  * ただしキーワードハイライトで代用可能

* makeやshellなどのUNIX tool chainではよく使われるし、散文でも変数を示すことができる(e.g. ${NextLanguage})

## sigilのデメリット

* 文字列リテラルのなかの式展開がクドい
  * Perl5だと単純な変数埋め込みは簡単 "foo $bar baz"
  * 複雑な式展開は記号だらけ
    * "foo ${¥do{ 1 + $foo }} bar"
    * "foo @{[ 1 + $foo ]} bar"
  * Ruby: bar = 42; "foo #{bar+1} baz"
  * Dart: bar = 42; "foo ${bar+1} baz"

* $ はシフトキーを要求するので入力コストは増える

## 結論

近代的なパラダイム・開発環境のもとではメリットはあまりない。
UIWebViewにCookieを設定する方法


`[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]`を使って設定することが出来ます。
引数に渡すcookieの生成方法などはサンプルを参照。

``` objc:SetCookieSample

@implementation SetCookieSample

- (void)cookieSample:(NSString *)cookieName cookieValue:(NSString *)cookieValue cookieDomain:(NSString *)cookieDomain {
    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:[NSDictionary dictionaryWithObjectsAndKeys:
            cookieName, NSHTTPCookieName,
            cookieValue, NSHTTPCookieValue,
            cookieDomain, NSHTTPCookieDomain,
            @"/", NSHTTPCookiePath,
            [NSDate distantFuture], NSHTTPCookieExpires,
            nil]];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}

@end

```
引数にNSDateが有るけど実質的には無視したい、あるいは適当な値を放り込みたい時


nilが許可されてるならnilでも良いが、それでは駄目なとき。
`[NSDate distantFuture]`を使う事で解決できるケースがある。
このメソッド自体はデフォルトの状態では”4001-01-01 00:00:00 +0000”と遙か未来の値を返します。

例えば、指定したNSDateまでの間イベント待ちをするといったメソッドで、アプリを起動している間無制限に待ちたいときなどに`[NSDate distantFuture]`を使います。

``` objc:NSDateSample
@implementation NSDateSample

- (NSDate *)dateSample {
    return [NSDate distantFuture];
}

@end

```
第2回 オフラインリアルタイムどう書くの参考問題の解答例。C で。

オフラインでリアルタイムに「どう書く」をやるイベント第二回
http://atnd.org/events/30900
の、参考問題
http://qiita.com/items/9d80de41903775296ca6
の解答例。C言語(C99)で。

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ENDOF(x) (x+sizeof(x)/sizeof(*(x)))

typedef struct data_t
{
  char const * src;
  char const * expected;
} data_t;

data_t data[]={
  {"3:5b8","3:de0"},
  {"1:8","1:8"},
  {"2:8","2:4"},
  {"2:4","2:1"},
  {"2:1","2:2"},
  {"3:5d0","3:5d0"},
  {"4:1234","4:0865"},
  {"5:22a2a20","5:22a2a20"},
  {"5:1234567","5:25b0540"},
  {"6:123456789","6:09cc196a6"},
  {"7:123456789abcd","7:f1a206734b258"},
  {"7:fffffffffffff","7:ffffffffffff8"},
  {"7:fdfbf7efdfbf0","7:ffffffffffc00"},
  {"8:123456789abcdef1","8:f0ccaaff78665580"},
  {"9:112233445566778899aab","9:b23da9011d22daf005d40"},
};

void clear_bits( char * rs )
{
  for( char * p=rs ; *p ; ++p ){
    *p='0';
  }
}

int int_from_nibble( char c )
{
  char sz[2]={0};
  sz[0]=c;
  return strtol( sz, 0, 16 );
}

_Bool bit_at( char c, int pos )
{
  return !!( int_from_nibble(c) & (8>>pos) );
}

typedef struct bitpos_t
{
  int nibble_pos;
  int bit_in_nibble;
} bitpos_t;

bitpos_t bitpos_from_xy( int x, int y, int len )
{
  bitpos_t result;
  int bit_pos=x+y*len;
  result.nibble_pos = bit_pos/4;
  result.bit_in_nibble = bit_pos%4;
  return result;
};

_Bool get_bit( char const * p, int x, int y, int len )
{
  bitpos_t pos=bitpos_from_xy( x, y, len );
  return bit_at( p[pos.nibble_pos], pos.bit_in_nibble );
}

char to_nibble( int val )
{
  return val<=9 ? val+'0' : val-10+'a';
}

void set_bit( char * p, int x, int y, int len )
{
  bitpos_t pos=bitpos_from_xy( x, y, len );
  int old=int_from_nibble( p[pos.nibble_pos] );
  p[ pos.nibble_pos ] = to_nibble( old | (8>>pos.bit_in_nibble ) );
}

char * bitrot( char const * q )
{
  char * result = strdup(q);
  char const * qs = strchr( q, ':' )+1;
  char * rs = qs-q+result;
  int len = atoi( q );
  clear_bits( rs );
  for( int y=0 ; y<len ; ++y ){
    for( int x=0 ; x<len ; ++x ){
      if ( get_bit( qs, x, y, len ) ){
        set_bit( rs, len-y-1, x, len );
      }
    }
  }
  return result;
}

int main()
{
  for( data_t const * it = data ; it != ENDOF( data ) ; ++it ){
    char * result = bitrot(it->src);
    if ( 0 != strcmp( it->expected, result ) ){
      printf( "***NG***" );
    }
    printf( "%s -> %s\n", it->src, result );
    free( result );
  }
  return 0;
}
```

無駄なことは書いてない気がするけど長い。
C言語の宿命か。
今回はあまり C99 特有の機能は使わなかった。

問題を作った時は C言語向きかな なんて思っていたんだが、解いてみるとそうでもない感じ。
もう少し楽に書けると思っていたんだけど。
Canvas上で文字列をアニメーションさせてみる


HTML5のCanvas上で文字列をアニメーションさせてみました。

こんな感じのサンプルです。
http://imacome.herokuapp.com/

まずはHTMLでCanvasを用意します。

```HTML:Canvas
<div id="wrapper">
  <canvas></canvas>
</div>
```

続いて、サーバから表示するメッセージの一覧を取ってくる関数を定義します。
今回はRailsのscaffoldでMessage.contentだけのモデルを用意しました。

```JavaScript:文字列取得
function reloadMessages(callback) {
  $.get('/messages.json', {}, function(res) {
    var messages = [];

    $(res).each(function(idx, item) {
      var pt = randomPoint();
      messages.push({
        content: item.content,
        color: randomColor(),
        delta: randomNumber(1,30),
        direction: 1,
        position: pt
      });
    });
    callback(messages);
  });
}
```

サーバからメッセージを取得後、Canvasに描画する関数です。clearRectで一端クリアしてから、fillTextで文字列を指定した座標に描画します。

```JavaScript:文字列描画
function onReload(messages) {
  var canvas = $('canvas')[0];
  var context = canvas.getContext('2d');

  // キャンバスクリア
  context.clearRect(0, 0, $(canvas).width(), $(canvas).height());
  $(messages).each(function(idx, msg) {
    context.font = 'Normal 14pt System';
    context.shadowColor = 'white';
    context.shadowOffsetX = 0;
    context.shadowOffsetY = 0;
    context.shadowBlur = 10;
    context.fillStyle = msg.color;
    context.fillText(msg.content, msg.position.x, msg.position.y);
  });

  _messages = messages;
}
```

最後に、アニメーションさせるためにsetIntervalで一定時間毎に再描画を繰り返すようにします。

```JavaScript:アニメーション
$(function() {
  var canvas = $('canvas')[0];
  $(canvas).attr({height: $('#wrapper').height()});
  $(canvas).attr({width: $('#wrapper').width()});

  reloadMessages(onReload);

  // アニメーションのため定期実行
  setInterval(function() {
    $(_messages).each(function(idx, msg) {
      if (msg.position.x < -200) {
        msg.position.x = $('canvas').width();
      } else {
        msg.position.x -= (msg.delta/10.0) * msg.direction;
      }
    });
    onReload(_messages);
  }, 10);
});
```

サーバも含めたソース一式はこちらからどうぞ。
https://github.com/yuch/imacome
第2回 オフラインリアルタイムどう書くの参考問題の解答例。ruby で。

オフラインでリアルタイムに「どう書く」をやるイベント第二回
http://atnd.org/events/30900
の、参考問題
http://qiita.com/items/9d80de41903775296ca6
の解答例。rubyで。

```ruby
#!ruby
#encoding:utf-8

def bitrot( q )
  len=q.to_i
  bits=q.split(':')[1].to_i(16)
  offset=(len&1)*3
  rotated_bits=(0...len*len).map{ |pos|
    y,x=pos.divmod(len) 
    bits[(len-x-1)*len+y+offset]<<(pos+offset)
  }.inject( &:| )
  "%d:%0*x"%[len,(len*len+offset)/4,rotated_bits]
end

DATA.each{ |line|
  q,expected=line.chomp.split(/\s+→\s+/)
  r=bitrot q
  puts(("%s  →  %s"%[q,r])+(r==expected ? '' : '**NG**'))
}
__END__
3:5b8 → 3:de0
1:8 → 1:8
2:8 → 2:4
2:4 → 2:1
2:1 → 2:2
3:5d0 → 3:5d0
4:1234 → 4:0865
5:22a2a20 → 5:22a2a20
5:1234567 → 5:25b0540
6:123456789 → 6:09cc196a6
7:123456789abcd → 7:f1a206734b258
7:fffffffffffff → 7:ffffffffffff8
7:fdfbf7efdfbf0 → 7:ffffffffffc00
8:123456789abcdef1 → 8:f0ccaaff78665580
9:112233445566778899aab → 9:b23da9011d22daf005d40
```

ruby なので、多倍長整数がそのまま使える。
divmod を初めて使った。役に立つのはこういうシチュエーションだよね、と思う。

ややトリッキーな ` offset=(len&1)*3` は、余る bit の数の計算。
紙の上で計算してみると、一辺の長さが偶数なら余らず、奇数なら3bit 余る。
ということで、`len%2==0 ? 0 : 3` でもいいんだけど、ちょっとゴルフな気分で。
OS XへのText::MeCabのインストール

OS Xだからってわけじゃないけどハマった。

ミソは、

 - cpanに上がってるバージョン(0.20013)は古いのでgithubから落とす。
 - homebrewで入れたmecab-ipadicを使う場合、文字コードをデフォルトから変更する必要があるので``--interactive``で実行する

って辺り。

```bash:
% mecab --version
mecab of 0.994
% brew install mecab
% brew install mecab-ipadic
% git clone https://github.com/lestrrat/Text-MeCab.git   
% cd Text-MeCab
% cpanm --interactive .
…
Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] utf-8
…
```

途中でこんなこと言われたら、おとなしく指示に従って``cpanm``する。

```bash:
Please install the following modules first:

 + Module::Install::CheckLib
 + Module::Install::XSUtil
```

UTF-8以外の辞書を使いたければ、[ここを](http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#charset)見て自分で辞書をビルドすればいいんだけど、テストが通らないので[このpullreq](https://github.com/lestrrat/Text-MeCab/pull/5)を適用すれば通るようになる。
mongodbのインストール


コピペ
http://dqn.sakusakutto.jp/2012/04/mongodb-install-linux-javascript.html
メモ:mongodbのシェルはjs

```sh:install_mongodb
curl http://fastdl.mongodb.org/linux/mongodb-linux-i686-2.0.4.tgz > mongo.tgz
tar xzfv mongo.tgz
cd mongodb-linux-i686-2.0.4
mkdir db                           # データ領域を作成
bin/mongod -dbpath db > logfile &  # mongod(サーバ)を起動
bin/mongo                          # mongoクライアントを起動
```


```javascript
MongoDB shell version: 1.6.4
connecting to: test
> 
> db.col.count(); // コレクションcolのレコード数をカウント
0

> db.col.save({ a : 1}); // データを１件保存してみる。

> db.col.find();         // 中身を表示 
{ "_id" : ObjectId("4f982c39b8bf0cfcead9daa7"), "a" : 1 }

> db.col.save({ b : 2}); // もう１件保存してみる。

> db.col.find();
{ "_id" : ObjectId("4f982c39b8bf0cfcead9daa7"), "a" : 1 }
{ "_id" : ObjectId("4f982c3bb8bf0cfcead9daa8"), "b" : 2 }

> db.col.count(); // 結果は２件
2
Faradayでリダイレクトを追っかける


[Faraday](https://rubygems.org/gems/faraday)でリダイレクトに対応するには[faraday_middleware](https://rubygems.org/gems/faraday_middleware)を使う。



```rb:Gemfile
gem 'faraday'
gem 'faraday_middleware'
```

（実際はfaraday_middlewareがfaradayに依存してるので後者だけでもOK）

そしてリクエストを投げる際にFaradayMiddleware::FollowRedirectsを指定する。
このときアダプタにNet/HTTPを指定する必要がある（[参考](https://github.com/lostisland/faraday_middleware/issues/32)）。

```rb
connection = Faraday.new "http://facebook.com" do |conn|
  conn.use FaradayMiddleware::FollowRedirects
  conn.adapter :net_http
end

response = connection.get("/about")
```

`http://facebook.com/about`は`https://www.facebook.com/facebook`にリダイレクトするようになっているので、こちらのデータを取得することができる。
Object::Container -base


よく見たら[SYNOPSISにだけ書いてる](http://search.cpan.org/~typester/Object-Container-0.14/lib/Object/Container.pm)けど、``-base``使って定義したクラスを``use``するときに引数を渡すと``get``メソッドのショートカットとなるメソッドを生やせる。

```perl:My.pm
package My;
use strict;
use warnings;
use Object::Container -base;

register ok_string => sub { "OK" };

1;
```

```perl:main.pl
use strict;
use warnings;
use My 'get_from_my';

print get_from_my('ok_string'), "\n";
```

[59行目辺り](https://github.com/typester/object-container-perl/blob/master/lib/Object/Container.pm#L59)のお陰。

```perl:Container.pm
            else {
                no strict 'refs';
                *{"${caller}::${name}"} = sub {
                    my ($target) = @_;
                    return $target ? $class->get($target) : $class;
                };
            }
```
リモートリポジトリのタグを削除する (ついでに追加方法のメモも)

```sh
git push REMOTE-REPOS --tags
```

これでローカルにあるタグが全部リモートリポジトリ REMOTE-REPOS にも追加される (origin とかで省略可能なら REMOTE-REPOS の指定は無くてもいい)．

個別に追加したい場合は，

```sh
git push REMOTE-REPOS TAGNAME
```

で良さげ．

で，間違えた名前のタグを付けてしまった等々の理由でリモートリポジトリのタグを消したい場合は

```sh
git push REMOTE-REPOS :/refs/tags/TAGNAME
```

で OK．

リモートブランチを削除するための

```sh
git push REMOTE-REPOS :BRANCHNAME
```

的なものと似てますね．そうやって覚えとこう，うん (自分に言い聞かせる)．

## 参考

* [How to add tags in Bitbucket? I&#39;m using Git - Stack Overflow](http://stackoverflow.com/questions/8773422/how-to-add-tags-in-bitbucket-im-using-git)
* [How to: Delete a remote Git tag - Nathan Hoad](http://nathanhoad.net/how-to-delete-a-remote-git-tag)
* [Pro Git - Pro Git 2.6 Git の基本 タグ](http://progit.redhome.cc/book/ja/ch2-6.html)
TextViewに埋め込んだUrlリンクをタップした時の動作を置き換える

TextViewにはHtml#fromHtmlを利用して、AタグでUrlリンクを埋め込むことができるが、動作を置き換えられないため、次のような場面で不便。

* TabやActivityGroupの子画面内で設定すると例外が起きて強制停止する

* 標準ブラウザでなくアプリ内のWebViewで遷移したい

TextViewに埋め込んだAタグタップでUrl遷移を動作させるには、次のようなコードが必要だが、

```java:
text.setMovementMethod(LinkMovementMethod.getInstance());
```

このLinkMovementMethodクラスを次のように拡張することで、リンクタップ時の動作を置き換えられるようになった。

```java:MutableLinkMovementMethod.java
package jp.sample.samplehtml;

import android.net.Uri;
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.widget.TextView;

/**
 * Htmlテキストのリンククリックアクションをオーバーライドするためのクラス。<br>
 *
 * original source is android.text.method.LinkMovementMethod.java
 *
 * @author S.Kamba
 *
 */
public class MutableLinkMovementMethod extends LinkMovementMethod {

	/**
	 * Urlのリンクをタップした時のイベントを受け取るリスナー
	 *
	 */
	public interface OnUrlClickListener{
		public abstract void onUrlClick(TextView widget, Uri uri);
	}

	/** Urlクリックリスナー */
	OnUrlClickListener listener = null;

	/*
	 * Urlクリックリスナーを登録
	 */
	public void setOnUrlClickListener(OnUrlClickListener l){
		listener = l;
	}

	@Override
	public boolean onTouchEvent(TextView widget, Spannable buffer,
			MotionEvent event) {

		// LinkMovementMethod#onTouchEventそのまんま

		int action = event.getAction();

        if (action == MotionEvent.ACTION_UP ||
            action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
					// リスナーがあればそちらを呼び出し
                	if(link[0] instanceof URLSpan && listener!=null){
                		Uri uri = Uri.parse( ((URLSpan)link[0]).getURL() );
                		listener.onUrlClick(widget, uri);
                	}else{
                		link[0].onClick(widget);
                	}
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer,
                                           buffer.getSpanStart(link[0]),
                                           buffer.getSpanEnd(link[0]));
                }

                return true;
            } else {
                Selection.removeSelection(buffer);
            }
        }

        return super.onTouchEvent(widget, buffer, event);
	}
}

```

＃それにしても、LinkMovementMethodはシングルトンにしたかったっぽいのになんでコンストラクタがpublicなんだろう？^^;
UIViewとタッチ判定


はまった。。。

### UIViewが親Viewの外側にいると、タッチしても反応しない。

UIViewとUIViewの組み合わせだとあまりこのミスはないかもしれないが、
このメソッドの存在を忘れていてかなりはまった・・・。

```Objective-C
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
```

基本中の基本ですね。。。
UIViewの座標指定をしっかりやったつもりでも、
Cellの高さ指定が抜けてた事に気が付かなくて結構な時間を使ってしまった。
SublimeText2 Build Option

~/Library/Application Support/Sublime Text 2/Packages/
設定めもも

- cmd

	配列でコマンドと、オプション・引数を指定
　
- file_regex

	省略可。コマンドのエラーキャプションを出力するための正規表現




##Perl


```json:Perl/Perl.sublime-build
{
    "cmd": ["perl", "-w", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.perl"
}
```