OmniAICreator/Qiita-1.07M huggingface dataset:
easeljsでスワイプ

微妙...

```javascript
var FPS = 60;
var canvas = document.getElementById("testCanvas");
var stage = new createjs.Stage(canvas);

if (createjs.Touch.isSupported()) {
  createjs.Touch.enable(stage, false, false);
}
createjs.Ticker.setFPS(FPS);
createjs.Ticker.addEventListener("tick", handleTick);

stage.addEventListener("stagemousedown", mouseDown);
stage.addEventListener("stagemousemove", mouseMove);
stage.addEventListener("stagemouseup", mouseUp);
stage.addEventListener("stageswipeleft", swipeLeft);
stage.addEventListener("stageswiperight", swipeRight);
//stage.addEventListener("stageswipeup", swipeUp);
//stage.addEventListener("stageswipedown", swipeDown);

stage.update();


function mouseDown(e) {
  startPosX = e.stageX;
  startPosY = e.stageY;
}

function mouseMove(e) {
}

function mouseUp(e) {
  endPosX = e.stageX;
  endPosY = e.stageY;

  var swipeThreshold = 10; 
  var deltaX = startPosX - endPosX;
  var deltaY = startPosY - endPosY;
  var horSwipeDistancePer = Math.abs((deltaX / stage.canvas.width) * 100);
  var verSwipeDistancePer = Math.abs((deltaY / stage.canvas.height) * 100);
  var swipeDirection;

  // horizontal
  if (Math.abs(deltaX) > Math.abs(deltaY) && horSwipeDistancePer > swipeThreshold) {
      swipeDirection = startPosX - endPosX > 0 ? "left" : "right";
      //console.log(swipeDirection);
      stage.dispatchEvent({type: "stageswipe" + swipeDirection, delta: Math.abs(deltaX)});
  // vertical
  } else if (Math.abs(deltaX) < Math.abs(deltaY) && verSwipeDistancePer > swipeThreshold) {
      swipeDirection = startPosY - endPosY > 0 ? "up" : "down";
      //console.log(swipeDirection);
      stage.dispatchEvent({type: "stageswipe" + swipeDirection, delta: Math.abs(deltaY)});
  }
}

function swipeLeft(event) {
  console.log("left", event.delta);
}

function swipeRight(event) {
  console.log("right", event.delta);
}

//function swipeUp(event) {
//  console.log("up", event.delta);
//}

//function swipeDown(event) {
//  console.log("down", event.delta);
//}

function handleTick(event) {
  stage.update();
}
```
rspecでafter_commitのテスト

# 概要
* rspecのデフォルトの設定では、データベースへのコミットが行われないようになっているため、after_commitのテストができない
* テストする方法をメモしておく

# 特定のテストだけcommitする

## run_callbacksを使う

```ruby

describe User do
  before do
    User.create!(name: "hoge")
    @user_id = User.last.id
  end

  it 'should output logs' do
    Rails.logger.should_receive(:warn).with(/hoge/o)
    user = User.find_by_id(@user_id)
    user.destroy
    user.run_callbacks(:commit)
  end
end

```

# すべてのテストでcommitする

## config.use_transactional_fixtures = false にする

* ロールバックは自分でする必要がある

```rb:

# spec_helper.rb

# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = false

```

# 参考
 * http://mytrile.github.io/blog/2013/03/28/testing-after-commit-in-rspec/
 * http://stackoverflow.com/questions/10656942/why-after-commit-not-running-even-with-use-transactional-fixtures-false
 * https://www.relishapp.com/rspec/rspec-rails/docs/transactions
Mountain Lion環境への「Homebrew」のインストール手順


## はじめに

「Homebrew」とは、MacOSX用のパッケージ管理システムである。
「Homebrew」を使って、MacOSXにインストールされていないソフトウェアパッケージをインストールすることができる。

今回は、この「Homebrew」を Mountain Lion上にインストールするための手順について記述する。

## 前提条件

対象の環境情報を以下に示す。

|ソフトウェア|バージョン|
|----|----|
|OS|OSX バージョン 10.8.3|
|Java|JRE 1.7.0_09|
|Xcode|4.6.2|
|Ruby|1.9.3|

*) 「Xcode Command Line Tools」もインストールされていること。

## インストール手順

### 1. 「Terminal.app」を開き、以下のコマンドを実行する。

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### 2. ターミナル上で以下のコマンドを実行し、「Your system is ready to brew.」が表示されることを確認する。

```
brew doctor
```

*) 上記コマンドを実行した際に、以下の警告メッセージが表示されることがある。

> Warning: Your XQuartz (2.7.3) is outdated
> Please install XQuartz 2.7.4.

