OmniAICreator/Qiita-1.07M huggingface dataset:
マイグレーションエラーの解決方法についての備忘録(devise_create_users)

#エラー発生の経過と原因

deviseを使用してuserモデルを作成し、usersテーブルを作成しようとマイグラーションファイルを実行した。しかし、以下のようなエラーが発生してしまった。

```
okamotoryounoMacBook-Air:chat-space2 okamotoryou$ rake db:migrate
== 20190620191810 DeviseCreateUsers: migrating ================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Index name 'index_users_on_name' on table 'users' already exists
/Users/okamotoryou/projects/chat-space2/db/migrate/20190620191810_devise_create_users.rb:5:in `change'

Caused by:
ArgumentError: Index name 'index_users_on_name' on table 'users' already exists
/Users/okamotoryou/projects/chat-space2/db/migrate/20190620191810_devise_create_users.rb:5:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

```
https://gyazo.com/db41839fff02b0e9a743e8bb44e1de3b

エラーの原因は、「すでにusersテーブルのマイグレーションファイルは実行されているから、再度同じマイグレーションファイルを実行することはできない」というものであった。


そこで、以下のコマンドで、マイグラーションファイルの実行状況を確認した。

```
$ rails db:migrate:status
```

すると、以下のような実行状況になっていた。

```
okamotoryounoMacBook-Air:chat-space2 okamotoryou$ rake db:migrate:status

database: chat-space2_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190618115638  ********** NO FILE **********
   up     20190620183857  Create groups
   up     20190620183912  Create group users
  down    20190620191810  Devise create users
```
https://gyazo.com/22e9d7541e095546e9adabcda64cbbdf


#解決方法と手順
この時の解決方法と手順としては、

**1**.4つ目の**down**になっている**20190620191810  Devise create users**というマイグレーションファイルのファイル名をコピーする。

**2**.メモ帳などにそれをペースとして記録する。

**3**.１つ目の**up**になっている**20190618115638  ********** NO FILE ********** 
という部分のファイルを復活させるため、エディタ上のmigrateのディレクトリにおいて、新しい空のファイルを作成する。

**4**.そのファイルに先ほどメモした**20190620191810  Devise create users**というマイグレーションファイルのファイル名を新しく作成したファイル名とする。

**5**.4つ目の**down**になっている**20190620191810  Devise create users**というマイグレーションファイルのファイル中のコードをコピーする。

**6**.新しく作成した**20190620191810  Devise create users**というマイグレーションファイルの中にペーストする。

**7**.4つ目の**down**になっている**20190620191810  Devise create users**というマイグレーションファイルのファイルを削除する。

**8**.最後にrake db:migrate:statusコマンドで確認する。

```
okamotoryounoMacBook-Air:chat-space2 okamotoryou$ rake db:migrate:status

database: chat-space2_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190618115638  Devise create users
   up     20190620183857  Create groups
   up     20190620183912  Create group users
```

以上でなんとか解決した。
音楽ど素人が機械学習で楽譜認識するAndroidアプリを作る話　五線譜の検出編

#はじめに
中学から吹奏楽部に入った息子が楽譜に音名を書くのがだるいと言いだしたんで、そんなもん今どきスマホとパシャッとすりゃAIでぱっと出てくるアプリがあるだろ？って言ったら意外となかったんで自分で作った
ちなみにiOS用だといくつかあります
**スマホ用の楽譜認識アプリをまとめてみた**
http://anadreline.blogspot.com/2019/06/wo.html

#作成アプリ
**Music Score Reader**
https://play.google.com/store/apps/details?id=msreader.android.anadreline.com.musicscorereader

#開発者の初期スペック
- 五線譜の**どこがドなのかがわからない**
- **♯と♭って結局どっちかだけでよくない！？**と思っている
- 息子にトランペットの**ドはドじゃないからね**って言われてファッ！？ってなる
- 12音に五線譜表記って**仕様がおかしくね**って思っている

#検証環境
この記事の内容は、以下の環境で検証しました。

- Android Studio 3.2.1
- CompileSdkVersion:27
- MinSdkVersion:21
- TargetSdkVersion:27
- OpenCV for Android 3.2.3
- TensorFlow Mobile

# 五線譜検出のプロセス
楽譜認識アプリということで音符はまあ機械学習の認識モデル作成をがんばるとして、五線譜は単なる線なんだから、線分さえ検出できればいけるだろと簡単に考えてました
がしかし、やってみたらこれが結局のところ**音符の認識より大変**だったかもしれない
最終的なプロセスは以下の通り

1. 画像の平滑化
2. 画像の2値化
3. 線分の検出
4. 五線譜の検出

## 開発環境
画像処理はOpenCV for Androidを使って処理していますので、プロジェクトに入れておく必要があります
**OpenCVのAndroid Studioへのインポート方法は以下を参考**
https://qiita.com/kodai100/items/6c9e8a34d0714913c017
## 画像の平滑化
五線譜検出の下準備として画像の平滑化を行います
これをしないと、のちに行う2値化のときに結構ノイズが出てしまいます

```java:detect_score.java
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY);
Photo.fastNlMeansDenoising(mat, den, 6, 7, 21);
```
![img_adp3g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/00939f3a-5d08-3ddb-10d7-d1b1c67ad02b.png)

OpenCVでの画像の平滑化はblurやmedianBlurもありますが、処理時間はかかるけど一番ノイズがきれいに消せたPhoto.fastNlMeansDenoisingを採用
## 画像の2値化
OpenCVによる画像の2値化にはいろいろ種類があります
**しきい値処理による2値化**
![img_bin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/f971efd3-1031-863c-f34b-f7ed5253b02a.png)
**大津の2値化**
![img_otu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/cf6ca44e-12a0-a457-8729-2b8d0da275e6.png)
**適応的しきい値処理による2値化**
![img_adp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/409f8eee-5a10-59e5-53ce-f6a7d84e5e93.png)
今回はスマホで楽譜の写真を撮る前提なので撮影時に影ができやすかったりすることから、陰影の影響を回避できる適応的しきい値処理を採用しました

```java:detect_score.java
Imgproc.adaptiveThreshold(den, adp, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 17, 2);
```
## 線分の検出
音名を表記するためにはまず五線譜をということで、線分を検出するためにOpenCVのハフ変換による直線検出は白い部分に対して線分を捜索するんで、まずは2値化画像を反転して検出を実行

```java:detect_score.java
Core.bitwise_not(adp, bin);
Mat linesMat = new Mat();
Imgproc.HoughLinesP(mat, linesMat, 1d, Math.PI / 360d, width / 80, width / 80d, 7d);
```
パラメータはとにかく五線譜の線分をできるだけとれるように調整
![img_line2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/e0e75920-5422-c620-d1c8-1baed1557b88.png)

## 五線譜の検出
検出された線分から五線譜を見つけるわけですが、最初はとにかく長いのを抜き出せばそれが五線譜だろうと思ってやってみました
結果長く見える線分は実は細切れだったりして、それならばとつながってそうな線をつなげて判断してみるかってやってみても、これがまあうまくいかない
![img_line3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/dc5d15ee-ab11-737e-e7ab-829df9bb2d7f.png)
検出した線分をランダムに色を変えて描画、長い線分に見えて実は細切れになっている

そこで長い線分を見つけるって考えは捨てて、上から下に垂線を引いて全部の線分との交点を出し、その交点が縦に均等に5点並んでいるものを検出してみた
![img_grd2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/ac1a8b40-cded-38d3-0e43-953b3f50c5ce.png)
そこから見つけた5点の幅の最大値や最小値を決めて抽出すると、うまい具合に五線譜っぽいところを拾えたので、こっからさらに横にきっちり並んでるかを評価して正しく五線譜を検出することができた
【Go】goenvを使ってMacにGoをインストールをする

## 概要

MacPCにGoのインストールをします。
goenvはgoのバージョン管理をしてくれて、バージョン切り替えが簡単にできます。

## 実行環境
OS:Mac OS X / 10.14.5
Shell:bash

## やること
やることは大きく分けて２つになります。

- goenvのインストール
- Goのインストール

## goenvのインストール

### インストール

とにもかくにも、まずはgoenv自体をインストールしてみましょう。インストールには2種類あります。

- GitHubからチェックアウト
- Homebrew

サクッとできそうなHomebrewでのインストールを選びました。

```
$ brew update
$ brew install goenv
```
### パスの設定

パスの設定をします。zshでもbashでもかまいません。お好きな設定ファイルに環境変数を指定して下さい。
bash版は以下で行いました。

```
$ vi ~/.bash_profile
# 中身はこちら
export GOPATH=$HOME/go
export GOENV_ROOT=$HOME/.goenv
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
export PATH=$PATH:$GOPATH/bin
```

設定したら反映もお忘れなく。

```
$ source ~/.bash_profile
```

### 確認
goenvのバージョン確認です。

```
$ goenv --version
goenv 1.23.3
```
バージョンが確認できたら成功です。
できかったときは、そもそもインストールに失敗しているかパスが通ってないかのどちらかなのでもう一度見直してみてください。


## Goのインストール

### インストール可能なバージョンの確認
goenvを使用して、go自体インストールを行いましょう。
使用可能なgolangのバージョンをリストで確認できます。

```
$ goenv install -l
```

最新のバージョンがない！？というときは、アップグレードが必要です。
以下のコマンドで最新にしましょう。

```
$ brew update && brew upgrade goenv
```

### 指定してインストール
今回は、1.11.0を選択しました。

```
$ goenv install 1.11.0
```


### バージョン指定
globalで全体で使用するバージョン指定ができます。

```
$ goenv global 1.11.0
```
そのほかにも、localでディレクトリ別にバージョン指定などができますが、そちらは別記事で記載します

### インストール確認
Goのバージョン確認です。

```
$ go version
go version go1.11 darwin/amd64
```

### インストールしたリスト確認
以下のコマンドで、インストールしたものの確認ができます。＊印がついているものが、現在適用されているバージョンとなります。

```
$  goenv versions
  system
