OmniAICreator/Qiita-1.07M huggingface dataset:
CATiledLayer Sample

```objc:TiledView.h
@interface TiledView

- (id)initWithX:(int)tileXNum Y:(int)tileYNum;
@property (nonatomic) BOOL annotates;

@end
```

```objc:TiledView.m
#define TILE_SIZE 256

@implementation TiledView

- (id)initWithX:(int)tileXNum Y:(int)tileYNum
{
    self = [super init];
    if (self) {
      
        CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
        tiledLayer.contents = nil;
        tiledLayer.levelsOfDetail = 1;
        tiledLayer.levelsOfDetailBias = 0;

        // logic for retina
        float screenScale = [UIScreen mainScreen].scale;
        tiledLayer.tileSize = CGSizeMake(TILE_SIZE*screenScale, TILE_SIZE*screenScale);

        // bound is auto fit with retina
        self.bounds = CGRectMake(0, 0, TILE_SIZE*tileXNum, TILE_SIZE*tileYNum);
    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (void)drawRect:(CGRect)rect {
    // for UIView implemente
    // real logic is implements on below
    // - (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
}

- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context {
    
    CGRect rect = CGContextGetClipBoundingBox(context);
    CGFloat scale = CGContextGetCTM(context).a;
    
    CATiledLayer *tiledLayer = (CATiledLayer *)layer;
    CGSize tileSize = tiledLayer.tileSize;
    tileSize.width  /= scale;
    tileSize.height /= scale;

    int col = floorf(CGRectGetMinX(rect) / tileSize.width);
    int row = floorf(CGRectGetMinY(rect) / tileSize.height);

    CGImageRef image = [self tileForScale:scale row:row col:col];

    CGContextScaleCTM(context, 1, -1);
    rect = CGContextGetClipBoundingBox(context);
    
    if(NULL != image) {
        CGContextDrawImage(context, rect, image);
        CGImageRelease(image);
    }
    
    // draw line for debug
    if (self.annotates) {
        CGContextSetRGBStrokeColor(context, 0, 1, 0, 1);
        CGContextSetLineWidth(context, 6.0 / scale);
        CGContextStrokeRect(context, rect);
    }

}

- (CGImageRef)tileForScale:(CGFloat)scale row:(int)y col:(int)x
{
    
    NSString *path;
    {
        // path for tile
        path = xxxx/x/y;
    }

    CGDataProviderRef provider;
    if(path != nil) {
        NSURL *imageURL = [NSURL fileURLWithPath:path];
        provider = CGDataProviderCreateWithURL((CFURLRef)imageURL);
    }

    CGImageRef image = nil;
    if(provider != nil) {
        image = CGImageCreateWithJPEGDataProvider(provider, NULL, FALSE, kCGRenderingIntentDefault);
        CFRelease(provider);
    }
    
    return image;
}

@end
```
FactoryGirlでpaperclip用のダミー画像を登録する方法


paparclipを利用してattachementとして定義しているカラムにfactory_girlでフィクスチャデータを定義する際にダミーの画像を指定する方法。

適当な画像を用意してFile.openする

```ruby:spec/factories/example.rb
FactoryGirl.define do
  factory :sample_example, :class => Example do
    id 1
    image { File.open("spec/file/dummy.jpg") }
  end
end
```
PR開発について。

git push --forceがこわいのってメインのリポジトリがひとつだからと思っている。

ひとつの解決方法として、メインのリポジトリ(upstream)からforkしてoriginをつくることで幾分かはマシになると思う。
それで、originのfeatureブランチからupstreamのdevelopに対してPRを送ることになるし、rebaseしてもoriginに対してgit push --forceするからそこまでこわくない。
コマンドにすると以下。

```
git push origin feature
# send PR
# no ff merge
git co develop
git fetch origin
git pull origin develop
git co -
git rebase develop
# edit
git add .
git rebase --continue
git push --force origin feature
```

普段からgit pushだけ叩いている人には合わないだろうけど、人数が多いプロジェクトでPRをつかって開発をするなら、upstreamとoriginっていう方法も考慮したほうがよさそう。
JavaでZip圧縮

JavaでZip圧縮します。
ZipEntryとかすぐ忘れてしまうので、備忘録としてメモ。

```java:
private void createZip() {
	File[] files = {/* 圧縮したいファイル配列 */};
	ZipOutputStream zos = null;
	try {
		zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File("hoge.zip"))));
		createZip(zos, files);
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		IOUtils.closeQuietly(zos);
	}
}

private void createZip(ZipOutputStream zos, File[] files) throws IOException {
	byte[] buf = new byte[1024];
	InputStream is = null;
	try {
		for (File file : files) {
			ZipEntry entry = new ZipEntry(file.getName());
			zos.putNextEntry(entry);
			is = new BufferedInputStream(new FileInputStream(file));
			int len = 0;
			while ((len = is.read(buf)) != -1) {
				zos.write(buf, 0, len);
			}
		}
	} finally {
		IOUtils.closeQuietly(is);
	}
}
```
Vim 起動中は tmux のステータスラインを隠す

tmux のステータスラインは格好良くて便利ですが，エディタを開いているときは縦幅をフルに活用したいので，Vim が開いているときは tmux のステータスラインを隠す設定をしました．
.vimrc に下のように設定します．

```vim:.vimrc
if !has('gui_running') && $TMUX !=# ''
    augroup Tmux
        autocmd!
        autocmd VimEnter,VimLeave * silent !tmux set status
    augroup END
endif
```

`tmux set status` で tmux のステータスラインの表示/非表示をトグルすることができるので，Vim の起動時と終了時に実行するようにしています．
rubyとzshを使ってランダム文字列を生成する

