OmniAICreator/Qiita-1.07M huggingface dataset:
最近PDOを使っていてハマったこと2つ。

nicosearch っていうニコニコ大百科のデータをもとにニコニコ動画の検索欄とかありとあらゆる場所にサジェストを提供するサービスを共同で制作していて、僕はサーバサイドのスクリプト担当なんだけど、ニコニコ大百科のデータを収集するために定期的に大百科をスクレイピングしてデータをMySQLに突っ込む必要があって、そのクローラをPHPで書いていた。長時間（1週間とか、あるいは延々と）走らせ続けないと発生しない問題もあるので、あまりこういうことで困ることは少ないような気がします。
（そもそもそれPHPでやることじゃないのでは、と思った人はごもっともです。）

## 1. MySQLのwait_timeoutでコネクションが閉じちゃう
コネクションを張ってからの累計アイドル時間がwait_timeoutで設定した秒数に達するとコネクションが閉じられてしまう。これはソフトウェアが異常終了してコネクションが正しく閉じられなかった時とかの対策のために存在する。
最初wait_timeoutはアイドル時間だと思っていたんだけど、実は"累計"だったことが判明。nicosearchの環境では60秒とかなり短めに設定してあったので、割とすぐに（と言っても発現するのは6時間~3日くらい経ってから）発現した。これ1時間とかだったら原因の特定はまず無理だったと思う。多分1周間に一度、ヘタしたら1ヶ月に1度、そういうレベルになってただろうから（；＾ω＾）
同時にPDOの良くないところは、原因がなんだろうが、PDOはクエリの実行が失敗するとfalseを返してそれだけっていうところです。
で、原因を調べるためには、実行したあとにわざわざPDOStatement::errorInfo()っていうメソッドにアクセスしないといけない。
例外投げてよって話だよね。

```php
$result = $stmt->execute();
var_dump($result); //=>string(5) false (例外投げてよね）
```

## 2.PDOのbindParam()でバインドした変数の型が文字列になる
PDOはプリペアドステートメントとプレースホルダがお決まりなんだけど、プレースホルダに値をバインドする方法はいくつかあって、実行時にexecute(array('hoge'))みたいな感じで値を渡してバインドしたり、bindParam()やbindValue()で実行する前に値をバインドする方法がある。
bindParam()は実は、実際に値を評価するのはexecute()の時。だから未定義の変数を使ったりできる。（でも、その場ではバインドしないから整数やリテラルは使えない。）
で、PDOの解説をしてる記事はやたらめったらbindParam()を使ってるんだけど、bindParam()にはちょっとアレなところがあって、execute()時に評価するために内部で参照として持ってて、どうも評価時、プレースホルダにバインドする処理を通すことで評価した変数の型がすべて文字列型になってしまうという副作用があるみたい。

```php
$stmt->bindParam(1, $int, PDO::PARAM_INT);
var_dump($int); //=> int(10)
$stmt->execute();
var_dump($int); //=> string(2) "10" ←文字列になってる！
```

PHPのリファレンスのユーザノートにも、「おいこんな挙動になるぞ」っていう報告がありました。
ですが「bindValue()とbindParam()の違い」とかいうタイトルの記事には以外にもこういう解説がされていることは少ないです。ループの中でbindParam()をしている場合、2回目からクエリが失敗する、という不可解な問題に悩まされると思います。

```php
$stmt = $pdo->prepare('SELECT * FROM hoge WHERE 1 LIMIT ? ,30');
//一度目のexecute()で$intが文字列型になるので、2度めから動かなくなる
for($i = 0; $i < 10; $i++) {
    $stmt->bindParam(1, $int, PDO::PARAM_INT);
    $stmt->execute();
}
```

僕がハマった2つのポイントは、場合によっては全く出くわさない可能性があります。
1つ目は長時間走らせないと出てこない。
2つ目も、MySQLはSELECTやUPDATE句で整数型を文字列としてプレースホルダにバインド('10'みたいに)しても一応動くので、LIMIT句とか整数をエスケープしちゃうと動かなくなっちゃうような場合にのみ発生するなど、かなり限定的。（それに、ループの中でbindParam()とかしている状況じゃないと、気づかないかも。）
NSLocaleIdentifier とカレンダーの暦設定

NSLocale を使うと iOS 端末の書式（地域）設定、よくある ja_JP とかの ISO_639 のやつを取得できる。

```objectivec
NSString *localeID = [[NSLocale currentLocale] objectForKey:NSLocaleIdentifier];
```

カレンダーが「西暦」で各書式設定を取得：
- `ja_JP` （日本、西暦）
- `en_US` （アメリカ合衆国、西暦）
- `ru_UA` （ウクライナ、西暦）
- `zh_TW` （台湾、西暦）

「和暦」だとこうなる：
- `ja_JP@calendar=japanese` （日本、和暦）
- `en_US@calendar=japanese` （アメリカ合衆国、和暦）
- 略

「タイ仏暦」だとこうなる：
- `ja_JP@calendar=buddhist` （日本、タイ仏暦）
- `en_US@calendar=buddhist` （アメリカ合衆国、タイ仏暦）
- 略

西暦の場合はデフォルトということなのか、"@calendar=gregorian" とはならない。

他にも通貨だったりいろいろ拡張記法があるらしい。
http://userguide.icu-project.org/locale
ELBにSSLを設定してみる

#GlobalSignさんで取得したSSL証明書をAWSのELBに設定してみました。

GlobalSignさんの申し込みフォームから最短2分！のクイック認証SSLを申し込みます。
申請完了後、管理画面GSパネルより「PKCS#12」ファイルをダウンロード。
ローカルで、以下コマンドによる鍵ファイルへの変換対応。

```cmd:local.command
openssl pkcs12 -in XXXXXXXXXXX.pfx -nocerts -nodes -out server.key
openssl pkcs12 -in XXXXXXXXXXX.pfx -clcerts -nodes -out server.crt
openssl pkcs12 -in XXXXXXXXXXX.pfx -cacerts -nokeys -out server.ca-bundle
※パスフレーズは「申請時に登録した文字列」 + 「GlobalSignさんで発行された文字列」
```

鍵ファイルの生成が終わったら、AWS consoleの Load Blancersより、対象のロードバランサーを選択して、プロトコル443を追加します。
追加の際、SSL Certificateにアップロードリンクが出るので、そこからkeyファイルをペタペタ貼り付けてあげて、ハイ、完了！

と、思ったら、Invalid Private Key ってエラーが出やがりました。

AWSでは、PrivateKeyはパスフレーズが付いたままだと通らないみたいです。
※似たような事象でこちらも参考
http://norinoritakanori.blog90.fc2.com/blog-entry-230.html 

ということで、パスフレーズをとっぱらってやりました。

```cmd:local.command2
openssl rsa -in server.key -out server_nopass.key
```

リトライして無事証明書の設定ができました。

Invalid Public Key Certificate ってエラーも出たのでメモ。
中間証明書のコピーする箇所を誤っていた場合に出ました。

```
subject=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2
issuer=/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
```

これ以降のCERTIFICATE部分が該当箇所でした。


#まとめ。
AWS ELBの設定欄にぶっこむもの

- Certificate Name
GlobalSign_xxxxx.com 的な名前で管理してます。

- Private Key
server_nopass.key ファイルの内容をこぴぺ。
-----BEGIN RSA PRIVATE KEY-----
から
-----END RSA PRIVATE KEY-----
まで全て。

- Public Key Certificate
server.crtファイルの半分より下をこぴぺ。
-----BEGIN CERTIFICATE-----
から
-----END CERTIFICATE-----
まですべて

- Certificate Chain
server.ca-bundleファイルの1個目の
-----BEGIN CERTIFICATE-----
から
-----END CERTIFICATE-----
まですべてをコピペ。
CompassでTwitter Bootstrapの見た目をカスタマイズ


