OmniAICreator/Qiita-1.07M huggingface dataset:
SSH接続を公開鍵認証で行う(環境:Mac)

◆出来事
上司:「今回のサイトFTPがなくて、sshからのアクセスしかできないので、ssh用の公開鍵をくださいっていわれたから方法調べてーよろしくー」
わたし:「・・・・！? なんですか…その鍵…！FTPでしかアクセスしたことないーー！」


◆公開鍵認証によるssh接続とは
公開鍵と秘密鍵のキーペアを作成し、ペアの照合が行われてサーバアクセスが可能になる方法。


◆必須作業
・ 公開鍵と秘密鍵のキーペアを作成する(Macならターミナルで作成できる)
・ 各鍵の保管先
 　　公開鍵→接続先サーバに設置
       秘密鍵→ログインユーザーがPC内で保管(メールなどでの送付はダメ！)


◆キーペアのファイル名(デフォルト)
・秘密鍵：id_rsa
・公開鍵：id_rsa.pub


◆キーペアの作成方法
① ターミナルをひらく
② ssh-keygen -t rsaと入力後実行(enterキー)
③ 実行後Enter file in which to save the key (/Users/〇〇/.ssh/id_rsa):
  「ざっくりした訳: PCのデフォルトの場所(ディレクトリ /Users/〇〇/.ssh 直下)にキーペアを作っていいですか？」
    と確認されるのでデフォルトで問題なければ再び実行(enterキー)
④ 実行後Enter passphrase (empty for no passphrase):
  「ざっくりした訳: パスフレーズが何もない状態です」
    と言われるので、任意のパス入力。(←入力したパスはターミナル上に表示されない)
    →実行(enterキー)
⑤実行後 same passphrase again:「もう一回入力してください」→入力→実行(enter)

キーペア発行完了！
デフォルトのディレクトリを確認すると、「.ssh」というディレクトリができて、そのなかに「id_rsa」、「id_rsa.pub」ができています。やったーー！


◆公開鍵を接続先サーバへ
今回は、クライアントさんがサーバ管理されていた為、
発行できたペアキーの公開鍵の方( id_rsa.pub )を、送付し、サーバ上にあげてもらいました。
rspec 「let」と「let!」の違い

##はじめに
業務でRSpecでテストコードを書いています。
先日「あれ、通るはずのテストが通らない。。。(´・ω・`)」と思ったら「let!」の「！」を付け忘れていました。
備忘録として、letとlet!の違いをまとめておきます。



##let
letは、定義した定数が初めて使われたときに評価されます。

```sample_spec.rb
#composerが複数のsongを持つものとする
Rspec.describe Sample do
  let(:composer) { create(:composer) }
  let(:composer_song) { create(:song, composer: composer, title: 'きらきら星') }
    it '〜〜' do
      expect(composer).to ~~
    end
  end
end
```

ここでは、`expect(composer).to`の`composer` が出てきたタイミングで、letで定義した`composer`がcreateされる、ということになります。遅延評価と言うそうです。

以下のコードでは、テストは失敗します。
 
```sample_spec.rb
#composerが複数のsongを持つものとする
Rspec.describe Sample do
  let(:composer) { create(:composer) }
  let(:composer_song) { create(:song, composer: composer, title: 'きらきら星') }
    it 'composerがcomposer_songを持っていること' do
      expect(composer.song.first.title).to eq 'きらきら星'
    end
  end
end
```

`composer_song`はcreateされておらず、`composer.song.first`は空になり、エラーになります。

##let!
let!は、各テストのブロック実行前に定義した定数を作ります。
letの遅延評価に対して事前評価とも言うそうです。
先程のテストを成功させるには、「！」を付けてあげれば良いのです。


```sample_spec.rb
#composerが複数のsongを持つものとする
Rspec.describe Sample do
  let(:composer) { create(:composer) }
  let!(:composer_song) { create(:song, composer: composer, title: 'きらきら星') }
    it 'composerがcomposer_songを持っていること' do
      expect(composer.song.first.title).to eq 'きらきら星'
    end
  end
end
```

`before(:each) do`と同じように使えるのですね。

##まとめ
・letは、定義した定数が初めて出てきたときにcreateされる
・let!は、各ブロック実行前に定数をcreateする

なんとなく「遅延評価」という言葉は知っていたものの、実際にハマってみて改めてその意味を理解できた気がします。。

間違っている点等あればご指摘いただけますと幸いです。



###余談
letで定義してspecが落ちるのでデバック用で`pp`を付けて定数を出力すると、当たり前なのですがテストは通ります。
こんな感じ

```sample_spec.rb
#composerが複数のsongを持つものとする
Rspec.describe Sample do
  let(:composer) { create(:composer) }
  let(:composer_song) { create(:song, composer: composer, title: 'きらきら星') }
    it 'composerがcomposer_songを持っていること' do
      pp composer_song
      expect(composer.song.first.title).to eq 'きらきら星'
    end
  end
end
```

`pp composer_song`の`composer_song`って何者？→`let(:composer_song)`に辿り着き、createされるというわけですね。
Firebase storageのフォルダを一括ダウンロードする

※自分用メモ
FirebaseStorageには現時点でフォルダ単位でファイルをダウンロードするAPIが用意されていない。
しかし、GCP用のバケット管理アプリであるgsutilを使えばフォルダ単位の一括ダウンロードは容易に実行できる。

##gsutilのインストール
参考：https://apps-gcp.com/cloud-sdkinstall-commentary/

##ダウンロード
`gsutil -m cp -R gs://<バケット名> <ダウンロード先>`
とすればバケット内のファイルをすべてダウンロードできる。
`gsutil -m cp -R gs://<バケット名>/<サブフォルダ名> <ダウンロード先>`
とすればサブフォルダを指定することも簡単にできる。

以上
参考：https://stackoverflow.com/questions/41461337/how-to-download-entire-folder-from-firebase-storage
HTML & CSS （progate上級編）

#レスポンシブ対応
##レスポンシブとは？
>PC、タブレット、スマートフォンなど、異なる画面サイズの幅を基準にWebサイト表示を柔軟に調節し、見やすく最適な表示にすること。

**viewport**
　レスポンシブデザインをするときは、`<head>タグ`に必ず設置する。
　付けないと閲覧時にメディアクエリが機能しなくなる。

**width:100%;**
　画面幅によって全体の幅が変わるように`width:100%;`に設定する。（〜pxで固定しない）

**responsive.css**
　CSSファイルを整理するために、レスポンシブ用のCSS（responsive.css）を作る。
　responsive.cssを読み込む際は、`viewport`よりも**下の行に記述する。**

##floatの解除方法
**子要素全てがfloatしている場合、親要素の高さは０になる。**
（子が浮いている状態になるので、親からは子が見えない）
 　↓
**clearクラスを持つ空タグを、子要素の中に用意する**

```html
<div class="lesson">
・
・
・
 <div class="clear"></div>
</div>
```

```css
.clear {
 clear:left;
}
```

##画面の幅が大きすぎるときは？
画面が大きすぎるとき（2000px以上など）に`width:100%`を設定していると、要素の幅が広すぎるため、見えづらくなる。

**全体のwidthを設定している要素に、`max-width:〇〇px`を設定する**

```css
.container {
 max-width:1170px;
 width:100%;
・
・
・

}
```

`max-width:1170px;`→最大1170pxまでの幅
`width:100%;`→max-widthの幅まで全体に広げてね

##要素の表示/非表示
**display:none;** 要素を非表示にする
**display:block;**非表示にさせた要素を表示させる
【Git】GUIツールGitKrakenで気に入っている3つのポイント

GitのGUIツール、GitKrakenで気に入っているポイントを3つ紹介します。

- リアルタイム監視
- 複数タブ機能
- コミットメッセージの編集 / 取り消し（`Ctrl + Z`）
- ~~イカちゃんがかわいい~~

バージョンは6.0.1です（書いたのが8月だったのでちょっと古いです、2019/9/30時点での最新は6.2.1です）。

# GitKrakenについて

- [Free Git GUI Client \- Windows, Mac & Linux \| GitKraken](https://www.gitkraken.com/)

GitKrakenはAxosoftによるGitのGUIツールです。
Windows, Mac, Linuxなどクロスプラットフォームで動作します。

Free, Individual, Proのライセンスがあり、それぞれできることが違いますが、今回はPro版（5000円強）を使って解説していきます。

## 起動画面のイカちゃん
くるくる回ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/d909b297-bf17-2e38-27d8-f271a2f0608e.png)

## 基本的な画面構成
機能解説に入る前に、基本的な画面構成全体の画像です。
大まかに、左がブランチ・リポジトリ等の一覧、中央がグラフィック化されたブランチ、右がDiffや未Commitの内容等という構成になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/3421be40-945e-8135-ce3c-6b10821f9530.png)

# リアルタイム監視
GitKrakenでは、他人のブランチやプルリク、CIの状況などをリアルタイムに確認することができます。

