OmniAICreator/Qiita-1.07M huggingface dataset:
ファイル名が特定のパターンにマッチする spec を実行するスクリプト


ほぼ `find | grep $@ | xargs rspec` してるだけ。簡単だけど便利。

```sh
#!/bin/sh
specs=$(find spec -type f -name "*_spec.rb" | grep $@)
if [ $? -ne 0 ]
then
  echo "spec not found"
  exit 1
fi
echo $specs
rspec $specs
```

`fspec` という名前でバスの通ったとこに置いてる。

```sh
$ fspec user
spec/controllers/users_controller_spec.rb spec/models/user_spec.rb spec/routing/user_routing_spec.rb spec/views/users/edit.html.haml_spec.rb spec/views1/users/index.html.haml_spec.rb spec/views1/users/new.html.haml_spec.rb spec/views1/users/show.html.haml_spec.rb
.....
```


引数はそのまま grep に渡るので `-E` つければ拡張正規表現も使える。
Railsでパッケージ管理にBowerを使用する（Heroku編）


gitの管理下にbower_components以下を入れないので、Heroku上でbower installする必要がある。

heroku-buildpack-multi
https://github.com/ddollar/heroku-buildpack-multi

```
heroku create App
```

```
heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
```

`Rails.root`に.buildpacksを作って

```
https://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-ruby.git
```

タグも追加した方が多分無難

```
https://github.com/heroku/heroku-buildpack-nodejs.git#v60
https://github.com/heroku/heroku-buildpack-ruby.git#v128
```

同じく`Rails.root`にpackage.jsonを作ってnpmのインストール設定をする。

```
{
  "name": "App",
  "version": "0.0.0",
  "homepage": "xxx",
  "authors": [
    "xxx"
  ],
  "version": "0.0.0",
  "scripts": {
    "postinstall": "bower cache clean && bower install"
  },
  "license": "MIT",
  "dependencies": {
    "bower": "^1.3.12"
  },
  "engines": {
    "node": "0.10.x"
  }
}
```

```
git add . && git commit -m "heroku multi-buildpack"
```

で

```
git push heroku master
```

travis-ciの設定はまた今度…
【個人メモ】Bookmarkletを使って新しいバージョンのjQueryをOverrideしたい

# 動機

Bookmarkletを作りたいときに、すでに用意されている既存サイトで
ロードされちゃってる古いjQueryを新しいVersionにoverrideしたい。