* 1.11.0 (set by /Users/yourpath/.goenv/version)
  1.12beta1
  1.6.0
  1.8.0
```

いかがでしたか？

# 最後に
ここまでで、goenvを使用してGoのバージョンを指定してインストールすることまでができました。
ただ、globalで全体のバージョン指定をするだけでは、goenvの良さがまだ引き出せていません。
実運用では、プロジェクト毎にGoのバージョンを切り替えたい・・・ってこともありますよね？
そんなときは、goenvを使用して切り替える方法がありますので続きはまた今度。



# 参考
公式はこちらです。https://github.com/syndbg/goenv
Go言語を公式ドキュメントを見ながら勉強してみた

Go言語を公式ドキュメントを見ながら勉強してみた

| 開発環境 | Go言語 |
|:-:|:-:|
| mac 10.13.6 |go1.12.6 darwin/amd64|

#インストール
[https://golang.org/doc/install](https://golang.org/doc/install)を参考にインストーラをダウンロード。
インストーラをポチポチっとしてインストールを実施。
デフォルトのインストール先は`/usr/local/go`。

#環境設定
インストーラダウンロード時に表示される[https://golang.org/doc/install?download=go1.12.6.darwin-amd64.pkg](https://golang.org/doc/install?download=go1.12.6.darwin-amd64.pkg)に従ってPATHを設定。
```
export PATH=$PATH:/usr/local/go/bin
```
※今回は./bashrcに設定し、bash起動時に設定されるようにした。


#Hello World
同じく[https://golang.org/doc/install?download=go1.12.6.darwin-amd64.pkg](https://golang.org/doc/install?download=go1.12.6.darwin-amd64.pkg)にHelloWorldでインストール環境確認をする手順が書かれていたので実施。

1.`$HOME`ディレクトリにワークスペースとなる`go`ディレクトリを作成する。

※ワークスペースを指定する`GOPATH`という環境変数が用意されているが、明示的に指定しない場合、デフォルトで`$HOME/go`をワークスペースとみなす。

2.ワークスペースに`src/hello`ディレクトリを作成する。

3.`hello`ディレクトリに`hello.go`ファイルを作成する。

4.`hello.go`にHelloWorldを実装する。

```Go:hello.go
package main
import "fmt"
func main() {
	fmt.Printf("hello, world\n")
}
```


#goroutine
GOの特徴の一つである並行処理（Concurrency）について、https://go-tour-jp.appspot.com/concurrency/1 を参考にゴルーチンの実装と挙動を確認した。
ゴルーチンはGoランタイム上で管理される軽量なスレッドみたいなイメージ。

```Go:goroutine.go
package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("world")　//キーワードgoでゴルーチンになる
	say("hello")
}
```
同じアドレス空間で実行されるため、共有メモリへのアクセスは必ず同期する必要があります。
syncパッケージのWaitGroupを使ったり、チャネルを使ったりしますが、これらは次の機会に。

#まとめ
最初の一歩にhttps://go-tour-jp.appspot.com/ は最適。
CODE COMPLETE (上) -第2部 高品質なコードの生成 ④-

自分の理解を深めるために投稿します。

## 第8章：防御的プログラミング

### 無効な入力に対して

良いプログラムは「ゴミ(無効な入力)」を入れてもゴミを出さない。
代わりに、

- 外部からのデータの値を全て確認する
- ルーチンの全ての入力引数の値を確認する
- 不正な入力の処理方法を考える
  - エラー処理テクニック(後述)

### アサーション
エラー：発生が予想される状況
アサーション：発生してはならない状況　に使う

- アサーションに実行コードは含まない
  - コンパイルで問題が起こらないようにする
- 事前条件・事後条件の文書化と検証にアサーションを使用する
- 
```
Private Function Velocity (
  ByVal latitude As Single
  ...
) As Single

  // 事前条件
  Debug.Assert( -90 <= latitude And latitude <= 90 )

...

  // 事後条件
  Debug.Assert( 0 <= returnVelocity And returnVelocity <= 600 )
  
  // 戻り値
  Velocity = returnVelocity

End Function
```

- 堅牢性の高いコードは、エラーをアサートしてから処理する

### エラー処理

**正当性**か、**堅牢性**か、どちらを重視すべきソフトウェアなのか考えて処理する

- 当たり障りのない値を返す(**堅牢性**)
  - 無害だとわかっている場合
- 次に有効なデータで代用する(**堅牢性**)
- 前回と同じ値を返す(**堅牢性**)
  - 無害だとわかっている場合
- 有効な値のうち、もっとも近いもので代用する(**堅牢性**)
- ファイルに警告メッセージを記録する
- エラーコードを返す
- エラー処理ルーチン/オブジェクトを呼び出す
- エラーが発生した場所でエラーメッセージを表示する
- ローカルで最もうまくいく方法でエラーを処理する
- 処理を中止する(**正当性MAX**)

### 例外

- **本当に必要な時だけ**使う
  - ローカルで処理できるエラーはローカルで
- 例外も抽象化レベルを揃える
- 例外メッセージに**原因に関する情報を全て盛り込む**
- **空のcatchブロックを書かない**
- 例外レポート用ルーチンで**一元管理**する

### バリケード
ダーティデータを扱う部分とクリーンデータを扱う部分を定義すること

- バリケードの外側ではエラー処理、内側ではアサーションという区別がつく
  - 内側ではデータが綺麗になっているはずなので…
- 入力データは入力時に正しい型に変換する

### デバッグエイド
デバッグエイド = デバッグを補助するツール

- 導入は早ければ早いほど良い
- **攻撃的プログラミング**を利用する(運用での失敗が軽く済むように開発段階で失敗を重ねておく)
  - アサーションを使ってプログラムを中止する
  - 割り当てたメモリ全体をデータで埋め、メモリ割り当てのエラーを検出できるようにする
  - オブジェクトを削除する直前にジャンクデータを設定する  など
- デバッグコードの出し入れを繰り返す必要がない計画を立てる

### 製品コードに防御的プログラミングをどれくらい残すか

**残すもの**

- 重要なエラーを検査する部分
- プログラムを上品にクラッシュさせるコード
- テクニカルサポート担当者のためのエラー
- わかりやすいエラーメッセージ

**削除するもの**

- 些細なエラーを検査するコード
- 処理を中断させるようなコード
【Python】Pythonでファイル名を読み込み処理する

#PythonでOCTAのUDFファイル名を読み込み処理する
##Pythonでファイル名を読んで、for文で分子動力学ソフトOCTAのUDFファイルの処理をする

OCTAのUDFファイルをPythonで一括する処理するために、ファイル名を読み込んで、処理をして、CSVファイルで書き出すところを、メモ書きしておきます。

```PYTHON:OCTAでのファイルの一括処理

