OmniAICreator/Qiita-1.07M huggingface dataset:
JavaのLocalDateTimeをgoogle.type.datetimeに変換する

## 概要
Protocol Buffersで日付型として「[google.type.datetime](https://github.com/googleapis/googleapis/blob/master/google/type/datetime.proto)」を使用した際、
生成したオブジェクトにJava側で値を詰めるときに困ったのでやったことを備忘として記載
※もっといいやり方あったらコメントいただけると助かります

- 参考：
    - [google.type.DateTime](https://javadoc.io/static/com.google.api.grpc/proto-google-common-protos/2.1.0/com/google/type/DateTime.html)
    - [LocalDateTime](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html#getHour--)

## サンプル
- .protoの記載
```
syntax = "proto3";

package sample;

import "google/type/datetime.proto";

message response {
    google.type.DateTime last_updated = 1;
}

```

- Java側の記載
下記で一度変換した上でオブジェクトに詰めるようにした。

```
import com.google.type.DateTime
import java.time.LocalDateTime

public DateTime toDateTime(LocalDateTime localDateTime) {
    return DateTime.newBuilder()
    .setYear(localDateTime.getYear())
    .setMonth(localDateTime.getMonthValue())
    .setDay(localDateTime.getDayOfMonth())
    .setHours(localDateTime.getHour())
    .setMinutes(localDateTime.getMinute)
    .setSeconds(localDateTime.getSecond)
    .build();
}
```
EclipseでJREの定義を追加しようとしたら、つまずいた話

# はじめに
HomebrewでインストールしたOpenJDK@11をEclipseで使用したかったが、かなりつまずいたのでここに記録する。

# 前提条件
- チップ
    - Apple M1 Pro
- OS
    - macOS Ventura version:13.1
- [こちら](https://geniusium.hatenablog.com/entry/2022/04/26/191610)の記事を参考に、HomebrewでOpenJDK@11をインストール
- [Pleiades All in One](https://mergedoc.osdn.jp/)のEclipse 2022版（version:2022-12 (4.26.0)）をインストール

# つまずいたこと
OpenJDK@11とPleiades All in Oneのインストールを終え、Eclipseを起動するも、以下の2つのことにつまずいた。

## 1.JREの追加画面でHomebrewのOpenJDK@11が見つからない
```zsh
~ % which java '/opt/homebrew/opt/openjdk@11/bin/javaが出力される
```
上の出力結果より「/opt/homebrew/opt/openjdk@11/bin/」でJREの追加を試みるも、「ターゲットは JDK ルートではありません。」と表示され、進まない。

## 2.Hallo Worldできない
上記1の課題は解決し、Hello Worldの出力を試みるも、失敗する。
```java
package test;
public class Test {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
/**
エラー: メイン・クラスtest.Testのロード中にLinkageErrorが発生しました
java.lang.UnsupportedClassVersionError: test/Test has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
**/
```

# 解決編
## 1.JREの追加画面でHomebrewのOpenJDK@11が見つからない
1. メニューバー＞Eclipse＞設定をクリックする。
![スクリーンショット 2023-02-26 1.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113880/c65e2023-687a-305c-aa22-ee0355cd9895.png)

1. 表示された画面で、Java＞インストール済みのJREを選択し、画面右の追加ボタンを押す。
1. MacOS X VMを選択し、次へボタンを押す。
1. 「/opt/homebrew/opt/openjdk@11/bin/java」のうち、「/opt/homebrew/opt/openjdk@11/」の部分だけJREホームに入力してディレクトリーボタンを押す。
1. バージョンのディレクトリがあるので、クリックしてOpenボタンを押す。
1. 外部JARの追加ボタンを押す。
1. libディレクトリ＞jrt-fs.jarを選択してOpenボタンを押す。
1. ソース添付ボタンを押し、外部ロケーションを選択＞外部ファイルボタンからsrc.zip（開いたディレクトリの中にある）を選択してOpenボタンを押す。
1. 出てきた画面でOKボタンを押し、完了ボタンを押す。
    ※ここまでやると、下のような状態になる。
![スクリーンショット 2023-02-26 2.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113880/5c99522f-c195-abb5-e3ae-831056e3b801.png)
1. 追加したJREにチェックを入れたら、完了。
![スクリーンショット 2023-02-26 2.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113880/48252d68-a2cf-d49d-293d-b3981cfdd436.png)

## 2.Hallo Worldできない
1. メニューバー＞Eclipse＞設定をクリックする。
1. Java＞コンパイラーを選択する。
1. コンパイラー準拠レベルを11にする。
1. 適用して閉じるボタンを押す。
1. 出てきた画面（再ビルドするか）ではいボタンを押す。
1. 再度javaファイルを実行すると、Hello Worldが出力される。

# 最後に
素直に用意されているjava11を使えばよかった。
【Spring徹底入門】『Spring徹底入門』の14章チュートリアルの予約ロジック

# はじめに
Spring徹底入門の14章のチュートリアル（会議室を予約するシステム）の予約ロジック（Springの本質ではない）が理解できなくて時間を無駄にしてしまったので、同じ悩みをしてる方向けに。（多分、そんな人いない気がするし、ニッチすぎる）

# 予約ロジック
P.660からはじまる「会議室予約機能の実装」の既存の予約との重複チェックロジック、P.664のイメージ&コメントと実装でやってること違うんじゃないかと思ってず～～～～～～っと時間を無駄にした。
↓問題のコード
``` Reservation.java
@Entity
public class Reservation implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer reservationId;
	private LocalTime startTime;
	private LocalTime endTime;
	@ManyToOne
	@JoinColumns({ @JoinColumn(name = "reserved_date"), @JoinColumn(name = "room_id") })
	private ReservableRoom reservableRoom;
	@ManyToOne
	@JoinColumn(name = "user_id")
	private User user;

    // setter/getterは省略

    // 予約がかぶっているかどうかを判定するロジック
	public boolean overlap(Reservation target) {
        // 予約したい部屋と日付がかぶってなければOK
		if (!Objects.equals(reservableRoom.getReservableRoomId(), target.reservableRoom.getReservableRoomId())) {
			return false;
		}
        // 予約したい開始時刻と終了時刻が、既存の予約と一致したらNG
		if (startTime.equals(target.startTime) && endTime.equals(target.endTime)) {
			return true;
		}
        // ↓こいつがよくわからなかった↓
        // （原文）２つの予約の開始時刻と終了時刻が交差しているか、または包含関係にあるかどうかを返す
		return target.endTime.isAfter(startTime) && endTime.isAfter(target.startTime);
	}
}
```
`target.endTime.isAfter(startTime) && endTime.isAfter(target.startTime);`
の意図がずっと分からなくて時間を無駄にした。
絵を書いたら解決したので（せっかく書いたので）貼り付け。
ず～～～っとなんで&&なのかよくわからなかったので、左側が&&条件、右側が||条件のイラストです。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/3e9fb374-c9b2-88d1-400e-a1a6e8cca4c6.png)

↓よくわからなかったところ。
なんで&&なのか？→&&にしないと他の予約条件とかぶったかどうかの判定にならないから。

P.664のイメージ図のNGのイラスト２パターンを１つの条件式で表現していたわけですね、かしこい。
はあ、自分の頭が弱すぎる。
create-react-app(typescript)で作成したプロジェクトにて、画像を読み込めるように

解決に結構時間がかかったためメモ！

## 起こったこと

> フォルダ構成（一部省略）
  project/
　└ src/
　 　├ Hoge.tsx
　 　└ fuga.png

`create-react-app [project名] --template typescript`で作成したプロジェクト（フォルダ構成は上記）にて、画像が表示されない...
（コードは以下です。）

```react:Hoge.tsx
const Hoge = () => {
    return <div>
        <img src="./fuga.png" alt="" />{/* ← 表示されない... */}
    <div>
};
```

## 解決法

下記の手順で解決可能です！

1. 画像は`import`で読み込むようにする
1. 画像用の型定義ファイルを作成する。

### 1. 画像は`import`で読み込むようにする

読み込む画像ファイルをwebpackにバンドル対象として伝えるために本手順を踏む必要があるみたいです！

詳細（公式サイト）→https://create-react-app.dev/docs/adding-images-fonts-and-files/

```react:Hoge.tsx
// ↓ 画像をimportで読み込む
import fugaImage from './fuga.png';

const Hoge = () => {
    return <div>
        <img src={fugaImage} alt="" />{/*  */}
    <div>
};
```

ですが、これだけだとまだ下記のエラー（読み込んだモジュールの型定義が見つからないよ）が出てしまいます。
`TS2307: Cannot find module './fuga.png' or its corresponding type declarations.`
上記エラーを手順2で解決します！

### 2. 画像用の型定義ファイルを作成する。

`src`と同じ階層に`types`のフォルダ(型定義用)を作成し、
そこに下記の型定義ファイルを設置します。

```typescript:types/index.d.ts
declear module '*.png' { // pngファイルが対象
    const url: string;
    export default url; // importしたときにstringで読み込まれるよ
}
```
※フォルダ構成は下記のようになります。

> フォルダ構成（一部省略）
  project/
　├ src/
　│　├ Hoge.tsx
　│　└ fuga.png
　└ types/
　　　└ index.d.ts

すると`Hoge.tsx`が画像(`fugaImage`)をエラーなしで読み込めるようになります！

※間違いなどございましたら気兼ねなくおっしゃっていただければ幸いです！
JetpackCompose背景にグラデーションを設定する方法

今回は、JetpackComposeで背景にグラデーションを設定する方法です。
グラデーションを使用する機会があったので、メモです。


```Gradation.kt
@Composable
fun Gradation(
    modifier: Modifier = Modifier
) {
    Row(
        modifier = modifier
            .fillMaxSize()
            .background(
                brush = Brush.verticalGradient(
                    colors = listOf(
                        Color.White,
                        Color.Black
                    )
                )
            )
    )
    {
        //TODO 表示したいView
    }
}
```

`background`に`brush`を設定するとグラデーションを表示することができます。

![スクリーンショット 2023-02-26 12.33.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/296eede8-8985-7748-3631-fa6e2a9aee42.png)
AWSハンズオン_８_EC2の１_publicSubnetのEC2からprivateSubnetのEC2へアクセスして、MySqlDBの設定

AWSの初心者のさとしです
ハンズオンで勉強メモとして投稿いたします。
ご覧になったみんなさんにお役に立てればうれしいです
※：間違ったところがあれば、ご指摘していただければ幸いです
### 本文
本日はEC2で下記の２つの設定を操作する
###### １，EC2でApacheサーバーを設定する

###### ２，EC2でMySqlを設定する
本日のハンズオン内容は下図のように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/b0161e1f-c02a-6c25-206f-2ae7ed35782d.png)
それでは始まります

### 手順：
##### 1、vpc、サブネット及びEC2の起動設定などは下記の記事をご参考してください。
https://qiita.com/ShuSaToShi/items/a74c5dee46094cf2588d

##### 2、プライベートのec2でmysqlサーバーを構築する（ ※下記のteraTermでの操作は全部プライベート上でのEC2上で行うことを認識してください。）
###### （１）、MySQL8.0版のリポジトリをローカルに保存して、インストールの準備をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/632272e2-4fa5-7ad9-d17c-68312e5afa9d.png)
###### （２）、下記のcompleteがでたら、インストールの準備が完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/5f3d5187-310e-20ed-2bd6-3c5c646f72ab.png)
###### （３）、mysqlのコミュニティエディションをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/c81f08fa-1ce8-83c9-e343-c76541935fd9.png)
インストール中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/77c366c8-8d85-6544-1639-34b587ddb7e2.png)
completeがでたら、インストールが完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/6a8fcb61-9eaf-58b1-78fa-d46416a198d0.png)

###### （４）、mysqlサーバーを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/88349333-9f94-bdcb-d61c-6b45ac16fc97.png)
旨く行ったら、なにもでさずにOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/b3bd0f37-c0fd-3664-329c-4ca34277c828.png)
###### （５）、インスタンス起動とともにMySQLサーバーを自動的に起動するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/997f5263-0c08-a92e-6f38-922aca1012b1.png)

