OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkins pipelineでスクリプトの実行結果を取得

jenkins pipelineでジョブを作成中、スクリプトの実行結果を変数として取得して使用したかったのですが意外と方法が分からず、調べた結果のメモとして記録します。

```groovy
pipeline {
    agent any
    environment {
        TARGET_DATE = ""
    }
    stages {
        stage('test') {
            steps {
                script {
                    def result = sh (
                        script:"date --date '7 day ago' +%Y%m%d",
                        returnStdout:true
                        )
                    TARGET_DATE = result
                
                    echo "${TARGET_DATE}"
                    // 20230707
                }
            }
        }
    }
}
```

`script{}`内に関数を定義し、`returnStdout:true`にすることでスクリプトの実行結果が取得でき、グローバル変数が更新されました。

ちなみに次のように`returnStatus:true`にすると終了コードが取得できます。
```groovy
pipeline {
    agent any
    stages {
        stage('test') {
            steps {
                script {
                    def result = sh (
                        script:"date --date '7 day ago' +%Y%m%d",
                        returnStatus:true
                        )

                    if (result != 0) {
                        error("FAILED to get date.")
                    }
                }
            }
        }
    }
}
```
計算量とオーダー記法：コンピュータ科学の基礎

## はじめに
コンピュータ科学の世界では、アルゴリズムの効率を評価するために「計算量」という概念が頻繁に使用されます。この記事では、計算量とオーダー記法について解説します。

## 計算量とは何か
計算量は、ある処理を行うために必要なリソースの量を示す指標で、時間計算量と空間計算量の2つの主要な種類があります。時間計算量は、アルゴリズムが問題を解決するために必要な計算ステップの数を示します。一方、空間計算量は、アルゴリズムが問題を解決するために必要なメモリの量を示します。計算量を表現するために広く使用される記法が「オーダー記法」です。

## オーダー記法とは何か
計算量を表現するために広く使用される記法が「オーダー記法」です。オーダー記法は、アルゴリズムの計算量を表現するための記号で、データ量がnであったとき、どれくらいの計算が必要になるかを示します。

### オーダー記法の例
オーダー記法は、アルゴリズムの計算量を表現するための記号で、データ量がnであったとき、どれくらいの計算が必要になるかを示します。以下に、いくつかの主要なオーダー記法の例を示します。

#### O(1)
> これは「定数時間」とも呼ばれ、データ量に関係なく一定の計算量で処理が完了することを示します。これは、配列の特定の要素へのアクセスなど、一定時間で実行できる操作を表します。
#### O(logn)
> これは「対数時間」とも呼ばれ、データ量が増えても計算量が対数的にしか増えないことを示します。これは、バイナリサーチなど、データを半分に分割して問題を解決する操作を表します。
#### O(n)
> これは「線形時間」と呼ばれ、データ量と同じ量の計算が必要であることを示します。これは、配列の全要素を走査するなど、データ量に比例する時間がかかる操作を表します。
#### O(nlogn)
> これは「線形対数時間」とも呼ばれ、データ量とその対数の積に比例する計算が必要であることを示します。これは、クイックソートやマージソートなど、効率的なソートアルゴリズムを表します。
#### O(n**2)
> これは「二乗時間」とも呼ばれ、データ量の二乗に比例する計算が必要であることを示します。これは、バブルソートや選択ソートなど、比較的効率の悪いソートアルゴリズムを表します。

これらのオーダー記法は、アルゴリズムの効率を比較する際の基準となります。一般的には、O(1)、O(logn)、O(n)、O(nlogn)、O(n^n)の順に効率が良いとされます。ここでは言及していませんが、O(2^n)や0(n!)にはならないように心がけましょう。

## 終わりに
計算量とオーダー記法の理解は、アルゴリズムの選択やアプリケーションのチューニングにおいて重要な役割を果たします。さまざまなデータ構造を理解し、その計算量を把握することで、効率的なアルゴリズム設計やデータ構造の選択が可能になります。これらの概念を理解し、適切に適用することで、より効率的でパフォーマンスの高いコードを書くことができます。
Macの漢字変換で思わぬ漢字に変換される問題のお手軽解消法

以前から時々「おや？」となる事象として、日本語の文章をタイプしていると思わぬ形に漢字変換されていることがありました。今日も「まえしょり」と入力して変換すると…

「本社棟」

…となりました！なんでやねん。なんでやねん:expressionless:
ということで、とりあえずサッと直す方法がないかを探してみたので、共有いたします。

### 変換学習をリセットする

なんか文字入力＆変換の結果を学習しているみたいで、その学習が変な方向に行くと上記のような形になるそうです。とりあえず学習結果をリセットすることができるそうなので、今回はリセット対応することにしました。

#### 方法
１）「システム設定」を開く
２）左側の一覧から「キーボード」を選択
３）右側の領域で「テキスト入力」セクションの「入力ソース」のところにある「編集...」ボタンをクリック
４）新たに開いたダイアログの左側で「日本語-ローマ字入力」を選択
５）右側のコンテンツを一番下までスクロール
６）「変換学習：リセット」とあるので、「リセット」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325718/83a233e7-7dbc-b3fd-0bf8-14f1f8cfa3ea.png)

以上です！

ちなみに、そのあとGoogleの漢字変換をインストールし、今はそちらを使っています。
ご参考まで。
【SQL】DISTINCTの使い方・特徴

SQLの学習を行なっています。

Ruby on Railsでは、ActiveRecordという仕組みによって、SQLを直接指定せずともデータを扱う事ができます。

ただ、SQLは開発において必ず必要であるため、SQLコマンドを使ったデータの取り扱いについては出来るようにならなければなりません。


# テーブル
songsテーブル

#### カラム
- name（曲名）
- release_year（発売年）

# 課題
楽曲の発売年一覧を重複行を削除して取得する。
release_year(発売年)です。

# ポイント
"songs"というテーブルから"release_year"という列のデータを重複なく取得する

# 回答

```SQL
SELECT DISTINCT release_year
FROM songs;
```


# 解説
- SELECTで取得するのは、`release_year`だけで良い。
- `SELECT * `としてしまうと、テーブルすべてのカラムを一覧で取得することになるので、今回のやりたいこととは異なる。
- `DISTINCT`は、`SELECT`の対象のデータにおいて、重複する行（レコード）を1つにまとめてくれる。


# 感想
- 直前にDELETE構文などを学習していたこともあり、deleteを使ってなんとかしようとしていましたが、全然見当違いでした。
- チートシートなどを探すとすぐに分かります（笑）


# 参考サイト
以下の記事を参考にさせて頂きました。

https://www.sejuku.net/blog/54990

https://qiita.com/riita10069/items/f2df509c31d89eeed36e
自分専用のwsl再インストール時に見る記事一覧

# wsl再インストールメモ
https://qiita.com/porizou1/items/8c58682c454fe0f8e19e

https://osanshouo.github.io/blog/2022/05/30-wsl-font/

https://zenn.dev/ignorant/articles/wsl2_alpine_docker

https://ja.eyewated.com/linux%E3%81%AEtarballs%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/

https://qiita.com/shinsaka/items/71a234e71ebca3daf3c9

https://kb.seeck.jp/archives/17024

https://qiita.com/oligami/items/a9db3e98b04a7ea956c4

https://docs.github.com/ja/get-started/getting-started-with-git/setting-your-username-in-git

https://qiita.com/tora_oba/items/2761452fe8c2b0035ba0

https://qiita.com/yoshiyasu1111/items/17d9d928ceebb1f1d26d

https://rustup.rs/
PythonとAIの密接な関係性！これから必須のプログラミングスキルを徹底解説

Python(パイソン)とは、その可読性と簡潔さから世界中のエンジニアに愛されているプログラミング言語です。特に、AI（人工知能）の分野ではその特性が生かされ、広く利用されています。Pythonは、ライブラリやフレームワークが豊富で、深層学習を行うためのTensorFlowやPyTorchといったツールが利用できます。これらのツールがPythonのシンプルな文法と結びつくことで、AI開発の敷居は格段に下がりました。

私自身もPythonを使ったAI開発に携わっており、その可能性と使いやすさには日々感動しています。特に注目すべきは、京都大学や東京大学など日本の名門大学で開発されているChainerやCupyといったPythonライブラリです。これらはPythonを使ったAI開発のパイオニア的存在であり、私自身もこれらを使ってAIの研究を行ってきました。


AIとPython(パイソン)の結びつき：GPUの力を引き出す手法と、日本の最先端事例を徹底解説 

https://maricablog.com/?p=788


プログラミングの初心者でも大丈夫！Python(パイソン)を使った実践的学習法を経験から探求 

https://maricablog.com/?p=786


初心者から上級者へ！プログラミングPython(パイソン)学習の完全ガイド〜私の体験から学ぶ最善の学習方法 

https://maricablog.com/?p=784