[Twitter Bootstrap](http://twitter.github.com/bootstrap/index.html)をダウンロードして使っていたけどやっぱりカスタマイズしたくなった。それもCompass使ってSassで管理したい。


## 前提

* [Compass](http://compass-style.org/)使うのでRubyが必要 (Rubyのセットアップは割愛)
* 使うアプリケーションのフレームワークに依存せず単独で使う(Ruby以外のプロジェクトでも使う)
* カスタマイズはcssのみ、javascriptは対象外

## Sass版を探す

[github.com/twitter/bootstrap](https://github.com/twitter/bootstrap)はLessファイルで公開されているのでSassにしてくれてる人を探す。

[Compass or Twitter Bootstrap? Why Not Both](http://tatiyants.com/compass-or-twitter-bootstrap-why-not-both/)より

* https://github.com/thomas-mcdonald/bootstrap-sass
* https://github.com/jlong/sass-twitter-bootstrap

を知る。他にもありそうだけどとりあえず☆の多いマクドナルドさんの方（以後bootstrap-sassと表記)を使う。

## 環境セットアップ

Compassとbootstrap-sassをインストールする。

```bash
gem install compass
gem install bootstrap-sass
```

rbenvを使っている場合はcompassコマンドを使うために```rbenv rehash```しておく

## Compassプロジェクトのセットアップ

ディレクトリをTwittter Bootstrapのビルドに合わせる。以下の例はカレントディレクトリに作成する例。

```bash
compass create . -r bootstrap-sass --using bootstrap --css-dir css --images-dir img --javascripts-dir js
```

Compass作成済みのプロジェクトに追加する場合、以下のコマンドで追加することもできる。

```bash
compass install bootstrap
```

--sass-dirも指定できるのでプロジェクトファイルと出力ファイルを分けることも可能。例えば以下のような感じ。

```bash
mkdir sass
cd sass
compass create . -r bootstrap-sass --using bootstrap --sass-dir . --css-dir ../web/css --images-dir ../web/img --javascripts-dir ../web/js
```

デフォルトだと\*-dirの値が使われるのでconfig.rb内でhttp_\*_pathを指定しておく。

```ruby:config.rb
http_stylesheets_path = "/css"
http_images_path = "/img"
http_javascripts_path = "/js"
```

## Twitter Bootstrapのカスタマイズ

bootstrap-sassでは変数が http://getbootstrap.com/2.3.2/customize.html#variables と同じ名前で定義されている。ありがたい。従って、例えば背景を黒にするにはbodyBackground変数を使って以下のように書ける。

```sass:styles.sass
$bodyBackground: black;
@import "bootstrap";
```

( v3から変数名のコーディングルールが変わっているので注意。``$bodyBackground`` → ``$body-bg`` など )

## ブラウザから確認

```compass watch```でプロジェクトのディレクトリを指定すればsassファイルの変更を監視してcssファイルを作成してくれる。

```bash
compass watch <dir>
```

bootstrap-sassのデフォルトでは *styles.css* が出力ファイルになるのでそれをhtml側で指定すればいい。

## Javascript

Compass単体だとどうにもならないのでとりあえず[Twitter Bootstrap](http://twitter.github.com/bootstrap/index.html)ビルド済みのbootstrap.min.jsをそのまま使っている。

bowerでインストールして、Sprocketsをコマンドラインで叩くことを模索中。
Array.sortメソッドを使って配列をシャッフルする


```javascript
var shuffle = function() {return Math.random()-.5};
var data = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]

data.sort(shuffle) //-> ["G","Z","P","E","W","C","L","O","R","J","X","S","V","A","D","I","U","T","F","Q","H","B","Y","M","K","N"]
data.sort(shuffle) //-> ["E","H","X","P","B","S","L","F","D","O","W","V","U","N","A","M","Z","C","G","Q","I","J","K","Y","T","R"]
```
 [example](http://jsdo.it/_shimizu/tS6j)
Mercurial の便利な Extention を利用する。 その１


Mercurial はシンプルな作りになっています。 
Git のように最初からいろいろとできません。
しかし、 Extention を利用することで、 hg コマンドを便利に利用できます。

### Extenton の使い方

Mercurial の Extention は、 hgrc で管理します。
利用したい Extention を [extentions] セクションで記述します。

例)

```
[extentions]
color =
graphlog =
```

### hg コマンドの結果に色を付ける

```.hgrc
[extentions]
color =
```

### ASCII アートのリビジョングラフと履歴を並べて表示する

**2013-03-19 17:00追記**
**version 2.3 以降は、標準に取り込まれているので不要でした。**


```.hgrc
[extentions]
graphlog =
```

hg log を表示する際に、 ASCII アートのリビジョングラフを表示できるようになります。

```
$ hg log -G -l4
@    changeset:   4061:8ec0b3a74e79
|\   tag:         tip
| |  parent:      4060:b5fb711e85b9
| |  parent:      4059:0ae9f691fac2
| |  user:        shimizukawa <shimizukawa@gmail.com>
| |  date:        Sun Mar 17 10:58:28 2013 +0900
| |  summary:     merge heads
| |
| o  changeset:   4060:b5fb711e85b9
| |  parent:      4053:33577a5ee841
| |  user:        shimizukawa <shimizukawa@gmail.com>
| |  date:        Sun Mar 10 22:07:31 2013 +0900
| |  summary:     Add i18n capabilities for custom templates.
| |
o |  changeset:   4059:0ae9f691fac2
| |  user:        shimizukawa <shimizukawa@gmail.com>
| |  date:        Sun Mar 17 10:55:50 2013 +0900
| |  summary:     update CHANGES
| |
o |    changeset:   4058:bf8c420b9c9f
|\ \   parent:      4054:e5c218f45ec7
| | |  parent:      4057:fc66da28da18
| | |  user:        Takayuki Shimizukawa <shimizukawa+bitbucket@gmail.com>
| | |  date:        Sun Mar 17 10:50:28 2013 +0900
| | |  summary:     Merged in knzm/sphinx-fix-versionchange-fork (pull request #124)
| | |
```

style オプションで表示をコンパクトにできます。

```
$ hg log -G --style=compact -l4
@    4061[tip]:4060,4059   8ec0b3a74e79   2013-03-17 10:58 +0900   shimizukawa
|\     merge heads
| |
| o  4060:4053   b5fb711e85b9   2013-03-10 22:07 +0900   shimizukawa
| |    Add i18n capabilities for custom templates.
| |
o |  4059   0ae9f691fac2   2013-03-17 10:55 +0900   shimizukawa
| |    update CHANGES
| |
o |    4058:4054,4057   bf8c420b9c9f   2013-03-17 10:50 +0900   shimizukawa+bitbucket
|\ \     Merged in knzm/sphinx-fix-versionchange-fork (pull request #124)
| | |
```
Fabricタスクの途中で実行ユーザーを切り替えたいときはsettingsコンテキストマネージャ


# 一つのタスクの中で実行ユーザーを切り替えたい

fabric.api.settingsというコンテキストマネージャを使うと所定のタスクの途中で実行ユーザーを切り替えながら作業ができる。

例えば、

1. githubからpull -- wwwユーザーで作業
2. nginx, supervisord再起動 -- adminユーザーで作業

このようなタスクを作りたいときは以下のコードを書けば良い。


```python:operationwithswitchinguser.py
from fabric.api as fb
import cuisine as cs


def refresh(branch="origin/master", restart="yes"):
    with fb.settings(
        cs.mode_user(),
        user="www",
        secretkey="./fixtures/id_rsa",
    ):
        with fb.cd("/home/www/repo"):
            cs.run("git fetch")
            cs.run("git checkout %s" % branch)

    if restart == "yes":
        with fb.settings(
            cs.mode_sudo(),
            user="admin",
            secretkey="./fixtures/id_rsa",
        ):
            cs.run("/etc/init.d/nginx restart")
            cs.run("/etc/init.d/supervisord restart")
```


# settingsコンテキストマネージャについて

settingsコンテキストマネージャは

* 可変長引数(*args のこと) : 他のコンテキストマネージャを引き継ぐ
* キーワード引数(**kwargs のこと): fabric.state.envを一時的に書き換える

このような仕様になっている。
つまり、

```python
with fb.settings(
    cs.mode_user(),
    user="www",
    secretkey="./fixtures/id_rsa",
):
```

こういうコードを書くと

1. cuisineのsudo/通常モード切り替えを最初に実行。
2. envのユーザー・公開鍵をwww, ./fixtures/id_rsaと設定

という風に動く。


# 感想

もっと早くこの仕様に気づいていればよかった。
無駄にユーザースイッチ用デコレータを自前で書いたりしていたので。
C# と TypeScript の比較 (2) 

http://qiita.com/items/5db37f6c048e0ab12bc9 の続き。

* クラスの継承
* インターフェースの実装
* static メンバ
* TypeScript だけで可能な型推論

```csharp:CSharp.cs
class Animal
{
    public static string Name { get; set; }
    public static string GetName()
    {
        return Name;
    }
    public virtual void Run()
    {
        Console.WriteLine("テケテケテケ");
    }
}

class Dog : Animal
{
    public override void Run()
    {
        base.Run();
        Console.WriteLine("へっへっへっ！");
    }
}

interface IFlyable
{
    void Fly();
}

class Bird : Animal, IFlyable
{
    public void Fly()
    {
        Console.WriteLine("ばっさばっさ");
    }
}
```

```javascript:TypeScript.ts
class Animal {
    public static name : string;
    public static getName() { // 戻り値は型推論でもOK
        // クラス名が必須
        return Animal.name;
    }
    public run() {
        console.log("テケテケテケ");
    }
}

class Dog extends Animal {
    public run() {
        super.run();
        console.log("へっへっへっ！");
    }
}

interface IFlyable {
    fly();
}

class Bird extends Animal implements IFlyable {
    public fly() {
        console.log("ばっさばっさ");
    }
}
```
ルーティングをネストさせた場合のdeviseでのユーザー登録:その２


長くなったので続き。
ここまででユーザー登録画面が表示されたけど、まだ所属コミュニティをユーザーに登録できない。
registration_contorollerのカスタマイズにちょっとはまったのでメモ。

routes.rbを修正

```ruby:routes.rb
  devise_for :users, :controllers => {:registrations => "registrations"} do
    get "communities/:community_id/users/sign_up" => "registrations#new", :as => :new_community_user_registration
#次を追加
    post "communities/:community_id/users" => "registrations#create", :as => :community_user_registration
  end
```

で、form_forを編集

```ruby:app/views/registrations/new.html.erb
<%= form_for(resource, :as => resource_name, :url => community_user_registration_path(@community)) do |f| %>
```

urlを修正して、パラメータに@communityを渡してやる。
createアクションを修正。

```ruby:app/controllers/registrations_controller.rb
  #追加
  def new
    @community = Community.find(params[:community_id])
    super
  end

  def create
    #追加
    params[:user][:community_id] = params[:community_id]
    resource = build_resource(params[:user])

    if resource.save
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_up(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end
```

これでなんとかコミュニティごとにユーザー登録できるようになった…と思う。
長かった。。。
C# と TypeScript の比較 (1)

個人的必要性に駆られてメモるだけですが。

* 名前空間（モジュール）とクラス
* 名前空間のインポート
* コンストラクタ
* プロパティ
* メソッド
* ドキュメントコメント

```csharp:CSharp.cs
using Foo.Bar;

namespace Hoge
{
    /// <summary>
    /// Fuga をアレするクラスです。
    /// </summary>
    public class Fuga
    {
        /// <summary>
        /// 何かわからない数値を取得または設定します。
        /// <summary>
        public int Num { get; set; }

        /// <summary>
        /// <see cref="Fuga" /> クラスの新しいインスタンスを初期化します。
        /// <summary>
        public Fuga()
        {
            Console.WriteLine("コンストラクタ");
        }

        /// <summary>
        /// <see cref="Fuga.Num" /> プロパティに指定された数値を加算して文字列として取得します。何に使うのでしょうか。
        /// <summary>
        /// <param name="x">加算する数値。</param>
        /// <returns>よくわからない値。</returns>
        public string GetNumString(int x)
        {
            Piyo.DoSomething();
            return (Num + x).ToString(CultureInfo.InvaliantCulture);
        }
    }
}
```

```javascript:TypeScript.ts
module Hoge {

    import bar = Foo.Bar;

    /**
    * Fuga をアレするクラスです。
    */
    export class Fuga {

        /** 何かわからない数値を取得または設定します。 */
        public num : number;

        /**
        * Fuga クラスの新しいインスタンスを初期化します。
        */
        constructor() {
            console.log("コンストラクタ");
        }

        /**
        * Fuga#num プロパティに指定された数値を加算して文字列として取得します。何に使うのでしょうか。
        * @param x 加算する数値。
        */
        public getNumString : string(x : number) {
            // 名前空間（モジュール名）を完全に省略することはできない。
            bar.Piyo.doSomething();
            // メンバの this は省略できない。
            return (this.num + x).toString();
        }
    }
}
```
ルーティングをネストさせた場合のdeviseでのユーザー登録


なんだか二日くらい悩んでいたのが解決した（っぽい）のでメモ。

```ruby:routes.rb
 resources :communities do
    resources :rooms
    resources :users
  end
```

ユーザー登録は各コミュニティごとにさせたいので、上のようにroutes.rbを設定した。これだけでは、deviseのregistration_pathは

/users/registration

のままなので、どうにかする。

まず、ユーザー登録をカスタムコントローラーにやらせる。

```ruby:app/controllers/registrations_controller.rb
# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController

  def create
    build_resource　　　＃ここを後から変更

    if resource.save
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_up(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end

end
```

を作成。その上で、routes.rbに

```ruby:routes.rb
  devise_for :users, :controllers => {:registrations => "registrations"} do
    match "communities/:community_id/sign_up" => "registrations#new", :as => :new_community_user_registration
  end
```

と書いてdeviseにコントローラとルートをしらせてやる。

このままではviewがないので、

app/views/registrations/new.html.erb

を作成してやる。

http://localhost:3000/communities/1/sign_up

にアクセスすると、ユーザー登録画面が表示される。ここまでで一段落。やれやれ
ウェブサイトのスクリーンショットを簡単に取得する方法


```php
<?php
//スクリーンショットをとりたいウェブサイトの URL
$url = "http://bijostagram.com/";
//スクリーンショットの幅
$width = 200;
echo 'http://s.wordpress.com/mshots/v1/' . urlencode( $url ) . '?w=' . $width;

```
返ってきた URL から画像データを取得する。
XOOPSでユーザ登録やログイン画面等だけSSL対応する.htaccess


user.phpやregister.phpなどユーザ登録、ログインなどの画面だけhttpsへリダイレクトさせて、他のページへSSLアクセスされた時は逆にhttpへリダイレクトさせる.htaccessです。


```.htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(user|register|edituser|lostpass)\.php [OR]
RewriteCond %{REQUEST_URI} ^/modules/user/
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L]

RewriteCond %{REQUEST_URI} !(^/(user|register|edituser|lostpass)\.php)
RewriteCond %{REQUEST_URI} !(^/modules/user/)
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L]
```
ADBannerView iAdを表示するための最低限の設定とシングルトンでの実装


iAdはAdBannerViewをviewに`addSubviews:`するだけで広告表示することができます。
ただ、そのままだと広告をまだ受信していないときに白いビューが表示されてしまうので、ビューを隠す必要があります。(たしか適切に隠さないとReject対象なはず)

## 白いビューの解決

デリゲートで以下を実装すれば白いビューが表示される問題は解決します。
alphaを使わず移動させてもよいかと思います。
*※ AdBannerViewのalphaの初期値は別途`0.f`にしています。*

```objectivec:Sample.m
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    [UIView animateWithDuration:0.3f animations:^{
        banner.alpha = 1.f;
    }];
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    [UIView animateWithDuration:0.3f animations:^{
        banner.alpha = 0.f;
    }];
}
```

## シングルトンでの実装

同じAdBannerViewを使い回したかったので、シングルトンで実装しました。
使用方法は`shardAdBannerView `を表示したいビューに適宜`addSubviews:`するだけです。
*※ iAd.frameworkの追加を忘れずに。*

```objectivec:AdManager.h
#import <Foundation/Foundation.h>
#import <iAd/iAd.h>

@interface AdManager : NSObject

+ (ADBannerView*)shardAdBannerView;
+ (void)removeAd;

@end
```

```objectivec:AdManager.m
#import "AdManager.h"

NSString *NSStringFromiAdError(NSError *error)
{
    switch (error.code) {
        case 0:
            return @"ADErrorUnknown 不明または予期しないエラー";
        case 1:
            return @"ADErrorServerFailure 広告サーバーへの接続失敗";
        case 2:
            return @"ADErrorLoadingThrottled 現在広告サーバーからのダウンロードが抑制されている";
        case 3:
            return @"ADErrorInventoryUnavailable 現在ダウンロード出来る広告がない";
        case 4:
            return @"ADErrorConfigurationError アプリケーションが広告を通知するように設定していない";
        case 5:
            return @"ADErrorBannerVisibleWithoutContent バナーは表示されているが、バナー広告画像は表示されていない";
        case 6:
            return @"ADErrorApplicationInactive アプリケーションがアクティブでないため、広告コンテンツが利用出来ない";
        default:
            return [NSString stringWithFormat:@"Unknown ADError.code[%d]", error.code];
    }
}


static AdManager *s_adManager;
static ADBannerView *s_adBannerView;

@interface AdManager () <ADBannerViewDelegate>

@end

@implementation AdManager

+ (ADBannerView*)shardAdBannerView
{
    if (s_adBannerView == nil) {
        s_adManager = [[AdManager alloc] init];
        s_adBannerView = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner];
        s_adBannerView.delegate = s_adManager;
        s_adBannerView.alpha = 0.f;
    }
    return s_adBannerView;
}

+ (void)removeAd
{
    [s_adBannerView removeFromSuperview];
    s_adBannerView.delegate = nil; // いちよう
    s_adBannerView = nil;
    s_adManager = nil;
}

#pragma mark - AdBannerDelegate

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    [UIView animateWithDuration:0.3f animations:^{
        banner.alpha = 1.f;
    }];
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
	NSLog(@"[ERROR] %@", NSStringFromiAdError(error));
    [UIView animateWithDuration:0.3f animations:^{
        banner.alpha = 0.f;
    }];
}

@end
```
JailBreak端末のチェック

不当にアプリを解析されたくないときに。
SOFでググった結果、Cydiaがインストールされてるかチェックするのが一番手っ取り早いみたい。
もちろんCydiaがインストールされていることがJailBreakされた端末であることの必要十分条件ではないが、ほとんどのJailBreak端末に見られる傾向なので一定有効ではありそう。

```objectivec:howToDetectJailBrokenDevice
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
   // do something useful
}
```
JB端末でNHNのアプリを起動するとAlertViewが立ち上がりゲーム起動できない状態となるが、上記コードのようなチェックをしているのだろうか。
(見当違いかもしれないし、別の手法もあるのかもしれない)

**参考**
[LINE POP・LINE バブルで「お使いのスマートフォン端末が正規の状態ではない場合は、ゲームを起動できません」と表示される理由と対策 | 情報科学屋さんを目指す人のメモ](http://did2memo.net/2012/12/14/line-pop-root-user/)
[iphone - How do I detect that an SDK app is running on a jailbroken phone? - Stack Overflow](http://stackoverflow.com/questions/413242/how-do-i-detect-that-an-sdk-app-is-running-on-a-jailbroken-phone)
第9回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題はこちらから。
http://qiita.com/items/7c46e8409c456e8fabd1

```ruby
def solve(q)
  pos,ns = q.split(':')
  pos = pos.to_i
  ns = ns.chars.map{|_| _=='6' ? [6,9] : _.to_i}.flatten
  num6 = ns.count(6)
  ret = ns.permutation(4).select{|_| _[0] != 0}.select{|_|
    _.count{|e| e == 6 or e == 9} <= num6 
  }.uniq.sort
  ret.size < pos ? '-' : ret[pos-1].join
end

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

__END__
0	13:01167	1109
1	1:1234	1234
2	2:1234	1243
3	7:1234	2134
```
libxml2 のビルド設定を見直す

[libxml2](http://www.xmlsoft.org/) は XML を読み込み及び書き出しをするライブラリとしてはデファクトスタンダードの位置にある MITL のライブラリである。他にも [Expat](http://expat.sourceforge.net/) や [Xerces](http://xerces.apache.org/) や [TinyXml](http://www.grinninglizard.com/tinyxml/) もあるがなんとアセンブラのみで書いてるという [AsmXml](http://tibleiz.net/asm-xml/) なんてものもある。

このエントリでは libxml2 のみに絞るが、libxml2 は最初から山盛りの設定なので、ビルドエラーを起こさないレベルでなんとかビルド出来る最小の設定を書く。以下の例は SAX を使った設定な点に注意。とはいえ最低でも http/ftp/html は無効にしておくべきだろう。

```bash
./configure \
  --without-iconv \
  --without-zlib \
  --without-python \
  --without-readline \
  --without-ftp \
  --without-html \
  --without-http \
  --without-c14n \
  --without-threads \
  --without-regexps \
  --without-valid \
  --without-xinclude \
  --without-xptr \
  --without-docbook \
  --without-push \
  --without-catalog \
  --without-schematron \
  --without-modules \
  --disable-shared \
  --enable-static 
```

ちなみに Windows の場合は win32 ディレクトリ以下にある configure.js を cscript 経由で呼び出してビルド設定を書き出し、それを nmake でビルドする方法を採用するというやや珍しい方法をとっている。

```
cscript configure.js compiler=msvc debug=no ftp=no http=no html=no catalog=no docb=no iconv=no icu=no iso8859x=no zlib=no lzma=no
```

指定可能なオプションの詳細は help を叩くこと。かなり configure に近く、*nmake install* によるインストールも可能。

```
cscript configure.js help
```
第9回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント : http://atnd.org/events/37587
をまたやります。9回目です。
ハンドアックスの投げ合いなどにはならないぬるいイベントです。

これまで同様参考問題を出しました。
http://nabetani.sakura.ne.jp/hena/ord9nummake/
です。

難易度と分量はこれを目安にと言いたいところですが、この参考問題はやや難しい気がしていて、当日はこれより簡単な問題を用意する予定です。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますので出来ればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
jsで「最後までスクロールされた」というEventをキャッチする

今までどういうふうに実装されているのか知らなかったので、
jquery_bottomを読み解いて理解したのでメモ。

jquery_bottomはこちら。
https://github.com/jimyi/jquery_bottom

## 必要な情報

* 要素の表示領域
* 要素のスクロール分を含めた高さ
* 要素のスクロール位置

この情報がわかれば、下記の情報を導き出せる。
「要素の表示領域」+「要素のスクロール位置」＝「現在の表示位置の高さ」

「現在の表示位置の高さ」さえわかれば、後はその値が「要素のスクロール分を含めた高さ」にどれだけ近づいているかで、スクロール位置を判断することができる。

## 実装してみる

```scroll.js
// スクロールさせる要素を取得
var elm = document.getElementById('scrollElement');

// 要素の表示領域を取得
var height = elm.offsetHeight;

// スクロールイベントを定義
elm.onscroll = function() {
    // 要素のスクロール分を含めた高さを取得
    var scrollHeight = elm.scrollHeight;

    // 要素のスクロール位置を取得
    var scrollTop = elm.scrollTop;

    // 現在の表示位置の高さ 
    var scrollPosition = height + scrollTop;

    // どれだけ近づいたかを判断する値
    // 0に近いほど、スクロールの最終が近い
    var proximity = 0;

    if ((scrollHeight - scrollPosition) / scrollHeight <= proximity) {
        alert('Scroll finish!!');
    }
}
```
サンプルはこちら。
http://jsdo.it/tanihiro/scroll-finish-event

## 注意点

document.Element.scrollHeightは、要素のpaddingも含めるので、
paddingを設定している場合は、その値を考慮しないといけない。

参考
https://developer.mozilla.org/en-US/docs/DOM/element.scrollHeight
bash ２重起動を慎重に抑止する。

参考情報：[シェルスクリプトでの排他処理](http://qiita.com/items/2492e9bdad0d3e17b7bb)

# 概要

２重起動をbashで抑止しようとした場合、lockファイルを作成するだけだと、
不慮のプロセス停止になった場合、lockファイルが削除されずに、
手でlockファイルを削除しないと永遠に起動出来ないことになってしまう。

それではちょっと不便なので、なんとか本当に２重起動しようとしているかどうか、
pid(Process ID)も組み合わせて、判断するようにしてみた。

以下の条件を完全に満たす場合、２重起動とする。

* 自ファイル名.pidファイル が存在している
　　→lockファイル方式

* ファイルの１行目に書かれているプロセスが存在した場合
　　(/proc/ ディレクトリにpidのディレクトリが存在する)
　　→不慮の事故(kill -9)等によりlockファイルが残っていた場合の自動リカバリ処理

* 自分と同じプロセス名を検索結果のpid一覧と.pidファイルのpidが一致する。
　　→プロセスの大量生成等により、別プロセスが該当のpidを使用しても対応可能
　　→検知漏れ、誤検知を防ぐ
　　　検知漏れの例：bash ./command でも、 ./command でも検出できる
　　　誤検知の例　：commandプロセスを探して、command.shを引っ掛けないように

また、trapコマンドも使って１関数の中に２重起動抑止に必要な処理を全部埋め込んだ。

というのを、CentOS の /etc/init.d/functions を参考にしながら作ってみました。

# ソース

## 判定処理

```bash:実装
#!/bin/bash
# ２重起動チェック
function checkDuplicate()
{
	local RET=0
	local base=${0##*/}
	local pidfile="/tmp/${base}.pid"

	while true; do
		if ln -s $$ ${pidfile} 2> /dev/null
		then
			# 起動OK
			RET=0 && break
		else
			p=$(ls -l ${pidfile} | sed 's@.* @@g')
			if [ -z "${p//[0-9]/}" -a -d "/proc/$p" ]; then
				local mypid=""
				for mypid in $(pgrep -f ${base})
				do
					[ ${p} -eq ${mypid} ] && RET=1 && break
				done;
			fi

			[ ${RET} -ne 0 ] && break
		fi

		rm -f ${pidfile}
	done

	# チェック結果を判定して、pidファイルを作成する。
	# 正常終了、シグナルを検知するとpidファイルを削除する。
	if [ ${RET} -eq 0 ]; then
		trap "rm -f ${pidfile}; exit 0" EXIT
		trap "rm -f ${pidfile}; exit 1" 1 2 3 15
	fi

	return ${RET}
}
```

## 使い方

```bash:呼び出し側
# ２重起動チェック
checkDuplicate
if [ 0 -ne $? ]; then
        # ここにエラー処理を書く
fi
```

----
2013/3/19 lockファイルのチェックと作成を１コマンドで
　　　　　作成することにより、起動中はエラーだったけど
　　　　　処理している間に起動OKになったりしないように
　　　　　対応しました。
Xamarin.iOS で GPS を使う


Xamarin.iOS で GPS を使ってみます。
ちなみ当方、iOS開発についてはシロートに毛が生えた程度なため、Objective-C でも GPS は使ったことありません。

ので、こちらのサンプルを、Xamarin.iOS で書きなおしてみました。

* [GPSを利用する方法 - プログラミングノート](http://d.hatena.ne.jp/ntaku/20090228/1235816377)


```c#:LocationSample.cs
// LocationManager 的なやつ
private CLLocationManager _man = null;

public override void ViewDidLoad()
{
    base.ViewDidLoad();

    _man = new CLLocationManager();
	
    // ボタンをタップした時
    btnListen.TouchUpInside += (s, _) => 
    {
        _man.DesiredAccuracy = 5000; // 希望精度5kmくらい
        _man.LocationsUpdated += (sender, e) => // 位置を受信した時のイベント
        {
            var l = e.Locations[e.Locations.Length - 1];
            
            lblLocation.Text = String.Format("Lat/Lng = {0}/{1}", 
                                             l.Coordinate.Latitude, l.Coordinate.Longitude);
        };
        
		// 受信開始
        _man.StartUpdatingLocation();
    };
}
```

簡単すぎるやばい。
Xamarin.iOS のクラスライブラリが CoreLocation をうまくラップしてくれて、``LocationsUpdated`` てなイベントも用意してくれてます。(Android の LocatiomManager にはイベントはなかった)
そして何度も言いますが Obj-C のキモい構文じゃないのでコードが見やすい書きやすい。

もうちょっとちゃんとしたサンプルは公式をみて下さい。

## 参考
* [GPSを利用する方法 - プログラミングノート](http://d.hatena.ne.jp/ntaku/20090228/1235816377)
* [Core Location | xamarin](http://docs.xamarin.com/samples/CoreLocation)
Rails4で実戦的なブログを作成（その３）


# カテゴリを作成する

次に記事が属するカテゴリを作成します。カテゴリは名前(name)のみを持ちます。

```
$ rails g scaffold Category name:string
$ rake db:migrate
```

## 名前の入力を必須にする

見出しまたは本文が未設定の状態でポストできることは望ましくないため、必須項目に設定します。項目が空でないことを検証すればよいので、`validates_presence_of`宣言を使います。

``` app/models/post.rb 
class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_presence_of :body
end
```

## 記事にカテゴリへのリレーションを追加する

話を簡単にするために記事は1つのカテゴリのみを持つようにします。記事(posts)にカテゴリID(category_id)を追加するため、マイグレーションスクリプトを生成します。

```
$ rails g migration AddCategoryIdToPosts
```

生成したマイグレーションスクリプトを次のように編集します。

``` db/migrate/YYYYMMDDHHMMDD_add_category_id_to_posts.rb
class AddCategoryIdToPosts < ActiveRecord::Migration
  def self.up
  	add_column(:posts, :category_id, :integer)
  	add_index(:posts, :category_id)
  end
  
  def self.down
  	remove_index(:posts, :column => :category_id)
  	remove_column(:posts, :category_id)
  end
end
```

記事からカテゴリへのリレーションはn対1の関係なので、<code>belongs_to</code>宣言を書きます。この時、指定する1側は単数形で書きます。

``` app/models/post.rb
class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_presence_of :body
  belongs_to :blog
  belongs_to :category
end
```

一方、カテゴリから記事へは1対nの関係なので、<code>has_many</code>宣言を書きます。この時、指定するn側は複数形で書きます。

``` app/models/category.rb
class Category < ActiveRecord::Base
  has_many :posts
end
```

マイグレーションを実行します。

```
$ rake db:migrate
```

## 記事投稿時にカテゴリを指定できるようにする

_form.html.erbに以下を追加して、カテゴリを指定できるようにします。

``` app/views/posts/_form.html.erb
<div class="field">
  <%= f.label :category_id %><br />
  <%= f.collection_select :category_id, Category.all, :id, :name %>
</div>
```

ただ、このままでは<code>category_id</code>は許可されていないパラメータとして弾かれてしまうため、posts_controller.rbのpost_paramsメソッドを次のように書き換えます。

``` app/controllers/post_controller.rb
def post_params
  params.require(:post).permit(:title, :body, :category_id)
end
```

これで、カテゴリを指定できるようになり、それがDBにも反映されるようになります。

# カテゴリを追加し、記事で選択できることを確認する

サーバを起動し、適当にカテゴリを追加した後、記事投稿時に選択できることを確認します。
Rails4で実戦的なブログを作成（その２）

# 記事(Post)を作成する

次に記事(Post)を作成します。

```
$ rails g scaffold Post title:string body:text
$ rake db:migrate
```

ここでは、見出し(title)と本文(body)を持つように定義しておきます。

## 見出しと本文の入力を必須にする

見出しまたは本文が未設定の状態でポストできることは望ましくないため、必須項目に設定します。項目が空でないことを検証すればよいので、`validates_presence_of`宣言を使います。

``` app/models/post.rb 
class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_presence_of :body
end
```

## 記事にブログへのリレーションを追加する

記事がいずれか1つのブログに属するようにリレーションを追加します。

### 記事へのブログIDの追加

記事にブログIDを追加します。

記事にブログIDを追加するマイグレーションスクリプトを生成します。

```
$ rails g migration AddBlogIdToPosts
```

生成されたマイグレーションスクリプトを以下のように編集します。

``` db/migrate/YYYYMMDDHHMMSS_add_blog_id_to_posts.rb
class AddBlogIdToPosts < ActiveRecord::Migration
  def self.up
    add_column(:posts, :blog_id, :integer)
    add_index(:posts, :blog_id)
  end
  
  def self.down
    remove_index(:posts, :column => :blog_id)
    remove_column(:posts, :blog_id)
  end
end
```

マイグレーションを実行します。

```
$ rake db:migrate
```

### 記事からブログへのリレーションの追加

記事からブログへのリレーションはn対1の関係なので、`belongs_to`宣言を書きます。この時、指定する1側は単数形で書きます。

``` app/models/post.rb
class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_presence_of :body
  belongs_to :blog
end
```

一方、ブログから記事へのリレーションは1対nの関係なので、`has_many`宣言を書きます。この時、指定するn側は複数形で書きます。

``` app/models/blog.rb
class Blog < ActiveRecord::Base
  validates_presence_of :name
  has_many :posts
end
```

### 記事投稿時にブログを選択できるようにする

_form.html.erbに以下を追加して、ブログを指定できるようにします。

``` views/posts/_form.html.erb
  <div class="field">
    <%= f.label :blog_id %><br />
    <%= f.collection_select :blog_id, Blog.all, :id, :name %>
  </div>
<% end %>
```

ただ、このままでは`blog_id`は許可されていないパラメータとして弾かれてしまうため、`posts_controller.rb`の`post_params`メソッドを次のように書き換えます。

``` app/controllers/posts_controller.rb
    def post_params
      params.require(:post).permit(:title, :body, :blog_id)
    end
```

これで、ブログを指定できるようになり、それがDBにも反映されるようになります。

# 記事を投稿する

サーバを起動し、記事が投稿できることを確認します。
Rails4で実戦的なブログを作成（その１）



# ブログアプリケーションの作成

ブログアプリケーションを作成します。
本記事ではシンプルに`myblog`という名前にしておきます。どんな名前でもいいのですが、この後作成するモデル名と被ってしまうため、`blog`だけは避けてください。

```
$ rails new myblog
```

## Gemfileの書き換え

今回はSqlite3ではなくPostgreSQLを使用するため、`gem 'sqlite3'`から`gem 'pg'`に書き換えます。

``` Gemfile
source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.beta1'

gem 'pg'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 4.0.0.beta1'
  gem 'coffee-rails', '~> 4.0.0.beta1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', platforms: :ruby

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.0.1'

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# Use unicorn as the app server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano', group: :development

# To use debugger
# gem 'debugger'
```

gemを変更したので、gemをインストールします。

```
$ bundle install
```

## データベース設定の変更

自動生成したままだとSQLite3の設定になっているデータベースの設定を変更します。当面は開発にしか使わないので、`development`だけ作成しておきます。

``` config/database.yml
development:
  adapter: postgresql
  database: mydiary
  username: bloguser
  password: password
  host: localhost
  encoding: utf8
  pool: 5
  timeout: 5000
```

bloguserユーザにデータベース作成権限を与えておいたので、`rake db`コマンドでデータベースを作成します。

```
$ rake db:create
```

# ブログ(Blog)モデルを作成する

まずはじめにブログ(Blog)モデルを作成します。

```
$ rails g scaffold Blog name:string
$ rake db:migrate
```

ここでは、名前(name)のみを持つように定義しておきます。

## 名前の入力を必須にする

名前を必須項目に設定します。

``` app/models/blog.rb
class Blog < ActiveRecord::Base
  validates_presence_of :name
end
```

# ブログを追加する

サーバを起動し、ブログが追加できることを確認します。
Emacs の po-mode で翻訳時にも popwin する

Emacs の po-mode で翻訳時にも popwin する。

やってる人はやってるんだろうけど、検索しても見つからなかったので書いてみた。

```scheme
(require 'popwin)
(setq display-buffer-function 'popwin:display-buffer)
;; po-mode
(push '("\\*.*\\.po\\*"
        :regexp t
        :position bottom
        :height 20)
      popwin:special-display-config)
```
po-mode の場合、ウィンドウを分割して使っていても一度翻訳してから C-c C-c して翻訳を完了するとウィンドウの分割がなくなってしまうので地味にイライラしていた。
最近 popwin.el を使い始めたので上のような設定をしてみたらかなりいい感じになった。
html2haml つまったところメモ


devise 1.2以上だとhamlのgeneratorがないので、[How To: Create Haml and Slim Views](https://github.com/plataformatec/devise/wiki/How-To:-Create-Haml-and-Slim-Views)を読んでやるんだけど、少しハマったのでメモ。

他にもerbで作ったアプリケーションをhaml記法に移行したいときなど。

hamlのバージョンが古いとひっかかるので、Gemfileに

```ruby
gem 'haml', '~> 4.0.0'
gem 'haml-rails', '~> 0.4'

group :development do
  gem 'html2haml'
end
```

とかいて、html2hamlをbundle execつけて実行する。

```
for file in app/views/odai/*.erb; do bundle exec html2haml -e $file ${file%erb}haml --trace && rm $file; done
```

動いた。
トグル処理

```javascript
function toggle(){
    var fn = arguments;
    var l = arguments.length;
    var i = 0;
    return function(){
        if(l <= i) i=0;
        fn[i++]();            
    }
}
```

```javascript
function a1(){
  console.log('Hello');
}
function a2(){
  console.log('World');
}
function a3(){
  console.log('hoge');
}

var b = toggle(a1, a2);
b() -> Hello
b() -> World
b() -> Hello
b() -> World

var c = toggle(a1, a2, a3);
c() -> Hello
c() -> World
c() -> hoge
c() -> Hello
```
git commit のログをEmacsで書く設定を3行で


* .gitconfigの``editor``にemacsclientを設定する。
* alternate-editorにemacsを設定する。
* -t を忘れると日本語が入らなかった。

----
git commitしたときのエディタをemacsにしました。ただemacsclientを使っているのでその辺で詰まったりしたのでメモ書き。

.gitconfigに、emacslientとemacsを両方設定
----
以下を.gitconfigに追加します。

```
[core]
	editor = "/usr/local/bin/emacsclient -t" --alternate-editor /usr/local/bin/emacs
```

homebrewでemacsを入れたので/home/local/bin/以下のemacsを指定します。また普通はemacsclientを使っているので、起動できたらemacsclient→出来なかったら素のemacs とします。

-t を忘れると日本語が入らなかった
---
最初は"-t"無しでやって日本語が入らず悩みました。emacs起動して英語でログを入力する分にはOKだったけど、日本語入力でNGでした。
manによれば、-t は -tty -nwと同じ意味で、今開いてるターミナルでemacsclientを起動するフラグです。
通常ターミナルで、"-t"無しの場合起動しません。

```sh:
macmini% /usr/local/bin/emacsclient
/usr/local/bin/emacsclient: file name or argument required
Try `/usr/local/bin/emacsclient --help' for more information
```

"-t"無しでファイル名付きの場合、Emacsの起動待ち?で止まります。

```sh:
macmini% emacsclient .git/COMMIT_EDITMSG
Waiting for Emacs...^C  # ここでCtrl+C
macmini% 
```

gitコマンドからemacsを起動する際、-t無しでファイル名付きのパターンになったのでしょう。
RspecでNoMethodErrorが解決できない


CucumberとRspecを使い始めたのだけれど、なかなかうまくいかない。
ルーティングをネストして

```ruby:routes.rb
  resources :communities do
    resources :rooms
    resources :users
  end
```

としていると、コントローラー内で

```ruby
redirect_to [@community, @user]
```

とかした場合に

```
     NameError:
       undefined local variable or method `community_user_url'
```
とか言われる…
ちなみにブラウザではちゃんとリダイレクトされてます。

・・・・・と思ってたらもう一回Guard再起動したら出来たorz
あれえ…再起動はかけたと思ってたのに………orz
Go で実行中の行数、ファイル名の取得

Go では __FILE__ や __LINE__ はありません。
これは、プリプロセッサを省いてコンパイルスピードを早めたいかららしいです。

https://groups.google.com/forum/#!topic/golang-nuts/tL4YYwjJzKg

しかし、 Go 標準の log モジュールは 以下のようにフラグでこれらを出力できます。

```go
package main
import "log"

func main() {
  // どちらかを指定
  log.setFlags(log.Llongfile) // full file name and line number: /a/b/c/d.go:23
  log.setFlags(log.Lshortfile) // final file name element and line number: d.go:23. overrides Llongfile
  log.Println("debug log")
}
```

自分でちょっとした logger を組みたいときに、これらの情報をどう取得するかを知りたかったので log のソースを読んだら、 runtime モジュールを使えば良いことがわかりました。


```go
package main

import (
  "runtime"
  "fmt"
)

func main() {
  // func Caller(skip int) (pc uintptr, file string, line int, ok bool)
  fmt.Println(runtime.Caller(1))
}
```

Caller の引数は、どこまでスタックを遡るかなので、メソッドを呼び出してる行や、そのメソッドを呼び出すメソッドを呼び出す行の番号など、数字を増やすと取得できます。


自前 logger を作るときとかにどうぞ。
ディスクから削除したファイルを簡単に git rm する


Windows では動きませんが。

```
git rm $(git ls-files --deleted)
```

変更されたファイルも add して良い場合は、以下が簡単です。

```
git add -u
```

参考 URL
http://stackoverflow.com/questions/492558/removing-multiple-files-from-a-git-repo-that-have-already-been-deleted-from-disk
Tomcat の管理アプリの使い方


管理アプリを使うにはログインする必要がありますが、Tomcat のインストール直後はユーザが存在しません。
`conf/tomcat-users.xml` に記述して再起動。
ちなみに Tomcat 7 から、それまでと role 名が変わっているのでご注意を。

```conf/tomcat-users.xml
<tomcat-users>
  <role rolename="manager-gui" />
  <user username="admin" password="nyaaaaa!" roles="manager-gui" />
</tomcat-users>
```
Macで画像のEXIF情報を確認する方法


マカーにとっては、常識的なことなのかもしれませんが、最近Macを使い出した私には眼から鱗なネタだったので、備忘録として書いておきたいと思います。

Macで画像のEXIF情報を確認するのは、とっても簡単だったのですね。
画像をダブルクリック（人によってはシングルクリック？）すると、プレビューが表示されますが、「ツール」「インスペクタを表示」を選択するとボックスが表示されるので、そこで「EXIF」タブをクリックすると、その画像のEXIF情報が一覧表示されます。
いやぁ〜　便利ですね。

ちなみに、このデータは SONY NEX-5+標準18-55mm OSS レンズです。

![MacでEXIF情報を確認する](http://xoops123.com/uploads/wp-content/uploads/db18a52495ef4472f7feab9bb3f31806.jpeg "MacでEXIF情報を確認する")
fla のステージ上のインスタンスをメンバ変数に入れる


ActionScript Settings の Automatically declare stage instances を off にして、普通にリンケージ先のクラスで同じ名前のインスタンス変数を宣言すれば、その変数に入ってきます。

変数は public でないとエラー。DI みたいなものですね。

今までこれを知らなくて、ステージ上で _foo とかいう名前をつけて、AS で型付きで宣言した変数 foo に代入したりしてました・・・。

参考
http://stackoverflow.com/questions/8882709/recognizing-instances-placed-on-the-stage
S2CSV を使う時の注意


## 問題

CSV インポートの際の `CSVValidationResultError` の中身を見るのに `CSVMsg.toString()` すると以下のエラー。

```
...
Caused by: org.seasar.framework.exception.ResourceNotFoundRuntimeException: [ESSR0055]リソース(csv_application)が見つかりません
...
```

`getMsgKey()` からはメッセージキーが返ってくるので、対応するメッセージのテーブルが見つからない？

## 解決

メッセージを書いたプロパティファイル `csv_application(_ja).properties` を別途用意する必要がありました。
サンプルを流用するか `application.properties` をコピーすると便利です。
JSP で Rails の partial みたいなこと


```_form.jsp
<dl>
  <dt><tags:label property="loginId" /></dt>
  <dd><html:text property="loginId" /></dd>
  <dt><tags:label property="nickname" /></dt>
  <dd><html:text property="nickname" /></dd>
</dl>
```

普通に `c:import` すれば OK。`jsp:include` でもできるけど、文字コードの指定ができたり、パフォーマンスが良かったりするそうです。

```create.jsp
<s:form>
  <c:import url="_form.jsp" />
  <p><input type="submit" name="insert" value="保存" /></p>
</s:form>
```

パラメーターも `c:param` で渡せます。
SAStruts で任意のエラーを表示


`ActionMessagesUtil` を使います。

```java
ActionMessages errors = new ActionMessages();

// Error on URL
errors.add("url", new ActionMessage("errors.url", new Object[] { url }));

// Global error
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.something"));

ActionMessagesUtil.addErrors(RequestUtil.getRequest(), errors);
```
使用中の Servlet, JSP のバージョンを確認


```erb
<dl>
  <dt>Servlet Engine</dt>
  <dd><%= session.getServletContext().getMajorVersion() %>.<%= session.getServletContext().getMinorVersion() %></dd>
  <dt>JSP Engine</dt>
  <dd><%= JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %></dd>
  <dt>Application Server</dt>
  <dd><%= application.getServerInfo() %></dd>
</dl>
```
JSP の余計な空白を削除


SAStruts では `web.xml` に `init-param` で `trimSpaces` を設定する方法は何故かうまく行きませんでした。

JSP に直接書くとうまく行きました。JSP 2.1 以降で使えるそうです。

```jsp
<%@page trimDirectiveWhitespaces="true"%>
```

参考
http://www.techscore.com/tech/Java/JavaEE/JSP/15-5/
Twitter Bootstrap の .dl-horizontal で dd が空の時にずれるのを直す


そもそも `dd` の中身が空でいいかどうかは置いておいて・・・。`dd` を clearfix すれば良いようです。

生の CSS を書いている場合は以下。

```css
.dl-horizontal dd {
  *zoom: 1;
}
.dl-horizontal dd:before,
.dl-horizontal dd:after {
  display: table;
  line-height: 0;
  content: "";
}
.dl-horizontal dd:after {
  clear: both;
}
```

LESS を使っている場合は以下。

```less
.dl-horizontal dd {
  .clearfix();
}
```

参考
http://stackoverflow.com/questions/10566451/prevent-twitter-bootstrap-empty-dd-filling-with-next-dd-value
Struts Tiles で値があった時だけ出力


`ignore="true"` を指定すると、値がなくてもエラーになりません。

こんな感じで、特定のページにだけ `script` タグを追加したい時などに。

```jsp
  ...
  <script src="foo.js"></script>
  <script src="bar.js"></script>
  <tiles:insert attribute="extraScript" ignore="true" />
</body>
```
16 進数文字列の変換


Integer から 16 進数文字列へ。

```
Integer num = 10079283;
String hex = String.format("0x%06x", Integer.valueOf(num));
// 0x99cc33
```

16 進数文字列から Integer へ。

```
String str = "0x99cc33";
Integer num = Integer.decode(str);
// 10079283
```

参考
http://stackoverflow.com/questions/5446863/pad-digits-until-string-is-8-chars-long-in-java
mongoDB で重複削除


`ensureIndex()` を使います。

```js
db.foo.dropIndexes();
db.foo.ensureIndex({ bar: 1, baz: 1 }, { unique: true, dropDups: true });

db.foo.dropIndexes();

// 元々インデックスを設定していた場合は元に戻す。
db.foo.ensureIndex({ something: 1 });
```

参考
http://labs.infoalive.com/mongodb/212
Heroku で rcairo を動かす

デフォルト構成の Heroku cedar stack には libcairo はインストールされていないので、当然 cairo gem も利用できない。

参考

* http://qa.atmarkit.co.jp/q/2083

こういう場合、自分でbuildpackを用意するしか無い。

## 作ってみた

以下のようなコマンドで cairo をなんとか動かせるようにした。

```bash
heroku config:add BUILDPACK_URL="git://github.com/udzura/heroku-buildpack-ruby.git#with-cairo"
git push heroku master
```

ポイントは

* https://github.com/heroku/heroku-buildpack-ruby に https://github.com/rumblelabs/heroku-buildpack-cairo のビルドスクリプトとVulcanのパッケージを混ぜ込んで動かせるようにした
* rcairoのビルドに当たり、herokuの環境はHAVE_RB_ERRINFOを正しく判定しない。。。。。。辛い……　なので、無理矢理なパッチを当ててfork、そっちを使う -> https://github.com/udzura/rcairo

## ところでVulcanってのがあるみたいですね

* https://github.com/heroku/vulcan/blob/master/README.md

herokuなど向けにLinuxのパッケージを自分でビルドしてHTTPで拾えるところに置いておけるらしい。でも、ちょっとやってみたけどdependency hellでキツすぎる。今回は、人さまが用意してくれたcairoとpixman 使ったので……。

## まとめ

実用的と言うほどではないけれどとにかく動かせた。

参考

* https://devcenter.heroku.com/articles/buildpacks
* https://devcenter.heroku.com/articles/buildpack-binaries
Sublime Text API Reference でカバーされていない API のまとめ


一応、Sulime Text 2 の範囲で。

元ネタ：

公式リリースノート
http://www.sublimetext.com/2

公式 API リファレンス
http://www.sublimetext.com/docs/2/api_reference.html

Google でフォーラムや GitHub を漁る

## Sublime API

### sublime

* log_result_regex() True にすると正規表現解析時にログ表示？
* channel() 製品版は "stable", 開発版はそれ以外の何かを返す
* get_macro() 最後に記録されたマクロの内容を返す。[{'args': {'characters': u'   '}, 'command': u'insert'}] のような感じ。

### view

* folded_regions() 現在のエディタの中で折り畳まれている行を返す。[(176, 601), (618, 1056)] のような感じ。

### window

* find_open_file(file_name) 開いているファイルを取得 [使い方の例](https://github.com/chasestubblefield/sublime-file-operations/blob/master/FileOperations.py)
* get_layout() エディタ部分のレイアウトを取得
* set_layout(layout) エディタ部分のレイアウトを設定 [使い方の例](https://github.com/madeingnecca/sublime-layout-zoom/blob/master/layout-zoom.py)
* hwnd() (Windows のみ) Windows 用のハンドルを取得 [使い方の例](https://github.com/weslly/ColorPicker/blob/master/sublimecp.py)


## EventListner

* on_query_completions(self, view, prefix, locations) オートコンプリートリストを返す。[使い方の例](http://docs.sublimetext.info/en/latest/extensibility/plugins.html#another-plugin-example-feeding-the-completions-list)


## WindowCommand

* is_checked(): チェックボックスの状態。True ならコマンドに対応したメニュー項目にチェックがつく。[使い方の例](http://qiita.com/items/3e1c131951d09833bd7f)
クラス風継承を今どきの書き方でやってみる


発端は[自分が書いたブログ記事](http://css-eblog.com/javascript-link/simple-javascript-inheritance.html)に対して、[@hokaccha](https://twitter.com/hokaccha)さんが[今風の書き方](https://gist.github.com/hokaccha/5175064)ってことでReplyしてくれたのがきっかけです。
ベースというか、ほぼそれのコピペですが記事元ではやっていない処理が追加されていたり、実装していないものがあったりしたのでそれを追加・修正したものです。

`'use strict'`しても動きます。（[翻訳記事元](http://ejohn.org/blog/simple-javascript-inheritance/)は`arguments.callee`使ってるので、strictモードで動きません）


```javascript
(function (win, doc, exports, undefined) {

    'use strict';

    var fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

    function Class() { /* noop. */ }

    Class.extend = function (props) {

        var SuperClass = this;

        function Class() {
            if (typeof this.init === 'function') {
                this.init.apply(this, arguments);
            }
        }

        Class.prototype = Object.create(SuperClass.prototype, {
            constructor: {
                value: Class,
                writable: true,
                configurable: true
            }
        });

        Object.keys(props).forEach(function (key) {
            var prop   = props[key],
                _super = SuperClass.prototype[key],
                isMethodOverride = (typeof prop === 'function' && typeof _super === 'function' && fnTest.test(prop));

            if (isMethodOverride) {
                Class.prototype[key] = function () {
                    var ret,
                        tmp = this._super;

                    Object.defineProperty(this, '_super', {
                        value: _super,
                        configurable: true
                    });

                    ret = prop.apply(this, arguments);

                    Object.defineProperty(this, '_super', {
                        value: tmp,
                        configurable: true
                    });

                    return ret;
                };
            }
            else {
                Class.prototype[key] = prop;
            }
        });

        Class.extend = SuperClass.extend;

        return Class;
    };

    exports.Class = Class;
}(window, window.document, window));
```

---

使い方はこんな感じ。

```javascript
(function (win, doc, exports, undefined) {

    'use strict';

    var Person = Class.extend({
        init: function () {
            console.log('hoge');
        }
    });

    var Ninja = Person.extend({
        init: function () {
            this._super();
            console.log('foo');
        }
    });

    var Samurai = Ninja.extend({
        init: function () {
            this._super();
            console.log('bar');
        },
        _super: 'super!'
    });

    var p = new Person();
    var n = new Ninja();
    var s = new Samurai();

    console.log(s._super);

}(window, window.document, window));
```
永続性が必要な時は hash() を使うな！

以下は、Python 3.3のビルトイン関数である [hash()](http://docs.python.jp/3.3/library/functions.html#hash) についての話です。

[KaoriYa版Vim](http://www.kaoriya.net/software/vim/) が Python 3.3 に対応したので、3.3に非対応の [jedi-vim](https://github.com/davidhalter/jedi-vim) を誤魔化して動かそうとしていた時に、jedi-vim が利用する [jedi](https://github.com/davidhalter/jedi) がキャッシュファイルを開こうとしてエラーになっていることに気がつきました。

問題なのは、キャッシュファイル名を生成する

```python:jedi/cache.py
def _get_hashed_path(self, path):
    return self._get_path('%s_%s.pkl' % (self.py_version, hash(path)))
```

というコードで、hash() の結果が非決定的であること、正確には hash() の決定性がプロセス内で閉じていることが原因です。

実際に確認してみましょう。

```
$ python3.3
    ...
>>> hash("spam")
-2615809667644326338
>>> hash("spam")
-2615809667644326338
>>>
$ python3.3
    ...
>>> hash("spam")
5272786964549530217
>>> hash("spam")
5272786964549530217
>>>
```

`hash("spam")` の戻り値がプロセス毎に変化しているのが分かると思います。

jedi のエラーが Python 3.3 でだけ発生したのは、Python 3.3 になって[セキュリティ上の理由でハッシュがランダム化された](http://docs.python.jp/3.3/whatsnew/3.3.html#builtin-functions-and-types)からですね。

とりあえず、速度が必要な局面ではなかったので、Python のバージョンが3.3以上だった場合は [hashlib.md5()](http://docs.python.jp/3.3/library/hashlib.html) を使うように修正してみました。

余談ですが、jedi が 未だにPython 3.3非対応なのは、3.3で名前空間パッケージの新しい仕組みが導入されたことと、[imp.find_module()](http://docs.python.jp/3.3/library/imp.html#imp.find_module) が廃止されてしまったことが主な原因です。

手元では、[importlib.find_loader()](http://docs.python.jp/3.3/library/importlib.html#importlib.find_loader) を使って imp.find\_module() 「っぽい」結果を返す関数を書いて誤魔化していますが、一時しのぎのいい加減なコードですので公開は勘弁してください。m(\_\_)m
UINavigationController resignFirstResponderでキーボードが閉じない場合の対処法


UINavigationControllerをUIModalPresentationFormSheetで表示している時にポップ時や`resignFirstResponder`を明示的に呼んでもキーボードが閉じない場合の対処法です。
バグではなく[仕様](https://devforums.apple.com/message/166801#166801)のようです。

## 対処法

UINavigationControllerで

```objectivec:
- (BOOL)disablesAutomaticKeyboardDismissal
```
をオーバーライドしNOを返せばポップ時や`resignFirstResponder`でキーボードを閉じることができます。

UIViewControlelrで宣言されているので(カテゴリで宣言されていないので)UINavigationControllerのカテゴリでオーバーライドしても問題はないです。
個別で対応が必要な場合はサブクラスで対応すればよいかと思います。

```objectivec:UINavigationController+KeyboardDismiss
@implementation UINavigationController(KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

@end
```

## 参考
http://stackoverflow.com/questions/3372333/ipad-keyboard-will-not-dismiss-if-modal-view-controller-presentation-style-is-ui