OmniAICreator/Qiita-1.07M huggingface dataset:
スプリントをOutlookのカレンダーに追加するVBScript

SAFeをやっているとスプリントをOutlookのカレンダーに予定として追加したくなります。

スプリントの名前、開始日、省略可能な終了日をパラメータとする``Sprint`` 関数を呼び出してこの作業を自動化しました。
終了日を省略したら開始から2週間で終了としました。

ご自由にお使いください。

```Visual Basic:Sprint.vbs

Option Explicit
Const olAppointmentItem = 1
Const olFree = 0
Dim objOutlook
Set objOutlook = CreateObject("Outlook.Application")

Sprint "IV-A", CDate("2022/08/16"), Null
Sprint "IV-B", CDate("2022/08/30"), Null
Sprint "IV-C", CDate("2022/09/13"), Null
Sprint "IV-D", CDate("2022/09/27"), Null
Sprint "IV-IP", CDate("2022/10/11"), Null
Sprint "V-A", CDate("2022/10/25"), Null
Sprint "V-B", CDate("2022/11/08"), Null
Sprint "V-C", CDate("2022/11/22"), Null
Sprint "V-D", CDate("2022/12/06"), Null
Sprint "V-IP", CDate("2022/12/20"), CDate("2023/01/16")

' Add an sprint appointment
' sName: subject line
' dtStart:  start date of the sprint
' dtEnd (optional): end date of the sprint, default = dtStart + 14 days

Sub Sprint(sName, dtStart, dtEnd)
    Dim objSprint
    Set objSprint = objOutlook.CreateItem(olAppointmentItem)
    objSprint.Subject = sName
    objSprint.Start = dtStart
    If IsNull (dtEnd) Then
        dtEnd = DateAdd("d", 14, dtStart)
    End If
    objSprint.End = dtEnd 
    objSprint.AllDayEvent = True
    objSprint.ReminderSet = False
    objSprint.BusyStatus = olFree
    objSprint.Save
End Sub
```
心理的安全性のあるチーム・職場・会社の理想とは？ by エンジニア

# 知らないことを認められる

知らないことを知らないと認めても良い文化がある。
知らないと認めたことでバカにされたり、下に見られるということがない。

自分が知らないことは謙虚に受け止め、人に教わることが出来る。

もちろん日々のキャッチアップや、Google検索は大前提である。


>「nuxtってなんですか？？？美味しいの？？？」

# 間違うことが許される

人はたまには間違うこともある。いやよくある。むしろエンジニアは間違いの連続である。
たとえ熟練のプログラマでも知らないことの方が遥かに多い。

だが自分が何か間違った時に、その間違い自体に過剰に罪悪感を抱くことがない。責められることもない。
間違いを素直に認めることの方が重要視される。

もちろん自分が間違ったことをしてしまったり、発信してしまった時は、必要な訂正はすぐにする。
大きな間違いやミスリードをしないように注意するのは大前提である。

>「すいません、サーバーのデータ飛ばしちゃったんですけど…」

# 雑談ができる

各人のキャリアや仕事の力量に関わらず、気軽に人と話せる。
仕事での力量が話のしやすさと比例しない。

「新入りは黙ってろ」「仕事できないやつは黙ってろ」というような風土がない。

仕事は仕事、雑談は雑談と切り分けられている。

>「ちょいスタバ行こうや！」

# ブリリアントジャーク(優秀だけど有害な人)がいない

偉そうにする人がいない。
権限があることで増長する人がいない。



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rubyの変数展開

シングルクォーテーション('')は変数展開が行われない。

変数展開を行う理由は、自動で#to_sが働くから。
#to_sとは、文字列ではない値を文字列に変換するメソッド。

変数展開は、文字列連結と違い、数値 + 文字列の連結ができる。
git cloneで共同開発やり方初心者必見

# 本記事について

この記事にたどり着いた人はこう思っていると思います。
「そもそもなにがわからないかわからないし、難しい単語多すぎて調べてもわからない・・・」
この記事はそんな人達に簡単にですが流れをお教えします！

__今回はgit cloneについてお話します。__

ちなみに、今回gitインストールやgithub登録については完了しているものとします。

# 使用環境
・mac
・vscode

# そもそもgitやgithubはなんなのか？

**Gitとは**
簡単に言えばファイルやフォルダ、コードの変更を自分のPCに保存しておくものです。(これをバージョン管理といいます。)

**GitHubとは**
簡単に言えば上で紹介したgitにて自分のPCに保存したものをインターネット上に保存しておくものです。

　
　
やることとしては、
・共同でファイルを編集したかったり、github上で使ってみたいファイルがあった場合に自分のPC上にそのファイルをコピーして持ってくる。　
　
　
まずご自身のPCでターミナルまたはエディタ(vscodeなど)でターミナルを開きそのgit管理したいファイルにターミナル上で移動してください。

## githubからほしいURLを持ってくる。
まずgithubでその使いたい記事に行き
![スクリーンショット 2022-06-19 21.25.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701052/61e5ac87-563c-a383-79d1-51884208ad53.png)

Codeの部分をクリックしてください。

そうすると、こんな感じになっていると思います。
![スクリーンショット 2022-06-19 21.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701052/6a6a9f6e-3114-26b2-eead-77327b82afc9.png)



このgithub上のURLの部分をコピーします。

## 次に自分のターミナルに移動してコピーして行きます。
ご自身のPCでコピーしたものをを保存したいファイルまで移動します。
```
git clone 先程のURL
```
といった感じで入力してください。

Cloning into 'docker_test'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.
こんな感じになればエラーもなく実行できています。

# push,fetchの確認
これは何かと言いますと、要はgithubに保存とgithubから取得する場所の確認です。
~~~
git remote -v
~~~
上記実行すると現在紐付いているgithubの確認ができます。
git cloneしたURLと一致すればOKです！


ここまでで、共同開発する上では完了です。
ここからブランチを切って実際に作業してみてください。

## 最後に
ここまでお付き合いいただきありがとうございます。
端的にはなりますがこんな流れになります。
まだまだ色々とできることがありますので実際に動かしながら学んでいきましょう。
FlutterでRealmのデータの一部を更新する方法

結論から言うと、Realmオブジェクトを呼び出して、realm.writeのタイミングで変えたいデータを修正すればOKです。

## まずはRealmモデルクラス作成

    class UserInfoModel {

      late Realm realm;

      //↓ Realmモデルの名前
      UserInfo getById(int id) {

      final userInfo = realm.find<UserInfo>(id)!;
      return userInfo;
      }
    }

## Realmモデルクラスの呼び出し方

※データがある前提です。

    UserInfo userInfo = UserInfoModel().getById(0);

## データの更新処理

UserInfoに年齢というカラムがある場合を想定してます。

    userInfo.realm.write(() {
    　　　　　　　　　　　　　　　　　　　　　　　　//↓Realmのカラムに合わせる    
    　　　　userInfo.年齢 = 25;

    　　　　print('年齢を変更しました。');

    });

## まとめ

  UserInfo UserInfo = UserInfo(0);

みたいな感じで呼び出して更新しようとしても、更新されなくてなんでやろってなってたんですけど、そもそもインスタンス（初期データ）を作れてなかったり凡ミスがあったりして結構詰まったので、これからもRealmは使うと思い、忘備録です。

Flutterで開発してて、Realmのカラムを更新したいけど、やり方がわからないなんてかたの参考になれば幸いです。

#### ついでにデータベースの作成方法が知りたい方はこちらをどうぞ。

https://qiita.com/celcior0913/items/99525e84201fac60c194

#### Android Studioを使っててRealmのパスの場所が知りたいという方はこちらをどうぞ。

https://qiita.com/celcior0913/items/55c67847f2c26bdda837
開放-閉鎖の原則でカレー作り

カレー作り、好評？の第2弾

### こんにちは、Javaおじさんのシキムです。


40才目前で、プログラム工学に興味を持ったので本や記事で読んだ難しい話を
咀嚼して簡単な言葉で語りたいと思います。

-----

