OmniAICreator/Qiita-1.07M huggingface dataset:
ossdb-goldを取得して変わったこと

# はじめに

こちらの記事
https://qiita.com/jun2/items/518623e60946e619dec3
にてPostgreSQLの民間資格であるOSSDB-Goldを取得いたしました。
これによって何か役に立ったのか？取得したことでなにか成長を実感できたのか？というところを記事にしたいと思います。

# 実際活用には至っていないのが現状

まだ取得して間もないこともあり、ここに使ったな！という事例がないのが正直なところです。
一方で先日postgreSQL Conferenceに出席してきましたが、正直このくらいの知識があるのが最低限だなという印象です。
おそらくよほど実務でパラメータや拡張機能に対して向き合っていない限りは何を言っているのかちんぷんかんぷんであっただろうと思います。
こういったもう一段の使い込み、情報を吸収するための準備段階としてこの資格は取得しておいて良かったなと思う次第です。

# トラブルへの対応は準備万端

例えばパフォーマンスチューニングを必要としたときの引き出しはかなり増えたと思います。
取得前にとっていた手段としては
* クエリの組みなおし・分割
* アプリケーション層における描画の分割など

これはこれでいいのですが、根本的にサーバーサイドの資源の利用の仕方に対しての対応手段を持ち合わせていなかったところとなります。
取得してからは特にもAutoVacuumについては特に頭を悩ませる開発者が多いのだろうなということがわかってきました。
他にもcheckpointなども勘所としては挙がってきます。
こういった「なんか定期的に重くなる」といった症状への対応に対してこれらを試してみようと思えるようになりました。

# 大量のパラメータに対する知識増

postgresql.confの中身・・・正直多すぎてわかりませんよね。。
OSS-Gold取得に当たってはこの大部分について学習が必要となります。
設定の変更トリガは？その調べ方は？など、本番環境に対してなにかデバッグしようとしたときに安全に切り替え可能なものなのか？
という判断ができるようになりました。

# 拡張機能の導入検討

正直これまであまり拡張機能については活用できていなかったところとなります。
機能実現のために必要なものは調べて使ってみたりもしましたが、資格取得の中でも少ないですが解析や機能的な拡張に役立つものがいくつかありました。
既稼働環境に対してはあまり手を入れたくないのはその通りですが、新規実装するようなところではこういった機能を用いることも検討中に入れたいと思う次第です。

# レプリケーションへの知識・活用

レプリケーションについてはストリーミングレプリケーションが出題としては多かったと思います。
一方、昨今ロジカルレプリケーションの拡張は盛んでバージョン15,16と拡張が行われ、単なるデータのコピーというより負荷分散を進められるような対応ができるのかなという印象です。
列指定・条件指定ができるようになったことで、例えば拠点や店舗ごと（ちょっと規模が小さい例ですいません）での負荷分散をするような構成も考えられそうです。


# おわりに

なかなかこれに使った！活用できた！という例を示せませんでしたが、引き出しは相当に増えたと思います。
経験が長いような方であれば上記当然のことかもしれませんが、最近OSS化を始めた、進める予定だという方はとっかかりとして取得をお勧めしたい資格の一つとなります。
ブランチとタグ

# はじめに

この記事は構成管理が初めて！であったり、master(svnでいうtrunk)しか使ったことがない！といった人向けになります。

# Branch

ブランチは分岐させるという意味合いがあります。
例えば1つのベースモデルの開発があり、そこから分岐して廉価版モデルやチップ構成が異なるモデルなどといった場合にBranchさせて開発を行います。
ブランチさせた後にベースモデルで不具合などあるとマージが必要となってきますのでBranchさせるタイミングは注意が必要です。
他にはOS毎にBranchしてOSに依存する部分のみ分岐開発するというのもよいと思いますが、この場合OSに依存しないApplication層等はsubmodule化する方が良さそうです。

考えやすい例（実際そうだという訳ではありません）：
* 車のマイナーチェンジモデル（どちらかというとTagになるかも）
* ノアとヴォクシー、
* iPhoneXXとiPhoneXX Pro , iPhone XX SE
* 親会社と子会社の社内規則など

# Tag

タグはあるリリースの静的なバージョンを持つときに利用します。
Branchと異なる点はTagが作成されて以降変更が入らないというのがTagの使い方となります。

# その他Branchを使ったアイデア

masterとdevelopBranchを作成して、基本的にメンバーはdevelop側で開発します。
masterマージする際にはマージリクエストが行われますので、そこでコードレビューが必ず行われる仕組みとして開発を進める。
ただし、最初からではなく一度全体的にコードレビューが完了したモジュールからこの流れにするとよいと思います。

# 終わりに

非常に簡単ですが、ブランチとタグの説明・使い方・アイデアとなります。
これから構成管理を担当していく方など参考になればと思います。
UWSCRの配列について

配列はUWSCから大きく変わった機能の一つです。

UWSCにおける配列は

- 一つの変数に束縛される
- 他の変数に代入できない
- 通常の方法では関数の引数として渡せない
- 関数の戻り値にできない

など、配列だけの特殊な制限が存在していました。この仕様はなにかと不便でコーディングの幅を狭めていたと思います。後にSafeArrayが登場し不便さが多少緩和されましたがそれも組み込み関数を呼ぶ必要があったためやや面倒でした。

UWSCRでは配列を値型の一つとし、上記の制限を撤廃しています。

# 配列リテラル

UWSCRでは配列のリテラル表記を実装しています。

```php
a = [1, 2, 3]
print a[1] // 2
// 配列そのものもprintできる
print a  // [1, 2, 3]
// 配列のコピーを作る
b = a
print b // [1, 2, 3]

// 配列リテラルを直接インデックスする
print [4, 5, 6][0] // 4

// for-inループ
for n in [7, 8, 9]
    print n
next
// 7
// 8
// 9
```

UWSCと同じ構文による宣言および初期化も可能です。

```php
// UWSC互換の変数初期化
dim a[] = 1, 2, 3
// やってることは以下と同じ
// dim a = [1, 2, 3]

// 代入もできる
b = a
print b // [1, 2, 3]
```

# 多次元配列

通常の配列と同様に、UWSC方式の初期化もリテラル表記も可能です。

```php
dim a[][1] = 1,2,3,4,5,6
print a       // [[1, 2], [3, 4], [5, 6]]
print a[1][1] // 4
b = [[1,2],[3,4],[5,6]]
print b       // [[1, 2], [3, 4], [5, 6]]
print b[1][1] // 4
```

# +演算子による配列要素の追加

`配列 + 値` で配列に要素を追加できます。

```php
print [1, 2, 3] + 4 // [1, 2, 3, 4]

a = [5, 6, 7]
a += 8
print a // [5, 6, 7, 8]
```

# 関数の引数や戻り値としての配列

UWSCでは引数として配列を受ける場合は`引数名[]`で受ける必要がありましたが、UWSCRでは通常の引数でも配列を受けられます。また戻り値として配列を返すこともできます。

```php
function f(arr, n)
    arr += n
    result = arr
fend

a = [1, 2, 3]
print f(a, 4) // [1, 2, 3, 4]
```
QAの社内輪読会をやってみた

この記事は [カオナビ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kaonavi) 5日目です。


## はじめに
はじめまして。iaroと申します。
この記事では、週に1回カオナビで実施しているQAの社内輪読会について紹介します。
輪読会から得た学びや気づきについてツラツラと書いていきますのでよろしくお願いします！

## 輪読会とは
今まで輪読会と言われる物に参加したことがなく一体輪読会とはなに？というところからでした。
一般的な意味としては以下です。
>輪読会
読み方：りんどくかい
人々が集まって、同じ教科書などの本を読み、その内容について意見を交わすことを意味する語。事前に決められた担当者が、本の内容を訳したりまとめたりしてから、他の参加者が理解できるように発表する形式がとられることも多い。