###### （６）、インストールしたMySQLのローカルホストからログインする際の初期パスワードを取得します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/02ba6bc4-e7f3-f750-800e-91ba1c804cf5.png)

###### （７）、 mysqlの「-u root」でrootユーザーにアクセスする指定して 「-p」でパスワードを利用するという指定して、パスワードを入力します。mysqlにアクセスします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/cf25e7f2-d6aa-9bb8-3559-4a012ce1f958.png)

###### （８）、ルートユーザーのパスワードを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/ab42c5bb-9fe2-3f55-fc02-51a20e4b779f.png)

###### （９）、myHandsOnというデータベースをMySQLサーバー内に作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/4e7b10b2-8d43-5c34-fd40-a82dbf7016d6.png)

###### （１０）、作成されたデータベースを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/c9a43aed-42f7-9cf3-23c0-d7556a2b3e67.png)

これで、パブリックサブネットのインスタンからプライベートへアクセスして、
プライベートでmysqlを作っていくということができました


###### ３，最後に、作ってたnatGatewayを削除忘れないでね、余計なお金がかかるため
初めてFlask使ってECみたいなサイトを作ってみた - 其ノ参

# tl;dr
* `session`を使うことでカート情報をcookieに保存しました
* 決済においては`session`に保存された`product_id`からstripe用のidをgetし、決済するように変更しました
* `dict`型でデータを保存させ、商品を複数カートに入れた際に個数で表記するようにしました

### Summary
`flask`でECサイトを作る回の第3回になります。とりあえず最終回です。前回は、`stripe`を導入することで決済ができるようになりました。今回は`flask-session`を導入し、カート追加した商品情報をcookieにて保存するようにしました。


### 関連投稿
https://qiita.com/ZawaP/items/23224e513e91a7ed443a


## Home work & 感想
* 実用予定の全くないサイトを作るのはモチベーションの観点からかなり辛かった
* 今後はできる限り、自分が作っていて意味のあると思えるものを作ることが大切だと感じた
骨格検出の方法まとめ

# はじめに
骨格検出をする方法にはいくつかあるらしい
参考↓

https://mocap.jp/about-mocap/

その方法を調べる機会があったのでまとめておく

# 骨格検出の方法
## Azure Kinect

https://azure.microsoft.com/ja-jp/products/kinect-dk

- Microsoft製。いろいろな機能があり、そのうちの1つに骨格検出の機能がある
- 骨格検出をするためには、商品を買ったうえで、Azure Kinect Body Tracking SDKというアプリを使う
- 値段が高い


## OpenPifPaf

https://openpifpaf.github.io/intro.html
- 2次元の画像から2次元の骨格座標を検出をする

## End-to-end Recovery of Human Shape and Pose

https://github.com/akanazawa/hmr

- 2次元の画像から3次元の骨格座標を検出する

## Kalidoface 3D
https://3d.kalidoface.com/
- Webアプリ
- システムに組み込みたいときには向いてなさそう

## ベースステーション&トラッカーを使う

https://mlkt.sakura.ne.jp/blog/2021/06/post-17441.html

- センサをつけて骨格検出をする方法
- デバイスを買わないといけないのがちょっと面倒
AWS初心者がAWS Certified Solutions Architect - Professional (SAP-C02)に受かった話

## 試験概要
#### [AWS Certified Solutions Architect - Professional (SAP-C02)とは](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)

>AWS プラットフォームでの分散アプリケーションとシステムの設計における高度な技術スキルおよび経験を認定
※公式ページ引用
- 問題数:75問
- 採点対象：65問
- 採点対象外の問題：10問
- 合格基準：750/1000
※試験範囲は下記公式ガイドを参照ください
[参考：公式試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-pro/AWS-Certified-Solutions-Architect-Professional_Exam-Guide.pdf)

## 受験経緯
業務で担当するサービスのシステムでさまざまなAWSリソースが使用されているのですが、
筆者が初心者すぎて？？？？だったので勉強を開始。
せっかく勉強するなら資格も取っちゃうかくらいのモチベーションで受験しました。

## 筆者のレベル
目安として学習開始時点の知識レベルと資格取得状況を記載します。

エンジニアなりたての頃（4年前ほど）にいくつかインフラ系の資格を取得しました。
とはいえ普段は開発者として働いており、業務でのインフラ構築経験はまったくなかったため、
サーバ、ネットワーク、AWSについては基本用語、基本概念がわかるくらいのレベルでスタートしました。

