OmniAICreator/Qiita-1.07M huggingface dataset:
Localizable.stringsをCSVに吐き出す適当なRuby的ななにか


iOSアプリを開発していて、Localizable.stringsを翻訳するのってとてもめんどくさくないですか？

特に、ディレクター・エンジニアのチームで、ディレクターが翻訳をする場合、すぐに「エクセルで！」とか言ってくるので、めんどくせーなーと思ったりしながらやりますよね？


そこで、最近学びたてのRubyで勉強がてらちょっとしたスクリプトを書いてみました。（のでほんとにテキトーです。だれか書きなおして下さい）

ほんとにやってることは簡単で、Localizable.stringsの一行目がダブルクォーテーションがあるものを、適当に切ってCSVに書き出しているだけ。

動かしてみたところなんとなく動いてるっぽい。

運用としては、

1. 日本語のLocalizable.stringsファイルを作る
2. CSVで吐き出す
3. 翻訳する
4. エクセルで、他の言語のLocalizable.stringを作る
5. エクセルからコピペ！

コピペ！ですが、まぁコレぐらいなら楽かな。これで抜け漏れなくなるかなぁと思います。

まぁ、ただこれどこの文言？みたいになりそうですがね！

> "ここをしっかり書いておく" = "文言"

のここをしっかり書いておくを頑張ればなんとかなるのではないでしょうか？

というか、他に方法ないのかなぁ。。。と思ったり。


```ruby:
require "csv"
require "nkf"

# please set defaults language folder
localizedFolderName = "ja.lproj"
s = ""
File::open(localizedFolderName + "/Localizable.strings" ,"rb:UTF-16LE") do |f|
	s = f.read
end
s = s.encode("UTF-8")
CSV.open("localizable.txt","w") do |csv|
	csv << ["key","ja","en","for system",'=""""&$A1&""""&"="&""""&B1&""";"']
	keyAry = []
	s.each_line do |line|
		if /^"/ =~ line
			lineAry = line.split(/\"/)
			splitFlag = 0
			keysStr = ""
			wordsStr= ""
			lineAry.each do |word|
				if splitFlag == 0 
					if /=/ =~ word
						splitFlag = 1
					else
						keysStr += word
					end
				else
					if /;/ =~ word
						break
					end
					wordsStr += word
				end
			end
			cell = []
			cell << keysStr
			cell << wordsStr
			csv << cell
		end 
	end
end	
```
Xamarin Studio の各部名称覚え書き


正式名称が不明だったが、Evolve2013 の Video で紹介されてたのでそこだけキャプチャしてみた

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

左サイドバー、**Solution Pad** って言うんだね。

動画はこちら

