OmniAICreator/Qiita-1.07M huggingface dataset:
HHKB pro JPからErgoDoxへの移行をした


## この記事に書いたこと

* ErgoDox導入の目的
* 購入から配送
* キーマップの設定
* 思案中の内容


## 目的

* 肩こりの改善
   * 肩こりのために、マッサージ等へお金をジャブジャブ捨てているので、そのお金が少しでも減るならということで導入を決定
* 知ったきっかけはもちろんこの対談
	* http://www.oreilly.co.jp/community/blog/2016/02/helthy-programmers-talk-training-part1.html
* 導入前の懸念点は主に次の点
	* JISキーボード使いに使いこなせるのか
	* 肩こりが本当に改善されるか
* ErgoDox EzかFalbaTechか
	* [この記事](https://blog.kksg.net/posts/ergodox)を見て、FalbaTechに決定（かっこいい）

## 購入から配送まで

* いろんな記事を見ながら、FalbaTechとPimpmykeyboard.comで購入することにした
* FalbaTech
	* 注文: 2016/07/01
	* 到着: 2016/07/14
	* 約2週間でした
* Pimpmykeyboard
	* 注文: 2016/07/01
	* 到着: 2016/07/11くらい
	* こっちの方がちょっと早い
* 組み立てはすごく簡単ではめるだけでした
	* これと
	  ![P_20160714_144614.jpg](https://qiita-image-store.s3.amazonaws.com/0/80151/05239fb1-c69a-1f22-3068-a31aefd39e02.jpeg "P_20160714_144614.jpg")

	* これを合わせて
	  ![P_20160714_144651.jpg](https://qiita-image-store.s3.amazonaws.com/0/80151/452b3d58-7b4f-3384-386b-18a1bea8cae6.jpeg "P_20160714_144651.jpg")

	* こんな感じ
	  ![P_20160714_145435.jpg](https://qiita-image-store.s3.amazonaws.com/0/80151/d92a2ac8-79fa-2dc4-682a-a3e3645fde73.jpeg "P_20160714_145435.jpg")


## キーマップの設定

次のようなことを考えながら、約1週間かけて少しずつ慣れてきている

* Macのアプリケーション内ウインドウ切り替え(Ctrl+F1)をどこかに割り当てたかった
* JIS配列のままでいたい(US配列にはしたくない)
* Functionキーは、HHKBと同様に、端っこのキーを押したままが慣れている
* 矢印キーがたまにほしくなるので、いったんLayer2のh,j,k,lに配置

キーマップは、諸先輩方を見習い、githubに配置した。

https://github.com/gakkie/qmk_firmware/blob/master/keyboards/ergodox_ez/keymaps/gakkie/keymap.c


## 思案中の内容

* ハイフン(-)と0をものすごくタイポする
* BackSpaceの位置が慣れないのは、Ctrl+hでごまかしている
	* ExcelとかLINEとかでCtrl+hの相性がよくないので、Backspaceに慣れた方がよさそう
* そろそろEnterを親指で押す癖ができてきたので、Macbookを直接触っているときに、「かな」キーを連打しているときがある
* キーボード自体を傾けたいので、その方法を検討中
* 肩こりはすでにだいぶマシになった感じがするが、もう少し使って様子を見たいところ

## 参考文献

いろんなところを参考にしたのでこれで全部ではないですが何度も見たのはこの辺

* [ErgoDoxのキーマップをいじる時に見るチートシート](http://qiita.com/ReSTARTR/items/970354940f49c67fb9fd)
* [ErgoDox EZのキーマップを変更する](http://qiita.com/ReSTARTR/items/f84f8f3c4c51c876cb2f)
* [[ErgoDox Ez]一例としてのHHKBに慣れ親しんだ人間のkeymap.c](http://qiita.com/ngsw/items/b86ba0e305bd1dbbcf8f)
* [日本語配列でバリバリにErgoDox EZを使う](http://qiita.com/shuh/items/b94215d3b946d3ded0fe)
ASUS端末でAlarmManager通知が届いていなかった話

ASUS端末には
「自動起動マネージャー」
という名前のアプリがデフォルトでインストールされています

これは、バッテリー節約を目的として
アプリのバックグラウンドからの自動起動を許可するかどうか設定できるのですが
困ったことに、デフォルトで多くのアプリの自動起動が【無効】にされています（ナ、ナンダッテー！）

ですからいくら待っても AlarmManager の通知は届きません

アプリの自動起動を許可してやりましょう。
そして改めてあなたの作っているアプリをプレイし、通知を投げてやってください。
きっと通知欄にあなたのアプリの通知が大量に届いているのを目にすることになるでしょう:-)
JetBrains製品のライセンス


2015年11月よりサブスクリプション形式のライセンスに変更されましたが、同時に単一ライセンスによる複数マシンでの利用が緩和されていました。

[Using IDE on different machines and operating systems with the same license](https://intellij-support.jetbrains.com/hc/en-us/articles/207241005-Using-IDE-on-different-machines-and-operating-systems-with-the-same-license)
> UPDATE: since the new subscription model started November 2015, you can also run multiple personal licensed copies at the same time (like on laptop and desktop for remote debugging client/server apps).


意訳：

> アップデート: 2015年11月からのサブスクリプションモデル導入に伴って、パーソナルライセンスの複数コピー同時起動が可能になりました (例えば、クライアント・サーバアプリをラップトップとデスクトップで同時にリモートデバッグを行うなど)

これまで IntelliJ IDEA を始めとする JetBrains 製の IDE を起動した際には LAN 上でライセンスチェックが行われ、同一 LAN 上では同じライセンスで起動できるアプリケーションプロセスは一つだけでした。

例えば、同一 LAN 上で複数の IntelliJ IDEA 14 を起動させると、一方にダイアログ

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/35c2d4f9-26c5-7eaa-bd3c-0238c6d2b3a0.png" width="300" />

が表示されて、利用できなくなります（インストール自体は可能で、同時に起動するのでなければ、複数マシンでも利用できました。前述のサポートページでもそのように記述されています）。

それが ver 2016 から撤廃されたようで、LAN 上の複数マシンで起動してもダイアログは出なくなりました[^1]。

[^1]: たまたま複数マシンで起動させた時にダイアログが表示されなかったので、調べてみたら、前述のページで確認できた。
jQueryの.animate()と.fadeIn()を同時に動かしたい時


フェードインしながらちょっと下に移動して欲しい時に、
フェードインが終わってから下に動いちゃって困った。

そこで


```JavaScript
$(function() {
 $('.item_gnavi').on('mouseenter', function() {
    $(this).find('.contents').fadeIn(400).animate({
      'top': '70px'
    },{
      duration: 500,
      queue: false //←★ココがqueue
    });
  });
});
```

[デモページ](http://jsdo.it/sararilfy/ENW5)

オプション指定として、queueをfalseに設定すると（初期値はtrue）、
キューに追加せずに即座に実行してくれる。
上記はanimateで設定したが、fadeInの方でも設定可。


.animate()
http://api.jquery.com/animate/
wp-rest-apiとreact.jsを使って色々試してみた話し

どうもです。ヒロと申します。

今回はwp-rest-apiとreact.jsを使って色々試してみました。ついでにcss-modulesにも初トライしてみました。
[css-modulesについては別記事で](http://qiita.com/hirodeath/items/4cba852f4851717a9174)書きました。

今回作った物は[このgithubのリポジトリ](https://github.com/takahiro-saeki/react-wp-rest-api)に一式ありますので、良ければ覗いてみてください。

##今回のゴール
- wp-rest-apiの使い方をざっくり理解する
- デザインを簡略化する為にmaterial-uiを使用する

というわけで早速作った物をご紹介します！

##ブログサイトの記事をwp-rest-api経由で取得して表示する何かを作った
![react-wp-rest-api-1.png](https://qiita-image-store.s3.amazonaws.com/0/79274/7e03c2aa-8d3c-cfa6-18ff-02592aa0e5ef.png)

本当はwindow size 400pxくらいにして見て頂きたいですが、一応こんな感じのページを作りました。

##wp-rest-apiについて
まずはwp-rest-apiを使用する為に、記事を引っ張ってくる元のwordpressに以下のプラグインをインストールします。
- WordPress REST API (Version 2)

プラグインをインストールし、プラグインを有効化したらwordpress側の設定は完了です。

#wp-rest-apiの基本的な使い方について

```js:container/Main.jsx
import request from 'superagent';
const url = {
  req: 'http://ここにドメインを入れる/wp-json/wp/v2/posts'
}
...
receive() {
    request
    .get(url.req) //リクエストするurl
    .end((err, res) => {
      if(err) {
        console.log(err)
      } else {
        this.setState({
          body: res.body,
          loader: false
        })
      }
    });
  }
...
```

やることは凄くシンプル。`'http://ここにドメインを入れる/wp-json/wp/v2/posts'`これがリクエストするドメインのフォーマットになります。今回はsuperagentを使用していますが、ajaxでもfetch apiでaxiosで何でもOKです。

また`this.setState()`でレスポンスのbody内のデータを突っ込んで、処理しています。

##個別記事ページについて
記事一覧ページとやっていることは変わらないのですが、違いとしてはサムネイル画像を読み込んでいます。
サムネイル画像をwordpress側から引っ張ってくるには`http://mohu-para.com/wp-json/wp/v2/media`にリクエストしなければならず、果てさてどうした物か困り果てました。
今回はベーシックに
- 個別ページのドメイン`http://localhost:8080/9999`←ここの`9999`の部分が記事IDなのでそれを頼りにその記事のデータだけまず引っ張ってくる
- 次に引っ張って来たjsonの中にある`featured_media`(これはサムネイル画像のID)をリクエストURLに詰め込んでサムネイルの情報をリクエストする
- サムネイルの情報がレスポンスで返って来たらコンポーネントに反映する。

詳しくは`assets/container/Post.jsx`を見て頂ければと思います。

##全体を通しての感想
初めてwp-rest-apiをやってみようと思った時はなんだかやり方がよくわからず、モヤモヤしていましたが、今は[日本語のリファレンス](http://ja.wp-api.org/reference/)もあったり、色々な方が説明している記事を書いていたりで導入の敷居本当低くなったなぁと感じます。
今回は記事の作成や削除といった認証が必要な処理周りのやり方は扱いませんでしたが、その周りもドキュメント見た感じ敷居低そうな気がしました。

wordpressは1年と数ヶ月前までゴリゴリ書いてたりしましたが、PHPがあまり好きではないので正直あんまりwordpressは使いたくないと思っていました。しかし、wp-rest-apiの存在を知り実際に使ってみてまだまだwordpress良いじゃんと思った、、、というか大分フロントエンドフレンドリーになったんだなぁと感じました。

今後やってみたいこととしてはwp-rest-apiとreact-nativeを使って[AM](http://am-our.com/love/)や[mery](http://mery.jp/)みたいなアプリを作ってみたいなぁと思いました。

##参考資料
wp-rest-apiリファレンス
http://ja.wp-api.org/reference/
git logで日本語が表示されないときの直し方


hetemlのサーバーへsshでログインしてgit logを見た際に日本語が化けていました

git logのページャはlessで動いているらしい
lessがutf-8に対応してないと文字化けするようです

```
$ export LESSCHARSET=utf-8
```
を打てば解決
AnkoとData Bindingを同時に使えないので委譲プロパティを使ってなんとかする

# AnkoとData Bindingを同時に使えない

AnkoとData Bindingは同時に使うことができません。
DataBindingではXMLの名称から `~~Binding`という名称のクラス(仮にBindingクラスと呼ぶことにします)を自動的に生成してくれますが、Ankoでレイアウトを作成した場合にはBindingクラスを生成してくれません。

Data Bindingのように、Modelを変更したときにViewを更新してくれるようにしたいときにはどうすれば良いのでしょうか?
Data Bindingの完全な代替にはなりませんが、委譲プロパティを使用すればこのようなときに期待の動作をさせることができます。

# 委譲プロパティ

委譲プロパティ(Delegated Properties)を利用すると、あるプロパティにアクセスする際にログを出したりなどといった特定の処理を挟むことができます。

プロパティの後ろに `by ~` と書くことで 特定のオブジェクトに処理を委譲できます。
委譲先のクラスとして下記のようなクラスを作成します。

```kotlin
class Counter() : ReadWriteProperty<Any, Int> {
    private var mValue: Int? = null

    override fun getValue(thisRef: Any, property: KProperty<*>): Int {
        return mValue as Int
    }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: Int) {
        Log.d("mydebug", "${property.name}: $value")
        mValue = value
    }
}
```

下記のように`by Counter()`とすればcountへの代入時にCounterクラスのsetValue関数が呼ばれます。`Counter()`は単なるCounterクラスのコンストラクタです。

```kotlin
var count: Int by Counter()

// 省略

count = 1
count++
count = 10
```

```
count: 1
count: 2
count: 10
```

同じように、プロパティの値を取得するときにはgetValue関数が呼び出されます。

下のようにCounterクラスのコンストラクタに値や関数を渡すこともできます。

```kotlin
class Counter<T>(val function: (property: KProperty<*>, T) -> Unit) : ReadWriteProperty<Any, T> {
    private var mValue: T? = null

    override fun getValue(thisRef: Any, property: KProperty<*>): T {
        return mValue as T
    }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
        mValue = value
        function(property, value)
    }
}
```

```kotlin
var count: Int by Counter { property, value ->
    Log.d("mydebug", "${property.name}: $value")
}
```

# なんとかする

以下のように委譲プロパティを使えば、Modelを変更したときにViewを更新する一方向バインディングができます。

```kotlin:ViewBinder.kt
class ViewBinder<M>(val function: (M) -> Unit) : ReadWriteProperty<Any, M> {
    private var mValue: M? = null

    override fun getValue(thisRef: Any, property: KProperty<*>): M {
        return mValue as M
    }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: M) {
        if (mValue == value) {
            return
        }
        mValue = value
        function(value)
    }
}
```

```kotlin:MyActivityUI
class MyActivityUI() :AnkoComponent<MainActivity>() {

    var user: User? by ViewBinder {
        textView.text = user?.name

        // 省略
    }

    // 省略

}
```

***

参考記事
[ViewBinder for Android in Kotlin](https://medium.com/making-internets/viewbinder-for-android-in-kotlin-abbeae67fab3)
Railsの開発環境をvagrantで構築したので手順メモ

#0. 前提：バージョン
+ Ruby version 2.2.3
+ Rails version 4.2.1
+ MySQL 5.6.x
+ vagrant box bento/centos-6.7

#1.gitからcloneしてvagrant up

```
git clone git@github.com:agotoh/ruby_dev.git
vagrant up
```

以下ゲストOS側作業

#2. mysqlインストール
参考：　[http://www.lesstep.jp/step_on_board/mysql/368/](http://www.lesstep.jp/step_on_board/mysql/368/)

デフォルトでは5.1なので、5.6のrpmからインストール

```
sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum info mysql-community-server
rpm -qa | grep mysql
sudo yum -y install mysql-community-server
rpm -qa | grep mysql
sudo cp /etc/my.cnf /etc/my.cnf.org
sudo vi /etc/my.cnf
```

以下をmy.cnfに追加

```
[mysql]
default-character-set = utf8

[mysqld]
character-set-server = utf8
--
```

サービススタート& 接続確認

```
sudo service mysqld start
sudo chkconfig mysqld on
chkconfig --list mysqld
mysql -u root (接続できたらexitで抜ける）
```

追加：後の手順のbudle install時にmysql-develがないとエラーが出たので追加でインストール

```
sudo yum -y install mysql-devel
```


#3．nginxのインストール
```
sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
sudo yum -y install nginx
sudo service nginx start
sudo chkconfig nginx on
```

#4.rubyのインストール
参考：　[http://qiita.com/shinyashikis@github/items/3501c5f7f71a8e345c3d](http://qiita.com/shinyashikis@github/items/3501c5f7f71a8e345c3d)

## 4.1 関連パッケージのインストール

```
sudo yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel
```

## 4.2 gitのインストール

```
sudo yum install git
```

## 4.3 rbenvインストール

```
sudo chown -R vagrant /usr/local
git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
echo 'export RBENV_ROOT="/usr/local/rbenv"' >> ~/.bashrc
echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
rbenv --version
```

## 4.4 ruby-build インストール

```
git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```

## 4.5 rubyのインストール
v2.2.3をインストール

```
rbenv install -v 2.2.3
rbenv rehash
rbenv global 2.2.3
ruby -v
```

#5. Railsのインストール

```
gem update --system
gem install rails --version="4.2.1"
gem install bundler
rbenv rehash
rails -v
```

#6. DBの構築
##6.1 bundle install &DB初期化

```
cd /vagrant
bundle install
rake db:create
rake db:migrate
rake db:seed
```

##6.2 初期データのimport

```
mysql shikin -u root  < XXXX.sql
```

##6.3 hostsの追加
hostsファイルに`192.168.33.13 golf.dev`を追加


##6.4 接続確認

```
bundle exec rails s -b 0.0.0.0
```
http://golf.dev:3000

##6.5 ホストOS側からSQL接続可能とする。

```
mysql -u root
mysql> CREATE USER 'root'@'192.168.33.%';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.33.%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
```

ホストOS　SGLクライアントの接続情報は以下
ホスト: 192.168.33.13
ユーザ名: root
データベース: golf
ポート: 3306
c++ builder > TComboBoxとTColorBoxの継承過程の比較

```txt:動作確認
C++ Builder XE4
```

TComboBox型とTColorBox型が継承の過程でいずれかの型を含んでいないかの確認。

XE4のビルトインヘルプにて確認した。

### TComboBoxの継承

TPersistent > TComponent > TControl > TWinControl > TCustomListControl > TCustomCombo > TCustomComboBox > TComboBox

### TColorBoxの継承

TComponent > TControl > TWinControl > TCustomListControl > TCustomCombo > TCustomComboBox > TCustomColorBox > TColorBox

### 結果

いずれかの型を継承してはいなさそうだった。

継承されている場合は型チェック時に誤判断を誘発するのではという心配から確認した。

TCustomListControl などでチェックすると両方ひっかかるのかもしれない（未確認）。
Cargo.toml の編集に cargo-edit を使う

cargo-edit について cargo-edit の README.md をベースに簡単に日本語でまとめています。

※ 執筆時点の cargo-edit のバージョンは `cargo-edit-0.1.3` です。

cargo は Rust の強力なツールの一つで、パッケージの取得、ビルドといった機能を持っています。
パッケージの追加や削除といった作業は Cargo.toml を編集して行えます。
管理するパッケージが増えるにつれ、依存解決やバージョンの変更などを行いたくなる場合、ファイルの編集というインターフェースはエディタで開くという手間もあり面倒に感じることが多くなるでしょう。
cargo-edit はそれを解決してくれるツールで、パッケージの追加・削除・確認を行うことができます。

cargo-edit:
[https://github.com/killercup/cargo-edit](https://github.com/killercup/cargo-edit)


## インストール

`cargo install` でインストールできます。 cargo はなるべく最新版を利用することが推奨されています。

``` sh
cargo install cargo-edit
```

## 使い方

cargo に以下のサブコマンドをサポートする形でインストールされます。

- `cargo add`
- `cargo list`
- `cargo rm`

各サブコマンドは cargo のサブコマンドと同様に `cargo add --help` のようにサブコマンドの後に `--help` を指定するとヘルプが出力されます。

### cargo add

`cargo add` は名前の通り、パッケージを追加します。

``` sh
# パッケージ名@バージョン でバージョンを指定する
$ cargo add regex@0.1.41
# バージョンが指定されない場合は最新のバージョン番号を crates.io から取得する
$ cargo add rand --build
# crates.io に存在しないパッケージを追加することもできる
$ mkdir -pv ./lib/trial-and-error
$ cd ./lib/trial-and-error
$ cargo init --name local_experiment
$ cd ../../
$ cargo add local_experiment --path=lib/trial-and-error/
```

Cargo.toml はこうなります。

``` toml
[package]
authors = ["kizkoh"]
name = "study"
version = "0.1.0"

[build-dependencies]
rand = "0.3.14"

[dependencies]
regex = "0.1.41"

[dependencies.local_experiment]
optional = false
path = "lib/trial-and-error/"
```

### cargo list

`cargo list` は依存パッケージの一覧を出力します。

``` sh
# cargo build しないと `Your Cargo.toml is missing.` が出力される
$ cargo build
# --tree オプションで依存木を出力できる
$ cargo list --tree
├── rand (0.3.14)
│   └── libc (0.2.14)
└── regex (0.1.73)
    ├── aho-corasick (0.5.2)
    │   └── memchr (0.1.11)
    │       └── libc (0.2.14)
    ├── memchr (0.1.11)
    │   └── libc (0.2.14)
    ├── regex-syntax (0.3.4)
    ├── thread_local (0.2.6)
    │   └── thread-id (2.0.0)
    │       ├── kernel32-sys (0.2.2)
    │       │   ├── winapi (0.2.8)
    │       │   └── winapi-build (0.1.1)
    │       └── libc (0.2.14)
    └── utf8-ranges (0.1.3)
```

### cargo rm

`cargo rm` は `cargo add` の逆の操作です。

``` sh
# regex の依存を削除する
$ cargo rm regex
# rand の依存を削除する
$ cargo rm rand --build
```

Cargo.toml はこうなります。

``` toml
[package]
authors = ["kizkoh"]
name = "study"
version = "0.1.0"

[dependencies]

[dependencies.local_experiment]
optional = false
path = "lib/trial-and-error/"
```

## まとめ
ターミナルは常にビルドやテストのため開いていると思います。
cargo-edit を使えばエディタで Cargo.toml を開くことなくコマンド一つでパッケージの追加・削除・確認を行うことができます。

また、記事中では例に取り上げませんでしたが `cargo add` で追加したパッケージはアルファベット順にソートされます。 rustfmt  を使ってコードはフォーマッティングできても Cargo.toml はフォーマットできません。見栄えを気にする際も便利なツールです。使わない理由はないですね!
fishshell で Enter 押したときに ls と git status を表示する

http://qiita.com/yuyuchu3333/items/e9af05670c95e2cc5b4d
こちらの fish 版です。

以下の conf では CTRL-j に割り当てています。

```fish.conf
function do_enter
  set -l query (commandline)

  if test -n $query
    echo
    eval $query
    commandline ''
  else
    echo
    ls
    if test (git rev-parse --is-inside-work-tree 2> /dev/null)
      echo
      echo -e "\e[0;33m--- git status ---\e[0m"
      git status -sb
    end
  end
  commandline -f repaint
end

function fish_user_key_bindings
  bind \cj do_enter
end
```

fish の version は 2.3.1 です。

fishshell は不慣れなのでもっといい書き方があるかもしれません。
不具合も含んでいるかもしれません。
PythonでNAIF SPICE TOOLKITを使う

#SPICE for Python
NAIFが提供するSPICE TOOLKITはSPICEカーネルから探査機の幾何学情報を計算するツールです。これまで、FORTRANやCで開発されてきましたが、ライプラリを使ってPythonから関数を読み出すことができるようです！

NAIFのHP
http://naif.jpl.nasa.gov/naif/

##SpiceyPyインストール
pythonのライプラリは以下にあります。
https://github.com/AndrewAnnex/SpiceyPy

```py
pip install spiceypy
```

でインストールできます。
簡単なドキュメントは[こちら](http://spiceypy.readthedocs.io/en/master/)

##テストプログラム

```py
import spiceypy as spice
spice.tkvrsn('TOOLKIT')
```

を実行すれば、バージョン名が出てくるはずです。
cspiceで(関数名)_cとなっている、のをspice.(関数名)とすれば基本的にOK。
入力変数などはcspiceと一緒です。

#SpiceyPyによる時刻変換
探査機Cassiniによる例。

```py
import numpy as np
import spiceypy as spice

#カーネルの読み込み
spice.furnsh('./spice/sclk/cas00084.tsc')
spice.furnsh('./spice/lsk/naif0009.tls')

utctim='2005-06-20T19:00:00'
#UTCからETへ変換
et_ex=spice.str2et(utctim)
print 'ET:',et_ex

ti_0='0x58C448C2'#16進数
ti=int(ti_0,16)
print "TI (10進数): ",ti
scid=-90 #探査機ID
#TIからETに変換
et= spice.sct2e(scid,ti)
#ETからUTCに変換
time=spice.et2utc(et,"ISOC",6)
print "UTC: ",time


```

###ヘルプを見るには

```
help(spice.str2et)
```

#メモ
ひっかかったことをメモ
##et2utcとetcal
et2utc
https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/FORTRAN/spicelib/et2utc.html
ETを入力するとUTCに変換してくれる関数。一方で、
etcal
https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/FORTRAN/spicelib/etcal.html
という関数は、ETを入力するとカレンダー時間に変換してくれる関数。

計算結果が違う！
何が違うのか？
etcalはうるう秒が考慮されておらず、どういうときに使うのか不明ですが、**一般的にはet2utcを使うのが良いみたいです。**
DLL呼び出し規約の罠

#はじめに
DLL関数の呼び出し規約は「`__stdcall`」か「`__cdecl`」のどちらかになるが
一般的には`__stdcall`で定義される事が多いようである。
少なくとも私は今まで`__cdecl`で定義されたDLLを見たことがない。
両者の違いは、スタック（引数、戻り値）の処理を
「exe側（呼び出す側）」がやるか「dll側（呼び出される側）」がやるか、だったと思う
（知らない、もっと詳しく知りたという人は各自ググってね）
この呼び出し規約、単一プロジェクトでは全く問題にならないのだが[^1]
DLL化すると、不整合を起こした場合とんでもない問題を引き起こす
例えば`__cdecl`で作られたDLLを`__stdcall`として呼び出すと、面白いようにバグる。
しかもコレ、システムが検知不可なので問題に気付きにくいというオマケ付きである。
（ローカル変数の値が突如書き換えられるとか、そんな感じの動作になる）
[^1]: コンパイラ自身が把握している、という意味で

#お作法
VisualStudioで開発する場合において、呼び出し規約を定義する方法は２つある。
1. 関数定義に「`__stdcall`」「`__cdecl`」等と明示する
2. プロジェクト設定から「規定の呼び出し規約」を変更する

結論から書くと、手法２は注意が必要である。出来れば避けたい。

##手法１について
恐らく殆どの参考書がこの方式を推奨しているし、誰だってそうする。
ソースコードにベタ書きするため、コンパイラオプションの設定に依存せず書いた通りに動く。
ただ、exportする関数全てに「`__stdcall`」だの「`WINAPI`」だの書くのは面倒だと感じる。
さらに付け足すと、記述の約束事で
`int __stdcall piyo();`と書くことになるが、これを並べ替えて
`__stdcall int piyo();`と書くとエラーを吐く、というのも面倒である
（よく使われる手法 `#define _EXPORT __declspec(dllexport)` で一緒に処理できない）

##手法２について
実際楽、プロジェクト内の全関数が一括で設定されるので漏れが発生しない。
（ローカル関数が\_\_stdcallだろうが\_\_cdeclだろうが大差ないし）

#起こりうる問題とは
手法2で作成した関数定義ヘッダーを、他のプロジェクトで読み込むと
呼び出し規約の不一致が発生する可能性がある。
Project\_A(DLL側)では、関数は「`__stdcall`」として認識されるが
Project\_B(EXE側)では、関数は「`__cdecl`」として認識される恐れがある
（プロジェクトの設定に依存する。なお、VisualStudioのデフォルト値は`__cdecl`である）
考えてみれば当然だが、実際に問題が起きるまでは意外と気付かないものである。

#言い訳
アプリはC#、処理はC++で書いてDLLにするという開発手法に慣れてると
意外と気付かないんですよ、C#の`[DllImport]`ってデフォルトで`__stdcall`扱いしてくれるし
そもそもexe側で`*.h`ファイル使わないし
（そして、たまにC++アプリを書く時に罠にハマる）

#まとめ
面倒でも、DLL関数は呼び出し規約を明示しましょう。
DynamoDBでgetItemの繰り返しはbatchGetItemにする

# 複数クエリは１つにまとめよう

ソーシャルサービスを運用しているですが、ユーザがコンテンツを作る、かつ見せ方は時系列ということでスケーラビリティを考慮してDynamoDBを使う選択をしました。
当初タイムライン形式でフォローしている人の投稿の表示とハッシュタグ検索するくらいの仕様だったんですが複数タグで検索したりとかコメントも検索対象にしたりなど検索を強化していきたいという声もあり今はElasticsearch＋DynamoDBにしています。

しばらく運用していたのですが、いかんせん検索のレスポンスがおっそい・・・ということで
調べたところ以下のような実装になっていました。

1. Elasticsearchから投稿ID列を取得
2. 1で取得した投稿ID分getItemを繰り返して投稿データを取得

2が遅い・・・20件取得しようとすると20回クエリ投げてる・・・これはいかん。

ということでgetItemではなくbatchGetItemでまとめて取得するように変更しました。

プログラムは下記のような感じです。

## 変更前
```ruby:sample.php
$db = AWS::get('DynamoDb');
$es = new Elasticsearch\Client($config);
$result = [];

$params = ['index' => 'feed',
           'fields' => ['_id'],
           'size'  => 20,
           'query' => ['query_string' => $query]
];

$feed_ids = $es->search($params);

# getItemで1件ずつ取得
foreach($feed_ids['hits'] as $feed_id){
    $result[] = $db->getItem([
            'TableName'      => 'feed',
            'Key'            => ['Id' => [ 'S' => $feed_id ]]]);
}

return $result;
```

## 変更後
```ruby:sample.php
$db = AWS::get('DynamoDb');
$es = new Elasticsearch\Client($config);
$result = [];

$params = ['index' => 'feed',
           'fields' => ['_id'],
           'size'  => 20,
           'query' => ['query_string' => $query]
];

$feed_ids = $es->search($params);

$params = [];
foreach($feed_ids['hits'] as $feed_id){
    $params[] = [
                'id' => ['S' => $feed_id]
    ];
}

# getItemでまとめて取得
$result = $db->batchGetItem([
              'RequestItems' => [
                  'feed' => [
                      'Keys' => $params
                 ]
              ]
          ]);

return $result;
```

# まとめ

batchGetItemでは1クエリでまとめて取得できない場合もあるので
「UnprocessedKeys」が返ってくるまで再帰的に取得するようにしていたりします。
レスポンス速度も大体1/6程度までになりました。
何回クエリ投げてんだって話ですね・・・ちゃんちゃん
Termuxでお手軽ポケットlinux開発環境(例えばnvim+golangが手元に)

![sample](https://termux.com/files/vim-main_framed.png)

<!-- 電池が長持ちなのにお安い(Freetelのアウトレットセールで¥14k)androidに変わりました。
移行のためにplay storeでインストール作業を進めていたらTermuxというのをリコメンドしてきました。  
試しに触ってみたらその日のうちに速攻bluetoothキーボードをポチりました -->



# [Termuxって](https://termux.com/)

簡単にいえばsandbox内でパッケージ管理ツールとTerminalを用意してくれるお手軽linux環境です。

androidのrootを取らなくても素のandroidにtermuxをインストールするだけで

golangとか
python3とか
nodejsとか
phpとか

```
➜  ~ go version
go version go1.7beta2 android/arm64
➜  ~ python3 --version
Python 3.5.2
➜  ~ node --version
v6.3.1
➜  ~ php --version
PHP 5.6.23 (cli) (built: Jul  1 2016 16:20:41)
```
neovimとか

```
$ nvim --version
NVIM 0.1.5-dev
```

git とか

```
$ git --version
git version 2.9.2
```

がインストールできます

```
$ apt update && apt install python python-dev golang gcc nodejs php  git neovim
```

以下のコマンドを使うとoh-my-zshを入れることも出来ました

```
$ sh -c "$(curl -fsSL https://raw.github.com/skeevy420/oh-my-zsh/skeevy420-termux/tools/install.sh)"
```

つまり**開発環境が手元に揃います**
golangも動くので(ただしgccも入れないとリンクエラーが出る？)
pecoも入りますし。

**勉強会に颯爽とAndroid端末とキーボードだけで乗り込んだらきっと注目の的です**

# ただし問題点も幾つか

## sandbox内での動作なのでPATHがヘンです

```
PATH=/data/data/com.termux/files/usr/bin
```

``/bin/sh``固定を期待するスクリプトとか動かすのがちょっと面倒です

## sshdも動くけどポートが8022

1024までのポートは使用禁止です。
sshdも常駐ではなく手元で起動する必要があります

### sshd使用手順

PCにAndroidをつなぐなりpushbulletを使うなり、
自分の公開鍵をandroidのどこかにコピーします(sdカードとか)

以下のようにAndroidの画面をいじって公開鍵を登録します

```
$ cat /path/to/id_rsa.pub > ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ sshd
```

後はネットワーク経由でpcからsshで入るだけです

```
❯ cat ~/.ssh/config                                                                                                                                                                                                                                                      Host 192.168.11.15 freetel(192.168.11.15)
  HostName 192.168.11.15
  IdentityFile ~/.ssh/id_rsa
  Port 8022
  ForwardAgent yes

❯ ssh 192.168.11.15 
```



## 常駐アプリ系はうごかせない？

apacheとかはパッケージに用意されていませんでした。
goでサーバアプリを書いたら動きましたが
androidを放置しているといつの間にか止まっていました。

* crontabは効かない

コマンドは用意されていますが反映はされないみたいです。

## fish シェルは動かない？

足りないパッケージがあるみたいで動かせますが不具合があるようでした

以上です。visualStudioCodeを使ってきましたが
これをきっかけにvimの勉強をまた始めたくなってきました。
consoleって本当にいいものですね。
OS X Safariでbeforeunloadがおかしい

OSX版のSafariバージョン 9.1.2（これより前のバージョンは定かではありません）でbeforeunloadの挙動がおかしい。

beforeunloadイベントを仕込んだページで一度でも「ページから移動」ボタンをクリックすると、
該当ページはもちろん、そのサイトの別のページでもbeforeunloadが発火しなくなります。

Safariを再起動すると、また最初の１回だけは反応するようです。
Cocos2d-x v3.12のNDK_TOOLCHAIN_VERSIONを変更する

### 環境
Windows 10
cocos2d-x 3.12
NDK r10e

### 概要
cocos2d-x 3.12ではNDK_TOOLCHAIN_VERSIONがclangで固定されているため、
std::regexを使用しているところで実行時エラーが発生した。
ちなみに3.10の場合は、NDK_TOOLCHAIN_VERSIONが4.9で実行されていた。

### 原因

- C:\cocos2d-x-3.12\tools\cocos2d-console\plugins\plugin_compile\build_android.py

```py3: 
200:    def get_toolchain_version(self, ndk_root, compile_obj):
201:        return 'clang'
```

ここで、clangに固定されているのが原因。

### 変更方法

直接このファイルを書き換える。

```py3: 
200:    def get_toolchain_version(self, ndk_root, compile_obj):
201:#        return 'clang'
202:        return '4.9'
```

3.12に対しては上記の変更を行った後、r10e, r11c, r12bのいずれの組み合わせでも正常にビルド＆実行できた。
二項分布からPoisson分布の導出とベイズの定理

#二項分布からPoisson分布導出
母数nで、発生確率pの事象がx回発生するか。

```math
P(x|n,p)=_n\mathrm{C}_xp^x(1-p)^{n-x}
```

確率pがnの関数として、$p_n$と書くと、

```math
P(x|n,p_n)=_n\mathrm{C}_xp_n^x(1-p_n)^{n-x}
```

nによらず$np_n=\lambda$を仮定する。（期待値が全て一緒$\lambda$）

```math
P(x|n,p_n)=\frac{n!}{x!(n-x)!}\left(\frac{\lambda}{n}\right)^x\left(\frac{n-\lambda}{n}\right)^{n-x}\\
e^{-\lambda}=1-\lambda+\lambda^2/2-\lambda^3/6+\cdots
```

$n\rightarrow \infty$がPoisson分布だから、

```math
\bar{P}(x|\lambda)\equiv\lim_{n\to\infty}P(x|n,p_n)=\frac{\lambda^x e^
{-\lambda}}{x!}
```

#Poisson分布エラーバーの考え方
ポアソン分布に従う事象がx=5回起こった場合，パラメータλの「95%信頼区間」（Confidence Interval，CI）とは，

```math
\sum_{x=5}^\infty \bar{P}(x,\lambda_{\rm upper})=0.025\\
\sum_{x=0}^0 \bar{P}(x,\lambda_{\rm lower})=0.025
```

を満たす$\lambda_{\rm lower}, \lambda_{\rm upper}$を両端点とする区間$\lambda_{\rm lower}<\lambda<\lambda_{\rm upper}$となる。

#ベイズの定理

```math
P(\lambda|DATA)=\frac{P(DATA|\lambda)p(\lambda)}{\int_0^\infty P(DATA|\lambda)p(\lambda)d\lambda}
```

ガンマ分布は

```math
\Gamma(\alpha,\beta)=\frac{1}{\beta^\alpha\Gamma(\alpha)}x^{\alpha-1}e^{-x/\beta}\\
\Gamma(s)=\int_0^\infty t^{s-1}e^{-t}dt
```

$\alpha=1$のとき、ガンマ関数は指数関数になる。

```math
\Gamma(1,\beta)=\frac{e^{-x/\beta}}{\beta}
```

事前確率$p(\lambda)=\Gamma(1,1)$とすると、

```math
P(\lambda|x)=\frac{\lambda^x e^{-\lambda}}{x!}\frac{1}{\lambda}e^{-x/\lambda}/\int_0^\infty\frac{\lambda^x}{x!} e^{-2\lambda}d\lambda
=2^{x+1}\frac{\lambda^x}{x!}e^{-2\lambda}
```
[Javaの小枝] 何かの値を一時的に変更したいけど戻すの忘れたくない

何かの値を一時的に変更したいけど戻すの忘れそう！って時に、こんなコードを書いて使っている。何かもっと良いアイデアをお持ちの方もいるかもしれない。あったら教えて欲しい。

```java:Sample.java
	public static class SelfRestorable<T> implements AutoCloseable {
		public static <T> SelfRestorable<T> restoreTo(T value) {return new SelfRestorable<T>(value);}
		
		private final T originalValue;
		private Consumer<T> setter = null;
		public SelfRestorable(T value) {originalValue = value;}
		public SelfRestorable<T> by(Consumer<T> setter_) {setter = setter_; return this;}
		@Override public void close() throws Exception {if (setter != null) setter.accept(originalValue);}
	}

	// 例えばユニットテスト中に一時的に static 変数で定義されている DB の接続先を変更する、など。
	@Test public void test() throws Exception {
		try (
				SelfRestorable<Connection> _s = restoreTo(ConnectionProvider.defaultConnection).by(c -> ConnectionProvider.defaultConnection = c);
		) {
			// 接続先を必要なところに変える。戻すのは AutoCloseable な SelfRestorable というオブジェクトが行なう
			ConnectionProvider.defaultConnection = temporalConnection;
			// 以下テストコード
		}
	}

```

ちなみに Java7 と Java8 の AutoCloseable の規約は若干異なっており、以下のように Java7 では解放すべきリソースである、と既定されているが Java8 の元では必ずしもリソースである必要がない。すなわち、Java7の元では以上のコードは厳密には規約違反と言えるのかもしれない。

![image2016-7-26 13-55-57.png](https://qiita-image-store.s3.amazonaws.com/0/110035/92898cad-02fa-8353-0db6-691c012c183c.png)

Java7 では以上のように記述されていたものが Java8 では以下のようになっている。

![image2016-7-26 13-57-17.png](https://qiita-image-store.s3.amazonaws.com/0/110035/8df8b829-98bc-6225-493a-1b7f4f8c61e3.png)
Lumen で利用可能な Peridot プラグインを作りました


https://github.com/chatbox-inc/peridot-lumen-plugin

Composer で利用可能です。

````
$ composer require --dev chatbox-inc/peridot-lumen-plugin
````

register関数を用意していますので設定ファイルの中で使用します。

````
<?php
use Evenement\EventEmitterInterface;

return function(EventEmitterInterface $emitter) {
    \Peridot\Plugin\Lumen\register(require __DIR__ . '/app.php');
};
````

lumenのTestcaseクラスみたいなアレが、peridot で使えます。

````
it('GET /string should get string ', function() {
    $this->lumen->get("/string");
    /** @var \Illuminate\Http\Response $response */
    $response = $this->lumen->response;

    assert($response->getStatusCode() === 200);
    assert($response->getOriginalContent() === "hogehoge");
});
````

`MakesHttpRequests`ってLaravelでも使えるんだっけ？とかは悩んだけど、調べるのも面倒だったし、Laravelサポートして面倒見きれる自信もなかったので今のところはLumen前提で作っています。

Peridot 美味しいよ
gulp-ejsで拡張子がejsになってしまう問題(.htmlにしたい)

## どのバージョンからか知らないけど拡張子がejsになってしまう！

`index.ejs` なんてのをコンパイルすると `index.ejs`のままなんですねぇ。
はい。答えは簡単renameしてしまえば良いのです。

```
.pipe(rename({extname: '.html'}))
```
**※上の方で ```rename = require('gulp-rename')```するのを忘れないように。**
　　
こんな感じ。

```
gulp.task("ejs", function () {
    gulp.src(
        [
            assetsPath + '/ejs/*.ejs', //入力ソースパターン&path
            '!' + assetsPath + "/ejs/_*.ejs" //入力除外ソースパターン&path
        ]
    )
        .pipe(ejs())
        .pipe(rename({extname: '.html'}))　//出力ファイル名パターン
        .pipe(gulp.dest(publicPath + '/html')); //出力path
});
```
そうすると
`index.html`
が出来上がります。

## 応用
というわけで。お気づきの方もおられるかもしれませんが
何も ```.html```にこだわる必要ないんですねぇ。別に拡張子jsでもphpでもなんでもござれ。


## 番外編

```
.pipe(rename({extname: '.html'}))　//出力ファイル名パターン
```
上でこんなのやってますが、 ```extname```の部分を```suffix```にして```min```とかつけると。。。

```
gulp.task("ejs", function () {
    gulp.src(
        [
            assetsPath + '/ejs/*.ejs', //入力ソースパターン&path
            '!' + assetsPath + "/ejs/_*.ejs" //入力除外ソースパターン&path
        ]
    )
        .pipe(ejs())
        .pipe(rename({suffix: '.min'}))
        .pipe(rename({extname: '.html'}))　//出力ファイル名パターン
        .pipe(gulp.dest(publicPath + '/html')); //出力path
});
```
index.min.html
みたいになります。(やる人いるのかわからないけど。)

## 因みに.jsも読み込むこと出来ます。

.ejsファイルの中で

```html
<script><% include ../js/min/index.min.js %></script>
```
こんな感じ。
そうすると、圧縮したjsの中身だけを吸い取ってhtmlに表示したりとかもできますね。
JQuery ajaxでデータをJerseyに送信する時に間違いやすい内容に出会った件

# 依存の追加

```xml

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
        </dependency>
```

この依存が必要です。

# FormDataParam != FormParam

`@FormParam`は`application/x-www-form-urlencoded`のパラメータに対応していて、`FormDataParam`は`multipart/form-data`に対応しています。間違えたら、500番のエラーで返してきます。

# ContentType
ajax内のcontentTypeを`'multipart/form-data'`に設定してはいけません。`false`に設定すべきです。
その違いはChromeのデベロッパーツールで調べれば一目瞭然です。

```

Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:ja,en-US;q=0.8,en;q=0.6
Connection:keep-alive
Content-Length:130686
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryiErKBUuHJyGS9P3k
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/?
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36
X-Requested-With:XMLHttpRequest

```

boundaryが勝手につけられました。こいつが**必須**です。入っていないリクエストをサーバー側では受け付けません。

# サンプル
[Sending multipart/formdata with jQuery.ajax](http://stackoverflow.com/questions/5392344/sending-multipart-formdata-with-jquery-ajax)
Rabbitのコンポーネント一覧

#はじめに
Rabbitを使い始めるにあたり書いています。記載していない（？？としている）部分、間違っている部分などあります。編集リクエストしていただけると嬉しいです。

#Rabbitとは
Grasshopperのプラグインで、生物的・物理的なシミュレーションを可能にする。セルオートマトンとL-system(自然現象や植物の成長のモデル)を利用できる。

#セル・オートマンコンポーネント
##1D Cellular automaton model(1D CA)
![1D Cellular automaton model.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/d4a69a8d-935a-7852-7acf-f38393307c45.png)

連続した点を元に1D（1列の）セルオートマトンモデルを作る。
- (C) Cell prototype
- (P)Series of point 連続した点を入力。(seiesとconstruct pointsで新規に作成したものを入力など)
- (S)state configuration 各セルの初めの（生きているor死んでいる）ステイタス。C stateコンポーネントを使って入力。

##2D Regular Cellar automaton model
![2D Regular Cellar automaton model.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/d7d2caed-7bdc-9a5f-f394-f3ab93e3bd76.png)

1Dとほぼ同様。(P)にはグリッド上の点を入力する。

##Life-Like Cell
![Life-Like Cells.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/e82b81c1-fe66-1348-086a-b1b3f0c29c60.png)

死（0）または生(1)のステイタスを持つことができる。1ターンごとに「生存ルール」または「誕生ルール」に従ってステイタスを新しくする。
- (B)Born rules　セルを囲むセルが「生」ステイタスの場合、新しいセルを生む。その際の周りの「生」セルの個数を整数で入力する。
- (S)Survive rules セルを囲むセルが「生」ステイタスの場合、「生」ステイタスになる。その際の周りの「生」セルの個数を整数で入力する。

##Random State configuration(R State)
![Random State configuration.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/c8f12107-472c-2451-2288-907eccc0b730.png)

？？？

##Discrete Time(Time)
![Discrete Time.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/f25dbeb9-ede7-c2b8-14e3-63034db1e029.png)

時間（ターン）を進ませる。timerコンポーネントと、リセット用のboolen toggleを入力する。

##Elementary Cell
![Elementary Cell.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/27e9e58e-b527-75e4-a8df-4da62cf976c7.png)

「死(=0)」または「生(=1)」の二種類のステイタスを持つ。毎ターンごとにそのセルに最も近い二つのセル（右と左のセル）のステイタスによって、ステイタスを更新する。111～000の各々に、初期値として0 or 1を入力する。


##Excitable Cell
![Excitable Cell.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/67dc9bdf-4e4a-b173-64a7-9c2b5d9daa2b.png)

???

##Custom State configuration
![Custom State configuration.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/d2945788-f251-d3d3-2711-455927bc111f.png)

セル群または点群の選択をするために、ステイタスを特定する？？？

- (P)Points as list 初期値を設定するセル群または点群のリスト
- (S)Custom initial State 初期値。live(True)またはdead(false)を入力

##CA evolver
![CA evoluver.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/6414e502-2617-25cc-58d6-666a8970b3b2.png)

任意の時間（ターン）におけるセルオートマンの状態を計算する。

- (t)Discrete time 時間（ターン）。Discrete timeコンポーネントや整数にセットしたnumberスライダーを入力。
- (CA)Cellular Automata　1D Cellular automaton： modelコンポーネントまたは2D Regular Cellar automaton modelコンポーネントを入力。
- (C)CA Configuration任意の時間（ターン）におけるセルオートマンの計算結果
- (M)Memory すべての時間（ターン）におけるオートマンの計算結果

##Cell component (Cells)すべての時間におけるセルとそのステイタス
![Cell components.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/ea345f6f-1135-7083-4c45-2903d44ef999.png)

- filter ステイタスによるフィルター。0 or 1を入力すると、そのステイタスのセルのみを出力。

#L-system
まだ試せていないので、試したら追記します。
Haskellのthrowできる例外型と値コンストラクタ一覧

# Haskellのthrowできる例外型と値コンストラクタ一覧

## この記事の対象
　[`Control.Exception`](https://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Exception.html)で定義されている例外型で、自分でも`throw`できそうなもの。

例えば`IOException`は値構築子(値コンストラクタ)が公開されていなさそうなので、一覧に含めない。
`catch`のためではなく、`throw`のための型をまとめる。
(規定の一般的な、より多くの例外型を見たければ上記の`Control.Exception`モジュールのページを見ればよい )

☆
現代のHaskellでは`Control.Exception`よりも一般化されたモジュールである[`Control.Monad.Catch`](https://hackage.haskell.org/package/exceptions-0.8.0.2/docs/Control-Monad-Catch.html)
を利用することが一般的である(らしい)が、今回紹介する型はそちら側もだいたいインスタンス化されているため考えない。  
(Re-exports from Control.Exceptionの章を参照)


## 例外型一覧
以下、いくらか定義の簡略で表記する。  
この簡略はthrowする分には問題ないよ :D

```haskell
data ArithException = Overflow
                    | Underflow
                    | LossOfPrecision
                    | DivideByZero
                    | Denormal
                    | RatioZeroDenominator

data ArrayException = IndexOutOfBounds String
                    | UndefinedElement String

newtype AssertionFailed = AssertionFailed String

data AsyncException = StackOverflow
                    | HeapOverflow
                    | ThreadKilled
                    | UserInterrupt

data NonTermination = NonTermination

data NestedAtomically = NestedAtomically

data BlockedIndefinitelyOnMVar = BlockedIndefinitelyOnMVar

data BlockedIndefinitelyOnSTM = BlockedIndefinitelyOnSTM

data AllocationLimitExceeded = AllocationLimitExceeded

data Deadlock = Deadlock

newtype NoMethodError = NoMethodError

newtype PatternMatchFail = PatternMatchFail String

newtype RecConError = RecConError String

newtype RecSelError = RecSelError String

newtype RecUpdError = RecUpdError

data ErrorCall = ErrorCallWithLocation String String

newtype TypeError = TypeError String
```


## 参考ページ
- [Control.Exception](https://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Exception.html#t:IOException)
- [Haskell流の例外処理を学ぶ（2/4）](http://itpro.nikkeibp.co.jp/article/COLUMN/20081104/318426/?ST=develop&P=2)
List<Map<String, Object>>の概念を理解する

# はじめに
こんにちは。今年の春に某ユーザー系企業に入社した新人エンジニアです。
OJTとしてSpring Bootを用いたJavaでのwebアプリ開発をしています。
そこで同期の様子を伺っていると、型やデータの受け渡しといったプリミティブな部分、特にList\<Map\<String, Object>>の扱いで躓いているようでした。
この記事では上述のような方を対象に、新人エンジニアの言葉でList\<Map\<String, Object>の概念を説明しています。

# １．「型」について
List\<Map\<String, Object>>に入る前に「型」についておさらいをしておきます。
JavaにはStringやIntegerといった「型」が存在します。
（基本データ型とクラス型の違いといった部分は本筋から逸れるので棚上げしちゃいましょう）
この「型」とは何か？
ざっくり表現すると**「格納されるデータの形を決めるもの」**です。
Stringであれば「文字列が格納されるもの」、Integerであれば「整数値が格納されるもの」となります。
以降の記事は**どのような形のデータが格納されるのか**を意識して読み進めて下さい。

# ２．Map\<String, Object>
唐突ですが、あなたに３つ質問があります。

- あなたの「性別」を教えて下さい
- あなたの「身長」を教えて下さい
- あなたの「体重」を教えて下さい

...なるほど、なるほど。
「性別」は「男性」で、「身長」は「171cm」で、「体重」は「62kg」ですね。

勘の良い方は既にお気づきかと思われます。
Map\<String, Object>はこのような**「１対１対応の関係が格納されるもの」**です。
格納される情報の数に制限はありません。上記に加えて「スリーサイズ」を格納しても大丈夫。

上記の場合、Map\<String, Object>型の変数mapExampleの中身には、
「**{性別="男性", 身長=171, 体重=61, スリーサイズ=\*\*}**」といった値が格納されています。

「性別」「身長」「体重」「スリーサイズ」は**String**型で、
「"男性"」「171」「61」「\*\*」は**Object**型（すべての型が入ることが許される）であるため、
Map\<**String**, **Object**>と記述されているのです。

# ３．List\<String>
またまた唐突ですが、私には今すぐ食べたいものがいくつかあります。
リストにすると以下の通りです。

食べたいものリスト

- うなぎ
- アイスクリーム
- 杏仁豆腐

Javaでこのリストを記述したいときにList\<String>を使います。
List\<String>はこのような**「値の羅列が格納されるもの」**です。

上記の場合、List\<String>型の変数listExampleの中身には、
「**["うなぎ", "アイスクリーム", "杏仁豆腐"]**」といった値が格納されています。

「うなぎ」「アイスクリーム」「杏仁豆腐」はすべて**String**型であるため、
List<**String**>と記述されています。

# ４．List\<Map\<String, Object>>
これまでを踏まえて、List\<Map\<String, Object>>を眺めてみて下さい。
すると、**Map\<String, Object>がList<>の中に入っている**という構造が見えるようになっているはずです。

Map\<String, Object>型の変数を３つ用意します。
mapExample1：「{性別="男性", 身長=171, 体重=61, スリーサイズ=\*\*}」
mapExample2：「{性別="女性", 身長=160, 体重=50, スリーサイズ=\*\*}」
mapExample3：「{性別="不明", 身長=123, 体重=123, スリーサイズ=\*\*}」

List\<Map\<String, Object>>型の変数listExampleにこれらの値を格納すると、
「**[{性別="男性", 身長=171, 体重=61, スリーサイズ=\*\*}, {性別="女性", 身長=160, 体重=50, スリーサイズ=\*\*}, {性別="不明", 身長=123, 体重=123, スリーサイズ=\*\*}]**」といった値となります。

# ５．おわりに
List\<Map\<String, Object>>の概念は以上の通りです。

そしてJavaの面白い所はここからです。
Javaの型にはメソッドというものが用意されています。
例えば、上記のlistExampleの中のmapExample2の身長を取り出したいなんてときは、
「listExample.get(1).体重」と記述するとバッチリ返ってきます。

このように様々な操作を実行することができます。
以下のリファレンスを見ながら自分なりの使い方を見つけてみてください。

**Java公式リファレンス**
[Overview (Java Platform SE 8 )](http://docs.oracle.com/javase/jp/8/docs/api/)
gnuplotのスクリプトに引数を渡す

gnuplotのスクリプトに引数を直接渡す方法はないが、-eオプションを使うと似たようなことができる。

gnuplotのmanで-eオプションを調べると以下のように書いてある。

```
-e "command list" executes the requested commands before loading the next input file.
```

例えば、以下のようにして -eオプションで変数indir, outdirをスクリプトの実行前に定義することにより、スクリプト myscript.plt 内で変数indir,outdirを参照できる。

```sh
gnuplot -e "indir='input'; outdir='$OUTPUT_DIR'" myscript.plt
```

gnuplotは-eで渡される文字列を評価しているだけなので、複数の変数を定義したい場合は";"でわけるようにする。

```gnuplot:myscript.plt
set terminal png
set output outdir."/my_plot.png"
plot indir."/my_data.dat"
```

ちなみに、文字列型の変数を連結するには "." を用いる。`変数.文字列`とすると文字列を連結できる。

参考 : http://stackoverflow.com/questions/12328603/how-to-pass-command-line-argument-to-gnuplot
Read file into String list (Java 8) 

# 設定
ファイル(text.txt)の中身

```
apple
bear
picnic
...
```

# 方法
## 方法１
```java

List<String> words = java.nio.file.Files
					.lines(Paths.get(getClass().getResource("/text.txt").toURI()))
					.collect(Collectors.toList());
```

しかし、Jarファイル内のファイルが読み込めない（FileSystemNotFoundException）

##方法２
```java

List<String> words = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/text.txt")))
					.lines().collect(Collectors.toList());
```
PHP 空判定メソッドの返り値　empty, isset, is_null 備忘録


## 空判定の返り値早見表 （＠覚えられない）

|      値       | if($var) | isset($var) | empty($var) | is_null($var) |
|:-------------:|:-------:|:-----:|:-----:|:-------:|
| $var=1        | TRUE  | TRUE  | FALSE | FALSE |
| $var=""       | FALSE | TRUE  | TRUE  | FALSE |
| $var="0"      | FALSE | TRUE  | TRUE  | FALSE |
| $var=0        | FALSE | TRUE  | TRUE  | FALSE |
| $var=NULL     | FALSE | FALSE | TRUE  | TRUE  |
| $var          | FALSE | FALSE | TRUE  | TRUE  | 
| $var=[]       | FALSE | TRUE  | TRUE  | FALSE |
| $var=[1]      | TRUE  | TRUE  | FALSE | FALSE |
コンストラクタ

# 新しい統一されたコンストラクタを使用する

```php
<?php
class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       print "In SubClass constructor\n";
   }
}

class OtherSubClass extends BaseClass {
    // BaseClass のコンストラクタを継承します
}

// In BaseClass constructor
$obj = new BaseClass();

// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();

// In BaseClass constructor
$obj = new OtherSubClass();
```
Jest 14.0のSnapshot Testingという新しい機能

## Reactコンポーネントのテスト
最近コンポーネントのテストを試していて、とりあえずFBが作っているJestというフレームワークを試していました。一通り理解してテストを完了した、というタイミングでバージョナップされていました。

う～ん日進月歩:cherry_blossom: 

## 概要
必要なものは、Reactコンポーネント、対応するテストプログラム、:new:スナップショットファイルです。

Reactコンポーネントはテスト対象です。説明することもないですね。

そして、今まではテストプログラムで、ごにょごにょと色々していたのですが、スナップショットテストだと基本的にtoMatchSnapshot()を実行していくだけです。

楽だ～:cherry_blossom: 

そして、今回の肝となるスナップショットファイルですが、最終的に出力されるHTMLをそのまま記述します。renderメソッドのreturn値を記述していく感じですね。そして、キーとしてSuite(describe)の引数文字列とSpec(it)の引数文字列と連番を連結してexportsに記述します。

## スナップショットファイルを作る
もし、テストに対応するスナップショットファイルが無い場合、なんとJestが作ってくれます。テストの進め方としては、

1. 一通りテストプログラムを書く
2. 一度テストを実行してスナップショットファイルを作成
3. コンポーネントを修正してテスト
4. テストの失敗を確認して-uオプションでスナップショットファイルを上書きする

みたいな感じなのかしら:cherry_blossom:

## 単純なサンプル
[FBのサンプル](https://github.com/facebook/jest/tree/master/examples/snapshot)では、子コンポーネントがなかったのでどうなるのか試してみました。きちんと子コンポーネントもレンダリングされた結果がスナップショットの対象になるようです。

```js:Parent.js
import React, {Component} from 'react';

export default class Parent extends Component {
  constructor() {
    super();
  }

  render() {
    return (
      <div>
        <p>Render Parent</p>
        <Child />
      </div>
    );
  }
}

class Child extends Component {
  constructor() {
    super();
  }

  render() {
    return (
      <p>Render Child</p>
    );
  }
}
```
```js:__tests__\Parent-test.js
'use strict';

import React from 'react';
import Parent from '../Parent';
import renderer from 'react/lib/ReactTestRenderer';

describe('Parent', () => {

  it('renders correctly', () => {
    const tree = renderer.create(
      <Parent />
    ).toJSON();
    expect(tree).toMatchSnapshot();
  });

});
```
```js:__tests__\__snapshots__\Parent-test.js.snap
exports[`Parent renders correctly 1`] = `
<div>
  <p>
    Render Parent
  </p>
  <p>
    Render Child
  </p>
</div>
`;
```

## 所感
今まではexpectでだらだらと結果をテストしていた部分をスナップショットファイルに、HTMLでまとめられるのはわかりやすいと思いました。ただ、大きなプロジェクトになると、巨大なスナップショットファイル群ができあがりそうなので、それはそれで見難くなるかもしれませんね。

## Facebook製のJavaScriptテストツール「Jest」の逆引き使用例(2016-10-21追記)
chimame氏の記事です。より詳しくJestについて書かれています。
[Facebook製のJavaScriptテストツール「Jest」の逆引き使用例](http://qiita.com/chimame/items/e97883fd46b67529d59f)
Microsoft AzureのEAアカウントとサブスクリプション、リソースグループとリソースの関係

Microsoft AzureにおけるEA(Enterprise Agreement)のアカウント運用はAWSに比べてわかりづらいため、図解します

※社内向けに作ったんだけど、公開しても問題なさそうなんで公開しちゃいます。間違ってたら編集リク願います

図
---

<img src="https://docs.google.com/drawings/d/1NS0Qyi3l-f4n_r0fvpdiL15BJoGeOS1edSf7sLPg1VA/pub?w=960&amp;h=720">

### 請求 ###

請求はサブスクリプション単位となります
当該サブスクリプションを持っているユーザの利用が、そのサブスクリプションへまとめ上がられます

"請求先"のようなものです

### EAポータルの「アカウント」 ###

EA契約すると[EAポータル](https://ea.azure.com)にログインできるようになります

これ、何ができるかというとEAのサブスクリプションを割り当てることのできるユーザアカウントの管理と、当該サブスクリプションへの請求状況が確認できる、というものです

EAポータルで作成したユーザアカウントはAWSでいうrootアカウントに相当します
各rootアカウントはそれぞれAzureのスペースとAzure AD(= Active Directory)を持ちます

Azure ADは、AWSでいうIAMに相当します

### デプロイモデルとリソースグループ ###

リソースグループとは、その名の通りVMやストレージアカウントといった各種リソースをまとめ上げる単位です

デプロイモデルは「クラッシック」と「リソースマネージャ」が選べます

「クラッシック」は、リソースグループを使わずにリソースを作ることを意味します（すでに非推奨）

「リソースマネージャ」は、リソースグループ内にリソースを配置することを意味します。そのため、あらかじめリソースグループを作っておく必要があります（リソースを作りながら作ることも可能です）

AWSには該当する機能はありません。賛否両論な機能ですね

## 他のアカウントにAzureスペースを管理してもらいたい場合 ##

EAポータルのところでも説明しましたが、各rootアカウントはAzure AD(Active Directory)を持っており、このAzure ADはAWSでいうIAM相当です

ですので、Azure ADに役割を"管理者"として追加することで、管理者を増やすことができます

### 手順 ###

上記図のように、ユーザAは自身のAzureスペースの他、ユーザBのAzureスペースも管理できるようにするには、**ユーザBがユーザAを追加する作業をします**

ユーザBのAzure AD上で下記作業を行います

1. Azureポータル(新) から "Azure Active Directory"
2. [既定のディレクトリ] → [ユーザ] → [ユーザの追加]
3. ユーザの種類:"既存の Microsoft アカウントを持つユーザ" | *MICROSOFTアカウント*: ユーザAのアカウント

これで、ユーザAに見てもらえるようになります。ただし、この状態では管理（例えばVMの操作）は、まだ出来ません
リソースに対してアクセス権(IAM)を設定する必要があります

マイクロソフトアカウントでなく、組織のアカウント(o365アカウント)でも同じ手準になります

#### リソースグループへのアクセス権(IAM)割り当て

アクセス権(IAM)の割り当ては、リソース単位に行えますが、VMが増えたりすると面倒です
なので、リソースグループに割り当ててしまいましょう

1. リソースグループ → アクセス制御(IAM) → [追加]
   ![Screenshot from 2017-01-25 14-17-17.png](https://qiita-image-store.s3.amazonaws.com/0/22754/887255e6-9ca9-05cb-d49c-05bf1cde58ff.png)
2. 役割=*共同作成者*、*共同作成者*とするユーザ(今回は ユーザA) → [選択]
  ![Screenshot from 2017-01-25 14-19-21.png](https://qiita-image-store.s3.amazonaws.com/0/22754/f3c0442c-6202-0812-5e08-a862b974bfde.png)
4. 最後に [OK] を押しましょう（忘れるとと設定されません）

共同作成者とは、権限の全てが与えられているロールです。与えるときはお気をつけて。

あとがき
-------

この辺が一通りわかれば、あとはAWS同様に使うことが出来ます。正直言ってこの辺はAWSの方が使いやすい感じがしますが、どうでしょうか？

一言でまとめるなら**わかりづれぇよ！**

あと、再販しづれぇよ！ → 「サブスクリプションを売る」のが本筋なのでしょうね
定数定義

# define — 名前を指定して定数を定義する

```php
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // "Hello world." を出力します
echo Constant; // "Constant" を出力し、警告が発生します

define("GREETING", "Hello you.", true);
echo GREETING; // "Hello you." を出力します
echo Greeting; // "Hello you." を出力します

// PHP 7 以降で動作します
define('ANIMALS', array(
    'dog',
    'cat',
    'bird'
));
echo ANIMALS[1]; // "cat" を出力します
```
[Java][Linux] LinuxでのJavaの子プロセスの実装がどうやって実現されているのかの調査

普段はC/C++のみを使っているが、デバッグの際にJavaアプリケーションの下回りの実装を気にする機会があったのでメモ
(Javaはほとんど触ってないのでまちがってたらすみません)

Javaで外部プログラムを実行する場合は `ProcessBuilder` というのが使われているらしい。
その際に子プロセスが作成されるが、その `子プロセス` がLinuxでいう `子プロセス` と同様かをソースレベルで確認した。

ちょうど似たようなことを調査されていた方がおられたので、途中まで引用

```
java.lang.ProcessBuilder.start(…)  // OS共通
 → java.lang.ProcessImpl.start(…) // UNIX系OS用のクラス(solarisフォルダ配下)
  → java.lang.UnixProcess.<init> // UNIXProcess.java.linux
-------------------- ここからネイティブコード (C言語) ---------------------
    → Java_java_lang_UNIXProcess_forkAndExec(...)
       (この関数の先でvfork()が行われる)
```
引用：[ProcessBuilderの中を覗いてみる - 見習いプログラミング日記](http://n-agetsuma.hatenablog.com/entry/2014/02/11/130606)

上のようにして、最終的にはプラットフォームごとのCのコードが呼び出されている。
ココらへんのJNIを含むJDKのプラットフォーム抽象化レイヤについては以下の記事などを参照。
[プラットフォームを抽象化したC API(Java編) - Qiita](http://qiita.com/nothingcosmos/items/935cd0b9d62ef01ddddc)

OpenJDK8だと具体的には以下のソースになる。(Linuxだけどパスはsolaris以下に含まれている)

[jdk8/jdk8/jdk: d94613ac03d8 src/solaris/native/java/lang/UNIXProcess_md.c](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/d94613ac03d8/src/solaris/native/java/lang/UNIXProcess_md.c)

`Java_java_lang_UNIXProcess_forkAndExec` という名前の時点でもわかっていたが、fork => exec されている。
もっと具体的に言うと、Linuxでは `vfork` => `execve` となっている様子。

なので結論としては、Javaの `ProcessBuilder` による子プロセス作成は、Linuxの一般的なプロセスの実装であることが確認できた。

# 参考
[ProcessBuilderの中を覗いてみる - 見習いプログラミング日記](http://n-agetsuma.hatenablog.com/entry/2014/02/11/130606)
[jdk8/jdk8/jdk: d94613ac03d8 src/solaris/native/java/lang/UNIXProcess_md.c](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/d94613ac03d8/src/solaris/native/java/lang/UNIXProcess_md.c)
[プラットフォームを抽象化したC API(Java編) - Qiita](http://qiita.com/nothingcosmos/items/935cd0b9d62ef01ddddc)
Mysqlのgroup_concatをPrestoとRedshiftで書く

Mysqlのgroup_concatをPrestoとRedshiftで書く際に毎回混乱するのでメモ

## Mysql

```sql
select 
  a,
  group_concat(b separator ',')
from table
group by a
```

## Presto

```sql
select 
  a,
  array_join(array_agg(b), ',')
from table
group by a
```

## Redshift

```sql
select 
  a,
  listagg(b, ',')
from table
group by a
```
fedoraをminimalインストールすると/etc/sysconfig/iptablesファイルがない

fedora 23で表記の問題が発生した。おそらく他の2x系バージョンや、新し目のRedHat/Cent系でもこの問題が発生しそう。

fedora 23 をminimalでインストールしたりminimalなVMを利用したりすると、/etc/sysconfig/iptablesファイルが作成されない。

修正は意外に簡単で、rootで`dnf install system-config-firewall-base`を実行するだけ。これでiptablesファイルが作成される。

参考: https://access.redhat.com/discussions/1341583
staticイニシャライザとstatic変数

```java



//staticイニシャライザと同様、
//staticなクラス変数が初期化のためにインスタンスメソッドを呼ぶならば、
//そのメソッドはmainメソッドよりも先に実行される。



public class Test {
	public static void main(String[] main){
		System.out.println("main");
	}

	static int svar = (new Test()).method();

	Test(){
		System.out.println("cons.");
	}

	int method(){
		System.out.println("method");
		return 123;
	}
}



//「cons. -> method -> main」



```
SPAを配信するときのnginx設定

ファイルがあったらそれを返し、ない場合はindex.htmlを返す。

```
location / {
    try_files $uri /index.html;
}
```

css, js, imageを一緒に配信している場合でもうまく動くのでこれに落ち着きました。

## 参考

[stack overflow - nginx: send all requests to a single html page](http://stackoverflow.com/questions/7027636/nginx-send-all-requests-to-a-single-html-page)
CORSでユーザー定義のResponse Headerを参照する

## クロスドメイン通信では、デフォルトでユーザー定義ヘッダーを参照できない

curlなどでサーバーサイドがHeaderを返すことが確認できていても、ブラウザのCORS仕様で参照できない、ということが起きる。

ブラウザでヘッダーの参照を許可するには、サーバーサイドのレスポンスヘッダに `Access-Control-Expose-Headers` を付加する。

例えばgolangのgin frameworkをでは以下のようにする。

```go
// ブラウザがレスポンスヘッダーの読み取りを許可
c.Header("Access-Control-Expose-Headers", "X-HogeApp-Hogeid")
```

以下も合わせて設定するとgood

```go
// 合わせてこちらも
c.Header("Access-Control-Allow-Origin", "http://hogehoge")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
c.Header("Access-Control-Max-Age", "86400")

// ブラウザからリクエストヘッダーの送信を許可
c.Header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-HogeApp-Hogeid")
```

middlewareにして

## 終わり

サーバーサイド視点だと「ヘッダー返してますけど」と、意外と気付かずにハマってしまう！
ブラウザ仕様も理解しておこう。

### TODO ###
他にもCookieを使うときにハマったことや、`Access-Control-Allow-Origin`を複数許可したい時の小技を覚えたので後で書く…かも。（Cookieを使うときは`Access-Control-Allow-Origin`を`*`にしてはいけないなど）

…全部ここに書いてあった！
http://inside.pixiv.net/entry/2014/12/16/181804

## 参考にしました
[Qiita - CORSまとめ](http://qiita.com/tomoyukilabs/items/81698edd5812ff6acb34#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AB%E7%8B%AC%E8%87%AA%E3%81%AEhttp%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%83%98%E3%83%83%E3%83%80%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8B%E3%82%89%E8%AA%AD%E3%81%BF%E5%87%BA%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88)