OmniAICreator/Qiita-1.07M huggingface dataset:
pygit2 を static link でセットアップ

pygit2 の基本的なセットアップ手順は
http://www.pygit2.org/install.html#building-on-nix-including-os-x
を見てください。

LD_LIBRARY_PATH でも RPATH でもなくて static リンクでビルドしたいので、その手順をメモっておきます。

なお、libgit2 と pygit2 のバージョンは揃えないとビルド通らないので、 git 最新版と最新リリース版のどちらかを選んでください。以下の手順では git を使います。

## libgit2のビルド

BUILD_SHARED_LIBS を off にしてビルドします。ついでにスレッドセーフ（デフォルトOFF）もONにします。
`$HOME/local` は好きな場所に変えてください。

```
$ git clone --depth 1 git://github.com/libgit2/libgit2.git
$ mkdir libgit2/build
$ cd libgit2/build
$ cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/local -DTHREADSAFE=1 -DBUILD_SHARED_LIBS=0
$ cmake --build . --target install
```

## pygit2 のインストール

`LIBGIT2` を使って libgit2 をインストールした場所を指定します。

`LDFLAGS=-lcurl` をしないと `import pygit2` したときにシンボルが見つからないというエラーになってしまいました。

```
LIBGIT2=$HOME/local LDFLAGS="-lcurl" pip install -U -e git+https://github.com/libgit2/pygit2.git#egg=pygit2
```
rbenvをアップデートする

ruby2.0を使おうと思い立ち、 `$ rbenv install -l` で確認したらdev版しかない。
アップデートが必要なようだ。

## ruby-buildを入れなおす

brewでruby-buildを入れたクチなので、インストールし直す。
この際にはunlinkが必要（やらないと、既にあると怒られて実行できない）。

```
$ brew unlink ruby-build
$ brew install --HEAD ruby-build
```

## rbenvで2.0を入れる

あとはいつもどおり。

```
$ rbenv install 2.0.0-p0
```

結構待つね。
UINavigationBarのleftBarButtonItem の当たり判定が見た目よりも広かった件


* UINavigationBarの左に出るボタンの当たり判定が、見た目よりも広い
* 当たり判定をコントロールしたい思ったら、UINavigationBarにaddSubviewで対応可能
* addSubviewしなくても良い方法があったら教えてください

UINavigationBarの左に出るボタンの当たり判定は、見た目よりも広い
----
指で操作しているときは気付きにくいですが、UINavigationBarの左側に出てくるボタン(Backとか)は、当たり判定が見た目よりも広かったです。

XCodeにて「Master-Detail View」なプロジェクトを作って試したところ、真ん中のタイトル部分の横ぐらいまでが「クリックしたら反応する」エリアでした。