from UDFManager import UDFManager
import pandas as pd
import numpy as np
import os
#パスの設定（相対パスでできそうな気がするが、うまくできなかったので、絶対フルパスで指定する。フルパスC:\...\...）

path = "フルPATH"

#path内のファイル名の取得
files = os.listdir(path)
#print(files)

#for文でfileを一つづつ開く

for filename in files:
    #print(filename)
    openfile = path + '/' + filename
    udf = UDFManager(openfile)

    #処理のスクリプトを書く
    #udf中のデータをリストに書き出し、リストをpandasに入れる

    #pandasDataFrameを保存する
    #file名だけを取り出す
    newfilename = os.path.splitext(filename)[0]
    #ファイルの拡張子にcsvをつける
    csvfilename = path + '/' + newfilename + ".csv"
    #udfdataは、リストを入れたpandasのdataframe名にする
    udfdata.to_csv(csvfilename)



```
GASでスプレッドシートの更新をSlackに通知したい

## やりたかったこと
現在関わっている案件で、クライアントさんからのフロントエンドの修正依頼がGoogleスプレッドシートに追加されるのですが、いつの間にか追加されてるので、それをSlackに通知したいなと思いました。

## やり方
まず、Slackで通知を送りたいチャンネルのWebHook URLを取得します。
手順はこちらの記事を参照

https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

ここで対象のスプレッドシートを開いて、ツール⇢スクリプトエディタ から取得したURLを使ってGASを書いていきます。

```javascript
function sendSlack(text) {
    const post_url = 'WebHookのURL'
    const user_name = '投稿するユーザー名'

    const send_data = {
        'username': user_name,
        'text': text
    }

    const options = {
        'method': 'post',
        'contentType': 'application/json',
        'payload': JSON.stringify(send_data)
    }

    UrlFetchApp.fetch(post_url, options)
}

function showStatus () {
    const my_seat = SpreadsheetApp.getActiveSheet()
    const my_cell = my_seat.getActiveCell()
    const ss = SpreadsheetApp.getActiveSpreadsheet()
    const ss_url = ss.getUrl()
    var text

    const seat_column = my_cell.getColumn()
    const seat_value = my_cell.getValue()

    if (!seat_value) {
        return null
    }

    //ここではC列の変更を検知したい場合を想定
    if (seat_column == 3) {
        //送信するテキストを生成
        text = '<!here>' + '\n' + seat_value + ss_url
    }

    sendSlack(text)
}
```

これだけです、後は条件によってよしなに送信するテキストをいじるといいと思います。
Laravelでメールをデフォルトとは別のメールサーバーで送信したい

# 前置き
みなさん、Laravelでメールを送信するときは、.envにメールサーバーの設定を記載していると思います。
ただ、その.envに書いてあるのとは違うメールサーバーで送りたいんだよなぁってとき、困りますよね！

# 背景
現場であったのが、webシステムでそれぞれのユーザーに個別の内容を送るメール送信機能もあるんだけど、一括メール送信機能もつきましたパターン。

同じメールサーバーに投げたら、個別の内容送るメールと一括のメールを同時に送ろうとするので、個別の内容のメールが届くのが遅くなったりします。

私の作ったシステムだと、個別の内容のメールは絶対優先だったわけで、同じメールサーバーを使うわけにもいかんと。

# 解決法
みんな大好きStack Overflowに書いてある！！！
[multiple mail configurations](https://stackoverflow.com/questions/26546824/multiple-mail-configurations)

ここ読めばOKというのも投げやりなので、一応自分でも書きます。
（コードはほぼ丸パクリです...）

# コード
## とりあえず設定情報書こう

```php:.env
BATCH_MAIL_MAIL_DRIVER=
BATCH_MAIL_HOST=
BATCH_MAIL_PORT=
BATCH_MAIL_USERNAME=
BATCH_MAIL_PASSWORD=
BATCH_MAIL_ENCRYPTION=
```

```php:config/mail.php
<?php 
'batch_mail_send' => [
    'driver' => env('BATCH_MAIL_MAIL_DRIVER'),
    'host' => env('BATCH_MAIL_HOST'),
    'port' => env('BATCH_MAIL_PORT'),
    'username' => env('BATCH_MAIL_USERNAME'),
    'password' => env('BATCH_MAIL_PASSWORD'),
    'encryption' => env('BATCH_MAIL_ENCRYPTION'),
],
```

おけ！！

## 実際のメール送信処理書こう
```php
<?php 
use Swift_Mailer;
use Swift_SmtpTransport;

class MailSend
{
    public function sendMailOtherServer()
    {
        //デフォルトのメーラーの設定をバックアップ取るらしい
        $backup = \Mail::getSwiftMailer();

        $transport = new Swift_SmtpTransport(config('mail.batch_mail_send.host'),
                                            config('mail.batch_mail_send.port'),
                                            config('mail.batch_mail_send.encryption'));

        $transport->setUsername(config('mail.batch_mail_send.username'));
        $transport->setPassword(config('mail.batch_mail_send.password'));

        $otherMailSetting = new Swift_Mailer($transport);

        \Mail::setSwiftMailer($otherMailSetting);

        //メール送ります
        \Mail::send();

        //デフォルトのメーラーの設定に戻すらしい
        \Mail::setSwiftMailer($backup);
    }
}

