OmniAICreator/Qiita-1.07M huggingface dataset:
感心した練習問題の出し方

# Let's build cars!
構造体(struct)と列挙型(enum)の練習問題。

Rust初心者の私には良い練習問題だと思ったのと、問題を解くために必要な要求がすべてコードにかかれており、余計な問題文がないことが新鮮だったため、転載します。

```rust
struct Car {
    color: String,
    transmission: Transmission,
    convertible: bool,
    mileage: u32,
}

#[derive(PartialEq, Debug)]
enum Transmission {
    Manual,
    SemiAuto,
    Automatic,
}

fn car_factory(color: String, transmission: Transmission, convertible: bool) -> Car {

    // To Do - Fix this part of the function to create a new Car object as requested by the client
    let car: Car = todo!("Replace this with an actual Car instance")

    // Factory's Quality Control Department says that new cars must always have zero mileage!
    assert_eq!(car.mileage, 0);

    // Display the details of the new car order
    if car.convertible {
        println!("New car = {}, {:?}, Convertible", car.color, car.transmission);
    } else {
        println!("New car = {}, {:?}, Hardtop", car.color, car.transmission);
    }

    return car;
}

fn main() {
    let client_request_1 = car_factory(String::from("Red"), Transmission::Manual, false);
    assert_eq!(client_request_1.color, "Red");
    assert_eq!(client_request_1.transmission, Transmission::Manual);
    assert_eq!(client_request_1.convertible, false);

    let client_request_2 = car_factory(String::from("Silver"), Transmission::Automatic, true);
    assert_eq!(client_request_2.color, "Silver");
    assert_eq!(client_request_2.transmission, Transmission::Automatic);
    assert_eq!(client_request_2.convertible, true);

    let client_request_2 = car_factory(String::from("Yellow"), Transmission::SemiAuto, false);
    assert_eq!(client_request_2.color, "Yellow");
    assert_eq!(client_request_2.transmission, Transmission::SemiAuto);
    assert_eq!(client_request_2.convertible, false);
}
```
# 正しいコードの出力結果
```rust
New car = Red, Manual, Hardtop
New car = Silver, Automatic, Convertible
New car = Yellow, SemiAuto, Hardtop
```



# 引用元
https://docs.microsoft.com/en-us/learn/modules/rust-understand-common-concepts/5-exercise-structs-enums
RDKitで化学反応を扱った際の生成物群を整理し図示する方法

[RDKit入門⑦：反応式の取り扱い(前編)][1]の記事ではRDKitによる化学反応の取り扱いを紹介しました。
記事の中で出力結果が二重のタプルとなることを以下のような画像とともに説明しました。
[1]:https://qiita.com/Ru-PNP/items/49a080a015414553bbad

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144410/f7e6698c-0d35-8347-46d1-b317ec4e05c7.png)

解説用にこのような画像を出力する関数を自作しましたが、なかなか便利そうなので
今回はその自作関数を紹介したいと思います。

###環境
- Windows 10
- python 3.8.8
- RDKit 2021.03.1

---

先にパッケージの読み込みを行います。

```python
from rdkit import Chem
from rdkit.Chem import AllChem, Draw
from itertools import chain
#パッケージの読み込み
```

以下が自作した関数になります。

```python
def Draw_Products_Labels(products_str: str):
    if type(products_str) != str : raise ValueError('変数名を文字列として入力してください！')
    #注意！変数にはリストそのものではなくリストの名前を文字列として入れること！
    products = globals()[products_str]
    #products_strという名前の変数を取得し、productsと定義した。
    products_all = list(chain.from_iterable(products))
    #反応生成物群の中に含まれる化合物をリストに並べてproducts_allと定義した。
    products_list = []
    for i in range(len(products)):
        for j in range(len(products[i])):
            title_products = '{0}[{1}][{2}]'.format(products_str,i,j)
            products_list.append(title_products)
            #中身のMolオブジェクトを個別に呼び出す際の名前を順に格納したリストをproducts_listと定義した。
    return Draw.MolsToGridImage(products_all, molsPerRow = len(products[0]), legends = products_list)
    #画像を描画する。
```

---

ピリジン環をニトリル+アルキン×2に分解する反応を例にして紹介します。

```python
rxn = AllChem.ReactionFromSmarts("[n:1]1[c:2][c:4][c:5][c:6][c:7]1>>[n:1]#[C:2].[C:4]#[C:5].[C:6]#[C:7]")
#ピリジン環をニトリル+アルキン×2に分解する反応をrxnと定義した。
bipyridine = Chem.MolFromSmiles("CCC1=C(C=NC(=C1)C(C)C)C1=C(C=NC(C)=C1)C(C)(C)C")
#今回の基質をbipyridineと定義した。構造は以下参照。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144410/c2ebb6b6-0aca-5e31-87d0-37f553848156.png)

反応を実施し、出力結果を先に作成した自作関数Draw_Products_Labelsに投入します。
<b>この際、出力結果を“ダブルクオーテーション”で括って文字列として渡すようにしてください！</b>
(括らずに渡さなかった場合エラーメッセージを返すようにはしてあります)

```python
test = rxn.RunReactants([bipyridine])
#rxnにbipyridineを基質として適用し、出力結果をtestと定義した。
Draw_Products_Labels("test")
#Draw_Products_Labelsに反応の結果を"test"として代入し、画像を出力した。""で括ることに注意！
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144410/3f9374cc-5168-93a3-11ef-a38ec09d910c.png)

##おわりに

今回はRDKitで化学反応を扱った際の生成物群を整理・図示する自作関数を紹介いたしました。
関数に代入する際に“”で括って文字列として渡さないといけないのが現状大きな問題点ですが、
ひとまず整理・図示する目的は果たせたかと思います。

変数名から文字列を取得する操作がうまくできれば改善可能なのですが……
方法をご存知の方はコメントいただけると幸いです。
loopPointReachedによる動画再生終了の検出でつまづいた話


loopPointReachedで動画再生を検出しようとしたところ、以下の問題が発生

■発生条件
動画を再生した後のVideoSourceで別の新しい動画を再生しようとした時、前の動画の再生中frameが、新しい動画の総frameより大きな値になっている。
※たとえば動画(長さ60秒)を20秒部分まで再生した後、別の動画(長さ10秒)を再生した場合など。
loopPointReachedに1つでもコールバック関数が1つも登録されていなければ発生しない様子。

■発生する問題
①新しい動画の再生開始直後に.loopPointReachedに登録されている関数が呼ばれる。
②PrepareCompletedを検出してすぐに.Play()しても、再生されない
 正確には.Play()でisPlaying=trueになるが、直後に①の問題が発生することで強制的にisPlaying=falseにされる様子。

■問題が発生するコード
Start()内で関数を登録

```c#
videoPlayer.prepareCompleted += VideoPlayerOnPrepareCompleted;
videoPlayer.loopPointReached += FinishPlayingVideo;
```

動画再生処理

```c#
public void MovieStart(string filename)
{
    videoPlayer.url = mp4path + filename;
    videoPlayer.Prepare();
}
```

Prepare完了時に再生

```c#
private void VideoPlayerOnPrepareCompleted(VideoPlayer source)
{
    source.Play();
}
```

再生終了時の処理

```c#
private void FinishPlayingVideo(VideoPlayer vp)
{
     Debug.Log("再生終了時の処理");
}
```



■回避策
新しい動画を再生する前に前の動画を.frame = 0して再生時間を戻したり、再生時間を戻した状態で.Playして数frame待つ処理を入れても安定しなかった。
試行錯誤したところ、問題を回避せずに、発生させた後に影響を軽減させる方が良さそう。
①PrepareCompletedの後、少しの間は、loopPointReachedによる「再生終了」のイベントを無視させる
②PrepareCompletedの後、少し待ってから.Play()しなおす処理を入れる


■回避策を反映したコード

Start()内処理や、動画の再生処理は変更不要。

フラグ用の変数を追加。

```c#
private bool FinishPlayingVideoFlag = false;
```

Prepare完了時にコルーチン実行

```c#
private void VideoPlayerOnPrepareCompleted(VideoPlayer source)
{
    source.Play();
    StartCoroutine(loopPointReachedBugFix_Coroutine());
}
```

Prepare完了後、最大で1.3秒間の間、勝手に.isPlaying が falseになる（=問題発生）ことを検出させる。
問題が発生した場合は、改めて.Playする。
この間、FinishPlayingVideoFlagフラグを立てておく

```c#
private IEnumerator loopPointReachedBugFix_Coroutine()
{
    FinishPlayingVideoFlag = true;
    float Timer = 0;
    while (Timer < 1.3f)
    {
        yield return null;
        if (!videoPlayer.isPlaying)
        {
            Debug.Log("即終了バグ回避処理");
            videoPlayer.Play();
            break;
        }
        Timer += Time.deltaTime;
    }

    FinishPlayingVideoFlag = false;
}
```

