OmniAICreator/Qiita-1.07M huggingface dataset:
ライブドア・ブログ投稿

AtomPubという埃のついた技術の煤払いをしました。

```ruby:livedoor_blog_atompub.rb

#!/usr/bin/env ruby -Ku
#coding: utf-8
require 'rubygems'
require 'net/http'
require 'wsse'
require 'base64'
require 'stringio'
require 'pp'
class LivedoorBlogAtomPub
    # livedoor のブログの細かい仕様は http://help.blogpark.jp/archives/52288925.html
    def initialize(login_id, atompub_key, blogid )
        @username, @password, @blogid = [login_id, atompub_key, blogid]
        @server_host_name = "livedoor.blogcms.jp"
    end

    def service()
        #サービスの全般：WSSE認証のチェックに使う。
        response = self.http.get('/atom/service',{'X-WSSE' => WSSE::header(@username, @password )})
        response.body
    end

    def atom()
        #エントリ取得    
        http = Net::HTTP.start(@server_host_name)
        response = http.get("/atom/blog/#{@blogid}/article",{'X-WSSE' => WSSE::header(@username, @password )})
        response.body
    end

    def post_entry(title,content,categories=[],draft_flag=false)
        #エントリをAtomのXMLで作成 
        xml = entry(title, content,draft_flag,categories) #委譲
        #エントリポストする。
        #puts xml;exit
        http = Net::HTTP.start(@server_host_name)
        response = http.post("/atom/blog/#{@blogid}/article", xml, {'X-WSSE' => WSSE::header(@username, @password )})
        puts response.body
    end
    def entry(title, body,draft_flag=false,categories=[],body_more=nil,private_more=nil,tags=nil)
        #todo 引数を キーワード引数にする。
        cat_name = nil
        draft = draft_flag ? "yes": "no" #下書き
        out = StringIO.new
         out.puts "<entry xmlns='http://www.w3.org/2005/Atom'"
         out.puts "    xmlns:app='http://www.w3.org/2007/app'"
         out.puts "    xmlns:blogcms='http://blogcms.jp/-/spec/atompub/1.0/'>"
         out.puts "    <title>#{title}</title>"
         out.puts "    <id>tag:example.org,2003:3.2397</id>"  if tags
         out.puts "    <updated>#{Time.now.iso8601}</updated>"
         out.puts "    <published>#{Time.now.iso8601}</published>"
         out.puts "    <author><name>purururuh</name></author>"
         out.puts "    <category scheme='http://livedoor.blogcms.jp/blog/#{@blogid}/category' term='#{cat_name}' />" while cat_name = categories.pop
         out.puts "    <blogcms:source>"
         out.puts "        <blogcms:body><![CDATA[<p>#{body}</p>]]></blogcms:body>"
         out.puts "        <blogcms:more><![CDATA[<p></p>]]></blogcms:more>"        if body_more
         out.puts "        <blogcms:private><![CDATA[<p></p>]]></blogcms:private>"  if private_more
         out.puts "    </blogcms:source>"
         out.puts "    <app:control>"
         out.puts "        <app:draft>#{draft}</app:draft>"
         out.puts "    </app:control>"
         out.puts "</entry>"
         out.string
    end
end


# cli = LivedoorBlogAtomPub.new("blog_id","wsse_token", "blog_id")
# #puts cli.service
# #puts cli.atom
# puts cli.post_entry("test from ruby", "hello ruby atom pp world",["test_category"])



```
if elseif が連続し ||(論理和)が頻出する時はswitchが使えるかも知れない

プログラミングをしていると稀によくあるのが次のような `if` `else if` が連続する場面。特に || (論理和) が入ってくると何が何やら訳がわからなくなる。

```js
if (A && B || C) {
  //1
} else if (D) {
  //2
} else if (E || F) {
  //3
} else {
  //4
}
```

論理式の横方向の位置を揃えるのが難しいのでコードの見た目的にも酷いことになりがち。こういう時は `switch` を使って次のように書ける

```js
switch (true) {
case A && B:
case !!C:
  //1
  break;
case !!D:
  //2
  break;
case !!E:
case !!F:
  //3
  break;
default:
  //4
}
```

仕組みはいたって簡単で `switch(true)` なのでラベルが `true` ならよい。なので `C` のようBooleanじゃない可能性がある場合 `!!C` のようにして Boolean に変換してやる必要がある。
いっそのこと全てのラベルを `!!(expr)` で装飾してしまうのもありか。

これを使えば一見複雑怪奇な `if` 文もあっさりと理解しやすくなる、、、かも知れないけど、やっぱり普通の無理に一つの論理式にしない方がいいと思う。

```js
if (A && (B || C) || D || (E || (F && G)) || H) {
  //
}

switch(true) {
case !!(A && (B || C)):
case !!D:
case !!(E || (F && G)):
case !!H:
  //
}

a = A && (B || C);
b = E || (F && G);
if (a || D || b || H) {
  // これのほうがよさそう
}
```

ちなみに、最後のやつは本質的には上の２つと挙動が異なる。それは `b` に代入するときに `E || (F && G)` が評価されている点だ。もし `a` が真なら本来は評価されないはずのものが評価されてしまっている。仮に `b` がかなり重たい処理を含むとするとパフォーマンスの低下につながらないとはいいきれない。もしくは何かしらの破壊的な変更を含む場合は、最後の方法をとることはできない。

以下は論理的に同じだけど冗長過ぎる気がする

```js
if (A && (B || C)) {
  // 全て
} else if (D) {
  // 同じ
} else if (E || (F && G)) {
  // 処理を
} else if (H) {
  // 行う
}
```
ローカルで一気に階層の深いディレクトリを作成する


何らかの理由で階層の深いディレクトリが必要な時、一気にディレクトリを作成する方法。

``` DOS:mac
$ cd (該当ディレクトリ※)
$ mkdir -p abc/def/ghi
```

``` DOS:windows
C:¥xxx¥xxx> cd (該当ディレクトリ※)
C:¥xxx¥xxx> mkdir abc¥def¥ghi
```

※該当ディレクトリに移動する際、「cd」コマンドで移動しますが、現在位置からいちいち指定するのは面倒なのでショートカットができます。

macもwindowsもフォルダアイコンをドラッグ&ドロップでターミナル(コマンドプロンプト)にもってくることもできます。
各文字のUnicode Code Pointを表示する

```ruby:disp_ucp.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

ARGV[0].split(//).each do |ch|
  puts "#{ch} [U+#{ch.unpack('U').first.to_s(16)}]"
end
```

```bash
$ ruby disp_ucp.rb プログラミング知識を共有しよう。
プ [U+30d7]
ロ [U+30ed]
グ [U+30b0]
ラ [U+30e9]
ミ [U+30df]
ン [U+30f3]
グ [U+30b0]
知 [U+77e5]
識 [U+8b58]
を [U+3092]
共 [U+5171]
有 [U+6709]
し [U+3057]
よ [U+3088]
う [U+3046]
。 [U+3002]
```
laravel3：Eloquentのデータをキャッシュ（未完全）

Perl の DBIC みたいに cache_for とかで データをキャッシュしたいな～と思ったので Eloquentを拡張してみました。

つまりこんな感じでキャッシュできるといいなー
$books = Books::with('Authors')
       ->where('is_enabled','=',1)
       ->cache_for(100)
       ->get();


```eloquent_plugin_model.php
class EloquentPluginQuery extends Laravel\Database\Eloquent\Query {
  protected function query()
  {
    return new EloquentPluginQuery($this); 
  }
}
```
```eloquent_plugin_query.php
class EloquentPluginQuery extends Laravel\Database\Eloquent\Query {
    private $cache_time = 30;
    private $is_cached = 0;
    
    public function get($columns = array('*'))
	{
        if (is_null($columns)) $columns = array('*');
        $cached_key = $this->generate_cached_key(__FUNCTION__,$columns);
        
        if ( $this->is_cached and Cache::has( $cached_key ) ) 
            return unserialize( Cache::get( $cached_key ) );
        
        $value =  parent::get($columns);
        Cache::put( $cached_key ,serialize($value) ,$this->cache_time ) ;
        return $value;
	}
	
    public function paginate($per_page = null, $columns = array('*'))
	{
        if (is_null($columns)) $columns = array('*');
        $cached_key = $this->generate_cached_key(__FUNCTION__,$columns,$per_page);
        
        if ( $this->is_cached and Cache::has( $cached_key ) )
             return unserialize( Cache::get( $cached_key ) );
        
        $value =  parent::paginate($per_page,$columns);
        Cache::put( $cached_key ,serialize($value) ,$this->cache_time ) ;
        return $value;
	}
	
    public function first($columns = array('*'))
	{
        if (is_null($columns)) $columns = array('*');
        $cached_key = $this->generate_cached_key(__FUNCTION__,$columns); 
        
        if ( $this->is_cached and Cache::has( $cached_key ) )
            return unserialize( Cache::get( $cached_key ) );
        
        
        $value =  parent::first($columns);
        Cache::put( $cached_key ,serialize($value) ,$this->cache_time ) ;
        return $value;
	}
	
	private function generate_cached_key( $method , $columns,$per_page=0 )
	{
        
        $t          = $this->table;
        $t->select($columns);
        $sql        = $t->grammar->select($t);
        $bindings   = serialize($t->bindings);
        $page       = Input::get('page', 1);
        $cached_key = "$method|$sql|$bindings|$page|$per_page";
        return md5($cached_key);
        
       }
	public function cache_for($time=null)
	{
          if ($time) $this->cache_time = $time;
          $this->is_cached = 1;
	  return $this;
	}

}
```
モデルを以下に変更
class Books extends Eloquent {....}
↓
class Books extends EloquentPluginModel {....}

