OmniAICreator/Qiita-1.07M huggingface dataset:
docker を使って itorch の tutorials を実行

# itorch とは

DeepLearning のプラットフォームとして注目されている Torch.
Lua をベースにしており Linux の環境で動作する。コマンドプロンプトで実行する方法は、デバックや結果を確認する点でなにかと面倒。
そこで、注目されているipython notebook を使って、Web Browser をプログラム環境として利用します。 最新のipython notebook は言語拡張性をもっており言語のカーネルを設定することでpython 以外の言語での利用が可能です。また、図などをブラウザに表示できるのでグラフィカルなデバックも可能。ipython の torch 拡張である itorch をdocker で動作させる方法について紹介します。


# docker 
dockerはLinux OSが起動して必要がありますが、最近では Mac, Windows でも
VM 経由で動作させることも可能。
ここでは、設定済みのイメージをdocker hub から pull します。

`docker pull kkoba84/itorch-docker`

確認方法としては

`docker images`

# ipython の itorch向け設定

ipython のプロファイル設定は、`~/.ipython` フォルダに設定ファイルがあります。

今回のdocker のイメージの設定では、以下のように設定してあります。
(ここでは、pull したイメージを利用するので設定する必要はない.Dockerfileの説明）

まずは、profile の作成
`ipython profile create itorch_svr`

次に、itorch のカーネルとして起動する設定

```/root/.ipython/profile_itorch_svr/ipython_config.py
c = get_config()
c.KernelManager.kernel_cmd = ["/root/torch/install/bin/itorch_launcher","{connection_file}"]
c.Session.key = b''
c.Session.keyfile = b''
```

docker のポートをフォワードする設定として、接続に関する設定をします。
ここでは、どのアクセスからも許可してしまうので、気になる場合には
パスワードの設定が必要になります。

```/root/.ipython/profile_itorch_svr/ipython_notebook_config.py
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 9999
/root/torch/extra/iTorch
```

# docker の動作確認

デーモンで動かす前に、確認する方法。まずは、docker を起動。ポートをフォワードする設定として `-p 9999:9999`を指定して起動します。

`docker run -p 9999:9999 -it kkoba84/itorch-docker`

/bin/bash が起動してプロンプトがでます。次に、itorch を実行

`itorch notebook --profile=itorch_svr`

これで、port 9999 の notebook server が起動します。
ホストのPCで、chrome/firefoxブラウザを起動(IEは表示が崩れる）して以下のURLにアクセス

`http://localhost:9999/tree`

torch の tutorials のファイル一覧が表示されれば成功!

# デーモンでの起動

うまく動作したら、デーモンでの動作方法として、以下のコマンドを実行。
Linux を想定していますが、`` `pwd` `` を絶対パスを指定することで、
ホスト側のフォルダをマウントすることができます。
自分のファイルは、itorch での `myfolder` となるので、そこに
ファイルを保存するようにすれば、永続的に利用できます。
ちなみにdocker は、ユーザが作業しているファイルをイメージに保存しておくことができないので、このようにフォルダをマウントします。

```
docker run -d -p 9999:9999 -v `pwd`:/root/tutorials/myfolder -it kkoba84/itorch-docker /root/torch/install/bin/itorch notebook --profile=itorch_svr`
```

# 動作確認

デーモンとして動作しているかどうかは `docker ps -a` で確認

# デーモンの停止

`docker ps -a`で確認したCONTAINER ID を指定して

`docker stop {CONTAINER ID}`

`stop` コマンドで停止します。

# イメージの削除

`docker rm {CONTAINER ID}`

# boot2docker を使う場合

boot2docker では、VirtualBox のIPを事前に調べておく

`boot2docker ip`

デーモンモードのスクリプトのパスがlinuxとは異なるので、一度 bash を
起動させてからにする

`docker run -p 9999:9999 -it kkoba84/itorch`

itorchを起動.この場合、/root/tutorials になっている前提。

`itorch notebook --profile=itorch_svr`

起動したら、

`http://{boot2docker ipで調べたIPアドレス}:9999/`

で確認。
Git2.4のアップデート内容について

# 概要
下記の記事を見てGitのバージョン2.4でどのような機能が追加されたのか調べてみました。
Git 2.4 — atomic pushes, push to deploy, and more- 
https://github.com/blog/1994-git-2-4-atomic-pushes-push-to-deploy-and-more

# Atomic push
※ 2015/05/02 時点ではGithub.comでは未対応のようです

複数のbranchや、branchとtagを一度にpushする場合に、どれかのpushに失敗した時にほかのbranchやtagのpushもしないようにするということだと思います(未検証)。
例えばbranchA, Bにpushしようとした場合

```bash
$ git push origin branchA branchB
```
とした時に、branchAのpushにrejectされてもbranchBのpushは成功してしまいます。

```bash
$ git push --atomic origin branchA branchB
```
--atomicオプションをつけるとbranchAへのpushに失敗した場合にbranchBへのpushも行わないということだと思います。

# push-to-checkout hook の追加
push先のリモートリポジトリがbareオプション付きで作成されてない場合、リモートリポジトリのカレントブランチとpushした時のローカルリポジトリのカレントブランチの参照先が同じ場合、pushに失敗してしまいます(core.bareなどを変更すればできます)。
このときにhookして色々操作できるhookだと思います(未検証)。

# Inverted grep オプションの追加
--grepオプションでlogをフィルタリングするときに、キーワードにマッチしないというフィルタリングができるようになったみたいです。

```bash
test:$ git log --oneline -10
bd62842 aa
367040b Merge branch 'test' of ssh://36.55.237.164:3843/root/test into test
2f96f76 test
bc94303 master2
d8eaabe test1
beff40f master1
28e2863 test
87ac987 modify
9618523 Merge branch 'master' of github.com:totomo/test into test
ce46542 add test.php
```

```bash
test:$ git log --oneline --invert-grep  --grep "Merge" -10
bd62842 aa
2f96f76 test
bc94303 master2
d8eaabe test1
beff40f master1
28e2863 test
87ac987 modify
ce46542 add test.php
35088f4 aaa
6609754 merge hoge
```
Merge にマッチしないログのみでていることがわかります。

# statusにverboseオプションの追加
--verbose, -v を２回指定すると、ローカルリポジトリのHEADとコミットされていない変更点との差分を見ることができる(つまり git diff と git diff --stagedの差分を両方あわせて見ることができる)。

```bash
test:$ git status -v -v
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   test.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   test.py

Changes to be committed:
diff --git c/test.txt i/test.txt
index 3f27ceb..f18bc09 100644
--- c/test.txt
+++ i/test.txt
@@ -1,4 +1,5 @@
 a
+b
 a
 b
 d
--------------------------------------------------
Changes not staged for commit:
diff --git i/test.py w/test.py
index 10e80c1..f9b3593 100644
--- i/test.py
+++ w/test.py
@@ -1,4 +1,5 @@
 # coding:UTF-8
+
 print "Hello"
 a

```

# log --decorate の表示形式を微修正

```bash
# 以前
test:$ git log --decorate
commit 0c8224c974a53262dfb79a9cc5b55622df630cd4 (HEAD, test)
Merge: 56125a2 a36aaf2
Author: Kenta Tokumoto <totomo_1217@yahoo.co.jp>
Date:   Sun May 3 00:39:00 2015 +0900

    Merge branch 'master' into test


# v-2.4.0

test:$ git log --decorate
commit 0c8224c974a53262dfb79a9cc5b55622df630cd4 (HEAD -> test)
Merge: 56125a2 a36aaf2
Author: Kenta Tokumoto <totomo_1217@yahoo.co.jp>
Date:   Sun May 3 00:39:00 2015 +0900

    Merge branch 'master' into test
...

```
(HEAD, test) が (HEAD -> test) に変わっただけなような気がします。

# defaultで--follow-tagsを有効にする

```bash
$ git config --global push.followTags true
```

# HTTPでリクエストした時にヘッダにAccept-Languageが追加される

httpでやりとりするときにヘッダに Accept-Languageフィールドが追加されるようになったみたいです。
ActiveRecord の serialize でカスタムタイプを保存する

## やりたいこと

Railsで

```rb
class Report < ActiveRecord::Base
  serialize :query, JSON
end
```

とかすると(この例では) query という属性を JSON にシリアライズして１カラムに保存してくれる。この JSON と書いている所を値オブジェクトにして、validation 付けたり、メソッドを持たせるなどして色々便利に扱いたい。

## やり方

場所はどこでもいいのだが、自分は `app/models/values/query.rb` においてる。
こんなかんじのコードを書く。`dump` メソッドおよび `load` メソッドを独自定義する。

```rb
Query = Struct.new(:statement, :bind)

class Query
  class << self
    # To support `serialize :query, ::Query`
    # @param [Hash or ActionController::Parameters or Query or Object] obj
    def dump(obj)
      obj.to_json if obj
    end

    # To support `serialize :query, ::Query`
    # @param [String] source JSON text
    def load(source)
      self.new(JSON.parse(source)) if source
    end
  end

  # @param [Hash] params
  # @option params [String] statement
  # @option params [Hash]   bind
  def initialize(params = {})
    params         = params.symbolize_keys
    self.statement = params[:statement]
    self.bind      = params[:bind]
  end
end
```

これで以下のように指定できるようになって、

```rb
class Report < ActiveRecord::Base
  serialize :query, ::Query
end
```

`report.query` とすると Query オブジェクトが返ってくるようになる。

```ruby
report = Report.new
report.query.class #=> Query
```

## テクニカルポイント

１回ハマったのでメモ。上のコードでは解消してあるので気にしなくても良い。当初、`dump` の実装を `obj.to_json` ではなく `obj.to_h.to_json` にしていた。しかし、これではうまくいかなかったという話。

```diff
     def dump(obj)
-      obj.to_h.to_json if obj
+      obj.to_json if obj
     end
```
Controller で

```ruby
Report.create(params[:query])
```

のようにした場合、`Query.dump(obj)` の `obj` には `params[:query]` つまり、`ActionController::Parameters` のオブジェクトが入って来る。そして、`obj.to_h.to_json` が実行される。

[ActionController::Parameters#to_h](http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-to_h) は permit していない key を全て削除してしまうので、strong parameter を使って permit しておかないと、

```rb
class ReportsController < ApplicationController
  def create
    Report.create(report_params)
  end

  private
    def report_params
      params.permit(query: [:statement, :bind])
    end
end
```

`obj.to_h.to_json` が　`{}` になってしまう。

Strong Parameter を使わずに、直接 `Report.create(params[:query])` のように呼んだ場合に `{}` になってハマってしまうので、ハマりポイントを避けるために `obj.to_json` に変更した。
UniRxのシンプルなサンプル その2(WhereとSelect)

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[前(Subscribe)](http://qiita.com/Marimoiro/items/186ce9215325229a8d8b)
[次(FirstとTake)](http://qiita.com/Marimoiro/items/b24510b0ffd273f69f8a)

# 初めてのフィルターメソッド #

IObservableはIEnumerableと対になっているからLINQの構文のWhereとか使えるんだよ！

これを聞いた時僕はこう思いました。

**<font color="red">は？</span>**

いやだってイベントの話してるのになんでLINQが出てくるのか意味がわからなかったです。

更に
[第1回　Reactive Extensionsの概要と利用方法](http://www.atmarkit.co.jp/fdotnet/introrx/introrx_01/introrx_01_01.html)
>IObservable&lt;T>／IObserver&lt;T>インターフェイスの成り立ち自体が、IEnumerable&lt;T>／IEnumerator&lt;T>インターフェイスを反転させて作られたものだからだ。

**<font color="red">はああああ？</span>**

実際は**プッシュされてくる値**をLINQでいろいろできるというお話でした。

あと反転云々はとりあえず気にしなくていいと思います。
いろいろ使ってからのほうが確実に理解できます。
わからない時に深く考えると僕みたいに挫折します。

そこで今回はWhereとSelectのお話です。

## 前準備 ##
今回からMoveメソッドという物を持ったBaseクラスというものを定義してそれを継承する形にします。
(Rx部分以外を省略したいため)

```csharp:Base.cs
using UnityEngine;
public class Base : MonoBehaviour {
   　/// <summary>
    /// (dx,dy)だけ移動させる
    /// </summary>
    /// <param name="dx"></param>
    /// <param name="dy"></param>
	public void Move (float dx,float dy) {
        gameObject.transform.position += new Vector3(dx, dy, 0);
	}
}
```

今回は前回のSubsribeオブジェクトの他にSelect,Whereオブジェクトを作っています。

![スクリーンショット 2015-05-02 23.50.57.png](https://qiita-image-store.s3.amazonaws.com/0/77177/5cca9ab4-59fb-09ed-168f-4dc88d21eca0.png)

赤がSubscribeで青がWhereで緑がSelectですね。
それぞれWhereSampleとSelectSampleをくっつけています。

## Where ##
WhereSampleはこんなコードになっています。

```csharp:WhereSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class WhereSample : Base {

	// Use this for initialization
	void Start () {
        //Returnで(0,0.5)という値をSubscribe内に流し込んでる
        Observable.Return(new Vector2(0, 0.5f)).Subscribe(v => gameObject.transform.position = v);

        //Whereで左クリックの間しか値がプッシュされないようにしている
        this.UpdateAsObservable()
            .Where(_ => Input.GetMouseButton(0))
            .Subscribe(l => Move(0.01f, 0));
	}
	
}
```

初期位置が変わってるのは置いておいて

UpdateAsObservable()の後にWhere(_ => Input.GetMouseButton(0))が挟まっています。
これはLINQのWhereなのでInput.GetMouseButton(0)がtrueの時しかここを通過できません。
これを通過した値のみSubscribeまで処理が行きます。

結果として左クリックを押している間のみ右に移動する事になります。

## Select ##
一方Selectはプッシュされた値を射影するメソッドです。

```csharp:SelectSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class SelectSample : Base {

	// Use this for initialization
	void Start () {
        //Returnで(0,1)という値をSubscribe内に流し込んでる
        Observable.Return(new Vector2(0, 1.5f)).Subscribe(v => gameObject.transform.position = v);

        //Selectを使って入力を加工してあげる
        this.UpdateAsObservable()
            .Select(_ => 2)
            .Subscribe(l => Move(0.01f * l, 0));
	}
}

```
今度はUpdateAsObservableの後にSelect(l => 2)を挟んでいます。
これで流し込む値が2に変わりました。(今まではUnit型というあまり意味のない値が入っていました。)
その後のSubscribeはSubscribe(l => Move(0.01f * l, 0));と0.01のl倍移動します。l==2なので0.01移動するSubscribeより2倍早く移動することになります。

## 実行してみた ##
というわけで結果こんなかんじになりました。

![スクリーンショット 2015-05-03 00.07.25.png](https://qiita-image-store.s3.amazonaws.com/0/77177/6825b639-22bb-6b4f-b1b3-baa2946a60f2.png)



今回はここまで
【CSS】均等横並びリストブロックをクラス指定だけでやる

汎用的に使えるようにクラス設計したい。
CSSにおいても。


１．リスト構造のHTMLを準備

```
div
└ ul
　└ li
　　└ a（←なくてもいい）
　　　└  <!--ここにブロック要素-->
```

２．一番上位のdivにクラス”liblock”を指定する
こういう感じになる

```html:html
<div class="liblock" id="saijouino-div">
  <ul>
    <li>
      <img alt="IMGなどのブロック要素" src="nekoneko" />
    <li>
    <li>
      <a href="hogehoge"><img alt="IMGなどのブロック要素" src="fugafuga" /></a>
    <li>
  </ul>
<div>
```

並べようと思ったらリスト構造になるし
リスト構造にしようと思ったらこの形になるのでここまでは気にする必要なし。

３．読み込んでいるCSSファイルなどに下記を追加

```css:CSS
.liblock {
    display: block;
    width: 100%;
    text-align: center;
}
.liblock>ul {
    margin: 0px auto;
    white-space: nowrap;
}
.liblock>ul>li {
    margin-left: 16px;
    display: inline-block;
    /display:inline;      /* IE対応 */
    /zoom:1;              /* IE対応 */
}
.liblock>ul>li:first-child {
    margin-left: 0px;
}
.liblock>ul>li>a{
    display: block;
}
```

４．サイズ指定などを行う
最上位のdivのサイズ、
リストの中身のブロック要素のサイズは
別途指定する必要アリ

```css:CSSの２
 #saijouino-div {
     width: 980px;
     height: 175px;
     margin: 20px 0px;
 }
 #saijouino-div img{
     width: 230px;
     height: 175px;
 }
```

※ 2017/06/15追記
IMGタグがブロック要素とかいう嘘をついてはいけない
Realm on Android で開発中にMigrateが面倒な場合はRealmファイルを消してお茶を濁す

リリース前しか使えないと思いますけど。

みなさん[AndroidでRealm](http://realm.io/docs/java/latest/)使ってますか？僕は使ってます。
便利なんですが、Schema定義を変えるときに少し困ったので、開発中にクイックにSchemaを入れ替える方法をメモついでに紹介します。

## Realm いいよね
Realmはモバイル向けのいわゆるNoSQLというやつで、どうやら速いらしいものです。詳しくは@wasabeef_jpさんの[こちらの記事](http://qiita.com/wasabeef_jp/items/92bb700e37a0a57fc765)がとても参考になります。
シンプルでちょっとしたアプリには十分な機能を持ってるので、結構いいなと感じています(個人的にRDB/SQLがあまり好きではないのもあります)。

## しかし、Migrationがめんどくさい
参考記事にもありますとおり、なんといってもMigrationが面倒くさい。

本家のMigrationの解説](http://realm.io/docs/java/latest/#migrations)を見る限り、まだまだUnder Constructingなようですね(2015/5/2)。
> Migrations are a work in progress. The feature is fully functional, but the current interface is cumbersome, and will be rewritten soon.

[本家のサンプルを見ると、](https://github.com/realm/realm-java/blob/master/examples/migrationExample/src/main/java/io/realm/examples/realmmigrationexample/model/Migration.java)Currentバージョンをもとにスキーマをどう変えるかを丁寧に記述するしかないようです。

## 開発中だったら、ファイルごと消しちゃえばいいよね
SQLiteでも同じかもしれませんが、開発中で比較的頻繁にスキーマ定義を変えるような場合、ごっそりデータファイルを消してしまえばいいです。
公式もそう言ってます。
> If there is no file on disk when Realm launches, no migration is needed, and Realm will just create a new .realm file & schema based on the latest models defined in your code. This means that if you are in the middle of development and changing your schema very often, and you are OK with losing all your data, you can delete your .realm file on disk (and the entire dataset it contained!) instead of having to write a migration. This can be helpful when tinkering with models early in the development cycle of your app.

**当然といえば当然ですが既存データはすべて消えますので注意してください。**

## やり方
#### 例によって、adb shell
```shell-session
cd C:<path to sdk platform-tools>
adb shell
```

#### adb内で、アプリのディレクトリへ
```shell-session
$ cd /data/data/<パッケージ名>
```

#### よく忘れる`run-as`
```shell-session
$ run-as <パッケージ名>
```

ここでlsするとRealmのファイルが見えます  

```shell-session
$ ls
default.realm
default.realm.lock
```

#### 普通にrmで消す
**念のためもう一度、既存データはすべて消えますので注意してください。**

```shell-session
$ rm *.realm*
```

これで、次回デバッグ時にはまっさらなところから新しいSchemaが作られます。

最後まで見ていただきありがとうございました。

May a Happy Realm Life be with you.
Mithril.jsでタップイベント(fastclick)を使う(Paw.js使用)


##Mithril.jsとタップ

高速で、生のオブジェクトを使う感じで扱いやすい[Mithril.js](https://lhorie.github.io/mithril/)ですが、標準だとタップ(fastclick)は使えず、onclickのみです。

タップその他のイベントを扱う[コミュニティ製のコンポーネント](https://gist.github.com/webcss/debc7b60451f2ad2af41)もあるのですが、スワイプなどもサポートする関係上、妙に遅い。

なので、高速で素晴らしい[Paw.js](https://github.com/dameleon/paw.js)(damelon様作)というライブラリを使わせていただき、やってみました。
試してないですが、Hammer.jsなどでも同じ要領でできるのではないかと。

##コード

CoffeeScriptです。

```coffee
new Paw(document.body)

tapRoute = (element, isInitialized, context) ->

  routeHook = (e) ->
    `var e`
    e = e or event
    
    # デフォルトのイベントを抑制
    if e.preventDefault
      e.preventDefault()
       
    # ここにページ遷移前の処理(たとえばアニメーションなど)を入れられます
    
    # 相対URLの取得
    # FIXME : このままだと /path 形式のパスしか使えないので必要ならば修正
    currentTarget = e.currentTarget or e.srcElement
    href = currentTarget.getAttribute('href')
    if href[0] != '/'
      href = '/' + href
     
    # Mithril Router
    m.route(href)
    return

  if !isInitialized
    # tapイベントハンドラを登録
    if element.addEventListener
      element.removeEventListener('tap', routeHook)
      element.addEventListener('tap', routeHook)
    else
      element.detachEvent('ontap', routeHook)
      element.attachEvent('ontap', routeHook)
      
  # 追記 unload時にtapイベントハンドラを削除
  context.onunload = () ->
  	if element.addEventListener
  	  element.removeEventListener('tap', routeHook)
  	else
  	  element.detachEvent('tap', routeHook)

  return
 
 # aタグでのリンクの場合
 # configにrouteTapを指定する
 m.render(document.body, [
 	m('a', {
 		href: '/path/' 
 		config: routeTap
 		}, 
 		'リンク')
 ])
```
OSXのターミナルでJavascriptを動かす

##はじめに
ターミナルからJavascriptを動かしたかった。
先生に訊いてみると、MacにはJSCというインタプリタが最初からついている、とのこと。
それ使おう。
ということで、JSCのヘルプを見てみる。

```shell-session
mac1:~ user$ jsc --help
-bash: jsc: command not found
```
初期状態ではパスが通ってないので使えないようだ。

##1. MacについてるJSCのパスを設定する
まずはパスを通す。
先生によると、JSCの場所はここらしい。

```
/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc
```
なるほど。
覗いてみると、たしかにあった。
ということで、ターミナルで以下を実行。

```shell-session
mac1:~ user$ cd /usr/local/bin
mac1:bin user$ ln -s /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc ./
```
`jsc --help`をもう一回やって、通ったかどうか確認

```shell-session
mac1:~ user$ jsc --help
Usage: jsc [options] [files] [-- arguments]
  -d         Dumps bytecode (debug builds only)
  -e         Evaluate argument as script code
  -f         Specifies a source file (deprecated)
  -h|--help  Prints this help message
  -i         Enables interactive mode (default if no files are specified)
  -s         Installs signal handlers that exit on a crash (Unix platforms only)
  -p <file>  Outputs profiling data to a file
  -x         Output exit code before terminating

  --options                  Dumps all JSC VM options and exits
  --dumpOptions              Dumps all JSC VM options before continuing
  --<jsc VM option>=<value>  Sets the specified JSC VM option
```
うまくいった。
##2. 対話型インタフェースで実行
ターミナルで`jsc`をコマンドしてみる。

```shell-session
mac1:~ user$ jsc
```
すると、こうなる。

```shell-session

mac1:~ user$ jsc
>>> function double(a) {
... var b = a * 2;
... return b;
... }
undefined
>>> double (1024)
2048
```
おお、できた。
##3. jsファイルを実行
```js:helloworld.js
(function(){
  print('hello, world!');
}());
```

こんな感じのファイルを作って保存。
ターミナルからjscで走らせてみると...

```shell-session
mac1:~ user$ jsc helloworld.js
hello, world!
```
動いた。
よかったよかった。
おわり。

##参考URL
[macで、ターミナルからJavaScriptスクリプトファイルを実行する - ytyng.com](http://b.ytyng.com/a-53/)
[MacのターミナルでJSを走らせる。- modifiedの日記](http://d.hatena.ne.jp/modified/20110506/1304647677)
node.js - Qの使い方

node.jsでPromise-Qを利用した非同期処理の繰り返し処理をすんなり理解的できなかったので、ここでまとめます。
※まだnode歴2ヶ月の初心者です

## 最初のステップ
本家では、こんな感じで紹介されています。（コードを実行可能な状態にmodifyしてあります）
https://github.com/kriskowal/q

```js:without_q.js
var val;
var step1 = function(callback) {
    val = 'hoge';
    setTimeout(function(){
        console.log(val);
        callback();
    }, 1000);
};
var step2 = function(callback) {
    val = val + 'fuga';
    setTimeout(function() {
        console.log(val);
        callback();
    }, 500);
};

step1(function(){
    step2(function(){
        console.log("done");
    });
});
```

これをQを使って書き直します。

```js:with_q.js
var Q = require('q');
var val;

var step1 = function() {
    val = 'hoge';
    var d = Q.defer();
    setTimeout(function(){
        console.log(val);
        d.resolve();
    }, 1000);
    return d.promise;
};
var step2 = function() {
    val = val + 'fuga';
    var d = Q.defer();
    setTimeout(function() {
        console.log(val);
        d.resolve();
    }, 500);
    return d.promise;
};

Q.fcall(step1)
    .then(step2)
    .catch(function(error) {
    // Handle any error from all above steps
        console.log("error");
    })
    .done(function(){
        console.log("done");
    });
```

step1やstep2はpromise objectである必要があります。
ざっくりとしたpromise objectの書き方は、

1. 最初に`var d=Q.defer();`を宣言
1. 最後に`return d.promise;`を返す
1. 途中、次の処理と同期をとる処理後に`d.resolve();` を挿入

という感じです。

## 非同期処理を含む繰り返し処理の同期をとる
StackOverflowで回答を発見しました。
http://stackoverflow.com/questions/17217736/while-loop-with-promises

```js:sample.js
var Q = require('q');

// condition: ループ終了判定
// body: promiseを返す関数
function promiseWhile(condition, body) {
    var d = Q.defer();
    function loop() {
        if (!condition()) return d.resolve();
        Q.when(body(), loop, d.reject);
    }
    Q.nextTick(loop);
    return d.promise;
}

// Usage
var index = 1;
promiseWhile(
    function() { // condition
        return index < 11;
    },
    function() { // body including arbitrary async
        console.log(index);
        index++;
        return Q.delay(500);
        })
    .then(function() {
        console.log("done"); })
    .done();
```

ここでは、Q.delayを使ったサンプルコードが書かれているのですが、実際には自分のやりたい処理を書く訳で・・・。Q.delayを自分の定義関数に置き換えてみます。

```js:mysample.js
var Q = require('q');

// condition: ループ終了判定
// body: promiseを返す関数
function promiseWhile(condition, body) {
    var d = Q.defer();
    function loop() {
        if (!condition()) return d.resolve();
        Q.when(body(), loop, d.reject);
    }
    Q.nextTick(loop);
    return d.promise;
}

// body
var arr = [];
var body = function(idx) {
    var d = Q.defer();
    setTimeout(function(){
        arr.push(idx);
        d.resolve();
    }, 500);
    return d.promise;
};

// Usage
var index = 1;
promiseWhile(
    function() { // condition
        return index < 11;
    },
    function() { // body including arbitrary async
        console.log(index);
        index++;
        return body(index-1);
    })
    .catch(function(error) {
        // Handle any error from all above steps
        console.log("error");
    })
    .done(function() {
        console.log(arr);
    });
```

つまり、bodyの処理中の非同期処理をpromise objectにすればOKです。
CSS3の基礎知識


CSS3 は CSS2.1 を元に機能を細分化(モジュール化)したもの
モジュールごとに仕様の策定が進められている
まだ勧告候補のものや草案段階のものもあり、今後仕様が変更される可能性がある

スタイルの切り替えを行うメディアクエリも　CSS3 の機能の1つ。
CSS3 を使用すると、以前の CSS では表現できなかったドロップシャドウや角丸、
グラデーションなどを容易に実現できるため、個別に画像を用意する場合と比べ、
ファイルサイズが小さくなるメリットもある。


TIPS
* CSS3 と HTML5 は独立技術なので、必ず組み合わせて使わなくてはならないわけではない
* HTML4 + CSS3 や XHTML + CSS3　の組み合わせでも問題なく利用可能

# CSS3で追加された主なプロパティ

## text-shadow プロパティ

* フォントに影をつける

```
text-shadow: 横方向のズレ幅　下方向のズレ幅　ぼかし具合　影色;
```

```textshadowプロパティの指定例.css

p {
	text-shadow: 3px 3px 2px #555 
}

```

## box-shadowプロパティ

* ボックスに影をつける

```
box-shadow: 横方向のズレ幅　下方向のズレ幅　ぼかし具合　影色;
```


```bos-shadowプロパティの指定例.css
p {
	box-shadow: 10px 10px 10px rgba( 0, 0, 0, 0.3);
}

```

## border-radiusプロパティ

* 要素の角を角丸にする

```
border-radius: 楕円半径の長さ;
```

```border-radiusプロパティの指定例.css
p {
	border-radius: 25px;
}
```

## RGBaプロパティバリュー

* 要素に対して透明度を持った色を指定する
* 1.0は透明度無し状態、0.0は透明になり、透明度は0.0〜1.0で指定する
* RGBの各色の指定値は、0~255または0%〜100%で指定する
* color プロパティ以外にも、border-color、background-color、text-shadow、box-shadow など様々なプロパティに指定できる

```
color: rgba (赤, 緑, 青, 透明度);
```

# HTML5&CSS3の対応状況確認

## 参考サイト

[Can I use](http://caniuse.com/)
：各ブラウザの HTML5 や CSS3 の要素・API への対応状況を確認できるサイト
　要素や API をクリックすると対応状況が確認できる

[findmebyIP](http://fmbip.com/litmus/)
：各ブラウザの HTML5 や CSS3 への対応状況を確認できるサイト
　Chrom、Safari、Firefox、IE(IE6〜IE9)の対応状況が一覧確認できる

# CSS3のテンプレート作成

* 主に以下の項目を設定する

①文字エンコードの設定
②clearfix の設定
③ブレイクポイントの設定

## プレイクポイントとは

* レスポンシブWebデザインにおいて「表示するレイアウト」を切替える画面サイズ」である
* サイト設計の早い段階でブレイクポイントを決定することが重要

```ブレイクポイントの指定例.css
/* 481px [tablet-size] */
/* min-width; 481px と min-width; 769px の値がブレイクポイント */

@media only screen and (min-width; 481px) {
	nav {
		margin: 0 0 0 7%;
		padding: 0 0 0 7%;
		background-color: #6B69b9;
		}
}

/* 769px [PC-size] */

@media only screen and (min-width; 769px) {
	article.main {
		width; 65%;
		float: right;		
		}
}
```

## ピクセル密度と devicePixelRatio

* ブレイクポイントを決定する際は各デバイスに搭載されているディスプレイの「ピクセル密度」に注意する必要がある
* ピクセル密度とは1インチあたりのピクセル数


解像度例
* 非Retina ディスプレイの iPhone: 320px × 480pxx
* Retina 　ディスプレイの iPhone: 640px × 960pxx

## ブレイクポイントの決定方法

* どの画面サイズ以下でスマートフォン向けのレイアウトを表示するのか考慮する
* どの画面サイズ以下でタブレット向けのレイアウトを表示するのか考慮する
* 最適なブレイクポイントはサイトのデザインやレイアウト、情報量により異なる
* 既存ページのブレイクポイントを参考にする

参考サイト：
[Adobe HTML5 特設サイト](http://adobe-html5.jp/)
（ブレイクポイント：520pxと920pxの２種類）

[Microsoft社](https://www.microsoft.com/ja-jp/default.aspx)
（ブレイクポイント540pxと680pxと900pxの3種類）



# この記事の参考書籍

レスポンシブWebデザイン 「超」実践デザイン集中講義
山崎大助 著
Go言語: channelを使ってActorっぽいことをしたい


Go言語で、Actorっぽいことができないか試してみました。[Go Playground](http://play.golang.org/p/slrH42XCEx)で動作するサンプルを試せます。

```go
package main

import (
	"log"
	"time"
)

func main() {
	log.Println("started")
	actor := NewActor()
	go actor.React()

	// send Increment per second
	go func() {
		for i := 0; i <= 10; i++ {
			actor.Increment <- &Increment{}
			time.Sleep(1 * time.Second)
		}
	}()

	// send Decrement per two seconds
	go func() {
		for i := 0; i <= 10; i++ {
			actor.Decrement <- &Decrement{}
			time.Sleep(2 * time.Second)
		}
	}()

	// send Stop in seven seconds
	go func() {
		time.Sleep(7 * time.Second)
		actor.Stop <- &Stop{}
	}()

	// send Letter per two seconds
	go func() {
		messages := []string{"hi!", "yo!"}
		for _, msg := range messages {
			time.Sleep(2 * time.Second)
			actor.Letter <- &Letter{msg}
		}
	}()

	// wait for all messages are sent.
	time.Sleep(10 * time.Second)

	log.Println("finished")
}

type Increment struct {
}

type Decrement struct {
}

type Stop struct {
}

type Letter struct {
	Body string
}

type Actor struct {
	number    int
	Increment chan *Increment
	Decrement chan *Decrement
	Letter    chan *Letter
	Stop      chan *Stop
}

func NewActor() *Actor {
	return &Actor{
		number:    0,
		Increment: make(chan *Increment),
		Decrement: make(chan *Decrement),
		Letter:    make(chan *Letter),
		Stop:      make(chan *Stop),
	}
}

func (a *Actor) React() {
	for {
		select {
		case <-a.Increment:
			a.number += 1
			log.Printf("incremented: %d", a.number)
		case <-a.Decrement:
			a.number -= 1
			log.Printf("decremented: %d", a.number)
		case letter := <-a.Letter:
			log.Printf("letter recieved: %s", letter.Body)
		case <-a.Stop:
			log.Println("stopping")
			return
		}
	}
}

```

実行結果

```
2009/11/10 23:00:00 started
2009/11/10 23:00:00 incremented: 1
2009/11/10 23:00:00 decremented: 0
2009/11/10 23:00:01 incremented: 1
2009/11/10 23:00:02 decremented: 0
2009/11/10 23:00:02 letter recieved: hi!
2009/11/10 23:00:02 incremented: 1
2009/11/10 23:00:03 incremented: 2
2009/11/10 23:00:04 decremented: 1
2009/11/10 23:00:04 incremented: 2
2009/11/10 23:00:04 letter recieved: yo!
2009/11/10 23:00:05 incremented: 3
2009/11/10 23:00:06 decremented: 2
2009/11/10 23:00:06 incremented: 3
2009/11/10 23:00:07 stopping
2009/11/10 23:00:10 finished
```
git2.3.2をcentosにインストール

#vagrant + cygwinで構築したvmにgit2.3.2をインストールする
yumインストールだと、1.7.1で古かったため、アップデートしました。

# 手順

```
$ sudo yum remove git
$ sudo yum install make curl-devel gcc openssl-devel expat-devel  cpan
$ sudo yum install gettext  asciidoc xmlto
$ wget https://www.kernel.org/pub/software/scm/git/git-2.3.2.tar.gz
$ tar -zxf git-2.3.2.tar.gz
$ cd git-2.3.2
$ make prefix=/usr/local all 
※/usr/localにインストールする場合です。適宜変えてください 

$ make prefix=/usr/local install
$ git --version
```

> git version 2.3.2


# 関連記事
[cygwin + vagrant + virtualbox 環境構築](http://qiita.com/kieaiaarh/items/8f5f9cd888f4ab8fbcb8)
PHPでPDOステートメントでよく使うやつ

# 全部のレコードを配列で取り出す

抽出したレコードを配列で全部取り出したい時に。
一番良く使うやつ。

```php
$db = new dbClass(DB_DSN, DB_SERVER_USERNAME, DB_SERVER_PASSWORD);// <-- PDOクラス
$gender = 'female';
$sql = "SELECT * FROM `tablename` WHERE `gender` = :gender";
$sth = $db->prepare($sql);
$sth->bindParam(':gender', $gender, PDO::PARAM_STR, 6);
$sth->execute();
$result = $sth->fetchall(PDO::FETCH_ASSOC);
```

fetchall 使わず fetch を while で回すとか基本ですが、実務じゃまどろっこしくて使いにくいケースが多いので、fetchall で全部取ってくる方法を選択しました。

# 1レコード1カラムだけ取り出す

例えば、あるユーザの特定の属性値だけ取ってくればいいやって時に使うやつ。

```php
$db = new dbClass(DB_DSN, DB_SERVER_USERNAME, DB_SERVER_PASSWORD);// <-- PDOクラス
$user_id = 1;
$sql = "SELECT `name` FROM `tablename` WHERE `user_id` = :id";
$sth = $db->prepare($sql);
$sth->bindParam(':id', $user_id, PDO::PARAM_INT);
$sth->execute();
$username = $sth->fetchColumn(0);
```

テーブルから一つのカラムを取ってくるだけでも、結果を配列で処理するとめんどくさい感じがするので、結果にはその値を直に取り出したい時に使います。

# [phpマニュアル](http://php.net) 読めばわかること

phpマニュアルの方には、もっといろんな手段があるから、もっとよくなるかもよ。
virtualboxの作業をターミナルで行おうとした際にログインなくて困っています。

プログラミング初心者です。OSはMac OS Yosemite 10.10.1です。

ドットインストールさんの手順に従って　http://dotinstall.com/lessons/basic_local_development/2210
こちらの作業をしようとしたのですが、ターミナルからrootサーバーにログインしようとすると

ssh: connect to host IPアドレス port 22: Operation timed outと表記されてしまい、動画通りにログインできません。

virtualboxで調査したIPアドレスとターミナルで調査したIPアドレスは違うものが表記されていてこれが原因なのかなと思っていますが、解決策がわからず詰まってしまたのでこちらに投稿しました。
環境設定からネットワークのIPアドレスと確認するとターミナルと同じものが表記されています。

わかる方いらっしゃいましたら、解決策と手順を教えてください。お願いします。
S3の事前署名付き（期限付き）URLに設定できる期限には上限がある


完全に備忘録です。
S3には全く詳しくないので、期限を伸ばす方法とかあれば是非教えてくださいorz


期限付きでファイルをダウンロードできるURLを生成したく、S3の期限付き署名済み (Pre-signed) URLを使うことに。
ところが、どうやら１ヶ月とかの期間は設定できない様子…？

# Amazon様はこう言っている

[Authenticating Requests by Using Query Parameters (AWS Signature Version 4)](http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) の `X-Amz-Expires` の説明欄によると、

> Provides the time period, in seconds, for which the generated presigned URL is valid. For example, 86400 (24 hours). This value is an integer. The minimum value you can set is 1, and the maximum is 604800 (seven days).

> A presigned URL can be valid for a maximum of seven days because the signing key you use in signature calculation is valid for up to seven days.



> （意訳）
> 生成されたURLの有効期間を秒で設定します。例えば86400は24時間になります。値は整数値です。設定できる最小値は1、最大値は604800（7日間）です。

> 署名計算に使用する署名鍵は７日間有効なので、事前署名付きURLの最大有効期限は７日間になります。

ということで、どうやら最大でも7日間しか有効にはならない感じ。

# 生成コード

```coffeescript
#!/usr/bin/env coffee

AWS = require "aws-sdk"

AWS.config.update
    accessKeyId: process.env.AWS_ACCESS_KEY_ID
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
    region: "ap-northeast-1"
s3 = new AWS.S3()
url = s3.getSignedUrl "getObject",
    Bucket: "my-bucket"
    Key: "my_file_with_expires.pdf"
    Expires: 60*60*24*7

console.log url

```

1ヶ月有効なURL作りたかったなぁ。

# 参考
- [S3 の事前署名付き（期限付き）URL を生成する](http://qiita.com/inokappa/items/dc3ef8b564c7d1f63be2)
ESP8266をUSB-TTLシリアル変換してWi-Fiを確認する

……という夢を見よう。

「[ESP8266をUSB-TTLシリアル変換してWi-Fiを確認する](http://qiita.com/masato/items/a3b71f8a17b876be8f76)」では、PL2303 を使ったUSB-TTLシリアル変換ケーブルを使っていたのですが、私の手元には秋月の「[定番のFT232を使用したUSBシリアル変換モジュールAE-UM232R](http://akizukidenshi.com/catalog/g/gK-01977)」があるので、それでやってみます。

FT232RLを使うには [FTDI社の仮想COMポートドライバ](http://www.ftdichip.com/Drivers/VCP.htm)が必要です。[AE-UM232RのFAQ](http://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=K-01977)を参考に導入し、PCに接続したときに「仮想COMポート」となるようにしておきます。

なお参考までに、PL2303を使う場合は[Prolific社のドライバ](http://www.prolific.com.tw/JP/ShowProduct.aspx?p_id=223&pcid=126)が必要です。

# 配線

- RX (ESP8266) -> TXD (AE-UM232R)
- TX (ESP8266) -> RXD (AE-UM232R)
- CH_PD (ESP8266) -> 3v3 (AE-UM232R)
- VCC (ESP8266) -> 3v3 (AE-UM232R)
- GND (ESP8266) -> GND (AE-UM232R)
![AEUM232R-ESP8266.png](https://qiita-image-store.s3.amazonaws.com/0/61810/4db3ad95-5bd6-6ccb-7c93-85f310c5e589.png)

# ATコマンドで接続を確認

Arduino IDE のシリアルモニタを使います。Arduino IDE を起動し、ツール > ポート で、 FT232RLに割り当てられたCOMポートを指定し、ツール > シリアルモニタ を開きます。

右下で「CRおよびLF」「9600bps」を選択し、"AT" を送信するとOKが返ってきて接続できていることが確認できます。AT+GMRを送信すると、ファームウェアのバージョンを返してきます:
![ESP8266-ATGMR.png](https://qiita-image-store.s3.amazonaws.com/0/61810/1aac9a99-1c88-3199-70f8-3d64c52f40b5.png)

# ATコマンドでWifi子機(STAモード)になる

> **AT+CWMODE=1** (wifi mode; モード1つまりSTAモードになる)
> OK
> **AT+CWJAP="flashair","password"** (join the AP; SSID=flashair に接続する)
> OK
> **AT+CIFSR**　(IPアドレスを表示)
> 192.168.0.11
> OK

ping 192.168.0.11 に応答するようになる。

# ATコマンドでWifi親機(APモード)になる
> **AT+CWMODE=2** (wifi mode; モード2つまりAPモードになる)
> OK
> **AT+CWSAP="ESP8266","0123456789",11,3** (set the AP; SSID=ESP8266 となる)
> OK
> **AT+CIFSR**　(IPアドレスを表示)
> 192.168.4.1
> OK

Wifiクライアントから、 ESP8266 という SSID にパスワード 0123456789 で接続できる。
DHCPサーバがないので、Wifiクライアントに固定IP 192.168.4.2 等を割り当ててやる必要があるが、
ping 192.168.4.1 に応答するようになる。

# 参考文献
https://nurdspace.nl/ESP8266
IntelliJ IDEA CE 14.1.2でGoのプラグインインストール

TP:89C16A02

GW初日。いきなり暑い。
ふと思い立ってIntelliJ Idea CE 14なんかでGoをさわってみたいなとか思ったんですが、ハマったので共有です

# launchctlで環境変数をsetする必要がある

.zshrcなんかに書いていてもダメなんで、launchctl に知らせる必要があるみたいです。

`
% launchctl setenv GOPATH $HOME/.anyenv/envs/goenv/shims/go
% launchctl setenv GOROOT $HOME/go
`



# Idea 14のGoプラグインではSDKの指定が出来ない

goの環境はgoenvとかで作っていて、SDKのパスもちゃんと指定してたんですが、どうもうまく解釈されないらしくってはまりました。

結論からいうと、Idea 14.1で普通にインストールできるプラグインじゃダメで、別途開発中のJetBrainsリポジトリを追加しておく必要がありました。

```
Preferences -> Plugins -> Browse Repositories
```

とたどり、Manage Repositories をクリックして、次のURLを登録します。

https://plugins.jetbrains.com/plugins/alpha/5047

その後で、Browse RepositoriesでRepository:Allとなっている箇所を、上記リポジトリに切り替えると、開発中のGo Pluginが出てきます。
![golang-plugin.png](https://qiita-image-store.s3.amazonaws.com/0/57477/2135b215-d68f-e21f-f5e6-9985239a4153.png)

これをインストールして、
```
Preference -> Project Structure
```
からGoのSDKパスを登録できるようになるので、こちらにgoenvなんかのパスを登録します

```
"/Users/yourname/.anyenv/envs/goenv/versions/1.4.1"
```
そうするときちんと補完なんかが効くようになり、Runでの実行も可能になります。
rxJavaで変化する値の配線をいい感じに扱いたい。


## 概要

androidJavaを試してみているのですが、Reactっぽく記述するにはrxjavaがちょっと使いにくかった、ので独自ラップクラスで誤魔化した、という話です。
もっと良い方法があったら教えてください。

## 今回のサンプル


+1, -1ボタンと数字を表示するだけの簡単なものです。
普通にrxJava使うとたぶんこんな感じ。こう書くのが嫌な理由は後述します。
(以降のサンプルコードはkotlinで書いています)

```kotlin:SampleActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)

	val linearlayout2 = LinearLayout(this)
	linearlayout2.setOrientation(LinearLayout.VERTICAL)
	setContentView(linearlayout2)

	val countSubject:PublishSubject<Int> = PublishSubject.create()
	val addButton = Button(this)
	addButton.setText("add 1")
	linearlayout2.addView(addButton)
	addButton.setOnClickListener{v -> countSubject.onNext(1)}

	val minusButton = Button(this)
	minusButton.setText("minus 1")
	linearlayout2.addView(minusButton)
	minusButton.setOnClickListener{v -> countSubject.onNext(-1)}

	val scoreView = TextView(this)
	linearlayout2.addView(scoreView)
	countSubject.scan{ a, b -> a + b }.subscribe{i:Int -> scoreView.setText(i.toString() + "点だよ")}

	countSubject.onNext(0)
}

```

## 何が嫌なのか

この例では、ボタンを押すたびに1や-1が流れてくるストリームに対して、Labelがsubscribeして、scanで得られた合計値を使う形ですよね。
でも、これを理解するにはストリームやscanあたりの原理を知らないといけませんよね。無駄にややこしいんですよ。

ストリームという概念は非同期やイベントの統一という視点は面白いのですが、個人的にはそんなものないほうがシンプルで理解しやすいと思っています。

例えばReactではどうしているかというと、扱うのはあくまでただのデータで、その値が変化したらそれに合うようにReactが画面描画する、という仕組みです。非同期処理やイベントは操作したいデータの値を更新するだけで、あとはReactにお任せです。
ストリームなんて概念を知らなくても簡単に書けるんですよ。

## 目指すゴール

今回の例だと、現在のcountをほぼプリミティブな値として使いたいです。
コードで書くとこんなイメージ

```kotlin:IdealActivity.kt
	val count = いい感じにするクラス<Int>()

	~~
	addButton.setOnClickListener{Unit ->
		count.setvalue(count.getvalue() + 1)
	}

	~~
	minusButton.setOnClickListener{Unit ->
		count.setvalue(count.getvalue() - 1)
	}

	~~
	count.subscribe{v -> scoreView.setText(v.getvalue().toString() + "点だよ")}
	count.setvalue(0)
```


## rxJavaで見つからなかったので無理やり作った

しかし、ざっと探してもそんな例はでてこない。ObservableにもPublishSubjectにもそれっぽいメソッドが見つからない。。

仕方ないので簡単にラップしたクラスを作ってみました。（繰り返しますが、既に似たようなものがあるなら教えていただけると嬉しいです。）

```kotlin:ObservableProperty.kt
import rx.Observable
import rx.Observer
import rx.Subscription
import rx.subjects.PublishSubject


class ObservableProperty<T>(t:T) {

	private var pub:PublishSubject<T>
	private var lastVal: T

	init {
		pub = PublishSubject.create()
		lastVal = t
	}

	fun setValue(t:T){
		lastVal = t
		pub.onNext(t)
	}

	fun getValue():T{
		return lastVal
	}

	fun sub(): Observable<T> {
		return pub
	}

}
```

使い方はIdealActivityとほぼ同じです。
java（kotlin）での関数リテラルの扱いがいまいちだったので、sub()メソッドが中途半端になってますがあまり問題ないでしょう。

## 備考

- 複数の値から一つのViewを作りたい場合、2つのObservablePropertyのsub()を呼び出してmergeすれば使えます。

- 非同期とか複数イベントとか扱うと無限ループになることがあると思うのですが、そこはfilterとか使えばなんとでもなるでしょう。

- Androidのマルチスレッド対応はよくわかりませんが、問題ないでしょうきっと。
UICollectionViewのDataSourceとDelegateをControllerと別のファイルに記述する

#経緯
UICollectionViewを1つのControllerの中で2つ使いたい機会があって調べ始めた。
タグを設定するという方法も出来そうであったがゴチャゴチャしそうだったのでファイルを分ける方向にした。
1つの時でもDataSourceとDelegateはそこそこ長いので、別ファイルにすると、Controllerがスッキリする！
TableViewやObjective-Cでのサンプルはいくつかみつけたが、
CollectionViewのSwiftでのサンプルが少なかったので単純なサンプルを残しておく・ｘ・っ

#ファイル
ViewController.swift：コントローラー
↓呼び出し
UsagiConfig.swift：DataSourceとDelegate
↓呼び出し
CustomUsagiCell.swift：セルの定義

#補足
この呼び出し方を複数にすれば、1つのControllerの中で複数のUICollectionViewを使うことができる。
DataSourceとDelegateを入れておくファイル名に悩んだ！
なにかもっとしっくりくる名前はないだろうか・x・・・
CollectionViewの設定はStoryBoardでしてます。

#コード
```lang:ViewController.swift
import UIKit

class ViewController: UIViewController {

    var usagiConfig:UsagiConfig?
    
    @IBOutlet weak var usagiCollectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // create Usagi
        var items:Array<String> = []
        for ( var i = 1, n = 20 ; i <= n ; i++ ) {
            items.append("Usagi"+i.description)
        }
        
        // set Usagi List
        self.usagiConfig = UsagiConfig(items: items)
        self.usagiCollectionView.dataSource = self.usagiConfig
        self.usagiCollectionView.delegate = self.usagiConfig
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
```
```lang:UsagiConfig.swift
import UIKit

class UsagiConfig: NSObject, UICollectionViewDataSource, UICollectionViewDelegate {
    
    var items:Array<String> = []
    
    init(items: Array<String>) {
        self.items = items
        super.init()
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell:CustomUsagiCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CustomUsagiCell
        
        // set Name
        cell.name.text = self.items[indexPath.row];
        
        return cell
    }
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.items.count;
    }
}
```
```lang:CustomUsagiCell.swift
import UIKit

class CustomUsagiCell: UICollectionViewCell {
    @IBOutlet var name:UILabel!
}
```

#出力結果
![usagicell.png](https://qiita-image-store.s3.amazonaws.com/0/8952/5bb22043-b935-bf11-ac3d-158ae13d844f.png)
GWTとBootstrapを組み合わせて使う

#Who
GWT SDK 2.6.1
Bootstrap 3.3.4

#What
GWTとBootstrapを組み合わせてUIを作成する。

#When, Where
クライアントサイド

#Why
Javascriptで大きめのプログラムを書くのは大変なので、GWTを使って書きたい。
Javascriptを正しく書くための知識がない。
CSSの知識もほぼ0なので、フレームワークがあるのであれば利用したい。
→GWTとBootstrapを組み合わせて利用する方法を調査する。

#How
htmlに
\<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"　rel="stylesheet">と
\<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js">\</script>
を追加。
jQueryがないというエラーが出るのでそれも追加。

```html:GwtSample.html
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link
	href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"
	rel="stylesheet">
<title>GwtSample</title>
<script type="text/javascript" language="javascript"
	src="gwtsample/gwtsample.nocache.js"></script>
</head>

<body>
	<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1'
		style="position: absolute; width: 0; height: 0; border: 0"></iframe>

	<script
		src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
	<script
		src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
</body>
</html>
```

UiBinderを使ってUIを作成する。
Bootstrapを利用するためには適切なclassを追加してやればよい。
addStyleNamesで要素にclassを追加することができる。
また、g:Buttonで任意のhtml要素を包含することができるので、Bootstrapの例(http://getbootstrap.com/components/)
にあるようにspanを包含し、絵付きのボタンを作成することができる。

```xml:GwtSample.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
	xmlns:g="urn:import:com.google.gwt.user.client.ui">
	<ui:style>
	</ui:style>
	<g:HTMLPanel>
		Hello,
		<g:Button addStyleNames='btn btn-default' ui:field="button">
			<span aria-hidden="true" class="glyphicon glyphicon-eye-open"></span>
		</g:Button>
	</g:HTMLPanel>
</ui:UiBinder> 
```

DesignタブでCSS適用後のUIが確認できる。
![CSS適用後のUI](https://qiita-image-store.s3.amazonaws.com/0/56307/0bc10552-9f8a-854d-362e-440553e65040.png)

ButtonのクリックイベントはGWTで処理する。

```java:GwtSample.java
public class GwtSample extends Composite {

  private static GwtSampleUiBinder uiBinder = GWT.create(GwtSampleUiBinder.class);

  interface GwtSampleUiBinder extends UiBinder<Widget, GwtSample> {
  }

  public GwtSample() {
    initWidget(uiBinder.createAndBindUi(this));
  }

  @UiField
  Button button;

  public GwtSample(final String firstName) {
    initWidget(uiBinder.createAndBindUi(this));
    button.setText(firstName);
  }

  @UiHandler("button")
  void onClick(final ClickEvent e) {
    Window.alert("Hello!");
  }

}
```
chefDK


## 目的
* chefの環境作成は"chefDK"というのに移行されていたらしいので、新Mac環境構築に合わせて実施
* ついでに、knife-soloももうdeprecatedらしいんだけども、そこはとりあえず勉強時間がとれないので存続。

## chefDK install

https://downloads.chef.io/chef-dk/

## knife-solo, knife-zero install

```Bash:install-knife-solo,knife-zero
chef gem install knife-solo knife-zero
```
Go言語: var, init, mainが実行される順番

`go run`を実行したとき、Goで`var`, `init`, `main`がどの順で実行されるのかを調べてみたところ、次の順番のようでした。

1. importしたパッケージの`var`が定義される
2. importしたパッケージの`init`関数が実行される
3. mainパッケージの`var`が定義される
4. mainパッケージの`init`関数が実行される
5. mainパッケージの`main`関数が実行される


下のコードは、mainパッケージだけのものですが、[Go Playground](http://play.golang.org/p/W9r25LMr4S)で試せます。

```go:
package main

var someVar = defaultVar()

func init() {
	println("main.init was called")
}

func main() {
	println("main.main was called")
}

func defaultVar() int {
	println("main.var was initialized")
	return 0
}
```
Visual Studio Codeのエディタ色を変える

そのままです。エディタの背景色テーマを変更するもの。

「View→Theme」で選択します。

* Dark Theme(デフォルト)
![default.jpg](https://qiita-image-store.s3.amazonaws.com/0/21612/e4b3eacf-a4c9-2a89-71a3-0fad26fbc905.jpeg)

* Light Theme
![light.jpg](https://qiita-image-store.s3.amazonaws.com/0/21612/18e86d73-43d9-aeb8-bad7-316625180a3d.jpeg)

* High Contrast Theme
![high.jpg](https://qiita-image-store.s3.amazonaws.com/0/21612/e7becc58-773a-7bfd-8381-9c70f3342e95.jpeg)

* おまけ

http://pronama.azurewebsites.net/2015/04/30/visual-studio-code-theme/ より、
C:\Users\(ユーザー)\AppData\Local\Code\app-0.1.0\resources\app\client\vs\monaco\ui\workbench\native\native.main.css の最後に

```css
.monaco-editor.vs-dark,
.monaco-editor.vs-dark .zone-widget .monaco-editor {		
    color: #BBB;
    background: #1E1E1E;
    background: url('http://pronama.jp/code/sd.png') no-repeat;
    background-position: right bottom;
}
```
を追加する。

![default2.jpg](https://qiita-image-store.s3.amazonaws.com/0/21612/fde7ffd4-bd15-dabc-219d-9ed28099f950.jpeg)

やったぜ。
Visual Studio Code をUnityで使う (Windows編)

Visual Studio CodeをUnityで使う方法を簡単に。
最初の設定以外はMacなどと同じようです。

VS Codeはpreview版らしいので将来的に変わっているかもしれません。

#環境
* Windows7
* Unity 5.0.1
* Visual Studio Code 0.1.0

#Visual Studio Codeのインストール

https://code.visualstudio.com/Download よりダウンロードします。

VSCodeSetup.exeを実行すると、インストールされてエディタが起動します。
エディタ自体は「C:\Users\(ユーザー)\AppData\Local\Code」にインストールされているよう

#Unityから起動する設定

「Edit→Preferences...」より「External Tools」を選択して、
「External Script Editor→Browse」にて、
「C:\Users\(ユーザー)\AppData\Local\Code\app-0.1.0\Code.exe」を指定。

あとは適当なC#ファイルを作るなどして、それをダブルクリックするとVS Codeが起動します。

#Unityのprojectと連携

Unityで生成されたsolutionファイルを読み込む流れ。

Unityで、何かしらC#ファイルを作った後で、「Assets→Sync Monodevelop Code」を実行。
最新版は、「Assets→Open C# Project」を実行。
すると、slnファイルが生成されます。

その後、VS Codeのほうで「File→Open Folder」からUnityのプロジェクトフォルダを選択します。
下の方に「pick a project」とあるので、それをクリック。
(Unityプロジェクト名).slnか(Unityプロジェクト名)-csproj.slnが出ると思うので
(Unityプロジェクト名)-csproj.slnを選択。

これでVS Codeのほうで補完が効くようになります。
(Unityプロジェクト名).slnのほうだと、補完が効かず「Now Loading...」のままになってしまいました。これは後々直るのかもしれませんが。
pixi.js 入門メモ1 線を描く

CreateJS(2d)でリアルなピアノを描いたのですが、どうも動きが鈍い。
いろいろ調べたら、WEBGLなら早いというので、さっそく試してみました。

こういう使い方が正しいのかはわかりませんが・・・・

まずは線を書いてみます。

````index.html
<!doctype html>
<html>
<head>
pixijsを読み込む。
https://github.com/GoodBoyDigital/pixi.js/からダウンロードできます。
binフォルダに入っています。
<script src="/playpiano/js/pixi.min.js"></script>
<script>
        //背景色黒でキャンバスを作成
        var stage = new PIXI.Stage(0x000000);

        //100 x 100のレンダラーを作成します
        var renderer = PIXI.autoDetectRenderer(100,100);

        //DOMに追加する
        document.getElementById("pixicanvas").appendChild(renderer.view);

        //Graphicsオブジェクトを作成
        var g = new PIXI.Graphics();
   
        //線の太さ2 ,白で、10,10から100,100に線を描く
        g.lineStyle(2,0xffffff).moveTo(10,10).lineTo(100,100);

        //ステージに追加する
        stage.addChild(g);

        //描画する
        renderer.render(stage);
</script>
<body>
<div id=pixicanvas></div>
</body>
</html>
````
#実行結果

![線](https://qiita-image-store.s3.amazonaws.com/0/75209/4f28f680-793e-6274-2bcf-003bda48999c.png)

[サンプル(jsfiddle)](https://jsfiddle.net/pianoscorejp/tbu2kvee/)

以上、Createjsと同じような感じで書くことができました。

しかし描く方向によっては線がギザギザになります。
これはレンダラを作成する際に、アンチエイリアスを有効にすると、すこし改善されます。
     
     PIXI.autoDetectRenderer(100,100,{antialias:true);

以下にアンチエイリアスなしとありの場合の実行結果です
アンチエイリアスなし
![アンチエイリアスなし](https://qiita-image-store.s3.amazonaws.com/0/75209/e11294cb-574a-db93-e36b-627db963d46a.png)

アンチエイリアスあり
![アンチエイリアスあり](https://qiita-image-store.s3.amazonaws.com/0/75209/67532450-b643-aecd-ff34-35accafd2fa2.png)

ちょっと例がわかりにくいですかね。。。
線に限らず、円などで効果を発揮すると思います。

それでも多少はカクカクしますので、BlurFilterなどで処理すればきれいになるかと。
Excelでボタンとか使うときのメモ

# 基礎知識

時間があれば[ワークシート内のフォーム、フォーム コントロール、および ActiveX コントロールの概要](https://support.office.com/ja-jp/article/%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B7%E3%83%BC%E3%83%88%E5%86%85%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%80%81%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3-ActiveX-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E6%A6%82%E8%A6%81-d101804a-0f84-43ad-8cb2-e19277b8e3fb?ui=ja-JP&rs=ja-JP&ad=JP)を参照すること。

簡単な機能を実装するには ActiveX コントロールを使用するのが妥当。
フォームコントロール、ユーザコントロールについては触れない。

# コントロールの使い方

## ActiveX コントロールをワークシートに配置する

開発タブの挿入から選択する。コントロールのサイズなどを変更するにはデザインモードを使用する。


![開発タブ](https://qiita-image-store.s3.amazonaws.com/0/42724/ddc235e1-d862-c211-0893-b7697e77233e.png)


## イベントの設定

コントロールとVBAコード(Subプロシージャ)はプロシージャ名によって関連付けられる。
命名構文は `ControlName_EventName` のようにする。

```vbnet
Private Sub CommandButton1_Click()
    ' オブジェクト名が CommandButton1 の
    ' コントロールが Click された再に実行される
End Sub
```

簡単には下記の赤枠のあたりを弄る。

![イベントの設定](https://qiita-image-store.s3.amazonaws.com/0/42724/7f40bb75-6a84-802a-b5af-c0d877373a13.png)


## VBAからコントロールを参照する

```vbnet
' ActiveX コントロールオブジェクトの取得
' インデックス番号で選択する場合
dim obj
set obj = activeSheet.OLEObjects.item(1) ' インデックスは 1 から

' オブジェクト名が CommandButton1 である場合
dim obj2
set obj2 = activeSheet.OLEObjects.item("CommandButton1")
```

オブジェクト名を調べるには開発タブのプロパティボタンをクリックし、プロパティウィンドウを表示する。プロパティウィンドウには、現在フォーカスされているオブジェクトのプロパティが表示される。調査対象のコントロールがうまくフォーカスできない場合はデザインモードを使用する。

![プロパティウィンドウ](https://qiita-image-store.s3.amazonaws.com/0/42724/ed25b6ca-a6d6-80a8-27a1-fb857ce79286.png)



# API(MSDNリンク)

- [OLEObjects オブジェクト (Excel)](https://msdn.microsoft.com/ja-jp/library/office/ff840244.aspx)
- [OLEObject メンバー (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff841208.aspx)
- [ActiveX コントロール](https://msdn.microsoft.com/JA-JP/library/office/ff837582.aspx) ※ Excel で使用できる ActiveX コントロールオブジェクトの一覧？
- [Access オブジェクト モデル リファレンス (Access 2013 開発者用リファレンス)](https://msdn.microsoft.com/ja-jp/library/office/ff192120.aspx) ※エクセルの ActiveX コントロールリファレンスが見当たらなかったので Access のリファレンス
ImageMagickのMagick++ APIでEXIFを取得するには

```cpp:test01.cpp
#include <Magick++.h>

using namespace Magick;

Image img;
img.read(filepath);

// exifという文字列の指定がポイント。
Blob blob = img.profile("exif");
// blob.data()でEXIF情報が取得できる。
```

```shell
g++ -o test01 test01.cpp `Magick++-config --cppflags --cxxflags --libs --ldflags`
```

# 文字列で取得できる方法があった

タグを指定する必要があるが、

```cpp
string exifVal = img.attribute("EIXF:DateTimeOriginal");
```

# 関連投稿

- [Magick++で利用可能なフォント一覧を取得するには - Qiita](https://qiita.com/kjunichi/items/c62df93f5fdad79a3eff)

# 関連記事

- [mruby-mrmagickをWindowsでもv7系のImageMagickに対応させた](http://abrakatabura.hatenablog.com/entry/2018/02/23/074159)
- [ChocolateyでImageMagickをヘッダ、Libファイルとレガシーコマンドも一緒に入れるには](http://abrakatabura.hatenablog.com/entry/2018/02/21/071914)
- [mruby-mrmagickにMrmagick#formatsを追加した](http://abrakatabura.hatenablog.com/entry/2018/02/27/230659)
- [InkscapeをmacOSでビルドして動かせなかったが学べたこと](https://abrakatabura.hatenablog.com/entry/2018/05/12/215927)
python2&3の環境構築(OSX)

自分向け、Python構築メモ。
homebrewは入っている前提で、書きます。
とりあえず以下の手順で頑張ります。

```
$ brew install pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ exec $SHELL
$ pyenv install 2.7.9
$ pyenv install 3.4.3
$ pyenv global 2.7.9 3.4.3
```
ここまでできたら、あとは以下の通りに…。

```
$ python --version
Python 2.7.9
$ python2 --version
Python 2.7.9
$ python3 --version
Python 3.4.3
```

そしてこんなことができます。

```
$ pip --version
pip 6.1.1 from /Users/mypc/.pyenv/versions/2.7.9/lib/python2.7/site-packages (python 2.7)
$ pip2 --version
pip 6.1.1 from /Users/mypc/.pyenv/versions/2.7.9/lib/python2.7/site-packages (python 2.7)
$ pip3 --version
pip 6.0.8 from /Users/mypc/.pyenv/versions/3.4.3/lib/python3.4/site-packages (python 3.4)
```

これでpythonのバージョン別でpipが使い分けられますね。