成功への道筋！Pythonプログラミング学習方法とその実践例：世界のトップ企業が活用するスキル習得法 

https://maricablog.com/?p=782


【ビッグデータ大全】分析・解析から活用へ マーケティング、医療、Pythonまで完全網羅 

https://maricablog.com/?p=440
Javescriptを独学で極める方法！

こんにちは、まりかです。

今日は「Javascript」を独学で極める方法について書きました。

ノーコード、ローコードが主流になるなか、
まだまだ現役の「Javascript」

その解説です！

初心者がマスターするJavaScript学習法：独学で成功する具体的ステップとリソース 

https://maricablog.com/?p=792 


JavaScript資格取得で開花！～仕事に生きる現実的なスキルとその取得法～ 

https://maricablog.com/?p=900 


年収がアップする！JavaScriptエンジニアの現状と業界動向：日本の具体的な事例と解説 

https://maricablog.com/?p=903
TypeScriptでデザインパターンを考えてみる(Singleton編)

# この記事は？
オライリー社から出版されている「HeadFirst デザインパターン」を読んだ内容を
理解の整理のためTypeScriptで実装してみる内容です。（定期で載せれる様がんばる）

https://www.oreilly.co.jp/books/9784873119762/

# 対象となるデザインパターン

Singletonパターン

https://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

# コードで書いてみる

TSで実装してみると以下のようになります。

```index.ts
// 必ず一つのインスタンスだけを生成するクラス
class Singleton {
  private static instance: Singleton; // クラス変数を定義して、それを一意のインスタンスとして保持する
  name: string;

  // コンストラクターをprivateで定義するのがポイント。内部からだけ初期化できるようになる
  private constructor(name: string) {
    this.name = name;
  }

  // Singletonインスタンスを呼び出すためのメソッド
  // このメソッドがコンストラクターとしてコールされる
  static getInstance(name: string): Singleton {
    if (Singleton.instance === undefined) Singleton.instance = new Singleton(name);

    return Singleton.instance;
  }
}
```

以上です。名前の通り、実装もシンプルですね。
実際に一つのインスタンスが保障されているか確認してみます。

```検証用コード.ts
const first = Singleton.getInstance("first");
console.log(first.name); // => first

const second = Singleton.getInstance("second");
console.log(second.name); // => first

console.log(first === second); // => true
```

ちゃんと動作している様ですね。

# 使い所
正直、自分が仕事で触っているサービスでは、Singletonを使用したいケースは思いつきませんでした。
なので、どのような時にこのデザインパターンが使われるのかあまり想像できなかったので、ググってみました。

以下のサイトの記事がわかりやすかったので、転載させていただきます。

https://debimate.jp/2020/04/26/%E3%80%90singelton%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%80%91%E8%80%83%E3%81%88%E6%96%B9%E3%81%AF%E5%8D%98%E7%B4%94%E3%81%A0%E3%81%8C%E3%80%81%E4%BD%BF%E3%81%84%E3%81%A9%E3%81%93%E3%82%8D%E3%81%8C/

こちらのサイトによると、Singletonはむやみやたらに使うべきではなく、使うべきかどうか判断を行った方が良さそうですね。（あたりまえのことですが、大事な事です。）

一般的には以下のような機能を実装する際にSingletonが使用されるみたいです。

- ロギング
- キャッシュ管理
- スレッドプール管理
- データベース接続ドライバ
- ソケット制御ドライバ

一覧で見てみると、使い所のイメージが少し湧いてきそうですね。

# Singletonを使う際の注意点

参考書では、マルチスレッドを使用した実装の際は注意するよう、紹介されていました。
マルチスレッドを使用した場合、Singletonでも一意性を担保できない場合があるようです。

参考書では対応方法として、
非同期処理を同期的に動作させる `synchronized` (JSでいうところの `Promise` のような機能) や、二重チェックロッキングを行う `volatile` (調べたところJSではこのような機能はなさそう)などの方法が紹介されていました。
(参考書のコードは全てJavaで実装されてます)

## 余談: JavaScriptでのマルチスレッド

JavaScriptの実行環境は主にブラウザかnodeが想定されます。
基本的には両者ともシングルスレッドで動作するようですが、共にマルチスレッドで動かす方法もあるみたいです。
- ブラウザ: WebWorkersなど
- node: clusterなど

しかしJavaScriptには`volatile`のような二重チェックロッキング機能はないので、Javaのようにコードで安全性を担保するのは難しそうです。（自分の調べた範囲では。）
なので結論としては

「マルチスレッドは使用しない」
or
「マルチスレッドを使用するときはスレッドセーフな実装をするよう気を付ける」

を心がける必要があるのかなと思います。

# まとめ

名前の通りシンプルなデザインパターンで、目的と実装がイメージしやすい印象でした。
仕事で使うシーンはあんまりないかもしれませんが、こういったデザインパターンがある、ということを知っておくことがリテラシー的な意味で大事かなと思います。

また、Singletonを通して、マルチスレッドの仕組みや理解が深まったのが、個人的には一番の成果だったかな、と感じました。

次回は「Commandパターン」だ。継続でがんばるぞー。
Next.js 12 ISRで、postリクエストで、表示を変更する

next.js 12 ISRで、postをうけてweb描画の表示を変更したいというニッチな要件がでてきたので対応。
ニッチすぎて、まったく情報がでてこなかったので、メモ代わりに。もっと良い方法があるような。

説明していること next.jsで、postリクエストを受ける
説明してないこと next.js ISRの仕組み

getServerSidePropsで
GetServerSidePropsContextで受けて、requestとresponseを処理する、promiseを作成する。

ISRは、定期的にアクセス毎にページを作成しますが、revalidateを設定しなければ、アクセスのたび、動的に作成します。

（参考）
https://www.sukerou.com/2022/02/nextjs-getserversideprops.html
参考ページでは、promisify　bodyParserを使用していましたが、ライブラリを追加したくないのと、型問題が解決できなかったので、処理部分を作成しました。



```
import { GetStaticProps, GetStaticPropsContext, NextPage } from 'next';

const SlugPage: NextPage<Prop> = (props) => {
  return <></>;
};

export const getServerSideProps: GetServerSideProps = async (context: GetServerSidePropsContext) => {
    const { req, res, query } = context
    let postData: string = '';
    if (req.method == 'POST') {
        postData = await new Promise(resolve => {
            let addChunk: string = '';
            req.on('readable', () => {
                let chunk: string;
                while (null !== (chunk = req.read())) {
                    addChunk += chunk
                }
            })
            req.on('end', () => {
                resolve(addChunk)
            });

        });
    }
   //post データをつかって処理するprops作成する
    const pageProps = await getpageProps(postData.toString())
    return {
        props: pageProps
    };
};
```
PowerAutomateを使ってTeamsの投稿に対してリマインダーする（アンケートなど）～ 概要編 ～

# はじめに
私の部署ではアンケートなどが実施されると
Teamsに回答依頼の投稿を行い
その投稿に対してリアクション:thumbsup:してもらい
未対応者を確認できるような運営をしている

しかし期限の何日か前に未対応者に対して
個別にメンションを行いリマインドを送っていた

未対応者の洗い出しや、メンションにかける工数を
勉強中のPowerAutomateを使って削減できないかと考えた


# 結論
### 投稿を選択して、リアクションがない人に対するメンションの自動化までを実施
+ **該当の投稿を選択し、PowerAutomateのフローを選択して実行する**
⇒ 3日前リアクションがない人に対してメンションをするまでを実装できた

# 感想
初めて触るPowerAutomateだったため、Teams投稿やいいねの集計など役割ごとにアクションを別けて動作確認していき、最後に合体させると作りやすかった

### 今後の課題
+ **〇日前と当日と、リアクションしていないメンバーへの通知の処理を共通化する**
※現状だと遅延設定にて同じリマインドフローを実行する必要がある
+ **PowerAppsと連携させて、投稿文をテンプレート化し入力項目を削減**
+ **通知のタイミングを土日を考慮してリマインドを実施する**

# 目次
1. [概要図](#C1)
1. [簡単な解説](#C2)
1. [参考文献](#ref)

<a id="#C1"></a>
# 概要図
**とりあえず全体の概要図は以下の通り**
**細かい説明は別の記事で記載予定**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/54aebb8d-775d-0121-9ee0-a82a26633b1e.png)


<a id="#C2"></a>
# 簡単な解説
**1.リマインドさせたいメッセ―ジを選択してアダプティブカードにて期限日を指定する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/51adb16b-ae90-96d0-ca1b-4f8ca0c57be2.png)


**2.時間の加工**
・1.で指定した日から3日減算させる
・後述の遅延処理で利用するため時間追加させるためにタイムゾーンを協定世界時に変換させる
・始業の9時にリマインドするための時間追加処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/45464410-d5f0-e97c-c7ee-e1029f97a6eb.png)