[Weblio辞書国語辞典](https://www.weblio.jp/content/%E8%BC%AA%E8%AA%AD%E4%BC%9A)より

ふむなるほど。とにかく本を読んで、意見を言い合う会なのね。と理解。

## 輪読会をはじめた経緯
以下のような経緯ではじまりました。

JSTQBのアジャイルテスト担当者ALシラバスがリリースされ、勉強のためにまずはFLのシラバスから読んでみよう
↓
チームのQAも関わっているから一緒に読もう
↓
スクラムマスターからQAに閉じなくてもいいのではとのアドバイスをいただいたので、他チームのQAや他職種の方にも声をかけて一緒に読もう

カオナビにはスナバという制度があり、これを利用して輪読会を開催しています。
**※スナバ：週2時間使える自己研鑽タイム。報告義務はなく、より主体的により自由に、スキルを高めていける制度。**

## 進め方
以下のような流れで実施しています。
- 週に一回30分
- オンライン会議形式
    - 今はSlackのハドルを利用（以前はZOOMでしたが、チャット欄の内容が会議終了すると消えてしまうので最近Slackハドルに移行）
- その日に読むスコープを決め、10分〜15分を使って各自黙読
    - 後で議論しやすいように、読んでて疑問に思ったところ・興味のある内容についてスレッドにコメントして残しておく
- 残り時間で気になった箇所・興味のある内容について話し合う

## 今読んでいる物
ISTQBテスト技術者資格制度
Foundation Level Extension シラバス アジャイルテスト担当者 日本語版 Version 2014.J02

ページは[こちら](https://jstqb.jp/dl/JSTQB-Syllabus.Advanced_ATT_Version1.1.J01.pdf)

## やってみて
### 進め方
当初はセクションを区切って担当を決め、音読方式で実施していました。(学生時代にやってた国語の授業みたいな感じ）
ただ、そのやり方だと各自のペースで読めないので、途中から黙読して内容に集中する形式に変えました。

私は以下のようなループにハマっていました。
- 読む番がくるまではソワソワ　　　　　　→内容が入ってこない
- 読んでいる時はうまく読もうとする　　　→内容が入ってこない
- 読んだあとは安心して気を抜く　　　　　→内容が入ってこない

黙読形式だと、特にソワソワすることもなく、うまく読もうとしなくてもいいので内容に集中できました。
気になったところをコメントで残しておこうスタイルも、時間が限られている中スムーズに進める上で良かったポイントです。

また、実施する中で個人的に一番大事だと思ったのは
**わからないことが恥ずかしくない雰囲気が作られているかどうか**
です。

個々人でスキルや知識の差は大なり小なりあるとおもいます。
「えっそんなことも知らないの？」という雰囲気をガンガンに醸し出されると、一気に萎縮して意見も気軽に言えなくて学ぶ機会も減っていってしまう気がしています。

今の輪読会では、わからないこともどんどん共有して有識者が丁寧に解説してくれるのでとても助かります。

あと、**参加しているメンバーがQAだけじゃない**というところも良かったです。
POやエンジニアも一緒に参加しているのでいろんな角度からの意見を聞けるのは大きいです。
例えば
- エンジニアとしてテストに対しての課題感を聞ける
- アジャイルの基本的なところを噛み砕いておしえてくれたり、プラクティスの背景まで説明してくれたのでより理解が深められる(POがスクラムマスターだったり、参加いただいているエンジニアの方もアジャイルに理解が深い方だったというのもある)


QAだけだと見える範囲・話せる範囲も限られてしまうので、テストについて職種を跨いで話せるのは非常に大きいと感じています。

### 他、良かったポイント
- 1人で黙々と読書するよりは、モチベが高まる
    - 友達と一緒に勉強した経験と近しい。（くっちゃべったり、ゲームやり始めたりと脱線しちゃうこともありますが・・笑)わからないことはお互いに補足しあって、新しい気づきを得られる。みたいな
    - 意見を言い合ったりするのでただ読むよりはアウトプットも兼ねているので記憶へ定着しやすい
- 議論するときは、今実施している業務ベースに話をすることが多いので、自分達の開発体制やプロセスを俯瞰してみる良い機会になる
    - ここはうちのチームもできてる。でもここは微妙かもなぁ。といった感じ
### その他感じたこと
- 当たり前ですが、週一回30分なので進むペースは個人で読むよりは遅い
- まだ最後まで読み切っていないですが、終わりが見えてきてすでに達成感を感じている

## まとめ
総じてやってよかったなと。
もともとのきっかけはJSTQBのアジャイルテスト担当者ALシラバスを読むことなので、FLが終わったらALをみんなで見て業務に活かせるようにしていければと考えています。

私は昔から読書より完全にマンガ派だったので、正直本を読むのが苦でしょうがなかったです。（読もうと努力はするけど、どうにも腰が重い）
最近はこの輪読会をきっかけに、テストに関する本やビジネス本など興味のあるものを読むようになりました。
個人的には本を読むという習慣を作るひとつのきっかけになったので、もし本を読むのが苦手という人がいたら、輪読会を気軽に開催してみて、少しずつ本を読んで「**まずは読む**」という習慣をつくっていくのはいかがでしょうか。
技術的負債が債務超過を起こすとき

[Engineering Manager Advent Calendar 2023](https://qiita.com/advent-calendar/2023/em) の2日目の記事です。


# 背景
なぜ技術的負債を放置してはならないのか。
それは技術的負債が現実の負債のように債務超過、すなわちシステム・組織の破綻を引き起こしうるからである。
この記事では、「技術的負債の債務超過」を定義し、それがどのようにして起こるかを説明する。
また、債務超過状態にあるシステムを回復させる方法と、健全なシステムについても合わせて説明する。

# 技術的負債の債務超過とは

この記事では以下のように定義する。

- 技術的負債が溜まっているので人員が去っていく、人員が去っていくので技術的負債を返済できず更に溜まっていく、という負のループに陥っている状態
- それが進んで、資産（システム）を保守・拡大するための機能開発にすら人員を割けなくなる状態

この状態になると、システム・組織は危機的状況にあると言える。
この記事では、これを説明するためモデル化してみる。


# 負債・人員・資産の制御モデル

技術的負債と、それを取り巻く人員と資産の関係を以下のようにモデル化する。
このモデルは制御理論で利用するブロック線図がベースになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/2cd5f2e4-c78f-5c97-5099-4470a43feec1.png)

矢印を説明すると以下の通りとなる。
- 人員は機能開発をすることで技術的資産を貯めていく
- 人員は技術的負債を返済する
- 人員は採用によって増えたり退場によって減ったりする
- 機能開発は負債を生み出す

技術的資産とは要するに開発対象のシステムそのもののことである。
「機能開発は負債を生み出す」こと自体に大きなネガティブな意味合いはない。負債を抱えつつ資産を拡大する（投資する）イメージである。

これを基本のモデルとする。

# 負債がもたらす負の影響

続いて、ここに、いくつかの矢印を書き加える。
ここで追加する矢印は負債の債務超過に関わる重要なものである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/81d84612-bd3f-d1b3-3023-ec9b3a625b8d.png)

追加した矢印について詳細を説明する。

## 技術的負債は経年で加算されていく

技術的負債は有利子負債であり、何も手を加えていないと増えていく。

 - トレンドの変化により時代遅れになる
 - セキュリティリスクが見つかる
 - データストアにデータが蓄積する
 - SaaSやクラウドのサポートが打ち切られ利用不可になる
 - 最新版までの距離が遠くなっていく
 - etc.

## 技術的負債は人員計画に負の影響をもたらす

主観的かもしれないが、技術的負債が人員計画に負の影響をもたらす要因は無視できない。

 - 負債が溜まることで今ある人員の退場リスクが高まる
 - 負債が溜まることで新しい人員の採用が難しくなる

なぜなら、負債が溜まっている状態で開発を続けることはキャリアアップに繋がらなくなりがちだからである。

 - トレンドの習得ができずキャリアアップに繋がらない
 - （トイルにリソースを割かれ）本質的な仕事ができずキャリアアップに繋がらない

# 危険な状態

以上の制御モデルを用いて、負債がエスカレートして「債務超過」したケースを見ていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/f783cbc9-d271-ad7d-61ab-538d538deb5a.png)

負債が負債を増やすフィードバックループと、負債が人員を減らすフィードバックループが増大し、人員は減り続け、負債は増え続ける、という負のループに突入する状態である。

制御理論でいう不安定な状態である。

これが本記事でいう「技術的負債の債務超過」である。

これが続くと、資産（システム）を保守・拡大するための機能開発にすら人員を割けなくなり、いつしか競争優位を喪失してしまいかねない。

## どうやって危険な状態から脱出するか

債務超過状態は自然には解決しないので、回復させるためには以下のような痛みを伴う施策を打つ必要がある。

 - 報酬を増やすなどして、人員の採用を強化したり、人員の流出を食い止めたりする
 - 機能開発を出来る限り停止して、人員リソースを負債返済に充てて、機能開発による負債の増加を食い止める
 - 資産を削減することで負債を返済する。不採算事業を整理しコンパクト化する。すなわち、一部機能を廃止し、その機能に関連する技術的負債を返済する。

# 健全な状態

最後に、健全なモデルを考える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/714dd549-3921-bc51-f521-0ef7996f5cbf.png)

人員を供給し、それが資産の増大（事業成長）に変わる。その過程で負債が増えていくので、一部のリソースを使って健全に負債増加を抑える。

これは制御理論でいう安定な状態である。

通常の事業と同様に、人員、事業、負債が安定的に拡大していくのはある意味理想と言える。

機能開発に力を入れるフェーズで負債が一時的に増えていても、それによって事業が拡大しているのであれば、将来的に人員を増やして負債返済に割くリソースを増やすこともできる。

# まとめ

この記事では、制御理論のモデルと財務の比喩を用いて、技術的負債がシステムを破綻させる可能性について述べた。
また、破綻状態にあるシステムを回復させる方法と、健全なシステムについても同じモデルを用いて言及した。

---

明日は @chomemaru3 さんが「フィードバックをポジティブな場にするために気をつけていること」をお送りします。
ChatGPTと謎のプログラミング言語: 自然言語とPythonの混合



## はじめに

こんにちは！
この記事では、プロンプトエンジニアリングの小ネタについて紹介します。
内容としては、自然言語とPythonを混ぜた謎プログラミング言語（？）の謎ソースコード（？）をChatGPTをインタープリター（？）に見立てて解釈させます。

## 自然言語とPythonを混ぜたプログラミング言語

**自然言語とPythonを混ぜた謎プログラミング言語（？）の謎ソースコード（？）**

```python
results = []
for _ in range(3):
    Pythonの勉強方法についてアイデア出しを行い、result に代入する
    resultを表示する
    if 良いアイデア:
         results.append(result)

long_prompt = resultsを一つの長いpromptに結合
long_promptを表示する
long_promptを参考に、Pythonの勉強方法の計画を立てる
```

**ChatGPTをインタープリター（？）に見立てて解釈させた実行結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/7355cbc4-078c-28c7-9072-24f28ec0644a.png)

ChatGPTの解釈力を持ってすれば、謎プログラミング言語（？）の謎ソースコード（？）も解釈してくれます。

:::note warn
- 生成AIは確率的な挙動をするため、結果を保証するものではないことをご留意ください。
- GPT4などの高性能な言語モデルを使用することを推奨としています。
:::


## おまけ：この記事のタイトルをアイデア出しさせ、一番良いタイトルを選ぶ