- 取得資格
[CCNA](https://www.cisco.com/c/ja_jp/training-events/training-certifications/certifications/associate/ccna.html)
[LPIC2](https://www.lpi.org/ja/our-certifications/lpic-2-overview)
[AWS Certified Solutions Architect - Associate（SAA）](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)

## 学習期間と結果
業務でふれた時間含め、学習期間は約2か月ほどになります（2022/12末～2023/02）。
平日：業務 + 平均60分ほど（ほぼ業務で使用したサービスの予習、復習、深堀）
土日：平均3時間ほど（参考書などの試験対策）

2023/02/25に受験し、809/1000で無事合格することができました。

## やったこと

#### 1. 実際にAWS環境を構築（3週間）
23年1月から業務でAWS環境構築を担当できることが決まったため、
その予習として年末年始+ αで実際にAWS環境を構築してみました。
業務ではTerraformを使用する予定だったので、筆者は下記書籍を参考に構築しました。

[実践Terraform　AWSにおけるシステム設計とベストプラクティス](https://amzn.asia/d/1YcZixO)

試験では実際の設定手順や細かいオプションについても問われるため、
筆者と同じく、AWSで環境構築経験はないけどチャレンジしたいという方は、
実際に構築してみることを強くおすすめします。

#### 2. 参考書をひたすらこなす（4週間）
AWS環境を構築してみた後はひたすら参考書を読みあさりました。
使用した参考書は下記の2冊です。
1. [AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説](https://amzn.asia/d/7AM39PM)
は問題になれる用

2. [AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル](https://amzn.asia/d/3E3RvYe)
は教科書、辞書

として使用しました。

普段使用する機会がないようなサービスも試験ではかなり取り上げられるため、
サービス概要だけでなく、設定手順やオプションも確認した方がよいです。
問題集で問われるポイントはつかめるため、筆者は問われそうなところを重点的に確認しました。

#### 問題を解く(1週間)
参考書で基礎体力をつけた後は、WEBの問題集を利用してとにかく数をこなしました。
使用したサイトは下記になります。
- tech stock
https://techstock.jp/
※問題数が多いため、期間に余裕をもって取り組むことを推奨します（74セクション × 7問）。

SAP（AWS Certified Solutions Architect - Professional）は1問あたりのボリュームが大きいため、
まともに解いて答え合わせして理解すると、1問あたり10分ほどかかります。
筆者は直前にこのサイトの存在を知ったため、2/23（祝日）、2/24（有給）をつぶして泣きそうになりながら取り組みました。

## 最後に
上記の流れで無事合格することができましたが、
試験当日は全く余裕がなく、解答に自信がもてない問題が多かったため、
チャレンジする方はもっと期間に余裕をもち、サービスをよく理解したうえで受験することをおすすめします。
【Ruby】RubyでCSVファイルのデータを登録する方法

## どんなときに使えるか
Rails consoleを使用して、production環境やstaging環境でcsvファイルのデータをDBに登録したいときに使える。

## csvファイルのデータを登録する方法 <実際のコード>

``` rb
DATA_PATH = "/data/tmp/"
FILE_NAME = "goriragorira.csv"

CSV.foreach("#{DATA_PATH}#{FILE_NAME}", headers: true, return_headers: false) do |row|
  begin
    ActiveRecord::Base.transaction do
      @gorira = Gorira.new(
        name: row['name'],
        gorira_seikaku_text: row['gorira_seikaku_text']
      )
      @gorira.save!
    end
  rescue Exception => error
    Rails.logger.error(error)
  end
end
```


haeders: true
これは、csvファイルの1行目がヘッダーとして認識されるため、データの登録はされない。要するに無視される。
Seeed Studio XIAO RP2040でFRAMを使う

# 経緯
不揮発メモリを具えた積算計などを作りたいが、フラッシュメモリは書き換え回数がいまいちなので、
富士通のFRAM [MB85RC04V](https://www.fujitsu.com/jp/group/fsm/products/feram/device/)を使ってXIAO RP2040で動作確認する。

# 回路
![xiao_mb85rc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/88185ac8-21e2-ef21-fab0-cd591be99049.jpeg)

![P_20230226_104814.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/0d37e51a-5be0-503f-0f8a-99dde5cb5b69.jpeg)

# プログラム
ボードは[非公式版](https://github.com/earlephilhower/arduino-pico)を利用。
FRAMを動かすライブラリ[FRAM_MB85RC_I2C](https://github.com/sosandroid/FRAM_MB85RC_I2C)のサンプルプログラムを利用。

```cpp:FRAM_I2C_simple_write_read.ino
#include <Wire.h>
#include <FRAM_MB85RC_I2C.h>

byte resultw, resultr; 
//dummy data used for the test
uint8_t writevalue = 0xBE;
uint8_t readvalue = 0xEF; // at the end, readvalue should be equal to writevalue

//random addresses to write from
uint16_t writeaddress = 0x025; // Beginning of the memory map

//Creating object for FRAM chip
FRAM_MB85RC_I2C mymemory;

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(100); //wait until Serial ready
  Serial.println("Starting...");

  Wire.setSDA(6);//Seeed XIAO RP2040
  Wire.setSCL(7);//Seeed XIAO RP2040
  Wire.begin();
  Serial.println("Wire begin.");

  mymemory.begin();

//--------------------------- First run, beginning of memory map ---------------------
  Serial.println("1st test");
  Serial.print("Writing at location 0x");
  Serial.println(writeaddress, HEX);
  
  Serial.println("Writing...");
  resultw = mymemory.writeByte(writeaddress, writevalue);
  Serial.println("Reading...");
  resultr = mymemory.readByte(writeaddress, &readvalue);
  
  Serial.print("Written value 0x");
  Serial.println(writevalue, HEX);
  
  Serial.print("Read value 0x");
  Serial.println(readvalue, HEX);
  
  if (writevalue == readvalue) {
    Serial.println("Write Byte test : OK");
  }
  else {
    Serial.println("Write Byte test : NOT OK");
  }
  Serial.println(".... ....");
  //------------------------- Device IDs -----------------------------------------------
  uint16_t id;
  resultr = mymemory.getOneDeviceID(1, &id);
  Serial.print("Manufacturer 0x");
  Serial.println(id, HEX);
  
  resultr = mymemory.getOneDeviceID(3, &id);
  Serial.print("DensityCode 0x");
  Serial.println(id, HEX);
  
  resultr = mymemory.getOneDeviceID(4, &id);
  Serial.print("Density ");
  Serial.println(id, DEC);
}
void loop() {
  // nothing to do
}
```

```text:結果
Starting...
Wire begin.
FRAM_MB85RC_I2C object created
I2C device address 0x50
WP pin number 13
Write protect management: true
Memory Chip initialized
FRAM Device IDs
Manufacturer 0xA
ProductID 0x10
Density code 0x0
Density 4K
Device identfied automatically
...... ...... ......
...... ...... ......
1st test
Writing at location 0x25
Writing...
Calculated address 0x50
Reading...
Calculated address 0x50
Written value 0xBE
Read value 0xBE
Write Byte test : OK
.... ....
Manufacturer 0xA
DensityCode 0x0
Density 4

```

# 余談
XIAO RP2040はUSBケーブルの接続が悪い事がある。
USB3.2Gen1以上だと上手く接続できるらしい。
USB2の場合、短いケーブルなら接続できる。
PHPで文章からバックスラッシュ（ \ ）を削除する

WordPressのある実装でHTML構造のテキストをPHPに送ることがあったので、その時に使用した小ネタメモ。
``` php
<?php
$str = "What\'s up?";
echo stripslashes($str); //出力 What's up?
?>
```
文字列をPHPに送る時に、バックシュラッシュ（ \ ）がつくことがありましたので、上記の関数を使用して対処しました。ちょっと調べましたが、PHPは文字化け防止のために、文章の一部に記号が入っている場合、その状況に応じて補完するみたいです。
#### 参考
https://wepicks.net/phpfunction-string-stripslashes/
Salesforce フローの選択オプションの改善(動的に選択肢をつくる)2

+ [Salesforce フローの選択オプションの改善(動的に選択肢をつくる)](https://qiita.com/Keiji_otsubo/items/328b1f5bdbe872fd2959)


# 実装したいこと

スクリーンフローの選択肢を動的に作成したい。
会計年度が2022年度 2022/04～2023/03の時は

```
2022/03
2022/04
2022/05
2022/06
2022/07
2022/08
2022/09
2022/10
2022/11
2022/12
2023/01
2023/02
2023/03
```

を表示します。

また2023年度 2023/04～2024/03の時は

```
2023/03
2023/04
2023/05
2023/06
2023/07
2023/08
2023/09
2023/10
2023/11
2023/12
2024/01
2024/02
2024/03
```
を表示します。

# 解決策　

独自の選択肢リストをつくるには　コレクション選択肢セットとレコードコレクション変数を使います。
ここが分かりませんでした、ずっとApexで定義されたコレクション変数を使おうとしていましたが、全くうまくいきません。

ここではレコードコレクション変数を使います。実際にはオブジェクトにレコードは保存しないので、使うオブジェクトはダミー扱いなので何を利用しても問題はないと思います。

まずは、04から03までの12個のレコードを作りたいと思います。これはテキスト型のコレクション変数を利用します。

このように追加していきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6885efae-814a-ee4e-ecdf-c40aeacb42ae.png)


また、この04なら今日の日付を確認して2023/01～2023/03の間であれば2022/04をセットする変数を作ります。
テキスト型のコレクションでループを回すのでこの数式ではこのループの変数を使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/84ced38b-9f3f-43b4-acdf-e26b86cf5ffc.png)


年度を求める数式

```
IF(AND( TODAY() >= DATE(YEAR(TODAY()),1,1) ,TODAY() <= DATE(YEAR(TODAY()),3,20) ),
IF({!textCollectionLoop} >= "04",TEXT(YEAR(TODAY())-1) + "/" + {!textCollectionLoop} ,TEXT(YEAR(TODAY())) + "/" + {!textCollectionLoop} ),
IF({!textCollectionLoop} >= "04",TEXT(YEAR(TODAY())) + "/" + {!textCollectionLoop} ,TEXT(YEAR(TODAY())+1) + "/" + {!textCollectionLoop} )
)
```

確実に並び順を保証するためにコレクション変数を並び替えます。そのための順番を計算する変数も作ります。
今回はこれらの月以外に２つほど文字の選択肢も追加したいので04月を03番目として計算します。
ここではオブジェクトのテキスト型のフィールドを使います。数値型では並び替えたときにエラーになります。


```
CASE({!textCollectionLoop},
"04","03",
"05","04",
"06","05",
"07","06",
"08","07",
"09","08",
"10","09",
"11","10",
"12","11",
"01","12",
"02","13",
"14")
```

レコードコレクション変数に追加する前にはオブジェクトの変数に値をセットします。
今回はループの中で使うので追加でなく次の文字と一致するを使います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/954531d7-57b9-aae7-a234-4aa3aa26d7e7.png)




# 参考資料

+ [フローのリソース: 選択肢で入力したテキストを取り出す方法](https://sfblog.markhammer.net/entry/2022/06/09/090000)
+ [完了ボタンをクリック後、当該生成されたレコードの画面を表示させたい。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jg8qDSAR)
+ [画面フローからレコードを作成した後、作成されたレコードの詳細画面へ自動で遷移させたい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdUZMSA3)
+ [Winter ’23 Sneak Preview – Flow Builder, Flow Orchestrator, Flow in Slack](https://unofficialsf.com/winter-23-sneak-preview-flow-builder-flow-orchestrator-flow-in-slack/)
+ [Tutorial: Flow Apex-Defined Data Types for Salesforce Admins](https://katiekodes.com/flow-apex-defined-data-types/)
作業指示品目オブジェクトのクイックアクションとして Lightning Web コンポーネントを追加する


+ [Lightning Web Component not visible on Dynamic Action](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgGAHSA3)

:::note
、LWC を作業指示書のクイック アクションとして追加することもできます。また、実際には Field Service Mobile Application でアクションを使用する必要があり、これに従って

https://help.salesforce.com/s/articleView?id=sf.mfs_overview_lwc.htm&type=5 あとは、lwc をクイック アクションとして追加するだけです。
:::
paiza.ioでelixir その193

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
文字コードで、印字せよ。

# サンプルコード

```
<<97 :: utf8>>
|> IO.puts

?a
|> IO.puts

b = 98
<<b :: utf8>>
|> IO.puts

use Bitwise
IO.puts <<?生 &&& ?死 :: utf8>>

use Bitwise

[life] = '生'
[dead] = '死'
IO.puts <<(life &&& dead)::utf8>>


```

# 実行結果

```
a
97
b
愛
愛
```

# 成果物

https://paiza.io/projects/dVn-jZjoE8b5ZK5OAdFeGQ


以上。
プログラミング初心者の状態から1年間実務経験を積んできて学んだこと

# はじめに
これはプログラミング初心者だった僕がものすごい幸運にめぐり合えて実務経験をすることができるようになった2022年の4月から1年間を通して学んだことをまとめた記事です。


# この記事の対象者
この記事は、

:::note
プログラミング初心者の方
:::

:::note
これからインターンに応募しようと思っている方
:::

などを対象にしています。

ただ、「これをするといいよ」みたいなことを言っているわけではなく、あくまで僕のこの1年間をまとめたものなので注意してください。
あと、ベンチャー企業で研究開発に携わっていたので、Web系のことはあまりやってません。

# 注意
仕事でやっていたことなので詳しく言えないところもありますが、できるだけ参考資料は貼っておきます！

実務経験1年目でまだまだ新参者ですが、この記事が誰かのお役に立てれば幸いです。

# 1年間を通して学んだこと
## 4月
- この月は研修期間みたいな感じで、プログラミングの基礎を教えてもらっていた。言語はPython。条件分岐、繰り返し、配列、関数、クラスを学んだ。面白い練習問題を解きながらプログラミングの基礎を身に付けていった。

## 5月
- GWに何かゲームを作るという課題が出された。最初はオセロを作りたかったが作り方がほとんど分からず断念。次にブロック崩しを作ろうとしたが時間が足りず、ボールが跳ね返る処理と棒を動かす処理しか作れなかった。期限までに1つのものを完成させることの難しさを実感した。
- csvファイルを初めて知り、ファイル操作の方法を学んだ。加速度のデータをcsvファイルに出力することができるようになった。
- Arduinoと加速度センサを初めて触った。
- 学んだことを活かし、大学の実験で使うプログラムを作った。PythonのライブラリのNumpy、Matplotlib、Pandasについて知り、データの可視化の方法などを学んだ。

## 6月
- Processingを初めて使ってみた。Processingを使って加速度センサから取得したデータの描画をした。
- ここらへんからシステム開発にちょっとずつ関わるようになり、GitとGithubを初めて知った。使い方に慣れるために大学の課題のプログラムをGithubにあげてみるということをした。
- MediaPipeという人間の骨格を検出するPythonのライブラリについて知った。PythonのOpenCVというライブラリに関して、骨格の各点の間を線でつなぐということをした。初めて他の人と一緒に開発をした。関数の使い方を知り、変数名の重要さを学んだ。ここで、大学の授業で少し触れていたこともあってか、画像処理に興味を持ち始める。

## 7月
- Arduino、加速度センサを使って加速度データの取得ができるようになった。初めて自分1人で調べながら電子工作をした。
- 画像処理の使い方を学ぶために、当時ハマっていたSplatoon2に関係するようなプログラムを作れないか検討していた。

## 8, 9月
- 骨格検出の方法をいろいろ調べた。AzureKinectを使うという方法を知り、実際にそれを触る。Azure Kienct Body Tracking SDKというものを使って体のトラッキングをして遊ぶ。
- 実験を全部自動でしたかったのでプログラムを書いていたが、すべてを自動化しようとしすぎてうまくいかなかった。TkinterというPythonのライブラリを使ったGUIの作成方法を学んだ。
- Splatoon2に関するプログラムを書いた。ここでクラスの使い方をほぼマスターした。初めて自分で0から考え1つのものを作り上げるという経験をしてとても自信がつき、「プログラミングができるようになったな」と思えるようになった。またgit-flowについて知った。

## 10月
- STUDIOというサービスを始めて使った。ここからWebに関する興味を持ち始めた。
- 個人的に、PythonのライブラリのFlaskやDjangoについて勉強した。インターネットに関することだったので、今まで勉強してきたプログラミングとは何か違うなと感じた。
- ここで初めてLancersというフリーランスのマッチングサイトみたいなもので案件を獲得した。仮想通貨に関するプログラムを作った。

## 11月
- 展示会用に電子工作をしたり、宣伝用Webページを作ったりした。

https://vr-ten-osaka.studio.site/

- 深層学習のコンペみたいなものがあると知り、深層学習について学んだ。
- 会社のホームページ制作の手伝いをし始めた。初めて知るものが多く、周りについていくのでいっぱいいっぱいだった。Dockerについて初めて知ったり、JavaScriptを初めて触ったりした。

## 12月
- 初めて展示会に手伝いで参加した。作ったものを誰か他の人に見てもらうことは難しいんだなと感じた一方で、誰かと協力して作品を作ることは楽しいしやりがいになるなとも思えたいい経験になった。

https://news.yahoo.co.jp/articles/8344aa41fed945be6494c458ad9d0d2c96e4306f



## 1月
- Github Actionsを初めて知った。それを使った自動化システムを作った。
- 会社のホームページ制作を手伝った。だいぶインターネットに関する知識がついてきて周りに追いつけるようになってきたなと感じた。

## 2月
- データ解析プログラムを作った。フーリエ変換や線形補間などのデータの分析のために必要なことを学んだ。
- 1年間の振り返りをした。

## 3月
- 実験のレポートを書いた。かなり大変だった。プログラムを作るときには先に設計書を軽くでもいいから書いとくべきだった。あと先行研究を先にしっかり決めて方針を立ててから実験するべきだった。いろいろプログラムを変えまくってると頭がこんがらがっていくし、後から参考になりそうな先行研究を見つけて、「先に調べとけばこんなに時間かからなかったのに。。」と思った。

# まとめ
この1年間でエンジニアとしてこれから生活していく第一歩が踏み出せたんじゃないかなと個人的には思っています。
エンジニアとして自立、とまではいかないかもしれませんが、少なくとも自分で勉強していく力はつきました。
また、まだまだ経験が浅く、分からないことがたくさんあるのは当たり前なので、何が分からないのか？ということを細分化して考え、それをひとつひとつ調べていくという作業ができるようになりました。
これからプログラミングを勉強する人やインターンに行く人も、これができるようになれば大きく成長できると個人的には思います。
僕も次の1年、楽しみながら勉強して、できることをどんどん増やしていきます！

最後まで読んでいただき、ありがとうございました！
GoReleaser で指定のターゲットのみを対象にアーティファクトを作成したい

## `goreleaser release` コマンドに `--single-target` フラグが存在しない

GoReleaser の `build` サブコマンドには `--single-target` フラグがあり、設定ファイルで複数の GOOS、GOARCH をターゲットとしていた場合でも特定のターゲットのみを対象にビルドを実行できます。しかし、`release` サブコマンドにはその機能がありません。CI ジョブでアーティファクトの作成が成功するかをテストしようとすると、GoReleaser の設定ファイルに指定した GOOS と GOARCH のすべての組み合わせでアーティファクトが作成されるため、CI ジョブの実行時間が長くなる問題があります。正しくアーティファクトが作成できるかを確認するだけであれば、全てを対象とせずに特定のターゲットのみの実行で十分です。

## goreleaser-filter ツールを使う

GoReleaser は v1.15.2 時点で将来的に指定したターゲットのアーティファクトを作成する機能を追加する予定があるようですが、Pro 版のみに提供予定のようです。

- [Support \-\-single\-target with release · Issue \#3219 · goreleaser/goreleaser](https://github.com/goreleaser/goreleaser/issues/3219)

そこで、イシューコメントで提案のある goreleaser-filter ツールを使います。このツールは `.goreleaser.yaml` ファイル（GoReleaser の設定ファイル）を標準入力経由で渡すと指定した GOOS と GOARCH のみをターゲットとするように書き換えた設定ファイルを出力してくれるシンプルなツールです。

- https://github.com/t0yv0/goreleaser-filter

例えばローカル環境の GOOS と GOARCH のみをターゲットとしてアーティファクトを作成したい場合は次のようにします。

```
cat .goreleaser.yml | \
    go run github.com/t0yv0/goreleaser-filter@v0.3.0 -goos "$(go env GOOS)" -goarch "$(go env GOARCH)" | \
    goreleaser release -f - --skip-validate --rm-dist --snapshot
```

べんり。
自然言語処理(NLP)/チャットボットとは

# 自然言語処理(NLP)とは

自然言語処理(Natural Language Processing)。
人間が使用している自然言語(言葉)をコンピュータで処理・分析する技術こと。

実用例
・Siri
・Alexa
・検索エンジン
・チャットボット
・機械翻訳
・予測変換
・音声対話
・スパムフィルタ

## 自然言語処理の技術
・形態素解析
&emsp;文書を単語に分割

・word2vec
&emsp;単語をベクトル化

・リカレントニューラルネットワーク
&emsp;時系列を扱うニューラルネットワーク

・seq2seq
&emsp;RNNをベースに文書を生成するモデル

# チャットボットとは

自動で会話するプログラム。
1960年ジョセフ・ワイゼンバウムが作成したELIZAが起源。

自動会話のアプローチ
・ルール型
&emsp;人工無能。プログラム通りに返答を作成。
・機械学習方
&emsp;人工知能が会話のパターンを学習。
&emsp;ルール型よりも自然。

チャットボットの用途
・カスタマーサポート
・音声アシスタント
・コミュニケーション
・検索サポート

### 開発の流れ
・大量の対話文コーパスを用意
・ニューラルネットワークを構築
・ニューラルネットワークに対話文コーパスを学習させる
・学習済ニューラルネットワークを使用し、チャットボットのシステム構築
Julia でベクトル化プログラミングは有効か?

モンテカルロ法による円周率を求めるプログラムは，練習問題として言語を問わずよく取り上げられる。

言語によっては以下のようなプログラムを「まずいプログラム」とみなす場合があるが，Julia の場合は，実行効率が非常に高い。



```Julia
function estimate_pi(n::Int)
    count = 0
    for i = 1:n
        x, y = rand(), rand()
        if x^2 + y^2 <= 1
            count += 1
        end
    end
    return 4 * count / n
end
```




    estimate_pi (generic function with 1 method)




```Julia
@time pi_est = estimate_pi(100000000)
println("Estimated pi: ", pi_est)
```

      0.254032 seconds (1 allocation: 16 bytes)
    Estimated pi: 3.14138308


実行所要時間は平均的に 0.25 秒ほどである。

プログラマによっては以下のようにベクトル化するのを好む場合がある。しかし，Julia では上のプログラムに比べて，遅い!！


```Julia
function estimate_pi2(n::Int)
    xs, ys = rand(n), rand(n)
    count0 = count(xs.^2 + ys.^2 .<= 1)
    return 4 * count0 / n
end
```




    estimate_pi2 (generic function with 1 method)




```Julia
@time pi_est = estimate_pi2(100000000)
println("Estimated pi: ", pi_est)
```

      0.666811 seconds (15 allocations: 3.737 GiB, 6.35% gc time)
    Estimated pi: 3.14170676


実行所要時間はばらつきがあるがたいていは 1.6 秒ほどである。ときどき 0.6 秒ほどのときもあるが，そういうのは少ない。

ちなみに，ベクトル化といえば R の十八番であるが，R でも 1.4 秒台である。


```R
system.time({n = 100000000;print(mean(runif(n)^2+runif(n)^2 < 1)*4)})
```

    [1] 3.141476



       ユーザ   システム       経過  
         1.441      0.166      1.606 


考察するに，Julia の場合，ベクトル化を意識して書かれたプログラムは面倒くさい処理をするために複雑なコードを生成しているが，for ループで単純に書かれたプログラムは簡潔なコードを生成しているのであろうか。

一概にはいえないだろうが，まずは単純なプログラムを書いて，効果を見ながらブラッシュアップしていくというのがよい戦略ではないだろうか。
ChatGPTにラーメン作らせてみた

![日立.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5760/b791c4cc-53e2-9d75-c893-8e1067d9a311.png)
｢AIに仕事を奪われる!｣と人間界で話題の[ChatGPT](https://chat.openai.com/chat)。
そんな彼にラーメンを作ってもらいました。

ターゲットとするお客様は以下の6名を想定。
いずれも今のIT業界を牽引する企業にお勤めのVIPなお客様です。

それではいってみましょう!
(各企業様のお名前につきましては、誠に恐縮ですが敬称略で失礼いたします)

# オーダー(プロンプト)
あなたはラーメン店主で、自分の信念は絶対に曲げない、超頑固オヤジです。
世界ラーメン選手権でも優勝経験があり、独創的なラーメンはお客さんを驚かせてきました。
自分の店を持って30年、今日も色々なところに勤めている常連のお客さんがやってきます。以下の6人のお客さんです。
どんなラーメンを作るか、そのラーメンの商品名と作り方を詳しく教えてください。つけ麺も提供しています。
1. Microsoft Azureの担当者
2. AWSの担当者
3. NECの担当者
4. 日立製作所の担当者
5. シスコシステムズの担当者
6. IBMの担当者

# メニュー(出力)
こんにちは、私はあなたの信念を曲げない、超頑固オヤジのラーメン店主、ChatGPTです。世界ラーメン選手権で優勝した経験があるので、自信を持って独創的なラーメンを提供します。つけ麺もご用意していますので、ぜひお召し上がりください。

今回、お越しいただいた6人のお客さんは、Microsoft Azure、AWS、NEC、日立製作所、シスコシステムズ、そしてIBMの担当者ですね。彼らに合わせて、それぞれの会社の技術に関する知識を取り入れたラーメンをご提供いたします。

* Microsoft Azureの担当者
商品名：Azure濃厚豚骨ラーメン
作り方：豚骨ベースのスープに、Azureのアイデンティティとアクセス管理を担当するAzure Active Directoryのアイデンティティを象徴するコンソメを加え、濃厚な味わいに仕上げます。チャーシューには、Azureのクラウドサービスによる拡張性をイメージしたローストビーフを使用し、クラウドの持つ高い拡張性を表現します。また、トッピングにはAzureのアイデンティティ保護機能であるAzure Active Directory Identity Protectionからインスパイアされた、色鮮やかな酸辣湯を加え、スパイシーで鮮やかな味わいを楽しんでいただけます。

* AWSの担当者
商品名：AWSクラウド拡張ラーメン
作り方：スープには鶏ガラと昆布をベースに、AWSが提供するクラウドの拡張性をイメージした柚子胡椒と山椒を加え、爽やかな風味を加えます。麺は、AWSのサービスが提供する高速ネットワークにインスパイアされた細麺を使用し、麺の引き締まり感を表現します。トッピングには、AWSが提供するAIサービスのRekognitionによって認識される画像をモチーフにした、鶏肉のスライスを散りばめ、AWSの高度な技術を表現します。

* NECの担当者
商品名：NEC超高速ラーメン
作り方：魚介ベースのスープに、NECが提供する超高速データ処理技術をイメージした超濃厚な味わいを加えます。麺は、NECが提供する高速通信技術を表現した平打ちの太麺を使用し、食感も楽しめます。トッピングには、NECが開発したAI技術をイメージした炙りチャーシューを加え、NECの高度な技術力を表現します。

* 日立製作所の担当者
商品名：日立製作所のIoTラーメン
作り方：スープには、鶏ガラと豚骨をベースに、日立製作所が提供するIoT技術を表現したカレー風味を加え、独特の味わいを楽しめます。麺は、日立製作所の製品である超硬素材を使用した麺で、弾力のある食感を楽しめます。トッピングには、日立製作所のIoT技術が応用された、高精度な切り込みを持つ肉厚のチャーシューを加え、技術力を表現します。

* シスコシステムズの担当者
商品名：シスコシステムズのネットワークラーメン
作り方：スープには、豚骨ベースに、シスコシステムズが提供するネットワーク技術をイメージした青唐辛子を加え、辛さと深い味わいを楽しめます。麺は、シスコシステムズが提供するネットワークセキュリティ技術をイメージした黒い麺を使用し、セキュリティと安心感を表現します。トッピングには、シスコシステムズが提供するIoTセンサーによってモニタリングされる動物の健康状態をイメージした、健康的な野菜を加え、安全で健康的な食品へのこだわりを表現します。

* IBMの担当者
商品名：IBMのAIラーメン
作り方：魚介ベースのスープに、IBMが提供するAI技術をイメージしたトリュフ風味を加え、深みのある味わいを楽しめます。麺は、IBMが提供するクラウドサービスをイメージした極細麺を使用し、軽い食感を楽しめます。トッピングには、IBMが提供するWatsonによる自然言語処理技術をイメージした、煮玉子を加え、味わい深さと新しいテクノロジーへのアプローチを表現します。

* つけ麺：
全てのお客さんに提供するつけ麺は、自家製のつけ麺としょうゆダレを使用し、濃厚な味わいを楽しめるようにします。トッピングには、自家製の炙りチャーシューとメンマを加え、肉厚でしっかりとした味わいと食感を表現します。

以上が、私の店で提供するラーメンのメニューになります。それぞれのお客さんの会社や製品に合わせた特徴的な味わいやトッピングを提供することで、お客さんには楽しい驚きを与えられることを目指します。

(原文ママ)

# 結論
つけ麺以外を夢見て。
あなたはどのラーメンが食べたいですか?
HTMLで空白を省略させない方法

## 結論
検索すると色々なやり方が出てきますが、個人的にはCSSの`white-space`プロパティを`pre-wrap`に設定する方法が一番しっくりきました。

```css
span {
  white-space: pre-wrap;
}
```

---

### 発生状況
画面幅が狭いときに文章を画面幅ギリギリで改行するのではなく、`<span>`タグで囲った部分で優先的に改行してほしい。

```html
<div>
  <span>Please start a new line here </span><span>if the screen width is narrow.</span>
</div>
```

そこで、CSSは次のように設定した。

```css
span {
  display: inline-block;
}
```

しかし、プレビューの仕切りをスライドするとわかるように、画面幅が狭いときには意図した表示となっているが、画面幅が広く一行で表示される際に1つ目の`<span>`タグの最後に含めた空白スペースがHTMLの仕様により無視されてしまった[^1]。

[^1]: > 連続したホワイトスペースは多くの場合、1 文字の空白にまとめられます（[Whitespace (ホワイトスペース) | MDN](https://developer.mozilla.org/ja/docs/Glossary/Whitespace#html_%E3%81%A7%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)より引用）

https://codesandbox.io/embed/sweet-kirch-25owl8?fontsize=14&hidenavigation=1&theme=dark&view=preview

### 対処
そこで、`<span>`タグの[`white-space`](https://developer.mozilla.org/ja/docs/Web/CSS/white-space)プロパティを`pre-wrap`とすることで、空白スペースをそのまま表示できるようにした。

```diff_css
  span {
    display: inline-block;
+   white-space: pre-wrap;
  }
```

https://codesandbox.io/embed/nervous-shtern-yod8wy?fontsize=14&hidenavigation=1&theme=dark&view=preview
ソフトウェアテストの技法　メモ

## 3つのテスト原則
1. テストとは、エラーを見つけようとしながら、プログラムを実行する過程である。
2. 良いテストケースとは、まだ発見されていないエラーを検出する確率の高いものである。
3. 成功したテストケースとは、まだ発見されていないエラーを検出したものである、

## テストケース-ブラックボックス
### 適切なテストケースとは
1. あらかじめ定めてあるテストケース数を2以上減少できること
2. 特定の入力値を設定後、それ以外にエラーがないのか示すようなもの。

### 同値分割
特定のクラスを代表的な値でテストすることで、他の値でそのクラスをテストした場合でも同じ結果が得られると考えられる。そのため、テストケース数を減少できる。
また、エラーが発見されない場合、その他の値でもエラーが発見されないと示すことが可能。
例) 条件：配列の長さ　有効同値：1-7 無効同値0, > 7

### 限界値分析
1.同値クラスのそれぞれの端がテスト対象となる。
2. 入力条件だけでなく、出力条件を考慮することでテストケースは得られる。
例) 入力範囲が1-255であれば、その入力条件は0,1,255,256になる
  　出力範囲が4件まであれば、出力条件は0,1,4件となる。またプログラムが誤って5件出力するようなテストケースを作成する

### 原因-結果グラフ
論理積と排他的論理和の考えを用いてつくられる論理図みたいなもの。、
例)「テキストボックスに全角でAまたはBを設定した場合、データが更新」
この場合、原因がテキストボックスに全角でAまたはB。　結果がデータ更新となる。

### エラー推測
経験ベースで行うテストにちかい。
テスト担当者の経験や知識に基づき、テスト対象に発生しうるエラーを推測し、そのエラーを引き起こす欠陥を検出するテストケースを作成し、テストする方法

## システムテスト
システムテストとは、システムまたはプログラムをもとの目的仕様書を比較し、期待通りではない部分を見つける工程。
例）目的仕様書と異なるメッセージが出力されていないか、入力するのに十分な冗長性があるか、入力に対して即座にレスポンスしているか、プログラムは使いやすいか等。

###　完了基準
テストケースが原因-結果グラフ、限界値分析、エラー推測から得られていて、そのテストケースがすべて最後に不成功になる。
この場合の不成功は、バグが見つからないということを意味する。

## インターネット・アプリケーションのテスト
1. 外見部分のチェック
例)文字がどのブラウザでも同じか、解像度を変更しても異常はないか、初期画面はデフォルトの値が設定されているか等

2. ビジネス層
例）計算が正しく行われているか、トランザクションが正常に完了するか、失敗したトランザクションが正しく元の状態に戻されるか、データが正しく収集されているか、

3. データ層
データが正しく、かつ正確に保存されているか等

## 参照資料・サイト
ソフトウェア・テストの技法
https://www.veriserve.co.jp/gihoz/commentary/
単語を入力するだけでAIで広告ポスターが簡単に作れる！！　画像生成AIサービス Memeplexの威力

# デザイナーの仕事をAIがやってくれる？

テキストを入力するだけで商品ポスターができたらすごくないですか？
MemeplexというWebサイトで簡単に画像生成ができるので、それを使ってやってみます。

# アイスクリームのポスターを作ってみる

まずMemeplexのサイトにアクセス。

https://memeplex.app/

あとは、生成したい単語を入れるだけです。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e190a22e-c5c4-7c44-85f8-dd3b7216f22b.png width=600>

それだけで画像が出てきます。
乱数から生成されるので、ほぼ無限のバリエーションの画像が出ます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/91cc5d39-4c66-4520-f985-e2f695664007.jpeg width=300>  <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6cd0b8ee-e82d-c0ce-3f80-0b3bbfe6a3d6.jpeg width=300>

え、すごくないですか？
ちょっとした文化祭のポスターならそのまま使えそうだし、これをプリントアウトすれば包装紙としても使えそうです。

Memeplexにはいろんな設定ができ、画風や下絵を設定できます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/26d71d1b-6374-ac97-0595-5e909189a63e.png width=400>

キャラクター風
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3ccf809b-a8b0-cf17-feaa-a9b4b65559dd.jpeg width=300>

映画ポスター風
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/4c69ff34-b319-ac28-1cc8-a8eb3f11a8ed.jpeg width=300>

ミュシャ風
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fa4d4b36-a73e-e316-3b31-4096562f8bfb.jpeg width=300> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ad9e5d49-5afc-5b49-12d3-1fb7d82368c3.jpeg width=300>

アニメ風
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6e74780b-6377-8eed-aef0-07fc35710f81.jpeg width=300>

使い方に慣れればもっとハイクオリティな画像が生成できると思います。

さすが清水亮さん。。。ゲンロンでのUber*ats話めちゃくちゃ笑いました。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
mrubyでcgi

自宅ではWin7やMBA Original,Win10などのPCを使っているのですが、Win7で開いているページのURLをMBAでも開くために受け渡したいとか思うことがありました。

![memo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3f7e50f3-97c1-a883-0842-6e77026fa668.png)

いろいろ思案して、おうちモニターで使ってるhttpdでメモを保存する機能を作る事にしました。

formはこんな感じ

```html
<html><head>
<meta http-equiv=content-type content="text/html; charset=UTF-8">
<style>textarea{width:100%;height:200px;transition-duration:0.5s;}</style>
</head>
<body>
<form method="post" action="cgi/memo.cgi">

<textarea name="comment"></textarea><br>
<input type="submit" value="submit">
</form>
</body>
</html>
```

mrubyのcgiはこんな感じ

```ruby
#!/usr/local/bin/mruby

print "Content-type: text/html\n\n"

if ENV['REQUEST_METHOD'] == "POST" then
  file = File.new('/root/htdocs/memo.txt', 'w')
  while line = STDIN.gets
    line.chomp!
    pos = line.index('=') + 1
    len = line.length
    file.write(HTTP::URL::decode(line[pos, len - pos]))
  end
  file.close
  print "<html><body>Set Success</body></html>"
else
  print "<html><body>Error</body></html>"
end
```
memo.txtに内容が保存されます。

URLエンコードをデコードするためにmruby-httpを使っています。

mini_httpdを使っているのですがPOSTが正常に動かなかったので、patchを当ててます。

mruby 3.2がちょうどリリースされていたのでアップデートしました。

なにか適当なインターネットのサービス使えばいいじゃんと言われそうですが、そのサービスにたどり着くまでよりIPアドレス入れるだけの方が簡単です。
rex0220 計算式プラグイン テーブルソート（旧）

rex0220 計算式プラグインで、テーブルソートを行ってみます。

# 概要

* TABLE_SORT 関数でテーブル行削除ができますので、今後はTABLE_SORT 関数をお使いください
* [rex0220 計算式プラグイン テーブルソート TABLE_SORT関数版](https://qiita.com/rex0220/items/9c79f548200a09e6e61d)

テーブルの数値・区分で、ソートします。
※テーブル内にルックアップ項目・ファイル項目を設定できません。

![2023-02-26_10h06_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2c6699c2-c741-1b6b-4108-31a26ecdb292.png)

# 操作例

![2023-02-26_10h04_26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/90682cff-4c7a-8767-c8f8-471bdb121c17.gif)

# プラグイン設定

- 「循環参照を許可」をチェック
- テーブル：　TLTABLE 関数でソートします。
- 番号：　テーブル行を区別するために、テーブル内番号を設定します。

~~~.js
// 合計
SUM(数値)
// テーブル
TLTABLE(テーブル,
TPKEY(番号,区分),
TPVAL(数値),
TPSORT(数値,区分),
TPOUT(番号,区分,数値))
// 番号
ROWNO(テーブル)+1
~~~

![2023-02-26_10h10_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a250458b-a478-7fcf-4af7-dff11a1e8648.png)
新規ファイルが到着した際にDatabricksジョブを起動する

[Trigger jobs when new files arrive \| Databricks on AWS](https://docs.databricks.com/workflows/jobs/file-arrival-triggers.html) [2023/2/22時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

Amazon S3やAzureストレージのような[外部ロケーション](https://qiita.com/taka_yayoi/items/18fee92365eee58e0b94)に新規ファイルが到着した際に、Databricksジョブを起動するために*ファイル到着トリガー*を活用することができます。新規データが非定期のスケジュールで到着するため、スケジュールジョブが非効率的である場合にこの機能を活用することができます。

ファイル到着トリガーは毎分新規ファイルをチェックし、ストレージロケーションのファイル一覧に関連するクラウドプロバイダーのコスト以外の追加コストは発生しません。

:::note
**注意**
ファイル到着トリガーは最大10,000ファイルまでを格納する外部ロケーションでのみ動作します。これ以上のファイルを持つ外部ロケーションでは新規ファイル到着はモニタリングされません。
:::

# 要件

ファイル到着トリガーを使用するには以下の要件が必要です。

- ワークスペースではUnity Catalogが有効化されている必要があります。
- Unity Catalogメタストアに追加されている外部ロケーションを使用する必要があります。[Unity Catalogにおける外部ロケーションとストレージ資格情報の管理](https://qiita.com/taka_yayoi/items/18fee92365eee58e0b94)をご覧ください。
- 外部ロケーションに対する`READ`権限、ジョブに対する`CAN MANAGE`権限が必要です。ジョブの権限の詳細については[Jobs access control](https://docs.databricks.com/security/access-control/jobs-acl.html)をご覧ください。

# ファイル到着トリガーの追加

ファイル到着トリガーを追加するには:

1. サイドバーの![](https://docs.databricks.com/_images/jobs-icon.png)**Workflows**をクリックします。
1. **Name**カラムでジョブ名をクリックします。
1. 右側の**Job details**パネルで**Add trigger**をクリックします。
1. **Trigger type**で、**File arrival**を選択します。
1. **Storage location**で、監視する外部ロケーションあるいは外部ロケーションのサブディレクトリのURLを入力します。
1. (オプション)高度なオプションを設定します:
    - **Minimum time between triggers in seconds:** 前回のジョブ実行が完了した際に起動を待つ最小時間です。この期間に到着したファイルは、待ち時間が過ぎた後にのみジョブ実行を起動します。ジョブ実行の作成頻度を制御するためにこの設定を使用します。
    - **Wait after last change in seconds:** ファイル到着後にジョブ実行を起動する際の待ち時間です。この期間に別のファイルが到着するとタイマーがリセットされます。バッチでファイルが到着し、すべてのファイルが到着した後にバッチ全体を処理する必要がある際にこの設定を使用することができます。
1. 設定を検証するために、**Test connection**をクリックします。
1. **Save**をクリックします。

# ファイル到着トリガー失敗時の通知を受け取る

ファイル到着トリガーの検証に失敗した際に通知を受け取るには、ジョブ失敗時のメール通知、システム通知を設定します。[Notifications](https://docs.databricks.com/workflows/jobs/jobs.html#alerts-job)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
草莽Erlang ── 41. lists:append

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## lists:append/1

```erlang
append([[term]]) -> [term]
append(リストのリスト) -> 連結されたリスト
```

[lists:append/1](https://www.erlang.org/doc/man/lists.html#append-1)は、リストのリストを連結して、新しいリストを生成します。

```erlang
> lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
[1,2,3,a,b,4,5,6]

> lists:append([[1, 2, 3]]).
[1,2,3]

> lists:append([]).
[]
```

[listsモジュール](https://www.erlang.org/doc/man/lists.html)には他にもリスト処理のための関数がたくさんあります。

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
PHP：const：定数：「定数は右辺に式を書けない」と教わる。単なる暗記で済ませるとちょっと違う。その理由の想像と代替策の例。

# 以前、「定数は右辺に式を書けない」と聞かされた

constで書く定数。大文字で書く決まりになっているお馴染みの。
「定数は右辺に式を書けない」と以前教わったことがある。
単なる暗記は定着しづらいからなるべく避けたい。

# なぜか？と想像する

教師であろうが書籍や教材であろうが、このような時に得てして「書けないのだ」と書かれてあるだけにとどまることがある。
しかしなぜか？と想像すれば単なる辛い暗記ではなく容易く記憶できることも中にはある。

だから、心の中で思うようにする。
「◯◯は■■ができない」
「そうか。ほとんどの場合、そうしたくない理由があるのだから、この場合のしたくない理由は何だろうか」
すると、教えられるものの中には、キャッチーな場合がある。


# この場合はちょっぴりキャッチー？

定数の場合はおそらく、式には変数がつきもので変数は値が変えられてしまい、定数である意味がなくなるからと想像できるし、納得できる。
そこでふと思う。
ならば、式に変数がなければ書けそう。数字を扱う場合であっても、型によって値が変わるとしても、それはあくまでも定数へ代入するだけだから、定数自体が変化するわけではない。

試してみると、変数がないと

```php
const TEST1 = 5 * 7;
echo TEST1 . PHP_EOL;
```
やはりエラーにならない。

ならば、変数を入れると

```php
$hensuu = 5;
const TEST2 = $hensuu * 7;
echo TEST2 . PHP_EOL;
```

エラーになる。

> Fatal error: Constant expression contains invalid operations

暗記しなくて済んだもの。
また、変数がなければ書けるから、「式は書けない」はちょっぴりキャッチーと思いきや、変数がない式ではほとんど意味がなさそうだから、結局はキャッチーでもなくうまく言い表しているものだな、と思ったもの。


# 定数は変更できたらいけないから、たとえば以下みたいになる

```php
const ITEMS = ['item1', 'item2', 'item3'];
define('ITEM_POINT', (function () {
    $itemPoints = [];
    foreach (ITEMS as $index => $item) {
        $itemPoints[$item] = $index;
    }
    return $itemPoints;
}) ());
```
curlコマンド入門

APIレスポンスを確認する作業でよく使用されるcurlコマンド。

# GET リクエスト

ターミナル等で以下のようにGETリクエストを送ることができます。
```
curl http://localhost:3000/hoge | jq
```

レスポンスは例えばこんな感じで返ってきます。
今回はjsonが返ってきています。
```
{
  "name": "hoge",
  "text": "hello world"
}
```

# POST リクエスト
POSTは用途によって様々なオプションをつけるので複雑になります。
こちらはJSONデータをPOSTしているサンプルになります。

```
curl -X POST -H "Content-Type: application/json" -d '{"name": "hoge","text": "hello world"}' http://localhost:3000/hoge
 | jq
```
基本的なオプションの説明をします。
POSTリクストを送るには以下のオプションを付与します。
```
-X POST
```

-d または --data オプションを付与することで、POSTで送信するデータを指定します。
```
-d '{"name": "hoge","text": "hello world"}'
```
## JSON形式

また、今回のようにJSONを送信する場合はオプションでリクエストヘッダを明示します。
```
-H "Content-Type: application/json"
```
SQLを少しだけ学んでみた!! ~ SQLとは ~

# はじめに
- 業務上、クエリを使う機会がありますが、自分の欲しい情報が取れるクエリが見つからない……
- 非エンジニアの自分でも学べばSQLを使えるようになるのでは?という想いから少しずつ勉強した事を備忘録も目的で書いております。
- 間違った事を書いてるかもなので、もしあれば指摘いただければ幸いです。



# この記事の目的
- SQL、クエリとは何かがざっくり分かる
- 一番簡単なSQLが読めるようになる


# SQLって何?
- データベースを操作する為の言語

# データベースって何?
- 3つの要素がある
    - 表=テーブル
    - カラム=列
    - レコード=行

# クエリって何?
- データベースに対して指示すること
    - データベースはSQL（言語）で書かれている
        - SQLはデータベースとのコミュニケーション手段

# クエリは以下の要素で構成されている
- ①SELECT：この列（項目）を取り出す
- ②FROM：この表（テーブル）から
- ③WHERE：この条件で
- ④;　で終わる

# 実際に例題を使ってイメージしてみよう
### 例題①：今まで行った餃子の王将の情報が知りたい。まずは、全部のデータを見よう。
```
SELECT *(全部)
FROM Gyoza no Ohsho（王将の情報）
;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/f3110c7a-af68-1bbf-c763-1f825b6ffd3c.png)

### 例題②：名古屋の店舗だけ出したい場合
```
SELECT *(全部)
FROM Gyoza no Ohsho（王将の情報）
WHERE NAGOYA（名古屋に当てはまる）
;
```
- 上記の条件で出すと下記のようなデータが抽出できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/a921665a-b1e5-3c83-339f-954576ae1a06.png)


### 例題③：2023年1月以前に行った店舗と日付の情報だけ出したい場合
```
SELECT go to the Gyoza no Ohsho_date,store
FROM Gyoza no Ohsho（王将の情報）
WHERE　go to the Gyoza no Ohsho_date<2023-02-01（2023年2月1日より前の物だけ）
;
```
 - 上記の条件で出すと下記のようなデータが抽出できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/79d1a3d3-49f0-374c-5dfc-e60bf5d52f34.png)

# 最後に
- 今回は、読める事を目的とした記事でした。
- 自分でも作成してみたいという方は、誰かが作ったクエリを一部編集してみる所から作業に慣れてみるのはどうでしょうか。
Python自動化ライブラリ Pywinauto メモ

## Pywinautoとは

+ PythonでPC操作の自動化(RPA)を行うためのライブラリ

## 概念

* **バックエンド**

  * Pywinautoがアプリと接続するための手段。以下の2つがある。

    * **UI Automationベース**（`backend="uia"`）

      * 64ビットアプリを接続対象とする。

        

    * **Win32 API ベース**（`backend="win32"`）

      * 32ビットアプリを接続対象とする。

* **エントリーポイント**

  * アプリを制御するために利用するオブジェクト。以下の２つがある。

    - **Applicationオブジェクト**：プロセスをまたがない制御を行う

    - **Desktopオブジェクト**：プロセスをまたぐ制御を行う

      

## 事前準備

* Pywinautoインストール

  ```
  pip install pywinauto
  ```

  

## コード

* メモ帳を起動し、文字入力→`test.txt`というファイル名で保存を行う例

  `test.py`

  ```python
  from pywinauto.application import Application
  
  # メモ帳を起動する
  app = Application(backend="uia").start("notepad.exe")
  # Hello Pywinautoと入力する
  app[u"無題メモ帳"].Edit.set_edit_text(u"Hello Pywinauto")
  # 名前を付けて保存
  app[u"無題メモ帳"].menu_select(u"ファイル -> 名前を付けて保存")
  # 保存ダイアログ選択
  dialog = app[u"無題 - メモ帳Dialog"]
  # ファイル名入力
  dialog[u'ファイル名2'].Edit.set_edit_text(u"テスト.txt")
  # 保存ボタン押下
  dialog[u'保存'].click()
  ```

  

## 動作確認

* コード実行

  ```shell
  python test.py
  ```
　※メモ帳が起動し、文字入力、ファイル保存が行われる。

  

## 参考情報

* [What is pywinauto](https://pywinauto.readthedocs.io/en/latest/)
AWS Lambda コールドスタート問題メモ

Lambda利用時によく話題になるコールドスタート問題についてメモする。

## Lambda実行の流れとコールドスタート

Lambda サービスが関数を実行するリクエストを受け取り、以下を実行する。

1. サービスは内部の Amazon S3バケット (関数がコンテナパッケージを使用する場合はAmazon ECR) に保存されている関数コードをダウンロードする。
2. 指定されたメモリ、ランタイム、各種設定に基づいた環境を作成する。
3. Lambda はイベントハンドラー外に記述された初期化コードを実行する。
4. ハンドラーコードを実行する。

上記1,2のステップを実行することを「**コールドスタート**」と呼ぶ。

このコールドスタートステップに要する時間は課金されないが、<u>**全体的な実行時間に対して遅延を及ぼす**</u>。

* コールドスタートに要する時間は、100 ミリ秒未満から 1 秒以上まで様々...

![lambda_cold_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/573575a3-d69e-d219-8255-f8293188990a.png)


* 実行が完了すると、リソース管理とパフォーマンスを向上させるために、Lambdaは実行環境を不特定期間保持する。
  * この間、同じ関数に対する追加のリクエストが到着すると、サービスは環境を再利用するよう試みる。
  * この 2 番目のリクエストは実行環境がすでに存在し、コードをダウンロードして初期化コードを実行する必要がないため迅速に終了する。
  * これは「ウォームスタート」と呼ぶ。

## 実行環境のライフサイクル

* Lambdaは、実行後すぐには実行環境を破棄せず、保持し続ける。
  * 環境の保持期間は様々な要因の影響を受け、開発者が設定することはできない。

* 実行環境の再利用は有用だが、下記理由からパフォーマンスの最適化をこれに依存すべきではない。

  * Lambda は、AWS リージョン内の複数の AZに跨って実行管理されるため、リクエスト量に応じて関数をロードバランスする可能性がある。その結果、短時間に関数が 2 回呼び出されたとしても、いずれの実行においてもコールドスタートが発生する事態も起こり得る。

  * リクエストによってLambda 関数がスケールアップされる際には、関数の追加の同時呼び出しごとに新たな実行環境が必要となる。
    * すでにウォーム状態になっている既存の同時実行可能な関数が存在する場合も、追加の同時実行分においてはコールドスタートが発生する。

  * Lambda 関数のコードを更新したり、関数の設定を変更した場合、次の呼び出しでコールドスタートが発生する。

## 対策1：Provisioned Concurrency 

* 事前に同時実行環境(コードダウンロード、環境作成、初期化コードの実行)を整える機能。
  * 関数は初期化およびウォームアップされ、プロビジョニングしたスケールで 2 桁のミリ秒で応答できる準備が整う。
  ※Provisioned Concurrency 料金が別途発生する

## 対策2：Lambda SnapStart

* Lambda実行直前に環境のスナップショットを取得し、多層キャッシュに保存することで、それ以後のコンテナ初期化を高速化する機能。
  * スナップショットには初期化後、実行開始直前の関数のメモリとディスクの状態が記録される。



## 参考情報

* [Operating Lambda: パフォーマンスの最適化 – Part 1](https://aws.amazon.com/jp/blogs/news/operating-lambda-performance-optimization-part-1/)
* [New – Accelerate Your Lambda Functions with Lambda SnapStart](https://aws.amazon.com/jp/blogs/aws/new-accelerate-your-lambda-functions-with-lambda-snapstart/)
WSLのコマンドと関連する情報の確認方法など

# 1.この記事の内容

使う頻度の低いコマンドなどは忘れやすいので，この記事に集約することにしました．
コマンドの仕様は``wsl --help``やMicrosoft公式の[WSL の基本的なコマンド](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands)を参照するものとして，この記事には筆者が使うことのあるものを中心に残すこととします．

# 2.WSLのコマンドなど

# 2-1.ディストリビューションの一覧

```shell
> wsl --list --verbose
  NAME              STATE           VERSION
* Ubuntu-22.04_E    Exporting       2
  Ubuntu-20.04      Stopped         2
  Ubuntu-22.04      Stopped         2
```

# 2-2.ディストリビューションのシステムサイズ確認

```shell
> wsl --system -d <distribution name> df -h /mnt/wslg/distro
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb       1007G  439G  517G  46% /mnt/wslg/distro
```

# 2-3.仮想ハードディスクの保存場所の確認

レジストリエディタのLxssのBasePathで確認できます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983907/624eb078-2440-e242-48b1-e6706ad9d6d2.png)

PowerShellなどのコマンドなら，``Get-ItemProperty``で確認できます．

```shell
> Get-ItemProperty -Path Registry::HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\*
```

# 2-4.仮想ハードディスクの保存場所の変更方法

ディストリビューションのインストール時に指定した場所に保存することはできないようで，``wsl export``→``wsl import``の手順が必要なようです．

1. WSLを停止
    ```shell
    > wsl --shutdown
    ```
1. exportする
    ```shell
    > wsl --export <distribution name> <destination path>
    ```
1. 登録を解除(unregister)する
    ```shell
    > wsl --unregister <distribution name>
    ```
1. importする
    ```shell
    > wsl --import <distribution name> <install path> <exported tar>
    ```

# 3.さいごに

他にWSLの使い方に関して忘れて困るようなものを思い出したらこちらの記事に加筆していこうと思います．
なお，筆者が遭遇するトラブルへの対処方法については，[WSLで良くあるトラブルと対処方法](https://qiita.com/ryoma-jp/items/daa7965683279c42de8c)に書いていますので，よろしければ参照ください．

# 4.関連リンク

* [WSL の基本的なコマンド](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands)
* [WSL ディスク領域を管理する方法](https://learn.microsoft.com/ja-jp/windows/wsl/disk-space)
* [WSL2の.vhdxはどこ？](https://lowreal.net/2021/06/26/1)
* [Windows 10 WSLのイメージ保管先変更](https://zenn.dev/trusted_dream/articles/b7547b732c1d62)
* [WSLで良くあるトラブルと対処方法](https://qiita.com/ryoma-jp/items/daa7965683279c42de8c)
ARC157回答メモ

0.はじめに
　A問題は想定した仮説がうまくはまり早めにACにたどり着けました。
　B問題は想定ケースが足りなかったためか、最終的にWAをつぶせませんでした。
　結果としては、1500thとキリ番ゲットして、レート+46で698と過去最高を
　更新しました。

1.A - XXYYX
　考え方１
　　・XYの個数とYXの個数の差が、2以上あるケースはありえない
　上記考え方に従い実装したところWAが３でした。
　考え方２
　　・XYとYXの個数がいずれも0の場合
　　　XXとYYの両方が1以上であるケースはありえない
　　　(XYの切り替え箇所が必ず発生するため)
　上記考え方を加えてACとなりました。
　
　回答提出について、ケアレスミスで1回無駄にしてしまったので
　もう少し慎重に考えれば、もう少し上位を狙えたかなともったいなかったです。

　https://atcoder.jp/contests/arc157/submissions/39182950

2.B - XYYYX
　1時間くらい試行錯誤を重ねましたがACにたどり着けませんでした。
　解説を見たところ当たらずといえども遠からずといった感じだったので
　後ほどもうちょっと考えてみようと思います。

　url

以上