**3.メンバー一覧を配列変数に格納**
1.で選択したメッセージのチームIDよりグループメンバー一覧を取得
メンバー一覧を格納する配列を定義
役職（jobTitle）がある人を配列に入れないように条件式で選別
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/87882e66-63c3-d9f1-107c-23595adde0aa.png)


**4.遅延設定**
2.で設定した期限の3日前に移行のアクションを実施するように遅延を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/8cea35b7-6208-8dcb-02ce-97344d552f77.png)


**5.リアクションしたメンバーの抽出**
・リアクションしたメンバーを格納するための配列を定義
・1.で選択したメッセージの詳細情報を取得する
・JSONの解析でメッセージの詳細情報 ※詳細は参考文献に記載
・リアクションしたメンバーの情報を変数へ格納
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/5cbf95b5-94c9-be4f-12bc-2a22406bd286.png)


**6.リアクションしていないメンバーの抽出**
・リアクションしていないメンバーを格納するための配列を定義
・グループメンバーと5.で定義したリアクションしたメンバーの差分を変数へ格納

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/813e625c-a2b4-b446-58c8-a59649d018c3.png)



**8.リアクションしていないメンバーへTeamsでメンション**
・リアクションしていないメンバーからメンショントークンを作成
・1.で選択したメッセージに対してメッセージを投稿する
　※メンションは現状Teamsの仕様上20人までしか指定できないため
　　それ以上メンションをする必要がある場合は考慮が必要
　　代替手段としては、@allなどチャネルへメンションするなど

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919986/50f022c0-a9ea-533c-a407-052707cb4dc9.png)



本当はこの後に前日や当日での遅延設定を行い
同様にリアクションしていないメンバーへのメンションフローを実施する必要があるのですが、
処理が同じのためループによって作成したい
というところで実装検討中・・・

アクションの細かい説明については別の記事で紹介予定



