OmniAICreator/Qiita-1.07M huggingface dataset:
タイポを笑顔に変える！SLコマンドで遊ぼう

# 概要

`ls`、よく打つコマンドだと思います。で、タイポして`sl`とよく打っちゃいますよね？
今回は、その`sl`とタイポしてしまったときに本当にSL（蒸気機関車）を走らせる方法を記事にしていきます。

:::note warn
警告
この記事はネタです。
:::

```
                                                  (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O
                                             (@@@)
                                         (    )
                                      (@@@@)

                                    (   )
                                  ====        ________                ___________
                              _D _|  |_______/        \__I_I_____===__|_________|
                               |(_)---  |   H\________/ |   |        =|___ ___|      _________________
                               /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
                              |      |  |   H  |__--------------------| [___] |   =|                        |
                              | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
                              |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
                            __/ =| o |=-~O=====O=====O=====O\ ____Y___________|__|__________________________|_
                             |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
                              \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/
```

# 手順

1\. SLコマンドのインストール
```
apt install sl
```
2\. 蒸気機関車を発射
```
sl
```
2\. 空飛ぶ蒸気機関車を発射
```
sl -F
```
3\. 小さい蒸気機関車を発射
```
sl -l
```
4\. 空飛ぶ小さい蒸気機関車（アクシデントあり）を発射
```
sl -alF
```

# まとめ

遊んでいいサーバだったら勝手に入れたりしてみてください。だれかが`sl`とタイポしたときに笑顔が生まれます。
SPA時代に忘れがちなマークアップの基本

SPAサイトを書いているときに見つけたバグ・本来のHTMLでできることができなくなってしまう問題などをまとめます。(思いつき次第/見つけ次第書き足します)

## リンクは aタグで実装しよう
しないと右クリックして別タブで開くことができなくなってしまう

https://azukiazusa.dev/blog/do-not-compromise-html-functionality-in-your-web-front-end-implementation/#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E3%82%88%E3%82%8B%E7%94%BB%E9%9D%A2%E9%81%B7%E7%A7%BB%E3%81%AF%E5%8F%AF%E8%83%BD%E3%81%AA%E9%99%90%E3%82%8A%E9%81%BF%E3%81%91%E3%82%8B

## ボタンは buttonタグで実装しよう
しないとTabキーで選択を移動できなくなってしまう + SpaceやEnterに反応しなくなってしまう

https://coliss.com/articles/build-websites/operation/work/need-to-know-about-buttons.html

## 画像には widthとheightを設定しよう
しないとレイアウトシフトが発生してしまう。

https://parashuto.com/rriver/development/img-size-attributes-are-back

## labelとフォームは関連付けよう
しないとラベルをクリックしても入力欄にフォーカスが行かなくなります。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/label

https://creatorquest.jp/lessons/html/label/
【iOS】StringCatalogのベース言語を変更する

# はじめに
Xcode15からStringCatalogという多言語化のための新しい機能が追加されました
StringCatalogを使用していて困ったことがあったのでまとめました。

# 困ったこと
以下のようなViewがあります。
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Button {

            } label: {
                Text("ボタン1")
            }
            
            Button {

            } label: {
                Text("ボタン2")
            }
            
            Button {

            } label: {
                Text("ボタン3")
            }
        }
    }
}
```
StringCatalogではビルドすると以下のように自動でKeyを登録してくれます。
![スクリーンショット 2023-11-03 23.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7011347e-7698-e729-5cbd-8a1a4e6e84b8.png)

Keyをデフォルト値として使用できるので、デフォルト言語はKeyの言語に合わせたいです。
しかし、ファイルを作成した時のベースの言語は英語なので日本語に変更したいです。
(プロジェクトのデフォルト言語を日本語に設定してる場合はベース言語は日本語で作成されます)

:::note warn
**注意**
マルチモジュール構成の場合はデフォルト言語を変更しててもなぜかベース言語が英語で作成されます
:::

# やりかた
VSCodeで`Localizable.xcstrings`を開きます

![スクリーンショット 2023-11-03 23.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/56e240d3-cc5a-bc46-effb-fd90a8292214.png)

`sourceLanguage`を変更します

![スクリーンショット 2023-11-03 23.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9653fa6a-ccb2-39a9-ffba-a8dcdc1ce488.png)

`sourceLanguage`を変更したのでJapaneseがベースになり、Englishが出現しました

![スクリーンショット 2023-11-03 23.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1cdf03dd-fe2d-2b15-52d3-b3f27bb8b2e8.png)

# おわり
まじで便利ですね
しかも、Newとかが出るのが嬉しいですね！
ssdeep（2.14.1）のmanを日本語訳してみた

# name
 ssdeep - コンテキストをトリガーとした区分的ハッシュ（ファジーハッシュ）を計算する

# SYNOPSIS
       ssdeep [-m <file>] [-k <file>] [-vdprgsblcxa] [-t val] [FILES]
       ssdeep [-V|h]

# DESCRIPTION
 ファジーハッシュとも呼ばれる、各入力ファイルのコンテキストをトリガーとした断片的なハッシュに基づいて署名を計算する。要求があれば、プログラムはこれらのシグネチャを既知のシグネチャファイルと照合し、一致する可能性のあるものを報告する。 
 また、1つ以上のシグネチャのファイルを調べ、その中から一致するものを見つけることもできる。ファイルに一致するものを見つけることもできる。 出力は標準出力に、エラーは標準エラーに書き出される。

 -m \<file\>
 マッチングに使用する既知のハッシュの指定されたファイルをロードする。このファイルは、プログラムの以前の出力でなければならない。次にプログラムはFILESの各エントリをハッシュし、これらのシグネチャを既知のシグネチャと比較する。比較結果から、しきい値を超える結果が表示される。このフラグは、より多くの既知のシグネチャをロードするために複数回使用することができる。 このフラグは、-kフラグまたは-xフラグと一緒に使用することはできない。

 -k \<file\>
マッチングに使用する既知のハッシュの指定されたファイルをロードする。このファイルは、プログラムの以前の出力でなければならない。その後、プログラムはFILESの各エントリを既知のハッシュの集合として扱う。これらのFILESのハッシュは、このファイルの既知のハッシュと比較される。 しきい値以上のスコアの一致が表示される。 ここで指定されたファイルと入力FILESの両方がファジー・ハッシュを含んでいなければならない。 このフラグは、より多くの既知のシグネチャをロードするために複数回使用することができる。 このフラグは、-m、-d、-pフラグとは併用できない。

-v
冗長モード。各ファイルの名前は、ハッシュされるたびに標準エラーに出力される。

-d
  FILES 内の各エントリーのシグネチャを計算し、既知のシグネチャのセットと比較する。しきい値以上の一致が表示される。計算されたシグネチャは、既知のシグネチャの集合に追加される。 このフラグは、-k または -x フラグと一緒に使用することはできない。

-p
 -dオプションと同様に動作するが、各ファイルのすべてのマッチを表示する。つまり、閾値以上のスコアを持つ2つのファイルAとBに対して、 "A matches B"　と "B matches A"と表示する。
  このフラグは、-k または -x フラグと一緒に使用することはできない。

-r
再帰モードを有効にする。すべてのサブディレクトリが走査される。 再帰モードは、指定されたファイル拡張子のすべてのファイルを調べるためには使えないことに注意すること。例えば、-r *.txt を指定してプログラムを起動すると、.txt で終わるディレクトリー内のすべてのファイルが検査される。ディレクトリ・ツリー内で接尾辞（拡張子）が.txt であるすべてのファイルを処理したい場合は、findコマンドを使う。

-g
 似たようなファイルをクラスターにまとめる。これは、より類似したファイルを探すのに便利でである。つまり、ファイルAを検索していて、それがBにマッチする場合、Bにマッチするものもクラスターに含まれる。

-s
 サイレントモード。すべてのエラーメッセージが抑制される。

-b 
ベアモードを有効にする。表示されるファイル名から先頭のディレクトリ情報を取り除く。 このフラグは -l フラグと併用してはならない。

-l
 相対ファイル・パスを有効にする。各ファイルの絶対パスを表示する代わりに、コマンドラインで指示された相対ファイルパスを表示する。この フラグは、-b フラグと併用してはならない。

 -c
  カンマ区切り出力モードを有効にする。d、-p、-m のいずれかのマッチング・モードでは、結果を入力ファイル、既知のファイル、マッチング・スコアとして表示する。

-x
署名ファイルのマッチング。 FILESの各エントリーは、プログラムの以前の出力によって生成された署名を含んでいなければならない。各署名はロードされ 既知のハッシュのセットと比較される。閾値以上の一致スコアが表示される。その後、各署名が既知のセットに追加される。 このフラグは このフラグは、-m、-d、-pフラグとは併用できない。

-a
 どのマッチング・モードでも、スコアに関係なく、すべてのマッチを表示する。 -aフラグを使用すると、マッチのスコアが0であっても、すべての結果を表示する。

 -t \<val\>
  どのマッチング・モードでも、マッチ・スコアが指定された値より大きい場合にのみマッチを表示する。デフォルトのしきい値は0。

  -h 
  ヘルプ画面を表示して終了する。

  -V
  バージョン番号を表示して終了する。

# RETURN VALUE
 成功すれば0を返し、問題があれば1を返す。 読み取りエラー、パーミッション拒否、再帰モードでないときにディレクトリに遭遇した場合も成功とみなされる。 成功。問題とは、一致するファイルをロードできない、ベアパスと相対パスの両方を指定している、などである。

 # AUTHOR
ssdeep was written by Jesse Kornblum of Facebook,
research@jessekornblum.com

# COPYRIGHT
       Copyright (C) 2002 Andrew Tridgell
       Copyright (C) 2006, 2008, 2010 ManTech International Corporation
       Copyright (C) 2012 Kyrus
       Copyright (C) 2013 Helmut Grohne
       Copyright (C) 2013, 2014 Facebook
       Copyright (C) 2014 kikairoya
       Copyright (C) 2014 Jesse Kornblum

# 備考
ssdeepのmanページをdeeplで訳したのちに、一部修正しました。
【Java8→11】CookieのMax-Ageが返す値が異なる

日本語資料があまりなかったので。

JavaにはLTS(Long Term Support)というバージョンがあって、現在だとJava8, 11, 17, 21がLTSバージョンであり、サポート期間にあたります（サポート期間はディストリビューションに寄る）。そのため、Java8で動いているサービスというのも結構あります。しかし、サポート期間は無限ではないので、サポート期間のうちに最新のLTSに上げておくと、不安の種が1つ減ります。今回の話題はそんなJavaのバージョンを8から上げた時に見かけた現象を説明します。

# CookieのMax-Age

HTTPでは、サーバーとクライアントの情報のやり取りの機構の一つに[Cookie](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies)というものがあります。サーバーがクライアントにクッキーを送ると、クライアントは次のリクエストの時に送られたクッキーを送り返すことで、サーバー側はそのリクエストがどのクライアントからきたかなどを把握することができるようになります。いわゆるセッションというやつです。この機能は便利ですが、セッションが不必要に長いと、自分のセッションを他人が使ってしまうことがあったりします。そのためクッキーには有効期限(Expires)が設けられており、その期限を過ぎるとクッキーは破棄されます。クッキーの有効期限には2種類あり、1つは特定の時刻を表すものと、もう一つは残りの秒数を表すものがあります。前者はExpiresで後者はMax-Ageと呼ばれます。

サーバーはクッキーを送る時に[Set-Cookie](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie)と呼ばれる属性をレスポンスヘッダに渡します。JavaではこのSet-Cookieを表すためにHttpCookieを使います。レスポンスヘッダに渡す属性の文字列を解析するparseメソッドを使うことで、インスタンスを作成できます。

```java
jshell> import java.net.*