![当たり判定のあるエリア](https://www.evernote.com/shard/s3/sh/c6edfc1f-996c-4db5-837d-4c733b51ef13/735705be36560808d3c59cbc16f8fee8/res/9b437d23-5fec-4fac-82ff-5b4e85a804e1/skitch.png)

UINavigationBarに色々入れる場合、サイズなどもiOS側で判断し配置しています。その一環として、「見た目よりも広く反応する」を、iOS側でやっているのだと思います。押したつもりで押せてなかった！を未然に防いでいるのでしょう。

とは言ってもこれが「誤動作」になる場合もある
-----
さて、普通にUITableViewでうにゃうにゃやってるときはこの動作はありがたいのですが、"UINavigationBar直下にクリックする何か"を配置すると、この広がったエリアが邪魔になることがあります。
そのデザインはどーよ？というのはありますが、技術的に回避する方法としては、「UIBarButtonItemを使うのをあきらめて、UIButtonをaddSubviewしてしまう」手はあります。

```objc:Controller.m
-(void)viewDidLoad
{
...
//    self.navigationItem.leftBarButtonItem = self.editButtonItem;
    // ↑の代わりに、素のUIButtonを貼り付ける↓
    self.button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.button setTitle:@"エ" forState:UIControlStateNormal];
    self.button.frame = CGRectMake(2,2,40,40);
    [self.navigationController.navigationBar addSubview:self.button];
...
}
```

addSubviewしただけなので、表示/非表示の制御はちゃんと書く必要があります。

![](https://www.evernote.com/shard/s3/sh/cbff2260-249b-43d0-9f78-2b13c8874046/1c3c32b5e753677b6aff7cb6a20940aa/res/7ae2a3f6-f127-4b61-80e3-5a6d73f069ab/skitch.png)

とわいえ、小手先な回避策だと思ってます。
----
UINavigationBarのleftItemの、当たり判定をコントロールする方法を知ってる人がいたら、Qiitaで記事を書いて @paming にメンションもらえると喜びます。
ctrlp.vimを使う

#project.vimの代わりに使えるﾌﾟﾗｷﾞﾝ
vimでのファイルアクセスには、unite.vimとproject.vimを併用していましたが、最近ctrlp.vimを使うようにしています。project.vimも大変素晴らしいpluginなのですが、ctrlp.vimもまた素晴らしいプラグインです。
どのように素晴らしいかと言うと、ファイルの絞り込みを簡易に出来るという点です。
unite.vimのfileをさらに簡易にした感じです。
言葉ではその良さをなかなか伝えられません。

#インストール

``` .vimrc
NeoBundle 'kien/ctrlp.vim'
```

みんな大好きNeoBundleで一発です。

#使い方
<C-p>で起動します。後は適当にキーを動かして使いましょう。ファイル名の絞り込みの仕組みが結構賢くて途中を省略してもマッチングしてくれます。

#設定

``` .vimrc
let g:ctrlp_use_migemo = 1
let g:ctrlp_clear_cache_on_exit = 0   " 終了時キャッシュをクリアしない
let g:ctrlp_mruf_max            = 500 " MRUの最大記録数
let g:ctrlp_open_new_file       = 1   " 新規ファイル作成時にタブで開く
```
設定はどっかのサイトからまるごとパクって来ました。

#キーバインド例

|キーバインド|機能|
|:-----------|:-----------|
|Ctrl+f|モードを前に切り替える|
|Ctrl+b|モードを後ろに切り替える|
|Ctrl+j|選択を下へ移動する|
|Ctrl+k|選択を上へ移動する|
|Enter|同じバッファに開く|
|Ctrl+t|新しいタブに開く|
|Ctrl+v|'vertical'|splitして開く|
|Ctrl+x|'horizontal'|split|して開く|
|Ctrl+s|'horizontal'|split|して開く|
|Ctrl+Enter|'horizontal'|split|して開く|
|Ctrl+p|前の履歴を表示する|
|Ctrl+n|次の履歴を表示する|
|F5|キャッシュを更新する|
|Ctrl+z|対象ファイルを選択する|

#最後に
この記事読むより、:help ctrlpしましょう。
[mattnjpさんの記事](http://mattn.kaoriya.net/software/vim/20111228013428.htm)も参考になります。
Rmagickでのサムネイル生成

## 概要

* rmagick+imagemagickで画処理をやってみる

## 環境

* AWS EC2 Amazon Linux
* ImageMagick, RMagick使用

### 環境構築

* ImageMagick, Rmagickインストール

```
$ sudo yum install ImageMagick ImageMagick-devel
$ gem install rmagick
```

## 画処理を試す

```
require 'RMagick'

image = Magick::ImageList.new("test.jpg")

width  = image.columns
height = image.rows
rate = 0.3 

image.resize(width/3,height/4).write("thumbnail01.jpg")
image.resize(rate).write("thumbnail02.jpg")
image.scale(rate).write("thumbnail03.jpg")
image.thumbnail(rate).write("thumbnail04.jpg")
image.sample(rate).write("thumbnail05.jpg")

image.resize_to_fit(300).write("thumbnail06.jpg")
```

## 各メソッドの概要

* 以下のメソッドは、いずれも引数に縮小率 or リサイズ後の画像サイズ(width, height)を渡せる

| メソッド名 | 画質 | ファイルサイズ           | 補足                         |
|------------|------|--------------------------|------------------------------|
| resize     | ◎   | 大                       | リサイズ計算のフィルタ指定可 |
| scale      | ○   | 小                       | resizeと比較した場合         |
| thumbnail  | ○   | 大                       | 実行速い                     |
| sample     | ×   | 小                       | 実行最速                     |

* resize_to_fitメソッド
 * 縦横比固定(固定値を引数に取る)
 * 縦横小さい方のいずれかでリサイズされる
 * 比率は保持される
gitで一部のディレクトリだけチェックアウトする

git 1.7からsparse checkout機能が利用できるらしい。
ざっくりとした使い方は以下の通り、

	$ git clone リポジトリURL hoge
	$ cd hoge
	$ git config core.sparsecheckout true
	$ echo "hoge.txt" > .git/info/sparse-checkout
	$ git read-tree -m -u HEAD

こうするとワーキングディレクトリ下はhoge.txtファイルだけチェックアウトされる様になるらしい。

これまで制作部スタッフにhtmlファイルを編集してもらうのに社内共有フォルダでファイルの受け渡しをしていたんだけど、この機能を使ったらもう少しスマートにならないかなと考え中。

gitスキルのない制作部スタッフにいきなり今日からgit運用にします。ってのは、ハードル高すぎるので、gitアクセスは当面、技術部スタッフが代行するとして共有フォルダにsparse checkoutで制作部スタッフが編集してよいhtmlファイルだけチェックアウトしておくのはどうだろう。
AWS 署名付きURL発行を試す

## 概要

* 以下を調査・試す
 *  http://aws.clouddesignpattern.org/index.php/CDP:Private_Distribution%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
 * ダウンロードは省略する(ブラウザ、curlで確認した)

## 結果

* 対象のS3オブジェクトへのアクセス権限が設定できる
* URLの有効期限を設定できる
 * 秒単位で設定する
 * 有効期限は任意(デフォルト900s)
 * 期限切れになると、レスポンスコード : AccessDeniedが返される
* 発行されたURL(署名)は無効にできない
* 署名の改ざんはできない
 * 署名はリクエストパラメータとして付加される
  * パラメータにはAWSAccessKeyID、Expires、Signatureが含まれる
  * AWSAccessKeyId、 Signatureはもちろん、 Expiresも変更(改ざん)不可
   * 改ざんした場合、レスポンスコードでSignatureDoseNotMatch が返される

## 検証コード

```
require 'aws-sdk'

object_name = "test_object"
bucket_name = "test_bucket"
expires = 60*60

uris = {}
s3 = AWS::S3.new
obj = s3.buckets[bucket_name].objects[object_name]
uri = obj.url_for(:read, :expires => expires).to_s
puts uri
```
AWS STSで期限付きのサーバ認証トークン発行

## 概要
以下について調べたことをまとめる

* 期限付き証明書の取得方法
* 期限切れの確認方法
* トークンの管理方法

## 環境
以下を使用して調査

* ruby-1.9.3-p385
* aws-sdk 

## 結果

### 期限付き証明書の取得方法

* 取得APIを叩く
 * http://docs.amazonwebservices.com/STS/latest/APIReference/API_Operations.html
 * 期限はデフォルト12h, 15min~36hで設定可能
* 発行は、IAMユーザ、AWSユーザのクレデンシャルを利用する必要がある
 * EC2のroleでは発行できない
 *  http://aws.amazon.com/jp/iam/faqs/#How_can_temporary_security_credentials_be_used_to_call_AWS_service_APIs
 * http://docs.aws.amazon.com/STS/latest/UsingSTS/CreatingAuthTokens.html

### その他

### セッショントークンの期限チェック

* できなさそう
 * ruby-aws-sdkには、セッショントークン取得メソッドしかない
  * new_session
  * new_federated_session

## 参考

 * [TVM(Token Vending Machine)](http://aws.typepad.com/aws_japan/2011/09/updated-mobile-sdks-for-aws-improved-credential-management.html)

## 検証コード

S3アップロード権限を付けた一時的証明書を発行して、アップロードしてみる

```
require 'aws-sdk'

user_name   = "test_user"
bucket_name = "test_bucket"
object_nmae = "test_object"
file_name   = "hoge.txt"

## 一時的証明書取得
opt = { access_key_id: "**********",
        secret_access_key: "**********" }
upload_policy = AWS::STS::Policy.new do |policy|
  policy.allow( actions: ['s3:PutObject'], resources: "arn:aws:s3:::#{bucket_name}/#{object_name}/*")
end
duration = 60*60

upload_session = AWS::STS.new(opt).new_federated_session("user_name", policy: upload_policy, duration: duration)

res = { access_key_id:     upload_session.credentials[:access_key_id],
        secret_access_key: upload_session.credentials[:secret_access_key],
        session_token:     upload_session.credentials[:session_token],
        expires_date:      upload_session.expires_at.to_i.to_s }

## S3アップロード
AWS.config(
  :access_key_id     => res[:access_key_id],
  :secret_access_key => res[:secret_access_key],
  :session_token     => res[:session_token],
  :s3_endpoint   => 's3-ap-northeast-1.amazonaws.com',
)
s3 = AWS::S3.new
bucket = s3.buckets[bucket_name]
unless bucket.exists?
  puts "S3 Bucket No Exist"
  exit 1
end

object = bucket.objects[object_name].write(:file => file_name)
```
iDrawをスマートに鍛える

## iDrawにはIllustratorなどにみられるオートトレース機能が付いていない。

コマンドラインツールにpotraceがあるが、convertコマンドで一度.bmp3形式にする必要がある。これらはMacpotsでもHomebrewでもインストール出来る。

## Automatorでスマートに

Automatorでサービスを追加する。
画像ファイルでコンテクストメニューを出したときに出るようにする。
Run Shell Scriptをアクションに追加しShellの種類は/bin/shにでも設定、Pass input: はas argumentsとしておき、

```sh:Open_with_iDraw.workflow
/usr/local/bin/convert "$1" __temp.bmp3;
/usr/local/bin/potrace __temp.bmp3;
mv __temp.eps traced_by_potrace.eps;
open -a iDraw traced_by_potrace.eps;
sleep 10;
rm -f __temp.bmp3 traced_by_potrace.eps;
```

こんな感じでどうだろうか。
長めのsleepが入っているのは少しファイルを消すのを待ってやらないとiDrawが起動してファイルを読み込む前にファイルが消されてしまうから。（もっとマシなやり方あるかな？）

こうして置けばかなりスムーズにオートトレースした状態のベクトルデータをiDrawで開けるのでIllustratorにまた一歩近づける。

このときにトレースするときのなんというか"しきい値"のようなものがデフォで0.5となっているようでいくつか比較してよいものを使いたいならば

```sh:Open_with_iDraw_(5_proposals)_.workflow
/usr/local/bin/convert "$1" __temp.bmp3;
for k in 0.3 0.4 0.5 0.6 0.7
do
/usr/local/bin/potrace -k $k __temp.bmp3;
mv __temp.eps traced_by_potrace$k.eps;
open -a iDraw traced_by_potrace$k.eps;
done
sleep 10;
rm -f __temp.bmp3 traced_by_potrace*.eps;
```

こんなのでどうだろうか。
Macをスマートに鍛える

## QuickTimeを鍛える

MacにおいてiTunesでの入出力をはじめMac独特のアイコン上での映像、音声の再生、MotionやFinal Cutなどのプロツールの入出力もすべてQuickTimeの入出力に依存する。
つまりQuickTimeの対応フォーマットをプラグインなどで増やすほどMacは強くなる。

Mac使いで入れていない人はおそらくいないPerianはその存在を忘れさせるほどスマートでPerianのお陰で再生可能となるフォーマットのファイルを再生するにもQuickTime以外のソフトが起動する訳ではない。

しかしWMVなどのウィンドウズメディアファイルを再生するためのものはFlip4Macをおいて他にない。
こいつがくせ者で再生方式がストリーミングのため、鑑賞したりする際もスムーズに早送り、巻き戻しが出来ないだけでなくデフォルトの設定ではWMVを再生しようとするとFlip Playerという名前のアプリが起動する。
あくまでPerianのようにささやかにQuickTimeを支えてほしい。

## いいとこ取りしたい

VLCプレイヤーを使えば先ほど述べたような早送り/巻き戻し問題のストレスなくネイティブにWMVの再生が可能だ。
通常の再生、鑑賞の際はVLCに任せるとして出来る事ならPerianのように完全なコンポーネントとして利用したいところだし、QuickTime以外の外部プレイヤーがうじゃうじゃとあるのは気持ちよくない。
つまり、アイコン上での再生とかMotion、Final Cutなどでの対応フォーマットを増やす意味で恩恵を受けつつFlip Playerを消せないだろうか？

## 結論

おそらくFlip4Macコンポーネント単品でのインストールはないため、一時的にFlip Playerもろともインストールするしかないだろうが、実はなんと一度インストールするとFlip Playerを捨ててしまってもFlip4Macコンポーネントは残るのだ。
アップデートやライセンスのアップグレードは環境設定からFlip4Macのパネルを開けるから問題ない。もちろん動作に何ら差し支えはなかった。
付属のアンインストーラーを使うとお目当てのFlip4Macコンポーネントまで持ってかれる恐れがあるのでAppCleanerなどを使ってFlip Playerだけをゴミを残さず消すのがおすすめだ。
AWS EC2, ELB, Route53を試す

## 概要
* AWSで試したことの備忘録
** EC2, ELB, Route53について簡単にまとめる
** Railsの環境構築についても〃

### 環境
以下の環境を使用する
* Amazon Linux
* ruby1.9.3, rails3

## EC2
* AWS Management Console > EC2 > Instance > Launch Instance
** Amazon Linux AMI (64bit)
** Instance Type : T1 Micro
** Security Group : 3000番, 80番, 22番のTCPを許可
*** インスタンス起動後、SSHで接続確認

## rubyインストール
デフォルトは1.8.7のため、1.9.3を入れる(rvmを使用する)

```
$ curl -L https://get.rvm.io | bash
$ source .bash_profile
$ rvm requirements
$ sudo yum install make gcc gcc-c++ ...
$ rvm install 1.9.3
```

## railsインストール
gemセットを使用する

```
$ rvm gemset create app-test
$ rvm --default use 1.9.3@app-test
$ gem install sqlite3 --no-rdoc --no-ri
$ gem install rails --no-rdoc --no-ri
```

## railsアプリ作成・起動

```
$ rails new app-test
$ cd app-test
$ vi Gemfile
----------------------------
以下のコメントアウトを外す
gem 'execjs'
gem 'therubyracer'
----------------------------
$ bundle install
$ rails s
```

* 3000番にアクセスして起動確認
 * セキュリティグループで許可していないと不可
 * http://ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com:3000

## EC2をELBの配下に入れる
EC2インスタンスを立ち上げ、ELBにアクセスするとEC2インスタンスに振り分けられるようにする

* Management Consoleの「Load Balancers」>「Create Load Balancer」
 * LoadBalacerPort:3000 => アプリの3000に設定
 * HealthCheackは動的に生成されるページを返すように設定
 * 立ちあげたEC2インスタンスを選択, 作成
* 確認
 * アプリログを監視して、数秒毎にログが流れる(HealthCheckが走っている)こと
 * HealthCheckのstatusが「In Service」になっていること
 * LoadBalancerのDNS Nameのアドレスからアクセスし、アプリに振られること
* 問題
 * ELB作成から起動までの間、ELBにアクセスしても数十秒間振り分けされない
 * この間はHealthCheckも「Out of service」になる
 * ELBの接続に時間がかかる
  * ELBの(裏側での)自動スケールアップと同現象と考えられる

## Route53でドメインを付ける
* Route53 > Hosted Zones > Create Hosted Zone
 * Domain Name入力
* 作成したドメイン選択 > Go To Record Set > Create Record Set
 * Name入力
 * CNAME選択
 * valueに作成したインスタンス名入力
  * ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
  * 再起動したら変わるためEIPを付けた方が良いが、ここでは省略する
* 確認
 * 作成したドメイン名の3000番にアクセスしてRailsのトップ画面が見えること
MeCab 使ってよみがなを取ってくる


python-mecab とかいうのをインストールしようと思ってハマりかけたので、パットよみがなにしたかっただけということもあり、mecab コマンドをそのまま叩くことにした。

mecab はこんな感じでよみがなを取得できる（辞書にないと取れない）

```
$ echo "林檎" | mecab -Oyomi
リンゴ
```

んで、 Django のモデルから名前引っ張ってきて、よみがなに変換するスクリプトが以下。

```yomigana.py
# -*- coding: utf-8 -*-

import os
import sys

import re
from subprocess import Popen, PIPE

import jcconv

from django.conf import settings

sys.path.append(os.path.abspath(os.path.dirname('.')))
os.environ['DJANGO_SETTINGS_MODULE'] = 'hogehoge.settings'

from hogehoge.apps.fuga.models import Piyo

def get_yomigana(text):
    p1 = Popen(['echo', text], stdout=PIPE)
    p2 = Popen(['mecab', '-Oyomi'], stdin=p1.stdout, stdout=PIPE)
    p1.stdout.close()
    output = p2.communicate()[0]
    return re.sub(r'\n', '', output)

for piyo in Piyo.objects.all():
    yomigana = jcconv.kata2hira(jcconv.half2hira(get_yomigana(piyo.name )))

    print ','.join([str(user.id), piyo.name.encode('cp932'), yomigana.decode('utf8').encode('cp932')])
```

プロジェクト名とかは hogehoge にしてる。
外部コマンド叩くのは以下のマニュアルを参考にしました。

- [17.1. subprocess — サブプロセス管理 — Python 2.7ja1 documentation](http://docs.python.jp/2/library/subprocess.html)

どうやら、os.system とかは廃止方向らしい (2.7)
setCustomValidity

```
<form>
  <p><label>パスワード <input type=password name=password required pattern="[!-~]{5,}" title="英数字5文字以上"></label>
  <p><label>もういちど <input type=password name=password2 required pattern="[!-~]{5,}" title="英数字5文字以上"
                           oninput=" this.setCustomValidity(this.form.elements.password.value === this.value ? '' : this.getAttribute('data-password-mismatch-error')) "
                           data-password-mismatch-error="同じパスワードを記入してください。"></label>
  <p><button type=submit>設定</button>
</form>
```

setCustomValidity で独自のバリデーションエラーメッセージを設定することができます。エラー状態ではフォームを提出できず、ユーザーにエラーメッセージが表示されます。空文字列を指定するとエラー状態を解除できます。
NSDataのまま画像のサイズを取得する

画像のサイズはCGImageRefやUIImageのインスタンスを作成して取得することができます。
しかしながら、それは同時に画像を展開するということでもあります。
サイズを取りたいだけで、展開まで必要ない場合には、
メモリとCPUパワーが若干もったいない気がします。

######※コメントからのご指摘により、どうやら現時点のUIImageの実装では画像のピクセルデータ展開は描画時まで遅延されるようです。なのでべたにUIImageを作成してもそれはオーバーヘッドにはならない、ということがわかりました。今後この挙動が変わるとは到底思えませんが、ただあくまでも現時点でのUIImageの実装に依存している挙動であることは頭の片隅に入れておいた方がいいかもしれません。######

通常画像圧縮データにはヘッダがあるわけで、普通に考えればピクセルデータを展開せずともサイズくらい取得できるはずです。
まあ、もちろん自分で画像形式等やるのは面倒なので、iOS SDKに乗っかります。


というわけで、ImageIO.frameworkを使っての実装例を挙げたいと思います。

ヘッダー(NSData+imageSize.h)

```
#import <Foundation/Foundation.h>

@interface NSData (imageSize)
- (CGSize)imageSize;
@end
```


実装(NSData+imageSize.m)

```
#import "NSData+imageSize.h"

#import <ImageIO/ImageIO.h>
@implementation NSData (imageSize)
- (CGSize)imageSize
{
    CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)self, NULL);
    if(imageSource == NULL)
        return CGSizeZero;
    dispatch_async(dispatch_get_main_queue(), ^{ CFRelease(imageSource); });
    
    NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL);
    if(imageProperties == NULL)
        return CGSizeZero;
    
    CGSize size =
    {
        [imageProperties[(id)kCGImagePropertyPixelWidth] floatValue],
        [imageProperties[(id)kCGImagePropertyPixelHeight] floatValue],
    };
    
    return size;
}
@end

```
sedでできる設定ファイル書き換えメモ


よくフレームワークとかでDBの設定項目とか使ってる環境に変更することがある時にワザワザ手動で書き換える面倒なのでshellで自動置換できるようにした時のメモ

## php編

### 配列の場合

例にこんな設定項目があったとする

```php:sample.php
array(
	'connection'  => array(
		'hostname' => 'localhost',
		'port' => '3306',
		'database' => 'hoge',
		'username'   => 'username',
		'password' => 'password',
	),
),
```

hostnameを書き換えたい場合はこんな感じでできる

```shell
sed -i -e "s/'hostname' => \('.*'\)/'hostname' => 'hoge'/g" test.php 
```

localhostがhogeに変更できる

同様にport,database,username,passwordも変更してみよう(sedなら-eの連続で渡せる)

```shell
sed -i -e "s/'hostname' => \('.*'\)/'hostname' => 'hoge'/g" -e "s/'port' => \('.*'\)/'port' => '3312'/g" -e "s/'database' => \('.*'\)/'database' => 'myproject'/g" -e "s/'username' => \('.*'\)/'username' => 'myuser'/g" -e "s/'password' => \('.*'\)/'passward' => 'mypass'/g" sample.php 
```

書き換えたファイル

```php:sample.php
array(
	'connection'  => array(
		'hostname' => 'hoge',
		'port' => '3312',
		'database' => 'myproject',
		'username'   => 'username',
		'passward' => 'mypass',
		'presistent' => false
	),
),
```

ダブルコーテションの場合もちょっと書き換えるだけでいける

```php:sample.php
		"connection"  => array(
			"hostname" => "localhost"
			"port" => "3307",
		),
```

```shell
sed -i -e 's/"hostname" => \(".*"\)/"hostname" => "hoge"/g' sample.php 
```

'(シングルコーテション)をダブルコーテションに書き換えるだけ
※-eのオプションは逆にシングルコーテーションで囲む

```php:sample.php
		"connection"  => array(
			"hostname" => "fuga"
			"port" => "3307",
		),
```

### ini編

これはシンプルにいける

```php:sampleini.ini
;sample code
[db]
hostname = localhost
port = 3306
database = hgoe
username = username
password = password
```

```shell
sed -i -e "s/hostname = \(.*\)/hostname = fuga/g"  sampleini.php 
```

```php:sampleini.ini
;sample code
[db]
hostname = fuga
port = 3306
database = hgoe
username = username
password = password
```

## json編

例にこんな設定項目があったとする

```php:sample.json
   "db": {
        "hostname" : "localhost"
        "port": "3307",
        "username": "username",
        "password": "password"
    }
```

hostnameを書き換えるならこれ

```shell
sed -i -e 's/"hostname" : \(.*\)/"hostname" : "fuga"/g' test4.json 
```

```php:sample.json
   "db": {
        "hostname" : "fuga"
        "port": "3307",
        "username": "username",
        "password": "password"
    }
```

portやusernameとかも配列の例と同様に-eで繋げればか書き換えられます

## 応用編 同じ項目が複数ある場合は？

行数の範囲指定をすればいける

```php:sample.json
  1     "db": {
  2         "hostname" : "localhost"
  3         "port": "3307",
  4         "username": "username",
  5         "password": "password"
  6     },
  7     "db2":{
  8         "hostname" : "localhost"
  9         "port": "3307",
 10         "username": "username",
 11         "password": "password"
 12     }
```


```shell
sed -i -e '1,6s/"hostname" : \(.*\)/"hostname" : "fuga"/g' test4.json 
```

```php:sample.json
  1     "db": {
  2         "hostname" : "fuga"
  3         "port": "3307",
  4         "username": "username",
  5         "password": "password"
  6     },
  7     "db2":{
  8         "hostname" : "localhost"
  9         "port": "3307",
 10         "username": "username",
 11         "password": "password"
 12     }
```

設定変更shellscriptとか書くときに役に立つとおもいます
さくらVPSでMojoliciousを使うの巻

# sakura vps 1GBにCentOS 6.xを入れまして、Perl と Mojolicious を入れていきます。

## まず、そもそもPerlが入っているのかって話。

````
[hoge@hog1234xx ~]$ which perl
/usr/bin/perl
````

入ってますね。.ε=＼＿○ﾉ ｲﾔｯﾎｰｩ！

````
[hoge@hog1234xx ~]$ sudo su -
[sudo] password for hoge:
[root@hog1234xx ~]#
````

rootになります。#が出てたらまあ、だいたいrootです。
初期設定では入ってないパッケージを入れます。
パッケージはRPM(RPM Package Manager(RはRedHatのR))で管理されていて、
それをyumコマンドでインスコする感じです。

````
[root@hog1234xx ~]# yum -y install perl-core

~~~~~~

Complete!
````

Complete!が出たらだいたいOK。

ではMojoliciousなどののインスコ。
（ここから先は試練です。。。。試練の状況を見たい方はコチラ⇒[(´；ω；｀)](http://qiita.com/items/231d9080caa062c67638")）


## 1. Install perlbrew
````
[hoge@hog1234xx ~]$ export PERLBREW_ROOT=$HOME/.perlbrew
[hoge@hog1234xx ~]$ curl -L http://xrl.us/perlbrewinstall --insecure | bash

Happy brewing!

## Installing patchperl

## Done.

````

## 2. Perlbrew 初期設定

````
[hoge@hog1234xx ~]$ ~/.perlbrew/bin/perlbrew init
[hoge@hog1234xx ~]$ echo 'source ~/.perlbrew/etc/bashrc' >> ~/.bashrc
[hoge@hog1234xx ~]$ source ~/.bashrc
````

## 3. Perlのインストール

````
[hoge@hog1234xx ~]$ perlbrew install -v perl-5.14.2 -D ccflags=-fPIC
````

これ30分以上かかるかも。
Perlのインストール確認

````
[hoge@hog1234xx ~]$ perlbrew list
----
  perl-5.14.2
----
````


````
[hoge@hog1234xx ~]$ perlbrew switch perl-5.14.2
[hoge@hog1234xx ~]$ perl -v
----
This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux
----
````

## 4. cpanmのインストール

````
[hoge@hog1234xx ~]$ curl -L http://cpanmin.us/ | perl - App::cpanminus
[hoge@hog1234xx ~]$ perlbrew install-cpanm
[hoge@hog1234xx ~]$ cpanm App::pmuninstall
````

## 5. Mojoliciousのインストール

````
[hoge@hog1234xx ~]$ cpanm Mojolicious
````


## 6. Mojoliciousを動かしてみる

````
[hoge@hog1234xx ~]$ mojo generate lite_app myapp.pl  
  [exist] /home/hoge
  [write] /home/hoge/myapp.pl
  [chmod] myapp.pl 744
````


ref) http://d.hatena.ne.jp/oggata/20110317/1300352262
ref) http://wata-jp.ldblog.jp/archives/1616964.html
UIViewからUIGestureRecognizerを削除

removeGestureRecognizerメソッドによりUIViewに設定されたジェスチャーイベントを削除できる。

```objective-c
// すべてのジェスチャーにた対して処理を実行
for(UIGestureRecognizer *gesture in [hogeview gestureRecognizers]) {
	// UIGestureRecognizerのSubclassを判別
	if([gesture isKindOfClass:[UITapGestureRecognizer class]]) {
		[hogeview removeGestureRecognizer:gesture];
	}
}
```
SBT のプロジェクトを Eclipse にインポート


SBT の [sbteclipse プラグイン](https://github.com/typesafehub/sbteclipse)を使って Eclipse 用のファイルを出力します。

まず `PROJECT_DIR/project/plugins.sbt` に以下を書きます。なければ作ります。

```project/plugins.sbt
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.2")
```

そして

```
sbt eclipse
```

これで Eclipse で Import -> Existing Projects into Workspace できるようになります。
wxRubyでToolbarを表示する

ちょっと昔のサンプルだと動かないものが多かったので。
Wx::Toolbar.realize を呼び出さないとアイコンが表示されないようにいつの頃からか変更されたらしい。

```toolbar.rb
require 'wx'

class MyApp < Wx::App
  def on_init
    MyFrame.new.show
  end
end

class MyFrame < Wx::Frame
  def initialize
    super(nil, -1, "Toolbar")
    toolbar = create_tool_bar
    toolbar.add_tool(Wx::ID_NEW, 'NEW', Wx::ArtProvider.bitmap(Wx::ART_NEW), 'Toolbar')
    toolbar.realize
  end
end

MyApp.new.main_loop
```
ArtProviderはいちいちアイコンを探してこなくていい便利な機能。
ファイルも増えないし素敵。
http://wxpython.org/docs/api/wx.ArtProvider-class.html

`create_tool_bar` の部分は

```toolbar.rb
    toolbar = Wx::ToolBar.new(self)
    toolbar.add_tool(Wx::ID_NEW, 'NEW', Wx::ArtProvider.bitmap(Wx::ART_NEW), 'Toolbar')
    toolbar.realize
    self.set_tool_bar(toolbar)
```
でもOK. どちらも一緒。
ActiveRecordでcount(*)の結果をsortして上位をリストアップ。

特定の条件を満たすコードを
書き方分からなかったのでメモ。joinも行っていたのでややこしかった。

```
Foge.joins(:foo_bar).group('foo_bar.name')
                    .order('count_foo_bars_name desc')
                    .limit(10)
                    .count('foo_bar.name')
```

記述の順番が直感的ではないので注意。count_foo_bars_nameの部分は一度ActiveRecordが吐き出してるSQL文を見て COUNT(*) AS <この部分> を抜き出してくると良い。
結果作られるSQL文はこんな感じ

```
SELECT COUNT(foo_bar.name) AS count_foo_bars_name,
       foo_bars.name AS foo_bars_name
    FROM "Foges"
    INNER JOIN "foo_bars" ON "foo_bars"."id" = "foges"."foo_bar_id"
    GROUP BY foo_bars.name
    ORDER BY count_foo_bars_name desc
    LIMIT 10;
```
gem installでエラー

macにGCC-10.7-v2をインストールしたらgem installで以下のエラーが出るようになってしまった。

```bash
$ sudo gem install cocoapods                                                                                        (issue/6)
Password:
Building native extensions.  This could take a while...
ERROR:  Error installing cocoapods:
	ERROR: Failed to build gem native extension.

    /Users/kenjikinukawa/.rbenv/versions/2.0.0-p0/bin/ruby extconf.rb
checking for -std=c99 option to compiler... yes
checking for CoreFoundation... no
checking for main() in -lCoreFoundation... no
CoreFoundation is needed to build the Xcodeproj C extension.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/kenjikinukawa/.rbenv/versions/2.0.0-p0/bin/ruby
	--with-CoreFoundationlib
	--without-CoreFoundationlib


Gem files will remain installed in /Users/kenjikinukawa/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/xcodeproj-0.5.5 for inspection.
Results logged to /Users/kenjikinukawa/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/xcodeproj-0.5.5/ext/xcodeproj/gem_make.out
```

Xcodeのcommand line toolsをインストールすれば治るという情報が落ちていたが、すでにインストール済みだった。
エラーログを見ると、むしろcommand line toolsのあとにGCC-10.7-v2をインストールしたのが原因臭かったので、command line toolsを入れなおしたらなおった。

[XcodeからインストールしたCommand Line Toolsを削除する方法](http://qiita.com/items/3e9f35005059482dfb42)
localStorage基本操作

この記事を書いてから既に5年以上経っているのですが今年になってもいいねをいただく事があるので、注意喚起のため更新します。
詳細は以下の記事を参照いただけると。
HTML5のLocal Storageを使ってはいけない（翻訳）
https://techracho.bpsinc.jp/hachi8833/2019_10_09/80851

```
// localStorageが使用出来るかチェック
if (!window.localStorage) {
    alert("お使いのブラウザはlocalstorageに対応してません。");
}

// localStorageに値を保存
function setItem(key, val) {
    window.localStorage.setItem(key, val);
}

// localStorageから値を取得
function getItem(key) {
    return window.localStorage.getItem(key);
}

// localStorageに保存されている、あるkeyの値を削除する
function removeItem(key) {
    window.localStorage.removeItem(key);
}

// localStorageに保存されているすべての値を削除する
function clear() {
    window.localStorage.clear();
}
```
XcodeからインストールしたCommand Line Toolsを削除する方法


```bash
$ sudo /Library/Developer/Shared/uninstall-devtools --mode=all
```

### 追記
会社の環境ではそんなファイルなかった。
Xcodeの設定で、command line toolsのパスは/Applications/Xcode.appになっていたので、Xcode消して入れなおしたほうが早いのかなー。
Rでガウス分布の平均パラメータを逐次最尤推定

PRML 2.3.5に記載の通り、ガウス分布の平均パラメータuの最尤推定に関して、対数尤度の微分が0となるuを求める問題を、確率変数uが与えられた時の確率変数z=-d/du [ln p(x|u,σ^2)]の条件付き期待値E[z|u]が0となるuを求める問題に帰着し、Robbins-Monroアルゴリズムにより、xの観測（すなわちzの観測）毎に、そのようなuを逐次的に求めます。

サンプルはガウス分布から生成し、観測した点を黒点、逐次推定したパラメータuを赤点で示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/IQesVodEnu/24.RobbinsMonro.png)

```r
frame()
set.seed(0)
par(mfrow=c(1, 1))
par(mar=c(2.3, 2.5, 1, 0.1))
par(mgp=c(1.3, .5, 0))
N <- 40
U <- 150
x <- rnorm(N, U, 10)
uml <- 0
umls <- numeric()
d <- data.frame(observation=-1, x=NA, new=F)
for (n in 1:N) {
	uml <- uml + (1 / n) * (x[n] - uml)
	umls <- c(umls, uml)
	if (n > 1) {
		previous <- d[d$observation == n - 1, ]
		previous$observation = n
		previous$new = F
		d <- rbind(d, previous)
	}
	d <- rbind(d, c(n, x[n], T))
}
d <- d[-1, ]
plot(umls, type="o", col=2, xlim=c(1,N), ylim=c(min(x), max(x)), xlab="", ylab="")
par(new=T)
plot(d$observation, d$x, pch=19, cex=ifelse(d$new, 1, 0.1), xlim=c(1,N), ylim=c(min(x), max(x)))
abline(h=U)
```
.NET で Team Foundation Server に接続する - まずは接続

.NET アプリで Team Foundation Server に接続してみましょう。というお題。

次の定形コードで接続できます。ただしこれは DefaultCollection に接続する場合。
コレクションを指定する場合は次回。

```csharp:Connect.cs
var uri = new Uri(TfsUrl);
// 本来は Windows 認証を使うことが多いと思います。次回以降紹介します。
var configurationServer = new TfsConfigurationServer(uri, new NetworkCredential(UserName, Password));
var collectionNodes = configurationServer.CatalogNode.QueryChildren(
    new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);
// 今回はコレクションノードの最初を固定で使っていますが、実際はコレクションを選ぶ必要があります。
var collectionId = new Guid(collectionNodes[0].Resource.Properties["InstanceId"]);
// くぅ～ｗようやく取得できましたｗ
var teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
```

こうして得られた `teamProjectCollection` に対して `GetService<T>` メソッドで様々サービス提供クラスのインスタンスを取得することで各種操作を実行できます。

今回は `VersionControlServer` というクラスのインスタンスを取得して $/AngelBell/hoge.txt の中身を取得してみましょう。

VersionControlServer はおそらく最もよく使うであろうクラスで、ソース管理エクスプローラ相当の処理を実行するためのものです。

```csharp:GetContent.cs
var vcs = teamProjectCollection.GetService<VersionControlServer>();
var item = vcs.GetItem("$/AngelBell/hoge.txt");
using (var stream = item.DownloadFile())
using (var reader = new StreamReader(stream))
{
    var content = reader.ReadToEnd();
}
```

なお、通常 GUI で操作する場合、ワークスペースというものを作成してサーバーフォルダとローカルフォルダをマップしていると思います。

同様に、コードから操作する場合も「最新バージョンの取得」や「チェックイン」といった操作はワークスペースを経由することになります。

ワークスペース関連の操作は次回以降で紹介したいと思います。
SublimeTextでclmemoっぽいことをする

## 概要

Emacsの[clmemo](http://www.bookshelf.jp/texi/clmemo/clmemo.html)っぽいことをSublime TextでできるようにするPluginです
[ここ](https://github.com/shibainurou/SublimeClmemo)からPakagesにcloneしてください

__使いかた__

* __SublimeClmemo用ファイルを作る__
ファイルの場所はどこでも好きなところで

* __設定ファイルの `changelog_path` を変更する__
さっき作ったSublimeClmemo用ファイルのパス設定

* __設定ファイルの `user_name`, `mail_address` を変更する__
自分の名前とメールアドレスを設定
この二つはヘッダ為だけに使うので適当でいいです

* __設定ファイルの `titles` を変更する__
よく使うタイトルをカンマ区切りで複数設定します
例）"titles": ["todo", "daiary", "python", "idea", "buy", "pay"],

* __使ってみる__
`ctrl(super)+shift+l` 押下して、タイトルを決定する
好きなことを、書くべし書くべし


* __タスク機能使ってみる__
`ctrl(super)+i` タスクを作成
`ctrl(super)+t` タスク完了
`ctrl(super)+m` タスクキャンセル

## 書式

```
2013-03-25  user_name  <mail@address.com>

	* タイトル[カテゴリー]: タイトルヘッダ
	アイテム
	アイテム

	* Title: タイトルヘッダ
	☐ todo
	✘ キャンセルしたtodo
	✔ 完了したtodo
	☐ todo_parent:
	 ☐ todo_child1
	 ☐ todo_child2

```

行頭には`tab`
改行のみのアイテムを作らない
親todoの後ろに `:` をつける
子todoは親よりもスペース一個分後ろにさげる
ファイルの一番最後は改行を入れる

## 機能

__ChangeLogを開いてタイトルを挿入する__
`key` : ctrl(super)+shift+l
`command` : sublime_clmemo

__タスクを現在の日付に集める__
`key` : f1
`command` : task_moved_to_today

__ChangeLogをgrepする__
`key` : f2
`command` : sublime_clmemo_grep

__タスク(☐)を挿入する__
`key` : ctrl+i
`command` : task_new

__タスク(☐)を完了(✔)にする__
`key` : ctrl+t
`command` : task_complete

__タスク(☐)をキャンセル(✘)にする__
`key` : ctrl+m
`command` : task_cancel

## 設定

__open_tasks_bullet__
未完了todoのマークを選択する

__done_tasks_bullet__
完了todoのマークを選択する

__canc_tasks_bullet__
キャンセルtodoのマークを選択する

__changelog_path__
ChangeLogのpath

__user_name__
user name

__mail_address__
mail address

__max_move_entry__
todoを今日の日付に移動させる時、何個下のエントリーまで遡って移動させるかを設定する

__titles__
よく使うタイトルを設定する

__`changelog_path` `user_name` `mail_address` `titles` は設定しておいてください。__
jQueryで次の可視要素 :visible を取得する

jQueryで次の要素を1つ取得するには.next()を使う。

```javascript:
$(this).next()
```

jQueryで次の要素を全部取得するには.nextAll()を使う。

```javascript:
$(this).nextAll()
```

次の可視要素を1つ取得するには:visibleフィルタをかける。
このとき次の１つ目の要素が確実に:visibleなのか不定なので、.next()ではなく.nextAll()を使う。
:firstフィルタを同時に用いて.next()と同様に1つ目を取得する。

```javascript:
$(this).nextAll(':visible:first')
```
シェルスクリプトのseq

シェルスクリプトの`seq`について。

N回同じ処理したい時とかに使いますね。

```sh
for i in `seq $N`; do echo "test"; done # test をN回表示
```

このN回をシェルスクリプト外から指定場合注意が必要。
特に大きい数値を指定して、途中でCtl+Cで終わることを想定してる場合、seqは向かない。

`seq $N`の呼び出しに非常に時間がかかり、全体の動作が遅延する。
こういう場合はwhileなどで上手く処理するしか無いのかなぁ。
mod_pagespeedをインストールする

基本的には [Installing mod_pagespeed From Packages - Make the Web Faster & Google Developers]( https://developers.google.com/speed/docs/mod_pagespeed/download?hl=ja ) に従う

```
sudo yum install gperf
mkdir -p ~/bin

cd ~/bin
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
export PATH=$PATH:~/bin/depot_tools

mkdir ~/mod_pagespeed
cd ~/mod_pagespeed

gclient config http://modpagespeed.googlecode.com/svn/branches/latest-beta/src
gclient sync --force --jobs=1

cd ~/mod_pagespeed/src
make BUILDTYPE=Release mod_pagespeed_test pagespeed_automatic_test

make BUILDTYPE=Release

cd ~/mod_pagespeed/src/install


APXS_BIN=/usr/local/apache22/bin/apxs MODPAGESPEED_FILE_USER=azusa BINDIR=/usr/local/apache22/bin NO_SUDO=1 sh ./install_apxs.sh
Using /usr/local/apache22/bin/apxs to determine installation location.

mod_pagespeed needs to cache optimized resources on the file system.
The default location for this cache is '/var/cache/mod_pagespeed'.
Would you like to specify a different location? (y/N) y
Location for mod_pagespeed file cache: /usr/local/apache22/cache

Preparing to install to the following locations:
/usr/local/apache22/modules/mod_pagespeed.so (azusa:azusa)
/usr/local/apache22/modules/mod_pagespeed_ap24.so (azusa:azusa)
/usr/local/apache22/bin/pagespeed_js_minify (azusa:azusa)
/usr/local/apache22/conf/pagespeed.conf (azusa:azusa)
/usr/local/apache22/conf/pagespeed_libraries.conf (azusa:azusa)
/usr/local/apache22/cache (azusa:azusa)


Continue? (y/N) y
/usr/local/apache22/cache already exists. Not creating.
Adding a load line for mod_pagespeed to /usr/local/apache22/conf/httpd.conf.
Adding a load line for pagespeed_libraries to /usr/local/apache22/conf/httpd.conf.

Installation succeeded.
Restart apache to enable mod_pagespeed.

sudo /usr/local/bin/apachectl graceful

```
通信がSSLの場合は、mod_pagespeedがminifyしたリソースを取得するときにhttp通信にproxyするため、httpsのドメインとのマッピングを pagespped.conf に書いてやる必要がある。

```
ModPagespeedMapOriginDomain http://localhost https://192.168.0.1
ModPagespeedLoadFromFile  https://192.168.0.1 /var/tomcat/webapps/
```
みたいな感じ。

注意点は、minifyの際にhtmlの中の必要な記述まで削ってしまい、アプリケーションが動作しなくなる場合があるので、動作確認はしっかり行う必要があるということ。[このページ]( http://web-tan.forum.impressrd.jp/e/2012/11/27/14218 )の「インストールするだけ! お手軽サイト高速化ツール」という記述を鵜呑みする人は情弱。
mod_proxy_ajp + mod_proxy_balancer + mod_rewrite 併用時に Tomcat が処理するリソースにApache側で認証をかける

静的コンテンツをApache、動的コンテンツをTomcatに役割分担していると、動的コンテンツ側で認証がかからなかったので、対応のメモ。

```<Direcoty>```の中で ajp にrewriteしてやるのがポイント。

```
Alias / /var/tomcat/web/1/webapps/
<Directory "/var/tomcat/web/1/webapps">
    Allow from all
    AllowOverride AuthConfig
    RewriteRule ^(.+)\.jsp(.+)? balancer://ajp-balancer2/$1.jsp$2 [P,L]
    RewriteRule ^(.+)\.json(.+)? balancer://ajp-balancer2/$1.json$2 [P,L]
</Directory>
```
rake spec に rspec のオプションを渡す


```
$ rake spec SPEC_OPTS="--format doc --tag hoge"
```

のように SPEC_OPTS 経由でrspecにオプションを渡すことができる。

カレントディレクトリに `.rspec`というファイルを用意して

```ruby:.rspec
--format doc
--tag hoge
```

と書いても良い。

ちなみに、

```
$ rake spec SPEC=spec/path/to/hoge_spec.rb
```

SPEC 経由で指定した spec だけを実行することができる。
複数のファイルを指定する場合はスペース区切りで

```
$ rake spec SPEC="spec/path/to/hoge_spec.rb spec/path/to/fuga_spec.rb"
```

## 参考

http://apidock.com/rspec/Spec/Rake/SpecTask
rotatelogsコマンドでTomcatのcatalina.outをローテーションTomcat7編

Tomcatのcatalina.outをローションする時、apache付属のrotatelogsコマンドを使ってローテーションする方法があります。詳しい解説は検索すると出てくるのでそちらを見てもらうとして、

Tomcat7からはcatalina.sh内のJVMの起動コマンドをevalするようになったので、標準エラー出力を標準出力にリダイレクトする所は、ダブルクオートで囲む必要があります。

つまり、

```sh:catalina.sh
  eval \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
      -Djava.security.manager \
      -Djava.security.policy==\"$CATALINA_BASE/conf/catalina.policy\" \
      -Dcatalina.base=\"$CATALINA_BASE\" \
      -Dcatalina.home=\"$CATALINA_HOME\" \
      -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
      org.apache.catalina.startup.Bootstrap "$@" start "2>&1" \
      |/usr/local/bin/rotatelogs $CATALINA_BASE/logs/catalina.out  86400 540 &
```

のようになります。
Xcode４のコード入力補間の追加

前はTextMacrosで編集出来たんですが使えなくなってて、
あるはずだよなーと思って調べてみたら、
変わりにコードスニペットになってたみたい。
やり方を忘れないように、メモメモ
（不明なとこもあるけどとりあえず出来たかなと。
※Xcode4.6.1で試した結果になります。


（追記
XcodeでUtilitis（ソースの右側に出てくるエリア）の下部の{}マークからも設定可能。
コードのドラッグアンドドロップと選択だけで、
以下のディレクトリに__自動で作成__してくれちゃう・・・^^;
sawat1203さん、教えてくれてありがとうございます！



手順
---
１、~/Library/Developer/Xcode/UserData/CodeSnippetsに移動
(CodeSnippetsが無い場合は作成)

２、/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/SystemCodeSnippets.codesnippets
ここにあるファイルを参考に編集
（デフォルトで設定されているコードスニペットの設定ファイル）

３、１で移動しておいたディレクトリにcodesnippet拡張子で一個づつスニペット設定ファイルを作成
（デフォルトの設定ファイルの様に、codesnippets拡張子にしても複数設定が出来なかった・・・arrayを入れても認識してくれない・・・）

４、codesnippetファイルの<dict>要素内に各設定を記載
　※IDECodeSnippetUserSnippet：【重要】このキーを追加
　（デフォルトのファイルにはないが、ユーザー定義の値という宣言っぽい）
　・IDECodeSnippetVersion：バージョン？自動で更新されてる？？？　
  ・IDECodeSnippetCompletionPrefix：キーになる文字列
　・IDECodeSnippetContents：キーを置換する文字列
　・IDECodeSnippetIdentifier：他のIDと被らなければ、どんな文字列でも問題無さそう
　・IDECodeSnippetLanguage：使用言語（Objctive-C、C++等）
　・IDECodeSnippetCompletionScopes：表示される場所(複数可)
　　－TopLevel：クラス外
　　－ClassImplementation：クラス内、メソッド外
　　－CodeBlock：メソッド内
　　－All：全て？
　（システムに設定されてるスニペットを見た感じなので、たぶん^^;
　・IDECodeSnippetRelativePriority：プライオリティって書いてるので優先順位？

５、一度Xcodeを終了させて反映

---

サンプル
---

```xml:NSNumberTRUE.codesnippet
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDECodeSnippetCompletionPrefix</key>
	<string>@true</string>
	<key>IDECodeSnippetCompletionScopes</key>
	<array>
		<string>All</string>
	</array>
	<key>IDECodeSnippetContents</key>
	<string>@TRUE</string>
	<key>IDECodeSnippetIdentifier</key>
	<string>NSNumberTRUE</string>
	<key>IDECodeSnippetLanguage</key>
	<string>Xcode.SourceCodeLanguage.Objective-C</string>
	<key>IDECodeSnippetSummary</key>
	<string>NSNumber BOOL type TRUE value.</string>
	<key>IDECodeSnippetTitle</key>
	<string>NSNumber TRUE</string>
	<key>IDECodeSnippetUserSnippet</key>
	<true/>
	<key>IDECodeSnippetVersion</key>
	<integer>2</integer>
</dict>
</plist>
```

---
NSNumberのBOOL値にコード補間が効かなかったので、@TRUEを補間してくれるスニペットです^^;


参考：
http://stackoverflow.com/questions/5303374/how-do-i-create-custom-text-macros-in-xcode-4
スタティックメンバを参照する

TypeScriptで`constructor`は予約語だが、文字列(`this['constructor']`)を使えばアクセスできる。

```javascript:typescript
class Foo {
  static a = 'foo';

  constructor() {
    var p = document.createElement('p');
    var textNode = document.createTextNode(this['constructor'].a);
    p.appendChild(textNode);
    document.body.appendChild(p);
  }
}

class Bar extends Foo {
  static a = 'bar';
}

class Hoge extends Foo {
  static a = 'hoge';
}

new Bar();
new Hoge();
```
第9回オフラインリアルタイムどう書くの問題をSQLで解く

問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord9busfare/
テストに使用したDBはMySQLです。

まず問題を入れるテーブル作成。
問題番号のカラムは省略。一問毎に作りなおす。

```SQL
DROP TABLE IF EXISTS charge;
CREATE TABLE charge(charge INT,expect INT);
DROP TABLE IF EXISTS PASSENGERS;
CREATE TABLE passengers(age CHAR(1),type CHAR(1));
```

問題登録。

```SQL
INSERT INTO charge VALUES(210,170);
INSERT INTO passengers VALUES('C','n');
INSERT INTO passengers VALUES('I','n');
INSERT INTO passengers VALUES('I','w');
INSERT INTO passengers VALUES('A','p');
INSERT INTO passengers VALUES('I','w');
```

そして解く。
OFFSET指定でサブクエリが使えたらテンポラリテーブルを作らなくてすんだのに・・。

```SQL
CREATE TEMPORARY TABLE wk(id INT PRIMARY KEY AUTO_INCREMENT,charge INT)
  SELECT * FROM(
	SELECT TRUNCATE(charge/20+0.9,0)*10 AS charge FROM passengers JOIN charge WHERE age='I' AND type='n'
  	UNION ALL
  	SELECT TRUNCATE((TRUNCATE(charge/20+0.9,0)*10)/20+0.9,0)*10 AS charge FROM passengers JOIN charge WHERE age='I' AND type='w'
  ) AS wk ORDER BY charge DESC;

SELECT SUM(charge) AS charge, SUM(charge) = (SELECT expect FROM charge) AS result FROM(
  SELECT SUM(charge) AS charge FROM passengers JOIN charge WHERE age='A' AND type='n'
  UNION ALL
  SELECT SUM(TRUNCATE(charge/20+0.9,0)*10) AS charge FROM passengers JOIN charge WHERE age='A' AND type='w'
  UNION ALL
  SELECT SUM(TRUNCATE(charge/20+0.9,0)*10) AS charge FROM passengers JOIN charge WHERE age='C' AND type='n'
  UNION ALL
  SELECT SUM(TRUNCATE((TRUNCATE(charge/20+0.9,0)*10)/20+0.9,0)*10) AS charge FROM passengers JOIN charge WHERE age='C' AND type='w'
  UNION ALL
  SELECT SUM(charge) AS charge FROM wk WHERE id > (SELECT COUNT(*)*2 FROM passengers WHERE age='A')
) AS total;
```
proxy経由で社内からgithubにアクセスする。


タイトル通り、proxy経由で社内からgithubにアクセスする方法について適当にまとめておきます。


## 環境

 * Windows7 Professional 32bit
 * git version 1.8.1.msysgit.1


## 手順

+ 環境変数HOMEをちゃんと設定しておく。

> set HOME=C:\Users\rbtnn

+ SSH Public キーの作成する。

> ssh-keygen -t rsa -C "mail-address@gmail.com"

にて`~/.ssh/id_rsa`と`~/.ssh/id_rsa.pub`ができます。

+ GithubにSSH Public Keysを登録する。

`id_rsa.pub`の内容をgithubの「Account Settings」の「SSH Public Keys」に登録してください。

* `~/.ssh/config`に設定を記述する。

```
Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```

**proxy経由でなければ、ここまでの設定でGithubにアクセスできるはずです。
ここから先はproxy経由する場合に必須となる手順です。**



* `~/.ssh/config`にSSHの設定を追記する。

私の場合は以下のような感じになりました。`proxy_url:proxy_port`の部分は環境に応じて書き換えてください。
他のサイトでは、`connect.exe`を手に入れるためにソースからコンパイルして手に入れているみたいだけど、msysGitには普通に入っていました。

```
ProxyCommand C:/Git/bin/connect.exe -H proxy_url:proxy_port %h %p

Host ssh.github.com
  User git
  Port 443
  Hostname ssh.github.com
  TCPKeepAlive yes
  IdentitiesOnly yes
  IdentityFile ~/.ssh/id_rsa

Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

Host gist.github.com
  User git
  Port 22
  Hostname gist.github.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

```


* `.git/config`のurlをSSH仕様に変更する。

`rbtnn/vimrc.git`の部分は環境に合わせて書き換えてください。

```
 [core]
         repositoryformatversion = 0
         filemode = false
         bare = false
         logallrefupdates = true
         symlinks = false
         ignorecase = true
         hideDotFiles = dotGitOnly
 [remote "origin"]
         fetch = +refs/heads/*:refs/remotes/origin/*
-        url = git://github.com/rbtnn/vimrc.git
+        url = ssh://git@ssh.github.com:443/rbtnn/vimrc.git

 [branch "master"]
 	 remote = origin
 	 merge = refs/heads/master
```

以上

- - - - - - 

## 参考

* [proxy 経由で 社内から github にアクセスする方法](http://cointoss.hatenablog.com/entry/20110811/1313067890)
* [GitHub 最初の設定 — ssh 鍵の登録](http://akaato.blogspot.jp/2011/04/github-ssh.html)
コピペでつくれる合成カメラアプリ。

用意したグラフィックとの合成写真が撮影できるアプリが急遽必要になったのでつくってみました。
その際に作成したアプリのソースを記録しておこうとおもいます。

以下の3ステップで動作すると思うので、
もしも必要になった方がいれば、ご自由にご利用ください。

1. Titaniumで新規プロジェクトを作成
2. Resources/app.jsに下記コードをコピペ
3. Resources/img/以下に camera.png と graphic.png を用意する

```javascript:app.js
// iOS6.1.3のiPhone5でしか動作確認しておりません。

(function() {
    "use strict";

    var win           = Ti.UI.createWindow(),
        // カメラ起動ボタン
        button        = Ti.UI.createButton({
            top:             444,
            width:           50,
            height:          50,
            backgroundImage: "img/camera.png"
        }),
        cameraManager = new CameraManager;

    // 初回はカメラを自動的に起動
    cameraManager.showCamera();

    button.addEventListener("click", cameraManager.showCamera);

    win.add(button);
    win.open();

    // CameraManager Class
    function CameraManager() {
        var graphic, overlay;

        function showCamera() {
            // 合成するグラフィック（位置・サイズは適当です）
            graphic   = Ti.UI.createImageView({
                top:    265,
                width:  300,
                height: 210,
                image:  "img/graphic.png"
            }),
            overlay   = Ti.UI.createView();

            overlay.add(graphic);

            Ti.Media.showCamera({
                success:     handleSuccess,
                cansel:      handleCansel,
                error:       handleError,
                mediaTypes:  Ti.Media.MEDIA_TYPE_PHOTO,
                // オーバーレイ画像の設定
                overlay:     overlay,
                // アスペクト比の保持
                transform:   Ti.UI.create2DMatrix().scale(1)
            });
        }

        function handleSuccess(evt) {
            // カメラで撮影した画像をリサイズしたイメージビュー
            var imageView = Ti.UI.createImageView({
                    top:    10,
                    // アスペクト比を保持したまま画面内に収まるサイズにリサイズ
                    width:  318,
                    height: 424,
                    image:  evt.media
                });

            // グラフィックの位置を適当に移動（本来不要な処理）
            graphic.top = imageView.height - graphic.height;
            imageView.add(graphic);

            // カメラロールに保存
            imageView.toImage(function (evt) {
                Ti.Media.saveToPhotoGallery(evt.blob);
            });

            win.add(imageView);
        }

        function handleCansel(evt) {
            ;
        }

        function handleError(evt) {
            // カメラの起動に失敗した際のアラート
            alert("ERROR");
        }

        return {
            showCamera : showCamera,
        };
    }
})();
```

いかんせん超特急でつくったアプリだったので、
撮った写真をカメラロールに保存するという必要最低限の機能しか持たせてません。
また、カメラを起動している際と実際に保存される画像の合成位置に若干のズレが発生します。
そんなこんなですが、いつかどこかでこのソースが誰かの役に立つときがきてくれれば幸いです。
特定のクラスのメソッドの呼び出しをすべて無効にする


下記のように書くと、1行書き換えるだけでOKです。
呼び出し箇所をコメントアウトしなくても、そのまま実行できます。
また、対象のクラスにいくつメソッドがあっても、Nullクラスの記述はこれだけでOKです。

```ruby
# この行だけでデバッグ機能の有効・無効を切り替えられる
ENABLE_DEBUG = true # or false

class DebugImpl
  def log(message)
    puts message
  end

  def hoge
    puts 'hoge!'
  end

  def foo
    [1, 2, 3]
  end
end

class Null
  def method_missing(name, *args)
    self
  end

  def respond_to_missing?(symbol, include_private)
    true
  end
end

Debug = ENABLE_DEBUG ? DebugImpl : Null

# 呼び出し箇所はそのままで、問題なく実行できる
debug = Debug.new
debug.log('message')
debug.hoge
debug.foo.sort
```

ちなみに、method_missingでselfを返しているので、戻り値を使う場合やメソッドチェーンの場合も(ある程度)動きます。
CentOS6.3上に、Firefox20をインストールする

## 自動インストール

```
# wget -qO- https://gist.github.com/alingogo/5335285/raw | bash
```

* 条件1: CentOS6.3 

```
$ uname -a
Linux localhost.localdomain 2.6.32-279.14.1.el6.x86_64 #1 SMP Tue Nov 6 23:43:09 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS release 6.3 (Final)
```

* 条件2: firefox

```
http://download.mozilla.org/?product=firefox-20.0&os=linux&lang=ja
```

## 手動インストール
* yumで、最新のfirefoxをインストール

```
# yum install firefox
```

* しかし、最新は２０なので、http://www.mozilla.jp/firefox/からダウンロードする

```
# tar zxvf firefox-20.X.X.X.tar.gz
# cp -frp ~/firefox /usr/local/
# mv /usr/bin/firefox{,.bak}
# ln -s /usr/local/firefox/firefox /usr/bin/.
```

* 起動して、いろいろなエラーが出たので、以下のコマンドを実行する

```
yum install ld-linux.so.2
yum install libstdc++
yum install libstdc++.so.6
yum install libxul.so
yum install libpk-gtk-module.so libcanberra-gtk-module.so
```

* [参照](http://programming.ironsand.net/tag/neroaac/)
StoryBoardが実機に反映されないときの対処法


シミュレータで順調に作業していて、実機でも確認しようとしたときにStoryBoardの変更が反映されない問題が生じました。

結論から言うと、<strong>English用StoryboardとJapanese用のStoryboardの両方がプロジェクトに含まれていた</strong>のが原因でした。
今まではEnglish用しか変更してこなかったので、実機で起動するとJapanese用が参照されるため反映されていないように見えていたようです。

解決方法としては、English用かJapanese用のどちらかのStoryboardを削除すればいいようです。自分はEnglishでずっと編集をしていたので、Japanese用を削除したらしっかり反映されていました。

同じような問題を抱えている方は、Storyboardの言語を確認してみて下さい。参考になればと思います。
Gradle で maven の provided scope 相当

Gradle 便利だけど、`javax.servlet-api` みたいに、実行時に maven 依存以外からロードされるような依存パッケージを指定する [configuration][] が存在しない。

maven なら、`<scope>provided</scope>` でできるのに・・・

[configuration]: http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html#configurations

Gradle だと、それ相当を実装しないといけない。

こんな感じ:

```groovy
// maven でいうところの provided scope のエミュレート
// 参考: http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseClasspath.html
configurations{ provided }
sourceSets {
	main { compileClasspath += configurations.provided }
	test {
		compileClasspath += configurations.provided
		runtimeClasspath += configurations.provided
	}
}
eclipse.classpath {
	plusConfigurations += configurations.provided
	noExportConfigurations += configurations.provided
}
```

以上です。

　　糸冬
\-----------------------
制作・著作 ＮＨＫ
NSArray、NSDictionary、NSNumberの省略形

Xcode4.3から
NSArray、NSDictionary、NSNumberを省略して書けるようになってた・・・
知らなかったので忘れないよう、備忘録に

NSNumber
---
整数(longまで)：@10
小数(double)  ：@0.1
小数(float)   ：@0.1f
文字列        ：@'a'
16進数        ：@0xff
BOOL値        ：@(TRUE)、@TRUE、@YES、@true

NSArray
---
@[@"val1", @"val2", @"val3"]
@[@10, @0.1f, @(TRUE)]

NSDictionary
---
@{@"key1":@(TRUE), @"key2":@100, @"key3":@"value3"}

　　
　　
 
(@が大活躍だ～
(BOOL値は、YES・NOをAPPLEは推奨してるらしいんですが、C,C++も書くことがあるので、TRUEに統一しちゃってます^^;


参考：
http://www.tokoro.me/2012/08/12/objc-new-statements/


（追記修正
NSNumberに代入できる文字は、charの１文字だけっぽいので修正
Ushio@githubさんのご指摘で気付きました、感謝っす

（追記修正、その２
BOOL値は、@TRUE、@YES、@trueのように記載も可能でした
psihyさん、コメント感謝です～
(コード補間はしてくれないのか～
Strong Parameters で許可されていない属性がある場合に例外を発生させる方法

* ruby 1.9.3p392
* Rails 4.0.0.beta1

Rails4で標準になったStrong Parametersですが、これのせいで知らなぬ間に重要な属性が弾かれており結構ハマってしまいました。

特に、accepts_nested_attributes_forを使い出すと必ずハマるのではないでしょうか。

以下の様なログは生成されているのですが、普段からあまりログを見ていないので気づきませんでした。

```ruby:nameがpermitされていないときのログ
Unpermitted parameters: name
```

どうせなら例外を発生させてもよいのではないでしょうか。
調べてみたら、結構簡単に例外を発生させることができました。

以下の設定になります。

```ruby:config/initializers/strong_parameters.rb
ActionController::Parameters.action_on_unpermitted_parameters = :raise
```

上記のファイルを作成してサーバ再起動すればOKです。
このパラメータはデフォルトで :log に設定されています。# 開発とテスト環境でのみ？

注意ですが、意図的に許可しない属性がある場合でも例外が発生しますので、その場合は設定を解除してください。

参考：
http://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html
Rails::Generators の #namespace がフォルダ名にも影響していて、ハマった話。


モジュール名が`HOGE::Generators::ConfigGenerator` の時自動的に小文字変換されるので、

```
$ rails g h_o_g_e:config
```

となってしまう。

なので、namespaceを指定してやる必要がある。

```ruby
module HOGE
  module Generators
    class ConfigGenerator < Rails::Generators::Base
      source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
      namespace "hoge:config" # <- THIS!!

      def copy_config_file
        template 'hoge_config.rb', 'config/initializers/hoge_config.rb'
      end
    end
  end
end
```

この時、namespaceがフォルダ名にも影響してくるので、フォルダ名は 

`lib/generators/hoge/templates/hoge_config.rb`

でなければならない。

色々試している時に、フォルダ名を

`lib/generators/h_o_g_e/templates/config_generator.rb`

としていたために、エラーが発生しハマった。`source_root` で指定してるパスからテンプレートも拾ってくれると思ってたんだが…