# こちらでアクションの詳細を記載(2024/07/23)
　[PowerAutomateを使ってTeamsの投稿に対してリマインダーする（アンケートなど）～ 詳細編 ～
](https://qiita.com/ctc-m-yomo/items/43444848b3f8b104f082)



以下、作る際に参考にしたサイト
<a id="#ref"></a>
# 参考文献
- 5.のJSONの解析の参考
　[Teamsでリアクションした人をPowerAutomateで一覧作成し取得する](https://note.com/loto0704/n/n0b9138ac9692)

- 8.の複数人へのメンションメッセージ投稿の参考
　[【Power Automate】Teamsで複数人へメンション付きメッセージを送る](https://www.teijitaisya.com/powerautomate-mention-multicast/)
MPAとSPAの違い

MPAとSPAについての知見が浅かったので一度まとめてみます。
※CSR、SSR、SSR、ISGなどあるがここでは基本だけとします。

## MPA(Multiple Page Application)とは
複数のHTMLページで構成。従来のWebサイトの通信方法。

レンダリングとは(それぞれの役割で異なる)
クライアント側・・・HTMLファイル等を読み込んで画面に描画
サーバー側・・・HTMLコードを生成する

### <通信パターン>
1. クライアント・・・Webサイトを表示するためのGETリクエストをサーバーに送る。
2. サーバー・・・POSTレスポンスとしてHTMLを返す
3. クライアント・・・ブラウザでHTMLファイルをパース
4. クライアント・・・CSSファイルとJSファイルの参照の解析
5. クライアント・・・HTMLのパース後、DOMツリーを生成
6. クライアント・・・CSSのパース後、[CSSOMツリー](https://developer.mozilla.org/ja/docs/Glossary/CSSOM)を生成
7. クライアント・・・スタイルをDOMに適用する
8. クライアント・・・JavaScriptのパース、実行

## SPA(Single Page Application)とは
1つのHTMLファイルでページのコンテンツを全て管理して表示する開発手法。

### <通信パターン>
1. クライアント・・・Webサイトを表示するためのGETリクエストをサーバーに送る。
2. サーバー(フロント)・・・レスポンスとして全てのリソース(HTML, CSS, JavaScriptなど)を返す
3. クライアント・・・ブラウザでHTML, CSS, JavaScriptを全てをパースと実行(初回のみ)
4. クライアント・・・2回目以降のリクエストは差分情報のみをサーバーにリクエスト
5. サーバー(バックエンド)・・・JSON形式で返す
6. クライアント・・・差分箇所のJSONをJavaScriptでHTMLに追加
7. 以降4～6の繰り返し

### SPAのメリット
- ページ遷移がスムーズでパフォーマンスが向上

### SPAのデメリット
- 初期表示が遅い。Webサーバーへ初回リクエストでアプリケーションに必要なリソースを全て受け取るため全てをレンダリングするのに時間がかかる。
- 開発コストがかかる。JSファイルのサイズが大きくなりがち。

### MPAのメリット
- ローコストで実現可能。

### MPAのデメリット
- サーバーへのアクセス回数の増加。ページごとにサーバーへリクエストするため、毎回ページ全体の再レンダリングが発生。

## 参考
[フロントエンド研修【MIXI 23新卒技術研修】](https://speakerdeck.com/mixi_engineers/2023-frontend-training)
[MPA vs. SPA 🚀 Astroドキュメント](https://docs.astro.build/ja/concepts/mpa-vs-spa/)
[フロントエンドの HTMLレンダリング手法と周辺技術について理解する - Qiita](https://qiita.com/knike/items/7999b16a60888f7824ef#32-mpa)
cscの作法 その404

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
カメラキャプチャしてmp4ファイルを生成する、ffmpegのフロントエンドを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/afdc7261-d188-ce3e-2975-6d1779a8c5e5.png)


# サンプルコード

```

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Windows.Forms;

namespace App
{
	class form1: Form {
		TextBox textBox0;
		TextBox textBox1;
		TextBox textBox2;
		StreamWriter inputWriter;
		form1() {
			Text = "ffmpeg";
			ClientSize = new Size(300, 300);
			Label label0 = new Label();
			label0.Location = new Point(20, 50);
			label0.Text = "Camera";
			textBox0 = new TextBox();
			textBox0.Location = new Point(30, 80);
			textBox0.Text = "USB2.0 VGA UVC WebCam";
			Label label1 = new Label();
			label1.Location = new Point(20, 110);
			label1.Text = "Format";
			textBox1 = new TextBox();
			textBox1.Location = new Point(30, 140);
			textBox1.Text = "yuv420p";
			Label label2 = new Label();
			label2.Location = new Point(20, 170);
			label2.Text = "File";
			textBox2 = new TextBox();
			textBox2.Location = new Point(30, 200);
			textBox2.Text = "webcam.mp4";
			Button btn1 = new Button();
			btn1.Location = new Point(50, 230);
			btn1.Text = "start";
			btn1.Click += btn1_Click;
			Button btn2 = new Button();
			btn2.Location = new Point(150, 230);
			btn2.Text = "stop";
			btn2.Click += btn2_Click;
			Controls.AddRange(new Control[] {
				label0, 
				textBox0,
				label1, 
				textBox1,
				label2, 
				textBox2,
				btn1,
				btn2
			});
		}
		void btn1_Click(object sender, System.EventArgs e) {
			Console.WriteLine("ok0");
			Process p = new Process();
			p.StartInfo.FileName = "ffmpeg.exe";
			p.StartInfo.Arguments = "-hide_banner -f dshow -i video=\"" + textBox0.Text + "\" -vf format=" + textBox1.Text + " " + textBox2.Text;
			p.StartInfo.RedirectStandardInput = true;
			p.StartInfo.RedirectStandardOutput = true;
			p.StartInfo.RedirectStandardError = true;
			p.StartInfo.CreateNoWindow = true;
			p.StartInfo.UseShellExecute = false;
			p.Start();
			inputWriter = p.StandardInput;
		}
		void btn2_Click(object sender, System.EventArgs e) {
			Console.WriteLine("ok1");
			inputWriter.WriteLine("q");
			MessageBox.Show("Saved!!");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new form1());
		}
	}
}





```


以上。
cscの作法 その403

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
画面キャプチャしてgifアニメを生成する、ffmpegのフロントエンドを書け。



# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5e4eddb8-22a0-3c1a-0cd8-02c7318a1c8b.png)


# サンプルコード

```


using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Windows.Forms;

namespace App
{
	class form1: Form {
		StreamWriter inputWriter;
		form1() {
			Text = "ffmpeg";
			ClientSize = new Size(300, 180);
			Label label = new Label();
			label.Location = new Point(20, 20);
			label.Text = "DesktopCapture";
			label.Font = new Font("Geneva", 20, FontStyle.Regular);
			label.BackColor = Color.Azure;
			label.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
			label.AutoSize = true;
			Button btn1 = new Button();
			btn1.Location = new Point(50, 100);
			btn1.Text = "start";
			btn1.Click += btn1_Click;
			Button btn2 = new Button();
			btn2.Location = new Point(150, 100);
			btn2.Text = "stop";
			btn2.Click += btn2_Click;
			Controls.AddRange(new Control[] {
				label,
				btn1
				//btn2
			});
		}
		void btn1_Click(object sender, System.EventArgs e) {
			Console.WriteLine("ok0");
			Process p = new Process();
			p.StartInfo.FileName = "ffmpeg.exe";
			p.StartInfo.Arguments = "-video_size 1366x768 -framerate 15 -f gdigrab -i desktop -y desktop.gif";
			p.StartInfo.RedirectStandardInput = true;
			p.StartInfo.RedirectStandardOutput = true;
			p.StartInfo.RedirectStandardError = true;
			p.StartInfo.CreateNoWindow = true;
			p.StartInfo.UseShellExecute = false;
			p.Start();
			inputWriter = p.StandardInput;
			System.Threading.Thread.Sleep(5000);
			Console.WriteLine("ok1");
			inputWriter.WriteLine("q");
			MessageBox.Show("Saved!!");
		}
		void btn2_Click(object sender, System.EventArgs e) {
		}
		[STAThread]
		public static void Main() {
			Application.Run(new form1());
		}
	}
}





```

以上。
cscの作法 その402

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
マンデルブロー動画ファイルを生成する、ffmpegのフロントエンドを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/973c4ffe-aaea-5117-7873-ba6b7921ec12.png)


# サンプルコード

```

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Windows.Forms;

namespace App
{
	class form1: Form {
		StreamWriter inputWriter;
		form1() {
			Text = "ffmpeg";
			ClientSize = new Size(300, 180);
			Label label = new Label();
			label.Location = new Point(20, 20);
			label.Text = "マンデルブロー";
			label.Font = new Font("Geneva", 20, FontStyle.Regular);
			label.BackColor = Color.Azure;
			label.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
			label.AutoSize = true;
			Button btn1 = new Button();
			btn1.Location = new Point(50, 100);
			btn1.Text = "start";
			btn1.Click += btn1_Click;
			Button btn2 = new Button();
			btn2.Location = new Point(150, 100);
			btn2.Text = "stop";
			btn2.Click += btn2_Click;
			Controls.AddRange(new Control[] {
				label,
				btn1,
				btn2
			});
		}
		void btn1_Click(object sender, System.EventArgs e) {
			Console.WriteLine("ok0");
			Process p = new Process();
			p.StartInfo.FileName = "ffmpeg.exe";
			p.StartInfo.Arguments = "-f lavfi -i mandelbrot -c:v libx264 -pix_fmt yuv420p -crf 20 -y mandelbrot.mp4";
			p.StartInfo.RedirectStandardInput = true;
			p.StartInfo.RedirectStandardOutput = true;
			p.StartInfo.RedirectStandardError = true;
			p.StartInfo.CreateNoWindow = true;
			p.StartInfo.UseShellExecute = false;
			p.Start();
			inputWriter = p.StandardInput;
		}
		void btn2_Click(object sender, System.EventArgs e) {
			Console.WriteLine("ok1");
			inputWriter.WriteLine("q");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new form1());
		}
	}
}





```

以上。
OpenCV C++でvar()の値を求める

PythonのOpenCVにあるvar()メソッドですが、C++にはこれに相当するものが見当たらなかったので、メモ。
単純に、標準偏差を2乗すれば得られました。
```c++
    cv::Mat img;
    img = cv::imread("/path/to/img.jpg");
    cv::Mat mean;
    cv::Mat sigma;
    cv::meanStdDev(img, mean, sigma);
    double avg = mean.at<double>(0, 0); // mean
    double var = sigma.at<double>(0, 0);
    var *= var; // var
```
WSL2でDev Containersが使えなくなったときの対処法

WSL2でDev Containersが使えなくなった問題の解決方法を小ネタとして記事にしました.

## 環境
Windows11 Pro 22H2
WSL2 Ubuntu 
Visual Studio Code 1.18.0
Dev Containers v0.299.0
Docker version 24.0.4(WSL上にインストール)

## 問題
コンテナにDev Containersからアクセスしようとすると次のようなエラーが表示される(name/id の隣の空白はコンテナ名). 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371788/de5568dc-a372-ce4b-be7b-9f31f02f6dd1.png)

Choose Containerを選択するとDockerがインストールされているにも関わらず, 次のようなエラーが表示される.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371788/f9890bb8-4f1d-4253-59b2-3b453689790b.png)


## 解決方法
VSCodeの設定からDev > Containers: Execute In WSLを有効にする.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371788/a3152d17-9dd4-0fa8-8091-1453bd2857b7.png)
実例で学べるオープンなPublic GraphQL APIまとめ

先日「[最強の犬APIを作るぞ！](https://qiita.com/moroi/items/393f844035d4588a2f48)」と意気込んでせっせとNestJSなんかをいじっていたのですが、よくよく考えるとそもそもGraphQLを数えるほどしか触ったことがないことに気づきました。
というか多分Contentfulでおずおずと触った1回きりです。

`edges`や`node`と言われても何ひとつピンときません。
これで最強の犬APIが作れるでしょうか。否。

そこでGraphQLについて学ぶべく、

- **GraphiQLが公開**されていて
- ある程度の期間運営されていて
- ある程度アップデートされ続けている

GraphQLを探してまとめてみました。

# Contentful

先述のContentfulのデモAPI。

- [GraphiQL](https://graphql.contentful.com/content/v1/spaces/f8bqpb154z8p/explore?access_token=9d5de88248563ebc0d2ad688d0473f56fcd31c600e419d6c8962f6aed0150599&query=%7B%0A%20%20lessonCollection(where%3A%20%7B%20%0A%09%09OR%3A%20%5B%0A%09%09%09%7B%20title_contains%3A%20%22content%22%20%7D%2C%0A%09%09%09%7B%20title_contains%3A%20%22SDK%22%20%7D%0A%09%09%5D%0A%20%20%7D)%20%7B%0A%20%20%20%20items%20%7B%0A%20%20%20%20%20%20title%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20modulesCollection(limit%3A%202%2C%20skip%3A%201)%20%7B%0A%20%20%20%20%20%20%20%20total%0A%09%09%09%09limit%0A%09%09%09%09skip%0A%20%20%20%20%20%20%20%20items%20%7B%0A%20%20%20%20%20%20%20%20%20%20...imageUrl%0A%09%09%09%09%09...%20on%20LessonCodeSnippets%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20title%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20...%20on%20LessonCopy%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20sys%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20title%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0Afragment%20imageUrl%20on%20LessonImage%20%7B%0A%20%20title%0A%20%20image%20%7B%0A%20%20%20%20url%0A%20%20%7D%0A%7D)
- [ドキュメント](https://www.contentful.com/developers/docs/tutorials/general/graphql/)

# Countries API

国API。
国名や大陸名、公用語なんかの情報が取得できるようです。


- [GraphiQL](https://countries.trevorblades.com/)
- [ドキュメント](https://github.com/trevorblades/countries)

# EAN-Search API

バーコード(？)から4億件近い製品を検索できるAPI。

- [GraphiQL](https://api.ean-search.org/graphql)
- [ドキュメント](https://www.ean-search.org/blog/graphql-ean-api.html)

# Saleor API

ECプラットフォーム「Saleor」の管理者向けデモAPI。

- [GraphiQL](https://demo.saleor.io/graphql/)
- [ドキュメント](https://docs.saleor.io/docs/3.x/api-reference/)


# Rick and Morty API

アメリカのテレビアニメのAPI。
リック・アンド・モーティというものを初めて知ったのですが[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%83%A2%E3%83%BC%E3%83%86%E3%82%A3)をみると普通に面白そうで困ります。

- [GraphiQL](https://rickandmortyapi.com/graphql)
- [ドキュメント](https://rickandmortyapi.com/documentation/#graphql)

以上です。
実際に稼働しているものをコード込みで触れるというのはめちゃくちゃありがたいですね。
最強の犬APIへの道のりは続く……。
【ＤＡＯ（分散型自律組織）ってダメじゃない？】

#  【ＤＡＯ（分散型自律組織）ってダメじゃない？】

今回の話は、「Data Access Object」じゃないよ、「Decentralized Autonomous Organization」の方の話。
今更感もあるけど、昔書いた文書をアップし始めたから、興味ある人は短いので読んでみて。

ＤＡＯ＝「多数決で決断する。」
これって、皆が満足する方向にしか行かない。
普通の人には理解しがたい先見の明があり、馬鹿みたいにそれを信じる「とんがった人」が、イノベーションを起こすんだと思う。
ウォークマンは皆に反対された。スマホだって、電気自動車だって最初は多くの人に使いにくいと言われた。

多数決というのは、常に「まーるく」なりやすい。
ＤＡＯは、多くの満足の方向にしか行かないので、失敗は少ないと思うけど、大成功もないと思う。

とんがった進化が貧富の差を生んだのかもしれないから、ＤＡＯは、貧富の差を是正するのに貢献することはできるかもしれない。
貧富の差をなくすのがＤＡＯの存在理由かな。

つまり、トランスフォーメーションしない、安定を求める組織・集団なんだろうな。

もちろん、全てがＤＡＯになるわけじゃなくて、イノベーションは別の集団に任せる事になるから、
ＤＡＯが出てきてもイノベーションには大きな影響はないかもしれない。

結局ＤＡＯは問題を起こさない、毒にも薬にもならない、仲良し集団として存在するのかな。

ＤＡＯは民主主義ではあるけど、無政府共産主義のような気もする。
分からないことが多すぎる、けど・・・。

んっ！？

なんか、ＤＡＯは、多くの古典的日本企業の姿に似てないか？と思えてきた。
Amazon Connectで、フリーダイヤル(0120)発行に必要だった全てのコト


## 書いてあること

2022年12月に Amazon Connect にて
フリーダイヤル(0120)電番を取得しました。<br>
備忘を兼ねて、実際のやり取りや準備した書類を
所感と共にまとめています。


## 実際の対応
### 1.フリーダイヤルを取得したいアカウントからサポートセンターを開く
![1_opensupport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500899/3e031777-4aad-4dad-55fa-a13650b4b72a.png)

### 2.技術カテゴリから電話番号のリクエストを行う
※個人的にサービスから「Connect (Contact Center）」を選ぶところで毎回引っかかります
![2_choicecase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500899/a1807271-62cd-c3fb-e9ed-a966cc6fc98c.png)

### 3.連絡方法を選択して送信を実行
※ウェブのみ試しましたが、最後まで迅速/丁寧にご対応いただけました
![3_makecase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500899/893af66c-9bee-1a4b-b922-705a9936479a.png)

### 4.サポートケース上でAWSご担当者から指示が来るのを待ち、書類のアップロードを実施
※後述の必要書類の一つ「IdentityDetail.rtf」も指示中でダウンロードできます

### 5.フリーダイヤル電番が払い出されたことを確認し、サポートケースをクローズ
※過去対応時はおおよそ1週間で払い出していただけました

## 用意した書類
※`2. 3. 4.`はスキャンしてpdf形式で提出
※`3. 4.`は1枚（1ファイル）にまとめても問題ありませんでした

1. 電番払い出し申請書(IdentityDetail.rtf)
    - 項目名が英語だったので英語で記入
    個人的に下記の住所入力がなかなか覚えられないです
    次回日本語で申請したらどうなるかを確認予定
    例） 〒163-0083 東京都新宿区西新宿 ２−３−２ KDDI株式会社 

    | 項目名 | 記載内容 |
    |--------|--------|
    | Full Business Name   | KDDI CORPORATION   |
    | Country   | Japan   |
    | State / Region / Province   | Tokyo-to   |
    | City / Town   | Shinjuku-ku   |
    | Zip / Postal Code   | 163-0083   |
    | Street Address   | 3-2, Nishi-Shinjuku 2-chome   |


2. 会社の住所が記載された書類
    - 公共料金の請求書などでもOKとのことでしたが、
    この時は履歴全部証明書を提出しました
3. 申請者と会社の関係証明書
    - 社員証のコピーを提出
4. 申請者の身分証明書
    - 運転免許証のコピーを提出


## 所感(やハプニング)
- 申請書が英語表記だったため履歴全部証明書は
英語版を提出していました。<br>
3アカウント分まとめて実施したところ、1アカウントの
ご担当から「日本語でOK」と指摘をもらい、若干の
羞恥心と共に日本語版を提出しました。

- 複数電番を同時に払い出し依頼した際、1電番だけ
Amazon　Connectから選択できない状態になっており、
申請のサポートケースで問い合わせたところ1日程度で
復旧していただけました。
Modeler FlowでSAVファイルを出力する

Watson Studio on CP4DaaSのModeler FlowでIBM StatisticsのSAVファイルを出力してみます。

* テスト環境
    * CP4DaaS (20237/14)
    * Dallas
    * Statistics 29.0.1.0


以下のように、「データ資産エクスポート」ノードの「ファイル・フォーマット」を「SAV」にして、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1e4ecef0-01c6-0d24-6bec-62ec58e45d85.png)

プロジェクトに出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c51ce23f-cfda-2075-e10b-b00581292566.png)

ダウンロードしてIBM Statisticsで開くことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ca7f5714-4868-d571-f377-274402450709.png)
XCTestでWaitの書き方が変わった

# ノーティスメッセージ
![スクリーンショット 2023-07-14 9.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8424/e2563fd7-e50f-2db8-8aca-ddeef1e8024e.png)

```
インスタンスメソッド「待機」は、非同期のコンテキストからは利用できません。 
await fulfillment（of：timeout：endforceorder :)を使用してください。 
これは、Swift 6のエラーです。
```

# 結果

```diff_swift
- wait(for: [exp], timeout: 1000, enforceOrder: false)
+ await fulfillment(of: [exp], timeout: 1000, enforceOrder: false)
```

# どうしたか

どうやらXCTestにもAwaitの波が来たようです。
ということで、少し試して書き方は下記の通り。

```swift
let exp = expectation(description: "処理を待つ")

Task {
    let count = await countFunction()
    let data = await getFunction()
    print(count, data)
    exp.fulfill()
}
await fulfillment(of: [exp], timeout: 1000, enforceOrder: false)

```

単純に今までWaitだったのが置き換わっただけっぽい？
間違っていたら、ご指摘いただけると嬉しいです。

（普段あまり投稿しないので、がんばってみました・・・。）
家事履歴管理アプリ概要

# 目次
1. 要件
1. 画面イメージ
2. 環境

## アプリ要件
* 目的
    * 家事の実施履歴を記録する。
* 背景
    * 我が家では1日当たり家事を1個行うルールになっています。
    * その記録のためのアプリです。
    * 家事の貯金が可能で、3個家事を行えば翌日、翌々日は家事が免除されます。
        * 7月18日に家事3個やると、貯金が3貯まり、日付が変わるタイミングで1個消費され、19、20日に何もやらないと7月21日には家事をやる義務が発生します。
        * 借金も可能とします。

|  | 17日 | 18日 | 19日 | 20日 | 21日 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 実施した家事の個数 | 1  |  3 | 0  | 0  | 1  |
| 貯金 | 0  | 2  | 1  | 0  | 0  |

* 画面構成
    * 家事履歴一覧画面
    * メンバー一覧画面
    * メンバー追加画面
    * 家事実施登録画面
    * 家事種別追加画面
* 家事履歴一覧画面要件
    * 貯金行
        * 1行ごとに家事の履歴が表示される。
            * 各行には家事の名称、家事を行った日時（MM/dd HH:mm）、家事チケット使用日時（MM/dd HH:mm）が表示される。
            * 家事を行った日時の降順で表示される。
            * 使用済みの行は✓マークが行頭に表示される。
    * メンバー名
        * 画面下部に表示される。
        * 名前長押しで名前の編集モードになる。
    * 借金行
        * 借金をしている場合は、赤背景の行が表示される。
    * 戻るボタン
        * メンバー一覧画面へ遷移する。
* メンバー一覧画面要件
    * メンバー行
        * 名前と貯金件数が表示される。借金の場合の表示は赤字で「-X件」と表示する。
        * 表示は最大「999件」とし、1000件以上の場合も「999件」と表示される。
        * 表示は最小「-999件」とし、-1000件以下の場合も「-999件」と表示される。
        * 行押下で該当するメンバーの家事履歴一覧画面へ遷移する。
    * メンバーを追加ボタン
        * メンバー一覧の下部に表示する。
        * 押下でメンバー追加画面へ遷移する。
* メンバー追加画面
    * メンバー名称を入力できる。
        * 文字数上限は20文字まで。
    * メンバーを追加ボタン
        * メンバー名称入力フォームの下に表示。
        * ボタン押下でメンバーを追加する。
        * ボタン押下でメンバー一覧画面へ遷移する。
* 家事実施登録画面要件
    * 家事種類リスト
        * 行押下で行頭に✓マークが表示され、決定ボタンが活性化する。
        * 行長押しで家事詳細画面をダイアログ表示
            * 名前と詳細説明が表示される。
        * 最下部に「家事を追加」ボタンを表示する。
            * 押下で家事種別追加画面へ遷移する。
    * 決定ボタン
        * FAB
        * （行押下（家事選択モード）時に活性化する。）
        * ボタン押下で家事履歴が追加される。
        * ボタン押下でメンバー一覧画面へ遷移する。
* 家事種別登録画面
    * 家事名称を入力できる。
        * 文字数上限は20文字まで。
    * 家事詳細を入力できる。
        * 文字数上限は100文字まで。
    * 家事を追加ボタン
        * 画面下部に表示する。
        * 家事名称が入力されると活性化する。
        * ボタン押下で家事種別追加。
        * ボタン押下で家事実施登録画面へ遷移する。
* バックエンド機能
    * 日付が変わるタイミングで自動で貯金を使用済みもしくは借金行を作成する。
    * ログイン機能
    * 他の端末との同期機能

## 画面イメージ
Figmaで作製予定

## 環境
後ほど追加
Qiitaで使えるマークダウン

Qiitaを記述する際に使えるMarkdownの書き方をまとめました。

# 目次

1. 見出し
1. 文字の修飾(太字、イタリック、取り消し線、下線)
1. コードの挿入
1. リスト
1. リンクの挿入
1. エスケープ
1. 引用
1. ファイルの添付

## 1.見出し
文頭に#をつけることで見出しとして設定できます。
\#の数が少なくなるほど見出しとしての重みが小さくなります。
>#\#×1個の見出し
##\#×2個の見出し
###\#3個×個の見出し
####\#4個×個の見出し

## 2.文字の修飾
### 太字
「__」(アンダースコア×2)または「**」（アスタリスク×2）で文字を囲むことで太字にできます。

>__アンダースコア×2__
**アスタリスク×2**

### イタリック
「_」(アンダースコア×1)または「**」(アスタリスク×1)で文字を囲むことでイタリック体にできます。

>_アンダースコア×1_
*アスタリスク×1*

### 取り消し線
「~~」(チルダ×2)または「\
と\
」で文字を囲むことで取り消し線を設定できます。
「\
と\
」なら改行しても取り消し線が持続します。

>~~チルダ×2~~

\



### 背景色グレー
「\`」(バッククォート×1)で文字を囲むことで背景色をグレーにすることができます。
>`バッククォート×1`


参考サイトhttps://qiita.com/Qiita/items/c686397e4a0f4f11683d
https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1
https://qiita.com/Nukioman/items/01cd7ff819bc2e69b652
ITパスポートの勉強を始めてみたいと思います！

先日、ニュースになっていましたが、あの、「お値段以上」で有名なニトリさんが、
2025年までに全社員の8割にITパスポートの資格を取得する施策を始めるとの事です。

私も今更ながら、ITパスポートの資格取得にチャレンジしたいと思います。

長年、エンジニア採用に関わってきたのkですが、ITの知識は断片的で、なかなか、
日々の中で時間を取って勉強したことはありませんでした。

全てのビジネスパーソンにとって、ITリテラシーを高めていく事は必須になるので、
（今更遅いかもしれませんが。。。）
人生100年時代、遅すぎるなんてことも無いと思いますので、今日から勉強を始めたい
と思います！

まずはテキストを読むことから、始めていきます！


https://www.nikkei.com/article/DGXZQOUC208S50Q3A420C2000000/
AWS IAM Identity Center環境におけるAWS CLIの利用方法

# はじめに
本記事はAWS IAM Identity Center環境におけるAWS CLIの利用方法について記載しています。

AWS IAM Identity Centerを利用している環境でAWS CLIを使用する際は、profileを使い分けて操作するなどの運用が発生すると思います。

本記事ではIAM ロールを利用して、他のアカウントにログインすることなく、コマンドを実行するtipsを記載しています。

## CLI + SSO
AWS IAM Identity Center環境におけるAWS CLIの設定については、公式ドキュメントの[AWS IAM Identity Center (successor to AWS Single Sign-On) を使用するための AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sso.html)より確認できます。

### SSOログイン
前提として、ホームディレクトリ以下の`~/.aws/config`ファイルには以下のような設定が必要です。（※アカウントIDは例）

```config
[profile AWSAdministratorAccess-123456789012]
sso_start_url = https://[yourdirectory].awsapps.com/start
sso_region = ap-northeast-1
sso_account_id = 123456789012
sso_role_name = AWSAdministratorAccess
```

以下のように`--profile`を指定してSSO ログインを行います。

`$ aws sso login --profile AWSAdministratorAccess-123456789012`

SSOログイン後、引き続き`--profile`を指定することでAWS CLIを使用することができます。

以下の例では[GetCallerIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html)のAPIを呼び出して、認証情報が使用されるIAM ユーザーまたはロールに関する詳細が確認できます。

`$ aws sts get-caller-identity --profile AWSAdministratorAccess-123456789012`

### IAMロール
AWSアカウント123456789012から、999999999999のAWSアカウントのロールを切り替えて操作したい場合は、`~/.aws/config`ファイルに以下の設定を追記します。

```config
[profile assume]
source_profile = AWSAdministratorAccess-123456789012
role_arn = arn:aws:iam::999999999999:role/AWSControlTowerExecution
```

以下のコマンドを実行すると、AWSアカウント999999999999に関する認証情報の結果が確認できます。

` aws sts get-caller-identity --profile assume`

:::note
AWSControlTowerExecutionは、Control Towerで使用されるロールです。
:::

# おわりに
AWS IAM Identity Centerを利用している環境で複数のアカウントを管理している方は、知っておくと便利だと思います。

## 参考
- [IAM Identity Center が有効な名前付きプロファイルの使用](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/sso-using-profile.html)
- [AWS CLI での IAM ロールの使用](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html)
- [Issues](https://github.com/aws/aws-cli/issues/5933)
Railsチュートリアル　第５章

## １． 画像のダウンロード
以下のように```curl```コマンドを使うことで、任意の場所に画像をダウンロードすることでできる。
```
curl -o app/assets/images/rails.svg -L https://cdn.learnenough.com/rails.svg 
```
## ２．　BootstrapとカスタムCSS
Bootstrapは、HTML5アプリケーションに優れたWebデザインとユーザーインターフェイス要素を簡単に追加できるCSSフレームワークである。（Railsチュートリアル参照）
BootstrapのCSSを追加することで、`nav`や`navbar`を付与したタグにスタイルが自動的に適応される。

※注意：Codespaces（クラウドIDE）で開発される方へ
テキストではBootstrapをGemfileに追加したあと、`bundle _2.3.14_ install`で`bundle`をインストールするように記載してあるが、その通りに実行するとうまく反映されなかった。`bundle -v`で`bundle`のバージョンを調べ、それに合わせた`bundle`をインストールすることで、解決することができた。
（例）バージョンが`2.4.12`なら`bundle _2.4.12_ install`のように入力。

## ３．パーシャル（partial)
`application.html.erb`には、`header`や`footer`が同ファイル上に存在していてやや散らかっている。それらをヘッダー部分、コンテンツ部分、フッター部分とファイル単位で分ける機能がパーシャルである。３つを分けることで効率化を図ることができる
```diff_erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="utf-8">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
  </head>
  <body>
+    <%= render 'layouts/header' %>
   <mark> <div class="container"> <mark>
      <%= yield %>
    </div>
  </body>
</html>
```
```erb:app/views/layouts/_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", '#', id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home",   '#' %></li>
        <li><%= link_to "Help",   '#' %></li>
        <li><%= link_to "Log in", '#' %></li>
      </ul>
    </nav>
  </div>
</header>
```
`_header.html/erb`のように先頭に`_`を付けることで識別できるようにしている。

## ４．Sass

### ネスト
```
.center {
  text-align: center;
}

.center h1 {
  margin-bottom: 10px;
}
```
を次のように書くことができる。
```diff
.center {
  text-align: center;
+  h1 {
+    margin-bottom: 10px;
+  }
}
```
また、
```
#logo {
  float: left;
  margin-right: 10px;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  letter-spacing: -1px;
  padding-top: 9px;
  font-weight: bold;
}

#logo:hover {
  color: #fff;
  text-decoration: none;
}
```
を次のように書くこともできる。
```diff
#logo {
  float: left;
  margin-right: 10px;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  letter-spacing: -1px;
  padding-top: 9px;
  font-weight: bold;
+  &:hover {
+    color: #fff;
+    text-decoration: none;
+  }
}
```
### 変数
```diff
h2 {
+  color: #777;
}

footer {
+  color: #777;
}
```
上のように同じ値があった場合次のように変数を定義することで、効率化を図ることができる。
```diff
+$light-gray: #777;

h2 {
+  color: $light-gray;
}

footer {
+  color: $light-gray;
}
```
## リンク

```diff:config/routes.rb
Rails.application.routes.draw do
+  root "static_pages#home"
+  get  "/help", to: "static_pages#help"
end
```
とすることで、次のように名前付きのルーティングが使用できる。
```diff
+ <%= link_to "sample app", root_path %>
+ <%= link_to "Help",    help_path %>
 ```
朝は生物学的ゴールデンタイム　朝型人間のススメ

おはようございます！
今日のつくばは曇り模様ですが、空気が気持ち良い過ごしやすい朝です。

朝型、夜型、人によりタイプは様々ですが、最近は良く朝型が推奨されていますよね。朝残業を推奨する会社が増えたり、朝活をしている人もかなり増えてきましたよね。

やはり人間は、朝太陽が昇って活動し始めて、夜太陽が沈んだら休息する様に本能的に設計されている様な気がします。

私も最近は朝型にして、朝7時くらいにはPCに向かい、アウトプット系の仕事はなるべく午前中にするように心がけています。
※リモートワークの職場環境に感謝です！

やはり、午前中ははかどり方が全然違いますね。
頭も冴えているし、途中で、メッセージチャットの通知で集中が途切れることもないし、文章を書くとか、資料をまとめるとか、そういう仕事に朝は最適です。

逆に午後は、メールチェックや、作業的な仕事、相手とのコミュニケーションが必要な仕事（私の場合は面談や面接）をなるべく入れるようにしています。

比較的、朝早くから勤務しているので、日中帯は比較的、中抜けして
昼寝したり、運動したり、ゆっくり休憩を取りながら勤務しています。

仕事柄、夜、面談や面接が入ることがあるので、途中休憩を多くとりますが、夜に面談がなければ、早く仕事はあがってしまいます。
※これも柔軟な働き方を許容してくれる職場に感謝です！

効率的な働き方が求められる昨今、同じ時間で、どれだけアウトプットを出せるかは、考えなくてはならないので、朝の時間の有効利用は今後も活用していきたいですね。

朝は「生物学的ゴールデンタイム」とも言われていて、集中力を考えると、朝の1時間は午後の2～3時間に匹敵するという研究結果もあるそうです。自分の実感としても、これは当たっていると思います。

もちろんタイプによって、朝型、夜型はあると思いますが、朝早く日が昇る時期に、改めて、朝型にチャレンジしてみるのも良いかもしれませんね！

それでは、皆さん、今日も良い一日を！![OIP.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509569/e5e3d46d-d51d-eaee-a452-1c407c84a9c2.jpeg)
Androidでのコルーチンに関するベストプラクティスを学ぶ

# coroutineのベストプラクティス
GoogleのAndroidDevelopersサイトにあるKotlinコルーチンのベストプラクティスを元に自分のソースを見直してみました。

:::note info
元記事はこちらです
[Android でのコルーチンに関するベスト プラクティス](https://developer.android.com/kotlin/coroutines/coroutines-best-practices?hl=ja)
:::

## ディスパッチャを挿入する
:::note info
元記事はこちらです
[Android でのコルーチンに関するベスト プラクティス - ディスパッチャを挿入する](https://developer.android.com/kotlin/coroutines/coroutines-best-practices?hl=ja#inject-dispatchers)
:::
まとめると「suspendとかflowとかを作成するときに、「Dispatchers.IO」をハードコードするとテストしづらいよ」ということらしい。確かに。

## 変更可能な型を公開しない
:::note info
元記事はこちらです
[Android でのコルーチンに関するベスト プラクティス - 変更可能な型を公開しない](https://developer.android.com/kotlin/coroutines/coroutines-best-practices?hl=ja#mutable-types)
:::
「バグがあったときに、値を変更できるポイントが分散しているといろいろ面倒だから、値の変更を外からできなくしましょうね」ということですね。サイト上では例として、MutableStateFlowはprivate valで宣言して非公開に、公開するのはStateFlowでということのようです。

### （ちょっと脇道）MutabaleStateFlow.asStateFlow()
あれ？MutableStateFlowからStateFlowへの変換の時に、asStateFlow()使ってないですね。いらないのかな？
疑問だったので調べました。
非常に良くまとまっていたのがこちらのサイトです。

:::note info
[[Kotlin] MutableStateFlowをStateFlowに変換するときasStateFlowを使うべきか？](https://zenn.dev/yumemi_inc/articles/2023-06-05-need-as-shared-flow-and-as-state-flow)
:::

asStateFlowをつけると、ReadonlyStateFlowとして生成されるので安心ということですね。
つけるようにしていこうと思います。

## 完成
完成コードは[こちら](https://github.com/jozuko/WeatherForecast/commit/37897305996e1a595259defb4698c11cb12f0c6b)です。
#PowerApps ドロップダウンのスキマをお埋めいたします

自分、まったく気にしたコトもなかったんですよ。
他の方に「ここのスキマを詰めたいんですけど」と言われて調べてみた。

そんなドロップダウンコントロールさんのココロのスキマをお埋めいたします（違（違わない？

# ナニの話し？
ドロップダウンコントロールを展開した際、アイテムの間にある余白（空間）を詰めたい、という話題です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/c43ea256-d17c-2999-bd9f-b3c3d72107c7.png)
(´ω`)。○○（言われるまで気にしたコトなかったよ）

もちろん（？）Docs には細かいコトは書いてない。

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/controls/control-drop-down?WT.mc_id=BA-MVP-5004053

# ドロップダウンコントロールのスキマ埋めます
結論ですが、ドロップダウンコントロールの［PaddingTop］、［PaddingBottom］プロパティで調整可能です。

## デフォルト状態
挿入した直後のデフォルト（初期）状態は、上下左右の Padding は 10 です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/6f019fc9-da47-2bcb-1566-426dceada324.png)
［V］をクリックして展開すると、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/9be6e0e1-20bb-b84b-932a-f69f3ecdc509.png)

## スキマの調整
上下の Padding（PaddingTop、PaddingBottom プロパティ）を 2 にしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/340b02fb-5bfb-4ff4-b874-e1012e53f4ac.png)
展開すると、少しスキマが詰まりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b7d3e9c5-1f64-8032-c7e5-ed4d2e3fb115.png)

思い切って、上下の Padding を 0（ゼロ）にしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/ac5d7319-b97a-17ae-b7b9-b978a95696e6.png)
上下の Padding が 2 と時とあんまり差を感じない汗。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/c4e3b06d-94cb-3bde-638a-3e03c0062ad8.png)

### 並べてみた
並べてみると、2 と 0 でも、すこーしだけ差異があるようにみえますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/2b1c5a90-9b94-98f6-35f7-0e3816264682.png)