この場合、[http://xquartz.macosforge.org/landing/](http://xquartz.macosforge.org/landing/)からdmgファイルをダウンロードしてインストールすること。

### 3. ターミナル上で以下のコマンドを実行し、「Homebrew」のバージョンが表示されることを確認する。

```
brew -v
```

## 参考資料

* 公式サイト：[http://brew.sh/](http://brew.sh/)
* [Mac] Mountain Lionへパッケージ管理「Homebrew」をインストールする手順のメモ：[http://tools4hack.santalab.me/howto-mountainlion-install-homebrew.html](http://tools4hack.santalab.me/howto-mountainlion-install-homebrew.html)
ip conntrack

iptablesでは、関連したパケットを追跡するために/proc/net/ip_conntrackというファイルを作り、パケットの情報を記録している。
このip_conntrackに記録できる上限数を決めているのが/proc/sys/net/ipv4/ip_conntrack_max。
アクセスが増加し、ip_conntrack_maxの値を超えてしまうと、パケットが捨てられてしまうという事態に陥る。
iptablesを再起動するとip_conntrack_maxがデフォルト値に戻ってしまうので注意

現在のip_conntrack数

```
CentOS5
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count 

CentOS6
cat /proc/sys/net/netfilter/nf_conntrack_count
```

ip_conntrackの上限

```
CentOS5
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max

CentOS6
cat /proc/sys/net/nf_conntrack_max
```

上限を変える場合は/proc/sys/net/ipv4/netfilter/ip_conntrack_max を手動で書き換えるか、sysctl.confに下記を追加

```
CentOS5

net.ipv4.ip_conntrack_max = 327520

CentOS6

net.nf_conntrack_max = 327520
```
JavaScriptでオブジェクトの型を判別するのにtypeof演算子使うとツラいよね

何がツラいって一番ありがちな下記のような場合ですよね。

```javascript
var a = {}, b = [], c = 'hoge', d = new String('hoge');

typeof a; // "object"
typeof b; // "object" ← ファッ？！
typeof c; // "string"
typeof d; // "object" ← ファッ？！
```

*Object* と *Array* を区別してくれないとかないわー。`new String()`使うことないけど、区別しちゃうとかないわー。

ということで以前に自分が日本語訳した[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/ja/#types.typeof)にも書いてあった方法を使うと
判別が楽になるんじゃないかと。

```javascript
function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

is('String', 'hoge'); // true
is('String', new String('hoge')); // true
```

`Object.prototype.toString`することによって`[[Class]]`という内部プロパティを取得して必要なものを切り出してっていう話です。

これで下記のようなタイプを取得してこれますので比較対象として引数に渡してあげましょうという感じです。

- String
- Number
- Boolean
- Date
- Error
- Array
- Function
- RegExp
- Object

これで大体感覚通りの型判別ができると思います。

余談ですが、上記のサイトの中で唯一`typeof`が使える場面としてた下記のような未定義変数の判別だけ！と書いてあります。

```javascript
typeof hoge !== 'undefined'; // 未定義だとfalseに
```

ですよね…。


参照： http://bonsaiden.github.io/JavaScript-Garden/ja/#types.typeof
Django 1.4.2 の セッションキーの生成


ふと unique な key を作るのに django はどうしてるんだろうと思って隣の人と一緒に調べた。

[セッションIDの作り方 - スコトプリゴニエフスク通信](http://d.hatena.ne.jp/perezvon/20110111/1294742153)

手元の 1.4.2 だと OS の pid を取ってるコードは見当たらなかった。

django.contrib.sessions.base.SessionBase に _get_new_session_key() てメソッドが生えてるんだけど、その中では django.utils.crypto にある get_random_string() が使われてて多分それがキー生成してる関数。

```crypto.py
def get_random_string(length=12,
                      allowed_chars='abcdefghijklmnopqrstuvwxyz'
                                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'):
    """
    Returns a securely generated random string.

    The default length of 12 with the a-z, A-Z, 0-9 character set returns
    a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
    """
    if not using_sysrandom:
        # This is ugly, and a hack, but it makes things better than
        # the alternative of predictability. This re-seeds the PRNG
        # using a value that is hard for an attacker to predict, every
        # time a random string is required. This may change the
        # properties of the chosen random sequence slightly, but this
        # is better than absolute predictability.
        random.seed(
            hashlib.sha256(
		"%s%s%s" % (
                    random.getstate(),
                    time.time(),
                    settings.SECRET_KEY)
                ).digest())
    return ''.join([random.choice(allowed_chars) for i in range(length)])
```

useng_sysramdom が False の時は
random.getstate() と time.time() と settings.SECRET_KEY を SHA256 にかけた値を種にしてるね。

using_sysramdom フラグは crypto.py の中で random.SysRandom が使用可能かどうかを判断してセットされてる。
ここは上の blog の内容と同じ。

```crypto.py
import random
try:
    random = random.SystemRandom()
    using_sysrandom = True
except NotImplementedError:
    import warnings
    warnings.warn('A secure pseudo-random number generator is not available '
                  'on your system. Falling back to Mersenne Twister.')
    using_sysrandom = False
```

これは、最終的には ramdom な値なので、 unique なキーとしてはどうなのかなぁ、という疑問が少し残ってるけど、まぁこんなもんかなぁ。

ちなみに自分が昔 unique な値作ろうとしてやった時は [Catalyst::Plugin::Session](http://cpansearch.perl.org/src/BOBTFISH/Catalyst-Plugin-Session-0.37/lib/Catalyst/Plugin/Session.pm) (perl) のを拝借してた。

```Session.pm
my $counter;

sub session_hash_seed {
    my $c = shift;

    return join( "", ++$counter, time, rand, $$, {}, overload::StrVal($c), );
}

# ~~ snip ~~

sub generate_session_id {
    my $c = shift;

    my $digest = $c->_find_digest();
    $digest->add( $c->session_hash_seed() );
    return $digest->hexdigest;
}
```

最後に ramdom かけてないので、こっちのほうが一意な気はするんだけどわからん。
画面のインチ数を取得する

タブレットの判定に。高解像度化が進んでピクセルではわからなくなったので。
7インチkindleは6.99という結果になったので6.5あたりが分かれ目かも。


```
private double getInch() {
    WindowManager windowManager = getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);
    double inchX = displayMetrics.widthPixels / displayMetrics.xdpi;
    double inchY = displayMetrics.heightPixels / displayMetrics.ydpi;
    double inch = Math.sqrt((inchX * inchX) + (inchY * inchY));
    Log.v("inch", inch + ":" + inchX + ":" + inchY);
    return inch;
}
```
nginxでrequest_uriに応じてHTTP/HTTPS片方のみ許可

トップページ("/")はHTTPで見せるけど, それ以外のページ(= ログイン後)はHTTPSのみ許容するという設定. server directive内で使う.
nginxは多段ifが使えないので力技な書き方になる（他にいいやり方あるのだろうか...）

`````````````nginx
set $https_and_top "";
if ( $scheme = "https" )  { set $https_and_top "${https_and_top}HTTPS"; }
if ( $request_uri = "/" ) { set $https_and_top "${https_and_top}&TOP"; }
if ( $https_and_top = "HTTPS&TOP" ) {
    return 301 http://hoge.com/;
}

set $http_and_not_top "";
if ( $scheme = "http" )    { set $http_and_not_top "${http_and_not_top}HTTP"; }
if ( $request_uri != "/" ) { set $http_and_not_top "${http_and_not_top}&NOTTOP"; }
if ( $http_and_not_top = "HTTP&NOTTOP") {
    return 301 https://hoge.com$request_uri;
}
```````````
Androidで携帯に設定されてるGmailを取得する。

パーミッションはandroid.permission.GET_ACCOUNTSが必要。
マルチアカウントなので複数返ってくることもあります。

```
ArrayList<String> mailList = new ArrayList<String>();
Account[] accounts = AccountManager.get(this).getAccounts();
    for (Account account : accounts) {
    String type = account.type;
    if (type.equals("com.google")) {
        String mail = account.name;
        mailList.add(mail);
    }
}
```

これでもよかった


```
ArrayList<String> mailList = new ArrayList<String>();
accounts = AccountManager.get(this).getAccountsByType("com.google");
for (Account account : accounts) {
        mailList.add(account.name);
}
```
UILabelを角丸にする＆パディングを設定する方法

######角丸にする

LibraryにQuatzCore.frameworkを足す

```objc
#import <QuartzCore/QuartzCore.h>

- (void) hoge
{
    [[label layer] setCornerRadius:5.0];
    [label setClipsToBounds:YES];
}
```

######パディングを設定する
参考
[UILabelにパディング設定](http://www.j7lg.com/archives/481)

サブクラスを作った方が良いそうです。

```objc:MyUILabel.m

- (void)drawTextInRect:(CGRect)rect
{
    // top, left, bottom, right
    UIEdgeInsets insets = {0, 20, 0, 20};

    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
```
Tips : Vagrantfileでproxyを設定する

こんにちは。

以前、[proxy下でVagrant+knife-soloしちゃおう](http://qiita.com/items/b5a7dc8819a2e0e0f603)という記事を投稿しましたが、その感想で__「わざわざsshで繋いでproxyの設定しなくちゃいけないじゃん 何が自動化だ めんどくせ」__と文句を垂れていました。

ちょっと挑戦してみたところ、Vagrantfileでシェルスクリプトが実行出来るということを知ったので、ここでプロキシ設定してみました。

#やり方
Vagrantfileに以下を追加するだけ。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
...

  $script = <<-SCRIPT
    input_file=/etc/environment
    output_file=/etc/tmpenvironment

    sed -e "/^http_proxy/d" -e "/^https_proxy/d" -e "/^no_proxy/d" $input_file > $output_file
    echo 'http_proxy="http://SERVER:PORT"\nhttps_proxy="https://SERVER:PORT"\nno_proxy="192.168.*.*"' >> $output_file
    mv $output_file $input_file
  SCRIPT

  config.vm.provision :shell,
    :inline => $script

...
end
```

シェルスクリプトというものを初めて書いたので、美しい書き方かどうか不明ですが、一応これで動いています。

これで、少し手間が省けました。
プロットした画像を表示せずに保存する。

プロットした画像群をひたすら保存したい時、わざわざ画像が表示されるのが煩わしい時があります。
そんな時は以下のコマンドで一発解決。

```matlab
%figureのvisibleプロパティをoffにすればおｋ．
f_handle = figure('visible', 'off');

%plot,peaksなど、画像の描画。
peaks;

saveas(f_handle, 'image%05d.jpg', i);
[Rails 3.2.9] ActiveRecordでIN句



``` Ruby
User.where(id: [1, 5, 7])
```

上記コードは以下のSQLを発行する。

```SQL
SELECT * FROM users WHERE users.id IN (1, 5, 7)
```


**参考サイト**

* [Ruby on Rails 3 howto make 'OR' condition - Stack Overflow]( http://stackoverflow.com/questions/3291152/ruby-on-rails-3-howto-make-or-condition )

* [Ruby Activerecord IN clause - Stack Overflow]( http://stackoverflow.com/questions/10181864/ruby-activerecord-in-clause )
UINavigationControllerの座標/サイズが勝手に元に戻る

こんなのを用意して、

```objc:Navicon
@interface NaviCon : UINavigationController
@end

@implementation NaviCon
- (void)viewDidLoad
{
  NSLog( @"[viewDidLoad] frame  %@", NSStringFromCGRect(self.view.frame) );
  NSLog( @"[viewDidLoad] bounds %@", NSStringFromCGRect(self.view.bounds) );
  self.view.frame = CGRectMake( 10, 20, 30, 40 );
  [super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated
{
  NSLog( @"[viewWillAppear] frame  %@", NSStringFromCGRect(self.view.frame) );
  NSLog( @"[viewWillAppear] bounds %@", NSStringFromCGRect(self.view.bounds) );
  self.view.frame = CGRectMake( 50, 60, 70, 80 );
  [super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
  NSLog( @"[viewDidAppear] frame  %@", NSStringFromCGRect(self.view.frame) );
  NSLog( @"[viewDidAppear] bounds %@", NSStringFromCGRect(self.view.bounds) );
  self.view.frame = CGRectMake( 90, 100, 110, 120 );
  [super viewDidAppear:animated];
}
@end
```

こうすると、

```objc:AppDelegate
NaviCon *navicon = [[[NaviCon alloc] init] autorelease];
NSLog( @"[alloc] frame  %@", NSStringFromCGRect(navicon.view.frame) );
NSLog( @"[alloc] bounds %@", NSStringFromCGRect(navicon.view.bounds) );

self.window.rootViewController = navicon;
[self.window makeKeyAndVisible];
NSLog( @"[makeKeyAndVisible] frame  %@", NSStringFromCGRect(navicon.view.frame) );
NSLog( @"[makeKeyAndVisible] bounds %@", NSStringFromCGRect(navicon.view.bounds) );
```

こうなる。

```
[viewDidLoad] frame  {{0, 0}, {320, 480}}
[viewDidLoad] bounds {{0, 0}, {320, 480}}

[alloc] frame  {{10, 20}, {30, 40}}
[alloc] bounds {{0, 0}, {30, 40}}

[viewWillAppear] frame  {{0, 0}, {320, 480}}
[viewWillAppear] bounds {{0, 0}, {320, 480}}

[makeKeyAndVisible] frame  {{0, 0}, {320, 480}}
[makeKeyAndVisible] bounds {{0, 0}, {320, 480}}

[viewDidAppear] frame  {{0, 0}, {320, 480}}
[viewDidAppear] bounds {{0, 0}, {320, 480}}
```

`viewDidLoad`と`viewWillAppear`で設定した値が、すぐ元に戻ってしまう。
最終的に`viewDidAppear`で設定した値は、そのまま有効になってる。

なぜ？
マージコミットのrevertとcherry-pick

以下のようなコミットグラフを例にして説明します。
A->Dの順に新しいコミットとし、便宜上、DのコミットIDを"abcdefg"とします。

D
| \
C |
| B
|/
A

```
# Bのブランチをrevertする場合
git revert -m 1 abcdefg

# Bのブランチをcherry-pickする場合
git cherry-pick -m 1 abcdefg

# Cのブランチをrevertする場合
git revert -m 2 abcdefg

# Cのブランチをcherry-pickする場合
git cherry-pick -m 2 abcdefg
```
Python 3の正規表現で \d を使うな！

案外知られていないようなのですが、Python 3 標準の reモジュールの正規表現では`\d`がいわゆる全角数字にもマッチします。

実際に試してみます。

```pycon:
>>> import re
>>> re.findall(r"\d", "012０１２")
['0', '1', '2', '０', '１', '２']
>>> 
```

`\d`が`'０'`、`'１'`、`'２'`にもマッチしていますね。

この挙動があまり知られていない原因としては、

* Python 3の公式ドキュメントの「[正規表現 HOWTO](http://docs.python.jp/3.3/howto/regex.html#regular-expression-howto)」の説明が、かなり誤解を招きやすい書き方になっている。
* `\d`がいわゆる全角数字にマッチするかどうかをわざわざテストする人は少ない
* 敬虔なPythonistaは正規表現を使わないやり方を好む傾向がある

等の理由が考えられますが、他の原因もあるかもしれません。

`\d`を`[0-9]`にだけマッチさせるには、`\d`の代わりに`[0-9]`を使うのがオススメだと[reモジュールのドキュメントにも書いてある](http://docs.python.jp/3.3/library/re.html#regular-expression-syntax)のですが、他の言語用の長大な正規表現をそのまま流用したい等の理由でどうしても`\d`のままにしておきたい場合は、引数に`flags=re.ASCII`を追加する、あるいは正規表現の先頭に`(?a)`を追加するという方法があります。

```pycon:
>>> import re
>>> re.findall(r"\d", "012０１２", flags=re.ASCII)
['0', '1', '2']
>>> re.findall(r"(?a)\d", "012０１２")
['0', '1', '2']
>>> 
```
ただし、これらのフラグは正規表現全体に影響します。詳細については[reモジュールのドキュメント](http://docs.python.jp/3.3/library/re.html#re.A)を読んでください。

なお、`flags=`は省略して、
`re.findall(r"\d", "012０１２", re.ASCII)`のように書くこともできますが、下手に省略するとハマることもありますので、省略しないことを強くオススメします。

ちなみに私自身は、

* Python 2/3共用のコードは書かない
* 標準の reモジュールではなく、[regexモジュール](https://pypi.python.org/pypi/regex)を使いたい
* 正規表現が長い時は先頭に`(?a)`等があった方が見通しが良い

等の理由から、

```python3:
import regex

RE_DIGITS = regex.compile(r"""(?xa)
    \A\d+\Z""")


def is_digits(digits):
    if RE_DIGITS.match(digits) is not None:
        return True
    else:
        return False
```

のような書き方を好みますが、それでも`\d`を使うと不安になるので、なるべく`[0-9]`と書くようにしています。（`is_digits()`はあくまで例ですので念のため）
Python&MySQL Connector C 6.xのバージョン互換注意(windows)

windowsでpythonとMySQLの接続を行う際、MySQL-Pythonをインストールします。MySQL-PythonのインストールにはMySQL Connector Cが必要です。
http://dev.mysql.com/downloads/connector/c/

2013年5月現在のソフトの最新バージョンは次の通りですが、
MySQL-Python 1.2.4
MySQL Connector C 6.1

    $ pip install mysql-python

を実行すると、次のエラーでインストールできません。

    include ファイルを開けません。'config-win.h': No such file or directory

両ソフトでバージョンの互換がなく、ディレクトリを見つけきれないのがエラーの原因です。

次の記事は同じ趣旨の投稿ですが、MySQL-Python 1.2.4はこのバグを修正したビルドであり、今回はリンク先のようにsite.cfgを修正する必要はありません。
[Stack Overflow]mysql-python install problem using virtualenv, windows, pip
http://stackoverflow.com/questions/1972259/mysql-python-install-problem-using-virtualenv-windows-pip

MySQL-Python 1.2.4はMySQL Connector C 6.0.2の仕様に対応しているので、v6.0.2をインストールするようにします。

MySQL Connector C 以前のバージョンはこちらからダウンロードできます
http://dev.mysql.com/downloads/connector/c/6.0.html
Python, SciPy, matplotlibのインストール(Windows)

easy_installやpipを使おうとか余計なことを考えなければすぐ終わります。

1. Pythonをインストールします。Win用のインストーラがあります。
http://www.python.org/ftp/python/2.7.4/python-2.7.4.msi

2. NumPyをインストールします。Win用のインストーラがあります。
http://sourceforge.net/projects/numpy/files/NumPy/1.7.0/numpy-1.7.0-win32-superpack-python2.7.exe/download

3. SciPyをインストールします。Win用のインストーラがあります。
http://sourceforge.net/projects/scipy/files/scipy/0.12.0/scipy-0.12.0-win32-superpack-python2.7.exe/download

4. matplotlibをインストールします。Win用のインストーラがあります。
https://github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe

以上。Windowsべんりー（白目

(2015/8/4追記)
pip使うと便利です。
http://qiita.com/mojaie/items/241eb7006978e6962d05
nginx関連ファイルに自動でnginx-modeを適用

nginx-modeはELPAまたは[Github ajc / nginx-mode](http://github.com/ajc/nginx-mode)から入手。

通常は.confファイルを開くとconf-modeが適用されます。
confファイルであり、かつパスに"nginx"の文字が含まれているとnginx-modeを適用する設定です。

nginxフォルダ以下で複数のconfファイルに毎回 "M-x nginx-mode" としなくてもいいので便利かもしれません。

    (require 'nginx-mode)
     
    ;;(add-to-list 'auto-mode-alist '("nginx\\.conf$" . nginx-mode))
    (add-hook 'conf-mode-hook
              (lambda ()
                (when (string-match "nginx" (buffer-file-name))
                  (nginx-mode))))
  
別法:

    (require 'nginx-mode)
    (add-to-list 'auto-mode-alist '("nginx\\(.*\\).conf[^/]*$" . nginx-mode))
IntelliJでScala実行時にコンパイラが見つからない

Scalaのプロジェクトを作成してビルドしたときに、以下のようにコンパイラが見つからないと言われた。

```
Please, specify compiler library in Scala facet.
```

以前まで正常に指定できており何でこういう状況になったかは分からないが、
File -> Project Structure -> Facetsを確認すると確かにCompilerがnoneになっている。

これの指定方法がちょっとはまったので以下に対応方法をメモ。

1. File -> Project Structure -> FacetsのScalaを右クリックして一度Delete. ダイアログを閉じる。
2. Projecビューからモジュールを右クリック->Add Framework Support画面からScalaを追加。このときコンパイラのパスを指定


参考 [Scala Compiler not found in Intellij IDEA 11 with Play 2.0 project](http://stackoverflow.com/questions/10407777/scala-compiler-not-found-in-intellij-idea-11-with-play-2-0-project "URL")
intelliJ でScala実行時のexternal buildについて

Play Frameworkを使っているプロジェクトに、テストコード実行用のModuleを一つ追加して実行したら、以下のようなエラーが出力された。


```
scala: Output path C:\Users\git\scalaWork\workspace_intelij\playtest2_0\project\target\scala_2.9.1 is shared between: Module 'playtest2_0-build' production, Module 'playtest2_0-build' tests
Output path null is shared between: Module 'ScalaTest' production, Module 'ScalaTest' tests
Currently external Scala compiler prohibits output path sharing.
Either disable the external build mode or configure separate output paths.
TIP: you can use Project Artifacts to combine compiled classes.
```

これは[このあたり](http://blog.jetbrains.com/scala/2012/12/28/a-new-way-to-compile/ "scala記事")に書いている内容を見ると、
external build modeという設定になっていて、
mavenなどの外部ツールから実行するので、scala単独では実行しない設定になっている
様子。

これを解除するには、

1. File -> Setting -> Compiler を選択し、
2. "Use external build"のチェックを解除

でOK
Gnuplotの使い方


### グリッド表示
```
set grid
```

### ラベル表示
```
set xlabel 'xlabel'
set ylabel 'ylabel'
```

### CSVファイルからのプロット
```
plot 'hoge.csv' using 1:2
# hoge.csvの1行目をx座標に、2行めをy座標にする
```

### CSVファイルの区切り文字を指定
```
set datafile separator '\t'
```

### x座標、y座標の範囲を指定
```
set xrange [-100:100]
set yrange [-200:400]
```

### epsファイルとして出力
```
# plot hogehoge
set output 'output.eps'
set terminal postscript eps color
replot
```
Virtualbox 上の Debian7.0 "Wheezy" に Guest additions をインストールする

Mac OS X (Mountain Lion) の Virtualbox に Debian Wheezy をインストールしたのですが、初期状態だと Guest Additions がインストールできないようなので手順をまとめました。

# 1. 下準備

```
$ su -
# apt-get update
# apt-get upgrade
# apt-get install build-essential module-assistant
# m-a prepare
```

# 2. Guest Additions をマウントする

Virtualbox の メニューから Device > Install Guest Additions を選択すると、仮想マシンにGuest AdditonsのCD ROMが挿入された扱いになるのでマウントする。

**このとき、Gnomeが「autorunを実行するか？」みたいなことを聞いてくるので、それでOKしてインストーラがきちんと実行されれば以下の作業は必要ありません**

```
# mount /media/cdrom
```

# 3. インストールを実行

``` 
# sh /media/cdrom/autorun.sh
```

最初に「本当にインストールしても良い？」と聞かれるので、 *yes* とタイプして続行しましょう。しばらく時間がかかりますが、

*Installing graphics libraries and desktop services components ...done.*
*Press Return to close this window...*

と出たら終わりです。Enterキーを押して終了しましょう。
終わったら再起動しておきましょう。
SDWebImageで画像をダウンロードする

SDWebImageを使うと、簡単に画像を非同期でダウンロードできて、かつUIImageViewに設定することができます。

[SDWebImage](https://github.com/rs/SDWebImage)

参考
[SDWebImageを初めて使う際の注意点](http://www.masaplabs.com/use-sdwebimage-notice/)
[【iOS】SDWebImageでアプリ容量がどんどん増えていく件](http://ht6030.com/?p=155)

__ImageIO.frameworkとMapKit.frameworkの追加が必要です__

```objc
#import "UIImageView+WebCache.h"

- (void)viewDidLoad
{
    NSURL url = [NSURL URLWithString:@"http://hogehoge.com/hoge.png"];
    [imageView setImageWithURL:url placeholderImage:nil options:SDWebImageCacheMemoryOnly];
}
```

placeholderImage:画像がダウンロードされるまでに表示する画像を指定します
options:以下があります。

SDWebImageRetryFailed：ダウンロードに失敗した場合にリトライするか
SDWebImageLowPriority：ダウンロードの優先度？スクロール中にはダウンロードしないとか。
SDWebImageCacheMemoryOnly：ダウンロードした画像をメモリだけにキャッシュする（通常はファイルにもキャッシュ？）
IntelliJ IDEA12.1.1　で　play2.1　を run する設定メモ（windows7）

Eclipseで操作していたときはコマンドでrunしていたのですが、IntelliJだし、プラグイン動くし、IDEから起動させたいと思った。

#IntelliJ IDEA設定方法
仰々しく見出しをつけたがこれが全てですね

1.メニュー[run]->[Edit Configuration]

![run_menu](http://f.cl.ly/items/142I0W3z3y201c1P1r0Q/2013-05-09_180108.png)

2.「＋」ボタンから [Play 2 App] を選択

![plus_button](http://f.cl.ly/items/1X252t2x371K3P1H3J3p/2013-05-09_180739.png)

3.Name：に任意の名前をつけて'Apply''OK' と進む

![name_meep](http://f.cl.ly/items/1J1F473a29400l0n2w2d/2013-05-09_180853.png)

4.ツールバーのRUNボタンで playが動き、ブラウザが立ち上がる

![run_play](http://f.cl.ly/items/262j2R153d3R0O0B2K1w/2013-05-09_181326.png)
![ff_capture](http://f.cl.ly/items/26253g1W0U0g0S30373D/2013-05-09_181541.png)

ｃ⌒っﾟдﾟ)っφ　ﾒﾓﾒﾓ...
vim tips: 1. 複数行の先頭に文字を挿入したり、コメントアウトしたり、もはや正規表現のtips^^;

#お題

```before.rb
require 'test_helper'

class ProductTest < ActiveSupport::TestCase
  test "product attributes must not be empty" do
    product = Product.new
    assert product.invalid?
    assert product.errors[:title].any?
    assert product.errors[:description].any?
    assert product.errors[:price].any?
    assert product.errors[:image_url].any?
  end
end
````

これを

```after.rb
require 'test_helper'

#class ProductTest < ActiveSupport::TestCase
#  test "product attributes must not be empty" do
#    product = Product.new
#    assert product.invalid?
#    assert product.errors[:title].any?
#    assert product.errors[:description].any?
#    assert product.errors[:price].any?
#    assert product.errors[:image_url].any?
#  end
#end
````

こう！！

☆･:ﾟ*ｵｫヾ(o´∀｀o)ﾉｫｵ*ﾟ:･☆


# 答え1

## 1. 矩形選択モードになります

````
**CTRL + v**
````

そして選択範囲をカーソルで指定します。

## 2. 挿入モードになります

````
**Shift + i**
````

挿入したい文字を打ち込みます。複数でもOKです。
今回はコメントアウトしたいので **"#"**で行きます。

で、打ち込んだらescを押します。

###完成
☆･:ﾟ*ｵｫヾ(o´∀｀o)ﾉｫｵ*ﾟ:･☆

##答え2
1は同じで、
矩形選択で選択して、そのまま、コロンを入力し...

````
:'<,'>s/^/#/
````

コッチのほうがそれっぽいですね。
☆･:ﾟ*ｵｫヾ(o´∀｀o)ﾉｫｵ*ﾟ:･☆

## ちなみに、コメントアウトを取るには、

矩形選択で、選択して、

````
:'<,'>s/^/#//
````

です。
☆･:ﾟ*ｵｫヾ(o´∀｀o)ﾉｫｵ*ﾟ:･☆

## ....せっかくなので行頭だけじゃなくって行末にも入れるとしましょう。

矩形選択の後...

````
:'<,'>s/$/#/
````

## /* */ みたいなコメントアウトの時

````
:'<,'>s/^\(.*\)$/\/* \1 *\//
````

````
:'<,'>s/^...\(.*\)...$/\1/
````

## 解読していきます。

・**:** の後の **s/** は **置換しますよー** という宣言（'<,'>は一旦無視）
・**s/hoge/fuga** で「**hogeをfugaに置換します**」 となる
・**^\(.\*\)$** のところですが、 **^** が **行頭** 、 **$** が **行末** 、 **.** は **任意の文字1文字**、\* は **前の文字の0回以上の繰り返し**
   ⇒ **行頭から行末までの間で**

疲れたので続きは後ほど
xcode4で作ったplistのArrayを読み込む

参考
[【Objective-C】Xcode4で作った .plist を読み込む方法。](http://wayohoo.com/programming/objective-c/xcode4-plist-reading.html)

```objc
NSString *path = [[NSBundle mainBundle] pathForResource:@"config" ofType:@"plist"];

NSDictionary *propDictionary = [NSDictionary dictionaryWithContentsOfFile:path];

NSArray *array = [NSArray arrayWithArray:[propDictionary objectForKey:@"key"]];
```
アプリがUDIDにアクセスしているかを確認する方法

# アプリがUDIDにアクセスしているかを確認する方法

2013年5月1日からUDIDにアクセスするアプリは強制的にリジェクトされるようになりました.
具体的にはUIDeviceクラスの
`- (NSString *)uniqueIdentifier`
を呼び出すコードが含まれているアプリがリジェクトの対象になります.

このドキュメントでは、
自分のプロジェクトでUDIDアクセスしているコードがないかを確認する
簡易的な方法について説明します.

## 目次

- 注意
- UDIDアクセスのパターンと検出可否
- 検出方法
    - 1. プロジェクト内でメソッドを検索する
    - 2. カテゴリー拡張でメソッドを置き換える

## 注意

ここで説明している方法はあくまでも簡易的な手段であり、確実に検出できることを保証していません.

また検出方法の紹介であり修正あるいは審査をパスするための方法ではありません.
以下の手段で検出された場合には適切な対応を行なって下さい.

## UDIDアクセスのパターンと検出可否

Apple側のUDIDチェックの仕組みからUDIDアクセスをしているパターンと検出可否は以下のようになります.

\# | 実装ファイルへのアクセス | 実際の呼び出し | 検出可否
--- | --- | --- | --- | ---
1 | 実装ファイルへアクセス可能 | 実行中に呼び出される | 検出可能 
2 | 実装ファイルへアクセス可能 | 実行中に呼び出されない | 検出可能
3 | 実装ファイルがない | 実行中に呼び出される | 検出可能
4 | 実装ファイルがない | 実行中に呼び出されない | **検出不可**

実装ファイルへアクセス可能なコードは、例えば自身が書いたコードやオープンソースのライブラリが該当します.
また、実装ファイルがないものは、広告やアクセス解析などのプリコンパイル済み静的ライブラリ(.aファイル)が該当します.

今回紹介する検出方法では、静的ライブラリの中で、
実行中に呼び出されない箇所でUDIDアクセスしている(`uniqueIdentifier`を呼び出している)場合には検出ができません.

## 検出方法

### 1. プロジェクト内でメソッドを検索する(\#1, \#2で有効)

Xcodeのプロジェクト内検索(Option+Shift+F)から
`uniqueIdentifier`
を検索して見つけて下さい.

自身で実装したファイル、あるいはソースが公開されている外部ライブラリなど、
実装ファイル(.m)に直接アクセスできる場合にのみ有効な手段です.

### 2. カテゴリー拡張でメソッドを置き換える(\#3で有効)

Objective-Cの機能であるカテゴリー拡張を利用して、
`uniqueIdentifier`メソッドを上書きして検出します.

AppDelegateクラスの実装ファイルに以下のコードを書いて下さい.

```
// #importなど本来のAppDelegateの実装

@implementation UIDevice(UDIDCheck)

- (NSString *)uniqueIdentifier
{
  return @"UDID is accessed!!"; // set breakpoint here
}

@end

// 本来のAppDelegateの実装
```
上記7行目にブレークポイントを設定した状態で、
Xcodeからアプリを実行して動かして下さい.
実行中に
`uniqueIdentifier`
にアクセスが発生した場合には上記箇所でアプリが止まります.

この検出手段は、
外部SDKなどコンパイル済みの静的ライブラリを使っている場合でも有効です.
ただし、実行中にアクセスが発生しないと検出できないため、
確実な方法ではありません.
REPLでAppDelegateの中身を見る - メソッド検索やデバッグに便利！


RubyMotionのREPL便利ですよね。そう、あのirb的なやつです。

シミュレーターでCommand+Clickでクリックしたところで色々な変数やメソッド見られるのはいいんですが、実際思っているクラス(ViewControllerとか)にいかなくて苦労したりしませんか？

そんな時はREPLで以下のコマンドを打ってAppDelegateからたどっちゃいましょう！

```ruby:
app = UIApplication.sharedApplication
repl app.delegate 
```

実際にはこんな感じで使います。
TabBarViewの、1つ目のタブにあるボタンで、'target'という文字列を含むメソッドを探す例。

```
$ rake
     Build ./build/iPhoneSimulator-6.1-Development
  Simulate ./build/iPhoneSimulator-6.1-Development/Sample.app
(main)> app = UIApplication.sharedApplication
=> #<UIApplication:0x9475190>
(main)> app.delegate
=> #<AppDelegate:0x76711c0 @window=#<UIWindow:0x76aa640>>
(main)> repl app.delegate
=> #<AppDelegate:0x76711c0 @window=#<UIWindow:0x76aa640>>
(#<AppDelegate:0x76711c0 @windo...)> @window
=> #<UIWindow:0x76aa640>
(#<AppDelegate:0x76711c0 @windo...)> @window.rootViewController
=> #<UITabBarController:0xd174850>
(#<AppDelegate:0x76711c0 @windo...)> @window.rootViewController.viewControllers
=> [#<TagBasedIBViewController:0xd174590>]
(#<AppDelegate:0x76711c0 @windo...)> @window.rootViewController.viewControllers[0]
=> #<TagBasedIBViewController:0xd174590>
(#<AppDelegate:0x76711c0 @windo...)> repl @window.rootViewController.viewControllers[0]
=> #<TagBasedIBViewController:0xd174590>
(#<TagBasedIBViewController:0xd...)> @button
=> #<UIRoundedRectButton:0x96871c0>
(#<TagBasedIBViewController:0xd...)> @button.methods.grep /target/i
=> [:"addTarget:action:forControlEvents:", :"removeTarget:action:forControlEvents:", :"actionsForTarget:forControlEvent:", :"sendAction:toTarget:forEvent:", :hasOneOrMoreTargets, :"addTarget:action:forEvents:", :allTargets, :"removeTarget:forEvents:", :"forwardingTargetForSelector:"]
```
heroku の postgres を9.1系から9.2系にバージョンアップする手順


*まだ実施してないが、おそらくこれ動くはず*

## 事前作業

まずは、新しいバージョンのDBを作成する
編集日(2013-5-9)現在のデフォルトは9.2系になっている
同じプランのDBを複数追加することも可能

````bash
heroku addons:add heroku-postgresql:dev -r staging
````

以下のコマンドで、確認すると PG Version が変更されているはず

````bash
heroku pg:info -r staging
````
 古いDB: HEROKU_POSTGRESQL_IVORY_URL
新しく追加されたDB: HEROKU_POSTGRESQL_ROSE_URL

とする

## 移行作業

手順としては、

* 停止
* バックアップ
* リストア
* DB切り替え
* 再開

停止

```bash
heroku maintenance:on -r staging
```

バックアップ

```bash
heroku pgbackups:capture -r staging
```

新しく取得されたバックアップID: b001

リストア

```bash
heroku pgbackups:restore HEROKU_POSTGRESQL_ROSE_URL b001 -r staging
```

DB切り替え

```bash
heroku pg:promote HEROKU_POSTGRESQL_ROSE_URL -r staging
```

再開

````bash
heroku maintenance:off -r staging
````

以上の手順で移行できる
Underscoreの_.partialでカリー化


[これまで](http://qiita.com/items/6a27c0e8efa66b1f7799)[何回](http://qiita.com/items/520c94f35d33cf43ffdc)もキータに[登場](http://qiita.com/items/e099910c11c4be5cd651)した[カリー化](http://qiita.com/items/e1701c8a4ac18df9085a)です。

`_.partial(function, [*arguments])`

使い方は：

```coffee-script
var add = a + b
add5 = _.partial(add, 5)
add5(10)
# 15
```
IPアドレスを10進数に変換する

head -n1 /etc/issue

	CentOS release 6.4 (Final)

cd /usr/local/src/
wget https://ipaddr-py.googlecode.com/files/3144.tar.gz
tar zxvf 3144.tar.gz
cd ipaddr-branches/3144/
python ./setup.py install


yum install bind-utils
host www.kame.net

	www.kame.net is an alias for orange.kame.net.
	orange.kame.net has address 203.178.141.194
	orange.kame.net has IPv6 address 2001:200:dff:fff1:216:3eff:feb1:44d7

### IPv4

python -c "import ipaddr; print ipaddr.IPv4Interface('203.178.141.194/32')._ip"

	3417476546

python -c "import ipaddr; print ipaddr.IPv4Address(3417476546)"

	203.178.141.194

### IPv6

python -c "import ipaddr; print ipaddr.IPv6Interface('2001:200:dff:fff1:216:3eff:feb1:44d7/32')._ip"

	42540528731127839924839251083080582359

python -c "import ipaddr; print ipaddr.IPv6Address(42540528731127839924839251083080582359)"

	2001:200:dff:fff1:216:3eff:feb1:44d7

Markdown: [ipaddr-py Using3144](https://code.google.com/p/ipaddr-py/wiki/Using3144)
【CentOS6.3】twitter-bootstrap-rails環境設定のポイント

・rubyのバージョンを1.9.3にアップグレード
・下記警告が出た場合はlibymlをインストール
It seems your ruby installation is missing psych (for YAML output).


```bash
wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
tar -zxvf yaml-0.1.4.tar.gz
cd yaml-0.1.4
./configure
make;make instal
```
Gemファイルへ下記を追記
twitter-bootstrap-rails readme参照

```ruby
gem "therubyracer"
gem "less"
gem "less-rails" #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS
gem "twitter-bootstrap-rails"
```

その後bundle installで環境構築が完了
Kobito要望: open -a Kobito README.md でファイルと連携できるようにしてほしい

`open -a Kobito ファイル名` でファイルと連携できるようにしてほしい。

あるいは `kobito` コマンドをバンドルして、`kobito ファイル名` でファイルと連携できるようにしてほしい。
第6回オフラインリアルタイムどう書くの問題をF#で 

「共通の祖先までの親等をタプルで返す」という補助線が引けたら簡単。

```fsharp:relationship.fs
open System

let parent x = (x+1)/3

let degrees x y =
  let rec degrees x y cx cy =
    match (compare x y) with
    |  0 (* x=y *) -> (cx,cy)
    | -1 (* x<y *) -> degrees x (parent y) cx (cy+1)
    |  _ (* x>y *) -> degrees (parent x) y (cx+1) cy
  degrees x y 0 0

let solve (s:string) =
  let xs =
    s.Split([|"->"|], StringSplitOptions.None)
    |> Array.map Int32.Parse
  match (degrees xs.[0] xs.[1]) with
  | (0,0) -> "me"
  | (1,0) -> "mo"
  | (0,1) -> "da"
  | (1,1) -> "si"
  | (2,1) -> "au"
  | (1,2) -> "ni"
  | (2,2) -> "co"
  | _     -> "-"

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "5->2" "mo"
  test "28->10" "au"
  test "1->1" "me"
  test "40->40" "me"
  test "27->27" "me"
  test "7->2" "mo"
  test "40->13" "mo"
  test "9->3" "mo"
  test "4->1" "mo"
  test "1->3" "da"
  test "12->35" "da"
  test "3->8" "da"
  test "6->19" "da"
  test "38->40" "si"
  test "9->8" "si"
  test "4->2" "si"
  test "15->16" "si"
  test "40->12" "au"
  test "10->4" "au"
  test "21->5" "au"
  test "8->2" "au"
  test "3->5" "ni"
  test "11->39" "ni"
  test "2->13" "ni"
  test "13->32" "ni"
  test "14->22" "co"
  test "40->34" "co"
  test "5->8" "co"
  test "12->10" "co"
  test "1->27" "-"
  test "8->1" "-"
  test "12->22" "-"
  test "2->40" "-"
  test "32->31" "-"
  test "13->14" "-"
  0
```
ngircdのリレー設定

複数のngircdをリレーするための設定方法。がんばって調べてみたけど見つからなかったのでメモメモ。

## リレーするサーバ
* IRCサーバ1 … irc1.example.com
* IRCサーバ2 … irc2.example.com
* ポート … 6667(共通)

## 設定
* IRCサーバ1、2の両方で設定が必要
* ペアの片方をホスト、残りをクライアントとして扱う必要がある
* 3台以上でリレーする場合は2台ずつでこの設定を行う(はず)

### ホスト側

```ini
[Server]
    Name = irc2.example.com # クライアント側のngircdの[Global] Nameの値
    Host = irc2.example.com # クライアント側のホスト名(ngircd同士はなくても動作した)
    MyPassword = myircd.irc1 # ホスト側のパスワード
    PeerPassword = myircd.irc2 # クライアント側のパスワード(MyPasswordと一致させる)
```

### クライアント側

```ini
[Server]
    Name = irc1.example.com # ホスト側のngircdの[Global] Nameの値
    Host = irc1.example.com # ホスト側のホスト名(ngircd同士はなくても動作した)
    Port = 6667 # ホスト側のIRCポート
    MyPassword = myircd.irc2 # クライアント側のパスワード
    PeerPassword = myircd.irc1 # ホスト側のパスワード(MyPasswordと一致させる)
```
* ホスト側と違って **Port** の設定がある  
  書き忘れるとリレーせずそれぞれが単独のIRCサーバになってしまう

## 動作など
* 片方のIRCサーバがダウンすると、そのサーバにログインしているメンバーは切断される。それ以外のサーバに接続しているメンバーに影響はなかった。
* ホスト側が再起動した場合は、そのうちクライアント側が接続に行きリレー状態が回復する。
* クライアント側が再起動した場合は、その時点でホスト側に接続しリレーを回復する。
Objective-CでNSStringをDecode

stackoverflowで見つけた方法で、うまく動作しました。
以下のように関数化しています。

```
- (NSString*) decodeFromPercentEscapeString:(NSString *) string {
    return (__bridge_transfer NSString *) CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef) string, CFSTR(""), kCFStringEncodingUTF8);
} 
```

[参考ページ](http://stackoverflow.com/questions/7920071/how-to-url-decode-in-ios-objective-c)
powershellでファイルをクリアする

Bashで言うところの`cat /dev/null > test.txt`を実現するための方法。
他にもいろんな方法があると思うけどとりあえずオーソドックスっぽい方法をメモ。

`echo $null > test.txt`

test.txtがなければ空のファイルを作成する。
$nullは予約変数(自動変数？)で、空のオブジェクトを表す。

↓2013/5/13追記
ファイルのクリアだけなら`Clear-Content test.txt`でできることがわかった。
ファイルが無いときはエラーにしたい時などはこっちのほうがよいかも。
Heroku上でのTimeのparseでハマった


ローカルのタイムゾーンを含む```"Tue May 07 2013 04:00:00 GMT+0900 (JST)"```というような文字列をパースしてUTCのActiveSupport::TimeWithZoneに変換したい場合、以下のようにする。

```
> Time.zone
=> (GMT	+00:00) UTC
> Time.zone.parse("Tue May 07 2013 04:00:00 GMT+0900 (JST)")
=> Mon, 06 May 2013 19:00:00 UTC +00:00
```

しかし、これをheroku上のrails consoleで実行した場合、なぜか以下のようになってしまい、タイムゾーンが考慮されない。

```
> Time.zone
=> (GMT	+00:00) UTC
> Time.zone.parse("Tue May 07 2013 04:00:00 GMT+0900 (JST)")
=> Tue, 07 May 2013 04:00:00 UTC +00:00
```

これは、Time.zone.parseの中で呼んでいるTime.parseが以下のようにパースしてしまうことが原因のようだ。

```
> Time.parse("Tue May 07 2013 04:00:00 GMT+0900 (JST)")
=> 2013-05-07 04:00:00 +00:00
```

手元の環境だと正しく動くのになんでだろう...
PHPでswitch文中のcontinueはbreakと同じ・・・なので

意外と知らない人多いのでメモ。。

⬇これだと全件まわしちゃうけど、、

```php
for ( $i = 1; $i <= 5; $i++ ) {
  switch ( $i ) {
    case 3:
      continue; # =break
  }
  var_dump( $i );
}
```
=> 1,2,3,4,5


⬇こうすればOK。(continue 2とする)

```php
for ( $i = 1; $i <= 5; $i++ ) {
  switch ( $i ) {
    case 3:
      continue 2;
  }
  var_dump( $i );
}
```
=> 1,2,4,5
Macでもreadlink -f


readlinkは、引数のパスがシンボリックリンクならリンク先を出力し、そうでなければ何も出力しない。

GNU readlinkの"-f"オプションはシンボリックリンクがいくつ連なってても実体のパスを出力してくれる。

MacはGNU版ではないので"-f"がない。

homebrewでcoreutilsをインストールしてreadlinkをGNU版のcoreutilsへのエイリアスにするという方法もあるみたいだけど、配布するにはつらいので、インストールしないでも良い方法を探した。

http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac

再帰的にreadlinkしているだけなので素のreadlinkを使ってシェルスクリプトで実装できるよというわけで、こういうコードが貼られていた。

```sh
#!/bin/sh

TARGET_FILE=$1

cd `dirname $TARGET_FILE`
TARGET_FILE=`basename $TARGET_FILE`

# Iterate down a (possible) chain of symlinks
while [ -L "$TARGET_FILE" ]
do
    TARGET_FILE=`readlink $TARGET_FILE`
    cd `dirname $TARGET_FILE`
    TARGET_FILE=`basename $TARGET_FILE`
done

# Compute the canonicalized name by finding the physical path 
# for the directory we're in and appending the target file.
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$TARGET_FILE
echo $RESULT
```

せっかくなので短くしてみた。例外処理が甘いけど元のやつもなので気にしない。

```sh
#!/bin/sh

TARGET_FILE=$1

while [ "$TARGET_FILE" != "" ]; do
    cd `dirname $TARGET_FILE`
    FILENAME=`basename $TARGET_FILE`
    TARGET_FILE=`readlink $FILENAME`
done

echo `pwd -P`/$FILENAME
```

## おまけ

自身の実体を出力するシェルスクリプト。

```sh
#!/bin/sh

# emulate GNU readlink's "readlink -f" behavior on Mac
# http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
function __readlink_f {
  TARGET_FILE=$1

  while [ "$TARGET_FILE" != "" ]; do
      cd `dirname $TARGET_FILE`
      FILENAME=`basename $TARGET_FILE`
      TARGET_FILE=`readlink $FILENAME`
  done

  echo `pwd -P`/$FILENAME
}

self=`__readlink_f $0`
echo $self
```
Qiitaで注釈書く時の自分のやり方メモ

（13/05/09 10:47追記）

編集リクエストで取り消し線対応について教えてもらいました。ありがとうございます！
（&lt;s&gt;しか試してなかった。。）
&lt;del&gt;～&lt;/del&gt; で取り消し線がつきます。

（13/05/09 8:54追記）

コメントいただいて気づいたことがあったので追記します。（ありがとうございます！）
注釈機能はQiitaではサポートされていないようです。
このやり方は、リンクを使って無理矢理注釈のように見せているだけです。なので、注釈のリンクをクリックしても404になります。（リンク先を注釈の文として扱っているため）
<del>（そして取り消し線にもQiitaは対応していないことに今気づいた）</del>

----

[Qiita Markdown?](http://qiita.com/items/c686397e4a0f4f11683d)に見当たらなかったのでメモ。Kobitoに元から入ってるチートシートに書いてあったかどうか忘れましたが、Kobito使わずに書くこともあるので（イマココ）。[前回の記事](http://qiita.com/items/1b07303d1c15200a3f5d)で使ったやつの抜き出しです。

----
Sandbox用のアカウントを作成する必要があります。[1]
[1]: アカウント作成方法はAPIキーをもらったメールに書いてあるのでそちらを参照。やることは普通のEvernoteアカウント作成と変わりません。
----

↑のように出すにはこうする。

>Sandbox用のアカウントを作成する必要があります。\[1]
>\[1]: アカウント作成方法はAPIキーをもらったメールに書いてあるのでそちらを参照。やることは普通のEvernoteアカウント作成と変わりません。

ただし、はてなみたいに記事の下に注釈の一覧が出たりはしない。まあポップアップで出てくれればいいかなあ、という感じで使っています。
2ベクトルの描く円弧の回転を表すクォータニオンの計算

ジョイントの計算に必要になったのでメモ。

```as:arc

		/**
		 * v1からv2へと向かう円弧の回転を表すクォータニオンを作成します。
		 * v1とv2は正規化されている必要があることに注意してください。
		 * @param	v1 開始
		 * @param	v2 終了
		 * @return
		 */
		public function arc(v1:Vec3, v2:Vec3):Quat {
			var x1:Number = v1.x;
			var y1:Number = v1.y;
			var z1:Number = v1.z;
			var x2:Number = v2.x;
			var y2:Number = v2.y;
			var z2:Number = v2.z;
			var d:Number = x1 * x2 + y1 * y2 + z1 * z2; // v1とv2が正規化されていれば内積は cos(theta) を表す
			if (d == -1) { // cos(theta) = -1 であるので180度回転している
				x2 = y1 * x1 - z1 * z1;
				y2 = -z1 * y1 - x1 * x1;
				z2 = x1 * z1 + y1 * y1;
				d = 1 / Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2);
				s = 0;
				x = x2 * d; // v1に垂直なベクトルを設定
				y = y2 * d;
				z = z2 * d;
				return this;
			}
			var cx:Number = y1 * z2 - z1 * y2; // 外積
			var cy:Number = z1 * x2 - x1 * z2;
			var cz:Number = x1 * y2 - y1 * x2;
			s = Math.sqrt((1 + d) * 0.5); // 半角の公式により cos(theta/2) を得る
			d = 0.5 / s;
			// ここで d = sin(theta/2) / sin(theta)
			x = cx * d;
			y = cy * d;
			z = cz * d;
			return this;
		}
```

クォータニオンクラスの概要

```as:Quat.as
public class Quat {
	public var s:Number; // 実部
	public var x:Number; // 以下虚部
	public var y:Number;
	public var z:Number;
}
```

ベクトルクラスの概要

```as:Vec3.as
public class Vec3 {
	public var x:Number;
	public var y:Number;
	public var z:Number;
}
```
第7回オフラインリアルタイムどう書くの参考問題をF#で

```fsharp:xysort.fs
let table = [ [4;1;4;2;1;3];
              [7;3;2;0;5;0];
              [2;3;6;0;6;7];
              [6;4;5;7;5;1];
              [3;1;6;6;2;4];
              [6;0;5;5;5;1] ]

let byRow i xss =
  let map = List.nth xss i
            |> List.mapi (fun i e -> (i,e))
            |> List.sortBy (fun (i,e) -> e)
  let indexMap i = List.findIndex (fun (i',e) -> i = i') map
  let sorter = List.permute indexMap
  List.map sorter xss

let byColumn i xss =
  List.sortBy (fun xs -> List.nth xs i) xss

let action xss (c: char) =
  match ("ABCDEF".IndexOf c, "uvwxyz".IndexOf c) with
  | (r, _) when r >= 0 -> byRow r xss
  | (_, c) when c >= 0 -> byColumn c xss
  | _                  -> xss

let solve (s:string) =
  s.ToCharArray()
  |> Array.fold action table
  |> List.head
  |> System.String.Concat

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "AvEx" "305027"
  test "A" "112344"
  test "C" "241413"
  test "F" "134214"
  test "u" "236067"
  test "w" "732050"
  test "y" "414213"
  test "yx" "732050"
  test "ux" "236067"
  test "EF" "131424"
  test "DF" "134124"
  test "Au" "055165"
  test "uA" "023667"
  test "By" "234114"
  test "yB" "114342"
  test "yBy" "357020"
  test "yByB" "350072"
  test "AuBvCw" "131244"
  test "FAuFBvFCw" "300527"
  test "AuBv" "112344"
  test "CwDx" "515056"
  test "FzyE" "324114"
  test "uAwDyB" "114324"
  test "zExCvF" "073520"
  test "uFxEv" "002357"
  test "DyCwB" "076362"
  0
```
バッチファイルでgrepもどき

# 使いどころ
複数のファイルを検索したいけど、いいツールがマシンに入ってない…。

``` bat:grep_like.bat
@echo off

if "%1"=="help" (
goto MAN
)

if "%1"=="/?" (
goto MAN
)

if "%1"=="" (
echo 検索する文字を指定してください。"/?" あるいは "help"で詳細を確認できます。
goto EXIT
)

:: 文字列検索 
:GREP

SET extension=*.*

IF NOT "%2"=="" (
SET extension=%2
)

:: 表示) ファイルパス : 行数 : 一致行
for /r %%i in (%extension%) do ( for /F "delims=" %%f in ('findstr /N %1 %%i') do @echo %%i : %%f )

pause

:: 終了
goto EXIT

:: 使用方法ヘルプ
:MAN
echo -----------------------------------------------------
echo カレントディレクトリから再帰的にファイルを検索します。
echo %%1=検索文字列を指定
echo %%2=ファイルフィルタを指定します。省略可。デフォルトは*.*(全てのファイル）です。
echo -----------------------------------------------------

:EXIT

```

お粗末さまでした。
第7回オフラインリアルタイムどう書くの問題をF#で

```fsharp:chairs.fs
open System

type Seat = char option
type Selector = Seat list -> int option

let inline (|+) (x:Selector) (y:Selector) : Selector =
  fun xs -> match (x xs) with | None -> y xs | s -> s

let check pred xs =
  Seq.zip3 (None::xs) xs (seq {yield! (List.tail xs); yield None})
  |> Seq.tryFindIndex pred

let rule1 = check (fun t       -> t = (None,None,None))
let rule2 = check (fun (l,c,r) -> c = None && (l = None || r = None))
let rule3 = check (fun (_,c,_) -> c = None)
let rule = rule1 |+ rule2 |+ rule3

let enter c xs =
  let j = Option.get (rule xs)
  List.mapi (fun i e -> if i = j then Some c else e) xs

let leave c =
  List.map (fun e -> if e = Some c then None else e)

let action xs = function
  | c when Char.IsUpper c -> enter c xs
  | c when Char.IsLower c -> leave (Char.ToUpper c) xs
  | _                     -> failwith "Invalid Input"

let solve (s:string) =
  let a = s.Split([|':'|])
  let l = Int32.Parse a.[0]
  a.[1].ToCharArray()
  |> Array.fold action (List.init l (fun _ -> None))
  |> List.map (function | Some c -> c | _ -> '-')
  |> String.Concat

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "6:NABEbBZn" "-ZAB-E"
  test "1:A" "A"
  test "1:Aa" "-"
  test "2:AB" "AB"
  test "2:AaB" "B-"
  test "2:AZa" "-Z"
  test "2:AZz" "A-"
  test "3:ABC" "ACB"
  test "3:ABCa" "-CB"
  test "4:ABCD" "ADBC"
  test "4:ABCbBD" "ABDC"
  test "4:ABCDabcA" "-D-A"
  test "5:NEXUS" "NUESX"
  test "5:ZYQMyqY" "ZM-Y-"
  test "5:ABCDbdXYc" "AYX--"
  test "6:FUTSAL" "FAULTS"
  test "6:ABCDEbcBC" "AECB-D"
  test "7:FMTOWNS" "FWMNTSO"
  test "7:ABCDEFGabcdfXYZ" "YE-X-GZ"
  test "10:ABCDEFGHIJ" "AGBHCIDJEF"
  0
```
多重代入の右辺にオブジェクト（≠配列、リスト）を持ってきたときの各言語の挙動

相変わらずタイトルが微妙なalucky0707です。よろしくお願いします。
 
##Rubyの場合
 
さて、この前Rubyでプログラミングをしていたとき、このような風なコードを書きました。
 
```ruby
m, x, y, z = src.match /(\d+)\+(\d+)=(\d+)/
```
 
足し算の式を正規表現を用いて解析する、という内容です。 `String#match(RegExp)` の結果は _配列のようなオブジェクト_ だったので、このように分割代入すれば上手くいくと思いました。
しかし、このコードは意図した通りに動きません。
変数 `m` にマッチの結果が全て代入され、`x, y, z` は `nil` となります。
 
このコードを書いたときは、咄嗟に上手い解決策が思い付かず、次のように書いて誤魔化しました。
 
```ruby
m = src.match /(\d+)\+(\d+)=(\d+)/
a = m[1]; b = m[2]; c = m[3];
```
 
なにが悲しくてRubyでこんなにダサいコードを書かなくちゃならないんだ……。
 
このとき分かったことは、Rubyでは __多重代入の右辺が配列ではない場合、左辺の最初の変数に値が代入される__ ということでした。
 
その後、Rubyで配列のようなオブジェクトを多重代入したい場合は、次のように書けばいいことに気づきました。
 
```
#優先順位の関係でメソッド呼び出しの括弧が必要
m, x, y, z = *src.match(/(\d+)\+(\d+)=(\d+)/)
```
 
いわゆるsplat展開をしています。
というのも、Rubyではsplat展開の際に暗黙的に `to_a` を呼び、配列に変換します。それを利用して、マッチの結果を配列に変換して、多重代入できるようにしているわけです。
 
この方法は、 `to_a` が適切に実装されているクラスなら使えるので、かなり便利なんじゃないかと思います。
 
##Pythonの場合
 
タイトルに「各言語の」なんてつけてしまったので、Pythonについても調べてみました。
 
Pythonでは、多重代入の際 `list` （`tuple` な気もする。Pythonは詳しくないから分からない）に変換して代入しようとします。そのため、暗黙的に `__iter__` が呼ばれるようです。
 
具体的に示してみます。（Python3.3で書いたコードなのでPython2.xでは動くか分かりません）
 
```python
class ConstList:
  def __init__(self, _list):
    self._list = list(_list)
  def __iter__(self):
    return iter(self._list)
 
obj = ConstList([1, 2, 3])
a, b, c = obj
print("%d %d %d" % (a, b, c))
```
 
色々無駄の多いコードですが、コンストラクタで配列を受け取り、その配列を `__iter__` 内でイテレーターに変換して返しています。
 
いっそイテレーターから直接代入するような仕様になってれば面白かったんですけどね…。
 
##JavaScriptの場合
 
JavaScriptで多重代入？そんなのあったっけ？
JavaScript 1.7？よく聞こえません。
 
##CoffeeScriptの場合
 
CoffeScriptはベースがJavaScriptなので、個人的には物凄く期待通りに動きます。
 
こんな感じ。
 
```coffeescript
#配列ライクなオブジェクト
obj =
  1: 100
  2: 200
  3: 300
[a, b, c] = obj
console.log '%d %d %d', a, b, c
 
src = '123+456=789'
[m, x, y, z] = src.match /(\d+)\+(\d+)=(\d+)/
console.log (+x)+(+y)is(+z)
```
 
'[ ]' を付けなくてはいけないのが難点な気もしますが、僕は明示的で結構好きです。
 
また、こんな書き方もできます。
 
```coffeescript
obj1 =
  hoge:
    1: 'hoge-1'
    2: 'hoge-2'
  fuga: 'fuga'
 
{hoge:[hoge1,hoge2],fuga} = obj1
console.log hoge1, hoge2, fuga
 
obj2 =
  hoge: 'hoge'
  fuga: 'fuga'
 
{hoge, fuga} = obj2
console.log hoge, fuga
```
 
ネストした値も取り出せるってわけです。
二つ目の例は、 `require` したモジュールの使うものが限られてるときなんかに使うと便利です。
 
さらに、話が逸れてしまいますがしまいますが、こんな書き方もできます。
 
```coffeescript
addArray = ([a, b]) -> a + b
 
console addArray([1, 2])
```
 
仮引数にもこのパターンが指定できます。
便利なようでいまいち使いどころが思い付きません。
 
Ruby・Pythonに比べると、CoffeeScriptは関数型言語が注目されはじめてから開発されただけあって柔軟な表現ができる気がします。
 
 
その他、HaskellとかScalaとかだと多重代入というかパターンマッチを使って、かなり分かりやすくオブジェクトを分解することが出来るはずです。
また、RubyやPythonの多重代入は制限がそれなりにあるので注意してください。
Rails 4.0.0.rc1でActiveAdmin使う場合

### 2013/5/8 時点ではまだPullRequestがマージされていないので、akashkambojさんのrails4ブランチ使う

```rb:Gemfile
gem 'ransack', github: 'avit/ransack', branch: 'rails4-dependencies'
gem 'activeadmin', github: 'akashkamboj/active_admin', branch: 'rails4'
```

### Strong Parameters許可しておく

```rb:config/initializers/active_admin.rb
ActiveAdmin::ResourceController.class_eval do
  # ActiveAdminからのリクエストパラメータはStrong Parameters許可する
  def resource_params
    [(params[resource_request_name] || params[resource_instance_name]).try(:permit!) || {}]
  end
end
```
Xamarin Studio でコンポーネントを更新する方法


分かりにくかったのでメモ。

[以前](http://amay077.github.io/blog/2013/04/22/xamarin-ios-using-gmap-ios-sdk/)使ってみた [Google Maps Component](http://components.xamarin.com/view/googlemapsios/)、「Polygon や Circle がないなー、対応してないのかなー」と思って [API Doc](http://componentsapi.xamarin.com/?link=T%3aGoogle.Maps.Circle) 見たら存在してたので、いつの間にかバージョンアップしてたらしい、確かに手持ちのバージョンは「1.1.2」、Webサイトの方は「1.2.2」になってた。


## Component を更新する

じゃあ更新するか、と思って Xamarin Studio で入り口を探すものの見つからない。
結局、メニュー -> Get More Components から、Google Maps を検索しなおしたら、ボタンが「Update」になってたので、押したら更新された。

![image1](http://blog.amay077.net/assets/images/posts/update_components_using_xamarin_studio1.png)

## Component に付属のサンプルが増えてた

更新後、Samples を見てみたら、、、お、 **iOS Advanced Sample** というのが増えてる！きっとアドバンスドなサンプルなのでしょうな（試せよ

![image1](http://blog.amay077.net/assets/images/posts/update_components_using_xamarin_studio2.png)

## Component を更新したら API の互換性が無くなってた

更新後、意気揚々と以前作ったサンプルをビルドしてみたらビルドエラーが。
どうやら ``MapView.AddMarker`` や ``MarkerOption`` が無くなって、``Marker`` に MapView を設定するように変更されたらしい。(以下は、さっきのアドバンスドなサンプルからの抜粋)

```c#:PartOfMarkersViewController.cs
public override void ViewDidLoad ()
{
	base.ViewDidLoad ();

	var camera = CameraPosition.FromCamera (-37.81969, 144.966085, 4);
	var mapView = MapView.FromCamera (RectangleF.Empty, camera);

	var sydneyMarker = new Marker () {
		Title = "Sydney",
		Snippet = "Population: 4,605,992",
		Position = new CLLocationCoordinate2D (-33.8683, 151.2086),
		Map = mapView
	};

	var melbourneMarker = new Marker () {
		Title = "Melbourne",
		Snippet = "Population: 4,169,103",
		Position = new CLLocationCoordinate2D (-37.81969, 144.966085),
		Map = mapView
	};

	// Set the marker in Sydney to be selected
	mapView.SelectedMarker = sydneyMarker;

	View = mapView;
}
```

これは、元の Google Maps SDK for iOS が根源なのか、Google Maps の Xamarin Component がそうしたのか知りませんが、ReleaseNotes とかないのかな？うっかり更新すると怖いな。

## まとめ
* Component の Update は、 Get More Components から
* むやみに Update すると互換性なくなってるかもなのでバックアップというかバージョン管理ちゃんとしよう
* つまり Xamarin Components に ReleaseNotes 欲しいです