OmniAICreator/Qiita-1.07M huggingface dataset:
Xcodeで例外が発生したときにブレークする


unrecognized selectorで落ちた時に、どこで起きてんねん？って思うことあります。

調べたら[Breaking on unrecognized selector](http://stackoverflow.com/questions/7354169/breaking-on-unrecognized-selector)にあったのでXcode 4.6.1で確認しました。


##1. Breakpoint Navigatorを開く

![](https://dl.dropbox.com/u/8932138/screenshot/xcode_breaktest/breaktest_2013-03-27_1745.png
)

##2. 左下の+ボタンを押し、Add Exception Breakpoint…を選択

![](https://dl.dropbox.com/u/8932138/screenshot/xcode_breaktest/breaktest_2013-03-27_17452.png)

##3. Objecive-Cの例外でブレークする設定

C++の例外も選べる模様

![](https://dl.dropbox.com/u/8932138/screenshot/xcode_breaktest/breaktest_2013-03-27_1746.png)

##4. ブレーきんぐ

![](https://dl.dropbox.com/u/8932138/screenshot/xcode_breaktest/breaktest_2013-03-27_1747.png)

ブレークしたくないときはBreakpoint Navigatorから該当ブレークポイントを右クリックでDisableにすれば有効・無効を切り替えられます。

Visual Studioにも似たような設定があります、あっちは例外クラスごとに止めるかどうか設定できますが、今のこところこれで十分。
AWS EC2にhandlersocketを入れるまで


### ソース格納ディレクトリに移動

```bash
sudo su
cd /usr/local/src/
```

### handlersocketをclone

```bash
git clone git://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git
cd HandlerSocket-Plugin-for-MySQL/ 
```

```bash
./autogen.sh
```

### libtoolとかautconfとかでエラーが出た場合

```bash
yum install automake gtk-doc
yum install libtool
./autogen.sh
```

### やっとクライアントライブラリ作成

```bash
./configure --disable-handlersocket-server
make
make install
cd perl-Net-HandlerSocket
perl Makefile.PL
```

### またエラー。。。(can't locate ExtUtils/MakeMaker.pm)

```bash
yum install perl-ExtUtils-MakeMaker 
perl Makefile.PL
```

### make & make install

```bash
make
make install
```

## 次はPHPのライブラリ作成

```bash
cd /usr/local/src/
curl -O https://php-handlersocket.googlecode.com/files/php-handlersocket-0.3.1.tar.gz
tar zxvf php-handlersocket-0.3.1.tar.gz
cd handlersocket/
```

### make installまで

```bash
phpize
```

```bash
./configure 
```

#### 少し脱線

> phpライブラリ作成の前にやった、クライアントライブラリ作成をせずとも「--disable-handlersocket-hsclient」オプションを付けて

> ```bash
./configure --disable-handlersocket-hsclient
```
と実行してもOKなのだが

> 出来上がるファイル「/usr/lib64/php/modules/handlersocket.so」
のサイズが極端に小さくなってしまう。

> 「--disable-handlersocket-hsclient」オプションが
あった場合　：1084695
なかった場合：247217

> 僕は最初、気づかず無しのほうで使っていたのですが
連続実行した場合、結果が不安定になってしまっていた。

> ３０件取得出来るはずが、１件になったり、３０件になったりと
不安定。。（原因知ってる方居ましたら教えて下さい、、このあたりの知識がなくて）

では、戻ります。

### 戻しました

```bash
make
make install
```

### これであとはphp.iniに

```bash
echo "extension=handlersocket.so" > /etc/php.d/hs.ini
```
hs.soになってました。。iniに修正

これでやっとAWSでHandlerSocket使いになれた。

## 参考

### クライアントライブラリ導入
https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL/blob/master/docs-ja/installation.ja.txt

### PHPクライアント導入・使い方
https://code.google.com/p/php-handlersocket/

### HandlerSocketのgithub
https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL
1.9と1.8でKernel.systemの引数の違い

```1.8.rb
system("firefox.exe http://google.com") #非推奨だろうけど通る
```
```1.9.rb
system("firefox.exe http://google.com") #何も起きない？
system("firefox.exe", "http://google.com") #ちゃんと引数をわけて書きましょう。
```
wxRubyでJPGなどの画像を表示

wxRubyでFileDialogを使った選択した画像をそのまま表示するサンプル。

Wx::Frame.refresh
Wx::Frame.update
の両方を呼ばないとダメらしい。

```open_image.rb
require 'wx'

class MyApp < Wx::App
  def on_init
    MyFrame.new.show
  end
end

class MyFrame < Wx::Frame
  def initialize
    super(nil, -1, "Image Test")
    menu_bar = Wx::MenuBar.new
    file_menu = Wx::Menu.new
    file_menu.append(Wx::ID_OPEN, '&Open', 'Open Image')
    menu_bar.append(file_menu, '&File')
    set_menu_bar(menu_bar)
    evt_menu(Wx::ID_OPEN) {|event| menu_open(event)}
  end
  def menu_open(event)
    dlg = Wx::FileDialog.new(self, "Choose a file", Dir.getwd(), "")
    if dlg.show_modal() == Wx::ID_OK
      file = dlg.get_paths[0]
      img = Wx::Image.new(file)
      @bitmap.destroy unless @bitmap.nil?
      @bitmap = Wx::StaticBitmap.new( self, -1, img.convert_to_bitmap, [0,0], [img.width, img.height ] )
      self.refresh
      self.update
    end
  end
end

MyApp.new.main_loop
```
※再描写がおかしい？
特定のクラス・インタフェースだけを Proguard で難読化する

proguard-project.txt では難読化したくないクラスを -keep オプションで除外していくようになっていますが、除外するクラスを全部確実に指定するのは結構大変で、難読化しちゃいけないクラスを難読化してトラブルことが多いです。

そこで、逆に特定のクラス「だけ」を難読化し、デフォルトは難読化しないようにすることができます。

```
-keep class !com.example.** { *; }
-keep interface !com.example.** { *; }
```

上記のようにすると、com.example.** 以外のものをすべて難読化除外します。"!" をつけているところがミソです。
githubのAPIトークンを取得する

APIキーを取得する
==
githubのSettingからAPIトークンを取得する方法がわからなかったのでhelpを参照した所、次の方法が見つかった。

```shell
$ curl -u 'username' -d '{"scopes":["repo"],"note":"Help example"}' https://api.github.com/authorizations
```

usernameの部分を自分のアカウント名に変更して上のコマンドを実行する。
パスワードを聞かれるのでgithubアカウントのパスワードを入力する。
すると以下の様な文字列が帰ってくる。
"token":"your_token"のところにAPIトークンが入っているのでこれを使えばいい。

```
{
  "scopes": [
    "repo"
  ],
  "token": "your_token",
  "app": {
    "url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api",
    "name": "Help example (API)"
  },
  "url": "https://api.github.com/authorizations/123456",
  "note": "Help example",
  "note_url": null,
  "id": 123456,
}
```
https://help.github.com/articles/creating-an-oauth-token-for-command-line-use
Playフレームワーク2.1でgoogle-guiceを使う

サンプルもありますが使い方まで含めて。

まず、GlobalSettingsを継承したGlobalで以下のようにします。

```java:Global.java
public class Global extends GlobalSettings {

	/** アプリケーションで使うinjector **/
	private Injector injectror;

	@Override
	public void onStart(Application app) {
		super.onStart(app);
		// injectorを作成する
		injectror = Guice.createInjector(new AbstractModule() {
			@Override
			protected void configure() {
				bind(Hoge.class).toProvider(HogeImpl.class).in(Singleton.class);
			}
		});
	}
	@Override
	public <A> A getControllerInstance(Class<A> controllerClass) throws Exception {
		// 作成したinjectorをアプリケーションに登録
		return injectror.getInstance(controllerClass);
	}

}
```

こんな感じ。要は、Controllerで使うインスタンスを  
guiceで作成したものにすればよいです。  
そのためにgetControllerInstanceをオーバーライドします。


次に、「独自に作成したControllerのインスタンスを使う」という処理を書きます。

```txt:route.txt
# Home page
GET     /							@controllers.Application.index()
```
guiceの仕組みを適用したいControllerクラスの頭に「@」をつけてやります。

これで、対応するクラスでguiceによるDIなどが利用できるようになります。

```java:Application.java
public class Application extends Controller {

	@Inject
	private Hoge hoge;

	public Result index() {
		return ok(hoge.operation());
	}
```
gitlab 5.0とredmine2.3の連携ではまったこと

# redmineを動かしているredmineユーザをgitlabを動かしているgitグループに追加したらgitlabで公開鍵認証を使ったpushやpullができなくなった

な、なにをいっているかわからねぇと思うが、僕もなにがどうなってこうなったのか頭がおかしくなりそうでした。

結論をいうと、
**gitlab5.0ではgitグループに他のユーザを追加するとsshを利用した公開鍵認証方式でアクセスできなくなる(pushとかpullとかfetchとか)**
redmineをいれたからこうなったのか、またはVMware上のubuntu(12.04)特有の現象かというところまでは調べられていません。

## 詳細
これだけではなんなので詳細を。

1. gitlab5.0はgitユーザで、redmine2.3はredmineユーザで動かしていた。
2. redmineからgitlabで利用しているリポジトリが直接見たいと思った。
3. `sudo gpasswd -a redmine git` で redmineユーザをgitグループに追加した。
4. redmineからは直接リポジトリがみれるようになった。
5. `いつのまにかgitlabで公開鍵認証が使えなくなってた` ・・・え(´・ω・｀)？

何が原因で公開鍵認証が使えなくなったのか1日くらい悩んだり試したりした結果、
`sudo gpasswd -a redmine git`
でつながらなくなって
`sudo gpasswd -d redmine git` でgitグループからredmineユーザを抜くと公開鍵認証が期待通りに動作する
ということがわかりました。

redmineユーザが特別なのかなと、とりあえず適当なユーザ(sshtest)を作ってgitグループに追加、gitlabのリポジトリへ公開鍵認証方式でアクセス！ってやってみたけどエラーになりました。

    sudo adduser --disabled-login --gecos 'sshtest' sshtest
    sudo gpasswd -a sshtest git

そういうポリシーなのかなと思ってgitlab4.2で、gitとgitlabグループに適当なユーザを追加してみましたがそんな事態はおきなかった＼(^o^)／

gitlab-shellまわりが怪しいなーと思ってソースをcloneしてのぞいてみたところ、

**僕にrubyも覚えろというのか・・・(´・ω・｀)**

という状況になったので、とりあえずはredmineもgitユーザで動かすことにして、何もみなかったことにしました。
**誰も僕を責めることはできない**

なんとなくユーザ分けたほうが管理しやすそうとは思いましたが、
思い通りに行かないのが世の中なのでその辺りは割り切っていきたいと思います。
bundle execを使わずに済む方法（rbenv編）

```sh
$ cd
$ mkdir .rbenv/plugins
$ cd .rbenv/plugins
$ git clone git://github.com/ianheggie/rbenv-binstubs.git
```

- rbenvにはpluginsという仕組みがあってrbenvに機能を追加できる。ruby-buildもその一つ。「ひとつのことをうまくやる」思想っぽい。
- そのpluginのひとつにbundlerとの連携をうまくやってくれる[rbenv-bundler](https://github.com/carsomyr/rbenv-bundler)というのがあるんだけど、rbenvはこれを[非推奨](https://github.com/sstephenson/rbenv/wiki/Plugins#bundler-integration)といってる。パフォーマンスが悪くなったり、バグが多いみたい。
- 同じようなpluginを探したところ、[rbenv-binstubs](https://github.com/ianheggie/rbenv-binstubs)というものを見つけた。[thoughtbotのブログ](http://robots.thoughtbot.com/post/47273164981/using-rbenv-to-manage-rubies-and-gems)で紹介されていた。

### Rails 3

```sh
$ cd path/to/project
$ bundle install --binstubs
$ rbenv rehash
$ rails s
```

- `--path=vendor/bundle`を指定するとうまくいかなかった。

### Rails 4

```sh
$ cd path/to/project
$ bundle install --binstubs=bundle_bin
$ rbenv rehash
$ rails s
```

- Rails 4からはbinディレクトリの扱いが若干変わるので要注意。詳しくは[こちら](http://qiita.com/items/01c41578e611b038da6e)。
- binstubsが実行ファイルを生成するディレクトリを指定する。指定してもちゃんと動く。
ReederライクなActionSheet AAActivityActionを作って気づいた事


[https://github.com/r-plus/AAActivityAction](https://github.com/r-plus/AAActivityAction)
使い方とかはgithubの方を見ていただくとして、ここでは作成を通して新たに気づいた事とかを。

* アニメーションは実際に表示される時に効果が発揮される

`+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations`は表示状態のViewに対して使えるものだと思っていたけれど、事前にアニメーションをつけておいたViewが実際に表示される`addSubview`のタイミングでアニメーションがされる。例えば下記のviewに付与したアニメーションは`show`メソッドで`superview`が表示される時にちゃんとアニメーションされる。

````objectivec:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
[UIView animateWithDuration:0.1 animations:^ {
    // view animation.
}];    
[superview addSubview:view];

…

//違うメソッド
- (void)show
{
    [superview addSubview:self.view];
}
````

* UITapGestureRecognizerの判定

View AにView BをaddSubviewし、BにUIButton CをaddSubviewした状態でView AにUITapGestureRecognizerを登録するとBでもCでもメソッドが呼ばれるので判定のために`- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
`で判定した時、以下のコードだとiOS 5ではUIButton Cに登録したアクションよりTapGestureのアクションが優先された。(iOS 6だとボタンのアクションが優先された）
参考 : http://qiita.com/items/674d676e6138f36197b3

````objectivec:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view == viewB)
        return NO;
    return YES;
}


````

判定にButton Cであるかどうかも加えるとiOS 5でも意図どおりに動作した。

````objectivec:
    if (touch.view == viewB || touch.view == buttonC)
````
Google Playに申請OK → 署名NGでインストール不可？

ちょっと原因も対策もよく分からないのでメモ。

### 前提
+ Titanium Studioからkeystoreを作成した
+ keystoreのオプションは標準のまま（RSA 2048bit）
+ 対象はAndroid 4.0以降
+ AndroidManifest.xmlは更新している

### NGまでの流れ
+ 作成したkeystoreを使い、Store用にAndroidビルド
+ Google Playに申請 → OK
+ しばし待つ
+ テスト端末のデバッグ版アプリを削除
+ Google Playから申請アプリをインストール
+ 署名NGでインストールできず
+ あれ？っと思い、申請アプリのadbインストールを試すも署名NG

### やったこと
+ Titanium Studioのコンソールから、`jarsigner`の`-sigalg`オプションがAndroidのドキュメントで指定されているものと異なっているのを確認
+ `jarsigner -sigalg MD5withRSA ...（あとは同じ）`と手動でサイン
+ `zipalign`も手動で
+ もう一度Google Playへ申請
+ 通った (´・ω・｀) 何があかんかったんやろか。毎回手動で署名とかめんどい

### 分かってきたこと
+ keystoreを調べると、署名アルゴリズムに`SHA256withRSA`が書かれている
+ `keytool -list -v -keystore XXXX.keystore -alias XXXX`で調べる
+ この結果を見て、`builder.py`が`jarsigner`の`-sigalg`オプションを`SHA256withRSA`にしている
+ デフォルトは`MD5withRSA`、つまり正しい結果になるはず
+ Titanium Studioからkeystoreを作ったからこうなったのかな
+ 毎回手動サインは面倒なので、builder.pyを編集してやった。だいたい1700行目の`get_sigalg`メソッド。
+ どうやらTerminalの文字コードをS-JISに変更するとOKらしいぞ！まだ試してないけど。
Rubyを使ってCPU1コアの使用率を100%にするためのワンライナー

CPU1コアの使用率を100%にするRubyのワンライナーです。

```
 % ruby -e 'while (1); end'
```


**※2013/4/7 追記**
loopメソッドを使った内容をコメントでいただきましたので追記します。

```
ruby -e loop{}
```
第9回オフラインリアルタイムどう書くをC++で解く

ラムダやstd::functionを使ったのは単に使ってみたかったからです。使う必要は無いと思います。

```cpp
#include <iostream>
#include <map>
#include <string>
#include <functional>
#include <cmath>
#include <algorithm>
#include <vector>
#include <regex>

namespace
{
	int GetFreeInfants(const std::string& passengers)
	{
		std::smatch match;
		std::regex reg("A[w|p|n]");
		int adults = 0;
		std::string text = passengers;
		while (std::regex_search(text, match, reg))
		{
			++adults;
			text = match.suffix().str();
		}
		return 2 * adults;
	}

	int Half(int value)
	{
		return static_cast<int>(ceil(value / 20.0) * 10);
	}

	class Cashier
	{
		int freeInfants_;
		std::map<std::string, std::function<int()> > cashingMethods_;
	public:
		Cashier(const std::string& src)
			:freeInfants_(GetFreeInfants(src))
		{
			int base = atoi(src.c_str());
			cashingMethods_["Ap"] = cashingMethods_["Cp"] = cashingMethods_["Ip"] = [base](){return 0;};
			cashingMethods_["An"] = [base](){return base;};
			cashingMethods_["Aw"] = cashingMethods_["Cn"] = cashingMethods_["In"] = [base](){return Half(base);};
			cashingMethods_["Cw"] = cashingMethods_["Iw"] = [base](){return Half(Half(base));};
		}
		int GetFare(const std::string& passenger)
		{
			if ((passenger == "In" || passenger == "Iw") && 0 < freeInfants_)
			{
				--freeInfants_;
				return 0;
			}
			return cashingMethods_[passenger]();
		}
	};

	int Solve(const std::string& src)
	{
		Cashier cashier(src);
		std::string tmp = src.substr(src.find(':') + 1, src.length());
		std::vector<std::string> passengers;
		for (size_t i = 0; i < tmp.length(); i += 3)
		{
			passengers.push_back(tmp.substr(i, 2));
		}
		std::sort(passengers.begin(), passengers.end());
		int total = 0;
		for (size_t i = 0; i < passengers.size(); ++i)
		{
			total += cashier.GetFare(passengers[i]);
		}
		return total;
	}

	void Test(const std::string& src, const std::string& expected)
	{
		static int no = 0;
		int actual = Solve(src);
		std::cout << no++ << " : " << (actual == atoi(expected.c_str()) ? "ok" : "ng");
		std::cout << std::endl;
	}
}

int main()
{
	/*0*/ Test( "210:Cn,In,Iw,Ap,Iw", "170" );
	/*1*/ Test( "220:Cp,In", "110" );
	/*2*/ Test( "230:Cw,In,Iw", "240" );
	//以下略
	return 0;
}
```
viewのspecを書く


## Capybaraのセレクタで要素を検証する

CapybaraはWebブラウザをシミュレートしてCucumberでのWebアプリケーションの受け入れテストの記述をサポートするものだけど、Viewのspecを書くのにも使える。

```Gemfile
group :test do
  gem 'capybara'
end
```

これで`bundle install`すれば spec の中で `have_selector'が使えるようになる。
have_selecorの第1引数は css selector を渡すようになっている。

```ruby:hoge.html.erb_spec.rb
describe 'users/sessions/new.erb.html' do
  subject { render }

  it 'ログインフォームを表示する' do
    subject.should have_selector('input[type=email][name="user[email]"]')
    subject.should have_selector('input[type=password][name="user[password]"]')
  end
end
```

css selector のほか、XPathで要素を指定するメソッドも用意されている。

参考: [File: README — Documentation for jnicklas/capybara (master)](http://rubydoc.info/github/jnicklas/capybara/master)

## helperをstubする

```ruby:fuga.html.erb_spec.rb
describe 'users/sessions/new.erb.html' do
  subject { render }

  context 'notice メッセージが設定されている場合' do
    before do
      view.stub(:notice) { "hoge" }
    end

    it "noticeメッセージが出力される" do
      subject.should have_content("hoge")
    end
  end
end
```

参考: [view spec - RSpec Rails - RSpec - Relish](https://www.relishapp.com/rspec/rspec-rails/docs/view-specs/view-spec#passing-view-spec-that-stubs-a-helper-method)
Heroku で Asset Pipeline を使う

Heroku で Asset Pipeline を使う
==============================

```ruby:config/environments/production.rb
   # config.assets.css_compressor = :sass

   # Whether to fallback to assets pipeline if a precompiled asset is missed.
-  config.assets.compile = false
+  config.assets.compile = true

   # Generate digests for assets URLs.
   config.assets.digest = true
```

上記の様に変更してherokuにpushするだけで上手くいきました
これをしておかないとassets/*が404になってしまいます
precompileを使った手順の方が良さそう(?)なので下記なども参考にすると良さそうです。

## 参考
* http://qiita.com/items/a1833b48c3b47a955bdf
* http://a-newcomer.com/20
gitlab5.0を運用しているサーバのIPが変わった場合の手順

# 前提:ubuntu 12.04にgitlab5.0をインストールガイドにそって入れている
他の環境でもほぼ同じではないかと思われますが一応ねんのため。

[実際にIPを変更したときの手順はこれ](https://github.com/kyanro/gitlabknowledge/blob/5.x/%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AEIP%E5%A4%89%E6%9B%B4%E6%99%82%E3%81%AE%E6%89%8B%E9%A0%86.md)

以下、概要

## 設定ファイルを修正して、サービス、webサーバを再起動

### gitlab-shellの設定変更
`/home/git/gitlab-shell/config.yml`

### gitlabの設定変更
`/home/git/gitlab/config/gitlab.yml`

### gitlab起動スクリプトの設定変更
`/etc/nginx/sites-available/gitlab`

---

#gitlab再起動
`sudo service gitlab stop`
`sudo service gitlab start`

#nginx再起動
`sudo service nginx stop`
`sudo service nginx start`
ChefServerのSearchAPI

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


ChefServerがあると、Nodeの構成情報を管理・利用できる。

構成情報の利用方法は幾つかかあるがレシピ内で使う場合、Searchメソッドが使える。


## searchメソッド

任意のRoleに宛てられたノード達をArrayで返してもらう例。

```ruby
chef > search(:node, "roles:zookeeper_servers")
 => [node[zk01.example.com], node[zk02.example.com], node[zk03.example.com]] 
```

それぞれのアイテムは`Chef::Node`クラス。

```ruby
chef > search(:node, "roles: zookeeper_servers")[0].class
 => Chef::Node 
```

`Chef::Node`クラスということは、Attributesを持っているということなので、下記のようにレシピ内で利用したい情報を抽出できる。

```ruby
chef > search(:node, "roles: zookeeper_servers").map {|node| node.ipaddress}
 => ["192.168.1.10", "192.168.1.20", "192.168.1.45"] 
```

## Knifeから使う例

knife ssh はSearchAPIのクエリを使い、対象ノードにssh越しのコマンド実行が出来る。

```bash
$ knife ssh "roles:zookeeper_servers"  date
zk01.example.com Sun Apr  7 01:17:28 JST 2013
zk02.example.com Sun Apr  7 01:17:28 JST 2013
zk03.example.com Sun Apr  7 01:17:28 JST 2013

```

SearchはChefの奥義の一つだが、最近のChef対応を謳うサービスはSolo互換が主なので使えないのが残念。
foreach で列挙されない場合に処理を実行する

[foreach で break された場合に処理を実行する](http://qiita.com/items/2278cf0446f20fc37c36)の応用？
この間作ってみて便利だったので。
Any() とか使うと 2 回列挙するから ReSharper 先生に怒られちゃう＞＜ ってときに。

```csharp:EnumerableExTest.cs
[TestClass]
public class EnumerableExTest
{
    [TestMethod]
    public void EmptyTest()
    {
        var called = false;
        var array = new object[0];
        foreach (var item in array.IfEmpty(() => called = true))
        {
            Console.WriteLine(item);
        }
        called.IsTrue();
    }
    [TestMethod]
    public void NotEmptyTest()
    {
        var called = false;
        var array = new[] { 1 };
        foreach (var item in array.IfEmpty(() => called = true))
        {
            Console.WriteLine(item);
        }
        called.IsFalse();
    }
}
```

```csharp:EnumerableEx.cs
public static class EnumerableEx
{
    public static IEnumerable<T> IfEmpty<T>(this IEnumerable<T> source, Action action)
    {
        var isEmpty = true;
        foreach (var item in source)
        {
            isEmpty = false;
            yield return item;
        }
        if (isEmpty) action();
    }
}
```
コマンド対応表: Eclipse, IntelliJ


普段Eclipseをメインで使っているのでたまにIntelliJを使うとうまくいかないことがあって困るのでメモ。

ショートカットキーではなくコマンド名の対応表。ショートカットキーはインストールしてるOSなんかによっても変わってくるし記載しない。

| Eclipse | IntelliJ |
|:--|:--|
| Content Assist | Completion |
| Quick Fix | Show Intention Actions |
| Open Declaration | Declaration |
| Open Implementation | Implementation(s) |
| Open Resource | File... |
| Previous Tab | Select Previous Tab |
| Next Tab | Select Next Tab |

使いながら追記していく（予定）。
第9回オフラインリアルタイムどう書くをRubyで解く

rubyってインクリメント/デクリメント演算子が無いんですね。

```ruby
def get_fare(an, cn)
  fare = {"An"=>an, "Ap"=>0, "Aw"=>((an/20.0).ceil)*10, "Cn"=>cn, "Cp"=>0, "Cw"=>((cn/20.0).ceil)*10, "In"=>cn, "Ip"=>0, "Iw"=>((cn/20.0).ceil)*10}
end

def solve(input)
  an = input.split(":")[0].to_i
  fare = get_fare(an, ((an/20.0).ceil)*10)
  passengers = input.split(":")[1].split(",").sort
  free_infants = (passengers.count{|p| /A[w|p|n]/=~p}) * 2
  total = 0
  passengers.each do |p|
    if (/I[w|p|n]/=~p) and (0 < free_infants)
      free_infants -= 1 unless p == "Ip"
    else
      total += fare[p]
    end
  end
  total
end

DATA.each do |line|
  no, input, expected = line.split
  result =  expected.to_i == solve(input) ? "ok" : "ng"
  puts "#{no} : #{result}"
end

__END__
0 	210:Cn,In,Iw,Ap,Iw 	170
1 	220:Cp,In 	110
2 	230:Cw,In,Iw 	240
```

Nabetaniさんとnidouchiさんの解答を見て、書き直してみました。

```rb
def discount(value)
  (value / 20.0).ceil * 10
end

def solve(src)
  fare = src.split(":")[0].to_i
  passengers = src.split(":")[1].split(",").sort_by{|p| {"n"=>0, "w"=>1, "p"=>2}[p[1]]}
  adults = passengers.count{|p| p[0] == "A"}
  infants = passengers.select{|p| p[0] == "I"}.drop(adults * 2)
  (passengers.select{|p| p[0] != "I"} + infants).inject(0) do |total, x|
    base = x[0] == "A" ? fare : discount(fare)
    total + {"n"=>base, "w"=>discount(base),"p"=>0}[x[1]]
  end
end

DATA.each do |line|
  no, src, expected = line.split
  actual = solve(src).to_s;
  result =  expected == actual ? "ok" : "***NG***"
  puts "#{no} : #{result}"
end

__END__
0 210:Cn,In,Iw,Ap,Iw  170
1 220:Cp,In 110
2 230:Cw,In,Iw  240
```
第9回オフラインリアルタイムどう書くの C++ による実装例


嵐の中、オフラインリアルタイムどう書くを行った。

イベント : http://atnd.org/events/37587
問題 : http://nabetani.sakura.ne.jp/hena/ord9busfare/
解答リンク集 : http://qiita.com/items/84255ac417ef25069a3b

主催者だけど、時間内にその場で書いたもの。

ちょっとずるずる書く感じにしてみた。

```c++
// compiled with "g++ -Wall busfare.cpp", g++ is i686-apple-darwin11-llvm-g++-4.2

#include <iostream>
#include <map>

using namespace std;

void  make_free( map< string, int > & counts, string const & key, int & free_i )
{
    int n = counts[ key ];
    int c = n<free_i ? n : free_i;
    free_i -= c;
    counts[key] -= c;
}

int half_of( int x )
{
    int h=x/2;
    if ( int r=h%10 ){
        h+=10-r;
    }
    return h;
}

int solve( string const & src )
{
    int fare = atoi( src.c_str() );
    size_t pstart = src.find( ":" )+1;
    map<string, int> counts;
    int adults=0;
    for( size_t p = pstart ; p<src.length() ; p+=3 ){
        string sym = src.substr( p, 2 );
        counts[ sym ] +=1;
        if ( 'A'==sym[0] ){
            ++adults;
        }
    }
    int free_i = adults*2;
    make_free( counts, "In", free_i );
    make_free( counts, "Iw", free_i );
    int half = half_of(fare);
    int qua = half_of(half);
    return
        fare * counts["An"]
        + half * ( counts["Aw"] + counts["Cn"] + counts["In"] )
        + qua * ( counts["Cw"] + counts["Iw"] )
        ;
}

void test( string const & src, string const & expected )
{
    int actual = solve( src );
    bool ok = actual == atoi( expected.c_str() );
    cout <<
        ( ok ? "ok " : "**NG** " )
        << src << "->"
        << actual << " / " << expected << "\n";
}

int main()
{
/*0*/ test( "210:Cn,In,Iw,Ap,Iw", "170" );
/*1*/ test( "220:Cp,In", "110" );
// 中略
/*40*/ test( "1270:Ap,In,An,Ip,In,Ip,Ip", "1270" );    
}
```

例によってテストデータの大半は省略。

make_free で参照がたくさんあるのが気持ち悪い。
solve の最後が無様な感じだけど、6通りぐらいなら書き上げるのも悪くないよね、ということで。
FreeMarkerの記法


Gist投稿テストも兼ねた

小数の記法
--
\#{hoge ;format}
formatはm1,M1とかある
http://freemarker.sourceforge.net/docs/ref_depr_numerical_interpolation.html

booleanの変数を表示する
--
```hoge?string``` で表示する


リストがあるか？
--
list?has_content

Mapでデータを取得するとき
--
keyがstringの場合
<#list map?keys as key>
${map[key]} <#-- mapの中身が取れる -->
</#list>

keyがint,double等の場合
<#list map?keys as key>
${map.get(key?int)}　<#-- doubleの場合は key?double -->
</#list>

これでも
<#list map.entrySet() as entry>
${entry.key} = ${entry.value}
</#list>


??と?has_contentの違い
--
「??」は変数が存在すればtrueを返し、「?has_content」は変数が存在してかつ中身が空でないときにtrueを返してくれるみたいです。

bean.isIosServiceとかの場合
---
<#if bean.isIosService> </#if> では評価時にエラーをおこすことがある <#if bean.isIosService()> </#if>とJavaのままで書く
プロパティ名によっては<#if bean.xxx> でいける。(例: <#if bean.open>とか)
第9回オフラインリアルタイムどう書くの問題をRubyで解く

問題は
http://nabetani.sakura.ne.jp/hena/ord9busfare/

```ruby
def half(n)
  q,r = n.divmod(20)
  q *= 10
  q += 10 unless r == 0
  q
end

def solve(q)
  charge,ps = q.split(':')
  charge = charge.to_i
  ps = ps.split(',').sort
  sum = 0
  fc = ps.count{|_|_[0]=='A'} * 2
  ps = ps.select{|_| _[1]!='p'}
  psI,psAC = ps.partition{|_|_[0]=='I'}
  psI = psI.drop(fc)
  ps = psI + psAC
  ps.each{|_|
    cg = 0
    cg = _[0] == 'A' ? charge : half(charge)
    cg = half(cg) if _[1] == 'w'
    sum += cg
  }
  sum
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end

__END__
0	210:Cn,In,Iw,Ap,Iw	170
1	220:Cp,In	110
2	230:Cw,In,Iw	240
```
amazon linux上に、firefoxをインストール

以下のコードをamazon centos上に実行してください

```
# sudo wget -qO- https://gist.github.com/alingogo/5325484/raw | sudo bash
```

----
[参照](http://joekiller.com/2012/06/03/install-firefox-on-amazon-linux-x86_64-compiling-gtk/)
XOOPS Momoxoの実行環境をVagrantでわずか6ステップで構築する

![図]

## 環境

Mac OS X 10.8.3
Vagrant 1.1.5
VirtualBox 4.2.10


## インストール

### Vagrant

http://downloads.vagrantup.com/tags/v1.1.5

### VirtualBox

https://www.virtualbox.org/wiki/Downloads

## VagrantにBoxを追加

```
vagrant box add centos_63_x86_64 https://dl.dropbox.com/s/ajk7omgla8i4qi6/centos_63_x86_64_for_vb4.1.box
```


## GitHubからVagrantfileとCookbookを取得

```
git clone git://github.com/reoring/Momoxo_Vagrant.git
```

## Vagrantを起動

これでMomoxoの環境が自動的に構築されます。

```
cd Momoxo_Vagrant && vagrant up
```

## 確認

ブラウザから、http://192.168.33.11/ を開いてMomoxoのインストール画面が表示されれば成功です！


## 仮想環境にsshで接続する

```
vagrant ssh
```

## Chefレシピ

defaults.rbに書いてある内容です。

```ruby
%w{php php-gd php-mbstring php-mysql mysql-server httpd git mysql-server}.each do |pkg|
  package pkg do
    action :install
  end
end

service "httpd" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable, :restart ]
end

service "mysqld" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable, :restart ]
end

service "iptables" do
  action [ :disable, :stop ]
end

template "httpd.conf" do
  path "/etc/httpd/conf/httpd.conf"
  source "httpd.conf.erb"
  owner "root"
  group "root"
  mode 0644
  notifies :restart, 'service[httpd]'
end

directory "/var/www/html/momoxo" do
  owner "apache"
  group "apache"
  mode "0755"
  action :create
end

git "/var/www/html/momoxo" do
  repository "git://github.com/momoxo/v1"
  reference "master"
  action :checkout
  user "apache"
  group "apache"
end

execute "create momoxo database" do
  command "mysql -u root -e 'create database momoxo charset=utf8'"
end

```

## Vagrantfile

```ruby

Vagrant.configure("2") do |config|
  config.vm.box = "centos_63_x86_64"
  config.vm.network :private_network, ip: "192.168.33.11"
  
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["chef-repo/cookbooks", "chef-repo/site-cookbooks"]
    
    chef.add_recipe "yum::epel"
    chef.add_recipe "recipe[momoxo]"
  end
end
```

## アップデート

### 2013-04-07

* MySQLが自動起動されていない問題を修正
* momoxoデータベースをレシピで作成するように追加



[図]: https://dl.dropbox.com/s/yy03fd7own1uxjk/momoxo.png
第9回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/37587 )を行いました。

問題は「バス代」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord9busfare/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

ちなみに、このルールでバス代を計算している会社があるわけではありませんが、「福祉割引」などは実在します。
Twitter API request_tokenエラー "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “api.twitter.com” which could put your confidential information at risk."

OAuth認証の過程で、リクエストトークンをゲット( https://api.twitter.com/oauth/request_token )しようとしたら、謎エラーが返ってきました。

> error=Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “api.twitter.com” which could put your confidential information at risk." UserInfo=0x1fd84610 {NSErrorFailingURLStringKey=https://api.twitter.com/oauth/request_token, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSErrorFailingURLKey=https://api.twitter.com/oauth/request_token, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “api.twitter.com” which could put your confidential information at risk., NSUnderlyingError=0x1fd81c00 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “api.twitter.com” which could put your confidential information at risk.", NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x1fd83ca0>}


http://answers.yahoo.com/question/index?qid=20111114122711AAamadw
によると、

> You might want to make sure your time and date of the ipod is set according to your timezone that could be the problem

なるほど。timezone。

エラーの起きてたiPhoneの設定をみてみると、時刻が1970年1月1日になっていました。
しばらく電池切れだったものを、久しぶりに使ったみたので、時刻がリセットされていたようです。

時刻を今の日時に設定しなおすと、無事エラーは出ませんでした。
VeritakのエディタにPeggyProを指定する

メニューの「エディタ」→「エディタ環境設定」を選び、Editor Programの欄に、PeggyProへのフルパス、Argumentには、/L$L $Fをいれる。Argmumentを""で囲むと上手くいかないので注意。最後にEnableにチェックを入れると、エラーのファイル名、行番号からPeggyProを使って該当箇所を開きます。

![スクリーンショット](https://www.evernote.com/shard/s25/sh/f45fbe39-ee45-467a-8cbd-cd0408addfc0/39d712f64abc2fcc5b3f61f2c4c8019d/res/c01f32e4-9927-44d3-84b5-750731882e81/ScreenClip.png?resizeSmall&width=832 "スクリーンショット")
ubuntu 12.04>gitlab 5.0>redmineをnginx+unicornでとりあえず動かすまでのメモ

そろそろタイトルの長さが限界にきている気がします。

[前回](https://github.com/kyanro/gitlabknowledge/blob/5.x/redmine%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%A2.md)の続きになります。

下記およびgitlabの設定を参考にさせてもらいました。
http://www.cocoalife.net/2010/10/post_77.html
http://n.blueblack.net/articles/2012-07-29_01_nginx_unicorn_redmine_02/

設定ファイルさえしっかり書けばそれなりにいけるんじゃないだろうかレベルです。
メモはこちらになります。
[自分の環境用インストールメモ](https://github.com/kyanro/gitlabknowledge/blob/5.x/nginx%2Bunicorn%E3%81%A7redmine%E3%83%A1%E3%83%A2.md)

unicornの設定ファイルの理解がまだまだ怪しいので、今回の設定に必要ないもの、逆に必要なもの等ありましたらぜひ教えて下さい。
remote branchを綺麗にする

github上でbranchを削除すると

git branch -aしても消したはずのbranchは残っている(；´∀｀)

git push origin :hoge などしてももちろん消えるはずがない。

そこで、以下のコマンドを実行すると

```git:git-remote
git remote prune origin
```

消したbranchがいなくなります！
Sublime Textでペインの複製

Sublime Textで編集しているペインの複製方法についてです。

現状のSTにおいて、ペインの分割は縦に1つから4つまで、
横に1つから3つまで、更に4分割する機能が提供されています。
ですが、これらの分割は純粋に編集領域を増やすだけです。

超長文になってしまったコードを編集する際、
上の方にある似たような処理を下でも書こうとすると
上下に移動が大変ですね。
(メソッドで外出ししろとかいうツッコミはいったんなしで)

編集しているペインを複製できれば・・・という要望に応える
プラグインを入れましょう。

[Origami](https://github.com/SublimeText/Origami"Origami")

Origamiを入れた状態で、下記の通りにしてみると
編集中のペインの複製ができます。

まずは、ペインの複製先となる空きペインを作ります。

`View > Origami > Pane > Create > Right`

次にアクティブなペインを複製します。

`View > Origami > File > Clone to > Right`

上記にて、右側にペインの複製ができます。（かんたん！）
複製元のペインで編集を行うと、複製したペイン上でも
編集が即時反映されます。

今回はRightを選びましたが、指定先は下記4つの選択肢があります。

####指定先関係
1.Above:上
2.Below:下
3.Right:右
4.Left:左

また、CreateとClone to以外にも下記のようなことができます。

####Pane関係
1.Create:空ペインの作成
2.Travel to:アクティブペインの移動
3.Destroy:ペインの破棄

####File関係
1.Create to:空ペインの作成(Paneと同じ？)
2.Carry to:アクティブなペインを移動
3.Clone to:アクティブなペインの複製

ペインをCreateすると、無限にペインが開けそうですが、
STで提供されているペインの複製と同じような機能みたいですし、
4つ以上のペインを開いてコーディングはしないと思うので、
これは標準機能でよいかな。
[Titanium] Basic認証

## HTTPClient

HTTPヘッダに入れる
```
	var xhr = Ti.Network.createHTTPClient({});
	xhr.open('POST', url);
	//xhr.setRequestHeader('Authorization', 'Basic ' + Titanium.Utils.base64encode(username + ':' + password));
```

またはurlに入れる
```
http://username:password@host.com/hogehoge
```

## WebView

### iOS

WebView#setBasicAuthentication
が効かない（試したバージョンは3.0.2.GA）
仕方ないのでurlに入れる方法を使う。

### Android

urlに入れる方が効かない。
なのでsetBasicAuthenticationを使う。
[Titanium] UserAgentの変え方

## HTTPClient
```
	var xhr = Ti.Network.createHTTPClient({});
	xhr.open('POST', url);
	xhr.setRequestHeader("User-Agent", userAgent);
```

## WebView

Android は WebView#userAgent で指定できる。
iOSはできないのでmodule使う。
https://github.com/harukazepc/TiWebViewUserAgent/tree/master/iphone
WindowsにGit-flow入れてみようとしたら出たエラーを解決

## なんかエラーになりおるので直して導入

WindowsでGitだと、mySys git + tortoiseGitが導入しやすそうなので、その環境でGit-flowを入れてみました。

Google先生に聞いて最初に下記のサイトが出ますが、

https://gist.github.com/rs324/1292302

これの通りだと、git bashで

```
git flow init
```

してもエラーになります。

なので、git-core.zipの中身のファイル(git-flow～とか)をgit-coreの下ではなく、libexecの下に置くか、

git-flowってファイルの下記の記述を、

```|git-flow
export GITFLOW_DIR=$(dirname "$0")
```

下のように

```|git-flow
export GITFLOW_DIR=$(dirname "$0")
if [ ! -e "${GITFLOW_DIR}/git-flow-init" ]; then
  export GITFLOW_DIR=${GITFLOW_DIR}/git-core
fi
```

と書き換えると動きました。
jQueryとjqMobiでのデータ属性(data-*)を扱う時の違い


jqMobi使い始めたけどjQueryのノリで扱うとハマったのでメモ

前提として以下のHTMLからdata-*属性を取り出すコードを書く。
ライブラリのバージョンはjQuery1.7.2、jqMobi1.2で確認。

```html
<div id="target" data-hoge-fuga="1"></div>
```

##生JSの場合

まず生JSの場合は以下のとおり

###get

属性名を指定して取得するか、datasetから取得する２つの方法がある。

```javascript
var e = document.getElementById('target');
e.getAttribute('data-hoge-fuga') // => "1"
e.dataset.hogeFuga; // => "1"
```

###set

取得と同様に２つの方法で格納できるが、htmlに反映されると値は**すべて文字列になる**。

```javascript
var e = document.getElementById('target');
e.setAttribute('data-hoge-fuga', 1)
e.dataset.hogeFuga = 1; 
```

##jQueryの場合

###get

`attr()`で取得すると文字列として取得されるが、`data()`から取得すると**値に応じた型で返ってくる**(数字であればnumber,"true"とかだとboolにキャストされてる)

```javascript
$('#target').attr('data-hoge-fuga'); // => "1"
$('#target').data('hogeFuga'); // => 1
$('#target').data('hoge-fuga'); // => 1
```

###set

取得する際のメソッドの第２引数を与えると格納される。

```javascript
$('#target').attr('data-hoge-fuga', 2); //HTMLに反映される
$('#target').data('hogeFuga', 2); //HTMLに反映されない
$('#target').data('hoge-fuga', 2); //HTMLに反映されない
```

ただし`attr()`以外はHTMLに反映されない。
jQueryではdata-*属性の値をキャッシュされる仕様で、仮に`attr()`で値をHTMLに反映させてもキャッシュされた値は変更されない。

```javascript
$('#target').data('hogeFuga'); // => 1
//data()で格納
$('#target').data('hogeFuga', 2);
//data()で取得すると値は変更されている
$('#target').data('hogeFuga');  // => 2
//attr()から取得すると最初の値でHTMLも変更されない
$('#target').attr('data-hoge-fuga'); // => 1
//attr()でHTML中の値を変更 
$('#target').attr('data-hoge-fuga', 2);
//HTMLの値が変更されてもキャッシュされた値は変わらない
$('#target').data('hogeFuga'); // => 1 
```


##jqMobiの場合

###get

**jqMobiからはキャメルケースで利用できない**。内部では`dataset`から取り出すわけではなく、`function(a,b){return this.attr('data-' + a, c)}`というように`attr()`を介しているので、単純に属性名から'data-'を取り除いた文字列だけで利用しなければならない。またjqueryのようにキャストされることはなく**返り値はすべて文字列になる**。

```javascript
$('#target').data('hoge-fuga'); // => "1"
```

###set

第2引数を与えると格納できる。キャッシュもされずHTMLに反映される。

```javascript
$('#target').data('hoge-fuga', 1);
```


----

##まとめ
jQueryでdata-属性を利用する場合、jQueryでオブジェクトがキャッシュされることを念頭に置く必要がある。

jqMobiから利用する場合、HTML5の仕様上はdata-*属性を取り出す際はキャメルケースに変換されたキーで取り出すのが正しいがjqMobiはそのままの形をキーとして利用しなければならない。
Dispatch queueの実行は中止できない

GCDのdispatch queueはdispatch_async()などで並列処理を登録できるが、一度登録した処理を破棄することはできない。
dispatch_suspend()を使うと実行を一時的に中止できるが、これはdispatch_resume()とセットで使わなければならず、queue自体をずっと停止しておけるわけではない。

このようなときは、GCDの関数ではなく、Cocoaの[NSOperationQueue](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html)を使うと解決できる。NSOperationQueueにはcancelAllOperationsを始め、いくつかの便利なメソッドが用意してあるので、Cocoaを使っているときは無理にGCDの関数を使うよりこちらを使った方が良いかもしれない。
現在のコントローラ、アクション、パラメータ

URL 同様、現在実行しているコントローラ、アクションも play.mvc.Http.Request から取得することができます。

```java
String controller = Request.current().controllerClass.getName();
String action = Request.current().invokedMethod.getName();
```

また、アクションに引き渡されたパラメータは play.mvc.Scope.Params から取得することができます。

```java
Map<String, String> params = Params.current().allSimple();
```

これを組み合わせて `@Before` でログを出力してみました。

```java

@Before(priority = 0)
public static void before() {

    Request request = Request.current();

    Class controller = request.controllerClass;
    Method action = request.invokedMethod;

    List<String> types = new ArrayList<String>();
    for (Class c : action.getParameterTypes()) {
        types.add(c.getName());
    }

    List<String> values = new ArrayList<String>();
    Map<String, String> params = Params.current().allSimple();
    for (String key : params.keySet()) {
        if ("body".equals(key)) {
            continue;
        }
        values.add(String.format("%s=%s", key, params.get(key)));
    }

    String c = controller.getName();
    String a = action.getName();
    String t = StringUtils.join(types, ", ");
    String v = StringUtils.join(values, ", ");

    Logger.debug("BEFORE: %s.%s(%s)[%s]", c, a, t, v);
}
```
text-objects のクォート aquote/iquote は、カーソルが行の最初のクォートの外にいた場合に、最初のクォートをさがします。

この挙動を今まで気付かずに使っていたのでメモです。

例えば、(`*` がカーソルの位置で、`^^^` が選択された範囲を示します)

~~~~ {vim.vim}
:*echo "Hello world!"
~~~~

の時に、vi" とやると、

~~~~ {vim.vim}
:echo "Hello world!"
       ^^^^^^^^^^^^
~~~~

が選択されます。 今まで完全にクォートの中からしか使ってこなかった…

evil.el だと、クォートの外にいた場合には次のクォートをさがすみたい。
scalaで正規表現にマッチするかを調べる


``` regex.scala

val target = "abc"
val passwordRegex = """[a-zA-Z0-9]+""".r;

isValidated:Boolean = target match  {
  case passwordRegex() => true
  case _ => false
  }
)
```

passwordRegexのあとに( )がないと、この場合ではなんでもtrueになってしまう。
Amazon Glacier CLI（Python）のインストール

Amazon Glacierのコマンドラインインターフェースのインストールをする。

本体はここ。
https://github.com/uskudnik/amazon-glacier-cmd-interface

基本sudoで操作した（もっとキッチリできるのかも知れぬが…）。

```sh
$ git clone https://github.com/uskudnik/amazon-glacier-cmd-interface.git
$ cd amazon-glacier-cmd-interface
$ python setup.py install

Traceback (most recent call last):
  File "setup.py", line 4, in <module>
    from setuptools import setup
ImportError: No module named setuptools
```

setuptoolsが必要らしい。

http://d.hatena.ne.jp/torutk/20080614/p1
を参考にして（多謝）、

```sh
$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ python ez_setup.py 

Downloading http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg
Processing setuptools-0.6c11-py2.6.egg
Copying setuptools-0.6c11-py2.6.egg to /usr/local/lib/python2.6/dist-packages
Adding setuptools 0.6c11 to easy-install.pth file
Installing easy_install script to /usr/local/bin
Installing easy_install-2.6 script to /usr/local/bin

Installed /usr/local/lib/python2.6/dist-packages/setuptools-0.6c11-py2.6.egg
Processing dependencies for setuptools==0.6c11
Finished processing dependencies for setuptools==0.6c11
```

改めて

```sh
$ cd amazon-glacier-cmd-interface
$ python setup.py install
```

イロイロ入るようだが、暫く待てばインストール完了

```sh
$ glacier-cmd
usage: glacier-cmd [-h] [-c FILE] [--logtostdout] --aws-access-key
                   AWS_ACCESS_KEY --aws-secret-key AWS_SECRET_KEY --region
                   REGION [--bookkeeping] [--no-bookkeeping]
                   [--bookkeeping-domain-name BOOKKEEPING_DOMAIN_NAME]
                   [--logfile LOGFILE]
                   [--loglevel {-1,DEBUG,0,INFO,1,WARNING,2,ERROR,3,CRITICAL}]
                   [--output {print,csv,json}]
                   [--sdb-access-key SDB_ACCESS_KEY]
                   [--sdb-secret-key SDB_SECRET_KEY] [--sdb-region SDB_REGION]
                   
                   {listjobs,treehash,lsvault,mkvault,search,rmarchive,getarchive,upload,listmultiparts,describevault,inventory,rmvault,download,abortmultipart,describejob,sns}
                   ...
glacier-cmd: error: too few arguments
```

設定があるようだが、それはまた今度書く。
MySQL の LOAD DATA で関数や計算式をかます

```console
$ cat data.txt
1	a
2	b
3	c
```


```mysql
CREATE TABLE xx
(
  id INT NOT NULL PRIMARY KEY,
  ss VARCHAR (255) NOT NULL
);

LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE xx (@id, @ss)
  SET id = @id * 2, ss = UPPER(@ss);

SELECT * FROM xx;
/*
+------+------+
| id   | ss   |
+------+------+
|    2 | A    |
|    4 | B    |
|    6 | C    |
+------+------+
*/
```
障害対応の極意


## 焦らない

焦ってもいらないミスをするだけです。一度コーヒーでも淹れて落ち着きます。10分程度遅れても誰も文句はいいません。


## 現象を正確に把握する

発生している現象を可能な限り正確に把握しましょう。
この把握している内容が間違っていると余計に時間がかかります。

A4用紙に簡易な図を書いて大枠を把握します。


## 資料を用意する

問題が発生しているシステムのネットワーク構成図や、システムの仕様書など、あらゆる資料を用意します。

## 障害原因の仮説を立てる

なぜその障害が発生しているのか、書き出します。
一番可能性が高いと考えられる仮説から順に番号を振ります。

闇雲に多く書き出せばよいというわけではないので、3つ程度にします。


## 仮説にもとづいて現象を確認する

仮説にもとづき障害原因を特定します。

障害原因が特定したら、要因を書き出します。


## 対応計画を立てる

要因を取り除くために何をすべきかを書き出します。

対応計画にを全て書き出したら、それを上から実施します。

全て実施しても、障害が回復しない場合は、次の仮説に移り同じ事を繰り返します。

全ての仮説が間違っていた場合は、別の視点から考え仮説を考え直します。


## 時系列で記録する

障害が発生した日時、確認者など、あらゆる情報を時系列で記録します。用意しているA4の紙に書き出します。


## 振り返る

障害対応が終わっても、一息ついたら発生した現象を振り返ります。

今後どのような対策をしたら、その原因が元になる障害が二度と発生しないための仕組みを考えます。

同様な問題もこの時に考えておきます。


## 情報を共有する

障害によって得られた情報を、関係者に情報共有して今後の運用に役立てます。

失敗知識データベースを構築して、検索できるようにしていればベストです。
MySQL のクエリログを見やすくするワンライナー

MySQL のクエリログ (general_log) から SQL の改行を除去して連続する空白要素を半角空白にして見やすくします。

```perl
$|=1;
s/[\r\n]+$/ /;
s/^\d+\s+\S+\s+/\t\t/;
s/^\t\t(\d+)/\n$1/;
s/ +/ /
```

ワンライナーにするとこんな感じ。

```bash
tail -f query.log | perl -pe '$|=1;s/[\r\n]+$/ /;s/^\d+\s+\S+\s+/\t\t/;s/^\t\t(\d+)/\n$1/;s/ +/ /'
```
### 追記

日時を各行に付けるようにした。

```perl
$|=1;
s/[\r\n]+$/ /;

if(/^(\d+\s+\S+)\t\d+/)
{
    $d=$1;
    print "\n";
}
elsif(/^\t\t\d+/)
{
    print "\n$d";
}

s/\s+/ /;
```

```bash
tail -f query.log | perl -pe '$|=1;s/[\r\n]+$/ /;if(/^(\d+\s+\S+)\t\d+/){$d=$1;print "\n"}elsif(/^\t\t\d+/){print "\n$d"}s/\s+/ /'
```
AFNetworkingの"SystemConfiguration framework not found in project, or not included in precompiled header." 警告の意味

AFNetworkingをプロジェクトに含めると以下のようなコンパイラwarnningがでる時がある。

```
SystemConfiguration framework not found in project, or not included in precompiled header. Network reachability functionality will not be available.
MobileCoreServices framework not found in project, or not included in precompiled header. Automatic MIME type detection when uploading files in multipart requests will not be available.
```

SystemConfiguration.framework、MobileCoreServices.framework のヘッダ読み込みフラグが検知できないときに発生するんだけど、AFNetworkingはこれらのフレームワークがなくても利用はできる。

その場合、上記警告のようにネットワーク検知機能とファイルアップロード時の自動MIME-Type検知機能がコンパイル時に取り除かれた状態になる。

例えばネットワーク検知機能でいうと以下のインターフェイスが使えなくなる

```objc
@property (readonly, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus;
- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block;

// NSNotification用
extern NSString * const AFNetworkingReachabilityDidChangeNotification;
extern NSString * const AFNetworkingReachabilityNotificationStatusItem;
```

警告を出なくする
--------------------

プリコンパイルヘッダ(MyAPP-Prefix.pch)に以下を追加する。

```diff
 #ifdef __OBJC__
   #import <UIKit/UIKit.h>
   #import <Foundation/Foundation.h>
+  #import <SystemConfiguration/SystemConfiguration.h>
+  #import <MobileCoreServices/MobileCoreServices.h>
 #endif
```

参考
-----

ってFAQにのってた

- https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ
RoundRectのUITextFieldで高さと文字位置を調整する

以下はAutoLayoutを使用していない時を仮定しています。

UITextFieldはnibファイル上でボーダータイプがRoundRectだとフォントサイズ指定以外に高さ調整ができないのですが、以下の方法で可能です。

0 UITextFieldのサブクラスで以下を上書きし文字位置を調整する
textRectForBounds:
editingRectForBounds: 
1 IBから読み込まれたらサブクラス内等でボーダータイプをRoundRectに設定する。

IB上ではUITextFieldの代わりに先ほどのサブクラスを使い、ボーダータイプをRoundRect以外に設定しておくと高さの調整ができます。


参考URL
http://stackoverflow.com/questions/2694411/text-inset-for-uitextfield
merge commitをcherry-pickする

# 背景
forkして開発したX-Yなcommitを本流にmergeしてもらった時

```
      X-Y
     /   \
...-A-B-C-D-...
```

こんな感じになる。
ここのX-Yの一連のcommitをcherry-pickしたい時、

```
git cherry-pick X Y
```

すればいい話ではあるけれど、forkした後の開発が長かったりするとめんどくさいし、merge自体をごそっとcherry-pick出来ないものか。

# 出来ます

```
git cherry-pick -m 1 D
```

これでおｋ

# ちなみに
```
git cherry-pick -m 2 D
```

すると、forkして開発していた間に進んだ本流のcommit分をcherry-pick出来る。
つまり、

```
git cherry-pick B C
```

と同等の変更が出来る。

# 参考
* http://ongaeshi.hatenablog.com/entry/20100404/1270374998

revertも同じみたい

* http://qiita.com/items/41b724a1c3569044372c
シェルスクリプトで、ある順番以降の引数を取得する

……の前に、前提から。

## 特定の順番にある引数を取得する

`${n}`を使います。

```test.sh
#!/bin/sh

echo $0
echo $1
echo $2
```

実行結果:

```
$ ./test.sh foo bar baz
./test.sh
foo
bar
```

`$0`がプログラム名になる。上記の場合、`baz`は`$3`なので出力されない。

## 引数を全部取得する

`$@`を使います。

```test.sh
#!/bin/sh

echo $@
```

実行結果:

```
$ ./test.sh foo bar baz
foo bar baz
```

## ある順番のもの以降を全部取得する

これが本題です。たとえば、引数の3番目以降を全部取得したい場合。

```test.sh
#!/bin/sh

echo ${@:3:($#-2)}
```

実行結果:

```
$ ./test.sh 1 2 3 4 5
3 4 5
```

`$#`には、引数の数が格納されています。なので、この場合は3番目以降の全部なので、全体の数から、いらない2つを引いているわけです。

てか、↑をやんなくても、3番目以降「全部」なら`${@:3}`でもよかった。つまり、開始の順番だけでよい。3番〜5番目とかなら「3番目以降の3つ」という意味で` ${@:3:3}`と書く必要がある。

応用例として、2個の引数のあと、`--`以降にオプションとして解釈されたくない文字列がある場合、以下のように書けます。

```test.sh
#!/bin/sh

echo $1
echo $2
echo ${@:4:($#-2)}
```

実行結果:

```
$ ./test.sh hoge fuga -- --foo bar --baz qux
hoge
fuga
--foo bar --baz qux
```

## 参考文献

http://stackoverflow.com/questions/1335815/how-to-slice-an-array-in-bash/1336245

## 補足

[デフォルトのshがdashになっているUbuntu](https://wiki.ubuntu.com/DashAsBinSh)等は、解釈プログラムにbash等を指定する。

```bash
#!/bin/bash
```
Objective-C で継承可能な Singleton Class を作る


Objective-C でシングルトンクラスを作るのはよくやることかと思います。よくやる手段としては、以下のような方法ですね。


```objective-c:Singleton.m
@implementation Singleton

+ (Singleton*)sharedInstance {
    static Singleton* _instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[Singleton alloc]
                           initSharedInstance];
    });
    return _instance;
}

- (id)initSharedInstance {
    self = [super init];
    if (self) {
        // do something
    }
    return self;
}

- (id)init {
    [self doesNotRecognizeSelector:_cmd]; // init を直接呼ぼうとしたらエラーを発生させる
    return nil;
}
@end
```

dispatch_once は、このブロック内の処理はアプリケーションのライフサイクルの中で一度しか呼ばれないというものです。
大抵の場合これで間に合うのですが、継承したクラスを作ろうとした場合にはうまく動きません。たとえば

```objective-c:SingletonA.h
@interface SingletonA : Singleton
-(void)printA;
@end
```

```objective-c:SingletonB.h
@interface SingletonB : Singleton
-(void)printB;
@end
```

というクラスを作った場合、以下のコードは、エラーになってしまいます。

```objective-c
SingletonA *s1 = [SingletonA sharedInstance];
[s1 printA]; // 'NSInvalidArgumentException', reason: '-[Singleton printA]: unrecognized selector sent to instance が発生
```

[SingletonA sharedInstance] が、SingletonA ではなくSingleton クラスのインスタンスを返してしまうからですね。
また、複数のクラスがこの Singleton クラスを継承する可能性があるため、継承元のオブジェクト側でも、それぞれのクラスインスタンスを保持できるようにしなくてはいけません。以下のようにすることで実装ができました。

```objective-c:Singleton.m
@implementation Singleton
static NSMutableDictionary *_instances;

+ (id) sharedInstance {
    __block Singleton *obj;
    @synchronized(self) {
        if ([_instances objectForKey:NSStringFromClass(self)] == nil) {
            obj = [[self alloc] initSharedInstance];
        }
    }
    obj = [_instances objectForKey:NSStringFromClass(self)];
    return obj;
}

+ (id)allocWithZone:(NSZone *)zone {
	@synchronized(self) {
		if ([_instances objectForKey:NSStringFromClass(self)] == nil) {
			id instance = [super allocWithZone:zone];
			if (_instances == nil) {
				_instances = [[NSMutableDictionary alloc] initWithCapacity:0];
			}
			[_instances setObject:instance forKey:NSStringFromClass(self)];
			return instance;
		}
	}
	return nil;
}
- (id)initSharedInstance {
    self = [super init];
    if (self) {
        // do something
    }
    return self;
}

- (id)init {
    [self doesNotRecognizeSelector:_cmd]; // init を直接呼ぼうとしたらエラーを発生させる
    return nil;
}


- (void)print{
    NSLog(@"hoge");
}

@end
```

static な NSDictionary 、 _instances にクラス名をキーにしてインスタンスを保存しておき、それを返しているわけですね。

これで、以下の様なコードも問題なく動作します。

```objective-c
SingletonA *s1 = [SingletonA sharedInstance];
[s1 printA];
SingletonB *s2 = [SingletonB sharedInstance];
[s2 printB];
```
unsetの-fと-v、もしくは関数と変数の名前空間について

Bashスクリプトで変数を削除するときに`unset`を使いますが、これは関数定義の削除にも使えます。`-f`と`-v`オプションは関数と変数のどっちを削除したいかを明確にするオプションです。

### Bashにおける関数と変数の名前空間
は、分かれています。なので以下のように同名の関数と変数を作っても区別して使えます。

```sh
f() { echo func; }
f=valiable
f        # func が表示される
echo $f  # valiable が表示される
```

### unsetで削除されるのは？
`unset`は変数も関数も削除できます。では同名の関数と変数があった場合はどうなるんでしょう？

```sh
f() { echo func; }
f=valiable

unset f  # オプション無しでunset
f        # func が表示される　…関数は残ってる
echo $f  # (空)　…変数だけ削除された！

unset f  # もう1回unsetしてみる
f        # -bash: f: command not found　…関数も削除された！
echo $f  # (空)
```

というわけで同名の関数と変数がある場合は変数だけが削除されて、同名の変数が無ければ関数が削除されます。

### 関数または変数を狙って消すには？
そこで登場するのが`-f`と`-v`です。`-f`は関数のみを消すオプションで、`-v`は変数のみを消すオプションです。

```sh
f() { echo func; }
f=valiable
unset -f f  # 関数を消す！
f           # -bash: f: command not found　…関数が消えた！
echo $f     # valiableが表示される …変数は残ってる！

f() { echo func; }
f=valiable
unset -v f  # 変数を消す！
f           # funcが表示される　…関数は残ってる
echo $f     # (空)              …変数が消えた

f() { echo func; }
f=valiable
unset -fv f
# -bash: unset: cannot simultaneously unset a function and a variable
# 一緒に消すことは出来ないみたいです

usnet -f f; unset -v f # 改めて両方消します
# この状態で更にunsetしても特にエラーは出ません
unset -f f; echo $?  # 0
unset -v f; echo $?  # 0
unset f   ; echo $?  # 0
```

## まとめ
- bashにおける関数と変数の名前空間は別である
- オプション無しで`unset`するとその時の状態により関数が消えたり変数が消えたりする
- 自分が何を消したいのかをハッキリさせるには`unset`に`-f`や`-v`を付けるべし（潔癖症）
- そもそも関数と変数に同じ名前を使わない方が良いｗ（普通の人）
CSSで紙（ノート？）風の見た目

![ノートというか紙を重ねた感じ](https://dl.dropbox.com/u/7605502/Qiita/NoteSample.PNG)

前回の[CSSでリボン](http://qiita.com/items/e124bd98cb05cbaca1c3)が意外とストックされたので。
原理は前回と同じですが、こんなこともできますよという例。

今回は単色にしていますが、実際には[このあたり](http://subtlepatterns.com/)から木目背景や紙のような背景を頂いて組み合わせたほうがそれっぽくなります。

```html:note.html
<section>
    <h2>紙のような見た目にしてみましょう。</h2>
    <p>
        紙のような見た目に挑戦してみましょう。
        before 擬似要素と after 擬似要素を使うことで紙が重なっているような効果を出すことができます。
        CSS3 のドロップシャドウを使えば画像も最低限で済みますね。
    </p>
    <p>
        それにしてもサンプルとして書くことがあまりないですね。
        こういうとき、どういう文章にしたら良いのでしょう。
    </p>
</section>
```

```css:note.css
body
{
    background: #FFE0B0;
}

section,
section:before,
section:after
{
    padding: 1em;
    background: white;
    box-shadow: 0 0 2px black;
    width: 30em;
    height: 16em;
}

section
{
    position: relative;
    z-index: auto;
}

    section:before,
    section:after
    {
        content: "";
        position: absolute;
    }

    section:before
    {
        left: 3px;
        top: 3px;
        z-index: -1;
    }

    section:after
    {
        left: 6px;
        top: 6px;
        z-index: -2;
    }
```