OmniAICreator/Qiita-1.07M huggingface dataset:
Google cloud compute engineからメールを送信する

# 初めに

Magento2の（テスト用）サイトをGoogle Cloud Compute Engineに構築しています。Magentoはいくつかのタイミングでメールを送信するため、Compute Engine上でメール送信できるようにしてあげます。

参考：[Googleによる説明](https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid)

# SendGridの登録

基本的にGoogleの手順通り行えばいいのですが、引っかかったのが下図の部分（「SendGridメールサービスに登録します」）。登録へのURLは下図マークしてある部分となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/251ae382-3da4-515f-1921-c52bcefcb4ab.png)

この画面に遷移します。「プロバイダで管理」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/f1fbb497-54a2-ad2d-a124-706ee986f8df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/3a2cfa29-783a-cb0a-e90b-9daa22c3c59f.png)

"Setting"->API Keys"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/638cbdc6-76d2-911a-28ce-96895f664208.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/e633cce8-ceef-a24c-2ecc-125a191ea45d.png)

"Create API Key"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/e9128a60-2869-53cd-1245-1769a75d86f1.png)
とりあえず"Full Access"を選択しておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/acabb9fa-6fc0-9ba6-f8c4-547b8ed75656.png)
この画面で表示されている（墨塗の部分）APIキーはここでしか確認できないので必ず記録しておきます。

# postfix

ガイドにある通り、Local onlyを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/488a3776-35cd-690d-5e1b-c19ee8ae9a9f.png)

## /etc/postfix/main.cf

ガイド通りに行う＋以下の行を変更する必要があります。```myhostname```をGoogle cloud compute engine上のDNS名に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/6d5d8b1a-7459-0f86-336f-1aba35755d7a.png)

そのあとでSendGrid側[ドメイン認証の設定方法](https://docs.sendgrid.com/ja/ui/account-and-settings/how-to-set-up-domain-authentication)通りに、Google Domains上のDNS情報を書き換えます。墨塗が多いですが、こんな感じの画面が出てくるので、それをGoogld Domains上にコピーしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/d8973e28-91e9-1238-b0d3-9fba18607302.png)

# SendGrid（Sender Authentication）

Sender Authenticationを実施します（僕の場合はDomain Authentication、Single Sender Verificationの両方を実施しないとうまくメールが送信できませんでした）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/d09d1124-c79c-9bfb-fe1d-4dd373bb83fe.png)


これでメールの送信ができるようになるはず、です。

# 自分宛のメール

