OmniAICreator/Qiita-1.07M huggingface dataset:
CARTO 小技集1

遅まきながら[CARTO](https://carto.com/) (旧 CartoDB)使い始めました。
[奈良の地蔵プロジェクト](https://github.com/code4nara/JizoProject/)のビジュアライズに[uMap](https://umap.openstreetmap.fr/ja/)を使っていたんですが、どうもポップアップなどでできることの限界が気に入らないので、代わりのビジュアライズ手段として調べ始めたのがきっかけです。

でもって納得いく表現を実現するためにいくつか[Geographic Information Systems](http://gis.stackexchange.com/)等にも質問を投げて答えを得たので、日本語でQiitaでも共有します。

### 1. PopupのCustomHTMLで条件分岐やループするには？

英語での質問ページは[こちら](http://gis.stackexchange.com/questions/213222/cartodb-can-i-use-some-if-then-structure-or-loop-structure-in-popup-custom/213267)。
結論としては、[Mustache](https://mustache.github.io/)というテンプレートエンジンを使っているので、その文法で書いてやればよい。

こんな感じ：

```json:データ
{
  "animals": [
    {"name": "cat"}, 
    {"name": "dog"}, 
    {"name": "pig"}
  ],
  "test" : false
}
```

```html:テンプレート
{{#animals}}
  <p>{{name}}</p>
{{/animals}}
{{#test}}
  <p>Test is found</p>
{{/test}}
{{^test}}
  <p>Test is not found</p>
{{/test}}
```

```html:結果
  <p>cat</p>
  <p>dog</p>
  <p>pig</p>
  <p>Test is not found</p>
```

**残った疑問:**

配列の要素がオブジェクトの時は上記でループ結果を得られるが、配列の要素がリテラルの時はどうすればアクセスできるか？

```json:データ
{
  "animals": ["cat", "dog", "pig"]
}
```

から、

```html:結果
  <p>cat</p>
  <p>dog</p>
  <p>pig</p>
```

を得たい時はどうすればよいか？
[Stack Overflowで質問中](http://stackoverflow.com/questions/39894891/how-to-get-root-values-of-array-in-mustaches-loop-representation)だが、まだ答えなし。

### 2. POI各要素のlatitude, longitudeにアクセスしたい時はどうするか？

直接引っ張ってくる手段はないが、代替手段がある。
CARTOのPopupテンプレートで呼び出せる属性名は、登録したgeojson等の属性値を引っ張ってきているわけではなく、あくまで、SQLタブに登録されている

```sql
SELECT * FROM data_table;
```

といったSQLを、登録された空間DB上で実行した結果を引っ張ってきている。(data_tableは各自のデータレレイヤ名によって置き換えること)

よって、経緯度を引っ張りたいなら、経緯度をSQLの結果として取れるようにすればよい。

```sql
SELECT *, ST_X(the_geom) as lng, ST_Y(the_geom) as lat FROM data_table;
```

これをSQLタブに登録することで、{{lat}} {{lng}}の形で、テンプレート上で経緯度が引っ張れるようになる。

### ３. 元になったgeojsonを外部で更新した。全取っ替えで置き換えたいがどうすればよいか？

英語での質問ページは[こちら](http://gis.stackexchange.com/questions/213227/replacing-existing-layers-data-with-new-geojson-in-carto)。
CARTOは新規データレイヤ作成でgeojsonを読み込ませることができるが、uMapにはある「新しいgeojsonでデータ全取っ替え」が標準のUIで用意されていない。
しかし普通にSQLが使えるので、以下の方法で全取っ替え可能である。

1. 新しいデータセットを、別のレイヤー名（ここではtmp_tableとする）でインポート

2. 入れ替えたいレイヤ上のSQLタブで、以下を一気に実行する。

```sql
DELETE FROM data_table; 
INSERT INTO data_table (cartodb_id, the_geom, attributes) SELECT cartodb_id, the_geom, attributes FROM tmp_table;
```

attributesは、実際の属性名を列挙すること。
属性名リストを省略した形での、

```sql
DELETE FROM data_table; 
INSERT INTO data_table SELECT * FROM tmp_table;
```

は動かないので注意。
大体1ヵ月で取得するAWSソリューションアーキテクト 

##概要
今更ながら気づいたのですが、実は1ヶ月経っていましたね。
まぁ、もうここまで来たら1ヶ月とかも関係ないですね。
タイトルももう大体とかつき始めて変わっちゃいました。

この記事を読んでくれてる方はこのダメ人間の堕落ぶりをみて、
反面教師にしていただければ幸いです。

さぁ！心を切り替えたところで、
ここからは確実に受かるということに目的をシフトしていきます。
受けるからには絶対に受からなきゃ意味ないですから。

…というわけでもう何日目かもよく分からないですけど、
とりあえず、勉強を進めていこうと思います。

模擬試験で出題された部分で残りの分野を整理していきます。

##セッション情報の保持

AWSを利用してステートレスなWebアプリサーバーを稼働させているケースにおいて、
サーバーがダウンした際にセッションの情報を失ってしまうことは問題です。

また、AWSは頻繁にスケールインとアウトを繰り返すため、
セッション情報を失わないように考慮して設計することはとても大事…だそうです。

これを失わない様に稼働させるには以下サービスの機能が有効です。

<b>RDS</b>
<b>Elasticache</b>
<b>AmazonDynamoDB</b>

それではそれぞれの何が有効なのでしょうか？
<br>
<DIV ALIGN=LEFT><HR WIDTH=50%></DIV>
<INS>◆RDS</INS>

まず、RDSでは複数のAZ間にインスタンスを作成することができます。
そのため、1つのAZで障害が発生しても別のAZ上でインスタンスは影響を受けません。
或いは切り替えることも可能ですね。

そして、トリッキーな方法ではありますが、RDSのMySQLインスタンスでは
memcached Pluginを利用することが可能です。

<参考>付録: MySQL データベースエンジンのオプション
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.MySQL.Options.html

これを利用することでmemcachedを使うのと同じ効果を得られます。
※ただし、Elasticacheよりも速度は劣るそうですが…
<br>
<DIV ALIGN=LEFT><HR WIDTH=50%></DIV>

<INS>◆Elasticache</INS>
これは言うまでもないですね。セッションを保持するための機能です。

ただし、memcachedを利用した場合にはレプリケーション機能がないため、
アプリでのチューニングかロードバランシングを複数の行う
ソフトや仕組みを実装する必要があります。
<br>
<DIV ALIGN=LEFT><HR WIDTH=50%></DIV>
<INS>◆AmazonDynamoDB</INS>

そもそもDynamoDBの仕組み自体がKVSの情報を複数のAZ間に保存することであるため、セッション情報を保持する必要がないということです。

もう少しだけ…詳しい情報を3日目の記事で触れています。

##安全な方法でAWS APIを呼び出す方法

EC2にデプロイしているアプリケーションに安全に認証情報を渡すには
どうしたら良いのでしょうか？

認証といえば散々、勉強してきたIAM！ですね。

というわけで以下のような情報がAWSドキュメントに記載されていました。

<参考>Amazon EC2 の IAM ロール
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

仕組みとしては予めアプリケーションで利用するためのロールを用意しておきます。
そのロールに対してcurlのコマンドを使用してロールに対して定義した
アクションおよびリソースの許可を取得するといった形です。
SoftEther VPNをMacでローカルブリッジする

## 初めに
VPNはとても便利な機能です。特に私は家の回線でポート解放することができないため、VPS上に構築したVPNに接続するなどで利用しています。VPNを自分のサーバ上に簡単に構築できる方法の一つにSoftEtherがあります。落としてきてコマンドを幾つか実行するだけでVPNが建った時には感動しました。SoftEtherすごい。
しかし世の中にはVPNに対応していない機器は沢山あります。そんな機器をVPNにどうにかして接続する時に利用できるのがローカルブリッジ機能です。SoftEtherがサーバと同じようにブリッジを構築する機能も搭載しているのでこれも楽にできますが、Macでのやり方が最初わからなかったのでまとめました。

## VPNの構築
これはそこらじゅうで記事が上がっているので割愛します。
ローカルブリッジを構築するのがサーバと同一ではない場合はvpnbridgeをインストールしてください。

## ローカルブリッジの構築
今回はTAP/TUNではなくもっと簡単な方法でやることにします。
「システム環境設定→ネットワーク→設定マーク→仮想インターフェースを管理...」
を選択。
![仮想インターフェースを管理の画面](https://qiita-image-store.s3.amazonaws.com/0/28684/f2adbe4a-63af-bd85-f766-83e5aa89d5c2.png)
+をクリックして新規ブリッジを選択
![新規ブリッジの画面](https://qiita-image-store.s3.amazonaws.com/0/28684/43dc2324-b805-071c-fadf-c0f8a685d4b7.png)
ブリッジ名に任意の名前を入力し、ブリッジ先のインターフェースを選択して作成を押す。すると、管理の画面に作成したブリッジが出てくるのでBSD名を控えておく。完了を押して、適用を押せば準備完了。

次にVPN Server ManagerでVPNの設定画面を表示し、左下のLocal Bridge Settingをクリック。
下半分にNew Local Bridge Definitionという設定画面があるので、Virtual Hubにブリッジしたい任意のHubを選択し、LAN Adpterには先ほど控えたBSD名のデバイスを選択し、Create Local Bridgeを押せば完了！警告が出てくるが無視して問題なし。

![Local Bridge Settingの画面](https://qiita-image-store.s3.amazonaws.com/0/28684/41980187-6ba6-9efc-1e25-30f9f7f5dadc.png)

これでブリッジされた先に接続されたデバイスにはVPNのIPアドレスが割り当てられて通信できるはずです。
npm-run ワンライナーで browserify + 型付き JS + power-assert 生活を送る

# npm-run ワンライナーで型付きJS生活を送る

grunt とか gulp とか webpack とか設定が面倒くさいので npm-run だけですべてを済ませたい。

```ｓｈ
npm run build # ビルド
npm run watch # 差分ビルド
npm run lint  # 構文チェック
npm run check # 型チェック
npm run test  # テスト
```

だけで生きていこうという話です。



## TypeScript の場合

tsc の差分ビルドと watchify の差分ビルドを両方有効にするために lib フォルダを途中に挟んでいます。

ファイルツリー

```sh
.
├── dist
│   └── index.js # es5 + browserify
├── lib
│   └── index.js # es5 + commonjs
├── src
│   └── index.ts # typescript
├── tsconfig.json
├── tslint.json
├── typings
│   └── index.d.ts
└── typings.json
```

package.json

```json:package.json
{
  "scripts": {
    "build": "tsc    -p . && browserify lib/index.js --standalone Main -o dist/index.js -t espowerify",
    "watch": "tsc -w -p .  &   watchify lib/index.js --standalone Main -o dist/index.js -t espowerify -v",
    "check": "tsc -w --noEmit -p ./",
    "lint": "tslint -c ./tslint.json --project ./tsconfig.json --type-check"
  },
  "devDependencies": {
    "browserify": "^13.1.0",
    "espowerify": "^1.0.0",
    "power-assert": "^1.4.1",
    "typescript": "^2.0.3",
    "watchify": "^3.7.0"
  }
}
```

tsconfig.json で tsc を es6 にするなら babelify を入れる。

## babel + flowtype の場合

ファイルツリー

```sh
.
├── dist
│   └── index.js # es5 + browserify
├── src
│   ├── decls
│   │   ├── externs.js
│   │   └── globals.js
│   └── index.js # babel + flowtype
├── .eslintrc.json
├── .flowconfig
└── package.json
```

package.json

```json:package.json
{
 "scripts": {
    "build": "browserify src/index.js --standalone Main -o dist/index.js -t [ babelify --presets [ es2015 ] --plugins [ babel-plugin-transform-flow-strip-types ] ] -t espowerify",
    "watch": "  watchify src/index.js --standalone Main -o dist/index.js -t [ babelify --presets [ es2015 ] --plugins [ babel-plugin-transform-flow-strip-types ] ] -t espowerify -v",
    "check": "flow check",
    "lint": "eslint ./src"
  },
  "devDependencies": {
    "babel-plugin-transform-flow-strip-types": "^6.14.0",
    "babel-preset-es2015": "^6.16.0",
    "babelify": "^7.3.0",
    "browserify": "^13.1.0",
    "eslint": "^3.7.1",
    "espowerify": "^1.0.0",
    "flow-bin": "^0.33.0",
    "power-assert": "^1.4.1",
    "watchify": "^3.7.0"
  }
}
```

## 参考
* http://qiita.com/mizchi/items/95ee0101ac22e4b7b662
Macで外部webカメラを利用する(El Capitan)

#　はじめに

webアプリで外付けのwebカメラを使用しようとしたところ，MacBookProの内臓カメラ（iSight）が反応してしまって上手くいかず，どハマりしてしまったので備忘録を残しておきます．

# 環境

- MacBook Pro (Retina, 13-inch, Late 2013)
- OS X El Capitan

# 方法

## iSight Disablerを利用

てっとり早いのは[iSight Disabler](https://techslaves.org/isight-disabler/)というアプリを利用する方法です．サイトからダウンロードして解凍・起動し，スクリプトエディタを走らせるだけです．

![image](https://qiita-image-store.s3.amazonaws.com/0/59864/2553a1a6-8968-49d4-e48c-26ad3bfd1c30.png)

スクリプトのオンオフを簡単に切り替えることができます．しかし，[公式サイト](https://techslaves.org/isight-disabler/)にもあるように，El　CapitanからはOSの仕様が変わったため利用できません．

### システム整合性保護機能（Rootless）を無効にする

なにが変わったかというと，El Capitanには新しいセキュリティ機能(SIP:System Integrity Protection)「Rootless」が追加されており，rootユーザーでも/usr/bin/ディレクトリの変更できなくなっています([iOS 9 & OS X 10.11 to bring ‘quality’ focus, smaller apps, Rootless security, legacy iPhone/iPad support](https://9to5mac.com/2015/05/22/ios-9-os-x-10-11-to-bring-quality-focus-smaller-apps-rootless-security-legacy-iphoneipad-support/))．

そのため，iSight DisablerがiSightをいじろうとしてブロックされてしまっていたと考えられます．
Rootlessを無効にする手順は以下のとおりです．

#### 1. リカバリーモードで起動する

まず，

1. Macを終了
2. 「command + R」キーを押したまま再起動
3. Appleのロゴが出たらキーを離す

で，Macをリカバリーモードで起動します．

#### 2. ターミナルからRootlessを無効化

ターミナルを起動（ユーティリティ- -> ターミナル）し，以下のコマンドを実行します．

```csh
yukiB$ csrutil status
System Integrity Protection status: enabled (Apple Internal).
 
yukiB$ csrutil disable
Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.
```

これでSIPが無効化されるので，Macを再起動してください．この状態であればiSightDisablerが機能するはずです．

## 2. QuickTimeのSystemLibraryファイルをいじる

この方法は，下手をすると戻せなくなるので注意が必要です．

やり方は簡単で，　`/System/Library/QuickTime/`以下にある，`QuickTimeUSBVDCDIgitizer.component`ファイルをどこか別の場所に退避させるだけです（間違ってもrmしないでください）．
その後，Macを再起動すれば，faceTimeやwebアプリで内臓カメラが反応しなくなるはずです．

# おわりに

わかってみれば手順は少ないですが，なかなかEl Capitanの情報が出てこずあせりました(中にはセキュリティーの意味で内臓カメラオフにしたい人はテープでふさげ！！みたいな記事も．．．)．これらの方法で一切iSightが使えなくなるということはないかと思いますが，試すのは自己責任ということでよろしくお願いします．

## 参考文献

- ゆとりっち - Mac OS X 10.11 EI CapitanでOperation not permittedが出た時の解決法 ([http://www.starlod.net/mac-os-x-10-11-ei-capitan-operation-not-permitted.html](http://www.starlod.net/mac-os-x-10-11-ei-capitan-operation-not-permitted.html))
- OSX Diary - How to Disable the Built-in iSight Camera on a Mac ([http://osxdaily.com/2007/03/26/how-to-disable-the-built-in-isight-camera/](http://osxdaily.com/2007/03/26/how-to-disable-the-built-in-isight-camera/))
Sidekiq のロギングに Rails logger を利用する

## 動機

Sidekiq は `Sidekiq::Logging.logger` に設定された Logger を利用し、デフォルトでは普通の `Logger` となっています。

加えて、デフォルトでは `STDOUT` への出力ですが、`-L` オプションや設定ファイルに指定することでファイルへの書き出しも可能です。

[Logging - mperham/sidekiq](https://github.com/mperham/sidekiq/wiki/Logging)

### Sidekiq を Rails と一緒に使っている場合は、Rails.logger と同じものを使いたいケース

Fluentd を使っていたり、特殊なフォーマットを使っている場合に、Rails.logger に設定された logger はなんらか設定が反映された Logger である事もあると思います。

そういう場合に Sidekiq の Logger も設定を同じにできれば、Sidekiq 自身が出力するログもその設定通りになります。

> あくまで Sidekiq 自身が出すログに興味があるケースだけですが。

## 方法

公式の Wiki に基本的なやり方は書いてあります。
[Customize Logger - mperham/sidekiq](https://github.com/mperham/sidekiq/wiki/Logging#customize-logger)

Rails の場合だと、`config/initializer` で以下のように書けば良さそうです。

```rb:config/initializer/sidekiq.rb
Sidekiq::Logging.logger = Rails.logger

# or

Sidekiq.configure_server do |config|
  config.logger = Rails.logger
end

Sidekiq.configure_client do |config|
  config.logger = Rails.logger
end
```

一つの Rails アプリで `server`(daemon 側）と `client`(perform_async する側） を分けて設定することも可能です。
（client 側で Sidekiq 自身がログを出すケースがあるのかはちょっと分かりませんが。）

### Sidekiq が提供する情報も含んだログを出す

単純に `Rails.logger` に差し替えてしまうと、Sidekiq の元々のロガーが出力していたような job id(JID) 等が得られません。 

その場合は以下のような Formatter を作って入れ替えるのも良いかもしれません。

```rb:config/initializer/sidekiq.rb

class HogeFormatter < Sidekiq::Logging::Pretty
  def call(severity, time, program_name, message)
    # ここでログのメッセージを定義
  end
end

Rails.logger.formatter = HogeFormatter.new

# Sidekiq::Logging.logger と入れ替え
```

`Sidekiq::Logging::Pretty` を継承した Logger にすることで、`Thread[:sidekiq_context]` に入った情報を利用することができます。

https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/logging.rb#L9-L21

```rb:sidekiq/lib/sidekiq/logging.rb
class Pretty < Logger::Formatter
  SPACE = " "

  # Provide a call() method that returns the formatted message.
  def call(severity, time, program_name, message)
    "#{time.utc.iso8601(3)} #{::Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{context} #{severity}: #{message}\n"
  end

  def context
    c = Thread.current[:sidekiq_context]
    " #{c.join(SPACE)}" if c && c.any?
  end
end
```

上記コードを見て分かる通り、`#context` を呼び出せばスペースで区切られた文字列を直接利用することも可能です。

### Thread.current[:sidekiq_context] の内容は

デフォルトの Pretty Formatter が出すログは以下のようなものですが、その内の `HogeWorker JID-bda742542c60e10e4423e944` の部分ですね。Job Id(JID) と Worker の class 名です。

```
2016-10-06T04:07:04.705Z 68527 TID-oxs3ft3jg HogeWorker JID-bda742542c60e10e4423e944 INFO: start
2016-10-06T04:07:04.924Z 68527 TID-oxs3ft3jg HogeWorker JID-bda742542c60e10e4423e944 INFO: done: 0.219 sec
```

コードを見ると BID も存在すれば出すようなので、Sidekiq::Batch も見越したコードのようです。

https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/middleware/server/logging.rb#L26

```rb:sidekiq/lib/sidekiq/middleware/server/logging.rb
def log_context(worker, item)
  klass = item['wrapped'.freeze] || worker.class.to_s
  "#{klass} JID-#{item['jid'.freeze]}#{" BID-#{item['bid'.freeze]}" if item['bid'.freeze]}"
end
```

### 例えば特別なログを出す Sidekiq middleware を作る

そういうケースにおいて、Sidekiq の Logger をアプリ側の Logger に合わせておけば、いきなり middleware の内部で `Rails.logger` と呼ばずに済んでよいですね。
Arch LinuxでSystemd-nspawnを使ってSpacemacsをGUIで起動し、Emacs-mozcを使う

ついにできた。誰が得をするのかという環境ですが、

- Arch Linux
- Systemd-nspawnによる仮想環境
- Host側で起動しているXserverに画面を映す

# 動機

Arch Linuxではfcitx-mozcとemacs-mozcが競合しており、双方を使うことができない

そこで、Systemd-nspawnによりコンテナを作り、そこで最低限のアプリケーションをインストールし、emacs-mozcを利用する。

ついでに、話題のエディタSpacemacsも利用する。

# 手順


まずはSpacemacsをホスト側に持ってくる

```bash
mkdir -p $HOME/etc/spacemacs
git clone https://github.com/syl20bnr/spacemacs $HOME/etc/spacemacs/.emacs.d
```


mozcのインストールスクリプトを作成

```bash:install_mozc.sh
#!/bin/bash
# This script is for install emacs-mozc to arch

UID=1000

cat << 'EOF' >> /etc/pacman.conf
[pnsft-pur]
SigLevel = Optional TrustAll
Server = http://downloads.sourceforge.net/project/pnsft-aur/pur/$arch
EOF

pacman -Syy
pacman -S --needed git emacs emacs-mozc adobe-source-code-pro-fonts

useradd --create-home --uid $UID arch
```

Arch Linuxのコンテナを作成し、mozcのインストールスクリプトをホストからゲストへコピー

```bash:create_container
#!/bin/bash

mkdir -p $HOME/var/container/arch
sudo pacstrap -i -c -d $HOME/container/arch base　base-devel
sudo cp install_mozc.sh $HOME/var/container/arch/tmp/
```

コンテナに入り、↑でコピーしたmozcのインストールスクリプトを実行する

```bash
sudo systemd-nspawn -D $HOME/container/arch
chmod +x /tmp/install_mozc.sh
/tmp/install_mozc.sh
```

最後に、コンテナからXに画面を映せるように設定

```bash
xhost +local:
```

SPACEMACSを起動するには、下記のスクリプトを実行すればOK。パスの通っているところに置こう。

```bash:spacemacs
#!/bin/bash

CONTAINER_USER=arch
CONTAINER_HOME=/home/$CONTAINER_USER

sudo systemd-nspawn \
     --setenv=DISPLAY=$DISPLAY \
     --setenv=SHELL=/bin/bash \
     --setenv=HOME=$CONTAINER_HOME/etc/spacemacs \
     --bind=$HOME/etc/spacemacs:$CONTAINER_HOME/etc/spacemacs \
     --bind=$HOME:$CONTAINER_HOME/host_home \
     --bind=/tmp/.X11-unix \
     -D ~/var/container/arch \
     -u $CONTAINER_USER \
     emacs
```

いやあ疲れた。動作はちょっともっさりしている。

# 参考

- http://qiita.com/syui/items/8dcbee22bc49970de4bd
- https://wiki.archlinuxjp.org/index.php/Change_Root
- https://wiki.archlinuxjp.org/index.php/Systemd-nspawn
Reactのテストを mocha + nyc から Jestにしてみる


# mocha + nycのころ

## プロジェクト構成など

package.jsonはこんな感じ。

```package.json
{
  "test": "NODE_ENV=test mocha test/",
  "coverage": "nyc -c npm test"
}
```
* /srcにソースディレクトリ
* /testにテストディレクトリ
* MISC
	* [jsdom-global](https://github.com/rstacruz/jsdom-global)使って色々小細工していた。

## mocha -> jestにするモチベーション

* 興味本位
* Jestがv15.0.0でAutomockingを捨てて本気を出してきたのでちょっと使ってみたかった気持ち
* Railsプロジェクトにjavascriptプロジェクトを混ぜようとしたとき、mochaのテストディレクトリに悩んでしまうぐらいなら、Jestのテストフでやってみようかと思った
    * jestでは、/srcなどのコードに対して、`/src/__tests__`というディレクトリを作るか、`some.test.js`という名前をつけるのがデフォルト設定になっている。
    * mochaでも設定によっては可能
* coverage周りに感じた魅力


# jestへのmigrate

## package.jsonまわり

とりあえずmochaからの移動をまず考えるので、`test/**/*.js`のような感じでテストディレクトリの指定を行う。
coverage入りなので、coverageコマンドも変える

```package.json
{
  "scripts":{
    "test": "NODE_PATH=${npm_package_config_resolve} jest ",
    "coverage": "npm test -- --coverage",
  },
  "jest": {
    "testRegex": "test/.*.js"
  }
   :
}
```

`test/mock`みたいなところに非テストデータ入れてるならignorePatternを設定

```json
  jest": {
    "testPathIgnorePatterns": ["node_modules", "test/mock"],
  }
```

## ~~テストのskip~~

**2016/10/14追記：いつのまにか`.skip`が実装されていたようです。**
https://facebook.github.io/jest/docs/api.html#basic-testing
https://github.com/facebook/jest/pull/1632


mochaだと`.skip`だった

```js
describe('some test', () => {
  it.skip('skip')
})
```

jestだと`xit`や`xdescribe`になる。

```js
xdescribe('some test', () => {
  xit('skip')
})
```


## 空ファイルはエラーになる
```
Your test suite must contain at least one test.
```

```js
xdescribe("todo", () => {
  xit("todo")
})
```

```js
it("todo", () => {}
```

## jsdomは消せる
jestにして嬉しいポイント

mochaだと色々頑張っていたが、既に入っているので気にしなくて良くなる
http://facebook.github.io/jest/docs/api.html#testenvironment-string

## assertとexpect

標準では`expect`というmatcherが用意されており、そちらに重点が置かれている。
個人的には`assert`を使っていきたいので、ちょっと不満ポイント。

assertも使えないわけではない。普通にthrowされればエラーとなる。

ただし、expect(foo) で書くとエラー時の表示がきれいになる。

このぐらい違う。
無理に全部置き換えるまででもないかなと思ったが、郷に入れば郷に従えで今後はexpectに置き換えていくだろうなと思う。

`addMatchers`などあるのでもしかするとなんとかならないかなと思っているが未調査。

![6__npm_run_test__node_.png](https://qiita-image-store.s3.amazonaws.com/0/7307/825f40dd-6056-ef6c-6df9-44ede54e41f5.png "6__npm_run_test__node_.png")

![6__npm_run_test__node_.png](https://qiita-image-store.s3.amazonaws.com/0/7307/2539883c-87fb-08d6-9fbb-a572952c0827.png "6__npm_run_test__node_.png")


## watchモード

jestにちょっと不満ポイント２。

mochaだと`-w`で良かった

```
$ mocha -w
```

jestは`--watch`。
ちなみに`-w`は`--maxWorkers`という値の省略になってしまっている。

```
$ jest --watch
```

しかしwatchモードの挙動自体は結構イケてる

# 感想
* 移植自体は簡単
* やはりReactとは相性がとても良い。
* シンプルさというよりはフルスタックさに振っている感じがある
* 並列でテストを走らせてくれているっぽい。
* React以外のプロジェクトで普段使いするかというと、うーんという感じ。
* 無理して移植するほどのメリットがあるかというと、そんな強くもない
	* とはいえ、そもそも移植コスト掛かってないので、興味があったらやってみてもいいと思う
* Snapshotテストとか手出し始めたらまた感想変わるかも
* なぜかCircle-CIでテストが遅くなっているので調査中
* そこそこ大規模なReactプロジェクトで「テスト入れるぞ！」となったときの選択肢としては全然アリ
	* mochaでちょっとしんどかったjsdomまわり気にしなくていいのも大きい
XCode8.0にしたらcapybara-webkitがビルドできません（＞＜）

こんなん出る。言われた通り `/usr/bin/xcodebuild` してみるも、XCodeのプロジェクトないしって怒られる。

```shell-session
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/path/to/project/vendor/bundle/ruby/2.3.0/gems/capybara-webkit-1.11.1
/Users/me/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20161006-6647-1m1u5c7.rb extconf.rb
Project ERROR: Xcode not set up properly. You may need to confirm the license agreement by running /usr/bin/xcodebuild.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/me/.rbenv/versions/2.3.1/bin/$(RUBY_BASE_NAME)
	--with-gl-dir
	--without-gl-dir
	--with-gl-include
	--without-gl-include=${gl-dir}/include
	--with-gl-lib
	--without-gl-lib=${gl-dir}/lib
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
Command 'qmake ' failed

extconf failed, exit code 1

Gem files will remain installed in
/Users/me/path/to/project/vendor/bundle/ruby/2.3.0/gems/capybara-webkit-1.11.1 for inspection.
Results logged to
/Users/me/path/to/project/vendor/bundle/ruby/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/capybara-webkit-1.11.1/gem_make.out

An error occurred while installing capybara-webkit (1.11.1), and Bundler cannot continue.
Make sure that `gem install capybara-webkit -v '1.11.1'` succeeds before bundling.
```

本家に書いてある。
https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit#xcode-80

/usr/local/Cellar/qt55 的なディレクトリに入っている設定ファイルを書き換える（！）

わからなければ、qtのあるディレクトリで上記を実行するとファイル名がわかるけど遅い？
`grep -rn /usr/bin/xcrun .`

ので検索してもよい。

```shell-session
find /usr/local/Cellar -name "default_pre.prf"
/usr/local/Cellar/qt5/5.5.0/mkspecs/features/default_pre.prf
/usr/local/Cellar/qt5/5.5.0/mkspecs/features/mac/default_pre.prf
/usr/local/Cellar/qt5/5.5.0/mkspecs/features/win32/default_pre.prf
/usr/local/Cellar/qt5/5.5.0/mkspecs/macx-ios-clang/features/default_pre.prf
```

今回は以下だった。

```shell-session
/usr/local/Cellar/qt5/5.5.0/mkspecs/features/mac/default_pre.prf
```

```
isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null")))): \
```

を下のように書き換える。

```
isEmpty($$list($$system("/usr/bin/xcrun -find xcodebuild 2>/dev/null"))): \
```

それからリビルドせぇと。動いたけど、動いたけどさぁ。
Good to know: JavaScript

#### default value for undefined property in Object

Behavior when there is no property

```js
var object = {
  value: 'hoge',
};
console.log(object.key);
// key is not exist, therefore will be undefined
undefined
```

in js `undefined` treat as `false`.

```js
var object = {
  value: 'hoge',
}
var defaultObject = {
  value: 'key' in object ? object.key : 'defaultValue',
};
// or
var defaultObject2 = {
  value: object.hasOwnProperty('key') ? object.key : 'defaultValue',
};
console.log(defaultObject);
// object.key is not exist, therefore will be `defaultValue`
'defaultValue'
'defaultValue'
```

```js
var object = {
  value: 'hoge',
};
var defaultObject = {
  key: 'defaultValue',
};
$.extend(defaultObject, object);
```

#### delete value by key in obj

```js
var obj = {
  keyA: 'a',
  keyB: 'b',
  keyC: 'c',
};

delete arr['keyB'];
// or
delete arr.keyB;
console.log(obj);
Object {keyA: "a", keyC: "c"}
```

#### Object.assign

When merge objects with same properties, right object is higher priority.

```js
var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
```

#### `||` and `&&` in Javascript

In Javascript `||` and `&&` are not exactly same with boolean operator.

case 1. `||` means left value is `true` return left value.
case 2. `||` means left value is `false` return right value.
case 3. `&&` means left value is `ture` return right value.
case 4. `&&` means left value is `false` return left value.

```js
// case 1
var x = 'a' || 'b'; // x -> 'a'

// case 2
var x = '' || 'a'; // x -> 'a'

// case 3
var y = 'a' && 'b'; // y -> 'b'

// case 4
var y = '' && 'a'; // y -> ''
```

#### `true` and `false` in Javascript

| value     | type      | results |
|:----------|:----------|:------  |
| {}        | object    | true    |
| 'hoge'    | string    | true    |
| ''        | string    | false   |
| 1         | number    | true    |
| -1        | number    | true    |
| 0         | number    | false   |
| []        | object    | true    |
| true      | boolean   | true    |
| false     | boolean   | false   |
| undefined | undefined | false   |
| null      | null      | false   |

### Good to know: jq

#### Load jquery on Chrome console

```js
var jq = document.createElement('script');
jq.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(jq);
// ... give time for script to load, then type.
jQuery.noConflict();
```

#### jquery selector

```js
// select element by attr
$('[data-react-id]=""')
```
LAMとTC2で地形を作ってみた

# 地形を作る要素は二つあります。

![HighField.png](https://qiita-image-store.s3.amazonaws.com/0/32364/e50ce856-227c-9f40-666f-406dd0dc0cad.png)
1,ハイフィールド
地形の高さのみで大雑把な設計をします。
ディスプレースメントマップみたいなものです。
[Terrain composer2(TC2)](http://www.terraincomposer.com/)の役割になります。


![material.png](https://qiita-image-store.s3.amazonaws.com/0/32364/a800bfad-9d6d-8d4b-5eab-880145884abf.png)
２、地面マテリアル
地面に色を塗ります。
[Landscape auto material(LAM)](http://www.veagames.com/blank-v642z)の役割になります。
※尚、ここで見える草も全てマテリアルとして作成されています。
※実際にはもっと奇麗な絵を出せますがVR用にかなり強引な軽量化をしてます。

# Terrain composer2(TC2)でハイフィールドを作る。
それぞれの要素を順番に作成します。
まずはハイフィールドを作成します。
![合成例１.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/b55cae78-6b50-ab55-dede-45d110a960f6.jpeg)
ＴＣ２画面の基本的な使い方

![山合成.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/d243a727-91ac-4f43-6728-95a983551088.jpeg)
３つの山を合成したりとかもできます。
どういう事が出来るのかの詳細は下記のサイトでご確認ください。
結構凄いです。
http://www.terraincomposer.com/


![山ＡＢＣの合成結果.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/f2fca44b-3fdd-6a17-741c-12f80c80f9f4.jpeg)
合成結果ハイフィールドをメッシュで表示するとこんな感じになります。
※「２、地面マテリアル」と書かれたところのＣＧはこの山にマテリアルを付けたものになります。
![export.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/4ddf2fbe-4ae8-6c20-2b16-3e7bc7cf40f2.jpeg)
エクスポートすると16bitのグレイスケールrawデータが出力されます。

# ハイフィールドをＵＥ４へ取り込み、地面マテリアルを張る。
![山を作る.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/3620e35d-7df8-54c7-410c-a991a27e0699.jpeg)
上記手順でインポート

![tarrain init.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/86c4f057-eace-f430-1e07-2ee6ca589e59.jpeg)
インポートが完了するとＴＣで作成した絵が出ます。

![landscape.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/c1a50961-a177-61c8-abde-e781e3373531.jpeg)
次にLAMのマテリアル「Landscape_Automaterial_Inst」を先ほど作成したLandscapeへ割り当てます。

![movable.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/6ed8a404-18ee-a9a3-dd93-3c2fca4f9f7d.jpeg)
次に広域を照らしているライトをMovableにします。

![build.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/2176618d-67c1-2f77-e825-0644d03e7a7d.jpeg)
最後にビルドします。

![materialed.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/1b21632d-f96e-b26a-61e8-4aa6ddfa6e68.jpeg)
こんな感じの絵が出てきたら成功です。
失敗するとものすっごく重くなります。
Twigで変数が未定義の場合に初期化する

気づけば簡単ですがはまったのでメモ

これではhoge変数は初期化されない

```
 {% set hoge|default(false) %}
```

これで初期化される

```
 {% set hoge = hoge|default(false) %}
```

複数のControllerから呼ばれるようなtwigファイルの場合、
すべてのControllerにいちいち定義を書くのがめんどくさかったのでtwig上でなんとかしようとした結果。

ただこの書き方をしているとtwigが汚くなるし、デザイナーの人などが見たときにわかりにくくなる可能性が高いので
乱発は控えたほうがよさそう。
PowerShellメモ　ファイル更新日時変更(touch)

# 概要

ファイルの更新日時(タイムスタンプ)を変更する方法。

## 書式

```PowerShell
Set-ItemProperty -Path 【ファイルパス】 -Name LastWriteTime -Value $(Get-Date)
```

```PowerShell:もっと短く
sp -path 【ファイルパス】 -n lastwritetime -va $(date)
```

## 実行例

```PowerShell
sp -path .\hoge.txt -n lastwritetime -va $(date)

sp -path C:\Work\piyo.csv -n lastwritetime -va $(date)

# 任意の日付を設定する例
sp -path .\hoge.txt -n lastwritetime -va $(date '2016/10/06 22:30:45')
```

## 関数版

```PowerShell
<#
.SYNOPSIS
    ファイル更新日変更

.DESCRIPTION
    指定したファイルの更新日を現在日付に設定する。

.PARAMETER path
    対象ファイルパス
#>
function touch([Parameter(Mandatory, ValueFromPipeline=$true)][string]$path)
{
    Set-ItemProperty -Path $path -Name LastWriteTime -Value $(Get-Date)
}
```

## 関数版の実行例

```PowerShell
touch .\hoge.dat
```

# 動作確認した環境
* PowerShell V4
* PowerShell V5
Excel の座標値を Leaflet に展開する

Excel に記録された座標値を地理院地図上に点としてプロットする Excel VBA を作成しました。
座標値は直接入力か、SIMA ファイルから読み込むことでリストされます。

原型は Facebook で K'z Lab さんが投稿していた[Excelから地理院地図（leaflet）にダイレクトにプロットする](https://www.facebook.com/kzlabo/posts/1138827029530365)というものです。



ソース一式を Github から zip ファイルで[ダウンロード](https://github.com/kmr-hryk/excel-leaflet/archive/master.zip)できます 
zip を展開して `xlsm/bin` フォルダの中に Excel のファイルが入っています。
展開先の Leaflet も同じリポジトリに入れてあり、表示もできるようにしてあります。

## 元ネタとの違い
### SIMA ファイルを読み込める
点名と座標値を直接入力する他、既存の SIMA ファイルを読み込むことができます。

### 座標値を GeoJSON に変換してからプロットする
SIMA の座標を GeoJSON 文字列に変換してから Leaflet に投げています。  
地図を表示する Web サイトでは `proj4.js` と `proj4Leaflet .js` を使うことで人が XY 座標を緯度経度に変換しなくてもプロットが可能です。
ただし、proj4 で XY 座標を緯度経度に変換する場合も座標系の番号が必要なので座標値と共に入力しておく必要があります。  

なお、`proj4.js` では平面直角座標系の投影を持っていないので `main.js` の中で19の座標系で使われるパラメータを定義しています。

### GeoJSON にもエクスポート可能
せっかく GeoJSON 文字列に変換しているので、データを GeoJSON として保存することもできるようにしました。  
しかし、 JSON データは原則 `UTF-8` で保存する必要があり、文字列を `UTF-8` で保存するために `ActiveX Data Objects 6.0` を参照しています。
パソコンに `ActiveX Data Objects 6.0` が入っていないとエラーが出て実行できないかもしれません。MS Office が入っていれば大丈夫だと思いますが…。

### 緯度経度は扱えない
平面直角座標系の XY 座標のみで緯度経度の位置情報は扱えません。
座標系の番号に「緯度経度」を追加したりすればいいのですが、とりあえずやってません。

### さて
データのある行の検出がモジュールによって違っています。
最初は定数として定義
GeoJSON や SIMA を作るところでは引数で受け取る
そのほかに検索して値を取り出す関数を利用する
まとめないと改修しようとしたときに面倒ですね。
ActiveRecordでincludesしているのにキャッシュが効かない場合

# キャッシュが効かないとき
``` ruby
# app/model/category.rb
class Category < ApplicationRecord
  has_many :books
end

# app/model/book
class Book < ApplicationRecord
  scope :published, -> { where(published: true) }
  belongs_to :category
end
```

``` ruby
# app/controller/books_controller

def index
  @category = Category.All.includes(:books)
end

```

``` slim
# app/views/books/index.html.slim

- @categories.each do |category|
  h1
    = category.name
  table
  - category.books.published.each do |book|
    tr
      td = book.name
      td = book.author
```

このように、せっかく`includes(:book)`をしても、`category.books.published`や、`category.books.where(published: true)``category.books.order_by(id: :desc)`のように、子のモデルにクエリを付け足してしまうとキャッシュが効かず、N+1問題が発生してしまう。

# どうするか

``` ruby
# app/model/category.rb
class Category < ApplicationRecord
  has_many :books
  has_many :published_books, -> { published }, class_name: 'Book'
end

# app/model/book
class Book < ApplicationRecord
  scope :published, -> { where(published: true) }
  belongs_to :category
end
```

``` ruby
# app/controller/books_controller

def index
  @category = Category.All.includes(:published_books)
end

```

``` slim
# app/views/books/index.html.slim

- @categories.each do |category|
  h1
    = category.name
  table
  - category.published_books.each do |book|
    tr
      td = book.name
      td = book.author
```

` has_many :published_books, -> { published }, class_name: 'Book'`のように、has_manyにスコープを渡してやり、それを`includes`の引数に渡すと、キャッシュが効いてくれる。

# 備考
ActiveRecord::QueryMethodsのコメントには、

``` ruby
    # === conditions
    #
    # If you want to add conditions to your included models you'll have
    # to explicitly reference them. For example:
    #
    #   User.includes(:posts).where('posts.name = ?', 'example')
    #
    # Will throw an error, but this will work:
    #
    #   User.includes(:posts).where('posts.name = ?', 'example').references(:posts)
    #
    # Note that +includes+ works with association names while +references+ needs
    # the actual table name.
```

とあるので、
`Category.includes(:books).merge(Book.published).references(:books)`としてもよい。

なお、どちらの場合においても、Bookのスコープの条件が、親のモデル（Category）になるため、上の例ではpublishedなbookが一つもないcategoryはクエリの結果として出てこないので注意。
複数のAdNetworkを切り替えて広告表示するライブラリ作った

iOS/Androidで、複数のAdNetworkを切り替えて広告表示するライブラリ

**AdSwitcher**
https://github.com/tkyaji/AdSwitcher


# できること

* AdMob80%、Nend20%、みたいな感じで確率で切り替えて広告表示する
* UnityAds -> AppLovin みたいな感じで、ローテーションで切り替えて広告表示する
* n回に1回広告出す


# やらなきゃいけないこと
* AdSwitcher本体を入れる
* 使いたい広告のSDKと、Adapterを入れる
* [JSONの設定ファイル](https://github.com/tkyaji/AdSwitcher/wiki/%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)を用意する


# 対応プラットフォーム
* Unity
* iOS
* Android

# 対応 AdNetwork

* AdMob
* Nend
* i-mobile
* Facebook
* AMoAd
* AdGeneration
* Five
* UnityAds
* AppLovin
* Maio
* AdColony
* Zucks
* Tapjoy
* アドフリくん

# サンプルコード (Unity)

```csharp

// 最初に設定ファイルをロードする
AdSwitcherConfigLoader.Instance.StartLoad("http:/yourdomain/adswitcher.json");


// バナー広告
var bannerView = new AdSwitcherBannerView(AdSwitcherConfigLoader.Instance,
                                          "banner",
                                          BannerAdSize.Size_320x50,
                                          BannerAdAlign.BottomCenter);
bannerView.Show();


// インタースティシャル広告
var interstitial = new AdSwitcherInterstitial(AdSwitcherConfigLoader.Instance,
                                              "interstitial");
// ロード完了時に表示する
interstitial.SetAdLoadedHandler((adConfig, result) => {
	if (result) {
		interstitial.Show();
	}
});



```


詳細は[Wiki](https://github.com/tkyaji/AdSwitcher/wiki)を参照してください
App Store / Google Play におけるキーワードの検索ボリューム推定について ( ASO )

今日 [ASOの基礎とASOでのAPP ANNIEの活用法](http://aso.splashthat.com/sgmail) で App Annie の新機能である検索ボリュームについて聞くことができたので、App Store / Google Play の検索ボリュームについてまとめてみる。

## これまでの検索ボリューム推定

これまで、App Store / Google Play でユーザーが検索したキーワードの検索数（＝検索ボリューム）を知ることは難しかった。

ASO の PDCA を回す中で、「**キーワードA** より **キーワードB** の方が検索数が大きそう」というのを推定したり、App Store / Google Play の検索サジェストから推定したり、ウェブの検索ボリュームを調べるツールからアプリの検索ボリュームを想像したりとかその程度だった。

## App Annie の検索ボリューム

今回追加された App Annie の検索ボリュームの項目の話を聞いたら、検索ボリュームを表す指標として、一番良い指標のような気がした。

少し分かりづらいかもしれないが、 App Annie の検索ボリュームを算出するアルゴリズムについて教えてもらったものを以下に説明する。

App Annie はアプリ事業社からアプリダウンロード数のデータを提供してもらっている。データ数が総アプリの 10% ほどを占めているので、それ以外のアプリのダウンロード数もだいたい分かっている。このデータは推定ダウンロード数という形で提供されている。

また、それぞれのアプリのキーワード順位が分かっている。これはユーザーから見える、誰でも入手可能なデータで正確なデータ。

アプリのダウンロード数とキーワード順位の大量のデータからデータ解析すると、「このキーワードがどの程度ダウンロードに寄与していそう」というおおまかな予測ができる。これを検索ボリュームという値で提供しているらしい。

値は 100 点満点（？）のスコアのような形で提供されており、検索された絶対数ではない。そのためキーワード同士を比較するのに使うと良い。

これはかなり有益なデータだと思う。有料会員しか見れないのがつらいが。。。

## ちなみに Searchman の検索ボリュームって

ちなみに、 Searchman の検索ボリュームは、あるキーワードで検索した時に検索結果として表示されているアプリの総数のみを指標として "検索回数" という名前でデータ提供している。検索ボリュームというより競合数かな。

## まとめ

App Annie の有料会員のみ見れる機能だが、真面目に ASO に取り組みたい人にとっては、お金を払ってでも欲しいこれまでにはない精度の情報な気がした。自分もまた真面目に ASO やる時に検討しようかな。

元記事はこちら：[App Annie の新機能で App Store / Google Play におけるキーワードの検索ボリュームが知れるようになったらしい](http://monopocket.net/blog/aso/appannie-search-volume/)
YamahaのRTXへSSH中にタイムアウトにならないためのTeraTermマクロ

4分間文字が入力されないか監視して、入力されなかったら「show environment」コマンド実行

```
do
 timeout = 240
 wait ''
 if result=0 then
  sendln 'show environment'
 endif
loop
```
UIProgressView を指定した秒数でアニメーションさせる

小ネタですが、UIProgressView を指定秒数でアニメーションさせる方法です。

```objc
// 初期化
_progressView.progress = 1;
[_progressView layoutIfNeeded];

[UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
	_progressView.progress = 0;
	[_progressView layoutIfNeeded];
} completion:^(BOOL finished) {
	NSLog(@"アニメーション完了");
}];
```

```[_progressView layoutIfNeeded];``` がポイントで、これがないと期待通り動作しません。
カウントダウン表示などに便利です。いつか必ず皆さんのお役に立つでしょう。
Webpackを使用してVue.jsを走らせるためのメモ

# Webpackを使用してVue.jsを走らせるためのメモ

## 前提条件
 - `node`, `npm` が入っていること。

```
$ cat /etc/issue webpack_test2
CentOS release 6.8 (Final)
Kernel \r on an \m

$ node -v
v6.6.0
$ npm -v
3.10.3
```

## webpack, vue のインストール

```
$ npm init
$ npm install vue --save
$ npm install webpack --save-dev
```

グローバルインストールしていないので、パスは通っていない。

## ファイルの用意

index.html

```html
$ cat index.html
vagrant-centos65:vagrant$ cat index.html                                                                 vuetest
<!DOCTYPE thml>
<html lang="ja">
<head>
	<title>Webpack test</title>
</head>
<body>
	<div id="app">
		<p>{{text}}</p>
	</div>
	<script type="text/javascript" src="js/bundle.js"></script>
</body>
<html>
```

app.js

```javascript
$ cat js/app.js
var Vue = require('vue');

var vm = new Vue({
  el: '#app',
  data: {
      text: "hello world"
  }
});
```

## ビルド
```shell-session
$ ./node_modules/.bin/webpack js/app.js js/bundle.js --resolve-alias vue="vue/dist/vue.js"
Hash: e33fc64a7e1502f6cbff
Version: webpack 1.13.2
Time: 286ms
    Asset    Size  Chunks             Chunk Names
bundle.js  197 kB       0  [emitted]  main
   [0] ./js/app.js 104 bytes {0} [built]
    + 1 hidden modules
```

`--resolve-alias`を入れないと、デフォルトでVue.jsが[Runtime-only build](http://vuejs.org/guide/installation.html#Standalone-vs-Runtime-only-Build)になり、正常に動いてくれなかった。

後はindex.html を開けばvueでhello worldが表示される。

## 設定ファイルからビルドする場合
以下のようにwebpack.config.jsを記述すればOK。

```javascript
$ cat webpack.config.js                                                          vuetest
module.exports = {
  entry: './js/app.js',
  output: {
    path: __dirname,
    filename: './js/bundle.js'
  },
  module: {
    loaders: [
    ]
  },
  resolve: {
    alias: {
      vue: 'vue/dist/vue.js'
    }
  }
};
```

webpackを叩けばファイルを読み込んで実行される。

```shell-session
$ ./node_modules/.bin/webpack
 Hash: 4e85503c2b0c78bc3f13
Version: webpack 1.13.2
Time: 297ms
         Asset    Size  Chunks             Chunk Names
./js/bundle.js  197 kB       0  [emitted]  main
   [0] ./js/app.js 104 bytes {0} [built]
    + 1 hidden modules
```
元体育会信金マンがプログラミングに挑む１（４ヶ月目）

どの言語に手を出せばいいのかやっと絞れてきた感じです。

<h2>４ヶ月目できるようになったこと</h2>
「html&css」
・divの理解
・floatやpositionなどでの様々な配置の方法

「js」
・jQueryのプラグインの使い方
・条件分岐

「その他」
・htaccessによるスマホ対応
・リスティング広告

<hr>
新しいことにチャレンジしたというよりは実践の月でした。しかもまだまだ理解不足。
BootStrap、React、PHPまで今月は行きたい！
MySQL5.1から5.7にバージョンアップさせるための手順

## やりたいこと

* MySQLを5.1から5.7にバージョンアップさせる
* ただ、5.1から5.7に直アップグレードはできないので、5.1を5.6に上げてから、5.6を5.7にする	


## 手順

* centosバージョン

```
[root@mysql vagrant]$ cat /etc/centos-release
CentOS release 6.4 (Final)
```

* mysqlバージョン

```
[vagrant@mysql ~]$ mysql --version
mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
```


* mysqlシャットダウン

```
[root@mysql vagrant]# service mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@mysql vagrant]#
```

* 既存のmysqlを削除

```
[root@mysql vagrant]# yum remove mysql*
```

* rpmリポジトリをyumに追加（必要に応じて）

```
[root@mysql vagrant]# yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

* 5.6を有効化

```
[root@mysql vagrant]# yum-config-manager --disable mysql55-community
[root@mysql vagrant]# yum-config-manager --enable mysql56-community
```

* インストール

```
[root@mysql vagrant]# yum install mysql mysql-devel mysql-server mysql-utilities
```

* mysql_upgrade

```
[root@mysql vagrant]# service mysqld start
Starting mysqld:                                           [  OK  ]
[root@mysql vagrant]# mysql_upgrade -u root
```

* 5.6になっているか確認

```
[vagrant@mysql ~]$ mysql --version
```

* mysqlシャットダウン

```
[root@mysql vagrant]# service mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@mysql vagrant]#
```

* 既存のmysqlを削除

```
[root@mysql vagrant]# yum remove mysql*
```

* rpmリポジトリをyumに追加（必要に応じて）

```
[root@mysql vagrant]# yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

* 5.7を有効化

```
[root@mysql vagrant]# yum-config-manager --disable mysql56-community
[root@mysql vagrant]# yum-config-manager --enable mysql57-community-dmr
```

* インストール

```
[root@mysql vagrant]# yum install mysql mysql-devel mysql-server mysql-utilities
```

* mysql_upgrade

```
[root@mysql vagrant]# service mysqld start
Starting mysqld:                                           [  OK  ]
[root@mysql vagrant]# mysql_upgrade -u root
```


## 結果

mysql5.1から5.7に上がることを確認
MySQL5.6から5.7にバージョンアップさせるための手順


## やりたいこと

* MySQLを5.6から5.7にバージョンアップさせる


## 手順

* centosバージョン

```
[root@mysql vagrant]$ cat /etc/centos-release
CentOS release 6.4 (Final)
```

* mysqlシャットダウン

```
[root@mysql vagrant]# service mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@mysql vagrant]#
```

* 既存のmysqlを削除

```
[root@mysql vagrant]# yum remove mysql*
```

* rpmリポジトリをyumに追加（必要に応じて）

```
[root@mysql vagrant]# yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

* 5.7を有効化

```
[root@mysql vagrant]# yum-config-manager --disable mysql56-community
[root@mysql vagrant]# yum-config-manager --enable mysql57-community-dmr
```

* インストール

```
[root@mysql vagrant]# yum install mysql mysql-devel mysql-server mysql-utilities
```

* mysql_upgrade

```
[root@mysql vagrant]# service mysqld start
Starting mysqld:                                           [  OK  ]
[root@mysql vagrant]# mysql_upgrade -u root
```

## 結果

mysql5.6から5.7に上がることを確認
cURL 関数の利用メモ


PHP の [**cURL**](http://php.net/manual/ja/ref.curl.php) 関数を使って、URLを検証する。

###利用シーン
外部のサイトにリダイレクトする前、遷移先のURLが問題なくアクセスできるかを確認する。
問題あれば、リダイレクトせず内部のエラーページに遷移することによって、UXを向上することを目指す。



####例
※ [**curl_setopt**](http://php.net/manual/ja/function.curl-setopt.php)で、cURL 転送用オプションを設定する。　


```php

 function CheckUrl($url) {

　　　//cURL セッションを初期化する
      $ch = curl_init($url);


      // TRUE を設定すると、curl_exec() の返り値を文字列で返す。
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  

      // FALSE を設定すると、cURL はサーバー証明書の検証を行いません。
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

      //cURL 関数の実行にかけられる時間の最大値。
      curl_setopt($ch, CURLOPT_TIMEOUT, 15); 

      //接続先がUser-Agentが必要な場合、HTTP リクエストで使用される User-Agentを指定しないと、
　　　//500エラーが帰ってくるので、ダミー値を入れて確認する方法もある。
      curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) xxxxxxxx xxxxxxxxxxx');

      //TRUE を設定すると、HTTP で 400 以上のコードが返ってきた際に 処理失敗と判断します。
      curl_setopt($ch, CURLOPT_FAILONERROR, true); 


      // URL を取得し、ブラウザに渡します
      curl_exec($ch);

      //接続問題なければ　curlErrorNoが０を返す
      $curlErrorNo = curl_errno($ch);

      // cURL リソースを閉じ、システムリソースを解放します
      curl_close($ch);


      if($curlErrorNo != 0){
          return false;
      }
      return $url;
  }

```
富士通のArrows M03でSDカードを内蔵ストレージとして使う方法

Android 6.0 ではSDカードを内蔵ストレージとして利用できる機能がありますが、Arrows M03ではそれが無効化されています。それをなんとかできないかと調べた結果、下記の手順でできることが分かりましたのでまとめてみました。

# 前提条件
まず、PCを用意し、そこでadbコマンド使えるようにしてください。これができないと何も始まりません。「adbコマンドって何？」って人はやめておいた方がいいかも...。
ちなみに下記の手順ではMacを利用することを前提としています。


# 設定手順
## 1.M03のUSBデバッグ機能を有効化

（１）[設定] -> [端末管理] -> [端末情報]にある”ビルド番号”を七回くらい連続でタップします。そうすると端末管理に「開発者向けオプション」というメニューが出てきます。

（２）「開発者向けオプション」を有効化し、さらにその中の「USBデバッグ」にチェックを入れてください。

## 2.SDカードを内部ストレージ化
（１）M03をMacにUSBケーブルで接続します。

（２）ターミナルを開き下記のコマンドを実行し、SDカードのデバイス番号（？）を取得します。

	$ cd ~/Library/Android/sdk/platform-tools
	$ adb shell
	$ sm list-disks
	
　ここでおそらく「disk:179,64」などの結果が返ってくるかと思います。これがディスク番号になります。これ以降の手順では「disk:179,64」として記載しますので、この部分はご自分の結果に置き換えてください。
　

（３）続いて下記のコマンドでSDカードを内部ストレージにします

	$ sm partition disk:179,64 private

　※上記のコマンドではSDカードを全て内蔵ドライブ化します。SDカードの半分を内蔵ストレージ化するには下記のようにします。

	$sm partition disk:179,64 mixed 50
rails rakefile

Rails.application.load_tasks

https://github.com/rails/rails/blob/master/railties/lib/rails/engine.rb#L455

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L446

https://github.com/rails/rails/blob/master/railties/lib/rails/railtie.rb#L237

https://github.com/rails/rails/blob/master/railties/lib/rails/engine.rb#L652
AWSとブックマークレットで簡単データ収集

# 自己紹介
- 夏目祐樹
  - 株式会社クリック
  - 新卒二年目の新人
- @sinofseven 
- AWS歴: 1年弱
 
---

# 物語が大好きです

---

![test](https://dekiru.net/upload_docs/img/20160901_o0100.png)

---

# Kindleには欲しいものリストがない

---

# どうやって気になる本を記録しよう

---

# ブックマーク
- スマホだといろいろ面倒
  - スマホとPCでデフォルトの保存位置が異なる
  - PCならともかく、スマホだと入力が大変
- あとで整理しようと思った時に各ブラウザのブックマークマネジャーの上でしか整理できないから面倒

--- 

# じゃあ、REST APIとブックマークレットでデータを集積できるシステムを作ろう

---

# なぜ、そんな考えになったか
派遣先のProxyでQiitaが見れなかったため、API GatewayとブックマークレットでQiitaの記事をダウンロードする仕組みを昔作っていたから

---

![Screenshot 2016-10-06 at 19.31.15.png](https://qiita-image-store.s3.amazonaws.com/0/31478/b023d51e-a9b9-aef0-92fe-2eacfefbe8bc.png)

---

![Screenshot 2016-10-06 at 19.41.38.png](https://qiita-image-store.s3.amazonaws.com/0/31478/2aef0e2f-087a-38c1-20fe-95bfdb0a510a.png)

---
# 構成
- S3にデータ保存用のJSONファイルを置く
- ブックマークレットから叩くAPI GatewayとLambdaを定義
- 保存したデータを見るためのHTMLはAPI GatewayのResponseテンプレート(?)に記述
  - 別にS3に置いても問題はない
  - HTMLファイルを置くのが面倒なのと、テンプレートに書くとWeb COnsoleだけで書ける
- 独自ドメインを使いたければCloud Frontを置いてしまえばいい

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/31478/f387ee0f-5d0f-eb1d-c66c-615088c475b0.png)

---

# 定義したAPI
- regist
  - POST
  - ブックマークレットが叩くAPI
- show
  - GET
  - Responseテンプレートの機能でJSONデータを入れたHTMLを返していた
  - データ数が多くなったら途中までしか表示されなくなった
- get
  - GET
  - showですべてのデータが見れなくなったからJSONファイルをそのまま返すAPI
  - APIで返した理由はS3のWebホスティングやCloud Frontの設定をするのが面倒だったから

---

# おまけ 〜API GatewayだけでWebページを返す方法〜
1. メソッドレスポンスの「HTTPのステータス」が"***200***"のものの、レスポンスモデルのコンテントタイプを"***text/html***"に変更する
- 統合レスポンスの「メソッドレスポンスのステータス」が"***200***"のものの、本文マッピングテンプレートに"***text/html***"を追加し、テンプレートにHTMLを記述する。  
  (VTLというテンプレートエンジンでLambdaの戻り値を使用することもできる)

---
# おまけ 〜Kindleにもほしい物リストできてました〜
![Screenshot 2016-10-06 at 19.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/31478/6313b522-ec9b-dc95-85b4-c609f23e06d9.png)

---
# おまけ 〜ブックマークレットでjQueryを使う〜
[ブックマークレットで jQuery を使う魔法の 210 文字](http://qiita.com/otchy/items/5c4f2e1b2a93ac200f1c)

![Screenshot 2016-10-06 at 19.46.51.png](https://qiita-image-store.s3.amazonaws.com/0/31478/54cda530-4863-e960-5d55-1a7d92881710.png)


---
# 最後に
- ブックマークレットとAPIでデータを登録するとPC, スマホ問わず簡単にデータの登録ができて便利
- 非常に手軽
改行コードを、CRLFからLFに変更する方法

perlファイルが改行コードがLFではなかったため、実行が失敗した。

### 問題
改行コードのせいで、/usr/bin/perlが正しく判断できなかったらしい。
以下のようなメッセージが出た。
> /usr/bin/perl^M: bad interpreter: そのようなファイルやディレクトリはありません

ちなみに、テストしたときは、perl コマンドを使って実行していたので、発見できなかった…
（うまくテストできないテストをした、超初心者のエラーか... Orz）


## 改行コード調べる方法

　```cat -e ``` 

現状の改行コードを調べる。何も表示されない場合はLF
　`$ file test.txt`
　`test.txt: ASCII text`

## dos2unix　コマンドで改行コード変換

引数に、変換したいファイル(test.txt)を指定し、変換した結果を新ファイル(new_test.txt)に保存する
　```$ cat test.txt  | dos2unix > new_test.txt　```


もし、dos2unixコマンドが入っていなかったら、yumでインストールできる。
　```$ yum install dos2unix```
　パッケージが入っているかどうか確認
　```$ rpm -qa | grep dos2unix　```



### 参考
[dos2unixコマンドで改行コード変換](http://www.unix-power.net/centos7/dos2unix.html)
[色々な改行コード変換の方法](http://qiita.com/dharry/items/b4eead2868dddf1499f0)
rails5のinitializerの読み込み順序を検証

# 結論

- 通常modeでも、apiモードでもinitializerの読み込み順序は変わらない。
- 関連
    - http://qiita.com/imasami/items/38933d0a436bb2c4d204


# 通常 mode 検証

読み込まれたファイル名をログに吐き出す一文を足すfishスクリプトを用意。まだ実行しない。

```add-log.fish
#!/usr/bin/env fish

# usage:
# /PATH/TO/RAILS_APP_HOME/add-log.fish

for file in config/initializers/*.rb
  echo "`echo #{__FILE__} >> $PWD/log/seq.log`" >> $file
end
for file in config/initializers/*/*.rb
  echo "`echo #{__FILE__} >> $PWD/log/seq.log`" >> $file
end
```

apiモードで`rails new`を実行し、前後関係を調べるためのダミーファイルを作成。

```
bundle exec rails new . -T --no-rc
bundle exec rails g scaffold user
bundle exec rails db:migrate
```
```
touch config/initializers/aa.rb
touch config/initializers/zz.rb
touch config/initializers/1z.rb
mkdir config/initializers/0
touch config/initializers/0/zzzzzzz.rb

chmod u+x add-log.fish
./add-log.fish

bundle exec rails s
```

```log/seq.log
# 説明に不要な文字列は削除済み

config/initializers/0/zzzzzzz.rb
config/initializers/1z.rb
config/initializers/aa.rb

config/initializers/application_controller_renderer.rb
config/initializers/assets.rb
config/initializers/backtrace_silencers.rb
config/initializers/cookies_serializer.rb
config/initializers/filter_parameter_logging.rb
config/initializers/inflections.rb
config/initializers/mime_types.rb
config/initializers/new_framework_defaults.rb
config/initializers/session_store.rb
config/initializers/wrap_parameters.rb

config/initializers/zz.rb
```

# api mode 検証

読み込まれたファイル名をログに吐き出す一文を足すfishスクリプトを用意。まだ実行しない。

```add-log.fish
#!/usr/bin/env fish

# usage:
# /PATH/TO/RAILS_APP_HOME/add-log.fish

for file in config/initializers/*.rb
  echo "`echo #{__FILE__} >> $PWD/log/seq.log`" >> $file
end
for file in config/initializers/*/*.rb
  echo "`echo #{__FILE__} >> $PWD/log/seq.log`" >> $file
end
```

apiモードで`rails new`を実行し、前後関係を調べるためのダミーファイルを作成。

```
bundle exec rails new . --api -T --no-rc
bundle exec rails g scaffold user
bundle exec rails db:migrate
```
```
touch config/initializers/aa.rb
touch config/initializers/zz.rb
touch config/initializers/1z.rb
mkdir config/initializers/0
touch config/initializers/0/zzzzzzz.rb

chmod u+x add-log.fish
./add-log.fish

bundle exec rails s
```

```log/seq.log
# 説明に不要な文字列は削除済み

config/initializers/0/zzzzzzz.rb
config/initializers/1z.rb
config/initializers/aa.rb

config/initializers/application_controller_renderer.rb
config/initializers/backtrace_silencers.rb
config/initializers/cors.rb
config/initializers/filter_parameter_logging.rb
config/initializers/inflections.rb
config/initializers/mime_types.rb
config/initializers/new_framework_defaults.rb
config/initializers/wrap_parameters.rb

config/initializers/zz.rb
```
RubyにおけるArrayとanyを使った条件チェック

複数の文字列のいずれかが含まれているかどうかを確認するスクリプト
見つけたコードの動きがわからなかったので、調査結果を備忘用にメモ

## やりたいこと

* ある文字列が、予め指定した文字列のいずれかを含んでいるかを確認する

## スクリプト

```ruby:
url = 'https://google.co.jp'
conditions = %w(google yahoo amazon) # ①配列の作成

if conditions.any? {|condition| url.include? condition} # ②条件判定
  puts '条件に該当するリンクです'
elsif
  puts 'このリンクは条件に該当しません'
end
```

## 解説

### ①配列の作成

%wは、文字列配列のリテラルです（ruby2.0以降）。文字列を、'や"でくくる必要がなく、また要素は半角スペースで分割します。（改行もOK）。
(...)以外にも、{...}や<...>でも等価になります。

リテラルを使わない場合、上記のコードは下記と等価になります。

```
conditions = ['google', 'yahoo', 'amazon']
```

### ②条件判定

any?の動きは下記のようになります。
真の要素があれば、ただちに true を返します。すべての要素が偽である場合に false を返します。 

```ruby:
[true, false, false].any?
=> true
[false, false, false].any?
=> false
```

ブロックを伴う場合はまた別の動きになり、
各要素に対してブロックを評価し、すべての結果 が「偽」である場合falseとなります。（ブロックが真を返した時点 で、 true を返し終了）。

ということで、上記のコードではブロック引数にArrayの値を順番に渡し、条件判定を行っています。

## 参考

* https://docs.ruby-lang.org/ja/latest/class/Enumerable.html#I_ANY--3F