OmniAICreator/Qiita-1.07M huggingface dataset:
tippecanoe の tile-join の６つの地道な使い方

[tippecanoe](https://github.com/mapbox/tippecanoe) をインストールするとついてくるコマンド tile-join について、これまで属性の JOIN をする目的のものと感じ違いしていたのですが、次のような地道な使い方ができるように思います。あとで検証します。

# tile-join に対する誤解の解消
[tippecanoe の README.md](https://github.com/mapbox/tippecanoe/blob/master/README.md#tile-join) で、tile-join は次のように説明されています。

> Tile-join is a tool for copying and merging vector mbtiles files and for joining new attributes from a CSV file to existing features in them.

この and を「かつ」という意味に私は読んでしまい、これまでは CSV テーブルとの JOIN を行うことが主眼のツールであると勘違いしていました。実際には、そういった意味での JOIN 作業を行わない場合にも、このツールは当然使えますし、README.md をみる限りも、ベクトルタイルパッケージ（mbtiles）周りの地道な作業に使えるようです。

本稿では以下、具体的な地味な使い方６つを紹介します。

# (1) ベクトルタイルパッケージをマージする
次のコマンドで、a.mbtiles と b.mbtiles に含まれるタイルが全てコンバインされるそうです。同じタイルに同じレイヤがあったとしても、しっかりとマージしてくれるように書かれています。

```console
$ tile-join -f -o out.mbtiles a.mbtiles b.mbtiles
```

-f は、out.mbtiles がすでに存在している場合に上書きするためのオプションです。

# (2) ベクトルタイルをファイルシステム展開する
a.mbtiles にパッケージされているベクトルタイルを tiles というディレクトリに展開します。

```console
$ tile-join -e tiles a.mbtiles --no-tile-compression
```

これまで、私は fan-out というシリーズの Node.js スクリプトを作っていましたが、これは不要かもしれない、ということになります。

*2018-09-27: --no-tile-compression オプションを付加するべきことを追記。*

## 実際にやってみた感想

ファイルシステム展開については、実際にやってみました。指定したフォルダの直下に {z} のフォルダが作成され、中に {z}/{x}/{y}.pbf の名前でファイルが展開されます。

なお、展開の速度は tippecanoe と大体同じくらいです。速いファイルシステムならば早く、遅いファイルシステムならばそれなりに書き出される、ということだと思います。

vector-tile-spec ではベクトルタイルの拡張子に .mvt を使うべき (SHOULD) とされているのに、vector-tile-spec v2 を採用した段階で Mapbox さんのプロダクトですら拡張子が .mvt になったことはよく知られており、現在、ベクトルタイルに拡張子 .mvt をつけて提供している著名なサービスはないようです。

このツールの挙動も、<strong>ベクトルタイルの拡張子は .pbf とする</strong>という見解を補強してくれるようです。

# (3) レイヤの抽出
ベクトルタイルパッケージ a.mbtiles の中から特定のレイヤ buildings を抽出して新しいベクトルタイルパッケージ out.mbtiles を作るには、次のようにすると良さそうです。

```console
$ tile-join --layer=buildings -f -o out.mbtiles a.mbtiles
$ tile-join -l buildings -f -o out.mbtiles a.mbtiles
```

# (4) ズームレベルの削り込み
ベクトルタイルパッケージ a.mbtiles のズームレベル 4 から 6 だけを取り出した out.mbtiles を作るには、次のようにすると良さそうです。

```console
$ tile-join -z 6 -Z 4 -f -o out.mbtiles a.mbtiles
$ tile-join --maximum-zoom=6 --minimum-zoom=4 -f -o out.mbtiles a.mbtiles
```

# (5) 余計な属性の削除
余計な属性 fid をベクトルタイルパッケージ a.mbtiles から削除したベクトルタイルパッケージ out.mbtiles を作るには、次のようにすると良さそうです。

```console
# tile-join -x fid -f -o out.mbtiles a.mbtiles
```

# (6) 地物単位でのフィルタリング
Mapbox GL Style Specification の filter expression を使って、a.mbtiles からマッチした地物だけを抽出した out.mbtiles を作るには、次のようにすると良さそうです。

```console
$ tile-join -j 'filter' -f -o out.mbtiles a.mbtiles
```

filter expression については、もう少し研究してあとで書きたすようにします。

ただし、[filter expression は deprecated になっている](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter) ので、この機能が長期的に安定していることを期待することは避けたほうが良さそうです。

# ※500KB 以上になるベクトルタイルはコピーされない
デフォルトでは、500KB 以上になるベクトルタイルはコピーされないそうです。 --no-tile-size-limit でこの挙動はキャンセルされるとのこと。
Xcode10でCarthageビルドが失敗する場合の対処方法

# 概要
Xcode10でCarthageビルドが失敗したので、その対処方法のメモです。

# エラー内容
以下のように`carthage bootstrap`コマンドを実行したところ、ビルドに失敗しました。

```bash
$ carthage bootstrap --platform ios
*** Checking out ActionClosurable at "1.2.0"
*** Checking out Toast-Swift at "3.0.1"
*** Checking out SVProgressHUD at "2.2.5"
*** xcodebuild output can be found in /var/folders/62/nrp34pc96t550_hhml86hmwrr_q2rc/T/carthage-xcodebuild.r9noDR.log
*** Building scheme "ActionClosurable" in ActionClosurable.xcodeproj
*** Building scheme "Chameleon" in Chameleon.xcodeproj
Build Failed
	Task failed with exit code 65:
	/usr/bin/xcrun xcodebuild -project /Users/shtnkgm/Desktop/MyLibrary/Carthage/Checkouts/Chameleon/Chameleon.xcodeproj -scheme Chameleon -configuration Release -derivedDataPath /Users/shtnkgm/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10L176w/Chameleon/2.2.0 -sdk iphonesimulator -destination platform=iOS\ Simulator,id=565ABA1F-07F4-40B8-A4F3-8588120D4CD7 -destination-timeout 3 ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES build (launched in /Users/shtnkgm/Desktop/MyLibrary/Carthage/Checkouts/Chameleon)
```

詳細を確認するためcarthageビルドの実行ログを表示します。

```bash
$ cat /var/folders/62/nrp34pc96t550_hhml86hmwrr_q2rc/T/carthage-xcodebuild.OLoaQO.log

〜中略〜

note: Using new build system
note: Planning build
note: Using build description from disk
Build system information
error: Cycle inside Chameleon; building could produce unreliable results.
Cycle details:
→ Target 'Chameleon' : CodeSign /Users/shtnkgm/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10L176w/Chameleon/2.2.0/Build/Products/Release-iphonesimulator/Chameleon.framework
○ Target 'Chameleon' has a command with output '/Users/shtnkgm/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10L176w/Chameleon/2.2.0/Build/Products/Release-iphonesimulator/Chameleon.framework/Chameleon'
○ Target 'Chameleon' has link command with output '/Users/shtnkgm/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10L176w/Chameleon/2.2.0/Build/Intermediates.noindex/Chameleon.build/Release-iphonesimulator/Chameleon.build/Objects-normal/x86_64/Chameleon'
○ Target 'Chameleon' has a command with output '/Users/shtnkgm/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10L176w/Chameleon/2.2.0/Build/Products/Release-iphonesimulator/Chameleon.framework/Chameleon'

** BUILD FAILED **
```

# 原因
Xcode10の新機能である循環依存の検知でエラーとなっているようです。
なぜ循環依存となっていたのかまでは分かりませんでした。

# 解決した方法
Carthage側のキャッシュを消してみます。

```bash
rm -rf ~/Library/Caches/org.carthage.CarthageKit 
rm -rf ~/Library/Caches/carthage
```

これで正常にcarthageビルドできるようになりました。

# 参考
 - [iOSアプリ開発でのキャッシュ削除方法まとめ](https://qiita.com/shtnkgm/items/c96a58579ec406194fa8)
今気になっているキーワード

# キーワードとその概要
- APIエコノミー
いろんなシステムと繋がれる
というか、つなぐことができるように窓口を設けておく
誰でもOKとしてしまうとセキュリティ的に危ないので、認証の仕組みを考える必要あり

- docker
なんか仮想環境作るやつだけど、すごい軽量らしい

- bitbucket
Gitの軽量版？無料である程度使えるらしい

- swagger
APIを簡単に作れるやつ？
dockerと組み合わせて使う

- Twitter Bootstrap
- angular material
- ng bootstrap
デザインを簡単に作れるものを提供してくれるとか。
バックエンドのエンジニアがフロントやってみようかなってなった時とかにとても助かる
LXD with ZFS   でバックアップをしたい

こんにちは。
LXDを使っていて、ZFSに格納されたデータをバックアップしたく思うことがあると思います。
やり方が見当たらなかったので、英語の文献からまとめます。

#バックアップ
"defaultはプール名。"
###スナップショット作成

```shell-session
lxc snapshot コンテナ名 バックアップ名
```
###設定のバックアップ

```shell-session
lxc config show コンテナ名 > お好きなバックアップ名α.lxd.config
```
###ZFSプールの構造を確認

```shell-session
zfs list 
```
>
# zfs list
NAME                                                                              USED  AVAIL  REFER  MOUNTPOINT
default                                                                           339M  14.1G    24K  none
default/containers                                                               7.03M  14.1G    24K  none
default/containers/first                                                         7.01M  14.1G   332M  /var/lib/lxd/storage-pools/default/containers/first
default/custom                                                                     24K  14.1G    24K  none
default/deleted                                                                    24K  14.1G    24K  none
default/images                                                                    332M  14.1G    24K  none
default/images/b190d5ec0c537468465e7bd122fe127d9f3509e3a09fb699ac33b0c5d4fe050f   331M  14.1G   331M  none
default/snapshots                                                                  48K  14.1G    24K  none
default/snapshots/first                                                            24K  14.1G    24K  none



###スナップショット一覧の表示、目星をつけてください

```shell-session
zfs list -t snapshot
```

>
NAME                                                                                       USED  AVAIL  REFER  MOUNTPOINT
default/containers/first@snapshot-snap0                                                     28K      -   332M  -
default/containers/first@snapshot-snap1                                                   25.5K      -   332M  -
default/containers/first@snapshot-bp                                                      25.5K      -   332M  -
default/containers/first@bp                                                                  0B      -   332M  -
default/images/b190d5ec0c537468465e7bd122fe127d9f3509e3a09fb699ac33b0c5d4fe050f@readonly     0B      -   331M  -

###バックアップをファイルに吐き出す。


```shell-session
zfs send default/containers/コンテナ名@バックアップ名 >　適当な名前β.lxd.zfs
```

#リストア(すべて受け入れ先で実行）
事前に適当なコンテナを作っとく。

```shell-session
lxc launch ubuntu:18.04 コンテナ名
lxc stop コンテナ名
```
受け入れ先のZFSイメージを削除しとく。

```shell-session
zfs destroy default/containers/コンテナ名
```

```shell-session
lxc config edit コンテナ名
```
　でバックアップしといたコンフィグを写経する。

ZFSの復元

```shell-session
zfs receive -F default/containers/コンテナ名 < 適当な名前β.lxd.zfs
```

わたしはこれでできましたが、実装前に一度全部できるか確認すべき。　

#まとめ
本稿ではLXDでZFSを使用している場合、バックアップが容易なことを示せた。バックアップファイルのサイズも深刻な大きさでないし、実用に耐えそう。
記事にしないと忘れそうで、時間ないけどまとめた。


#Ref
https://discuss.linuxcontainers.org/t/how-to-properly-backup-restore-lxd-containers-with-zfs-backend/417
https://discuss.linuxcontainers.org/t/how-to-move-lxd-zfs-pool-to-another-zfs-dataset-on-the-same-host/1187
LXCの小メモ集


sudo apt install lxc lxd-client lxd

#LXDでubuntu 18.04のインスタンスを作る
```
lxc launch ubuntu:18.04 first
```
#Bashにはいる
```
lxc exec first -- /bin/bash
```

#ローカルへのアクセスを仮想インスタンスにポート転送で飛ばす
```
iptables -t nat -A PREROUTING -s 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to 10.25.35.199:80
iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to 10.25.35.199:80
```

#物理ネットワークカードと仮想マシンのポートを紐づけする
iptables -A PREROUTING -t nat -p tcp --dport 80 -i eth0 -j DNAT --to 10.25.35.199:80

別に、LXCのIPを明示すれば、そこに転送されるから、localhostはわざわざ転送しなくてもね？


#Ref
https://help.ubuntu.com/lts/serverguide/lxc.html
https://linuxcontainers.org/ja/lxd/getting-started-cli/
https://homelab.city/ubuntu-18-04-lxd-zfs-docker-and-networking/
http://pc.amanogawa.info/archives/180
https://stackoverflow.com/questions/28170004/how-to-do-local-port-forwarding-with-iptables
ImageMagick を使ってファイルをjpgに一括変換 (PowerShell)

手早く作ったものをメモ。ググって出てきた内容そのままでできなかったので。
PowerShell で Windows 向け。
ImageMagick自体は https://www.imagemagick.org/script/download.php からImageMagick-7.0.8-3-Q16-x64-dll.exeをDLして確認しました。

```powershell
# 入力：フォルダパス
# 新しいフォルダを作ってjpgファイルを書き出す

# 新しいフォルダ
$oldDirectoryName = $args[0]
$newDirectoryName = $oldDirectoryName + "-jpg"
New-Item $newDirectoryName -ItemType Directory

# ファイル変換
$files = Get-ChildItem $oldDirectoryName | Where-Object { ! $_.PSIsContainer }
foreach ($item in $files) {
    $jpgFilename = Join-Path $newDirectoryName ($item.BaseName + ".jpg")
    magick convert $item.FullName $jpgFilename
}
```
LVMをGUIで操作する:system-config-lvm

下書き消化のため公開、、、。

https://reposcope.com/package/system-config-lvm
ここから適切なDebを見つけてインストールしてあげてください。

sudo system-config-lvm

ボリュームグループの作成、論理ストレージの確認ができる。


#Reference
https://askubuntu.com/questions/968297/is-there-a-new-gui-for-lvm
GitHub課金手続きの流れ（2018年6月16日版）

# 概要
　GitHubの課金用アカウント購入までの流れについて日本語で詳細に解説している文書が見つからなかったため、特に難しい話ではないのですがせっかくなので書き記しておきます。  
　手順としては 1.クレジットカード登録 → 2.Developerアカウントの購入 という流れになります。
　ちなみに**2018年6月16日**現在の手順となります。
　スクリーンショットはすべて[GitHub](http://github.com)からの引用となります。

# 1. クレジットカード登録
 まずは課金のための支払い方法を設定します。支払い方法についてはクレジットカードを利用する方法とPaypalアカウントを利用する方法の二種類がありますがここではクレジットカードを利用する方法を説明します。

## 設定画面に移動する
　課金登録は設定画面から行うのでまずは右上のアイコンの隣にある▼ボタンをクリックし、設定画面（setting）に遷移します。
![gh1.png](https://qiita-image-store.s3.amazonaws.com/0/147741/7d062197-b56f-bbb2-bde0-5457bf2936f5.png)

## 支払い情報を登録する
　設定画面中ほどに「Payment」の項があるのでそこをクリックすると支払い情報登録画面に遷移できます。
![gh2.png](https://qiita-image-store.s3.amazonaws.com/0/147741/a2b9a496-8783-1452-bddb-1c17b5f173ca.png)
　ボタンからクレジットカードを選択し、表示されたテキストボックスに必要事項を記入して登録します。なお、Stateは州の意味ですが、日本では都道府県にあたります。
![gh3.png](https://qiita-image-store.s3.amazonaws.com/0/147741/832776df-26b8-fed4-af56-14b0d5c1b231.png)
　登録が完了するとこのようにPaymentの項目が設定されます。

# 2. Developerアカウント（個人用課金アカウント）の購入
## Developerアカウントを購入する
　先ほどの設定画面の「Get Private Repositories」をクリックすると課金アカウントであるDeveloperアカウントの購入画面に遷移します。
![gh4.png](https://qiita-image-store.s3.amazonaws.com/0/147741/fde5a43e-ca84-31c6-ac65-9c17d38ce440.png)
　月払いか年払いかを選び、「Upgrade plan」ボタンを押すことで課金アカウントが購入されます。年払いにしても安くなるわけではないので各自の都合の良い支払い方法を選択してください。

## 購入の確認
![gh5.png](https://qiita-image-store.s3.amazonaws.com/0/147741/4af3aac8-9902-f4e0-cf7b-ee4fb50134eb.png)
設定画面がこのようになっていれば購入成功です。

# 3. 課金アカウントから通常アカウントに戻すには
　Developerアカウントを購入すると設定画面最下部に「Downgrade your plan」の項目が表示されます。
![gh6.png](https://qiita-image-store.s3.amazonaws.com/0/147741/d0ec45ee-2c03-54c5-4ca8-d8156b4014d4.png)
　このボタンを押すことでいつでもDeveloperアカウントから無料のフリープランに戻すことができます。フリープランに戻した際の挙動に関しては[こちら](http://kuteken.hatenablog.com/entry/2016/03/17/213423)をご覧ください。ただしリンク先の情報は**2016年3月17日**のものです。
Reactの基礎とReactDOMについて学ぶ_100DaysOfCodeチャレンジ13日目(Day_13:#100DaysOfCode)

## はじめに

この記事はTwitterで人気のハッシュタグ`#100DaysOfCode`をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した13日目の記録です。

## 動作環境

* npm 6.1.0

## 現在学習している内容のリポジトリ

https://github.com/yuta-ushijima/ReduxSimpleStarter-study

## 本日学んだこと

* Reactの基礎
* ReactDOMについて

## ReactDOMについて

```
<script>
      ReactDOM.render(
        React.DOM.h1(null, "Hello world!"),
        document.getElementById("app")
      );
</script>
```

### ReactDOMとは？

Reactのオブジェクト。

### render()メソッドって？

もっともよく使われるメソッド。ReactDOMオブジェクト経由でコンポーネントを描画するためのメソッド。

### React.DOM.xx

xxの部分がコンポーネント部分。上記のサンプルコードではh1コンポーネントを使うことで、HTMLのh1要素に対応して、それを描画している。

### nullの部分について(コンポーネントの第一引数)

コンポーネントの第1引数には、コンポーネントに渡したいプロパティを表示する。ReactではDOMの属性が該当する。CSSのclassやidはここに記述。

## TiPs:仮想DOMって何者？

仮想DOM…React内部でrender()メソッドが呼び出された際に、描画された結果のDOMを表した軽量なデータ構造のこと。

render()メソッドが再度呼び出された際に、変更前後の仮想DOMの差分を計算します。

この差分に基づき、必要最低限の操作がブラウザ上の実際のDOMに対して行われる性質があります。
Bundlerのバージョンを指定する

この前 `Gemfile.lock`の `BUNDLED_WITH` を書き換えたくなくて

- `Bundler`のバージョンを指定する
- `Gemfile.lock`をfreezeする

かの二択で迷って結局前者にしたのでメモ

```
# 使いたいバージョンをインストール
$ gem install bundler 1.14.5

# インストールされているバージョンを確認
$ gem list bundler
#
# *** LOCAL GEMS ***
#
# bundler (1.14.5)

# バージョンを指定して使う
$ bundle _1.14.5_ install
```

逐一バージョン指定するのは面倒だし
freezeは解除が面倒だし
なんかないかなーと思う

どなたか簡潔な方法知ってたら教えてください:pray:
Mac の初心者のためのメモ

macのあるボタンを表すこの記号　→　⌥ 
⌥ は、Option ( オプション)ボタンを表す記号。

macはwindowsと違い、deleteボタンを押すと左の文字を消去する。
macで右の文字を消したい場合は、fn + delete を押す。
Rails チュートリアル メモ 第10章

# メモ

## form_for の method の決定基準

レコードがすでに DB 上にあるかどうかを見ているらしい。

> Railsは、form_for(@user)を使ってフォームを構成すると、@user.new_record?がtrueのときにはPOSTを、falseのときにはPATCHを使います。

## target="blank" のセキュリティリスク

新しく開いた側のページから、元ページの window オブジェクトにアクセスできてしまう。
参考: http://yoru9zine.hatenablog.com/entry/2017/03/17/230729

## 認可の制御

`before_action` を使うとよい。

```ruby
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  .
  .
  .
  private

    def logged_in_user
      unless logged_in?
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end
end
```

## redirect のタイミング

こういうコードでも、ちゃんと `session.delete` は実行される。

```ruby
redirect_to(session[:forwarding_url] || default)
session.delete(:forwarding_url)
```

これは、リダイレクトが行われるタイミングがメソッドの return 時点だから。

## DB の初期化には db/seeds.rb を使う

見出しの通り。db/seeds.rb 内では普通に `create` 等でレコードを作ればよい。
その後 `rails db:seed` する。

## ページネーションには will_paginate gem が便利

* view で表示させたいリストを、普通に (`User.all` などで) 作るかわりに、`User.paginate(page: params[:page])` のようにして作る
    * すると、今回のページに表示する分だけのリストを返してくれる
    * 今回の例では User 全体に対して paginate を呼び出すしかしていないが、当然 `User.where('id > 50').paginate(page: 3)` のようにもできる
        * この場合、id が 50 より大きいレコード群の 3 ページ目を返す
* view 側ではふつうに `each` 等で要素を並べて表示すればよい
    * さらに、`<%= will_paginate %>` を書くことでナビゲーションを描画できる

## render の新しい呼び方

```erb
<%= render user %>
```

このように render を実行すると、`user` が User クラスのインスタンスなので、`_user.html.erb` を探して描画してくれる。変数名 `user` は関係ないことに注意。

それどころか、User クラスのインスタンスを収めた配列 `users` を作って

```erb
<%= render users %>
```

のように render に渡すと、配列を展開して、1つ1つの user に対して前述の `<%= render user %>` を実行してくれる。

なお _user.html.erb の中では

```erb
<li>
  <%= gravatar_for user, size: 50 %>
  <%= link_to user.name, user %>
</li>
```

のように `user` という変数が使えるようになっている。この辺は規約で決まっているのだろうか。

## boolean のカラムの特徴

例: admin という boolean 型のカラムを作ったとする

* admin? というメソッドが生える
* toggle! というメソッドが生える
任意のフォルダまでcdコマンドを打つのが面倒くさいと感じたときに、たまたま発見した便利なこと

# コマンドプロンプトは任意のフォルダで立ち上げられる。

これに気付いたのは本当にたまたまである。[^1]

1. 任意のフォルダで、**「Shift」キー**を押しながら**右クリック**を押す。
2. コンテキストメニューが表示される。
3. **「コマンドウィンドウをここで開く」**を選択する。
4. コマンドプロンプトが起動する。
5. 任意のフォルダパスから操作することができる。

[^1]: 他のOSでも右クリックを押せば「その場でコマンドラインを開く」みたいなメニューがあったのだから、Windowsでも機能としてあるのは自然な流れなのかもしれない。
git remote add を取り消す方法


``` git remote rm ～``` で削除できるが、～の書き方で迷った。
（間違えると　```usage: git remote remove <name>```　と諭される）

#取り消す方法

* まず現在登録されているリポジトリの確認

``` 
git remote -v
```

確認したときに、例えば以下のように出るはず
``` origin  https://github.com/ユーザー名/リポジトリ名.git (fetch)``` 
``` origin  https://github.com/ユーザー名/リポジトリ名.git (push)``` 

上の例ならば、以下のコードで取り消せるはず。

``` 
git remote rm origin
```

もう一度```git remote -v```で確認すると何も出なくなるので、
```git remote add```を正しいリポジトリでやり直し解決。
AWS CLIでプロファイルを切り替える

credentialからprofile名を持ってきてpecoで選択してAWS_DEFAULT_PROFILE変数に入れるだけ。bash_profile的な何かに書きましょう。

```bash
awsc () {
  export AWS_DEFAULT_PROFILE=$(grep -oE "(\[).+(\])" ~/.aws/credentials | tr -d [] | peco)
}
```

peco本当に便利だ。
画像のダウンロード中に別の画像を出す


FlutterでNetworkImageクラスでサーバーから画像をダウンロードしている間別の画像を出す場合、方法について共有します。


## ImageProviderの派生クラスNetoworkImageクラスではローデイング画像を出せない

実装を見ている限りですが、画像のダウンロード処理は `await` しているぽいでの別の画像をだすことはできません。

↓実際の内部実装

```dart

Future<ui.Codec> _loadAsync(NetworkImage key) async {
    assert(key == this);

    final Uri resolved = Uri.base.resolve(key.url);
    final HttpClientRequest request = await _httpClient.getUrl(resolved);
    headers?.forEach((String name, String value) {
      request.headers.add(name, value);
    });
    final HttpClientResponse response = await request.close();
    if (response.statusCode != HttpStatus.OK)
      throw new Exception('HTTP request failed, statusCode: ${response?.statusCode}, $resolved');

    final Uint8List bytes = await consolidateHttpClientResponseBytes(response);
    if (bytes.lengthInBytes == 0)
      throw new Exception('NetworkImage is an empty file: $resolved');

    return await ui.instantiateImageCodec(bytes);
  }
```


## 解決方法

`FadeInImage` クラスでラップしましょう
サンプルコードはこんな感じです


```dart
new FadeInImage(
     image: NetworkImage(snapshot["image_url"]),
     fit: BoxFit.fill,
     placeholder: AssetImage("assets/loading_image.png"),
)
```

`placeholder`　で別の画像を読み込んで出しましょう。
TkinterとMatplotlibが含まれるpythonプログラムをpyinstallerでexeを生成

目的
---
TkinterとMatplotlibライブラリが含まれるpythonプログラムをpyinstallerにてexeを生成します。

環境
---
Python 3.6.0, Windows 10 


前準備
---
pyinstallerをインストールしますが、2018/6/29現在は開発バージョンのpyinstallerを利用する必要がありました。
そのため、以下のようにしてコマンドプロンプトからpyinstallerをインストールします

```
> pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz
```

exe生成
---
pandas, matplotlibなど事前に利用しているライブラリがある場合はあらかじめpipでインストールしておきます。
そして、

```
> pyinstaller --onefile --hidden-import=matplotlib --hidden-import=tkinter main.py
```
とコマンドを打つと対象のpythonファイルをビルドします。そして、distフォルダ内にexeファイルが生成されます。
[Unity]シェーダーのリンク集　”随時更新”

主にUnityでシェーダーを勉強したいときにオススメのリンク集
重複しているものもあるかもしれないです
良い記事があれば随時更新します！

#コガネブログ　
物凄い数のシェーダーやアセットを紹介されております
チュートリアルもわかりやすい

[【Unity】シェーダ入門](http://baba-s.hatenablog.com/entry/2018/01/09/090000)
[【Unity】シェーダに関するオススメ記事まとめ(120個)](http://baba-s.hatenablog.com/entry/2018/03/02/090000)

#おもちゃラボ
わかりやすくて実践的

[7日間でマスターするUnityシェーダ入門](http://nn-hokuson.hatenablog.com/entry/2018/02/15/140037)

#渋谷ほととぎす通信
[「シェーダとは何なのか」を自分の言葉でまとめてみる](http://www.shibuya24.info/entry/2016/06/04/234031)

# アットIT
現在までに9回連載されている記事

[Unityで始めるシェーダー入門](http://www.atmarkit.co.jp/ait/series/8283/)

#The Book of Shaderes
[シェーダーとは？](https://thebookofshaders.com/01/?lan=jp)

#WebGL 総本山
[Shadertoy を使った GLSL のチュートリアル！？ 全 28 種類にも及ぶシェーダ記述のノウハウが凝縮！](https://webgl.souhonzan.org/entry/?v=0600)

##更新日
初投稿　2018年6月29日(金)
AWS Certified Advanced Networking - Specialtyを受けてきた 

AWS Certified Advanced Networking - Specialtyを受けてきました。
取得を考えている方の参考になれば幸いです。

# 試験概要
https://aws.amazon.com/jp/certification/certified-security-specialty/

- 時間：170分
- 問題数：65問[^1]

[^1]: 試験ガイドに記載が無いので、問題数は変わるかもしれません

# 事前準備
- サンプル問題を解く
    - [サンプル問題](https://d1.awsstatic.com/training-and-certification/docs-advnetworking-spec/AWS_Certified_Advanced_Networking_Specialty_SampleExam.pdf)
- 公認ガイドを読む
    - [AWS Certified Advanced Networking Official Study Guide: Specialty Exam](https://www.amazon.co.jp/gp/product/1119439833/)
- BGPの本を読む
    - [BGP―TCP/IPルーティングとオペレーションの実際](https://www.amazon.co.jp/gp/product/4274065685/)

# 結果
1回目不合格、2回目でなんとか合格できました。

## 1回目
Overall Score: 60%

Topic Level Scoring:
1.0  Design and implement hybrid IT network architectures at scale: 50%
2.0  Design and implement AWS networks: 50%
3.0  Automate AWS tasks: 100%
4.0  Configure network integration with application services: 42%
5.0  Design and implement for security and compliance: 83%
6.0  Manage, optimize, and troubleshoot the network: 71%

## 2回目
Overall Score: 76%

Topic Level Scoring:
1.0  Design and implement hybrid IT network architectures at scale: 58%
2.0  Design and implement AWS networks: 78%
3.0  Automate AWS tasks: 100%
4.0  Configure network integration with application services: 71%
5.0  Design and implement for security and compliance: 83%
6.0  Manage, optimize, and troubleshoot the network: 85%

# 受験者のスペック

- AWS歴：4年
- クラウド関連の保有資格
    - AWS: アソシエイト×３＋プロフェッショナル×２＋Big Data＋Security
    - Azure: MCSA Cloud Platform(532+533)
    - IBM: IBM Certified Application Developer - Cloud Platform v1
    - GCP: クラウドアーキテクト＋データエンジニア
- 外観：メガネぼーず

# 難易度について
主観になりますが、難易度は下のような感じです。
　アソシエイト系　＜　Security = Big Data　＜　プロフェッショナル系　＜＜＜　Networking

# 感想
- 1回目の受験準備の時、公認ガイドの問題を解くだけでなくちゃんと熟読しておけば良かった。。。
- プロフェッショナル用の公認ガイドが出るといいな。(再認定対策)
GLSLで音楽（今までの応用の一つ）

#アルペジオ
和音の構成音を順番にならすこと。
#今までのスキルの応用
アルペジオをカノン進行でやってみます。音源は、自分的にはpianoに近くしてるけど、世間の評価が気になるところ。アルペジオできるなら、ベースラインは難しくないと思う。それで、コードは

```glsl
#define BPM 120.
#define A (15./BPM)
#define B (240./BPM)

float sound(float f, float t)
{
  float gain = 0.0, a, b = 0.0;
  for(float j = 1.0; j < 8.0; j++){
      b += a = exp(-j *0.5);
      gain +=  a * sin( 6.2831 * f*j*t ) * exp(-t*1.5/(1.0-j*0.1));
  }
  gain *= 1.0 + 1.5*exp(-8.0*t);
  return gain / b;
}

float note2freq(int n)
{
    return 440.0*exp2((float(n)-69.0)/12.0);
}

int sequenceOrder(int s,float time)
{
    int n =-1;
    for(int i=0;i<=int(mod(time,B)/A);i++){
        if((s>>i&1)==1)n++;
    }
	return n;
}

float sequenceTime(int s,float time)
{
  float n =mod(time,A);
  for(int i=0;i<16;i++){
    if((s>>(int(time/A)-i)%16&1)==1)break;
    n+=A;
  }
  return n;
}

#define Scale int[](0,2,4,5,7,9,11,12,14,16,17) 
#define Kanon int[](1,5,6,3,4,1,4,5)
#define Key 60

vec2 mainSound( float time )
{
    int b = int(time/B);
    int s=int[](0x5111,0x1551,0x5151)[b%3];
    int o = sequenceOrder(s,time);
    float f = note2freq(Key + Scale[Kanon[b%8]-1 + o%3*2]);
    return vec2(sound(f,sequenceTime(s, time))) ; 
}
```

この音は[shader toy](https://www.shadertoy.com/view/4dKBWy)で聞けます。

#GLSLで音楽の記事
[GLSLで音楽（はじめに）](https://qiita.com/gaziya5/items/e5d058c20bc75c72b5a2)
[GLSLで音楽（まずは、ドラムだ）](https://qiita.com/gaziya5/items/e58f8c1fce3f3f227ca7)
[GLSLで音楽（メロディーいってみます）](https://qiita.com/gaziya5/items/67ebe54f4bc02bd31bd4)
[GLSLで音楽（和音を使ってみる）](https://qiita.com/gaziya5/items/0a3ef4b96a6d173f0895)
Jetson TK1でWifiを利用する

### 目的
---
今更ですがJetson TK1でwifiを使えるようにする方法を紹介します。

### お買い物
---
[intel 7260](
![error]()
https://www.amazon.co.jp/dp/B01GLPE8UU/ref=asc_df_B01GLPE8UU2443573/?tag=jpgo-22&creative=9339&creativeASIN=B01GLPE8UU&linkCode=df0&hvadid=249925604622&hvpos=1o2&hvnetw=g&hvrand=6308173684231480999&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1028825&hvtargid=pla-440595733080)をAmazonなどで購入します。2000円程度で購入できます。

### Jetpackを最新版にアップデート
---
1. 前準備

Jetsonのファームウェアアップデートには, Ubuntu 14.04LTEをインストールしたホストパソコンが必要です。
ホストパソコンの実物が準備できない場合は、VMWare Player上で動作するUbuntu 14.04LTSでも大丈夫です。

**注意**
Jetpackのインストールに際してホストパソコンに数10GBのディスク空き容量が必要です。
VMWare Playerで仮想記憶媒体の作成の際には十分な領域を確保するようにしてください。
(私は, 40GB使いました)

2. JetPackダウンロード
Nvidia社のサイトからJetpackをダウンロードします。ダウンロードに際して、
NVIDIAのDeveloperアカウントを作成する必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253656/246e0f37-63ce-1c5a-1b75-b235eedbc44f.png)

**注意点**
2018/06/29現在最新版のJetpack L4T r21.5をダウンロードしてください。

3. Jetpackインストール
Web上で豊富に記事がありますので、必要に応じて参照の上インストールしてください。


### intel 7260のJetson TK1への接続
---
Jetson TK1のmini PCIe端子へ接続します。
![mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/253656/ea2b81bf-9e80-edfc-33b6-6bfac9f64a31.jpeg)

### Jetson linux-firmwareのインストール
Jetson TK1を立ち上げて
```
$ sudo apt install linux-firmware
```
を実行して再起動するとwifiが利用可能になります。
CUDDの簡単な利用例: ランダムな論理関数の作成

環境をインストールしてGraphviz経由の作図ができるようになったので、ランダムな論理関数を作ってみる。

# 考えた方法
- 変数の数（BDDの高さ） $N$は固定
- $2^N$ 通りの組み合わせを考える（= 0から1<<Nまで）
- 個別の組み合わせ $i$ について、乱数を使って0/1を決定
- 1の場合、組み合わせ $i$ を論理式 $f_i$ で表現
- 全ての1の場合を足し合わせる

# 実装

- 前回の記事: [CUDDの簡単な利用例: Graphvizを用いた可視化](https://qiita.com/takilog/items/ef113c831d9275c8423e)でテストしたADD経由の可視化で確認してみる。

```cpp
#include <iostream>
#include <random>
#include <vector>
#include "cuddObj.hh"

using namespace std;

int main() {
  Cudd mgr;
  
  // 乱数生成機
  std::random_device rd;
  std::mt19937 mt(rd());
  std::uniform_int_distribution<int> bin(0, 1);

  // 桁数4 (= 変数の個数)
  const int N = 4;
  vector<BDD> X(N);
  for (int i = 0; i < N; i++)
    X[i] = mgr.bddVar(); // 変数Xiの作成

  BDD f = mgr.bddZero();
  for (int i = 0; i < (1 << N); i++) {
    int bj = bin(mt);
    if (bj == 1) {
      BDD termi = mgr.bddOne();
      for (int k = 0; k < N; k++)
        termi &= (i & (1 << k)) ? X[k] : !X[k];
      f |= termi; // fiを足し合わせる
    }
  }

  // dot dump
  const vector<ADD> vec = {f.Add()};
  auto fp = fopen("dot/random.dot", "w");
  const char* iname[4] = {"x1", "x2", "x3", "x4"};
  const char* oname[1] = {"F"};
  mgr.DumpDot(vec, iname, oname, fp);
  return 0;
}
```

- 出力結果
  - 図から逆算すると、$x_1 \bar{x_2} \bar{x_3} \vee \bar{x_1} \bar{x_2} x_3 \vee \bar{x_1} \bar{x_2} \bar{x_3} \bar{x_4} $ なのかな

![random.png](https://qiita-image-store.s3.amazonaws.com/0/7181/7f6de91f-ce37-7feb-4e3a-500d5b804472.png)
jsonを圧縮して送ろう

とあるソフトを開発していたとき。
サーバー側はPHP、クライアントはC#だった。画面に表示するデータのほとんどはPHP側が出力し、JSONでやりとりを行う構成。

ある画面で10000件くらいの大量の項目を転送する必要があった。ふつうに送るとさすがに容量が大きいもんですから遅くてあまりレスポンスが良くなかったので、どうしたもんかいのーと考えていたらgzipで圧縮して転送するというナイスな方法を見つけました。

# Gzipの効果を見てみよう

こんなPHPを作ってみた。

```php
<?php
$results = [];
for ($i = 0; $i < 10000; $i++) {
    $results[] = ["id" => md5($i)];
}
echo json_encode($results);
```

10000個のデータを作って返す、内容はmd5で生成しています。

これがだいたいどのくらいの容量になるのか。

![](https://d2mxuefqeaa7sj.cloudfront.net/s_864E1C694160D3A0D57BB3FE95B5D72810B4592F02985E9BA2225C084BD9EA30_1530278424545_php-gzip-1.png)


410KBでした。

さあこれをGzipで圧縮して送ってみましょう。
圧縮するには以下の`ob_start("ob_gzhandler")`を呼び出すだけです。

```php
<?php
$results = [];
for ($i = 0; $i < 10000; $i++) {
    $results[] = ["id" => md5($i)];
}

ob_start("ob_gzhandler"); // <-

echo json_encode($results);
```

なお、使用するにはZlibモジュールとやらが必要になるそうです。

http://php.net/manual/ja/function.ob-gzhandler.php

クライアント側もgzipに対応している必要があるのですが、C#のHttpClientは以下のサイトを参考にすれば対応することができますよ。

https://sqlazure.jp/r/%E6%9C%AA%E5%88%86%E9%A1%9E/559/

では結果をみてみましょう。


![](https://d2mxuefqeaa7sj.cloudfront.net/s_864E1C694160D3A0D57BB3FE95B5D72810B4592F02985E9BA2225C084BD9EA30_1530279286854_php-gzip-2.png)


197KBになる、だいたい半分くらいになりました。
今回はmd5でランダムなデータを作ったんですが、繰り返しが多いデータだったらもっと圧縮率が高くなると思います。
【記録用】cloudinaryを使ってherokuでDjangoアプリの画像投稿を可能にする

# cloudinaryを利用する
herokuにアプリをアップロードして、modelsにImageFieldを登録して、画像を投稿すると、画像が表示されなかったので調べてみると、herokuは画像や動画などのアップロードに対応していないみたいです。
HTMLの中に埋め込んだ画像は表示されるので、ソースコードの中のstaticfilesはちゃんと保存してくれているみたいです

調べると、ファイルをアップロードできるサーバーとして、AWS S3とcloudinaryが選択肢としてありましたが、AWSは1年経つと有料になってしまうみたいで、趣味レベルでしかない私には気が引けたので、フリーパックがあったcloudinaryにしました。cloudinaryは、herokuのアドオンにも入っているので、導入も簡単かな？と思いました。

主に公式ドキュメント（上）と、個人の方の書き込みを（下）を参考にしました。

参照：https://cloudinary.com/documentation/django_integration
　　　https://pypi.org/project/django-cloudinary-storage/0.1.2/

# cloudinaryに登録する
herokuのホームぺージのアドオンからcloudinaryを探し、中を見ると、フリープランのインストールボタンがあるので押します。

すると、cloudinaryを利用するアプリを聞かれるので入力すると、cloudinaryのページに飛びます。はじめに使用する言語などを聞かれるので、それらに答えるとダッシュボードが見れるようになります。

# cloudinaryのインストール
コンソール上で、仮想環境に入り、cloudinaryのパッケージのインストールを行います。

```
$ pip install django-cloudinary-storage
```

画像ファイルを扱う場合は、Pillowが必要なので、入っていない場合はPillowもここでインストールします。

```
$ pip install Pillow
```

忘れずに、requirements.txtに書き込みます

```
pip freeze > requirements.txt
```

# settings.pyへの書き込み
Djangoのsettings.pyのINSTALLED_APPSに"cloudinary"と"cloudinary_storage"を書き込んでください。
この時、cloudinary_storageを書く位置で私ははまりました。

```py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'homepage',

    'cloudinary',
    'cloudinary_storage',
]
```

"cloudinary"も"cloudinary_storage"も、最後に書くようにして下さい。正確に言うと、"django.contrib.staticfiles"より前には書かないようにしてください。

参照したページでは、"django.contrib.staticfiles"より前に"cloudinary_storage"を書くようにという指示がありましたが、その順に書くと、herokuにデプロイした時にstaticファイルが読み込まれなくなります。
私は英語に疎いので、"django.contrib.staticfiles"より前に"cloudinary_storage"を書くなんらかの理由があってそれを見逃しているのかもしれませんが、現状では、私が書いた順でstaticファイルは正常に読み込まれていて、"cloudinary"へのファイルのアップロード、ファイルの呼び出しも正常にできています。
今後、何かトラブルが起きたら、加筆・修正を行いたいと思います。


さらに、cloudinaryのアカウント情報を読み込ませます。settings.pyの最終行に

```python
CLOUDINARY_STORAGE = {
'CLOUD_NAME': 'your_cloud_name',
'API_KEY': 'your_api_key',
'API_SECRET': 'your_api_secret'
}
```

と書きます。それぞれの中身は、cloudinaryのダッシュボードを見ると書いてあるのでそれをコピペしてください。

# importに関して

公式ドキュメントでは、

```python
import cloudinary
import cloudinary.uploader
import cloudinary.api
```

と記述するようにという指示がありますが、私のようにmodelsの投稿用に画像を保存するだけだったら、この記述は必要ないみたいです。settings.pyの最後に

```python
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
```

と書くだけで、models.pyはいじらなくても、ImageFieldとcloudinaryが勝手に紐づきます。この時点で、adminで投稿した画像はページ上で正常に表示されるようになりました。

```html
<img src="{{ test_model_instance.image.url }}" alt="{{ test_model_instance.image.name }}">
```

と書けば、画像をHTML上に直接引っ張ってこれるみたいです。

# 所感
なんとか、cloudinaryをmodelsと紐づけることができました。さすがに、djangoにcloudinaryという日本ではマイナーな組み合わせだったので、英語ページしかなかったのが苦しかったです。
正直、私もぜいぜい言いながら作ったので、無駄な部分とか、逆にこの記事に書ききれていない部分があるかもしれません。うまくいかない方がいたら教えてください。可能な範囲でお答えできればと思います。
kmeansをpythonで実装してみた


#概要
kmeansのpythonによる実装です．
ランダムに生成する30個の点を3クラスに分類するプログラムです．
kmeansのアルゴリズムで分類タスクを実装しています．
コーディングに関してアドバイス等あれば，ぜひよろしくお願い致します．

#環境
##ローカル環境
- MACOS-High Sierra
- Python 2.7.13

##使用したpythonモジュール
- matplotlib　(2.1.2)
- numpy　(1.14.0)
- multipledispatch (0.4.9)


#実際に使ったコード

```py
# -*- coding: utf-8 -*-
import math
from time import sleep
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
import matplotlib.animation as animation
from numpy.random import *

ims = []

NUM = 5
dot_num = 30

initial = randint(-5,10,size=(3,3))
init_list = initial.tolist()

centroid=init_list
clasta = [0 for i in range(dot_num)]
value = [0 for i in range(dot_num)]
k = [0 for i in range(NUM)]


t1 = randint(-5,10,size=(dot_num))
t2 = randint(-5,10,size=(dot_num))
t3 = randint(-5,10,size=(dot_num))


def kyori(x1, x2, x3, y1, y2, y3):

    length = math.sqrt((x1-y1)*(x1-y1) + (x2-y2)*(x2-y2) + (x3-y3)*(x3-y3))
    return length


def center(a, b, r):

    count = 0
    c = 0
    cen = 0

    for i in range(dot_num):

        if (b[i] == r):
            c+=a[i]
            count+=1

    if(count != 0):
        cen = c/count

    return  cen


def idle(i, centroid, ims):

    for i in range(dot_num):
        k[0] = kyori(t1[i], t2[i], t3[i], centroid[0][0], centroid[0][1], centroid[0][2])
        k[1] = kyori(t1[i], t2[i], t3[i], centroid[1][0], centroid[1][1], centroid[1][2])
        k[2] = kyori(t1[i], t2[i], t3[i], centroid[2][0], centroid[2][1], centroid[2][2])

        mindot = k[0]
        minnum = 0

        for j in range(3):
            if(mindot > k[j]):
                mindot = k[j]
                minnum = j

        print mindot, minnum


        if (minnum==0):
            clasta[i]=0
            value[i] = "red"
        elif (minnum==1):
            clasta[i]=1
            value[i] = "blue"
        elif (minnum==2):
            clasta[i]=2
            value[i] = "green"


        centroid[0][0] = center(t1, clasta, 0)
        centroid[0][1] = center(t2, clasta, 0)
        centroid[0][2] = center(t3, clasta, 0)
        centroid[1][0] = center(t1, clasta, 1)
        centroid[1][1] = center(t2, clasta, 1)
        centroid[1][2] = center(t3, clasta, 1)
        centroid[2][0] = center(t1, clasta, 2)
        centroid[2][1] = center(t2, clasta, 2)
        centroid[2][2] = center(t3, clasta, 2)

    p = ax.scatter(t1, t2, t3, s=50, marker = "*",c=value)
    ims.append([p])

    print clasta;


fig = plt.figure()
ax = Axes3D(fig)
ani = animation.FuncAnimation(fig, idle, fargs = (centroid, ims), frames = 10, interval = 500)


plt.title("Kmeans Result(3 claster)")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")

plt.show()
```
MMDモデルをUnity(ver.2017.3.1)で走らせる方法 原理解説

開発お疲れさまです。モアイです。

この記事では前回説明した記事の中の原理的なところを解説したいと思います。

前回の記事はこちら→https://qiita.com/yasuimi6601/items/a750d67e8f719c054ad2

さて、MMDをUnityで使おうとして失敗した方は次のような原因が多いと思います。

1.MacでMMD4Mecanimを使ったのにPrefabが作られない
2.アニメーションがMMDモデルに反映されない

なのでこの失敗の原因と解説をしていこうと思います。

またそれ以外でも何か説明してほしいところがありましたら、編集リクエストの方をしていただければ、可能な範囲でお答えします。

#1.MacでMMD4Mecanimを使ったのにPrefabが作られない

これの原因としては、「libiconv.2.dylibという動的ライブラリのバージョンが古いため作動していない」からです。

libiconv.2.dylibというのは、簡単にいうと文字列の文字コードを変換するライブラリのことです。
これは推測でしかないですが、libiconv.2.dylibというのをMMD4Mecanimでは、MMDモデルの情報をPrefabに変換するところで使用していると思います。

そして、これのバージョンを8に更新すればうまくいきます。ただ、僕たちの勉強グループで試したところどうやってもバージョンがうまく更新されないのです。

そこで考えたのが、ここのところだけバージョンを下げるということでした。
少し調べたら可能であることが判明したので、前回の記事で紹介した方法でPrefabにするところだけバージョンを下げてあります。

#2.アニメーションがMMDモデルに反映されない

これの原因としては「使用してるアニメーションクリップとその動作の対象であるPrefabのAnimation Typeが違う」からです。

<img width="1440" alt="スクリーンショット 2018-06-29 22.34.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/259396/170a299f-cbbf-7942-916e-78230dbf5981.png">
これはMMDモデルをPrefabにした時の初期設定です。Animation Typeが「Generic」になっています。

Genericというのは「非ヒューマノイドアニメーション」を指します。

<img width="1440" alt="スクリーンショット 2018-06-29 22.34.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/259396/0b5ff832-9588-74e5-a356-c0e2d7b5d709.png">
そしてこちらは、今回使用した走るアニメーションです。Animation Typeが「Humanoid」になっています。

ここの二つが一致しないとアニメーションというのは使うことができません。
AssetStoreでインポートできる人のアニメーションの多くは「Humanoid」ですから、設定を変えないと使えないです。
OpenCVで開いた画像をPILで扱えるように変換する

OpenCVで処理した画像をPILに変換する際に詰まったので備忘録として残しておきます。
関数cv2pilでOpenCV形式の画像をBGRからRGBに変換し、PIL形式に変換後もRGB(8bit x 3)に変換するように実装しました。

```python:cv2pil.py
import cv2
from PIL import Image

def cv2pil(image_cv):
	image_cv = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB)
	image_pil = Image.fromarray(image_cv)
	image_pil = image_pil.convert('RGB')

	return image_pil

if __name__ == '__main__':
	image_cv = cv2.imread('test.jpg')
	image_pil = cv2pil(image_cv)

	image_pil.show()
```
Delphiでのテキストファイルの読み込みについて


Delphiでテキストファイルの読み込み方法は色々あるが、一長一短なので、場合によって使い分ける。
TStreamReaderかTFileを使うのが普通だと思うが、ロックされたファイルの読込ができないという問題がある。

|                          | TStreamReader | TFile | AssignFile |
|:-------------------------|:-------------:|:-----:|:-----:|
| ロックされたファイルの読込 | × | × | ○ |
| 全文読込                 | ○ | ○ | × |
| 一行毎読込               | ○ | × | ○ |
| 文字コード対応            | △ | △ | △ |
| はじめから読み直し(Reset) | × | × | ○ |

- 改行コードはすべてCRLF,LFに対応している
- TStringList.LoadFromFile()はTFileとほぼ同じ

## エンコードについて
|                | TStreamReader | TFile | AssignFile |
|:---------------|:-------------:|:-----:|:-----:|
| Ascii          | ○  | ○  | ○ |
| SJIS           | △ | ○  | ○ |
| UTF-8(BOMなし) | ○  | △ | × |
| UTF-8(BOMあり) | ○  | ○  | × |

- ○は文字コードの指定なしで読み込める
- △は文字コードの指定なしでは読み込めないが、指定すれば読み込める

## TStreamReader使用例
```Delphi
  try
    sr := TStreamReader.Create(filename);
    str := sr.ReadToEnd();       //全文string読込(ここでも文字コードの例外が飛ぶ可能性あり)
    while not sr.EndOfStream do  //(ここでも文字コードの例外が飛ぶ可能性あり)
    begin
      line := sr.ReadLine;     //一行読込
    end;
  except
    on e: Exception do
    begin
      ShowMessage('ERROR:' + e.Message);
      exit;
    end;
  end;
  sr.Free();
  sl := TStringList.Create();
  sl.Text := str;            //全文TStringList読込はないのでstringを代入
```

## TFile使用例
```Delphi
  try
    str := TFile.ReadAllText(filename);   //全文string読込
    sa  := TFile.ReadAllLines(filename);  //全文TStringDynArray読込
  except
    on e: Exception do
    begin
      ShowMessage('ERROR:' + e.Message);
      exit;
    end;
  end;
```

## AssignFile使用例
```Delphi
  AssignFile(f, filename);
  try
    Reset(f);
  except
    on e: Exception do
    begin
      ShowMessage('ERROR:' + e.Message);
      exit;
    end;
  end;
  while not Eof(f) do
  begin
    ReadLn(f, line);     //一行読込
  end;
  CloseFile(f); // Resetで例外が飛んでもその後の処理を行う場合は、
                // CloseFileでも例外が飛ぶので、tryでくくる必要があるので注意
```
Django の Apache デプロイを失敗する方法

# 背景
Django の IIS へのデプロイを目指していたが苦難を乗り越えられず断念。
Apache へのデプロイは楽勝だという記事が多かったので乗り換えることにしたのだが・・・

windows10
Apache-2.4.33-win64-VC15
Python-3.6.5-amd64
Django-2.0.6

# 混ぜるな危険

Python と Apache は両方とも x64 なり x86 なりで合わせること。
違っていたらダメ、絶対。
むかし入れた Python が 32bit 版だったのに Apache24 を x64 で入れてしまい、ハマりまくりました。
いちど盲点に入ってしまったら、もう気づきません。

# 正しく入れる方法
## 環境によっては必要なもの

Apache を動かすにはこれが必要らしいので入れました。

[Visual Studio 2017 の Microsoft Visual C++ 再頒布可能パッケージ　x64](https://visualstudio.microsoft.com/ja/downloads/)

python の拡張モジュールを入れるにはこれが必要らしいので入れました。

[Build Tools for Visual Studio 2017](https://visualstudio.microsoft.com/ja/downloads/)


## Apache のインストール
[httpd-2.4.33-win64-VC15.zip](https://www.apachelounge.com/download/) をダウンロード
解凍して出てきた \Apache24 を c:\ 以下にそのまま設置


## Apache の単体動作確認
管理者権限でコマンドシェルを開き c:\Apache24\bin で以下を実行。

```
httpd -k install
httpd -k start
```
ブラウザを立ち上げ http://localhost/ を見て "It works." と画面に出れば OK。


## mod_wsgi のインストール

ただ Apache を入れるだけでは Django は動かせない。Python プログラムを Apache で動かすための WSGI というモジュールが必要。

[mod_wsgi-4.5.24+ap24vc14-cp36-cp36m-win_amd64.whl](https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi) をダウンロード。

このファイルを pip でインストールする。

```
pip install mod_wsgi-4.5.24+ap24vc14-cp36-cp36m-win_amd64.whl
```

python36 フォルダに作成されたモジュールを Apache フォルダに移動。このモジュールは mod_wsgi.so というファイル名だという記事が多く見つかるが、そういう名前ではなく mod_wsgi.cp36-win_amd64.pyd という名前になっていた。
以下を実行

C:\Program Files\Python36\Lib\site-packages\mod_wsgi\server に作成された
mod_wsgi.cp36-win_amd64.pyd を
C:\Apache24\modules に移動

## httpd.conf を編集

既存の C:/Apache24/conf/httpd.conf ファイルを編集し設定する。

モジュール部分の記載
```
LoadModule wsgi_module /Apache24/modules/mod_wsgi.cp36-win_amd64.pyd
```

サーバー名の記載。これを書かないと起動時に毎回警告が出てうざい。
```
ServerName 127.0.0.1:80
```

Python 関係の記載。ファイルの最後に以下を付け足せばよい。

```
WSGIScriptAlias / /develop/Python/mysite/mysite/wsgi.py
WSGIPythonPath /develop/Python/mysite

<Directory /develop/Python/mysite/mysite>
<Files wsgi.py>
      Require all granted
</Files>
</Directory>
```


# メモ

インストールの過程で警告が出て scripts にパスがないと言われることがよくあるが、Windows 環境変数の一覧を見たら入っていることが多い。その場合はもちろん問題ない。

インストール作業中に Apache を起動してみたとき、なぜか重複起動してしまうことがあるので注意。すでにポートが使われているというような意味のことを言われる。Apache を一度止めて起動しなおす。

インストール作業中の動作確認はコントロールパネルのサービスでやるよりも、管理者権限のコマンドシェルで作業をした方がやりやすい。インストールや起動停止のコマンドは以下の通り。
ただし、コントロールパネルのサービスでしか出ないエラーメッセージとか、その逆とかがあるので、両方をうまく使った方がよい。

```
httpd -k install
httpd -k uninstall
httpd -k start
httpd -k stop
```
ティラノスクリプトで目パチ・口パクプラグイン（CSS版）

# CSSアニメーションでティラノスクリプトに目パチを実装する

ティラノスクリプトで目パチなどアニメーションを行うプラグインはいくつかありますが、CSSアニメーションを使ったものはティラノスクリプト本体に手を加える必要があるものだったので、極力ティラノ本体側には触らない方向で作ってみました。

[CSSで目パチプラグイン](https://github.com/violet2525/tyranoscript-css-blink-plugin)

使い方はreadmeなりを見ていただくとして、その中身の話です。

## やっていること

`init.ks`を見ていただければわかるのですが、jQueryで`style`タグの中身をいじってアニメーション定義したり立ち絵の要素に対してクラスを付けたり外したりしているだけです。
CSSでのスプライトアニメーションについての説明は他の記事にお任せするとして、ティラノスクリプトの仕様に絡んだ話をば。

## ティラノスクリプトの立ち絵表示処理

[ティラノライダー](https://tyrano.jp/usage/tech/rider)とかの開発者ツールで見れますが、ティラノスクリプトで下記のようにタグを記述するとします。

```:sample.ks
[chara_new name="usagi" storage="u_base.png"]
[chara_layer name="usagi" part="ear" id="1" storage="u_ear01.png"]
[chara_layer name="usagi" part="ear" id="2" storage="u_ear02.png"]
[chara_layer name="usagi" part="eye" id="3" storage="u_eye01.png"]    
```

すると、実際の画面上ではこのようになります。

```html:index.html
<div class="usagi tyrano_chara" ...>
   <img src="./data/fgimage/u_base.png" class="chara_img" ...>
   <img src="./data/fgimage/u_ear01.png" class="part ear" ...>
   <img src="./data/image/u_eye01.png" class="part eye" ...>
</div>
```

キャラクター名のクラスを持った`div`要素の子要素として、各パーツ名のクラスを持った`img`タグが配置されるわけですね。
プラグインの中では、この`img`要素に対してアニメーションさせるためのクラスのつけ外しといった処理を行っています。

### `img`要素内でスプライトアニメーションの実現

CSSでスプライトアニメーションをしようとしたら、`background` に画像を指定してやるのが手っ取り早いですし、プラグインの中でもそうしています。
しかし`img`要素には当然のことながら`src`属性があり、ただ`background`を指定しただけではおかしな表示になってしまいます。
ではどうしているかというと、`src`属性に透明な画像を指定しています。単純ですね。

1. アニメーションさせるパーツの`img`要素にアニメーション用`class`を付与
2. `img`要素の`src`属性（[chara_layer]にて定義したパーツ画像）を`data-src`属性に退避
3. `src`属性に透明画像をセット
4. `img`要素に`backgroud-image`を定義

だいたいこんな流れでアニメーションさせています。
アニメーションを停止させるときはこの逆の処理を行っているわけですね。

### `img`要素の画像表示方法の話
アニメーションさせるときは上記でいいとして、アニメーションしないときの処理の話です。
キャラクター差分パーツ機能では、各パーツごとに最初に定義したものがそのパーツのデフォルト値となります。上の例で言うと、`[chara_layer name="usagi" part="ear" id="1" storage="u_ear01.png"]`が耳パーツの初期値になります。
プラグインはクラスの付け外しといった処理が入る関係で、キャラクターが実際に表示されてからでないとアニメーションの開始処理ができません。
このため、パーツの初期値がアニメーションする画像だった場合に、キャラクター表示～アニメーション開始までの間は最初の1コマ目を静止した状態で表示させる必要があります。
しかし`img`要素（というかその親要素である`div`）は`width`,`height`が指定されているため、単純にスプライトアニメーション用の画像を`src`属性に指定してしまうとｷﾞｭｯと圧縮されて表示されてしまいます。
なので、アニメーションを定義するついでに差分パーツ用の`img`要素に対してこんな感じで指定してあげます。

```css:index.html
...
object-fit: cover;
object-position: 0% 0%;
...
```
これでスプライトアニメーション用画像の1コマ目が拡大縮小されることなく表示されます。

## つかってみてね
とりあえず公開してみましたがプラグイン公開は初めてなのであれでよかったのかよくわからん
ティラノスクリプト本体側はいじってないけどDOMをいじっているので今後ティラノスクリプトのアップデートでその辺の構成変わったら使えなくなります
なにか不具合あったら教えてください
Elixir-NIF-Rustボイラープレート  Ruster0.17.1の注意点


# はじめに
Fukuoka.exアドバイザーズ twinbeeことenpedasiと申します。

RustlerはElixirからNIFを通じてRustとの連携を簡単に図れるボイラープレートです。6/22に大き目のアップデートがありました。私が書いてきた記事も影響を受ける内容ですので、記事にしておきます。


# 型の変更

主要な型で、[**`Nif`プリフィックス**がなくなりました。](https://github.com/hansihe/rustler/commit/0ef6eee8fb58d600da4504159aed2b3c13c26e47)


* Rename NifEncoder/NifDecoder to Encoder/Decoder
* Rename NifTerm to Term
* Rename NifEnv to Env
* Rename NifError to Error
* Rename NifAtom to Atom
* Rename NifBinary to Binary
* Rename NifPid to Pid
* Rename NifListIterator to ListIterator
* Rename NifMapIterator to MapIterator



私の過去記事は、Rustler0.16対応なので全てNifプリフィックスが付いております。今からRustlerをv0.17.1で学習される方はご注意下さい。
|> [Elixirから簡単にRustを呼び出せるRustler #1 準備編](https://qiita.com/twinbee/items/aabc11d0d667800fc0bb)
|> [Elixirから簡単にRustを呼び出せるRustler #2 クレートを使ってみる](https://qiita.com/twinbee/items/54e8a4ec73bc27abd10e)
|> [Elixirから簡単にRustを呼び出せるRustler #3 いろいろな型を呼び出す](https://qiita.com/twinbee/items/f94eb7f74ff39c781da0)
|> [Elixirから簡単にRustを呼び出せるRustler #4 SHIFT-JIS変換を行う](https://qiita.com/twinbee/items/75415203e44daee16fcc)
|> [Elixirから簡単にRustを呼び出せるRustler #5 NIFからメッセージを返す](https://qiita.com/twinbee/items/cd818fd509ace2ae0d0a)

# OTP21への対応

Erlang OTP21で動作するようになっています。


# おわりに

v0.16時代に、テストコードにはNifプリフィックスがなく、どこで辻褄を合わせているのか不思議でしたが、バージョンアップで型の一括変更を行う布石でした。納得はしましたが、早く知っておきたかったです。:upside_down:
Ext JS Application Development Blueprints 第4章ノート

『Ext JS Application Development Blueprints』第4章の読書ノートをメモっとく。[Ext JS Application Development Blueprints 第3章ノート](https://qiita.com/takuya0301/items/2e3b81d042e797b715cb)の続き。

# ノート

第4章のトピックは Sencha Cmd だ。プロジェクト・ビュー・コントローラー・モデルの生成、Web サーバー、Ant によるビルドシステム、パッケージ、テーマなどを含むツールなのだ。開発するときに必須のツールなのだが、組み込まれている Ant を利用し、デプロイなどビルドに付随する作業を自動化できることは意外と知られていない。開発が一段落してデプロイを考える段になったら改めて読み直したい内容である。

# 参考文献

Ext JS Application Development Blueprints
ChromeOSでArduino

普段、家ではChromeOSを使ってる。
ちょっとしたプログラミングや電子工作にWindows PCを出すのがめんどくさくて、ChromeOSで環境を整えた。
特に特別なことはしてないけども。

# 事前調査
ChromeOSでは、ローカルでArduino環境つくれなさそう。
Linux入れたらできるんやろけども。ChromeOSにLinux入れたら負けやと思ってる。

# Arduino Create
いつのまにか、Arduinoもクラウド上での開発環境用意してた。
これでいっか。
[Arduino Create](https://create.arduino.cc/)

![IMG_2199.png](https://qiita-image-store.s3.amazonaws.com/0/184221/2933bccf-3f04-0ea7-7d58-2dd6d06323a5.png)

WindowsとMacとLinuxのプラグイン？があったので、Linuxのダウンロードしてみたけど、インストール難しそうやった。残念。
![Screenshot 2018-06-28 at 23.37.55.png](https://qiita-image-store.s3.amazonaws.com/0/184221/04652f65-fa53-a1b3-f4b3-04ce89bbdafe.png)

有料だけど、あきらめて、Chromeの拡張をインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/bf9ab2bb-813f-8edc-84d3-27c01f3514fa.png)

97円/月。安い。無料よりは高いけど。
<img width="375" alt="IMG_2198.png" src="https://qiita-image-store.s3.amazonaws.com/0/184221/f9d2fd5f-b9b5-2858-6e74-88aca88c9765.png">

アクセス。
![Arduino Editor.png](https://qiita-image-store.s3.amazonaws.com/0/184221/45439ad6-5dce-5047-aeeb-d46934d01c12.png)

開けた。Arduino Unoを接続。Lチカ。
![Arduino Editor (1).png](https://qiita-image-store.s3.amazonaws.com/0/184221/1139a5dc-b81b-8fe1-1f41-99d596184443.png)

シリアル通信もできた。
![Arduino Editor (2).png](https://qiita-image-store.s3.amazonaws.com/0/184221/ac373ee2-679a-79a6-e543-25625a7d3edd.png)

Fritzing的な回路図もかける。
![Arduino Editor (3).png](https://qiita-image-store.s3.amazonaws.com/0/184221/74102b49-d6a1-e373-bf77-92c3770b409c.png)


ちゃんとしたのも。
![Arduino Editor (4).png](https://qiita-image-store.s3.amazonaws.com/0/184221/8b01ca76-6b30-20fa-b701-1e496a4cb40d.png)

Shareもできる。

色も変えれる。
![Arduino Editor (5).png](https://qiita-image-store.s3.amazonaws.com/0/184221/ade57b56-809e-f765-22c0-b642fd089300.png)


# まとめ
ChromeOSすごい。Arduinoすごい。
mbedもすごいけどねー。
【React Native】borderBottomが当たらない

備忘録
## スタイルが当たらない？そんなことはないんだ

こっちは当たるのに

- `borderWidth`
- `borderColor`

こっちは当たらない

- `borderBottomWidth`
- `borderBottomColor`

## なぜか

**`<Text>`**に適用していたから！！！

## 解決法
**`<View>`**に当てたらええんや!!!
Firebase CLIのデプロイ先プロジェクトを変えるコマンド

# プロジェクトを変えるコマンド
`use`を使って

```
$ firebase use (プロジェクトID)
```

でデプロイ先のプロジェクトを変更できます。

#### ※プロジェクトIDの確認方法
コンソールで

```
$ firebase projects:list
```
プロジェクトID一覧を見ることができます。

# 別のGoogleアカウントの場合
上の例は同じGoogle アカウントに紐づいたプロジェクト間で切り替えてましたが、別のGoogleアカウントに紐づいたプロジェクトに切り替えたい時もあると思います。

その場合は、まず

```
firebase logout
```

で現在のアカウントからログアウトし、

```
firebase login
```

でブラウザに飛ぶので所望のアカウントにログインします。
あとは上記と同じように`use`でプロジェクトを選択すればOKです。

# 参考
公式リファレンス
https://firebase.google.com/docs/cli/?hl=ja

Cloud Functionsを複数のデータベースに適用する場面でよく使いました。

検索にすこし手間取ったので、備忘として。
Active StorageをAWS上で動かすときにPDFプレビューを使いたい

Active StorageをAWS上で動かすときにPDFプレビューを使おうとするとMupdfというPDFビューワが必要になるのだが、どこを探してもAWSのAmazon Linuxにこれを導入する方法が見つからなかった。

結論は一行。

`$ sudo yum install https://rpmfind.net/linux/fedora/linux/releases/25/Everything/i386/os/Packages/m/mupdf-1.8-2.fc24.i686.rpm
`

これでmupdfが導入される。

ちなみにAmazon LinuxにImageMagickが入っていないと500エラーでうまく表示されないので、入れておく

`gem 'mini_magick'`
UiPath勉強五回目



##UiPathに触ってみる(5)

今回は検索結果からデータを取り込む処理を行う。


取得対象は、サイトのタイトルとURLとする。


初めに、メニューバーにある「Data Scraping」をクリック。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/223b9ede-d5d0-514d-4126-faf6e1aa3eda.png)

下記のようなポップアップが表示されるので、「Next」をクリックする。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/45326720-f9ea-50af-25c6-b3d4bd604af5.png)

取得するデータを選択できるのでサイト名にカーソルを合わせてクリック。今回は検索内容を「UiPath」とした。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/102ce50b-d061-5039-2156-a3c47fb54326.png)

別のポップアップが表示されるので、「Next」をクリック。

![3.5.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/dbe45402-7a13-a789-a4e2-874ef9c33154.png)

再び、取得するデータを選択する。
※今回は上から二つ目のサイトを選んだが、同ページ内の一番下のサイトを選んだほうがデータを正確に判定できる。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/c0fb52fe-3dc4-2e21-38fe-45b1375752f4.png)

再びポップアップが表示される。ここでは、先ほど選択したサイト名とリンクのURLの名前を入力する。その後「Next」をクリックする。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/3e48c448-d352-0bdc-aa7c-7dc0dc6f0d21.png)

すると、ページ内にあるサイト名とURLがプレビューとして表示される。
表示されている内容に問題がないなら、「Finish」をクリック。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/236d23ab-bfc1-ebad-e533-3d4b9d5f8754.png)

最後に、取得するデータ複数ページにまたがっているのかをきかれる。今回は「No」を選択。

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/492756f9-a830-895d-383c-fea2e71ce2e4.png)


ここまでで、データ取得の処理が完了。
次回で、今までの処理と合わせた自動化処理を作成する。
Markdownテキストに文字色をつけたい (VSCodeで)


そんな機能はないようなので、HTMLタグとCSSを使うことにする。  
Snippet登録すれば入力も楽!

## Snippetへの登録
- Ctrl(MacならCommand)+Shift+P でコマンド入力欄が表示されるので、「Snippet」と入力する。
- 「ユーザ スニペットの構成」を選ぶ。
- 「markdown」と入力して表示された項目を選べば、設定用のJSONが開く。
- コメントで説明文が色々書いてあるので、その下に↓みたいなのを記述する。
	- 重要なのは、`prefix` と`body`

```javascript
"Input with color red": {		// スニペットの名前
    "prefix": "red",			// プレフィックスの設定。これを入力すると、↓の"body" の文字列に変換できる。
    "body": [					// 変換後の値。1行が配列の1要素になる(と思う)。
        "<span style='color: #F00;'>$1</span>$2"
        // ↑変換後の文字列。変換後にTabキー押下で $1 -> $2 -> ... の順にジャンプできる (はず)。
    ],
    "description": "Input with color red"	// スニペットの説明。
}
```

- 保存する。
- Markdownファイルを開いて、`prefix`に設定した文字を入力して、Tabキーで変換。
- 変換後、`<span ~>`と`</span>` の間に文字列を入力すると、そこの文字が赤くなる。

## TabでSnippetが変換できない!
Tabで変換するには以下の設定がいるようだった。

- 設定を開く。
- ユーザ設定のところに↓の「その1」「その2」のどちらかを追加する。

```javascript
"editor.tabCompletion": true,	// その1
```

```javascript
"[markdown]": {
    "editor.quickSuggestions": true	// その2
}
```

- 保存する。
- Markdownファイルを開いて、`prefix`に設定した文字を入力して、Tabキーで変換。
- 変換後、`<span ~>`と`</span>` の間に文字列を入力すると、そこの文字が赤くなる。

## これで
テキストに文字色をつけられた!

## 参考
- [Visual Studio Codeで、ユーザー定義スニペットで楽をする](https://qiita.com/kz_kazuki/items/d26946c1e7169847aeef)
- [VSCodeでマークダウンを書くためのチート](https://qiita.com/nkgr/items/57a3278879313c32f557)
- [Bug in cursor location within user snippets のコメント(9 Sep 2016)](https://github.com/Microsoft/vscode/issues/11742#issuecomment-245855602)