OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleFormの送信をSlackへ通知！それとはまりどころ


GoogleFormを触る機会があったので、Slack通知のGASをまとめました。
大文字で記した変数に必要な値(トークンやチャンネル名)を渡せばコピペで動きます。

フォームで送信された内容のオブジェクトを`getResponseObject`で生成し、文字列としてSlackに投稿します。内容は必要に応じていじってください。

## GAS
```
function getResponseObject(e) {
  if (!e) { return false; }
  var obj = {};
  var responses = e.response.getItemResponses();
  for (var i = 0; i < responses.length; i++) {
    var data = responses[i];
    var key = data.getItem().getTitle();
    var val = data.getResponse();
    obj[key] = val;
  }
  return obj;
} 

function sendToSlack(e) {
  var url = 'https://slack.com/api/chat.postMessage';
  UrlFetchApp.fetch(url, {
    method: 'POST',
    payload: {
      token: SLACK_TOKEN,
      channel: SLACK_CHANNEL,
      username: SLACK_BOTNAME || 'TestBot',
      text: JSON.stringify(getResponseObject(e)) || 'hello, world.',
      parse: 'full',
      icon_emoji: SLACK_ICON || ':ok_woman:'
    }
  });
}
```

## [GoogleFormEvent](https://developers.google.com/apps-script/guides/triggers/events#google_forms_events)

![Kobito.0UHtZx.png](https://qiita-image-store.s3.amazonaws.com/0/25228/6462a0b8-e064-d94e-5dbb-314ee18fa17e.png "Kobito.0UHtZx.png")


## はまりどころ

送信時にSlackに投稿させるためには、今回の場合`sendToSlack`をトリガーに設定する。
登録したトリガーは図のように確認ができる。

![Kobito.tCkz42.png](https://qiita-image-store.s3.amazonaws.com/0/25228/0768c478-753e-039a-979b-7f44cef0abdb.png "Kobito.tCkz42.png")

ただ、ここで設定したトリガーは他人と共有されない。
そのため、他の人が設定したトリガーがここに表示されるようなことはないし、`sendToSlack`を別の人がトリガーとして設定していた場合は何度も呼ばれることになるが、なかなか気付きにくい。
ターミナル使用方法　mac


##ファイルの作成

###$ touch ファイル名


##ファイルの中身を表示

###$ cat ファイル名

:point_up:存在しないファイルを指定するとエラーが出力される。
エラーが出た場合、実行したコマンドは無効になる。
例)エラー文/cat:example.txt:No such file or directory

##補完機能

補完機能とはファイル名やフォルダ名を入力する時に、ファイル名の入力途中にTabキーを押すことで、残りのファイル名を補完してくれる機能。






##ディレクトリの作成

###$ mkdir ディレクトリ名

:point_up:ディレクトリとはフォルダのこと。
自分が現在いるディレクトリを**カレントディレクトリ**という。


##ディレクトリの移動

###$ cd ディレクトリ名

:point_up:$の左にはカレントディレクトリが表示されている。

:point_up:1階層ずつしか下層に下がることができない。

>例)htmlがカレントディレクトリとなる
>$ cd html
>html $

:point_up:存在しないディレクトリを指定するとエラーが出力される。
指定できるのはディレクトリ名だけでファイル名を指定することができない。


##ホームディレクトリへの移動

###$ cd

:point_up:ディレクトリを指定せずに「 **cd** 」のみで実行すると、**ホームディレクトリ**に移動することができる。
ホームディレクトリは、「 **〜** 」で表される。
>例)
>(ホームディレクトリ下層ディレクトリ)
>test $ pwd
>/home/main/test
>(ホームディレクトリへ移動)
>test $ cd
>〜 $ pwd
>/home/main

:point_up:**ホームディレクトリ**は、ユーザーが作業をするときに基点にするディレクトリのこと。
ユーザーが起点とするディレクトリのため、簡単に移動できるようになっている。(ホームディレクトリは設定可)


##カレントディレクトリの確認

###$ pwd

:point_up:ルートディレクトリからカレントディレクトリまでの階層が全て表示される。
例)/home/test

