OmniAICreator/Qiita-1.07M huggingface dataset:
play.api.libs.json.Jsonを使ったJsonシリアライズ（とデシリアライズ）

scala周りはまだまだ発展途上なのかすぐに情報が陳腐化してしまい、ググッた情報が「ププッ　今どきそれやらねーよ」というのがしばしば。
Json周りはライブラリがたくさんあってよくワカランチンです。

- [json4s](https://github.com/json4s/json4s)
- [sjson](https://github.com/debasishg/sjson)
- [lift-json](http://dispatch-classic.databinder.net/Lift+JSON.html)
- [jakson](https://github.com/FasterXML/jackson-module-scala)
- [play.api.libs.json](http://www.playframework.com/documentation/2.2.1/api/scala/index.html#play.api.libs.json.Json$)

時期による流行りなのか、人の好みなのか意見が分かれていてなんとも・・・。

まぁ、Play使ってるんだし標準のplay.api.libs.jsonパッケージでいいか、というお話です。

公式のドキュメントはこちら。
http://www.playframework-ja.org/documentation/2.1.5/ScalaJsonCombinators

## object Jsonをつかってシリアライズ／デシリアライズ

やりたいのは case class をJSONシリアライズ／デシリアライズ（マーシャリングって言ったほうがいいの？）したいってことで、

- Json#toJson でシリアライズ
- Json#fromJson でデシリアライズ

が基本のようです。

## Writes ,Reads を定義

[JSONIC](http://jsonic.sourceforge.jp/)のようにリフレクションを使ってよろしくやってくれるのかというとそうでもない。（sjsonはリフレクションでやるらしいが細かいこと見てない。）
ということで変換ルールを定義してやらなければならないようだ。

公式ドキュメントによると、

```scala:case_class
case class Creature(name:String,isDead:Boolean,weight:Float)
```

```scala:Reads
import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val creatureReads = (
  (__ \ "name").read[String] and
  (__ \ "isDead").read[Boolean] and
  (__ \ "weight").read[Float]
)(Creature)  
```

```scala:Writes
import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val creatureWrites = (
  (__ \ "name").write[String] and
  (__ \ "isDead").write[Boolean] and
  (__ \ "weight").write[Float]
)(unlift(Creature.unapply))
```

こんな感じでimplicitなreads,writesをスコープ内に宣言せよと。

## …なんかめんどくせーよ

こ、これっていいの？？ 何かDAOをめんどくせーなーと思いながら実装したあの日々が…。

と思ったらですね、

```scala:Json.scala
def reads[A]: Reads[A]
def writes[A]: Writes[A]
```

こんなのがあるんですよ。単純なReads,Writesなら生成してくれるようでホッとしました。

```scala:writesの例
scala> implicit val creatureWrites = Json.writes[Creature]
creatureWrites: play.api.libs.json.OWrites[Creature] = play.api.libs.json.OWrites$$anon$2@55093b47

scala> Json.toJson(Creature("Cow",true,456))
res73: play.api.libs.json.JsValue = {"name":"Cow","isDead":true,"weight":456.0}
```

```scala:readsの例
scala> implicit val creatureReads=Json.reads[Creature]
creatureReads: play.api.libs.json.Reads[Creature] = play.api.libs.json.Reads$$anon$8@4fcee80f
scala> val strJson = """
     | {"name":"Zombi","isDead":false,"weight":30.5}
     | """
strJson: String =
"
{"name":"Zombi","isDead":false,"weight":30.5}
"
scala> Json.fromJson(Json.parse(strJson))
res82: play.api.libs.json.JsResult[Creature] = JsSuccess(Creature(Zombi,false,30.5),)
```

## JsResult

fromJsonを使った場合、[JsResult](http://www.playframework.com/documentation/2.2.1/api/scala/index.html#play.api.libs.json.JsResult)というOption型みたいなやつがかえされる。
なんでもパースに失敗した時に[JsError](http://www.playframework.com/documentation/2.2.1/api/scala/index.html#play.api.libs.json.JsError)型を返すことで失敗した原因をうまいこと返す仕組みらしい。
Dockerfileを書く時の注意とかコツとかハックとか

すいません、宣伝です。

[Dockerfileを書く時の注意とかコツとかハックとか](http://kimh.github.io/blog/jp/docker/gothas-in-writing-dockerfile-jp/) という記事を書きました。

内容としては、

* なぜDockerfileを使う必要があるのか
* ADDとDockerfile内のコンテキストの説明
* ビルド時のキャッシュが効くときと無効な時のケーススタディ
* コンテナをバックグランドで動かすためのハック

となっています。記事にも書きましたが、Dockerでイメージを作成する場合は必ずDockerfileを使うべきです。
しかし、まだまだドキュメントが不十分だったりはまりどころがあったりするので、役立ちそうなことをいくつか書いてみました。
mod_rewriteでApache環境変数を一時変数として利用する


# はじめに

Apacheのmod_rewriteの設定をhttpd.confや.htaccessへ記載する際、ちょっと込み入ったことをしようとすると記載内容が複雑になり可読性が落ちてしまいます。

そもそもmod_rewriteはプログラマルな処理には向いていないのですが、一時変数としてApacheの環境変数を利用することで可読性を上げることができますので、記載例を紹介します。

# 例

**例①：スマートフォンまたはFacebookクローラからのアクセスである場合は、それぞれ表示するロゴや適用するCSSを変更する**

```apache:.htaccess(またはhttpd.conf)
RewriteEngine on

RewriteRule .* - [E=X_ACCESS_DEVICE:NULL]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} Android [NC]
RewriteRule .* - [E=X_ACCESS_DEVICE:SMARTPHONE]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} iPhone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} iPod [NC]
RewriteRule .* - [E=X_ACCESS_DEVICE:SMARTPHONE]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} facebookexternalhit
RewriteRule .* - [E=X_ACCESS_DEVICE:FACEBOOK]

...

RewriteCond %{ENV:X_ACCESS_DEVICE} ^SMARTPHONE$
RewriteRule ^img/logo\.png /img/logo_sp.png [L]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^FACEBOOK$
RewriteRule ^img/logo\.png /img/logo_fb.png [L]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^SMARTPHONE$
RewriteRule ^css/common\.css /css/common_sp.css [L]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^FACEBOOK$
RewriteRule ^css/common\.css /css/common_fb.css [L]
```

上記の例では、環境変数 `X_ACCESS_DEVICE` を一時変数として利用しています。
この例ではそれほど環境変数を利用する恩恵はないかもしれませんが、例えばユーザエージェントにより様々なコンテンツを表示しわけるといった場合、ユーザエージェントの判定を一箇所にまとめることが出来ます。
※環境変数名の頭に `X_` を付与してるのは、Apache標準の環境変数でなくサードパーティの開発者が設定した環境変数であることを明示する作法です。

FacebookクローラはFacebookでURLをシェアした際に対象サイトのURLアクセスしてくるので、OGP対応として専用の画像やCSSを適用する場合は上記のようにに対応が可能です（OGP対応についてはまた別のエントリで紹介します）。

**例②：静的リソースに対するアクセスの場合は、ローカルサーバに無い画像をAmazon S3 から取得する（リバースプロキシ）**

```apache:.htaccess(またはhttpd.conf)
RewriteEngine on

RewriteRule .* - [E=X_IS_STATIC_CONTENT:0]

RewriteCond %{REQUEST_URI} ([^\]+\.css)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.js)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.html)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.json)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.csv)$
RewriteRule .* - [E=X_IS_STATIC_CONTENT:1,E=X_STATIC_FILE_NAME:%1]

RewriteCond %{ENV:X_IS_STATIC_CONTENT} ^1$
RewriteCond %{DOCUMENT_ROOT}/resource/%{ENV:X_STATIC_FILE_NAME} !-f
RewriteRule ^resource/(.+)$ http://hoge.s3-website-ap-southeast-1.amazonaws.com/resource/$1 [P,L]
```
*※最終行について、httpd.confに記載する場合は ^/resource/.. のように頭に / が必要です。*

上記の例では、環境変数 `X_IS_STATIC_CONTENT` および `X_STATIC_FILE_NAME` を一時変数として利用しています。
ローカルサーバに画像が存在すればその画像を、存在しなければ S3 から画像を取得（リバースプロキシ）します。

mod_rewriteでのプロキシについては、また別のエントリで紹介します。

# 参考URL

[Apache2.2のmod_rewrite公式ドキュメント](http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html)

# ほか

サンプルの動作検証があまり十分でないので^^; 動かないなどありましたらコメントください。
Androidの標準ブラウザで使える簡単な処理時間計測スクリプト

Androidの標準ブラウザでデバッグする時に困る事があるのは

```js
console.log();
console.info();
console.warn();
console.error();
```
の上記functionしか使えない部分です。
で、ブラウザでデバッグする時に個人的に便利だなーって思ったのが

```js
console.time();
console.timeEnd();
```
の二つのfunctionです。

なので、無ければ実装すれば良いじゃん、という事で`console.log();`を使って実装。

```js:sensing.js
var K = (function() {
  var timeManager = {};
  return {
    /**
     * 計測開始
     * @param {String} label
     */
    timeStart: function(label) {
      timeManager[label] = (new Date()).getTime();
      console.log(label, "start sensing");
    },
    /**
     * 計測停止
     * @param {String} label
     */
    timeEnd: function(label) {
      console.log(label, (new Date()).getTime() - timeManager[label] + "ms");
      delete timeManager[label];
    }
  }
})();
```
## 使い方
使い方は至って簡単。
`console.time();`と`console.timeEnd();`に同じ。
`K.timeStart("func1");`で開始。
`K.timeEnd("func1"); // timeStartで渡した同じlabelを渡す`で終了。
timeStartからtimeEndまでのmsを算出します。
精確な値を出すわけではないですが、簡単な処理計測をする等には楽です。
HTML作業前に画像パスを設定しとくとちょっと時短できる



以下のショートカットを設定して作業中のHTMLから読み込む画像パスを呼び出す
& SublimeText2のautoFileNameで入力したら、ちょっとHTMLを記述するのが早くなるかも。

TextExpanderCmd -> ;sagimg

```html:sample.cmd
images/HTMLから読む画像パス/
```

### 他にもHTMLの時間短縮で思いついたら追記してきます。
※ 単純にキーボード打つスピードが早くなればいいというのは無しの方向で。
Python3でImportError: No module named 'xxxxx'

前提
==========
- brew install python3 した。sudo で /usr/local/Celler 以下にインストールされた
- pyvenv で任意の環境 test をつくって activate した状態
- pip3 install jinja2(or mako)してライブラリは入っている。
- pip3 freeze でも上でいれたライブラリが表示されている

標準モジュールは読み込めたけれど pip(3) でインストールしたモジュールが読み込めない。

```py3tb
    Traceback (most recent call last):
    File "example.py", line 9, in <module>
    from jinja2 import Template
    ImportError: No module named 'jinja2'
```

sys.path に追加して読み込ませる

```py3
    #!/usr/bin/env python
    # coding: utf-8
    
    import sys
    sys.path.append('/usr/local/lib/python3.3/site-packages')
    
    from jinja2 import Template
    
    assert Template
```

 
参考
==============
http://stackoverflow.com/questions/20099481/python3-importerror-no-module-named-myfile
マスクを掛けたswfのサイズ取得

flaでマスクをかけたswfを生成するとas3で想定したサイズが取れずに悩んだのでメモ。

```as
protected function loadSwf():void {
	var loader:Loader = new Loader();
	loader.contentLoaderInfo.addEventListener( Event.COMPLETE, loadComplete );
	loader.load( new URLRequest( "xxx.swf" ) );
}

private function loadComplete( event:Event ):void {
	var li:LoaderInfo = event.target as LoaderInfo;
	trace(li.width, li.height);
	
	var mc:MovieClip = li.content as MovieClip;
	trace(mc.width, mc.height);
}
```

LoaderInfoのwidth,heightを参照すればfla側で指定したステージサイズが取得できる。
ステージサイズをswfをロードした時に使いたいサイズで設定してればマスクをかけてても
想定した結果が取得できる。
iOSアプリにAdmobを組み込む


## まずはWebへ。

https://apps.admob.com/#home
Admob上でアプリを登録します。
今回はストアにすでにアップしてあるものなので「新しいアプリを収益化」→「ストアを検索」から登録しました。

## ここ先はローカルでの作業です。

### ライブラリをダウンロード

https://developers.google.com/mobile-ads-sdk/download?hl=ja#downloadios
まずはこちらからiOSを選択してライブラリをダウンロードします。
2014/1/20現在の最新版は6.7.0でした。

> ここからは[Google AdMob Ads iOS（初級）](https://developers.google.com/mobile-ads-sdk/docs/ios/fundamentals?hl=ja)を参考にしながら作業を進めます。

### ライブラリファイルをプロジェクトに追加します。
追加するのは以下のファイルです。

* GADAdMobExtras.h
* GADAdNetworkExtras.h
* GADAdSize.h
* GADBannerView.h
* GADBannerViewDelegate.h
* GADInterstitial.h
* GADInterstitialDelegate.h
* GADRequest.h
* GADRequestError.h
* libGoogleAdMobAds.a

### 必要なフレームワークを追加します。
Build Phases→Link Binary With Libraries→＋ボタンです。
以下の４つを検索しながら追加していきます。

* AudioToolbox
* MessageUI
* SystemConfiguration
* CoreGraphics

**<fong color="red">ここで注意！</font>**
以下２つのframeworkも更に必要なようです。

* AVFoundation
* StoreKit

### コードを書いていきます

資料中には``viewDidUnload``メソッドの記載がありますが、iOS6以降の対応であれば必要ないため、記述は以下の様にシンプルです。

```objectivec
#import "GADBannerView.h"

- (void)viewDidLoad
{
    [super viewDidLoad];
	
    GADBannerView* bannerView = [[GADBannerView alloc]
                   initWithFrame:CGRectMake(0.0,
						self.view.frame.size.height -
						GAD_SIZE_320x50.height,
						GAD_SIZE_320x50.width,
						GAD_SIZE_320x50.height)];    

    bannerView.adUnitID = @"広告ユニットID";
    
    // ビュー階層に追加する。
    bannerView.rootViewController = self;
    [self.view addSubview:bannerView];
    
    // 一般的なリクエストを行って広告を読み込む。
    [bannerView loadRequest:[GADRequest request]];
}
```

（StoryBoard上で広告View配置できないんですかね...どなたかご存知でしたら教えて下さい）

### できた！

ここまでの作業をしてアプリを起動すると広告が表示されるはずです。
最初のリクエストでは表示までに時間がかかることがあるようですが、今回はすぐに表示されました。
お疲れ様でした！

##その他ドキュメント

今回は広告を表示するところまででしたが、より詳細な設定がしたい場合はadmobのドキュメントを参照してください。

* [Google AdMob Ads iOS（中級）](https://developers.google.com/mobile-ads-sdk/docs/ios/intermediate?hl=ja)
* [Google AdMob Ads iOS（上級）](https://developers.google.com/mobile-ads-sdk/docs/ios/advanced?hl=ja)
Serversman@VPS　初期設定


まずはじめにすること。自分用メモ

## 初めてのSSH接続

```
$ ssh -p [ポート番号] root@[IPアドレス]
The authenticity of host ******* can't be established.
RSA key fingerprint is ********.
Are you sure you want to continue connecting (yes/no)? yes
#
```

## 管理者ユーザーの追加

```
# useradd -G wheel [ユーザー名]
# passwd [パスワード]
ユーザー [ユーザー名] のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました
#
```

## sudoユーザーの追加とwheelグループの設定

```
# visudo
```

``` visudo
%wheel ALL=(ALL) ALL
```

## ログイン設定についての設定

```
# vi /etc/ssh/sshd_config
```
Rootでのログインを禁止して接続するユーザーを設定する

``` sshd_config
#PermitRootLogin yes
PermitRootLogin no

AllowUsers [ユーザー名]
```

sshd再起動

```
# /etc/init.d/sshd restart
sshd を停止中:                                             [  OK  ]
sshd を起動中:                                             [  OK  ]
#
```

⇒ここで無事接続できるかを別のウィンドウで確認しておく！
gradleを利用した並行テストのススメ(1)

gradleはテストの並列実行をサポートしています。
並行テストはテストケース単位でおこなわれるためたくさんのユニットテストを抱えたプロジェクトのテスト時間を短縮するのにとても効力を発揮します。

並列実行の設定はとても簡単。
http://gradle.monochromeroad.com/docs/userguide/java_plugin.html

build.gradleファイルに以下のようにtestタスクのmaxParallelForksを追加するだけです。
ここでは10にしているがマシンのリソースが許すなら大きな値をとることで並列実行を追加していくことも可能です。

```groovy:build.gradle
test {
    maxParallelForks 10
}
```

しかし並列実行の場合に注意しなければいけないことがいくつかあります。

2. テストデータの整合性
　同一のデータベースを利用した時にテストケース実行の前後によって結果がことなってしまったり失敗したりする。
1. ひとつひとつのテストケースの実行時間が長い場合は並列実行の意味が薄くなる。

1の解決は簡単です。
1クラス1テストケースではなく1つのクラスのテストケースをメソッド単位で複数に分けてしまうことによって解決できます。細かくわけすぎるとテストケース数の肥大化による管理コストが増大してしまうので、適切なサイジングとパッケージでの切り分けをうまく設計する必要があるでしょう。

また古き良きオブジェクト指向にこだわらず、関数型プログラムを意識して行くことも効果的です。
関数型が改めて台頭してきた一番大きな理由はテストの簡便さです。
Scalaなどの言語を経験している方はわかると思いますが、オブジェクトが状態を保持しない、
オブジェクトの状態を書き換えないという二点を意識するだけでテスト作成の工数が格段に少なくなります。
オブジェクトはあくまで部品でありデータ型の一つと捉えた書き方をしていくことで折り合いを付けて行くのが良いと考えます。

2の解決方法としてはテストケースごとにデータベースやファイルを分けてしまうことです。
テストケースごとにデータベースの構築と破棄を行うとなるとケースが膨大になった時にかなりのオーバーヘッドになってしまうのが難点であり1のテストケースを細かく分類するということと相反してしまいます。

(2)の記事は試行錯誤後に改めてデータベースなどの取り扱いについてまとめます。
GIMPで画像一括変換

フォルダに存在する全ての画像に対して、同じ処理を適用したいというのはよくあります。
GIMPであれば、そのような場合にスクリプトで一括処理を行うことができます。


Windowsの場合、スクリプトは以下のフォルダに格納することで使用可能です。
`C:\Program Files\GIMP 2\share\gimp\2.0\scripts


格納するとメニューから選択できるようになります。
![gimp_scriptfu_image.png](https://qiita-image-store.s3.amazonaws.com/0/35897/28d7a81b-12c1-bb68-7e50-7b59d5ace33d.png)


以下のコードは、指定されたフォルダの画像を全て水平反転するものです。

```script-fu-flip-horizontal.scm
; script-fu-flip-horizontal.scm
; by appin

; Version 1.0 (20130702)

; Description
;
; Script to flip images horizontally
;

(define (script-fu-flip-horizontal inDir inLoadType outDir)
  (let*
    (
      (varLoadStr "")
        (varFileList 0)
    )
    (set! varLoadStr
      (cond 
        (( equal? inLoadType 0 ) ".jpg" )
        (( equal? inLoadType 1 ) ".bmp" )
        (( equal? inLoadType 2 ) ".png" )
        (( equal? inLoadType 3 ) ".gif" )
      )
    )
    (set! varFileList (cadr (file-glob (string-append inDir "\\*" varLoadStr)  1)))
        
    (while (not (null? varFileList))
      (let* 
        ((filename (car varFileList))
          (short_filename (substring filename (+ (string-length inDir) 1) (string-length filename)))
          (image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
          (drawable (car (gimp-image-get-active-layer image)))
          ;保存ファイル名の先頭に"r_"を追加
          (newfilename (string-append outDir "\\" (string-append "r_" short_filename)))
        )
        ;水平反転処理
        (gimp-image-flip image ORIENTATION-HORIZONTAL)

        (gimp-file-save RUN-NONINTERACTIVE image drawable newfilename short_filename)
        (gimp-image-delete image)
      )
      (set! varFileList (cdr varFileList))
    )
    
    (gimp-patterns-refresh)
  )
)
  
(script-fu-register "script-fu-flip-horizontal"
  "<Image>/Script-Fu/Flip Images Horizontally..."
  "Flip all files horizontally."
  "appin"
  "appin"
  "July 2013"
  ""
  SF-DIRNAME    "Load from" ""
  SF-OPTION     "Load File Type" (list "jpg" "bmp" "png" "gif")
  SF-DIRNAME    "Save to"  ""
  
)
```

水平反転処理を別処理に変えることで、色々と使えると思います。
html5のデータ属性の扱い方

#data属性より取得

```html:html
<div id='user' data-score='72' data-age="32"></div>
```

###data属性を指定しての取得

```js:js
$(function(){
    score = $('#user').data('score');
    //=>72が取得できる
});
```

###全て取得

全てのdata属性がオブジェクトで取得できる。
data-の後ろがキーで、属性値が値になる。

```js:js
$(function(){
    score = $('#user').data();
    //=>{score:72,age:32}
    typeof(score);
    //=>object
});
```

###data属性にJSON

ちなみに、data属性にJSONを書いておけば、文字列ではなくオブジェクト形式で取得できる。

```html:html
<div id='user' data-json='{"key":"value"}'></div>
```

```js:js
$(function(){
    json = $('#user').data('json');
    //=>{key:value}
    typeof(json);
    //=>object
});
```

jsonは正しく書かないと、文字列で取得される。
例えば、JSONの文字列はシングルコーテーションは使えないので注意。


#data属性へ設定
```html:html
<div id='user'></di>
```

```js
$(function(){
    // data-score='72'が設定できる。
    $('#user').data('score','72');
});
```
Gradleビルドの成果物に特定のファイルを含める方法


GradleでビルドしてJarファイルを作るときに、コンパイルしたクラスファイル以外のファイルをjarファイルに含める方法。
簡単にできそうに見えてつまづいたのでメモ。

プロジェクト構成はこんな感じ。Maven構成の方が楽だけとeclipseのプロジェクト構成で。

```
TestProject
└── src
│   ├── Test.java
│   └── Test2.java
├── files
│   ├── hogehoge.txt
│   ├── piyoipyo.txt
│   └── resources
│       └── foobar.txt
└── build.gradle
```

特に何も考えずにsrcディレクトリ指定だけ追加してビルドしただけではできたjarファイルにファイルが追加されない。

```build.gradle
apply plugin: 'java'
sourceSets.main.java.srcDir 'src'
compileJava.options.encoding = "UTF-8"
```

```
$ gradle build
(出力中略)
$ jar -tf build/libs/TestProject.jar
META-INF/
META-INF/MANIFEST.MF
Test.class
Test2.class
```

任意のファイルを追加する際には、以下のようにbuild.gradleに追記する。

```build.gradle
jar {
  into('dest') {
    from 'files'
  }
}
```

intoはコピー先、fromはコピー元。上記例だとfiles以下のファイルをdestというディレクトリに配置する。
fromのディレクトリが階層構造になっていてもよしなにやってくれる。

```
$ gradle build
(出力中略)
$ jar -tf build/libs/TestProject.jar
META-INF/
META-INF/MANIFEST.MF
Test.class
Test2.class
dest/
dest/hogehoge.txt
dest/piyoipyo.txt
dest/resources/
dest/resources/foobar.txt
```
Androidでアニメーションしたい


ValueAnimatorというものがあったので使ったメモ

## ValueAnimator
http://developer.android.com/reference/android/animation/ValueAnimator.html
APIレベル11から使用することが可能になった。
### ValueAnimatorの初期化
ValueAnimatorの場合、newでインスタンスを生成しない。
代わりにValueAnimator.ofFloatというクラスメソッドを呼び出してインスタンスを取得する。

例えばこんな感じ。

```Java:Animatorの初期化
ValueAnimator anim = ValueAnimator.ofFloat(0.f, 100.f);
// アニメーションの時間(3秒)を設定する
anim.setDuration(3000);
anim.start();
```

たったこれだけで3秒間で0.0から100.0まで変化するオブジェクトを起動できます。
実際にこれを使ってみると、こんな感じ。

```Java:Animatorの初期化2
ValueAnimator anim = ValueAnimator.ofFloat(0.f, 100.f);
// アニメーションの時間(3秒)を設定する
anim.setDuration(3000);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                invalidate();
            }
        });
anim.start();
```

ValueAnimatorの値が変化するタイミングで`onAnimationUpdate`が呼び出されるので、ここに任意の処理を書きます。
最後に、あるViewのonDraw内で上で定義したanimの値を使ってアニメーションを体感してみます。

```Java:drawSomethingView.java
protected void onDraw(Canvas canvas) {
	// 赤い背景
    canvas.drawColor(Color.RED);

	// だんだん大きくなる緑の円を書くよ
	float radius = (Float) (anim.getAnimatedValue());
	Paint p = new Paint();
	p.setColor(Color.GREEN);
    canvas.drawCircle(getWidth()/2, getHeight()/2, radius, p);
}
```

楽ちんだなあ。
それまではThreadを生成して、runの中でアニメーションさせる差分の計算させてた。シンドかった。
ValueAnimatorありがたやー
コマンドに割り当てられたaliasを確認する


aliasを多用するのですが、設定した内容をいつも忘れてしまうので確認の仕方をメモしておきます。

```Bash
$ alias ls
alias ls='ls -Gal'
```

aliasを一時的に無効にしたいときはunaliasコマンドを使います。

```Bash
$ unalias ls
$ alias ls
-bash: alias: ls: not found
```
秘密鍵/公開鍵の作り方とパスフレーズ入力の省略

```bash:Terminal
$ ssh-keygen -t rsa -C comment -N passphrase -f filename
```

rsaの鍵にcommentというコメントを付け、パスフレーズにpassphraseを指定して`filename`（秘密鍵）と`filename.pub`（公開鍵）を生成する。（パスフレーズは5文字以上必要）
これなら対話的に聞いてくることが無いので、何かしら自動化したいとき（鍵を自動化で生成することなんてあるのか？）にはいいかも。あと対話的に聞いてこられるのが面倒なときとか。

ただ、これだと履歴にパスフレーズが残ってしまうので、

```bash:Terminal
$ history -c
```

などで履歴を消すか、

```bash:Terminal
$ ssh-keygen -t rsa -C comment -f filename
```

で対話的にパスフレーズを指定するとか。

---

パスフレーズを毎回聞かれるのが面倒だ、という人は`ssh-agent`とか使うと良いかも。

自分の`.bashrc`には以下のように書いてあって、一度パスフレーズを聞かれるとターミナル（ターミナルでなくて`tmux`だったかなあ？）が起動している限りは二度目以降パスフレーズを聞かれなくなる。（たぶん・きっと・確か）
でもOS Xの場合はキーチェーンが標準でがんばってくれた気がするので、必要なかった気がする。UbuntuとかDebianとか使うときにはとても有用だった気がするけど、最近使ってないのでわからない。

```bash:.bashrc
# ssh-agent {{{
ssh_agent=/usr/bin/ssh-agent
ssh_agent_info=$HOME/.ssh-agent-info

source "$ssh_agent_info" 2>/dev/null

ssh-add -l >/dev/null 2>&1

if [ "$?" -eq 2 -a -x "$ssh_agent" -a -z "$SSH_AGENT_PID" ]
then
  eval "$ssh_agent | grep -v 'echo' > $ssh_agent_info" 2>/dev/null
  source "$ssh_agent_info" 2>/dev/null
fi
# }}}
```
ディレクトリ内のファイル行数をカウントする




試しにGithubからrails-masterをダウンロードして、rbファイルの行数をカウントしてみました。

```unix
wc -l `find rails-master/ -name '*.rb'`
```

結果

(中略)
  233 rails-master//railties/test/paths_test.rb
      75 rails-master//railties/test/rack_logger_test.rb
      56 rails-master//railties/test/rails_info_controller_test.rb
      92 rails-master//railties/test/rails_info_test.rb
    1244 rails-master//railties/test/railties/engine_test.rb
     126 rails-master//railties/test/railties/generators_test.rb
     278 rails-master//railties/test/railties/mounted_engine_test.rb
     200 rails-master//railties/test/railties/railtie_test.rb
      60 rails-master//railties/test/test_info_test.rb
     128 rails-master//tasks/release.rb
      10 rails-master//version.rb
  240824 total 


wcコマンドは -lオプションで行数をカウントします。

参考: http://codezine.jp/unixdic/w/wc
Berkshelf + Vagrantで独自のchef cookbookを作成する流れ

Chef cookbook のひな形を作って動作確認してリポジトリに登録するまでの流れをまとめました。

### 前提

* Berkshelf、Vagrantに関する基本的な知識がある
* berkshelf、vagrantはあらじめインストールされている
* berksコマンドでcookbookひな形を作る
* 動作確認のためVagrantを使うが、test-kitchen等を使ったテストコードは書かない
* 以下では `myapp` という名前のcookbookを作成する
* 作成したcookbookはgitリポジトリに登録して、別Chefリポジトリ等から参照する

### cookbookのひな形作成

```shell-session
berks cookbook chef-myapp
cd chef-myapp
```

私はcookbookの名前は`chef-クックブック名`という規則で作っています。しかし、Chef上では`myapp`というクックブック名で取り扱いたいので、ひな形作成後、`metadata.rb`、`recipes/default.rb`、`Vagrantfile`の中で`chef-myapp`を`myapp`に書き換えています。

### cookbookの編集

```shell-session
editor recipes/default.rb # 適宜編集
```

### Vagrantで動作確認

さきほど作ったレシピを今いるディレクトリの`cookbooks`ディレクトリにインストールします。こうしないと後のchef実行時に`cookbook`が見つかりません。

```shell-session
berks --path cookbooks
```

`cookbooks/`ディレクトリはgitリポジトリに含める必要はありません。`berks`コマンドで作成したひな形であれば予め`.gitignore`で除外されています。

あとは`vagrant up`するだけです。`Vagrantfile`には起動時にChef soloによるセットアップを行う設定が含まれています。一応`run_list`に`myapp`レシピが実行されるか確認します。

```text:Vagrantfile
config.vm.provision :chef_solo do |chef|
  chef.json = { }
 
  chef.run_list = [
      "recipe[myapp::default]"
  ]
end
```

`vagrant up`するとcookbookが適用されます。

```shell-session
vagrant up
```

### イテレーション

クックブックにバグが見つかったら編集し、レシピを`berks --path cookbooks`で再インストールし、`vagrant destroy`,`vagrant up`を繰り返します。

最後にgit commit, git pushする感じです。

### 他のChefリポジトリから参照する

Berksfileに書いて参照しましょう!!!

```text:Berksfile
site :opscode
cookbook "myapp", git: "path/to/myapp.git"
```
Clojureにおいて現在実行中のプログラムの全オブジェクトを得る

[CROSS2014](http://www.cross-party.com/)の[言語CROSS](http://www.cross-party.com/programs/lang/) にて、Smalltalk梅澤さんから、
「現在実行中のプログラムの全オブジェクトを得るには?」
というお題が出題されました。

オブジェクト指向でない言語担当の皆さんは苦戦なさっていたようですが、ClojureはJVMの上で動くので、実はこれは可能です(Clojure CLR等は除外して考えてます…)。

プログラムの外側からヒープダンプをとればいいわけですが、これでは負けた感じなので、アプリケーションに全オブジェクト取得機能を実装してみます。

Oracle JVMでは、HotSpotDiagnosticMxBeanを使ってヒープダンプを出力します。リフレクションを使えば、実行中のプログラムから任意のタイミングで出力可能です。

```clj
(let [dump-heap (.getMethod HotSpotDiagnosticMXBean
                            "dumpHeap" (into-array [String Boolean/TYPE]))
      mx-bean  (ManagementFactory/newPlatformMXBeanProxy
                (ManagementFactory/getPlatformMBeanServer)
                "com.sun.management:type=HotSpotDiagnostic"
                HotSpotDiagnosticMXBean)
      hprof-file (io/file (System/getProperty "java.io.tmpdir")
                          (str "clj" (System/currentTimeMillis) ".hprof"))]
  (.invoke dump-heap mx-bean (to-array [(.getAbsolutePath hprof-file) true])))
```

こんな感じで、ヒープダンプがファイルに出力されます。
あとは、[jhat](http://docs.oracle.com/javase/jp/7/technotes/tools/share/jhat.html)を使えば、ヒープの中身をWebブラウザからみることができます。

が、これも外部ツールに頼っていると、Smalltalkに負けた気がするので、Clojure上でヒープダンプの中身を解析して、インスタンス数を出力できるようにしてみました。
[hprofの仕様](https://java.net/downloads/heap-snapshot/hprof-binary-format.html)にしたがい、パーサを適当に書くだけです。

https://gist.github.com/kawasima/8517614

replを起動した直後に実行すると、次のような結果が得られました。

```shell-session
% lein repl
nREPL server started on port 43579
REPL-y 0.1.10
Clojure 1.5.1
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")
user=> (load-file "all-instances.clj")
([(primitive array) 99558] [java.lang.String 78632] [clojure.lang.Cons 63579] [clojure.lang.LazySeq 63447] [[Ljava.lang.Object; 52114] [clojure.lang.PersistentHashMap$BitmapIndexedNode 33564] [clojure.lang.Symbol 15636] [java.util.concurrent.atomic.AtomicReference 11201] [clojure.lang.PersistentVector 8120] [java.lang.Long 6839])
515494
true
```

これで、Clojureの中だけで全インスタンスを表示できるようになりましたね！
nodebrewで手軽にnode.jsバージョンアップ＆バージョン切り替え

[nvm](http://qiita.com/strsk/items/925644e124efcc964625)よりモダン？に環境管理できるのがnodebrew。
nvmはbash前提でつくられているため、こっちのほうが良いかも。

# インストール
1 curlかwgetで実行

```
% curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup
```
2 .zshrcか.bashrcに追記

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
3 読み込む

```
% source ~/.zshrc
```

簡単！
# 使いかた
#### 利用できるバージョンを表示
```
% nodebrew ls-remote
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6    

v0.1.0    v0.1.1    v0.1.2    v0.1.3    v0.1.4    v0.1.5    v0.1.6    v0.1.7
v0.1.8    v0.1.9    v0.1.10   v0.1.11   v0.1.12   v0.1.13   v0.1.14   v0.1.15
v0.1.16   v0.1.17   v0.1.18   v0.1.19   v0.1.20   v0.1.21   v0.1.22   v0.1.23
v0.1.24   v0.1.25   v0.1.26   v0.1.27   v0.1.28   v0.1.29   v0.1.30   v0.1.31
v0.1.32   v0.1.33   v0.1.90   v0.1.91   v0.1.92   v0.1.93   v0.1.94   v0.1.95
v0.1.96   v0.1.97   v0.1.98   v0.1.99   v0.1.100  v0.1.101  v0.1.102  v0.1.103
v0.1.104  

v0.2.0    v0.2.1    v0.2.2    v0.2.3    v0.2.4    v0.2.5    v0.2.6    

v0.3.0    v0.3.1    v0.3.2    v0.3.3    v0.3.4    v0.3.5    v0.3.6    v0.3.7
v0.3.8    

v0.4.0    v0.4.1    v0.4.2    v0.4.3    v0.4.4    v0.4.5    v0.4.6    v0.4.7
v0.4.8    v0.4.9    v0.4.10   v0.4.11   v0.4.12   

v0.5.0    v0.5.1    v0.5.2    v0.5.3    v0.5.4    v0.5.5    v0.5.6    v0.5.7
v0.5.8    v0.5.9    v0.5.10   

v0.6.0    v0.6.1    v0.6.2    v0.6.3    v0.6.4    v0.6.5    v0.6.6    v0.6.7
v0.6.8    v0.6.9    v0.6.10   v0.6.11   v0.6.12   v0.6.13   v0.6.14   v0.6.15
v0.6.16   v0.6.17   v0.6.18   v0.6.19   v0.6.20   v0.6.21   

v0.7.0    v0.7.1    v0.7.2    v0.7.3    v0.7.4    v0.7.5    v0.7.6    v0.7.7
v0.7.8    v0.7.9    v0.7.10   v0.7.11   v0.7.12   

v0.8.0    v0.8.1    v0.8.2    v0.8.3    v0.8.4    v0.8.5    v0.8.6    v0.8.7
v0.8.8    v0.8.9    v0.8.10   v0.8.11   v0.8.12   v0.8.13   v0.8.14   v0.8.15
v0.8.16   v0.8.17   v0.8.18   v0.8.19   v0.8.20   v0.8.21   v0.8.22   v0.8.23
v0.8.24   v0.8.25   v0.8.26   

v0.9.0    v0.9.1    v0.9.2    v0.9.3    v0.9.4    v0.9.5    v0.9.6    v0.9.7
v0.9.8    v0.9.9    v0.9.10   v0.9.11   v0.9.12   

v0.10.0   v0.10.1   v0.10.2   v0.10.3   v0.10.4   v0.10.5   v0.10.6   v0.10.7
v0.10.8   v0.10.9   v0.10.10  v0.10.11  v0.10.12  v0.10.13  v0.10.14  v0.10.15
v0.10.16  v0.10.17  v0.10.18  v0.10.19  v0.10.20  v0.10.21  v0.10.22  v0.10.23
v0.10.24  

v0.11.0   v0.11.1   v0.11.2   v0.11.3   v0.11.4   v0.11.5   v0.11.6   v0.11.7
v0.11.8   v0.11.9   v0.11.10  
```
#### node.jsのインストール
```
% nodebrew install-binary v0.10.22
fetch: http://nodejs.org/dist/v0.10.22/node-v0.10.22-darwin-x64.tar.gz
######################################################################## 100.0%
Install successful
```
#### 利用するバージョンの設定と確認
```
% nodebrew ls
v0.10.22
v0.10.23

current: v0.10.22
% nodebrew use 0.10
use v0.10.23
% nodebrew ls
v0.10.22
v0.10.23

current: v0.10.23
```
# 参考
[nodebrew/README.md at master · hokaccha/nodebrew](https://github.com/hokaccha/nodebrew/blob/master/README.md)
短縮URLを自鯖で作れるYOURLS

# 情報の鮮度

* 2014-01-20
* 同時点のDebian/CentOS (wheezy/6)
* YOURLS 1.7

# 自分で作れ、というのはともかく

* http://yourls.org/
* https://github.com/YOURLS/YOURLS/releases
* PHP + MySQL
* わりと最近っぽいインターフェース
* APIあるくさい。ブックマークレットもついてる
* 統計情報取ってくれる
* プラグインが結構ある

デフォルトだと連番 (http://example.com/1 から始まる) でなんじゃこりゃなんですが、
[プラグイン](https://github.com/YOURLS/YOURLS/wiki/Plugin-%3D-Random-Keywords)を入れるとそれっぽい動作になります (http://example.com/mo3oc みたいな。デフォルト5文字)。

統計情報とブックマークレットの組み合わせは人によっては地味に役に立つかもしれません。
ブックマークサービスではないのですが、とりあえず読んでいるWebページをこれに登録しておいて、
後で見返して、というのにも何故か使えます。いやいやそれ短縮URLと関係無いだろ、みたいな。

あとは https://mowa-net.jp/wiki/yourls をどうぞ。
しかし短いドメイン持ってないのであんまり短くならないのです。
grep的なPowerShellコマンドSelect-String

Unix系で使われる`grep`に近いコマンドはないかと探したところ`Select-String`というコマンドがありました。
凝った使い方だと違いますが、概ね`grep`の様にしていいようです。
CSVファイルに「D00」を含む行だけを表示させてみました。

```ps1
PS > $A = b:\C1-001.csv
PS > echo $A | Select-String "D00"
```

これで「D00」を含む行だけが表示されます。

正規表現を使用する場合には`-Pattern`オプションを付けて

```ps1
PS > echo $A | Select-String -Pattern "^D"
```

とかすればいいようです。

ちなみにCompare-Objectなど結果が配列で出力されるデータは

```
@{InputObject=D00,261,1,110,; SideIndicator=<=}
@{InputObject=D00,256,1,111,; SideIndicator=<=}
@{InputObject=D00,260,1,112,; SideIndicator=<=}
```

こんな感じで表示されました。
できれば整形したいですね…。

Windows PowerShell プロファイルにエイリアスとして登録しておいても良いかもしれません

```ps1
Set-Alias grep Select-String
```

でも細部の振る舞いが違いそうなので注意が必要です。

##2014年4月10日追記
書き出しにある

```ps1
PS > $A = b:\C1-001.csv
PS > echo $A | Select-String "D00"
```

という書き方ですが、変数に入れなくてもgrep同様コマンドがテキストファイルを開いて表示させることができます。

```ps1
PS > Select-String "D00" b:\C1-001.csv
```

のような書き方をしても同じ表示になりました。
UbuntuでIRC用Hubotを1から立ち上げる

だいたい5分ぐらいでできます。
# 環境
* OS:Ubuntu 12.04 LTS
* Node.js v0.10.24

#環境を整える
##必要なパッケージ群をインストール

```Bash
sudo aptitude update
sudo aptitude install build-essential
sudo aptitude install redis-server
```

redisは必須ではないがいろいろやるためには入れておいた方がいい。

##Node.jsをmakeしmake install
http://nodejs.org/download/
からSource Codeをダウンロードし、makeしてinstall

```Bash
wget http://nodejs.org/dist/v0.10.24/node-v0.10.24.tar.gz
tar xvf node-v0.10.24.tar.gz
cd node-v0.10.24
./configure
make
sudo make install
```

確認のため、

```Bash
node -v
```

をして

```Bash
v0.10.24
```

と表示されたらNode.jsが入りました。

#Hubotを設定する
##全部入りのやつを持ってくる
予めすべて設定してあるやつを持ってきちゃいます。

```Bash
git clone https://github.com/jgable/hubot-irc-runnable.git mybot
cd mybot
```

上記ではmybotとしていますがなんでも大丈夫です。
ここではmybotとします。

##実行スクリプトをいじくる
`runbot.sh`が起動スクリプトです。
中身を編集しましょう。

```Bash:runbot.sh
# Set Environment Variables
export HUBOT_IRC_NICK=mybot #ここにbotの名前
export HUBOT_IRC_SERVER=irc.freenode.net #ここにIRCサーバのアドレス
export HUBOT_IRC_ROOMS="#my_stoopid_bots_lair,#test" #JoinしたいChannelをカンマで区切る
```

##実行してみる
```Bash
npm install
./runbot.sh
```

初回のみ`npm install`が必要です。

#おわりに
本来ならIRC用のアダプタを入れたり色々しないといけないのですが、
全部入りのやつを持ってくるととても簡単に立ち上げることができちゃいました。
次回はscriptを書いたり、他人のを持ってきたりする方法について書きたいと思います。

#続編リンク
Hubotにlogbot機能を追加する
http://qiita.com/Morikuma_Works/items/7313f061f9f3d9c11f54

以上！
Google Chrome Extensionsのmanifest.jsonテンプレート

[manifest file format](http://developer.chrome.com/extensions/manifest.html)は量が多すぎなので、よく使うGoogle Chrome Extensionsでよく使うmanifest.jsonの書式だけピックアップ。

_background pageばっかり使ってるとGoogle Chromeのメモリをガシガシ消費するだけなので、event pageを使うように心がけよう。
background便利だけどね。_

```json:manifest.json
{
	"manifest_version": 2,
	"name": "extensions name",
	"version": "extensions version",
	"default_locale": "ja",
	"description": "extensions description",
	"permissions": [
		"tabs",
		"webRequest",
		"*://*/*"
	],
	"background": {
		"page": ["background.html"],
		"scripts": ["background.js"],
		"persistent": false
	},
	"content_scripts": [
		{
		  "matches": ["http://*/*", "https://*/*"],
		  "js": ["contentscripts.js"],
		  "css": ["contentscript.css"],
		  "all_frames": true,
		  "run_at": "document_end"
		}
	],
	"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';",
	"browser_action": {...},
	"page_action": {...}
}
```

[Manifest File Format](http://developer.chrome.com/extensions/manifest.html)
可変引数をそのまま渡す

AS3から呼び出すJSをまとめたクラスを作って引数を可変で渡そうとした時にちょこっと躓いたのでメモ。

```js
function test(a, b, c){
	alert('a=' + a);
	alert('b=' + b);
	alert('c=' + c);
}
```

```as:ExternalLink.as
public class ExternalLink {
	public static const TEST:ExternalLink = new ExternalLink( "test" );

	private var _funcName:String;

	public function ExternalLink( funcName:String ) {
		_funcName = funcName;
	}

	public function call( ... args ):void {
		ExternalInterface.call( _funcName, args );
	}
}
```

他のjsも定義して呼び出せるように可変引数として

```as:
ExternalLink.TEST.call( 1, 2, 3 );
```
こんな風に呼べるようにしてExternalInterface.callを使うと
jsの結果は

a=1,2,3
b=undefined
b=undefined
となってしまった。

argsをtestテストメソッドに渡した時に可変引数ではなく配列としてわたっていたのが原因。

そこでcallメソッドを下のように変更

```as
public function call( ... args ):void {
	args.unshift( _funcName );
	ExternalInterface.call.apply( this, args );
}
```

Function.applyを使うことで可変引数のargsをjsにそのまま渡すことで
a=1
b=2
c=3
と期待通りの結果を得ることができた。
スクレイピングツールの作成

社会人にとってアウトプットを出すのが大事というのはいろいろ言われていることだし、プログラミングの仕事らしいこともやっていない（今は１００％インフラエンジニアリング）ので、何とかしようということで始めた。

以下、メモ書き程度にやりたいことを書く。

１．マーケティング担当者、アナリスト向けに、Web解析ツールのデータを加工・整形するサービスを作りたい
２．サービスを横展開したいので、APIなどのツール提供元のプログラムでデータを取得しないようにしたい
３．できればPerlでやりたい
４．ASP（今でいうとクラウド）サービスで提供したい。

以上を実現するために、現状では次のような実装方式でプログラミングしています。

データ取得対象のサービス： Googleアナリティクス
データ取得： Selenium::Remote::Driver + PhantomJS

実行環境は、最終的にLinux(CentOS) + MySQL で考えていますが、今はテスト段階なのでWindows7 64bit + ActivePerl + PhantomJSのWindowsバイナリ　になっています。


データの取得に関しては、アナリティクスへログインしてダッシュボードを表示させるところまでいけたんですが、なんだかアナリティクスがajaxを多用しているようなので、うまく挙動させることができずに煮詰まっています。

なんだかこう、イケイケドンドンな感じでさらっといけるかなと思っていたんですけどまったくそんなことはなく、そろそろ着手して一か月が経過するにも関わらず進展が無くて参る次第であります。有識者の意見を拝聴したい今日この頃。。。
ActiveAdmin と RailsAdmin (ついでに CanCan 2.0)

違いがよくわからなかったのでとりあえず ActiveAdmin を入れてみたら、いきなり CSS が全域に影響を及ぼしたのでびっくり。するとこれは、Webアプリに管理画面を追加するものではなくて、管理画面Webアプリそのものを作るための gem なのかな、と思ったのだけどその割にパスは /admin 以下になったりするし、 gem として軸がぶれていると感じたのでそれ以上試さずに消してしまいました。
そのあと RailsAdmin 入れてみたら admin 以下が Engine になっていて本体に影響しないし、特に問題なく便利に使えています。みんな RailsAdmin 使えばいいと思いました。

ところで RailsAdmin は CanCan 2.0 に対応していない。これについては別途エントリを立てて纏めたい (いやむしろ RailsAdmin に pullreq 出したい) ところだが、ひとまずヒントだけ出しておきます。

``` ruby:config/initializers/rails_admin.rb
module RailsAdmin
  module Extensions
    module CanCan
      class AuthorizationAdapter
        def authorize(action, abstract_model = nil, model_object = nil)
          @controller.current_ability.authorize!(action, model_object || abstract_model && model_name(abstract_model.model)) if action
        end
        def authorized?(action, abstract_model = nil, model_object = nil)
          @controller.current_ability.can?(action, model_object || abstract_model && model_name(abstract_model.model)) if action
        end
        private
        def model_name(model)
          model.to_s.underscore.pluralize.to_sym
        end
      end
    end
  end
end
```
``` ruby:app/models/ability.rb
    alias_subject 'rails_admin/main', to: :rails_admin
    can :access, :rails_admin
    can :dashboard, :all
```

see also: http://qiita.com/kuboon/items/1d009e2f89729fe5db78
AdvancedDataGridでsparkコンポーネントを利用したカスタムItemEditorを作成する。


1. mx.controls.advancedDataGridClasses.MXAdvancedDataGridItemRendererを継承すること
2. dateプロパティのsetterをオーバーライドすること。
3. 2.のメソッド内で、MXAdvancedDataGridItemRendererのdateプロパティのsetterを呼び出すこと
4. textのgetterをオーバーライドすること。

の4点が必要です。
1.はsparkコンポーネントを含めるために。
2.はdataproviderの値をsparkコンポーネントに渡すため。
3.はカラムをクリックして編集可能にする場合にItemEditorに切替るため。
4.は編集終了後にdataproviderに値を戻すため
に必要です。

```
<mx:MXAdvancedDataGridItemRenderer
					xmlns:fx="http://ns.adobe.com/mxml/2009" 
					xmlns:s="library://ns.adobe.com/flex/spark" 
					xmlns:mx="library://ns.adobe.com/flex/mx"
					>
	
	<fx:Script>
		<![CDATA[
			override public function set data(value:Object):void {

				if (!listData) {
					return
				}
				
				this.numberInput.text = listData.label;

			}
			
			override public function get text():String {
				
				return this.numberInput.text;
			}
			
		]]>
	</fx:Script>
	<s:TextInput id="numberInput" />

</fwed:MXAdvancedDataGridItemRenderer>
```
AdvancedDataGridでsparkコンポーネントを利用したカスタムItemRendererを作成する。


1. mx.controls.advancedDataGridClasses.MXAdvancedDataGridItemRendererを利用すること
2. dateプロパティのsetterをオーバーライドすること。
3. 2.のメソッド内で、MXAdvancedDataGridItemRendererのdateプロパティのsetterを呼び出すこと

の2点が必要です。
1.はsparkコンポーネントを含めるために。
2.はdataproviderの値をsparkコンポーネントに渡すため。
3.はカラムをクリックして編集可能にする場合にItemEditorに切替るために必要です。

```
<mx:MXAdvancedDataGridItemRenderer
					xmlns:fx="http://ns.adobe.com/mxml/2009" 
					xmlns:s="library://ns.adobe.com/flex/spark" 
					xmlns:mx="library://ns.adobe.com/flex/mx"
					>
	
	<fx:Script>
		<![CDATA[
			override public function set data(value:Object):void {
				
				if (!listData) {
					return
				}
				numberLabel.text = listData.label;
				super.data = value;
				
			}
			
		]]>
	</fx:Script>
	<s:Label id="numberLabel" />

</fwed:MXAdvancedDataGridItemRenderer>
```
Hamlで条件に合わせてclassを追加する方法


rails&hamlで、ナビゲーションメニューのclassにactiveをつける方法です(rails4.0.2, haml4.1.0を使用)

```haml
  %h3 Menu
  %ul
    %li{:class => current_page?(root_path) && "active"}
      %a ホーム
    %li{:class => current_page?(next_path) && "active"} 
      %a 次のページ
```

ちなみに以下のような書き方も可能です。

```haml
  %li{:class => #"{ 'active' if current_page?(root_path) }" }
Bashにおける括弧類の意味


Bashのスクリプト内で {} や () や [] などの記号の意味。
詳細はここの記事に出ている。
http://stackoverflow.com/questions/2188199/how-to-use-double-or-single-bracket-parentheses-curly-braces
http://mywiki.wooledge.org/BashFAQ/031

## bracket [] の意味

[]はtestコマンドの略式。
if文の引数で使う事が多い。

```bash
if [ -e "file.txt" ]; then
  echo "File exists"
fi
```

`[` の直後と `]`の直前には必ず半角スペースが必要となる。
例えば

```bash
if [-e "file.txt" ]; then
  echo "File exists"
fi
```
と書くと、`[-e: command not found` というエラーメッセージが出る。

## double bracket [[ ]]

bracket と基本的には同じ。 ~~ただし、こちらはbashのビルトインコマンド~~

(20150428追記) single bracketもbashの場合ビルトインコマンド。
double bracketの方が後に追加されたもので、bash,zsh,Korn shellでのみ使える。
tcshなどでは、`[[`は使えません。

```bash
if [[ -e "file.txt" ]]; then
  echo "File exists"
fi
```

double bracketの方がsingle bracketよりも機能が充実しており、`&&`, `||`, Pattern matching, 正規表現などが使える。

```
[[ 1 -lt 2 && 2 -lt 3 ]]
[[ abc == a* ]]
[[ a2 =~ a[0-9] ]]
```

## Parentheses ()

subshellを起動してコマンドを実行する。

```bash
(cd /tmp; pwd)  # => "/tmp"
pwd             # => current directory
```

()の中で実行したコマンドは別プロセスで実行されるので、起動したスクリプト内には何も影響を与えない。
以下のようにサブシェルの実行結果をリダイレクトすることも可能

```bash
(cd /tmp; pwd) > pwd.txt
```

## Braces {}

「変数の展開」と 「一連のコマンドをカレントシェルで実行する」の２種類の意味がある。

1. 変数の展開の例。このように変数名がどこまでなのか明示的に指定する。

    ```bash
    VAR=1234
    echo $VAR       # => "1234"
    echo $VAR1234   # => ""
    echo ${VAR}1234 # => "12341234"
    ```

2. 一連のコマンドをまとめて実行。

    ```bash
    { time -p { sleep 1; sleep 2; echo "finished"; } > f.txt; } 2> time.txt
    ```

この例では f.txt に "finished"という文字列が書き込まれ、timeの実行結果がtime.txtに書き込まれる。
timeコマンドは `{ sleep ... }` の一連の処理の合計時間が書き込まれる。

#### 注意点
- `{ ... }` の中のコマンドは必ずセミコロンで終端する必要があることに注意。無いとsyntax errorになる。
  - （Parenthesesを使ってサブシェルで実行する場合にはセミコロンは不要）
- `{` `}` は両端に空白が必要。無いとsyntax errorになる。
  - （Parenthesesの場合は不要）
iOS向けのpng画像をAndroid向けにリネームするコマンド


iOS向けにスライスしたpngをAndroidで流用したい場面があるかと思います。
そのままだと、Android側の命名規則に違反して使えないことが殆どです。 **@2x** とか。
震える拳をスライスしてくれたデザイナに上げる前に、なんとかしよう。

コマンドラインで画像の入っているフォルダの上まで移動して

```
find . -name "*.png" -exec bash -c 'mv {} `echo "{}" | tr [:upper:] [:lower:] | tr -d "@2x" | tr "-" "_" `' \;
```

やってることは、フォルダ配下の.pngそれぞれを

* 大文字 → 小文字
* @2xを削除
* -(ハイフン) → _(アンスコ)

と置換してリネームしてます。
（tr のとこを増やすなり変えれば、それなりに応用が効くと思います。）

※Macはそのまま使えると思いますが、WindowsはUnixコマンドのパスが通った環境じゃないと動かないと思います。
Cygwinとか入れていれば、そのまま動くと思いますが、面倒になったら、素直にリネームツールをインストールしましょう。
【CakePHP】saveメソッド

##基本編

プライマリーキー（デフォはid）がなければinsert、あればupdateが発行される。

```php:idがなければinsertになる。
$User->save([
  'name'=>'kazu',
  'age'=>32,
]);
//=> INSERT INTO `db_name`.`users` (`name`, `age`,`modified`, `created`) VALUES ('kazu', 32, '20XX-XX-XX XX:XX:XX', '20XX-XX-XX XX:XX:XX')
```

```php:idがあればupdateになる。
$User->save([
  'id'=>1
  'name'=>'kazu',
  'age'=>32,
]);
//=>UPDATE `db_name`.`users` SET `id` = 1, `name` = 'kazu',  `age` = 32,`modified` = '20XX-XX-XX XX:XX:XX'  WHERE `db_name`.`users`.`id` = 1
```

##戻り値
戻り値は、成功した場合はsave()した配列、失敗時はfalseを返す。

```php
if($User->save($data){
  //成功時の処理
}else{
  //失敗時の処理
}

```

##ループでsave()を繰り返す場合
save()実行後、結果をモデル内に保持するので、ループで繰り返す場合、毎回create()を行い初期化する。
create()を忘れて、最初はidなしでinsertになるが、以降のsave()でidありでupdateになってしまうことがよくある。

```php:ループで繰り返す場合
foreach($user_list as $user){
  //create()で初期化する
  $User->create();
  $User->save([
    'name'=>$user['name'],
    'age'=>$user['age'],
  ]);
}
```

##save()するカラムを指定
第三引数にsave()するカラムを指定することができる。
POSTされた値のうち特定カラムのみsave()したい場合に使う。

```php
$data = $this->request->data;
var_dump($data);
/*
[
'name'=>$user['name'],
'age'=>$user['age'],
];
*/

$saveField = ['name'];

$User->save($data,null,$saveField);
//=>nameカラムのみsave()される。
```
Tornado + nginx の時のIPの取得方法

TornadoでクライアントIPアドレスを取得するとき、

```py3
#!/usr/bin/python
# -*- coding: utf-8 -*-

from tornado import web,ioloop

class IndexHandler(web.RequestHandler):
    def get(self):
        ip = self.request.remote_ip
        self.write(ip)

handlers = [
    (r'/', IndexHandler),
]

settings = dict(
    debug = True,
)

app = web.Application(handlers, **settings)
app.listen(8000)
ioloop.IOLoop.instance().start()
```

で取得できます。

ただしnginxで

```nginx
http {
    upstream example.server.com {
        server 127.0.0.1:8000;
    }
    server {
        listen 80;
        server_name example.server.com;
        location / {
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_pass example.server.com;
            proxy_next_upstream error;
        }
    }
}
```

のような設定をしてtornadoを動かしていると全てIPが127.0.0.1になってしまいます。

なのでtornadoのIndexHandlerを

```py3
class IndexHandler(web.RequestHandler):
    def get(self):
        ip = self.request.headers['X-Real-IP']
        self.write(ip)
```

としてあげれば、無事取得出来ました。

nginxがロードバランサ的な動きをしているので、考えてみれば当たり前なんですが、最初気付かず少しハマってしまいました。。。
〜Cross2014 機械学習〜

#機械学習 (前半)

###【導入：機械学習を用いているもの】

①レコメンド
・人
→似たアイテムを見た人が見たアイテム

・アイテム
→似た人の集団が見たアイテム

②クラス分類
・正解をもつデータを大量に渡すと、未知数yに対してのxを求める
→迷惑メールを判断する際に使われたりしている

③異常検知
・大量のデータと異なる性質を持ったものを検出
→セキュリティシステム

###【Q&A】
Q1.機械学習は人手でも代替できるか？
→YES　ただし、データ数や種類にもよるが。

Q2.レコメンドには人手(アナログロジック)、ルールベース、機械学習どれを導入していくのがいいの？
→メリット、デメリットを比べて使用するかどうかの判断
→情報量が少なかったり、サイコロの目などのような運的なものには機会学習は向かない。

Q3.どんなツールを使えばいいか？

分析業務：
R、Weka、Matlab、SpSS

システムに使いやすい：
ScipY、Shogun

クラウドベース機械ツール：
bigML、Bazil

ビックデータ向け：
Mahout

###【各社事例】

Yahoo：
・コンテンツ連動広告(YDN)
・ビジネスインパクトが大きい(※レコメンドのロジックを修正しただけで数百億の売り上げ規模)
・レコメンドを用いる上でパフォーマンスが重要
→2段階の構成
→マッチング(情報検索アプローチ) → リランキング(機械学習ランキング)

入札金額 × CTR = 期待収益で判断させている
学会発表に詳しく書いているよう

楽天；
商品の形態素解析ツールを使っている
写真も何が最適なのかを判断しているよう

その後は色々長かったので割愛
詳しくは下記の資料を見て下さい。
http://www.slideshare.net/shoheihido/cross-30115506?from_search=3

#機械学習 (後半)

Q&A方式で色々進めていく。
個人的に頭に残ったのだけ紹介

###Q1.機械学習の導入方法は？

####田島さん(Yahoo): 
間違えてもおこられないところ。広告やリコメンデーションなど。広告の審査にも使っているが、薬事法に反した広告が出てはまずい。
最終的には人間の判断になるが、その前段として使うと、問題の切り出しが難しい。
間違ってもいいかどうかは導入のポイントのひとつ

####平手さん(楽天)：
人手で不可能とあきらめている大規模なデータでの発見などから始まっている印象がある

####小宮さん(アルバート)：
マーケティングでは機械学習は手段のひとつ。Webマーケティングにおいては利益追求のためのリコメンドなど。リアルマーケティングでは在庫管理などで使うことが多そう

####村上さん(FFRI)；
セキュリティーについては間違えてもいいという点で同意できる。機械学習の誤判定はセキュリティーにおいてはクリティカル。すぐ人間をリプレースできるという話ではない。人に対する説明が求められるので、専門家のヘルプや専門家の教育などに使える

####油井さん(奈良先端)： 
別の軸もある。機械学習でどれだけ質のよい文例データが集められるかという面もある。CTR/CVRなど直接レベニューに効いてくるところから導入が進むだろう

####福島さん(Gunosy)：
やらないとわからないし、やってダメでしたも受け入れられる人が経営者にいるかどうかもポイント。仮説が感覚と合っていると使われやすいだろう

####比戸さん： 
自社サービスを社内で評価するときはやってダメでしたならいい。しかし、お金をもらって分析した結果、データに価値がありませんでしたをちゃんと報告できるかと言うと難しい。これで何%くらい出そうですかと聞かれてもやってみないで答えるのは無理 

###Q2. レコメンドのアルゴリズムなどに関して(どれを導入したら良いか？)

####比戸さん：
アカデミックな評価と実用の評価とは基準が違う。一方で新しい手法はアカデミアから来る。論文ではよさそうなのに使ってみたらダメダメということがある。

####田島さん: 
機械学習は1回でポンといいモノが入るわけではない。KPIを決めておく。売上なのかクリックなのか。それができないとプロジェクトが迷走してしまう。やりながらKPIが上がっていく、上げることを楽しむのが大事。
KPI設定の失敗は細かくいろいろある。失敗した例としては国によってマーケット規模を推定するようなこと。為替がががっと変わってモデルがダメになってしまったことがある。時間軸が短く、確実に構造が同じだよね、というところで生かせると思う。

####小宮さん: 
機械学習は手段という観点をくり返しますが、機械学習のアウトプットをそのまま顧客に渡すのではなく、ドメイン知識で解釈したものを出すべき

その他はハッシュタグ：#cross2014a　で検索下さいませ！
http://www.slideshare.net/shoheihido/cross-ml-kouhen


#個人的にこのセッションを聞いて

前半
・(既にですが)今後ますます必要なアプローチだろうと感じた
・うちに導入する時は大学院とかと組んでやるのが一番よさそう

後半
・結局どのようなアルゴリズムを使ったとしても、ざっくりと人に伝えられるものかつ納得感を持てるものでないと信頼されない
→結果みんなどこもシンプルなものを用いているみたい
・そんなすぐに良いアルゴリズムなんてでないんだから、経営者の人の理解力が必要w
・広告業界だと、本当にその人に合ったというロジックではなく売り上げを最大限あげるためのロジックになっているんだなと。。。
Vimのnon-greedy(非貪欲)マッチ方法


# 方法
`.*`ではなく`.\{-}`を使う


# 参考
[regex - How can I make my match non greedy in vim? - Stack Overflow](http://stackoverflow.com/questions/1305853/how-can-i-make-my-match-non-greedy-in-vim)
特定のMIMEタイプのファイルに対し、ダウンロードダイアログを開くには


XML等ブラウザで内容を表示するMIMEタイプのファイルに対し、ブラウザでアクセスすると、そのままファイルの内容を見せてしまうことがあります。ファイルをダウンロードさせたい場合、どのようにApacheに設定するか、まとめました。

## ダウンロードダイアログを開くレスポンスヘッダー

多くのブラウザでは、

```
Content-Disposition: attachment;
```

をレスポンスヘッダーに設定すると、ダウンロードダイアログを表示します。これは[RFC2616 Sec19](http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html)の19.5.1にて提案された仕様です。IE5.5の頃は色々と問題があったようですが、最近のブラウザであれば、普通にダウンロードダイアログを表示します。

ということで、特定の拡張子であればこのレスポンスヘッダーを設定するようにApacheを設定します。

## mod_headersを有効にする

Apacheで特定のヘッダーを設定するには、mod_headersをインストールしなければなりません。このmod_headersは標準では無効になっている事が多く、Debian/Ubuntu系では、下記のコマンドで有効にします。

```shell
# e2enmod headers
```

コマンド実行後、apacheの再起動も行われ、モジュールが有効になります。

## ヘッダーを有効にする設定例

XMLという拡張子に対し、レスポンスヘッダーを設定するのであれば、下記のような設定になるでしょう。

```httpd.conf
<FilesMatch "\.(xml)$">
	Header set Content-Disposition attachment
</FilesMatch>
```

設定後、apacheに設定を読み込ませてください。

```shell
# service apache reload
```
文字列 と 配列,List の相互変換

変換前 | 変換後
------ | ------
List&lt;Character> | String
String | ArrayList&lt;Character>
char[] | String
String | char[]
StringBuilder | char[] （コピー）

もっと楽な方法ないのかな。

```java:ConvertStringArrayList.java
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ConvertStringArrayList {
    public static void main(String[] args){
        ArrayList<Character> list = new ArrayList<Character>(Arrays.asList('h','e','l','l','o'));
        String str = "hello";
        char[] arr = {'h','e','l','l','o'};

        // ArrayList<Character> -> String
        if (toStr(list).equals(str)) System.out.println("OK");
        else System.out.println("not OK");
        // String -> ArrayList<Character>
        if (toList(str).equals(list)) System.out.println("OK");
        else System.out.println("not OK");
        // char[] -> String
        if (new String(arr).equals(str)) System.out.println("OK");
        else System.out.println("not OK");
        // String -> char[]
        if (Arrays.equals(toArr(str),arr)) System.out.println("OK");
        else System.out.println("not OK");

        // StringBuilder -> char[] (コピー)
        StringBuilder sb = new StringBuilder("hello");
        char[] arr3 = new char[5];
        sb.getChars(0,sb.length(),arr3,0);
        if (Arrays.equals(arr3,arr)) System.out.println("OK");
        else System.out.println("not OK");
    }   

    public static String toStr(List<Character> list){
        // List<Character> -> String
        int l = list.size();
        char[] cs = new char[l];
        Iterator<Character> iter = list.iterator();
        for (int i=0;i<l;i++) cs[i] = iter.next();
        return new String(cs);
    }   

    public static ArrayList<Character> toList(String str){
        // String -> ArrayList<Character>
        int l = str.length();
        ArrayList<Character> list = new ArrayList<Character>();
        for (int i=0;i<l;i++) list.add(str.charAt(i));
        return list;
    }   

    public static char[] toArr(String str){
        // String -> char[]
        int l = str.length();
        char[] arr = new char[l];
        for (int i=0;i<l;i++) arr[i] = str.charAt(i);
        return arr;
    }
}
```
chef使いのための、ガチでないパスワードの難読化

chefで共通cookbookつくったりしていると出てくるのがパスワード。ガチなパスワードな場合はEncrypted data bagsに入れるのがいいと思いますが、サーバ上には平文保存するようなちょっとしたものにはオーバースペック、というか面倒ですよね。

というわけで、ぱっと見でわからなくなる程度のライトなやつ。
ちなみに **英数字（小文字のみ）** しか使えません！！

## やりかた
### パスワード文字列の難読化
シェルで難読化文字列を得ます。

```bash:get_encode_password
$ irb
irb(main):001:0> "password".to_i 36
=> 1982613533017
```

### 難読化したパスワードをattributeにセット
`knife node edit`等でパスワードをattributeに入れます。

```json:knife_node_edit
{
  "name": "testserver01",
  "chef_environment": "_default",
  "normal": {
  ¦ "tags": [

  ¦ ],
  ¦ "yurui": {
  ¦ ¦ "password": 1982613533017
  ¦ } 
  },  
  "run_list": [
  ¦ "recipe[yurui::password]"
  ]
}
```

### 使うときに復号化
テンプレートファイルなどで以下のようにして復号化

```erb:sample_template
password=<%= node[:yurui][:password].to_s 36 %>
```


これだけでなんと不思議、元のパスワードが復号化されます。
attributeに難読化状態で入れておけば、cookbookやnodeのjsonファイルなどをgitに入れる段で難読化されるので、恥ずかしいパスワード文字列がぱっと見ではわからなくなります。


## あとがき
data bags使うのめんどいなーと思いながらぐぐっていたときに発見したブログが元ネタです。

http://d.hatena.ne.jp/ku-ma-me/20091215/p1

大文字が混ざっちゃってる場合は、一番楽なのはBase64とかでしょうか。

```ruby:base64_sample
irb(main):001:0> require 'base64'
=> true
irb(main):002:0> encoded_pass = Base64.encode64('P@ssw0rd')
=> "UEBzc3cwcmQ=\n"
irb(main):003:0> decoded_pass = Base64.decode64('UEBzc3cwcmQ=\n')
=> "P@ssw0rd"
```
Mediumで見つけた for-eachとenum絡めたループ

https://medium.com/on-coding/3fcb28e30ef3



```java:
for (MyEnem<variable-name>:MyEnum.values()){

Statements

}
```

```java:
enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
```

とまあこのように列挙しておいて

```java:
for (Day d : Day.values()){
	System.out.print(d);
	System.out.print(" is day number");
	System.out.println(d.ordinal());
	// System.out.println(d + " is day number" + d.ordinal())
}
```

ordinal()でordinal number（序数、番号数）を取得できる

http://docs.oracle.com/javase/jp/1.5.0/api/java/lang/Enum.html
より
> ordinal
public final int ordinal()
列挙定数の序数 (列挙宣言での位置。初期定数はゼロの序数に割り当てられる) を返します。このメソッドは、ほとんどのプログラマにとって役に立ちません。このメソッドは、EnumSet と EnumMap などの洗練された enum ベースのデータ構造で使用するために設計されています。
戻り値:
この列挙定数の序数

「ほとんどのプログラマにとって役に立ちません」ﾜﾛﾀw


http://www.atmarkit.co.jp/ait/articles/1103/03/news107_2.html

ここら辺も参考に。