今回は、**開放-閉鎖の原則(Open-Closed Principle**というものについてです。

ざっくりと、、、

インターフェースなどで新しいことを追加するときには簡単に（開放）、
ただし、すでに作ってあるものには手を出すなということです(閉鎖)。

詳しくは偉い人の話を読んでください。

ここでは、この原則をカレー作成装置に見立てて解説したいと思います。

では、さっそくカレー作成装置を作りましょう。


今回は真カレー装置をさっそく用意してしまいたいと思います。
-----

**人参下ごしらえ装置**
　入れるもの：
　　　人参

　作業：
　　　①人参の皮を剥く
　　　②人参を切る

　出てくるもの：
　　　下ごしらえ人参

**ジャガイモ下ごしらえ装置**
　入れるもの：
　　　ジャガイモ

　作業：
　　　①ジャガイモの皮を剥く
　　　②ジャガイモのを切る

　出てくるもの：
　　　下ごしらえジャガイモ

**玉ねぎ下ごしらえ装置**
　入れるもの：
　　　玉ねぎ

　作業：
　　　①玉ねぎの皮を剥く
　　　②玉ねぎを切る

　出てくるもの：
　　　下ごしらえ玉ねぎ

**肉下ごしらえ装置**
　入れるもの：
　　　肉

　作業：
　　　①肉を切る

　出てくるもの：
　　　下ごしらえ肉

**カレー作成装置**
　入れるもの：
　　　人参、ジャガイモ、玉ねぎ、肉

　作業：
　　　①人参下ごしらえ装置に、人参を入れて下ごしらえする。
　　　②ジャガイモ下ごしらえ装置に、ジャガイモを入れて下ごしらえする。
　　　③玉ねぎ下ごしらえ装置に、玉ねぎを入れて下ごしらえする。
　　　④肉下ごしらえ装置に、肉を入れて下ごしらえする。
　　　⑤具材を鍋に入れて煮込む
　　　⑥カレールーを入れる
　　　⑦ご飯にかける

　出てくるもの：
　　　カレー

真カレー装置完成です。
-----
しかし、最近はとても暑くなってきました。(執筆時6月)
なので、さっぱりと**夏野菜カレー**にしましょう。

そこで、トマトを追加したいと思います。
まずは、サクッと下ごしらえ装置を新たに作ってしまいましょう。

**トマト下ごしらえ装置**
～詳細は、人参などと同じなので省略～

あとは、これをカレー装置に組み込んで夏野菜カレー作成装置を作れば完成です。
----

**夏野菜カレー作成装置**
　入れるもの：
　　　人参、ジャガイモ、玉ねぎ、トマト、肉

　作業：
　　　①人参下ごしらえ装置に、人参を入れて下ごしらえする。
　　　②ジャガイモ下ごしらえ装置に、ジャガイモを入れて下ごしらえする。
　　　③トマト下ごしらえ装置にトマトをいれて下ごしらえする。
　　　④玉ねぎ下ごしらえ装置に、玉ねぎを入れて下ごしらえする。
　　　⑤肉下ごしらえ装置に、肉を入れて下ごしらえする。
　　　⑥具材を鍋に入れて煮込む
　　　⑦カレールーを入れる
　　　⑧ご飯にかける
　
出てくるもの：
　　　夏野菜カレー

夏野菜カレー装置完成です。
----
ですが、これを作るためには折角完成しているカレー装置の中に装置を追加して作り直す必要があります。
これでは、解放-閉鎖している作りとは言えません。


ここは、カレーにも夏野菜カレーにも対応できる新たな装置を作っていきましょう
----

今回は装置の前に新たなものを用意しました。

**野菜BOX作成キット**
　　容器
　　剥き方ノート(白紙)
　　切り方ノート(白紙)

野菜BOXキットを組み立てることで、1種類の野菜とその剥き方や切り方を書くためのノートの入ったBOXを作ることができます。キットを使ってどんどん野菜BOXを作っていきましょう。

**人参BOX**
　　容器：人参
　　剥き方ノート：ピーラーで皮を剥く
　　切り方ノート：輪切りに切る

**ジャガイモBOX**
　　容器：ジャガイモ
　　むき方ノート：芽に気を付けて皮を剥く
　　切り方ノート：乱切り

**玉ねぎBOX**
　　容器：玉ねぎ
　　剥き方ノート：白くなるまで皮を剥く
　　切り方ノート：半月切り

**トマトBOX**
　　容器：トマト
　　剥き方ノート：湯向き
　　切り方ノート：四等分に切る

このままだと運びにくいので野菜BOXコンテナを用意してその中に詰めてしまいましょう

**野菜BOXコンテナ**
　　人参BOX
　　ジャガイモBOX
　　玉ねぎBOX
　　トマトBOX

今度こそ、カレーにも夏野菜カレーにも対応できる新たな装置を作っていきましょう
----
**野菜下ごしらえ装置**
　入れるもの：
　　　野菜BOX

　作業：
　　　①容器の野菜を剥き方ノートと同じように剥く
　　　②皮を剥いた野菜を切り方ノートと同じように切る

　出てくるもの：
　　　下ごしらえ野菜

**肉下ごしらえ装置**
　入れるもの：
　　　肉

　作業：
　　　①肉を切る

　出てくるもの：
　　　下ごしらえ肉

**カレー作成装置**
　入れるもの：
　　　野菜BOXコンテナ、肉

　作業：
　　　①野菜下ごしらえ装置に野菜BOXコンテナのBOXを１つづつ入れて下ごしらえする
　　　②肉下ごしらえ装置に、肉を入れて下ごしらえする。
　　　③具材を鍋に入れて煮込む
　　　④カレールーを入れる
　　　⑤ご飯にかける

　出てくるもの：
　　　カレー

真カレー装置(夏)の完成です。
----
どうでしょうか？これなら好きな野菜をBOXに入れるだけで、レンコンカレーもサツマイモカレーも**自由自在**に作れるようになりました。

以上が、おじさんなりの開放-閉鎖の原則の理解です。


　
　
　
　







**カレー作りシリーズ**

https://qiita.com/sikimuOji/items/a99fdc2de406a0f42fac
雀魂の画面から画像認識で対戦情報を持ってくる（Vol. 1）

[≪前の記事](https://qiita.com/xenepic_takku/items/f25a97735a90546d1451)   　　　　　　　　　　　　　　　　　　 　　　　　　[次の記事≫](https://qiita.com/xenepic_takku/items/42d9850c0095fbf51559)
# 前回までのあらすじ
> 1. 雀魂の画面のスクリーンショットを持ってくる
> 1. OpenCVのテンプレートマッチングでスクショから牌姿情報を持ってくる

という方針を決めたのはいいものの、いきなり1. でつまづく。
雀魂のスクショを取ってこれないのである。
[参考にした記事](https://qiita.com/hiro0156/items/51ab267f4f47f2f8fe76)だとスクショなんてスッと取ってきてるんだけど、node.jsになると途端に難しいらしい。

# スクショ難民
さて、色々調べた時に巡回したページを挙げる。

> C#での画面キャプチャの取得方法を徹底解説！
https://www.fenet.jp/dotnet/column/language/4633/

> Pythonでスクリーンショットを取得して指定フォルダに保存する
[URL長いので省略](https://office54.net/python/app/python-screenshot-pillow#:~:text=%E3%81%99%E3%82%8B%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82-,%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95,%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82&text=%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88,%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A7%E4%BF%9D%E5%AD%98%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)

特に二番目のやつ見てくださいよ奥さん。
Pythonならわずか数工程で画面のスクショが保存できるらしいですよ。
1. pipで`pillow`をインストールする
1. `ImageGrab`モジュールをインポートする
1. `ImageGrab.grab().save('screenshot.jpg')`を実行

今までの苦労はなんだったんだー！？

ちなみにこんなサイトもありました。
https://www.redbubble.com/shop/node+js+pillows
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381769/e573f85e-4002-be83-b96f-65a701d53be8.png)

node.jsのpillow(まくら)

なんつって

閑話休題

# pythonとの連携

> 【Node.js入門】python-shellによるNode.jsとPythonのデータ連携方法まとめ
https://www.sejuku.net/blog/84736

こちらによると、python-shellというモジュールを使用すると、node.jsからpythonのコードが実行できるようです。
少し光明が見えてきました。

すなわち
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381769/a0c781d3-1744-0cda-2d9e-de06a345c8b2.png)
こーんな感じの実装が（多分）できるという訳ですね！

ただ、前回のteratailの回答者様曰く、
> 速度は落ちますが、C++のソースコードをWASMの技術で無理やりJavaScriptに加工したOpenCV.jsなるものも存在します。

とのことなので、下のようにpythonの方でopenCVを使った方が素直？高速？になる気もします。
先人の教えもありますし。
ちらっと見たところpythonからnodeにわたす情報は、python側でもprintで渡すみたいなんですよね。
画像情報をprintするのって、なんか気持ち悪いし、


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381769/fb4e0d22-cc44-d877-6d5b-6950878a0096.png)

# 今後の方針
1. pythonとpillowを使ってスクリーンショットのデータを取得
1. pythonとopenCVを使って牌姿情報を取得
1. node.jsとpython-shellを使って、pythonコードを実行し牌姿情報を受取る

という流れで進めたいと思います！
[次回](https://qiita.com/xenepic_takku/items/42d9850c0095fbf51559)はpythonとpillow回です。
キャリアに迷ったらクロスSWOTで分析！

## はじめに
<font color="Red">「転職活動、今のままでいいのかなぁ...」
「自分のキャリアってどうしたらいいのかなぁ...」</font>
と悩んでいるあなた！

**クロスSWOT**を使えば解決できるかもしれませんよ！
この記事では、現状分析+解決策のアイデアをガッツリ出せるフレームワークである**クロスSWOT**について解説します。

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- プログラマー転職活動中の人
- キャリアに悩んでいるプログラマー

## 結論
クロスSWOTなら、現状分析+解決策のアイデアをガッツリ出せるのでおすすめ！

## SWOTとは？
SWOT(スウォット)とは、4つの項目について分析するためのフレームワークです。
SとWは内的要因、つまり自分のこと。
OとTは外的要因、つまり他人、会社、業界、社会などです。
<font color="Red">※あくまで分析のためのフレームワークで、意思決定をするためには、後述の「クロスSWOT」が必須なので、勘違いしないように！</font>

### SはStrength(強み)=自分のプラス要因
「強み」は自分の得意なことです。
下記のような基準で項目を出していきましょう。

:::note
- 自分の好きなこと
- 自分の得意なこと
- やっていて楽しいこと
- 他人よりも上手にできること
- 他人に褒められること
:::
### WはWeakness(弱み)=自分のマイナス要因
「弱み」は自分の不得意なことです。
下記のような基準で項目を出していきましょう。

:::note alert
- 自分の嫌いなこと
- 自分の不得意なこと
- やっていて辛いこと
- 他人よりも上手にできないこと
- 他人に叱られること
:::
### OはOpportunity(機会)=社会のプラス要因
「機会」は自分にとって有利な環境の変化です。
下記のような項目で、自分にプラスになる要因を出していきましょう。

:::note
- 友人
- 家族
- 会社の同僚、先輩、上司
- 会社の方針
- 業界の動向
- 社会、政治の動向
:::
### TはThreat(脅威)=社会のマイナス要因
「弱み」は自分にとって不利な環境の変化のことです。
下記のような項目で、自分にマイナスになる要因を出していきましょう。

:::note alert
- 友人
- 家族
- 会社の同僚、先輩、上司
- 会社の方針
- 業界の動向
- 社会、政治の動向
:::

### 実際にSWOTで「35才の未経験プログラマー転職」を分析
上記のように解説されても、ピンと来ませんか？
では、私が35歳で未経験からプログラマーに転職した際のSWOT分析を下記に示します。
![SWOT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/af313a3d-c621-61e5-188a-f5e987a450fa.png)
はい、こんな感じです。
とりあえずこれだけでは、何をしたら良いか、わかりませんね...。
次に、この4項目を活用して「クロスSWOT」をやってみたいと思います！

## クロスSWOTとは？
SWOT分析で書き出した4項目を活用して、意思決定をするためのフレームワークです。
SWOTの4項目をそれぞれ掛け合わせて、適切な戦略を考えます。

### SO戦略は「競争優位性をさらに高めるための戦略」
自分の強みをさらに活かすアイデアのことです。
正直、ここはそんなに出てこない...というのが現実です。
あったらラッキー、くらいの気持ちが良いと思います。
### ST戦略は「競合と差別化する戦略」
環境は厳しいが、自分の強みを活かせるポイントを探し、競合に勝っていく戦略です。
35才転職戦略の例でいくと、「**周囲は若くて元気な転職者だらけだが、年齢と経験を重ねた自分にしかできないことがあるはず！**」と実績をアピールしていきました。

### WO戦略は「自分の弱点をカバー・改善する戦略」
自分にとって弱みだったとしても、環境は上向きなので、なんとか誤魔化す・カバーして乗り切るための戦略です。
35才転職戦略の例でいくと、「マイナーな条件は妥協する」「とにかくいっぱい面接を受ける」などで年齢や未経験という弱点をカバーしよう、というものです。

### WT戦略は「ダメージを最小限に抑える戦略」
自分にとって弱みであり、環境も悪い場合、負ける可能性が高いです。
WT戦略は勝つための戦略、というよりは、被害を最小限に抑える、押さえ案、という位置づけです。
35才転職戦略の例でいくと、「36才までに内定がなければ、プログラマーは諦める」「他の方法で収入を上げる」などが挙げられます。

### 実際にクロスSWOTで「35才の未経験プログラマー転職」を分析
さて、SWOTで分析した項目を活用して、実際にクロスSWOT分析してみましょう。
![クロスSWOT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/2c27f3c4-cf4d-eb56-fb97-558ec0ac5c41.png)
かなり具体的なアイデアがたくさん出てきました。
クロスSWOTでは、「アイデアをたくさん出す」ことが目的なので、これでOKです。
<font color="Red">「じゃぁどれからやろうかな...」</font>と悩んだ時には、[ペイオフマトリクス](https://qiita.com/YutaManaka/items/26f8d142d5d2f3eef459)という優先順位付けのフレームワークがあるので、ご活用ください。
また、優先順位が決まったけど、<font color="Red">「いつまでにどうやれば良いのだろう...」</font>と悩んでいるあなたには目標設定のフレームワークである[SMART](https://qiita.com/YutaManaka/items/e6b31aa13f5fd90bb2f5)がおすすめです。

## おわりに
現状を分析し、解決するアイデアを出すクロスSWOTについてまとめました。

## 参考記事
[クロスSWOT分析とは？　フレームワークと使い方を徹底解説！](https://the-owner.jp/archives/4613)
[SWOT分析とは？現状分析をした上で戦略策定に繋げる方法](https://www.profuture.co.jp/mk/column/9580#:~:text=%E3%82%AF%E3%83%AD%E3%82%B9SWOT%E5%88%86%E6%9E%90%E3%81%A8%E3%81%AF,%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%8C%E3%81%82%E3%82%8B%E3%81%8B%E3%80%82)
Rails関連で記事にするほどじゃないけど、まとめておきたいものを列挙する感じの記事です

# マイグレーションファイル



マイグレーションファイルは、データベースを生成する際の設計図になるものです。


また、マイグレーションファイルを実行することで、記述した内容に基づいたデータテーブルが生成されます。





# リレーショナルデータベース 【relational database】 RDB / 関係データベース



リレーショナルデータベースとは、データベースの構造の一つで、一件のデータを複数の属性の値の組として表現し、組を列挙することでデ


ータを格納していく方式。属性を列、組を行とする表（テーブル）の形で示されることが多い。最も普及している方式で、単にデータベースとい


った場合はリレーショナルデータベースであることが多い。
BFV, CKKS, TFHE って何が違うんですか？②

って聞かれたときに答えられなかったので，これを機に整理してみます．

この記事は [勝手に秘密計算アドベントカレンダー](https://qiita.com/kenmaro/items/3e8a124ce4306fe040dc) の8日目の記事です．

下記の論文の解説をメインに行なっていきます．

P.-E. Clet, O. Stan, and M. Zuber: "BFV, CKKS, TFHE: Which One is the Best for a Secure Neural Network Evaluation in the Cloud?", In: International Conference on Applied Cryptography and Network Security. Springer, Cham, 2021. p. 279-300.

記事全体として，全３部作を予定しています．

第１回：[BFV, CKKS, TFHE って何が違うんですか？①](https://qiita.com/0917laplace/items/a3ba76a889a80662fddc)

今回（第２回）は
- 論文の背景やアブスト
- 関連研究
- 前提知識

の３本立てで書いていきます（実は新しく解説することがほとんどない）．

**突貫で書いてしまった部分もあるので，大いに誤りを含む可能性があります．誤字・脱字レベルでも構いませんので，ご指摘ください．
また，予告なしに内容の加筆や構成の変更を行うことがありますが，読みやすくするためのものですので，ご容赦ください**

# 論文の背景やアブスト
- どういう背景や課題・モチベーションがあって，
- どのようなアイディアのもとで，
- どのような結果が得られたのか

を整理します．

背景・課題
格子暗号ベースの準同型暗号で有名な方式として，BFV, CKKS, TFHE の３つがある．
これらの方式が，neural network のどのような場面で有用なのかを検証する．

アイディア
SEAL と TFHE（公式のやつ）を使って，インスタンスは固定した場合の実行速度とメモリなどを比較した

結果
TFHEが良さげ（的に読めたんですが，読み進めて違いそうなら修正します）
＊それぞれがどの場面で優れているかもまとまっている（ように見える）ので，それもわかったら追記します

それらを元に各章を整理すると，次のようになります:

1章：イントロ
2章：関連研究
3章：前提知識（準同型暗号メイン）
4章：準同型暗号の neural network への応用（実装方針とか使うライブラリとか）
5章：結果
6章：まとめ

つまり，2・3・4章が「準備段階」で，5章が一番言いたいことになります．

# 関連研究
新しくここであまり解説することがありません（説明放棄）．

この辺の話は，[秘密計算エンジニアを始めて１年が経った。](https://qiita.com/kenmaro/items/416657efca2ff296169b%E3%80%80) がよくまとまっているので，そちらを参照してください．

2.4 では BFV-TFHE というキメラ方式について触れられていますが，こちらは [秘密計算エンジニアを始めて２年半が経った。](https://qiita.com/kenmaro/items/48059dd60f79e80f5ef8%E3%80%80) を参照してください．

# 前提知識
準同型暗号には Leveled(演算回数が制限されている)と Fully（演算回数に制限がない）などのタイプがあり，格子暗号ベースの準同型暗号には BFV, CKKS, TFHE などの方式があります．
これらそれぞれの方式の中身は前回見ました・・・ということで3.4まで終わり．

3.5 Batching
BFV, CKKS には Batching と呼ばれる手法を使います．
これは，1つの暗号文に複数の暗号化された平文を乗せることで，SIMD演算を可能とする手法のことです．
＊参照：[Cheon, J., Kim, A., Kim, M., Song, Y.: "Homomorphic encryption for arithmetic of approximate numbers", In: International Conference on the Theory and Application of Cryptology and Information Security. pp. 409–437 (11 2017).](https://eprint.iacr.org/2016/421.pdf)

SIMD 演算ができるようになると，neural network を高速に動かせるようになります．

------------------------
今回の内容はここまでです．ここまでご覧になってくださった方々ありがとうございます！
【PHP基礎⑮】ループ処理-5. 2ずつカウントアップ

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を入力させ、0から入力値を超えない値まで2ずつ増やして表示するプログラムを作成しなさい。


# コード
```php
$a = intval(fgets(STDIN));
for($m = 0; $m < $a; $m = $m+2){
    echo "$m \n";
}
```

↓「10」と入力

# 結果
```
0 
2 
4 
6 
8 
```



↓では、入力値から0を下回らない値まで2ずつ減らす場合は？

```php
$a = intval(fgets(STDIN));
for($m = $a; $m > 0; $m = $m-2){
    echo "$m \n";
}
```


結果
```
10 
8 
6 
4 
2
```

☆2ずつ減らす場合の増減式は、
　＄m = ＄m-2 または＄m-=2
Railsでの一覧機能作成手順

# はじめに
初心者なりにまとめたものになりますので、諸先輩方からは何書いてんだおめえと感じる部分があると思います。
そう感じた際は、お手数ですが、コメント頂けると幸いです。


内容としては、 ***コントローラー作成からマイグレーション***になります。

## 目次
- ***一覧機能を実装する手順***
-routes.rbファイルの編集
-ルーティングの確認
-コントローラーの作成
-indexアクションの定義
-ビューファイル作成・編集
-ビューの実装確認
-モデルの作成
-マイグレーションファイルの編集
-マイグレーションの実行

## routes.rbファイルの編集
- ***app/config/routes.rbに存在するファイルの編集***
初期は
Rails  ------ do
~~
end
が存在し、~~の箇所へ下記のコードを入力
※作成したばかりの時は、~~の中身は削除する
# 
    get 'posts', to: 'posts#index'
    HTTPメソッド 'URIパターン', to: 'コントローラー名#アクション名'

***解説***
HTTPメソッドは行いたいリクエストの種類で異なる
URIパターンはリクエストのパスで異なる(URLのような物)
コントローラー名とアクション名はリクエストに対して行いたい処理で異なる

## ルーティングの確認
ターミナルを開き、上で編集したアプリのディレクトリへ移動
下記のコードを実行する。
 
    rails routes
実行後、下記のコードが表示されていればルーティングができている
 
    Prefix  Verb  URI Pattern       Controller#Action
    posts   GET   /posts(.:format)  posts#index
　
## コントローラーの作成
ターミナル上でアプリ名のディレクトリにいることを確認（`pwd`）し、下記コマンドを実行
 
    rails g controller posts 
    rails g controller (コントローラー名の複数形)      
　
## indexアクションの定義
VS Code上の***posts_controller.rb***で、下記のようになっている事を確認
 
    class PostsController < ApplicationController

    ~~

    end

~~の部分へ以下へ書き換える。

    class PostsController < ApplicationController

    def index  
    end

    end
　
## ビューファイルの作成・編集
***app/views/posts***に、***index.html.erb***のファイルを作成する
作成したファイルに以下を記述する。

    <h1>トップページ</h1>
作成後、`rails s`でサーバーを起動し、下記URLへアクセス
http://localhost:3000/posts
トップページと表記されたページがアクセス出来ればOK

## モデルの作成
ターミナル上で作成したアプリ名のディレクトリにいることを確認（`pwd`）し、下記コマンドを実行

    rails g model post
    rails g model (モデル名の単数系)

　
## マイグレーションファイルの編集
モデル作成時に作成される、マイグレーションファイルを編集する
***db/migrate/20XXXXXXXXXXXX_create_posts.rb***に作成されているファイルが以下のようになっている事を確認(20XXXXXXXXXXXXは作成時に決まる）


    class CreatePosts < ActiveRecord::Migration[6.0]
      def change
        create_table :posts do |t|
          --
          t.timestamps
        end
      end
    end
--となっているところへ、下記を記述

    t.text :memo
    t.(追加したいカラムへ入れる値の型) :(カラムの名前)

***解説***
t.text :memo のような記述は追加したいカラムの数が複数あれば、改行する事で、複数のカラムを追加出来る
追加したいカラムへ入れる値の型はいくつか種類があり、下記へ記す

カラムの型：値の説明
***integer***：数値
***string***：文字（短文）
***text***：文字（長文）
***boolean***：真or偽
***datetime***：日付と時刻

## マイグレーションの実行
ターミナル上で、作成したアプリ名のディレクトリにいることを確認（ `pwd`）し、下記コマンドを実行
実行後は、Sequel Proへマイグレーションファイルで編集したカラムが追加される

    rails db:migrate


# おわりに
以上、自分の備忘録&アウトプットも兼ねて書いて見ました。
ご覧頂き、ありがとうございました
国際開発でバグの再発を防止する難しさと対処法

# はじめに

お客様にバグを流出させると、お客様によっては、そのバグを直すだけでは済まず、
再発防止策を求められることがあります。
こうした文化はトヨタ系を中心に浸透しています。

しかし、その文化のない国際開発に適用するには障壁が大きいと感じます。
本稿では、そう思った理由と、どうすればよいかについて提言します。

# バグの再発防止を外国人には根づかせるのは難しい？

筆者は、ヨーロッパやインドなどとの共同開発に参加しており、
そうした人たちの作りこんだバグに関しては、再発防止までたどり着くのに難しい気がしています。

実際に何が起きたかといえば、

- バグのチケットが切られると、それと関連づかない形で、要は「こっそり」とコードを直された。
 バグチケットは、再現せずとして無効化された。
- 発注者が受注者に再発防止策を報告するよう求めると、
「流出原因はテスト不足、再発防止はテスト追加」などという、深掘りの足らない報告が出てきた。
- このような報告を突き返すと
「これは時間の無駄であり、このようなことをやっていると開発が進まない、それでもいいのか」
と受注者に抗議された。

# バグの再発防止はなぜ外国人には難しいか？

なぜこのようなことが起きたのでしょうか？
あくまで仮説です：

- バグは個人の評定を下げる **不名誉** な実績であり、
**身の安全を脅かす** ものであるという価値観がある。
- だから、個人的に責められることを回避し、
できることなら、バグの存在を葬り去りたいという心理がある。
- なぜなぜ分析などの **やり方が分からない**。 時間がかかるのでやる価値も分からない。
- 受注者と発注者は契約のもとに対等であり、
一方的に発注者のいうことを聞く義務はないという価値観。
- 済んだことを分析するという後ろ向きな仕事より、
履歴書で書けるような新しいものを作り出すことに時間を割きたいという価値観。
ましてや自分の作っていない時期に作りこまれたバグならなおさら。

# バグの再発防止が日本では根づいたのはなぜか？

バグの再発防止が日本では根づいたのはなぜでしょうか。
日本の会社では、文化的背景が次のように異なります：

- 個人が責められず、バグが原因で首になる心配はない。
- バグをきっかけに組織的教訓を得られれば、 **長期的には** 元が取れるはずと考える。バグを作りこんだ人でさえ手柄と言える文化がある。
- なぜなぜ分析のノウハウは、簡単に文書で、あるいは短時間に口頭で伝えられるものではなく、 **長期的に安定した雇用関係** にある先輩から後輩に組織的に伝承されてきたものである。
- 受注者と発注者は対等ではなく、受注者は基本的に発注者に **逆らえない** 。
- 日本の伝統的な履歴書の書式は業績をアピールするものではない。
- **長期的に安定した雇用形態**で、後ろ向きな仕事にも安心して、かつ従順に取り組む。

理想論が入っているように読めるかもしれませんが、
これが、再発防止がうまく回っている会社が満たすと筆者が想定する条件です。

# ではどうするか？

バグの再発防止を外国人には根づかせるのは難しいとしたら、どうするのがいいか。
ずばり提案します：

**バグに焦点を当てず、チームを良くしようという目的で、ふりかえりをする。**

信頼し合っているメンバーが、チームでよかったこと、悪かったことを挙げて、そこに対策を打つようにすれば、
無駄を省いたり、気持ちよく仕事ができるようになって、生産性があがって、
そこで、品質を上げるための作業もできるようになるので、品質を上げることにつながります。
ソラカメ開封の儀

# はじめに
ALGYAN7周年IoT祭2022のイベントのプレゼントで、ソラカメを頂きました。
その開封の儀となります。

# ソラカメとは
ソラカメは、Atom Cam2を使ったクラウドカメラサービスです。
Atom Cam2の箱の中には、買ってすぐ使えるようカメラ本体、コンセント、ケーブルが同梱されています。

![IMG_20220611_200805~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76959/466ca925-b92f-006e-114c-3b5cc3738ac1.jpeg)

# ソラカメの設定
スマートフォンに、GooglePlay経由で[ATOMアプリ](https://play.google.com/store/apps/details?id=com.atom.cam&hl=ja&gl=US)をインストールします。
ATOMアプリを起動し、デバイス追加をします。
<img width="400" alt="Screenshot_2022-06-11-20-12-21-693_com.atom.cam.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76959/3804d795-6844-4279-9853-407ac470d036.jpeg">


ATOM Cam2を選択し追加をします。
<img width="400" alt="Screenshot_2022-06-11-20-12-48-941_com.atom.cam.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76959/d4e47ffe-0558-d5db-6d2a-d77df9f6c226.jpeg">


<img width="400" alt="Screenshot_2022-06-11-20-12-54-858_com.atom.cam.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76959/f0a75a23-af39-226b-ad22-4811d18cd8f4.jpeg">


本体には、MicroSDカードを挿入するスロットと、その隣にリセットボタンが付いています。
リセットボタンを押します。


<img width="400" alt="IMG_20220611_201009.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76959/dab18075-6ba6-c6fc-efd9-2aa0b4902d8f.jpeg">

そのまま、画面に従い設定していくと接続完了です。

<img width="400" alt="Screenshot_2022-06-11-20-13-58-367_com.atom.cam.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76959/dd29ae21-596c-8c7c-aea7-73f58f091543.jpeg">

# ソラカメを使ってみる
小型かつ、暗視カメラもついているということで、使い道を考えてみました。
モバイルバッテリーでも駆動することから、ラジコンに乗せてFPVしてみました。

![IMG_20220622_211636~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76959/d5769682-33c0-0caa-9805-4f9c6f5539bc.jpeg)

画面更新は、俊敏性がないですが、ゆっくり操作する分には、使えなくもない感じでした。
プレイ動画は、部屋が散らかっており、掲載できずすみません。

# その他
モバイルバッテリー内蔵のスーツケースを使っているのですが、カメラを貼り付けて置き、回線接続はテザリングを使い
、少し場を離れる時の監視役として使えないかなと思いました。

以上です。
【ActiveReports】Formatイベントに共通処理を追加する

# はじめに
ActiveReportで帳票を作っているときにDetailのFormatイベントにて共通して書きたいコードがでてきた。

イベントに毎回書くと、書き忘れつながるので毎回書かなくても良い実装はできないかと考えました。

<a id="#Chapter1"></a>
# 環境
.NET Framework C# 7.3
ActiveReport 12.0J

<a id="#Chapter2"></a>
# 実装方法
共通処理を実施用のベースクラスを作成し、各レポートクラスに継承させることで実装しました。


```C#:ReportBase.cs
    public class ReportBase : GrapeCity.ActiveReports.SectionReport
    {
        public ReportBase()
        {
            this.ReportStart += ReportBase_ReportStart;
        }

        private void ReportBase_ReportStart(object sender, EventArgs e)
        {
            foreach (Section section in this.Sections)
            {
                if (!(section is Detail)) continue;

                section.Format += Section_Format;
            }
        }

        private void Section_Format(object sender, EventArgs e)
        {
            Debug.Print("共通イベント");
        }
    }
```

```C#:TestReport.cs
    public class TestReport : ReportBase 
```

# 工夫した箇所
ベースのコンストラクタでは継承先のInitializeComponent()が実行されていないのでthis.Sectionsの中身が空になっています。
InitializeComponent()を実行後に
```C#
foreach (Section section in this.Sections)
{
     if (!(section is Detail)) continue;
     section.Format += Section_Format;
}
```
部分を実施したいため、いったんReportStartにイベントを追加してそのイベント内にて上記のコードを実施するようにしました。
Salesforce　ユーザ一覧取得

# salesforceのユーザ情報とライセンスをSOQLとデータローダでCSVファイルとして取得

前提：API V54

## ユーザ一覧とライセンスを取得するSOQL

取得項目は適宜変更する。
下記の例では
* ProfileやProfileに紐づくライセンス名称、数を一度に取りたかった（冗長であるが。）
* 「UserPermissionsSupportUser」・・・Service CloudeユーザーのチェックボックスをONにしているか知りたかった。（コンソールを利用する。機能ライセンス）
* 他の機能ライセンスを取得したい場合は項目を追加する。例をいくつか記載
    * UserPermissionsKnowledgeUser:ナレッジユーザであるか
    * UserPermissionsMarketingUser：マーケティングユーザであるか


**Userに対するユーザライセンス、機能ライセンスの割当状況**
```
Select 
    Name, 
    Department,
    IsActive,
    UserPermissionsSupportUser,
    Profile.Name,
    Profile.UserLicense.Name,
    Profile.UserLicense.LicenseDefinitionKey,
    Profile.UserLicense.TotalLicenses,
    Profile.UserLicense.UsedLicenses,
    Profile.UserLicense.status
From User
ORDER BY
    Department,Name
```
項目の説明はHelpを参照
https://developer.salesforce.com/docs/atlas.en-us.226.0.object_reference.meta/object_reference/sforce_api_objects_user.htm


## ユーザ一覧と権限セットライセンスを取得するSOQL

* 権限セットライセンスを保持しないユーザを出力しないので注意
* where条件は適宜変更

権限セットライセンスの割当状況
```
SELECT 
   Assignee.Name, 
   Assignee.Department,
   Assignee.Profile.Name,
   Assignee.Profile.UserLicense.Name,
   PermissionSetLicense.MasterLabel,
   IsDeleted,
   PermissionSetLicense.Status,
   PermissionSetLicense.PermissionSetLicenseKey,
   PermissionSetLicense.TotalLicenses,
   PermissionSetLicense.UsedLicenses,
   CreatedDate
FROM 
   PermissionSetLicenseAssign
WHERE 
   IsDeleted = false
AND 
   Assignee.IsActive = true
ORDER BY 
   assignee.username
```
項目の説明はHelpを参照

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_permissionsetlicenseassign.htm

## ユーザ一覧と権限セットを取得するSOQL

* 権限セットを保持しないユーザを出力しないので注意
* where条件は適宜変更 
* 権限セットに紐づく権限セットライセンス、プロファイルを取得
    * PermissionSet.License.Nameが空の場合は「なし」
    * PermissionSet.License.Nameが空でない場合
        * TYPE=Regularの場合、権限セットライセンス
        * TYPE=Profileの場合、Profile（ユーザライセンス）
```
SELECT 
   Assignee.Name, 
   Assignee.Department,
   Assignee.Profile.Name,
   Assignee.Profile.UserLicense.Name,
   PermissionSet.Label,
   PermissionSet.Name,
   PermissionSet.Type,
   PermissionSet.License.Name
FROM 
   PermissionSetAssignment
WHERE  
   Assignee.IsActive = true 
ORDER BY 
   assignee.username
```

項目の説明はHelpを参照

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_permissionsetassignment.htm






## Dataloaderで実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905516/40b2c943-fbcf-058e-5c2e-c11dc62310c8.png)

## 無事取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905516/120942c9-219d-5180-6ceb-bbf2d1d8c218.png)

## 終わりに
ライセンス、プロファイル、権限セット、権限セットライセンス。。。
混乱します。

おしまい
Apacheサービスが再起動に失敗したため調べてみた

### はじめに
httpdのコンフィグファイルの設定変更後、httpdサービスの再起動を実施したら失敗したため、メモとして記事にまとめました。

### 事象を記載しました

httpdを再起動しました。
```ゲストOS
# systemctl restart httpd
```
httpd.serviceがfailedになっていました。

シスログ(/var/log/messages)を確認した所、何らかの原因により、httpdのプロセスの停止に時間がかかってタイムアウトした後、プロセスがKILLされているため、プロセス自体は停止されているように見えます。
5分後に再度、httpdサービスの再起動を実施したら、事象が解消しました。
```ゲストOS
# less /var/log/messages
  httpd.service stop-sigterm timed out. Killing.
 httpd.service: main process exited, code=killed, status=9/KILL
 Unit httpd.service entered failed state.
```
### まとめ

基本的には、再度httpdのサービスの再起動した際に、上手くいったら問題ないと思いますが、
httpdサービス上でステートフルなアプリケーションが動作している場合は、ファイル書き込みなどの何かの処理が途中で中断されている可能性があるため、問題ないか確認が必要になると聞いたことがあります。

また、本事象とは別のケースですが、
httpdのコンフィグファイルの設定ミスや、
目視では気づかない余計なスペース等がコンフィグファイルに入っていて、httpdサービスの再起動に失敗することがあります。
コンフィグファイルを更新後、「httpd -t」コマンドで、文法の間違いがないか確認後、httpdサービスを再起動することをおすすめします。

※上記でいうコンフィグファイルとは、/etc/httpd配下のconfファイルのことです。

また、httpdサービスの再起動は、システムに影響を与える作業のため、実施する際は事前調整が必要な作業だと思いました。
【Sass】リンクの時だけ、hoverをする

# 概要
同じパーツでも、リンクの時、リンクではなく通常パーツの時があるかと思います。
そんな時に使用できるコードを書きます。

```sass
&[href] {
    @media screen and (min-width: 768px) {
        &:hover {
            background-color: blue;
        }
    }
}
```

リンク（href）の時、且つスマホのサイズ以上の時、で設定をしていきます。
Amazon QuickSightとは

<h3>Amazon QuickSightとは</h3>

Amazon QuickSightは、AWSが提供しているビジネスインテリジェンス（BI）サービスで高速かつ簡単に情報を可視化することが可能になる。
Amazon QuickSightでは、S3やRDSなどのAWSサービス上にあるデータや、ローカルのCSVなどを使用して分析を行うことができる。
さらに、機械学習（ML）機能を活用した、異常検出や数値の予測など、より高度な分析を簡単に行うこともできる。

BI（ビジネスインテリジェンス）
ビジネスインテリジェンスとは、ビジネス分析やデータマイニング、データビジュアライゼーション、データツールやインフラストラクチャ、またはベストプラクティスなどを組み合わせて、組織がよりデータに基づいた意思決定を行えるように支援すること。

<h3>SPICEとは</h3>

QuickSightでは、CSVファイルやTSVファイルなどのデータソースを「SPICE」というデータ領域に取り込むことで分析が可能になる。

SPICEとは
・Super-fast（超高速）
・Parallel（並列）
・In-memory CalculationEngine(インメモリ計算エンジン）
の頭文字をとったもの
SPICEは、QuickSightの専用エンジンで、SPICEにデータソースをアップロードすると、すぐに情報の分析や可視化を行えるようになる。SPICEでは、分析やビジュアルを変更・更新するたびに、データを再取得する必要がなく、効率的に分析を行うことができる。
Docker ComposeでMySQLとphpMyAdmin

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

services:
  mysql_server:
    image: mysql
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: 'Asia/Tokyo'
    volumes:
      - ./docker/db/data:/var/lib/mysql  
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  phpmyadmin_server:
    image: phpmyadmin
    container_name: phpmyadmin_container
    depends_on:
      - mysql_server
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS='mysql_server'
    ports:
      - "8080:80"
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
```

[http://localhost:8080/](http://localhost:8080/)にて
サーバ: mysql_server
ユーザ名: root
パスワード: root
DeepLの翻訳がおかしかったので原因を調査してみた

## できごと
数字の雑学を取得できるAPIを利用し、そのレスポンス値(英文)をDeepl APIを利用して日本語に翻訳をする、という機能を開発していたところ、おかしな日本語に翻訳されてしまった。

参考：数字の雑学が取得できるAPI
https://rapidapi.com/divad12/api/numbers-1/

参考：DeepL API
https://www.deepl.com/ja/pro-api?cta=header-pro-api/


## どんな日本語になったのか？

+ the number of players on a soccer team on the field at a time as well as in a cricket team
⇒「頭数」("11"に関する数字の雑学)

+ the sapphire wedding anniversary in years of marriage
⇒「こんきゅうさいねんさい」("45"に関する数字の雑学)

**訳がわからないことになっている**

ちなみに以下のDeepL翻訳ツールでも同様の結果になるため、API自体が問題ではないことがわかる。
https://www.deepl.com/translator

ちなみにGoogle翻訳ではおおよそ期待通りの翻訳結果を取得できた。
the number of players on a soccer team on the field at a time as well as in a cricket team
 ⇒「一度にフィールドにいるサッカーチームとクリケットチームの選手の数」 (Google翻訳)

## 原因と解消方法
文末にピリオドを打つことによって期待した結果を得られることが分かった。
正しく文章を認識することができていなかったことが原因のようだった。

<ピリオドをつけた場合の翻訳例>
+ the number of players on a soccer team on the field at a time as well as in a cricket team.
⇒「サッカーチームやクリケットチームのように、フィールドに一度にいる選手の数。」

+ the sapphire wedding anniversary in years of marriage.
⇒「サファイアの結婚記念日を結婚年数で表したもの。」
(結婚45周年のことをサファイア婚式と言うのですね)

プログラムとしては、取得した英文の最後に「.」をつけてDeepL APIを呼び出すことで期待した値を取得することができるようになった。

## おわりに
DeepLは翻訳の精度が非常に高いことで有名だが、
英語翻訳を行う際には、文末にピリオドがついていることを確認をしておいた方が良さそうだ。
【#8 エンジニア転職学習】Linux基礎　テキスト処理コマンド

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

連日になりますが、Linuxの基礎を進めましたので自分なりに気になったポイント等をまとめていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日はテキスト処理コマンドをやりました。昨日パイプラインの部分で出てきたフィルタ（標準入力を受け取り標準出力できるコマンド）の詳細でした。

* wc
* **sort　←Topic!!**
* uniq
* cut
* tr
* tail（head）

# sortコマンド
行単位でファイルの中身をソートするコマンドです。名前の通りですね。デフォルトはASCIIコード順に並べ替えます。
他のコマンドもでしたが、**出力結果がソートされているだけでファイルの中身は書き換えられていません**でした。

`sort`で一度並べ替え→`uniq -c`コマンドで重複している行をカウント→`sort -n`で出現回数順に並べ替える
というような組み合わせ方をしたりと使える場面が多そうです。

| コマンド | 内容 |
|:-:|:-:|
| sort  |  ASCII順に並べ替え |
|  sort -k Num | 指定した数字のフィールドを対象としてソート  |
| sort -n  |  文字列を数値としてソート |
| sort -r  | 降順にソート  |
| sort -u  |  重複行を1度だけ表示 |


使用している書籍はこちら↓

https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B072K1NH76/ref=sr_1_1?adgrpid=113196705062&gclid=Cj0KCQjwzLCVBhD3ARIsAPKYTcR4WAb_4QVrwuBM_1mIPMFsQ6kNDJ-o4yIofVSAI7_eHpWCeva8kKwaAstgEALw_wcB&hvadid=489559881279&hvdev=c&hvlocphy=1009363&hvnetw=g&hvqmt=e&hvrand=10125867468998217428&hvtargid=kwd-1152146940662&hydadcr=21814_10996132&jp-ad-ap=0&keywords=%E6%96%B0%E3%81%97%E3%81%84+linux+%E3%81%AE+%E6%95%99%E7%A7%91%E6%9B%B8&qid=1655473534&sr=8-1




# おわりに
最後までお読みいただきありがとうございました。
明日も引き続きLinuxの基本を進めていこうと思います。
アドバイス・応援コメント等いただけますと幸いです。
C# Linq  LinkEntities get EntityInfo

```csharp
public EntityCollection GetEntityInfo()
{
    DateTime dt = DateTime.Now;
    var today = dt.ToString("yyyy-MM-dd");

    EntityCollection result = _context.Service.RetrieveMultiple(
        new QueryExpression
        {
            EntityName = Account.EntityLogicalName,
            ColumnSet = new ColumnSet(new[] { "name" }),
            NoLock = true,
            Distinct = true,
            LinkEntities = {
                new LinkEntity
                {
                    LinkToEntityName ="new_entity1",
                    LinkFromEntityName ="account",
                    LinkToAttributeName ="account",
                    LinkFromAttributeName ="accountid",

                    EntityAlias =ENTITY1,
                    JoinOperator =JoinOperator.Inner,
                    Columns = new ColumnSet(new[] {"name","detail","response_date"}),
                    LinkCriteria ={
                        Conditions ={
                            new ConditionExpression("possible_flg",ConditionOperator.Equal,false),
                            new ConditionExpression("response_date",ConditionOperator.LessThan,today)
                        }
                    },

                    LinkEntities = {
                        new LinkEntity
                        {
                            LinkToEntityName ="new_entity2",
                            LinkFromEntityName ="new_entity1",
                            LinkToAttributeName ="share",
                            LinkFromAttributeName ="shareid",

                            EntityAlias =ENTITY2,
                            JoinOperator =JoinOperator.Inner,
                            Columns = new ColumnSet(new[] {"createdby", "team", "user", "processid"}),
                            LinkCriteria ={
                                Conditions ={
                                    new ConditionExpression("possibility",ConditionOperator.Null)
                                }
                            }

                        }
                    }
                }
            },
        });
    return result;
}
```
Python3エンジニア認定基礎試験模試メモ

・ビルドイン関数dir()
　モジュールが定義している名前を確認することができる。

・print('円周率は%5.3fである。'%math.pi)
　%5.3f の 5 が文字列で、5桁に満たなければ左にスペースを挿入して5 桁にする。
　3 は小数点以下の数字を 4 桁目で四捨五入して 3 桁にする。
　f は小数であることを示す。
　% は古い書式指定文字列の文法。

・raise
　好きなタイミングで例外を発生させることができる
　raise 例外名("メッセージ")

・コマンドライン引数を取得するためのモジュール
　sys

・ログを取得するためのモジュール
　logging

・仮想環境にインストールされたすべてのパッケージを表示するpipのオプション
　pip list

・引数と同じ要素を検索し、最初の要素を削除
  remove()

・t = 123,345,'test' と等価の記述
　t = (123,345,'test')

・シーケンスデータ型についての説明
　タプルは「immutable」であり、 アンパッキングしてアクセスすることができる。

・sys.pathの初期化で参照しないもの
　スクリプトが存在するフォルダのシンボリックリンク先

・json.dumpsの実行結果
　データを別の型に変換する（Python オブジェクトから JSON 形式のテキストを生成する）

・[str(round(pi, i)) for i in range(0, 5)]　の出力結果
　['3.0', '3.1', '3.14', '3.142', '3.1416']
　round関数は第一引数に元の数値、第二引数に桁数（何桁に丸めるか）を指定する
　※第二引数を指定すると浮動小数点float型となる

・Pythonにおけるタブ補完について
　変数とモジュール名の補完はインタプリタの起動時に自動で有効になっており、[Tab]キーで補完機能が呼び出せる。

・例外の処理の説明として誤っているもの
　else節は全てのexcept節より前でなければならない

・Pythonの変数に関する記述
　関数内で変数に代入を行うと、その値がローカル変数のシンボル表に記録される

・正規表現ツールを提供するモジュール
　re

・Pythonの対話型インタプリタの中で存在するもの
　IPython

・print(range(5))
 range(0, 5)

・変数宣言における偽(False)とみなされるオブジェクト
　bool型のFalse
　None
　数値（int型やfloat型）の0, 0.0
　空の文字列''
　空のコンテナ（リスト、タプル、辞書など）[], (), {}

・d = 'dive\ninto\ncode\t' print(len(d)); //15
  改行コードは2文字で1文字扱い

・ビルトイン関数のシンボル表の確認方法
  import builtins → dir(builtins)
Herokuにサブディレクトリをデプロイするのに命削った話

## この記事について

以下のようなプロジェクトでサブディレクトリ(server/)をherokuにデプロイする話です

今回のプロジェクトではgoを使ってます

```dir:directory
├─data
├─db
├─docker
├─front
├─scraping
└─server
    ├─domain
    ├─infrastructure
    ├─interfaces
    │  ├─controllers
    │  └─database
    ├─usecase
    └─utils
```

<br>

## Docker環境のherokuへのよくあるデプロイ

トップディレクトリにmainファイルが存在し、そこにDockerfileやheroku.ymlが存在する

この場合だといろいろ設定して```git push heroku master```でいけそう

<br>

## 今回の場合

frontもserverも同じリポジトリで管理している

serverディレクトリのみをherokuでデプロイしたい

## 手順

以下のサイトに詳しく書いてあります

https://qiita.com/tanakin_prog/items/508e88546d7130e33617

このサイトではサブディレクトリをデプロイする話がメインなので省略しつつ進めます

<br>

heroku createでアプリ作成

```
heroku create
```

<br>

postgresql使う人は用意しましょう

addsonでsql用意 

```
heroku addons:create heroku-postgresql:hobby-dev
```

<br>

psqlに接続してデータベースを作りたい場合は下記の記事を参考にしてください

https://amateur-engineer-blog.com/heroku-postgres-basic-data-operation/

<br>


herokuの環境変数まわり

dbとの接続先などを取得しときましょう

```
heroku config
```

以下の記事が参考になりました

https://qiita.com/mzmz__02/items/64db94b8fc67ee0a9068

<br>

```
heroku container:login
```

イメージのデプロイ前にloginもしておきましょう

<br>

Dockerfileのあるディレクトリに移動しイメージのデプロイ

```
heroku container:push web
```

<br>



### 参考ファイル

以下はpushしたいサブディレクトリ内に用意しました

```yaml:heroku.yml(例)
build:
  docker:
    web: Dockerfile
run:
  web: go run main.go
```

```Dockerifle:Dockerfile(例)
FROM golang:1.17.0-alpine

RUN apk update && apk add git

WORKDIR <work_dir>
COPY . .
```

<br>

あとはherokuのmasterにサブディレクトリを指定してpushします
以下のコマンドはトップディレクトリで実行しましょう
(subfolderは自分の場合だとserverになります)

```
git subtree push --prefix <subfolder> heroku master
```

```
heroku open
```

<br>

参考記事

https://stackoverflow.com/questions/39197334/automated-heroku-deploy-from-subfolder

<br>

### どこで沼にはまったか

自分のプロジェクトでは```Dockerfile```を別ディレクトリで管理してたため

サブディレクトリをpushした場合、```Dockerfile```が含まれていませんでした

それに気が付かずかなり沼ってしまった...😢

<br>

## 参考記事
- https://qiita.com/yuki_0920/items/2123bb86d2f96caebed0
laravel.logの権限エラー

昨日まで動いていたラインBOT
webhookでメッセージが飛んできたら反応するプログラム
git pullで新しい差分を取り込んだら動かなくなった。

```
 The stream or file "/var/www/laravel/storage/logs/laravel.log" could not be opened in append mode
```
こんなエラーが
logに書き込む権限がないらしい

最終的には以下のコマンドで直りました。

```
sudo chmod -R ugo+rw storage
```
めでたしめでたし

（けどなぜ急に権限エラーが出るようになったんだろう・・・）
tailwindcssの環境構築ができない

npm startした時にエラーが生じる

解決方法
1.ファイル名が.tsになっているか確認。TailWindCss.tsにする。
2.ファイルの場所を確認。craco.config.jsはルート直下に作成する。
3.craco.config.jsのpostcssをpostcssOptionsに変える。

この3つで解決した。
2.
https://wa3.i-3-i.info/word18682.html

3.
https://github.com/facebook/create-react-app/issues/11777


エラー内容
2.
Loading PostCSS "postcss-preset-env" plugin failed: Cannot find module 'postcss-preset-env' Require stack:

3.
TypeError: match.loader.options.plugins is not a function
    at extendsPostcss (C:\Development\Open Source\Learning Hub\react\node_modules\@craco\craco\lib\features\webpack\style\postcss.js:54:51)
    at overrideLoader
Date Functions

Date functions in SOQL queries allow you to group or filter data by date periods such as day, calendar month, or fiscal year.

例：
SELECT CALENDAR_YEAR(CreatedDate), SUM(Amount) 
FROM Opportunity 
GROUP BY CALENDAR_YEAR(CreatedDate)

SELECT CreatedDate, Amount
FROM Opportunity
WHERE CALENDAR_YEAR(CreatedDate) = 2009

CALENDAR_MONTH()
CALENDAR_QUARTER()
CALENDAR_YEAR()
DAY_IN_MONTH()
DAY_IN_WEEK()
DAY_IN_YEAR()
DAY_ONLY()→Returns a date representing the day portion of a dateTime field.
FISCAL_MONTH()
FISCAL_QUARTER()
FISCAL_YEAR()
→This function is not supported if your organization has custom fiscal years enabled. See "Define Your Fiscal Year" in the Salesforce Help.
HOUR_IN_DAY()→Returns a number representing the hour in the day for a dateTime field.
WEEK_IN_MONTH()
WEEK_IN_YEAR()

Link:
https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_date_functions.htm
雀魂の画面から画像認識で対戦情報を持ってくる（Vol.0）

# はじめに

配信で雀魂の大会などを開催してると、今の点数状況などをチームの点数等と合わせてかっこよく表示したり、有効待ち牌を表示したりできたらかっこいいのになぁと思うことが多々ありました。
しかし、雀魂がそういう類のAPIを公開しているという情報は見つかりませんでした。
[牌譜屋](https://saki.sapk.ch/)では対戦状況を取得しているし[ソースコード](https://github.com/SAPikachu/amae-koromo/)も公開しているのでAPI的な感じでデータを持ってくることは可能なのだろうけど、なんかちょっとグレーゾーンっぽいのと、タイムラグがありそうだったので、今回は画像認識で取得してみようと思いました。
ただ、そっちの知識はほぼ皆無なのでめちゃくちゃ手探りの軌跡をまとめたものになります。
突っ込みながらご参考までにどうぞ。

# 目標
目標としては、次の5つの情報を雀魂の画面から持ってくること！
1. 自分の牌姿（観戦モードなら相手の牌姿も）
1. 捨て牌
1. 点数状況
1. 風、本場
1. 対戦者名

# 最終目標
イメージとしては![janntama001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381769/f7d2dc22-66c2-1a05-d1aa-7254e705896f.png)
この画面から

![janntama002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381769/9a409e08-8ff5-b153-0c32-311ba098306e.png)
こんな感じの情報を生成できるようになること。
（点数とか間違ってたらすんません）



# 開発環境
OS : Windows10
言語 : Javascript(node.js)
エディタ : VScode

使用言語ですが、最終的にはOBSで点数などを表示したいと思っているので、HTMLに組み込みやすいnode.jsで開発していこうと思います。
まぁ、一番使い慣れてるからという理由も大きいですがｗ

# 構想
さて、何から初めていいか分からなかったのでまずは「雀魂　画像解析」とかで検索（ポチッ。
一番最初にヒットしたのがこちらの記事でした。
> ネット麻雀(雀魂)をopenCVと機械学習で自動化した話 - Qiita
> https://qiita.com/hiro0156/items/51ab267f4f47f2f8fe76

`openCV`というライブラリのテンプレートマッチングという機能を使って、画像から牌姿情報を得ることに成功しています！
えーすご！私のやりたいことそのまんまじゃん！！
一応openCVとテンプレートマッチングについて軽く触れておくと
> - openCVとは
> あのインテル様が開発した、画像や動画に関する処理をまとめたライブラリ。
> なんと無料で使うことができる！さすいんてる
> - テンプレートマッチングとは
> 画像認識技術の一つで、画像Aの中から画像Bと似てる部分を探し当てることができる。 
> つまり、雀魂の画面の中から一索の画像を検索したりすることができる。すげー

これは勝ったわ、ガハハと思ったのも束の間、
こちらの記事、Pythonで書かれておりました。
まぁ画像処理とかPython強いもんな...

ただ調べてみるとopenCVは別にPython専用のライブラリではない模様。
じゃあjavascriptでもopenCV使えるんでね！？と思って検索して見つけたのがこちら。

> OpenCV.jsをJavaScript/Node.jsで使ってみた
https://dev.classmethod.jp/articles/using-opencvjs-with-javascript-and-nodejs/

どうやらnode.jsでもopenCVが使えるらしいので、こちらの記事のサンプルを動かしながら次のような手順で進めていこうと決めました。

1. 雀魂の画面のスクリーンショットを持ってくる
1. OpenCVのテンプレートマッチングでスクショから牌姿情報を持ってくる

> ただし1つ目の記事で、テンプレートマッチングを使用した場合判定に2.5秒ほどかかると合ったので、処理時間によってはテンプレートマッチングではなく別の手法を検討します。

# 実装
## 1. スクリーンショットの取得
「node.js スクリーンショット」等で検索すると、`Puppeteer`という単語がめちゃくちゃヒットします。
読み方は「パペティア」だそうです。読めねー

> - Puppeteerとは
> Google先生が作ったNode.js用のライブラリ。
> 同Google先生作のWebブラウザ「Chrome」に備わっているヘッドレスブラウザ機能を利用したライブラリで、
> Webページの操作や入出力処理、ページの画面キャプチャなどができる。
> - ヘッドレスブラウザとは
> ブラウザを開かないブラウザ（は？）
> 要するにプログラム中の操作のみでブラウザに関する様々な処理ができるため、
> Webページのテストの自動化等で使用される。

このPuppeteerライブラリを使うと、
1. ヘッドレスブラウザを起動する
1. ヘッドレスブラウザで目的のURLに遷移する
1. そのページのスクショを撮る

という感じでプログラムが動くのですが、私が欲しいのは
今、自分が開いて麻雀を打っている画面のキャプチャなので、
Puppeteerだとそれは出来ないんですよね。
実際、
> Node.jsライブラリのPuppeteerでスクショしてみた - Qiita
https://qiita.com/hisashi_matsui/items/6452770eb2528f38ca80

を参考に雀魂のスクショを撮ってみましたが、真っ黒な画像が得られただけでした。
同じような理由で`webshot`, `Nightmare`, `html2canvas`といったライブラリも今回は適しません。
`grabzit`は有料なので見送ります。

で、続く解決策ですが、現在見つかっておりません！！！笑
ただ、teratilで質問してみたところめちゃくちゃ親切な回答者様が色々教えてくださったので、こちらをもとに進めていきたいと思います。

> Node.jsで雀魂の画面キャプチャを保存する方法 - teratail
https://teratail.com/questions/u5a0m8em9mco0a#reply-kvu510k14kref6

次回に続く...（のか？）

（追記）続きました：[次回](https://qiita.com/xenepic_takku/items/20a7f502d6cea2ea5be8)
SSMからCloudwatch Agentをインストール

# はじめに
以前CloudwatchでEC2のメモリ・ディスク監視だけを行う方法を調べたのですが、

https://qiita.com/talomina/items/a3c172f87ec4532f5d86

その後の調べで比較的簡単にSSMのセットアップができることが分かったので、

https://qiita.com/talomina/items/28c66d7500a5cee36dc1

SSMからCloudwatch Agentをインストールする方法を検証しました。


# 内容
作成したCloudWatchエージェントを導入してメモリとディスク監視のメトリクスをCloudWatchへ届けるところまで実施します。

:::note info
CloudWatchに届いたメトリクスは15か月間消すことができないようなので注意しましょう。
:::

## 事前準備
* EC2に下記のポリシーがアタッチされたロールを付与します。
    * ```CloudWatchAgentServerPolicy```
    * ```AmazonSSMManagedInstanceCore```
* SSMから対象のEC2に下記をRun CommandしてSSMエージェントをUpdateします。
    * ```AWS-UpdateSSMAgent```

## パラメータストアにCloudWatchエージェントのconfig.jsonをセットする
パラメータストアは複数のEC2などから共通的に参照することができます。つまり```config.json```に記載するような設定を共有することができるのです。
1. SSMのメニューからパラメータストアを開く
1. パラメータストアの設定
    * 名前：```AmazonCloudWatch-agent-config```
    * タイプ：```文字列```
    * データ型：```text```
    * 値：config.jsonで作成された内容
1. パラメータの作成ボタンを押してパラメータを作成します。

<details><summary>値の例</summary>

```json:AmazonCloudWatch-agent-config
{
	"metrics": {
		"aggregation_dimensions": [
			[
				"InstanceId"
			]
		],
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"LogicalDisk": {
				"measurement": [
					"% Free Space"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"Memory": {
				"measurement": [
					"% Committed Bytes In Use"
				],
				"metrics_collection_interval": 60
			},
			"statsd": {
				"metrics_aggregation_interval": 60,
				"metrics_collection_interval": 10,
				"service_address": ":8125"
			}
		}
	}
}
```
</details>

## CloudWatch Agentのインストールと設定

1. Run Commandで```AWSEC2-ApplicationInsightsCloudwatchAgentInstallAndConfigure```を実行します。
1. 実行時にParameter Store Nameを上記で作成した```AmazonCloudWatch-agent-config```とします。

## CloudWatchにてメトリクス確認

CloudWatch上でメトリクスとして、上記で指定したインスタンスのメモリやディスク空き情報が取得されているか確認します。

# おわりに
EC2のディスクとメモリの監視ができてしまうわけですが、すごいところは
* 一度もEC2のOSにログインしないで設定できる
* WindowsもLinuxも関係なく設定できる
* 対象のEC2が何インスタンスあっても1回のRunCommandで設定できる

# 参考文献

https://blog.serverworks.co.jp/tech/2020/07/16/cwagent-config-json-to-ssm-parameter-store/

https://dev.classmethod.jp/articles/tsnote-support-cloudwatch-delete-metrics-launch-001/
Bulk API を使用するデータローダの設定

Bulk API は、多数のレコードを非同期で読み込みまたは削除するように最適化されます。この API は、並列処理を行い、ネットワーク往復数を少なくすることで、SOAP ベースの API よりも高速に動作します。デフォルトでは、データローダでは、レコード処理に SOAP ベースの API が使用されます。

レコードの挿入、更新、更新/挿入、削除、物理削除に Bulk API を使用するようデータローダを設定する手順は、次のとおりです。

データローダを開きます。
[設定] | [設定] を選択します。
[Bulk API を使用] オプションを選択します。
[OK] をクリックします。

メモ:
[一括 API に対して順次モードを有効にする] オプションをオンにすることもできます。並列処理を行うと、データベースの競合が生じる可能性があります。競合が激しいと、読み込みに失敗する可能性があります。順次モードでは、バッチが 1 つずつ処理されますが、読み込みの処理時間が長くなる可能性があります。
注意: データローダで [Use Bulk API (Bulk API を使用)] をオンにすると、レコードを物理的に削除できます。物理削除されたレコードはただちに削除され、ごみ箱から復元することはできません。
TransferTransactionのスキーマを読み解こうその２

## inlineを展開する

さて構造体に定義されない定数は設定できたので、
次はinlineで格納されているスキーマを展開しよう

```
# Send mosaics and messages between two accounts.
struct TransferTransaction
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)

	inline Transaction　// ここと
	inline TransferTransactionBody　// ここ
```

この二つを展開すると以下のようになります。

```

struct TransferTransaction
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)

# ここはTransactionの部分

# binary layout for a transaction
@size(size)
@initializes(version, TRANSACTION_VERSION)
@initializes(type, TRANSACTION_TYPE)
@discriminator(type)
@is_aligned
abstract struct Transaction
	inline SizePrefixedEntity
	inline VerifiableEntity
	inline EntityBody

	# transaction type
	type = TransactionType

	# transaction fee
	fee = Amount

	# transaction deadline
	deadline = Timestamp

# ここはTransferTransactionBodyの部分
inline struct TransferTransactionBody
	# recipient address
	recipient_address = UnresolvedAddress

	# size of attached message
	message_size = uint16

	# number of attached mosaics
	mosaics_count = uint8

	# reserved padding to align mosaics on 8-byte boundary
	transfer_transaction_body_reserved_1 = make_reserved(uint8, 0)

	# reserved padding to align mosaics on 8-byte boundary
	transfer_transaction_body_reserved_2 = make_reserved(uint32, 0)

	# attached mosaics
	@sort_key(mosaic_id)
	mosaics = array(UnresolvedMosaic, mosaics_count)

	# attached message
	message = array(uint8, message_size)
```

いっぱいいろんな新しい単語も出てきましたね。難しそう。

:::note
ジャガーさんのコメント
size(x): x フィールドが（可変長の）構造体のフルサイズを含むことを示す。


initializes(x, Y): xフィールドがY定数で初期化されるべきであることを示す。


discriminator(x [, y ]+): (x, ...y)プロパティがファクトリー生成時に識別器として使用されるべきであることを示す
（抽象構造に対してのみ意味を持つ）。


is_aligned: すべての構造体フィールドがアライメントされた境界上に配置されることを示す。

size(size) => sizeフィールドの値は構造体全体のサイズ(バイト)である。

initializes(version, TRANSACTION_VERSION) => versionフィールドはTRANSACTION_VERSIONの値で初期化される必要がある。

@discriminator(type) => ファクトリー作成時に、インスタンス化する具象クラスを区別するために、typeフィールドを使用する。
:::

https://github.com/symbol/symbol/blob/dev/catbuffer/schemas/symbol/transaction.cats#L5-L9

全体像としてはこんな感じです。

![スクリーンショット 2022-06-24 1.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/9bf95aa6-c096-a152-7152-8927dedceeab.png)

まぁこれだと結局トランザクションとトランスファートランザクションボディがどういう定義をされているのかわからないと
やっている意味がないので、次の記事はトランザクションの構造体を読み解いていきます

![スクリーンショット 2022-06-24 1.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/ae334dde-8ad0-5687-03b4-86a8f41478fd.png)