OmniAICreator/Qiita-1.07M huggingface dataset:
スクリプトを Edit モードで実行

MonoBehaviourは通常、**Playモードのみで実行**される。
Playモードとは再生ボタンが押下され実行されている状態のこと。
![play_mode.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/2c20fb72-a5ce-1022-7888-8f8bab111921.png)

ExecuteInEditMode属性を追加するとPlayモードでないとき(==Editモード)にスクリプトを実行できるようになる。

```csharp:TestEditMode.cs
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class TestEditMode : MonoBehaviour {

	void Start() {
		Debug.Log("Start");
	}

	void Update() {
		Debug.Log("Update");
	}

	void OnGUI() {
		Debug.Log("OnGUI");
	}

	void OnRenderObject ()
	{
		Debug.Log("OnRenderObject");
	}
}
```

公式ドキュメントをみる限りだと、Editモード実行できるものは

- Update
- OnGUI
- OnRenderObject

の３つのようみたい。

## Update
シーンの中で何か変更があったときに実行される。

![Update.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/740b9e9f-6e45-2b59-82e7-c5fd8990afff.png)
GameObjectを追加してみた。
![Update2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/01253120-35fc-8378-6632-46a37ef1daa7.png)
実行された。

![Update3.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/083004ce-0b01-2910-8a87-b53f59bbf488.png)
![Update4.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/c6326f1e-d440-27b8-1e4b-650e8a234a15.png)
GameObjectを移動してみた。
![Update5.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/f7b794d1-c1e3-2904-014b-f8950619848d.png)
実行された。

## OnGUI
ゲームビューがイベントを受け取ったとき実行される？

![OnGUI.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/8eb6dcde-1b97-75e3-7968-c997d4c17900.png)
ゲームビューをアクティブにしてみると
![OnGUI2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/4ab01b2f-eed4-dbb3-48f2-23ed04b18bc5.png)
実行された。

## OnRenderObject
シーンビューやゲームビューが描画されるたびに実行される。

上のUpdateとOnGUIのログをみるとこのメソッドが実行されていることがわかります。
とりあえず、なんか描画されれば実行される。
ジェスチャーもStoryBoardを使って実装してみる

# そもそも、ジェスチャーとは?
タップやスワイプなどのスマートフォン特有の操作イベントです。

| 種類 | 説明| 
|:-----------|:-----------| 
| UITapGestureRecognizer | タップ | 
| UIPinchGestureRecognizer | ピンチインアウト主に拡大縮小 | 
| UIPanGestureRecognizer | ドラッグ | 
| UISwipeGestureRecognizer | ページめくりやスクロール等のスワイプ | 
| UIRotationGestureRecognizer | 指２本で回転させる感じ | 
| UILongPressGestureRecognizer | 長押し | 

## UIImageViewにタップジェスチャーをつける場合を例に説明します。
### すべてソースコードで書くと下記のようなイメージになります。

```
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        configureLogoImageView()
    }
    
    func configureLogoImageView() {
        
        imageView.userInteractionEnabled = true
        imageView.addGestureRecognizer(
            UITapGestureRecognizer(target: self, action: "tapGesture:"))
    }
    
    //MARK:- Gesture Action Method
    func tapGesture(recognizer: UITapGestureRecognizer) {
        print(__FUNCTION__)
    }
}
```

例えば、UImageViewのタップジェスチャーも
UIButtonのアクションと同じように実装できないか?
ということで、本題に入ります。

# StoryBoardを利用して、UIViewにジェスチャーをつけてみます。。

## 手順
たった、3ステップです。

1. StoryBoardにUIImageViewを配置し、「InteractionのUser Interaction Enabled」にチェックをつける。
2. Objectから「Tap Gesture Recoginizer」を検索し、UIImageViewの上にドラッグ&ドロップする。
3. 「Tap Gesture Recoginizer」からソースコードにセグエをひき、アクションを定義する。

それでは、順に実装しています。

## 1. StoryBoardにUIImageViewを配置し、「InteractionのUser Interaction Enabled」にチェックをつける。
これを忘れると、イベントは拾えません。
**ピンチなど2本指以上画面にタッチが必要な場合は、「Multiple Touch」をチェックすること。**

<img width="127" alt="Step1.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/0f10ed17-0918-937c-84ec-48a4fea9258d.png">

## 2. Objectから「Tap Gesture Recoginizer」を検索し、UIImageViewの上にドラッグ&ドロップする。
**ジェスチャーをつけたい対象の上に配置してください。**

<img width="320" alt="Step2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/6984841b-1584-dd1c-4c0c-583270d8bdbf.png">

**背景にジェスチャーをつけたい場合は、土台になっているUIViewにドラッグ＆ドロップすると実現可能です。**
例えば、背景をタップすると、キーボードを消すなど。

## 3. 「Tap Gesture Recoginizer」からソースコードにセグエをひき、アクションを定義する。

<img width="320" alt="Step3.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d7acea2a-37fc-446d-b2fb-ebf8fd331cb9.png">

**注意するところは、Connectionを「Action」にすること！**

### StoryBoardを利用するとソースコードは、下記のようなイメージになります。
あら、すっきり！

```
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    //MARK:- Action Method
    @IBAction func tappedImageView(sender: UITapGestureRecognizer) {
        print(__FUNCTION__)
    }
}

```

# まとめ
今回は、タップジェスチャーを例にしましたが、
その他のジェスチャーも同じように実装出来ます。
どなたかの参考になれば、幸いです。

間違っていることがあれば、
ご教授頂ければ幸いです。
インスタンスのプロパティ名に文字列でアクセス

### インスタンスが文字列で与えられるkeyと同じ名前のプロパティを持っているかどうか
Mirrorを使えばインスタンスのプロパティ名を取得することができる
Mirrorについて
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Reference/Swift_Mirror_Structure/index.html
あまり推奨されていないのかも…

```swift:
// keyで与えられる文字列と同じプロパティ名を持っているかどうか
private func hasProperty(target:AnyObject, key:String) -> Bool {
    let mrr = Mirror(reflecting : target)
    for prop in mrr.children {
        let propLabel = prop.label! as String
        if (propLabel == key) {
            return true
        }
    }
    return false
}
```
AndroidStudioでassetsフォルダを使うとき

AndroidStudioでassetsフォルダが参照できずにハマった時のメモ

こんな感じで読み込み処理をする

```java
        AssetManager as = getResources().getAssets();
        InputStream is = null;
        try {
            is = as.open("test.csv");
        } catch (IOException e) {
            e.printStackTrace();
        }
```

assetsフォルダを作ってcsvを置く

エラーが出る

`java.io.FileNotFoundException: test.csv`

AndroidStudioではsrc > mainの中にassetsフォルダを作成しないとダメ
Mattermost の検索機能

Mattermost が日本語検索に対応していないと勘違いしてコードを読んだ際の覚書です。途中で気づいたのですが完全一致には対応していました・・・

#対象