## 拡張も可能
スキマを広げるコトも可能です。上下を 50 にしてみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/3e7af32b-e7da-2142-7d8f-ac6c1cad7ead.png)
1つのアイテム上下のスキマがどーん！と広がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/3e39a50c-5ea8-e340-1baf-25e7c1662645.png)
ドロップダウンのアイテムで、1つのアイテムでも文字数が多い場合に「全ての高さを揃えたい」みたいな場合に広げてみる、みたいなタイミング以外では利用しないかな、と個人的には思いました。
# まとめ
ドロップダウンコントロールのアイテム間にある余白（スキマ）は、PaddingTop、PaddingBottom で調整可能！

あまりに狭すぎる、広すぎる、どちらもスマートフォンから利用する際に操作性が落ちそうです。PC で利用するのが主であれば問題無いかな？とは思いますが、良い塩梅に調整ください、ですね。

言われるまで気にしたコトありませんでしたね。
色々と試してみるモンです。良い学びでした、というネタでした。

あッ！コンボボックスコントロールはどうなんでしょう（すっかり忘れていた）。
今回はドロップダウンコントロールの話題でした、ってことでタイムアップです。

それでは、皆さま、素晴らしい Power Platform Life を！
日々のアウトプット

今日から毎日何かしらアプトプットをしていこうと思う。
まず目指す目標はレガシーな技術からの脱却
（受託開発企業でCOBOLに２年間従事してしまってスキルセット恐ろしいことになってしまった。。転職ができる自信がない。。）
psql: SCRAM authentication requires libpq version 10 or above のクライアント側の簡単な対処(PostgreSQL12のpsqlをインストール)

