OmniAICreator/Qiita-1.07M huggingface dataset:
webスクレイピングで画像を保存する

#概要
webサイト上の画像を、PythonのrequestsとBeautifulSoupを使ってPC上に保存します。ついでにスクリプトを実行時に画像を表示します。
#動機
Perfumeの画像を保存したいです。自動で保存できれば便利だと思いました。
#開発
##環境
|  OS  |   Windows 10   |
| ---- | ---- |
|  Python  |  3.7.3  |
|  requests  |  2.22.0  |
| beautifulsoup4 | 4.8.2 |
##完成したコード
```python:main.py
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import cv2

root = "https://www.perfume-web.jp/"
url = "https://www.perfume-web.jp/index-jpn.php"
store_path = "PATH"

def img_store(path):p
    img = requests.get(path).content

    print(path)

    with open(store_path, "wb") as f:
        f.write(img)

    img_local = cv2.cvtColor(cv2.imread(store_path), cv2.COLOR_BGR2RGB)

    plt.imshow(img_local)
    plt.show()

response = requests.get(url)

soup = BeautifulSoup(response.text, "html.parser")

top_img = soup.find("div", id="main").find("img").get("src")

img_store(root+top_img)
```
##説明
```py
response = requests.get(url)

soup = BeautifulSoup(response.text, "html.parser")

top_img = soup.find("div", id="main").find("img").get("src")
```
指定したURLからHTMLを抽出します。（1，2行目）
次に、サイトのHTMLを読みます。方法は、Chromeなら左クリックして、「検証」を選択すると出てくるウィンドウで読めます。  
今回はWEBページのトップ画像を取りたいので、divタグのmainを指定しました。
find()は同じタグやidがあっても一番最初に出てくるもののみを取ってくるので、帰ってくる値は1つのみです。その中のimgタグのsrcを取得しました。  
HTML内のタグやidは実際にサイトとHTMLを読んで自分で工夫して見つけるしかありません。より複雑な要素を獲得するためにbs4に多くの関数が用意されています。

```python
 top_img = soup.find("div", id="main").find("img").get("src")
```
```python

def img_store(path):p
    img = requests.get(path).content

    print(path)

    with open(store_path, "wb") as f:
        f.write(img)

    img_local = cv2.cvtColor(cv2.imread(store_path), cv2.COLOR_BGR2RGB)

    plt.imshow(img_local)
    plt.show()

```

画像のパスが相対パスだったのでサイトのドメインをrootとして用意して、取得した画像の相対パスと接続することで画像の正しいURLを作りました。
あとは保存と表示です。matplotlibで表示したのは趣味です。ピクセル数に応じた目盛りが出ていい感じです。