* [”Getting the Most from Xamarin Studio” / Evolve 2013 Conference – Xamarin](http://xamarin.com/evolve/2013#session-9v0ezipgkx)

あ、スライドもあった(汗

* [Getting the Most from Xamarin Studio - Michael Hutchinson by @xamarinhq on @slideshare](http://www.slideshare.net/Xamarin/getting-the-most-from-xamarin-studio-michael-hutchinson)
FuelPHP で oil g admin ... した時に生成される _form.php を加工してエラー表示をしやすくする(手抜き)

FuelPHP で oil g admin ... した時に生成される _form.php は少し残念。

もうちょっと加工しておくことで、エラー表示様にフォームを直す手間をだいぶ軽減出来そうな気がするので、ちょっと加工してみた。

## やりたいこと

oil g admin ... した時点で、これらを実現しておくことでエラーを少し分かりやすくしておく。(手抜き)

- Formタグは基本 class='form-horizontal' にしたい

- clearfix 要らない

- 代わりに control-group, control-label, controls を追加したい

- 該当のフィールドがエラーならば &lt;div class="control-group error"&gt;&lt;/div&gt; にしたい

- 該当のフィールドがエラーならば、入力フィールドの下にエラー内容を表示したい

- submit の部分の class は actions じゃなくて、 form-actions 。

## PKGPATH/oil/views/admin/orm/views/actions/_form.php を編集する

対象となるテンプレートのファイルを編集する。

```PKGPATH/oil/views/admin/orm/views/actions/_form.php
<?php echo '<?php echo Form::open(array("class"=>"form-horizontal")); ?>' ?>

<?php echo '<?php $errors = Session::get_flash(\'error\'); ?>' ?>


	<fieldset>
<?php foreach ($fields as $field): ?>
		<div class="control-group<?php echo '<?php echo (isset($errors[\'' . $field['name'] . '\'])) ? \' error\' : \'\'; ?>' ?>">
			<?php echo "<?php echo Form::label('". \Inflector::humanize($field['name']) ."', '{$field['name']}', array('class' => 'control-label')); ?>\n"; ?>

			<div class="controls">
<?php switch($field['type']):

				case 'text':
					echo "\t\t\t\t<?php echo Form::textarea('{$field['name']}', Input::post('{$field['name']}', isset(\${$singular_name}) ? \${$singular_name}->{$field['name']} : ''), array('class' => 'span8', 'rows' => 8)); ?>\n";
				break;

				default:
					echo "\t\t\t\t<?php echo Form::input('{$field['name']}', Input::post('{$field['name']}', isset(\${$singular_name}) ? \${$singular_name}->{$field['name']} : ''), array('class' => 'span4')); ?>\n";

endswitch; ?>

                <?php echo '<?php if (isset($errors[\'' . $field['name'] . '\'])): ?>'; ?>

                <p class="help-block"><?php echo '<?php echo $errors[\'' . $field['name'] . '\']; ?>'; ?></p>
                <?php echo '<?php endif; ?>'; ?>

			</div>
		</div>
<?php endforeach; ?>
		<div class="form-actions">
			<?php echo '<?php'; ?> echo Form::submit('submit', 'Save', array('class' => 'btn btn-primary')); <?php echo '?>'; ?>


		</div>
	</fieldset>
<?php echo '<?php'; ?> echo Form::close(); <?php echo '?>'; ?>

```

実現したいことを盛り込んでみたのが、これ。


PKGPATH/oil/views/admin/orm/views/actions/_form.php は admin 用。

admin 用以外も修正して手抜きする時は PKGPATH/oil/views/scaffolding/orm/views/actions/_form.php とかを修正したらいいと思う。
おれおれはてブ？

PHPの勉強中です。

```php
<ul>
<li><a href="index.php">総合</a></li>
<li><a href="?cat=social">世の中</a></li>
<li><a href="?cat=economics">政治と経済</a></li>
<li><a href="?cat=life">暮らし</a></li>
<li><a href="?cat=knowledge">学び</a></li>
<li><a href="?cat=it">テクノロジ｜</a></li>>
<li><a href="?cat=entertainment">エンタメ</a></li>
<li><a href="?cat=game">アニメとゲ｜ム</a></li>
<li><a href="?cat=fun">おもしろ</a></li>
</ul>

<table>
<?php
function h($str){
    if(is_array($str)){
        return array_map( "h",$str );
    }else{
        return htmlspecialchars($str,ENT_QUOTES);
    }
}

if (!isset($_GET['cat'])){
$_GET['cat'] = "undefine";
} 

$cat = $_GET['cat'];

if ($cat=='social') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/social?sort=hot&threshold=&mode=rss");
	} elseif ($cat=='economics') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/economics?sort=hot&threshold=&mode=rss");
	} elseif ($cat=='life') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/life?sort=hot&threshold=&mode=rss");
	} elseif ($cat=='knowledge') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/knowledge?sort=hot&threshold=&mode=rss");
	} elseif ($cat=='it') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/it?sort=hot&threshold=&mode=rss");
	} elseif ($cat=='entertainment') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/entertainment?sort=hot&threshold=&mode=rss");
	} elseif ($cat=='game') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/game?sort=hot&threshold=&mode=rss");
	} elseif ($cat=='fun') {
	$rss = simplexml_load_file("http://b.hatena.ne.jp/entrylist/fun?sort=hot&threshold=&mode=rss");
	} else {
	$rss = simplexml_load_file("http://feedproxy.google.com/hatena/b/hotentry");
	}

$i = 0;
foreach ($rss->item as $item) {
    if( $i++ == 30 ) { break; }
    $dc = $item->children('http://purl.org/dc/elements/1.1/');
    $link = $item->link;
    $title = $item->title;
    $sub = $dc->subject;
    $date = date('Y.m.d', strtotime($dc->date));
    $desc =$item->description;
    
    if ($sub=='世の中') {
	$style = 'social';
	$cat = 'cat01';
	} elseif ($sub=='政治と経済') {
	$style = 'economics';
	$cat = 'cat02';
	} elseif ($sub=='暮らし') {
	$style = 'life';
	$cat = 'cat03';
	} elseif ($sub=='学び') {
	$style = 'knowledge';
	$cat = 'cat04';
	} elseif ($sub=='テクノロジー') {
	$style = 'it';
	$cat = 'cat05';
	} elseif ($sub=='エンタメ') {
	$style = 'entertainment';
	$cat = 'cat06';
	} elseif ($sub=='アニメとゲーム') {
	$style = 'game';
	$cat = 'cat07';
	} elseif ($sub=='おもしろ') {
	$style = 'fun';
	$cat = 'cat08';
	} else {
	$style = 'none';
	}
	echo '<tr class="clickbox_b">';
    echo '<td><span class="' . h($style) . '"><a href="' . h($link) . '" target="_blank">' . h($title) . '</a></span></td>';
	echo "\n";
    echo '<td style="width: 100px;text-align: right;"><span class="' . h($cat) . '">'.$sub.'</span></td>';
	echo '</tr>';
	echo "\n";

}
?>

</table>
```
アンダーバーを含むユーザ名でツイート検索

https://groups.google.com/forum/?fromgroups=#!topic/twitter-development-talk-ja/OfgzfaY8DEg

＞そのユーザー宛、ユーザー元のツイートを検索するためには from: や to: オペレータを使ってみてください。
FuelPHP 1.6 で Ormauth 使って oil generate admin... でログインでコケる問題に oil 側を加工して対処する

FuelPHP 1.6 で Ormauth 使って oil generate admin... でログインでコケる問題に oil 側を加工して対処してみる。

以前に「
FuelPHP 1.6 で OrmAuth 使って oil generate admin... でログインでコケる問題に暫定対処する」http://qiita.com/items/6a39ee7524e679c6152aを書いた。

ちょっと直せばいい話なので、 oil 側を修正するほどでも無いけど…

## oil g admin hoge name:string --useormauth すると、自動的に Ormauth 用のコントローラーが使用されるようにする

「--useormauth」オプションを勝手に増やしてみる。

本当は良くないかも。

### PKGPATH/oil/classes/generate/admin.php 

45行目、50行目辺りを以下のように修正する。

```PKGPATH/oil/classes/generate/admin.php
<?php
// (略)
		$default_files = array(
			array(
				'source' => (\Cli::option('useormauth')) ? $subfolder.'/controllers/ormauthbase.php' : $subfolder.'/controllers/base.php',
				'location' => 'classes/controller/base.php',
				'type' => 'controller',
			),
			array(
				'source' => (\Cli::option('useormauth')) ? $subfolder.'/controllers/ormauthadmin.php' : $subfolder.'/controllers/admin.php',
				'location' => 'classes/controller/admin.php',
				'type' => 'controller',
			),
```

### 該当するテンプレートファイルを用意

PKGPATH/oil/classes/generate/admin.php で指定している通り、必要な以下の2ファイルを用意する

```PKGPATH/oil/views/admin/orm/controllers/ormauthadmin.php
<?php
// (略)
				if ( ! Auth::member(6))
// (略)
					$current_user = Auth\Model\Auth_User::find_by_username(Auth::get_screen_name());
```

15行目で、管理者のグループ(のIndex)を正しく指定(6は oil r migrate --packages=auth すると自動的に作られるテーブルから)。

50行目で、 Model_User の代わりに Auth\Model\Auth_User を使用するように修正。

```PKGPATH/oil/views/admin/orm/controllers/base.php
<?php
// (略)
		$this->current_user = Auth::check() ? Auth\Model\Auth_User::find_by_username(Auth::get_screen_name()) : null;
```

10行目で、 Model_User の代わりに Auth\Model\Auth_User を使用するように修正。

これで

```
oil g admin hoge name:string --useormauth 
```

すると、Ormauth用のコントローラーが自動生成されているはず。
JBoss AS 5.1.0.GAのtwiddleによるdeploy, undeploy覚書

# twiddleによるdeploy, undeploy

# 環境
* JBoss AS 5.1.0.GA

# 手順
## deploy

```bash
./twiddle.sh -s localhost:1099 -u admin -p admin invoke "jboss.system:service=MainDeployer" deploy "file:///tmp/jenkins.war"
```

## undeploy

```bash
./twiddle.sh -s localhost:1099 -u admin -p admin invoke "jboss.system:service=MainDeployer" undeploy "file:///tmp/jenkins.war"
```

## jmx-consoleのユーザ設定場所

```bash
 less ../server/プロファイル/deploy/management/console-mgr.sar/web-console.war/WEB-INF/classes/web-console-users.properties
 ```

起動中の変更もあり。
resque-lockでバックグラウンドジョブのロック制御

非同期でバックグラウンドジョブを処理するResqueで、
Jobのロック制御を行うプラグイン、resque-lockをrailsで使う

resque-lock
https://github.com/defunkt/resque-lock

```ruby:Gemfile
gem "resque-lock", "~> 1.1.0", :require => 'resque/plugins/lock'
```

Jobは、Resque::Plugins::Lockを継承するだけで、
ロック制御を行うようになる

```ruby:app/models/lock_test_job.rb
class LockTestJob
  extend Resque::Plugins::Lock

  @queue = :default

  # 実行する処理
  def self.perform(seconds)
    puts "sleep #{seconds} seconds"
    sleep seconds
  end
end
```
デフォルトでは、以下のように、クラス名と文字列化したパラメータで、
ユニークなキーを作成している。

このlockメソッドをオーバーライドして、ロック制御のキーを変更できる

```ruby:lib/resque/plugins/lock.rb
def lock(*args)
  "lock:#{name}-#{args.to_s}"
end
```

```ruby:app/models/lock_test_job.rb
class LockTestJob
  extend Resque::Plugins::Lock

  @queue = :default

  # 引数にかかわらず同時に1つのjobだけ実行されるようにする　
  # 引数はperformと同じものが渡される
  def lock(seconds)
    "lock-test-job"
  end

  # 実行する処理
  def self.perform(seconds)
    puts "sleep #{seconds} seconds"
    sleep seconds
  end
end
```
controllerからは以下のようにキューにいれる

```ruby:app/controllers/b2b/resque_test_controller.rb
def resque_lock_test
  Resque.enqueue(LockTestJob, 60)
end
```
redisにキーが存在しており、そのキーのタイムアウト時刻にまだなっていない場合には、
lockプラグインのbefore_enqueメソッドでfalseが返り、enqueが実行されない
hoverで画像がでかくなるCSS

リンクの貼った画像にマウスを乗せると、画像がでかくなるCSS。

transitionの数字のところ（動きの時間(s:秒))と

transformのscale()(以下は1.05倍になる)の数値を調整するといい感じに。

あ、IEの9以下は…

```
a img {
-webkit-transition: all 0.5s ease; 
-moz-transition: all 0.5s ease; 
-o-transition: all 0.5s ease; 
-ms-transition: all 0.5s ease; 
transition: all 0.5s ease; 
}

a img:hover { 
-webkit-transform: scale(1.05);  
-moz-transform: scale(1.05); 
-o-transform: scale(1.05); 
-ms-transform: scale(1.05); 
transform: scale(1.05); 
}
```
C言語で、作成したファイルが断片化しないようにする方法。（Linux編）

creat()などで作成したファイルに、大きなデータを書き込むとファイルの断片化が起こるが、データを書き込む前に領域を確保しておけば、断片化が起こる可能性を減らすことが出来る。

```c:sample.c
#define _GNU_SOURCE

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <linux/falloc.h>

int main(void)
{
 int fd = creat("sample.dat", S_IRUSR | S_IWUSR);

 /* 領域を128MB確保する */
 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024 * 1024 * 128);

 /* ここにデータを書き込む処理を書く */

 return 0;
}
```

上記のコードを実行して作成したsample.datに対して、filefragコマンドを実行すると以下のように表示される。

```sh
$filefrag -v sample.dat 
Filesystem type is: ef53
File size of sample.dat is 0 (0 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  4435968           30720 unwritten,eof
   1   30720  4466688            2048 unwritten,eof
sample.dat: 1 extent found
```

ファイルサイズは0のままだが、連続した実領域が確保されているのが確認できる。

上記の通り、fallocate()はファイルサイズ（の値）を変更しないので、そこが気になる場合は代わりにposix_fallocate()を使用する。

```c:sample2.c
#define _GNU_SOURCE

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <linux/falloc.h>

int main(void)
{
 int fd = creat("sample2.dat", S_IRUSR | S_IWUSR);

 /* 領域を256MB確保する */
 posix_fallocate(fd, 0, 1024 * 1024 * 256);

 /* ここにデータを書き込む処理を書く */

 return 0;
}
```

上記のコードを実行して作成したファイルに対して、filefragコマンドを実行すると以下のようになる。

```sh
$filefrag -v sample2.dat 
Filesystem type is: ef53
File size of sample2.dat is 268435456 (65536 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  4548608           30720 unwritten
   1   30720  4579328           30720 unwritten
   2   61440  4610048            4096 unwritten,eof
sample2.dat: 1 extent found
```

File sizeが268435456になっている。

ちなみに、fallocate()は本来、ディスクスペースを確実に確保するための関数、つまり、

データをファイルに書き出そうとしたけど、空きが無くて失敗したよ＼(^o^)／

という状況を事前に防ぐ為の関数であって、断片化を防ぐためのものでは無い。連続領域が確保されるのはオマケみたいなもん。

他にも、fallocate()実行にかかるコストはほとんど無いとか、確保した領域は0で埋められている事が期待できるので、作成したファイルに対してゼロフィルする必要が無いとか、そういう利点もあったりする。

欠点は、使えるファイルシステムが限られる点。ext4やXFS、btrfsは対応しているが、今でもよく使われていると思われるext3は未対応。

あと、ext4は連続領域を確保する性能が低いので、fallocate()で128MBを超える領域を確保すると断片化しやすい。XFSはその辺は優秀で、1GBを超えても余裕で連続領域を確保できる。

WindowsではSetFilePointer()とSetEndOfFile()を使えば連続領域を確保出来るらしいので、誰かサンプルソース下さい。
JSONを使用したデータベース負荷分散の構築


## 経緯
レンタルサーバー（エックスサーバー）での稼働でスクリプトを設置したのですが、予算やらの都合で他のサーバースペースを借りれない状態になってしまいました。ついては、１台のサーバーでの負荷分散を余儀なくされる状態となりました。正確に言えば負荷分散というより、スクリプトの効率的書き方です。応用すれば複数サーバーを使用した負荷分散に応用できると思います。現状、スマホアプリ（WebView）及び、スマホブラウザ用ページ、PCページ（IE,FF,Webkit）のページを同一サーバー上に展開。

レスポンス的に負荷が少ないまとめ系サイトだったので、３媒体を追加。
現状余裕で稼働しています。想定ではあと７媒体ぐらいは載せても稼働できる帯域はある（エックスサーバーの場合）と思います。
単純な負荷分散ですが、実装すると理論上はSQLインジェクションを完全に無効化、また、DoS攻撃もある程度軽減できると考えられます。


## 実装
PHPでの実装になります（他言語でも可）。設置は単純でメインのMySQLをフロント側PHPから完全に隔離し、バック側のCRONで１時間に１回ぐらいのペースで必要最低限のデータをMySQLを実行生成し、JSONコードに変換、特定のディレクトリに吐き出す仕様としました。フロント側のPHPはMySQLにアクセスすることはできず、定期的に吐き出されたJSONコードをデータベースの代用として稼働させます。これによりいちいちSQLを実行する負荷を省き、バック側で整形、生成されたデータ（JSON）を元に出力処理をする形になります。


## メリット＆デメリット
メリット
・実装が簡単、単純なデータ構成で、それほどデータベースの更新がかからない場合には有効
・JSON形式なので多言語でのデータストアとしての接着剤的な扱いが可能で多言語を使う場合、非常に無駄がない
・rsyncなどを活用すれば別ドメインサーバーにJSONファイルごと転送することで負荷分散が可能

デメリット
・JSONPではないため、クライアント側のブラウザからJavaScriptのソースとして直接読みに行くことができない。
（今回の施策ではJSONPを使う機会がなかったのでやってません。手が空いてる人、誰か試してください...おねがいします...）
・即時反映されるようなシステムでは稼働しずらい。CGMやらは不向き。ニュースサイトやまとめサイトなどあまり更新がかからないサイトが有用


## コード

```js+php:batch.php


$sql = sprintf("SELECT * FROM table WHERE start_time <= '%s' AND fin_time >= '%s'",
        mysql_real_escape_string($date),
        mysql_real_escape_string($date));
$result = mysql_query($sql);

$newest_result = array();
while($result_row = mysql_fetch_object($result)) {
	$newest_result[] = array(
		'title'=> $result_row->title
		,'link'=> $result_row->link
		,'dc'=> $result_row->dc
		,'site'=> $result_row->site
	);
}

for($cnt=0;$cnt<30;$cnt++){
	$newest_output_30[$cnt] = $newest_result[$cnt];
}

// 中略

$file = fopen('../RSSReader/json/newest_output_30.json', 'wb') or die ('$newest_output_30 書き込みエラー');
flock($file, LOCK_EX);
fwrite($file, json_encode($newest_output_30));
fclose($file);

// 中略


```


試しに上記のようにします。ミソはJSONファイルをできれば小サイズになるよう（できれば１ページ分だけの情報量）などに分割することでディスクI/Oを効率化し処理のレスポンスを早くします。

json_encode がかかっているのでマルチバイトだろうと関係なく文字化けも心配ないです（自分のとこでは）。
JSONを吐き出すディレクトリのパーミッションとバッチのスクリプトディレクトリのパーミッションをあれこれしてディレクトリトラバーサルに気をつければそれほど問題はないかと思います。JSONに出力したらPHP以外の言語でも利用できるので便利（ためしたことないが）。


```js+php:reader.php

$file = './json/newest_output_30.json';
$json = file_get_contents($file);
$obj = json_decode($json, true);

foreach($obj as $key => $value){
	$smarty->append( 'title', $value[title]);
	$smarty->append( 'link', $value[link]);
	$smarty->append( 'dc', $value[dc]);
	$smarty->append( 'site', $value[site]);
}

```


あとはこれをフロント側のPHPなどの言語で利用すれば終わりです。上記ではSmartyにデータ渡しています。
JSON読み込む前は当然ですが json_decode してください。


# まとめ
JSONは多数の言語で使われているデータフォーマットのためそれを核としたらいろいろできるんじゃねという安直な考えのもとやってみました。JSONPは後からしり、悶絶させられてしまいましたがサーバー間の処理で使う分には問題ないと思います。SQLiteよりも単純で読み取りだけならJSONのほうが扱いやすいためいいと思います。
Google Maps SDK for iOSでマーカーを配置する

導入とか基本的なオプションは以下を参考にしてください

[Google Maps SDK for iOSの導入手順](http://qiita.com/items/bfb5ef3e45682c2bb763)

[Google Maps SDK for iOSの使い方](http://qiita.com/items/adc2dd19015586bda39b)

で、↑の参考だとマーカーの設置に、GMSMarkerOptionsを使うように書いてありますが、1.2.0以降だと、GMSMarkerOptionsが無くなっていて、代わりにGMSMarkerを使うようになっているようです???

[goolgeの説明](https://developers.google.com/maps/documentation/ios/releases#version_120_-_april_2013)

```objc
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.title = @"London";
london.icon = [UIImage imageNamed:@"house"];
london.map = mapView_;
```

サンプル的なものをおいてみました。
[GoogleMapSample](https://github.com/myaaaaa-chan/GoogleMapSample)

まちがってたらごめんなさい
Windows unity4.1.2f1でscriptfile(C#)で書いた日本語が文字化け、Western(ISO-8859-15)で保存しなおして解決

http://nearlyneetblog.blog27.fc2.com/blog-entry-92.html
Windows unity4.1.2f1でも同様な現象が起こってこの方法

scriptfile(C#)で書いた日本語が文字化けをWestern(ISO-8859-15)で保存しなおして

GUI.Label (new Rect (10, 130, 100, 30), "日本語:");

の文字化けが解決できた。

Unity4からはダイナミックフォントの場合は
なんか日本語埋め込んだりしなきゃいけないのはこっち。
テラシュールウェア[Unity3D]Unity4のダイナミック
（or システム）フォントを使う
http://terasur.blog.fc2.com/blog-entry-376.html

◇Unityでゲーム開発 -日本語フォントを使う-
http://yun.cup.com/unity021.html

システムフォントはnoneていうフォントに設定しておけばいいみたい。
システムフォントなのでデバイスによってははみ出すとかゆう問題が。。ある
MacOSXでcmakeのコマンドライン版を使えるようにする

本来は

sudo "/Applications/CMake X.X-X.app/Contents/MacOS/Cmake X.X-X"
（Xはバージョン番号）

と管理者権限でcmake GUI版を立ち上げ、メニューのtools->Install for Command Line Useを選択するだけでターミナルからcmakeできるようになる。

が、2.8時代にこれが失敗してしまうことがあった。（今はどうか知らない）
“Install for Command Line Use”はlnコマンドでCMakeパッケージ内の各コマンドを/usr/bin以下にシンボルリンクを張っているだけなので、自力でやってしまえばいい。

sudo ln -s "/Applications/CMake X.X-X.app/Contents/bin/ccmake" /usr/bin/ccmake
sudo ln -s "/Applications/CMake X.X-X.app/Contents/bin/cmake" /usr/bin/cmake
sudo ln -s "/Applications/CMake X.X-X.app/Contents/bin/cmake-gui" /usr/bin/cmake-gui
sudo ln -s "/Applications/CMake X.X-X.app/Contents/bin/cmakexbuild" /usr/bin/cmakexbuild
sudo ln -s "/Applications/CMake X.X-X.app/Contents/bin/cpack" /usr/bin/cpack
sudo ln -s "/Applications/CMake X.X-X.app/Contents/bin/ctest" /usr/bin/ctest
MongoDBコンソールで定義しておくと便利な関数


```javascript
ObjectId.prototype.toDate = function () { return new Date(parseInt(this.valueOf().slice(0, 8), 16) * 1000); };

Date.prototype.toObjectId = function () { return ObjectId(Math.floor(this/1000).toString(16) + '0000000000000000'); };
```
FuelPHPでユーザーエージェント判定すると、iPadはmobiledeviceになっちゃうよ問題

FuelPHPでユーザーエージェント判定する時、Agent::is_mobiledevice()使います。便利ですね。しかしながら、こいつ、iPadでアクセスするとtrue吐くんです。

なので、iPad用には、別の判定式持った方がいいよ、って話。以下、実装例。

```php:agent.php
public static function is_pad()
{
    return preg_match('/'.implode('|', array('iPad')).'/i', static::$user_agent) ? true : false;
}
```

これで、Agent::is_pad()叩くと、iPadの場合true吐きますので、is_mobiledevice()の結果を上書きしてやればいいんじゃないかと思います。一応、「is_pad」としている通り、配列`array('iPad')`に適当なやつ追加すればそれも対象に含めてくれることと思います。
X-Robots-Tag

メモ

## 概要

Httpヘッダー上で、GoogleBot等に noindex, nofollow等の指示を与える方法

https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag?hl=ja

## 使い方

pdfやxlsなどをindexさせないように使う例などがある。

```apache
<Files ~ "\.pdf$">
Header set X-Robots-Tag "noindex"
</Files>
```

参考: http://www.suzukikenichi.com/blog/how-to-use-x-robots-tag/

## 雑記

ちなみに Qiita でURL貼るとリンク(当たり前だけど)になるが、nofollow属性をつけたほうがよさそうな気がする

```
nofollow の使用に関する Google のポリシーと具体例

次のような場合は、nofollow を使用することをおすすめします:

信頼できないコンテンツ: サイトのリンク先のページのコンテンツを保証できない、あるいは保証したくない場合（リンク先が信頼性のないユーザー コメントやゲストブック エントリの場合など）は、このようなリンクを除外します。これにより、サイトが不正行為者のターゲットになることを阻止でき、不正なウェブサイトの PageRank に貢献しないようにできます。特に、コメント スパムでは、特定のコンテンツ管理システムやブログ サービスで信頼できないリンクが追跡されていないことがわかると、それらを攻撃の対象から除外することが考えられます。信頼のおける投稿者を尊重したいのであれば、長期にわたって質の高い投稿を続けているメンバーやユーザーが投稿したリンクから nofollow 属性を自動または手動で削除することもできます。
```

抜粋: http://support.google.com/webmasters/bin/answer.py?hl=ja&answer=96569
YARD,RDoc 比較

* YARD - A Ruby Documentation Tool
 * http://yardoc.org/
* Rails/Rubyドキュメントをキレイに生成するYARD、早見表付き！ - 酒と泪とRubyとRailsと
 * http://morizyun.github.io/blog/yard-rails-ruby-gem-document-html/
* RDoc- Document Generator for Ruby Source
 * http://rdoc.sourceforge.net/
* library rdoc
 * http://doc.ruby-lang.org/ja/1.9.2/library/rdoc.html
* RDocの基本的な書き方メモ - maeshimaの日記
 * http://maeshima.hateblo.jp/entry/20100725/1280055512

---

# RDocおさらい
* Rubyのソースコードから(HTML)ドキュメント生成を行うツール
 * ソースコードを解析し、クラス、モジュール、メソッドの定義を抜き出す
 * それとその直前に書かれたコメントを併合しドキュメントを生成する
* 現在はRubyの標準ライブラリ

## コマンド

> $ rdoc [options]  [names...]

 * カレントディレクトリいかにある全てのRuby,Cのソースからドキュメント生成

> $ rdoc

 * わからない場合はとりあえずhelp

> $ rdoc --help

## 書き方
* コメント部は'#'では始まるもの、=begin/=end両方使える
 * =begin/=endの場合は、 rdocタグをつける必要あり

> =begin rdoc
> hogehoge
> =end

### 見出し

> \#=
> \#==
> \#===

### コメント

> \#--
> \# RDoc的なコメント
> \#++

### リスト
* - / * で番号なしリスト
* 1. で番号付リスト
* a. でアルファベットリスト
* [ラベル]テキスト / ラベル::テキスト でラベル付きリスト

### その他
* \*テキスト\* 太字(日本語、スペースは不可)
* \_テキスト\_ 斜体(〃)
* \+テキスト\+ 等角フォント(〃)
* \<b>テキスト\</b>(日本語など可)
* \<em>テキスト\</em>(〃)
* \<tt>テキスト\</tt>(〃)

# YARD
> YARD is a documentation generation tool for the Ruby programming language. It enables the user to generate consistent, usable documentation that can be? exported to a number of formats very easily, and also supports extending for custom Ruby constructs such as custom class level definitions. Above is a highlight of the some of YARD's notable features.
>
> YARDは、Rubyプログラミング言語のドキュメント生成ツールです。これは、ユーザーがすることができ、一貫性のある使用可能なドキュメントを生成することができます？非常に簡単にフォーマットの数に輸出され、また、カスタムRubyはこのようなカスタム·クラス·レベルの定義として構築するための拡張をサポートしています。上記のYARDの注目すべき機能のいくつかのハイライトです。
 
## 利用方法
* gemからインストール

> $ gem install yard

## コマンド
* カレントディレクトリにある*.rbファイルについてドキュメント作成

> $ yardoc *.rb

* 分からない場合はやはりヘルプ

> $ yard --help
> $ yardoc --help

## 書き方
* 特別なmarkupはない
* @～ というタグで、パラメータ/返り値/サンプルコード などを記述できる

### タグ
http://rubydoc.info/docs/yard/file/docs/Tags.md#Tag_List

* ただし書かれている内容にはしばしば誤りがあるので注意
 * 例： @paramsの構文は "@params [型] 名前 説明"が正しいが、型と名前が逆に書かれている

* よく使いそうなタグ
 * @param [引数のクラス] 引数名 引数の説明
 * @return [戻り値のクラス] 戻り値の説明
 * @option ハッシュ引数の名前 [値のクラス] キー名 説明
 * @example _タイトル(任意)_ \\n コードブロック

## 便利そうな機能

> $ yard diff new old

* オブジェクトの追加/削除を知ることができる

# 比較
* http://rubydoc.info/docs/yard/file/docs/GettingStarted.md#Documenting_Code_with_YARD

## RDoc

```ruby:rdoc_sample.rb
class MyClass
  # Converts the object into textual markup given a specific `format`
  # (defaults to `:html`)
  #
  # == Parameters:
  # format::
  #   A Symbol declaring the format to convert the object to. This
  #   can be `:text` or `:html`.
  #
  # == Returns:
  # A string representing the object in a specified
  # format.
  #
  def to_format(format = :html)
    # format the object
  end
end
```

## YARD

```ruby:yard_sample.rb
class MyClass
  # Converts the object into textual markup given a specific format.
  #
  # @param [Symbol] format the format type, `:text` or `:html`
  # @return [String] the object converted into the expected format.
  def to_format(format = :html)
     # format the object
  end
end
```
WebView#addJavascriptInterface 使ってて "Error calling method on NPObject."

HTML側から呼ばれたメソッド内で、Activity#runOnUIThread内で行うべき処理を直に書いちゃってたりすると上記のエラーが出る場合があるみたい。OS4.x系で確認。

・・・というのを http://stackoverflow.com/questions/3344256/error-calling-method-on-npobject-in-android-2-2 にも書いておきたいんだけど英語が思いつかない。
S2JDBCの拡張方法

s2jdbc.diconでdialectを指定することで
DBの方言に合わせた処理をしてくれる
[Seasar2 - S2JDBC - セットアップ](http://s2container.seasar.org/2.4/ja/s2jdbc_setup.html "Seasar2 - S2JDBC - セットアップ")

独自拡張をしたい場合や
S2JDBCでサポートされていないDB(standardDialectで対応できないもの)を使用する場合は
DbmsDialectインターフェースを実装したクラスを作成し、dialectを例のように設定する
 [参考URL](http://s2container.seasar.org/2.4/ja/s2jdbc_entity.html#時制定義 "参考URL") (「注意点」の部分)

```CustomDialect.java
package sample.dialect;

import org.seasar.extension.jdbc.dialect.StandardDialect;

public class CustomDialect extends StandardDialect {
	// 拡張処理
}
```

```s2jdbc.diconのdialect部
		<property name="dialect">
			<component class="sample.dialect.CustomDialect" />
		</property>
```

プロパティを設定する場合は

```CustomDialect.java
package sample.dialect;

import org.seasar.extension.jdbc.dialect.StandardDialect;

public class CustomDialect extends StandardDialect {
	public void setSampleProp(String sampleProp) {
		// プロパティ値を受け取る処理
	}
	// 拡張処理
}
```

```s2jdbc.diconのdialect部
		<property name="dialect">
			<component class="sample.dialect.CustomDialect">
				<property name="sampleProp">"sampleValue"</property>
			</component>
		</property>
```

- - -

拡張例

[S2JDBCで日時型にJoda-Timeを使用する](http://qiita.com/items/083fcae539f7887884b5)
Magpie RSS - PHP RSS Parser によるRSSデータのパース処理

# Magpie RSS - PHP RSS Parser によるRSSデータのパース処理
<a href="http://magpierss.sourceforge.net/">magpierss.sourceforge.net</a>

## 初期設定
ライブラリを落としてきて修正します。初期では日本語文字コードに対応していないため、修正をかけます。今回は、magpierss-0.72 で確認しました。

修正箇所は、rss_fetch.inc の357行目、

```js+php:rss_fetch.inc

    if ( !defined('MAGPIE_OUTPUT_ENCODING') ) {
        define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
    }

```

もしくは、読み込み時に変更します。


```js+php:magpierss

require_once('./magpierss-0.72/rss_fetch.inc');
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); 
```

## 日付処理


```js+php:code


$loop = fetch_rss($url);
foreach($loop->items as $itemValue){

	$title = $itemValue['title'];
	$link = $itemValue['link'];

	if($loop->feed_type == 'Atom'){
		$dc = Date("Y/m/d H:i:s", strtotime($itemValue['updated']));
	} else if($loop->feed_type == 'RSS'){
		if($loop->feed_version == '2.0'){
			$dc = Date("Y/m/d H:i:s", strtotime($itemValue['pubdate']));
		} else if($loop->feed_version == '1.0'){
			$dc = Date("Y/m/d H:i:s", strtotime($itemValue['dc']['date']));
		}
	}

}

```


取得できるデータはRSSの形式によりことなりますが、日付データの箇所だけは別個に指定する必要があります。Atom, RSS1.0, RSS2.0 で宣言がことなるためこの点だけ気をつければ問題ないと思います。
キータがキター(°∀°)に見えて困るためのJS


```javascript:qiita.js
var xpathResult = document.evaluate('descendant::text()[contains(., "キータ")]', document, null, 7, null);
for (var i = 0; i < xpathResult.snapshotLength; i++) {
  var node = xpathResult.snapshotItem(i);
  node.nodeValue = node.nodeValue.replace(/キータ/g, 'キター(°∀°)');
}
```
メモリダンプ

投稿練習に、メモリダンプ。
最近使うことが少なくなったけど。。。

```c:hex_dump.c
void hex_dmp(const void *buf, int size)
{
    int i,j;
    unsigned char *p = (unsigned char *)buf, tmp[20];

    printf("+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F|  -- ASCII --\r\n");
    printf("--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+----------------\r\n");
    for (i=0; p-(unsigned char *)buf<size; i++) {
        for (j=0; j<16; j++) {
            tmp[j] = (unsigned char)((*p<0x20||*p>=0x7f)? '.': *p);
            printf("%02X ", (int)*p);
            if (++p-(unsigned char *)buf>=size) {
                tmp[++j] = '\0';
                for (;j<16;j++) {
                    printf("   ");
                }
                break;
            }
        }
        tmp[16] = '\0';
        printf("%s\r\n", tmp);
        if (p-(unsigned char *)buf>=size) {
            break;
        }
    }
}
```
SSH接続を楽にする。（自分用まとめ）

## 1.~/.ssh/configを設定して、ssh exとかでSSH接続できるようにする。
### 設定例

<pre>
Host ex
  HostName      example.com
  user          ex_user
  IdentityFile  ~/.ssh/id_rsa.pub
</pre>

[参考URL](http://superbrothers.hatenablog.com/entry/20090730/1248971671)


## 2.秘密鍵を設定してパスワードなしログイン

ssh-keygen で公開鍵を作って、以下①か②の方法で公開鍵をリモート先に設定する。

### ①ssh-copy-idでお手軽設定※1
<pre>
ssh-copy-id -i ~/.ssh/id_rsa.pub ex_user@example.com
</pre>

### ②catをパイプでつないでsshで飛ばす。
<pre>
cat ~/.ssh/id_rsa.pub | ssh ex 'cat >>~/.ssh/authorized_keys'
</pre>

※1 参考URLにも書いてあるけどssh-copy-idが使えるのはFreeBSD系らしい。
でも今回自分でやったのはローカルUbuntu12.04でリモートがCentOS6.4だった。
Debian系もいける？

[参考URL](http://rksz.hateblo.jp/entry/2013/02/02_ssh_easy_login)

書いてみたけど、全部2つ目の参考URLに載ってた。
まぁ自分なりまとめってことでひとつ。
CentOS6.4でPython2.7.3でApacheでmod_wsgiでDjango

Pythonのインストール
Yumに影響与えないためaltinstallする

```
% yum -y groupinstall "Development Tools"
% yum -y install expat-devel db4-devel gdbm-devel sqlite-devel readline-devel 
zlib zlib-devel bzip2-devel openssl-devel ncurses-devel
% cd /usr/local/src
% wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
% tar xjf Python-2.7.3.tar.bz2
% cd Python-2.7.3
% ./configure --with-threads --enable-shared
% make
% make altinstall
% echo '/usr/local/lib' > /etc/ld.so.conf.d/python2.7.conf
% ldconfig
```

setuptoolsのインストール

```
% curl http://peak.telecommunity.com/dist/ez_setup.py | python2.7
```

pipのインストール

```
% curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python2.7
```

Apacheのインストール

```
% yum -y install httpd httpd-devel
% mkdir -p /var/log/httpd/www.example.com
% vi /etc/httpd/conf.d/www.example.com.conf
<VirtualHost *:80>
    ServerName www.example.com:80
    DocumentRoot /home/www/www.example.com/example
    CustomLog "/var/log/httpd/www.example.com/access_log" common
    ErrorLog  "/var/log/httpd/www.example.com/error_log"
    WSGIDaemonProcess example python-path=/home/www/www.example.com:/usr/local/lib/python2.7/site-packages
    WSGIProcessGroup example
    WSGIScriptAlias / /home/www/www.example.com/example/wsgi.py
    WSGIScriptReloading On
    <Directory /home/www/www.example.com/example>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
```

mod_wsgiのインストール

```
% cd /usr/local/src
% wget http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
% tar vzxf mod_wsgi-3.4.tar.gz
% cd mod_wsgi-3.4
% ./configure --with-python=/usr/local/bin/python2.7
% make
% make install
% vi /etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
```

Djangoのインストール

```
% pip-2.7 install django
```


Djangoプロジェクト作成

```
% useradd www
% su - www
% django-admin.py startproject example
% mv example www.example.com
```

とりあえずうごいた
Rails4.0.0.rc1 Gemfile


* [Ruby on Rails Guides](http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-3-2-to-rails-4-0-gemfile)

Gemfile

`group :assets`が無くなっている。。

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

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

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc1'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

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

# Use jquery as the JavaScript library
gem 'jquery-rails'

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

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

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

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

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

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]
```
sleep sort の解説

どこで笑っていいのか判らない人のために解説

```bash:sleepsort.bash
#!/bin/bash
function f() { #関数fの定義
    sleep "$1" #第1引数の数だけsleepする
    echo "$1" #sleepが終わったら標準出力にその引数を表示する
}
while [ -n "$1" ] #引数の数だけループ
do
    f "$1" & #関数fをバックグラウンドで実行(&) ※ここがキモ。ドンドン後ろに回す
    shift #引数をずらして"$1"に入れていく
done
wait #後ろに送ったジョブの終了を待つ
```
example usage

```bash
$ ./sleepsort.bash 5 3 6 3 6 3 1 4 7
```

引数に「5 3 6 3 6 3 1 4 7」と与えられたとき、「f "$1" &」によって8つのジョブが(ほぼ)同時に走り、1秒経った時点で「echo 1」3秒経った時点で「echo 3」がほぼ同時に3回実行され ... 7秒後に「echo 7」が実行されて完了します。このソートのすごい？ところは、実行に掛かる時間の中で支配的なのが大抵のソートアルゴリズムにおける「要素数」ではなく「要素の中の最大値」である部分です。なお、元ネタの掲示板では、すぐに10倍速まで最適化されました。
WordPress の odd/even post class

ちょっとコピペしようと検索したら、みんなグローバルスコープ使いすぎててアレだったのでメモ。

[これ](http://wordpress.org/support/topic/styling-odd-and-even-numbered-posts-differently)とか[これ](http://wpsnipp.com/index.php/css/alternate-odd-even-post-class/)とか。


```php
<?php
add_filter('post_class' , function ($classes) {
	static $flag = true;

	$flag = !$flag;
	$classes[] = ($flag ? 'even' : 'odd');

	return  $classes;
});
```

WPはコールバック関数が多いので、クロージャー使うと便利ですね。
配列に収めた関数を順に実行する

```javascript
var fnArray = [
	function(){ console.log('test') },
	function(){ console.log('hoge') },
	function(){ console.log('hello') },
	function(){ console.log('world') },
	function(){ console.log('aaa') },
	function(){ console.log('bbb') }
];

while(fnArray.length>0){
	 fnArray.shift()();
}
```
Kaminariにて複数のpaginationを同じ画面に混在させる方法


同じ画面上にpagination機能がある一覧を複数表示させたい場合がよくあります。
そんな時の実装方法です。

## 実装方法

paginationを表示するview中のpaginateメソッドに:param_nameオプションを付けます。
これによって、paginationに使用するパラメータのkeyを指定出来ます。

```
<%= paginate @vip_users, :param_name => 'vip_page' %>
<%= paginate @normal_users, :param_name => 'normal_page' %>
```

あとは、controller上でそれぞれのパラメータを使用するようにします。

```
@vip_users  = User.where(#条件#).page(params[:vip_page]).per(10)
@normal_users  = User.where(#条件#).page(params[:normal_page]).per(10)
```
homebrewでruby-buildのHEADに切り替えて、ruby 2.0.0-p195を入れてみた

ruby 2.0.0-p195がリリースされたので、早速入れてみた。

最初、

```
$ brew update
$ brew upgrade ruby-build
```

でバージョンアップできるかと思っていたが、どうやら2013/05/15 9:02現在まだ本家のformulaが上がっていないようだ。

そこで、以下のように最新版を入れるようにした所、githubからHEADをとってくれるようになった。

```
$ brew upgrade --HEAD ruby-build
```

後は、いつもどおり

```
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline`" rbenv install 2.0.0-p195
$ rbenv global 2.0.0-p195
```

ちゃんと動きました。

```
$ ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.3.0]
```

gemも入ります。

```
$ gem install pry
$ rbenv rehash
```

しかし、pryとかglobalに使うものを毎回入れなおすのは面倒だなー。
GitLabにおけるPull Requestのランク付け

GitLabでPull ReqeustがAcceptされる時、メインコミッターの"Dmitriy Zaporozhets"から一言コメントをもらうことが多いのですが、なんとなくランク付けがあるようなので紹介します。下に行くほど彼(?)からの評価が高いPull Requestとなります。

1. thanks / thank you(ありがとう)
2. nice / good(いいね)
3. great! / cool!(すばらしい)
4. awesome!(最高だね)

たまに、Acceptされてもコメントが付かないことがありますが、thanks以下のランクなのか、単なるコメントの付け忘れなのかは不明です。
私としては"great!"まではもらったことがありますが、"awesome!"はまだもらったことがないので、いつかはもらえるようになりたいです。
Mongodbインストール


## Homebrewでインストール
* `brew update`
* `brew install mongodb`

## ログイン時自動起動するように
* `cp /usr/local/Cellar/mongodb/2.4.3-x86_64/homebrew.mxcl.mongodb.plist ~/Library/LaunchAgents/`
* すぐ起動する
	* `launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist`


## ワーニングを対応
* 対応: `WARNING: soft rlimits too low. Number of files is 256, should be at least 1000`  
	* `echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf`
	* `sudo chmod 775 /etc/launchd.conf`
Google Code Jam Japan 2011 予選問題B

```fsharp:coffee.fs
type Coffee = {c:int64; t:int64; s:int64}

let sub {c=c;t=t;s=s} c' = {c=c-c';t=t;s=s}

let take s (xs:Coffee list) d c =
  let rec take (xs:Coffee list) (ys:Coffee list) c s =
    match ys with
    | []      -> (s, List.rev xs)
    | y'::ys' -> if y'.t<d then
                   take (y'::xs) ys' c s
                 elif y'.c < c then
                   take ((sub y' y'.c)::xs) ys' (c-y'.c) (s+y'.c*y'.s)
                 else
                   (s+c*y'.s, List.rev xs @ (sub y' c)::ys')
  take [] xs c s

let spans (cs:Coffee list) =
  let ts = List.map (fun c -> c.t) cs
  let ts' =
    0L::ts
    |> List.sortWith (fun x y -> compare y x)
    |> Seq.distinct
  Seq.zip ts' (Seq.skip 1 ts') |> Seq.map (fun (t,t') -> (t,t-t'))

let solve (cs:Coffee list) =
  let ts = spans cs
  let cs' = List.sortWith (fun c1 c2 -> compare c2.s c1.s) cs
  Seq.fold (fun (s,xs) (d,c) -> take s xs d c) (0L,cs') ts
  |> fst

let nk (s:string) =
  let nk = stdin.ReadLine().Split([|' '|])
  (int nk.[0], int64 nk.[1])

let cts (s:string) =
  let a = s.Split([|' '|])
  {c=int64 a.[0]; t=int64 a.[1]; s=int64 a.[2]}

let t = int (stdin.ReadLine())
for i in 1..t do
  let (n,k) = nk (stdin.ReadLine())
  let cs =
    seq { for i in 1..n -> cts (stdin.ReadLine()) } |> Seq.toList
  printfn "Case #%d: %d" i (solve cs)
```
JavaでAR.Droneを動かす


調べた限り、AR.Drone2.0にも対応しているライブラリではjavadroneが良さそう。New BSDライセンス。

https://code.google.com/p/javadrone/

Java用APIとAndroidでAR.Droneを動かすサンプルが入っている。

動かすためには以下のものをインストールして

* Apache Maven (http://maven.apache.org/)
 - EClips用プラグイン:m2eclipse (http://eclipse.org/m2e/)
* Android SDK (http://developer.android.com/sdk/index.html)
 - Eclipse用プラグイン:eclipse-adt (http://developer.android.com/tools/sdk/eclipse-adt.html)

後は、

```
mvn install
mvn eclipse:eclipse
```

をし、Eclipse用プロジェクトファイルを作成。
Eclipseで生成したProjectを開き、ControlTowerクラスを実行するとサンプルプログラムが動く。

この時、ビルド用に`M2_REPO=~/.m2/repository`とパスを設定する必要がある。

参考: https://code.google.com/p/javadrone/wiki/BuildInstructions

## OpenCVとともに使う

まずはOpenCVをインストールして、それをJava用にWrapしてくれているJavaCVを使う。

* OpenCV (http://opencv.willowgarage.com/wiki/)
* JavaCV (http://code.google.com/p/javacv/)

ちなみにJavaCVはOpenCVだけでなく、FFmpeg, libdc1394, PGR FlyCapture, OpenKinect, videoInput, ARToolKitPlusのラップもしてくれるので、これらを使いたい人は各ライブラリをインストールした状態であればJavaから使えるようになる。

### 参考:FaceDetectionして、顔を追わせるサンプル
http://projects.collide.info/projects/drone/repository/revisions/3/entry/javadrone2/src/main/java/info/collide/javadrone/facetracker/FollowFaceDemo.java

## 補足：何でJava?

まず、C++のSDKそのままは使うの苦労しすぎる。

SDKを少し使いやすくしたC++用ライブラリも複数あるのだが、Visual C++を前提にしていてMacでどうするよ？となったり、makeしてもインストール出来なく、ユーザーも少ないせいで簡単には解決法が見つからないということが起きる。

ちょっと飛ばすだけなら、Processing(ARDroneForP5)が簡単だが、ProcessingはOpenCVのラッパが基本的な部分だけしかラップされてないのでOpenCV連携がきつい。

Python(python-ardrone)もホントに飛ばすことしか出来ない。しかも依存しているライブラリが結構古く、pipなどで入らなくてめんどくさい。

などなど色々試しているうちにJavaに落ち着いた。特に、複数人で開発するなら、皆がある程度の労力で動かせるところまで持ってけるっていうのはとても大切だと思う。
第10回オフラインリアルタイムどう書く。groovy による実装例。


先日行われたオフラインリアルタイムどう書く

* イベント : http://atnd.org/events/38678
* 問題 : http://nabetani.sakura.ne.jp/hena/ord10haniwa/
* 解答リンク集 : http://qiita.com/items/55641767510c2f9f235f


で、家に帰ってから思いついた実装。

この問題はまず地図を手に入れる必要がある。
作戦としては、

 * ある位置からどこにいけるかを key-value pair の形で持つ( https://gist.github.com/torazuka/5553803 )
 * 図の通りの角度でリテラルを持つ( http://qiita.com/items/a89b1f8693ba02c0fef9 )
 * 30度傾けてリテラルを持つ( http://qiita.com/items/107e9a3f8cb41602933a )

なんかがあるんだけれども、これはどれでもない。

```groovy
def map( dir ){
  [
  "!fghi!ePQRj!dOFGSk!cNEABHT!bMDCIU!aLKJV!ZYXW!",
  "!ijkT!hRSHU!gQGBIV!fPFACJW!eOEDKX!dNMLY!cbaZ!",
  "!TUVW!kHIJX!jSBCKY!iRGADLZ!hQFEMa!gPONb!fedc!",
  ][dir];
}

def solve( src ){
  ( src as List ).inject( ["A"]*2 ){ r, c ->
    dir = c.toInteger()
    path=map( dir % 3 )
    n=path[ path.indexOf(r[1])+(dir<3 ? 1 : -1) ];
    [ r[0]+n, n=="!" ? r[1] : n ]
  }[0]
}

def test( src, expected ){
  actual = solve( src )
  ok = actual==expected ? "ok" : "***NG***"
  println( "${ok} ${src}->${actual} ( ${expected})" )
}

/*0*/ test( "135004", "ACDABHS" );
/*略*/
/*45*/ test( "42434302545", "AFEOd!!ONOef" );
```

`map(0)` は、方向 0 に進んだらどうなるかを示している。
`map(1)`、`map(2)` も同様。
方向3〜5は、方向0〜2の逆なので、逆にたどればよい。

辿るにあたっては、回答となる文字列と今いる位置のペアを inject で回すことにした。
Travis CI上のビルドは再実行できる

Composerやbundle、APIなどの通信系の問題で失敗してしまったビルドは歯車マークから再実行ができる。再実行でビルドが成功すればGitHub上のプルリクエストなどもきちんと更新される。

![SS](https://pbs.twimg.com/media/BKOFXZtCYAAYCss.jpg:large)
Chrome Developer Tools の "Emulate touch events" を有効にして、か ら の

下記を実行

```javascript
var isTouch = (function () {
    var div = document.createElement('div');
    div.setAttribute('ontouchstart', 'return');
    return typeof div.ontouchstart === 'function';
}());
 
var isTouch2 = ('ontouchstart' in window);
 
alert(isTouch + ", " + isTouch2);
```

ソーシャルゲームとかで使えるはず
[2013-05-14 1st - jsdo.it](http://jsdo.it/foo9/aK3k)

[追記]
[こいつ](https://chrome.google.com/webstore/detail/%E3%82%BD%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%93%E3%83%A5%E3%83%BC%E3%82%A2/nomedkabmkiklebhfnfjcocngcdiphhg)も弾けた
CreateJSをやり始めた備忘録

##はじめに
細かい点などはQiitaでもまとめてる良い記事が沢山あるので、大枠などは割愛。
導入と自分がひっかかったことやCreateJSならではの癖などを備忘録代わりに。

##読んだもの
###公式ドキュメント (英語)
英語ですが、つまずいたら見に行ったりして結局ほとんど目を通しました

http://www.createjs.com/Docs/EaselJS/modules/EaselJS.html
http://www.createjs.com/Docs/TweenJS/modules/TweenJS.html

とりあえずdownloadして触ってみる。パッケージにdemoファイルもあるので
それを見ながら真似るとこから始めるといいかも。

※ドキュメントの日本語訳もそろそろ出てきそう(2013/5/8の記事)
http://cuaoar.jp/2013/05/createjs-3.html

※他にも機能をかいつまんでわかりやすく説明してくれている記事もある様子（あまりちゃんと読んでない
http://blog.sus-happy.net/201303/createjs-game/
http://dev.classmethod.jp/ria/html5/createjs-1/

##つまづいたことや留意点など
###イベント関連
####ハンドラの設定
・disiplayobjectなどのイベントプロパティに直接ハンドラを設定している記事が時期によっては見受けられるが今は非推奨。

```javascript:Deprecated
var g = new createjs.Graphics().beginFill("#ff0000").drawRect(0, 0, 100, 100);
 var shape = new createjs.Shape(g);
shape.onClick = function(){...};
```

```javascript:Current
shape.addEventListener('click', function(){...});
```

####mouseoverについて
・canvas内の子インスタンスにmouseoverを使う際は、親のstageインスタンスでenableMouseOverの呼び出しが必要

```javascript:enableMouseOver
var stage = new createjs.Stage('canvasID'):
stage.enableMouse0ver();
```

####mousemove/ mouseupについて
・displayObjectにはリスナーにmousemove / mouseupが無い
ドラッグのように利用する場合はmouse downのeventオブジェクトにmousemoveを設定する
・下の例はmousedownだがmouseoverのイベントオブジェクトにはバインドできなさそう?

```javascript:bindMousemove
object.addEventListener('mousedown', function(e){
  e.addEventListener('mousemove', function(evt){
    console.log(evt.stageX); // get mouse point X
  })
})
```

####親子のイベントハンドリングについて
・Eventモデルを採用していないため、親子関係を作った時に親のオブジェクトにハンドラを設定すると子のハンドラより優先される仕様のよう。bubblingなどの伝播は無い

```javascript:OverrideChildHandler
var parent = new createjs.Container();
var g = new createjs.Graphics().beginFill("#ff0000").drawRect(0, 0, 100, 100);
var child = new createjs.Shape(g);
parent.addChild(child);

child.addEventListener('click', function(){...});
parent.addEventListener('click', function(){...}); // override child's handler
```

###Canvasの扱い
####canvasのupdateについて
・CreateJSではcanvasの更新はTickerから行える。Stageクラスは内部的にTIcker.tickで呼び出されるhandleEventがあるみたいなので、stageのupdateをするだけなら関数でなくてもそのオブジェクトを引数に渡せばOK

```javascript:Ticker
var stage = new createjs.Stage('canvasID'):
createjs.Ticker.addEventListener('tick', stage);
/*createjs.Ticker.addEventlisnter('tick', function(){
  stage.update();
})*/
```
Deviseのカスタマイズ。OAuthのときはemail入力を不必要にして、""でも可にする


[Railscasts#235](http://railscasts.com/episodes/235-omniauth-part-1?view=asciicast)で作成したDevise入りアプリケーション。



これをカスタマイズして、

- OmniAuthでユーザー登録した場合はemailの入力は不要にする
- OmniAuthで登録したユーザーが自分のユーザー情報を編集したとき、emailフォームを空白にしても、uniqueバリデーションでアップデートを拒否されないようにする

以上の2つを満たすようにしたい。

なお現在Deviseのアップデートに伴い、より簡単になったOAuth対応機能を使った[Railscasts#235revised](http://railscasts.com/episodes/235-devise-and-omniauth-revised?view=asciicast)が公開されている。が、アプリケーション作成の際に旧バージョンのRailscastsを参考にしたので、今さら変えられない。

1. インデックスを消す
2. email_required?をオーバーライド
3. emailカラムのデフォルト変更

の順番で作業を行う。


## インデックスを消す
Deviseで

```
$ rails g devise user
```

したときにできる20130101111111_devise_create_users.rbには、

```db/migrate/20130101111111_devise_create_users.rb
add_index :users, :email, :unique => true
```

というインデックス追加を含んでいる。
このインデックスを残したままだとまずいので、まずこれを消す。

```
$ rails g migration remove_index_email_from_users
```

でできた20130514071534_remove_index_email_from_users.rbを

``` db/migrate/20130514071534_remove_index_email_from_users.rb
class RemoveIndexEmailFromUsers < ActiveRecord::Migration
  def up
    remove_index :users, :email
  end

  def down
    add_index :users, :email, unique: true
  end
end
```

と書きかえる。

```
$ rake db:migrate
```

でマイグレーション適用。インデックス削除ができたことはdb/schema.rbで確認できる。

## email_required?をオーバーライド

email_required?をオーバーライドすれば、devise内のemailのバリデーション設定をカスタマイズできる。
email_required? メソッドは、deviseの/lib/devise/models/validatable.rbにある、

```lib/devise/models/validatable.rb
validates_presence_of   :email, :if => :email_required?
```

で、emailのvalidates_presence_ofを行うかの判定に使われている。
そのコードはこちら。
https://github.com/plataformatec/devise/blob/c179cef365f7188c91cbbc3db924a9f1f9563c3c/lib/devise/models/validatable.rb#L29

なので、email_required?の返り値をfalseにすると、emailのvalidates_presence_ofバリデーションを行わない。

具体的にどうすればよいかというと、

```app/models/user.rb
  def email_required?
    (authentications.empty? || !email.blank?) && super
  end
```

とuserモデルに書く。これで、email_required? メソッドをオーバーライドできる。条件文が複雑なので、整理すると、


### Emailの存在が必要な場合
- ユーザーがOAuthのauthenticationsを持っていないとき
- 空白ではないEmailを入力したとき

### Emailの存在が不要な場合
- ユーザーがOAuthのauthenticationsを持っている
- かつ、Emailが空白かそもそもnilのとき

となる。


## emailカラムのデフォルト変更

DBスキーマのemailカラムは

```db/shema.rb
t.string   "email",     :default => "", :null => false
```

となっている。デフォルトで空白、nullは許可しない状態。
デフォルトでnullにして、nullを許可したい。

```
$ rails g migration change_email_default
```

でmigrationファイルを作って、

```db/migrate/20130514065947_change_email_default.rb
class ChangeEmailDefault < ActiveRecord::Migration
  def up
    change_column :users, :email, :string, null: true
    change_column_default :users, :email, nil
  end

  def down
    change_column :users, :email, :string, null: false
    change_column_default :users, :email, ""
  end
end
```

と書きかえる。で、

```
$ rake db:migrate
```

すれば、

```db/shema.rb
    t.string   "email"
```

と、nilを許可して、デフォルトをnilにできた。

あとは、サーバを再起動すれば、OAuthで登録したユーザーに関してはemail入力が不要になる。もうuniqueバリデーションで弾かれることはない。
UITableViewControllerを用いたViewの下部にUIToolBarを表示する

UITableViewControllerで、テーブルのセルを長押しした時に、画面の下部からツールバーが「にゅる」っとでてくる感じでメニューを表示できるようなものを作ってみたメモです。
storyboardでUIToolBarをつけると、セルの下にくっついてしまって意図した表示にならなかったので作ってみた次第です。

[https://github.com/myaaaaa-chan/TableViewAndToolBar](https://github.com/myaaaaa-chan/TableViewAndToolBar)

非表示にする時は、ツールバーを画面外に移動させる感じで。

```objc:TVTableViewController.m
    // にゅるっと表示/非表示になるようにアニメーションを設定する
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.4];
    
    //Create a rectangle for the toolbar
    int posisitonHeight = 0;
    if (isVisible == YES) {
        posisitonHeight = rootViewHeight - toolbarHeight;
    }
    else {
        posisitonHeight = rootViewHeight + toolbarHeight;
    }
    CGRect rectArea = CGRectMake(0, posisitonHeight, rootViewWidth, toolbarHeight);
    
    //Reposition and resize the receiver
    [menuToolBar setFrame:rectArea];
    
    [UIView commitAnimations];
```


viewDidLoadで長押しのジェスチャーを登録。
handleLongPressGesture:でツールバーを表示しています。長押しされたセルが特定できるので、表示しているデータをメニューのアクションの対象のデータとして保持しておくといいと思います。

```objc:TVTableViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // テーブルビューにロングクリックジェスチャーを設定
    UIGestureRecognizer *longClickGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPressGesture:)];
    [self.tableView addGestureRecognizer:longClickGesture];
    
    // ダミーアイテム
    tableItemArray = [[NSArray alloc]initWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
    
    [self.tableView reloadData];
}

// テーブルビュー長押しジェスチャーハンドル
- (void) handleLongPressGesture:(UILongPressGestureRecognizer*) sender
{
    // 長押しを開始
    if (sender.state == UIGestureRecognizerStateBegan) {
        
        // 長押しされたセルを特定
        CGPoint p = [sender locationInView:self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
        
        if (indexPath == nil) {
            NSLog(@"long press on table view but not on a row");
        }
        else {
            // メニューツールバーを表示
            [self showMenuToolBar];
        }
    }
}
```

プラスで長押しされたセルの色を変えたりするとよりわかりやすいと思います。
サンプルではUIToolBarを毎回作り直していますが、セルによってメニューの内容が変わることを意図してそうしています。内容が変わらないのであれば、作り直す必要はないと思います。
Finder上でJavaScriptの圧縮

MacのFinderでコンテキストメニューからJavaScriptの圧縮ができる。
ちょっとした時とか便利。

automatorからuglifyjsを走らせるというだけ。

# automatorの設定
![uglify_automator](http://f.cl.ly/items/020L110p0K2h3z0r3U3e/uglify_automator.png)
これだけ。

# シェルの内容

**引数として**に設定

```bash
# nodeやenvのPATHを通しておく
PATH=/usr/local/bin:/bin:/usr/bin:$PATH
export PATH

for f in "$@"
do
	dir=`dirname "$f"`
	file=`basename "$f"`
	name=`basename "$f" .js`
	cd $dir
	# uglifyjsはフルパスで
	/usr/local/bin/uglifyjs $file > "$name.min.js"
done
```

uglifyjsのインストールとかはいろいろあるのでGoogle先生にきいてください（省略ごめんなさい）。
Markdown でバッククオートを含むインラインコードを書くには

インラインコードに含まれるバッククオートのうち、もっとも長く連続するもの**よりも多い連続バッククオート**でコードを囲む。

    `` ` （←バッククオートひとつ） ``
    ``` `` （←バッククオートふたつ）```

↓

`` ` （←バッククオートひとつ） ``
``` `` （←バッククオートふたつ） ```

インラインコードの先頭か末尾にバッククオートがある場合は、コードを囲むバッククオートと区別するためにスペースを入れる（レンダリング結果にスペースは含まれない）。

## 仕様の細かい話

[オリジナルの Markdown の仕様](http://daringfireball.net/projects/markdown/syntax#code)は、連続バッククオートでバッククオートを囲めると述べているだけで、個数の対応関係には言及していない。

[オリジナルの実装（Markdown.pl 1.0.2b7）](http://daringfireball.net/projects/markdown/dingus)で試してみると、囲まれる連続バッククオートと異なる個数であれば、いくつの連続バッククオートで囲ってもよいようだ。たとえば2連続バッククオートを1個ずつのバッククオートで囲むことができる：

```text:using-Markdown.pl
Markdown: ` `` `
↓
HTML: <code>``</code>
```

しかしこの文字列は、 Markdown 実装によっては「`` ` ` ``」を2つ並べたものと扱われてしまう：

```text:using-sundown
Markdown: ` `` `
↓
HTML: <code> </code><code> </code>
```

この記事ではどちらの実装でも動くように、より多いバッククオートで囲むべきであるとした。

なお、 [CommonMark の仕様（バージョン0.29）](https://spec.commonmark.org/0.29/#example-340)は、オリジナルの実装の挙動に沿うようにバッククオートの個数を明文化している。すなわち、囲む個数は囲まれる個数より多くても少なくてもよい。