jshell> HttpCookie.parse("Set-Cookie: value=1")
$1 ==> [value=1]

jshell> $1.get(0).getMaxAge()
$2 ==> -1
```

ExpiresおよびMax-Ageはオプショナルな要素であり、Max-Ageは設定されていなければ-1を返します。

HttpCookie#parseの面白い点の1つに、Expiresを指定すると、Max-Ageはそれに対応する値を返すようになります。

```java
jshell> import java.time.*, java.time.format.*

jshell> HttpCookie.parse("Set-Cookie: value=1; Expires=" + ZonedDateTime.now(ZoneId.of("GMT")).plusDays(1).format(DateTimeFormatter.RFC_1123_DATE_TIME))
$3 ==> [value=1]

jshell> $3.get(0).getMaxAge()
$4 ==> 86399
```

このように、Max-Ageを与えていませんが、Max-Ageが設定されていることがわかります。

# Java8→11でMax-Ageが返す値が異なる

さて、本題です。Java9以降では、Expiresが過去、つまり期限切れのクッキーの場合、Max-Ageは0になります。Max-Ageが0もしくは負数の場合は期限切れを表します。

```java
jshell> HttpCookie.parse("Set-Cookie: value=1; Expires=" + ZonedDateTime.now(ZoneId.of("GMT")).minusDays(1).format(DateTimeFormatter.RFC_1123_DATE_TIME))
$5 ==> [value=1]

jshell> $5.get(0).getMaxAge()
$5 ==> 0
```

※jshellはJava9以降で提供されたため、jshellを起動しているということは、あなたはJava9以上で動作しています。

しかし、Java8以前でこれは経過秒数を返します。期限切れの場合は負数になります。

```scala
% amm
Loading...
Compiling /Users/yasue.kizuki/.ammonite/predef.sc
Welcome to the Ammonite Repl 3.0.0-M0-56-1bcbe7f6 (Scala 3.3.1 Java 1.8.0_362)
@ import java.net._, java.time._, java.time.format._ 
import java.net._, java.time._, java.time.format._

@ HttpCookie.parse(s"Set-Cookie: value=1; Expires=${ZonedDateTime.now(ZoneId.of("GMT")).minusDays(1).format(DateTimeFormatter.RFC_1123_DATE_TIME)}") 
res1: List[HttpCookie] = [value=1]

@ res1.get(0).getMaxAge() 
res2: Long = -86400L
```

この挙動、-1の場合に「Max-Ageが未設定だった」のか「Max-Ageが1秒前に期限切れになった」のかの判断がつきません。これは[バグとして登録されてJava9で対応されています](https://bugs.openjdk.org/browse/JDK-8005068)。そのため、Java8→11のタイミングでこの差分が発現します。

https://github.com/openjdk/jdk/commit/f894a28859acab03ac210eb40246752b8ae28be3

クッキーの期限が未設定なのか、それとも期限切れなのか判断つかないというのは不便ですね。特にクッキーなんてセッションを構築するために使うものですから、扱う情報がセンシティブだとちょっと恐ろしい気もします。でも大丈夫です、Java9で直ってます。Java9は2017年にリリースされたのでかれこれもう6~7年前の話ですね。現在のLTSはJava21なので、みなさんはそんな不具合踏むことはないと思います。...え？私ですか？この調査で昨日の数時間を溶かしました。

# まとめと教訓

この問題はクッキーの有効期限の未設定という状態をその有効範囲内の数値である-1という値で表してしまったことによる不具合でした。もしこれがIntegerならnullを返すことで未設定であることを明示できたかもしれません。異なる状態を1つの値に当てはめてしまうことによる不具合はなかなか取るのはしんどいので、できれば設計段階で取り除けると良いですね。
【備忘録】CSS

# CSS (Cascading Style Sheet)
## 1, CSSとは
見た目をカスタマイズするための定義情報
文字や画像などを色形大きさを変えるなどを定義する
## 2, CSS要素
- id
要素を指定するとき、他のタグと重複しないように見分けられる
基本的には重複することはない
```
<em id="longname">
```
- class
idは重複させずに複数のタグに対してスタイルを定義したいとき
重複はすることがあるがある程度分離する用
```
<em class=”css”>
```
- href
文字部分をリンクにする
```
<a href="https://getbootstrap.com/docs/3.3/">Bootstrap</a>
```
- src
画像やファイルなどを読み込む
hrefとは違い、リンクに遷移するようなものではない
```
<script src=”http://cdnjs…..”>
```
- style
文字に色や大きさなどの見た目をカスタマイズする
複数種類がある
```
# 背景色などの見た目の変更
<h1 style=”background-color:blue;”>

# 黒色の枠線を付ける
<p style=”border: solid lpx black”>

# 左端の余白を10pxとる
<p style=“padding-left:10px;”>

# 太字
<p style=“font-weight: bold;”>