# 事象

EC2(Amazon Linux2)にpsql(PostgreSQLクライアントアプリケーション)をインストールして、Aurora PostgreSQLに接続するとエラーが出る

```
psql: SCRAM authentication requires libpq version 10 or above
```

# 原因

EC2で利用するYUMリポジトリのpsqlのバージョンが古い(厳密にはlibpqが古い)

# 対処

Aurora側でオプショングループのパスワード設定を変更することでも対処できるけど、クライアントのverが古いのをなんとかした方が良いと思うので、EC2にlibq10以降を含むpsqlをインストールする

# 手順

https://yum.postgresql.org/rpmchart/

にアクセスして、「PostgreSQL 12」の項目まで進む

利用してるCPUアーキテクチャに合わせて、x86_64かaarch64のリンクを進む(m6gとかr6gとか、g系だとARMアーキテクチャなのでaarch64になります)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511871/f3492bdf-042a-6384-ab2e-a7a19ec79fc1.png)

この記事ではaarch64でやります
postgresql で検索して、以下のリンクをコピーする
(postgresql<ver><ver>的なものと、postgresql<ver>-libs)
各バージョンは同じものが良いです

- postgresql12-12.15-1PGDG.rhel7.aarch64.rpm   
- postgresql12-libs-12.15-1PGDG.rhel7.aarch64.rpm  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511871/f297b2cc-7e8a-7df5-97e0-6b423b6964b3.png)

