OmniAICreator/Qiita-1.07M huggingface dataset:
emptyを使って、trueを返す値を確かめる実験

PHPマニュアルに

<blockquote style="background-color:#add8e6; margin-top:-10px;">
empty — 変数が空であるかどうかを検査する
</blockquote>
http://php.net/manual/ja/function.empty.php

と書いてある。

<br />

emptyを使って、trueを返す値は、

0
null
false
''
""
空配列

らしい。そこで、実験。

```php:index.php
<?php
    $var = array();
    $test_data = [0, null, false, '', "",$var];
        
    for ($i = 0, $l = count($test_data); $i < $l; $i++) {
        if (empty($test_data[$i])) {
            echo 'true'.'<br/>';
        } else {
            echo 'false'.'<br />';
        }
    }
```

実行結果は、全部trueでございました。
引き続き実験をしていきたい。


参考URL
「emptyとissetの違い」   ほげほげ（仮）
http://starzero.hatenablog.com/entry/20101117/1290002811
NSFetchedResultControllerを渡したのに、渡した先のテーブルが空っぽの時

NSFetchedResultControllerのオブジェクトを渡したのに、渡した先のテーブルが空っぽの時で、１時間ぐらいああでもない、こうでもない、と悩んでいました。
結局、performFetch:のし忘れでした。


```objc:
NSError *error = nil;
if (![fetchedResultsController performFetch:&error]) {
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
       abort();
}
```

上記を書いた後に、渡したい先のテーブルビューコントローラーにfetchedResultsControllerを渡せばOK
VMware Player 5 で vmnetcfg を使う

VMware Player 5 から vmnetcfg.exe が本体に添付されなくなったが、以下の方法でGUIを呼び出すことができるらしい。

1. 管理者権限でコマンドプロンプトを開く。
2. `cd "C:\Program Files (x86)\VMware\VMware Player"`
3. `rundll32 vmnetui.dll,VMNetUI_ShowStandalone`
Django環境を構築していたら

「cc1: error: unrecognized command line option "-Wno-null-conversion"」エラーにはまったので対応策をメモ

## 私の環境
・mac os 10.8.4
・mac port 2.1.3
・mysql-server 5.6.12
・python 2.7.3

## 書き換えたファイル
/opt/local/bin/mysql_config (mac portの場合)

``` 書き換え前
cflags="-I$pkgincludedir -pipe -O2   -Wall -Wno-null-conversion -Wno-unused-private-field -Os -g -fno-strict-aliasing -DDBUG_OFF  " #note: end space!
```
``` 書き換え前
cflags="-I$pkgincludedir  -Wall   -Os -g -fno-strict-aliasing -DDBUG_OFF -arch x86_64 "
```

上記のようにしたらインストールできた。
mongo のレプリカセットと複数WebSocket サーバーのフェールオーバーメモ

mongo のレプリカセットと複数 WebSocket サーバーのフェールオーバーをいろいろ試してたのですが、とりあえず、最近試した組み合わせが一応動いてるっぽいので、メモ書きました。
http://ccchart.org/doc/example.pdf

スケールも簡単な気がする。まだ試してないけど 