# フォント指定 normal, italicなど
<p style=”font-style: nomal”>
```
```
# style要素を分離
h1 {
  background-color: blue;
  color: white;
  padding-left: 10px;
}
#longname {
  color: red;
}
.css {
  font-style: normal;
}
```
[SAA-C03]Amazon EventBridge (CloudWatch Events)

# 更新日
- 2023/11/03 初回

# [Amazon EventBridge](https://aws.amazon.com/jp/eventbridge/)

## これ何？[^1]
AWSサービス、既存システム、SaaSにおいてイベント駆動型アプリケーションを構築する仕組み。

## 何が便利？
- イベント駆動というところがポイント。EventBrigeスケジューラで大規模なイベントの作成・起動・管理を容易に行える。[^1]
- CloudwatchEventsではAWS内のサービスとの連携が可能であった[^2]が、EventBridgeはCloudwatchEventを発展させSaaSやAWS以外の他サービスとの連携が可能になっている。
- つまり、他システム、他サービス、他アプリケーションとのEvent駆動による連携が可能ということはAPIの口を用意してHTTPリクエストで連携する必要がないということなので、疎結合に迅速に（バックエンドの負担を軽減して）構築できるということ。

## 利用例
- SalesforceなどのCRMサービスを利用し顧客情報の更新などのイベントに応じ、発注処理を行う[^6]
- 

# 実装[^3],[^4]
のちほど追記します

# Ref
[^1]: [Amazon EventBridgeとは何か](https://qiita.com/ishibashi-futoshi/items/586ebe17b174a478eb6a)
[^2]: [【徹底解説】Amazon EventBridgeとは？](https://www.sunnycloud.jp/column/20210802-01-2/)
[^3]: [AWS::Events::Rule](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html)
[^4]: [[アップデート]Amazon EventBridgeルール作成をよりシンプルにする機能が追加されました](https://dev.classmethod.jp/articles/amazon-eventbridge-capabilities-build-rules/)

[^5]: [イベント駆動サービスAmazon EventBridge 3兄弟をどう使い分ける?(Rules/Scheduler/Pipes)](https://dev.classmethod.jp/articles/aws-eventbridge-family-summary/)
[^6]: [見せてやるよ、EventBridge の本気ってやつをな / The art of EventBridge](https://speakerdeck.com/_kensh/the-art-of-eventbridge?slide=8)
仕事の効率化＝時間短縮？

みなさん、こんにちは！
旅行とおうちでまったりすることが大好きな社会人3年目のキイロです！

みなさんは仕事をするにあたって、もしくはプライベートで楽しんでいるときに
**上手に言葉を使って説明**できますか？
キイロは「あれ、それ」といった言葉が多く出てきたり、
上手に言葉で表すことが苦手です。

https://qiita.com/kiiro-akari/items/802d52223300dd592d53

前回の記事もあわせて読んでみてください！

# 今回作成した意図
毎回記事を作成するにあたって記載しておりますが、
キイロの職業はスーパーマーケットの社員です！
みなさんはスーパーマーケットに来店した際に、なにか困りごとがあると
サービスカウンターにお越しになられますよね。

**特に最近よく聞かれるのが、自社アプリに関して。**

サービスカウンターでの業務も行うキイロは、どなたかに**代弁**していただけると嬉しいなと思い作成しました。

# 今回使用したツール
LINEBot
Make
OpenAI
ChatGPT



**Makeを使用し、LINEとChatGPTをつなげる方法**（初回の記事）

https://qiita.com/kiiro-akari/items/8ed4a490b3f46b4265a7

もしくは、こちらを参考にしてください。

https://chat.openai.com/share/b6e00d8b-740a-49bf-b925-a34577d06206


# まずは魅力を再確認

自社アプリのことを知らない人が説明してもお客さまは
聞く耳をもってくれないですよね。
ということで、まずは魅力を再確認するためにChatGPTに検索してもらいました。

※公開できない内容のため、手入力させていただきます。

①通知機能　　　　タスクや予定通知機能を備えています。
②クラウド同期　　データのバックアップや常に最新の情報を手元に持つことができます。
③パーソナライズ　ユーザのニーズに合わせてカラーテーマや表示項目の設定が可能です。


など10項目をChatGPTに検索をかけたところ、結果を出力してくれました。
魅力を知ったうえで、次の取り組みへ。


# 自社アプリの加入率向上にむけて

作成するのであればすでに店舗で行っている活動をChatGPTに入力し、
ほかにもどんなことができるのかアイデアを出してもらいましょう。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">提案してもらうタイム。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%A3%E3%83%BC%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#チャレンジャーズ</a> <a href="https://t.co/6NTOoLw42A">pic.twitter.com/6NTOoLw42A</a></p>&mdash; あかり (@akashiro_as) <a href="https://twitter.com/akashiro_as/status/1720078991187660874?ref_src=twsrc%5Etfw">November 2, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

このようにChatGPTに検索をかけると結果を出力してくれます。

# これをもとに実用化へ

実用化に向けて内容の洗い出しをしました。

ChatGPTがアイデアを提案してくれたものの中にも、細かくは記載していなくてもすでに似たような内容を取り組んでいたことや、店舗でもできる内容をを洗い出し、

**①アプリの利点を強調する　
②既存ユーザーの口コミを活用する**

この2点を店舗での活動として実用できないのかを改めてチームで考えてみることになりました。

そしてこの内容を含めて**自社アプリの説明手順を考えていきたい**と思います。

# できなかったことも

実はPCでのChatGPTは自社アプリについて検索をかけても結果が出力されなかったのですが、LINEとChatGPTを紐づけしたMakeではなぜか検索をかけると結果が出力されるといったことが起きました。
いろいろ試してみないとわからないです。

# あまった時間にこんなことも

実際に時間がかかるアイデア出しを提案してくれるといったことによって、キイロはほかの仕事内容に取り組む時間を増やすことができました。
また実際に行っていることではないですが、店舗でのミーティング時間が縮小できたり、ほかの作業にあてる時間が増えるのではないかとかんがえられます。

# 最後に

ChatGPTを使うことによって、今まで発想のなかにはなかった提案をしてくれたり、提案をもとに新たにできることを考えることによって、偏りのない同じサービスをお客さまがうけられる1つのツールではないかと感じました。
使いかたは様々ですが、もっと様々な内容でChatGPTを使用する機会を増やせると、仕事の効率化にもつながっていくのではないかと思いました。
GooglePlayStoreの内部テスト公開で苦労した話[flutter] [Android]




## 初めに

今回の記事は、GooglePlayStoreの内部テストを公開した際に遭遇したエラーについて、
備忘録的な感じで、残しておこうと言う趣旨の記事です。
どなたかの参考になれば幸いです。

## 実装手順

https://zenn.dev/shuneihayakawa/articles/4c866496cbdb2be7025b

上記の記事を参考に、キーストアを作成し、署名の設定を行いました。

（今回の記事では、全体の実装方法は省略します。
実装方法が気になる方は参考記事の参照してください。）

諸々設定を終えて、

```dart
flutter build appbundle
```

上記のコマンドで、app bundleビルドをすると以下のエラー




* What went wrong:
Execution failed for task ':app:validateSigningRelease'.
> Keystore file '/Users/kobayashiyuuto/StudioProjects/プロジェクト名/android/app/key.jks' not found for signing config 'release'.


android/app/build.gradleファイルの、
defaultConfigブロックのsigningConfig signingConfigs.debagを
signingConfig signingConfigs.releaseに変更します。

```dart
  defaultConfig {
        applicationId "com.hoge.fuga"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        signingConfig signingConfigs.release //debagからreleaseに変更する。
    }
```


この変更をした後に、もう一度aakファイルをアップロードします。


そうしたら次は以下のエラーが。。。
```
「com.example」は制限されているため、別のパッケージ名を使用する必要があります。
```

どうやらandroidでは、com.exampleのbundleIdはリリースできないらしい。

→bundleIdを変更。

変更後再度aakファイルをビルドすると。。

* What went wrong:
Execution failed for task ':app:validateSigningRelease'.
> Keystore file '/Users/kobayashiyuuto/StudioProjects/プロジェクト名/android/app/key.jks' not found for signing config 'release'.

また以下のエラー。。

色々悪戦苦闘したが、key.jksファイルがプロジェクトのルートに配置されていたので、
android/app配下に置くと、解決！！！

こう言う作業をする際は、ファイルの配置などは気をつけましょう。



## 参考記事

https://zenn.dev/shuneihayakawa/articles/4c866496cbdb2be7025b

https://qiita.com/osamu1203/items/6adfab47e562f5e7d03b
Debian(VirtualBox)でapt updateしたら接続失敗した[雑記]

# まえがき
久しぶりに起動して、パケをアプデすることに
`apt update`⇒`apt upgrade`の流れでやるらしい
「接続失敗」「接続失敗」「接続失敗」・・・

筆者の半年に一回の恒例行事「でびあん君修復作業」
今回は事後報告なのでエラーの状況はもう残ってない
役に立ったら♥️をお願いします。

# 目次
**1.御託**
**2.原因と解決**
**3.最後に**
# 1.御託
ホストOS：Windows11
ゲストOS：Debian 11(bullseye)
仮想化ソフト：VirtualBox

# 2.原因と解決
[原因]
・`/etc/apt/sources.list`内のパッケージをとってくるURLがおかしかった(憶測)
[解決]
・`/etc/apt/sources.list`内のURLを書き換えた

参考元:

https://e-topics.net/after-debian11-installation/

あんま関係ないけど古いパッケージの削除に使った

https://www.debian.org/releases/stable/i386/release-notes/ch-upgrading.ja.html

```bash
# before(抜粋)
# /etc/apt/sources.list の中身

deb http://ftp.kddilabs.jp/pub/debian/ bullseye main
deb-src http://ftp.kddilabs.jp/pub/debian/ bullseye main

deb http://security.debian.org/debian-security bullseye-security main
deb-src http://security.debian.org/debian-security bullseye-security main

deb http://ftp.kddilabs.jp/pub/debian/ bullseye-updates main
deb-src http://ftp.kddilabs.jp/pub/debian/ bullseye-updates main
```
```bash
# after(抜粋)
# /etc/apt/sources.list の中身

# deb http://ftp.kddilabs.jp/pub/debian/ bullseye main contrib
# deb-src http://ftp.kddilabs.jp/pub/debian/ bullseye main contrib
deb http://deb.debian.org/debian/ bullseye main contrib
deb-src http://deb.debian.org/debian/ bullseye main contrib

deb http://security.debian.org/debian-security bullseye-security main  contrib
deb-src http://security.debian.org/debian-security bullseye-security main contrib

