OmniAICreator/Qiita-1.07M huggingface dataset:
SublimeText3のプラグイン諸々など設定メモ

## 概要

自分なりのSublimeText3設定のメモです。
他端末で環境を再現したい時などにスムーズにできるように。

あと、SublimeText3メジャーアップデートが嬉しくてもっと使いこなしたいので、ここらで今までどんな使い方してたかなという確認。


## カラーテーマ

### ayu
https://github.com/dempfi/ayu
色がかっこいいのとサイドバーがとても見やすいのでお気に入りです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/174052/beceab72-1ed1-7a3a-2403-dd39f28a19de.png)

## Markdown系

### MarkdownTOC
https://packagecontrol.io/packages/MarkdownTOC
見出しから目次を自動生成してくれる

### OmniMarkupPreviewer
https://github.com/timonwong/OmniMarkupPreviewer
プレビューが快適になる

### Monokai Extended
https://github.com/jonschlinkert/sublime-monokai-extended
シンタックスハイライトをしてくれる

### Markdown Extended
https://github.com/jonschlinkert/sublime-markdown-extended
挿入されたコードのシンタックスハイライト

### Table Editor
https://github.com/vkocubinsky/SublimeTableEditor
Markdown内の表を一瞬で整形してくれる。最初使った時便利すぎてびっくりした。

## その他便利なもの

### Pretty JSON
https://github.com/dzhibas/SublimePrettyJson
JSONの整形をパパッとできる

### ProjectManager
https://github.com/randy3k/ProjectManager
プロジェクトを簡単に管理できるようにする、とても便利

### GitGutter
https://github.com/jisaacks/GitGutter
コードの更新状況を行番号の横に表示してくれる

## まとめ

その時々の主に書いている言語などに依存しそうなものは除いて、最低限これだけは入れておきたいものをリストに書き出しました。
割と雑に出したこともあり意外と少ないな〜と思ったので、これを機に便利そうなものをさらに探して行きたいなと思います。
js Drag and Drop ライブラリ


書き途中です


#Dragula

http://bevacqua.github.io/angularjs-dragula/


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/6dd9d7c9-b51d-615b-ee63-6054c57b701b.png)


縦方向のリストのドラッグ＆ドロップはスムーズだが、
レイアウトを横方向にした時に、
（float: left;）とした時に、意図する場所にドロップされなかった。

例）以下のようにitem4をitem1とitem2の間にドロップしたいのに、item0の左側にドロップされてしまう。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/c7e5f70a-a674-2055-afeb-81f3013f8665.png)
PyPI の読み方

# 結論
PyPIは、**パイピーアイ** (orチーズショップ) と呼びましょう。