```

# おわりに
これで一件落着。。と思いきや、私はメール送信でキューを使うのよ！
これだと、キューで送信してもデフォルトのメールサーバーで送られちゃうのよ...

Stack Overflowの同じ記事のコメントに書いてあった↓
>That's great, but doesn't work for `Mail::queue($mail)`, why? 

>Emails sent with Mail::queue are sent on the worker process, not the current context where you are switching the mailer, to queue emails and send them like this, use jobs.

キューで送信するメールでメールサーバーを分けたいときは、jobを使用しなさいよって話。
これは気が向いたら記事を書こう。
（Laravelでキューでメール送信するときに、メールサーバーを分けたい話）

以上です。今日もお疲れさまです。
Linux Mint を 中古 windows 機にインストール

# Linux Mint を LIFEBOOK AH77/J にインストール
この度, windows8 から windows10 にアップデートされた LIFEBOOK AH77/J に最新版(2019-06-14)Linux Mint をインストールしたため, その手順を記していきます。
## LIFEBOOK AH77/J のスペック
![ah77/j](https://www.fmworld.net/fmv/pcpm1210/ah/images/ah77j_front_red.jpg)
https://www.fmworld.net/fmv/pcpm1210/ah/spec/
Core™ i7-3632QM
Windows 8 → Windows 10
標準8GB（4GB×2）/ 最大16GB
(デュアルチャネル対応DDR3 SDRAM PC3-12800)

日常で docker を使うことがあるのでメモリは 16GB までつめることを条件に探しました。
<img width="703" alt="スクリーンショット 2019-06-21 14.29.44.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278797/530eff59-961b-0f00-8dac-2bc820cb62c9.jpeg">
こちら amazon で 16GB 7000円ほどで購入して増設しました。

## windows10 の回復ディスク(USB)の作成
<img width="788" alt="スクリーンショット 2019-06-21 14.28.01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278797/be247dc3-bd0d-c403-1e47-1478859dc451.jpeg">
なぜリカバリーディスクではなく, 回復ディスクを作成するかというと, 今回の Windows 10 は Windows 8 からアップデートしたものだからです。
回復ディスクを使用すると, Windows 10 に復元することができます。無償アップデートができるかどうかわかりませんが, 気をつけましょう。
回復ドライブの作成には、32GB以上のUSBメモリが必要です。
回復ドライブを作成すると、USBメモリのデータはすべて削除されます。
詳しくは, このあたりのサイトを参考にしてください
(https://www.pasoble.jp/windows/10/kaifuku-drive.html)

## Linux Mint の ISO ファイルのダウンロード
https://www.linuxmint.com/download.php
今回は, Linux Mint 19.1 Tessa の Cinnamon 64bit を選択

## Linux Mint の インストールディスクの作成
<img src="https://3.bp.blogspot.com/-oWNrpOb61lc/W6DTfCwtX2I/AAAAAAABO8k/zKRG581TvK44THunZTmAOOtlchwMr8j8ACLcBGAs/s800/media_disc_blue.png" width="100">
先程ダウンロードしてきた iso ファイルをディスクまたは, USB に書き込みをします。
1.8GB ほどしかないので, 4.7GB の DVD ディスクで十分です。持ってない人は, USB に書き込みましょう。書き込む際は, ISO ファイルをディスク内に置くのではなく, ディスクの書き込みを行ってください。Mac だと, 読み込んだディスクにエイリアスを置いたあとに書き込みボタンを押す, windows だと, ISO ファイルを右クリックするとできると思います。
 
## Linux をインストールするためのパーティション分割
コンピュータ」を右クリックし、そして「管理」　>　「記憶域」　>　「ディスクの管理」をクリックして、Windowsの内蔵ディスク管理ツールを開きます。
<img width="722" alt="スクリーンショット 2019-06-21 14.30.59.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278797/8088d900-c31b-6e9c-99bd-15f30c2cef7a.jpeg">



ついでに不要そうな回復用パーティションを削除したい場合はこちらなどを参考にしてください
https://pc-karuma.net/windows-10-delete-recovery-partition-diskpart/

## BIOS から起動優先順位を変更
BIOS 設定を開いてください
(AH77/J では再起動をしてパソコン起動時にF2連打)
BIOS 設定から, boot → Boot Device Priority より, インストールディスクの優先順位を上げておきます。
## Linux Mint を SSD にインストール
インストールディスクから Linux Mint が無事開きましたら, デスクトップ上にある Install Linux Mint を実行します。
そして, 進めていくとインストール形式を選ぶことができるのですが, windows10 は残したままにしたいので, 「Linux MintをWindows10とは別にインストール」を選びます。
そして, そのまま進めていくと無事 Linux Mint がインストールされるはずです。
再起動時には, また読み込みの優先順位を戻す, ディスクを抜くなどして, SSD から起動してください。
<img width="655" alt="スクリーンショット 2019-06-21 14.35.20.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278797/962abb13-d8c4-2382-a1fd-52e8491e06e5.jpeg">
何も詰まることなくあっさりとインストールできました。タッチパッドも初期では感度が遅く感じましたが設定から簡単に変更でき, 普通に使えてとても快適です。
次の記事では, Linux Mint に初期にインストールしたランチャーなどを紹介したいと思います。

参考にしたサイト
https://hosopro.blogspot.com/2016/09/windows10linux-mint.html
Rubocopで差分のあるファイルだけlintする場合のワンライナー

Rubocopを全ファイルに実行すると、大変ですよね。
差分のあるファイルだけ実行する場合はこちらがおすすめ

## 前のコミットからの差分だけ実行する場合

```bash
$ git diff --name-only | grep -e '\.rb$' -e '\.thor$' | xargs bundle exec rubocop -a
```

`--name-only`でファイル名だけ取得、`HEAD`で前のコミットを指定を指定。出力結果をパイプで`rubocop`に渡しています。
この時 `xargs`がないと前の出力結果が引数として渡されないので注意

あとは、`--name-only`の後にブランチ名（`master`）などにすれば、特定ブランチとの差分に対しての実行なども出来ます。
gitが使える最低知識を学んでみる

# 1.はじめに
gitを久しぶりに使うのでコマンドを振り返ってみました。

ほぼ、投稿練習＋自分の振り返り用です。

# 2.gitとは？

とりあえず、wikipedia参照してみる

>**ファイルのバージョン管理を行うシステム**
>履歴の調査や変更の記録といった作業ができるようになる
>>https://ja.wikipedia.org/wiki/Git


この辺はgitの基本知識ですね。


# 3.主なコマンド

#### 1. git clone

リモートのリポジトリをローカルにコピーする

**<font color="Salmon">マスターブランチの場合</font>**

```
git clone リポジトリURL
```

**<font color="Salmon">マスターブランチ以外の場合</font>**
-bオプションをつけてあげる必要がある

```
git clone -b ブランチ名 リポジトリURL
```

#### 2. git branch
新たなブランチを作成する

```
git branch ブランチ名
```

#### 3. git checkout
他のブランチに移動する

```
git checkout ブランチ名
```

#### 4. git add

変更履歴を記録するファイルを指定する

```
git add ファイル名

# 取り消し
git reset HEAD
```

#### 5. git commit
addされたファイルにメッセージをつけるためのコマンド

```
git commit -m 'コミットメッセージ'

#　取り消し
git reset --hard HEAD^
```


#### 6. git push
ローカルリポジトリの内容をリモートリポジトリに反映させる

```
git push origin ブランチ名

# 取り消し（ローカル消える、履歴消える）
git reset --hard HEAD^
git push origin +master

# 取り消し（ローカルは消えない、履歴残る）
git revert HEAD
```

#### 7. git pull
リモートリポジトリの内容をローカルリポジトリに反映させる

```
git pull origin ブランチ名

# 強制pull (リモートに合わせたい時)
git fetch origin master
git reset --hard origin/master

# ローカルで上書き
git stash
git pull
git stash pop
```

# 4.その他
gitignoreが反映されない時

```
git rm -r --cached . //ファイル全体キャッシュ削除
```

変更履歴が見たい時

```
git diff --cached　# git add後
git diff HEAD^ # git commit後
```



# 5.終わりに
　gitが使える最低限の知識を書き出しました。
　
　この他のコマンドを学んだときは、積極的に追加していきたいと思います。
실시간카지노➠ 784YES.COM ➠실시간카지노사이트

<a href="https://rsgoffroad.com/?s=%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">실시간카지노</a>
<br><br>
<a href="https://rsgoffroad.com/?s=%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">실시간카지노</a>
<br><br>
<a href="https://rsgoffroad.com/?s=%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">실시간카지노</a>
<br><br>
<a href="https://rsgoffroad.com/?s=%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">실시간카지노</a>
<br><br>
JSFの<h:outputScript><h:outputStylesheet>で出力されたURLに任意のパラメータをつける

# はじめに

JSFのFaceletsで読み込んでいるJavascriptやCSSについて、最新のものを取得するためにビルド時に動的にパラメータを付ける方法です。
修正前）vendor.js
修正後）vendor.js?v=12345678

これでスーパーリロードともお別れ。

# 手順

ResourceHandlerWrapperクラスを継承したクラスを作成します。

```java:CustomResourceHandler.java
package com.sample;

import java.util.Arrays;
import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.application.ResourceHandlerWrapper;
import javax.faces.application.ResourceWrapper;

public class CustomResourceHandler extends ResourceHandlerWrapper {

    private final ResourceHandler wrapped;