# deb http://ftp.kddilabs.jp/pub/debian/ bullseye-updates main contrib
# deb-src http://ftp.kddilabs.jp/pub/debian/ bullseye-updates main contrib
deb http://deb.debian.org/debian/ bullseye-updates main contrib
deb-src http://deb.debian.org/debian/ bullseye-updates main contrib
```
# 3.終わりに
結局http://ftp.kddilabs.jp/pub/debian/ ってなんなんだよ！
なんでhttp://deb.debian.org/debian/ に差し替えたら解決したんだよ！！！
まあ接続失敗出さずに全部更新し終わったのでヨシ！！！！！

役に立ったら♥️お願いします。
Power AutomateでPremiumコネクタを使わずメール本文をPDFにする

Power Automateのクラウドフローには、いくつもPDFへの変換関連のアクションがあるのですが、APIの登録を使わずに使えるものが案外少なく、OneDriveの「ファイルの変換」系しか見当たりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/5d050a09-bf2e-146b-0f7d-276f3864e0d3.png)

# 2バイト文字はダメ？
そんでもって、このアクションはどうも癖があって、.htmlや.msgなど日本語が入っていなければPDFに変換ができるのに、１文字でも２バイト文字を含んでいると変換できずエラーになってしまいます。
この症状については、こちらの記事で紹介されています。
https://qiita.com/ks4050kt/items/c9a1798c945ae025ae5c

いろいろ試してみると、XLSXやDOCX、PPTXなどオフィス系のファイルならば日本語でも問題なくPDFにしてくれることがわかりました。
| | 日本語を含まない | 日本語を含む |
|:-----------|:------------:|:------------:|
| .xlsx    | OK        | OK         |
| .docx    | OK      | OK       |
| .pptx    | OK       | OK         |
| .html    | OK          | NG           |
| .txt     | OK       | NG      |
| .msg | OK     | NG    |

.msgファイルはOutlookから「メールのエクスポート」アクションで書き出せるものです。アプリ版のOutlookをお使いの方であれば、メールをドラッグしてデスクトップなんかに持ってきたときにできるあのファイルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/7f461f80-8320-161b-a71a-be309fa3711d.png)
英語ならばPDF化できるのに、やはり日本語を含んでいるとエラーとなってしまいます。

# オフィス系のファイルでOKならばWordは？
今回は届いたメールをPDFにしたいですが、Office系のファイルが使えるならばいったんWordのファイルである.docxにしたいところですが、残念ながらWord系のアクションはプレミアムでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/af71d711-8336-2114-af62-2a4d04c91cb3.png)
# ならばExcelだよ。
今回は標準コネクタ縛りですので、多少強引ですがExcelを使います。
OneDrive上にこんなExcelのテーブルを作成しました。もうだいたい想像がつきますよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/8c2f617c-bc93-780b-3829-591694c4b317.png)
こちらがクラウドフローの全体図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/db233a8b-1abe-7ad7-ed54-c4c99e7ee6ee.png)
## 前半
やっていることは極めて単純です。メールの本文はHTMLの場合があるので、「Htmlからテキスト(プレビュー)」をつかってプレーンテキストに変換してやります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/44298222-528b-76ba-1612-a639260cd10b.png)

それをあらかじめ用意したエクセルのテーブルに書き込んでやります。行の追加でもよいのですが、それだとどんどん行が追加されて、最終的にPDFにする際に過去のメールも表示されてしまうので、ID列を作って同じ列を更新していくことにします。
## 後半
エクセルのテーブル行更新をした内容を変換するのですが、更新されてすぐに次の変換がかかると間に合わないことがある様でしたので、待ち時間20秒を挟んでみました。このタイミングは適当に変更してみてください。
変換できたらOneDriveにファイル作成で書き出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/5ab4eac8-67fa-2b2e-f9e6-653cf2e44ca1.png)
最後にエクセルのテーブルをクリアします。ちなみにクリアは式で''を入れてやるとうまくいきます。

https://papamamameyou.com/%E3%80%90powerautomate%E3%80%91excel%E3%81%AE%E3%82%BB%E3%83%AB%E3%82%92%E7%A9%BA%E7%99%BD%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/3da74f21-8927-da68-92a8-76625b0b50aa.png)

こちらが出力できたPDFのプレビュー画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/e1537bae-76f9-2728-8bb4-d63a936dc7ff.png)

# 日本語対応してくれればよいのですが・・・
エンコードの問題かな？と思ってBOMを入れてみたりといろ試してみましたがギブアップして多少強引な方法でアプローチしてみました。
bundlerを使ったgemの作り方、公開方法

Rubyのgemパッケージを作成する手順について。bundlerにgem作成を助ける機能がいくつかあるので利用する。

## ひな形の作成

bundle gemでひな形を生成する。

    $ bundle gem mylib

gemspecは各gemごとに適当に修正する。ひな形を見ればすぐに内容はわかる。

## 依存ライブラリ

依存ライブラリはGemfileではなくgemspecファイルに記述して、Gemfileからはgemspecを参照するだけにする。

Gemfile
```
source 'https://rubygems.org'
```

gemspec
```
mylib.gemspec
Gem::Specification.new do |spec|
  ...
  spec.add_runtime_dependency "hashie"
  spec.add_runtime_dependency "json"
  spec.add_development_dependency "bundler"
  spec.add_development_dependency "rake"
end
```

## ビルド

gem buildコマンドでビルド。

    $ gem build mylib.gemspec

bundleでひな形を作っている場合は、rake buildでpkgフォルダにgemパッケージが作成される。

    $ rake build
    
## 公開

gem pushコマンドで公開。このとき、rubygems.orgのアカウントが必要。

    $ gem push mylib-x.x.x.gem

同様にbundleでひな形を作っている場合は、rake releaseリリースできる。

    $ rake release

## トラブルシュート

### コミット忘れ

ビルド対象になっているファイルを変更しているのにも関わらずコミットしていない状態でrake buildすると以下のようにエラーになる。コミットしてからビルドする。

```
$ rake build
rake aborted!
Running `gem build -V /path/to/dupler.gemspec` failed with the following output:

WARNING:  See https://guides.rubygems.org/specification-reference/ for help
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    ["uncommitted.file"] are not files


Tasks: TOP => build
(See full trace by running task with --trace)
```

### 依存性問題

duplerというCLIツールを公開しているが、これの0.2.0を公開した時、Rubygemsには正しくpushできるのにgem installで公開したはずのバージョンがインストールできない問題が発生した。gemspecのdependencyの設定で依存ライブラリーのバージョン番号を指定しないでいたところ、ローカルでのビルドは問題なく、.gemファイルからのローカルインストールも問題なかったのでそのままRubygemsにpushした。そこから改めてgem installすると、公開したはずの0.2.0ではなく古い0.1.0がインストールされてしまう。試しにgem update duplerを実行すると、以下のようなエラーとなっていた。

```
gem update dupler
Updating installed gems
Updating dupler
ERROR:  Error installing dupler:
	Unable to resolve dependency: user requested 'dupler (= 0.2.0)'
