OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP 2.xにTwitterBootstrap Pluginを導入する

#概要
slywalkerさんがGithubで公開しているTwitterBootstrap PluginをCakePHP2.xに導入する

参考
https://github.com/slywalker/TwitterBootstrap

BootstrapのCSSファイルをダウンロードするのではなく、READMEに従ってLESSからコンパイルして利用してみる

#前提
Linux環境へのインストールとする
Gitがインストール済みであること

#必要なソフトのインストール
##nvmをインストール
node.jsのバージョンが管理できると便利なので、今回はnvmを使用

```
git clone git://github.com/creationix/nvm.git ~/nvm
nvm/nvm.sh
```

##node.jsをインストール
nvmでnode.jsをインストールする
現在、v0.10.6が最新だったのでこのバージョンをダウンロード

```
nvm install v0.10.6
```

同時に、npmがインストールされ使用可能になる

##recessをインストール
npmでrecessをインストールする

```
npm install recess -g
```

##uglify-jsをインストール
npmでuglify-jsをインストールする
ただし、最新版だとこの後の作業がうまく通らなかったので旧版を使用

```
npm install uglify-js@1 -g
```

参考
https://groups.google.com/forum/?fromgroups=#!topic/twitter-bootstrap/cFy3J0nhfwM

#プラグインを配置する
ここからの作業は、README通り

参考
https://github.com/slywalker/TwitterBootstrap

##プロジェクトがGitで管理されている場合
サブモジュールとして取り込んでみる

```
cd <your_project>/app
git submodule add git://github.com/slywalker/TwitterBootstrap.git Plugin/TwitterBootstrap
git submodule update --init --recursive
```

##Gitで管理されていない/しない場合
クローンで取り込む

```
cd <your_project>/app/Plugin
git clone git://github.com/slywalker/TwitterBootstrap.git
cd Plugin/TwitterBootstrap
git submodule update --init
```

#Bootstrapのビルド
この作業により、BootstrapのLESSがコンパイルされて、CSSが生成される
前の手順でインストールしたツール群はこの作業のために必要

```
cd <your_project>/app
Console/cake TwitterBootstrap.copy
Console/cake TwitterBootstrap.make
```

#CakePHPの設定
##bootstrap.phpの編集
場所は"app/Config/bootstrap.php"
以下の一行を追加する

```
CakePlugin::load('TwitterBootstrap');
```

##AppController.phpの編集
場所は"app/Controller/AppController.php"
この変更により、全てのControllerにおいてプラグイン側のヘルパーを使用するようになる
一部のコントローラーのみで使用したい場合は、使用するコントローラーのみで以下の変更を加える

```
<?php
class AppController extends Controller {

    public $helpers = array(
        'Session',
        'Html' => array('className' => 'TwitterBootstrap.BootstrapHtml'),
        'Form' => array('className' => 'TwitterBootstrap.BootstrapForm'),
        'Paginator' => array('className' => 'TwitterBootstrap.BootstrapPaginator'),
    );

}
```
loose.py

----------

This function return a simple list made by aparted complex nested list recurringly.

```python:loose.py
def loose(st):
    """
    apart given nested list to one dimension list recurringly.
    """
    if isinstance(st, list):
        ret = []
        for s in st:
            ret += loose(s)
        return ret
    else:
        return st

if __name__ == "__main__" :
    a = [["1","1"],"1",["1",["1"],["1","1","1"],"1"],["1","1","1","1"]]
    print loose(a)
```

- caution

you must not use list involving expression.

- Example

```ipython
In [1]: import loose

In [2]: loose.loose(["2","3",["2",["1","1",["1","2","3"],"4"],"5"],"6"])
Out[2]: ['2', '3', '2', '1', '1', '1', '2', '3', '4', '5', '6']
```
Hibernate5を使ったJPA

Springを使わずに、Hibernate 5を使ったJPAによるコードを試し書きしてみた。

https://github.com/poad/examples/tree/master/hibernate-examples

Hibernate 5の場合、META-INF/persistence.xmlだけで済むようです。
Entityクラスを列挙する必要がないので、開発しやすそう
第11回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント : http://atnd.org/events/38770
をやります。

で。

これまで同様参考問題を出しました。
http://nabetani.sakura.ne.jp/hena/ord11arithseq/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思いますと思ったんですが、これはちと難しい気がしますので、当日はもっと簡単なのを出します。

参考にならなくてすいません。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますので出来ればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
libsの中のライブラリがあるのに使えない

libsに入っているプロジェクトが使えない。
使用しようとするとアプリ起動中にClassNotFoundExceptionが発生する。
ADT22から新しく出来た「Android Private Libraries」という参照の方法が増えたからが原因らしい。
プロジェクト＞プロパティ＞ビルドパス＞Order and Export＞Android Private Libraryの□にチェックを入れると有効になる。
これで使える様になって一安心。
どこからでも google 検索

一日に繰り返し繰り返し
「ブラウザを開く」-->「google検索窓をクリック」-->「検索」
のような行動をしていると、積もり積もって結構な無駄になっている気がしていたので、
よく使う検索の手間を省く AutoHotKey スクリプトを書いた。

下の例では「無変換キー」+「１」で google 検索用のダイアログ、
「無変換キー」+「２」で weblio 検索用のダイアログが表示され、
エンターキーを押すと firefox の新しいタブで検索結果が表示される。

スペース区切りで複数ワード検索をできるようにテキスト整形をしたのがちょっと頑張ったところ。

```ahk:
; プログラムショートカット
; google search
vk1Dsc07B & 1::
	InputBox, sword, Google くん, , , , 130
	if ErrorLevel <> 0
	{}
	else
	{
		NewStr := RegExReplace(sword, "\s+", "\+")
		Sleep 100
		Run, "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -new-tab "http://www.google.co.jp/search?hl=ja&lr=lang_ja&ie=UTF-8&q=%sword%"
	}
	return

; weblio search
vk1Dsc07B & 2::
	InputBox, sword, Weblio くん, , , , 130
	if ErrorLevel <> 0
	{}
	else
	{
		NewStr := RegExReplace(sword, "\s+", "\+")
		Sleep 100
		Run, "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -new-tab "http://ejje.weblio.jp/content/%sword%"
	}
	return
```
CakePHPでトランザクション

CakePHPでトランザクションを使う方法をネットで検索したところ、
古いバージョンばかりヒットするのでメモしておきます。

AppModel.phpに下記を追記します。

	function begin() {
		$dataSource = $this->getDataSource();
		$dataSource->begin($this);
	}

	function commit() {
		$dataSource = $this->getDataSource();
		$dataSource->commit($this);
	}

	function rollback() {
		$dataSource = $this->getDataSource();
		$dataSource->rollback($this);
	}

あとは、使いたい箇所で下記のようにするだけです。

	$this->Model->begin();
nginx1.4.1 + ngx_pagespeedをubuntuのapt管理下でソースインストール

Amazon EC2にて借りたmicroインスタンスに上記をインストールしてみます。
nginxとgoogleがリリースしたページ表示速度高速化モジュール,
ngx_pagespeedはソースインストールでしかnginxに入れ込むことはできず、
公式でも普通にコンパイルする方法でしか紹介してません。
が、aptにはソースインストールしたものを管理する機能があるらしく、試してみました。
これができると、依存関係で苦しまないで済む気がする！


nginx最新安定版をppaから取得できる状態にする

```bash
sudo aptitude install python-software-properties
sudo add-apt-repository ppa:nginx/stable
```

もろもろに必要なソフトをインストール

```bash
sudo aptitude update
sudo aptitude safe-upgrade
sudo aptitude install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip
```

nginxのソースをダウンロード（ここだけapt-getに注意）

```bash
mkdir ~/ngxsrc
cd ~/ngxsrc
sudo apt-get source nginx-full
```

ngx_pagespeedを持ってくる

```bash
cd nginx-1.4.1/debian/modules
wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.5.27.3-beta.zip
unzip release-1.5.27.3-beta.zip
cd ngx_pagespeed-release-1.5.27.3-beta/
wget https://dl.google.com/dl/page-speed/psol/1.5.27.3.tar.gz
tar -xzvf 1.5.27.3.tar.gz
```

ビルドオプションを記述する

```bash
cd ~/ngxsrc/nginx-1.4.1
nano debian/rules
```

nginx-fullをインストールするため、その箇所を編集
57行目に下記を追加（せっかくだからcache-purgeもインストール）
cache-purgeは既にパッケージの中に入っている