これで cache_for()を使えるようになるので キャッシュがあれば そちからか なければ SQLを発行するようになります。

ただ、withでrelationテーブルを指定するとデータ自体はリレーション先までキャッシュされてるけど、実際 テンプレート上で $book->author->first()->author_name とかするとSQL発行されちゃうので キャッシュされたデータは  $books['relationships']を参照する必要がでてきちゃう。

$book->author->first()->author_name できるように relation関連のソースも拡張すれば可能かもしれないけど 今回は面倒なのでやめちゃいました。

どなたかもっとよい方法あれば教えてください<(_ _)>
Emacsでリファクタリングに超絶便利なmark-multiple (複数行同時編集)

テキストを選択 → 同時に変更したい箇所を追加 → テキストを編集すると → 選択した箇所も一緒に書き換え！・・が出来るようになります。変数名の一括変換等に便利です。

[Emacsでリファクタリングに超絶便利なmark-multiple (複数行同時編集)](http://d.hatena.ne.jp/tuto0621/20121205/1354672102)
gitサブコマンドgit-dailyをインストールしました


[@ohataken](https://twitter.com/ohataken "ken ohata (ohataken)さんはTwitterを使っています")です。

git-dailyとは、天下のGREE様がもたらされたgit-flowライクなgitサブコマンドです。

[Git で日々の共同作業やリリース作業をサポートする git-daily を作りました | GREE Engineers' Blog](http://labs.gree.jp/blog/2011/05/3528/ "Git で日々の共同作業やリリース作業をサポートする git-daily を作りました | GREE Engineers' Blog")

[sotarok/git-daily](https://github.com/sotarok/git-daily "sotarok/git-daily")

# 長い前置き

僕のチームは、プログラマー(俺)、デザイナー、マネージャーという普通の三銃士構成です。Webアプリを作っています。

立ち上げ期はタスクを機能毎に切れる状況ではないのでmasterにコミットしまくっていたのですが、リリースが近づいてきてmaster, hotfix, development, releaseといったブランチ戦略をとりたいと考えgit-flowをまず検討しましたが、なんか重い気がする。

ということであれこれさがしていたらgit-dailyに出会いました。なんとなくgit-flowに感じていた違和感が上記のGREEエンジニアブログに問題点として代弁されてしまったので読んでてすっきりする程でした。

具体的には、チームの人数が少ないし、同じブランチで複数人が作業するし、リリース間隔短いし、という点がまさにぴったりきました。

# 短いインストール手順
この手順はMac向けです。このgit-dailyはphpで書かれているそうなので、Mac標準のものでいいかなぁと思っていましたがpearを使うそうなので、brewでユーザーディレクトリ以下にインスコすることにしました。

[(Re)installing PHP on Mac OS X — justin hileman dot info](http://justinhileman.info/article/reinstalling-php-on-mac-os-x/ "(Re)installing PHP on Mac OS X — justin hileman dot info")

↑主に参考にしたbrewでphpをインスコする記事。この記事は上記リンクのマッシュアップコピペです(ｷﾘｯ)

>brew tap homebrew/dupes
>brew tap josegonzalez/homebrew-php
>brew install php54 --with-mysql --with-intl
>
>// Fix PEAR permissions
>chmod -R ug+w `brew --prefix php54`/lib/php
>pear config-set php_ini /usr/local/etc/php/5.4/php.ini
>
>// Fix PEAR config and upgrade
>pear config-set auto_discover 1
>pear update-channels
>pear upgrade

[bobthecow's gist: 85ad6dfb594d9215b42b — Gist](https://gist.github.com/85ad6dfb594d9215b42b "bobthecow's gist: 85ad6dfb594d9215b42b — Gist")

UPDATED: php.iniでtimezoneの設定をしないとgit-dailyが警告出してくるし、UTC時間になっちゃうよ？

    $ vim /usr/local/etc/php/5.4/php.ini

> date.timezone="Asia/Tokyo"

これでPHPとpearの導入おわり。つぎにgit-dailyのインスコ。

    $ pear channel-discover openpear.org
    $ pear install openpear/Git_Daily

おしまい。使い方はgithubのreamdeを見てね。

使用感とか、チームで導入してみたアレとかは後日書きます。
javascriptでサブドメインに使える文字列か判定する

幾つかの条件をjsで判定

```javascript
function validSubDomainP(subdomain) {
    if (subdomain.length < 3 || subdomain.length > 63) {
        return false;           // too long or too short
    }
    else if (!subdomain.match(/^[a-zA-Z0-9\-]+$/)) {
        return false;           // container illegal characters
    }
    else if (subdomain.match(/(^-|-$)/)) {
        return false;           // begins with - or ends with -
    }
    else if (subdomain.match(/^[a-zA-Z][a-zA-Z]--/)) {
        return false;           // xx-xxxx is not permitted.
    }
    else {
        return true;
    }
};
```
iOSシミュレータをGalaxySにする方法

タイトルで出落ちですが、iOSシミュレータの枠の画像を変える小ネタです。
結果から言うと、シミュレータのパッケージの中身にframe.pngがあったので差し替えればできます。
![simulator_image](https://dl.dropbox.com/u/2896915/pict/462153144.png)

シミュレータを起動させ、右クリックの”Finderに表示"からシミュレータアプリがあるディレクトリにアクセスします。

![simulator_image2](http://blog.objc.jp/wp-content/uploads/2011/12/192b9f5d86ea8e113a064f6563230afd.png)

シミュレータの場所は標準であれば
`/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications`
にあると思います。

アプリを右クリックして、パッケージの中身をFinderで開きます。
`/Contents/Resource/frame.png`を差し替えればOKです。
バックアップは忘れずに取っておいてください。
![simulator_image3](http://blog.objc.jp/wp-content/uploads/2011/12/62e49b87b6be66d39f709cca659113e4.png)


これを利用すると簡単に痛iOSシミュレータとかできちゃいますね。

あれ？でも、これObjective-C関係なくね…？
コマ大数学科「入社試験に挑戦」に挑戦

読売新聞社の入社試験問題より。A～Eの発言から順位を導き出す（ただし1人だけ嘘つきがいる）。

```c#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace KomaUniv
{
    static class Ex
    {
        public static IEnumerable<IList<T>> Permutation<T>(
            this IList<T> source, int count)
        {
            return PermutationRec(source, count, new List<int>(),
                Enumerable.Range(0, source.Count).ToList());
        }

        private static IEnumerable<IList<T>> PermutationRec<T>(
            IList<T> source, int count, List<int> indices, List<int> candidates)
        {
            if (count == indices.Count)
            {
                yield return indices.Select(x => source[x]).ToArray();
                yield break;
            }
            for (var i = 0; i < candidates.Count; i++)
            {
                var v = candidates[i];
                candidates.RemoveAt(i);
                indices.Add(v);
                foreach (var l in PermutationRec(source, count, indices, candidates))
                    yield return l;
                indices.RemoveAt(indices.Count - 1);
                candidates.Insert(i, v);
            }
        }

        public static Func<T, bool> And<T>(this Func<T, bool> p1, Func<T, bool> p2)
        {
            return x => p1(x) && p2(x);
        }

        public static Func<T, bool> Or<T>(this Func<T, bool> p1, Func<T, bool> p2)
        {
            return x => p1(x) || p2(x);
        }

        public static Func<T, bool> Not<T>(this Func<T, bool> p)
        {
            return x => !p(x);
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            var all = new[] { 1, 2, 3, 4, 5 }
                .Permutation(5)
                .Select(x => new { A = x[0], B = x[1], C = x[2], D = x[3], E = x[4] });
            var a = Predicate(all, x => x.C < x.A && x.D < x.A);
            var b = Predicate(all, x => x.D < x.B && x.B < x.A);
            var c = Predicate(all, x => x.C < x.D && 2 < x.C);
            var d = Predicate(all, x => x.C < x.D && x.D < x.B);
            var e = Predicate(all, x => x.E == 1);
            var result = all.Where(
                    ((a.Not()).And(b).And(c).And(d).And(e))
                    .Or(a.And(b.Not()).And(c).And(d).And(e))
                    .Or(a.And(b).And(c.Not()).And(d).And(e))
                    .Or(a.And(b).And(c).And(d.Not()).And(e))
                    .Or(a.And(b).And(c).And(d).And(e.Not()))
                ).First();
            Console.WriteLine(result.ToString());
        }

        static Func<T, bool> Predicate<T>(IEnumerable<T> dummy, Func<T, bool> pred)
        {
            return pred;
        }
    }
}
```
UEC休講情報APIライブラリ

UECの休講情報をRubyで簡単に取得出来るgemを作成しました。

[ここから](http://kyoumu.office.uec.ac.jp/kyuukou/kyuukou.html)取ってきてます。

今は学部の情報しか取ってきてないですが、近いうちに大学院のものも取得出来るようにします。

[RubyGems](https://rubygems.org/gems/uec_express_api)

##使い方

###インストール
```インストール
$ gem install uec_express_api
```

###簡単な使い方
```ruby
require 'uec_express_api'       
                                                                                                                                                             
uec_express = UECExpressApi.new()
uec_express.to_s
puts uec_express.to_json
```

これを実行すると、休講情報が成形した物と、json形式の物が表示されます。

###sinatraの例

```ruby
require 'uec_express_api'
require 'sinatra'

get '/' do 
    uec_express = UECExpress.new()
    content_type :json, :charset => 'utf-8'
    uec_express.to_json
end
```

これでsinatra実行すると、json形式で休講情報が取得出来ます。

##ソースコード
[github](https://github.com/henteko/uec_express_api)

pull requests待ってます!!

##公開にあたり参考にしたサイト
[ここ](http://sho.tdiary.net/20120218.html#p02)参考にしました。
`r`コマンドと言えば、統計だよねという全ての人のために - zshデフォルトの`r`コマンドをオフにする方法



他のshと比べ、いろいろ素晴らしい機能を提供してくれるzsh先生ですが、実は一つだけお節介挙動をします。

それは、以前に実行したコマンドを入力するという`r`というコマンドをデフォルトで定義してくれちゃっているということです。
具体的には、

- `r`で最後に実行したコマンドを実行(= `!!`)
- `r vi`で最後に実行した`vi`コマンドを実行(= `!vi`)

ということをしてくれます。

でもこれ本当に必要ですか？？

- 最後に実行したコマンド: `↑` → `Enter`
- 最後に実行した`vi`コマンド: `Ctrl+r` → `vi`と入力 → `Enter`

で十分だし、もし、shスクリプトに書くならbashでも動くように`!`を使った記法を使ったほうがいいように思えます。


そして何より、`brew`(`apt-get`, `yum`)等で[R](http://www.r-project.org/)をインストール

```
brew install homebrew/science/r
```

しても、統計ソフトのRが起動しなくなってしまいます！！
（しかも、意図せずに、以前のコマンドが実行されると、何が起こったのか分からなくて焦ります...）

この挙動の必要無さに共感してくれた人は、いますぐ`.zshrc`に

```.zshrc
disable r
```

と書いてください。これだけで、この挙動をオフにできます。

それでは`r`と打ったら[統計処理言語R](http://www.atmarkit.co.jp/fcoding/articles/stat/01/stat01a.html)が起動する世界をお楽しみください。
iOS Safari/WebView にも :hover はある


前々からクリック時に `:hover` のスタイルが出たりするなあと思ってたのですが [iOS has a :hover problem | NCZOnline](http://www.nczonline.net/blog/2012/07/05/ios-has-a-hover-problem/) を読んで、すっきりしました。

iOS の Safari/WebView で、`:hover` でスタイル変わるリンクをタップした場合、一旦 `:hover` 時のスタイルが表示されてからリンク先のページへ飛びます。

ただし `:hover` によって要素が消えたり現れたりする場合（`visibility` または `display`）、一度のタップでは次のページへ行かず、`:hover` のスタイルのまま止まるようです。そして、もう一度タップすると、リンク先のページへ飛びます。

[Apple のドキュメント](http://developer.apple.com/library/IOs/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW4) によると、タップの際に `mouseover, mousemove, mousedown, mouseup, click` の順でイベントが発生するが、`mouseover, mousemove` のところでコンテンツに変化があると、それ以降のイベントは発生しないとのこと。

回避するには Modernizr による `.no-touch` を使う方法などがあるようですが、この挙動を意図的に使うこともできそうです。
pry/irbの`_`

pryやirbで何か処理を実行したとき，結果を変数に代入し忘れたときに使う．以下pryでの実行例

```bash
[1] pry(main) > User.find_by_url_name('yaotti') # 本当はuser = User.find_by... としたかった
=> #<User id: 1, url_name: "yaotti", ...>
[2] pry(main) > user = _
=> #<User id: 1, url_name: "yaotti", ...>
```

[Special Locals · pry/pry Wiki](https://github.com/pry/pry/wiki/Special-Locals)を読めば他の特殊変数も全部載ってるけど，`_`が一番便利．


## その他pry関連でおすすめ記事
pryの基本: [ググるよりもまずはpry](http://qiita.com/items/2b36068cdf2e40e75c2d)
[awesome_print を pry の表示のデフォルトに使う](http://qiita.com/items/d75d7c3953faa34a1f0e)
[pryを使った快適なRubyライブラリのコードリーディング&開発方法 #開発環境](http://qiita.com/items/b7b1a304815addf150b2)(未だにストッックされ続けている記事．pryのedit-methodは本当に便利)
Heroku にある Git リポジトリを楽に remote に設定する

Heroku Advent Calendar (がもしもあったらそちら) に投稿するような内容だと思いますが，無かったので Git ネタということで．

# 複数マシンから 1 つの Heroku で動くアプリを開発する

まず，何かしらのアプリをある 1 台のマシン (例えばデスクトップ PC) で作成します．

それを Git リポジトリとして Heroku のサーバに push します．それにより deploy が行えるのが Heroku の大きな特徴の一つだと言えます．

さて，最初に push する人は，Heroku 上にアプリを作る作業を行いますから，

```
heroku create APPNAME
```

を行うと思います．するとこのコマンドが自動的にリモートリポジトリとして `heroku` という名前で `git@heroku.com:APPNAME.git` を登録してくれます．なので，この後は

```
git push heroku master
```

としてやるだけで deploy が出来るのですね．この辺りは Heroku 入門的なチュートリアルでよく見るところだと思います．

ここで，別のマシン (例えばノート PC) でこのアプリの開発と deploy を引き続き行いたくなったとします．

まず，先ほどのマシンを参照するなり Github や Bitbucket や自前の gitosis 等を参照したりするなりして，リポジトリを clone してくると思います．すると，リモートリポジトリとして `heroku` が登録されていません．なので

```
git remote add heroku git@heroku.com:APPNAME.git
```

をする必要があります．これが面倒だからと言って

```
git clone git@heroku.com:APPNAME.git
```

すると，今度は `origin` が `git@heroku.com:APPNAME.git` になって何だか変な気分です．

# いちいちリポジトリの URI を打ち込むのは面倒だ

今まで自分はずっと `git remote add heroku ...` をしていたのですが，先日こんなことをしなくてもいいんだと `heroku help` を見ていて気付きました．

サブコマンド `git` です．

```
heroku git:remote --app APPNAME
```

Github なり何なりから clone してきたリポジトリ内で，このコマンドを走らせるだけでリモートリポジトリ `heroku` が登録されます．

また，Heroku からまず第一に clone するのであれば，

```
heroku git:clone APPNAME
```

すると，`APPNAME` ディレクトリが作られそれがリポジトリになっていて，やはりリモートリポジトリ `heroku` が登録されています．`origin` はありません．

これは楽でいいですね．

# heroku git のその他機能

* clone するときにディレクトリ名を変えたい → `heroku git:clone APPNAME DIRNAME`
* リモートリポジトリ名を heroku 以外 (例えば staging) にしたい → `heroku git:remote APPNAME -r staging`

まぁ，

```
heroku help git
heroku help git:remote
heroku help git:clone
```

を見れば大体分かります．

# 実装はどうなっているのか

いちいち `git remote add heroku ...` しなくてよくなったのはいいですが，実際このコマンドはどうやって実現されているのでしょうか？

* git:clone の方

https://github.com/heroku/heroku/blob/2b67489173464420248c61c88ee98ee628067988/lib/heroku/command/git.rb#L31

* git:remote の方

https://github.com/heroku/heroku/blob/2b67489173464420248c61c88ee98ee628067988/lib/heroku/helpers.rb#L110

…普通に git コマンドの文字列を作って実行しているだけですね．安心です．

ここのソースコードを読んで勉強するべきなのは，むしろ `git:clone`, `git:remote` を `heroku` コマンドの引数で与えると，どのようにして関数を呼び出すところに到達するか，だと思います．

# バージョン情報

今回確認に使った環境・ツールのバージョンは以下の通りです．

* Ruby 1.9.3-p194
* Heroku Toolbelt 2.33.6
* OS
 * Ubuntu 12.04 amd64 Desktop
 * Mac OS X 10.7.5

# 参考

* https://devcenter.heroku.com/articles/clone-heroku-app
TortoiseHgのファイルビューをもう少し改造してみる

http://qiita.com/items/940cab68f7e112af249f の続きです。

##やりたいこと
Google ChromeやPyCharmなんかで検索を行うと、どの辺にヒットしたキーワードがあるのか、マーカーで教えてくれます。

こんな感じ。これはChromeじゃなくてIronですが。
![Iron search](http://gyazo.com/7b48422cc1e60ee56ebebde8da24bc44.png)

この機能が、TortoiseHgにも欲しいなあと。
<ステマ>**ちなみにTortoiseBzrにはもうありますよ。**</ステマ>

##やったこと
とりあえず、先日のネタで手を入れたBlockListクラスが、ほぼそのまま使えそうです。
Chromeとかに倣って、ファイルビューの右側に配置するようにしましょう。
ということで、こんな感じになりました。
![thg-fileview](http://gyazo.com/ded2bae9dbcc477edd02016980d440a8.png)

ソースはこちらです。 https://bitbucket.org/iwata0303/thg/commits/d8452bd98690ab2f939164358976ff68
TortoiseHgのコードでは丁寧にSIGNAL/SLOTが定義されているので、この手の拡張はし易いですね :)

##エクステンション化
さて、先日のやつと同じように、この機能をプラグインで実現してみます。自分でTortoiseHgビルドするの面倒ですしね。
前回は、BlockListクラスに実行時にメソッドを追加するという方法で実現したんですが、今回は修正箇所がいくつかに分かれていますし、既存のメソッドにも修正が入っているので、それはちょっと面倒です。
この際、クラスごと差し替える方が早そうです。バージョンアップのときの対応もその方が楽ですし。

手順は、こんな感じです。

1. 適当な場所に、`thg-ext` というフォルダ(名前は何でもいいですが)を作る。
2. そのフォルダに、今回変更したファイル(`blockmatcher.py` 、`qscilib.py`、`fileview.py`)を放り込む。
3. `__init__.py`  というファイルを、以下の内容で同じフォルダに作成する。

```python:__init__.py
# -*- coding: utf-8 -*-
import sys
import os

def extsetup():
    # TortoiseHgから起動された時だけ動くようにする
    if not os.path.basename(sys.argv[0]).startswith('thg'):
        return
    
    # qscilib.Scintillaを置き換える
    from tortoisehg.hgqt import qscilib
    from .qscilib import Scintilla
    qscilib.Scintilla = Scintilla
    # blockmatcher.BlockListを置き換える
    from tortoisehg.hgqt import blockmatcher
    from .blockmatcher import BlockList
    blockmatcher.BlockList = BlockList
    # fileview.HgFileViewを置き換える
    from tortoisehg.hgqt import fileview
    from .fileview import HgFileView
    fileview.HgFileView = HgFileView
```

ちなみに、`Scintilla` → `HgFileView` という置き換えの順番は重要です。HgFileViewはScintillaを継承しているので、先にHgFileViewの方をロードしてしまうと置き換え前のScintillaを使ってしまうんですね。

4.`mercurial.ini` や `hgrc` 内で、`thg-ext` フォルダのパスをエクステンションとして登録する。

```ini:mercurial.ini
[extensions]
thgext = C:\Work\thg-ext
```

で、めでたく検索マーカー機能が動きました :)
動的言語はフリーダムでいいですねえ。プラグイン機構を用意する側からすると悩みの種ですがｗ
Rails 3.X 以降?の migration で insert() が id を返すようにする

Rails 2.X までのころ、というか、たぶん `arel` 以前の ActiveRecord のときは、 migration で普通に

~~~
id = insert("INSERT groups (name) VALUES ('hoge')")
update("UPDATE users SET group_id = #{id}")
~~~

みたいなことできたのですが、 Rails 3.2.8 でコレやったら `id` が `nil` で途方に暮れましたが、モデルで `cerate` するときにどうやってるのか追っかけたら、

~~~
id = insert("INSERT groups (name) VALUES ('hoge')", "SQL", "id")
update("UPDATE users SET group_id = #{id}")
~~~

のように `ActiveRecord::ConnectionAdapters::DatabaseStatements#insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])` の `pk` に "id" を与えれば id の値が返ってくることがわかりました。
SublimeText2でUnity開発するまでに必要なプラグイン集


Unityのスクリプトエディタと言えば[Monodevelop](http://monodevelop.com/)です。
高機能で、コード補完も抜群。デバッグも出来ちゃう。言う事なし！

と言いたいのですが、私達が使うにあたって色々不便なところもあります。

**MacユーザーなのでほぼMacのことしか書きません…**

* 日本語が打てない
 
	Unityに付属しているMonodevelopは日本語が打てません。どっかのテキストからコピペして貼り付けることはできます。


* 日本語が文字化けする

	普通に使ってると日本語をスクリプト内に埋め込んでも、表示の時に文字化けをします。この解決策はあります。MacとWindowsで少し違うところもありますが、詳しくは「[Unity Monodevelop 日本語](https://www.google.co.jp/#hl=ja&safe=active&tbo=d&output=search&sclient=psy-ab&q=Unity+Monodevelop+%E6%97%A5%E6%9C%AC%E8%AA%9E&oq=Unity+Monodevelop+%E6%97%A5%E6%9C%AC%E8%AA%9E)」でググるといっぱい検索に引っかかります。皆さん苦労してます。ちなみにこの日本語文字化けはSublime Text 2を使用しても起こるので注意が必要です。


* 重い

	Unityだけでも重いというのに

そこでUnity開発者の皆さんは他のエディタに目を向け始めました。その中の1つが「Sublime Text 2 (以下ST2)」です。

> Unity Forumのスレッドは[こちら](http://forum.unity3d.com/threads/128352-Using-Unity-with-Sublime-Text-2-\(How-to-get-everything-set-up\)/page4)

今回はST2がいかに素晴らしいかという話よりも、みなさんがネット上でST2の素晴らしさを知り、ST2をUnityでも使いたいと思った時に手助けをする話をします。まぁぶっちゃけプラグイン集です。

##CompleteCharp

C#の補完プラグインです。dllを読みこませるだけで補完が出来ます。Install Packageからインストールして下さい。
インストールした後は[ここ](http://qiita.com/items/a33388572990932bba87)を参考にしてみて下さい。

##Unity3D Build System
ST2でスクリプトのビルドが出来るプラグインです。Install Packageからインストールして下さい。
Tool -> Build SystemをUnityに設定すると、⌘Bでビルドが出来るようになります。ビルドした結果はST2のコンソールに表示されるので便利です。


-
-
-


あれっ、Unityに特化して考えたら2つしか思いつかんかった…。なのでここからはUnityに限らず便利(そう)なプラグイン

##SublimeLinter

文法チェックを行うプラグイン。Install Packageからインストールして下さい。
Unityでも使いたいけど、ぐぐってみても未だ満足には行かない感じがしたので触ってないです。

##SublimeAStyleFormatter

コードフォーマットを行うプラグイン。Install Packageからインストールして下さい。
これを保存時に自動的にフォーマットするmikamikuh様の[AutoRunner](http://qiita.com/items/bfa1c8067fa3bb71e52d)が素晴らしいです。


結局4つしか思い浮かばんかった… 他にもググると定番のプラグインがゴロゴロ出てくるので探してみるといいかもしれません。
NGUIでのA8フォントの使い方

A8とは「アルファ8bitのみの情報を持ったテクスチャ形式」のこと。フォントに使うテクスチャにはRGB値がいらないことが殆どなので、A8にしちゃえばサイズの削減になるという手法の紹介。

NGUIで日本語など文字数の多いフォントを使う場合、テクスチャサイズの肥大化に悩まされるかと思います。
ただ、既に対策は用意されていて、PackedFontというやり方があります。
これは、ARGB4チャンネルをA8×4チャンネルとして扱うという方法です。
紹介の記事はUnityの伊藤さんのブログに。http://warapuri.tumblr.com/post/23352109465/ngui
詳細の動画はここで　http://www.youtube.com/watch?v=dY6jQ7d2ius
ただこれを使うと、どうも文字の縁取りや影（OutlineやShadow）には非対応になってしまうらしい。
NGUIのサポートフォーラムではソースコードの改変での解決方法が載ってますが、どうも公式で対応する気配がない模様。
http://www.tasharen.com/forum/index.php?topic=757.0

そこで、需要があるかわからないですが、もうひとつのやり方の「NGUIでのA8フォント」のやり方をまとめました。

必要なのは下記2点で、ソースコードの改変はしなくてOK
1.A8用のフォントテクスチャの作成
2.A8用の描画シェーダを適用

●A8用のフォントテクスチャの作成
・pngファイル等の作成。
通常の作り方と一緒。
手順は「強火で進め」さんの解説がわかりやすいので紹介。
http://d.hatena.ne.jp/nakamura001/20120910/1347241168
ExportOptionで、「White with Alpha」を選ぶのがコツ。

・テクスチャのインポート設定。
インポート設定は以下のように。上記、Unity伊藤さんのブログの画像を参考に
http://media.tumblr.com/tumblr_m49yqyPTkh1rp3idm.jpg

●A8用の描画シェーダを適用
・簡易的なシェーダ
簡単にやるなら、シェーダは「GUI>Text Sahder」でOK。（Unity4.0で動作確認）
シェーダの中身はこんな感じになってるようだ。
http://wiki.unity3d.com/index.php?title=3DText

・A8用の描画シェーダの作成
さてここからがちょっと問題。
PanelのClipping機能を使う場合、A8用のシェーダを作成しないといけなくなる。
とはいっても、既存のNGUIのシェーダをコピペして少し手を加えるだけでOK。

・Unlit - A8Font.shaderを作成
まずは「GUI>Text Sahder」の代わりにNGUIの「Unlit - Transparent Colored.shader」をコピペして、Unlit - A8Font.shaderを作る。

色の計算部分だけ以下のように書き換えること。

			SetTexture [_MainTex] {
				constantColor (1, 1, 1, 1)
				Combine constant * Primary, texture * Primary
			}

なにをやってるかというと、テクスチャのrgb値を(1,1,1)つまり白色に固定している。
A8のテクスチャには色の情報が0,0,0として扱わてしまい、そのままだと色をつけられなくなってしまうので、白に固定してやる必要がある。

・シェーダをマテリアルに適用
シェーダができたら、マテリアルにはこちらのシェーダをつける。

・Clipping用のシェーダを作成
さて、肝心のClipping用のシェーダ。
Unlit - Transparent Colored (SoftClip)などのシェーダをｺﾋﾟﾍﾟして、
Unlit - A8Font (SoftClip).shaderなどを作る。
ここでの注意点。Clip系のシェーダは命名規則が決まっていて、「基本シェーダ名＋ (SoftClip)」となっている。
NGUIはスクリプト上で、シェーダの名前を作成して動的にクリップ用のシェーダに切り替えるということをやっているので、命名規則が狂うとクリップ用のシェーダが適用されなくなる。

SoftClipのシェーダは上記SetTexture部分の改変のほかに、
フラグメント処理部分（fixed4 frag）のreturnの一行だけ以下のように修正すること。

				return half4(IN.color.rgb, col.a*IN.color.a);


自分はHardClipやAlphaClipを使っていないので作っていないですが、必要であればHardClipやAlphaClipようのA8シェーダも用意すること。
（ちなみにHardClipは、以前一部のAndroidでフリーズしたので使わないようにしてる）

これでサイズを1/4に圧縮して、縁取りや影がつけられるフォントが描画できます。
実際に書くコードの量は殆どないですが、けっこう手順がややこしい。
GreeのLWFプラグインの中には、NGUI用のシステムフォントのスクリプトもあるそうなので、そっちのほうが確実かもしれないです。
個人的には、Unity4.xの新GUIシステムに期待。この手の微妙な面倒くささが早くなくなるといいな。
Python で natural order


```python
import re


def nautural_order_key(s, _split=re.compile(r'(\d+)').split, conv=int):
    it = _split(s)
    it[1::2] = map(conv, it[1::2])
    return it

x = ['hoge99', 'hoge100', 'hoge10']
x.sort(key= nautural_order_key)
print(x)  # ['hoge10', 'hoge99', 'hoge100']
```
resizableImageWithCapInsetsで画像を引き伸ばす


だいぶ前に書いた奴。
過去の投稿で`stretchableImageWithLeftCapWidth`を使った内容を書いたけど、
あのメソッドはdeprecatedになっていたので今後はこのメソッドにお世話になりそうです。

使い方はコード見たほうが早い。

```Objective-C:サンプル
    UIImage *image = [UIImage imageNamed:@"button.png"];
    UIImage *resizeImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)];
    [button setBackgroundImage:resizeImage forState:UIControlStateNormal];
```


センスないやっつけ画像ですが、一応Githubにもあげてます。
https://github.com/niyaty/ResizableImage

実際に動かすとこんな感じ。

![Image](http://cdn-ak.f.st-hatena.com/images/fotolife/n/niyaty/20120702/20120702235457.png "Image")





##余談

画像ははてなにupしてます。
というところで前々から思ってたんだけど、
ブログにUPした画像URLをQiitaに持ってくれば両方に投稿できてお得感満載。

自動で上手くリンクついた状態でブログとQiitaにpostしてくれる、
誰かがそんなプログラム書いてくれると信じてる（無責任
Sublime Text 2 を使ってみる


開発環境としてIntellJを使っているのだが、ちょっとしたテキストファイルの編集には
ずっとvimを使ってきていた。ところが、Sublimeをつかってみたら、Macキーバインドとの
親和性の高さと、設定や拡張のシンプルさに惹かれてしまった。
すごく軽くて、しかも大量のソースコードも素早く検索できるのがすごい。

## まずはインストール
http://www.sublimetext.com/2 からダウンロード

## コマンドラインからの利用
Sublime Text2をコマンドラインから利用するためには、シンボリックリンクを作成すればよい。[参照][1]

```bash

> ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl

```

## 簡単な利用方法
ファイルを開く際は、ファイルを引数に sublコマンド、IDE風にプロジェクトとして開くにはディレクトリを引数に sublコマンドを打つ。

**Cmd-P**で、プロジェクト中のファイルのインクリメンタル検索ができる。これがとてつもなく高速で、数千件のファイルから目的のファイルを瞬時に選べる。いちいちファイルオープンダイアログを開く必要もない。
 
Macで標準的に利用できるEmacs移動キーバインド (Ctrl-n, Ctrl-p, Ctrl-a, Ctrl-eなど) が利用できる。Emacsをちょっとかじったことがあれば使うのに不自由はしない。

## 設定のSync
僕は会社ではMBP, 家ではMBAを使っているので、この2台で使っているSublimeで設定を同期したかった。ぐぐったら、Dropboxに設定ファイル以下を配置してsyncしている人がいて [参照][2]、このやり方をまねすることにした。

1. ~/Library/Application Support/Sublime Text 2/ をDropboxの適当なフォルダに移動
2. 移動先のフォルダを ~/Library/Application Support/Sublime Text 2/ にシンボリックリンクを張る

後は2台目の ~/Library/Application Support/Sublime Text 2/フォルダを削除して、同じようにDropboxのSublime Text 2 フォルダからシンボリックリンクを張れば良い。

## Vintage Mode
Sublime Text 2 には、vimのコマンドモードとキーバインドを模したVintage Modeが存在する。
これはデフォルトではオフになっているが、設定を修正すれば使えるようになる。 [参照][3]

Preferences - Setting - Default を選択して、下記の行を修正する。
```
"ignored_packages": ["Vintage"] 
↑この行を下記に修正↓
"ignored_packages": [""]
```

[1]: http://www.sublimetext.com/docs/2/osx_command_line.html
[2]: http://juhap.iki.fi/misc/using-dropbox-to-sync-sublime-text-settings-across-windows-computers/
[3]: http://www.sublimetext.com/docs/2/vintage.html "Sublimeマニュアル"
iOS6で追加されたUIPageControlのproperty


UIPageControlってあんまり使った事ないんですが・・・。

currentPageを示す白い点と、それ以外の黒い点。
それぞれTintColorが設定可能になったようです。

```Objective-C:UIPageControl
	@property(nonatomic,retain) UIColor *pageIndicatorTintColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;
	@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;
```

まだ試していませんが、これから使うという人は触ってみては如何でしょう。
crypto.getRandomValues

**※2012/12/5現在の仕様です。将来変更される可能性があります。**

chromeでしか動作確認していないのですが、`crypto.getRandomValues`を使うと手軽に乱数を生成できます。本番環境では使えませんが、コンソールを開いていて、急に乱数が欲しいってときに便利です。

## 使い方

```js
// 整数型の型付き配列を用意
var arr = new Uint8Array(10);
// 引数にその型付き配列を入れると全ての要素に乱数が上書きされる
crypto.getRandomValues(arr);
```

## 制限

* 引数に与えられるのは整数型の型付き配列のみ
* その型付き配列の`byteLength`(要素数ではない)は65536以下でないといけない

## 参考

[Web Cryptography API](http://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues)
XMLHttpRequest Level2で異なるドメインへAjax通信する

[あまり知られていないけど役に立つJavascript tips Advent Calendar 2012 参加者リスト - Qiita](http://qiita.com/advent-calendar/2012/javascript-mechanco-tips/participants)の順番が回ってきたので書こうと思います。

さてさて。今回はAjaxの基幹技術であるXMLHttpRequest<small>(以降、XHR)</small>のお話です。これを使って、別ドメインと通信する方法を書いてみます。

### XMLHttpRequest

ご存じの通り、XHRを使うとサーバーとHTTP通信ができますね。この通信は同じドメイン内でしか利用できません。

ところが**XMLHttpRequest Level2**が実装されているブラウザを利用すると、別ドメインのサーバーと通信ができるようになります。

### XHR Level2が実装されているブラウザ

XHR Level2が実装されているブラウザは下記の通りです。

- Firefox
- Chrome
- Safari

### IEとOperaはだめ？

IEは8以降であれば、IE独自の「**XDomainRequest**」を使うことにより別ドメインと通信が可能になります。何でまた独自なんだマイクロソフトさんや・・・。

Operaは・・・諦めましょう(´・ω・｀)

### 使い方

XHR Level2が実装されているブラウザの場合、別ドメインと通信するのは非常に容易です。通常のAjax処理と同じようにするだけで利用できます。

jQueryで言うと、$.ajax({url:[ここを別ドメインのURLにするだけ]}); ですね。

IEの場合は特殊です。

```
var xdr = new XDomainRequest();
xdr.onload = function(){
	alert('Response:' +xdr.responseText);
};
xdr.onerror = function(){
	alert('エラーだよ');
};
xdr.onprogress = function(){};
xdr.open('POST', '送信先URL');
xdr.send({param1:'value1', param2:'value2'});
```

といった具合に記述します。特殊ですね。

### 注意点1

Chrome, Firefox, Safariは通常のXHRと同じくcookieの送信ができますが、**IEだとできません。**<small>※もしかしてできる方法があるのかな・・・</small>

### 注意点2

今回はjavascriptのお話なので深くは書きませんが、別ドメインと通信するには受信サーバー側の設定も必要です。サーバーでは特定のヘッダー(下記)を出力しなくてはなりません。※送信側のヘッダーじゃないよ！

PHPであれば、  

```
header("Access-Control-Allow-Origin: *");  
header("Access-Control-Allow-Methods: GET");  
```

などのヘッダー出力が必要です。  
サーバー側について詳しく知りたい方は、自分のブログ過去エントリーへどうぞ・・・。
[Google App Engineでクロスドメイン通信 | Azrael](http://zafiel.wingall.com/archives/1505)

### 使いやすい

Safari、Chromeが動くということは、AndroidとiPhoneのブラウザで使えるということです。これは嬉しい。スマートフォン用のサイトを使う場合に活用するとVery Goodだと思いますｗ

### まとめ

- Safari, Chrome, Firefox・・・とIE8(ちょっと機能が限られますが)で使えるよ！
- IE以外は通常のAjax処理でOKだよ！
- javascriptだけじゃなく、サーバー側も手をいれないとダメだよ！

いかがでしたでしょうか。結構使いやすそうでしょう？是非これらを利用して、面白いアプリケーションを作ってください！
reportlabでshapeをclipする

CanvasではなくDrawingをクリップするには。

`Path` および `ArcPath` が `isClipPath` というプロパティを持っているのでそれでクリップパス領域を作って `add` すればよい。先にクリップパスを `add` してから中身を追加する。
デフォルトだと `stroke` と `fill` が描画されるので単にクリップしたいだけなら手動で消すこと。

```python:clip.py
from reportlab.graphics.shapes import *

width = 300
height = 200

d = Drawing(width,height)

clip = Path(fillColor=None, strokeColor=None, isClipPath=True)
clip.moveTo(0,0)
clip.lineTo(width,0)
clip.lineTo(width,height)
clip.lineTo(0,height)
clip.closePath()

d.add(clip)
```


同じShapesでも `Rect` なんかだとできない。できたらいいのに。


### 参考資料
- [Graphics and Charts — reportlab 2.4 documentation](http://www.reportlab.com/apis/reportlab/dev/graphics.html)
たくさんのファイルを削除する

たくさんファイルを作りたくて

```zsh:create_files
$ for i in {000001..900000} ; do ;
echo "hello" > "test${i}.txt"
; done
```

を実行した。間違ってホームディレクトリで実行してしまったのでディレクトリごと消すわけにもいかず、

```zsh:rm_0
$ rm *.txt
zsh: 引数リストが長すぎます: rm
```

だし、

```zsh:rm_1
$ for i in {000001..900000} ; do ;
rm "test${i}.txt"
; done
```

も一時間くらい経っても処理が始まらない。

```zsh:rm_2
$ find . -maxdepth 1 -name "test*.txt"  | xargs rm
```

で削除することができた。処理時間もすごく短かった。
rails console (や irb) でデバッガを使って gem とかの挙動を確認する方法 

rails だったら、まずは Gemfile の `gem 'debugger'` を有効にする。

~~~
$ rails c --debugger
> debugger
(rdb:1) b path/to/code:line
(rdb:1) c
> User.where(:id => 1).first
~~~

irb のときは、

~~~
$ irb -rubygems -rdebugger
> debugger
~~~

要は debugger コンソールでブレークポイントを設定してから c (continue) で抜けてからコードを実行する。
debugger 内でコードを実行してもブレークしない。

例:

~~~
$ rails c --debugger
> debugger
(rdb:1) b ~/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:663
Breakpoint 1 file /Users/hiroshi/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb, line 663
(rdb:1) c
> User.where(:id => 1).first
Breakpoint 1 at /Users/hiroshi/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:663
[658, 667] in /Users/hiroshi/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb
   658        def substitute_at(column, index)
   659          Arel::Nodes::BindParam.new "$#{index + 1}"
   660        end
   661  
   662        def exec_query(sql, name = 'SQL', binds = [])
=> 663          log(sql, name, binds) do
   664            result = binds.empty? ? exec_no_cache(sql, binds) :
   665                                    exec_cache(sql, binds)
   666  
   667            ret = ActiveRecord::Result.new(result.fields, result_as_array(result))
/Users/hiroshi/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:663
log(sql, name, binds) do
~~~

いつものようにもっとキレイなやり方ありそうなので知ってる人は教えてください。
JSのテストファイルを複数のブラウザで開いて手軽に確認する

#背景

- JavaScriptのテスト・ツールである [Qunit](http://qunitjs.com/) を使ってテストを書いた
- できれば複数のブラウザでテストを実行して確認したい
- でもいちいちブラウザを操作して回るのは面倒くさい
- ブラウザは互いに重なり合わずに並んで欲しい（でないと結果が見れない）

これをコマンド一発でできるようにする

#どうなったか

こんな感じになった。 端末で `make` を実行するとブラウザがもりもり立ち上がって綺麗に勝手に整列してくれる

![](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20121204/20121204184943.png)

#やり方

まずAppleScript Editorを開いて下記を記述し、名前をつけて保存で Application として保存する。仮にresize.appという名前で保存したとする。

簡単に説明するとまず画面の大きさを取得して、そのあと各ブラウザの大きさと位置を調整している。

```applescript
tell application "Finder"
	set s to bounds of window of desktop
	set _width to item 3 of s
	set _height to item 4 of s
end tell
tell application "System Events"
	try
		tell process "Firefox"
			tell window 1
				set size to {_width / 3, _height}
				set position to {0, 0}
			end tell
		end tell
	end try
	try
		tell process "Chrome"
			tell window 1
				set size to {_width / 3, _height}
				set position to {_width / 3, 0}
			end tell
		end tell
	end try
	try
		tell process "Opera"
			tell window 1
				set size to {_width / 3, _height}
				set position to {_width * 2 / 3, 0}
			end tell
		end tell
	end try
end tell
```

そして Makefile を下記のようにする。 tests/index.html というのが Qunit のファイルでこれを表示すればテストが勝手に実行される状態になっている。 `open` は `-a` オプションで起動するアプリケーションを指定できる。

```Makefile:Makefile
.PHONY: test

test:
    @open tests/index.html -a Firefox
    @open tests/index.html -a Google\ Chrome
    @open tests/index.html -a Opera
    @open resize.app
```

これで `make` をすればブラウザが綺麗に整列した状態でテストが確認できる
google APIs のパラメータ

google api のパラメータ指定方法
-------------------------------

require系のみルートに配置して、それ以外は
resource配下に配置すると、BODYパラメータとして渡せる。

```parameter.js
        function chkDate(){
            gapi.client.calendar.events.insert(
                {
                    calendarId :constants.gapi.calerndar_id,
                    resource : {
                        summary : "testtest",
                        start : {
                          date: "2012-12-04"
                        },
                        end: {
                          date: "2012-12-04"
                        }
                    }
                }
            ).execute( function(e){
               console.log(e); 
            });
```
Capybara で request spec を書く


spec_helper.rbに以下を記述

```ruby:spec/spec_helper.rb(1)
require 'capybara/rails'
require 'capybara/rspec'
```

```ruby:spec/spec_helper.rb(2)
RSpec.configure do |config|
  config.include Capybara::DSL, :type => :request
  config.include Capybara::RSpecMatchers, :type => :request

  :
end
```
LinkedInで自分のプロフィールURLを設定する方法


自分のLinkedInのプロフィールURLを`www.linkedin.com/pub/…`じゃなくて`www.linkedin.com/in/…`にする方法。

Qiitaでプロフィール入力のlinkedinのアドレスを入れる部分に、`https://www.linkedin.com/in/`まで入力されていて困ったので、変える方法をメモ。

自分の場合は、もともと

- https://www.linkedin.com/pub/naoyoshi-aikawa/38/1ba/313

だったけれど、設定後は

- https://www.linkedin.com/in/awakia

になっていて、上のURLは、下のURLにリダイレクトされるように変更された。

## 方法


[公開プロフィールの URL をカスタマイズする | LinkedIn ヘルプセンター](https://ja.help.linkedin.com/app/answers/detail/a_id/6472)の指示通りにやればよい。

英語で使ってる人はこっち。[Customizing Your Public Profile URL | LinkedIn Help Center](https://help.linkedin.com/app/answers/detail/a_id/87)

ただ、LinkedInはよくわからないタイミングでページ遷移してしまって困ったけれど、何回かチャレンジしたら変更できた。

使えるのは英数字のみなようで、`-`,`_`も含めて記号は一切使えなかった。
google api authorizeでの複数スコープ指定+α

複数指定は出来るだろうと思っていたが
予想以上に情報が無かったので苦労の末ようやく実現できた。*[参考元：本家](https://developers.google.com/accounts/docs/OAuth2Login)

まさかSCOPEに指定する区切り文字が「 」（半角スペース）だったとは。。
カンマ、ピリオドとかは試したけど、これは思いつかなかった。

```multiauth.js
    var scopesAry = $.map(scopeNames,function(v,idx){
        return "https://www.googleapis.com/auth/" + v;
    });
    var scopes = scopesAry.join(" ");
```


これでようやく、API使用準備がシンプルに出来るようになった（気がする）


```useapi.js
//認証
helper.gapi.functions.authorize(["drive","calendar"]).done(function(res){
    var apis = [
      helper.gapi.functions.loadBy("drive","v2"),
      helper.gapi.functions.loadBy("calendar","v3")
    ];
    //成功後にAPIロード
    $.when.apply(null,apis).then(function(data){
       //使う
    }
```
RSpec用のカスタムマッチャを書く



例えば

```ruby:
faye_client.should receive("/channel/hoge", { message: "fuga" })
```

というマッチャを使いたい場合、以下のような定義を適当な場所（Rails アプリなら spec_helper.rb など）に定義しておけば良い。

```ruby:例えば'spec_helper.rb'に
RSpec::Matchers.define :receive do |channel, expected_message|
  match do |faye_client|
    # 結果を判定して true or false を返す
  end
end
```

このままだと結果のメッセージの内容が意味不明になるので、わかりやすいメッセージを定義するDSL(`failure_message_for_should`, `failure_message_for_should_not`, `description`)が用意されている。

## 参考
- [Chapter 17 Extending RSpec その２ - おもしろWEBサービス開発日記](http://d.hatena.ne.jp/willnet/20100605/1275751184)
- [Custom Matchers · dchelimsky/rspec Wiki](https://github.com/dchelimsky/rspec/wiki/Custom-Matchers)
Macの通知センターに通知を送るコマンド


手軽に通知できるように、`terminal-notifier.app` をラップするコマンドを作った

```notify.sh
#!/usr/bin/env bash

if [ $# -ne 1 ]
then
        echo "usage:"
        echo "    \$ $0 \"message\""
        exit 1
fi

/Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier -message "$1" -title "Notification" -activate
```
Git/Githubで、プロダクションと最新のmasterとの差分を表示する - Wantedlyのデプロイプロセスより


Git AdventCalendar 1日目で@yaottiがQiitaでよく使うgitコマンドを紹介してくれたので、僕も、僕の勤めている[Wantedly](https://www.wantedly.com/)で、新しいバージョンのプロダクトをデプロイするときに使っているgitコマンドを紹介しようと思います。

ちなみにWantedlyは最近[Qiitaチームアカウント](http://qiita.com/teams/wantedly/stats)を作ってもらいました！皆さん見てみてくださいね。

## Wantedlyの開発運用体制の概略 (なぜ、この差分表示が必要か)

Wantedlyは`Ruby on Rails`で開発を行い、プロダクションサーバーは`Heroku`でホスティングしています。

開発者は全員(5-10人程度)が、ひとつの`Github`レポジトリを共有した上で、

- 新しい変更は、`<開発者のgithub-id>/<機能名>` (例：`awakia/add-awesome-feature`) のブランチを作って、`master`に対してPull Requestを送る。

- 送られたPull Requestのコードレビューをして、よさそうであればマージ

- ある程度変更が溜まったら、適当なタイミングで最新のmasterをherokuにデプロイ

というフローで開発・運用しています。もう少し規模が大きくなってきたら、次にデプロイするstableなブランチと、最新のブランチの２つを用意する必要があるかもしれませんが、現状では最新のmasterをそのままデプロイしたいことが多いので、こうしています。

Wantedlyは、「全員が責任をもって開発・保守しよう！」という思いもあって、エンジニア全員が、マージ、デプロイを行っています。

そのため、前の人がどこまでデプロイしていて、今回どのような変更が入るのか確認する必要が出てきます。
今回はそんな時のためのgitコマンドを紹介します。



## ブランチ名の仮定

以下では

- Github上のリモートリポジトリ名が`origin`
- Heroku(プロダクションサーバー)上のリモートリポジトリ名が`heroku`

であることを仮定します。別の名前を使っている人は適宜置き換えてください。

## コマンドライン上で見る

### どのファイルに変更を加えたか知る

```
git fetch heroku master && git fetch origin master && git diff --name-only heroku/master..origin/master
```

ここでは特にDBのスキーマをいじる変更が無いかチェックします。DBをいじる変更があると、一度サーバーを止めてデプロイしないといけない可能性があります。

### どんなコミットがあったか知る

```
git fetch heroku master && git fetch origin master && git log heroku/master..origin/master
```

ちなみに自分は`git log`を使うときは

```
git log --stat --pretty=format:'%C(yellow)%h %Cgreen%cr %Cblue%cn %Cred%d %Creset%s'
```

のオプション付きで使います。(エイリアスを作ってます。)

## Github上で見る

```
git fetch heroku master && open https://github.com/<ユーザー名>/<リポジトリ名>/compare/`git rev-parse --short heroku/master`...master
```

コミットが多くなるとGithubの方が見やすいので、こっちを使ったりします。

## 解説 (Git/Githubで２点間の変更を見る)

実運用では、間違えて過去の情報を参照しないように`git fetch`して最新の情報に更新することを保証しています。
しかし、ポイントは、gitで2点間の`diff`を取る部分だけで、それは以下のように実現できます。

```
git diff <ブランチ1>..<ブランチ2>
```

この`diff`の部分を目的に応じて`diff --name-only`だったり`log`だったりに変えると良いです。

そして、これと同じ部分をGithubで見るには


```
https://github.com/<ユーザー名>/<リポジトリ名>/compare/<ブランチ1>...<ブランチ2>
```

をブラウザで開けばいいだけです。
XCodeでHaskellを試す

XCodeでHaskellを編集、実行できないか試してみました。

1　新規プロジェクトはOS X/Other/External Build System
2　BuildToolは/usr/bin/ghcみたいにghcのパスを設定
3　ファイルはemptyファイルからhello.hsとなづけて作成
　　例　main = putStrLn "Hello"
4　プロジェクトファイルのTargetsでターゲットを指定しInfoタブの
　　Argumentsをhello.hsにする。
5　一度実行する。(helloができる)
6　Edit SchemeのInfoでExecutableをhelloに指定する。

実行するとhelloがログとして表示されると思います。
GASのライブラリを使って楽したい① とりあえず使ってみる_(:3」∠)_

Google Apps Script Advent Calendar四日目です。
今日からは三日連続でGASのライブラリ機能の話をしていきます。

今日はライブラリ機能の紹介ということでとりあえず公式ドキュメントにあるライブラリを使ってみます。

# ライブラリとは?

怖い人達に刺されそうですが、簡単に言うと「便利な機能をまとめた物」です。
例えば日付の計算を楽にしたりできます。

GASでは比較的簡単に他人が作ったライブラリを自分のコード内で利用できます。

# ライブラリの使い方

今回は冒頭でも書いたように、公式ドキュメントで紹介されている「[Notable Script Library](https://developers.google.com/apps-script/notable-script-libraries)」の中から汎用的なメソッドをまとめた[UnderscoreGS](https://sites.google.com/site/scriptsexamples/custom-methods/underscoregs)を利用してみたいと思います。

## 導入方法

1. GAS Editorを開きます。

2. 上のメニューから「リソース」→「ライブラリを管理...」を選択します。

3. 「含まれているライブラリ」というダイアログが表示されるので下にある「ライブラリを検索」横のテキストボックスに「`MiC3qjLYVUjCCUQpMqPPTWUF7jOZt2NQ8`」を入力します。(この値をプロジェクトキーと言います)

4. 「選択」ボタンを押して少し待つと、上の一覧にタイトル underscoreGSというのが出ます。

5. 「バージョン」欄で任意のバージョンを選択します。最新でいいと思います。

6. 下にある「保存」ボタンを押します。 ※他の物については後で説明します。

7. 開いていたダイアログが閉じ、ライブラリが取り込まれた旨が表示されたらOKです。

## ライブラリの利用

ライブラリの使い方は簡単で、上記ダイアログに表示されていた「識別子」を利用し`識別子.メソッド()`という形で利用できます。
また他のサービス(SpreadsheetAppとか)のように補完も効きます。

### 例

```javascript:underscoreGSを使う.gs
function myFunction() {
  
  //underscoreGSを利用してランダム文字列を作成する
  Logger.log(underscoreGS._randomString(1000));
  
  //underscoreGSを利用して配列に指定した値が入っているか検査する
  Logger.log(underscoreGS._contains([1,2,3], 3));
}
```

この他にも多くのメソッドが利用できます。
元々underscoreGSはunderscore.jsと呼ばれるjavascriptのライブラリをGASに移行したものなのでドキュメントは[underscore.js](http://documentcloud.github.com/underscore)のものを見るといいでしょう。

## ライブラリの設定

### 識別子

上記で利用したような識別子は任意で変更可能です。
ライブラリを追加した平ログで識別子欄を任意のものに変更してください。

### ディベロッパーモード

ダイアログ内にあったデベロッパーモードとは開発時に利用されることを想定した設定です。
このモードをONにすると以下の様な挙動をします。 

* 常に最新の(もっと言えば書き途中の)ライブラリコードが利用されるようになります。 ※通常はバージョンというもので固定される
* 補完はバージョン保存時のもののみが表示されます。
* デバッグ時に同一のGAS Editor内でライブラリコードを表示できます。

ライブラリを利用した時によくわからない挙動をしたら利用してみるといいと思います。
あとライブラリのコードを見たい時とか(；・∀・)

参考:[公式ドキュメント](https://developers.google.com/apps-script/guide_libraries#testAndDebug)

### ライブラリの削除

ダイアログ内の削除ボタンを押してください。

### ライブラリのドキュメント

ダイアログ内のタイトル欄にあったアンカーを押すと見れます。
がNotable Libraryの奴はあんまり感とかかれてない印象です...

参考:[UnderscoreGSのドキュメント](https://script.google.com/macros/library/versions/d/MiC3qjLYVUjCCUQpMqPPTWUF7jOZt2NQ8)

# まとめ

今日はGASのライブラリについて触りの部分を紹介しました。
公式ドキュメントに紹介されているNotable Libraryはなかなか使えるものもいます。使えない奴もいます...

あと僕もSpreadsheetをSQLっぽく検索可能な「[GSSDB](https://github.com/soundTricker/SpreadsheetDB-For-Google_Apps_Script)」や、
DriveやURLからライブラリを読み込む「[GASLoader](https://github.com/soundTricker/GasLoader)」、
UIライブラリの「[GAS Bootstrap](https://sites.google.com/site/gashackja/gas-bootstrap)」あたりを公開しています。

是非是非ライブラリ機能を利用して楽をしましょう。

明日は更にGAS専用ではなく、通常のJavascriptライブラリをGASライブラリ化してみたいと思います。
SublimeText2で特定のキーワードの色を変える


Javascriptに限る話ではないけど、普段Javascriptで下記のようなコードを書いていて、「this」はハイライトされるけど、「self」もハイライトしたい！ 
など、特定のキーワードの色を変えたいと思うことがある。

```javascript:Javascript
Hoge.prototype.init = function(){
	var self = this
}
```

SublimeText2のPackageディレクトリを見て、Color Schemeの設定から変更できるかと思いきや、
言語Packageそれぞれの.tmLanguageファイルを編集することで変更ができた。

Javascriptの場合は下記ディレクトリのファイルを編集することで変更ができる。色自体の変更はエディタに設定しているColor Schemeの設定ファイルから変更できる。

```xml:tmLanguage
//FILE:Library/Application Support/Sublime Text 2/Packages/JavaScript/JavaScript.tmLanguage

<dict>
	<key>match</key>
	<string>\b(super|this|self)\b</string>
	<key>name</key>
	<string>variable.language.js</string>
</dict>
```
drive v2 でファイルupload

javascript でgoogle driveにファイルをupload
-------------------------------------------

最初folderと同じように
gapi.client.drive.files.insert
を使ってuploadしようと試みていたのがそもそもの間違い
gapi.client.request
を使えばすんなり成功。

GoogleDriveが管理するドキュメントには２種類あって

1. **GoogleDocument**(folder:"application/vnd.google-apps.folder")
2. **上記以外**(jpgとか:"application/octet-stream")

という棲み分けなのかと勝手に理解。
よくよく考えれば本家UIもオペレーション違ってたし。

```upload.js
        function gapi_file_upload(){
            var uploadFile = $('#file')[0].files[0];
            
            var reader = new FileReader();
            reader.readAsBinaryString(uploadFile);

            reader.onload = function(e) {
                var helper = functions.multipert_helper();
/*
=>helper.initial_body_requestは以下のフォーマットで文字列を作成(本家マニュアルより引用）
var multipartRequestBody =
	delimiter +
	'Content-Type: application/json\r\n\r\n' +
	JSON.stringify(metadata) +
	delimiter +
	'Content-Type: ' + contentType + '\r\n' +
	'Content-Transfer-Encoding: base64\r\n' +
	'\r\n' +
	data +
	close_delim;
*/
                var multipartRequestBody = helper.initial_body_request("gfileapi.htm",reader.result);

                var request = gapi.client.request({
                    'path': '/upload/drive/v2/files',
                    'method': 'POST',
                    'params': {
                                'uploadType': 'multipart'
                              },
                    'headers': {
                      'Content-Type': helper.header_content_type()
                    },
                    'body': multipartRequestBody
                });                
                request.execute(function(e){console.log(e)});
            }
        }

```
CoffeeScript導入【CentOS 5】


## python 2.6インストール

EPELを使ってインストール

```console
cd /tmp
wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
yum --enablerepo=epel install python26
rm -f /usr/bin/python
ln -fns /usr/bin/python2.6 /usr/bin/python
```

## node.jsのインストール

```console
cd /usr/local/src
wget http://nodejs.org/dist/v0.8.15/node-v0.8.15.tar.gz
tar -zxvf node-v0.8.15.tar.gz
cd node-v0.8.15
./configure
make
make install
```

## npm

```console
curl https://npmjs.org/install.sh | sh
```

## Coffee Scriptのインストール

```console
npm install -g coffee-script
```
HEX文字列を数値にする方法が思いつかない

思いつかないので、マップ作って変換してみた。

```
def n = [:]
(0..0xff).each{ val ->
    def key = Integer.toHexString(val).toUpperCase().padLeft(2, '0')
    n.put key, val
}

n["ab".toUpperCase()]
```

なんかもっとスマートな方法があるはずなのに。