Nothing to update
```

具体的に問題となっているライブラリーについてはこのメッセージからはわからないが、依存性の解決に失敗しているらしい。仕方がないのでgemspecに記載している依存ライブラリーについて、全て利用しているバージョンを具体的に指定したところ問題なくRubygemsからgemコマンドでインストールできるようになった。

## 備考

この記事は2013年(!)に[Bloggerに書いたもの](https://opentechnica.blogspot.com/2013/09/bundlergem.html)の写しです。自分で見返す必要があったのでQiitaにコピーしておきます。一部加筆しています。
Testの書き方 プロセス編

- [Testの書き方 プロセス編](#testの書き方-プロセス編)
  - [起動を確認するテストの書き方](#起動を確認するテストの書き方)
  - [再起動を確認するテストの書き方](#再起動を確認するテストの書き方)
    - [`Process.monitor`とは](#processmonitorとは)

# Testの書き方 プロセス編

Supervisorの監視ツリーに追加しているプロセスを
確認するテストを記述する方法をまとめる。

**`application.ex`内のSupervisorの監視ツリー**に追加したプロセス、またはSupervisorは、
<font color="red">テスト時にも起動される</font>らしい。

追加していない場合は以下を参照すること

https://hexdocs.pm/phoenix/testing.html

## 起動を確認するテストの書き方

プロセスが起動していることを確認するには、次の記述を使用すると良い。

```elixir
assert is_pid(GenServer.whereis(プロセスモジュール))
```

`GenServer.whereis(プロセスモジュール)`でプロセスのidを取得し、
`is_pid`でプロセスのIDであるかチェックしている。

## 再起動を確認するテストの書き方

以下の記述を行うことで<font color="red">プロセスの監視を開始</font>し、
**プロセスの終了時にメッセージを送信する**ことができる。

```elixir
ref = Process.monitor(プロセスID)
```

**プロセスが終了したときに送信されるメッセージ**は、次の形式で送信される。

```elixir
{:DOWN, #Reference<...>, :process, #PID<...>, 終了理由}
```

終了理由には以下のいずれかになる。

* `:nomal` - `GenServer.stop()`などで終了させた場合に設定される。
* `:killed` - `Process.exit(プロセスID, :kill)`を実行した際に設定される。

**プロセスを意図的に終了させる**には、以下の関数を使用する。

```elixir
Process.exit(プロセスID, :kill)
```

具体的なコードは次のようになる。

```elixir
p_id = GenServer.whereis(プロセスモジュール)
p_ref = Process.monitor(p_id)

Process.exit(p_id, :kill)

receive do
  {:DOWN, ^p_ref, :process, ^p_id, :killed} ->
    # プロセスの再起動を待つ
    Process.sleep(1000)
    assert is_pid(GenServer.whereis(p_id))
after
  1000 ->
    # flunk()で失敗メッセージを記述する
    flunk("not restarted.")
end
```

### `Process.monitor`とは

`Process.monitor()`の戻り値は以下のようになる。

```elixir
#Reference<...>
```

ここではパターンマッチに使用し、
どの**モニター参照からのメッセージかを指定する**ために必要になる。
初めてのTerraform

# Terraformとは
TerraformはHashiCorpという会社が開発したIaCツール(Infrastructure as Code)です。

Terraformを使うことでAzureなどのクラウドリソースをコード化することができ、バージョン管理や再利用、共有などを行うことができます。

インフラをコード化することで以下のようなメリットがあります。

- 効率的にインフラ環境を構築できる：コード化が完了していればTerraformを実行するだけで、定義されたリソース設定を基に構築してくれます。
- 人的ミスの削減：Terraformが自動的にインフラを構築してくれるため、ヒューマンエラーを防ぐことができます。
- 保守性の向上：インフラがコード化されたことによりGithubなどでバージョン管理を行うことができるようになりました。これにより、大規模な構成でもメンテナンスが行いやすくなります。


# Terraformの基本的なワークフロー
Terraformでの一般的なワークフローは以下のようになります。

1. Write（コードを書く）： 構築したいリソースをコードで定義します。
1. Plan（変更内容の確認）：クラウド上のインフラと構成と、リソースを定義したコードを比較します。次のステップであるApply（変更の適用）を実行した際にリソースが作成されるのか、更新されるのか、または破棄されるのか教えてくれます。「terraform plan」コマンドで実行されます。
1. Apply（変更の適用）：コード化されたリソースの設定をクラウド上に適用します。「terraform apply」コマンドで実行されます。

# どうやって書くのか
Terraform ではHCL（HashiCorp Configuration Language）と呼ばれる構文で定義リソースの設定を記述します。

以下の例は、HCLでAzureのリソースグループを定義しているコードです。

```
resource "azurerm_resource_group" "example" {
	name     = "example-resources" 
	location = "West Europe"
}
```
`resource`というブロックの中に、リソース名とリージョンを指定しています。

# どうやってクラウド上のリソースとコードを比較しているのか
Terraformでは`terraform.tfstate`というファイルにリソースの状態がJSON形式で保存されています。

`terraform plan`を実行した際は、`terraform.tfstate`とコード化されたリソース設定を比較することで、リソースがどう変更されるのかわかるようになっています。`terraform plan`が実行できるのは`terraform.tfstate`があるおかげということですね。

`terraform.tfstate`は`terraform apply`を実行するたびに更新されるので、常に最新の状態を保つようになっています。

デフォルトではローカルに自動生成されますが、クラウド上に保管することが推奨されています。

# おわり
業務でTerraformを使いそうなので簡単にまとめてみました

ちなみにHashiCorpという名前は創設者であるMitchell Hashimotoさんの名前が由来しているそうです
弧度法(ラジアン法)について理解してみた

## 概要

角度から弧の長さを求めるための弧度法(ラジアン法)は、以下になります。

```
x degrees in radians = x° × (π/180°)
```
この公式を覚えておけば問題ないですが、なぜ`π/180°`が出てくるのか分からなかったので、理解を深めたいと思いました。

## 弧の長さを求める公式

ここで、おうぎ形の弧の長さを求める方程式を思い出していきます。
`弧の長さ = 半径r × 2 × π × 中心角/360° `という公式があります。(半径r × 2 × π は円周(直径 × 円周率))
1°の弧の長さを求める式は中心角に1°を代入することになるので、
```
弧の長さ = 2πr × 1°/360° = 2πr/360° = πr/180°
```

となります。

半径rは円の半径を表すパラメータなので、円は弧度法には必要がなく半径rは無視されます。
なので、
```
π/180° (π * 中心角/180°)
```
という式が出来上がりますので、この中心角に求めたい角度を代入します。

中心角が90°を弧度法に変換すると、
```
π * 90°/180° = π/2
```
となりました。

これにより、求めたい角度を(π/180°)に乗じれば良いということがわかりました！
```
90° × (π/180°)
```
PowerAutomate: Cloud Activity(クラウドフロー活動) なら、全フローの状況を確認出来て便利

# 概要

以前から、困っていた以下が、新しい機能提供で解決したってお話

- 全フローの実行確認が、個別のフローごとに見ていくしかなくて不便
- エラーの確認が、メール通知から飛ぶか、個別にフローを確認していく必要があって面倒

# 解決方法

## Cloud Activity (クラウドフロー活動) という機能を使うだけ（ピン留めするのが吉

- デフォルトでは表示されていないので、以下の手順で
   1. 左サイドメニューで、[More(詳細)] を選択
   1. 出てきたメニューから、Cloud Actitivy(クラウドフロー活動) を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/29f260fb-4936-325b-7ee8-ddab76d77baa.png)

## クラウドフロー活動の画面

### すべてのアクティビティ

- フローの実行状況をすべて表示してくれる :laughing: 
    - とにかくこれを待っていた！！！ :yum: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/0241714b-5faf-f0c5-23ad-f671eb3c6f69.png)


### 通知

- Flow Blog の情報表示のみっぽいが、そのうち他にも出てくる？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b95cdef7-b7e3-1cd8-4663-9c8bd0f3caa2.png)

### 失敗

- 失敗したフローの情報が一覧で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/cfc02a20-e3d1-fed4-2701-1e0a87e3d722.png)


# その他の気になるメニュー

## [カスタムアクション](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/create-custom-actions)

- .Net 4.7 でアクションを作って、アップロードできる！！
   - どのみち会社では使え無さそうなのと、4.7.2 というのが・・
   - とはいえ、カスタムコネクターより複雑なことが出来るようになるのかな、という期待がある


## AI Builder の活動 (プレビュー)

- AI Builder 使ってる場合に便利
    - これも会社では使えない・・ :sob: 

## デスクトップ フロー活動

- デスクトップフローもここで確認出来るって素晴らしい


## [作業キュー (プレビュー)](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/work-queues)

- キュー管理が使えるようになるってことだけど・・・たぶん会社じゃ無理かなぁ・・

![](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/media/work-queues/work-queue-e2e-automation.png#lightbox)

# あとがき

Premium も使えず、デスクトップ連携も出来ず・・
新しい機能も、HTTP コネクターも使えず・・
会社の環境をなんとかしたいところです :sob:
SVM (support vecotor machine) 自分用メモ 

### 『はじめてのパターン認識』（平井 有三）の8.1 SVMを丁寧に読んだのでメモ。 

線形分離可能な時、適当な$\boldsymbol{w},b$を選ぶことで、(8.2)式
```math
\begin{align}
t_i=+1 \ の場合 \quad \boldsymbol{w}^T \boldsymbol{x}_i +b \geq +1 \\
t_i=-1 \ の場合 \quad \boldsymbol{w}^T \boldsymbol{x}_i +b \leq -1
\end{align}
```
を満たすようにできる。
これは、図8.1をイメージすれば分かる。というのも、
```math
\boldsymbol{w}^T \boldsymbol{x}_i +b = 0
```
は平面を表すからである。
マージンがノンゼロなら$\boldsymbol{w},b$を何倍かすれば、必ず式(8.2) のようにできる。

特に、境界平面からの距離が最も近い点が$\boldsymbol{w}^T \boldsymbol{x}_i +b =\pm 1$ を満たすようにする。すると、クラス間マージンは(8.4)式
```math
\rho (\boldsymbol{w},b) = 2/ || \boldsymbol{w}||
```
のようになる。
これの導出方法としては、点と直線の距離
```math
d = \frac{|ax_1+by_1+c|}{\sqrt{a^2+b^2}}
```
の一般次元バージョン
```math
d = \frac{|\boldsymbol{w}^T \boldsymbol{x}_1 + b|}{||\boldsymbol{w}||}
```
を用いても導出できる。



#### 8.1.2 KKT条件
不等式制約条件つきのLagrange 未定乗数法を知らないので調べたら、Princetonのスライド
https://www.cs.princeton.edu/courses/archive/spring16/cos495/slides/ML_basics_lecture5_SVM_II.pdf
が一番わかりやすかった。

ロジックがややこしいので、自分なりに解釈。
式(8.7)
```math
\tilde{L}_p(\boldsymbol{w},b,\boldsymbol{\alpha}) = \frac{1}{2} \boldsymbol{w}^T \boldsymbol{w} - \sum_{i=1}^N \alpha_i ( t_i (\boldsymbol{w}^T \boldsymbol{x}_i +b) -1 ) 
```
を$\boldsymbol{\alpha}$ に関して最大化して、$\boldsymbol{w},b$に関して最小化すること、つまり
```math
\min_{\boldsymbol{w},b} \max_{\boldsymbol{\alpha}} \tilde{L}_p(\boldsymbol{w},b,\boldsymbol{\alpha})
```
が、主問題、つまり不等式制約条件
```math
t_i ( \boldsymbol{w}^T \boldsymbol{x}_i + b ) \geq 1
```
を満たしつつ評価関数
```math
L_p(\boldsymbol{w}) = \frac{1}{2} \boldsymbol{w}^T \boldsymbol{w}
```
を最小化することと等価。
なぜなら、
```math
\begin{align}
\max_{\boldsymbol{\alpha}} \tilde{L}_p(\boldsymbol{w},b,\boldsymbol{\alpha}) = 
\left\{
\begin{array}{ll}
L_p(\boldsymbol{w}), & \text{if} \quad \boldsymbol{w} が制約条件を満たす \\
\infty, & \text{if} \quad \boldsymbol{w} が制約条件を満たさない
\end{array}
\right.
\end{align}
```
だからである。
そしてこの問題はの解となる$\boldsymbol{w},b,\alpha$は(1)~(5) の KKT条件を満たす。(KKT条件から一意に決まるか、つまりKKT条件とこの問題との等価性は知らない。あと、KKT条件を満たすのは、凸性とかアフィン変換とかの条件を満たす場合だけ。)

双対問題[1] は制約条件として$\alpha_i>0$ が残っていることに注意。
あと、ロジック的には、$\boldsymbol{\alpha}^T \boldsymbol{t} =0$ は課さなくても、評価関数の最大化をすれば得られるように思えるけど、違うのか？

#### # コメント
Princetonのスライドを見たら、Lagurange dualityのprimal problem, dual problemと言っているのは、
```math
\min_{\boldsymbol{w},b} \max_{\boldsymbol{\alpha}} \tilde{L}_p(\boldsymbol{w},b,\boldsymbol{\alpha})
```
に対する、
```math
\max_{\boldsymbol{\alpha}} \min_{\boldsymbol{w},b}  \tilde{L}_p(\boldsymbol{w},b,\boldsymbol{\alpha})
```
だから、微妙に本と言ってること違う。あと、日本語の本ってやっぱり行間が空いていて自分で埋めるタイプが多いよね。というかKKT条件は自分で埋められる行間になってない。外国の本の、全部行間埋まっているものとセットで読むのが一番いい気がする。
【Web3】wagmiを使ってMetamaskをNextjsアプリにつないでみた。 

# 追記
今年の初めにv2が公開され、実装方法が大幅に変わりました
のちのち書きます

https://wagmi.sh/react/guides/migrate-from-v1-to-v2
# 追記2
V2にアップデートしたコードについて投稿しました。

https://qiita.com/amamiya_dev/items/d0335da3c0ff025c3ffe

# 概要

いきなりですが、四年生専門学校の学生である私は最近来年から課題の準備をはじめていて、今回はWeb3向けのWebアプリを開発していこうかと思っています。

なのでまずはこの記事でMetamaskのウォレットを接続するためのロジックを作っていきます。

# ウォレットとか
細かい説明は省きますが、ウォレットについては以下にて

https://web3guide-jp.com/what-is-crypto-wallet-how-to-choose-the-appropriate-wallet-for-you/

# wagmiとは

https://do-you-imi.net/wagmi/6355/

wagmiとは We gonna make itという意味の文章で必ず成功させるという意味があるらしいです。
開発者さんの強い意志を感じますね💦

https://wagmi.sh/

そして今回使用するのがこちらになります。
簡単なコーディングで実装できてとても便利です。

## フレームワーク
今回は
- Nextjs 13.4 
- wagmi 1.4.5

のバージョンを使用します。

# いざ実装
まずはwagmiの設定とプロバイダーを設定していきます。

```tsx

import {WagmiConfig, createConfig, mainnet} from 'wagmi'
import {createPublicClient, http} from 'viem'

const config = createConfig({
    autoConnect: true,
    publicClient: createPublicClient({
        chain: mainnet,
        transport: http()
    }),
})

// 中略

export default function App({Component, pageProps}: AppProps) {
    return (
        <ChakraProvider>
            <WagmiConfig config={config}>
                <Component {...pageProps} />
            </WagmiConfig>
        </ChakraProvider>
    );
}

```

あとはNextAuthとかのような感じ(?)で実装すればOKです。


```tsx
import { useAccount, useConnect, useDisconnect } from 'wagmi'
import { InjectedConnector } from 'wagmi/connectors/injected'
import Link from "next/link";
import { Button } from "@chakra-ui/react";

export const Wallet = () => {
    const {  isConnected } = useAccount()
    const { connect } = useConnect({
        connector: new InjectedConnector(),
    })
    const { disconnect } = useDisconnect()
    if (isConnected)
        return (
            <div>
                <Link href={"/account"}>Account</Link>
                <button onClick={() => disconnect()}>Disconnect</button>
            </div>
        )
    return <Button onClick={() => connect()}>Connect</Button>
}
```

app.tsxのautoconnectをtrueにするとしばらくはウォレットが接続された状態が維持されるのっぽいです。

今回は実装していませんがアカウントのアドレスも実装できます。

# おわりに
今回はウォレットの接続のみですが、そのうちトランザクション処理などもっといろいろな機能を実装していきたいです。
[React, Next.js]URLパラメータを取得

## はじめに
今回はReactとNext.jsでURLの情報を取得する方法を書いていきます。

## Reactの場合
ReactでURLのパラメータを取得するには、「useLocation()」が使えます。
まずは、「react-router-dom」をインストールしてください。

```
npm install react-router-dom
```

以下がサンプルコードになります。
「localhost://3000/Favorite」の場合

```
const location = useLocation();
console.log(location);
```
結果☟
![スクリーンショット 2023-11-03 20.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/d3739ec6-c0e7-eb79-bb8e-63ef68645d94.png)


## Next.jsの場合
Next.jsでURLのパラメータを取得するには、useRouter()が使えます。
以下がサンプルコードになります。
「localhost://3000/books」の場合
```
const router = useRouter();
console.log(router);
```
結果☟
![スクリーンショット 2023-11-03 20.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/67bcaeba-b22a-e119-2273-fad96e525270.png)


## 参考
参考にしたドキュメントです。

https://reactrouter.com/en/main/hooks/use-location

https://nextjs.org/docs/pages/api-reference/functions/use-router

## 最後に
他にも色々な記事を書いているので、よければ読んでいってください、、、

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/265c676d17fe21e75242

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
TestFlightでの内部配信が行えない/内部グループが選択できない場合の回避策

私は個人と仕事のアプリリリース対応で毎月5~10回ほどリリース作業を行うのですが、
以下現象がごく稀に起こるので、個人用の備忘録として記載しておきます。
（原因も不明でバグFixなど急いでいるとき非常に困る。。）

【現象】

![Group 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630810/cf497cdf-9506-afd9-7bcd-db59588dc225.png)

1. Flutterで開発したアプリでipaを生成
2. TransporterでApp Store Connectにアップロード
3. アプリの処理が完了してもTestFlightにて内部グループを選択できない（＝テストできない）

【解決策】 ※以下手順で別アプリ含め解決できたが再現性が確実かは不明。。。
1. 内部テストグループを新規で作成（「自動配信を有効にする」はチェックにしていました）
2. 自動割り当てされていなかった内部グループが選択される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630810/4ead393c-0fff-85fb-cca2-806f0e065661.png)

もし上記手順で直った/直らなかった場合や、正しい解決方法をご存知の方がいたら教えていただけると助かります🙇
ゆめみの研修課題を通して、開発効率が上がった話

![スクリーンショット 2023-11-03 20.42.37（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/91ddde80-2359-7791-2e48-54a3756fae09.png)


この記事は、<b>「エンジニア組織の開発生産性・開発者体験向上の取り組みをシェアしよう！ by Findy Advent Calendar 2023」</b>のアドベントカレンダーになります！

詳しくはこちらです！↓

https://qiita.com/advent-calendar/2023/developer-productivity



こんにちわ。いせりゅーです。
2023年の4月から株式会社ゆめみの正社員として入社しました。

スタートとしては内定者アルバイトが11月から始まりました。最初は、研修課題に取り組むことになりました。途中で案件稼働が入ったため、2022年の11月〜12月までと10月の合計2ヶ月で研修課題をクリアすることができました🎆

https://github.com/yumemi-inc/flutter-training-template


ゆめみの研修課題を通して、開発効率が上がった話をしていこうと思います。


:::note info
<b>🚨注意</b>
当たり前のことを書くかもしれません。
それでも自分にとってはそんなことができませんでした😢

:::



## 進捗確認でテンプレートを作成し、簡単に共有できるようにした。

今回は教えていただいたテンプレートをご紹介します。

```:テンプレート
日付

現状

今後の動き

この時間で聞きたいこと

```


```:例

2023/10/24(火曜)

現状
  - Session10
    - 今日（10/23）にマージすることができた
  - Session11
    - 今日（10/23）の夕方にPRを作成し、レビュー依頼ができた。
    - 変更箇所が少ないため、26日or27日までにマージできそう。

今後の動き
　　- 修正することを想定しても10月までor11月の初めまでには、研修課題が完了しそう。
　　- 次の「研修課題の進み具合確認会」は、木曜日あたりに確認をしたい。

この時間で聞きたいこと
 - Session11が終わった後に、README.mdに環境構築について記載を行なってもいいかを確認したい

```

上の文章はNotionのメモとなっています。これを伝える際の言葉に変更してみることにしました。

```:例
「現状としては、Session10は昨日、マージすることができました。そのため、次のSession11
を進めています。Session１１としては、Session１０のレビューの隙間時間に取り組んでおり、
今日の夕方あたりまでにはPRを作成し、レビュー依頼ができそうだと考えています。
Session11の内容は、変更点が少ないため、26日〜27日までの間でマージができるのではないかと
考えています。そのため、順調に進めることができましたら、研修課題は10月以内に終わりそうだと
考えています。現状報告としては以上です。」
```

このような形で進めてみたところ、現状確認がすぐに終わり、レビューや質問の時間に費やすことができました。そのおかげで、１週間以上の想定をしていた課題が３、４日でマージすることができました。技術料の向上も要因にあるかもしれませんが、ちょっとした報告一つでも要因があると考えています。


## 質問をする前に、客観的に確認できるようにした。

すぐに質問をしてしまうと、言葉がまとまらずに送ってしまうため、認識合わせに時間がかかってしまうことがありました。そのため、一度Notionやメモ用のSlackチャンネルでできるだけ悩みが出た瞬間に殴り書きしてみることにしました。そのおかげで質問も的確になり、進めやすかったです。


## 少しでも認識が不透明になったら確認を徹底してみた。

少しでも認識が間違っていると、ずっと遠回りしていたり、間違った方向に進んでしまうことがありました。実際に、認識のすり合わせができておらず、研修内でトラブルが発生してしまいました。
その反省を活かせるために、少しでも認識がしずらかったり、確認したかった際には、一つ上の質問の準備をした上で認識を確認するようにしてみました。


# 最後に

今までは意識してできなかったので、少し意識を変えるだけでも変わっていくんだなと感じることができました。
いいエンジニアライフを送りたいですね。


# ちょっとした宣伝

株式会社ゆめみの23卒のメンバーでアドベントカレンダーを作成しています。
新卒のフレッシュな記事がたくさん投稿予定なので、少しでも興味があれば購読いただけると幸いです！！

https://qiita.com/advent-calendar/2023/yumemi-23-graduation
git statusでファイル名だけ取ってくる方法

### コマンド
```bash
git status -s | rev | cut -d " " -f1 | rev
```

### 実演としては 以下のようになる。
```bash
kubota_akihiro:semantic-attendance-button (master *) $ git status -s
 M README.md
?? .idea/
?? test
kubota_akihiro:semantic-attendance-button (master *) $ git status -s | rev | cut -d " " -f1 | rev
README.md
.idea/
test
```
- コマンドの意味：git status -s で出てくる出力を反転、１列目（ファイル名だけ）を取得、再度反転させて標準な文字の並びに直す。
- 感想；revコマンドの用途が初めてわかった。。そうなると、revコマンドは結構使うタイミングありそう。
Qiita Conference 2023 Autumn 感想

10月25日から３日間開催された「Qiita Conference 2023 Autumn」

残念ながら平日で仕事中だったり家のことをしたりで腰を据えて全部の講演を視聴することはできませんでしたが、個人的に興味深かった内容について感想を書き留めておきたいと思います

# 1日目
<iframe width="560" height="315" src="https://www.youtube.com/embed/PhiIrJiKKuI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

#### クエリ診断 - 大規模システムデータベースの健康診断をどのように実現するか
（株式会社野村総合研究所/ NRIデジタル DXエンジニアリング チーフエキスパート：湯川 勇太）
※ 動画 3:26:24～

業務でSQLを使うことはありますが、書き方については現場でほぼルール化されているのでパフォーマンスについて考えることは案外少なく、改めて勉強になりました
SQL Serverを前提にした方法とのことなので、現場で使っているOracleに置き換えた内容を調べられたら個別記事にしたいかも
また「DBトラブルが発生したらどうなるか」という箇所で、お客さんの中でも偉い人が揃った会議でめちゃくちゃ詰められるというのが親近感と言いますか……
曲がりなりにも動いているものを止める決断に勇気が要るとか、状況を想像できるだけにめちゃくちゃ怖い話でした

# 2日目
<iframe width="560" height="315" src="https://www.youtube.com/embed/pe0vW9AyunQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

#### 基調講演：プログラマーのためのコミュニティ活動の極意
（Rubyコミッター、Ruby on Railsコミッター、RubyKaigi主催：松田 明）
※ 動画 44:58～

個人的にめちゃくちゃ興味があった講演
[参加しているコミュニティ](https://qiita.com/organizations/tech-woman-kansai)でオフラインイベントの担当をさせていただくことになったので、何か参考にならないかなと思って聞きました
とにかくご本人が楽しんで活動されていること、オフラインの活動の大事さというのは参加中のコミュニティで代表が常日頃言っていることの正しさを裏付けられた感じですね
ただし講演内容をそのまま自分も適用できるか、と考えるとコミュニティ属性の違い的にちょっと難しい感じもするので悩ましい
このへんも課題としてどこかで記事にしてみたいと思います

#### 基調講演「関数型プログラミングと型システムのメンタルモデル」
（株式会社一休 / 執行役員 CTO：伊藤 直也）
※ 動画 2:38:50～

COBOLプログラマから始まりJavaに転換した身の上としてはいろいろ思い当たることの多い講演でした
完全に理解できたとは言い難いですが、ロジック作成時に「文」として組むか「式」として組むかというあたりとか、型を「データをソフトウェアに解釈させるための意味づけ」とするあたりはCOBOL時代のあれこれをいろいろ思い出しました
型を定義することで実際に動作させなくてもあり得ない状態が発生しないことを保障できるという話、インプットデータとか実行時のあれこれはあるにしても、プログラム内のロジックだけでもそこが保障されるのは良いですね

#### 「DevRel / 技術広報というキャリアとその醍醐味〜 開発者を支える入口 〜」
（ファインディ株式会社 / DevRel チームリーダー：北川 雅士）
※ 動画 3:23:50～

もともとDevRelという職種が個人的には耳馴染みのないものでしたが、それだけに具体的な仕事の内容をイメージしやすい話が聞けて良かったです
DevRelの仕事によって仕事内容や職場について情報が得やすくなることや技術者同士・技術者と企業の接点が増えるのは個人的には好ましいことと感じます
あと金融向けシステムでの経験については自分の過去の現場を思い返して遠い目をしてしまいました
COBOLが悪いわけではないですがCOBOL案件の現場はなんというかこう、いろいろ思うところが多いです

# 3日目
<iframe width="560" height="315" src="https://www.youtube.com/embed/p_eVjpuzbw4" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

#### 基調講演「スクリプトキディから始めるハッカー実践入門」
Webセキュリティの第一人者、EGセキュアソリューションズ株式会社 / 取締役CTO：徳丸 浩
※ 動画 45:20～

過去にセキュリティ系の資格を勉強して挫折した身、軽い興味と好奇心から視聴しました
スクリプトキディ、と簡単に言うものの実際やろうとするとかなり大変なことがわかります
開発環境から言語から幅広い知識が求められるし、手本を丸コピペして動かせばできるようなものではないのですね
少なくとも講演聴きながら「めんどくさい……」となった私は無理です
これをきっちりできるのであればそれはかなり仕事できる人では？という感想でした

#### SESのメリットを最大限活かす新しい働き方
（株式会社テクニケーション / 代表取締役：西田 拳）
※ 動画 2:06:30～

そこそこ多い転職の中で従来型SESと単価連動型SES両方経験しているので、講演内容を実感として理解できたと思います
私としては単価連動型SESの利点は案件単価が収入に直結するわかりやすさが一番大きいです
金額がそのまま評価になるので、評価する立場としても努力とか人柄とかの点数のつけにくいところで頭を悩ませることが少ないのではないでしょうか
また「生活を維持するには収入がこのくらいあればいけるから、週何日勤務で単価このくらいの案件がいい」みたいに、QOLと収入のバランス調整がしやすいんじゃないかとも思いました
あと講演内容からはそれますが、合間に流れる広告動画が独特の雰囲気でにやりとしました
手軽にできるセキュリティ強化: Basic認証と環境変数

# 手軽にできるセキュリティ強化: Basic認証と環境変数

ウェブアプリケーションを開発する際、セキュリティは非常に重要です。ユーザー名とパスワードを使用してアクセス制御を行うBasic認証はその一例です。また、認証に使用される認証コードやキーをコード内に書くと、セキュリティの脆弱性が生じる可能性があるため、環境変数を利用して隠すことが重要です。

## 1. Basic認証の設定

Basic認証は、ウェブページにアクセスする前にユーザー名とパスワードの認証を行う仕組みです。これにより、許可されていないユーザーからのアクセスを制限できます。Basic認証を使用するには、コントローラー内でユーザー名とパスワードを設定します。これにより、ウェブアプリケーションの一部を保護できます。

## 2. 環境変数を使用して認証コードを隠す

認証に使用されるユーザー名とパスワードなどの認証コードは、コード内に直接書くべきではありません。なぜなら、コードが公開されてしまうとセキュリティ上のリスクが高まるからです。その代わりに、環境変数を利用してこれらの秘密情報を隠しましょう。

## 3. シェルを使用して環境変数を設定

環境変数は、アプリケーション内で利用できる設定情報を格納するための重要な手段です。これらの環境変数を設定するために、シェルと呼ばれるプログラムを使用します。シェルは、ターミナルを通じてOSに命令を送り、その結果をターミナルに返します。

## 4. ログインシェルzshを使用した環境変数の設定

ログインシェルzshは、環境変数を設定するためのツールの一つです。zshを使用することで、環境変数を簡単に定義できます。zshはシェルの一種であり、LinuxやmacOSなど多くのオペレーティングシステムで利用できます。

## 5. 環境変数の設定ファイル「.zshrc」の編集

環境変数は通常、設定ファイルに記載されます。zshの設定ファイルである「.zshrc」にこれらの環境変数を定義します。設定ファイルはテキストファイルで、vimなどのテキストエディタを使用して編集できます。vimはサーバーやターミナル上で使用できる強力なテキストエディタです。通常モードとインサートモードといったモードを持ち、テキストの編集と保存が容易に行えます。

## 6. sourceコマンドを使用して環境変数を設定

最後に、設定ファイル（.zshrcなど）に記述された環境変数を有効にするために、sourceコマンドを使用します。このコマンドは、シェルに記述された内容や編集した内容を実行するために使用されます。

Basic認証を設定し、環境変数を使用して認証コードを隠し、ログインシェルzshの設定ファイルにvimコマンドを使用し環境変数を定義し、sourceコマンドを使って環境変数を設定する方法を紹介しました。これにより、ウェブアプリケーションのセキュリティを向上させ、秘密情報をしっかりと保護できます。
プロになるJava 学習記録

# プロになるJava 学習記録
## 第5章
### BigDecimal
少しわかったような気がした。

### ChatGPTに聞いてみた内容
BigDecimalは、Javaプログラミング言語で提供されている数値データ型の一つです。BigDecimalは、浮動小数点数の精度に関する問題を解決するために使用されます。通常、浮動小数点数を使用すると、小数点以下の桁数が制限され、丸め誤差が発生する可能性があります。しかし、BigDecimalは任意の精度の数値を扱うことができます。

以下は、BigDecimalの主な特徴と使用法の要約です：

高精度: BigDecimalは、任意の桁数の整数と小数点以下の桁を保持できます。これにより、非常に精密な計算を行うことができます。

丸め誤差の回避: 通常の浮動小数点数型（floatやdouble）は、丸め誤差が生じることがあります。BigDecimalはこれを回避し、正確な計算を提供します。

精度の設定: BigDecimalは、数値を保持する際に必要な桁数を指定できます。これにより、特定の精度で数値を表現することができます。

算術演算: BigDecimalは、基本的な算術演算（加算、減算、乗算、除算）をサポートしています。これらの演算は、高精度で行われます。

BigDecimalは主に金融アプリケーションや科学計算など、高精度の計算が必要な場面で使用されます。以下は、BigDecimalを使用した簡単な例です：

```java
import java.math.BigDecimal;

public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("10.25");
        BigDecimal num2 = new BigDecimal("3.5");

        // 加算
        BigDecimal sum = num1.add(num2);
        System.out.println("Sum: " + sum);

        // 乗算
        BigDecimal product = num1.multiply(num2);
        System.out.println("Product: " + product);
    }
}
```
このコードでは、BigDecimalを使用して数値を表現し、加算と乗算を行っています。BigDecimalを使うことで、高精度の計算が実現できます。
## 第10章
・5文字ちょうどの文字列のすべてが「p」を含むか確認する
var data = List.of("apple", "banana", "grape");
var result = true;
for (var fruit : data) {
    if (!fruit.contains("p")) {
        result &= false;
    }
}
System.out.println(result);
・5文字ちょうどの文字列のどれがひとつでも「p」を含むか確認する
var data = List.of("apple", "banana", "grape");
var result = false;
for (var fruit : data) {
    if (fruit.contains("p")) {
        result |= true;
    }
}
System.out.println(result)
paiza.ioでelixir その260

# 概要
paiza.ioでelixirやってみた。
binary、やってみた。

# サンプルコード

```
<<1, 2, 3>>
|> IO.inspect

