OmniAICreator/Qiita-1.07M huggingface dataset:
IRIAM対応端末まとめ

初めまして、マイナー次郎です。個人メモでまとめておきます。
不定期に記事は変えていきます。
#IRIAMってなんぞや
「キャラと“ガチ恋距離”で会話できる！」ーーVライバーと会話できるライブ配信プラットフォームアプリです・
誰でもVtuberになれるアプリです。
#なぜこんな記事を書くのか
理由は今回のアップデート大幅な仕様変更が行われたからです。
#対応機種まとめ(2019/04/09現在)
###iphone端末

| iphone6s         | iphone6splus      |
|:-----------------|------------------:|
|iPhoneSE          | iPhone7           | 
| iPhone7Plus      | iPhone8           | 
| iPhone8Plus	   | iPhoneX           | 
|iPhoneXS	   |iPhoneXS Max       | 
|iPhoneXR          |iPhone 11          |
|iPhone 11 Pro     |iPhone 11 ProMax   |
|iPhone SE(第二世代)|                   | 
##注 Iphone X以降の端末はFaceID対応です。
###android 
公式での動作環境です。
- 対応OS:Android 8.0以降
- 対応CPU：64bit


| Sony Xperia 5        | Sony Xperia 1 |
|:-----------------|------------------:|
|Sony Xperia XZ3   | Sony Xperia XZ2 Premium　| 
|Sony Xperia XZ2|Sony Xperia XZ2 Compact| 
| Sony Xperia XZ Premium |Sharp AQUOS zero | 
|Sharp AQUOS R3|Sharp AQUOS R2| 
|Sharp AQUOS R compact|Sharp AQUOS sense2|
|Samsung Galaxy Note 10+|Samsung Galaxy S10|
|Samsung Galaxy S9|Samsung Galaxy S8|
|Samsung Galaxy A30|Samsung Galaxy Feel2|
|LG LG style2|LG V20 PRO|
|Huawei HUAWEI P30 lite|Huawei Huawei P20 Pro|
|Huawei HUAWEI P20 lite|Huawei Huawei P10 Lite|
|Google Pixel 4|Google Pixel 3a|
|Google Pixel 3|Fujitsu arrows NX|
|Fujitsu arrows Be|| 
~~これに追記で画像にないモトローラ社moto g(6)plusも対応しています。(筆者の環境下ですのであくまで参考程度に。)~~
2020年7/4追記
上記端末は対応しなくなりました
#非対応端末でも使いたい場合
私のブログで書いてますので参照してください。
前提条件は64bit端末のみです。
ブログページ:https://minerjirou.wp.xdomain.jp/2020/07/14/ぼくとiriamの長い闘い/
ターミナルからポートを指定してマシン上で動作しているプロセスがLISTENしてるか調べる

### netstat を使う場合

```
$ netstat -an | grep 9000
tcp46      0      0  *.9000                 *.*                    LISTEN   
```

### lsof を使う場合

```
$ lsof -i:9000 
COMMAND    PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
??? 84196 guest    9u  IPv6 ???      0t0  TCP *:cslistener (LISTEN)
```

こちらではプロセスIDも取得できる。
MAC　右クリックで新規ファイルを作成する

初投稿です！
日頃ソースやPCを触って上手く出来たことや気になったことを残しておく備忘録的な用途で使用しています。
間違った箇所があればご指摘くださいm(_ _)m

この業界に入ってからMacbook Airを使い始めて思ったのが、
windowsでデフォルトで使用できた機能、右クリックで新規ファイルを作成するっていうのがmacでは出来ないということ。

ソースを書くときにいちいちターミナルのtouchコマンドを使用して新規ファイルを作成するのって面倒だなーと思ったので調べてみたらAutomatorの設定を変えることで右クリックで新規ファイルを作成することが出来るとのこと。

※追記
何も右クリックでファイルを作成しなくても色々やり方はあったなと気がつく。
ターミナルに入ってtouchコマンドでファイルを作成したり、vscodeで新規ファイルを作成したりとか。。。
知識０の状態で書いた記事は結構訂正や削除しなければいけないかなと思ったりする。

手順

①Automator.app起動
　command +　スペースで spotlight検索を出しAutomatorを検索

②設定変更
　書類の種類を選択してくださいからクイックアクションを選び選択ボタンを押下
　ワークフローが受け取る現在の項目：　ファイルまたはフォルダを選択
　アクションの中のユーティリティのAppleScriptを実行を右にドロップ
　AppleScriptを実行のテキストの中に下記コードをコピペ

    property defaultFileName : "newTextFile"

    on run {input, parameters}
	
	try
		tell application "Finder" to set the sourceFolder to (folder of the front window) as alias
	on error
		-- no open folder windows
		set the sourceFolder to path to desktop folder as alias
	end try
	
	set flagFileExists to true
	set indexFile to ""
	
	repeat while flagFileExists
		set indexFile to (indexFile + 1)
		tell application "Finder"
			set flagFileExists to (exists file (defaultFileName & indexFile & ".txt") in sourceFolder)
		end tell
	end repeat
	
	try
		tell me
			activate
			set newFileName to text returned of (display dialog "Enter new file name" default answer "" & defaultFileName & indexFile)
		end tell
		if newFileName is not equal to "" & defaultFileName & indexFile then
			set defaultFileName to newFileName
		end if
		set newFile to "" & sourceFolder & newFileName & ".txt"
		
		if not flagFileExists then
			set touchScript to "touch " & quoted form of (POSIX path of newFile)
			set openScript to "open " & quoted form of (POSIX path of newFile)			
			do shell script touchScript
			do shell script openScript
		else
			display dialog "File already exists"
		end if
	end try
	return input
    end run





　コピペ後にハンマーボタンを押下してコンパイルする。→色が変わるのを確認

③設定を保存
　ここでは新規ファイル作成で保存
<img width="1440" alt="スクリーンショット .png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606803/d0475184-d8d9-295c-d674-c5488ef17774.png">


④実際に新規ファイルを作成
　ディレクトリの上にカーソルをあわせて右クリック
　新規ファイル作成があるはずなのでそこをクリックすると新規ファイルができている。
　ディレクトリ内には出来なかったのでディレクトリ内に新規ファイルを作成する方法をご存知の方は
　ご指摘いただければ幸いです。


macOS Catalina バージョン　10.15.4

参照
https://j-wort.hatenadiary.org/entries/2012/12/23
[Android]PCへのミラーリング

はじめに
===
Scrcpyを使用して、Android端末の画面を簡単にPCにミラーリングする方法を記載していきます。

環境
===
OS：Windows 10
Android：エミュレータ（Android 8.1）
Scrcpy：1.12.1

Scrcpyとは
===
以下で開発されているオープンソースのミラーリングツールとなっています。
https://github.com/Genymobile/scrcpy/
・ミラーリング
・PC上でのAndroid端末操作
・Android画面の録画
などができるようです。