EC2にSSHして、wgetでダウンロードして、rpmコマンドでインストールすれば完了です

```bash
wget postgresql12-12.15-1PGDG.rhel7.aarch64.rpm
wget postgresql12-libs-12.15-1PGDG.rhel7.aarch64.rpm  

rpm -ivh postgresql*.rpm
```

# 備考

以下記事を参考にさせていただいてやってみたのですが、

https://qiita.com/ajitama/items/59d067a4360d5cb54f05

自分の環境ではyumコマンド実行時にエラーが出てしまったので、PostgreSQLのダウンロードページから直接RPMをダウンロードして利用する方法を試したところ、簡単だったので記事にしました
メモ　Mac(13.4.1)のプレビューから印刷ができないときの対策

# はじめに
本当にどうでもいいことなのですが、今日、MacのプレビューからPDFを印刷しようとしたところ、印刷できなかったのです。
(Mac OSのバージョンはVentura 13.4.1)
以前は普通にできていたと思うので、おそらくバージョンアップで、プレビューのバージョンも上がったことによる事象と想像します。

# どのような事象か
下記の画面コピーを見てください。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/83e786fb-5412-007b-1ad0-20b8d8c6581d.png' width=800>

右下の赤枠に注目してください。かすかにボタンの残骸のようなものが表示されています。後ほどわかるように、これは印刷ボタンなのですが、ランチャーに邪魔されて印刷できない。
ギリギリの座標でボタンが有効な箇所もありそうですが、少なくても不器用な私が何度かチャレンジした範囲ではだめでした。

