OmniAICreator/Qiita-1.07M huggingface dataset:
cocos2dx install

## Cocos2dxインストール前の事前作業
1. XCodeをインストールする[ページリンク](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)

1. Android StudioとAndroid Sdkをインストールする[ページリンク](https://github.com/CyberAgent/ultima-android-sdk/wiki/Android%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89#android-studio%E3%81%A8android-sdk%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

1. Android Ndkをインストールする([Cocos2dxで提供するNDK](http://cocos2d-x.org/docs/editors_and_tools/creator-chapters/publish/cocos-framework/index.html)を使う)
  1. [android-ndk-r10e](http://cocostudio.download.appget.cn/Cocos/CocosStore/android-ndk-r10e-macosx.zip)をクリックしてダウンロードする
  1. ダウンロードしたファイルを解凍する
  1. 解凍したファイル(android-ndk-r10e)をAndroid Homeフォルダーの以下にコピーする  
例）/Users/xxx/Library/Android/android-ndk-r10e

1. Apache Antをインストールする
  ```
$ brew install ant
$ ant -version
  ```

## Cocos2dxのインストール
1. gitでcocos2dxをダウンロードする
```
$ git clone https://github.com/cocos2d/cocos2d-x.git
$ cd cocos2d-x
$ git checkout cocos2d-x-3.13.1
$ python download-deps.py
$ git submodule update --init
```

3. cocos2dxのパスを設定する

```
$ cd cocos2d-x
$ python ./setup.py
```

3. `setup.py`で`~/.bash_profile`ファイルに以下内容が設定されたことを確認する。ない場合は手動で設定する

  ```
# Users/xxx/Libraryのxxxはユーザー名です。
...
# Add environment variable COCOS_X_ROOT for cocos2d-x
export COCOS_X_ROOT=/Users/xxx/Library
export PATH=$COCOS_X_ROOT:$PATH

# Add environment variable COCOS_CONSOLE_ROOT for cocos2d-x
export COCOS_CONSOLE_ROOT=/Users/xxx/Library/cocos2d-x/tools/cocos2d-console/bin
export PATH=$COCOS_CONSOLE_ROOT:$PATH

# Add environment variable COCOS_TEMPLATES_ROOT for cocos2d-x
export COCOS_TEMPLATES_ROOT=/Users/xxx/Library/cocos2d-x/templates
export PATH=$COCOS_TEMPLATES_ROOT:$PATH

# Add environment variable ANDROID_SDK_ROOT for cocos2d-x
export ANDROID_SDK_ROOT=/Users/xxx/Library/Android/sdk
export PATH=$ANDROID_SDK_ROOT:$PATH

# Add environment variable NDK_ROOT for cocos2d-x
export NDK_ROOT=/Users/xxx/Library/Android/android-ndk-r10e
export PATH=$NDK_ROOT:$PATH

# Add environment variable ANT_ROOT for cocos2d-x
export ANT_ROOT=/Users/xxx/Library/apache-ant-1.9.7/bin
export PATH=$ANT_ROOT:$PATH
...
  ```

1. パス設定を更新する
  ```
$ source ~/.bash_profile
  ```

## Androidデモアプリの起動
1. 以下のコマンドでデモアプリを起動する

  ```
$ cd .../amoad-cocos2dx-module/AMoAdCocos2dxModuleDemo
$ cocos run -p android --android-studio

// コンパイルエラーが発生した場合は以下のコマンドを使ってください
// $ cocos compile -p android --android-studio --app-abi armeabi-v7a

$ cocos compile -p android //eclipse
  ```
IDCF Tech-Blogってどんなブログ？

##はじめに

本記事は [IDCF Cloud Advent Calendar 2016](http://qiita.com/advent-calendar/2016/idcfcloud) に参加しています。

こんにちは！IDCフロンティア　ソリューションアーキテクト部の神谷です。
今回は、IDCフロンティアが執筆・公開している「IDCF Tech-Blog」について書いていきます！

##IDCF Tech-Blogとは？
みなさん、[「IDCF Tech-Blog」](http://blog.idcf.jp/archive)をご存知ですか？
IDCFクラウドやデータセンターに関しての技術ネタやノウハウを紹介している、IDCフロンティア公式のテックブログになります。
「エンジニアがブックマークしたくなるような技術にフォーカスしたブログ」を目指し、運営しています！

そんな「IDCF Tech-Blog」ですが、以下のような特徴があります。

**隔週AM10:00に記事を公開（毎週公開を目指して頑張ってます！）**
2016年9月、社内でテックブログ編集部が立ち上がりました。
それに伴い、以前は不定期だった記事の公開を隔週で行っています！

**主にIDCFクラウドの機能・サービスについてご紹介**
基本的なサービス紹介からコアな機能まで、IDCFクラウドユーザーにとって嬉しい記事を多く執筆しています！
[「IDCFクラウドのGPU搭載仮想マシンを使い始める手順～CUDAインストール編～」](http://blog.idcf.jp/entry/gpu1)
[「ILBを使ってWebサーバーをバランシング！構成事例もご紹介」](http://blog.idcf.jp/entry/ILB1)
[「サーバーを起動したままディスク追加する」](http://blog.idcf.jp/entry/cloud/diskcapacity/)

**連携サービスや流行のOSSなど、業界の技術・動向と絡めた内容も発信**
ブログ記事はIDCFクラウドをベースに、幅広い技術ネタに触れています！
[「超高速NoSQLデータベースAerospikeを試してみた」](http://blog.idcf.jp/entry/2016/08/10/122055)
[「超簡単〜ILBをMackerelで監視してみよう」](http://blog.idcf.jp/entry/ILBMackerel)
[「IDCFクラウドにGitHub Enterpriseをインストールしてみた」](http://blog.idcf.jp/entry/2016/10/14/100000)

##IDCF Tech-Blog オススメ記事ランキング
ここからは、私神谷が独断と偏見で選ぶ、オススメ記事ランキングを発表したいと思います！！
:crown:第1位:crown:

**[「UnixBenchでベンチマーク」](http://blog.idcf.jp/entry/cloud/unixbench/)**
こちらは、同じくソリューションアーキテクト部の藤城[(@tafujish)](https://twitter.com/tafujish)が執筆しており、
定番のベンチマークツール「UnixBench」について説明した記事となります。
2013年3月に公開された記事ですが、いまだに高いPV数を誇る人気記事です！

* UnixBenchのダウンロード方法
* UnixBenchのテスト項目
* テスト方法による違い

などなど、この記事を読めばUnixBenchのことが大体わかります。
UnixBenchを用いたベンチマークをお考えの皆さんは必見の記事です！

:crown:第2位:crown:
**[「利用明細＆ビリングAPIでIDCFクラウドの利用状況を把握しよう」](http://blog.idcf.jp/entry/2016/08/31/154810)**
IDCFクラウドは従量課金ですが、月額上限付きのため、使いすぎて請求が恐ろしいことに...ということはありません！
とはいえ、毎月の利用状況は確実にチェックしておきたいですよね。そんな時はこの記事を読んでみてください。

* 利用明細の項目の見方
* CSV形式の利用明細の活用方法
* APIを使った利用明細の取得方法

これらの情報が、かなり詳しく説明されています。
IDCFクラウドの中の人でも、ここまで詳しく理解している人は少ないと思います（笑）

:crown:第3位:crown:
**[「IDCFクラウドでkeepalivedを使ったLVS構築(1)」](http://blog.idcf.jp/entry/cloud/keepalived/)**
**[「IDCFクラウドでkeepalivedを使ったLVS構築(2)」](http://blog.idcf.jp/entry/cloud/keepalived2/)**
こちらも、同じくソリューションアーキテクト部の金杉が執筆しています。

* 仮想マシンの準備
* LVSの構築
* サーバーのヘルスチェック
* VRRPによる冗長化

上記の通り、IDCFクラウドの基本操作からOSSとの連携、APIの使用まで網羅的に触れているため、
これから使い始める方にはぜひ読んでいただきたい記事です！！

##さいごに
今後もIDCF Tech-Blogでは、定期的に様々な技術情報を発信していきます！
ぜひ読んでみてください！そして気に入っていただけたら、ブックマークをお願いします！！
[「IDCF Tech-Blog」](http://blog.idcf.jp/archive):point_left:こちらです！
さくらのレンタルサーバで、とりあえず PHPMailer を使ってそうなサイトや CMSを確認の上、一旦全部止めておきたい、と思った時にやったことメモ

## 概要
PHPMailer に脆弱性が出たものの、あまり細かく情報を追う時間が取れず、また、どのサイトや CMS が影響を受けるのかよく把握できていない私が、とりあえず自分が使っているさくらのレンタルサーバ上にあるサイトの公開を停止して、年末年始にゆっくり状況確認したり、脆弱性に対応された CMS にバージョンアップ作業したりしよう、、と思った時にやったことのメモです。

## 免責
このエントリの内容の正確性や、万一このとおりやって何らかの問題になったとしても、記事を書いた私、および私が所属する組織は責任を負いかねます点、あらかじめご了承ください。

## 環境
さくらのレンタルサーバ
プラン：スタンダード（ちなみにライトはシェルログインできないのでこの手順での作業はできません）

## やること
1. ssh でサーバーにログイン
2. phpmailer というファイル名で検索して、どのサイトや CMS で使われていそうか確認。関係なさそうなものが混ざっていれば省く(これで抜けがないかどうかは、少し心配・・)
3. 該当するとみられるサイトや CMS があるディレクトリの権限を「700」にしてアクセスできないようにしておく。（アクセスすると「403」エラーとなる）

## 実行したコマンド
```
% cd ~/www
% find . -name '*phpmailer*'
./******-****/wp-includes/class-phpmailer.php
./*********/wp-includes/class-phpmailer.php
./*********/wp-includes/class-phpmailer.php
./****/wp-includes/class-phpmailer.php
./********/pulsecms4/inc/plugins/mailer/class.phpmailer.php
./********/__MACOSX/pulsecms4/inc/plugins/mailer/._class.phpmailer.php
% chmod 700 ./******-****/
% chmod 700 ./*********/
% chmod 700 ./*********/
% chmod 700 ./****/
% chmod 700 ./********/
```

## さいごに
この記事の内容に問題点、誤りなどあった場合、コメントなどでのご指摘を歓迎いたします。
vSphere Host Clientのデータストアブラウザで4GB超のファイルのアップロードが失敗する

# 概要

vSphere Host Clientのデータストアブラウザで4GB以上のサイズのファイルをアップロードする時は、ChromeかFirefoxを使用する。

# 詳細

## 現象

Internet ExplorerでvSphere Host Clientを使用している場合、データストアブラウザで4GB以上のサイズのファイルをアップロード使用とすると、以下が起こる。

* データストアブラウザ上のプログレスバーが途中で消える。
* タスク上の「データストアへのファイルのアップロード」は進捗が100%より手前で止まる。
* データストアには4GBのファイルが作成されている。

## 原因と回避策

これはvSphere 6.5リリースノートの[既知の問題](http://pubs.vmware.com/Release_Notes/jp/vsphere/65/vsphere-esxi-vcenter-server-65-release-notes.html#clientissues)にも挙げられている。Internet Explorerの制約によるものなので、ChromeかFirefoxを使用する。

> **ファイルが 4GB を超えるときに、Internet Explorer 上でデータストア ブラウザを使用してファイルをアップロードしようとすると失敗する**
> Internet Explorer 上でデータストア ブラウザを使用して 4GB を超えるファイルをアップロードすると、次のエラーが表示されます。
> `URL にデータを転送できませんでした。`
> Internet Explorer は 4GB を超えるファイルをサポートしません。
> **回避策**：データストア ブラウザからファイルをアップロードする場合は Chrome または Firefox ブラウザを使用してください。

なお、Microsoft Edge 38.14393.0でも、同様に4GBまでしかアップロードできない問題が発生した。

## 確認環境

上記現象の発生は、以下の環境で確認した。

* vSphere ESXi 6.0 update2 + 2016年11月パッチ（Patch 52/Build
4600944)
* vSphere Host Cient 1.9.0
* Internet Explorer 11.0.14393.0 または Microsoft Edge 38.14393.0

# 参考

* [vSphere 6.5リリースノート > 既知の問題 > vCenter Server Appliance、vCenter Server、vSphere Web Client、vSphere Client、vSphere Host Client の問題](http://pubs.vmware.com/Release_Notes/jp/vsphere/65/vsphere-esxi-vcenter-server-65-release-notes.html#clientissues)
ショートカットを活用しよう - 2 - Ctrl + Insert

# <kbd><kbd>Ctrl</kbd> + <kbd>Insert</kbd></kbd> の効果
コピー＆ペーストといえば <kbd><kbd>Ctrl</kbd> + <kbd>C</kbd></kbd> <kbd><kbd>Ctrl</kbd> + <kbd>V</kbd></kbd> ですが、自分的には押しづらくて大嫌いなショートカットです。

クリップボードのコピーは <kbd><kbd>Ctrl</kbd> + <kbd>Insert</kbd></kbd> ペーストは <kbd><kbd>Shift</kbd> + <kbd>Insert</kbd></kbd> 切取は <kbd><kbd>Shift</kbd> + <kbd>Delete</kbd></kbd> です。
ただし、アプリケーションによっては対応されていないこともあります。その時は素直に通常の方法を利用するしかないです。

さらにですが、クリップボード履歴などのツールを利用すれば、テキスト編集の作業は段違いだと考えています。

- 【[皆さんクリップボード履歴使ってますか？ テキスト編集が捗りますよ！](http://qiita.com/rrryutaro/items/cab2b682a2a388ae7897)】

こちらでも、ショートカットキーについて同じようなことを書いていますが、それほどまでに、是非とも使ってほしいのです。


以上


|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>F2</kbd></kbd>](http://qiita.com/rrryutaro/items/19a43e0af5686c75462f)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Win</kbd> + <kbd>Pause</kbd></kbd>](http://qiita.com/rrryutaro/items/9c52aeae912f013654a6)|

# 追記：雑記
そもそも、これってWindows 3.1の頃から使えたはず。というか、それでやっていたら、Win95になって<kbd><kbd>Ctrl</kbd> + <kbd>C</kbd></kbd>が出てきたんじゃなかったっけ？
なにか証拠ないかなっと検索してみました。[:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=windows3.1%20%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC)
[ショートカットキー一覧 - Wikipedia - Windows3.0およびOS/2の標準機能](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E4%B8%80%E8%A6%A7#Windows3.0.E3.81.8A.E3.82.88.E3.81.B3OS.2F2.E3.81.AE.E6.A8.99.E6.BA.96.E6.A9.9F.E8.83.BD)にそれらしいことがあったので、とりあえず満足です。
Electronアプリ


## 事前準備
### nodeインストール

* brewでインストール
	
	```console
	brew install node
	```

* 確認
	
	```console
	node -v
	
	v7.3.0
	```

### npm/electron-prebuiltインストール
* インストール
			
	```console
	npm -g install electron-prebuilt
	```

### npm/electron-packagerインストール
* インストール
			
	```console
	npm -g install electron-packager
	```

## 開発準備

* プロジェクトディレクトリを作成
	
	```console
	mkdir -p /your/project/path/project-name
	cd /your/project/path/project-name
	```
	
* npm initを実行
	
	```console
	npm init
	```
	
	* 対話式の設定コンソールになるので答えていくと、package.jsonが生成される。

## 開発
### Hello World!

#### 実装
* index.html配置
	
	```html:index.html
	<!DOCTYPE html>
	<html>
	<head>
	    <meta charset="UTF-8">
	    <title>Hello World!</title>
	</head>
	<body>
	    <h1>Hello World!</h1>
	</body>
	</html>
	```

* main.js配置
	
	```javascript:main.js
	const electron = require('electron');
	const app = electron.app;
	const BrowserWindow = electron.BrowserWindow;
	
	var win;
	
	function createWindow() {
	    win = new BrowserWindow({
	        width: 1200,
	        height: 800,
	    });
	    win.loadURL('file://' + __dirname + '/index.html');
	    win.webContents.openDevTools();
	    win.on('closed', function () {
	        win = null;
	    });
	}
	
	app.on('ready', createWindow);
	
	app.on('window-all-closed', function () {
	    app.quit();
	});
	
	app.on('activate', function () {
	    if (win === null) {
	        createWindow();
	    }
	});
	```

### 確認
* 実行してみる

	``` console
	electron .
	```

* ウィンドウが立ち上がって「Hello World!」が表示された。
![スクリーンショット 2016-12-27 21.17.23.png](https://qiita-image-store.s3.amazonaws.com/0/102123/9f7ef48c-30b4-3548-4b16-ae6ecdfd5bbe.png "スクリーンショット 2016-12-27 21.17.23.png")
EspressoでViewのVisibilityが変化するまで待つようにしてみた

ボタンを押したらあるViewのVisibilityをAnimationさせて変化させている。
AndroidのEspressoでそこの部分をUIテストしようとすると、ボタンを押してからVisibilityが変化したことを確認するまでにThread.sleepで少し待たなければいけない。
しかし、必ず何秒か待つのはスマートではない。

[android - Espresso: Thread.sleep( ); - Stack Overflow](http://qiita.com/kuchinashi_r/items/d2f2f818421da5898520)の記事を見るともうちょっと良いやり方があったので参考にして書いてみた。

以下のように書くと対象のViewのVisibilityがVISIBLEになるまで最大1000ミリ秒待つようにしてみた。

```java
onView(withId(R.id.controller)).perform(waitVisibility(View.VISIBLE, 1000));
```

waitVisibility関数の中身

```java

	public static ViewAction waitVisibility(int visibility, long millis) {
		return new WaitVisibility(visibility, millis);
	}

	public static abstract class WaitBase implements ViewAction {
		protected long millis = 0;

		WaitBase(long millis) {
			this.millis = millis;
		}

		@Override
		public Matcher<View> getConstraints() {
			return new IsAnything<>();
		}

		@Override
		public String getDescription() {
			return"wait during " + millis + " millis.";
		}

		@Override
		public void perform(UiController uiController, View view) {
			uiController.loopMainThreadUntilIdle();
			final long startTime = System.currentTimeMillis();
			final long endTime = startTime + millis;

			do {
				if (check(view)) {
					return;
				}

				uiController.loopMainThreadForAtLeast(50);
			}
			while (System.currentTimeMillis() < endTime);

			// timeout happens
			throw new PerformException.Builder()
					.withActionDescription(this.getDescription())
					.withViewDescription(HumanReadables.describe(view))
					.withCause(new TimeoutException())
					.build();
		}


		abstract protected boolean check(final View view);
	}

	public static class WaitVisibility extends WaitBase {
		private final int mVisibility;

		public WaitVisibility(int visibility, long millis) {
			super(millis);
			mVisibility = visibility;
		}

		@Override
		public String getDescription() {
			return "wait for a specific view with visibility <" + mVisibility + "> during " + millis + " millis.";
		}

		@Override
		protected boolean check(final View view) {
			return view.getVisibility() == mVisibility;
		}
	}
```
Elixirで縛りFizzBuzz！　条件分岐、剰余、三進数、五進数を使わず、def文だけでFizzBuzzする

弊社のメイン言語がElixirになったので、Elixir習得時に書いたFizzBuzzをご紹介します。Elixir初心者の頃に書いたので所々おかしい気もするのですが、そのまま掲載します。

```elixir:fizzBuzz.exs

defmodule FizzBuzz do

  def fizzBuzz(num), do: _notFB(_fizz(oneDigit(Integer.to_charlist(num))) <> _buzz(_getLastDigit(Integer.to_charlist(num))) , num)

  def sumDigit([head | []]), do: head - 48
  def sumDigit([head | tail]), do: head - 48 + sumDigit(tail)

  def oneDigit([head | []]), do: head - 48
  def oneDigit(list), do: oneDigit(Integer.to_charlist(sumDigit(list)))

  def _fizz(3), do: "Fizz"
  def _fizz(6), do: "Fizz"
  def _fizz(9), do: "Fizz"
  def _fizz(_), do: ""

  def _getLastDigit([head | []]), do: head - 48
  def _getLastDigit([_ | tail]), do: _getLastDigit(tail)

  def _buzz(5), do: "buzz"
  def _buzz(0), do: "buzz"
  def _buzz(_), do: ""

  def _notFB("", num), do: Integer.to_charlist(num)
  def _notFB(some, _), do: some
end

Enum.map(1..100, fn(x) -> IO.puts FizzBuzz.fizzBuzz(x) end)

```

## 解説

### module FizzBuzz
FizzBuzzというモジュールを定義しています。

### fizzBuzz
数字を入れるとFizzBuzzしてくれる関数です。下で定義した関数のまとめです。

今回は、
* 3の倍数なら"Fizz"を返し、違ったら空文字列を返す関数
* 5の倍数なら"Buzz"を返し、違ったら空文字列を返す関数
の二つを定義し、その関数の結果に対し文字列を結合するというアプローチをとっています。

### sumDigit, oneDigit, _fizz
今回のFizzBuzzでは、3の倍数は各桁の和を取ると3の倍数になるという性質を再帰的に利用しています。sumDigitとoneDigitで最後の一桁になるまで各桁の和を取り続け、_fizzで判定しています。

### _getLastDigit, _buzz
5の倍数の判定は簡単で、末尾が5か0なら5の倍数です。

### _notFB
二つの引数をとり、一つ目の引数が空文字列なら2つ目の引数をcharに変換したものを返し、それ以外の場合は一つ目の引数を返します。

### enumの行
関数を実行してIO.putsしています。

## まとめ
FizzBuzzは非常に奥が深いので、ぜひみなさんやってみましょう。
EspressoのonViewで複数マッチするViewからN番目のものを絞り込んでみた

```java
onView(withId(R.id.thumb)).perform(click());
```

上記のようなEspressoを使ったAndroidのUIテストにおいてonViewが複数マッチする場合、以下のようにエラーとなる。

```bash
android.support.test.espresso.AmbiguousViewMatcherException: 'with id: com.example.debug:id/thumb' matches multiple views in the hierarchy.
```

これを独自Matcherを書いて以下のようにN番目の要素を選択できるようにしてみた。

```java
onView(getAt(withId(R.id.thumb), 0)).perform(click());
```

getAt関数の中身

```java
	public static Matcher<View> getAt(final Matcher<View> parentMatcher, final int index) {
		return new NthMatcher<View>(parentMatcher, index);
	}

	private static class NthMatcher<T> extends TypeSafeMatcher<T> {
		private Matcher<T> mParentMatcher;
		private int mNum;
		private int mCount = 0;

		NthMatcher(final Matcher<T> parentMatcher, int num) {
			mParentMatcher = parentMatcher;
			mNum = num;
		}

		@Override
		protected boolean matchesSafely(T item) {
			return mParentMatcher.matches(item) ? (mCount++ == mNum) : false;
		}

		@Override
		public void describeTo(Description description) {
			description.appendText("with " + mNum + "-th: " + mParentMatcher);
		}
	}
```
AndroidのWebViewで「LINEで送る」ボタンに対応させる

## 概要
WebViewClient の shouldOverrideUrlLoading の返り値を false にしてアプリ内webviewで回遊させるようにしている場合、「LINEで送る」ボタンをクリックした後に表示される以下のような画面で「LINEアプリで開く」のボタンがそのままだと動かないのでその対応方法です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/58100/6717f892-2b3d-3e54-cc4e-550b6e7c0759.png" width=300px>

## 対応方針
「LINEアプリで開く」のボタンのリンクURLはSchemeが `intent://` になっています。
なので、shouldOverrideUrlLoadingで受け取ったURLのSchemeがintentだった場合に、URLからINTENTインスタンスを作るようにします。

下記のstackoverflowの記事を参考にしています。
http://stackoverflow.com/questions/33151246/how-to-handle-intent-on-a-webview-url

## 実装例
```
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                if ("intent".equals(request.getUrl().getScheme())) {
                    onLoadIntentSchemeUrl(request);
                    return true;
                }
                return false;
            }

            private void onLoadIntentSchemeUrl(WebResourceRequest request) {
                Intent intent;
                try {
                    intent = Intent.parseUri(request.getUrl().toString(), Intent.URI_INTENT_SCHEME);
                } catch (URISyntaxException e) {
                    intent = null;
                }

                if (intent == null) {
                    // URLからIntentをつくれなかった
                    return;
                }

                ResolveInfo info = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
                if (info != null) {
                    // intentに対応するパッケージがあったときだけstartActivityをする
                    startActivity(intent);
                }
            }
        });
```
技術英語 > Autonomic nervous system link [is secure]. / secure the staff / Autonomic nervous system (ANS) / autonomicは無意識（あるいは非積極的） / autonomousは意識的に / you are autonomous

@ Star Trek Voyager > THE THAW

異星人のシステムを動かし始めた。
順調に動作していることについてKesが

> Autonomic nervous system link is secure.

https://www.merriam-webster.com/dictionary/secure
> `free from risk of loss

http://eow.alc.co.jp/search?q=secure 

あたりが関係しそうか。

~~意訳1 「自動神経システムリンクは確立しました」~~
~~意訳2 「自動神経システムリンクは順調に動作してます」~~

(追記 2016/12/28)
@knoguchi さんに間違いをご指摘いただきました。
ありがとうございます。

http://ejje.weblio.jp/content/autonomic
> 自治の、自律の

意訳3 「自律神経系リンクは確立しました」


<hr>
secureで思い出したのは

secure the staff

ある仕事に対する人員の確保にsecureを使っている例を見たことがある。

<hr>
(追記 2016/12/28)

@knoguchi さんにコメントいただいた事項をタイトルに追加しました。

情報感謝です。
Playでクエリストリングを配列(List)や任意の型で受け取る

# 配列(List)で受け取る
## ソースコード
https://github.com/tyahha/play-q-array-test

## ソースコードのポイント抜粋
### routesファイルの抜粋
```scala
GET     /                           controllers.TestController.index(n: List[Int])
```

## Controllerのメソッド
```scala
  def index(numbers: List[Int]) = Action {
    Ok(views.html.index(numbers))
  }
```

## ポイント
* routesで指定するの仮引数(?)の(n :List[Int])とクエリストリングの名前が一致していれば良い。
* Controllerの仮引数はわかりやすく変更することができる
* 上記の例では「n」がクエリストリングで、対応するControllerの仮引数が「numbers」
* クエリストリングを指定するときは「?n=1&n=3&n=5」のようにnを複数個指定する。
* RequestからもSeq型で取得することができるが、その場合Seq[String]になっているので、リストの要素を任意の型にできるのでこちらのほうが楽（だと思います）。

 
# ちなみに１つパラメータの場合
Controllerを次のようにすればクエリストリングを受け取ることができます。

## 必須パラメータの場合
```scala
  def index(number: Int) = Action {
    ...
  }
```
## オプション（指定しなくてもよい）のパラメータの場合
```scala
  def index(number: Option[Int]) = Action {
    ...
  }
```

* RequestからもSeqで（ｒｙ

# 任意型(自分で作ったcase classなど)で受け取る
QueryStringBindableを拡張すれば、任意の型へクエリストリングを変換することが可能です。

参考
* http://tototoshi.hatenablog.com/entry/20130216/1360985707
* http://qiita.com/arc279/items/dcf0ae364a692b0a65eb

イメージとしては「クエリストリング⇔受け取りたい型」の相互変換のコードを記述する感じです。上記の記事で出てくる「PathBindable」はrouteのPath記述部で受け取るパラメータを任意の型へ変換するためのものだと思います（たぶん）。この辺りはまだ公開できるソースを書いていないので、書いたら記事を更新したいと思います。

## 2016.12.29追記
記事書きました
- [Playでクエリストリングをcase class(自分型、任意のオブジェクト)で受け取る](http://qiita.com/tyahha/items/fed85c872808fcd16243)

# その他
記事の記述の際の調査の際に重複した記事を見つけました。
[playframeworkのroutingでListを受ける](http://qiita.com/FScoward/items/c3b55f41784a661fbfc0)


投稿をやめようかと考えましたが、次の理由により投稿しました。

* あらためて投稿することにより多くの方と知識を共有できるかもしれない
* 自分型へのつなぎの部分も載せたかった
* 自分の備忘をPublicな場所に置いておきたかった

# 結論・感想のようなもの
型は素晴らしい。静的型付けの恩恵が受けられる形でなるべくコードを書きたいですね。
Atlassian JIRAのビルドをDockerで行う

# 概要

Atlassian JIRA 7.2.2のソースコードをビルドし、WARファイルを作成するまでの手順をDokerで行う。

# 動機

Atalassian JIRAを購入すると、Atlassianに問い合わせることでソースコードを入手することができる。今回Atlassian JIRA7.2.2を入手し、早速ビルドすることになった。公式よりビルド手順は公開されているが、やってみると調査と検証が必要でかなり時間がかかってしまった。ここはビルド手順をコード化し、異なる環境においてもビルドできる様にしたい。そこで、ビルド手順をDockerを用いて行うことで、手順のコード化と自動化、更にはメンバーとの共有を図った。

#　手順

## ファイル構成

以下の様な構成となる。

```
.
├── atlassian-jira-software-7.2.1-source
├── docker-compose.yml
├── entrypoint.sh
└── third-party-libraries
    ├── jms-1.1.jar
    ├── jmxri.jar
    ├── jmxtools.jar
    ├── jndi.jar
    ├── jta-1.0.1b.jar
    ├── mail.jar
    └── ojdbc7.jar
```

`atlassian-jira-software-7.2.1-source`はソースコードのディレクトリを示している。`third-party-libraries`はライセンス制約のある第三者ライブラリを示している。別途準備が必要になるが、それは下記で述べる。

`docker-compose.yml`と`entrypoint.sh`については[Github](https://github.com/mmorita44/atlassian-jira-build)に上げてあるので、そこから参照なり取得なりして欲しい。


## ライセンス制約のある第三者ライブラリのダウンロード

ライセンス制約によりMavenより配布されていないライブラリは予めダウンロードする必要がある。[公式のページ](https://developer.atlassian.com/jiradev/jira-platform/jira-architecture/building-jira-from-source)に提示されたリンク先からダウンロードできるが、jta:1.0.1bについてはMavenのレポジトリの下記のページよりダウンロードできる（ライセンス制約があるはずでは…）。

[Maven Repository: javax.transaction » jta » 1.0.1b](https://mvnrepository.com/artifact/javax.transaction/jta/1.0.1b)


## Dockerの実行

docker-composeコマンドで行うこと。


# 参照
- [Building JIRA from source - Atlassian Developers](https://developer.atlassian.com/jiradev/jira-platform/jira-architecture/building-jira-from-source)
【まだ終わらない】fluentd + hbaseが動くまでのはずだったが動かないので更新中

[GeekWomenJapan Advent Calendar 2016](GeekWomenJapan Advent Calendar 2016) の22日目の記事です。

書いた記事が消えたりとか、これから自走で東名を400km走るのですがその前にfluentdのpluginメンテナンスやっていますが、OSSのメンテナンスほんと大変ですね。ちゃんとやるのを来年の目標にしたいとおもいます。hbase pluginは仕事でつかっているのですが、hbaseが巨大戦艦すぎて設定とかまともにするのがすごい大変です。

https://github.com/yuuna/fluent-plugin-hbase

## hbaseのインストール

Macのローカルでも動いたりうごかなかったり、Dockerで動かしてもいまいちVM環境だと挙動が不安定だったりします。一番楽にhomebrewでやっと入るようになったので対応してみます。

```
$ brew install hbase
```

## fluentdのインストール
td-agentとfluentdの違いが難しいのですが、fluentdというプログラムをつかってTreasure Dataさんのサービスに送るのがtd-agentだとおもうと分かり易いと思います。ほんとか。

rvmのインストールとかおわっていて、fluentdをgemでインストールします。、

```
$ gem install fluentd
$ fluentd --setup ./
```

### fluentd gemのインストール
hbase pluginをいれます。

```
$ gem install fluent-plugin-hbase


Fetching: i18n-0.5.4.gem (100%)
Successfully installed i18n-0.5.4
Fetching: builder-2.1.2.gem (100%)
Successfully installed builder-2.1.2
Fetching: activesupport-3.0.20.gem (100%)
Successfully installed activesupport-3.0.20
Fetching: activemodel-3.0.20.gem (100%)
Successfully installed activemodel-3.0.20
Fetching: thrift-0.6.0.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing fluent-plugin-hbase:
	ERROR: Failed to build gem native extension.

    current directory: /Users/yuuna/.rvm/gems/ruby-2.3.1/gems/thrift-0.6.0/ext
/Users/yuuna/.rvm/rubies/ruby-2.3.1/bin/ruby -r ./siteconf20161228-36027-1lfvf0v.rb extconf.rb
checking for strlcpy() in string.h... yes
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

```

さあ動かない問うことでかえってメンテナンスします。
年末までに更新をするということでOSSのメンテナンスは覚悟をもってやりたいとおもいます。
Googleアナリティクス の リファラースパムの除去

GoogleAnalyticsでQiitaのアクセス数を計測できると知り設定したものの
言語に、見た事ない表記が多数あったので調べたところ、どうもリファラースパムというものらしい。
リファラースパムについては、よくわからんので、後ほど調べてみることにして・・・


googleアナリティクスのアクセス言語の画像添付してますが、
これの 3 とか・・・
なんですかね、この顔文字。
あからさまに変って気がつくでしょうw
しかも、7 とかは、GoogleっぽいですがGoogleではないらしいですw

<img src="https://qiita-image-store.s3.amazonaws.com/0/50028/fe3b09d0-3a1e-ec8c-eb17-882bbbfa599e.png" width="350" height="300" />




# ここから本題

[LIG:Googleアナリティクスのビューとフィルタで不要なアクセスを除外する方法](https://liginc.co.jp/288747)

のサイトでGoogleアナリティクスのビューとフィルターの追加方法を参考にして、

## 新規のビューの作成

デフォルトのビューをコピーし、ビューの名前を「スパム除去フィルタ適用データ」に変更し保存。


## スパム除去フィルターを作成

作成したフィルタ一覧

| フィルタ名 | フィルタ種類 | フィルタ フィールド | フィルタ パターン |
|:-----------|------------:|:------------:|:------------:|
| スパム除去フィルタ1 | カスタム | 言語設定 | Vitaly rules google |
| スパム除去フィルタ2 | カスタム | 言語設定 | Vitaly rules google ☆*:｡゜ﾟ･*ヽ(^ᴗ^)ﾉ*･゜ﾟ｡:*☆ ¯\_(ツ)_/¯(ಠ益ಠ)(ಥ‿ಥ)(ʘ‿ʘ)ლ(ಠ_ಠლ)( ͡° ͜ʖ ͡°)ヽ(ﾟДﾟ)ﾉʕ•̫͡•ʔᶘ ᵒᴥᵒᶅ(=^ ^=)oO |
| スパム除去フィルタ3 | カスタム | 言語設定 | Secret.ɢoogle.com You are invited! Enter only with this ticket URL. Copy it. Vote for Trump! |
| スパム除去フィルタ4 | カスタム | 言語設定 | o-o-8-o-o.com |
| スパム除去フィルタ5 | カスタム | 言語設定 | Congratulations to Trump and all americans |


# 設定後

設定後のgoogleアナリティクストップ画面

![show-view.png](https://qiita-image-store.s3.amazonaws.com/0/50028/02b8fca3-7c22-a2b4-fa10-bd77b8c9ba4f.png)

フィルタを設定したものと設定していないもので、どの程度アクセス数が変わるか、のんびりと見てみることにします。
PowerShellでXMLが解釈可能か（パースできるか）確認する

ちゃんとプロダクトを作るときなどは、XML Schemaなどを書いてバリデータを通すべきだが、手元でテスト用のデータをパッと確認したいようなときがある。
PowerShellでワンライナーで確認できるので、古すぎないWin機があれば、特別な開発環境がなくてもXMLがパース可能かすぐに確認できる。

# XMLファイルのパース

``` 
 [xml]$xml = cat hoge.xml -Encoding UTF8
```

でエラーメッセージが表示されなければOK。
catコマンド( = Get-Content コマンドのエイリアス)の文字エンコードはリトルエンディアンのUTF16なので、それ以外の場合は適切にエンコーディングを指定すると動作する。

# 1行1XMLで複数行のXMLがある場合

Hadoopの出力などで、1ファイルの中に1行づつXMLが入っているような場合は、catの出力をパイプで渡してfor-eachにかけるとよい。

``` 
 cat hoge.xml -Encoding UTF8 | %{[xml]$_}
```

複数ファイルの場合も

``` 
 cat directory/*.xml -Encoding UTF8 | %{[xml]$_}
```

でエラーがないかチェックするとよい。
XDを使ってdesignする

# XD を使いこなそう

便利機能が続々追加されたので、いろいろ試してみる

こんなおしゃれなdesignだって、フォトショやイラレを使わずにあっというま。
画像は、フリー検索でとってきたものだけど、著作権的にあれだったら、画像だけ差し替えます。

![Safari – 4.png](https://qiita-image-store.s3.amazonaws.com/0/12007/bea60da4-509b-b86b-8e42-809adff910ab.png)

[動画][YouTube]だって、簡単に取れちゃう。


ひと通りのmock-upができたら、すぐ共有もできるよ。
動作確認用mock-upは、>>>[ここをクリック][link]<<<

[XD]:https://blogs.adobe.com/creativestation/web-how-to-play-with-adobe-xd
[link]:https://xd.adobe.com/view/f1afec97-47f4-4a1b-bea1-e2b96dfd9ae4/
[YouTube]:https://youtu.be/m_92wogPvl4
WKWebViewでwebページを表示するiOSアプリを作る

webアプリをアドレスバー無しで表示させてネイティブアプリっぽくする方法を探してwebアプリモードなど試してみたが動きが重すぎるので、ネイティブアプリでweb表示だけさせてみる。

とりあえず、Appleのリファレンスから以下をコピペ

```swift:ViewController.swift
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string: "https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }}
```


これだけでappleの公式は表示された。
が、urlを書き換えると表示されなくなるため、調べてみたら
どうやらhttpsでなくhttpによる通信はデフォルトで許可されていないらしい。

info.plistのAppTransportSecurityをtrueにするとか書いてあるが、
GUIで開くと見当たらないので、info.plistをエディタで開いて以下を追記

```xml:info.plist
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
```
ErgoDoxでモールスコード入力しよう

この投稿は :calendar: [ErgoDox Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ergodox) の 16日目の記事です。

----

# しました

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ErgoDoxにモールスコード入力ボタンを実装しました <a href="https://t.co/8nbV07FLi4">pic.twitter.com/8nbV07FLi4</a></p>&mdash; みやおか (@miyaoka) <a href="https://twitter.com/miyaoka/status/813716634233806848">2016年12月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

aからz、数字とスペースが出せます。
CapsLockかけとけば大文字に、日本語IMEオンにしておけばローマ字入力もできます。

できますと言っても実用性が無いことは分かりますよね。 :u7121:


# なぜ

ErgoDoxはファームウェアいじれるんだから、もうちょいファームウェア的なネタを書きたいなと思ったので

# どうだったか

- モールスコードの入力が難しくて何度も撮り直した…。もっとトンツートンツーかっこよくキメたい
- C言語よく分からなくてバッファーオーバーランした…。軽量言語ばっかり使っててごめんなさい…

# 実装

[Merge branch 'morse' · miyaoka/qmk_firmware@9f2dcde](https://github.com/miyaoka/qmk_firmware/commit/9f2dcdec5744a09f911340b99bb845169f520fb4)

```keymap.c
#define MORSE_TERM_SHORT 120
#define MORSE_TERM_CHARA MORSE_TERM_SHORT * 3
#define MORSE_TERM_WORD MORSE_TERM_SHORT * 7
```

短点の長さを120ms、文字間をその3倍、単語間を7倍で設定してます。
この間隔をもっと短くすればもっとかっこよくトンツーできるんじゃないかと思います。

```keymap.c
    case MORSE:
      if (record->event.pressed) {
        last_morse_timer = 0;
        return false;
        break;
      }
      if (!hold_timers[record->event.key.row][record->event.key.col]) {
        return false;
        break;
      }

      morse_el = timer_elapsed (hold_timers[record->event.key.row][record->event.key.col]) < MORSE_TERM_SHORT
      ? morse_short
      : morse_long;

      strcat(morse_buffer, morse_el);

      last_morse_timer = timer_read();

      dprintf("%s", morse_el);

      return false;
      break;
```

モールス入力用のカスタムキーの処理をここでやってます。
hold_timersってとこには富豪的に全キーの押下タイマーを格納してるんで、そこでリリース時にホールド時間から短点か長点かの判定して入力バッファに追加してます。

で、最後にリリースしたタイミングをここで記録しておきます。

```keymap.c
void process_morse(void) {
  if (last_morse_timer == 0){
    return;
  }
  uint16_t t = timer_elapsed (last_morse_timer);

  // type space
  if (MORSE_TERM_WORD < t){
    type_code(KC_SPC);
    dprint("\n");
    last_morse_timer = 0;
    return;
  }

  if (t < MORSE_TERM_CHARA || morse_buffer[0] == '\0'){
    return;
  }

  // type chara
  int i;
  for(i = 0; i < 36; i++) {
    if (strcmp(morse_codes[i], morse_buffer) == 0) {
      dprint(" ");
      type_code(KC_A + i);
      break;
    }
  }
  dprint("\n");
  morse_buffer[0] = '\0';
}
```

で、毎フレーム呼んでる処理がここ。（って言ってもちゃんと調べてないのでキーボードはどんな更新頻度で動いているのか知らない…。）

最終リリースタイミングからの経過時間を見て、単語間の長さを過ぎたらスペース出力して終了。
文字間の長さを過ぎたらバッファしておいたコードから文字を出力します。

# どうなのか

短点に対して長点の長さは3倍というのがモールス信号の仕様みたいなんですが、

- 短点の判定は短点時間以下
- 長点の判定はそれ以上

という処理にしてるので、3倍とか関係無くなってるんだけどどうすれば良かったのか…。

あとコードの判定は文字配列でやってるのが鈍くさい。トンツーだからバイナリでいいじゃんと思ったけど、実際はトン・ツー・無だから2進じゃいけなそうなんですがどうするのがいいんでしょうか。
マクロ定数が多すぎるへの対策

[マクロ定数を多すぎる](http://qiita.com/nonbiri15/items/a39e15b7bdc9d85b9f97)への対策案です。

マクロ定数の多すぎるソースコードは、問題の温床になることが前回の記事でわかっていただけたでしょうか。それでは、それらへの対策方法を示さなくてはなりません。
　defineで設定したマクロ定数を記述しているヘッダファイルの依存性は、doxygenで視覚化すると、その波及範囲の広がりをみることができます。その範囲が思った以上に広がっていることに、自分自身の関わっているソースコードを見て驚きを感じています。
　そのプログラムの中のある機能の単体動作ツールを作ろうとして、ある範囲を切り出して、別のmain関数を用意してビルドを試みました。そうすると、たちまち、その依存性のために、別のモジュールもリンクの対象に追加しなくてはならなくなり、そのモジュールの追加は、また別のモジュールを必要として、元になったプログラムのほとんど全てのモジュールを追加するはめになりました。このように、依存性を持ちすぎるモジュールの構成は、その波及範囲の広がりが単体テストをしづらくさせてしまいます。マクロ定数を記述するヘッダファイルは、そのような不都合を生じることがあるのです。
　
###**やってはいけないこと**
マクロ定数を使うのではなくて、const属性をつけた変数にすればいいのだろうと早合点して、ヘッダファイルに書いてあるまま、
`#define N 100`を`const int N=100;`
に置き換えること。そして、そのままinclude すること。

理由：各ソースコードのファイルのスコープの中に、それぞれ異なる実体のconst int型のNという実体を作ってしまう。
 これは、解決しようと思っていることではありませんね。


###**配列の大きさの指定にはマクロ定数ではなくconst int　を使おう。**
このように書く。

```
  const int array_size = 10;
  int array1[array_size];  // OK!!
```


###**他のモジュールで利用していないマクロは、cppファイルに直書きして参照される範囲を減らそう**
症状：あるソースコードmoduleA.cpp の中でしか利用されないマクロ定数なのに、moduleA.hに記述している。
対策(段階1)：moduleA.hの中に記述するのではなく、moduleA.cppの中で直接マクロ定義する。
そうすることで、不必要なマクロの影響範囲を狭くすることができます。

対策(段階2)：moduleA.cppの中で 無名名前空間で　constで定義する。(C言語の範囲だったら static属性を付ける)
そうすれば、moduleAの中でしか影響しないことが確実になります。

###**引数で渡せば十分なものは、引数で渡す。**　 
 引数で渡せば十分なものは、関数やメソッドの引数で渡す。あるいはクラスのコンストラクタへの引数で渡すという方法がある。そうすれば、その関数やクラスを実装しているソースコードの中に、そのマクロ定数を持ち込むことはなくなります。そうすれば、その関数やクラスを実装しているソースコードに不自然な依存性を持ち込むことがなくなり、単体テストがしやすくなります。

###**構造体やクラスにまとめ、そのマクロ定数を参照する場所を1箇所する。**
　そして、その構造体やクラスをまずは、グローバルスコープで持つ。
　次に、その構造体やクラスを本当に必要とするスコープの中に押し込めていく。
　そうすることで、そのマクロ定数を記述しているヘッダファイルをinclude する必要はなくなる。

###**OS依存性のないライブラリを使う**
 Boostライブラリを使うことで、ファイル操作やsocketの操作であってもOS依存性のない記述をすることができます。そうすることで#ifdef WIN32 #else #endifなどの記述をしなくればならないことは大幅に減ります。UNCODE以前のライブラリやIPv6以前のライブラリを使うことによるトラブルも避けることができます。

付記：windows用とlinuxとで異なるライブラリを使う必要は、実際的には減ってきています。
そのことを次の記事の中に書いています。
[OSごとに#ifdef を書く必要は本当にあるのか](http://qiita.com/nonbiri15/items/55ee7a18d8e4c69c3a82)


###**ヘッダファイルを分割する。**
####症状：ヘッダファイルに定義されているマクロ定数の数が多すぎる。
　　　そのため、あるヘッダファイルをinclude すると、欲しくない内容まで含んでしまうようになる。
   例：windows用の設定とlinux用の設定だからといって、全てを"setting_win.h", "setting_linux.h" として、全て含めてしまうこと。使う範囲が違うようなものは、ファイルシステムに関するもの、ソケット通信に関係するものを全て１つのヘッダファイルにまとめるようなもの。
####対策案１：同じ#ifdef マクロ名で設定されるものでも、使う範囲が違うヘッダファイルは別のヘッダファイルに分割する。
####結果：
　include で持ち込まれるマクロの数が少なくなるので欲しくない内容まで含んでしまうことは減ります。
　そのヘッダファイル中のマクロのスコープが狭くなります。


### 参考記事：

- [マクロの扱いには気を付けろ！ ver.2](http://qiita.com/ashdik/items/d3b8c1ca1083672f7e54)

- [Effective C++(第3版)メモ](http://qiita.com/ktsujino/items/ec0759dbeb40f76b4d2b)


付記：
「マクロ定数が多すぎるへの対策」は、あまりにも常識的なことの積み重ねにすぎません。
でも、それが実現できていないことの背景には次のようなことがありがちです。

- コードの実装についての方針についての部署に「Effective C++(第3版)」のような本を紹介しきれていない。
- そのために、「自分が担当していないコードの設計に口出しするんじゃないよ」という状況になってしまって、その不便な状況が継続してしまっている。

----
### この記事を書いて１年以上たってからの付記：

C++ でもコードを書くことがあるが、C++11以降を想定する開発環境に中にいることもあって、
マクロ定数や、マクロ関数を使うコーディングはほとんど見かけなくなりました。

`#include <windows.h>`
を必要とするようなライブラリは使うべきではありません。

ネットワーク環境が洗練されたものになる以前のネットワークライブラリも使うべきではありません。
`#include <winsock2.h>`

[Boost C++ Libraries](https://www.boost.org/) を使うことです。
vimでjavascriptが記述されたファイルを開くとエラーメッセージが表示される

#環境
2016/12/28時点

- macOS Sierra - version 10.12.2
- vim - version 7.4.898

※ vim は Homebrewによりインストールしたもの。.vimrcが借り物。
#障害
拡張子に```.js```が付いたファイルを開くとエラーメッセージが表示されるが、リターンキー押下によりファイルを開ける。

```vim
Error detected while processing function <SNR>34_BufWritePostHook[4]..<SNR>34_UpdateErrors[15]..<SNR>34_CacheErrors[26]..31:
line    7:
E713: Cannot use empty key for Dictionary
Press ENTER or type command to continue
```

#調査
##状態を確認する
vimの現在のバッファのファイルタイプを確認すると```javascript```として扱われている。

```vim
:echo &filetype
javascript
```

##エラーメッセージでググる
**"E713: Cannot use empty key for Dictionary"**
※ 全文で一致しないので部分で探る。

エラーメッセージで検索すると、プラグインが原因のように思える。

##障害の発生箇所を特定する
.vimrcファイルのプラグインを読み込む行を全てコメントアウトして起動するとエラーメッセージが表示されない。

一つずつコメントアウトを外して起動してエラーが発生するプラグインを探すと、```NeoBundle 'pmsorhaindo/syntastic-local-eslint.vim'```を有効するとエラーメッセージが表示された。                                                         

##障害の詳細を調べる
**syntastic-local-eslint.vim**をググると、eslintによりjavascriptの構文チェックを行うプラグインらしい。

#解決

##eslintをインストールする
eslintが使えるか確認すると未インストールだったのでインストールを行い、eslint単体で実行できるようにする。

```bash
$ pwd
/Users/stupiddog/projects/node/app001

$ npm list -g eslint
/usr/local/lib
└── (empty)

npm ERR! code 1

$ npm list eslint
/Users/stupiddog/projects/node/app001
└── (empty)

npm ERR! code 1
$ npm install --save-dev eslint

$ npm list eslint
app001@0.1.0 /Users/stupiddog/projects/node/app001
└── eslint@3.12.2 

$ ./node_modules/.bin/eslint -v
v3.12.2

$ echo "{}" > .eslintrc.json
```

##eslintの動作を確認する
次に、javascriptが記述されたファイルをチェックしてみる。
※　eslintの設定は取り敢えず動かすので空っぽ

```bash
$ echo "{}" > .eslintrc.json

$ cat main.js 
const {app, BrowserWindow} = require('electron');

$ ./node_modules/.bin/eslint main.js 

/Users/stupiddog/projects/node/app001/main.js
  1:1  error  Parsing error: The keyword 'const' is reserved

✖ 1 problem (1 error, 0 warnings)
```
##障害の解消を確認する
vimで開いてエラーメッセージが表示されずチェックが行われることを確認した。

#まとめ
借り物の```.vimrc```で実行してプラグインに必要なプログラムをインストールしていなかったというオチ。
BlynkでRaspberryPIからエアコンを操作してみた

BlynkでRaspberryPIからエアコンを操作してみた

## 序文

最近IoTが家庭にもずいずいと浸透しはじめており、Philips hueやIRKitが流行ってきています。私も例に漏れず物欲センサーに引っかかり購入を検討したのですが、高かったり在庫切れだったりしたのでここぞとばかりにRaspberryPIを使って自作してみました。ないものはつくる。そう、シアトルコンサルティングならね。


## iPhoneアプリインストール
### アプリ
アプリを起動して適当なアカウントでログインするとこのような画面が表示されます。
<img width="320" alt="写真 2016-12-28 1 28 50.png" src="https://qiita-image-store.s3.amazonaws.com/0/79598/963520a2-64e5-ef8b-75ad-beeb313523a4.png">

`Create New Project`をタップして以下のように入力します。この場合、AirthonがProject Nameとなります。
この画面の`AUTH TOKEN`は後ほど使用するのでメモしておきます。
<img width="320" alt="写真 2016-12-28 1 29 44.png" src="https://qiita-image-store.s3.amazonaws.com/0/79598/470de05a-e208-9603-c839-a76ff762e270.png">

Projectを作成後、黒い画面をタップすると下記のようにWidgetを選択できます。今回はButtonを2つ選択します。
<img width="320" alt="写真 2016-12-28 1 37 52.png" src="https://qiita-image-store.s3.amazonaws.com/0/79598/1fdaed40-2f92-7f76-2ffe-259e96ec7f08.png">

OFFのボタンを作成します。
<img width="320" alt="off.png" src="https://qiita-image-store.s3.amazonaws.com/0/79598/564c8d73-05d4-5f55-5e4b-0148217875d7.png">

ONのボタンを作成します。
<img width="320" alt="on.png" src="https://qiita-image-store.s3.amazonaws.com/0/79598/30a059b8-8d67-1ef4-134b-9940f3f08bdd.png">


こんな画面になればアプリ側の準備は完了です。
<img width="320" alt="写真 2016-12-28 2 06 27.png" src="https://qiita-image-store.s3.amazonaws.com/0/79598/01d9ca62-cd20-5ae6-ff10-f85e09e95d2d.png">

LIRC
wiringPIをインストールします。

```
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
```

[赤外線リモコン信号受信・送信](http://feijoa.jp/laboratory/raspberrypi/infrared/)からscanir.c, sendir.cをそれぞれファイルにコピペし、コンパイルします。

```
$ sudo gcc scanir.c -o scanir -lwiringPi
$ sudo gcc sendir.c -lm -o sendir -lwiringPi
```

### リモコンの赤外線を学習させる

```
$ sudo ./scanir air_on.data 29
write file: air_on.data
scaning pin: 29 (wiringpi)
max keep time: 40(ms)
Infrared LED scanning start.
Pressed Ctrl+C, this program will exit.
// ここで受信モジュールに向けてリモコンのONボタンを押下
Scanning has been done.

$ sudo ./scanir air_off.data 29
write file: air_off.data
scaning pin: 29 (wiringpi)
max keep time: 40(ms)
Infrared LED scanning start.
Pressed Ctrl+C, this program will exit.
//ここで受信モジュールに向けてリモコンのOFFボタンを押下
Scanning has been done.
```


blynk-libraryインストール

```
$ git clone https://github.com/blynkkk/blynk-library.git
$ cd blynk-library/linux
$ make clean all target=raspberry
```

`main.cpp`の下記の部分のコードを書き換えます。

```main.cpp
BLYNK_WRITE(V1)
{
  printf("Got a value: %s\n", param[0].asStr());
}
```


```main.cpp改

void blynk_exec_off(int pin) {
  char command[256] = "";
  sprintf(command, "/home/pi/home/airthon/BLYNK_OFF_V%d.sh", pin);
  BLYNK_LOG("Command: %s", command);
  system(command);
}

void blynk_exec_on(int pin) {
  char command[256] = "";
  sprintf(command, "/home/pi/home/airthon/BLYNK_ON_V%d.sh", pin);
  BLYNK_LOG("Command: %s", command);
  system(command);
}

BLYNK_WRITE(V0) { blynk_exec_off(V0); }
BLYNK_WRITE(V1) { blynk_exec_on(V1); }

```






```
Got a value: 1
Got a value: 0
```



実行！

```
$ sudo ./blynk --token=xxx
```
macOS Sierra に OS アップデートしたら、gdb デバッグできなくなった


macOS Sierra に OS アップデートしました。
アップデート後、Lazarus で、いつものように実行時デバッグしようとしたら、ブレークポイントで止まりません。
コンパイル、実行はできました。
色々、ググってみても、gdb インストール後、証明をしたらデバッグできるよ、、
gdb を Homebrew から再インストールしなおしてみたり、証明を macOS Sierra で作り直したりと試してみましたが、デバッグは動きません。

結局のところ、gdb のバージョンが古かったようです。

実行時デバッグできたところの備忘録で。

#### まずは、gdb のバージョン確認。

```console
$ gdb -v

7.11 と返って来ました。
```

どうも、Lazarus だと、macOS Sierra 環境では、7.11 が未対応となっているようです。
（macOS Sierra が未対応なのだろうか？）

gdb のサイトを確認すると、7.12 がダウンロードできるようなのだけど、
#### アップグレードしてみても、バージョンは 7.11 のまま
```console
$ brew upgrade gdb
```

そのうち brew で、最新版の gdb にアップグレードできるようになるのかな？と2週間待ってみたのだけど、変わらず。。
そこで、brew からアップグレードしてみる事にしました。

#### インストールされている brew のバージョン確認
```console
$ brew -v
Homebrew 0.9.9 (git revision 05ef; last commit 2016-04-26)
Homebrew/homebrew-core (git revision dc97; last commit 2016-04-26)
```

#### Homebrew をアンインストール
```console
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```

#### Homebrew をインストール
```console
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

#### gdb をインストール
```console
$ brew install gdb
```

#### gdb への環境設定。macOS Sierra で必要らしい
```console
$ echo "set startup-with-shell off" >> ~/.gdbinit
```

#### 再度、gdb のバージョン確認
```console
$ gdb -v
GNU gdb (GDB) 7.12
```
バージョンが、7.11 から 7.12 に変更されました。

#### 署名をしなおす。
```console
$ codesign -s gdb-cert /usr/local/bin/gdb
```

Lazarus で、ブレークポイントを付け、実行時デバッグを行うと、デバッグできるようになりました。


良かった良かった。
PowerCMS の TinyMCE 用 CSS が期待しないレンダリングとなる場合への対処方法

PowerCMS において、TinyMCE に自前の CSS を適用する方法は簡単です。

管理画面「設定 > PowerCMS」の TinyMCE 設定「editor_style.css」欄に、自前の CSS ファイルへのリンクを記述します。
ブログレベルまたはシステムレベルで設定ができます。

自前の TinyMCE 用 CSS を整えることで、出力結果と同じ見た目のように、記事の編集ができるようになります。
**これぞ WYSIWYG。**

ところが、編集画面が、期待しないレンダリングとなる場合があります。
私が遭遇したのは `<del>` でマークアップした文字が `color:red;` となってしまうこと。

![20161228_1.png](https://qiita-image-store.s3.amazonaws.com/0/47173/efda0938-3303-5aa3-0493-6d4a32d08732.png)

上記は PowerCMS 用に用意されているテーマ「PowerCMS ウェブサイト 1.96」記事編集画面のキャプチャです。
出力結果の `<del>` は `color:red;` にはなりません。

調査したところ、なんと TinyMCE 用に設定した自前のファイルではない、別の CSS を読み込んでいるのです。

![20161228_2.png](https://qiita-image-store.s3.amazonaws.com/0/47173/cdc91c26-119c-f813-d5fe-407b77f34681.png)

![20161228_3.png](https://qiita-image-store.s3.amazonaws.com/0/47173/10dfd199-2192-405e-3f5f-33b3aff1eccb.png)

犯人はこちら。

```
/path/to/mt/mt-static/plugins/TinyMCE/tiny_mce/themes/advanced/skins/default/content.css
```
content.css の一部を引用します。

```
del {color:red; text-decoration:line-through}
```

# 解決方法

この場合、自前の TinyMCE 用 CSS に下記のコードを記述しましたら解決します。

```
* del { color: inherit !important; }
```
しかしこのコードは、出力環境用の CSS にとっては、不要な記述です。

出力環境用の CSS と TinyMCE 用の CSS を揃えたい（テンプレートモジュール化する等、共通のソースコードとして管理したい）ならば、スマートな解決方法ではありません。

かといって `/path/to/mt/mt-static/plugins/TinyMCE/tiny_mce/themes/advanced/skins/default/content.css` の不要箇所をコメントアウトする方法では、mt-static 以下のファイルを編集することになり（おそらく）好ましくないため、悩ましいところです。

見た通りに編集できますよと WYSIWYG 機能をアピールしたところで、思うようにいかない場合もあるので注意が必要です。
案外知られていない？便利なライブラリたち

#いっけなーい遅刻！遅刻！（パンをくわえながら）
ネクストスケープ 配信事業本部 Advent Calendar 2016 の 21日目…ですが、大遅刻。
いや、なんていうか、そのごめんなさい。

というわけで、流石に今年のうちに記事書いておこうかなということで、自分が使ってみて便利だと思ったライブラリをちょっとご紹介。
ちなみに選定基準は**「便利だけどあんまり有名じゃない」**です。

#「とりあえずバッチ処理作っておいて」
なんて言われるととりあえずConsoleApplicationを作るのが窓使いの性です。
（shを書く？そんなもんはWindowsにはありませんよ。え？PowerShell？知らないねそんなもん）

本当に一度しか使わないプログラムであれば入力値を片っ端からハードコードしてもいいですが、
ある程度繰り返し使うことが想定される場合はやはりコマンドライン引数を受け、引数を元に処理させたくなります。
でも気付いてみれば本来の処理と同じくらいコマンドライン引数処理のコードを書いてしまっているなんてことが…。
[くそ……なぜオレはあんなムダな時間を……](http://xn--eqrx44dbjey6x.com/?p=810)
そんな時に[CommandLineParser](https://github.com/gsscoder/commandline)！

##どう使うん？
[Wiki](https://github.com/gsscoder/commandline/wiki/Quickstart)がとっても詳しいので私があれこれ解説するまでもないです。
一度でも「何やってんだろう、おれ」と思ったことのある方はとにかく導入してみてください。
今までの苦労が本当にバカみたいです。

#「スクレイピングくらい簡単でしょ？ちゃちゃっと頼むよ」
スクレイピングって簡単なようで案外面倒なものです。
PHPとかだと元々の生まれもあって簡単にできるらしいですが、あいにく私はC#しかわかりません。
なのでライブラリに頼ってしまいましょう。
有名どころだとHtml Agility PackやSgmlReaderなのですが、どちらもなんか使いづらい…。
探して行き当たったのが[AngleSharp](https://github.com/AngleSharp/AngleSharp)。

##どう使う(ry)
やっぱり[Wiki](https://github.com/AngleSharp/AngleSharp/wiki/Documentation)がとても詳しいのでこちらを参照ください。
コードを書いた感じでいうとHtml Agility PackやSgmlReaderよりもLinq to XMLライクで学習コストが低めとなかなかいい感じでした。
**インターンの学生さんに「Wiki見て」と丸投げしても大丈夫**なくらい使いやすいです。

#「うわぁーオブジェクトのプロパティ編集めんどくせー」
2つのオブジェクトがあって、そのオブジェクトのほとんどが同じ名前のプロパティを持っていたら。
まぁリフレクションでも使って手を抜きたくなるのがプログラマの性でしょう。
でもいちいちそんな処理コードを書くのは思いのほか面倒ですし、**何より嫌われます**。
でもやはり手は抜きたい。そんなときにはちょっと有名筋ですが[AutoMapper](https://github.com/AutoMapper/AutoMapper)。

##どうt(ry)
やっぱりやっぱり[Wiki](https://github.com/AutoMapper/AutoMapper/wiki)が詳しいので使う上ではこちらを参照してください。
2,3行で十数個のプロパティをコピーできるのは便利です。

#プログラマたるもの、無駄を省け
近年C#がオープンソース界隈で盛り上がっている為、便利なライブラリが多数出てきています。
これらを使わない手はないです。
たまにはGitHubのリポジトリを徘徊してみるのもなかなか楽しいものです。
使って気に入ったらStarつけてあげて、バグ見つけたらせっかくなのでisuue立ててあげましょう。
electronでphotonとreactを使っているときに、何も表示されなくなった。

Electronでアプリケーションを作ろうと、必死で学んでいる最中にぶつかった。

**使用していたもの**
- electron "^1.4.13"
- react "^15.4.1"
- photon (version 0.1.2)
- babel "^6.21.0"

### 本題

```html:index.html
  <body>
    <div id="main"><div>
  </body>
```

index.html の中にある react を使ってコードを入れるところの`<div id="main"></div>`が、photon の css では高さが 0 になってしまっていたことが原因。

#### 解決した方法
新しく css を作成し、div#mainに対して、photonのpane-groupと同じ設定を書き込む。
逆FizzBuzz

[逆FizzBuzz](https://www.google.com/#q=%E9%80%86fizzbuzz)をElixirで。

```elixir
defmodule ReverseFizzBuzz do
  def fb do
    Stream.iterate(1,&(&1+1))
    |> Stream.map(fn(n) -> {n,"#{if rem(n,3)==0, do: 'Fizz'}#{if rem(n,5)==0, do: 'Buzz'}"} end)
    |> Stream.filter(fn {_,b} -> b != "" end)
  end

  def find(input) do
    count = Enum.count(input)
    list = fb |> Enum.take(15*(1+trunc(Float.ceil(count/7,0))))
    case (0..Enum.count(list)-1
      |> Enum.map(fn(i) -> Enum.slice(list, i, count) end)
      |> Enum.filter(fn(i) -> Enum.map(i,&(elem(&1,1))) == input end)) do
        [] -> 'NotFound'
        res ->
          Enum.min_by(res,fn(i) -> elem(List.last(i),0)-elem(List.first(i),0) end)
          |> Enum.map(&(elem(&1,0)))
          |> Enum.reduce(fn(x,acc) -> "#{acc},#{x}" end)
    end
  end
end

IO.puts ReverseFizzBuzz.find(String.split(List.first(System.argv),","))
```
JScript、そういうのも(Excelから)呼び出せるのか


出典：
https://gobansaor.wordpress.com/2007/10/04/javascript-as-an-excel-scripting-language-via-exceldna/

# 準備

* .NET Framework 4.0環境

* [Excel-DNA](http://excel-dna.net/)一式
   ExcelDna.xllは作成するdnaファイル名に合わせて変更。

* dnaファイル

```javascript
<DnaLibrary Name="My Test AddIn">
<Project Language="Microsoft.JScript.JScriptCodeProvider, Microsoft.JScript, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<![CDATA[
 
import ExcelDna.Integration;
public class myFunctions
{
    ExcelFunctionAttribute(Description="Checks if a 1 to 3 digit number",             Category="JScript REGEX example", IsMacroType=true)
    public static function ValidateStuff(str)
    {
        var regex=/^\d{1,3}$/;
        if (regex.test(str))
        {
            return "VERY GOOD: it's a 1 to 3 digit number";
        }
        else
        {
            return "NOT GOOD: Must be a number with between 1 and 3 digits";
        }
    }
}

]]>
</Project>
```

※出典のvar regexの誤記を修正

# 詠唱

ワークブックにxllをドラッグ＆ドロップして、「このアドインをこのセッションに限り有効にする」を選択しておく。

セルに数式として下記を入力。数値はお好みで。

```vbnet
=ValidateStuff(数値)
```

数値を判定した結果が取得できればOK。

（…これ何かに応用できるのかな？…）
strlen()を自作してみる


言語への理解を深めるために既存の関数を自作して再現しようと思います。

# 実装環境
- PHP 7.0.11

# まずは試作

文字列を文字の配列と考えて、途切れたところまでを文字列の長さとして取得します。

```php
<?php
function my_strlen( $str ) {
    $i = 0;
    while( isset( $str[$i] ) ) {
        $i++;
    }
    return $i;
}
?>
```

# 動作の比較

実際に実行結果を比較してみます。

```php:my_strlenの場合
<?php
class TestClass
{
    public function __toString()
    {
        return __CLASS__;
    }
}

my_strlen("test"); // 戻り値：4
my_strlen(123); // 戻り値：0
my_strlen(["a", "b", "c"]); // 戻り値：0
my_strlen(new TestClass()); // 戻り値：なし（Fatal errorが発生）
?>
```

```php:既存のstrlenの場合
<?php
strlen("test"); // 戻り値：4
strlen(123); // 戻り値：3
strlen(["a", "b", "c"]); // 戻り値：NULL（Warningが発生）
strlen(new TestClass()); // 戻り値：9
?>
```

だいぶ結果が違いますね。
自作の関数は配列の場合、要素の個数を返してしまってますが、
既存の関数は文字列に変換ものはWarningエラーが発生させているようです。

# 修正版

そこで、文字数を確認する前に引数をキャストするように処理を追加してみました。

```php
<?php
function my_strlen( $str ) {
    $str = (string) $str;
    $i = 0;
    while( isset( $str[$i] ) ) {
        $i++;
    }
    return $i;
}

my_strlen("test"); // 戻り値：4
my_strlen(123); // 戻り値：3
my_strlen(["a", "b", "c"]); // 戻り値：5（Noticeが発生）
my_strlen(new TestClass()); // 戻り値：9
?>
```

結果は近くなりましたが、キャストすると配列の場合は「Array」という文字列に変換されるため戻り値は「5」を返しています。

# 最終版

こちらがエラー処理までそろえた最終版です。
検証では紹介しませんでしたが、ファイルハンドラのようなリソースにも対応しています。

```php
<?php
function my_strlen( $str ) {
    $type = gettype( $str );
    switch( $type ) {
        case "array":
        case "object":
        case "resource":
            if( "object" == $type && method_exists( $str, "__toString") ) {
                break;
            }
            trigger_error("strlen() expects parameter 1 to be string, ".$type." given", E_USER_WARNING);
            return null;
    }

    $str = (string) $str;
    $i = 0;
    while( isset( $str[$i] ) ) {
        $i++;
    }
    return $i;
}

my_strlen("test"); // 戻り値：4
my_strlen(123); // 戻り値：3
my_strlen(["a", "b", "c"]); // 戻り値：NULL（Warningが発生）
my_strlen(new TestClass()); // 戻り値：9
$f = fopen(__FILE__, "r");
my_strlen($f); // 戻り値：NULL（Warningが発生）
fclose( $f );
?>
```

# 参考

[strlen](http://php.net/manual/ja/function.strlen.php)
Windows環境でのJupyter Notebookのブラウザ指定


業務システムが特定のブラウザにベタベタに依存しているため、デフォルトブラウザを好き勝手に設定できない人達へ。

```shell-session
> jupyter notebook --generate-config
```

で生成された ~/.jupyter/jupyter_application_config.py を編集。

* Chromeを使う場合

```py
import webbrowser
webbrowser.register('chrome', None, webbrowser.GenericBrowser('C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'))
c.NotebookApp.browser = 'chrome'
```

* Firefoxを使う場合

```py
import webbrowser
webbrowser.register('firefox', None, webbrowser.GenericBrowser('C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe'))
c.NotebookApp.browser = 'firefox'
```

※「Program Files (x86)」の部分は使用環境に合わせて変える必要があります
iOS シミュレータのアプリ用 Documents はどこにあるのか探る

RN で iTunes で同期したファイルを見るだけのシンプルなファイラーを作ってるんだけど、下記の記事にある通り、 iOS 8 以降のシミュレータでは随分とややこしいところにそのファイルが配置される。
[[iOS] iOS8シミュレータでのDocumentsディレクトリの場所](http://chicketen.blog.jp/archives/15834156.html)

どうやら[いいアプリもあるみたい](http://qiita.com/singo405/items/b84f81ee2daaef27d0a2)なんだけど、なんかこんなことでアプリインストールしたくないなと思ってしまったので、下記の手順で無理やり調べてみた。

```bash
# シミュレータを起動して、そのデバイス ID を調べる↓
$ xcrun simctl get_app_container booted {Bundle ID}
/Users/.../Library/Developer/CoreSimulator/Devices/{device_id}/data/Containers/Bundle/Application/.../AwesomeFinder.app

# {device_id} を上記の値使って埋めて移動
$ cd /Users/.../Library/Developer/CoreSimulator/Devices/{device_id}/data/Containers/Data/Application

# どれが自分の作ったアプリケーションのフォルダか調べる (silver searcher 使ってるけど grep とかでもできると思う)
$ ag --hidden --search-binary AwesomeProject **/.com.apple.mobile_container_manager.metadata.plist
Binary file {ID}/.com.apple.mobile_container_manager.metadata.plist matches.

# 上記の ID 使って移動
$ cd {ID}/Documents
```

バイナリファイルの中の文字列を読み取ってるあたりがやばい。趣味アプリだからまぁいいけど、自動テストやろうと思ったらこんなゴリ押しな方法しかないの……？