Scrcpyの使い方
===
1．Scrcpyをダウンロード
以下からダウンロードしてください。
[scrcpy-win64-v1.12.1.zip](https://github.com/Genymobile/scrcpy/releases/download/v1.12.1/scrcpy-win64-v1.12.1.zip)

2．zipファイルを適当な場所に解凍
3．Android端末で開発者モード > USBデバッグをON
4．2で解凍したファイル内のscrcpy.exeを実行

Android端末の画面の録画
===
1．コマンドプロンプトを起動
2．以下を実行

```
scrcpy.exe -m 1920 -r <ファイル名>.mp4
```

3．1と別のコマンドプロンプトを起動
4．以下を実行

```
adb disconnect
```


参考文献
====
[【OculusQuest】画面共有（ミラーリング）する方法まとめ [PC/テレビ/スマホ]](https://www.cg-method.com/entry/oculus-quest-mirroring-scrcpy/#scrcpy-2)
[【scrcpy】パソコンから Android を操作する【ミラーリング】](https://noitalog.tokyo/scrcpy/)
Web APIの概念を押さえる

#APIとは
Web APIの前に、そもそもAPIとはApplication Program Interfaceの略。どのアプリーケーションでも共通で使える機能を提供する仕組み。

>
　例えば「AというファイルをBという名前でコピーをして、作業完了したら、ポップアップウィンドウを出して知らせる！」というプログラムを作るとします。実際にどんな動きをするのかパートに分けてみると……、

>1. Aというファイルを選択
2. 実行ボタンを押すと3のステップへ
3. データをコピーする
4. コピーされたデータをBという名前を付け保存
5. ポップアップウィンドウを出して作業完了を告げる
　

>この1.〜5.の作業をすべて一から作成すると、かなり手間が掛かります（マウスの動きを計算して、ウィンドウのデザインを考えて……）。そこで登場するのがAPIです。

>1. ファイルを選択するAPI
2. ボタンを押すとプログラムを動かすAPI
3. データをコピーするAPI
4. ファイルに名前を付けるAPI
5. ウィンドウを出してメッセージを出すAPI


>と、いろいろな機能があるAPIから、必要なAPIを探し出し組み合わせるだけで、プログラムができてしまうのです。つまりAPIは「特定の機能を持つプログラム部品」なのです。よく使われる命令をAPIにしてみんなで共有してしまえば、非常に効率的に作業ができますね。

>API
![alt](https://image.itmedia.co.jp/ait/articles/0703/13/r85minapi_01.gif)
図1　APIを使えば、細かい作業や無駄を省いてプログラムができる

>by https://www.atmarkit.co.jp/ait/articles/0703/13/news095.html

#Web APIとは

Web APIはWebサービスの窓口。外部Webサービスから通信を通して、操作することができる。自分で作成することも可能。

具体例 １：【マッチングアプリ】
Facebook APIから情報を取得。Facebook API経由でFacebookの友達のデータを取ってきて、そのデータを元にその人とは会わないようにアプリ側が人をマッチングさせてくれる。

具体例 ２：【食べログ】
Google Maps APIから情報を取得。「ウェブサイトに地図を埋め込む」、「レストランや店舗のデータベースを、地図情報とともに提供する」、「目的までの最適なルートを探し出す」、といった機能を実現している。

具体例 ３
PythonでTwiiter APIからツイートを取得しフォロワーの全ての人のデータを取ってくることもできる。


#Web APIに対応している主なサービス

- Twitter
- Instagram
- Youtube
- Google map
- Slack
- Chatwork
- 仮想通貨


#APIを実装してみる

- [Web APIとは？ （LINE bot API・グルナビAPI）](https://qiita.com/Masato338/items/6fb1ac277c965905e019)
グルナビを利用したLINEBOT


- [Ruby on Rails: twitterでユーザー認証]
(https://qiita.com/keiya01/items/c96a0393c76f5560ee41)
Twitterを利用したユーザー認証


- [ドットインストール/Google Maps API入門 (全17回)]
(https://dotinstall.com/lessons/basic_google_maps_v2)
Google Maps APIを使ってGoogle Mapを埋め込む

#参考資料
https://qiita.com/busyoumono99/items/9b5ffd35dd521bafce47
https://qiita.com/Arata0608/items/f292dedffc8c0db1df28
https://www.atmarkit.co.jp/ait/articles/0703/13/news095.html
CircleCIに秘密鍵が登録できない


[公式](https://circleci.com/docs/2.0/add-ssh-key/)通りに秘密鍵を生成し登録しようとしても以下のエラーがでてしまう。

```It looks like this private key is invalid. Please check if you have pasted the right key. If you are sure your key is valid, please contact support for assistance.
```
### 原因
秘密鍵を貼り付ける際に、以下を省略したためエラーが発生していた。
```-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
```

<br>

同じエラーで詰まった人の助けになれば幸いです。
Neural Network Console Challengeに参加してみた　その4

# 1前回までのあらすじ
Neural Network Console Challengeに参加し、PIXTAより提供された写真にうつる人物像について、その部位ごとに分類というテーマを選択。教師データ作成のため3000枚の分類を実施し、Neural Network Consoleを使った学習を開始。CNN＋ImageAugmentationでAccuracy　0.55が超えるものが出たので、このまま構造自動探索機能を使って放置したのが前回までのあらすじ。
# 2構造自動探索機能の結果を見てみる。
前回までの作業は夜に行い、寝る前に自動探索を開始し、翌日帰宅後確認で約20時間の探索。EPOCHは200で実施し、30ほどのネットワークが出来ていた。その中でErrorが最も少ないネットワークで結果を見てみる。
#3改善方法を考える　その1
推論を行い、まずはConfusion Matrixを見てみる。Accuracyは0.61でそこそこ改善。
　まず気がつくのが、カテゴリごとの総数が大きくばらついていること。設定した分類では複数人がうつっているものは部位による判定の判断外としたが、3000枚の写真を7つに分類したが、複数人が映り込むものは約2000枚、3分の2がこの分類になっている。一方で顔がうつっていないという分類の写真は数が少なく、100枚程度しかない。分類ごとの正解率も枚数の多い複数人は高く、枚数の少ないものは正解率も低い。枚数に大きなばらつきがあると学習時に偏りが出てしまうのでは？などと思う。
　次に不正解となったものの特徴を見てみると、これは分類が厳しいだろうなと思えるものは意外に少なく、教師データの分類間違いが多い。3000枚を三日に分けて行うと判定基準が曖昧になってくること、操作ミスをしてしまうことで間違いが出ているようだ。
　二つの気づきより、次の方針で教師データを調整することにした。まずは分類間の偏りをなくすために複数人が映り込んでいるものを減らす。他の分類を増やす方法もあるのだが、この時点では気力がわかず楽な方に流れた。次は教師データの間違いの是正。同じ分類するのなら間違いを減らす方が効果的と思う節もあった。
#4改善を実施する　その1
教師データを再作成し同じネットワークで学習～推論を行う。Accuracyは0.63でわずかに改善。この日はここで時間切れとなり、自動探索機能を仕込んで就寝。こののち数日間は分類間違いの修正、自動探索機能を仕込んで就寝を繰り返した。
#5締め切りが延びた
そうこうしているうちに締め切りも間近となりとりまとめの資料を作りかけていたところに、締め切りが延びたとのメールが事務局より入る。3月27日締め切りが、3月31日締め切りになったのだ。ちょっとやる気が出てきたので、枚数の少ない分類の追加作業を行うことにした。これまでランダムに行っていた分類作業を、これまでの分類で少ない写真を選び追加する方法に切り替えた。本来なら締め切りの過ぎていた3月28，29日の両日で2000枚を追加分類した。先日に除外した複数人うつりこむ画像も再度教師データとして使用して、合計5000枚の教師データが完成した。ネットワークも数日間の自動探索機能の動作でもともとのCNNとは似ても似つかぬ魔改造されたネットワークが出来てきた。
![N2C2 ｜ Neural Network Console Challenge.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/97ac5259-84f6-570d-64bf-4a57269974a9.jpeg)

#6締め切り当日
提出用のネットワークではAccuracyは0.725までもってこれた。![N2C2 ｜ Neural Network Console Challenge2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/b4a689a3-a443-2935-5d76-e80ff10c704e.jpeg)
とりまとめ資料を完成させ、19時頃に事務局に提出し完了。晩ご飯に行く前、少し気になってNeural Network Consoleにサンプルとして含まれるResNet-50を使ってみようと思い立つ。画像サイズとImageAugmentationの部分を修正して動かしてみる。食事から自室に戻る。雑用を行って寝るかと、先ほどのResNet-50を忘れていることに気がついて、推論をしてみる。はたしてAccuracyは魔改造ネットワークを軽々と超える0.74である。しかも、ImageAugmentationの設定を間違えており、これでまだ少し上がるはずと気づき、修正の上再度学習させる。現在23時。締め切りは23時59分、学習の残り時間は50分。間に合うのか？資料を修正し、待ち構え、学習終了は予定通り23時50分、推論を行い、Accuracyは0.758でさらに改善、結果を張り替え提出。23時57分のことであった。
![N2C2 ｜ Neural Network Console Challenge3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/8633368d-3c9e-d0c4-1aff-4e9843a8bde8.jpeg)
#7反省会
提出後ExecutorのNumber of evaluationsの設定が16回Lastになっていることに気づき、後2，3％は稼げたのではとがっかりする。
【自然言語処理】日本語の教師なし学習をやってみた

日本語の文章をクラスタリングします。

# インストール
```
pip install -U sentence-transformers
```

# コード

下記の文章を5つに分類する。

```
'男はご飯を食べた。',           '男はパンを食べた',           '女はスープを飲んだ',           '女子はスマホでメールを送る。',           '私は時計を彼女に送る。',           '男は車に乗る',           '小学生が自転車に乗る',           'サルがドラムを演奏する',           'カンガルーがタンバリンを叩く',           'チーターが獲物の後ろを走っている。',           'チーターが獲物を追いかける'
```

```python
from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans
import random
embedder = SentenceTransformer('distiluse-base-multilingual-cased')
# Corpus with example sentences
corpus = ['男はご飯を食べた。',
          '男はパンを食べた',
          '女はスープを飲んだ',
          '女子はスマホでメールを送る。',
          '私は時計を彼女に送る。',
          '男は車に乗る',
          '小学生が自転車に乗る',
          'サルがドラムを演奏する',
          'カンガルーがタンバリンを叩く',
          'チーターが獲物の後ろを走っている。',
          'チーターが獲物を追いかける'
          ]
random.shuffle(corpus)
corpus_embeddings = embedder.encode(corpus)

# Perform kmean clustering
num_clusters = 5
clustering_model = KMeans(n_clusters=num_clusters)
clustering_model.fit(corpus_embeddings)
cluster_assignment = clustering_model.labels_

clustered_sentences = [[] for i in range(num_clusters)]
for sentence_id, cluster_id in enumerate(cluster_assignment):
    clustered_sentences[cluster_id].append(corpus[sentence_id])

for i, cluster in enumerate(clustered_sentences):
    print("Cluster ", i+1)
    print(cluster)
    print("")
```

# 結果

```
Cluster  1
['女子はスマホでメールを送る。', '私は時計を彼女に送る。']

Cluster  2
['小学生が自転車に乗る', '男は車に乗る']

Cluster  3
['サルがドラムを演奏する', 'カンガルーがタンバリンを叩く']

Cluster  4
['男はパンを食べた', '男はご飯を食べた。', '女はスープを飲んだ']

Cluster  5
['チーターが獲物を追いかける', 'チーターが獲物の後ろを走っている。']
```

#参考
https://github.com/UKPLab/sentence-transformers
SplunkのPythonでJSONをCSVにする

[Splunkで日本のCOVID19感染状況を表示する（改訂２版）](https://qiita.com/toshikawa/items/ff47dcfb4d23e11e2f37)においてpythonを利用しHPからデータをダウンロード、CSVに加工している。

Splunkは`pandas`が入っていなく、Windowsの人とかだと敷居が高そうなので、Splunk内pythonでなんとかならないか頑張ってみた。

#コード
```python:dl_json_to_csv2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import csv

headers={'accept': 'application/json', 'content-type': 'application/json'}
url = 'https://www3.nhk.or.jp/news/special/coronavirus/data/47patients-data.json'

response=requests.get(url,headers=headers)
json_obj = response.json()

##日付データの格納
header=["pref"]+[i for i in list(json_obj['category'])]

##感染者数データの格納
lst = [[] for _ in range(len(json_obj['data47']))] ##初期化
for j,json in enumerate(json_obj['data47']):
    lst[j].append(json['name'])
    for json2 in json['data']:
        lst[j].append(json2)

##CSV書き込み
with open('japan_covid19.csv', 'w', encoding='UTF-8',newline='') as f:
    writer = csv.writer(f)
    writer.writerow(header)
    writer.writerows(lst)
```
なんとかなったのが、以上のコード

```python:splunk
$SPLUNK_HOME/bin/splunk cmd python3 ./dl_json_to_csv2.py
```
で動作確認済
#pythonistaによる添削
```python:dl_json_to_csv2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import csv

headers={'accept': 'application/json', 'content-type': 'application/json'}
url = 'https://www3.nhk.or.jp/news/special/coronavirus/data/47patients-data.json'

response=requests.get(url,headers=headers)
json_obj = response.json()

lst = [['pref']+json_obj['category']] + [[json['name']]+json['data'] for json in json_obj['data47']]

with open('japan_covid19.csv', 'w', encoding='UTF-8',newline='') as f:
        writer = csv.writer(f)
        writer.writerows(lst)
```
:astonished: あまりにも高度な技能は魔法ですね。
###解説
```python:
a=['1']
b=['2','3']
c=[a+b]
d=['4']
c+d
```
の結果は
`[['1', '2', '3'], '4']`
`list`を`[]`で囲ってあげるとリスト内リストになる。

```python:
d={'data47':[{'name':'4','data':['5','6','7']},{'name':'8','data':['9','10','11']}]}
e=[[json['name']] + json['data'] for json in d['data47']]
e
```
の結果は
`[['4', '5', '6', '7'], ['8', '9', '10', '11']]`

したがって

```python:
a=['1']
b=['2','3']
c=[a+b]
d={'data47':[{'name':'4','data':['5','6','7']},{'name':'8','data':['9','10','11']}]}
e=[[json['name']] + json['data'] for json in d['data47']]
c+e
```
`[['1', '2', '3'], ['4', '5', '6', '7'], ['8', '9', '10', '11']]`
###より細かく
`e`はリストで

- 内包全体: `変数を使った式 for 変数 in リスト`
- 式: `[json['name']] + json['data']`
- 変数: `json`
- リスト: `d['data47']`

例えば

```python:
d={'data47':[{'name':'4','data':['5','6','7']},{'name':'8','data':['9','10','11']}]}
e=[json['name'] + json['data'] for json in d['data47']]
e
```
とすると`TypeError: can only concatenate str (not "list") to str`となる。
`json['name']`の戻りが`str`に対して`json['data']`は`list`
`list`同志じゃないと結合ができない。

:smiling_imp: なんかわかってきた。
#まとめ
`type ()`でいちいち配列がどっちだか確認しながら作っていきました。
リスト内リストを作るところでハマり、不格好なコードになってしまいました。
~~現在添削中です。~~pythonistaに添削してもらいました。

~~綺麗になったら、~~Splunkダッシュボード用にしたいと思います。
新入社員達へ贈るライフハック（質問編）

# はじめに

自分が新人だった頃（を思い出すと、「問題意識を持て」とか「プロ意識がどうたら」とか高尚過ぎるアドバイスを受けたりして、わかったようなわからないような困ったかんじでした。

そういう奥義みたいなアドバイスじゃなくて、新入社員の立場で考えて、かんたんですぐに実践できるアドバイスができればいいな、と思いました。

で、過去の研修で感じたのが「質問があんまりないな～」という点でした。
そこで、私の乏しい経験から、質問をする為のライフハックを書いてみたいと思います。


## 話を聞くときの意識

１．「わからないから質問する」のではなく、「質問する為にわからないことを探す」

説明する側は、わかってもらえるように説明していますから、
なんとなく聞いていても質問はあまり思い浮かびません。
質問するという前提で話を聞くくらいでちょうどよいです。


２．話を聞きながら、気になった箇所に印をつけたりして、後で聞けるようにしておきます。

「何が書かれているか、何が説明されているか」だけではなく、「何が書かれていないのか、何が説明されていないか」を意識する。

1から10まで完璧に説明があるというのは稀で、何かが欠けていたり省略されていたりします。
説明する側も、あらかじめ全て網羅した説明を用意するのも大変なので、「わかんなかったら質問あるだろ」ってノリで準備していたりします。


## 簡単に質問をひねり出すTIPS
意識の持ち方は良いとして、具体的にはどうするの？というところに触れていきます。

１．自分がやらないといけない作業をイメージしてみて、うまくイメージできないところを聞く。

- 例：「mm/ddにyy研修やります」
    - 何時から開始ですか？
    - どこに行けばよいですか？
    - 何か持参すべきものはありますか？
    - 事前にやっておくべきことはありますか？
などなど


２．目的、終了条件を聞く
指示されたことについて、何の為にやるのか、どういう状態になればよいのか、理解できていない場合は確認してみよう。
※「それ何の為にやるのですか？」などと聞くと喧嘩売っていると思われるので聞き方に注意！


３．自分の言葉で置き換えてみる


４．自分の理解が正しいことを確かめる為に、「ｘｘｘというのは、○○○というように理解しましたが、認識合っていますか？」
というような質問をしてみる。

自分は分かったけど、他の人はわかってないっぽいことを敢えて質問する。

自分は質問無いけど、場がシーンとしているときにやってみよう!


# おしまい
質問をするというのは、わからないことを解決するだけでなく、自分のアピールをする手段でもあります。

よい質問ができるようにがんばりましょう。
茨城県におけるコロナウイルス感染動向を作ってみた。

#やったこと
茨城県におけるコロナウイルス感染動向を作ってみました。

#開発した理由
東京都を筆頭に、他の都道府県の感染動向に関するウェブサイトは開発されているようでしたが、私の地元である茨城県の感染動向については開発されていなかったためです。
茨城県出身のエンジニアは他の都道府県に比べて少ないのでしょうか、、、

#コンテンツ
- 感染者数
- 感染者数推移
- 性別毎の感染者比率
- 年齢別の感染者比率
- 地域毎の感染者数

![感染者数と感染者数推移](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577071/b744ff35-14db-f158-ac6f-63447073c171.png)

![性別毎/年齢毎/地域毎の感染者情報](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577071/f9b9124f-77aa-af20-e5d3-b25de95aedcf.png)

#使用したデータ
[茨城県境町：茨城県及び近県における新型コロナウイルス感染者について](http://www.town.sakai.ibaraki.jp/sp/page/page002165.html)
そもそも、茨城県のコロナウイルスに関するデータが本当に少なかったです。
調べた限りですと、この一つしかなかったため、自分で[Jsonファイル](https://raw.githubusercontent.com/kazuma007/ibaraki_json/master/ibaraki.json)を作成いたしました。
情報の正確性については万全を期しましたが、誤りがあるかもしれません。
茨城県に関するJsonファイルなどございましたら、どなたか教えてください、、、

#学んだこと
##非同期処理とコールバック関数
先週から本格的にJavaScriptの学習を始めました。
ネットにあるJsonファイルを取得すること（fetchメソッド）を通して、コールバック関数と非同期処理を学びました。
これは前回[記事](https://qiita.com/dumbbell/items/a801e20fb812ff4dbc83)にしましたので、ご興味ある方はご覧ください。

これまでドットインストールで基本文法やオブジェクトの扱い方、DOM操作を学んだ後にいくつかゲームを開発しました。
やはり、実際に自分で何か考えて開発すると、よりいっそう知識が身につきますね！
これからも自分なりにアウトプットをしていこうと思います。
cssサイズ指定　メモ

#サイズ指定のpx,%,em,remについて
サイズ指定には**絶対値**と**相対値**があります。
-絶対値　px
-相対値　%、em、rem

**絶対値**とは**他の値に左右されない値**のことを言います。
**相対値**とは**他の値を参考に数値が決まる値**のことを言います。

###%とemについて
%とemは親要素を元に値を決めます。
%は

```html:HTML
<div class = "container">
    <div class = "hello">Hello World</div>
</div>
```

```css:css
.container{
  font-size:10px;
}
.hello{
  font-size:200%;
}
```

とすると親要素の10pxの200%なので2倍となります。

emは
1em = 100%なので

```html:HTML
<div class = "container">
    <div class = "hello">Hello World</div>
</div>
```

```css:css
.container{
  font-size:10px;
}
.hello{
  font-size:2em;
}
```

とすると同じく2倍になります。

###remについて
remは%、emと少し違い、親要素は一緒でもルート要素を元にします。
**ルート要素**とはhtmlセレクタを指します。

```css:css
.html{
  font-size:20px;
}
.hello{
  font-size:1rem;
}
```

この場合ルート要素の20pxに1remなので1倍となり、20pxの大きさになります。
Node.jsとMongoDBの環境をDockerで構築

# はじめに
Node.jsとMongoDBの組み合わせのDocker環境をネットで調べると、ちゃんと動くものがなかったので、自分で作成しました。

# 環境構成
WebフレームワークはNode.js、データベースはMongoDBを使用します。
また、Nginxのリバースプロキシを用いて、Node.jsに接続できる環境にしています。

# ディレクトリ構成

```
my-project
       |-- nginx
       |     └ site.conf
       |-- server
       |     ├ Dockerfile
       |     ├ package.json
       |     ├ package-lock.json
       |     └ app.js
       └-- docker-compose.yml
```

## /nginx
site.confにはNginxのリバースプロキシの設定を書きます。

```site.conf
server {
  listen 80;
  server_name localhost;
  error_log /var/log/nginx/error.log;
  access_log /var/log/nginx/access.log;
  root /app;

  location / {
    # リバースプロキシ設定
    proxy_pass http://server:8080/;
  }
}
```

## /server
server内のDockerfileには、Node.jsの環境設定を書きます。
(以下のファイル名の末尾のコンマは無視してください)

```Dockerfile.
FROM node:alpine

# ワーキングディレクトリを作成
WORKDIR /usr/src/app

# アプリケーションの依存関係をインストールする
COPY package*.json ./    # package-lock.jsonもコピーするために*（ワイルドカード）を使用しています
RUN npm install

# アプリケーションのソースをバンドルする
COPY . .

# アプリケーションを起動
CMD [ "node", "app.js" ]
```

package.jsonは手書きするか npm init を使用して作成します。
以下に、サンプルを記述しておきます。
mongooseをインストールしておかないと、MongoDBとの接続を確認できないので、注意してください。

```package.json
{
  "name": "server",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "main": "app.js",
  "author": "sample",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "mongoose": "^5.9.7"
  }
}
```

app.jsは手書きします。

```app.js
// モジュールをロード
const express = require("express"),
      mongoose = require("mongoose");

// ポートとホストを設定
const PORT = 8080;
const HOST = "0.0.0.0";

// expressを使用
const app = express();

// データベース接続
mongoose.connect(
  "mongodb://mongo/test",  // testというDBに接続しています
  { useUnifiedTopology: true,
    useNewUrlParser: true
  }
);

const db = mongoose.connection;
db.once("opne", () => {
  // 接続できると以下のログが出力されます。
  // 接続できない場合はエラーが出力されます。
  console.log("Success MongoDB connected!!");
});


// 指定されたポートを監視
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
```

## /
docker-compose.ymlには、全体の構成を書きます。

```docker-compose.yml
version: '3'

services: 
  server:
    build: ./server
    container_name: "server"
    ports:
      - 8080:8080
    links: 
      - mongo
    depends_on: 
      - mongo
    volumes: 
      - ./server:/server
      - /home/app/nodeapp/node_modules

  nginx:
    image: nginx:latest
    container_name: "nginx"
    ports:
      - "80:80"
    depends_on: 
      - server
    volumes: 
      - ./server:/server
      - ./nginx/site.conf:/etc/nginx/conf.d/default.conf:cached
  
  mongo:
    image: mongo
    container_name: "mongo"
    command: 
      - mongod
    ports:
      - 27017:27017
    volumes:
      - mongo-data:/data/db
      
  mongo-data:
    image: busybox

volumes: 
  mongo-data:

```

# MongoDB内のデータの永続化
docker-compose.yml内に書いている mongo-data の image: busybox でデータの永続化をしています。
これによって、dockerコンテナをダウンさせても、次回立ち上げ時にデータを維持することができます。

#
skt-war-resultをインストールする

##skt-war-resultとは
ネットゲーム「リネージュM」の最新攻城戦結果を表示するPythonコマンドラインツール

## 環境
```
$ python -V
Python 2.7.16

$ python3 -V
Python 3.7.3
```

## pipでインストール

```
$ pip install skt-war-result
```

## 実行
```
$ skt-war-result
城獲得日	サーバー名	ケント城	オーク砦	ウィダウッド城
城獲得日 2020年4月5日	デポ1	田中家	ゴリラパーク	Liberte
城獲得日 2020年4月5日	デポ2	HOALOHA2	Crescents	HOALOHA
城獲得日 2020年4月5日	デポ3	進撃の軍臨	精英團隊	NAMEKO
城獲得日 2020年4月5日	ケン1	デス	SAMURAI	CAMARADE
城獲得日 2020年4月5日	ケン2	Emulators	EmuIators	AntiKings
城獲得日 2020年4月5日	ケン3	OldCastle	黒の組織	tatami
城獲得日 2020年4月5日	イシ1	ぴよっこ	DelsolCounter	PurpleRed
城獲得日 2020年4月5日	イシ2	Aegis	JamPanFactory	Gungnir
城獲得日 2020年4月5日	イシ3	無神領域	木葉忍者村	軍臨城下
```

##リンク
https://lineagem-jp.com/siege

##github
https://github.com/Yumenoshima/skt-war-result

##pypi
https://pypi.org/project/skt-war-result/
10rep - フレーズ検索  Elasticsearch

# 正確にマッチさせたいフレーズ検索
- フレーズで簡単に検索するには、次の例のようにダブルクォーテーションで単語を囲みます。
- explain 有効にしていれば、フレーズでマッチしていることが確認できます

``` bash
GET one_year_comment/_search
{
  "query": {
    "query_string":{
      "default_field" : "comment",
      "query":"\"{フレーズ}\""
    }
  },
  "size": 100
}
```

# 複数

``` bash
GET one_year_comment/_search
{
  "query": {
    "query_string":{
      "default_field" : "comment",
      "query":"\"{フレーズ}\" \"{フレーズ}\""
    }
  },
  "size": 100
}
```

# Python

``` python
import pandas as pd
from elasticsearch import Elasticsearch

fname="FILE_NAME.tsv"
df_tsv = pd.read_csv(fname, sep='\t', dtype=str)

es = Elasticsearch("http://{IP}:9200")

search_list = df_tsv['検索対象'].tolist()
search_count_res = []

##############################
for child in search_list:
  es_count_res = es.count(
                   index="one_year_comment",
                   body={
                          "query": {
                            "query_string": {
                              "default_field" : "comment",
                              "query":'\"'+child+'\"'
                            }
                         }
 })
  search_count_res.append(es_count_res["count"])
##############################

df_tsv['search_count'] = search_count_res

#print( df_tsv[["検索対象","search_count"]]  )
df_tsv.to_csv('OUTPUT_SERACH_COMMENT.tsv', sep='\t')
```
SQL Server 事始め

# はじめに
SQL Serverついて学習したことを形として残しておくために投稿していきます。
まずは **事始め** ということでSQL Serverの概要や学習に向けて行った準備などについて書いていこうと思います。

# SQL Serverとは
正式名称は **Microsoft SQL Server**
その名の通り、Microsoftが開発したデータベースです。
SQLを拡張したT-SQL(Transact-SQL)というSQL言語を使うことができます。（もちろん普通のSQLも使用可能です）
※T-SQLについてはまた今度記事にします

# 学習を始める前に
とにもかくにも環境構築ですね。

## SQL Serverのインストール
SQL Server本体です。
以下のサイトからインストーラーをダウンロードし、ローカルPCにインストールします。
https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads
![sql_server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/65158e79-718a-5b6a-3ea9-9d3af7a3cacb.png)

### Edtionについて
SQL Serverには4つのEditionが用意されています。
https://www.microsoft.com/ja-jp/sql-server/sql-server-2017-pricing

- Enterprise
- Standard
- Web
- Developer
- Express

この中でDeveloperとExpressは無料ですので、どちらかを使用していきます。
この2つの違いは以下の通りです。

|Edition|内容|
|----|----|
|Developer|有料版と同等の機能を使用可能だが、運用環境上での使用が禁止されている|
|Express|機能制限があったり容量上限(10G)があったりするが、運用環境でも使用可能|

今回は学習のために使用するので **Developer** を選択しました。

## SSMS (SQL Server Management Studio)のインストール
SSMSはSQL Serverのデータベース管理ツールです。
MySQLでいうところの[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)。
現在ではLinux上でも動作する **SQL Server on Linux** も存在するため、CUI上でクエリを実行するケースもあると思いますが
あくまで学習用なのでGUIを使っていこうと思います。

以下のサイトからインストーラーをダウンロードし、ローカルPCにインストールします。
https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

### SQL Serverの接続設定
インストールが完了したら、先ほどインストールしたSQL Serverとの接続設定を行います。

1. cmdで「sqllocaldb info」を実行しサーバー名を確認
2. SSMSの設定でサーバー名に「(localdb)\サーバー名」と入力し接続する（windows認証）

実際の運用ではWindows認証ではなくSQL Sever認証を使用することもあるかと思いますが、学習用なので(ry

![2020-04-11_14h44_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/54696434-694b-5606-61cd-a27b29226370.png)

これでSQL Serverを使用する準備ができました！

## Tips - 自動トランザクション設定
SQL Serverでトランザクションを張るには、必ず自前で張る必要があるそうです。
SSMSの初期設定には「暗黙的にトランザクションを張る」という、いわゆる自動でトランザクションを張る設定があるので、そちらも紹介しておきます。
（自動で張られているのだと思い込んで、 `COMMIT` しなくてもテーブルに反映されていて焦りました...）

SSMSのメニューから、[Tool] > [Options...] > [Query Excution] > [SQL Server] > [ANSI]の順で下り
[SET IMPLICIT_TRANSACTION]にチェックを入れます。
![2020-04-11_14h58_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/0c1d99b4-6a9a-921b-3fd0-b302efdc60bd.png)

これでクエリ実行前に自動で `BEGIN TRANSACTION` が実行されるようになり、テーブル等への反映には `COMMIT` が必要になります。
Qiskit: 人工ニューロンを量子回路で実現する（実装）

# はじめに

人工ニューロンを量子回路で実現しようという論文があったので私も実装してみました．
[An artificial neuron implemented on actual quantum processor](https://arxiv.org/abs/1811.02266)

m qubitsを用いた場合，$2^m$次元の入力を扱えるようになるらしいです．
ここでは，シグモイド関数等の活性化関数を作用させる手前までの計算を行います．

# 軽い解説

入力ベクトル$\vec{i}$と重みベクトル$\vec{w}$を以下のように定義します．

```math:
\vec{i} = (i_0, i_1, \cdots,i_{m-1}) \\ \vec{w} = (w_0, w_1, \cdots, w_{m-1})
```

ただし，$i_j , w_j \in \{-1, 1\}$とする．
ここで，二つの量子状態を考える．

```math:
|\psi_i> = \frac{1}{\sqrt{m}} \sum_{j=0}^{m-1} i_j|j> \\
|\psi_w> = \frac{1}{\sqrt{m}} \sum_{j=0}^{m-1} w_j|j> 
```

ただし，$|j> = \{|0>, |1>, \cdots, |m-1>\}$とする．
また，$U_i$と$U_w$を次のように定義する．

```math:
U_i |0>^{\otimes N} = |\psi_i> \\
U_w |\psi_i> = |1>^{\otimes N} = |m-1> \\
U_w|\psi_i> = \sum_{j=0}^{m-1} c_j |j> \equiv |\phi_{i,w} >
```

2つの量子状態の内積を求めると，

```math:
<\psi_w|\psi_i> = <\psi_w|U_w^{\dagger} U_w|\psi_i>=<m-1|\phi_{i,w}> = c_{m-1}
```

ancilla bitを追加し，それをtarget bitにしたmulti-controlled NOT gateを作用させると

```math:
|\phi_{i,w}>|0>_a = \sum_{j=0}^{m-2} c_j |j>|0>_a + c_{m-1}|m-1>|1>_a 
``` 

# code

$U_i$と$U_w$の作成には[Quantum Hypergraph state](https://qiita.com/hotaru_46/items/4a135d8b27f0340092e7)を用いています．

```python:
# coding: utf-8

from quantum_hypergraph_state import QuantumHypergraphState
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute
from qiskit import BasicAer

import numpy as np


class QuantumNeuron:

    def __init__(self, using_qubits, input, weight):
        self.num_of_input = using_qubits
        self.index = [i for i in range(self.num_of_input)]
        self.input = input
        self.weight = weight
        self.qr = QuantumRegister(self.num_of_input, name='qubits')   # input qubits and ancilla bit
        self.target = QuantumRegister(1, name='target_bit')
        self.qc = QuantumCircuit(self.qr, self.target)

    def construct_circuit(self):
        inputs = QuantumHypergraphState(self.num_of_input, self.input)
        inputs.construct_circuit(self.qc)
        weight = QuantumHypergraphState(self.num_of_input, self.weight)
        weight.construct_circuit(self.qc, inverse=True)
        ancilla_qubits = QuantumRegister(1)
        classical = ClassicalRegister(1)
        self.qc.add_register(ancilla_qubits)
        self.qc.add_register(classical)
        self.qc.mct([self.qr[i] for i in range(self.num_of_input)],
                    self.target[0],
                    q_ancilla=[ancilla_qubits[i] for i in range(1)])
        self.qc.measure(self.target[0], classical[0])

    def print_details(self, draw=False):
        print('num_of_input: {}'.format(self.num_of_input))
        print('index: {}'.format(self.index))
        if draw:
            print(self.qc.draw())


if __name__ == '__main__':
    num_qubits = 2
    sample = QuantumNeuron(num_qubits, input=[1, 1, 1, 1], weight=[1, 1, -1, -1])
    sample.construct_circuit()
    NUM_SHOTS = 10000
    seed = 1234
    backend = BasicAer.get_backend('qasm_simulator')
    results = execute(sample.qc, backend=backend, shots=NUM_SHOTS, seed_simulator=seed).result()
    sample.print_details()
    counts = results.get_counts()
    print(np.sqrt(counts['1'] / NUM_SHOTS) * 2**num_qubits)
```
9rep - Pandas MySQL 

# Pandasを使ったデータSELECT INSERT(追記)
- MySQLへPandasを経由し取得
- PandsでTSVをMySQLへInsert

``` python
import pandas as pd
from sqlalchemy import create_engine
import sqlalchemy as sa
import sys
import datetime

class MySqlPandas():

    def __init__(self):
    		self.engine = create_engine('mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DB NAME}')

    def sesStoreData(self):
        sql = '''
				SELECT
				    tb.hoge1                       
				,   tb.hoge2                     
				,   tb.hoge3               
				FROM
				    table tb
				;
				'''

        df = pd.read_sql_query(sql, self.engine)

        df.to_csv('ses_table_' + str(datetime.date.today()) + '.tsv', sep='\t')

    def insStoreData(self):
        df_ins = pd.read_csv('all_table.tsv', delimiter='\t')

        df_ins_new = df_ins.rename(columns={'hoge1': 'col1', 'hoge2': 'col2', 'hoge3': 'col3'})

        df_ins_new.to_sql('store_master', self.engine, index=False, if_exists='append')　# フルリプレイスは　if_exists='replace'


if __name__ == '__main__':
    myp = MySqlPandas()
    # myp.sesStoreData() select実行
    myp.insStoreData()   Insert実行
 
```
重みづけ抽選関数

c#で書いた重みづけ抽選関数。タプルを利用しています。
シンプルなので使いやすいかと。

```　RandomPickWithWeight.cs
    int RandomPickWithWeight(List < (int id, float weight) > lst) {
        var sum = 0f;
        foreach (var l in lst) {
            sum += l.weight;
        }
        var lot = Random.value * sum;
        sum = 0f;
        foreach (var l in lst) {
            sum += l.weight;
            if (sum >= lot) {
                return l.id;
            }
        }
        return lst[0].id;
    }
```

準備しておく重みづけ付き抽選対象の例。

```RewardData.cs

        enum REWARD_TYPE {
            Rarecoin,
            Ticket,
            XP
        }

        List < (int id, float weight) > _rewardsWeight = new List < (int id, float weight) > {
            ((int)REWARD_TYPE.Rarecoin, 30f),
            ((int)REWARD_TYPE.Ticket, 10f),
            ((int)REWARD_TYPE.XP, 5f),
        };
```

上記例に書いたListを関数に食わせるとintを返すので(REWARD_TYPE)にcastすると扱いやすい答えが得られます。
8rep - Pandas 文字列削除コード


# Pandasで不要文字削除

``` python
from sqlalchemy import create_engine
import pandas as pd

fname="{Pth}.csv"
reader = pd.read_csv(fname, chunksize=1000, sep='\t',low_memory = False)
df_all = reader.get_chunk() # chunkをdataframe

# 行単位欠損値判定
df_all.isnull().any(axis=1)

# 一部がNaNな行を削除
df_all=df_all.dropna(how="any")

# 削除文字指定
replace_str={
    '@': '',
    '\+': '',
    '\$': '',
    '\|': '',
    '\<': '',
    '\>': '',
    '\-': '',
    '\;': ''
}

# 特定の文字列削除
df_all["comment"]=df_all["comment"].replace(replace_str, regex=True, encoding='utf-8')

print(df_all)
df_all.to_csv('{Pth}/replace.csv', sep='\t', index=False)
```
7rep - Insert Dataframe To Elasitcsearch 

# TSV(CSV)をElasicsearchへ入れるコードサンプル

``` python
from elasticsearch import Elasticsearch
from elasticsearch import helpers
import pandas as pd
import datetime
import time
import json
import random
from pandas.io.json import json_normalize

# Elasticsearch
es = Elasticsearch("{ES_IP}")
INDEX = "{ES_Index_Name}"

fname="{FileName}"
reader = pd.read_csv(fname, chunksize=1000, sep='\t',low_memory = False)
df_all = reader.get_chunk() # chunkをdataframe

# json
df_lines = df_all.to_json(force_ascii=False, orient='records', lines=True)

# Bulk inser
actions = []
for i in iter(df_lines.split("\n")):
    v_json = json.loads(i)
    actions.append({
        "_index": INDEX,
        "_type": "{ES_Type}",
        "_source": v_json
    })

helpers.bulk(es, actions)
```

- ES Mapping Conf
> "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyyMMdd||epoch_millis"
パイプ二本繋げるとほか日付のフォーマットが指定でき、形が違う日付でもKibanaから拾える

``` bash
PUT hoge
{
  "mappings": {
    "books": { 
      "properties": {
        "hoge1":     { "type": "integer"  },
        "hoge2":    { "type": "text"  }, 
        "hoge3":     { "type": "text"  },
        "hoge4":     { "type": "text"  },
        "hoge5":     { "type": "integer"  },
        "hoge6":     { "type": "text"  },         
        "hoge7":     { "type": "integer"  },
        "hoge8":     { "type": "text"  },
        "hoge9":     { "type": "text"  },
        "create_date":  {
          "type":   "date", 
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyyMMdd||epoch_millis"
        }
      }
    }
  }
}
```
楽天RMSのAPIをpythonから利用する　urllib.request版

楽天RMSのAPI利用についてはPHPの記事がたくさんありますが、
pythonの記事はまだまだ少ないので投稿します。
##楽天RMSのAPIをpythonから利用する　urllib.request版

以下のAPIをpythonから利用します。
- 楽天ペイ受注API（RakutenPayOrderAPI)
- 受注検索	searchOrder
このAPIは、指定した期間中の受注番号を返してくれます。

```python:RMSapi.py
import base64
import json
import urllib.request
import datetime
from pytz import timezone

# ■■■■■■■■　認証情報　■■■■■■■■■■
serviceSecret=b"ご自身のサービスシークレット"
licenseKey=b"ご自身のライセンスキー"
headers = {
    'Authorization' : b"ESA " + base64.b64encode(serviceSecret + b':' +licenseKey),
    'Content-Type': 'application/json; charset=utf-8',
}

# ■■■■■■■■　post　■■■■■■■■■■
# 現在時から何時間前を設定（63日以内制限あり）
int_st=-24 #24H前を想定

# 開始日時:jst_st 終了日時:jst_ed を生成
# たぶんもっとスマートな生成方法があるはず
jst_st = datetime.datetime.now(timezone('Asia/Tokyo'))+ datetime.timedelta(hours=int_st)
jst_st ="{0:%Y-%m-%dT%H:%M:%S}".format(jst_st)
jst_st = str(jst_st)+"+0900"

jst_ed = datetime.datetime.now(timezone('Asia/Tokyo'))
jst_ed ="{0:%Y-%m-%dT%H:%M:%S}".format(jst_ed)
jst_ed = str(jst_ed)+"+0900"

# post文字列生成
url = 'https://api.rms.rakuten.co.jp/es/2.0/order/searchOrder/'
data = {
    "dateType":1,
    "startDatetime":jst_st,
    "endDatetime":jst_ed
}

# post
req = urllib.request.Request(url, json.dumps(data).encode(), headers)
with urllib.request.urlopen(req) as res:
    body = res.read()

# APIの戻り値を格納
json_load = json.loads(body)

```
１行追加するだけで画像がトリミング表示される方法

# 画像の比率が違くて画像が潰れてしまう
縦長や横長の画像を表示させようとして画像が潰れてしまったことはありませんか？

```css:item.css
img {
  width: 300px;
  height: 300px;
}
```

<img width="980" alt="スクリーンショット 2020-04-11 14.03.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531549/2553e66f-f037-0e1b-547b-b8a687028057.png">

一番左の画像が比率の関係で横につぶされしまっていますね。

# 1行追加するだけで中央でトリミングされた表示にできる
`object-fit: cover;`を追加するだけでいい感じに表示を変えてくれる

```css:item.css
img {
  width: 300px;
  height: 300px;
  object-fit: cover;
}
```

<img width="956" alt="スクリーンショット 2020-04-11 14.07.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531549/f9bd33e3-3407-7cf6-d64c-0179888e40ab.png">

1行追加しただけなのにちゃんと潰れないように表示してくれるようになりましたね。

# 参考
[1行追加でOK！CSSだけで画像をトリミングできる「object-fit」プロパティー](https://www.webcreatorbox.com/tech/object-fit)
保険数理用ライブラリを作りました

# はじめに 
某ウイルスやばいですね、外出自粛のせいでそろそろ体に苔生えてきそうです... 
さて、最近アクチュアリー試験の勉強をしていて、「そういえばPythonに保険数理用のライブラリとかあったりするんかな」って思ってググったらないっぽかったので作りました。　　

# 開発動機
・ 保険数理に対する理解を深めるため。
・ 保険数理を用いた数値計算を簡便にするため。
・ Pythonで自作ライブラリをPyPIにあげたことなかったからやってみよう的な。
・ ~~暇だった~~


# インストール
インストールはpipで可能です

```
pip install amaryllis
```

# 使い方
保険料の期待値を算出します。
各種類の保険のアルゴリズムを実装していますが、関数の引数はそれぞれ

```
i : 年利率, デフォルト値は0.03
x : 被保険者の、当該保険契約時年齢, デフォルト値は30
n : 当該保険契約契約期間, デフォルト値は20
f : 据え置き期間, デフォルト値は10
lifespan : 最終年齢, デフォルト値は112
population : 0歳から最終年齢までの生存人口、デフォルト値は第２０回例示生命表(男)を参考に作成したもの。
             実際のデータではないので注意
```
となっています。

## サンプル
### ①生命年金現価(amaryllis.models.pension)
```python
>>> from amaryllis.models.pension import *
>>> import numpy as np
>>> population = np.array([100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0])
>>> x = 0
>>> n = 3
>>> lifespan = 10
>>> f = 0
>>> a = life_annuity(population=population, x=x, n=n, f=f, lifespan=lifespan)
>>> print("a = {}".format(a))
a = 2.6278631350739943
```

### ②一時払い保険料現価(amaryllis.models.single)
```python
>>> from amaryllis.models.single import *
>>> import numpy as np
>>> population = np.array([100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0])
>>> i = 0.03
>>> x = 0
>>> n = 3
>>> f = 1
>>> lifespan = 10
>>> A = single_term_insurance(i=i, population=population, x=x, n=n, f=f, lifespan=lifespan)
>>> print("A = {}".format(A))
A = 0.2746224616402602
```

それぞれ保険を種別に実装しているので、詳しい関数のドキュメントはgithub( https://github.com/yk-amarly-20/Amaryllis ) を見てください。

# おわりに
生存時間解析関連の内容をあまり実装していないのでこれから随時実装していく予定です。
あと関数内ドキュメントが全て日本語のままなので英語に直さないと(~~めんどくさい~~)
【Blender2.8】Object"ObjectName" is not enable for renderingエラーでベイクできない時の対処法


![dsdd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/2dd47e07-add0-1a97-8cb2-c142c60d4e66.png)

##対処法
オブジェクトプロパティ→レンダーで表示にチェック
![scsacxzcxz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/fff68325-38de-61ed-ec40-10541cf846cb.png)

これでベイクできました。
Python＆機械学習 勉強メモ⑦：株価の予測

#はじめに
① https://qiita.com/yohiro/items/04984927d0b455700cd1
② https://qiita.com/yohiro/items/5aab5d28aef57ccbb19c
③ https://qiita.com/yohiro/items/cc9bc2631c0306f813b5
④ https://qiita.com/yohiro/items/d376f44fe66831599d0b
⑤ https://qiita.com/yohiro/items/3abaf7b610fbcaa01b9c
⑥ https://qiita.com/yohiro/items/e9e80183e635e0ac4894
の続き

- 参考教材：[Udemy みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習](https://www.udemy.com/course/learning-ai/)
- 使用ライブラリ：scikit-learn

#課題設定
過去4日間の株価上昇率を与えると、当日の株価が上昇・下降どちらになるかを推測する。

#サンプルデータ

```:stock_price.txt
10000
9993
10259
...
```

1行に1日分の株価の終値が格納されている。

#ソースコード

##インポート

```python
from sklearn import svm
```

##ファイル読み込み

サンプルデータを読み込み`stock_data`に格納する

```python
# ファイル読み込み
stock_data = []
stock_data_file = open("stock_price.txt", "r")
for line in stock_data_file:
    line = line.rstrip()
    stock_data.append(float(line))
stock_data_file.close()
```

##訓練用データの作成
###日にちごとの上昇率データの作成
上昇率は以下のように算出する

```math
i日目の上昇率=\frac{i日目の株価 - (i-1)日目の株価}{(i-1)日目の株価}
```

上記で算出したデータを`modified_data`に格納する。

```python
count_s = len(stock_data)
modified_data = []
for i in range(1, count_s):
    modified_data.append(float(stock_data[i] - stock_data[i-1]) / float(stock_data[i-1]) * 20)
count_m = len(modified_data)
```

###4日分の上昇率と当日の上昇・下降データ(=正解値)の作成
日にちごとに、過去4日分の上昇率を`successive_data`に格納する。
また、その日に上昇したか or 下降したかを`answers`に格納する。

```python
# 前日までの4日間のデータ
successive_data = []
# 正解値　価格上昇：1 価格低下:0
answers = []
for i in range(4, count_m):
    successive_data.append([modified_data[i-4], modified_data[i-3], modified_data[i-2], modified_data[i-1]])
    if modified_data[i] > 0:
        answers.append(1)
    else:
        answers.append(0)
n = len(successive_data)
m = len(answers)
```

##訓練と予測
データの75%で訓練させる。

```python
# 線形サポートベクターマシン
clf = svm.LinearSVC()
# サポートベクターマシンによる訓練（データの75%を訓練に使用）
clf.fit(successive_data[:int(n*75/100)], answers[:int(n*75/100)])
```

##訓練結果の確認
データの残りの25%で予測を行う。

```python
# テスト用データ
# 正解
expected = answers[int(-n*25/100):]
# 予測
predicted = clf.predict(successive_data[int(-n*25/100):])

# 末尾の10個を比較
print(expected[-10:])
print(list(predicted[-10:]))

# 正解率の計算
correct = 0.0
wrong = 0.0
for i in range(int(n*25/100)):
    if expected[i] == predicted[i]:
        correct += 1
    else:
        wrong += 1
print("正解率： " + str(correct/(correct+wrong) * 100) + "%")
```

#結果

教材ビデオでは正解率約61%の結果が出ているが、
実際試すとwarningが出るし、正解率も約5割（当てずっぽうとほぼ大差なし）・・・

いろいろpythonなどのバージョンが違うから結果に差がでるのだろうか？

```
C:\Anaconda3\lib\site-packages\sklearn\svm\_base.py:947: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)
[0, 0, 0, 1, 0, 0, 0, 1, 1, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 1, 1]
正解率： 55.62248995983936%
```

#おまけ
サンプルデータを見える化
![stock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571638/98b80a1b-761a-0642-0be3-4abaec7f7af5.png)
CocoaPods ライブラリ導入手順

# CocoaPodsの導入
CocoaPodsを使うための環境を作ります．

```
sudo gem install cocoapods
```

次に，以下のコマンドを打ち, ~/.cocoapods にリポジトリ情報をセットアップします．

```
pod setup
```

# 1.Podの初期化
CocoaPodsの導入が完了したら，ライブラリをインストールしたいプロジェクトのディレクトリに移動します．
プロジェクトディレクトリ内に移動したら，以下のコマンドでCocoaPodsを初期化します．

```
pod init
```
このコマンドを打つことで，Podfileがカレントディレクトリに自動で生成されます．
自動生成させることで，手打ちによって発生するミスを防ぐことができます．

以下のようなファイルができます．ここにインストールしたいライブラリを書いていきます．

```vim
target 'プロジェクト名' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

end
```

# 2.ライブラリのインストール
ここでようやく自分のプロジェクトに任意のライブラリをインストールすることができます．
先ほど生成された，Podfileを編集します．
今回は，DBのライブラリであるRealmをインストールした様子です．

```vim
target 'プロジェクト名' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  pod 'RealmSwift'

end

```
上記のようにPodfileを編集したら，以下のコマンドを打ちます．

```
pod install
```

ライブラリを追加する場合は，

```vim
target 'プロジェクト名' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for LimitList
  pod 'RealmSwift'
  pod 'Eureka'
end

```
のように，ライブラリを列挙して，以下のコマンドを打ちます．（削除時も同じ．）

```
pod update
```

# プロジェクトに反映させる

（プロジェクト名.xcodeproj）でプログラムを書いてきたと思いますが，ライブラリインストール後は，（プロジェクト名.xcworkspace）からプロジェクトを開く必要があります．

任意の場所で，

```python
import RealmSwift
```
とするとライブラリが使えるようになります．

# duplicate symbols for architecture x86_64 エラーが出た時
一度Podsの中身を削除したら解消されます

```bash

pod deintegrate
pod install
```
検索から開くのめんどくさいねん。

皆さんこんにちは。

今日は、Google検索していちいち新しいタブを使ってサイトを開くのがめんどくさいため、自動的にタブを開いてくれるソースコードを学びました。

## 使うモジュール
- requests (インターネットからファイルやWebページをダウンロードする。)
- sys (コマンドライン引数を取得するのに使う）
- webbrowser(Python付属のモジュールで、指定したページをブラウザで開く。)
- bs4 (HTMLを解析するのに使う。)

## 手順
1. コマンドラインからの検索ワードをGoogleのURLと貼り付けて、検索画面をゲット。
2. そこから検索結果のリンクを収集。
3. 最後に一つ一つのURLを開く。

## ソースコード
```python
#! python3
# lucky.py - Goole検索結果をいくつか開く

import requests
import sys
import webbrowser
import bs4

print('Googling...')
# 手順１
res = requests.get('http://www.google.com/search?q=' + ' '.join(sys.argv[1:]))
# 繋がっているか確認。（繋がっていなければ、エラーを出力.
res.raise_for_status()

# 手順２
# ゲットしたレスポンスからaタグのみを収集。
soup = bs4.BeautifulSoup(res.text, 'html.parser')
link_elems = soup.select('.kCrYT a')

# 最大を5つとしておく。
num_open = min(5, len(link_elems))

# 手順３
# 一つ一つのURLを開く。
for i in range(num_open):
    webbrowser.open('http://www.google.com/' + link_elems[i].get('href'))

```

上から読んでいくと、簡単ですね。

```
python lucky.py つよつよエンジニア 
```
とコマンドラインに打つとそれに関連するサイトが自動で開かれます。
さぁ、つよつよエンジニアになるために勉強しますか・・・。笑

## 少し分かってない部分。
最後に少し謎が残ってるところをメモ。
Chrome上の検証上では、classは"r"なので、select('.r a')をなるはずなのですが、それは変わってるんですよね😓
もしわかる方がいらっしゃれば是非ともご教授くださいませ。
QiitaでMarkdown

\```
print("444");

\```
コードを掲載する
↓

```
print("444");
```



```
# 見出し
```
(#の数を増やすと階層を一つずつ下げられる)
↓
# 見出し



```
~~打ち消し~~
```
↓
~~打ち消し~~



```
**強調**
```

↓
**強調**



```
---
```
↓
---





```
* 箇条書き１
* 箇条書き２
```
(記号と本文の間には**半角**スペース)
↓

* 箇条書き１
* 箇条書き２



```
[リンク] (https://qiita.com/kazuma_f/items/07222d72e211546648b7)
```
↓

[リンク](https://qiita.com/kazuma_f/items/07222d72e211546648b7)
　
　
　
　

画像を本文に貼り付けたいはコードを書く場所へ画像ファイルをドラッグアンドドロップ
（画像ファイルは一か月に最大100MBまでしかアップロードできません）
　






サムネイル付きのYouTube動画へのリンク（サイズ指定付き）

```
[<img src="http://img.youtube.com/vi/[YouTubeVideoID]/0.jpg" width=25%>](http://www.youtube.com/watch?v=[YouTubeVideoID])
```
↓

[<img src="http://img.youtube.com/vi/MZCZjgWvQUA/0.jpg" width=25%>](http://www.youtube.com/watch?v=MZCZjgWvQUA)
　


エスケープは「\」を頭に書く
　

コメントアウト


```
<!-- 1行コメントアウト -->
<!-- 
複数行コメントアウト
-->
```
　
　
　
![スクリーンショット (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/81edf523-2592-4b58-f4ef-75737210f9d1.png)
連続で投稿しようとすると上の画像のようなエラーが出る。そういう時は30分ほど待つと投稿できるようになる
Python3.8 「 := 」を用いた代入式

去年の10月にリリースされたPython3.8ですが、その中の機能にとても使いやすい機能がありました。
python3.8なので、まだまだ使える機会は少ないかもしれないですが、今後使いこなせるようにするためにもここにまとめておきます。
Pythonの公式では、通称「セイウチ演算子」と呼ばれているものです。
※勉強不足かもしれないですが、私はこれで初めて知りました。。。。

## 公式ドキュメントを確認
[What's New In Python 3.8](https://docs.python.org/ja/3/whatsnew/3.8.html)

まずは公式ドキュメントを確認します。
<br>
>**代入式**<br>
大きな構文の一部として、変数に値を割り当てる新しい構文 := が追加されました。

<br>

## サンプルコード
```python
first_name = ['Sato', 'Tanaka', 'Suzuki', 'Yamada']
# ５文字以上なら辞書型に追加
dict = {word:n   for word in first_name if (n:=len(word)) > 4}
dict

# return dict
# {'Tanaka':6, 'Suzuki':6, 'Yamada':6}
```

内包表記をした時などに、条件文に書いたコードをそのまま利用したい時などに有効的なようです。
所見では複雑な感じがしますが、慣れると可読性も上がっていいかもしれないです。


### 個人的に躓いた点

> dict = {word:n   for word in first_name if (n:=len(word)) > 4}

の　<code>n:=len(word)</code>
これは括弧でくくらないとSyntaxErrorがでてしまうので注意

## おわりに
どんどん便利になっていきますね。
同じことを二度書かないという英語でも二度書かないために名詞をoneやitで置き換えますが、あれと似ているなと感じました。
python3.8が使えるようになったら私もこれをどんどん使いこなしていきたいです。
「“java”コマンドラインツールを使用するには、JDKをインストールする必要があります。」というポップアップの消し方

#標題の通り、「“java”コマンドラインツールを使用するには、JDKをインストールする必要があります。」というポップアップが出て、ソフトのインストールができなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565338/4c0ab76c-8b54-37f9-6dac-464407780755.png)

##環境
Mac OS catalina 10.15.3

##取り組んだこと
・ポップアップの通り、OKを押して、リンク先に飛ぶ。
リンク先でJDKをインストール。

・再び画面に戻ると、再度「javaコマンドラインツールを使用するには、JDKをインストールする必要があります。」と
いうポップアップが表示され、ループ状態となる。

##解決策
・ポップアップ先でインストールできるのは、JDKではなくJREだそう。
・その為、ポップアップを無視して、下記URLでファイルをインストールすると
無事ポップアップが消えました。

>https://www.oracle.com/java/technologies/javase-downloads.html
6rep - Embulk to GCS 

- Postgresqlから抽出してGCS(Google Cloud Strage)へぶん投げる
- [サンプル](https://github.com/marcy-t/digdag-embulk-gcp/tree/master)

## 必要な物
- embulk plugin
  - embulk gem install embulk-output-command
  - embulk gem install embulk-output-gcs
  - embulk gem install embulk-input-postgresql
- ファイル拡張子に.liquidとつける
    - liquid〜Embulkに備わっているテンプレートエンジン
    - 同じ設定を記載し続けて肥大化を避けるため
- _env.yml.liquid
    - env設定ファイル

``` _env.yml.liquid
{% assign env_postgresql = 'postgresql' %}
{% assign env_host = '{host_name}' %}
{% assign env_user = '{user_name}' %}
{% assign env_password = '"{user_password}"' %}
{% assign env_database = '{database_name}' %}
```
> _env.yml.liquidに設定なくてもenvに設定しguess.yml.liquidのなかで{env.{変数}}で同じことはできます

- guess.yml.liquid
    - 汎用設定が書かれたテンプレートファイル

``` yaml
# guess.yml.liquid
{% include 'env' %}                          # 今回_env.yml.liquid使うため必須
exec:
  max_threads: 1                            # 最大並列数
  min_output_tasks: 1                       # OutPutタスク数制御（1にしないとOutPutファイルが複数分割される）
in:
  type: {{ env_postgresql }}
  host: {{ env_host }}
  user: {{ env_user }}
  password: {{ env_password }}
  database: {{ env_database }}
  query: |
    SELECT 
      * 
    FROM 
      {Table Name} 
    ;
out:
  type: gcs
  bucket: {{ env_gcp_bucket }}              # Bucket名
  path_prefix: logs/{{ env_path_prefix }}   # ファイル名
  file_ext: .tsv                            # ファイル名の末尾の文字列
  sequence_format: ""                       # 出力するファイル名につけるシーケンス OFF
  auth_method: json_key                     # GCSへの接続キー
  json_keyfile: {file名}.json
  formatter:
    type: csv
    delimiter: "\t"       # データ区切り文字
    charset: UTF-8        # ファイルのエンコーディング
    quote: ''             # データを囲む文字（TSVのためなし）
    quote_policy: MINIMAL # データをquoteで囲むルール MINIMAL:データに区切り文字や囲む文字や改行が含まれているとき
    escape: '\'           # quoteで囲むときに使われるエスケープ文字
    header_line	: false   # ヘッダー名を出力するかしないか
    newline: LF           # 改行コード
  
```

# 実行するときに留意点 
- json_keyfileはGCP IAMからサービスアカウントを発行
- GCSに権限設定を追加（ストレージ管理者系）
の設定を行なった後json_keyfileのキーを使い実行してください。


# 実行ファイル生成

``` shell
$ embulk guess ./postgres-guess.yml.liquid -o postgres-config.yml
```

# 実行

``` shell
# dry-run
embulk preview postgres-config.yml

# 実行
embulk run postgres-config.yml
```
Docker Desktop for WSL 2でApache Supersetを動かす:後編

#環境
**Windows 10 (build 19041.173)**
※2020/4/11時点では、Windows Insider Preview経由でのみ入手可能
入手方法については下記のリンクを参考にしてください
https://news.mynavi.jp/article/20200228-983293/
**WSL2**
下記のリンクを参考にインストールしてください
[WSL2入れてみた] https://qiita.com/TsuyoshiUshio@github/items/947301bd9317610572fc
**Python 3.6.9**
**Docker desktop 2.2.0.5**
#インストール手順
1.Docker for WindowsのSettingで"Enable the experimental WSL 2 based engine"をチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105685/af36a07e-edaa-91e6-faa8-7380c3edb539.png)

2.Apache SupersetをGit Cloneする

```
git clone https://github.com/apache/incubator-superset/
```

3.Cloneしたディレクトリに行き、docker-compose upで起動

```
cd incubator-superset
docker-compose up
```
redisなど様々なイメージが立ち上がってきます。このプロセスには数分かかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105685/0976af68-4a15-af64-03fb-405413bae9c1.png)

4.http://127.0.0.1:8088/ にブラウザからアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105685/743c1e80-3916-1025-2db7-b2312cf6d872.png)

5.画面上、Dashboardsからすでに色々なビルトインのダッシュボードが見れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105685/5ab1ba43-b415-bad4-c4e3-33d931568a7b.png)

以上、Docker Desktop for WSL2環境でApache Supersetを動かすことができました。