OmniAICreator/Qiita-1.07M huggingface dataset:
phpMyAdminでAWSのRDS接続する

ローカルなどにphpmyadminがインストールされてる前提です。

phpmyadminの設定ファイルを下記のように

```php:config.inc.php
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'database.XXXXXXXX.us-west-1.rds.amazonaws.com';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'hoge';
$cfg['Servers'][$i]['password'] = 'hoge@hoge';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
/* Select mysql if your server does not have mysqli */
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
```

なんだか微妙にもっさりしてるけど、動きます。。
第9回オフラインリアルタイムどう書くの参考問題をF#で

```fsharp:makeNums.fs
open System

let rec dist e = function
  | [] -> [[e]]
  | x::xs' as xs -> (e::xs)::[for xs in dist e xs' -> x::xs]

let rec perm n xs =
  if n = 0 then
    [[]]
  else
    match xs with
    | []     -> []
    | x::xs' -> (perm n xs') @ (List.collect (dist x) (perm (n-1) xs'))

let turnSix xs =
  let add x xs = if x = 6 then [6::xs;9::xs] else [x::xs]
  List.foldBack (List.collect << add) xs [[]]

let toList (str:string) =
  str.ToCharArray()
  |> Array.map (fun c -> int c - int '0')
  |> Array.toList

let toString =
  Seq.map (fun x -> x.ToString()) >> String.Concat

let solve (str:string) =
  let a = str.Split([|':'|])
  let n = Int32.Parse(a.[0])
  let xs = toList a.[1]
  let xss =
    seq {
      for ys in perm 4 xs do
      for zs in turnSix ys do
      if List.head zs = 0 then () else yield zs
    }
    |> Seq.distinct
    |> Seq.toArray
    |> Array.sort
  if n <= Array.length xss then
    toString xss.[n-1]
  else
    "-"

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "13:01167" "1109"
  test "1:1234" "1234"
  test "2:1234" "1243"
  test "7:1234" "2134"
  test "24:1234" "4321"
  test "25:1234" "-"
  test "2:1116" "1119"
  test "2:0116" "1019"
  test "3:6666" "6696"
  test "16:6666" "9999"
  test "10:01267" "1097"
  test "14:111167" "1671"
  test "1:1111" "1111"
  test "2:1111" "-"
  test "1:666633" "3366"
  test "72:666611" "9999"
  test "73:666622" "-"
  test "1:666600" "6006"
  test "52:666600" "9999"
  test "53:666600" "-"
  test "25:06688" "8086"
  test "93:02566" "6502"
  test "11:06688" "6809"
  test "169:01268" "9801"
  test "174:01268" "9821"
  test "66:012288" "8201"
  0
```
Qiitaの要望窓口？

Qiitaの不具合や要望ってどこに言えばよいのか分かりにくい気がする。

# 現状の窓口
多分この辺りが見られてる？

## メール（サイトに記載がある公式窓口）
一応、ページ下部のサポートから辿るとメールで不具合要望を受け付けてるようです。

ですが要望に対する他の人の反応も聞いてみたいからみんなが見えるところに書きたいなって気持ちはあります。

