OmniAICreator/Qiita-1.07M huggingface dataset:
AnsibleでSSH設定ファイルをVagrantfileと同じディレクトリにおいてpingする


ありがたいAnsibleの日本語チュートリアル（ http://yteraoka.github.io/ansible-tutorial/ ）をやっていてpingでいきなり躓いた。

```
$ ansible -i hosts 192.168.33.12 -m ping
192.168.33.12 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
```

-vvvvオプションをつけるとどうやらssh configが意図した場所ではなく、~/.ssh/configを読みに行っているようでした。
vagrantで作ったvmのssh設定ファイルは、Vagrantfileと同じ場所に置きたかったので調べてみました。
ansible.cfgで設定するようです:
http://docs.ansible.com/intro_configuration.html#ssh-args


以下、設定した結果です。
##各ファイルの中身
※Vagrantfileはチュートリアルのままなので省略


```:ansible.cfg
[ssh_connection]
ssh_args = -F ssh.config
```

```ssh.config
Host node1
  HostName 127.0.0.1
  User vagrant
  Port 2001
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/yoccola/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

Host node2
  HostName 127.0.0.1
  User vagrant
  Port 2002
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/yoccola/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

```:hosts
[vagrant]
node1
node2
```

##確認
Host設定の名前でpingを叩いてみます。

```bash
$ ansible -i hosts node1 -m ping
node1 | success >> {
    "changed": false, 
    "ping": "pong"
}
```

allもいけました。

```bash
$ ansible -i hosts all -m ping
node1 | success >> {
    "changed": false, 
    "ping": "pong"
}

node2 | success >> {
    "changed": false, 
    "ping": "pong"
}

```

##参考
Ansible チュートリアル | Ansible Tutorial in Japanese
http://yteraoka.github.io/ansible-tutorial/

The Ansible Configuration File
http://docs.ansible.com/intro_configuration.html
[Scala]パターンマッチにおけるアットマーク(@)


### 参照
http://stackoverflow.com/questions/4513380/scala-match-help

## 問題

こんなコードがある

```scala
def flatMapSublists[A,B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
  ls match {
    case Nil => Nil
    case sublist@(_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f)
  }
```

#### ん？`sublist@(_ :: tail)`？？？

## 意味

パターンマッチを行う際に`foo@bar`で、`bar`にマッチしたものを`foo`にバインドするということらしい
つまり、上の例では`ls`が`_ :: tail`にマッチするようなものだった場合に、`ls`が`sublist`にバインドされる

### 他の例

[参照URL](http://stackoverflow.com/questions/4513380/scala-match-help)で出されている例そのままだが、リストに3つの要素があるかどうか確認し、
そうであった場合に、標準出力しながら、リストの2番目(indexは1)の要素を取得したいとき


```scala
val something = List(1, 2, 3)
something match {
  case ls@List(_,elem,_) => println("matching:" + ls); elem    
  case _ => println("not found")
}   
// res: AnyVal = 2

// @を使わずに同様のことを行う
something match {
  case List(a,elem,b) => println("matching:" + List(a,elem,b)); elem    
  case _ => println("not found")
}   
// res: AnyVal = 2

// これでも良い
something match {
  case List(a,elem,b) => println("matching:" + something); elem    
  case _ => println("not found")
}  

```

`ls@`なんて付けずに`something`をそのまま使えばいいんじゃね？って思った
よくわからんのでもう少し

```scala
val list = List(1, 2, 3)

list match {
  case ls@(h :: tail) => println(tail); list
  case Nil => Nil
}
// List(2, 3)
// res: List[Int] = List(1, 2, 3)

list match {
  case ls@(h :: tail) => println(tail); ls
  case Nil => Nil
}
// List(2, 3)
// res: List[Int] with Serializable = List(1, 2, 3)

```

なぜか`Serializable`になった
この`@`には名前がないのかな
お手軽にcrontab -rによる事故を防ぐ方法

crontab -e と打とうとしてcrontab -rになってしまい、全消しという悲しい事故になるというのは、割と良く知られています。

ちゃんとやると、crontab の内容をバージョン管理するとかになるんですが、まぁそこまで大げさにはしたくないけど、間違って消しちゃうのはまずい、と言うときのお手軽な方法です。

crontab の最後の行あたりに、以下を書いておくといいです。
crontab -rしても最悪1時間前のものが残っていますし、そのまま放置してもcrontab_backupはそのまま残っています。

```bash
*/0 * * * * crontab -l > /home/username/crontab_backup
```
【KnockoutJS】View で一時変数を使う

KnockoutJS で WPF の Converter 的なこと [(※参考)](http://slide.sukobuto.com/article/ko-svg/#/6) をやろうとした時、View のコンテキストに一時変数を定義できればいいな、と思いカスタムバインディングを作ってみました。

View 側で変換した値を使いまわしたい、というときに便利です。

# できること

## 基本

※doSomething という関数がグローバルに定義されているとします

```html:View
<div data-bind="variable: { foo: doSomething(someProperty) }">
    <!--ko if: foo() == 'hoge'-->
    <span data-bind="text: foo"></span>
    <!--/ko-->
</div>
```

このように一時変数が使えます。
ただし someProperty が observable の場合、変更が自動的に反映されません。
反映されるようにするには次のように書きます。

## 変更を自動反映する書き方

※ someProperty が observable になったとします

```html:View
<div data-bind="variable: { foo: function(){ return doSomething(someProperty()) } }">
    <!--ko if: foo() == 'hoge'-->
    <span data-bind="text: foo"></span>
    <!--/ko-->
</div>
```

このように無名関数でラップし、getter 関数にすることによって
定義される一時変数を computed にすることができます。
結果、someProperty が書き換わると自動的に反映されるようになります。

## Virtual Element

```html:View
<!--ko variable: { foo: function(){ return doSomething(someProperty()) } }-->
    <!--ko if: foo() == 'hoge'-->
    <span data-bind="text: foo"></span>
    <!--/ko-->
<!--/ko-->
```

仮想エレメント（コメント記法）でも使えます。

## Knockout-ES5 に対応してます

[Knockout-ES5](http://blog.stevensanderson.com/2013/05/20/knockout-es5-a-plugin-to-simplify-your-syntax/) はプロパティを `()` なしで参照できるようにしてくれるシンタックスプラグインです。
Knockout-ES5 が読み込まれている場合は以下のように書くことができます。

```html:View
<div data-bind="variable: { foo: function(){ return doSomething(someProperty) } }">
    <!--ko if: foo == 'hoge'-->
    <span data-bind="text: foo"></span>
    <!--/ko-->
</div>
```

## DEMO

http://jsfiddle.net/sukobuto/wpD2u/
コンバータパターンで一時変数を有効活用する例です。

# variable-binding

これを ko.applyBindings 呼び出し前のどこかに貼り付ければ使えます。

```js:variable-binding
ko.bindingHandlers['variable'] = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        var variables = valueAccessor();
        for ( var v in variables ) {
            if (variables.hasOwnProperty(v)) {
                if (ko.isObservable(variables[v])) {
                    bindingContext[v] = variables[v];
                } else if (typeof variables[v] === 'function') {
                    if (ko.hasOwnProperty('defineProperty'))
                        ko.defineProperty(bindingContext, v, variables[v]);
                    else bindingContext[v] = ko.computed(variables[v]);
                } else {
                    bindingContext[v] = variables[v];
                }
            }
        }
    }
};
ko.virtualElements.allowedBindings['variable'] = true;
```
C# 製ソフトウェアで、メモリ不足になった場合の対処方法

画像編集ソフト [Paint.NET](http://www.getpaint.net/) (4.0 Beta) で大きめのファイルを閲覧しようとしたところ

```System.OutOfMemoryException: VirtualAlloc returned a null pointer, bytes = 13,362,240```

というエラーが出て開けなかったのですが、その対処方法を備忘録として残しておきます。
今回は、設定を変更してメモリの割り当て量を無制限にすることで対応しました。
Eclispe のような Java 製ソフトウェアでメモリ不足のエラーが起こった時と同じ要領で対処可能みたいです。
その他の C# 製ソフトウェアについても応用できるはず。（たぶん）

# 1.設定ファイルを開く

Paint.NET の実行ファイルがあるフォルダに `PaintDotNet.exe.config` というファイルがあるので、テキストエディタで開きます。

# 2.メモリ割り当ての上限を無制限に設定

ファイルの中身がこんな感じになっているので

```xml
<?xml version="1.0"?>
<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
    <generatePublisherEvidence enabled="false" />
    <legacyCorruptedStateExceptionsPolicy enabled="true" />
    <loadFromRemoteSources enabled="true" />
  </runtime>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>
