OmniAICreator/Qiita-1.07M huggingface dataset:
[MongoDB] RockMongoインストール（PHP製）

MongoDB管理ツール（GUIツール）の **RockMongo** をWEBサーバーにインストールする手順です。（RockMongoはPHP製です）

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) １）zipをダウンロード

▼ここからダウンロード（画面右の「Download ZIP」ボタン）
https://github.com/iwind/rockmongo

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) ２）アップロード＆解凍

ダウンロードしたzipをそのままアップロードした後、サーバーにSSHでログインし、unzipコマンドで解凍します。

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) ３）MongoDBの管理ユーザーを作成

サーバーにSSHでログインして、下記のようなコマンド操作で管理ユーザーを作成します。

```csh
$ mongo
> use admin
> db.createUser({
  user: "管理者",
  pwd: "パスワード",
  roles:[{
    role: "userAdminAnyDatabase",
    db: "admin"
  }]
})
```

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) ４）config.phpを編集

管理ユーザーでログインできるように、config.phpのみ編集して再アップロードします。

```php:config.php
// 29行目をtrueに。
$MONGO["servers"][$i]["mongo_auth"] = true; //false;
// 31行目をfalseに。
$MONGO["servers"][$i]["control_auth"] = false; //true;
```

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) ５）ブラウザーからログイン

アップしたフォルダ（のURL）にアクセスすれば、ログイン画面が表示されますので、手順３で作成した管理ユーザーでログインします。

(･o･ゞ いじょー。
atomで言語毎にタブの深さを切り替える

atomで言語毎にタブの深さを設定しようとしたのだが、意外と分かりにくかったのでメモ

参考)http://blog.atom.io/2014/10/31/language-scoped-config.html

Preferenceから「Open Config Folder」でフォルダをひらいて`config.cson`を編集する

rubyならタブ2にする場合は下記を追加すればOK

```
".ruby.source":
  editor:
    tabLength: 2
```
XCode6.3 でまたSwiftでエラーが出る

XCode6.3 でSwift のバージョンが上がり、また型のチェックやらが厳しくなったようです。
今回は特に String 関係の変更が多く、NSString と String の関係がさらに整理されてきたようです。
また DownCast でのチェックが厳しくなったようで、前バージョンで as だったところがかなりひっかかり、 as! に直すところがでました。
これも String も関係しているような
Androidアプリ開発ことはじめ

Androidアプリを自作して遊びたい自分のためのメモ。

- 公式サイトからインストーラをダウンロード。
    - https://developer.android.com/sdk/index.html
- JDK(Java SE Development Kit)をインストール。
    - http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- Android Studioをインストールし、初期設定を行う。
- 初期設定が完了したら、Configure > SDK Managerを開く。
    - 以下のSDKをインストールする。
        - Android SDK Tools
        - Android SDK Platform-tools
        - Android SDK Build-tools
        - 持っているAndroid実機のバージョン
            - SDK Platform
            - 各種System Image
    - SDK Managerはときどき立ち上げてバージョン管理をしたほうがいい。
Antのインストール

CentOS6.5にyumでantをインストールしたら実行時に下記エラーが出たので
手動インストールに変更。

```
$ ant -version 
エラー: メイン・クラスorg.apache.tools.ant.launch.Launcherが見つからなかったかロードできませんでした
```

インストール手順
-----------------

Webからファイルを取得

```
$ wget http://ftp.tsukuba.wide.ad.jp/software/apache//ant/binaries/apache-ant-1.9.4-bin.tar.gz
$ tar zvxf apache-ant-1.9.4-bin.tar.gz
```


/optにコピー（以下よりrootユーザーで実行）

```
$ mv apache-ant-1.9.4 /opt/
```

シンボリックリンクをはってパスを通す

```
$ ln -s /opt/apache-ant-1.9.4/bin/ant /usr/local/bin/ant
```
gitbucket→hubot→slack連携


backlog→hubot→slack連携
http://qiita.com/yo-iida/items/c69fe7b6afb2c082b822

からの派生で、gitbucketのwebhookも下記のようなソースコードで、
簡単にslackに連携できる。

reqで受け取ったリクエスト情報の中から、
必要な情報をパースしてmessageに整形して、
slackに投げるというそれだけなので、
必要に応じてコピペでいろいろな連携botがつくれます。

```gitbucket-notification.coffee
# Description:
#   gitbucket to Slack
#
# Commands:
#   None

module.exports = (robot) ->
  robot.router.post "/gitbucket-to-slack/:room", (req, res) ->
    { room } = req.params
    { body } = req

    try

      if body.payload

        json = JSON.parse body.payload

        message = "==== commit info ====\n"
        message += "timestamp: #{json.commits[0].timestamp}\n"
        message += "id: #{json.commits[0].id}\n"
        message += "author: #{json.commits[0].author.name}<#{json.commits[0].author.email}>\n"
        message += "message: #{json.commits[0].message}\n"
        message += "url: #{json.commits[0].url}\n"

        if message?
            robot.messageRoom room, message
            res.end "OK"
        else
            robot.messageRoom room, "gitbucket integration error."
            res.end "Error"
    catch error
      robot.send
      res.end "Error"
```

https://gist.github.com/yo-iida/89e6a5faef9c934dd7ca
【Hubot】パスワードを自動生成するスクリプト

#概要

