OmniAICreator/Qiita-1.07M huggingface dataset:
Rust でコードを書いているタイミングで URLのパースのエラーを検知する

Rust でコードを書いているタイミングで URLのパースのエラーを検知するマクロ(`safe_url!`)を作成してみました. ( https://crates.io/ には公開していないので, コピペしてカスタマイズして使ってください. )

# 普通の書き方
```rust
#[test]
fn test() {
    let example_com = url::Url::parse("https//example.com").unwrap();
    println!("example_com is {:?}", &example_com);
}

```
この書き方だと実行時にエラーが発生してしまう. 実行してからすぐに通る処理なら, ミスにすぐ気付けるが, めったに通らない処理だと指定ミスに気づけない.

# 今回作成した `safe_url!` を使うと
不正なURL (`https//example.com`) を指定しているとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117764/da582ca1-5be6-fc40-7e4b-d5e8070e6bfb.png)

正常なURL (`https://example.com`) を指定しているとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117764/ebe288b1-c985-c867-3a51-5f15bac705fe.png)

このように実行前にミスを検知できる.

```toml:Cargo.toml
[package]
name = "safe-url-macro"
version = "0.1.0"
edition = "2021"

[lib]
proc-macro = true

[dependencies]
url = "2.2.2"
quote = "1.0.18"
syn = "1.0.95"

```

```rust:lib/src
#[proc_macro]
pub fn safe_url(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    match syn::parse::<syn::LitStr>(input) {
        Ok(literal) => {
            let string_literal_value = literal.value();
            match url::Url::parse(&string_literal_value) {
                Ok(_safe_url) => quote::quote! {
                    url::Url::parse(#string_literal_value).unwrap()
                }
                .into(),
                Err(error) => {
                    let message =
                        string_literal_value + " is not valid url. (" + &error.to_string() + ")";
                    quote::quote! {compile_error!(#message)}.into()
                }
            }
        }
        Err(_) => quote::quote! {compile_error!("safe_url macro support string literal")}.into(),
    }
}

```

```rust:tests/test.rs
#[test]
fn test() {
    let example_com = safe_url_macro::safe_url!("https//example.com");
    println!("example_com is {:?}", &example_com);
}

```

https://github.com/narumincho/safe-url-macro

URLの指定はテキストエディタによっては表示が変わったりするのでミスには気づきやすいけれど, ミスをするときがあるので, コンパイル時にバリデーションすることは大切.


```rust
const EXAMPLE_COM: url::Url = safe_url_macro::safe_url!("https://example.com");
```
このように const で定数としてかければ更に良かったけど,  `url::Url::parse` が `const fn`ではなかったため できなかった. URL パースの処理を `const fn` で自作すればできそう

こういうコンパイル時に色々検査できる機能が増えると良いなぁ

正規表現(Regex)にはこの `proc-macro-regex` が使えそう?

https://crates.io/crates/proc-macro-regex
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?の解決方法

# 結論
子コンポーネントがaタグをラップしていないのに`passHref`を使用したことによるエラーだった模様

# 実際のエラー文
> Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

# 該当のコード
```
import { Phrases } from '../../types/types'
import PhraseCard from '../molecules/PhraseCard'
import CardCase from '../atoms/CardCase'
import Link from 'next/link'

const PhraseCardList: React.VFC<Phrases> = ({ phrases }) => {
  return (
    <ul className="w-full">
      {phrases &&
        phrases.map((phrase) => (
          <li key={phrase.id}>
            <Link href={`/phrases/${phrase.id}`} passHref>
              <CardCase hover={true}>
                <PhraseCard phrase={phrase} />
              </CardCase>
            </Link>
          </li>
        ))}
    </ul>
  )
}

export default PhraseCardList
```

# 修正ver
passHrefを使わないようにするとエラーは出なくなった
```
import { Phrases } from '../../types/types'
import PhraseCard from '../molecules/PhraseCard'
import CardCase from '../atoms/CardCase'
import Link from 'next/link'

const PhraseCardList: React.VFC<Phrases> = ({ phrases }) => {
  return (
    <ul className="w-full">
      {phrases &&
        phrases.map((phrase) => (
          <li key={phrase.id}>
            <Link href={`/phrases/${phrase.id}`}>
              <a>
                <CardCase hover={true}>
                  <PhraseCard phrase={phrase} />
                </CardCase>
              </a>
            </Link>
          </li>
        ))}
    </ul>
  )
}

export default PhraseCardList
```

# 参考文献
同じことが書かれていた。
- https://github.com/vercel/next.js/issues/7915

# 最後に
間違っていることがあれば指摘をお願いいたします。
【AWS】KMSキーポリシー変更（KMSで暗号化したEBSを別AWSアカウントで利用）

コピー元のEBSでKMSを使用している場合、
コピー先のアカウントの許可設定をコピー元で設定してあげる必要があります。

①コピー元のインスタンスからEBSを選択→ボリュームIDをコピー
②KMS→カスタマー管理型のキー→①のIDで検索
③キーポリシー→編集
**④以下の２項目にアカウントID:IAMユーザーを追加**

![スクリーンショット 2022-05-29 15.34.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/1071770c-4d03-7c40-3fe4-b40f31894d75.jpeg)

```
"Sid": "Allow use of the key"
"Sid": "Allow attachment of persistent resources"
```
※キャプチャ上は上の項目はありません

```
 "arn:aws:iam::アカウントID:user/IMAユーザ名",
```


ちなみにここ、ロールも可ですが、
IAMグループは登録できないみたいです:cry:
カレーは大鍋で作らない。~初心者のためのクラス継承~

こんにちは、文脈です。

人参・じゃがいも・玉ねぎがあればなんでもできますね。

## まとめ

人参・じゃがいも・玉ねぎ
 ∟ウインナー・コンソメを入れると→ポトフ
 ∟肉を足す
 　∟カレールウを入れると→カレー
 　∟しょうゆ・酒・しらたきを入れると→肉じゃが

これが「クラスの継承」です。

## ソースコード

人参・じゃがいも・玉ねぎ
これは`Class Konsai`としましょう。

```
Class Konsai
{

// 洗って皮をむいて適切な大きさに切った根菜
const KONSAI = ['ninjin', 'jagaimo', 'tamanegi'];

/**
 * 根菜を煮込む
**/
public function cookKonsai(){
  $nabe = ['mizu']

  // 野菜を水が入った鍋に入れる
  $nabe = array_merge($nabe, self::KONSAI);

  // 野菜が入った鍋を火にかけてアクを取る
  $cookedKonsai = $nabe + $heat - $aku;

  return $cookedKonsai
}

}
```


`Class Konsai`は便利なのでなるべくいろんな料理に使いたいです。
大鍋にいきなりカレーを入れてしまうと、毎日カレーを食べる羽目になるので、`Class Konsai`を継承（小さい鍋に移）して、その中にだけカレールウを入れることにしましょう。

あと肉も入れたいけど、大鍋はウインナーポトフにも転用したいことを考えると、まず`Class Konsai`を中鍋に移して肉を入れて、そこからさらに分けてカレーを作るのが良さそうです。中鍋にしょうゆ入れたら肉じゃがにもなるし。

```
Class Konsai_Niku extends Konsai
{

// 好きな肉を肉と定義
const NIKU = 'buta';

/**
 * 肉を入れる
**/
public function addNiku($nabe){

  // 鍋に肉を入れる
  return array_merge($nabe, self::NIKU);

}

}
```

カレーも同様に作ります。

```
Class Konsai_Niku_Curry extends Konsai_Niku
{

// ルウってrouxっていうらしい
const CURRY_ROUX = ['spice', 'buiyon'];

/**
 * カレールウを入れる
**/
public function addCurry($nabe){

  // 鍋にルウを入れる
  return array_merge($nabe, self::CURRY_ROUX);

}

}
```

天才ですね。

やはりここで大事なのは命名で、`Konsai_Niku_Curry`とすることでシーフードカレーではないことがわかります。

ここまでで書いたものは「カレーの作り方の作り方」でして、これを書いただけではカレーはできません。

次にカレーのレシピを書きます。`Konsai`や`Niku_Konsai`から継承しているため、`Konsai_Niku_Curry`は親クラスのメソッドを呼び出すことができます。

※「メソッド」を「呼び出す」とは？みたいな話は割愛します。雰囲気をお楽しみください。