- [Mattermost v1.2.1](https://github.com/mattermost/platform/tree/v1.2.1)

# 検索の流れ
![search_baar.png](https://qiita-image-store.s3.amazonaws.com/0/5179/d3d2672a-5cf0-29f3-c119-9f4b6f59f606.png)
## クライアント側
[platform/web/react/components/search_bar.jsx#L101-L125](https://github.com/mattermost/platform/blob/v1.2.1/web/react/components/search_bar.jsx#L101-L125)
[platform/web/react/components/search_bar.jsx#L4-L12](https://github.com/mattermost/platform/blob/v1.2.1/web/react/components/search_bar.jsx#L4-L12)

[platform/web/react/utils/client.jsx#L838-L852](https://github.com/mattermost/platform/blob/v1.2.1/web/react/utils/client.jsx#L838-L852)

## サーバー側
[platform/api/post.go#L25](https://github.com/mattermost/platform/blob/v1.2.1/api/post.go#L25)
[platform/api/post.go#L897-L927](https://github.com/mattermost/platform/blob/v1.2.1/api/post.go#L897-L927)

[platform/store/store.go#L33](https://github.com/mattermost/platform/blob/v1.2.1/store/store.go#L33)
[platform/store/store.go#L93](https://github.com/mattermost/platform/blob/v1.2.1/store/store.go#L93)
[platform/store/store.go#L12-L17](https://github.com/mattermost/platform/blob/v1.2.1/store/store.go#L12-L17)

[platform/store/sql_post_store.go#L526-L689](https://github.com/mattermost/platform/blob/v1.2.1/store/sql_post_store.go#L526-L689)

# データベース
## 確認

```bash
#make install
make run
docker ps
docker run --link mattermost-mysql -it --rm mysql bash
```

```bash
mysql -u $MATTERMOST_MYSQL_ENV_MYSQL_USER -p$MATTERMOST_MYSQL_ENV_MYSQL_ROOT_PASSWORD -h $MATTERMOST_MYSQL_PORT_3306_TCP_ADDR $MATTERMOST_MYSQL_ENV_MYSQL_DATABASE
```

```
show tables;
desc Posts;
```

## 起動時の流れ（逆順）
[platform/model/post.go#L18-L35](https://github.com/mattermost/platform/blob/v1.2.1/model/post.go#L18-L35)

[platform/store/sql_post_store.go#L26](https://github.com/mattermost/platform/blob/v1.2.1/store/sql_post_store.go#L26)

[platform/store/sql_store.go#L115](https://github.com/mattermost/platform/blob/v1.2.1/store/sql_store.go#L115)
[platform/store/sql_store.go#L53](https://github.com/mattermost/platform/blob/v1.2.1/store/sql_store.go#L53)

[platform/api/server.go#33](https://github.com/mattermost/platform/blob/v1.2.1/api/server.go#L33)

[platform/mattermost.go#L55](https://github.com/mattermost/platform/blob/v1.2.1/mattermost.go#L55)

### （参考）Go Relational Persistence v1.7
[gorp/README.md](https://github.com/go-gorp/gorp/blob/v1.7/README.md)
EC-CubeによるECサイト立ち上げ

ECCUBEをターミナルで立ち上げた際のメモ書き。

## 環境
- MAMP
- EC-CUBE3

## 初期設定
GithubからECCUBE3をクローンする.
ローカルで動かすので、MAMPのhtdocsフォルダにダウンロードする

```
$ git clone http://github.com/EC-CUBE/ec-cube.git
```
フォルダへ移動する.

```
$ cd ec-cube
```
composerをインストールする.

```
$ curl -sS https://getcomposer.org/installer | php
```

インストール後、「eccube_install.sh」の以下の部分を修正.

```eccube_install.sh
# Configuration
#-- Shop Configuration
CONFIG_PHP="app/config/eccube/config.php"
ADMIN_MAIL=${ADMIN_MAIL:-"admin@example.com"}
SHOP_NAME=${SHOP_NAME:-"EC-CUBE SHOP"}
HTTP_URL=${HTTP_URL:-"http://test.local"}
HTTPS_URL=${HTTPS_URL:-"http://test.local/"}
ROOT_URLPATH=${ROOT_URLPATH:-"/"}
DOMAIN_NAME=${DOMAIN_NAME:-""}
ADMIN_DIR=${ADMIN_DIR:-"admin/"}

DBSERVER=${DBSERVER-"127.0.0.1"}
DBNAME=${DBNAME:-"cube3_dev"}
DBUSER=${DBUSER:-"cube3_dev_user"}
DBPASS=${DBPASS:-"password"}

ADMINPASS="f6b126507a5d00dbdbb0f326fe855ddf84facd57c5603ffdf7e08fbb46bd633c"
AUTH_MAGIC="droucliuijeanamiundpnoufrouphudrastiokec"

DBTYPE=$1;

case "${DBTYPE}" in
"pgsql" )
    #-- DB Seting Postgres
    PSQL=psql
    PGUSER=postgres
    DROPDB=dropdb
    CREATEDB=createdb
    DBPORT=5432
;;
"mysql" )
    #-- DB Seting MySQL
    MYSQL=mysql
    ROOTUSER=root
    ROOTPASS=$DBPASS
    DBSERVER="127.0.0.1"
    DBPORT=3306
;;
```
## インストール
最後に下記コマンドでインストールする.

```
$ sh eccube_install.sh mysql
```
最近読んだ面白い本について。

せっかくのQiitaなのですが、全くプログラミングに関係ない事を書いちゃいます。

<br>

最近、26歳を迎えて「自分26にもなって何もしとらんやん。」と

なんか焦って来ました。
<br>



そのため、最近は<strong>とりあえず時間を見つけて本を読んでます。</strong>
<br>
<br>
オフィスが渋谷から移転し、電車通勤になったので帰りの電車は絶対本を読む、と決めました。
ちなみにやりだしたのはつい最近の事ですw
<br>
<br>

最近読んでいるのは今更感MAXですが、
>[金持ち父さん貧乏父さん](http://www.amazon.co.jp/dp/4480863303/?tag=googhydr-22&hvadid=40371303162&hvpos=1t1&hvexid=&hvnetw=g&hvrand=17929343853055414662&hvpone=&hvptwo=&hvqmt=b&hvdev=c&ref=pd_sl_5nm8eloqnk_b)
>[金持ち父さんのキャッシュフロー・クワドラント](http://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%89%88-%E9%87%91%E6%8C%81%E3%81%A1%E7%88%B6%E3%81%95%E3%82%93%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%95%E3%83%AD%E3%83%BC%E3%83%BB%E3%82%AF%E3%83%AF%E3%83%89%E3%83%A9%E3%83%B3%E3%83%88-%E7%B5%8C%E6%B8%88%E7%9A%84%E8%87%AA%E7%94%B1%E3%81%8C%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E3%82%82%E3%81%AE%E3%81%AB%E3%81%AA%E3%82%8B-%E3%83%AD%E3%83%90%E3%83%BC%E3%83%88-%E3%82%AD%E3%83%A8%E3%82%B5%E3%82%AD/dp/4480864253/ref=sr_1_1?s=books&ie=UTF8&qid=1449666446&sr=1-1&keywords=%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%95%E3%83%AD%E3%83%BC%E3%82%AF%E3%83%AF%E3%83%89%E3%83%A9%E3%83%B3%E3%83%88)

です。

どんだけ金持ちになりたいんだって感じですね。w
<br>
<br>
内容としては、
自分に利益をもたらしてくれるもの＝資産
自分の財布からお金を奪って行くもの＝負債
という考えをしっかり持って、お金に関する知識を身につけて行かないと
人生だまされて貧乏になっちゃうよ、という話です。
<br>
「でもせっかく読書しても読んだつもりになるのが危ないな〜」と思ったら
<br>
やっぱり取り上げてる方がいらっしゃいました。
<br>
『読書は「アウトプット」が99％』 藤井孝一著 を読んで<br>
http://rakunitanoshiku.hatenablog.com/entry/2015/09/07/053000
<br>
読んだら読んだで、こうやってしっかり書き留める習慣をつけないと<br>
意味がないなと再認識した一日でした。<br>
何をreduxのコンテナにするか

# redux最近来てるっぽい
reduxとreactを使ってみて、コンテナ(Smart Component)とコンポーネント(Dumb Component)をどう使い分けるかについて考えてみた。

https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.p8sdryhie

上はreduxのcontributor自身による使い分けに付いての解説記事。

各種単体での使ってみた感想はこちら
[redux](http://qiita.com/halhide/items/2fc2bdb29e46721e5fe6)
[react](http://qiita.com/halhide/items/ac00dd83f027f68232b0)

# react-redux
reactはJust UIだし、reduxはアプリの状態管理のみが関心ごとなので、reactとreduxを組み合わせるためには、https://github.com/rackt/react-redux をつかいます。

これの役割は何かと言うと、reduxが管理している状態やactionCreatorと、reactのコンポーネントとの橋渡しです。

結合すると、reactコンポーネントで何かイベントが起きる（＝reduxのactionCreatorが呼ばれる）と、reduxのアクションに応じてredux管理のアプリの状態が変わり、その結果がreactコンポーネントのpropsに渡って再描画される、というイメージです。この橋渡しは`connect`メソッドをつかって行われ、reduxとconnectされたcomponentはコンテナと呼んだりしています。

# 何をコンテナにするか？
react-reduxのドキュメントを最初読んだときに、データフローをわかりやすくするためにコンテナはネストさせない方が良い、的なことが書いてあり、最初愚直にそれに従いました。その結果どうなったかというと、

```
class RootComponent extends Component {
  render() {
    const {prop1, prop2, prop3, prop4, prop5} = this.props;
    const {action1, action2, action3, action4, action5} = this.props;
    return (
      <div>
        <SubComponent
            prop1={prop1}
            prop2={prop2}
            prop3={prop3}
            action1={action1}
            action2={action2}
            action3={action3}
        />
        <SubComponent
            prop4={prop4}
            prop5={prop5}
            action4={action4}
            action5={action5}
        />
      </div>
    );
  }
}

connect(
  mapStateToProps,
  mapDispatchToProps
)(RootComponent);
```

的な感じで、子要素で必要なものを全てルートで渡す事になり、トップのコンポーネントのpropsが肥大化し、さらに深い階層のコンポーネントに必要なアクションもルートで渡す必要があるため、直感的になんでこのアクションを渡しているのかよくわからん感じになります。

## データフローがネストしなければ良い
結局ドキュメントで言っているのはデータフローをネストさせるな、という話なので、actionに関しては何も言ってないです。

そんなわけで、渡すpropsのデータがネストしないのであれば、むしろ積極的にコンテナは分けていった方がよさそうです。

たとえば商品リストを一覧で表示し、追加フォームや削除ボタンがあるとします。

containerになるのは、
```
<ItemList items={items}/>
<NewItemForm addItem={addItem}/>
<DeleteItemButton deleteItem={deleteItem}/>
```

です。`items`、`addItem`、`deleteItem`はそれぞれreduxの管理している状態とアクションです。

ただのコンポーネントしては、

```
<Item item={item}/>
```

だけです。`item`については、`ItemList`からpropsで与えられる物とします。

実装としては、

```
class ItemList extends Component {
  render() {
    return (
      <div>
        <NewItemForm/>
        {this.props.items.map((item) => {
          return <Item key={item.id} item={item}/>
        })}
      </div>
    );
  }
}

class Item extends Component {
  render() {
    return (
      <div>
        {item.title} {item.price}円 <DeleteItemButton props={item.id}/>
      </div>
    );
  }
}
```

といった感じになるかと。ルートになるItemListには表示する情報だけを渡し、ネストした要素で必要な削除や追加などのアクションは、アクションだけをreduxとconnectしたコンテナをつかい、必要に応じてpropsでID等を渡します。各コンポーネントに渡されるpropsは直感的にそのコンポーネントに必要そうなものしか与えられないので、ずいぶんわかりやすくなったと思います。

# 結論
データフローだけネストしないように気をつけて、actionだけがreduxに依存するようなコンポーネントは積極的にcontainerにしていったほうが見通しよくなりそう。
素のgetter/setterなんて書きたくないんだよ


# はじめに
エンジニアになってから振り返ると、DTOやBeanにprivateのメンバを宣言して、
Eclipseの機能を使ってアクセサメソッド(setter/getter)を自動生成するっていう作業、
どんだけやってきたんだよｗ書きたくないよｗと思う。

# エンジニアなら楽しましょう
はいっ、lombok〜♪(ドラえもん的な)
[Project Lombok](https://projectlombok.org)

lombokは、フィールドを宣言してアノテーションを付与するだけで、
setter/getterがあたかも存在しているかのような振る舞いをします。
内部の挙動は知りませんが、コンパイル時にsetter/getterが生成されてるのかな。

~~~HogeDto.java
class HogeDto {
    @setter @getter
    private Moge moge;
}
~~~

~~~Foo.java
class Foo {
  public static void main(String args[]){

    HogeDto hoge = new HogeDto();
    Moge moge = new Moge();

    // セットできる！
    hoge.setMoge(moge);

    // ゲットできる！
    hoge.getMoge();
  }
}
~~~

## え？アクセサメソッドで固有の処理を走らせたいんだけど？

~~~HogeDto.java
class HogeDto {
    @setter
    private Moge moge;
    
    // どうぞ、固有の処理を書いてください
    public Moge getMoge() {
    	return sanitaize(moge);
    }
    
}
~~~

#おわりに
今更感がありますが、知らな人がいたら是非活用するとよいかと。
Jetty WebSocketClientをシングルスレッドで動かす


[Jetty Websockectクライアントライブラリ](https://github.com/eclipse/jetty.project/tree/master/jetty-websocket)は、デフォルトでワーカスレッドが複数立ち上がります。この場合、ライブラリがメッセージを受信し、受信コールバック内が呼び出されたい際に、コールバック内で重たい処理を行うとコンテキストスイッチが起こり、処理順序が変わってしまう可能性があります。

対策としては、シングルスレッドで動かすことです。マルチスレッド特有のめんどくささからは開放されます。

シングルスレッドで動かすためには、WebSocketClientにFixedThreadPoolを指定します。ここでスレッド数は2つである点に注意してください。ワーカスレッドは1つでも内部動作用にもう1つ指定しないと動かないようです。

```
Executor executor = Executors.newFixedThreadPool(2);
WebSocketClient client = new WebSocketClient(executor); 
```
[bash] agとpecoでディレクトリに移動したりファイルを開いたり､検索したりする

agについてはこちら↓ファイルやソースコードの検索が出来ます
[The Silver Searcher のススメ](http://qiita.com/thermes/items/e1e0c94e2875df96921c)

pecoはこれ↓出力結果を渡すとフィルタリングでます｡
https://github.com/peco/peco

treeはこれです↓ファイルやフォルダをツリー状に表示してくれます｡
[ディレクトリやファイルの構造を表示させる tree コマンド
](http://qiita.com/susan_mamma/items/8891117ed4df42d1cdcc)

練習がてら遊んでみました｡

#ファイルやディレクトリを検索する
ag に -g　オプションをつけてやるとファイルでもフォルダでも検索できちゃうみたいです｡

```bash
function agpc () {
  $(ag -g $1 | peco)
}
```

例えば

agpc /RUBY/

とやるとどこかにある/RUBY/というディレクトリの中身が出てきます｡

agpc /RUBY/.*rb

とすると/RUBY/ディレクトリ以下のrbファイルがざあっと出てきました｡

#ディレクトリの移動

Treeで表示してディレクトリを移動するには

```bash
function trc(){
  local goto=$(tree --charset=o -f -L $1| peco | tr -d '\||`|-' | xargs echo)
  if [ -n "$goto" ]; then
    echo "cd $goto"
    cd $goto
  fi
}

```

trc の後に数字を入れるとTreeで表示するディレクトリの深さが変わります｡

#エディタで開く

上のやつをちょっと変えるだけですね｡

```bash
function trsb(){
  local file=$(tree --charset=o -f -L $1| peco | tr -d '\||`|-' | xargs echo)
  if [ -n "$file" ]; then
    echo "sublime $file"
    sublime $file
  fi
}

```
trsbの後に数字を入れると表示する深さが変わります｡
sublime のところをお好きなエディタにどうぞ｡
pyenvを使って、pythonバージョンの変更

![](https://www.python.org/static/img/python-logo.png)

[参考：pyenvとvirtualenvで環境構築](http://qiita.com/Kodaira_/items/feadfef9add468e3a85b)

###インストール出来るバージョンの確認
<code>
% pyenv install --list
</code>

###それぞれのバージョンのpythonのインストール

<code>
$ pyenv install 3.5.0  
$ pyenv install 2.7.10
</code>

###切り替えられるpythonのバージョンの確認

```shell-session
% pyenv versions  
  system  
  2.7.10  
* 3.5.0 (set by /Users/xxx/.pyenv/version)  
```

###現在のバージョンの確認

```shell-session
% python --version                        
Python 3.5.0
```

###pythonのバージョンの切り替え
globalとすると全体に、localにするとそのカレントディレクトリに指定したバージョンが反映されます。  

```shell-session
$ pyenv global 3.5.0
$ python --version
Python 3.5.0

$ pyenv local 2.7.10
$ python --version
Python 2.7.10
```
消えた言語バーを表示させる方法

#はじめに
Windows10から7に戻したとき、
言語バーとかある↓のやつが表示されなくなり、
![a1.png](https://qiita-image-store.s3.amazonaws.com/0/75241/d12203b5-32db-0f13-ee5d-20857e6c2cff.png)


下記の方法でも表示されなかったので、
違う方法がないか調べてたらあったのでメモ
https://support.microsoft.com/ja-jp/kb/880544



#手順
①デスクトップ画面の左下にあるスタートを押す
②プログラムとファイルの検索の欄に**ctfmon**と入力する
![a4.png](https://qiita-image-store.s3.amazonaws.com/0/75241/2701626f-ebbd-d78a-2c69-cfc974bb6239.png)
③検索で出てきたctfmon.exeまたはctfmonを右クリックし、
　**ファイルの場所を開く**をクリックする
④たくさんファイルがあるフォルダに移動しますが、
その中のctfmonまたはctfmon.exeを探して右クリックする。
そして、**ショートカットの作成**をクリックする。
そうすると、デスクトップ画面にショートカットアイコンが作成される。

下記がctfmonのアイコン
![c2.png](https://qiita-image-store.s3.amazonaws.com/0/75241/32fd3027-2cbb-d937-3750-33f0c9341248.png)


⑤デスクトップ画面の左側にあるスタートを押す
⑥すべてのプログラムを押す
⑦下の方に**スタートアップ**というフォルダがあるので、
　その中に先ほど作成したショートカットをドラックアンドドロップで入れる
⑧パソコンを再起動する

これで言語バーが表示されていると思います。



#おわりに
下記サイトにある、
**TextServicesFramework monitor (MsCtfMonitor) を有効にする方法**
というのが本来windows7で言語バーを表示させる正しいやり方らしいです。
今回は表示されたので良しとしますが、
心配な方は下記のサイトを見てください。
[Windows 7/Vista で言語バーが表示されない場合](http://note.chiebukuro.yahoo.co.jp/detail/n158548)
TextServicesFramework monitor (MsCtfMonitor) を有効にして言語バーを表示することができた場合は、
今回作成したスタートアップの中に入っているctfmonのショートカットは削除した方がいいと思います。


#参考サイト
[Windows 7/Vista で言語バーが表示されない場合](http://note.chiebukuro.yahoo.co.jp/detail/n158548)
[ウィンドウズVistaを使っています。言語バーが突然消えてしまいました。](http://answers.microsoft.com/ja-jp/windows/forum/windows_vista-desktop/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6/c58e74d1-0bbd-4b21-bb4f-ff18e4132296?tab=MoreHelp)
Three.jsを使っていると「問題が起きたため、このWebページを再度読み込みました。」と出る

iPadでThree.jsを使ったコンテンツを開発していたのですが、しばらくすると「問題が起きたため、このWebページを再度読み込みました。」というメッセージが表示されてページが再読み込みしてしまう現象に遭遇しました。
調べてみたところ、たくさんの画像を取っ替え引っ替え読み込んでいるうちにだんだん動作が重くなり落ちるという現象だということがわかりました。おそらくテクスチャーを切り替える時に前のテクスチャーがメモリ上に残り続けてしまってだんだん空きメモリがなくなっていくのだろうなと思い、実験してみました。

```html
<html>

<head>
  <title>My first Three.js app</title>
  <style>
  body {
    margin: 0;
  }

  canvas {
    width: 100%;
    height: 100%
  }
  </style>
</head>

<body>
  <!-- 読み込み回数を表示 -->
  <div id="out">0</div>

  <script src="bower_components/three.js/three.min.js"></script>
  <script>
  // 以下、three.jsのサンプルより
  var scene = new THREE.Scene();
  var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

  var renderer = new THREE.WebGLRenderer();
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);

  var geometry = new THREE.BoxGeometry(1, 1, 1);
  var material = new THREE.MeshBasicMaterial({
    color: 0x00ff00
  });
  var cube = new THREE.Mesh(geometry, material);
  scene.add(cube);

  camera.position.z = 5;

  var render = function() {
    requestAnimationFrame(render);

    cube.rotation.x += 0.1;
    cube.rotation.y += 0.1;

    renderer.render(scene, camera);
  };

  render();

  var count = 0; // 読み込み回数
  var loader = new THREE.TextureLoader();

  function loadTexture() {
    loader.load('image.jpg', function(texture) {
      document.getElementById('out').innerHTML = ++count;

      // 読み込んだテクスチャーでマテリアルを作成
      cube.material = new THREE.MeshBasicMaterial({
        map: texture
      });
    });
  }

  // ひたすら読み込む！！！
  setInterval(loadTexture, 100);
  </script>
</body>

</html>
```

`image.jpg`は1024x1024の画像にしました。
上記のコードをiPadで走らせてみたところ、`count`が280くらいになったところで「問題が起きたため、このWebページを再度読み込みました。」と出ることがわかりました。
ちなみにPCのChromeでも`count`が800くらいになったところでWebGLが無効になって3Dの表示が消えました。

## 対処法

新しいテクスチャーを読み込んで前のテクスチャーを上書きする場合は、`texture.dispose()`を呼ぶようにしましょう。
上記コードでいえば、`// 読み込んだテクスチャーでマテリアルを作成`の箇所を次のようにしてみます。

```js
if (cube.material.map) {
  // 2回目以降
  cube.material.map.dispose(); // これを必ず呼ぶこと！！！
  cube.material.map = texture;
} else {
  // テクスチャーを使用しないマテリアルが設定されている場合は、マテリアルを新たに作成する
  cube.material = new THREE.MeshBasicMaterial({
    map: texture
  });
}
```

これで、1000回でも2000回でもテクスチャーを読み込めるようになります。

JavaScriptは自動でガーベジコレクションしてくれると思って安心してたらいけませんね！！！
ssh-copy-idを使ってssh公開鍵を対象サーバーに配置する

ssh-copy-idを使ってssh公開鍵を対象サーバーに配置する
====================

## 背景

**ssh-copy-id** という、操作中のユーザーのSSH公開鍵を対象サーバーに簡単に配置するためのコマンドを知ったので使ってみた。


## 環境

```sh
$ uname -a
Darwin genzouw-MacBook-Pro.local 15.0.0 Darwin Kernel Version 15.0.0: Sat Sep 19 15:53:46 PDT 2015; root:xnu-3247.10.11~1/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin

$ bash -version
GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin14.5.0)

$ zsh --version
zsh 5.1.1 (x86_64-apple-darwin15.0.0)
```


## 施行

### Vagrantで新しいLinuxサーバーを立てる

```sh
$ vagrant init

$ vi Vagrantfile        # ここではすでにBoxを追加していたため、Vagrantfileを編集して利用するBoxを設定した

$ vagrant up

$ vagrant ssh
[vagrant@vagrant-centos65 ~]$ sudo useradd genzouw
[vagrant@vagrant-centos65 ~]$ sudo su - genzouw
[genzouw@vagrant-centos65 ~]$ mkdir .ssh            # sshの鍵の設定はない状態
[genzouw@vagrant-centos65 ~]$ chmod 700 .ssh/
[genzouw@vagrant-centos65 ~]$ exit
logout


[vagrant@vagrant-centos65 ~]$ sudo passwd genzouw   # 初期パスワードを設定
[vagrant@vagrant-centos65 ~]$ exit
logout
Connection to 127.0.0.1 closed.
```

### Mac上に ssh-copy-id がインストールされていなかったのでインストール

```sh
$ brew install ssh-copy-id
==> Downloading https://homebrew.bintray.com/bottles/ssh-copy-id-6.8p1.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring ssh-copy-id-6.8p1.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/ssh-copy-id/6.8p1: 7 files, 344K

$ ssh-copy-id                                                                                                      15-12-09 - 21:01:53
Usage: /usr/local/bin/ssh-copy-id [-h|-?|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
```

### 早速鍵の設定

```sh
$ ssh-copy-id genzouw@127.0.0.1 -p2222
```

## 結果

おもむろにVagrant環境に接続してみる

```sh
$ ssh genzouw@127.0.0.1 -p2222
```

予め作成しておいたsshの鍵がパスワード無しのものだったので、
パスワード無しでログインができる。
PHP sprintfで小数点の桁数表示についてメモ




会社で話題になったので

小数点の桁数を指定して四捨五入する場合roundを使えばいいと思っているけど
sprintfでも行えるらしいが、挙動が自分の認識している四捨五入となんか違うのでメモ

#roundの場合

```php:round.php
<?php

echo "round(23.555,1)だと";
echo round(23.555,1);
echo "\n";

echo "round(23.555.2)だと";
echo round(23.555,2);
echo "\n";
```

##実行結果

```shell-session
-sh-4.1$ php round.php 
round(23.555,1)だと23.6
round(23.555.2)だと23.56
```


#sprintfの場合


```php:sprintf.php
<?php
 
    $syo = 23.555;
    var_dump($syo);
    
echo sprintf("dは\t%d\n", $syo);
echo sprintf("fは\t%f\n", $syo);
echo sprintf(".1fは\t%.1f\n", $syo);
echo sprintf(".2fは\t%.2f\n", $syo);
echo sprintf("04dは\t%04d\n", $syo);
echo sprintf("Fは\t%F\n", $syo);
```

##実行結果


```shell-session
-sh-4.1$ php sho.php
float(23.555)
dは     23
fは     23.555000
.1fは   23.6　←これは繰り上がるのに
.2fは   23.55　←これは繰り上がってない？
04dは   0023
Fは     23.555000
```
iOS 9.2でSFSafariViewControllerの挙動が変わってる！

今朝iOS 9.2にアップデート直後に見た目の変化で驚き、さらにXcode 7.2で開発中に挙動の変化に気付き、さらにびっくりしました(　´･‿･｀)

# どう変化したか

とりあえず概要です。

- 閉じるための`Done`ボタンが右上から左上に変更
    - これは普通にアプリ弄っていて気付きました
- `presentViewController`しただけでPush遷移するようになった
    - こちらはXcode 7.2で開発中に気付きました

# 閉じるための`Done`ボタンが右上から左上に変更

これはそんなに特筆することでは無いですが、個人的には嬉しかったです(　´･‿･｀)

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">iOS 9.2で、SFSafariViewControllerのDoneボタンが右から左に移動したので、左手操作派ユーザーとしては嬉しい(　´･‿･｀)</p>&mdash; M Ono (@_mono) <a href="https://twitter.com/_mono/status/674473195072696320">December 9, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![Screen Shot 2015-12-09 at 8.44.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/3aff3aee-57b2-be80-8fb7-8161ec6b1a5b.png)


# `presentViewController`しただけでPush遷移するようになった

こちらはびっくりしました(　´･‿･｀)
左エッジスワイプで戻ることも可能です。
この挙動の方が良いという声が多く、[Push / Pop modal SFSafariViewController (Hacking swipe from edge gesture)](http://www.stringcode.co.uk/push-pop-modal-sfsafariviewcontroller-hacking-swipe-from-edge-gesture/)などがんばって対応している例などもありました。

それが、iOS 9.2・Xcode 7.2ビルドの組み合わせでこのように普通に呼び出すだけでPush遷移になりました。

```swift
let vc = SFSafariViewController(URL: NSURL(string: "http://qiita.com/mono0926")!)
presentViewController(vc, animated: true, completion: nil)
```

初めは、呼び出し元がUINavigationControllerだったらPushで、普通のUIViewControllerだったらモーダルかな？と思いましたが、いずれでもPushでした。

また、いくつか検証してみましたが、SDKバージョンは9.1を指定しても挙動変わらず、「iOS 9.2・Xcode 7.2ビルドの組み合わせ」が条件ぽくて、今いちしっくり来なかったです。

| 端末 | SDK | Xcode | 結果 |
|---|---|---|---|
| 9.1  | 9.1  |7.1 |  モーダル |
| 9.1  | 9.2  |7.2 |  未検証 |
| 9.2  | 9.1  |7.1 |  モーダル |
| 9.2  | 9.1  |7.1 |  モーダル  |
| 9.2  | 9.1  |7.2 |  Push  |
| 9.2  | 9.2  |7.2 |  Push  |

開発者としてあまり困ることは無さそうな気がしますが、[Push / Pop modal SFSafariViewController (Hacking swipe from edge gesture)](http://www.stringcode.co.uk/push-pop-modal-sfsafariviewcontroller-hacking-swipe-from-edge-gesture/)のように細工しているとうまく動かなくなるなどありえるかもしれません。
iOS 9.1以前からPushの挙動になるよう対応されていた[Tweetbot](http://tapbots.com/tweetbot/)は、iOS 9.2でも問題無かったですが。

ドキュメントには、まだ更新無さそうでした:
https://developer.apple.com/library/prerelease/ios/documentation/SafariServices/Reference/SFSafariViewController_Ref/RevisionHistory.html#//apple_ref/doc/uid/TP40016220-CH2-SW1

# 【追記】サードパーティーのAction extensionsもサポートされました

こちらの記事で知りました:
[iOS 9.2ではSFSafariViewControllerでサードパーティエクステンションがサポートされ、Tweetbotに1Passwordを利用してアカウントを追加することも可能に。](http://applech2.com/archives/47166121.html)

確かに書いてありますね！

[iOS 9.2 Release Notes](https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-9.2/index.html#//apple_ref/doc/uid/TP40016638)
> SFSafariViewController now supports 3rd party Action extensions. Any Action extension that works in Safari will also work in SFSafariViewController.
Javaオブジェクトを msgpack Array型にシリアライズ・デシリアライズする


[MessagePack for Java](https://github.com/msgpack/msgpack-java) 、[jackson-databind](https://github.com/FasterXML/jackson-databind)を使ったJavaオブジェクトのシリアライズ・デシリアライズをサポートしています。ただし、デフォルトではJavaオブジェクトはMap形式にマッピングされてしまうため、一工夫が必要です。

msgpackのArray型にシリアライズ・デシリアライズシたい場合、そのオブジェクトのクラスにアノテーションを指定します。以下はアノテーション指定の例です。クラスのフォーマットがARRAYであることを示しています。

```
@JsonFormat(shape=JsonFormat.Shape.ARRAY)
public class Point {
    private int x;
    private int y;

    public Point() {}
    public Point(int x, int y) {this.x=x;this.y=y;}

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}
```

シリアライズする場合はObjectMapperを使います。初期化にMessagePackFactoryを指定している点に注意してください。ObjectMapperは元々Json向けにできたライブラリであり、これがないとデフォルトではmsgpackは扱えません。

```
Point p = new Point(1,2);
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
try {
    byte[] bytes = mapper.writeValueAsBytes(p);
    assertThat(bytes[0], is((byte)0x92));
    assertThat(bytes[1], is((byte)1));
    assertThat(bytes[2], is((byte)2));
    Point p1 = mapper.readValue(bytes, new TypeReference<Point>(){});
    assertThat(p1.getX(), is(1));
    assertThat(p1.getY(), is(2));
} catch (IOException e) {
    e.printStackTrace();
}
```

デシリアライズも簡単です。

```
byte[] a = new byte[]{(byte)0x92,1,2};
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
try {
    Point p = mapper.readValue(a, new TypeReference<Point>(){});
    assertThat(p.getX(), is(1));
    assertThat(p.getY(), is(2));
} catch (IOException e) {
    e.printStackTrace();
}
```
PHPの11年を振り返る

先日、PHP7がリリースされましたね。
使ってみたい機能があるなーと思いつつ、業務で使用できるのはいつになることやら。

この記事ではPHP、11年の歴史を振り返って見たいと思います。アドベントカレンダーの締め切りに追われた手抜き記事ではないです。


# リリース

|バージョン|リリース日|リリース文|新機能|
|-----|-----|-----|-----|
|5.0|2004.7.13|http://news.php.net/php.announce/50|http://php.net/manual/ja/migration5.php|
|5.1|2005.11.24|http://php.net/releases/5_1_0.php|http://php.net/manual/ja/migration51.php|
|5.2|2006.11.2|http://php.net/releases/5_2_0.php|http://php.net/manual/ja/migration52.php|
|5.3|2009.6.30|http://php.net/releases/5_3_0.php|http://php.net/manual/ja/migration53.php|
|5.4|2012.3.1|http://php.net/releases/5_4_0.php|http://php.net/manual/ja/migration54.php|
|5.5|2013.6.20|http://php.net/releases/5_5_0.php|http://php.net/manual/ja/migration55.php|
|5.6|2014.8.28|http://php.net/releases/5_6_0.php|http://php.net/manual/ja/migration56.php|
|7|2015.12.3|http://php.net/releases/7_0_0.php|http://php.net/manual/ja/migration70.php|


# 主な変更点

主観です。

## 5.0

- ZendEngine2が組み込まれ、オブジェクトモデルが強化された
- SQLiteがバンドルされた
- SimpleXMLが追加された

## 5.1

- 日付関係のコードが書き直され、タイムゾーンサポートが改善された
- パフォーマンスが大幅に向上
- PDOがデフォルトで有効になった

## 5.2

- メモリ管理が改善された
- Filter、JSON、Zipモジュールの追加
- Datetimeクラス追加

## 5.3

- [名前空間](http://php.net/manual/ja/language.namespaces.php)追加
- [遅延静的束縛](http://php.net/manual/ja/language.oop5.late-static-bindings.php)追加
- [無名関数](http://php.net/manual/ja/functions.anonymous.php)追加
- [goto](http://php.net/manual/ja/control-structures.goto.php)追加
- [Nowdoc](http://php.net/manual/ja/language.types.string.php#language.types.string.syntax.nowdoc)追加
- 三項演算子 の短縮形式 `?:` 追加
- 例外がネスト可能になった


## 5.4

- パフォーマンスが改善された
- [トレイト](http://php.net/manual/ja/language.oop5.traits.php)追加
- 配列の短縮構文が追加された `$a = [1, 2, 3, 4];`
- 関数の返り値を配列として扱えるよになった `foo()[0]`
- ビルトインWEBサーバーが組み込まれた
- `<?=` が常に有効になった
- タイプヒンティングの追加


## 5.5

- [ジェネレータ](http://php.net/manual/ja/language.generators.php)追加
- finallyキーワード追加
- [password_hash()](http://php.net/manual/ja/function.password-hash.php)追加
- [OPcache](http://php.net/manual/ja/book.opcache.php)モジュール追加

## 5.6

- 定数やプロパティの宣言、関数のデフォルト引数などで式が使用可能になった
- [...](http://php.net/manual/ja/migration56.new-features.php#migration56.new-features.variadics)演算子の追加
- 累乗演算子 `**` の追加
- `use function` および `use const` で関数や定数もインポートできるようになった
- [phpdbg](http://phpdbg.com/docs)追加


## 7

- 5.6と比較して2倍高速
- メモリ使用量の削減
- 抽象構文木の追加
- エラーを例外扱いにできるように
- 無名クラスの追加
- 引数のスカラー型宣言が可能に
- 戻り値の型宣言が可能に
- Null合体演算子 `??` 追加
- 宇宙船演算子 `<=>` 追加
- [Closure::call()](http://php.net/manual/ja/closure.call.php) 追加
El Capitanでtherubyracerとlibv8のインストールに失敗した場合


El CapitanでRailsの環境構築をしていた時、therubyracerとlibv8のインストールで転けた時のメモです。

色々なエラーが出て色々試しましたが、最終的に以下の方法で解決できました。

### 1. 入ってるgemを確認

以下のコマンドで、therubyracerとlibv8が入っているか確認できます。

```bash
$ gem list v8

*** LOCAL GEMS ***

libv8 (3.16.14.13, 3.16.14.7, 3.3.10.4)
```

```bash
$ gem list therubyracer

*** LOCAL GEMS ***

```

therubyracerは入っていないけど、libv8は色々入っていました。

例えばこの状態で、

```bash
$ gem install therubyracer
```

とか

```bash
$ gem install therubyracer -v '0.12.2' -- --with-v8-dir
```

やっても、therubyracerとlibv8のバージョンの違いのために、上手く行かないことが多いです。

### 2. 変なバージョンのlibv8をuninstallする

以下のコマンドで、uninstallするバージョンのリストが出てくる。

```bash
$ gem uninstall libv8

Select gem to uninstall:
 1. libv8-3.3.10.4
 2. libv8-3.16.14.7
 3. libv8-3.16.14.13
 4. All versions
```

とりあえず全部uninstallしておく。

```bash
> 4
```

### 3. therubyracerとlibv8を同時にインストール

`--with-v8-dir`というオプションを付けることで、同時にインストールされる。

```bash
$ gem install therubyracer -v '0.12.2' -- --with-v8-dir
```

これでエラーなく成功。

確認すると、ちゃんと欲しいバージョンのtherubyracerが入っている。

```bash
$ gem list therubyracer

*** LOCAL GEMS ***

therubyracer (0.12.2)
```
なんか作って、どうにか公開したい…そこで、Google drive hosted とは何か をまとめてみた


#Googledrive hosted とは、#

webページやサイトなどをアップロードする作業をシンプルにしてくれるものなのですが、まず、基本的な従来の方法から軽くおさらいして説明していこうと思います。

＊注　Googledrive hostedのサービスは**2016年8月31日までの期間限定**となっています。
＊注　MySQLなどのデータベースや、PHPなどのプログラムは動作しません。そのためWordpressなどのCMSも使うことはできませんが、**HTMLやCSSだけで作られるものならOKです。**

***


まず、0からwebサイトやコンテンツを立ち上げる為には**Webサーバ**を選ぶ必要があります。
制作したコンテンツは、公開の場であるWebサーバへアップして初めて
webサイトとなります。
また同時に、そのサイトの**ドメイン名**（http://ドメイン名/)も必要になるので取得しなければなりません。ドメイン名は、このブログでいえば、
qiita.comの部分です。

***

###サーバについて###

サーバは大きくわけて３つに分類できます。
小規模な事業者の場合はレンタルサーバがお勧めかと思います。

1.**ISP**(Internet Service Provider)のホームページサービスの利用

ドメイン名は、www.プロバイダのサーバ名.jpになります。
低価格ですが、独自ドメインが使えないので、信憑性に欠けると判断される場合があり、使用できるプログラムに制限があります。



2.**レンタルサーバの利用**

レンタルサーバがサーバの整理と管理をしてくれます。
独自ドメインが利用可能で、コストパフォーマンスが良いです。
以下の２種類があります。

・ホスティングサービス：一台のサーバ内のハードディスクを複数の会社で分け合うもの。
・ハウジングサービス：一台のサーバを一社で使えるもの

3.**自社サーバを利用する**

そのまま、自社にサーバを設置することです。
メリットは自由度が高く、臨機応変に対応できることですが、
デメリットとしてサーバの保守管理を自前で行うのは大変なので、技術的なスキル、サーバの購入費用、人件費などコストがかさむところです。



###ドメイン名について###
ドメイン名は早いもの勝ちです。従って使えるかどうか事前にチェックが必要となります。
ドメインの取得方法は以下の４つがあります。


1. JPRSからの登録

2. ドメイン登録サービス

3. インターネット接続サービス（ADSLやFTTHの接続申込と同時に登録）

4. レンタルサーバサービス（レンタルサーバ契約と同時に登録）

ドメイン名は一般的に、希望名.xx.jpとなっています。
ここのjpというのは、JPドメインと言われ、日本国内居住者のみが取得できるもので、日本で事業をやるならこれを取得するのが一般的ですが、海外のドメインも国によっては取得可能です。
次にxxの部分ですが、これはcoだったりacだったりしますが、coは企業、acは教育機関を表します。
また、汎用JPというドメインもあり、これはxxの部分がなく、希望名.jpとなります。
日本レジストリサービス（JPRS）というドメイン管理会社による審査、取得条件をクリアしたのちに登録できるドメインなので、信頼度が非常に高いです。

***

以上の流れを踏まえてwebサイトをアップロードしていくのですが、

**なんのこっちゃわからん。**

という方向けのサービスが**Googledrive hosted** です。
サーバや煩わしい手続きをスキップして、webサイトをアップロードできます。

***

###どうやって？###

使い方、手順は簡単です。
先に羅列しておくと、

1.drive.google.com にアクセスします。

2.ファイルを選択します。

3.上部にある『共有』ボタンをクリックします。

4.共有ボックスの右下にある『詳細設定』をクリックします。

5.『変更』をクリックします。

6.『オン-ウェブ上で一般公開』>『保存』をクリックします。

7.共有ボックスを閉じる前に『共有するリンク』の下の欄のURLからドキュメントIDをコピーします。ドキュメントIDとはURL内のスラッシュで挟まれた大文字、小文字、数字から成る文字列です。

8.「www.googledrive.com/host/『ドキュメントID』」の形式の URL を共有します。これでウェブページが一般公開され、誰でも閲覧できるようになります。

といった感じなのですが、もう少しわかりやすく説明すると、





![alt](http://mag.torumade.nu/wp-content/uploads/2013/02/130208-0001.png)
まず、web公開用のフォルダを作成します。慣例的に「public_html」としていますが、なんでもいいです。
作成したらそれを『共有』にします。


![alt](http://mag.torumade.nu/wp-content/uploads/2013/02/130208-0002.png)


共有対象の設定を促されますので『ウェブ上で一般公開』をチェックします。
これで、このフォルダに入れられたファイルはウェブからアクセスできるようになります。


![alt](http://mag.torumade.nu/wp-content/uploads/2013/02/130208-0003.png)

公開するHTMLやCSS、JavaScriptなどをアップロードします。
もちろんjpegなどの画像ファイルも大丈夫です。
アップロードは複数ファイルをまとめて処理することができますが、フォルダ単位はできません。

![alt](http://mag.torumade.nu/wp-content/uploads/2013/02/130208-0007.png)


すべてのアップロードが終わったら、index.htmlをクリックしてソースを表示させます。
プレビューをクリックすると、そのページが表示されます。
表示されたときのURLが公開URLになります。
＊手順7.8参考

これでGoogle Docsと連動させて更新・管理を行うこともできます。


以上になりますので、みなさんも期間内に試してみてはいかがでしょうか。
Swift API Design Guidelinesを翻訳してみた(Fundamentals)

# Swift API Design Guidelinesを翻訳してみた(Fundamentals)


## Fundamentals - 基本

* **Clarity at the point of use** is your most important goal. Code is read far more than it is written.

    使うときの明瞭さは、最も重要な目標です。
    コードは書くことよりも読まれることの方が遥かに多いです。  

    ----
    
* **Clarity is more important than brevity**. Although Swift code can be compact, it is a non-goal to enable the smallest possible code with the fewest characters. Brevity in Swift code, where it occurs, is a side-effect of the strong type system and features that naturally reduce boilerplate.

    明瞭さは簡潔さよりも重要です。Swiftではコードをコンパクトにすることもできますが、可能な限り短いコードで動作させるというのは目的ではありません。Swiftにおけるコードの簡潔さは、強力な型システムと、ボイラープレートコードが少なくなるという特徴の副産物として生まれます。

    ----

* **Write a Documentation Comment** for every method or property in Swift’s dialect of Markdown. Ideally, the API’s meaning can be understood from its signature and its one- or two-sentence summary:

    全てのメソッドやプロパティについてドキュメンテーションコメントをSwift用のMarkdownで書きましょう。APIの意味は、そのシグニチャと１文か２文の要約によって理解できるのが理想的です。

    ```swift
    /// Returns the first index where `element` appears in `self`, 
    /// or `nil` if `element` is not found. 
    /// 
    /// - Complexity: O(`self.count`). 
    public func indexOf(element: Generator.Element) -> Index? {
    ```

    ----

* Insights gained by writing documentation can have such a profound impact on your API’s design that it’s a good idea to do it early on.

    ドキュメントを書くことを早い段階で行うのは良いアイデアです。ドキュメントを書くことによって得られる深い理解は、APIの設計にとても大きな影響を与える可能性があります。

    ----

* If you are having trouble describing your API’s functionality in simple terms, **you may have designed the wrong API**.

    簡単な言葉でAPIの機能を表現することが困難な場合は、間違ったAPIを設計している場合があります。

# 関連

* [Swift API Design Guidelinesを翻訳してみた(Naming)](http://qiita.com/__moai/items/fbe87b343b9eaa48816e)
* [Swift API Design Guidelinesを翻訳してみた(Conventions)](http://qiita.com/__moai/items/1cde0971c0f889a06439)
Gem Fogを利用したS3の操作覚書


## 概要
![aaa](https://camo.githubusercontent.com/23dacb14a36e19ef77f608bfc4bd5477083afd4c/687474703a2f2f6765656d75732e73332e616d617a6f6e6177732e636f6d2f666f672e706e67)

Fogを利用してS3上のコネクション/ディレクトリ検索/ディレクトリ削除を行う
https://github.com/fog/fog

## 基本環境
* Ruby on Rails 4.2
* Fog(latest)

## S3上のバケットとコネクションをはる

```
connection = Fog::Storage.new(
    provider:              'AWS',
    aws_access_key_id:     Your_aws_key,
    aws_secret_access_key: Your_aws_secret,
    region:                Your_aws_region
)
bucket = connection.directories.get('Your_s3_bucket')

```

## s3内のディレクトリを検索
S3内は階層がないのでvalue検索をして取得を行う
http://dev.classmethod.jp/cloud/aws/amazon-s3-folders/

```
# tmp内のファイルを取得
# http://www.rubydoc.info/gems/fog/Fog%2FStorage%2FRackspace%2FFiles%3Aprefix
bucket.files.prefix = "tmp"


# ディレクトリ内で3日以前に作成されたファイルを取得
directories = []
bucket.files.all.each do |file|
  unless file.last_modified.to_date > 3.days.ago.to_date
    obj = file.key.match %r{tmp/[^ ]*/}
    directories << obj[0]
  end
end
```

##　ファイルの削除
```
# 他にもdestroy方法色々:http://fog.io/about/getting_started.html
bucket.files.destroy
```

## 参考
The Ruby cloud services library
http://fog.io/about/getting_started.html
nginxでルーティングを間違えて502エラーが返ってきた時の対処

ログを見ると以下のようなエラーが返ってきてました。

```
502 Bad Gateway Error Nginx connect() to unix:/tmp/unicorn.sock failed
```

## 環境
- Ruby on Rails4.2.x
- unicorn
- nginx

## 解決
*.confファイルのunicorn.sockのパスの位置を確認しましょう。

```
upstream unicorn_server {
  server unix:/var/www/#{application}/current/tmp/unicorn.sock
  fail_timeout=0;
}

server {
  listen 80;
  server_name sever_name;

  keepalive_timeout 5;

  root /var/www/#{application}/current/public;
  access_log /var/log/nginx/#{application}_access.log;
  error_log /var/log/nginx/#{application}_error.log;

  error_page 500 502 503 504 /500.html;

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn_server;
  }

 # location ~ ^/assets/ {
 #   root /var/www/#{application}/current/public;
 # }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/#{application}/current/public;
  }
}
```
TensorFlowを理解するための基礎情報共有（１）

１ヶ月ほど前にGoogleから公開されたTensorFlowですが、TensorFlow.orgのチュートリアルをひととおり試してみたものの、その本質的理解がなかなか進まずに自分独自の利用に歩みが進まないケースが散見されます。私も現在学習中なのですが、自分が前に進むうえで理解の整理に役に立ったことを共有します。「そんなことは知っている」という方もいらっしゃるとは思いますがご容赦ください。

TensorFlowの最初の利用方法紹介である「GET STARTED」では「y = 0.1 x + 0.3」という数式を使って生成したxとyを学習データとして、y = W x + b という数式のWとbを最適化していく事例が掲載されています（下記URL）。

　https://www.tensorflow.org/versions/master/get_started/index.html

この事例はx, y, W, bという登場する値がすべてスカラー量なので概ね容易に理解できるのですが、このあとの事例で「ベクトル」「テンソル」という概念が出てくると少し混乱してきます。これは「ベクトル」は高校数学で登場するものの、「テンソル」といわれると理系の大学数学領域なので身構えてしまう方もいるようです。そこで、非常にざっくりとですが、「スカラー」「ベクトル」「テンソル」の違いを私たちの身の回りでの実例を使ってお話しします。

三次元空間に座標軸を取って、その上に1cm x 1cm x 1cmの消しゴムをおいたとします。つまり、消しゴムの中のゴム粒が三次元の座標を使って(x, y, z)=(0, 0.1, 0.5)のように位置が特定できる状態です。この消しゴムを上から「むにゅむにゅ」と指で押したり指を離したり繰り返したとします。ある瞬間で時間を止めたとします。消しゴムの中のあるゴム粒に着目すると、ゴム粒の大きさは「直径２ミリ」のように単一の数値で表せます。これがスカラーです。続いて、「むにゅむにゅ」により消しゴム全体はひしゃげているので消しゴム内ではそのゴム粒は上下に動こうとして速度を持っているはずです。速度はx方向とy方向それぞれの成分で表せる２次元のベクトルであり、そのゴム粒が持つ動くときの速度が「ベクトル」です。ゴム粒が決まれば速度が決まります。さて、ではこの場合の「テンソル」とは何か？消しゴムが上から指で押されているとき、内部のゴム粒にも力が伝わります。指が消しゴムを押すのと同じ方向には「圧縮」の力が働いているでしょう。しかし、指が押す向きと垂直な方向（消しゴムがむにゅっと広がってひしゃげて出っ張っている方向）には「膨張」の力がかかっているでしょう。このように、着目する方向or断面は３次元空間内での矢印の向きに呼応する３次元のベクトルであり、単一のゴム粒について着目する方向or断面をかえたときにそのベクトル（この場合はかかる力）が変化するものを「テンソル」といいます。表現する情報の要素数（次元）はそれぞれ異なるものの、これらは行列をつかって表現できます

TensorFlowでの機械学習では、コンピュータに学習させる情報を、各項目をひとつひとつの次元として扱います。すると、上記で述べたスカラーやベクトルやテンソルのように行列で表現できるのです。実際にはスカラーもベクトルもテンソルも次元が異なるだけで本質的には行列で表現できる仲間なので、総称してこれらを「テンソル」と呼びます。これがグーグルのMachine Learningに「TensorFlow」という名前が付いている背景と考えられます。

　続編はこちらへ　http://qiita.com/MATS_ELB/items/fec7f54de2dd18b043ae
【jQuery】iOS Safariでも、ボタンをサクサク動作＋ついでに長押し検知

## ボタンをサクサク動かしたい...!
iOS Safariでタップのイベントを取得しようとして、かなりハマりました。
どこで嵌ったかというと、ボタンを連打させたいのに、
onClickやonTapイベントをlistenしていたのでは、あまりに動作が遅い。。。。

タップ後にページ遷移するならいいんですが、
連打なんかで次々処理を進めたい時には、
ちょっと耐えられないレベルです。

## 原因
コードに無駄があって重いのかと最初は思いましたが、
どうやらそうではなくて、ダブルタップかどうかの判別のために、
あえてタップの認識を遅延させているんですね。
https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html

でも、viewportなんかでページを拡大させないようにしているなら、
ダブルタップの認識はむしろ邪魔ですね。。。

## 対策
では、どうするか。
調べて見ると、
イベントの中でもtouchstart（タップ開始）やtouchend（タップ終了）は、
即、認識できる模様。

そんなわけで、ブラウザのダブルタップはいっそ無視して、
touchstartイベントとtouchendを見て、即時に処理を実行させちゃいます。

コードとしては、下記のような形になります。

```js
$(function() {
  var touched = false;
  $("#button").bind({
    'touchstart mousedown': function(e) { // PCにも対応させるなら、touchstartではなくmousedown
      touched = true;
      e.preventDefault(); // このイベントに紐つく動作をキャンセル
    },
    'touchend mouseup': function(e) {
      if (touched) {
        // なんか処理
      }
      touched = false;
      e.preventDefault();
    }
  });
});

```

これだけで、連打でもモタつかないくらい、タップがサクサクになります。

## ついでに長押し（ロングタップ）も検知する

touchstartとtouchendのイベントを利用するということは、
touchstartから何秒たったか、確認することができる、ということです。
つまり、長押しも検知できる、ということになります。
そんなわけで、上のコードにさらに手を加えて、長押しにも対応させてみました。

```js
$(function() {
  var touched = false;
  var touch_time = 0;
  $("#button").bind({
    'touchstart mousedown': function(e) {
      touched = true;
      touch_time = 0;
      document.interval = setInterval(function(){
        touch_time += 100;
        if (touch_time == 1000) {
          // ロングタップ(タップから約1秒)時の処理
        }
      }, 100)
      e.preventDefault();
    },
    'touchend mouseup mouseout': function(e) { // マウスが領域外に出たかどうかも拾うと、より自然
      if (touched) {
        if (touch_time < 1000 ) {
          // 短いタップでの処理
        }
      }
      touched = false;
      clearInterval(document.interval);
      e.preventDefault();
    }
  });
});

```

ここから少しいじるだけでも、ほとんどのタップのパターンに対応できるはずです。
bitvisor.elf を objdump したらなんかおかしい時の対策

# どうしてobjdump するの?
BitVisor で何か開発するときに，たまにバイナリファイルを逆アセンブルして，その結果を見たい時がある．
例えば，MMIO領域にあるレジスタの値が変わるまでwhileループで待つ，なんて処理はgccの最適化の餌食になりやすいので，こういう処理がちゃんとバイナリとして出力されてるかを確認したくなるときがある．

# objdumpt すると...
上記の訳で，BitVisor を64bit マシン向けにビルドして，そのelfファイルをobjdump したりするのだが，なんだか妙なアセンブラが出力される．

例えば`objdump -S bitvisor.elf` とすると，こんな感じものが混じってる．

```
$ 
                        printf ("%c", str[i]);
40153eab:       48                      dec    %eax
40153eac:       63 c3                   arpl   %ax,%bx
40153eae:       41                      inc    %ecx
40153eaf:       0f be 34 04             movsbl (%esp,%eax,1),%esi
40153eb3:       bf c3 f0 15 40          mov    $0x4015f0c3,%edi
40153eb8:       b8 00 00 00 00          mov    $0x0,%eax
40153ebd:       e8 05 2d fd ff          call   40126bc7 <printf>

```

`arpl` あたりがどうもおかしい．


# なぜなぜどうして?

https://ja.wikipedia.org/wiki/X64 曰く

**64ビットモードで再割り当てされたx86命令**

- ARPL (Adjust Requestor Privilege Level)命令は、64ビットモードでは、新しいMOVSXD命令になった。
- 1バイトのINC, DEC命令は、64ビットモードでは、REXプリフィックスになった。一方、2バイトのINC, DEC命令は、64ビットモードでも使用可能である。
- 64ビットモードで廃止されたLDS, LES命令は、のちにインテルによってAVX命令のVEXプリフィックスとして割り当てられた。VEXプリフィックスに続く2バイト目を32ビットモードでは未定義であった11xxxxxxという形式にすることにより、AVX命令は32ビットモードでも使用可能である。

( https://ja.wikipedia.org/wiki/X64  から引用)

とのこと．

どうも，バイナリファイルの情報が間違っているらしく，x86 32bit のアセンブラで解釈しているらしい．

# ちゃんとしたアセンブラ見たい時はどうするの?

~~解決するには，Makefile のFORMATをいじればよい．~~

(2015/12/09 16:05(UTC+2:00)頃 hdk_2　様からのコメントの内容を反映)
解決するには，objdump に` -m i386:x86-64` というオプションを付ければよいらしい．

` objdump -m i386:x86-64 -S bitvisor.elf ` とすると，先ほどの箇所は以下のようになる．

```
                        printf ("%c", str[i]);
40153eab:       48 63 c3                movslq %ebx,%rax
40153eae:       41 0f be 34 04          movsbl (%r12,%rax,1),%esi
40153eb3:       bf c3 f0 15 40          mov    $0x4015f0c3,%edi
40153eb8:       b8 00 00 00 00          mov    $0x0,%eax
40153ebd:       e8 05 2d fd ff          callq  40126bc7 <printf>
```
matlab関数フィッティング (正弦波フィット)

optimization toolbox でも フィッティングができる．
今回はlsqnonlinを使う．


まずフィッティングするデータを用意する．

```matlab
x = pi*(0:30:360)/180;
y = 2*rand(1)*sin(x-randn(1)*pi+pi/2)+0.2;
yraw = y+0.17*randn(size(x)); % 正規乱数を足す．このデータにフィッティングする．
```

関数ハンドルを用意してフィッティングする．パラメータは位相，ベースラインと波の大きさ．

```matlab
sinfunc = @(v, x) (v(1)*sin(x-v(2))+v(3)); % 関数ハンドル

%フィッテイングの際の初期値
vinit(1) = max(y)+mean(y);
vinit(2) = 0;
vinit(3) = max(y);

% フィッティングアルゴリズムなどのオプション
options = optimoptions('lsqnonlin', 'MaxIter', 10000,...
	'Algorithm', 'trust-region-reflective', 'Tolx', 10^-15, 'TolFun', 10^-15,...
	'ScaleProblem', 'none', 'MaxFunEvals', length(x)*200, 'Display', 'off');

% 変数の上限と下限
ub = [vinit(1)*2, 2*pi, vinit(1)];
lb = [0, 0, min(y)];
	
% 最適化する関数
efunc = @(v) abs((sinfunc(v,x) - y));

% 正弦波フィットの場合は位相の初期値を色々試す方が良い 
% (y の最大値をから初期値をもとめても良い)
initphz = [0:30:360]*pi/180;
for i = 1:length(initphz)
	vinit(2) = initphz(i);
	[params{i}, f(i), flag{i}, lamb{i}] = ...
      lsqnonlin(efunc, vinit, lb, ub,options);	
end
[~, o] = min(f); 
optparam = params{o};
```

プロットしてみる．

```matlab
figure; hold on
xopt = 0:0.1:2*pi;
plot(x,yraw,'d')
plot(xopt, sinfunc(optparam, xopt), 'k-')
plot(x, y, 'r-ーo')
```
![sinFit.png](https://qiita-image-store.s3.amazonaws.com/0/28835/cc4e12dc-ca40-e712-6f69-319ffa965901.png)

青がフィッティングに使ったデータで赤丸がノイズを足す前．黒線はフィッティングの結果である．
良い感じ．

基本的な流れは，
 - フィッティングに使う関数を用意
 - 初期値と上限値を考える
 - 初期値が難しい場所は色々値を変えてみる
 - 一番良かったパラメータを採用

である．

パラメータが多かったり初期値がまずいと収束に時間がかかるので parfor なんかを使ったほうが良い．
aws-sdk-ruby v2で非同期リクエスト送りたい(サポートされていません)

v2はこんなかんじで`SeaHorse::Client::Request`取り出せるけど そこから `send_request` するしかなくてどうしようもなかった。

```
  dynamodb = Aws::DynamoDB::Client.new(config)
  req = dynamodb.build_request :query, params
  resp = req.send_request()
```
    
v1だとできる。 [aws-sdk-rubyでバックエンドに非同期リクエストする - Qiita](http://qiita.com/arukoh@github/items/edba51ea390ab54d565e)
CS-Cart: コアの挙動を変える4つの方法まとめ

CS-Cartは接合部がいろいろあるので、知っておくと拡張するときに便利。

## 1. プレコントローラ・ポストコントローラ

特定のコントローラの前後に、自前の処理を加えたい時。

[Pre- and Post- コントローラー · CS-Cart開発者ドキュメント](http://docs.cs-cart.jp/docs/pre-and-post-controllers)

## 2. PHPフック

コントローラの処理途中で追加処理をしたいときなど。

[PHPフック · CS-Cart開発者ドキュメント](http://docs.cs-cart.jp/docs/php-hooks)

## 3. テンプレートフック

フックポイントを提供しているテンプレートに表示を付け足すときに使える。

[テンプレートフック · CS-Cart開発者ドキュメント](http://docs.cs-cart.jp/docs/tpl-hooks)

## 4. テンプレートのオーバーライド

テンプレートをまるごと上書きしたいとき。

[CS-Cart: Add-onでコアのテンプレートを上書き(override)する - Qiita](http://qiita.com/suin/items/042fbc0c56b2a5b28303)

## フックポイントの探し方

[Hooks base](http://www.cs-cart.com/api)で検索できるが、あんまり参考にならない。まず変更したい処理のテンプレートを見つけて、そこからコントローラを見つけて、その付近を`fn_set_hook`でgrepするほうが探しやすい…。