![スクリーンショット 2015-04-10 16.56.40.png](https://qiita-image-store.s3.amazonaws.com/0/67591/6ba48267-c07a-28b9-8a20-37fa6fa1984b.png)

![スクリーンショット 2015-04-10 18.28.09.png](https://qiita-image-store.s3.amazonaws.com/0/67591/6f51e37d-16fc-2bdc-ed81-bee4c15fd23e.png)


hubotに文字数を指定して、パスワードを生成するようにリクエストすると、urlが送られてきて、
クリックすると生成されたパスワードが確認できる。


#コード

```coffeescript:password.coffee


module.exports = (robot) ->
	links = []
	
	robot.router.get '/hubot-password/', (req, res) ->
	    
	    li = links.map (i) ->
	      """
	        #{i}
	      """
	    .join '\n'
	    html = """
	      <html>
	      <head><title>Links</title></head>
	      <body style="text-align:center;">
	        <h1>PASSWORD</h1>
	        <input type="text" value="#{li}" style="font-size:14px;">
	      </body>
	      </html>
	    """
	    res.type 'html'
	    res.send html

	robot.respond /password (.*)/i, (msg) ->

		links.splice(0,1)
		len = msg.match[1]

		seed = '012345678910qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!#$%&'

		pwd = ''
		
		while len--
			pos = Math.floor(Math.random() * seed.length)
			pwd += seed[pos]

		links.push pwd

		msg.send process.env.HUBOT_DOMAIN+"/hubot-password/"


```

ざっと説明を

```
links = []
```

データをここで保持します。生成されたパスワードをここに投入するので。


```
robot.router
```
robot.routerを使うことでhttp経由での呼び出しを受付可能にしています。

```coffee

links.splice(0,1)
        len = msg.match[1]

        seed = '012345678910qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!#$%&'

        pwd = ''

        while len--
            pos = Math.floor(Math.random() * seed.length)
            pwd += seed[pos]

        links.push pwd

```

ランダムなパスワードを生成するロジックです。とは言ってもやってることは単純で、
"seed"に入れられた文字をバラバラにして、指定された文字数分、ランダムに抽出して、くっつけてるだけです。
最後に先ほどの"links"に投げ入れます。

#最後に

このパターンでいくと、次は文書の作成ですね。
文書を自動生成してそのままプリンターで印刷できるようにします。
やっと分かった。プログラムができるようになるためのたった一つの方法。プログラミング入門者に向けて。

最初に私がプログラムの講師をしてから10年以上経ちます。
その間にたくさんの方を教えてきましたが、プログラムの習得が出来る人とできない人がいることに気が付きました。

両者の差は歴然としており、習得が出来る人は、それまでプログラム未経験でも、すぐに内容を理解して課題をクリアしていきます。応用問題も難なく解きいていきました。その方は現場に入ったあとでもどんどん成果を出していきました。

逆に、できない人は、どんなに時間をかけて教えても次の日にはできないようになっていたり、ちょっとした応用問題でも、手も足も出ない状態でした。

その差はどこにあるかをずっと観察していましたが、最近やっと原因と対応方法がわかったのでご紹介します。

![wakaru.jpg](https://qiita-image-store.s3.amazonaws.com/0/25176/35249bc8-bfde-70e0-e1ae-bedacf7a8a54.jpeg)

# プログラミングは自転車の運転に似ている。
プログラミングは自転車の運転に似ているとはよく言われます。
自転車の乗り方を覚えるときは、最初は補助輪をつけて漕げるようになります。補助輪をつけて乗れるようになったら、補助輪を外し、誰かに後ろから支えてもらいながら乗れるようになります。まっすぐに自転車を漕げるようになったら、次に曲がれるようになります。自転車に乗れるようになって、毎日自転車に乗っていると、いつの間にか立ち漕ぎができたり、手放し運転ができるようになったりします。
自転車に乗れるようになる方法は、少しずつ、できることを積み重ねていくことによって、いきなり手放し運転をしようとすると、大怪我をしてしまいます。

この方法こそがプログラミングを修得するときに行うべき方法です。

# できることを積み重ねる事。できないことをいきなりやろうとしない。
プログラミングができない人に共通することは、「自分のできないことをやっている」ことでした。教科書に乗っているコードを書き写してはいるのですが、それが何を意味するかがわかっていません。ただ、教科書に書いている文字をタイプしています。そんな方々は、コードが動かなくなった時は対応しようがありません。「なんか動かないんですけど、どうしたら良いですか？」と、自信をなくした目で周りに助けを求めるしかありません。

対して、プログラミングができるようになる人は、うまくいかなくなった場合、自分のできるところまで戻ることをします。教科書を書き写していて、コードが動かなくなった場合も、自分がわかるところまでコードを消し戻し、不完全でも動くようにしてから課題となっているコードに再度とりかかることができます。応用の課題が出た時でも、まずは自分のわかるところまでプログラミングし、その後に必要な要素を積み重ねていくことができます。できる事を積み重ねていくことにより、できる事が広がっていきます。

# できる事を積み重ねるためのコツ。
とはいえ、自分のできる事を知る、というのは本当は難しいことです。
「出来た！」「動いた！」と思った時の状態を保存するようにしましょう。出来たソースコードの一連をコピー&ペーストして保存しておいてもいいですし、Gitなどの構成管理ツールにこまめにコミットしておくこともよいでしょう。

# プログラムができるようになるためのたった一つの方法。
プログラムができるようになるためのたった一つの方法。それは、
***できることを積み重ねる***
です。当たり前のようですが、実行するのはなかなか難しいのです。
できるだけ、小さいゴール、簡単にたどり着けるゴールを見つけて下さい。ゴールにたどり着く道筋が見えない、わからない時は、ゴールへたどり着く中間地点、今できるところに一番近い中間地点を見つけて下さい。そして、その中間地点にたどり着くことができたら、その状態にいつでも戻れるように、状態を保存するようにして下さい。自分のやっていることがよくわからなくなったら、一旦やっていることを忘れて、すぐにたどり着くことのできた中間地点に戻るようにしましょう。

# 教えている方や先輩へ。
要するに必要なのは成功体験なのです。受講者や後輩に、成功体験を積ませてあげられていますか？できた、と思わせてあげられてますでしょうか？
なぜ動くかの説明をしてあげることも重要ですが、まず、動いたことの感動や、新しい体験を味わうことを重要視してあげてください。出来た、という状態に戻れるように、出来なくなったら出来るところまで戻れるように、そして、たくさんの成功体験を積み重ねられるようにしてあげて下さい。

# 新人さんや、被研修者へ。
まずは、手を動かして、プログラミングしてみましょう。わからなかったとしても、次のアプリを作ってみましょう。動かなかった時は、あまりはまり込まずに、時には動かないソースコードを放り投げて、また１から作りなおしてみましょう。
ソースコードが動かなくなった時、問題の解決にハマり込んで時間を使ってしまうことは効率的ではありません。起きている問題を解決するのは、じつは新しくプログラミングをするよりもとても難しいことが多いのです。ハマってしまって時間を使うよりも１から作りなおしたほうが早い時も往々にしてあります。繰り返しプログラミングをしてくうち、問題点を解決する方法も、少しずつわかってきます。が、それがわかってくるのは相当量のプログラミングをした後です。
良くないのは「わからないからプログラミングできないし、プログラミングしないから分かるようにならない。」というループにハマってしまうことです。一生懸命勉強していらっしゃるのですが、プログラミング量を稼げないので、なかなか出来るようになりません。自転車の乗り方がわからないから自転車にのれなくて、乗らないから乗れる様にならないの、プログラミング版を行ってしまっています。
出来ないことに囚われるより、できることに戻ってみましょう。console.log("hello world")も立派なできることの一つです。できることを少しずつ手に入れて行きましょう。

皆さんがプログラミングの楽しさに辿り着けることを祈り、〆とさせていただきます。
WordPressのテーマやプラグインに仕込んだオレオレフックをPHPUnitでテスト


自作のテーマやプラグインにオレオレフックを仕込んで置くと、一気に汎用性が高くなって再利用をしやすくなります。

オレオレフックを仕込んでおくと便利な場所はだいたい以下のような感じ。

* HTML - たとえば`<div>おれおれ</div>`みたいなHTMLをサイトによっては`<p>おれおれ</p>`みたいに変えたいことがありますよね。
* 数字 - たとえば表示したいデータの数とかは、サイトによって5だったり10だったり。0とか1以外の数字は全部フィルターフックをつけてもいいぐらい。
* テキスト - たとえば`こんにちは！`を`やあ！`に変えたいとかは再利用をする際にはかならずあるので、テキストにもフィルターフックを仕込んでおくと便利です。

これらの場所にフィルターフックを仕込むのは簡単です。

```
return 'こんにちは！';
```

を以下のように修正するだけです。

```
return apply_filters( 'my_custom_filter', 'こんにちは！' );
```

これに関しては詳しいことが[プラグイン本](http://www.amazon.co.jp/gp/product/4797373520/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4797373520&linkCode=as2&tag=tni-22)に書いてあるので、そっちを読んでください。笑

## PHPUnitでフィルターフックの動作をテスト

このように自作プラグインにオレオレフックを仕込んだら、それが期待通りに動くか？とか想定したいろいろなシチュエーションで使いやすいかとかテストしたいですよね。

そんなときは以下のようにテストコードを書きます。

まずプラグイン側は以下のような感じを想定。

```
function hello{
	return apply_filters( 'my_custom_filter', 'こんにちは！' );
}
```

PHPUnitのテストコードは以下のような感じ。

```
class Oreore_Test extends WP_UnitTestCase
{
	/**
	 * @test
	 */
	public function filter_test()
	{
		// デフォルトの状態でテスト
		$this->assertSame( 'こんにちは！', hello() );
	    
	    // フィルターフックを追加した状態でテスト
	    add_filter( 'my_custom_filter', function( $str ){
	    	return 'やあ！';
	    } );
	    
	    $this->assertSame( 'やあ！', hello() ); // やあに変わったことを確認
	}
}
```

これだけだとあんまり意味がなさそうですが、ちょっとややっこしいのになると以下の様な感じになります。

以下の例では、`manage-downloads-link-html`というフィルターフックを仕込んで、そのコールバック関数に4つの引数が渡されるようにしています。

```
return apply_filters(
    'manage-downloads-link-html',
    sprintf(
        '<a id="manage-downloads-%1$s" href="%2$s">%3$s</a>',
        $atts['id'],
        esc_url( self::get_permalink( $atts['id'] ) ),
        esc_html( get_the_title( $atts['id'] ) )
    ),
    $atts['id'],
    self::get_permalink( $atts['id'] ),
    get_the_title( $atts['id'] )
);
```

この場合、それぞれの引数の値とかもチェックしたいですよね。

あとデザイナーさんの意図通りのHTMLに、テーマのfunctions.phpでカスタマイズできるかも確認しておきたいです。

そんなわけで、テストに書いたコードは以下のとおり。

```
add_filter( 'manage-downloads-link-html', function( $link_html, $post_id, $url, $onclick, $title ){
    return sprintf(
        '<a class="manage-downloads-%1$s" href="%2$s">%3$s</a>',
        esc_attr( $post_id ),
        esc_url( $url ),
        $title
    );
}, 10, 4 );
$this->assertSame(
    '<a class="manage-downloads-' . $post_id . '" href="http://example.org/download/' . $post_id . '">Download!!</a>',
    do_shortcode( '[download_link id="' . $post_id . '"]' )
);
```

長くメンテナンスしてると、使わなくなったフックとかあってうっかりフックの挙動を変えてしまうことがあるので、こうしておくととても便利ですよ。
[JavaScript] 標準機能のXMLHttpRequestでAjax／HTTP通信（jQuery不使用）

jQueryを使わずに、JavaScriptで標準化された `XMLHttpRequest` を使ってAjax通信する方法まとめ。<font color="red">（外部サーバーにはアクセスできないのでご注意ください。＝JavaScriptのクロスドメイン制限）</font>

jQueryを使ったAjax通信についてはQiita内にも記事が多数ありますので、検索してみて下さい。（⇒ <a href="http://qiita.com/search?q=jquery+ajax&sort=rel" target="_blank">検索結果</a>）

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) 同期アクセス

```js:JavaScript
// 同期アクセス
res = ajax("xxx.html");
alert(res);

// Ajax（同期タイプ）
function ajax(url) {
	var xmlHttp = new XMLHttpRequest();
	xmlHttp.open("GET", url, false); // true:非同期、false:同期
	xmlHttp.send(null);
	return xmlHttp.responseText;
}
```

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) 非同期アクセス

```js:JavaScript
// 非同期アクセス
ajax("xxx.html",
	function(res) {
		alert(res);
	}
);

// Ajax（非同期タイプ）
function ajax(url, callback) {
	var xmlHttp = new XMLHttpRequest();
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			callback(xmlHttp.responseText);
		}
	};
	xmlHttp.open("GET", url, true); // true:非同期、false:同期
	xmlHttp.send(null);
}
```

※ XMLHttpRequest 2 をサポートするブラウザーでは `onreadystatechange` の代わりに `onload` を使うこともできます。

▼デモはこちら
<a href="http://jsfiddle.net/yasumodev/rvd3vu06/" target="_blank">XMLHttpRequest Test｜JSFiddle</a>

(･o･ゞ いじょー。
CakePHP2 > CakePHP3で変わってたこととか

# CakePHP2 > CakePHP3で変わってたこととか

CakePHP2で作りかけのプロジェクトをCakePHP3へ移すことになったのでそれにあたって変わってたこととか気づいたことをまとめておこうと思います。

##redirectについて
```
<?php
public function index() {
       $this->log('a');
       $this->redirect('/');
       $this->log('b');
}
```
上記処理は、CakePHP2までは
```
 $this->log('b');
```
には処理は到達しませんでしたが、CakePHP3では上記処理まで進んだ後redirectします。

redirect前後などで処理を書いているものがうまく動作しませんので注意が必要です。

※redirectアクションの第三引数$exit自体がなくなってしまっています・・・。

##SessionComponentについて
CakePHP3ではSessionComponentが廃止されています。

代わりにCakeRequestにsession処理が追加されています。

CakePHP2からCakePHP3に書き換える場合は

```
$this->Session = $this->request->session();
```
でわりとちゃんと動きそうです。

##$this->Html->url()について
HtmlHelperからurlメソッドがなくなっています。

代わりにUrlヘルパーで

```
$this->Url->build();
```
で取得が可能です。

##Datetimeなどのnewについて
CakePHP3ではnamespaceが使用されているので
```
$date = new DateTime('2000-01-01');
```
と普通に書いてもDateTimeが見つかりませんとエラーが出ます。

```
$date = new \DateTime('2000-01-01');
```
とするか、先頭で
```
use \DateTime;
```
と宣言する必要があります。

##まとめ
他にもまだまだあると思いますがとりあえず気づいたところだけ先にまとめました。

(まだデータベース周りちゃんと触ってない・・・。ここが一番いろいろ変わってるはずですからね・・・。
Eclipseでkyesをexport -> importする


# eclipse -> preferences ... General->Keys

はい。ダメー。これはダメなパターン。
```export CSV``` はあれど、importがない。。


正解は・・・


# Export

File->Export…からGeneral->Preferences

![export-preferences.png](https://qiita-image-store.s3.amazonaws.com/0/68214/dae495ab-35dc-2f62-0b8b-b52a31d20bd8.png "export-preferences.png")



```Kyes Preferences```にチェックを入れて、```to preference file```に出力ファイルを指定して```Finish```する。

![select-keys-preferences.png](https://qiita-image-store.s3.amazonaws.com/0/68214/4371da38-e458-cb48-d0e4-85b90fc788f7.png "select-keys-preferences.png")


# Import
File->Import…からGeneral->Preferences

```From preference file```に先ほどExportしたファイルを指定する。
```Keys preferences```が表示されるので、チェックを入れて```Finish```

めでたしめでたし。


# 背景・所感・雑感
記憶力が乏しいせいか、デフォルト厨なので、あまり設定を弄りたくない。(弄ると忘れる・・・。)
ただ最近は、自分好みに設定を変えるようになってきた。やっぱりそっちの方が効率良いし。
で、eclipseのvupに伴い、keymapを移行しようとしたら気がついた。。
KeysにあるExportCSV機能は何のためにあるんだろうか・・・。
第8回 HTML5minutes！ 〜triton-js〜 のレポート。

# [第8回 HTML5minutes！](https://atnd.org/events/64086)
## 基調講演（19:35〜20:05）
太田 良典 氏（株式会社ビジネス・ アーキテクツ）
「WAI-ARIAで実現するマルチデバイス環境のWebアプリケーション」

* WAI-ARIAとはWeb Accessibility Initiative-Accessible Rich Internet Applicationsの略...詳しくは[こちらがうまくまとまっているようです。（レポーター発見）](http://www.hitachi.co.jp/universaldesign/ria/ajax/wai-aria/index.html)

* インタラクションは重要。
JavaScriptでクライアントサイドバリデーション等をするようにすると、リッチな体験を提供できる。

* しかしながら、インタラクションが多い画面はユニバーサルデザイン上すぐれないケースが有る。
インタラクションはスクリーンリーダーに読み上げられないことがある。その他にも、フォームの自動入力に対応できなかったり、多種多様なデバイスに対応出来ない場合がある。

* WAI-AREAの概要
要素に、役割（role）状態（state）関係（relation）通知（ライブリージョン）をつける。

# LT1
林 優一 氏	LIG inc.	フロントエンドエンジニアを維持するためにやっていること

* フロントエンドエンジニアが知らなければならない技術は増え続けている。
* 情報収集方法をするといい。
RSSやTwitter、Facebook、Google+、Github、勉強会を利用するとイイ。 

# LT2
岩淵 勇樹 氏	面白法人カヤック HTMLファイ部	イースターエッグのススメ

* イースターエッグを埋め込むとバズが期待できる。
* HTMLのソースに入れるのも一つの方法
* Googleに"tilt"と打ち込んでみましょう。
* Chromeの「インターネットに接続できません」画面で、「↑」を押してみましょう。
* "ピザブラック"のサイトを開発者ツールで見てみるとすごい。
コンソールログもすごい。いや、ほんとすごい。一読。

# LT3
道家 陽介 氏	1PAC.inc.	Web制作における大量の何かを大量にどうにかするライフハック

* 自動化すると良いよ。
 * 作業を設計するのが大事。
 * 途中でも立ち止まって作業フローを整理するのが大事。
 * 人がやらなくても良い作業は自動化
* しかしながら100%の自動化はすべきではない。
    * 人が考える作業とか。
* なにを自動化するか見極め大事

今回も、ありがとうございましたー。
AWS×Imagick×facedetectで困った話

#AWS×Imagick×facedetectで困った話

まぁ表題のとおりのわけですが・・・。

##何がうまくいかなかったか

- ほぼほぼ、[これ](http://qiita.com/satthi/items/d8fb39ad4d01a9e63173)のとおりImagickをAWSのAmazonLinuxにインストール
- まったく動作に問題なし。
- [これ](http://qiita.com/satthi/items/419ffe239cd946f4cc42)とほぼおなじ手順でfacedetectをインストールしたところ問題が発生
 - jpegは処理できるがpngが読み込みも書き込みもできない
 - facedetectは問題なく動作する
 - facedetectの読み込みを外すとpngの処理が問題なく走る
 - imagemagickのconvertコマンドでは普通にpngが使える

##何が問題だったか
ImageMagickのインストール前に「libpng-devel」をインストールしていなかったためだったよう。

##おまけ
AmazonLinuxでダメだったのでAWSのCentOSで試しても同じ事になりました。

ImageMagickをインストールする前に「libpng-devel」がインストールされていることは確認しておいた方がよさそうです・・・。
自分が気に入った enum 利用のスタイル（validationと一緒）

enum 使ってみたかったので試していたら、指定が配列だったりするとどうもバリデーションがうまく通らず（数値でも文字列でも拒否られてしまった。なにか方法があるのだろうか）、いろいろこねくって下記の形かなと思った。

なんだか時間をやけに使ってしまったのでとりあえず記録しておく。多分暫くは自分はこのスタイルで書くと思う。

i18nとかいろいろあるけどそれは追々。

```rb
class ProjectUser < ActiveRecord::Base
  enum role: {worker: 0, manager: 1}
  enum status: {normal: 0}

  validates :role,
            inclusion: {in: ProjectUser.roles.keys}
  validates :status,
            inclusion: {in: ProjectUser.statuses.keys}

end

```
レンダリングマネージャーMusterのソフト毎のライセンス数制限方法

Vvertex社のMuster version 7 でのMaya等ソフトウエアライセンス数による最大レンダリング数の制限方法を示す。

Musterにはライセンス数リミットの概念がぱっと見ないように見えるが実は制限できる。制限方法はテンプレートに直接書き込むのである。


SET MAXIMUM_LICENSES　という変数が有るので、これに値をセットすればリミットを設定することができる。
Promise のチェイン

Promise使うならthenでつなぎたいよね。以下の例は https://github.com/kriskowal/q のdeferredをつかったpromiseの生成。

(1) これはまぎれもなくAが出る。rejectしたらBが出る。

```js
var Q = require('q');
var d = Q.defer();

d.promise.then(function(){
    console.log('A');
  }, function(){
    console.log('B');
  });

d.resolve();
```

(2) rejectをチェインできる。

```js
var Q = require('q');
var d = Q.defer();

d.promise.then(function(){  
    console.log('A');
  }, null).then(function(){
    console.log('C')
  }, function(){
    console.log('D')
  });

d.reject();
```

(3) (2)と似てるけど、この場合は何が出るか。

```js
var Q = require('q');
var d = Q.defer();

d.promise.then(function(){  
    console.log('A');
  }, function(){
    console.log('B')
  }).then(function(){
    console.log('C')
  }, function(){
    console.log('D')
  });

d.reject();
```

(4) Promise内でエラーが発生したら、どうなるか。

```js
var Q = require('q');
var d = Q.defer();

d.promise.then(function(){  
  throw new Error('foobar');
}).then(function(){
  console.log('A')
}, function(){
  console.log('B')
});

d.resolve();
```

(5) catchもある。

```js
var Q = require('q');
var d = Q.defer();

d.promise.then(function(){  
  console.log('A');
}).catch(function(){
  console.log('B')
});

d.reject();
```

(6) return で別のPromise返すパターン

```js
var Q = require('q');
var d = Q.defer();
var d2 = Q.defer();

d.promise.then(function(){
    console.log('A');
    return d2.promise;
  }, null).then(function(){
    console.log('B');
  }, function(){
    console.log('C');
  });

d.resolve();
d2.reject();

```

(7) 別のPromiseがさらに別のPromiseを返す

```js
var Q = require('q');
var d = Q.defer();
var d2 = Q.defer();
var d3 = Q.defer();

d.promise.then(function(){
    console.log('A');
    return d2.promise.then(function(){
      return d3.promise.then(function(){
        console.log('B');
        return d3.promise;
      }, function(){
        console.log('C');
        return d3.promise;
      });
    }, function(){
        console.log('D');
    });
  }, function(){
    console.log('E');
    return d.promise;
  }).then(function(){
    console.log('F')
  }, function(){
    console.log('G')
  });

d.resolve();
d2.reject();
d3.resolve();
```

(8) Catchを使う。

```js
var Q = require('q');
var d = Q.defer();
var d2 = Q.defer();
var d3 = Q.defer();

d.promise.then(function(){
    console.log('A');
    return d2.promise.then(function(){
      return d3.promise.then(function(){
        console.log('B');
      }).catch(function(){
        console.log('C');
      });
    }).catch(function(){
        console.log('D');
    });
  }, function(){
    console.log('E');
    return d.promise;
  }).then(function(){
    console.log('F')
  }, function(){
    console.log('G')
  });

d.resolve();
d2.reject();
d3.resolve();
```

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

---

正解は
(1) A (2) D (3) B C (4) B (5) B (6) A C (7) A D F

もう少し頑張ればPromise Hellが作れそう。
簡単に迷わずAmazon ELBにGlobalSign社のクイック認証SSLを導入する方法

## GlobalSign社ドメイン認証
下記は例ですが、様々なドメイン認証方法が用意されているので、
ドメインの所有者が本人であることを証明します

* メール認証
* ドメイン認証（TXTレコード）

## PKCS#12の鍵変換
ターミナルなどコンソールアプリで以下の手順で鍵を変換します
入力を求められるパスフレーズは申請時の入力した文字列+申請後に表示される文字列

> $ openssl pkcs12 -in CEDSXXXXXXXXXX.pfx -nocerts -nodes -out server.key
> $ openssl pkcs12 -in CEDSXXXXXXXXXX.pfx -clcerts -nodes -out server.crt
> $ openssl pkcs12 -in CEDSXXXXXXXXXX.pfx -cacerts -nokeys -out server.ca-bundle

## 変換した後も鍵付きになっているので server.key の鍵を外す
> $ openssl rsa -in server.key -out server-nopass.key

## Amazon ELBにSSL証明書を登録
### Certificate Name
※ 管理できる名称をつけること
> e.g. GlobalSign_cada.jp_CEDSXXXXXXXXXX

### Private Key
server_nopass.key ファイルの内容

### Public Key Certificate
server.crt ファイルの内容

### Certificate Chain
server.ca-bundle ファイルの1個目
CentOSにepelリポジトリ追加


nodejsをyumでインストールするため、epelリポジトリの追加を行った。

32bitの場合

```
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
```

64bitの場合

```
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

この状態だと、デフォルトでepelが有効。また下記のようなエラーになってしまう。

```
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
```

こちら(参考2)の情報に従って以下の変更を行う。

```
# sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo
# sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo
```

*参考*
1.http://qiita.com/you21979@github/items/4efd9fc4363573191b5c
2.https://community.hpcloud.com/article/centos-63-instance-giving-cannot-retrieve-metalink-repository-epel-error
3.http://centossrv.com/epel.shtml
ShellScriptでexpectを使った時に処理が中断してしまう時の対処

set timeoutが足りてない？
デフォルトは20秒らしいので、時間のかかる処理でexpectを利用する場合はもっと長い時間を設定しておかないと途中で終了してしまうみたい


```
#!/bin/sh

# install mecab-ipadic-neologd
expect -c "
set timeout 60
spawn ./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd
expect \"*Do you want to install mecab-ipadic-neologd? Type yes or no.*\"
send -- \"yes\n\"
"

```
Ansibleでメールサーバーを建ててみる

Webサーバーはよく建てるがメールサーバーは建てた事が無い・・・
なので、簡単に建てられるメールサーバースクリプトを書いてみました。

[githubへ](https://github.com/aozora0000/mail_server_scripts)

Ansibleのwith_itemsを使って、バーチャルメールボックスの作成・IDパスワードの発行が出来るようにしてみました。

またメールのバックアップ先としてAmazonS3を採用しているので、構築→撤去→再構築が非常に楽です。

# メリット
- コマンド一発でメールサーバーが構築出来る。
- Yamlファイルでアカウントを管理出来るので、MySQLよりも構築が簡単で設定しやすい。
- メールのバックアップはS3に全部投げてるからトラブル時の復旧が楽。

# デメリット
- CentOS6.*しか使えない。
- アカウント追加に毎回ansibleの実行が必要。
- アカウントIDがメールアドレスに固定される。
- TLSサポートしていない
- .bashrcとか上書きしちゃう

とデメリットが非常に多くなってしまいましたが、実験やお手軽なメールサーバーの構築に役立てて頂けると幸いです。

初めてメールサーバーを建てたので、おかしい設定・バグ・セキュリティ欠陥等あればコメントして頂けると嬉しいです。


# 追記
## 2015-04-16
- 単位時間辺りの配信数制限を追加しました。
- クライアント辺りの同時接続数/時間あたりの接続回数制限を追加しました。
- 特定のドメインに対する遅延配信設定(スパム回避の為)を追加しました

## 2015-04-14
- 簡易メーリングリスト機能を追加しました。
- メールエイリアスに関する設定を変更しました。

## 2015-04-13
- クォータの設定の代わりにドメイン毎の容量レポーターを追加しました。
- imap接続に対応しました。
RailsでWEBrickが重い

RailsでWEBrickを使っているが、レスポンスが遅すぎてがっかりしている人へ
# やり方
－設定ファイルを探す
　`$ gem which webrick`

－webrick.rbの場所が表示されるが、webrickフォルダにあるconfig.rbを編集する

```lang:config.rb
:DoNotReverseLookup => nil,
```
を下記のように変更する

```lang:config.rb
:DoNotReverseLookup => true,
```

以上です
重さが解消されて、やる気が出る
SQL Serverに繋ぐ上での設定

##SQLServer2000の場合
sqlclientをインストールしておくこと
@ITのフォーラムでMicrosoft SQL Server Native Clientと言っていました
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39153&forum=26

下記のサイトから「sqlncli.msi」をDownloadsしてインストール
http://www.microsoft.com/ja-jp/download/details.aspx?id=24793

##SQL Server 2008R2 
リモート接続できるように下記のように許可をする必要がある。
名前付きインスタンスではなく、SQLパスワードのモードにしておくことをお勧めします。
http://awoni.net/fc/remote
Rails4 ActiveRecordでatomicなSQLでincrementするハック

# Rails4 ActiveRecordでatomicにincrementしたい
ボタンが押された回数をカウントしたり、特定ページのPVをカウントしたりと、大量にカウントしたい場合、とか、こういうatomicなSQLで効率よくカウントしたいですよね。

```sql:こんなSQL
UPDATE `pages` SET `viewed_number` = COALESCE(`viewed_number`, 0) + 1, `updated_at` = now() WHERE `pages`.`id` = 1
```

## 普通にincrement!を使うとカウントが漏れる
RailsというかActiveRecordをみると、「[increment!](http://apidock.com/rails/ActiveRecord/Base/increment!)」っていう如何にもなネーミングのメソッドがありまして、これでいいだろうと思っていたのですが、、、、呼び出し時のSQLをよく見てみると

```sql:increment!によるSQL
UPDATE `pages` SET `viewed_number` = 13, `updated_at` = '2015-04-10 07:36:24' WHERE `pages`.`id` = 1
```

だめじゃん。。。
アップデートされる数字がmodel内の数字に1を足しただけなので、以下のようなケースでカウント漏れが、、、

```rb:こんなケース
page   = Page.find(1)            #viewed_number 1
page_2 = Page.find(1)            #viewed_number 1
page.  increment! :viewed_number #viewed_number 2
page_2.increment! :viewed_number #viewed_number 2
```

おしいんだけどなー。。

## 作りました
そこで、atomicなincrementをするメソッドを用意しました。

```rb:initializer/add_increment_atomic
module ActiveRecord
  class Base
    def increment_atomic!(attribute, by = 1, touch = true)
      operator = by < 0 ? '-' : '+'
      quoted_column = self.class.connection.quote_column_name(attribute)
      updates = ["#{quoted_column} = COALESCE(#{quoted_column}, 0) #{operator} #{by.abs}"]
      updates << "#{self.class.connection.quote_column_name(:updated_at)} = now()" if touch
      self.class.unscoped.where(self.class.primary_key => id).update_all updates.join(', ')
      reload
    end
  end
end
```

最初はincrement!メソッドを上書きしちゃおうかと思ったのですが、影響範囲が読めないので別名にしておきました。

initializerに置くなり、上記のdef部分だけApplicationModel的な親モデルを作って置くなりしてお好きな様にご利用ください。

（もっといい方法知ってるぜ！という方、ぜひ教えて下さい＞＜）
チーム開発でやっといたら便利だったHerokuの設定


特に目新しくはないのですが、チーム開発する際に便利だなと思ったHerokuの設定を紹介したいと思います。

## Automatic deploys

この機能を有効にすると、masterにマージやpushされると自動でHerokuにpushしてくれます。


それでは、早速実際の設定の仕方をみていきましょう。

HerokuのDashboadで設定します。[Code]から[GitHub]を選びます。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/f3c3533a-18e3-ab5c-73c4-9c540af516ce.png "skitch.png")

[Connect to GitHub]を押すと、リポジトリの選択画面が表示されます。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/6948b29f-f5f6-66ff-2cf7-08f2029de1d4.png "skitch.png")

リポジトリー名の一部を入力して[Seach]します。そうすると、該当するリポジトリの一覧が表示されるので、連携したいレポジトリを[Connect]して設定画面を表示します。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/b3fa555d-b726-7652-d4be-15d3706f2ba9.png "skitch.png")

masterにpushした際、自動でデプロイするように、設定画面の[Automatic Deploys]の[Enable Automatic Deploys]にします。

これで、設定ができたので、設定したGitHub上のリポジトリのmasterにpushすると[Activity]でBuildが自動で始まることを確認できます。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/db3b75e3-0776-fde2-588e-e12cae2a56cf.png "skitch.png")


また、しばらく経つとデプロイができたことを確認できます。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/68cdb4ab-e934-4687-3aed-0ca02c3899cd.png "skitch.png")


## デプロイの通知

DashboardからActivityを見ればデプロイの状況はわかるのですが、いちいちブラウザを開くのも面倒です。そこで、Slackに通知するようにします。

それでは、その設定の方法を紹介します。

まず、Slackで[Configure Integrations]を開きます。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/232ef15d-9fd8-0b9b-5ff6-e73bf1748d79.png "skitch.png")

ずらっとリストが並んでいる下の方の[DIY Integrations & Customizations]の[Incoming WebHooks]を[Add]します。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/707ff988-ccc9-8925-dbcf-3b911dc18358.png "skitch.png")

通知先のチャンネル選択画面が表示されるので、通知したいチャンネルを選択して[Add Incoming WebHooks Integration]します。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/3f962fec-c2ff-72bb-73b7-abbd7584c416.png "skitch.png")


Incoming WebHooksの詳細画面が表示されるので、その画面の[Webhook URL]を参照します。

このURLをコピーし、以下のコマンドのtokenにペーストして実行します。

```
$ heroku addons:add deployhooks:http url="https://xxxxx.slack.com/services/hooks/heroku?token=***************************"
```

これで、Herokuにデプロイが完了したらチャンネルにこんな通知が飛ぶようになります。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/4116/250694ba-95da-be3c-27dd-08873b5a7a22.png "skitch.png")


## まとめ

Herokuへの自動デプロイは、いままでもCIなどを使って実現可能ではあったのですが、Heroku標準の機能で何クリックかで設定できようになったのでだいぶ楽になりました。

あと、あわせてデプロイの通知をしておけば、自動デプロイでデプロイされたのがSlackに通知されるので非常に便利です。
htmlからslimに変換するコマンド



## はじめに
htmlからまとめてslimに変更しようとするコマンドはけっこう簡単
忘れないようにここに書いておく



### 前提条件
Ruby2.2.0
html2slim 0.2.0

### html2slimのインストール

```
gem install html2slim
```

## htmlからslimへ変換

実行する対象のディレクトリに移動して
下記のスニペットをファイルにしてrubyで実行すると再帰的に、ディレクトリ構成もそのまま変換してくれる

```sh
html2slim in_dir out_dir
```

P.S.
erb2slimというのもあるので、便利(ただしプロダクションで試していないのでちゃんと変換してくれるのだろうか心配)
scssからsassへ変換するスニペット


## はじめに
scssからまとめてsassに変更しようとするとsass-convertと言うコマンドがあるが、1ファイルずつしか出来ず、まとめて変換できない。

そこでまとめて変換できるスニペットを書いた

### 前提条件
Ruby2.2.0
Sass 3.4.13

### sassのインストール

```
gem install sass
```

## scssからsassへ変換

実行する対象のディレクトリに移動して
下記のスニペットをファイルにしてrubyで実行するか、irb, pryを起動して変換する

```ruby

# 入力するSCSSのあるディレクトリパス
stylesheets_path = "assets/stylesheets/"

# 出力先のディレクトリパス
output_path = "output_stylesheets/"

Dir.glob("#{stylesheets_path}**/*.scss").each{ |f|
  # 変換先のファイル名を作成
  sass = f.gsub(".scss", ".sass")

  # 転送先のディレクトリを作成する
  path = f.reverse.sub!(/[^\/]+\//, "").reverse
  FileUtils.mkdir_p(output_path + path})
	
  # 外部コマンドで実行(普通にSassのライブラリを呼んでも良いと思う)
  system("sass-convert #{f} #{output_path + sass}")
}
```
Yosemiteでtmuxのwarningを解消


Yosemiteにアップグレードしてから、tmuxを起動しようとしたらwarningがでてしまった。

```
warning: reattach-to-user-namespace: unsupported new OS, trying as if it were 10.6-10.9
warning: _vprocmgr_move_subset_to_user failed
warning: reattach-to-user-namespace: unable to reattach
```

アップグレードしたらなおった。

```
$ brew upgrade reattach-to-user-namespace
```
Sinatraのインストールとsinatra-contribのエラーの回避

#前提
Vagrantで作成した仮想マシンで、Ruby他がなんとなく動いてる状態から、sinatraが使える状態までをゴールにしています。

#事前準備
Vagrantで作成した仮想マシンに作業用フォルダを作成し、移動する。

#Sinatraのインストール
sinatraのインストール
`$ gem install sinatra`

sinatra-contribのインストール
`$ gem install sinatra-contrib`

#データベースを使う場合のインストール
Active_Recordのインストール
`$ gem install activerecord`

SQLite3のインストール
`$ gem install sqlite3`

#WEBサーバの立ち上げ
ruby {hogehoge.rb} -h で起動オプションを確認する
`$ ruby {hogehoge.rb} -o 192.168.33.10`

ポート番号を確認する。デフォルトは、4567
`$ http://192.168.33.10:4567/`

Sinatraの停止、ターミナルで「Ctrl+C」

#リロードの設定
{hogehoge.rb}に追記する
`require 'sinatra/reloader'`

WEBサーバの立ち上げ
`$ ruby {hogehoge.rb} -o 192.168.33.10`

#エラーが出る場合
errorの内容
> /home/vagrant/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/site_ruby/2.0.0/rubygems/specification.rb:2112:in `raise_if_conflicts': Unable to activate sinatra-contrib-1.4.2, because tilt-2.0.1 conflicts with tilt (~> 1.3) (Gem::ConflictError)

衝突しているGemを取り除いてみる。
該当のGemを確認
`$ gem list`

tilt (2.0.1, 1.4.1)があることを確認できる。
ログを見ればわかりますが、実はsinaraインストール時にtilt2.0.1が、sinatra-contribインストール時にtilt1.4.1がインストールされてます。どちらかをアンインストールすることでエラーを回避できるはず。
`$ gem uninstall tilt`

選択肢が現れる
`Select gem to uninstall:
　1. tilt-1.4.1
　2. tilt-2.0.1
　3. All versions`

2.を選びます。

これでエラーは解消されます。tilt-2.0.1を外すことによる他への影響は不明です。
SceneのinitでreplaceSceneすると解放されてしまう問題とその対策

表題の通りです。

- GatewayScene
- MainScene

ある条件を満たしたときに、GatewaySceneからMainSceneへ遷移したいということがあると思います。

ここで以下のようなコードを書いてしまうと思ったような結果が出ません。

```
bool GatewayScene::init()
{
    if ( !Layer::init() ) {
        return false;
    }
    
    auto mainScene = MainScene::createScene();
    Director::getInstance()->replaceScene( mainScene );
    
    return true;
}

// AppDelegateなどで以下のようにしている想定です
{
    auto scene = GatewayScene::createScene();
    Director::getInstance()->runWithScene(scene);
}

```

これは、Directorのインスタンスが持っている_sceneStackにGatewaySceneのインスタンスをpushBackするより先にMainSceneをpushBackしちゃうのが原因です。
以下の様にするとこの問題がなくなります。

```

bool GatewayScene::init()
{
    if ( !Layer::init() ) {
        return false;
    }
    
    this->runAction( CallFunc::create([](){
        auto mainScene = MainScene::createScene();
        Director::getInstance()->replaceScene( mainScene );
    });
    
    return true;
}
```

runActionの中で実行すると、ループの次の周回で処理が行われるのですね。
これに限らず、画面の構築以外の処理はinitでやらず、一回runActionを噛ませておいた方が良いのかも知れませんね。
Mailman の会員検索で、マルチバイトな会員名での検索ができない

Mailman の会員検索で、マルチバイトな会員名での検索ができないので調べてみたら、POST された検索語を decode していない、というありがちなパタンだった。

```
--- Mailman/Cgi/admin.py	2014-02-04 02:09:14.000000000 +0900
+++ Mailman/Cgi/admin.py	2015-04-10 15:13:58.810916527 +0900
@@ -900,12 +900,16 @@
     # The email addresses had /better/ be ASCII, but might be encoded in the
     # database as Unicodes.
     all = [_m.encode() for _m in mlist.getMembers()]
     all.sort(lambda x, y: cmp(x.lower(), y.lower()))
     # See if the query has a regular expression
     regexp = cgidata.getvalue('findmember', '').strip()
+    try:
+        regexp = regexp.decode(Utils.GetCharSet(mlist.preferred_language))
+    except:
+        pass
     if regexp:
         try:
             cre = re.compile(regexp, re.IGNORECASE)
         except re.error:
             doc.addError(_('Bad regular expression: ') + regexp)
         else:
```

手前の `all = [_m.encode() for _m in mlist.getMembers()]` が気になるけれど、メールアドレスは ASCII 文字しか使われないのでそのままにしておく。
ExcelでCSVやタブ区切りファイルを文字列として読み込む

#はじめに
ExcelでCSVやタブ区切りテキストファイルを読み込むと、フォーマットを自動認識して数値の先頭のゼロが消えてしまったり、勝手に日付と解釈したりとか色々と問題を起こします。
ネットで調べてみるとこれを解決するために全て文字列として読み込む方法を色々と試行錯誤しているようですが、どれもしっくりこないのでコードを書いてみました。


# 処理内容
　1. ファイルダイアログで読み込むファイルを選択
　2. 事前に全セルのフォーマットを文字列にセットする
　3. ファイルを1行バッファに読み込む
　4. 区切り文字で分割してセルに書き出す
　5. EOFまで3,4を繰り返す
　
※ 改行コードがCR+LFでない場合には対応していません。事前に変換して下さい。
(LFのみのファイルを指定すると列方向に書き出されてしまいます。)

#VBAコード 

```lang:ExcelVBA 

Option Explicit
Sub ReadTabDelimitedTextFile()

'タブ区切りファイルを全て文字列として読み込む

    Dim FileName As String
    Dim i As Long
    Dim Cnt As Long
    Dim Buf As Variant
    Dim FileNo As Integer
    Dim SplitString As Variant
    
    'ファイルダイアログを表示
    FileName = Application.GetOpenFilename("テキストファイル,*.txt")
    
    If FileName <> "False" Then
    
        '全セル選択して書式を文字列にセットする
        Cells.Select
        Selection.NumberFormatLocal = "@"
        Cells(1, 1).Select
        
        '空いているファイル番号を取得
        FileNo = FreeFile()
        Buf = Space(FileLen(FileName))
        
        'ファイルを開いてbufに1行読み込み
        ' → タブで配列に分割
        ' → セルに書き出し
        Open FileName For Input As #FileNo
        Do Until EOF(FileNo)
            Line Input #FileNo, Buf
            Cnt = Cnt + 1
            SplitString = Split(Buf, vbTab)
            For i = 0 To UBound(SplitString)
                Cells(Cnt, i + 1) = SplitString(i)
            Next i
        Loop
        
        Close #FileNo
        
        'そのままでは数式等が使えなくなるため、書式を標準に戻す
        Cells.Select
        Selection.NumberFormatLocal = "G/標準"
        Cells(1, 1).Select

    Else
        
        'ファイルダイアログをキャンセルされた場合何もしない
        
    End If
End Sub
```
ローカルのファイルをEC2サーバーに転送する


`scp -i 公開鍵 ファイル ユーザー名@転送先:保存ディレクトリ`

具体的にはこんな感じ
`scp -i ~/.ssh/test.pem sample.txt ec2-user@ec2-12-34-56-789.ap-northeast-1.compute.amazonaws.com:~/.`
CakePHP Modelの中で他のモデルを使う(App:import を作ってクラスを読み込む)


(CakePHP ver 2.x)

Controllerから複数のModelを呼び出すことは簡単に出来ます。
  public $uses = array(‘Model1’,’Model2’);
のようにしてModelの設定をするだけで、Model内のfunctionを呼び出せます。

ここでは、Modelの中で他のModelの中のfunctionを使うのも簡単にできちゃうよってお話をします。

登場するのは
App:import。

App:importは適用範囲が広いようですが、ここではModelを呼び出します。
よく使う処理をまとめたクラスを「vendors」に入れて「App:import」で呼び出したりして使ったりするようです。

#やり方は簡単3Step
＊＊＊＊＊
step1:modelの呼び込み
step2:クラスのインスタンス化
step3:実際に使う
＊＊＊＊＊

ここでは、読み込むmodelをHogeにします。

##step1:modelの呼び込み
```
App:import(‘Model’,’Hoge’);
```
の一行で呼び出します。

##step2:クラスのインスタンス化
初期化します(左辺の変数名はご自由に）

```
 $hogeModel = new Hoge();
```

##step3:実際に使う
```
$this->hogeModel->find(‘all’,$options);
```
みたいな感じで使っちゃって下さい！

#注意点
クラスは一度しかロードされない。
適切な親クラスがロードされる。
自動的にパスを解決することが多い。
クラスは初期化する必要がある。

requireでの読み込みと同じイメージでオーケー。
Atom plugin メモ


## atom-alignment

範囲選択して `ctrl + cmd + a`
`=` とかの位置整列

## docblockr

doc コメント
sublime の docblokr みたいなやつ

## git-plus

Atom 上から git 操作できる

## Sublime-Style-Column-Selection

`option + drag`
矩形選択

## Pain Split

パネル分割

```
https://atom.io/packages/pain-split

'.platform-darwin':
  # Open an empty pane and bring it to focus to do as you will.
  # If there had to be only one way to split panes, this should have
  # been it.
  'cmd-k left':  'pane:split-left-creating-empty-pane'
  'cmd-k right': 'pane:split-right-creating-empty-pane'
  'cmd-k up':    'pane:split-up-creating-empty-pane'
  'cmd-k down':  'pane:split-down-creating-empty-pane'

  # Open a new pane and move the current editor tab to it.
  'cmd-k m left':  'pane:split-left-moving-current-tab'
  'cmd-k m right': 'pane:split-right-moving-current-tab'
  'cmd-k m up':    'pane:split-up-moving-current-tab'
  'cmd-k m down':  'pane:split-down-moving-current-tab'

  # Atom's default behavior. "D" for duplicate the current tab.
  # It's still there if you want it, I guess.
  'cmd-k d left':  'pane:split-left'
  'cmd-k d right': 'pane:split-right'
  'cmd-k d up':    'pane:split-up'
  'cmd-k d down':  'pane:split-down'
```
フォーカスの変更は `cmd + k, cmd + n (cmd + p)`

##
幅可変でmargin:0 auto; ~display:tableの不思議~

# 概要
inline要素のようにテキストの長さによって要素の幅を変え、さらにその要素をmargin:0 autoで中央寄せに出来ないかっていうのを以前に悩んだのですが、対応策があったので紹介します。
ちょこちょこ使えて意外に便利だったっりします。

#試行錯誤
marginをかけるのでinline要素では無理で、block要素だと幅が親要素に依存してしまうので

```css
display:inline-block;
margin:0 auto;
```

というような感じでいけるのではないかと思いましたが無理でした。

#対応策
というわけで、対応策をいってしまうと

```css
display:table;
margin:0 auto;
```

これだけでオーケー。
お試しあれ。

#追記
@ituki_b さんが比較デモを作って下さいました。
とてもわかりやすいです。

[【display】幅可変でmargin:0 autoとtext-alignでの中央寄せ比較](https://codepen.io/ituki_b/pen/KKwoMxa)

【更新】 2020.01.09

ありがとうございます！
SyncGatewayの_changesでドキュメントの変更通知を受信

SyncGatewayはCouchbase LiteとCouchbase Serverの同期を担当するだけでなく、他のコンポーネントからも直接利用することができるAPIをもっています。

今回は、ドキュメントの変更通知が取得できる、_changes APIをご紹介します。

本文は[ブログ](http://ijokarumawak.github.io/couchbase/2015/04/10/syncgateway-changes/)で公開しています。

目次:

1. <a href="http://ijokarumawak.github.io/couchbase/2015/04/10/syncgateway-changes/#step-1">REST APIを利用したJSONドキュメントの登録</a>
2. <a href="http://ijokarumawak.github.io/couchbase/2015/04/10/syncgateway-changes/#step-2">_changes API</a>
3. <a href="http://ijokarumawak.github.io/couchbase/2015/04/10/syncgateway-changes/#step-3">_changes APIのクエリパラメータ</a>
4. <a href="http://ijokarumawak.github.io/couchbase/2015/04/10/syncgateway-changes/#step-4">SyncGatewayのGo実装を見てみよう</a>
5. <a href="http://ijokarumawak.github.io/couchbase/2015/04/10/syncgateway-changes/#step-5">cURLで実行してみよう</a>
Android Studioでno debuggable applications

自分用メモ。

```
debuggable true
```
って設定してるのに、たまにAndroid Studioでno debuggable applicationsって表示されてLogCatがアプリケーション単位でフィルタリングできない（NoFilterにしたら見えるのでログ自体は出てる）事象が起こってたんですが、単にEnable Android Integrationのチェックが外れてるだけでした。

```
Tools > Android > Enable Android Integration
```
ここにチェックいれたら解決。
Windows8でWordPressの環境をつくる

WindowsでWordPressを勉強するための環境をつくるにはどうすればよいのだろう？と考えてみたら普通にMySQL+Apache2+PHPをインストールするだけでした。
<h2>MySQLインストール</h2>
http://dev.mysql.com/downloads/windows/installer/

ここからインストーラーをダウンロードします。注意点は、 <code>Windows (x86, 32-bit)</code> は64bitにも対応してるということです。最初気づかなくて、64bit版がない…だと！と焦りました。

インストーラーで迷うことはないでしょう。インストールしたらWindowsのサービスとして起動します。
<h2>Apache2インストール</h2>
http://www.apachelounge.com/download/

こちらからzipをダウンロードして<code>c:¥</code>に展開します。<code>c:¥</code>直下に置くのが嫌なら<code>Readme</code>を見た上で、<code>httpd.conf</code>を編集しましょう。 サービス化する方法も<code>Readme</code>に書いてあります。
<h2>PHPインストール</h2>
http://windows.php.net/download/

ここからzipをダウンロードして同じように<code>c:¥</code>に展開します。<code>php.ini-development</code>を<code>php.ini</code>としてコピーしてリネーム。

<code>httpd.conf</code>に追記。

<code>LoadModule php5_module "C:/path/to/php/php5apache2_4.dll"
AddHandler application/x-httpd-php .php
PHPIniDir "C:/path/to/php"</code>
<h2>Wordpressインストール</h2>
http://ja.wordpress.org/

ここからダウンロードして <code>c:¥/path/to/apache/htdocs/</code>に展開します。 あとは<code>php.ini</code>を開いて

<code>;extension=php_mysql.dll
;extension=php_mysqli.dll</code>

をコメントアウトします。

<code>extension_dir = "c:/path/to/php/ext"</code>

として、PHPのインストールフォルダを絶対パスで指定します。
Yahoo!JavaScriptマップAPIで図形を描画したときの地図の操作について

Yahoo!JavaScriptマップAPI についての質問です。

Y.Circleを用いて地図上に円を描きました。

その後、ドラッグで地図をスクロールしたところ、
・円以外からドラッグをはじめればスクロール可能
・円の中からドラッグをはじめるとスクロール不可
となりました。

円の中からドラッグしてもスクロールさせたいのですが
どのようにすればよいでしょうか。
FORM SF 2014: Fireside Chat 自分用メモ

https://www.youtube.com/watch?v=3wipr1KRt_g&list=PLOU2XLYxmsIKAdUSJXLXHNAXkTTZzXolW&index=5

* Joshua Topolsky
* Matias Duarte, Android チーフデザイナー

# 今までデザインについて批評家としてやってきた経験を踏まえて、今目の前にいるデザイナーたちに、これからプロダクトを作る前に意見を述べられるとしたら、何を言いますか？

* 少数のテストグループに意見を求めるな
    * その問題について一番理解している自分自身の信念に従ってデザインすべき

* 自分だけの問題を解決することを考えるべきではない
    * 自分を客観的な立場まで引き上げて、他の人の問題にも意識を向けられるようにすべき
    * 少数のテストグループにフォーカスすることだけにデザインを頼るのはよくない
    * ただ、少数のテストグループから、他人がその問題に対してどの程度理解できるか？を確認するための手段としてはうまくワークする部分もあると思う


* 他の人に目を向けるなとは言ってない
    * 人工的に作られた環境での反応を見ているだけでは本当の問題解決にならない

# スキューモフィックからマテリアル、混乱しちゃうよ

* 技術の進化が表現の幅を与えた
    * ノウハウが溜まってきて、有効な解決法が見出されてきた
    * キーボードと同じで、何回か変化を遂げて、今のQWERTY キーボードに落ち着いた
    * 技術の進化の過程にはスイッチングコストが発生する
    * いわゆる谷が存在する
    * 谷を乗り越える部分はチャレンジが必要な部分となる

* news design (print design)
    * three by two
    * 二乗三乗の法則
        * 相似する形の物質のサイズが変化するとき、その比率も相似するという法則
    * staitc size のデザインにはうんざりしてしまった(?)

# デザインを組織の中で浸透させていくには？

* デザインリーダーたちを巻き込んで、デザインを愛するデザイナーのグループを作って、議論を尽くして、少しずつ良い関係を築いた


# デザインに関する意見の対立はどう解消する？

* コンテンツが表現したい機能にどうやってユーザーのフォーカスを向けさせるか？が重要
    * コンテンツの階層をどうコントロールするか
    * カードを背景に持ってくるか、などユーザーのフォーカスに作用するレイアウトのトリックがある

# シンプルになりすぎることを心配しますか？

* パワフルなツールは学習が必要なことがある
* 学習が不要なことを追求することでパワーが失われてしまうのでは？

* よいフレームワークが必要
    * どうシンプルにするか？ という議論するための土台
    * 単に、モバイルが主流になっていく中で、モバイルが圧倒的に小さいということが背景としてある
    * 小さいがうえに、本質に集中する必要がでてくる
    * 質問を書いたノートカードは、質問が鋭くなりパワフルだが、それと共にシンプル
    * 必要であれば、他のツールと組み合わせて使うこともできる


* 全ては動的にサイジングされるべき、固定なものではない
    * transition も同じ、言い換えればサイズが変わることと捉えられる


# ハンマーを買いに行ったときに、客はどうやってよいハンマーを選べばよい？

* やろうとしているのは、顧客にぴったりのハンマーをオーダーメイドしてあげること


# この世に存在する中で一番美しいオブジェクトは何か？

* 京都の稲荷神社での経験、建物
    * 建物でもあり、音楽のようでもあり、エクササイズでもあった

# 英単語メモ

* マントルとは？
    * 核の外側にある層

* carpenter
    * 大工

* silo
    * 自己中心的な組織

* mandate
    * 委託、命令

* empathy
    * 共感

* kudos
    * 功績

* convergent
    * 収束した

* cabal
    * 派閥

* committee
    * 委員会

* patriot
    * 愛国者

* dissent
    * 反対する

* Nail gun
    * 釘打ち機


# メモ
* 雑感
    * マテリアルデザインの思想は、シンプルなものをいかにうまく組み合わせるかを解決しようとしている、という点でLinux の思想と近いものがあるのかな
surface pro 3 でpause を使う

#概要
まずはごめんなさい。Qiitaにはこんな技術的ではないチラ裏的なことを書いてしまって。
Evernoteはメモフォルダを分割しすぎて、よくメモったことがいなくなるので、、、

#レジストリ
普段ESCの押し間違いでよく押してしまうF1をPauseにします。

```registry:path
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
```

##バイナリ作成
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/63ffd664-beb9-3896-ae98-9dc01fea7f5d.png)

再起動後はF1がPauseになります！
これで手前表示愛用ツール「[最前面でポーズ](http://so-zou.jp/software/pause/)」が使えるように！
Quick/NimbleをObjective-Cのテストコードで使う

はまったのでメモ。

# 必要なヘッダーが不足しています

サンプルコードを見ると、以下のようになっている。

https://github.com/Quick/Quick/blob/master/Documentation/QuickExamplesAndGroups.md

```
// Objective-C

#import <Quick/Quick.h>
#import <Nimble/Nimble.h>

QuickSpecBegin(DolphinSpec)

it(@"is friendly", ^{
  expect(@([[Dolphin new] isFriendly])).to(beTruthy());
});

it(@"is smart", ^{
  expect(@([[Dolphin new] isSmart])).to(beTruthy());
});

QuickSpecEnd
```

これをまねして、ごくシンプルに書いてみよう。

```
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>

QuickSpecBegin(SampleSpec)

describe(@"Sample", ^{
    it(@"比較", ^{
        expect(@2).to(equal(@1));  // ←ここでコンパイルエラー
    });
});

QuickSpecEnd
```

コンパイルできないじゃないですか。

`SampleSpec.m:16:20: Definition of 'NMBExpectation' must be imported from module 'Nimble.Swift' before it is required`

指示された通りに、ヘッダーを追加しましょう。

```
  #import <Quick/Quick.h>
+ #import <Nimble/Nimble-Swift.h>
  #import <Nimble/Nimble.h>
```

無事にコンパイルが通りました。
(Assertionは失敗するコードです。)

## XCodeのバージョンとQuick/Nimbleのバージョン

上述のエラーを考えているときに、このissueを発見。

[https://github.com/Quick/Quick/issues/269]

Swift1.1の環境(=XCode 6.2)では、Quick v0.2.xとNimble v0.3.xを使ってね、というはなし。

検証してみたが、XCode6.2(6C131e)において、
Quick v0.3.1と_Nimble v0.3.1_で動作した。
(Quickのバージョンは、検証時のCocoaPods 最新版)

issueで取り上げられているコンパイルエラーは、Nimbleに関してなので、Quickは最新でも問題ないようである。
camera in operating > camera in operation

梅田駅などの掲示にて「カメラ稼働中」の英語訳として「camera in operating」とある。ちょっと違和感がある。

「camera in operation」が正しいように思う。

in doing形式の場合「xxする時には」という意味になるのではないだろうか。「稼働中」という意味にはならない。

「camera is operating」と混同しているのかもしれない。
EASELJS MOUSE INTERACTIONを試してみる

http://createjs.com/tutorials/Mouse%20Interaction/
今回はcreatejsのMouse操作について勉強したいと思います。目標はShapeをドラッグ操作で移動させることです。それに伴いマウスイベントについて詳しく見ていきます。

#THE BASICS
* マウスイベントの取得は、基本的にaddEventListenerを用いてリスナーを登録するだけです
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/1/

```
circle.addEventListener("click", function(event) { alert("clicked"); })
```

* click, mousedown, mouseup, dblclick, pressmove, pressup, mouseover / mouseout, rollover / rollout のイベントをトリガーにできます
* mouseover / mouseout, rollover / rolloutについては、stage.enableMouseOver(frequency)で発生頻度を設定できます
* stage.enableMouseOver()を実行しないとそれらのイベントは発生しません
* frequencyは１秒間に発生するイベント数です
* frequencyのデフォルトは２０です
* onメソッドが addEventListenerのショートカットとして用意されています
* onは、addEventListenerと違い、いくつかのパラメータを指定できます
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/2/

```
circle.on(type, listener, scope, once, data, useCapture);
```

#MOUSEEVENT
* リスナーにはeventが渡されます
* event.typeでイベントの種類が得られます
* event.targetでイベントが発生したShapeが得られます
* event.nativeEventで元々のeventにアクセスできます
* event.stageX/Yで座標が得られます
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/3/
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/4/

```
circle.on("click", function(evt) {
    alert("type: "+evt.type+" target: "+evt.target+" stageX:"+evt.stageX);
});
```

#BUBBLING
* イベントが発生した時capture, target, bubbling の３フェイズが実行されます
* captureフェイズはstageからtargetの親に向かってイベントが伝わります
* targetフェイズはtargetのみでイベントが発生します
* bubblingフェイズはtargetの親からstageに向かってイベントが伝わります
* captureフェイズでリスナーを実行するにはuseCaputreをtrueにする必要があります
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/5/

#MOUSECHILDREN & MOUSEENABLED
* イベントを発生させないためには2つの方法があります
* １つは、親要素のmouseChildlenをfalseにすることです
* １つは、targetのmouseEnabledをfalseにすることです
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/6/
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/7/

#HITAREA
* EaselJSでは不透明なピクセルに対してヒットエリアを設定しています
* hitAreaプロパティにshapeを設定することでヒットエリアをそのshapeの領域に拡張できます
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/8/

#STAGE MOUSE EVENTS
* stageも同様に不透明なピクセルしかクリックできません
* しかし、stagemousedown, stagemouseup,  stagemousemove イベントが特別に用意されています
* これらのイベントは不透明なピクセルでも発生します
* 通常stagemousemoveイベントはcanvas外にでると無効になります
* これを有効にするにはmouseMoveOutsideをtureにする必要があります
* その場合、ポインタの位置を知るにはstageX/YではなくrawX/Yを使用します
* 例：無効：https://jsfiddle.net/kzqooq/Locg1wkb/11/
* 例：有効：https://jsfiddle.net/kzqooq/Locg1wkb/10/

* pointerがCanvas内あるかはstage.mouseInBoundsとmouseleave/mouseenterイベントで判定できます.
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/12/

#DRAG AND DROP
* shapeをドラッグするとpressmoveイベントが発生し、離すとpressupイベントが発生します。
* 例：https://jsfiddle.net/kzqooq/Locg1wkb/13/

#OTHER USEFUL APIS
* Container.getObjectUnderPoint():ポイントの下にある最上位のオブジェクトを返します
* Container.getObjectsUnderPoint():ポイントの下にあるオブジェクトを全て返します
* DisplayObject.hitTest():ポイントがオブジェクトと重なっているか判定します

以上です。ネイティブなイベントをEaselJSがラップしてくれてるので、扱いやすくなっていると思います。
Fabricを入れる

Fabric調査
============================
自分用memo

## インストール

```
$ sudo pip install fabric
```


## 初期設定

以下の形でfabfile.pyを作成する

```
$ cat fabfile.py
# -*- coding: utf-8 -*-
import sys
from fabric.api import *
from fabric.decorators import roles
env.use_ssh_config = True

def hello():
  run("echo hello world")

```

実行

```
$ fab -H ${srv1} hello

```
結果

```
$ fab -H ${srv1} hello
[$srv1] Executing task 'hello'
[$srv1] run: echo hello world
[$srv1] out: hello world
[$srv1] out:

```
xmlを読み込むタイミングで任意の型に変換する



## xmlを読み込んでDtoに変換

simpleframeworkでxmlを読み込むとDtoにbindできて便利。
でも全部String型になっているので任意の型に変換したい。

今回はDateとBooleanにしたい。

### 対象のDTO

``` HogeDto.java
public class HogeDto implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Element(required = false)
    private Date deleted;
    @Element(required = false)
    private Boolean deletedAt;
    
    //getterとsetterは省略
}
```

### 読み込み対象

``` example.xml
<deleted>false</deleted>
<deletedAt>2012-10-19 04:19:55</deletedAt>

```

### 型を変換するために用意したクラス
http://simple.sourceforge.net/download/stream/doc/javadoc/org/simpleframework/xml/transform/Transformer.html

#### Date用
```DateFormatTransformerService.java
public class DateFormatTransformerService implements Transform<Date> {
    private DateFormat dateFormat;

    public DateFormatTransformerService(DateFormat pDateFormat) {
        this.dateFormat = pDateFormat;
    }

    @Override
    public Date read(String value) throws Exception {
        return dateFormat.parse(value);
    }

    @Override
    public String write(Date value) throws Exception {
        return dateFormat.format(value);
    }
}

```
#### Boolean用

```BooleanFormatTransformerService.java
public class BooleanFormatTransformerService implements Transform<Boolean> {

    @Override
    public Boolean read(String value) throws Exception {
        return Boolean.parseBoolean(value);
    }

    @Override
    public String write(Boolean value) throws Exception {
        return value.toString();
    }
}

```

### 実処理
```
DateFormat format = new SimpleDateFormat("yyyy-mm-dd");

RegistryMatcher m = new RegistryMatcher();

m.bind(Date.class, new DateFormatTransformerService(format));
m.bind(Boolean.class, new BooleanFormatTransformerService());

File example = new File("example.xml");
HogeDto dto = serializer.read(HogeDto.class, example, false);
```
### memo
これは業務で書いたのを備忘録として書きなおしているので動作確認していない。そのうちやる。
GameObject

###選択オブジェクトの子階層を含めてStatic化する

ただし、非アクティブなオブジェクトは対象外となる。
対象としたい場合は \<Transform>(true) で実行する。

```csharp
foreach (var go in Selection.objects.OfType<GameObject>())
{
    foreach (var tf in go.GetComponentsInChildren<Transform>())
        {
            tf.gameObject.isStatic = true;
        }
}
```