![ccchart showcase](http://ccchart.org/doc/example.png)

関連: MongoDBでReplica Setsを試した時のメモ
http://qiita.com/toshirot/items/b5e99bf4923b84b2bb40
OSX10.8 で、Pythonのbzrlib がみつからないというエラーで brew install がコケる問題

新しいmacbookで、homebrewで色々入れていたら、以下のようなエラーが出た。

```bash
$ brew install emacs --HEAD --cocoa
==> Cloning bzr://http://bzr.savannah.gnu.org/r/emacs/trunk
bzr: ERROR: Couldn't import bzrlib and dependencies.
Please check the directory containing bzrlib is on your PYTHONPATH.

Traceback (most recent call last):
  File "/usr/local/bin/bzr", line 74, in <module>
    import bzrlib
ImportError: No module named bzrlib
Error: Failure while executing: /usr/local/bin/bzr checkout --lightweight http://bzr.savannah.gnu.org/r/emacs/trunk /Library/Caches/Homebrew/emacs--bzr
```

他の何かのパッケージでもエラーが出たような気がする。
bzrというコマンドが、Pythonのbzrlibというパッケージを参照しているけど、MacのシステムのPythonがそれをみつけられてなかった。

Homebrewが入れたbzrには、ちゃんとbzrlibがついてきてるので、シンボリックリンク張ったら直った。

```bash
$ sudo ln  -s /usr/local/Cellar/bazaar/2.5.1/lib/python2.7/site-packages/bzrlib /Library/Python/2.7/site-packages/bzrlib
```

あるいは、pythonもHomebrewから入れるとこういう問題が起きないのかな? (未検証)
あと、以前はなぜこの問題がなかったのかもよくわからない。
Javaで16進数表記のStringをintに変換

　Javaで16進数のテキストをint型に変換する方法は、ググればあらゆる所に書いてある。なので、何も考えず、  
`Integer.parseInt("16進数文字列", 16);`  
としたところ、java.lang.NumberFormatExceptionを吐いてしまう時がある。調べてみたところ、"79999999"までは問題ない。"80000000"以上になると例外を吐く。お察しの良い方ならお気づきかと思うが、負数の表し方が2の補数表現だとparseIntできないらしい。(常識？)  
　例えば0xFFFFFFFF==-1だが、これを表すには"-00000001" (※"-1"でもよい)、0x80000000==-2147483648だが、これを表すには"-80000000"と表す必要がある。Integer.toHexString(int i)では2の補数表現で表わされるので、非常に変換が面倒臭い。特に困るのがRGBAをintで表したい時で、これで悩んでいた。
　仕方なく以下のようにすることで解決した。  
`(int)Long.parseLong("16進数文字列", 16);`  
　parseIntとtoHexStringをどちらも使っている場合は、このケースを忘れないようにしなければ…
写経していて思うこと〜ある書籍の進め方〜

こんにちわ

また、つまらない投稿なのですが、書籍を購入して目次にそって勉強していくと、途中で挫折してしまうことがあるんですよね。

例えば、ある書籍の目次で例えると、

```
目次

chapter01 iOSとアプリ開発の概要

chapter03 C言語のポインタとメモリー管理

chapter04 Objective-C 入門

chapter05 簡単計算アプリ

...

chapter10 回転対応アプリ
```

chapter01〜chapter04までの基礎って重いんですよね。

アプリを実際に作成するchapter05にたどり着く前におなかいっぱいになってしまう

基礎は大事だけど、おなかいっぱいになると、当初の「アプリを作りたい」というモチベーションが下がっていくような気がするんですよね。

「アプリを作りたい」っていう思いを叶えてくれる、chapter05から進めた方がいいじゃないかと思って

それと、入門用の書籍は１冊よりも５冊くらい買った方がいいような気もしてます。

とにかく写経しまくってアプリを作る。

サンプルアプリなんて１冊に数個しかないので、１冊だと僕の気持ちを受け止めきれないんですよね

そして15本くらい写経してから、基礎編を読んだ方がいいような気がして


まあ、こんな取り留めない投稿でした。
あーあ、今日はやるきでないな。。。
CentOSをNATとhost-onlyアダプタで設定する時につまづいたこと

[環境]
Windows7 64bit(ホストOS)
CentOS5.9 x86(ゲストOS)

[参考にしたサイト]
ドットインストール　--ローカル開発環境の構築
http://dotinstall.com/lessons/basic_local_development

ですが、だいたいこのサイトにまとまっているのでドットインストールのアカウントを持ってない場合はこちらを参照してください。
VirtualBox開発環境
http://nextindex.s141.xrea.com/virtualbox/index.html

[つまづいたこと]
アダプタ1にNAT、アダプタ2にhost-onlyを割り当てても
①ホストOSからゲストOSへの疎通ができないし
②外部にも接続できていない。

①PCのスタートメニュー→アクセサリ→コマンドプロンプトで
ping ゲストOSのipアドレスを打って調べる。

②centOSでping google.com と打ち返ってくるか調べる。

一つも返ってこなかったのですが、

PCのコントロールパネル→ネットワークとインターネット→ネットワークと共有センター→インターネット接続
のプロパティで
共有タブの
ネットワークの他のユーザーに、このコンピューターのインターネット接続を通しての接続を許可するにチェック
→VirtualBox Host-Only Networkを追加

ですべて解決しました。


色んなサイトで調べても、なかなかコントロールパネルでのインターネット接続を変えておくことが出てこなかったので、当たり前のことなのかもしれませんが、載せておきます。
Sublime Text 2 で trailing space に色をつける


Git にコミットする時に文句を言われたりする例のあれ。保存時に自動で消す設定もありますが、何となく気持ち悪いです。
（ちなみに `"trim_trailing_white_space_on_save": true` です。）

そこで [TrailingSpaces plugin](https://github.com/SublimeText/TrailingSpaces) をインストール。Package Manager でインストールできます。

## 色をつける

Settings - User で以下のようにすれば、trailing space に色がつきます。

```json
{
  "highlight_trailing_spaces_color_name": "invalid"
}
```

## 一気に消す

Cmd+Chift+P で del とか打つと出てくる `Trailing Spaces: Delete Trailing Spaces` コマンドを実行するだけです。

キーに割り当てたい場合、例えば `Ctrl+Shift+t` なら Keybindings - User で以下のような感じです。

```json
[
  {
    "keys": ["ctrl+shift+t"],
    "command": "delete_trailing_spaces"
  }
]
```

## 参考
https://github.com/SublimeText/TrailingSpaces
friendly-grep、vimgrepを使いやすくするvimプラグイン

この記事は [Vim Advent Calendar 2012](http://atnd.org/events/33746) 205日目の記事になります。
前回は@manga_osyoさんの [Vim で指定した文字を挿入して行を結合する](http://d.hatena.ne.jp/osyo-manga/20130622/1371905937)でした

[friendly-grep.vim](https://github.com/akira-hamada/friendly-grep.vim) 

vimgrepの書式がなんか覚えにくかったので使いやすくするブラグインを作りました。 
ちょっとしたwrapperのようなもんですね。 
ちなみに初めてのvim pluginリリース。 似たようなのがありそうな気がしますが、多分無い。

これを利用すれば「再帰検索って確かアスタリスク必要だっけ？」とか、 
「キーワードと検索対象ってどっちを先に入力するんだっけ？」とか 
意識する必要がなくなります。 

よく検索するディレクトリを登録できたりも。

## 特徴

* 対話式で、「キーワードを入力して」、「検索対象のディレクトリ(ファイル)を入力して」、「再帰検索する？」と聞いてくれる
* よく検索するディレクトリやファイル名を登録しておくと、入力を省略できる
* ディレクトリの入力はtab補完できる
* いつも再帰検索する or しない場合は「再帰検索する？」といちいち聞いてこないようにできる
* 検索結果の開き方を指定できる(quickfix, newtab, vsplit, splitのいずれか)
* 内部的にはvimgrepを実行

## インストール方法

[friendly-grep.vim](https://github.com/akira-hamada/friendly-grep.vim) 

.vimrcに以下を追加後、:BundleInstall あるいは :NeoBundleInstall を実行。

```vim:.vimrc
Bundle 'akira-hamada/friendly-grep.vim' " vundleの場合
NeoBundle 'akira-hamada/friendly-grep.vim' " NeoBundleの場合
```

## 使い方

単に :FriendlyGrep を実行するだけです。 

あとは順番に検索クエリー、検索対象、再帰検索するかどうか(yあるいはn)を入力するだけでvimgrepが実行されます。 
(デフォルトだとウィンドウが横分割されて検索結果を表示) 

以下のように.vimrcでショートカットを設定したほうが良いでしょう。

```vim:.vimrc
  nnoremap <C-g> <ESC>:FriendlyGrep<CR>
```

検索結果の画面では :cnextや :cprevious で移動できますが、これも以下のような感じでショートカットを設定しといた方が吉。この辺のことはvimのquickfixのお話になります。

```vim:.vimrc
nnoremap <LEFT> :cprevious<CR> " 一つ前の結果へジャンプ
nnoremap <RIGHT> :cnext<CR> " 次の結果へジャンプ
nnoremap <UP> :<C-u>cfirst<CR> " 最初の結果へジャンプ
nnoremap <DOWN> :<C-u>clast<CR> " 最後の結果へジャンプ
```

## オプション

便利に使うための3つの設定を.vimrcで設定できる。

```vim:.vimrc
let g:friendlygrep_target_dir = 'hoge/foo/bar/'
" よく検索するディレクトリあるいはファイル名を登録出来ます。
" 上記だと 'hoge/foo/bar/' が検索対象入力時に毎回入力済みになる。
" (デフォルトは空)

let g:friendlygrep_recursively = 1
" 毎回「再帰検索する？」と聞かれるのがウザい場合はこれを設定すると聞いてこなくなります。 
" 1 : 常に再帰検索 
" 0 : 常に非再帰検索
" (デフォルトはnull、毎回聞いてきます)

let g:friendlygrep_display_result_in = 'tab'
" 検索結果の開き方を指定出来ます。
" 'tab' : 新規タブに表示
" 'split' : 現在のウィンドウを横分割して上に表示 (デフォルト)
" 'vsplit' : 現在のウィンドウを縦分割して左に表示
" 'quickfix' : 現在のウィンドウにquickfixリストと共に表示

```
## 今後の課題

ちなみにMacVimでしか動作確認してません。バンバンissue登録なりpull-reqなりしてください。

* :help friendlygrep でヘルプを表示させたいけど上手くいかない
* splitする時の幅をユーザが設定できるようにしたい(今だとvsplitは width: 55 で固定)
自分用のSyntax Highlightを追加

##NeoBundleを導入したので.vimrcで、NeoBundleをハイライトしてほしい

###調べる
:help highlight とすると

```vim:syntax.jax

現在有効な全てのグループを知るにはこのコマンドを使う
:so $VIMRUNTIME/syntax/hitest.vim
```

とあるので、実行。うちの環境では読み込みに結構時間かかりました。
今回はそこのStatementグループと同じハイライトを実行したいと思ったので、そこのグループにあるvimStatementを採用。

###記述する

```vim:vim.vim
" Vim Syntax file
" Language: vim
" Version: 0.1

syntax match vimStatement /^\(NeoBundleLazy\|NeoBundle\)/ display
```

上記を$VIMHOME/after/syntax/vim.vimに設置しましたところ、とりあえずの目的を達成しました。
UIViewanimateWithDurationで簡単なアニメーションを作成する

##この記事を読むとわかること
簡単なUIViewanimateWithDurationの使い方。
テーブルビューでセル表示時にアニメーションする方法。


##概要
Gプラスのタイムラインをまねた、
セルがふわっと出てくる感じをテーブルビューで再現します。

動いてる様子はこちら
http://www.youtube.com/embed/hkGl87HJAEc

ソースはこちら
https://github.com/y42sora/GPlusTimeline

前提として、アニメーションなしに普通にセルを表示できているとします。


##アニメーションの位置
テーブルビューのセルは表示される前に、
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
が呼ばれます。

そのため、このメソッドでまだ表示していないセルをアニメーションしてあげることで
Google Plusのように、タイムラインの各セルをアニメーションして表示させる事ができます。

##セルのアニメーション
アニメーション自体はこのようになります。

```objc::TimelineViewController.m
    // When a cell will appear, this method was called.
   
    // if already appeared, isn't animaiton.
    if ([[_cellFlagsobjectAtIndex:indexPath.row] boolValue])
        return;
   
    // set flag.
    [_cellFlagsreplaceObjectAtIndex:indexPath.rowwithObject:[NSNumbernumberWithBool:true]];
    cell.backgroundColor = [UIColorclearColor];

    // save correct cell point.
    CGRect nowFrame = cell.frame;
   
    // make animaiton.
    cell.alpha = 0.0f;
    cell.transform = CGAffineTransformMakeRotation(-2*M_PI*5/360.0);
       
    cell.frame = CGRectMake(nowFrame.origin.x - 20, nowFrame.origin.y + 40, nowFrame.size.width, nowFrame.size.height);
       
    [UIViewanimateWithDuration:0.7
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         cell.transform = CGAffineTransformMakeRotation(0.0);
                         cell.alpha = 1.0f;
                         cell.frame = nowFrame;
                         } completion:nil];
```

UIViewanimateWithDurationは、animationsに指定したブロックを実行し終わった状態に向けて、UIViewをアニメーションさせる命令です。
初期状態でアニメーション終了時の位置が保存されているので、
アニメーションの開始位置を設定して、初期位置までアニメーションさせています。
Grunt で子タスクを個別に指定する方法

":" 区切りで子タスクを指定する

```js:Gruntfile.js
grunt.initConfig = {
  coffee: {
    development: {
       // 略
    },
    production: {
       // 略
    }
  }
};

grunt.registerTask('default', ['coffee:development']);
grunt.registerTask('release', ['coffee:production']);
```
Gitマージ解除

マージで競合が発生し取り消し直前に戻りたい場合
####衝突の解決その一
```
<<<<<< HEAD
カレンチブランチの内容
 ======
リモート追跡ブランチの内容
>>>>>>
```

<<<<<< HEADから ======までの内容か, ======から>>>>>>までの内容のどちらかを削除する
内容消去し衝突を解決したとGit addで宣言、そのあとコミット。

####衝突の解決その二
カレンチブランチの内容かリモートブランチの内容かどっちかを優先する場合
git checkout --ours (ファイル名) カレントを採用する
  git checkout --theirs (ファイル名) リモートを採用する
その後、addしてcommitして終了。
No 電源. No Life. MacBook の電源アダプタを忘れない方法


## 答え
- MacBook より先に電源アダプタを（カバンに）入れる

## MacBook の電源忘れ
MacBook をお使いならば、あの白い電源アダプタを１度や２度ならずとも忘れちゃった！という方は多いと思います。周りの親切な人に貸してもらったり、せめてバッテリーがもつまでやろうって思ったら残量がなかったりします；ｘ；。

## 富豪的解決
もう一つを買うという富豪的解決方法もありますが、アレ、単品でも意外とお高くて、6,800 円もするんですね。(http://store.apple.com/jp/product/MC461J/A/apple-60w-magsafe%E9%9B%BB%E6%BA%90%E3%82%A2%E3%83%80%E3%83%97%E3%82%BFmacbook%E3%81%8A%E3%82%88%E3%81%B3macbook-pro-13%E3%82%A4%E3%83%B3%E3%83%81%E7%94%A8)
（あれ？前はもっと 9,800 円くらいしませんでしたっけ？）

## そこで
まあ、３回ほど痛い目にあったら、なにか対策を講じたいところ。
そこで、アダプタ先入れ方ですよ。

## アダプタ先入れ方
使用時のアダプタの置き場所は MacBook のすぐ後ろ、閉じると見えるあたりがオススメです。さて、そろそろ出かけるぞって、そっと MacBook 閉じ、視界に入るアダプタをバッグに入れてから、おもむろに MacBook を入れる。これをさらっと流れでやりましょう。アダプタをバッグに入れた後、他のことをすると MacBook 本体を忘れてしまう率がグッと高まります。

また、アダプタが MacBook のすぐ後ろにくるよう、延長コードを使うとよいでしょう。アダプタが机の下など、視界の外だと、先に視界内になる MacBook を入れてしまい、アダプタを忘れがちになるので気をつけましょう。
無限スクロールライブラリ作った

UIScrollViewで無限にスクロールするというのは、実装がなかなかだるいと思う。そういうことを目的としてそもそもが作られていないからだ。ぐぐってみたらやっている人もいるが、どれも頑張りまくっている。

そういうことをシンプルにやりたい人は、この私が作ったVIewを以下のように置けば一発で解決する。
https://github.com/adachic/StardustCrossView/tree/0.1
StardustCrossViewというライブラリを今作っているのだが、無限スクロールするところまでできた。

動作の様子は以下を確認してもらいたい。
http://youtu.be/OJhYBmFaVPc

ビルドしたら、StardustCrossView.frameworkというファイルができるんで、そいつをあなた様のawesome project にaddしてくれれば、良い。

使い方

```objc:SampleViewController.m`

#import <StardustCrossView/StardustCrossView.h>
- (void)viewWillAppear:(BOOL)animated {

    /*まずViewを配置*/
    StardustCrossView *view = [[StardustCrossView alloc] initWithFrame:CGRectMake(50, 0, 100, 480)];
    [self.view addSubview:view];

    /*メニューを追加する（いくつでも良い）*/
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];

    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];
    [view addMenuWithImage:nil text:@"text1" onClick:nil];

   /*動き出す*/
    [view fallingStars];

}
```

このライブラリは今後、行けてるメニュー用UIとして育てて行くので、非常に役立つと思う。
mrubyの基礎知識: ビルド、生成物、ファイルの拡張子、ドキュメントについて


## レポジトリ
[https://github.com/mruby/mruby](https://github.com/mruby/mruby)

## チェックアウトからビルドまで

```bash
# チェックアウト
$ git clone git://github.com/mruby/mruby.git

# ビルド
$ cd mruby
$ rake 

# 実行テスト
$ ./bin/mruby -e 'puts "Hi"''
Hi
```

gccとかbisonとか必要

## ビルド後の生成物
* mruby .. rubyに相当
* mirb .. irbに相当
* mrbc .. rb -> mrb に変換するバイトコンパイラ

## 拡張子
* rb .. Rubyスクリプト(mrb_load_fileで読む)
* mrb .. mrbcでバイトコンパイルしたバイナリ形式(mrb_load_irep_fileで読む)

## ドキュメント
- [Wiki](https://github.com/mruby/mruby/wiki)読もう。[Hello World](https://github.com/mruby/mruby/wiki/Hello-World)から
- 日本語の情報もググれば結構ある。

辺り。

後はソース。

- [mruby/include/mruby.h](https://github.com/mruby/mruby/blob/master/include/mruby.h) 
- [mruby/include/mruby/compile.h](https://github.com/mruby/mruby/blob/master/include/mruby/compile.h)

辺りが重要。手前味噌だけど[mruby - Kodeworld](http://kodeworld.ongaeshi.me/home/mruby?shead=package)使うと捗る。
Vector を列として繰り返した Matrix を作る


ある Vector を列にした Matrix を作りたい場合は、以下のようにします。

```octave
a = [1; 2; 3];
a(:, ones(1, 3))
% ans =
% 
%    1   1   1
%    2   2   2
%    3   3   3
```

参考
http://stackoverflow.com/questions/2423950/matlab-filling-a-matrix-with-each-column-being-the-same
クリックした場所をズームする

クリックした場所をズームするサンプルを作ってみました。

今回作ったサンプル
http://jk0602.sakura.ne.jp/sample/zoom/

ソースコード
http://jk0602.sakura.ne.jp/sample/zoom/zoom.zip

※firefoxだとoffsetX、offsetYが使えなくてうまく動いていません・・・別途処理が必要。。。

```html:index.html
<body>
	<div class="wrapper">
		<div class="content" zoom="off">
		</div>
	</div>
</body>
```


```js:zoom.js
$(function(){
	var click_x,click_y;
	$(".content").click(function(e){
		if($(this).attr("zoom")=="off"){
			$(this).attr("zoom","on");
			click_x = e.offsetX;
			click_y = e.offsetY;
			Zoom(2.0, click_x, click_y);
		}else{
			$(this).attr("zoom","off");
			Zoom(1, click_x, click_y);
		}
	});

	function Zoom(zoom, x, y){
		$(".content").css({
			"-moz-transition": "all 0s ease 0",
			"-webkit-transition": "all 0s ease 0",
			"-webkit-transform-origin": x+"px "+y+"px",
			"transform-origin": x+"px "+y+"px",
		});

		setTimeout(function(){
			$(".content").css({
				"-moz-transition": "all 0.5s ease 0",
				"-webkit-transition": "all 0.5s ease 0",
				"-webkit-transform" : "scale("+zoom+")",
				"transform" : "scale("+zoom+")",
			});
		},1);
	}
});
```

大きなポイントは３点
①offsetX、offsetYでイベントが発生した要素上のX,Y座標を取得している
②「transform-origin」で拡大縮小させる中心座標を指定
③「"-webkit-transition": "all 0.5s ease 0"」「"-webkit-transform" : "scale("+zoom+")"」で0.5秒かけて拡大縮小のアニメーションをさせる

　最初、以下のように「"transform-origin": x+"px "+y+"px"」と「"transform" : "scale("+zoom+")"」を同時にやっていたんですが、これだと、拡大する中心座標も0.5秒かけて移動してしまうので、スムーズに拡大アニメーションができませんでした。
　なので、最初に拡大する中心座標を設定しておき、そのあと、拡大縮小させるようにしました。（上記プログラムでsetTimeoutを使っているところ）・・・ちょっと強引な気がするけれども。。。もっとスマートな方法ありそう。

```js:
function Zoom(zoom, x, y){
	$(".content").css({
		"-moz-transition": "all 0.5s ease 0",
		"-webkit-transition": "all 0.5s ease 0",
		"-webkit-transform-origin": x+"px "+y+"px",
		"transform-origin": x+"px "+y+"px",
		"-webkit-transform" : "scale("+zoom+")",
		"transform" : "scale("+zoom+")",
	});
}
```
四元数の正規化

四元数は合成すると微妙にノルムが小さくなることが多いので最後は全部0になって計算できなくなったりする。で、正規化についてググってもなかなか探せないのでメモ。単純すぎて誰も書かないんだろうけど。

ただのベクトルの正規化と同じだからね。
CSSを使って画像をキラリと光っているようにみせる

写真をキラッと光る感じをCSSを使って作ってみました。

今回作ったサンプル
http://jk0602.sakura.ne.jp/sample/reflection/

ソースファイルはこちら
http://jk0602.sakura.ne.jp/sample/reflection/reflection.zip



```html:index.html
<body>
	<div class="content">
		<img src="bg1.png">
		<div class="reflection"></div>
	</div>
</body>
```

キラッ光っているのは
\<div class="reflection">\</div>
の部分です。
そして、これに対応するCSSが以下のようになります。

```css::index.css
.reflection {
    height      :100%;
    width       :30px;
    position    :absolute;
    top         :-180px;
    left        :0;
    background-color: #fff;
    opacity     :0;
    -webkit-transform: rotate(45deg);
    -webkit-animation: reflection 2s ease-in-out infinite;
}

@-webkit-keyframes reflection {
    0% { -webkit-transform: scale(0) rotate(45deg); opacity: 0; }
    80% { -webkit-transform: scale(0) rotate(45deg); opacity: 0.5; }
    81% { -webkit-transform: scale(4) rotate(45deg); opacity: 1; }
    100% { -webkit-transform: scale(50) rotate(45deg); opacity: 0; }
}
```
オフラインどう書く第12回 参考問題解答例(TypeScript)

```ts:
class Turtle {
    private direction = 1;
    private pos = [0, 0];
    private way = 'A';
    private courseOut(course: string[]): boolean {
        return (
            course.length - 1 < this.pos[0] || this.pos[0] < 0 ||
            course[this.pos[0]][this.pos[1]] === '*' || course[this.pos[0]][this.pos[1]] === undefined);
    }
    turn(direction: string) {
        if (direction === 'L') {
            this.direction = this.direction === 0 ? 3 : this.direction - 1;
        } else {
            this.direction = this.direction === 3 ? 0 : this.direction + 1;
        }
    }
    walk(steps: number, directions: number[][], course: string[]) {
        for (var i = 0; i < steps; ++i) {
            this.pos[0] += directions[this.direction][0];
            this.pos[1] += directions[this.direction][1];
            if (this.pos[0] === course.length && this.direction === 2) {
                this.direction = 0;
                this.pos[0] -= 2;
                this.pos[1] = course[this.pos[0]].length - 1 - this.pos[1];
            }
            if (this.courseOut(course)) {
                this.way += '?';
                return;
            }
            this.way += course[this.pos[0]][this.pos[1]];
        }
    }
    getWay(): string {
        return this.way;
    }
}

var solve = (src: string): string => {
    var cource = [
        'ABCDEFGHIJK', 'LMNOPQRSTUV', 'WXYZabcdefg',
        'hij*****765', 'klm*****432', 'nop*****10z',
        'qrs*****yxw', 'tuv*****vut'];
    var directions = [[-1, 0], [0, 1], [1, 0], [0, -1]];
    var turtle = new Turtle();
    for (var i = 0; i < src.length; ++i) {
        var c = src[i];
        if (c === 'L' || c === 'R') {
            turtle.turn(c);
            continue;
        }
        var steps = parseInt(c, 16);
        turtle.walk(steps, directions, cource);
        if (turtle.getWay().indexOf('?') != -1) {
            break;
        }
    }
    return turtle.getWay();
}

var test = (src: string, expected: string) => {
    var actual = solve(src);
    var result = expected === actual ? 'ok' : '***ng***';
    console.log(result);
}

```
Mercurialのデフォルトリポジトリとユーザの設定

# リポジトリディレクトリの.hg/hgrcを編集（もしくは作成）

## [paths]と[ui]を設定

```
[paths]
default = https://amidaku@example.com/hogehoge
[ui]
username =  amidaku <amidaku@example.com>
```
bundle exec と打つのがめんどくさい


`bundle exec rake db:migrate` など、つけた方がいいとわかっていても、面倒な `bundle exec`。しかし、面倒だからといってつけないと、同じ gem の複数バージョンが入っている環境でエラーになったりしてしまいます。そこで alias を作ってしまいましょう。 

```.bash_profile
alias be='bundle exec'
```

これで `be rake db:migrate` などと打てますね。Boys be bundle exec!
Qiita API を使うときには User-Agent を設定しないと 500 Internal Server Error が発生する

# 概要
件名の通り。
Qiita API を使うときには User-Agent を設定しないと 500 Internal Server Error が発生する。

php の file_get_contents をそのまま使うと User-Agent ヘッダが付与されない（ことが多い）ので、そこでハマる。
何故か 500 Internal Server Error が発生する。

# 実行例
```php:QiitaApiSimple.php
<?php
$url = 'https://qiita.com/api/v1/items';
$response = file_get_contents($url);
```

```bash:
$ php QiitaApiSimple.php

Warning: file_get_contents(https://qiita.com/api/v1/items): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error
 in QiitaApiSimple.php on line 3

Call Stack:
    0.0000     338728   1. {main}() QiitaApiSimple.php:0
    0.0000     338880   2. file_get_contents() QiitaApiSimple.php:3

PHP Warning:  file_get_contents(https://qiita.com/api/v1/items): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error
 in QiitaApiSimple.php on line 3
PHP Stack trace:
PHP   1. {main}() QiitaApiSimple.php:0
PHP   2. file_get_contents() QiitaApiSimple.php:3
```

# 経緯
シンプルに Qiita API を使うために php の file_get_contents で Qiita API を呼んでみる。すると 500 Internal Server Error が発生する。
API の URL とかパラメータとか間違ったかな？と思いブラウザで確認してみると、それはちゃんと表示される。
ブラウザからのアクセスと file_get_contents の違いといったら HTTP ヘッダくらいかなと思い、ひとつひとつ試してみたら User-Agent ヘッダの有無が 500 Internal Server エラーに影響していることが分かった。

# Qiita API のドキュメントを参照する
[Qiita APIドキュメント - Qiita:Developer](http://qiita.com/docs)
特に User-Agent に関する記載は無い。

# とりあえず対策 (php の場合)
とりあえずシンプルにテストしたいので file_get_contents を使う方針は変えないとして、
その場合にとれる対策はだいたい以下の3つくらい。

##対策1) php.ini にユーザエージェントを記載

```ini:php.ini
user_agent='OreOreAgent' (追記)
```

これで file_get_contents はHTTPヘッダに "User-Agent: OreOreAgent" を付与する。

##対策2) コード内でユーザエージェント設定を変更

```php:QiitaApiAgent1.php
<?php
ini_set('user_agent', 'OreOreAgent');
$url = 'https://qiita.com/api/v1/items';
$response = file_get_contents($url);
```

これで file_get_contents はHTTPヘッダに "User-Agent: OreOreAgent" を付与する。

##対策3) 詳細にHTTPヘッダを設定

```php:php:QiitaApiAgent2.php
<?php
$url = 'https://qiita.com/api/v1/items';
$opts = array(
	'http'=>array(
		'method'=> "GET",
		'header'=> "User-Agent: OreOreAgent\r\n"
	)
);
$context = stream_context_create($opts);
$response = file_get_contents($url, false, $context);
```

これで file_get_contents はHTTPヘッダに "User-Agent: OreOreAgent" を付与する。
SmartyをComposerでインストールする

開発速度が心配されるSmartyですが、密かにComposerでセットアップする事ができる。展開したファイルからlibをコピーしてrequireという手順は実は必要なかった。
通常どおりcomposer.jsonを記述してcomposer installでセットアップされる。

```json:composer.json
{
 "require": {
   "smarty/smarty": "dev-trunk"
 }
}
```

あとはComposerコマンドを起動する事で自動的にライブラリのセットアップを行う。

```shell-session:結果
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar install
$ php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing smarty/smarty (dev-trunk)
    Checking out /trunk/@4746
Writing lock file
Generating autoload files

$ ls -l vendor/
total 4
-rw-r--r-- 1 vagrant vagrant 182 Jun 22 07:53 autoload.php
drwxr-xr-x 1 vagrant vagrant 238 Jun 22 07:53 composer
drwxr-xr-x 1 vagrant vagrant 102 Jun 22 07:50 smarty
```

これでSmartyクラスをオートロードして利用する事ができる。

```php:index.php
<?php
require './vendor/autoload.php';
$smarty = new Smarty();
$smarty->display('hoge.tpl');
```

```php:templates/hoge.tpl
This is rendered by {$smarty.version}
```

実行してみると無事にテンプレートがレンダリングされた。

<pre>
This is rendered by Smarty-3.1-DEV
</pre>

Smartyをまだ使っているにせよ、レガシーなrequireを一つ減らす事ができるのでComposerでインストールする事が望ましい。

参考
https://packagist.org/packages/smarty/smarty
Maven+JUnitでファイル読み込みの試験を行う。

「外部ファイルを読み込むモジュールのJUnitを書きたいんすけど、指定するファイル名のパスって固定でいいですか？」と聞かれたので、「もちろんNG」と伝えた内容をメモします。


## NG理由
- プロジェクトファイルの位置を変えると、ユニットテストができなくなるため
- 他人がモジュールをチェックアウトした際に、ユニットテストができなくなるため
- Jenkins等のCIツールでユニットテストができなくなるため（一番イタイ）


## 結論 クラスローダからファイルの位置を特定してください。

Mavenプロジェクトだと、ソースファイルはsrc/main下、ユニットテスト用ファイルはsrc/test下に配置されます。

    /src
      /main
        /java
        /resources
      /test
        /java
        /resources

test配下のモジュールはmvn test時のみクラスパスに追加されます。そのため、JUnit試験で使用するファイルは src/test/resources 配下に置くと良いことがわかります。


## 外部ファイル名を指定する

こんなメソッドの試験を行いたいです。XMLファイル名を指定すると、それを読み込みBeanを生成するメソッドです。

```java:
public TestBean readXml(String xmlFileName) throws XMLReadException;
```

この様にファイル名をパス固定にしてしまうと、上記のNG理由にあてはまり、ポータビリティがなくなります。

```java:
/// NG例
@Test
public void readTest() throws Exception {
    TestBean bean = readXml("/path/to/project/src/test/resources/test.xml");
    assertNotNull(bean);
    assertEquals("test.xml", bean.getOriginName());
    ...
}
```

こういう場合は、クラスローダにファイルの場所を教えてもらいます。


```java:
/// OK例
@Test
public void readTest() throws Exception {
    //- クラスローダから test.xml のファイル位置を取得
    //- クラスローダに指定するクラスは何でも良いが、自クラスを指定すると良さそう
    String fileName = XXXX.class.getClassLoader().getResource("test.xml").getPath();

    //- あとは同じように試験する
    TestBean bean = readXml(fileName);
    assertNotNull(bean);
    assertEquals("test.xml", bean.getOriginName());
    ...
}
```

クラスローダがクラスパスにあるファイルを探しだし(getResourceメソッド)、その戻りがURLなので getPath()で実際のパスを取得しています。

これで、様々なディレクトリや環境でユニットテストを実行することができます。
EZGUIのUIButtomをdisableにする

```C#:ChangeButton.cs
using UnityEngine;
using System.Collections;

public class ChangeButton : MonoBehaviour {
	
	public GameObject gameObject;
	private UIButton thisUIButton;
	
	void  Awake () {
		thisUIButton = GetComponent <UIButton>();
		thisUIButton.controlIsEnabled = false;
	}

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}
```
Sublime Text 3 プラグイン移行情報


移行情報の公式 URL はこちら。
http://www.sublimetext.com/docs/3/porting_guide.html

さりげなく API リファレンスにも移行情報が載っています。
http://www.sublimetext.com/docs/3/api_reference.html

## Python のバージョンアップ

Python 2.6 から Python 3.3 になります。

## プラグインの稼働するプロセス

Sublime Text 本体とは違うプロセス (plugin_host) になります。プラグインが落ちても連動して本体が落ちるようなことはなくなります。

## イベントの排他

Sublime Text 2 では set_timeout() だけがスレッドセーフでしたが、Sublime Text 3 では全てのメソッドがスレッドセーフになります。これに伴い、イベント系にスレッドセーフでないメソッドが追加されました。従来の名前に _async がつきます。

## begin_edit() と end_edit()

TextCommand として動作させる以外のシチュエーションで、begin_edit() と end_edit() が呼び出せなくなりました。

## ZIP パッケージ

Sublime Text 3 では .sublime-package のままプラグインを動作させます。Sublime Text 2 では、実行前に展開していました。

## モジュールのインポート

他のプラグインのインポートのやり方がシンプルになりました。例えば Packages/Default/Common.py をインポートする場合は、 import Default.comment とすればいいです。

## 起動時の API 使用制限

plugin_host は非同期で実行するので、若干の例外を除いて Sublime Text API はインポート時に使用できません。つまり、直書きで (関数の中でない場所に) sublime モジュールの関数を呼んではいけません。起動中は、API は休眠状態で、全てのリクエストはエラーを出すことなく無視されます。

### 起動時に使える API

* sublime.version()
* sublime.platform()
* sublime.architecture()
* sublime.channel()

### プラグインでの対応方法

plugin_loaded() の中に入れた処理は、API が使えるようになった後で呼ばれます。plugin_unloaded() の中に入れた処理は、プラグインのロードが解除される直前に呼ばれます。

とは言うものの、Sublime Text 2 でこれらのメソッドは呼び出されません。私はこのような感じで対応しました。

```Python:init.py
import sublime

def init_xxx():
	# ここにプラグインの初期化処理

# Sublime Text 2 向け
if sublime.version().startswith('2'):
	init_xxx()

# Sublime Text 3 向け
def plugin_loaded():
	init_xxx()
```
UIPageViewControllerで無限にループさせたい


UIPageViewControllerDataSourceでViewControllerを返すときに、先頭と末尾をくっつければよし。
XCodeのサンプルコードのModelController.mを↓とする。

```objective-c:ModelController.m

#pragma mark - Page View Controller Data Source

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = [self indexOfViewController:(DataViewController *)viewController];
    if( index == NSNotFound){
        return nil;
    }
    if (index == 0) {
        // 先頭に行ってたら最後のControllerを返す（＝ループ）
        index = [self.pageData count]-1;
    }else{
        index--;
    }
    return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = [self indexOfViewController:(DataViewController *)viewController];
    if (index == NSNotFound) {
        return nil;
    }
    
    index++;
    if (index == [self.pageData count]) {
        // 末尾に行ってたら先頭のControllerを返す（＝ループ）
        index = 0;
    }
    return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
```
Smarty側 で var_dump() 出力する方法

忘れがちなのでメモメモ。

```smarty:debug_print_var
{$array|@debug_print_var}
```
そのままでも出す方法はあるけど、セキュリティがTRUEだとダメみたい。

```smarty:var_dump
{$array|@var_dump}
```

どちらかできる方法で。
NginxとApache

###前提
通常WEBサーバーとしてApacheを使用している環境で、
Nginxをプロキシサーバーとしてフロントにたて、
Apacheをバックエンドにして、
処理を高速化するようにします。

私の環境は
CentOS 6.4
Apache 2.2.15
Nginx 1.0.15
です。

Apacheは既にインストール済みとします。

###mod_rpaf
Apacheモジュールのmod_rpafをインストールします。
mod_rpafについてはここが参考になるかと思います。
http://heartbeats.jp/hbblog/2012/03/mod-rpaf.html

ーーーーーーーーーー
sudo yum install -y httpd-devel

cd /usr/local/src/
sudo wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
sudo tar xvzf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6

Makefileの4行目あたりを編集する。
\#APXS2=$(shell which apxs2)  ←コメントアウト
APXS2=/usr/sbin/apxs         ←追記 

sudo make rpaf-2.0
sudo make install-2.0

sudo chmod 755 /usr/lib64/httpd/modules/mod_rpaf-2.0.so
ーーーーーーーーーー

###Nginx
Nginxをインストールして、プロキシサーバー設定をします。

ーーーーーーーーーー
sudo yum install -y nginx

バージョン確認
yum list installed | grep nginx
nginx.x86_64            1.0.15-5.el6    @epel

proxy用のconfファイルを作成
sudo vi /etc/nginx/conf.d/proxy.conf
以下を記載する
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

cd /etc/nginx/
sudo mkdir sites-available
sudo mkdir sites-enabled

nginx.conf の httpセクションに次の1行を加える。
include /etc/nginx/sites-enabled/*;

/etc/nginx/sites-available/{ドメイン名など適当な名前}
を作成し以下のようにヴァーチャルホストを設定
server {
    listen  80;
    server_name  .{ドメイン名}; 
　\#ドメイン名の前にドットが付いているのはすべてのサブドメインを対象としているため

　\#バックエンドサーバーのポートは8000としています
    location / {
        proxy_pass http://localhost:8000;
        proxy_redirect default;
        break;
    }
}

シンボリックリンクを作成
cd /etc/nginx/sites-enabled/
sudo ln -s ../sites-available/{ドメイン名など適当な名前}
ーーーーーーーーーー

###Apache
ポート変更とmod_rpafの読み込み設定をします。

※ポートはここでは8000に変更しています。
httpd.confの設定
まず、
Listen 80　やNameVirtualHost *:80　などport80を指定している箇所を8000にします。

次に、
VirtualHostの宣言の手前あたりに以下を記述しておきます。

\#Reverse Proxy
LoadModule rpaf_module /usr/lib64/httpd/modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.0.0.1
RPAFheader X-Forwarded-For

Apacheを再起動して、
通常のURLでアクセスできずに、ドメイン:8000　でアクセスできればOKです。

###最後に
Nginxを起動して、
sudo /etc/init.d/nginx start
指定ドメインにアクセスできればOKです。

グローバルで
ドメイン:8000でアクセスできてしまうので、
Apacheのhttpd.confで
Nginx(ローカルホスト)からのみ受け付けるように変更します。

これで完了です！
Jenkins Pluginを作成してみた。

Jenkins Pluginを作成/公開してみました。

[Call Remote Job Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Call+Remote+Job+Plugin)

Jenkinsから、リモートのJenkinsのタスクを起動できるプラグインです。
リモートのタスクが失敗すると、こちらのタスクも失敗で終わります。

複数チーム・複数プロダクトで出来上がるプロダクトを作るときにチームごとにJenkinsを分けて管理したい、とかいう時に使ってください。

で、Jenkinsプラグイン公開手順が、巷の情報や、本の情報だとうまく行かなかったので、ここで公開しておきます。

Jenkins Pluginのリリース中に
The git-clone command failed.
とか、
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.6:deploy (default-deploy) on project call-remote-job-plugin: Failed to deploy artifacts: Could not transfer artifact org.ukiuni.callOtherJenkins:call-remote-job-plugin:hpi:1.0.11 from/to maven.jenkins-ci.org (http://maven.jenkins-ci.org:8081/content/repositories/releases): Failed to transfer file: http://maven.jenkins-ci.org:8081/content/repositories/releases/org/ukiuni/callOtherJenkins/call-remote-job-plugin/1.0.11/call-remote-job-plugin-1.0.11.hpi. Return code is: 401, ReasonPhrase: Unauthorized. -> [Help 1]

的なログが出たら、このページは役に立つかもしれません。

では、リリース手順。

***
## 1. githubリポジトリを作ります。

https://github.com/ukiuni/call-remote-job-plugin な感じです。
ハイフン区切り、小文字が習慣だそうです。

上げるべきファイルは
/src
pom.xml

だけです。あとは適時。mvnプロジェクトですと、targetフォルダとかできてると思いますが、それは必要ありません。.gitignoreファイルで設定してください。サンプルは[こちら](https://github.com/ukiuni/call-remote-job-plugin/blob/master/.gitignore)

## 2. jenkinsci.orgのアカウントを作ります。
[こちら](https://jenkins-ci.org/account/)でアカウントを作成します。

## 3. ~/.m2/setting.xmlにjenkinsci.orgのアカウント情報を追記
こんな感じで、2でとったアカウントをsetting.xmlの末尾に入力します。

```xml:~/.m2/setting.xml
<settings>
 ・・・
  <servers>
    <server>
      <id>maven.jenkins-ci.org</id>
      <username>XXXXXX</username>
      <password>XXXXXX</password>
    </server>
  </servers>

</settings>
```

## 4. メーリングリストにお願いをする。
[日本Jenkinsユーザ会](https://groups.google.com/forum/#!forum/jenkinsci-ja)にお願いして、gitリポジトリのフォークと、jenkinsci.orgのコンポーネント追加をお願いします。
私がやったのは、[こんなかんじ](https://groups.google.com/forum/#!topic/jenkinsci-ja/DGc1srKswTc)でした。曽我部さん、ありがとうございました。

## 5. pom.xmlを修正する。
いくつか修正します。
<version>の中身、バージョン名の最後は-SNAPSHOTにします。
<scm>タグをルートに追加します。4でフォークしてもらったリポジトリを追記。

```xml:pom.xml（抜粋）
<scm>
    <connection>scm:git:ssh://github.com/jenkinsci/XXXXXXXX.git</connection>
    <developerConnection>scm:git:ssh://git@github.com/jenkinsci/XXXXXXXX.git</developerConnection>
    <url>https://github.com/jenkinsci/XXXXXXXX.git</url>
  </scm>
```

## 6. gitにssh接続できるように設定します。
.ssh/configに接続情報を追記します。

```xml:~/.ssh/config
Host github.com
  HostName github.com
  IdentityFile /Users/user/.ssh/github.key
  User XXXXX
```
/Users/user/.ssh/github.key　にはssh-genkeyで鍵を作って、chmod 600 して、githup.comに/Users/user/.ssh/github.key.pubをアップロードしておきます。
ssh git@github.comにアクセス（アカウントはgitのまま）して、
You've successfully authenticated, but GitHub does not provide shell access.
と表示されれば、OK.

## 7. リリースする。
mvnプロジェクトのある(pom.xmlのある)ディレクトリで、以下のコマンドを実行します。

mvn release:prepare release:perform
コツは-Dusernameと-Dpasswordをつけ「ない」こと。usernameとpasswordは本来jenkinsci.orgへの接続に使うものなのに、コマンドにつけちゃうと、github.comの接続にも使っちゃってビルドが失敗します。

以上で、無事リリースが完成します。
toStringメソッドを使ったカラーコード生成


```js:
function Color (r, g, b) {
    this.r = r;
    this.g = g;
    this.b = b;
}

Color.prototype.toString = function () {
     return "#"+((((0<<8)+this.r<<8)+this.g<<8)+this.b).toString(16);
};


var red = new Color(255, 0, 0);
console.log(red); //-> #ff0000

var blue = new Color(0, 0, 255);
console.log(blue); //-> #0000ff

var cadetblue = new Color(95, 158, 160);
console.log(cadetblue); //->#5f9ea0
```
javascript HTML templateエンジン Jade の4つの呪文を使いこなそうの巻

http://jade-lang.com/

https://github.com/visionmedia/jade#readme

jadeの文法ドキュメント、githubのreadme読めってちょっと雑なのでは…
なんか読みにくいので、日常的にテンプレートエンジンを使ってるよって人向けに、特徴的なところだけ把握しやすいようにまとめておく。

ここで一通りの機能がサンプルコードと共にライブデモで触れるようになってるらしいのでこちらもオススメ。
http://naltatis.github.io/jade-syntax-docs/

-----

# extends filename
上位テンプレートを指定して継承するための呪文。
多重継承もできる。

# block blockname, block prepend blockname, block append blockname
継承した先でblockを上書きしたり、前後に内容を追加したりするための呪文。
上位テンプレートでblock hogeと指定しておいた部分に、下位テンプレートでblock hogeを呼び出して上書きなどができる。

# include filename
部分テンプレートを指定して取り込むための呪文。

変数のスコープが暗黙的に継承されるのが特徴。

include指定されたファイルの拡張子に応じてmarkdownとかcssとかまったく別の文法のファイルや、生のHTMLファイルもincludeできるらしく、なんか便利なことができそうだと思った。
手動で更新するテキストまわりだけmarkdownファイルに分離しておけばプログラマ以外でも手軽に文言を更新できそうとかね。

# mixin name(arg1, arg2, ...)
任意の数の引数を持つ、名前付きの部分テンプレートをその場で定義するための呪文

引数は持たないことも可能。その場合単なるその場で定義できる名前付き部分テンプレートになる。

includeが変数のスコープを勝手に呼び出された場所のコンテキストにしてしまうのに対して、テンプレートに明示的に変数を引数として渡したいときに便利そう。

繰り返し部分の中身をpartial templateにしたい、みたいな要求は、ほとんどその場でのmixinに分けておく、で足りるんじゃないだろうか。
他のファイルでも使いまわしたい共通部分だけincludeを使うのがよさそうですね。

mixinを含むテンプレートをextendsやincludeしたらそのテンプレートでもmixinが使えるのかとか気になるけどそういう複雑なシチュエーションは特にドキュメントに書いてないのね。

-----

ほかにもcaseとかifとかeachとか色々あるけどそのへんは他のテンプレートでもよくある物なので割愛です。

-----
rails でのカバレッジレポート。

 simlecov, simplecov-rcov, coverails の設定をして、 test/test_helper.rb に次のように記載する。


    Coveralls.wear!
    
    # simplecov, rcov, coderails の３通りの書式でレポートを得る
    SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
      SimpleCov::Formatter::HTMLFormatter,
      SimpleCov::Formatter::RcovFormatter,
      Coveralls::SimpleCov::Formatter
    ]
    SimpleCov.start



ローカルマシンで  $ rake test とすれば
　　coverage/index.html        // simplecov の形式
　　coverage/rcov/index.html   // rcov の形式
github に commit すれば、  
　　coverails のレポート
を得ることができる。

サンプルアプリは github に置いた。 
https://github.com/katoy/rails3-blog2
PadrinoでBowerを使う

「[RailsプロジェクトにBowerを導入してHerokuへデプロイする](http://blog.qnyp.com/2013/05/30/say-hello-to-bower/)」という素晴らしい記事を見て、PadrinoでもBowerでアセット（画像とかCSSファイルとかJavaScriptファイルとか）を管理してみようと思いました。

苦労もしたので、書き留めておきます。

プラン
------

[Padrino::Sprockets](https://rubygems.org/gems/padrino-sprockets)を使うことにします。やっていることは簡単なので自分で書いてもいいくらいなのですが、書いたものをどこに置けばいいのか？という決断をする決断リソースがもったいないので、gemに頼っちゃいます。

パスの決定
----------
URI上のパスは、`/assets`以下で、アセットを提供することにします。

ファイルシステム上では、`/app/assets`以下をアセットとして提供して、Bowerで入れるコンポーネントは`/app/assets/components`にインストールすることにします。
Padrino::Sproketsのデフォルトは`Padrino.root`直下の

* `/assets/images`
* `/assets/javascripts`
* `/assets/stylesheets`

にアセットを置くようになっていますが、折角Padrinoがデフォルトで`/app/assets`をアセット置き場にしているので、そちらを使います。

最初は`public`以下にBowerのアセットをインストールしようと思ったのですが、READMEなんかのアセットとは関係ないファイルも見えるようになってしまうのと、階層が深くなてしまうのを嫌って、例えCoffeeScriptやSCSSのコンパイルがなくても、Sprocketsを通すようにしました。

アセットのインストール
----------------------
Bowerを使ってアセットをインストールします。

```json:bower.json
{
  "name": "bibid",
  "dependencies": {
    "bibi": "git://github.com/satorumurmur/bibi"
  }
}
```

```json:.bowerrc
{
  "directory": "app/assets/components"
}
```

    $ bower install

で、`app/assets/components`以下にアセットが入ります。

RubyGemsのインストール
----------------------
必要なgemをインストールします。

```ruby:Gemfile
# :
gem 'padrino-sprockets', :require => 'padrino/sprockets'
```

    $ bundle install --path=deps

アプリケーションの設定
----------------------
Padrino::Sprocketsの設定をします。

```ruby:app/app.rb
module Bibid
  class App < Padrino::Application
    # :
    # :
    
    register Padrino::Sprockets
    sprockets url:   'assets',
              root:  Padrino.root('app'),
              paths: %w[assets/components]
    
    # :
    # :
```

これで、例えば`http://localhost:3000/assets/bibi/bib/i.js`にアクセスすると、ちゃんとJavaScriptが表示されます。

---

なんか、書いてみると、簡単ですね、色々設定弄ったリソース読んだりして苦労したんですが……。
[CoffeeScript]TwitterAPIのcreated_atからDateオブジェクトを返す関数




```
	newDate_from_tweetCreatedAt = (created_at)->
		created_at = created_at.split ' '
		# 投稿日時変換 "Mon Dec 01 14:24:26 +0000 2008" -> "Dec 01, 2008 14:24:26"
		post_date  = created_at[1] + " " + created_at[2] + ", " + created_at[5] + " " + created_at[3]
		# 日時データ処理
		date = new Date post_date     # 日付文字列 -> オブジェクト変換
		date.setHours(date.getHours() + 9) # UTC -> JST (+9時間)
		return date
小ネタ：gemのexecutable directoryをPATHに追加したい


homebrewを使ってrubyを更新すると、その都度gemのExecutableDirectoryをPATHに追加する必要があります。めんどくさいので手抜きします。

```zsh:.zshrc
# =========
# Ruby(gem)
# =========
# Check "gem env" to EXECUTABLE DIRECTORY:
GEM_EXE_DIR=`gem env | grep "EXECUTABLE DIRECTORY" | awk '{print $4}'`
export PATH=$GEM_EXE_DIR:$PATH
```

```gem env```にExecutableDirectoryだけを出すオプションが欲しい。あったりするのかな？
PerlのTestCode（*.t）をvimで開いたときにPerlのSyntaxハイライトを有効にする

PerlでTestCodeを書いてるときにふと気がついたこと……
それは……

**vimでPerlのSyntaxハイライトがかかってない。**

なので、vimの設定をオーバーライトしてやりましょう。
$HOME/.vimに以下のファイルを置く。

```vim:filetype.vim
augroup filetypedetect
  au!
  au  BufRead,BufNewFile *.t     setf perl
augroup END
```

あとはvimを開き直すだけ。
簡単だね☆
Circle CIをカスタマイズしてテストからデプロイまで


前書いた記事。
Circle CIでテストにかかる時間を短縮 w/ Jenkins
http://qiita.com/tachiba@github/items/73a7052ff9316f1eb1ca

冷静に考えたらJenkinsいらないじゃんって気づいた。

--

## circle.yml

```circle.yml
machine:
  ruby:
    version: 2.0.0-p195

deployment:
  staging:
    branch: develop
    commands:
      - bundle exec cap staging deploy:setup
      - bundle exec cap staging deploy

  production:
    branch: master
    commands:
      - bundle exec cap production deploy:setup
      - bundle exec cap production deploy
```

ふつうにcapまで書いちゃえば良いじゃん.
いくつか設定しとかなきゃいけないところがあって、

### Circle CIのプロジェクトの設定から鍵を登録する

デプロイ先のサーバーに入る鍵を対で登録する

### デプロイ先のサーバーからリポジトリへアクセスするための鍵をdeploy.rbに書く

```ruby
set :ssh_options, {:keys => [File.join(ENV["HOME"], ".ssh", "github_no_kagi")]}
```

なんか、.ssh/configに書いてもうまくいかなかったので、こうなった。

デプロイのためにJenkins側でも環境を作るのって時間とリソースの無駄だし、スッキリした感じがある。

サーバーの鍵預けるのが不安じゃない方はアリでは？
gitのHEAD(ローカルスタート)

手順はちゃんと覚えてないのですが
gitを次の手順ですすめると、ローカルにHEADがない、カンジになってしまう様子。

1.サーバ(github/bitbucket)を作成
2.ローカルでファイル準備
3.git init
4.git remote add
5.git fetch/push

```shell-session:ブランチ構成
>git branch -a
 master
 origin/master
```

だけで、origin/HEADがないという状態になる。
サーバ側にはmaster->HEADの設定はされててもダメ。

なので以下で設定を行う。

```shell-session:HEAD設定
>git remote set-head origin master
```

気付くのに時間がかかったので、忘備録として。
初期はなんか色々ブランチ作ってマージしたりしてたので。
tigでコミットIDをクリップボードへコピーする

以下のような方法だとうまくいかなかった。

```:.gitconfig
[tig "bind"]
  main = C1 !@echo '%(commit)' | pbcopy
  main = C2 !@bash -c "echo -n '%(commit)' | pbcopy"
```

※ pbcopyはMacのコマンドなので適当に読みかえて下さい

以下のissueに一応の解決策が載っていました。
(なんか色々パッチを書いてる人がいるけど、取り込まれてはいない模様)

- [cannot bind complex external commands · Issue #65 · jonas/tig](https://github.com/jonas/tig/issues/65)

##解決案

以下のようにaliasを経由させるとうまくいきます。

```:.gitconfig
[alias]
  pbcopy = !printf "$1" | pbcopy

  ## 代案
  # pbcopy = !bash -c 'echo -n "$1" | pbcopy' --  # 上記issueに載ってた方法
  # pbcopy = !echo "$1" | pbcopy  # 末尾に改行が入っても良ければこれでも良い

[tig "bind"]
  main = C !@git pbcopy %(commit)
```

上記設定では、全て ``.gitconfig`` に書きましたが、tigの設定は ``.tigrc`` に書くこともできます。
お好みでどうぞ。

```zsh:.tigrc
bind main C !@git pbcopy %(commit)
```
蝶の大群とGPU　その１

ブログ書きました。
GPUのパワーで50万の蝶の挙動を60fpsで計算し、レンダリングします。
蝶個別にもアニメーションします。
現在研究中のため、詳細は追って公開予定です。

http://wowdev.jp/?p=593
ファイル名 & 行番号 & 関数名付きのログを出力するNode.jsモジュール (js & coffee 両対応)

以前からnpmに登録はしていたんですが、coffee-scriptがバージョン1.6.2からエラー時にcoffeeソース上の行番号も表示してくれるようになったので、coffeeソースにも対応したログ表示モジュールとしてバージョンアップしたついでにここで紹介させてもらおうかと思いまして。

```
npm install lwl
```
でインストールできます。

ソースはこちらです。 <https://github.com/ktty1220/lwl>

## サンプル

```js:sample.js
01  var lwl = require('lwl');
02
03  lwl.error('test');  // [1] 関数外で実行
04  function test() {
05    lwl.alert('テスト', 0.0005);  // [2] 関数内で実行
06  }
07  test();
08  var x = (function () {
09    lwl.warn([1, 2, 3, 4, 5]);  // [3] 無名関数内で実行
10  })();
```

上記JSファイルを実行すると、以下のようなログファイルが出力されます。

```text:lwl.log
2013-06-20 15:36:02 <anonymous>@sample.js:3 [error] test
2013-06-20 15:36:02 test@sample.js:5 [alert] テスト 0.0005
2013-06-20 15:36:02 <anonymous>@sample.js:9 [warn] [ 1, 2, 3, 4, 5 ]
```

デフォルトのログ出力フォーマットは

`タイムスタンプ` `関数名`@`ファイル名`:`行番号` [`出力レベル`] `メッセージ`

です。

関数外で実行された場合や無名関数内で実行された場合は関数名に`<anonymous>`が、`test()`関数内で実行された場合は関数名に`test`と入っているのが確認できます。クラスのメソッド内で実行した場合は`クラス名.メソッド名`と入ります。

coffee-scriptで実行した場合もちゃんとcoffeeソース上の行番号が入ります(ただし、バージョン1.6.2以上で実行した場合に限る)。

なお、以下の様に.js内から.coffeeソースをrequireして、その中でログ出力を実行した場合はcoffeeソース上の行番号を取得できません。現状では、coffeeソースの行番号が取得できるのはcoffeeコマンドで実行した場合に限ります。

```js:coffeeソースの行番号が取得できない例
require('coffee-script');
require('./test'); // test.coffeeをjs内でrequire
```

その他、ログフォーマットをカスタマイズしたり、ログ出力先をファイルではなく標準出力にするなど、アプリケーションのデバッグや運用時の問題解決の助けになる便利機能があります。詳しくは[GitHubリポジトリ](https://github.com/ktty1220/lwl)のREADME.mdを参照ください。
巨大森林リレーションの修正方法

OSMの日本地域では、巨大な森林リレーションが配置されていることがあります。
これは過去に国土数値情報 (KSJ2) からインポートされたデータなのですが、この森林データを編集する際、リレーションを壊してしまうことがよくあります。

ここでは、そのリレーションの修正方法を解説します。

## 壊れた森林リレーションの発見
森林リレーションが壊れている場所を見つけるのは簡単です。

OpenStreetMap.orgのデフォルトMapnikで、森林の描画がごっそりと無くなります。

どうやらこの地域は、リレーションが壊れているように見えます。

![スクリーンショット_2013_06_21_16_34.png](https://qiita-image-store.s3.amazonaws.com/0/9928/3cc37c9c-231c-6d01-a852-a7fa38e4bc60.png)

## リレーションメンバーのダウンロード
森林のウェイが本来存在していそうな部分にアタリをつけ、どこでもよいので、まずはJOSMで適当にOSMデータをダウンロードします。

ダウンロードしたデータの中に森林リレーション情報があればビンゴです！

JOSM右側のウィンドウに表示されているリレーション情報から、編集ボタンを押します。
リレーションの編集ウィンドウが開かれますので、オブジェクトIDを適当なエディタにメモしましょう。

![スクリーンショット_2013_06_21_16_36.png](https://qiita-image-store.s3.amazonaws.com/0/9928/7927fc34-d1c0-7423-ca8b-fb196b338b68.png)

## リレーションのダウンロード
JOSMのメニューから`ファイル`->`オブジェクトをダウンロード`を選択して、オブジェクト単体をダウンロードする画面を開きます。

![スクリーンショット_2013_06_21_16_17.png](https://qiita-image-store.s3.amazonaws.com/0/9928/b252bae5-427f-5704-a3f5-90face34089e.png)

オブジェクトのID番号を入力します。

この際、作業を行いやすくするため、別レイヤーとしてダウンロードすることをオススメします。

## メンバーの状態確認
ダウンロードしたリレーションの内容を検分します。

![スクリーンショット_2013_06_21_16_19.png](https://qiita-image-store.s3.amazonaws.com/0/9928/991edbdd-84ca-ac91-03c1-ced1affda580.png)

リレーションが壊れている場合、多くはリレーションメンバーが削除されるか、メンバーの並び順が間違った順番になってしまっています。
本来の森林リレーションは、以下の構成になっているはずです。

![貼り付けた画像_2013_06_21_17_08_1.png](https://qiita-image-store.s3.amazonaws.com/0/9928/4d24f6c8-013f-22ad-d857-76364597f671.png)

壊れてしまったリレーションを、この姿に戻す必要があります。

## メンバーの自動並び替え
修正にあたり、まずはおもむろに`メンバーの自動並び替え`を行います。

分割されているメンバーが自動的にいくつかの塊にまとめられ、ざっくりとではありますが、作業の下準備が整います。

![スクリーンショット_2013_06_21_16_20.png](https://qiita-image-store.s3.amazonaws.com/0/9928/96b394e4-1a36-cbc3-2eec-53715e088b19.png)

## 正しい順番へのメンバーの並び替え
`outer`のウェイが正しい順番となるよう、地道にメンバーの並び替えを行います。
![スクリーンショット_2013_06_21_16_21.png](https://qiita-image-store.s3.amazonaws.com/0/9928/f6793100-c371-f23e-c746-89f26dcf4b2b.png)

ウィンドウ左側のボタンを押すと、選択したメンバーの順番を上下に変更することができます。

![スクリーンショット_2013_06_21_16_21_2.png](https://qiita-image-store.s3.amazonaws.com/0/9928/a56ed64e-09e8-27f1-0e21-1c62fdf9ff3c.png)

本来あるべき位置のメンバーやウェイが存在しない(=誰かに消されてしまった)場合は、Bing等を参考にしてその部分を描画し、そのウェイをメンバーとして追加してください。

今回の場合、ウェイ接続が途切れている部分を確認したところ、ウェイの接続が途切れている箇所がありました。

![スクリーンショット_2013_06_21_16_22_1.png](https://qiita-image-store.s3.amazonaws.com/0/9928/3da60cf5-0589-4ca0-fe87-c9ecb0120f16.png)

ウェイを書き足して、繋ぎます。

![スクリーンショット_2013_06_21_16_24.png](https://qiita-image-store.s3.amazonaws.com/0/9928/d4b162f1-24c2-5ddd-9bb3-8a973d3fcba9.png)

もう一度リレーション情報の編集画面を開いて確認したところ、無事、`outer`のウェイが円周としてつながったようです。

![スクリーンショット_2013_06_21_16_25.png](https://qiita-image-store.s3.amazonaws.com/0/9928/273b4d8e-e265-4f80-4f50-b575d8450d25.png)

`outer`ウェイが正しく円周として配置されると、リレーションメンバーの順番表示が円として閉じられます。
この状態になれば、作業完了です。
OSMサーバへデータをアップロードしてください。

森林エリアの再描画は、対象エリアが広大なため、レンダリングに多少時間がかかることがあります。
場合によっては半日〜数日かかることがありますので、気長に待ってください。
redcarpetでMarkdownをHTML化

RubyのredcarpetでMarkdownをHTML化したのでメモ。

## redcarpetをインストール

```
gem install redcarpet
```

## コード

```rb:markdown2html.rb
require 'redcarpet'

markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)

puts markdown.render($stdin.read)
```

## コマンドラインで作成

```
ruby markdown2html.rb < markdown.md > index.html
```

## 参考サイト

- [Rubyで動くmarkdownパーサー|Redcarpet - むかぁ～ どっと　こむ](http://mukaer.com/archives/2013/06/03/rubymarkdownred/)
CakePHP $this->Auth->user('フィールド')が取得できない時にチェックすべきこと

# 要約

$this->Auth->login() に渡す引数は、配列の階層に注意！


# 現象

```php:ExamplesController.php
          （略）
    $id = $this->Auth->usesr('id');
          （略）
```

上記のコードでログイン中のユーザのIDを取得できていた。
が、別な場所をいじっていたら突然、上記のコードで ID が取得できたりできなかったりするようになった。
全く同じ行を通っているのに。

# 別な現象

調査中に、下のコードで2通りの出力が得られた。

```php:ExamplesController.php
          （略）
    $auth = $this->Auth->user();
    pr($auth);
          （略）
```

それぞれ↓

```php:結果1
Array
(
    [id] => 10
    [username] => tengu
    [password] => ????????????????????????????
    [status] => 0
    [created] => 2013-06-20 17:06:55
    [modified] => 2013-06-20 17:06:55
)
```

```php:結果2
Array
(
    [User] => Array
    (
        [id] => 10
        [username] => tengu
        [password] => ????????????????????????????
        [status] => 0
        [created] => 2013-06-20 17:06:55
        [modified] => 2013-06-20 17:06:55
    )
)
```

つまり、戻り値の配列の階層が違っているのだ。
結果1が得られる場合は、$this->Auth->user('id') でIDを取得できるが、結果2が得られる時はIDが取得できなかった。

# 原因

ログインする部分が2通りあり、それぞれに渡す引数の配列の階層が違っていたようだ。

```php:値取得がうまくいくログイン
      // 引数なし（ビューのフォームの値でログインする）
      $this->Auth->login();

      // または配列の第一階層に各フィールドが来るような引数
      $user = $this->User->findById(10); // ID=10のユーザでログイン
      $this->Auth->login($user['User']);
```

```php:値取得がうまくいかないログイン
      // 配列の第二階層に各フィールドが来るような引数
      $user = $this->User->findById(10); // ID=10のユーザでログイン
      $this->Auth->login($user);
```

Auth:login() は、とにかく渡した引数で認証したことにしてしまうので、階層や値は呼び出し側できちんと考えてやらないと。
Gitvで見ているコミットのページをgithubで開く

```vim:
" http://cohama.hateblo.jp/entry/20130517/1368806202
function! s:gitv_get_current_hash()
    return matchstr(getline('.'), '\[\zs.\{7\}\ze\]$')
endfunction

augroup Gitv
    autocmd!
    autocmd FileType gitv nnoremap <buffer> G :<C-u>Gbrowse <C-r>=<SID>gitv_get_current_hash()<CR><CR>
augroup END
```

上をvimrcに貼りつけておけば、gitvのファイルモードやブラウザモードで `G` を押したとき、選択されているコミットに対応したgithubのコミットページをブラウザで開いてくれる。

# 関連

- [tigで見ているコミットのページをgithubで開く - Qiita](http://qiita.com/yaotti/items/62947b0c981ae38fae82)
- [tig なんて目じゃない！ Git のログ系 Vim プラグイン gitv ＆ gitv をGit 統合インターフェース化する最強の設定 - 反省はしても後悔はしない](http://cohama.hateblo.jp/entry/20130517/1368806202)