    public CustomResourceHandler(ResourceHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public Resource createResource(String resourceName) {
        return createResource(resourceName, null, null);
    }

    @Override
    public Resource createResource(String resourceName, String libraryName) {
        return createResource(resourceName, libraryName, null);
    }

    @Override
    public Resource createResource(String resourceName, String libraryName, String contentType) {
        final Resource resource = super.createResource(resourceName, libraryName, contentType);

        if (resource == null) {
            return null;
        }

        if (!Arrays.asList("js", "css").contains(libraryName)) {
            // JavascriptとCSSの対象とする
            return resource;
        }

        return new ResourceWrapper() {

            @Override
            public String getRequestPath() {
                return super.getRequestPath() + "&(任意のクエリパラメータ)";
            }

            @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
            public String getResourceName() {
                return resource.getResourceName();
            }

            @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
            public String getLibraryName() {
                return resource.getLibraryName();
            }

            @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
            public String getContentType() {
                return resource.getContentType();
            }

            @Override
            public Resource getWrapped() {
                return resource;
            }
        };
    }

    @Override
    public ResourceHandler getWrapped() {
        return wrapped;
    }

}
```

faces-config.xmlに上記で作成したハンドラを登録します。

```xml:WEB-INF/faces-config.xml
<application>
  <resource-handler>com.sample.CustomResourceHandler</resource-handler>
</application>
```

# 参考

- [How to use JSF versioning for resources in jar](https://stackoverflow.com/questions/18143383/how-to-use-jsf-versioning-for-resources-in-jar)
Chromeでページ内検索(Ctrl + F)をしたあとにその検索窓を消す方法

# Chromeでページ内検索(Ctrl + F)をしたあとにその検索窓を消す方法
ページ内検索をしたあとにそのタブを閉じるなど一部のショートカットが使えないので使えるようにする方法

## 解決策

* 本質的な方法ではないが、Ctrl + Rでページを更新することで検索窓が消えて、タブを閉じるなどのショートカットが使えるようになる。

### 追記

Escで消せる！（本質的な解決方法っぽい）
２日目　基本のキ（小トピック）

#今日の学び一覧
・VSCodeの作業が効率的になるいくつかの知識
・チェリーピック
・CSSファイルの上に絶対つけなければいけないもの
・HTMLのPタグ乱用禁止
・Bemはブロックが省略化

##VSCodeの作業が効率的になるいくつかの知識
【**ワークスペース**について】
よく使うディレクトリをワークスペースとして保存しておくことで、
いつでも作業できる！

[こちらの解説がわかりやすい。VS Codeのワークスペース](https://qiita.com/YuichiNukiyama/items/ef16a0219f46ea03a045)

フォルダ→フォルダーをワークスペースに追加
でワークスペースにすることができる。


【**VSCodeの作業中ファイル一覧をだすショートカット(Mac)**】
Cmd + Bでバビュンとでる。隠す時も同様

##チェリーピック
SourceTreeにて、ブランチを切ってからコミットしないといけないのを、
ブランチせずにmasterでコミットしてしまった、、、

【解決方法】
間違えたコミット部分を右クリックで削除後、コミット。（一個前に戻す）
作業したのに反映されてない部分を右クリックで、チェリーピックする。
するとその部分だけでブランチが切れる！

##CSSファイルの最初の行に必ず入れるもの##
それは、、
**キャラセット。**

```CSS
@charaset 'UTF-8'
```
を必ず入れる。

##HTMLのPタグ乱用禁止##
```HTML
<!-- ダメな例 -->
<p> 総天然色の青春グラフィティや一億総プチブルを私が許さないことくらい,</p>
<p>オセアニアじゃあ常識なんだよ！</p>
```
pはparagraph,つまり段落なので、
まとまっているものを個別に分けるのはナンセンスらしい。

```HTML
<!-- 好ましい例-->
<p> 総天然色の青春グラフィティや一億総プチブルを私が許さないことくらい,<br>
オセアニアじゃあ常識なんだよ！</p>
```

##Bemはブロックが一部省略可
まずはおさらい(MindBEMdingの表記)。

```HTML
<nav class="container">    <!-- Block -->
 <a href="#" class="container__btn">OK</a> <!-- elementはで表現 -->
 <a href="#" class="container__btn--yellow">OK!</a> <!-- Modifierは--で表記-->
</nav>
```


場合によっては、ネストしまくるとクラス名が蛇のようになる。

```HTML
<div class="container__mainlist__item__cover__text">
 <!-- ながっ -->
```

なので、省略が可能である。省略する時は、
接頭辞にアンダーバー一つを入れる。

```HTML
<div class="container">
   <div class="container__main">
      <div class="container__main__block">
         <div class="_block__icon">     <!-- 省略！ -->
```
Ubuntu 18.04でのVPNクライアント設定

## 概要

Ubuntu16.04使用時、「network-manager-l2tp-gnome」を使用して外部のVPNへ接続していた。
だが、Ubuntu18.04にアップデートした所、VPN接続が出来なくなっていた、、、
当時、同様の症状で巷はもちきり(kernel 4.15.xxのバグ？）だった為、バージョンアップにより解消されるだろうとしばらく放置を決め込んでいた。

回避策として、 *仮想マシン上のUbuntu16.04からVPN接続＆プロキシサーバを立て、ホストマシンのUbuntu18.04からUbuntu16.04を経由してVPNへ接続* していた。。。

あれから約1年、、、いい加減解消されてるはず！

## カーネルバージョンアップにより解消を試みた結果

期待を込めて、

```sh:
$ sudo apt install linux-image-4.18.0-22-generic
$ sudo reboot
```

、、、キーボードが効かない！！！
自宅のPCはMacBook Pro、よくわからないので諦める。

## NetworkManager-l2tpで対応している模様

[NetworkManager-l2tp][1]で対応されているらしいので入れてみる。
[1]:https://github.com/nm-l2tp/NetworkManager-l2tp/blob/master/README.md

```sh:必要パッケージインストール
$ sudo apt install git autoconf automake libtool intltool libglib2.0-dev \
  ppp-dev libssl-dev libnss3-dev libgtk-3-dev libnma-dev libsecret-1-dev \
  xl2tpd strongswan
```

```sh:clone
$ git clone https://github.com/nm-l2tp/NetworkManager-l2tp.git
$ cd NetworkManager-l2tp
```

```sh:ビルド＆インストール
$ ./autogen.sh
$ ./configure --prefix=/usr \
  --sysconfdir=/etc --localstatedir=/var \
  --libdir=/usr/lib/x86_64-linux-gnu --libexecdir=/usr/lib/x86_64-linux-gnu \
  --with-pppd-plugin-dir=/usr/lib/pppd/2.4.7 --enable-absolute-paths
$ make
$ sudo make install
```

## 何やらボタンが増えている！

![Screenshot from 2019-06-21 13-27-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223169/6ad8b5e5-9937-f8dd-f60d-be695dc3f5b6.png)

「Legacy Proposals」ボタンなるものが増えている。
※1年前はPhase Algorithmesを色々な組み合わせで試してもだめでした、、、

ボタンを押して接続して見ると、、、
接続成功！

20.04はスムーズに接続できる事を切に願います。
Anaconda上のjupyter notebookでtensorflowが動かない

# 問題点
仮想環境から起動したjupyter notebook上で仮想環境にインストールしたパッケージがimportできない

# 解決策
仮想環境にもjupyterをインストールする。

# 例. tensorflowが動かない

```
C:\Users\ktanaka> conda create -n tensorflow python
C:\Users\ktanaka> conda activate tensorflow
(tensorflow) C:\Users\ktanaka> pip install --ignore-installed --upgrade tensorflow
(tensorflow) C:\Users\ktanaka> jupyter notebook
```
1行目：tensorflowという名前でpythonだけがインストールされた仮想環境を構築
2行目：構築した仮想環境をactivate
3行目：tensorflowをインストール
4行目：jupyter notebookを起動

仮想環境にjupyterがインストールされていないためbaseのjupyter notebookが起動する。
（仮想環境のパスが優先されているだけなので、仮想環境上でツールが見つからない場合、パスに登録されているbase環境のツールが起動する）


```
import tensorflow as tf
```

起動したJupyter notebook上でtensorflowをimportしようとしても・・・

```
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-98d4364fe1cb> in <module>
----> 1 import tensorflow as tf

ModuleNotFoundError: No module named 'tensorflow'
```

baseの環境にはtensorflowがimportされていないのでエラーが出る。

```
(tensorflow) C:\Users\ktanaka>python
Python 3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>>
```

対話型のpythonだと仮想環境にインストールされたpythonが起動するので問題なくimportできる。

```
(tensorflow) C:\Users\ktanaka> conda install jupyter
(tensorflow) C:\Users\ktanaka> jupyter notebook
```

1行目：仮想環境上でjupyterをインストールすることで
2行目：仮想環境上のjupyter nootebookが起動する。

```
import tensorflow as tf
```

仮想環境にインストールしたtensorflowがインポートできる。
【vim-plug】InsertEnterイベントで遅延読み込み

# 前置き
ここ数年プラグインマネージャにはvim-plugを使わせてもらってますが、
遅延読み込みの種類が少ないのが難点でした。
neobundleの様なInsertEnterで発火する遅延読み込みが欲しい！と思い
Githubのプルリクを見てみると、既にイベント(autocommand)で遅延読み込みするプルリクを作成している方がいらっしゃいました。
それが2017年の事・・vim-plugの作者のjunegunn氏はInsertEnterやCursorHold等のイベントで発火する遅延読み込みには懐疑的なようです。
しかし、そんな我々にjunegunn氏は光を授けて下さっていました。(https://github.com/junegunn/vim-plug/issues/48#issuecomment-51688885)

## 環境
* vim 8.1
* vim-plug

# InsertEnterで遅延読み込み
vim起動時にはプラグインを読み込ませず、初めてインサートモードに入った瞬間にプラグインのロードをする設定です。

```vim
call plug#begin('~/.vim/plugged')

Plug 'Shougo/deoplete.nvim',       { 'on': [] }
Plug 'roxma/nvim-yarp',            { 'on': [] }
Plug 'roxma/vim-hug-neovim-rpc',   { 'on': [] }
Plug 'ujihisa/neco-look',          { 'on': [] }
Plug 'Shougo/neco-syntax',         { 'on': [] }
Plug 'Shougo/neosnippet.vim',      { 'on': [] }
Plug 'Shougo/neosnippet-snippets', { 'on': [] }

call plug#end()

" Load Event
augroup load_us_insert
    autocmd!
    autocmd InsertEnter * call plug#load(
                \ 'vim-hug-neovim-rpc',
                \ 'nvim-yarp',
                \ 'neco-syntax',
                \ 'neco-look',
                \ 'deoplete.nvim',
                \ 'neosnippet.vim',
                \ 'neosnippet-snippets',
                \ )| autocmd! load_us_insert