<<0, "foo">>
|> IO.inspect

#rest = "oo"
#<<102, rest>>
#|> IO.inspect

rest = "oo"
<<102, rest::binary>>
|> IO.inspect

<<"foo"::utf16>>
|> IO.inspect

<<"foo"::utf32>>
|> IO.inspect

<<102:: integer - native, rest:: binary>>
|> IO.inspect

<<102:: native - integer, rest:: binary>>
|> IO.inspect

<<102:: unsigned - big - integer, rest:: binary>>
|> IO.inspect

<<102:: unsigned - big - integer - size(8), rest:: binary>>
|> IO.inspect

<<102:: unsigned - big - integer - 8, rest:: binary>>
|> IO.inspect

<<102:: 8 - integer - big - unsigned, rest:: binary>>
|> IO.inspect

<<102, rest:: binary>>
|> IO.inspect

<<name:: binary - size(5), " the ", species:: binary>> = <<"Frank the Walrus">>
|> IO.inspect

{name, species}
|> IO.inspect

#<<name:: binary, " the ", species:: binary>> = <<"Frank the Walrus">>
#|> IO.inspect

x = 1
<<x:: 8>> == <<x:: size(8)>>
|> IO.inspect

<<x:: 8 * 4>> == <<x:: size(8) - unit(4)>>
|> IO.inspect