```

`runtime` 要素の中に、以下の一行を挿入します。

```xml
    <nodeRunnerSettings memoryLimitMegabytes=”0”/>
```

最終的に以下の状態になれば OK です。

```xml
<?xml version="1.0"?>
<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
    <generatePublisherEvidence enabled="false" />
    <legacyCorruptedStateExceptionsPolicy enabled="true" />
    <loadFromRemoteSources enabled="true" />
    <nodeRunnerSettings memoryLimitMegabytes=”0”/>
  </runtime>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>
```

これで今まで開けなかった巨大なファイルも読み込めるようになりました。
ただし、メモリを大量に消費して OS の挙動が不安定になるかもしれないので、その場合は memoryLimitMegabytes 属性を適切な値に調整する必要がありそうです。
RPJSONMapperでお手軽マッピング


JSONから生成したNSDictionaryをオブジェクトにマッピングするのって面倒ですよね。

こんなん。

```objectivec
NSDictionary *jsonDictionary = @{
    @"id": @123,
    @"username": @"taro yamada"
};

User *user = [[User alloc] init];
user.id = jsonDictionary[@"id"];
user.name = jsonDictionary[@"username"];
```

この手のマッピング用ライブラリはたくさんあるんですが、探した中では[RPJSONMapper](https://github.com/reygonzales/RPJSONMapper)が使いやすそうでした。

* マッピング定義が辞書で簡単に書ける
* マッピング定義を一箇所に書ける
* トランスフォーム（型変換）が出来る


例えばJSONリストをマッピングしてみる。

```objectivec
@implementation Note

@property(nonatomic, strong) NSString *title;
@property(nonatomic, strong) NSString *text;
@property(nonatomic, strong) NSDate *date;

@end

NSArray *notes = @[
  // noteの辞書
  @{
    @"id": @123,
    @"title": @"今日のランチ",
    @"body": @"ジェノベーゼ",
    @"posted_at": @"2014-05-14T15:55:30Z"  // ISO8601形式
  },
  ...
];

NSArray *array = [[RPJSONMapper sharedInstance] objectsFromJSONArray:notes
                                              withInstantiationBlock:^id {
                                                  // マッピング先のオブジェクト
                                                  return [[Note alloc] init];
                                              }
                                                        usingMapping:@{
                                                                @"id": @"id",
                                                                @"title" : @"title",
                                                                @"body" : @"text",
                                                                @"posted_at" : [[RPJSONMapper sharedInstance] boxValueAsNSDateIntoPropertyWithName:@"date" usingDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]
                                                        }];
```

# その他のライブラリ

* [JSONModel](https://github.com/icanzilb/JSONModel/) dot notationでアクセス出来るのが便利そう。トランスフォームはカスタムクラスで実装。
* [Mantle](https://github.com/Mantle/Mantle)

----

他のオブジェクトにマッピングしたり、文字列を数値にしたり、全然違う値にトランスフォームしたり、というのもやりたいので、調べて新しいことが分かったら更新します。
NGUIのUIScrollViewがずれる


UIScrollViewがTopからではなくセンタリングされる場合、UIScrollViewのスクロール位置をresetさせるメソッドを実行する必要がある。

```csharp
public GameObject ScrollView;
    
void Start () {
    ScrollView.GetComponentInChildren<UIScrollView>().ResetPosition();
}
```

マネージャークラスなどのStartメソッドで実行してあげれば良いと思う。
シェルスクリプトで引数を16進表示

```bash:arg_check.sh
#!/bin/sh
cd `dirname $0`
echo 'argc:'$#
echo 'argv:'$*
echo $* | od -tx1z -w16
exit 0
```

```shell-session
ekaneko@bibian ~/work % # シェルスクリプト内で使う場合
ekaneko@bibian ~/work % cat > arg_check.sh
#!/bin/sh
cd `dirname $0`
echo 'argc:'$#
echo 'argv:'$*
echo $* | od -tx1z -w16
exit 0
ekaneko@bibian ~/work % sh ./arg_check.sh `date '+%Y-%m-%d %T'`
argc:2
argv:2014-05-23 11:51:13
0000000 32 30 31 34 2d 30 35 2d 32 33 20 31 31 3a 35 31  >2014-05-23 11:51<
0000020 3a 31 33 0a                                      >:13.<
0000024
ekaneko@bibian ~/work % # コマンドラインで使う場合
ekaneko@bibian ~/work % echo `date '+%Y-%m-%d %T'` | od -tx1z -w16 
0000000 32 30 31 34 2d 30 35 2d 32 33 20 31 34 3a 34 35  >2014-05-23 14:45<
0000020 3a 35 38 0a                                      >:58.<
0000024
ekaneko@bibian ~/work % # ファイル内容をダンプ
ekaneko@bibian ~/work % od -tx1z -w16 arg_check.sh 
0000000 23 21 2f 62 69 6e 2f 73 68 0a 63 64 20 60 64 69  >#!/bin/sh.cd `di<
0000020 72 6e 61 6d 65 20 24 30 60 0a 65 63 68 6f 20 27  >rname $0`.echo '<
0000040 61 72 67 63 3a 27 24 23 0a 65 63 68 6f 20 27 61  >argc:'$#.echo 'a<
0000060 72 67 76 3a 27 24 2a 0a 65 63 68 6f 20 24 2a 20  >rgv:'$*.echo $* <
0000100 7c 20 6f 64 20 2d 74 78 31 7a 20 2d 77 31 36 0a  >| od -tx1z -w16.<
0000120 65 78 69 74 20 30 0a                             >exit 0.<
0000127
ekaneko@bibian ~/work % 
```

## 解説
シェルでバイナリダンプする使用例です。
ファイルのダンプとシェルスクリプト内でのダンプを行うサンプルです。
詳細は od コマンドのMANを調べて下さい。

## 経緯
aws に持っていったプログラムが動かずに困り、
調査の結果、引数が何か違うとなった時に調べる必要があったためです。
便利です。

## 原因
UTF8 BOM が引数先頭にくっついていました。
16進数の EF BB BF です。
DBを検索した結果をパイプ(>)でファイルに一旦出力後、そのファイルより取得した値を使用していたのが問題だったようです。
その時の対応は引数を渡されたphp内でbomを切り取る関数を通して対応しました。
※ 標準出力をそのままダイレクトに使用した方が良いです。大変ですが…。

## bomChomp
phpです

```php
// ========================================
// ちょっとした関数
// ========================================
// BOM付きUTF8からBOMを削除する
// 環境によってはBOM付きUTF8になる
function bomChomp($valDate)
{
    if(($valDate == NULL) || (mb_strlen($valDate) == 0)) {
        return '';
    }
    if(ord($valDate{0})==0xef && ord($valDate{1})==0xbb && ord($valDate{2})==0xbf)
    {
        $valDate = substr($valDate, 3);
    }
    return $valDate;
}
```
Rails でモデルの情報を図にする方法


いちいち手で書いてられないですよね。間違えるし。。

