OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのあまり使ってないけど便利そうなライブラリについて


[プログラミングRuby1.9ライブラリ編](http://amzn.to/1DBL798)を読んだので、個人的にはあまり使ってなかったけど、便利そうなメソッドとかライブラリとかをメモします．

[![プログラミングRuby1.9ライブラリ編](https://qiita-image-store.s3.amazonaws.com/0/3733/5910c3ce-5411-469a-356d-dca73ee673b7.jpeg "IMG_20150205_221638.jpg")](http://amzn.to/1DBL798)


# 組み込みクラス/モジュール
## Hash
`Hash#assoc` キーが一致するペアを返す

`Hash#rassoc` valueが一致するペアを返す

## IO
`IO.binread` バイナリとして開く

`IO.foreach` セパレータを指定して行ごとに繰り返す

`IO.popen` サブプロセスを起動してその標準入出力を取得する

## Kernel
`Kernel.__method__` 現在のメソッド名

`Kernel.at_exit` インタプリタ終了時に与えられたブロックを実行するよう登録する

`Kernel.caller` 現在の実行スタックを配列で返す

`Kernrl.fork` 子プロセスでブロックを実行する

`Kernel.trap` 指定したシグナルを受けたらブロックを実行する

## Process
`Process.wait` で待つか、`Process.detach` で子プロセスのステータスに関心がないと宣言しとかないとゾンビプロセスだらけになる

`Process.waitall` forkした子プロセスが全て終了するまで待つ.各プロセスの終了ステータスがArrayで返ってくる.


## Proc
`Proc#===` whenにprocを指定するとcaseの値を引数としてprocを呼び出す

`Proc#curry` カリー化。先頭から順に適用する。

## Regexp
`Regexp.union` 引数で渡したパターンのうち、一つ以上にマッチするようなパターンを返す。

`Regexp#named_captures` キャプチャ名をキーにしたHashを返す

## String
`String#[regexp,int]` 正規表現にマッチした部分を返す。部分マッチがほしい場合はintで指定する。

`String#center` 左右をパディングして中央寄せする。`String#ljust`, `String#rjust` で左右寄せ。

`String#crypt` 文字列を暗号化して返す

`String#hex` `"2a".hex # => 42`. `String#oct` もあるよ。`String#to_i` は先頭の "0x" とか "0" で基数判断してくれる。

`String#partition` パターン渡して、最初に見つかった[マッチ前,マッチ部分,マッチ後] を返す。後ろから探索したい場合は`String#rpartiton`．

`String#scan` パターンにマッチした部分が配列で返ってくる．パターンにグループが含まれてる場合はネストされてる．

`String#squeeze` 連続する文字を1文字に圧縮した文字列を返す。

## その他
`Array#pack`, `String#unpack` テンプレート文字列に従って文字列化したり戻したりする

# 標準ライブラリ
`Abbrev` 文字列集合を与えると、一意に識別可能ないいかんじの短縮形=>原形 をHashで返す。

`Benchmark` ベンチマークとる。

`Delegator` 簡単に委譲を実装できる

`Digest` md5とかsha1とか計算する

`expect` IOストリームから特定のパターンが返ってくるまで待つ

`FileUtils` unixライクなファイル操作群

`Forwardable` 指定したメソッドを別のオブジェクトへ委譲する。メソッド単位で一部を委譲したい場合はDelegatorよりこっち？

`GetoptLong` コマンドラインオプション処理。オプションが先に来るように並べ替えたり、引数有り無し指定が便利そう。

`IPAddr` IPアドレスを扱う際に

`irb` 実行中のアプリケーションからirbを起動する。シグナルが来たらirb起動して変数の値にアクセスしたりできる。すごい。

`json` JSONを扱う． j とか jj でいい感じにフォーマットできる．

`Logger` ログレベル指定、ローテートもできるロガー

`OptionParser` GetoptLongより便利そう。引数の型指定できたりする．

`OpenStruct` Hashのキーをメンバ、valueを値とする構造体をつくる

`PP` インスペクトの結果をフォーマットして出力する。自分で実装する場合はPrittyPrintで。

`Prime` 素数関連

`Profile` requireするだけで実行全体をプロファイリングしてくれる。実行時に `-r profile` するのがお手軽で良さそう。

`PStore` お手軽に永続化．階層化したオブジェクトも楽に扱える．

`Readline` ユーザ入力を扱うためのプログラムreadlineが使えます．コマンドヒストリとか補完ができて便利．

`Resolv` DNSクライアント．Ruby製．

`REXML` XMLのパースやXPathによる問い合わせができる．Ruby製．

`SDBM` ハッシュみたいに使える、お手軽な永続化モジュール．

`Set` 集合．よく考えたら組み込みクラスに入ってなかった．

`Socket` ソケット通信できる．

`StringIO` オープンされたIOオブジェクトのようにStringを振る舞わせる

`StringScanner` 組み込みの `String#scan`との違いとして、StringScannerは現在のポインタを持ってるので途中から再開できること．

`Tempfile` Rubyプログラムが終了すると自動的に削除されるテンポラリファイルを作成する．

`tmpdir` システムのテンポラリディレクトリへのパスを取得する．

`Tracer` requireするだけで、プログラムの一部または全体の実行をトレース出力する．`-r tracer` で起動すると全体をトレースする．

`TSort` トポロジカルソート．依存関係グラフを作るときなどに使えそう．

`URI` URI文字列をパースして、host部分やクエリ部分を取り出せる．

`WEBrick` お手軽HTTPサーバ．

`Zlib` zip,gzipを処理するモジュール．zlibライブラリがないと使えません






# よくわからんかったところ
`ThreadGroup` の使いどころ
`Contnuation` の使いどころ
`Fiber` の使いどころ
ฅ(・ω・ฅ)／{  cygwin 環境に zsh を入れて, 端末起動時に cowsay する }

## :musical_score: 概要
cygwin 環境に zsh を入れて, 端末起動時に cowsay します
## :hand: 前提
* apt-cyg をインストール済み

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール

~~~bash
$ apt-cyg install zsh
$ which zsh
/usr/bin/zsh
$ zsh --version
zsh 5.0.6 (x86_64-unknown-cygwin)
~~~

## :door: Zshをログインシェルにする

### /etc/passwd を編集

* before

~~~
XXXXXXX/your_user:/bin/bash
~~~

* after

~~~
XXXXXXX/your_user:/usr/bin/zsh
~~~

## <i class="fa fa-terminal" style="font-size:1em;"></i> Terminal を起動

* メニューが表示されます

![zsh1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/cbe55c2c-9002-f3fa-8814-4a3b845d502e.png)

* 対話に返答して任意の設定を行います

* 起動しました

![zsh2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9c5cb69f-a03f-a1e0-d687-84354b0743fa.png)

## <i class="fa fa-history" style="font-size:1em;"></i> 複数の端末を起動し、履歴を共有します
### ~/.zshrc の設定

~~~
# メモリ 履歴件数
HISTSIZE=100000

# 履歴ファイルパス
HISTFILE=$HOME/.zsh-history
# ファイル 履歴件数
SAVEHIST=100000

# 全履歴の表示
function history-all { history -E 1 }
# 履歴の共有
setopt share_history
~~~

## :cow: 端末起動時に cowsay を呼び出します
### ~/.zshrc の末尾に追記
~~~
cowsay "Hello!"
~~~

## 出力例
### 1 回目

![cowsay1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/1b6b3130-c65e-0136-0205-435d665f3fa8.png)

### 2 回目

![cowsay2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/8448a2aa-608d-8078-71bc-f7aea1fb3e71.png)

### 3 回目

![cowsay3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/6ffc915a-c702-18b6-a63b-16bf4284afc2.png)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Zsh official](http://www.zsh.org/)
postgresのテーブルの所有者を一括で変更する

postgresでデータベースの所有者を変更したいときに`ALTER DATABASE hoge OWNER TO new_user`で行けるかと思ったのですが、database以下のtableもひとつずつ所有者を変更する必要があるみたいです。
テーブルが大量にある場合、ひとつずつ`ALTER TABLE huga OWNER TO new_user`をするのは大変！ということで、ぐぐったら下記のような解決策がでてきました。

下記を実行するとSQL文が発行されます。

```sql 
SELECT
    'ALTER TABLE ' || schemaname 
    || '.' || tablename || 
    ' OWNER TO new_user;'
FROM pg_tables 
WHERE tableowner ='old_user'
```

```
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
 ALTER TABLE public.xxxxxxx OWNER TO xxxxxx;
…
```

あとはこれをコピーして実行すればok。
テーブルに紐づくスキーマの権限も同時に変更されました。

（参照：http://docolog.cocolog-nifty.com/papalog/2011/06/postgresql-8caf.html）
Swiftで日時文字列とUNIX時間を相互に変換する方法

Web APIなんかでよく遭遇する、日時文字列とUNIX時間を相互に変換する方法について。[Objective-CとSwiftでのUNIX時間の変換](http://qiita.com/koishi/items/efe0d654d710daa7a563) でもまとめている方がいらっしゃいましたが、逆方向の変換がなかったので、それも含めてまとめてみました。[SwiftでSimplenoteクライアントアプリを作ってみた](http://qiita.com/alpha22jp/items/854077c77131065eb26d) でも使っています。

ちなみに、UNIX時間というのは前記リンクにも書いてありますが、1970年1月1日0時0分0秒からの経過秒数で表す時刻表現のこと。

## 変換方法

Swiftでは (というか、Objective-Cでも同じですが)、NSDateという日時を扱うクラス、及びNSDateFormatterという日時文字列フォーマットを扱うクラスを経由して、日時文字列とUNIX時間を相互に変換できます。また、UNIX時間を入れる変数にはNSTimeIntervalという型を使います。これは単なるdoubleのtypealiasです。

### UNIX時間 => 日時文字列

```swift
// UNIX時間 "dateUnix" をNSDate型 "date" に変換
let dateUnix: NSTimeInterval = 1423053296
let date = NSDate(timeIntervalSince1970: dateUnix)

// NSDate型を日時文字列に変換するためのNSDateFormatterを生成
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

// NSDateFormatterを使ってNSDate型 "date" を日時文字列 "dateStr" に変換
let dateStr: String = formatter.stringFromDate(date)
```

### 日時文字列 => UNIX時間

```swift
// 日時文字列をNSDate型に変換するためのNSDateFormatterを生成
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

// NSDateFormatterを使って日時文字列 "dateStr" をNSDate型 "date" に変換
let dateStr: String = "2015-02-04 12:34:56"
let date: NSDate? = formatter.dateFromString(dateStr)

// NSDate型 "date" をUNIX時間 "dateUnix" に変換
let dateUnix: NSTimeInterval? = date?.timeIntervalSince1970
```

## 変換に関する補足

### 日時文字列のフォーマット

日時文字列 => UNIX時間の変換では、変換対象の文字列がNSDateFormatterで指定したフォーマットに合わずに変換できないとnilが返るので注意が必要です (そのため、Optionalになっている)。例えば、

```swift
let dateStr: String = "2015-02-04 12:34:56.123456"
```

のようにマイクロ秒表記が付いていると変換できません。このときは、

```swift
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSSSS"
```

とする必要があります。一方で、日付の区切りの "-" が "/" であっても問題なく変換できます。

### タイムゾーン

上記の変換では日時はローカル時間として扱われますが、Web API等ではGMTとして扱う場合があります。その場合は、下記のようにタイムゾーンを指定します。こうすると、変換対象の日時がGMTとして扱われます。

```swift
formatter.timeZone = NSTimeZone(name: "GMT")
```
[Unity] Unityにおける衝突判定まとめ


Unityは衝突判定を自動的に行ってくれるので、開発者はわざわざ衝突判定のコードを書く必要がありません。
しかし衝突判定でも、物理演算や衝突検出が関わってくると設定で混乱するので、ここで一度簡単にまとめてみることにしました。

# ～colliderコンポーネント
衝突判定の形状を示すコンポーネントです。
Materialを設定することで、反発定数などの衝突時の反発の仕方を指定することができます。

### Is Trigger
チェックがついていると他の物体と衝突した時に**Oncollison～**または**OnTigger～**系の関数が呼び出されます。
また、**衝突時に発生する反発効果がなくなります**。

# Rigidbodyコンポーネント
物体に剛体の性質を持たせるコンポーネントです。

### Use Gravity
チェックをつけると**重力の効果**が加わります。

### Is Kinematic
チェックをつけると、**物理演算が無効**になります。
物体を移動させるためには**transform.translate**を、回転させるためには**transform.rotate**を使う必要があります。
チェックがない場合は物体に対する力を与えるすることで、物体が移動するようになります。
移動の力を加える場合は**rigidbody.addforce**、回転力を加える場合は**rigidbody.addtorque**を使います。

# 設定例

以上の性質をもとに、ゲーム中のオブジェクトに対する設定例をまとめてみます。

|オブジェクトの種類|オブジェクト例|collider|rigidbody|
|---|---|---|---|
|位置固定|壁、障害物|Is Triggerにチェックを**入れない**。物質に応じたPhysics Materialを設定。|Is Kinematicsにチェックを**入れる**。Use Gravityにチェックを**入れない**。|
|物理演算に基づいて移動|プレイヤー、敵|Is Triggerにチェックを**入れない**。物質に応じたPhysics Materialを設定。**OnCollisionEnter**に衝突時の処理を書く。|Is Kinematicsにチェックを**入れない**。Use Gravityは任意。|
|衝突時に互いの動作に影響を与えない|チェックポイント、アイテム|Is Triggerにチェックを**入れる**。**Physics Materialは設定しない**。**OnTriggerEnter**に衝突時の処理を書く。|Is Kinematicsにチェックを**入れる**。Use Gravityにチェックを**入れない**。|
|物理演算を無視して移動|アニメキャラの服装|Is Triggerにチェックを**入れる**。**Physics Materialは設定しない**。**OnTriggerEnter**に衝突時の処理を書く。|Is Kinematicsにチェックを**入れる**。Use Gravityにチェックを**入れない**。|
iOSでMemory Warningのテスト


iPhoneアプリで`didReceiveMemoryWarning`とかをテストした時のメモ。

## Memory Warningを発生させる
### シミュレータ
iOS Simulatorのメニューにて

Hardware -> Simulate Memory Warning

で再現できます。
ショートカットは[command]+[shift]+M。

![Screen_Shot_2015-02-05_at_20_31_11.png](https://qiita-image-store.s3.amazonaws.com/0/8868/712eef67-a519-bbbd-77ab-dc724233e877.png "Screen_Shot_2015-02-05_at_20_31_11.png")

### 実機

下記のprivate APIが使えます。

```objectivec:someFile.m
[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
```

## Memory Warningをキャッチ

Memory Warningはそれぞれ
- AppDelegate
- ViewController
- UIApplicationDidReceiveMemoryWarningNotification
でキャッチできます。

```objectivec:AppDelegate.m
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    NSLog(@"applicationDidReceiveMemoryWarning");
}
```
```objectivec:ViewController.m
- (void)didReceiveMemoryWarning 
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    NSLog(@"didReceiveMemoryWarning");
}
```
```objectivec:someFile.m
- (void)someFunction 
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}

- (void) handleMemoryWarning:(NSNotification *)notification
{
    NSLog(@"handleMemoryWarning");
}
```

以上
remote_directoryで配置したディレクトリ配下のファイル権限を変えたい

タイトルの通り、chefのremote_directoryで配置したディレクトリ配下のファイルに実行権限をつけたかったのですが、コマンドで`chmod`するのはイケてない気がしたので別の方法を探しました。

###ざっくり言うと
---
* `chef`の`remote_directory`で配置したディレクトリ配下のファイルに実行権限を付けたい。
* 特別な指定なしで配置するとファイル権限は`644`となる。
* `mode`ではディレクトリの権限だけが変わる。
* `bash > code`で`chmod`することで実現できるが・・・。


###構成とやりたいこと
---
```text:階層
chef-repo
  ├─ files
  │  └─ var
  │      └─ www
  │         ├─ hoge.sh
  │         └─ fuga.sh
  ├─　recipe
  │  └─　default.rb
```
* `remote_directory`で`/var/www`を配置する。
* `hoge.sh`と`fuga.sh`に実行権限を付けて(権限を`744`にして)サーバに配置したい。

###方法
---
chefのrecipeにて　**files_mode** を指定することでファイル権限が変更できる。

以下に一例を挙げる。
この場合、`/var/www`ディレクトリの権限は`755`、それ配下のファイル権限は`744`となる。

```rb:default.rb
remote_directory "/var/www" do
  source "/var/www"
  owner 'alice'
  mode '0755'
  files_mode '0744'
  files_owner 'bob'
end
```

###最後に
---
`file_mode`の他にも`file_owner`や`files_group`などを指定することで、
ディレクトリ配下のファイルの所有者等を設定することも出来る。


参考サイト：[CHEF Documents](https://docs.chef.io/resource_remote_directory.html)
【Android Studio】beta版から1.0系への移行 for mac


Android StudioをBeta(0.8.x or 0.9.x)から1.0.1にupgradeする for mac

0.x系から1.0系へは「Check for Updates...」を選択してもupgradeできないので、インストールしなおす必要があります。

1.0系がでてしばらく経ちますが、正直、KeymapやLive Templateなどの設定がなくなってしまうのではないか？というのとビルドが通らなくなるのではないか？っていうのを危惧していたため、Upgradeはプロジェクトのキリがいいタイミングで行おうと思ってました。

そして、やっとそのタイミング来たので移行メモしておきます。

## ダウンロード

まず[ダウンロード]します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/7094693d-5906-74eb-5717-3751e6b8c6a7.png" width=400 />

## インストール


通常のアプリ同様Applicationフォルダにappファイルをドロップします。
ただ、その前に念のため今あるBeta版の「Android Studio.app」を「Android Studio Beta.app」などにRenameしておきます。

## 設定をインポート

設定のimportは簡単で初回起動時に下記のポップアップが表示されるので、そのまま「I want import my settings from a previous version (~/Library/Prefereces/AndroidStudioBeta)」を選択したままOKします。
これでKeymapなどの設定は問題なく取り込めていました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/e6e042ae-ade1-53a1-e5f1-8414e5d4879d.png" width=400 />

## アプリのbuild.gradleを編集

[Migrating Gradle Projects to version 1.0.0](http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0)の内容を見ればすぐなのですが、一応日本語で要点だけ。

まずアプリのTop Levelのbuild.gradleとgradle-wrapper.propertiesを下記のように書き換えます。


```build.gradle
     dependencies {
-        classpath 'com.android.tools.build:gradle:0.8.+'
+        classpath 'com.android.tools.build:gradle:1.0.0'
     }
```

```gradle/wrapper/gradle-wrapper.properties
-distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip
```

次に各プロパティ名が変わっているので(特にrunProguard)それもそれぞれ下記のように変更して完了です。

```
// Build Types
runProguard => minifyEnabled
zipAlign => zipAlignEnabled
jniDebugBuild => jniDebuggable
renderscriptDebug => renderscriptDebuggable

// Product Flavors
flavorGroups => flavorDimensions
packageName => applicationId
testPackageName => testApplicationId
renderscriptSupportMode => renderscriptSupportModeEnabled
ProductFlavor.renderscriptNdkMode => renderscriptNdkModeEnabled
```

以上で、問題なくビルドすることができました！

## ＋α

[【Android】もっと先へ「加速」したくはないか、少年 〜Project Template編〜](http://qiita.com/kgmyshin/items/9c803a21451e603531f0)で紹介しているProject TemplateはAndroid Studio Beta.app配下にあるので手動での移動が必要です！


以上です！
git rebase の基本的な挙動をメモ

git rebase の挙動 ... なんだっけ？
=====

って事がちょくちょくある．
しかも man とか help を見ても若干分かりづらい．

仕方ないから[LearnGitBranching](http://k.swd.cc/learnGitBranching-ja/?NODEMO)のページに行って

```bash
$ git checkout -b A master
$ git commit
$ git commit
$ git checkout -b Z master
$ git commit
$ git commit
$ git rebase A
```

みたいなサンプルを試して「あぁ，そうか A の先に Z が来るのね」って確認する．
毎回やってる．

いや，さすがに毎回この確認するのはアホだろ．

って事で備忘録
=====

```bash
$ git branch
  master
* src
  dest
```
```
       *src
      /
master
      \
       dest
```
って状況だとする．

git rebase \<branch\>
-----

その状態で

```bash
$ git rebase dest
```

ってやると

__dest ブランチを base として__ src ブランチでの変更が追加される

こんな感じ

```
master
      \
       dest - *src'
```

んでもって，たまに「dest を自分の先に継ぎ足したい」みたいな事もある
そんな時に一々 checkout するのも面倒なので rebase で2つのブランチを指定してしまう．

git rebase \<branchA\> \<branchB\>
-----

その指定が

```bash
$ git rebase src dest
```

そうすると今度は

```
       *src
      /
master
      \
       dest
```

から

```
       *src - dest'
      /
master
```

ってなる．

```bash
$ git rebase src (の先に) dest (を繋ぎ直す)
```

って覚えておけばいいかな？

個人的に git のコマンドは最初はできるだけ省略しないで覚える方が良いと思う．


そんな感じで．
PostgreSQLのプランナがテーブル行数見積りをどうしているか


マニアックな話。

PostgreSQLがクエリプランを作成するときに、テーブルに含まれている行数を見積もる方法

~~~
density := (reltuples) / (relpages)
(見積り行数) := round(density * (curpages))
~~~

* reltuples: ANALYZEで取得した統計情報のテーブルの行数
* relpages: ANALYZEで取得したテーブルのページ数
* curpages: ディスク上のファイルを調べて取得したテーブルのページ数

reltuplesとrelpagesはANALYZEを実行したタイミングで更新される統計情報の値なので、データの挿入や更新、削除によって必ずしも最新の状態を反映していない数値になっている。
かといって、全データを舐めて行数を数えるのは演算コストが大きく時間がかかりすぎる （`SELECT count(*) FROM ...;` を実行するのと等価）。
ただし、テーブルに何ページ含まれているか(curpages)を数えるのはディスク上のファイルサイズを調べればわかるので、比較的短時間でできる。

そこで、1ページあたりに含まれている行数の密度は多少更新されても変化しないだろう、という前提のもとで、直近のANALYZEによって判明している reltuples と relpages から行密度を計算して、行密度に curpages を掛けることで行数を見積もる、というアプローチがとられている。

実際に↑の計算をしているのは、`src/backend/optimizer/util/plancat.c`の`estimate_rel_size`関数([定義へのリンク](https://github.com/postgres/postgres/blob/0a7832005792fa6dad171f9cadb8d587fe0dd800/src/backend/optimizer/util/plancat.c#L407))。

curpages を取得する関数は表面上は `RelationGetNumberOfBlocks`関数だが、内部での関数呼び出しの階層は深く、結局正味の仕事をしているのは`mdnblocks`関数である。
コールスタックはこんな感じ。

 * `RelationGetNumberOfBlocks` マクロ展開→ `RelationGetNumberOfBlocksInFork`
 * `smgrnblocks`
 * smgrクラスの`nblocks`メソッドにディスパッチ
 * 実際にはsmgrクラスの実装は`md`の1つしかないので `mdnblocks` が呼ばれる

## このネタを調べた経緯

PostgreSQLの `pg_stat_user_tables` にある `n_live_tup` の値（有効な行数）が一体全体何の値を指し示しているのか気になって調べていた。

その最中に pgsql-general の[このスレッド](http://www.postgresql.org/message-id/4260256.28.1323361122333.JavaMail.root@store1.zcs.ext.wpsrv.net)が出てきて、話の中でTom Laneが

> The planner doesn't use n_live_tup; the only thing that that's used for
> is decisions about when to autovacuum/autoanalyze.

と答えていて、さらに続くメールでは

> > I'm just curious: where does the planner take the (approximate) row-count from?
> 
> It uses the tuple density estimated by the last vacuum or analyze (viz,
> reltuples/relpages) and multiplies that by the current relation size.
> There are various reasons for not using n_live_tup, some historical and
> some still pretty relevant.

とも書いていたので、実際に計算してる場所が気になったので調べてみた。
`n_live_tup`を使わない "various reasons" も気になるが、とりあえず放置。
Android Studioで２つのmodule間で共通のクラスを利用する

AndroidWearアプリ開発など、１つのプロジェクトの中に２つ以上のModuleが入っていてその間で共通のクラスを利用した場合の手順です。

File>New Module>Android Library

今回はCommonという名前にしました。

次に
File>Project Strcture
からcommon moduleを利用したいmoduleを選択し
dependenciesタブ>+>Module Dependencies
からcommonを追加
YEOMANでyuidocを扱う


# grunt-contrib-yuidocをインストール

```shell-session
$ npm install grunt-contrib-yuidoc --save-dev
```

なお、アンインストールしたいときは以下のコマンドを実行する。

```shell-session
$ npm uninstall grunt-contrib-yuidoc --save-dev
```

# Gruntfile.jsを修正
## yuidocタスクを作成する

```
・・・
yuidoc: {
  compile: {
    name: '<%= yeoman.name %>'
  , description: '<%= yeoman.description %>'
  , options: {
      paths: '<%= yeoman.app %>/scripts/hoge/'
    , linkNatives: 'true'
    , outdir: '<%= yeoman.app %>/scripts/hoge/doc'  
    }
  }
},
・・・
```

`<%= yeoman.name %>` および `<%= yeoman.description %>`は、`appConfig` を定義している箇所で追記しておいた。

## 作成した`yuidoc`タスクをwatchタスクに組み入れる

```
watch: {
  yuidoc: {
    files: ['<%= yeoman.app %>/scripts/hoge.js'],
    tasks: ['yuidoc:compile'],
    options: {
        libereload: true
    }
  },
  ・・・
```

## だけども。。。
生成されたドキュメント内に、ソースコードを含めたくない。

以前、yuidocをコマンドラインから実行するときは、[この記事](http://qiita.com/Mitsunori_Tsukada/items/17a0ab26aada032a0a58)で書いた様なやり方があったんだけど、今回のやり方だと[マニュアル](http://yui.github.io/yuidoc/args/index.html)を見ても、どうもできなさそうな気が・・・

この辺り、どなたか **解決策あれば教えて欲しいですっ。。。**
みんなの為のMySQLまとめ（１）


参考
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_06.htm

##データベースに関する操作

####現在存在しているデータベース一覧表示。
mysql> SHOW DATABASES;

####データベースを作成する。
mysql> CREATE DATABASE(データベース名);

####データベースを破棄する。
mysql> DROP DATABASE(データベース);

####データベース内に入る。
mysql>USE(データベース名)

####テーブルの一覧を表示。
mysql> SHOW TABLES;

####テーブル作成
CREATE TABLE(テーブル名);

```
create table (テーブル名)(
key1	char(008)  primary key,
data1  int8,
data2  int8,
data3  int8
);
```
####テーブルを破棄する。
mysql> DROP TABLE(テーブル名);
　
　
■項目タイプ(フィールドタイプ)

  ・MySQL 項目型

    int / integer    4 バイト整数
    smailint         2 バイト整数
    bigint / int8    8 バイト整数
    float            浮動小数点
    double / real    倍精度浮動小数点
    date             日付
    time             時間
    timestamp        日付時間
    char(文字数)     固定長文字列  (最大 256 文字)
    varchar(文字数)  可変長文字列  (最大 256 文字)
    text             ラージ文字列  (最大 65535 文字)
    mediumtext       ラージ文字列  (最大 16777215 文字)
    largetext        ラージ文字列  (最大 4294967295 文字)
    blob             ラージバイナリ(最大 65535 bytes)
    mediumblob       ラージバイナリ(最大 16777215 bytes)
    largeblob        ラージバイナリ(最大 4294967295 bytes)

■キー作成

  ・単項目のキー設定は、テーブル作成時の create 文で行うと良い。
    項目定義に primary key を指定するだけである。

  key1           char(008)     primary key,
  
・複合キーは、テーブル作成後に別途 alter 文でも追加できる。

```
alter table testm add primary key (
    key1,
    key2
);
```

■順序作成(オートナンバー)

  ・順序は、auto_increment と定義することで利用できる。
    昔の MySQL と仕様が変わった? (それとも私の古い資料が間違っている?)
    構文も違うし、キー指定しないとエラーでダメであった。

```
create table testm (
  key1           smallint unsigned not null auto_increment primary key,
  data1          int8,
  data2          int8,
  data3          int8
) type=InnoDB;

insert into testm (data1) values (100);
insert into testm (data1) values (200);

+------+-------+-------+-------+
| key1 | data1 | data2 | data3 |
+------+-------+-------+-------+
|    1 |   100 |  NULL |  NULL |
|    2 |   200 |  NULL |  NULL |
+------+-------+-------+-------+
```

  ・Oracle と同じ順序のような create sequence はないようである。
#PPx Paper Plane xUI において開いているタブのパスをコピー先としてメニュー表示


```javascript:copy_menu.js
//!*script
// タブをメニューとして表示してコピー先を選択する
// PPx 1.41 x64 + Script Module R14

var tabs = PPx.Pane.Tab;
if (tabs.Count < 3) PPx.Execute('%k"C"'); // タブが3個未満なら普通のコピー

var tab = '';
var paths = {};
var path = '';
for (var i = 0; i < tabs.Count; i++) {
    tab = tabs.Item(i);
    path = tab.Extract('%D');
    if (tab.Type == 1) {
        paths[path] = 1;
        continue;
    }
    if (paths[path] == undefined) paths[path] = 0;
}

var id = 65; // A
PPx.Execute("*setcust -|M_copy_to="); // 初期化
for (var path in paths) {
    if (paths[path] == 1) var focus = String.fromCharCode(id);
    PPx.Execute('*setcust M_copy_to:&' + String.fromCharCode(id) + ' ' + path.replace('\\t', '\\\\t') + '= *ppcfile copy, "' + path + '"\n');
    id++;
}
PPx.Execute("%M_copy_to," + focus); // 反対窓のパスを選択

```

を作って `*script copy_menu.js` を実行。
php でサクッとベンチマークを取る関数

下記のような関数を作りました。

```php:benchmark.php
function benchmark($callback)
{
    $PERIOD = 1;
    $FORMAT = "%-24s %9s called.%s";
    
    if (is_callable($callback, false, $callname))
    {
        if ($callback instanceof Closure)
        {
            $ref = new ReflectionFunction($callback);
            $callname = $ref->getFileName() . '#' . $ref->getStartLine();
        }
    }
    else
    {
        $callname = $callback;
        $callback = create_function("", "$callback;");
    }
    
    $args = array_slice(func_get_args(), 1);
    
    $end = microtime(true) + $PERIOD;
    for ($count = 0; microtime(true) <= $end; $count ++)
    {
        call_user_func_array($callback, $args);
    }
    
    printf($FORMAT, $callname, number_format($count), PHP_EOL);
}
```

callable な引数と、それを呼ぶときの引数を与えると、1 秒間で何回呼べたかを表示します。
（実行可能なコード文字列を与えても OK なようになってますが、これは自分用のおまけです。どうせベンチマークだし）。

```php:sample.php
require_once 'benchmark.php';

class C
{
    public function __get($name)
    {
        if (method_exists($this, $name))
        {
            return array($this, $name);
        }
    }

    public function f()
    {
        return "my name is " . get_class() . ".";
    }

    public function g()
    {
        $name = get_class();
        return "my name is {$name}.";
    }
}

benchmark("mt_rand", 1, 100);
benchmark("rand", 1, 100);

benchmark('(float)"1.2"');
benchmark('floatval("1.2")');

benchmark(function ($v) {return $v * $v;}, 4);
benchmark(function ($v) {return pow($v, 2);}, 4);

$c = new C();
benchmark(array($c, 'f'));
benchmark(array($c, 'g'));
benchmark($c->f);
benchmark($c->g);
```

上記の実行結果は下記です。

```
mt_rand                    879,020 called.
rand                       847,397 called.
(float)"1.2"               716,748 called.
floatval("1.2")            591,736 called.
/path/to/sample.php#32     714,772 called.
/path/to/sample.php#33     603,412 called.
C::f                       664,103 called.
C::g                       616,159 called.
C::f                       651,382 called.
C::g                       606,337 called.
```

関数はそのまま関数名を、eval な文字列はそのままそれを、クロージャの場合は定義場所を、メソッドの場合は「クラス::メソッド」を、それぞれ名前として表示します。

この結果により、

* rand 関数より mt_rand 関数の方が速い（何度か実行すると逆転したので誤差レベル）
* floatval 関数より float キャストの方が速い
* pow 関数で 2 乗するより単純に掛け算したほうが速い
* 文字列埋め込みより文字列結合の方が速い

的なことが推測できます。

個人的に「こうしたほうが速いかなー、いや、こうかなー」のような試行錯誤を結構するので、こういう関数は有用だったりします。

※ クラスC の `__get` はメソッドを呼び出し可能な形式で返すためのものです。本筋とは全く関係ありません
※ 個人的に `array($c, 'f')` より `$c->f` で callable にしたいんです…（メソッド名を文字列で指定するのがなんか嫌）
テンプレートから出力される日付・時刻のフォーマットを変更する方法

# 目的
タイトルの通り。
ただし、毎回テンプレートフィルタを使ってフォーマットを指定するのではなく、何も考えずに

```html
{{date_obj}}
{{datetime_obj}}
```

のようにテンプレートに書いた時に出力されるフォーマットを変更したい、というお話。

# デフォルトの挙動
先に示したとおりにテンプレートを記述すると、実際に出力されるHTMLは下記のようになる。

```html
2015年2月5日
2015年2月5日 19:46:36
```

ただし、これはロケールがjaの場合の挙動。
他のロケールでは、デフォルトの出力フォーマットは当然異なる。


# django.conf.localeモジュール

こうしたロケールごとの出力フォーマットは、django.conf.localeモジュール配下に定義されている。
locale配下には、さらに各国語ごとのモジュールが配置されており、日付や時刻の出力書式は、django.conf.locale.xx.formatsに定義されている

# formats.py

django.conf.locale.jaの中を見ると、formats.pyというモジュールがある。中身は以下のとおり（ver1.7のもの）

```py3:formats.py
# -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package.
#
from __future__ import unicode_literals

# The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = 'Y年n月j日'
TIME_FORMAT = 'G:i:s'
DATETIME_FORMAT = 'Y年n月j日G:i:s'
YEAR_MONTH_FORMAT = 'Y年n月'
MONTH_DAY_FORMAT = 'n月j日'
SHORT_DATE_FORMAT = 'Y/m/d'
SHORT_DATETIME_FORMAT = 'Y/m/d G:i:s'
# FIRST_DAY_OF_WEEK =

# The *_INPUT_FORMATS strings use the Python strftime format syntax,
# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
# DATE_INPUT_FORMATS =
# TIME_INPUT_FORMATS =
# DATETIME_INPUT_FORMATS =
DECIMAL_SEPARATOR = '.'
THOUSAND_SEPARATOR = ','
# NUMBER_GROUPING =
```

この中のDATE_FORMAT, TIME_FORMAT, DATETIME_FORMATが、テンプレートに埋め込まれたdate,time,datetimeオブジェクトの出力フォーマットになる。

※settings.pyに同名のプロパティ指定しても全く挙動変わらないなー、と思ってたら、デフォルトの場合に適用されるのはこっちだった。

# カスタムfomarts.pyの作成

[公式ドキュメントの解説](https://docs.djangoproject.com/en/1.7/topics/i18n/formatting/#creating-custom-format-files)

カスタムのフォーマットファイルを用意したい場合は、フォーマットファイルの配置先を決めて、そのパスをsettings.FORMAT_MODULE_PATHに定義する。

例えば、mysiteプロジェクトにformatsフォルダを作って…という場合は、以下の様な設定＆モジュール構成にする。

```py3
FORMAT_MODULE_PATH = 'mysite.formats'
```

```
mysite
  └ mysite
     ├ __init__.py
     ├ settings.py
     └ formats
        ├ __init__.py
        └ ja
           ├ __init__.py
           └ formats.py
```

※フォーマットファイルは、設置したパスに直接配置するのではなく、ロケールごとのフォルダを掘って、その下に配置する。


あとは、自分の好きなようにformats.pyを定義すればOK

```py3:formats.py
DATE_FORMAT = 'Y/m/d'
TIME_FORMAT = 'G:i:s'
DATETIME_FORMAT = 'Y/m/d G:i:s'
```

とりあえず今回の目的である、日付・時刻のフォーマットだけ書いておく。

# 結果

```
2015/02/05
2015/02/05 19:46:36
```

出力結果のHTMLは、ちゃんとカスタムのフォーマットが適用されてくれた。
Spring でローカルで開発中の Gem を読みなおす

# 概要

最近の Rails は [Spring](https://github.com/rails/spring) が標準で導入される。
普段は快適に開発出来るのだけれど、ローカルにある Gem のファイルを触った時には少し困る。

何も設定していなければ Spring の監視対象は、Rails の主要ファイルのみとなり、ローカルに置いている Gem のファイルを触ったところでプリロードされている Rails の環境には影響がない。

# 解決策

いくつか方法があって、簡単な順に見ていく。

### Spring を再起動する

これは簡単で一度止めてやればいい。

```shell-session
$ spring stop
```

### Spring を一時的に無効にする

コンソールだけで更新したいときなどは一時的に無効にする方法もある。

```shell-session
$ DISABLE_SPRING=1 rails console
```

### 監視対象に追加

Spring の監視対象に追加してやるとそこだけ読み直してくれるの速い。
ディレクトリを指定すればその下のファイルを監視してくれるようになるので、Gem のディレクトリを追加しましょう。

```ruby:config/spring.rb

Spring.watch "/path/to/yourgem"
```

これでファイルを書き換えると自動的に読み直してくれるようになる。
varnish_運用コマンド

# varnishこまんど

```bash
## 構文check
varnishd -C -f /tmp/test.vcl 

## clientとのやり取りのlog
varnishlog -C 
### よくこれでStatusだけcheckしたりしてる
varnishlog -C | grep Status

## backendとのやり取りのlog
varnishlog -b  
```

# varnishadm

```bash
## 認証でコケたら
varnishadm -T localhost:6082 -S /etc/varnish/secret

## なにつかえるのん
varnishadm help

## 現在アクティブなconfig
varnishadm vcl.list | awk ' /^active/ { print $3 } '
```


# curl

```bash
## キャッシュパージ
curl -X PURGE http://localhost/hogehoge.png

## 全部のキャッシュパージ
varnishadm "ban.url .*"
```
BootstrapのPopoverでアプリの道案内


先日の[Railsログ可視化](http://qiita.com/hiconyan/items/efa8fc888dc91299633e)でも話ましたが，学生プロジェクトで学内向けのRailsアプリを開発しています．
もうすぐオープンベータなので「はじめてのユーザに使い方を案内する方法」を考えてみました．

## Popover(吹き出し)を使う

CSSフレームワークの「[Bootstrap](http://getbootstrap.com/)」では，[Popover](http://getbootstrap.com/javascript/#popovers)という機能が提供されています．
これはボタンなどに表示する「吹き出し」を提供しています．

今回はこのPopoverをアプリの動線上に順に表示することで，ユーザを案内します．

## サンプル

案内を開始するボタンと，Popoverを表示するボタンを設置します．
「はじめての人はクリック」ボタンを押すと「新規登録」に`data-content`の内容でPopoverを出します．

```html
<button class="btn btn-warning" id="new-btn-1">はじめての方はクリック</button>
<a class="btn btn-primary" id="new-pop-1" data-content="アプリを利用するために、アカウントを登録してください。" href="/users/sign_up">新規登録</a>
```

更に，ページ遷移後も続けて案内できるように，Cookieに案内中であることを記録します．
expireがCookieの有効期限で，ここでは`1000 * 300 = 5分`にしています．

```coffeescript
$( '#new-btn-1' ).on 'click', ->
  expire = new Date()
  expire.setTime expire.getTime() + 1000 * 300
  document.cookie = 'newcomer=yes; expires=' + expire.toUTCString()
  $( '#new-pop-1' ).popover 'show'
```

遷移先のページで次のボタン('#new-pop-2')にPopoverする場合は，Cookieの情報で判断します．

```coffeescript
if document.cookie.indexOf( 'newcomer=yes' ) isnt -1
  $( '#new-pop-2' ).popover 'show'   
```

実際の画面はこんな感じ．
後輩からの要望で，Popoverは目立つ色に変えました．

![ad-pri.png](https://qiita-image-store.s3.amazonaws.com/0/58742/1264a0b9-41fe-84f8-08e9-ab0c998331cb.png "ad-pri.png")

## 案内完了時

案内が完了したときにCookieを削除します．
有効期限を過去にしてCookieを上書きすれば良いようです．

```coffeescript
if document.cookie.indexOf( 'newcomer=yes' ) isnt -1
  expire = new Date()
  expire.setTime 0
  document.cookie = 'newcomer=no; expires=' + expire.toUTCString()
cpanm intall で嵌ったら。


### -f が効かない


`Amon2::Setup::Flavor::Teng` 入れようとしたら、 まともに `Amon2` が入っていようが、

```bash:
Found Amon2::Plugin::DBI  which doesn't satisfy 0.08.
```

で蹴られる。`-f` しても、同じ

## 解決方法

ソース取って来て、 META.json 弄って、普通に直接インストールすりゃいいんじゃね？

### もっとスマートな方法ねーかなあ？ 

```bash:
$ wget -q http://search.cpan.org/CPAN/authors/id/S/SH/SHIBUYA/Amon2-Setup-Flavor-Teng-0.05.tar.gz
$ tar zxf Amon2-Setup-Flavor-Teng-0.05.tar.gz
$ cd Amon2-Setup-Flavor-Teng-0.05
$ cp META.json META.json.bak
$ diff META.json META.json.bak
44c44
<             "Amon2::Plugin::DBI" : undef,
---
>             "Amon2::Plugin::DBI" : "0.08",
$ cpanm ./
```

一応解決

### memo

* `META.json` と `META.yml` があったが、[ここ](http://perldoc.jp/docs/modules/CPAN-Meta-2.132140/lib/CPAN/Meta/Spec.pod#SERIALIZATION)の通り優先されるのはジェイソン
* メモした当時から事情が変わったかと思ったけど、投稿時現在 (20150205) 、再取得しても undef のままでした

```bash:
$ perl -MAmon2::Plugin::DBI\ 42
Amon2::Plugin::DBI does not define $Amon2::Plugin::DBI::VERSION--version check failed.
BEGIN failed--compilation aborted.
```
WA をデーモン化


### .plist

```xml:plist_name.plist
<?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>Label</key>
        <string>plist_name</string>
        <key>WorkingDirectory</key>
        <string>/Users/XXX/cmd/MyApp</string>
        <key>EnvironmentVariables</key>
        <dict>
            <key>PLACK_ENV</key>
            <string>development</string>
        </dict>
        <key>ProgramArguments</key>
        <array>
                <string>/Users/XXX/.anyenv/envs/plenv/versions/5.18.4/bin/plackup</string>
                <string>-a</string>
                <string>Starman</string>
                <string>-p</string>
                <string>5000</string>
                <string>-a</string>
                <string>app.psgi</string>
        </array>
        <key>StandardOutPath</key>
        <string>stdout.log</string>
        <key>StandardErrorPath</key>
        <string>stderr.log</string>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>
```

* 環境変数は、`EnvironmentVariables`
* ワーキングディレクトリを明記
* コマンドラインは、`ProgramArguments` に一個一個
	* スクリプトパスはフルパスで。
* `OnDemand` は使わず `KeepAlive`
* `/dev/null` 多用は悪いクセ。
	* `StandardOutPath` はどーでもいいが、`StandardErrorPath` は確認出来た方が良い
	* `/etc/newsyslog.d` でログのローテーションも視野に

### 運用。
上記を、`/Library/LaunchDaemons` に突っ込んで終り
当然 root に `chown` するけど。

* WA 自体の方では、出来るだけ相対パスで運用する。絶対パスでは、アプリバックアップ時や複製時などで、めんどい。
Play の Cache を永続化する

PlayFramework では、デフォルトで Ehcache というキャッシュライブラリを利用できます。
Ehcache はディスクに永続化する設定となっていないため、例えばセッション情報をキャッシュに保存している場合、ソースを変更してコンパイルが走るとキャッシュが全部削除されログイン状態ではなくなります。

開発時ですのでいちいちログインし直すのが面倒です。そこで、Ehcache の設定ファイルを作成しキャッシュをディスクに永続化してみます。

# 設定ファイルの配置場所

Ehcache の設定ファイルは以下の順番で検索され、存在するものを利用します。

1. 設定ファイルの `ehcache.configResource` に指定されたリソースパス
2. `conf/ehcache.xml` ファイル
3. デフォルトで定義されている `ehcache-default.xml`

特に気にする必要がなければ、 `conf/ehcache.xml` に配置するといいでしょう。

# 永続化する設定

以下の内容で設定ファイルを作成します。よく分からない人はコピペでいいです。 (自分もよく分からない)

```xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" updateCheck="false">

    <!-- ehcache 永続化ファイルのパスを指定 -->
    <diskStore path="user.dir/.ehcache" />

    <!-- diskPersistent="true" で永続化を有効にする (デフォルトは false) -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            maxElementsOnDisk="10000000"
            diskPersistent="true"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
    /> 
    
</ehcache>
```

この内容のファイルを `conf/ehcache.xml` に配置してサーバを起動すると、 `PROJECT_ROOT/.ehcache` ディレクトリに Ehcache の永続化ファイルが作成されます。

設定のポイントは以下の 2 点です。

* `<diskStore>` タグ  
  このタグを作成し `path` 属性で永続化ファイルを配置するパスを指定します。 `user.dir` はプロジェクトのルートディレクトリに変換されるようです。
* `diskPersistent` 属性  
  この項目に `true` を設定すると、JVM が再起動される際にキャッシュデータを永続化するようになります。

# まとめ

Ehcache を永続化する設定についてまとめてみました。
これでいちいちログインしなくても良くなります！ただ、本番環境にて Ehcache を使用する場合で永続化が不要な場合は、設定ファイルが有効にならないように注意しましょう。
findコマンドで複雑な検索条件を設定する


または、Vimの設定ファイルを検索して編集する自作コマンドevimについて。

## 必要な検索条件
探したいのは以下のファイル。これらの中には実体ファイルとシンボリックリンクがともに含まれる。

* ~
	* .vimrc
	* hateblo.vim
* $vim_conf(=~/.vim/conf)
	* bundle-init.vim
	* (以下略)

つまり、検索条件をテキストで表現するなら以下の通り。

* 「~」または「$vim_conf」ディレクトリに存在する
* ファイル名が「.vimrc」または「*.vim」
* タイプが「ファイル」または「シンボリックリンク」

## 各種のオプション
### ディレクトリ指定
複数のディレクトリを検索するには、単に並べれば良い。
さらに、親ディレクトリとサブディレクトリを除くため、depth指定をする。

```bash
# export vim_conf=~/.vim/conf
find ~ "$vim_conf" -mindepth 1 -maxdepth 1
```

### タイプ指定
`-o`(`-or`)オプションを利用する。

```bash
find . -type f -o -type l
```

### ファイル名指定
タイプと同様に指定する。

```bash
find . -name '.vimrc' -o -name '\*.vim'
```

なお、ここで特定のファイル名を除外する場合、`-not`オプションを併用する。

```bash
find . \( -name '.vimrc' -o -name '\*.vim' \) -not -name '\*bundle\*'
```

## 複数のオプションを任意に適用する
上の例に使用したが、複数のオプションを適切に扱うには、`\(\)`で括る。

括弧内の条件が先に計算されるため、上記の例は「ファイル名が.vimrcまたは*.vim」の候補から「ファイル名が*bundle*でない」ものを絞り込むという意味になる。

言い換えれば、`\( -name '.vimrc' -o -name '\*.vim' \)`と`-not -name '*bundle*'`のそれぞれに、暗黙的に`-a`(`-and`)が適用されている。

## まとめる

```bash
$ find ~ "$vim_conf" \( -type f -o -type l \) \( -name '*.vim' -o -name '.vimrc' \) -not -name '*bundle*' -mindepth 1 -maxdepth 1
/Users/catfist/.hateblo.vim
/Users/catfist/.vimrc
# 以下略
```

## シェルスクリプト化する
これを、[grepeco](http://qiita.com/catfist/items/f93ba9959435424a9f4e)に渡して絞り込み、さらにMacVimに渡す。

```evim.sh
#!/bin/bash
find ~ "$vim_conf" \( -type f -o -type l \) \( -name '*.vim' -o -name '.vimrc' \) -not -name '*bundle*' -mindepth 1 -maxdepth 1 | grepeco "$*" | xargs mvim
```
既存のリポジトリを GitHub に 登録する (proxy 越し)

忘れてしまうのでメモ。

git init して add , commit したお手持ちのリポジトリをGitHubにpush する方法です。

```bash

$ git remote add origin https://github.com/username/reponame.git
$ git config remote.origin.proxy http://company.proxy.com:8080
$ git push -u origin master
```

git config で proxy を設定するのがポイントです。
proxy サーバー名とポート番号は環境に合わせてどぞ。
コードでコントロールを生成する

# はじめに
コードでコントロールを生成する一例です。

メソッド名を「new」で始めるようにし Product > Analyze での判定も正常に行われるようにしています。


# 生成メソッド
```lang:UILabelの場合
+ (UILabel *)newLabel:(CGRect)rect text:(NSString *)text alignment:(int)alignment
{
    UILabel *label = [[UILabel alloc] init];
    
    [label setFrame:rect];
    [label setText:text];
    [label setFont:[UIFont systemFontOfSize:16]];
    [label setTextColor:[UIColor blackColor]];
    [label setTextAlignment:alignment];
    [label setNumberOfLines:0];
    [label setLineBreakMode:NSLineBreakByWordWrapping];
    [label setBackgroundColor:[UIColor clearColor]];
    
    return label;
}
```

```lang:UIButtonの場合
+ (UIButton *)newButton:(CGRect)rect title:(NSString *)title target:(id)target selector:(SEL)selector
{
    UIButton *btn = [[UIButton alloc] initWithFrame:rect];

    [btn setTitle:title forState:UIControlStateNormal];
    [btn.titleLabel setTextAlignment:NSTextAlignmentCenter];
    [btn.titleLabel setFont:[UIFont boldSystemFontOfSize:18]];
    [btn.titleLabel setAdjustsFontSizeToFitWidth:YES];
    [btn.titleLabel setMinimumScaleFactor:0.5];
    [btn.titleLabel setLineBreakMode:NSLineBreakByTruncatingTail];
    [btn setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
    [btn setBackgroundColor:[UIColor whiteColor]];
    [btn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
    [btn addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
    
    return btn;
}
```

```lang:UITextViewの場合
+ (UITextView *)newTextView:(CGRect)rect text:(NSString *)text
{
    UITextView *textView = [[UITextView alloc] initWithFrame:rect];
    
    [textView setText:text];
    [textView setBackgroundColor:[UIColor clearColor]];
    
    return textView;
}
```

適宜、設定内容をアレンジしてください。

他にもプロジェクトで多用するコントロールがある場合、この流れで生成系のメソッドを作り使っています。

そのプロジェクトで標準となる色、フォント、サイズにしておくと便利です。

# おわりに
Storyboard使用が主流になりつつあると思いますが、コードで生成したいぜ！という場合の参考になりましたら幸いです。
window.consoleの使い方



####logを出力する

```javascript:js
var str = "文字列" ,
num = 666 ,
flo = 1.7320508075 ,
url =  'http://google.com/';

console.log('Stringの出力 : %s', str);
console.log('Numberの出力 : %i', num); // %dも利用可
console.log('Floatの出力  : %f', flo);
console.log('URLの出力  : %o', url);
console.log('複数出力 : %s %d %f',str,num,flo);
````

####アイコン付きで出力する

```javascript:js
console.info('information');
console.warn('warning');
console.error('error');
````


####配列を表示させる

```javascript:js
console.table([[1,2,3], [2,3,4]]);
```

####オブジェクトを表示させる

```js:javascript
console.dir({js:'javascript'});
```


----


####グルーピング

```javascript:js
console.group('GROUP1');
console.log('フルーツ');
console.dir({'apple': 10,'orange': 5});
console.groupEnd('GROUP1');

console.group('First group');
console.log('a');
console.log('b');
console.log('c');
console.groupEnd();
console.group('Second group');
console.log('1');
console.log('2');
console.log('3');
console.group('Embeded subgroup');
console.log('α');
console.log('β');
console.log('γ');
console.groupEnd(); // For the "Embeded subgroup" 
console.groupEnd(); // For the "Second group"
```


####traceする

```js:javascript
function parentFunc() {
    function childFunc() {
        function targetFunc() {		
            console.trace();
        }
        targetFunc();
    }
    childFunc();
} 
parentFunc();
```

####経過時間を計測する

```js:javascript
function workFunc() {
    var ret = 0;
    for (var i = 0; i < 999; i++) {
        ret += i;
    }
 
    console.log(ret);
}
 
console.time('Time'); 
workFunc();
console.timeEnd('Time');
```
Pydub を使って、WAVファイルの合成をしてみた。


## 

Pydub (http://pydub.com/) とかいう音楽データを簡単に操作できるライブラリを見つけたので、
WAVファイルを合成して遊んでみた。

ffmpeg か avconv を入れつつ、 pip install pydub でインストール。

ソースコードはこんな感じ

```Python
#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-

from pydub import AudioSegment

sound1 = AudioSegment.from_wav("path to wav file 1")
sound2 = AudioSegment.from_wav("path to wav file 2")
sound3 = AudioSegment.from_wav("path to wav file 3")

combined_sounds = sound1 + sound2 + sound3
combined_sounds.export("path to save path/combined_sounds.wav", format="wav")

```
sublimetext2で良く使うショートカット(win)

# よく使うけどすぐ忘れるショートカット
忘れても調べ直さなくていいように残しておきます。
記憶が怪しくなってきたら増えていきます。

## 検索
|目的|コマンド|パッケージ|
|:-:|:-:|:-:|
|ファイル名で検索|Ctrl + P|
|grep|Ctrl + Shift + F|

## 移動
|目的|コマンド|パッケージ|
|:-:|:-:|:-:|
|定義元へ移動|Ctrl + T, Ctrl + T|CTags|
|呼出先へ戻る|Ctrl + R, Ctrl + R|CTags|
Protractorでスクロール関連のテスト



AngularJSのE2Eテストフレームワーク、Protractorをつかって、ウィンドウのスクロール位置や、要素の位置とかを取得する方法です。

# **ウィンドウのスクロール量を取得**

jQueryでいう、<a href="http://semooh.jp/jquery/api/css/scrollTop/_/" target="_blank">scrollTop()</a>を取得したい場合です。

<a href="http://angular.github.io/protractor/#/api?view=webdriver.WebDriver.Window.prototype.getPosition" target="_blank">getPosition()</a>というメソッドを最初使ったのですが、これはウィンドウそのものの位置で、スクロール位置ではないようなので注意です。

結果として以下の様なコードを書きました。<a href="http://angular.github.io/protractor/#/api?view=webdriver.WebDriver.prototype.executeScript" target="_blank">executeScript</a>でJavascriptを実行、終了したら値をとっているだけです。これについてはもっとよい方法があるような。

```coffeescript:script.coffee
browser.executeScript('return document.body.scrollTop;').then (scrollTop) ->
    window_scroll_position = scrollTop
```

* <a href="http://angular.github.io/protractor/#/api?view=webdriver.WebDriver.Window.prototype.getPosition" target="_blank">webdriver.WebDriver.Window.getPosition - Protractor</a>
* <a href="http://stackoverflow.com/questions/26434865/testing-window-body-scrolltop-in-protractor" target="_blank">Testing window.body.scrollTop in protractor - Stack Overflow</a>

# **要素の位置を取得**

要素の位置を取得するには以下のようにします。

```coffeescript:script.coffee

element.all(By.css(".someclass")).getLocation().then (someclass_data) ->
    someclass_position_y = someclass_data[0].y
    someclass_position_x = someclass_data[0].x
```

getLocation()というメソッドを使って取得可能です。位置を取得するのを待つために`then`を使います。

* <a href="http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.getLocation" target="_blank">webdriver.WebElement.getLocation - Protractor</a>
* <a href="http://stackoverflow.com/questions/23084537/webdriver-getlocation-in-protractor" target="_blank">WebDriver getLocation in protractor - Stack Overflow</a>
Promises in AngularJS

#Promises in AngularJS

## Promises
Promises(約束) are objects which were proposed by ECMAScript 6. Their purpose is to run **asynchronous operations**. For example, if the part of a code needs a certain resource, it could load it in a promise, and resume the execution of this part of the code once the loading has completed. A promise can have three states:

* :speech_balloon: **Pending:** The promise is still executing.
* :o: **Fulfilled:** The promise has successfully completed.
* :x: **Rejected:** The promise has completed with an error.

## Implementation: The $q service
In AngularJS, promises are created using a service named **$q**. It is based on [Q](https://github.com/kriskowal/q), an independant JavaScript library.

### Example
Let's say we have a resource which takes some time to load. Instead of waiting for the loading to finish, we're going to load it asynchronously and only display it when it is available.
JSFiddle: http://jsfiddle.net/Maerig/4kg4ht29/

#### Create the promise
```controller.js
function createLoadPromise() {
    var deferred = $q.defer();
                                   
    // Timeout to simulate the loading
    $timeout(function() {
        var resource = "Resource content";
        if(resource != null) {
            // Fulfilled: The promise has successfully completed.
            deferred.resolve(resource);               
        }
        else {
            // Rejected: The promise has completed with errors.
            deferred.reject("An error occured while loading the resource.")
        }
    }, 1000);
            
    return deferred.promise;
}
```

#### Use the promise
```controller.js
$scope.loadResource = function() {
    $scope.resource = "Loading..."
    var promise = createLoadPromise();
    promise.then(function(resource) {
        $scope.resource = resource;                   
    }, function(error) {
        $scope.resource = "";                   
        alert(error);                   
    });
}
```
VCCWでWordpressの環境を構築する


VirtualBox,Vagrantを使ってWordPressの環境を構築していきます。

# 1.VirtualBoxのインストール
[Virtualbox](https://www.virtualbox.org/ "Virtualbox")からインストールする。

#2.Vagrantのインストール
[Vagrant](http://www.vagrantup.com/ "Vagrant")からインストールできます。

#3.VCCWのインストール
####gitを使う場合
```$ git https://github.com/vccw-team/vccw.git```でインストールできます。

####Zipでインストールする場合

[VCCW.zip](https://github.com/vccw-team/vccw/archive/2.0.0.zip "VCCW")からダウンロードして展開します

#4.環境の立ち上げ
```
$ cd vccw-2.0.0 
$ vagrant up
```
すると仮想環境が立ち上がります。

#5.立ち上がった環境にブラウザでアクセスしてみる
デフォルトの状態で起動すれば、[http://wordpress.local/](http://wordpress.local/ "http://wordpress.local/")でアクセスできます。
うまくいけばWelcome to the Vagrantと表示されてれいるはずです。

#6.仮想環境を終了させる
```$ vagrant halt```で仮想環境が終了します。不安な人はVirtualBoxで確認するといいかも。

#最後に
WordPressをすごく簡単にインストールすることができました。
Vagrantfileを書き変えればホストなども変えることができるらしいです。
Vagrantを使えばローカルを汚さずに環境構築することができて、
気に入らなくなったら```$ vagrant destroy```で消せるので便利ですね。
HashMap#valuesの並び順がjdk1.8と7では異なる

HashMap#valuesの並び順がjdk1.7と1.8で異なってて軽くデグレってたのでメモ。
理由とか深くは追ってません。
そもそもHashMap#valuesに特定の並び順を期待するのは良く無いことですw

## 実行環境
MacOS X 10.9.5
JDK
1.6.0_65(Macのビルトイン)
1.7.0_71
1.8.0_25

```java:MapOrder.java
import java.util.HashMap;
import java.util.Map;

public class MapOrder {
	public static void main(String[] args) {
		putAndPrintMap(new HashMap<String, Integer>());
	}

	public static void putAndPrintMap(Map<String, Integer> map) {
		for (int i = 0; i < 5; i++) {
			map.put(Integer.toString(i), i);
		}
		for (Integer value : map.values()) {
			System.out.println(value);
		}
	}
}

```

```:結果
// jdk1.6.0_65
3
2
1
0
4
// jdk1.7.0_71
3
2
1
0
4
// jdk1.8.0_25
0
1
2
3
4
```
webで頑張っている元教え子ちゃんにおくるまとめ＃8 無料サンプルコード技術評論社


#記述の動機
専門学校でPG、Webを教え始めてもう８年。
マイナススタートの２年はあまりに短い。教えきれなかったことが多い。
頑張ってる元教え子ちゃんにむけてまとめているのですが
ついでに、公開しておきます。

#技術評論社
SE,PG,デザイナー御用達
初心者から上級者まで、幅広い。
http://gihyo.jp/book

書籍を探して。サポートページに行きましょう。
概ねサンプルコードがあります。
形式は様々です。

#注意事項
著作権を侵害してはなりません。
書籍毎に違いはあれど、購入が前提です。
サンプルを見て、「役立ちそうなら」購入して、解説をじっくり読むべし。
SESの設定方法

目的
----

AWSのSESを使ってメールを送信します。

手順
----

### プロダクションアクセスを申請

AWS Management ConsoleでSESのページにアクセスするとプロダクションアクセスについてメッセージが表示されてました。「Request Production Access」というボタンを押すと申請フォームが表示されるので利用する目的などを書き申請しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/5ac97bc6-0c2d-6cc5-e65b-0a4c754e45b1.png)

### ドメインを認証する

メールの送信元のアドレスやドメインを認証できるようです。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/672d3252-b243-bc7d-1807-ecb8dfcd259a.png)

今回はドメインの認証を行いました。「Verify New Domain」ボタンを押すと下記のような画面があり、自前のドメインにTXTレコードをこの内容で作ることでドメインの所持を証明してみせろという話です。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/7e92b37d-d7e6-d46f-691a-cab24c4b6e59.png)

Route53で運営していたので、下記のように書き換えました（ほとんどモザイクだらけですが）。ちなみにTXTレコードの値はダブルコーテーションで囲ってないとエラーになるはずです。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/1525fcab-f4ea-2fa0-4907-f30797e35842.png)

ちなみにEmailAddressの認証のほうがラクです。メールアドレスを入れて送信し、受信したら本文のリンクを踏むだけ。メールアドレスの数があまりないようで増えることもないのであればこちらのほうがよいですね。この検証が通るとverifiedにステータスが変わります。

### クレデンシャルを作成

DashboardのところにSMTPの設定などが書いてあります。そしてメールを送信するにはクレデンシャルが必要なのでこれを作ります。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/b3e3ea5b-b91c-7ee0-e920-c740a8dcf058.png)

ユーザ名とパスワードはなくさないようにしましょう。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/b4a8045a-50b9-282a-dba2-9a16f8efae4b.png)

### メールを送信してみる（CakePHP2）

こんな感じで送信できました。プロダクションアクセスが可能になるまでverifiedになっているメールアドレスにしかメールできないようです。

```php:Config/email.php
	public $admin = array(
			'transport' => 'Smtp',
			'from' => 'admin@example.com',
			'host' => 'email-smtp.us-west-2.amazonaws.com',
			'port' => 587,
			'username' => SMTP_USER,
			'password' => SMTP_PASSWORD,
			'tls' => true
	);
```

```php:View/Emails/text/sample.ctp
<?php

登録ありがとうございます。
<?php echo $content; ?>

```

```php:sample.ctp
			App::uses('CakeEmail', 'Network/Email');
			$email = new CakeEmail('admin');
			
			$email->to('takayukii@example.com');
			$email->subject('登録完了のお知らせ');
			$email->template('sample');
			$email->emailFormat('text');
			$email->viewVars(array('content' => 'hogehoge'));
			
			if ($email->send()) {
				$this->log('メール送信に成功しました', LOG_DEBUG);
			}else{
				$this->log('メール送信に失敗しました');
			}
```
Rubyを勉強する

この記事には[Project Euler](http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler)の解答のコードが記載されておりますので、
気になる方は閲覧しないことをお勧めいたします。

[Project Euler](http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler)をRubyで書いてみようと挑戦し、答え合わせの際に見つけた解答例とその疑問点を考える。

# Problem 2

> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.


# 解答例

```rb:解答
class Fibo
    class << self
        include Enumerable

        def each
            return to_enum unless block_given?
            a = 0; b = 1
            loop do
                a, b = b, a + b
                yield a
            end
        end

    end
end

puts Fibo
    .take_while {|i|i < 4000000}
    .select(&:even?)
    .reduce(:+)

```

[こちら](http://stackoverflow.com/questions/3029392/more-ruby-way-of-doing-project-euler-2)で発見しました。

その際にいくつかわからないことがあったので忘れないようメモ。

## `class << self`

詳しい解説は[こちら](http://magazine.rubyist.net/?0046-SingletonClassForBeginners)で拝見しましたが、

> 特異クラス方式では、class << self と書いた行から end までの間に def class_method のようにクラス名を書かずにインスタンスメソッドと同じようなメソッド定義を書いていきます。この間に書いたものはクラスメソッドとして定義されます。

とのこと。

すごく軽い理解としては、クラス名を省略してメソッド定義を出来る空間のようで、本来であれば（おそらく）

```rb:
def Fibo.each
```

とするべきところを、

```rb:
def each
```

と省略できているということのようです。

## `return to_enum unless block_given?`

分かっていない。要学習。

## 消えた`each`

```rb:
Fibo.each.take_while
```

となるべき`each`が消えているのは、`include Enumerable`で`Enumerable`がインクルードされており、
その際[こちら](http://docs.ruby-lang.org/ja/2.0.0/class/Enumerable.html)にもあるように

> このモジュールの メソッドは全て each を用いて定義されているので、インクルード するクラスには each が定義されていなければなりません。

`each`が必須であることに起因するかと思われる。

それともクラスの中に単一メソッドしかないから？

こちらも早めに調べる。

## 謎の`&:even?`

[こちら](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fcall.html#block)にあるように、

> to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます。デフォルトで Proc、Method オブジェ クトは共に to_proc メソッドを持ちます。to_proc はメソッド呼び出し時に実 行され、Proc オブジェクトを返すことが期待されます。

とのこと。