機能としても使いやすく、特に他人のブランチにチェックアウトしたり、他人のブランチからブランチを生やしたりするのが楽です。
ローカル & リモートのブランチ削除も、ここから簡単にできます（他人のブランチは権限が無ければ消せません）。

また、リアルタイムで状況確認ができるため、何かミスが有れば素早く気付くことができます。
特に多人数の開発ではGit関係でミスが起きる確率も上がるので、その場でサッと気付いてサッと直せるのは非常にありがたいです。

## 複数人でのコミット
コミット者別にサムネイルが入るので、誰が何をコミットしているか一目で分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/2baf7f69-a700-16e7-5386-f03418ca1ee6.png)

## プルリク/CIの実行状況
実行中、失敗、成功が一目で分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/0ac95b29-2507-65ab-3e50-72221c6dad7c.png)

# 複数タブ機能
複数タブ機能は、文字通り複数のリポジトリをタブとして同時に開く機能です。

![スクリーンショット 2019-09-30 18.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/a722294f-a5f5-b718-7ad4-b8729012f5a5.png)

これは6.0.0（2019年6月）から入った新しい機能です。
業務では複数リポジトリを跨ぎながら開発する場合もあるため、非常に重宝しています。

# コミットメッセージの編集 / 取り消し（Ctrl + Z）
GitKrakenでは、様々な処理を取り消したりやり直したりすることが簡単にできます。

## コミットメッセージの編集
GitKrakenではコミットメッセージを自由に修正できるため、画像のように、「fugaコミットをhugaコミットにtypoした！しかもコミットは2つ前！」という状況でも、3ステップで簡単に修正ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/7f34465a-a362-dda2-37bd-f7cc087c29fc.png)

### 1. コメント欄をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/c04df920-c3a5-dc22-137e-e44438b8f7a9.png)

### 2. 編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/81a457c3-2afb-f942-3bce-7da2935b5db8.png)

### 3. Update Message
画像ではtypoしたままUpdateしていますが、勿論簡単に修正できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/2e283abd-c942-1658-33b1-1473aad425ae.png)

## 取り消し（Ctrl + Z）
GitKrakenでは多くの処理がCtrl + Zで取り消し可能です。

- ブランチをうっかり消してしまった / リセットしてしまった
- 間違った内容をコミットしてしまった
- 間違ってチェックアウトしたけど元々どこのブランチに居たか分からない

こんな状況でも、GitKrakenならCtrl + Zで簡単に巻き戻しができます。

流石にrebaseやリモートが絡むような内容では巻き戻せない場合も有りますが、便利なことには違いありません。

# まとめ
今回はGitのGUIツール、GitKrakenの一部機能を紹介しました。
GitKrakenそのものは様々な操作を簡単にすることができて非常に便利ですが、書き出すとキリがないので一旦この辺までにしておきます。

「GitKrakenは動作が重い」と言われ続け、実際以前は他人にお勧めできない程に動作が重かったですが、6.0.0のアップデートでその辺も多少はマシになりました（~~重くなくなったとは言っていない~~）。
多機能高性能で使いやすく、クロスプラットフォームで動作し、イカちゃんも一々かわいいGitKrakenが自分のイチ押しです。
DAO


初心者が個人的な勉強のためにまとめてみたものです。

**DAO（Data Access Object）**

・簡単に言うと、データベースへのアクセスを専門に扱うDAOというクラスを作り、データベース関連のことはすべて任せてしまう考え方
・JavaEEのデザインパターンの1つ

####DAO独自の特徴
1.**データアクセスをクラスに抽象化することで，具体的なデータソースをビジネス層から隠蔽でき、依存せずに済む**

→具体的なデータソースを隠蔽することができるというのは、データソースが変わってもインターフェイスさえ決まっていれば，ビジネス層がその変更を意識する必要がないという意味。例えば，今は postgresqlをつかっていて，将来的に Oracle に変更するとき、ビジネス層がその変更を意識する必要がなくなり修正点はDAOだけになる。これは、永続層（プログラム終了後もデータが失われないようにデータを保存する層）が CSV ファイルや XML-DB のような RDBMS 以外になる場合（ウェブサービスを使うとか）でも，ビジネス層はそれを意識しなくて済むということでもある。
→データベースにおいてもアクセスしているのは原則DAOだけなので、データベースのテーブル構成が変更になっても、影響を受けるのはDAOだけになる。

2.**SQL になじみのないプログラマが SQL を意識しないで永続層にアクセスできる。**

→データベース接続後に切断する場合には、接続の際に取得したConnectionインターフェースのオブジェクトに対して、**closeメソッド**を使わなくてはいけないが、閉じるの忘れたときに**ガベージコレクタ**によってオブジェクトの破棄と同時に自動的にコネクションを閉じてくれ、システム全体から見て**品質（信頼性）は向上する。**だが、これはミスをした時のものであり、利用しなくなったデータベースへの接続は速やかに切断するべき。



###参考文献
http://qune.jp/archive/001266/index.html
https://ts0818.hatenablog.com/entry/2017/07/10/223553
https://techacademy.jp/magazine/19443
蟻本AtCoder版 練習帳 初級編 with Nim

# TL;DR

静的型付け言語の勉強がしたい&競プロに興味があるということで、最近Ver1.0.0がリリースされたNimを使って蟻本の勉強がしたくなりました(ver1.0.2になりましたね 2019/10/31現在)。Nimな理由はほかの人と違ってかっこいいという中二病感及びPython likeでかけてなおかつ早いというのが非常に魅力的だったからです。

そして、蟻本を買ったけどPOJにはNimがないしよくわからないのでAtCoderで類題解こうと思いました。

ということで、これは、
AtCoder 版！蟻本 (初級編)をNimで解いていくだけの日記帳です。

**気楽にウォームアップ編です**

[日記帳リスト 随時更新]

