OmniAICreator/Qiita-1.07M huggingface dataset:
【Scala】しょっちゅう忘れる、AWSのAPI（逆引き）Scala S3編【AWS】


※前提として、AWS SDK は入れておいてくださいね。↓とか
http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.6.8

#PUT（ファイルアップロード）

```scala
val credentials = new BasicAWSCredentials(アクセスキーキー, シークレットキー)
val s3Client = new AmazonS3Client(credentials)
val localFilePath = "ローカルのファイルパス"
val s3BucketName = "バケット名"
val s3FilePath = "S3のアップロード先のパス"
val upReq = new PutObjectRequest(s3BucketName, s3FilePath, localFile)
s3Client.putObject(upReq)
```

#LIST（リスティング）

```scala
val credentials = new BasicAWSCredentials(アクセスキーキー, シークレットキー)
val s3Client = new AmazonS3Client(credentials)

val s3BucketName = "バケット名"
val s3FilePath = "S3のディレクトリ"

//リスティングで多すぎる場合、マーカーを保持しておかないといけない。
var preNextMarker = ""
var nextMarker = ""
var flg = false

while(!flg){

	preNextMarker = nextMarker

    val listReq = new ListObjectsRequest()
    listReq.setPrefix(s3FilePath)
    listReq.setBucketName(s3BucketName)

      listReq.setMarker(nextMarker)

      val objectListing = s3Client.listObjects(listReq)
      val summary = objectListing.getObjectSummaries

	//Listが返ってくるので、ぐるぐるまわす。
	//ScalaのListではないので、注意
	(0 to summary.size - 1).foreach{s3Object =>
		val obj = summary.get(s3Object)
		//煮るなり焼くなり
    	}
	//println("next marker : " + nextMarker)

      nextMarker = objectListing.getNextMarker

	//もう無ければマーカーはnullです。
      if(nextMarker == null) flg = true
}
```

#GET(ファイルダウンロード）

```scala
    //バケット名
    val s3BucketName ="バケット名"
    //オブジェクトのパス
    val s3ObjectPath = "オブジェクトのパス"
    //ダウンロード先のパス（ローカル）
    val downloadPath = "ダウンロードパス"
    val downloadFile = new File(downloadPath)

    //ダウンロード中のパス
    val downloadingPath = downloadPath + ".tmp"
    val downloadingFile = new File(downloadingPath)

    val req = new GetObjectRequest(s3BucketName, s3ObjectPath)
    val tm = new TransferManager(s3Client)
    val s3Obj = s3Client.getObject(req)

    try {

      val totalWork =  s3Obj.getObjectMetadata().getContentLength()
      val download = tm.download(req, downloadingFile)

      var lastTransferred = 0L

      while (!download.isDone()) {
        val transferred = download.getProgress().getBytesTransferred()
        lastTransferred = transferred

        println(s"progress ${download.getProgress().getPercentTransferred()}%")

        Thread.sleep(100)
      }
      download.waitForCompletion()

    } finally {
      try {
        tm.shutdownNow()
      }

      //ファイルをリネーム
      downloadingFile.renameTo(downloadFile)

    }
```

#アクセス権変更

##全員に読み込みを許可
```scala

//putを参考にしてください。
...

//リクエストのメソッドチェーン。
val upReq = new PutObjectRequest(s3BucketName, s3FilePath, localFile).withCannedAcl(CannedAccessControlList.PublicRead)

s3Client.putObject(upReq)

```


まだ書きかけ
validate条件に関連オブジェクトの値を使う時の注意点


## 今回学んだこと
####validate が実行されるタイミングは、オブジェクトの関連付けが行われる前である

(後だと思ってました)

## 前提条件
### 下記のようなリレーションを定義済み

```ruby:blog.rb
class Blog < ActiveRecord::Base
  has_many :entries
end
```
#### Entryには writer_id という属性が定義されているものとする

```ruby:entry.rb
class Entry < ActiveRecord::Base
  belongs_to: blog
  # writer_id という列をもっている
end
```

## やりたいこと
### 一つのBlogがもつEntry内で、writer_idが重複しないようなvalidateを定義したい

## 最初に試した方法(失敗例)
writer_id の重複を検知しようとしました。
しかし、validate処理が実行される時点では、
EntryとBlogが関連付けられていないため
(要するに、重複していないため)
検知できませんでした。

```ruby:entry.rb
class Entry < ActiveRecord::Base
  belongs_to: blog
  validate :unique_writer_id
  
  private
  def unique_writer_id
    # 兄弟のwriter_idをすべて取得する
    writer_id_arr = blog.entries.pluck(:writer_id)

    # 重複するものがあったらエラーとする...つもりが、エラーとならなかった
    if writer_id_arr.size == writer_id_arr.uniq.size
      errors.add(:writer_id)
    end
  end
end
```

## 正解
重複の検知ではなく、
writer_idの存在チェックにすることで解決しました。

```ruby:entry.rb
class Entry < ActiveRecord::Base
  belongs_to: blog
  validate :unique_writer_id
  
  private
  def unique_writer_id
    # 兄弟のwriter_idをすべて取得する
    writer_id_arr = blog.entries.pluck(:writer_id)

    # 自分自身のwriter_idが既に存在したらエラーとする
    if writer_id_arr.include? writer_id
      errors.add(:writer_id)
    end
  end
end
```

## 学習に費やしたお時間
#### ３時間 orz
Ceylonのエイリアス

Ceylonではクラス名やインターフェイス別名で扱うことが出来ます。

#インターフェイスのエイリアス

```ceylon

interface Strings => Set<String>;

````

こんな感じで定義するとStringsと言う名前でSet<String>が使えます。

継承している訳ではないのでダウンキャストとする訳ではないので
それぞれの型の変数に相互に入れることが出来ます。
こんな感じで。

```ceylon

	variable Set<String> set1 = LazySet {};
	Strings set2 = set1;
	set1 = set2;

````


まあ、あまりに入り交じってしまうと
エイリアスを定義してる意味がなくなってしまうかもしれませんけど。


#クラスのエイリアス

```ceylon

class StringList({String*} strs) => LazyList<String>(strs);

````

クラスのエイリアスはこんな感じです。
コンストラクタなどの定義はそのまま引き継いで設定する必要があります。


#本当にエイリアス

Ceylonには本当にaliasというキーワードがあります。
使い方はこんな感じ。

```ceylon

alias Strings => List<String>; // インターフェイスのエイリアス

alias Strings2 => LazyList<String>; // クラスのエイリアス

````

クラスはコンストラクタのパラメータをセットする必要がなくなったので
ちょっと手軽になったかも。

インターフェイスの別名の違いは
interfaceのキーワードでは１つのインターフェイスしか指定出来ませんが、
aliasでは合成型を指定することが出来ます。


単純に別名を付けるときはこっちの方が良いかも？


#まとめ

エイリアスの利用イメージはつきましたか？
スコープも合わせて考えれば便利？

そんな感じでした。

便利な使い方とか実践的な使い方の例とかがあったらぜひ教えて下さい。
PHPの参照渡しは本当に遅い？

PHPが糞言語なのはどう考えても参照をポインタだと思っているお前らが悪い
http://tanakahisateru.hatenablog.jp/entry/2013/12/12/012728

で検証されている内容で、参照渡しの性能がどうしても気になったので、
本当に遅いのか試してみました。

検証コードはほとんど上記ブログのコピペで、
参照渡し後にreturnしないコードを追加しています。
こんな感じ。

```php
<?php
function profile($funcname)
{
    $bigarray = range(1, 1000000);
 
    echo $funcname . "\n";
 
    if ($funcname) {
        $start = microtime(true);
        $ret = $funcname($bigarray, 500000);
        $end = microtime(true);
    } else {
        $start = microtime(true);
        $end = microtime(true);
    }
 
    echo "  caller memory: " . number_format(memory_get_usage()) . "\n";
    echo "  time: " . (($end - $start) * 1000) . "(ms)\n";
    unset($bigarray);
    unset($ret);
}
 
ob_start();
profile(null); // ウォームアップ
ob_end_clean();
// 参照なし
function nop_noref($arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
    return $arr;
}

// 参照渡しのみ
function nop_ref_arg(&$arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
    return $arr;
}

// 参照渡し+参照返し
function &nop_ref_both(&$arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
    return $arr;
}

// 参照渡しでreturnしない
function nop_ref_arg_noreturn(&$arr)
{
    echo "  callee memory: " . number_format(memory_get_usage()) . "\n";
}

profile('nop_noref');
profile('nop_ref_arg');
profile('nop_ref_both');
profile('nop_ref_arg_noreturn');
```

