OmniAICreator/Qiita-1.07M huggingface dataset:
配布されているモジュールを使わずにGoogle Translation APIをPythonで叩いて英文をバリバリ読む

Google翻訳の精度がますます高くなっているそうですね。
大量の英語の文章が手元にあり、それを日本語に翻訳したい場面があるかと思います。自分はこのQiitaを書くまでtranslateの綴りをtransrateだと思ってましたが、APIを叩くことでこんな英弱人間も英文をバリバリ読めるようになります。

[Cloud Translation ドキュメント](https://cloud.google.com/translate/docs/?hl=ja)

公式に配布されているPythonの[クライアントライブラリ](https://cloud.google.com/translate/docs/quickstart-client-libraries?hl=ja) が自分の環境でうまく動かずに困ったので、このモジュールを使わずに叩くことにしました。
Google Cloudの登録やAPIキーの取得方法などは他サイトを参考にしてください。

手元の以下の２つの環境で動くことを確認しています。

Mac OS Mojave
chardet(3.0.4)
requests(2.18.4)
urllib3(1.22)

Ubuntu 18.04
chardet (3.0.4)
requests (2.22.0)
urllib3 (1.25.7)


```translate.py
import requests
import json
import time

private_key = '<ここにAPI KEYを入れてください>'

def post_text(text):
    url_items = 'https://www.googleapis.com/language/translate/v2'
    item_data = {
        'target': 'ja',
        'source': 'en',
        'q':text
    }

    response = requests.post('https://www.googleapis.com/language/translate/v2?key={}'.format(private_key), data=item_data)
    # print(response.status_code)
    #ステータスコード
    # print(response.text)
    #レスポンスを文字列で取得
    return json.loads(response.text)["data"]["translations"][0]["translatedText"]

    
def split_and_send_to_post(text):
    sen_list = text.split('.')
    
    to_google_sen = ""
    translated_text = ""
    
    for index, sen in enumerate(sen_list[:-1]):
        to_google_sen += sen + '. '
        if len(to_google_sen)>1000:
            #1000字を超えてたらgoogleに送信
            translated_text += post_text(to_google_sen)
            time.sleep(3)
            
            to_google_sen = ""

        if index == len(sen_list)-2:
            #最後の文章の翻訳
            translated_text += post_text(to_google_sen)
            time.sleep(3)

    return translated_text
        

if __name__ == '__main__':

    original_text = "I hope this sentence is transrated."
    if original_text[-1] != '.':
        original_text+='.'
        #.で終わっていない場合に分割処理に支障が出るので
    text_translated = split_and_send_to_post(original_text)
    print(text_translated)
```

あまり長い文章になるとGoogle側でエラーを起こしてしまうので、だいたい1000字で分割して送ってやります。(.を使わないむちゃくちゃ長い文章などはエラーになると思います。通常の用途を想定してます。)
またv3からはAPIキーでは叩けなくなっているようなので、v2を使っています。

実行結果

```
$ python translate.py
この文が翻訳されることを願っています。
```

参照
[Cloud Translation API](https://cloud.google.com/translate/docs/reference/rest/)
Advance Toolchain for Linux on Powerを使ってx86PCを使って、Power用のアセンブラを解析(1)

Advance Toolchain for Linux on Powerを使って、x86のPC上でPower用の実行ファイルを作成し、逆アセンブルして解析していきます。
以下のサイトを参考にしました。

https://developer.ibm.com/linuxonpower/advance-toolchain/

Ubuntu 18.04.3 LTSを使いました。
適当なフォルダに移動し、以下のコマンドを実行します。

```
wget ftp://public.dhe.ibm.com/software/server/POWER/Linux/toolchain/at/ubuntu/dists/trusty/6976a827.gpg.key
```

```
sudo apt-key add 6976a827.gpg.key
```

/etc/apt/sources.listの最後の行に以下のコメントを追加してください。

```
deb ftp://public.dhe.ibm.com/software/server/POWER/Linux/toolchain/at/ubuntu trusty atX.X
```
atX.Xは、「APT supports package upgrades for new revision releases (i.e. 7.1-0 to 7.1-1). For new major releases (i.e. 7.1-1 to 8.0-0), please proceed as in a normal installation.」と書いてあるように、at7.1などと書き換えて使ってください。つまるところ、以下のようにやります。

```
deb ftp://public.dhe.ibm.com/software/server/POWER/Linux/toolchain/at/ubuntu trusty at7.1
```

そして

```
sudo apt-get update
```
を実行。

そして、以下も実行

```
sudo apt-get install advance-toolchain-atX.X-cross-ppc64
```

atX.Xは、at7.1などと書き換えてください。つまり、

```
sudo apt-get install advance-toolchain-at7.1-cross-ppc64
```
このように書き換わります。

/opt/at7.1/bin/　　あたりに色々新しいファイルが作成されているので、それを指定して実行できます。

以下のファイルをコンパイルします。

```C
#include <stdio.h>

int main(int argc, char *args[])
{
    printf("Hello, world!\n");
    return 0;
}
```

```
$ /opt/at7.1/bin/powerpc64le-linux-gnu-gcc helloworld.c 
$ ls
6976a827.gpg.key helloworld.c 
a.out (不必要なファイルは省略)
$ /opt/at7.1/bin/powerpc64le-linux-gnu-objdump -d a.out > dump.txt
$ ls
6976a827.gpg.key  
a.out             helloworld.c  
dump.txt 
```

これでPowerアーキテクチャの逆アセンブルがx86上で完了しました。

逆アセンブル結果

```
a.out:     file format elf64-powerpcle


Disassembly of section .init:

0000000010000370 <_init>:
    10000370:	02 10 40 3c 	lis     r2,4098
    10000374:	08 8b 42 38 	addi    r2,r2,-29944
    10000378:	a6 02 08 7c 	mflr    r0
    1000037c:	10 00 01 f8 	std     r0,16(r1)
    10000380:	a1 ff 21 f8 	stdu    r1,-96(r1)
    10000384:	00 00 00 60 	nop
    10000388:	08 80 02 e8 	ld      r0,-32760(r2)
    1000038c:	00 00 a0 2f 	cmpdi   cr7,r0,0
    10000390:	0c 00 fe 41 	beq+    cr7,1000039c <_init+0x2c>
    10000394:	6d fc ff 4b 	bl      10000000 <_init-0x370>
    10000398:	00 00 00 60 	nop
    1000039c:	4d 02 00 48 	bl      100005e8 <frame_dummy+0x8>
    100003a0:	00 00 00 60 	nop
    100003a4:	05 04 00 48 	bl      100007a8 <__do_global_ctors_aux+0x8>
    100003a8:	00 00 00 60 	nop
    100003ac:	60 00 21 38 	addi    r1,r1,96
    100003b0:	10 00 01 e8 	ld      r0,16(r1)
    100003b4:	a6 03 08 7c 	mtlr    r0
    100003b8:	20 00 80 4e 	blr

Disassembly of section .text:

00000000100003c0 <00000017.plt_call.puts@@GLIBC_2.17>:
    100003c0:	18 00 41 f8 	std     r2,24(r1)
    100003c4:	48 80 82 e9 	ld      r12,-32696(r2)
    100003c8:	a6 03 89 7d 	mtctr   r12
    100003cc:	20 04 80 4e 	bctr
(以下略)
```
raspberry piでダウンロードFontインストール

###備忘録
raspberrypi(raspbian)でダウンロードしたフォントをインストールする手順。
派手さもクリエイティビティもありません。
単に複数のサイトを参考に行ったまとめです。

参考URL：[ゴシックも明朝もラズパイのフォントはNoto CJK jpでスッキリ統一！](https://www.fabshop.jp/%E3%82%B4%E3%82%B7%E3%83%83%E3%82%AF%E3%82%82%E6%98%8E%E6%9C%9D%E3%82%82%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%AE%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AFnoto-cjk-jp%E3%81%A7%E3%82%B9%E3%83%83/)

#さてみなさん
今回フォントインストールの目的は、**Arduino IDEのフォント**をプログラミングの可視化向上なので、今回はMyricaを入れます。

[プログラミングフォント Myrica / Estable](https://myrica.estable.jp/)

ダウンロードしたファイルを適当に解凍します。
コンソールベースでやると（面倒なのでファイルマネージャーでも良い気がしますが・・・）

```
cd ./Downloads
unzip -d Myrica Myrica.zip
```
次にシステムフォントのFontディレクトリに判りよいようにフォルダー作ります

```
sudo mkdir -p /usr/share/fonts/downloadfont
```
そして解凍したFontファイルを移動させます。

```
sudo mv -fv ./Myrica /usr/share/fonts/downloadfont
```
不要ファイルは削除

```
rm -rfv Myrica.zip
```
そしてフォントキャッシュを更新。（ちょっと時間かかるのと、コンソール内にちゃんとインストールされたか確認できる）

```
sudo fc-cache -fv
```

##おまけ
Arduino IDEのフォントを更新します。

Arduino IDEを起動して、ファイル＞環境設定
を開きます。
すると環境設定ファイルのpreferences.txtの保存箇所のリンクが下の方にあるので、それをクリックしてファイルマネージャーが開いたら、一旦IDEを終了させておきます。
**終了させておかないと編集できない君です。**

ここでバックアップフォルダを作って、preferences.txtのコピーを取って置くと無難です。

さて、そうしたらpreferences.txtを開いて以下の項目を編集します。
*以下のファイルを直接編集すれば、より多くの設定を行うことができます*
と書かれた下のpreferences.txtをクリック

###それではpreferenceを編集します
全部書くと大変なので、必要な項目だけ抜粋します。

```
editor.font=MyricaM M,Book,12
```
これだけ。
Font名とかタイプは、システムフォント（デスクトップの右クリックで変更できるやつ）で確認できます。
数字はサイズ

###更に余談
以下のような項目もせっかくなので有効にしておくとArduino IDEがすこぶる使いやすくなる。
そもそもなんでデフォルトで有効でないのか不可思議。

```
editor.linenumbers=true　//行番号有効
editor.tabs.expand=true　//カッコ内をおまとめ可能
editor.advanced=true　//同一名の変数などをマーキングしてくれる
```
無い項目は追加すればOK

最後に独り言
見やすいだろうといれたMyricaですが、ちょっと字体が細くて微妙かなぁ・・・

以上
競技プログラミング is 何（おまけ）

本記事は、[競技プログラミング is 何](https://qiita.com/koan_u/items/427437f8c69c7fed1ae0)のおまけ記事です。

実装するとしたら、のソースコードをのせた記事になります。

pythonをやってない人にもある程度わかりやすいように、
（競プロ的には）冗長なコードになっている箇所もありますが、ご容赦を。


# 単純な解法

```python
# coding: utf-8
# 標準入力取得の高速化のpython用おまじない
import sys
input = sys.stdin.readline

# 標準入力を数値変換しながら取得
N = int(input())
# 標準入力を配列＆数値変換しながら取得
H = [int(x) for x in input().split()]

# 各マスに降り立った時の最大移動可能距離を計算していく
# 移動可能距離の格納用変数の定義
ans = []

# 開始位置を先頭からずらしていく
for i in range(N):
    count = 0
    # 開始位置からどの程度移動可能か確認していく
    for j in range(i,N-1):
        if H[j] >= H[j+1]:
            # 移動可能なら移動可能距離を増やす
            count += 1
        else:
            #移動不可なら終了
            break
    # 移動可能距離一覧へ追加する
    ans.append(count)

# 回答の表示
print(max(ans))
```

### 最適な解法

```python
# coding: utf-8
# 標準入力取得の高速化のpython用おまじない
import sys
input = sys.stdin.readline

# 標準入力を数値変換しながら取得
N = int(input())
# 標準入力を配列＆数値変換しながら取得
H = [int(x) for x in input().split()]
# ここまでは一緒

# 処理様の変数定義
max_count = 0
tmp_count = 0

# 先頭から見ていく
for i in range(N-1):
    if H[i] >= H[i+1]:
        # 移動可能なら距離カウントをふやす
        tmp_count += 1
    else:
        # 移動不可時はその時点までの移動可能距離と
        # 現在の最大移動可能距離を比較
        if tmp_count > max_count:
            # 今回の移動可能距離の方が大きいので更新する
            max_count = tmp_count
        # 現時点の移動可能距離をリセットする
        tmp_count = 0

# ループ終端が、N-1なので、とある地点から右端まで移動可能な場合は、
# その移動距離と最大移動可能距離との比較が行われていないため、
# maxを使用してより大きい方の値を回答として使用する
print(max(max_count,tmp_count))
```
画像をドラッグ＆ドロップで登録してプレビュー表示

# 備忘録
input:fileの画像登録時にドラッグ＆ドッロップでinputに値を渡し、プレビューを出す記述。
（通常登録も対応）

JSライブラリ依存せずに使用（してるはず）。


## CODEPEN

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="js,result" data-user="tonkatsu" data-slug-hash="jOEqYqd" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="画像をドラッグ＆ドロップで登録してプレビュー表示">
  <span>See the Pen <a href="https://codepen.io/tonkatsu/pen/jOEqYqd">
  画像をドラッグ＆ドロップで登録してプレビュー表示</a> by manabu tanaka (<a href="https://codepen.io/tonkatsu">@tonkatsu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## 記述
```html:html　ドラッグ＆ドロップするエリア
<form method="post" enctype="multipart/form-data">
    <div id="dragDropArea">
        <div class="drag-drop-inside">
            <p class="drag-drop-info">ここにファイルをドロップ</p>
            <p>または</p>
            <p class="drag-drop-buttons">
                <input id="fileInput" type="file" accept="image/*" value="ファイルを選択" name="photo" onChange="photoPreview(event)">
            </p>
            <div id="previewArea"></div>
        </div>
    </div>
    <button type="submit" name="submit" value="登録">登録<button>
</form>
```

```css:css　簡単に整形
#dragDropArea{
  background-color: #f4f4f4;
  margin: 10px;
  padding: 10px;
  border: #ddd dashed 5px;
  min-height: 200px;
  text-align: center;
}
#dragDropArea p{
    color: #999;
    font-weight: bold;
    font-size: 14px;
    font-size: 1.4em;
}
#dragDropArea .drag-drop-buttons{
    margin-top: 20px;
    font-size: 12px;
    font-size: 1.2em;
}
.drag-drop-buttons input{
    margin: auto;
}

```

```js:JS　ドラドロイベントでごにょごにょ＆選択時にごにょごにょ
var fileArea = document.getElementById('dragDropArea');
var fileInput = document.getElementById('fileInput');
fileArea.addEventListener('dragover', function(evt){
  evt.preventDefault();
  fileArea.classList.add('dragover');
});
fileArea.addEventListener('dragleave', function(evt){
    evt.preventDefault();
    fileArea.classList.remove('dragover');
});
fileArea.addEventListener('drop', function(evt){
    evt.preventDefault();
    fileArea.classList.remove('dragenter');
    var files = evt.dataTransfer.files;
    console.log("DRAG & DROP");
    console.table(files);
    fileInput.files = files;
    photoPreview('onChenge',files[0]);
});
function photoPreview(event, f = null) {
  var file = f;
  if(file === null){
      file = event.target.files[0];
  }
  var reader = new FileReader();
  var preview = document.getElementById("previewArea");
  var previewImage = document.getElementById("previewImage");

  if(previewImage != null) {
    preview.removeChild(previewImage);
  }
  reader.onload = function(event) {
    var img = document.createElement("img");
    img.setAttribute("src", reader.result);
    img.setAttribute("id", "previewImage");
    preview.appendChild(img);
  };

  reader.readAsDataURL(file);
}

```


## 参考サイト

https://www.kabanoki.net/1552/
http://koheik.hatenablog.com/entry/2016/07/08/152936
https://qiita.com/sanapon1020/items/77d37fe1fd6f87740e1b
JavaScript ES6

##JavaScriptで何ができる？
javascriptを使えば、
ウェブコンテンツに動きを入れることができます。（写真の自動切り替えなど）



##コードを書くときに気をつけること
####・変数
`let 変数名;`
変数名は、基本的に自由に決められますが、
数字始まりやローマ字、日本語にするのはやめましょう。

####・変数の更新
変数は更新することができますが、
その際は頭に`let`は不要です。

####・定数
`const 変数名`
定数は変数のようなものですが、
更新することができません。

####・テンプレートリテラル
文字列や定数の連結は`+`を用いることでも可能ですが、
それ以外にも方法があります。

文字列の中に`${定数}`を埋め込めば良いだけですが、
その際、文字列をバッククォーテーションで囲む必要があります。


####・コンストラクタ
コンストラクタとは、
new演算子を使って、インスタンスを実装する関数のことです。

######インスタンスとは?
そもそもオブジェクト指向のプログラムは、
用意されたオブジェクトをそのまま使うのではなく、
オブジェクト本体からコピーして（インスタンス化して）使っています。
*このインスタンス化の役割を担っているのがnew演算子です。

####・this
thisとは、
JavaScriptに元から用意されている
変数のことです。

呼び出した場所や方法によって、
中身が変化する特殊な変数です。

例）
コンストラクタでインスタンスを生成する際、
インスタンスのプロパティをthisで作成する。

```
function Human(name, age){
  this.name= name;
  this.age=  age;
}

var taro =new Human('太郎', 30);
console.log( taro );
```

実行結果

```
Human{name;"太郎", age: 30}
```


#参考
・new演算子
https://www.sejuku.net/blog/24383
https://qiita.com/rindarinda5/items/5501a01bd6001fafcbf7

・this
https://qiita.com/takeharu/items/9935ce476a17d6258e27
Ubuntu 18.04にclamavをインストールして定期的にシステム全体のスキャンをclamdscanで行う方法

# 概要

Ubuntu 18.04にclamavをインストールして定期的にシステム全体のウイルススキャンをclamdscanで実行したい人のためのセットアップ手順を紹介する。

# 背景

Ubuntu 18.04にclamavをインストールして`$HOME`をclamscanするまでは素直に利用できたが、より高速なclamdscanを用いてシステム全体をスキャンしようとすると以下に示す2つのエラーによりスキャンができなかった。

1. `Can't connect to clamd through /var/run/clamav/clamd.ctl: No such file or directory`
2. `lstat() failed: Permission denied. ERROR`

```
[   50.631849] audit: type=1400 audit(1576039159.748:43): apparmor="DENIED" operation="open" profile="/usr/sbin/clamd" name="/" pid=849 comm="clamd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
```

# 成功したセットアップ手順

まずは成功したセットアップを掲載。問題とそれらへの対応は後述（後日）。

``` bash
sudo su

apt update
apt install -y clamav clamav-daemon
systemctl stop clamav-freshclam
freshclam
systemctl start clamav-freshclam
systemctl enable clamav-freshclam

systemctl stop clamav-daemon
rm -rf /run/clamav

sed 's@ExecStartPre=/bin/chown@#ExecStartPre=/bin/chown@' /etc/systemd/system/clamav-daemon.service.d/extend.conf

switches=(
LocalSocket
FixStaleSocket
LocalSocketGroup
LocalSocketMode
User
ScanOnAccess
)

for switch in  ${switches[@]}
do
    sed -i "s/$switch/#$switch/" /etc/clamav/clamd.conf
done

cat << 'EOS' >> /etc/clamav/clamd.conf
User root
ScanOnAccess true
OnAccessMountPath /home
VirusEvent /usr/local/bin/clamd-response
TCPSocket 3310
TCPAddr 127.0.0.1
EOS

cat << 'EOS' > /usr/local/bin/clamd-response
#!/bin/sh
echo "$(date) - $CLAM_VIRUSEVENT_VIRUSNAME > $CLAM_VIRUSEVENT_FILENAME" >> /var/log/clamav/infected.log
mv $CLAM_VIRUSEVENT_FILENAME $CLAM_VIRUSEVENT_FILENAME.virus
EOS
chmod +x /usr/local/bin/clamd-response

cat << 'EOS' >> /etc/apparmor.d/local/usr.sbin.clamd
/ r,
/** r,
EOS
apparmor_parser -R /etc/apparmor.d/usr.sbin.clamd

systemctl daemon-reload
systemctl enable clamav-daemon

apt install -y clamtk
sed -i 's/Exec=clamtk %F/Exec=env LC_TIME=C clamtk %F/g' /usr/share/applications/clamtk.desktop

reboot # 途中再起動せずに色々触ってハマったのでオマジナイ。もしかしたら不要かも
```
🆚【VScode】設定と拡張機能でPHP開発用に便利なやつ

## 環境

windows 10
Visual Stadio Code 1.40.2

## 内容

社内開発用と自宅開発用のVScodeを同期する方法とかあるのかな？
とりあえず方法を知らないので自分の環境を晒して自力で同じ状態にする

## Settings

File→Preferences→Settings→右上のOpen Settings(JSON)をクリック

```settings.json
{
    "editor.fontSize": 11,
    "editor.renderWhitespace": "boundary",
    "php.validate.executablePath": "C:\\php-7.3.11\\php.exe",
    "php.validate.run": "onType",
    "workbench.iconTheme": "material-icon-theme",
    "window.zoomLevel": 0,
    "diffEditor.ignoreTrimWhitespace": false,
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "workbench.startupEditor": "newUntitledFile",
    "terminal.integrated.fontFamily": "monospace",
    "editor.cursorBlinking": "smooth",
    "editor.fontFamily": "'Fira Code','Meiryo UI'",
    "editor.fontLigatures": true,
    "terminal.integrated.rendererType": "dom",
    "files.eol": "\n",
    "files.trimTrailingWhitespace": true,
    "files.insertFinalNewline": true,
    "php.suggest.basic": false

}

```

```↑の説明.json
    "editor.fontSize": 11,
    "editor.renderWhitespace": "boundary",
    "php.validate.executablePath": "C:\\php-7.3.11\\php.exe",
    "php.validate.run": "onType",
    "workbench.iconTheme": "material-icon-theme",
    "window.zoomLevel": 0,
    "diffEditor.ignoreTrimWhitespace": false,
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "workbench.startupEditor": "newUntitledFile",
    "terminal.integrated.fontFamily": "monospace",
    "editor.cursorBlinking": "smooth",
    // プログラミング用フォント「Fira Code」を設定
    "editor.fontFamily": "'Fira Code','Meiryo UI'",
    // 合字（リガチャ）を有効化
    "editor.fontLigatures": true,
    // レンダタイプをDOMに変更（環境によっては早くなる）
    "terminal.integrated.rendererType": "dom",
    // ファイルのデフォルト改行コードをlfに指定
    "files.eol": "\n",
    // 不要スペースの削除
    "files.trimTrailingWhitespace": true,
    // 保存時にファイル最終行に空白行を付加
    "files.insertFinalNewline": true,
    // VSCodeデフォルトのサジェストを無効化（説明が衝突するため）
    "php.suggest.basic": false
```

## Extensions

### Bracket Pair Colorizer 2
https://github.com/CoenraadS/Bracket-Pair-Colorizer-2
()や[]や{}を色分けして直感的にわかりやすくしてくれる
これが入っているとかっこ関連のsyntax errorが視認できる
Bracket Pair Colorizerの動作改良版

### code-eol
https://github.com/sohamkamani/code-eol
改行コードがlfなら「↓」、crlfなら「↲」で表示されるようになる
ソースの改行コード統一はマナー

### HTMLHint
https://github.com/Microsoft/vscode-htmlhint
HTMLを静的解析し要修正箇所を指示してくれます

### indent-rainbow
https://github.com/oderwat/vscode-indent-rainbow
テンプレートなどはネストが深くなるので色ついていないとわかりづらいが
これでインデントが薄い虹色に色付けされて視認可能になります

### Material Icon Theme
https://github.com/PKief/vscode-material-icon-theme
デフォルトのアイコンよりも特徴的なテーマ
ディレクトリも名称でアイコンが付くのでフォルダだらけの環境でも区別しやすい

### PHP DocBlocker
https://github.com/neild3r/vscode-php-docblocker
「/**」入力で追記されるアノテーションの記述を補助してくれる
タイプヒンティングや返り値指定も自動で書いてくれる

### PHP Intelephense
https://github.com/bmewburn/vscode-intelephense

### Trailing Spaces
行末やスペースのみやインデントの違うスペースが赤く表示されて目立つようになります
Perlの括弧による振る舞いの違いとリファレンス・デリファレンス

個人メモも兼ねる。

perl 難しくないですか？難しいですよね。

### この記事のターゲットユーザー

**Perlよく分からんけど納期の都合上手っ取り早く文法を覚えたい**

- perl がよく分からないけど案件の中で利用されているためコードを読み解く必要がある
- 変数名三つもあるじゃん。`$`, `%`, `@` ってなんぞ？
- リファレンス？デリファレンス？
- `[]`, `{}`, `()` で振る舞いが違う？なんで？

### 解説

※独自解釈しているところとか、口語的に説明するためかみ砕いた文章となるので間違ってたらご指摘ください。

#### 変数

|変数宣言|説明|
|:--|:--|
|$***|別名スカラー変数、なんでも入れられる。アドレスを参照しているだけで実体は持っていない|
|%***|ハッシュ変数。実体を持つ|
|@***|配列変数。実体を持つ|

基本的に`$`使っておけばいいんじゃないですかね。明確に配列が入るとかハッシュが入るとか決まっていたら`%`とか`@`とか使う、みたいな。

#### リファレンス・デリファレンス

- リファレンス => アドレスを参照した変数を宣言すること
- デリファレンス => アドレスの中身を見よう

#### 括弧・ふるまい

まず名前がそれぞれにあります。

- `[](記号の名前はブラケット) => 無名配列生成子`
- `{}(記号の名前はブレース) => 無名ハッシュ生成子`
- `()(記号の名前は丸括弧) => リスト`

です。へー

無名生成子を利用すると変数にはリファレンスが代入されます。

```perl
my @array1 = ('A', 'B', 'C');
my $array2 = [ 'A', 'B', 'C' ];

print @array1, "\n";
# => ABC
print $array2, "\n";
# => ARRAY(0x557f87a3b650)

# ちなみに、以下もリファレンス参照となります。
my $_array = ('A', 'B', 'C');
print $_array, "\n";
# => ARRAY(0x55da203f2650)
```

無名生成子を利用した際に実態が欲しい場合はデリファレンスを利用しなければなりません。たぶんここがperlの最初の壁でしょう。

```perl
my $array2 = [ 'A', 'B', 'C' ];
print @$array2, "n"; # または @{ $array2 }
# => ABC
print $$array2[0], "n"; # 要素は文字列なので参照するときは $演算子を利用する。
# => A

my $hash1 = { hoge => 'hoge1', fuga => 'fuga1' };
print %$hash1; # または %{ $hash1 }
# => hogehoge1fugafuga1

print $$hash1{hoge}; # 要素は文字列なので参照するときは $演算子を利用する。
# => hoge1
```

ここで、値を取り出すときにデリファレンスをいちいち書いているとネストした値を取り出すときに非常に不便です。

そのため、perlにはアロー演算子によるアドレス参照機能が提供されています。

```perl
my $nest1 = {
  hash => {
    'test1' => 'test1 dayo',
    'test2' => 'test2 dayo',
  },
  array => [ 'hoge', 'fuga' ]
};

# test1 dayo を取り出したい
# デリファレンスさせた書き方
print ${ %{ $nest1 }{hash} }{test1}, "\n";
# => test1 dayo

# アロー演算子
print $nest1->{'hash'}->{'test1'}, "\n";
# => test1 dayo

# hoge を取り出したい
# デリファレンスさせた書き方
print ${ @{ $nest1 }{array} }[0], "\n";
# => hoge

# アロー演算子
print $nest1->{'array'}->[0], "\n"; # $nest1->{'array'}[0] でもよい
# => hoge
```

### 最後に

アドレスの参照について分かっていれば、リファレンス周りもそこまで苦労せず理解できるかと思いますが、perl独自の挙動で詰まる人も中にはいるんじゃないかと思います。

hashの要素をデリファレンスして取得したいときに `%{***}{要素名}`と書くとkey, valueの両方が取得されてしまうのは、内部的にはリストで構造を持っているからとかなのでしょうか？よくわかりません。

### 参考

[Perl - リファレンスの説明（１）: かなり分かりやすい](http://ks0608.hatenablog.com/entry/2012/01/28/073032)
DB操作　

メモなので過度な期待はよしてください。
少しでも役に立てれば嬉しいです。

##DB作成・取り出し
SQLiteを使わない方式で。

```python:mkdb.py
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///test.db')
Base = declarative_base()

#多分ここはほとんどテンプレ
class User(Base):
    __tablename__ = 'test'

    id = Column(Integer, primary_key=True)
    hello = Column(String)
    good = Column(String)

    def __repr__(self):
        return "User<{}, {}, {}>".format(self.id, self.hello, self.good)


Base.metadata.create_all(engine)
SessionMaker = sessionmaker(bind=engine)
session = SessionMaker()

def add(hello,good):#この関数でDBにデータを追加する
    session.add(User(hello = hello, good = good))
    session.commit()

def get():#ここでDBのデータを取り出す
    test = session.query(User)
    print(type(test))
    for row in test:
        print("%s,%s"%(row.plan,row.date))

```

こんな感じです。テーブル作成とかはほとんどテンプレだと思うので、使うだけであれば深く考える必要はないと思います。

ちなみにこのプログラムは他のプログラムにimportして使うことを想定しているのでこのプログラム単体で動作することは確認していません。
[iOS]アクションシートの選択肢の上の枠を消す方法

UIAlertControllerのtitleとmessageにnilを指定することでアクションシートの選択肢の上の枠を消せる。

```Swift
UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
```

また、片方にnilを設定することで文字を中央に配置できる。
nilではなく空文字だと枠も消えないし位置もずれるので注意。
新しく貸与されたPCにWSLを導入したお話

## はじめに
先日使用していたPCがリース切れとなり、Windows10マシンへと入れ替えることになりました。
入社して4年が過ぎたんだなと感慨深い気持ちになりながら新しいPCの設定が完了した時、
ふとWindows10だとWSL(Windows Subsystem for Linux)が使えるなと思い導入を決意しました。

## なぜWSLか
通常の業務ではオンプレかAWS上のLinuxマシンを使用していますが、たまに検証等でローカルマシンからコマンドたたいたりしたいことがあります。
コマンドプロンプトやPowerShellもありますが、Windowsは難しすぎてわからないため慣れ親しんだLinuxコマンドを使用したい気持ちになります。
旧マシンにはCygwinを入れてましたがびみょー。

## 準備
そもそもWSLをあまり理解していなかったんですが、Windowsの機能としてWSLを有効化してディストリビューションをインストールすると使えるようになるみたいです。
Microsoft Storeを見るとUbuntuがあったのでこれを使うこととします。
CentOSがよかったけどまあいいか。

## 初期設定
ネットに情報がたくさんあるのでここでは割愛。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529205/15c6a6f7-c5fb-685f-cea8-cda597564028.png)
フツーに使えます。

## プロキシの設定
社内からはプロキシを通さないと外部にアクセスできません。
パッケージインストールに必要なので設定します。

`/etc/apt/apt.conf`

~~~
Acquire::ftp::proxy "http://プロキシユーザ:プロキシパスワード@プロキシサーバ:ポート番号";
Acquire::http::proxy "http://プロキシユーザ:プロキシパスワード@プロキシサーバ:ポート番号";
Acquire::https::proxy "http://プロキシユーザ:プロキシパスワード@プロキシサーバ:ポート番号";
~~~

パッケージインデックスの更新をインストール前に実施する必要あり。
実施しないと`404  Not Found [IP: *** ***]`というエラーが出ました。

~~~
$ sudo apt-get update
~~~


## 鍵の設定
外部サーバへアクセスするための鍵を設定します。
パスワード認証してる人はいないですよね...？

SSHクライアントインストール

~~~
$ sudo apt-get install openssh-client
~~~

公開鍵と秘密鍵の生成

~~~
$ ssh-keygen -t rsa
~~~

アクセスしたいサーバに公開鍵を配置

~~~
$ scp -P 22 ~/.ssh/id_rsa.pub <ユーザ名>@<IPアドレス>:~/.ssh/authorized_keys
~~~

これで次回アクセス時にはパスワードなしで入れるはずです。
失敗する場合は秘密鍵のパーミッションに問題があるかもしれません。

## ssh-agentの転送機能
ここまでくるとssh-agentを使いたくなります。
そうすることでリモート先でも鍵認証が使えます。

ssh-agentの起動

~~~
$ eval `ssh-agent`
~~~

秘密鍵をssh-agentに追加

~~~
$ ssh-add
~~~

これだとログアウトしたら無効になってしまうため、ログイン時に実行されるようにします。

`~/.bashrc`

~~~
~追加~
eval `ssh-agent`
ssh-add
~~~

## 所感
普段使っているターミナルに比べると少々頼りなさがありますが、思ったより使える印象です。
ほぼ鍵の話になってしまいました。
Jupyter notebookにHTMLを表示させる

Jupyter notebook内の出力にHTMLを表示させたいとき、いろいろググって、

```py

from IPython.display import HTML
HTML("<h1>Test</h1>")
HTML("<h2>test<h2>")
```
ってやればOKっていうのを見つけたのに、うまくいかない人は以下のように`display`で`HTML`を囲んでやるとうまくいくかもしれません。

```py
from IPython.display import display, HTML
display(HTML("<h1>Test</h1>"))
display(HTML("<h2>test<h2>"))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240999/b3230c78-622b-a272-8561-851509f9e18d.png)

おわり
PSoCでパルスジェネレータ (Divider)を作る。

こんにちは

PSoC初心者のやましょうです。

#基板
PSoC 5LP Prototypeing Kitを
http://akizukidenshi.com/catalog/g/gM-09432/
使いました。テスト４出力
選択後の最終出力としては、ポートは１本しか使っていません。

#スケッチ
![SnapCrab_NoName_2019-12-11_12-44-50_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/7555839a-003e-280b-0c83-7a60d7b9e90c.png)

#ポート配置
![SnapCrab_NoName_2019-12-11_12-46-43_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/dbfb5d29-7324-99f1-ffea-971723a16956.png)

#コード

```cpp
#include "project.h"
int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    for(;;)
    {
        Control_Reg_1_Write(0X00);
        CyDelay(1000);
        Control_Reg_1_Write(0X01);
        CyDelay(1000);
        Control_Reg_1_Write(0X02);
        CyDelay(1000);
        Control_Reg_1_Write(0X03);
        CyDelay(1000);
    }
}
```

超絶手抜きなので1秒毎に出力のパルス変更していますが、
ボタン等で選択する様にした方が良いと思います。

#感想
ソフトが介在すると、パルスにジッタが出るので、PSOCでやればハードがやってくれるので
ジッタもなくなるのでとてもPSoC便利ですね。


以上
PSoC アドベントカレンダー2019 11日目
やましょうでした。
Azureの基本内容について

#Azureの基本的な内容理解に使用した資料#
**メモ**
[参考にさせていただいた記事は以下の記事です。
(https://qiita.com/chomado/items/032454af29e3eb6a2c57)
(https://qiita.com/chomado/items/439eeea4b3ce318fb5a8)

Microsoft の公式大型技術カンファレンス『Microsoft Ignite 2019』が、アメリカで開催されました。
そこで実際にデリバーされた Azure 入門編セッション (英語) を、和訳した内容が記載されていて、とても分かりやすかったです。

もちろん記事では入門編ということもありましたので、
実際にハンズオンを行いながら知識と操作内容など身に着けていこうと思う。

ただ、全くAzureの知識がない自分でもどのようなサービスなのかということが理解できましたので、
初めてAzureに着手する方には良記事だと思います。
vagrant ssh後lsコマンドしても、すでに作成済みのファイルが見当たらない場合

lsしても作成済みのファイルが見当たりません...

```
$ vagrant ssh
[vagrant@localhost ~]$ ls
[vagrant@localhost ~]$ pwd
/home/vagrant
```



vmのマシンの名前を見て気づきました。


vagrant upの段階で作成したファイルのディレクトリに移動して実行すればOK

```
rooter:myvagrant neko$ cd mycentos

rooter:mycentos neko$ ls
Vagrantfile
rooter:mycentos neko$ vagrant up 
```

※mycentosでvagrant upしたらVMマシンの名前は「mycentos_default..なはず」
他ディレクトリでvagrant upすればそのディレクトリ名_default..なはず
![スクリーンショット 2019-12-11 12.48.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/45224c0f-8c9e-c8c6-489c-7a71f1f10fbc.png)


```
〜〜（省略）〜〜
rooter:mycentos neko$ vagrant ssh

Last login: Thu Dec  5 10:51:25 2019 from 10.0.2.2

[vagrant@localhost ~]$ ls
centos6 　 php_lessons  　todo_app_php

[vagrant@localhost ~]$ 
```
できた！
YugaByteDB(2) Rookを使ったインストール

この記事は「[RookだらけのAdvent Calender](https://qiita.com/advent-calendar/2019/rook)」11日目の記事です。

[昨日分](https://qiita.com/tzkoba/items/593d0d3dbfa932da6dd0)は概要ということで、Rookのストレージ・プロバイダーとしてYugaByteDBが入っている意味や、データベースとしてのアーキテクチャなどを簡単に解説しました。

本日からは実際にYugaByteDBをさわっていきますが、まずはRookを使ってインストールしていきます。

# Rook quick start -YugaByteDB-
インストールの前提条件として、以下が必要になります。

- Kubernetesクラスタ
- 3台以上のWorker Node
- standardの名前で利用可能なStorageClass ※クラウドストレージが使いやすいはず。

上記はcluster.yamlを修正する場合には必須ではありませんが、デフォルトのyamlをapplyする際には確認しておきましょう。

準備が出来ていれば、[quick start](https://rook.io/docs/rook/v1.1/yugabytedb.html)に書いてある通りにインストールを進めます。

## インストールは簡単
YugaByteDBのRook対応は現時点でシンプルなので、インストール自体も簡単、2つのYAMLをapplyするだけです。

```terminal
$ kubectl apply -f cluster/examples/kubernetes/yugabytedb/operator.yaml
$ kubectl apply -f cluster/examples/kubernetes/yugabytedb/cluster.yaml
```

これにより、rook-yugabytedb-systemとrook-yugabytedbの2つのNamespaceが切られ、OperatorおよびYugaByteDBのコンポーネントが配置されます。

KubernetesレベルでどんなPodが配置されたかを確認すると以下のようになっています。

```terminal
$ kubectl get pod -n rook-yugabytedb-system
NAME                                        READY   STATUS    RESTARTS   AGE
rook-yugabytedb-operator-7f4b8c7dc5-prpk4   1/1     Running   0          1d

$ kubectl get pod -n rook-yugabytedb       
NAME                              READY   STATUS    RESTARTS   AGE
yb-master-hello-ybdb-cluster-0    1/1     Running   0          1d
yb-master-hello-ybdb-cluster-1    1/1     Running   0          1d
yb-master-hello-ybdb-cluster-2    1/1     Running   0          1d
yb-tserver-hello-ybdb-cluster-0   1/1     Running   0          1d
yb-tserver-hello-ybdb-cluster-1   1/1     Running   0          1d
yb-tserver-hello-ybdb-cluster-2   1/1     Running   0          1d
```

## 何が出来たか
先ほどのPodを確認すると、YugaByteDBの2種類のプロセスが確認できます。

- YB-Master process ・・・メタデータの管理や操作の振分けを担当
- YB-TServer process ・・・テーブルデータの保持/提供を担当

詳しい用語の解説は[こちらの公式ドキュメント](https://docs.yugabyte.com/latest/architecture/concepts/universe/)に記載があります。

MasterおよびTServerではメタデータ/ユーザデータを3重に分散して持ち、RaftによりLeader-Followerを決定しています。

上記の用語を抑え、Kubernetes上のNodeに分散配置されたYugaByteDBのプロセスを図示すると下図のようになります。それぞれのPodにはPersistentVolumeが接続されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54853/25e577fc-28c2-1234-fe27-81b542046b27.png)

## YugaByteDBへの接続
構築が完了したYugaByteDBには、YB-TServerのPodにkubectl execで接続し、そこからysqlshというクライアントツールでログインします。
※ysqlshはPostgreSQLのpsqlに相当するものと考えて下さい。

（kubectlとysqlshを使った接続の例）

```console
$ kubectl -n rook-yugabytedb exec -it yb-tserver-hello-ybdb-cluster-0 /home/yugabyte/bin/ysqlsh -- -h yb-tserver-hello-ybdb-cluster-0  --echo-queries

ysqlsh (11.2)
Type "help" for help.

postgres=# 
```

見て頂くと分かるとおり、ysqlshの表示内容はpsqlそのものです。

### Web UIも同時に起動される
YugaByteDBをRookでインストールすることで、管理用のユーザインタフェースも同時に導入されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54853/3f12b914-a53a-8613-7406-267078a79829.png)

こちらの利用にはKubernetes環境に応じたServiceのセットアップが必要になりますので、[こちら](https://docs.yugabyte.com/latest/quick-start/create-local-cluster/#kubernetes)を参考に設定して下さい。

# まとめ
ここまでRookでYugaByteDBをインストールし、CLIとUIでの接続を試してきました。
明日からは実際にテーブルを作成し、データを入れた後にSQLクエリの実行を行っていきます。

よろしくお願いします。
trdsqlの性能評価を行ってみた

## はじめに

先日のPHPカンファレンス2019にて`trdsql`なる便利ツールを知り、これ実業務に適用できたらログ調査とか楽になるかなーと思い触ってみました
実業務のログファイルは大変大きいファイルなのでどの程度まで耐えられるのか？
sqlと謳っているがindex的な概念はあるのか？
このあたりを調べてみました

[phpcon参戦記事はこちら](https://note.com/piro234/n/n4b534607e8b9)

[trdsqlに関してはこちら](https://qiita.com/noborus/items/f253961cca6f4465f20c)

## 対象ログ

とあるログ

* 126,945,759行（約1億2000万行）
* 13.8GB
* タブ区切り

フォーマットは以下の感じ

```tsv
ipアドレス   実行したdatetime     ログID   実行したmsec
```

なるほど確かに重い
こいつに対してサクサク検索かけられたらめっちゃ強い

## とりあえず試してみる

インストールは[github](https://github.com/noborus/trdsql#LTSVLabeledTab-separatedValues)に記載の通りでいけた

```bash
go get -d github.com/noborus/trdsql
cd $GOPATH/src/github.com/noborus/trdsql
make
make install
```

とりあえず1件取得
タブ区切りのファイルは以下の感じで指定するといける
ヘッダーはないのでc1とかc2とかでカラム指定をする

```bash
trdsql -id "\t" "SELECT c2 FROM test.tsv limit 1"
実行結果: 2019/12/10 00:00:00
実行時間: 7分40秒
```

あ…あれ…？
1件取得で既にこの実行時間…これはダメかもしれん…
大体やりたいのは時間による絞り込みなのでc2で一定期間のログを集計してみる

```bash
trdsql -id "\t" "SELECT count(*) FROM test.tsv where c2 between '2019/12/10 00:30:00' and '2019/12/11 00:35:00'"
実行結果: 30569145
実行時間: 9分20秒
```

うーん、思ったよりはマシだったがこのレベルだと普段の調査では使い物にはならなそう

## まとめ

`trdsql`は大変使い勝手の良いツールですが速度面で言うと、大きいファイルに対してはあまり有用ではなさそうでした
sqlライクにしているだけでindex的な概念もなさそう
結局`less`したりファイル分割したりして細かく見ていくしかないのか…

## 追記

そーだいさんからtwitterにてコメントをもらいました

![スクリーンショット 2019-12-11 15.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/f825dd0e-9bdd-d0be-0ab9-545d0e070e40.png)
xampp/mamp/cyberdockの各種起動方法まとめ(Mac)

#cyberdock
　

※cdコマンドでホームに戻り、開きたいフォルダに移動その後下記コマンド実行


```

$ cd //ホームに戻ります
/Users/ユーザー名/

(cd移動省略)

$pwd //MyCentosまで移動しました
/Users/ユーザー名/MyVagrant/MyCentos

$vagrant up //VirtualBox起動
$vagrant ssh //ログイン

[vagrant@localhost ~]$ //sshログイン成功です。

[vagrant@localhost ~]$ ls　//開きたいフォルダの確認
centos6  php_lessons  todo_app_php

[vagrant@localhost ~]$ cd todo_app_php //開きたいファイルのフォルダへ移動

[vagrant@localhost todo_app_php]$ ip a
(省略)
pfifo_fast state UP qlen 1000
    link/ether 08:00:27:91:bf:ad brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
    inet6 fe80::a00:27ff:fe91:bfad/64 scope link 
 (省略)

[vagrant@localhost php_lessons]$ php -S 192.168.33.10:8000


http://192.168.33.10:8000　 //接続完了

```



　




#MAMP
##1.MANPを起動

##2.mac内のアプリケーション内からhtdocsを開きアクセスしたいフォルダまで移動してアドレス入力

`http://localhost:8888/todo_app_php/index.php`

MAMPフォルダのhtdocsの中のプロジェクトファイル指定でアクセス可能となる。
※この場合はhtdocsの下のtodo_app_phpフォルダのindex.phpファイルを表示している


##xampp
1.maneger-osxを起動

2.アプリケーション→xampp→htdocs→アクセスしたいフォルダまで移動してアドレス入力

```
例：http://localhost/calendar_php/folio/list.php
```

※この場合もMANPと同じ
マンガでわかる Flyweight

![BB6E8DB9-E842-49B7-A56B-274D2D9D6675.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/543f7f7f-fe1f-ad6b-dcda-dacf5cd3b16b.png)

なんだか普通にためになるマンガを描いてしまった。...いや、何を言ってるんだ、これでいいのか。

Flyweight パターンは言葉から意味を連想しにくいパターンのひとつですが、簡単に言えば、等価なオブジェクトを共有するのが、軽量化の最良の手ですよというだけの話です。

たとえば、データベースのレコードの関係は、いくらでも関係を辿れる木構造になったりします。愚直にオブジェクトでツリーを構築してしまうと、意味が同じレコードが複数箇所に現れることがあります。同じはずのオブジェクトが異なるインスタンスになってしまうと、単にそのインスタンスの重複ぶんが無駄になるだけでなく、そこから先に伸びる関係全体も、無駄な重複としてメモリを圧迫すると考えられます。

また、無駄な重複は、操作の回数の無駄にもつながります。オブジェクトを共有していれば 1 回で済むことを、何度も処理しなければならないかもしれません。この無駄な処理には、ネットワークを介した遅延ロードなども含まれます。

ゲームの場合で例えると、画面上に複数登場する同じ絵柄のパーツが、いちいち個別に画像データのコピーを持つのは無駄ですね。画面上の座標と画像へのポインタしか持たない、軽量なオブジェクトをたくさん生成するのが普通です。

もちろん、キャッシュがあると時間差での変化を追従できない心配があるなどの理由で、ぜんぶ再評価したい気持ちになることもあるでしょう。が、負荷を甘く見ていると、思ってもいなかった無駄は再帰的に広がっていきます。「n + 1」問題はすぐに、「n + 1 の m 乗問題」に化けるのです。

エンティティを再利用できるリポジトリを持った ORM ではなく、問い合わせごとに、つねに新規オブジェクトを生成する ActiveRecord を使う場合、Flyweight を意識的にやらないといけないので、注意が必要です。

コンピューターのリソースは有限なので、共有でよい範囲をうまく見定めて、すでにあるオブジェクトをうまく再利用しましょう。
aタグをクリック後にボタンのカラーを変更しない処理

# いきなり結論。
```
// aタグのtwitter-share-buttonクラスが付与されているタグ
a.twitter-share-button:visited {
    background-color: #6dc8fc !important;
}
```
「important!」 はあってもなくても問題ないと思います。
私の環境では必要だったので上記では記述されています。
VSCodeで複数ある名前の異なるDockerfileに対してLanguageModeを利かせる

VSCodeでは`Dockerfile`という名前のファイルでしか、認識されずDockerfileのSyntax Highlightが適用されない。

`.vscode/settings.json`に以下のような内容を追記すれば、`Dockerfile.dev`や`Dockerfile.prod`にも適用される。

```json
{
  "files.associations": {
    "Dockerfile.*": "dockerfile"
  }
}
```

上記はワークスペースに対する設定だが、ユーザ設定で変えても大丈夫。
親要素の背景透過を子要素に適用したくない

備忘．

親要素のstyleで'opacity: 0.8;'とかを設定すると，その子要素にも自動的に同じだけの透過が効いてしまうので

opacityではなく'rgba(r, g, b, 0.8)'のようなを設定してやるとよい
レスポンシブルサイト作成の手順と注意点

# はじめに
ここ最近にPCとモバイルのどちらにも対応できるレスポンシブルサイトについて学んだので、それについてここで復習がてらにアウトプットしようと思います。

# レスポンシブルサイトについて
レスポンシブルサイトとは、上で軽く触れた様にPC対応とモバイル対応の両方ができるサイトです。
具体的に言うと、メディアクエリを使って各端末ごとのCSSを記載していき、CSSを切り替えることで様々な端末絵の対応が可能になります。
しかし、レスポンシブルサイトにはメリットもありデメリットもあります。それを軽くまとめます。

**メリット**
PC対応とモバイル対応が両方できるため、サイトが一つだけですみ管理が簡単。

**デメリット**
HTML構造を同じにしないといけないため、レイアウトに制限あり。
必要な技術力が専用サイトよりも高い。


# 作成の流れ

１、スマホ版のレイアウトとPC版レイアウトのデザイン案を作成する。
この際に、レイアウトを先に考えるのではなく、必要コンテンツを先に出して、それを元にレイアウトを考える。

２、デザインにセクションやHTML要素を割り当てていきHTML構造を作成する。

３、各要素にクラス名などのセレクタ名をつけていく。
この際、セレクタ名は複数開発に仕様が出ない様に一目でわかるものにする。

４、CSSを割り当てていく。
XBRLに関するあれこれ(10/10)

Advent Calendar 最後の投稿では、Advent Calendarで触れなかった内容を概要レベルで記載したいと思います。
# 1. その他の内容
**〇inlineXBRLからインスタンスに変換する方法について**
inlineXBRLの処理にお困りの方のために、XIIが提供している[**Inline XBRL Extractor**](https://sourceforge.net/projects/inlinexbrl/)を紹介する記事を検討していました。`inlineXBRL1.0`仕様であれば、本ライブラリを活用することで`inlineXBRLをインスタンスに変換可能`です。（inlineXBRL1.1には未対応ですが、日本のXBRL関連システムでは未適用のため、現状問題はありません）XIIが活用方法について[**チュートリアル**](http://www.xbrl.org/inlinexbrlextractortutorial/index.html)を公開しています。[Part 2: Technical Details]が解説として分かりやすいと思います。

**〇拡張項目を抽出したデータセットの提供について**
従業員の情報を抽出するプログラムを記載しましたが、企業毎に拡張している項目を抽出するまでは対応できていません。そのため、データセットとしては、全開示企業の情報が取り込まれていない状態になっています。
※従業員の情報を、社員(ex.`MonthlySalaryEmployee`)と従業員（ex.`HourlyWageEmployee`）で分けて開示している企業などがあり、そのような場合は区別するため項目を拡張しています

【給与に関する項目の一例】
社員給与：`AverageAnnualSalaryMonthlySalaryEmployeeInformationAboutReportingCompanyInformationAboutEmployees`
従業員給与：`AverageAnnualSalaryHourlyWageEmployeeInformationAboutReportingCompanyInformationAboutEmployees`

**〇海外システムからのデータ自動取得について**
`EDGAR`、`Companies House`、`HMRC`からのデータ自動取得の記事を検討していましたが、投稿まで至りませんでした。いずれもプログラマフレンドリーなシステムなので、是非興味がある方は挑戦してみてください。（Companies Houseは[**API**](https://developer.companieshouse.gov.uk/api/docs/)を提供しています。）また、先日XBRL USが[**XBRL API**](http://xbrlus.github.io/xbrl-api/#/)を発表しました。USのサイトに[**API接続先DBに関する概要等**](https://xbrl.us/home/use/filings-database/)も記載されているようです。


**〇XBRL認定教育＆資格について**
XBRLには、`XII公認の認定教育＆資格`があります。XBRL認定教育は、業務時間を学習のために割けない方や、まとまった学習時間を確保しづらい方でも効率的に学習できるよう、`eラーニング形式`になっています。詳しくは、XIIの[**Individual Certification**](https://www.xbrl.org/the-consortium/get-involved/individual-certification/)ページをご覧ください。（`XBRL Foundation Certificate Exam`に合格した方は、[**本ページ**](https://www.xbrl.org/the-consortium/get-involved/individual-certification/individual-certification-list/)に記載されます）

**〇XBRLJapanの組織・委員会について**
XBRLJapanは`理事会`と、`企画委員会`、`開発委員会`、`金融・データ利用委員会`、`教育委員会`の４つの委員会で活動しています。 理事会は、XBRLJapan会長、副会長を含む理事で構成され、XBRLJapan の運営について重要な事項を審議し、活動方針・計画を承認あるいは決定しています。 各委員会は、密に連携しながら、XBRL技術規約等の開発への協力や、XBRLに関する広報、関係団体との交流の推進などを行っています。また、開発委員会と金融・データ利用委員会は、月に１度委員会を開催しています。

# 2. おわりに
初めてXBRLに触れた方は、XBRLの概要やXBRLデータを扱うための情報を得ることができたでしょうか。既にXBRLを知っていた方々には、有益な情報が提供できたでしょうか。このAdvent Calendarを通じて、一人でも多くの方が、XBRLに興味を持っていただけたなら幸いです。
そして、やはり1点だけ、触れておくことにします。みなさまからのXBRLに関する厳しいご意見には目を通しており、様々な課題に直面していることも確かです。一方で、その課題を乗り越えるために、世界中の方々が知恵を絞りながら活動を進めていることもまた事実ではあります。そういったXBRLの影の部分と、それに対する取り組みについても、今後、どこかの場を利用し、何らかの形で発信していきたいと考えています。

最後になりますが、[XBRLJapan会員からのメッセージ](https://www.xbrl.or.jp/modules/pico3/index.php?content_id=3)をここに引用し、今年のXBRLJapanのAdvent Calendarをクローズしたいと思います。以上、ここまでお付き合いいただきありがとうございました。
>エルトンジョンの名曲に「Good-bye Yellow Brick Road｣があります。私が初めて参加したXBRLの国際会議で、ある方が、「Yellow Brick Road to XBRL｣と題して、これから彼が取組もうとしている巨大で、そして困難なプロジェクトについて報告をしました。
マイクロフォンが不調だったため、大きなホールの中央に立った長身の彼が、肉声を張り上げて、語りかけるその内容に、聴衆は魅了されました。私は、肌に粟粒が立つくらい、感動し、そしてこの技術の持つ可能性にひきつけられていきました。
数年後、彼のプロジェクトは見事に完成し、歴代のXBRLプロジェクトの中でも金字塔的な評価を受けながら、稼動を開始しました。私も、その彼に数歩遅れながらも、なんとか自分達のプロジェクトを成遂げることが出来ました。
途中何度も挫けそうになりました。その度に思い出したのは、彼の姿です。今も、そして何時までも彼に感謝しています。ありがとう、Jon！　そして多くの仲間たち！　この道を歩んできて、私は幸せです。そして、次にこのYellow Brick Roadを歩むのは、この文章を読んでいる、「あなた｣です。 XBRLは単なる技術ではありません。改革者のネットワークです。一緒に歩いてみませんか？　コンピュータのエスペラント語で世界を繋ぐ改革者の道を！
Medisのインストール時で詰まったこと

# はじめに
MacでRedisのGUIクライアントを求めていて、以下の記事の通り対応してみました。
https://qiita.com/rsuzuki/items/ff0891e4ae7e44ab7946

# PC情報
・ MacBook Pro macOS Mojave バージョン 10.14.6
・ npm バージョン 6.13.1
・ node.js バージョン 13.2.0

# 実行してみて起きたエラー
・ npm startを実行して起きたエラー

```
> medis@1.0.3 start /Applications/medis
> electron .

/Applications/medis/node_modules/electron/index.js:14
    throw new Error('Electron failed to install correctly, please delete node_modules/electron and try installing again')
    ^

Error: Electron failed to install correctly, please delete node_modules/electron and try installing again
    at getElectronPath (/Applications/medis/node_modules/electron/index.js:14:11)
    at Object.<anonymous> (/Applications/medis/node_modules/electron/index.js:18:18)
    at Module._compile (internal/modules/cjs/loader.js:1121:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1160:10)
    at Module.load (internal/modules/cjs/loader.js:976:32)
    at Function.Module._load (internal/modules/cjs/loader.js:884:14)
    at Module.require (internal/modules/cjs/loader.js:1016:19)
    at require (internal/modules/cjs/helpers.js:69:18)
    at Object.<anonymous> (/Applications/medis/node_modules/electron/cli.js:3:16)
    at Module._compile (internal/modules/cjs/loader.js:1121:30)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! medis@1.0.3 start: `electron .`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the medis@1.0.3 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/XXXXX/.npm/_logs/YYYY-MM-DDTXX_XX_XX_XXXZ-debug.log
```

なんかErectron正しくインストールできてへんで。
インストールし直してや。
みたいなことを言われているような。

# 対応したこと
```
$ node node_modules/electron/install.js
```

# 結果
```
Downloading tmp-86876-1-SHASUMS256.txt-4.2.12
[============================================>] 100.0% of 4.79 kB (4.79 kB/s)
```

```
$ npm start

> medis@1.0.3 start /Applications/medis
> electron .
```

うまくいったみたい
以上、現場からお伝えしました。

# 参考情報
https://github.com/electron/electron/issues/20731
UipathでCitrix環境のシステムを操作するロボを開発して感じたこと

#この記事の目的
Uipathも力をいれつつあるUipath × Citrixの現状について記事にしたもの。
Citrixへの開発ナレッジが今一つネットに落ちていなかったので、こちらにまとめてみた。
あるクライアントのRPAの開発対象業務が、Citrix上に業務システムが乗っかっていたので、開発経験できたことは良い経験だった。
＊この記事は決してCitrixおよびUipathを批評するものではなく、私が開発する上で感じたことであり、できる限りファクトべースで記載するよう心掛けた。
#Citrixって何？
仮想化の仕組みを作ってくれる大手ソフトウェアベンダ名およびソフトの名称。
サーバ上にアプリケーションや仮想端末を用意するだけで、物理端末からアクセスするだけでよい便利なもの。
![vdi-630x307-jp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166410/addcffe1-d5d9-9ea0-b8a7-0c6217394361.png)
＊https://www.citrix.co.jp/products/citrix-virtual-apps-and-desktops/resources/vdi-solution-virtualization-overview-jp.html

#Uipath × Citrixの前提事項
上記の絵を見てくれれば分かるが、物理端末側で操作している業務システムの画面は、Citrix側から送付されてきた画像データである。Uipathは開発対象システムのプログラムファイルまで読み取ってセレクターを認識しているが、画像データだけでは認識できるセレクターに限界があるのが、Citrixの現状である。

#開発前提情報
・対象業務システムは、おそらく.NET系（Citrix上に乗っかっているため、詳細を知ることはできなかった。）
・物理端末でロボが動き、Citrix ReceiverというIEから特定のURLにアクセスするWebブラウザベースのアプリを使用する。Citrixにログインし使用する業務システムを選択すると、その業務システムが動作する仕組み。

#何が大変だったのか
Citrix上の業務システムに対して、大きく困ったのは以下の3つ
①セレクターは画面単位でしか取得できない
②不安定なのでよく落ちる
③kill proccessが使えない
#どのように開発をしたか
**①セレクターは画面単位でしか取得できない**
Citrixでは画面のテキストボックスやラジオボタンなどの部品のセレクターは取得できない。
部品ごとのセレクターが取れないとなると、業務システムを操作するにあたっては以下の手段で進めるしか方法がない。
・画像指定
・ショートカットやTabキー、矢印キー
・座標指定
・Citrixネイティブ
Uipathの中に「Citrixネイティブ」という機能があるが、普通の画像指定でうまく動作しない場合は、こちらの機能を使用して、画像指定するとすんなりいくことがある。

**②不安定なのでよく落ちる**
Citrix自体が不安定であり、その上に乗っかっている業務システムももちろん不安定になる。(もちろんCitrixの設定の仕方によって差異はある)
不安定とはログインに失敗したり、登録に失敗したり、システムが落ちたりetc...
人の手で操作する分には全く問題ないレベルだが、ロボに動作させるとなるといきなり不安定になるのがRPAの恐ろしい部分の1つ。安定させるために以下のことを行った。

・画面が変わるごとにウインドウアタッチを使用し、アクティビティ1つ1つに画面のセレクターを指定する。
・ループ処理の中でエラー後も次の処理へ安定して移るために、1処理ごとにCitrixにログイン→ログオフ。
・Citrixへのログインをリトライスコープで複数回チャレンジする。
・Delayや実行後の待機時間をアクティビティ1つ1つに対して設定(500~800ミリ秒)

Delayを入れないと処理スピードが速すぎて、画像認識がうまく取れなかったり、処理が回らずシステムが落ちたりすることがある。
Delayは基本的に悪だという風潮があるが、セレクターが取れない環境ではそんなことも言ってられない。

**③kill proccessが使えない**
過去プロジェクトでは、共通モジュールとしてExcelやSAP等に対してkill proccessをかける終了処理関数を用意していたので、今回のプロジェクトにも適用しようとした。しかし、Citrix上の業務システムをkill proccessすると、次に立ち上げた際にログインも聞かれずいきなり以前終了した画面が立ち上がる。これはCitrixと物理端末との接続が切れただけで、Citrix上では業務システムが動作したままになっていることが原因である。
対策としては、ALt+F4を繰り返し打鍵し、丁寧に終了処理をさせるしか方法が無かった。
どのタイミングでエラーが起きてもきちんと終了するかをテストするのがまぁまぁ苦痛でもあった。

#まとめ
Uipathプロフェッショナルな方からすれば、「そんなの設定して当たり前じゃね」てな内容もあると思う。しかし今までSAPやExcel等のUipathが触りやすいものを開発してきた人であれば、ここまで細かく1つ1つ設定しなければ安定動作しないことに驚く人もいるはず。
基本的にはRPAのプロジェクトは開発期間が短いので、ロボ開発の対象がCitrixになった瞬間難易度が割と上がると思ってもらった方がよい。
何か間違いや修正点があれば、コメント欄にお願いします。
見てくださってありがとうございました。

#Uipath × Citrixの公式情報
以下のURLにUipathの公式がCitirix製品に対する開発のナレッジ等を記載しています。
こちらも参考情報としてどうぞ。
https://www.uipath.com/ja/blog/developer/citrix-environment
[2020年問題]安心してクリスマスを迎えるために

2020年問題にはもう対応されましたか？
放っておくと、貴重なログのタイムスタンプが認識しなかったり、スタートレック並の過去ログとして認識されてしまうかもしれません。

公式ブログでもアナウンスされています。
https://www.splunk.com/en_us/blog/bulletins/splunk-announces-important-platform-update-for-the-new-year.html

簡単な手順。

* 下記から更新用ファイルをダウンロードします。
http://download.splunk.com/products/ingest2020/datetime.zip

* splunkプラットフォームインスタンスを停止します。

* splunkをインストールしてあるディレクトリの /etc に、上記でダウンロードをした datetime.xml を設置します。
* 既存の datetime.xml は、をバックアップをするか、上書きしましょう。

* splunkプラットフォームインスタンスを再起動します。

お作法としては、まずはご契約されているパートナー企業から連絡がきていると思いますので、パートナー企業さんと一緒に年末までに対応しましょう！
[OpenCV] ValueError: not enough values to unpack (expected 3, got 2)

## 問題

`OpenCV`の`findContours`を使って以下のようにコードを書いたところ、

```python:wrong

import numpy as np
import cv2

im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #この行
```

```ValueError: not enough values to unpack (expected 3, got 2)```と出て怒られた。

## 解決策
opencvの最新版であるOpenCV4では、`findContours`の返り値は、`contours`と`hierarchy`の2つになっているため、以下のように書けば期待通りの動作をする。

```python:good

import numpy as np
import cv2

im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #この行
```

## 引っかかったこと
上記のコードは
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html
を参考にしている。
ところがこのコードはOpenCV3に準拠しているため、現行の最新版であるOpenCV4とは一部仕様が異なっている。
その例の一つがこの`findContours`の返り値だった。

間の悪いことに、同じHP内には
http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_imgproc/py_contours/py_contours_more_functions/py_contours_more_functions.html
というのがあって、ここには、

> OpenCV3ではOpenCV2と異なり cv2.findContours()は2つではなく3つの値を返す

という記述がある。ここで自分の使っているOpenCVのバージョンに対して大きな混乱を招いた。

## なんで import cv2 なん？
OpenCV4なら、`import cv4`ってしてください。
私は今日まで自分がOpenCV2を使っているのだと思いこんできました。
Google Cloud Run に Laravel アプリケーションをデプロイする

# Google Cloud Run is なに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222391/03dc164e-0cce-0b85-55bb-827d73e48851.png)

Google Cloud Run とは、GCP マネージド型のコンピューティング プラットフォームで、
[Knative](https://knative.dev/) を基盤としてる、コンテナをサーバーレスで実行するための環境です。
Cloud Run は、サーバーレスとコンテナの いいとこ取りを実現します。

https://cloud.google.com/run/?hl=ja
https://cloud.google.com/blog/ja/products/serverless/knative-based-cloud-run-services-are-ga

# Laravel を動かす
では試しにLaravel を動かしてみましょう

### 事前準備

- GCP のプロジェクト作成
- GCPのgcloud コマンドをインストール
- gcloud コマンドの初期設定
- デプロイする Laravel のプロジェクトを事前に作成

## デプロイの流れ
コンテナ用の設定ファイルを作成
↓
デプロイ用のコンテナイメージをビルドする
↓
ビルドしたイメージを ContainerRegistry にプッシュ
↓
プッシュしたイメージを CloudRun にデプロイ

### コンテナ用の設定ファイルを作成
まずコンテナイメージのビルドに必要なファイルを作成

Dockerfile 
今回は、PHP7.3 の Apacheのイメージをベースします
CloudRun で動かすコンテナは、HTTP のリクエストを `8080` ポートでリッスンしておく必要があります

``` dockerfile:Dockerfile
# composer 用
FROM composer:1.9.0 as build
WORKDIR /app
COPY . /app
RUN composer global require hirak/prestissimo && composer install

# Laravel の実行環境用のコンテナ
FROM php:7.3-apache-stretch
RUN docker-php-ext-install pdo pdo_mysql

EXPOSE 8080
COPY --from=build /app /var/www/
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
COPY [Laravelの.envファイル] /var/www/.env
RUN chmod 777 -R /var/www/storage/ && \
    echo "Listen 8080" >> /etc/apache2/ports.conf && \
    chown -R www-data:www-data /var/www/ && \
    a2enmod rewrite
```

Apacheの設定ファイル

```apache:000-default.conf
<VirtualHost *:8080>

  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/public/

  <Directory /var/www/>
    AllowOverride All
    Require all granted
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
```

### デプロイ用のコンテナイメージをビルド and ContainerRegistry にプッシュ

gcloud の以下のコマンドを、Dockerfile のあるディレクトリで叩く

```
$ gcloud builds submit --tag gcr.io/[GCPのプロジェクト ID]/[イメージ名]
```

コンテナイメージのビルド後 GCP ContainerRegistry にイメージがプッシュされる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222391/f436a271-6cfb-2492-0a79-3d6d68d271c2.png)


### Cloud Run へデプロイ

ContainerRegistry　の画面から プッシュしたコンテナイメージを選択し
`Cloud Run へのデプロイ` を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222391/0aa48370-a79f-4830-a5bd-23c0dda9253e.png)

デプロイ時に、 ローケーション、サービス名、認証について設定し、デプロイを実行する


### 確認

デプロイ画面で作成されたURLを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222391/de0280be-d45f-db7d-2801-76a4da873076.png)


URLにアクセスして、Laravel で作成したアプリケーションを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222391/6ea1ed12-1898-4d78-d697-ec4b7dcba8dc.png)


### まとめ

自分でコンテナイメージを作るため FaaS 特有の、言語縛りや、ライブラリの制限、
ベンダー特有のコーディング方法への制限がない、という点に大きな魅力を感じました。
コンテナをサーバレス化する場合の組み合わせとして、FaaS 以外の選択肢という可能性を大きく感じました！

# 参考

https://nsirap.com/posts/010-laravel-on-google-cloud-run/
【PowerShell】Outlook のメモにアイテムを追加する

以下のコードでメモにアイテムを追加できる。

```powershell
$app = New-Object -ComObject Outlook.Application
$item = $app.CreateItem([Microsoft.Office.Interop.Outlook.OlItemType]::olNoteItem)
$item.Body = "test"
$item.Save()
```

↓ 自己解決 なぜかできるようになった・・・・。

---
以下のように変数に格納した文字列を Body プロパティに設定するとなぜか空のメモが追加される。

```powershell
$app = New-Object -ComObject Outlook.Application
$item = $app.CreateItem([Microsoft.Office.Interop.Outlook.OlItemType]::olNoteItem)
$str = "test"
$item.Body = $str
$item.Save()
```

Body プロパティに固定値をセットすると文字列が設定されるのだが、変数の値をセットしようとすると何故か空になる...。

```
Name             : Windows PowerShell ISE Host
Version          : 5.1.17763.316
```
cv2.cvtcolorの注意点

#エラー内容

```python
a = np.array([[[255,0,0]]*100]*100)
a = cv2.cvtColor(a, cv2.COLOR_RGB2BGR)
plt.imshow(a)
```

こんなエラーが出た.

```
error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn = cv::impl::{anonymous}::Set<3, 4>; VDepth = cv::impl::{anonymous}::Set<0, 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = (cv::impl::<unnamed>::SizePolicy)2u; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'
```

#解決

```python
a = np.array([[[255,0,0]]*100]*100,np.uint8)
a = cv2.cvtColor(a, cv2.COLOR_RGB2BGR)
plt.imshow(a)
```

#原因
np.arrayはデフォルトでdtypeがint64となる。しかし、cv2.cvtColor()の引数はuint8,uint16でなくてはならない。

#参考
https://stackoverflow.com/questions/50319617/opencv-error-cv2-cvtcolor
https://postd.cc/image-processing-101/
新人エンジニアがもらったコードレビュー備忘録


##　前提
新人エンジニアがもらったフィードバックやコードレビューの備忘録的記事です。※随時更新


## 内容
一つの処理の責任が肥大化しないようapiを叩くという機能だけ持たせたクラスを作る方がいい

apiを叩く処理は引数に条件を渡した方がより汎用的になる

global変数を使うとバグが発生した際の原因特定が難しくなるため変数のスコープは必要なければ極力狭くす

大抵同じ値が入る引数は呼び出し側がそこまで意識しなくて良いようデフォルトの値を指定しておく

引数の名前はapiの引数と同じ名前にすると対応関係がわかりやすい

コードの可読性のため変数名は意味のある名前にする。for文などでvやxなど無意味な変数を使わない。

学習後のモデルを保存する場合は ディレクトリを分けたほうが良いかもしれない
```blah blah/ml_models/model.pkl
```

複数回使うようなコードは別クラスに分けて責任を分離でき、コードが簡潔になり運用しやすくなる

数字を変数名に入れるとマジックナンバーに見えるので具体的な単語の方が分かりやすいかも

docer fileに
```- 環境変数名=$ローカルで設定してる環境変数```
これで直接書きたくない秘密鍵などを設定できる

コードが長くなりすぎる場合は変数に入れる

コードで返ってくる値が分からない、意味が分かりにくい場合は変数を定義する

不要な変数定義はしない。処理から何の値が返ってくるかわかるようなものは変数に入れなくても良い