というわけで [Rails ERD](http://rails-erd.rubyforge.org/install.html "Rails ERD") を使ってみました。

# 準備

## graphviz のインストール。

```
brew install graphviz
```

## rails-erd のインストール

marvericks の場合、gem rails-erd をインストールする際に下記のように記載すること。

```Gemfile
+ gem 'rails-erd', github: 'paulwittmann/rails-erd', branch: 'mavericks'
```

ただ rails-erd を指定しただけだと、下記のようなエラーを吐いて図が出力されない。

```
Graphviz produced errors. Verify it has support for filetype=pdf, or use filetype=dot.
Original error: 2014-05-23 11:50:20.918 dot[88308:d07] CoreText performance note: Client called CTFontCreateWithName() using name "Arial Italic" and got font with PostScript name "Arial-ItalicMT". For best performance, only use PostScript names when calling this API.
```

# 実行

bundle install が終わったら、

```
bundle exec rake erd
```

を実行。Rails root に erd.pdf が生成されます。
Mozilla Firefox、Google Chrome、Opera OPRの見分け方

アイデンティティのなくなったこの3つのブラウザはどう見分ければ良いか。

## Google Chrome

![chrome.png](https://qiita-image-store.s3.amazonaws.com/0/5218/970f827b-470c-5869-8132-3431f51f8574.png)

## Opera (OPR)

![opr.png](https://qiita-image-store.s3.amazonaws.com/0/5218/edc19b71-6f5c-c40d-39cc-0d5f5be85c3d.png)

## Mozilla Firefox

![firefox.png](https://qiita-image-store.s3.amazonaws.com/0/5218/9212f91a-711d-5a53-17e1-76c495bc1fb3.png)

## まとめ

| ブラウザ | タブ | 戻るボタン |
|:--|:--|:--|
| Google Chrome | ななめ | まるっこい |
| Opera | しかくい | ちょっととがってる |
| Firefox | まるっこい | ださい |
TitaniumStudioをアプデしたらiOSエミュが動かない

解決済。備忘録。

Titanium Studioだけアップデートかけたら、ちょっと前まで動いてたコードが「image not found」とか言われて動かなくなってしまった。
原因調査でいろいろ探した結果、Xcodeのアプデをしていなかったことが原因（白目）。
さらにTitaniumSDKのバージョン指定も間違っていて、なんかもうちょっとつらかった。

結局動かなかったら全部アプデしてtiapp.xmlちゃんと設定しなおせよ、っていう初歩的なことらしい。
時間無駄にした。
JSでクエリストリングを取得する

JSでクエリストリング取得する関数メモ

`function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}`
RubyでMySQLに接続


1.
MySQLのgemをインストールしておく。

```bash
gem install mysql
```

2.
Rubyでの書き方

```rb
require 'mysql'

connection = Mysql::connect("hostname", "username", "password", "dbname")

# 文字コードをUTF8に設定
connection.query("set character set utf8")

# DBに問い合わせ
rs = connection.query("SELECT * FROM users")

# 検索結果を表示
rs.each do |r|
  puts r.join ", "
end

# コネクションを閉じる
connection.close
```
---
追記
**mysqlのgemのインストールでエラーが出た場合はこちらが参考になるかと思います。**
http://qiita.com/azusanakano/items/329cbf517797ade2c8b0
Macでtreeコマンド

# インストール
homebrewでさくっとインストールできるので結論から。

```bash
$ brew install tree
```

これだけです。
環境は

+ Mac OS X 10.7.5
+ Homebrew 0.9.5

です。
homebrewのインストールの仕方は、
以下を参照して下さい。
[Macにhomebrewを入れる](http://qiita.com/kanuma1984/items/a0e3067b9d1331c9ba70, "homebrew")


# treeコマンド
その名の通り、

「ディレクトリ配下のファイル構造をツリー上に表示する」

コマンドです。
見た方が分かりやすいと思います。

```text
$ tree
├── Vagrantfile
└── provisioning
    ├── inventory
    │   └── local
    └── roles
        └── nginx
            ├── tasks
            └── templates
```

階層が深いところを把握するのに便利です。
pushStateとAjaxの組み合わせpjax


site: http://develo.org/2014/04/29/1614.html


サイトをpjaxを使って実装して思ったのですが、ページ移動がものすごくはやくて快適！今後サイト新しく作るときはpushStateとAjaxの組み合わせ検討してみてもよいかなぁって思いました！

pushStateとは
---
Ajaxなどで、非同期なサイトを作る際に、
アドレスが変更されない問題をjsで解消してくれる便利なやつです。
少し前の話だとFlashサイトを作るときに#（ハッシュ）をつけてurlを管理したりしていました。
pushStateを使うと普通にページ遷移しているようにアドレスを変更することができます！


Ajaxとは
---
ページを遷移せずに情報だけを非同期でとってきてサイトに描画する仕組みのことです。


pjax
---
pushStateとAjax 2つを合わせてつくった仕組みのことです。

実際に作るにあたり
---
下記を参考にさせていただきました。
jquery-pjaxというプラグインを使うと簡単に実装することができます。

* [pushState / popStateの解説とQrefyにおける実践コード](http://s3pw.com/milestoner/2012/08/pushstate-popstate/)
* [defunkt/jquery-pjax](https://github.com/defunkt/jquery-pjax/)


使い方
---
下記のような感じで実行するだけで実装できます。

	$(document).pjax('a', {
		container:'main',  // 現在のページの置き換えたいエリアのタグを指定
		fragment: 'main', // 読み込み先ページの置き換えたいエリアのタグを指定
		timeout: 30000 // タイムアウトする時間（タイムアウトした場合は通常のリンクでの移動になります。）
	});


このコードは「a」タグをクリックした時に現在のページのmain要素部分を、読み込み先のhtmlのmain要素に置き換える。といった動きになります。

timeoutを設定しているのはプラグインの初期のtimeout設定が650msと少し短いため3秒はtimeoutしないように指定しなおしています。

### ローディング時の処理をする。
#### pjax:send
ajaxの処理が始まった時点で実行されます。
この時にローディング時の処理をかきます。

	$(document).on('pjax:send', function(e) {
		$('body').addClass('loading');
	});

#### pjax:complete
ajaxの処理が終わった時点で実行されます。ローディングが終わった時の処理をかきます。

	$(document).on('pjax:complete', function(e,data) {
		$('body').removeClass('loading');
	});

こんな感じで書くと実装できるので、割と簡単ですね！

応用
---
### CSSシグネチャを使っている場合の対処法

CSSシグネチャというのはbodyにclassやidをつけてcssで管理する方法です。

pjaxのプラグインを使うと指定エリア外のbodyのclassやidは変更してくれません。そのためページごとのCSSが反映されないという現象がおきてしまいます。

#### 解決方法 : pjax:complete時にbodyの属性を変更する

読み込み先のテキスト情報を元に、範囲指定して特定のテキストを取得する正規表現を使いbodyの情報を変更します。（[特定の文字列から文字列の範囲内の文字を取得する正規表現](http://develo.org/2014/04/24/1219.html)）

RegExp.$1で最初にマッチした値を取ってくることができます。

	$(document).on('pjax:complete', function(e,data) {
		var data = data.responseText;	//2つ目の引き数のresponseTextの中身に読み込みさきのtextデータが含まれています。

		//responseTextの内容を正規表現を使うことによりbodyのclassとidを変更する。
		//bodyのID
		data.match(/id="([^\"]+)/);
		var value = RegExp.$1;
		$('body')[0].id = value;
		//bodyのClass
		data.match(/class="([^\"]+)/);
		value = RegExp.$1;
		$('body')[0].className = value;
	});

こんな感じでプラグインで指定した範囲以外のタグも変更することができます。これを使
えば、keywordsやdescriptionやogタグを変更することもできます。

ブラウザバック時の再読み込み
---
ブラウザバック時にcssシグネチャを使っていると同じ現象がおきてしまいます。

なので・・どうしようと迷ったのですが・・。

ブラウザバック時、キャッシュを読みにいく処理が入っているようで、その部分を変更しブラウザバック時にも再度読み込み直すようにプラグイン事態を変更しちゃいました。何か他にプラグインを変更せずにすめば良いと思ったのですが・・。

440 〜 450行目あたりをコメントアウトして変更しちゃいます。

	/*
		if (contents) {
			container.trigger('pjax:start', [null, options, contents])

    	    if (state.title) document.title = state.title
			container.html(contents)
			pjax.state = state

			container.trigger('pjax:end', [null, options, contents])
		} else {
			pjax(options)
		}
	*/
	pjax(options)


こんな感じでキャッシュがある場合はキャッシュを使って変更している部分を毎回読み込むように変更しちゃいます！

これでひと通りCSSシグネチャを使った場合でもpjaxプラグインで実装することができました！
Force.com チューニング まとめ


Salesforce.com

* [大量データを扱う際のクイックTips 公開]
(http://blogjp.sforce.com/2014/01/tips-65a9.html)

* [Best Practices for Deployments with Large Data Volumes]
(https://developer.salesforce.com/page/Best_Practices_for_Deployments_with_Large_Data_Volumes)

* [Long- and Short-Term Approaches for Tuning Force.com Performance]
(https://developer.salesforce.com/blogs/engineering/2013/03/long-and-short-term-approaches-for-tuning-force-com-performance.html)

* [Query & Search Optimization Cheat Sheet]
(http://help.salesforce.com/help/pdfs/en/salesforce_query_search_optimization_developer_cheatsheet.pdf)

***

TerraSky TECH BLOG

* [「Force.com マルチテナントアーキテクチャ」を理解して、スキニーテーブルを使ってみよう]
(http://www.terrasky.co.jp/blog/?p=6004)

* [SOQLの実行計画を取得してクエリのパフォーマンスを向上させよう]
(http://www.terrasky.co.jp/blog/?p=5985)

***
「プログラムでシダを描画する」をDartで描画する

こちらの記事の

[プログラムでシダを描画する - 強火で進め](http://d.hatena.ne.jp/nakamura001/20140505/1399316565)

で、Processingにてシダの描画を行っていたので、同じものをDartで書いてみました。

Chromeで実行した結果を先にお見せしますと、こうなります。

![スクリーンショット 2014-05-23 9.39.29.png](https://qiita-image-store.s3.amazonaws.com/0/636/cad62971-7deb-edbe-5b45-2b30addef429.png)

美しい。

コードは以下のようになります。

```yaml:pubspec.yaml
name: shida
dependencies:
    browser: any
```

```html:shida.html
<!-- Google の HTML Style Guide 的な省略方法 -->
<!DOCTYPE html>
<title>シダ</title>
<canvas id="canvas" width="500px" height="500px"></canvas>
<script type="application/dart" src="shida.dart"></script>
<script src="packages/browser/dart.js"></script>
```

```dart:shida.dart
import 'dart:math';
import 'dart:html';

CanvasRenderingContext2D ctx;
const int width = 500;
const int height = 500;

int N = 20;
num xm = 0;
num ym = 0.5;
num h = 0.6;

Random random = new Random();

num W1x(num x, num y) {
  return 0.836 * x + 0.044 * y;
}

num W1y(num x, num y) {
  return -0.044 * x + 0.836 * y + 0.169;
}

num W2x(num x, num y) {
  return -0.141 * x + 0.302 * y;
}

num W2y(num x, num y) {
  return 0.302 * x + 0.141 * y + 0.127;
}

num W3x(num x, num y) {
  return 0.141 * x - 0.302 * y;
}

num W3y(num x, num y) {
  return 0.302 * x + 0.141 * y + 0.169;
}

num W4x(num x, num y) {
  return 0;
}

num W4y(num x, num y) {
  return 0.175337 * y;
}

void f(int k, num x, num y) {
  if (0 < k) {
    f(k - 1, W1x(x, y), W1y(x, y));
    if (random.nextDouble() < 0.3) f(k - 1, W2x(x, y), W2y(x, y));
    if (random.nextDouble() < 0.3) f(k - 1, W3x(x, y), W3y(x, y));
    if (random.nextDouble() < 0.3) f(k - 1, W4x(x, y), W4y(x, y));
  } else {
    num s = 409;
    point(x * s + width * 0.5, height - y * s);
  }
}

void point(num x, num y) {
  ctx.fillRect(x, y, 1, 1);
}

main() {
  CanvasElement canvas = document.query('#canvas');
  ctx = canvas.getContext('2d');
  ctx.fillStyle = 'rgb(0, 128, 0)';

  f(N, 0, 0);
}
```
[Objective-C] 使い捨てのCoreData Entity（インスタンス）を生成する方法


## 要望

CoreDataの`NSManagedObject`のサブクラスのインスタンスを使ってコンテンツを表示したいが、データとしては保存したくない、というケースのお話。

通常のクラスであればデータを渡してインスタンス化すれば済む話ですが、CoreDataの場合は色々とセットアップがいるし、Entityを取得した時点でレコードが生成されてしまうのでどうしたもんかなーと思っていたところ、以下の記事を発見。

[Use NSManagedObject class without initWithEntity:?](http://stackoverflow.com/questions/8139033/use-nsmanagedobject-class-without-initwithentity)

そもそも、そういう欲求が出ることは設計に問題があるのかもしれませんが、現時点では上記のやり方でやってみようかなと思っています。
ということで、使い捨ての`NSManagedObject`インスタンスを生成する方法をメモしておきます。

結論から言うと、（Stack overflowから引用させてもらいます）

>Just use initWithEntity:insertIntoManagedObjectContext: and pass a nil context, then call insertObject: in your NSMAnagedObjectContext when you are ready:

*`initWithEntity:insertIntoManagedObjectContext:` に `nil context`を渡して、`NSManagedObjectContext` の `insertObject:`メソッドを呼びます。*

ということです。

記載されているコードを紹介させてもらうと、以下のようになります。

```objc
// 対象となるEntityから、`NSEntityDescription`のインスタンスを生成
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModelClass" 
                                          inManagedObjectContext:myContext];

// 生成したdescriptionを元にNSManagedObjectのサブクラスをインスタンス化、
// さらに挿入先のcontextをnilに設定する
id object = [[MyModelClass alloc] initWithEntity:entity
                  insertIntoManagedObjectContext:nil];
```


## サンプル

今回も[サンプルをGithub](https://github.com/edom18/CoreDataSample)にあげてあります。
Eclipseで複数行を一括コメントアウト

Mac上で動作するEclipseにおいて、複数行を一括でコメントアウトする方法です。

1. 複数行選択
2. Command + /

以上です。
なお、コメントアウトされている行でおこなうと解除できます。
Windowsの場合は Ctrlキーのようです。
二次元配列の表から指定されたIDの行を見つけ出したい

業務で頻発するのですが、以下のような場合ですね。

```php
<?php

// 表
$users = [
  ['id' => 1, 'name' => '長宗我部'],
  ['id' => 2, 'name' => '勅使河原'],
  ['id' => 3, 'name' => '小比類巻']
];

// 見つけ出したいID
$id = 2;

foreach ($users as $user) {
  if ($user['id'] == $id) {
    echo $user['name']; break;
  }
}
```

```text:結果
勅使河原
```

配列系の強いPHPならもっとシンプルに書けると思うのですが、頭が固くで思いつきませんでした。

良い書き方がありましたら教えてくださいm(__)m
ubuntuで認証プロキシ配下からapt-keyを使うとき

UbuntuにDockerをインストールする際（[Docker installation Ubuntu Precise 12.04 (LTS) (64-bit)](http://docs.docker.io/installation/ubuntulinux/#ubuntu-precise-1204-lts-64-bit)）など、Ubuntu公式以外のリポジトリからパッケージを取得するためには、そのリポジトリを認証する鍵情報をローカルキーチェーンに取り込んでおく必要があります。

そのためapt-keyコマンドを用いるのですが、Proxy配下からだと上手く動きません。

```bash:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.41spwm8Ez8 --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
gpg: 鍵A88D21E9をhkpからサーバーkeyserver.ubuntu.comに要求
gpgkeys: key 36A1D7869245C8950F966E92D8576A8BA88D21E9 not found on keyserver
gpg: 有効なOpenPGPデータが見つかりません。
gpg: 処理数の合計: 0
```

このような場合、--keyserver-optionを使うと幸せになれます。

`--keyserver-option http-proxy=http://<アカウント>:<パスワード>@プロキシサーバ:ポート`

```bash:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://x:y@proxy:port --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.oqJcUg9wwq --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://x:y@proxy:port --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
gpg: 鍵A88D21E9をhkpからサーバーkeyserver.ubuntu.comに要求
gpg: 鍵A88D21E9: 公開鍵“Docker Release Tool (releasedocker) <docker@dotcloud.com>”を読み込みました
gpg: 処理数の合計: 1
gpg:               読込み: 1  (RSA: 1)
```
Rails コンソールで初期データを投入する


**環境**
Target: http://api.cloudnpaas.com (v0.999)
Client: v0.3.23.5

下記の手順でクラウド・エヌ（PaaS）で動いている Rails アプリに初期データを投入しました。

```ruby:console
# 接続
udn rails-console <appname>

# 消したければ
# Post.delete_all

load File.expand_path 'db/seeds.rb'
Post.count # 確認
```
配列のコピー・削除・列挙

#配列のコピー

代入だと配列の要素のコピーはしない。
なのでそのまま値が上書きされてしまう。

```js
var arr = [3,4,5];
var arr2 = arr;
arr2[0] = 123; 
alert(arr);//123,4,5
```

配列をコピーする場合はcancatメソッドか、sliceメソッドを使う。

##concatでの配列コピー

```js
var arr = [3,4,5];
var arr2 = [].concat(arr); //配列コピー

arr2[0] = 123;
alert(arr); //3,4,5のまま（上書きされてない）
```

##sliceでの配列コピー

```js
var arr = [3,4,5];
var arr2 = arr.slice(0, arr.length); //配列コピー

arr2[0] = 123;
alert(arr); //3,4,5のまま（上書きされてない）
```

#配列の削除
delete演算を使う。
削除した要素には隙間ができてしまうのでspliceメソッドを使う。

```js
var arr = ['foo','bar','baz'];
delete arr[1];
alert(arr); //foo,,baz (空白が残る)

arr.splice(1,1); //インデックス１番目から1つの要素を削除
alert(arr); //foo,baz
```

#配列の要素の列挙

##for文の場合

```js
var arr = ['foo','bar','baz'];
for(var i = 0, len = arr.length; i < len; i++) {
    alert(arr[i]);
}
```

##forEachメソッド

```js
var arr = ['foo','bar','baz'];
//e:要素値
//i:インデックス値
//a:配列オブジェクト
arr.forEach(function(e,i,a) { alert(e+i); });
//foo0
//bar1
//baz2
```
色々な改行コード変換の方法

# 改行コード変換のメモ
CRLFとLFだけ。さすがにCRだけのものはあまりないでしょう。

## 環境
* CentOS release 6.5 (Final)

## nkf
みんな大好きnkfコマンド。--helpでオプションを確認しましょう。

```
$ nkf --help 2>&1 | grep CRLF
d,c      Convert line breaks  -d: LF  -c: CRLF
-L[uwm]  line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
```

unix -> dos は -Lw(win) で、dos -> unix は -Lu(unix) です。

```
$ file unix.txt dos.txt
unix.txt: ASCII text
dos.txt:  ASCII text, with CRLF line terminators

$ nkf -Lu dos.txt > dos2unix.txt
$ nkf -Lw unix.txt > unix2dos.txt

$ file dos2unix.txt unix2dos.txt
dos2unix.txt: ASCII text
unix2dos.txt: ASCII text, with CR line terminators
```

## dos2unix, unix2dos
いかにも dosからunixに変換してくれるっぽいコマンドもあります。
これらのコマンドは、引数にファイルを指定すると、ファイルの改行を書き換えて保存してしまいます。便利ですが、パイプで渡してあげる方がUNIXの流儀っぽいです。

```
$ cat dos.txt  | dos2unix > dos2unix.txt
$ cat unix.txt | unix2dos > unix2dos.txt
```

## perl, ruby
perlもrubyもワンライナーだとほとんど同じですよね。

```
$ perl -pe 's/\r//'     dos.txt  > dos2unix.txt
$ perl -pe 's/\n/\r\n/' unix.txt > unix2dos.txt
```

```
$ ruby -pe 'sub("\r", "")'     dos.txt  > dos2unix.txt
$ ruby -pe 'sub("\n", "\r\n")' unix.txt > unix2dos.txt
```

## sed
環境によってはnkfもdos2unixもperlもrubyもインストールされていないかもしれません。でもsedはどのUNIXにも存在します。CRを削るだけなら超簡単です。

```
$ sed "s/\r//g" dos.txt > dos2unix.txt
```

\rと書くよりC-v C-m で制御コードを入れるほうがカッコイイので、私はこちらを多様することが多いです。

```
$ sed "s/^M//g"  dos.txt  > dos2unix.txt
```
複数のRSSに並列リクエスト後マージして返す関数

わりと需要のある機能なのでコピペして使えるように関数化しました。

- <del>ほとんど @Hiraku さんの記事のパクリです。</del>
- RSS2.0に準拠していないXMLが返されてきたときの挙動は未定義です。ちゃんと対応したい場合は全ての必要項目に関して **[isset](http://www.php.net/manual/ja/function.isset.php)** 構文などを用いたチェックが必要です。

```php:関数定義
/**
 * fetch_rss_items
 *
 * @param $urls RSSのURLが記述された1次元配列
 * @return マージして新しい順にソートされたitemの2次元配列(pubDateはtimestampに変換済み)
 * @link http://qiita.com/Hiraku/items/1c67b51040246efb4254
 * @link http://qiita.com/mpyw/items/77288c948b64eab1a3b3
 */
function fetch_rss_items(array $urls) {
    
    /* 0. 配列の初期化 */
    $items = array();
    if (!$urls) {
        return $items;
    }
    
    /* 1. cURLリソースの準備 */
    $mh = curl_multi_init();
    foreach ($urls as $url) {
        $ch = curl_init();
        curl_setopt_array($ch, array(
            CURLOPT_URL => filter_var($url),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 5,
            CURLOPT_CONNECTTIMEOUT => 5,
            CURLOPT_ENCODING => 'gzip', // gzipを使ったほうが高速なので
        ));
        curl_multi_add_handle($mh, $ch);
    }
    
    /* 2. リクエストの開始 */
    while (curl_multi_exec($mh, $running) === CURLM_CALL_MULTI_PERFORM);
    
    /* 3. レスポンスの待機 */
    do switch (curl_multi_select($mh, 5)) {
        
        case -1: /* 失敗 */
            usleep(10);
            while (curl_multi_exec($mh, $running) === CURLM_CALL_MULTI_PERFORM);
        
        case 0: /* タイムアウト */
            continue 2;
        
        default: /* どれかが読み取り可能な状態になった */
            while (curl_multi_exec($mh, $running) === CURLM_CALL_MULTI_PERFORM);
            do if ($info = curl_multi_info_read($mh, $remains)) {
                $xml = curl_multi_getcontent($info['handle']);
                curl_multi_remove_handle($mh, $info['handle']);
                if (!$xml = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)) {
                    continue;
                }
                foreach ($xml->channel->item as $item) {
                    $items[] = array(
                        'title' => (string)$item->title,
                        'description' => (string)$item->description,
                        'link'  => (string)$item->link,
                        'timestamp' => strtotime((string)$item->pubDate),
                        'site_title' => (string)$xml->channel->title,
                        'site_description' => (string)$xml->channel->description,
                        'site_link' => (string)$xml->channel->link,
                    );
                }
            } while ($remains);
            
    } while ($running);
    
    /* 4. タイムスタンプが新しい順にソート */
    usort($items, function ($a, $b) {
        return $b['timestamp'] - $a['timestamp'];
    });
    
    /* 5. 配列を返す */
    return $items;
    
}
```

```php:使用例
print_r(fetch_rss_items(array(
    'http://www.feedforall.com/sample.xml',
    'http://www.feedforall.com/sample-feed.xml',
)));
```
画像圧縮と軽量化のすすめ

## 画像のリサイズ
おすすめはこの2つ！

- Photoshop
- Pixlr

`Photoshop`を使えば間違いない。有料。
`Pixlr`はPhotoshopとほぼ同機能を備えつつ、無料で使える。`ブラウザ上`で使用可。画像加工するならPixlrはかなりおすすめ。文字の加工に関してはPhotoshopに劣る。

## 画像の圧縮
ファイルの拡張子によって違うアプリケーションを使う。

- tinypng：png形式の画像に使える
- JPEGmini：JPEG形式の画像に使える
- Compressor.io：jpg/png/gif形式の画像に使える
  - https://compressor.io/

`tinypng`と`Compressor.io`は`ブラウザ上`で使用可。
`JPEGmini`はAppStoreからダウンロード可。2,000円。簡易版である`JPEGmini Lite`は無料だが、1日20ファイルまでしか使えない。

## 画像のいらない情報そぎ落とし
これがおすすめ。

- Image Optim

Web上からアプリをダウンロードすれば使える。


※以上。他にもおすすめなどあれば教えていただきたいです。
4桁までしかできない FizzBuzz

Fortran でも色々なパターンは出尽くしているので、短めで奇をてらった方法を考えること１時間ｗ　文字列のはみだしを利用。

```fortran
    program FizzBuzz
      implicit none
      character(len=4), parameter :: c3(0:2) = ['Fizz','',''], &
                                     c5(0:4) = ['Buzz','','','','']
      character(len=16) :: buf  
      integer :: i, n = 10000 ! max 10000
      do i = 1, n
        write(buf, '(2a4, a4, i4)') c3(mod(i, 3)), c5(mod(i, 5)), '    ', i
        write(*, '(a8)', advance = 'no'), adjustl(buf)
      end do
    end program FizzBuzz
```
![FizzBuzz.png](https://qiita-image-store.s3.amazonaws.com/0/44522/d488d08d-a247-bc91-72b9-a618dfb5f103.png)
MongoDB (mongoose) で連番をつける


MongoDB には連番のユニークな ID をつける仕組みがありません。
なので自分で実装する必要があります。

以下は User スキーマに連番で id をつける例です。(mongoose 3.8.8以降)

```coffeescript:models.coffee
# モジュールいろいろ
mongoose = require 'mongoose'
Schema   = mongoose.Schema
ObjectId = mongoose.Schema.ObjectId


###
  シーケンス
###
SequenceSchema = new Schema
  name: { type: String }
  seq:  { type: Number }
SequenceSchema.index { name: 1 }
Sequence = db.model('Sequence', SequenceSchema)


###
  ユーザスキーマ
###
UserSchema = new Schema
  id:   { type: Number, unique: true }
  name: { type: String }

# Middleware  ここがポイント！
UserSchema.pre 'save', (next)->

  return next() unless @isNew

  conditions = name: model.collection.name
  update     = $inc: { seq: 1 }
  options    = upsert: true
  Sequence.findOneAndUpdate conditions, update, options, (err, data)=>
    if !err and data
      @id = data.seq
      next()
    else
      next(err || data)
```

このように Middleware (Pre) をセットしておくと、

```coffeescript:app.coffee
user = new User name: 'nariyu'
user.save()
```

とするだけで、連番で id が付きます。

こちらからは以上です。
【Ruby】インストールされている gem を全て削除

他の日本語で説明されている方法ではGemのuninstallが出来なかったので
英語サイトを参考にやってみたら出来ました。

```bash
for i in `gem list --no-versions`; do gem uninstall -aIx $i; done
```
を実行

```bash
Successfully uninstalled actionmailer-3.2.16
Successfully uninstalled actionpack-3.2.16
Successfully uninstalled active_scaffold-3.3.3
Successfully uninstalled active_scaffold-3.3.0
Successfully uninstalled activemodel-3.2.16
Successfully uninstalled activerecord-3.2.16
Successfully uninstalled activeresource-3.2.16
Successfully uninstalled activesupport-3.2.16
Successfully uninstalled addressable-2.3.6
Successfully uninstalled addressable-2.3.5
Successfully uninstalled arel-3.0.3
Successfully uninstalled asset_sync-1.0.0
Successfully uninstalled awesome_print-1.2.0
Removing aws-rb
Successfully uninstalled aws-sdk-1.40.3
Successfully uninstalled bcrypt-3.1.7
Successfully uninstalled better_errors-1.1.0
Successfully uninstalled bigdecimal-1.2.5
Successfully uninstalled binding_of_caller-0.7.2
Successfully uninstalled builder-3.0.4
```
socket.io 1.0 のハンドシェイク（セッション共有）


socket.io 1.0 では connect っぽく middleware として書けるようになりました。

## socket.io 1.0 のハンドシェイク！

`socket.request` で `Request` オブジェクトが受け取れるのでそれを利用します。
（以下、Express 4.x の場合）

```coffeescript:server.coffee
Session = require('express-session').session.Session

COOKIE_SECRET = 'himitsu-dayo'
COOKIE_KEY    = 'sid'

#
# 途中省略
#

# Socket.io
io = require('socket.io')(server)

# セッション共有
io.use (socket, next)->

	# クッキーからセッション ID を取得する
	cookie = require('cookie').parse socket.request.headers.cookie
	cookie = require('cookie-parser/lib/parse').signedCookies cookie, COOKIE_SECRET
	sessionID = cookie[COOKIE_KEY]

	# セッション情報を取得する
	sessionStore.get sessionID, (err, sessionData)->

		# セッション情報の取得成功！
		if !err and sessionData

			# 新しく Session を作成
			socket.session = new Session({sessionID: sessionID, sessionStore: sessionStore}, sessionData)
			next()

		# セッション情報の取得失敗 :(
		else
			next if err then err.message else 'ハンドシェイク失敗だよ！'

# 接続
io.on 'connection', (socket)->

	# セッション！
	session = socket.session 

	#
	# 以下いろいろ
	# 
```

※ 0.9 までの `connect.utils.parseSignedCookies` は使えなくなったようです。 `cookie-parser` モジュールを使いましょう。


### ちなみに・・・ socket.io 0.9 までのハンドシェイクは

0.9 までは下のように、 `io.set('authorization', fun);` のように書いていました。

```coffeescript:server.coffee
io.set 'authorization', (handshakeData, callback)->
		
	# クッキーからセッション ID を取得する
	cookie = require('cookie').parse decodeURIComponent handshakeData.headers.cookie
	cookie = connect.utils.parseSignedCookies cookie, COOKIE_SECRET
	sessionID = cookie[COOKIE_KEY]

	# セッション情報を取得する
	sessionStore.get sessionID, (err, sessionData)->
			
		# セッション情報の取得成功！
		if !err and sessionData

			# 新しく Session を作成
			handshakeData.session = new Session sessionID: sessionID, sessionStore: sessionStore, sessionData
			callback(null, true)

		# セッション情報の取得失敗 :(
		else
			callback (if err then err.message else 'ハンドシェイク失敗だよ！'), false 

#
# 以下省略
# 
```

並べてみるとあまり変わらないように見えるけど、 middleware として書けることでセッション共有以外にもいろいろやりやすくなったと思います。

私のプロジェクトではハンドシェイクの後に middleware でユーザ情報を取り出したりとか書いたりしてます。


## Store

タイトルのハンドシェイクとはあまり関係ないけど Store についても軽く触れておきます。

別のプロセスやサーバ間で共有するための store は Adapter という仕組みで実現します。

0.9 までは `socket.io` に `Redis` 用のクラスが最初から用意されてたけど、1.0 (pre4) では用意されてないようです。

現状、 `Redis` を使う場合は別の開発者の `socket.io-redis` がよさそうです。

こんな感じで、

```coffeescript:server.coffee

# Redis アダプタ
RedisAdapter = require('socket.io-redis')(host: 'localhost', port: 6379)

# Socket.io
io = require('socket.io')(server, { adapter: RedisAdapter })
```

ソースを軽く覗いたら Pub/Sub とか勝手にやってくれそうな感じ。


## 最後に

<del>この記事はまだ正式リリース前の socket.io 1.0.0-pre5 をベースに書いています。
たぶん正式版でも動く...はず！</del>

1.0.2 で動きました。

こちらからは以上です。
VagrantでCentOS6.xの環境をサクッと用意する

## Ansible勉強のための布石

最近Ansibleで環境構築の自動化をしようと思って、

勉強を始めたのですが複数のホストを勉強用に用意するのも、
Vagrant使えばラクラクですね。

いつも、忘れるので手順をメモ

## Vagrantをインストール

各OSにあった最新版のインストーラーをダウンロードする

http://downloads.vagrantup.com/

ダウンロードしたインストーラーの指示に従ってインストール

インストールが完了するとターミナルからvagrantコマンドが利用出来るようになります。

## プロジェクトフォルダの作成

```
$ mkdir host1
$ cd host1
$ vagrant init
```

CentOS6.4のBoxファイルをローカルのvagrantプロジェクトに追加

```
$ vagrant box add ansible_test https://github.com/2creatives/vagrant-centos/releases/download/v0.1.0/centos64-x86_64-20131030.box
```

※上記リンクがリンク切れの場合は、このサイトから各OSのboxファイルをダウンロード出来ます。

http://www.vagrantbox.es/

追加したBoxファイルを読み込むように設定

```
$ vi Vagrantfile

Vagrant.configure("2") do |config|
    config.vm.box = "ansible_test"
```

## Vagrant経由からVirtual上のCentOSを立ち上げる

```
$ vagrant up
```

動作確認のため、SSHログインします。

```
$ vagrant ssh
```

VMのguest Addtionのバージョンが古いというエラーが出てくる場合は、

下記サイトのプラグインをインストールして最新版にアップデートします

http://blog.csanchez.org/2012/05/03/automatically-download-and-install-virtualbox-guest-additions-in-vagrant/

```
vagrant plugin install vagrant-vbguest
```

今回はインターネットで公開されているboxファイルから、

CentOSをインストールする方法のみの紹介になりましたが、

自分用にカスタマイズしたboxファイルを用意することも出来ます。

では、次回はVagrantを使った複数ホストをAnsibleから立ち上げる所までやってみようと思います。
Mac Safari上でiOS SafariのWebインスペクタを表示

備忘録

#Mac Safari上でiOS SafariのWebインスペクタを表示する方法
「Xcode」がインストールされていれば、端末の代わりに「iOSシミュレータ」を使う事も可能です。

##準備

###Macの設定
「Safari」→「Safari」メニュー→「環境設定」
下部にある「メニューバーに”開発”メニューを表示」をチェックします。

###端末の設定（iOS6以上）
「設定」→「Safari」→「詳細」
「Webインスペクタ」をオンにします。

##使用手順（端末の場合）

###1.
端末とMacをUSBケーブルで接続します。

###2.
確認したいサイトを端末のSafariで表示します。

###3.
「Safari」起動→「開発」→「端末の名前」
端末で開いているサイトのリストから任意のサイトをクリックします。

##使用手順（Xcodeの場合）

###1.
確認したいサイトを「iOSシミュレータ」で表示します。

###2.
「Safari」起動→「開発」→「iPhone Simulator」
「iPhone Simulator」で開いているサイトのリストから任意のサイトをクリックします。

参考URL
https://developer.apple.com/jp/safari/tools/
Elasticsearch の Kuromoji でユーザー辞書を使う

Elasticsearchでの形態素解析はKuromoji一択だけど、やや辞書が貧弱な部分もある。

例えば東京に「西国分寺駅」という駅があるけど、「西国分寺」で形態素解析すると「西」「国分寺」で分かれる。
読みも「サイコクブンジ」となってしまう。（正しくは「ニシコクブンジ」）

なので、ある程度ユーザー辞書で補いたいと思う。

## 参考になったサイト
- [elasticsearch-analysis-kuromojiでユーザ辞書の利用方法](http://johtani.jugem.jp/?eid=123)
- [Elasticsearch 日本語で全文検索 その２](https://medium.com/hello-elasticsearch/833a0704e44b)

## 環境

- CentOS 6.4
- Elasticsearch 1.1.1
  - kuromoji 2.0.0

<br><br>

## 辞書ファイルの作成

まず辞書ファイルを作成。
普通のテキストファイルで、文字コードは **UTF-8**。拡張子は自由。
ここでは例として「my_jisho.dic」とした。

### **辞書ファイルの置き場所**

ファイルの保存先は
`/etc/elasticsearch/my_jisho.dic`
でいけた。
これはもしかしたら Elasticsearch **1.1.1** だからかも。

<small><i class="fa fa-info-circle fa-lg"></i> 他のサイト等を見ると「(Elasticsearchホーム)/cofig/my_jisho.dic」と書いているところも多かったので、はじめそこに置いてみたんだけどインデックス作成時に「/etc/elasticsearch/ に置け」とエラーが出た。</small>

### **辞書ファイルの書き方**

ファイルの中身はCSV形式で、以下の並びで書く。

```csv
単語,形態素解析後の単語,読み,品詞
```

「形態素解析後の単語」は、半角スペースで分けると分かち書きされる。

<i class="fa fa-lightbulb-o"></i> 「東京スカイツリー」の例

```csv
東京スカイツリー,東京 スカイツリー,トウキョウ スカイツリー,カスタム名詞
```

<i class="fa fa-lightbulb-o"></i> 「西国分寺」の例

```csv
西国分寺,西国分寺,ニシコクブンジ,駅名
```

<br><br>

## インデックスへの設定

サンプル用のインデックス作成

```sh
$ curl -XPUT 'http://localhost:9200/example/' -d '(下のjson)'
```

```json
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "kuromoji": {
          "type": "kuromoji_tokenizer",
          "user_dictionary": "my_jisho.dic" <ここに辞書ファイル
        }
      },
      "analyzer": {
        "kuromoji_analyzer": {
          "tokenizer": "kuromoji",
          "type": "custom",
          "filter": [
            "kuromoji_baseform",
            "pos_filter",
            "greek_lowercase_filter",
            "cjk_width"
          ]
        },
        "yomigana_analyzer": {
          "tokenizer": "kuromoji",
          "type": "custom",
          "filter": [
            "katakana_readingform",
            "cjk_width"
          ]
        }
      }
    }
  }
}
```

解析してみる

```sh
$ curl -XGET 'http://localhost:9200/example/_analyze?analyzer=kuromoji_analyzer' -d '西国分寺'
```

```json:上の結果
{
   "tokens": [
      {
         "token": "西国分寺",
         "start_offset": 2,
         "end_offset": 6,
         "type": "word",
         "position": 1
      }
   ]
}
```

加えて読み仮名の確認

```sh
$ curl -XGET 'http://localhost:9200/example/_analyze?analyzer=yomigana_analyzer' -d '西国分寺'
```

```json:上の結果
{
   "tokens": [
      {
         "token": "ニシコクブンジ",
         "start_offset": 2,
         "end_offset": 6,
         "type": "word",
         "position": 1
      }
   ]
}
```

できた。
cookbook開発環境をchef dkで作成する

# 概要
Chef Development Kit (chef-dk)
https://downloads.chef.io/chef-dk/
https://github.com/opscode/chef-dk
は、chef及びchefの開発ツールをまとめてインストールし、統一されたインタフェースで使えるようにしたものです。
ここでは、chef-dkの大雑把な内容、chef-dkで何が使えるようになるのか、インストールする際の注意点について紹介します。

# chef-dkの内容
chef-dkには、おなじみchef-clientやknife, chef-soloなどの他に、以下の開発用ツールが含まれています。

- Berkshelf : cookbook間の依存関係を管理するツール（cookbook用のbundlerのようなもの）
- Test Kitchen : VMを使ってcookbookの動作テストが行えるツール (VagrantやVirtualBoxは別途インストールする必要あり）
- ChefSpec : VMは使わずにcookbookのユニットテストが行えるツール
- Foodcritic : 静的にcookbookを解析し、文法チェックや望ましくない書き方をしている箇所を検出するツール

上記ツールの他に、cookbookの雛形を作成するツールもあります。

# インストール
http://www.getchef.com/downloads/chef-dk
からMac, Linux(Ubuntu, RHEL), Windows(Comming soon...)用のパッケージがダウンロードできます。

ダウンロード後、ダブルクリックするなりdpkg -iでインストールするなりしてください。

# chef dkの構成
chef-dkは、最近のchefパッケージと同様omnibus-chef形式になっており、chef-dkで使うruby環境をchef-dkの内部に持っています。このため、rubyを別途インストールせずにまたマシンのruby環境を汚さずにchefの開発環境を入れることができます。

Macの場合、/opt/chefdk以下にchefや先ほど挙げた開発ツールの他にruby本体もインストールされ、chefやknife, foodcriticなどのコマンドへの/usr/bin以下にシンボリックリンクが張られます。
簡単に構造を説明すると、

```
/opt/chefdk
      ├── bin # chef, knife, berks, foodcritic, kitchen等chef-dkのコマンド類が置かれ、
      │          /usr/bin/chefにsymlinkが張られる
      ├── embedded
               ├── bin # ruby, rake, bundler, rspecなどの
                           chef-dkのruby環境で使うコマンド類が置かれる
                           (/usr/binにsymlinkは張られない)
```

ここで注意したい点として、/usr/binにchefやknifeなどのコマンドへのsymlinkが張られるため、
すでにgemで上記コマンドを入れている場合は、PATHの設定によってはchefdkのほうのコマンドが使われず、gemで入れたほうが使われてしまうことがあります。which knifeコマンドで確認してみてください。
chefdkの方を使う場合は、gemで入れたchefを消すか、/usr/bin以下が優先して使われるようにPATHの設定を変えてみてください。

# chefコマンド
chef dkをインストールすると、chefコマンドが使えるようになります。
githubのREADMEによると、このコマンドはcookbookの開発・テスト・イテレーションを簡単に行えるようにためのコマンドになるようです。
今のところchefコマンドで可能なのは以下の通りです。詳細はgithubのREADMEを見てください。

##### chef generate
cookbookやrecipe, LWRP等を雛形から作成できます

##### chef gem
前述の通りchef-dkはruby環境をその内部に持っています。そのruby環境にgemを入れたり消したりするためのコマンドがchef gemです。
このコマンドでインストールしたgemは~/.chefdk/gem以下にインストールされます。

##### chef exec
chef dk内部のruby環境にPATHを通してコマンドを実行するためのコマンドです。
主な用途として、chefspecがあります。
chef dkにはchefspecが入ってはいるものの、chef dkのruby環境にインストールされたrspecからしか使えません。
さらに/usr/binにはそのrspecへのsymlinkは張られていないため、chefspecを使いたい場合は、
/opt/chefdk/embedded/bin/rspecを直接叩かなくてはいけませんでした。
https://github.com/opscode/chef-dk/issues/18
chef execコマンドはchefdk内のrubyやgem環境にPATHを通してコマンドを実行するため、
chef exec rspecと打ってやれば、chefspec入りのrspecが使えるようになります。
rspecだけでなく、chefdk内のrubyを使って何かしたい場合にも使えます。
\xC2\xA0がインサートできない


postgresでノーブレークスペースがインサートできなくて困ったのでメモ。

##状況
phpの開発でpostgresを利用し、ckeditorで編集した文字列を突っ込もうとしたらこんなエラーがでた。

```
character 0xc2a0 of encoding "UTF8" has no equivalent in "EUC_JP"
```

原因はデータベースの文字コードがEUC-JPでphp側がUTF-8だったため。
エディタで編集した時にノーブレークスペースが混ざり、
postgresが自動エンコードする際にエラーが出てしまい、Insertできなかった。postgresの仕様でこの仕様自体は変更できない模様。

##解決方法
php側でEUC-JPに変換するのは面倒臭かったので、
ノーブレークスペースを半角スペースに変換することを思いついた。

使うのはこの関数
[mb_ereg_replace](http://www.php.net/manual/ja/function.mb-ereg-replace.php)

マルチバイトで判定して置換してくれる！めったに使わないだろうけど、あってよかった！



インサートしたいデータをこんなかんじで置換する。

```
$str = mb_ereg_replace(“\xC2\xA0″, “　”, $str);
```

めでたくインサート出来ました！
HHKBとかを繋いだ iMac でターゲットディスプレイモード (TDM)

iMac を MacBook Pro の外部ディスプレイとして使いたい
---------------

iMac にはターゲットディスプレイモード (TDM) という機能があるのでこれを利用。

### iMac のターゲットディスプレイモードについて

* **Mini DisplayPort ケーブル** か **Thunderbolt ケーブル** で Mac 同士を接続する
    + ケーブル種類は iMac の世代によって変わるので注意が必要
    + ref.) [Target Display Mode：よくお問い合わせいただく質問 (FAQ)](http://support.apple.com/kb/HT3924?viewlocale=ja_JP&locale=ja_JP#4)
* iMac 側で `command + F2` or `command + Fn + F2` で TDM にすることができる

問題
----------------

iMac の純正キーボードではなく HHKB を使っているせいか、`command + F2` や `command + Fn + F2` を押しても TDM に切り替わらない。

たぶんこれにあたる。

> **他社製のキーボードまたは古い Apple Keyboard を使って TDM を有効にできますか?**
> 
> 一部の古い Apple Keyboard や他社製キーボードでは、「command」キーを押しながら「F2」キーを押すことでディスプレイモードを切り替えることができない場合があります。この場合、TDM の切り替えには、アルミニウム製の Apple Keyboard (USB 接続またはワイヤレス) を利用してください。
>
> [Target Display Mode：よくお問い合わせいただく質問 (FAQ)](http://support.apple.com/kb/HT3924?viewlocale=ja_JP&locale=ja_JP#7)

対策
----------------

**KeyRemap4MacBook** で F2 キーを **Brightness Up** にバインディングしたらなぜかいけた

![ 2014-05-22 22.50.20.png](https://qiita-image-store.s3.amazonaws.com/0/3189/3b0407be-4530-aa8e-3544-a11d03eb4f50.png)

Ref.
----------------

* [Target Display Mode：よくお問い合わせいただく質問 (FAQ)](http://support.apple.com/kb/HT3924?viewlocale=ja_JP&locale=ja_JP#4)
* [KeyRemap4MacBook - OS X用のソフトウェア](https://pqrs.org/macosx/keyremap4macbook/index.html.ja)

### 今回の環境

* iMac 27inch 2011 Mid
* MacBook Pro Retina 15inch 2013 Late (ME294J/A)
* Apple Thunderbolt ケーブル（0.5 m）(MD862ZM/A)
* HHKB Professional JP (PD-KB420B)
PhantomJSでAjax結果を取得する


PhantomJSを使って、Ajaxにコールした結果を取得する方法のメモ。

通常は、直接[Echo](http://echoapp.net/)とかで確認すれば良いと思うのですが、事前にログイン処理をする必要があったり、条件が複雑だったりする場合、PhantomJSでテストできるのはありがたいところです。

(ちなみに、`url = '#'`にしておくと、ページ自身のソースコードを取得できます。PhantomJSには、素のHTMLソースコードを取得するメソッドが用意されていないため、これはこれで便利)


```coffeescript
page = (require 'webpage').create()
url = '#'

page.open "http://localhost:3000/", ->
  page.evaluate (url) ->
    $.ajax url: url, success: (str) -> window.ajaxResult = str
  , url
  timer = ->
    result = page.evaluate -> window.ajaxResult
    unless result
      window.setTimeout timer, 500 # 500ms ごとにポーリングして確認
    else
      console.log result
      phantom.exit()
  timer()
```


もっと、きれいな書き方があるような気がしますが、`oncallback`は experimental の位置づけで、今後メッセージングを主体とした方法がPhantomJSに実装される(らしい)ので、とりあえずの確実な方法として。

- [API Reference WebPage #onCallback](https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#oncallback)
IntelliJでAndroidアプリをGenymotionで起動


##前提
IntelliJIDEAでAndroidアプリやろうとしてたら、エミュレータがひどく、動かない。私のマックが４年前のAirなのは内緒です。

##What?
Genymotionっていうのはこれです。
[genymotion](http://www.genymotion.com)

##参考
[Genymotion で Android の超爆速エミュレータ環境を構築する](http://dev.classmethod.jp/smartphone/android/genymotion-install/)
>起動までも非常に速いですし、動作もサックサクでまさに超爆速！です。

4年前の僕のヤツでも爆速なのかと半信半疑で試してみます。

##今回の環境
| ソフトウェア | バージョン |
|:-----------|------------:|
| MacOS | 10.9.3 |
| VirtualBox |4.3.4 |
| Genymotion |2.2.0 |
| IntelliJIDEA |13.1 |


##インストールなど
ほぼ[参考記事](http://dev.classmethod.jp/smartphone/android/genymotion-install/)の通りで。
IntelliJのプラグインも参考記事とおりです。（記事ではAndroidStudioですが同じことです）

##設定画面
ほんのちょっと迷った？ところだけ
####SDKフォルダ指定（私の場合）
![geny1](http://f.cl.ly/items/361n1d1b3J0a463h3F3U/geni1.png)

####ここのこと（私の場合）
![geny2](http://f.cl.ly/items/2M3X1P1a342X2y2d1c3Y/geni2.png)

####VirtualBox(私の場合）
![geny3](http://f.cl.ly/items/3Q1A22171h3g2U1P1Y0B/geni3.png)


##結果
![geny4](http://f.cl.ly/items/2o003E2S0Q2d0S1B0v0y/geni4.png)


##結論
昨日デフォルトエミュレータでは起動すらしなかったのに比べると感動的なくらいにはやいです。

どうしても実機が無い方は迷わずこちらかと。
もちろん参考記事にもある通り、Eclipseでも大丈夫です。
こっちもプラグイン入れるだけ。

VirtualBoxの勢いを感じますね。
絶対入れとくべきものになってますね。

私のVirtualBoxもずいぶん入ってます。
（自分で把握しきれません）
![geny5](http://f.cl.ly/items/292x1n253S1V3F1v0x47/geni5.png)
今からAndroid開発を始めるなら


EclipseではなくAndroid Studioですよね！

僕個人としてはもともとEclipseを使って開発していましたが、最近になってようやくAndroid Studioを使うことにしました。
そのときに読んだ資料をまとめておきます。

## Andriodの開発を学ぶなら

そもそもAndroid開発をしたことがない方は、とりあえずこれを読んで何となくでも知っておきましょう。

* [mixi-inc/AndroidTraining](https://github.com/mixi-inc/AndroidTraining)

## Android Studioを学んでいく

Androidの開発が何となく把握できたらAndroid Studioを学んでいきます。

大枠の思考としては
1. Android Studioってどんなもの？
2. その中で使われているGradleってどんなもの？
3. Android Studioをより詳しく知っていこう！
といった感じです。

↓↓それではどうぞ！！順に見ていくと理解も進むかと思います！↓↓

* [僕がEclipseをやめてAndroid Studioを使っている10の理由](http://blog.nkzn.info/entry/2014/03/21/015914)  
まずはこれを読んで一般的に開発で使用するEclipseとの違いをざっくりと把握します。
* [Gradle入門 - Qiita](http://qiita.com/vvakame/items/83366fbfa47562fafbf4)  
頻繁に出てくる単語である「Gradle」について調べます。Gradleの具体的な記述方法なども学んでいきます。
* [Android Studio最速入門～効率的にコーディングするための使い方](http://gihyo.jp/dev/serial/01/android_studio)  
全44回と大作ですが非常にわかりやすくまとめられています。

ここまでくればとりあえずAndroid Studioを使って開発が進められる段階になるかと思います。
この先はシチュエーションに応じて調べながらAndroidしていきましょう！