#結果
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361460/be047381-3c2c-fd64-1448-e61db23b4ae6.png)
こんな感じに表示されます。（3人のご尊顔は隠させていただきました。見たい方は[Perfume Official Site](https://www.perfume-web.jp/index-jpn.php)へどうぞ）
画像の探し方を変えれば他の画像も保存できます。

#考察
自動的にサイトの更新がわかればいいなーという考えの足掛かりにwebスクレイピングをしてみました。webスクレイピングにはルールや法律など、いろいろあるらしいので、下記のサイトを参考になさってください。相手のサーバに負荷をかけてしまうのは攻撃の一種ですよね。。。
https://qiita.com/nezuq/items/c5e827e1827e7cb29011
デバッグや練習では、一度サイトのHTMLをすべて保存して使うのがよいと思います。思いがけない無限ループなどしたら恐ろしい。

#参考
http://kondou.com/BS4/
https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406
https://qiita.com/YosukeHoshi/items/189c615187f41f2f4e27
ローカルサーバーのレスポンスが遅いときはホスト名をマップする


サーバーアプリケーションをローカル(`127.0.0.1`とか`localhost`)で立ち上げたときに、curlやPostmanなどを使ったリクエストをすると全てのレスポンスに一定時間の遅延やタイムアウトが発生するようになった。Dockerを使っていたりしたので、PostmanやDockerの再インストール、macのクリーンインストールなどしたが全然ダメだったときに同僚からいただいたアドバイスで直ったのでその対策法を置いておく。サーバーとフロントを同時にローカルで立てたとき、macOSのアップデートのときなんかも起こることがあるらしい。

原因はローカルホストのアドレス解決がうまくいかないことらしく、`hosts`のconfファイルにマシンのローカルホスト名を記述すると直りました。

### hostnameコマンドでマシンのローカルホスト名を表示

```
$ hostname
XXX.local
```

### `/etc/hosts` を編集する

`127.0.0.1` と `::1` のlocalhostの隣にマシンのローカルホスト名を追記する。`sudo`が必要かもしれません

```conf
127.0.0.1   localhost XXX.local
::1         localhost XXX.local
```

以上です。
[Python][解説]AtCoder Typical DP Contest：A コンテスト

問題へのリンク：https://atcoder.jp/contests/tdpc/tasks/tdpc_contest


## はじめに
[AtCoder 版！蟻本 (初級編）](https://qiita.com/drken/items/e77685614f3c6bf86f44)にこの問題が紹介されていましたが、古いコンテストのためか公式の解説がありませんでした。


自分では解けず、[こちらの記事](http://garnacha.techblog.jp/archives/38634648.html)の解説を見ながらACしました。参考までに自分のコードを載せておきます。（DPは勉強中のため、正確性は保証できません）

わかりやすいように、コメントをたくさん付けました。


## 実装

```python
# 入力の受け取り
N = int(input())
P = list(map(int, input().split()))

# i問目までの問題を使って、j点の合計点ができるか（bool値）
DP = []
# 0問目は1問も問題を解いていない状態とする。N問あるので、DP[N]まで必要
for i in range(N+1):
    # N=100かつすべてのPが100点だった場合、
    # 合計の最大値は100*100点になる（0点の場合もあるので配列のサイズは100*100+1）
    a = [False] * (100 * 101)
    DP.append(a)

# 0問目までの問題を使って（=問題を一問も解かない）0点を取ることができる。
# また、それ以外の点数にはならないため、DP[0][0]以外のDP[0]の配列の値はFalseになる。
DP[0][0] = True

# 1問目からN問目までのループ
for i in range(1, N+1):
    # DP[i]に値を入れていくために、DP[i-1]の状態を見ていく
    for j, dpj in enumerate(DP[i-1]):
        if dpj is True:
            # i問目の問題を解かない
            DP[i][j] = True

            # i問目の問題を解く
            # i問目の得点はP[i-1]で表される
            DP[i][j+P[i-1]] = True

ans = 0
# DP[N]の配列を見て、Trueになっているところがありうる合計点
for dpi in DP[N]:
    if dpi is True:
        ans += 1
print(ans)
```

## 具体例

実装だけではイメージがつきにくいと思うので、「Sample Input 1」を例にDP配列の中身を見てみましょう。

```text:Sample_Input_1
# 入力
3
2 3 5

# 出力
７
```

下記はDP配列の中身です。「i問目まで解き終えたときにj点になることがあるか」を表しています。
サンプルの入力よりjの最大値は10（2+3+5）になります。

|i\j|0|1|2|3|4|5|6|7|8|9|10|...|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0|1|0|0|0|0|0|0|0|0|0|0|
|1|1|0|1|0|0|0|0|0|0|0|0|
|2|1|0|1|1|0|1|0|0|0|0|0|
|3|1|0|1|1|0|1|0|1|1|0|1|

i=0のとき、すなわち問題を解いていないときに、ありうる得点は0だけです。（DP[0][0]のみがTrue）
i=1のとき、すなわち１問目の問題のみを解き終えたとき、ありうる得点は、0点か2点です。（1問目の得点は2点です）
i=2のとき、ありうる得点は、0点、2点、3点、5点です。（２問目の得点は3点なので、i=1でTrueとなっている得点に3点を足すか、足さないか）
このような操作をi=3まで行ったとき、Trueとなるのは「0, 2, 3, 5, 7, 8, 10」ですので、答えは7になります。


以上です。
Kuin on Linux/macOS

## Introduction

Kuin can be bootstraped and [can output C++](https://github.com/kuina/KuinInKuin), so now it is possible to run Kuin on Linux/macOS.

## Method

```bash
git clone https://github.com/kuina/KuinInKuin
cd KuinInKuin/build
# Build latest kuin.exe using bootstrap kuin
/Applications/EasyWine64.app/Contents/Resources/wine/bin/wine kuincl.exe -i $PWD/../src/compiler/main.kn -o $PWD/output/kuin.exe -s $PWD/sys -e cui
# Compile latest kuin using latest kuin.exe
/Applications/EasyWine64.app/Contents/Resources/wine/bin/wine output/kuin.exe -i $PWD/../src/compiler/main.kn -o $PWD/output/kuin_cpp -s $PWD/../src/sys/ -e cpp
# Compile C++
g++ -std=c++11 -O2 -o kuin output/kuin_cpp.cpp
# Build some file
./kuin -i src.kn -o $PWD/output -s $PWD/../src/sys/ -e cpp
g++ -std=c++11 -O2 output.cpp
```

## Result

- https://github.com/cielavenir/procon/blob/4c3f5090f8eaf12a1fc1837a2505905a9f5d342c/tyama_icpc2007dA.kn

```bash
./a.out < ~/procon/icpc2007dA
504
473
518
638
507
538
```

## Conclusion

We were able to generate kuin binary for Linux/macOS. Moreover, I was able to find some issues successfully. However as they say "[it is beta](http://kuina.ch/kuin/web)", it might be still difficult to adopt this to yukicoder or atcoder...
【Linux】バージョン確認コマンドまとめ

各種Middlewareのバージョン確認コマンドのまとめです。

# Centosバージョン確認

```
cat /etc/centos-release
```

# Apacheのバージョン確認（CentOS7系）

```
apachectl -v
```

# Apacheのバージョン確認（CentOS6以前）

```
httpd -v
```

# SSLのバージョン確認

```
openssl version
```

# PHPのバージョン確認

```
php -v
```

# Laravelのバージョン確認

```
php artisan -V
```

# Cakephpのバージョン確認

```
bin/cake version
```

# Gitのバージョン確認

```
git --version
```

# postgressのバージョン確認

```
postconf | grep mail_version
```

# mysqlのバージョン確認

```
mysql --version
```

# npmのバージョン確認

```
npm -v
```

# nodeのバージョン確認

```
node -v
```
【Python】マルチプロセス(multiprocessing)時の値の受け渡し

Pythonマルチプロセス間で変数を受け渡しするときに値が渡せなかったのでメモを残す

# 実装
４つの関数(f1,f2,f3,f4)を定義し、各関数を別プロセスで実行する。各関数では値の追加(append)を行い、最後メインプロセスから追加された値を確認する。

### NG  

変数を格納するために定義したtestlistは、メインプロセスにのみ存在するメモリ空間のため,  別プロセスからは参照更新が不可能な様子

- プログラム  

```Python
from multiprocessing import Process
from multiprocessing import Manager

testlist=[]
def f1():
    #print("function f1")
    testlist.append("f1")

def f2():
    #print("function f2")
    testlist.append("f2")

def f3():
    #print("function f3")
    testlist.append("f3")

def f4():
    #print("function f4")
    testlist.append("f4")

if __name__ == '__main__':
    for i in (0,1,2):
        p1 = Process(target=f1, args=())
        p1.start()
        p2 = Process(target=f2, args=())
        p2.start()
        p3 = Process(target=f3, args=())
        p3.start()
        p4 = Process(target=f4, args=())
        p4.start()

        p1.join()
        p2.join()
        p3.join()
        p4.join()
        p1.terminate()
        p2.terminate()
        p3.terminate()
        p4.terminate()
    print("")
    print("result: ",testlist)
```

- 結果

```
result:  []
```


### OK

Managerを使用して、変数を受け渡す。listを引数に設定しプロセス間でデータを受け渡す。 これによって各関数より値を更新したうえで、メインプロセスから確認することが可能。

- プログラム  

```Python  
from multiprocessing import Process
from multiprocessing import Manager

def f1(dummy,testlist,num):
    #print("function f1")
    testlist.append("f1")

def f2(dummy,testlist,num):
    #print("function f2")
    testlist.append("f2")

def f3(dummy,testlist,num):
    #print("function f3")
    testlist.append("f3")

def f4(dummy,testlist,num):
    #print("function f4")
    testlist.append("f4")


if __name__ == '__main__':

    alllist=[]
    with Manager() as manager:
        for i in (0,1,2):
            d=manager.dict()
            l=manager.list([])
            p1 = Process(target=f1, args=(d,l,4*i+0))
            p1.start()
            p2 = Process(target=f2, args=(d,l,4*i+1))
            p2.start()
            p3 = Process(target=f3, args=(d,l,4*i+2))
            p3.start()
            p4 = Process(target=f4, args=(d,l,4*i+3))
            p4.start()


            p1.join()
            p2.join()
            p3.join()
            p4.join()
            p1.terminate()
            p2.terminate()
            p3.terminate()
            p4.terminate()
            alllist.extend(l)
    print("")
    print("result: ",alllist)
```  

-  結果  

```
result:  ['f1', 'f2', 'f3', 'f4', 'f1', 'f2', 'f3', 'f4', 'f1', 'f2', 'f3', 'f4']
```
【Linux】ユーザー / グループのコマンドまとめ

ユーザーや、グループ系の操作は頻繁にやるものでもなく、つい忘れてしまうのでまとめておきます。


# ユーザー関連のコマンド

## ユーザー 一覧確認

```
cat /etc/passwd
### 実行結果 ############
user_name1:1001:1001::/home/user_name1:/bin/bash
user_name2:x:1002:1002::/home/user_name2:/bin/bash
```

## ユーザー作成

```
useradd {user_name}
```

## ユーザー削除

```
userdel {user_name}
```

# グループ関連のコマンド

## グループ一覧確認

```
cat /etc/group
### 実行結果 ############
root:x:0:
〜〜 省略 〜〜
group_name1:x:1003:user_name1,user_name2
group_name2:x:1004:user_name1
```

## グループ作成

```
groupadd {group_name}
```

## グループ削除

```
groupdel {group_name}
```

## グループに所属しているユーザー確認

```
getent group {group_name}
### 実行結果 ############
group_name1:x:1003:user_name1,user_name2
```

## ユーザーが所属しているグループ確認

```
groups {user_name}
# 実行結果
user_name1 : user_name1 group_name1 group_name2
```

UID, GIDも知りたい場合

```
id {user_name}
### 実行結果 ############
uid=1001(user_name1) gid=1001(user_name1) groups=1001(user_name1),1003(group_name1),1004(group_name2)
```

`gid=` ... Primary group
`groups=` ... 1つ目はPrimary group、以降はSecondary group

## プライマリーグループ変更

```
usermod -g {group_name} {user_name}
```

## その他（セカンダリ以降）の所属グループ変更 / 複数追加
**※※注意※※**
`-G` オプションは既存の所属グループを**無視して上書き**します。
既存グループを残しつつグループ追加したい場合は、**既存グループも一緒に指定**する必要があります。
既存の所属グループは `id {user_name}` で確認できます。

```
usermod -G {group_name} {user_name}
```

複数指定する場合は、 `,(カンマ)` 区切りで指定します

```
usermod -G {group_name1},{group_name2} {user_name}
```

## その他（セカンダリ以降）の所属グループ削除

`-G` オプションの既存の所属グループを**無視して上書き**する特性を利用します。
既存の所属グループを `id {user_name}` で確認し、削除したいグループを除外して指定します。

```
usermod -G {group_name1},{group_name2} {user_name}
```
【JavaScript】連想配列を使うくらいならMapやSetを使う

# 概要
- Vuforiaに触れる機会があって、久々にJSを弄り回していたら、かつて不便だった箇所が便利になっていたのでメモる
- サンプルは動作を見せる為に【jsfiddle】というサイトに書いたのでリンクを貼っておく

## 不便だったやつ
- Key-Value型のデータを持つときに連想配列を使っていたが…
    - 不純物入りオブジェクトを```for (～ in ～)```で展開しようとして数が合わなくて、Object.keys(連想配列)とかしないといけないとか
    - 実は純粋な配列ではないらしくて```for (～ of ～)``` 使えないとか
    - lengthを取ったら、長さ0で衝撃を受けたとか
- データが重複をしない配列が欲しい時に、連想配列のKeyを駆使するか、ただの配列から重複を取り除く処理をしていた（重複データを持っていないとダメな場合は、素直にfilterとかで弾くしかないと思うけど…）

## リファレンス
- Map
    - https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map/prototype
- Set
    - https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set
    - IEだけ対応が怪しいので注意

# サンプル
## Key-Value型データの保持にMapを使う（[jsfiddleへ](https://jsfiddle.net/mahny/cb9kef2z/34/)）
```javascript
let datas = new Map();
for (let i = 0; i < 3; i++) {
  let key = 'key' + i;
  let data = {
    name: 'name' + i,
    value: 'value' + i
  }
  datas.set(key, data);
}

// ----- 出力例 -----
// entities()は、Key-Valueを配列で返してくれる。
console.log('★entries()で出力');
for (let [k, v] of datas.entries()) {
  console.log(k + ' = ' + JSON.stringify(v));
}

// keys()は、Keyだけの配列を介してくれる
console.log('★keys()で出力');
for (let k of datas.keys()) {
  console.log(k + ' = ' + JSON.stringify(datas.get(k)));
}

// values()は、valueだけの配列を介してくれる。Keyは取れない
console.log('★values()で出力');
for (let v of datas.values()) {
  console.log(JSON.stringify(v));
}
```

## 重複しないデータの保持にSetを使う（[jsfiddleへ](https://jsfiddle.net/mahny/cb9kef2z/30/)）
```javascript
let dataSet = new Set();
dataSet.add('hoge');
dataSet.add('fuga');
dataSet.add('hoge');

// ----- 出力 -----
console.log('★forEach()で出力')
dataSet.forEach(k => {
  console.log(k);
});

console.log('★for (～ of ～)で出力')
for (let k of dataSet) {
  console.log(k);
}
```
GitHub で自分に割り当てられているレビュー依頼を一覧表示する方法が発見された件

# 方法

[GitHub](https://github.com/) にログインした状態で https://github.com/pulls/review-requested にアクセス（ヘッダーの [Pull requests](https://github.com/pulls) をクリックして [Review requests] を選択）する。

<img width="1357" alt="スクリーンショット 2020-02-02 23.38.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6881/3626c88a-4100-179c-8018-2dfdf2cb8f2d.png">

Reviewers に自分が含まれている Pull request を絞り込むことができます :smiley:
大人数で開発を行っている場合など探す手間が省けて大変便利です :qiitan:
Salesforce開発者コンソールからのオブジェクト定義表示

#Salesforce開発者コンソールからのオブジェクト定義表示

- よくある形式でオブジェクト定義が参照したい
- Salesforce標準のページだと外部IDなどがわかりにくい（カスタムオブジェクト定義では画面遷移が面倒）
    - 外部IDはDataTypeに表示されます

```
SELECT QualifiedApiName, Label, Length, DataType, IsNillable, IsIndexed FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = '標準 or カスタムオブジェクト名(API参照名)'
```

例えばユーザ（User）の場合、以下のように見える
![pic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578319/5bd9a6ee-5c04-5350-9658-411378b5ad57.png)
オープンソースのBIMserverを使ってみた

#はじめに
近年、建築業界ではBIMモデルデータをクラウドで管理するサービスが広まってきています。
そういったサービスを実現する技術をもつサーバーソフトウェアの一つに、BIMserverというオープンソースのソフトウェアあります。
localhostで手軽にサーバーを立ち上げることができるので使ってみました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/92255519-efc7-4612-5013-a1e77a340e6f.png">

#BIMserverとは
BIMserverとは、BIMserver.orgが開発するオープンソースのIFCモデルサーバーです。BIMserverを使うことで、IFCモデルデータを管理、他の人と共有することができます。
BIMserver自体はビューア機能は持っていないのですが、今回は、BIMvie.wsプラグインのGUI、ビューア機能を使うことで、IFCの建物モデルを確認することができます。

#IFCファイルを用意する
まずBIMserverに登録するIFCファイルを用意する必要があります。
今回はbuildingSMART関連のサイトからIFCファイルを入手しました。
そのサイトには、たくさんリンクがあり、どれがいいのかよくわからなかったのですが、「2011-09-14-Clinic IFC 2x3 Coordination MVD」というファイルを選びました。それを選んだ理由は、意匠、構造、設備のデータが揃っていたからです。

[buildingSMART alliance Common Building Information Model Files and Tools](https://www.nibs.org/page/bsa_commonbimfiles)


#BIMserverを起動する
1. [BIMserverのGitHubダウンロードページ](https://github.com/opensourceBIM/BIMserver/wiki/Download)からJARファイルをダウンロードし、*”bimserver”*など適当なフォルダを作って配置する。
2. JARファイルを開き、スターター画面を開く。
3. スターター画面にて、今回、設定値はデフォルトのままで[Start]を押しサーバーを起動する。<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/4c011550-0cef-bc62-b842-f27c006f54b7.png">
4. 処理が完了すると[Server start successfully]というメッセージが表示されるので、次にスターター画面の[Launch Webbrower]を押すと、ブラウザが開きウィザード画面が表示される。
5. ウィザード画面の[Admin Account]では、ユーザー名（メールアドレス形式）、パスワードを設定する。
7. ウィザード画面の[Finish]で、[Setup]を押しセットアップを開始する。<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/7fdf8329-26c1-ee0b-220b-8f0b3c9e4ec0.png">
8. 処理が終了すると、[Open BIMvie.ws]というメッセージが表示されるので、クリックしBIMvie.wsを開く。ウィザード画面で設定したユーザー名とパスワードを入力し、[Sign in]を押す。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/f9d4e9c9-4903-4ef4-9fec-5499ee5175a4.png">

#BIMvie.wsでIFCファイルを開く
1. [Project]メニューの[New project]からプロジェクトを作成する。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/cda2e833-8a16-0133-94d5-914ebff35e16.png">
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/9febf12d-fafc-5b59-b66c-424ff0aee9f8.png">
2. プロジェクトのメニューの[Add sub project]から、IFCファイルごとにサブプロジェクトを作成する。今回、意匠のサブプロジェクトは[ARC]という名前にした。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/e1e78964-b16c-5bd9-ca41-1d8a6148aa61.png">
3. 先ほど作成したサブプロジェクトのメニューの[Checkin...]から、IFCファイルを登録する。今回は、先ほど用意したIFCファイルの中から意匠データ[Clinic_A_20110906_optimized.ifc]を選んだ。その後、構造データ、設備データも同様にサブプロジェクトを作成し追加する。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/7efd4a84-b3ee-f34d-1a8e-52780f7a5490.png">
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/bf4e3f73-a56c-83ae-3ffe-81d464941536.png">
4. 3Dモデルが何も見えない場合は、目のアイコンをクリックすることで、オブジェクトの可視性を制御できる。また、[Properties]にて、選択したオブジェクトのプロパティを確認できる。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/f537c985-c3f1-855e-50b1-ae17963f2327.png">

#参考
[https://github.com/opensourceBIM/BIMserver/wiki](https://github.com/opensourceBIM/BIMserver/wiki)
Fedora CoreOSでDockerコンテナのdocker-composeを使う

# 環境

AWS EC2
Fedora CoreOS 31.20200127.2.0

# Docker設定

```
# Dockerの自動起動有効
$ sudo systemctl enable docker

# ログインしているユーザーがdockerグループの追加されているか確認
# デフォルトでは設定されていない
$ cat /etc/group | grep docker

docker:x:982:

# ログインしているユーザーをdockerグループに追加
$ sudo usermod -a -G docker $USER

# 確認コマンド
$ cat /etc/group | grep docker

docker:x:993:core

# ログアウト
# exit

# 再ログイン
```

# Dockerコンテナのdocker-compose設定

```
$ vi ~/.bashrc 

alias docker-compose='docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:/$PWD" \
    -w="/$PWD" \
    docker/compose:1.25.4'
    
$ source ~/.bashrc

$ docker pull docker/compose:1.25.4

$ docker-compose -v

docker-compose version 1.25.4, build 8d51620
```

[docker/compose](https://hub.docker.com/r/docker/compose)
中卒２４歳のプログラミング学習　アウトプット

本日の学習内容
---
##1.permission(ファイルやフォルダのアクセス権)##
###permissionには3つの権限がある
・読み取り権限(r)
・書き込み権限(w)
・実行権限(x)

##2.sudo(スーパーユーザー)##
コンピューターに命令するコマンドの一つで、スーパーユーザー(他のユーザー)の権限でコマンドを実行する時に使うコマンド、、、らしいです。。笑

##3.virtualenv##
virtualenvとは、一つのシステムの中に分離されたPythonの仮想環境を作ることができるソフトウェアで、コマンドで仮想環境を作ったり、仮想環境に出入りすることができるものらしい。

#本日のエラー集#
##・ec2-user:~/environment $ pip3 install requests requests_oatuhlib bash: pip3: command not found
上記の対応・pip installでやってみたらインストールできた。

##・$ pip install reqests reqests Collecting reqests Could not find a version that satisfies the requirement reqests (from versions: ) No matching distribution found for reqests
上記の対応・単純にrequestのスペルミス、、、

#最後に#
今はTechpitというサイトのpythonでメンヘラ判定器を作ってみようっていう教材を買ってやってますが、なんとなーくの理解で、時間かかりながらも地道に進んでいます。。
実際にコードを書いていって物を作るっていうのは楽しいですねっ
一番プログラミングを勉強していて思うのは、エラー等が出て詰まってたところが解決したときのあの快感ですね。。笑
そんなこんなしながらこれからも地道に頑張っていきます。
本日の曜日を取得する方法

#曜日を取得する方法

###曜日

    String[] weekName = {"日曜日", "月曜日", "火曜日", "水曜日",
            "木曜日", "金曜日", "土曜日"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Calendar calendar = Calendar.getInstance();

        int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        Log.v("checkCalendor"," + " + weekName[week]);

    }

###その他の情報の取得方法

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DATE);
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    int second = calendar.get(Calendar.SECOND);
    int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
[Python]SVMでアヤメの種類を判別する

初心者向けのレクチャーによく使われるirisデータを使って、機械学習の分類問題にトライしてみます。


#使用するデータ
ireiデータ。（irisは「アヤメ」の花を意味。）
アヤメの品種のSetosa Versicolor Virginicaの3品種に関するデータ。
全部で150件のデータセット。

#データセットの内容
Sepal Length：がく片の長さ
Sepal Width：がく片の幅
Petal Length：花びらの長さ
Petal Width：花びらの幅
Name：アヤメの品種データ（Iris-Setosa、Iris-Vesicolor、Iris-Virginicaの3種類）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269450/924a3fec-779f-850e-97f7-9e90b5d7bf2b.png)

#採用するモデル
SVM（サポートベクターマシン）。
SVMは教師あり学習の分類問題に適している。
スパム判別器なども作ることが可能なモデル。
教師あり学習なので、特徴量データと目的変数が必要。

#全体の流れ
1）データの下準備
2）データを可視化
3）モデルを学習・評価

#実践
##1）データの下準備
まずは、必要なライブラリをインポートした後、データを取り込み確認。

```
import numpy  as np
import pandas as pd
import seaborn as sns
sns.set_style("whitegrid")
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.model_selection import train_test_split, cross_validate

df = pd.read_csv("iris.csv")
df.head()

	SepalLength	SepalWidth	PetalLength	PetalWidth	Name
0	5.1	3.5	1.4	0.2	Iris-setosa
1	4.9	3.0	1.4	0.2	Iris-setosa
2	4.7	3.2	1.3	0.2	Iris-setosa
3	4.6	3.1	1.5	0.2	Iris-setosa
4	5.0	3.6	1.4	0.2	Iris-setosa
```
訓練データとテストデータに分割する。

```
X = df[["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
y = df["Name"]

X_train, X_test, y_train, y_test = train_test_split(X, y)
X_train.shape, X_test.shape

((112, 4), (38, 4)) #分割後の行列数確認
```
訓練データとテストデータそれぞれでDataframeを作成。

```
data_train = pd.DataFrame(X_train)
data_train["Name"] = y_train
```

##2）データを可視化

検証データでは、実際にアヤメの種類と獲得超量にどんな関係があるのか？
プロットして、種類ごとに特徴量に違いがあるのか確認してみる。

```
sns.pairplot(data_train, hue='Name', palette="husl")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269450/43205a3a-1981-ad86-f9a3-d14a656ec628.png)


```
たしかにアヤメの種類によって、各特徴量に明確に差があるように見える。

##3）モデルを学習・評価

実際にSVMに検証データを入れて、モデルをつくってみる。

```
X_train = data_train[["SepalLength", "SepalWidth","PetalLength"]].values
y_train = data_train["Name"].values

from sklearn import svm,metrics

clf = svm.SVC()
clf.fit(X_train,y_train)
```
作成したモデルにテストデータを入力。

```
pre = clf.predict(X_test)
```

モデルを評価する。

```
ac_score = metrics.accuracy_score(y_test,pre)
print("正解率=", ac_score)

正解率= 0.9736842105263158
```

テストデータとモデルによって得られた結果が97%一致していることが確認できた。
石井食品の攻守両輪：デザインスプリントとカイゼン に参加してみて

# はじめに
[石井食品の攻守両輪：デザインスプリントとカイゼン](https://devlove.doorkeeper.jp/events/102027) に参加しました。
<img width="899" alt="スクリーンショット 2020-02-02 23.06.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/f46e4415-c90f-0bee-c201-eff0a8f02149.png">

自分は石井食品知らなかったのですが、同僚曰く有名とのことです...
(多分、ミートボールは昔食べたことあると思うのですが...)

カイゼンジャーニーに感銘を受け([感想文](https://qiita.com/shinya-tk/items/150929971dd57277b9ef))、
今後アジャイルやスクラムを活用してユーザーの成長に貢献できる
ビジネスを始めていきたいという思いもあり参加してみました。

# 「見える化/ふりかえり/バックログ化/期待マネジメントでカイゼンした話」
https://t.co/Xfrg39i7qL?amp=1
<img width="911" alt="スクリーンショット 2020-02-03 22.18.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/4edbeba6-d736-31fe-4d10-b79b949c834a.png">

一番印象に残ったのは、石井食品のリーダーさんの悩みがほぼ同じだったことです...(涙)
「業界関係なく悩みは同じ・課題は同じ、他業種でも社員のチカラでカイゼンできる」という
新井さんの言葉が身に染みました..

また、新井さんが言っていた、以下の内容も残りました。
これが、今後PJをリードするために身に着けるスキルだと思いました。
（個人レベルではできていることもありますが、組織をリードするためのスキルにレベルアップする）
「決してアジャイルを導入したいわけではない。現場の課題解決が最優先。
プラクティスが上手になることよりも、プラクティスの要素を活用する。どうするかを一緒に考える。
でも、アジャイルでやってきたことは活きる。」

- 問題の分割
- 小さく繰り返す
- ふりかえる
- 見えるかする
- ファシリテート
- SMとしてのサーバントリーダーシップ
- 期待マネジメント・チームビルディング

# イシイスプリント（デザインスプリント）で新商品開発した話
https://t.co/DfMSwzZX6J?amp=1

<img width="629" alt="スクリーンショット 2020-02-03 0.01.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/8ed9cbef-5ec1-410f-63c8-c66a3964cba4.png">

「美味しいものをつくるよりも、問題解決をする」が強力に心に残りました。
ITのPJで言うと、「PJの成功よりも、問題解決をする」って感じでしょうか。
美味しいは前提で、そこを突き詰めても難しい（人の味覚もあるし、限界はあるし）
あと、保存のきく食品の場合は温めて封を切った時から美味しいのが大事とのこと。

# まとめ
![スクラムの本](https://images-fe.ssl-images-amazon.com/images/I/41Qq2oRSI1L.jpg)

この本にも書いてありましたが、スクラムはIT業界のPJのためのフレームワークではなく、
あらゆる場所に適応できるフレームワークだという実態をみれました。
ITエンジニアとしてプロダクトを通じたカイゼンから一歩先のユーザーの成長に付き合える可能性を感じれました。
垂直方向の位置揃え

インデントと垂直方向の位置揃えについて、使い方を誤ると辛いことになるので注意したい。
サンプルはjsだけど言語によって変わるものでもないのでなんのタグつければいいかわからん:confounded:

# 要約

垂直方向の位置揃えをするなら半角スペース！！！！

# 表現の定義

正式な名称がわからないのでここで使う表現について以下のように定義しておく。

### インデント

字下げ。`{}`や`()`などで囲まれた間の行について空白やタブで1段下げること。

<details>
<summary>例：インデント</summary>
<div>

```js
function fnNankaShutokusuruKansu(param) {
    return 'なんか' + param + 'が渡された';
}
```

</div>
</details>

### 垂直方向の位置揃え

The Art of Readable Codeだと`column alignment`と呼ばれているやつ。
類似処理が連続するコードにについて、違いのある部分がわかりやすいよう、同じ部分は同じ位置に書くこと。
なんかスマートな呼び方あるんだろうか……:thinking:
垂直方向の位置揃えを行うかどうかも好みが分かれる。

<details>
<summary>例：垂直方向の位置揃え</summary>
<div>

```js:垂直方向の位置揃えなし
const hoge1 = fnNankaShutokusuruKansu('hoge');
const hensu1 = fnNankaShutokusuruKansu('piyo');
const chottonagaihensu1 = fnNankaShutokusuruKansu('chottonagaihensu');
const foo1 = fnNankaShutokusuruKansu('bar');
const bar1 = fnNankaShutokusuruKansu('bar');
```

```js:垂直方向の位置揃えあり
// "="の位置を揃えることでパラメタ以外同じfnNankaShutokusuruKansuを呼び出していることがわかりやすい
const hoge2             = fnNankaShutokusuruKansu('hoge');
const piyo2             = fnNankaShutokusuruKansu('piyo');
const chottonagaihensu2 = fnNankaShutokusuruKansu('chottonagaihensu');
const foo2              = fnNankaShutokusuruKansu('foo');
const bar2              = fnNankaShutokusuruKansu('bar');
```

</div>
</details>


# よくある間違い

インデントにタブ文字を使用しているコードで、垂直方向の位置揃えにもタブを使っている。

```js:タブ文字を幅4で表示しながら垂直方向の位置揃えをした
function main() {
	const hoge				= fnNankaShutokusuruKansu('hoge');
	const piyo				= fnNankaShutokusuruKansu('piyo');
	const chottonagaihensu	= fnNankaShutokusuruKansu('chottonagaihensu');
	const foo				= fnNankaShutokusuruKansu('foo');
	const bar				= fnNankaShutokusuruKansu('bar');
}
```

コードブロック内でタブ文字使ってもスペースに置換されるんですね:confounded:

垂直方向の位置揃えにもタブを使うと、タブのメリットである「見る人の好みのサイズでインデントできる」というメリットが死ぬ。
垂直方向の位置揃えをした人のダブサイズに合わせないと崩れる。

<details>
<summary>タブ幅を変えた場合のイメージ</summary>
<div>
幅2のタブ:sweat_smile:
![幅2のタブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64415/2ef09639-12ef-03c0-1f27-23ec932a5efa.png)
幅4のタブ:smile:
![幅4のタブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64415/519ff663-ee3d-fb20-9568-7cd6298e9a82.png)
幅8のタブ:sweat_smile:
![幅8のタブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64415/11075981-693b-3ac4-acc0-31139c0c4a55.png)
</div>
</details>

## 悩ましいところ

長くなるif文やパラメタの多い関数の途中で改行したくなったときのこれはインデントなのか垂直方向の位置揃えなのか。
1段下げることが目的ではなく垂直方向を揃えることが目的なので、垂直方向の位置揃えだと思っている。

```js
if (hoge === 1 && piyo === 1 ||
    foo  === 2 && bar  === 2) { // ここのfooの位置とか
    fnParametaOoiKansu(param1, param2, param3,
                       param4, param5); // ここのparam4の位置とか
}
```


# 結論

インデントに半角スペースを使うかタブを使うかはチームで決めればいいが、どちらをちゅかう場合でも垂直方向の位置揃えをするなら半角スペースを使う。
Azure CLIで操作する（SQL Database編）

## Azure CLIを利用してスケールアップ/ダウン、スケールアウト/インさせる。
### Azure CLIとは
Windows、MacOS、Linuxなどクロスプラットフォームで利用出来るAzureをコマンドラインで操作出来るツールです。
ダウロードは下記のページから
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest

1. Azureにログイン
az login
ログインするとサブスクリプションIDなどの情報が表示されます。
※プロキシサーバがある環境では、必要に応じてプロキシを環境変数に設定して下さい。
一時的な場合は、下記のコマンドを入力
set HTTP_PROXY=http://username:password@proxy.contoso.com:8000
set HTTPS_PROXY=http://username:password@proxy.contoso.com:800

2. Azure CLIのバージョンを確認する。
az --version
![cli2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/86d0fd67-bb3d-b67d-c0e3-7de7c4c0aed7.png)

3. 現状のプランサイズを確認する。
az sql db show -n "データベース名" -g リソースグループ名 -s SQLサーバ名 --query "sku"
![db1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/6ef43981-c756-4685-57e4-afb3c46422da.png)

4. SQLデータベースをスケールアップさせる。
az sql db update -g リソースグループ名 -s SQLサーバ名 -n データベース名 --edition Standard --service-objective S2 --max-size 250GB
--edition Standard --service-objective S2 --max-size 250GBは、料金プランと付属ストレージの最大サイズを指定します。
※SKUのサイズを選択することでスケールアップ、スケールダウンになります。
　選択出来るサイズは下記のページから確認して下さい。
　https://azure.microsoft.com/ja-jp/pricing/details/sql-database/single/
![db2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/5847d949-505e-369f-4a7b-995da2964b3f.png)
![db4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/fa1a0ba3-f12f-b7de-cf96-79a16733fa93.png)

5. スケールアップされたことを確認する。
az sql db show -n "データベース名" -g リソースグループ名 -s SQLサーバ名 --query "sku"
![db3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/74d7fc29-2bf1-b9f5-adcc-867401dabeb5.png)
Azure CLI、Portalともにスケールダウンされたことを確認出来る。

6. スケールダウンさせる。
az sql db update -g リソースグループ名 -s SQLサーバ名 -n データベース名 --edition Standard --service-objective S1 --max-size 250GB
--edition Standard --service-objective S1 --max-size 250GBは、料金プランと付属ストレージの最大サイズを指定します。
![db4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/8d23dca8-fd30-22dd-1619-e27359dec0cf.png)
※プランの変更次第では利用できるストレージサイズも縮小されるので利用しているストレージ容量に気をつけてスケールダウンを実施する必要があります。
選択出来るサイズと付属ストレージサイズは下記のページから確認して下さい。
https://azure.microsoft.com/ja-jp/pricing/details/sql-database/single/

7. スケールダウンされたことを確認する。
az sql db show -n "データベース名" -g リソースグループ名 -s SQLサーバ名 --query "sku"
![db5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/7e11dde3-f8a7-8791-e8ff-161cf6bd2805.png)
Azure CLI、Portalともにスケールダウンされたことを確認出来る。
SQLBoilerでMySQLのDATETIME型使おうとしたらハマった

#はじめに結論
SQLBoilerとMySQLドライバ(go-sql-driver/mysql)の使い方でハマりました・・・。
結論から先に言いますと、DB接続する際以下に示すようにDSNに**parseTime=true**
っていうパラメータを付与してあげてください。

```go

db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3300)/todos?parseTime=true")
```

# 前提
## 環境
- Windows10
- Go  v1.13.7
- Gin v1.5.0
- SQLBoiler v3
- MySQL 8.0.18

## ソース
https://github.com/stern118/gin-todo

## DB
```sql

CREATE TABLE `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `task_name` varchar(45) NOT NULL,
  `status` int(11) NOT NULL,
  `created_by` varchar(45) NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
```

#やろうとしたこと
DBからデータを取ってきてブラウザに表示しようとしただけです。
Golangやりたいなと思ったので試しにtodoリストを作ってました。

#発生した問題
以下のようなエラーが出て困りました。
>failed to assign all query results to Task slice: failed to bind pointers to obj: sql: Scan error on column index 4, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time

MySQLのDATETIME型のカラムを、SQLBoilerが自動生成してくれた構造体のtime.Time型のフィールドに読み込もうとして失敗しました。

#原因
> https://github.com/go-sql-driver/mysql#timetime-support

上記リンクによると、MySQLのDATEとDATETIMEはGoで出力するとデフォルトは[]byteになるよって書いてあります。よく読んでない私がダメでしたね(´；ω；`)

#解決策
前段のリンクから、
DSNのパラメータにparseTime=trueを付与すると、time.Time型で扱えるとあります。
また、locパラメータでロケーションも設定できるみたいです。
githubとSlackを連携してcommit、push時にSlackに通知する方法

基本的なpushなどの通知通知のみ
```/github subscribe アカウント名/リポジトリ名```

細かい通知の追加設定（PRのreviewやissueのcommentsも通知されます。）
```/github subscribe アカウント名/リポジトリ名 reviews,comments```
Javaのシステムプロパティの記載順について

定期的に毎回悩んで、思い出しているのでメモしておきます。
Javaのコマンドに付けてメモリの確保量などを定義する「システムプロパティ」
ですが記載順によってクラスから参照できる／できないが明確になっています。

**環境**

```
$java -version
java version "1.8.0_131"
```

**サンプルクラス**
「kusatest」というシステムプロパティをクラスから参照して出力します

```java:Test.java
import java.util.*;

public class Test {
    public static void main(String[] args) {
        System.out.println("start");
        System.out.println(System.getProperty("kusatest"));
        System.out.println("end");
    }
}
```

**参照できる例**

```sh
$ java -Dkusatest=a Test
start
a
end
```

**参照できない例**

```sh
$ java Test -Dkusatest=a
start
null
end
```

自分はクラス/Jarを書いてプロパティを後から書くので間違いがちでした。
毎回忘れて数時間無駄にするので、もう忘れないようにしたい。
Object Browser In PowerShellを見つけた話

# 初めに

Poswershellで少し凝ったことをしたくなった場合、**CUIに表示された文字列の実態はオブジェクトである**と認識することはとても重要です。

>PowerShell は、**.NET 上に構築された**タスクベースのコマンド ライン シェルおよびスクリプト言語です。 PowerShell は、システム管理者およびパワー ユーザーが、オペレーティング システム (Linux、macOS、および Windows) とプロセスを管理するタスクを迅速に自動化するのに役立ちます。
[PowerShell スクリプト - PowerShell | Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/overview?view=powershell-7)

最近、その助けになるであろうスクリプトが公開されていることを知りました。
Powershell版ObjectBrowserです。ここからダウンロードできます。
[PowerShell Object Browser](https://gallery.technet.microsoft.com/PowerShell-Object-Browser-847d62c1)

解説はこちら
[How to Create and Use an Object Browser In PowerShell](https://social.technet.microsoft.com/wiki/contents/articles/28651.how-to-create-and-use-an-object-browser-in-powershell.aspx)

# 使い方

## スクリプトを開いたpowershellプロセスで使えるクラスを表示

![操作a](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/027c902e-0f3a-84fe-388f-31642390994f.jpeg)

![操作A.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/5b481c77-a8c5-a14e-531d-ba39d9bf2ac4.gif)

色んなことがわかりますが、特にValuesタブ最終行の`UnderlyingSystemType`がとても助かります……

## 任意のObjectを表示

![操作1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/81428a19-b351-15a3-a1da-43aeaa19421a.gif)
![操作2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/c04b144a-807e-4107-127c-7497f5bc5f83.gif)

調べたいObjectがある時はPowershellタブから追加できます。
`Add-Node [Object]$Object [String]$Name`
`Remove-Node [Object]$Node`

### 応用:コマンド結果の比較

![操作i.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/ec4fbb5a-0311-5b93-3b1b-4adbf796cf82.gif)
![操作ii.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/82d70238-950a-6aa2-26dd-7d1e38f3dfe9.gif)
パイプライン処理の結果とコレクションメソッド処理の結果を比較しています。

# 何に使うの?

VScodeのデバッグ機能や、`gm -InputObject $Foo -Force | Out-GridView`だと、深い階層の情報を調べるのはなかなかメンドクサイです……
そんな時にお世話になっています。
![応用.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/9cb6585b-da8a-e525-646f-6ff4b3b6b558.jpeg)

たとえば、Nugetからダウンロードしてきたライブラリの使いかたを調べる助けになったりしてます。

# Powershell 7で使うためには

Powershell7で動かすには L5260以降の`Generate-PSObjectExplorerForm`の修正が必要です。
参考 : [Windows フォームに関する破壊的変更 - .NET Core | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/winforms)

- `System.Windows.Forms.MainMenu` → `System.Windows.Forms.MenuStrip`
- `System.Windows.Forms.MenuItem` → `System.Windows.Forms.ToolStripMenuItem`
- `$MainMenu.MenuItems.Add` → `$MainMenu.Items.Add`
- `$mnuView.MenuItems.Add` → `$mnuView.DropDownItems.Add`
- L5821 `$Form.ShowDialog()| Out-Null` の前行に `$Form.Controls.Add($MainMenu)`を追加
  > // Add the MenuStrip last.
  > // This is important for correct placement in the z-order.
     [MenuStrip クラス (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.menustrip?view=netcore-3.1) コード例より

## 余談

- 起動する際、`Start-ThreadJob`を使うといい感じでした。
- 二次配布、GitHubの使い方とかそこらへんが疎いので勉強中です。
VSCodeでgit add -p を快適に行う

git add -p 便利ですよね。ファイルの変更箇所の一部だけをコミットしたいときによく使います。
ですが、自分はコマンドラインで git add -p する操作がどうにも慣れず、億劫に感じていました。
そこで Visual Studio Code の機能を使えばもっと直感的で快適に git add -p ができることを知りましたので紹介したいと思います。

## 動作イメージ
こんな感じで快適にできるよっていうイメージを伝えるためにgifを作ってみました。
このサンプルは3行の変更があるときに、git add -p を利用して「1行目をコミット」してから「2,3行目をコミット」する例です。

![gitaddp3_trimmed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48525/33e714d7-211a-ff9e-f233-61511f167f4d.gif)


git add -p する手順としては下記になります。

- addしたい箇所を選択する。
    - addする変更箇所が1行の場合はその行にカーソルがあればOK（↑の例でいう「1行目を変更」のコミットのやり方）
    - 複数行の場合はマウスとかで複数行を選択します（↑の例でいう「2,3行目を変更」のコミットのやり方）
- 設定したショートカットキー（後述）を押すと選択箇所だけがaddされる
    - 設定方法は後述しますが、設定したショートカットキーを押すだけでaddされます。便利！
- あとは普通にコミットするだけ

## 設定方法

設定方法を解説します。

#### Visual Studio Code のショートカットを設定する画面を開く
まず、`Cmd-Shift-p` を押してコマンドパレットを開いて、`shortcut`と打つと、「キーボードショートカットを開く」という候補が補完されるので開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48525/db7e0546-7701-4e1f-2ab5-26cb1c8ba005.png)

#### 「選択した範囲をステージする」コマンドにショートカットを割り当てる
`git.stageSelectedRanges`と入力すると「選択した範囲をステージする」コマンドが見つかります。
このコマンドを実行すると選択範囲をaddできます。
何も設定していないとキーバインドが空になっています。空になっているところをクリックするとキーバインドを入力するポップアップが出てくるのでそこで自分の好きなキーバインドを入力してください。あとはEnterを押せば設定完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48525/778ee1c2-beef-cd04-9cb9-f304e2f68c74.png)

自分の場合は `Ctl-z` に割り当てています。（左手だけで楽に打てるので）
正しく設定されたら下記の感じの画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48525/acf8f737-92c8-9e9c-63f6-84c7779d2c3c.png)


#### 「選択した範囲をアンステージする」コマンドにショートカットを割り当てる
では今度は選択範囲をアンステージするコマンドにショートカットを割り当てます。間違えて add したのを取り消すときに使います。

基本は↑と同様ですが、今度は `git.unstageSelectedRanges` コマンドに対して割り当ててください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48525/a5817c79-a3a2-f7da-4383-ed8dcf924dc7.png)

自分の場合は `Ctl-x` に割り当てています。（同じく左手だけで楽に打てるので）
正しく設定されたら下記の感じの画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48525/84c736d3-8fab-e666-c341-462049a40ab8.png)

以上になります。
もし良さそうだと感じたら、参考にしていただけると幸いです。
Twitterの面白そうな問題解いてみた

◇　　　　◇　　　　◇
ーー　＋　 ーー　＋　ーー ＝ 1
◇◇　　　◇◇　　　◇◇


上の式が成り立つように◇に１から９までの数字を１個ずつ入れてください。数字の重複は不可とする。

※解説必要でしたら後で追記します。

```
let num: number[] = [0, 0, 0, 0, 0, 0, 0, 0, 0];
let used: boolean[] = [
  false,
  false,
  false,
  false,
  false,
  false,
  false,
  false,
  false
];

gen(1);

function gen(in_num: any) {
  if (in_num > 9) {
    if (
      calculate(
        num[0],
        num[1],
        num[2],
        num[3],
        num[4],
        num[5],
        num[6],
        num[7],
        num[8]
      ) === 1
    ) {
      console.log(
        num[0] +
          " / (" +
          num[1] +
          num[2] +
          ") + " +
          num[3] +
          " / (" +
          num[4] +
          num[5] +
          ") + " +
          num[6] +
          " / (" +
          num[7] +
          num[8] +
          ") = 1"
      );
    }
  } else {
    for (let cnt = 0; cnt <= 9; cnt++) {
      if (used[cnt] == false) {
        used[cnt] = true;
        num[cnt] = in_num;
        gen(in_num + 1);
        used[cnt] = false;
      }
    }
  }
}

function calculate(
  parm1: number,
  parm2: number,
  parm3: number,
  parm4: number,
  parm5: number,
  parm6: number,
  parm7: number,
  parm8: number,
  parm9: number
): number {
  return (
    parm1 / (parm2 * 10 + parm3) +
    parm4 / (parm5 * 10 + parm6) +
    parm7 / (parm8 * 10 + parm9)
  );
}
```
web3.jsとは


web3.jsは、HTTPまたはIPC接続を使用して、ローカルまたはリモートのEthereumブロックチェーンのnodeとやりとりできるようにするライブラリのこと。

インストールにはnpmコマンドを使用する。

`npm install web3`

## 参考情報

公式ドキュメント
https://web3js.readthedocs.io/en/v1.2.6/
EditorConfigを使って、どんなエディタでも一貫したコードフォーマット

# EditorConfigとは

**プロジェクトごとのコードフォーマットを、簡単に統一させることができる設定ファイル**のことです。
設定ファイルがフォーマットを強制します。
そのため、下記のメリットがあります。

- 人によってインデントがタブになったりスペースになったり、といったことから解放されます。つまり複数人が関わるプロジェクトにも有効です。
- エディタ/IDEごとにフォーマットを環境設定から行うのは面倒です。EditorConfigはテキストファイルなので対応しているエディタであれば**他のエディタで開いてもルールが保持**されます。違うマシンのエディタで開いても、`.editorconfig`という名前のファイルさえ移しておけばOKです。
- ルールの作成が簡単です。
- 各エディタの環境設定で**1つ1つ設定する必要がありません**。
- 環境設定を操作しないので、**環境設定の方法を覚える必要がありません**。
- テキストファイルなので、Gitなどで**バージョン管理**ができます。
- プロジェクトのルートに`.editorconfig`という設定ファイルにルールを記述します。つまり、**各プロジェクトごとのルールを作成**できます。

# EditorConfigの使い方

```:.editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.{yml,json,scss,html,js,vue,blade.php}]
indent_size = 2
```

上記のように、コードフォーマットのルールを記載した`.editorconfig`というファイルをプロジェクトのルートディレクトリに保存します。
そうすることで、そのディレクトリ以下全てのファイルに設定が適用されます。
上記のファイルだと、

- 文字コードはUTF-8
- 改行コードはLF
- インデントはスペース4文字、ただしscss、html、jsなど特定の拡張子のファイルはスペース2文字

というルールになります。

`[]`の中身はファイルの適用範囲です。
ディレクトリやファイルを指定でき、ワイルドカードも使えます。
プロジェクト内全てのファイルに適用させることも、特定の拡張子に適用させることも可能です。
上記にはありませんが、特定のディレクトリだけに適用させることもできます。
各ルールは`プロパティ名 = 値`の形式で追記していきます。
一番上の行には`root = true`を必ず記述します。
プロジェクトのルートディレクトリであることを示します。

記述法は下記です。それほど多くのルールはありません。

## EditorConfigのパターン

| パターン | 意味 |
|:-----------------|:------------------|
| [*] | 全てのファイル |
| [*.php] | 全てのPHPファイル |
| [*.{css,html,js}] | 全てのCSS/HTML/JavaScriptファイル |
| [package.json] | package.jsonという名前のファイル |
| [config/*] | configディレクトリ内にある全てのファイル |

ワイルドカードそのものの意味は[EditorConfigの公式サイト](https://editorconfig.org/)に記載されています。

## EditorConfigのプロパティ

| プロパティ名 | 役割 | 値 |
|:-----------------|:------------------|:------------------|
| indent_style | インデントの種類 | space, tab |
| indent_size | インデントサイズ | 数値 |
| tab_width | タブ幅※インデントの種類をタブにしたときのみ | 数値 |
| end_of_line | 改行コードの種類 | lf, crlf, cr |
| charset | 文字コード | latin1, utf-8, utf-8-bom, utf-16be, utf-16le, etc... |
| trim_trailing_whitespace | 行末の空白を自動で取り除く | true, false |
| insert_final_newline | ファイルの最終行に空行を追記する | true, false |


# 対応しているエディタ

詳細は[EditorConfigの公式サイト](https://editorconfig.org/)に記載されています。

## プラグインなしで、インストールすれば利用可能

- BBEdit
- Code Crusader
- CodeLite
- elementary Code
- GNOME Builder
- GitHub
- GitBucket
- Gogs
- intelliJ
- KTextEditor
- Komodo
- Kakoune
- MonoDevelop
- PyCharm
- ReSharper
- Rider
- RubyMine
- sourcehut
- SourcLair
- TortoiseGit
- Visual Studio Professional
- WebStorm
- Working Copy

## プラグインをインストールすれば利用可能

- AppCode
- Atom
- Brackets
- CLion
- Coda
- Code::Block
- Eclipse
- Emacs
- Geany
- Gedit
- jEdit
- Lazarus
- Micro
- NetBeans
- Notepad++
- PHPStorm
- Sublime Text
- Textadept
- TextMate
- Vim
- Visual Studio Code
C++の自作クラスを持つvectorがresizeできない時は

# はじめに
C++を書いていてふとしたミスで悩んでしまったので、原因と解決策を記します。

# 状況
自作クラス`dim_3`を持つ`vector<dim_3>`を`resize()`しようとするが、コンパイルエラーが起こる。ソースコードは以下。

```cpp:main.cpp
#include <iostream>
#include <vector>
using namespace std;

class dim_3 {
	private:
		int x_;
		int y_;
		int z_;
	public:
		dim_3 (int x, int y, int z) : x_{x}, y_{y}, z_{z} {}
		inline void setX (int in) { x_ = in; }
		inline void setY (int in) { y_ = in; }
		inline void setZ (int in) { z_ = in; }
		inline int getX () const { return x_; }
		inline int getY () const { return y_; }
		inline int getZ () const { return z_; }
};

int main(){
	vector<dim_3> vc;
	vc.resize(10);
	cout << vc[4].getX() << " " << vc[4].getY() << " " << vc[4].getZ() << endl;
	return 0;
}
```

```plaintext:error
error: no matching constructor for initialization of 'dim_3'
```

`dim_3`を初期化するコンストラクタがないらしい。

[cplusplusの該当ページ](http://www.cplusplus.com/reference/vector/vector/resize/)には、

>val
Object whose content is copied to the added elements in case that n is greater than the current container size.
If not specified, the default constructor is used instead.
Member type value_type is the type of the elements in the container, defined in vector as an alias of the first template parameter (T).

と記述されており、`std::vector::resize`では値の指定がない時はデフォルトコンストラクターを用いるとのこと。

# 原因
デフォルトコンストラクターを忘れていた。

# 解決方法1
デフォルトコンストラクターを作る。
冗長になるが、書き直したソースコードが以下。

```cpp:main.cpp
#include <iostream>
#include <vector>
using namespace std;

class dim_3 {
	private:
		int x_;
		int y_;
		int z_;
	public:
		dim_3 () : x_{0}, y_{0}, z_{0} {}
		dim_3 (int x, int y, int z) : x_{x}, y_{y}, z_{z} {}
		inline void setX (int in) { x_ = in; }
		inline void setY (int in) { y_ = in; }
		inline void setZ (int in) { z_ = in; }
		inline int getX () const { return x_; }
		inline int getY () const { return y_; }
		inline int getZ () const { return z_; }
};

int main(){
	vector<dim_3> vc;
	vc.resize(10);
	cout << vc[4].getX() << " " << vc[4].getY() << " " << vc[4].getZ() << endl;
	return 0;
}
```

実行結果が以下。

```plaintext:output
0 0 0
```

# 解決方法2
初期化方法を指定する。
これは使いやすくないが、試したら動いたので一応記す。これを用いるとしてもデフォルトコンストラクターは作るべきである。ソースコードは以下。

```cpp:main.cpp
#include <iostream>
#include <vector>
using namespace std;

class dim_3 {
	private:
		int x_;
		int y_;
		int z_;
	public:
		dim_3 (int x, int y, int z) : x_{x}, y_{y}, z_{z} {}
		inline void setX (int in) { x_ = in; }
		inline void setY (int in) { y_ = in; }
		inline void setZ (int in) { z_ = in; }
		inline int getX () const { return x_; }
		inline int getY () const { return y_; }
		inline int getZ () const { return z_; }
};

int main(){
	vector<dim_3> vc;
	vc.resize(10, dim_3(8,9,0));
	cout << vc[4].getX() << " " << vc[4].getY() << " " << vc[4].getZ() << endl;
	return 0;
}
```

実行結果が以下。

```plaintext:output
8 9 0
```

# おわりに
今後は、デフォルトコンストラクターを忘れないよう注意します。
ChromeバージョンアップしたらSalesforceの打刻ができなくなった

#はじめに
SalesforceのTeamSpiritを使っており、ある日Chromeが自動バージョンアップ後、打刻ができなくなりました。
なぜだろうと思って別の方のPCで確認しましたが、問題ありませんでした。
またFirefoxで試したら正常動作ですので、アカウントと関係ないと判明し、Chromeの問題だと思われます。

解決方法はメモとして記載します。

#現象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/a5195101-0c8f-4d17-a096-f8f38ae6abe4.png)


#Chromeのコンソールログ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/55b90ebd-8a6c-d28d-101e-8e1d2edd0cf5.png)

SameSiteの警告のほうが問題点のようですので、ネットで調べたらSalesforceのヘルプページに説明がありました。
https://help.salesforce.com/articleView?id=000351961&language=ja&mode=1&type=1

#解決方法
- Chrome ブラウザを開きます (Chrome バージョン 76 以降)。
- アドレスバーに次の文字列を入力します: chrome://flags/
- 「SameSite by default cookies」にDisabledを選択
- 右下の「Relaunch」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/1725977e-bc2f-a07d-1161-13a19339df7a.png)


以上
Raspberry Piで人感センサ

# はじめに
1年以上前からの話にはなりますが、Raspberry Piと赤外線センサを組み合わせてお手軽人感センサを作り、使い続けています。
Raspberry Piでの共通セッティング項目は [ブログ](https://molybdenum.hatenadiary.com/entry/2019/12/22/135939) に書きました。

# いるもの
- Raspberry Pi（これがないと何もはじまらない）
- 赤外線センサ
- ジャンプワイヤ
- ブレッドボード

Raspberry Piは初代のモデルのものを、赤外線センサとかは当時、仕事帰りに秋月電子で買いました。
Amazonだと、
- [センサ](https://www.amazon.co.jp/dp/B081V2BMNZ)
- [ジャンプワイヤ](https://www.amazon.co.jp/dp/B00P9BVKOK)
- [ブレッドボード](https://www.amazon.co.jp/dp/B009ALRR9M)
こんな感じ。
ジャンプワイヤはブレッドボードにつないだので、メスオスのものを買いました。

# 工作
センサで必要は5V電源なので、私は次の通りにしました。

| センサ  | Raspbery Pi |
|:--|:--|
| VCC  | 5V |
| OUT  | GPIO: 18 |
| GND  | GND: 25 |

GPIOは機器の接続場所、GNDはアース線みたいなものです。
Raspberry Pi側のPin仕様は公式ページに記載がありますが念の為画像を。
![GPIO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163185/3f299fe7-c023-d5f6-114c-9e3e440bd9b4.png)
とりあえず書いている場所とセンサ本体をジャンプワイヤとブレッドボードでつないでいけばOK。

# かんたんなソースコード
Raspberry PiはPythonで書くだけでGPIOとの連携が簡単にできるので下記のコードでひとまず出力の確認はできます。

 ```python
# GPIOパッケージのインポート
import RPi.GPIO as GPIO

# PINの指定
GPIO_PIN = 18

# GPIO番号指定
GPIO.setmode(GPIO.BCM)

#入力として指定
GPIO.setup(GPIO_PIN, GPIO.IN)

if __name__ == '__main__':
    if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
        #入力がある場合
        print("センサに反応がありました")
    #GPIO設定の初期化
    GPIO.cleanup()
```

私の場合は、If文の中にSlackへの投稿をするためにAPIを叩いて、時刻とかカウント数も添えて叩いています。

# 困ったこと
玄関に設置しているのですが、廊下からの光に反応して日中もSlackへの投稿が止まないです。
また、センサ自体の説明書はないので、回路の部分を見てどこがVCCなのかとか判断しないといけないです（ちゃんと基盤に記載がありますが）。
Python3 標準入力 まとめてみた

# はじめに
競技プログラミングを最近始めたので案外めんどくさい標準入力についてまとめました。
出力とかの処理についてはあとできれいに直します。

# input高速化

```:高速化
import sys
input = sys.stdin.readline
```

#単純な入力

```:input
apple
orange 
10
12.5
```

```
a = input()
b = str(input())
c = int(input())
d = float(input())
```

# List型

```:input
1
2
3
4
5
```

```
X = [int(input()) for i in range(5)]
print(X)
```
```:output
[1, 2, 3, 4, 5]
```

```:input
1 2 3 4 5
```


```
A = list(map(int,input().split()))
print(A)
```

```:output
[1, 2, 3, 4, 5]
```

# List in 〇〇

List in tuple

```
l = []
n = int(input())
for i in range(n):
    a,b=input().split()
    l.append((int(a), b))
```

List in list(int)

```
n = int(input())
arr = []
for i in range(n):
    arr.append(list(map(int, input().rstrip().split())))
```

List in list(str)


```
N = int(input()) 
arr = [list(map(str, input().split())) for i in range(N)]
```
ReactNativeプロジェクトをXcodeでビルドしたときに「node.jsが見つからない」とエラーが出た時の対処方法

ReactNativeプロジェクトをXcodeでビルドしたときに「node.jsが見つからない(`Can't find the 'node' binary`)」とエラーが出ることがある。これはnode.jsを通常でない方法でインストールしている時、例えばhomebrew/nodebrew/nvmとかのパッケージマネージャ/バージョンマネージャを使っている場合とかに発生する。これを解決する。

エラーログ：

```
error: Can't find the 'node' binary to build the React Native bundle.  If you have a non-standard Node.js installation, select your project in Xcode, find  'Build Phases' - 'Bundle React Native code and images' and change NODE_BINARY to an  absolute path to your node executable. You can find it by invoking 'which node' in the terminal.
```

## 環境
- OS: Mohave 10.14.6
- Xcode: 11.2
- react-native: 0.61.5

## 解決策

エラーログに書いてある通り、Xcodeの、Build Phases' の 'Bundle React Native code and images' の NODE_BINARYをいじれば解決する。

ただ、これだと開発環境ごとにXcodeのプロジェクト設定を書き換える必要があるのでやや大変。自動化してもいいが、できれば書き換えなくて済む方法がいい。探したら、`/usr/local/bin/node`へ自分のnodeのsimlinkを張っておく方法[^1]があった。

[^1]: [React Native ios build : Can't find node]((https://stackoverflow.com/questions/44492197/react-native-ios-build-cant-find-node/50419734#50419734))

下記のコマンドを実行すればよい。

```sh
ln -s $(which node) /usr/local/bin/node
```

nodebrewであればこの解決策で動いたが、情報元のStackoverflowのコメントでnvmでは動かないという情報もあった[^2]。動かない場合は、下記のようにXcodeのプロジェクト設定を書き換える解決策を使える。

[^2]: https://stackoverflow.com/questions/44492197/react-native-ios-build-cant-find-node/50419734#comment99276721_50419734

## xcodeprojを書き換える解決策

自分のnodeの場所を探して、

```sh
which node # -> /Users/n/.nodebrew/current/bin/node
```

ここへ書き込む

<img width="862" alt="スクリーンショット 2020-02-02 22.38.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/0fecfc51-dd44-ab85-7799-c879bd29ba69.png">

↓

<img width="861" alt="スクリーンショット 2020-02-02 22.38.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/d47b4a21-eabf-4584-688e-d42ed8c0864a.png">

以上。

## 参考
- [React-NativeをiOS実機でビルドしたら，node binaryが見つからないとエラーが出た件]
(https://qiita.com/_mkazutaka/items/eca26d441461985d8397)