実行結果

```shell-session
% php -d memory_limit=-1 test.php
nop_noref
  callee memory: 136,495,512
  caller memory: 136,495,400
  time: 0.016927719116211(ms)
nop_ref_arg
  callee memory: 136,495,544
  caller memory: 232,884,184
  time: 81.586122512817(ms)
nop_ref_both
  callee memory: 136,495,608
  caller memory: 136,495,496
  time: 0.015974044799805(ms)
nop_ref_arg_noreturn
  callee memory: 136,496,160
  caller memory: 136,496,088
  time: 0.016212463378906(ms)
```

あんまり変わらない気がしますね。。

参照渡ししなければ中で書き換えた瞬間に巨大配列のコピーが発生しますが、
参照渡ししておけば書き換えてもコピーは発生しないので、用途によっては使って良い気がします。

ちなみに上記の各関数のechoの後ろに
`    $arr[] = null;`
を追加すると以下のようになります。

```shell-session
% php -d memory_limit=-1 test.php
nop_noref
  callee memory: 136,496,608
  caller memory: 232,885,304
  time: 80.986022949219(ms)
nop_ref_arg
  callee memory: 136,496,632
  caller memory: 232,885,416
  time: 80.711841583252(ms)
nop_ref_both
  callee memory: 136,496,680
  caller memory: 136,496,616
  time: 0.015974044799805(ms)
nop_ref_arg_noreturn
  callee memory: 136,496,712
  caller memory: 136,496,688
  time: 0.017166137695312(ms)
```

半年前くらいに書いたコードが不発弾になってるんじゃないかと心配になって確かめたけど、
そんなことはなくてよかった。

検証に使用したのは化石バージョンです。

```shell-session
% php -v
PHP 5.2.17 (cli) (built: Nov  6 2013 15:05:14) 
```
git grep した結果を sed で一括置換

Mac の場合

全てのファイルから 'ほげ' が含まれるものを探し出し、'ふが' に置換する。

```
git grep -l 'ほげ' | xargs sed -i '' -e 's/ほげ/ふが/g'
```

# 参考