フラグが立っている場合は、再生終了の検出を無視する。

```c#
private void FinishPlayingVideo(VideoPlayer vp)
{
     if (!FinishPlayingVideoFlag)
         Debug.Log("再生終了時の処理");
}
```

loopPointReachedの誤検知が発生するタイミングはバラツキが多いが、色々な条件で試したところ、他処理の負荷やFPSに関わらず、PrepareCompletedの直後frame～最大0.65秒程度の範囲で発生していたので、余裕をもって倍の1.3秒としている。
メモ: WMI

## キーコード

Windows キー : `&H5B`

```
user32 keybd_event
```

## モニター一覧

```vb:getmonitor.vbs
Option Explicit

Dim strComputer, objWMIService, colItems, objItem

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _ 
  & "{impersonationLevel=impersonate,authenticationLevel=Pkt}!\\" _ 
  & strComputer & "\root\wmi") 

Set colItems = objWMIService.ExecQuery _
  ("SELECT * FROM WMIMonitorID")

For Each objItem In colItems
  Wscript.Echo objItem.InstanceName
Next
```

https://www.tek-tips.com/viewthread.cfm?qid=1664596

```vb:マルチモニター数.vbs
strComputer = "."
set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!\\" & strComputer & "\root\wmi") 
set colItems = objWMI.ExecQuery ("SELECT * FROM WMIMonitorID")
msgbox strComputer & " has " & colItems.count & " monitors configured"
```

## PCにしゃべらせる

```dosbatch:voice.bat
mshta.exe vbscript:Execute("CreateObject(""SAPI.SpVoice"").Speak ""おはようございます"":Close")
```

## 画面キャプチャ

https://language-and-engineering.hatenablog.jp/entry/20100804/p1

```dosbatch:printscreen.bat
mshta vbscript:execute("Set a=CreateObject(""Excel.Application""):a.ExecuteExcel4Macro(""CALL(""""user32"""",""""keybd_event"""",""""JJJJJ"""",44,0,1,0)""):a.ExecuteExcel4Macro(""CALL(""""user32"""",""""keybd_event"""",""""JJJJJ"""",44,0,2,0)""):close()")
```

## 該当のプロセス一覧

```go
Get-WmiObject -query "select * from win32_process where (name = 'msedge.exe')"
```
WireCloud

## WireCloud

### 起動確認

https://hub.docker.com/r/fiware/wirecloud

```sh:起動
docker run -p 8000:8000 -d \
 --name wirecloud \
 --network fiware_default \
 -e DEBUG=True \
 fiware/wirecloud:1.2
```

* http://host:8000

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/3e742ba7-235d-a9e8-6e50-b8963a1e4fd9.png)

### ハマりポイント

* `-e DEBUG=True `を付けないと表示されなかった。
    * 未指定や `-e DEBUG=False `だと下のようにダメだった。

![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/d4c7681a-9cb5-fd41-f9b6-e337130f5639.png)

```sh
# 特権アカウントの作成
docker exec -ti wirecloud manage.py \
  createsuperuser
```

### 特権でログイン


![super.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/59992956-5529-a463-9567-aa3cb20611d1.png)


マーケットプレイスを追加するためのwgtファイルを取得しUPLOAD

https://wirecloud.letsfiware.jp/widgets/

![upload.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/f279f54f-598f-03c0-a372-d4351e7d3b9c.png)

### ワイヤーリンク

https://fiware-tutorials.letsfiware.jp/Application-Mashup/#wirecloud

```sh
git clone https://github.com/FIWARE/tutorials.Application-Mashup.git
cd tutorials.Application-Mashup
git checkout NGSI-v2

./services create
./services start
# ./services stop
```

* http://host:8000
    * user : alice-the-admin@test.com
    * pass : test

うまく動かなかったのでまた今度
Netdata

## Netdata

* http://host:19999
    * 自身のサーバーの情報のみ表示
* http://host:19999/tv.html
    * 一覧で表示
* http://host:19999/demo.html
    * iframeで埋め込みも可能だがGrafanaのほうが簡単かも
    * /usr/share/netdata/web/demo.html
* http://host:19999/demosites2.html

```sh
docker run -d --name=netdata \
  -p 19999:19999 \
  -v /etc/passwd:/host/etc/passwd:ro \
  -v /etc/group:/host/etc/group:ro \
  -v /proc:/host/proc:ro \
  -v /sys:/host/sys:ro \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  --cap-add SYS_PTRACE \
  --security-opt apparmor=unconfined \
  netdata/netdata
```
IT用語まとめ

#はじめに
IT業界未経験の自分が、よく耳にするけどいまいち理解できていないIT用語についてまとめていきます。
内容に不備がありましたら、ご指摘いただけると嬉しいです。
分類はなんとなくで分けているので、間違っていたらごめんなさい。

#この記事の目標
・なんとなくでも用語の概要を理解する
・現場に入った時に、少しでも恥をかかないようにする(あくまで減るだけ)

#業界
|名称|読み|意味|例|
|-|-|-|-|
|loT|アイオーティー(Internet of Things)|モノのインターネット。ものに対して、インターネットを接続する|電化製品|
|SaaS|サース(Software as a Service)|ネットワーク経由でソフトウェアを活用するサービス|Google|
|PaaS|パース(Platform as a Service)|アプリケーションが稼働するためのDBや実行環境を提供するサービス|AWS|
|laaS|アイアース,イァース(Infrastructure as a Service)|サーバーやネットワークなどインフラやハードウェアを提供するサービス|Amazon EC2|
|オープン系||汎用系とは違い、パソコン内のシステム開発|業務システム|
|汎用系||メインフレーム(大型コンピュータ)を搭載するための開発|基幹システム|


#コンピュータ
|名称|読み|意味・役割|例|
|-|-|-|-|
|IDE|統合開発環境|アプリケーション開発に必要なソフトウェアを一まとめにしたもの|cloud 9|
|CUI|キャラクタユーザインタフェース|文字のみで操作するインターフェイス|コマンドプロンプト|
|GUI|グラフィカルユーザインタフェース|マウスやタッチパネルで操作するインターフェイス|PC画面|
|シェル|shell|ユーザーの入力したコマンドをカーネル(OS)に伝える||
|シェルスクリプト|shellscript|シェルに使えるコマンドまとめて実行できるようにしたファイル|拡張子(.sh)|
|カーネル|kernel|OSの中核部分、ディスク・メモリなど管理する部分||
|ミドルウェア|middleware|アプリケーションとOSの間に存在するソフトウェア|
|アドイン|add-in|アプリケーションやソフトウェアに追加できる機能|
|インプリメント| implement |ある機能を設計などに基づいて、実装すること|
|デバイス|devise|コンピュータにくっつける部品、装置、機械|
|ドライバ|デバイスドライバの略語|デバイスを動かすためのソフト|
|スケールアップ|scale up|システムやサーバーの性能をアップさせること|
|スケールアウト|scale down|スケールアップの対義語|

#サーバー・ネットワーク
|名称|意味|
|-|-|
|シンクライラント|クライアントの負荷を減らし、アプリケーションやデータ保持をサーバー側で行えるようにしたサーバーのこと|
|プロキシサーバー|webブラウザとwebサーバー間を高速にアクセス・安全に通信するための中間サーバー|
|キャッシュ|よく使用するデータを複製し、取り出しやすくする仕組み|
|クライアントサーバーシステム|クライアントとサーバーとで役割を分割したシステムのこと|

#DB
|名称|意味|
|-|-|
|スキーマ|データの構造、性質、データベースを操作するためのルール|

#その他
|名称|読み|意味|
|-|-|-|
|アタッチ| attach |仮想マシーンなどにボリュームを追加すること|
|ボリューム|volume|外部記憶装置を管理する単位、そのもの|
|オンプレミス|オンプレ(略語)|使用者自身の施設の構内にサーバーやソフトウェアを設置し、運用すること|自社運用とも呼ばれる|
|セグメント||あるまとまりを分割した固まりのこと|
|トリガー||何かのきっかけで動き出すプログラム、仕組み|
|データセット||プログラムで処理させるデータの集合体のこと|
[Ruby]破壊的メソッドと非破壊的メソッドを使ったときの挙動の違い

##はじめに
Ruby初学者です。
本記事はRubyの破壊的メソッドと非破壊的メソッドを使ったときの挙動について、書いたものです。

## 破壊的メソッドと非破壊的メソッドの違い
結論からいうとオブジェクト自身の内容を変えてしまうものを破壊的メソッド、変わらないものを非破壊的メソッドと呼びます。