augroup END
```

これで、まだインサートモードに入っていない状態でPlugStatusするとnot loadedとなり
一度インサートモードに入った後はOKと表示されていると思います。
deopleteが特に起動時に遅かったので、これでだいぶ速くなりました。

# CursorHoldで遅延読み込み
カーソルが一定時間静止していると発火するイベントです。
こちらも上と同じように記述出来ます。

```vim
" CursorHold 判定までの時間
set updatetime=250

call plug#begin('~/.vim/plugged')

Plug 'tomtom/tcomment_vim',    { 'on': [] }
Plug 'itchyny/vim-cursorword', { 'on': [] }
Plug 'vimtaku/hl_matchit.vim', { 'on': [] }

call plug#end()

" Load Event
augroup load_us_hold
    autocmd!
    autocmd CursorHold * call plug#load(
                \ 'hl_matchit.vim',
                \ 'vim-cursorword',
                \ 'tcomment_vim',
                \ )| autocmd! load_us_hold
augroup END
```
updatetimeでCursorHoldと判定される時間を指定出来ます。
vim起動後に250ミリ秒カーソルを動かさずにいるとプラグインが読み込まれます。
イベントは他にも沢山あるので、色んなイベントに応じて遅延読み込みさせることも出来そうですね。 

# vimのタイマー機能で遅延読み込み
最近？vimに追加された機能で、vim起動後の一定時間後に発火させることが出来ます。

```vim
call plug#begin('~/.vim/plugged')

Plug 'tiagofumo/vim-nerdtree-syntax-highlight', { 'on': [] }
Plug 'tak3228/auto_blank_out',                  { 'on': [] }
Plug 'tak3228/eco_cursorline',                  { 'on': [] }
Plug 'Raimondi/delimitMate',                    { 'on': [] }

call plug#end()

" Load Event
function! s:load_plug(timer)
    call plug#load(
                \ 'delimitMate',
                \ 'auto_blank_out',
                \ 'eco_cursorline',
                \ 'vim-nerdtree-syntax-highlight',
                \ )
endfunction

" 500ミリ秒後にプラグインを読み込む
call timer_start(500, function("s:load_plug"))
```
vim起動後、500ミリ秒後にプラグインが読み込まれます。

# まとめ
vimの起動が2,3秒くらい速くなりました。
稚拙ですが、どうかご参考程度に。
sidekiqの管理画面にアクセス時、Basic認証をつける

##はじめに

僕はRailsで非同期実行の機能を実装するときいつもSidekiqを使っています。
 Sidekiqには管理画面があり、routes.rbに以下のコードを記述すると実装できます。

```ruby:config/routes.rb
   require 'sidekiq/web'
   mount Sidekiq::Web, at: "/sidekiq"
```

[http://localhost:3000/sidekiq](http://localhost:3000/sidekiq)にアクセスすると、管理画面に飛ぶことができます。
<img width="1435" alt="スクリーンショット 2019-06-21 12.41.01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441198/bc26832d-ef1e-000e-4b04-dff94b53ab47.jpeg">
スタイリッシュでおしゃれなデザインですね！

##管理画面にBasic認証を入れる

ただこのままデプロイすると誰でも/sidekiqの管理画面を見ることができてしまいます。
管理画面にはBasic認証がつけられるので、config/initializers/sidekiq_password.rbを作成し、
以下のコードを記述しましょう。

```ruby:config/initializers/sidekiq_password.rb
  require 'sidekiq'
  require 'sidekiq/web'

  #Basic認証時のユーザー名とパスワードを設定する
  Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
    [user, password] == [ENV['SIDEKIQ_USER'], ENV['SIDEKIQ_PASSWORD']] #環境変数にて設定
  end
```
ユーザー名とパスワードは環境変数を使って設定するようにしましょう。
/sidekiqへアクセス時、Basic認証を使うよう、routes.rbを以下のように変更します。

```ruby:config/routes.rb
  require 'sidekiq/web'
  authenticate :user do #authenticate
    mount Sidekiq::Web => '/sidekiq'
  end
```

認証機能を追加するGemの[clearance](https://github.com/thoughtbot/clearance#access-control)を利用して認証することもできるそうです。
https://github.com/mperham/sidekiq/wiki/Monitoring#user-content-clearance


さて、これで[http://localhost:3000/sidekiq](http://localhost:3000/sidekiq)へアクセスすると
(※ローカルサーバーを立ち上げ直すことを忘れないでください。)
<img width="459" alt="スクリーンショット 2019-06-21 13.23.14.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441198/166582cf-c68c-eca2-f97b-5665f2b891ed.jpeg">

しっかりBasic認証の画面が表示されるようになってます！

SidekiqをRailsで利用される際は、セキュリティ対策にもBasic認証を管理画面に入れることをオススメします。
php-mecabインストール

基本的な流れは、こちらを参考にした。
https://qiita.com/yusukeito58/items/36aeb7f6376e7b9b9d7e

一部いまくいかなかったところがあったので以下に記載。

### php-mecab入れる際にmakeが反応しない
Makefile.globalをコピーしてMakefileを作成してmakeコマンド実行

```
// makeコマンド実行
$ make
Build complete.
Don't forget to run 'make test'.

// make install実行
$ sudo make install
// エラーが出る
mkdir: /usr/local/Cellar/php@7.1/7.1.18/pecl: File exists
mkdir: /usr/local/Cellar/php@7.1/7.1.18/pecl: No such file or directory

// エラーが出ているディレクトリを確認
$ ls -al /usr/local/Cellar/php@7.1/7.1.18/pecl
lrwxr-xr-x  1 katsuki_y  admin  23  6 16  2018 /usr/local/Cellar/php@7.1/7.1.18/pecl -> /usr/local/lib/php/pecl

// File existsとあったのでシンボリックリンクを削除
$ unlink /usr/local/Cellar/php@7.1/7.1.18/pecl

// 再度インストール
$ sudo make install
Installing shared extensions:     /usr/local/Cellar/php@7.1/7.1.18/pecl/20160303/

// php.iniに以下を加える
// /usr/local/Cellar/php@7.1/7.1.18/pecl/20160303/mecab.so
```
これで成功しました！
【Postgresql】Date型の値ありとNULLを比較した場合の評価

# はじめに
テーブル定義で`NOT NULL`のところに`NULL`が入ってきたらまずいなと思い、Date型で`値あり`と`NULL`を比較したときにどう評価されるのかを調べた。

検証バージョン：PostgreSQL 10.4 

```sql:テスト用テーブル

-- nullを'NULL'と表示
\pset null NULL

SELECT * FROM table_a;
 id |  foodate   
----+------------
 1  | 2000-01-01
 2  | 2000-01-02
 3  | 2000-01-03
(3 rows)

SELECT * FROM table_b;
 id |  foodate   
----+------------
 1  | 2000-01-01
 2  | 2000-02-01
 3  | NULL
(3 rows)
```

- `id='1'`は両者同じ値。
- `id='2'`は`'2000-01-02'`と`'2000-02-01'`なので異なる値。
- `id='3'`は`'2000-01-03'`と`NULL`。 **← これがどう評価されるか。**


# 検証
```sql:
SELECT 
	a.id,
	a.foodate <> b.foodate as result
FROM 
	table_a a
LEFT JOIN
	table_b b
ON a.id = b.id

 id | result 
----+--------
 1  | f
 2  | t
 3  | NULL

```
`id='3'`は`FALSE`を想定していたが、返ってきたのは`NULL`。


そして、`WHERE句`では`NULL`がどう評価されるのか。

```sql:
SELECT 
	a.id
FROM 
	table_a a
LEFT JOIN
	table_b b
ON a.id = b.id
WHERE
	a.foodate = b.foodate;

 id 
----
 1
(1 row)
```

これは想定内。

```sql:
SELECT 
	a.id
FROM 
	table_a a
