OmniAICreator/Qiita-1.07M huggingface dataset:
Babel + Browereifyでビルドするコードをherokuに載せたい

## やりたいこと


* Babel + Browserifyでビルドする
* ↑をGulpでビルドしている
* herokuに載せたい
* でもBabel系はdevDependenciesに入れたい。

## コマンド？

heroku createした後に下を叩く
```
$ heroku config:set NPM_CONFIG_PRODUCTION=false
```

これでdevDependenciesに入っているものもnpm installしてローカル同様にやってくれるらしい。


すばらしい。



参考文献(heroku公式)
https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process


~~追記：
gulp-ruby-sassをbuildするためにはbuildpacksを追加する。~~

```
$ heroku buildpacks:add https://github.com/michaeleekk/heroku-buildpack-gulp-ruby-sass
```
⇒Rubyを変に認識してしまい、結局できなかった

gulp-ruby-sassではなく、gulp-sassを使うことでできた。
(これでRubyを直接叩かないので問題ないらしい。)
Power BI で座席表を作る　その２／２

[前回](http://qiita.com/Masutani/items/34cad3287fba9ba44ff4)、座席表をPowerBI化しましたが、shape mapだと中途半端な座席表しかできませんでした。一応社内展開したところ、"K"CEOからご指摘まで頂いたので、きちんとしたものを作ってみようと思います。

課題は
* ラベル（名前）を座席に表示
* 座席をグループ別色分け
などです。

# PowerBIで座席表（再）

## Synoptic Panelを使う

前回はマップ系のビジュアルを使うことで座席表を作ろうとしましたが、もっと直接的に図形にマッピングするビジュアルがあれば良いと思いました。標準ビジュアルにはそれに値するものはありませんが、オプションの[ビジュアルギャラリー](https://app.powerbi.com/visuals)にそれに使えそうなものがありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/018ed139-355d-6851-a8aa-cd8b5243ac6b.png)

OKVizというところが提供するSynoptic Panelというビジュアルです。サンプルがすでに使えそうな雰囲気を醸し出していますね。これでやってみましょう。
予めカスタムビジュアルをインポートしておきます。

### 図面の準備

Synoptic Panelでは、図面はJSONではなくてSVGで導入します。SVGなのでジオリファレンスはいりません。SVGを簡単に作図できるものは多数あると思います。PowerPointもSVGをエクスポートすることが可能です。
ですが、前回すでにArcGISを使って座席IDまで振った図面がありますので、shape -> SVGを作成する方法を使います。

ArcGISでSVGを出力するには、ラスターに変換する方法しかなく、直接出力はできません。いくつかコンバータが存在するのでそれらを使います。

できあがったSVGをPowerBIに載せてもうまくキーが設定されていないようです。[Synoptic Editor](https://synoptic.design/)というツールがあるのでこれで確認すると、キーがうまく設定されていないようです。SVGファイルを編集して、グループノードを削除したり、キーを手入力すればよさそうです。
私の使ったコンバータでは、shapeからでなくGeoJSONからSVGに変換すればうまくキーがコピーされるようです。

ちなみにSVGの場合は、キーはidアトリビュートがそれになります。ただし、キーは自動的に第一フィールドを使われてしまうので、shapeのFIDが入ってしまいます。折角入れた座席IDは無視。これは別途対応表をｃｓｖとして吐き出しPowerBIでマージすることにしました。

### Power BIでの統合

Synoptic Panelではビジュアル内でSVGを聞かれるので、そこでローカルフォルダから設定します。キーはsubcategoryとマッチングされて表示されるようです。例えば以下のような設定にしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/1e28a292-84dc-e0a3-d074-3837c8727833.png)

最終的には、以下のようなラベル付き、グループ分けされたレポートが作成できます（当然、個人名は伏せています）。Synoptic Panelでは、そのほか、ツールチップの編集や、カテゴリ分け、リージョンを切ったりすることができて、かなり高機能ですので、活用していきたいと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/08ea26cd-6266-8276-b884-0634276d0eb7.png)

次は以下の実践編をどうぞ。

関連記事
[Power BI で座席表を作る　その１／２](https://qiita.com/Masutani/items/b590f81fc7f48c0472a0)
[Power BI で座席表を作る　その２／２](https://qiita.com/Masutani/items/244a6e79ffed3a8ccd86)
[Power BI で座席表を作る　実践編](https://qiita.com/Masutani/items/449dd303a2ce2e17265f)
docker-compose with Swarm for Docker 1.13

# 概要
今まで、Swarmモードで、docker-composeを使ってserviceを作成するに当たり、docker-compose.yml にoverlayネットワークを定義したりしてもうまく使えなかったりもどかしい状況だった。
Docker 1.13 では "docker stack" コマンドを使用することで、うまくいくようになったようなので、実際に試してみる。

# とりあえず nginx のクラスタを組んでみる
Swarmは構成済として、Swarmの構成手順は省略。
docker-machine を managerノード1台、workerノード2台での構成をしている状態。
swarm は構成済 (init & join 済み) です。

```bash
$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
manager1   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.13.0
worker1    -        virtualbox   Running   tcp://192.168.99.101:2376           v1.13.0
worker2    -        virtualbox   Running   tcp://192.168.99.102:2376           v1.13.0
```

## docker-compose.yml に記述している version を 3 に上げる
```yaml
# docker stack で swarmモードのノードにデプロイするには3への設定が必須
version: '3'
services:
    web:
        image: nginx
        ports:
            - "80:80"
```

## docker stack コマンド で Swarmモードのマネージャーノードでデプロイ
```bash
# docker-compose.yml を指定
$ docker stack deploy -c docker-compose.yml
```

# 確認
```bash
# docker service が作成されている
$ docker service ls
ID            NAME       MODE        REPLICAS  IMAGE
u6vh9qh79vtt  nginx_web  replicated  1/1       nginx:latest

$ docker service ps nginx_web
ID            NAME         IMAGE         NODE      DESIRED STATE  CURRENT STATE          ERROR  PORTS
is40pl78bcwb  nginx_web.1  nginx:latest  manager1  Running        Running 6 minutes ago

# overlayネットワークは宣言していないが自動で構成されている
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8ef478abc3a1        bridge              bridge              local
9325e0ad61b1        docker_gwbridge     bridge              local
ddc6ad2d8d0d        host                host                local
wy4ff9n6ejds        ingress             overlay             swarm
qvrffxy9c15z        nginx_default       overlay             swarm # ←ここ
7696ae1a989d        none                null                local
```

もちろんスケールもできるので、お試しを。。。
ショートカットを活用しよう - 15 - (Excel) Ctrl + (矢印キー, Home, End, PageUp, PageDown)

# <kbd><kbd>Ctrl</kbd> + <kbd>(矢印キー, Home, End, PageUp, PageDown)</kbd></kbd>の効果
セルの移動およびシート間の移動を行います。

各矢印キーは、現在フォーカスのあるセルを基準に、そのセルと直後のセルの状態で次のように動作します。
<kbd><kbd>Ctrl</kbd> + <kbd>↑←↓→</kbd></kbd>：

- *フォーカスのあるセルに入力がある場合*
    - *次のセルにも入力がある場合*
        - 空白があるセルの直前のセルまで移動する
    - *次のセルが空白の場合*
        - 次の入力のあるセルまで移動する
- *フォーカスのあるセルが空白の場合*
    - 次の入力のあるセルまで移動する

<kbd><kbd>Ctrl</kbd> + <kbd>Home</kbd></kbd>：最初のセルへ移動（通常はA1セル、ウィンドウ枠を固定している場合、その最初のセル）
<kbd><kbd>Ctrl</kbd> + <kbd>End</kbd></kbd>：最後のセルへ移動（最後に入力のあるセル）

これらのショートカットはセル間の移動でとても便利です。
特に <kbd><kbd>Ctrl</kbd> + <kbd>End</kbd></kbd> は、入力されている範囲を知るのに便利で、何も入力が無いのに余計な入力範囲を知ることも出来ます。

---
VBAの話になりますが、セルの入力範囲を知るのには色々と方法があるかと思います。
その一つの方法として、`Worksheet`クラスの`UsedRange`が便利ですが、おかしな入力があると余計なセルまで取得してしまうので、そうした際の確認などにも利用できます。
また、矢印キーでの移動は`Range`クラスの`End`での動作と同じです。
繰り返し処理などで、よくある方法として特定の行での入力のあるセルを取得するのに、その列の最後のセルから`.End(xlUp)`としているのは、最後のセルまで移動し、<kbd><kbd>Ctrl</kbd> + <kbd>↑</kbd></kbd>としていることになります。

---

<kbd><kbd>Ctrl</kbd> + <kbd>PageUp</kbd></kbd>：前のシートへ移動
<kbd><kbd>Ctrl</kbd> + <kbd>PageDown</kbd></kbd>：次のシートへ移動

こちらもよく使います。
シート数が多く移動が大変な場合、別途シート一覧（シートのタブが並んでいる最初の方のセレクタで右クリック）と同じようなものをVBAで作成して利用したりします。
この辺は徹底的にマウスへの持ち替えを省いて、操作するためです。


以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Win</kbd> + <kbd>U</kbd></kbd>](http://qiita.com/rrryutaro/items/e13345c64a5989a68189)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Alt</kbd> + <kbd>(テンキー側の数値入力)</kbd></kbd>](http://qiita.com/rrryutaro/items/e8697d1cbc2e40cd1f92)|
Python 3.6になったAnaconda 4.3.0をインストールしてはまった

Anaconda 4.3.0が2017/1/31にリリースされたので、早速インストールしてみた。

## 環境
- Windows 7
- OS X El Capitan

## 注目のアップデート
2016/12/23にリリースされたばかりのPython 3.6に早速対応している。
root環境がPython 3.6に変更されているので要注意。

## はまったポイント
下のChangelogにあるようにいくつかパッケージが外されている。どのパッケージが該当するのかはっきりしないが、いくつか機能がなくなっている。

- Jupyter NotebookにPresentationモードがない。（nbpresent?）
- Jupyter Notebookでカーネルを選択できない。（nb_conda_kernels?）
- condaでインストールするときに、ダウンロードされるパッケージのリストが表示されない。
[conda no longer showing download summary · Issue \#4348 · conda/conda](https://github.com/conda/conda/issues/4348)
- conda env exportで出力されるパッケージのリストにインストールしたチャンネルが出力されない。（たぶん仕様変更）

2/3時点では上記 nbpresent と nb_conda_kernels は、condaで追加インストールすることすらできない。

## pandasの不具合
pandas.read_csvでパスに日本語を含むShift-JISのCSVファイルを読み込むとエラーになる。Python 3.4環境を作って試したらエラーは出ないので、ミスではないことは確か。
Python 3.6の仕様変更が関係ありそう。ということはAnacondaというよりPython 3.6とpandasの相性の問題？

[PEP 528 \-\- Change Windows console encoding to UTF\-8 \| Python\.org](https://www.python.org/dev/peps/pep-0528/)
[PEP 529 \-\- Change Windows filesystem encoding to UTF\-8 \| Python\.org](https://www.python.org/dev/peps/pep-0529/)

## Changelog抜粋
[Anaconda changelog \| Continuum Analytics: Documentation]
(https://docs.continuum.io/anaconda/changelog)
### Highlights:
The Anaconda3 installers are based on Python 3.6. Anaconda 4.3 supports Python 2.7, 3.4, 3.5 and 3.6. Anaconda 4.3 will be the last release which supports Python 3.4. We will discontinue regular Python 3.4 package updates in the next release.
The Intel Math Kernel Library (MKL) is updated from 11.3.3 to 2017.0.1.
Over 90 packages are updated.
seaborn is now installed by default.
### Removed (from installer only):
- anaconda-clean
- dynd-python
- filelock
- libdynd
- nb_anacondacloud
- nb_conda
- nb_conda_kernels
- nbpresent
- patchelf
- pkginfo
HomebrewでmacOSにiftopをインストールする方法

iftopをbrewでインストールすると以下のようになり，コマンドが失敗してしまったのでその備考録．

```bash
❯ brew install iftop                                              
==> Downloading https://homebrew.bintray.com/bottles/iftop-1.0pre4.el_capitan.bottle.tar.gz
Already downloaded: /Users/user_name/Library/Caches/Homebrew/iftop-1.0pre4.el_capitan.bottle.tar.gz
==> Pouring iftop-1.0pre4.el_capitan.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink share/man/man8/iftop.8
/usr/local/share/man/man8 is not writable.

You can try again using:
  brew link iftop
==> Caveats
iftop requires root privileges so you will need to run `sudo iftop`.
You should be certain that you trust any software you grant root privileges.
==> Summary
🍺  /usr/local/Cellar/iftop/1.0pre4: 9 files, 99K
```

調べてみると`/usr/local/Cellar/iftop/1.0pre4/sbin/iftop`には配置されているようなのでシンボリックリンクを作ってコマンドが通るようにする

```bash
$ sudo chown root:wheel /usr/local/Cellar/iftop/1.0pre4/sbin/iftop     

$ sudo chmod u+s /usr/local/Cellar/iftop/1.0pre4/sbin/iftop

$ ln -s /usr/local/Cellar/iftop/1.0pre4/sbin/iftop /usr/local/bin/iftop                                                                   
```

```bash
$ iftop
```
一応これで通るようになりました．iftopのversionなど，変更している可能性があるのでご留意ください

（2017/02/02 現在のバージョン 1.0pre4）
Power BI で座席表を作る　その１／２

社内で人が増えるたびに座席の見直しが行われて、その都度Excelの表を更新して展開しています。
何度も更新するうちに、人と内線番号が食い違ったり、間違いも増えます。また、同じグループの人がやむを得ず他の島にアサインされたり、色々と難しい面もあります。

別に手動でやっても全く問題になるような話ではありませんが、人事データときっちりと整合性が取れた座席表を維持するのはそれなりに手間のかかることです。
PowerBIには、座席表など図面と、データを効率よく結び付け、適切に可視化する機能があります。地図関連のビジュアルはそのままこういった構内や屋内の図面にも応用できます。座席表のPowerBI化をやってみましょう。

基本的には、手元にあるジェネリックなツールの組み合わせだけで出来るよう、マクガイバー的方法論でやる方法を紹介します。

# PowerBIで座席表

以下のような形でまとめました。
[Power BI で座席表を作る　その１／２](https://qiita.com/Masutani/items/b590f81fc7f48c0472a0)
[Power BI で座席表を作る　その２／２](https://qiita.com/Masutani/items/244a6e79ffed3a8ccd86)
[Power BI で座席表を作る　実践編](https://qiita.com/Masutani/items/449dd303a2ce2e17265f)

## Shape Mapを利用する

##### 用意するもの
* Power BI (フリー)
* GIS ツール (QGIS, ArcGISなど)
* Map Converter (Topo JSONへの変換ができるもの）
* 座席*人対応データ

以前紹介した、比較的最近の機能である [Shape Map (マップシェイプ）Visual](http://qiita.com/Masutani/items/34cad3287fba9ba44ff4) を使って座席表を作ってみましょう。
Shape Map ではTopoJSONの地図データが使えました。

### 何で図面を描くか
座席表のきっちりとしたベクタファイルなんて普通は存在せず、ExcelとかPowerPointで作った図表がある程度でしょう。頻繁に更新することを考えると、データ編集が容易なExcelを使うことが多いのではないでしょうか？
このままではTopoJSONに変換できないし、きっちりとした図面ではないので、最初から座席表を描くことにしましょう。

CADツールや２次元デザインツールに慣れた人なら、そういったツールでDXFなどの図面データをおこして、JSONに変換すれば良いかもしれません。TopoJSONやGeoJSONを直接編集するツールもWebに存在しますが、非常に単純な機能しかなく、コピペで配置を量産したりできません。

ここはGISを使って図面を書いてみましょう。マクガイバー的にはQGISを使うところですが、ここでは個人的に使い慣れたArcGISを使ってみます。

### ArcGISで座席表を作図
ArcGISの編集機能は非常に洗練されているので、座席表なども比較的簡単にできてしまいます。ArcGISではfeatureを直接作図できますが、非常に重く、編集機能も複雑なものが多いので、まずグラフィックとして作図します、これですとPowerPointなどのように図形のコピペや左右揃え、均等配置などが直感的に可能ですので、あっという間に座席表が作成可能です。以下のような座席表を、実際のオフィスの位置に作成してみました。地理的に正しい位置に配置する意味はPowerBI的には無いのですが、何かに使いまわす場合の事を考えると一応正しく配置した方が良いですね（何に使うのか！）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/bc93c85a-04a5-b6c0-d645-291a4cc6a095.png)

この際、各ポリゴンのキーとなるフィールドを定義しておきます。座席事のIDを適当に決めましょう。私は島ごとに以下のように設定してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/b506056a-09f0-4ce4-4252-9521f6e16569.png)

作成されたグラフィックを[フィーチャーに変換](http://desktop.arcgis.com/ja/arcmap/10.3/map/page-layouts/converting-between-graphics-and-features-about-con.htm)し、さらにJSONとして出力すると準備完了です。

### TopoJSONへの変換

一度shapeファイルやGeoJSONに変換してしまえば、PowerBIの解釈可能なTopoJSONへの変換は前回紹介したmap shaperで可能です。
作成されたTopoJSONをshape mapで読み込みましょう。そして、適当に座席IDと名前を紐づけておいたファイルや電話帳などをJOINして。。。できた！

### Power BIでデータと統合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/5e7e5dd2-127f-468c-9e99-3cc0ac9752a8.png)

一応性別やグループなどのフィールドも新たに編集しました。あ、でも、あれ？肝心の名前が出せません！残念ながら、shape mapでは他のマップ系ビジュアルと違い、ラベルが図面上に出せませんorz。凡例欄やツールチップでは確認できますが、これだと探すのが大変ですね。

とはいえ、一度やってみたかった、カスタムマップの自作→PowerBIへの活用の最短パターンに近い方法がわかりよかったです。こうなると何でもPowerBI化したくなりますね。


関連記事
[Power BI で座席表を作る　その１／２](https://qiita.com/Masutani/items/b590f81fc7f48c0472a0)
[Power BI で座席表を作る　その２／２](https://qiita.com/Masutani/items/244a6e79ffed3a8ccd86)
[Power BI で座席表を作る　実践編](https://qiita.com/Masutani/items/449dd303a2ce2e17265f)
STM32 HAL よく使う文

HALライブラリのクイック構文集です。

#deley
HAL_Delay(100);

#GPIO
ピンをHigh
HAL_GPIO_WritePin(GPIOA,PIN,GPIO_PIN_SET);
ピンをLow
HAL_GPIO_WritePin(GPIOA,PIN,GPIO_PIN_RESET);

#UART

OUTPUT char 
HAL_UART_Transmit(&huart1,(uint8_t *),1,3000);

OUTPUT String
HAL_UART_Transmit(&huart1,(uint8_t *),strlen(s),3000);

INPUT
HAL_UART_Receive(&huart1,(uint8_t *)&c,1,3000);

※3000はタイムアウト
Windows7 - WindowsUpdate と　ディスククリーンアップをしたらフリーズが頻発した

# 事の経緯
　ラップトップのHDD（SSD）容量が妙に逼迫していると思い、
ディスクのクリーンアップを試みたところ、WindowsUpdateの残骸が大量に残っていた。
殆どは C:\Windows\Install や C:Windows\Tmp 等にあり、200GBのSSDのうち120GB近くを
ため込むという始末。

困ったことにディスクのクリーンアップでは消えてくれない。
幾つかWebを見て回ったところ、システムに影響が出るかも？という記載と
消してみたけれど影響でなかったよ？という相反するものが有り、いまいちよく分からない。

とはいえ、この容量を放置しているとディスク逼迫のせいで
システムがやたら重い、という事象が避けられなくなってきたので
思い切って削除してみることにした。

# 結果
　容量は当然空いた。
…が、シャットダウンに1時間近く掛かるようになった。
英語表記のラップトップなので、画面に出る文字が英語なので恐縮だが
シャットダウンとすると

**Preparing To Configure Windows. Please Do Not Turn Off Your Computer**

といったメッセージが出て40分以上、電源が落ちなくなった。
従ってRebootの所要時間45分。やっていられない…
シャットダウン自体は電源をぶち切りしてしまえば済むが、事象は解消しないので
再起動する度にこの文字と共に40分以上待たされる。
挙げ句の果てには起動してきたと思ったら全ての動作に対して頻繁に20秒ぐらいフリーズするようになった。
例えば

* Firefoxを起動する
* Cドライブを表示する
* 適当なテキストファイルを開く（Notepad++とか）
* 漢字変換を試みる

要するに全ての動作。

# どうやって解消したか

結論から言えば** WindowsUpdate の履歴を一切合切クリアしてやり直す ** で解決。
具体的には以下のようなバッチと作業をたたいて消す。

<pre>
net stop wuauserv
net stop cryptSvc
net stop bits
net stop msiserver
ren %systemroot%\SoftwareDistribution SoftwareDistribution.old
ren %systemroot%\System32\catroot2 catroot2.old
del "%ALLUSERSPROFILE%\Microsoft\Network\Downloader\qmgr0.dat"
del "%ALLUSERSPROFILE%\Microsoft\Network\Downloader\qmgr1.dat"
net start wuauserv
net start cryptSvc
net start bits
net start msiserver
wuauclt /resetauthorization /detectnow
</pre>

<pre>
net stop wuauserv
net stop cryptSvc
net stop bits
net stop msiserver
rmdir %systemroot%\softwaredistribution.old /q /s
rmdir %systemroot%\System32\catroot2.old /q /s
net start wuauserv
net start cryptSvc
net start bits
net start msiserver
shutdown /r /t 0
</pre>

ここで再起動が掛かる。
起動をしてきたら
「管理ツール」「サービス」「WindowsUpdate」のサービスを停止。
停止したら

C:\Windows\SoftwareDistribution\DataStore\datastore.edb

を削除する。
このファイルはWindowsUpdateの履歴ファイルなので
サービスを止めないと削除できない。
そして、削除するとWindowsUpdateができなくなる。

そうなったら再び再起動をし、以下のバッチを実行する。

<pre>
net stop wuauserv
cd %systemroot%
ren SoftwareDistribution SoftwareDistributionold
net start wuauserv
net stop bits
net start bits
net stop cryptsvc
cd %systemroot%\system32
ren catroot2 catroot2old
net start cryptsvc
</pre>

再び再起動でどうやら復活。

面倒くさかった…
ちなみにScanDiskはやってみたが効果が無かった
技術英語 > Some will [turn up] in later chapters / The research team [were due] this morning, but they didn't show up.

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1084 / 12833)

> Python has many more string functions than I've shown here. Some will **<font color=red>turn up</font>** in later chapters, ...

意訳「Pythonはここで紹介したよりも多くのstring関数を持つ。いくつかはあとの章で紹介される」

<hr>
関連して思い出したのは

@ カシオ EX-word XD-N8600 搭載辞書

> The research team **<font color=red>were due</font>** this morning, but they didn't show up.

https://www.merriam-webster.com/dictionary/due
> 6 :  required or expected in the prescribed, normal, or logical course of events : 

意訳「その調査チームは今朝到着予定であったが、姿を見せなかった」
ESXi 環境で VT-x is not available となったときの対策

ESXi 6.0 上の Ubuntu 16.04 環境に VirtualBox を入れ、とある VM を起動しようとしたら "VT-x is not available" になってしまったので、その解決のためのメモ。

# Nested Virtualization の確認
まず Nested Virtualization がサポートされているかの確認。ESXi 6.0 では MOB (Management Object Browser) が無効になっているので、下記を参考に MOB を有効化。

https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2111579

その後、ブラウザから次の URL にアクセスして確認。nestedHVSupported が true なら有効。

```
https://ESXiアドレス/mob/?moid=ha-host&doPath=capability
```

![check-nested.png](https://qiita-image-store.s3.amazonaws.com/0/156216/05b2ffb8-25b8-c8a3-bce6-55026b1ce9e8.png "check-nested.png")


しかし、今回はこれでも VT-x エラーが発生。

# Expose Hardware Assisted Virtualization の有効化
その後、vCenter をインストールし、CPU 設定から下記を有効にすることで問題は解決。

![nested-nest.png](https://qiita-image-store.s3.amazonaws.com/0/156216/273f65ad-89c0-2946-d795-2260684c1d0e.png "nested-nest.png")

これで無事に VM を起動できました。
Date#change が便利

既に生成済みの`Date`のインスタンスの月とか日だけ変えたい時のメソッドです。今日教えてもらえました、便利。

### 使い方

```.rb
> Date.new(2017,2,3).change(day: 2)
Thu, 02 Feb 2017
> Date.new(2017,2,3).change(month: 3)
Fri, 03 Mar 2017
> Date.new(2017,2,3).change(month: 3, day: 2)
Thu, 02 Mar 2017
```

良い。

### 参考
http://stackoverflow.com/questions/41997316/how-to-create-new-date-instance-only-by-a-day
Railsでは Date#to_time よりも Date#in_time_zone を使いましょう

`Time`クラスよりも`TimeWithZone`の方がタイムゾーンの扱いが上手いらしいのでそちらを使いましょう。

```.rb
Date.new(2017,2,3).to_time
2017-02-03 00:00:00 +0900 # Time クラス
Date.new(2017,2,3).in_time_zone
Fri, 03 Feb 2017 00:00:00 JST +09:00 # TimeWithZone クラス
```

実際に`to_time`が原因で困ったことになったことはないんですが、Railsプロジェクト内で使うクラスは統一してたほうがスッキリするので私はこちらを使っています。

### 参考
http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
外部ファイル化したEmmetのオレオレスニペット（snippets.json）をVSCodeで読み込む

SublimeTextやAtom等の異なるエディタ間でスニペットを共有したい場合、`~/emmet/`配下等に設定ファイル（snippets.jsonだけでなく、preferences.jsonやsyntaxProfiles.jsonも同様）を置いて管理しますが、VSCodeでは今月になってようやく外部ファイルの設定読み込みに対応したみたいです。
https://github.com/Microsoft/vscode/issues/11679

## 設定方法
（Windowsの設定方法ですが、他の環境も変わらないでしょう）
基本設定＞ユーザー設定(もしくはワークスペース設定)を開き、`emmet.extensionsPath`のキーを追加してフォルダを指定するだけです。
以下の例ではSublimeTextやAtomのプラグインで使われているデフォルト値（`~/emmet`）を使用しています。

**`~/emmet`や`%USERPROFILE%/emmet`のような書き方はできない**ため、フルパス記述が必要ということにだけ注意。

```json:ユーザー設定
{
    "emmet.extensionsPath": "C:\\Users\\hizatama\\emmet"
}
```

これでVSCodeでもオレオレスニペットを使えるようになりました。

Enjoy Coding :)
C#スクリプト（Roslyn）でLINQを使おうとして困った話

#はじめに
RoslynでC#をスクリプトとして使えるようになってるんですね。
面白そうと思って試してみました。
しかし、スクリプトでLINQを使おうとすると実行時に例外を出されてしまうという問題にぶつかったので、それについて書いてみようと思います。

ところで、筆者は10年ぶりに趣味プログラミング再開したばかりの人で、C#も覚えたて、Qiitaも初投稿です。
なんか変なところがあったらそっと教えてください……

#usingできない？
次のような何の変哲もないスクリプトは実行できません。

```script.csx
using System.Linq;

//処理

```

こんなエラーが出ます。
”The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)”

どうしてスクリプトでSystem.Linqをusingしたときだけ怒られるのかわからず半日悩みました。（using Systemとかは普通に通る）
結論から言うと、"System.Core"をスクリプトでアセンブリ参照する必要があるようです。

```script.csx
#r "System.Core" //これを追加する
using System.Linq;

//処理

```

もしくは、スクリプトを呼び出す側でこう書きます。ScriptOptionsで指定してあげればスクリプトの側では#rもusingも書かなくていい。

```hoge.cs
var option = ScriptOptions.Default
                .AddReferences("System.Core") //これが必要
                .AddImports("System.Linq");

var code = File.ReadAllText(scriptpath);
var script = CSharpScript.Create(code, option);
```

この辺のオプション等の書き方も、Roslynのバージョンによって違いがあり、他のサイトで紹介されてる書き方ではダメだったりしました。
（インストールしているMicrosoft.CodeAnalysis.CSharp.Scriptingのバージョンは1.3.2）

以下のページにはそんな変更点も含めてまとめてありとても参考になりました。
http://wiki.clockahead.com/index.php?Coding%2F.NET%2FRoslyn%2FScripting#o8732c13

ともあれこれでスクリプトなのに簡潔に書けない悲しさが解決します。

#ついでに
呼び出し元で定義したクラスのインスタンスをスクリプト側に渡して操作できます。なんかすごい。

```hoge.cs
public class HogeClass
{
     //何か
}

class Scripting
{
    async Task RunScript()
    {
        var hoge = new HogeClass();

        var option =  ScriptOptions.Default
                .AddImports("System");
        var code = File.ReadAllText(scriptpath);
        var script = CSharpScript.Create(code, option, typeof(HogeClass));
        await Task.Run(() => { script.RunAsync(hoge); });
    }
}
```
C++/CLIでWCFによるプロセス間通信

時代遅れな話かもしれませんが、ググっても意外とサンプルが無かったのでここに記録しておきます。
といっても、C#のサンプルをC++/CLIに翻訳すればDONEです。

## サンプルの説明
例として、ホストAとクライアントBのプロセス間通信を考えます。
クライアントBから、ホストAのメソッド`void SetName(String^ name)`を実行するものとします。
この時、引数`name`がクライアントBからホストAへリモートで伝送されます。

## 実装
上記サンプルの実装を示します。

### ホスト側
* Contractのインターフェース`INamable`です

```cpp:IContract.h
#pragma once
using namespace System;
using namespace System::ServiceModel;

[ServiceContract]
interface class INamable
{
  [OperationContract]
  void SetName(String^ name);
};
```

Contractとするインターフェースに`[ServiceContract]`属性、メソッドに`[OperationContract]`属性を付けてあげます。

* `INamable`の実装`Dog`です

```cpp:Dog.h
#include "INamable.h"
ref class Dog : public INamable
{
public:
  Dog();
  virtual void SetName(String^ name)
  {
    myName = name;
    Console::WriteLine(myName + ": I'm Max!");
  }
private:
  String^ myName;
};
```

リモートで実行したいメソッドを含むクラスに、先のContract `INamable`を実装してあげます。

* ホストプログラムのメイン関数です

```cpp:main.c
#include "Dog.h"

int main()
{
  ServiceHost^ host = gcnew ServiceHost(
    Dog::typeid,
    gcnew System::Uri("net.pipe://localhost")
  );
  host->AddServiceEndpoint(
    INamable::typeid,
    gcnew NetNamedPipeBinding(),
    "naming"
  );
  host->Open();
  Console::ReadLine(); // Wait for a name
  return 0;
}
```

`ServiceHost`を実装したクラス`Dog`で、`EndPoint`をインターフェースクラス`INamable`で、それぞれ定義してあげます。
今回は通信方法に名前付きパイプを使用していますが、ここの宣言を変えてあげれば、TCPやHTTPによる通信も可能なようです。
ここで`ReadLine()`はプログラムの終了を防ぐためだけに例として実行したものであり、実際は`host->Open()`したあとは、好きに他の処理を実行して構いません。
次節で実装するクライアントから呼び出されれば、`SetName()`が実行されます。
（[IOスレッドプールで実行されるようです。](http://stackoverflow.com/questions/9323443/does-wcf-service-use-multiple-threads-to-process-incoming-requests)）

### クライアント側
クライアント側では、ホスト側で宣言したインターフェースクラスを流用します。

```cpp:main.c
#include "INamable.h"

using namespace System;
using namespace System::ServiceModel;

int main()
{
  ChannelFactory<INamable^>^ pipeFactory =
    gcnew ChannelFactory<INamable^>(
      gcnew NetNamedPipeBinding(),
      gcnew EndpointAddress("net.pipe://localhost/naming")
      );
  INamable^ naming_if = pipeFactory->CreateChannel();
  naming_if->SetName("Wofly");
  return 0;
}
```

`ChannelFactory`で、ホストへのチャンネルを作成するためのファクトリーを作成します。
`EndpointAddress`は、`net.pipe://localhost`の末尾にホスト側でEndpointを作成する際に引数へ入れた`"naming"`を付加します。
`ChannelFactory->CreateChannel()`で、ホストへの通信路となるインスタンスを作成できます。
実用的にはこの返り値をメンバ変数などで保持することになるでしょう。
あとは、このインスタンスから`INamable`で宣言されたメソッドを呼び出せば、ホスト側の操作をできることになります。

ホストを起動した後に、クライアントを起動してみて下さい。
ホスト側にメッセージが表示されましたか？
おめでとうございます。基本的なプロセス間通信はこれで達成です！

## 終わりに
VC++でプロセス間通信せざるを得ない状況になったので、色々調査した結果WCFが最適解だろうという結論に至りました。
これならC#.NETとも簡単に連携できて、便利ですね。
しかしC++/CLIは慣れてないせいか、パット見`^`だの`gcnew`だのと違和感マシマシな感じです。
それでも標準のCやC++と簡単に連携できるのは、C#よりも良いところですね。
控えめに　使っていきたい　C++/CLI（字余り）　以上。
JavaScript リニアサーチとバイナリサーチ

JavaScriptで表す線形探索(リニアサーチ)と二分探索（バイナリサーチ）

#線形探索(リニアサーチ)
**「先頭から順番に探す値が見つかるまで探す方法」**
配列を直線的（リニア）に探すので「リニアサーチ」と呼ばれる。
値をひとつひとつ調べていくので、データが大量になると時間がかかってしまう。

**手順**
1 先頭から末尾まで順番に値を調べる。
2 「調べた値」と「探す値」が同じならサーチ終了。

**JavaScript**

```script.js
//検索する配列データ
var a = [1,3,10,2,8];

//検索する値
var searchValue = 2;

//「調べた値」と「探す値」が一致したとき、indexを保存する変数。
//初期値はエラー(-1)に設定
var index = -1;

//繰り返し処理　
for(var i=0; i< a.length;i++){
    //条件分岐 「調べた値」と「探す値」が一致したとにきにindexを保存して処理終了
    if(a[i] == searchValue){
        index = i;
        break;
    }
}
//検索結果を表示する。(-1の場合は値がなかった)
console.log(a[index]);

```

#二分探索(バイナリサーチ)
**「調べる範囲を半分に絞りながら探す方法」**
範囲を「二つ(バイナリ)に分けて」探すので「バイナリサーチ」と呼ばれる。
データがばらばらに並んでいると規則性がないので、あらかじめデータを順番に並べておく必要がある。

**手順**
前提 値が順番に並んでいる
1 調べる範囲の左端と右端を決める
2 真ん中の位置を求める
(真ん中の値が「探す値」と一致したら処理終了)
3 真ん中の値が「探す値」より小さければ左端を移動する
(左側にはもっと小さい値しかないので、調べる必要がない)
4 真ん中の値が「探す値」より大きければ右端を移動する
(右側にはもっと大きい値しかないので、調べる必要がない)
5 調べる左端と右端の間にデータがある間は1~4の処理を繰り返す


**JavaScript**

```script.js
//検索するソート済みの配列データ
var a = [1,2,4,5,10];

//探す値
var searchValue = 1;

//
//「調べた値」と「探す値」が一致したとき、indexを保存する変数。
//初期値はエラー(-1)に設定
var index = -1;

//調べる左端を表す添字(index)
var left = 0;

//調べる右端を表す添字(index)
var right = a.length-1;

//左端と右端にデータがある間は処理を繰り返す
while(left <= right){

    //左右の真ん中を表す添字(index)
    middle =Math.floor((left +right)/2);

    //真ん中の値と探す値を比較する
    if(a[middle]==searchValue){
        //一致した場合、変数に入れて処理終了
        index = middle;
        break;
    }else if(a[middle]<searchValue){
        //探す値より小さい場合、左側にはもっと小さい値しかないので左端の値を真ん中の値の右に移動する
        left = middle +1;
    }else{
        //探す値より大きい場合、右側にはもっと大きい値しかないので右端の値を真ん中の値の左に移動する
        right = middle -1;
    }
}

//検索結果を表示する。(-1の場合は値がなかった)
console.log(a[index]);

```

**補足**
配列の真ん中の値は左端と右端を足して2で割ると求めることができるが、奇数の場合少数点以下を切り捨てる処理が必要になる。
JavaScriptでは`Math.floor()`で少数点切り捨てになる。
fitbitのデータをサーバーから取得したやつをグラフにするやつ

# 概要
- 以下の記事で作成したプログラムと同じディレクトリで実行するやつ
- http://qiita.com/tano/items/fcccd96a775017caa2b4
- Jupyter(iPython Notebook)で実行するプログラム
- 目的は「指定した日付の頻度のデータをグラフにプロットする」
- Fitbitはどうやら，１秒，１分，１５分の三種類しかローカルに保存できない

# コード

```py

%matplotlib inline
import os
import sys
import numpy as np
import pandas as pd
import plotly
import matplotlib.pyplot as plt
plotly.offline.init_notebook_mode(connected=False)

#プロットする頻度と日付の指定
FREQ = '1sec' #1sec,1min,15min
DATE = '2017-01-29' #YYYY-MM-DD

#頻度と日付からファイル名とディレクトリパスを生成
#指定した頻度でない場合，異常終了
#相対パスが正しくない場合，修正
FILE = './HR_%s_%s.csv' % ( DATE, FREQ )
DIR = './%s' % FREQ
if not FREQ in {'1sec','1min','15min'}:sys.exit(1)
if not os.path.exists(DIR):DIR = '.%s' % DIR

#作業ディレクトリをDIRに移動
#FILEが存在しない場合，異常終了
os.chdir(DIR)
if not os.path.exists(FILE):sys.exit(1)

#CSVファイルを読み込み，グラフをプロット
raw = pd.read_csv(FILE,header=None,skiprows=1,names=['Time','HR'])
data = [ plotly.graph_objs.Scatter(x=raw['Time'], y=raw['HR'], name='test') ]
fig = plotly.graph_objs.Figure(data=data)
plotly.offline.iplot(fig)

```
# 実行
- ターミナルとかで「 jupyter notebook」や「ipython notebook」でJupyterを起動（先にcdコマンドでデータが格納されているディレクトリに移動しておくと楽）
- Jupyterのホーム画面でNewをクリックしてPython2のNotebookを作成
- 上記のコードを実行
- グラフが出る
- FREQとDATEでデータ頻度と日付を指定する（事前にクラウドからデータを取得しておいてください）

---
あとから編集予定です
異なるサイズのディスクイメージを dd で書き出した場合のリカバリー方法（GPT篇）

# はじめに
　私は、Asus FlipというChromeBookを使っていますが、この機種用にKaliLinuxのUSB(もしくはSD）ブートイメージが公開されています。8GbのUSBメモリー用のものです。
　これは、公式サイトの説明にもあるように、以下のようにしてUSBディスクに書き出して使います。

```
xzcatt kali-$version-veyron.img.xz | dd of=/dev/sdb bs=512k
```

　ディスクイメージは、ChromeOSの拡張GPTテーブルに対応したもので、パーテション１にブートイメージ、パーティション２にルートシステムと、２つのパーティションから構成されています。
　さてこのddを、異なるサイズのディスクに対して実行すると、どうなるでしょうか。

# 実験の結果
　たとえば、64GbのSDに対してこれを実行してみます。
　当たり前ですが、GPTディスクのセカンダリーGPTヘッダが不正な位置に書き込まれて、正常な状態にはなりません。
　もちろん、これは簡単に修復できます。

```
cgpt repair /dev/mmcblk1
```

　などと実行すれば、セカンダリーGPTヘッダが修復されて、正常に戻ります。
　これで終わりならば、そもそもこういう文書を投稿する意味もないのですが、実はさにあらず。
　上記で修復されて、確かに正常な状態に戻るのですが、この正常は、少しばかり悲しい正常なのです。
　なぜなら、64Gbの容量がありながら、全体を8GbのディスクとしてGPTが認識しているからです。

　cgptのrepairオプションで、ディスク容量も正常に書き換えてくれれば、こういう悲しいことにはならないのですが、どうもそのようなオプションは無いようです。
　では、他のコマンド、たとえばgdiskで修復したらどうでしょうか。
　実は、これをやるとさらに悲惨なことになります。
　gdiskは、不正なGPTを修復するにあたり、そこに書かれたすべての情報が不正だとみなし、一から新しいGPTを作成してしまいます。つまり、ディスクは初期化した状態となってしまいます。
　こういう状態に陥ったディスクは、どうやって修復するのだろう、といろいろ試してみました。
　もちろん、sgdiskはダメでした。また、GPTに対応済みのfdisk, sfdiskもダメでした。
　高度なオプションを駆使すれば、こうしたツールでも修復できるのかもしれませんが、私には分かりませんでした。

# 結論
　実は、簡単に修復できるツールがあります。
　gpartedです。
　起動すると、「このディスクは、容量を目一杯使えない設定になっているが、使えるようにするか？」と、聞いてきます。ここで、OKすると、GPTを修正して、64Gbまで使えるように修復してくれます。ただし、セカンダリーGPTの修復は、あらかじめcgptコマンドで済ませておく必要があります。

　もし、対象ディスクが一般的なGPTディスクならば、これで処理は終わりです。
　しかし、ChromeOS拡張に対応したGPTディスクの場合は、もうひと仕事必要です。

　実はgpartedは、非常にうまくディスクを修復してくれますが、ChromeOS拡張などというのは認識しません。
　つまり、priority, tries, successfulのパラメータを、すべて破壊してくれます。
　ということで、これらをcgptで復元する必要があります。パーティション情報のバックアップは、こういう時のために必要です。まあ、適当にブートできるような値を設定して、問題がなければそれでもいいのですが。

　つまり、最初からまとめますと、
　cgptによるセカンダリーGPTヘッダの修復 → gpartedによるディスク容量の修復 → cgptによるブート制御フラグの修復、ということになります。

　私は、64Gbのディスクを4つのパーティションに分割したかったのです。
　p1:kali-boot, p2:kali-root, p3:crouton(ubuntu), p4:data
　ということで、64Gbのディスクにkali8Gbイメージをわざと無理に書き込んだのです。

　もちろん、修復方法については、最初から知っていましたが。
Clean Architectureで分からなかったところを整理する

ちょっと前に[iOS allstars2に参加して知った](http://www.slideshare.net/kenjitanaka58/vcmodel)Clean Architecture(クリーンアーキテクチャ)が、最初はなるほどすげえなーと思っていたものの、ちょっと改めて調べてたら少し迷子になったので自分のために色々整理してみる。


# そもそもクリーンアーキテクチャの前に
クリーンアーキテクチャのことを書いているエントリーを見るとよくMVC, MVVMなどのアーキテクチャとの比較があるが、一緒に丸が４層になった絵が出てくる。（本家は[こちら](https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html)ですが、[日本語訳をされた方](http://blog.tai2.net/the_clean_architecture.html)のエントリもある。）
![Kobito.cvu7Go.png](https://qiita-image-store.s3.amazonaws.com/0/60457/8fe4c366-466e-e44c-a7a6-f3a743f69183.png)

自分はいきなりこの絵をみても何のことやらだった。が、この絵はオニオンアーキテクチャ、ヘキサゴナルアーキテクチャを知ると理解できた。

## ヘキサゴナルアーキテクチャ (Hexagonal Architecture)
ヘキサゴナルアーキテクチャは、伝統的なMVC, MVVMなどのレイヤード（階層）アーキテクチャからの転換を試みたものだと理解している。
![Kobito.RlZPfJ.png](https://qiita-image-store.s3.amazonaws.com/0/60457/e68ec7ad-c3cc-77cd-f528-fb9e3bdfa04e.png )

伝統的なレイヤードアーキテクチャの説明でよくある「左のUIから右のData Storeに（あるいは上から下に）情報が流れていく」ような考え方ではなく、システムを「内側（application）と外側（infrastructure）」に区切り、UIも外側、DBも外側、サーバへの通信も外側と見なし、外→内→外と流れて行くのだ！という考え。

基本的にこの外→内→外を理解できるとあとは楽。

## オニオンアーキテクチャ (Onion Architecture)
で、このヘキサゴナルアーキテクチャの思想を踏まえつつ、より実用的に内外の階層の分離を試みたのが[オニオンアーキテクチャ](http://jeffreypalermo.com/blog/the-onion-architecture-part-1/)になる。
![Kobito.8cx0zc.png](https://qiita-image-store.s3.amazonaws.com/0/60457/b4ba6d02-7817-f2fe-91ab-d26984f853a8.png)

ヘキサゴナルアーキテクチャでapplicationとなっていた部分を、Applications Service, Domain Service, Domain Modelに分解している。ただ、それらの３つが何を担当するのかはあまり明確ではない。（少なくともブログでは）

## クリーンアーキテクチャ (Clean Architecture)
おそらくオニオンアーキテクチャと目的はほぼほぼ一緒だが、各コンポーネントの役割、DTOやデータベースのレコードデータをどこまで跨いで使うべきかなどがより明確に提案されている。なので実装する際にはオニオンアーキテクチャよりもクリーンアーキテクチャの情報をベースにしたほうが良いだろう。

具体的な実装例やMVCなどとの比較はすでに良いエントリがあるので割愛。参考にあるqiitaのエントリを参照。

# まだ理解不足なところ
### 1) クリーンアーキテクチャの絵の右下にあるフロー図の理解。
Input port/Output portはヘキサゴナルアーキテクチャの影響を受けている部分と思われるが、この図には一方通行の矢印しかない。ということは、例えば、「UI→Use case→外部サーバ通信」という処理を行う場合、 **サーバの応答** を処理する際にも「サーバレスポンス→Use case→UI」という流れで右下のフローに従え、と言っているのではないか？その場合のクラス構成って？まぁ、サンプル作ったらスッキリしそうだけど時間が足りないのでもう少し先になりそう。

（追記： [こちらの別エントリ](https://qiita.com/gki/items/f601afbfada85fd8624e)で考えを整理しました。）

### 2) DDD
Use Caseをどういった範囲で区切るべきか、Entityにメソッドを持たせるかただのValue Objectにするべきかは設計者に委ねられている。なので途中まで読んで積ん読になっているエヴァンスのDDD本を読まないといけない。そうしないと森で迷子になってしまう。

### 3) アプリケーション全体での関心事
もともとはiOSのイベントで知ったこともあるのでスマホアプリベースで考えてしまうが、スマホアプリの場合、wifi切れるとか、バックグラウンドに行ったとか、アプリケーション全体での関心事がいくつか存在すると思っている。その場合の対応の仕方をどこかで整理しておきたい。 ~~おそらく外→内→外の部分は変わらず、内→外の箇所でどうやって「全体への周知」を行うか。ま、単純なcallbackではないような気はしている。~~
考えを整理したら単純な外→内→外で大丈夫そうだった。
（追記： [こちらの別エントリ#3](https://qiita.com/gki/items/ee4a49a881e577c6dfd5)で考えを整理しました。）

---
参考

クリーンアーキテクチャ
https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
http://blog.tai2.net/the_clean_architecture.html
http://dev.classmethod.jp/smartphone/iphone/event-report-ios-all-stars-2/
http://qiita.com/kondei/items/41c28674c1bfd4156186

オニオンアーキテクチャ
http://jeffreypalermo.com/blog/the-onion-architecture-part-1/
https://www.infoq.com/jp/news/2014/11/ddd-onion-architecture

ヘキサゴナルアーキテクチャ
http://blog.tai2.net/hexagonal_architexture.html
fitbitのデータをサーバーから取得するやつ

# 概要
- fitbitのサーバー上に保存されたデータをローカルに保存するやつ
- 言語はPython，2.7.10で動作の確認した
- 各種環境を整えることに関しては，以下記事を参考にしてほしい
- http://qiita.com/fujit33/items/2af7c4afdb4e07601def

# コード
- 概要のURLを参考に「USER_ID」「CLIENT_SECRET」「ACCESS_TOKEN」「REFRESH_TOKEN」をメモしておき，それぞれ「各自」の文字に置き換える

```py
# -*- coding: utf-8 -*-
import sys
import os
import fitbit
import gather_keys_oauth2 as Oauth2

# コマンドライン引数の数で分岐（２以外なら終了）
if not len(sys.argv) == 2: sys.exit(1)

# 変数の宣言及び日付，データの頻度，ディレクトリ，ファイル名の生成
DATE = sys.argv[1]
FREQS = ['1sec','1min','15min']
DIRS={}
FILES={}
for FREQ in FREQS:
	DIRS[FREQ] = './%s' % FREQ
	FILES[FREQ] = 'HR_%s_%s.csv' % ( DATE, FREQ )

# ディレクトリが存在しない場合，ディレクトリ作成
for FREQ in FREQS:
	if not os.path.exists(DIRS[FREQ]):os.mkdir(FREQ)

# 固有情報，認証サーバーに接続及び認証処理
USER_ID = '各自'
CLIENT_SECRET = '各自'
ACCESS_TOKEN = '各自'
REFRESH_TOKEN = '各自'
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)

# データの取得
fitbit_stats = {}
stats = {}
for FREQ in FREQS:
	fitbit_stats[FREQ] = auth2_client.intraday_time_series('activities/heart', DATE, detail_level=FREQ)
	stats[FREQ] = fitbit_stats[FREQ]['activities-heart-intraday']['dataset']

# CSVファイルの生成及びファイルの保存
for FREQ in FREQS:
	os.chdir(DIRS[FREQ]) # 各ディレクトリに移動
	csv_file = open(FILES[FREQ],'w')
	for var in range(0, len(stats[FREQ])):
		csv_file.write(stats[FREQ][var]['time'])
		csv_file.write(",")
		csv_file.write(str(stats[FREQ][var]['value']))
		csv_file.write("\n")
	csv_file.close()
	os.chdir('..') # 一つ上のディレクトリに移動
```

# 解説
- あとで編集予定です

# 結果
- FitbitのAPI内の「fitbit」，「gather_keys_oauth2.py」，「gather_keys_oauth2.pyc」をソースコードと同じディレクトリにコピー
- python ファイル名.py 2017-02-01　で実行
- 実行ディレクトリに「1sec」「1min」「15min」という名前のディレクトリが作成され，各ディレクトリに，指定した日付のデータがそれぞれ保存される


# 参考
- 心拍を取得するコードは以下のページを参考にしました．
- http://shima-nigoro.hatenablog.jp/entry/2016/05/29/181309

初投稿です．助言や補足などがあれば指摘をお願いします．
プロセスを切る

## :cat:プロセスを切る

### サーバー上で以下を実行
`$ sudo netstat -ntlp`

```
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      15502/python
tcp6       0      0 :::111                  :::*                    LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 ::1:25                  :::*                    LISTEN      -
```

#### 探していた`python`のジョブを発見!! PIDがのっているので`kill`:beer:
`$ kill -9 15502`



#### もしくは別の方法で、以下のコマンドで探す
`$ ps aux grep | python`
`python` のところは各人が起動していると思っているジョブを入力

PID名が出るので`kill`:beer:

#### これでもPIDが出ない場合

ポートから探す
`$ lsof -i -P | grep 8000`

PID名が出るので今度こそ`kill` :tada:
確率ロボティクス 練習問題回答 2-1

# 問.
- 0〜3[m]の範囲を計測可能なセンサを前方に搭載したロボット
- センサは故障すると常に1[m]未満の値を出力する
- 障害物がロボットの前方0〜3[m]の間で一様ランダムに出現する
- センサが壊れている確率は1[%]だと知っている

以上の条件において，ロボットが$N$回障害物を計測したところ，全て1[m]未満の値となった．センサが壊れている確率を定式化し，$N=1〜10$の範囲で事後確率を計算せよ

# 答.
$p(A)$ : センサの出力が1[m]未満となる確率
$p(B)$ : センサが壊れている(事前)確率
$p(A|B)$ : センサが壊れているとき，出力が1[m]未満となる確率
$p(B|A)$ : 出力が1[m]未満のとき，センサが壊れている(事後)確率 

**ベイズの定理**より，
$$p(B|A) = \frac{p(A|B) p(B)}{p(A)}$$
である．上記の確率が全て確定すれば答えが出る．

まず，センサの出力が1[m]未満となる確率$p(A)$は，センサが正常で障害物が1[m]未満にある確率と，センサが壊れている確率の合算なので，

$$p(A) = \frac{99}{100} \cdot \frac{1}{3} + \frac{1}{100}$$

次に，センサが壊れている(事前)確率$p(B)$は，問題文より，
$$p(B) = \frac{1}{100}$$

センサが壊れているとき，出力が1[m]未満となる確率$p(A|B)$はこれも問題文より，
$$p(A|B) = 1$$

以上の結果をベイズの定理に代入することで，出力が1[m]未満のとき，センサが壊れている(事後)確率$p(B|A)$を得る．

```math
\begin{align}
p(B|A) &= \frac{p(A|B) p(B)}{p(A)} \\
&= \frac{1 \cdot \frac{1}{100}}{\frac{99}{100} \cdot \frac{1}{3} + \frac{1}{100}} \\
&= \frac{1}{34} \fallingdotseq 2.9[\%]
\end{align}
```


これが$N=1$のとき．
続けて$N=2$のときを計算するとき$N=1$で算出した結果を元に計算する．すると，$p(A)$の値と$p(B)$の値が変化する．これを **ベイズ更新**と言う．

$N=2$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{1}{34}}{\frac{33}{34} \cdot \frac{1}{3} + \frac{1}{34}} \\
&= \frac{1}{12} \fallingdotseq 8.3[\%]
\end{align}
```

$N=3$のとき，

```math	
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{1}{12}}{\frac{11}{12} \cdot \frac{1}{3} + \frac{1}{12}} \\
&= \frac{3}{14} \fallingdotseq 21[\%]
\end{align}
```

$N=4$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{3}{14}}{\frac{11}{14} \cdot \frac{1}{3} + \frac{3}{14}} \\
&= \frac{9}{20} \fallingdotseq 45[\%]
\end{align}
```

$N=5$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{9}{20}}{\frac{11}{20} \cdot \frac{1}{3} + \frac{9}{20}} \\
&= \frac{27}{38} \fallingdotseq 71[\%]
\end{align}
```

$N=6$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{27}{38}}{\frac{11}{38} \cdot \frac{1}{3} + \frac{27}{38}} \\
&= \frac{81}{92} \fallingdotseq 88[\%]
\end{align}
```

$N=7$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{81}{92}}{\frac{11}{92} \cdot \frac{1}{3} + \frac{81}{92}} \\
&= \frac{243}{254} \fallingdotseq 96[\%]
\end{align}
```

$N=8$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{243}{254}}{\frac{11}{254} \cdot \frac{1}{3} + \frac{243}{254}} \\
&= \frac{729}{740} \fallingdotseq 99[\%]
\end{align}
```

$N=9$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{729}{740}}{\frac{11}{740} \cdot \frac{1}{3} + \frac{729}{740}} \\
&= \frac{2187}{2198} \fallingdotseq 100[\%]
\end{align}
```

$N=10$のとき，

```math
\begin{align}
p(B|A) &= \frac{1 \cdot \frac{2187}{2198}}{\frac{11}{2198} \cdot \frac{1}{3} + \frac{2187}{2198}} \\
&= \frac{6561}{6572} \fallingdotseq 100[\%]
\end{align}
```
vimでインサートモードを抜ける時のあれ（Hammerspoon版その2）

[IntelliJとかJVMのIDE使いでもKarabinerなしでバックスラッシュを片手入力したい](http://qiita.com/tanakahisateru/items/d8a67ad89c07baf8c0da)
上記を参考に `eventtap` を使ってみる。


## 前準備

[vimでインサートモードを抜ける時のあれ（Hammerspoon版）](http://qiita.com/oppara/items/1405216a3c13c4cc05f5#%E5%89%8D%E6%BA%96%E5%82%99)を参照

## init.lua

```lua:init.lua
local VK_ESC = 53
local VK_LEFT_BRACKET = 33

local function switchToUs()
    local cmd = '/usr/local/bin/keyboardSwitcher select U.S.'
    os.execute(cmd)
    -- hs.console.printStyledtext(cmd)
end


function flagsMatches(flags, modifiers)
    local set = {}
    for _, i in ipairs(modifiers) do set[string.lower(i)] = true end
    for _, j in ipairs({'fn', 'cmd', 'ctrl', 'alt', 'shift'}) do
        if set[j] ~= flags[j] then return false end
    end
    return true
end


keyEventtap = hs.eventtap.new({
    hs.eventtap.event.types.keyDown
}, function(event)
    local keyCode = event:getKeyCode()
    local flags = event:getFlags()
    -- hs.console.printStyledtext(keyCode)

    if keyCode == VK_ESC then
        switchToUs()
    end

    if keyCode == VK_LEFT_BRACKET then
        if flagsMatches(flags, {'ctrl'}) then
            switchToUs()
        end
    end
end)

local function handleGlobalEvent(name, event, app)
    if event == hs.application.watcher.activated then
        local bundleId = string.lower(app.frontmostApplication():bundleID())
        if bundleId == 'com.apple.terminal' then
            keyEventtap:start()
        else
            keyEventtap:stop()
        end
    end
end
watcher = hs.application.watcher.new(handleGlobalEvent)
watcher:start()
```

## 結果
`esc` にも対応できて概ね満足:smile:
今さらだけどS3のライフサイクルを試してみた。

# はじめに
前回、「[今さらだけどS3のバージョニングを試してみた。](http://qiita.com/kooohei/items/8775b380632e8b7940a3)」でS3のバージョニング機能を試してみました。
ですがこのままだとずーっと古いバージョンのオブジェクトが残り続けてしまいます。。。
ということで次はS3のライフサイクル管理を設定してみることにします。

# 設定
バケットの [プロパティ] で表示される**「ライフサイクル」**を開き**「+ルールを追加する」**をクリックします。
![s3-lifecycle-delete01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/79a5c81b-53de-73d6-b9a0-947d8a1ebdf1.png)

##### **ステップ１：ルールターゲットの選択**
**ライフサイクルルール**の設定にステップになるので**「次のルールを適用」**の**「バケット全体」**にチェックし**「ルールの設定>」**をクリックします。
![s3-lifecycle-delete02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/40d2edae-ccae-7ece-dbe9-2d97671ba9b0.png)

##### **ステップ２：ルールの設定**
今回は**「以前のバージョンの操作」**の完全にチェックし、日数を**「1日」**にして**「確認」**をクリックします。
![s3-lifecycle-delete03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/e78c2e86-1765-878d-d5dc-ead8c4b9612c.png)

##### **ステップ３：確認と名前**
**「ルール名」**を入力し**「ルールの作成と有効化」**をクリックして完了です。
![s3-lifecycle-delete04.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6646671e-eeef-3cb3-1d8a-c63bff34dabc.png)

するとライフサイクルに作成したルールがリストされているのが確認できます。
![s3-lifecycle-delete05.png](https://qiita-image-store.s3.amazonaws.com/0/82090/afcfb233-87bc-702e-f965-edb3dabd9f12.png)


# 実行結果
とりあえず分かりやすいように何度か同じファイルをアップロードして複数バージョン用意しました。
今回の設定の場合、1日後には削除されているはずです。
![lifecycle20170130001029.png](https://qiita-image-store.s3.amazonaws.com/0/82090/e7ff9d6e-ad38-1888-0f1a-3002b5f78c19.png)

翌日。。。
![lifecycle20170131133141.png](https://qiita-image-store.s3.amazonaws.com/0/82090/12d9c1be-113f-051a-5997-37aef1db1371.png)

最新のもの以外はすっかり削除されているのが確認できました。


# おわりに
バージョニング機能だけだと古いオブジェクトが残り続けるという課題がありましたが、ライフサイクル機能も一緒に設定してあげることで古いバージョンをいちいち手動で削除する必要がなくなりました。
これで**「誤削除防止」**と**「古いバージョンの消し忘れ」**への対応が完了です。
モジュールの特異メソッドを上書きする、しかもローカル変数を使って。

# TL;DR
モジュールFooに定義した特異メソッドbarを上書きしたい場合は、

```ruby
Foo.module_exec do
  define_singleton_method(:hoge) do
    'overriden'
  end
end
```
とすればよい。
また、

```ruby
fuga = 'hoge'

Foo.module_exec(fuga) do |arg|
  define_singleton_method(:hoge) do
    arg
  end
end
```
とすれば、モジュール外のローカル変数をメソッド定義の中で使うこともできる。(こういうのがクロージャというんでしょうか？)

# モジュールの特異メソッドを上書きする、しかもローカル変数を使って。

## モジュールの特異メソッドをスタブしたかった
includeしたりextendしたりするためでなく、単にユーティリティ関数みたいなメソッドを集めたモジュールを作ることがあると思います。Mathモジュールのようなイメージです。
そういったモジュールは

```ruby:foo.rb
module Foo
  def self.bar
    'bar' * rand(1..10) 
  end
end 
```

といったようにモジュールに特異メソッドをもたせます。

このメソッドはランダム要素があるため、呼び出されるたびに結果が変わりえます。
RSpecでユニットテストを書く際、このメソッドを決まった返り値を返すようにスタブしたいと思った場合はどうするでしょうか？
単純に

```ruby:foo_spec.rb
before do
  allow(Foo).to receive(:bar).and_return('barbarbar')
end
```
としてやればOKです。


## 引数を取る場合
では、メソッドが引数を取る場合はどうでしょうか。

```ruby:fooo.rb
module Fooo
  def self.baar(arg)
    arg * rand(1..10)
  end
end
```
メソッドがいくつか異なる引数で呼ばれ、それぞれ違う結果を返すようにスタブしたい場合はどうしたらいいでしょうか?(スタブという言葉の使い方が間違っているかもしれません><)

```ruby:fooo_spec.rb
let(:arg1) { 'hoge' }
let(:expected_return1) { 'hogehoge' }
# Fooo.baar('hoge') は必ず 'hogehoge' を返してほしい

let(:arg2) { 'fuga' }
let(:expected_return2) { 'fugafugafugafuga' }
# Fooo.baar('fuga') は必ず 'fugafugafugafuga' を返してほしい
```
まず、単純にこれを考えます。

```ruby:fooo_spec.rb
before do
  allow(Foo).to receive(:baar).with('hoge').and_return('hogehoge')
  allow(Foo).to receive(:baar).with('fuga').and_return('fugafugafugafuga')
end
```
あとで試したところ、全然これでよかったのですが、、なぜかこれがうまく動かないときがありました。
typoしてただけなのかもしれませんが、てっきり複数のallowはダメだと思いこんでしまい…
そこでモンキーパッチしてモジュール自体を書き換えようと思いました。

```ruby:fooo_spec.rb
module Fooo
  def self.baar(arg)
    if arg == 'hoge'
      'hogehoge'
    elsif arg == 'fuga'
      'fugafugafugafuga'
    else
      raise
    end
  end
end
```

## 外部の変数を使ってメソッドを定義したい
しかし、これだとせっかく期待する引数と返り値をletで宣言的に定義した意味がありません。
かといって、当然

```ruby:fooo_spec.rb
let(:arg1) { 'hoge' }
let(:expected_return1) { 'hogehoge' }

let(:arg2) { 'fuga' }
let(:expected_return2) { 'fugafugafugafuga' }

module Fooo
  def self.baar(arg)
    if arg == arg1
      expected_return1
    elsif arg == arg2
      expected_return2
    else
      raise
    end
  end
end
```
としてもだめです。`module`や`def`はスコープを作るので、外のローカル変数は参照できないからです。

Rubyには、スコープを作らずにクラスやモジュールの中に入れる`xxxx_eval`系メソッド、同じくスコープを作らずにメソッドを定義できる`define_method`系メソッドがあります。それらを使えば望みどおりのことができました。

```ruby:fooo_spec.rb
let(:arg1) { 'hoge' }
let(:expected_return1) { 'hogehoge' }

let(:arg2) { 'fuga' }
let(:expected_return2) { 'fugafugafugafuga' }

Fooo.module_exec(arg1, arg2, expected_return1, expected_return2) do |a1, a2, r1, r2|
  define_singleton_method(:baar) do |arg|
    if arg == a1
      r1
    elsif arg == a2
      r2
    else
      raise
    end
  end
end
```
モジュールに対して`module_exec`を適用すると、引数に渡した変数への参照をもちつつモジュール定義の中にはいることができます。
`module_exec`メソッドに渡すブロックの中に実行したい処理を記述します。(ブロック引数がさきほど`module_exec`に渡した引数に対応)

また、`define_singleton_method`メソッドは、引数に渡した文字列・シンボルを名前にした特異メソッドを定義します。メソッドの中身はブロックで渡します。
こちらは全くスコープを作らないので、そのまま`a1, a2`といった変数が参照できています。

ちなみに、自分のブログにものせてます→[リンク](https://awakara.blogspot.jp/2017/02/blog-post.html)
iOS - UIButtonを押してUITextFieldの文字を一発で消す方法

# 参考 

[how to erase or clear UITextField](http://stackoverflow.com/questions/23151808/how-to-erase-or-clear-uitextfield)

# 環境

- Xcode8 
- Xcode7でも大丈夫
- Swift 3でも大丈夫
- 2.3でも大丈夫
- ObjectivCでも大丈夫

# 手順

UITextFieldにあらかじめ入力されている文字を、UIButtonを押したら一発で全部消えるようにしたかったです。簡単に出来ました、から文字を代入するだけです。一応、実装の方法を説明すると、まずUIButtonとUITextFieldを用意します。

UITextFieldをOutletで参照できるように定義して、UIButtonをActionメソッドで定義します。UITextFieldあらかじめ文字を入れておいて、UIButtonのアクションメソッドの中に `UITextField名.text = ""`みたいな感じで空文字を代入しておけば、UIButtonをタップしたらUITextFieldの文字が全部消えます


# 実装

```:ViewController

import UIKit

class ViewController: UIViewController {
    
　　　　　　　//テキストフィールドをoutletで定義する
    @IBOutlet var textDelet: UITextField!
    
    
    //文字を消すボタンを押した時の処理
    @IBAction func goneButton(_ sender: UIButton) {
        
     //空文字を代入するので消えます
     textDelet.text = ""
            
    }
    

    @IBAction func tapGreen(_ sender: UIButton) {
        
        view.backgroundColor = UIColor.green
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
　　　　　　　　　　　　　　　//あらかじめテキストフィールドに表示しておく文字
        textDelet.text = "text"
        
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


```
素人のpython環境設定(MAC用)　作成中

#始めに
　本当の初心者がわかるようにpythonの設定順序を書いて見る。ただし、ターミナル(なんか黒い画面)ぐらいは知っている程度の知識は前提とする。deeplearningのためにtensorflowを設定する用だけど、ライブラリの設定ができるレベルを目指す。
　というか、macbookProを購入して、再構築している自分のメモ書き。

#homebrew
　インストールやら、設定やらと便利にやってくれるやつ。
ここから。　http://brew.sh/index_ja.html
`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
　でも良いみたい。
#pyenvとpyenv-virtualenv
　pythonを使う時には、システムとして使用している部分と、自分でがりがり動かす部分とで区別して使用した方が良いらしいので、pythonを管理するためのツールを入れておく。がんばって仕事をしている人の邪魔をしてはいけない。詳細の説明はしない。
`$ brew install pyenv-virtualenv`
でまとめて入るみたい。
##PATHの設定
　素人がよくわからなかったりする部分なので詳しく記載する。pythonを入れたとしても、入れたプログラムがどこにあるのかを指定しておかないと、どこに行ったのかわからなくなって動かす時に困るという良くある話。
1. 設定ファイルを作る
　`.bash_profile`にPATHの設定内容を記載するらしいが、新しいMACだと無かったりするので作るところから。`cd`やら`ls`で確認して、`$ touch .bash_profile`で作成。場所はユーザーのフォルダ直下。
　(参考)　http://motomichi-works.hatenablog.com/entry/2016/03/02/103207
　注意点として、Finderからは通常見られないので表示させることが必要。　[Macのキーボードショートカットで隠しファイルや隠しフォルダを表示する隠れ技 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-in-open-save-dialog-in-mac-os-easily.html)
２. PATHの設定
　どこにpython自体(プログラム言語だってプログラムだからね。)やライブラリのフォルダを作成するのかということらしいが、下の2種類の流派があるようだ。　
上の方が公式での説明に近いけれど、linuxの本来のディレクトリ構造のあり方としては下のほうが、玄人にはしっくりくるのかもしれない。mac内でデフォルトで設定されているいろんなファイルと整頓されて列ぶ感じなので、プロの職人にとってツールが一面にならんだ感じが良いのだと勝手に解釈している。確かに上だと、マイドキュメントの内のトップに勝手にフォルダを作るなよって感じにはなる。
　PATHを設定しておかないと、後でなにやらエラーがでる。

```bash:.bash_profile
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
val "$(pyenv init -)"
```

```bash:.bash_profile
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
export PYENV_ROOT=/usr/local/var/pyenv
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
```

#pythonの導入
```
$ pyenv install (入れたいバージョン)
```
#ライブラリの導入
pipを使う。
【Tips】ただただフォーム最適化をまとめたチートシート的なもの

## 概要
主に「2016年 - 2017年」の記事から引っ張ってきて、ただただ羅列したものです。
なので、このまとめ自体の最適化が成されてないですが、そこはご容赦ください…

## ユーザビリティ・アクセシビリティ
### 分かりやすさ
- 入力項目は必要最低限にする
- 項目名は簡潔で短く分かりやすいものにする
- できる限り入力フィールドの数は最小限にする
- 一つの項目の入力フィールドを複数に分けない
 - 例：姓名、電話番号、郵便番号など
- 必須項目は、「＊」ではなく「必須」と表示する
- ラベルやヒント（○文字以上必要です）をplaceholderに設定しない
 - フォーカスした際に消えてしまうため、入力例を入れてあげる程度にする
- フォーカスした際の入力フィールドのデザインを変える
- 入力フィールドのサイズは、入力される値に合わせる
- リアルタイムでチェック出来るバリデーションを実装する
- エラーメッセージは、上部にすべて表示するのではなく、各項目の近くに表示する
- エラーメッセージは、以下の点が分かるようなものにする
 - どこがエラーか
 - なぜエラーか
 - どのように修正すれば良いか
- アクションボタンには、汎用的な言葉ではなく、クリックした時に実行されるアクションを正確に示す
 - 例：×「送信する」　○「内容を送信する」
- ページ離脱時にアラートを出す
- エラー画面には、エラーの項目だけを表示する（作りによるので任意）

### 使いやすさ
- 入力するテキストの種類に合わせたキーボードを表示させる
- Tabキーで次の入力項目にフォーカスされるようにする
- フォントサイズを16px以上にする
 - フォーカスした際のズームを防ぐため
- 住所は郵便番号から自動検索出来るようにする
- リセットボタンは作成しない
- 半角・全角をどちらも入力可とする
- タップしやすい入力フィールドやボタンの大きさにする
- チェック項目はラベルをクリック・タップでもチェックが付くようにする
- autofocus属性を使用し、ページが読み込まれた段階で一つ目の入力フィールドにフォーカスが当たるようにする（作りによるので任意）

## サンプルコード
### 姓名
```html
<input type="text" name="name" autocomplete="name">
```

### 姓
```html
<input type="text" name="family-name" autocomplete="family-name">
```

### 名
```html
<input type="text" name="given-name" autocomplete="given-name">
```

### 電話番号
```html
<input type="tel" name="tel" autocomplete="tel">
```

### メールアドレス
```html
<input type="email" name="email" autocomplete="email">
```

### 郵便番号
```html
<input type="number" name="postal-code" autocomplete="postal-code">
```

### 都道府県
```html
<input type="text" name="address-level1" autocomplete="address-level1">
```

### 市区町村
```html
<input type="text" name="address-level2" autocomplete="address-level2">
```

### 番地・マンション名（1行目）
```html
<input type="text" name="address-line1" autocomplete="address-line1">
```

### 番地・マンション名（2行目）
```html
<input type="text" name="address-line2" autocomplete="address-line2">
```

### 会社名
```html
<input type="text" name="organization" autocomplete="organization">
```

### 補足
- type="number" はブラウザ・バージョンごとに挙動が違うため扱いに注意
- 自動入力を無効にする場合は、autocomplete属性をoffにする

おわり
Salesforce Files

####SOQLによるファイルの参照
登録したファイルはContentVersionに入っている

```sql
SELECT Id, CreatedDate, Title, Description, FileType, Owner.UserName,VersionNumber, ContentDocumentId 
FROM ContentVersion 
Where IsLatest = true and Owner.UserName=:loginUsername 
ORDER BY CreatedDate desc
```

####参照用のURL
idは上記クエリーで取得
`https://組織のドメイン/sfc/servlet.shepherd/version/download/#id`
Aurelia で semantic-ui を npm install するとコケる話

2017年2月2日現在、[aurelia-cli](https://github.com/aurelia/cli) でスキャフォールディングしたプロジェクトに[Semantic UI](http://semantic-ui.com/)をインストールしようとすると、Gulp のメジャーバージョンミスマッチによりコケるようです。

```
TypeError: gulp.hasTask is not a function
```

Aurelia が求める Gulp : 4.0.* (alpha)
Semantic UI が求める Gulp : 3.9.* (npm latest)

なので、一度ローカルの gulp をダウングレードして Semantic UI だけをインストールすれば切り抜けられます。

```bash
npm uninstall gulp
npm install gulp@3.9.1
npm install semantic-ui
npm install gulp
```

過渡期なのでしかたありませんが、Aurelia の未来志向も相当ですね。

関連: [Gulp 4.x #3899 <i class="fa fa-github"></i> Semantic-Org/Semantic-UI](https://github.com/Semantic-Org/Semantic-UI/issues/3899)