上記の設定を行ったcompute engine に対してメールを送信する可能性がある場合は/etc/postfix/mail.cfの```mydestination=```を空欄にする必要があります。詳しくは[こちらの](https://qiita.com/myzkyy/items/cfb6b1f95eb6af6261ec)記事を参照してください。
UIから受け取ったZIPファイルをJavaで解凍し、展開する

# はじめに
.textを圧縮したzipファイルをUIからjavaに渡し、解凍➡テキストファイルの中身を一行ずつリストに追加する方法で詰まったため、実装方法を記載します。

### ソースコード
```java
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.File;

	public static List<String> zipKaito(MultipartFile uploadFile) {
		List<String> list = new ArrayList<String>();
		String line = null;
		BufferedReader br = null;

		try {
			File zipFile = new File(uploadFile.getOriginalFilename());
			zipFile.createNewFile();

			Charset c;
			c = Charset.forName("MS932");
			ZipInputStream ziStr = new ZipInputStream(new FileInputStream(zipFile), c);
			InputStreamReader iStr = new InputStreamReader(ziStr);
			br = new BufferedReader(iStr);
			for (ZipEntry ze = ziStr.getNextEntry(); ze != null; ze = ziStr.getNextEntry()) {
				while ((line = br.readLine()) != null) {
					System.out.println(line);
					list.add(line);
				}
				ziStr.closeEntry();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}
```

## 解説
・uploadFileという名前でUIから引数にわたってきたzipファイルを扱います。
・File.createNewFile()を扱うことで引数で渡ってきたzipファイルを作成いたします。
・ZipInputStreamで解凍するzipファイル用の入力ストリームを作り、InputStreamReaderで中身のテキストファイルを読み込みます。
・getNextEntryで次のエントリを取得し、BufferedReaderのreadLineを使ってテキストファイルを1行ずつ読み込み、都度リストに追加する形で実装を行いました。

### 文字コードについて
Charset cで指定しているように、文字コードの設定を適切に行わない場合にmalformedInputExceptionが起きてしまうことがあります。
ZIP解凍をjavaで対応する際、ZipInputStreamの第二引数に文字コードを指定することで回避する必要があり、今回の記事ではwindowsの標準日本語コードである「MS932」としました。
ファイルの文字コードにも注意する必要があります。。

# 終わりに
zipファイルの解凍についての記事はよく見られますが、UIからzipファイルを渡してjavaで解凍するというドンピシャな記事がなかったため今回投稿させていただきました。

# 参考
・MalformedInputException
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/charset/MalformedInputException.html

・クラス File
https://docs.oracle.com/javase/jp/7/api/java/io/File.html

・Java MS932とShift_JISの違い
https://itsakura.com/it-shiftjis-ms932

・Java言語で記述した ZIPファイル解凍アプリで MALFORMEDの例外が発生した
http://www.neko.ne.jp/~freewing/software/java_unzip_zipcoder_malformed_exception/

・ZipInputStreamから文字列を取り出す
http://blog.justoneplanet.info/2014/05/07/zipinputstream%E3%81%8B%E3%82%89%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99/
企業会計

# 問題１
### 企業の資産、負債及び純資産を表示し、企業の財政状態を明らかにするものはどれか？
#### 貸借対照表(Balance Sheet; B/S）
ある時点（決算日など）での```財政状態を明らか```にするための財務諸表。```資産```,
```負債```、```純資産```の3つを記載する。

# 問題２
### 当期の売上原価は何百万か。
#### 期首商品棚卸高とは？
```「期首時点の商品在庫」```のことです。
つまり、```棚卸資産として前期から繰り越され、翌期首において在庫として残っている```商品の金額が「期首商品棚卸高」なのです。
##### 出典
https://biz.moneyforward.com/accounting/basic/50014/#:~:text=%E3%80%8C%E6%9C%9F%E9%A6%96%E6%99%82%E7%82%B9%E3%81%AE%E5%95%86%E5%93%81%E5%9C%A8%E5%BA%AB%E3%80%8D%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82%0A%E3%81%A4%E3%81%BE%E3%82%8A%E3%80%81%E6%A3%9A%E5%8D%B8%E8%B3%87%E7%94%A3%E3%81%A8%E3%81%97%E3%81%A6%E5%89%8D%E6%9C%9F%E3%81%8B%E3%82%89%E7%B9%B0%E3%82%8A%E8%B6%8A%E3%81%95%E3%82%8C%E3%80%81%E7%BF%8C%E6%9C%9F%E9%A6%96%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E5%9C%A8%E5%BA%AB%E3%81%A8%E3%81%97%E3%81%A6%E6%AE%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%95%86%E5%93%81%E3%81%AE%E9%87%91%E9%A1%8D%E3%81%8C%E3%80%8C%E6%9C%9F%E9%A6%96%E5%95%86%E5%93%81%E6%A3%9A%E5%8D%B8%E9%AB%98%E3%80%8D%E3%81%AA%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82

#### 当期商品仕入高とは？
```当期に仕入れた商品の仕入原価の合計額```、つまり```期末における仕入勘定の残高```をいう。
##### 出典
https://kanjokamoku.k-solution.info/2016/10/04100223.html#:~:text=%E5%BD%93%E6%9C%9F%E3%81%AB%E4%BB%95%E5%85%A5%E3%82%8C%E3%81%9F%E5%95%86%E5%93%81%E3%81%AE%E4%BB%95%E5%85%A5%E5%8E%9F%E4%BE%A1%E3%81%AE%E5%90%88%E8%A8%88%E9%A1%8D%E3%80%81%E3%81%A4%E3%81%BE%E3%82%8A%E6%9C%9F%E6%9C%AB%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%95%E5%85%A5%E5%8B%98%E5%AE%9A%E3%81%AE%E6%AE%8B%E9%AB%98%E3%82%92%E3%81%84%E3%81%86%E3%80%82

#### 期末商品棚卸高とは？
```期末時点での商品の在庫の額```を表します。棚卸資産として決算書にも記載される価額です。
##### 出典
https://biz.moneyforward.com/accounting/basic/50950/#:~:text=%E6%9C%9F%E6%9C%AB%E5%95%86%E5%93%81%E6%A3%9A%E5%8D%B8%E9%AB%98%E3%81%AF,%E8%A8%98%E8%BC%89%E3%81%95%E3%82%8C%E3%82%8B%E4%BE%A1%E9%A1%8D%E3%81%A7%E3%81%99%E3%80%82

# 問題３
### 2つの案の評価のうち適切な記述はどれか？
#### 固定費とは？
売上高の増減に関係なく、```常に一定額発生する費用```で、```人件費や地代家賃、生産設備の減価償却費```など。

#### 変動費とは？
売上高の増減に応じて```変化する費用```で、```原材料の購入費や商品の仕入原価```など。

# 問題４
### 損益分岐点はいくらか？
#### 損益分岐点とは？
```売上高と費用が一致する点```のこと。
この点の売上高の値を損益分岐点売上高といい、これを超えて売上が伸びれば利益が生まれ、反対に下回ると損益が発生してしまう。

# 問題５
### 減価償却費はいくらになるか？
#### 減価償却費とは？
```固定資産の購入額を耐用年数に合わせて分割し、その期ごとに費用として計上するための勘定科目```です。資産を購入した費用の全てをその年に計上しないというルールがあるのです。例えば120万円の普通自動車を購入した場合、耐用年数は6年ですので、毎年20万円ずつ費用として計上します。
##### 出典
https://hcm-jinjer.com/blog/keihiseisan/depreciation/#:~:text=%E6%B8%9B%E4%BE%A1%E5%84%9F%E5%8D%B4%E8%B2%BB%E3%81%A8%E3%81%AF%E3%80%81%E5%9B%BA%E5%AE%9A%E8%B3%87%E7%94%A3%E3%81%AE%E8%B3%BC%E5%85%A5%E9%A1%8D,%E8%B2%BB%E7%94%A8%E3%81%A8%E3%81%97%E3%81%A6%E8%A8%88%E4%B8%8A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
picoCTF Writeup picoGym Practice Challenges vault-door-training (注意<spoiler>)

# vault-door-training
Description
Your mission is to enter Dr. Evil's laboratory and retrieve the blueprints for his Doomsday Project. The laboratory is protected by a series of locked vault doors. Each door is controlled by a computer and requires a password to open. Unfortunately, our undercover agents have not been able to obtain the secret passwords for the vault doors, but one of our junior agents obtained the source code for each vault's computer! You will need to read the source code for each level to figure out what the password is for that vault door. As a warmup, we have created a replica vault in our training facility. The source code for the training vault is here: VaultDoorTraining.java

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

class VaultDoorTraining {
    public static void main(String args[]) {
        VaultDoorTraining vaultDoor = new VaultDoorTraining();
        Scanner scanner = new Scanner(System.in); 
        System.out.print("Enter vault password: ");
        String userInput = scanner.next();
	String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
	if (vaultDoor.checkPassword(input)) {
	    System.out.println("Access granted.");
	} else {
	    System.out.println("Access denied!");
	}
   }

    // The password is below. Is it safe to put the password in the source code?
    // What if somebody stole our source code? Then they would know what our
    // password is. Hmm... I will think of some ways to improve the security
    // on the other doors.
    //
    // -Minion #9567
    public boolean checkPassword(String password) {
        return password.equals("w4rm1ng_Up_w1tH_jAv4_3808d338b46");
    }
}

```

picoCTF{w4rm1ng_Up_w1tH_jAv4_3808d338b46}
個人情報の取扱いについて皆が考えた方が良いよねって話

<h2>はじめに</h2>

<p>はじめまして。コーポレート本部でなんでも屋をやっている135と申します。</p>

<p>最近はプライバシーマークやISMSをうっすら担当しておりましたので、今回は「個人情報について」超抜粋して書かせていただきます。コードの話とかは一切出てきませんが、エンジニアの方にも知っていただければ。</p>

<h2>最近のできごと</h2>

<p>個人情報についての取り扱いが厳しくなってきていることは何となく感じていただいているかもしれません。</p>

<p>2022年4月に個人情報保護法が改正されたため、各社で改正個人情報保護法に対応した、プライバシーポリシーの改正が2022年4月に行われました。（もちろん弊社も対応しました）</p>

弊社のプライバシーポリシーはこちら

https://www.hrbrain.co.jp/privacy/


<p>今回の改正では、本人が保有する個人データの利用停止・消去・第三者への提供の停止を請求できる要件を緩和し、本人の権利保護がより強化されました。</p>

<h2>他の国はどうなの？超抜粋</h2>

<p>米国の場合は州独自に個人情報の保護制度があります。</p>

<p>他には、一度は聞いたことがあるかと思われる「GDPR（General Data Protection Regulation）通称：EU一般データ保護規則」が世界中で一番個人情報につよつよな制度であり、各国は徐々にGDPRに足踏みを揃えてきている状況になっています。</p>

<p>例えば、欧州ではCookie情報も「個人情報」として取り扱っているため、日本もそのうち同様の扱いをしなければならないかと思います。</p>
<p>（日本では「個人関連情報」といって、Cookieとその他の情報を組み合わせることで個人が特定できる情報とされており、Cookieそれ自体は「個人情報」ではないとされています）。</p>

<h2>個人情報取り扱いの流れ超抜粋</h2>

<p>ここで、個人情報取り扱いの流れについて概要を説明します。</p>


<h4>1.取得する場合：事前に本人の同意が必要</h4>

<p>原則、個人情報を取得することについて「本人の事前同意」が必要です。取得した企業が個人情報を第三者へ提供する場合の規制は厳しめ。取得した企業が個人情報を委託する場合も、委託先企業の監督責任が委託元企業にあり、厳格になってきています。</p>

<p>これらをクリアするためにプライバシーポリシーに必要な情報を明記し、プライバシーポリシーを確認してもらい、同意してもらってから情報を取得する動線が必要です。</p>


<h4>2.保管する場合：サーバーの場所はどこ？</h4>

<p>オンプレのサービスの場合、「物理サーバーはどこにあるの？」みたいな話がありましたが、これがSaaSのサービスでも関係してきています。</p>

<p>クラウドサービスで他社（GCP、AWS、Azureなど）のサーバー使ってまーす！というと、「それはどこにあるの？」「国内？海外？」「海外ならどの国にあるの？」といった、データの越境移転についてという話がホットな話題になってきています。（詳細は割愛）</p>


<h4>3.利用する場合：明示した利用目的以外には使えない</h4>

<p>「利用目的」を明記するのが必要。利用目的以外での個人情報の利用はNG。明記した利用目的以外の目的で利用する場合には、個別に同意が必要となります。</p>
<p>プライバシーポリシーで利用目的を明記している企業が大半です。</p>


<h4>4.消去する場合：使わなくなったら、ちゃんと消去しよう</h4>

<p>個人データを利用する必要がなくなったときは、その個人データを遅滞なく消去するよう努める必要があります（個人情報保護法第22条）。</p>



<h2>何が言いたいかというと、個人情報って皆で注意が必要だよねって話</h2>

<p>自分のことに置き換えて考えてみていただければ</p>

<p><b>「よく知らない人（企業）が、日本じゃない国に自分の個人情報を預けて、どう使ってるか分からない状況」</b>って嫌ですよね？</p>

<p>だからこそ、今まではふんわりしていたものを、きっちりしなければいけない流れになってきています。</p>

<p>例えば、海外在住の人にも使ってもらおー！と思ったときに、「多言語対応できた！」で終わりではなく、意外と法的に越えなければならない（高い）ハードルがいくつもあります。</p>

<p>その他、新規事業やる！新しいプロダクト開発する！となったときは今まで利用していなかった個人情報を利用することもあると思います。</p>

<p>「それってプライバシーポリシーに書いてあるっけ？」「利用規約には？」と、是非一度立ち止まって気にしていただきたいです。そうしないと会社も働いている人も守れなくなってしまいます。</p>

<p>バックオフィス部門（特に法務）との連携をお忘れなく！</p>

<h2>おわりに</h2>

<p>今回の話はプロダクト開発に限ったことではなく、もちろんマーケティング領域やセールス領域にも関係してくることです。</p>

<p>昨今の流れを鑑みると、世界中でGDPR並みの個人情報保護への対応が必要になるのも案外遠く無いのかな・・・と思うので、
<p><b>開発段階でも「個人情報はどんな情報を、どうやって取得し、どこへ保管され、どう利用され、どう消去されるのか？」</b>を意識していただけると大変ありがたいなぁと思って終わります。</p>

<h2>余談</h2>

<p>世の中のルールができる時やルールが厳しくなるときってだいたい「悪いことがあったとき」なので、色々な過去の個人情報の不正利用や漏洩が積み重なって、このような世の中の流れになっているとも言えますね。</p>

<p>お読みいただき、ありがとうございました。</p>
【Git】コマンドにエイリアスを付ける

Gitのコマンドにエイリアスを設定することでコマンド入力を短い文字数で実行することができる

### コマンドにエイリアスを付ける
```
$ git config --global alias.ci commit //commitコマンドに「ci」を割り当てる
$ git config --global alias.st status //statusコマンドに「st」を割り当てる
$ git config --global alias.br branch //branchコマンドに「br」を割り当てる
$ git config --global alias.co checkout //checkoutコマンドに「co」を割り当てる
```

git configは設定を変更するためのコマンド
--globalのオプションを指定すると該当ユーザの全リポジトリがたいしょうはんいとなる
AlmaLinux9.0でタイムゾーンを変更

AlmaLinux9.0で時刻同期が出来ていなかったので調べたらタイムゾーンがアメリカのニューヨーク設定だった為、日本の東京に設定変更した時のメモ。

rsyncでスクリプトを自動実行させようとしたが、設定した時刻にスクリプトが走らない。
時刻を確認したら、微妙にずれている…。
```
# date
2022年 11月 29日 火曜日 21:12:57 EST
```
<br>

時刻同期されているか確認すると、ニューヨークの時間になっていた。
```
# timedatectl
               Local time: 火 2022-11-29 21:17:23 EST
           Universal time: 水 2022-11-30 02:17:23 UTC
                 RTC time: 水 2022-11-30 02:17:23
                Time zone: America/New_York (EST, -0500)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
<br>

タイムゾーンを東京に変更
```
# timedatectl set-timezone Asia/Tokyo
```
<br>

Chronyを再起動。
```
# systemctl restart chronyd
```
<br>

再度確認すると、タイムゾーンが東京に変更されている。
```
# timedatectl
               Local time: 水 2022-11-30 11:19:00 JST
           Universal time: 水 2022-11-30 02:19:00 UTC
                 RTC time: 水 2022-11-30 02:19:00
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
<br>

時刻も同期された。
```
# date
2022年 11月 30日 水曜日 11:41:37 JST
```
改めて振り返るリモートワークの良し悪し

こんにちは。

[CYBIRD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cybird) 2日目担当の@koronekoです。
初日は@cy-seiyanさんの「人生初のエンジニアリーダーを経験して得たモノ」でした。

これからたくさんの記事が投稿されるので、今年は去年以上にサクッと読める記事にしたいと思い、来年で丸3年となるリモートワークを振り返り、個人的に特に感じたメリットデメリットを記事にしたいと思います。

## まずは自己紹介
私はエンジニア歴十数年以上、お仕事に合わせて言語を変えるスタイルのエンジニアです。
サイバードにお世話になって早3年。
現在、技術部に所属し複数のタイトルの進行管理を行う業務に携わっています。

## サイバードのリモートワーク事情
サイバードでは2020年3月末のコロナ禍に、いち早く全社リモートワークに舵取りを行った会社です。
業務の状況、会社の方が作業しやすい、会いたい人がいるなどの個々の理由によって出社するメンバーもいますが、
リモートワークに入ってから一度も出社していないメンバーもおり、勤務状況は様々です。
私自身、必要に迫られた出社は数えられる程度だったと記憶しています。

元々個々の事情によって、ワークスタイルを選びやすい会社であり、リモートワークが導入されたことで、より柔軟な勤務が可能になっています。

それでは、さっそくデメリットから振り返ってみたいと思います。

## デメリット
- コミュニケーションの難易度が上がった
- 光熱費が増えた
- いつまでも仕事ができてしまう

リモートワークによって、コミュニケーションが取りづらくなったと感じた方は多いのではないでしょうか？
私もその一人です。
特に、新しく入社した方や他セクションの方々など、関係性の構築をし始めたばかりの方とのコミュニケーションが難しくなった感じております。
当然スピードを必要とする場面もあり、オフラインで業務をしていた時よりも先周りを考慮した動きが必要となっていることが多々あります。

光熱費...増えましたね...3〜5割増し位変わったかなと思います。
ただ、外食が減ったのでプラマイでいくと多分黒字です。
（会社の近くには誘惑がいっぱいだったので....）

また、いつまでも仕事できてしまうのは本当に困りものです...。
終電がないので、キリがいいところまでとズルズル仕事をしてしまうことがあります。


## メリット
- 通勤時間がない。
- 平日に家事がしやすい。
- 環境が揃っていれば、どこからでも仕事が可能。
- 人の声が聞き取りやすくなった。

私は通勤に片道1時間程度かかっていたため、年間480時間程度、おおよそ60人日（3人月）分の時間が活用可能になりました。
3年間で換算すると9人月分です。初めて数値化してみましたがこれには驚きました。
また、平日に宅急便が受け取れることや、家事ができるようになったことで、休日もより有効的に活用できるになりましたね。

そして環境が揃っていれば、どこからでも仕事ができる為、時々自宅以外の場所でも仕事することもしばしば。
家庭の事情などで、実家に一時的に帰ったりもできるので本当に助かっております。
会社に出社するのも自由なので、時々気分転換も兼ねて会社で仕事をしたり、ランチMTGしたりとオフラインならではの交流も楽しんでおります。


最後の「人の声が聞き取りやすくなった」というのはオンラインミーティング限定ではありますが、個人的に嬉しい副産物でした。
元々、左耳が聞こえづらくオフラインのミーティングでは、聞き取れないところを何度か繰り返しお伺いしていたことが多かったのですが、オンラインミーティングでは音量の上げ下げでカバーできるようになりました。


## 最後に
新たな発見はなかったように見えますが、リモートワークの恩恵を改めて感じることができました。
デメリットで挙げたコミュニケーションを円滑にしようと試行錯誤した結果、出社していた時よりも人との対話の頻度が上がり、昔よりはコミュニケーション能力が鍛えられたのではと思います。

サイバードは会社にコワーキングスペースがありますし、個人的にはリモートワークと出社の良いところを交えつつ今後もリモートワークを継続したいですね。

[CYBIRD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cybird) 3日目は@march_fさんの「FortiGateで自宅ネットワークの整備」です。
明日もガッツリ記事なので楽しみです。
nRF Connect SDK:WDT

# WDT(Watch Dog Timer)とは
組み込みエンジニアならすでに知っていると思うので省略しますが、そういえばWDTの存在を忘れていました。もちろんハングアップしないファームウェアが理想ではありますし、原則そうなっているとは思うのですが、経年劣化でICが故障したときなどにリセットがかからないのもよろしくないですよね。
# サンプルがそのまま使える
もちろんWDTのサンプルプロジェクトも当然用意されています。プロジェクト名はwatchdogです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/00b3fb7e-3a67-2da2-8342-3a40a502ce73.png)
## 何も考えずにそのまま動く
特にソースコードをいじることもなく、コンパイルすればそのまま動かすことができます。サンプルコードでは5回WDTをフィード(クリア)した後にリセットが発生するものになっています。
# 問題はここからだ！
WDTがちゃんと実装されていて動くことが確認できました、わーい。

::: note
ソースコードはサンプルから全くいじっていないので省略します
:::

・・・。
あれ、これってどうやって使うんだろう？RTOSにおけるWDTの正しい使い方とは・・・？
だって考えてみてくださいよ。仮にどこかのキューでスレッドが終了せずに次に進まなくなったとしても、システムキュー内でWDTをフィードするスレッドが生きていたらWDTはクリアされてしまうんですよね？
どこかのキューがハングアップしていようがそんなことはお構いなしにタイムスライスは無情に動き続けるわけです。

::: note warn
ちなみにこの理解は間違っていました・・・
:::

## 調べてみる
何事も自分で試してみるのが基本です、ええ(笑)
ということでサンプルコードに無限ループスレッドを追加してみました。
なお、ここには変更点のみ記載しています。

``` main.c
void my_work_handler(struct k_work *work)
{
	printk("Worker Thread\n");
    while (1);
}
K_WORK_DEFINE(my_work, my_work_handler);

void main(void)
{
    ...

	err = wdt_setup(wdt, WDT_OPT_PAUSE_HALTED_BY_DBG);
	if (err < 0) {
		printk("Watchdog setup error\n");
		return;
	}

	// Start Thread
    k_work_schedule(&my_work, K_NO_WAIT);

	/* Waiting for the SoC reset. */
	while (1) {
		printk("Feeding watchdog...\n");
		wdt_feed(wdt, wdt_channel_id);
		k_sleep(K_MSEC(50));
	}
}

```

こんなことをしても動いちゃうんだよね、きっと・・・と思いながら走らせてみると、なんと！WDTリセットが発生しました。
どういうこと？！？！？！
## タスクのスイッチはスリープ時に発生
理解が間違っていたのはまさにこの部分でして、タスクのスイッチはスリープ相当の状態になって初めて発生します。言われてみれば当たり前のことなのですが、例えば非常に長ったらしい文字列の出力をしている時、途中でスレッドがスイッチしてしまったら出力が途切れてしまいますよね。
ここまでくるとほとんど理解ができると思いますが、先ほどのwhile句の無限ループにもsleepを挟んでやるとちゃんとスイッチしてWDTリセットがかからなくなります。

``` main.c
void my_work_handler(struct k_work *work)
{
	printk("Worker Thread\n");
    while (1) {
		k_sleep(K_MSEC(50));
	}
}
K_WORK_DEFINE(my_work, my_work_handler);
```

ちなみにセマフォで待機中のスレッドはと言うと・・・これも大丈夫なようです。セマフォ待機中はスリープ扱いってことですね。(当たり前か)

``` main.c
K_SEM_DEFINE(k_sem, 0, 1);

void my_work_handler(struct k_work *work)
{
    k_sem_take(&k_sem, K_FOREVER);

	printk("Worker Thread\n");
    while (1);
}
K_WORK_DEFINE(my_work, my_work_handler);
```

::: note
セマフォギブしてスレッドの中身を進めると当然アウトですよ・・・
:::

# 総括
つまり、何らかの理由で抜けられないスレッドができてしまった場合、タスクのスイッチが発生しないことになるため、メインとなるスレッドにWDTをクリアする命令を定期的に実行するようにしておけばよいということになります。

::: note
ここでいうメインとなるスレッドというのはメインキューもしくはシステムキューを指します
:::

# 結論
WDTを使う場合は何も考えずにメインキュー内にwdt_feedを置けばいいと思われます。
そんな結論でいいんかよ！って思うわけですが、調べた結果としてそんな結論になったのできっといいはずです(笑)

::: note
ワケも分からずそうしているわけではない、というのは大きいですよ
:::
CSSの:has()を使ってラジオボタン要素切り替え【JSパターンも】

CSSの`:has()`が便利だったのでメモです。
当初JSとcssを使ってましたが、`has()`を使うことでcssのみでいけました。

### 行いたいこと
- ラジオボタンクリックで要素を表示
- 初期状態では要素非表示

１をclickした場合
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179505/d470d0a9-4dcb-e652-2d86-f6a465e8ce9c.png)

２をclickした場合
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179505/0f5b9313-bf43-f3d7-7476-063f184bfc6c.png)

#### :has()で要素表示切替
- 初期状態では`add`クラスが非表示
- `.wrap:has(#radio1:checked)` ... wrap内で#raido1がcheckされていたらblock

```html
<div class="wrap">
    <input type="radio" name="radioName" id="radio1">
    <label for="radio1" onclick="isDisplayTime()">１の場合</label>
    <div class="add js-add">
      <div class="box">要素</div>
    </div>
    <br>
    <input type="radio" value="not_reserve" name="radioName" id="radio2">
    <label for="radio2" onclick="isDisplayNotTime()">２の場合</label>
  </div>
```

```css
.add {
      width: 100px;
      height: 100px;
      background: lightgreen;
      display: none;
    }
    .wrap:has(#radio1:checked) .add {
      display: block;
    }
```

CSSのみで完結する！

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179505/d470d0a9-4dcb-e652-2d86-f6a465e8ce9c.png)

#### nameで要素表示切替
※コメントでアドバイスいただいたもの抜粋

- 初期状態ではaddクラスが非表示
- [name=r]:checked .. nameをチェックをしていたら、以降の要素blockとなる

```html
<label>
    <input type='radio' name='r'>
    1の場合
    <div class='add'>要素1</div>
  </label>
  <br>
  <label>
    <input type='radio' name='r'>
    2の場合
    <div class='add'>要素2</div>
  </label>
```

```css
<style>
    .add {
      width: 100px;
      height: 100px;
      background: lightgreen;
      display: none;
    }
    input[name=r]:checked ~ .add {
      display: block;
    }
  </style>
```

こちらもCSSのみで完結する！

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179505/9c87cd56-ecf6-35d3-2383-21b4552a80be.png)