```text:
--add-module=$(MODULESDIR)/ngx_pagespeed-release-1.5.27.3-beta \
--add-module=$(MODULESDIR)/nginx-cache-purge \
```

>以下補足。
>Ubuntuのnginxパッケージでは、導入されるモジュールの数により、
>nginx-light, nginx-full, nginx-extrasと別れてます。
>普通は全部入りのnginx-extrasを導入すればいいのですが、
>私は軽量化のため、nginx-fullを指定してビルドオプションを編集しました。
>またnginx1.4で対応したので、「--with-http_spdy_module \」を追加してSPDYを有効化。
>あと、メールキャッシュサーバ機能は外しました。てか、みんな使ってる？
>「--with-mail \」「--with-mail_ssl_module \」を#でコメントアウト。

ビルド前に必要パッケージを揃えてからビルド
（ビルドはec2.microだと超時間かかる。1時間以上かも）

```bash
sudo apt-get build-dep nginx
sudo dpkg-buildpackage -b
```

生成されたdebをインストール

```bash
cd ..
sudo dpkg --install nginx-common_1.4.1-1ppa1~precise_all.deb nginx-full_1.4.1-1ppa1~precise_amd64.deb nginx_1.4.1-1ppa1~precise_all.deb
```

モジュールが入ったか確認してみる

```bash
nginx -V
```

「--add-module=/home/ubuntu/ngxsrc/nginx-1.4.1/debian/modules/ngx_pagespeed」が
出力結果に入っていたら成功！

/etc/nginx/nginx.conf 、/etc/nginx/sites-available/default などを
ご自身の環境に合わせ編集し、サービス再起動しましょう！
（apt管理外インストールだとinit.dも自分で用意せにゃならんから凄く面倒だった…）

```bash
sudo service nginx restart
```
Emacsで保存時にFirefoxのタブを探してリロード

