OmniAICreator/Qiita-1.07M huggingface dataset:
パッケージ，モジュール，関数，インスタンス，クラス，メソッドの違い

「パッケージ」「モジュール」「関数」「クラス」「インスタンス」「メソッド」の用語をpythonの場合で整理します．

# モジュール
.pyのファイルを事を言います．
クラスが１つ以上含まれている必要があります．
例えば自分で`mydefs.py`というファイルを作った場合，それは自作「モジュール」です．

# パッケージ
異なる「モジュール」が複数集まって相互に関係しているコード群を「パッケージ」と言います．
注意事項としては，「\_\_init\_\_.py」というファイルを作らないとパッケージとして認識してもらえません．
[こちら](https://www.sejuku.net/blog/25587#i)のページが参考になりました．

#関数

例として，以下のmydefs.pyには2つの関数が書かれています．

```
def print_abc():
    print('abc')

def print_edf():
    print('edf')
```


print_abc()という関数を使う場合，インスタンスを生成して使います．

```
import mydefs as md
md.print_abc()
```

# クラス，インスタンス，メソッド

もし，mydefs.pyモジュールの中に「クラス」が書かれているとします．

(例)

```
class Mydefs(object):

    def print_abc(self):
        print('abc')

    def print_edf(self):
        print('edf')
```

上の例では，Mydefsという「クラス」が書かれています．
print_abc()「メソッド」を使う場合，「インスタンス」を作成して使用します．

具体的には，以下のようprint_abcメソッドを使います．

```
import mydefs #モジュールをimport
md = mydefs.Mydefs() : 「クラス」Mydefsから，「インスタンス」mdを作成
md.print_abc() : 「メソッド」を使う
```

ちなみに，「クラス」をインポートしようとして

```
import mydefs.Mydefs
```
とするのは上手く行きません．
import出来るのは，「パッケージ」・「モジュール」単位であって「クラス」を直接インポートするのは不可能です．


# モジュールのリロード

「モジュール」mydefs.pyを書き換えた時，Jupyter側で再importしても更新はされていません．私は`importlib.reload`を使って「パッケージ」がリロードするようにしています．

```
import importlib
importlib.reload(mydefs) #書き換えたmydefs.pyをリロード
```

以下のページがimportに関して詳しくまとめられており，参考になりました．
+ https://qiita.com/suzuki-hoge/items/f951d56290617df4279e

# 追記
shiracamus様からコメント頂きました．
ありがとうございました．
【メモ】JavaScriptの分割代入を利用してオブジェクトの一部を関数の引数にする

# JavaScriptの分割代入を利用してオブジェクトの一部を関数の引数にする
以下の様な場合のメモ。

```js

({hoge})=>{
// 何かの処理
}
```

## 分割代入自体の学習
以下等で学習するとわかりやすい。

[ECMAScript 2015 の分割代入は奥が深かった - Qiita](https://qiita.com/amamamaou/items/1ec21316b8bf05ba9c34#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)

[ES2015で拡張されたObjectの記法と分割代入を活用する - Qiita](https://qiita.com/syumai/items/b8d0a752740a31402477#%E5%88%86%E5%89%B2%E4%BB%A3%E5%85%A5)

## JavaScriptの分割代入を利用してオブジェクトの一部を関数の引数にするサンプル

[ES2015で拡張されたObjectの記法と分割代入を活用する - Qiita](https://qiita.com/syumai/items/b8d0a752740a31402477#%E9%96%A2%E6%95%B0%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%A7%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0)を非常に参考にさせていただいている。

### サンプル実装

```js

// person objectの定義
const person = {
    name: 'hoge',
    age: 25
};

// person objectの中のage propertyをshow関数の仮引数にセッティング
let show = ({age}) => alert(age);

// person objectを実引数にセッティング
show(person);
```

### 処理の内容
上記のサンプル実装では、以下の様になっている。
1. personのobjectを定義する
2. show関数で分割代入を利用し、person objectのage propertyを関数の仮引数として利用している
3. show関数を呼び出す際には、person objectを実引数に呼び出す
4. 呼び出されたshow関数は、person objectのageのみを引数で受け取っているので、ageのみを関数内で使用する

## 参考にさせていただいたURL
[ECMAScript 2015 の分割代入は奥が深かった - Qiita](https://qiita.com/amamamaou/items/1ec21316b8bf05ba9c34#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)

[ES2015で拡張されたObjectの記法と分割代入を活用する - Qiita](https://qiita.com/syumai/items/b8d0a752740a31402477#%E5%88%86%E5%89%B2%E4%BB%A3%E5%85%A5)
WindowsでFTPサーバー構築

##はじめに
今回は、Windows10においてSSLなしのFTPサーバーの構築手順を紹介します。

## 環境
Windows10 Pro

## 手順
### FTPサーバー機能有効化
Windows10は標準でFTPサーバー機能を備えていますが、デフォルトでは無効になっています。したがって、まずは有効化します。
コントロールパネル　→　プログラム　→　Windowsの機能の有効化または無効化
![valid-ftp-server.png](https://qiita-image-store.s3.amazonaws.com/0/290840/a6e10c7a-1389-18e9-54f4-e73f3631e7ca.png)

### FTPユーザー作成
コントロールパネル　→　システムとセキュリティ　→　管理ツール　→　コンピューターの管理
「ユーザー」→「新しいユーザー（M）」

「ユーザー名（U）」、「パスワード（P）」、「パスワードの確認入力（C）」を入力
「ユーザーは次回ログオン時にパスワードの変更が必要（M）」のチェックを外し作成
![2018-10-24_13h30_19.png](https://qiita-image-store.s3.amazonaws.com/0/290840/c2e536d6-0a78-57b1-e07d-001689a37e6d.png)

### FTPサイトの作成
#### FTPサイトの追加
コントロールパネル　→　システムとセキュリティ　→　管理ツール　→　コンピューターの管理
「インターネット インフォメーション サービス(IIS)マネージャー」　→　「サイト」　選択
「FTPサイトの追加...」
![2018-10-24_13h49_58.png](https://qiita-image-store.s3.amazonaws.com/0/290840/6565d2a2-18af-c7b8-30d8-863a92e84d60.png)

#### サイト情報入力
FTPサイト名　→　任意
コンテンツディレクトリ　→　FTP接続先のディレクトリを指定
![2018-10-24_14h06_00.png](https://qiita-image-store.s3.amazonaws.com/0/290840/37da68a0-cf99-9b5b-b72f-b51a0d626141.png)

#### バインドとSSLの設定
「無し（L）」にチェック
![2018-10-24_14h11_35.png](https://qiita-image-store.s3.amazonaws.com/0/290840/ac466d2b-0810-f4a6-f59e-f1fb5bc2b4ea.png)

#### 認証および承認の情報
認証
「基本（B）」にチェック
承認
「アクセスの許可（C）を
「指定されたユーザー」を選択し、上記で作成したユーザー名を入力
![2018-10-24_14h13_17.png](https://qiita-image-store.s3.amazonaws.com/0/290840/ac7d567e-6bc9-9740-966f-6ef2caf6697e.png)

### ファイアウォール設定
外部からFTPでアクセスできるようにファイヤーウォールウォールを設定します。
「FTPサーバー」のプライベートとパブリックにチェックを入れます。
![2018-10-24_14h28_47.png](https://qiita-image-store.s3.amazonaws.com/0/290840/e1b06dc2-88fb-a873-baa3-30c1d9219670.png)

### ディレクトリ共有設定
エクスプローラーを起動して、FTPで共有したいディレクトリを選択します。
そのディレクトリを選択状態で右クリックします。
「アクセスを許可する（G）」→「特定のユーザー...」と選びます。
共有するユーザー（上記で追加したユーザー）をプルダウンから選択し、「追加（A）」を押します。
アクセス許可のレベルを「読み取り／書き込み」にしましょう。そして、「共有（H）」で共有します。
![2018-10-24_16h19_51.png](https://qiita-image-store.s3.amazonaws.com/0/290840/c214eda8-25e3-0b7e-cc21-0d29e9436526.png)

### FTPタイムアウト設定
こちらは好み？でいいですが、すぐにFTPでいろいろするにあたってすぐにタイムアウトすると困るので、タイムアウト設定を変更します。
「コントロールパネル」→「システムとセキュリティ」→「管理ツール」→「インターネット インフォメーション サービス(IIS)マネージャー」と進みます。
接続（左カラム）から先ほど作成したFTPサイトを選択します。そして、操作（右カラム）の「詳細設定...」をクリックします。その中の「接続」→「コントロールチャネルのタイムアウト」がデフォルト120(秒)になっていると思いますので、お好みで数値を入力します。数値を変更したら操作（右カラム）の「FTPサイトの管理」の「再起動」でFTPサーバーの再起動を行いましょう。
TypeScript+VSCode拡張機能開発入門

AtomやSublimeTextを使っていましたが，最近VSCodeの良さに気づき始めて完全に虜になりましたw
なので，TypeScriptの勉強も兼ねてVSCodeの拡張機能でも作ってみようと思いました

# 環境
* windows10 Pro(Macは試してませんが，多分同じような感じになるはず・・・)

# 環境構築
## Node.jsのインストール
TypeScriptをインストールするために，Node.jsがいるのでまずはこれをインストールします
Node.jsのインストーラは[公式サイト](https://nodejs.org/ja/)から入手できるます
投稿時点では推奨版と最新版がありますが，推奨版の8.12.0をダウンロードしてインストールします
インストールが成功したか確認するには，コマンドラインで以下を入力します

```sh
$ node -v
```

問題なければバージョン番号が表示されます

###npmの確認
Node.jsをインストールすると，一緒に`npm`というパッケージ管理ツールが同梱されているので，これも動作するか確認しておきます
↓をコマンドラインに入力したら，バージョンが表示されます

```sh
$ npm -v
```

## TypeScriptのインストール
本題のTypeScriptをインストールするには以下のコマンドを実行します

```sh
npm install -g typescript
```

インストールが成功したかどうかは以下を入力してバージョンが表示されれば(ry

```sh
tsc -v
```

# Hello World!(TypeScript版)
これでTypeScriptでプログラミングができるようになったので，`Hello World!`を表示する儀式を行います
適当なディレクトリに以下の内容のファイルを保存します

```typescript:HelloWorld.ts
var message: string = "Hello World!"
console.log(message)
```

保存ができたらコマンドラインからコンパイルします

```sh
tsc HelloWorld.ts
```

コンパイルが成功すると，`HelloWorld.js`が生成されてると思います
これが実際の実行ファイルになりますが，これを実行するにはコマンドラインで以下を入力します

```sh
node HelloWorld.js
```

`Hello World!`が表示されれば，儀式完了です

# VSCodeのインストール
2つ目の本題，VSCode(Visual Studio Code)をインストールします
インストーラは[公式サイト](https://code.visualstudio.com/)から配布されているので，これをダウンロードしてインストーラを実行，インストールします
インストールの設定でパスを通したり，右クリックでVSCodeで開ける様にしたりできるので，そのあたりはお好みで設定したりしなかったりしましょう

## 拡張機能のインストール
これから拡張機能の開発を行うので，必要最低限の拡張機能をインストールします
正方形や長方形が重なった様なアイコンをクリックします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56006/a119dba5-f2eb-9b50-89c3-d83b6a562fe3.png)
~~私はいろいろ拡張機能をぶち込んでますが，~~拡張機能の開発をするにはTSLintが必須なので，これだけインストールします
Marketplace で拡張機能を検索するの入力欄にTSLintが表示されるので，インストールします
SSにある他の拡張機能や便利な拡張機能はQiitaやGoogle先生に聞けば，どの記事を見ればいいか悩むくらい沢山出てくるので，一番参考になった[VSCodeのオススメ拡張機能 24選 (とTipsを少し)](https://qiita.com/sensuikan1973/items/74cf5383c02dbcd82234)をおすすめします

# Hello World!(VSCode拡張機能開発版)
ここまで来たら，VSCodeの拡張機能開発ができると思うので，例によってHello World!を表示する儀式を行います
拡張機能を開発する専用のファイルを用意しておきます
親切なことに，[公式サイト(英語)](https://code.visualstudio.com/docs/extensions/example-hello-world)に儀式の手順があるので，それに則っります
新規Projectのベストプラクティスとツールを作ってくれるyoとVSCodeの拡張機能の開発テンプレをジェネレートしてくれるgenerator-codeをインストールします

```sh
npm install -g yo generator-code
```

インストールしたら，以下を実行して拡張機能のテンプレを作りましょう

```sh
yo code
```

すると以下のようにコマンドラインが表示されると思うので，今回は`New Extension (TypeScript)`を選択します
![generator.png](https://code.visualstudio.com/assets/docs/extensions/example-hello-world/generator.png)
このあともいろいろ聞かれる(拡張機能名や作者などなど)ので，このあたりは自由に好きなように入力しましょう
しばらく待っているとコマンドラインを実行したフォルダにいろんなファイルが生成されてると思います
この生成されたディレクトリをVSCodeで開きます
開いたら，F5を押します
開くと新しいVSCodeのウィンドウが表示されるので，`Ctrl+Shift+P`でコマンドパレットを表示して，そこに`Hello World`を入力して実行します
すると，右下から通知が出てきて`Hello World`と出てきたら儀式成功です!

# 最後に
これでTypeScriptが使えるし，VSCodeの拡張機能開発ができる環境になりました
思い思いの拡張機能を開発して，より便利なVSCodeにしていきましょう!
Web Evernote になんとかログインする

# Summary

Web Evernoteにログインできない

## 原因

携帯を最近かえた

２段階認証を設定していて登録している携帯番号が以前の携帯番号だった

携帯のメール（SMS）が着信できない

バックアップコードを控えていなかった

## こんな感じ

web evernote のログイン画面にいく, IDを入力

![Screen Shot 2018-10-27 at 13.46.50.png](https://qiita-image-store.s3.amazonaws.com/0/149269/662baf3b-a401-bc18-491d-58fcfe6b7adc.png)

パスワードを入力

![Screen Shot 2018-10-27 at 13.47.05.png](https://qiita-image-store.s3.amazonaws.com/0/149269/c9c02cb2-1d7c-10ea-979c-bf50b8be92a3.png)

２段階認証でのSNSパスフレーズの入力画面になる（確認番号を受け取れないので`I need help getting a verification code`を押す）

![Screen Shot 2018-10-27 at 13.47.14.png](https://qiita-image-store.s3.amazonaws.com/0/149269/72d60230-9b12-24c1-7c11-d2475a5b8309.png)

他の選択肢がでるけどどうにもできない（ヘルプでメールを送るもよくわかんない日本語のメールがきたよ。。。）

![Screen Shot 2018-10-27 at 13.47.29.png](https://qiita-image-store.s3.amazonaws.com/0/149269/d8c490d2-072a-1434-c2e5-bde5c85a5cef.png)

## ログインする他の方法

```
グーグルIDでログインする
```

### 前提条件

パソコンのevernoteにログインしていること

### こんな感じで設定

パソコンのevernoteを起動

![Screen Shot 2018-10-27 at 13.22.17.png](https://qiita-image-store.s3.amazonaws.com/0/149269/5c23b73f-2999-6568-741b-f9bceb77f353.png)

`Account Info` を選択

![Screen Shot 2018-10-27 at 13.22.30.png](https://qiita-image-store.s3.amazonaws.com/0/149269/abcc7439-4b3a-4fc0-2bba-11a27a7b245c.png)

`Manage Connected Servises`をクリック

![Screen Shot 2018-10-27 at 13.22.45.png](https://qiita-image-store.s3.amazonaws.com/0/149269/8fc8c0b6-8b62-89d2-68bc-c2d8bdffa544.png)

`Sign in with Google`のトグルボタン（というのかな？）を右にする

![Screen Shot 2018-10-27 at 13.23.49.png](https://qiita-image-store.s3.amazonaws.com/0/149269/ea699fd6-59c2-e7c0-6a50-266d1039c53e.png)

右上の `Go to notes` ボタンを押すと無事に web evernote に入れるぽよ
homebrew経由でインストールしたpybind11をcmakeで使う

# はじめに

pybind11をgit cloneやpipでインストールした場合のCMakeで使う例は結構見つかるものの、homebrewを使ってインストールした場合の使い方(CMakeLists.txtの書き方)の例が見つからなかったのでメモ。

# 前提

試した環境は以下。

- macOS High Sierra 10.13.6
- Python 3.7.0 (homebrewでインストール済み)
- CMake 3.12.3 (homebrewでインストール済み)

# pybind11のインストール

```shell
$ brew install pybind11
```

2018/10/27時点で2.2.4がインストールされました。

# 使用例

C++ソースやコンパイルの仕方、作成したモジュールのPythonからの使い方は、[pybind11でC++の関数をpythonから使う](https://qiita.com/ignis_fatuus/items/c7523c0fe2bc2f415d50)の内容そのものですので、そちらをご参照ください。


## CMakeLists.txt

今回メモしておきたかった内容はここ。

find_packageでpybind11を指定した上で、pybind11_add_moduleを使うだけ。
極めてシンプルです。

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.0)

project(cppmod)
find_package(pybind11)

pybind11_add_module(cppmod SHARED cppmod.cpp)
```

# 参考
[pybind11でC++の関数をpythonから使う](https://qiita.com/ignis_fatuus/items/c7523c0fe2bc2f415d50)
【Xcode】UISearchBarの背景色（背景画像）を消す方法

## SearchBarの背景色を透過にしたい

UISearchBarには、デフォルトでこちら↓のような背景色がついています。

<img width="376" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/976d53a7-3c73-def8-f729-fead10850f68.png">


この背景色を消したくてネットで検索すると、なぜかsubViewを探してむりやり背景を削除するような方法しか見つかりませんでした。その方法でも対応できますが、Viewの構造が変わったときに困ってしまいます。

というわけで、あれこれ調べたり試したりして、ようやく解決方法を見つけたので紹介します。

## 色の変更では対応できない

まず、パッと目についたのはBackground Colorでした。

<img width="259" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/0248ad97-079b-4d34-3c36-6dc5943fb851.png">


いかにもいけそうな感じの名前ですが、残念ながらダメでした。

つぎに、見つけたのはBar Tintです。

<img width="261" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/0f7cbee0-29f3-a90c-8f24-fc3cd64b23cd.png">

もしかしてこれか！　と食いついてみたものの、結果はこちら↓の通りです。

<img width="377" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/be13f222-dc76-a558-2c74-d6ee95030b97.png">

なにこの枠線……思ってたんとチガウ。

## 色ではなくて画像なのかも？

もう無理か、とあきらめかかけたとき、ふと思いつきの天使が舞い降りてきました。

<img width="376" alt="005.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/a2e0fb35-d9a5-b451-1558-a5db020c35c9.png">

そういえば、SearchBarってこんな風↑に背景画像を設定できるよね。ハッ！　もしかして、あの灰色は背景色ではなくて、背景画像なのでは！？

というわけで、試してみました。

## 背景画像を消してみた

UISearchBarの[backgroundImageプロパティ](https://developer.apple.com/documentation/uikit/uisearchbar/1624276-backgroundimage)はoptionalなのでnilを入れてみました。

```Swift
  searchBar.backgroundImage = nil
```

<img width="375" alt="006.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/df08fc02-b84e-04c4-cef3-b3525a66557c.png">

結果はこちら↑です。

あれ？　変わってない。もしかして、違ったのかな……。あきらめかけたそのとき、もうひとり思いつきの天使が舞い降りてきました。

「nilがダメなら、オブジェクトを入れたらいいじゃない。」

試してみました。

```Swift
  searchBar.backgroundImage = UIImage()
```

<img width="377" alt="007.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/e4253cb9-4d8a-e388-f3ae-38a2cbefedd4.png">

結果はこちら↑です。

やったー、見事に背景色が消えています。枠線も消えました。

それにしても、まさか背景色ではなくて背景画像だったなんて……。色を消したいという思い込みが推理の邪魔をしてしまったようです。

ともあれ、無事に解決してよかったです。UISearchBarの背景色を消したいときに、ご参考になれば幸いです。
LinuxMintをインストールしてはじめにしたこと

# HDDが壊れました
メインで使っているPC。HDDが壊れて起動しなくなってしまった。/homeパーティションを分けていたのでデータのバックアップは行えた。今更HDDを買うのもなんだなーと思ったのでSSDを購入してLinuxMint19MATEをインストールした。
せっかく新しくOSをインストールするので、インストール後にやったことを書いておく。

## パーティション分け
パーティションは以下のようにわけた。/が約90Gあれば足りるでしょう。
/home以下にはvmイメージが置かれるので多めに取った。

```
hoge@mint:~$ sudo fdisk /dev/sda

fdisk (util-linux 2.31.1) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): p
ディスク /dev/sda: 465.8 GiB, 500107862016 バイト, 976773168 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xc56c42b2

デバイス   起動  開始位置  最後から    セクタ サイズ Id タイプ
/dev/sda1  *         2048    976895    974848   476M 83 Linux
/dev/sda2          976896   8976383   7999488   3.8G 82 Linux スワップ / Solaris
/dev/sda3         8976384 790226943 781250560 372.5G 83 Linux
/dev/sda4       790226944 976771071 186544128    89G 83 Linux

コマンド (m でヘルプ): 
```

## LinuxMintのインストール後にやったこと
* アップデートマネージャでパッケージをアップデート
* Chromiumとchromium-browser-l10nのインストール
* Sylpeedのインストールとメール送受信設定
* VirtualBoxのインストール
* Filezillaのインストール

このうち、LinuxMintの「ソフトウェアの管理」アプリでインストールできなかった
"chromium-browser-l10n"のインストール方法はコマンドラインで以下のように実施した。
"chromium-browser-l10n"をインストールすると、Chromiumが日本語化される。

```
hoge@mint:~$ sudo apt-get install chromium-browser-l10n
```

また、Chromiumをメインのブラウザにするために、Mintメニューから
"menu"-"設定"-"お気に入りのアプリ"-"Webブラウザー"-"Chromiumウェブ・ブラウザ"を選択する。

とりあえずここまでで、普通にWebとメールが使えるようになった。
【蛇足】レプリケーションでバックアップ

## この記事について
[pgpool-IIの使い方を考える](https://qiita.com/sankaku/items/94f2b6421f100e5f48f7)のサブページです。

## 概要

PostgreSQLのレプリケーション関連パラメータを見ていたらslaveサーバのwal適用を遅らせる「recovery_min_apply_delay」なるものがありました。

https://www.postgresql.jp/document/10/html/standby-settings.html

これ使えばバックアップ処理作らなくてもレプリケーションをバックアップとして使えるのではないか～と思っていたところ。

https://www.sraoss.co.jp/technology/postgresql/images/20140808_PostgreSQL9.4_report_sraoss.pdf

SRAが言及している資料を見つけました。（P16）

これはもうバックアップとして使用しても良いっていうことですよね。

## 設定してみる

「recovery.conf」に以下を追記します。

```:recovery.conf追記
recovery_min_apply_delay = '24d'
```

24日以上経過したwalを適用する設定です。

設定できる値はミリ秒でinteger型指定なので、最大 2147483647 ミリ秒です。
2147483647を指定できること、2147483648を指定して起動エラーになることが確認できました。

日数指定「d」だと24日が限界です。25日 '25d' で起動エラーとなります。
時間指定「h」なら上限は596時間です。

私が関わってきたシステムだと3日程度戻ることしか考えてなかったので、最大23日前まで戻れるのであればバックアップとして十分に使えそうです。
matplotlib.animationを利用してgif画像を作る (ArtistAnimation)

matplotlibはデータ解析の可視化ツールとして一般的に用いられています．

今回は，matplotlib.animation機能を使ってgif画像を作ってみたので，そのコードを紹介します．
最終的には，以下のgifアニメーションを作りたいとします．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/186664/c87e2521-af92-0958-2081-632fbcb48351.gif)

matplotlib.animationには，「ArtistAnimation」機能「FuncAnimation」機能があります．
今回は「ArtistAnimation」機能で話を進めます．
「FuncAnimation」機能については，こちらのページでまとめています．
[matplotlib.animationを利用してgif画像を作る (FuncAnimation)](https://qiita.com/chopprin/items/d4f2e3e04b220ecddd53)

なお，こちらのページも参考にしています．
+ [Animation using matplotlib with subplots and ArtistAnimation
](https://stackoverflow.com/questions/17853680/animation-using-matplotlib-with-subplots-and-artistanimation?newreg=9b180d75e968486dac402b115fc51774)

# 動作環境

* Ubuntu
* Anaconda3(Python3.6.6)
* anaconda


# Subplot機能を用いずにgif画像を生成

ArtistAnimationの考え方は，用意したリストに画像をappendして，繋ぎ合わせる事で連続画像(gif)にします．以下のgifアニメーションを作りたいとします．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/186664/aa639be6-c8ed-689e-0c36-0753e5066369.gif)


コードは以下の通りです．

```py

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure() #figure objectを取得．
ax = fig.add_subplot(111)

x = np.arange(0,10,1)

ims = [] #Line2D objectを入れるリストを用意
for time in range(x.shape[0]):
    im = ax.plot(x[0:time] ,x[0:time] ** 2) #Line2D objectを取得
    ims.append(im) #imsにappendする

#ArtistAnimation機能で，imsの中の画像を繋ぎ合わせる．
ani = animation.ArtistAnimation(fig, ims, interval = 100)

#imagemagickを使って，gif画像を保存
ani.save("test.gif", writer="imagemagick")

```

figure objectと，Line2D objectが入ったリストを用意すれば，簡単に作れます．
なお，intervalは画像の表示間隔を調整するargumentです．


#subplot機能と組み合わせて使う．

さて，本題です．
次は2つの画像をsubplotで表示して，gifアニメーションを作成します．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/186664/c018d67a-21e1-721d-f8b7-bf42ac43cfbd.gif)

```py

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, (ax1, ax2) = plt.subplots(2,1)

x = np.arange(0,10,1)

ims = []
for time in range(x.shape[0]):
    #im1の後ろに「,」を付けること
    im1, = ax1.plot(x[0:time], x[0:time] ** 2, color = 'forestgreen' )
    #im2の後ろに「,」を付けること
    im2, = ax2.plot(x[0:time], -x[0:time] ** 2 + 100, color = 'darkred' )
    #[im1,im2] というリストをimsにappendする事．
    ims.append([im1, im2])
    
ani = animation.ArtistAnimation(fig, ims, interval=500)
ani.save("test.gif", writer="imagemagick")
```

注意点として，im,やim2,のように「,」を付けるのを忘れないようにしましょう．

# まとめ
animation機能を使えば，計算過程を可視化出来たるすると思います．
相手にも伝わりやすくなるかもしれません．
フォーム作成と確認画面での未入力チェック

今日は、簡単なフォームを作成し、確認画面に値を渡した段階で

入力チェックが行われるようなプログラムを作りました。

PHP側のプログラムを見ていただければわかるかと思いますが

if文を使って未入力チェックを書いています。

意図した動作通りになるかどうかの検証も行いました。

自分の意図したとおりになったので記事を書こうと

思いました。
```
<form action =Oct27.php method="POST">
<p><input type="text" name="handle"></p>
<p><input type="text" name="address"></p>
<p><textarea type="text" name="contact" placeholder="用件入力欄"></textarea></p>
<p><input type="submit" value="送信"></p>
</form>
```

```PHP
<?php
$data1 = htmlspecialchars($_POST['handle'],ENT_QUOTES,'UTF-8');
$data2 = htmlspecialchars($_POST['address'],ENT_QUOTES,'UTF-8');
$data3 = nl2br(htmlspecialchars($_POST['contact'],ENT_QUOTES,'UTF-8'));
echo '<p>お名前:</p>';
if($data1 == ''){
echo "名前が入力されていません";
}

echo $data1.'<br>';
echo '<p>住所:</p>';
if($data2 == ''){
echo "住所が入力されていません";
}
echo $data2.'<br>';
echo '<p>住所:</p>';
if($data3 == ''){
echo "用件が入力されていません";
}
echo $data3.'<br>';
```

もっとほかにもいい書き方があるかもしれませんので

思いついたらまた共有したいと思います。
Rdkitで実装できる Avalon FingerPrintってなんだろう？ 

#はじめに
今回の記事は内容に対する稚拙な推測が入り混ざってます。また、駆け出しの戯言でもあります。

#Avalon FingerPrintってなんだろう？

Rdkitでは、様々なフィンガープリントが実装でき、解説も多くネットであるが、中でもAvalon FingerPrintは元論文が有料（お金を払って読む価値があるか怪しい）なせいで詳細がわからない.....
元論文（https://www.ncbi.nlm.nih.gov/pubmed/16995723）はこちら。


ネットで調査すると、、、
>Avalon fingerprint is a Novartis AG in-house format, which 
>encodes atoms (both augmented atoms as well as atom triplets)
（アヴァロンFPは(スイス製薬メーカー)ノバルティスAGのフォーマットであり、原子を解読する。）

また、
>Avalon fingerprint(hashed,graph‐basedfingerprints)

と表記された論文もありました。
また、実装はRdkitで難しくないため、使った感想は、
・defaultのBit数が128
・MACCS FPよりも良い印象
です。

実装は

```
from rdkit.Avalon.pyAvalonTools import GetAvalonFP
fp = GetAvalonFP(mol)
```

を前回記事（https://qiita.com/muuu4649/items/7ef341f57bbea3988517）

に挿入するだけです。

#どんな特徴を抽出しているのだろう？
ノバルティスAGが出していたケミカルツールキットに入ってたらしいこのフィンガープリントは現在、DLはできるものの公式HPは閉じていた。しかし、ノバルティスAGが出していた過去資料を発見した。


![スクリーンショット 2018-10-27 7.51.10.png](https://qiita-image-store.s3.amazonaws.com/0/259500/9c8dbcd7-c39f-5fa2-471b-57cfd08edaff.png)
図１ー参考
https://www.rdkit.org/UGM/2012/Landrum_RDKit_UGM.Fingerprints.Final.pptx.pdf

これを見るとC-C結合以外に結合しているHの数やその経路、環構造パターン、あるルールでの環の長さなどを取得してFingerprintを算出しているようです。

細かいところまで見ようとして（https://github.com/rdkit/rdkit-orig/blob/master/External/AvalonTools/Wrap/pyAvalonTools.cpp）
を見ていましたが、わからなくなりました。。。難しい。。 

以上、また何かわかれば、追加修正します。
CGエンジニア検定の勉強とShaderLabの理解

CGエンジニア検定の勉強に伴って，「コンピュータグラフィックス」という教科書を読み始めているため，学習したことをUnityや現在勉強中のシェーダ言語と結び付けてまとめてみようと思います。

UnityのShaderLab言語の理解と，CGエンジニア検定の対策を兼ねることを目的としています。

#Shaderの基本的な構造
```
struct appdata
(
float4 vertex : POSITION;
)
struct v2f
(
float4 vertex : SV_POSITION;
)
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return 0;
}
```
これが頂点シェーダ部分の基本的構造になっています。
POSITION,SV_POSITIONなどはセマンティクスと呼ばれ，プログラム内では変数名は自由に設定できますが，その変数がレンダリングパイプラインにおいてどの役割をするかはコンパイラは理解することができません。
そこで，これはこういう役割ですよ！と
　変数　=  "ある役割"　
であることを明示するために書くもののことがセマンティクスとなります。これは適宜覚える必要があります。

#UnityObjectToClipPos()とは
上記のコードの

```
o.vertex = UnityObjectToClipPos(v.vertex);
```
のなかのUnityObjectToClipPos関数について解説します。以下はCGエンジニア検定にて出題される可能性のある内容です。
v.vertexとして関数の中に入力される変数は3次元空間の頂点情報で，
（float4なので4変数関数です。）
これをこの関数に入れることで，カメラが映す3次元空間に射影変換します。

#モデルビュー行列とは
3次元空間にある情報をすべてカメラの2次元空間への情報へと変換しようとすると，変換させる情報量が多すぎるので，実際はビューボリュームという制限された範囲の3次元空間の情報に限定して，それを2次元に変換して描画するという方法がとられます。
Unity Shader Programming Vol.01では
>UnityObjectToClipPos関数は，座標 * モデルビュー行列　* 射影行列　に等しいです。

とありますが，ここでの 座標　* モデルビュー行列（モデリング変換とビューイング変換）　によって，描画範囲を限定して，空間をz軸で180度回転させる変換を行う。（「コンピュータグラフィックス」Chapter2-4-1）


#射影変換・投影変換・ビューポート変換
（射影変換は3次元アフィン変換とは違うことに注意）
射影変換と書いていますが，基本的には投影変換とよばれる変換が行われます。（投影変換は射影変換のひとつです）

投影変換では正規化ビューボリュームとよばれる[-1,1] * [-1,1] * [0,1]の3次元空間に変換されます。この変換で得られる奥行きの情報(深度情報？）が陰面消去などに用いられます。

#正規化ビューボリュームの求め方
```math
\left(\begin{matrix}
x'\\
y'\\
z'\\
w'
\end{matrix}
\right)=
\left(\begin{matrix}
1&0&0&0\\
0& 1 & 0 & 0\\
0 & 0 & \frac{1}{1 - z'_{min}} & - \frac{z'_{min}}{1 - z'_{min}}\\
0 & 0 & 1 & 0
\end{matrix}
\right)\times
\left(\begin{matrix}
x\\y\\z\\1
\end{matrix}
\right)
```
ただし

```math
z'_{min} \equiv \frac{z_{min}}{z_{max}}
```
と，教科書には書いてあるのですが！(33)(34)の項がなぜそうなるの？とよくわからないままでしたが，以下のように求めればいいことがわかりました。

```math
\left(\begin{matrix}
x'\\
y'\\
z'\\
w'
\end{matrix}
\right)=
\left(\begin{matrix}
1&0&0&0\\
0& 1 & 0 & 0\\
0 & 0 & \alpha & \beta \\
0 & 0 & 1 & 0
\end{matrix}
\right)\times
\left(\begin{matrix}
x\\y\\z\\1
\end{matrix}
\right)
```
のようにして，α，βをおき，

```math
\frac{x'}{w'} = \frac{x}{z}\\
\frac{y'}{w'} = \frac{y}{z}

```
をみたすように，この2元連立方程式を2つの未知数に対してとけば，うえのように求めることができるというわけです。~~詳しく計算してないです...()~~

<b>UnityObjectToClipPos関数ではここまでの投影変換までを行って，カメラのウィンドウの座標に受け渡して，Fragment関数へ渡せるように変換している？(と捉えています。）
ここでのo.vertexは，投影変換後の正規化された3次元空間の座標を表していると考えているのですが，実際の変換コードを調べたほうがはやそう...



#ビューポート変換
念のため説明します。ここまでの投影変換による投影座標系では，[-1,1] * [-1,1]の範囲が画面に表示されるウィンドウに該当します。これを，実際に表示される1024*1024などの画面の範囲内に切り取って表示する変換をビューポート変換といいます。


#Shaderでの利用での利点
v2f vert()のところで変換されたo.vertexは3次元空間で正規化された座標なので，そのままそれぞれ[0,1]の範囲のSV_TARGETとして返すことができるので，利用しやすい？


#疑問
- 4成分目のwの役割は変換における定数項の表現のための便宜的なものなのか
- クリッピングの方法の詳細



###参考
- Unity Shader Programming Vol.01
- Unity シェーダープログラミングの教科書　~ShaderLab言語解説編~ 
- http://www.az.cs.is.nagoya-u.ac.jp/class/comp-sys/cg_chap_5.pdf
- https://qiita.com/edo_m18/items/946df01d58b8cd3143d4
LISTENできるポートをサーバ側で完全に制限できるsshリバースフォワーディングをnetcatで実現する（できませんでした！！！）

グローバルIPアドレスを持っていないRaspberryPiに外部からsshしたいときなどに大活躍の`ssh -R`ですが、サーバ側の一存でLISTENするポートを鍵ごとに制限する方法がopensshの本家には存在せず、[SSH Reverse Port Forwarding で鍵ごとにlistenできるポートを制限する](https://qiita.com/miminashi/items/ad92d51133b0c50219d0)で紹介したパッチをあてて、`permitremoteopen`を使うと鍵ごとにbindできるポートを制限することは可能なのですが、これの話をしているのは世界中で作者と自分くらいなのでは？本家にマージされる可能性は限りなくゼロに近いので、他の方法を考えてみようと思います。

最初に思いついたのは1クライアントごとにコンテナでsshdを起動することなのですが、sshd + 1セッションで12MBくらいメモリを消費していたのでやめました。

次に、`nc`(netcat)を`ssh -R`のかわりにする方法を考えてみました。

サーバ上でncを実行し2222番でLISTENして、sshの標準入出力を通信路に使って、クライアント側で起動したncでクライアント側で起動しているsshd（22番）にアクセスします。
パイプだけだとデータの流れが一方通行なので、fifoを使ってクライアント側のncの標準出力をsshクライアントの標準入力に渡してやります。

```shell-session:クライアント側のコマンド
client$ cat fifo | (ssh user@ssh-server nc -l 2222) | nc localhost 22 > fifo
```

まるで自らの尾を喰らい続けるウロボロスのようですね。
![Ouroboros.png](https://qiita-image-store.s3.amazonaws.com/0/26038/ee6c5f98-edf0-0c38-bf7a-e4a1bb3d8c76.png)

念の為, ncがちゃんとLISTENしているかどうか確認してみます。

```shell-session:サーバ側でncがLISTENしているかどうか確かめる
server$ sudo sockstat |grep 2222
user nc        32658 3  tcp4   *:2222                *:*
```

クライアントへのsshは, 普通に`ssh -R`したときと一緒です。

```sh:サーバ側からクライアント側にsshする
server$ ssh user@localhost -p 2222
```

ここまでうまくいっていれば、あとは`.ssh/authorized_keys`の`command=`に`nc -l 2222`を設定しておけば、リバースフォワーディングのクライアントがどのポートでLISTENするのかをサーバ側の一存で決められるようになります。（なるはず。まだ試してない）

で、重要なことに気づいたんですが、`nc`を使っていると1セッションしかsshできない・・・
これではちょっと使い物にならない（シェルログインしながらscpとかしたいやん！）ので、別の方法を考えることにします・・・
Visual Studio for macでわからないこと

Visual Studio for macを導入した。

gccとllvmとvc++とのコンパイルエラー・警告等を比較したいため。

導入は完了し、visual studioのsolution をコンパイルしてみた。

1. エラーがどこに出るかがわかっていない。
2. Windows用,mac os用、Linux用にコンパイルできるかわかっていない
3. Windows版との違いがわかっていない。

VisualStudio for Mac やってみた
https://qiita.com/Ntdoy/items/c1f59a0d0d8607eb4f91

Visual Studio for Macがアップデートできなかったお話
https://qiita.com/tomopy03/items/8995ad5621cb39ff7439

Visual Studio for Macのインストール時に接続エラーとなる場合の対処
https://qiita.com/Jinshichi/items/24c1546140eb977d828a

#文書履歴
ver. 0.10 初稿 20181027
Androidのpicker dialog自定義

![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.amazonaws.com/0/296847/aa5b9095-f36a-92d4-d1a2-e8cd3a55476c.gif)


#取り込み方法

### 1,クラスのxmlファイルを自分のプロジェクトに入れる

* numberPicker一つの場合は、OneNumberPicker.java とone_number_picker.xml
* numberPicker二つの場合は、TwoNumberPicker.java とtwo_number_picker.xml

###２、呼び出し側のコードを真似する

        String title = "身長";
        final String unit1 = ".";
        String [] contents1 = {"170","171","172","173","174","175","176","177"};
        int defaultValue1 = 3;
        final String unit2 = "cm";
        String [] contents2 = {"0","1","2","3","4","5","6","7","8","9"};
        int defaultValue2 = 0;
        TwoNumberPicker twoNumberPicker = new TwoNumberPicker(this);
        twoNumberPicker.setTitle(title);
        twoNumberPicker.setNumberPickerLeft(unit1,contents1,defaultValue1);
        twoNumberPicker.setNumberPickerRight(unit2,contents2,defaultValue2);
        twoNumberPicker.setCallback(new TwoNumberPicker.Callback() {
            @Override
            public void onOK(String selectValueLeft, String selectValueRight) {
                String showText = selectValueLeft + unit1 + selectValueRight + unit2;
                Toast.makeText(getApplicationContext(),showText,Toast.LENGTH_LONG).show();
            }

            @Override
            public void onCancel() {
                Toast.makeText(getApplicationContext(),"cancel",Toast.LENGTH_LONG).show();
            }
        });
        twoNumberPicker.show();



###[ソースコード](https://github.com/YanHengGo/android/tree/master/01_picker)

###いいねも忘れずに↓
VSCodeでCPU使用量が増えた時の対応法

# 内容

MacBookAirでVSCodeをインストールして使用していたら、CodeHelperなるプロセスがCPUを占拠しており、マシンのファンが唸っていた。PC自体の温度もかなり上がっていたので、原因の特定＆解消を行ったのでここに記載しておく。OS、マシン、VSCodeのバージョンは次の通り。
> Mac High Sierra 10.13.4
> プロセッサ：1.4GHz Interl Corei5
> メモリ：4G
> VSCode 1.28.2


# 原因
CPUがバーストする原因はググって見たところ、過去のバージョンで発生していたが解消したという記事が上がっていた。バージョンは最新のものを使用しているので、そこが原因ではない。
Githubのチケットを読み解くと、VSCodeを開いた際の「プロジェクト配下のファイルサイズが大きいことが原因」との記載があった。
なのでファイルサイズの大きいディレクトリを参照対象外にする必要がある。

# 対応方法
VSCodeの参照対象外の設定は、[ files.wathcherExclude ]という部分で設定されており、デフォルトの設定では以下が記載されている。

```json

  "files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/**": true
   }
```

自分の場合は、PCのユーザホーム配下に写真などもありそれらがVSCodeに参照されていることがわかったので、VSCodeを使用する上で必要のないディレクトリは対象外にすることに。setting.jsonで[ files.wathcherExclude ]を以下のように追加した。

```json

"files.watcherExclude": {
        "**/.git/objects/**": true,
        "**/.git/subtree-cache/**": true,
        "**/.rvm/**":true,
        "**/node_modules/**": true,
        "**/Library/**":true,
        "**/GoogleDrive/**":true,
        "**/Dropbox/**":true,
        "**/.cocoapods/**":true,
        "**/Pictures/**":true,
}
```    
これによりCPUは問題ない水準にまで落ちました。
CPUがバーストする場合は、参考にしてもらえればと思います。

### 追記
関連するGithubのチケットは結構あります。以下など参考にしてもらえると。
https://github.com/Microsoft/vscode/issues/31328
Tomcat9にデプロイしたCamelのWebアプリケーションをhawtioで可視化する

# はじめに

Tomcat9にデプロイしたCamelのWebアプリケーションをhawtioで可視化します。

以下で構築したCentOS 7のTomcat9の開発環境を前提としています。

[CentOS 7にTomcat9/JDK8の開発環境を構築する](https://qiita.com/mkyz08/items/97802acb6911f0173e7c)


Camelフレームワークを使用したWebアプリケーションの作成方法は本投稿では説明していません。
以下に素晴らしい投稿があるので、そちらを参照してください。

[実践編：Camel, Tomcat, MySQL によるWeb APIアプリなものを高速開発](https://qiita.com/daikuro/items/bccbd5ff0308ccb2ac8e)


# hawtioをインストールする

hawtioの公式サイトから、最新版の「hawtio-default-2.1.0.war」をダウンロードします。

https://github.com/hawtio/hawtio/releases

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/bba1b2b7-ea09-bd0b-c56d-6158658865fa.png)

ダウンロードした「hawtio-default-2.1.0.war」を「/opt/apache-tomcat/webapps」以下にコピーし再起動します。

```
$ cp -p /tmp/hawtio-default-2.1.0.war /opt/apache-tomcat/webapps/hawtio.war
# systemctl restart tomcat
```

以下のURLにアクセスするとhawtioの画面が表示されます。

http://[サーバのIPアドレス]:8080/hawtio/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/129b006c-2326-0b73-359a-654704f9003e.png)

Apache Camelフレームワークを使用したアプリケーションを作成しデプロイしているので、その情報を見てみます。
routeとrouteに流れたメッセージの数等のデータが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/d05092b5-875f-7d5c-7a15-3aaab19ab152.png)

それ以外にもJMXとか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/63e1122b-65d9-1391-5a70-87c3c4525df9.png)


## Tomcatのユーザでhawtioにログインできるように設定する（失敗）

Tomcatのユーザでログインできるように設定したのですが、うまくログインできず。今回は断念しましたが、途中までの設定メモを残しておきます。

setenv.shにCATALINA_OPTSを設定。
・hawtio.authenticationEnabledで、認証を有効に設定
・hawtio.roleで、hawtioのロールをmanager-guiに設定

```setenv.sh
vi /opt/apache-tomcat/bin/setenv.sh

export CATALINA_OPTS='-Dhawtio.authenticationEnabled=true -Dhawtio.role=manager-gui'
```

Tomcatを再起動し、tomcatユーザでログインしようとするがログインできず。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/10b2ee9c-ea61-6ae1-9bb1-affe85456bd8.png)


# おまけ（hawtioの少し古いバージョン）

hawtioにTomcatのユーザでログインできなかったので、hawtioの少し古いバージョンで試してみました。

```
cp -p /tmp/hawtio-web-2.0.0.war /opt/apache-tomcat/webapps/hawtio-web.war
```

http://192.168.10.225:8080/hawtio-web/

ログイン画面を表示し、tomcatユーザでログインすると、成功・・・。
設定は全く同じなのですが、新しいバージョンでは何か別の設定が必要なのかもしれません。そもそも、開発環境なのでログインなしで使用したいと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/a1acf8d5-412c-0989-36a3-6974b9984be5.png)

バージョンが違うので、画面は異なりますが、だいたい同じデータを表示することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/bd6e2d9d-5e58-35e6-e9e3-e921cea01cdb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/0c216b3e-68c4-7f29-9f11-41b55090eca5.png)


# 参考

- [hawtioの公式サイトのドキュメント](http://hawt.io/docs/)

- [Apache Camelのルートをhawtioを使って可視化する - 導入編](https://qiita.com/cuhey3/items/e16fabe8bea227025afa)

- [実践編：Camel, Tomcat, MySQL によるWeb APIアプリなものを高速開発](https://qiita.com/daikuro/items/bccbd5ff0308ccb2ac8e)
Raspberry pi 3 B+ 設定備忘録

# Squid
Web Proxy 
## install
```
$ sudo apt install squid
```
## Config
```
$ sudo vi /etc/squid/squid.conf
```
https://qiita.com/subaru44k/items/9adf2142fcc677108a13


# SSH
/etc/ssh/sshrc
```
HOOK="$Discord_webhook"

DATE=`date +"%Y/%m/%d %H:%M:%S"`
curl -H "Content-Type: application/json" -X POST \
    -d "{\"username\": \"raspi_ssh\", \"content\": \"$USER has logged in from [$SSH_CLIENT] at $DATE  \"}" $HOOK &

```

# OpenVPN
pivpnでインストール

/etc/openvpn/server.conf
```
# on connection/disconnection
script-security 2
client-connect "/usr/local/vpn/connect.sh"
client-disconnect "/usr/local/vpn/disconnect.sh"
```

/usr/local/vpn/
```
connect.sh 

#!/bin/bash

HOOK=""

DATE=`date +"%Y/%m/%d %H:%M:%S"`
curl -H "Content-Type: application/json" -X POST \
            -d "{\"username\": \"raspi_vpn\", \"content\": \"$common_name has connected from [$untrusted_ip] as [$ifconfig_pool_remote_ip] at $DATE  \"}" $HOOK &

```

```
disconnect.sh

#!/bin/bash

HOOK=""

DATE=`date +"%Y/%m/%d %H:%M:%S"`
curl -H "Content-Type: application/json" -X POST \
            -d "{\"username\": \"raspi_vpn\", \"content\": \"$common_name has disconnected from [$untrusted_ip] as [$ifconfig_pool_remote_ip] at $DATE  \"}" $HOOK &
```
# Others

- usb on/off: 
```
$ hdparm -S 120 /dev/sda
```
- ssh / reverse ssh
- mpd / mpc
LaravelでDIをしてみる

# はじめに

LaravelでのDIを試してみたいので、前回作成したAPIのHTTPアクセス部分をDIしてみる。

# 自作のインターフェースと実装を用意

気分的にLaravelとはネームスペースを分けておく。

```php:HttpAccess.php
namespace Sample\Infra;

interface HttpAccess
{
    public function access(): string;
}
```

```php:GoogleDocHttpAccess
namespace Sample\Infra;

class GoogleDocHttpAccess implements HttpAccess
{
    public function access(): string
    {
        $url = '[GoogleスプレッドシートのURL]';
～前回と同じ内容なので中略～
        curl_close($curl);

        return $result;
    }
}
```

# autoloaderに設定を追加

Laravelと別のネームスペースにしたので設定を追加する。

```json:composser.json
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/",
            "Sample\\": "sample/" // ※ココを追加
        }
    },
```

`composer dump-autoload` を実行して設定を反映する。

# DIのバインド設定を追加

```php:app/Providers/AppServiceProvider.php
    public function register()
    {
        $this->app->bind(HttpAccess::class, GoogleDocHttpAccess::class);
    }
```

# コントローラーでDIする

コンストラクタ・インジェクションでのDIを行う。
タイプヒントによりLaravelが自動的にインスタンスを設定してくれる。

```php:SampleController.php
class SampleController extends Controller
{
    /** @var HttpAccess */
    private $httpAccess;

    public function __construct(HttpAccess $httpAccess)
    {
        $this->httpAccess = $httpAccess;
    }

    public function index()
    {
        return response($this->httpAccess->access());
    }
}
```

以上の手順で自作クラスをDI出来た。
20181027

お勉強したことを日記感覚で書いていきます。
今日はいい天気ですねぇ
Macは重くてでかいんで、文字打つ用にラズパイが欲しいな

##やったこと
1. colud LaTex
2. qiita


##感想
まずcolud LaTexを導入してみた。疲れた。でも楽しい。めっちゃエラー出るのを探すのええな。
宿題を数式で打つのを頑張った。綺麗にかけて感動。

いちいちコンパイル押さなあかんのめんどくさい。

markdown入力が楽しい。めっちゃ簡単に綺麗に書けるので最高って感じです。
あと他人の書いた記法が検索できるのがいい

##調べたこと
- 数式の埋め込み
数式を\$ $で囲む  or  数式を\\( \\)で囲む

- LaTexコマンド集
http://www.latex-cmd.com

- Macにおけるバックスラッシュ（\）の入力方法
環境設定で変更


- [markdownチートシート](https://qiita.com/kamorits/items/6f342da395ad57468ae3)

- ブラウザの検索機能(command + F)

・Markdown記法の検索
QiitaではMarkdown記法で見たいURLの最後に.mdをつける。

##アイデア
LaTeXをするときは、
・LaTeX編集ページ
・LaTexコマンド集
・quitta編集ページ
・quittaチートシート
をまとめて開いといたら便利かもしれないね！
sublimetextでフォルダ名でフォルダを開く方法

sublimetextで欲しいフォルダを開きたいときは
```command+p
```
で
<img width="1440" alt="スクリーンショット 2018-10-27 11.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/440c0ed4-1c3b-9be0-762e-bfb3ce03d235.png">
が出てくるので
例えば、user/new.html.erbが開きたいときは
<img width="1440" alt="スクリーンショット 2018-10-27 11.51.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/e69c1d0c-fe54-1882-e9dc-b724053e26d4.png">


下にスクロールしていくと、、、あった〜
<img width="600" alt="スクリーンショット 2018-10-27 11.52.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/e5175884-d02a-562c-786b-04f87a55b680.png">
て感じです。
メモです
便利なので是非！
MySQL設定変更、確認系のコマンドメモ

# MySQLメモ

## 設定値確認

### スレッド系
```
show status like 'Threads%';
show variables like 'thread_%';
```

### バージョン確認
```
select version();
```

### サーバタイムゾーンの確認
```
SHOW VARIABLES LIKE '%time_zone%';
```

### プロセスの確認
```
show processlist;
show processlist\g
```

### 自分の接続ID（スレッドID）確認
```
select CONNECTION_ID() as id;
```

## 設定
### 外部キー制約のチェックを一時的に無効にする
```
SET FOREIGN_KEY_CHECKS = 0;
```
※mysqldumpした時のSQLの中にもしれっと居たりする（コメントアウトされてるけど）

### スレッドキャッシュサイズ変更
```
SET GLOBAL thread_cache_size = 0;
```
※サーバ再起動で↑の設定は消えるので注意
ある特定のportだけ外部に出るトラフィックの帯域を制限する

# 目標

あるポートで、外に出るトラフィックのみ帯域制限する


# 解決策


```
# DEV=<device>
DEV=eth0
# sudo tc qdisc del dev $DEV root
sudo tc qdisc add dev $DEV root handle 1: htb default 20
sudo tc class add dev $DEV parent 1: classid 1:1 htb rate 1000Mbit ceil 1000Mbit burst 10Mb cburst 10Mb
sudo tc class add dev $DEV parent 1:1 classid 1:10 htb rate 1Kbit ceil 1Kbit burst 1Kb cburst 1Kb
sudo tc class add dev $DEV parent 1:1 classid 1:20 htb rate 800Mbit ceil 1000Mbit burst 10Mb cburst 10Mb
sudo tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip dport 5044 0xffff flowid 1:10
```

# 解説

Deviceを環境変数に入れておく

```
DEV=eth0
```

qdisc(がある場合は)消す

```
sudo tc qdisc del dev $DEV root
```


qdiscを追加

```
sudo tc qdisc add dev $DEV root handle 1: htb default 20
```

classを追加 (ここで帯域制限のルールを書く)。3つある理由は、一番上がデフォルト、以下でセットするfilterに引っかかる場合を2番目に、3番目は、それ以外という感じでTree構造になってるため。今回は、2行目が大事。

```
sudo tc class add dev $DEV parent 1: classid 1:1 htb rate 1000Mbit ceil 1000Mbit burst 10Mb cburst 10Mb
sudo tc class add dev $DEV parent 1:1 classid 1:10 htb rate 1Kbit ceil 1Kbit burst 1Kb cburst 1Kb
sudo tc class add dev $DEV parent 1:1 classid 1:20 htb rate 800Mbit ceil 1000Mbit burst 10Mb cburst 10Mb
```

filterの設定 `dport 5044` 部分でポート番号を指定

```
sudo tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip dport 5044 0xffff flowid 1:10
```

上記説明は、結構適当で詳細は http://labs.gree.jp/blog/2014/10/11266/ を参考に。こちらの説明が素晴らしい！


# おまけ

traffic関係で使ったコマンド

```
iftop
```
rails 多対多の衝撃メモ！！

#衝撃的すぎたのでメモ..
中間テーブルを作ってカテゴリーを取得しようと試みた。。

##間違った多対多の書き方

```ruby:user.rb
class User < ApplicationRecord
(省略)
has_many :colleges, through: :college_users
has_many :college_users
(省略)
end
```
```ruby:college.rb
class College < ApplicationRecord
    has_many :users, through: :college_users
    has_many :college_users
    accepts_nested_attributes_for :college_users
end
```
```ruby:college_user.rb
class CollegeUser < ApplicationRecord
  belongs_to :user
  belongs_to :college
end
```
```ruby:seed.rb
User.create(:clubname => 'ユーザー１',:clubtype => '2', :email => '1@gmail.com', :password => 111111 )
User.create(:clubname => 'ユーザー2',:clubtype => '3', :email => '2@gmail.com', :password => 222222)
User.create(:clubname => 'ユーザー3',:clubtype => '1', :email => '3@gmail.com', :password => 333333)
User.create(:clubname => 'ユーザー4',:clubtype => '4' ,:email => '4@gmail.com', :password => 444444)

%W[A大 B大 C大 D大 E大 F大].each { |a| College.create(name: a) }


CollegeUser.create(user_id: '2', college_id: '1')
CollegeUser.create(user_id: '2', college_id: '2')
CollegeUser.create(user_id: '2', college_id: '3')
CollegeUser.create(user_id: '2', college_id: '4')
CollegeUser.create(user_id: '1', college_id: '4')
CollegeUser.create(user_id: '3', college_id: '4')
```

コンソールでuserからcollegeを取得できるか確認したところ

```ruby:
[6] pry(main)> User.all 
#seedできてる
[7] pry(main)> College.all
#seedできてる
[8] pry(main)> current_user = User.find(2)
#id=2をcurrent_userにする
[9] pry(main)> current_user.colleges      
ActiveRecord::HasManyThroughOrderError: Cannot have a has_many :through association 'User#colleges' which goes through 'User#college_users' before the through association is defined.
from /Library/Ruby/Gems/2.3.0/gems/activerecord-5.1.6/lib/active_record/reflection.rb:975:in `check_validity!'
```

エラーが、、、なんで？！と確認したところ、
`has_many :college_users`と
`has_many :users, through: :college_users`
の順が逆だった！！
要するに
#正解の多対多の書き方
```ruby:user.rb
class User < ApplicationRecord
(省略)
has_many :college_users
has_many :colleges, through: :college_users
(省略)
end
```
```ruby:college.rb
class College < ApplicationRecord
    has_many :college_users
    has_many :users, through: :college_users
    accepts_nested_attributes_for :college_users
end
```
```ruby:college_user.rb 
上と同じ
```

でした！
コンソールで確認してみたところ

```ruby:
[12] pry(main)> current_user.colleges
  College Load (0.5ms)  SELECT `colleges`.* FROM `colleges` INNER JOIN `college_users` ON `colleges`.`id` = `college_users`.`college_id` WHERE `college_users`.`user_id` = 2
=> [#<College:0x00007faec8320770 id: 1, name: "A大", created_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00, updated_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00>,
 #<College:0x00007faec8320428 id: 2, name: "B大", created_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00, updated_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00>,
 #<College:0x00007faec831bf90 id: 3, name: "C大", created_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00, updated_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00>,
 #<College:0x00007faec831bbd0 id: 4, name: "D大", created_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00, updated_at: Sat, 27 Oct 2018 02:30:45 UTC +00:00>]
```

ちゃんと取れてました！

確か、プログラミングは上から読み込まれていくって聞いたことあったのに笑、、
皆さんもちゃんと気をつけましょうね〜
LaravelでAPIを作ってみる

# はじめに

Laravelのお作法を勉強する為に、以前に[素のPHPで作成したAPIもどき](https://qiita.com/FrozenVoice/items/27301b8939e91665cba0)を移植してみたい。

# コントローラーの作成

下記のコマンドで自動生成する。

```
php artisan make:controller SampleController --resource
```

# ルーティングの追加

`routes/api.php` に下記を追加する。

```
Route::resource('sample','SampleController');
```

# SampleControllerに処理を移植

```php
class SampleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $url = '[GoogleスプレッドシートのURL]';

        $curl = curl_init();
        curl_setopt_array($curl,[
            CURLOPT_URL => $url,
            CURLOPT_CUSTOMREQUEST => 'GET',
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_RETURNTRANSFER => true,
        ]);

        $result = curl_exec($curl);

        curl_close($curl);

        return response($result);
    }
}
```

# ブラウザからアクセス

`http://localhost/api/sample` にアクセスする。

`routes/api.php` にルーティングを設定しているので、プレフィクスとして `/api`  が付与されたURLとなる。

## 結果

```json
[ { "id": 1, "name": "いわし", "value": 100 }, { "id": 2, "name": "うし", "value": 200 }, { "id": 3, "name": "ぶた", "value": 300 }, { "id": 4, "name": "とり", "value": 400 }, { "id": 5, "name": "くらげ", "value": 500 }, { "id": 6, "name": "いるか", "value": 600 }, { "id": 7, "name": "なくすと", "value": 700 }, { "id": 8, "name": "ららべる", "value": 800 } ]
```
WordPress - 参考にさせていただいたサイト

WordPressで参考にさせていただいたサイトの情報です。

- ユーザーの種類と権限： 
 - [WordPressのユーザーの種類と権限について](https://netaone.com/wordpress-manual/user-roles/)
- 条件分岐: 
 - [便利なWordPressの条件分岐16パターン](https://saruwakakun.com/html-css/wordpress/if_is)
- ユーザーで条件分岐: 
 - [ユーザー情報で条件分岐](https://gatespace.jp/2012/10/23/wp-user-info-conditional/)
- filter_inputの使い方： 
 - [filter_input関数を使って簡潔なコードを書こう](http://web-engine.hatenadiary.com/entry/20160521/1463823327)
  - [$_GET, $_POST じゃなくて filter_input 使えとのこと](https://qiita.com/mgng/items/901cf7f50a224b19335b)
- transientの使い方：　
 - [目指せ軽量化！WordPressのTransient APIでDBキャッシュを生成、クリアする方法](https://site-manage.net/archives/3567)
  - [WordPressで時間のかかる処理をキャッシュ機能を利用して高速化する方法](https://nelog.jp/wordpress-transient)
- WP Mail SMTP by WPFormsの使い方：　[WordPress 最新版『WP Mail SMTP』の設定要領](https://arakoki70.com/?p=1194)
- Gmail SMTPプラグインの使い方：　
 - [WordPressプラグイン Gmail SMTP の設定方法](https://dev.matumo.com/265)
- BackWPupからのリストア：　
 - [BackWPupでバックアップ・リストア（復元）の具体的手順](https://blog.s-giken.net/137.html)
  - [BackWPupのバックアップデータを復元する方法](https://www.fortune-factory.net/2017/09/restore-backwpup)
- 管理画面にメニューを追加：　
 - [【WordPress】 管理画面にメニューを追加する方法](https://qiita.com/konweb/items/330f735a899e448ef876)
 - [WprdPressの管理画面に独自ページを追加する](http://cly7796.net/wp/cms/add-pages-to-the-wordpress-administration-screen/)
- メルマガ（一斉配信）プラグイン：
 - [MailPoet 2 – ステップメール機能を利用できるWordPressプラグイン](https://netaone.com/wp/mailpoet-newsletters/)
 - カスタム投稿の追加：
  - [カスタム投稿タイプを作成する[register_post_type]](https://noumenon-th.net/programming/2016/06/23/wordpress12/)
Dockerとは

# Dockerとは
一言で言うと、サーバー仮想化技術です。  

# 予備知識
* ハードウェア  
システム基盤を構成する物理的な要素。  
サーバー機器本体、電源装置など。
* OS  
ハードウェアやネットワーク機器を制御するための基本ソフトウェア。
  * ホストOS  
  パソコンやサーバーそのものにインストールされている、仮想環境の土台となるOS
  * ゲストOS  
  ホストOSの上で動く仮想的なOS

厳密には違いますが、上記のようなイメージをしていれば大丈夫です。

# サーバー仮想化技術
これらは、どの部分を仮想化するかで異なります。
1. ホスト型
2. ハイパーバイザー型
3. コンテナ型　←Dockerはこれ


## ホスト型サーバー仮想化
ホストOSに仮想化ソフトウェアをインストールし、その上でゲストOSが動く。
* Oracle VM VirtualBox
* VMware Workstation Player

## ハイパーバイザー型サーバー仮想化
ハードウェア上に仮想化を行う。 
環境ごとに別のOSが動作する。ホストOS、ゲストOSという形に分かれていない。

## コンテナ型サーバー仮想化　　
ホスト型とは異なり、ゲストOSを作るわけではなくホストOSそのものを分割し、それを一つの単位（コンテナ）とする。 
ホストOSをしっかり分割して、シェアしているイメージ。　
シェアを制御するのは、ホストOS上にインストールされたコンテナ管理ソフト。　　
JVMと同じようなイメージを持つといいかもしれない。

* 同じシステムリソースを利用するため、無駄が少ない
* 実際には同じリソースを利用しているが、別々のものを使っているように見せている
* 軽量、高速
* 可搬性



#用語
* Dockerfile  
イメージを生成するための設計書
* Dockerイメージ  
コンテナを生成するための雛形
* Dockerコンテナ  
Dockerイメージから作られた実体

#何ができるのか
1. どんなところでも同じ（サーバー）環境を作ることができる
2. 同じアプリなのに、環境が変わったせいで動かなくなるということがない
3. 同じ環境をたくさんコピーできる
4. 誰かが設定した環境を共有し、他の人も簡単に同じ環境が作れる
5. 設定した環境を手軽に破棄できる（ホストOSの状態を汚さない）
6. 様々な種類のOSのDockerイメージが配布されている
7. 一つのパソコン上に、サーバーを複数立てることができる
VSCodeの再インストール手順

Windows環境で *1.26* から *1.28* にアップデートしたとき、スニペットがぶっ飛んだので入れ直した記録。
ちゃんと設定ファイルまで消さないと直らなかったです……。

## Settings Sync 拡張機能の導入

設定ファイルやインストール済みの拡張機能を [Gist](https://gist.github.com/) にバックアップしてくれるVSCodeの拡張機能。

再インストール時にすべての設定を削除するので、これでバックアップしておきましょう。

使い方は [GitHubのREADME][sync] を参考に。
みなさんはアクセストークンとGist IDを間違えないように気をつけてね……。


## アンインストール

[**Scoop**](https://github.com/lukesampson/scoop) からインストールしたため、次のコマンドでアンインストール。

```shell:powershell
scoop uninstall vscode
```

### 設定フォルダの削除

`%APPDATA%\Code` 以下と `%HOMEPATH%\.vscode` 以下を削除する。

```shell:powershell
Remove-Item $env:APPDATA\Code -Recurse
Remove-Item $env:HOMEPATH\.vscode -Recurse
```


## 再インストール

```shell:powershell
scoop install vscode
```


### 設定の復元

拡張機能 `Settings Sync` をインストールし、バックアップした `Gist` から設定ファイルなどをダウンロードする。

やり方は [Settings SyncのREADME][sync] を(ry


### 日本語環境にする

`Settings Sync` では `locale.json` がバックアップされないようなので、手動で修正する。

コマンドパレットを開いて

```shell:vscode
>configure display language
```

で `locale.json` を開き、`"locale":"ja"` に変更しておく。

上記設定が終わったら再起動。


## 参考

* [Settings Sync | GitHub][sync]

* [Extension is installed and it doesn't load | vscode-azurearmtools Issue](https://github.com/Microsoft/vscode-azurearmtools/issues/45#issuecomment-375379388)

* [Visual Studio Code [vsCode] 日本語化 | Qiita](https://qiita.com/ntkgcj/items/e77331932c7983dea830)

* [PowerShell/環境変数の値を取得する方法 | Windowsと暮らす](https://win.just4fun.biz/?PowerShell/環境変数の値を取得する方法)

[sync]:https://github.com/shanalikhan/code-settings-sync
wrk2を使ってパフォーマンステストをし可視化してみる。


負荷テストツールであるwrkの改良版、wrk2で遊んでみます。
ついでに有志によるwkr2の結果を可視化するツールをつかって、RPSの変化によってどのようにパフォーマンスが落ちていくか確認してみます。


用意するもの
---

今回、さっと試す用にdocker-composeで一連のツールをまとめた環境を作成しました。
https://github.com/RyujiKawazoe/wkr2_visualizer


### 中身

* [wrk2](https://github.com/giltene/wrk2)
	* wrk2が積んであるイメージ[wrk2-docker](https://hub.docker.com/r/1vlad/wrk2-docker/)を使わせていただきました。有志に感謝！
* [hdr-plot](https://github.com/BrunoBonacci/hdr-plot)
	* 偉大な可視化ツールをつくってくれた有志に感謝！


説明
---

用意した環境のdocker-compose.ymlの中身は下記となっています。

```
version: '3'
services:
  wrk2:
    image: 1vlad/wrk2-docker
    entrypoint: /bin/sh
    command: -c '/wrk2/wrk -t2 -c100 -d30s -R100 --timeout 30s -L -s /script/myscript.lua http://localhost/ &> /data/result.out'
    volumes:
      - ./stress_test/lua:/lua
      - ./stress_test/data:/data
  hdr_plotter: 
    build: ./hdr-plotter/
    command: /bin/bash -c "./hdr-plot --output /out/result.png --title 'result' /data/*"
    volumes:
      - ./stress_test/data:/data
      - ./stress_test/out:/out

```

詳しい説明は省きますが、`http://localhost/` を負荷をかけたいURLに書き換えてください。
100RPSで３０秒間負荷をかけています。

負荷の実行
---


```
docker-compose run wrk2
```

実行が終わると、可視化に必要なファイルが `./stress_test/data` 以下にはき出されます。

可視化の実行
---

```
docker-compose run hdr_plotter
```

上記を実行すると `./stress_test/out` にpngファイルがはき出されます。


![result.png](https://qiita-image-store.s3.amazonaws.com/0/18331/2ba9af24-84a9-178e-11ff-b97560370558.png "result.png")
【Linux】パスワード無しでscpを実行する方法

crontabで定期的にscpをする時にSSHログインのパスワードを尋ねられると困る（expectやsshpassを使う必要がある）ので、パスワード無しの公開鍵認証を用いることにしました。

#サーバ

1.データ転送用のユーザを追加

```
# useradd datatransfer
```
2.SSHデーモンの設定ファイル（例：/etc/ssh/sshd_config）に下記を追加（コメントアウトを外す）

```:/etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
```

3.このユーザのパスワード認証を無効に設定（任意）

```:/etc/ssh/sshd_config
Match User datatransfer
PasswordAuthentication no
```

4.SSHデーモンの再起動

```
# service sshd restart
```

#ローカルホスト

1.認証用の鍵ペアを作成

```
ssh-keygen -t rsa
```

※パスワードを設定してしまうとパスワードを尋ねられるので入力しない

```
Enter passphrase (empty for no passphrase)
Enter same passphrase again:
```


2.生成した公開鍵（例：id_rsa.pub）をsshd_configのAuthorizedKeysFileで指定したファイルに追記


3.scp時に-iオプションで秘密鍵を指定

```
scp -i [秘密鍵] [コピー元] [コピー先]
```
Sikulix の click() させるだけのチュートリアルで失敗する人向け

[公式のチュートリアル](https://sikulix-2014.readthedocs.io/en/latest/tutorials/helloworld/helloworld-win.html)にある Hello World が動かない人向けの記事です。

たとえばWindows版で、指示通りにWindowsボタンをクリックさせようとして
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12150/2409b5f9-acca-e6ba-f390-9305764a5b0f.png)

```
[error] script [ test ] stopped with error at line --unknown--
[error] Error caused by: Traceback (most recent call last): File "G:\work\script\test.sikuli\test.py", line 1, in <module> click("1540597201579.png") Line 2277, in file Region.java 
...中略
at java.lang.reflect.Method.invoke(Method.java:497)
org.sikuli.script.FindFailed: FindFailed: 1540597201579.png: (74x63) seen at (7, 0) with 0.96 in S(0)[0,0 1920x1200] E:Y, T:3.0 Line 2277, in file Region.java 
```

FindFailedとな！

なお正解はこちら
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12150/cfe17956-9551-f633-f192-e28810587153.png)

最初のスクリーンショットを撮るときに **マウスオーバーで光ってた**


画像認識系自動化ではありがちな話。