## Twitter（サイトに記載がないけど見てるっぽい）
それとは別に、Twitterでも[@Qiita_jp](https://twitter.com/Qiita_jp)宛てメンションや[#Qiita](https://twitter.com/search?q=%23Qiita&src=typd)のハッシュタグも見てるようで、ツイートしてくれれば要望受け付けますとも言ってるようだけど、でもそっちに関してはサイト上では特に案内されてないですし目にとまるかどうかは運の要素もありそう。

## Qiita投稿（サイトに記載がないけど見てるっぽい）
あと`Qiita`と`要望`のタグを付けた投稿を[1週間くらい前にしてみた](http://qiita.com/items/398ae4c93d402539d990)ら、結構すぐに中の人にストックされたようで、この方法でも意見が届くようです。

反応無ければ一応サポート宛にメールも投げとこうとも思ったけど見られてるみたいだからメールはいっかな、と送っていない。

# まとめ
色んな所で意見や要望を拾ってくれてるようなのでそれはそれで嬉しいんだけど、サイト上での公式のアナウンスは無いから、それらがホントに届くのかどうなのかはよく分からなくてモヤモヤする。みたいな(^^;

この辺見てますよっていうサイト上での公式アナウンスの問題、なのかな？

何気に、現状＋ご意見ありがとうございますっていう自動応答があるだけでも気が済んでしまいな自分もいるｗ
Qiitaに要望：お知らせ機能を強化して欲しい

現状だと以下のケースでメールでお知らせしてくれるようです（他にもあるかもしれないけど自分が気づいた範囲ではこんだけ）。

- 自分の投稿にコメントが付いた
- 自分の投稿に編集リクエストが来た
- フォローされた
- メンションが来た

ですが、他のSNSを使ってるとQiitaにもこんな機能があると嬉しいのになぁと思うことが結構あるので要望まとめてみました。

# 要望

## お知らせの種類を増やしてほしい

- 他人の投稿にコメントした後、その投稿に新たなコメントが付いた
- 自分の投稿がストックされた
- 自分の投稿がLGTMされた

これらは全部メールでくるとウザいことも多そうなので個別にON/OFF出来ると良さそう。
で、メールは要らないけど知りたいなぁという人もまた多いと思うので↓次の要望です。

## お知らせ一覧ページが欲しい

現状だとお知らせはメールが飛んでくるのみだけど、メールって読みのがしたり、読んでもレスポンししようと思ったままお知らせがあった事自体を忘却したり、そもそもメール通知自体がウザいのでSPAM行きになってることも多いとおもいます。

そこでユーザが好きなタイミングで自分にどんなお知らせが来てるのかを確認出来るよう、お知らせ一覧ページがあると嬉しいです。

でも「(誰か)が自分の投稿Aにコメント/ストック/LGTMした」って情報は重複して表示されると邪魔なので折りたたんでくれたらなお良いですね。イメージは「Facebookのお知らせ一覧」や「Twitterの＠つながり」みたいな奴です。
Passengerでサブディレクトリを切る


httpd.confを設定。

``` httpd.conf
<VirtualHost *:80>
  ServerName rails.local
  DocumentRoot /Users/hoge/Sites/rails
  RailsEnv development
  <Directory /Users/hoge/Sites/rails>
     AllowOverride all
     Options -MultiViews
     Order deny,allow
     Allow from all
  </Directory>
  RailsBaseURI /myapp
</VirtualHost>
```

シンボリックリンクを設定する。

    $ cd /Users/hoge/Sites/rails
    # 注: アプリ内のpublicですぞ！
    $ ln -s /path/to/rails/public myapp

http://rails.local/myapp でアクセスできるようになる。


`PassengerResolveSymlinksInDocumentRoot`や`PassengerAppRoot`を設定する、という記事もあったが、意味なかった。

「config/environment.rb が見つからない」というエラーが出たが、シンボリックリンクの間違い（publicディレクトリじゃなくてRails.rootを指してた）を直したら動いた。
AS3: カメラの注視点をアニメーションさせるとき、現在地と目標との角度差によってモーション時間を長くする

## Utility

```as3

/**
 * 2つのベクトルの内積を返します
 * 用途: カメラの目標注視点と現在の注視点の離れている割合 
 * @param v0
 * @param v1
 * @return 
 * 
 */
private function getDotProduct(v0:Vector3D, v1:Vector3D):Number
{	
	var _v0:Vector3D = v0.clone();
	_v0.normalize();
	var _v1:Vector3D = v1.clone();
	_v1.normalize();
	return _v0.dotProduct(_v1);
}
```

## 使い方
カメラの注視点をトゥイーンさせるとき、目標注視点との角度差によってトゥイーン時間を長くしたい

```as3
// 目標注視点
var lookAt:Vector3D = new Vector3D(0,0,2000);

// 現在の注視点
// lookAtObject.position

var dot:Number = getDotProduct(lookAt, lookAtObject.position);	// -1～1

// 離れているほど時間を長くする
var sec:Number = -(dot-1)/2 + 0.5; // 0.5～1.5

// 例:Tween24で動かすと
var moveTween:Tween24 = Tween24.tween(lookAtObject, sec, ease).xyz(lookAt.x, lookAt.y, lookAt.z)
moveTween.onUpdate(onUpdate);
moveTween.play();

private function onUpdate():void
{
    camera3D.lookAt(lookAtObject.position);
}
```
D3で外部データーを読み込む。


D3.jsでデーターを可視化するときに役立ちます。
通常のXHRと同じく[クロスドメイン制約](http://thinkit.co.jp/article/70/3)(CORS)に気をつけてください。

##　テキストファイル
\# d3.text(url[, mimeType][, callback])

XHRを通してテキストファイルを読み込みます。

    d3.text '/data.txt', (error, rawText) ->
      # data processing

## JSON
\# d3.json(url[, callback])

JSONファイルを読み込みます。

    d3.json '/data.json', (error, arrayOfData) ->
      # data processing

## エクセル/CSV/TSV
\# d3.tsv(url[, callback])
\# d3.csv(url[, callback])

[RFC4180](http://tools.ietf.org/html/rfc4180)に準じてCSVファイルを解析してくれます。

例えば：

```text:csv
Year,Make,Model,Length
1997,Ford,E350,2.34
2000,Mercury,Cougar,2.38
```

```coffee-script:result
d3.tsv '/data.txt', (error, arrayOfData) ->
  console.log(arrayOfData)
  # [
  #   {"Year": "1997", "Make": "Ford", "Model": "E350", "Length": "2.34"},
  #   {"Year": "2000", "Make": "Mercury", "Model": "Cougar", "Length": "2.38"}
  # ]
```

## XML/HTML
\# d3.xml(url[, mimeType][, callback])
\# d3.html(url[, callback])

jQueryでアクセスすると便利です。

    d3.html '/page.html', (error, documentFragment) ->
      $.data(documentFragment)
       .select('selector')

XMLはraw textで読み込んでjQueryで解析するのもアリだと思います。

    d3.text '/data.xml', (error, rawText) ->
      xml = $.parseXML(rawText)

## 複数のファイルを読み込む

コールバックを重ねるのは止めてください。

```JavaScript:これ反面教材
step1(function (value1) {
    step2(value1, function(value2) {
        step3(value2, function(value3) {
            step4(value3, function(value4) {
                // Do something with value4
            });
        });
    });
});
```

[以前](http://qiita.com/items/99a21a0bfea8a5770ebf)紹介したQ.jsなどのライブラリを利用すると…

```coffee-script
queue = Q.all([
  Q.nfcall(d3.json, '/res.txt')
  Q.nfcall(d3.json, '/pathway.entrez.txt')
  Q.nfcall(d3.tsv, '/p200.txt')
  Q.nfcall(d3.tsv, '/mock.txt')
  Q.nfcall(d3.tsv, '/fold.txt')
])

queue.then ([ref, pathway, treatment, ctrl, data]) ->
  # render chart

queue.fail (error) ->
  # error handling
```

清潔でメンテナンスしやすいコードに成ります。
ニコニコ動画タグ仕様

# 入力可能文字列
* 空白、カンマ入力不可

# 入力桁数
* すべて全角で20文字
* すべて半角で40文字

# その他
* 1つのアイテム（動画）につき11個まで
* オーナー（投稿者）は5個までタグをロックできる
war化したrailsアプリをTomcat＋JRuby環境で動かしている時に、rails runnerを使う

意外とハマったのでメモ。
速度を稼ぐために、warファイル化したrailsアプリをJRubyで動かしているのはいいけど、バッチ処理をrails runnerでやりたいといった場合、ちょっとだけ細工が必要です。

具体的には以下のような細工になります。
・warble configでwarble.rbを生成
・warble.rbのconfig.dirsの設定にscriptフォルダを追加

warbleのデフォルト設定ではscriptフォルダがwarファイルに格納されないので、デプロイ先でrails runnerコマンドを実行しようとしても、script/railsがないので実行できないという状態になります。
なので、waable.rbにscriptフォルダをwarに含むように書き換えてやれば、それで通ります。
factor を作るときは gl 関数が便利

某所で見かけた R コードを勝手に添削。
factor を作るときは gl 関数が便利です。(参照：[Generate Factor Levels - R help](http://stat.ethz.ch/R-manual/R-patched/library/base/html/gl.html))

```r:添削前
temp <- factor(c(rep("refrige", 15), rep("normal_temp",15)))
bottle_name <- factor(rep(c(rep("evian", 5), rep("volvic",5) , rep("vittel",5)),2))
print(temp)
print(bottle_name)
```

```:結果
 [1] refrige     refrige     refrige     refrige     refrige     refrige    
 [7] refrige     refrige     refrige     refrige     refrige     refrige    
[13] refrige     refrige     refrige     normal_temp normal_temp normal_temp
[19] normal_temp normal_temp normal_temp normal_temp normal_temp normal_temp
[25] normal_temp normal_temp normal_temp normal_temp normal_temp normal_temp
Levels: normal_temp refrige
 [1] evian  evian  evian  evian  evian  volvic volvic volvic volvic volvic vittel
[12] vittel vittel vittel vittel evian  evian  evian  evian  evian  volvic volvic
[23] volvic volvic volvic vittel vittel vittel vittel vittel
Levels: evian vittel volvic
```

```r:添削後
temp <- gl(2, 15, labels=c("refrige", "normal_temp"))
bottle_name <- gl(3, 5, 30, labels=c("evian", "volvic", "vittel"))
print(temp)
print(bottle_name)
```

```:結果
 [1] refrige     refrige     refrige     refrige     refrige     refrige    
 [7] refrige     refrige     refrige     refrige     refrige     refrige    
[13] refrige     refrige     refrige     normal_temp normal_temp normal_temp
[19] normal_temp normal_temp normal_temp normal_temp normal_temp normal_temp
[25] normal_temp normal_temp normal_temp normal_temp normal_temp normal_temp
Levels: refrige normal_temp
 [1] evian  evian  evian  evian  evian  volvic volvic volvic volvic volvic vittel
[12] vittel vittel vittel vittel evian  evian  evian  evian  evian  volvic volvic
[23] volvic volvic volvic vittel vittel vittel vittel vittel
Levels: evian volvic vittel
```

factor() で作ると、Levels が勝手にアルファベット順になっちゃうので、グラフ描いたりするときに思った通りの順番で表示されないので困ります。
その点、gl() は Levels が指定した順番どおりになるので最後までチョコたっぷり。

そんじゃーね。
jQuery Alert Dialogsを使う際の注意

jQuery Alert Dialogs
http://labs.abeautifulsite.net/archived/jquery-alerts/

jQuery 1.8.3 以下でないとダメなようです。
$.browser.msie が廃止されたため、jquery.alerts.js 内で引っかかります。
http://prograrts-job.blogspot.jp/2013/01/190-jquerybrowser.html
githubの複数アカウントを使い分けるためにHTTPとOAuthTokenをつかう

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

とある状況下では、複数のGithubのアカウントが必要になる。

例えば以下の様なケース、

- 普段使うの：個人Githubアカウント
- 特定Projectの開発：管理上の都合(笑)で共通のGithubアカウント

Githubがいくら個人指向の`Organization` & `Team` な作りでも、企業間でのやりとりではそこに合わせられないということも多いでしょう。

そんな時に役立つTips.


## 個人アカウントは`SSH public key`、その他は`OAuthのトークン＋HTTP URI` でいこう

聡明な面倒臭がりなら`ssh-agent`であったり`credential-cache`を導入し、快適なgithubライフをおくっていることでしょう。

ここではみなまで述べませんが、SSH-Keyによるアカウント識別の仕組みやhttpアクセス時のアレコレを考えると、Githubのアカウント使い分けは結構難がある仕組みになっています。

OAuth Tokenを使ったリポジトリClone手法を覚えておくとアカウントを使い分けつつほぼシームレスに全関係者用リポジトリにアクセスすることができます。

[Creating an OAuth token for command-line use](https://help.github.com/articles/creating-an-oauth-token-for-command-line-use)

とりあえず上記を参考に共通アカウント用のTokenを発行しましょう、Roleは`repository`のみで十分です。


## Tokenを使った`via https`なクローン

Tokenを手に入れたら、HTTP認証の文字列としてRemoteURIに組み込みましょう。

    git clone https://{OAuth Token}@github.com/{org or user}/repository.git

または既存の`git repository`にリモートを追加したいとき。

    git remote add upstream https://{OAuth Token}@github.com/{org or user}/repository.git

これらは嬉しいことに`ssh-agent`や`credential-cache`に優先します。

Githubアカウントの使い分けに不便を感じたら是非試してみてください。
コマンドラインでnpm installしてそのまま、package.jsonに追加する。

[npm install](https://docs.npmjs.com/cli/install)

・dependenciesに追加。

```
npm install --save log
```

・devDependenciesに追加。

```
npm install --save-dev log
```

・optionalDependenciesに追加。

```
npm install --save-optional log
```
HTMLのカラーコードから、明度を出した話


「動的に変化する背景色に対して、文字色は黒がいいか白がいいかを自動判断する」
という必要にかられました。のびーです。

というわけで、カラーコードから、その色が暗いのか明るいのか、
すなわち**明度**をとってくるJavascriptを書いてみたので、まとめです。

色表現の話は面白いですよねー。

## 基本
HTMLで使われているカラーコード(#ff0000みたいなやつ)は、
**RGBで表現された色**です。
最初の2桁の16進数が赤(R)、次が緑(G)、次が青(B)を表し、
それぞれをどのくらいの強さで出すかで、色を表しています。

一方、明度とは何なんでしょうか。
実はこれは、**HSB**という別の表現方法の、Bにあたるものです。
HSBは、色相(Hue)・彩度(Saturation)・明度(Blightness)の組み合わせで色を表しています。

HSBの詳細は割愛。
でもHSBの方が人間の感覚的に分りやすい色表現と言われてます。


## 変換しよう

そんなわけなので、まずはRGBをHSBに変換する方法を押さえなきゃいけないわけです。

以下のページが分りやすかったです。

- [RGB←→HSB相互変換【Windowsプログラミング研究所】](http://www13.plala.or.jp/kymats/study/gazou/HSB/HSB.html)

HとSの計算式も面白いんですが、とりあえずいまはBの話だけ。
なんと```RGBの最大値```がBlightnessにあたるらしいです。しんぷるすぎるわ!!

てなわけで、RGB(それぞれ256段階)から明度を出すサンプルコードはこんな感じになります。

```javascript
var rgb = [128, 30, 200]; // R=128, G=30, B=200

// 0〜255の値が入っているので、255で割っておく
var blightness = Math.max(rgb[0], rgb[1], rgb[2]) / 255; 
```

## しかしこれだけだと納得いかない

しかし、ちょっとこれだけだと人間の感覚に合わないんですよね。

たとえば、

<span style="background-color: #888800; color: white;">#888800</span>と<span style="background-color: #000088; color: white;">#000088</span>は、明度は同じはずですが、
どう見たって前者の方が明るく見えます。

原因はまぁいろいろ考えられるんですが、
**RGBそれぞれの原色が持っている明るさが違う**ってのが大きい気がします。

それぞれのMAXである、
<span style="background-color: #ff0000; color: white;">#ff0000</span>・<span style="background-color: #00ff00; color: white;">#00ff00</span>・<span style="background-color: #0000ff; color: white;">#0000ff</span>
を見比べてみても、青が一番暗い感じがしますよね。

この感覚をうまく、今回出す明度にも反映したいんですが、
感覚の話なので、うまいこと数式にはできなさそう。

RGBそれぞれに、補正値(ハンデ)を付けられるようにする
ってのが、とりあえずの対応としてはいい気がします。

## 最終的に

その後、16進数のparseとか、引数を色々対応させるとかして、
こんな感じのものができました。

```javascript
// 補正付きの明度取得
var getBright = function (colorcode, mod) {
    // 先頭の#は、あってもなくてもOK
    if (colorcode.match(/^#/)) {
        colorcode = colorcode.slice(1);
    }

    // 無駄に、ケタを動的に判断してるので、
    // 3の倍数ケタの16進数表現ならOK etc) #ff0000 #f00 #fff000000
    var keta = Math.floor(colorcode.length / 3);

    if (keta < 1) {
        return false;
    }

    // 16進数をparseして、RGBそれぞれに割り当て
    var rgb = [];
    for (var i = 0; i < 3; i++) {
        rgb.push(parseInt(colorcode.slice(keta * i, keta * (i + 1)), 16));
    }

    // 青は暗めに見えるなど、見え方はRGBそれぞれで違うので、
    // それぞれ補正値を付けて、人間の感覚に寄せられるようにした
    var rmod = mod.r || 1;
    var gmod = mod.g || 1;
    var bmod = mod.b || 1;

    // 明度 = RGBの最大値
    var bright = Math.max(rgb[0] * rmod, rgb[1] * gmod, rgb[2] * bmod) / 255;

    // 明度を返す
    return bright;
};


// 補正はとりあえず、こんなもんがよさげだった
var mod = { r: 0.9, g: 0.8, b: 0.4 };

getBright('#ffc300', mod);

// 薄い背景色なら黒文字、明るい背景色なら黒文字、とかに使う
getBright('', mod) > 0.5 ? 'black' : 'white'
```

## まとめ

- RGB → HSBの変換自体たのしい。もっとあそびたい。
- HSLのLを使った方がいい説も出てきたので、また調べたい
cloud9がすごい

久しぶりにcloud9を触ってみましたよ。
そしたら、日本語入力ができたんですよ！！！

どうなってんの？
で、いろいろ考えたり、調べたりしてみると。
たぶん、透明なテキストがあって、そこに入力して、入力内容を描画しているのではないだろうかと推測。

いやー、本当にびっくりしましたよ。
CreateJS をはじめる人が知っておくとラクなこと


CreateJSをはじめる人向けに、自分が使った時に手間取った所をまとめておきます。
ドキュメントには書いてあることだけど、英語わからなかったりすると意外と手間取るとこ。

CreateJSをかるく触ったことある人向け。


## createJSのプロパティをグローバルから参照する

createJSの各プロパティは、通常createjsオブジェクトから参照する必要があるが、
以下のようにすることで、グローバルに参照できるようになる。

```javascript:JavaScript
createjs = window; // EaselJS、TweenJS などの読み込み前に行う
```

```javascript:JavaScript
var stage = new Stage("sample_canvas"); // グローバルに参照できるようになる
```

（この記事の下記のサンプルコードでは、一応createjsから参照します）



## Canvasの更新はTickerで行う

CreateJSでは、Canvas描画の更新はStageのインスタンス上で
update()を実行することで行うわけですが、
基本的には、FPSを指定したTickerのtickイベント時にのみ行うことがおすすめ。

```javascript:JavaScript
var stage = new createjs.Stage("sample_canvas");

createjs.Ticker.setFPS(30);

createjs.Ticker.addEventListener("tick", function() {

	stage.update(); // 30fpsでステージの描画が更新されるようになる
});
```

こうすることで、Canvasの更新タイミングを気にせず処理を書けるようになる。
更新を止めたいときは、removeEventListenerを使えばOK。




## cache() メソッドを使って処理をかるくする

<del>作成したBitmapやShapeをキャッシュしておくことで、
描画処理をかるくできる。</del>

（2013/5/18 修正）Bitmapにはcacheを使ってもパフォーマンスはあがらないようです。むしろ下がるみたい。cacheメソッドは複雑なShape、複数のBitmapでグループ化したContainer などに有効なようです。（公式ドキュメントに普通に書いてあった..

```javascript:JavaScript
var bitmap = new createjs.Bitmap("sample.png");
// sample.png の実際のサイズ 100x100

bitmap.cache(0,0,100,100);
// 第3引数と第4引数は、画像のサイズを指定する
```

cache()を使うと、インスタンスそれぞれに紐付いた別のCanvasに描画が行われ、
ステージへの描画はその別Canvasから行われるようになる。




## DOM要素を扱う

CreateJSは、DOM要素も扱える。

```javascript:JavaScript
var html_element = document.getElementById("sample_element");

var element = new createjs.DOMElement(html_element);
```

他のインスタンス同様、CreateJS のマウスイベントなどをバインドできる。




## スプライト画像を扱う

DOM実装でいうところのCSSスプライトのように、
複数の画像を1つにくっつけて扱いたいとき。

```javascript:JavaScript
var bitmap = new createjs.Bitmap("sample.png");
// 100x100 の画像を縦に5個つないだ100x500の画像

bitmap.set({
	sourceRect : new createjs.Rectangle(0,200,100,100)
	// 上から3つめの100x100部分を表示
});
```

BitmapAnimationを使う方法でも実現できるけど、こっちのほうがらく。



## マウスイベントのヒットエリアを拡張する

Bitmapなどの設定するマウスイベントは、
画像の大きさがそのままヒットエリアになっています。
（透過pngだと、透明部分は反応しないようになってる）

ヒットエリアを拡張したいときは以下のようにする。

```javascript:JavaScript
var bitmap = new createjs.Bitmap("sample.png");
// sample.png の実際のサイズ 100x100

var hitAreaShape = new createjs.Shape();

hitAreaShape.set({
	x        : -50,
	y        : -100,
	graphics : new createjs.Graphics().beginFill("#FFF").drawEllipse(0,0,300,200)
	// 300x200 の楕円形
})

bitmap.set({
	hitArea : hitAreaShape
});
```

これでBitmapのマウスイベントのヒットエリアが300x200の楕円形に拡張される。



## マスクの使い方

マスクを使いたいときはこんな感じ。

```javascript:JavaScript
var bitmap = new createjs.Bitmap("sample.png");
// sample.png の実際のサイズ 100x100

var maskShape = new createjs.Shape();

maskShape.set({
	x        : 50,
	y        : 50,
	graphics : new createjs.Graphics().beginFill("#FFF").drawEllipse(0,0,300,200)
	// 300x200 の楕円形
})

bitmap.set({
	mask : maskShape
});
```

ヒットエリアと違い、座標はターゲットが起点にならないので注意。



## おわりに

とりあえず、自分が使った範囲で手間取ったところをまとめました。

CreateJSはほかにも、

* CSSPluinでDOM要素のCSSを扱えるようになる！
* MotionGuidePlugin でくねくねしたアニメーション！
* Filterを使ってぼかしとか！

など、便利な機能盛りだくさんッ

CreateJSをAndroid端末で使おうと思っている人向けに、
[CreateJS × Android でハマったこと](http://qiita.com/items/6df5e01a7a29417e55c6)
という投稿もしています。
cocoapodsとOCMockとGHUnitをまとめて導入する方法


### 環境 (2013/04/23時点)
* Xcode : 4.6.2
* cocoapods : 0.18.1

--

### ざくっとすること
* cocoapodsの導入
* Podfileに組み込みたいライブラリ(今回であればGHunitとOCmock)を記述
	
* GHUnitを使用する為のターゲットを作成

* main.mを修正

--

### 手順
1. cocoapodsの導入

	``` bash
	gem install cocoapods #しばらく待つ
	pod setup
	```

2. Podfileに組み込みたいライブラリを記述
導入したいプロジェクト(ディレクトリ)に移動後、下記コマンドを実行

	```
	vim Podfile
	pod install # このコマンドは後述のPodfileの記述後に実行
	```

	Podfileの内容例

	```
	platform :ios
	target :UnitTest do
        pod 'GHUnitIOS'
        pod 'OCMock'
	end
	```
この時点で、**GHUnit**と**OCMock**が導入される。

3. GHUnitを使用する為のターゲットを作成
このターゲットはPoffileの**target :_UnitTest_**と一致させておく。
この時開くファイルは**HOGE.xcodeproj**ではなく**HOGE.xcworkspace**を使用する

4. main.mを修正
	
	``` objectivec
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, @"GHUnitIOSAppDelegate");
    }
	```

--

### 参考情報

* [[iOS] CocoaPods を導入して GHUnit と OCMock を使って単体テストを書く](http://dev.classmethod.jp/smartphone/iphone/ios-cocoapods-ghunit-ocmock/ "[iOS] CocoaPods を導入して GHUnit と OCMock を使って単体テストを書く")

* [CocoaPodsでGHUnit + OCMockなiOS開発環境を構築する](http://mtgto.hatenablog.com/entry/2012/12/09/022425 "CocoaPodsでGHUnit + OCMockなiOS開発環境を構築する")

* [CocoaPods ではじめる Objective-C ライブラリ管理 (1)](http://d.hatena.ne.jp/Watson/20111204/mac_dev_jp_advent_calendar_cocoapods01 "CocoaPods ではじめる Objective-C ライブラリ管理 (1)")

* [Podfile](http://docs.cocoapods.org/podfile.html "Podfile")

* [GHUnitの導入について](http://qiita.com/items/1f34df54aa61335dc680 "GHUnitの導入について")
Flaskを触ってみた


pythonのフレームワーク Flask を勉強してます。

構造はわかりませんが、HTTPサーバを入れなくても動きます。
ちなみに情弱な僕はオフィシャルサイトにある通り virtualenv 上で動かしてます。

http://a2c.bitbucket.org/flask/

~~~name.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
	return "index page"

@app.route("/<username>")
def show_name(username):
	return "hello " + username

app.run()
~~~
追記
debian 6.0.6で動かしてます
linux わからない
TitaniumでAndroidアプリをつくる準備をする。

忘れないうちにメモ。

1. TitaniumStudio の Dashboard を開く。

2. Configure Native SDKs の Android SDK を選択する。

3. Install or Update Android SDK ボタンを押す。

4. Android SDK を保存したい場所を選択する。

5. ダウンロード or アップデートが終わると、Android SDK Manager が立ち上がるので Android 2.2 (API 8) をインストールする。

と、たったこれだけでOKです。
（インストールが完了するとTitaniumStudio の Dashboard の Configure Native SDKs の Android SDK にチェックがはいります）

※ TitaniumStudio 3.1.0.201304151600 & MacBook Pro OS10.7.5 にて確認

以前のバージョンではadbの場所を変更したり、PATHを通したりと
色々面倒な感じだった気がしたんですが、かんなり楽に設定できるようになったようです。
コマンドの補完リストをgrepしたいときはcompgenを使うと便利

AWS関連コマンドとか ec2-xxxx-yyyy-zzzzz みたいなコマンドが大量にありすぎて、TAB補完しても目的のコマンドが全然探せない！

じゃーgrepすりゃいいかって思った瞬間に気づく…、補完候補ってってパイプに流せないじゃん！？

## そこでcompgenですよ。
実のところbashの補完機能の裏ではまさにこの`compgen`という組み込みコマンドが大活躍してる。こいつが全ての補完候補を作ってくれていると言っても過言ではないだろう。なので、補完リストを取りたいんならcompgenを直接使いこなしてしまうのが一番ってわけだ。

何かいっぱいオプションあるけど、**-c オプションを抑えておけば十分**です。

`compgen -c ec2-`とかやるとec2-まで入力してTAB補完したのとほぼ同じリストが出力される（aliasとかfunctionとかはこれだと出ないけど割愛）。

## 利用例
だからインスタンス操作系のコマンドって何があるのかなーと思ったら↓こんな感じで探せる。

```
$ compgen -c ec2- | sort | grep instance
ec2-bundle-instance
ec2-cancel-reserved-instances-listing
ec2-cancel-spot-instance-requests
ec2-confirm-product-instance
ec2-create-instance-export-task
ec2-create-reserved-instances-listing
ec2-describe-instance-attribute
ec2-describe-instance-status
ec2-describe-instances
ec2-describe-reserved-instances
ec2-describe-reserved-instances-listings
ec2-describe-reserved-instances-offerings
ec2-describe-spot-instance-requests
ec2-import-instance
ec2-modify-instance-attribute
ec2-monitor-instances
ec2-purchase-reserved-instances-offering
ec2-reboot-instances
ec2-report-instance-status
ec2-request-spot-instances
ec2-reset-instance-attribute
ec2-run-instances
ec2-start-instances
ec2-stop-instances
ec2-terminate-instances
ec2-unmonitor-instances
```

AWSのインスタンス操作系コマンドはそれだけでも数が多い方からこれでも多く見えるけど…、ec2-での候補は**166個**もあったのにinstanceでgrepしたら**22個**だよ！

かなり探しやすくなったでしょ？
【WP-Champloo】指定したカテゴリに所属するのかを調べる関数

現在の投稿が指定したカテゴリに所属するのかを調べる関数です。
複数の場合は配列形式で指定します。

## ソースコード

```php5:functions.php
<?php
/**
* @function in_parent_category
* @param cats_id(array)
* @return bool
*/
if(!function_exists('in_parent_category')){
	function in_parent_category($cats_id = null){
		global $post;

		foreach((array)$cats_id as $cat_id){
			$parent_cats = get_term_children(intval($cat_id), 'category');
			if($parent_cats && in_category($parent_cats, $post->ID)){
				return true;
			}
		}

		return false;
	}
}
?>
```


## パラメータ

**cats_id（カテゴリID）**


## 使用例

```php5:ソース
<?php if(in_parent_category(3)): ?>
<p>カテゴリID「3」に所属しています。</p>
<?php endif; ?>
```

**複数ある場合**

```php5:ソース
<?php if(in_parent_category(array(10,20))): ?>
<p>カテゴリID「10」または「20」に所属しています。</p>
<?php endif; ?>
```
rubyのlambdaとprocの比較実験

lambdaについて調べてみました。
procとはblockに名前を付けれる点で似ているが、違う点がある。以下にその違いを実験したコードを書く。

1.引数の数をlambdaの引数の数を一致させなければエラーが起きる。
procだと起きない。

```ruby:lambdaの引数エラー
def test1(v, code)
  code.call(v)
  #引数の数をlambdaの引数の数を一致させなければエラーが起きる。
  #procだと起きない。
end

def test2(v,v2, code)
  code.call(v,v2, 'hoge') #引数を増やす
end

lam = lambda do |v|
  return v*100
end

puts test1(1, lam) #=> 100

puts test2(2,22, lam) 
# lambda.rb:13:in `block in <main>': wrong number of arguments (3 for 1)(ArgumentError)
#   from lambda.rb:10:in `call'
#   from lambda.rb:10:in `test2'
#   from lambda.rb:19:in `<main>'

```

```ruby:procの場合
def test_proc1(v, proc)
  proc.call(v)
end

def test_proc2(v, v2, proc)
  proc.call(v,v2)
end

pr = Proc.new do |v|
  v*100
end

puts test_proc1(1, pr) #=> 100
puts test_proc2(2,22, pr) #=> 200

```
***
2.lambdaとprocではreturnの挙動が違う。
proc内のreturnでは、メソッドの返り値になるが、
lambda内のreturnは、そうならない。

```ruby 
def lam_return_test
  lam = lambda do |v|
    return "#{v} lamda"
  end
  p "#{lam.call("inner")} call"#(1)
  p "after lamda call"#(2)

  "end"#(3)
end

p lam_return_test 
#=> 
# "inner lamda call" (1)
# "after lamda call" (2)
# "end" (3) lam_return_testの返り値
#
#lambda中のreturnはlambdaで完結している。
#

def proc_return_test
  proc = Proc.new do |v|
    return "#{v} proc" #(1)
  end
  p "#{ proc.call("inner") } call" #(2)
  p "after proc call" #(3)
  "end"#(4)
end

p proc_return_test

#=>
#"inner proc"(1)
#
#proc中のreturn (1)はproc_return_testの返り値となっている。
#(2)の pメソッド以下は呼ばれない

```
Rails + Devise + Pow で undefined method エラーが出る


環境変数 RAIS_ENVを定義する.powrcを作成する

```:.powrc
export RAILS_ENV="development"
```

##参考

[Pow + Rails + Devise 環境で undefined method エラー → 解決 | CreativeStyle](http://kadoppe.com/archives/2012/07/rails-pow-devise-undefined-method-error.html)

上記URLが詳細に書いてます。ありがとうございました！
acts-as-taggable-on でモデルクラス毎に使用されているタグ一覧を取得する

たとえば 店舗 Shop と 商品 Product があって、それぞれにタグを使用していたとき、店舗に割り当てられているタグのみを取得したいとき。

```ruby:shop.rb
class Shop < ActiveRecord::Base
  acts_as_taggable_on :tags
  acts_as_taggable_on :genres
end
```

```ruby:product.rb
class Product < ActiveRecord::Base
  acts_as_taggable
end
```
tags_on は acts_as_taggable_on/acts_as_taggable_on/collection.rb で クラスメソッドとしても用意されていて

```
Product.tags_on(:tags) # => ActiveRecord::Relation
Shop.tags_on(:tags)
Shop.tags_on(:genres)
```
のように取得することができる。（インスタンスメソッドの tags_on は配列を返すが、こちらは ActiveRecord::Relation を返す）

ちなみに、コンテキスト（:tags とか :genres）を指定せず、そのモデルクラスに使用されているもの全てを取り出すのであれば

```
Shop.all_tags # => ActiveRecord::Relation
```
で可能。
Mountain Lion で make sh: make: command not found が出る


Mountain Lion にしたからか、上記エラーが出てmakeできない。

Xcode 4.3以降では makeとかのCommand Line tools がデフォルトでインストールされてないらしい。

1. Xcode ⇨ preferences ⇨ Downloads で Command Linetoolsをダウンロード。

2. その後にターミナルで以下のコマンドを打つ。

```sh:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
```


これでたぶん使えるようになると思います。

##参考

[xcode4 - Upgrading to Mountain Lion and XCode 4 broke my "make"? - Stack Overflow](http://stackoverflow.com/questions/11705912/upgrading-to-mountain-lion-and-xcode-4-broke-my-make)

[osx - installing "make" on Mac - Stack Overflow](http://stackoverflow.com/questions/11494522/installing-make-on-mac/11494872#11494872)
指定していないserver_nameのとき404を出すようにする

nginxは最初に定義されたserver directiveをデフォルトとして, server_nameがマッチしなかった時は勝手にそこを見る.
この挙動で嬉しい思いをしたことがあまりない.

`````nginx.conf
  server {
    listen 80 default_server;
    location / {
       return 404;
       break;
    }
  }
`````````

nginx.confの最初にこれを入れておくと無駄にハマらない
SSHへのBrute force attackをiptablesで防ぐ

アタック自体は防げませんが...

# 環境

* CentOS release 6.4 (Final)
* iptables.i686 1.4.7-9.el6

ほかに、ipt_recentというモジュールが必要らしいんだが、インストールされているものなのか、どうも確認ができず。やってみたら動いたのでOKとするけど...

# 方針

同じホストから60秒以内に5回のSSH接続があったら、そのホストからのSSHアクセスを10分間受け付けない。

# 考え方

1. 新規のSSH接続があったらそれを「接続してきたヤツ」リストに記録しておく。（アタックではないアクセスも記録する。）
1. 新規のSSH接続があるたびにその「接続してきたヤツ」リストを確認して、直近60秒で5回以上（要するに、6回目）のアクセスだったらBrute force attackとして認定し、「悪いヤツ」リストに別途記録しておく。
1. 新規のSSH接続があるたびに「悪いヤツ」リストを確認して、直近10分以内にそのリストに記録されたホストだったら接続を受け付けない。

## もうちょっと細かい考え方

1. INPUTチェーンへのSSH接続は別チェーン（ここではSSHチェーンとする）に飛ばす。
1. SSHチェーンでは以下の3つの動作をする。
 1. 「悪いヤツ」リストに記録されているヤツかの確認。その場合は接続をREJECTする。
 1. 「悪いヤツ」リストに記録されていないヤツなら、「接続してきたヤツ」リストを確認して60秒5回の判定をして、Brute force attackかどうかを判定。めでたく認定されたものはさらに別チェーン（ここではSSHATTACKチェーンとする）に飛ばす。
 1. 60秒5回の判定に引っかからなければ、「接続してきたヤツ」リストに記録して、接続を許可する。
1. SSHATTACKチェーンでは「悪いヤツ」リストに追加、接続をREJECTする。

# 手順

## SSH接続を別チェーンに一旦飛ばす。

ここでは、SSHという名前のチェーンを使うことにする。

```:/etc/sysconfig/iptables
-A INPUT -p tcp - state --state NEW -m tcp --dport 22 -j SSH
```

## SSHチェーンで記録を取りつつBrute force attack認定する。

SSHチェーンはこんな感じで動く。

```:/etc/sysconfig/iptables
-A SSH -m recent --name sshbadcon --rcheck --seconds 600 -j REJECT
-A SSH -m recent --name sshcon --rcheck --seconds 60 --hitcount 5 -j SSHATTACK
-A SSH -m recent --name sshcon --set
-A SSH -j ACCEPT
```

まず、

```
-A SSH -m recent --name sshbadcon --rcheck --seconds 600 -j REJECT
```

で、「悪いヤツ」リスト（sshbadcon）の中身をチェックして、直近600秒以内で記録されているかを確認。その場合はREJECTする。

次に、

```
-A SSH -m recent --name sshcon --rcheck --seconds 60 --hitcount 5 -j SSHATTACK
```

で、「接続してきたヤツ」リスト（sshcon）の中身をチェックして、直近60秒以内に5回のアクセスがあったか確認。その場合はSSHATTACKチェーンに飛ばす。

さらに、

```
-A SSH -m recent --name sshcon --set
-A SSH -j ACCEPT
```

で、そこに当てはまらなかった接続（=アタックではない接続）について、「接続してきたヤツ」リストに記録し、ACCEPTする。

## Brute force attack認定されたヤツを「悪いヤツ」リストに追加する。

リストに追加してREJECT。

```:/etc/sysconfig/iptables
-A SSHATTACK -m recent --name sshbadcon --set
-A SSHATTACK -j REJECT
```

# まとめ

以上を施した全体のiptables（SSH接続に関するものだけ）は以下の感じ。

```:/etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:SSH - [0:0]
:SSHATTACK - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j SSH
-A SSH -m recent --name sshbadcon --rcheck --seconds 600 -j REJECT
-A SSH -m recent --name sshcon --rcheck --seconds 60 --hitcount 5 -j SSHATTACK
-A SSH -m recent --name sshcon --set
-A SSH -j ACCEPT
-A SSHATTACK -m recent --name sshbadcon --set
-A SSHATTACK -j REJECT
COMMIT
```

# Thanks

以下のサイトを参考に（というかほぼそのまま）させて頂きました。とても感謝しています。

* [iptables の ipt_recent で ssh の brute force attack 対策](http://www2s.biglobe.ne.jp/~nuts/labo/inti/ipt_recent.html)
rubyのProc.newの実験

Proc.newを実験してみました。
blockに名前を付けて使いまわす時に使えそう。

```ruby
def test_proc1(v, proc)
  proc.call(v)
end

def test_proc2(v, proc)
  "#{proc.call(v)}%"
end

pr = Proc.new do |v|
  v*100
end

val = test_proc1(1, pr)
puts val #=> 100

percent = test_proc2(2, pr)
puts percent #=> 200%
```
RailsのActiveRecordを、STI以外の目的で継承して使うときは親を抽象クラスにしないと正しく動かない

たとえば

```ruby:app/model/article/tag.rb
class Article::Tag < ::Tag
  self.table_name = 'article_tags'
  has_many :taggings, :dependent => :destroy, :class_name => 'Article::Tagging'
end
```
```ruby:app/model/article/tagging.rb
class Article::Tagging < ::Tagging
  self.table_name = 'article_taggings'
  belongs_to :tag, :class_name => 'Article::Tag'
end
```

でも、うまくテーブル名の指定が効かなかった。（Rails 3.2.13）

```
irb(main):001:0> Article:Tag.new
ActiveRecord::StatementInvalid: Could not find table 'tags'
```

ググってみると

[ActiveRecord Inheritance without STI?](https://github.com/rails/rails/issues/5541)

というわけで、親クラスを抽象クラスにすることで動いた。

```ruby:config/initializers/taggable.rb
Tag.module_eval do
  self.abstract_class = true
end
Tagging.module_eval do
   self.abstract_class = true
end
```

```
irb(main):001:0> Article:Tag.new
=> #<Article::Tag id: nil, name: nil>
```
jsでformを作ってsubmitさせる時の注意点

あまりケースとしては無いと思うけど、js側でformElementを生成して、postでsubmitしたい場合の注意点。

## 基本形

```submit.js
var form = document.createElement('form');
form.action = 'http://google.com';
form.method = 'post';
form.submit();
```

これでも動くのだが、IEだと動かない。

## IE対応

どうやら、IEの場合HTMLの中に要素として挿入しないとsubmitしてくれないらしい。
なので、bodyElementに生成したformElementを突っ込んであげる。

```ie_submit.js
var form = document.createElement('form');
form.action = 'http://google.com';
form.method = 'post';
document.body.appendChild(form);
form.submit();
```
rubyのyieldの実験

rubyのyieldを試した。
関数を別の別の関数に渡したいときに使えそう。

```ruby
array = [1,2,3,4]

def test_yield(arr)
  new_arr = []
  arr.each do |v|
    new_arr << yield(v)
    #yieldはtest_yieldを呼び出した時に与えたblock
  end
  return new_arr
end

new_arr = test_yield(array) do |v|
  v*10
end
puts new_arr.inspect #=>[10, 20, 30, 40]

```
android:screenOrientation="sensorLandscape"としたときにonConfigurationChangedが呼ばれない


androidアプリの画面の向きを横向きのみで縦に回転させたくないときには、
AndroidManifest.xml内にて

```AndroidManifest.xml
<activity android:screenOrientation="sensorLandscape">
```
のように記述すると実現出来ます。

また、画面回転時のイベントを受け取るためには、

```AndroidManifest.xml
<activity configChanges="orientation|keyboardHidden|screenSize">
```
このように記述します。
（screenSizeはandroid3.2以上用）


しかし上記のように記述しても、
一部の端末で画面を回転させた時に、
ActivityのonConfigurationChangedイベントが呼ばれないことがありました。

そのため、代替手段として以下のメソッドを実装してイベントを取得しました。

```Java:SampleActivity.java
public class SampleActivity extends Activity implements SensorEventListener
{
	private int mRotation;
	private SensorManager mSensorManager;

	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);

		mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
		mSensorManager.registerListener(this, 
			mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
			SensorManager.SENSOR_DELAY_NORMAL);
	}

	public void onSensorChanged(SensorEvent event) {
		int rotation = getWindowManager().getDefaultDisplay().getRotation();
		if (mRotation != rotation) {
			// 画面が回転した！
		}
	}
}
```
アンダースコア区切りのカラム名とキャメルケースのフィールドをマッピングする

conf/application.conf に以下を追記。

```
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
```

## 参考

* [Play の evolutions を Heroku で使おうとしてハマった - hakobera's blog](http://hakobera.hatenablog.com/entry/20120224/1330071564)
AWSのアカウント間でAMIを共有するのをやってみる

AWSの別アカウントどうしでAMIを共有するのをやってみたので手順をメモしておく。
最近は別リージョンへのAMIコピー機能も追加され、AMIを作りなおさなくて良くて便利。
全てManagement Console上で実施。

## やってみた手順

1. AMIの共有
 1. AMIを所持している方のアカウントでEC2のAMIを表示
 1. 共有するAMIを選択して「Edit」実施
 1. 「Permissions」を選択して「Add Permissions」ボタンを押下
 1. 「AWS Account Number」に共有先AWSアカウントのアカウント番号入力してチェック
1. 共有されたAMIの利用
 1. AMIを共有されたアカウントでEC2のAMIを表示(共有元と同じリージョンにする)
 1. 「Filter」が「Owned By Me」になっている場合は「Private Images」にすると共有されたAMIが表示される
 1. EC2する際も、AMI選択画面で「My AMIs」の「Private Images」を選択すれば共有されたAMIが選択出来る

## 参照サイト

 * [Amazon EC2、AMIを共有する ｜ 横浜のホームページ制作 スタジオFIXの社長ブログ](http://www.studio-fix.com/blog/kaoru/2009/04/14/post167/)
ImageMagick でアニメーション GIF を作る

ImageMagick のコマンドでいろいろできることがわかったので、アニメーション GIF を作ってみた。google で検索して探した [この画像](http://blogs.yahoo.co.jp/ayutafamily/GALLERY/show_image.html?id=28653506&no=1) をローカルに origin.jpg という名前で保存し、アニメーション GIF にする。シェルは Zsh を使っている。

## 画像の情報を確認する

```
$ identify origin.jpg
origin.jpg JPEG 904x1024 904x1024+0+0 8-bit DirectClass 297KB 0.000u 0:00.000
```

## 画像を切り分ける
元画像は縦 3 コマ、横 4 コマの一枚の画像なので、コマごとに切り分ける。

```
$ for i in {0..2}; do
for> for j in {0..3}; do
for for> convert -crop 226x341+$(( 226*$j ))+$(( 341*$i )) origin.jpg out-$i-$j.jpg
for for> ;done
for> ;done
```

## アニメーション GIF を作る
delay オプションでコマの間隔を指定する

```
$ convert -delay 15 out-*.jpg anime.gif
```
ActiveRecord::Store


http://api.rubyonrails.org/classes/ActiveRecord/Store.html

serializeのラッパー。アクセサを自動的に定義してくれる。YAMLで保存する。

## メリット
- テーブルのカラム変更しなくて良い
- ハッシュを保存できるなどスキーマの自由度高い
- バリデーション、フォームはカラム定義した場合と同じように上手く動作する

## デメリット
- YAMLのパースが遅い
  - 一覧するだけでもかなり重くなる場合がある。
  - [Marshalにする](http://devkato.tumblr.com/post/17549827803/rails3-2-store)
- save時に必ずUPDATEが走る
- 検索が大変
  - 必要になったら、検索用カラムを追加するのでもいい
- SQLでソートできない
  - ruby側でがんばるか、必要になったらカラム追加でもいい
- データ構造が標準化されない
UTF-8からShift_JISに変換する時の注意


UTF-8 から SJIS変換する時、

    str.encode(Encoding::SJIS, :invalid => :replace, :undef => :replace)

と、やれば `Encoding::UndefinedConversionError` エラーは出ないのだけど、ハイフン等の情報が失われて"?"になる。

特定の文字を文字コード変換前に変換しておけばOK。
http://esoz.blog.fc2.com/blog-entry-59.html を参考に、Stringを汚さないように書き直しました。

``` ruby:
def sjis_safe(str)
  [
    ["301C", "FF5E"], # wave-dash
    ["2212", "FF0D"], # full-width minus
    ["00A2", "FFE0"], # cent as currency
    ["00A3", "FFE1"], # lb(pound) as currency
    ["00AC", "FFE2"], # not in boolean algebra
    ["2014", "2015"], # hyphen
    ["2016", "2225"], # double vertical lines
  ].inject(str) do |s, (before, after)|
    s.gsub(
      before.to_i(16).chr('UTF-8'),
      after.to_i(16).chr('UTF-8'))
  end
end
```


サンプルは以下。

``` ruby:sjis_safe_test.rb
# coding: utf-8
str = sjis_safe("〜−¢£¬−‖").encode(Encoding::SJIS)
open("out.txt", "w") {|f| f.write(str)}
```
plotで軸タイトルを縦書きにする

当方windows環境です。
plotを用いる際に軸タイトルを縦書きにしたいと聞かれたのでとりあえず改行コードを間にはさむ回答をしたのですが、ggplot2やlatticeを用いる以外にもっとエレガントな回答ないでしょうか。

```r:axis_text.R
convertTXT <- function(x){
res <- paste(collapse="\n", unlist(strsplit(split="", x)))
return(res)
}

plot(x=2000:2010, y=25:35, type="p", xlab="平均気温", ylab="")
mtext(convertTXT("全世界の海賊の数"), side=2, las=1, line=3)
```
jQuery : テキストフィールドのmaxlengthを確認する

テキストフィールドのmaxlengthを確認するためのスクリプト
コンソールから実行すると、テキストフィールドのvalueにmaxlengthが表示されます。

```javascript
$('input[type="text"]').each(function(){$(this).val($(this).attr('maxlength'))});
```
Sublime Text 2でPythonの開発環境を整える


## はじめに

Pythonでプログラムを書くとき、Sublime Text 2を使っています。
今回は、私が使用しているSublime Text 2のPython環境について紹介します。

## 前提条件

Mac上のSublime Text 2を前提に書いています。

## インストールするプラグイン

Pythonのプログラムを効率よく書くために、以下のプラグインをインストールしています。

* Python PEP8 Lint (PEP8コーディング規約チェック)
* Python PEP8 Autoformat (PEP8用コードフォーマッター)
* SublimeRope (Python用統合環境)

## 設定

タブを半角スペースに置き換えたり、インデント数を半角スペース4つにしたいので、Pythonのプログラムを開いた状態でメニューから「Sublime Text 2」→「Preferences」→「Settings More」→「Syntax Specific  - User」を選択します。Python.sublime-settingsファイルが開くので以下の内容を記述し、保存します。

```
{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}
```


## 参考資料

* http://blog.hifumi.info/mac/sublime-text-2-for-mac/
pod install で Unable to find a specification エラーがでたら


## 対処手順

迷わず

```ls ~/.cocoapods/master/[目的のPackage名]```

恐らく空値が返るので

```pod setup```

もう一度

```ls ~/.cocoapods/master/[目的のPackage名]```

を実行するとディレクトリが作成されているので、```pod install [目的のPackage名]```  が成功するようになります。

## 捕捉

+ ```pod setup``` は [CocoaPods / Specs](https://github.com/CocoaPods/Specs) の内容を ~/.cocoapods/master に fetch  するコマンド
+ ```pod install``` は 実行時に ~/.cocoapods/master から目的の Package を探して install

以上、2点を説明するための具体例が上記の「対処手順」になります。

```pod install``` 時に [CocoaPods / Specs](https://github.com/CocoaPods/Specs) から ネットワーク経由で Package を install するものと思い込んでいたために、「なんでやねんパッケージあるやんけ」と半狂乱になりかけたので、ここに書き残そうと思った次第です。

誰かのお役に立ちますと幸いです。
最新vim.railsのコマンドの記述方法


これまでは任意のジャンプコマンドについて、以下のように記述することが出来ました。以下は、":Rbbmodel"や":Rbbview"として、backbone.jsのコードへジャンプ出来るようにした例です。

```.vimrc
autocmd User Rails Rnavcommand bbmodel app/assets/javascripts/backbone/models -suffix=.js.coffee -glob=*
autocmd User Rails Rnavcommand bbview app/assets/javascripts/backbone/views -suffix=.js.coffee -glob=**/*
```

2013-04-01リリースの5.0からはrails_projectionsを利用するように変更されてます。
http://www.vim.org/scripts/script.php?script_id=1567


```.vimrc
let g:rails_projections = {
        \ "app/assets/javascripts/models/*.js.coffee": {
        \   "command": "bbmodel"},
        \ "app/assets/javascripts/views/**/*.js.coffee": {
        \   "command": "bbview"}
        \ }
```

ただし、ちょっと試した感じ、上のようにしてもViewsへうまくジャンプ出来ませんでした…。やり方が分かり次第追記したいと思います。
CreateJS × Android でハマったこと

CreateJS（主にEaselJS、TweenJS）は
Canvasを簡単に扱えるとても便利なライブラリだけど、
実際に使うと色々なカベにぶちあたる（主にAndroid）。


## alphaはTweenさせる前にもう一度0にセット

StageにaddChildした時に、alphaを0にセットしていても
Tweenを設定するとなぜか要素がうっすら表示されてしまうことがある。

```javascript:JavaScript
tween_target
.set({
	alpha : 0
})
.to({
	alpha : 1
}, 300)
```

toする前にいま一度alphaを0にセットする。


## タッチデバイスにて、mousedownが2回発火

Touch.enable(stage) で、タッチイベントをCreateJSがラップしてくれるようになる。
このとき、 mousedownイベントがもともと発火するタッチデバイスにて、
CreateJSがラップしたmousedownイベントが2回発火する問題が発生する。
（touchstart分とmousedown分が発火しているみたい）

```javascript:JavaScript
button.addEventListener("mousedown", function (event) {

	if(event.nativeEvent.type != "touchstart") {
	// mousedownの時は処理を行わない
		return;
	}

});
```
eventオブジェクトのnativeEventのtypeをみて、
mousedownでは処理を行わないようにする。
mouseupでも同じ問題が起きるので、同様に回避する。


## cache()とclone()を組み合わせるとBitmapが変になる

Bitmapインスタンスを扱うときに、cache()メソッドを使うと処理を軽くできるわけですが、
cache()メソッドを使ったBitmapをclone()して扱うと、表示が変になるバグが発生する。

```javascript:JavaScript
instance2 = instance1.clone();

instance2.updateCache();
```

updateCache()でcacheを更新すると回避できる。


## clearRect() 部分が原因で、一部のAndroid端末で処理落ち

clearRect()が原因で、一部のAndroid端末のブラウザが落ちるという現象が発生する。
EaselJS内の

```javascript:easelJS
p.clear = function() {
	if (!this.canvas) { return; }
	var ctx = this.canvas.getContext("2d");
	ctx.setTransform(1, 0, 0, 1, 0, 0);
	ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
}
```

という部分を

> ```javascript:easelJS
> p.clear = function() {
> 	if (!this.canvas) { return; }
> 	var ctx = this.canvas.getContext("2d");
> 	ctx.setTransform(1, 0, 0, 1, 0, 0);
> 	var m = (this.canvas.width + 255) >> 8;
> 	var n = (this.canvas.height + 255) >> 8;
> 	for (var i = 0; i < m; ++i) {
> 		for (var j = 0; j < n; ++j) {
> 			ctx.clearRect(i << 8, j << 8, 256, 256);
> 		}
> 	}
> }
> ```

のように修正する。
分割してclearRectすることで回避できる。
（詳しくは、以下の2つめの参考URL）


## 参考にさせてもらったページ

> [Android × Canvas の即死ポイントとその回避策](http://buccchi.jp/blog/2013/03/android_canvas_deathpoint/)
> [ CreateJSでハマったこと - まるちゃんブログ](http://d.hatena.ne.jp/cflat-inc/20130325/1364167648)


## おわりに

ここにまとめたのは Androidで CreateJSをつかったときに起こる問題です。
CreateJSに限らず、Android × Canvasでは色々と問題が多い。
それについてはまたどこかで・u・ノ

CreateJS触り始めの人向けに、
[CreateJS をはじめる人が知っておくとラクなこと](http://qiita.com/items/fd3054d1aa7ec5164744)
という投稿もしています。
第8回オフラインリアルタイムどう書くの問題をF#で

```fsharp:bomb.fs
let WIDTH = 6
let HEIGHT = 5

type Matrix =
  struct
    val D : uint32
    new (d) = {D = d}
    new (s:string) = {D = System.Convert.ToUInt32(s,16)}
    new (x,y) =
      {D = 1u <<< (31 - x - (y * WIDTH))}
    member this.At(x,y) =
      (this.D >>> (31 - x - (y * WIDTH))) % 2u > 0u
    override this.ToString() =
      this.D.ToString("x8")
    static member (+) (m1: Matrix, m2: Matrix) =
      new Matrix(m1.D ||| m2.D)
    static member Zero = new Matrix()
  end

let toRow y (m:Matrix) =
  Array.map (fun x -> m.At(x,y)) [|0..WIDTH-1|]
let fromRow y (r:bool array) =
  [0..WIDTH-1]
  |> List.filter (fun x -> r.[x])
  |> List.sumBy (fun x -> new Matrix(x,y))
let toColumn x (m:Matrix) =
  Array.map (fun y -> m.At(x,y)) [|0..HEIGHT-1|]
let fromColumn x (c:bool array) =
  [0..HEIGHT-1]
  |> List.filter (fun y -> c.[y])
  |> List.sumBy (fun y -> new Matrix(x,y))
let blast1D x (w:bool array) =
  let outofRange i = (i < 0) || (Array.length w <= i)
  let rec indexOfWall d i =
    if outofRange i || w.[i] then i else indexOfWall d (i+d)
  let w1 = indexOfWall -1 (x-1)
  let w2 = indexOfWall 1 (x+1)
  Array.map (fun i -> w1 < i && i < w2) [|0..Array.length w - 1|]
let blast2D (w:Matrix) x y =
  let h = w |> toRow y |> blast1D x |> fromRow y
  let v = w |> toColumn x |> blast1D y |> fromColumn x
  h + v
let blast (w:Matrix) (b:Matrix) =
  seq {for x in 0..WIDTH-1 do
       for y in 0..HEIGHT-1 do
       yield (x,y)}
  |> Seq.filter b.At
  |> Seq.sumBy (fun (x,y) -> blast2D w x y)
let solve (s:string) =
  let a = s.Split([|'/'|])
  let b = blast (new Matrix(a.[0])) (new Matrix(a.[1]))
  b.ToString()

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "802b1200/01400c20" "53c40cfc"
  test "28301068/84080504" "d64fef94"
  test "100a4010/80010004" "e241850c"
  test "81020400/000000fc" "0e3cfbfc"
  test "80225020/7e082080" "7fdd24d0"
  test "01201200/40102008" "fe1861fc"
  test "00201000/01000200" "43c48f08"
  test "00891220/81020408" "ff060c1c"
  test "410033c0/0c300000" "3cf0c000"
  test "00000000/01400a00" "7bf7bf78"
  test "00000000/20000a00" "fca2bf28"
  test "00000000/00000000" "00000000"
  test "00cafe00/00000000" "00000000"
  test "aaabaaaa/50000000" "51441040"
  test "a95a95a8/56a56a54" "56a56a54"
  test "104fc820/80201010" "ea30345c"
  test "4a940214/05000008" "05000008"
  test "00908000/05000200" "ff043f48"
  test "00c48c00/fe1861fc" "ff3873fc"
  test "00000004/81020400" "fffffff0"
  test "111028b0/40021100" "e08fd744"
  test "6808490c/01959000" "17f7b650"
  test "30821004/81014040" "c75de5f8"
  test "0004c810/10003100" "fe4937c4"
  test "12022020/88200000" "edf08208"
  test "2aa92098/01160000" "45165964"
  test "00242940/10010004" "fc43c43c"
  test "483c2120/11004c00" "33c3de10"
  test "10140140/44004a04" "eda3fe3c"
  test "0c901d38/72602200" "f36da280"
  0
```
Swingで例外時にダイアログを出しスタックトレースを表示する


Swingで例外が発生した際に、ダイアログを出してスタックトレースを表示します。

* getStackTraceで取得したスタックトレースをStackTraceElementに格納して一行ずつ取り出します。
* ダイアログの表示はJOptionPane.showMessageDialogを使います。第２引数にSwingのコンポーネントを指定できるので、取り出したスタックトレースをJTextAreaなどに書き出して表示させます。

```java:AppDialog.java

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class AppDialog {

	public static void stackTraceDialog(Exception e) {
		// スタックトレースの書き出し
		String message = new String();
		StackTraceElement[] stackFrames = e.getStackTrace();
		for (int i = 0 ; i < stackFrames.length ; i++) {
			String stackFrame = stackFrames[i].toString();
			message = message + stackFrame + "\n";
		}
		
		// ダイアログウィンドウ用パネル
		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());
		// ラベル
		JLabel label = new JLabel("処理できない例外が発生しました。");
		// テキストエリア
		JTextArea area = new JTextArea();
		area.setText(message);
		area.setCaretPosition(0); // テキストエリア内のテキストの表示位置の初期化
		area.setEditable(false); // 編集不能にする
		// テキストエリアにスクロール設置
		JScrollPane scrollpane = new JScrollPane(area);
		scrollpane.setPreferredSize(new Dimension(600, 200));
		// ダイアログにラベルとテキストエリアを貼る
		panel.add(label, BorderLayout.NORTH);
		panel.add(scrollpane, BorderLayout.SOUTH);
		
		// ダイアログ表示
		JOptionPane.showMessageDialog(null, panel, "Error", JOptionPane.ERROR_MESSAGE);
	}
```

例外が発生した際にcatchで上記AppDialog.stackTraceDialogを呼び出すと、次のようなウィンドウが表示されます。

![stackTraceDialog](https://qiita-image-store.s3.amazonaws.com/0/17925/c2e1757a-f112-5d17-7f53-11006303a397.png)
Emacs 使用中に素早く検索する

Emacs で開いているファイル中の単語を検索したいことはよくあります．そんなときに便利なのが [search-web.el](http://d.hatena.ne.jp/tomoya/20090703/1246610432) です．これは，カーソル位置の単語，もしくはリージョン内の文字列を，任意の検索エンジンで検索を行うものです．使い方は以下を参考にしてください．

参考: http://d.hatena.ne.jp/tomoya/20090703/1246610432

さて，このプログラムではリージョン内の文字列とカーソル位置の単語で別の検索コマンドが割りあてられていますが，色付きリージョンの機能があるので1つにまとめましょう．つまり，色付きリージョンがあればリージョン内の文字列を，なければカーソル位置の単語を検索エンジンで検索します．それを行うのが以下の関数です．

```cl
(defun search-web-dwim (&optional arg-engine)
  "transient-mark-mode がオンの時はリージョンを，
オフの時はカーソル位置の単語を検索する．"
  (interactive)
  (cond
   ((transient-region-active-p)
    (search-web-region arg-engine))
   (t
    (search-web-at-point arg-engine))))
```

以下はこの関数を利用している私の .emacs です．

```cl
(require 'search-web)

(define-prefix-command 'search-web-map)
(global-set-key (kbd "M-i") 'search-web-map)
(global-set-key (kbd "M-i g") (lambda () (interactive) (search-web-dwim "google")))
(global-set-key (kbd "M-i e") (lambda () (interactive) (search-web-dwim "eijiro")))
```

これで，M-i g でグーグル検索，M-i e で英辞郎 on the WEB を検索できます．
LCMapStringは変換文字列を終端してくれない場合がある

Win32APIのLCMapStringはある文字列をロケール依存な別の文字列にマッピング（変換）してくれる関数。（全角ひらがな→半角カタカナとか）

[MSDNページ](http://msdn.microsoft.com/ja-jp/library/cc448052.aspx)のlpDestStr(変換された文字列を格納するバッファ)の解説には
> cchSrc パラメータに渡す値にかかわらず、並び替えキーの最後には NULL が付けられます。
と書いてありますがどうも**cchSrcに-1以外を指定すると、終端文字が付加されない**模様。

```cpp
std::wstring wstrSrc(L"きょうはいいてんきです");
std::unique_ptr<WCHAR[]> wzDest(new WCHAR[64]);

int iRet = 
    LCMapString(0x0411, LCMAP_KATAKANA, wstrSrc.c_str(), -1, wzDest.get(), 64);
```

は`キョウハイイテンキデス`をちゃんと終端して返してくれますが、

```cpp
std::wstring wstrSrc(L"きょうはいいてんきです");
std::unique_ptr<WCHAR[]> wzDest(new WCHAR[64]);

int iRet = 
    LCMapString(0x0411, LCMAP_KATAKANA, wstrSrc.c_str(), wstrSrc.length(), wzDest.get(), 64);
```

は`wzDest`が終端されていません。戻り値を見て終端しましょう。

```cpp
wzDest[iRet] = L'\0';
```
FuelPHP で自作関数みたいなファイルはどこに置いたら良いか

##FuelPHP で自作関数みたいなファイルはどこに置いたら良いか

答え：./fuel/app/classes/ 以下にルールに従って配置する。

```./fuel/app/classes/hoge.php
<?php
class Hoge {
	public static function fuga($var)
	{
		return $var . ' fuga.';
	}
}
```

みたいに置く。
このように置いておくと、普通に使えるようになる。

```./fuel/app/classes/controller/welcome.php
<?php
class Controller_Welcome extends Controller
{
	public function action_index()
	{
		$fuga = Hoge::fuga('This is');// This is fuga.
		return Response::forge(View::forge('welcome/index'));
	}
}
```

みたいに。

### 階層を持った置き方

./classes 直下に置くとごちゃごちゃして嫌だとか。
そんな時はルールに従えばOK。(たぶん…)
例えば、以下みたいにしてみるとか。

```./fuel/app/classes/myutil/validation.php
<?php
class MyUtil_Validation {
	public static function validateHoge($string) {
		return $string . ' hoge';
	}
	public static function validateFuga($string) {
		return $string . ' fuga';
	}
	public static function _validation_is_unique($val, $field)
	{
		$flag = false;
		// ゴニョゴニョ
		return $flag;
	}
}
```

これで、MyUtilディレクトリの中にいろいろ入れれそうな気がする。

複数階層に渡る場合は、ディレクトリセパレーターとして「_」を用いてクラス名をつけてやればいい。(はず…)
tarでVCS関連のファイルを除外してアーカイブする

何気なくmanを見ていてGNU tarに`--exclude-vcs`なるオプションが有ることを知りました。
VCS関連のファイルを除外してくれるようです。
（まぁ昨今のVCSならexportとかarchiveみたいなサブコマンド使ってもよいんですが。）

たとえば、こんな感じでgitで管理しているディレクトリがあったとして、

```
foo
├── .git
│   ├── HEAD
│   ├── branches
│   ├── config
│   ├── info
│   │       :(snip)
│   └── refs
├── .gitignore
├── bar.txt
└── foo.txt
```

アーカイブ時に`--exclude-vcs`オプションを加えてやると、

```
$ tar --exclude-vcs -zcf foo.tar.gz foo
```

このようにVCS関連のファイル／ディレクトリが除外されてアーカイブされます。
（.gitと.gitignoreが除外された）

```
$ tar -ztf foo.tar.gz
foo/
foo/foo.txt
foo/bar.txt
```

除外されるパターンは、CentOS6に入ってたv1.23と最新のv1.26共にこのような定義になっていました。

```c:tar.c
static char const * const vcs_file_table[] = {
  /* CVS: */
  "CVS",
  ".cvsignore",
  /* RCS: */
  "RCS",
  /* SCCS: */
  "SCCS",
  /* SVN: */
  ".svn",
  /* git: */
  ".git",
  ".gitignore",
  /* Arch: */
  ".arch-ids",
  "{arch}",
  "=RELEASE-ID",
  "=meta-update",
  "=update",
  /* Bazaar */
  ".bzr",
  ".bzrignore",
  ".bzrtags",
  /* Mercurial */
  ".hg",
  ".hgignore",
  ".hgtags",
  /* darcs */
  "_darcs",
  NULL
};
```

参考

GNU tar 1.26: 6.4 Excluding Some Files
http://www.gnu.org/software/tar/manual/html_section/exclude.html
Windows7でVPN設定を削除するには

##Windows7でVPN設定を削除するには

Windows7でVPN設定を削除したかった時、どうすれば良いのかわかりにくい。
※twitterでFavされる事が多いのでこっちにも書いてみる。

1. 右下のネットワークアイコン

2. ネットワークと共有センター

3. 左ペインで“アダプタの設定”

4. 任意のVPN設定の削除

(一部名称など略)