# 対策
上の事象からランチャーを普段非表示にすれば、ボタンが押せそうと想像がつきます。
以下はその手順です。


<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0bfbee0f-74bb-1793-1b45-2ed2656740d6.png' width=400>

「システム設定」「デスクトップとDock」を選択し、上の画面でデフォルトOffになっている「　Dockを自動的に表示/非表示」をOnにします。

# 結果
こんなふうにめでたく「印刷」ボタンが表示でき、印刷自体もできるようになりました・

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/eb6d521f-478c-5f76-10ff-f9018674500d.png' width=600>

# おまけ
この設定、画面自体は広くなるのですが、使い勝手としてはどうなのか、しばらくこの状態で使ってみることにします。
いなくなったアイコンたちですが、下の図のようにマウスポインタを一番下まで移動してしばらく待っていると、表示されるようになるようです。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/46d3124c-0362-36fe-640f-6501884c49d0.png' width=600>
GPUの無いマシンでProxmoxVEを始める

自宅サーバーの仮想化環境をVMware ESXiからProxmoxVEに移行したときのお話です。
グラフィックが搭載されていないサーバーでProxmoxVEのインストーラーではインストールできず、手動でインストールを行ってみました。

# ProxmoxVEとは
Proxmox VEは仮想化環境を提供するプラットフォームの1つです。
似たものにVMware ESXiがありますが、ProxmoxVEはOSSとして開発されており仮想化に特化したLinuxディストリビューションでもあります。
Debianベースであり、仮想化にはKVMとLXCの２つを使うことができます。

# インストーラーを使わないインストールとは？

Proxmox VEのインストーラーにはグラフィック機能が必要です。しかし、サーバー向けのマシンの多くにはグラフィック機能が搭載されていません。そのため、インストーラーを使わずにインストールする必要があります。
Proxmox VEはDebianベースのLinuxディストリビューションであるため、インストーラーを使わずともDebianからパッケージをインストールすることによってProxmox VEをインストールすることができます！
今回は、Debian 11 BullseyeをベースとするProxmox VE 7.2をインストールしていきます。

## 準備

なにはともあれ、Debian 11 Bullseyeを最小構成でインストールしてください。
インストーラーに従ってインストールしていくので説明は割愛します。

### `/etc/hosts`にホスト名を追加する
Proxmox VEを使う上で自身のホスト名を/etc/hostsで解消できなければなりません。
IP：192.168.0.2、ホスト名：proxmoxとして`/etc/hosts`に記載する例を以下に示します。
環境に合わせて設定してください。
```config
127.0.0.1 localhost 
192.168.0.2 proxmox.example.com proxmox 
```

設定後、設定されたことを確認するには以下のコマンドで確認することができます。
```sh
$ hostname --ip-address 
192.168.0.2
```

## Proxmox　VEをインストールする
いよいよ、Proxmox　VEのインストールです。
これからの作業はRootで行ってください。

### Proxmox VE リポジトリを追加する
Proxmox VE リポジトリを追加します。
```sh
$ echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bullseye pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
```
続いてリポジトリキーを取得します。
```sh
$ wget https://enterprise.proxmox.com/debian/proxmox-release-bullseye.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg 
```
リポジトリの追加が完了したので、リポジトリとシステムを更新していきます。
```sh
$ apt update && apt full-upgrade
```

### Proxmox VEのカーネルをインストールする
Proxmox VEには仮想化環境用にチューニングされた独自カーネルがあります。
Proxmox VE本体をインストールする前にカーネルを入れていきます。

```sh
$ apt install pve-kernel-5.15

$ systemctl reboot
```

### Proxmox VEのパッケージをインストールする
Proxmox VEを構成するパッケージをインストールしていきます。
```sh
$ apt install proxmox-ve postfix open-iscsi
```
必要に応じて、構成を入力求められますが、何を入力すべきかわからない場合は`local only`を選べば特に問題ありません。

### Debianのカーネルを削除する
Debianのカーネルが残っていると、Debian本体の更新の影響を受けて問題が発生する場合があります。
そのためDebian標準のカーネルを削除します。
```sh
$ apt remove linux-image-amd64 'linux-image-5.10*'
```

このままでは、起動時にカーネルを見つけることができないのでgrubのエントリーも追加しておきます。

```sh
$ update-grub
```

### webインターフェースにアクセスする
1度再起動した後、`https://{IPアドレス}:8006`からwebインターフェースにアクセスします。
初回のアクセス時には管理ユーザの設定が必要なので必要に応じて設定をしてください。

## 終わりに
今回はProxmox VEをインストーラーを使わずにインストールしてみました。
インストールに関する情報は少ないものの、ベースがDebianということもありそこまで難しいものではなかったのではないでしょうか。
Proxmox VEを使うと簡単に仮想マシンをたくさん立てることができるので、仮想化環境ライフをお楽しみください！！
【UE5】Sequencerでのイベントでフレームジャンプを行う方法

# はじめに
UEのシーケンサーを用いてゲーム開発を行う際に、特定条件でのフレームジャンプを行うことが必要になることがあります。

本記事ではシーケンサーでフレームジャンプを行う方法を記載します。

# 関数
MovieSceneSequencePlayerのSetPlaybackPositionを使用します。

https://docs.unrealengine.com/5.2/en-US/API/Runtime/MovieScene/UMovieSceneSequencePlayer/SetPlaybackPosition/

※4.26以前ではPlayToFrameという関数がありましたが廃止されております。

こちらの関数にMovieSceneSequencePlaybackParamsを作成して、その値を渡すことでフレームジャンプが可能になります。

https://docs.unrealengine.com/5.2/en-US/API/Runtime/MovieScene/FMovieSceneSequencePlaybackParam-/

# 実装
MovieSceneSequencePlaybackParamsではFrame、Time、MarkedFrameのどれかで指定が可能ですが、今回はFrameを指定する形で実装を行います。

Frameの値はFrameTime内のFrameNumberを使用するため、実装するにはそれぞれの作成が必要になります。


https://docs.unrealengine.com/5.2/en-US/API/Runtime/Core/Misc/FFrameTime/

https://docs.unrealengine.com/5.2/en-US/API/Runtime/Core/Misc/FFrameNumber/

FrameNumberのValueに値を渡せれば良いのでサンプルは以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/36abeb62-f6db-2a19-b887-81659915d1a4.png)

FrameNumberを作成→FrameTimeを作成→MovieSceneSequencePlaybackParamsを作成→LevelSequenceActorのSequencePlayerのSetPlaybackPosition関数の引数に値を渡す

# スキップ方法
スキップの方法として、間のイベントの値を実行するか、無視するかをUpdateMethodの値で設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/0fff4f50-d834-d756-0345-f32d4319470c.png)

基本的に実行したい場合はPlay、無視したい場合はJumpで設定

# シーケンサー側に実装
作成した関数をシーケンサー側のイベントで呼び出す形で作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/0d3b0d16-b74c-d8f4-a21f-725bd829b117.png)

画像はLevelSequenceActorを取得しているManagerを取得してスキップ関数を実行しています
（非効率ですが・・・）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/208de3b0-6ecf-7c30-80b6-896c3ed56e6b.png)

実装したシーケンサーではパラメーターの値の位置へジャンプを行う形にできます。

また、本機能を用いることで、シーケンサー内で特定条件によるジャンプや、ボタン押下による特定位置へのスキップなどが可能になります。