[Linux - sed一括置換術(Gitにも対応) - Qiita [キータ]](http://qiita.com/wnoguchi/items/1b5d18118728b62e50fb)

[【Mac】sedコマンドで上書き保存](http://blog.shonanshachu.com/2013/02/macsed.html)
「形式手法入門」P157 「6.2.5 イベント駆動スタイル」

割と分かり易い。
ただ、「どういう操作をすると目的の値が出るのか」
を検査するのにこの方法は使えない、よね。

```alloy:eventDrivenStyle.als
// 「形式手法入門」P157 「6.2.5 イベント駆動スタイル」
open util/ordering [Time]
open util/natural

sig Time{}

sig State {
	a, b, c, n : Natural one -> Time,
	d : Natural
}{
	add[a.Time, add[b.Time, c.Time]] = n.Time // a + b + c = n
	a.Time = Zero or c.Time = Zero // a = 0 or c = 0
	gte[d, n.Time] and gt[d, Zero] // (d >= n) and (d > 0)
}

pred MLout[t, t' : Time] {
	gt[State.d, add[(State.a).t, (State.b).t]] and (State.c).t = Zero
	(State.a).t' = inc[(State.a).t]
	(State.b).t' = (State.b).t and (State.c).t' = (State.c).t
}

pred ILin[t,t' : Time] {
	gt[(State.a).t, Zero]
	(State.a).t' = dec[(State.a).t] and (State.b).t' = inc[(State.b).t]
	(State.c).t' = (State.c).t
}

pred ILout[t,t' : Time] {
	gt[(State.b).t, Zero] and (State.a).t = Zero
	(State.b).t' = dec[(State.b).t] and (State.c).t' = inc[(State.c).t]
	(State.a).t' = (State.a).t
}

pred MLin[t, t' : Time] {
	gt[(State.c).t, Zero]
	(State.c).t' = dec[(State.c).t]
	(State.a).t' = (State.a).t and (State.b).t' = (State.b).t
}

pred I [t : Time] {
	(State.a).t = Zero and (State.b).t = Zero
	and (State.c).t = Zero
}

pred T [t, t' : Time] {
	MLin[t,t'] or MLout[t,t'] or ILin[t,t'] or ILout[t,t']
}

pred Path1 {
	let t0 = first, t1 = next[t0], t2 = next[t1],
		t3 = next[t2], t4 = next[t3], t5 = next[t4] | {
			I[t0] and T[t0,t1] and T[t1,t2] and T[t2,t3] and T[t3,t4] and T[t4, t5]
			and (State.a).t5 = One
	}
}

// 以下のようにEvaluatorに入力すると、時間ごとの変数aの値が分かる
// ~(State.a)
run Path1 for 5 but 8 Time
```
Latexで~(チルダ, tilde)の入ったURLをtypesetする時

```latex
\usepackage{url}
\url{http://www.hgc.jp/~usuyama}
```
の様にすると、見た目はそれっぽく出力されますが、

* コピーしてブラウザに貼り付けると、http://www.hgc.jp/%20%CC%83usuyama に飛ばされる
* クリックできるが、飛ばされる先がチルダ以前 (http://www.hgc.jp/ )

にはまりました..。

検索して、色々試したんですが

* http://glossarch.wordpress.com/2013/02/08/inserting-tilde-for-urls-in-latex-documents/
* http://www.latex-community.org/forum/viewtopic.php?f=44&t=3663
* http://tex.stackexchange.com/questions/10858/url-with-tilde-character

うまくいかず...

結局、

```latex
\tt{http://www.hgc.jp/\%7eusuyama}
```

のように、

* チルダを%7eに変更
* URLっぽく表示されるように、monospace (tt) に

しました。
JavaScriptで関数より後に定義した変数が参照できる

# サンプルコード
getより後にxを定義したのに、getを実行すると"hello"が返ってきます。

```js
var get = function(){
    return x;
}
var x = "hello";
get();
```

# 仕様の説明
shuhei@githubに教えてもらった [var - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/var?redirectlocale=ja&redirectslug=JavaScript%2FReference%2FStatements%2Fvar#var.E3.81.AE.E5.B7.BB.E3.81.8D.E4.B8.8A.E3.81.92.EF.BC.88hoisting.EF.BC.89) によればJavaScriptの「var の巻き上げ」と呼ばれる動作です。代入した変数はスコープの先頭で宣言されていたものと見なされます。

つまり、DQNEOさんのサンプルコードと等価になります。

```js
var x,get;
get = function(){
    return x;
}
x = "hello";
get();
```
ビルドエラー、クラッシュ対応

###配列クラッシュ
配列を初期化時、クラッシュの対応の為、調べたこと

```LOG
Terminating app due to uncaught exception ‘NSRangeException’, reason:‘*** -[NSMutableArray insertObject:atIndex:]: index 10 beyond bounds for empty array’
//つまり配列が空なのに、10番目に追加しようとしているとのこと。
```




##warning: directory not found for option

原因はLibrary Search Pathsに設定が残ってしまっているのが原因で、
「TARGETS」＞「Build Setting」の「Library Search Paths」に削除したディレクトリが
記載されていると思います。
それを削除してやってください

##'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSDate)'

NSArray →JSON変換をしようとしたら、クラッシュした。
原因は、NSDATE型が、入っていたため。

[参考サイト stackoverflow](http://stackoverflow.com/questions/14337419/nsinvalidargumentexception-reason-invalid-type-in-json-write-nsdate)

[参考サイト　iPhone sdk debug memo](http://naka1948.wordpress.com/iphone-sdk-debug-memo/)
ルーム機能実装のためのsocket.joinの使い方メモ

`socket.join`で簡単にルーム機能を実装できると聞いたが、なかなか使い方を理解できなかったのでメモ。

socket.ioにはルーム機能があって、これを使えばチャットルームなどを簡単に実装できる。

#やり方


```js
socket.join("部屋名"); //部屋名に入室
```

で入室処理。

```js
io.sockets.to("部屋名").emit('message');  //特定の部屋に向けてイベントを発射
```
これで特定の部屋だけにイベントを送る。

この二つの組み合わせでルーム機能が作れる。

一応言っておくと、部屋自体をオブジェクト等で作成する必要はない。

まとめると

**1 socket.join（部屋名）でクライアントと部屋名を紐づける。**
**2 io.sockets.to("部屋名").emit('');で特定の部屋だけにイベントを発生させる。**

これで同じページにいても、それぞれの部屋が独立する。

自分が実際に実装した時は、expressで

```js
app.get("/room1", function(req, res) {
  roomnumber = "1";
});
```

として、要求されたアドレスに応じて処理を変えたが、コードが冗長になってしまった。もっと楽ちんな方法があればいいが。
【jQuery】mouseoverで変化させたCSSを、mouseoutで元に戻す

こんにちは。
jQueryの勉強も少し始まってきました。
(JavaScriptは別学習サイトにて、反復学習中です。)

タイトルですが、検索してもなかなかでてこなかったのでメモ。

```html
<p id="button">ここをマウスオーバー</p>
```

はまった点ですが、そもそもmouseoverで変化させたものを**どうやってもとに戻す**のかを知らない。

background-colorをマウスが乗ったら変えて、
外れたら戻す。

でもマウスアウトの際 ``` css("background-color","white") ```
これだと応用が効かない。

ということで、調べたところ
同じプロパティを指定して、値を空にすれば良かったんですね～できました。

```js
$(function() {
  $("#button").mouseover(function(){
    $("p").css("background-color","green");
  }).mouseout(function(){
    $("p").css("background-color","");
  });
});
```

ちなみにやったミス

```js
$(function() {
  $("#button").mouseover(function(){
    $("p").css("background-color","green");
  }).mouseout(function(){
    $("p").css("display","none");
  });
});
```

画面が真っ白になりました。
調査は大事ですね。

そして書き方に慣れない。
少しでも多く書いていくしかないですね。

(jQueryはjavascriptのライブラリだったんですね・・・
よくセットで見かけますが、別物だと思ってました・・・)

それでは、これからも宜しくお願いいたします。
【非公式】Qiitaクライアントアプリ公開!!【iPhone】

先日、非公式ですがQiitaのクライアントアプリをリリースしました。
※Qiitaサポートチームに問い合わせ、許可を得て公開をしております

その名も **『週刊Qiita』** 

## 追記: Androidアプリリリース！

Androidアプリもリリースしました！
こちらも是非ご利用ください！！

[![Android App](http://qiita-stock.info/android_download.png)](https://play.google.com/store/apps/details?id=net.jp.hello_world.qiita)

## ダウンロードはこちらから

[![iOS App](http://qiita-stock.info/iphone_download.png)](https://itunes.apple.com/jp/app/zhou-kanqiita/id766470911?mt=8)

または、AppStoreで「qiita」で検索。

ぜひ、ダウンロードをお願いしますm(__)m

## どんなアプリ？

Qiitaの週間ストックランキングを閲覧するためのiPhoneアプリです。
毎週水曜日にランキングが更新され、その一週間の間にたくさんストックされた投稿を閲覧することができます。

![20131209192933.png](https://qiita-image-store.s3.amazonaws.com/0/3223/1640b811-c861-61b8-aa58-aa4316f7dec6.png)

QiitaのページはWebViewですが、一度Qiitaにログインしておけば、Cookieが有効な限りログイン状態を維持しておけるため、気になった投稿は簡単にストックできます。

ストック数ランキングの部分はRubyで開発されています。

## ダウンロードはこちらから

ぜひ！ダウンロードをお願いしますm(__)m

[![iOS App](http://qiita-stock.info/iphone_download.png)](https://itunes.apple.com/jp/app/zhou-kanqiita/id766470911?mt=8)

[![Android App](http://qiita-stock.info/android_download.png)](https://play.google.com/store/apps/details?id=net.jp.hello_world.qiita)


そして、ご意見ご要望がありましたら、ドシドシご連絡ください！
よろしくお願いします！
Go言語でPHPのarray_chunkのようなことをする


例えば、

```go
[]string{"a", "b", "c", "d", "e", "f", "g", "h"}
```

のような1次元のスライスを

```go
[][]string{
	[]string{"a", "b", "c"}, 
	[]string{"d", "e", "f"},
	[]string{"g", "h"},
}
```

のように3個ずつのスライスに分割した2次元スライスにしたい。


# 実装してみた

```go:main.go
package main

import (
	"log"
)

func main() {
	slice := []string{"a", "b", "c", "d", "e", "f", "g", "h"}
	chunkedSlice := chunkStringSlice(slice, 3)
	log.Printf("%#v", chunkedSlice)
}

func chunkStringSlice(slice []string, size int) [][]string {
	var chunks [][]string
	
	sliceSize :=  len(slice)
	
	for i := 0; i < sliceSize; i += size {
		end := i+size
		if sliceSize < end {
			end = sliceSize
		}
		chunks = append(chunks, slice[i:end])
	}
	
	return chunks
}

```

実行結果

```
2013/12/12 17:20:23 [][]string{[]string{"a", "b", "c"}, []string{"d", "e", "f"}, []string{"g", "h"}}
```

# 課題

文字列型のスライスにのみ使える関数になってしまった。スライスに対する操作しかないので、もう少し汎用度高めたい。
ci_reporter経由でturnipのテストケースを動かす

ci_reporter経由で、rspecを実行する場合、.rspecファイルを読み込んでくれないので、明示的にオプションを渡すようなRakeタスクを作成して、その中でturnipを実行する為のオプションを設定する。

下記のコードをRakefileに書く(または、lib/task以下に配置)。

```rb
if Rails.env.test?
  require 'rspec/core/rake_task'
  require 'ci/reporter/rake/rspec'

  RSpec::Core::RakeTask.new(ci_rspec:  ["ci:setup:rspec"]) do |t|
    t.pattern = './spec/*'
    t.rspec_opts = ["-r", "turnip/rspec"]
  end
end
```

上記で作成したRakeタスクを実行。

```bash
$ RAILS_ENV=test bundle exec rake ci_rspec
```
Jenkinsでsudoが必要な場合


Jsnkinsでsudo付きにコマンドを実行する際にエラー出力

```
sudo: sudo を実行するには tty がなければいけません。すみません
Build step 'シェルの実行' marked build as failure
Finished: FAILURE
```

「いえいえ、こちらこそすいません。」といいたくなるw

対処は、

```
$ sudo /user/sbin/visudo
```

で中を編集する

```diff
- Defaults    requiretty
+ # Defaults    requiretty
+ Defaults:jenkins !requiretty
+ jenkins ALL=(ALL) NOPASSWD:ALL
```

Jenkinsの再起動で完了

***
参考サイト

* [Ubuntu12.04 VPSサーバ構築手順:CI環境構築 Jenkinsユーザのsudo処理有効化設定](http://d.hatena.ne.jp/absj31/20130127/1359308974)
Androidの文字を太字にする方法２種

Android2系（？）の「日本語が太字にできない」の解決法２種。

#text-shadowで太字風にする
よく使われてそうな方法。
でも若干にじんじゃう・・・

```css
text-shadow:1px 0 1px 色
```

#font-familyをmonospaceにする
今回見つけた方法。
太字にしたいところだけclass="bold"などを指定して、そこに太字指定と一緒にfont-familyを指定する

```css
font-family: monospace;
font-weight: bold;
```
参考：http://ameblo.jp/jun4549/entry-11380939929.html
javascriptとas3で連携してswfのキャプチャ画像を取得する方法

swfを好きなタイミングでキャプチャを撮ってローカルに保存するってことがあったのでメモ

```as3:sample.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300"
			   creationComplete="creationCompleteHandler(event)">
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
			import mx.graphics.codec.PNGEncoder;
			import mx.utils.Base64Encoder;

			/**
			 * 初期化完了イベント
			 * @param event
			 */
			protected function creationCompleteHandler( event:FlexEvent ):void {
				// JSから呼ぶときの名前を登録
				ExternalInterface.addCallback( "getCapture", capture );
			}

			/**
			 * 画面のキャプチャを生成する
			 * @return base64エンコードした画像データ
			 */
			private function capture():String {
				// DisplayObjectをBitmapDataに描画
				var bmpd:BitmapData = new BitmapData( this.width, this.height );
				bmpd.draw( this );

				// Base64でエンコード
				var base64:Base64Encoder = new Base64Encoder();
				base64.encodeBytes( new PNGEncoder().encode( bmpd ) );

				return base64.toString();
			}
		]]>
	</fx:Script>
	<s:BorderContainer width="100" height="100" backgroundColor="0x00FF00" backgroundAlpha="0.5" verticalCenter="0" left="0"/>
	<s:BorderContainer width="100" height="100" backgroundColor="0xFF0000" backgroundAlpha="0.5" verticalCenter="0" right="0"/>
	<s:BorderContainer width="100" height="100" backgroundColor="0x0000FF" backgroundAlpha="0.5" verticalCenter="0" horizontalCenter="0"/>
</s:Application>

}
```
ExternalInterface.addCallbackでJSからメソッドをコールできるようにするのがポイント。
jsから **getCapture** というメソッド名で呼び出すことができるようになる。

```js
function capture(){
	var swf = document.sample;
	// ExternalInterface.addCallbackで登録したメソッドを呼び出す
	var str = swf.getCapture();

	var png = document.createElement('img');
	png.src = "data:image/png;base64," + str;
	png.width = 400;
	png.height = 300;

	document.appendChild(png);
}
```
Go言語でランダムな文字列を生成する


ランダムな64ビットのintを生成して、基数を36に変更することで、英数混合のランダムな文字列が生成できる。

```go:main.go
package main

import (
	"encoding/binary"
	"crypto/rand"
	"strconv"
)

func main() {
	println(random())
	println(random())
	println(random())
}

func random() string {
	var n uint64
	binary.Read(rand.Reader, binary.LittleEndian, &n)
	return strconv.FormatUint(n, 36)
}

```

実行結果

```
g7zxz0xwrlq0
2zy0sbwx1ujlf
2t9t3pqrof5dm
```

# 関連

* [JavaScriptでランダムな文字列](http://qiita.com/suin/items/23ba4a487425bbad90c8)
* [PHPでランダムな文字列](http://qiita.com/suin/items/c958bcca90262467f2c0)
rubyでcssのminifyする


# 構築手順
> rubyの環境は作成済みとします
1. Gemfileを作成

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

gem 'sass'
```

2.インストール
> bundle install

3.スクリプト作成

```css_minify.rb
#!/bin/ruby
require "sass"
puts Sass::Engine.new(ARGF.read, :syntax => :scss, :style => :compressed).render
```

4.使い方
>  bundle exec ruby css_minify.rb sample.css > sample_minify.css
Cプログラムをguardを使って開発する


# 概要
* Cのプログラムを作成する際に、guardを使用してファイルの変更を検知して、ビルド、テスト実行を繰り返す。

# 利点
+ ファイルの変更を検知した時点でビルドとテストが行われるので、コンパイルエラーやテストが落ちたことがすぐわかる

# 構築手順
> rubyの環境は作成済みとします
1. Gemfileを作成

```
source 'https://rubygems.org'
gem 'guard'
gem 'guard-shell'

```

2.インストール
> bundle install

3.Guardfile作成
> bundle exec guard init

```
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

# Add files and commands to this file, like the example:
#   watch(%r{file/path}) { `command(s)` }
#
guard 'shell' do
  watch(/(.*).txt/) {|m| `tail #{m[0]}` }
end
```
## 例

```
guard 'shell' do 
  watch(%r{^.+\.(h|c)$}) do 
    `make test` 
  end 
end
```

4.Guardを起動します。
> bundle exec guard

これでファイルの変更を検知してビルドやテストが実行されます。

# 参考資料
http://stackoverflow.com/questions/9673629/using-ruby-guard-gem-to-monitor-c-files
【JavaScript】【解決】正規表現基礎　メモ

こんにちは。

恩師に昔、正規表現を覚えるといいと言われました。
本日とうとうぶち当たったのでメモ。

>
\w 「任意の英数文字、またはアンダースコア 1 文字」にマッチ
\s 空白にマッチ
\d 数値　[0-9]にマッチ
またそれぞれ大文字は否定になる

ex) \d\d は2桁の数値


> []は[]内にある任意の1文字


繰り返し
>{n,m} （n回からm回繰り返す） 
{n,}　（n回以上繰り返す） 
{n} （n回だけ繰り返す）


メソッド
> .test() マッチさせたいパターンが文字列中にあればtrue,なければfalse
.search() マッチした文字列の位置（数値）を返す　先頭は0(ない場合は -1)


量化
>? 直前の表現が0個か1個あることを示す
* 直前の表現が0個以上あることを示す
+ 直前の表現が1個以上あることを示す


行末の空白削除方法は```+$```でタブを含む場合は```[/t]+$```

置換メモ：
> 空白行を削除　^\n 「行頭の」「改行」　・・・先頭が空白だと空行と判断される
 行頭に文字を追加 ^ 、置換したい文字 


なのですが、最後の問題でつまづいています・・・。

```js
var regexp = /^Study(\w\d){3,}$/;

var str =

var result = regexp.test(str);
```

このregexpの内容を、resultで表示されるように。
という問題なのですが、
>
``` /^ $/ ```　は囲まれている中身を全て表示させる。
``` {3,} ```　は3回以上繰り返す
``` \w ```　は単語　
``` \d ```　は任意の数字


しかしこの``` (/w/d) ```　が理解できず・・・。
Study1Study1Study1も
StudyStudyStudy111も
StudyStudyStudyも
StudyStudyStudy1もだめ。
(がむしゃらに打ち込んでました)

ちょっとこれはネット探しても解決できず。

>(\w\d)は\wと同意義というものは見つけましたが
結局は解答には至らずです。
お手上げ状態。

上記編集
>「任意の英数文字またはアンダースコア１文字 + 数字１文字」なので計２文字にマッチ

正規表現はできるとかなりいいと聞くだけに悔しいです。
どなたかご教授していただけると幸いです。
+覚えておいたほうがいい正規表現 /~ とか　置換用とかもあれば是非お願いしたいです。

それではこれからも宜しくお願いいたします。
herokuの初回ログイン時にキーが作れなかった時のメモ

herokuに初回ログインするときはキーを作成するわけだけど、

```
Could not generate key: 'ssh-keygen' は、内部コマンドまたは外部コマンド、 ! 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
と出て作成できない問題が発生したのでキーの作り方のメモ。

まず、ssh-keygenを作るにはgitをインストール。（他の手段もあるようだが）

次に、環境変数でssh-keygenがある場所のPATHを登録しておく。

ちなみ自分の場合、
C:\Program Files\Git\bin
ここにあった。

環境変数を登録するには、「マイコンピューター→右クリックでプロパティ→システムの詳細設定→環境変数」

システムの環境変数の所で「新規」を押して、ssh-keygenのPATHを登録。

これで作れるはず。
node.jsをherokuにデプロイする時に躓いた事

herokuでnode.jsのアプリをデプロイするときに、とんでもなくつまらない事に躓いたので一応メモ。

前提として、herokuでデプロイするときは、Procfileというものが必要。これでnode.jsのアプリをデプロイする事をherokuに伝える。

このProcfileは、「procfile.txt」のようにテキスト形式で作成してはいけない。

ここで躓いて

```
Procfile declares types -> (none)

$ heroku ps:scale web=1 --app myapp
Scaling web processes... failed
!    Record not found.
```
と出てどうしようもなかった。

Procfileを作成するときはgit bash上で

```
echo 'web: node web.js' > Procfile
```
として作成する。"node web.js"のweb.jsの部分は自分のアプリのファイル名にする。（ここでも躓いた）

後は普通にpushするだけ。

後調べていると、ProcfileのPが大文字になっていなくてエラーが出る人もいたで、はまっている人は一応ファイル名もチェックしてみるといいかも。

間違えた名前でpushしてしまったら一度それを削除した方がいいっぽい。

```ruby:qiita.gitbash
git rm procfile
```
CentOSにHaskellをインストール


CentOSにHaskellをインストール
=

[http://justhub.org/download](http://justhub.org/download)

インストール
-

```
sudo wget http://sherkin.justhub.org/el6/RPMS/x86_64/justhub-release-2.0-4.0.el6.x86_64.rpm
sudo rpm -ivh justhub-release-2.0-4.0.el6.x86_64.rpm
sudo yum install haskell
```


起動
-

```
$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 
```

終了
-

```
Prelude> :q
Leaving GHCi.
```

インストール済みパッケージリスト
-

```
$ ghc-pkg list
/usr/local/lib/ghc-7.6.3/package.conf.d
   Cabal-1.16.0
   array-0.4.0.1
   base-4.6.0.1
   bin-package-db-0.0.0.0
   binary-0.5.1.1
   bytestring-0.10.0.2
   containers-0.5.0.0
   deepseq-1.3.0.1
   directory-1.2.0.1
   filepath-1.3.0.1
   ghc-7.6.3
   ghc-prim-0.3.0.0
   haskell2010-1.1.1.0
   haskell98-2.0.0.2
   hoopl-3.9.0.0
   hpc-0.6.0.0
   integer-gmp-0.5.0.0
   old-locale-1.0.0.5
   old-time-1.1.0.1
   pretty-1.1.1.0
   process-1.1.0.2
   rts-1.0
   template-haskell-2.8.0.0
   time-1.4.0.1
   unix-2.6.0.1
   HTTP-4000.2.10
   monads-tf-0.1.0.1
   mtl-2.1.2
   network-2.4.2.1
   parsec-3.1.4
   text-1.0.0.0
   transformers-0.3.0.0
```

パッケージのインストール
-

```
cabal update
cabal install パッケージ名
```
Markdownで書いたドキュメントをSphinxで閲覧するまで、Gruntを使ってある程度自動化してみた


Markdownで書いたドキュメントをSphinxで閲覧するにはpandocでreStructuredTextに変換し、その後make htmlするのが一般的？な流れだと思うが、都度都度ビルドするのも面倒なのでGruntを使ってタスク化してみました。ついでにgrunt-este-watchとgrunt-contrib-connectでMarkdownファイルが編集されたらビルドとブラウザリロードをするようにしてみました。

Gruntfile.jsは以下のような感じです。

```Gruntfile.js
var fs   = require("fs")
  , exec = require('child_process').exec;

module.exports = function(grunt) {

  grunt.initConfig({
    connect: {
      server: {
      	options: {
      		livereload: true,
      		port: 8000,
      		base: 'build/html',
      		hostname: 'localhost'
      	}
      }
    },
    esteWatch: {
      options: {
      	dirs: ['source/**/'],
      	livereload: {
      	  enabled: true,
      	  extensions: ['md'],
      	  port: 35729
      	}
      },
      md: function(filepath) {
      	var files = [{
      	  expand: true,
      	  src: filepath,
      	  ext: '.md'
      	}];
      	return ['to_rest', 'build'];
      }
    }
  });

  grunt.registerTask('to_rest', 'convert to reST from markdown', function() {
    var taskInfo = 'convert to reST from markdown... ';
    var cb = this.async();

    fs.readdir('./source', function(err, files) {
      files.forEach(function(file) {

      	var rest_file, cmd;

      	if (file.match(/\.md$/g)) {
      	  cmd  = 'pandoc --toc -f markdown -t rst source/' + file;
      	  cmd += ' -o source/' + file.replace(/md$/g, '') + 'rst';

          var child = exec(cmd, function(err, stdout, stderr) {
            if (err) {
               console.log(err);
               grunt.log.write(taskInfo).error();
            }
          });
        }
      });
      grunt.log.write(taskInfo).ok();
      cb();
    });

  });

  grunt.registerTask('build', 'to make standalone HTML files for Sphinx', function() {
  	var taskInfo = 'to make standalone HTML files for Sphinx... ';

	var cb = this.async();

	var child = exec('make html', function(err, stdout, stderr) {
      if (!err) {
      	console.log('stdout: ' + stdout);
      	grunt.log.write(taskInfo).ok();
      } else {
      	console.log(err);
      	grunt.log.write(taskInfo).error();
      }
      cb();
	});
  });

  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.loadNpmTasks('grunt-este-watch');
  grunt.registerTask('default', ['to_rest', 'build', 'connect', 'esteWatch']);
};
```

需要な無さげなので説明は詳しくは書きませんが、Sphinxコンテンツはmake htmlが可能な状況であるとして、とりあえずnpmで必要なモジュールをインストールします。

```
npm install grunt grunt-contrib-connect grunt-este-watch
```

grunt-cliを入れてなければ以下も実行しておきましょう。

```
npm install -g grunt-cli
```

あとは上のGruntfile.jsを書いてgrunt実行します。

```
grunt
```

するとポート番号8000でWEBサーバが起動しているので、ブラウザを開きます。

```
open http://localhost:8000
```

この状態でsource以下のMarkdownファイルを変更するとsphinx用html生成とブラウザのリロードまで行ってくれます。

※反響あれば記事を更新しようと思います。
GoogleChrome31でObject.createしてsortした配列をconsole.logすると・・・

# 配列の要素が増えたように見える

Google Chrome 31 にて

```js
var array = [1,2];
var array2 = Object.create(array);
console.log(array2); //[1, 2] 

array2.sort();
console.log(array2); //[1, 2, 0: 1, 1: 2] 
```

ふぁ！？

# 配列としては正しく動きます

確認用に以下のコードを用意しました。

```js
function assert(expected, actual) {
	if (eval(expected) === eval(actual)) {
		console.log("success" + " : " + actual + " === " + expected)
	} else {
		throw "failed" + " : " + actual + " !== " + expected;
	}
}

assert("2", "Object.create([1,2]).length");
assert("1", "Object.create([1,2])[0]");
assert("2", "Object.create([1,2])[1]");
console.log(Object.create([1,2]));

assert("2", "Object.create([1,2]).sort().length");
assert("1", "Object.create([1,2]).sort()[0]");
assert("2", "Object.create([1,2]).sort()[1]");
console.log(Object.create([1,2]).sort());
```

## Chrome31

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/15964/88dd0727-3d6a-140f-d91f-e2c85fdef940.png)

## IE10

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/15964/20e2fe74-3061-4414-4668-9cd82edc4d8a.png)

## Firefox26

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/15964/2e714174-4312-416c-041b-df7726bb96d4.png)


## node v0.10.22

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/15964/45f7b68f-1101-97a8-ad3c-87069eb5c616.png)
Mac にて capybara-webkit のインストールに失敗する

以下確認しましょう

* Qt4 (version >= 4.8) がインストールされていること

    ```
    brew update
    brew install qt4
    ```

    参考: [Installing Qt and compiling capybara webkit · thoughtbot/capybara-webkit Wiki](https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit)

* 最新の Xcode がインストールされていること
* 最新の Command Line Tools がインストールされていること
    * Xcode > Open Developer Tool > More Developer Tools... からダウンロード可能です
* 複数のバージョンの Xcode がインストールされていないこと
    * 古いバージョンが混在している場合は、以下のコマンドで消しておきましょう
`sudo /Developer/Library/uninstall-devtools --mode=all`
「形式手法入門」P22「2.1.3 抽象データの表現と解析」

非常に勉強になる本です。

多分、P25の命題のうち、2と4は、andじゃなくてimplies。

```alloy:Stack.als
module Queue
abstract sig Node { next : lone Node }
abstract sig Queue { root : lone Node }

fact noCycle { no n : Node | n in n.^next }
fact noReflexive { no n : Node | n = n.next }
fact allNodeInAQueue {
	all n : Node | some q : Queue | n in q.root.*next
}

sig Stack extends Queue {}
fact hasBottom {
	all s : Stack | Bottom in (s.root).*next
}
sig Entry extends Node { value : Value - Empty }
fact entryHasNext {
	all e : Entry | one e.next
}
sig Bottom extends Node {}
fact bottomDontHaveNext { no Bottom.next }

sig Value {}
one sig Empty extends Value {}

pred empty [s1 : Stack ] { s1.root = Bottom }

pred push [s1, s2 : Stack, v : Value ] {
	some e1 : Entry |
		e1.value = v && e1.next = s1.root && s2.root = e1
}

pred pop [ s1, s2 : Stack] {
	(s1.root = Bottom) => s2.root = s1.root
					else s2.root = (s1.root).next
}

fun top [ s1 : Stack ] : Value {
	(s1.root = Bottom) => Empty else (s1.root).value
}

assert prop1 {
	all s1, s, s2 : Stack, v : Value |
		push[s1,s,v] and pop[s,s2] implies s1.root = s2.root
}

assert prop2 {
	all s1, s2 : Stack, v : Value |
		push[s1,s2,v] implies top[s2] = v
}

assert prop3 {
	all s1, s2 : Stack |
		empty[s1] and pop[s1,s2] implies s2.root = Bottom
}

assert prop4 {
	all s1 : Stack |
		empty[s1] implies top[s1] = Empty
}


```
CurlでGithub(Private)のrawが使えなくなったので対案

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。


よくGithubプライベートリポジトリからcurlでrawデータを取って来てたりしたのです。

こんな具合に。

```shell:
curl -s -f -L -u 'LOGIN_NAME/token:API_TOKEN' https://raw.github.com/ORG_NAME/REPO_NAME/master/README.md
```

raw.githubはスクリプトをbashに渡したりするのに都合が良かったんですよね。

が、今朝(12/12/2013)トークンが古い形式だからか、rawの仕様が変わったのか、とりあえず使えなくなったことを私のNagiosが検知しました。


これはそろそろ真面目にAPIを呼ぶか、と幾らか試して次のやり方に落ち着きそう。

※ node.jsのjsonコマンドは使える前提、代わりも色々あるので置き換えて。

## base64コマンドがある場合
 
```shell:
curl -s -H "Authorization: token OAUTH_TOKEN" https://api.github.com/repos/ORG_NAME/REPO_NAME/contents/PATH_TO_CONTENT | json content | base64 -D
```

## base64コマンドがない場合

```shell:
curl -s -H "Authorization: token OAUTH_TOKEN" https://api.github.com/repos/ORG_NAME/REPO_NAME/contents/PATH_TO_CONTENT | json content | perl -MMIME::Base64 -ne 'print MIME::Base64::decode_base64($_)
```

api.githubはraw.githubとちがい、必ずJSONオブジェクトになるのでパースを一個はさもう。で、base64デコードと。
jsonコマンドはyajlなどのパッケージで何か代わりがあった気がします、


ちなみにブランチ/タグの指定はクエリでOK`?ref=master`

## Nagiosで監視しておく

このやり方がいつまで有効かは知らないので、Nagiosで監視しますわ。
check_httpのサンプルはこちら。

```shell:
check_http -H api.github.com -u /repos/MY_ORG/REPO_NAME/contents/README.md -S -k "Authorization: token OAUTH_TOKEN"
HTTP OK: HTTP/1.1 200 OK - 3366 bytes in 0.887 second response time |time=0.886742s;;;0.000000 size=3366B;;;0
```
ActiveRecordのcallbackについてまとめてみた

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#available-callbacks

ActiveRecordのcallbackについてまとめてみた

1.使い方：
ActiveRecordを継承したmodel内で使う。
class Hoge < ActiveRecord::Base
  before_validation :hoge
  ...
  private
    def hoge
      ...
    end
end

みたいな感じ。

2.動作するタイミング
beofre_xx: xxする前に :hoge メソッドを実行する
after_xx: xxしたあと メソッドを実行する
arround_xx: [TBD]

xx_save:  saveするとき:hoge メソッドを実行する。crate+updateのとき。
xx_create: create するとき:hoge メソッドを実行する。最初に１回だけ動く。
xx_update: update するとき:hoge メソッドを実行する。最初にレコードが作られたときは動かないが、更新時に動く。
xx_validation: validate するとき:hoge メソッドを実行する。null: false の要素に値を投入するときに使う。xx_saveより動作タイミングが早い。また、is_valid?でも動く。 saveよりも動作回数多い。
Java apache-derby 接続 [ commons-dbutils ]

メモ

Java MySQL 接続 [ commons-dbutils ] を derby 用に変更 （マアカワラナイ）
**加算時に明示的にキャストしないとエラーになる。**

```java

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.derby.jdbc.EmbeddedSimpleDataSource;

public class Main {

	public static final String URL = "jdbc:derby:test";
	public static final String DBNAME = "test";
	public static final String USER = "";
	public static final String PASS = "";

	public static void main(String[] args) throws SQLException {

		MapHandler mapHandler = new MapHandler();

		EmbeddedSimpleDataSource dataSource = new EmbeddedSimpleDataSource();

		dataSource.setDatabaseName(DBNAME);
		dataSource.setConnectionAttributes("create=true");
		dataSource.setUser(USER);
		dataSource.setPassword(PASS);

		QueryRunner runner = new QueryRunner(dataSource);

		for (int i = 0, j = 10; i < 10; i++, j = j << 2) {
			System.out.println(runner.query(
					"SELECT ( cast( ? as DECIMAL(10,0) ) + "
							+ "cast( ? as DECIMAL(10,0) ) ) "
							+ "AS ANS FROM (values 1 ) as t", mapHandler, i, j)
					.get("ANS"));
		}
	}
}
```
openFrameworksとKinectを連携させる

ofxKinectを使用して openFrameworks と Kinect を連携させてみます。


##まずはサンプル

kinectExampleというのを試してみました。

![](http://f.cl.ly/items/3Z3E3N2D2c3z2a3t1S24/kinect.jpg)

これがなんなのか、 **というかKinectというデバイスが何をしてくれるものなのか** よくわかってなかったのでググってみたところ、Kinectは三次元の深度をセンシングするデバイスで、普通のカメラも持っていて、

- 左上：深度情報をグレースケールで表したもの
- 右上：普通のカメラ（RGB Camera）からの映像
- 左下：OpenCVを使って輪郭を検出したもの

とのこと。


##実装手順

emptyExampleからの実装手順です。


###アドオン導入

1. ofxKinectをプロジェクトに追加する
2. **ofxKinect/libs/libfreenect/platform/windows の参照を外す**

###ヘッダ

````
#include "ofxKinect.h"
````

ここでまででビルドが成功します。

（※以下随時更新します。ストックしておくと、更新通知が飛んでくるので便利です）

###セットアップ

###深度情報取得

###描画
Springでアップロードファイルサイズを制限する

まずは、applicationContext.xmlに下記を追加する。

```applicationContext.xml
<!-- enable file upload -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- the maximum file size in bytes -->
    <property name="maxUploadSize" value="104857600"/>
</bean>
```

しかし、これだけだとHTTP Status 500の「org.springframework.web.multipart.MaxUploadSizeExceededException」が発生するので、Handlerメソッドを追加してあげる必要がある。

```GlobalExceptionHandler.java
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj, Exception e)
            throws MaxUploadSizeExceededException {
        Map<String, Object> model = new HashMap<>();
        if (e instanceof MaxUploadSizeExceededException) {
            model.put("errorMsg", "Maximum upload file size is up to 100MB");
        }
        return new ModelAndView("/upload", model);
    }
}
```

別クラスに分けたくない場合、Uploaderのクラス内でHandlerExceptionResolverをimplementして、resolveExceptionをOverrideする方法でも可。
参照[How to handle MaxUploadSizeExceededException - Stack Overflow](http://stackoverflow.com/questions/2689989/how-to-handle-maxuploadsizeexceededexception/3230352#3230352)
※ただし、上記URLではresolveExceptionメソッドに@Overrideをつけ忘れているため、そのままでは動作しない。
RxJSで定期的にWebAPIをコールして結果をクライアント側で処理する

JavaScript 側で定期的にサービスを呼び出して何か処理する場合。
`SetInterval` でもできるけど、後々の色々な要求を考えると RxJS とか使っておきたいよね的な。

呼び出す先の API として例えばこういうのがあったとする。
（ここは何でもいい。WebAPI じゃなくてもいい。）

```csharp:ValuesController.cs
public class ValuesController : ApiController
{
    public string Get(int id)
    {
        return id + "value";
    }
}
```

これを定期的に呼び出す。

```js
Rx.Observable.interval(10000).selectMany(function (i) {
    console.log('start:' + i);
    var promise = $.ajax('api/Values/' + i);
    return Rx.Observable.fromPromise(promise);
}).subscribe(function (result) {
    console.log(result);
});
```

`jQuery.Promise` はそのまま Observable になるかと思ったけど、そんなことはなかった。
（コンストラクタが無いせいで prototype 拡張できないからそりゃそうか。）

ということで `Rx.Observable.fromPromise` で `Observable` に変換してやるのがミソ。
`selectMany` を使うのもミソだけど、この辺りは[非同期時代のLINQ](http://neue.cc/2013/12/04_435.html)を参照で。
Java hsqldb 接続 [ commons-dbutils ] 

メモ

Java MySQL 接続 [ commons-dbutils ] を hsqldb 用に変更 （マアカワラナイ）
`SELECT * FROM DUAL` 的な書き方がちょっと特殊

```java

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.hsqldb.jdbc.JDBCDataSource;

public class Main {

	public static final String URL = "jdbc:hsqldb:file:test";
	public static final String DBNAME = "test";
	public static final String USER = "sa";
	public static final String PASS = "";

	public static void main(String[] args) throws SQLException {

		MapHandler mapHandler = new MapHandler();

		JDBCDataSource dataSource = new JDBCDataSource();
		
		dataSource.setDatabaseName(DBNAME);
		dataSource.setUser(USER);
		dataSource.setPassword(PASS);

		QueryRunner runner = new QueryRunner(dataSource);

		for (int i = 0, j = 10; i < 10; i++, j = j << 2) {
			System.out.println(runner.query(
					"SELECT ? + ? AS ANS FROM (VALUES(0))", mapHandler, i, j)
					.get("ANS"));
		}
	}

}
```
Java h2database 接続 [ commons-dbutils ]

メモ

Java MySQL 接続 [ commons-dbutils ] を h2 用に変更 （マアカワラナイ）

```java

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.h2.jdbcx.JdbcDataSource;

public class Main {

	public static final String URL = "jdbc:h2:file:test";
	public static final String DBNAME = "test";
	public static final String USER = "sa";
	public static final String PASS = "";

	public static void main(String[] args) throws SQLException {

		MapHandler mapHandler = new MapHandler();

		JdbcDataSource dataSource = new JdbcDataSource();
		
		dataSource.setURL(URL);
		dataSource.setUser(USER);
		dataSource.setPassword(PASS);

		QueryRunner runner = new QueryRunner(dataSource);

		for (int i = 0, j = 10; i < 10; i++, j = j << 2) {
			System.out.println(runner.query("SELECT ? + ? AS ANS", mapHandler,
					i, j).get("ANS"));
		}
	}

}

```
[Android]getActionBar()でnullが返ってくる


こちらを参考にさせて頂きました。

- 【Android】getActionBar()がNullを返す【3.x】

http://ameblo.jp/n-miyata080825/entry-11257803694.html

僕の場合は以下がAndroidManifest.xmlに以下を指定していたのが問題でした。

~~~xml:AndroidManifest.xml
<application
    ~略~
    android:theme="@android:style/Theme.NoTitleBar”>
~~~
Scaling MongoDB on AWS


MongoDB Tokyo 2013で発表してきた資料です。

<strong> <a href="https://www.slideshare.net/understeer/20131212-scaling-mongodbonawspptx" title="Scaling MongoDB on AWS" target="_blank">Scaling MongoDB on AWS</a> </strong> from <strong><a href="http://www.slideshare.net/understeer" target="_blank">Yasuhiro Matsuo</a></strong> 

2013年11月に、新しいパワフルなインスタンスが追加されたので、その紹介などを織り込んでいます。
cocoaで画像ボタン (hover付き)

# 目的
マウスカーソルが上に乗った時にハイライトする画像ボタンがほしい

# 方法
* インターフェースビルダで Squareの NSButtonを配置、Borderedのチェックを外す。
* NSButtonのカスタムクラスをMyHoverButtonにする
* NSButtonのアウトレットをコントローラに追加

MyHoverButtonの実装は以下の様な感じで

```objc
@interface MyHoverButton()
{
    NSImage *image_normal;
    NSImage *image_hover;
    NSImage *image_alternate;
}
@end

@implementation MyHoverButton

- (void)awakeFromNib
{
    [self createTrackingArea];
}

- (void)createTrackingArea
{
    NSTrackingAreaOptions focusTrackingAreaOptions = NSTrackingActiveInActiveApp;
    focusTrackingAreaOptions |= NSTrackingMouseEnteredAndExited;
    focusTrackingAreaOptions |= NSTrackingAssumeInside;
    focusTrackingAreaOptions |= NSTrackingInVisibleRect;
    
    NSTrackingArea *focusTrackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect
                                                                     options:focusTrackingAreaOptions
                                                                       owner:self userInfo:nil];
    [self addTrackingArea:focusTrackingArea];
}

-(void) setImageResources:(NSDictionary*) dict
{
    NSString *normal = [dict objectForKey:@"normal"];
    NSString *alternate = [dict objectForKey:@"alternate"];
    NSString *hover = [dict objectForKey:@"hover"];
    
    if (normal) {
        image_normal = [NSImage imageNamed:normal];
        self.bounds = NSMakeRect(0, 0, image_normal.size.width, image_normal.size.height);
    }
    
    if (alternate) {
        image_alternate = [NSImage imageNamed:alternate];
    }
    
    if (hover) {
        image_hover = [NSImage imageNamed:hover];
    }

    [self setImage:image_normal];
}

-(void)mouseEntered:(NSEvent *)theEvent
{
    [self setImage:image_hover];
}

-(void)mouseExited:(NSEvent *)theEvent
{
    [self setImage:image_normal];
}

-(void)mouseUp:(NSEvent *)theEvent
{
    [self setImage:image_hover];
}

-(void)mouseDown:(NSEvent *)theEvent
{
    [self setImage:image_alternate];
}
@end
```

コントローラ側でボタンのリソースを設定する

```objc
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"btn_normal", @"normal",
                          @"btn_alternate", @"alternate",
                          @"btn_hover"  , @"hover", nil];
    
    [_button setImageResources:dict];
}

```

画像リソースは一枚にまとめといたほうがいいとかトグルの対処はどうすんのとかいう話はあるけど直近の目的にはこれで十分。 createTrackingAreaを行わないとhoverの状態を検出できない。

参考 : http://stackoverflow.com/questions/7889419/cocoa-button-rollovers-with-mouseentered-and-mouseexited
MySQL 日付間連　小技


* 月の何日

	dayofmonth(日付)

* 年の月

	month(日付)


* 月の初日

	date_sub(日付, interval dayofmonth(日付) -1 day)

* 月の何週（週初めが日曜の場合）

	week(日付,0) - week(date_sub(日付, interval dayofmonth(日付) -1 day),0) + 1

	※week関数の第二引数を変えれば、月曜始まりとかにもできる。
引数の取り得る値は↓
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html

* 1週間後の日付

	date(日付 + interval 7 day)
ssh公開鍵暗号方式の確認コマンド

### ssh公開鍵暗号方式の確認コマンド
※一部マスクしてます

```
$ ssh-keygen -l -f .ssh/authorized_keys
1023 9b:3d:a5:aa:9e:44:2f:ef:a2:41:0b:41:04:xx:xx:xx .ssh/authorized_keys (DSA)
```

```
$ ssh-keygen -l -f tmp/id_rsa.pub
2048 bb:d9:cd:98:56:f1:9d:aa:9a:ba:d4:a5:6a:xx:xx:xx tmp/id_rsa.pub (RSA)
```
dpkg -lの”rc”状態とは


「パッケージは削除されたが、設定ファイルは残っている」状態のこと

```bash
-> % dpkg -l | grep '^rc'
rc  authbind                                      1.2.0build3                                         Allows non-root programs to bind() to low ports
rc  daemon                                        0.6.4-1                                             turns other processes into daemons
rc  ibritish                                      3.1.20.0-7                                          A British English dictionary for ispell
rc  libjffi-jni                                   1.0.2-8ubuntu1                                      Java Foreign Function Interface (JNI library)
rc  libubuntuoneui-3.0-1                          3.0.1-0ubuntu1                                      Ubuntu One widget library
rc  python-gobject-dbg                            2.21.1-0ubuntu3                                     Python bindings for the GObject library (debug extension)
```

これを削除するには

```bash
sudo aptitude purge packagename
```
や

```bash
sudo apt-get remove --purge packagename
```
や

```bash
sudo dpkg --purge packagename
```

等で可能。(どれがいいかは不明)

※ purgeオプションは設定ファイルも消す指定。


# 参考
* [command line - What do the various dpkg flags like 'ii' 'rc' mean? - Ask Ubuntu](http://askubuntu.com/questions/18804/what-do-the-various-dpkg-flags-like-ii-rc-mean)
* [\[debian-users:40869\] Re: dpkg -l での出力での「rc」の意味について](http://lists.debian.or.jp/debian-users/200406/msg00218.html)
* [\[Ubuntu\]dpkg -lで出力されるリストにある「rc」ステータスについて | GENDOSU@NET](http://gendosu.jp/archives/1518)
* [dpkg -lの\[rc\]について » ねころくぶろぐ](http://www.neko6.tk/archives/1008)
CRLFが含まれているファイルを手っ取り早く探して置換


# fileコマンドに聞いてみる

例えばカレント配下の*.javaファイルなら

```sh
find . -name '*.java' | xargs file | grep CRLF
```

見つかった結果を一括で置換したい場合は

```sh
find . -name '*.java' | xargs file | grep CRLF | awk -F: '{print $1}' | xargs dos2unix
```
など。


# 注意
fileコマンドに依存するので万能な方法じゃないです。
例えばxmlファイルとかは
`XML  document text`
とか言われるだけで改行コードの情報を教えてくれません。

# 参考
[bash - How do you search for files containing dos line endings (CRLF) with grep on Linux? - Stack Overflow](http://stackoverflow.com/questions/73833/how-do-you-search-for-files-containing-dos-line-endings-crlf-with-grep-on-linu)
フレーム付きのウィンドウをつくる。


#もっと簡単な方法がありました。
http://qiita.com/ota42y/items/f892684f0ba5a5804f63


###以下古い情報


![window.jpg](https://qiita-image-store.s3.amazonaws.com/0/273/f538c2ee-eb18-0c11-b5a8-e50cf1e59495.jpeg "window.jpg")


こんな感じに、フレームの枠素材とウィンドウサイズを指定すると、
フレームを周りにくっつけたウィンドウを生成するクラスです。

今のところ素材を適当に引き伸ばしていますが、
上下左右と四隅を追加するメソッドを作ってあるので、
引き伸ばしたくない場合はこのクラスを継承して、
ちゃんとした素材を追加するメソッドで置き換えればうまく行くはずです。

素材指定が面倒なので、一枚の素材から切り出したいなー

##使い方
```
    VariableWindow* window = VariableWindow::create(ccc4(0, 255, 255, 255),
                                                    CCSizeMake(100, 100), 10, 10,
                                                    "left_up.png", "right_up.png",
                                                    "left_down.png", "right_down.png",
                                                    "left_line.png", "right_line.png",
                                                    "up_line.png", "down_line.png");
    window->setPosition(ccp(200, 200));
    addChild(window);

    window = VariableWindow::create(ccc4(255, 255, 255, 100),
                                    CCSizeMake(300, 300), 40, 40,
                                    "left_up.png", "right_up.png",
                                    "left_down.png", "right_down.png",
                                    "left_line.png", "right_line.png",
                                    "up_line.png", "down_line.png");
    window->setPosition(ccp(500, 200));
    addChild(window);

    
    window = VariableWindow::create(ccc4(255, 255, 255, 100),
                                    CCSizeMake(100, 200), 4, 4,
                                    "left_up.png", "right_up.png",
                                    "left_down.png", "right_down.png",
                                    "left_line.png", "right_line.png",
                                    "up_line.png", "down_line.png");
    window->setPosition(ccp(200, 350));
    addChild(window);
```

##コード
https://gist.github.com/y42sora/7923204
古いカーネル、ヘッダの削除方法


ディスクフルに近づいたら、以下の方法で古いカーネルやヘッダを削除することでHDD容量を削減することが出来ます。

```sh
-> % dpkg -l | grep linux-
…
ii  linux-headers-3.2.0-56                        3.2.0-56.86                                         Header files related to Linux kernel version 3.2.0
ii  linux-headers-3.2.0-57                        3.2.0-57.87                                         Header files related to Linux kernel version 3.2.0
ii  linux-headers-3.2.0-57-generic                3.2.0-57.87                                         Linux kernel headers for version 3.2.0 on 32 bit x86 SMP
ii  linux-headers-3.2.0-57-generic-pae            3.2.0-57.87                                         Linux kernel headers for version 3.2.0 on 32 bit x86 SMP
ii  linux-headers-generic                         3.2.0.57.68                                         Generic Linux kernel headers
ii  linux-headers-generic-pae                     3.2.0.57.68                                         Generic Linux kernel headers
ii  linux-image-3.2.0-56-generic                  3.2.0-56.86                                         Linux kernel image for version 3.2.0 on 32 bit x86 SMP
ii  linux-image-3.2.0-56-generic-pae              3.2.0-56.86                                         Linux kernel image for version 3.2.0 on 32 bit x86 SMP
ii  linux-image-3.2.0-56-lowlatency               3.2.0-56.58                                         Linux kernel image for version 3.2.0 on x86/x86_64
ii  linux-image-3.2.0-56-lowlatency-pae           3.2.0-56.58                                         Linux kernel image for version 3.2.0 on x86
ii  linux-image-3.2.0-56-virtual                  3.2.0-56.86                                         Linux kernel image for version 3.2.0 on 32 bit x86 Virtual Guests
ii  linux-image-3.2.0-57-generic                  3.2.0-57.87                                         Linux kernel image for version 3.2.0 on 32 bit x86 SMP
…
```

現状のカーネルを確認する

```sh
-> % uname -a
Linux ubuntu-vbox 3.2.0-57-generic #87-Ubuntu SMP Tue Nov 12 21:38:12 UTC 2013 i686 i686 i386 GNU/Linux
```

3.2.0-57系と分かる
3.2.0-56系以前が古いのでヘッダとイメージを削除

```sh
-> % sudo apt-get remove --purge linux-headers-3.2.0-56 linux-image-3.2.0-56-generic
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージは「削除」されます:
  linux-headers-3.2.0-56* linux-image-3.2.0-56-generic*
アップグレード: 0 個、新規インストール: 0 個、削除: 2 個、保留: 0 個。
この操作後に 170 MB のディスク容量が解放されます。
続行しますか [Y/n]?y
```
これで170MBのディスクが解放されました。
くれぐれもオペミス等にはご注意下さい、念のため。



# 参考
[不要物を削除](http://lets-ubuntu.yui.at/tips/tips_delete.html)