- [気楽にウォームアップ](https://qiita.com/illumination-k/items/b3e6f30d5b98e3058611)
- [bit全探索](https://qiita.com/illumination-k/items/cc0e4542e7829db1ad63)
- [DFS](https://qiita.com/illumination-k/items/4ffc9d8792ac4fe69a7b)

## [ARC 004 A 2点間距離の最大値](https://atcoder.jp/contests/arc004/tasks/arc004_1)
### 感想
ただの全探索。`newSeqOfCap`使ったらCEになりました。Ver1.0.0に対応してほしい。
`sqrt`はfloat型しか対応してないですね。静的型付けってわりにあんまり型書かないのでよくわからなくなってしまう。

```nim
import math
import strutils
import sequtils


let
    N = stdin.readLine.parseInt()

var
    x_seq = newSeq[int](N)
    y_seq = newSeq[int](N)

for i in 0..<N:
    var xy = stdin.readline().split().map(parseInt)
    x_seq[i] = xy[0]
    y_seq[i] = xy[1]

var longest = 0.0

for i in 0..<N:
    for j in 0..<N:
        var distance =sqrt(
            float((x_seq[i] - x_seq[j])^2 + (y_seq[i] - y_seq[j])^2)

        if distance > longest: longest = distance

echo longest 
```

---

## [ABC 051 B Sum of Three Integers](https://atcoder.jp/contests/abc051/tasks/abc051_b)
### 感想
なんかpythonでいう

```python
K, S = map(int, input().split())
```

みたいなやつないんでしょうか
三重全探索は無理だろうなと思ってやったらやっぱり無理でした。O(N<sup>3</sup>)はいくら速くてもやっぱりだめですね。

```nim
import sequtils
import strutils

let
    KS = stdin.readline().split().map(parseInt)

var
    K = KS[0]
    S = KS[1]
    cnt = 0

for x in ..K:
    for y in ..K:
        if (S - (x + y) <= K) and (x + y <= S):
            inc cnt 

echo cnt
```

---

## [ABC 085 C Otoshidama](https://atcoder.jp/contests/abc085/tasks/abc085_c)
### 感想
`block`便利。

```nim 
import sequtils
import strutils

let 
    NY = stdin.readline().split().map(parseInt)
    N = NY[0]
    Y = NY[1]

var
    cnt = 0

block calc:
    for yen1 in ..N:
        for yen5 in ..N:
            var yen10 = N - yen1 - yen5 
            if yen10 >= 0:
                var sum_yen = 10000*yen10 + 5000*yen5 + 1000*yen1
                if sum_yen == Y:
                    inc cnt 
                    echo $yen10, " ", $yen5, " ", $yen1
                    break calc 

if cnt == 0:
    echo "-1 -1 -1"
```
bq コマンドを開始するための準備からローカルファイルのアップロードまで(Linux環境)

#bq command パッケージのインストール

https://cloud.google.com/sdk/docs/?hl=ja
からパッケージをインストールして任意のフォルダ内に移動させておく。
(私はDOCMENT内に保管したが、ダウンロード内で全然OKだよ)


```sql

省略可。インストール スクリプトを実行して、Cloud SDK ツールをパスに追加します。また、シェルと使用統計情報の収集では、コマンドの補完を利用できます。次のコマンドを使用してスクリプトを実行します。
./google-cloud-sdk/install.sh
```

```sql

gcloud init を実行して SDK を初期化します。
./google-cloud-sdk/bin/gcloud init
```



上記のコマンドが完了するとURLが表示されるのでアクセスする


```shell

==> Start a new shell for the changes to take effect.
For more information on how to get started, please visit:
 https://cloud.google.com/sdk/docs/quickstarts
```
上のURLにアクセスすると下の内容をおこなってください。というドキュメントに飛ぶので、
その内容も下記に記載している。



##アーカイブファイルを作成する
下記コマンドを実行

```shell

$ python -V  /pythonのバージョン確認（2.7以上）

$ uneme -m  /パソコンのスペック確認

$ curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-245.0.0-linux-x86_64.tar.gz
/スペックに合ったアーカイブファイルをダウンロード
```

アーカイブをファイル システム上の任意の場所に展開します。ホームフォルダを使用することをおすすめします。Linux では、次のコマンドを実行してアーカイブ ファイルを抽出できます。

```shell

$ tar zxvf [ファイル名] google-cloud-sdk
```


***ここまで終わったら、再起動！！！***
（この記載がドキュメントにはどこにも載ってなくてその全然進めず渋い思いをした。。。）

##bq コマンドをつかってローカルのCSVファイルをアップロード

CSVのアップロード方法はほとんど説明がなく、大変だったのでメモしておく！

ローカルCSV
https://cloud.google.com/bigquery/docs/quickstarts/quickstart-command-line?hl=ja
を参考にしてローカルからbqへアップロードする




####bq loadを使用して、bqのデータセット内にアップロード！！
データセット ID: babynames
テーブル ID: names2010
ソース: yob2010.txt: **必要に応じて、ファイルへのフルパスを含めてください**
スキーマ: name:string,gender:string,count:integer

```shell

bq load babynames.names2010 yob2010.txt name:string,gender:string,count:integer
```


これでアップロード完了。
自分の送ったプロジェクト配下のテーブルを確認してみてください。


###CSVを送る上で文字化けを変換しないといけない

僕はmacユーザーなので mi というテキストエディターを使用してファイルの形式を変換しました。
これでやったら、うまく文字化けせずにbqテーブル作成できたのでご紹介。

>macOS用:日本語テキストエディタ
https://www.mimikaki.net/

CSVファイルを形式を指定↓
ファイル形式:UTF-8
改行コード:LF

この指定をしていれば文字化けせずにテーブル作成できました！
ご参考まで
エンジニアになりたい人向け無料サイト3選

参考

- [paizaプログラミングスキルチェック | ITエンジニアを目指す学生の就活サイト【paiza新卒】]
(https://paiza.jp/challenges/info)

> " テスト結果はＳ〜Ｅの6段階で評価されます。"

- [CODEPREP | プログラムを書いて動かしながら学ぶ実践型のプログラミング学習サービス]
(https://codeprep.jp/)]

> "基本的なものから実践的なブックまで

> 100冊以上の幅広いブックをいつでもどこでも学べます。"

PHPもできる。
- [Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]] 
(https://prog-8.com/)

> "JavaScript"
T-SQL: カーソルの利用

## T-SQL
```SQL
--データを格納するテーブルを作成
IF OBJECT_ID('[デーベース名].[dbo][テーブル名]') IS NOT NULL
    DROP TABLE [デーベース名].[dbo][テーブル名]
 
CREATE TABLE [データベース名].[dbo].[テーブル名]
    ( id BIGINT
    , full_name NVARCHAR(32))
 
--変数の宣言
DECLARE @id BIGINT
DECLARE @first_name NVARCHAR(32)
DECLARE @last_name NVARCHAR(32)
 
--カーソルの宣言
DECLARE カーソル名 CURSOR FOR
    SELECT id, first_name, last_name
    FROM テーブル名
 
--カーソルを開く
OPEN カーソル名
 
--繰り返し
FETCH NEXT FROM カーソル名 INTO @id, @first_name, @last_name
WHILE @@FETCH_STATUS = 0
 
    BEGIN
        INSERT INTO [データベース名].[dbo].[テーブル名]
        SELECT @id, @first_name + ' ' + @last_name
 
        FETCH NEXT FROM カーソル名 INTO @id, @first_name, @last_name
    END
 
--カーソルを閉じる
CLOSE カーソル名
DEALLOCATE カーソル名
RETURN
```
Pythonで株価データを収集する

#目次
- [PythonでYahoo!ファイナンスから時系列データをダウンロードする方法](https://qiita.com/fjunya/items/eb38ff5caa29c2e89677)
- [PythonでYahoo!ファイナンスの時系列データをDBに登録する](https://qiita.com/fjunya/items/626525eadbf98d34df4f)
- [PythonでYahoo!ファイナンスの時系列データで75日線を表示する](https://qiita.com/fjunya/items/af7c66daa508957542ec)
- [Pythonでゴールデンクロスの情報を1日1回メールで通知する](https://qiita.com/fjunya/items/1a53c3628a037d52a467)
- [PythonのバックテストライブラリBacktesting.pyを試してみました](https://qiita.com/fjunya/items/f2562ad237d35c2b5fc2)
【rails】Atomでrubocopを使用して自動整形する

#最初に
Atom使用時に、コードを```cmd + s ```で自動整形出来る様にするためにAtom Beautifyとrubocopを導入しました。

#やり方
１．AtomのPackageから```Atom Beautify```をインストール

２．AtomのPackageから```linter```と```linterrubocop```をインストール

３．以下のコマンドを入力し、rubocopをインストール

```terminal:
$ sudo gem install rubocop
```

４．rubocopのpathを取得

```
$ which rubocop
```

５．取得したpathを```linterrubocop```のSettingsのCommandにペーストする
(初期値はrubocopになっています)

####これで、```cmd + s ```で保存した際に、自動整形出来る様になります！
Excel VBA/セル内の改行をトル

# Excel VBA/セル内の改行をトル
### これを
|歌番号|百人一首|作者|
|:--|:--|:--|
|61|いにしへの奈良の都の八重桜<br>今日九重に匂ひぬるかな|伊勢大輔|
|62|夜をこめて鳥のそら音ははかるとも<br>世に逢坂の関はゆるさじ|清少納言|
### こうしたい（セル内の改行を除去したい）
|歌番号|百人一首|作者|
|:--|:--|:--|
|61|いにしへの奈良の都の八重桜今日九重に匂ひぬるかな|伊勢大輔|
|62|夜をこめて鳥のそら音ははかるとも世に逢坂の関はゆるさじ|清少納言|




### コード
```vb
Sub 改行トル()
    Dim 範囲 As Range
    Dim 置換文字 As String
    Set 範囲 = Range("b1", "b" & Cells(Rows.Count, 1).End(xlUp).Row)
    範囲.Select
    For Each 範囲 In Selection
        置換文字 = 範囲.Value
        置換文字 = Replace(置換文字, vbLf, "")
        範囲.Offset(, 1).Value = 置換文字
    Next
End Sub
```
### 解説
Project Euler 032を解いてみる。「パンデジタル積」

# Project Euler 032
[032](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2032)
> すべての桁に 1 から n が一度だけ使われている数をn桁の数がパンデジタル (pandigital) であるということにしよう: 例えば5桁の数 15234 は1から5のパンデジタルである.
7254 は面白い性質を持っている. 39 × 186 = 7254 と書け, 掛けられる数, 掛ける数, 積が1から9のパンデジタルとなる.
掛けられる数/掛ける数/積が1から9のパンデジタルとなるような積の総和を求めよ.
HINT: いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが1回だけ数え上げよ.


->[次の問題](https://qiita.com/radiol/items/ab8f34798cb0700a41a5)

## 考え方
1~9の数字でパンデジタルとなるように積を作るには、`かけられる数A`と`かける数B`と`積AB`の桁の合計が9になる必要があります。
A<Bとすると考えられるA-B-ABの組み合わせは、

- 1桁×4桁=4桁
- 2桁×3桁=4桁

の組み合わせです。
なので、1~9の数字を並び替えた組み合わせを作り、それを1-4-4または2–3-4に分け、左辺と右辺が一致するか総当たりしていきます。
組み合わせの生成にはitertoolsのpermutationsを使用しました。
また、答えには重複があるとのことなのでsetを使い重複を削除しました。

## コード
```Python:euler032.py
from itertools import permutations


def main():
    pandigital_set = set()
    # itertools.permutationsを使用し1~9までの数字を使用した順列の組み合わせを生成
    # 生成された数列を1-4-4または2-3-4に分け、左辺2つの乗算結果が右辺と一致するか検証
    for numbers in permutations(range(1, 10)):
        right_side = numbers[5] * 1000 + numbers[6] * 100 + numbers[7] * 10 + numbers[8]
        # 1-4-4の場合
        numA = numbers[0]
        numB = numbers[1] * 1000 + numbers[2] * 100 + numbers[3] * 10 + numbers[4]
        if numA * numB == right_side:
            pandigital_set.add(right_side)
            print(f'{numA} * {numB} = {right_side}')
        # 2-3-4の場合
        numA = numbers[0] * 10 + numbers[1]
        numB = numbers[2] * 100 + numbers[3] * 10 + numbers[4]
        if numA * numB == right_side:
            pandigital_set.add(right_side)
            print(f'{numA} * {numB} = {right_side}')
    print('Answer:', sum(pandigital_set))


if __name__ == '__main__':
    from time import time as t

    st = t()
    main()
    print(t() - st, 'sec')
```
[paiza](https://paiza.io/projects/new)にて実行
`結果
12 * 483 = 5796
18 * 297 = 5346
27 * 198 = 5346
28 * 157 = 4396
39 * 186 = 7254
4 * 1738 = 6952
4 * 1963 = 7852
42 * 138 = 5796
48 * 159 = 7632
Answer: 45228
0.20388317108154297 sec
`
先頭が”9”の場合、必ず桁が上がりすぎるので省いても良かったですが、そこまで変わらなそう(1割くらい)なので簡素さを優先しました。
.NET Core の構成をクラスにバインドするときにはまりポイント

.NET Core移行で、既存ライブラリの移行とともにやっかいだったのが設定ファイルの移行

文字列で設定項目を記述するのが気持ち悪いので
クラスで処理できないか探ってたところ
以下のページに到達

クラスにバインドする
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/configuration/index?tabs=basicconfiguration&view=aspnetcore-3.0#bind-to-a-class

上記を参考にコンソールプログラムで
アプリケーションの設定情報をバインドしようとしたが
Bindメソッドがみつからずに悩んだ。

**結論、Microsoft.Extensions.Configuration.Binderが必要**

dotnet add package Microsoft.Extensions.Configuration.Binder
なりNuGetで登録したら動作するようになりました。

参考URL
https://garywoodfine.com/configuration-api-net-core-console-application/
T-SQL: 文字列を指定文字で分離する

## SAMPLE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/21dcbb2f-06eb-b663-d371-2ddc3ebae7f3.png)

## REFERENCE
[Split a string to a table using T-SQL](https://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql.html)

## CREATE FUNCTION
```sql
CREATE FUNCTION [dbo].[Split]
(
    @string NVARCHAR(2000),
    @delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
    WITH SPLIT(stpos,endpos)
    AS(
        SELECT 0 AS stpos, CHARINDEX(@delimiter,@string) AS endpos
        UNION ALL
        SELECT endpos+1, CHARINDEX(@delimiter,@string,endpos+1)
            FROM SPLIT
            WHERE endpos > 0
    )
    SELECT 'data' = SUBSTRING(@string,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
    FROM SPLIT
)
```

## HOW TO USE
```sql
DECLARE @text NVARCHAR(100) = 'XXXXX/YYYYY/WWWWW'
SELECT data
FROM dbo.SPLIT(@text, '/')
```
HTML: 画像とテキストを並べる

## SAMPLE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/1402b80e-4f2b-ab03-a9b4-a8810e9848b5.png)

ホバリング時、色変化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/e3ccec59-2868-50d2-c55e-a51e6230b1ce.png)

## REFERENCE
[サムネイル画像の横にテキストを並べたレイアウト](http://blog.livedoor.jp/kopcschool/archives/2634636.html)

## HTML
```html
<div class="menu">
    <li>
        <a href="https://qiita.com/kinoshita_yuri" target="_brank">
            <img src="images/lily.png" alt="" width="100" height="100">
            <p class="title">TITLE</p>
            <p class="desc">DESCRIPTION</p>
        </a>
    </li>
    <li>
        <a href="https://qiita.com/kinoshita_yuri" target="_brank">
            <img src="images/lily.png" alt="" width="100" height="100">
            <p class="title">TITLE</p>
            <p class="desc">DESCRIPTION</p>
        </a>
    </li>
</div>
```

## CSS
```css

.menu
{
    width: 400px;
    font-family: verdana, Segoe UI;
    margin: 0 auto;
    border-radius: 4px;
}
.menu ul
{
    padding: 10px;
    float: left;
    margin: 0px;
}

.menu li{
    list-style-type: none;
}

.menu li a{
    display: block;
    padding: 10px;
    color: #000;
    text-decoration: none;
    outline: 1px #285385 solid;
}

.menu li a:hover{
    background-color: #96c7ff;
}

.menu img{
    float: left;
}

.menu p{
    margin: 0 0 0 165px;
}

.menu .title{
    font-weight: bold;
    color: #285385;
}

.p desc{
    color: #000000;
    font-size: 40px;
}

.p key{
    color: #000000;
    font-size: 40px;
}

.p est{
    color: #000000;
    font-size: 40px;
}

.menu li a:after{
    content: "";
    display: block;
    clear: both;
}

.menu ul li        {
    display: inline-block;
    float: left;
    position: relative;
    cursor: pointer;
}
.menu ul li a        {
    cursor:pointer;
    display: block;
    padding: 10px;
    float: left;
    color: #fff;
    text-decoration: none;
}
.menu ul li ul
{
    display: none;
    margin-top: 10px;
}
.menu ul li:hover ul
{
    display: block;
    width: 200px;
    position: absolute;
    left: 0px;
    top: 25px;
    border-top: none;
    color: #fff;
}
.menu ul li:hover ul li
{
    padding: 5px;
    float: none;
    display: block;
}
.menu ul li:hover ul li a
{
    padding: 5px;
}

```
シンボリックリンクが貼れなかった件

# なにがしたい
- データを保存しているHDDでシンボリックリンクを作成できなかったことをメモする
- 原因も根本的な解決法も不明

# まとめ
- カレントディレクトリがHDD上の時、lnが使えなかった
- カレントディレクトリをSSDにしたら使えた

# 環境
- PC構成：OS用SSDとデータ用HDD
- ln (GNU coreutils) 8.25

# 状況

### 発見直後(HDD)
- pythonのos.symlinkでシンボリックリンクを作成しようとしたところ、not implementedと怒られた

``` python:REPLから確認したとき
>>> import os
>>> os.symlink("a.py", "b.py")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 38] Function not implemented: 'a.py' -> 'b.py'
```

### バージョンの問題か？
- pyenvで2.7.15を使っても同じエラーが再現された
- anaconda3-5.3.1でも同じ。

### pathlibからならできたりしないだろうか…
- そんなことはなかった
- `a.symlink_to(b)`

### もうこうなったらsubprocessでln -sを呼んでしまえ
- 呼べなかった
- `subprocess.call("ln -s a b")`

### ln -sをREPLで実行してみる
- 関数は実装されていません？？？

``` sh:実装されていません
$ touch a
$ ls
a
$ ln -s a b
ln: シンボリックリンク 'b' の作成に失敗しました: 関数は実装されていません
```

### ディスクを変えて実行したらなんか動いた(SSD)
- SSDで同じことをすると関数が実装されていた（ほっとした）

### 一応確認したこと
- できるパターン
    - `ln -s /SSD/a /SSD/b`
    - `ln -s /SSD/a /HDD/b`
- できないパターン
    - `ln -s /HDD/a /HDD/b`
    - `ln -s /HDD/a /SSD/b` 

# 本当はもう少し調べたいこと
- HDDの権限周り
- lnのコード
外部に公開しないミニマムなchrome拡張機能を作るのは1時間も使わずにできる

## 概要

今回は超ミニマムなchrome拡張機能をつくります
ブックマークレットレベルのコードをくっつける感じです
拡張機能のアイコンを押すとなんか設定できたりするやつもありますが、そこまで作ると手間なので、あるサイトを読み込んだ時だけjsを動かしたいとかそういうレベルのものをつくります

## ファイル構成

まずはこの構成のファイル構成を作ります。一旦中身は何もなくていいです。
アイコンは適当にフリー素材の32pxのものを使えばいいと思います^_^

```
フォルダ
├ content_scripts.js
├ icon_32.png
└ manifest.json
```

## manifest.jsonを埋める

拡張機能用の設定ファイルだと思ってください。
とりあえずコピペで良いと思います。nameの部分とmatchesの部分は自分が使いたいサイトに合わせて変えておきましょう。

```json:manifest.json
{
  "name": "名前",
  "manifest_version": 2,
  "version": "1.0",
  "browser_action": {
    "default_icon": "icon_32.png"
  },
  "content_scripts": [
    {
      "matches": ["https://www.google.com", "https://www.google.com"],
      "js": ["content_scripts.js"]
    }
  ]
}

```

matchesは拡張機能を実行するURLです。ここらへんはググればいくらでも出てくると思います。
jsはそのページで実行するjsです。
あとは雰囲気でわかると思います。

## jsに処理を書く

あとは処理を書いてやればOKです。
動いてるか確かめるためにこういう処理を書けばいいと思います。

```javascript:content_scripts.js
window.onload = function() {
  console.log('test');
}
```

サイトのあるボタンを押した時に自動でなにかを設定したい！とかそういうのだったらaddEventListenerすればおｋです。

```javascript
  const elements = document.querySelectorAll('.セレクタ');
  elements.forEach(function(element) {
    element.addEventListener('click', test);
  });

  function test() {
    console.log('test');
  }
```

こういうのを書けばあるサイトのあるボタンを押した時にconsole.logさせることが可能となります。

あとは自分の書きたい処理を書いてください。

## chromeに読み込ませる

1. `chrome://extensions/` にアクセス
2. デベロッパーモードをオン
3. [パッケージ化されていない拡張機能を読み込む]で自分の作った拡張機能があるフォルダを指定し読み込み
4. 拡張機能を適用したいページを開きスーパーリロード Cmd+Shift+R

これで動くはずです。

同僚に配布したいときはそのフォルダを圧縮してSlackなりに投げればいいでしょう。

デバッグしたいときは、何回もchrome拡張を削除して読み込めばおｋです。

それ以外の方法があったら教えて下さい。


### 追記
- chrome://extensions/にある追加した拡張機能のオンオフボタンの左に再読み込みボタンがあるのでそれを使うと便利です

とのことです！

コメントいただいた方、ありがとうございます！
Elixir mix.exsでローカルにあるプロジェクトを参照する

## 結論

結論から書く。mix.exsに以下のように追加すれば良い。

```elixir:mix.exs
    {:algae, path: "../algae", override: true},
```

参照される側のprojectではlocalにinstallしておく必要がある。

```bash
mix deps.get
mix archive.install
```


## 解説

### path: "\<YOUR_PATH\>"
 この指定でローカルにあるディレクトリを見てくれる。'path:'を忘れがちで何度もエラーになった。pathに相対パスが使えないのかもと思って絶対パスにしたりしたけど、'path:'のつけ忘れが原因で相対パスはちゃんと使える

### override: true

 他のライブラリが同じプロジェクトを見ている時、バージョンが違うと依存バージョンがdiverseしてるみたいな感じで怒られる。自分が指定したものを優先したい時にoverrideをつける

### mix archive.install

`mix help`するとarchiveとescriptがあり、今回のケースでは`archive.install`を使う。

## これが必要になった事例
 
Algaeを動かそうと思ってmix.exsに追加すると`mix deps.compile`が通らない。ググってみると下記が見つかった。

https://github.com/witchcrafters/algae/issues/56

最終的には「直したからすぐリリースするね」といっているが、この記事執筆時点で22days経過していてリリースされてない。mix.exsに指定できるのは1.2.5までだった。cloneしてきたがmasterにはこの修正が入っていない。`git co -b elixir-1.9 origin/elixir-1.9`したらこのブランチに入っていたので、`mix archive.install`して事なきを得たという次第。

## 参考

- 公式 mix archive.install https://hexdocs.pm/mix/Mix.Tasks.Archive.Install.html

- fugafuga.write(blog) https://blog.tokoyax.com/entry/elixir/register-to-hex
PS1をUbuntuっぽくする

# PS1（プロンプト）をUbuntuにする
あとで書き直す（つもり）

### 色付き

```bash
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
```
### 色なし

```bash
PS1='\u@\h:\w\$ ' 
```
CloudMapperを使ってAWS構成図を作ってみた

#概要
AWSの構成図が必要になったけれど、数が多すぎて手動で書くのは辛かったので、
AmazonLinux2でCloudMapperというツールを試してみた。

#結論
Png形式でいいなら[cacoo](https://cacoo.com/ja/)に無料サインアップしてAWS構成図ツール使ったほうが楽だと思う。

#CloudMapperとは？
DUOが提供するAWS Visualization Tool。
[GitHub]
(https://github.com/duo-labs/cloudmapper/blob/master/README.md)に公開されています。

#参考サイト
[CloudMapper](https://github.com/duo-labs/cloudmapper/blob/master/README.md)
[PyEnv](https://github.com/pyenv/pyenv)
[先人の方々](https://qiita.com/search?q=cloudmapper)

#事前準備
- 情報収集に必要なIAMポリシー（後述）を作成
- IAMポリシーを付けたユーザのアクセスキーとシークレットキー。

IAMポリシーのJSON

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": "*",
      "Action": [
        "ec2:DescribeRegions",
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeVpcs",
        "ec2:DescribeSubnets",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeVpcPeeringConnections",
        "ec2:DescribeInstances",
        "ec2:DescribeNetworkInterfaces",
        "rds:DescribeDBInstances",
        "elasticloadbalancing:DescribeLoadBalancers"
      ]
    }
  ]
}
```



#導入手順
######必要なものをインストール
gitも一緒に入ってくれる。

```
yum update -y
yum install @development zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel findutils -y
```
######リポジトリを取得

```
git clone https://github.com/duo-labs/cloudmapper.git
git clone https://github.com/pyenv/pyenv.git
```

######環境変数など
気になる人は「cp .bash_profile .bash_profile_bak」とかしましょう。

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
. ~/.bash_profile
```

######Pythonインストール
```
pyenv install 3.6.7
pyenv global 3.6.7
pip install --upgrade pip
pip install pyjq six netaddr pyyaml policyuniverse boto3 jinja2
```

######AWSアカウント設定
```
aws configure
AWS Access Key ID [None]: （アクセスキー）
AWS Secret Access Key [None]: （シークレットキー）
```

######cloudmapper操作
```
cd cloudmapper/
python3 cloudmapper.py configure add-account --config-file config.json --name test --id （AWSのアカウントID）
python3 cloudmapper.py collect --config config.json --account test
python3 cloudmapper.py prepare --config config.json --account test
python3 cloudmapper.py report  --config config.json --account test
```

ここまで終わると「web/*」にデータが出来ているので
WebサーバのディレクトリにコピーするなりZIPで固めてDLするなりしましょう。
Bashでecho,catを用いてRubyコメントアウト

```
echo "__END__";cat
```

#=>
hoge
fuga
が
__END__
hoge
fuga

逆に

```
echo "__END__"|cat
```
だと
#=>
__END__
となりうまくいかない。

参考
- [echoコマンドの詳細まとめました【Linuxコマンド集】]
(https://eng-entrance.com/linux-command-echo)

> "echoコマンドの基本動作
使い方は、次のとおりシンプルだ。

> $ echo 表示するもの"

-　[【初心者向け】Linuxパイプラインの使い方を詳しく！]
(https://eng-entrance.com/linux-pipeline)

> "「パイプライン」とは少々難しく言うと、「コマンドの入出力をコマンドへ引き渡す処理」のことを指す。"

- [【Linuxコマンド集】3分でわかるcat コマンドの使い方]
(https://eng-entrance.com/linux_command_cat)

> "例えば、fileAの中身を見たいとき、次のようにコマンドを打つ。

$ cat fileA"
Git LFS使っているAWS LambdaリポジトリのCircleCI対応

# はじめに

- AWS Lambdaを扱っているリポジトリで、大きいファイルを扱う必要があったので、[Git LFS](https://git-lfs.github.com/)使って管理するようにしました。
- CircleCIでテスト実行してserverless frameworkを使ってそのままデプロイするようにしたかったので、CircleCI上でGit LFS使えるようにしたときのメモです。
    - Git LFSで管理している大きいファイルは**テスト実行にも、Lambda-functionの実行にも必要という前提です**。

# 設定など

- AWS Lambdaを使う際には、みなさん[こちら](https://hub.docker.com/r/lambci/lambda/)のDockerイメージを利用されていると思いますので、その前提で。
    - 環境はpython3.6としています。

```yaml:circleci/config.yml
  test_deploy:
    docker:
      - image: lambci/lambda:build-python3.6
        environment:
          AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
          AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
    steps:
      - checkout
      - run:
          name: install git-lfs
          command: |
            curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | bash
            yum install -y git-lfs
            ssh git@github.com git-lfs-authenticate ${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}.git download
            git lfs pull
      - run:
          name: test
          command: |
            python -m unittest                        
      - run:
          name: deploy
          command: sls deploy -v --stage prd

``` 

# 参考

- こちらを参考にさせて頂きました
    - https://qiita.com/obi_yuta/items/58366fdeb25ad7592201
    - https://github.com/git-lfs/git-lfs/wiki/Installation
Git使う上で「これはこうすると良いよ」ってやつのまとめ

# 前置き
Gitは本当色々な使い方が出来るツールで、有名なワークフローも沢山在り「__何においてもこれが正解__」と言う物は無いかと思いますが、実作業をしていて個人的に思うGitを使う上で「__これはこうすると良いよ__」って事をまとめてみたので、ご参考までにどうぞー。:thumbsup:

※大体初心者向け、フィーチャーブランチワークフローでチーム作業をしている想定です。気が向いた時に随時更新。


# これはこうすると良いよまとめ

### コミットの粒度ってどうすれば…
作業中の変更もどんどんコミットしていってOK！リモートにもどんどんプッシュしよう！
でもプルリクを作る前に`git rebase -i origin/master`とかでコミットを整理しようね。 :wink: 

### プルリクってどれくらいの大きさが良いのか…
＋ー合わせて差分が300行くらいだとレビューし易いかな。 :thinking: 
どうしようも無くて巨大プルリクになっちゃったら説明をしっかりめに書いてやー。 :pray: 

### プルリクって何を書けば良いのか…
大体はテンプレ（これでカバー出来ればそれが一番良いかな）を埋めてくれれば良いけど__「このプルリクが必要な理由」をしっかり書く__ぞーって意識で書いてくれると良いかな。「__理由__」はその時にしか覚えていないってなりがちなので、未来の作業者＆自分の為にもしっかり書いておくんやでー。 :innocent: :thumbsup: 
逆に「何をしたか？」は差分を見れば大体分かるので、箇条書きレベルで :ok: 

### ローカルに古い作業ブランチ溜まってきたけど、消すの面倒臭いなぁ…
`git checkout master && git pull origin master && git fetch -p origin && git branch -d $(git branch --merged | grep -v master | grep -v '*') && git push origin $(git branch -r --merged | grep origin/ | grep -v master | sed s~origin/~:~)` をやれば良いけど、これはリモートの整理も含めているので、一応チームに連絡してからやろうな。

詳しくは↓記事を参照や。感謝。 :pray: 
[Gitで既にmasterにマージされている使用済みブランチを消す方法 - Qiita](https://qiita.com/awakia/items/b7cd789f5b30a4e90eaf)

### 直ぐにマスターにマージ出来無い程の巨大な変更になりそう…
フィーチャーブランチワークフローの真髄発揮や。 :thumbsup: 
大きな変更をまとめるブランチを作って、そこに細かくプルリクを出していこう。作業が終わったら最後にそのブランチからmasterブランチに対してプルリクを作ればOKや。
masterブランチに変更があった時には、そのブランチのリベースを忘れずにー。 :pencil: 

### 何か良く分からないエラーで何も出来ないよー… :cry: 
とりま深呼吸して落ち着こう。Gitは殆どの問題で的確なエラーメッセージを出してくれる。
落ち着いたらエラーメッセージの解読を始めよう。 :flag_gb: :spy: 


# あとがき
以上、Git使う上で「これはこうすると良いよ」ってやつのまとめでしたー。良きGitライフをー。 :wink: :thumbsup:
WebRTCで何故かontracが呼ばれない場合の逃げ道

RTCPeerConnection.connectionStateがconnectedになっていて、
きちんとMediaStreamが届いているはずなのになぜかontrackが呼ばれなかった時に取った回避策

``` javascript
connection.onconnectionstatechange = () => {
                if (connection.connectionState === 'connected') {
                    const tracks = connection.getReceivers().map(r => r.track);
                    const stream = new MediaStream(tracks);
                    //MediaStreamを使った処理
                }
            }
```

# 解説
* connectionState  === 'connected'は接続完了。普通はconnectionStateが一つ前の'connecting'の間にtrackイベントが発生してontrackに登録された処理が走る
* Remoteから受け取ったMediaTrackは受け取ったRTCRtpReceiverに保持され、trackプロパティから取得できる
* ontrack時にeventから取得できるMediaStreamはMediaTrackの配列を引数に手動で生成できる
VuetifyでGoogleMaterialDesignIconを使う

デフォルトで入っているアイコンは種類が少ないので、いつもgoogleのマテリアルデザインのアイコンを利用しています
インストール方法をいつも忘れるのでメモ

https://vuetifyjs.com/ja/customization/icons#install-material-icons

プロジェクト配下で

```
$ npm install material-design-icons-iconfont -D
```

vuetify.jsでimportする

```src/plugins/vuetify.js
import 'material-design-icons-iconfont/dist/material-design-icons.css' ←追加
import Vue from 'vue'
import Vuetify from 'vuetify/lib'

Vue.use(Vuetify)

export default new Vuetify({
  icons: {
    // iconfont: 'mdi',
    iconfont: 'md',←追加
  },
})
```

ちなみに種類としてはfontawesomeが一番充実しています
ONNXで fuse_bn_into_conv 最適化（駄目でした）

ONNXがサポートしている最適化 fuse_bn_into_conv を調べてみました。

結果から言うと、[fuse_add_bias_into_conv](https://qiita.com/natsutan/items/cc6900f7f7706158cd80) と同じくこちらも動きませんでした。

自分でグラフを作っても、Kerasで作っても同じです。ONNXを1.5.0から1.6.0に上げても同じでした。

```python
  File "C:\home\app\anaconda3\lib\site-packages\onnx\optimizer.py", line 55, in optimize
    optimized_model_str = C.optimize(model_str, passes)
IndexError: invalid unordered_map<K, T> key
```

ONNXのバージョンアップまち。

一応、Kerasで作ったグラフはこれ。


![fuse_bn_into_conv.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/f1924a03-2f89-343a-aa78-1e361ebb1ec5.png)

ソースはこちら。

```python
import numpy as np
import keras
import onnx
from onnx import optimizer
import keras2onnx

input = keras.layers.Input(shape=(1, 5, 5))
conv = keras.layers.Conv2D(10, (3, 3), input_shape=(1, 5, 5), use_bias=False, data_format='channels_first')(input)
bn = keras.layers.BatchNormalization(axis=1)(conv)

model = keras.models.Model(inputs=input, outputs=bn)

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

onnx_model = keras2onnx.convert_keras(model, model.name)
onnx.save_model(onnx_model, "onnx/fuse_bn_into_conv.onnx")

# 最適化パスを指定
passes = ['fuse_bn_into_conv']

optimized_model = optimizer.optimize(onnx_model, passes)
onnx.save(optimized_model, 'onnx/fuse_bn_into_conv_optimized.onnx')
```
HTML & CSS （progate初級〜中級編）

###HTML
**input**
　`1行のテキスト入力`を受け取るための要素。`終了タグ`が不要。
　**type属性に”submit”を指定する**と、`入力欄`から`送信ボタン`に変わる。
　**value属性で表示されるテキストを変更できる。**
**textarea**
　`複数行のテキスト入力`を受け取るための要素。

```html
<form>
 <p>input要素</p>
 <input vaulte="ボタン">
 <p>textarea要素</p>
 <textarea></textarea>
</form>
```
###CSS
**opacity**
　**要素を透明**にできる。
　透明度は**0.0(完全に透明) ~ 1.0(完全に不透明)**の数値で指定。
**letter-spacing**
　**文字の間隔**を指定できる。
　**px**を使用。

```css
h1 {
background-color:#fff;
opacity:0.8;
letter-spacing:10px;
}
```
git grep の検索結果から #perl でファイルのテキストを #正規表現 + キャプチャ で一斉置換する ( #git ) ( sed は正規表現が貧弱だし )

# コマンド

```
git grep --perl-regexp --files-with-matches '検索対象のキーワード' . | uniq | xargs perl -e "s/置換対象のキーワード/置換後のキーワード/" -pi
```

# 例

- カッコ `()` でキャプチャする
-  `\1` `\2` ... で置換先でキャプチャ結果を利用する
- その他、正規表現的に使える例であれば、なんでも使えることでしょう
 
```
git grep --perl-regexp --files-with-matches '(Rec)o(rd)' . | uniq | xargs perl -e "s/(Rec)o(rd)/\1Oh\2/" -pi
```

結果の例

git diff

```diff
-class Job < ApplicationRecord
+class Job < ApplicationRecOhrd

```


# 解説


```
$ git grep -r -l 'Record' .
app/models/application_record.rb
```

# git grep のオプション

```
$ git grep --help
GIT-GREP(1)                                                Git Manual                                                GIT-GREP(1)

NAME
       git-grep - Print lines matching a pattern

SYNOPSIS
       git grep [-a | --text] [-I] [--textconv] [-i | --ignore-case] [-w | --word-regexp]
                  [-v | --invert-match] [-h|-H] [--full-name]
                  [-E | --extended-regexp] [-G | --basic-regexp]
                  [-P | --perl-regexp]
                  [-F | --fixed-strings] [-n | --line-number] [--column]
                  [-l | --files-with-matches] [-L | --files-without-match]
                  [(-O | --open-files-in-pager) [<pager>]]
                  [-z | --null]
                  [ -o | --only-matching ] [-c | --count] [--all-match] [-q | --quiet]
                  [--max-depth <depth>] [--[no-]recursive]
                  [--color[=<when>] | --no-color]
                  [--break] [--heading] [-p | --show-function]
                  [-A <post-context>] [-B <pre-context>] [-C <context>]
                  [-W | --function-context]
                  [--threads <num>]
                  [-f <file>] [-e] <pattern>
                  [--and|--or|--not|(|)|-e <pattern>...]
                  [--recurse-submodules] [--parent-basename <basename>]
                  [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
                  [--] [<pathspec>...]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2543








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Unity】指の動き（ドラッグ）に応じて動くオブジェクト

今回はUnityで指の動き(ドラッグ)に応じて動くオブジェクトについてです。
需要高そうですが、あまり記事が無いため記述します。

今回は、**横のみの移動**の実装方法を記述するので、縦もやりたい方は自由に応用してください。

色々方法あると思いますが、自分は以下の方法で実装しました。

#実装方法

以下のスクリプト（DragMove.cs）を作成して、動かしたいオブジェクトにアタッチしてください。

```C#
using UnityEngine;

public class DragMove : MonoBehaviour {

	[SerializeField] private float slideSpeed = 2f; //横移動のスピード。Inspector等で設定

	private void Update () {
		PlayerInput ();
	}

	private void PlayerInput () {
		//もし入力がなかったらreturnする
		if (Input.touchCount <= 0) return;

		if (Input.GetTouch (0).phase == TouchPhase.Moved) {
			Vector2 touchPosition = Input.GetTouch (0).deltaPosition;
			transform.Translate (touchPosition.x * slideSpeed * Time.deltaTime, 0, 0);
		}
	}
}
```

これで実装できます。

##移動範囲に制限を設けたい場合

移動範囲に制限を設けたい場合は

```C#
using UnityEngine;

public class DragMove : MonoBehaviour {

	[SerializeField] private float slideSpeed = 2f; //横移動のスピード
	private const float limitPos = 5f; //横幅の制限

	private void Update () {
		PlayerInput ();
	}

	private void PlayerInput () {
		//もし入力がなかったらreturnする
		if (Input.touchCount <= 0) return;

		if (Input.GetTouch (0).phase == TouchPhase.Moved) {
			Vector2 touchPosition = Input.GetTouch (0).deltaPosition;
			transform.Translate (touchPosition.x * slideSpeed * Time.deltaTime, 0, 0);
		}
		
		//Clamp関数で制限する
		transform.position = new Vector3 (Mathf.Clamp (transform.position.x, -limitPos, limitPos), transform.position.y, transform.position.z);
	}
}
```

Mathf.Clamp関数が便利です。
こんな感じで制限できます。

#実際に確認

このコードはPC上では確認できないと思うので、
ビルドして確認するか、お手軽UnityRemoteで動作確認してください。

PCでも動くようにするには、
touchPositionの部分をInput.mousePositionにすれば動作すると思います。

![move.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360619/698c2d40-c357-9fa4-e32d-82566f87447b.gif)

こんな感じになればOKです！！
Bashでawkを用いて各行の先頭に#を追加しRubyのコメントアウトする

Bashでawkを用いて各行の先頭に#を追加しRubyのコメントアウトする。
Rubyで複数行コメントアウトしたい時に使う。

```:bash
cat|awk '{print "#" $0}'
``` 
#=>
p 1
puts 1
p 'あ'
p 'a'
p *1..5
p *'あ'..'お'
p *'a'..'e'
が
#p 1
#puts 1
#p 'あ'
#p 'a'
#p *1..5
#p *'あ'..'お'
#p *'a'..'e'

参考
- [AWK で行の先頭に文字列を追加する - Sarchitect]
(http://sarchitect.net/16065)
> "テキストファイルの各行の先頭に文字列を追加する。

> $ awk '{print "- " $0}' example.txt"

- [awk入門 コマンドの使い方とスクリプトの書き方]
(http://itref.fc2web.com/unix/awk.html#INPUT_RECORD)

>"$0
組み込み変数 $0 は、入力行（レコード）を表します。"

# そのものを表示したいのになぁ…

- [【Ruby】コメントの書き方 - Qiita]
(https://qiita.com/Mocacamo/items/318b193ded19fd37ffd6)

> "# コメント
-- 1行コメントは「#」のあとに書く"
ONNXで fuse_add_bias_into_conv 最適化（駄目でした）

ONNXがサポートしている最適化 fuse_add_bias_into_conv を調べてみました。

ソースはここ。
https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/fuse_add_bias_into_conv.h

自力でONNXのグラフを作ったところ、optimizer.optimize()の呼び出しで、このようなエラーが出てしまいました。

```python
  File "C:\Anaconda3\lib\site-packages\onnx\optimizer.py", line 55, in optimize
    optimized_model_str = C.optimize(model_str, passes)
IndexError: invalid unordered_map<K, T> key
```

C++で記述されているところで、期待されれているkeyとvalueの組み合わせが無い感じですが、これ以上わからず。

issueでは同じような症状が報告されていますが、特に解決策はなさそうです。もう少しエラーの詳細を知りたいですね。
https://github.com/onnx/onnx/issues/1385

自力でONNX作ったからなにかまずいのかと思い、Kerasでやってみました。

![fuse_add_bias_into_conv.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/d67ba53d-f487-a268-a5f2-08c111b61f3b.png)

上手くconv2dの後にAddが入った気がします。しかし、ここからoptimizer.optimize()を呼び出すと同じエラー。

```python
  File "C:\home\app\anaconda3\lib\site-packages\onnx\optimizer.py", line 55, in optimize
    optimized_model_str = C.optimize(model_str, passes)
IndexError: invalid unordered_map<K, T> key
```

Kerasでやってみたソースはこれです。

```python
import numpy as np
import tensorflow as tf
import keras
import onnx
from onnx import optimizer
import keras2onnx


def add_const(x):
    _b = np.ones((10, 3, 3))
    B = keras.backend.variable(_b)
    x = x + B
    return x

input = keras.layers.Input(shape=(1, 5, 5))
conv = keras.layers.Conv2D(10, (3, 3), input_shape=(1, 5, 5), use_bias=False, data_format='channels_first')(input)
add = keras.layers.Lambda(add_const)(conv)

model = keras.models.Model(inputs=input, outputs=add)

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

onnx_model = keras2onnx.convert_keras(model, model.name)
onnx.save_model(onnx_model, "onnx/fuse_add_bias_into_conv.onnx")

# 最適化パスを指定
passes = ['fuse_add_bias_into_conv']

optimized_model = optimizer.optimize(onnx_model, passes)
onnx.save(optimized_model, 'onnx/fuse_add_bias_into_conv_optimized.onnx')

```
有効なはずのProvisioning Profile (Type: Development) がXcode11で使えない

既存の.xcodeprojファイルを開きノールックで Command+R したところ、Xcode11 絡みと思しき理由で Apple さんお得意の「サイレント仕様変更」にぶつかりましたのでここに纏めておきます。

事の経緯
============
Xcode 11.0 のリリース以前から Xcode10.x で開発していた iOS アプリ (iPad向けアプリなので今後はiPadOSアプリですね) のプロジェクトファイルを Xcode 11 で開いたところ、そのまま実機デバッグができず、吐かれたエラーに従って確認したところ、TARGETS > Signing & Capabilities タブ > Signing (Debug) セクションの Status に doesn't include signing certificate のエラーが出ていました。
<img width="1016" alt="scr1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428226/3ca9b1de-e3bd-7c33-07e5-842a80d12fdb.jpeg">
*※私の業務環境では多数の証明書やプロファイルを管理している都合上、"Automatically manage signing" を使わないのがデフォルトになっていますので、Automatically〜ボックスにチェックを入れ機能を有効にしている環境下ではまた状況が異なる可能性があることにご留意ください。*

原因
============
プロファイルそのものや証明書の期限切れはどちらも半年以上先で、設定を変更できる (権限&知識を有する) メンバーも自分以外に居ない環境のため、「そんなバカな？」と思い Apple Developer サイトへGO！
プロファイルを確認すると、そのプロファイルに紐付ける証明書を指定するセクションに、いつの間にか下記のような項目と表示が出現していることに気がつきました。
>□ <Developerメンバー名> (Development) For use in Xcode 11 or later

<img width="1256" alt="scr2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428226/439fd303-e876-7073-4fd7-8235196f776a.jpeg">

何者だお前は…いつからそこに居た？( •᷄ὤ•᷅)

これと関連して確認したところ、Macのキーチェーンアクセスにもそれらしき証明書と秘密鍵のセットが Apple Development として追加されていました。無論私は追加した記憶もなく、証明書の発行日がこの問題に気づいた日付と同日なので、恐らくは Xcode が自動生成したものでしょう。やりおったな…。

対処
============
通常であれば Certificates の Type が "(**iOS** Development)" となっているところが、この "Xcode11以降向け" と称している証明書は単に "(Development)" となっているのが気がかりではあるものの、項目のボックスにチェックを入れてプロファイルを書き出し直し、Mac に再導入したところ Xcode のエラーも消え、ひとまず無事に実機デバッグを実行することができました。

Apple さんの事ですので、iPadOS が出たり、MacApp との兼ね合いで命名を変更したとか、そんなチャチな理由じゃあ断じてねぇとは思いますが、今後何か発見したことがあれば引き続き書き留めていきたいと思います。

キーワードをググっても特段日本語での情報が見当たらなかったため、どなたかに役立てばと思い投稿してみました。
 ᕙ( 'ω' )ᕗ
INTO OUTFILE の出力先

# 問題
sql結果をcsvファイルで出力したもののどこに行ったかわからなかった。

```sql
MariaDB [test]> select * from users INTO OUTFILE '/tmp/user-data.csv' FIELDS TERMINATED BY ',';
```

# 解決
mariadbの場合、`/tmp/systemd-mariadb.service-XXXXXXX`に出力される。

```sql
MariaDB [test]> system sudo cat /tmp/systemd-private-xxxxx-mariadb.service-xxxxx/tmp/user-data.csv;
```
【Swift】WKWebViewでローカルファイルを読み込み、Ajaxを利用する際の設定

```Swift
import UIKit
import WebKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let config = WKWebViewConfiguration()
        config.setValue(true, forKey: "allowUniversalAccessFromFileURLs") //こいつが重要
        let webView = WKWebView(frame: view.bounds, configuration: config)
        view.addSubview(webView)
        guard let localHTMLUrl = Bundle.main.url(forResource: "index", withExtension: "html") else { return }
        webView.loadFileURL(localHTMLUrl, allowingReadAccessTo: localHTMLUrl)
    }
}
```
外部APIの通信が失敗していたところ"allowUniversalAccessFromFileURLs"をconfigにセットしてやると解決した。
【C#】ListViewの枠線の色が消えない

業務でListViewを扱っていて、ListViewの枠線の色が消えない現象に遭遇しました。

#解決法
ListView全体の背景色を変更するとこの現象に遭遇するので、ListViewのItem.BackColorを変更するようにする。

#現象
このようなListViewがあったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295196/a1b7fbc5-9864-4c73-f56c-92340d145cbd.png)

```CSharp
//内容に変化があったら
listView.BackColor=Yellow
//元々の内容と同じだったら
listView.BackColor=White
```
内容に変更があったら背景色を黄色くします。元々の内容と一緒なら、背景色を白くします。

ここで、一つ内容を追加してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295196/b7473ccb-330c-9669-556e-602a4cccf240.png)

これ、よく見ると枠線周辺も黄色くなってますね。

内容を削除して元に戻します。元々の内容と同じになるので、背景色が白くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295196/bbe6934f-6e3d-fedb-978b-cd60ee496cc6.png)

ところが、このように背景色が白くなるのですが、枠線の色が残ったままになっています。

#感想
ListViewの背景色を変更する際に、変更範囲のずれがあるためこのような現象になっているのでしょうか……。
Amazon Workspacesで、VPCのプライベートサブネットのDBに接続するためのGUIのSQLクライアントを立てる


自分用の備忘メモです。  
もし「もっとこうしたほうが良くなるよ！」というのがあれば教えて下さい。Active Directory初心者なので...。



# 1. Active Directoryを作成する

※すでに目標のVPCにActive Directoryがある場合は不要です。

Directory Serviceから新規にDirectoryを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/7fdd023e-00d6-3b97-2d79-0b9f7a514bdc.png)

このとき、VPC内に`NAT Gateway`がアタッチされたAzの異なる2つのSubnetが必要です。

マネジメントコンソールに従って作成を完了したら、しばらく（だいたい20分以上）待ちます。  
注意: Subnetに設定されているSecurity Groupは、ActiveDirectoryを作成後にUpdate Detailからしていすることでアタッチできるようです。

■ わかっていないこと: Cognito UserPoolをActive Directoryの代わりに使うことってできる？


# 2.  Workspace を作成する

Workspaceを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/d4ac6640-d7b7-668d-b023-414e24b081a3.png)

DirectoryServiceを作成した直後だと、Workspaceの一覧が表示されないことがあるようです。その場合、以下のURLをアドレスバーに直打ちして対応しました。  
https://ap-northeast-1.console.aws.amazon.com/workspaces/home?region=ap-northeast-1#listworkspaces:

マネジメントコンソールのデフォルト設定に従ってインスタンスを作成します。

■ わかっていないこと: Active Directoryの作成時とWorkspaceの作成時で、それぞれSubnetを指定するのはどうして？（Active Directoryの設定を継承すれば良いのでは？）


# 3. Workspaceクライアントからログインする。

`お客様の Amazon WorkSpace ( Your Amazon WorkSpace )` というタイトルのメールが来ているので、
`1. ユーザーのプロファイルを入力し、次のリンクから WorkSpaces クライアントをダウンロードします。` というメッセージにしたがって設定を進めます。

※AWS WorkspaceクライアントはHomebrewでも入ります。  

```
brew cask install amazon-workspaces
```

# 4. Workspace内にdbeaverをインストールする

terminalを開き、以下の通りdbeaverをインストールします。

```
sudo yum install https://dbeaver.io/files/dbeaver-ce-latest-stable.x86_64.rpm
# インストール後
dbeaver # ターミナルから起動できる。
```

起動すると以下のようになるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/7604179a-8149-11ac-f6d2-5123b22d12ac.png)

以上です。
Poetryに`The _posixsubprocess module is not being used.`などと言われる

# 解決したい問題

`ubuntu18.04` に `poetry` をインストールして `poetry --version`などとした際に以下の警告が出る。

```bash
$ poetry --version
/home/r7/.poetry/lib/poetry/_vendor/py2.7/subprocess32.py:149: RuntimeWarning: The _posixsubprocess module is not being used. Child process reliability may suffer if your program uses threads.
  "program uses threads.", RuntimeWarning)
```

# 原因

どうやら`python2`系を見に行ってしまっているらしい。
同様の問題が以下のISSUEで議論されていた。

https://github.com/sdispater/poetry/issues/1257

# 解決策

https://github.com/sdispater/poetry/issues/1257#issuecomment-516132057

以下のファイルの行頭にある `#!/usr/bin/env python` を `#!/usr/bin/env python3` に書き換えると直るらしい。

```
~/.poetry/bin/poetry
```

やってみたところ、直った。

```bash
~$ poetry --version
Poetry 0.12.17
```

あきらかに暫定的な対象方法だと思うので、今後ライブラリで対応されることを待ちたい。
Javascriptでプロパティの存在確認からの追加と削除の方法

以下のエラーが発生したので、プロパティの有無をチェックする方法を調べた。

```
Uncaught TypeError: Cannot read property 'name' of undefined
```

# プロパティの確認方法
`indexOf`または`in`を使う！

```js
let myobject = {
   name : 'kohei'
}

console.log(Object.keys(myobject).indexOf('name') !== -1); //true
console.log(Object.keys(myobject).indexOf('age') !== -1); //false

console.log('name' in myobject); //true
console.log('age' in myobject); //false
```

# プロパティの追加方法
```js
myobject.age = 24;
myobject["busyo"] = 'eigyo';
```

# プロパティの削除方法
```js
delete myobject.age
```
Xamarin.iOSのReleaseビルドだけ処理が止まったときに

最近Xamarin.iOSアプリでデバッグビルドではなんともないのにリリースビルドだけ処理が止まったりUIが更新されない不具合に遭遇したので、その覚書です。

## デバッグの有効化

なにはともあれ、デバッグできるようにする必要があります。

Visual Studio でプロジェクト設定を開いて、以下の2箇所を設定しましょう。

* コンパイラ > デバッグ情報のプルダウンを「すべて」に変更する。
* ビルド > iOSデバッグ > デバッグを有効にするのチェックをONにする。

## リンカーによる削除

Xamarinに慣れている人には周知のことですが、android, iOSのリンカーは最適化のために特定のクラスやメソッドを削除します。
外部APIを呼び出して、JSON.NET でデシリアライズしているようなケースではここを疑いましょう。対策は以下を参照。
<https://xamarinhelp.com/xamarin-linker/>

## 非同期処理の問題

非同期処理はデバッグとリリースで差が出やすいものの一つです。

Xamarin固有の問題では、UIスレッドで重い仕事をしてしまっている、バックグラウンド化しているが、更新通知を大量に送ってしまい、処理が詰まっているなどが考えられます。

Task.Run/TaskFactory.StartNew および InvokeOnMainThread/ Activity. RunOnUiThread / Device.BeginInvokeOnMainThread を呼んでいるところをシンプルにして原因を特定しましょう。

## ライブラリ固有の問題

### SQLite

上と関連しますが、SQLite.iOSのネイティブバイナリが一部スレッドセーフではないようで、スレッド周りの挙動が変わるといきなりおかしくなることがあります。

SQLiteConnectionを開くときに SQLiteOpenFlag.FULL_MUTEX フラグを設定しましょう。