#### JavaScriptで要素表示切替

- jsでdomをとってくる
- domに対してblock、noneをjsで切り替え

```html
<input type="radio" name="radioName" id="radio1">
<label for="radio1" onclick="isDisplayTime()">１の場合</label>
<div class="add js-add">
<div class="box">要素</div>
</div>
<br>
<input type="radio" value="not_reserve" name="radioName" id="radio2">
<label for="radio2" onclick="isDisplayNotTime()">２の場合</label>
```

```css
.add {
  width: 100px;
  height: 100px;
  background: lightgreen;
  display: none;
}
```

```javascript
function isDisplay() {
    let add = document.querySelector(".js-add");
    add.style.display = "block";
  }
  function isDisplayNot() {
    let add= document.querySelector(".js-add");
    add.style.display = "none";
  }
```

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179505/2282f693-e401-d990-95cd-b3b1da62bb18.png)

cssとjsを使う、`has()`便利

参考
https://coliss.com/articles/build-websites/operation/css/has-pseudo-class.html
Google SpreadSheet: タイムラインビューを試してみた

Google SpreadSheet に [タイムラインビュー](https://support.google.com/docs/answer/12935277?hl=ja&visit_id=638053688363586637-2107294772&p=timeline_view&rd=1#zippy=) という機能が追加されたという事なので、試してみました。
手軽に使えて、データが見やすくなり、メンテもしやすくなる楽しいアップデートです。

## 使い方
### データを用意する
差し当たり、開始日、終了日(or 期間)、カードのタイトル、カードの詳細 という列があると良いようです
![スクリーンショット 2022-11-30 10.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/8a6b0cd8-39e0-08f8-0d26-118c34a76187.png)
### タイムラインを挿入する
挿入からタイムラインを選択します
挿入する際にダイアログで利用するデータの範囲を指定します
![スクリーンショット 2022-11-30 10.47.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/d9361d30-4362-9b8a-e65e-b7117e921421.png)
### タイムラインが作成される
タイムラインというシートが作成されます
![スクリーンショット 2022-11-30 10.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/559e1ea5-0ef1-7b94-41fa-77ca13ef8f8e.png)

タイムラインでカードを選択してデータを編集をクリックすると、データのシートが表示されて、当該カードの行が選択された状態になります
![スクリーンショット 2022-11-30 10.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/711a2afb-949b-0c6e-94dc-c6985e3ac261.png)
![スクリーンショット 2022-11-30 10.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/827db17f-9034-df89-5a1b-8be3a50918e0.png)


## 任意の項目の使い方
カードを分類する列や、カードの色をセルの色で表した列、付加情報を表す列をデータに追加します
![スクリーンショット 2022-11-30 10.57.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/2f144477-69c1-2644-d7f5-4f8ffafb05bd.png)
タイムラインの設定の任意の項目で、カードの色、カードの詳細、カードグループに追加した列を設定すると、タイムラインに反映されます
![スクリーンショット 2022-11-30 10.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/028e45ec-955b-3256-4c28-b6d6967d27e5.png)
Android 端末で VPS に SSH 接続する

## 前提

* VPS が利用可能な状態であること

## 環境

* Termux
    * Publisher: Fredrik Fornwall
    * Version: 0.101
* Android
    * Version: 12

## 実施

1. Google Play ストアから [Termux](https://play.google.com/store/apps/details?id=com.termux&hl=ja&gl=US&pli=1) をインストール
2. Termux を起動
3. 以下コマンドを順に実行

    ```bash
    $ pkg update
    $ pkg install openssh
    $ apt-get update
    $ apt-get upgrade
    $ ssh <user>@<domain>
    ```
【Unity】スプリクト作成時からあるMonoBehaviour(モノビヘイビア)の役目とは

# 初めに

Unityでスプリクトを作成するとデフォルトであるMonoBehaviour。
初めは気にしないでいたが、ここに手をつける時がきた。
丸める処理のファイルを作成していた時のことである。
public class Rounding : MonoBehaviourからpublic static class Rounding 
と変更。
何を意味しているのか全くわからなかったので調べてみた。

# MonoBehaviourとは
全てのスクリプトの __ベースのクラス__ で、 __ゲームオブジェクトを制御__ するために必要な機能を提供している。
Unityのスクリプトは、 __MonoBehaviourクラス__ の __子クラスでなければならない__ というルールがある。
自作コンポーネントを作成する場合、必ずMonoBehaviourを継承する必要がある。
コンポーネントとは→ゲームオブジェクトに追加される機能のこと

# MonoBehaviourの継承について
上記では『自作コンポーネントを作成する場合、必ずMonoBehaviourを継承する必要がある。』と書いてある。=必ず書かなければいけない。しかし私は、public static class Rounding 
へと変更して、MonoBehaviourの記述を消去した。

果たして継承しないこともできるのか。

## MonoBehaviourが不要な時
__Hierarchy上に実体がない時__
__Awake, Start, Update等のMonoBehaviour継承で自動的に呼ばれるメソッドがない時__

主にこの２つの場合はMonoBehaviourは無くても良いとされる。
なぜなら、MonoBehaviourを使用してゲームオブジェクトのものを動かす必要がなければ自動的に実行する必要もない。その為MonoBehaviourを継承しなくても支障はないのである。

注意したいのは、必ず継承させないようにするのでは無く、継承させないでも動かすことが出来るという解釈である。全てのクラスがMonoBehaviourを継承しても動かすことは可能である。

### public static class Rounding とは
MonoBehaviourの意味を理解したところで、public class Rounding : MonoBehaviourからpublic static Roundingと変更したがその意味合いは何なのか。

__public static class Rounding__
(public)呼び出し可能な
(static)インスタンスを生成せずに外部クラスとの繋がりを明確に表現したいときに使用する修飾子
(Rounding)フィールド名
Roundingという名の何回でも呼び出し可能なファイルを作成しますよということ。
Azure Cognitive Containerははやいぞ

本記事は「[TRUST SMITH & COMPANY Advent Calendar 2022](https://qiita.com/advent-calendar/2022/trustsmith)」の2日目です。
予想以上に誰もやってくれなかったのでとりあえず埋め合わせの記事を書いています。(悲しい)

# 動機
AzureのOCRサービスであるCognitive Servicesは、web api ocrの中でも[高い認識精度で知られており](https://qiita.com/c-makitahiroki/items/ecf8441c568ce775c9a7)、競合のGoogle Vision APIと比べると認識精度の点で一歩先に行っている印象があります。
しかし、Azure Cognitive Services APIは**推論処理の不安定さ**に問題があり、例えば弊社COOの[安藤のTwitter](https://twitter.com/shocolt)をスクリーンショットした589*310 pxの画像をOCRしてみると
![ando.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/054fd668-7ad2-58e1-dab8-57e1661dff9f.jpeg)
## Azure
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/632c5704-f6c3-e1d1-cbb1-e40ff6a0d50e.png)
## GCP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/150a1539-2e53-086e-34b1-c677e116069c.png)
とかなりGCP APIに水をあけられている状況になっています。(これは結構調子がいいほうで、混雑状況に応じて10秒程度待たされることがあります。)
よって、これをAzure Cognitive Containerを用いて高速化していきます。

# 導入
書き始めてから気が付いたのですが、導入方法を書いた記事はほかに[存在していました。](https://qiita.com/annie/items/476a5021ee6f91226af5)
APIの導入については[こちらの記事](https://qiita.com/annie/items/476a5021ee6f91226af5)を参照いただくとして、この記事ではAPIが`localhost:5000`で起動していることを前提に話を進めます。

# API速度比較
## 環境
Core i9-10980XEのうち8コアを使ったlocalhostAPIを起動しています。(多分そこまでCPUリソースは必要なさそうです。)
## コード
以下のようにしてAPIを10回叩きます。

```python
import requests
import time

headers = {
    'accept': '*/*',
    'Content-Type': 'application/octet-stream',
}

path = 'ando.jpg'

with open(path, 'rb') as f:
    data = f.read()


for i in range(10):
    # local API request

    start = time.time()

    response = requests.post('http://localhost:5000/vision/v3.2/read/syncAnalyze', headers=headers, data=data)

    end = time.time()

    #print(response.text)
    print("offline time:", end - start)
```

## 結果
上記の画像をOCRしてみたところ、GCP APIと遜色のない速度が得られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/dfb79735-cfbe-0c52-8058-79357a23dd5b.png)
外部ネットワークを通じていないため、やはり当たり前ですがかなり速いです。

ちなみに、4K画像を入力した場合はGCP APIがかなり有利になり、
### GCP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/9449830f-8768-d884-ce1b-c70dcad4456f.png)

### Azure Offline
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/20fdbf26-9d29-32f8-3281-69f1711664a1.png)

### Azure Online
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/c7411664-c828-2e17-636b-bb8c46bec7b2.png)

といった具合になります。
Azure Offlineの処理が遅くなった分だけOnlineの処理も遅くなっているので、たぶんリソースとしては同じ程度でネットワークを挟むか挟まないかの違いなんだと思います。
【Laravel】碇くんがもうabort()をする為にif文で囲まなくていいようにする

## 概要

LaravelでHTTP例外を簡単に投げられるヘルパー``abort()``

これを使う際に大体条件分岐で発動させたりしてると思います。

```php
if($hoge === 'hoge') {
    abort(404);
}
```

## abort_if()

上の例がこう書き直せます
```php
abort_if($hoge === 'hoge', 404);
```

第一引数に書いた条件がtrueの際に
第二引数で指定したHTTP例外を投げます。

## abort_unless()

上の例がこう書き直せます
```php
abort_unless($hoge !== 'hoge', 404);
```

第一引数に書いた条件がfalseの際に
第二引数で指定したHTTP例外を投げます。


## 使い分け

〇〇だったら　→ ``abort_if()``
〇〇に当てはまらなかったら → ``abort_unless()``
phpenvに必要なパッケージ

参考: https://qiita.com/ryo-endo/items/0e689e02cb87e09f4c7a
```
sudo apt -y install \
build-essential \
sudo apt -y install \
libxml2-dev \
libssl-dev \
libbz2-dev \
libcurl4-openssl-dev \
libjpeg-dev \
libpng-dev \
libmcrypt-dev \
libreadline-dev \
libtidy-dev \
libxslt-dev \
autoconf \
libsqlite3-dev　\
libonig-dev \
libzip-dev
```
なぜかジェットボートの車検してみました

今まさにプログラミングを学んでいる人全てをエンジニアとして扱っていこうと思っています。

趣味で旧車のレストアもしていますので、趣味を紹介する傍らで、
本来の目的pythonも勉強中ですので、なにこれ。　ぐらいで留めていただければ。


旧車が好きで、歴代の車を売却せずに長く残しています。

購入順に並べると、
- ビート（HONDA）H4年製
- ジムニー（JA11）H7年製
- ジムニー（JA11）H5年製
- RX-7（FC3S）H2年製
- MR2（SW-20）H7年製
- レオーネSVX（SVX）
- レガシーB4（B4）
- インプレッサ（GC8）

どれもこれもいわゆるバブル期に作られた車で、20～30年超えてます。
車としては、どいつもこいつも地球環境には悪いですが、車は趣味と割り切っています。


さて、これだけの数の車を維持しようとすると、とんでもないお金がかかります。
古ければ古いほど、ディーラーにお願いするとトンでもない金額を請求されます。

よってエンジニアだったら、自分で車検を通すのです。（Qiitaとして定義したエンジニアの意味が違うけど）

自前でガレージを持ち、リフトも購入しています。





さて、そうこうしているうちに、
我が家にジェットボートがやってきました。



ジェットボートも車検があるのです。

ヤマハ MJ-650T (FK7-A) ; 
エンジン型式, 6M6 ; 燃料種類, 2ストロークガソリン ; 搭載数, 1基 ; 
検査手帳馬力, 42馬力 / 5500rpm(回転数) ; 推進機種類, ジェット推進.
航行区域： 限定沿海
1995年製　平成7年型

イメージ図
![590_2012112715114042_640x480.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008873/622a3959-b534-9fa7-b1f9-5132f2462b11.jpeg)


 








会社の先輩から、これまたバブル期の1995年製のジェットボートを譲り受けましたので、整備して乗れるようにしてみるまでの記録を書いておきます。


ジェットボートを無償で譲ってもらったわけです。　ジェットボートは新車1隻100万円もします。　なぜ無料でもらえるかというと、ジェットボートの寿命は本当に短く、何年も持ちません。
海水がアルミエンジンにとても悪いため、整備手入れ次第では3年もせずにダメになるためです。車やバイクならエンジンが止まっても沈没の恐れはありませんが、ジェットボートの場合、エンジンが止まると排水もできなくなり、沈没する確率が高まり、もし万一沈没すると海上では命の危険があるため、古いジェットボートを何年も乗らずまた新車を購入するためです。しかも1995年製です。25年経過したまさに旧車です。

さて、そんな命のリスクの高いジェットボートを整備して、免許を取得することになりましたが、とりあえず、エンジンを点検しました。

２ストロークエンジンの点検は、まずなによりも先にキャブレターを点検です。
2ストロークエンジンは、ガソリンに2ストオイルが混入されているので、キャブの微細な穴によく詰まったり固まったりととても繊細になっているためです。

さて、またバイクのキャブのように燃料を負圧によりフロート式で吸い上げて供給するのではなく、ダイヤフラムポンプにて供給するキャブレターであった。初めて見るタイプのキャブレターでした。横転しても燃料ダダ洩れになるリスクもなく、詰まりにくくなっている代わりに、ポンプのダイヤフラムが肝心になる機構です。

点検してみると、そのダイヤフラムが劣化してダメになっていた。

部品を取り寄せるも、香川県仁尾町の瀬戸内マリンさんhttps://goo.gl/maps/ULKtVNBoK1xfPUju6　
は、何度も断ってきた。　そのやり取りは以下のとおり、
- 何度お店に足を運んでもいない。　土日はお休みか？
- 船の型番は？　　　既に伝えている。
- 部品番号は？　　　既に伝えていて図で指示している。　写真も送っている。
- 指定された部品番号は、船の型番と合わない。
- 部品メーカーが在庫ないと言っている。
- 他の店に頼んだらどうか？

などなどと、対応する気がない。　売る気がない。
常識としてこれほど古いジェットボートを修理して乗ると言う事に対して対応する気がないという事でしょう。


仕方ないので、ダメになったダイヤフラムを補修して使うことにした。

0.5mmのゴム膜を入手し、破れた既存のダイヤフラムにゴムノリで接着させるのだ。



前のオーナーさんが、購入して2年しか、また淡水でしか使っていなかったほぼ新車状態だったため、海水による痛みはほぼなく、エンジンは消耗品となるダイヤフラムを除いて素晴らしい状態だった。

無事にキャブレターを整備しなおして、
新しいバッテリーを積みなおして、船の準備は万全となった。


船の検査は、
屋島の日本小型船舶検査機構高松支部へ持ち込み、検査を受ける。
https://goo.gl/maps/uhRQrMNErswS9XVv5

検査は、エンジンが問題なくかかる事、そして装備品をチェックされる。
必要な装備は、
- オレンジの救命胴衣2名分。（桜印付き）
- 係留用ロープ、
- ホイッスル
- 携帯電話を入れるシール可能なジップロックだ。



無事に車検は合格。
船体番号などを再発行してもらい、無事船に乗ることができた。




ここで大問題が発生した。
わたしの持つ2級免許では、ジェットボートに乗ることができないと知る。
ジェットボートの免許は、香西のマリーナペラガスで取得できた。
https://goo.gl/maps/rw5NN6R9gEMScnPp8

資格のための6万円程度の費用はどうにもならない。　
無事にジェットボート用の免許（特殊小型船舶免許）を取得したところで、9月となり2022年の夏が終わってしまった。

現在わたしのガレージに鎮座しており、来シーズンを待っている状態になった。

そして、肝心の車のレストは手が付けられない状態にある。


pythonも頑張ります。
クイックテキスト

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

使えるオブジェクトに制限がある。

+ [ケースでクイックテキスト](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000LHo8O)

確かにクイックテキストはCaseオブジェクトでは使えないですね。
もしかしてマクロが使えないかと思いましたが、マクロでもCaseの詳細画面に対しては設定できなかったです。

+ [クイックテキストの挿入と使用](https://help.salesforce.com/s/articleView?id=sf.quick_text_insert.htm&type=5)

# オブジェクト

+ [QuickText](https://developer.salesforce.com/docs/atlas.ja-jp.240.0.object_reference.meta/object_reference/sforce_api_objects_quicktext.htm)


# 共有

+ [クイックテキストの共有](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Otlyt)

:::note
Lightning Experience でのフォルダを使用したクイックテキストの共有
https://help.salesforce.com/s/articleView?id=sf.quick_text_share_lex.htm&type=5
:::
Terraformでのリソースの引数の並びの考え方

Terraformの設定(*.tfファイルを設定(Configuration)と公式には呼びます)は逐次実行的なロジックがほとんど書けないので人によって極端にひどいコードになることは少ないです。
ただ、比較的人によってばらつきがあるのがリソースの引数です。この記事ではよりわかりやすいであろう引数の並び順について考えてみます。
以下で書くのはあくまで一般的な場合の推奨であり、各リソース宣言の事情によっては無視したほうが良いことは書いておきます。

# 特別で全体に影響する引数は先頭に書く

**特別で全体に影響する引数** とは次のような引数のことです。

- `for_each`
- `count`
- `source`
- `provider`
- `providers` 

例えば `count` 引数によって場合により作らない設定になっているとします。もし `count` 引数がリソース末尾にあると、たくさんの引数を見た結果最終的にそのリソースを作らないことに最後に気づく場合があるかもしれません。
他の引数についてもリソースのより根本に関わる設定であるため、なるべく先頭に書いておいたほうがいいでしょう。

# 意味的集合ごとに固める(semantic)

意味合いが近い引数ごとに固めて書きましょう。理由は、同時に変更することが多く変更漏れが発生しづらいからです。

以下の例では `azs`, `private_subnets`, `public_subnets` の固まりなどがわかりやすいと思います。

```terraform
module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "my-vpc"
  cidr = "10.0.0.0/16"

  azs             = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

  enable_nat_gateway = true
  enable_vpn_gateway = true

  tags = {
    Terraform = "true"
    Environment = "dev"
  }
}
```

悪い例をあげます。

```terraform
resource "aws_wafv2_web_acl" "example" {
  name        = "example"
  scope       = "REGIONAL"

  default_action {
    allow {}
  }

  rule {
    ... 30行ぐらいの長い量
  }

  visibility_config {
    cloudwatch_metrics_enabled = false
    metric_name                = "example"
    sampled_requests_enabled   = false
  }
}
```

この例では、 `name` 引数と `metric_name` は明らかに同じ名前をつける意図があります。
しかし、その2つの引数の間に `rule` というとても長い行が入っているため `name` を書き換えたときに `metric_name` の書き換えを忘れるということが容易に発生しえます。そのため、 `name` と `metric_name` を含む `visibility_config` ブロックは隣り合わせるかすぐ上下に配置したほうがいいでしょう。

# 重要な引数を前に、そうでないものを後ろに書く

重要度低い引数とは以下のような性質を持つ引数です。

- その値が何であってもどうでもいい
- 非破壊的に値が変更可能

awsで言えばtagのような引数がそれに当たります。より重要度の高い引数がすぐに目に入ったほうがよいので、そのような重要度の低い引数は宣言の後半に持ってきましょう。

```terraform
module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "my-vpc"
  cidr = "10.0.0.0/16"

  azs             = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

  enable_nat_gateway = true
  enable_vpn_gateway = true

  tags = {
    Terraform = "true"
    Environment = "dev"
  }
}
```

# 引数名のアルファベット順で書く

アルファベット順に引数を書く方式です。利点はルールが非常に単純であることと、[Terraformのドキュメントの引数の説明](https://registry.terraform.io/providers/hashicorp/azuread/latest/docs/resources/application#argument-reference)はアルファベット順でソートされているため見やすいというちょっとした利点があります。

個人的にはこれはあまりいいルールだと思っていません。その理由は2点あります。1点目はセマンティックではないために関連する引数が一元化されておらず、設定変更漏れが発生しやすく認知負荷も高いからです。2点目はアルファベット順のソートは人間が努力で維持することは難しいためです。単純にアルファベット順に書いていることに気づいていない人が末尾に追加してしまうこともあるでしょうし、単純にアルファベット順の追加位置を間違う可能性があります(vpc_private_subnet_id と vpc_private_public_id のどちらがどちらの後であるかぱっとわかりますか？)。
formatterによる自動ソート機能があれば2つ目の問題は一応解決するためだいぶ選択肢としてマシになります[^1]。

[^1]: Terraform用のこういったフォーマッタがあるかは不明。たぶんない

# sponsored

この記事は[Speee](https://tech.speee.jp/)での業務中に60分で書きました。
picoCTF Writeup picoGym Practice Challenges tunn3l v1s10n (注意<spoiler>)

# tunn3l v1s10n

fileコマンドやforemostを使用しても情報が出てこない。

バイナリエディタで中を確認してみる。


![tunn3l_v1s10n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/3ee94d80-3fbd-5ce8-8173-dfa69afccf7f.png)

https://qiita.com/spc_ehara/items/03d179f4901faeadb184
ファイルヘッダ（00）

00		00,01 ファイルタイプ	2バイト	BMPファイルであることを示すもので、必ず「BM」(0x42 0x4d)という2バイト
00		02-05ファイルサイズ	4バイト	BMPファイル全体のバイト単位サイズ
00		06-07予約領域1,	2バイト	常に0
00		08-09予約領域2,	2バイト	常に0
00		0a-0dイメージデータオフセット	4バイト	ファイルの最初からイメージデータまでのバイト単位オフセット

情報ヘッダ（00-20）

10		0e-01ヘッダサイズ	4バイト	情報ヘッダのバイト単位でのサイズ(INFOタイプでは常に40)[28 00 00 00]
10		02-05幅	4バイト	イメージデータの幅
10		06-09高さ	4バイト	イメージデータの高さ
10		0a-0bプレーン数(チャンネル数)	2バイト	実際の色深度をプレーン数を使用して計算する場合の値。しかし、現在は使われておらず、常に1[01 00]
10		0c-0dピクセル毎のビット数	2バイト	色深度(1pixelを表現するのに必要なビット数)
20		0e-01圧縮タイプ	4バイト	イメージデータの圧縮形式(6種類あるが、基本的には非圧縮の0または、ビットフィールド形式の非圧縮の3であることが多い)
20		02-05イメージデータサイズ	4バイト	イメージデータのバイト単位でのサイズ(圧縮タイプが0または3である場合、この値は0でもよい)
20		06-09水平解像度	4バイト	イメージデータの横方向のピクセル数
20		0a垂直解像度	4バイト	イメージデータの縦方向のピクセル数


情報ヘッダ（00-20）
10 0e-01ヘッダサイズがおかしい値になっているため変更する。

![tunn3l_v1s10nreinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/cc2b887d-786b-8f28-861f-b0e44e385b68.png)




![tunn3l_v1s10nreheader.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/efaf9ddd-9ce9-36c9-7592-12904f111c15.png)

横に長い気がするので、高さを変更する。（4:3）
幅046E(HEX)=1134(DEC)
1134/4*3=849(DEC)=351(HEX)

![tunn3l_v1s10nreinforesize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/f12b5ff0-7553-e5b3-560a-95aac78d926c.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/3b29af9a-a7a6-e9e1-1673-1e3132608bc0.png)




picoCTF{qu1t3_a_v13w_2020}
Magento2の日本語化

# 初めに
Adobe社から発表されている公式のガイド（[Adobe Commerce 日本語UIロケールキット](https://business.adobe.com/jp/blog/topic/digital-commerce/dx-commerce-japanese-ui-localekit-installation-guide)に基づき、日本語化してみます。なお当方の環境は以下の通りです。

- Ubuntu 18.04.6 LTS
- Magento 2.3.5

上記をGoogle Cloud Compute Engine上に構築しています。

# composerを使ってExtentionのインストール

Adobeのページにはザクっと7行ほどで記載してあります。

まず、Magentoがインストールされたディレクトリに移動し、Composerを使用してロケールキットをインストールします。

```shell-session
$ su - magento_user
Password: 
$ cd /var/www/html
$ composer require magentoj/language-ja_jp
（途中略）
Writing lock file
Generating autoload files
75 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
PHP CodeSniffer Config installed_paths set to ../../phpcompatibility/php-compatibility,../../codeception,../../magento/magento-coding-standard
```

データベースを更新します。
```shell-session
$ php bin/magento setup:upgrade
Cache cleared successfully
File system cleanup:
/var/www/html/generated/code/Amazon
/var/www/html/generated/code/Composer
（途中略）
Enabling caches:
Current status:
Array
(
    [layout] => 1
    [block_html] => 1
    [full_page] => 1
)

Nothing to import.
Please re-run Magento compile command. Use the command "setup:di:compile"
```

「もう一度コンパイルして」と言われているのでコンパイルします。
```shell-session
$ php bin/magento setup:di:compile
Compilation was started.
App action list generation... 8/8 [====================] 100% 57 secs 351.0 MiB
Generated code and dependency injection configuration successfully.
```

キャッシュをクリアします。
```shell-session
$ php bin/magento cache:flush
```




# Magento管理画面での操作

管理画面にはいり、Stores - Configurationを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/b19b4a3d-ab04-f2fd-5206-67d0d6814011.png)

General - Locale Optionsの```Locale```で```Japanese(Japan)```を選択し、"Save Config"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/08b04451-3790-cc2f-86f8-7a03ed6ad299.png)


ロケール設定を変更してもすぐには反映されないので、キャッシュをリフレッシュします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/7a7a4fe6-3b14-64c4-ec98-a7316be3e2cf.png)

"Flaush Magento Cache"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/60b454a5-f42a-7695-20e1-5f0c78bc0892.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/94d42429-991f-a8b9-0abc-fbab46318b41.png)

Storeを見ると、日本語化されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/c187a9ac-1c82-434e-1bfd-5cec4d690b4c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/4c21b168-8bfb-15f0-1e50-213fcf9cf5cd.png)
審査部門における他社連携の取り組み事例とこれからの話

# **自己紹介**


こんにちは！App Review（以降「審査」）チームのさんしです。
好きな筋トレメニューはベンチプレスです。
ですが、最近は成長が鈍化しており、再成長著しい広背筋に浮気気味。ラットプルダウンもお気に入りです。
レッグプレスは数年前から公営ジムの最高重量に到達してしまい、モチベが湧きません。

さて、審査チームは昨年初めてアドベントカレンダーに投稿させていただきました。（当時の記事は[こちら](https://qiita.com/sanshi/items/c7b16779e77c858afe7d)）

最初だったので「審査とは？」という導入について書かせていただいたのですが、ここ最近弊社でいうところの「審査」に近い組織（以降「審査部門」と言います）が他社でも組成されてきている傾向にあり、意見交換会など行わせていただいています。

そこで、これまで他社連携をしてきた振り返りを記事にできればと思い、今回投稿させていただきます。



# **背景**

「審査」という業務は、約5年程前までは他社で実施しているという話はほとんど聞いたことがありませんでした。
そんな中、ガチャの不当表示対策や各種法令チェックについて、こんな悩みを他社から聞く機会がありました。

**・CSやQAの延長で、片手間で見るには限界がある**
**・法務が見るにも、リソースが足りない**

QAでは合同勉強会など先行して他社連携を行ってきていた為、その流れで聞くに至ったのです。
そこで、業界では珍しい審査業務を長年行っていた経験が少しでもお役に立てればと思い、情報交換をしようとなったのがはじまりです。


# **他社連携のねらい**

「そんな貴重な経験値を他社に展開してしまっていいの？」と思うかも知れません。
「ゲームを作る側」でいえば、他社はライバル。情報を提供することが命取りになるかもしれません。
しかし、私達審査チームの役割は、お客さまのあんしん・あんぜんを守ることです。
「自分の会社だけきちんとできれいればいいや」ではダメなんです。

例えば、同じモバイルゲーム業界でニュースに取り上げられるような問題が起きた場合、「うちはやってないから関係ないや」で済まされるでしょうか？
その影響は、業界全体に波及するのではないでしょうか。
「あなたの会社は大丈夫なんですか。変なことやってるんじゃないですか」など、トラブルを起こした当事者だけでなく業界全体への不信感につながる可能性もあります。

また、実務面でも「うちは大丈夫なのか」「今の体制で十分なのか。もっとやるべきじゃないのか」など、体制面含め様々な見直しが入り、業務を圧迫することにもなりえます。
であれば、何か起きてからではなく、他社と情報連携を行うことで「トラブルが起きづらい業界」に少しでも繋げることができれば、みんなハッピーだと思いませんか？

そのため、私達は「情報を出し惜しみしていても仕方がない。業界内で協力しあって、業界全体のあんしん・あんぜんに繋げていきたい」という想いで、積極的に他社連携を進めるようにしています。



# **どんなことしてきたの？**

最初は、「これから審査体制を検討する」フェーズの会社がほとんどなので、グリーで行っている審査業務について共有するところからはじまりました。
これが約5年程前になるかなと思います。
数社に対し同じように情報共有を行ってきた結果、ここ数年で審査部門が増えてきた印象です。
各社課題感がある中で必然的にそういった組織が組成されてきているのだとは思いますが、グリーの審査体制について積極的に情報共有をしてきたことで、多少は力になれた部分もあるのではないかと思います。

現在は、同じ審査部門同士、各社の体制や、業務内容、持っている課題感などの共有をさせていただいています。
会社によってはNDAを締結し、より踏み込んだ情報の共有をすることもあります。

会社の規模や取り扱っているタイトル数などにもよって審査体制は異なってくるので、業務内容や体制面は三者三様ですが、他社連携してきてよかった！と感じています。

**理由：「審査」には業界標準がないから**

審査は、QAやCSと異なり「どの会社でも当たり前に存在する業務」ではありません。
他社連携するまでは、「普通こうやるよね」という考えすらなく、相談する相手もいないので、ゼロベースで課題に取り組んでいました。
今では、定期的に開催する意見交換会の中で、「この問題に対してどう考えてますか？」「どう対処しましたか？」と、お互いに相談しあえることで、組織強化の一助になっています。


# **これからの他社連携**


審査部門が増えてきたことは、個人的には本当に喜ばしい流れだと思っています。
それは、グリーグループで古くから運用してきた審査体制が、業界にとって必要だったということの証明にもつながるからです。
その部門で四苦八苦してきた自分にとっては存在意義を証明できたようなものです。

また、同じ審査部門が業界に拡がれば拡がる程、キャリア形成にもつながるという点でも喜ばしいことだと思います。
（メンバーに転職してほしいわけではありません！）

今後については、これまで数社と意見交換会をさせていただいていますが、更に拡げていきたいと思っています。
ここ数年で審査部門が増えてきているとはいえ、まだまだ業界内ではニッチな存在です。
ですから、「組織化はされてないけど課題感がある」「これから検討していきたい」というフェーズの会社と連携を拡げていくことで、ゆくゆくは「モバイルゲーム業界には審査業務が当たり前に存在する」という状態にしていくことが野望です。

とはいえ、拡げたくてもコネがないと拡げられないのも事実。。。

もし、この記事をご覧になって、「うちも考えないといけないんだよな～」など、少しでも課題感がある企業様がいらっしゃいましたら、是非是非お声がけいただけたらうれしいです！

ということで、これまでの他社連携について振り返ってみました！
これからも、お客さまがあんしん・あんぜんにゲームを楽しんでいただけるよう、尽力して参ります！
roblox,luaで正規乱数をつくる

## はじめに
robloxおよびluaには一様乱数math.randomは用意されていますが、正規乱数が用意されていません。
そこで、一様乱数から正規乱数を生成する関数を定義しました。

## 参考
[ボックス＝ミュラー法](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95)
[Javascriptで正規分布](https://qiita.com/kyonsi/items/579a61edab661f27e3a5)
## コード

```lua:
local function randn()
	xx = math.random()
	yy = math.random()
	
	zz = math.sqrt(-2*math.log(xx))*math.cos(2*math.pi*yy)
	return zz
end
```
## 最後に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/b290638b-4fae-8abb-c6aa-5dc6168c856c.png)
なぜスクラムでは時間見積もりではなくポイント見積もりなのか

こんにちは。GxPの4年目の伊藤です。
この記事は[グロースエクスパートナーズ アドベントカレンダー](https://qiita.com/advent-calendar/2022/gxp)の3日目の記事となります。
本日の記事は今年受けたスクラムマスター研修で長年の疑問が解決したことを記事にしました。
参考になればと思います。

# 認定スクラムマスター研修
私はチームで働くことやチーム全体で最大限の成果を出すことに関心があり、スクラムマスターを目指しておりました。個人的にもスクラムについて勉強をしていましたが、認定スクラムマスターの資格を取らないかと会社から打診をいただき、今年の7月に認定スクラムマスターを取得するためにアギレルゴ社のスクラムマスター研修を受けさせていただきました。

講師は　ジェームズ　コプリエンさんに担当していただきました。
昨今の状況によりzoomを使ってのオンライン研修で、会話は英語でしたが同時通訳で日本語に通訳していただいたので英語が苦手な私でも不都合なく受けることができました。

スクラムの歴史から始まり、スクラムイベントやスクラムマスターとしてのふるまいなどエクササイズも交えて研修を行い、適宜質問をする時間も取っていただいたので非常に有意義な研修を受けられました。

https://www.jp.agilergo.com/training

# ポイント見積もりに対する疑問

スクラムについて個人的にも書籍やブログなどを読んだりして勉強をしていましたが、ポイント見積もりについて長年の疑問がありました。
それは  **「ポイント見積もりと時間見積もりは可換ではないのか」** ということです。

時間見積もりではなく、ポイント見積もりをする理由について調べると以下のような理由が挙げられています。


- 相対見積もりの方がわかりやすい
- そもそも正確に見積もることは不可能である
- スキルや経験の違いによる見積もりの差異をなくすことができる


時間見積もりでもフィボナッチ数や、30分、1時間、2時間、半日、一日といったような相対値で算出することも可能ではないのか。スキルや経験による違いもプランニングポーカーで話し合って埋めるのであれば、時間見積もりでも同じですし、最終的に食い違うのであれば平均や最大の値にするというのも時間見積もりでもできるはずという疑問を持っていました。

また、私自身も研修を受けるまではプランニングポーカーでポイント見積もりを出すときに、「2時間は1ポイントで、このチケットは1日(8時間)くらいかかりそうだから4ポイントだな。」といったように、一度時間換算してポイントを出していました。ここがポイント見積もりの一番勘違いしていたところであり、ポイント見積もりは時間見積もりと可換ではないかと思っていたところだと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906528/153e157a-5985-dbc9-3b32-6814daf2a822.png)



# なぜ時間見積もりはいけないのか
先ほどの理由により、これまで納得感がないままポイント見積もりを行っていました。そこで、研修でプランニングポーカーの説明のときに思い切ってこの長年の疑問を聞いてみました。どんな答えが返ってくるのだろうかという期待と納得できる答えをいただけるだろうかという不安がありしたが、シンプルで明快な答えをいただけました。
コプリエンさんからの回答は、**チームの成長が見えなくなるから**でした。

## チームの成長が見えない
説明は以下の通りでした。
時間見積もりであると8時間×5日とすると40時間×チームの人数がチームのベロシティになります。これはチームがどれだけ成長しても残業をしない限りベロシティは増えません。そのため、時間見積もりでのベロシティは一定になります。
しかし、ポイント見積もりであればチームが成長し、タスクを消化するスピードが早くなればスプリントに入れられるポイントが多くなりベロシティが増加します。これによりチームの成長がわかります。

それに、本当に40時間きっちり働いているのでしょうか。確かに仕事をしている時間はあると思いますが休憩を全く挟まないですか？チームメンバーと雑談したりすることはないのでしょうか？40時間の勤務時間にはコーヒーを飲む時間も含まれます。なのに時間にして一人40時間分のタスクを入れるのはおかしいですよねと丁寧に説明して下さりました。

時間見積もりで40時間詰め込んだら40時間分働くことになり、見積もった時間以内にタスクを終わらせる必要が出てきます。しかし、ポイント見積もりではポイントの大きさとタスクが完了する時間に相関はありますが、スプリント期間内にスプリントバックログが終わればよいのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906528/c78ce02e-f810-3136-1320-75a6922df260.png)


## 時間見積もりではタスクの再見積もりが必要になる
ここで再度確認になりますが、ポイント見積もりではタスクの大きさをポイントで見積もり、時間見積もりではタスクにかかる時間を見積もります。
通常リファインメントで2～3スプリント先の見積もりを行い、スプリントプランニングで次のスプリントのスプリントバックログに入れるタスクを決めます。チームが成長しそのタスクが昔の時間見積もりよりも小さくなると再見積もりが必要になります。しかし、ポイント見積もりであればポイントが表すものはタスクの大きさなので、チームが成長してもタスクの内容が変わらなければ見積もったポイントは変わることはありません。そのため、再見積もりの必要が無くなり無駄な作業が発生することがありません。
ポイント見積もりでは **タスクでやることを見積もるので、タスクにどれくらいの時間がかかるのかは関係ない** のです。


# 終わりに
時間見積もりではベロシティが変わらずチームの成長が見えないというのは非常に納得できるポイント見積もりをする理由でした。結局、私が間違えていたのは「タスクの大きさを見積もる」ところであり、今まではポイントで時間を見積もっていたのでした。

この長年の疑問を解決してくださったアギレルゴ社の認定スクラムマスター研修をしていただきありがとうございました！基礎的な内容から実践的な内容まで触れるので、初学者の方でも現場でスクラムをやっているメンバーやスクラムマスターをの立場の方でも満足できる内容の研修だったと思います。
また、スクラムマスターやりたいという意思と行動を見せて研修を受けさせてくれた弊社GxPに感謝です！
ちなみに認定スクラムマスターの資格は無事に取得できました。
yupで他の値を元に挙動を変更したい

## 何の記事?
yupで他の値を元にバリデーションの挙動を変えたかった。すぐ忘れそうなので覚書として放流🐟

## 前提条件
例として説明すると以下の型に沿うようなオブジェクトがある。
Settingの使い道は、fullNameとlastName両方の値が入力済みであった場合にのみ、useFullNameをtrueに出来る。といった要件。
逆に言えば、fullNameとlastNameが双方入力されていないとfalseに限定される。

```typescript
type ProfileType = {
    lastName?: string;
    firstName?: string;
}

type SettingType = {
    useFullName: boolean;
}
```

## 実装
サクッと

```javascript
yup.object().shape({
  firstName: yup.string(),
  lastName: yup.string(),
  useFullName: yup.boolean().required()
    .when(["firstName", "lastName"], {
      // isの戻り値がtrueになった場合にthenが実行される。
      is: (firstName, lastName) => !firstName || !lastName,
      then: yup.bool().oneOf([false], "両方に値必須の助"),
  }),
})
```

ちなみに、`yup.ref`を使っても別の値の参照はできるっぽい。
Could not run build/ios/iphoneos/Runner.app が表示されたら

```
Could not run build/ios/iphoneos/Runner.app on xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Try launching Xcode and selecting "Product > Run" to fix the problem:
  open ios/Runner.xcworkspace
```
が表示されて実機確認ができなくなったら、以下を実施してから再挑戦
```
rm -rf ~/flutter/bin/cache/artifacts/
```
【WordPress】php.iniを編集するプラグイン「Custom PHP Settings」

WordPressでアップロードファイル上限を管理画面から変更したい時は「Custom PHP Settings」というプラグインを使ってphp.iniファイルを編集し対応してます。

php.iniファイルでは、PHPの初期設定の変更を定義することができます。

このファイルを編集することでファイルのアップロード上限を変更することも可能です。

### php.iniファイルで設定できること

- エラー表示
- メモリ管理
- セキュリティー
- 文字コード
- タムゾーン
- ログ

## Custom PHP Settings

https://ja.wordpress.org/plugins/custom-php-settings

### 使い方

1. インストールと有効化
    
    有効化が完了すると管理画面メニューのツールにCustom PHP Settingsが表示されます。
    
2. 管理画面 > ツール > Custom PHP Settings をクリック。
3. 画面上部の「General」タブをクリックし、入力エリアにコードを記述。
    
    アップロードファイル上限を変更する場合は次のコードを追加します。
    
    ```php
    upload_max_filesize=500M
    post_max_size=500M
    memory_limit=500M
    ```
    
    上記の場合、アップロード上限が500MBに変更されます。
    
4. チェックボックス「If this option is selected the .htaccess or user INI file will be restored when the plugin is deactivated or uninstalled.」にチェックを入れる。
5. 「Save Sattings」をクリック。

以上でphp.iniにコードを追加できました！

## 参考

- [php.iniを管理画面から編集するWordPressプラグイン](https://wp-customize.net/wordpress/7457.html)
若手エンジニア向け：未来を見る力を鍛える方法

ワールドカップ盛り上がってます。日本も頑張って欲しいです。
サッカーで元代表の中田選手の話ですが、彼は全体の動きを読む力が異常に強いらしいです。
そして、目の力の中でも動体視力とか、色々とあるけど、周りの状況を瞬間的に読み取る力が強いらしい。
同じく、元大リーガーのイチロー選手も同じらしい。イチローの凄い所は、運動神経というよりも、目らしいです。
イチローがあれだけ、上手にバットコントロールしながら、ボールを打てるのは、バットコントロールだけでなく、常人と比べてボールがどう動くかを見る力が素晴らしく発達してるからみたいです。

# 予測する能力
イチロー選手も中田選手もボールとか周りをジッと見てる訳ではありません。目は、見た物の情報としては、3％だけで、残りの97%は、脳が作りだしています。
つまり、実際に見る力が凄いのではなく、少ないインプットから、ボールだったり、周りの人だったりが｢どう動くか？｣を想像する力が優れているという事だと思います。
これは経験からくるものでもあるし、常に様々なシチュエーションを頭でシミュレーションしてるから瞬間的に浮かんでくるんだと思う。

# 未来を想像する力
・過去の経験
・雰囲気を読む力
・人の心理を読む力
等を、掛け合わせた想像力が必要になってくる。
仕事においては、スポーツ程には、瞬間的な未来想像力は、必要では無い。でも、近未来を想像する必要があるのは、全く同じ。当然、企業の未来や市場の未来を考えたり、想像したりして動くのは当り前。
スポーツ選手の様にもっと素早く、近未来を想像して、もっと素早く意思決定をする事が出来たら、もっと沢山のビジネスチャンスを作り出す事ができるはず。

# エンジニアとして何をするか
## 情報収集　
テクノロジーの進化は想像以上の速さで進んでます。常に情報収集を怠っては行けません。
- 競業分析
同業他社の技術情報や元同僚の技術情報を確認して自分の抜け漏れをチェックしましょう。且つ、自分のスキルとマーケットとのギャップについても整理したいです。
- 副業にチャレンジ
副業に対しては否定的な意見もありますが、**井の中の蛙大海を知らず**という言葉もあります。収入目的ではなく、他社研究、情報収集としてチャレンジしてみてはいかがでしょうか？
## アウトプット
情報収集した物や仕事で発生した知見を整理してアウトプットしましょう。アウトプットする事で理解が深まります。
- SNSやblog等で情報を発信
QiitaやNOTE等では、ある程度のボリュームが必要なので自分の頭の整理や更なる調査、勉強も必要になります。そこまでは大変と思ったら、最初はtwitter等でのショート発信でも良いと思います
- 勉強会
現在は、勉強会もリモートで参加出来る様になってますので地方の方も物理的な遠距離が問題なくなりました。気軽にライトニングトークとか参加してみましょう。もちろんリアルで会う場があれば、そっちの方が沢山の人と交流できて良いと思います
## 議論
他人と議論する事で自分一人で気づかなかった部分についても知見が広がります。
SNSやblogで知見をアウトプットすると、色々な意見がもらえます。その上で議論を進めて知識を広げましょう。
勉強会でも色んな人と話すと知見が広がります。是非チャレンジしてみましょう。
## 考える
時間をとって頭の整理する時間は、必要です。お酒を飲んだ次の日に記憶がなくなるのは、海馬に記憶が保存される前にスグ寝てしまうからみたいです。頭の整理する時間を取ることで自分の考えに昇華させましょう。

# 最後に宣伝
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)