## 破壊的メソッドの実行例
破壊的メソッド`upcase!`メソッドを使って実行結果を見てみましょう。
※ !のついたメソットは全て破壊的メソッドになります。しかし気をつけなければならないのは!がついていない破壊的メソッドもあるということです。

```
word = "abc"
word.upcase!

p word 
=> ABC
```

破壊的メソッドはオブジェクト自身の内容を変えるので`word`が書き換えられているのがわかります。

## 非破壊的メソッドの実行例
非破壊的メソッド`upcase`を使って実行結果を見てみます。

```
word = "abc"
word.upcase

p word
=> abc
```

上記のように`word`が変わっていないのがわかります。`upcase`は大文字に変換したものを返り値として返すメソッドなので、`word`を書き換えたい場合は次のようにします。

```
word = "abc"
word = word.upcase

p word
=> ABC
```

## 2つのオブジェクトの動き
`.object_id`を使うとどのオブジェクトを参照しているか、見ることができます。
破壊的メソッドを使った場合と非破壊的メソッドを使った場合でどういう動きをするかを見てみます。

### 宣言時
```
word1 = "abc"
word2 = word1

p word1.object_id => 70316803929680
p word2.object_id => 70316803929680
```
上記を見てみると代入時は同じオブジェクトを見ていることがわかります。

### 1.破壊的メソッドの場合
破壊的メソッドを使った場合はどうなるでしょうか。
先ほどの`upcase!`を使ってみてみましょう

```
word1 = "abc"
word2 = word1

word1.upcase!
p word1 => "ABC"
p word2 => "ABC"

p word1.object_id => 70316803929680
p word2.object_id => 70316803929680
```

`word1`と`word2`の値が変更されオブジェクトのIDが変わらないのがわかります。
これにより破壊的メソッドはオブジェクトの値そのものを変更するということが理解できます。

### 2.非破壊的メソッドの場合
破壊的メソッドを使った場合はどうなるか`upcase`を使ってみましょう

```
word1 = "abc"
word2 = word1

word1 = word1.upcase
p word1 => "abc"
p word2 => "ABC"

p word1.object_id => 70316807663740 ←違うオブジェクトIDを見ている
p word2.object_id => 70316803929680
```

`upcase`で置換後`word1`が新しいオブジェクトを見ていることがわかります。
もう一方の`word2`は代入時と同じオブジェクトIDとなっています。

## まとめ
今回のポイントは以下になります。

* 破壊的メソッドは、オブジェクトの値そのものが変更される。(オブジェクトIDは同じ)
* 非破壊的メソッドは、新しいオブジェクトが生成されて値が変更される(オブジェクトIDは変わる)
Stripe Connectで画像検証を登録する方法 | 子アカウントの本人確認 | Node.js