```
/**
 * カレーのレシピ
**/

$kome = new Kome;
$curry = new Konsai_Niku_Curry;

// 米を炊く
$rice = $kome->cookKome();

// 野菜を煮る
$nabe = $curry->cookKonsai();

// 肉を入れる
$nabe = $curry->addNiku($nabe);

// ルウを入れる
$nabe = $curry->addCurry($nabe);

// 雑に盛り付け
$dinner = array_merge[$rice, $nabe];

```

これを作る人、または自分に渡して「実行」するとカレーができます。



## 最後に

実生活では、カレールウは火を止めてから入れ、余熱で溶かした方がとろみが出ます。
またカレーは内側に熱がこもりやすく、傷みやすい料理です。2日目のカレーを楽しみたいあなたも、台所にそのままにせず、かき混ぜてよく冷まして冷蔵庫へ！

おわり。
Adversarial Attack (敵対的攻撃) に関するリポジトリをまとめてみた

自分用のメモを兼ねて、Adversarial Attackに関連するリポジトリをまとめてみました。用途に応じてざっくり分類しました。


### Library
- [Trusted-AI/adverasarial-robustness-toolbox](https://github.com/Trusted-AI/adversarial-robustness-toolbox)
  - 今回調べた中では最も大規模でドキュメントも充実している印象。
  - Evasion, Poisoning, Extraction, Inference attackに対する評価を行うことができる。
- [Harry24k/adversarial-attacks-pytorch](https://github.com/Harry24k/adversarial-attacks-pytorch)
  - white-box attackに特化した印象。
- [bethgelab/foolbox](https://github.com/bethgelab/foolbox)
  - Pytorch, tensorflow, jaxなど多くのモジュールに対応
- [google-research/robustness_metrics](https://github.com/google-research/robustness_metrics)
  - 以下の三つの観点からモデルを評価できる。
    1. out-of-distribution generalization (e.g. a non-expert human would be able to classify similar objects, but possibly changed viewpoint, scene setting or clutter).
    2. stability (of the prediction and predicted probabilities) under natural perturbation of the input.
    3. uncertainty (e.g. assessing to which extent the probabilities predicted by a model reflect the true probabilities)
- [BorealisAI/advertorch](https://github.com/BorealisAI/advertorch)
  - white-box attackに特化した印象。L-BFGSが実装されている。
- [robustness-gym/robustness-gym](https://github.com/robustness-gym/robustness-gym)
- [ppwwyyxx/Adversarial-Face-Attack](https://github.com/ppwwyyxx/Adversarial-Face-Attack)
  - 顔認証システムに対する攻撃
- [thunlp/OpenAttack](https://github.com/thunlp/OpenAttack)
  - 言語モデルに対する攻撃手法が複数実装されている
- [QData/TextAttack](https://github.com/QData/TextAttack)
  - 言語モデルに対する攻撃・データ水増し手法など

### Benchmark
- [Robustbench/robustbench](https://github.com/RobustBench/robustbench)
  - モデルのロバスト性を競う大規模なベンチマーク
- [MadryLab/robustness](https://github.com/MadryLab/robustness)
  - 敵対的学習されたモデルに対する攻撃成功率を競うベンチマーク（pre-trainedモデルが入手できる）
- [hendrycks/robustness](https://github.com/hendrycks/robustness)
  - Benchmarking Neural Network Robustness to Common Corruptions and Perturbations

### 文献まとめ
- [safe-graph/graph-adversarial-learning-literature](https://github.com/safe-graph/graph-adversarial-learning-literature)
  - グラフモデルに対する攻撃論文の一覧
- [EdisonLeeeee/Graph-Adversarial-Learning](https://github.com/EdisonLeeeee/Graph-Adversarial-Learning)
  - グラフモデルに対する敵対的学習
  - 300以上の論文
- [nicholas carlini のホームページ](https://nicholas.carlini.com/writing/2019/all-adversarial-example-papers.html)
  - arxivにある敵対的攻撃関連の論文の完全なリストだそうです。凄まじい。。。
【Angular】Type 'string' is not assignable to type 'LoadChildrenCallback'.ts(2322) router.d.ts(1998, 5): '

# Angularを13にアップグレードすると
Angularを11系から13系にアップグレードしました。
すると`src/app/app-routing.module.ts`でこんなエラーが大量に・・・

```console
Type 'string' is not assignable to type 'LoadChildrenCallback'.ts(2322) router.d.ts(1998, 5): The expected type comes from property 'loadChildren' which is declared here on type 'Route'
```



```console
 Error: src/app/app-routing.module.ts:9:5 - error TS2322: Type 'string' is not assignable to type 'LoadChildrenCallback'.
[ng] 9     loadChildren: './home/home.module#HomePageModule',
[ng]       ~~~~~~~~~~~~
[ng]   node_modules/@angular/router/router.d.ts:1998:5
[ng]     1998     loadChildren?: LoadChildren;
[ng]              ~~~~~~~~~~~~
[ng]     The expected type comes from property 'loadChildren' which is declared here on type 'Route'
[ng] Error: src/app/app-routing.module.ts:14:5 - error TS2322: Type 'string' is not assignable to type 'LoadChildrenCallback'.
[ng] 14     loadChildren: './my-page/my-page.module#MyPagePageModule',
[ng]        ~~~~~~~~~~~~
[ng]   node_modules/@angular/router/router.d.ts:1998:5
[ng]     1998     loadChildren?: LoadChildren;
[ng]              ~~~~~~~~~~~~
[ng]     The expected type comes from property 'loadChildren' which is declared here on type 'Route'
[ng] Error: src/app/app-routing.module.ts:16:18 - error TS2322: Type 'string' is not assignable to type 'LoadChildrenCallback'.
[ng] 16   { path: 'day', loadChildren: './day/day.module#DayPageModule' },
[ng]                     ~~~~~~~~~~~~
[ng]   node_modules/@angular/router/router.d.ts:1998:5
[ng]     1998     loadChildren?: LoadChildren;
[ng]              ~~~~~~~~~~~~
[ng]     The expected type comes from property 'loadChildren' which is declared here on type 'Route'
[ng] Error: src/app/app-routing.module.ts:17:22 - error TS2322: Type 'string' is not assignable to type 'LoadChildrenCallback'.
```

# dynamic importの書き方が変わったようです！

```typescript:app-routing.module.ts
// 古いバージョン
  {
    path: 'my-page/:id',
    loadChildren: './my-page/my-page.module#MyPagePageModule',
  },

// 新しいバージョン
 {
    path: 'my-page/:id',
    loadChildren: () => import('./my-page/my-page.module').then(m => m.MyPagePageModule),
  },
```

また、`tsconfig.json`も`"module": "esnext"`になっているか要確認！

```typescript
{
...
"compilerOptions": {
    ...
    "module": "esnext"
    ...
    }
}
```


# 参考

https://stackoverflow.com/questions/70313032/type-string-is-not-assignable-to-type-loadchildrencallback
access2000の作法 その6

# 概要
access2000の作法、調べてみた。
CreateTableDef使ってみた。

# テーブルを作る手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド9_Click()
    Dim db As Database:
    Set db = CurrentDb
    Dim Tbl As TableDef:
    Set Tbl = db.CreateTableDef("事業所")
    Dim flds As Fields
    Dim fld As Field
    Dim prp As Property
    Dim i As Long
    Dim idx As Index
    'db.Execute ("DROP TABLE 事業所;")
    With Tbl
        Set fld = .CreateField("ID", dbLong)
        fld.Attributes = dbAutoIncrField
        .Fields.Append Object:=fld
        .Fields.Append .CreateField("所在地", dbText, 255)
        .Fields.Append .CreateField("事業所名", dbText, 100)
        .Fields.Append .CreateField("郵便番号", dbText, 10)
        .Fields.Append .CreateField("取扱局", dbText, 80)
        .Fields.Append .CreateField("修正コード", dbText, 8)
    End With
    With Tbl
        Set idx = .CreateIndex("PrimaryKey")
        idx.Fields.Append idx.CreateField("ID")
        idx.Primary = True
        idx.CreateProperty "ID", dbLong
        .Indexes.Append idx
    End With
    db.TableDefs.Append Tbl
    MsgBox "ok"
End Sub
```

- フォームを閉じる
- 保存する

以上。
Cloud Functions (Go言語) & PubSub & Cloud Scheduler を利用してcronを実現する

方法を3ステップで解説します

# STEP1 トピックを作成する

GCP の PubSub のコンソールからトピックを作成する

名前は、「hello-functions」にしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38174/7100bd83-21bd-a557-33b3-bd517563cb27.png)

# STEP2 メッセージを受信して起動するアプリケーションを　Cloud Functions にデプロイする

## コード

GCP の Cloud Functions のコンソールから「関数の作成」を選択して出てくるテンプレートと同じ内容です

```go:hello_functions.go
package p

import (
	"context"
	"log"
)

type PubSubMessage struct {
	Data []byte `json:"data"`
}

func HelloPubSub(ctx context.Context, m PubSubMessage) error {
	log.Println(string(m.Data))
	return nil
}
```

## gcloud (CLI) でデプロイ

ここで`--entry-point`を指定しないといけなそうですが、指定しなくても動きました（エクスポート(関数名の先頭が大文字)している関数が１つだからかな？）

```
gcloud functions deploy HelloPubSub --runtime go116 --trigger-topic=hello-functions --project <firebaseのプロジェクト名>
```

# STEP3 Cloud Scheduler で定期的にメッセージを送信する

以下のページを参考に、Cloud Scheduler を設定する

[Cloud Functionsを定期実行させてみる | DevelopersIO](https://dev.classmethod.jp/articles/try-cloud-functions-scheduler-pubsub/)


# 参考

- [Cloud SchedulerでGoのCloud Functionsを定期的に実行する | shimar's blog](https://blog.shimar.me/2020/09/13/cloud-scheduler-and-golang-cloud-functions)
- [Cloud Functionsを定期実行させてみる | DevelopersIO](https://dev.classmethod.jp/articles/try-cloud-functions-scheduler-pubsub/)
PythonのWebフレームワークMasoniteをdockerで初めの一歩

# 出会い
以下の素敵な記事を見ていたら、何だか気になるアイコンのWebフレームワークが。

https://qiita.com/tamura__246/items/672bd98a8f30b76789b6


# キミの名は
Masonite
![masonite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156608/66c4fe99-e911-67fb-97b7-5ffb6fc5bb37.png)

メゾナイトと読むのでしょうか。
何だか分かりませんが、アイコンに親近感が湧きます。
~~イナズマンっぽいから？~~

https://github.com/MasoniteFramework/masonite

# とりあえず動かしてみる

```bash
# ホスト側
docker run -it -p 80:8000 python:3.10-slim-bullseye /bin/bash

# コンテナ内
pip install masonite
mkdir ~/masonite
cd ~/masonite
project start .
python craft serve -b 0.0.0.0
```

localhostにアクセスすると、以下のような画面が表示される。

![スクリーンショット 2022-05-29 13.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156608/8ea36d58-d6c9-ca09-aef3-410b1032496b.png)

# そして、別れ
Qiitaで調べると、**Laravel**っぽいとあります。
普段業務でLaravelを使う事が多いので、少しPython学習がてら勉強してみようと思ったのです。

https://qiita.com/dumblepy/items/65b975302618cb6a8f64
自分用ポーカーメモ

# はじめに

ポーカーのド初心者が自分のために書いたメモです

# プリフロップ

- 原則ポジションがないときに小さく、ポジションがあるときに大きくオープンする
    - UTG 2-3bb
    - LP 3.5-4bb
    - SB 3bb

- 原則強いハンドは大きく、弱いハンドは小さくベットする → 期待値が大きくなる　 (が、ハンドレンジを知られないためにハンドの強さによって変えるのはベット額ではなくレイズするかどうか)
- TT以下のポケットはできるだけ安くマルチウェイにしてセットを引きに行く
- スーコネなども安くドローを引きに行く

## リンプ

基本的にリンプしないほうがいいが次の場合はリンプするときがある
- アーリーポジションでAAなどのときのリンプレイズ（レイズして降りられると困るのでリンプインして様子をみる、レイズされたら3bet,4bet,all-inする）
- スーコネやローポケのリンプコール（リンプインして安く引きたい、レイズにもコール）

ポケはレイズインしてフロップで絡まなかった相手をフォールドさせるためにも使える

## 3bet

### バリュー3bet

レンジ・・・TT+,AQs+,AQo+ (PFR 20%)

3betするか迷ったら
- ポジションがあるときはレンジを広くしてコールでもいい
- ポジションがないときはレンジを狭くして参加するなら3bet

3betにコールするか迷ったら
3betにコールできるハンド
AA、AK、AQs、AJs、ATs、KK、KQs、QQ
コールできないハンド
JQo, KJo, AToなどのドミっててアウツが少なく、ヒットしてもキッカー負けしていたり、ドローにも発展しなさそうなハンド


### ライト3bet (ブラフ3bet)

レンジ・・・A9s-A2s, KTs+, 76s+ (PFR 20%)

本来は3betに使わないハンドで3betし、スクイーズ（全員フォールドさせ、場に出ているチップを奪う）すること。
コールされてオープンしてしまっても戦えるハンドを使う。
- 56sなどの上のハンドと被らずフラッシュやストレートに発展する可能性があるハンド
- A3sなどのナッツフラッシュやストレートに発展する可能性があるハンド

3betpotでは上ストレートがいる可能性も低く、ひけたときほぼナッツを確信できる


# フロップ

前提
- ペアでない2枚のカードがフロップでペア以上になる確率は1/3（ポジションによって有利なボードのときはそれ以上、不利なときはそれ以下になることを考慮する）
- ポケがフロップでセット以上になる確率は1/8

基本の動き
- フロップで絡んでない場合、基本的には降りる
- フロップに絡んでいるハンドをまくれるアウツがある場合はセミブラフするかチェックコール
- アグレッサーのとき、絡んでない相手をフォールドさせるため、相手のハンドを絞るためにCBを打つ、あきらめの場合はチェック

## アウツとコールできるベット額

チェックされたらチェック、
アグレッサーの場合はセミブラフでブロックベットするか通常通りCBを打つ
(※ブロックベット・・・アグレッサーがチェックするとベットしてくるプレーヤーには安くベットしてコールさせたほうが結果として安く引くことができる)
ベットされたときにどれくらいまでコールできるかを考える
全然正確じゃないけどおおまかに

- オープンエンド、ダブルベリー アウツ8枚、16％、32％　→　1/2-1pot
- ガット アウツ4枚、8%、16％　→　1/4-1/2pot
- フラッシュ　アウツ9枚、18％、36％　→　1/2-1pot
- 2オーバー　アウツ6枚、12％、24％　→　-1/2pot

ターンでも必ずベットしてくるような相手の場合はターンの勝率を考える
ターンでチェックしてくれそうならターン・リバーまでの勝率を考える

フロップでドローになった場合は基本的には降りずにコールかブラフする
ブラフするのにかなり向いていて、引いたときにポットを大きくとることができるのでブラフしたほうがいい

https://kihara-poker.hatenablog.com/entry/2018/09/28/150827


###

###

## ex) AKの3betpotフロップ

プリフロップではかならず3betする

- ヒットした場合はキッカー勝ちしてるので1/3ベット
- ヒットしてない場合はドライボードの場合のみ1/3ベット(6枚アウツがあるセミブラフ)

ベット額はSPRにもよるが、コミットを増やしすぎないように1/3がちょうどいいらしい



# ターン

# リバー

# トナメ

- 何かしら絡んでないとその後ついていくのが厳しくなるので素直に降りる
- リンプでもコールでもレイズされて困るハンドはそもそも乗らない
- 基本的にレイズインしてヘッズアップに持ち込む
- UTGのときは2-2.5bbオープン、コールがたくさんいるときは大きめにレイズ
- 自分より強いハンドを持っている相手にブラフしない、相手が弱そうなときにブラフする
- 強いときは相手にブラフしてもらえるように弱そうにみせる
- 強いハンドのときブラフっぽくオールインするとチップリにブラフキャッチしてもらえたりする

# 参考
GitHub-リモートリポジトリ作成からプルリクエスト発行までの具体的な手順メモ

GitHubの左上の「New」からリモートリポジトリを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/012dbb1e-fe57-06e4-9816-65697b0a0bff.png)

「Repository name」、「Description（リポジトリの説明）」を記載して、「Public or Private」「Add a README file」「Add.gitignore」「Choose a license」を都合のいいように選択する。（この3つに関してはよくわかってない。）最下部の「create repository」からリポジトリ作成完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/0cb3a3d1-01b8-b9fd-9f5c-103f04c2bd36.png)

作成したリポジトリのCodeをHTTPSを選択した後にコピーする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/b2fd7fbe-40a7-9554-7c5b-464cb5611ae9.png)

ターミナル上で「git cloen https…（コピーしたURLをペースト）」と打てば、リモートリポジトリの内容がクローンされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/6694020c-267d-8e25-d2a6-4f47af184de7.png)

「cd ディレクトリ名」で移動すると（main）と表示される（今どのブランチにいるかがわかる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/6b565e1a-0a34-e806-b8b1-e03560076889.png)

ファイルをテキトーに変更した後「git add ファイル名」→「git commit -m "コメント"」と打つ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/d7a12353-9dc8-c2cf-a695-4d8d1b151fe9.png)

ユーザーネームとパスワードを聞かれる
→ユーザーネームはGitHubアカウントの名前。パスワードは画像のように入手する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/23e34fdd-084c-c8c1-2cd3-91e1da739743.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/bb3f093f-e39e-4462-bbff-da0d6cdda284.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/0c96d5a7-c6b2-bfa7-0753-025cd0b0ad3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/5d05e0fe-6dcc-ab20-9092-98b541c98d7f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697069/2c8c502d-8aaf-c4ae-b4dd-cb664449b586.png)

「git push origin main」でリモートリポジトリにプッシュする
→ 「git pull origin main」でプルする（意味は分かってない

「git switch -c ブランチ名」でブランチを切る（ブランチを切るってどういうことなんだまじで）
→ファイル変更、add→commit→「push origin ローカルのブランチ名」という流れをする。

GitHub上でプルリクエストを発行して終わり。

手順だけ脳死でメモしたけど、何がどうなってるのかよくわかってないので意味は無いです。
ReactのFragmentの書き方

# Fragmentとは
Reactコンポーネントは、ルートの要素が1つでないといけない。
だがそのために``<div>``など不要なDOMで囲むのは良くない。

例えば、以下のColumnsコンポーネントのルート要素が``<div>``だったらHTMLとして良くない（レーブルタグにdivを使ってはいけないから）。
```
<table>
  <tr>
    <Columns />
  </tr>
</table>
```
このように不要なDOMを書くことは極力避けたい。
ではルートに複数の要素がある場合はどうすれば良いのか？
そこで登場するのがFragmentである。

# Fragmentの書き方3つ
１つ目：``<React.Fragment>``
```
import { Fragment } from 'react';

export const Columns = () => {
  return (
    <React.Fragment>
      <td>A</td>
      <td>B</td>
    </React.Fragment>
  )
}
```
２つ目：``<Fragment>``
```
import React from 'react';

export const Columns = () => {
  return (
    <Fragment>
      <td>A</td>
      <td>B</td>
    </Fragment>
  )
}
```
３つ目：``<>`` 
```
import { Fragment } from 'react';

export const Columns = () => {
  return (
    <>
      <td>A</td>
      <td>B</td>
    </>
  )
}
```

# １つ目はいつ使うのか
1つ目の``<React.Fragment>``は長ったらしいだけに見えるが、唯一keyを持つことができる。
keyを持たせたいときは``<React.Fragment>``を使おう。

https://ja.reactjs.org/docs/fragments.html
【GAS】実行ユーザーの名前を取得する方法

# 結論
:::note
プロパティに名前を登録しておき、プロパティから情報を取得する。
公式ドキュメント：[Properties Service](https://developers.google.com/apps-script/guides/properties)
:::
:::note warn
Google連絡先に名前を登録しておき、情報を取得する方法もあるが、実行時間が約10倍かかります。
公式ドキュメント：[Class ContactsApp](https://developers.google.com/apps-script/reference/contacts/contacts-app)
:::
# サンプルコード
```javascript:sample.gs
// プロパティに情報を登録しておく
function setProp() {
  let scriptProperties = PropertiesService.getScriptProperties();
  //'example@gmail.com'は実行ユーザーのメールアドレスに置き換える
  scriptProperties.setProperties({
    'example@gmail.com_familyname': '山田',
    'example@gmail.com_fullname': '山田太郎'
  });
}

// プロパティから情報を取得
function getProp(){
  console.time('getProp()の実行時間');
  // 実行ユーザーのメールアドレス取得
  let userEmail = Session.getActiveUser().getEmail();
  // 取得したメールアドレスと「_familyname」「_fulname」を組み合わせて、プロパティから名前を取得
  let scriptProperties = PropertiesService.getScriptProperties();
  let propData = scriptProperties.getProperties();
  console.log('getProp():' + propData[userEmail + '_familyname']);
  console.log('getProp():' + propData[userEmail + '_fullname']);
  console.timeEnd('getProp()の実行時間');
}

// Google連絡先に名前を登録しておく。
// Google連絡先から情報を取得
function getGoogleContent(){
  console.time('getGoogleContent()実行時間');
  // 実行ユーザー情報取得 
  let userData = Session.getActiveUser();
  // 取得したユーザー情報で、Google連絡先に登録されている連絡先＞苗字を取得
  let familyName = ContactsApp.getContact(userData).getFamilyName();
  // 取得したユーザー情報で、Google連絡先に登録されている連絡先＞フルネームを取得
  let fullName = ContactsApp.getContact(userData).getFullName(); 
  console.log('getGoogleContent():' + familyName);
  console.log('getGoogleContent():' + fullName);
  console.timeEnd('getGoogleContent()実行時間');
}

//実行時間を比較
function measureTime(){
  getProp();
  getGoogleContent();
}

```
![実行結果（prop_contact）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2441785/741d1388-c0bb-21e2-0525-3b9a48186fd4.png)



###### 参考文献
・実行時間をログ出力する方法

https://tonari-it.com/gas-console-time/
Elasticacheの設定って分かりにくくないですか？

# はじめに
Elasticache(Redis)を初めて使った際、設定に少し混乱したので備忘録としてまとめておきます。

# アーキテクチャと用語
* Elasticacheは、たとえNodeが1つだけでも、必ず「クラスター」を構成する
* 「クラスターモード」とは
    *  「クラスターモード：on」 => 複数のShardにshardingされる（データを分散して配置する）
    *  「クラスターモード：off」 => shardingされない（1つのShardにまとめてデータを配置する）
* 「レプリケーション」とは
    * Shard内のバックアップのこと。
    * 「クラスターモード：on」であればShardに分散された分だけのバックアップとなる。

※ 図は[こちら](https://dev.classmethod.jp/articles/amazon-elasticache-redis-param/)からお借りしています。
![スクリーンショット 2022-05-29 11.55.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/8de12701-d537-93f0-84d2-8476d13d89a9.png)

# エンドポイント
クラスターモードによってエンドポイントの名称は異なる。
「クラスターモード：on」であれば、shardingによりデータは分散されているため、どのNodeと読み書きすべきかはAWS側で決める。このため、`Configuration Endpoint`しか指定できない。


![スクリーンショット 2022-05-29 12.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/f98bfe64-0538-ae43-3b47-65ae4bdcd350.png)

# CloudFormationサンプル

## 「クラスターモード：off」かつNodeが1つだけのとき
```yml: one-node
ElastiCacheRedis:
    Type: AWS::ElastiCache::ReplicationGroup
    Properties:
      MultiAZEnabled: false
      Engine: redis
      EngineVersion: 6.2
      Port: 6379
      CacheNodeType: !Ref ElastiCacheInstanceType
      NumNodeGroups: 1
      ReplicasPerNodeGroup: 0
      AutomaticFailoverEnabled: false
      AutoMinorVersionUpgrade: false
      CacheSubnetGroupName: !Ref ElastiCacheSubnetGroup
      SecurityGroupIds:
        - !Ref ElastiCacheSecurityGroupId
      CacheParameterGroupName: default.redis6.x
```

## 「クラスターモード：on」かつShardが1つだけのとき
```yml: one-node
ElastiCacheRedis:
    Type: AWS::ElastiCache::ReplicationGroup
    Properties:
      MultiAZEnabled: true
      Engine: redis
      EngineVersion: 6.2
      Port: 6379
      CacheNodeType: !Ref ElastiCacheInstanceType
      NumNodeGroups: 1
      ReplicasPerNodeGroup: 1
      AutomaticFailoverEnabled: true
      AutoMinorVersionUpgrade: false
      CacheSubnetGroupName: !Ref ElastiCacheSubnetGroup
      SecurityGroupIds:
        - !Ref ElastiCacheSecurityGroupId
      CacheParameterGroupName: default.redis6.x.cluster.on
```

# その他メモ
Redisのパスワード認証はTLS通信が前提となるので、単にパスワード認証を組み込むだけではダメ。

# 参考
こちらの記事を大いに参考にさせていただきました。多謝。

https://dev.classmethod.jp/articles/amazon-elasticache-redis-param/

https://qiita.com/charon/items/53790d8826e32561535d
AWS Certified Solutions Architect Associate に学生で合格しました！

# はじめに
入社前に AWS Certified Solutions Architect Associate が必要だったので、受験し合格しました。
そのときに使用した教材、勉強方法、勉強時間等を記録していきます。
学生や新卒の方で、まだ技術のことがわからない方に参考になれば幸いです。
※内容は今後もアップデートしていく予定です。

# AWS 認定試験の履歴
- 2022年3月 AWS Certified Solutions Architect Associate 合格（1発合格）
- 2022年6月 AWS Certified Developer Associate 受験予定

2022年9月までに Associate 試験3冠を目指します。

# 受験当時の能力
## 一応の学歴
工業高校卒業（情報系）→ 理系地方国立大学卒業（情報系）
プログラミング歴：8年
得意な言語：Python

## 受験時のAWSの知識
受験当時は、AWSを触ったことがありません。またAWSが何をしているのかもわかりません。
AWS = Amazon Prime みたいなものだと思っていました。
クラウド = iCloud みたいなサービスと思っていました。
当然、コンテナ・K8s・DNS etc. なにそれ美味しいの？ってレベルです。

# 使用教材
- 参考書：[AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版](https://www.amazon.co.jp/AWS-E8-AA-8D-E5-AE-9A-E8-B3-87-E6-A0-BC-E8-A9-A6-E9-A8-93-E3-83-86-E3-82-AD-E3-82-B9-E3-83-88-AWS-E/dp/4815607389/ref=dp_ob_title_bk)
- Udemy：[【2022年版】これだけでOK!AWS認定ソリューションアーキテクト-アソシエイト試験突破講座](https://www.udemy.com/share/101WKk3@nfOpfOGzh0uq4Uy_2xXkdI3HJEuGLMBZg1azj4btk350yzq0R7o6Z12kUnwJGri74g==/)
- Udemy：[【2022年版】AWS認定ソリューションアーキテクト-アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/share/101rfM3@quLh9AOxfwikXT6YvvxSepH_gaTwUh4YQ6m97wwrx753AYYYqXjbOUDwdEp0hKp8Kg==/)


# 勉強方法
## 1.参考書を読んで概要を掴む
まずは概要をつかむため参考書を用いました。
AWS とはどのようなサービスなのかをざっと読み進めていきました。

## 2.Udemy のハンズオンを通して実際のサービスに触れてみる
ボリュームがあり途中でやめました（20%完了）。
試験に合格するだけであればハンズオンは必要ないと思います。実際、時間の無駄でした。
ですが、最後にある模擬試験だけは解きました。

（正答率 72%以上で合格）
演習テスト1：1回目（30%）→ 2回目（55%）→ 3回目（80%）→ 4回目（84%）
演習テスト2：1回目（33%）→ 2回目（72%）→ 3回目（84%）

:::note warn
講義のコメントにもありますが、誤字脱字が多く存在しています。
真剣に解いていると、誤字脱字がちらつきストレスになります。
:::

## 3.模擬試験に取り組む
Udemyの模擬試験を買って勉強しました。6回分の模擬試験が含まれてます。
こちらも多くも問題が収録されており、全部は解くことができませんでした（3回分のみ実施）。

（正答率 72%以上で合格）
演習テスト1：1回目（64%）→ 2回目（92%）
演習テスト2：1回目（52%）→ 2回目（72%）
演習テスト3：1回目（44%）→ 2回目（78%）

:::note warn
講義のコメントにもありますが、誤字脱字が多く存在しています。
真剣に解いていると、誤字脱字がちらつきストレスになります。
:::

# 勉強期間
1ヶ月

# 試験当日
受験日は3日前に決めたため、ピアソンVUE（日本語の試験監督が指定可）の予約が取れず、PSI（英語の試験監督）で受験しました。
チャットで部屋の中やスマートフォンの確認を行います。英語で会話をするのに一苦労しました。

部屋は締め切ることが原則なので、クーラーがないと死にます。
試験内容は、Udemy の模擬試験と全く違ったため、絶対に落ちたわ、と思いながら受けていました。
試験時間は、すべて解き、見直しまで含めて10分残るくらいでした。

試験問題の文章が長く、相当集中しないと合格は難しそうです。

# 結果
スコア 741点（720点合格）

# 反省
勉強時間が短かったため、運で合格した形だと思います。
ただ一つだけ言えることは、Udemy の模擬問題は最後までやったほうがいいです。
試験後に見直してみると、この問題出てたじゃん、が多いです。
さらに**正解した**、**間違えた**問わず、各項目まで詳しく見ていくことが大切だと感じました。
そのサービスが何をしているのか、どんな効果を得られるのかまで、自分で説明できるようになると、どんな問題でも対応できると思います。
Multipart で APIにリクエストしたとき "Invalid multipart request with 0 mime parts" にハマる

# やろうとしたこと
 Javascript Axios でGoogleDrive にファイルをアップロード
# 作ったソース

```Javascript
/** Googleドライブ 指定フォルダにファイルをアップロード */
export async function upload(name, mimeType, base64, folderId, accessToken) {
  const body = BOUNDARY + "\r\n"
        + "Content-Type: application/json\r\n\r\n"
        + JSON.stringify({
          title: name,
          mimeType,
          name,
          parents: [folderId],
        }) + "\r\n"
        + BOUNDARY + "\r\n"
        + 'Content-Type: ' + mimeType + "\r\n"
        + "Content-Transfer-Encoding: base64\r\n\r\n"
        + base64 + "\r\n"
        + BOUNDARY + "--";
  const headers = {
    Authorization: `Bearer ${accessToken}`,
    'Content-Type': `multipart/related; boundary="${BOUNDARY}"`,
    accept: '*/*',
  };
  const apiResult = await Axios.post(
    'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
    body,
    { headers },
  );
```

# 起きた現象
 レスポンスが以下

```
Invalid multipart request with 0 mime parts
```

# 判明した原因
BOUNDARY を body で表現するときは、 `headers.Content-Type` で示した BOUNDARY の先頭に `--` がなきゃいけない

# 解決したソース

```Javascript
/** Googleドライブ 指定フォルダにファイルをアップロード */
export async function upload(name, mimeType, base64, folderId, accessToken) {
  const body = '--' + BOUNDARY + "\r\n"
        + "Content-Type: application/json\r\n\r\n"
        + JSON.stringify({
          title: name,
          mimeType,
          name,
          parents: [folderId],
        }) + "\r\n"
        + '--' + BOUNDARY + "\r\n"
        + 'Content-Type: ' + mimeType + "\r\n"
        + "Content-Transfer-Encoding: base64\r\n\r\n"
        + base64 + "\r\n"
        + '--' + BOUNDARY + "--";
  const headers = {
    Authorization: `Bearer ${accessToken}`,
    'Content-Type': `multipart/related; boundary="${BOUNDARY}"`,
    accept: '*/*',
  };
  const apiResult = await Axios.post(
    'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
    body,
    { headers },
  );
```

# まとめ

ハマった時は、うまくいくものと、うまくいかないものを、皿の目でよく見よう
エラーメッセージは英語でも、ちゃんと意味を考えてみよう
Google Cloud Associate Cloud Engineerに実務経験なしで合格したので勉強方法を書いておく

# はじめに
Google Cloud Associate Cloud Engineerに合格したので、勉強方法を書いておきます。

# 前提条件
AWSメインのクラウド基盤のエンジニア。最近Top Engineers(Service)、ALL Certificate Engineersに認定されました。
AWSはSAP on AWS以外の資格取得済み、Azure Solution Architect Expert取得済み。
そろそろGCPにも手を出したいと思い、挑戦しました。
GCPは　まったくの素人で触ったこともありませんでした。

# 勉強方法

## 1. GCPの基本を抑える
以下本を購入しました。

https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E5%8D%B3%E6%88%A6%E5%8A%9B-Google-Cloud%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%81%A8%E6%8A%80%E8%A1%93%E3%81%8C%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEgrasys/dp/4297123010

この本で、GCPのメインとなるサービスの概要を理解できます。前提知識がなかったので非常に役立ちました。
個人的に、AWSを理解しているうえで、差分が大きいなとか、重要だなと思ったのは以下です。
・IAM（基本ロール、事前定義ロール、カスタムロール）
・リソース階層（プロジェクト、組織、フォルダなど）
・ComputeEngineのライブマイグレーション、マシンイメージ
・VPCのリージョン、ゾーンの考え、デフォルトネットワーク
・ロードバランサの種類（グローバルとか、SSLプロキシとか）
・CloudStorageのストレージクラス
・GKEのスケーリング
・AppEngineのデプロイとスタンダードとフレキシブル環境の違い
・SQLサービス（ClouｄSQL、CloudSpanner）
・NoSQL（Datastore、Bigtable）
・データ分析関連（BigQuery、CloudPub/Sub、 Dataflow、DataProcなど）
・監視関連（Logging、デバッガーなど）
・Anthos

## 2. 問題集を解く
このあたりの問題集を２周ほどときました。
解説を読んで、理解すると細かい部分が理解できます。

https://www.udemy.com/course/google-certified-associate-cloud-engineer-practice-exams-gcp/

https://www.udemy.com/course/gcpgoogle-cloud4200-y/

## 3. 模擬試験をとく
公式サイトより模擬試験が無料で受けられます。
こちらをときました。

https://cloud.google.com/certification/cloud-engineer?hl=ja

# まとめ
実際に試験を受けた際は、AWSよりかんたんかなという印象でした。
試験後合否が表示されるらしいのですが、見逃してしまい、メール待ちとなりもやもやしたので、合否を見逃さないようにすることをおすすめします。AWSと同じ感覚でいると見逃します。。。
次回Professional Cloud Architectに挑戦し、３台クラウドのPro資格を制覇したいです！
【Nuxt.js】titleなどHTMLのheadの内容をページごとに設定してみる

# この記事について
Nuxt.jsでページtitleやmetaタグなどをページごとに設定してみましたので、実装方法を記録として残したいと思います。

# 対象読者
* Nuxt.jsで画面開発を行っている方
* ページtitleやog:imageなどmetaタグに関する情報を動的に変更したい方

# 環境
|内容|バージョン|
|---|---|
|node|16.14.2|
|yarn|1.22.15|
|nuxt|2.15.8|

# 実装してみる
## `nuxt.config.js` の記述
`nuxt.config.js` で全ページ共通のheadタグの内容を記述できます。

以下の例では、全ページのtitleが `タイトルテスト` となり、指定したmeta情報も設定されます。

```nuxt.config.js
export default {
  head: {
    title: 'タイトルテスト',
    htmlAttrs: { lang: 'ja' },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
  },
};
```

以下のように `titleTemplate` を使用してページごとに `head` の内容を定義すると、ページごとにタイトルの内容を変更することが可能です。

```nuxt.config.js
export default {
  head: {
    titleTemplate: 'タイトルテスト - %s ページ',
    htmlAttrs: { lang: 'ja' },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
  },
};
```

## 各ページでのタイトル設定
個別ページ側では [`head` メソッド](https://nuxtjs.org/docs/components-glossary/head/)を使用します。
以下の例では、titleには `タイトルテスト - ホーム ページ` が表示されます。
`nuxt.config.js` で設定した `titleTemplate` の `%s` の部分が個別ページ側の `title` の値に置き換えられます。

```pages/index.vue
<template>
  <div>ホームページ</div>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  head() {
    return {
      title: 'ホーム',
    };
  },
});
</script>
```

title以外にもmetaタグも個別ページ側で記載することが可能であるため、ページごとにOpen Graphの内容を設定することができます。

```nuxt.config.js
export default {
  head: {
    titleTemplate: 'タイトルテスト - %s ページ',
    htmlAttrs: {
      lang: 'ja',
      // metaでogを使用するため
      prefix: 'og: http://ogp.me/ns#',
    },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
  },
};
```

```pages/index.vue
<template>
  <div>ホームページ</div>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  head() {
    return {
      title: 'ホーム',
      meta: [
        {
          hid: 'og:title',
          property: 'og:title',
          content: 'ホームページのog:titleテスト',
        },
        {
          hid: 'og:description',
          property: 'og:description',
          content: 'ホームページのog:og:descriptionテスト',
        },
        {
          hid: 'og:image',
          property: 'og:image',
          content:
            'http://illustrain.com/img/work/2016/illustrain04-kaisya01.png',
        },
      ],
    };
  },
});
</script>
```

# 参考
[Nuxt.js で title タグや meta タグを設定する](https://qiita.com/azujuuuuuun/items/7fe24cdb9c99b59a094a)
[The Head method](https://nuxtjs.org/docs/components-glossary/head/)
Kotlinで「生産者消費者」の実現

```kotlin
fun producerConsumer() {
    val content = mutableListOf<Int>()
    for (i in 10 downTo 1 step 1) content.add(i)
    val lockForConsumer = Object()
    val lockForProducer = Object()

    val consumer1 = thread {
        while (true) {
            synchronized(lockForConsumer) {
                while (content.size > 0) {
                    println("Consumer1 consume content:${content[content.lastIndex]}")
                    content.removeAt(content.lastIndex)
                    lockForConsumer.notify()
                    Thread.sleep(1000)
                    lockForConsumer.wait()
                }
                synchronized(lockForProducer) {
                    lockForProducer.notifyAll()
                    lockForProducer.wait()
                }
            }
        }
    }
    val consumer2 = thread {
        while (true) {
            synchronized(lockForConsumer) {
                while (content.size > 0) {
                    println("Consumer2 consume content:${content[content.lastIndex]}")
                    content.removeAt(content.lastIndex)
                    lockForConsumer.notify()
                    Thread.sleep(1000)
                    lockForConsumer.wait()
                }
                synchronized(lockForProducer) {
                    lockForProducer.notifyAll()
                    lockForProducer.wait()
                }
            }
        }
    }

    val producer = thread {
        var round = 1
        while (true) {
            synchronized(lockForProducer) {
                for (i in 10 downTo 1 step 1) content.add(i)
                println("Producer round $round")
                round++
                lockForProducer.notifyAll()
                lockForProducer.wait()
            }
        }
    }
}

fun main() {
    producerConsumer()
}
```
[M1] Python環境構築

## 前提
M1 (shellがzshなら多分なんでもok)
Homebrewがインストール済みであること(他の記事を見てインストールしてください)

## Python 環境構築手順

1. `brew install pyenv`
2. `pyenv -v`
3. `export PYENV_ROOT="$HOME/.pyenv"`
4. `export PATH="$PYENV_ROOT/bin:$PATH"`
5. `eval "$(pyenv init -)"`
6. `pyenv install --list`
7. `pyenv install <version>`
8. `pyenv versions`
9. `pyenv global <version>`

**特質事項**
```md
3~5はpyenvのPATHの設定
6はinstall可能なpythonを確認 (上部の数字だけのものがpythonのversion)
8はmac内のpythonを一覧表示
9は使用するpythonのversionを設定

5 及び 9実行後は設定を反映するため
$ source ~/.zshrc を実行 もしくは、terminalを開き直してください
```

## 参考

https://www.youtube.com/watch?v=DJUEA9wiCgY
癒されたい自分へご褒美の動物画像

お疲れ様です。戦い5日目で憔悴しております。。
流石にアナログ世代は脳みそが筋肉になっているので、正直ヘビーです。
とりあえず授業で講義を受けた内容の地点に昨日到着したので、課題を制作しました。
makeのシナリオ画面とLINE Botのキャプチャ画像を添付します。
ホントはjpegで送りたかったのですが、次の授業のための準備に労力と時間を
割きたいので、次に進みたいと思います。
以上、宜しくお願い致します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669820/bbe72738-4195-d300-31a8-ba1ce5bb3993.png)


https://twitter.com/mvminami2022/status/1531155799669903360
【Android】TextInputEditTextでAdjustResizeやAdjustPanが効かない

### 問題
MaterialDesignのTextInputLayoutのTextInputEditTextで、テキスト入力時にカーソル位置とフォーカスがおかしくなります。
一行とかであれば恐らく問題ありませんが、ScrollViewなどでネストしている場合文字入力が困難になります。

### 原因
日本語の情報があまり見当たらなかったのですが、[既知のバグ](https://github.com/material-components/material-components-android/issues/1282)として報告されているようで、Manifestで指定するAdjustResizeやAdjustPanが上手く機能していない?みたいです。

### 解決
TextInputEditTextに「app:textInputLayoutFocusedRectEnabled="false"」を追加する。
(もしくはTextInputEditTextをEditTextにする)

### 参考
[https://stackoverflow.com/questions/62715709/android-textinputlayout-writing-focus-issue-when-height-is-bigger-than-the-scree](https://stackoverflow.com/questions/62715709/android-textinputlayout-writing-focus-issue-when-height-is-bigger-than-the-scree)
VBA_07_Dictionary_FileSystemObject_Workbooks.Open_Sample

Keyword
---
FileSystemObject
File
Dictionary
Variant
Dynamic Array
Workbooks.Open
Workbooks.Close
New Dictionary

Sample Code
---
OpenFilesInFolder
```vb:ブックを開き、シート内セル情報を取得する
Public Sub MySample20220529()
   
    Dim myWorkSheet As Worksheet: Dim myResultSheet As Worksheet
    Dim myPathStr As String
    Dim myFSO As New FileSystemObject: Dim myFile As File
    Dim myInputbook As Workbook: Dim myInputSheet As Worksheet
    Dim i As Long, j As Long
    Dim myFileNmList As Dictionary: Dim myShtNmList As Dictionary
    Dim myArrWorkTime() As Variant
    
    With ThisWorkbook
        Set myWorkSheet = .Worksheets("ツール")
        Set myResultSheet = .Worksheets("結果")
    End With
    
    myPathStr = myWorkSheet.Range("パス").Value
    
    For Each myFile In myFSO.GetFolder(myPathStr).Files
    
        Set myInputbook = Workbooks.Open(myFile, , True)
        
        If myInputbook Is Nothing Then
            MsgBox "ブックが存在しません。"
            Exit Sub
        End If
        
        Set myFileNmList = New Dictionary
        
        For i = 7 To 9
            
            If Not myFileNmList.Exists(myFile.Name) Then
                myFileNmList.Add myFile.Name, New Dictionary
            End If
            
            Set myShtNmList = myFileNmList.Item(myFile.Name)
            
            myShtNmList.Add i & "月", myArrWorkTime
            
            Set myInputSheet = myInputbook.Worksheets(i & "月")
            
            myShtNmList.Item(i & "月") = myInputSheet.UsedRange
            
            For j = LBound(myShtNmList.Item(i & "月")) To UBound(myShtNmList.Item(i & "月"))
                If j = 1 Then Debug.Print myFile.Name
                If j = 1 Or j >= 30 Then
                    Debug.Print myShtNmList.Item(i & "月")(j, 1), myShtNmList.Item(i & "月")(j, 4)
                End If
            Next
            
        Next i
        
        myInputbook.Close False
    
    Next

End Sub
```
Sample Data
---
Workbooks
![無題7_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672288/538619ae-ac8b-ba0a-eec1-4d22b7158a06.jpeg)
Worksheets
![無題7_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672288/4b3a30c2-a217-38eb-13a7-3389f38b5e68.jpeg)
Cells
![無題7_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672288/504b1091-e21e-41aa-640d-110f8f3d1951.jpeg)
Requirements on DIO Driver, No.191, AUTOSAR R21-11(242) CP

Requirements on DIO Driver, No.191, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/classic/21-11/AUTOSAR_SRS_DIODriver.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月中に到達。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|CS| Chip select
|DIO| Digital Input Output
|ECU |Electric Control Unit
|EOL| End Of Line Often used in the term ‘EOL Programming’ or ‘EOL Configuration’
|ICU |Interrupt Capture Unit
|MAL| Old name of Microconroller Abstraction Layer (replaced by MCAL because ‘MAL’ is a french term meaning ‘bad’)
|MCAL| Microconroller Abstraction Layer
|MCU |Microcontroller Unit
|MMU |Memory Management Unit
|Master |A device controlling other devices (slaves, see below)
|Slave| A device beeing completely controlled by a master device
|NMI| Non maskable interrupt
|OS |Operating System
|PLL| Phase Locked Loop
|PWM| Pulse Width Modulation
|RX| Reception (in the context of bus communication)
|SPAL| The name of this working group
|SFR| Special Function Register
|RTE |Runtime environment
|WP| Work Package
|STD |Standard
|REQ |Requirement
|UNINIT| Uninitialized (= not initialized)
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[DOC_LAYERED_ARCH] Layered Software Architecture,
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[AUTOSAR_GLOSSARY] Glossary,
AUTOSAR_TR_Glossary.pdf
[SRS_BSW_GENERAL] General Requirements on Basic Software Modules,
AUTOSAR_SRS_BSWGeneral.pdf
[SRS_BSW_SPAL] General Requirements on SPAL,
AUTOSAR_SRS_SPALGeneral.pdf
[TPS_STDT_0078] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
Codespacesが使えるようになった!!

# はじめに
「高校生なんかに許可が出るのかなー」と思いつつ[Codespaces](https://github.co.jp/features/codespaces)のベータ版に申し込んで早半年以上が過ぎ、ついにアイツが私のもとにも届きました。
![Screenshot 2022-05-29 10.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/25445561-3dcd-14ed-0eef-cea0e718bcb3.png)
なんで今更来たんだろ?と考えると~~1つ思い当たるフシがありました。
このメールが届く数時間前、私はGithubでOrganizationを作成していたのです。もしかすると、Codespacesを使う人の条件として「何かしらのOrganizationに属する」というのがあったのかも？
すくなくとも、私の場合Organizationの作成がトリガーになったのは間違いなさそうです。~~
ちょうどその日にたくさんの方の申請が通ったそうです。私もその一人だったわけですね。

# Codespacesとは
周知のことだと思うので[他の方の解説](https://zenn.dev/dzeyelid/articles/5485cdeb2a1ada)を載せておきます。
ざっくり言うと、VScodeをそのままWebで使えるって感じです。※もちろん制約はあります。

# なぜCodespacesが必要だったのか？
私は家のデスクトップPCに加えて、学校で購入させられたChromebookを利用しています。そして、[ChromebookでもLinuxを使えばVScodeをローカルで使うことができます。](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1286826.html)
**ところが**、学校がLinuxを制限する設定にしてくださったおかげでVScodeをChromebookで使えなくなりました。
代替ツールとして[vscode.dev](https://vscode.dev/)や[github.dev](https://github.dev/)を使ってきましたがターミナルなど、実行環境がないのが痛かったです。実行環境のあるものとして、[gitpod.io](https://gitpod.io/)も使ってみましたが、無料版での月50時間の制限が辛かった、、、(無料で使おうとするのも傲慢な話かもしれませんがね、、、)
また、上記のツールは使える拡張機能が大なり小なり制限されていました。
そんな私にとって**Codespacesは理想的なツール**だったわけです。

# 実況見分
同じようにChromebookに苦しめられる後輩向けに、Codespacesの申請が通った当時の私のGithubの状況を紹介します。
* Contribution…200くらい
* Issue…5~6個
* Pull request…10回くらい
* Organization…1回作って、すぐ消した。
* Code review…0
* フォロワー…0
* プライベートリポジトリ…7個
* パブリックリポジトリ…0個
* 申請が通るまでの期間…半年以上

ガチのエンジニアの方々に比べるとかなり少ないです。 ※上記の数字を上回れば必ず申請が通るとも限りませんし、下回っていても申請が通る場合があるかもしれせん。

ガチのエンジニアの方々はもともと使えるようになっていたり、申請するとすぐに通ったりしたらしいです。
# さいごに
私のように、どうしても開発環境がWeb上に限定されてしまった人にとって、Codespacesはかなり魅力的な存在だと思います。
また、VScodeに縛られず、Pythonなら[Colaboratory](https://colab.research.google.com/?hl=ja)を使うなど他のツールに移行してみることも有効な手段でしょう。
どうかChromebookユーザーに幸あれ

# 追記-ちょっと使ってみた感想
実行環境があったり、vscode.devで使えなかった拡張機能が使ったりできるのは本当に便利でこれからが楽しみ。
**ただ、、、**
初回起動時&1度stopした後の起動がかなり不安定。恐らくこれには、よわよわChromebookのマシンスペックの低さ(Celeron N4020笑)と低速なWifiが関係している気がします。タイムアウトしまくっていたのでね。実際、Wifiをスマホのデザリングにつなぎ替えるだけでも大分改善されました。また有線LANのつよつよデスクトップではそのような症状は一切現れませんでした。
クラウドIDEとは言えど少なからず相手は選ばれるようです、、、笑
デザインパターンをコードで勉強する。

# クラス図だけではデザインパターンがわからん。

と思ったのがきっかけ。
偶然、Kindle Unlimitedに
「【知らないと損をする】レベルアップJava ～デザインパターン編～ Javaの入門を学んだあとはコレ: ～基礎から学べるデザインパターン Java開発の定石」

https://amzn.to/3z5iCqn

という書籍があって、サンプルコードでデザインパターンが学べるので、
これを落とし込んでブログ記事にしたもの。

一応、全パターンを学習したのでまとめ。

https://taki-lab.site/bocci/?p=4535

https://taki-lab.site/bocci/?p=4554

https://taki-lab.site/bocci/?p=4588

https://taki-lab.site/bocci/?p=4619

https://taki-lab.site/bocci/?p=4658

https://taki-lab.site/bocci/?p=4688

https://taki-lab.site/bocci/?p=4737

https://taki-lab.site/bocci/?p=4776

https://taki-lab.site/bocci/?p=4822

https://taki-lab.site/bocci/?p=4858

https://taki-lab.site/bocci/?p=4904

https://taki-lab.site/bocci/?p=4950

https://taki-lab.site/bocci/?p=5005

https://taki-lab.site/bocci/?p=5074

https://taki-lab.site/bocci/?p=6038

https://taki-lab.site/bocci/?p=6568

https://taki-lab.site/bocci/?p=6620

https://taki-lab.site/bocci/?p=7823

https://taki-lab.site/bocci/?p=7844

https://taki-lab.site/bocci/?p=8205

https://taki-lab.site/bocci/?p=8255

https://taki-lab.site/bocci/?p=8346

https://taki-lab.site/bocci/?p=8418
外出中の困ったとき、手の中のスマホを活用！

# PCではなく、手の中のスマホを活用！
私は、出張多めの会社員です。
会社にいる時間よりも、在宅での仕事の時間よりも、**出張・外出の時間が多い生活です**

外出中に「あの部署の電話番号がわからない」「あの部署の部長は今だれ？●●部長かな？（曖昧）」
確認したいけど、**屋外でパソコンひらくのはめんどくさい**
そんな時に、**簡単に検索できると便利だよなー**
会社の組織名簿や電話帳は、Excelで作成されているから、
**LINEでエクセルを検索し、その返答をしてくれるBotを作成してみました**
（実際は、Excelではなく、Googleスプレッドシートです）

### ■使用したツール
+ LINE Developer
+ MAKE（旧integromat）
+ SSSAPI
+ Googleスプレッドシート

### ■完成品
組織名簿の検索をイメージして作成しました
**ユースケース例）関西支社の営業部長は今どなただろう？**
（人事異動が多いのでわからなくなってしまう）
（営業所が全国約300施設あるので最新の情報を確認したい）
LINE Botに支社名を送信
　⇒該当の支社の役職者を確認、電話番号も
　⇒必要に応じてその方に電話

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669823/ce28d93a-eb41-9d88-8abf-5ef15a2e42d0.png)
※仮に組織名簿は4名、電話番号1つで作成しました
**MAKEのScenario画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669823/8a31b2db-ae94-7f5e-82c0-492fbea932da.png)
### ■参考にした記事
①LINE Developer アカウント作成、bot用公式アカウント開設
参考：[1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d#%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86 "1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest ")
②検索先のリスト（スプレッドシート）をAPIにする
参考：[GoogleスプレッドシートからAPIを自動作成できる「SSSAPI」を使ってみた](https://qiita.com/UT_BackendEngineer/items/c94507e42c42f4866acf "GoogleスプレッドシートからAPIを自動作成できる「SSSAPI」を使ってみた")
③検索先のリストにない言葉の場合、「リストにないよ」と知らせる
参考：[住所から郵便番号を調べたい！Makeで郵便番号検索LINEbot作ってみた（ノーコード）](https://qiita.com/NakamuraKou/items/f985d7c0f94732664eb8 "住所から郵便番号を調べたい！Makeで郵便番号検索LINEbot作ってみた（ノーコード）")

作成手順や詳細の設定は、上記の記事を参考にしてください！
### ■私が苦戦した点
#### SSSAPIで作成したAPI URLを張り付けたけど、そのあと何を設定したらいいんだ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669823/9938d412-7b4b-9553-87df-34b0ae83ae71.png)
**自分なりの解説**：LINE Watch　Eventsからきた言葉（Events：Message.Text）を、
スプレッドシート（API URL）の中から、検索するURLを張り付ける必要があります
例）「API URL+/北海道」と検索すると北海道のみの情報となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669823/1a3937a3-3f1c-3f80-e806-c96cc987ff75.png)
* * *
#### リスト内にない言葉の場合、違う返答内容としたいけど、フィルターの詳細の設定は？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669823/d1d22d3a-f8b1-93e0-92d2-a1d95aec5ce5.png)
**自分なりの解説**：LINE Watch　Eventsからきた言葉（Events：Message.Text）が、
スプレッドシートの1行目：支社と同じかどうかのフィルター条件としました

## こんな感じの動きです
![RPReplay_Final1653817729_MP4_AdobeCreativeCloudExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669823/b3043653-3d99-0ec9-cc87-2c632fffd24c.gif)
※小さくてすみません。。。


# 最後に
誰もが使っているツールのLINEと、多くの会社でつかっているスプレッドシートを組み合わせることで、色々と活用できる可能性はまだまだあると感じています
フィルター条件や、他APIとの組み合わせにより、様々な使い方ができる！
課題、全国300施設の要員確認や電話番号の確認をした場合、スマートな返信内容とする
他に必要な情報はないのか（住所、地図、管理番号などの台帳情報など）を要検討
##### 注意
今回使用したSSSAPIは、無償版を使用しているため、50行までの制限があります。


初めてこのような記事を書きましたが、表現するのは難しいと痛感しました。
最後まで読んで頂き有難う御座います。



https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d#%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

https://qiita.com/UT_BackendEngineer/items/c94507e42c42f4866acf

https://qiita.com/NakamuraKou/items/f985d7c0f94732664eb8
動的計画法の問題を解くために性質を調べた結果分かったことのまとめ

DPに強くなるために集めたまとまりのない知見メモ

# 代数学的アプローチ

- 部分解同士の結合演算に対して**可換モノイド**である必要がある
    - ほとんどの場合問題の定義によって一意に決まる
    - だいたい総和(+)、min、maxのどれかに収まる
    - 性質上Segment Treeと非常に相性が良い。DP表の横軸を遅延セグ木に置き換えると強い。
- 部分解同士の結合演算を $\\oplus$ 、部分解と中間要素の結合演算を $\\odot$ と置いた場合、 $(a \\odot c) \\oplus (b \\odot c) = (a \\oplus b) \\odot c$ を満たす。
    - 意外と重要
    - $\\odot$ は交換法則および結合法則を満たさない。しばしば単なる代入演算だったりする[^1]

上記の条件を満たす演算を半環というらしい。

[^1]: $a \\odot b = a$

# プログラム記法的アプローチ

- 論理的には**メモ化再帰**と同じ
- 再帰関数と遅延評価を使ったHaskellでの実装例がある
    - [*Dynamic Programming in Haskell is Just Recursion*](https://travis.athougies.net/posts/2018-05-05-dynamic-programming-is-recursion.html)

# 圏論的アプローチ

- 圏論上の用語ではDynamorphismというらしい
    - 詳細は省く（そもそもよく分かってない）が、途中の部分解を保持する再帰的計算構造を構築する概念
    - foldとunfoldの組み合わせのようにみなされる
    - Recursion Treeの構築と収斂に分割できる
        - Anamorphism + histomorphism
- 米田の原理
    - いわゆるカリー化
- 式そのものの構造を扱いたい訳ではないのでそんなに重要ではないかも
- 半環は可換モノイド上の自己準同型写像…というもので表現できるらしい。
  - なんもわからん

# 参考文献

メインコンテンツ

- [オートマトン上の DP (桁 DP の一般化)](https://kuretchi.github.io/blog/entries/automaton-dp/)
- [「圏論とプログラミング」発表スライドメモ](https://qiita.com/inamiy/items/9af1da1faec22cd968f0)
- [Haskellで動的計画法を攻略する - Zenn](https://zenn.dev/osushi0x/articles/198bce676e2841)