[$.parseHTML](http://api.jquery.com/jquery.parsehtml/)が使えない環境とかと遭遇したのでメモしとく。
($.parseHTMLはjQuery 1.8から利用できる...)

## 動作確認環境

- Mac OS X 10.10
- Google Chrome Version 38.0.2125.111

# 古いjQueryライブラリがロードされている状態

1.11.1をロードしている状態だとする

```html
<!DOCTYPE html>
<html>
  <head>
  <script src='http://code.jquery.com/jquery-1.11.1.min.js'></script>
  </head>
  <body>
    <div>
      <script type="text/javascript">
        console.log('jQuery version is: ' + $.fn.jquery);
      </script>
    </div>
  </body>
</html>
```

console.logの出力結果は、1.11.1となっている

![Screen Shot 2014-11-05 at 14.46.51.png](https://qiita-image-store.s3.amazonaws.com/0/3985/7d4c3599-f011-cf59-ed59-9bcd76537646.png)

# 新しいバージョンのjQueryをロードしたい！

って場合は上書きするわけだけど、
まあ$を無効にしなければいけないから、
**$.noConflict()**を実行する。

例としてBookmarkletで上書きしたい場合を示す

## 以下のBookmarkletを用意する

```js
(function() {
  function getJQueryVersion() {
    console.log('$.fn.jquery : ' + $.fn.jquery);
  }

  var jq = document.createElement('script');
  jq.src = 'http://code.jquery.com/jquery-2.1.1.min.js';
  jq.onload = getJQueryVersion;
  console.log('jQuery.fn.jquery : ' + jQuery.fn.jquery);
  $.noConflict();
  document.body.appendChild(jq);
})();
```

minifyしたものを用意する

```js
((function(){function e(){console.log("$.fn.jquery version: "+$.fn.jquery)}var t=document.createElement("script");t.src="http://code.jquery.com/jquery-2.1.1.min.js";t.onload=e;console.log(jQuery.fn.jquery);$.noConflict();document.body.appendChild(t)})());
```

## Bookmarkletとして、ブックマークに追加する

ChromeのBookmarkmanager(**chrome://bookmarks/**)で登録する

```js
javascript:(function(){function e(){console.log("$.fn.jquery version: ");console.log($.fn.jquery)}var t=document.createElement("script");t.src="http://code.jquery.com/jquery-2.1.1.min.js";t.onload=e;console.log(jQuery.fn.jquery);$.noConflict();document.body.appendChild(t)})()
```

## 実行してみる

![Screen Shot 2014-11-05 at 15.23.19.png](https://qiita-image-store.s3.amazonaws.com/0/3985/80fd9f9b-63c2-c96a-c99b-41b251910ac1.png)

**$**が新しいバージョンのものに上書きされたことがわかった。

# Bookmarkletで新しいjQueryバージョンのものを使いたい場合

1. DOMとして突っ込む
2. $.noConflict(); を呼び出す
3. document.createElemnet('script').onloadに、jQueryリソースロード後のフック関数を用意しておく

こんな感じだろうか。
Intel EdisonのBluetoothを有効化する

Intel EdisonのBluetoothは、出荷時は無効化されているため、使用するには有効化する必要があります。

# ファームウェアのバージョン

Intel EdisonはファームウェアのバージョンによってBluetoothの有効化の方法が異なるようです。（詳細は未確認）
本記事の対象バージョンは以下の通りです。

```
root# uname -a
Linux edison 3.10.17-poky-edison+ #1 SMP PREEMPT Tue Oct 14 15:19:49 CEST 2014 i686 GNU/Linux
root# cat /etc/version
edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
```

# Bluetoothのrfkill状態を確認する

出荷時は`bluetooth`が`Soft blocked: yes`となっています。

```
root# rfkill list
0: phy0: wlan
        Soft blocked: no
        Hard blocked: no
1: brcmfmac-wifi: wlan
        Soft blocked: no
        Hard blocked: no
2: bcm43xx Bluetooth: bluetooth
        Soft blocked: yes
        Hard blocked: no
```

# Bluetoothを有効にする

`rfkill unblock bluetooth`することでブロックを解除できます。

```
root# rfkill unblock bluetooth
root# rfkill list
0: phy0: wlan
        Soft blocked: no
        Hard blocked: no
1: brcmfmac-wifi: wlan
        Soft blocked: no
        Hard blocked: no
2: bcm43xx Bluetooth: bluetooth
        Soft blocked: no
        Hard blocked: no
4: hci0: bluetooth
        Soft blocked: no
        Hard blocked: no
```

# Bluetoothの状態を確認する

`hciconfig`コマンドなどでBluetoothの状態を確認することができます。
（BD Addressはマスクしています）

```
root# hciconfig
hci0:   Type: BR/EDR  Bus: UART
        BD Address: XX:XX:XX:XX:XX:XX  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING PSCAN
        RX bytes:633 acl:0 sco:0 events:34 errors:0
        TX bytes:968 acl:0 sco:0 commands:34 errors:0
```

# 参考

- [Easy start: Intel Edison as gateway for IoT and... | Intel Communities](https://communities.intel.com/docs/DOC-23391)
- [Bluetooth not enabled? | Intel Communities](https://communities.intel.com/thread/53815)
- [EdisonのBluetooth開発 — Edison-Note 1.3 documentation](http://nonnoise.github.io/Edison/bluetooth.html)

# 2015年1月9日追記: 公式ガイド

2014年12月19日に、Intelより公式のBluetoothガイドが公開されました。とても参考になります。

[Intel Edison Bluetooth Guide](https://communities.intel.com/docs/DOC-23618)
CakePHP2.xのVendorファイルの読み込みに使うusesとimportの使い分け

# usesとimportの違い
結論から言うと、ロードするライブラリがオートロードの規約に従っているかどうかで使い分ける。

規約に従っている → App::uses()を使う。
規約に従っていない → App::import()を使う。

## 基本的にApp::import()を使う。
基本的に多くのVendorの読み込みにはApp::import()を使うのが吉。ほとんどのライブラリはCakePHPの規約に従って作られていないから。
[CakePHP2.0規約](http://book.cakephp.org/2.0/ja/getting-started/cakephp-conventions.html#file-and-classname-conventions)

> ベンダーのローディングは通常、規則に従わないパッケージのローディングを意味します。 多くのベンダーのパッケージに対しては App::import() の使用が推奨されます。
[CakePHP2.0の公式ドキュメント](http://book.cakephp.org/2.0/ja/core-utility-libraries/app.html)

## App::uses()を使うとパフォーマンス向上。

App::uses()は遅延ロードで、オートローダーがクラスの読み込みを管理して、クラスが使われない場合はロードしないように制御するのでパフォーマンスが向上する。但し、そのためにはファイルの作りがオートローダで制御するためのルールに従ってある必要がある。



# App::uses()の使い方

```php:
// app/Vendor/Hoge.php内のHogeクラスをロードする。
App::uses('Hoge', 'Vendor');
```

## サブディレクトリがある場合
サブディレクトリ内のクラスをロードするには、それらのパスを App::build() で追加する必要がある。

```php:
// app/Vendor/SomePackage/ClassInSomePackage.php 内の ClassInSomePackage クラスをロードする
App::build(array('Vendor' => array(APP . 'Vendor' . DS . 'SomePackage')));
App::uses('ClassInSomePackage', 'Vendor');
```

> ベンダーのファイルは、規則に従っていなかったり、ファイル名と異なるクラスを持っていたり、クラスを含んでないかもしれません。 それらのファイルは App::import() を使用して読み込むことができます。 次の例では、いくつかのパス構造からベンダーファイルをロードする方法を示しています。 これらのベンダーファイルは、ベンダーのフォルダのいずれかに配置することができます。
[CakePHP2.0公式ドキュメント](http://book.cakephp.org/2.0/ja/core-utility-libraries/app.html#vendor)

# App::import()の使い方

```php:
// app/Vendor/hoge.phpをロードする
App::import('Vendor', 'hoge');
```
※ この場合hogeは小文字である必要がある。

## サブディレクトリがある場合

```php:
// app/Vendor/hoge/fuga.phpをロードする。
App::import('Vendor', 'hoge/fuga');
```


## ファイル名にドットが含まれる場合

```php:
// app/Vendor/hoge.fuga.phpをロードする。
App::import('Vendor', 'HogeFuga', array('file' => 'hoge.fuga.php'));
```

## サブディレクトリがあってファイル名にドットが含まれる場合
```php:
// app/Vendor/piyo/hoge.fuga.phpをロードする。
App::import('Vendor', 'HogeFuga', array('file' => 'piyo'. DS . 'hoge.fuga.php'));
```

## プラグインの中のVendorファイルを読み込む場合
```php:
// app/Plugin/Awesome/Vendor/services/well.named.php をロードする。
App::import('Vendor', 'Awesome.WellNamed', array('file' => 'services' . DS . 'well.named.php'));
```


# 注意点
usesとimportで引数の順番が逆になっている点に注意する。
文字列からURLを抽出する方法


簡単な正規表現を用いてURLを抽出するメモ

## 抽出


```objc

- (NSArray *)pickUpURLFromString:(NSString *)string {

    //--------------------------------------------------------------------------------
    // 検索
    //--------------------------------------------------------------------------------

    // 文字列抽出用の正規表現オブジェクトを生成する
    NSError *error = nil;
    NSString *URLPattern = @"(http://|https://){1}[\\w\\.\\-/:]+";
    NSRegularExpression *regularExpressionForPickOut = [NSRegularExpression regularExpressionWithPattern:URLPattern options:0 error:&error];
    
    // 検索対象の文字列の中から正規表現にマッチした件数分の結果を取得
    NSArray *matchesInString = [regularExpressionForPickOut matchesInString:string options:0 range:NSMakeRange(0, string.length)];
    
    // 検索結果を配列に入れる
    NSMutableArray *strings = [NSMutableArray array];
    for (int i=0 ; i<matchesInString.count ; i++) {
        NSTextCheckingResult *checkingResult = matchesInString[i];
        NSString *expressionPattern = [string substringWithRange:[checkingResult rangeAtIndex:0]];
        [strings addObject:expressionPattern];
    }
    return strings;
}

```

## 置換
```objc

- (NSString *)replaceString:(NSString *)string fromURLs:(NSArray *)urls toTemplate:(NSString *)template{
    NSError *error;
    NSString *expressionPattern = [urls componentsJoinedByString:@"|"];
    // 配列から変換対象の正規表現パターンが完成したら、それを元にNSRegularExpressionを作成する
    NSRegularExpression *regularExpressionForReplace = [NSRegularExpression regularExpressionWithPattern:expressionPattern options:0 error:&error];
    
    // 置換対象の文字列すべてをテンプレートに従ってに置換していく
    NSString *replacedString = [regularExpressionForReplace stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0,string.length) withTemplate:template];
    return replacedString;
    
}

```

## 使い方
```objc:ViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *string = @"http://qiita.com/ と　http://www.google.com";
    NSArray *urls = [self pickUpURLFromString:string];
    NSString *replacedText = [self replaceString:string fromURLs:urls toTemplate:@"<ここURLでした>"];
    NSLog(@"before : %@",string);
    NSLog(@"hit urls : %@",urls);
    NSLog(@"after  : %@",replacedText);

}
```

### 結果
```console
 before : http://qiita.com/ と　http://www.google.com
 hit urls : (
    "http://qiita.com/",
    "http://www.google.com"
)
 after  : <ここURLでした> と　<ここURLでした>

```
w3m の keybind を完全には變へられなかつた話

w3m の keybind を變へるために，次のやうに設定を書いた：

```.w3m/keymap
keymap C-d MOVE_LEFT
keymap C-h MOVE_DOWN
keymap C-t MOVE_UP
keymap C-n MOVE_RIGHT
keymap < BEGIN
keymap > END
```

これで， Dvorak の home position から手を動かさずに cursor を移動できるやうになつた．

しかし， Google の檢索欄等の1行入力では keybind が變はらない．これは困つた．

少し調べると， readline の keybind は .inputrc で設定できるとあつたので， .inputrc を書いてみた．しかし w3m には影響しない．w3m を install し直せばなんとかなるだらうかと思ひ，

$ sudo apt-get remove w3m
$ sudo apt-get install w3m

としてみたが，やはり駄目である．
CapybaraのJSテストがrandom failする 

[Rspec][]/[Capybara][] で [poltergeist][] や [capybara-webkit][] を使ってJavascriptを含めたテストを行っている場合にランダムにテストが失敗することがある。(Random fail)

###主な原因の一つは

テストの実行中にAjaxを発生させてAjaxが完了する前にテストが終了し次のテストが同じDBを参照しようとした時に起こる。

### この問題の一つの解決策は

Ajaxが終了していることをテストの最後に確認すること。
[THOUGHTBOT, INC.][] の記事に一つの解決策を紹介している。

http://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara



ソースコードはこちら

```rb
# spec/support/wait_for_ajax.rb
module WaitForAjax
  def wait_for_ajax
    Timeout.timeout(Capybara.default_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

  def finished_all_ajax_requests?
    page.evaluate_script('jQuery.active').zero?
  end
end

RSpec.configure do |config|
  config.include WaitForAjax, type: :feature
end
```

それに加えて以下の行を追加した。

```diff
RSpec.configure do |config|
  config.include WaitForAjax, type: :feature
+  config.after(:each, js: :true) { wait_for_ajax }
end

```

`js: true`を指定している各specの終了後にAjaxが終了していることを確認する。
上記を追加することで最低限、spec間のコネクションの張りっぱなしによるDBエラーの問題は解決出来る。
`jQuery.active` で実行中のAjaxの数を取得することが出来る。Documentにはあまり大きくかかれてないmethodらしい。

#### 各行でajaxを待ちたい時は
* `wait_for_ajax` をspecの中で呼ぶ


これでJavascriptが原因で起こるほとんどのrandom failを解決できた。


[Rspec]:https://github.com/rspec/rspec
[Capybara]:https://github.com/jnicklas/capybara
[poltergeist]:https://github.com/teampoltergeist/poltergeist
[capybara-webkit]:https://github.com/thoughtbot/capybara-webkit
[THOUGHTBOT, INC.]:http://thoughtbot.com
Intel Edisonにopkgを使ってRubyをインストールする

Intel Edisonにパッケージを使ってRubyをインストールしました。

インストールしたIntel Edisonのバージョンなどは以下の通り。

```
root# uname -a
Linux edison 3.10.17-poky-edison+ #1 SMP PREEMPT Tue Oct 14 15:19:49 CEST 2014 i686 GNU/Linux
root# cat /etc/version
edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
```

# opkgリポジトリの設定

`/etc/opkg/base-feeds.conf`ファイル、`/etc/opkg/intel-iotdk.conf`ファイルを編集してopkgのリポジトリを設定します。

```
root# vi /etc/opkg/base-feeds.conf
root# cat /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

root# vi /etc/opkg/intel-iotdk.conf
root# cat /etc/opkg/intel-iotdk.conf
src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src intel-all http://iotdk.intel.com/repos/1.1/iotdk/all
src intel-i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src intel-x86 http://iotdk.intel.com/repos/1.1/iotdk/x86
```

参考： [スタートアップ Intel Edison - Qiita](http://qiita.com/yoneken/items/1b24f0dd8ae00579a0c2)

# インストール済みパッケージの更新

```
root# opkg update
root# opkg upgrade
```

# Rubyのインストール

`opkg install ruby`であっさりインストールできます。執筆時点のバージョンは「2.1.4p265」でした。

```
root# opkg update
root# opkg install ruby
root# ruby -v
ruby 2.1.4p265 (2014-10-27 revision 48166) [i386-linux-gnu]
```
Nodeの導入が上手くいかない


##はじめに
みなさんこんにちは。
昔にちょっとかじった`Titanium`を再び始めようと思い勉強会に参加することにしました。しかし、`TitaniumStudio`が古すぎたのでアップデートしようとしたら`Node`無いよと怒られハマりました。
ということで、`Node`の導入時のエラーについて紹介したいと思います。

##npmの確認
まず`Node`のパッケージ管理ツール`npm`が導入されているかチェック。（念のため入っているかどうかしてみた）

```bash:bash
$ npm -v
-bash: npm: command not found
```

はい、ありません笑
まず`brew`で`npm`の導入をやってみました。

```bash:bash
$ brew install npm
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/node-0.10.32.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring node-0.10.32.mavericks.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/node
Target /usr/local/bin/node
already exists. You may want to remove it:
  rm /usr/local/bin/node

To force the link and overwrite all conflicting files:
  brew link --overwrite node

To list all files that would be deleted:
  brew link --overwrite --dry-run node

Possible conflicting files are:
/usr/local/bin/node
/usr/local/include/node/ares.h
/usr/local/include/node/ares_version.h
/usr/local/include/node/node.h
/usr/local/include/node/node_buffer.h
/usr/local/include/node/node_object_wrap.h
/usr/local/include/node/node_version.h
/usr/local/include/node/uv-private/ngx-queue.h
/usr/local/include/node/uv-private/tree.h
/usr/local/include/node/uv-private/uv-unix.h
/usr/local/include/node/uv-private/uv-win.h
/usr/local/include/node/uv.h
/usr/local/include/node/v8-debug.h
/usr/local/include/node/v8-preparser.h
/usr/local/include/node/v8-profiler.h
/usr/local/include/node/v8-testing.h
/usr/local/include/node/v8.h
/usr/local/include/node/v8stdint.h
/usr/local/share/man/man1/node.1
/usr/local/lib/dtrace/node.d
Warning: The post-install step did not complete successfully
You can try again using `brew postinstall node`
==> Summary
?  /usr/local/Cellar/node/0.10.32: 1678 files, 19M
```

こんな感じでエラーが出てしまいました。
`Node`を入れてみようとしてもこの通り。

```bash:bash
$ brew postinstall node
Error: Permission denied - /usr/local/lib/node_modules/npm/AUTHORS
```

エラー文にある`brew link`のコマンドを実行してみましたが結局ダメでした。

##原因...？
おそらく原因は余計なファイルがあったことと、ディレクトリのアクセス権限が無かったことだと思います。一部ごちゃごちゃしてしまったのではっきりとはわからずですが汗

##解決方法
最終的にはエラー文に載ってる`Node`関連ファイルを`rm`で消しました(`/usr/local/include/node`とか)。力技です。
一部は所有者を変更しました。例としてはこんな感じ。

```bash:bash
$ sudo chown -R user:group /usr/local/lib/node_modules
```

最後はroot権限で`brew`すればokです。

```bash:bash
$ sudo brew postinstall node
```

これで無事`Node`が入りました。

```bash:bash
$ node -v
v0.10.32
```

##おわりに
時間がかかってしまいましたが`Node`の導入が出来ました。
そして...本題の`TitaniumStudio`のアップデートも出来ましたw
`TitaniumStudio`の導入がもっと簡単になるといいですね。
今回は以下の記事を参考にさせて頂ました。ありがとうございます。
>brewでnode.jsをインストールするのがつらかった
>http://www.misakit.com/post/92519432276/brew-node-js
slab肥大化とdentry_cacheに辿り着くまでの話


#内容（3行）

* memoryの使用量を監視している所からアラートが来て調査した
* アプリケーションのheap使用率は高くなく、top等を見ても他に怪しいプロセスが存在しない
* /proc/meminfoからslab領域の肥大を確認、slabtopでdentry_cacheが肥大化している事がわかったので、echo 2 > /proc/sys/vm/drop_caches を実施した

---

# 何があったのか

運用中のとあるサーバーのmemoryが残り20%を切ったとアラートが来たため、調査を行った。
当初は何かしらのプロセスがメモリリークしているか何かだろうとあたりをつけていた。

---

## freeで現状確認

キャプチャとるの忘れた…
が、一旦確かにfree（buffers, cahceを足したもの）がtotalの20%を切っていることを確認。

---

## topで確認する

![スクリーンショット 2014-11-04 13.19.07.png](https://qiita-image-store.s3.amazonaws.com/0/9140/e9968bd8-793a-ddb8-b3d1-f5409365e4aa.png "スクリーンショット 2014-11-04 13.19.07.png")
アプリケーションプロセスにメモリを大量消費しているプロセスは無い。

---

## /proc/meminfoを確認

![スクリーンショット 2014-11-04 13.24.50.png](https://qiita-image-store.s3.amazonaws.com/0/9140/788381fc-79ce-92d9-3df8-998b21eeb564.png "スクリーンショット 2014-11-04 13.24.50.png")

同スペック、同系統のアプリケーションが稼働しているサーバーと比較したところ、Slabの項目が消費しているメモリが大きいことが判明。

---

## slabtopで内容を確認

![スクリーンショット 2014-11-04 16.09.55.png](https://qiita-image-store.s3.amazonaws.com/0/9140/0608aa08-25de-fbea-924e-b6c2dd615f00.png "スクリーンショット 2014-11-04 16.09.55.png")

確認すると「dentry_cache」「size-64」の項目が使用量の上位を占めていることがわかる。また先程比較した同スペックの他のアプリケーションサーバーと比較しても、この項目の差異が大きいため、dentry_cacheについて調べた。

---

## dentry（cache）とは

dentry、これを機に知ったのですが、何かというとファイル名やディレクトリの階層構造、またディレクトリ名とinode情報を関連付けるもの（構造体）らしい。dentry_cacheは、それらの情報のキャッシュだと思って良さそう。
またdentry_cacheは存在しないディレクトリ情報（inodeを持たないdentry）なんかもキャッシュする（これをnegative dentryというらしい）。negative dentryは、sarコマンド（-vオプション）で確認する事ができる。

![スクリーンショット 2014-11-05 13.39.15.png](https://qiita-image-store.s3.amazonaws.com/0/9140/d2fd460d-7f2a-e52e-42d0-fac8ee6e413d.png "スクリーンショット 2014-11-05 13.39.15.png")

dentunusdがnegative dentryの数になる。
dentry_cacheについてはいくつかの記事を参考にさせていただいたが、このマシンでnegative dentryが有効に利用される用途が想定できないことから、このcacheを解放しても良いだろうと判断した。（実際には同じ名前で一時ファイルを定期的に作る処理が、実は監視の中であるのだが、同様の処理他のマシンでも実施しているため、今回の問題の最大の原因ではないと考えた）

---

## cacheの削除

これについては、詳しい記事が沢山あるのでここでは割愛。

```
echo 2 > /proc/sys/vm/drop_caches
```

上記コマンドでdentry, inodeのキャッシュを削除する。

---

## 結果

slabtop
![スクリーンショット 2014-11-05 14.18.29.png](https://qiita-image-store.s3.amazonaws.com/0/9140/8d0dfbde-e2cf-8a5a-441d-b86745576c27.png "スクリーンショット 2014-11-05 14.18.29.png")

free
![スクリーンショット 2014-11-05 14.20.14.png](https://qiita-image-store.s3.amazonaws.com/0/9140/5bd67679-a761-da24-80a0-f5cf553ab4cf.png "スクリーンショット 2014-11-05 14.20.14.png")


意図したとおり、dentry_cacheが解放され、freeの容量が増えた。

---

## 参考資料

* [ファイル名を管理するキャッシュdentry](http://monoist.atmarkit.co.jp/mn/articles/1010/06/news107.html)
* [一時ファイルとdentry cacheとメモリ](http://blog.nomadscafe.jp/2014/01/tmpfile-and-dentry-cache.html)
* [negative dentry と tmpfs で negative dentry がキャッシュされない理由について調べた](http://d.hatena.ne.jp/hiboma/20140212/1392131530)
[Node.js] Control-C をハンドリングするのに便利なツール

Control-C をハンドリングするのに便利なツール
====

npm に [control-c](https://www.npmjs.org/package/control-c) というパッケージを登録した。

例えば、以下の様な事ができる。

  + 1回の Control-C のキーインで、プログラムの状態を表示する。
  + 連続2回の Control-C のキーイン(ダブルControl-C)で、リセットとか再初期化を行う。
  + 連続3回以上の Control-C のキーイン(トリプルControl-C)で、クリーンアップして正常に終了させる。

![control-c.jpg](https://qiita-image-store.s3.amazonaws.com/0/16128/f9835ba1-06f9-b678-5724-f5a95f4b3e0a.jpeg)

## インストール:

```bash
$ npm install control-c
```

## 使い方:

```js
var ControlC = require('control-c');
```

## 例:

```js:example.js
'use strict';

var ControlC = require('control-c');

var singleCount = 0;
var doubleCount = 0;

ControlC(
  function singleControlC() { console.log('Single:', ++singleCount); },
  function doubleControlC() { console.log('Double:', ++doubleCount); },
  function tripleControlC() { console.log('Reset'); singleCount = doubleCount = 0; },
  function quadrupleControlC() { console.log('Exit'); process.nextTick(process.exit); });

console.log('press control-c in 30 seconds.');
setTimeout(function () {}, 30000);
```

## 試し方:

```bash
$ node example
```

1回のControl-Cというのは、普通にできると思う。シングルControl-Cだ。

連続2回以上のControl-Cというのは、500ミリ秒以内に続けて次のControl-Cを入力してください。
ダブルクリックならぬダブルControl-Cとか、トリプルControl-Cの様な感じ。

## あとがき

もちろん4回とか5回以上のControl-Cハンドラーも定義できるけど、指がつりそうになったり、何回押したか数えられなくなるかもしれないよ。


おしまい
chefのJSON設定覚書

`nodes/`, `roles/`, `environments/` でJSONの属性名とか微妙に違うので、公式サンプルからゆるくテンプレ化したい。
埋めるべき項目がわかんないと、結構迷うので。ということで個人用メモとして残しておきます。

## 概要

* `run_list` : 実行するレシピ
* `attributes` : レシピに適用する属性値

この2つを決めるための定義ファイルが `nodes/`, `roles/`, `environments/` から呼び出される。

* `nodes/<hostname>.json` : ホストごとの設定
* `roles/<rolename>.json` : 役割(role)別の設定。利用に際して[初心者Chefアンチパターン](http://www.creationline.com/lab/3080)を読むことをおすすめする。
* `environments/<envname>.json` : environmentの設定を書く。開発用や本番用などの環境で分けて、同じ環境内の複数のホストで共通の設定（DBの接続先など）があればここに書くと便利。

`chef_type` と `json_class` も記載したが、固定の情報ではあるので無くても動く。が、万が一rolesのテンプレからnodesにコピーしたりした時にわかりにくいので、コピペ用に書いておく。

### nodes

参考1 : https://docs.getchef.com/knife_node.html
参考2 : https://github.com/opscode/chef/blob/master/lib/chef/node.rb

```json:nodes/sample.json
{
    "name": "sample",
    "chef_type": "node",
    "json_class": "Chef::Node",
    "chef_environment" : "sample_env",
    "run_list": [
        "recipe[hoge]",
        "role[foo]"
    ],
    "default": {
    },
    "normal": {
    },
    "override": {
    },
    "automatic": {
    }
}
```

* `"chef_environment"` で `environment` が指定できる。指定がない場合は `_default` になる。
* `"automatic"` は ohai で生成されるサーバ内のデータだから基本的に書くことはない

### roles

参考1 : https://docs.getchef.com/knife_role.html
参考2 : https://github.com/opscode/chef/blob/master/lib/chef/role.rb

```json:roles/role1.json
{
    "name": "role1",
    "description": "Description for Role",
    "chef_type": "role",
    "json_class": "Chef::Role",
    "run_list": [
        "recipe[cookbook_name::recipe_name]",
        "role[role_name]"
    ],
    "default_attributes": {
    },
    "override_attributes": {
    }
}
```

* 別の `role` を参照することができるっぽい？

### environments

参考1 : https://docs.getchef.com/knife_environment.html
参考2 : https://github.com/opscode/chef/blob/master/lib/chef/environment.rb

ドキュメントの方にJSONサンプルがないでござる。

```json:environments/sample.json
{
    "name": "sample",
    "description": "サンプル環境",
    "chef_type": "environment",
    "json_class": "Chef::Environment",
    "default_attributes": {
    },
    "override_attributes": {
    },
    "cookbook_versions" : {
        "rabbitmq", "= 3.2.2"
    }
}
```

* `run_list` は書けない
* `cookbook_versions` で利用するcookbookのバージョンを指定できるらしい

### data_bags

参考 : https://docs.getchef.com/essentials_data_bags.html

ついでに `data_bags` についてメモ。これも利用に際して[初心者Chefアンチパターン](http://www.creationline.com/lab/3080)を読むことをおすすめする。

`data_bags/<data_bag_name>/<data_bag_item_name>.json` に定義を書いて、レシピの中から利用する。
利用すると言っても上記の属性値のように自動でロードされるわけではなく、Rubyコードで読みに行く。

```json:data_bags/users/hoge.json
{
    "id": "hoge",
    "password": "$1$YY0QI8p.$6zBvRUgjIBhF5Q7b26sSI1"
}
```

```rb
data_bag("users").each { |id|
  u = data_bag_item("users", id)
  user id do
    password u["password"]
  end
}
```
Rails 4で非推奨になった/なっていないfinderメソッドを整理する


## はじめに: 問題

さて、いきなり問題です。
Rails 4.0から非推奨（deprecated）になったfinderメソッドは次のうちどれでしょうか？

````ruby
User.find_by_email('foo@example.com')

User.find_by_email_and_name('foo@example.com', 'Foo Bar')

User.find_by(email: 'foo@example.com')

User.find_or_initialize_by_email('foo@example.com')
# または 
User.find_or_create_by_email('foo@example.com')

User.find_or_initialize_by(email: 'foo@example.com')
# または 
User.find_or_create_by(email: 'foo@example.com')
````

## 答え合わせ

みなさん、わかりましたか？
正解はこちらでした！

````ruby
User.find_or_initialize_by_email('foo@example.com')
# または 
User.find_or_create_by_email('foo@example.com')
````

それ以外のfinderメソッドはRails 4.0でも使えます。
というか、厳密にいうと以下のfinderメソッドはRails 4.0から新しく登場したfinderメソッドです。

````ruby
User.find_by(email: 'foo@example.com')

User.find_or_initialize_by(email: 'foo@example.com')
# または 
User.find_or_create_by(email: 'foo@example.com')
````

なので、「Rails 3時代から引き続き使えるfinderメソッド」という意味では、該当するのは以下のfinderメソッドだけになります。

````ruby
User.find_by_email('foo@example.com')

User.find_by_email_and_name('foo@example.com', 'Foo Bar')
````

## 非推奨になった/なっていないfinderメソッドを整理する

ここで上記の内容を整理してみましょう。

### Rails 4.0からは非推奨になったfinderメソッド

````ruby
User.find_or_initialize_by_email('foo@example.com')
# または 
User.find_or_create_by_email('foo@example.com')
````

### Rails 4.0でも引き続き使えるfinderメソッド

````ruby
User.find_by_email('foo@example.com')

User.find_by_email_and_name('foo@example.com', 'Foo Bar')
````

### Rails 4.0から新しく登場したfinderメソッド

````ruby
User.find_by(email: 'foo@example.com')

User.find_or_initialize_by(email: 'foo@example.com')
# または 
User.find_or_create_by(email: 'foo@example.com')
````

## 非推奨になったその他のfinderメソッド

Rails 4.0以降では `User.find_or_initialize_by_...` 以外にも非推奨になった以下のfinderメソッドがあります。

- `find_all_by_...`
- `find_last_by_...`

## 非推奨になったfinderメソッドを書き直す方法

非推奨となったfinderメソッドはそれぞれ以下のように書き直します。

````ruby
# Rails 3
User.find_or_initialize_by_email('foo@example.com')
# Rails 4 (find_or_create_by_...の場合も同様)
User.find_or_initialize_by(email: 'foo@example.com')
# または
User.where(email: 'foo@example.com').find_or_initialize 

# Rails 3
User.find_all_by_name('Foo Bar')
# Rails 4
User.where(name: 'Foo Bar')

# Rails 3
User.find_last_by_name('Foo Bar')
# Rails 4
User.where(name: 'Foo Bar').last
````

書き直す時間がない！という場合は以下のgemを使って延命処置を施すこともできます。

- [activerecord-deprecated_finders](https://github.com/rails/activerecord-deprecated_finders)

## Rails 4.1以降では警告ではなく、エラーになります

Rails 4.0で非推奨になったfinderメソッドはRails 4.1から使えなくなっています。
エラーが出た場合は新しい記法に書き直すか、[activerecord-deprecated_finders](https://github.com/rails/activerecord-deprecated_finders) gemをbundleしてください。

## まとめ

`find_by` みたいなメソッド名を見るとつい「あれ、これって非推奨じゃなかったっけ？」と記憶があやふやになることが多いので、ここで一通り情報を整理してみました。

僕と同じように「あー、どれだっけ？」と迷った場合はこの記事を参考にしてみてください。

### 参考文献

- http://guides.rubyonrails.org/4_0_release_notes.html
- http://edgeguides.rubyonrails.org/4_1_release_notes.html
- https://github.com/rails/activerecord-deprecated_finders
- http://blog.remarkablelabs.com/2012/12/what-s-new-in-active-record-rails-4-countdown-to-2013
初めてハッカソンてきなものをやってみた


はじめまして、どうでしょう藩士の[飯田](https://www.facebook.com/kosuke.iida)(セプテーニ・オリジナル)です。

先日青屋敷に討ち入りし、DVD第22弾「中米コスタリカで幻の鳥を激写する＆前枠後枠傑作選」を予約してきました。今回の副音声はどんな内容か楽しみです。

前置きはこれくらいにして、本題に入ります。
[セプテーニ・オリジナル](http://septeni-original.co.jp)初の試みとして、[PlusD](http://plus-d.co.jp/)さんと共同でハッカソンてきなものをやりました。

# 目的
- 1〜２年目エンジニアに、企画からサービスを作る経験をして欲しい
- 他社のエンジニアやプランナーと交流し、刺激を受けて欲しい

と書きましたが、「ハッカソンをやってみたい！」と思ったのがキッカケです。

# レギュレーション
- [Mashup Awards 10](http://mashupaward.jp/)に応募する
- 参加は希望制
- 業務に支障を与えない
- 途中で辞退することも有り   
※ 必ずチームで話し合って結論を出す
- とにかく楽しむ！

# スケジュール
- 開発期間：9月18日〜10月19日
- demo：10月20日
- MA10応募：10月26日

# 作品
## TwitreJ（廣幡、越、板倉）

http://twitrej0.herokuapp.com/

TwitreJ(twitter +trend + Japan)では、twitterのトレンドワードをその言葉から連想される色に変換し、日本地図を染める。

<iframe src="http://prezi.com/embed/-uce97o9th1a/?bgcolor=ffffff&amp;lock_to_path=0&amp;autoplay=0&amp;autohide_ctrls=0#" width="550" height="400" frameborder="0"></iframe>

## 出会いないかも系アプリ（[大久保](https://qiita.com/yoppe)、寺坂、堀井、寺口）

http://54.169.7.218/

地方出身の人が東京に出てきて思いがちなこと。「東京は人が多すぎて怖い」でも実は、東京にも人がいなくてゆっくり落ち着けるところもある。そんな場所を見つけてもらうことで、東京を少しでも好きになってもらえたらという思いで作ったのが「出会えない」かも系アプリ。
ユーザーの現在地の情報を取得し、人がいなさそうなカフェやバーを推測でリコメンドしてくれます。

<iframe src="http://prezi.com/embed/urqgerirs6vm/?bgcolor=ffffff&amp;lock_to_path=0&amp;autoplay=0&amp;autohide_ctrls=0#" width="550" height="400" frameborder="0"></iframe>

## 退社後秘密特訓（[本江](http://qiita.com/h0ng0yut0)、林田、梅垣、鳥羽）

「…残業続きの忙しい毎日を送ってるわネ？
退社後の予定をたてる楽しみを
見失ってるように見えるワ！そんなあなたに命令を下シマス。」

命令を絶対に破れないあなたは、今日、定時で会社を出る…

<iframe src="http://prezi.com/embed/_j5sa7jcj0jl/?bgcolor=ffffff&amp;lock_to_path=0&amp;autoplay=0&amp;autohide_ctrls=0#" width="550" height="400" frameborder="0"></iframe>

※残念ながら間に合いませんでした・・・

# 結果

TwitreJチーム優勝！

他社と連携しながら短い期間内に実装が完了したところを高く評価しました。
また、HTML5のCanvasを使ったり、Heroku環境を使い開発工数を抑えたところも評価しました。

# 全体所感
１〜２年目と若いエンジニアで構成したチームでしたが、期待を超えるアウトプットを出してくれたので、企画したかいがあったなと思いました。

また、弊社は自社サービスの開発がメインで他社エンジニアとの交流はないのでとてもいい刺激になったのではと思ってます。

これをキッカケにいろいろなハッカソンに参加して実力をつけてもらえたらいいなと個人的には思ってます！

# 次回開催に向けて

Startup Weekend Tokyoなどのハッカソンも2日間と短期集中が主流なので、次回は企画をもう少し練って2泊3日の合宿という形で実施できるよう密かに準備を進めてます。

- 候補地
沖縄一番人気！目の前はオーシャンビュー10秒でビーチ！超高速ネットあり  
https://www.airbnb.jp/rooms/1023079?s=Myn9

一緒に実施したいという企業がありました[飯田](https://www.facebook.com/kosuke.iida)までFacebookメッセージして下さい。
builderでHTMLをescapseしないようにする


Rails4でxmlを出力しようとする場合は、builderを使うのがスタンダードだと思います。builderでHTML文字を出力するとescapseされてしまいます。escapeしないようにする場合に以下のようにします。

```ruby:app/views/users/index.xml.builder
xml.name do
  xml << '<h1>hello world</h1>'
end
```

[参考サイト](http://stackoverflow.com/questions/2693036/how-to-tell-builder-to-not-to-escape-values)
iPhone 6 Plusでは高速スワイプが２点タップと誤認される事がある


・・・かもしれない、というお話。

自作のおえかきアプリをiPhone 6 Plusで動作確認している最中、どうも「１本指でスワイプしているだけなのに２点タップ時の機能（＝スクロール）が発動してしまう」・・・という現象を何度か目撃していたのですが、気のせいではないようなので、ちょこっと検証してみた結果を報告いたします。

## 検証方法

シングルビュープロジェクトで新規作成、ビューをマルチタッチにして、touchesBeganでは赤、touchesEndedでは青の四角を画面に出してみます。またログにも座標やタッチイベントの情報を出力します。

これをiPhone実機にて実行し、一筆書きのように高速に画面をスワイプしまくります。

* Xcode 6.1
* iPhone 6 Plus
* iOS 8.1

```objc:検証用のコード
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor yellowColor];
    self.view.multipleTouchEnabled = YES;
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self touches:touches color:[UIColor redColor] text:@"touchesBegan"];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self touches:touches color:[UIColor blueColor] text:@"touchesEnded"];
}

- (void)touches:(NSSet *)touches color:(UIColor *)color text:(NSString *)text {
    for (UITouch *t in touches) {
        UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 6, 6)];
        v.center = [t locationInView:self.view];
        v.backgroundColor = color;
        v.userInteractionEnabled = NO;
        [self.view addSubview:v];
        NSLog(@"%@ %p %@", text, t, NSStringFromCGPoint([t locationInView:self.view]));
    }
}

@end
```

## 結果

![swipe.png](https://qiita-image-store.s3.amazonaws.com/0/31347/b15f4181-0897-b39b-234f-bdb5f4c16510.png "swipe.png")

本来であれば赤と青が一つずつのはずなのですが、いくつか余計なイベントが検出されています。

このスクショとは関係ないタイミングで記録したログですが、

```text:
2014-11-05 11:07:20.588 TouchTest6[13234:1541357] touchesBegan 0x170180d00 {96, 231.33332824707031}
2014-11-05 11:08:06.349 TouchTest6[13234:1541357] touchesBegan 0x170181c70 {100, 563.33331298828125}
2014-11-05 11:08:06.350 TouchTest6[13234:1541357] touchesEnded 0x170180d00 {184.33332824707031, 344.66665649414062}
2014-11-05 11:08:07.712 TouchTest6[13234:1541357] touchesBegan 0x174181040 {232, 291.33334350585938}
2014-11-05 11:08:07.713 TouchTest6[13234:1541357] touchesEnded 0x170181c70 {221.33332824707031, 308.66665649414062}
2014-11-05 11:08:26.130 TouchTest6[13234:1541357] touchesEnded 0x174181040 {323, 229.33332824707031}
```

beganが二回連続で検出されている事がわかります。
スワイプしているだけで２点タップになってしまっています。

## 補足情報

* 検証に使用した私物のiPhone 6 Plusには格安保護フィルムが貼ってあるため、その影響が無いとは言いきれません（うまく貼れたので剥がしたくはない・・・）。
* iPhone 6 Plusですが、初期不良で一度交換しています。交換前の機種でも同様の症状が見られたため、個体差や不良の可能性は低いと考えています（ただ、格安保護フィルムは同じ物を貼っていたのでそちらの影響の可能性が逆に上がってしまうのかな(^_^;）
* 一応駄目元でAppleへはバグレポートを提出済みです。
* keynoteなどの純正アプリでも、１本高速スワイプで２点タップ時の機能が発動する事があることを確認しています。

## どうしよう？

今のところこの件が話題になっているような情報は見つけていませんが、もし同様の症状に遭われた方、その他情報をお持ちの方がいらっしゃいましたらコメントなど頂ければ幸いです。
EC2インスタンスからAMIを作成する[SDK for Java]

#はじめに
EC2のインスタンスからAMIを作成します。

#概要
ManagementConsoleから、インスタンスを選択してCreateImageをすることでAMIを作成することができます。

この時あわせてsnapshotも作成されます。マシンイメージを取得する前にインスタンスはrebootしますのでご注意ください。

ManagementConsoleでは、「NoReboot」にチェックすることでRebootしないで取得することは可能ですが、作成プロセス中に一貫した状態が保てない可能性があります。

ちなみにSDK for JavaではCreateImageRequestでnorebootを設定することで実現できます。
<pre>
		CreateImageRequest createImageRequest = new CreateImageRequest(
				instanceId, "create-image-test-2")
				.withDescription("description test 2")
				.withNoReboot(true);
</pre>

# SDK for Java
<pre><code class="java">
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.autoscaling.model.BlockDeviceMapping;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.CreateImageRequest;
import com.amazonaws.services.ec2.model.CreateImageResult;
import com.amazonaws.services.ec2.model.DescribeSnapshotAttributeRequest;
import com.amazonaws.services.ec2.model.DescribeSnapshotAttributeResult;
import com.amazonaws.services.ec2.model.DescribeSnapshotsRequest;
import com.amazonaws.services.ec2.model.DescribeSnapshotsResult;
import com.amazonaws.services.ec2.model.DescribeVolumesResult;
import com.amazonaws.services.ec2.model.Snapshot;

public class Ec2AmiCreateFromInstance {

	/**
	 * 第一引数で指定されたec2 instance idから、AMIを作成します。
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		String instanceId = args[0];

		if (instanceId == null || "".equals(instanceId)) {
			throw new IllegalArgumentException("instance id is null or empty.");
		}

		AWSCredentialsProvider provider = new ProfileCredentialsProvider("uzr");

		AmazonEC2 ec2_tokyo = Region.getRegion(Regions.AP_NORTHEAST_1)
				.createClient(AmazonEC2Client.class, provider,
						new ClientConfiguration());

		CreateImageRequest createImageRequest = new CreateImageRequest(
				instanceId, "create-image-test-2")
				.withDescription("description test 2");

		CreateImageResult image = ec2_tokyo.createImage(createImageRequest);
		System.out.println(instanceId + "から" + image.getImageId() + "を作成しました。");
	}
}
</code></pre>

#参考
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html
64bit移行対応は実機を使おう

シミュレータでは再現しないけれど64bitの実機端末でテストすると
クラッシュする箇所がありました。
公式でも既知のようですが、注意点として共有します。

## ポインタに関わる部分は注意
Cocoa Touch 64ビット移行ガイド
https://developer.apple.com/jp/documentation/CocoaTouch64BitGuide.pdf
「Objective-Cのポインタに直接アクセスしない」という項目があります。
例えば、64bit対応をするときには下記書き換えを行う必要があります。

注意点としては、公式ドキュメントにもありますが、
シミュレータでは正常動作してしまうので、テスト時は実機で行う必要があることです。

```lang:Objective-C
// メソッドへ対応する関数へのポインタを利用して関数を呼び出す記法
IMP func = [catClass methodForSelector:@selector(eat:)];
BOOL ret = (*func)(catClass, @selector(eat:), fish);
```

```lang:Objective-C
// 通常の引数付きメッセージ送信による記法
BOOL ret = [catClass eat: fish];
```

## 参考URL
* ダイナミックObjective-C (22) メソッドとは何か(5) - メソッドの実装

http://news.mynavi.jp/column/objc/022/
Git でブランチの名前を変更する方法


## はじめに
今関わっているプロジェクトでは、トピックブランチの名前に prefix としてスプリントの番号(現在プロジェクト開始から何スプリント目か)をつけることになっている。
プロジェクトのルールでは`番号-ブランチ名`とするネーミングルールになっているが、間違えてアンダースコアで繋げてしまう事がよくある。
ブランチの名前を間違える度にヘルプを見ているので、備忘の為にまとめておく。


## 現在のブランチの名前を変更する

```bash
% git branch -m <newbranch>
```

## 特定のブランチの名前を変更する

```bash
% git branch -m [oldbranch] <newbranch>
```

## 現在のブランチを既に存在するブランチの名前に変更する

```bash
% git branch -M <newbranch>
```


## 特定のブランチを既に存在するブランチの名前に変更する

```bash
% git branch -M [oldbranch] <newbranch>
```

## git branch -h の結果

<pre>
% git branch -h
usage: git branch [options] [-r | -a] [--merged | --no-merged]
   or: git branch [options] [-l] [-f] <branchname> [<start-point>]
   or: git branch [options] [-r] (-d | -D) <branchname>...
   or: git branch [options] (-m | -M) [<oldbranch>] <newbranch>

Generic options
    -v, --verbose         show hash and subject, give twice for upstream branch
    -q, --quiet           suppress informational messages
    -t, --track           set up tracking mode (see git-pull(1))
    --set-upstream        change upstream info
    -u, --set-upstream-to <upstream>
                          change the upstream info
    --unset-upstream      Unset the upstream info
    --color[=<when>]      use colored output
    -r, --remotes         act on remote-tracking branches
    --contains <commit>   print only branches that contain the commit
    --abbrev[=<n>]        use <n> digits to display SHA-1s

Specific git-branch actions:
    -a, --all             list both remote-tracking and local branches
    -d, --delete          delete fully merged branch
    -D                    delete branch (even if not merged)
    -m, --move            move/rename a branch and its reflog
    -M                    move/rename a branch, even if target exists
    --list                list branch names
    -l, --create-reflog   create the branch's reflog
    --edit-description    edit the description for the branch
    -f, --force           force creation (when already exists)
    --no-merged <commit>  print only not merged branches
    --merged <commit>     print only merged branches
    --column[=<style>]    list branches in columns
</pre>
known_hostsを無視してsshで接続してリモートでコマンド実行

よくJenkinsの「シェルの実行」に設定して使っているのでメモ.

```bash
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -t -i /path/to/.ssh/id_rsa hoge@hoge.com "cd /home/hoge/scripts;
php batch.php foo bar"
```
Gitで管理しているdotfilesを一括でhomeディレクトリに張るワンライナー

(2/24更新)
変更前のスクリプトでは，`.i3`や`.oh-my-zsh`が対象外になっており，よく正規表現を見たところこれでは動くはずがないことに気づきました．   
以下修正後：
https://github.com/tokoro10g/dotfiles/blob/master/install.sh

```bash
cp -rs $(find $(pwd) -maxdepth 1 | grep -P '^.+\/\.(?!git)') $HOME
```

`grep`とか挟まずにやりたかったんですがそう甘くはないみたいですね…

----
(変更前)

```bash
cp -rs `pwd`/.[^.\(git\(ignore\)*\)]* $HOME
```
コマンドラインからクリップボードへのコピー

#コマンドライン標準出力をクリップボードにコピーする方法

##Mac OS Xでのクリップボードへのコピー
```
$ cat hoge.txt | pbcopy
```

##Ubuntuでのクリップボードへのコピー
```
$ cat hoge.txt | xsel --clipboard --input
```


ちなみにUbuntuの場合はxselコマンドがインストールされていないと動かないのでインストールされていない場合はインストール

```
$ sudo apt-get install xsel
```
~/.bashrc にエイリアスを定義しておけばマックと同じように使えるので便利

```
alias pbcopy='xsel --clipboard --input'
```
sinatraでのキャッシュ手段に関する個人的なメモ

### rack-cache(ライブラリ)

https://github.com/rtomayko/rack-cache

各アクション（とパラメータ）に対してアウトプット全体が固定的なWEBアプリであれば、
RackミドルウェアであるRack::Cacheを使うのが便利
rack-cacheライブラリはそのRack::Cacheの機能をより簡単に利用できる
memcachedとの連携も楽(memcachedクライアントライブラリであるdalliが対応している)
ページ全体のキャッシュ（ページキャッシュ）とアクション単位のキャッシュ（アクションキャッシュ）に対応
postアクションをデフォルトで新規リソース扱いしてくれる
ページの一部をキャッシュ（フラグメントキャッシュ）することには対応していない
（ 将来的には対応予定、らしい => http://rtomayko.github.io/rack-cache/faq ）

### sinatra-cache(ライブラリ)

https://github.com/kematzy/sinatra-cache

sinatraを拡張してページキャッシュとフラグメントキャッシュを簡単に行えるようにするライブラリ
フラグメントキャッシュは最終URL（アクション）に合わせたディレクトリパスで保存される
これには難点があり、例えばブログサービスの場合、
各記事ごとに別個でまったく同じフラグメントキャッシュを保存する形となりうるため
サーバーのストレージ的には効率が悪い、という仕様
（ある程度の解消方法は提示されている）

### Simple fragment caching in sinatra(ヘルパー)

https://gist.github.com/bryanthompson/277560

sinatraにフラグメントキャッシュ機能(だけ)を追加するヘルパーソースコード
機能シンプル、コードもシンプル
キャッシュの保存先を変更しやすいため、上記sinatra-cacheのデメリットを回避できる
ソースコードもとってもわかりやすいので、カスタマイズ性高し

上記３つは全て競合せずに併用できそう
Python で Project Euler #1「3と5の倍数」

[Problem 1 「3と5の倍数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201)
> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
> 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

```py:Python
seq = range(1000)

result = 0
for i in seq:
  if i % 3 == 0 or i % 5 == 0:
    result += i
print result
print result == 233168
```

```:結果
233168
True
```
Xcode6：ipa書き出しでのトラブル対応

#はじめに
Xcodeでipa書き出しを行う場合は
自動で作られたXCなprovisioing Fileでの運用への移行を検討しています。
Xcodeでビルドするのに自分で作成したProvisioing Fileを使うのがつらくなってきています。

##こまったこと
個人ライセンスならともかく、チームで使うライセンスの場合

* デバイスの追加
* Agentの証明書の更新

これらが影響してipaの出力時ワーニングが起こることを確認しています。また

 * 自分で作ったProvisioing Fileがあるのに`XC`なProvisioing Fileが生成
 * 自分の開発と関係のないProvisioing Fileが設定

など、トラブルが増えました。

##参考URL
https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Troubleshooting/Troubleshooting.html

#トラブル事例
ほぼ、デバイス追加時に発生します。
証明書についてはprovisioing Fileの生成のタイミングで困ることがありますが、デバイス登録ほどの頻度はないはず。

##`XC`なProvisioing File の生成
 * 開発者ライセンスに登録しているデバイス全部が設定されていない
などなど

###対処
デバイスをどうしても限定したい場合を除いて`XC`なProvisioing Fileを使う。戦わない。

一番新しく作成された証明書がデフォルトで設定されるため、証明書が複数あり、使用しているAgentの証明書が古い方であればiTunes Connectで使用中の証明書に更新することが必要。

##自分の開発と関係のないProvisioing Fileが設定

Push通知や iCloudなどはユニークなBundle Identifierが必要です

Certificates, Identifiers & Profiles
>If you plan to incorporate app services such as Game Center, In-App Purchase, Data Protection, and iCloud, or want a provisioning profile unique to a single app, you must register an explicit App ID for your app.

たとえば次のようなBundle Identifer を設定したAppIDがあり

（a）ユニークなBundle Identifer
> com.example.hoge.huga

* Push通知、その他ユニークなBundle Identiferを必要とする機能が設定済み

（b）複数アプリで利用できるワイルドカードなBundle Identifer
> com.example.hoge.*

* 特に機能なし

(a)にprovisioning Fileとして不適ということがあり、(b)を選択された場合に事故が起こりがちです。
この場合はwarningが起きないため、選択されたProvisioing Fileの表示を確認していれば大丈夫ですが、あまり長い表示名をつけた場合は見落とす可能性が高くなります。

そのため、Xcodeから出力したadhocでは特定機能が使えなくなっているということも起こりがちです。

###対処
(b)を消せない場合が一番面倒です。
(a)にライセンス上の全端末を登録して更新、Xcodeで同期して臨みます。

他、Bundle Identifierを(b)とかぶらないように設定し直すなど。

#参考URL

https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/DistributingEnterpriseProgramApps/DistributingEnterpriseProgramApps.html

#さいごに
コマンドを使うのは自動化を検討するシーンくらいにしたいのですが、これも検討しつつですね。
AngularJSに挑戦！入門 その5

#はじめに

AngularJSには、serviceというものがあります。
アプリケーションの共通部品として利用できるようにするものです。
1度挑戦してみます。

#Serviceの実装

```lang:serviceSample.js
var MyApp = angular.module('MyApp', []);


MyApp.service('MyAppSevrices', [function () {

    this.plus = function (x, y) {
        return (x + y);
    }

    this.minus = function (x, y) {
        return (x - y);
    }

    this.multiply = function (x, y) {
        return (x * y);
    }

    this.divide = function (x, y) {
        return (x / y);
    }
}]);
```

足し算・引き算・掛け算・割り算のサービスです。
サービス名を指定して、各関数を作成します。

#Controllerの実装

```lang:serviceSample.js
MyApp.controller('ServiceCtrl', function ($scope, MyAppSevrices) {
    $scope.plus = function() {
        return MyAppSevrices.plus(parseInt($scope.x), parseInt($scope.y));
    }

    $scope.minus = function() {
        return MyAppSevrices.minus(parseInt($scope.x), parseInt($scope.y));
    }

    $scope.multiply = function() {
        return MyAppSevrices.multiply(parseInt($scope.x), parseInt($scope.y));
    }

    $scope.divide = function() {
        return MyAppSevrices.divide(parseInt($scope.x), parseInt($scope.y));
    }
});
```

コントローラーでサービスを呼び出します。
`MyApp.controller('ServiceCtrl', function ($scope, MyAppSevrices) {
`が今までと違う点です。いままでは、$scopeのみを渡していましたが、
サービスを利用するときは、サービス名を指定します。

#Viewの実装

```lang:serviceSample.html
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.1/angular.min.js"></script>
    <script type="text/javascript" src="serviceSample.js"></script>
    <title>serviceSample</title>
</head>
<body ng-app="MyApp">
    <div class="container">
        <div class="jumbotron">
            <h2>serviceSample!</h2>
        </div>
        <div ng-controller="ServiceCtrl">
            <input ng-model="x"><input ng-model="y">
            <div class="bg-info">
                <p>足し算: {{plus()}}</p>
                <p>引き算: {{minus()}}</p>
                <p>掛け算: {{multiply()}}</p>
                <p>割り算: {{divide()}}</p>
            </div>
        </div>
    </div>
</body>
</html>
```

今まで通りの作成で問題ありません。
ng-modelにxとyを設定しています。
両方に数値を指定すれば、それぞれ計算がされます。

#おわりに

共通部品を作成することは、アプリケーションを作るうえで必須のことだと思います。
簡単な例でしたが、基本を押さえるのに適した例だと思います。
いろいろなサービスを作成していきましょう。
CakePHP2.xで別モデルのページネーションを行う

# 状況
HogesControllerの中でFugaモデルのデータを取得してページネーションしたい

# やり方

## 基本的なやり方

```php:app/Controller/HogesController.php
	//利用モデルを指定
	public $uses = array('Fuga');

	public function index() {
		$fugas = $this->Paginator->paginate('Fuga'); //引数にモデル名を入れる
		$this->set(compact('fugas'));
	}
```

## conditionsを指定したい場合
paginateの第二引数に直接書く。ポイントは'conditions' => array(...)とか書かない事。

```php:app/Controller/HogesController.php
	//利用モデルを指定
	public $uses = array('Fuga');

	public function index() {
		$fugas = $this->Paginator->paginate('Fuga', array(
			'Fuga.user_id' => 1
		));
		$this->set(compact('fugas'));
	}
```


## limitとかも指定したい場合
$this->paginateに指定。

```php:app/Controller/HogesController.php
	//利用モデルを指定
	public $uses = array('Fuga');
	
	public function index() {
		$this->paginate = array('Fuga' => array('limit' => 3));
		$fugas = $this->Paginator->paginate('Fuga', array(
			'Fuga.user_id' => 1
		));
		$this->set(compact('fugas'));
	}
```

以上。
【VBScript】備忘録


##覚書


###構文エラーでもスクリプトを停止させない

On Error Resume Nextと
On Error Goto 0で囲むことによって、
範囲内のみOn Error Resume Nextの効果を与える

```
On Error Resume Next
～構文～
On Error Goto 0
```

*参考*
実行時エラーまとめ
http://msdn.microsoft.com/ja-jp/library/cc392383.aspx





###sessionの格納・取得方法

```
Session("名前") = 式                        ' セッション変数への値の格納
Set Session("名前") = オブジェクト          ' セッション変数へのオブジェクトの格納

変数 = Session("名前")                      ' セッション変数の値の参照
Set オブジェクト変数 = Session("名前")      ' セッション変数のオブジェクトの参照
```


セッションオブジェクトを破棄
※1つのセッションのみ残したい場合は、
それ以外のセッションを個別に破棄するか、
残したいセッションを変数に格納する（推奨？）

```
Session.Abandon();
```

ボタンをクリックした時の記述

```
Sub toAdmin_OnClick
   
End Sub
```


ページの遷移方法

```
Response.Redirect "～"
```

###ファイルをインクルードする

キーワード virtual は、"仮想ディレクトリ" で始まるパスを指定するときに使用します。たとえば、Footer.inc という名前のファイルが仮想ディレクトリ /Myapp に存在する場合、次の行を記述したファイルに Footer.inc の内容が挿入されます。

```
<!-- #include virtual ="/myapp/footer.inc" -->

```

###キーワード File を使用する

キーワード file は、"相対" パスを指定するときに使用します。相対パスでは、インクルードする側のファイルのあるディレクトリがパスの起点になります。たとえば、ディレクトリ Myapp にインクルードする側のファイルがあり、ファイル Header1.inc が Myapp\Headers にある場合、次のように記述すると、Header1.inc がファイルに挿入されます。

```
<!-- #include file ="headers\header1.inc" -->
```

###レコードが0件の場合エラーページに遷移
セッションでeofがtrueという情報を変数に格納すると
エラー画面でエラーごとの条件分岐が可能。

```
If rs.Eof = True Then
Session("loginCheck") =rs.Eof
Response.Redirect "Err.asp"
end if
```




##参考サイト
VBScript初心者入門講座
http://vbscript.pgtop.net/

ASP(ActiveServerPage)基本
http://office-yone.com/ProProgramer/ActiveServerPage.htm#Response

AB型の変わり者 三流プログラマー Ken3のＨＰ
http://www.ken3.org/index.html

VBScript Tips & サンプル
http://www.happy2-island.com/vbs/


##宿題

ダブルコーテーションの部分をシングルコーテーションに変更かつ＆を付与してくれる素敵なジェネレータを探す

```
response.write("<form action='"&"test.asp"&"' method='"&"post"& "'"  &">")

```

SQL文にて
MERGEがあれば同機能のINSERTとUPDATEは不要では？
Google Cloud Platform Live 2014でプレゼンに出てきたサービスをまとめてみた。

Building a best-in-class Cloud Platform applicationの方をメインでみてたので、
"Hot topics in cloud computing"の方はもしかしたら漏れているかも

https://cloud.google.com/events/google-cloud-platform-live/stream

Firebase
----

デバイス間でデータをリアルタイムでSyncしてくれるストレージ(?)サービス。
モバイルアプリ作るときとか便利そう。
javascriptも対応できるので、PCでもブラウザで動かすものは対応できるみたい。

今回 GCP LiveでGoogleが強烈にプッシュしてた。
たしかに便利そう。

https://www.firebase.com/


Datadog
----

いわゆるシステモニタリングサービス。
ZabbixやMuninでやってるようなことをIasSで提供してくれる。
クラウドでMuninとかキツイもんね。

https://www.datadoghq.com/


Cloudyn
----

AWSやGoogleCloudPlatformでどのくらいお金を使ってるのか
モニタリングしたりグラフにしたりしてくれるサービス。
クラウドサービスの利用額版のGoogleAnalyticsだと考えるとわかりやすい。

https://www.cloudyn.com/


TrapX
----

セキュリティ系
リアルタイムでモニタリングしてるのでDay-Zero Attackとかも対応できるらしい。

http://www.trapx.com/
「コードレビュー」について調べたのでまとめる

## レビューする目的を明確にする
* 開発のどの段階の、どういう文脈でのレビューなのか
  * 開発初期とリリース前では、どこにどの程度着目すべきかは違ってくる
  * プロジェクトにとって何が重要なのか
  * コストと効果を意識する
* 分類
  * リファクタリング
  * パターンやライブラリ
  * バグの指摘
  * ロジックの整合性、仕様通りかどうか
  * パフォーマンス
  * 互換性、拡張性、メンテナンス性
  * 一貫性
  * 読みやすさ、言語やSDKのルール

## 人間にしか出来ないことに集中する
* 機械にまかせられるようなチェックは機械にまかせる
  * インデントの間違い
  * スペースや改行の挿入位置
* 静的解析
* コーディング規約：無駄に悩むことを減らす

## 内容によっては他の手法が適している場合もある
* ペアプロ

## レビューは改善のために行うもの
* 品質を向上させる
* 共通の認識を共有する
* メンバーのスキル向上
  * 人に読まれることを意識するようになる


## 参考記事
* [デキるプログラマだけが知っているコードレビュー7つの秘訣 - slideshare](http://www.slideshare.net/rootmoon/7-37892729)
* [pull request を利用した開発ワークフロー - Speaker Deck](https://speakerdeck.com/hotchpotch/pull-request-woli-yong-sitakai-fa-wakuhuro)
* [コードレビューをしよう - pblog](http://ppworks.hatenablog.jp/entry/2014/08/19/145723)
* [コードレビューをするときは目的を明確に - もふもふ部](http://blog.j-caw.co.jp/73)
* [コードレビューって、時間のムダなの！？ - プログラマyasuhoの隠れ家](http://yasuho.hatenablog.com/entry/2014/04/25/093324)
* [コードレビューのポイント - PLEASE SLEEP](http://please-sleep.cou929.nu/code-review-essence-from-cookpad.html)
* [コードレビューについて - 小野和俊のブログ](http://blog.livedoor.jp/lalha/archives/50495777.html)
* [コードレビューって意味あるの ? - Slashdot](http://developers.slashdot.jp/story/09/06/25/0029256/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A3%E3%81%A6%E6%84%8F%E5%91%B3%E3%81%82%E3%82%8B%E3%81%AE-)
* [ [Scrum]Scrumではコードレビューをどうやっているか？](http://www.ryuzee.com/contents/blog/4588)