[Emacs+Firefox+MozReplでファイルセーブと同時にリロード](http://d.hatena.ne.jp/hnw/20110506)の改良です。

EmacsでHTMLやCSSファイルなどを編集、保存した際に、Firefoxのドメイン名がlocalhostなタブを探し、切り替えてリロードしてくれます。

以下、適用方法です。

+ Firefoxに[MozRepl](https://addons.mozilla.org/ja/firefox/addon/mozrepl/)をインストールします。
 + メニューバー→ツール→MozRepl→Activate on startupをチェックしてFirefoxの起動と同時にMozReplを有効にするか、
 + メニューバー→ツール→MozRepl→StartでMozReplを有効にします。

+ [moz.el](https://raw.github.com/bard/mozrepl/master/chrome/content/moz.el)を`~/.emacs.d/`あたりに保存します。

+ 以下のコードを`init.el`に貼り付けます。

```scm
(require 'moz)

(defun auto-reload-firefox-on-after-save-hook ()
  (add-hook 'after-save-hook
            '(lambda ()
               (interactive)
               (comint-send-string (inferior-moz-process) "
function reload(){
  var i;
  for(i=0;i<gBrowser.browsers.length;++i){
    var host=gBrowser.getBrowserAtIndex(i).currentURI.host;
    if(host=='localhost')break;
  }
  if(i>=gBrowser.browsers.length)return;
  gBrowser.selectedTab=gBrowser.tabContainer.childNodes[i];
  BrowserReload();
}
reload();
"))))

(add-hook 'php-mode-hook 'auto-reload-firefox-on-after-save-hook)
(add-hook 'html-mode-hook 'auto-reload-firefox-on-after-save-hook)
(add-hook 'css-mode-hook 'auto-reload-firefox-on-after-save-hook)
```

`php-mode`、`html-mode`、`css-mode`のときに保存するとオートリロードしてくれますので適宜書き換えてください。
`set -e` しているときにコマンドの戻り値を得る

次の書き方だと `./xxx.sh` が 0 以外のときにそこで終了してしまうので case の後が実行されることはありません。

```bash
set -e

./xxx.sh $1

case $? in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end
```

一時的に `set +e` して戻り値を変数に入れてから `set -e` に戻す方法が考えられますがイマイチです。

```bash
set -e

set +e
./xxx.sh $1
ret=$?
set -e

case $ret in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end
```

次のようにすると上手くいきます。

```bash
set -e

./xxx.sh $1 &&:

case $? in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end
```

## 解説

`set -e` は `&&` や `||` でコマンドが繋げられた場合、リストの最後のコマンドが非 0 を返した場合だけ終了します。


`./xxx.sh` が 0 を返した場合、&& の後ろの `:` が実行されます。
`:` は何もせずに成功する組み込みコマンドなので、戻り値は 0 です。
よって `$?` は 0 です。

`./xxx.sh` が非 0 を返した場合、リストの最後ではないので `set -e` でも終了しません。
さらに `&&` で繋がっているので `:` は実行されません。
よって `$?` は `./xxx.sh` の戻り値そのままです。
I/O 2013のGoogle Apps Script Update その2 HtmlServiceのSandbox Mode

今回のアップデートで追加された機能で割と素敵なのが
HtmlServiceのSandboxModeです。

今回はこのSandboxモードについて書きます。
なお、細かい話は後半に書きます。

# Sandboxモード

Sandboxモードは二種類あります。

* EMULATED
* NATIVE

HtmlServiceはなにも設定しないとEMULATEDモードで動きます。

## Sandboxモードを設定する

Sandboxモードを設定するにはHtmlServiceから作成できる、
HtmlOutputのsetSandbocMode()メソッドを使います。

```javascript:SandboxModeの設定.js
function doGet(e){
  return HtmlService.createHtmlOutput('').setSandboxMode(HtmlService.SandboxMode.NATIVE);
}
```

## SandboxMode.NATIVEを設定するとどうなるの？

単純に書くと、
問題が起きるかもしれないけど、
一部のブラウザでJSの実行速度が上がり、
使えなかったライブラリが一部使えるようになり、
うまく動かなかったCSSが動くようになります。

何それ素敵

# なんで？

それを説明するにはいろいろな話をする必要があります。

## HtmlServiceの問題点

HtmlServiceはGASのUIとして、HTMLやJS,CSSを使うことができ、
素敵そうに見えるのですが、いくつかの問題点があります。

* 既存のクライアントサイトのJSライブラリの一部(というかかなりの数)が使えない
* CSSも、かなりの設定が使えない
* クライアントサイドJSが遅い

嫌になりますね。
これらの問題は、ほぼ一つの理由により発生しています。

それは
***cajaを使ってるから***

## cajaって？

簡単に言うと(というより難しい話知らん)、
JavaScriptやCSS,HTMLをよりセキュアに実行するための仕組みです。

JS内にある危険なコードなどを上手いこと動かないようにして、
ユーザにとって安全なwebサービスを利用出来るようにしています。

## cajaは何をしてる？

かなり色々やってます。

* JS、CSS、HTMLを解析して危険なコードがある場合は除去したり、エラーを出す
* それらを安全な形に変換する

ほかにもたくさん。

## なんで遅くなったり問題が出るの？

この変換の部分にかなり時間がかかっているのと、
変換後のスクリプトが色々なチェックが入っていて遅くなるようです。

またECMAScript3(ES3)しか対応していないブラウザをECMAScript5(ES5)に対応させる変換する処理を行なっています。
しかもES5が動くブラウザに対しても強制的にこれを実行してます。

## NATIVEモードでやってる事

NATIVEモードではこのES3からES5に対応される処理をES5に対応していない
ブラウザのみ実施し、
ES5に対応しているブラウザでの無駄な変換処理や、上書き処理を減らしています。

これにより無駄がなくなり早くなるようです。
※他にもやってるみたいですが

また制約も緩やかになるため、使えるライブラリも増えるようです。

# まとめ

携帯から書いたので乱文になりましたが
とりあえず、NATIVEモードを使ってみて下さい。

なお、実験的な機能なので使う場合は自己責任でお願い致します。
Node.jsのconsole.logで%09dみたいなフォーマットをしたいとき

[前の記事](http://qiita.com/items/b3f9ab63c63e9e6399e6)を書いている途中で気づいたのですが、Node.jsの `util.format` はC言語の `printf` にある `%09d` のようなフォーマットを使えません。`console.log` は `util.format` を使っているので、必然的に `console.log` もです。
ただ使えないのも困るし、しかもnpmでざっと調べてもめぼしいライブラリが見つからないので、とりあえず前の記事で使った手法をさらしておきます。
__すみません、嘘です。普通にnpmから入れられるライブラリありました。__
__というわけで下のものはただのJSのテクニックになります。（大したものじゃない…。__

```javascript:zero-padding.js
/**
 * 数値を0で敷き詰める
 * @param {Number} n 数値
 * @param {Number} length 文字列の長さ
 * @return {String} n の桁数が length に満たない分を 0 で敷き詰めた文字列
 */
function zeroPadding(n,length){
  n = '' + n; //string cast
  return length + 1 - n.length > 0 ? Array(length + 1 - n.length).join('0') + n : n;
}
```

間に合わせに作ったのでかなり手抜きかつ `n` が小数だったときがアレなのですが大体の場合はこれでどうにかなるのではないでしょうか？

どなたかちょうどいいライブラリ見つけたら教えてください。
__↑ @Layzie@Github 様に [sprintf-js](https://npmjs.org/package/sprintf-js) というライブラリを紹介していただきました。__
__フォーマットの引数にオブジェクトを渡して、プロパティ名でフォーマット上からアクセスできたり等、ちょっとしたテンプレートエンジン並の機能を持っているみたいです。__
__きちんとした `sprintf` が必要なときには使ってみてください。__
Camera.takePicture()でシャッター音が鳴らない

AndroidのCameraクラスを使ってカメラの機能を実装しててドハマりした。
何故かEXPERIAでシャッター音が鳴らない。Galaxyだと鳴る。
そもそもCamera.takePicture()で撮影する場合はシャッター音の制御ができなくて、ググってもシャッター音が消せないという書き込みが多くて、鳴らないってのは無かった。

原因はtakePicture()の引数のShtterCallbackにnullを設定していたため。
何もしないSutterCallbackを渡すと鳴る。

なんだこの仕様は
sbt LibraryDependencies

何となく書き方がわかったのでメモ

<pre><code>
scalaVersion := "2.9.2"
libraryDependencies ++= Seq(
	"org.apache.commons" % "commons-lang3" % "3.1",
	"commons-io" % "commons-io" % "2.4",
        "commons-logging" % "commons-logging" % "1.0.4",
        "uk.ac.ed.ph.snuggletex"%"snuggletex-core" % "1.2.2",
        "uk.ac.ed.ph.snuggletex"%"snuggletex-upconversion"  %"1.2.2",
        "uk.ac.ed.ph.snuggletex"%"snuggletex-jeuclid" % "1.2.2",
	"org.specs2" %% "specs2" % "1.12.3" % "test"
)


resolvers ++= Seq(
  "snapshots" at "http://oss.sonatype.org/content/repositories/snapshots",
  "releases" at "http://oss.sonatype.org/content/repositories/releases",
  "www2.ph.ed.ac.uk-releases" at "http://www2.ph.ed.ac.uk/maven2"
)
</code></pre>
なbuild.sbt があるとすると、LibraryDependenciesの％は/を、%%はscalaVersionを含む事を示す。両方とも.は/に変換される。
つまり<code>sbt update</code>したときのトライアルにresolversが追加されるが、そのサイトの後ろが%の場合は
<code>org/apache/commons/...</code>
%%の場合は
<code>org/apache/commons-2.9.2/...</code>
などのように続く。
もしうまくダウンロードされない場合は、上記のルールでサイトにパブリッシュされているかを確認すればいい。
Gruntのgrunt-execプラグインでNODE_ENVを指定してそれに応じて設定ファイルを読み込む


`npm install config --save`
ってやるとconfigモジュールがインストールされる。

これは./configディレクトリ以下のファイルを読むので、そこに各環境ごとに必要な設定ファイルをyamlなどで書いておく。


```coffeescript:Gruntfile.coffee
module.exports = (grunt) =>

    beforeEnv = (cmd)->
        return (env) ->
            if env?
                command = 'NODE_ENV='+env+' '+cmd
            else
                command = cmd
            console.log "exec : ", command, "\n"
            return command

    grunt.initConfig
        pkg: grunt.file.readJSON('package.json')

        exec:
            hoge:
                cmd: beforeEnv('node dest/main.js -arg huga')
                stdout: true

    grunt.loadNpmTasks('grunt-exec')

```

```coffeescript:main.coffee
config = require('config')
console.log "main.js config : ", JSON.stringify(config), "\n"

console.log process.env.NODE_ENV
```

以上のようなファイルを書いておくと、

`grunt exec:hoge:myenv` と実行した時、
`NODE_ENV=myenv node dest/main.js -arg huga` というコマンドが実行されて
`config/myenv.yaml` が読み込まれる。

これをつかえば設定をちょっとだけ変えたコマンドを実行したい時に、
`cp config/myenv.yaml config/yourenv.yaml` したあと編集して 
`grunt exec:hoge:yourenv` とすれば簡単に読み込む設定ファイルが変えられる。


NODE_ENVにこんな風に好き勝手な文字列を設定していいものなのかはよくわからないが、
マズかったらconfigファイル名を引数に応じて指定するようなコマンドにすればよさそう。
CompassでCSSスプライト（Retina対応）

Compassプロジェクトにimages/spritesフォルダを作成
素材画像をPNG形式で、表示サイズの2倍で作成しておく

```scss
@import "compass/css3/background-size";

$map: sprite-map("sprites/*.png", $layout: smart);
$map-img: sprite-url($map);

@mixin sprite-background($name, $text: false) {
    display: inline-block; // block;

    width: image-width(sprite-file($map, $name)) / 2;
    height: image-height(sprite-file($map, $name)) / 2;
    background-image: $map-img;
    background-repeat: no-repeat;
    $pos: sprite-position($map, $name);
    background-position: (nth($pos, 1) / 2) (nth($pos, 2) / 2);
    @include background-size(ceil(image-width(sprite-path($map)) / 2) auto);

    @if not $text {
        vertical-align: top;
        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
        font: 0/0 a;
        text-shadow: none;
        color: transparent;
    }
}
```

使い方

```scss

.hoge {
    @include sprite-background("hoge"); // images/sprites/hoge.png
}
```
文字列から1文字取り出す

```
mb_substr( $str, $n, 1 ) //マルチバイト対応
substr( $str, $n, 1 )
$str[$n]
$str{$n} //PHP6で廃止予定
```

**参考**
[PHP: 文字列 - Manual](http://php.net/manual/ja/language.types.string.php#変数のパース)
Android SDK を最新の r22 にしたら、Xamarin.Android でビルドできなくなった件


[Google I/O 2013](https://developers.google.com/events/io/) で[いろいろ発表](http://japanese.engadget.com/2013/05/15/google-i-o-2013/)があったので、試してみたくなるのがエンジニアってもんでしょう。

## 2013.5.19 追記
Xamarin.Android の 4.6.6 で Android SDK r22 に対応したので、この記事は無意味になりました。

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

アップデート後、r22 でも無事ビルドできるようになりました。

## 1.Eclipse のエラー

Keynote から一夜明け、Android SDK を r22 に更新しました。
するとまず、昨日までビルドできていた Java の Android のプロジェクトがビルドできなくなりました。

この症状は、こちらのツイート:

<blockquote class="twitter-tweet" lang="ja"><p>状況・ライブラリプロジェクトを使用・r22 でビルドが死んだ対策・SDK Build-tools を入れた（antは復旧）・&lt;classpathentry combineaccessrules="false" kind="src" path="/hoge"/&gt; 追加</p>&mdash; dmpさん (@dmp) <a href="https://twitter.com/dmp/status/334839819781955586">2013年5月16日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

に加えて、[Eclipse の ADT Plugin](http://developer.android.com/sdk/installing/installing-adt.html) を更新することで解決できました。(私の場合、``<classpathentry〜`` は行わなくても大丈夫でした。［勝手に追加されてました］)

## 2.Xamarin.Android のエラー

やれやれと思ったところで、こんなツイートが。

<blockquote class="twitter-tweet" lang="ja"><p>I know you are all eager to try the new stuff but since Google shuffled some binaries in the latest SDK, it breaks Xamarin.Android for now</p>&mdash; Jérémie Lavalさん (@jeremie_laval) <a href="https://twitter.com/jeremie_laval/status/334879715611529217">2013年5月16日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

「Google が SDK の場所を替えたので、Xamarin.Android は今壊れてる(意訳)」とのことです。

マジで？と思って、試してみると確かにビルド時にエラーががが。

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

> Error: Error executing tool '/…/android-sdk-macosx/platform-tools/aapt': 

## そして回避へ

先のトラブルで、「SDK Build-tools が新しく追加された」=「今までの場所にはもうない」、つまり、エラーになっているのは aapt(Android のパッケージ作成ツール) が意図した場所に存在しないからでは？と考えられます。

というわけで、 aapt はどこへ行ったのか、Android SDK のフォルダを Finder(エクスプローラ)で覗いてみます。

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

むう、確かに ``/platform-tools`` の中には ``aapt`` は存在せず、代わりに ``/build-tools/17.0.0`` の中にあります。

Xamarin Studio の設定で、aapt の場所を /build-tools に変更できれば良かったのですが、残念ながら見つけられず、仕方ないので ``/build-tools/17.0.0`` 配下のファイルとフォルダを、 ``/platform-tools`` にコピーしました。

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

そして Xamarin Studio に戻り、もう一度ビルドを実行、無事ビルドできました。

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

近いうちに Xamarin さん側で対応してくれると思いますが、それまでのつなぎとして。
GitHubのパスフレーズを省略するコードをconfig置いても大丈夫にした

この記事( https://help.github.com/articles/working-with-ssh-key-passphrases )のスクリプトを改良してみました。

これでconfigを置いていてもssh-addが動くはず。

会社ではMysysGitとCygwin上で自分でコンパイルしたGitのために使っています。

普通にSSH使う場合も便利かもしれない。

※複数のHostで使うキーをConfigに指定していた場合不具合を修正しました。

```bash
#! /bin/bash

SSH_CONFIG="$HOME/.ssh/config"
SSH_ENV="$HOME/.ssh/environment"

# start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."
    # spawn ssh-agent
    ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
    echo succeeded
    chmod 600 "$SSH_ENV"
    . "$SSH_ENV" > /dev/null
    add_key
    if [ $? -ne 0 ]; then
        echo "[Error] Fail to add_key..."
        stop_agent
        return 1
    fi
}

function stop_agent {
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -ne 0 ]; then
       return 1
    fi
    echo "Stop Agent..."
    echo "PID:$SSH_AGENT_PID"
    rm $SSH_ENV
    kill $SSH_AGENT_PID
    SSH_AGENT_PID=
    return 0
}

function add_key {
    echo "Adding keys."
    local ssh_add_cmd=""
    if [ -f "$SSH_CONFIG" ]; then
        echo "Search config"
        ssh_add_cmd=`cat $SSH_CONFIG |
                     grep "IdentityFile" |
                     sed -e "s/IdentityFile/ssh-add/g ;
                             s/[ 	]\+/ /g ;
                             s/ ~/ ${HOME//\//\\/}/"`
    fi

    if [ "$ssh_add_cmd" = "" ]; then
      echo "ssh-add with default keys."
      ssh-add
      if [ $? -ne 0 ]; then
          return 1
      fi
      return 0
    else
      echo "config found. ssh-add with your setting keys."
      echo $ssh_add_cmd | bash
      return 0
    fi
    return 1
}

# test for identities
function test_identities {
    # test whether standard identities have been added to the agent already
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $? -eq 0 ]; then
        add_key
        # $SSH_AUTH_SOCK broken so we start a new proper agent
        if [ $? -eq 2 ];then
            start_agent
        fi
    fi
}

# check for running ssh-agent with proper $SSH_AGENT_PID
if [ -n "$SSH_AGENT_PID" ]; then
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
        test_identities
    fi
# if $SSH_AGENT_PID is not properly set, we might be able to load one from
# $SSH_ENV
else
    if [ -f "$SSH_ENV" ]; then
        . "$SSH_ENV" > /dev/null
    fi
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
        test_identities
    else
        start_agent
    fi
fi
```
oh-my-zshで文字化け

環境

OS: Mac OS X Versin 10.8.3
terminal: iTerm2 Build 1.0.0.20130319
shell: zsh 4.3.11

```sh:.zshrc
source $ZSH/oh-my-zsh.sh
```

の箇所をコメントアウトすると文字化けが直る。

oh-my-zshを不活性にした状態で環境変数を見る

$ env
LC_CTYPE=

LC_CTYPEあたりが怪しい。

$ cd .oh-my-zsh
$ ack LC_CTYPE
ib/misc.zsh
15:export LC_CTYPE=$LANG

$ export LC_CTYPE=UTF-8
としたら、なおった。
指定月の月末日を取得する

#BASH
```bash
YEAR=2014
MONTH=12
date -d${MONTH}/01/${YEAR}-1days+1month '+%Y%m%d'
```
>
```text:結果
20141231
```

#PYTHON
```Python
from datetime import date, timedelta
from dateutil.relativedelta import relativedelta
year = 2014
month = 12
print date(year, month , 1) + relativedelta(months=1) + timedelta(days=-1)
```
>
```text:結果
2014-12-31
```
Google Play Gameのサンプルを動かす

# 概要
* 5/15にGoogle I/Oで発表されたGooglePlayGameServiceのサンプルアプリを動かしてみました。

# 手順
## Sample プログラムをClone
* 以下のGithubからcloneします。
 * https://github.com/playgameservices/android-samples

## Google Play Service SDKをダウンロード
* Android SDK Managerでダウンロードします。
 * Extra->Google Play servicesを見つけて下さい。

## 3つのプロジェクトファイルをEclipseにImport
* 上記の手順で取得したコードをEclipseにImportします。
* Importには「New」->「Android Project from Existing Code」から行います。
* BaseGameUtils、TypeANumberをImportします。
* 次にgoogle-play-services_libをImportします。
 * これのコードはAndroid SDKの「extras/google/google_play_services/」にあります。

## プロジェクトファイルの操作
* 3つのプロジェクトをそれぞれビルドまで行える状態にします。

### BaseGameUtils
* プロジェクトの「Preference」で、「is Library」にチェックを付けます。
* 参照プロジェクトに「google-play-service_lib」プロジェクトを指定します。

### TypeANumber
* プロジェクトのパッケージ名を独自の名前に変更して下さい。
 * AndroidManifestと、srcのパッケージ名を変更
 * この時、公開出来ないパッケージ名は使用しないで下さい。
  * 「com.google」, 「com.example」, 「com.android」
* 参照プロジェクトに「BaseGameUtils」プロジェクトを指定します。
* 参照プロジェクトに「google-play-service_lib」プロジェクトを指定します。
* 「java build path」に「google-play-services.jar」を追加
 * 「google-play-service_lib」プロジェクトのlibsフォルダにあります。
* AndroidSupportLibraryV4関連のエラーが発生している場合は、libsフォルダにSupportLibraryを追加、「java build path」でjarを追加指定して下さい。

## Google Developerでアカウントの設定
* [Developer Console](https://accounts.google.com/ServiceLogin?service=androiddeveloper&passive=1209600&continue=https://play.google.com/apps/publish/&followup=https://play.google.com/apps/publish/)を開く
* 既にゲームを公開している人には不要なので割愛

## ClientIDの発行
* 「GOOGLE PLAY ゲーム サービス」を選択、「新しいゲームを追加」をクリックして下さい。
 * 色々と規約の同意を求められますが、Agreeで。
* パッケージ名はEclipse上で変更した、TypeANumberのパッケージ名を使用して下さい。
* SHA1の箇所は、debug.keystoreから生成したものを使用します。
 * 「keytool -exportcert -alias androiddebugkey -keystore .android/debug.keystore -list -v
 * debug.keystoreを使用する場合は、パスワードは「android」

## アプリケーション
## Achievement(実績)の設定
* 「OMG U R TEH UBER LEET!」はhiddenにチェックを。
* 「Bored」と「Really Really Bored」には増分実績にチェックを付け、10と100に設定する。
* 各Achievementに写真を設定する。
* 設定するAchievementは以下の通り

| 名前 | 説明 |
|:--|:--|
| Prime | Get a score that's a prime number.|
| Humble| Request a score of 0.|
| Don't get cocky, kid|Request a score of 9999 in either mode.|
|OMG U R TEH UBER LEET!|Receive a score of 1337.|
|Bored|Play the game 10 times.|
|Really Really Bored|Play the game 100 times.|

## Leaderboardの設定
* 「Easy High Scores」と「Hard High Scores」の2個を追加する。

## ID関連の設定
* 発行されたClientID、AchievementID、LeaderboardIDを設定します。
* 設定する先は「TypeANumber」プロジェクトのres/values/ids.xmlとなります。

# 注意点&詰まった点
## Google+にSignInしようとすると「Unknown Error」が表示される
* Google Developer Console上のアプリケーションが公開状態になっていないと発生しました。
Rails4.0.0.rc1 exception_notificationエラー


## エラーメッセージ

```
rails s
----------
/Users/shu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0.rc1/lib/active_support/core_ext/class/attribute_accessors.rb:40:in `block in cattr_reader': invalid class attribute name: true (NameError)
----------
```

## 対処

※`exception_notification v4.0.0`がおそらくRails4.0対応版になると思われる、現在はGitHubのmasterブランチを直接指定する

Gemfile

```rb
gem 'exception_notification', github: 'smartinez87/exception_notification'
```

config/initializers/exception\_notification.rb

```rb
AppName::Application.config.middleware.use(
  ExceptionNotifier,
  email_prefix:         "[#{Rails.env}][Site Name] ",
  sender_address:       "xxxxx@gmail.com",
  exception_recipients: ["xxxxx@gmail.com"]
)
```

config/environments/development.rb

```rb
  # メール設定
  config.action_mailer.default_url_options   = { host: '0.0.0.0:3000' }
  config.action_mailer.delivery_method       = :smtp
  config.action_mailer.perform_deliveries    = true
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.smtp_settings         = {
    address:              "smtp.gmail.com",
    port:                 587,
    user_name:            "xxxxx@gmail.com",
    password:             "xxxxxxxxxx",
    authentication:       'plain',
    enable_starttls_auto: true,
  }
```

* 手動送信

```rb
    begin
      raise
    rescue Exception => exception
      ExceptionNotifier.notify_exception(exception, env: request.env, data: { msg: "エラーテスト" })
    end
```
Illustratorでステッカーを作るときのカットライン作成手順メモ

作業はIllustratorで行う。

* 図版の輪郭のパスを選択
* 効果 > パス > パスのオフセット
* ラウンド、2mm プレビュー
* オフセットするとパスが外側と内側にできるので分割
* オフセットしたパスを選択
* オブジェクト > アピアランスを分割
* 分割されたパスの内側を削除
* あとはアンカーポイントの数を40以内などに調整して入稿
Node.jsではforEachでなくasync.eachを使おう

node.jsは非同期で処理を進めることで有名ですが、ちょっとややこしいとこまで、非同期で処理してしまい、ちょっとハマったのでメモ。

やりたいこと
配列の中身を使用した文を作成して、ファイルに書きこむ

まあ単純に考えるとこんな感じで実装します。

```javascript
var fs = require('fs');
var a = [1,2,3,4,5,6,7,8,9,10];
var sent = '';

a.forEach(function(num){
    sent += 'hello world: ' + num + '\n';
});

fs.writeFile('hello.txt', sent, function(err){
    if(err) throw err;
});
```

実際にhello.txtの中身は
hello world: 1
hello world: 2
hello world: 3
（以下、省略）
でした。
うん、いい感じですね。

しかし、forEachの中身の処理に時間がかかっちゃう時、
（今回は擬似的にsetTimeout()を使用して以下のように実装）

```javascript
var a = [1,2,3,4,5,6,7,8,9,10];
var sent = "";

a.forEach(function(i){
    setTimeout(function() {
        sent += 'hello world: ' + i + '¥n';
    }, 5000);
});

fs.writeFile('hello.txt', sent, function(err){
    if(err) throw err;
});
```

この結果はなんとhello.txtは空っぽなんですねー。
非同期処理の影響でファイル書き込みが先に行われるみたいです。

それでは困る！！

この問題はasyncというモジュールを使えば解消されます。
asyncは非同期処理になってしまうNode.jsの特性を例外的に同期処理するために使われるモジュールです。
このモジュールのeachという機能を使えば処理1が終わった後に、処理2を実行するということがコールバックを駆使して指定ができます。
こんな感じ

```javascript
var fs = require('fs');
var async = require('async');
var a = [1,2,3,4,5,6,7,8,9,10];

var sent = "";
async.each(a, function(i, callback){
    // 処理1
    setTimeout(function() {
        sent += 'hello world: ' + i + '\n';
        callback();
    }, 5000);

}, function(err){
    //処理2
    if(err) throw err;

    fs.writeFile('hello.txt', sent, function(err){
        if(err) throw err;
    });
});
```

見事hello.txtにも正常に出力されました。
Node.jsにおいてforEachに限らずループは想定外の状態になる恐れがあるので、僕はasync.eachをオススメします。


2013/05/17 追記
kaminaly さんよりご指摘がありまして、非同期処理になるのは`setTimeout`を使っているからだとご指摘ありました。
実際に`setTimeout`の代わりにforを大量にまわすだけの処理に変えたところ、問題なくファイル出力されました。
非同期になるきっかけは「処理に時間がかかるもの」ではなく、非同期メソッドを使うか否かのようです。どういうのが非同期メソッドなのかは後日調べます。
なので、ループを使う時は非同期メソッドに気をつけよう！ということです。
ros groovyの環境を作る

ubuntu 12.04

[ここ](http://www.ros.org/wiki/groovy/Installation/Ubuntu)を参考に

```sh 
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu precise main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-get install ros-groovy-desktop
sudo rosdep init
rosdep update
sudo apt-get install python-rosinstall
rosws init ros/groovy
```

.bashrcに`source ~/ros/groovy/setup.bash`を追加
Android Studio.app導入に際しての作業

[Android Studio][1]のOS X版は、Android Studio.app/sdkとしてAndroid SDKを内蔵しています。これは、言い換えればいままでHomebrewなどで導入していたAndroid SDKは不要になったということです。また、古いAndroid SDKを使っているとエラーになるという話も聞いています（どうエラーになるのかまでは確認していません）。

そこで、Android Studio.app導入に際してはHomebrewのandroid-sdkを置き換えることを前提とし、以下の手順を踏むことにしました。

1. Homebrewで入れたSDKをアンインストールします。
2. /usr/local/opt/android-sdk（Cellerへのシンボリックリンク）を外して/opt/android-sdkを（/Applications/Android Studio.app/sdkへのシンボリックリンクとして）新設します（/usr/local/optはHomebrewが使っているため、避けた方がよいと判断しました）。
3. /etc/launchd.confの環境変数```ANDROID_SDK_ROOT```を設定しなおします（launchdのsetenvは空白を含む引数を許容しません。すなわち```setenv ANDROID_SDK_ROOT /Applications/Android Studio.app/sdk```という設定はできないということです。「```"..."```」でくくることも出来ない様子です）。
4. OS Xを再起動します。
5. ~/.bashrcでPATHを通します。


## 1. Homebrewで入れたSDKをアンインストールします。 ##

```
h12o@Exegesis:~$ brew uninstall android-sdk
h12o@Exegesis:~$ 
```


## 2. /usr/local/opt/android-sdkを外して/opt/android-sdkを新設します。 ##

```
h12o@Exegesis:~$ rm -f /usr/local/opt/android-sdk
h12o@Exegesis:~$ sudo ln -s '/Applications/Android Studio.app/sdk' /opt/android-sdk
h12o@Exegesis:~$ ls -ld /opt/android-sdk
lrwxr-xr-x  1 root  admin  36  5 16 11:31 /opt/android-sdk -> /Applications/Android Studio.app/sdk
h12o@Exegesis:~$ /opt/android-sdk/android
h12o@Exegesis:~$ 
```

最後に「/opt/android-sdk/android」を起動したら、SDKをインストールしなおす必要があります。


## 3. /etc/launchd.confの環境変数```ANDROID_SDK_ROOT```を設定しなおします。 ##

各自好きなエディタで/etc/launchd.confを編集します。以下のようになっていれば問題ありません。

```
h12o@Exegesis:~$ grep 'setenv ANDROID_SDK_ROOT' /etc/launchd.conf
setenv ANDROID_SDK_ROOT /opt/android-sdk
h12o@Exegesis:~$ 
```


## 4. OS Xを再起動します。 ##

（手順は省略）

## 5. ~/.bashrcでPATHを通します。 ##

```sh:.bashrc
if [ -d "${ANDROID_SDK_ROOT}" ]; then
    for SUBDIR in tools platform-tools; do
        TOOLDIR="${ANDROID_SDK_ROOT}/${SUBDIR}"
        if ! greppath "${TOOLDIR}" "${PATH}" 2>&1 > /dev/null; then
            PATH="${TOOLDIR}:${PATH}"
        fi
        unset TOOLDIR
    done
fi
```

「greppath」については『[関数「greppath」を作って、環境変数PATHにパスが含まれていない時だけPATHにパスを追加する][2]』を参照してください。

  [1]: http://developer.android.com/sdk/installing/studio.html
  [2]: http://qiita.com/items/2a4dc1d6862da2af0972
ケース・スタディ：js2coffee で変換不可な記述と対処

javascript コードを js2coffee で変換しても動作するコードは出力されない事がある。
手直し例を記録しておく。
 
動作する javascript コードとその実行結果
---------------------------------

    $ cat 1.js
    function x() {
        self = this;
        self.v = 1;
        w = 2;
        self.sub = function(y) {
            console.log("y=" + (y + w));
        };
    };
    xx = new x();
    console.log("xx.v=" + xx.v);
    
    $ node 1.js
    xx.v=1
    y=5

js2cofee で変換して、実行してみた結果
---------------------------------

    $ js2coffee 1.js > 10.coffee
    $ coffee 10.coffee
    
    $ cat 10.coffee
    xx.v=undefined
    TypeError: Object function (y) {
          return console.log("y=" + (y + w));
        } has no method 'sub'
      at Object.<anonymous> (/Users/youichikato/zzzz/10.coffee:9:1, <js>:19:6)
      at Object.<anonymous> (/Users/youichikato/zzzz/10.coffee:21:4)
      at Module._compile (module.js:456:26)
    
    $ cat 10.coffee
    x = ->
      self = this
      self.v = 1
      w = 2
      self.sub = (y) ->
        console.log "y=" + (y + w)
    xx = new x()
    console.log "xx.v=" + xx.v
    xx.sub 3


実行させるとエラーが発生している。
次のように coffeescript コードを編集することで、実行可能になる。

編集した coffeescript コードと、その実行結果
------------------------------------

    $ cat 11.coffee
    class x
      v : 1
      w = 2
      sub : (y) ->
        console.log "y=" + (y + w)
    xx = new x()
    console.log "xx.v=" + xx.v
    xx.sub 3
    
    $ coffee 11.coffee
    xx.v=1
    y=5
mediawiki スニペット


mediawikiでよく使用する項目をまとめました

```見出し
= h1 =
== h2 ==
=== h3 ===
=====h4 ====
====== h5 =====
```
```整形しない
<pre>
入力したママ
</pre>
```
```リンク
インターネット
[http://sample.com/ internetリンク表示名]

Wiki内
[[hoge/インフラ/memcached]]
[[hoge/インフラ/memcached|memcached]]
```
```テーブル
{| class="wikitable"
|+ タイトル
! 内容1 !! 内容2 !! 内容3
|-
! 内容1
| 内容2 || 内容3
|}

{| class="wikitable" style="text-align:center"
|+ タイトル
! 内容1 !! 内容2 !! 内容3
|-
! 内容1
| 内容2 ||  style="text-align:center" | 内容3
|}
```
```UL要素
* ul 要素の表示

# ol 要素の表示
## ol + ol の表示
#* ol + ul の表示
```
```コードハイライト
<syntaxhighlight lang="php">
<?php echo "php"; ?>PHP風ハイライト
</syntaxhighlight >

<syntaxhighlight lang="html4strict">
<html><body>HTML風ハイライト</body></html>
</syntaxhighlight >
```
.rvmrcから.ruby-gemsetと.ruby-versionに移行

rvmのversionを1.20.9にしたら、warningが出た。

```bash
You are using '.rvmrc', it requires trusting, it is slower and it is not compatible with other ruby managers,
you can switch to '.ruby-version' using 'rvm rvmrc to [.]ruby-version'
or ignore this warnings with 'rvm rvmrc warning ignore /Users/prinum/.rvmrc',
'.rvmrc' will continue to be the default project file in RVM 1 and RVM 2,
to ignore the warning for all files run 'rvm rvmrc warning ignore all.rvmrcs'.

```
　
調べてみると、rbenv等のrubyのrubyのveision管理ツールでも.ruby-versionでrubyのversionを切り替えることが出来るらしいです。
tool間での互換性をあげるためにそうするようになったようです。
.ruby-gemsetはrvmにおいて、gemsetを切り替えるために必要なようです。

.rvmrcがあるdirectoryで以下のコマンドを打つことによって、.rvmrcを元に、.ruby-gemsetと.ruby-versionを生成するようです。

```bash
$ rvm rvmrc to .ruby-version
```

```bash:.rvmrc
rvm 1.9.3-p125@hoge --create
```

```bash:.ruby-version
ruby-1.9.3-p125
```

```bash:.ruby-gemset
hoge
```

.rvmrcはshellコマンドを実行することが出来るので、自動で実行させたいコマンドがあるなら使用すると良いようです。

```bash:.rvmrc
#bundlerが入ってなかったら、bundlerをinstallする。
if ! command -v bundle ; then
  gem install bundler
fi
```

***
参考サイト
[Use rvmrc or ruby-version file to set a project gemset with RVM?](http://stackoverflow.com/questions/15708916/use-rvmrc-or-ruby-version-file-to-set-a-project-gemset-with-rvm)

[rvmrc files](https://rvm.io/workflow/rvmrc/)

----

次のコマンドで`.ruby-version`と`.ruby-gemset`が作成される。
作成した上でそのgemsetを選択する。

もしすでに`.ruby-version`と`.ruby-gemset`があったら古いのは別名を付けられてバックアップされるので既存のものを上書きして消すことはない。

```
rvm --create --ruby-version use ruby-2.1-head@appname
rvm gemset list

gemsets for ruby-2.1-head (found in /Users/daichi/.rvm/gems/ruby-2.1-head)
   (default)
=> appname
   global

```

```:.ruby-version
ruby-2.1-head
```

```:.ruby-version
appname
```
Git blameを使って効率の良い犯人探し（ｗ

リリース後にバグが発生！！
誰の修正が原因なのか、

見つけた！
「hoge.txt」ファイルの修正が原因っぽい。

でも、そこはAさんと、Bさんの修正が混ざってるけど。

そんなときに以下のコマンドを実行！

```bash
git blame ファイル名
```

すると、

7b64c3aX (Asan  2013-03-08 09:31:18 +0900 51)     def hoge
7b64c3aX (Bsan  2013-03-08 09:31:18 +0900 51)       p hogehoge
7b64c3aX (Bsan  2013-03-08 09:31:18 +0900 51)       p bug
7b64c3aX (Asan  2013-03-08 09:31:18 +0900 58)     end

行ごとにコミッターの名前が表示されました。

「あっ、Bさんの修正が原因だ！」

となり、

Bさんに修正依頼をして

無事に解決。

めでたし、めでたし。
Android Studio

Google I/O 2013で発表されましたね。

[Getting Started with Android Studio](http://developer.android.com/sdk/installing/studio.html)

レイアウトxmlを編集すると即プレビューが見られたりする点は良いですね。
eclipseと比べると違う点も多いので慣れるには時間がかかりそうです。。。
タグファイル(tags)を使ってみる


## インストール

CentOS の場合

```
sudo yum install ctags-etags
```



## 作成する
```
$ /usr/local/bin/ctags -f gems.tags --totals -R /path/to/rvmroot/.rvm/gems/ruby-1.9.3-p125
$ /usr/local/bin/ctags -f tags --totals -R .
```

## vimで使う
|キー      |説明                          |
|---      |---                           |
|&lt;C-]> |カーソル位置の関数にジャンプ       |
|&lt;C-t> |直前に戻る                      |
|g&lt;C-]>|複数候補から選択してジャンプ       |
|&lt;C-w>}|カーソル位置の関数の定義をプレビュー|
|&lt;C-w>&lt;C-]>| 画面を分割して新しいバッファで開く|
git のcommit/merge/checkoutなどのタイミングでctagsを実行するフックスクリプト



.git/hooks 配下に以下のようなスクリプトを post-commit というファイル名で作成。実行権限を与える。

```sh:.git/hooks/post-commit
#!/bin/sh
/usr/local/bin/ctags -f tags -R `pwd`
echo "*** Update tags by git hook script."
```

同様の内容で、post-merge, post-checkout という名前でファイルを用意する。

## 注意

mac の場合 `brew install ctags` でインストールすること

参考: [Vim - ctagsと連携するように環境を構築する - Qiita](http://qiita.com/soramugi/items/f918020c2b3f48c93bf3)


## 参考
- [Git - Git フック](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)

- [A script for generating TAGS from a git hook.](https://gist.github.com/42308)
PhpStormの便利機能

Sublime Text2からPhpStormに乗り換えて二ヶ月、だいぶ慣れてきたので便利だと思うところを。

PHP歴がまだ半年ほどなので、他の統合開発環境はちゃんと使った経験ないんですが、周りの人の意見を聞く限りではPhpStormが一番手間なく便利な環境になるのではないかと思ってますが……。

自分は、VM上のDebianにLinux版のPhpStorm, apache, xdebug, phpunit, gitで開発しているので他の環境だと若干違う部分があるかもしれません。

## Xdebugとの連携
[Xdebug](http://xdebug.org/)と連携してステップ実行、変数の参照が可能。これは素晴らしく便利。

Xdebugはもちろん導入しないといけませんがpeclで一コマンド、設定は基本的にphp.iniにXdebug周り + PhpStormを使用するマシンのIPを書いておくだけ。
(*) php.iniはapache経由用とphpunit用にcliのもの、など複数あるかもしれません

あとは

1. Settings -> xdebugで検索、出てくる設定項目に全部チェック入れる 
1. Run -> Start Listen PHP debug connections
1. ブラウザでリクエスト送ると初回はソースのマッピングについて聞かれるので適当に設定する

で使えるようになるはずです。

ソースのマッピングはきちんと設定できるので、Linuxサーバー上で動いているものをWindows上のPhpStormからネットワークディレクトリ上のファイルを編集しつつリモートデバッグ実行、も可能です。

ただ、xdebugでリモートデバッグ実行をenabled、IPを間違えて設定するとすさまじくphpの実行が遅くなるので注意。

xdebugはプロファイルの取得も超絶便利なので絶対インストールしたい。

## gitとの連携
gitのリポジトリを設定すると状態を把握してきちんと連動してくれる。

自分は基本的にgitコマンドで運用してますが、alt + 9でmodifiedのファイルだけリストアップしたり、diffが見やすいのでリリース前にブランチ間の比較したり、というところでは使ってます。あまりコマンドが好きでなければPhpStormのGUIだけでgitの運用するのも不可能ではない、かもしれない。

## ファイルの指定
Ctrl + nでクラス名、Ctrl + Shift + nファイル名、どちらも覚えてる名前の一部を入力してくだけでインクリメントに補完して候補を表示してくれる。Sublime Text 2 のCtrl + pに近い機能。ただ、ファイル名の場合、ファイル名とディレクトリはきちんと区別しないといけないのでそこはSublime Text 2の方が好みの動きだった。

これ以外にも、現在のファイルのパスを利用して色々他のファイルを開いたり、Projectペインの中を移動できたり、細かいところでファイラーが使いやすい。

phpのログもtail -fを下のペインで実行させておいて、エラーが出たらログ内のソースファイル名 + 行番号をクリックで該当箇所に移動とかできる。ただ、これはマッピングを聞かれた記憶がないので、php実行してるマシンとPhpStormの動いているマシンが同じでないと難しいかもしれない。

## viっぽい操作モード
エディタ変えるたびに基本的なコマンド覚えたり、キーマップを変更したりするのが面倒なので個人的には必須。ideavim導入すればだいたい違和感なく使えます。

[key promoter](http://plugins.jetbrains.com/plugin?pr=idea&pluginId=1003)というpluginを導入すると、マウスで操作するたびにショートカットを表示してくれるが、ideavim入れてると違ってたりする。

## PhpUnitとの連携
Alt + Shift + F10でテスト実行 -> ソース変更 -> Ctrl + Shift + F10でテスト実行 -> ソース変更、とウィンドウ移動せずに無限ループできるので便利。

## その他
Ctrl + クリックで定義への移動、メソッド定義等コメントのひな形の生成、各種refactor系の機能とかも便利だけど書ききれない。

 [reddit:I just got PHPStorm. I love it. What are some great hacks and practices worth knowing?](http://www.reddit.com/r/PHP/comments/1dzggz/i_just_got_phpstorm_i_love_it_what_are_some_great/)にも色々書いてあって知らない機能が結構あった。Local Historyとか。
ssh 経由で Mac のクリップボードにコピー

ssh でログインしているサーバから Mac のクリップボードにコピーする。

## Mac 側の設定

下記のファイルを ~/Library/LaunchAgents/pbcopy.plist に設置

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>localhost.pbcopy</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/pbcopy</string>
  </array>
  <key>inetdCompatibility</key>
  <dict>
    <key>Wait</key>
    <false/>
  </dict>
  <key>Sockets</key>
  <dict>
    <key>Listeners</key>
      <dict>
        <key>SockServiceName</key>
        <string>52224</string>
        <key>SockNodeName</key>
        <string>127.0.0.1</string>
      </dict>
  </dict>
</dict>
</plist>
```

launchctl load ~/Library/LaunchAgents/pbcopy.plist でサービス化しておく。
ポート 52224 でサービス待ち受け。サービス名は localhost.pbcopy
Mac 上で動作チェック

```sh
$ telnet localhost 52224
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
^]
telnet> ^D
Connection closed.
```

で Mac のクリップボードに 「hello」が入っていれば OK。

ssh 経由で使用出来るようにするため ssh_config の設定を行っておく。

```
Host *
  RemoteForward 52224 localhost:52224
```

## サーバ側の設定

サーバ側に下記のようなスクリプトをパスの通ったところに入れておくと幸せ。

```sh
#!/bin/sh
cat "$@" | nc localhost 52224
```

## 使用例

ssh ログイン先で、このように使用する。

```sh
$ pbcopy test.rb # Macのクリップボードに test.rb の中身がコピーされる
$ hostname | pbcopy # 同上
```
how to get the information of the vertices from a Primitive in Away3D 4.1


```as3
const geom     : PrimitiveBase   = new PlaneGeometry(100, 100, 10, 10),
      vertices : Vector.<Number> = ISubGeometry(geom.subGeometries[0]).vertexData;
       
for (var i : int = 0, l : int = vertices.length; i < l; )
{
    const 
        // position
        vx : Number = vertices[i++],
        vy : Number = vertices[i++],
        vz : Number = vertices[i++],
        // normals
        nx : Number = vertices[i++],
        ny : Number = vertices[i++],
        nz : Number = vertices[i++],
        // tangents
        tx : Number = vertices[i++],
        ty : Number = vertices[i++],
        tz : Number = vertices[i++],
        // primary uv
        pu : Number = vertices[i++],
        pv : Number = vertices[i++],
        // secondary uv 
        sv : Number = vertices[i++],
        sv : Number = vertices[i++];
}
```
paper.jsの利用例色々

http://paperjs.org/examples/
本家サイトの例

http://chatttr.com/
ベクター形式の画像チャット

Olympics medals vs Gdp per Capita
http://morning-dusk-1472.herokuapp.com/
夏季オリンピックのメダルの数の可視化

Twitter Connections Before and After Eyeo 2012
http://semilattice.net/eyeodiff/
イベント前後でのtwitterのつながりの変化を可視化
詳細はこちら　http://semilattice.net/projects/before-and-after-eyeo/

https://www.snsreaalfonds.nl/
オランダ語なので何のサイトかよくわからないけれど、ヘッダー部分に使われてる

今年のgoogle.ioのサイトにも使われていたはずだけどリンクが見つからなかった。
解説記事
http://www.html5rocks.com/en/tutorials/casestudies/google-io-2013/
SQLite3で三角関数や対数関数を使う

SQLite3では原則四則演算しか処理できないため、細かい分析をしにくいのが難点。

そこでSQLite.orgのContributed Filesからextension-functions.cを使って、三角関数や対数関数などの計算ができるようSQL関数を拡張します。

extension-functions.cで使用可能となる関数は以下の通り。


> Math: acos, asin, atan, atn2, atan2, acosh, asinh, atanh, difference, degrees, radians, cos, sin, tan, cot, cosh, sinh, tanh, coth, exp, log, log10, power, sign, sqrt, square, ceil, floor, pi. 
>String: replicate, charindex, leftstr, rightstr, ltrim, rtrim, trim, replace, reverse, proper, padl, padr, padc, strfilter.
> Aggregate: stdev, variance, mode, median, lower_quartile, upper_quartile.


##シェアードライブラリの作成

まず、以下のサイトからsqlite-amalgamation-3071602.zipとextension-funcutions.cをダウンロードします。zipは解凍してちょんまげ。

sqlite-amalgamation-3071602.zip：SQLite Download Page
http://www.sqlite.org/download.html

extension-functions.c：Contributed Files
http://www.sqlite.org/contrib


次にextension-functions.cの置いてあるフォルダで以下のコマンドを実行し、シェアードライブラリlibsqlitefunctions.soを作成します。"path"にはsqlite-amalgamation-3071602のパス（sqlite3ext.hの置いてあるフォルダのパス)を指定。

```console:Terminal
gcc -shared -I "path" -o libsqlitefunctions.so extension-functions.c
```

extension-functions.cをsqlite-amalgamation-3071602のフォルダにコピーし、そこでライブラリを作成するのが一番楽だと思います。

##シェアードライブラリをSQLite3で使用する

libsqlitefunctions.soを読み込むことで、以後、前述の関数が使用できるようになります。ただし一度対話モードを終了させると再度読み込みが必要。

ライブラリの読み込みは以下のようにすればOK。

```sqlite3con
sqlite> select load_extension("libsqlitefunctions.so");
```

または

```sqlite3con
sqlite> .load libsqlitefunctions.so;
```

ライブラリを読み込んだ後で以下のように打ち込んで、

```sqlite3con
sqlite> select cos(radians(45));
0.707106781186548
```

と返ってきたら成功。

##シェルスクリプトでの使い方

SQLite3はシェルスクリプトを用いて、

```bash
sqlite3 -option hoge.db "select fuga, hogefuga from fugahoge ; " >piyo.txt
```

などといった形でデータベースから値を引き出せますが、load_extensionに相当する
オプションが存在しないようなので、下記のように`EOF`を使って結果を得る他ないみたいです。もっとスマートな方法とかあるのかな･･･？

```bash
sqlite3 hoge.db <<EOF
.output piyo.txt
select load_extension("libsqlitefunctions.so");
select fuga, log(hogefuga) from fugahoge;
.q
EOF
```

***
MacなどではSecurity ConsiderationsとかでSQLiteの拡張機能が無効になっている場合があるらしいのですが、その辺りの解決方法はよくわからず･･･。参考の[sqlite - Loadable Extensions](http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions)や[Python標準ライブラリリファレンス 12.6](http://docs.python.jp/3.3/library/sqlite3.html)一番下の記述などがヒントになる･･･かなぁ･･･？
***


###参考文献
sqlite - Loadable Extensions
http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions

シェアードライブラリを使用してSQLiteに独自関数を追加する方法
http://pgkiss.web.fc2.com/sqlite/addOriginalFunc.html

※sqlite3_enable_load_extensionに関して
Python標準ライブラリリファレンス　12.6. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース
http://docs.python.jp/3.3/library/sqlite3.html
Treasure Data で "昨日1日分" の集計をする

`TD_TIME_RANGE()` を使えば、前日分を簡単に集計できます。

### TD_TIME_RANGE とは

TD で定義されている hive の UDF です。

http://docs.treasure-data.com/articles/udfs#tdtimerange

    boolean TD_TIME_RANGE(int/long unix_timestamp,
                          int/long/string start_time,
                          int/long/string end_time
                          [, string default_timezone = 'UTC'])


`TD_TIME_RANGE()` には、`対象の schema, start, end` を指定します。
対象の schema には、 td がログに入れた時間を保持している `time` schema を、start と end には、その日の最初の時間と最後の時間を指定します。ちなみに start と end は `(start_time <= time && time < end_time)` と展開されるため、end_time は含みません。

### 「前日1日分の集計」

というわけで、前日の 00:00:00 から 当日の 00:00:00 までを集計するには、以下のような条件を WHERE 句に追加します。

    TD_TIME_RANGE(time,
        TD_TIME_FORMAT(TD_TIME_ADD(unix_timestamp(), '-1d'), 'yyyy-MM-dd 00:00:00', 'JST'),
        TD_TIME_FORMAT(unix_timestamp(), 'yyyy-MM-dd 00:00:00', 'JST'),
        'JST'
    )

これを用いると、例えば、**昨日一日のPV** などは、以下の様に取得できます。

    SELECT
        count(*)
    FROM
        access_log
    WHERE
        TD_TIME_RANGE(
            time,
            TD_TIME_FORMAT(TD_TIME_ADD(unix_timestamp(), '-1d'), 'yyyy-MM-dd 00:00:00', 'JST'),
            TD_TIME_FORMAT(unix_timestamp(), 'yyyy-MM-dd 00:00:00', 'JST'),
            'JST'
        )

`td scheds` を使ってスケジュール登録して日次で PV 集計を行う場合 `unix_timestamp()` を `TD_SCHEDULED_TIME()` にするだけですね。

### 備考

ちなみに `time` に対して `TD_TIME_RANGE()` 関数を使うと、td の実行速度が速くなるというメリットがあります。Treasure Data は upload されてきたログデータを、`time` をベースに時間でパーティショニングして保存しているため、解析に用いるログデータの取得を必要な分だけに抑えられるからです。

参考:

* [Supported UDFs (User Defined Functions)](http://docs.treasure-data.com/articles/udfs#tdtimerange)
* [Performance Tuning](http://docs.treasure-data.com/articles/performance-tuning)
__toString()でExceptionが発生すると死ぬ

```php
<?php
class Hoge {
  function __toString() {
    throw new Exception;
  }
}

try {
  $hoge = new Hoge;
  echo $hoge;
} catch (Exception $e) {
}
```

try ～ catchで拾っているので動作しそうなコードに見えるけれど、実行すると
PHP Fatal error:  Method Hoge::__toString() must not throw an exception
となって死ぬ。

Exceptionぐらい発生してもええやん！！と思うのだが実装が難しいのだとかナントカ。
https://bugs.php.net/bug.php?id=53648

とりあえず今の段階では__toString()の内部にtry {} catch()を書いて自衛するしかない。
JenkinsのGit Pluginで特定のbranchへのpushを無視する

JenkinsのGit Plugin 1.3.0 以降ではbranchの指定に正規表現が使えます。
否定先読み使ってbranchの除外ができます。

----

GitLabにpushされたらJenkinsでbuild通ることを確認したいのだけど、とはいえ「お試しbranchでbuildコケたからといって赤くなるとpushする(人|機会)が減りそうでイヤだなー」「特定branchだけ無視できないかなー」と思ってgit pluginのソース読んでたらなにやら[素敵なコード](https://github.com/jenkinsci/git-plugin/blob/git-1.3.0/src/main/java/hudson/plugins/git/BranchSpec.java#L83-L87)が！

どうやらこのpull reqで入ったようです。素晴らしいですね！！
[support for using regex directly in BranchSpec if spec string starts with colon.](https://github.com/jenkinsci/git-plugin/pull/138)

## 設定例

さっそく `Branches to build > Branch Specifier (blank for default):` を↓のように設定してみました。

```
:^(?!(origin/spike/)|(origin/experiment/)).*
```

ワーイ！これでどんなヒドいコードを書いても `spike/XXX` とか `experiment/XXX` みたいなbranchにpushすれば Jenkins氏は見て見ぬ振りしてくれるようになったよー＼(^o^)／

### 今日の反省

* ソース読むまでもなく[Changelog](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin#GitPlugin-Changelog)のVersion 1.3.0のとこに書いてある
* まずヒドいコードを直したい
* 正規表現力足りなくてすごいベタな書き方になった
* 無視branchの片っぽがexperimentなのはlain厨だから
プロダクトコードを変更せずにrails-footnotesとbetter_errorsのリンク(txmt://open...)をSublime Text 2で開けるようにする。

正確にはTextMateのurl scheme( `txmt://` )をSublime Text 2で開くようにする方法。

## 設定

> [ruby on rails - How can I make rails_footnotes open files using Sublime Text 2? - Stack Overflow](http://stackoverflow.com/questions/9435075/how-can-i-make-rails-footnotes-open-files-using-sublime-text-2?answertab=active#tab-top)

↑基本的には上の通り

- TextMateが入っていなければ入れる
- [asuth/subl-handler · GitHub](https://github.com/asuth/subl-handler)を導入
- [Rubicode - RCDefaultApp](http://www.rubicode.com/Software/RCDefaultApp/)を導入
- System Preferences > DefaultAppsのURLsタブでtxmt=>**SublHandler**を選択
- [ここをクリックしてテスト](txmt://open/?url=file:///etc/hosts)

### 関連
> [rails-footnotesとbetter_errorsのリンクをRubyMineで開けるようにする。 #Ruby #Rails - Qiita [キータ]](http://qiita.com/items/3faadd7a1b6c7fd88e3b)