[kyanny](http://qiita.com/users/kyanny) さんの[ブログ](http://blog.kyanny.me/entry/2012/10/24/205705 "コマンドラインから適当なランダム文字列を得る")を読んで「これは便利!!」と思ったけど、インストールしたりするのはちょっとな…と思ったので、zshで関数を作って同じ様な感じで使えるようにしてみました。

```zsh:.zshrc
function rand() {
    ruby -rsecurerandom -e "puts SecureRandom.$1 $2"
}
```
```:usage
$ rand hex 10
$ rand uuid
```
RailsからJavaScriptにデータを渡す


単純な文字列を渡すとかならともかく、オブジェクトをJSON形式で渡せると便利ですよね。それもいちいち通信してコールバックから貰うとかは面倒！

ここでは簡単にできる2通りのやり方を紹介。

##1. Viewに埋め込む
一番単純な方法。

###ERB

```view.html.erb
<%= javascript_tag do %>
  window.your_object = <%= raw @your_object.to_json %>;
<% end %>
```
###HAML

```view.html.haml
= javascript_tag do
  board_event = #{raw @board_event.to_json};
```
エスケープは一切してないので注意してください。

##2. Gon gemを使う

Viewに書くのが気持ち悪い場合、大量に渡すデータがある場合。[Gon gem](https://github.com/gazay/gon) を使うとスッキリControllerに書けます。

###2-1.準備
```Gemfile
gem 'gon'
```

`$ bundle install`して、ヘッダに以下の一行を埋め込むと準備完了。

```views/layouts/application.html.erb
.
.
    <%= include_gon %> #←これだけ！
    <%= javascript_include_tag "application" %>
    <%= stylesheet_link_tag    "application" %>
.
.
```
##2-2.サンプル
controllerに適当に埋め込むだけ。

```your_controller.rb
def hoge
.
.
  gon.hoge = your_object
.
.
end
```

ブラウザで開き、コンソールで`gon.hoge`を打つと、ちゃんとjsオブジェクトになっています。(DOMロード前に読み込めます)　普通にソース中に埋め込まれてるだけみたいです。

`gon.all_variables`で全ての変数を確認したり、`gon.clear`で初期化したりもできます。
オプションでgon.watchを使うことで、gon.hogeを書き換えるだけでブラウザをリロードするなくデータを更新したりもできるみたいです。

##参考
[Rails Cast #324 Passing Data to JavaScript](http://railscasts.com/episodes/324-passing-data-to-javascript?language=ja&view=asciicast)
Emacsの分割ウィンドウを←↓↑→で移動

Emacs では `C-x 2` や `C-x 3` で画面を複数のウィンドウに分割することができ、これらの間は `C-x o` でトグルして移動することができます。しかし、みっつ以上に分割した場合には `C-x o` といふ2ストロークのキーバインドを連打する必要があり、戻りたいときにも標準では `C-u C-x o` も利かない不親切仕様です。

ところで、 `tmux` といふターミナルマルチプレクサ (GNU Screen のご同類です) には、複数の分割した領域を `C-b [←↓↑→]` で移動できる設定が標準であります。これを拝借してきませう。

Emacs には標準で `windmove` といふ機能が含まれてゐます。 `M-x windmove` と押すと、特に設定してなくとも `windmove-{left,down,up,right}` 函数がご利用いただけることが確認できると思ひます。これがまさに `tmux` の移動と同様のものですので、ここにキーバインドを設定してやれば良さげですね。

```cl:keybindings-windmove.el
(global-set-key (kbd "C-c <left>")  'windmove-left)
(global-set-key (kbd "C-c <down>")  'windmove-down)
(global-set-key (kbd "C-c <up>")    'windmove-up)
(global-set-key (kbd "C-c <right>") 'windmove-right)
```

できましたー。

しかし…

[EmacsWiki: Wind Move](http://www.emacswiki.org/emacs/WindMove)

あれっ、まったく同じことやってた…

ちなみに最初はプレフィックス `C-c` じゃなくて `C-x` でやってましたが、最近ちょっと使ひ始めてみた [EmacsWiki: Back Button](http://www.emacswiki.org/emacs/BackButton) の標準キーバインドと衝突してたので、晴れて EmacsWiki 版と同じに戻ってしまひましたとさ。ちゃんちゃん。
bundlerが遅い(Error Bundler::HTTPError)のを解決

Gemfileを一時的に以下のように変更し、bundleを実行

```ruby:Gemfile
source "http://bundler-api.herokuapp.com"
# source 'http://rubygems.org'
```

おそらく近頃 rubygems.org のサイトの問題があり、bundler 1.0.X の時代で遅くなっていた頃と近い状態になっていて、bundleコマンドが遅くなっている。

gem metadata の取得先をミラーリングするような形で、対応しているものと思われる。
特にインストール済みのgemの照合時間が短縮されている？
（上記の対応は一時的なものでコミットはすべきではない）

[情報元: Rubygems and the Dependency API](http://hone.herokuapp.com/bundler%20heroku/2012/10/22/rubygems-and-the-dependency-api.html)

いろいろ他に何度も調べはしたが、どれも試そうとはしてこなかったが、
ようやく試してみようと思ったきっかけは Ruby5
やはり最速のRuby情報源

[Ruby5](http://ruby5.envylabs.com/episodes/320-episode-316-october-23rd-2012)
変数展開の中で変数を使う


```zsh
name="aereal"
echo ${name:+"[${name}]"} # -> (aereal)
```

<code>${<var>name</var>:+<var>replace</var>}</code> で <code>$<var>name</var></code> が空 (non-null) でなければ値を <var>replace</var> で置き換える。

<var>replace</var> は文字列として評価する必要があるのでダブルクォートで囲む必要がある。

例のコードを評価すると、`$name` が空であれば何も出力せず、なにか値があればブラケット (`[]`) で囲んで出力する、という風になる。
Haxeのテンプレートシステムが便利。

Haxeにはテンプレートシステムという便利な機能があります。
あらかじめ、テンプレートを用意しておき変数や関数を挿入して文字列を生成することができます。

```hx:Main.hx
import haxe.Template;
class Main {
	static public var template:Template = new Template( "My name is ::name::." );
	static function main() {
		var str = template.execute( { name: "Tanaka" } );
		trace( str );	//My name is Tanaka.
		str = template.execute( { name: "Suzuki" } );
		trace( str );	//My name is Suzuki.
	}
}
```

HTMLやXMLなどとの相性がよさそうなので、HaXe/JSなんかで役に立ちそうです。
さらにテンプレート内に条件分岐やループを仕込んだり、関数を呼び出させるなど、もっと複雑な使い方もできます。

詳しくはこちらから http://haxe.org/doc/cross/template
svn、チケット駆動開発時のtrunkマージスクリプト 


「refs #1234」とかでチケット番号に紐付けてコミットしていることを前提
引数にチケットの番号のみを渡して`merge_ticket.sh`を実行、trunkにマージされる幸せ(▰˘◡˘▰)

```
svn
└── huge
      ├── branches
      │     └──── 1.1
      └── trunk

script
├── merge_ticket.sh
└── svn
      └── merge_ticket_number.sh
```


```merge_ticket.sh
#!/bin/bash

PWDDIR=`pwd`
cd $PWDDIR

# 開発ディレクトリ
DIR=/home/soramugi/svn/huge/branches/1.1/
# trunk
TRUNK=/home/soramugi/svn/huge/trunk/

source svn/merge_ticket_number.sh $*
```

```merge_ticket_number.sh
#!/bin/bash

set -e

# チケット番号に紐付けてコミットしていることを前提
# 引数にチケットの番号のみを渡す

if [ "$1" = '' ]; then
  exit 1
fi

SERCHE=''
for i in $@
do
  if [ "$SERCHE" != '' ]; then
    SERCHE=$SERCHE'\|'
  fi
  SERCHE=$SERCHE'#'$i
done


cd $DIR
pwd
RIPOURL=`svn info | grep URL: | grep -o 'http.\+'`
/usr/bin/svn up
REVISIONS=`/usr/bin/svn log | /bin/grep -B 3 "$SERCHE" | /bin/grep -o '^r[0-9]\+' | /bin/grep -o '[0-9]\+' | sort -n`

echo $REVISIONS

cd $TRUNK
pwd
/usr/bin/svn up

/usr/bin/svn merge -c "$REVISIONS" $RIPOURL
```
Haxeで読みこみ専用、書きこみ専用の変数とプロパティ

Haxeでは読み込み専用の変数、書き込み専用の変数を簡単に設定することができます。

#読み込み専用

```as3:Main.hx
class Main {
	//読み込み時はどこからでも出来ますが、書き込みはMainからのみになります。
	static public var readOnly(default, null):Int;
	
	static function main() {
		var i = Main.readOnly;		//ok
		Main.readOnly = 1; 			//ok
		
		Test1.test();
	}
}

class Test1 {
	static public function test() {
		var i = Main.readOnly;		//ok
		Main.readOnly = 1; 			//error
	}
}
```

#書きこみ専用

```as3:Main.hx
class Main {
	//書き込みはどこからでも出来ますが、読み込みはMainからのみになります。
	static public var writeOnly(null, default):Int;
	
	static function main() {
		var i = Main.writeOnly;		//ok
		Main.writeOnly = 1; 		//ok
		
		Test1.test();
	}
}

class Test1 {
	static public function test() {
		var i = Main.writeOnly;		//error
		Main.writeOnly = 1; 		//ok
	}
}
```

いちいちsetter,getterを書かなくていいので、楽ですね。
もちろん、setter,getterを書くこともできます。

#getter,setter(プロパティ)

Haxe3:

```as3:Main.hx
class Main {   
	static public var x(get,set):Int;
	static public var y(get, never):Int;
	static public var z(default, set):Int;	
	
	static function get_x():Int		 	{ 
		trace( "get_x" );
		return x;		//setter内ではget_xは呼ばれない。
	}
	static function set_x(v:Int):Int {
		trace( "set_x" );
		return x = v;	//setter内ではget_x,set_xは呼ばれない。
	}
	
	static function get_y():Int			{ 
		trace( "get_y" );
		return 1; 
	}

	static function set_z(v:Int):Int	{ 
		trace( "set_z" );
		return z = v; 	//setter内ではset_zは呼ばれない。
	}
	
	static function main() {
		var i:Int;
		i = x;	//get_x
		x = 1;	//set_x
		i = y;	//get_y
		y = 1;	//error
		i = z;	//i = z;
		z = 1;	//set_z
	}
}
```

Haxe2:

```as3:Main.hx
class Main {   
	static public var x(getX,setX):Int;
	static public var y(getY, never):Int;
	static public var z(default, setZ):Int;	
	
	static function getX():Int		 	{ 
		trace( "getX" );
		return x;		//setter内ではgetXは呼ばれない。
	}
	static function setX(v:Int):Int {
		trace( "setX" );
		return x = v;	//setter内ではgetX,setXは呼ばれない。
	}
	
	static function getY():Int			{ 
		trace( "getY" );
		return 1; 
	}
	static function setZ(v:Int):Int	{ 
		trace( "setZ" );
		return z = v; 	//setter内ではsetZは呼ばれない。
	}
	
	static function main() {
		var i:Int;
		i = x;	//getX
		x = 1;	//setX
		i = y;	//getY
		y = 1;	//error
		i = z;	//i = z;
		z = 1;	//setZ
	}
}
```
Pry で refe (手抜き版)

`show-doc`, `show-method`, `refe` があればどんなにドキュメントが無いライブラリでも戦えるはず！たぶん！

## refe って何よ

* http://bugs.ruby-lang.org/projects/rurema/wiki/ReleasePackageHowTo

## refe 入れる

* http://d.hatena.ne.jp/ohnishiakira/20110704/1309771158

`gem install refe` では邪悪なものが入ってくるので↓

```bash
gem install refe2
```

コマンドが、 `refe-1_9_2` のようになぜかサフィックスが付いてる。

## 便利コマンド作る

```ruby:.pryrc
Pry::Commands.block_command "refe", "run refe" do |*args|
  run ".refe-1_9_2 #{args.join(' ')}"
end
```

## 便利

```ruby:pry
[2] pry(main)> refe String#reverse
String#reverse
--- reverse -> String

文字列をバイト単位で左右逆転した文字列を返します。

例:
    p "foobar".reverse   # => "raboof"
    p "".reverse         # => ""

```

## オイオイ1.9.2かよ〜

1.9.3 対応版のデータベースを以下の手順を参考に入れられるはず！！！

* http://kajiken.hatenablog.com/entry/2012/05/31/013736

あとで調べて書く。
CentOS6.3 な vagrant box を作ろうとしてハマった件

※ この情報は既に古いです。要らぬ苦労をしたくなければ黙って最新版を使いましょう

[veewee](https://github.com/jedi4ever/veewee) で CentOS 6.3 ベースの [vagrant]
(http://vagrantup.com/) box を作ろうとしたところ大変ハマったのでメモ。

結論だけ書くと、このエントリを書いてる時点で CentOS6.3 ベースな vagrant box 作る/使う人は Virtualbox 4.1.20- を使っとくのがよさそう。4.1系の古いのは不幸になる可能性有り。4.2系は不可。

* ハマりポイント1: CentOS 6.2, CentOS 6.3 で VirtualBox Guest Addition がビルドできないことがある。CentOS 6.3 + virtualbox 4.1.20 以降ならパッチなしでok => http://wiki.centos.org/HowTos/Virtualization/VirtualBox/CentOSguest
* ハマりポイント2: <del>これを書いている時点で最新の vagrant (正確には vagrant が使用する virtualbox gem) では Virtualbox 4.2 に対応していない模様。vagrant 側でこの辺の実装が変わるらしい？ (追いかけていない) => https://github.com/mitchellh/virtualbox/issues/77</del>

やーれやれ、と。

------------
2012/11/29 追記

久々に試したら veewee 0.3.1 + vagrant 1.0.5 + virtualbox 4.2.4 で動くことを確認。コミットログを見た感じ、vagrant 1.0.4 以降 なら virtualbox 4.2系との組み合わせでも動きそう
Mac で hw.machine を取ると CPU アーキテクチャが返ってくる

iPhone の機種名称を取得する方法として `sysctlbyname("hw.machine", ...)` の値を見るというものがあった（参考：[Cocoaの日々: 機種名称を取得する](http://cocoadays.blogspot.jp/2010/08/blog-post_30.html)／現在では API が提供されている）。

これを Mac で取得したらモデル名でも取れるかと思ったが `x86_64` としか返ってこなかった。

```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/sysctl.h>

int main(int argc, char *argv[]) {
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);

    char *answer = malloc(size);
    sysctlbyname("hw.machine", answer, &size, NULL, 0);

    printf("answer = %s\n", answer);
    free(answer);

    return 0;
}
```
[PR]rack-webconsole-pry を使ってみる、あとWeb+DB Pressに書きました

独特言語パイソンのWSGIユーティリティ群、Werkzeugには例外発生時に [ウェブコンソールを立ち上げる](http://werkzeug.pocoo.org/docs/debug/?highlight=console#using-the-debugger) 機能があるそうな。Fukuoka.rb関係者のパイソニスタにどや顔で自慢され（表現には誇張があります）、「うらやましい〜〜〜〜」と思っていたらRuby(Rack)にも似たような機能があった。

`rack-webconsole-pry` [(Rubygems.org)](https://rubygems.org/gems/rack-webconsole-pry) はブラウザ上でREPLを立ち上げる機能を提供する。REPLは、おなじみ [Pry](http://pryrepl.org/) である。Rackミドルウェアとして設定すれば使えるが、gemで入るバージョンは初期設定ではバグがあり、ちゃんと立ち上がらない……。 [このプルリクエスト](https://github.com/mrbrdo/rack-webconsole/pull/1) を参照せよ。

最新版を取ってきても良いが、以下の設定を追記してもよい。

```ruby
Rack::Webconsole.key_code = [96]
```

## Sinatra で試してみる。

```ruby:Gemfile
source :rubygems

gem 'pry'
gem 'rack-webconsole-pry'
gem 'sinatra'
```

```ruby:app.rb
require 'bundler'
Bundler.setup
require 'sinatra'
require 'rack-webconsole'
require 'cgi'
configure :development do
  use Rack::Webconsole
  Rack::Webconsole.inject_jquery = true
  Rack::Webconsole.key_code = [96]
end

get '/' do
  @foo_value = settings.foo_value rescue nil
  erb <<EOT
<!DOCTYPE html>
<html>
<head><title>Rack::Webconsole sample</title></head>
<body>
<h1>Rack::Webconsole sample</h1>
<pre style="font-family: Courier, monospace;">
This is a sample app for Rack::Webconsole
Please type ` (backquote) and in the web terminal,
try the command below:

    Sinatra::Application.set :foo_value, "Some Text"

and then reload me...

<strong>settings.foo_value = <%= CGI.escapeHTML @foo_value.inspect %></strong>

You even can add routes by sinatra verb!
</pre>
</body>
</html>
EOT
```

```sh
bundle install
ruby app.rb
```

in `http://localhost:4567`

![立ち上がる](http://blog.udzura.jp/wp-content/uploads/2012/10/webcon01.png)

「`」（バッククオート）を押すとコンソールが出現する。

試しに、表示されている通り以下の内容をコンソールに入れてみる。

```ruby
Sinatra::Application.set :foo_value, "Some Text"
```

リロードすると、Sinatraのsettingの値が変更されていることが分かる。

![02](http://blog.udzura.jp/wp-content/uploads/2012/10/webcon02.png)

また、以下のように入力してみる。Routingの追加。

```ruby
Sinatra::Application.get('/hello') { "Say hello" }
```

![03](http://blog.udzura.jp/wp-content/uploads/2012/10/webcon03.png)

`http://localhost:4567/hello` にアクセスすると、確かにページが追加されている！

![04](http://blog.udzura.jp/wp-content/uploads/2012/10/webcon04.png)

## 注意点

この通り、アプリケーションの状態まで動的に変更できて超凄いので、うっかり **productionで有効にしないように** 気をつけましょう！

Rails ではdevelopmentでないと有効にならないようになっていますが、Sinatraなどの場合は特に要注意です。`configure :development do ~ end`ブロックで設定するようにしましょう。

## [PR]そんな強力なPryについてもっと知りたいあなたは

WEb+DB Press vol.71 に、Pryのことについて書きましたので是非ご一読ください！

![http://image.gihyo.co.jp/assets/images/cover/2012/9784774153209.jpg](http://image.gihyo.co.jp/assets/images/cover/2012/9784774153209.jpg)

http://gihyo.jp/magazine/wdpress/archive/2012/vol71

と言いつつ、実は紙幅とテーマの関係で `rack-webconsole-pry` に割いた文字数は少ないので、Qiitaでフォローアップの記事を書いてみました。上記と同じようなコードは [サポートページ](http://gihyo.jp/magazine/wdpress/archive/2012/vol71/support) から落とせます。記事自体は、基本的なところから拡張についてまで一通り書いています。是非、感想を聞かせてくださいね〜。
シェルスクリプトでユーザ入力により分岐する場合

1.readを利用してユーザ入力を読み込み
　e.g read ACTION
2.case文を利用して入力内容に対する処理を分岐
  e.g
    case ${ACTION} in
     1)
      処理1
      ;;
     2)
      処理2
      ;;
     esac
正規表現で単語の区切り


`\b` は単語の区切りにマッチします。

```js
console.log("Let it be.".match(/\bit\b/));
// [ 'it', index: 4, input: 'Let it be.' ]
console.log("Git is awesome.".match(/\bit\b/));
// null
```

「単語が区切られていること」にマッチするのであって、「単語を区切る文字」そのものにマッチするわけではありません。

逆に「単語の区切りでない」という指定には `\B` を使います。

```js
console.log("Let it be.".match(/\Bit/));
// null
console.log("Git is awesome.".match(/\Bit/));
// [ 'it', index: 1, input: 'Git is awesome.' ]
```

なお `[\b]` はバックトレースにマッチするそうなので、注意です。

参考
[RegExp - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp)
参照渡しswap

#include<iostream>
using namespace std;
void swap(string &x, string &y)
{string i = x;
  x = y;
 y= i;
}

int main(){
string x = "a";
string y = "b";
cout << "スワップ前：x =  "<< x <<",y = "<< y << endl;
swap(x,y);

cout << "スワップ後：x =  "<< x <<",y = "<< y << endl;
return 0;

}
NeoBundleがhttpsプロトコルを使ってくれなかった


会社では外のgit://を叩けないので、下記のようにしてプラギンをhttpsで取得するようにしてた。

~~~ .vimrc
let g:neobundle_default_git_protocol='https'
~~~

だが、久しぶりに新しいプラギンを追加しようとしたら、どうも git:// で接続しに行っている模様…

なんでだろうなぁ〜と思い調べていたら、ども新しい変数が出来ていて、そちらを使えば解決するぽい

~~~ .vimrc
let g:neobundle#types#git#default_protocol = 'https'
~~~


TwitterでShougoさんが教えてくれたのだが、古い変数(neobundle_default_git_protocol)は初期化前にセットしていないとデフォルト値で初期化されてしまうとのこと。

この現象はすでに修正ずみだけど、今後は新しい変数(g:neobundle#types#git#default_protocol)を使うほうが無難らしいです。
simplecovがある日突然落っこちるようになった対応

ある日、RSpecの拡張をいくつか試していたら、rspecを走らせるごとにsimplecovが以下のエラーを吐くようになった。

```
/Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/multi_json-1.0.4/lib/multi_json/engines/yajl.rb:10:in `parse': parse error: unallowed token at this point in JSON text (MultiJson::DecodeError)
          mestamp": 1334116405   } }  1,         3,         null,     
                     (right here) ------^
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/multi_json-1.0.4/lib/multi_json/engines/yajl.rb:10:in `decode'
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/multi_json-1.0.4/lib/multi_json.rb:76:in `decode'
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/simplecov-0.5.4/lib/simplecov/result_merger.rb:18:in `resultset'
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/simplecov-0.5.4/lib/simplecov/result_merger.rb:67:in `store_result'
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/simplecov-0.5.4/lib/simplecov.rb:48:in `result'
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/simplecov-0.5.4/lib/simplecov/configuration.rb:133:in `block in at_exit'
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/simplecov-0.5.4/lib/simplecov/defaults.rb:47:in `call'
        from /Users/ukondo/.rvm/gems/ruby-1.9.3-p194@___game/gems/simplecov-0.5.4/lib/simplecov/defaults.rb:47:in `block in <top (required)>'
```

以下のようなイッシューがあった。

* Simplecog stopped working
  * https://github.com/colszowka/simplecov/issues/137

ぼくの環境では「`results.json`」という名前ではなかったが、以下のファイルを消したら直った。

```bash
rm coverage/.resultset.json
```
DefaultHttpClientの作成


```java:HttpClientUtitlity

/**
 * HttpClientUtitlity
 */
public class HttpClientUtil extends DefaultHttpClient {
	private DefaultHttpClient httpClient;

	public static HttpClientUtil getInstance() {
		return new HttpClientUtil();
	}

	private HttpClientUtil() {
		// httpsにも対応する
		SchemeRegistry schReg = new SchemeRegistry();
		schReg.register(new Scheme(HttpHost.DEFAULT_SCHEME_NAME, PlainSocketFactory.getSocketFactory(), 80));
		schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

		//タイムアウトやら好きなように設定
		HttpParams httpParams;
		httpParams = new BasicHttpParams();
		HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
		HttpProtocolParams.setContentCharset(httpParams, HTTP.UTF_8);
		HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
		HttpConnectionParams.setSoTimeout(httpParams, 20000);

		httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, schReg), httpParams);
	}

	public DefaultHttpClient getHttpCllient() {
		return this.httpClient;
	}
}

```

使用するときのサンプル

```java:UseHttpClientUtitlity

HttpClientUtil http_util = HttpClientUtil.getInstance();
DefaultHttpClient client = http_util.getHttpCllient();
HttpGet method = new HttpGet("http://www.google.com");
try{
	HttpResponse response = client.execute(method);
	if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
	}
}catch(Exception e){}
```
RailsでActiveRecordとMongoidの共存のさせ方


## 背景

Herokuで適当にスキーマレスなデータをOutput出来る場所がほしい！でも、Herokuはディスクが自由に使えないので、text書き出しができない！！
こんな要求の解決法としては、textタイプのフィールドを作って`serialize`や`store`を使うのが一つの手。ただ、割と書き込みが多い事が想定され、無駄に大切なPostgreSQLサーバーに負荷をかけてしまう。
そんなこんなでスキーマレスな出力場所としてMongoDBを使うというアイデアが持ち上がった。HerokuではMongoHQなら16M、MongoLabなら0.5Gが無料で使える。
なお、基本的に、MongoDBをサブとして使うので`rails g model`などをした時に`mongoid`がinvokeされるのは避けたい。

## 実践

```Gemfile
gem 'mongoid'
gem 'bson_ext' # accelerate BSON serialization
```

して、`bundle install`

```
$ rails generate mongoid:config
```

すると、`config/mongoid.yml`にdevelopmentとtestの設定が生成されるので、ここにconfigurationを書く。基本的には変更する必要がないが、`database`, `username`, `password`あたりの書き換え、書き足しだけチェックしてみればいいのではないだろうか？

`production`の設定はHerokuのAdd-onのドキュメント通りにすれば良いと思う。MongoHQのドキュメントの方が詳しく書かれていたのでこっちを参照した。使ったのはMongoLabだけど(笑)

http://mongoid.org/en/mongoid/docs/installation.html
にそれぞれオプションが詳しく載っている。

mongoidのモデルは`rails generate model`でできるようになっている。

```
$ rails generate model user_mongo name:string
    invoke  mongoid
    create    app/models/user_mongo.rb
```

```ruby:app/models/user_mongo.rb
class UserMongo
  include Mongoid::Document
  field :name, type: String
end
```

ということは、ActiveRecordのmodelを作るとき、`active_record:`とprefixをつける必要がある。

```
$ rails generate acrive_record:model
```

これは`migration`コマンドやgemの`devise`などでも同様。

これが困る場合、`application.rb`に

```ruby:config/application.rb
config.generators do |g|
  g.orm :active_record
end
```

と追加すれば良い。このときmongoidのモデルを作るときは

```
$ rails generate mongoid:model
```

とする。

最後に、Mongoidの使い方は、適当に自分で調べて使ってみれば意外と簡単に使えると思うが、http://mongoid.org/en/mongoid/docs/relations.html は読んでおくと良いと思う。多分ActiveRecordとはちょっと違っていて難しいであろう、Relation/Associationのあたりの話がちゃんと書いてある。


## 参考
- http://stackoverflow.com/questions/6372626/using-active-record-generators-after-mongoid-installation
- http://mongoid.org/en/mongoid/
- https://devcenter.heroku.com/articles/mongohq
Haskellソース編集後、保存と同時にghciにロードするSublime Text 2プラグイン

Sublime REPL上のghciで確認しながらコード書いているときに、変更後に:loadするのが面倒なので保存後に自動で:loadしてくれるプラグインを書いてみた。

```python:zanelicative_ghci.py
import sublime, sublime_plugin, os, re

class ZanelicativeGhciAutoLoadEventListener(sublime_plugin.EventListener):
    def on_post_save(self, view):
        filename = view.file_name()
        path, ext = os.path.splitext(filename)

        if ext != ".hs" and ext != ".lhs":
            return

        replView = Util.get_ghci_view(view.window().views())
        if replView is None:
            return

        Util.put_ghci_command(replView, "l", filename)

class ZanelicativeGhciTypeCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        replView = Util.get_ghci_view(self.view.window().views())
        if replView is None:
            return

        sels = self.view.sel()
        for sel in sels:
            word = self.view.substr(self.view.word(sel))
            if not re.match(r"^\w+$", word) and not re.match(r"^\(.*\)$", word):
                word = "(" + word + ")"

            Util.put_ghci_command(replView, "t", word)

class Util:
    @staticmethod
    def get_ghci_view(views):
        for view in views:
            if view.name() == "*REPL* [haskell]":
                return view
        return None

    @staticmethod
    def put_ghci_command(view, command, param):
        edit = view.begin_edit()
        view.insert(edit, view.size(), ":" + command + " " + param)
        view.run_command("repl_enter")
        view.end_edit(edit)
```

ZanelicativeGhciAutoLoadEventListener の on_post_save メソッドで、保存後に発火するリスナーを作成している。
ファイル名を取得して、タイトルが「*REPL* [haskell]」のタブを探してそこに「:l <ファイルパス>」を出力して
Enterキーを送ることで実現している。
少しハマったのが、Enterキーと認識されるキーを出力してコマンドを決定させるところ。
最初はコマンドの末尾に改行文字や os.linesep を付与していたが改行文字そのものがghciに出力されて
コマンド決定扱いとみなされなかった。
これは「view.run_command("repl_enter")」を実行することで解決した。

上のタブ「test.hs」でソース編集後、Ctrl + s で保存した際、自動で下のタブにロードされている。
![FluentReplAutoLoadEventListener](http://www.zaneli.com/img/FluentREPL/operating_image1.png "FluentReplAutoLoadEventListener")

オマケ(?)でカーソルの当たっている関数を ghci の:typeで調べるようにしたのが
ZanelicativeGhciTypeCommand。
こちらはリスナー発火ではなく、コマンド実行時にフォーカスの当たっている単語を取得し、
「*REPL* [haskell]」タブに「:t <関数>」と repl_enter を出力することで実現している。

```Default (Linux).sublime-keymap
[
    { "keys": ["ctrl+shift+t"], "command": "zanelicative_ghci_type" }
]
```

このようにキーを割り当てると、関数にカーソルが置かれた状態で Ctrl + Shift + T を押下すると ghci で型を調べることができる。

putStrLnにカーソルが置かれた状態で Ctrl + Shift + T を押下し、:t putStrLn している。
![FluentReplTypeCommand](http://www.zaneli.com/img/FluentREPL/operating_image2.png "FluentReplTypeCommand")
Railsのルーティング定義を再読み込みする

開発環境でしか現れない特別な機能がある時、それをどうやってテストするか。
環境のフェイクはこうする（Thx hsbt!）。

```ruby
Rails.stub(:env) { ActiveSupport::StringInquirer.new('development') }
```
これで`Rails.env.development?`が`true`になる。
で、`config/routes.rb`で定義しているルーティングで、開発環境でしか現れない、`Rails.env.development?`が`true`の時にしかアクセスできないルーティングがある時、普通にテストを書くと、`RAILS_ENV`が`test`なので、死ぬ。URLヘルパーとかで、死ぬ。

```ruby
if Rails.env.development?
  get  #...
  post #...
end
```
これは`setup`とか`before`で`Rails.application.reload_routes!`をすると解決するみたい。
http://api.rubyonrails.org/classes/ActionDispatch/Routing.html#label-Reloading+routes

```ruby
before do
  Rails.stub(:env) { ActiveSupport::StringInquirer.new('development') }
  Rails.application.reload_routes!
end
```
img_tagの相対パスを絶対パスに変換する


```
<img src="../img/200801/yusha_haruhi_05.jpg" width="308" height="296">
```

```rb
source_url = "http://www.figma.jp/products/2008/fig0801-01.html"

source_array = source_url.split("/")
base_path = ""

source_array.each{ |path|
  if path.present? and path != source_array.first and path != source_array.last
    base_path += "/#{path}"
  end
}

image_path = "#{source_array.first}/#{File.expand_path( image_path, base_path )}"
 # => "http://www.figma.jp/products/img/200801/yusha_haruhi_05.jpg"
```
QtのQNetworkAccessManagerで同期通信


QNetworkAccessManagerで通信し、結果を受け取るにはQNetworkAccessManager::finishedシグナルを受け取らなければならない。コードで書くとこうなる。

```c++
void ClassName::get() {
    QNetworkAccessManager *manager = new QNetworkAccessManager();

    connect(manager SIGNAL(finished(QNetworkReply*)),
            this, SLOT(finishSlot(QNetworkReply*)));
    manager->get(QUrl("http://127.0.0.1/index.html"));
}

// SLOT
void ClassName::finishedSlot(QNetworkReply *reply) {
    // 受信結果replyをゴニョゴニョ
}
```

同期通信したい場合は、QEventLoopを使用する。

```c++
void ClassName::get() {
    QNetworkAccessManager *manager = new QNetworkAccessManager();

    QEventLoop eventLoop;
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            &eventLoop, SLOT(quit()));
    QNetworkReply *reply = manager->get(QUrl("http://127.0.0.1/index.html"));
    eventLoop.exec();		// eventLoop.exec()終了後、replyにはGETの結果が格納されている

    // 続けて受信結果replyをゴニョゴニョできる
}
```

## 参考文献
http://qt-project.org/forums/viewthread/10150
正規表現のフラグ変更


# globalプロパティというのをすっかり忘れてた。というだけの話。

```javascript
// フラグを設定せずに定数的な扱いにしておく
var PATTERN = /[a-z]/

// これだといかん
'abc'.replace(new RegExp(PATTERN, 'g'), '*'); // TypeError発生

// これならOK
PATTERN.global = true;
'abc'.replace(PATTERN, '*');

// ちなみにこれはエラーにならない(無駄だけど)
'abc'.replace(new RegExp(PATTERN), '*');
```

Chromeの場合`Cannot supply flags when constructing one RegExp from another`というエラーを吐く。

コンストラクタで正規表現オブジェクトを生成するときにはフラグの上書きができないらしい。
http://ja.scribd.com/doc/86478034/22/new-RegExp-pattern-flags-§15-10-4-1

# しかしそもそも

```javascript
PATTERN.global = true;
```

これって完璧にプロパティを破壊的に変更しているので、**定数**的にしてる意味ないよね。プリミティブ値じゃないのを定数的に扱おうとしてること自体ナンセンスだったよね。

というメモでした。
Collectionのreduce関数

Backbone.jsのcollectionのreduce関数ついて
ちょっとハマったのでメモします。

例えば、以下のようなModelとCollectionがあるとします

```js:demo.js
var Time = Backbone.Model.extend({
    defaults:function(){
        id:"",
        hour:0
    }
});

var TimeList = function(){
    model:Time
});

var Times = new TimeList;
```


で、あるTimesの中のhourの値の合計を出したい場合、
`reduce`関数を使うのですが、リファレンスをみてもなかなか
ちゃんと書いていなかった。

http://blog.livedoor.jp/aki_mana/archives/6393344.html
こちらのブログで書いてあったのでちょっとだけ調べてみた

syntaxとしてはこんな感じ

```javascript:syntax1
var result = Collection.reduce(iterator, [ctx]);
```
`iterator`
評価する関数を指定

`[ctx]`
iteratorで使用するコンテキストを表す。省略可。

　
上記のiteratorに渡す関数

```javascript:syntax2
var iterator = function( prev, model, idx, models ){}
```

`prev`
関数の評価後の値が入ります。初期値は[ctx]で指定された値が入る。
前述の[ctx]の指定しない場合は配列の1番目が渡される。

`model`
Collectionに入っている値（一要素）が入る。

`idx`
インデックスです。配列の要素分（処理された回数分）カウントされる。

`models`
処理するModelの配列、つまりCollectionそのものが入ってる。

***

以上の引数があり、冒頭の処理を行う場合、以下のようになりました。


```js:reduce.js
var sum = function(prev, model){ return prev + model.get('hours'); };
var total = Times.reduce(sum, 0);
```
共有フォルダの情報を取得する方法


なんかまとまってこれ、というのが無かったので。
WMIを使って取得する。

`System.Management`を参照に追加すること。
Linqを使わないと死ぬ病気の為、LINQで扱える様にしてみた(ただし大した事はしていない)。

```cs:共有フォルダの取得	
using System.Management;

using (var searcher = new ManagementObjectSearcher("SELECT * FROM win32_share"))
{
    var list = searcher.Get().Cast<ManagementObject>().Select(x => new { Name = x["Name"], Path = x["Path"]});

    foreach (var element in list)
    {
        Console.WriteLine("共有名:" + element.Name + " パス:" + element.Path);
    }
}
```
共有フォルダ意外の共有リソース持ってきてるけど、Linqが使えるならどうとでもなるだろう。
_※本当は`"SELECT * FROM Win32_ShareToDirectory"`で持ってくるんだろうけど、データの扱いやすさ的にこっちにしてる。_

ForEachメソッドとか使えばワンライナーも可能になる。
後はSQL文のところを弄って応用すれば、他にいろんな情報取ってこれると思う。
WMIに関して詳しいのは以下のページ

>WMI Fun!
>http://www.wmifun.net/

あとは公式のドキュメントとかで。

>MSDN - WMI Reference
>http://msdn.microsoft.com/ja-jp/library/windows/desktop/aa394572(v=vs.85).aspx
ActiveRecordでデフォルトの照合順序を変更する


MySQLには文字列の照合順序(collation)というのがあって、MySQL側でのcharset utf8のときのデフォルトの照合順序はutf8_general_ciです。

ActiveRecord::Migrationでは明示的に照合順序を指定しない場合、charset utf8で照合順序utf8_unicode_ciのデータベースを作成しますが、これは少なくとも日本語圏では多くの人が期待する挙動ではないと思われるので注意が必要です。

たとえば、以下のようなファミリーテーブルをrake db:migrateすると

```ruby:db/migrate/20121112110702_create_families.rb
# coding: utf-8
class CreateFamilies < ActiveRecord::Migration
  def change
    create_table :families do |t| 
      t.string :name
      t.string :relationship
    end 
    # add_index :families, :relationship, unique: true
    Family.create(name: 'ユイ',   relationship: '本人')
    Family.create(name: 'キリト', relationship: 'パパ')
    Family.create(name: 'アスナ', relationship: 'ハハ')
  end 
end
```

utf8_unicode_ciなテーブルが作成されます。

```sql
CREATE TABLE `families` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `relationship` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
```

```sql
SELECT * FROM families;
+----+-----------+--------------+
| id | name      | relationship |
+----+-----------+--------------+
|  1 | ユイ      | 本人         |
|  2 | キリト    | パパ         |
|  3 | アスナ    | ハハ         |
+----+-----------+--------------+
```

ここで'パパ'を検索すると、utf8_unicode_ciでは'ハ'と'パ'は等価と扱われるので'ハハ'も検索に引っかかります。この挙動を期待するケースはあまり多くないのではないでしょうか。

```sql
SELECT * FROM families WHERE relationship = 'パパ';
+----+-----------+--------------+
| id | name      | relationship |
+----+-----------+--------------+
|  2 | キリト    | パパ         |
|  3 | アスナ    | ハハ         |
+----+-----------+--------------+
```

また、relationshipカラムにUNIQUEインデックスを張ってあると'パパ'と'ハハ'がUNIQUE制約を満たせないので以下のようにエラーになります。

```
Mysql2::Error: Duplicate entry 'ハハ' for key 'relationship': INSERT INTO `families` (`name`, `relationship`) VALUES ('アスナ', 'ハハ')
```

ということで、照合順序utf8_general_ciなデータベースを作成したいわけですが、これはコンフィグで`charset`と`collation`を指定するだけで簡単にいけます。

```yaml:config/database.yml
development:
  adapter: mysql2
  encoding: utf8
  charset: utf8
  collation: utf8_general_ci
  reconnect: false
  database: sao_development
```

これでrake db:migrateすると

```sql
CREATE TABLE `families` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `relationship` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `relationship` (`relationship`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
```

MySQL側のデフォルトの照合順序(utf8_general_ci)で作成されて

```sql
SELECT * FROM families WHERE relationship = 'パパ';
+----+-----------+--------------+
| id | name      | relationship |
+----+-----------+--------------+
|  2 | キリト    | パパ         |
+----+-----------+--------------+
```

ちゃんと'パパ'だけが検索に引っかかりました！

これで家族におばあちゃんが増えても安心ですね！！
to_jsonでtypeも含める

単一継承テーブルに使うtypeの値で処理をどうこうしたいとき
jsonの結果にtypeを含めたい。

いずれかで対応可能

* to_jsonのoptionに ```methods: [:type]``` を指定する
* as_jsonの返り値に ```methods: [:type]``` を指定する
Titanium mobileアプリで起動時にURL Schemeを受け取る

[Titanium mobile "early" Advent Calendar 2012-12日目](http://atnd.org/events/33731)

他のアプリとのやり取りに使われるURL Schemeですが、Titanium側からTi.Platform.openURLを使って開くことは多いと思います。
逆に他のアプリからURL Schemeを使ってTitanium mobileのアプリを開いた時に引数を受け取る方法を紹介します。

まずはおさらいとしてTitanium側から開く場合。

```javascript:foo.js
// iOSのChromeブラウザでわんこそばのキーワード検索をYahooで調べる。    
var app = 'googlechrome://'
var url = 'search.yahoo.co.jp/search?p='
var keyword = 'わんこそば'

// パラメータを渡す必要がある場合はエンコードしておきましょう。
var scheme = encodeURI(app + url + keyword)

// Ti.Platform.openURLは開けなくてもエラーにならないので事前にcanOpenURLで確認しておく。
if (Ti.Platform.canOpenURL(scheme)) {
    Ti.Platform.openURL(scheme);
} else {
    alert('Chromeがインストールされてませんよ');
}
```

ポイントとしては単純にアプリを起動するときは気にすることもないのですが引数を渡す場合はencodeURI(str)をしておくほうが良いこと。
それと Ti.Platform.openURL(scheme)は起動に失敗してもエラーにならないので事前にTi.Platform.canOpenURL(scheme)で開くかどうか確かめておいたほうが良いです。

さて、本題の受け取る方ですが、

```javascript:app.js
// 最後に受け取ったURL
var lastUrl = null

// 引数を処理する関数
var _parseArguments = function() {

    // アプリ起動時の引数の中から呼び出された際のURL schemeを取得
    var url = Ti.App.getArguments()['url'];

    // バックグラウンドから復帰した時に前回のURLがそのまま残っているので
    // 同じ処理を何度もしないようにurlとlastUrlを比較する
    if (url && lastUrl !== url) {
        lastUrl = url;

        // 受け取ったURLの処理の例
        // ここではyourappname://?action=post&title=Hello&body=Worldを受け取ったとして
        var array = url.replace('yourappname://?', '').split('&');

        // ['action=post', 'title=Hello', 'body=World']
        var params = {};
        for (var _i = 0, var _len = array.length; _i < _len; _i++) {
            var kv = array[_i].split('=')
            if (kv.length > 1) {
                params[kv[0]] = decodeURIComponent(kv.shift().join(''));
            }
        }
        //受け取ったparamsの処理
    }
};

// 起動時に実行
_parseArguments();

// バックグラウンドから復帰した時にも実行 
Ti.App.addEventListener('resumed', function() {
    _parseArguments();
});
```

URLはTi.App.getArguments()['url'];で簡単に受け取ることができます。
あとは受け取ったURLを解析して必要なデータを取り込むだけですが、受け取るときの状態が起動時もしくはバックグラウンドからの復帰の2パターンあるので注意が必要です。

とくにバックグラウンドからの復帰時は前回受け取ったURLをそのまま保持しています。
そのため復帰するたびに同じ処理を繰り返すことになるので、回避できるようにしておきましょう。
PHPで携帯メールアドレスの判定


もう使わないかもしれないけど。。

``` php
$regex = preg_match("/^.+@(docomo\.ne\.jp|ezweb\.ne\.jp|softbank\.ne\.jp|i\.softbank\.ne\.jp|t\.vodafone\.ne\.jp|d\.vodafone\.ne\.jp|h\.vodafone\.ne\.jp|c\.vodafone\.ne\.jp|k\.vodafone\.ne\.jp|r\.vodafone\.ne\.jp|n\.vodafone\.ne\.jp|s\.vodafone\.ne\.jp|q\.vodafone\.ne\.jp|pdx\.ne\.jp|wm\.pdx\.ne\.jp|di\.pdx\.ne\.jp|dj\.pdx\.ne\.jp|dk\.pdx\.ne\.jp)$/",$data);
```
Excelで新しいブックを作成した際に、デフォルトで作成されるシート数を1にする

[スタートアップで働く僕が仕事で心がけている7つのこと - パパパパ]( http://www.paji.me/entry/2012/11/12/110153)を読んで、そういえば自分も使っていないExcelのシートを削除するようにしているなと思いました。

毎回削除するのは面倒なので、新規ファイルのシート数は1になるようにしておいた方が楽ちんです。

-----

直し方は[Excelで新しいブックを作成した際に、デフォルトで作成されるシート数は変更することが可能 | システム開発ブログ(システム開発のアイロベックス｜東京都新宿区の業務システム開発会社)](http://www.ilovex.co.jp/blog/system/projectandsystemdevelopment/excel-2.html)がまとまっています。以下リンク先からの引用です。

## Excel2003以前のバージョンの場合

1.[ツール(T)]-[オプション(O)]でオプションウィンドを開き、[全般]タブを選択します。
2.[全般]タブにある「新しいシートのブック数(S)」の値を変更します。

## Excel2007
1.Excelの左上にある[Officeボタン]を押下し、メニューを開きます。
2.開いたメニューの右下にある[Excelのオプション(T)]を選択し、
Excelのオプションウィンドを開きます。
3.Excelのオプションウィンドの左側のメニューの[基本設定]を選択します。
4.[基本設定]の「新しいブック作成時」の欄の「ブックのシート数(S)」の値を変更します。

## Excel2010
1.Excelの左上にある[ファイル]を押下し、メニューを開きます。
2.開いたメニューの左側の欄にある[オプション]を選択し、
Excelのオプションウィンドを開きます。
3.Excelのオプションウィンドの左側のメニューの[基本設定]を選択します。
4.[基本設定]の「新しいブック作成時」の欄の「ブックのシート数(S)」の値を変更します。

## Excel2013
※最初からシート数は1ですが、Excel2010と同様の方法でシート数を変更できます。
DmlException エラーメッセージの表示

getDmlMessageでDmlExceptionのエラーメッセージを取得できます。

```Apex:Apex
try {
  update lists;
} catch (DmlException e) {
  for (Integer i = 0; i < e.getNumDml(); i++) {
    ApexPages.addMessage(new  ApexPages.Message(ApexPages.Severity.ERROR,e.getDmlMessage(i)));
  }
  return;
}
```
Hello, World!


SYNOPSIS 的にコード片を書いてみる。runghcへ標準入力からぶっ込んで試せる感じの方がREPLよりしっくり来る派なので。

```haskell:
% runghc
import System.Process

main = do
  name <- readProcess "hostname" [] []
  let chompedName = filter (/= '\n') name
  putStrLn $ "Hello, " ++ chompedName ++ "!"

-- [実行結果]
-- Hello, mymac.local!
```
QList で生データをとってはいけない

今日これにだいぶ時間を取られてしまったので備忘録としてとっておく

この中で唯一意図しない挙動を起こすものはどれだろうか？

```cpp
    // 各種コンテナから int の配列にコピーする処理を実装するテスト
    quint32 stack[3];

    // QList 
    QList<int> list;
    list << std::numeric_limits<quint8>::max()
         << std::numeric_limits<quint16>::max()
         << std::numeric_limits<quint32>::max();
    memcpy(&stack[0], &list[0], sizeof(stack));
    qDebug() << stack[0] << stack[1] << stack[2];

    // QVector
    QVector<int> vector;
    vector << std::numeric_limits<quint8>::max()
           << std::numeric_limits<quint16>::max()
           << std::numeric_limits<quint32>::max();
    memcpy(&stack[0], &vector[0], sizeof(stack));
    qDebug() << stack[0] << stack[1] << stack[2];

    // std::vector
    std::vector<int> sv;
    sv.push_back(std::numeric_limits<quint8>::max());
    sv.push_back(std::numeric_limits<quint16>::max());
    sv.push_back(std::numeric_limits<quint32>::max());
    memcpy(&stack[0], &sv[0], sizeof(stack));
    qDebug() << stack[0] << stack[1] << stack[2];

    // QVarLengthArray
    QVarLengthArray<int> va;
    va.append(std::numeric_limits<quint8>::max());
    va.append(std::numeric_limits<quint16>::max());
    va.append(std::numeric_limits<quint32>::max());
    memcpy(&stack[0], &va[0], sizeof(stack));
    qDebug() << stack[0] << stack[1] << stack[2];
```


答えは QList で、実行する度に値が変化する。よって、配列内の生データを直接取得したい場合は QList 以外のコンテナを使うこと。

QList と QVector はよく似ているが、使用するアルゴリズムが異なる（一番の違いは QList は prepend がおおよそ O(1) で完結する点）。Qt 的には前者を推奨している。
http://qt-project.org/doc/qt-4.8/qvector.html
http://qt-project.org/doc/qt-4.8/containers.html#algorithmic-complexity
dstatをfluentd + GrowthForecastで可視化する


dstatの結果をfluentd経由でGrowthForecastに投げる方法は、ぐぐると何件かブログ記事がでてきます。 ただ、どれもdstatを改造したり、プラグインを改造したりしてて、あまり使い勝手がよくありません。

というわけで、gemでいれれるプラグインだけを使って、可視化できる設定を探してみました。

## 準備

必要なgemをインストールする。

    gem install fluent-plugin-map fluent-plugin-dstat fluent-plugin-growthforecast

## 設定ファイル
    
    <source>
      type dstat
      tag dstat
      option -cm
      delay 3
    </source>

    # GrowthForecast用にメッセージを加工する
    <match dstat>
      type copy

      # CPU関連の結果だけを取り出す
      <store> 
        type map
        tag "perf.cpu"
        time time
        record record['dstat']['total cpu usage']
      </store>

      # メモリ関連の結果だけを取り出す
      <store> 
        type map
        tag "perf.mem"
        time time
        record record['dstat']['memory usage']
      </store>
    </match>

    # GrowthForecastに転送する
    <match perf.**>
       type growthforecast
       gfapi_url http://example.com/api/
       service dstat
       tag_for section
       remove_prefix perf
       name_key_pattern .*
    </match>

## 参考

 * [fluentd使ってdstatの結果をgrowthforecastで表示する | tjun memo](http://tjun.jp/blog/2012/06/fluentd-dstat-growthforecast/ "fluentd使ってdstatの結果をgrowthforecastで表示する | tjun memo")
 * [dstatの万能感を満喫するためにfluentdにログを飛ばしてみた - As a Futurist...](http://blog.riywo.com/2012/03/03/035708 "dstatの万能感を満喫するためにfluentdにログを飛ばしてみた - As a Futurist...")
 * [dstatをfluentd＋growthforecastでグラフ化(前編) - アルパカDiary](http://d.hatena.ne.jp/toritori0318/20120723/1343059303 "dstatをfluentd＋growthforecastでグラフ化(前編) - アルパカDiary")
SublimeText2のプラグインで、チェックボックスつきのメニュー項目を追加する方法


Version 2.0 以降では、プラグインで追加したメニュー項目にチェックボックスをつけることができるようになりました。

![チェックボックス](https://www.dropbox.com/s/8e9n1iugg3mb01g/グラブ.png?dl=1)

[Sublime 公式フォーラム](http://www.sublimetext.com/forum/viewtopic.php?f=6&t=5864)の投稿を参考にしました。



## Main.sublime-menu

いつもの記述に、**"checkbox": true** を足すだけです。

```json:Main.sublime-menu
{
    {
        "id": "edit",
        "children":
        [
            {"id": "wrap"},
            { "command": "checkbox_menu", "caption": "Test!", "checkbox": true }
        ]
    }
}
```

## py ファイル

この例では、クリックされたらチェックのON/OFFを切り替えます。

```python:check.py
import sublime, sublime_plugin

class CheckboxMenuCommand(sublime_plugin.WindowCommand):
	_is_checked = False

	def run(self):
		self._is_checked = not self._is_checked

	def is_checked(self):
		return self._is_checked

```

* **WindowCommand** にします。
* チェックが切り替えられたときのイベントは、**do run(self)** に記述します。
* メニューのチェックボックスの状態は、**is_checked(self)** で規定します。つまり、ここで True を返せばチェックがつき、False を返せばチェックがつかないことになります。
CAM::PDFで複数のPDFを結合する


まずはモジュールをインストール

    $ cpanm CAM::PDF

その後は以下のgistのようにPDFを結合する処理を書いて終わり

CAM::PDFを利用して複数のPDFを結合するスクリプトサンプル — Gist
https://gist.github.com/4054634

結合元と結合先のPDFファイルをインスタンス化して$pdf1->appendPDF($pdf2)するだけで$pdf1の末尾に$pdf2のページが結合される

gistに上げたメソッドだけを使っていくつかのPDFを結合してみた限りでは特に不具合も無い模様


* 参考

CAM::PDF - search.cpan.org
http://search.cpan.org/~cdolan/CAM-PDF-1.58/lib/CAM/PDF.pm

PHPでPDFファイルを結合するには？ － Linux Square － ＠IT
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42650&forum=10
Railsに手作業でアイコンフォントを導入する方法

Twitter Bootstrap Rails利用していれば、デフォルト（？）でFont Awesomeを利用できますが、
こちらのサイトのアイコンを利用したかったので、試行錯誤してみました。
http://www.tenbytwenty.com/sosa.php

##下準備
1. まずは、上記のサイトからファイルをダウンロード。

2. ``app/assets``に``fonts``という名前のフォルダを作る。

3. ``fonts``フォルダにダウンロードしたファイル``sosa.eot sosa.svg sosa.ttf sosa.woff``をすべて入れる。

4. ``app/assets/stylesheets``に``sosa.css.scss.erb``という名前のファイルを作る。以下のように入力。各種値はお好みで変更を。

```ruby:sosa.css.scss.erb
@font-face {
	font-family: 'Sosa';
	src: url('<%= asset_path('sosa.eot') %>');
	src: url('<%= asset_path('sosa.eot') + '?#iefix' %>') format('embedded-opentype'),
	     url('<%= asset_path('sosa.woff') %>') format('woff'),
	     url('<%= asset_path('sosa.ttf') %>') format('truetype');
	     url('<%= asset_path('sosa.svg') + '#SosaRegular' %>') format('svg')
	font-weight: normal;
	font-style: normal;
}
[data-icon]:after {
	display: block;
	content: attr(data-icon);
	font-family: Sosa;
	font-size: 1.8em;
	line-height: 1.4;
	padding-right: 0.2em;
	color: #069CDB;
	box-shadow: 0 0 3px rgba(0,0,0,0.1);
}
[data-icon].white:after {
	display: block;
	content: attr(data-icon);
	font-family: Sosa;
	font-size: 1.8em;
	line-height: 1.4;
	padding-right: 0.2em;
	color: #ffffff;
	box-shadow: 0 0 3px rgba(0,0,0,0.1);
}
```

##Configへ追加

```ruby:config/environments/developments.rb
  config.assets.paths << Rails.root.join("app", "assets", "fonts")
  config.assets.precompile += %w( .svg .eot .woff .ttf )
```

```ruby:config/environments/production.rb
  config.assets.paths << Rails.root.join("app", "assets", "fonts")
  config.assets.precompile += %w( .svg .eot .woff .ttf )
```

##Viewの書き方

```ruby:app/views/users/index.html.erb
<span data-icon='0'></span> ...span要素のすぐ後にヘッドフォンがでます。
<span data-icon='0' class="white"></span> ...ヘッドフォンが白になります。

```

※それぞれの``data-icon``のkeyはWebサイトに掲載されています。

#HerokuへPushするときの注意点
私の環境では、``config/applicaiton.rb``に``config.assets.initialize_on_precompile = false`` を追加しているので、事前にlocal環境でPrecompileしてからPushしたところ成功しました。
（PrecompileせずにPushしたところ、これまで問題なかったCSSまで読み込まれませんでした。また、``heroku run rake assets:precompile``でも解消しませんでした）

```ruby:console
$rake assets:precompile
```

***
以上です。他のフォントセットでも使えると思いますので、お試しいただければと思います。
UIColor から UIImage を作る

UIColor から UIImage を作りたい場面があったので、調べてみたところ、以下のような感じで作成することができました。

```
UIImage *(^createImageFromUIColor)(UIColor *) = ^(UIColor *color)
{
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(contextRef, [color CGColor]);
    CGContextFillRect(contextRef, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
};
```

でこれを、

```
// UIColor から UIImage を作成する
UIImage *redImage = createImageFromUIColor([UIColor redColor]);
UIImage *blueImage = createImageFromUIColor([UIColor blueColor]);
UIImage *yellowImage = createImageFromUIColor([UIColor yellowColor]);

// UIButton には setBackgroundColor:forState メソッドがない
[button setBackgroundImage:redColor forState:UIControlStateNormal];
[button setBackgroundImage:blueImage forState:UIControlStateHighlighted];
[button setBackgroundImage:yellow forState:UIControlStateSelected];
```

こんな感じにすることで、画像を用意しなくても、UIButton の UIControllState に応じた色を指定することができます。

最終的に画像を用意してもらうことがほとんどだと思いますが、RoundRect のボタンではなく、Custom で自分の好きな色を簡単に指定した場合に使えるんじゃないでしょうか。
CentOS 6.3にシステムワイドなrbenv+ruby-buildの環境を構築する手順


## 1. rbenvとruby-buildのインストール
全てのユーザで共有したいのでrbenvを/usr/localにインストールする。rootで作業する。

```bash
# cd /usr/local
# git clone git://github.com/sstephenson/rbenv.git rbenv 
# mkdir rbenv/shims rbenv/versions
# groupadd rbenv
# chgrp -R rbenv rbenv
# chmod -R g+rwxXs rbenv
# git clone git://github.com/sstephenson/ruby-build.git ruby-build
# cd ruby-build
# ./install.sh 
```

## 2. 環境変数の設定
rbenvとruby-buildを全ユーザで利用するために環境変数を設定する。
けれども、どこで、どのように設定するかが悩む。
今回は/etc/profile.d下に環境変数を設定するshell scriptを作成する方法をとる。

```/etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

## 3. sudo時に環境変数のPATHを引き継ぐ設定をする

```
# visudo
```
を実行し、

```
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
```

に

```
Defaults    env_keep += "PATH"
```

を追記する。

インストールは個々までで完了。
あとは再ログインして`rbenv install --list`とかで確認すればOK.
sencha touchでURLバーを隠す方法

# 概要
スマートフォンサイトでよく見かける下記のようなスクロールバーを隠す方法をsencha touchでやる場合の対応についての備忘録

```javascript
$(function(){
    window.scrollTo(0,1);
});
```

# 対応
sencha touchの場合はapp.jsに下記のように記述します

```javascript
viewport: {
    autoMaximize: !Ext.browser.is.Standalone && Ext.os.is.iOS
},
```

* 画面回転した際のパフォーマンスが低下する
* AndroidやWebviewで不具合がある

等の注意事項があるのでよく検証した方がよさそうです。

# 参照
* [Ext.viewport.DefaultView.autoMaximize](http://docs.sencha.com/touch/2-0/#!/api/Ext.viewport.Default-cfg-autoMaximize)