```python
記事 = """ ～省略～ """
results = []

for _ in range(10):
    
    記事を元にタイトルを考え、resultに代入する
    resultを表示する
    results.append(result)
    
resultsの中で一番良いタイトルを選択し、best_titleに代入する
best_titleを表示する
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/8e6efd81-ba60-03ba-a074-b45b2fceb531.png)
かがみの実験

# かがみがどのように像を表せているのかの実験です。

猫の絵の表面だけがかがみに映ります。
絵とかがみに映った絵をどこから見るか（カメラの位置）で見え方が変わります。

###### |　かがみの絵　| 　←カメラ→　 | 　絵　|　　　　　|
###### |　かがみの絵　| 　　　　　  |  　絵　|　←　←カメラ　|


実験のようすです。https://youtube.com/watch?v=JxgHbqCa7hU&feature=shared

実験から

私たちはかがみを見たときどこから見ているのかが解かりました。

私たちはが左右をかん違いしていてかがみの像は反対では無くそのままでした。
とも言える事が解りました。
[Unity] PackageInstallerからgitで入れたパッケージが CS0246 エラー

# 概要
- VContainerを導入しようと思いPackageManagerから入れたが動かない
- 結論はAssemblyDefinitionをちゃんと確認しましょうという話
- VContainerを連呼していますが、VContainer様の問題では全くございません。念のため。
- 本当に初心者的な内容ですが、自分を含め将来同じ問題を抱えた方の為に恥をしのんでメモさせていただきます。

# 前提
- C# や VisualStudio 使い始めたばかりの者が書いて言います。
- 個人で作っているゲームの開発が進むに連れて、依存関係とかテストが書きにくく、開発速度がでてないなと感じる日々でした
- ここは一念発起してVContainerなるものに手をだしてみました。

VContainerはDIを実現するツールとして手頃感もあり導入しました。詳細は以下を読めばよいと思うので割愛します。

https://vcontainer.hadashikick.jp/ja/

# ハマったこと
- インストールマニュアルを読みながらPackageManagerからgit経由でVContainerを、現在開発中のプロジェクトにインストール
- さっそくusing VContainerからサンプルを書き始めるとエラー

```text:en
Assets\Scripts\SceneTitle\GameLifetimeScope.cs(3,7):error CS0246:
The type or namespace name'VContainer' could not be found
(are you missing a using directive or an assembly reference?)
```

```text:ja
エラー	CS0246	型または名前空間の名前 'VContainer' が見つかりませんでした
(using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
```

- 色々なインストール方法を試したり、importでプロジェクト内に配置してもだめ
- 以前からインストールしていたTextMeshPRO関連は問題なく動作している
- 試しに全Packageをクリアして全ていれなおしても、gitインストールのVContainerだけがエラー
- VContainerあきらめてZenjectをインストールしても同様のエラー
- UnityのVersionをあげてみたが変わらず。
- 試しに別のUnityProjectを作成してインストールしたらVContainerが動作した
- いろいろやるも数日間どはまり

# 解決
- 動作したプロジェクトと、動作しなかったプロジェクトの差異を確認していてasmdefの設定があったことを思い出す。
    - 最初につくった時に「ふーん」くらいしか思ってなかった。
- この参照がTextMeshPROしか入っていなかった。ここにVContainerを入れたところ、参照が通るようになった。

![スクリーンショット 2023-11-28 113133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843037/be9b723a-b491-5ca9-c44c-59da63bfd257.png)

# 所管
- これパッケージを入れる度に更新するものなのかはわかりませんが、そんな手順をあまり見かけないような気がしています。（違ったらごめんなさい）
- 実は少し前にプロジェクト名をUnityの設定でリネームした(つもりになっていた)が、旧プロジェクト名がいたるところにでてくる問題にこまっておりました。
    - 具体的にはUnityが参照するslnファイル名が、旧プロジェクト名になっており、slnをRegenerateしても旧プロジェクト名.slnが作成されてしまう
    - 結果UnityでScriptをクリックして開けるVisualStudioのプロジェクト名が、旧プロジェクトになっていました
- プロジェクト名はasmdef内のNameという属性で設定するっぽい。こちらを設定することで変更することができました。
- プロジェクト名関連でファイルや設定をいじった結果、asmdefの更新がされなくなった？のか？とか想像しています。はて。
Next.js 14 @styled-jsx/plugin-sass Error: Failed to resolve "@babel/runtime/regenerator" relative to

* [yarn pnp not working on nextjs 14 with babel #58136](https://github.com/vercel/next.js/issues/58136)


## Error

```
$ npm run dev
...
Error: Failed to resolve "@babel/runtime/regenerator" relative to
...
```

## Cause

Next.js 14 has a bug.


## Interim Solution

Use Next.js 13 instead.

```
$ npm install next@13
```
英語の学習をし[ながら] chatGPT

英語が必要不可欠な時代。
英語学習のための時間を確保するのが、苦手です...。
**普段の作業を英語で行えたら便利なのでは？？**

英語の学習しながら普段の作業が行えるchatGPT作ってみました。

https://chat.openai.com/g/g-LPfA5ydCE-talk-anser-jp2en

## 機能
以下のように質問してみた。
>You are an expert in web development. I would appreciate your positive advice and input to me as a new engineer in the future.
What would you recommend learning about language? And why?

#### ・あなたが伝えた英文を、話し言葉をベースとした正しい文法の英語に文章を改善してくれます。
>##添削文
Original Sentence:
"You are an expert in web development. I would appreciate your positive advice and input to me as a new engineer in the future."

>Corrected Sentence:
"As an expert in web development, I would appreciate your positive advice and input as I start my journey as a new engineer."

>##説明
修正理由: 元の文章の構造が少し曖昧で、誰が専門家であるかが明確ではありません。修正後の文では、話し手がウェブ開発の専門家に助言を求めていることが明確になっています。
"to me"を削除: "to me"はこの文脈では不要です。"your input"という表現は既に話し手自身へのアドバイスや意見を示しています。
"in the future"の位置: "in the future"を文末に置くと、アドバイスを将来的にのみ求めているかのように聞こえます。ここでは、"as I start my journey as a new engineer"と修正して、話し手が新しいエンジニアとしての道を歩み始める際に助言を求めていることを強調しています。

#### ・更に、その英文の内容を元にchatGPTとしての機能も果たします。（英語）
>##chatGPT
As you embark on your career in web development, it's important to focus on both the foundational aspects and the latest trends in the field. Here are some recommendations:

>Learn HTML, CSS, and JavaScript: These are the building blocks of web development. Understanding them deeply will enable you to create and understand web interfaces.
>続く.....
#### ・最後に、その要約も日本語で。
>


普段遣いする分にはかなり使えるので愛用してます。
なにか不具合あればコメントいただけると幸いです。
人のツイートの続きをAIが書いてくれるChrome拡張を作った

クソアプリアドベントカレンダー2023 15日目担当の [@nabettu](https://twitter.com/nabettu)です。

クソアプリアドベントカレンダーも今年でなんと9年目！

先日は初めてのオフラインイベントである クソアプリハッカソン を開催しました。

そのハッカソンで開発してきたクソアプリを、みなさんにお披露目したいと思います。

## 成果物

表題の通り「人のツイートの続きをAIが書いてくれるChrome拡張」を作ってきました。

![ツイートの続きを書いてくれるChrome拡張動作イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40154/8b511850-bb39-4ead-e76b-9b4733177ab6.png)

このChrome拡張を入れると、ツイートのテキストの最後に「続きを書かせる」ボタンが表示され、それを押して少し待つと、、、自動で続きのテキストを続きを追加します。

サンプルとして

> GoogleMapでぼったくりって検索すると怨嗟のクチコミが多数発見できるな。
とりあえず歌舞伎町でキャッチに付いていくとろくなことにならないってことと、韓国語でぼったくりは바가지と書くという知見を得た。

というテキストだったのが、

> その後、私は興味本位でキャッチに付いていってしまいましたが、たしかにぼったくりの被害にあってしまいました。みなさんもくれぞれも注意してください。

と、勝手に私がぼったくりにあってきたというエピソードが追加されてしまいました😂www

こんな感じで、他人のツイートでもAIに勝手に続きを書かせると意外と面白いテキストになったります。

## 使い方

こちらのリポジトリをクローンし、

1. Firebase functions にデプロイしてください。その際 API_KEY などはご自身で設定
2. contentScript の API 先を 1 の URL に変更
3. `npm run build` をして、build ディレクトリを chrome 拡張の設定画面でインストール
4. Twitter でツイート画面でリロードするとボタンがでます。（画面遷移で出たり出なかったりはご愛嬌）

https://github.com/nabettu/tweet_continue

## 作り方

こちらのアプリはテキストを取得→バックエンドに投げて、返ってきたものを追記するChrome拡張と、AIに問い合わせてテキストを返すバックエンドの２つでできています。

### Chrome拡張側の作り方

まずChrome拡張の動作としては。TwitterはSPAで動的なコンテンツが表示されているため、root要素にMutationObserverでツイートが表示される監視をします。

MutationObserverでの動作後に、ツイートのテキストをquerySelectorAllで検索し、表示されていたら続きを書かせるボタンを設置します。

続きを書かせるボタンでの動作としてはツイートテキストを取得するのですが、Twitterでは絵文字はimg要素、ハッシュタグはリンク要素などになっているため、そのあたりをプレーンなテキストに変換します。

プレーンなツイート文言ができたら、それをバックエンドに投げ、返ってきた値を元のツイートに追記して終わりです。

あとはChrome拡張用のマニフェストファイルなどを記載して、Chromeの設定から読み込むだけです。

### バックエンド側の作り方

こちらは単純にChatGPTのAPIに対して上記のテキストに下記のようなプロンプトを追加しつつ投げ込んで、結果を返すシンプルなAPIを開発します。

`${tweetText}\nというツイートの続きを書いて、その続きのテキストだけを、語尾も揃えた形で返信してください。`

その際CORSやTokenの流出などに注意してください。

## まとめ

最後までお読みいただきありがとうございました。

来年はこのクソアプリアドベントカレンダーも10年目ですので、なにかまたイベントでもやりたいですね〜

明日は @nishihara_zari さんです！よろしくお願いします！
EC-CUBEで法人カード決済・複数カード使い分け

# 基本環境
EC-CUBE4.2.2

# 【疑問】EC-CUBEで法人カード決済できるのか？

### クレジットカードの決済署名（サイン）の基本

クレジットカード決済時に必要な署名（サイン）は以下の通り

●個人カード
本人の署名（サイン）→本人口座から引落

●法人カード
カード利用者の署名（サイン）→法人口座から引落

法人カードは社長・役員・社員問わず、利用者個人の名前で発行され、決済時には利用者個人の名前の署名（サイン）が必要

![スクリーンショット 2023-11-28 10.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/e385f34d-94a3-7fca-23cb-03622f00acde.png)

# 【結論】EC-CUBEで法人カードは利用できる

会員登録：
＜氏名＞カード利用者個人名

カード情報登録：
＜カード情報＞法人カード情報

会員登録＜会社名＞を登録すると、EC-CUBE発行の領収書などの宛名が会社名になる

# 【疑問】EC-CUBEで複数クレジットカードを使い分けできるのか？

### EC-CUBE仕様

EC-CUBE会員登録情報：
氏名住所の複数登録は可能（マイページでお届け先の追加）
クレジットカードの追加は不可能

EC-CUBE決済：
決済時の支払者は会員登録者名になる（お届け先氏名ではない）

# 【結論】EC-CUBEで複数クレジットカードを使い分けできる

カードごとに会員登録が必要
氏名・住所その他の会員情報は重複可能
メールアドレスは重複不可能（別のメールアドレスが必要）

参考記事：
https://www.diners.co.jp/ja/entry_form/corporate/meigi.html
https://manablog.org/eccube_mail_check/
[Ruby]クラスメソッドと定数をprivateにする

インスタンスメソッドをprivateにするには、class定義の中にprivate領域を作って、その中で定義します。

```ruby
class C
    private

    def func
        "called"
    end
end

# private method `func' called
# pp C.new.func
```

特異メソッドや定数については、この方法が使えなかったため、記事としてまとめておきます。

## クラス特異メソッド

### `private_class_method`

`private_class_method`メソッドを使ってprivateにします。

```ruby
class C
    def self.get_const
        "const"
    end

    private_class_method :get_const
end

# private method `get_const' called for C:Class
# pp C.get_const
```


### 特異クラスのインスタンスメソッド

特異クラス定義内でprivateメソッドとして定義します。

```ruby
class C
    class << self
        private

        def get_const
            "const"
        end
    end
end

# undefined method `get_const' for C:Class
# pp C.get_const
```

単純にprivate領域に特異メソッドを書く方法は失敗します。

```ruby
class C
    private

    def self.get_const
        "const"
    end
end

pp C.get_const # => "const"
```

## 定数

`private_constant`メソッドを使ってprivateにします。

```ruby
class C
    Const = "const"
    private_constant :Const
end

# private constant C::Constant referenced
# pp C::Const
```

単純にprivate領域で定数を書く方法は失敗します。

```ruby
class C
    private
    Const = "const"
end

pp C::Const # => "const"
```
テスト自動化の実行環境について考えてみた

# はじめに :xmas-tree:
Airtestを使用したE2Eテストの自動化を行なっています。最近はiOSとAndroid環境でデイリーのビルドに対して自動テストの実行を行い、ブロッカーチェックとして活用しています。
元々検証用のPC環境を順次増やしていった経緯から、iOSとAndroidで実行するPCが分かれていました。最近、この環境を統合する必要が出てきたため、その作業を行う中でいくつかの課題と今後の構成を考える機会があったので、その内容についてまとめてみたいと思います。
 
# 統合前の環境
図のようにキューを使用したシーケンシャルな実行環境になっています。スマートフォン端末も1台だけなのでとてもシンプルな構成です。

![スクリーンショット 2023-11-28 10.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/6c01ec0e-570d-e4af-0094-c496bf399cf4.png)

- tirgger.py：ビルドが作成されるとSlackメッセージが投稿されるのでそれを監視し、該当するものがあったら予約リストにpushします
- scriptRun：実行するビルドやバージョン情報をエントリーしておくテキストファイルです
- runner.py：scriptRunを監視しており、実行エントリーがあるとrun.shを実行します
- run.sh：apk/ipaのダウンロードとインストール及び、AirtestIDEコマンドでテストスクリプトを実行します。テストスクリプト実行後Slackにテスト完了の通知を投稿します

### 実行に必要なオプション
ここで、実行に必要となるオプションについて整理しておきます。概ねこのようなものが挙げられるかと思います。
- アプリ種別（ゲームタイトル）
- ビルド種別（リージョン、ステート（用途、バージョン、サブバージョン））
- 実行スクリプト（ビルド別にするのか、共通にするのか）

# 統合後の環境
元の構成を並列化したような環境になりました。iOSを動かしていた環境にAndroid環境を持って来ています。同じ処理をするモジュールも分けて実装しています。とにかく統合の手間をかけずにひとまずの実装をしたというところになります。

![スクリーンショット 2023-11-28 11.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/15c867ce-18d6-bf31-1edb-a6d942b4c545.png)

この構成にして気づいたことは、runnerはアプリ種別やビルド種別に紐づくのではなく、スマートフォン端末に紐づくということでした。将来的にはオプションで場合分けをしてモジュールを統合するにしても、runnerの実行プロセスだけは常に今実行しているスクリプトを制御する必要があるのでスマートフォン端末と1対1で用意する必要がありそうだということです。

# 今後の環境（構成）について考えてみる
統合できるモジュールはオプションをつかって別実行できるようにしたいと考えています。また、スマートフォン端末を増やしたり、対応できるタイトルを増やしたときにも対応できるような構成にしていく必要がありそうです。
例えば、runnerの一つ前段階にdispatcherが必要かもしれません。runnerがスマートフォン端末と紐づくので、その枠を超えた制御を行う必要がでてくるからです。

# 今ある機能（とオプション）
あらためて、今できていることを整理すると以下のような機能があります。ダウンロードしないで実行する機能はテストスクリプトの調整の際にダウンロード時間を短縮するために利用しています。
- 最新のビルドを取得してインストールして実行
- ビルドを指定して実行
- ダウンロードしないで実行
- インストールしないで実行

# これから欲しい（必要な）機能
複数端末で複数のスクリプトを並列実行する時に必要となる機能について考えてみました。
- 割り込み（現在の実行を中断して別のテストを実行）
- 実行スマートフォン端末の状態によって端末を選んで実行する
- 実行するスマートフォン端末を指定して実行する
- 実行中の状態を見るビューアーがほしい
- 直前の実行結果をみて再実行するといった処理をいれたい
- 実行するビルドや使用するスマートフォン端末の優先度で割当を制御する

# おわりに :xmas-wreath1:
 まだまだ発展途上ではありますが、少しずつ強化していければと考えています。既にこういった環境を実現されている方も多くいるかとおもいますが、同じような課題をもっている方の参考になれば幸いです。
Tiltを使っているときにローカルのdockerレジストリへのpushが遅いときの改善方法

# 現象

![CleanShot 2023-11-28 at 11.12.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/60bf04a9-e793-d4f7-e195-5b2277a77196.png)

上記図のようにpush imageが遅いことがあります。

# 改善方法

![CleanShot 2023-11-28 at 11.09.27@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/3ba3b658-cfcc-0dbc-cc26-b462a8900850.png)

1. Docker Desktopの設定画面を開く
1. Features in developmentを開く
1. Use contaienrd for pulling and storing imagesにチェックを入れる
1. Apply & restartを押します

以上
Edge 119 以降の右クリックメニューで IE モードで開かせるメニューを復活させる。

# これは何？
Edge 119 以降、右クリックメニューから消えた "[新しい Internet Explorer モード] タブでリンクを開く" メニューの復元方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/fa2159ff-6ffe-8c36-80c2-0fc9c7670aa2.png)

# 方法
edge://flags#edge-consumer-ie-mode-context-menu-entries を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/049ed11b-44ae-55cd-93b6-f378ba2a04f6.png)

# 補足
試験機能に配置されたことからも、119 以降でデフォルトで非表示になったのは意図された変更です。
また試験機能は "何時削除されるか / 何時使えなくなるか" は Microsoft が自由に決めることが出来る部分ですので、本設定は恒久対応にはなりえません。
超軽量・高性能DevopsプラットフォームGitea

## はじめ
Gitea は去年10月企業を創立してから、かなり進化してきました。
日本のユーザーにとって、日本語対応があれば、使う意欲が高まるのではないかと思いますが、Gitea 自体は日本語をサポートしていますが、コミュニティ、ドキュメントと公式サポートなどはまだ対応していないです。今後対応してくれますので、期待できると思います。

2023/12/01追記：
Discordに日本語チャネルが追加されました！気楽に質問を投げましょう。私はできる限り回答していきます。
2023/12/04追記：
[公式フォーラム](https://forum.gitea.com/)で日本語専用のカテゴリも追加されました。

## Gitea とは

Gitea は Go 言語で開発されているオールインワン Devops プラットフォームです。OSS のため、自己ホストは可能です。セキュリティに厳しい会社でも、オンプレミス環境で利用できます。
バージョン 1.19.0 から、組み込み CI/CD 機能も実装されています。GitHub Actions との互換性がりますので、GitHub Actions に向けて開発されたプラグインは Gitea でも利用可能です。もちろん、CI/CD の YAML ファイルを変更なしで、簡単に GitHub から移行できます。

### 歴史
- 2016年11月 [Gogs](https://gogs.io/) からフォークした
Gogs は OSS ですが、リポジトリの管理はオーナー 1 人のみになっています。Gitea を Gogs のフォークとして開始し、コミュニティ主導の開発モデルを確立しました。

- 2022年10月 Gitea Limited という企業を成立した
コミュニティ主導の結果として、2つデメリットがありました。
1つ目は開発スピードが遅いということです。Gitea の開発者たちは余暇時間を使って、開発をやっています。それによって、新機能開発にかかる時間が長くなったり、バッグ修正はすぐ対応してくれなかったり、Gitea の成長には良くないと考えられます。企業を成立したことで、新機能開発とバッグ修正なとは迅速に対応できます。例えば、最近正式的にサポートされた CI/CD 機能はコミュニティの開発者を雇用して、2 か月間でゼロから開発したものです。
2 つ目は企業からの支援金の受け取りは面倒・できない場合があります。それを回避するため、企業を成立して、企業間のやり取りはもっと簡単に取れるような感じになっています。

公式アナウンス：

https://blog.gitea.com/open-source-sustainment/


### 特徴
- オールインワン
Git サービス、コードレビュー、チームコラボレーション、パッケージレジストリと CI/CD なといろんな機能が含まれています。機能一覧と他同類サービスの比較は下記のドキュメントから確認できます。Devops に必要な機能はほぼ全部サポートされていて、新しい機能もどんどん追加され、いつか GitLab を超えることも期待できると思います。

https://docs.gitea.com/installation/comparison

- 超軽量
リソースというのは CPU 、メモリ、デスク３つがあります。
CPU とメモリについて、ラズパイ3 (Raspberry Pi 3)でも動けます。小規模チームだっと、2コアとメモリ 1GB で十分です。パッケージも 150~200MB ぐらいしかないです。リソース消費量は少ないので、ランニングコストも比較的に少ないというメリットがあります。

https://docs.gitea.com/#system-requirements

- メンテナンス性
GitLab を利用した経験がある人にとって、一番嫌なことはバージョンアップではないかと思います。一気に最新版に更新できず、特定のバージョンにアップグレードしないといけないというケースはよくあります。この場合、事前調査が必要になってくると思います。そして、バックエンドマイグレーションのスピードも遅いと感じています。結局 1 回のメンテナンスでバージョンアップにかかった時間はかなり長いと思います。企業にとって、かなりの損失だと思います。
Gitea は直接最新版に更新でき、かつ、高性能のため、マイグレーションも速いです。バックアップ機能も組み込んでいて、1 コマンドでバックアップできます。

- サポート動作環境は充実
GitLab は Linux と PostgreSQL のみサポートされていますので、利用するには制限があることを意識しないといけないです。
Gitea は Linux 以外 Windows の実行ファイルも提供しています。データベースについて、PostgreSQL以外、Mysql、Microsoft SQL と SQliteもサポートされていて、自由に選ベます。

- Web 画面のカスタマイズは可能
Web 画面のカスタマイズはGitea自体の再開発ではなく、データフォルダーにカスタムテンプレートファイルを置くだけで変更できます。詳細は下記のドキュメントを

https://docs.gitea.com/administration/customizing-gitea

- CI/CD 機能 Gitea Actions と GitHub Actions は互換性がある
一部機能はまだサポートされていないですが、ほぼ全部の GitHub Actions のプラグインが利用可能です。YAML ファイルの置く場所は `.github/workflows` と Gitea独自の `.gitea/workflows` 両方サポートされていますので、GitHub に向け開発したプロジェクトもそのままで使えます。めっちゃ便利ですよね。

## まとめ

Gitea コミュニティは活発ですので、どんどん進化していると思います。将来は GitHub や GitLab に並べる Devops プラットフォームになることは期待できます。
更に、Gitea Cloud という SaaS も発表され、より良いサービスを提供する予定です。詳細について、下記の記事を参考してください。

https://qiita.com/yp05327/items/6358c2cdfead04c173bc

## 参考
- [Gitea Documentation](https://docs.gitea.com/)
- [Gitea - Wikipedia](https://ja.wikipedia.org/wiki/Gitea)
Python boto3を使ってS3からオブジェクトの一覧を取得する

今回はboto3でAWSを操作する最初の１歩ということでs3からオブジェクトの一覧を取得するまでやっていこうと思います。
前提としてPythonはインストール済みということで解説していきます。



# boto3の使い方

他のライブラリと同じくインストールが必要です。コマンドプロンプトでインストールします。
```python3:ライブラリインストール
pip3 install boto3
```
AWSリソースへアクセスするためにアクセスキー、シークレットアクセスキーが必要になります。
今回はAWSCLIがインストールされているため aws configureコマンドで設定しています。



これでインストールができたので、boto3を呼び出して記述していくだけです。

## boto3の記述方法

boto3の呼び出し方は以下の通りです。基本は以下の３つのステップになります。
１インポート
２クライアント、リソースオブジェクトの作成
３利用したいファンクションの呼び出し

### インポート
インポートは以下の様に記述します。
```python:boto3インポート
import boto3 
```

### クライアント、リソースオブジェクトの作成
以下のようにすることでオブジェクトの作成ができます。第１引数に呼び出したいサービスの名前を入力します。

```python:boto3インポート
client = boto3.client("s3")
```


### 利用したいファンクションの呼び出し

```python:ファンクションの呼び出し
response = s3.list_buckets()
```



## s3からオブジェクトの一覧を取得する手順

### s3に画像を３枚アップロードする
ファイルを追加をクリック。windowsだとエクスプローラーが開くのでアップロードしたいファイルを選択してアップロードする。
![2023-11-27_09h20_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622891/bae22353-ec45-cb09-6bd4-7842a696ae03.png)


### boto3のインストール
```python3:ライブラリインストール
pip3 install boto3
```

### Pythonスクリプトの作成
以下のスクリプトでｓ3からファイルの一覧を取得することができます。
```python3:s3からオブジェクト一覧取得
import boto3

client = boto3.client('s3') 

def main():
    respons = client.list_objects_v2(
    Bucket="kiyomuratest"
    )
    print(respons)


if __name__=="__main__":
    main()
```

## 公式ドキュメントの見方
boto3を使う時は公式ドキュメントを見ながら使うことになりますが、
最初の内はどこを見ていいか分からず迷子になりやすいです。
公式ドキュメントを見るときのポイントをまとめました。

**サービス名　boto3で検索する**
最初は迷子になりやすいのでサービス名 boto3で検索したほうが
早く必要情報にたどり着けます。

**クライアントとリソースがある**
boto3には大きくわけてクライアントとリソースという２種類の使い方があります。
クライアントの方が多機能リソースのほうが単機能といった感じです。
最初のうちはリソースの方をつかって、なれてきたらクライアントも使うといったやり方がオススメです。
Cognitoのトークンを取得するPythonスクリプト

Cognitoを使った認証認可周りを開発しているときに、jwtを何度も取得することになると思います。その時に使っている手元スクリプトです。シンプルですが結構使っています。

- 設定は対話形式で取得可能
- .envにも対応しています
- 必要なモジュール
  - boto3
  - python-dotenv

```py
#!/usr/bin/env python
# ------------------------------------------
# Cognitoのトークン情報を取得
# ------------------------------------------
import base64
import hashlib
import hmac
import os
from getpass import getpass

import boto3
from dotenv import load_dotenv

# .envを読み込み
load_dotenv()


# パラメータ設定
def get_parameter(key: str) -> str:
    if default := os.getenv(key):
        return input(f"{key} default({default}): ") or default
    else:
        return input(f"{key}: ")


cognito_client_id = get_parameter(key="COGNITO_CLIENT_ID")
cognito_client_secret = get_parameter(key="COGNITO_CLIENT_SECRET")
aws_region = get_parameter(key="AWS_REGION")
username = get_parameter(key="USERNAME")
password = getpass("PASSWORD: ")


# IAM権限設定は不要です
cognito_idp_client = boto3.client("cognito-idp", region_name=aws_region)

# SECRET_HASH計算
message = bytes(username + cognito_client_id, "utf-8")
key = bytes(cognito_client_secret, "utf-8")
secret_hash = base64.b64encode(
    hmac.new(key, message, digestmod=hashlib.sha256).digest()
).decode()

# Cognitoから認証情報取得
res = cognito_idp_client.initiate_auth(
    AuthFlow="USER_PASSWORD_AUTH",
    AuthParameters={
        "USERNAME": username,
        "PASSWORD": password,
        "SECRET_HASH": secret_hash,
    },
    ClientId=cognito_client_id,
)


# Tokenの表示
id_token = res["AuthenticationResult"]["IdToken"]
print("---- ID TOKEN ----")
print(id_token)

id_token = res["AuthenticationResult"]["AccessToken"]
print("---- Access TOKEN ----")
print(id_token)
```

スクリプト実行すると対話形式でパラメータ入力画面になります。

```sh
$ ./utils/get_token.py
COGNITO_CLIENT_ID default(xxxxx): 
COGNITO_CLIENT_SECRET default(xxxxx): 
AWS_REGION default(ap-northeast-1): 
USERNAME default(xxxxx): 
PASSWORD:
```

`.env` ファイルに設定を入れておいてもよいです。

```sh
COGNITO_CLIENT_ID=xxxxx
COGNITO_CLIENT_SECRET=xxxxx
AWS_REGION=ap-northeast-1
USERNAME=xxxxx
```


認証が通ればトークンが取得できます。

```sh
---- ID TOKEN ----
eyJrxxxx
---- Access TOKEN ----
eyJrxxxx
```


上のスクリプトは `USER_PASSWORD_AUTH` に対応していますが、`ALLOW_USER_SRP_AUTH` に対応したい場合は以下の記事に書いているので、組み合わせると対応可能です。

https://yomon.hatenablog.com/entry/2022/8/cognito_python
c++の入出力など便利な関数集

c++の便利な関数集です。
ご自由にご扱いください。

:::note
//でコメントを表記しています。
コメント表記は入れなくてもいいですが、**何の関数か迷わなくするためには入れといた方がよいと思います**。
:::

# 入出力
入出力に関する便利な関数です。
## 入力

N回入力を受け取ってint型の配列で返す関数
```C++
//N回入力を受け取ってint型の配列で返す関数
vector<int> vec_input (int N){
    vector<int> I(N);
    for(int i = 0; i<N; i++){
        cin >> I.at(i);
    }
    return(I);
}
```

入力を受け取ってint型で返す関数
```c++
//入力を受け取ってint型で返す関数
int input(){
    int I;
    cin >> I;
    return(I);
}
```
## 出力
Nを出力する関数
```C++
//Nを出力する関数
void output (int N){
    cout << N << endl;
}
```

受け取った配列をひとつづつ出力する関数
```C++
//受け取った配列をひとつづつ出力する関数
void vec_output (vector<int> N){
    for(int i = 0; i<N.size();i++){
        cout << N.at(i) << endl;
    }
}
```
受け取った配列を半角スペース区切りで出力する関数
```C++
//受け取った配列を半角スペース区切りで出力する関数
void vec_s_output(vector<int> N){
    for (int i = 0; i < N.size();i++){
        cout << N.at(i);
        if (i-1 != N.size()){
            cout << " " ;
        }
    } 
    cout << endl;
}
```

# 配列
配列に関する便利な関数です。

受け取った配列の合計を求める関数
```C++
//受け取った配列の合計を求める関数
int total (vector<int> N){
    int g = 0;
    for(int i=0;i<N.size();i++){
        g += N.at(i);
    }
    return(g);
}
```
VSCodeのcodeコマンドをMacで使用する

### 環境
MacBook Pro(16-inch, 2019)
macOS Monterey

## codeコマンドとは
ターミナルで使用するVSCode関連のコマンド。
例えば、ターミナル上のカレントディレクトリをVSCodeで開くことができる。

![スクリーンショット 2023-11-28 10.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587300/fa594f67-9b13-ca1c-3c68-afdfb1192ec5.png)

上記のように開きたいディレクトリに移動して、
```sh
$ code .
```
このコマンドでVSCodeが立ち上がる。

むしろ、それ以外に使用していない。
使いどころが今いちわからないコマンド。
ふだんターミナルでバリバリ作業している人にとっては必要なのかもしれないが、そもそも自分はVSCodeの中にあるターミナル（下に表示されているやつ）を使っているので、ますます使うシーンがない。

さらに**MacではVSCode側でPATHを通す必要がある。**

## VSCode上での初回設定


VSCodeを開いて、コマンドパレットを表示
```
⌘ ＋ Shift ＋ p
```

**PATH内にcodeコマンドをインストールします** 　を選択。

![スクリーンショット 2023-11-28 10.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587300/cde9f69d-8ecf-3926-6ecc-d19c32318498.png)


これでターミナルからcodeコマンドを使用することができる。

![スクリーンショット 2023-11-28 10.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587300/aa0c1ccb-d154-4ba2-100f-02690766a67a.png)
AWS API Gateway 

## 制限
    - 29秒のタイムアウト(lambdaが15分でもこっちがダメになるケースに注意)
    - 最大10MBペイロードサイズ
        - S3の前にAPI GWをおいてアップロードしようとする場合に注意。10MB以上をアップロードしたいならlambdaを挟んでpre-signed URLを返すようにするとよい

## Stage
    - Stage単位でデプロイする。クライアントはstageに対してリクエストを行う
    - ロールバック可能

## Endpoint
    - Edge-Optimized(default):
        - CloudFrontを経由してリクエスト
        - API GWは1つのリージョンのみに存在
    - Regional
        - cache(backendへの呼び出しを減らす)やより細かく配信したい場合用。
        - クライアントから直接REST APIにリクエストが届く。そのためEdgeよりレイテンシが低くなることもあるようだ。
        - CloudFrontと組み合わせも可能
    - Private(VPC)
        - VPC、PrivateLinkを経由したアクセス用


## cache
    - デフォルト300秒(5分)。min:0,max:3600s(60m)
    - stageごとに定義
    - メソッドごとにキャッシュをオーバーライド可能(特定のリクエストをキャッシュさせないとかも可能)
    - クライアントもcache-control:max-age=0 というヘッダでキャッシュを無効にできる(IAMで設定が必要)
    - キャッシュは暗号化でき、0.5GB~237GBで設定可能

 ## Error
    - 4**系エラー(Client error)
        - 400: bad request
        - 403: access denied, WAF filterd
        - 429: Quota exceeded,Throttle
    - 5**系エラー(Server error)
        - 502: bad gateway exception(lambda関数の問題がある)
        - 503: Service Unavailable Exception(backendとのアクセス問題)
        - 504: Integration Failure(API Gatewayのタイムアウト29秒など)

## Security
    - SSL使用可能
        - R53でCNAMEを定義できる
    - Resource Policy(S3バケットポリシーと同じように使える)

## 認証
    - IAM based access
    - Lambda Authorizer
    - Cognito User Pools

## loging
    - CW logs
    - CW metrics
    - X-Ray
【Swift】Swiftのライフサイクル「UIApplicationDelegate」について

# アプリのライフサイクルの基本
Swiftのアプリ開発におけるライフサイクルとは、アプリが起動してから終了するまでの間の状態遷移を管理する大事な概念！

# UIApplicationDelegateについて
- アプリの起動、終了、バックグラウンドへの移行、他の状態遷移などを管理する。

# AppDelegateの主なメソッド
## *`application(_:didFinishLaunchingWithOptions:)`*
 - アプリケーションが起動された直後に呼ばれる。初期化や初期設定を行ったりする。

## *`application(_:willFinishLaunchingWithOptions:)`*
- アプリケーションが開始される前の初期段階で呼ばれる。
- つまり、アプリケーションがまだ画面を表示する前に実行されるタイミング。
  アプリの初期化前の最後のチャンスってこと。

## *`applicationDidBecomeActive(_:)`*
- アプリがアクティブになり、ユーザーの操作を受け付ける準備が整った時に呼ばれる。
- たとえば、アプリがバックグラウンドから復帰したときなど。

## *`applicationWillResignActive(_:)`*
- アプリケーションが非アクティブになり、ユーザーの操作を受け付けなくなる直前に呼ばれる。
- たとえば、電話がかかってきたり、ホームボタンが押されたりしたとき。

## *`applicationDidEnterBackground(_:)`*
- アプリがバックグラウンドに移行した時に呼ばれる。
- データの保存や処理の停止など、バックグラウンドでの作業を行う。

## *`applicationWillEnterForeground(_:)`*  
- アプリがバックグラウンドから復帰してフォアグラウンドに移行する直前に呼ばれる。

## *`applicationWillTerminate(_:)`*  
- アプリケーションが終了する直前に呼ばれる。
- アプリの最終処理やデータの保存など、終了に必要な後始末を行う。


## おわりに
Android開発より書き方がシンプルでSwiftかわいい。
がんばるぞい！
【Swift】IOSアプリケーションの各ステージとイベントについて


# アプリの主要なステージとイベント
アプリのライフサイクルは、いくつかの主要なステージに分けることができる。
各ステージには特定のイベントや処理が関連している。

## ランチスクリーンの表示
- `起動（Launch）` 
    ユーザーがアプリをタップし、システムがアプリを起動する。
    この時点ではまだアプリのUIは表示されてないが、ランチスクリーン（起動画面）が表示される。

- `application(_:willFinishLaunchingWithOptions:)`
アプリが起動し、基本的な設定が行われる前に呼ばれるメソッド。初期化の準備などが行われる。

- `application(_:didFinishLaunchingWithOptions:)`
アプリの起動が完了し、基本的な設定が終了した後に呼ばれるメソッド。


## フォアグラウンド/バックグラウンドへの移行
- `アクティブ（Active）`
アプリがフォアグラウンドで実行され、ユーザーの操作を受け付ける状態。

- `非アクティブ（Inactive）`
アプリがフォアグラウンドでありながらも、ユーザーの操作を受け付けない状態。
（例：電話がかかってきた場合など）

- `バックグラウンド（Background）`
アプリがフォアグラウンドからバックグラウンドに移行する際の状態。
バックグラウンドでは、一部の処理が継続されるが、ユーザーの操作を受け付けることはない。

- `applicationDidEnterBackground(_:)`
アプリがバックグラウンドに移行する直前に呼ばれるメソッド。

- `applicationWillEnterForeground(_:)`
アプリがバックグラウンドからフォアグラウンドに移行する直前に呼ばれるメソッド。

## アプリの中断や終了
- `中断（Suspended）`
アプリがバックグラウンドで実行されているが、システムによって一時停止された状態。
メモリ節約のため、必要な情報は保持されるが、処理は停止している。

- `終了（Terminated）`
アプリが完全に終了し、システムから削除された状態。
    
- `applicationWillTerminate(_:)`
アプリが終了する直前に呼ばれるメソッド。

これらのステージや関連するイベントは、`UIApplicationDelegate`プロトコルのメソッドを介してアプリのライフサイクルを管理します。

## おわりに
IOS開発がんばるぞい！
Gitea Cloudが来ました

## Gitea とは

Gitea は自己ホスト可能なオールインワン Devops プラットフォームです。最初は[Gogs](https://gogs.io/)からフォークした Git ホスティングサービスですが、今は全然違うものになりました。自己ホスト可能な GitLab CE/EE と GitHub Enterpriseに近い感じなものです。
ちなみに、CICD機能 Gitea Action は GitHub と互換性があります（一部機能はまだサポートされていない）。これによって、GitHub Actionに向け開発されたプラグインやyamlファイルはそのまま使えるという便利なところもあります。

## Gitea Cloud とは

2023/11/28 Gitea Cloudは正式的に発表されました。エンタープライズ企業に向けのSaaSです。
現時点は招待制になっていますので、利用しよう、使ってみたい人は[公式サイト](https://about.gitea.com/products/cloud)でメールアドレスを登録して、後日招待メールが送信されます。

公式のアナウンス：

https://blog.gitea.com/gitea-cloud/

### 特徴

- インスタンス単位でデプロイする
GitLab の SaaS と違って、Gitea Cloud はインスタンス単位で構築してくれるサービスです。
GitLabのSaaSはアカウント単位の課金で利用できますが、インスタンス単位の場合、ライセンス購入もできますが、構築やメンテナンスなどの作業は自己責任になってしまいます。
Gitea Cloud はポータルでお好きなクラウドプロバイダーと地域を選択して、Adminアカウントの情報など必須項目を入力して、自動的に Gitea のインスタンスを構築してくれます。

- 全機能が利用できる
Gitea は昔から [gitea.com](gitea.com) というサイトがありますが、すべての機能がサポートされているわけではないです。例えば、便利なコード検索機能。Gitea Cloud 上のインスタンスはすべての機能が利用可能となっています。特に、CICD機能について、オートスケール可能なRunnerも付いています！

- セキュリティ性が高い
GitLab、GitHubなどのSaaSはパブリックアクセス可能なサービスですので、万が一バグやハッキングによるデータリークが発生しましたら、秘密データの流出の可能性があります。
Gitea Cloud は単一テナントでインスタンス単位で構築されているため、社内のみのアクセス制御は可能です。そして、データシェアの基盤ではないので、クラウド上のデータの安全性も高いと言えます。

- 課金には面倒な計算は不要
Gitea Cloud の課金はユーザー数で計算されていますので、必要なCPUやメモリなどの計算は不要です。ディスク容量制限があります。上限を超えると追加課金が発生します。
そして、年間サブスクリプションの場合、2か月分が無料となります。更に、小規模チームに対して、特別割引もあります（半額らしい）。

### まとめ

Gitea Cloud はセキュリティを重視する中小企業と小規模チームに対して、メリットはいっばいいっばいと思います。1 ユーザーの単価に対して、GitHub は 19.25 ドル ( 年間 )、GitLabは 29/99 ドル ( 年間は変わらない )、Gitea は 15.83ドル　( 年間 ) + 特別割引。充実した機能と高いセキュリティに対して、単価はやすいと思います。面倒な設定とメンテナンスも不要のため、システムを維持するための人件費も最低限に抑えられます。
Gitea 自体は日本語をサポートしていますが、現時点日本語のドキュメントとサポートはまだ対応していないのため、導入には英語でのやり取りが必要となります。
AI-102試験対策のまとめ「顔をPersonGroupに追加」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### 顔をPersonGroupに追加
* PersonGroupオブジェクトに多数の人と顔を追加する方法
* 同じ戦略はLargePersonGroup、FaceList、LargeFaceListの各オブジェクトにも適用される

#### **顔を人に追加する手順**
* 異なる人物に追加された顔は同時に処理
* 特定の1人について追加された顔は順次処理
```C#
Parallel.For(0, PersonCount, async i =>
{
    Guid personId = persons[i].PersonId;
    string personImageDir = @"/path/to/person/i/images";

    foreach (string imagePath in Directory.GetFiles(personImageDir, "*.jpg"))
    {
        await WaitCallLimitPerSecondAsync();

        using (Stream stream = File.OpenRead(imagePath))
        {
            await faceClient.PersonGroupPerson.AddFaceFromStreamAsync(personGroupId, personId, stream);
        }
    }
});
```
* `PersonCount`：人の合計数(上記例では10000)
* `CallLimitPerSecond`：サブスクリプションレベルに基づいた1秒あたりの最大呼び出し回数(上記例では10)
* `_timeStampQueue`：要求のタイムスタンプを記録するキュー
* `await WaitCallLimitPerSecondAsync()`：次の要求の送信が有効になるまで待機

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/computer-vision/how-to/add-faces

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure AI Faceサービスの顔検出モデルの指定」**

https://qiita.com/fsd-jume/items/a8a898a4297ae4657af5

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
Oracle Analytics Cloud：オブジェクトの所有権を取得する

# はじめに
Oracle Analytics Cloud（**OAC**）を使用する際には、ログインする必要があります。
OACにログインし、何らかのオブジェクト（例えばワークブック）を作成すると、作成したユーザーが所有権を持つことになります。
長く使っていると、ユーザーの入れ替わりがあるかも知れません。
かつてのユーザーが作成し、所有しているワークブック等はどうなってしまうのでしょうか？

アプリケーションロール（グループ）に対してアクセス権を設定してあれば、使用するだけなら問題ないのですが、アクセス権や共有設定は所有者でなければ変更できません。
そこで、オブジェクトの所有者を変更する手順を紹介します。

# 最初の状態を確認
- OACUser1というユーザーが、ワークブックを共有カタログ内に保存する
- OACUser1を削除する
- OACUser1が作成したワークブックの所有権を他のユーザーに変更する

というシナリオに沿って、紹介していきます。
まず、OACUser1としてOACにログインしました。
共有フォルダに2つのワークブックを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/9e7b8eab-9525-e5f0-11aa-fea9c7b4ca48.png)

ワークブックの「検査」メニューを開きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c02647d9-834b-c1d6-fb70-8943b6bb6667.png)

この直後、OACUser1は管理者によって削除され、OACにログインすることができなくなりました。

# コンテンツのリストと所有権の変更
BI Service Administratorアプリケーションロールに所属するユーザーでOACにログインします。
「コンソール」メニューをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1654038b-1094-f800-701b-86e662ce5ea5.png)

「コンテンツ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e898ca7b-8231-8051-29df-b51513f10081.png)

コンテンツ管理という画面が表示されます。
フィルタのアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/21d45055-c7d7-1cbb-973a-d85468940f0f.png)

「所有者」に「OACUser1」と入力します（削除済みのユーザー名でOKです）。
OACUser1が所有者となっているオブジェクトが一覧で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/115540bc-c15c-f75e-4ef9-c563a6b3a18e.png)

ワークブックをクリックして、「所有権の変更」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c8d6ffcd-e2f9-10e5-a9ad-580737971416.png)

タイプを「ユーザー」にして、「user」と入力すると名前の一部に「user」が含まれるユーザーが一覧で表示されます。
任意のユーザーを選択し、「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ccae7aff-6bf3-bc20-dd5e-4be59bc2aec4.png)

# 確認
カタログで、先程のワークブックの検査メニューをもう一度開いてみます。
所有者が「user1」に変更されているのがわかります。
なお、作成者は「OACUser1」で、変更者は「Admin」です（所有権を変更したユーザーです）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/24b04657-989f-6dbc-a806-8ec530476cf6.png)

# おわりに
異動や退職したユーザーが所有していたオブジェクトの所有権を、他のユーザーに変更できます。
複数のオブジェクト選択して、一気に（同じユーザーに）所有権を変更することも可能です。
profileSessionSetting file



+ [プロファイルが複製されると、ProfileSessionSetting に対して取得されるメタデータ ファイルには「null_profileSessionSettingxxxxx」という名前が付けられます。](https://issues.salesforce.com/issue/a028c00000gAwhCAAS/when-profile-is-cloned-metadata-files-retrieved-for-profilesessionsetting-is-named-as-null_profilesessionsettingxxxxx)
+ [System Administrator ProfileSessionSetting retrieved by Metadata API returns unusual filename.](https://help.salesforce.com/s/articleView?id=000381149&type=1)


------------------

+ [can not login salesforce](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PzOhN)
+ [ERROR: To log in, you need both a higher access level and an identity verification method. Contact your administrator to gain login access.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8mM6SAJ)


:::note
As an alternative solution to this issue for non-prod orgs, if you already have api access to modify metadata (eg: org is authenticated via sfdx cli), the following can be attempted: 

-  retrieve the profileSessionSetting file for admin profile 
- update requiredSessionLevel to STANDARD
- deploy the profileSessionSetting file back to the org

This should allow the admin user to login and make any further changes required. 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8mM6SAJ

非本番組織に対するこの問題の代替解決策として、メタデータを変更するための API アクセス権をすでに持っている場合 (例: 組織が sfdx cli 経由で認証されている場合)、次のことを試みることができます。

- 管理者プロファイルの profileSessionSetting ファイルを取得します
- requiredSessionLevel を STANDARD に更新します
- profileSessionSetting ファイルを組織にデプロイし直します

これにより、管理者ユーザーがログインし、必要な変更をさらに行うことができるようになります。
:::
8ビットの掛け算(小規模マイコン)(教育)


8ビットの掛け算(小規模マイコン)(教育)


目的
ビットを見てシフトして加算器に足していくやつ
乗算器の内部では、こんな事が行われているかも?
教育目的

いろいろ
したい事は、画面のアドレス計算を高速にしたい。
320,256,240,192,160,128とか。
256は、左シフト8回
128は、左シフト7回
320は、左シフト3回と加算2回の答えを左シフト5回
160は、左シフト3回と加算2回の答えを左シフト4回
240は、左シフト4回と引き算1回の答えを左シフト4回
シフト2回+加算1回ぐらいだと、思わずシフトでやってしまう。
192は、今、流行りのMSXの縦の大きさ(128+64=192)

```

al = (al << 7) + (al << 6);

```



オンラインコンパイラ

https://paiza.io/ja

axは、アキュムレータ(本来は、使いまくる　簡素している)
符号の処理は、ない
正の数の整数


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    //int ax; //アキュムレータ
    int bx; //掛ける数
    int cx; //掛ける数
    int dx; //答え
    
    bx=64;
    cx=3;
    dx=0;
    
    
    if(bx & 0x80) {printf("[80H]");dx=dx+(cx<<7);}
    if(bx & 0x40) {printf("[40H]");dx=dx+(cx<<6);}
    if(bx & 0x20) {printf("[20H]");dx=dx+(cx<<5);}
    if(bx & 0x10) {printf("[10H]");dx=dx+(cx<<4);}
    
    if(bx & 0x08) {printf("[08H]");dx=dx+(cx<<3);}
    if(bx & 0x04) {printf("[04H]");dx=dx+(cx<<2);}
    if(bx & 0x02) {printf("[02H]");dx=dx+(cx<<1);}
    if(bx & 0x01) {printf("[01H]");dx=dx+(cx<<0);}

    printf("\n");
    
    //printf("ax=[%d]\n",ax);
    printf("bx=[%d]\n",bx);
    printf("cx=[%d]\n",cx);
    printf("dx=[%d]\n",dx);

}




```

結果


```

[40H]
bx=[64]
cx=[3]
dx=[192]


```
便利なショートカットキー

# 初めに
ここでは個人的に便利だと思ったショートカットキーをまとめました。

# 実用的なショートカットキー

| ショートカットキー | 詳細 |
|:-:|:-:|
|「Ctrl」 ＋ 「C」   |コピー|
|「Ctrl」 ＋ 「X」   |切り取り   |
|「Ctrl」 ＋ 「V」   |貼り付け   |
|「Ctrl」 ＋ 「Z」   |元に戻す   |
|「Ctrl」 ＋ 「Y」   |やり直す   |
|「Ctrl」 ＋ 「A」   |全選択   |
|「Ctrl」 ＋ 「S」   |保存   |

# 文字入力で役立つショートカットキー

| ショートカットキー | 詳細 |
|:-:|:-:|
|「F7」   |全角カタカナに変換|
|「F10」   |半角英数字に変換   |
|「Shift」 ＋ 「Space」   |半角スペース入力   |
|「Shift」 ＋ 「CapsLock」   |大文字入力に切り替え   |

# Edgeで役立つショートカットキー
| ショートカットキー | 詳細 |
|:-:|:-:|
|Ctrl + Shift + B   |お気に入りバーの表示・非表示切り替え   |
|Ctrl + D   |タブをお気に入り保存   |
|Alt + D   |アドレスバーのURLを選択、編集  |
|Ctrl + E   |アドレスバーで検索   |
|Ctrl + Shift + I   |開発者ツールを開く   |
|Ctrl + Shift + K   |タブの複製   |
|Ctrl + N   |新しいウィンドウを開く   |
|Ctrl + Shift + N   |新しいウィンドウを開く（InPrivate）   |
|Ctrl + T   |新しいタブを開く・タブの切り替え   |
|Ctrl + Shift + V   |書式設定なしで貼り付け   |
|Ctrl + W   |現在のタブを閉じる   |
|Ctrl + Shift + W   |現在のウィンドウを閉じる   |
|Ctrl + 数字（１～８）   |特定のタブへの切り替え   |
|Ctrl + 9   |最後のタブへ切り替え   |
|Ctrl + Tab   |次のタブに切り替え   |
|Ctrl + Shift + Tab   |前のタブに切り替え   |
# Windowsキーのショートカットキー
| ショートカットキー | 詳細 |
|:-:|:-:|
|Windowsキー   |スタートメニューを開く・閉じる|
|Windowsキー + D   |デスクトップ表示・非表示  |
|Windowsキー + E   |エクスプローラーを開く  |
|Windowsキー + I   |設定を開く  |
|Windowsキー + L   |PCをロックする  |
|Windowsキー + M   |全べてのウィンドウの最小化  |
|Windowsキー + Shift + M   |最小化されたウィンドウをデスクトップに復元  |
|Windowsキー + P   |マルチディスプレイの選択  |
|Windowsキー + R   |ファイル名の指定・実行  |
|Windowsキー + S   |検索  |
|Windowsキー + Shift + S   |画面の一部をスクリーンショット  |
|Windowsキー + Prt Sc   |全画面をスクリーンショット  |
# PowerPoint・Excel共通のショートカットキー
| ショートカットキー | 詳細 |
|:-:|:-:|
|「Ctrl」 ＋ 「B」   |太文字|
|「Ctrl」 ＋ 「I」   |斜体文字|
|「Ctrl」 ＋ 「U」   |下線付き文字|
|「Ctrl」 ＋ 「F」   |検索|
|「Ctrl」 ＋ 「H」   |置き換え|
# PowerPointのショートカットキー
| ショートカットキー | 詳細 |
|:-:|:-:|
|「Ctrl」 ＋ 「M」   |スライドの追加|
|「Ctrl」 ＋ 「D」   |スライドのコピー|
|「Ctrl」 ＋ 「Shift」 + 「[」   |最背面に移動|
|「Ctrl」 ＋ 「Shift」 + 「]」   |最前面に移動|
|「Ctrl」 ＋ 「G」   |グループ化|
|「Shift」 ＋ 「ドラッグ」   |平行移動|
|「Ctrl」 ＋ 「L」   |左揃え|
|「Ctrl」 ＋ 「R」   |右揃え|
|「Ctrl」 ＋ 「E」   |中央揃え|
# Excelのショートカットキー
| ショートカットキー | 詳細 |
|:-:|:-:|
|「Ctrl」 ＋ 「G」   |ジャンプ|
|「Shift」 ＋ 「Space」   |行の選択|
|「Ctrl」 ＋ 「Space」   |列の選択|
|「Ctrl」 ＋ 「;」   |今日の日付を入力|
|「Ctrl」 ＋ 「:」   |現在の時刻を入力|
|「Ctrl」 ＋ 「矢印キー（↑　→　↓　←）」   |表の端まで移動|
|「Ctrl」 ＋ 「１」   |書式設定画面|
|「Shift」 ＋ 「F11」   |ワークシートの追加|
|「Ctrl」 ＋ 「D」   |上のセルを下にコピー|
|「Ctrl」 ＋ 「R」   |左のセルを右にコピー|
|「Ctrl」 ＋ 「T」   |テーブルの作成|
|「Ctrl」 ＋ 「Shift」 +　「&」|罫線の追加|

# 参考
https://support.microsoft.com/ja-jp/windows/windows-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-dcc61a57-8ff0-cffe-9796-cb9706c75eec

https://support.microsoft.com/ja-jp/microsoft-edge/microsoft-edge-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-50d3edab-30d9-c7e4-21ce-37fe2713cfad

https://www.microsoft.com/ja-jp/biz/smb/column-powerpoint-shortcut-keys.aspx

https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-1798d9d5-842a-42b8-9c99-9b7213f0040f
AsyncNotifierProviderのrefresh時にloading状態にする

ref.refreshを使う場合に、画面が瞬間的に切り替わってLoading状態になりませんでしたが、
こちらに書いてありましたのでメモ。
https://stackoverflow.com/questions/75537662/riverpod-futureprovider-refresh-data-does-go-to-loading

以下のコードのどちらかを書けばOK.

```Dart:List.dart
return somethingList.when(
      loading: () => const LoadingIndicator(),
      error: (err, stack) => Text('エラー'),
      skipLoadingOnRefresh: false, // ← 選択肢①
      data: (somethingList) {
        if (somethingList.isRefreshing) { // ← 選択肢②
          return const LoadingIndicator();
        }
```
XmlSerializer で DefaultValueAttribute を使ったときのモヤっとした動き

XML の読み書きをしているコードを見る機会がありまして色々と調べたところ、モヤモヤした気持ちになったので、皆さんに共有します。

# XmlSerializer を使っているとき DefaultValueAttribute で指定した値のときは XML に書き込まれない

見出しのタイトルの通りなのですが、XmlSerializer を使っていて、DefaultValueAttribute で指定している初期値の値になっている要素はXMLに書き出しされません。

例えば、シリアライズするクラスに Title というプロパティがあって、Title プロパティ の初期値は `default title` が必ずセットされるとします。さらに、 `DefaultValue` 属性で初期値を明記してXMLの要素として読み書きできるようにしておきます。
```cs
[DefaultValue("default title")]
[XmlElement("title")]
public string Title { get; set; } = "default title";
```
ここで、 XmlSerializer を使ってシリアライズするタイミングで `Title` の値が初期値の `default title` だった場合、XMLに書き込まれません。


この挙動は、昔から知られていたようです。既ににこういった記事があります。

https://zenn.dev/karamem0/articles/2012_04_01_000000

https://lord-hollow.hatenadiary.org/entry/20120529/p1

うーん、実に気持ちが悪い挙動です。[DefaultValue]で指定した値と同じときに、XMLに書き込まれないなんて属性名から想像できません。
これは単にバグで、仕様ではないのでは？と思い、調べてみると公式に「オプション機能だよ」と言ってそうな文章を見つけました。（訳が微妙で、英語の元文も自分は分かりにくかったので、本当にオプションだと言っているかは自信はありません）

https://learn.microsoft.com/ja-jp/dotnet/api/system.xml.serialization.xmlserializer?view=net-8.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/fb97c26a-30c0-35de-a97a-0f2917968b4b.png)

これがオプションだって言われても納得できていない自分がいます…

## DefaultValueAttribute

そもそも、DefaultValueAttribute 自体が誤解されやすそうだと思います。DefaultValueAttribute は初期値のセット自体はやってくれません。
ビジュアルデザイナーやコードジェネレーター用に使う物のようです。

https://learn.microsoft.com/ja-jp/dotnet/api/system.componentmodel.defaultvalueattribute?view=net-8.0

![Monosnap DefaultValueAttribute クラス (System.Compone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/9640a654-a7b2-fd80-62e8-d264e84a467b.png)

わざわざ「!注意」があるので、勘違いする人も多いのでしょう。

さらに公式にはこんなページがありました。

https://learn.microsoft.com/ja-jp/troubleshoot/developer/dotnet/framework/general/confusing-defaultvalueattribute

はい。分かりにくいです（笑）。

そしてこの分かりにくい DefaultValueAttribute と XmlSerializer を組み合わせることで「DefaultValueAttribute で指定した値のときは XML に書き込まれない」という、さらなる挙動を「オプション」として提供してくれているわけです。

DefaultValueAttribute のページにはビジュアルデザイナーやコードジェネレーター用に使う物のような記述があるのに、 XmlSerializer と一緒に使う場合には属性の役割（目的）が変わっているような気がして実にモヤっとします。

という、モヤっとした動きのお話しでした。