[ハイテク好きが楽しめるwebメディア | off.tokyo](https://off.tokyo/blog/stripe-connect-img-add/)

--


![stripeimg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/e435cba7-59db-b0b7-137b-7d3b9b1a7ff6.png)



[スキルシェアのサービス](https://meee.work)を２０２０年から作り始めたのだが、完全に放置になってしまった。




でも、最近また開発を再開しました。




個人間取引の市場に対する情熱が、まだ潰えてないようです。




まあ、そんなことはどうでもいいのだが・・・




色々とコードが動かなくなってて、Stripe周りが動かなくなってた。




やりたいことはC2Cのサービスで、ユーザーへの売り上げなどを口座へ振り込む際に、




そのユーザーの本人確認などの検証をしなければいけない。




住所や、本名や、免許証などの画像が必要です。




それで、今回は免許証などの画像を検証する方法を紹介します。




## 画像を作る



[Create a file](https://stripe.com/docs/api/files/create)





```js

const file = await stripe.files.create({
  purpose: 'dispute_evidence',
  file: {
    data: fp,
    name: 'file.jpg',
    type: 'application/octet-stream',
  },
});
```



まず、画像ファイルをサーバーに送っておかないといけないので、上記みたいな感じで画像を作ります。




免許証などの画像ファイルをapiへ送って、返ってきたidを使って、別のapiを叩いて本人認証を依頼する感じです。




上記のようにapiを叩くと、レスポンスでidが帰ってくるので、これを使う。


```js

{
  "id": "file_19yVPOfwefwefwefwefweO",
  "object": "file",
```



idを使っていきますので、どこかの変数に取っておいてください。




## 本人確認を登録する




[Update an account](https://stripe.com/docs/api/accounts/update#update_account-individual-verification-document)





ここはこの記事の本題なので、僕が実際に書いたコードを記します。




```js
async function UpdateAccounts(
  stripe_user_id,
  HEAD_ID_STRIPE_IMG, 
  BACK_ID_STRIPE_IMG
) {
  try {
    const account = await stripe.accounts.update(
      stripe_id_get_edit_connect_user,
      {
        individual: {
          verification:{document:{front: HEAD_ID_STRIPE_IMG, back: BACK_ID_STRIPE_IMG } }, 
        },
      },
    );
    console.log("アカウント")
    console.log(account)
  } catch (err) { 
    console.log("エラー");
    console.log(err);
  }
}
```




上記の関数を呼び出します。




引数には、先ほど作っておいた画像ファイルのidと、Stripe Connectのユーザーのアカウントidを引数に渡してください。




Stripe Connectのユーザーアカウントのことはこの記事では説明しません。




それで、個人間取引なので、individual の中に書かれてるように画像のidをstringで渡します。




ちなみに、このオブジェクトの中には、その他にも住所や名前も入れることが出来ます。




ここら辺のパラメータの詳細は、公式ドキュメントで見れば、何がパラメータに入るのか知ることが出来ます。




この状態でapiを叩くと、optionalなパラメータしかapi定義にないので、そのままオブジェクトが正しければapiが通るはずです。




## Stripeで確認




では、Stripeのダッシュボードで確認してみましょう。




下記の画像のようにdentity documentとIdentity document backがProvidedになってれば、




正しく画像のidがStripeのapiに送れてると思う。




あとは、しばらく待ってれば、個人情報が正しく認証されるか否かわかります。



![stripe.png](https://off.tokyo/wp-content/uploads/2021/06/stripe.png)

--

[ハイテク好きが楽しめるwebメディア | off.tokyo](https://off.tokyo/blog/stripe-connect-img-add/)
web技術に入門してみた。

備忘録的な意味合いの強い
web技術の基礎をまとめておくことにした。

そもそもwwwは
欧州原子核研究機構CERN
が、研究成果をメールに頼らず、
いつでも誰でもアクセスできるようにするために発明されたものである。
当時は簡単なHTML文章をただ返す、根本的な機能しか持っておらず、
そこで新たな問題が発生した。
せっかくHTMLを公開しても、
閲覧者が飽きてしまい、アクセスが減るという問題である。
また、コンテンツの更新に莫大な手間がかかり、キリが無いという問題も付随して発生した。
そこで開発されたのがCGIという技術で、
動的コンテンツをweb上で閲覧できるシステムだ。
現在のwebアプリケーションの土台になっている。
最初はC言語やPerlが用いられていたが、やがてそれらを踏襲してJavaが発明され、受け入れられるようになっていく。

ここで新たな問題が発生する。
webアプリケーションの大規模化、複雑化である。
Amazon.comを想像すると分かりやすいが、
従来のアプリケーションとは比較にならないほど複雑で、
かつ規模が大きく、便利なものを、従来のシステムで管理できないことだ。
我々初学者が勉強に一番の時間を割く、
webフレームワークの登場へと、話は展開される。

webフレームワーク登場初期、
一番の問題はログイン状態をいかに保持しておくか、
というものだった。
普段から何気なく使っている。
Cookieの誕生である。
webサーバからwebブラウザへHTTPレスポンスを利用して小さな情報を送る。
名前と値の組み合わせ、これがcookieである。
一方cookieを受け取ったものと異なるサーバーからは、
アクセスを拒否する。
これを利用してログイン状態が管理されている。

しかしセキュリティ上の問題を払拭することができなかった。
簡単な仕組みであるが故に、
第三者からユーザー名、パスワードを知られてしまうと、本人になりすまして買い物したり、
銀行口座をのぞかれてしまう。
これらを解決するために生み出されたのがsession
である。
銀行の窓口を想像すると分かりやすいが、
例えAさんが新規に口座を開設するとして、
その旨を担当員に伝えると、整理券番号Aでお待ち下さいと言われる。
その間にBさんの要件を受け付け、処理をすることができる。
そうこうしている内に新規口座の開設手続きは終わり、
Aさんはスムーズに通帳を受け取ることができる。
ログイン→処理→内容確認→ログアウト
この一連の流れをsession、ここで言う受け付け番号をsessionIDと呼ぶ。
受け付け番号で管理する点、cookieよりもセキュアであると言えるし、
cookieが持つやりとりの機能を再利用することができる。

例えばwordで何か文章を作成するケースを考える。
この場合PCが一台あれば完結するが、
webアプリケーションの場合同様にはいかない。
webサーバーとwebクライアント、少なくとも2台のコンピュータが必要である。
システムも以前より大規模化を迫られる。
大量のデータを保持するにあたって発明されたのが、
おなじみDatabaseである。
初学者にも有名な機能がCRUDである。
create,read,update,deleteを指す言葉であるが、
データベースサーバーを経由することで、
データを抽出しやすくなる。

ここからはアプリケーションサーバーの登場から、
アプリケーションを安全に運用するための仕組みである、
SSHの誕生へと、発展していく。
(こんな原因も) vagrant@127.0.0.1: permission denied (publickey)の解決方法

# はじめに

普段はDocker Desktopを利用している私ですが、久しぶりにVagrantを利用して環境構築を行いました。
Vagrant+VirtualBoxでUbuntuの環境を構築して、`vagrant ssh`で仮想環境に入ったところエラーに遭遇しました。

色々調べたところ、解決方法がなく自力で解決してこういう原因もあるなと感じ、まとめます。
該当する人はかなり少ないかと思いますが、助かる人がいれば幸いです。

# 環境
- VirtualBox 6.1
- Vagrant 2.2.16
- Vscode

# 問題

以下の記事通りに環境構築を行いました。

その後、`vagrant up`、`vagrant ssh`をしたところ以下のエラーが発生しました。

```
vagrant@127.0.0.1: permission denied (publickey)
```

そして以下の記事など確認して対処していましたが、どうも違いました。

https://qiita.com/yamazakim/items/1b2ef662222eb9ffab33

https://qiita.com/RyutaKojima/items/81c47ad085ccb7c69a90

# 解決方法

VirtualBoxやVagrantをインストールした場所とVagrantfileのディレクトリの場所が違うことが原因でした。
具体的には私のPCはドライブが2つあり、

VirtualBoxとVagrantは`Cドライブ`にインストール
vagrantfileは`Dドライブ`

この状況が、権限のエラーにつながっていました。

ですので、Cドライブに`vagrantfile`を移動して、`vagrant up`と`vagrant ssh`をすることでssh接続することに成功しました。

# おわりに

設定すればドライブが異なっても大丈夫かと思われます。
今回はそこまでは試していませんが、

https://qiita.com/RyutaKojima/items/81c47ad085ccb7c69a90

この記事でうまく設定すればできるかと思います。

珍しいパターンでしたので今回はまとめてみました。
このパターンだったという人がもしいたらコメントやLGTMお願いします！

# 参考記事
[vagrant@127.0.0.1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).](https://qiita.com/yamazakim/items/1b2ef662222eb9ffab33)
[Vagrant up/sshに失敗したときの対処法](https://qiita.com/RyutaKojima/items/81c47ad085ccb7c69a90
)
M1 Mac で  Docker mysql イメージをビルドする

M1 Mac で Docker の mysql イメージをビルドするには `linux/amd64` を明示的に指定する必要がある。

# Dockerfile

`Dockerfile` を利用している場合は `FROM` にオプションを渡すことができる。

```dockerfile
FROM --platform=linux/amd64 mysql:5.7
```

# docker-compose.yaml

`docker-compose.yaml` を利用している場合は `platform` を設定する。

```yaml
services:
  db:
    image: mysql
    platform: linux/amd64
```
学校に帰宅したらSlackに通知するシステム作ってみた

# 学校に帰宅したらSlackに通知するシステム作ってみた

---

## はじめに

こんにちは、会津大学学部一年のしんぶんぶんです。
学校にあるUBICという施設に最近よく住んでいるのですが、UBICに帰宅したらSlackへ通知が飛ぶシステム欲しいなーと思い一時間半くらいでさくっと作ってみました。

---

## システム概要

今回はLINE Simple Beaconとmicro:bitを使い、自分のiPhoneがBLEの電波圏内に入ったらSlackへ通知がシステムにしました。
API Gateway + Lambdaのサーバレスアーキテクチャで構成しています。
※図は一部割愛しています（とくにSlackのあたり）

![ubic-bot-アーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260292/fa4ff592-836d-3656-adf8-6004f33c3367.png)

---

## ソースコード

[こちらのリポジトリ](https://github.com/shinbunbun/ubic-bot)にアップロードしています。
serverless frameworkでデプロイできます。

めんどくさいBLEもLINE Messaging APIを使えば11行で書くことができます。マジ便利。
※このコードは署名検証とかエラーハンドリングとかを省いているのでその辺はご注意を。

```javascript
const line = require('@line/bot-sdk');
const axios = require('axios');
const client = new line.Client({ channelAccessToken: process.env.ACCESSTOKEN });
module.exports.bot = (event, context) => {
  const events = JSON.parse(event.body).events;
  events.forEach(async function (event) {
    console.log(JSON.stringify(event));
    if (event.type === 'beacon') await axios.post(process.env.SLACKURL, { text: 'ぶんぶんがUBICに帰宅しました' })
    context.succeed({ statusCode: 200, headers: { 'X-Line-Status': 'OK' }, body: '{"result":"completed"}' })
  });
};
```

---

## 作り方

1. [LINE Developers](https://developers.line.biz/ja/)でMessaging APIのチャネルを作成
2. [ソースコード](#ソースコード)に記載されているリポジトリからコードをcloneして、AWSへデプロイする
3. LINE DevelopersのコンソールからWebhookを有効化してWebhookURLにAPI Gatewayのエンドポイントを入力する
4. [Beacon登録ページ](https://manager.line.biz/beacon/register)でLINE Simple BeaconのハードウェアIDを発行
5. [micro:bitのMakeCode](https://makecode.microbit.org/)にアクセスしてスケッチを作る
   1. BluetoothとLINE Beaconの拡張機能を追加する
   2. 以下の様なスケッチを書く（HWIDにさっき発行したハードウェアIDをいれる）
   ![スクリーンショット 2021-06-06 17.53.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260292/2276b5d1-99f1-387a-1dc8-1d7db367f7a3.png)
   3. micro:bitをPCに接続してスケッチを書き込む
6. Botを友達追加してしばらく待つ
7. Slackに通知が来る

![スクリーンショット 2021-06-06 16.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260292/bf3bc582-ed0e-2760-bc88-6b3f556aa9a6.png)

---

## おわりに

自前でBLEを実装するとめちゃめちゃめんどくさいですが、LINE Simple Beaconを使えばこんな簡単に作ることができます。
興味ある方はぜひやってみてください！
Rails マイグレーションでテーブル作成とデータ移行を同時に行う

# 概要
本番運用中プロダクトへの機能追加対応により
１つのテーブルを２つにわける必要がありました。
当然ながら既存データの移行も考慮しないといけない。

作業手順としては
**Railsマイグレーション機能で２つの新しいテーブル作成**, 
**SQLによるデータ移行**が
考えられましたが、
今回はデータ移行もRailsマイグレーション機能で同時に行ってみました。

# 開発環境
* Ruby 2.6.5
* Rails 5.2.4
* PostgreSQL 9.6

# 既存テーブル構成と分割後の構成
* 既存テーブル構成
一つのテーブルに数学スコアと英語スコアが混在
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532385/cd861a5f-e48c-956c-8e5e-358bc3c2c41b.png)

* 分割後の構成
数学スコアと英語スコアを別々のテーブルに分割
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532385/23486020-a3b9-a0be-7c35-42fe701835ea.png)


# 作業詳細
* `新しいテーブル作成 -> データ移行`順でマイグレーションが実行されるよう、マイグレーションファイルを作成する

## 1.　新しいテーブル作成マイグレーションファイル
* 数学スコア用のRailsマイグレーション作成

```ruby
class CreateResultMathScores < ActiveRecord::Migration[5.2]
  def change
    t.references :user, foreign_key: true, null: false
    t.float :score, null: false, comment: "数学スコア"
    t.timestamps
  end
end
```
* 英語スコア用のRailsマイグレーション作成

```ruby
class CreateResultEnglishScores < ActiveRecord::Migration[5.2]
  def change
    t.references :user, foreign_key: true, null: false
    t.float :score, null: false, comment: "英語スコア"
    t.timestamps
  end
end
```

## 2.　データ移行マイグレーションファイル
* データ移行用のマイグレーションは`rails db:rollback`を考慮し　`def up`　`def down`　で作成する
* ActiveRecord　Modelを使ったデータ移行も可能だが、このマイグレーションの責務はデータ移行なので
Modelに依存しない形にしました

```ruby
class DataMigrationResultScoresToResultMathScoresAndResultEnglishScores < ActiveRecord::Migration[5.2]
  def up
    ActiveRecord::Base.transaction do
      execute <<-SQL
        insert into result_math_scores
        (
          user_id,
          score
          create_at
          update_at
        )
        select
          user_id,
          math_score,
          now(),
          now()
        from
          result_scores
      SQL

      execute <<-SQL
        insert into result_english_scores
        (
          user_id,
          score
          create_at
          update_at
        )
        select
          user_id,
          english_score,
          now(),
          now()
        from
          result_scores
      SQL
    end
  end

  def down
    ActiveRecord::Base.transaction do
      execute <<-SQL
        delete from result_math_scores
      SQL

      execute <<-SQL
        delete from result_english_scores
      SQL
    end
  end
end
```

## 3.　既存テーブルの削除
既存テーブル(result_scores)のDropは
今のところ削除せず、様子見の予定。

# 結論
Railsマイグレーションでテーブル作成とデータ移行を一緒にやらない方がいいという
意見もあるようですが、`rails db:rollback` を考慮したマイグレーションであれば
問題ないかと思います。
HTMLについて～<head>/meta要素～

#meta要素
今まで意識せず使っていましたが、きちんと理解していないと今後自分が困ると思ってまとめました。
<font color="MediumSeaGreen">https://www.tohoho-web.com/html/meta.htm#name　</font>
　↑　このサイトが一番わかりやすかったです


　

~~~php:head
<meta charset="utf-8">
~~~
エンコーディングは「データを一定の規則（バイト）に基づいて符号化すること」です。
特定のエンコーディング（UTF-8 など）を設定することで、バイトの並びがどのように解釈されるかを定めることができます。


　

~~~php:head
<meta http-equiv="X-UA-Compatible" content="IE=edge">
~~~
【http-equiv="X-UA-Compatible"】指定した互換モードで表示させることができます。
Internet Explorerは各バージョン毎にレイアウトの癖やJavaScriptの挙動が異なるため、古いウェブページを最新から古いバージョンをエミュレート（模倣し、動作）して表示することができる。
【content=”IE=edge”】Internet Explorerの最新で表示。
【content=”IE=EmulateIE7”】と指定すれば、IE8を使用していたとしてもIE7の標準モードで表示する。【content=”IE=edge”】という指定はあまり良くない可能性のある指定です。（https://www.creativevillage.ne.jp/2819 より）

　


~~~php:head
<meta name="viewport" content="width=device-width, initial-scale=1">
~~~
【Viewport】とは表示領域のことで、ブラウザにおける仮想のサイズをcontentで指定します。
幅360pxにしたいなら、content="width=360"と表記。
【content="width=device-width"】でViewportの幅は実際の解像度ではなく端末やブラウザに合わせた値を返します。
【initial-scale】で初期倍率を設定します。
width=device-widthとしてinitial-scaleを指定しない場合は、自動的にinitial-scale=1となります。
※ Windows PhoneのInternet Explorerではinitial-scaleに対応していないので、initial-scaleとwidthを同時指定したほうがいい、という考え方もあります。（https://ferret-plus.com/6033 より）
https://qiita.com/ryounagaoka/items/045b2808a5ed43f96607
RDKit入門⑦：反応式の取り扱い(前編)

今回はRDKitで反応式の取り扱いに関して紹介します。
この記事では個人的に分かりづらいと感じた部分を中心に触れますので、
基本的な部分については[化学の新しいカタチ][7]さんの以下の記事をご参照ください。

- [RDKitで化学反応：ケモインフォマティクスにおける反応式の扱い方][8]

[7]:https://future-chem.com/
[8]:https://future-chem.com/rdkit-chemical-rxn/

これまでの記事のシリーズは以下をご覧ください。

[RDKit入門①：まずは環境構築][1]
[RDKit入門②：1分子の読み込みと部分構造検索][2]
[RDKit入門③：複数分子の読み込み (前編)と分子群の描画][3]
[RDKit入門④：複数分子の読み込み (後編)とデータフレームの加工][4]
[RDKit入門⑤：データフレーム内の分子群に対する部分構造検索][5]
[RDKit入門⑥：Morganフィンガープリントの作成とそれを用いたタニモト係数の計算による分子類似性評価][6]
[1]:https://qiita.com/Ru-PNP/items/ed5a8530611ef0d712b7
[2]:https://qiita.com/Ru-PNP/items/58d733ef327677d273fd
[3]:https://qiita.com/Ru-PNP/items/1cea34b864e993e4e1e1
[4]:https://qiita.com/Ru-PNP/items/62a108d92c1ddd522e58
[5]:https://qiita.com/Ru-PNP/items/b469ac1b907909a9d821
[6]:https://qiita.com/Ru-PNP/items/79873f0e3eab444f5bfe

###環境
- Windows 10
- python 3.8.8
- RDKit 2021.03.1

---
先にパッケージの読み込みを行います。

```python
from rdkit import Chem
from rdkit.Chem import AllChem, Draw
#パッケージの読み込み
```

続いて反応を定義します。今回はエステルとアミンが反応してアミドができる反応を扱います。
<b>AllChem.ReactionFromSmarts()</b>メソッドを使用し、反応をReaction SMARTSの形式で記述します。

```python
amidation = AllChem.ReactionFromSmarts("[*:1]O[C:2](=[O])[#6:3].[Nh:4]>>[N:4][C:2](=[O])[#6:3].[*:1][Oh]")
#エステルとアミンが反応してアミドができる反応をamidationと定義した。
```

続いて基質をそれぞれ定義します。今回はエステル側を反応点が2つのジエステルとします。

```python
aniline = Chem.MolFromSmiles("Nc1ccccc1")
diester = Chem.MolFromSmiles("CC(C)(CCC(=O)ON1C(=O)CCC1=O)C(=O)OC1=CC=C(C=C1)[N+]([O-])=O")
#基質となるアニリンとジエステルをそれぞれaniline, diesterと定義した。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144410/79dfa492-0093-2313-12cd-363893b785fd.png)

念のため、この2つが先に定義したamidationの基質であるかを確認しておきましょう。
<b>(Reactionオブジェクト名).IsMoleculeReactant(Molオブジェクト名)</b>メソッドを使用します。
基質となる場合はTrue, ならない場合はFalseが返ります。

```python
amidation.IsMoleculeReactant(aniline) #True
amidation.IsMoleculeReactant(diester) #True
#anilineとdiesterがそれぞれamidationの基質であるかどうか確認した。
```

両方ともamidationの基質であることを確認できたため、続いて実際に反応を実施します。
<b>(Reactionオブジェクト名).RunReactants([Molオブジェクト])</b>メソッドを使用します。
今回は反応式左辺が2成分の反応を定義したので[]内にはMolオブジェクトを2つ並べます。

```python
products_amidation = amidation.RunReactants([diester, aniline])
#diesterとanilineをamidationに適用し、生成物群をproducts_amidationと定義した。
```

出力結果products_amidationはタプルの中にタプルがある二重構造となっています。
今回は反応点が2つあり、生成物が2成分となる反応なので((Mol, Mol), (Mol, Mol))となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144410/ccf37bf9-2a10-4b2f-0791-8c8090109560.png)

反応点の数や生成物の成分数によらず二重のタプルの形式で出力されます。
それぞれ化合物の画像の下のラベルを打ち込むことで個々のMolオブジェクトを取り出せます。

1反応点・1生成物の系で試したときなぜ二重のタプルの形式で出力されるのか疑問でしたが、
多反応点・多成分系で出力すると理解しやすいかと思います。

---

##おわりに

今回はRDKitを用いて以下の内容を実施いたしました。

- AllChem.ReactionFromSmarts関数を用いた反応の定義
- Reaction.IsMoleculeReactant関数を用いた基質かどうかの判定
- Reaction.RunReactant関数を用いた反応の実施

複数の反応点がある基質に対して1箇所反応させる例を今回紹介しましたが、
後編では自作関数を定義して繰り返し反応を実施する例を紹介したいと思います。

###参考
- [RDKitで化学反応：ケモインフォマティクスにおける反応式の扱い方][8]
- [SMARTS記法とRDKitの化学反応で遊んだ話][9]

[9]:https://magattaca.hatenablog.com/entry/2019/02/10/194853

---
追記：記事中で使用した画像(の元)を出力する自作関数の紹介記事を執筆いたしました。
併せてご覧ください。
[RDKitで化学反応を扱った際の生成物群を整理し図示する方法][10]
[10]:https://qiita.com/Ru-PNP/items/baebf99e269bd7fb2fb5
[Prometheus] MySQL Exporter with Docker

## 目次
- [[目次] Prometheusで監視システムを作る with Docker](https://qiita.com/Esfahan/items/7dc780501f418a71ad9d)

## 概要
Prometheusでの、MySQLのメトリクス収集用のMySQL ExporterのDocker環境構築手順。

## 前提条件
以下の手順でPrometheus環境を構築していることを前提とする。
https://qiita.com/Esfahan/items/0feaedfd771f49ac7ee4

## Prometheus公式のexporter
https://github.com/prometheus/mysqld_exporter

## 環境
- mysqld_exporter v0.13.0
- MySQL 5.7(監視対象)

## 注意
MySQLのperformance_schemaから情報を収集する。
performance_schemaはMySQL 5.5.3から導入されたパフォーマンスをモニタリングするためのスキーマ。
MySQL 5.6以降ではデフォルトでONになっているが、それ以前のバージョンではOFFになっている可能性があるので注意。

## 監視対象のMySQLの設定
監視対象のMySQLに以下のユーザーを追加。
MySQL Exporterから監視対象のperformance_schemaにアクセスできるようになっている必要がある。

```sql
CREATE USER 'exporter'@'%' IDENTIFIED BY 'XXXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'%';
GRANT SELECT ON performance_schema.* TO 'exporter'@'%';
```

## MySQL Exporterの環境構築

```yaml:docker-compose.yaml
version: '3'
services:
  mysqld-exporter:
    container_name: mysqld-exporter
    image: prom/mysqld-exporter
    env_file:
      - .env
    ports:
      - 9104:9104
    networks:
      - sample-network

networks:
    sample-network:
        external: true
```

```ini:.env
DATA_SOURCE_NAME=exporter:XXXXXXXXX@tcp(your_db_name:3306)/performance_schema
```

```
$ docker-compose up -d --build
```

## Prometheusの設定
[こちらの記事](https://qiita.com/Esfahan/items/0feaedfd771f49ac7ee4)で構築したPrometheus環境の設定ファイルを編集する。

### 監視対象を追加
prometheus.yamlに以下を追記。

```diff:prometheus/prometheus.yaml
# 前略
scrape_configs:
+  - job_name: mysqld
+    metrics_path: /mysqld_exporter/metrics
+    static_configs:
+      - targets:
+        - your-mysql-exporter-hostname:9104
+        labels:
+          env: development
```

設定を反映

```console
$ sudo docker-compose restart prometheus
```

### ルールを追加

```yaml:/etc/prometheus/alert.rules
groups:
  - name: sample001
    rules:
      # MySQL用のルールを追記
      - alert: mysql_down
        # MySQLが起動しているかのPromQL。
        expr: mysql_up == 0
        # 5分間応答がなければアラートを飛ばす
        for: 5m
        labels:
          severity: critical
        # エラー文言
        annotations:
          firing_text: "[{{ $labels.env }}] {{ $labels.instance }} MySQL has been down for more than 5 minutes."
          resolved_text: "[{{ $labels.env }}] {{ $labels.instance }} MySQL has recoverd."
```

## UI確認
[http://your_prometeus.com:9090/graph](http://your_prometeus.com:9090/graph)

mysql_upで検索すると、正常時は `1` となっている。監視対象のMySQLをダウンさせると、 `0` として検出される。
![Screen Shot 2021-06-13 at 16.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/300ddfae-1c3c-9321-3d6e-26a5b25cb05e.png)

## 関連記事
- [Prometheus Postgres Exporter with Docker](https://qiita.com/Esfahan/items/08d0c1ff94710603bac9)
- [Prometheusを使った監視システムをDockerで作る](https://qiita.com/Esfahan/items/0feaedfd771f49ac7ee4)
PMがPTA広報の部長になった訳だが(7)

# 小満

PTAの総会がありましたが、それ以外は驚く程何もありませんでした。
広報誌発行に関する実務を全て委任したので、後は本部からの連絡対応しかやる事がない為です。
当初面白い事が起きそうな予感があり実際面白い事が起きたわけですが、反省会をやったらもう書くネタが無いかもしれません。

PTA総会は参加要請があったので出席しましたが、変な雰囲気を感じました。
私は本部窓口担当と会長副会長の数名しか認知してませんが、本部全員が私の事を認知してるし、部費の受取の際も言葉を選んで会話してるのが伝わりました。
危険人物扱いされてる空気と言えば伝わるでしょうか。


## 失敗から学ぶ!女性が多くを占める組織運営の秘訣!
IT業界に居るとほとんど無い状況ですが一応状況設定をしておきましょう。

+ 女性向けのWEBサービスの企画から参画したらメンバーが全て女性だった
+ 乙女ゲーの開発案件に参画したら、以下同分
+ 転向や出向先が、または転職したら、以下同分

既に女性だけで編成されたチームが存在し、そこのマネージャーとして着任したと仮定しましょう。

そして以下は個人の感想です。全ての場面で有効に働く保証はありませんが、世の中で起きた1事例として参考程度に扱ってください。
私の居たい場所では無いですが、そういう世界は確実に存在します。そこで凌ぐ必要が生じたら暫くは仕方無いですね。

サブタイトルだけ見たらそんなPM論無いわー、な内容ですね。自分で書いてて悲しくなってきます。

## プレイングマネージャーにならない
今までの仕事でもプレイングマネージャーの動きをしており、それが良い結果を出していたのもあって、広報部でも部長職と担当企画を持つ事に違和感はありませんでした。
また直近のPJで実験的にマネジメントのみ担当してみた所、スケジュール後半で深刻な品質問題が発生した事もあり、自分はプレイングマネージャーの方が向いてると感じていたのも理由にあります。

恐らくメンバーの皆さんは実務が好きです。小～中学校とPTAの会員として何らかの部活動に携わっているので、何をするかは熟知しています。
前例踏襲するだけなら放置していても何らかのアウトプットを出してくれるでしょう。
私の問題意識はコロナ渦による活動実績の途絶によるノウハウの消失リスクにありましたが、そこは皆さん気にしてないようです。毎年ノウハウを持った要員が補充され続けるのなら数年の活動停止はリスク足りえないという訳です。

よって実務には関与せずバックヤードの作業に徹した棲み分けを行う方が、運営は上手く行くと学びました。
何処にでもイニシアチブを取りたい人達が確実に居ますので、その人達に任せましょう。

## 情報が欲しいなら公式な議事録ではなく噂話に耳を傾けよう
個人的に噂話にはまったく興味無いのですが、メンバーの想いは噂話から得たほうが確実性が高いです。
今思えば本部窓口担当の方から「その企画は部員の方全員から意見を聞きましたか？」と、湾曲ですが状況に対する進言を頂いたとも受け取れます。

まぁ私は非公式な会話なんて相手にしないし文書記録こそ正義の立場なので噂を相手にする事は極めて難しいです。
しかしメンバーの特性が偏ると、この様な事も起きると理解しました。

結婚して子供も出来て仕事に打ち込み過ぎたせいでしょうか。気が付いたら独身時代に実践していた女性の扱いをすっかり忘れてました。
思ったことを言わない、態度で表す、リードされるのを待っている、でしたね。

仕事に持ち込んで欲しくない事ばかりですが、こういう事が横行する世界もまだあるという学びを得ました。


## 学生を相手にしていると捉えよう
前回の記事と重複しますがメンバーの特性を整理しておきます。
・衝突を避け同調する
・最初の意見が決定事項となる
・仮定の話は苦手、具体的な例を出したら決定事項となる
・ドキュメントを読まない、または流し読み
・感情的にヒートアップしやすい

書いてて思いましたが学生気分のままの人ですね。
中学生の子供が居て、組織体を運営している集団だから成熟した大人だろうと思い込んでいたのが誤解だったようです。
学生を相手に対応していると思えばもう少し良い運営が出来たかもしれません。

上手い例えが出てきませんが「学生時代の再現をしている人達」という表現が私にはしっくりきました。

## 次回予告
広報部とは別件で副校長と会話した折に広報誌の挨拶文準備が出来ましたと聞きました。広報誌発行作業自体は進んでいるのでしょう。
またPTAの外に出す文書は必ず私のチェックを受ける約束でしたが、チェック依頼が来てないので口頭で依頼したのでしょう。
このままだと私へのINPUTが何も発生しないので面白い事が起きていても認知するチャンスがありません。

qiitaらしくコーディング寄りの小話でもして何かネタが発生するまで様子見しようかしらと思いつつ次回更新は夏至の頃を予定しています。
1ヶ月分の日付に対してコマンド実行するシェルスクリプト

# はじめに

バッジ処理などを実行する際に、一ヶ月分の日付のデータに対してスクリプトを実行することがよくあります。

例えば、2021年6月分のデータを実行する際に

```shell
python hoge.py 2021 6 1
python hoge.py 2021 6 2
python hoge.py 2021 6 3
python hoge.py 2021 6 4
...
python hoge.py 2021 6 30
```

と実行するのは骨が折れます。

そこで本記事では、そのような状況で私がよく使用するシェルスクリプトを雛形を紹介させていただきます。

dateコマンドのオプションの違いがあるため、2パターン紹介します。

echoの部分を改造して使用していただけると幸いです。

# Linuxの場合

シェルスクリプト本文

```shell
#!/bin/sh

# 途中で処理が失敗したらそこで処理を打ち止めにする設定
set -eu

# 引数
# $1 対象の年 ex) 2021
# $2 対象の月[0埋めなし] ex) 6
year=$1
month=$2

# 月の情報を2桁かつ0埋めの状態にする
tmp_month=0${month}
month_with_zero_pad=${tmp_month: -2}
# 処理の開始の日付と終了の日付(1ヶ月後の日付)を定義する
start_date=${year}${month_with_zero_pad}01
end_date=`date -d "$start_date 1month" "+%Y%m%d"`
# 繰り返し文の中で処理の対象となる日付
target_date=${start_date}

# 1日分ずつ処理する繰り返し文
while [ 1 ] ; do
    # 対象の日付がend_dateに達したら繰り返し文を抜ける
    if [ $target_date = $end_date ] ; then
        break
    fi
    echo target:${target_date}
    # 日付部分を抜き出す
    day=${target_date:6:2}
    # dayのゼロ埋めをなくしたい
    if [ ${day:0:1} = 0 ] ; then
        day=${target_date:7:1}
    fi
    # 処理を実行する
    echo year:${year}, month:${month}, day:${day} 
    # 日付をインクリメントする
    target_date=`date -d "$target_date 1day" "+%Y%m%d"`
done
echo ${year}/${month} complete!
```

実行

```
$ sh linux_1month.sh 2021 6
target:20210601
year:2021, month:6, day:1
target:20210602
year:2021, month:6, day:2
target:20210603
year:2021, month:6, day:3
target:20210604
year:2021, month:6, day:4
...
target:20210629
year:2021, month:6, day:29
target:20210630
year:2021, month:6, day:30
2021/6 complete!
```



# MacOSの場合(BSD Unixベース)

シェルスクリプト本文

```shell
#!/bin/sh

# 途中で処理が失敗したらそこで処理を打ち止めにする設定
set -eu

# 引数
# $1 対象の年 ex) 2021
# $2 対象の月[0埋めなし] ex) 6
year=$1
month=$2

# 月の情報を2桁かつ0埋めの状態にする
tmp_month=0${month}
month_with_zero_pad=${tmp_month: -2}
# 処理の開始の日付と終了の日付(1ヶ月後の日付)を定義する
start_date=${year}${month_with_zero_pad}01
end_date=`date -v+1m -j -f "%Y%m%d" $start_date "+%Y%m%d"`
# 繰り返し文の中で処理の対象となる日付
target_date=${start_date}

# 1日分ずつ処理する繰り返し文
while [ 1 ] ; do
    # 対象の日付がend_dateに達したら繰り返し文を抜ける
    if [ $target_date = $end_date ] ; then
        break
    fi
    echo target:${target_date}
    # 日付部分を抜き出す
    day=${target_date:6:2}
    # dayのゼロ埋めをなくしたい
    if [ ${day:0:1} = 0 ] ; then
        day=${target_date:7:1}
    fi
    # 処理を実行する
    echo year:${year}, month:${month}, day:${day} 
    # 日付をインクリメントする
    target_date=`date -v+1d -j -f "%Y%m%d" $target_date "+%Y%m%d"`
done
echo ${year}/${month} complete!
```

実行

```
$ sh macos_1month.sh 2021 6
target:20210601
year:2021, month:6, day:1
target:20210602
year:2021, month:6, day:2
target:20210603
year:2021, month:6, day:3
target:20210604
year:2021, month:6, day:4
...
target:20210629
year:2021, month:6, day:29
target:20210630
year:2021, month:6, day:30
2021/6 complete!
```



# 最後に

今回はよく使うバッジスクリプトについて紹介させていただきました。

結局、日付処理→文字列処理となってしまうあたりがあまりスマートではないなと個人的に感じております。

これが開発などの参考となれば幸いです。
【エラー解決】@vue/cli導入で「vue: command not found」と表示された場合の対処方法


参考にした記事

https://qiita.com/yukibe/items/fac6d6c45dd308e3d7dc


#　vue/cli導入

```
$ npm install -g @vue/cli
```


```
$ npm bin -g
/Users/#{myname}/.npm-global/bin
(not in PATH env variable)
```

```
$ vue create my-project
-bash: vue: command not found
```

#　エラー解決方法

**パスを通す**

```bash
export PATH=$PATH:`npm bin -g`
```


```
$ vue -V
@vue/cli 4.5.13
```

参考記事
--- 

- [Why wont my npm package commands work?](https://stackoverflow.com/questions/35540692/why-wont-my-npm-package-commands-work/35541194)
当たり障りのないダミー動画、 ダミー画像、 ダミーテキスト

HTMLコーディングのときにとりあえずなにか入れておくためのもの。

## 動画

### mp4

https://samplelib.com/sample-mp4.html

あんまり好きじゃないけどこれくらいしか見つからず。
もうちょっとかっこつけたフリーの動画はないものか。

### YouTube

基本的に YouTube公式の動画を使えばいいけど、YouTuberの顔がどかーんと大きくサムネイルに使用されているものも多いのでこれが無難。

YouTube公式 - YouTube Music - YouTube がつくった、新しい音楽アプリ

<iframe width="560" height="315" src="https://www.youtube.com/embed/IqKz0SfHaqI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

```
<iframe width="560" height="315" src="https://www.youtube.com/embed/IqKz0SfHaqI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
```

### Spotify

ザ・ビートルズ - Let It Be (Remastered)

<iframe src="https://open.spotify.com/embed/track/7iN1s7xHE4ifF5povM6A48" width="300" height="380" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

```
<iframe src="https://open.spotify.com/embed/track/7iN1s7xHE4ifF5povM6A48" width="300" height="380" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>
```

## 画像

https://placeholder.com/

<img src="https://via.placeholder.com/500">

```
<img src="https://via.placeholder.com/500">
```


### もう少し具体的な画像

https://picsum.photos/

`placeholder.com` のベタ塗り画像を嫌がるデザイナーやクライアントの方もいるため。
全体的に薄暗くてぼやーっとしてるのがやや難。

#### 風景

<img src="https://picsum.photos/id/1050/500/500">

```
<img src="https://picsum.photos/id/1050/500/500">
```


#### 人物

<img src="https://picsum.photos/id/64/500/500">

```
<img src="https://picsum.photos/id/64/500/500">
```


## テキスト

### 英文

```
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Quia, blanditiis? Natus, debitis possimus accusamus sed repellat optio! Laborum cupiditate iusto laboriosam totam consectetur? Quibusdam in sint cupiditate repellendus, blanditiis a.
```

### 日本語

```
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。
```
【Rails】単一テーブル継承(STI)でDRYな設計をしよう！

# 単一テーブル継承とは
同じカラム設計のテーブルを、一つのテーブルにまとめて、継承することで余計なテーブルを増やさず、DRYなテーブル設計にするというもの。考え方はクラスの継承と同じです。

# 不使用時と使用時の比較
住所テーブルを作成し、同じ内容でユーザーの住所テーブルと、勤め先の住所テーブルを用意する。

## 不使用時
それぞれのテーブルとモデルを用意している。

```
テーブル
Addressesテーブル、WorkAddressesテーブル、UserAddressesテーブル

モデル
Addressモデル、WorkAddressモデル、UserAddressモデル
```

## 使用時
Addressesのみ用意して、それを継承したモデルを用意している。

```
テーブル
Addressesテーブル

モデル
Addressモデル、WorkAddressモデル、UserAddressモデル
```

```app/models/address.rb
class Address < ApplicationRecord
end
```

```app/models/work_address.rb
class WorkAddress < Address
end
```

```app/models/user_address.rb
class UserAddress < Address
end
```
memberpressの~ヶ月(month)と月(month)の区別

memberpressをそのまま翻訳して使うと、「〜ヶ月」と「月」（カードの有効期限とか）が混同されてしまいます。
memberpress/app/helpers/MeprAppHelper.phpのファイルを編集して、両者を区別します。

#編集コード

```php:memberpress/app/helpers/MeprAppHelper.php
//前略
          if($conv_trial_type=="months"){
            $conv_trial_type_str="ヶ月";
          }else{
            $conv_trial_type_str = MeprUtils::period_type_name($conv_trial_type, $conv_trial_count);
          }
//以下略
```
Flutter GridView の複数選択ですべてを再描画させない方法

Flutter の GridView を使って、正方形のサムネイルを表示するアプリを作っています。複数選択することはできたのですが、タップする度にすべて再描画されてしまい画面が点滅してしまいます。
問題を解決することができたので紹介します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/3dc493a0-065d-7e06-b183-2bcfd52b09a8.png' width='25%'>

# ソースコード

```dart:multi_select_gridview.dart
import 'package:flutter/material.dart';

class MultiSelectScreen extends StatefulWidget {
  @override
  _MultiSelectState createState() => _MultiSelectState();
}

class _MultiSelectState extends State<MultiSelectScreen> {
  List<String> list = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T'];
  List<bool> selectList = new List.filled(20, false);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.extent(
        maxCrossAxisExtent: 150,
        children: List.generate(20, (index) {    
          return MultiSelectItem(
            name: list[index],
            selectList: selectList,
            index:index);   
      })),
    );}
}

/// isSelected で再描画を行い、selectList を親に参照させることで、
/// すべてが再描画されることを防ぎます。
class MultiSelectItem extends StatefulWidget {
  MultiSelectItem({
    @required this.name,
    @required this.selectList,
    @required this.index,
    });
  String name;
  List<bool> selectList;
  int index;
  bool isSelected = false;
  @override
  _MultiSelectItemState createState() => _MultiSelectItemState();
}

class _MultiSelectItemState extends State<MultiSelectItem> {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(2),         
      child: GestureDetector(
        onTap: () {
          setState((){ 
            widget.isSelected = !widget.isSelected;
            widget.selectList[widget.index] = widget.isSelected;
            });
        },
        child: Stack(children: <Widget>[
          Container(color: Colors.grey),
          Center(child: Text(widget.name, style: TextStyle(fontSize: 30,))), 
          Positioned(
            right: 6.0, bottom: 6.0,
            child: CircleAvatar( 
              backgroundColor: widget.isSelected ? Colors.black38 : Color(0x00000000),
              child: Icon( widget.isSelected ? Icons.check : null, 
              size: 36,
              color: Colors.lightBlue
            ))),
          ]),
      ),);}
}
```

# 解説
複数選択するために List< bool> を使い setState() を実行します。すると GridView 全体が再描画されて画面が点滅したようになってしまいます。
そこで GridView の個々のアイテムを StatefulWidget にします。アイテムには、自身の isSelected と 親を参照する selectList の2つを持たせるのがポイントです。タップすると自身の isSelected だけが再描画されます。selectList も変更しますが再描画には影響しません。

# まとめ
GlidView で選択する度に、画面がすべて再描画されてしまう問題の解決法を紹介しました。Flutter 初心者です。今回の解決法を調べるためにいくつものサンプルを試しました。setState() についてや、StatefulWidget と StatelessWidget の違いなど、急がば回れでかなり勉強になりました。
wordpressで子テーマをつくる

# やること

wordpressで子テーマをつくる際に必要な初期設定をまとめる

- 親テーマと違うことをstyle.cssで宣言
- functionに子テーマのstyleを読み込むように設定

# 子テーマを作る際の流れ

- 子テーマは基本的には親テーマとの際の部分だけかくという形。親テーマは常にwordpress内にインストールしていないといけない
- 子テーマにするメリットは親テーマが自動更新がかかってもその影響で勝手にファイルが消えたりしないこと
- 下記は必須だがほかは必要ファイルのみ用意する
  - style.css
  - functions.php

参考資料
「初心者でも3分でわかる！WordPressの子テーマの作り方」
https://freesworder.net/wordpress-child-theme/

# style.cssで子テーマと明記

```css:style.css
/*
Theme Name:{子テーマの名前}
Template:{親テーマの名前}
*/
```

# functionsの記述

```php:functions.php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
}
```
上記で親テーマのcssを読み込み、子テーマのcssも読み込むようになる

# 参考資料

https://newstd.net/basic/12882

# その他注意

## 子テーマのimgの表示方法

http://idobata.co.jp/blog/%E5%AD%90%E3%83%86%E3%83%BC%E3%83%9E%E4%BD%BF%E7%94%A8%E6%99%82%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%96%B9%E6%B3%95%EF%BC%88%E3%83%91%E3%82%B9%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/

```php
<img src=”<?php echo get_stylesheet_directory_uri(); ?>/images/sample.jpg” />
```

## 各ページの役割

http://galileo-venus.com/2020/05/29/20200525_wpthema/#8_single_php
２台目レーザー彫刻機

Neje Master2の改造機は順調に動いてはいるのですが、
ちょっとのところでエリアが小さい（170x170mm）のと、
ベース板がないのがどうしても使いにくいと感じてしまいます。
最近40Wの半導体レーザーが市場に出てきていて、
アクリル５mmを２～３パスで切断できる動画にどうしても抗えず
新しいレーザー彫刻機（加工機？）を作ることにしました。

なかなかセンスの良い機体が公開されていたので、
ありがたく使わせていただくことに。
https://www.thingiverse.com/thing:4699432

細かいところ（アクリル板部品の厚みや形状）を、
入手しやすいように修正しました。
https://grabcad.com/library/laser-grbl-machine-1

コントローラーはMaster2改造機と同じくGrbl_esp32を使用。
最初からTMC2209が搭載されているもの。
https://www.tindie.com/products/33366583/tmc2209-4-axis-grbl_esp32-cnc-controller/

まずはパーツ集めから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/f938cc57-d9a4-7cab-a70d-beee65390e89.png)
getattrを使った新規作成 or 更新処理

OneToOneのモデルの新規作成、更新処理を書いてたらへんなバグ踏んだのでメモ。


# 前提

```python
class Parent(models.Model):
    pass


class Child(models.Model):
    parent = models.OneToOneField(Parent, on_delete=models.CASCADE)
```
こんな感じの1対1のモデルがあり、すでにChildがある場合は更新、ない場合は新規作成したい。

# 結論

```python
parent = Parent.objects.get(id=1)
child = getattr(parent, 'child', None) or Child(parent=parent)
# ...中略...
child.save()
```

こう書く。

# 蛇足

やりたいことを愚直に書くとこんな感じ。

```python
parent = Parent.objects.get(id=1)

if Child.objects.filter(parent=parent).exists():
    child = parent.child
else:
    child = Child(parent=parent)
# ...中略...
child.save()
```

リレーション先の存在確認は `hasattr` でできるので、 if文はもう少し短くなる。

```python
if hasattr(parent, 'child'):
    child = parent.child
else:
    child = Child(parent=parent)
```

三項演算子で書くと1行にまとまる。

```python
child = parent.child if hasattr(parent, 'child') else Child(parent=parent)
```

## 失敗コード

getattr使えば更に短くなると思って以下のように書いた。

```python
child = getattr(parent, 'child', Child(parent=parent))
```

新規作成時には問題ないが、更新時にsaveすると例外が出た。

```
django.db.utils.IntegrityError: UNIQUE constraint failed: my_app_child.parent_id
```

getattrの第3引数（デフォルト値)の評価は判定前に行われるらしく、 `Child(parent=parent)` の時点で
`OneToOneField` なので `parent.child` がすでに設定されているものから新しく作られたものに差し替えられてしまうのが原因っぽい。

```
# すでに child.id=1 のオブジェクトが紐付け済み
>>> parent.child
<Child: Child object (1)>

# 戻り値は `parent.child` だが、第3引数の評価が先に行われるので `parent.child` が新しく作ったオブジェクトになる
>>> getattr(parent, 'child', Child(parent=parent))
<Child: Child object (None)>
>>> parent.child
<Child: Child object (None)>
```

`Child(parent=parent)` はリレーションがない場合だけ実行してほしいので、結論の通り短絡評価使えばシンプルに書ける。  
ただし、getattr使う場合はデフォルト値の指定がなくてリレーション先のオブジェクトがないと `RelatedObjectDoesNotExist` の例外が飛ぶ。

```
>>> parent2 = Parent.objects.create()
<Parent: Parent object (2)>

>>> hasattr(parent2, 'child')
False

# デフォルト値がないと例外吐く
>>> getattr(parent2, 'child')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File ".../django/db/models/fields/related_descriptors.py", line 421, in __get__
    raise self.RelatedObjectDoesNotExist(
my_app.models.Parent.child.RelatedObjectDoesNotExist: Parent has no child.

# デフォルト値渡してあげると大丈夫
>>> getattr(parent2, 'child', None)

```
mkdir を使う時は -p オプションがオススメ！


## なぜ mkdir -p をお勧めするか。

親ディレクトリにが存在しない場合に、親ディレクトリを作成してくれるからです。

### 解説

今まで `mkdir` を使う時は、オプションなしで実行していました。

ただ、下のケースで、`hello` ディレクトリがない場合は、エラーが出てしまいます。

```
$ mkdir hello/workspace
mkdir: hello: No such file or directory
```

`-p` をつけると、親ディレクトリも作成してくれます。

```
$ mkdir -p
$ ls
hello/workspace
```

## 結論

`mkdir` を親ディレクトリ込みで実行する時は、その場所に親ディレクトリがあることを想定しているので、どんな時でも、`$ mkdir -p` で実行して良いと思います。