OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonが嫌いなのでC++版のPytorchで画像認識をやってみる 12日目 tuple

前回の書き込みから1ヵ月経ってしまった。先日の三連休に試験があり、その勉強でプログラミングができなかったのである。秋の三連休の試験といえば**アレ**である。泣く子も黙る**国家資格**、**情報処理技術者試験**だ。今回は高度情報処理技術者。首尾は上場。まあ専業資格ではないので受かっても名刺に書いてハッタリかますだけだけどね。
世の中リスキリングなどという言葉が流行っているが、社会人たるもの**時代に合わせて勉強するのは当たり前**。技術革新など今に始まったことではない。30年同じことやって美味い飯が食い続ける訳がない。何を今更ドマヌケなことを言っているのかである。私が社会人になったときは会社にパソコンなど無かったのだ。C++、java、js、sql、vbからCAD検定、英語独語ロシア語、果ては溶接技能検定、クレーン、大特に至るまで全部社会人になってから習得した。
今はまたIT系がマイブームで来春も高度情報処理技術者のST、あと技術士を受けるつもり。頭はハゲてもバブルを生で見た世代である。昭和のおじさんはギラギラ油の肉食系で、常に向上心を忘れないのだ。平成のナヨナヨした若造と一緒にしないでいただきたい。

# tupleを使う
LibTorchにはタプルで値を返す関数がある。↓こんな奴だ。
```py:
best_prior_overlap, best_prior_idx = overlaps.max(1, keepdim = True)
```
なんで戻り値二つ返すねん、クソムカつく(# ﾟДﾟ)･･･とは思わない。C系の関数が1つしか戻り値を返さないのは昔のCPUが非力で戻り値用のレジスタが一つしかなかったせいだ。今のCPUはレジスタが腐るほど在るので、当然複数の値を返すオペコードもある。例えばsincos命令とか。確か80386から実装していたはずだ。だから関数が複数の値を返すのは自然な事。C++もC++11の頃から対応している(らしい)。
↓上のコードはC++11だとこんな感じになる。
```C++:
std::tuple<at::Tensor, at::Tensor> ret;
ret= overlaps.max(1, true);
torch::Tensor best_prior_overlap = std::get<0>(ret);
torch::Tensor best_prior_idx = std::get<1>(ret);
```

↓C++17だとこんな感じになる。
```C++:
auto[best_truth_overlap, best_truth_idx] = overlaps.max(1, true);
```
C++17のほうが圧倒的にスマートだね。

https://cpprefjp.github.io/reference/tuple/tuple.html
LMDE 5でDocker動かす方法

以前に LMDE 5 に Docker をインストールしたことがないことを確認してください。
```
sudo apt remove docker docker-engine docker.io containerd runc
```


リポジトリ リストを更新し、必要なパッケージを追加して Docker をインストール
```
sudo apt update

 sudo apt install \
    ca-certificates \
    curl \
    gnupg
```
次に、Docker リポジトリを LMDE 5 に追加
```
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/debian \
 bullseye stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

更新してから、Docker と Docker Compose を LMDE 5 にインストール
```
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose
```
LMDE 5 に Docker がインストールされました。
次のコマンドを使用して、Docker が正しくインストールされているかどうかを
確認しましょう。
```
sudo docker run hello-world
```
hello-worldが出れば成功です。

docker コマンドを実行するには、次のコマンドを実行します。
```
usermod -aG docker $(whoami)
```
Docker を起動時に自動化
```
sudo systemctl start docker
sudo systemctl enable docker
```
最後に再起動してあげれば完成です。
Deviseのエラーメッセージを日本語化する

# Devise日本語化の設定
application.rbを編集して、言語設定を変更する

下記の様にconfig/application.rbの中に**config.i18n.default_locale = :ja**を追記する。

```ruby:config/application.rb
module -------
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # 日本語の言語設定
    config.i18n.default_locale = :ja
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end
```

次はGemfileにgem 'rails-i18n'を追記する

```ruby:Gemfile
gem 'rails-i18n'
```

続いてインストールを行う

```terminal:ターミナル
bundle install
```

これである程度は日本語化されるのですが、まだ完全では無いので次は
localeファイルを準備します、localeファイルとは、様々な言語に対応できる言語ファイルで英語を日本語に翻訳してくれます
そして、その日本語へ翻訳するためのファイルをYAMLと言います
YAMLとは、ファイルの書き方のルールの一つで、中身が文字だけで記述されてるテキストファイルです

config/localesディレクトリにdevise.ja.ymlというファイルを作成します
devise.ja.yml内に以下のサイトから記述内容をコピーして貼り付ける
[ja.yml](https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml)

以上でDeviseの日本語化になります、次はカラム名も日本語化して行きます

# DBのカラム名を日本語化する

config/localesディレクトリに、**ja.yml**というファイルを作成します
以下の様にモデル名、カラムを記述します
```config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: ニックネーム
        birth_date: 誕生日
        last_name: 名字
        first_name: 名前
        last_name_kana: 名字(カナ)
        first_name_kana: 名前(カナ)
      item:
        product: 商品名
        image: 画像
        product_description: 商品の説明
        price: 値段
        area_id: 発送元の地域
        category_id: カテゴリー
        condition_id: 商品の状態
        shipping_charge_id: 発送料の負担
        shipping_day_id: 発送までの日数

  activemodel:
    attributes:
      purchase_shipping:
        postal_code: 郵便番号
        token: クレジットカード
        area_id: 都道府県
        municpality: 市区町村
        address1: 番地
        phone: 電話番号
```

:::note warn
気をつける事としてモデルのactiverecordやactivemodelは種類が違うので分けないと行けません
:::

これで日本語化完了です

# 参考にさせて頂いたサイト
[【Rails】バリデーションエラーメッセージの日本語化〜ja.yml〜](https://qiita.com/bon_eng/items/87085891f4ed5f27eb9d)
目指せ！第１４回ＵＥＣ杯コンピューター囲碁大会＜本編＞ Step [O11o_3o_11o0] ポジション作成

目指せ！第１４回ＵＥＣ杯コンピューター囲碁大会＜本編＞ Step [O11o_3o_11o0] ポジション作成

# 連載の目次

📖 [目指せ！第１４回ＵＥＣ杯コンピューター囲碁大会＜本編＞](https://qiita.com/muzudho1/items/744f6051954525878b84)  

# Step [O11o_3o_11o0] ポジション作成

あとで使うファイルを先に作成する  

## Step [O11o_3o_11o1o0] ファイル作成 - kernel/o11o_3o_11o0_position.go ファイル

👇 以下のファイルを新規作成してほしい  

```plaintext
  	📂 kifuwarabe-uec14
	└── 📂 kernel
👉   	└── 📄 o11o_3o_11o0_position.go
```

```go
// BOF [O11o_3o_11o1o0]

package kernel

type Position struct {
	// Board - 盤
	Board *Board
}

// NewDirtyKernel - カーネルの新規作成
// - 一部のメンバーは、初期化されていないので、別途初期化処理が要る
func NewDirtyPosition(gameRule GameRule, boardWidht int, boardHeight int) *Position {
	var p = new(Position)

	p.Board = NewBoard(gameRule, boardWidht, boardHeight)

	return p
}

// EOF [O11o_3o_11o1o0]
```
【M1 Mac】Visual Studio CodeでC++ & Boostライブラリを使用する

# 概要
M1 MacでAtCoder用のVisual Studio Code & C++のローカル環境を構築する際, C++で多倍長整数を扱いたい時に必要なBoostライブラリのインストールとVisual Studio Codeの設定とコンパイルで詰まったのでメモ.
# インストール
自分は, CUI & GUIアプリをできるだけHomebrewで管理したいので, Homebrewでインストール.
Homebrewわからんという人は別記事を参照してください.
```sh
brew install boost
```
# Boostがどこにあるのか
ここです. 
バージョンは人によって違うかと思います.
```sh
/opt/homebrew/Cellar/boost/1.80.0/include
```
(自分の場合)ホームディレクトリからルートディレクトリまでの構造は以下なので, `cd ../`を2回してルートディレクトリへ遷移.
```
hogehoge
    |- Users
        |- /
```
# VSCodeの設定
`.vscode/c_cpp_properties.json`の`includePath`に先ほどのBoostのパスを追記.
これで, VSCode側がBoostを認識します.
```json
"includePath": ["/opt/homebrew/Cellar/boost/1.80.0/include"],
```
# コンパイル
コンパイルオプションに先ほどのBoostのパスを指定.
```sh
g++ hogehoge.cpp -I /opt/homebrew/Cellar/boost/1.80.0/include
```
Python / Matplotlibで複数のグラフを並べる方法3パターン

# Introduction
Pythonの可視化ライブラリの代表格であるMatplotlibを使えば複数のグラフを並べることなど容易である．
ただし記述方法がいくつかありいつもこんがらがるので整理してみた．

# ライブラリインポート
```py
import matplotlib.pyplot as plt
import numpy as np
```

# データ準備
```py
x = np.arange(0,1,0.01)
y1 = np.cos(np.pi*x)
y2 = np.cos(2*np.pi*x)
y3 = np.cos(3*np.pi*x)
y4 = np.cos(4*np.pi*x)
```

# パターン1：subplot()
```py
fig = plt.figure(figsize=(8,5))
fig.suptitle('title')

plt.subplot(2,2,1)
plt.plot(x,y1)
plt.ylabel('y1')

plt.subplot(2,2,2)
plt.plot(x,y2)

plt.subplot(2,2,3)
plt.plot(x,y3)

plt.subplot(2,2,4, facecolor='yellow')
plt.plot(x,y4)
```

# パターン2：figure(), add_subplot()
```py
fig = plt.figure(figsize=(8,5))
fig.suptitle('title')

ax1 = fig.add_subplot(2,2,1)
ax1.plot(x,y1)
ax1.set_ylabel('y1')

ax2 = fig.add_subplot(2,2,2)
ax2.plot(x,y2)

ax2 = fig.add_subplot(2,2,3)
ax2.plot(x,y3)

ax2 = fig.add_subplot(2,2,4)
ax2.plot(x,y4)
ax2.set_facecolor('yellow')
```

# パターン3：subplots()
```py
fig, ax = plt.subplots(2,2,figsize=(8,5))
fig.suptitle('title')

ax[0,0].plot(x,y1)
ax[0,0].set_ylabel('y1')

ax[0,1].plot(x,y2)

ax[1,0].plot(x,y3)

ax[1,1].plot(x,y4)
ax[1,1].set_facecolor('yellow')
```

Out:3パターンすべて同じ出力
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/30ca3e40-6693-e1d0-18e2-471745dcae79.png)

# Conclusion
3パターンの記述方法を紹介した．

個人的にはコードがすっきりし，グラフの場所が分かりやすいパターン3が好み．
【Unreal Engine 5】Enhanced Inputによるキャラクター移動の実装【備忘録】

# はじめに
Enhanced Inputを使ったキャラクター移動の実装のブループリントが調べてもなかなか見つからなかったので備忘録として書いておきます。
まず最初にプラグインからEnhanced Inputを適用しておきます。
たぶん大体のことは[公式ドキュメント](https://docs.unrealengine.com/5.0/ja/enhanced-input-in-unreal-engine/)に書いてあるので、ほぼそれをなぞる形になります。

# Input Action
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/c8710b79-33b7-1d7b-7a97-96761e126ea3.png)

前後左右を同時に取れるようにValue TypeをAxis2Dにしておく。
前後と左右のパラメータを別で取って作ることももちろん可能。

# Input Mapping Context
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/aa203857-1c08-7694-5f88-d57fbc0fc167.png)

Input Actionを作成したら、Input Actionとキーを対応付けるためにInput Mapping Contextを作成。
ここではWとSをY軸の値に設定。理由は動かすキャラクターの正面方向をY軸にするため。
Negateは入力に対してマイナスをかける処理。

# Player Controller
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/c0a7987e-2534-e9c4-0389-5505362d73aa.png)

今回は入力の処理はまとめてPlayer Controllerで処理するためPlayer Controllerにブループリントを書きます。
プレイヤーコントローラーのEnhanced Input Local Player Subsystem を取得し、Input Mapping Contextを追加します。Mapping Contextに先ほど作成したInput Mapping Contextを入れます。<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/336b951d-5a3f-ea5f-a1cc-d618e5ec248e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/b4b326b2-bbdf-b02f-38e3-9bfa792eca13.png)

最後に移動の実装です。
今回キャラクターのメッシュを図のように配置したので、ワールドの座標とメッシュの座標が一致していません。そのためInput Actionで取得した値をそのまま移動に使ってしまうとX軸とY軸が反転した移動になってしまいます。また一般に、キャラクターの向きはワールド座標に対して動的に変化するので、ブループリントの実装はXとYの値を反転させ、キャラクターの正面(Forward)を取ってくるようにしています。<br>

以上でキャラクターの移動の実装については完了です。
拙い文ですが最後まで読んでいただきありがとうございました。
paizaラーニング レベルアップ問題集 Aランクレベルアップメニュー JavaScript 最大公約数

最大公約数 (paizaランク C 相当)

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_calculation_boss

JavaScriptで解いてみました。
素直にAかBの小さい方から１へ向けて、ループで繰り返して最大公約数を探すと、`1 ≦ A , B ≦ 10 ^ 10`なので、タイムオーバーになります。

ユークリッドの互除法を使います。

１、aをbで割り、余りrを求め、
２、aにbを代入して、bにrを代入して、
３、またaをbで割り、余りrを求め、を繰り返し、
４、rが0になった時のbが最大公約数です。

ユークリッド互除法のイメージは、次のとおりです。a>bの自然数、aとbの最大公約数nとします。ダルマ落としのダルマのようにaとbを積み上げますが、体のパーツの大きさが最大公約数nで積み上げます。大きい方aを小さい方bで、スコーン！と、ダルマ落とししていきます。bより小さくなった元aのダルマの方が余りrになりますが、またこのrで、大きい方(ひとつ前のb)をまたスコーン！とダルマ落としします。繰り返すと最終的に、ダルマの顔が１つしか残らないのですが、それが求める最大公約数nです。

ちなみに、お互いダルマ落としで、スコーン!と体を除いていきますが、このイメージから、互いに除く方法ということで、互除法と言います。割り算のことを除法とも言いますが、この除くイメージからきています。ユークリッドさんが発見したので、ユークリッドの互除法です。

このユークリッドの互除法のイメージが浮かばない人は、スマホアプリのアルゴリズム図鑑が、イメージ図に動きをつけて、無料で解説しているので、わかりやすくてオススメです。

# 解答例
素直にユークリッド互除法を適用します。余りを`r`としました。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

let [a, b] = lines[0].split(" ").map(Number);
let r = 1;//aをbで除いた余りa%b,while(r>0)なので初期値1とした。
while (r > 0) {　//余りrが0になるまで(ダルマの頭１つになるまで)
    r = a % b;//除法(aをbでダルマ落とし、残るのがr)
    if (r > 0) {
        [a, b] = [b, r];//落とされるダルマと落とすダルマを入れ替え
    }
}
console.log(b);//求める最大公約数
```

# 解答例
上記の解答の`r`を使わず、`while(b>0),r=a%b,console.log(a)`として、コードを短縮しました。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

let [a, b] = lines[0].split(" ").map(Number);

while (b > 0) { //b(余り)が0になるまで
    [a, b] = [b, a % b];//除法と代入をまとめた。
}
console.log(a);//求める最大公約数
```


# 解答例(Pythonの場合参考)

再帰関数を使うこともできます。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [a, b] = lines[0].split(" ").map(Number);

//最大公約数を求める関数定義
let gcd = (a, b) => {
    if (b === 0) {
        return a;
    } else {
        return gcd(b, a % b);
    }
};

console.log(gcd(b, a % b));//関数実行して出力
```
Django+Celery+SQSをLocalStackで動かす

 [これ](https://qiita.com/tak_iwasaki/items/5af8087b97a927c2fabf)に関連して、LocalStackでローカルで試す方法です

## Dockerの設定

```docker/localstack/start.sh
# キューの作成
awslocal sqs create-queue --queue-name csv-upload.fifo --attributes "FifoQueue=true,ContentBasedDeduplication=true,VisibilityTimeout=3600"
awslocal sqs create-queue --queue-name send-message --attributes "VisibilityTimeout=300"
```

```docker-compose.yml
version: "3.8"

services:
    localstack:
        image: localstack/localstack:0.14.5
        ports:
            - 34566:4566
        environment:
            DEFAULT_REGION: ap-northeast-1
            DATA_DIR: /tmp/localstack/data
            SERVICES: s3,sqs
        volumes:
            - ./docker/localstack/:/docker-entrypoint-initaws.d
            - ./docker/localstack/tmp:/tmp/localstack
```
細かい設定はそのプロジェクトに合わせていただければいいと思いますが
重要なのは`docker-entrypoint-initaws.d`に`start.sh`を置いて、コンテナ起動時にキューを作成させることです（`docker-entrypoint-initaws.d`にスクリプトを置くとコンテナ起動時にそれが実行される）

## LocalStack設定
基本的には [こちら](https://qiita.com/tak_iwasaki/items/5af8087b97a927c2fabf)と同じですが、以下だけ変更します
```settings.py
# localstack:4566を追記する
CELERY_BROKER_URL = "sqs://{aws_access_key}:{aws_secret_key}@localstack:4566".format(
    aws_access_key=urllib.parse.quote(AWS_ACCESS_KEY_ID, safe=''), 
    aws_secret_key=urllib.parse.quote(AWS_SECRET_ACCESS_KEY, safe=''),
)

CELERY_BROKER_TRANSPORT_OPTIONS = {
    'region': 'ap-northeast-1',
    'predefined_queues': {
        'csv-upload.fifo': {
            # URLはhttp://localstack:4566/000000000000/
            'url': 'http://localstack:4566/000000000000/csv-upload.fifo',
        },
        'send-message': {
            'url': 'http://localstack:4566/000000000000/send-message',
        }
    }
}
```

以上です
【Go】環境変数をStructから読み込む


はじめまして。haru_0_4です。
Goを勉強し始めて早くも半年が経過しました。
今回はGoで勉強する中で、環境変数を扱う際に便利なパッケージ[caarlos0/env](https://github.com/caarlos0/env)を見つけたので、紹介したいと思います。

## 環境変数の扱い方
DB周りの認証情報の設定は環境変数に持たせることが一般的かと思います。
私もGoで環境変数を扱うとき、標準バッケージ[os](https://pkg.go.dev/os)を使って次のような使い方をしていました。
```golang
func main() {
    port := os.Getenv("PORT")
    fmt.Println(pass)
}
```
ここで、環境変数がないときはどうするのかというと、このようにデフォルト値を設定する処理を書きます。
```golang
port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}
```
しかし、この処理を環境変数の数だけ書くのは効率的とは言えません。

## caarlos0/envを使う
そこで、caarlos0/envが登場します。
使い方は簡単で、扱いたい環境変数をstructに定義し、envタグでデフォルト値を設定するだけで設定は完了です。

```golang
package main

import (
    "fmt"

    "github.com/caarlos0/env"
)

type Config struct {
    Home         string   `env:"HOME"`
    Port         int      `env:"PORT" envDefault:"3000"` // デフォルト値の設定
    IsProduction bool     `env:"PRODUCTION"`
    Hosts        []string `env:"HOSTS" envSeparator:":"` // 配列も読める
    SecretKey    string   `env:"SECRET_KEY,required"` // 必須設定も可
    Notag        string   // タグ無しにすれば環境変数のない設定も同居できる
}

func main() {
    cfg := Config{}
    env.Parse(&cfg) // パースすると環境変数から値が読み出される
    fmt.Println(cfg)
}
```
とてもスマートでわかりやすいコードになったと思います。
これで長ったらしい環境変数の処理を書く必要がなくなります。
他にも環境変数を扱うために[kelseyhightower/envconfig](https://github.com/kelseyhightower/envconfig) など同様にstructを使った方法もあるみたいなので、状況に応じて使い分けていきたいと思います。

## まとめ
DBの秘匿情報やポート番号などをGoで環境変数として設定する際に、便利なパッケージを紹介しました。
少しでも参考になれば幸いです。

## 参考記事
https://qiita.com/techneconn/items/27593cd6f3e7f264516b
dartのfactoryとは？

dartのfactoryについてわからんかったのでまとめた。
直訳すると工場。はて？

## はじめに
factoryはコンストラクタ定義の際に用いる修飾子であり、Factoryパターン[1]が言語に組み込まれているものらしい。このfactoryコンストラクタはreturnでインスタンスを返す（それは果たしてコンストラクタなのか...）。

## ユースケース
シングルトン[2]として扱う場合か、もしくはキャッシュやサブタイプ（派生クラス）のインスタンスを返すのに利用する。つまりは新しいインスタンスを作成するとは限らない場合。

* シングルトンの例
```dart
class Creature {
  static final Map<String, String> _cretures = <String, String>{};
  static final Creature _cache = Creature._internal();

  Creature._internal();

  factory Creature() {
    return _cache;
  }

  setCreature(String key, String value) => _cretures[key] = value;
  getCreature(String key) => _cretures[key];
}

void main() {
  var creature = Creature();
  creature.setCreature('human', 'taro');
  creature.setCreature('dog', 'pochi');

  print(creature.getCreature('human'));
  print(creature.getCreature('dog'));

  // 再度インスタンス生成
  var creature2 = Creature();
  print(creature2.getCreature('human')); // taro
  print(creature2.getCreature('dog')); // pochi
  
  creature2.setCreature('human', 'jiro');
  creature2.setCreature('dog', 'hachi');

  // 最初にインスタンス化した値を出力
  // creature2とcreatureが同一であることがわかる
  print(creature.getCreature('human')); // jiro
  print(creature.getCreature('dog')); // hachi
}
```

* サブタイプ（派生クラス）のインスタンス返却の例
```dart
abstract class Result {
  final String status;

  Result(this.status);

  factory Result.judge(String status) {
    if (status == 'success') {
      return Success(status);
    } else {
      return Failure(status);
    }
  }

  void showStatus() {}
}

class Success extends Result {
  Success(String status) : super(status);

  @override
  showStatus() {
    print(super.status);
  }
}

class Failure extends Result {
  Failure(String status) : super(status);

  @override
  showStatus() {
    print(super.status);
  }
}

void main() {
  Result result;
  result = Result.judge('success');
  print(result.runtimeType); // Success
  result.showStatus(); // success
}

```
## Named Constructor と どう違う？

主に次のような違いがあるらしい。

||Factoryコンストラクタ|Named Constructor|
|--|--|--|
|**インスタンスメンバへのアクセス**|静的なため、アクセスできない|任意のメンバ変数およびメソッドにアクセス可能|
|**returnの有無**|インスタンスの返却が必要|無し|
|**生成するインスタンスの型**|該当クラスと違う型を返せる|該当クラスと同じ型しか返せない|

---

[1]:[デザインパターン「Factory Method」](https://qiita.com/shoheiyokoyama/items/d752834a6a2e208b90ca)にわかりやすくまとめてくれていました。
[2]：オブジェクト指向におけるデザインパターンの1つであり、対象のクラスのインスタンスが一つになるように設計すること


## 参考
* [【Dart】Factory Constructorをかんたんに理解する](https://zenn.dev/10_tofu_01/articles/cb0c21f18f78da)
* 基礎から学ぶFlutter 著：石井幸次
AIサービスをまとめてみた

今の時代はAIで色々できますね。
ということでリンク集的にまとめました。

・人の顔写真のフリー素材
https://www.photo-ac.com/main/genface

・人の顔写真を作るサイト
https://generated.photos/faces


アクセスするたびに存在しない人の顔が表示される
https://thispersondoesnotexist.com/


AIで生成された素材集？
https://icons8.com/photos


・イラスト自動生成
https://novelai.net/

・日本語文章自動生成サイトを紹介
https://ai-copywriter.jp/

windows gui で生成 エX画像もOKみたい
https://pajoca.com/stable-diffusion-gui-nmkd/
M1MAX MacBook Pro にTensorFlowをインストールする方法

機械学習講座を受けるためにM1MAX搭載のMacBook Pro(2021)にTensorFlowをインストールします。

んー、なんでPytorchじゃないのか（愚痴）

環境は、
M1MAX macbookpro 20２１
Pythonは
/opt/homebrew/opt/python@3.9/libexec/bin/python
HomeBrewのPython3.9です


まず普通にpip installしてみます。
```
python -m pip install tensorflow-macos

Successfully installed astunparse-1.6.3 gast-0.4.0 google-pasta-0.2.0 h5py-3.7.0 keras-2.10.0 keras-preprocessing-1.1.2 libclang-14.0.6 opt-einsum-3.3.0 tensorflow-estimator-2.10.0 tensorflow-macos-2.10.0 termcolor-2.0.1 wrapt-1.14.1

```
なんか途中に色々とワーニングがでましたが、インストールができたっぽい。
動作確認します。

```
python
Python 3.9.15 (main, Oct 11 2022, 21:39:54) 
[Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
RuntimeError: module compiled against API version 0x10 but this version of numpy is 0xf
RuntimeError: module compiled against API version 0x10 but this version of numpy is 0xf
ImportError: numpy.core._multiarray_umath failed to import
ImportError: numpy.core.umath failed to import
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/homebrew/lib/python3.9/site-packages/tensorflow/__init__.py", line 37, in <module>
・・・・・・・・（略）
```

pip list にはTensorFlowがいるのに動かないですね。。。困った。


HomeBrewでインストールしたPythonではだめだという情報もありました。
参考(からあげさん）
[M1 Macでディープラーニングしてみる](https://zenn.dev/karaage0703/articles/0ab9e654cfb0ec)

githubのtensorflow_macosを見てみます。

https://github.com/apple/tensorflow_macos/

2022/10/15時点では最新は、「Version 0.1-alpha3」のようですね。
さらにPython 3.8のみに対応。

だめじゃん。。。。うち3.9だし。Anaconda使いたくないし(　･`ω･´)ｷﾘｯ



んーーー、
ん？

```
File "/opt/homebrew/lib/python3.9/site-packages/tensorflow/python/framework/dtypes.py", line 34, in <module>
    _np_bfloat16 = _pywrap_bfloat16.TF_bfloat16_type()
TypeError: Unable to convert function return value to a Python type! The signature was
	() -> handle
```

先ほどのエラーを見直すと、float関係でエラーが出てますね。。（適当）
numpyをアップグレードしてみましょう（適当）

```
pip install numpy --upgrade
```

さてもう一度TensorFlowの動作確認を行います。

```
python
Python 3.9.15 (main, Oct 11 2022, 21:39:54) 
[Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> tf.__version__
'2.10.0'
>>> 

```

やったぜい！！！！
Flutter fastlaneメモ

※※※
作成中
※※※

# 開発環境

PC:macOS Sequoia
エディター：Visual Studio Code

Xcode: 16.1
Android Sutudio: Meerkat Feature Drop | 2024.3.2

バージョン管理
- asdf: 0.16.5
  - flutter: 3.29.3-stable
  - ruby: 3.3.0

# 前提条件
- iOS, Android アプリがそれぞれビルドできる状態
- 個人のアカウントで行う（組織アカウントではない）
- Xcode に Apple ID が登録済み（サインインしている）

# ゴール
- fastlane を使用して iOS, Android アプリをビルド、ストアへのアップロード（テスト）までlocal 環境で行えるようにする

# スコープ外
- github actions や Bitrise, 他のサービスを使用した CD

# 準備
[fastlaneの公式](https://docs.fastlane.tools/#getting-started)に従って、fastlaneを導入する。

※本環境では、homebrew でインストール

# 内容

## iOS

### 初期化

ios ディレクトリに移動して、以下のコマンドを実行
```
fastlane init
```

fastlane init 実行時の質問

今回は TestFlight にアップロードするので、2 を選択する.
```
What would you like to use fastlane for?
1. 📸  Automate screenshots
2. 👩‍✈️  Automate beta distribution to TestFlight
3. 🚀  Automate App Store distribution
4. 🛠  Manual setup - manually setup your project to automate your tasks
```

自身の Apple ID（Apple DEveloper で登録しているメールアドレス）を入力する.
```
Please enter your Apple ID developer credentials
Apple ID Username:

```

App Store Connect でアプリがない場合は下記について聞かれる.
App ID を作成したり、App Store Connectにアプリを作成するかを聞かれるので、お好みで y or n を入力する
```
Do you want fastlane to create the App ID for you on the Apple Developer Portal? (y/n)
App Name:

Would you like fastlane to create the App on App Store Connect for you? (y/n)
App Name:
```

/ios/fastlane ディレクトリ配下に以下のファイルが生成される
- Appfile
```rb
app_identifier("com.exsample.hogehoge") # The bundle identifier of your app
apple_id("test@icloud.com") # Your Apple Developer Portal username

itc_team_id("1234567890") # App Store Connect Team ID
team_id("AAA1122334") # Developer Portal Team ID
```

- Fastfile

```rb
default_platform(:ios)

platform :ios do
  desc "Push a new beta build to TestFlight"
  lane :beta do
    increment_build_number(xcodeproj: "Runner.xcodeproj")
    build_app(workspace: "Runner.xcworkspace", scheme: "Runner")
    upload_to_testflight
  end
end
```

### ビルド & TestFight へのアップロード（作成中）

<details><summary>発生したエラー</summary>

build_app で発生したエラー

1. Exit status: 65

Xcode でアカウントがサインインしていなかったため、Team を確認して、サインイン。

2. Exit status: 70

Fastfile に以下の変更を行った
```diff_ruby
-   build_app(workspace: "Runner.xcworkspace", scheme: "Runner")
+   build_app(
+     workspace: "Runner.xcworkspace",
+     scheme: "Runner",
+     export_method: "app-store"
+   )
```
</details>








## Android（作成中）

- 初期化

- ビルド

- playStore へのアップロード

# 参考記事

[Flutter公式](https://docs.flutter.dev/deployment/cd)
[fastlane iosの設定](https://docs.fastlane.tools/getting-started/ios/setup#setting-up-fastlane)
[fastlane androidの設定](https://docs.fastlane.tools/getting-started/android/setup#setting-up-fastlane)
関数型、論理型、オブジェクト型　融合のお遊び

# 概要
先日、ISLisp上に作ったPrologインタプリタをライブラリとして整理するとともに、LispからPrologの呼び出し、PrologからLispの呼び出しができるようにしました。ISLispにはILOSというオブジェクト指向の仕組みがありますので、関数型、論理型、オブジェクト型の融合のお遊びができるようになりました。

# アイディアの元
後藤滋樹先生の「記号処理プログラミング」　岩波書店の記述がヒントになっています。
![IMG_1092.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/beacb972-515c-5c10-8fae-24b3bca7e8fd.jpeg)


# PrologからLispの呼び出し
is述語の右辺はLispのevalを呼び出しています。ですから計算式のみならずISLisp関数の全部を呼び出すことができます。これを利用しますとProlog側からlispを呼び出すことができます。


```
;; call lisp function
(assert ((ack _x _y _z)(is _z (ack _x _y))))

(defun ack (m n)
    (cond ((= m 0) (+ n 1))
          ((= n 0) (ack (- m 1) 1))
          (t (ack (- m 1) (ack m (- n 1)))) ))

Easy-ISLisp Ver2.64
> (import "prolog")
T
> (prolog)
-? (consult "tests/test.pl")
YES
-? (ack 3 8 _x)
_X = 2045
YES
-? 
```

このコード中のdefunは組込み述語として定義してあります。Lispと見かけは同じです。Lisp関数としてevalをしています。他にもdefgenericとdefmethodも組み込み述語となっています。

上記の例ではアッカーマン関数を呼び出しています。エジンバラPrologではユーザー定義関数はありません。このためアッカーマン関数も述語で定義することとなっています。しかし、多くの処理系ではスタックオーバーフローを起こします。バックトラックに備えて多くのデータを保持しているためです。決定性の関数である場合にそれは非効率です。


# LispからPrologの呼び出し
assert　-?　~?　を関数として用意してあります。-?はproveを呼び出します。~?はderefを呼び出します。これによりlispでPrologコードを記述し証明を読みだしてlispで利用することが可能です。


```
;;embedded prolog test code
(assert '(likes kim robin))
(assert '(likes sandy lee))
(assert '(likes sandy kim))
(assert '(likes robin cats))
(assert '((likes sandy _x) (likes _x cats)))
(assert '((likes kim _x) (likes _x lee) (likes _x kim)))
(assert '(likes _x _x))

(defun foo ()
    (let ((env (-? '(findall _x (likes sandy _x) _y))))
      (~? '_y env)))

Easy-ISLisp Ver2.64
> (import "prolog")
T
> (load "tests/prolog-test.lsp")
T
> (foo)
((LEE) (KIM) (ROBIN) (SANDY) (CATS) (SANDY))
> 
```


# Prologの弱点
Prologはバックトラックをするためのデータを保持しておく必要があります。このためアッカーマン関数のような決定性で多くの計算を必要とするものの計算には不向きです。多くのProlog処理系でスタック不足により処理系が落ちます。バックトラックを要しない決定性の関数はLisp書いておけば処理系の負担が軽減されます。Prologの弱点をLispがカバーしつつそれぞれの得意分野を活かすことが可能です。


# Prologの可能性
現在主流のAIはDeepLearningです。DLはAIの可能性を切り拓きました。しかし、DL単独では人間のような推論をすることはできません。筋道立てて論理的に考えていくということを模倣するにはPrologのような論理型の言語が必要なはずです。DLとPrologが組み合わさることで可能性が広がるだろうと思います。Lisp＆Prologには古典的人工知能の遺産があります。これを現代に活かせないだろうか、と考え続けています。

# 実装
自作のLisp処理系、Easy-ISLispにライブラリとして付属しています。よかったら遊んでみてください。
https://github.com/sasagawa888/eisl
角丸で枠線がグラデーションのTextEditor



iOS１６では背景色をつける場合はscrollContentBackgroundモディファイアを使う。
※iOS15以前は

```Swift
    init() {
        UITextView.appearance().backgroundColor = .clear
    }
```
と書いていたが、iOS16ではこの機能は使えない。

```Swift

struct ContentView: View {

    @State var textEditor: String = "ああああ"
    var body: some View {
        ZStack {
            Color.brown.opacity(0.5)
            TextEditor(text: $textEditor)
                .frame(width: 100, height: 100)
                .scrollContentBackground(.hidden)
                .background(.white, in: RoundedRectangle(cornerRadius: 30.0))
                .overlay(
                    ZStack {
                        RoundedRectangle(cornerRadius: 30.0)
                            .stroke(
                                LinearGradient(
                                    colors: [
                                        Color(red: 254 / 255, green: 212 / 255, blue: 117 / 255)
                                        ,Color(red: 229 / 255, green: 61 / 255, blue: 93 / 255)
                                        ,Color(red: 194 / 255, green: 49 / 255, blue: 134 / 255)
                                    ],
                                    startPoint: .bottomLeading,
                                    endPoint: .topTrailing
                                ),
                                lineWidth: 2
                            )
                    }
                )
        }
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421964/22525ac6-b2fa-e73a-dbd1-421c5c22ffc7.png)
【Vite】テストが自動終了しない！！！

# Viteでテストが自動終了しないよぉ！！！
ネットによくある情報でViteでJestの実行環境をそのまま構築すると、以下の画像のようにテスト自体はそのまま実行されるのですが、画像の最終行の文章の通り`q`を入力しないとテストが終了しないことがあると思います。
![6914f7a1-9945-444f-baa8-abeca03ca160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/16f1c01e-9fb1-c337-cfd7-8943187a8658.png)

# 原因：`watch`モードで実行されていたから
以下のように`package.json`の`scripts`でテストを実行すると、自動的に`watch`モードが起動して自動終了しなくなります。
```json:package.json
  "scripts": {
    "test": "vitest",
  }
```

## そもそも`watch`モードって何？
[公式ドキュメント](https://vitest.dev/guide/#commands)によるとホットデプロイみたいなプロセスが走るモードです。
そのためホットデプロイが常に走るようになるため、テストが自動終了しなくなります。

:::note info
### 原文
Run all test suites but watch for changes and rerun tests when they change. Same as calling vitest without a command. In CI environments this command will fallback to vitest run

### Deeplで日訳した文章
すべてのテストスイートを実行するが、変更を監視し、変更されたときにテストを再実行する。コマンドなしでvitestを呼び出すのと同じです。CI環境では、このコマンドはvitest runにフォールバックする。
:::

# 【解決方法】`run`モードで実行する
`run`で実行するとテストが、自動終了するようになります。
```json:package.json
  "scripts": {
    "test": "vitest run",
  }
```

![ezgif-3-0a639c74dd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/5d910027-815e-4d26-acb1-c2c3df7764ad.gif)


## `run`モードって何？
[公式ドキュメント](https://vitest.dev/guide/#commands)によると、テストを1回だけ実行するモードです。

:::note info
### 原文
Perform a single run without watch mode.

### Deeplで日訳した文章
ウォッチモードを使用しないシングルランを実行します。
:::

# さいごに
今回はJestのテストを実行していましたが、Vitestが原因なのでJasmineやMochaでも同様なことが発生すると思います。
また、GitHubActionsではテストを`vitest`で動かしても`watch`モードから自動的に`run`モードに切り替わるみたいですが、他のCIツールでは自動的に切り替わらない可能性があるため、最初から`run`モードで動かしたほうがいいかもしれません。
NLBのターゲットとしてALBを指定し、ALBでTLS終端させる

# 初めに

以前書いた記事では、ウェブサーバに HTTP でアクセスしようとした場合には、NLB の TLS:443 リスナーにリダイレクトし、ALB を経由せず NLB で TLS 終端していました。

https://qiita.com/quryu/items/e231fe83acf5dfc963e8

しかし ALB 型のターゲットグループをそれぞれ 80 番ポート用と 443 番ポート用の 2 つ用意することで、NLB に TCP:80、TCP:443 いずれのアクセスに対しても ALB で TLS 終端できることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/1ad39646-79fd-b84e-ea9d-0f89d9992403.png)

# 手順

CloudFormation で基本的なリソースを作成します。以下のテンプレートを使用します。

https://github.com/quryu-1/aws-cfn-template/blob/main/nlb-alb-template.yaml

パラメータには、インスタンスログイン用の IP アドレスと、ALB に設定するSSL証明書の ARN を入力します。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/dbc482bd-b09b-043d-6143-265816af56da.png)

以下のようにステータスが「CREATE_COMPLETE」になったら次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/0fd36e34-396c-b991-9a51-4b6004b67141.png)

NLB と同一の AZ でインスタンスを作成します。ここでは NLB の AZ は `ap-northeast-3c` です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/a285ad97-032d-1704-f862-5882471fbf68.png)

インスタンス作成時、以下のようにサブネット（AZ が `ap-northeast-3c` であることを確認）、セキュリティグループを選択します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/28d2cc76-73ba-c2ab-c2f9-402b915f7365.png)

インスタンス作成後、Apache をインストールして起動します。

```
sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
```

index.html ファイルを `/var/www/html/index.html` として配置します。

```index.html
<html>
  <body>
    <h1>web-server-1</h1>
    <div id="datetime"></div>
  </body>
  <script>
    const target = document.getElementById("datetime");
    target.innerHTML = new Date();
</script>
</html>
```

ターゲットグループ 「nlb-alb-demo-tg」 にインスタンスを登録します。以下の「ターゲットの登録」をクリック後、作成したインスタンスを選択し、登録を行います。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/06e33170-7e8b-ce89-c9d0-9b5f52b78440.png)

NLB の DNS 名をコピーします。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/a15704af-76bd-8859-6d9f-2d4660de7971.png)

ブラウザに貼り付けて確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/5a83f485-9507-2b64-51f4-a5c1447b10ad.png)


# ログ確認

上記アクセス時のログの一部を抜き出しました。
1 行目のログは NLB の 80番ポートにアクセスを行い、443 番ポートにリダイレクトされていることがわかります。
2 行目のログは、NLB の 443 番にアクセスを行い、ALB の SSL 証明書が使用されていることがわかるので、ALB で TLS 終端していることがわかります。

```
"GET","http://nlb-alb-demo-nlb-372743b8131b44f6.elb.ap-northeast-3.amazonaws.com:80/", ...省略... ,"redirect","https://nlb-alb-demo-nlb-372743b8131b44f6.elb.ap-northeast-3.amazonaws.com:443/"
"GET","https://nlb-alb-demo-nlb-372743b8131b44f6.elb.ap-northeast-3.amazonaws.com:443/", ...省略..., "arn:aws:acm:ap-northeast-3:000000000000:certificate/f1d3ac26-51b3-4009-8e79-30066a6ebbb6"
```

# その他メモ

テンプレート作成中に気になった部分をメモとして残しておきます。

```yaml
# 以下は !Ref ALB で取得できるが、以下の書き方でも ARN を取得可能
LoadBalancerArn: !Sub arn:aws:elasticloadbalancing:${AWS::Region}:${AWS::AccountId}:loadbalancer/${ALB.LoadBalancerFullName}
```

# 参考資料

https://www.beex-inc.com/blog/nlb_alb_https_access

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/AWS_ElasticLoadBalancingV2.html
【Swift】公式ドキュメントのSequenceプロトコルを読む

# この記事は何？
SwiftのSequenceプロトコルについて、解説したものです。
[開発者ドキュメント](https://developer.apple.com/documentation/swift/sequence)より

# 宣言

```swift
protocol Sequence<Element>
```

# 概要

シーケンスは、1つずつ連続して取得できるリスト形式の値です。
シーケンスの要素を反復処理する代表的な方法は、`for-in`ループです。

```swift
let oneTwoThree = 1...3
for number in oneTwoThree {
    print(number)
}
// Prints "1"
// Prints "2"
// Prints "3"
```

これによって、どんなシーケンスに対しても、多くの操作方法を実行できるようになります。
例えば、シーケンスに特定の値が含まれているかどうかを確認するために、「値が一致するか、シーケンスの最後に到達する」まで、各値を順次チェックできます。
次の例では、昆虫の配列に「蚊がいるかどうか」を確認します。

```swift
let bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
var hasMosquito = false
for bug in bugs {
    if bug == "Mosquito" {
        hasMosquito = true
        break
    }
}
print("'bugs' has a mosquito: \(hasMosquito)")
// Prints "'bugs' has a mosquito: false"
```

`Sequence`プロトコルは、シーケンスから値を順次取得する一般的な操作のデフォルト実装を提供します。
上記の例のように手動で反復せずに、すべてのシーケンスが`Sequence`プロトコルから継承する配列の`contain(_:)`メソッドを使用すると、コードをより明確で簡潔にできます。

```swift
if bugs.contains("Mosquito") {
    print("Break out the bug spray.")
} else {
    print("Whew, no mosquitos!")
}
// Prints "Whew, no mosquitos!"
```

# 連続のアクセス

`Sequence`プロトコルは、反復によって「データが破損されるかどうか」について、適合する型に要求しません。その結果、あるシーケンスが`for-in`ループをいくつも反復したり、初めから再回したりすると仮定はしません。

```swift
for element in sequence {
    if ... some condition { break }
}

for element in sequence {
    // No defined behavior
}
```

この場合では、シーケンスが消耗されて反復を再開するか、シーケンスがコレクションなので先頭要素から反復を再開するか、を仮定することはできません。
コレクションではない`Sequence`適合型は、2番目の`for-in`ループで任意の要素のシーケンスを生成できます。

型の非破壊的な反復をサポートを確認するには、その型を`Collection`プロトコルに準拠させます。

# Sequenceプロトコルに準拠する

独自の型を`Sequence`に準拠させると、`for-in`ループや`contains`メソッドなど、多くの便利な操作ができるようになります。
型を`Sequence`プロトコルに準拠させるには、イテレータを返す`makeIterator()`メソッドを実装します。

なお、型が独自のイテレータとして機能できる場合は、`IteratorProtocol`プロトコルの要件を実装し、`Sequence`と`IteratorProtocol`の適合を宣言するだけです。

以下に、独自のイテレータとして機能するカウントダウンのシーケンスを定義します。
`makeIterator()`メソッドは、デフォルト実装が提供されます。

```swift
struct Countdown: Sequence, IteratorProtocol {
    var count: Int

    mutating func next() -> Int? {
        if count == 0 {
            return nil
        } else {
            defer { count -= 1 }
            return count
        }
    }
}

let threeToGo = Countdown(count: 3)
for i in threeToGo {
    print(i)
}
// Prints "3"
// Prints "2"
// Prints "1"
```

# 計算量

シーケンスが提供するイテレータの計算量は`O(1)`である必要があります。
`Sequence`プロトコルは、要素を取得する方法については他の要件はないので、特に文書化されていない限り、シーケンスを横断するルーチンは`O(n)`と見なすべきです。
【SQL】相関サブクエリについて

# 背景
普段は、Reactをメインに書いているのですが、結合テストでSQLを叩く必要がありました。
たまにしかSQLは書かないので、忘れないようにまとめておきます。

# 欲しいデータ
分かりやすくゴルフに例えました。
今年(2022年)ラウンドしたゴルフ場名(course_name)一覧を取得したいとします。
テーブルとしては、スコアテーブルとゴルフコーステーブルがあります。

### scores Table(検索対象の主テーブル)
※1行=1ラウンドのデータとなります。
スコア、ゴルフコースID、プレイ日のデータを持っています。
|  score  |  course_id  | play_date |
| ---- | ---- | ---- |
|  120  |  cid0006  |2022/10/10 |
|  79  |  cid0003  |2022/10/04 |
|  83  |  cid0003  |2022/09/30 |
|  102  |  cid0002  |2022/07/21 |
|  89  |  cid0004  |2022/01/01 |
|  96  |  cid0006  |2021/12/31 |



### courses Table
※ゴルフ場名のデータを持っています。
|  course_id  | course_name
|---- |---- |
|  cid0001  | 四街道 |
|  cid0002  | 空港ゴルフコース |
|  cid0003  | ワイルドダック |
|  cid0004  | 皐月ゴルフ |
|  cid0005  | 東京クラシック |
|  cid0006  | 大洗ゴルフクラブ |
|  cid0007  | 小樽カントリー |
|  cid0008  | フェニックス |
|  cid0009  | 琉球ゴルフクラブ　|
|  cid0010  | 五浦庭園 |

# 取得順序
最終的には一発で取得したいのですが、分かりやすく順を追って書いていきます。

1. プレー日時で絞り込む
   ```sql
   SELECT course_id FROM score
   WHERE play_date => '2022/01/01'
   ```
1. プレーしたゴルフ場を重複を削除してグループ化する
   ```SQL
   SELECT course_id FROM score
   GROUP BY course_id 
   ```   

1. 2の結果をサブクエリとして、courseテーブルから一致するゴルフ場名を取得する。
   ```sql
   SELECT course_name 
    FROM score AS cid1
   WHERE 
   play_date => '2022/01/01' AND 
   course_id = (SELECT course_id FROM score AS cid2
    WHERE cid1.course_id = cid2.course_id --ここが重要
    GROUP BY course_id )
    ```

# 解説

```sql
WHERE cid1.course_id = cid2.course_id 
```

この行が最も重要です。
これがないと、SQLはエラーを出します。なぜなら、
`GROUP BY course_id`は複数の値を返します。
今回で言うと、`[cid0002, cid0003, cid0004, cid0006]`を返します。
WHEREの比較対象は一つでないとエラーになってしまいます。

そこで必要なのが、`WHERE cid1.course_id = cid2.course_id `
これが相関サブクエリというものです。
使い所としては、今回のように、テーブル全体ではなく、テーブルの一部に限定した比較を行いたいとき、
具体的にいうと、course_idをグループ化して、そのグループ内での比較を行いたい時に使います。

# 参考
https://www.shoeisha.co.jp/book/detail/9784798144450
Stripeの決済失敗をテストする際に利用するクレジットカード番号について

# Stripeのテスト用クレジットカード番号について
https://stripe.com/docs/testing

支払いが成功するカード、失敗するカード、全てこちらに掲載されています。
このクレジットカードの中で支払いの失敗をテストする特に利用したいカード番号があります。

# 関連づけられた後の支払拒否の番号です
4000000000000341

本番号を利用することで、顧客には紐づけられるけど、決済が失敗するカードとして登録ができます。
他の支払い失敗のクレジットカード番号については、顧客に紐づけられない状況です。

# 顧客には紐づけられるけど、決済が失敗するとはどういうことか
通常のシチュエーションでは、サブスクリプションの1回目の決済が失敗するよりも、2回目以降の決済が失敗した際の挙動を検討する必要があります。

1回目の支払いが失敗するということは、そもそも申し込みができていないため、お客さまは自身で利用できるクレジットカード番号を検討します。
しかし、2回目以降については、クレジットカード決済が失敗したとしても、設定内容によっては、有効なままのサブスクリプションとなります。
そのため、テストで有効なサブスクリプションを作成し、顧客に本クレジットカード番号を紐づけ、決済が失敗した場合にどのようなイベントが発生するのかを検証し、それに応じて通知内容を設定する必要があると考えられます。

# 決済失敗時の通知方法
1, 管理画面から設定する方法
お客様へ決済失敗時の通知メールを設定することは可能ですが、その場合支払方法を変更できるページ (カスタマーポータルを作成するページ)を準備する必要があります。
また、管理者へは支払失敗時に通知する方法は、管理画面からはできなかったと記憶しています。

2, webhookによる設定
webhookを利用すれば、決済失敗の理由から、本サブスクリプションに関する請求書の送付、また、請求書番号など、さまざまな情報を送信することが可能となります。
また、管理者宛にも支払失敗を通知することが可能となります。

# 2回目以降の決済失敗をなぜ考える必要があるのか
有効となっているサブスクリプションの決済が失敗する方が、機会損失の割合が多いです。
せっかく申し込みをしているお客様にとっても決済失敗というのは、申し訳ない気持ちでいっぱいになることや、サブスクリプションをやめるきっかけにもなり得ます。

その状況を少しでも減らすためにも、webhookを設定し、お客様がサービスを継続しやすくするような、仕組みを導入する必要があると考えます。

# 終わりに
これまでStripeを利用されている多くの方のお手伝いをさせていただいておりますが、
なかなか決済が失敗した際のシチュエーションを考えていらっしゃる方が少なかったので、
記事にさせていただきました。
APIgateway+Lambda+DynamoDB でのID管理を実装する

# 目的
AWSでよくある構成として APIgateway+Lambda+DynamoDBのサーバレスな構成があります。
ただこの時に、DynamoDBでは連番の管理ができない（id1の次は2のidをつけるみたいな）
そのため、DynamoDB側でテーブルを二つ用意してあげる必要があります。
+ データを格納テーブル(例: id,名前,email,時刻など)
+ 連番を管理するテーブル(上記のidの部分をカウントするようのテーブル)

そのためLambdaでカウントするようなコードの書き方になってきます。
前提としてLambda,APIgateway,DynamoDB間のAMIの権限周りは既にクリアした前提とします。
# やったこと
今回は、Lambdaのコード周りでハマりまくったので
備忘録的な感じでコードだけとりあえず貼っておきます。
```ruby:
import json
import boto3
import base64
import time
import decimal

# DynamoDBオブジェクト
dynamodb = boto3.resource('dynamodb')

# 連番を更新して返す関数
def next_seq(table, tablename):
    response = table.update_item(
        Key={
        'tablename' : tablename
        },
        UpdateExpression='set seq = seq + :val',
        ExpressionAttributeValues= {
            ':val' : 1
        },
        ReturnValues='UPDATED_NEW'
    )
    return response['Attributes']['seq']

    
def lambda_handler(event, context):
    try:
        # シーケンスデータを得る
        seqtable = dynamodb.Table('kuruma-sequence')
        nextseq = next_seq(seqtable, 'kuruma-user')
        
        # フォームに入力されたデータを得る
        body = event['body']
        if event['isBase64Encoded']:
            body = base64.b64decode(body)
            
        decoded = json.loads(body)
        username = decoded['username']
        email = decoded['email']
        
        #　クライアントのIPアドレスを得る
        host = event['requestContext']['identity']['sourceIp']
        
        #　現在のUNIXタイムスタンプを得る
        now = time.time()
        
        #　ユーザーテーブルを登録する
        usertable = dynamodb.Table('kuruma-user')
        usertable.put_item(
            Item={
                'id' : nextseq,
                'username' : username,
                'email' : email,
                'accepted_at' : decimal.Decimal(str(now)),
                'host' : host
            }
        )
        
        #　結果を返す
        return {
            'statusCode' : 200,
            'body' : json.dumps({})
        }
    except:
        #　エラー文を返す
        import traceback
        err = traceback.format_exc()
        print(err)
        return{
            'statusCode' : 500,
            'headers' :{
                'context-type' : 'text/json'
            },
            'body' : json.dumps({
                'error' : '内部エラーが発生しました'
            })
        }
```
# しょうもないところでハマった
クライアント側のIPアドレスを取得する時に書き方がわからずハマった。
最初はずっと下記のような書き方をしていました。
ですがずっと KeyError 'host'でひっかかっている
ドキュメントみても'host'はあったので何がいけないのかわからずで、Lambda側のテストの中身見ていると'identity'になっていたので、試しに書き換えてみると取得できるようになっていました。
```ruby:ハマっていたコード
#　クライアントのIPアドレスを得る
        host = event['requestContext']['host']['sourceIp']
```
↓
```ruby:成功したコード
#　クライアントのIPアドレスを得る
        host = event['requestContext']['identity']['sourceIp']
```
Next.jsとは？


Next.jsというものを最近使い始めたが、同じような名前のNuxt.jsとは何が違うのか、Reactとは何が違うのか？
細かい違いがわからなかったのでここで整理します。
と言っても、引用元の記事のコピペがメインになりますのでご承知おきを。

### 引用
https://www.webstaff.jp/guide/trend/nextjs/#case01

## Next.jsとReactの違い
Next.jsはReactベースではありますが、Next.jsとReactでは以下のような違いがあります。

| |Next.js |React|
|---|---|---|
|サーバ機能|○  |×  |
|利用用途|アプリケーションフレームワーク|Viewライブラリ|
|部分導入|×  |○  |

## Next.jsとNuxt.jsとの違い
Next.jsと似たような名前のNuxt.js（ナクストジェイエス）というフレームワークがあります。Next.jsもNuxt.jsもSSRを可能にするJavaScriptフレームワークです。サーバサイドでレンダリングが必要な際に導入するのが一般的です。
違いとしては、Reactで構築されたアプリケーションをSSRする場合はNext.jsを使い、Vue.jsアプリケーションをSSRする場合はNuxt.jsを使う、ユースケースによって使い分けてください。

| |Next.js |Nuxt.js|
|---|---|---|
|ベース|React.js|Vue.js|

## Node.jsとの関係
Next.jsはそれ単体では動作できません。事前にNode.jsのインストールが必要になります。Next.jsはUIライブラリのReact.jsをNode.jsで使用できるようにするフレームワークです。

## Next.jsの特徴とできること
Next.jsの大きな特徴として以下の4つが挙げられます。少し難しいように見えますが、ひとつずつ見てみましょう。

- 画像最適化
- ファイルベースルーティング
- ハイブリッドなレンダリング
- ファストリフレッシュ

### 画像最適化
Next.jsはimgタグの代わりにImageタグを使うことで、画像を最適化することが可能です。具体的には、画像の次世代フォーマットであるWebPへ自動的に変換するため、高速に画像を表示することができます。そのため従来のjpegやpngよりもはるかに表示速度が速くなるのです。わざわざ画像をWebPに変換する手間も省けますので非常に便利です。

### ファイルベースルーティング
URLを決定し、Webページ表示したい場合、通常は特定のフォルダの配下にindex.htmlを置きます。例えばhttp(s)://localhost/map/であれば、サーバのmapフォルダ配下にindex.htmlをアップロードします。
しかし、Next.jsでは「pages」というフォルダが初めから存在しており、pagesフォルダ配下にファイルを置くと自動的にパスが生成され、アクセス可能になります。
具体的には、/pages/map.jsxというファイルを作ることで、http(s)://localhost/mapというURLへアクセスできるようになります。

### ハイブリッドなレンダリング（CSR・SSR・SSG）
Reactではクライアントサイドでのレンダリング(CSR：Client Side Rendering)のみに対応していますが、Next.jsはサーバサイドでレンダリング(SSR：Server Side Rendering)が可能です。さらにはページごとにレンダリングの種類を個別に分けることさえできます。

このレンダリングの方法の違いを紹介する際は必ずと言っていいほどSEO（Search Engine Optimization）が話題に上がります。Googleのクローラーが検知しやすいのが、サーバサイドレンダリングだというのは有名です。ただし、Googleのクローラーは近年非常に進化しており、JavaScriptのようなクライアントサイドでレンダリングされたものでも、ほとんど遜色なく検知できるようになったとも言われています。

また、Next.jsでは静的にサイトを生成するプレレンダリングが可能です。一般的にStatic Site Generation の頭文字を取ってSSGと呼ばれています。静的にサイトを構成することの最大のメリットは、最初にページにアクセスする際に瞬時にHTMLを提供するため、レンダリング速度の大幅な軽減が期待できることです。読み込み速度が改善することから、ユーザフレンドリーなレンダリング方法だといえます。

### ファストリフレッシュ
ファストリフレッシュとはソースコードに変更があった場合にその箇所のみが再描画されるという機能です。Reactでも同様の機能が利用できますが、ライブラリのインストールが必要になります。Next.jsでは変更した箇所のみがブラウザに反映されるため、効率よく開発を進められます。
WSL2でMariaDB(MySQL)が起動しないとき

Windowsを再起動したとき，WSLでMariaDBを起動する方法
すこし手間取ったので備忘録的な感じで

# 環境
* Windows11(21H2)
* WSL2(0.70.0.0)
    * Debian(11.5)
    * MariaDB(15.1)

書いているときに気付いたけど，systemd使えるバージョンだった．
今回はsystemd使わずにやる．

# 症状
MySQLを起動しようとすると，

```
$ service mysql start
```
WSLに「そんなサービスねーぞ」と怒られる
```
mysql: unrecognized service
```
仕方なくサービス一覧を確認
```
$ service --status-all
...
 [ - ]  mariadb
...
```
MariaDBのサービスならあるらしい（なんか違和感あるけどまーいいか）
とりあえずmariadbで起動してみる
```
$ service mariadb start
```
また「/var/mysqldっていうディレクトリねーぞ．」と怒られた．
```bash
Starting MariaDB database server: mariadbdinstall: cannot change owner and permissions of ‘/run/mysqld’: No such file or directory
```

# 対処
root権限に移り，指定箇所にディレクトリを作る．ついでにグループも変える．
```
$ sudo -s
# mkdir /run/mysqld
# chown mysql:mysql /run/mysqld
```

起動してみる
```
# service mariadb start
Starting MariaDB database server: mariadbd.
```
無事起動したみたい
```
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 10.5.15-MariaDB-0+deb11u1 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

# [追記]余談
まあ，WSLのバージョンがv0.67.6以上だったらこんなことしなくてもいいんですけどね．
なぜなら，systemdを使うことができるから．
```
$ sudo vi /etc/wsl.conf
#以下を入力
[boot]
systemd=true
```
保存して再起動かけると自動的にmariadbが立ち上がります．
```
$ ps aux | grep mysql
mysql        186  1.0  1.3 2230420 109216 ?      Ssl  13:32   0:00 /usr/sbin/mariadbd
woodnext     562  0.0  0.0   6240   708 pts/1    S+   13:32   0:00 grep mysql
```
まあこっちのほうが楽だよね...
ネットワーク応用

# 電子メールの仕組み
## メールアドレス
記述形式は、```アカウント名@ドメイン名```で手紙の例でいえば、```アカウント名は名前```に```ドメイン名は住所```に相当する。

## 電子メールの構成
メール本文とメールヘッダから構成されている。
ヘッダ情報にはさまざまな情報が格納されている。

### ヘッダの格納情報
#### From/To 
発信元/送信先のメールアドレス
#### Cc/Bcc 
カーボンコピー/ブラインドカーボンコピー先のメールアドレス
#### Received 
メールサーバの転送経路
#### Reply-To 
返信先のメールアドレス
#### Subject 
メールタイトル
#### Date
メールの送信日時
#### Message-Id
一意に決められるメール識別子
#### X-Mailer
使用しているメールソフト

# 電子メール転送の仕組み
p239を見る。

## メールの送信〜転送
1. 電子メールを作成
2. 電子メールは、まず自分が所属しているメールサーバに送信される。
3. メールサーバではMTA（Messege Transfer Agent)と呼ばれるプログラムが起動しており、このMTAがメールアドレスを見てインターネット上の```どのメールサーバに転送すればよいかを決定し、メールの送信を開始```する。メールは```SMTPでインターネット上を配送され、目的のメールサーバに届けられる```。

## メールの受信
4.宛先のメールサーバに届いたメールは、アカウントごとに仕分けされ、```メールボックス（スプール）に格納```される。メールサーバでは、```MUA(Mail User Agent)と呼ばれるプログラム```を起動しており、```MTAからメールを受け取ってユーザに提示```したり、```ユーザから送られたメールをMTAに転送する作業```を行う。

### 気づき
最初に自分の所属するMTAに行く。
メールを転送させるときはSMTPを使う。
送信先のMTAに転送させ、スプールに保存させる。
MTAからメールを取り出すにはPOP３、IMAP4を使って取り出す。

#### スプール
スプールとは、処理能力に大きな差のある装置やソフトウェア、通信回線などを協調して動作させる際に、速い側の待ち時間を短くするために、```処理すべきデータを一時的に記憶装置に保存```し、遅い側に少しずつ転送して処理させる仕組み。また、そのための専用の保存領域。
出典 https://e-words.jp/w/%E3%82%B9%E3%83%97%E3%83%BC%E3%83%AB.html

#### SMTP
メール送信時に使われるプロトコル
##### 出典
https://www.sbcr.jp/product/4797396072/

#### POP３
メールボックスのメールをパソコンに取り込んで、パソコンの中で整理や閲覧をするスタイル。
#### IMAP４
メールをサーバ上のではメールボックスに置いたままにして、整理や閲覧をするスタイル。

##### 出典

https://www.sbcr.jp/product/4797386677/

# Webシステム
## CGI（Common Gateway Interface)
CGIは、```HTML文書からWebサーバ上のプログラムを起動して、実行結果を返す仕組み```。
アクセスカウンタやアンケート集計など、```HTMLだけでは記述できない複雑な処理```や```対話的な処理```も、CGIによってプログラムと連携させることで実現可能になる。

## cookie(クッキー)
```閲覧しているユーザ情報などを、一時的にユーザのパソコンに保存する仕組み```。
あるwebページでユーザ登録をすると、次にそのWebページを開いた時に、自動的にそのユーザ専用のページが表示される仕組みなどに利用される。便利な仕掛けではあるが、```ユーザの意図しない間に、保存している情報を盗まれたりでは、システムを改変されるなど、悪意を持ったプログラムの可能性もある```ので注意が必要。

# モバイルシステム
## LTE(Long Term Evolution)
```4Gとも呼ばれる高速な携帯電話通信規格```
3GPP(3rd Generation Partnership Project)で使用が標準化されている。
回線はパケット交換網のみのため、音声はVoLTE技術によりパケット化を行う。```複数のアンテナを使用して高速化が可能で、これをMIMO(Multiple Input Multiple Output)```と呼ぶ。

## キャリアアグゲーション(carrier aggregation)
```異なる複数の周波数帯の電波を結合して一つの回線として使い、仮想的に帯域幅を広げる技術```。
通信速度の向上、周波数を分散することで```回線を効率的に利用```できる。

## テザリング(tethering)
スマートフォンなどの```ネットワーク接続環境を利用してパソコンやタブレットをインターネットに接続する```こと。
接続には、```BluetoothやWi-Fi```などがある。
# 関連記事
https://qiita.com/masatom86650860/items/721d925e42d911b0a0a5

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
google colabにcuda10.0をインストールする

**1.はじめに**

　先日、google colab から cuda10.0 が削除され、tensorflow1.14や1.15などを使ったコードでは下記のエラーが発生するようになって使えなくなってしまいました。

```
Setting up TensorFlow plugin "fused_bias_act.cu": Preprocessing... Failed!
・・・・・・・
・・・・・・・
・・・・・・・
RuntimeError: No GPU devices found
```

**2.対応策**
　Tensorflow1.14や1.15などはかなり古くなりましたが、stylegan2を始めとしてかなりコード資産がありますので、今回は google colab に新たに cuda10.0 をインストールするコードを備忘録として残します。

```python
#@title install cuda10.0 

# download data
!wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
!sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
!rm /etc/apt/sources.list.d/cuda.list
!sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
!sudo apt-get update
!wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
!sudo apt install -y ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
!sudo apt-get update

# install NVIDIA driver
!sudo apt-get -y installnvidia-driver-418

# install cuda10.0
!sudo apt-get install -y \
    cuda-10-0 \
    libcudnn7=7.6.2.24-1+cuda10.0  \
    libcudnn7-dev=7.6.2.24-1+cuda10.0

# install TensorRT
!sudo apt-get install -y libnvinfer5=5.1.5-1+cuda10.0 \
    libnvinfer-dev=5.1.5-1+cuda10.0

!apt --fix-broken install
```
複数ファイル名を一部だけ一括置換する


業務で複数ファイル名を大量に修正する必要がありましたので
自分用の備忘録として残しておきます。

1.powershellで「㏅」コマンドを使い置換したいフォルダーに移動する。

2.以下コマンドを実行。
#「週次報告書xxxx」ファイルを「週報xxxx」ファイルに置換する
 ls | ren -NewName {$_.Name -replace "週次報告書","週報"}

3.以上。
LPC812MAXの内部シリアルを有効化してテスト出力する。(USBTX)



目的
なぜか無効化されているので
SJ1にはんだをもって有効化する


![o_cop113.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/808d03ae-521a-965d-be9d-0b50a183885b.jpeg)


![o_cop114.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e8790833-1973-6497-49ec-9ab4f6618f06.jpeg)


![o_cop115.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5bd6a722-3131-2a3a-f09c-bd23be93c59d.jpeg)


ザ、Mbed オンラインコンパイラーは、廃止されます。


![o_cop116.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/23e3066a-fa8e-aa07-e35f-520f1f54547a.jpeg)




プログラム


https://qiita.com/caa45040/items/e91e4d6b1b5a21492f47