# 参照
- [☆ How Do Pythonistas Pronounce PyPy and PyPI? - Quora](https://www.quora.com/How-do-Pythonistas-pronounce-PyPy-and-PyPI)
    > PyPy is pronounced "pie pie", PyPI is pronounced "pie pee eye" or "the cheeseshop".
    > 意訳：PyPyが"パイパイ"なので、PyPIは"パイピーアイ"か"チーズショップ"

- [How to Pronounce PyPI // Speaker Deck](https://speakerdeck.com/brettcannon/how-to-pronounce-pypi)
    > 意訳：パイパイだと[PyPy](https://ja.wikipedia.org/wiki/PyPy)と被るからチーズショップと呼ぼう

- [PyPI - how do you pronounce it? - Google グループ](https://groups.google.com/forum/#!topic/comp.lang.python/tSnQKxLJAPg)
    > 俯瞰：チーズショップ優勢、パイピーアイとパイパイ同じくらい？

- [How to pronounce programming words  Christopher Swenson](http://caswenson.com/2014_11_10_how_to_pronounce_programming_words.html)
    > PyPI: pie pee eye

- ["Terminology Usage and Pronunciation Guide" ・ Issue #89 ・ pypa/python-packaging-user-guide ・ GitHub](https://github.com/pypa/python-packaging-user-guide/issues/89)
    > PyPI (Python Packaging Index): said aloud by using its full name, or by spelling out the last two letters, as in "Py-P-I". Alternatives are to abbreviate as the "Packaging Index", or to use the colloquial nickname "the Cheese Shop" (which refers to the name of a Monty Python's Flying Circus sketch). Referring to the packaging index aloud as "Py-Py" is strongly discouraged, as "PyPy" is the name of a popular alternative Python interpreter.  
    > 意訳："パイピーアイ"か"パッケージインデックス"か"チーズショップ"。"パイパイ"はPyPyと被るからやめろ。

# 余談
日本のサイトでパイパイ優勢。([pypi の読み方｜YOMIKATA](http://yomikata.org/word/pypi))
(なんか大喜利サイトみたいな感じなんですかね…全然面白くないけど。 [python の読み方](http://yomikata.org/word/python), [pip の読み方](http://yomikata.org/word/pip))
PyPyとかぶる(しなんかイヤらしい)のでパイパイはないですね。
英語圏のコミュニティだと、チーズショップ派がかなり居るんだなと思いましたが、日本でそんなこと言ってもわかんないし、パイピーアイがベストだと思います。

また、ライブラリの名前等、"○○ 辞書", "○○ 読み方"で検索しても良さげなのがなかったときは、
"○○ pronounce", "○○ pronunciation"で検索すると妥当な結果が出てきたりします。
Resilio Sync(旧名 BitTorrent Sync)をユーザー権限で起動させる

# はじめに
CentOS 7にて、[Resilio Sync](https://www.resilio.com/individuals/)(BitTottent Sync)がレポジトリに登録できるようになり、yumコマンドからインストールできるようになりました。これによってdaemon起動ファイルが `/usr/bin/rslsync`となりました。
複数のPCにまたがったファイル/フォルダを共有は主にDropboxを使用しているのですが、共有するフォルダが限定されている場合、クラウドよりもP2Pを使用したResilio Syncの方が同期速度が速く、作業に向いています。
しかし、Resilio syncの設定がバージョンアップのたびに大きく変わることがあって、今回は特に苦労しました。これはその備忘録です。

# Resilio syncの実行ユーザー
CentOS 7でResilio sync(執筆時のバージョンは、2.5.8)をデフォルトで起動させると、「rslsync」というユーザーでdaemonが起動します。しかしこれはもともとLinux側で生成されたユーザーではないので、パーミッション等の問題で正しく起動しないケースが存在します。

# 自分のユーザー名で起動する
自分の場合、自分のユーザーでdaemonを起動させたいため、デフォルトで使用している「rslsync」ユーザー起動を停止させ、コンフィギュレーション機能を使って設定ファイルを生成し、それを編集して起動させました。
以下のように、もし起動させていたらdaemonを停止させ、さらにCentOS起動時にデフォルトでdaemonを起動させないようにします。

```shell-session
sudo systemctl stop resilio-sync
sudo systemctl disable resilio-sync
systemctl --user stop resilio-sync
systemctl --user disable resilio-sync
sudo killall rslsync
systemctl --user start resilio-sync
systemctl --user enable resilio-sync
```

次に、ユーザー権限で使用するようにコンフィギュレーションを使用します。

```shell-session
mkdir -p ${HOME}/sync-storage
rslsync --dump-sample-config > ${HOME}/sync-storage/sync.conf
sed -i -e '6d' ${HOME}/sync-storage/sync.conf
sed -i -e '6i"storage_path" : "'${HOME}'/sync-storage",' ${HOME}/sync-storage/sync.conf
rslsync --config ${HOME}/sync-storage/sync.conf
```

電源ON時には、手動でdaemonを起動させます。

```shell-session
rslsync --config ${HOME}/sync-storage/sync.conf
```

# Resilio Syncの同期速度
自分の環境では、PC同士はハブを経由してGbEで接続されています。アプリの画面上では、同期中はほぼ常時数MB/s、ピーク時で数十MB/sの速度で同期を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32925/61fe5ea5-e353-f848-1b08-bbd4e19eaa73.png)

ここ最近のバージョンアップで、速度がかなり改善した印象を受けます。

# 参考
[Running Sync In Configuration Mode](https://help.resilio.com/hc/en-us/articles/206178884-Running-Sync-in-configuration-mode)
cabocha-python のインストールには python-dev / python3-dev / python3.6-dev などが必要

CaboCha を Python で使う際に cabocha-python を以下のようにインストールしています。

```
$ cd cabocha-0.69/python/
$ python3 setup.py install
```

この際、以下のようなエラーが発生する場合があります。

```
fatal error: Python.h: No such file or directory
```

このような場合は python-dev などの開発用パッケージのインストール状況を見直してみると正常にインストールできる場合があります。

```
$ sudo apt-get install python-dev
```

Python のバージョンによって必要なパッケージが変わるらしく、

```
$ sudo apt-get install python3-dev
$ sudo apt-get install python3.6-dev
```

などと状況によっていくつか試してみると良いと思います。

### 参考になった記事
***
[fatal error: Python.h: No such file or directory](https://stackoverflow.com/questions/21530577/fatal-error-python-h-no-such-file-or-directory
)
[pipでインストール中にエラー「Python.h: そのようなファイルやディレクトリはありません」](http://zashikiro.hateblo.jp/entry/2012/10/02/130031
)
Python3 で Facebook の自分の投稿を取得する

まずは、aceess_token を取得して下さい。
https://developers.facebook.com/ にログインして作成できます。

![access_token_feb18.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5f9d420d-6a74-cd17-d648-588546fee4d6.png)

自分で、Facebook にいくつかの投稿もして下さい。
次のプログラムのaccess_token は一部変更してあるので、使えません。

```py3:get_posts.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	get_posts.py
#
#					Sep/15/2017
#
# ----------------------------------------------------------------
import sys
import requests
# ----------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
#
access_token="FG4EFFBgb938BAO2ouOc1235pjXC8YgsXZBYRnZB8nNvwZCP7dJDTXq7pRrZCVXDX4rmH9hvEZCUj8ZA2ihBlMKMoVWWwzaaRzI8tqA6zCAhgZB12idZCYxIxXNmC112GypCJlnsGdUgLLwAYp0PAQinfL3J123f6or2JYj65bt0QSp1umNabcfg"
#
url= "https://graph.facebook.com/v2.12/me/posts"
params={"access_token": access_token}
rr=requests.get(url,params=params)
print(rr.text)
#
sys.stderr.write("*** 終了 ***\n")
# ----------------------------------------------------------------
```

取得した JSON を、jq . で表示すると

```text
{
  "data": [
    {
      "message": "{\"error\":{\"message\":\"(#803) Cannot query users by their username (ekzemplaro)\",\"\ntype\":\"OAuthException\",\"code\":803,\"fbtrace_id\":\"HPNtwDlQAk1\"}}\n今、ぶつかっているエラーです。\n自分の投稿を取得するには、どうしたら良いか。",
      "created_time": "2017-09-14T10:02:39+0000",
      "id": "341584679598802_341907622899841"
    },
    {
      "message": "アクセストークンには、\nユーザーアクセストークンと、\nアプリトークンがある。\nユーザーアクセストークンの方が長い。",
      "created_time": "2017-09-13T11:59:41+0000",
      "id": "341584679598802_341585509598719"
    }
```
React + Reduxに通知を追加する方法まとめ

# 前書き
サービス、アプリに通知機能をつければ、サービスとしておしゃれですし
ユーザーも気持ちいいですよね。
というわけで、React + Reduxのサービスに通知機能をつけてみました。

React + Reduxで色々とライブラリがあり、色々試してみました。
その中で、デザイン、導入の簡単さ、そしてデモのおしゃれさの中で
今回、導入に選んだのは、[reapop](https://github.com/LouisBarranqueiro/reapop)です。
簡単に導入ができたので、今回は導入方法を紹介します。

Demo: [reapop](http://louisbarranqueiro.github.io/reapop/)

# reapopインストール
npmまたはyarnでインストールします。

```bash
$ npm install reapop
$ yarn add reapop
```

# 導入手順
## indexにreapopを追加
一番ルートのjsx(例: appのindex.jsxなど)にNotificationsSystemを追加

```js
// import
import NotificationsSystem from 'reapop';
import theme from 'reapop-theme-wybo';

...

// render
<div>
  <NotificationsSystem theme={theme} />
</div>
```

## reducerにreapopを追加
reducerのindex(combineResucersの中)にnotificationsを追加

```js
// import
import { reducer as notificationsReducer } from 'reapop';

...

combineReducers({
  ...
  notifications: notificationsReducer()
})
```

導入手順は以上になります。

# 使い方
Actionsの中で、アクションを作成します。
notifyをimportして、dispatchの中で動かすと通知バーが表示されます。

```js
// actions
// import
import { addNotification as notify } from 'reapop';

...

return (dispatch) => {
  dispatch(notify({
    title: 'タイトル',
    message: 'メッセージ',
    status: 'info',
  }));
};
```

# 後書き
簡単になりましたが、React + Reduxで通知を出す方法をまとめてみました。
Actionsに一つ、通知アクションを作ってしまえばどこからでも呼べますね。
Unityのエディタ拡張で他のウィンドウのコントロールをフォーカスする

環境：

- Windows 10 Pro (Build 1703)
- Unity 5.6.2p2 (64bit)

---

Unityのエディタ拡張では`GUI.FocusControl`や`EditorGUI.FocusTextInControl`でフォーカスが設定できるが、これらの関数はフォーカスしたいコントロールを配置しているのと同じ`OnGUI()`内で呼ぶ必要がある。
（GUIの仕組み的に当然と言えば当然？）

従って次の様なコードは機能しない。

```wrong.cs
using UnityEngine;
using UnityEditor;

public class TestWindowA : EditorWindow
{
	string name = "";

	protected void OnGUI()
	{
		name = GUILayout.TextField(name);

		if (GUILayout.Button("Focus"))
		{
			var window = TestWindowB.GetWindow<TestWindowB>();
			window.Focus(name);
		}
	}
}

public class TestWindowB : EditorWindow
{
	public void Focus(string name)
	{
		GUI.FocusControl(name);
	}

	protected void OnGUI()
	{
		GUI.SetNextControlName("a");
		GUILayout.TextField("a");

		GUI.SetNextControlName("b");
		GUILayout.TextField("b");
	}
}
```

どうにかして対象のウィンドウの`OnGUI()`内で処理させる必要がある。例えば：

```correct.cs
using UnityEngine;
using UnityEditor;

public class TestWindowA : EditorWindow
{
	/* 上と同じ */
}

public class TestWindowB : EditorWindow
{
	private string nameToFocus;

	public void Focus(string name)
	{
		nameToFocus = name;
	}

	protected void OnGUI()
	{
		GUI.SetNextControlName("a");
		GUILayout.TextField("a");

		GUI.SetNextControlName("b");
		GUILayout.TextField("b");

		if (nameToFocus != null)
		{
			GUI.FocusControl(nameToFocus);
			nameToFocus = null;
		}
	}
}
```
Androidでログ出力を簡潔にしたい

Androidで`Log.d(TAG, "some log text...")`という書き方でログを出力することができますが、毎回`TAG`変数を宣言するのがめんどくさかったので、呼び出し元に応じて自動的にファイル名や行番号を取得して`TAG`を設定してくれたら便利なのになーと思っていました。**できました。**テキトーにクラスを作り、以下のようなメソッドを作成します。仮に`Logger`クラスとしましょう。

```java:Logger.java
public class Logger {
  public static void log(String text) {
    StackTraceElement elem = Thread.currentThread().getStackTrace()[2];
    String tag = elem.getFileName();
    Log.d(tag, text);
  }
}
```

そして、ログを吐き出したいところでこのメソッドを呼びます。

```java
Logger.log("hello world");
```

```:出力例
09-15 19:52:03.270 15378-15378/com.niusounds.myapps D/MainActivity.java: hello world
```

かんたん！！


ちなみに同じコードをKotlinから呼び出したら違う結果になりました。Kotlinの場合は`Thread.currentThread().stackTrace[3]`を取得しないといけないようです。

```kotlin:Log.kt
fun log(text: String) {
    val caller = Thread.currentThread().stackTrace[3]
    val tag = "${caller.fileName}:${caller.lineNumber}"
    Log.d(tag, text)
}
```
スマホアプリのテストを自動化する

[前回](http://qiita.com/takeshi_hirosue/items/c7f6a65f57ef86e688a3 "")はWebアプリケーションのスマホテストを自動化しましたが、今回はDeviceFarmを用いて、スマホアプリのテストを自動化します。
CIツールは、Pluginが存在するJenkinsを用います。

## 必要なもの
+ AWS アカウント
+ [AWS IAM User](https://github.com/Thirosue/devicefarm-sample/tree/master/provisioning "")(DeviceFarmFullAccess権限を付与したユーザ)
+ DeviceFarm Project（テスト対象プロジェクト）
+ DeviceFarm DevicePool（テスト対象端末のプール）

## Jenkins + DeviceFarmPluginのセットアップ

Jenkinsとdevice-farm-pluginのセットアップは[リンク](http://qiita.com/takeshi_hirosue/items/c7f6a65f57ef86e688a3 "")を参考に設定します。
実施することは以下になります。

+ yumでJenkinsをEC2にインストール
+ DeviceFarm Pluginをインストール
+ DeviceFarm AccessKey/SecretKey設定

## テストプロジェクト構成

以下を参考にテストプロジェクトを作成します。
[参考レポジトリ](https://github.com/Thirosue/devicefarm-app-sample "") はAppium+JUnitをgradleでbuildしています。
また、テスト対象のiOSアプリケーションファイルのビルドは省略しています。

## DeviceFarmテスト設定

DeviceFarmのテスト設定で、以下を設定します。

+ DeviceFarm Project
+ DeviceFarm Device Pool（テスト対象端末のプール）
+ アプリケーションファイル（※例はiOSアプリの.ipa）
+ テスト対象ファイル(zip-with-dependencies.zip)

![スクリーンショット 2017-09-15 時刻 19.29.59.png](https://qiita-image-store.s3.amazonaws.com/0/73176/f3e60195-d02b-bc6e-2c69-2156354814e2.png)

※zip-with-dependencies.zipのフォルダ構成は以下を参照

```zip-with-dependencies.zip
task installZip(dependsOn: ["clean", "packageTests", "installDist"]) << {
    new File("build/work").mkdir()
    new File('build/zip.sh') << 'cd build/work; zip -r zip-with-dependencies.zip .'
    copy{
        from "build/install/test/lib/"
        into "build/work/dependency-jars/"
    }
    copy{
        from "build/libs/test-1.0-SNAPSHOT-tests.jar"
        into "build/work/"
    }
    "chmod 755 build/zip.sh".execute().waitFor()
    "build/zip.sh".execute().waitFor()
    copy{
        from "build/work/zip-with-dependencies.zip"
        into "build/"
    }
}
```

## テスト実行

Jenkinsでテスト実行後、アプリケーションファイル、DeviceFarmマネジメントコンソールのレポートへのリンク等がJenkinsのテスト結果画面に表示されます。

![スクリーンショット 2017-09-15 時刻 19.38.45.png](https://qiita-image-store.s3.amazonaws.com/0/73176/e2b94b85-f3f2-3d05-b811-d039b6b50c69.png)

## その他（開発中のテストについて）

DeviceFarmのインターネットゲートウェイのアドレス範囲は[54.244.50.32～54.244.50.63.](https://aws.amazon.com/jp/device-farm/faq/ "")（※2017/9/15時点）のため、開発中のAPIサーバに左記アドレス範囲をファイアーウォール許可設定することで、開発中のアプリ→API連携も可能になります。
railsでレビューしてもらう前に気をつけること

レビューしてもらう際に気をつけた方がいいことをメモしておく

### each
  - [map](https://ref.xaio.jp/ruby/classes/array/map)で代用できないか考えてみる
  - mapよりも、[each_with_object](https://ref.xaio.jp/ruby/classes/enumerable/each_with_object)や[inject](https://ref.xaio.jp/ruby/classes/enumerable/inject)の方が良いか考えてみる
  - trueやfalseの判定であれば、[all?](https://ref.xaio.jp/ruby/classes/enumerable/all)やnone?、any?、one?が使えないかを考えてみる
  - ハッシュから特定のキーを取得するのであれば`slice`、削除するのであれば`except`が使える

### unless

```sample.rb
# ifで書いた方が可読性が高いので置き換えられないかを考えてみる
unless a == b
↓
if a != b

# 条件が複数あった場合は、ifを使った方が可読性は高いので使わないようにする
unless a.present? && b.present?
↓
if a.blank? || b.blank?

# unless~else は見通しが悪いので使わないようにする
unless user
  ...
else
  ...
end
↓
if user.blank?
  ...
else
  ...
end
```

### トランザクション
- 一連のロジックで、複数の更新処理がある場合は利用
- ロールバックされるように、例外が出るようになっているか（ex. `save!`や`update!`)
- そもそも`ActiveRecord::Base.transaction`で括らずに、saveやupdate一発でまとめられないかを検討

### 破壊的メソッドを多用しない
意図せず破壊的メソッドが呼ばれることによって、バグ含むコードを生む可能性を下げるため

```rb
hash = { hoge: 111 }

hash.merge!(hoge2: 222)
とするよりも
hash = hash.merge(hoge2: 222)
```

### バッチ処理
- 大量のレコード数を扱うことが多いので、オブジェクトの生成コストを考慮して、`find_each`を利用する

### 同じロジックをまとめることができないか
- 同じクラス内であればprivate・インスタンス・クラスメソッド化するか`scope`使えないか検討する
- 別クラスであれば`concern`にまとめる
- 継承元が同じであれば、`継承元`にまとめる(ex. application_controllerなど)
- view側の表示ロジックであれば、`helper`や`decorator`の利用を検討してみる。または、`partial`として切り出せるか検討する。
- validationであれば、独自バリデーターを作る

### migrationファイル
- 必須項目であればnull: falseは入っているか
- index必要か
- uniq制約必要か
- マイグレーション実行後にロールバックできるか
- varcharでいいのか(charにした方が良いか)
- カラムの位置の調整が必要であればafterオプションなどで調整する

### モデル
- migrationファイルの定義と同じvalidationが入っているか
- spec書いているか
- DBに保存するデータなのかを考える。定数として定義したり、[config](https://github.com/railsconfig/config)、またはredisなどを使えるかどうか検討してみる
- ActiveRecordが必要なのか？[ActiveHash](https://github.com/zilkey/active_hash)で代用できるか考えてみる
- rails consoleでメソッドの動きを確認してみる

### ビュー
- キャッシュが必要か？フラグメントキャッシュやredisにキャッシュさせるなど検討してみる
- 共通化するためにパーシャル利用したほうがいいか
- メタタグに必要な情報入っているか、OPGを忘れてないか
- アクセス解析しているのであれば、パラメーター付け忘れてないか
- パーシャルに渡している引数の取扱いは注意する。引数を削除したことにより、他の場所で参照できなくなり落ちることがあるため。`local_assigns`を使うようにすることを検討する。

### WEBrickの利用
- pryを使ってデバッグしてバグを減らす
- ログを確認して動きを確認する

### その他
- [rubocop]()を導入して、細かい指摘を受けないようにする（不要なスペースがあったり、チームのコーディングルールに即していないとか、指摘する方も面倒になるので）
- gemを入れる時は活動状況を確認してみる。（バグった時に質問できない、解決できない負債を減らすため）
- jsを修正した祭にはchromeのconsoleでエラーが出てないかチェックする
- Gemfile.lockの末端のbundlerのバージョンは各環境で統一されているか確認する
[Survey] Kaggle - Quora 8位解法まとめ

Kaggle - Quora Question Pairs[^1]の8位解法[^2]の調査記事です．

Title: 8th solution with part of source code(under construction)
Names: qianqian, Fengari, hhy et al.
Discussion URL: https://www.kaggle.com/c/quora-question-pairs/discussion/34371
Code: https://github.com/qqgeogor/kaggle-quora-solution-8th


## 前処理

- 句読点の除去
- porter stemmerを利用
- ステミングしたコーパスでのunigram, bigramの生成
- ステミングしたコーパスでの独立したunigram, bigramの生成

## 特徴量

### 特徴量(qian)

- 質問の単語や文字の数や割合
- 共通する単語の数や割合
- JaccardやDice距離
- 質問中の数字や句読点の数や比率
- narange(1,2)でのコーパスのTF-IDF値
- unigram, bigramのTF-IDF値
- 独立したunigram, bigramのTF-IDF値
- 異なる単語のunigram, bigramの共起のTF-IDF値
- gensimでのTF-IDF値の類似度
- 学習済みと独自に学習したWord2Vecの平均値での分散表現(idfを重みとした)
- 学習済みと独自に学習したGloVeの平均での分散表現(idfを重みとした)
- NMF, SVD, LDA(sklearn使用)によるTF-IDFの次元削減
- 学習済みと独自に学習したWord2VecやGloveでの異なる単語ペアの類似度
- クリーク中のノードの数
- TF-IDF類似度(sklearn使用)
- nodeとする質問のdeepwalk embedding
- 平均，最大，最小，標準偏差での単語の共起をエンコードするためのラベル
- fuzzの特徴量
- spaCyによるNER
- unigramやbigramのsimhash
- 隣接行列のDecomposition
- IDFで重み付けした学習済みGloVeによる分散表現の平均
- 近傍の次数の平均
- WordNetによるAggregated Distinct Words
- 質問表現でのエントロピー


### 特徴量(fengari)

- N-gramのdecomposition(NMF, SVD, LSI, LDA)
- diff N-gramのdecomposition(NMF, SVD, LSI, LDA)
- 上記decompositionの類似度や距離
- 辺の最大クリーク
- ノードの最大クリーク
- グラフのbfs(depth=2)の数
- rankingでの重複した特徴量
- 質問間の数の差
- PageRank(有向版と無向版)
- 全てのリークした特徴量でのt-SNE
- doc2vec and doc2vec sim features ???

### 特徴量(hhy)

- 学習済みGloVeでの分散表現の平均の類似度と距離
- Word2Vecのdecomposition
- 共通する特徴量
- spaCyによるNLP特徴量(トークンのlog尤度, brown cluster, pos tag, dependency, 品詞)
- Stanford NLPを用いた構文木による特徴量
- WordNetによる類似度
- ストップワード関連の特徴量や文字の分布
- Word Mover's Distance
- N-gram関連の特徴量(BLEU metric, indicator, pos link, position change, pos tag compareなど)
- N-gram関連のDecomosition(NMF, SVD)
- 近傍での特徴量(グラフ構造上の特徴量?)
- 近傍での意味的な特徴量
- 近傍の距離の比較(long match, 編集距離， Jaccard, Dice, Word Mover's Distance)
- NLPでの類似度
- Deep Learning(Siamse, Siamse Match, BiMPM)

## qianのモデルと特徴量

- 方式1: 基本的な特徴量とdecomposition特徴量lgb, xgb, et, rf, mlp
- 方式2: クリークで重み付けした基本の特徴量+TF-DIFの特徴量
- 方式3: LSTM, LSTM with Attention, Siamese

## Model stacking

- 5-fold
- layer 1: lgb, xgb, 密な特徴量でのMLP, 疎なTFIDFでのMLP, et, rfなど 
- layer 2: lgb, xgb, mlp, rt, etの平均

## References

[^1]: Kaggle, [Quora Question Pairs](https://www.kaggle.com/c/quora-question-pairs), 2017.
[^2]: qianqian, [8th solution with part of source code(under construction)](https://www.kaggle.com/c/quora-question-pairs/discussion/34371), 2017.
JESTでグローバル関数を無理やりmock化する

もっといい方法がありそうだが、実現できましたので記録に残します。

## やりたいこと

[JEST](https://facebook.github.io/jest/)において、あるグローバル関数の処理は行わずに引数を渡し、期待する返り値を得る
テストしたいcodeＡで、グローバルとして定義されている`hogefunc`を扱いたい。
※ダミーでコード載せているので動かないかもしれません

```codeA.js
var abc = hogefunc;

function codeA(){
 return abc.foo('aiu','eo');
}

module.exports = codeA;
```

## やったこと
### 1. `package.json`のjest.globalプロパティにグローバル化したい変数を追加。

以下の場合は、`hogefunc`をグローバル関数にしたい。

```json:package.json
{
"jest":{
     "globals": {
        "hogefunc":""
      }
}
```

### 2. testコードでglobal値を上書きする
```js:hoge.test.js
require('./codeA.js');

hogefunc = function(){};

function foo(str1,str2){
    return str1 + str2;
}

function bar(str1,str2){
    return str2 + str1;
}

hogefunc.foo = foo;
hogefunc.bar = bar;

test('mock test' , () =>{
    expect(hogefunc.foo('aiu','eo')).toBe('aiueo');
    expect(hogefunc.bar('abc','de')).toBe('deabc');
});

test('codeA test' , () =>{
    var a = new codeA();
    expect(a).toBe('aiueo');
});
```

## 本当は・・・
[Manual Mocks](https://facebook.github.io/jest/docs/en/manual-mocks.html)を使えばできたかもしれないが、うまく扱うことができなかった。
この辺は課題としてJESTといい関係を続けたいです。
便利だがまだまだ使いこなせていない実感。
Dockerfile内でのワークディレクトリ参照

Dockerfile内でワーキングディレクトリをenvで変数に入れたかったですが、うまくいきませんでした。
DockerfileのRUNコマンド内では$PWDや$HOMEっていう事前に定義された変数があるのですが、
これをENVコマンドやADDコマンドに渡しても空文字で解釈されてしまいます。

```Dockerfile:Dockerfile
WORKDIR /app

# PWDを使って変数代入
ENV AA $PWD
RUN echo $AA
RUN echo $PWD

# HOMEを使って変数代入
ENV BB $HOME
RUN echo $BB
RUN echo $HOME
```

結果:

```bash:
Step 3/16 : ENV AA $PWD # ENVで代入しても
Step 4/16 : RUN echo $AA
# 何も表示されない
Step 5/16 : RUN echo $PWD
/app # RUNコマンド内なら解釈される

Step 6/16 : ENV BB $HOME # ENVで代入しても
Step 7/16 : RUN echo $BB
# 何も表示されない # RUNコマンド内なら解釈される
Step 8/16 : RUN echo $HOME
/root
```

こちらでも質問されてました。
[$PWD is not set in ENV instruction in a Dockerfile](https://stackoverflow.com/questions/44452854/pwd-is-not-set-in-env-instruction-in-a-dockerfile)

PWDとかの変数は特別な変数でRUNとかのようにDockerfile外？で実行されるまでは代入されていない、とのこと。
なのでPWD指定するくらいなら最初からWORKDIRで移動する先をENVで別変数で持っておく必要があるみたいです。

```Dockerfile
FROM ubuntu:16.04
ENV APP_PATH=/some/path
WORKDIR $APP_PATH
COPY . .
ENV PYTHONUSERBASE=$APP_PATH/pyenv PATH=$APP_PATH/pyenv/bin:$PATH
RUN echo "PWD is: $PWD"
RUN echo "PYENV is: $PYTHONUSERBASE"
```

もっといい方法あるかもしれませんが、一旦これで対処しようかと思います。
他にも関連する特殊な変数が存在するかもしれません。
Tips：bashスクリプトでコマンドが失敗したら、エラーメールを飛ばす

```hoge.sh
#!/bin/bash

NOTIFY_MAIL_TOS='who@dummy.co.jp'

function sendErrorMail() {
    local body="Error occurred."
    local subject="Error mail !!!"
    mail -s "${subject}" "${NOTIFY_MAIL_TOS}"
}

set -eu
trap "echo 'Error occurred.'; sendErrorMail; exit 1" ERR

## メインの処理
```

コマンドたち(「メインの処理」以降)で終了コード<>0が発生したときに、trapコマンドが発動してメールが送れます。

trapコマンドも'set -eu'も意外に使われていないことが多いですが、
プログラム(といってもbashスクリプトですが)を書く上でエラーハンドリングは、欠かせないので重宝しています。

'set -e'にしていても、trapコマンドが発動してくれるので、いい感じです。
大量に$?で終了コード判定をしなくても済むので、可読性も高くなります。

蛇足です。
・ おそらくたいていのbashバージョンで利用できると思います。
・ "trap ～～～ ERR"の"ERR"の部分については、シグナルについて確認してください。
・ シグナルの部分を変えると「ユーザーキャンセル時(Ctrl + C)は〇〇〇する」という制御できるようになります。

コメントなどありましたら、いただけると嬉しいです！！
VMware Host Clientへのログイン(WebブラウザでESXi 6.0 u2を管理)

##■前提条件
ESXi 6u2をインストール済みである
rootのパスワードを知っている
webブラウザが使える

##■手順
まずESXiコンソールの黄色い部分にある、「http://」から始まるアドレスをメモします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/5d8e9142-e505-0c6a-0e4e-5ca3ac55559e.png)

次に、ブラウザ上でどちらかを入力してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/25d09182-f78d-3e41-6e92-61623467fb01.png)

ちょっと古めかしい画面が出てくるので、中段あたりの「open the VMware Host Client」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/cf7ea7ae-9558-47d3-7104-27ec0804391a.png)

ログイン画面が現れました。対象ESXiのユーザー名とパスワードを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/b35e242f-afe2-0208-f65a-2062c5bb7f20.png)

無事、Host Clientが起動しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/cf9c1bc3-ff9a-aad7-1e78-442e27402edb.png)

VMware vSphere Client(Windows上にインストールするGUIクライアント)を使っていた身としては、インストール不要の何ともありがたいコンソールです。今後、ESXiクライアントソフトはHost Clientに統合する（vSphere Clientは廃止の方向）とのことなので、この機会に触れてみてはいかがでしょうか。
Cognos TM1 10.2.2 TM1WebのHTTPSアクセス実装

#概要
Cognos TM1 10.2 or 10.2.2のTM1Webで、HTTPSでのSSLアクセスを実装したい時に情報を検索すると、以下の2つの情報に辿りつきます。
**TM1 10.2.2 - Configure Custom SSL Certificates for TM1Web, pmpsvc, and pmhub**
http://www-01.ibm.com/support/docview.wss?uid=swg21902547

**Configuring Cognos TM1 Web to use SSL**
https://www.ibm.com/support/knowledgecenter/SS9RXT_10.2.2/com.ibm.swg.ba.cognos.tm1_inst.10.2.2.3.doc/t_tm1_inst_tm1web_config_for_SSL.html

しかしながらどちらのリンクも、サードパーティーのSSL証明書を使う時の手順です。

サードパーティーのSSL証明書を使わずに、HTTPSアクセスを実装する方法を探しても、記載されている情報が見つからないですが、実は簡単に実装できます。

#実装方法
実装方法は単純で、Cognos Configurationの「TM1アプリケーション・サーバー」で、以下の3箇所のURLをhttpsと9514ポートに変更して、TM1アプリケーションを再起動するだけです。
・TM1アプリケーション・サーバー・ゲートウェイ URI
・外部サーバー URI
・TM1アプリケーション・サーバー・ディスパッチャー URI
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9a467c1a-84f6-258c-129d-00ea4e94aa9c.png)

httpsアクセス可能となります。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1065bb7c-71aa-3e06-6f7a-78f7e271c8ee.png)
【Wordpress】Contact Form 7で「on_sent_ok」が使えない時の対処法

いつもの様に「Contact Form 7」を使用して、「その他の設定」から「on_sent_ok」を使って完了ページへ遷移させる記述を書いたら、怒られた。

![999.png](https://qiita-image-store.s3.amazonaws.com/0/187963/de878123-ebe2-4ddf-3bff-4d280be72050.png)

「on_sent_ok」と「on_submit」は2017年中に廃止される予定だから使わないでね。代わりの設定があるからそっちでやってねってことみたい。
https://contactform7.com/ja/2017/06/07/on-sent-ok-is-deprecated/
https://contactform7.com/ja/additional-settings/#javascript


## 対処法
代わりにDOMイベントの操作方法が記述されていたので、そちらで対応。
https://contactform7.com/ja/dom-events/
https://contactform7.com/ja/2017/06/07/on-sent-ok-is-deprecated/


```functions.php
<?php

//ここから
add_action( 'wp_footer', 'mycustom_wp_footer' );
 
function mycustom_wp_footer() {
?>
<script type="text/javascript">
document.addEventListener( 'wpcf7mailsent', function( event ) {
   location.replace('遷移先のURL');
}, false );
</script>
<?php
}
//ここまで

?>
```

wp_footerにアクションをかけて、DOMイベントが発生したら遷移先のURLに書き換えるって感じで対応しました。

ただ、これだとお問い合わせページ以外でもjsが走っちゃうので、formタグに出力されるclassが存在するか判定の処理を追加して対応。


```functions.php
<?php

//ここから
add_action( 'wp_footer', 'mycustom_wp_footer' );

function mycustom_wp_footer() {
?>
<script type="text/javascript">
  if(jQuery('.wpcf7').length){　//formのclassが存在するか判定
    var wpcf7Elm = document.querySelector( '.wpcf7' );
    wpcf7Elm.addEventListener( 'wpcf7mailsent', function( event ) {
     location.replace('遷移先のURL');
   }, false );
  }
</script>
<?php
}

//ここまで

?>
```

これで**gaのイベントトラッキング**も対応できるみたい。

#### DOMイベントのタイミングは以下を参照
https://contactform7.com/ja/dom-events/
Google App Engine で Map Tile Cache する試み

#概要
MapServerでWMS配信している地図を、PaaSのGoogle App Engineでタイルキャッシュしてみる

#やりたかったこと
- 小縮尺で処理が重く、表示に時間がかかるのをなんとかしたい
- XYZ方式のAPI
- サーバー管理不要

#制約
MapServer自体（サーバ含む）には手は入れたくない。
正攻法ならMapProxyなどが第一選択だと考えられるが、
新たにサーバを立てるのは管理上・コスト上回避したい

#コード例
https://github.com/yutakarmc/gae-map-tile-cache
（ツッコミどころは多いと思います。ぜひ遠慮なくよろしくお願いします）

1. Google CLOUD CDN
2. Memcache
3. Google Cloud Storage
4. オリジンサーバのWMS
上からヒットしたところで返してくれる。
1-2ならかなり高速。3は意外に時間がかかる。
でも、狙い通り小縮尺では4よりかなり高速。

#利点
- サーバー管理不要
- アクセスが集中しても、
    - どんどんスケールアウトしてくれる
    - CLOUD CDNが結構面倒を見てくれる
- 無料枠がある（Google App Engineのインスタンス、Cloud Storageとも）
- GoogleやFirebaseの認証がつけられる

#欠点
-　CLOUD CDN のキャッシュはお任せ（消去する方法が…？、キャッシュ期間は計画的に?）
-　ロックイン?
-　GAE-オリジンサーバ、GAEは容赦しない

#今後
- AWS Lambdaなどでのサーバーレス構成も試してみたい
proxy環境windowsでのdocker-machine設定

何度かつまずいたので自分用にメモ

# docker-machine作成時のプロキシ設定

`C:\Program Files\Docker Toolbox\start.sh` に下記を追記

```
export HTTP_PROXY=http://localhost:18080
export HTTPS_PROXY=${HTTP_PROXY}
```
この設定によりdocker-toolboxでdocker-machine作成する際に、プロキシ経由でイメージ取得される。

# docker-machine内のプロキシ設定

上記で作成されたdocker-machine上の `/var/lib/boot2docker/profile` のプロキシ設定も同じ値のまま作成されているので、これをdocker-machineから見たホストマシン(windows)IPに書き換える。

docker-machineの eth0 が利用するゲートウェイのアドレスが、docker-machineから見えるホストのアドレスになっているのでそのIPに変更する。

```
$ docker-machine.exe ssh
$ ip route
default via 10.0.2.2 dev eth0  metric 1 （← これ）
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
127.0.0.1 dev lo  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1
172.18.0.0/16 dev br-63500f345ff8  proto kernel  scope link  src 172.1
192.168.99.0/24 dev eth1  proto kernel  scope link  src 192.168.99.100
$ sudo vi /var/lib/boot2docker/profile
$ sudo /etc/init.d/docker restart
$ exit
```

# dockerコンテナ起動

これでdocker-machineがイメージをPullできるようになる
AMD OpenCL コンパイラにはバグがある(Version 2348.3, 2442.8)

AMD OpenCL でとあるカーネルをコンパイルしようとしたところ

LLVM ERROR: cannot lower memory intrinsic in address space 1

とだけ出力してコンパイラがエラーを出すという現象に会いました.
(Linux(amdgpu-pro) ver 2348.3 および Windows ドライバ 2442.8 で確認しました. 2017/09/15 での概ね最新 AMD GPU ドライバ)

いろいろカーネルコードを取捨選択してデバッグしてみたところ, global memory から大きめの構造体をローカル変数領域にコピーすることで発生することがわかりました.

以下のような感じです.

```
typedef struct {
  float large_data[4096];
} MyStruct;

__kernel void main(__global MyStruct *s)
{
  MyStruct local_s = *s;
}
```

で, たぶん原因はこれっぽそうです.

Partially fix memcpy / memset / memmove lowering in SelectionDAG construction if address space != 0.
https://reviews.llvm.org/D7241


x86 でも大きめの構造体をローカル変数領域(スタック領域)に持つとダメというのは昔ありましたが, なにかしらもうちょっと原因がわかるようにレポートしてほしいところ.

AMD OpenCL コンパイラは, フロントエンド周りはしばらくアップデートされていないのかな?

# 回避策

* 構造体の大きさを減らすように設計しなおす.
* 自前で struct をコピーする関数を用意する.
よく使う(使わない)Windowsショートカット一覧

ここでは、Windowsキーを用いたショートカット一覧をまとめたいと思います。
たぶん覚えたほうが業務をスムーズに進められることも増えるはずと信じて

以下、完全に私の場合ですが、場合分けしてみました。

# よく使う編
|コマンド|入力結果|
|:-----------------|:-----------------|
| Windows + D	 | デスクトップを表示または非表示する| 
| Windows + L	 | ロック画面を表示する | 
| Windows + Tab	 | タスクビューを表示する | 
| Windows + R	 | ファイル名を指定して実行という画面を表示する | 

# さしてあまり使わない編

|コマンド|入力結果|
|:-----------------|:-----------------|
| Windows ロゴマーク | スタートメニューを表示する | 
| Windows + E	 | エクスプローラーを起動する | 
| Windows + M	 | 全ての画面を最小化する | 
| Windows + S	 | 検索画面を表示する | 
| Windows + →	 | アクティブウィンドウを右画面半分に表示する | 
| Windows + ←	 | アクティブウィンドウを左画面半分に表示する | 
| Windows + ↑	 | アクティブウィンドウを最大化する | 
| Windows + ↓	 | アクティブウィンドウを通常に戻すまたは最小化する | 


# 使ったことがない編

|コマンド|入力結果|
|:-----------------|:-----------------|
| Windows + 数字キー	 | タスクバーにピン留めされたプログラムを起動する |
| Windows + A	 | アクションセンターを表示する |
| Windows + B	 | 通知領域にフォーカスを設定する |
| Windows + C	 | Cortanaをリスニングモードで起動する |
| Windows + F	 | フィードバック Hubを表示する |
| Windows + G	 | ゲームの実行中にゲームバーを表示する |
| Windows + H	 | 共有チャームを表示する |
| Windows + I	 | Windowsの設定を表示する |
| Windows + J	 | 利用可能な場合にWindows のヒントにフォーカスを設定する。 |
| Windows + K	 | [接続] クイックアクションをを表示する |
| Windows + O	 | 端末の向きを固定する |
| Windows + P	 | プレゼンテーション表示モードを選択する（外部モニター使用時） |
| Windows + T	 | タスクバーに表示されているアイコンを順番に有効にする |
| Windows + U	 | コンピューターの簡単操作センターを表示する |
| Windows + V	 | 通知を順番に切り替える |
| Windows + W	 | Windows Inkを表示する |
| Windows + X	 | スタートボタンを右クリックした際のメニューを表示する |
| Windows + Z	 | アプリのコマンドバーを表示する |
| Windows + Enter	 | ナレーションを起動する |
| Windows + Esc	 | 拡大鏡アプリを終了する |
| Windows + Space	 | 入力言語とキーボードレイアウトを切り替える |
| Windows + Pause	 | [システムのプロパティ] ダイアログ ボックスを表示する |
| Windows + /	 | IME の再変換を開始する |
| Windows + ,	 | デスクトップを一時的に表示する |
| Windows + +	 | 画面を拡大する |
| Windows + –	 | 画面を縮小する |

調べてみてわかったのですが、日ごろほとんど使ってないですね（苦笑
さらにキー3つを使ったショートカットとかは全くです（調べてすらない）

Windowsキーを使ったショートカットではないのですが
Ctrl+Alt+矢印キーのショートカットはエビデンスをとるときに重宝したりします。
AtlassianライクなWebフレームワークを作成しました

この記事は[ブログ](http://mmorita44.hateblo.jp/entry/2017/09/12/181130)に投稿されたものの転載です。

---

Atlassianプラグイン開発プラットホームでは様々なJavaフレームワークが利用されており、中には一般的なものも幾つか含まれています。今回それらのフレームワークを用いてAtlassianライクなWebフレームワークを作成したのでご紹介します。作品は[GitHub](https://github.com/mmorita44/webapp-like-atlassian)に上げています。

# 目的

このWebフレームワークの狙いは「一般的なJavaフレームワークをAtlassianプラグイン開発プラットホームから切り離すこと」にあります。それにより以下の効果を図っています。

  * Atlassianプラグイン開発に精通していないメンバーにも作業分担できる。
  * 外注する場合にもこちら側で指定するフレームワークのサンプルとして提供することができる。
  * Atlassianプラグイン開発で培ったノウハウを活用できる。（特に私にとっては^^）

# Javaフレームワーク

このWebフレームワークは以下のフレームワークより構成されています。

  * Java EE (Beans, JSP, Servlet)
  * Spring DI
  * Jersey
  * ActiveObjects
  * Velocity

## Java EE

Java EEのBeans, JSP, ServletはMVCモデルを実現するために利用しています。Atlassianプラグイン開発プラットホームではMVCモデルとしてWebWorkというJavaフレームワークも使用していますが、製品毎でバージョンが異なること（JIRAでは[1.x](https://developer.atlassian.com/jiradev/jira-platform/jira-architecture/jira-technical-overview/jira-webwork-actions)、その他は2.x）、そしてアクション作成時には独自の抽象クラスを継承する必要があることから除外しています。ちなみに、このWebWorkはバージョン2.2からはStruts2へ統合されています。

## Spring DI

SpringのDIはコンポーネントの依存性注入のため利用しています。コンポーネント定義でアノテーションを使わないのは、[Atlassian Spring Scanner](https://bitbucket.org/atlassian/atlassian-spring-scanner)を利用せずに`atlassian-plugin.xml`（Springの`applicationContext.xml`に該当）で定義する方法を想定しているためです。多くのプラグインを見る限りでは`atlassian-plugin.xml`へ定義する方法が一般的なようで、私のプロジェクトでもこの方法を取り入れています。ただし、ServletやRESTリソース等のモジュールへの注入については仕様上の問題でAutowiredアノテーションを利用しています。

## Jersey

JerseyはRESTfulなWebサービスを提供するために利用しています。Json形式によるデータのやり取りを専ら行うため、Jsonが利用できるように設定しています。Atlassianプラグイン開発では、既存画面の拡張性が乏しく、中でも画面操作をトリガーにしたデータ処理については全てREST APIを通じて行うしかありません。そのため、この機能の使用頻度も高く、Atlassianプラグイン開発プラットホームから切り離して開発できる意味は大きいかと思います。

## ActiveObjects

ActiveObjectsをORMツールとして利用しています。ActiveObjectsではテーブル及びフィールド命名規則としてキャメルケースを採用していますが、Atlassianでは[大文字のスネークケース](https://developer.atlassian.com/docs/atlassian-platform-common-components/active-objects/developing-your-plugin-with-active-objects/active-objects-faq/column-names)を採用しています。そのため、当該フレームワークでもAtlassian仕様に合わせています。Atlassian仕様の名前変換器はnet.java.ao.atlassianパッケージ配下にあります。

## Velocity

Velocityをテンプレートエンジンとして利用しています。モダンなシンタックスで記述できるため、個人的にはJSPよりもVelocityを愛用しています。AtlassianプラグインではWebWorkと組み合わせて利用するのが一般的ですが、先述の都合によりWebWorkは除外しているのでServlet内部で利用しています。

# 最後に

このフレームワークを利用することで、REST APIを通じたデータ処理についてはそのまま対応できそうです。ただし、イベントリスナーやワークフローなど需要の大きなモジュールを利用する開発では対応できないため、やはりメンバーがAtlassianプラグイン開発ができるよう教育した方が効率が良いような気もします。
PHPMailerを使うときに気をつけたほうがいいこと

特定の宛先で送信エラーになってしまい、一瞬ポルナレフ状態に陥ったので共有です。
今回使用したPHPMailerのバージョンは5.2.23です。

## 結論
宛先がRFCで認められていない形式のメールアドレスの場合、送信エラーになる
無事送信できるようにするためには、バリデーションを緩くする必要がある

## RFCで認められていない形式のメールアドレスってどんなの？
docomo, au, Softbankでは、以下のような形式のメールアドレスの取得を以前許可していたらしい
> @ の直前にピリオド (.) があるメール アドレス : xxxx.@xxxxxx
> @ より前で、ピリオド (.) が連続しているメール アドレス : xx..xx@xxxxxx

## 対処法
バリデーション処理を修正

```ruby:PHPMailer/class.phpmailer.php
public static $validator = 'auto';
```
↓

```ruby:PHPMailer/class.phpmailer.php
public static $validator = 'noregex';
```
`PHPMailer::validateAddress`内で`$validator`の値によってメールアドレスの形式チェックを分岐させている
最も緩い形式チェックをするモードに指定した

RFCで認められていない形式のメールアドレスの場合、@ 以前を“”(ダブルクォート)でくくって
メール送信してくれるみたい

解決！
Laravelでリレーション(hasMany)先のデータの存在チェックを行う(出来た方法、ダメだった方法)

###■出来た方法

以下のようにすることで存在チェックが可能。

```php
if($user->friends->where('friend_id',$friend_id)->first()){
	return $this->show($friend_id);
}
```

####※追記
コメントでご指摘ありましたが、以下のように`isEmpty()`使って出来ます。

```php
if(!$user->friends->where('friend_id',$friend_id)->isEmpty()){
	return $this->show($friend_id);
}
```


###■ダメだった方法

####1.以下のように書くと、データが存在する場合は問題無いが、データが無い場合に`exists()`という関数は無いよって怒られる。

```php
if($user->friends->where('friend_id',$friend_id)->first()->exists()){
	return $this->show($friend_id);
}
```

####2.リレーション先のデータが複数の場合にエラーになる
※取得したデータがコレクションクラスになってしまうので`exists()`とか無いよ、って怒られた

```php
if($user->friends->where('friend_id',$friend_id)->exists()){
	return $this->show($friend_id);
}
```

以上。
AWSで遊んでみる

# とりあえずEC2を作成(1年間は無料)

Tera Termでつないだ
userは「ec2-user」で作成時にダウンロードしたpemを鍵として指定
以下のコマンドでrootになれるがとりあえず保留

```
$ sudo su -
```
↓
Development toolsをyumでインストール

```
$ sudo yum -y groupinstall "Development Tools"
```
↓
apacheをいれてみる

```
$ sudo yum -y install httpd
```
↓
JDKとtomcatをインストール

```
$ sudo yum -y install java-1.8.0-openjdk-devel tomcat8 tomcat8-webapps
```
↓
デフォルトがjdk7なので切り替え

```
$ sudo alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 2
```
2を入力してエンター
↓

ファイアウォールの設定をする
80を8080にリダイレクトする

```
$ sudo /sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
$ sudo /sbin/iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
$ sudo /sbin/iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
$ sudo /sbin/service iptables save
$ sudo service iptables restart
```
↓
Tomcatを起動

```
$ sudo service tomcat8 start
$ sudo chkconfig tomcat8 on
```
↓
EC2 Management Consoleの左メニューから
Elastic IP アドレス(固定IP)をつける(1つまでは無料)
さらにインスタンスを紐づける
↓
EC2 Management Consoleの左メニューのセキュリティグループで
インバウンド80ポートを開ける
⇒すでにあるセキュリティグループに追加する
　新規作成だとダメだったので何かあるのだと思う
↓
インスタンスを再起動
・・・つながった
↓
FTP接続できるようにするためにvsftpを入れてみる

```
sudo yum install vsftpd -y
Rocroの導入方法

# はじめに
　ソフトウェア開発者向けサービス群 Rocroのクローズドβに参加させていただきましたので、Rocroサービスの導入方法を書こうと思います。

# Rocroとは？
　プレスリリースからの引用ですが「ソフトウェア開発者の周辺に発生する定常的なワークフローの効率化を支援するために、自動コードレビュー＆修正、自動APIドキュメント生成＆ホスティング、自動負荷試験を行うクラウドサービス」とのこと。　　

具体的にRocroは下記3つのサービスで構成されています。

1. Inspecode（インスペコード）: 自動コードレビュー＆コード修正サービス
 - Checkstyle、golint、Pyflakesなど40以上の定評のあるツールで自動コードレビュー。
 - 強力な自動修正機能。修正コードをPull requestでマージ。
 - 複数のツールによる解析を並列に実行することで、非常に短時間で解析が完了。
2. Docstand（ドックスタンド）: APIドキュメント生成＆ホスティングサービス
 - レポジトリと連携して最新のAPIドキュメントを自動生成＆ホスティング。
 - 面倒なドキュメントの維持管理作業を自動化。　　
3. Loadroid（ロードロイド）: 自動負荷試験サービス
 - クラウド負荷試験サービス。シナリオを書くだけで、クラウド上に負荷サーバーを自動構築、負荷試験実施、結果の自動集計。
 - 大規模負荷試験、数十万台のIoT機器を模擬した試験など、難度の高い試験が手軽に可能。

現在は**「ベータ期間中につき、無料」**なのでどんどん試すチャンスですね。
※　９月１５日時点ではパブリックリポジトリには未対応

引用・参考サイト
http://www.sonynetwork.co.jp/corporation/release/2017/pr20170914_0036.html
https://rocro.com/


# 適用するプロジェクト情報
今回Rocroを試したプロジェクトの情報は下記です。

 - 開発言語 Go 1.8
 - パッケージ管理 glide
 - Githubのプライベートリポジトリにてソースコード管理

# Rocroの導入手順
では実際にInspecodeを導入するまでの手順を記載します。

## 1. Sign in  
[公式サイト](https://rocro.com/inspecode)の「Sign in」ボタンをクリックします。  
そうすると、GithubかBitBucketを選択する画面が表示されますので選択します。
![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/151390/2a690237-c989-9b1c-fbda-70e69a63f1f3.png)
選択後必要情報を入力すれば無事Sign in完了です。  
## 2. 使用するリポジトリの選択  
　画面上部の「Repositries」を選択します。
画像では削除していますがAdmin権限を持っているリポジトリが一覧で表示されますので、Inspecodeを実行したい
リポジトリに対して「Registory」をクリックします。

![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/151390/b5c5c652-a014-8d9e-d839-16d87a0bb543.png)
##3. 設定ファイルの作成
　２．まででデフォルト設定のgo fmtやgoimportsは動作しました。
がGoで使える全ツール試してみたいので設定ファイル（rocro.yaml）をリポジトリ直下に置きます。
設定ファイルの内容は全ツールの自動修正機能を含む全てを動作させるような設定を書きます。

```rocro.yaml
inspecode:
  experimental:
    env:
      GLIDE_INSTALL_STRIP_VENDOR: 1
  # golang configuration.
  gas: default
  go-test: default
  errcheck: default
  go-vet: default
  gofmt: auto-fix
  goimports: auto-fix
  golint: auto-fix
  gosimple: default
  ineffassign: default
  interfacer: default
  misspell: auto-fix
```

※補足　***GLIDE_INSTALL_STRIP_VENDOR: 1***について
これはプロジェクトで使用しているパッケージの中で入れ子になったvendor/フォルダがあり、それを除外するような指定です。glideコマンドだと `glide install -v`ですね。

ちなみにデフォルト設定で動作するツールや設定方法などは[公式ドキュメント](https://inspecode.rocro.com/help/)に記載されています。
##4. Rocroを回す
　設定が終わればコードがPUSHされたタイミングでInspecodeが走ります。
動作画面は下記のようになり、ツールで並列に実行可能なものは一気に動作されていたのが好印象でした。
![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/151390/abaf6bf5-cfdb-da76-9959-9111e804b1c2.png)

そして実行結果のレポートはこちらになります。
![cap4.png](https://qiita-image-store.s3.amazonaws.com/0/151390/82874338-8519-4915-7aec-2320acedae61.png)

う、修正するところいっぱいある。。。

# まとめ
　ざっとですが、Rocroの導入方法を紹介しました。　Jenkinsで一からCI環境を整えたり、CircleCIを導入したりと似たようなことは行ってきましたが、Rocroはかなり簡単にCI環境を導入できた印象です。また、ツールで実行できるところは並列で実行されたりと速度も期待できそうです。
【FileMaker】悩ましい罫線が太い問題、、、Excelの罫線とは違うんだよ。

FileMakerのレイアウトで、フィールドを配置する際、フィールドの枠を色付けする場合があります。
私はあまりフィールド枠（罫線）の色付けは好きではないのですが、これをExcel感覚で並べるということが、ご依頼の中であったりします。
めんどくさっと思いつつ、罫線をインスペクタで設定しますが。。。

例えば、こんなフィールド枠を付けたりします。
<img width="219" alt="filemaker_keisen1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/e193a63b-b778-c740-1b9f-000ca6127fbb.png">

これを、フィールド同士の隙間をなくすべく、単純にくっつけると、
<img width="210" alt="filemaker_keisen2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/1741a3b9-666e-0776-a54f-dd0d0b26479b.png">
こんな風に、罫線が太くなります。
今回のは、縦に並べたので、上下の罫線が太くなりますが、横に並べた場合は、左右横の罫線が太くなります。

つまり、こういうことですね。
<img width="469" alt="filemaker_keisen3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/6f580d17-154f-fa3f-dcd7-9db7400c88e9.png">

Excelでは、それぞれのセルに罫線をつけてもこういうことは起こりません。

これを、FileMaker上で解決する場合は、
<img width="476" alt="filemaker_keisen4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/87437c41-a4c2-f737-524e-b8097ecbb0e0.png">
そうです。
最後のフィールドよりも一つ上のフィールドの下線のチェックを外します。

はい、こんな感じでキレイになりました。
<img width="186" alt="filemaker_keisen5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/330fa221-bbf2-87e2-8a7d-afa9f2fb87d2.png">

Excel脱却組の皆さん、お気をつけて〜。
[baidu echarts] pieチャート（円グラフ）のラベル位置を中に移動 (label position)


デフォルトでは、pieチャート（円グラフ）のラベル位置が円の外に浮いている。
それを円の上に置くには、 `lablel` プロパティを下記のように設定すればOKです。

```
    series: [
        {
            name:'访问来源',
            type:'pie',
            selectedMode: 'single',
            radius: [0, '30%'],

            label: {
                normal: {
                    position: 'inner'
                }
            },
            
          ...
```


![ECharts Gallery.png](https://qiita-image-store.s3.amazonaws.com/0/161757/5daef1b1-4a6b-0fdd-5d14-d5c5ca872298.png "ECharts Gallery.png")



# 参考
http://gallery.echartsjs.com/editor.html?c=xBJXvvbALe
http://aifan.jp
googleドライブの画像をmarkdownに貼る

ほとんどコピペだけど...

# googleドライブの画像をmarkdownに貼る

<br>

## どうしてこんなことをするのか。

若干手間はかかるが、人にmarkdownのまま渡しても（ネット環境があれば）画像再現可能。htmlでページに貼るとかも良い。

PDFにする必要もない。容量も軽くなる（リンクしているだけなので）。



## やってみる



共有のリンクを取得する
https://drive.google.com/open?id=0B4rx4mxoPiX1MWlObXYwcjlpSUk



>そのままリンクすると...

> ![thinking_emoji](https://drive.google.com/open?id=0B4rx4mxoPiX1MWlObXYwcjlpSUk)

> ↑ダメ





共有のリンクのURLを変更する

```
open?
```

となっている部分を

```
uc?export=view&
```

に変更する



↓実行例

![thinking_emoji](https://drive.google.com/uc?export=view&id=0B4rx4mxoPiX1MWlObXYwcjlpSUk)



逆に、

googleドライブのfinderからアクセスできるアプリの、メニュー（左クリック）から取得できるURL

->例：https://drive.google.com/file/d/0B4rx4mxoPiX1MWlObXYwcjlpSUk/view?usp=sharing

の/d/○○○○○○○○○○○○○○/view?の「○○○○○○○○○○○○○○」の部分もidに相当するので、https://drive.google.com/uc?export=view&id= のid=の後にそれを貼り付けるだけでもいい（そっちのが楽かも？）->そうでもないか。

->まあ別ブラウザに残しておくのが便利かも、google drive専用垢でupするときにアカウント切り替えなくていいわけだし。



uc?export=view&を毎回コピペするの大変だけど、コピー履歴から探る他にいい方法あったら教えてください。



## ちなみに

- amazonドライブではできません。できる方法あれば教えてください。





## 参考（そのまんま）

https://gist.github.com/mattsuDev/5ed37be6d659e05eadd1
[baidu echarts] チャートのMargin設定



```
option = {
    backgroundColor: "#404A59",
    color: ['#ffd285', '#ff733f', '#ec4863'],
    
    grid: {
        left: '1%',
        right: '35%',
        top: '16%',
        bottom: '6%',
        containLabel: true
    },
    ...
```

![Kobito.ERneyh.png](https://qiita-image-store.s3.amazonaws.com/0/161757/d1a64b7e-9cc3-c4db-1076-8aca27d0d049.png "Kobito.ERneyh.png")



# 参考
http://aifan.jp
http://gallery.echartsjs.com/editor.html?c=xHyucjzxwz
自動戦闘時の行動を完全にランダムにする

味方アクターに「自動戦闘」をつけた際、行動はその結果(与ダメ等)を事前に評価して決定される。
つまりそこそこ賢く戦ってくれるというわけだ。
(自動戦闘については[この記事](https://medium.com/@yamachan360/rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABmv%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%87%AA%E5%8B%95%E6%88%A6%E9%97%98%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-jggs%E3%83%A1%E3%83%A2-58d6778674c5)が非常に参考になった)

だが、むしろ頭が悪い方がありがたいという場合もある。
その場合は、以下のコードで行動を完全にランダムにすることができる。
(自前のプラグインなどにつっこもう)

```javascript:単純にランダムに
Game_Action.prototype.evaluate = function() {
  return Math.random();
};
```
以下のように色々いじくれば、条件や優先度を設定することもできる。

```javascript:特定アクターのみランダム
var _Game_Action_evaluate = Game_Action.prototype.evaluate;
Game_Action.prototype.evaluate = function() {
  // 72番のアクターのみランダム
  if(this._subjectActorId == 72) {
    return Math.random();
  }
  return _Game_Action_evaluate.call(this);
};
```
```javascript:特定スキルは優先
Game_Action.prototype.evaluate = function() {
  var val = Math.random();
  // Skill68番を優先
  if(this.isSkill() && this._item._itemId == 68) {
    val *= 2;
  }
  return val;
};
```
Dockerイメージの差分管理

# Dockerイメージの差分管理
最近，研究室内の勉強会で調べる機会があったのでメモメモ...
12/6 に追記

## イメージは差分の集まり
Dockerのイメージは複数のレイヤが重なって構成されています．
レイヤとは `docker run` でコンテナを立ち上げてから `docker commit` でイメージ化するまでの間に発生したファイルの差分にあたります．

例えば，
![スクリーンショット 2017-09-15 15.53.55.png](https://qiita-image-store.s3.amazonaws.com/0/123597/0d24d1e1-f7e6-e083-b54b-64eca9c17adc.png)

こちらのようにDebianのベースイメージを元に

- A というものを追加した
- B というものを追加した

という差分が重なることでイメージが構成されます．

## 差分の管理方法
~~Docker はAUFSというファイルシステムを使っているらしい...~~
ディストリビューションの標準ストレージ・ドライバを使うそうです。Docker をインストールする時， システム上の設定に応じてデフォルトのストレージ・ドライバを選択します．

AUFSはLinuxのライブCDに使われています．ライブCDって，ハードディスクに書き込みできないのにファイルを保存できたりします．それはAUFSが下記の動きをしてくれているためです。

1. CD-ROMのOS部分をRead-Onlyとする．また，メモリ上にWritableな領域を確保．
2. ファイルシステムに変更があったら，メモリ上に差分だけを書き込む．
3. 結果，Read-Only領域(元の状態)にWriable領域(差分)を重ねるとディスクに書き込んだのと同じ状態になる．


よって，先ほどの図は

Debian～add BがRead-Onlyな領域、一番上のレイヤがWritableな領域となる．

今の状態で `docker commit` すると，一番上のレイヤも含めてRead-Only化されたイメージができあがり， また、作られたイメージを元に `docker run` すると，新しく一番上にWritableなレイヤが作られる仕組み．

とりあえず，こんな感じ
あとは実際に見てみると良いかも...

#　参考

- [Dockerイメージの差分管理についてまとめてみた](http://tanksuzuki.com/post/docker-image-filesystem/)
- [AUFS](http://itpro.nikkeibp.co.jp/article/Keyword/20090209/324482/)
- [ストレージ・ドライバの選択](http://docs.docker.jp/engine/userguide/storagedriver/selectadriver.html#stability)
ssh config   使い方

# SSH config を使い接続する

ssh で接続する際は下記でだいたい接続を行う。

```
ssh brian@156.65.25.32
```
上記な感じである。

ユーザー名、接続先Ip アドレスでパスワードで接続できます

congif をつかうとこんな感じで接続できます。
まずはconfig ファイルを作成する。

```
Host brian
    HostName 156.65.25.32
    Port 22
    User brian
    IdentityFile ~/.ssh/id_rsa
```

上記ファイルを作成したら、ssh 接続します。

```
ssh brian

```

sftpなら下記で

```
sftp brian
```

で接続することができます。

複数のssh keyを使って接続したい場合などは便利である。
とりあえずpowershellのスクリプトを実行する。

「スクリプトの実行がシステムで無効になっているため、ファイル C:\... を読み込めません。」とかはもうどうでもいいから、前準備とかなしにとりあえず1ファイル一発で動くpowershell用スクリプトをでっちあげる仕組みを考えた。

WSH/Jscript内にコメントとしてpowershell用スクリプトを記述する。

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

を起動するようにすれば、MSScriptControl.ScriptControl も使えてお得かもしれない。試してないけど。


``` KickPs.js
fso = new ActiveXObject("Scripting.FileSystemObject");
WshShell = new ActiveXObject("WScript.Shell");
var temp = fso.GetSpecialFolder(2);	// 2:%TEMP%

var myself = function(){return fso.OpenTextFile( WScript.ScriptFullName,1).ReadAll();}();
myself = myself.replace(/^[\s\S]*\/\* powershell code from here/m, "" );
// [\s\S]：「改行も含むすべての文字」にマッチするトリッキーなパターン
myself = myself.replace(/   powershell code to here \*\//, "" );

var tempps1 = fso.BuildPath( temp, "temptemp.ps1" );
var ouf = fso.CreateTextFile( tempps1,true );
ouf.Write( myself ); ouf.Close();

var cmd = "powershell -NoProfile -ExecutionPolicy Unrestricted " + tempps1;
WshShell.Run(cmd,10,true);
fso.DeleteFile(tempps1);

//////////////////////////////////////////////////////////////////////
// ↓のコメント部分は変更禁止。
/* powershell code from here

Write-Host "Hello world"
pause

   powershell code to here */

```
wordpressをローカルで動かす時、wp-config.php設定

ここだけないのが気になったけど、そもそもこの箇所のABSPASHにシングルクォーテーション''はつけなくて良い
```/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');```

テーマをzipでインストールさせる時にFTPエラーが出ないように
任意の場所に以下のコードを追加
```define('FS_METHOD','direct');```

wp-content配下の
themes
plugins
languages
の読み書き権限を変更
esaに招待APIが実装されたのでGoでクライアントを書いてみた

# tl;dr

- esa.ioに[招待API](https://docs.esa.io/posts/225)が追加された
- 既存のGoクライアントが招待APIに対応してなかったので自分で[クライアント](https://github.com/iwata/go-esa)書いた
 - 対応しているAPIはごく一部

# はじめに

社内の情報共有にesa.ioを使っています。
そんなesaに先日[招待API](https://docs.esa.io/posts/225)が追加されました。
招待周りをchatops化するにあたりリクエストしていたAPIなので、早速対応していただいた中の人たちに感謝です!

esa APIのGoクライアントはいくつかあるのですが、新しいAPIには対応していないので自分で作ってみました。

# 使い方

[README.md](https://github.com/iwata/go-esa/blob/master/README.md)読んでもらえば使い方は大体わかると思います。

肝心の招待メールを送るケースのサンプルは以下のようになります。

```go:main.go
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/iwata/go-esa/esa"
	"golang.org/x/oauth2"
)


func main() {
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: os.Getenv("ESA_TOKEN")},
	)

	ctx := context.Background()
	tc := oauth2.NewClient(ctx, ts)
	client := esa.NewClient(tc)
	
	// Send invitations
	// ref. https://docs.esa.io/posts/102#13-1-0
	emails := []string{"hoge@example.com", "fuga@example.com"}
	list, _, err := client.Invitations.SendToMember(ctx, team, &esa.InvitationMember{
		Member: &esa.InvitationEmails{Emails: emails},
	})
	if err != nil {
		log.Panic(err)
	}
	fmt.Println("--- Invited List ---")
	fmt.Printf("%v\n", list)
}
```

## 補足

- `context`パッケージに依存しているので、1.7以上じゃないと動かないです。
- 招待やりたかったので、一部のAPIしか対応してません。
- 実装は[go-github](https://github.com/google/go-github)をだいぶ参考にしました。

おしまい
Unityで物理シミュレーションとイベントハンドラの挙動


## 物理シミュする際、まずやること

* 物理シミュしたいGameObjectには、＊＊Collider(SphereColliderとかBoxColliderとか）とRigidBodyをつける。
* 地面はBoxCollider等をつけるだけでよい。
* 衝突のイベントを拾いたい場合、両方つけないとイベントが来ない気がする。


## パラメータ RigidBody.IsKinematic, Collider.IsTrigger

* RigidBody.IsKinematic=trueは、transformで動かすか、addForce等で動かす。ほかのものに影響を与えるが、自分は受けない。ゲームで動かすプレイヤーなどに使う。
* Collider.IsTrigger=trueにすると物理挙動が無視される。ただ衝突時OnTriggerEnterが呼ばれるようになる。
* Collider.isTrigger=trueにしなくても、衝突したらOnCollisionEnterが呼ばれる。ただisKinematic=trueになってると、よばれない。


## イベントと物理挙動のまとめ

| isKinematic | isTrigger | OnCollisionEnter | OnTriggerEnter | 物理挙動
|:-----------|:------------|:------------|:------------|:------------
| true     |  false  | くる  | こない | しない（他には影響与える）
| true     |  true  | こない  | くる | しない
| false     | true  | こない  | くる  | しない
| false    |  false  | くる  | こない  | する




## 参考
http://qiita.com/yando/items/0cd2daaf1314c0674bbe