OmniAICreator/Qiita-1.07M huggingface dataset:
Singleton何が悪いの？

グローバル変数だから？なぜ？
アプリケーションに１つだけ存在すればよい設定値オブジェクトとか、アプリケーションに１つだけのコンテキスト情報とかに使っちゃだめ？

よくわからなかったので調べてみた。

## 参考

* [シングルトンの賢い使用法@developerWorks](http://www.ibm.com/developerworks/jp/webservices/library/co-single.html)
* [ワタシはSingletonがキライだ](http://www.slideshare.net/kaniza1/singleton-22311254)
* [例えば, Singleton を避ける](http://blog.yuyat.jp/archives/1500)
* [シングルトンについて思うこと](http://beinteractive.jp/shingurutonnitsuitesi-ukoto)
* [僕はアダム、シングルトン中毒から回復したんだ](http://tech.a-listers.jp/2011/05/06/i-am-adam/)
* [オブジェクト指向 - Singleton パターンの使いどころをまとめてみた - Qiita](http://qiita.com/trashtoy/items/eea5dcfb1eb003101cc9)

## 悪い点

[ワタシはSingletonがキライだ](http://www.slideshare.net/kaniza1/singleton-22311254)より
> グローバル変数は悪≒ 密結合は悪
> Singleton は単体テストの敵 

[例えば, Singleton を避ける](http://blog.yuyat.jp/archives/1500)より
> * Singleton では, このガベージコレクションによる状態のクリアが起こらないため, 前のテストコンテキストを引きずったまま, 次のテストを実行することになってしまいます.
複数のテストが影響し合うことによりメンテナンス性が下がるだけでなく, 暗黙的なコンテキストの増大により, 理解もしづらくなります.
* Singleton で実装したクラスそれ自体だけでなく, それを呼び出すクラスにまで, テストのしにくさが伝染してしまう可能性があるのです.

このブログでは説明に *Config* が使われてて、それこそシングルトンに *Config* を使ってたので参考になった。

[シングルトンについて思うこと](http://beinteractive.jp/shingurutonnitsuitesi-ukoto)より
>* サブクラスへの差し替えが困難
* シングルトンを参照するクラスが結果的にシングルトンになる
* ライフサイクルの管理が困難
* 複数インスタンス化出来た方が良い事が分かった際の影響が絶大

こっちでは、 *GlobalContext* クラスで説明。

[僕はアダム、シングルトン中毒から回復したんだ](http://tech.a-listers.jp/2011/05/06/i-am-adam/)より
> * 依存関係を見えにくくし、コードが読みづらくなる。
* ユニットテストを難しくする。外部から渡せないオブジェクトはモックにする事が難しい。
* プログラムの再利用性が低下する。一度しか使わないからとシングルトンで作ってしまうと複数のユーザーから利用されるような場合に対応できなくなる。
* スケーラビリティが低下する。
* 良いオブジェクト指向の設計とは言えない。

## 解決策

* 状態を初期化できるようにする
* 依存性の注入 (Dependency Injection) の利用

## シングルトンの使いどころ

[シングルトンの賢い使用法@developerWorks](http://www.ibm.com/developerworks/jp/webservices/library/co-single.html)より
> クラスが本当にシングルトンであるか否かを決定するためのいくつかの質問があります。

> * すべてのアプリケーションは、まったく同一の方法でこのクラスを使用するか? (「まったく」がキーワード)
> * すべてのアプリケーションは、常にこのクラスの1つのインスタンスのみを必要とするか? (「常に 」と「1つの」がキーワード)
> * このクラスのクライアントは、自分自身がその一部に含まれているアプリケーションを意識しないべきか?

## 雑感

それでも、コンストラクタでインスタンス指定だと、インスタンス作成時に次々に受け渡していかなくちゃいけない。これって密結合じゃないの？とか思う。
でも、わかった次からは設定とかアプリケーション状態でもシングルトンつかわずにやってみるよ。
githubでsubmoduleを含んだdeploy


githubのprivate repositoryで、submoduleを含んだプロジェクトをCapistrano 3でdeployするとき。

## 鍵の問題

githubでは個別のプロジェクトにdeploy keyを登録できるが、同じ鍵を複数のプロジェクトに登録できない。そのため、submoduleに同じ鍵が使えない。
そのため、(a)deploy userを作る(b)プロジェクト毎に鍵をわける、のどちらかが必要。

(a)はdeploy@mydomain.comなどを作成する。

(b)は、以下のように、.ssh/configで別の名前を割り当てれば対処可能。

```
Host repo-foo
  HostName github.com
  User git
  IdentityFile ~/.ssh/foo_key
  IdentitiesOnly yes

Host repo-bar
  HostName github.com
  User git
  IdentityFile ~/.ssh/bar_key
  IdentitiesOnly yes
```

cloneするときは以下。

```
$ git clone repo-foo:username/repository.git
```

see:
http://stackoverflow.com/questions/10628574/problems-with-git-submodules-when-submodules-are-private-github-repos

## Capistrano 3の設定

Capistrano 3ではsubmoduleの設定がないので、追加する必要がある。

see:
http://d.hatena.ne.jp/Dltn/20140528/1401252236
http://stackoverflow.com/questions/23742573/capistrano-submodule-init-and-update-task
node.jsでssl証明書読み込みを判定してhttpとhttpsの切り分けをしてみる。


express4系だとhttpモジュールの呼び出し部分が大分内部に入り込んでてｱﾚだったので、今回のバージョンは3系です。

利用シーンですが

* 本番環境 ssl対応
* デプロイ環境 ssl非対応

という感じで本番のサーバーのみに証明書の情報があるときに使えると思います。

```app.js
var http = require('http');
var https = require('https');
var fs = require('fs');

/*省略*/

  try {   
    var sslOptions = {
      key: fs.readFileSync('/path/to/ssl.key'),
      cert: fs.readFileSync('/path/to/ssl.cert'),
    };
	console.log('httpsで起動');
    var server = https.createServer(sslOptions, app);
  } catch (e) {
    console.log('ssl証明書読み込み失敗 httpで起動');
    var server = http.createServer(app);
  }
  
  server.listen(app.get('port'), function(res){
    if(constants.DEBUG)console.log("Express server listening on port " + app.get('port'));
  });
```

サーバーの情報などで振り分ける方法とかも考えられますけど, fs.readFileSync()のエラーハンドリングのテスト的な意味合いもあるのでとりあえずこれで実装しました。

参考: [node.js - How to capture no file for fs.readFileSync()? - Stack Overflow](http://go.shr.lc/1mWPFRB)
注文詳細APIで取得する閲覧済みフラグ(IsSeen)について

注文詳細API(http://developer.yahoo.co.jp/webapi/shopping/orderInfo.html)で
取得する閲覧済みフラグ[IsSeen]について、常にTrueが返ってくるようです。

テスト環境にて注文を登録した直後にAPIで取得を行いましたが、
Trueが返ってきました。

こちらのフラグについて、Falseが返ってくるのは
どのような状況でしょうか？
Tomcatプラグイン要らずのWAITT maven plugin

JavaでWebアプリの開発というと、EclipseやIntellijのようなIDEでプラグインを使ってローカルのWebappサーバにデプロイするのが一般的かと思いますが、以下のようなケースで面倒です。

* 1つのサーバで運用しようとすると、いろんなアプリを開発するときに多数のWebアプリがデプロイされて起動が重くなる。いちいちアンデプロイするのも面倒。
* 複数のサーバで運用しようとすると、ポートがかぶらないようにするのが面倒。このアプリはポート番号何だっけとなりがち。

そこで、ローカルにTomcatのインストールすることなく、空いてるポートを見つけてEmbed Tomcatをサクッと起動し、そのプロジェクトのwebappを自動デプロイし、ブラウザも起動してくれるMavenのプラグインを作りました。

https://github.com/kawasima/waitt-maven-plugin

使い方も簡単です。pom.xmlに以下のプラグインを追加して、

```xml
<plugin>
  <groupId>net.unit8.maven.plugins</groupId>
  <artifactId>waitt-maven-plugin</artifactId>
  <version>0.2.0</version>
</plugin>
```

プラグイン実行するだけです。

```shell-session
% mvn waitt:run
```

さらに、WAITTプラグインには、自動でCoberturaのInstrumentがされて、カバレッジレポートが自動生成される機能があります。
プロジェクトのソースディレクトリを認識し、その下のクラスだけInstrumentし、レポートを作ります。Instrumentはクラスロード時にオンデマンドでやるので特に使う側が意識することはありません。

http://localhost:8080/coverage (ポート番号は起動環境によって変わります)

にアクセスすると以下のようなレポートが参照できます。

![SnapCrab_NoName_2014-7-16_20-32-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/0f72b5c7-a403-3948-076d-a01efab1fa0b.png)

これで打鍵のテストも、コードのどこを実行したかが瞬時にわかるようになりますね！
momentで時間データの操作を楽にする

http://momentjs.com/
javascriptで時刻操作や表現をしたい場合のライブラリ

# install
```
npm install moment   # npm
bower install moment # bower
```

# 使い方

## 現在時刻を文字列で取得

http://momentjs.com/docs/#/displaying/format/

`format`を使うことで、好きな形式で文字列を得ることが出来る。

```js
var moment = require("moment");

// 現在時刻を取得する例
moment().format(); // 2014-07-16T09:00:00+09:00 (default)
moment().format("YYYY-MM-DD"),           // 2014-07-17
moment().format("YYYY-MM-DD HH:mm:ssZ"), // 2014-07-17 10:00:00+09:00
moment().format("dddd, MMMM Do YYYY, h:mm:ss a") // "Thursday, July 17th 2014, 10:00:00 am”
```


format以外も、色々な形式で取得可能

```
moment().toDate()      // Date型で取得
moment().unix()        // unix timestampで取得
moment().toISOString() // `2014-07-17T10:00:00.964Z` ISO8601 フォーマットの文字列で取得
```

## パース

http://momentjs.com/docs/#/parsing/

`moment()`に文字列などを渡すことで、指定した時刻オブジェクトを生成できる

```js
moment()                       // デフォルト: 現在時刻
moment("2013-02-08T09:30:26")  // 文字列で設定
moment({years: 2013, months: 2, days: 8, hours: 9, minutes: 30, seconds: 26}) // オブジェクトで設定
moment(1404817278000)          // UNIX時間 (ミリ秒)
moment.unix(1404817278)        // UNIX時間 (秒)
moment(new Date(2014, 7,8))    // Date
moment([2014, 7, 8])           // Array
```

設定した値から正しくパース出来ているかは`isValid()`で確認出来る。

```js
moment("not a real date").isValid(); // false
```

## UTC

デフォルトのタイムゾーンはシステム依存。
UTCで取得したい場合は `utc()` を使う。

最初に設定した時刻をUTCに変更も出来るし、
`moment.utc()`を使って、最初からUTCとして時刻を取り扱うことも出来る。

```
moment("2014-03-01 12:00:00").format();       // 2014-03-01T12:00:00+09:00
moment("2014-03-01 12:00:00").utc().format(); // 2014-03-01T00:00:00+09:00
moment.utc("2014-03-01 12:00:00").format()    // 2014-03-01T12:00:00+00:00
```

## 日時操作

http://momentjs.com/docs/#/manipulating/

`add()`などを使って、日時のプラスマイナスを指定することが出来る

```
moment('2014-04-01').add(1, 'days').format()  // 2014-04-02T00:00:00+09:00  (1日後)
moment('2014-04-01').add(-1, 'days').format() // 2014-03-31T00:00:00+09:00 (1日前)
// メソッドチェーンで操作可能
moment('2014-04-01').add(1, 'M').add(2, 'd').format() // 2014-05-03T00:00:00+09:00
```
jsonをcsv(カンマ区切り、項目行あり)に変換する

textareaなどに、JSONの内容をcsvで吐き出したいときなんかに使う。


```:js
function json2csv(json) {
	var header = Object.keys(json[0]).join(',') + "\n";
	
	var body = json.map(function(d){
		return Object.keys(d).map(function(key) {
			return d[key];
		}).join(',');
	}).join("\n");

	return header + body;
}

```


```:js
var a = [
	{id:1, name:"test", address:"tokyo"},
	{id:2, name:"hoge", address:"osaka"},
	{id:3, name:"hello", address:"kyoto"},
	{id:4, name:"world", address:"saitama"}
];


json2csv(a)

//output
id,name,address
1,test,tokyo
2,hoge,osaka
3,hello,kyoto
4,world,saitama
```
sbt-assemblyでjarのファイル名の書式を設定したい


デフォルトでは name-assembly-version.jar の書式になる。
assemblyの部分を取り除いたり、バージョンを取り除いたりしたい。


1) assemblyの文字を取り除く設定


```scala:build.sbt
jarName in assembly := { s"${name.value}-${version.value}.jar" }
```


2) assemblyのプロジェクト名だけにしたい場合

```scala:build.sbt
jarName in assembly := { s"${name.value}.jar" }
```


3) 出力先ディレクトリも含めて設定したい場合

```scala:build.sbt
outputPath in assembly := file(s"out/${name.value}-${version.value}.jar")
```
knife-solo CheatSheet



# knife
knife-soloのよく使うコマンドのチートシート。

- `knife solo init`
- `knife solo prepare`
- `knife cookbook`
- `knife cook`

## solo
description here

### init
Chefレポジトリの作成。

`knife solo init (init_directory)`

```console:
cd path_to_chef_dir
# カレントディレクトリにChefリポジトリを作成
knife solo init .
```

生成されるファイル構成は以下。

```:
init_dir/
├── .chef
│   └── knife.rb
├── cookbooks
├── data_bags
├── nodes
├── roles
└── site-cookbooks
```

### prepare
ゲストOSにオムニバスのChefをインストール

`knife solo prepare user@hostname`

```console:
knife solo prepare user@hostname
```

### cook
Chefの実行

`knife solo cook user@hostname`

```console:
knife solo cook user@hostname
```
## cookbook
cookbook系コマンドの紹介

### show


`knife cookbook show`

```console:
knife cookbook show
```

### list


`knife cookbook list`

```console:
knife cookbook list
```

### create
クックブックの作成。

`knife cookbook create`

```console:
knife cookbook create COOKBOOK_NAME
```

### delete
クックブックの削除

`knife cookbook delete`

```console:
knife cookbook delete COOKBOOK_NAME
```

### test
クックブックの文法をチェック。

`knife cookbook test`

```console:
knife cookbook test COOKBOOK_NAME
```

## Plugins
oh-my-zshのプラグインとしても提供されているので是非利用してみましょう。

```zsh:.zshrc
plugins=(knife chef)
```
日本語とかの全角を半角に変換するawk


```zen2han.awk
# zen2han.awk
# 全角 英数字記号 を半角文字に変換する
# 全角カタカナ等も対象とする。

BEGIN{
	split("０１２３４５６７８９", az, "");
	split("0123456789", ah, "");

	split("ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ", bz, "");
	split("ABCDEFGHIJKLMNOPQRSTUVWXYZ", bh, "");

	split("ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ", cz, "");
	split("abcdefghijklmnopqrstuvwxyz", ch, "");

	split("　～’”：；［］＋－＊／＝！＠＃＄％＾＆＊（）＿｜．，＜＞？￥", dz, "");
	split(" ~'\":;[]+-*/=!@#$%^&*()_|.,<>?\\", dh, "");	# \ は重ねて記述、 

	split("。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜", kz, "");
	split("｡｢｣､･ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟ", kh, "");


	split("ｳｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾊﾋﾌﾍﾎ", kzb, "");
	split("ヴガギグゲゴザジズゼゾダヂヅデドバビブベボ", kzd, "");

	split("ﾊﾋﾌﾍﾎ", kzc, "");
	split("パピプペポ", kze, "");

	#for( e in dh){
	#	if(dh[e]=="(") dh[e] = "\\(";
	#	if(dh[e]==")") dh[e] = "\\)";
	#	if(dh[e]==".") dh[e] = "\\.";
	#	if(dh[e]=="|") dh[e] = "\\|";
	#	if(dh[e]=="^") dh[e] = "\\^";
	#	if(dh[e]=="$") dh[e] = "\\$";
	#	if(dh[e]=="[") dh[e] = "\\[";
	#	if(dh[e]=="]") dh[e] = "\\]";
	#}

}

{	# メインルーチン #
	for(e in az)	gsub(az[e],ah[e]);	# 全角数字を半角に変換
	for(e in bz)	gsub(bz[e],bh[e]);	# 全角英字を半角に変換（大文字）
	for(e in cz)	gsub(cz[e],ch[e]);	# 全角英字を半角に変換（小文字）
	for(e in dz)	gsub(dz[e],dh[e]);	# 全角記号を半角記号へ変換
	for(e in kz)	gsub(kz[e],kh[e]);	# 全角カナを半角カナへ変換

	for(e in kzd)	gsub(kzd[e],kzb[e] "ﾞ");	# 半角カナ + ゛を濁点付の半角カナへ変換
	for(e in kze)	gsub(kze[e],kzc[e] "ﾟ");	# 半角カナ + ゜を半濁点付の半角カナへ変換

	print;
}

# gsub(reg, s [, t])  において、
# 置換テキスト s では、 & は実際にマッチしたテキストで置き換えられる。
# \& を使用するとリテラルの & を得ることができます。
# さらに、"" 内では、"\\" → '\'となるので、 \\ を重ねて記載する必要がある。
#
# 例：	gsub(/＆/,"\\&");
#
# sub() や gensub()でも同様。
```

下記を参考にした。
http://www.geocities.jp/cygnus_odile/tategaki/script-sjis/han2zen.awk.txt
Scala 事始め1 - Option

Java と Scala を比べて、Null を扱うときのあれこれを。

```java:Java
class Something {
  private final String name;

  public Something(String name) {
    this.name = name;
  }
}

class Nice {
  @Nullable Something getSomething(boolean hoge) {
    if (hoge) {
      return new Something();
    } else [
      return null;
    }
  }
}

public class Main {
  public static void main(String[] args) {
    Nice nice = new Nice();
    Something something = nice.getSomething(false);
    if (something == null) {
       System.out.println("null");
    } else {
       System.out.println("not null");
    }
  }
}
```

Scala だと。

```scala:Scala
case class Something(name:String)

object Nice {
  def getSomething(hoge:Boolean):Option[Something] = {
    if (hoge) {
      Some(Something("hogehoge"))
    } else {
      None
    }
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    Nice.getSomething(hoge = false).map { _ =>
      println("not null")
    }.getOrElse {
      println("null")
    }
  }
}

```

分岐がなくて気持ちいい。
ApiGen.phpでエラーが出るときの回避方法


PHPのドキュメンテーションツールとしてAPiGenを使い始めました。

http://apigen.org/

公式ページではPEARのインストール方法が書いてあってｳｯってなったんですが、Githubのページを見るとComposerもサポートしている様子。

でComposerからインストールして実行。

```
$ ./vender/bin/apigen.php --source=/path/to/source --destination=/path/to/dest
```

すると、


```
Call to undefined method: Latte\Template::getFile()
```

というエラーが出て生成の途中で止まってしまいます。
どうやらnetteが古いらしく、netteもrequire-devに追記して新しいものを使うようにすると上手く行きます。

```
{
    "require-dev": {
       "apigen/apigen": "2.*",
       "nette/nette": "~2.1.3"
    }
}
```

issusesにも上がってた。。。

https://github.com/apigen/apigen/issues/292

このまんまです。
しかし、neon記法がよくわからない。。。
指定ディレクトリの中の指定ファイル名で最新のファイルパスを返却する

指定ディレクトリの中の指定ファイル名で最新のファイルパスを返却する。

```zsh:find.zsh
find {{指定ディレクトリ}} -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | grep {{ファイル名}} | tail -1 | gawk '{print \$NF}'
```
WordPress TypeWriter プラグインで改行を消す方法

## TypeWriterプラグインとは

WordPressでMarkdown記法が使えるようになるプラグインです。
投稿画面が非常に簡素になります。

## 問題点

<p>タグで改行がそのまま残ります。句読点で改行して
いる分には構いませんが、そうでないところで改行すると
スペースが入ってしまいます。

## 改善策

public_html/blog/wp-content/plugins/typewriter/includes/markdown/Michelf

にあるMarkdown.phpで154行目に

```php:
$text = preg_replace('/([^\n])\n([^\n])/', "$1$2", $text);
```
を追加しました。

追記: 修正しました。

さらに追記:

```php: 
$text = preg_replace('/([^\n])\n([^-#*+0-9\t \n])/', "$1$2", $text);
```
でした。リストなどの処理を忘れていました。

さらにさらに追記:

```php
$text = preg_replace('/([^\n]+?)\n([^-#*+0-9\t \n])/', "$1$2", $text);
```

これでいいようです。
PhantomJSで指定したURLのHTMLに含まれる自ドメインのリンクリストを返却する

filterはIE8だと利用できないです。

```js:links.js
var  page = require('webpage').create()
	,system = require('system')
	,ua, url;

if (system.args.length != 3) {
	console.log('[Error] Invalid Argument...');
	phantom.exit();
} else {
	url = system.args[1];
	ua = system.args[2];
	
	page.settings.userAgent = ua;
	page.open(url, function (status) {
		if (status !== 'success') {
			console.log('[Error] Unable to load the [' + url + '] ...');
		} else {
			var ret = page.evaluate(function () {
				var aTag = document.links;
				var aTagList = [];
				var domain = location.href.match(/^[httpsfile]+:\/{2,3}([0-9a-z\.\-:]+?):?[0-9]*?\//i)[1];
				
				for (var i = 0, len = aTag.length; i < len; i++) {
					if (aTag[i].href.indexOf(domain) == -1) continue;
					aTagList.push(aTag[i].href);
				}
				
				var aTagUniqueList = aTagList.filter(function (x, index, self) {
					return self.indexOf(x) === index;
				});
				return aTagUniqueList.join("\n");
			});
			console.log(ret);
		}
		phantom.exit();
	});
}
```
db2クライアントからdb2サーバに接続する方法

前回こちらで設定した[DB2クライアントのインストール](http://qiita.com/hit/items/1a149ef7dc5e7e61ec5c) から、対象のデータベースに接続するための設定について今回はメモしました。
今回は、db2クライアントから、192.168.0.22に存在するdb2サーバに接続するための環境設定と接続の方法までになります。

db2に接続設定は、ターゲットのノード情報（データベースはどんな名前か、接続先のホストはどこか・・等）をカタログすることから始まります。カタログ登録の基本的な流れは

* 接続先情報のカタログ
* 接続先のデータベース情報のカタログ

の順で登録します。

## ノード情報のカタログ

```
$ db2 CATALOG TCPIP NODE NDALIAS_NAME REMOTE 192.168.0.22 SERVER 3700 OSTYPE LINUX
DB20000I  The CATALOG TCPIP NODE command completed successfully.
DB21056W  Directory changes may not be effective until the directory cache is 
refreshed.
```

### 説明

上記の例は、こんな感じです。

```
db2 CATALOG TCPIP NODE [ノード名（任意の名前）] REMOTE [接続先のホスト名] SERVER [接続先のDB2サービスポート番号] OSTYPE [接続先のOS]
```

## データベース情報のカタログ

```
$ db2 CATALOG DATABASE DB_NAME AS ALIAS_NAME AT NODE NDALIAS_NAME AUTHENTICATION SERVER 
DB20000I  The CATALOG DATABASE command completed successfully.
DB21056W  Directory changes may not be effective until the directory cache is 
refreshed.
```
### 説明

上記の例は、こんな感じです。

```
db2 CATALOG DATABASE [データベースの物理名（本当のDB名））] AS [クライアントから接続する際の別名] AT NODE [上記で作成したノード名] AUTHENTICATION [認証タイプ] 
```

## 設定情報の反映

DB21056W  Directory changes may not be effective until the directory cache is 
refreshed.
と出ているように一度、設定を反映させるために一旦、切断する必要があります。

```
$ db2 TERMINATE
DB20000I  The TERMINATE command completed successfully.
```

## さあ、接続！！

接続の際は、上記で設定した、データベースの別名、とdb2のログインIDを入れます。
ちなみに、db2のログインIDは、基本的には、OSのログインIDと同じになります。（厳密に言うと違います）

```
$ db2 CONNECT TO ALIAS_NAME USER DB2INST1
Enter current password for db2inst1: 

   Database Connection Information

 Database server        = DB2/LINUX 8.2.9
 SQL authorization ID   = DB2INST1
 Local database alias   = ALIAS_NAME

$ db2 LIST TABLES 

Table/View                      Schema          Type  Creation time             
------------------------------- --------------- ----- --------------------------
ADVISE_INDEX                    DB2INST1         T     2013-10-10-23.44.35.083012
ADVISE_INSTANCE                 DB2INST1         T     2013-10-10-23.44.35.065454
ADVISE_MQT                      DB2INST1         T     2013-10-10-23.44.35.136632
ADVISE_PARTITION                DB2INST1         T     2013-10-10-23.44.35.171292
ADVISE_TABLE                    DB2INST1         T     2013-10-10-23.44.35.212616
ADVISE_WORKLOAD                 DB2INST1         T     2013-10-10-23.44.35.118451
```

以上、クライアントからの接続方法でした。（ほぼ備忘録です）
CSSとJSで、スクロールして一定の場所を過ぎると、上部固定するメニューを作る


## 追記：iPhoneなどのスマホでも気持ちよくなるように修正

なんか最近スマホサイトとかでよく見る、ちょっとスクロールすると、ページ途中にあるメニューがヘッダーに固定されるようなやつ。ヘッダー全体が最初から固定なんじゃなくて、流動的っぽいの。試しに実装してみた。

jQuery使ってるけど、特にjQueryである必要はない。普通のJavaScriptなら、document.getElementById().offsetTopでOK。

```html
<header>
	<h1>Title</h1>
	<nav id="global-nav">
		<a href="">hogehoge</a>
	</nav>
</header>

<section>
	<p>piyopiyo</p>
</section>
```

```javascript
jQuery(function() {
    var nav = jQuery('#global-nav');

    // メニューのtop座標を取得する
    var offsetTop = nav.offset().top;
    
    var floatMenu = function() {
        // スクロール位置がメニューのtop座標を超えたら固定にする
        if (jQuery(window).scrollTop() > offsetTop) {
            nav.addClass('fixed');
        } else {
            nav.removeClass('fixed');
        }
    }
    jQuery(window).scroll(floatMenu);
    jQuery('body').bind('touchmove', floatMenu);
});
```

```css
header {
	height: 100px;
}

#global-nav {
	width: 100%;
}

.fixed {
	position: fixed;
	top: 0;
	z-index: 1;
}
```

PCなら、jQuery(window).scroll()イベントで大丈夫なんだけど、iPhoneなどでは、スクロールイベントが発火するのはタッチを離したタイミング。つまり、スクロールし終わった時。それだと、メニューが追随せず、画面外に消えて、指を話してからメニューが表示されてしまう。

解消するには、素直に touchmove イベントを使う。これなら、ドラッグ中のイベントを設定可能。
CakePHPのAuthコンポーネントで手動|自動ログインの落とし穴


CakePHPでは、認証はAuthコンポーネントでユーザ登録＆ログインを行うと超便利。だけど、ログイン処理を手動（自動）で実行したいっていうときには、ちょっとハマったポイントがあったのでメモ。

## 前提

CakePHP2.x

## 普通のログイン画面→認証の流れ

```php
public function login() {
	if ($this->request->is('post')) {
		if ($this->Auth->login()) {
			return $this->redirect($this->Auth->redirectUrl());
		} else {
			$this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth');
       }
    }
}
```

まぁ、マニュアルにもある通り、普通にログイン画面→認証っていう手順なら、これ。POSTされたID/PWを読み取って、照合してくれる。

参考 : http://book.cakephp.org/2.0/ja/core-libraries/components/authentication.html#id5

## ID/PWを指定してログインしてみる

でも、そういう手順を踏まずに、指定のID/PWで、好きなタイミングの時にログイン認証したい。$this->Auth->login()にパラメータ渡せばいけるかな…？つーわけで、このコード。


```php
public function login() {
		$data = array(
			'username' => 'hoge',
			'password' => 'piyo'
		);
		if ($this->Auth->login($data)) {
			return $this->redirect($this->Auth->redirectUrl());
		}
	}
}
```

いけてる…風？と思いきや、なんかおかしい。AuthComponent本体を見てみる。

```php:/lib/Cake/Controller/Component/AuthComponent.php
public function login($user = null) {
	$this->_setDefaults();

	if (empty($user)) {
		$user = $this->identify($this->request, $this->response);
	}
	if ($user) {
		$this->Session->renew();
		$this->Session->write(self::$sessionKey, $user);
	}
	return $this->loggedIn();
}
```

こんなかんじで、ユーザデータを渡せば、ログイン認証してくれる風になってるんだけど、よく見ると、単に渡されたデータをセッションに保存して、突っ返しているだけ…。正しくないパスワードを渡したってエラーにもならない。

マニュアルを良く見ると、

> 1.3 の $this->Auth->login($this->data) では、ユーザの識別を試みて成功したときのみログインが行われましたが、 2.x では $this->Auth->login($this->request->data) でなにが POST されたのだとしてもログインを行います。

2.xでは、なにやってもログインされる…。怖い。

## 手動でログインする正しい方法？

これが正しいかはわからないけど、要はPOSTしているふうに見せかければいいのでは。

```php
public function login() {
		$this->request->data = array(
			'username' => 'hoge',
			'password' => 'piyo'
		);
		if ($this->Auth->login()) {
			return $this->redirect($this->Auth->redirectUrl());
		}
	}
}
```

$this->request->dataにパラメータを放り込んであげる。これで正しく認証できた。
Converter の startChunkedConversion が不可解

自身を読み込んで、各行をちょっと加工して標準出力するスクリプトを書こうとしてこう書いた:

```dart
import 'dart:io';
import 'dart:convert';

void main(){
  new File(Platform.script.toFilePath())
    .openRead() // Stream<List<int>> 返すのか
    .transform(SYSTEM_ENCODING.decoder) // じゃあ、List<int> を String に変換して
    .transform(new LineSplitter()) // String を行分割して List<String> に変換して
    .expand((List<String> lines) => lines) // 複数行 List<String> を一行にフラットにしよう
    // ↑=> type 'String' is not a subtype of type 'List<String>' of 'lines'. ←？？？
    .listen((String line) {
      print('* $line');
    });
}
```

どうやら <code>[LineSplitter][]</code> は `StreamTransformer<String, List<String>` を継承しているのに、`transform` メソッドに与えると `Stream<List<String>>` ではなく `Stream<String>` を返すようだ。つまり、`.expand` は必要ないようだ。意味がわからない。

どうもその辺りを漁っていると、<code>[Converter][]</code> の `startChunkedConversion` の引数/返り値には、クラスで定義されている `S`, `T` がついていないのが原因な気がする:

```dart
abstract class Converter<S, T> implements StreamTransformer {

  // ...

  /**
   * Starts a chunked conversion.
   */
  ChunkedConversionSink startChunkedConversion(Sink sink) {
    throw new UnsupportedError(
        "This converter does not support chunked conversions: $this");
  }

  // ...
}
```

これの影響で、`Converter` で定義したジェネリック型を使わず自由な型が返せてしまうため、チグハグなインターフェースが出来てしまったようす。

どうしてこうなったんだろう。


[LineSplitter]: https://code.google.com/p/dart/source/browse/branches/1.5/dart/sdk/lib/convert/line_splitter.dart
[Converter]: https://code.google.com/p/dart/source/browse/branches/1.5/dart/sdk/lib/convert/converter.dart
Slack@Mac 環境 にて複数 Team の Notification を受け取る方法

![スクリーンショット 2014-07-16 17.34.13.png](https://qiita-image-store.s3.amazonaws.com/0/18869/4cefe2e7-ea12-83ef-3213-244b1ed9935d.png)

OS X の Slack Application を複数立ち上げる。
Terminal から、

```zsh
open -n /Applications/Slack.app
open -n /Applications/Slack.app
open -n /Applications/Slack.app
```

のような感じ。

[参考]
http://sprocket-blg.tumblr.com/post/91934665480/software-project-realtime-communication
PhantomJSで指定URLのスクリーンショットを保存してみた

投稿のお試しも兼ねて。

```js:get.js
var  page = require('webpage').create()
	,system = require('system')
	,ua, url, output;

if (system.args.length != 4) {
	console.log('[Error] Invalid Argument...');
	phantom.exit();
} else {
	url = system.args[1];
	output = system.args[2];
	ua = system.args[3];

	page.settings.userAgent = ua;
	page.open(url, function (status) {
		if (status !== 'success') {
			console.log('[Error] Unable to load the [' + url + '] ...');
			phantom.exit();
		} else {
			window.setTimeout(function () {
				page.render(output);
				console.log(page.content);
				phantom.exit();
			}, 200);
		}
	});
}
```
sshログイン方法を選択する場合のなんとなくな感覚


# sshの運用について

サーバーを立ち上げた段階でsshをどう利用させるかは、インフラ側ではいつでもつきまとう悩みです。
会社やチームで基本ルールがあるならいいのですが、インフラ担当に一任されることも多いかと思います。
まさに僕は一任されてる側なので、なんとなくな条件によって設定を使い分けています。
あくまで、個人的なルールと設定ね。

[設定手順はこちら](http://qiita.com/kobin/items/a4550190e6f27ff565a5)

# 状況別ssh設定

細かい調整は当然行いますが、ざっくり分けて4パターンで使い分けしています。

## 社内や閉鎖環境に設置するやつ

- rootログイン禁止

社内は、原則的にセキュリティが担保されている（原則的にね）ので、これといった設定はしません。
インターネットにつながっていない閉鎖空間でもこのまま運用する場合もあります。

## インターネットを使ってsshアクセスさせるやつ

- rootログイン禁止
- ポート番号変更
- IP制限

最もよく使う設定はこれになります。
インターネット上に公開するサーバーにはポート番号の変更を必須として、可能であればIP制限をかけるようにしています。
ちょっと甘いんじゃない？とたたかれちゃうかもしれませんが、いろいろ制限かけると面倒臭がられるケースも多いもので勘弁してください。
シンプルでバランスの良い方法を選ぶようにしています。

## インターネットを使ってsshアクセスさせるんだけどメンテナンスする人が少ない場合

- rootログイン禁止
- ポート番号変更
- IP制限
- 公開鍵認証(パスワードログイン禁止)

公開鍵認証はとても強力なセキュリティをもたらしてくれます。
「じゃあ全部これでいいじゃん」と言いたいところですが、鍵の管理がとても面倒です。
僕の場合、自分しか使わないもしくは、使い慣れている人だけで使う場合に選択しています。

## なんかお客さんが「御社のセキュリティポリシーうんぬん……」的な難しいこと行ってきた場合

- つながない

この一択。と、言いたいのですが、そうも行かないこの世の中。

- rootログイン禁止
- ポート番号変更
- IP制限
- 公開鍵認証
- ポートフォワードの禁止

ひとまず、てんこ盛りにしてお伺いをたてます。
それでもダメなら、やっぱりsshをつながない方向で考えます。
VPNを代表に手段はいろいろあると思いますので。

# sshがもたらす幸福
以上、状況による使い分けの僕的なルールをだらだらと書いてみました。
sshは強力な管理ツールです。
sshさえあれば、世界の裏でも体育館の裏でも、どこにサーバーが設置されてもメンテナンスやトラブル対応が可能です。
便利すぎてセキュリティ面でいろいろ言われますが、ちゃんと対策をして、どんどん便利に使っていきましょう。

だからって、飲み会の席とか、朝3時でもうぐっすり寝てる時間とか、そんな状況に電話1本よこして「トラブル対応して」と言われてもね、そういう為にあるんじゃないんだよ？

# 実際の設定変更手順
実際の設定変更は長くなっちゃうので[別エントリー](http://qiita.com/kobin/items/a4550190e6f27ff565a5)にします。
Qiita内探せば全部あると思いますが書いておきます。
Jersey Test FrameworkとGuiceを一緒に使う


[こちらの記事](http://qiita.com/hisamekms/items/c0d242d09886dc7c69cf)でJerseyとGuiceを連携させる方法を紹介ましたが、今回はJersey Test FrameworkとGuiceを連携させる方法を調べました。ポイントはApplicationのコンストラクタにHK2のServiceLocatorをどうやって注入するかだけ。

```HelloResource.java

package web.resources;

import web.MyApplication;
import org.glassfish.jersey.test.DeploymentContext;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

public class HelloResourceTest extends JerseyTest {

    @Test
    public void testHello() throws Exception {
        String response = target("hello").request().get(String.class);
        assertThat(response, is("Hello!"));
    }

    @Override
    protected DeploymentContext configureDeployment() {
        return DeploymentContext.newInstance(MyApplication.class);
    }
}
```

JerseyTest.configureDeploymentをオーバーライドして、Class<? extends Application>を引数にとるDeploymentContextのファクトリメソッドを使うと、つつがなく注入されました。
Cordova使い方まとめ

## Cordovaとは
HTML5 + Javascript + CSS3 で iPhone/Androidなどのネイティブアプリケーションが作れる素敵ツール

## はじめに
* Cordovaを使う機会があったので、使い方をまとめてみました。
* 使用したcordovaのバージョンは、3.5.0です。
* 簡単にアプリの作成手順だけ書いただけなので、詳細が知りたい方は[公式サイト](http://cordova.apache.org/)を見てください。
* あくまで1例です。参考程度に見てください。

## アプリ作成手順
1. Cordovaをインストール
  1. node.jsのインストール
     * [公式サイト](http://nodejs.org/) からダウンロードし、インストール
  1. Cordovaのインストール
     * コマンドプロンプト/ターミナルでインストール 
<pre>
npm install -g cordova
</pre>

1. アプリを作成
<pre>cordova create hello com.example.hello HelloWorld
cd hello</pre>

1. プラットフォームを追加
  * 作成するアプリに対応する開発環境を導入
     * SDKなどをインストール
  * プラットフォームを追加
<pre>cordova platform add プラットフォーム名</pre>

1. アプリをビルド
<pre>cordova build</pre>

1. アプリを実行
<pre>cordova run</pre>

## おまけ

* index.html内のアレを削除する

```html:index.html
<div class="app">
<h1>Apache Cordova</h1>
    <div id="deviceready" class="blink">
        <p class="event listening">Connecting too Device</p>
        <p class="event received">Device is Ready</p>
    </div>
</div>
```

* ただ削除するとアプリが起動しなくなる
* 対処法

```js:index.js
onDeviceReady: function() {
    //app.receivedEvent('deviceready');
},
```
導入したOSのメディアはisoファイルで保存しておくと便利です


# 目的

Linux OSを導入した際、インストールメディアのisoファイルを作成しておくと、いざという時助けになる場合があります。
例えば、インターネットが使えない環境で追加のパッケージを入れたい場合などですね。
通常なら、メディアを入れて作業となりますが、ssh越しの遠隔地だとそうも行かない事情がありますし、3m先のラックまで歩くのがダルい時もあるわけですから、用意しておくに越したことはありません。
転ばぬ先のつえとして、インストールメディアのisoファイルを作成して保存しておきます。

# インストールメディアのiso作成

　isoファイルの作成にはddコマンドを利用します。
　以下のような操作で、ISOファイルの作成が可能です。

```bash
$ mkdir /usr/local/backup
$ cd /usr/local/backup
$ dd if=/dev/cdrom of=CentOS-6.5-x86_64-bin-DVD1.iso
```

# isoファイルのマウント

いざ導入メディアの参照が必要になった場合は、mountコマンドを使用して、isoファイルの中身を使えるようにします。
以下のコマンドで、isoファイルをマウントします。

```bash
$ mount -o loop -t iso9660 CentOS-6.5-x86_64-bin-DVD1.iso /media/
```

なお、mountコマンドにはroot権限が必要です。
上記コマンドでマウントが成功すれば、/media/にisoファイルの中身が展開され、ファイルアクセスが可能となります。

# isoファイルのアンマウント

最後に、使い終わったisoはアンマウントしておきましょう。
アンマウントは通常のアンマウント手順と全く一緒です。

```bash
$ umount /media/
```

mountコマンド同様、umountコマンドにもroot権限が必要です。
以上でアンマウントが完了です。

# おわりに

トラブル時や設定変更時など、インストールメディアが必要とされるケースが考えられます。
yumやaptitudeが使える環境だとあまりありがたみがないですけど、邪魔になるものでもないので、一手間加えていざというときに備えてはいかがでしょうか。
NSMutableDictionaryの階層化をMutableCopyして変更する時の注意点


##ダメ
```objectivec:
NSMutableDictionary * dictionary = [NSMutableDictionary dictionaryWithObject:[NSMutableArray arrayWithObjects:@"上田",@"山田",@"川田", nil] forKey:@"name"];

NSMutableDictionary *copydictonary = [dictionary MutableCopy];

[[dictionary objectForKey:@"name"] removeObjectAtIndex:0];

dictionary = [copydictonary MutableCopy];
```

上記の場合、dictionaryの変更がcopydictonaryにも適用されてしまう様だ。

##Ok
```objectivec:
NSMutableDictionary * dictionary = [NSMutableDictionary dictionaryWithObject:[NSMutableArray arrayWithObjects:@"上田",@"山田",@"川田", nil] forKey:@"name"];
NSMutableArray *copy = [[dictionary objectForKey:@"name"] mutableCopy];

[[dictionary objectForKey:@"name"] removeObjectAtIndex:0];

[dictionary setObject:copy forKey:@"name"];
```
変更する階層まで潜って、取り出さないと元を変更すると上書きしてしまうようでした。
メシマズがJavaScriptを使うからダメなんだよ

この記事は [Javascriptを使うのをやめろ：Railsの時代遅れ云々についての結論](http://qiita.com/kaiinui/items/dad6180f1910c6a4bfd5) 等の
「JSダメだろ」「いやダメなのはお前だろ」論争に対する私の考えになります。

# 結論

JavaScriptを使う前に、それによって提供されるUXに対してもっと検討してほしい。

# メシマズって

ここでメシマズを例に挙げたのはJSの使い方が
「普通のケーキじゃ物足りないと思ってアクセントに刺身を入れてみたの。どう？」
「うん、おいしい……よ？ （生臭くて食べられたもんじゃない、どうしよう）」
という流れに似ていると感じたためです。

この記事では「このような行為」もしくは「このような行為をする人物」をメシマズと呼ぶことにします。

## メシマズなサイト

ケーキに刺身は極論ですが、例えばこのQiitaを例にします。
このサイトでは過去の記事を見たい場合、下までスクロールして「もっと見る」のボタンを押す。
こうするとリストの下にさらに過去の記事リストが追加されます。

その途中で「この記事、気になる」と思ってうっかりクリックするとさあ大変。
新しい記事に飛んだあとにブラウザバックしても元の位置には戻れません。
もしこれまでに「もっと見る」を10回押していた場合は、続けるにはまた最初から10回ボタンを押さないといけないわけです。

従来どおりのWebであれば、「前へ」、「次へ」、ページ番号のリンクがあるページネーションを使うでしょう。
そのように実装すればこのような不便は起こりません。

だから私にはこの使い方がメシマズのように感じられます。
アクセントのために使ってみました、美味しいかどうかは関係ありません、というようにです。


他にも、一昔前だと全部フラッシュで作成されてるWebページ。
最近だとJSでリンクを実装したせいで、ホイールクリックで新しいタブで開けないページ。
などメシマズだと思われる使い方はたくさんあふれています。

リンク先にあるような「JavaScriptがクラッシュしてサイトが使えない」なんていうのは「ケーキに刺身を突っ込んで食中毒おこしちゃった」と同レベルでしょう。

## そうはいっても

もちろんこの例に当てはまらないものはたくさんあります。
例えばGmailであれば完全にJSに依存しており、JSを使わないという選択肢は考えられないでしょう。
例えばGitHubであればAjaxによる遷移にpushStateをうまく使っており、メシマズどころか「カレーにヨーグルトをうまくマッチさせたような」と形容してもよいと思います。

また酢豚のパイナップルのように、ある人には邪魔、ある人には美味な機能もあることでしょう。
私は入れない方が断然好きですが。

ですのでJSを用いる人には、どのようなUXを提供するのかをもっと真剣に考えてほしいと思います。

## 話を戻して

この問題を解決するのは「メシマズな嫁においしい料理を作ってもらう」のと同じくらい難しいでしょう。
JavaScriptを使うなというのは、ある意味「完全にレシピ通りに作れ、遊びは許さない」に近いと思っており、それもよいのではないかと思います。
もちろんレストランのシェフ（を自負するの）であれば、そんなレベルで留まってもらっては困りますが。

# 最後に

Qiita様、悪いサンプルの例として利用したこと申し訳ございません！！
直訳☆MIPSっ

C言語はわかるけどMIPSはわからない人へ

#C言語にはない考え方
##レジスタの話
まだ書いてない
##記述のない命令
コンピュータが勝手にやってくれるのでCに対応する記述はありません.
###lw(Load Word)
配列を読み込む

```c:C言語
a = x[8];
```

```zsh:MIPS
lw  $t0, 32($t1)
mv $t1 , $t0 # <- a = x[8];
# $t0はx[8]を仮に保存しておくレジスタ
# $t1はxの先頭を指すアドレス
# ()の前に添字*4の数字を書く
```

###sw(StoreWord)
配列に書き込む

```c:C言語
x[10] = a;
```

```zsh:MIPS
sw $t1, 400($t0)
```

`item[i]` の場合,

```zsh:MIPS
```


#対訳 MIPS

##代入

```c:C言語
a = b;
```

```zsh:MIPS
move $t0, $t1
## 擬似言語
```
こう書けばしたいことできるけど読む人になにするかわかりにくいから擬似言語にしようって感じー
擬似言語を使わずに書くと,

```zsh:MIPS
add $t0, $t1, $zero
```
となるんだけどaddしたいわけじゃないし,この命令でしたいことがわかりにくい.
##加法

```c:C言語
a = b + c;
a = b + 4;
```

```zsh:MIPS
add  $t0 , $t1 , $t2
addi $t0, $t1, 4
```

##ループ
```c:C言語
for(i = 0; i < 10; i++){
  item[i] = 0;
}
```

```zsh:MIPS
  move $t0, $zero 
loop:
  sw $zero, 
exit:
```

##if

```c:C言語

```

```zsh:MIPS
```
<!--
#

```c:C言語
```

```zsh:MIPS
```

-->
[Android]Pusherを使ったチャットクライアントの実装


## 準備の前準備
[Pusher](http://pusher.com/)のアカウントを作成して、appKeyを生成しておくこと。
といっても登録したらデフォルトのアプリが登録されるので、それ参照すればよい。
ちょっと遊ぶくらいなら無料枠で十分なはず。

## 準備
pusherのjarファイルを用意する。
http://repo1.maven.org/maven2/com/pusher/pusher-java-client/
pusher-java-client-X.X.X.jarではなく、pusher-java-client-X.X.X-jar-with-dependencies.jar をダウンロードすること。Logクラスが足りないとかでエラーになります。ややこしい

mavenの場合は

```pom.xml
<dependency>
  <groupId>com.pusher</groupId>
  <artifactId>pusher-java-client</artifactId>
  <version>0.3.1</version>
</dependency>
```

と記述すればOKなよう(未検証)

## 実装

```res/values/strings.xml
<string name="pusher_app_key">Access Tokensのところにあるkey</string>
```

```PusherFragment.java
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.chat_room, container, false);
		
		// Pusherから受け待ち
		recievePusherData();
		return view;
	}

	private void recievePusherData() {
		
       // SSL通信させる場合はtrueにする
		PusherOptions options = new PusherOptions().setEncrypted(true);
		Pusher pusher = new Pusher(getString(R.string.pusher_app_key), options);

		pusher.connect(new ConnectionEventListener() {
		    @Override
		    public void onConnectionStateChange(ConnectionStateChange change) {
		        System.out.println("State changed to " + change.getCurrentState() +
		                           " from " + change.getPreviousState());
		    }

		    @Override
		    public void onError(String message, String code, Exception e) {
		        System.out.println("There was a problem connecting!");
		    }
		}, ConnectionState.ALL);

		// Subscribe to a channel
		Channel channel = pusher.subscribe("チャンネル名");

		// Bind to listen for events called "my-event" sent to "my-channel"
		channel.bind("event", new SubscriptionEventListener() {
		    @Override
		    public void onEvent(String channel, String event, String data) {
		        System.out.println("Received event with data: " + data);
		    }
		});

		// Disconnect from the service (or become disconnected my network conditions)
		pusher.disconnect();

		// Reconnect, with all channel subscriptions and event bindings automatically recreated
		pusher.connect();
		// The state change listener is notified when the connection has been re-established,
		// the subscription to "my-channel" and binding on "my-event" still exist.		
		
	}

```

んで、これだとログが出力されるだけだけど、channel.bindのonEventの中で受け取った時にTextViewか何かに受け取ったデータを表示すれば良いのではないかと。

ドキュメントが少なくて(英語)ちょっと焦りましたが、WikiとJavadocにらめっこしたらなんとかなりました。
Log用文字列のUtilメモ

#Log用文字列のメモ
Rectとか毎回書くのが面倒なやつ。
増やすたびに書き足す。
私的メモ。

```LogUtil.java
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.View;

public class LogUtil {
    static public String getRcetString(Rect rect){
        return getRectString(rect.left
                            , rect.top
                            , rect.right
                            , rect.bottom);
    }

    static public String getRcetString(RectF rect){
        return getRectString(rect.left
                            , rect.top
                            , rect.right
                            , rect.bottom);
    }

    static public String getViewRectString(View view){
        return getRectString(view.getLeft()
                            ,view.getTop()
                            , view.getRight()
                            , view.getBottom());
    }

    static public String getViewLocationScreenString(View view){
        int [] locationScreens = new int[2];
        view.getLocationOnScreen(locationScreens);
        return getRectString(locationScreens[0]
                            ,locationScreens[1]
                            , locationScreens[0] + view.getWidth()
                            , locationScreens[1] + view.getHeight());
    }

    static public String getViewLocationWindowString(View view){
        int [] locationScreens = new int[2];
        view.getLocationInWindow(locationScreens);
        return getRectString(locationScreens[0]
                            ,locationScreens[1]
                            , locationScreens[0] + view.getWidth()
                            , locationScreens[1] + view.getHeight());
    }

    static public String getViewLocalVisibleRect(View view){
        Rect rect = new Rect();

        view.getLocalVisibleRect(rect);
        return getRcetString(rect);
    }

    static public String getViewGlobalVisibleRect(View view){
        Rect rect = new Rect();

        view.getGlobalVisibleRect(rect);
        return getRcetString(rect);
    }

    static public String getRectString(double left, double top, double right, double bottom){
        return "[left:" + left
                + " top:" + top
                + " right" + right
                + " bottom:" + bottom
                + " width:" + Math.abs(right - left)
                + " height:" + Math.abs(bottom - top) + "]";
    }
}
```
PHPで時間をパースする

入力された時間が正しいフォーマットかどうかを確認するには、`strftime`が便利。

下記のように、`YYYY/MM/DD HH:MM:SS`という形で入ってこないと正しい形だとしたくない場合、
strftimeを使えば、time1は正しい形式なので配列を、time2とtime3は正しい形式ではないので`false`を返してくれます。

```php
$format = "%Y/%d/%m %H:%M:%S";
$time1 = '2014/04/03 12:00:00';
$time2 = '2014-04-03 12:00:00';
$time3 = '2014/04/03 12:00:60';

var_dump(strptime($time1, $format));
var_dump(strptime($time2, $format));
var_dump(strptime($time3, $format));
```
sed で .ssh/known_hosts から特定のサーバーの設定を削除する


```
sed -i "" '/{host_name}/d' ~/.ssh/known_hosts
```

Mac OS X の場合、-i の後ろに "" を付けないとエラーが発生した。
http://www.markhneedham.com/blog/2011/01/14/sed-sed-1-invalid-command-code-r-on-mac-os-x/
Plone 5 の翻訳テスト環境の構築


# 前提
- Plone 5 が導入済み
- gitがインストール済み

# インストール・設定

## mr.developer

複数のパッケージをまとめてチェックアウトなどをしてくれる仕組み

buildout.cfg を編集(以下2箇所)

```buildout.cfg
[buildout]
extensions = mr.developer
auto-checkout =
    plone.app.locales
    plone.app.event
    plone.app.dexterity
    plone.dexterity
```

```buildout.cfg
[sources]
plone.app.locales = git https://github.com/plonejp/plone.app.locales.git
plone.app.event = git https://github.com/plonejp/plone.app.event.git
plone.app.dexterity = git https://github.com/plonejp/plone.app.dexterity.git
plone.dexterity = git https://github.com/plonejp/plone.dexterity.git
```

buildoutの実行

```
$ ./bin/buildout -N
```

## 確認方法

- srcフォルダに必要なパッケージがあるか?
- bin/instance の中を見て、該当パッケージが src以下から読まれているか?


## 翻訳関係の設定確認

起動時にpoファイルをmoファイルにコンパイルするか?
以下のように設定されていば問題なし。(Plone5a2では自動的にmoファイルを作成するように設定されていました)

```base.cfg
environment-vars =
    zope_i18n_compile_mo_files true
```

# githubから最新のPloneで試す場合

以下のエントリーを参照して下さい。
http://qiita.com/terapyon/items/905dbe19bc4a00b9aa7e
{"key":"hoge", "value":"aaa"}を、{"hoge":"aaa"}に変換

たまに必要になる。

```js
var a = [
	{key:"hello", value:"aaa"},
	{key:"world", value:"bbb"},
	{key:"test", value:"ccc"},
	{key:"hoge", value:"ddd"}
];


var b = a.map(function(d){ var tmp={}; tmp[d.key]=d.value; return tmp });


console.log(b);
->"[{"hello":"aaa"},{"world":"bbb"},{"test":"ccc"},{"hoge":"ddd"}]"


```
Docker Provider VS Docker Provisioner

### Docker Provider
```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "boot2docker", autostart: false do |b2d|
    b2d.vm.box = "yungsang/boot2docker"
    b2d.nfs.functional = false
    b2d.vm.network :forwarded_port, guest: 8080, host: 8080
  end

  config.vm.define "hello-world", primary: true do |v|
    v.vm.provider "docker" do |d|
      d.vagrant_vagrantfile = "./Vagrantfile"
      d.vagrant_machine = "boot2docker"

      d.image = "yungsang/busybox"
      d.name  = "hello-world"
      d.ports = ["8080:80"]
      d.cmd   = ["nc", "-p", "80", "-l", "-l", "-e", "echo", "hello world!"]
    end
  end
end
```

```
$ vagrant up --provider docker
$ nc localhost 8080
hello world!
```

### Docker Provisioner
```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "hello-world"

  config.vm.box = "yungsang/boot2docker"

  config.vm.network :forwarded_port, guest: 8080, host: 8080

  config.vm.provision :docker do |d|
    d.run "hello-world",
      image: "yungsang/busybox",
      args: "-p 8080:80",
      cmd: "nc -p 80 -l -l -e echo hello world!"
  end
end
```

```
$ vagrant up
$ nc localhost 8080
hello world!
```
SinatraでJSONを受け取る

```rb:Gemfile
gem "rack-contrib", require: ["rack/contrib/post_body_content_type_parser"], github: "rack/rack-contrib"
```

```rb:config.ru
use Rack::PostBodyContentTypeParser
run YourApplication
```

これだけ。

---

`Rack::PostBodyContentTypeParser`はその名の通りContentTypeを見てbodyをパースするmiddlewareで、実装を見ると実体は`application/json`のときは`JSON.parse(body)`みたいなことをしているだけ。

現在リリースされているバージョンだと正常に動かないので、開発版をgithubから取得している。
Travisコマンドのまとめ

## はじめに
* travisのコマンドを大半打ってみたついでに、どんなものか残しておきました

## travisコマンド
### travis accounts
* ログインしているアカウントが所持しているリポジトリの数が表示される

### travis branches
* 各ブランチの最新のビルドが表示される

### travis cache
* キャッシュがクリアされる

### travis cancel
* 実行中のビルドを中止する

### travis console
* Rubyのインタラクティブシェルがたたける

```
$ travis console
>> User.current
=> #<User: RustyNail>
>> Repository.find('RustyNail/sample_rails_app')
=> #<Repository: RustyNail/sample_rails_app>
>> Repository.find('RustyNail/sample_rails_app').color
=> "green"
``` 

### travis disable
* ビルドを無効にする(travis login --proでログインする必要あり)
* pushトリガにしていても、push後ビルドは走らない

### travis enable
* ビルドを有効にする(travis login --proでログインする必要あり)

### travis encrypt
* .travis.ymlに暗号化したものを記述したい場合に公開鍵を使って暗号化する
* travis encrypt SECRET_PASS="password"
 * .travis.ymlには生成された文字列を以下のように記述すればよい

```:.travis.yml
env:
  global:
    - secure: abcdef12345.....
```

### travis endpoint
* APIのエンドポイントが表示される

```
$ travis endpoint 
API endpoint: https://api.travis-ci.org/
```

### travis help
* travisコマンドのヘルプが表示される

### travis history
* ビルド履歴が表示される

```
$ travis history --limit 100　# 過去のビルドの履歴を100件まで取得
```

### travis init
* .travis.ymlが生成される

```
$ travis init
Main programming language used: |Ruby| 
.travis.yml file created!
[ユーザ名]/[リポジトリ名]: enabled :)
$ cat .travis.yml 
language: ruby
rvm:
- 2.0.0
- 1.9.3
- jruby-19mode
- rbx-2
```

### travis lint
* .travis.ymlの文法チェック

```
# 文法に問題がないときの結果
Hooray, .travis.yml looks valid :)
# 文法に問題があるときの結果(例)
Warnings for .travis.yml:
[x] syntax error: (<unknown>): did not find expected node content while parsing a block node at line 45 column 5
```

### travis login
* APIを使用したコマンドを実行するためにTravisにログインする

### travis logout
* Travisからログアウトする

### travis logs
* 最新のテストのログが表示される

### travis monitor
* publicリポジトリのビルドのモニタリング結果が表示される

### travis open
* Travisのページ(https://magnum.travis-ci.com/[ユーザ名]/[リポジトリ名]) がブラウザを立ち上げ、表示される

### travis pubkey
* リポジトリの公開鍵を発行する

### travis repos
* ユーザが権限を持っているリポジトリが表示される

### travis requests
* pushなどのリクエストのリストが表示される

### travis restart
* 最後に実行したビルドが再実行される

### travis settings
* リポジトリのビルドに関する設定が表示される
* https://magnum.travis-ci.com/[ユーザ名]/[リポジトリ名]/settings にある情報と同等

### travis show
* 以下のような形式で最新のビルド情報が表示される

```
Job #2.1:  commit message
State:         passed
Type:          push
Branch:        master
Compare URL:   https://github.com/[ユーザ名]/[リポジトリ名]/compare/abcde12345...7890vwxyz
Duration:      30 sec
Started:       2014-06-24 13:55:31
Finished:      2014-06-24 13:55:37
Allow Failure: false
```

### travis status
* 最新のビルド結果が表示される

### travis sync
* Githubと同期がとられる

### travis token
* アクセストークンが表示される

### travis version
* (```gem install travis```で入れた)クライアントのtravisのバージョンが表示される
* ```gem list travis```で表示されるバージョンと同じ

### travis whatsup
* publicリポジトリのビルドのうち、実行されている最新の25件が表示される

### travis whoami
* ログインしているユーザ名が表示される

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
zshの設定ファイルを分割して整理しやすくする

#.zshrc before...

初期の設定をし終わったあとでも、zshの設定には追加できるものが多いです。
新しい設定を付け足すたびにごちゃごちゃしがちな設定ファイル群ですがまとめればスマートに出来ると思います
# .(source)

.(source)コマンドを使って外部のスクリプトを実行することで変数や関数をそのまま引き継ぐことが出来ます。

```bash
$ cat hello.sh
#! /bin/bash

hello="world!"

function hi {
	echo "hi!${hello}"
}

hi
$ bash hello.sh
hi!world!
$ hi
zsh: command not found: hi
$ echo $hello

$ . ./hello.sh
hi!world!
$ hi
hi!world!
$ echo $hello
world!
```
このコマンドを使って外部にエイリアスなどを移動したいと思います

#関数の定義

```bash
function loadlib() {
        lib=${1:?"You have to specify a library file"}
        if [ -f "$lib" ];then #ファイルの存在を確認
                . "$lib"
        fi
}
```
この関数を.zshrcなどの頭に書いておけば `loadlib /path/to/lib` で外部に分けた設定ファイルを読み込むことが出来ます。

# .zshrc after!

```bash:.zshrc
function loadlib() {
        lib=${1:?"You have to specify a library file"}
        if [ -f "$lib" ];then #ファイルの存在を確認
                . "$lib"
        fi
}

loadlib $ZDOTDIR/zshfunc		#関数
loadlib $ZDOTDIR/zshautoload	#autoload
loadlib $ZDOTDIR/zshopts		#optset
loadlib $ZDOTDIR/zshalias		#alias
loadlib $ZDOTDIR/zshvars		#変数

```
スッキリしました
\#何をやっているのか分かりにくくなっただk(ry
【作業ログ】RDSのPIOPS変更時の挙動

ほぼ作業ログ。
RDSのPIOPSオプションで数値の変更を行った際の挙動を残す。

## 作業内容
PIOPSを5000から3000に変更する。

## 対象DB
| Instance Type | Storage | PIOPS |
|:----------:|:------------:|:------------:|
| cr1.8xlarge |  1000GB |     5000     |


DBのデータサイズ

```
+--------------------+-----------------+
| table_schema       | MB              |
+--------------------+-----------------+
| test                | 308848.68750000 |
| mysql              |      5.94326878 |
| information_schema |      0.00976563 |
| performance_schema |      0.00000000 |
+--------------------+-----------------+
```

## 結果
* オンラインで変更可能（接続断はなし）
* 変更中はフルでIOを使っている
* 変更にかかった時間：５時間４分２６秒

## 作業ログ
### PIOPS変更時のCloudWatch
![2014-07-16_PIOPS変更.png](https://qiita-image-store.s3.amazonaws.com/0/38286/9bf06b4c-e65d-acec-678c-39095dcbab68.png "2014-07-16_PIOPS変更.png")

### Event Log
test-db db-instance July 16, 2014 2:36:28 PM UTC+9
Applying modification to allocated storage 
test-db db-instance July 16, 2014 7:40:54 PM UTC+9
Finished applying modification to allocated storage 

### 変更中、DBに対しての操作はもちろん無し
```
mysql> show processlist;
+----+----------+-------------------------------------------------------+-------+---------+------+-------+------------------+
| Id | User     | Host                                                  | db    | Command | Time | State | Info             |
+----+----------+-------------------------------------------------------+-------+---------+------+-------+------------------+
| 52 | rdsadmin | localhost:50788                                       | NULL  | Sleep   |    3 |       | NULL             |
| 80 | test    | ip-10-0-0-1.ap-northeast-1.compute.internal:40575 | test | Query   |    0 | init  | show processlist |
+----+----------+-------------------------------------------------------+-------+---------+------+-------+------------------+
```



## まとめ
前に何回かやったことがあるが、手元にデータが残っていなかったので…
一旦上げ
boot2dockerのデータ永続化まとめ

# profile

* [rootfs/rootfs/usr/local/etc/init.d/docker](https://github.com/boot2docker/boot2docker/blob/master/rootfs/rootfs/usr/local/etc/init.d/docker)

```
test -f '/var/lib/boot2docker/profile' && . '/var/lib/boot2docker/profile'
(略)
: ${DOCKER_ULIMITS:=1048576}
```

# ユーザ用ファイル群

* /var/lib/boot2docker/

| ファイル | 用途 |
|:-- |:-- |
| profile | 環境変数など |
| bootsync.sh | 起動時に終わらないといけないもの |
| bootlocal.sh | 起動時に終わらなくてもいいもの |
| ssh/ssh{,d}_config | sshdの設定 |
| userdata.tar | 起動時/home/docker/に展開するもの |

## /home/docker/ の永続化

```bash:
cat > /var/lib/boot2docker/bootlocal.sh <<EOF
echo "tar cf /var/lib/boot2docker/userdata.tar . -C /home/docker/" >> /opt/shutdown.sh
EOF
chmod +x /var/lib/boot2docker/bootlocal.sh
```

これでrebootやshutdownの時に/home/docker/が/var/lib/boot2docker/userdata.tarにバックアップされる。

### 参考

* [boot2docker/rootfs/rootfs/shutdown.sh at master · boot2docker/boot2docker](https://github.com/boot2docker/boot2docker/blob/master/rootfs/rootfs/shutdown.sh)


## timezone

```bash:/var/lib/boot2docker/profile
export TZ="JST-9"
```

* /usr/share/zoneinfo/Asia/Tokyo が無いのでこうした。

## ulimit値を増やす(1024->65535)

```bash:/var/lib/boot2docker/profile
ulimit -n 65535
```

次回起動時、`ulimit -n`で65535になっていることを確認。

### 参考

* [max file limits on boot2docker | Back of a Stamp](http://cassjohnston.wordpress.com/2014/07/11/max-file-limits-on-boot2docker/)
* [boot2docker/rootfs/rootfs/bootsync.sh at master · boot2docker/boot2docker](https://github.com/boot2docker/boot2docker/blob/master/rootfs/rootfs/bootsync.sh)
* /etc/init.d/docker

## sshd

### 参考

* [boot2docker/rootfs/rootfs/etc/rc.d/sshd at master · boot2docker/boot2docker](https://github.com/boot2docker/boot2docker/blob/master/rootfs/rootfs/etc/rc.d/sshd)


# その他ファイル (こちらは永続化されない)

| ファイル | 用途 |
|:-- |:-- |
| /opt/shutdown.sh | shutdown,rebootの時に呼ばれます。 |