<<int:: integer>> = <<-100>>
|> IO.inspect

int
|> IO.inspect

<<int:: integer - signed>> = <<-100>>
|> IO.inspect

int
|> IO.inspect


<<-100:: signed, _rest:: binary>> = <<-100, "foo">>
|> IO.inspect

<<number:: little - integer - size(16)>> = <<0, 1>>
|> IO.inspect

number
|> IO.inspect

<<number:: big - integer - size(16)>> = <<0, 1>>
|> IO.inspect

number
|> IO.inspect

<<"Hello, ", place:: binary>> = "Hello, World"
|> IO.inspect

place
|> IO.inspect

defmodule ImageTyper do
  @png_signature <<137::size(8), 80::size(8), 78::size(8), 71::size(8), 13::size(8), 10::size(8), 26::size(8), 10::size(8)>>
  @jpg_signature <<255::size(8), 216::size(8)>>
  def type(<<@png_signature, rest::binary>>), do: :png
  def type(<<@jpg_signature, rest::binary>>), do: :jpg
  def type(_), do: :unknown
end




```

# 実行結果

```
<<1, 2, 3>>
<<0, 102, 111, 111>>
"foo"
<<0, 102, 0, 111, 0, 111>>
<<0, 0, 0, 102, 0, 0, 0, 111, 0, 0, 0, 111>>
"foo"
"foo"
"foo"
"foo"
"foo"
"foo"
"foo"
"Frank the Walrus"
{"Frank", "Walrus"}
<<1>>
<<0, 0, 0, 1>>
<<156>>
156
<<156>>
-100
<<156, 102, 111, 111>>
<<0, 1>>
256
<<0, 1>>
1
"Hello, World"
"World"
```

# 成果物

https://paiza.io/projects/Lz5hlo08Gy2LgEtsS6KqrQ


以上。
Leetcode 1441. Build an Array With Stack Operations

https://leetcode.com/problems/build-an-array-with-stack-operations/description/

```java
class Solution {
    public List<String> buildArray(int[] target, int n) {
        ArrayList<String> result = new ArrayList<>();
        
        int index = 0;
        int currNum = 1;

        while (index < target.length && currNum <= n) {
            int num = target[index];
            if(num == currNum){
                index++;
                currNum++;
                result.add("Push");
            } else {
                result.add("Push");
                result.add("Pop");
                currNum++;
            }
        }
        return result;
    }
}
```

https://www.youtube.com/watch?v=EuwzqTboQwQ
EC2 プレイスメントグループまとめ

## プレイスメントグループとは

EC2インスタンスの配置戦略をコントロールできる機能。
以下の3種類の戦略があるので概要をまとめておく。

- クラスター
- スプレッド
- パーティション

###  クラスター

![スクリーンショット 2023-11-03 20.17.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/03e3087c-ae9f-11cc-26e3-54d2c90db65c.png)

- １つのAZ内の低レイテンシグループにインスタンスを集中配置
- インスタンス間が物理的に近いためネットワーク性能は高い。インスタンス間で10Gbps。
- ラックが故障すると全てのインスタンスが同時に故障してしまう

### 　スプレッド

![スクリーンショット 2023-11-03 20.17.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/398f6a65-1c33-5b07-3196-59555fcb1afc.png)

- インスタンスを別々のハードウェアに分散。高可用性を実現
- 制約：１グループあたり最大７インスタンス/AZ

###  パーティション

![スクリーンショット 2023-11-03 20.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/25a58f98-6855-efe6-d06a-e1ce402a9ff3.png)

- AZ内の多数のパーティション（サーバラック）に分散配置
- 7パーティション/1AZ
- パーティション間はサーバラックを共有しない
- １グループあたり数百台のEC2インスタンスを配置可能



### 参考
https://dev.classmethod.jp/articles/ec2-placement-group-strategy/