OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon SNS の Mobile Push の送信側のコード（とりあえず動く版）

[AWS のサンプル](https://s3.amazonaws.com/codesamples/sns/latest/snsmobilepush.zip) で Push 側のコードサンプルが Java 版しかないので、参考にして Ruby で書いてみた版。

エラー処理などを追加して、後ほど完成させたい。
Android クライアントはサンプルをそのまま利用した。

参考: [Amazon SNS の新機能「Mobile Push」を Android で使ってみた](http://dev.classmethod.jp/smartphone/android/amazon-sns-mobile-push/)

```rb
require 'aws-sdk'

# AWS.config(access_key_id: 'xxx', secret_access_key: 'yyy', region: 'us-east-1')

class SnsAndroidPush
  def initialize(sns)
    @client = sns.client
  end

  def notify(endpoint_arn, message)
    @client.publish(
      target_arn: endpoint_arn,
      message: message
    )
  end

  def create_application(name)
    res = @client.create_platform_application(
      name: name,
      platform: 'GCM',
      attributes: {
        'PlatformPrincipal' => '',
        'PlatformCredential' => ENV['GOOGLE_PLAY_API_KEY']
      }
    )
    res[:platform_application_arn]
  end

  def create_endpoint(application_arn, registration_id, user_data = '')
    res = @client.create_platform_endpoint(
      platform_application_arn: application_arn,
      token: registration_id,
      custom_user_data: user_data
    )
    res[:endpoint_arn]
  end
end

registration_id = 'zzz'

sns = AWS::SNS.new
sns_push = SnsAndroidPush.new(sns)
app_arn = sns_push.create_application('testtest')
endpoint_arn = sns_push.create_endpoint(app_arn, registration_id)
sns_push.notify(endpoint_arn, "#{Time.now} test")
```
第13回オフラインリアルタイムどう書くの問題(ruby)

問題：http://nabetani.sakura.ne.jp/hena/ord13blocktup/
解答例：http://qiita.com/Nabetani/items/936e7885f4c607472060

```ruby:offline13.rb
def calc src
  w = 0
  ana = []
  src.each_with_index do |s,i|
    ana.push i if s.zero?
  end
  (1..src.max).each do |t|
    left = -1
    src.each_with_index do |s,i|
      if t<s
        w += (i-left-1) if 0<=left && !ana.any? {|a|left<=a&&a<=i}
        left=i
      end
    end
  end
  w
end

DATA.each do |d|
  n, src, dst = d.split
  r = calc src.chars.map{|m| m.to_i}
  puts "ng [#{n}] #{dst} != #{r}" unless r==dst.to_i
end

__END__
0       83141310145169154671122 24
1       923111128               45
2       923101128               1
3       903111128               9
4       3                       0
5       31                      0
6       412                     1
7       3124                    3
8       11111                   0
9       222111                  0
10      335544                  0
11      1223455321              0
12      000                     0
13      000100020003121         1
14      1213141516171819181716151413121 56
15      712131415161718191817161514131216       117
16      712131405161718191817161514031216       64
17      03205301204342100                       1
18      0912830485711120342                     18
19      1113241120998943327631001               20
20      7688167781598943035023813337019904732   41
21      2032075902729233234129146823006063388   79
```
第13回オフラインリアルタイムどう書くの問題をRubyで解く

問題はこちらのリンクから
http://qiita.com/Nabetani/items/936e7885f4c607472060

```rb
def solve(q)
  walls = q.chars.map(&:to_i)
  y_sz = walls.max
  x_sz = walls.size
  pool = walls.map{|sz| sz==0 ? [:H]*y_sz : [:B]*sz + [:W]*(y_sz-sz)}
  pool.each_with_index{|v, i|
    v.each_with_index{|w, j|
      next if w == :B
      break if j == 0
      left_ok = right_ok = false
      if i > 0
        (i-1).downto(0){|ii|
          case pool[ii][j]
          when :H
            break
          when :B
            left_ok = true
            break
          end
        }
      end
      if i < x_sz - 1
        (i+1).upto(x_sz-1){|ii|
          case pool[ii][j]
          when :H
            break
          when :B
            right_ok = true
            break
          end
        }
      end
      unless left_ok and right_ok
        pool[i] = pool[i][0, j]
        break
      end
    }
  }
  pool.flatten.count{|v| v == :W}
end

DATA.readlines.each do |line|
  no,q,a,d = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	83141310145169154671122	24	
1	923111128	45	
2	923101128	1	
```
composer の「Warning: The lock file is not up to date ～」

`composer install` で次の警告が表示されたのでなんなのか調べました。

```
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
```

### 原因

composer.json ファイルの md5 と、 composer.lock に記録されたハッシュ値が一致していません。


### おもいで

次のような理由で composer.json と composer.lock にズレが生じたためでした。

 1. あるプロジェクトで開発者全員/プロダクション/ステージングなどの各環境で依存パッケージのバージョンを固定させたいので composer.lock も VCS に含めていました
 2. ある日、機能追加のために依存パッケージを composer require で増やしました
 3. composer.json を確認すると、依存パッケージが追加された以外にところどころホワイトスペースが元の内容から変更されていました
 4. なんか気に入らなかったのでホワイトスペースだけ元に戻して composer.json と composer.lock を commit/push しました
 5. composer.json と composer.lock にズレが生じて警告がでるようになりました

ホワイトスペースを少し弄っただけだったのですが、composer.lock には composer.json ファイルの md5 がそのまんま記録されているので、1 バイトでも手を加えると警告が表示されます。


### 解決

`composer update` で composer.lock を更新できますが、それだと固定したはずの依存パッケージのバージョンまで更新されます。それはとても困ります。

`composer update --lock` とすれば composer.lock に記録されたハッシュ値だけ更新されます。

```
$ composer update --lock
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
```

composer.json を手修正したときは `composer update --lock` しておくとよさそうです。


### おまけ

`composer update --help` で表示される説明・・・

```
--lock  Only updates the lock file hash to suppress warning about the lock file being out of date.
```

composer.lock のハッシュ値だけ更新されるように読めますが、composer.json の require にパッケージを追加/削除して `composer update --lock` すると、パッケージによってインストール/アンインストールも一緒にされたりされなかったりしました。

単に composer.json の md5 を計算して composer.lock に書き込むだけにしては異様に時間かかるなーとは思いましたが・・・

恐らく、dev-master のようなブランチに基づくバージョンが指定されたパッケージは `composer update --lock` だけでインストール/アンインストールまで行なわれている、ような気がします。
第13回オフラインリアルタイムどう書くの問題


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

問題は「積み木の水槽」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord13blocktup/
です。

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

テキストエリアにフリーフォーマットで入力させた際に、半角の円記号（\）が邪魔になったので、どうにかする。

後続の処理で、改行コード変換のために、preg_replaceしてて、半角の円記号（\）が文字化けしていたので、苦肉の策（？）

```php:
$texta = "この値段は、\500ですが、なにか問題でも";

if(strstr($texta,"\\")){
    $texta = str_replace("\\","\\\\",$texta);
}

print $texta;
```

```text:出力
表示結果：この値段は、\500ですが、なにか問題でも
```

これでいけるかな
rubyから形態素解析ライブラリkuromojiを使う

### kuromojiとは

[Kuromoji](http://www.atilika.com/ja/products/kuromoji.html)は[atilika](http://www.atilika.com/ja/)社が開発したJavaで作成されたオープンソースの日本語形態素解析エンジンです。

Kuromojiは下記の機能を持っています。

* 複合語の分割
* 品詞のタグ付け
* 見出し化
* 漢字の読み方を抽出
* 検索用の設計（複数の単語分割モード）

KuromojiのライセンスはApache v2ライセンスなので、商用でも利用できそうです。

### 準備

ソースコードはgithubにあるのでビルドしても良いのですが、zipでも[ダウンロード](https://github.com/downloads/atilika/kuromoji/kuromoji-0.7.7.zip)する事が出来ます。
今回はプロジェクトディレクトリ以下に解凍し、呼び出します。

kuromojiはjavaで作成されていますが、今回はrubyから使うことが目的なので、[rjb](http://rjb.rubyforge.org/)を使います。  
rjbはJNI (Java Native Interface) を利用してJava VMを操作するライブラリです。  
具体的には、Rubyプロセス内にJVMを起動し、Java クラスファイルをロードしてメソッドを呼ぶことができます。

rjbの用意は、`Gemfile`に`gem 'rjb'`を追加し、`require 'rjb'`するだけです。

### 形態素解析

rubyからkuromojiの使い際のポイントは

`Rjb::load`して、
`Tokenizer=Rjb::import('org.atilika.kuromoji.Tokenizer')`し、
`Tokenizer.builder.build`でトークナイザーを作る事です。

#### サンプルコード

```ruby
require 'rjb'

module  JavaIterator
  def each
    i = self.iterator
    while i.has_next
      yield i.next
    end
  end
end

Rjb::load('kuromoji-0.7.7/lib/kuromoji-0.7.7.jar')

Tokenizer=Rjb::import('org.atilika.kuromoji.Tokenizer')

@tknizer = Tokenizer.builder.build

def tokenize sentence
  list = @tknizer.tokenize(sentence)
  list.extend JavaIterator
  list.each do |x|
    print x.surface_form
    print " : "
    puts x.all_features
  end
end

str = "関西国際空港は、大阪府大阪市の南西38kmにまたがる会社管理空港である"

tokenize str
```

#### 実行結果

```
関西国際空港 : 名詞,固有名詞,組織,*,*,*,関西国際空港,カンサイコクサイクウコウ,カンサイコクサイクーコー
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
、 : 記号,読点,*,*,*,*,、,、,、
大阪 : 名詞,固有名詞,地域,一般,*,*,大阪,オオサカ,オーサカ
府 : 名詞,接尾,地域,*,*,*,府,フ,フ
大阪 : 名詞,固有名詞,地域,一般,*,*,大阪,オオサカ,オーサカ
市 : 名詞,接尾,地域,*,*,*,市,シ,シ
の : 助詞,連体化,*,*,*,*,の,ノ,ノ
南西 : 名詞,一般,*,*,*,*,南西,ナンセイ,ナンセイ
38 : 名詞,数,*,*,*,*,*
km : 名詞,一般,*,*,*,*,*
に : 助詞,格助詞,一般,*,*,*,に,ニ,ニ
またがる : 動詞,自立,*,*,五段・ラ行,基本形,またがる,マタガル,マタガル
会社 : 名詞,一般,*,*,*,*,会社,カイシャ,カイシャ
管理 : 名詞,サ変接続,*,*,*,*,管理,カンリ,カンリ
空港 : 名詞,一般,*,*,*,*,空港,クウコウ,クーコー
で : 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある : 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
```

単語の特徴は`all_features`で取得出来るほかに、
`surface_form`,`part_of_speech`,`base_form`,`position`,`reading`とそれぞれ個別でも取得可能です。

### 検索用の分割モード

Kuromojiは複数の分割モードを持っています。  
単語分割モードの変更はトークナイザー作成時にモードを指定します。

```ruby
Mode = Rjb::import('org.atilika.kuromoji.Tokenizer$Mode')

@tknizer = Tokenizer.builder.mode(Mode.SEARCH).build
```

例えば検索用のモードだと、先ほど「関西国際空港」と一つの単語だった物が分割されます。

```
関西 : 名詞,固有名詞,地域,一般,*,*,関西,カンサイ,カンサイ
国際 : 名詞,一般,*,*,*,*,国際,コクサイ,コクサイ
空港 : 名詞,一般,*,*,*,*,空港,クウコウ,クーコー
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
~~~ 以下略 ~~~
```
AWS SDK for PHPを利用したAmazon SNSのMobile Push

Amazon SNSでMobile PushがサポートされたのでiOS向けだけ試してみました。
今回は下記の環境で行っています。
■環境
PHP5.5.1
AWD SDK for PHP2.4.5 

たぶんMobile Pushは2.4.4からです。


まず、SDKを使う前に、AWSのManagement Consoleからでpushできるので、
そちらを試してみてください。
■参考URL
http://dev.classmethod.jp/cloud/aws-amazon-sns-mobile-push-ios/


次に、AWSのブログですね。SDKを使ったサンプルです。
■Amazon Web Services ブログ
http://aws.typepad.com/aws_japan/2013/08/push-notifications-to-mobile-devices-using-amazon-sns.html


で、サンプルコードです。
**最低限**のコードなので、マニュアルを見た上で自己責任でお願いします。

```php

<?php
require'/aws_sdk_path/vendor/autoload.php';
use Aws\Common\Aws;
use Aws\Common\Enum\Region;
use Aws\Sns\SnsClient;

class Sample {

	// Amazon SDKのインスタンス
	private $obj = null;

	// ManagementConsoleで登録したアプリ(APNS_SANDBOX:開発用)
	private $PlatformApplicationArn = 'arn:aws:sns:ap-northeast-1:000000000000:app/APNS_SANDBOX/sample_app'; // dummy

	/**
	 * AWS SDK for PHP
	 */
	private function getInstance() {
		if (is_null($this->obj)) {
			$this->obj = Aws::factory(array(
				'key'    => 'dummy',
				'secret' => 'dummy',
				'region' => Region::TOKYO
			))->get('sns');
		}
		return $this->obj;
	}

	/**
	 * Push通知先(EndpointArn)を登録
	 */
	public function createPlatformEndpoint($token) {
		$options = array(
			'PlatformApplicationArn' => $this->PlatformApplicationArn,
			'Token'                  => $token,
		);
		try {
			$res = $this->getInstance()->createPlatformEndpoint($options);
		} catch (Exception $e) {
//			echo $e->getMessage();
			return false;
		}
		return $res; // $res['EndpointArn']
	}

	/**
	 * 通知
	 */
	public function publish($message, $EndpointArn) {
		try {
			$res = $this->getInstance()->publish(array(
				'Message'   => $message,
				'TargetArn' => $EndpointArn
			));
		} catch (Exception $e) {
//			echo $e->getMessage();
			return false;
		}
		return $res;
	}

	/**
	 * 通知(JSON)
	 */
	public function publishJson($args) {
		try {
			$res = $this->getInstance()->publish($args);
		} catch (Exception $e) {
//			echo $e->getMessage();
			return false;
		}
		return $res;
	}
}

$message = 'Amazon SNS Mobile Push message.';

// メッセージのみを通知
$AmazonSns = new Sample();
$res = $AmazonSns->createPlatformEndpoint('dummy');
$AmazonSns->publish($message, $res['EndpointArn']);

// JSON形式で色々な値を送る ※文字列の上限に達すると送られないので注意
$AmazonSns->publishJson(array(
    'MessageStructure' => 'json',
    'TargetArn' => $res['EndpointArn'],
    'Message' => json_encode(array(
        'APNS_SANDBOX' => json_encode(array(
            'aps' => array(
                'alert' => $message,
                'badge' => 10, // int型でアプリアイコンに表示するbadge数を指定
                'test_id' => 1 // 好きなパラメータを設定可能
            )
        ))
    )),
));
```

使い方としては、createPlatformEndpoint()でtokenを登録し、
そのレスポンスで返ってきたEndpointArnを利用してpublish()するだけです。
注意点としては、アプリ名（PlatformApplicationArn）も通知先（EndpointArn）も
AWS側で生成されるものだということです。

実際にサービスで利用する場合は、
1,Management Console上でアプリを登録してPlatformApplicationArnを取得
2,createPlatformEndpoint()のレスポンスのEndpointArnをDB等に登録
3,必要なユーザに対してだけpublish()
という形かなと思います。

AWS側で生成される値を使うのはちょっと面倒かな・・・
CoreDataでUISearchBarからの検索を速くする

CoreDataに1万件くらいの大量のデータがある場合、UISearchBarなどで部分一致で一文字目から検索したりすると、極端に遅くなってしまうことがあります。
そういった場合はちょっとしたハックで動きを軽くしましょう。

名前と住所の入ったデータだとして、これが1万件ぐらい既に入っているものとします。
![スクリーンショット 2013-09-06 17.08.51.png](https://qiita-image-store.s3.amazonaws.com/0/6688/5172b8af-6d65-8a5b-843a-584c474161bc.png)

これを以下のように変更します。
![スクリーンショット 2013-09-06 17.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/6688/ce754ce1-6712-5c4b-0a8c-c264b0e7fa44.png)
firstLetterには、Personエンティティの検索対象のattributeの、頭文字を入れます。アルファベットや50音などが良いと思います。

あとはNSPredicateを作成する際に場合分けをすれば良いです。
UISearchBarControllerを実装している場合だと、以下の様なメソッドを書けば良いと思います。

```objc
- (void)filterContentForSearchText:(NSString*)searchText
							 scope:(NSString*)scope
{
	NSString *query = self.searchDisplayController.searchBar.text;
	
	NSPredicate *namePred;		// 名前用のPredicate
		
	if([query length] == 0) {
		return;
	}else if ([query length] == 1) {	// 検索窓に一文字しか入力されなかったときは、firstLetterから探す
		namePred = [NSPredicate predicateWithFormat:@"firstLetter.firstLetter contains[cd] %@", query];
	}else{	// 二文字以上の場合は部分検索
		namePred = [NSPredicate predicateWithFormat:@"name contains[cd] %@", query];
	}
	
    if (query && query.length) {
        [self.fetchedResultsController.fetchRequest setPredicate:namePred];
		[NSFetchedResultsController deleteCacheWithName:@"Person"];
		
		NSError *error = nil;
		if (![self.fetchedResultsController performFetch:&error]) {
			// Handle error
			NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
			exit(-1);  // Fail
		}
	}
}
```
homebrewのパッケージをGemfileみたく管理したい -> brewdlerがあった...

**2014/4/10追記**

brewdlerの機能はhomebrewに包含されました。
この記事は古いのでみんなhomebrew使いましょう！

経緯: https://github.com/Homebrew/homebrew/pull/24107

Brewfileを書いて、homebrewをインストールした後に以下のコマンドを実行すれば問題無いです。

```
brew bundle
```

# 開発環境の構築の構築

開発環境の構築、Vagrantを使って構築するようになったのだけど、
開発環境の構築の構築、つまるところホストとなるべくMac OS Xマシン側の
環境構築について、なんか楽したいな〜と思って、
homebrewをBundlerのごとくBrewfileとか作って管理できたらいいのに
って思って検索したらあった。よかったよかった。:beer:

[brewdler](https://github.com/andrew/brewdler)

# 使い方

## brewdlerをインストール

```
> gem install brewdler
```

## Brewfileを編集

以下のように```Brewfile``` を書く

```rb:Berwfile
brew 'go'
```

## 書きだしたformulaをインストール

```
brewdle install
```

簡単。
動きのあるスクリーンキャプチャを撮りたいときに LICEcap が便利

Cockos Incorporated | LICEcap
http://www.cockos.com/licecap/

デスクトップの任意の場所を撮影して GIF アニメとして保存できるアプリ。無料。起動してでてくる枠の中の透明な部分が撮影対象。枠のサイズは変えられる。下の画像だと右上のエリア参照。

静止画像のスクリーンキャプチャだけだと物足りないときに便利です。デモムービーが欲しいけど動画を作るのは大げさすぎるときとか、動きが重要な部分を見せたいときとかに。

![Screen Shot 2013-09-06 at 4.43.58 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/339/aabdbd39-3163-28ba-48a5-9d0638946296.jpeg)

使用例: [Automator でスクリーンショット画像を JPEG に変換したり画質を下げてファイルサイズを減らす - Qiita](http://qiita.com/kyanny/items/2b72046dc793e46d16aa)

「この機能を実装したよ」みたいな Pull Request を送るときに、手元で操作したデモの動きそのものをこれで撮影して GitHub に貼り付けたりすると、レビュワーもわかりやすくて助かるしプログラマ以外の人にも伝えやすくて便利。
ガラケーでチェックボックス・ラジオボタンでonがはいる。

ガラケーでサイト表示時にチェックボックス・ラジオボタンのvalueが空の場合にonが入ることがある。
対策としてなにか文字を入れて後で削除するなどして対応する必要があります。
他方法が見つからなかったので参考までに・・・。

ｲﾏｻﾗｶﾞﾗｹｰとか・・・。
Automator でスクリーンショット画像を JPEG に変換したり画質を下げてファイルサイズを減らす

という作業をよくやりたくなるので Automator でアプリケーションとワークフローを作った。

Automator JPEG Tools
https://github.com/kyanny/automator_jpeg_tools

（※Automator アプリ/ワークフローを公開・配布して問題ないか知りたい & 配布する場合のライセンスは何が適切か知りたいので詳しい方いたら @kyanny まで教えてください）

----

.app のほうはファイルをドラッグ & ドロップして使う。

![convert_to_jpeg_1.gif](https://qiita-image-store.s3.amazonaws.com/0/339/a1db29c1-b003-7c27-1a33-30084580a06a.gif)

.workflow のほうは Service として作ってあるので右クリックのコンテキストメニューから選べる。

![convert_to_jpeg_2.gif](https://qiita-image-store.s3.amazonaws.com/0/339/d8047d94-8f62-2d27-2f86-6d2d436c69ab.gif)

----

JPEG 化 + 画質を落としてファイルサイズ減らすほうは 500kb を超えてアップロードできないので GitHub でみてください。
（まさに Qiita にスクリーンショットを添付するときにファイルサイズを減らす必要があるのでこのツールを作ったのだった）

画質を落とすのは Automator 組み込みのアクションだけではできなかったので sips コマンドを使ってます。
スマホでソフトウェアキーボードを表示させない。

jqueryのdatepickerをスマフォで使っていてキーボードが邪魔だから非表示にしたい！ってことで
inputタグに対してreadonlyをつかって読み込み専用のボックスにしてやることで対応。
これによって値が送れるかつ、スマフォのソフトウェアキーボードを出さないということが可能です。
ただし、入力はjsからしかできなくなります。

参考タグ
\<input type="text" name="date" value="0000-00-00" readonly="readonly" /\>
パイチャートの描画


```.as:.as
function drawPie(g:Graphics, x:Number, y:Number,
							radius:Number, angle:Number, rotate:Number=0):void
{
	var seg:uint = 8;
	var r:Number = angle / seg;
	var sin:Number = Math.sin(r);
	var cos:Number = Math.cos(r);
	var tan:Number = Math.tan(r / 2);
	var pi2:Number = Math.PI / 2;
	var ax:Number = Math.cos(rotate) * radius;
	var ay:Number = Math.sin(rotate) * radius;
	g.moveTo(x, y);
	g.lineTo(x + ax, y + ay);
	for (var i:int = 0; i<seg; i++ ) 
	{
		var nx:Number = cos * ax - sin * ay;
		var ny:Number = cos * ay + sin * ax;
		var t:Number = (i + 1) * r - pi2 + rotate;
		var cx:Number = nx + radius * tan * Math.cos(t);
		var cy:Number = ny + radius * tan * Math.sin(t);
		g.curveTo(x + cx , y + cy, x + nx, y + ny);
		ax = nx; ay = ny;
	}
}
```


SVG + JavaScript

```jade:.jade
svg(width=500, height=500)
  path(d='', stroke="red", stroke-width="20", stroke-linecap="round", fill="white")
```

```coffee:.coffee
arc = (x, y, radius, angle, rotate=0)->
  seg = 8
  r = angle / seg
  sin = Math.sin(r)
  cos = Math.cos(r)
  tan = Math.tan(r / 2)
  pi2 = Math.PI / 2
  ax = Math.cos(rotate) * radius
  ay = Math.sin(rotate) * radius
  path = ''
  path += moveTo(x + ax, y + ay)
  for i in [0...seg]
    nx = cos * ax - sin * ay
    ny = cos * ay + sin * ax
    t = (i + 1) * r - pi2 + rotate
    cx = nx + radius * tan * Math.cos(t)
    cy = ny + radius * tan * Math.sin(t)
    path += curveTo(x + cx , y + cy, x + nx, y + ny)
    ax = nx
    ay = ny
  return path

moveTo = (x, y)->
  return 'M' + x + ',' + y

lineTo = (x, y)->
  return 'L' + x + ',' + y

curveTo = (x, y, ax, ay)->
  return 'Q' + x + ',' + y + ',' + ax + ',' + ay

drawPie = ($path, ratio)->
  start = -Math.PI / 2
  end = Math.PI * 2
  pie = arc 250, 250, 230, end * ratio, start
  $path.attr('d', pie)

$pie = $('#pie')
drawPie($pie, 0.6)
```
grunt-contrib-connectでhttpヘッダーを設定する


`middleware`オプションを使って、HTTPヘッダーを設定するmiddlewareを設定すればOK。
yeomanでクロスドメイン通信したくなった時とかに使ってください。

```javascript
// ヘッダーを設定するmiddlewareを返す関数を定義
var setHeader = function (headers) {
    return function (req, res, next) {
        var key;
        for (key in headers) {
            if (!headers.hasOwnProperty(key)) {
                continue;
            }
            res.setHeader(key, headers[key]);
        }
        next();
    }
}

module.exports = function (grunt) {
	grunt.initConfig({
		// grunt-contrib-configの設定
		connect: {
			options: {
				
				...

				// middlewareオプション
				// リクエストにかますmiddlewareを配列で返す
				middleware:  function (connect) {
					// 設定したいHTTPヘッダーを書く
					var headers = setHeader({
						'Access-Control-Allow-Origin': '*',
						'Access-Control-Allow-Headers': '*',
						'Access-Control-Allow-Methods': 'GET, POST'
					});

					return [headers];
				},

				...
			},

			…

		}
	})
}
```
pearのローカルコピーを任意のディレクトリにインストールする

フレームワークを使ってアプリケーションを開発しているとき、PEARのローカルコピーを、vendorディレクトリなどサードパーティーライブラリを格納するディレクトリにインストールしたくなりません？

Symfony2.3の場合だと、composerでうまくインストールできるのかもしれませんが…
よくわからなかったので力技で。

以下、Symfony 2.3 / Cent OS上での手順をメモしました。

----

Symfony2のインストールディレクトリ
> /home/webuser/symfony

pearのインストールディレクトリ
> /home/webuser/symfony/vendor/pear/

pearのローカル設定ファイル
> /home/webuser/symfony/app/.pearrc

----

```bash
# PEARの設定ファイルを作成
pear config-create /home/webuser/symfony/app/ /home/webuser/symfony/app/.pearrc

# vendor下にpearがインストールされるよう、設定を変更
pear -c /home/webuser/symfony/app/.pearrc config-set bin_dir      /home/webuser/symfony/vendor/pear
pear -c /home/webuser/symfony/app/.pearrc config-set doc_dir      /home/webuser/symfony/vendor/pear/docs
pear -c /home/webuser/symfony/app/.pearrc config-set ext_dir      /home/webuser/symfony/vendor/pear/ext
pear -c /home/webuser/symfony/app/.pearrc config-set php_dir      /home/webuser/symfony/vendor/pear/php
pear -c /home/webuser/symfony/app/.pearrc config-set cache_dir    /home/webuser/symfony/vendor/pear/cache
pear -c /home/webuser/symfony/app/.pearrc config-set cfg_dir      /home/webuser/symfony/vendor/pear/cfg
pear -c /home/webuser/symfony/app/.pearrc config-set data_dir     /home/webuser/symfony/vendor/pear/data
pear -c /home/webuser/symfony/app/.pearrc config-set download_dir /home/webuser/symfony/vendor/pear/download
pear -c /home/webuser/symfony/app/.pearrc config-set temp_dir     /home/webuser/symfony/vendor/pear/temp
pear -c /home/webuser/symfony/app/.pearrc config-set test_dir     /home/webuser/symfony/vendor/pear/tests
pear -c /home/webuser/symfony/app/.pearrc config-set www_dir      /home/webuser/symfony/vendor/pear/www

# 設定を確認
pear -c /home/webuser/symfony/app/.pearrc config-show
```

これで準備が完了です。
ライブラリをインストールするときは、今回作成したローカル設定ファイルとともにコマンドを実行します。

-----

たとえば、 [AWS SDK2 for PHPを使ってS3にファイルをアップロードする](http://blog.genies-ag.jp/2013/01/aws-sdk2-for-phps3.html) ためにaws/sdkをインストールします。

```bash
# 必要なチャネルを登録
pear -c /home/webuser/symfony/app/.pearrc channel-discover pear.amazonwebservices.com
pear -c /home/webuser/symfony/app/.pearrc channel-discover guzzlephp.org/pear
pear -c /home/webuser/symfony/app/.pearrc channel-discover pear.symfony.com

# インストール
pear -c /home/webuser/symfony/app/.pearrc install aws/sdk 
```

次に、Symfony2からこのライブラリを利用できるよう、include_pathを追加します。

※標準の設定ファイルでインストールされたPEARライブラリが既にある場合、include_pathに注意してください。include_pathに既存のPEARライブラリが配置されたディレクトリが登録されていると、二重に読み込まれることがあります。

```php:autoload.php
<?php
// 追記
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/../vendor/pear/php');
```
FlexでGoogleMapsを表示してみる

Flexで地図を表示するためのライブラリModest Mapsを使って、試しにGoogleMapsのタイルを読み込んでみました。
Modest Mapsのソース及びSWCはこちらでダウンロードできます。
https://github.com/migurski/modestmaps-as3

※GoogleMapsのタイル画像に直接アクセスするのは規約違反になりますので、本サンプルを実際のプロジェクトで使うのはやめておきましょう。

1)ModestMapsを使ってOpenStreetMapを表示するサンプルがADCに公開されています。
http://www.adobe.com/devnet/flex/articles/interactive_maps.html
http://www.flexmappers.com/mymodestmap/
非常に分かりやすいサンプルなので、今回はこれをダウンロードしてきて地図タイルをGoogleに切り替えてみます。

2)以下のように、GoogleMapsのタイルを取得するためのクラスを作ります。

```as3:GoogleMapsProvider.as
package com.modestmaps.mapproviders
{ 
	import com.modestmaps.core.Coordinate;
	
	public class GoogleMapsProvider
		extends AbstractMapProvider
		implements IMapProvider
	{
	    public function GoogleMapsProvider(minZoom:int=MIN_ZOOM, maxZoom:int=MAX_ZOOM)
        {
            super(minZoom, maxZoom);
        }

	    public function toString() : String
	    {
	        return "GOOGLE_MAPS";
	    }
	
	    public function getTileUrls(coord:Coordinate):Array
	    {
	        var sourceCoord:Coordinate = sourceCoordinate(coord);
			return [ 'http://mt0.google.com/vt/lyrs=m@127&x='+(sourceCoord.column)+'&y='+(sourceCoord.row)+'&z='+(sourceCoord.zoom) ];
	    }
	    
	}
}
```

3)メイン画面にて、OpenStreetMapProviderを使っている箇所を先程のGoogleMapsProviderに差し替えます。

```as3:main.mxml
_map = new TweenMap(mappanel.width, mappanel.height, true, new GoogleMapsProvider());
```

たったこれだけでFlash上でGoogleMapsを表示できました。
![modestmapswithgoogle.png](https://qiita-image-store.s3.amazonaws.com/0/28397/403db679-e06f-f189-22db-653cb7d259ab.png)
railsから全文検索エンジンelasticsearchを利用する

### ElasticSearchとは

[ElasticSearch](http://www.elasticsearch.org/)はSolrと同じApache Lucene上で稼働するオープンソースの全文検索システムです。  
ElasticSearchの特徴としては、REST APIが整備されていて、JSONですべてやり取りできるところです。

### 準備

ElasticSearchはJavaで動作するので事前にJavaのインストールが必要です。

ElasticSearchのインストールはMacならbrewがあるので簡単です。

```shell
$ brew install elasticsearch
```

Windowsでも[Zipをダウンロード](https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.3.zip)して、batファイル叩くだけだったので楽です。

ElasticSearchには[様々なプラグイン](http://www.elasticsearch.org/guide/reference/modules/plugins/)
が用意されており、その中に日本語対応の物も用意されています。  
kuromojiを用いた[elasticsearch-analysis-kuromoji](https://github.com/elasticsearch/elasticsearch-analysis-kuromoji)を使います。

プラグインのインストールも簡単で用意されている`plugin`コマンドにgitの短縮アドレスを渡して叩くだけです。

```shell
$ plugin --install elasticsearch/elasticsearch-analysis-kuromoji/1.5.0
```

これでkuromojiをプラグインとして利用可能となりました。  
日本語対応させる際に、後述するrailsのmodelでフィールド毎にAnalyzerとしてkuromojiを指定することも出来ますし、デフォルトのAnalyzerとして利用したければ設定ファイル（macなら`/usr/local/opt/elasticsearch/config/elasticsearch.yml`）に以下を追記して指定することも可能です。

```
index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer
```

---

ブラウザからElasticSearchの状態を確認できるプラグインも複数用意されています。  
今回は基本的な[elasticsearch-head](https://github.com/mobz/elasticsearch-head)を導入してみます。

```shell
$ plugin --install mobz/elasticsearch-head
```
elasticsearch-headプラグイン導入後は`http://localhost:9200/_plugin/head/`にアクセスすることでブラウザから様々な確認が出来るようになります。

### サンプルRailsアプリ

ElasticSearchを扱うためのサンプルアプリを作成します。  
`bundle init`して`Gemfile`に`rails`追加して`bundle exec rails new`します。

全文検索を試したいので、ニュースの記事を扱うようにしてみます。  
記事のモデル名をarticleにして、タイトルと本文を持つようにしてみました。

```shell
$ bundle exec rake db:create                                                                                                               
$ bundle exec rails g scaffold article title:string body:text                                                                              
$ bundle exec rake db:migrate
```

### 連携

RailsとElasticSearchとの連携には[tire](https://github.com/karmi/tire)を使います。  
`Gemfile`に`gem 'tire'`を追加して`bundle intall`します。

次にmodelにElasticSearchとの連携を記述します。

#### `app/models/article.rb`

```ruby
class Article < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
    indexes :title, analyzer: :kuromoji
    indexes :body, analyzer: :kuromoji
  end

  def self.search(params)
    tire.search(load: true) do
      query {
        string "body:#{params[:search]} title:#{params[:search]}"
      } if params[:search].present?
    end
  end
end
```

Controllerは`Article.all`の呼び出しをElasticSearchからの検索に変更します。

#### `app/controllers/articles_controller.rb#index`

```ruby
def index
    @articles = Article.search(params)
    # @articles = Article.all
end
```

Viewに検索のボックスを追加します。

#### `app/views/articles/index.html.erb`

```erb
<%= form_tag articles_path, :method => :get do %>
  <%= text_field_tag :search, params[:search] %>
  <%= submit_tag "Search", :name => nil %>
<% end %>
<%= link_to 'clear', articles_path %>
```

これで
`http://localhost:3000/articles`にアクセスして
適当にニュース記事のデータを突っ込んで、
検索窓にワードを打ち込めば検索可能になっています。
MySQL+ActiveRecordで、与えられた配列順にorderしたい時


例えば、RedisのSorted setなど、別のモデルから取ってきた順序に意味のあるID列があったとする。

```rb
ids = [5, 2, 10]
```

で、このIDの順に取得したい場合、mysqlを使っているならこう書ける

```sql
SELECT id FROM model
 WHERE id IN (5, 2, 10)
 ORDER BY FIELD(id, 5, 2, 10)
```

ただ、これをActiveRecordでやろうとする時、自分でsanitizeする必要がある。

```rb
sanitized_query = ActiveRecord::Base.send(:sanitize_sql_array, ["field(id ,?)",ids])
Model.where(id: ids).order(sanitized_query)
```

**[2015/11/15追記]**
Railsの<del>v4.2.5以降では</del> v4.2.5にはまだ入っていませんでしたが、masterには反映されているようです。

```rb
Model.where(id: ids).order(['field(id, ?)', ids])
```

と書けるようになりました。

@jnchito さんに教えていただきました。ありがとうございます。
簡単なシェル関数の書き方(フォルダを無圧縮zipで固める)

シェル関数をそういえば書いたことなかったので簡単なのを書いときました。
`alias` でもできると思うし、具体的な使い分け方法がよくわからないけどとりあえずシェル関数を使ってみたかったんです。

特定のフォルダをまとめるときには `tar` を使うのがLinuxでは王道ですが、WindowsやMacも使ってるとやっぱり `zip` が一番便利。圧縮する必要のない時は無圧縮(0)で固めると早くて良い感じになります。

```bash:~/.bashrc
zip0 () { zip -0rq "$1" "$1"; }
```

0: 無圧縮
r: サブディレクトリも
q: 静かにやれ

で `$. ~/.bashrc` しとけば `$ zip0 folder` でフォルダをzipファイルにまとめることができます。

## ちょっとした注意

```bash:~/.bashrc
zip0 () {zip -0rq "$1" "$1";}
```

のように{}の隙間のスペースがないとエラーになるので注意しましょう。
PHPでシリアライズされたファイルをダンプするワンライナー

DBよりも手軽に情報を保存するのにシリアライズは手軽ですが、内容の確認がちょっと面倒です。

そこで、シリアライズデータが保存されたファイルを指定すると内容をダンプするワンライナースクリプトです。


```php:dump.php
<?php ! empty( $argv[1] ) ? file_exists( $argv[1] ) ? var_dump( unserialize( file_get_contents( $argv[1] ) ) ) : "" : "";
```

実行するにはコマンドラインから

```shell-session
$ php -f dump.php serialized.txt
```

です。
$PATH から特定のパスだけを削除する

今まで `~/sh` に自分で書いたシェルスクリプトを入れてたんだけど、 `~/bin` に入れといたほうがlinuxっぽい気がするので `~/sh/foo.bash` を作っといて `~/sh/foo` にリンクを置くことにしました。

それで環境変数PATHに入ってる `~/sh` を消したいので `~/.profile` を編集して `$ . .profile` すりゃ消えるだろうと思ってたら消えない！

## 消し方
調べてみたら結構めんどくさそうだったけど、頭の良い人が既に解決策として関数を用意してくれてたのでそれを使うことにしました。自分の頭を使わなくて済むって素晴らしい。ヽ(´ー｀)ノ

```bash:~/.bashrc
path_append ()  { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove ()  { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
```

で関数を追加して

```shell-session
$ . ~/.bashrc
$ path_remove ~/sh
```

で `~/sh` を環境変数から消せました。

所でQiitaで表示に使える言語に `shell-session` なんてのもあったんですね。今回はじめて使いました。

## 参考

What is the most elegant way to remove a path from the $PATH variable in Bash? - Stack Overflow
http://stackoverflow.com/questions/370047/what-is-the-most-elegant-way-to-remove-a-path-from-the-path-variable-in-bash
Xslateのテンプレ内でYAMLを使う


静的HTMLを直接書く代わりにText::Xslateを使うこともあります。
そういう場合直接YAMLを書いて（コピペして）処理するというのも便利です。
もちろん、テンプレ内でも配列やハッシュが直接記述できるのですが
静的ファイル生成は書く早さとわかりやすさ優先なのでYAMLはありだとおもいます。
同じような方法でCSV、JSONなども処理できます。

JSONはAPIをからJSONを貰ってHTMLで出力したいときに仮データとして書いておくとどんなHTMLが出力できるのかわかって便利です。

キャッシュがあまり生きないのでテンプレート処理速度重視の書き方ではないと思います。


##Xslate設定

```pl:
use YAML::Syck;
…
my $tx   = Text::Xslate->new(
  function => {
  	yaml => sub {
		my $text = shift;
		my $data = YAML::Syck::Load($text);
		return $data;
  	},
  }
);

```
##テンプレート

```html:yaml.tx
:# macroと併用して使ったりwithで呼び出して共通変数として使ったり
:-> {
---
name : お名前太郎
e_mail: test@test.jp
address: 大阪暑い市ね
:}() | yaml | address;

:macro address -> $address{
<table>
<th>名前</th><td><:$address.name:></td>
<th>住所</th><td><:$address.address:></td>
<th>メール</th><td><:$address.e_mail:></td>
</table>
:}
```
AndroidのActionBarにメニューボタンが表示されるかどうかを取得する

Android 4.0以降のスマートフォンでは、ハードキーにメニューボタンが付いているかいないかで、ActionBarにメニューボタンが追加されるかどうかが変わってしまいます。もしもActionBar非表示のUIを採用していても、メニューボタンの有無は割と重要だと思います。今回は、ハードのメニューボタンが存在するか、というよりActionBarにメニューが追加されるかどうかを取得します。といっても難しいものではなく、Acitivity上で
`ViewConfiguration.get(this).hasPermanentMenuKey();`
を呼び出すだけです。ViewConfiguration#hasPermanentMenuKey()はboolean型で、端末にメニューボタンがある場合はtrueを、ない場合はfalseを返すようです。
WinXP⇒Win7への移行時の注意

VB6.0のIDEはWindows7上では起動できない。
このため、VB.NETにコンバージョンする必要がある。
VB6.0⇒2008⇒2010と2回に分けてコンバージョンする必要がある。

また、IPAddressの取得方法がWin7とXPでは変更になっている。
Win7ではIPv6が利用できるようになったためであるが、
Win7でIPv4を利用するためには、あえてソース内でIPv4を指定する必要がある。
【追記：2018 01/25】配列の連結(concat vs Array.prototype.push.apply)

# 追記

こちらに追記しようとしたのですが見にくかったので別記事にしました
ES6での配列の連結方法になります
https://qiita.com/kaz2ngt/items/c03625587bf398b6f81a

- - -
以下過去記事
- - -
投稿テストも兼ねたメモ

# 配列の連結

一般的に配列の連結はconcatを用いるが、配列に配列を継ぎ足していくような処理だとconcatでは毎回配列を生成しているのがきになり、他の手段を調べてみるとArray.prototype.push.applyというものがあったためメモ

## 実行ファイル

```js:test1.js
var a = [0, 1, 2, 3], b = [4, 5, 6, 7], i, count = 10000;
console.time();
for (i = 0; i < count; i++) {
  a = a.concat(b);
}
console.timeEnd();
```
```js:test2.js
var a = [0, 1, 2, 3], b = [4, 5, 6, 7], i, count = 10000;
console.time();
for (i = 0; i < count; i++) {
  Array.prototype.push.apply(a, b);
}
console.timeEnd();
```

## 方法
上記のファイルをそれぞれ5回ずつ実行して計測しました。(node v0.10.18)

## 結果

| | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
|:--|:--:|:--:|:--:|:--:|:--:|
| concat | 200ms | 200ms | 201ms | 202ms | 201ms |
| Array.prototype.push.apply | 3ms | 3ms | 2ms | 2ms | 3ms |

## 結論

大量に配列を連続して連結する必要がある場合にはとても有効かと思います。
しかし、http://www.kanasansoft.com/weblab/2009/04/javascriptconcat.html のブログにもあるように、
単純に1回だけなどではconcatの方が早かったりするため、上記のような条件以外では検証が必要です。

### 補足

#### 配列の連結が1回だけの場合

```js:test3.js
var i, count = 100000;
console.time();
for (i = 0; i < count; i++) {
  var a = [0, 1, 2, 3], b = [4, 5, 6, 7];
  a = a.concat(b);
}
console.timeEnd();
```
```js:test4.js
var i, count = 100000;
console.time();
for (i = 0; i < count; i++) {
  var a = [0, 1, 2, 3], b = [4, 5, 6, 7];
  Array.prototype.push.apply(a, b);
}
console.timeEnd();
```
## 結果

| | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
|:--|:--:|:--:|:--:|:--:|:--:|
| concat | 10ms | 9ms | 10ms | 10ms | 9ms |
| Array.prototype.push.apply | 15ms | 16ms | 15ms | 15ms | 15ms |
Weblogicで各Webアプリのクラスローダでロードされたクラスを優先させる方法

ハマったのでメモ。

##はじめに
アプリケーションサーバのようにクラスローダに親子がある環境では、親でロードされたクラスが優先されてしまい、各アプリケーションに配置したクラスが実行時に利用できないといった事が起こる。

##起こりえる問題
例えば、 Weblogic 10.3.3 では、 Weblogic 自身が apache-commons-lang の ver 2.1 をロードしている。
この Weblogic に、 apache-commons-lang の ver 2.6 を使用した以下のような実装を持つ Web アプリを配備したとする。

```java:Webアプリの実装（一部）
logger.info("parameter : " + StringUtils.join(paramList, ","));
```

`WEB-INF/lib` にしっかりと jar を配置していても、この Web アプリは実行時に `StringUtils.join(paramList, ",")` の部分で `NoSuchMethodError` が発生してしまう。

これは、 Weblogic が既にロードしていた ver 2.1 の StringUtils に `join(Collection, String)` が存在しないのが原因（当該メソッドは ver 2.3 から実装されている）。

##対処方法
このエラーを防ぐには、各 Web アプリでロードされたクラスを優先するように設定する必要がある。

Weblogic では、 `WEB-INF` フォルダの直下に `weblogic.xml` という XML ファイルを配置し、 `prefer-web-inf-classes` に `true` を指定すればいい。

```xml:weblogic.xml
<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
  ...
  <container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>
  ...
</weblogic-web-app>
```

`prefer-web-inf-classes` に `true` を指定すると、 `WEB-INF` 以下のクラスが優先して使用されるようになり、前述の問題が発生しなくなる。

特定のパッケージだけを優先する方法もあるっぽい。

#参考
+ [prefer-web-inf-classes | weblogic.xmlデプロイメント記述子の要素](http://docs.oracle.com/cd/E21043_01/web.1111/b60993/weblogic_xml.htm#sthref296)
+ [Class loader issue in 11g (WL 10.3.2) | Oracle Forums](https://forums.oracle.com/thread/1058776)
+ [WebLogic Server アプリケーションのクラスローディングについて](http://docs.oracle.com/cd/E16340_01/web.1111/b55515/classloading.htm)
「第4回オフラインリアルタイムどう書くの問題」をPHPで解く

http://nabetani.sakura.ne.jp/hena/ord4tetroid/

qiita版リンク集がない？
作者による回答例はこちら。
http://qiita.com/Nabetani/items/cdc38bfc5665a5361942
http://qiita.com/Nabetani/items/a2d6f70241b9e80ab17d
4つの座標から、どのテトリミノかを判断します。

正直どうすればよいのかよくわからん。

```php
<?php
	
	class TETRIMINO{
		
		// 全パターン
		private $minoList = [
			'L0' => ['00', '01', '02', '12'],
			'L1' => ['00', '01', '10', '20'],
			'L2' => ['00', '10', '11', '12'],
			'L3' => ['01', '11', '20', '21'],
			'L4' => ['02', '10', '11', '12'],
			'L5' => ['00', '01', '11', '21'],
			'L6' => ['00', '01', '02', '10'],
			'L7' => ['00', '10', '20', '21'],
			'I0' => ['00', '01', '02', '03'],
			'I1' => ['00', '10', '20', '30'],
			'T0' => ['00', '10', '11', '20'],
			'T1' => ['01', '10', '11', '12'],
			'T2' => ['01', '10', '11', '21'],
			'T3' => ['00', '01', '02', '11'],
			'O0' => ['00', '01', '10', '11'],
			'S0' => ['00', '01', '11', '12'],
			'S1' => ['01', '02', '10', '11'],
			'S2' => ['00', '10', '11', '21'],
			'S3' => ['01', '10', '11', '20'],
		];
		
		/**
		* テトリミノ
		* @param  String 「07,17,06,05」みたいな文字
		* @return String 「L」みたいな文字
		*/
		public function get($input){
			// パース
			$list = explode(',', $input);
			if(count(array_flip($list)) !== 4){ return '-'; }
			
			// 左上に詰める
			$minX = $minY = 9;
			foreach($list as $key=>$val){
				$minX = min($val[0], $minX);
				$minY = min($val[1], $minY);
			}
			foreach($list as $key=>$val){
				$list[$key] = ($val[0]-$minX) . ($val[1]-$minY);
			}
			
			// 同じものがあればそれを返す
			sort($list);
			foreach($this->minoList as $key=>$val){
				if($val === $list){
					return $key[0];
				}
			}
			// なかった
			return '-';
		}
		
	}
	
	// テスト
	$test = [
		['55,55,55,55', '-'],
		/* 省略 */
	];

	$tetrimino = new TETRIMINO();
	foreach($test as $key=>$data){
		$answer = $tetrimino->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

回転させるのが面倒なら、回転後のデータも全部持ってればいいじゃない、という暴挙。
一番左上に詰めたときのパターンを全て持っておき、一致すればそれを返すという単純な作りです。
foreachが3回も出てくるのが微妙だ。
かかった時間は40分くらい。
wgetが異常に遅いとき

```
wget http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/netboot.tar.gz
--2013-09-05 23:13:55--  http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/netboot.tar.gz
archive.ubuntu.com をDNSに問いあわせています... 2001:67c:1360:8c01::1a, 2001:67c:1360:8c01::22, 2001:67c:1360:8c01::23, ...
archive.ubuntu.com|2001:67c:1360:8c01::1a|:80 に接続しています... ^C
 ```

IPv4の回線でIPv6で名前解決して読みに行こうとして失敗しているくさいです。
おまえはこうして
 
```
wget  --inet4-only http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/netboot.tar.gz
```

こうじゃ。
play 依存ファイルの更新でエラーが出た場合。


##　play 依存ファイルの更新でエラーが出た場合。

```
[warn]  [NOT FOUND  ] org.slf4j#slf4j-api;1.6.6!slf4j-api.jar (0ms)
[warn] ==== local: tried
[warn]   c:\play\repository\local\org.slf4j\slf4j-api\1.6.6\jars\slf4j-api.jar
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::              FAILED DOWNLOADS            ::
[warn]  :: ^ see resolution messages for details  ^ ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[error] (*:update) sbt.ResolveException: download failed: org.slf4j#slf4j-api;1.
6.6!slf4j-api.jar
```

詳しく調べてはいないのですが、実行している play のバージョンと、プロジェクトのバージョンが違う場合に、このエラーになるようです。

###対応方法

ファイルを編集します。

`project/plugins.sbt `


編集箇所は、下記の文字列が存在する行の行末のバージョン番号を 実行しているplay のバージョンに変更する。

`addSbtPlugin("play" % "sbt-plugin" % "2.1.2")`
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　↓
`addSbtPlugin("play" % "sbt-plugin" % "2.1.3")`


play を再起動すると、エラーは発生せず起動できます。この時、プロジェクト起動時の play バージョンが変わっています。

```
       _            _
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/

play! 2.1.3 (using Java 1.7.0_25 and Scala 2.10.0), http://www.playframework.org
```

play のバージョンとプロジェクトのバージョンが違う場合は、プロジェクト起動時に下記のメッセージが出て、plugins.sbt を更新するようにメッセージが出ています。

```
This project uses Play 2.1.2!
Update the Play sbt-plugin version to 2.1.3 (usually in project/plugins.sbt)
```

+ 備忘録
オブジェクト生成時にundefinedをセットする意味

個人的に気になったので調べてみました。

# 1. オブジェクトの生成に関するコスト
### test0.js: 空オブジェクトの生成
```js:test0.js
var i, count = 1000000, obj;
console.time();
for (i = 0; i < count; i++) {
  obj = {};
}
console.timeEnd();
```
### test1.js: 最初に値まで定義する
```js:test1.js
var i, count = 1000000, obj;
console.time();
for (i = 0; i < count; i++) {
  obj = { a: 1 };
}
console.timeEnd();
```
### test2.js: 最初にundefinedを定義し、後から値代入
```js:test2.js
var i, count = 1000000, obj;
console.time();
for (i = 0; i < count; i++) {
  obj = { a: undefined };
  obj.a = 1;
}
console.timeEnd();
```
### test3.js: 最初に定義せず、後から値代入
```js:test3.js
var i, count = 1000000, obj;
console.time();
for (i = 0; i < count; i++) {
  obj = {}
  obj.a = 1;
}
console.timeEnd();
```

## 方法
上記のファイルをそれぞれ5回ずつ実行して計測した。(node v0.10.18)

## 結果

| | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
|:--|:--:|:--:|:--:|:--:|:--:|
| test0.js | 6ms | 6ms | 6ms | 5ms | 6ms |
| test1.js | 8ms | 7ms | 7ms | 7ms | 7ms |
| test2.js | 6ms | 5ms | 6ms| 6ms | 6ms |
| test3.js | 38ms | 37ms | 37ms | 37ms | 36ms |

表からわかるように、最初に値、undefinedを定義したものに比べて、なにも定義しなかった場合は5~6倍遅くなっていた。

## 結論

速度を気にした方が良いところ、for文をたくさん回すところでは使った方がいいと思われるが、単純計算1回あたり0.00003ms程度の違いなので無理して使うほどではないと思われる。
subvimプラグインを使ってみた

思いの外凄かったので。

`cmd+k`, `cmd+t`を押すとこんな画面になります。

![](https://raw.github.com/fatih/subvim/master/_assets/subvim-screenshot.png)

```bash:
$ git clone https://github.com/fatih/subvim.git
$ cd subvim
$ make
[ -d ~/.vim/ ] || ln -s /Users/username/local/git/subvim/vim/ ~/.vim
[ -f ~/.vimrc ] || ln -s /Users/username/local/git/subvim/vim/base/vimrc ~/.vimrc
[ -f ~/.gvimrc ] || ln -s /Users/username/local/git/subvim/vim/base/gvimrc ~/.gvimrc
[ -f ~/.ctags ] || ln -s /Users/username/local/git/subvim/ctags ~/.ctags
```

```bash:
$ rm -r ~/.vim/ ~/.vimrc ~/.gvimrc ~/.ctags
$ make
```

[MacVimをダウンロード](https://code.google.com/p/macvim/downloads/list)し、実行。

独自の設定を追加したい場合は、 ~/.vimrc を編集するのではなく、 `~/.vim/custom/vimrc`に記載する。
Emacsユーザのあなたに贈るvimrc

普段は Emacs を使っていても，サーバー上のちょっとしたファイルをいじる時とか，
Git でコミットをする時とかで日常で補助的に vim も使っている人も少なくないように思います

しかし vim の基本操作は一応覚えていても，普段 Emacs を使っているとすぐにキーバインドを思い出せず，思わず Emacs キーバインドを使ってしまうのではないでしょうか

そんなあなたのために `~/.vimrc` に足すと便利な設定を紹介します

```.vim:.vimrc
" like Emacs
imap <C-k> <ESC>d$i
imap <C-y> <ESC>pi
imap <C-d> <ESC>xi

imap <C-a>  <Home>
imap <C-e>  <End>
imap <C-b>  <Left>
imap <C-f>  <Right>
```

挿入モードの時だけ使えるようになります

薄口な設定なので足しておいて損はない設定だと思いますよ！
GFMのFenced code blocksでハマる


GitHub Flavored Markdown(GFM)使いには常識かもしれないが、fenced code block(```)をordered list(1.)内で使おうとしてハマった。

#  失敗例1
ordered list内でfenced code blockを行頭から始めると、fenced code blockの次の要素が新たなfenced code blockとして始まってしまう。

- The three steps
    1. First,

```
write some code
```
    1. Second,
    1. Third,



#  失敗例2
fenced code blockをindentした。一見うまくいったかと思いきや、後続の採番に失敗する。

- The three steps
    1. First,

    ```
write some code
```
    1. Second,
    1. Third,

# 成功例
もう一段indentした。

- The three steps
    1. First,

        ```
write some code
```
    1. Second,

        ```
write more code
```
    1. Third,

        ```
write better code
```

fenced code blockのindentはきっちりと。
カラー表示でも画面が崩れないUTF-8対応のless.exe

Windowsのコマンドプロンプトで使えるUTF-8に対応したless.exeはいくつかあるのですが、私の周囲では[@mattnさんのパッチ](http://mattn.kaoriya.net/software/20081016143143.htm)を適用したバージョンが有名です。

* [Big Sky :: Windows版のlessでもutf-8なファイルを見れるようにする](http://mattn.kaoriya.net/software/20081016143143.htm)

しかし、このless.exeを試しに使ってみたところ、日本語をカラー表示した時に画面が崩れてしまうことが分かりました。

気になったので調べてみたところ、lessの`-R`オプションを指定した時に、NUL終端されていない文字列を渡されるケースが漏れていたのが原因でしたので、そこを修正してみたのが下記のパッチです。

```diff:less-458.utf-8.patch
diff -Naur less-458.orig/Makefile.wnm less-458/Makefile.wnm
--- less-458.orig/Makefile.wnm	Fri Apr  5 01:55:07 2013
+++ less-458/Makefile.wnm	Thu Sep  5 21:27:07 2013
@@ -6,7 +6,7 @@
 CC = cl
 
 # Normal flags
-CFLAGS = /nologo /ML /W3 /GX /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /c
+CFLAGS = /nologo /W3 /EHsc /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D"_CRT_SECURE_NO_WARNINGS" /c
 LDFLAGS = /nologo /subsystem:console /incremental:no /machine:I386
 
 # Debugging flags
@@ -14,7 +14,7 @@
 #LDFLAGS = /nologo /subsystem:console /incremental:yes /debug /machine:I386
 
 LD = link
-LIBS = user32.lib
+LIBS = user32.lib /nodefaultlib:libc.lib
 
 #### End of system configuration section. ####
 
diff -Naur less-458.orig/screen.c less-458/screen.c
--- less-458.orig/screen.c	Fri Apr  5 01:55:05 2013
+++ less-458/screen.c	Thu Sep  5 21:27:07 2013
@@ -2490,7 +2490,29 @@
 {
 #if MSDOS_COMPILER==WIN32C
 	DWORD written;
-	WriteConsole(con_out, text, len, &written, NULL);
+	extern int utf_mode;
+	if (utf_mode)
+	{
+		DWORD wlen = 0;
+		char *text_prev = text;
+		char *text_end = text + len;
+		wchar_t *wtext = (wchar_t*) malloc(len * sizeof(wchar_t));
+		while (text < text_end && *text)
+		{
+			wtext[wlen++] =  (wchar_t) step_char(&text, TRUE, text_end);
+			if (text == text_prev)
+				break;
+			else
+				text_prev = text;
+		}
+
+		if (wlen > 0)
+			WriteConsoleW(con_out, wtext, wlen, &written, NULL);
+		free(wtext);
+	} else
+	{
+		WriteConsole(con_out, text, len, &written, NULL);
+	}
 #else
 	char c = text[len];
 	text[len] = '\0';
```
本家からソースを落として上記のパッチを当ててビルドしてください。

* [Downloading less](http://www.greenwoodsoftware.com/less/download.html)

`set LESSCHARSET=utf-8` することで、文字エンコーディングがUTF-8なファイルを閲覧できます。
Coffee まとめ1


　とりあえず量が半端無かったのでclass系は除いた。ホントはjavascriptと併記したかったけど体力的にむりぽ

## 基本

- 宣言のvarは不要。勝手にスコープでくくってくれる。
- 行末セミコロンも不要。一行が長くなったらどうするんだろう。

##コメント

~~~~coffeee:
#一行コメント

###
複数行(ややこしくね?
###
~~~~

`//`は使えなくなった。一行コメントはコンパイル時に消されるが、複数行コメントはなんか残るみたい。

##文字列処理
　変数のインライン展開も出来る。これは助かる。

~~~~coffeee:
message = "this is #{label}"
~~~~

　なお、ヒアドキュメントも使える。`'`が3つ。または`"`が3つ。

~~~coffee:
html = '''
<li class="list">
    <a href="//google.com">google</a>
</li>
'''
~~~~

`'`によるヒアドキュメント内での変数展開は無理っぽい。`"`ではいける。シングルクオートの意味は?

##配列

ケツコンマとかが気になるくらいなら改行で区切っちゃえ、って発想。コンマがあろうがなかろうがどっちでもOK。

あとRangeが書ける。`..`と`...`は末尾を含むかどうかに関わる。なんという可読性の高さ。

~~~~coffeee:
range = [1..10]
range_without_ten = [1...10]
~~~~


##制御構造

###比較演算

- `name?`はnameが`null`,`undefined`の時のみfalseを返す。
- `==`は`===`に、`!=`は`!==`に自動変換される。

###IF文

~~~~coffeee:
if env == "dev"
    console.log status
~~~~

　複合条件で折り返したい時は`and`まで書いてから折り返す。折り返してから`and`ってするとだめ。

~~~~coffeee:
if month == 9 and
  day == 23
    console.log status
~~~~

　あ、あと後置のIFも使えるとか。

~~~~coffee:
console.log status if env == "dev"
~~~~

　なお、`unless`キーワードというものがあって、これは否定のifとして働く。

##繰り返し
　配列とオブジェクトではぜんぜん違う。まぁ当たり前だけど

###配列

~~~~coffeee:
for item in items
    console.log item
~~~~

これで内部要素を列挙できる。

###オブジェクト
　オブジェクトの時は`of`を使いましょう、とのこと。

~~~~coffeee:
for item of items
    console.log item
~~~~

ただ、コレだと配列のキーが列挙されてしまう。

~~~~coffeee:
for key,value in items
    console.log value
~~~~

これで値の方だけが列挙できる。

###値を受け取る
　coffeeだとfor文は式なので、値を受け取れる。

~~~~coffeee:
clousure() for key, clousure in clousures
~~~~

これでクロージャ配列を実行可能。

　配列内包表記とか言うらしい。よくわからんのだけれども、

~~~~coffee:
ary = (i * i for i in [0...10])
ary = i * i for i in [0...10]
~~~~

　上の`ary`は二乗の配列になるけど、下のaryは100になる。謎。

## 関数/オブジェクト
###関数の宣言

~~~~coffeee:
hello = ->
    console.log("Hello World!")

square = (x) -> x * x
~~~~

関数定義に`=>`を使うとthisをコードの記述箇所に束縛出来るらしい。そんなのに慣れたら生でJS書けなくなりそう

　デフォルト引数も簡単に書ける。

~~~coffee:
greet= (name,message = "hello") ->
  "#{message}, #{name}..."
~~~~

　可変長引数もサポート済み。最後の配列にまとめて入る。

~~~coffee:
status = (status, errors...) ->
    console.log status, errors
~~~~

可変長引数関数は柔軟にコールでき、例えば上記の`status`なら引数一つでもコール可能。その場合、`errors`は空の配列になる。

### 関数の実行
　`()`の省略が出来るのは引数がある場合のみ。`()`取ったりすると場合によっては可読性が著しく損なわれる可能性があるので多用は禁物、かも。メソドチェインの時は使えないっぽい。

~~~~coffeee:
console.log("Hello World")
console.log "Hello World"
~~~~

　配列をまとめてだーっと引数に流しこむみたいなことも可能。

~~~~
num = [1...10]
console.log num... #console.log(1,2,3,4,5,6,7,8,9)
~~~~

###オブジェクト定義
　`,`が要らないのは配列同様。YAMLっぽい書き方も出来る。

~~~coffee:
member = 
  John:
    sex: "male"
    age: 24
  Bob:
    sex: "male"
    age: 25
~~~~


##よくあるパターンを幾つか
　jqueryパターン

~~~~coffeee:
$( ->
  $("#submit").click -> console.log "kimura"
)
~~~~


　即時関数。doとかいうのが使えるらしい。

~~~~coffee:
do -> console.log("Hello Woooorld!")
~~~~
Emacs24.3.50 では split-window ではなく split-window-vertically を使いましょう。

OSXで Emacsを24.3 -> 24.3.50にアップデートしたら `split-window` がないと怒られたので `split-window-vertically` に書き換えました。

あまりにも短いので Window まわりの自分の設定を晒しておきます。

```el:~/.emacs.d/inits/00-keybind.elの一部
              ;; Window
              (global-set-key [M-left] 'shrink-window-horizontally) ;C+← 横のWindowを狭める
              (global-set-key [M-right] 'enlarge-window-horizontally) ;C+→ 横のWindowを広げる
              (global-set-key [(control ?0)] 'delete-window)
              (global-set-key [(control ?1)] 'delete-other-windows)
              (global-set-key [(control ?2)] 'split-window-vertically)
              (global-set-key [(control ?3)] 'split-window-horizontally)
              (global-set-key "\C-o" 'other-window)
	      (global-set-key [(ctrl shift o)] (lambda () (interactive) (other-window -1)))
```

```el:~/.emacs.d/inits/00-window.el
(require 'windmove)
(global-set-key [M-up] 
                (lambda() (interactive)
                       (call-interactively
                        (if (windmove-find-other-window 'up)
                            'enlarge-window
                          'shrink-window))))

(global-set-key [M-down] 
                (lambda() (interactive)
                       (call-interactively
                        (if (not (windmove-find-other-window 'up))
                            'enlarge-window
                          'shrink-window))))
```

どのファイルにどこの設定を置くのかがまだうまく行ってないけど、少なくとも`.emacs`に全部書いてた時に比べるとはるかに幸せです。