:point_up:1番親の階層に**ルートディレクトリ**というものがある。
ルートディレクトリは **/** で表される。


##ディレクトリの中身の表示

###$ ls (小文字)

:point_up:lsコマンドで確認出来るディレクトリとファイルは、基本的に**1つ子の階層**のみ。


##1つ親のディレクトに移動

###$ cd ..

:point_up:1つ親のディレクトリは「 **..** 」で指定する。





##ファイルの移動

###$ mv　[移動させたいファイル名]　[移動先のディレクトリ名]


##ディレクトリごとの移動

###$ mv [移動させたいディレクトリ名]　[移動先のディレクトリ名]

:point_up:指定ディレクトリ以下のファイルやディレクトリも一緒に移動する。


##ファイル名・ディレクトリ名の変更

###$ mv [現在のファイル名]　[新しいファイル名]

###$ mv [現在のディレクトリ名]　[新しいディレクトリ名]

:point_up:mvコマンドはファイル名やディレクトリ名を変更することもできる。


##ファイルのコピー

###$ cp　[コピーするファイル名]　[新しいファイル名]


##デスクトップへファイルをコピーする

###$ cp [コピーするファイル名] ~Desktop


##ディレクトリのコピー

###$ cp -r　[コピーするディレクトリ名]　[新しいディレクトリ名]


##ディレクトリを一つ上の階層へコピーする

###$ cp -r [コピーするディレクトリ名] ..

:point_up:ディレクトリの中のファイルも一緒にコピーされる。

:point_up:「 **-r** 」をつけずにディレクトリをコピーしようとすると、エラーが出力される。
コピーは実行されない。


##ファイルの削除

###$ rm　[削除するファイル名]


##ディレクトリの削除

###$ rm -r　[削除するディレクトリ名]

:point_up:「 **-r** 」をつけ忘れるとエラーとなる。

:point_up:削除したいディレクトリの1つ上の階層からrmコマンドを指定しないとエラーとなる。


##コマンドの履歴

過去に実行したコマンドを上矢印キーを「↑」で入力することができる。

:point_up:少し前に実行したコマンドを使いたい時にとても便利。


##ファイルの検索

###$ find　[ディレクトリ名]

:point_up:ディレクトリ内にあるファイルを表示する。

###$ find　[ディレクトリ名]　-name　[文字列]
>例) 
>$ find test -name 冬
><検索結果>home/test/html/2017/冬

:point_up:ディレクトリ内にある文字列を指定して検索できる。

:point_up:直下の階層ではなく、もっと下層の階層でも文字列を検索できる。

##コマンドラインの終了

###$ exit
githubでissueと関連付けする方法


### commit時
- commit時に以下のような記載をすると関連付けされるらしい。fix / close等の正確な定義と、masterブランチにマージされると自動的にstatusが変更されるということだが、まだどのような挙動になるかよく分かっていない。

### 課題
- 以下のように記載したら、一つ目しか有効にならなかった。

```
fix #1
fix #2
```

- 次のように書くべきだったか。今度試してアップデートします。

```
fix #1 #2
```
設定しておくとなにかと捗るalias集(Docker編)【自分向け備忘録】


## 動作確認済み環境は、zsh

- docker ps

	```bash
	alias dps='docker ps'
	```

- docker images

	```bash
	alias dim='docker images'
	```

- 不要container削除

	```bash
	alias drm='docker rm $(docker ps -aqf "status=exited") 2> /dev/null'
	```

- 不要image削除

	```bash
	alias drmi='docker rmi $(docker images -aqf "dangling=true") 2> /dev/null'
	```
- docker-compose

	```bash
	alias dc='docker-compose'
	```
- docker-composeで特定container起動
	- 引数で、container名と実行コマンド(`bash`とか`sh`とか)を指定

	```bash
	alias dcrun='dc run --service-ports'
	```

- docker-composeでcontainer停止＆削除

	```
	function dcrm() {
	    dc stop $1 && dc rm -f $1
	}
	```
PythonでFM変調、復調 その2

#概要
PythonでFM変調、復調してみた。
復調アルゴリズムは、googleラジオ

#写真
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/045af570-08ca-2d26-e1dd-082a723098be.png)

#サンプルコード

```
import scipy.signal as sg
import numpy as np
import matplotlib.pyplot as plt

sample_rate = 48000.0
nsamples = 320
F_1 = 440.0
F_2 = 10000.0
F_3 = 10000.0
nyq_rate = sample_rate / 2.0
cutoff_hz = 5000.0
numtaps = 29
t = np.arange(nsamples) / sample_rate
vin = np.sin(2 * np.pi * F_1 * t) 
vfm = np.sin(2 * np.pi * F_2 * t + 6.0 * -np.cos(2 * np.pi * F_1 * t))
i1 = vfm * np.cos(2 * np.pi * F_3 * t)
q1 = vfm * np.sin(2 * np.pi * F_3 * t)
lpf = sg.firwin(numtaps, cutoff_hz / nyq_rate)
I2 = sg.lfilter(lpf, 1, i1)
Q2 = sg.lfilter(lpf, 1, q1)
pI = 0
pQ = 0
m = 0
vo = np.zeros(320)
for t in range(0, vfm.size):
   real = pI * I2[t] + pQ * Q2[t]
   imag = pI * Q2[t] - pQ * I2[t]
   sgn = 1
   circ = 0
   ang = 0
   div = 1
   if (real < 0):
      sgn = -sgn
      real = -real
      circ = np.pi
   if (imag < 0):
      sgn = -sgn
      imag = -imag
      circ = -circ
   if (real > imag):
      div = imag / real
   else:
      if (real != imag):
         ang = -np.pi / 2
         div = real / imag
         sgn = -sgn
   vo[t] = circ + sgn * (ang + div / (0.98419158358617365 + div * (0.093485702629671305 + div * 0.19556307900617517))) * 5
   pI = I2[t]
   pQ = Q2[t]
fig = plt.figure(1)
ax = fig.add_subplot(311)
ax.plot(vin[1:300])
ax = fig.add_subplot(312)
ax.plot(vfm[1:300])
ax = fig.add_subplot(313)
ax.plot(vo[1:300])
fig.set_tight_layout(True)
plt.show()



```
docker と Jupyter notebook と jsonschema と memory leak

# 概要

Jupyter を docker で動かしていたところ、すごくメモリを使っているように見えた。
原因がどこにあるのかよくわからない。

# 結論

jsonschema を 2.5.1 にすると治るらしい

どうも、 jsonschema 2.4.0 にあった、メモリーリークの不具合だったようだ。

Notebook を re-open すると、リークするらしい。

最新の docker image だと 2.5.1 だと思われるが、お手元の環境で 2.4.0 （もしかしたら、それ以前も？）を使っていて
メモリー周りで困っていたら試してみるのも良いかもしれない。

# 参考情報

2.5.1 で、治るらしいという情報

* [Very large memory usage of the notebook server python process · Issue #642 · jupyter/notebook](https://github.com/jupyter/notebook/issues/642#issuecomment-216838278)

* [Possible Memory Leak when Re-opening Notebooks · Issue #8267 · ipython/ipython](https://github.com/ipython/ipython/issues/8267#issuecomment-116860804)

2.4.0でleakしている状況をみれるコードなど

* [memory leak in validation · Issue #237 · Julian/jsonschema](https://github.com/Julian/jsonschema/issues/237)
[memo]connpassのイベント情報をcurlで取得する方法

[connpass API リファレンス](https://connpass.com/about/api/)
こちらにある
`https://connpass.com/api/v1/event/?keyword=python`
を単純にcurlに入れて叩くだけではreturn内容はNULLでしか返って来なかったので、どうも `User-Agent`を入れてあげる必要があるようでした。

```php
    $curl   = curl_init();
    $option = [
      CURLOPT_URL => 'https://connpass.com/api/v1/event/?keyword_or=python,PHP&order=3',
      CURLOPT_CUSTOMREQUEST => 'GET',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_HTTPHEADER => [
        'User-Agent: ここに必要情報を入れる',
      ]
    ];
  
    curl_setopt_array( $curl, $option );
  
    $response = curl_exec( $curl );
    curl_close( $curl );
    $events   = json_decode($response, true);
```

これで取得可能。
User-Agentを手っ取り早く知りたい場合は、一度ブラウザでAPI踏んで、その時のコンソールにcurl情報をコピーできるので、そのuser agent情報だけを使ってあげればいいかと。
[Electron]暇なのでデスクトップいっぱいに氷を張るウィジェットを作った

暇つぶし程度に、Electronで デスクトップいっぱいに氷を表示して操作不能にするというただの作業妨害アプリを作りました。
 
## 注意事項
 
- 実用性なしです。
- 友達に自慢するくらいしかできません。
- Windows、フルHD(1920x1080) Electron v1.4.2の環境を前提に説明します。
 
なお、これは私がElectronに慣れるための練習用に作ったものなので、クオリティの低さについては勘弁してください。
 
## 実装内容
 
1920x1080の大きさのウィンドウを出し、そこに1920x1080の画像(透過png)を表示します。
 
### 仕様
 
20回クリックすると氷が割れる(=アプリが終了する)という仕様です。
 
## ポイント
 
```javascript:index.js
// electronモジュールを読み込み
const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow
 
// 新しいウィンドウ(Webページ)を生成
let mainWindow
function createWindow () {
  //画面サイズを取得する
  const Screen = electron.screen
  const size = Screen.getPrimaryDisplay().size
  // BrowserWindowインスタンスを生成
  mainWindow = new BrowserWindow({width: size.width, height: size.height, transparent: true, frame: false, resizable: false, skipTaskbar: true})
  // index.htmlを表示
  mainWindow.loadURL('file://' + __dirname + '/index.html')
  //常に一番手前
  mainWindow.setAlwaysOnTop(true);
  // ウィンドウを閉じたら参照を破棄
  mainWindow.on('closed', function () {
    mainWindow = null
  })
}
 
// アプリの準備が整ったらウィンドウを表示
app.on('ready', createWindow)
 
// 全てのウィンドウを閉じたらアプリを終了
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
```
 
>//常に一番手前
mainWindow.setAlwaysOnTop(true);
 
`mainWindow.setAlwaysOnTop(true);`で常に一番手前にウィンドウを配置します。  
あとは、`const Screen = electron.screen;`  
`const size = Screen.getPrimaryDisplay().size;`  
`width: size.width, height: size.height;`  
で画面サイズいっぱいの大きさにしたり、  
`skipTaskbar: true`でタスクバーに表示しないようにする ぐらいでしょうか。
 
## メインのコード
 
```javascript:index.js
//ウィンドウを取得する
const remote = require("electron").remote;
const BrowserWindow = remote.BrowserWindow;

//音声素材を読み込む
var glassBreak = new Audio("sounds/glass-break.mp3");
var glassCrack = new Audio("sounds/glass-crack.mp3");

//氷の耐久値
var tai9 = 20;

function iceclick() {
    tai9--;
    if (tai9 == 0) {
        glassBreak.play();
        remote.getCurrentWindow().hide()
    }
    glassCrack.play()
};
```
 
説明するまでもないかと。  
HTMLのほうで、imgタグのonclick属性で`iceclick()`を実行するようにしています。  
アプリの終了を`hide()`でしているのは、`close()`で完全に終了してしまうと、破壊時の効果音が鳴り終わる前に閉じてしまうからです。
 
## さいごに／ダウンロード
 
本当は、デスクトップの何もないところをクリックすると氷が出てきて―― とか、 
氷が割れたときのエフェクトが―― とか考えてたんですが、ウィンドウの最背面への移動や、画像を分割してバラバラにするとかいうのが、技術的にも気力的にも難しそうだったので諦めました。  
あと、Windowsでもクリックスルー(透明な部分のクリックを検知させない)を実現する方法がありましたら教えてください。
 
### ダウンロード
 
完成品アプリが[自分のブログ](https://lavasblog.github.io/frozen_desktop/)に置いてあります。スクリーンショットとかあります。よかったらぜひ見に来てね。
[Unity] ゲームの進行を管理するGameManagerの簡単な例


# こういうことができる

![gameManager.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/436891f9-8616-2120-d658-41671b516619.gif "gameManager.gif")


```GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public enum GameState{
	Start,
	Prepare,
	Playing,
	End
}

public class GameManager : MonoBehaviour {

	public static GameManager Instance;

	// 現在の状態
	private GameState currentGameState;


	// 例

	public Text label;
	public Button button;

	void Awake(){
		Instance = this;
		SetCurrentState (GameState.Start);
	}


	// 外からこのメソッドを使って状態を変更
	public void SetCurrentState(GameState state){
		currentGameState = state;
		OnGameStateChanged (currentGameState);
	}

	// 状態が変わったら何をするか
	void OnGameStateChanged(GameState state){
		switch (state) {
		case GameState.Start:
			StartAction ();
			break;
		case GameState.Prepare:
			StartCoroutine (PrepareCoroutine ());
			break;
		case GameState.Playing:
			PlayingAction ();
			break;
		case GameState.End:
			EndAction ();
			break;
		default:
			break;
		}
	}

	// Startになったときの処理
	void StartAction(){
	}

	// Prepareになったときの処理
	IEnumerator PrepareCoroutine(){
		label.text = "3";
		yield return new WaitForSeconds(1);
		label.text = "2";
		yield return new WaitForSeconds(1);
		label.text = "1";
		yield return new WaitForSeconds(1);
		label.text = "";
		SetCurrentState (GameState.Playing);
	}
	// Playingになったときの処理
	void PlayingAction(){
		label.text = "ゲーム中";
	}
	// Endになったときの処理
	void EndAction(){
	}
}

```

外部スクリプトからの状態の変更の仕方


```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ButtonEvent : MonoBehaviour {

	public void OnStartButton(){
		GameManager.Instance.SetCurrentState (GameState.Prepare);
	}
}

```
PRML 4.1~4.1.7

#PRML(4.1~4.1.7)
##第４章　線形識別モデル

本章は分類問題を解く類似のモデルについて扱う。

入力ベクトル$x$をK個の離散クラス${C}_k$で表されるような決定領域に分類する。
決定領域の境界を決定境界、決定面という。

ここでの線形識別モデルは決定面がxの線形関数であり、D次元入力空間に対し、その決定面がDー１次元の超平面で定義されるもの。

線形決定面で正しく各クラスに分類できるデータ集合を線形分離可能であるという。

目的変数の表現方法
２クラス→ ２値表現
$K > 2$クラス→ 1-of-K符号化法
$K=5$の場合
$t = (0,1,0,0,0)^T$　式(4.1)
$t_k$の値はクラスが$C_k$であると解釈できる。

分類問題に対する３つのアプローチ(1.5.4)
・<b>識別関数</b>…入力$x$から直接クラス推定する関数の構築(4.1)
・生成モデル…２つの推論（生成）を行なって、ベイズ(4.2)
・識別モデル…事後確率を直接モデル化(4.3)

３章の線形回帰モデルでは入力$X$に対し式(3.1)のような$w$の線形関数で出力値を求めた。

分類問題では離散値をとるクラスラベル、
あるいは一般的に領域(0,1)の値をとる事後確率を予測したい。
なので非線形関数$f(⋅)$で変換し一般化。式(4.3)一般化線形モデル

###4.1 識別関数（判別関数）
入力$x$をK個のクラスの１つ$C_k$に割り当てる関数。
決定面が超平面となる<b>識別関数</b>を取り扱う。

###4.1.1 ２クラス
最も簡単な線形識別関数は式(4.4)
$w$は重みベクトル、$w_0$はバイアスパラメータ
$y(x)≥0$ならば入力$x$はクラス$C_1$、それ以外は$C_2$
境界面は$y(x)=0$で定義される。
ベクトル$w$は決定面上にある全てのベクトルに直交する。
バイアスパラメータ$w_0$は決定面の位置を決定する。
決定面から点$x$への直交距離は式(4.7)
ダミー入力値$x_0$を導入、
$\widetilde{w} = (w_0,$w$)$、$\widetilde{x} = (x_0,$x$)$と定義すると式(4.8)
この場合決定面がD+1次元の原点を通るD次元の超平面に。

###4.1.2 多クラス
$K=2$クラスの識別関数を組み合わせて、$K>2$クラスを識別。
・１対他分類器
・１対１分類器
問題点→曖昧な領域が存在する

これは式(4.9)のようなK個の線形関数で構成される単独の$K$クラス識別で避けることができる。
すべての$j≠k$に対し、$y_k(x) > y_j(x)$である場合、点$x$はクラス
$C_k$に割り当てられる。
つまり$C_j$と$C_k$の決定境界は$y_k(x) = y_j(x) = 0$
境界はD-1次元の超平面、式(4.10)
識別器の決定領域は１つに連結していて、凸領域となってる。

###4.1.3 分類における最小二乗
式(4.13)から式(4.14)へ
$\widetilde{W}$は$k$番目の列がD+1次元ベクトル$\widetilde{w} = (w_{k0},$w$_k^T)$で構成される行列。
$\widetilde{x}$はダミー入力値$x_0 = 1$を加えた入力ベクトル$(1,$x$^T)^T$
学習データ集合$\{x_n,\,t_n\}$に対し、
$n$番目の行がベクトル$t_n^T$である行列$T$
$n$番目の行がベクトル$\tilde{x}_n^T$である行列$\tilde{X}$
を定義する。この二乗和誤差関数は式(4.15)と書ける。
$\widetilde{W}$に関する導関数を０として、整理すると式(4.16)
$\tilde{X}^†$は$\tilde{X}$の擬似逆行列
結果、式(4.17)が得られる。
問題点
→外れ値に対する頑健さの欠如、正しすぎる予測によって決定境界の位置が著しく変わってしまう
→最小二乗法では３クラスの分類では誤識別してしまう
後の章で適切な確率モデルを学ぶ。

###4.1.4 フィッシャーの線形判別
次元の削減という観点から線形識別モデルを見ることができる。
２クラスの場合、D次元の入力ベクトルを１次元に投影することで相当量の情報の損失が発生。
重みベクトル$w$を調整して、クラスの分離を最大にする射影を選択。
２つのクラスの平均ベクトル、式(4.21)
クラス間の分離、式(4.23)を最大にする射影を選択する。
ここで$w$は単位長とする制限を加える。
射影されたクラスの分散が小さくなるように。

###4.1.5 最小二乗との関連
最小二乗法は目的変数値の集合にできるだけ近い予測をすることが目的。
フィッシャーの判別規準は出力空間でのクラス分離を最大にすること。
目的値変数として1-of-K1符号化法を考えてきたが、異なる目的変数値の表記法を使うと重みに対する最小二乗解がフィッシャーの解と等価になる。
二乗和誤差関数は式(4.31)
式(4.38)の関係が得られる。

###4.1.6 多クラスにおけるフィッシャーの判別
$K > 2$クラスへのフィッシャー判別の一般化。
クラス数$K$$>$入力空間の次元$D$
ベクトル$y$と行列$W$との間に式(4.39)が成り立つ。
クラス内共分散を一般化すると式(4.40)
さらに式(4.41)(4.42)
クラス間共分散行列${S}_B$は式(4.46)
${S}_w$と${S}_B$を$D'$次元に射影して式(4.47)

###4.1.7 パーセプトロンアルゴリズム
２クラスのモデルで、入力ベクトル$x$を変換して得られる特徴量ベクトル$\phi$を得て、式(4.52)を構成する。
ここで非線形関数は式(4.53)で与えられる。
ベクトル$\phi($x$)$はバイアス成分$\phi_0($x$) = 1$を含んでる。
目的変数は$t ∈ $ {-1, 1}、活性化関数と適合が良い。
誤差関数の選択としては、誤識別したパターンの総数が自然だが、勾配が０となってしまい学習アルゴリズムの導出が難しい。
そこでパーセプトロン規準、式(4.54)
パーセプトロンの収束定理から学習データ集合が線形に分離可能な場合、有限回の繰り返しでパーセプトロンの学習アルゴリズムは有限回の繰り返しで厳密解に収束する。
問題点
→分離できない問題なのか、収束が遅いのかが収束するまでわからない
→パラメータの初期値やデータの提示順に依存して様々な解に収束してしまう
→線形分離でないデータ集合に対して、収束しない
→確率的な出力を提供せず、多クラスへの一般化が容易でない
CSSのanimationで点滅させる（よくない実装）

css3のanimationで
0% 100% にopacityを0,1と交互に指定して、
animation-durationを調整すれば大丈夫だと思います。

```css
.blink{ //点滅させたい要素に指定
  animation: blink 1s infinite;
}
@keyframes blink {
  0% {opacity: 0;}
  100% {opacity: 1;}
}
```

50% {opacity:1} など途中にopacityを指定しておくと点滅の周期をズラすことも出来そうです。

ただ、嫌がらせみたいな実装をscssなら簡単に出来ると思ったのでメモ
#scss
```scss
.blink{ //点滅させたい要素に指定
  animation: blink 1s infinite;
}
@keyframes blink {
  @for $i from 0 through 100{
    @if $i % 2 == 0{ //偶数の場合
      #{$i}% {opacity:0}
    } @else { //奇数の場合
      #{$i}% {opacity:1}
    }
  }
}
```
1%ずつopacityが0,1で入れ替わります。
確実に意味がなく動作が重くなる可能性が高いのでやめましょう
React Nativeで無効なボタンを作るTips

## さっそく作ってみる

react-native init は省略

Buttonコンポーネントを読み込んで

```
import {
  //省略
  Button
} from 'react-native';

```

disabledオブションをつけるだけ

```
<Button
 disabled
 onPress={() => console.log('test')}
 title="押せないボタン"
/>
```

こんな感じのボタンが出来ます。

![スクリーンショット 2017-01-25 18.20.19.png](https://qiita-image-store.s3.amazonaws.com/0/157657/7fd9f3d5-e318-5fe3-1c20-8553d5325627.png)

## これを使ってちょっとしたアプリを作ってみました

頭を振り絞って思いついたしょうもない例です。

[![https://gyazo.com/4896e4a07a67f7c832e098eb52048f58](https://i.gyazo.com/4896e4a07a67f7c832e098eb52048f58.gif)](https://gyazo.com/4896e4a07a67f7c832e098eb52048f58)

`disabled`オプションは`true`を渡すと無効`false`で有効なボタンになります。

```
import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Button,
  Alert
} from 'react-native';

export default class AwesomeProject extends Component {

  state = {disabled: false}

  render() {
    return (
      <View style={styles.container}>

      <Button
        disabled={this.state.disabled}
        onPress={this.onButtonPress.bind(this)}
        title="１回だけ押せます"
      />

      </View>
    );
  }

  onButtonPress() {
    Alert.alert('このボタンは無効になりました');
    this.setState({disabled: true});
　}
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
});

AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);
```

ブログでもButtonについての記事を書いたので、もっと知りたい方はどうぞ
http://st--blog.blogspot.jp/2017/01/hello.html
サムネのクロップ目的で background-image を使うのは止めて object-fit にしよう

たとえば、こんなユーザーアイコンをコーディングするときに...

<img width="157" alt="c53e654b-1e00-3ca9-e062-338c6b5fb030.png" src="https://qiita-image-store.s3.amazonaws.com/0/18569/0d1fffbb-f845-da80-db77-f56d51340a3b.png">



```slim:_avators.slim.html
.legacy-avator
  .legacy-avator__image style="background-image: url('画像のURL');"
  .legacy-avator__badge 3

```
```sass:_legacy-avator.sass
.legacy-avator
  position: relative
  height: 64px
  width: 64px

  .legacy-avator__image
    width: 100%
    height: 100%
    background-size: cover
    background-position: center center
    +border-radius(32px)

  .legacy-avator__badge
  	// 省略
```


このようなコードを書いてしまうこと、ありますよね。
**画像の縦横比が不明だけど、縦横比を維持したまま所定のサイズを埋めたい！** 
という要求を満たしたいがためにstyle属性を使う、という屈辱的なコードです。


# そこで object-fit

object-fitの詳細はMDNなどで確認してください。
https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit

object-fitをつかうと、こんな風にすっきり記述できます。

```slim:_avators.slim.html
.avator
  img.avator__image src="画像のURL"
  .avator__badge 3
```

```sass:_avator.sass
.avator
  height: 64px
  width: 64px

  .avator__image
    width: 100%
    height: 100%
    object-fit: cover
    object-position: 50% 50%
    +border-radius(32px)

  .avator__badge
    // 省略
```

object-fitを使えば、余計なアトリビュートを使わずにimgタグとしてとても素直に記述できます。

きもちいい！！
2015年から使えたなんて知らなかったぜ。。。


# 対応ブラウザ

モダンなサービスなら問題無いんじゃないかな！

> ![02b1017b-6123-81fb-bde6-4d71024c387d.png](https://qiita-image-store.s3.amazonaws.com/0/18569/b691b597-ba24-6261-6147-4fa13d6e6711.png)
> ![df5187c0-b399-89b3-caa5-11063d33ae92.png](https://qiita-image-store.s3.amazonaws.com/0/18569/60574576-58c1-b9e2-329e-ff0c1640db69.png)
> [MDN > Web technology for developers > CSS > object-fit](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) より

> ![スクリーンショット 2017-01-26 15.22.12.png](https://qiita-image-store.s3.amazonaws.com/0/18569/c790f62e-3859-f40e-cf49-45cd7d56ecde.png)
> [Can I use](http://caniuse.com/#feat=object-fit) より
レビューグラフ解析アルゴリズム評価用のTripAdvisorデータセットローダ

# 概要
[![Logo](https://rgmining.github.io/tripadvisor/_static/image.png)](https://rgmining.github.io/)

[スパムレビュア発見アルゴリズムの評価用データセット](http://qiita.com/jkawamoto/items/9a7647c47998fab4a1ad)に加えて，
イリノイ大学で公開されている [TripAdvisor データセット](http://times.cs.uiuc.edu/~wang296/Data/)を読み込む[パッケージ](https://rgmining.github.io/tripadvisor/)を作成しました．

# インストール
[パッケージ](https://rgmining.github.io/tripadvisor/)は PyPI に登録してあるので，次のコマンドでインストールできます．

```shell-session
$ pip install --upgrade rgmining-tripadvisor-dataset
```

なお，このインストール中に[元データ配布先](http://times.cs.uiuc.edu/~wang296/Data/)からファイルをダウンロードするので，
ある程度の時間を要します．（参考: [pip install中に他所からデータファイルを取得する](http://qiita.com/jkawamoto/items/a188ced57c8315afa8ec)）

# グラフデータの読み込み
`rgmining-tripadvisor-dataset`には[`tripadvosir`モジュール](https://rgmining.github.io/tripadvisor/modules/tripadvisor.html)が含まれており，`load`関数をエクスポートしています．
この関数はレビューグラフオブジェクトを受け取り， TripAdvisor データセットのレビューデータを追加します．

このグラフオブジェクトは，[グラフインターフェイス](https://rgmining.github.io/dataset-io/modules/dataset_io.html#graph-interface)を実装し次のメソッドを持っている必要があります．

* new_reviewer(name): name という名前を持つレビュアーオブジェクトを作成して返す．
* new_product(name): name という名前を持つ商品オブジェクトを作成して返す．
* add_review(reviewer, product, rating, date): date に投稿された reviewer による product へのスコアが rating であるレビューを追加する．なお rating は 0 以上 1 以下に正規化されているものとする．

先日紹介した，[Fraud Eagle](http://qiita.com/jkawamoto/items/d2284316cc37cd810bfd), [FRAUDAR](http://qiita.com/jkawamoto/items/4ce092de598021b8b01c) は共にこのグラフインターフェイスを実装しているので，
TripAdvisor データセットを読み込むことができます．

Fraud Eagle で解析する場合(事前に `pip install --upgrade rgmining-fraud-eagle` が必要)，

```python
import fraud_eagle as feagle
import tripadvisor

graph = feagle.ReviewGraph(0.25) # パラメータは適当に決めた．
tripadvisor.load(graph)

print("Start iterations.")
max_iteration = 10000
for i in range(max_iteration):

   # Run one iteration.
   diff = graph.update()
   print("Iteration %d ends. (diff=%s)", i + 1, diff)

   # 最大修正量が 10^-5 ならば収束したと思う
   if diff < 10**-5:
       break

# レビュアーごとに特異度を出力．
for r in graph.reviewers:
    print(r.name, r.anomalous_score)

# 特異度を考慮したレビューサマリを出力．
for p in graph.products:
    print(p.name, p.summary)
```

FRAUDAR で解析する場合（事前に `pip install --upgrade rgmining-fraudar` が必要），

```python
import fraudar
import tripadvisor

graph = fraudar.ReviewGraph(10) # パラメータは適当に決めた．
tripadvisor.load(graph)

graph.update()

# スパマーと判断されたレビュアーを出力．
for r in graph.reviewers:
    if r.anomalous_score == 1:
        print(r.name)

# スパマーを無視したレビューサマリを出力．
for p in graph.products:
    print(p.name, p.summary)
```

# まとめ
レビューグラフのマイニングアルゴリズム評価用に，
イリノイ大学で公開されている [TripAdvisor データセット](http://times.cs.uiuc.edu/~wang296/Data/)を読み込む[パッケージ](https://rgmining.github.io/tripadvisor/)を作成しました．
[グラフインターフェイス](https://rgmining.github.io/dataset-io/modules/dataset_io.html#graph-interface)を実装しているグラフオブジェクトであれば，このパッケージを利用できるので，
我々が作成したアルゴリズム以外のアルゴリズムを実装評価する際にも利用できます．
Butter Knifeを使ってコードをきれいにする

##はじめに
Butter Knife 8系(Ver.8.5.1)について色々調べたので、そのまとめです。

##Butter Knifeとは
Butter Knifeは、Android用の View Injection ライブラリ。
Viewとフィールド・メソッドとをアノテーションを用いて結び付けることができる。
[GitHub](https://github.com/JakeWharton/butterknife)はこちらへ。

##前提
* SDK ver.9以上必要（Ver.8.5.0 時点）
* Jackコンパイラもサポートしている（Ver.8.3.0 以降）<br>
[Data Binding](https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja)はJackコンパイラをサポートしていなかったので。。。

##導入
[README](https://github.com/JakeWharton/butterknife/blob/master/README.md)から抜粋。

```:build.gradle
dependencies {
  compile 'com.jakewharton:butterknife:8.5.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
```

```annotationProcessor``` はGradleプラグインのVer.2.2以上が必要。できなければ、aptのライブラリを追加する。
[Android プロジェクトで APT を使うためのGradle設定](http://qiita.com/taki4227/items/9fa2a2368ed5414d0897)

```:build.gradle
buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
  }
}

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
```

上記のプラグインを使う方法だと、ViewをバインドするときのIDが ```R``` から ```R2``` に変わるので注意。

##使い方
[公式サイト](http://jakewharton.github.io/butterknife/)にすべて書いてある。
あとで追記しよう。。。

##便利プラグイン
ButterKnife の View Injection を一発自動生成するプラグインがある。
[リリースノート](https://github.com/avast/android-butterknife-zelezny/releases)を見る限り、最新のVer.1.5.0はButterKnife Ver.8.0.1をサポートしているので、使えることは使える。

ただ、XMLに記述された android:id がキャメルケースの変数名に自動生成されるので、既存コードをButter Knifeに移行するときには適さなさそう。
新規で使うには便利。

[Butter Knife Zelezny](https://github.com/avast/android-butterknife-zelezny)
[Butter Knife Zeleznyプラグイン導入方法](http://dev.classmethod.jp/smartphone/android-butterknifezelezny/)はこちら。

##Ver.移行
古いVer.からアップグレードするときに必要なこと。

###Ver.6未満 → 7
以下のサイトでいけそう。

* [Butter Knife v7への移行](http://qiita.com/yyaammaa/items/408bc3fe429175fd74ff)
* [ButterKnife 7.0への移行ガイド](http://qiita.com/yshrsmz@github/items/0af607435ae8a4edb743)

###Ver.7 → 8
以下のサイトにだいたい書いてあるが、build.gradleの部分だけは追記。
* [Butter Knifeを8系にアップグレードする](http://mapyo.hatenablog.com/entry/2016/05/18/090807)
* [Android プロジェクトで APT を使うためのGradle設定](http://qiita.com/taki4227/items/9fa2a2368ed5414d0897)

##デメリット
Butter Knifeのデメリットが書いてある記事があったので、残しておく。
[さよならButterKnife. 僕はAPTの無いキミが好きだったよ](http://qiita.com/eaglesakura/items/7366886cfbbd5ba74cfe)

##類似ライブラリ
* [Data Binding](https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja)
* [Android Annotations](http://androidannotations.org/)

##参考
* [公式サイト](http://jakewharton.github.io/butterknife/)
* [GitHub](https://github.com/JakeWharton/butterknife)
* [ButterKnifeが素敵だ](http://qiita.com/RyotaMurohoshi/items/93b9fc131a6863a5a772)
* [Butter Knifeの紹介](http://qiita.com/yyaammaa/items/cb52ad37309c2e195e56)
さくらのクラウド ウェブアクセラレータ(CDN)でLet's Encryptを使う

個人ブログに移動しました。
[さくらのクラウド ウェブアクセラレータ(CDN)でLet's Encryptを使う](https://blog.masa23.jp/posts/2017/01/webaccel-lets-encrypt/)
サーバー用途のarchlinuxをcfw4に一撃で入れる。

#動機
http://www.kunst1080.net/entry/2014/10/19/212305 で公開されているgistに触発されて自分用に作成した。
#環境
Let'snote cfw4 法人販売モデル
（先輩が大学の生協で買ったLet'snote cfw4をofficeが入ってないとの理由で5年前にもらった代物）
#方針
閉じてもサスペンドしない。
#実行方法
1. DDforwindows( http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows )等でarchlinuxインストールイメージ( https://www.archlinux.org/download/ )をUSBに書き込む。
2. cfw4に挿して32bitで起動する。
3. 以下のコマンドを実行する。

`wget https://gist.githubusercontent.com/naniwaKun/ee44bd7b00c7710e57098506d267ca64/raw/165e7a23997be012c6256ac6a4c9a1a6d0200214/archsetup.sh`
`chmod +x archsetup.sh`
`./archsetup.sh`

#感想
OSのインストールなんて人間の仕事ではないから楽をするに限る。
こんなことしなくてすむdocker用のサーバーほしい。

実際はgitと連携していろんなサービスを立ち上げてます。

#付録
https://gist.github.com/naniwaKun/ee44bd7b00c7710e57098506d267ca64
Line Beaconのアカウント連携URL

ひょんなことからLine Beaconを使う機会に恵まれたけど
届いたのは基板だけで、いわゆる箱がない。

ググったけど~~どいつもこいつもURLの部分隠しやがって~~なかなかアカウント連携に必要なページのURLが見つからず

[ビーコンショップ](https://beacon.theshop.jp/items/4699062)なるショップページ(どんなショップやねん)でようやく発見

https://admin-official.line.me/beacon/register 
です。いじょ
CentOS7上で複数起動されているtomcatへリモートデバッグ接続する

軽くググッた限り、マルチインスタンス運用下のtomcatにリモートデバッグ設定する方法が見つからなかったので、備忘も兼ねて

## 環境
                          | バージョン
--------------------------|---
CentOS                    | 7.2
Tomcat                    | 7.0系


## 背景
- 通常、tomcatのリモートデバッグ設定は、catalina.shからjpda(Java Platform Debugger Architecture)を有効化する形で行う 

```bash
catalina.sh jpda start
```

- だが、CentOS7にyumでtomcat7をインストールすると、catalina.shは生成されない。つまり、この方法は使えない ヽ(´ー｀)ノ

## 前提
- ポート類は事前に利用可能な状態にしておくこと

- こちらの内容を前提とします(特に[tomcatサービスの管理])。大変詳しく解説されております

>[参考メモ/CentOS7のApache Tomcatパッケージについてメモ](http://qiita.com/msakamoto_sf/items/ef34922548275dd31014)

## 対処
１． tomcat用serviceファイル __/usr/lib/systemd/system/[tomcat@.service]__、項目[EnviromentFile]で指定したファイルに、以下の記述を追加する

```bash:/etc/sysconfig/EnviromentFile[1...n]
JAVA_OPTS = '[元々の内容] -agentlib:jdwp=transport=dt_socket,address=[ポート番号],server=y,suspend=n'
JPDA_SUSPEND=y
JPDA_ADDRESS=[このホストのIP]:[ポート番号]
```

２．マルチインスタンス運用時は、このファイルが複数あるはずなので、すべてのファイルに追加する。ポート番号の重複に注意

３．tomcatを再起動する

```bash
systemctl restart [tomcat@.service]
```

４．リモートから、設定したポートに接続できることを確認する。"Connection refused"がでなければOK

```bash
telnet [さっき設定したIP] [さっき設定したポート番号]
```

５．Eclipseから接続する場合、メニュー[実行]　->　[デバッグの構成]　->　[リモートJavaアプリケーション]から、接続タイプ[標準（ソケット接続）」、ホスト[さっき設定したIP]、ポート[さっき設定したポート番号]を設定し、[デバッグ]ボタンを押す

## 解説
- やっていることは、catalina.shで付加されるデバッグ設定オプション文字列を、EnviromentFileのオプション設定部に追加しているだけ

- 前述のページでも触れられているが、他ディストリビューションと環境が大きく異なる為、面食らった

## 参考
- [Tomcat8 をリモートデバッグできるようにする](http://qiita.com/Monota/items/54e43d9526ca836d2a61)

- [Sun VM の呼び出しオプション（Oracle公式)](https://docs.oracle.com/javase/jp/6/technotes/guides/jpda/conninv.html)
 * JAVA_OPTSに付加した、jdwpについての解説有
npmのライブラリのライセンスが商用利用可能か調べる

#node.jsのライブラリのライセンスが商用利用可能か調べる

「grunt-license-report」というモジュールを使います。
このモジュールはgruntというタスクランナーを使用して実行されますので、gruntから順番にインストールしていきます。

gruntを自分のプロジェクトへインストール。

    npm install grunt

コマンドラインからgruntを実行するのでグローバルにコマンドライン用gruntをインストール。

    npm install -g grunt-cli

grunt-license-reportをインストール。

    npm install grunt-license-report

gruntfile.jsを用意する。

	module.exports = function (grunt) {

	    grunt.initConfig({
	        pkg: grunt.file.readJSON('package.json'),
	        "grunt-license-report": {
	            output: {
	                path: './report/licenses',
	                format: 'html'
	            }
	        }
	    });

	    grunt.loadNpmTasks('grunt-license-report');
	    grunt.registerTask('default', ['grunt-license-report']);

	};

出力ディレクトリを作成する。
自分のプロジェクト配下に「report」を作成しておいてください。

以下のコマンドで実行する。
これでデフォルトタスク「default」(つまりgrunt-license-report)を実行してくれます。

    grunt


実行するとプロジェクトのreportディレクトリの下にこのようなHTMLレポートが作成されます。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/33116/e7fe3ab3-3e94-9251-26e7-027f69509791.png)



商用利用できるライセンスはこちらを参照してください。
[商用利用できるオープンソースライセンスはけっきょくどれで何をすればいいのか？](http://qiita.com/0xfffffff7/items/efbb65521d7708f2db7d)

この中で問題がありそうなライセンスがあったら、どのモジュールがそのモジュールを使用しているのか依存を知るためにモジュール名で検索かけます。

    npm ls パッケージ名

問題のライブラリを使用している親モジュールを特定したら、それを使わない選択肢を考えるか代替えのライブラリを探すか対処を考えます。
Azure の更新情報を見やすくしたサイトを作ってみた

# TL;DR
Azure の更新情報は複数のカテゴリが選択できず、一覧で見やすいサイトが欲しかったので作ってみました。
こちらが公式：https://azure.microsoft.com/ja-jp/updates/

# サイトURL
http://maus.nomupro.com/

# GitHub
https://github.com/tsubasaxZZZ/caus

# 使っている技術
* Python 3
* Scrapy
* BeautifulSoup
* MongoDB
* Docker
* CircleCI

# 今後の予定
* 設定のコンフィグ化
* ログ周り改善(App insight, etc)
* テストの自動化
* 適当なページネーションの改善
* Docker コンテナの最適化&デプロイの効率化
* サマリの日本語訳追加
* エクスポート機能の追加
* インターフェース改善(検索のあたり)
* API化
PythonでFM変調、復調

#概要
PythonでFM変調、復調やってみた。
復調アルゴリズムは、オリジナル。

#写真
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/91e233b4-a51e-e41d-7b2a-4a1b235a7547.png)


#サンプルコード

```
import scipy.signal as sg
import numpy as np
import matplotlib.pyplot as plt

sample_rate = 48000.0
nsamples = 320
F_1 = 440.0
F_2 = 10000.0
F_3 = 7000.0
nyq_rate = sample_rate / 2.0
cutoff_hz = 1000.0
numtaps = 29
t = np.arange(nsamples) / sample_rate
vin = np.sin(2 * np.pi * F_1 * t) 
vfm = np.sin(2 * np.pi * F_2 * t + 6.0 * -np.cos(2 * np.pi * F_1 * t))
d = 1.0
for i in range(0, vfm.size):
   vam[i] = (vfm[i] - d) / 0.5
   d = vfm[i]
i1 = vam * np.cos(2 * np.pi * F_3 * t)
q1 = vam * np.sin(2 * np.pi * F_3 * t)
lpf = sg.firwin(numtaps, cutoff_hz / nyq_rate)
i2 = sg.lfilter(lpf, 1, i1)
q2 = sg.lfilter(lpf, 1, q1)
vo = np.sqrt(i2 * i2 + q2 * q2) 
fig = plt.figure(1)
ax = fig.add_subplot(311)
ax.plot(vin[1:300])
ax = fig.add_subplot(312)
ax.plot(vfm[1:300])
ax = fig.add_subplot(313)
ax.plot(vo[1:300])
fig.set_tight_layout(True)
plt.show()

```
Azureの基本的な構成　リソースオブジェクトの説明

# 基本的（必須）な構成
仮想マシンを作成するにあたって以下のリソース群を作成する必要がある。
仮想マシン作成時に自動で作られるので予め作成する必要はないが、自動作成の場合、名前が勝手につくのでそれが嫌な場合は予め作成する。

・リソースグループ
　・ストレージアカウント
　・VirtualNetwork
　　・サブネット
　・パブリックIPアドレス
　・ネットワークセキュリティグループ

# リソースグループ
リソースをまとめるグループ、Azure管理ポータル上でのアカウントでの制限や課金、監視などがこのグループ単位で行われる。

#ストレージアカウント
アカウントの種類：汎用 or BLOBストレージ
ここでBLOBストレージを選択すると、アクセスレベルの項目で「クール」と「ホット」が選べる。

[ホット]：アクセス頻度の高いデータ用。可用性 99.9%／RA-GRS 99.99%
[クール]：アクセス頻度の低いデータ用。バックアップ、アーカイブ用途向け。料金安い。可用性 99%／RA-GRS 99.9%
　※要するにバックアップやアーカイブ用途でのストレージを使う場合は、BLOBストレージを利用した方が安く済み、それ以外の用途では基本的に汎用を選択するのが無難と思われる。

汎用のパフォーマンスレベルを「Standard」は、VM作成時のVMディスクの種類の「HDD」と紐付き、
パフォーマンスレベル「Premium」は、「SSD」に紐づく。
　※予めストレージアカウントを作成する場合、VM作成時に紐付いたディスクの種類を選択しないと表示されない。

# VitualNetwork
プライベートネットワーク。
この中でサブネットを複数作成する事が可能で、ある程度規模のあるシステムを構築する際に柔軟に対応出来る。

# パブリックIP
AWSでいうElasticIP。詳細は省く。

# ネットワークセキュリティグループ
AWSでいうセキュリティグループ。詳細は省く。見た感じAWSより柔軟に対応できそう。
vSphere環境の3つの「ドメイン」

# 概要

vSphere環境では、内部セキュリティのための「ドメイン」と、マシン名解決に関与するDNSの「ドメイン」と、外部認証をするためのIDソースの「ドメイン」を意識する必要があります。混同されがちで、混乱の元になりがちなこれらについて、私の理解で整理します。

# 詳細

vSphere環境では、内部セキュリティのための「ドメイン」と、マシン名解決に関与するDNSの「ドメイン」と、外部認証をするためのIDソースの「ドメイン」を意識する必要があります。これらは単に「ドメイン」と呼ばれることが多いために、混同されがちで、混乱の元になりがちです。

これらについて、私の理解で整理します。

## 3つのドメイン

vSphere環境では、以下の3つのドメインを意識する必要があります。

| |種別|管理箇所|管理対象|vSphereでの用途|
|---|---|---|---|---|
|1|SSOのドメイン|vCenter Single Sign-On（SSO）|vSphere環境のローカルユーザー|ログイン時の認証|
|2|DNSのドメイン|外部のDNSサーバ（BIND、Active Directory、WindowsのDNSサービスなど）|ネットワーク上のマシン|マシンの名前解決|
|3|外部のIDソースのドメイン|外部のディレクトリサーバ（OpenLDAP、Active Directoryなど）|組織内のユーザー、グループ|ログイン時の認証|

## SSOドメイン名の検討

3つのドメインのうち、SSOのドメイン名はvCenter（の一部として、SSOを含むPSC）をインストールする際に指定するものです。vSphere 5.5では`vsphere.local`に固定されていましたが、6.0からは指定可能になりました。

> 初期の状態では`administrator@<your_domain_name>`のユーザーのみにこの権限があります。vSphere 5.5 では、このユーザーは`administrator@vsphere.local`でした。vSphere 6.0 では、新しい Platform Services Controller を使用して vCenter Server をインストールするときや vCenter Server Appliance をデプロイするときに vSphere ドメインを変更できます。（「[vSphere のインストールとセットアップ - Update 2 - vSphere 6.0](http://pubs.vmware.com/vsphere-60/topic/com.vmware.ICbase/PDF/vsphere-esxi-vcenter-server-602-installation-setup-guide.pdf)」p.212）

SSOドメイン名を検討する際、外部のIDソースのドメイン名と被らないようにする必要があります。

> このドメイン名に Microsoft Active Directory や OpenLDAP のドメイン名を使用しないでください。（同上）

Active DirectoryはDNSサーバーとIDソース（ユーザー認証元）を兼ねることが多いので、SSOドメイン名はActive Directory上のドメイン名とは分けることが必要になることが多いです。SSOを複数構築する必要がなければ、vSphere 5.5までに倣って`vsphere.local`をSSOドメイン名として使用するのは、比較的安全だと思われます。

# 参照

- [vSphere のインストールとセットアップ - Update 2 - vSphere 6.0](http://pubs.vmware.com/vsphere-60/topic/com.vmware.ICbase/PDF/vsphere-esxi-vcenter-server-602-installation-setup-guide.pdf)

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
SB cloud を試しています。

SB Cloud を試しでつかっていて、気になった点です。
とりいそぎメモなんで、少しづつしか書きません。


### インスタンスを停止しても課金されます。

### ubuntu の apt-get は、proxy 経由なんで、ダウンロードできないことがありました。

### 固定ＩＰ付与は、インスタンスを作成するときに、帯域を０にしないとできません。
（注意書きに書いてあるけど、読み飛ばしてしまった。。。。）
Terraform -IAMユーザーのキー管理-

# 目的
* IAMユーザーのアクセスキー（アクセスキーID およびシークレットアクセスキー）はリポジトリに置きたくないので、`Static credentials`ではなく、`Shared credentials file`で運用する

* 認証は優先順位があります

```text

Authentication

The AWS provider offers a flexible means of providing credentials for authentication. The following methods are supported, in this order, and explained below:
```

1. Static credentials
2. Environment variables
3. Shared credentials file
4. EC2 Role

# 前提
* aws configureは完了している

# 方法
* 特に定義しない場合、`default`のprofileが適用されるため、使用するprofileを明示的に定義する。

# 設定
```bash
// config
provider "aws" {
  region = "ap-northeast-1"
  profile = "iam-user"
}
```

# 参照
[AWS PROVIDER](https://www.terraform.io/docs/providers/aws/index.html)
Android MのDozeにおける状態遷移

Android M で adb shell dumpsys deviceidle を実行すると表示される Settings や mState の意味がよくわからなかったので、DeviceIdleController.java のソースコードを読んでまとめてみました。

※ Android Nではさらに Light/Deep Dozeなるものができたらしいですが、そちらはまだ調べてません。


# adb shell dumpsys deviceidle の実行結果

SO-02G(Android 6.0.1)での実行結果（抜粋）

```shell
$ adb shell dumpsys deviceidle
  Settings:
    inactive_to=+30m0s0ms
    sensing_to=+4m0s0ms
    locating_to=+30s0ms
    location_accuracy=20.0m
    motion_inactive_to=+10m0s0ms
    idle_after_inactive_to=+30m0s0ms
    idle_pending_to=+5m0s0ms
    max_idle_pending_to=+10m0s0ms
    idle_pending_factor=2.0
    idle_to=+60m0s0ms
    max_idle_to=+6h0m0s0ms
    idle_factor=2.0
    min_time_to_alarm=+60m0s0ms
    max_temp_app_whitelist_duration=+5m0s0ms
    mms_temp_app_whitelist_duration=+60s0ms
    sms_temp_app_whitelist_duration=+20s0ms
  mState=INACTIVE
```

# mStateの意味

|state|description|
|:-:|:-:|
|STATE_ACTIVE|Device is currently active.|
|STATE_INACTIVE|Device is inactve (screen off, no motion) and we are waiting to for idle.|
|STATE_IDLE_PENDING|Device is past the initial inactive period, and waiting for the next idle period.|
|STATE_SENSING|Device is currently sensing motion.|
|STATE_LOCATING|Device is currently finding location (and may still be sensing).|
|STATE_IDLE|Device is in the idle state, trying to stay asleep as much as possible.|
|STATE_IDLE_MAINTENANCE|Device is in the idle state, but temporarily out of idle to do regular maintenance.|

# 状態遷移
## state machine diagram
![State Machine Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/107584/5d3c94b0-39b7-d01e-b3d5-c91e93e52850.png)

## time chart
![time.png](https://qiita-image-store.s3.amazonaws.com/0/107584/c09175ca-9680-e76a-f42a-a9ddfd7d3d8c.png)

# Dozeの流れ
## IDLE状態になる
- 画面消灯か充電ケーブルが外されたことを契機に、30分間待つ (STATE_INACTIVE)
- さらに30分間、端末が静止しっぱなしであることを待つ (STATE_IDLE_PENDING)
- より精度の高く電池を消費するモーションセンサーと位置情報測位により、静止状態を判断 (STATE_SENSING, STATE_LOCATING)
- 以上をもって、１時間のDozeに突入 (STATE_IDLE)
- 一時的に、5分間だけ起きる (STATE_IDLE_MAINTENANCE)
- 以降、DozeとMainteの時間は倍々に伸びていく
    - Doze時間の上限は6時間、Mainte時間の上限は10分

1時間放置しておいたら居眠りしちゃうけど、1時間後にちょっとだけ起きる。その後は、2時間、4時間、6時間と居眠りの時間が長くなっていく。

## IDLE状態から抜ける
- 画面点灯/充電開始されると、一気に STATE_ACTIVE へ
    - 再度、１時間静止しないと STATE_IDLE へは戻れない
- 画面消灯＆バッテリー駆動のまま端末が動かされると、 STATE_INACTIVE で10分だけ待つ
    - 初期状態では30分のところを10分のみ
    - ちょっとした移動などによる振動での起床では、IDLEへ戻りやすい
- 目覚まし時計では、一気に STATE_ACTIVE へ
    - AlarmManager.setAlarmClock() も同様。
reduce KML size


```ruby
require 'nokogiri'
require 'pry'
now = Time.now

TARGET = 8000

# binding.pry
@doc = Nokogiri::XML(File.open(ARGV[0]))

all_coordinates_str = @doc.search("coordinates").children.to_s

all_coordinates = all_coordinates_str.split("\n")

all_coordinates.each_with_index do |value, index|
  all_coordinates.delete(value) if index%2==0
end if all_coordinates.length > TARGET
puts all_coordinates.length

@doc.search("coordinates").first.children = all_coordinates.join("\n")

puts "write back to #{ARGV[0] + "_new.kml"}"
puts Time.now-now
File.write(ARGV[0] + "_new.xml", @doc.to_xml)

```

This script try to reduce the `KML` point size to enable import to [latlonglab](latlonglab.yahoo.co.jp/route)
商用利用できるオープンソースライセンスはけっきょくどれで何をすればいいのか？

#自由に使えるのはけっきょくどのライセンスか？

以下のライセンスは商用利用可能です。

* Apache 2.0 License
* MIT License
* Unlicense
* WTFPL
* BSD License(**要注意**)

これらについてやるべきことは、著作権表示とライセンス条項を書いておくだけです。
つまり、ソースコードの先頭などに書いてるライセンス表記をそのまま残しておけばそれでいいです。
ただし、バイナリ形式で固めて配布する場合はどこか別の場所に記載する必要があります。

これ以外のものは使わない方がいいです。
以上。

で終わりなのですが、
注意点とか他のライセンスもあるのでもう少し詳しく書きます。

#BSD Licenseは注意

上記のうち、BSDライセンスだけは注意が必要です。
BSDはもともと4条項の条件が付けられていたライセンスです。
その条項が一つずつ削られて4つ、3つ、2つとなりました。
したがって3種類のBSDライセンスがあります。

* BSD-4-Clause(一番最初のオリジナル)
* BSD-3-Clause
* BSD-2-Clause

それぞれの違いは以下です。

###BSD-4-Clause
*  1.ソースコードの再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項を保持すること。
*  2.バイナリ形式の再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項は、ドキュメントまたは他の資料で配布すること。
*  3.このソフトウェアの機能に言及するまたは使用するすべての宣伝物には、次の謝辞を表示する必要がある: 「この製品は、<organization>によって開発されたソフトウェアが含まれています。」
*  4.このソフトウェアのコントリビューター(貢献者)の名前は、特定の書面による事前の許可なしに、このソフトウェアから派生した製品の保証または販売促進のために使用してはいけない。

###BSD-3-Clause
*  1.ソースコードの再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項を保持すること。
*  2.バイナリ形式の再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項は、ドキュメントまたは他の資料で配布すること。
*  3.このソフトウェアのコントリビューター(貢献者)の名前は、特定の書面による事前の許可なしに、このソフトウェアから派生した製品の保証または販売促進のために使用してはいけない。


###BSD-2-Clause
*  1.ソースコードの再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項を保持すること。
*  2.バイナリ形式の再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項は、ドキュメントまたは他の資料で配布すること。

つまり、BSD-4-Clauseを使う場合は、
「この製品は、○○という組織によって開発されたソフトウェアが含まれています。」
という謝辞を入れなければなりません。

BSD-3-Clauseを使う場合は、
商用利用の際に「この製品が使っている○○というライブラリは○○さんが作ったものだよ、すごいでしょ」的な宣伝文句を書いてはいけないということです。

BSD-3-Clauseはそのような文句を使わなければいいだけですが、BSD-4-Clauseはめんどうですね。

**そして注意したいのが、普通に「BSDライセンス」と表記されているのがオリジナルのBSD-4-Clauseを示しているのか、最新のBSD-2-Clauseを示しているのかを確かめる必要があるということです。**
たいていはBSDライセンスと表記されていれば最新なので問題ないはずですが、よく条文を見ると「BSD-4-Clause」の内容が書かれているかもしれません。


#CC(クリエイティブコモンズライセンス)

もう一つ、自由に使えるのがクリエイティブコモンズライセンスですが、これはバリエーションが複数あり、商用に使えない場合があります。
非営利アイコンがあるものは使えません。
なので不安なら使わないのが無難です。

詳細はこちらを。
https://creativecommons.jp/faq/

そもそもオープンソースソフトウェアというよりはデザイン系で使用されることが多いので無縁かもしれませんが。

#GPLライセンス

自由に使えますが、これを使用して作ったものは「自由に改変、再配布することが可能」になってしまいます。
ですので、ウェブサービスとしてユーザーに見えない内部ロジックで使うのなら使えます。
ウェブページのJavaScriptで使用する場合はユーザーに見えるので微妙です。使わない方が無難です。

詳細はこちらを。
https://www.gnu.org/licenses/gpl-faq.html#DoesTheGPLAllowDownloadFee
「goapp test」が予想外のエラーを出して困っている件

このエラーにビビッときたらコメントを。
## 環境

- Google App Engine SDK のインストール
- Go のインストール
- Git のインストール


```csh:versions
>goapp version
go version go1.6.3 (appengine-1.9.46) windows/amd64

>go version
go version go1.7.1 windows/amd64

>git version
git version 2.11.0.windows.3
```


```go:テストコード
package sample

import (
	"testing"

	"google.golang.org/appengine/aetest"
	"google.golang.org/appengine/memcache"
)

func TestFoo(t *testing.T) {
	ctx, done, err := aetest.NewContext()
	if err != nil {
		t.Fatal(err)
	}

	defer done()

	it := &memcache.Item{
		Key:   "some-key",
		Value: []byte("some-value"),
	}
	err = memcache.Set(ctx, it)
	if err != nil {
		t.Fatalf("Set err: %v", err)
	}
	it, err = memcache.Get(ctx, "some-key")
	if err != nil {
		t.Fatalf("Get err: %v; want no error", err)
	}
	if g, w := string(it.Value), "some-value"; g != w {
		t.Errorf("retrieved Item.Value = %q, want %q", g, w)
	}
}
```

### goapp test！

```csh:エラーコード
>goapp test
2017/01/25 14:19:20 appengine: not running under devappserver2; using some default configuration
INFO     2017-01-25 14:19:23,394 devappserver2.py:756] Skipping SDK update check.
WARNING  2017-01-25 14:19:23,394 devappserver2.py:772] DEFAULT_VERSION_HOSTNAME will not be set correctly with --port=0
Traceback (most recent call last):
  File "C:\go_appengine\\dev_appserver.py", line 94, in <module>
    _run_file(__file__, globals())
  File "C:\go_appengine\\dev_appserver.py", line 90, in _run_file
    execfile(_PATHS.script_file(script_name), globals_)
  File "C:\go_appengine\google\appengine\tools\devappserver2\devappserver2.py", line 1027, in <module>
    main()
  File "C:\go_appengine\google\appengine\tools\devappserver2\devappserver2.py", line 1015, in main
    dev_server.start(options)
  File "C:\go_appengine\google\appengine\tools\devappserver2\devappserver2.py", line 807, in start
    request_data, storage_path, options, configuration)
  File "C:\go_appengine\google\appengine\tools\devappserver2\devappserver2.py", line 907, in _create_api_server
    appidentity_oauth_url=options.appidentity_oauth_url)
  File "C:\go_appengine\google\appengine\tools\devappserver2\api_server.py", line 421, in setup_stubs
    auto_id_policy=datastore_auto_id_policy)
  File "C:\go_appengine\google\appengine\datastore\datastore_sqlite_stub.py", line 615, in __init__
    factory=sql_conn)
sqlite3.OperationalError: unable to open database file
--- FAIL: TestFoo (3.20s)
sample_test.go:13: unable to find admin server URL
FAIL
exit status 1
```

### 単体テストできないつらみ

自前の環境が壊れてるから失敗しているはずだと、仮想マシンにWindows10のクリーン環境を用意して、同じ手順にて試すも同じエラーが出て意気消沈。


- `sqlite3.OperationalError: unable to open database file`
- `sample_test.go:13: unable to find admin server URL`
Composerの実行速度を高速化する方法

## 概要
今ではPHPの開発に欠かせないツールとなった [Composer](https://getcomposer.org/) ですがパッケージのダウンロードを含む動作が遅いので改善する方法をまとめました。

## 対策1 Composerのバージョンを1.3.0以上に更新する

※この対策はxdebugがインストールされた環境下でないと効果はありません。

xdebugをインストールしたphpで [Composer](https://getcomposer.org/) を使うとパフォーマンスが低下して以下の警告が出ます。

```
You are running composer with xdebug enabled. This has a major impact on runtime performance.
```

もし今使っている [Composer](https://getcomposer.org/) のバージョンが1.2.X系であれば1.3.X系にバージョンアップする事をオススメします。

>Composer 1.3.0 - https://github.com/composer/composer/blob/1.3.0/CHANGELOG.md

>Fixed ext-xdebug not being require-able anymore due to automatic xdebug disabling

こちらにあるように1.3.0以降のバージョンは [Composer](https://getcomposer.org/) 実行時に自動的にxdebugを無効化しパフォーマンスの低下を防いでくれます。

※1.2.X系の時は[Composer](https://getcomposer.org/) 利用時にxdebugを無効化する事でパフォーマンスの低下を防いでいました。

ちなみにcomposer自体の更新は下記のコマンドで実行出来ます。

```bash:composer自体の更新
composer self-update
```

## 対策2 packagistのミラーサーバを日本国内のサーバに変更する

@Hiraku さんが作成された [スライド](http://www.slideshare.net/hinakano/composer-phpstudy) によると遅い原因は主に下記の3つです。

>- packagist.orgが日本から遠い
>- composerのアーキテクチャ的に、小さなjsonファイルを少しずつダウンロードするため、ネットワークの遅延がもろに影響する
>- composerがfile_get_contentsでjsonをダウンロードしていて、どうやらKeep-Aliveを使っていないし、並列ダウンロードもしていない

そこでミラーサーバを @Hiraku さんが作成された日本国内のサーバに変更する事でダウンロードの高速化を図ります。

```bash:ミラーサーバをpackagist.jpに変更
$ composer config -g repos.packagist composer https://packagist.jp
```

もし元に戻したい時は、下記のコマンドを実行します。

```bash:ミラーサーバpackagist.jpを無効化する
$ composer config -g --unset repos.packagist
```

## 対策3 Composerプラグインによる高速化

[こちら](http://tech.mercari.com/entry/2016/02/01/164829) で紹介されている、prestissimoというcomposerプラグインを利用する方法です。

- [hirak/prestissimo](https://github.com/hirak/prestissimo)

これは対策2のところで原因に記載した下記の問題を解消する為のプラグインのようです。

>composerがfile_get_contentsでjsonをダウンロードしていて、どうやらKeep-Aliveを使っていないし、並列ダウンロードもしていない

インストール方法に関しては [hirak/prestissimo](https://github.com/hirak/prestissimo) に記載してあります。

ちなみにこのプラグインも@Hiraku さんが作者のようです。
素晴らしいツールを作成して頂き、ありがとうございます。

## まとめ

対策1〜3を実施する事によってComposerを高速化する事が出来ました。
特に対策2, 3の効果は非常に大きいと感じています。
Composerの実行速度で悩んでいる方は試してみる事をオススメします。
[Unity] テキストの色をスクリプト上からRGBで指定する備忘録

開発中に送られてきたデザインに文字色指定がなくって仕方なくスポイト使ってRGB割り出したまでは良かったですが、、、
UnityでRGB指定するのって？？てなりました。
正確にはC#ですけども
そこで調べたらとってもわかりやすい記事があったので備忘録にと投稿

参考にさせていただいた記事↓
http://albatrus.com/main/unity/7741

#RGB指定する
スクリプト上で指定する場合はRGB各値を255fで割ってあげるといいらしいです。

```textColor.cs
   text.color = new Color(132f / 255f, 68f / 255f, 205f / 255f);
```
この一文覚えておけば怖いもの無し！ですね！
[python] if文の正しい使い方

こんにちは

pythonのプログラミングの初めての者です。
以下のコードで、確かif文のところがおかしと思います。

```py
import numpy as np

n_zero=int(input('Insert the amount of 0:  '))
n_one =int(input('Insert the amount of 1: '))
n_two =int(input('Insert the amount of 2: '))
n_three = int(input('Insert the amount of 3: '))

data = [0]*n_zero + [1]*n_one + [2]*n_two + [3]*n_three
if data==2n-1:
np.random.shuffle(data)
datastring = ''.join(map(str, data))

files = open('decode.txt', 'w')
files.write(datastring)
files.close()

print ("Data string is : %s " % datastring )

else:
print (error)
```

やりたいことはdataの長さを計算して、2n-1の長さの配列をプリントアウトしたいです。
よろしくお願いします.
Tensorflowをc++のcmakeしてるプロジェクトで使いたい

[tensorflow](https://www.tensorflow.org/)といえばpythonといったイメージを勝手に持ち続けていたが、c++も対応していることを知ったので使ってみることにした。

# さっそく環境づくり

とりあえず、tensorflowのビルドに必要なあたりを揃えていこう。
tensorflowは[bazel](https://bazel.build/)を使用してのビルドを推奨している。
よって、bazelのインストールから。

### bazelインストール

Arch linuxの人は、

```bash
$ yaourt -S bazel
```

他の方は、[公式](https://bazel.build/versions/master/docs/install.html#ubuntu)を参考に。

### GPU使いたい人は

[cuda](http://www.nvidia.co.jp/object/cuda-parallel-computing-platform-jp.html), [cuDNN](https://developer.nvidia.com/cudnn)を入れておきましょう。

```bash
$ sudo pacman -S cuda
$ sudo pacman -S cudnn
```

# tensorflow

ソースをgitから取ってくる

```bash
$ hub clone tensorflow/tensorflow
$ cd tensorflow
```

GPUを使うかなどの設定を行う

```bash
$ ./configure
```

指示に従って、自分の使いたいように指定しましょう。
自分はGPUのサポートだけ`y`で、他は`n`でしたね。
path等はご自分の環境に合わせましょう。

この後は、exampleを実行したいだけならbazelで指定してbuildするだけで良い。

今回は、他のプロジェクトで使用したいため共有ライブラリとヘッダたちを取ってくる。

### 共有ライブラリの生成

[BUILD](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/BUILD#L258-L266)を読むと、それらしきものが用意されてるので生成する。

GPUなし

```bash
$ bazel build -c opt --copt=-march=native tensorflow:libtensorflow.so
```

GPUあり

```bash
$ bazel build -c opt --config=cuda --copt=-march=native tensorflow:libtensorflow.so
```

成功すれば、libtensorflow_cc.soが`bazel-bin/tensorflow/`にできているはず。
これを`/usr/lib/`等にコピー

```bash
$ sudo cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/lib/tensorflow.so
```

### ヘッダファイルの抽出

Gistに[スクリプト](https://gist.github.com/saitodev/3cde48806a32272962899693700d9669#file-copy_tensorflow_headers-sh)をあげてる方がいたのでそれを使用した。
`HEADER_DIR`を`/usr/include/tensorflow`に変えて実行。

```bash
$ sudo sh copy_tensorflow_headers.sh
```



これで、ライブラリへのリンクと、ヘッダファイルのところへインクルードパスを設定すれば動作するが、cmakeを書きやすくする。

### FindTensorflow.cmakeの作成（任意）

このままだとcmakeでfind_packageしても見つからない。
そこで、[FindTensorflow.cmake](https://gist.github.com/Tacha-S/05a83e27fa6313402f0551f016085664)を作っておこうというだけ。
これを他の`FindFoo.cmake`がある場所におく。
例:
`cp FindTensorflow.cmake /usr/share/cmake-3.7/Modules/`

あとは、`CMakeLists.txt`のほうで

```cmake:CMakeLists.txt
find_package(Tensorflow REQUIRED)
include_directories(
  ${Tensorflow_INCLUDE_DIRS}
)
target_link_libraries(${PROJECT_NAME} ${Tensorflow_LIBRARIES})
```

のような感じで書いて終わり！
[Windows][telnet] Windowsで特定アドレスの指定ポートの疎通確認を行う

telnetで特定のポートの開放状態を確認する方法まとめ

# 実行方法

Windowsでは `telnet` で確認できる。
`telnet 192.168.1.1 80` のように、`telnet <ip adress> <port>` と指定する。
`Ctrl-C` 等で終了する。

```console:成功した場合
> telnet <ip adress> <port>
Trying <ip adress>...
Connected to <ip adress>.
```

```console:失敗した場合
> telnet <ip adress> <port>
Trying <ip adress>...
telnet: Unable to connect to remote host: Attempt to connect timed out without establishing a connection
```

# PowerShellで確認する方法

PowerShellでも確認できるらしい。

[telnetコマンドのないWindowsでのTCPポート確認 - Qiita](http://qiita.com/_norin_/items/8f534bd0531a960af5e9)

# 関連
[[Linux] sshの接続前に確認を行う(port番号を指定しての特定IPの疎通確認) - Qiita](http://qiita.com/koara-local/items/6df5f73126810d3d9589)

# 参考
[Tech TIPS：Windowsでポートのリッスン状態を調査する - ＠IT](http://www.atmarkit.co.jp/ait/articles/0307/12/news003.html)