LEFT JOIN
	table_b b
ON a.id = b.id
WHERE
	a.foodate <> b.foodate; --ここだけ変更

 id 
----
 2
(1 row)
```
`'NULL`と等しい値はない=>`FALSE`と評価され`id='3'`は戻ってくると考えていたのだが返ってこなかった。
**条件が一致したものだけが返ってくる**ようだ。**`NULL`は評価の対象にならずに無視されるということかもしれない**。

# 感想
`NULL` が無視されるのであれば、当初の気がかりはとりあえず解消だが、PostgreSQL以外のSQLやPostgreSQLでもバージョンが異なれば違う結果となることは考えられるので、この結果を前提にはしないほうが良いでしょう。

# 追記
その後、SQLの本を読んでいたら本記事の内容は`3値論理`というしくみによるものらしい。理論を理解するのは難しいですが、ポイントは以下の３つでしょうか。

 - `NULL` の入った値を比較すると`unknown`が返る。
 - 比較式の評価で返ってくるのは `true` のみ。
 - Postgresは *`unknown` を `NULL` で代替する*（`a.foodate <> b.foodate as result` が `NULL` だったのは、このためだろう）。

参考:
[NULL を比較すると UNKNOWN が返る](https://odashinsuke.hatenablog.com/entry/20110809/1312848042)
[3値論理とNULL](https://codezine.jp/article/detail/532)
[第8回　SQLにおける論理演算～なぜ真理を隠すのか～　（1）各DBの真理値型のサポート](http://gihyo.jp/dev/serial/01/sql_academy2/000801)
cloudwatch logsに吐き出したapache logをいい感じに集計する


# はじめに

だいぶ前の話ですが、2018年11月に「Amazon CloudWatch Logs Insights」がリリースされました。
ざっくりいうと、SQLっぽいクエリでCloudWatch Logsを集計できる。というものです。

# 使い方

AWSブログより
https://aws.amazon.com/jp/blogs/news/new-amazon-cloudwatch-logs-insights-fast-interactive-log-analytics/

- AWS CloudWatchの右メニューから「インサイト」を選択
- ページトップにある虫眼鏡テキストから対象ログを選択、その右から期間を指定
- クエリ入力欄に集計条件を入力
- 「クエリの実行」ボタンを押下

今回はWebサーバのApacheログを指定し、実際に集計してみます。

```
fields @message
| parse '* * - - [*] "* * *" * * "*" "*" "*" "*" "*"' as ip1, ip2, time, httpVerb, url, protcol, statusCode, size, refer, ua, nanka1, nanka2, nanka3
| filter statusCode != 200
| stats count(*) as cnt by statusCode
| sort cnt desc
```

- 対象ログによって、フィールドが定義されています。利用できるフィールドは画面右側の「クエリのヘルプ」から確認できます。今回はApacheログそのものが入っている `@message` をfields句で指定します。
- 指定したフィールドのフォーマットをparse句で指定します。サーバーによってログフォーマットが異なると思いますのでご注意を。
- filter句で抽出条件があるなら指定します。
- stats句で集計方法および集計対象（SQLで言うところのgroup by句）を指定します。
- ソート指定があればsort句で。limitも使えます。

実行結果はこんな感じ
指定した時間内でHTTPステータス（200以外）の件数を集計しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55290/406c4f50-d8cb-3201-9047-3eb800d4db3a.png)

# おわりに

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html

APIも提供されているので応用すれば、Lambdaとかと組み合わて色々できるハズです！
【WordVBA】読み取り専用で開き直す

# 姿を消した「読み取り専用の設定/解除」コマンド
仕事中に共有サーバー上のドキュメントを、読み取り専用で開きたくなることはありませんか？
そんなわけでサクッと「読み取り専用の設定/解除」コマンドをクイックアクセスツールバーに登録しようとたんですが、「すべてのコマンド」をどんなに探しても見つかりません。Excel2013には存在するのに。
ググっても引っかかる記事はみんな2007以前。Office2007の頃は存在していたのか…
なぜ…なぜ消した…なぜなんだ…~~毎度バージョンアップで改悪するのはいい加減やめてくれ。バグは残したままなのに。~~

仕方ないのでVBAで書いてアドインとして保存してクイックアクセスツールバーに登録することにしました。

# コード
新しいファイル開いてVBE起動して標準モジュール挿入してそこに貼り付けるだけ。
そのファイルは拡張子を`.dotm`で保存して一旦閉じてください。「Word マクロ有効テンプレート」だったかな。

読み取り専用の時にマクロを実行すると、読み取り専用を解除して開き直すようになっています。

```VB
Option Explicit

' 現在のファイルを上書きせずに閉じて読み取り専用で開き直す
Public Sub OpenReadOnly()
    With ActiveDocument
        If Len(.path) = 0 Then
            ' 未保存のファイルなら処理終了
            Exit Sub
        End If
        Dim path As String: path = .FullName
        Dim isReadOnly As Boolean: isReadOnly = Not .ReadOnly
        ' 上書きせずに一度閉じる
        Call .Close(SaveChanges:=wdDoNotSaveChanges)
    End With

    ' 開き直して印刷レイアウトで表示
    With Documents.Open(FileName:=path, ReadOnly:=isReadOnly)
        .ActiveWindow.View.Type = wdPrintView
    End With
End Sub
```

# 設定方法
アドインとして読み込んでからクイックアクセスツールバーに登録します。

## 1.アドインとして読み込む
「Word のオプション」の「アドイン」を開いて、下部の「管理」プルダウンから「Word アドイン」を選択して「設定」ボタンを押下。
開いたダイアログの「追加」ボタンを押下して、ファイル選択ダイアログからファイルを選択する…んですが、デフォルトフォルダが「Templates」なので、STARTUPフォルダに移動。
`C:\Users\ユーザ名\AppData\Roaming\Microsoft\Word\STARTUP`
`.dotm`で保存したファイルをSTARTUPフォルダに格納して選択、元のダイアログに選択したファイル名が表示されてチェックが入っているのを確認して「OK」ボタンでダイアログを閉じます。

## 2.クイックアクセスツールバーに登録
「Word のオプション」の「クイック アクセス ツール バー」を開いて、「コマンドの選択」から「マクロ」を選択。
「Project.Module1.OpenReadOnly」があると思うので選択して、「追加」ボタンでクイックアクセスツールバーの好きな位置に登録。
アドインファイルを保存するときにモジュール名を変更した場合は、「Module1」の部分がその変更したモジュール名になります。
追加したはいいけどアイコンがマクロ共通のよくわからんやつになっているので、「変更」ボタンを押下して「ボタンの変更」ダイアログを開き、アイコンと表示名を好きなように変更して「OK」ボタンでダイアログを閉じます。
あとは「OK」ボタンで「Word のオプション」を閉じて完了。

以上、「現在開いているファイルを保存せずに閉じて読み取り専用として開き直す」をクイックアクセスツールバーから実行できるようにする手順でした。ちゃんちゃん:relaxed:


# おまけ
PowerPoint版のマクロも書いたんですよ。実は。

```VB
Option Explicit

' 現在のファイルを上書きせずに閉じて読み取り専用で開き直す
Public Sub OpenReadOnly()
    With ActivePresentaion
        If Len(.path) = 0 Then
            ' 未保存のファイルなら処理終了
            Exit Sub
        End If
        Dim path As String: path = .FullName
        ' 上書きせずに一度閉じる
        .Saved = msoTrue
        Call .Close
    End With
    ' 読み取り専用で開く
    Call Presentations.Open(FileName:=path, ReadOnly:=msoTrue)
End Sub
```

でもね、パワポのアドイン形式「.ppam」で保存して読み込むじゃん？VBEに保存したプロジェクトは表示されないし、クイックアクセスツールバーのマクロにも表示されないからどうやって呼び出すのかわかんない…
ググったらなんか手順がいろいろあるようで、サクッとどうにかしたかったわたしの心は折れたのでした。～Fin～

そんなパワポVBAの汎用アドイン化の手順はこちらが詳しいです。
[PowerPointのマクロを共有化して使う方法 | 初心者備忘録](https://www.ka-net.org/blog/?p=8488)
すごくマクロを必要とする状況に追い込まれたらやってみようと思います…

**M$はOfficeの仕様を統一して！！！！！**
例えばさ、「最近使ったファイル一覧」ってWordとExcelでは「Application.RecentFiles」で取得できるんですけど、PowerPointには「Application.RecentFiles」自体が存在しなかったりするんですよね…
「ファイル」リボンにはあるじゃねえか！何でだよ！！わけわかんねえよ！！
ExcelとAccess以外のOfficeでVBA使おうとすると詰みがち…Outlookも情報が少ないし大変だった記憶ある…
Typescriptで型定義(interface)のみのファイルをトランスパイルする

# 何が起きたか？

* とあるTypescriptとJavascriptの混在環境で，JavascriptからTypescriptをインポートするコードを書いた．
* Typescriptがトランスパイルされて，Javascriptにされた後，JavascriptがTypescript(だったもの)のファイルをインポートする
* また，Typescriptは型定義のみのTypescriptのファイルをインポートしている．

要は以下のような感じ

型定義ファイル

```typescript:Types.ts
export {HogeType};

interface HogeType {
    x: number;
}
```

型定義をインポートして型を使う関数を書いたファイル

```typescript:useType.ts
import {HogeType} from "Types"
export {getHogedData};

function getHogedData(): HogeType {
    let hogeData: HogeType;
    // do hoge
    return hogeData;
}

```

型定義をインポートした関数を使う**javascript**のファイル

```javascript:useGetHogedData.js
import {getHogedData} from "useType";

function useGetHogedData() {
    const hoged = getHogedData();
}
```

さて，以上のコードはランタイムエラーとなる．

# なぜか

Typescriptにおけるinterfaceやtypeはコンパイル時の型チェックのみに使用され，コンパイル後には無くなる．
単一のファイルに型のみを書くと**ファイルごと消える(?)**そして，**無いファイルをインポートしようとしているファイルも消える**(なぜかは不明)
よって，実行時には`Types.js`と`useType.js`が消えて，`useGetHogedData.js`はインポートエラーを吐いて終了する．


# 実は

以下の2つの書き方は結果が異なるようである．

```typescript:interface1.ts
export {HogeType};

interface HogeType {
    x: number;
}
```

```typescript:interface2.ts
export interface HogeType {
    x: number;
}
```

前者はファイル自体が生成されないが，後者はファイルだけ生成される(中身は`'usestrict'`のみ)
よって後者だとちゃんとランタイムエラーは起きず，動く．

不思議だ....
FlutterでiOS/Android 識別ID取得


Flutterアプリ開発において使用APIのリクエストとしてデバイスを識別するためのIDが必要な場面があったのでiOS、Androidでそれぞれ個体識別IDを取得してみた。

iOSはUUID、AndroidならデバイスIDがそれぞれ個体識別IDになる
これらを取得するには**device_info**パッケージを使用する

## パッケージの取得


`pubspec.yaml`

```yaml
dependencies:
  flutter:
    sdk: flutter
  device_info: ^0.4.0+2
```

Packages Getでパッケージをインストール

## 実際にID取得

device_infoパッケージを`import`する

```dart
import 'package:device_info/device_info.dart';
```

### Android
```dart
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
print('Running on ${androidInfo.androidId}');  // => Android デバイスID出力
```

### iOS
```dart
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
IosDeviceInfo iosDeviceInfo = await deviceInfo.iosInfo;
print('Running on ${iosDeviceInfo.identifierForVendor}');  // => iOS UUID 出力
```
composer install composer update の使い方

今まで `composer install` `composer update` を雰囲気で使っていたため、使い方をまとめました。

## composer install
composer.lock があれば、このファイルをもとにライブラリをインストールします。
ない場合は、composer.jsonに書かれている最新のライブラリのバージョンをインストールし、
composer.lock ファイルを作成します。

## composer update
composer.jsonに書かれている最新のライブラリのバージョンをインストールします。
composer.lock もそのバージョンに更新されます。

## 一部のライブラリと、それと依存関係のあるライブラリだけバージョンをあげたい場合

例：doctrine/dbalだけバージョンをあげたい

```
composer update doctrine/dbal --with-dependencies
```
Passed AWS SysOps Exam

I just passed the AWS SysOps exam today.

Preparation:

Acloudguru : Great instructor. The videos are amazing from beginning to end. His lectures are very clear. It really helped me to understand a lot in AWS Operations and System. His materials are well organized and updated too.
awslagi.com : highly recommend you take this for your preparation. I spent time to resolve all of questions on this part. This is real questions was appeared in my exam. Take guarantee part if you want to make sure pass the AWS SysOps exam.
Read the Security White Papers & FAQ’s
About the exam:

All most the questions in the exam is the “how to troubleshoot” or “how to use them to solve a problem”. AWS Organization (how to restrict accounts) CLI (familiarize yourself with this), NAT Gateway, NAT Instance, Storage/ Data management, Autoscaling, AWS Service Catalog, A few questions on Systems Manager, MultiAZ & Read Replica, Nothing on Beanstalk and Kinesis. Lots of questions on VPC (know how to fix problems in the VPC). I also got 2 questions on Loadbalancing how to attach a certificate to load balancer, A lot of questions about the details of S3 access (Bucket Policies, ACL, Policy details), EFS, Cloudfront, Cloudtrail, Config, Cost Reporting, Scalability, know when to use Cloudwatch, different EBS types, Personal health dashboard (how to set up automatic alerts)
一時的なProxyサーバの構築

社内のインターネットにアクセスができないPCを一時的にインターネットにアクセスさせるためにProxyサーバを構築した。
このProxyでそんなに深いことはしない。


いつもの

```
[root@master ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
```

使用したのはTinyproxy
https://tinyproxy.github.io/

```
[root@master ~]# yum install tinyproxy　-y

~(略)~

#install完了後
cp /etc/tinyproxy/tinyproxy.conf /etc/tinyproxy/tinyproxy.conf.org 
vim /etc/tinyproxy/tinyproxy.conf 
```

Configの簡単な説明
User:実行ユーザ。面倒なことが起こっても嫌なのでrootに変えた。異論は認めます。
Port:プロキシサーバの受けるポート。今回の場合、社内のインターネットにアクセスできないPCがインターネットにアクセスするときにここで指定したポートに接続することでインターネットにアクセスできる。初期状態だと8888。私は8080に変えた。
Allow:プロキシサーバに接続できるIPアドレスの指定。IPアドレスを直接指定したり、サブネット単位でもOK。

今回の私だとこんな感じ。
(コメントの行は省略しています)

```

[root@master ~]# cat /etc/tinyproxy/tinyproxy.conf

User root
Group root

Port 8080

Timeout 600

DefaultErrorFile "/usr/share/tinyproxy/default.html"


StatFile "/usr/share/tinyproxy/stats.html"

LogFile "/var/log/tinyproxy/tinyproxy.log"
LogLevel Info

PidFile "/var/run/tinyproxy/tinyproxy.pid"

MaxClients 100


MinSpareServers 5
MaxSpareServers 20


StartServers 10

MaxRequestsPerChild 0

Allow 192.168.100.100
Allow 192.168.200.0/24

ViaProxyName "tinyproxy"
FilterCaseSensitive On


ConnectPort 443
ConnectPort 563
```

保存して終了したら

```

[root@master ~]# systemctl start tinyproxy
[root@master ~]# systemctl enable tinyproxy
[root@master ~]# systemctl status tinyproxy
```


Firewallは切るか8080だけ許可するか、ご自由にどうぞ。

```
#Firewallを切る
[root@master ~]# systemctl stop firewalld

#Port8080のみ許可する
[root@master ~]# firewall-cmd --add-port=8080/tcp --zone=public --permanent
success
[root@master ~]# firewall-cmd --reload
success
[root@master ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources: 
  services: ssh dhcpv6-client
  ports: 8080/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

Windowsの場合
みんな嫌いなIEで説明します

↓IEの画面右上、(歯車マーク)設定→インターネットオプション
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356296/dcbb65a7-9e0c-37cc-17d0-54d237a48463.png)


↓接続タブ→(ウィンドウ下部)LANの設定
![a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356296/a6175bb2-ece1-e26c-c8a8-6820a601ecb6.png)

↓"LANにプロキシ サーバーを使用する(以下略)"にチェックを入れる。アドレス欄にTinyProxyをインストールしたPCのIPアドレスを記入し、ポートにTinyProxyで設定したポートを記入してOK
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356296/08654f46-fdeb-7e3f-6a5e-ec331077a9c2.png)



つながれば完了です。おつかれさまでした。