OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby芸160チャレンジ(#19)部分マッチの置換

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/19.md

```bash
別解1 $ IFS=-;a=($(<cardno));echo xxxx-xxxx-${a[2]}-${a[3]} > cardno
```

別解の方が題意がわかりやすかったので、そちらを引用させて頂きました。1234-5678-9012-3456 というカード番号の上位8桁をxxxx-xxxx-9012-3456のようにマスクします。

## 解
```ruby
# 今回は結果のファイル書き込みは割愛
srcpath = 'qdata/19/cardno'
puts File.open(srcpath, 'r').read.gsub(/^(\d{4}-\d{4})/, 'xxxx-xxxx')
```

## 所感
- 正規表現の扱いはだいぶ慣れてきた！
Ruby芸160チャレンジ(#18)group_byからのcount

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/18.md

```bash
$ declare -A x ; IFS=: ; while read {a..g} ; do x[$g]+=. ; done < /etc/passwd ; for s in ${!x[@]} ; do echo $s ${#x[$s]}; done ; unset x
```

`/etc/passwd`の中に登場するshellについて、それぞれのshellごとに個数をカウントする処理です。

```bash:出力例
/bin/bash 1
/bin/sync 1
/usr/sbin/nologin 17
```

## 解
```ruby
# /etc/passwd を行ごとに読み込んで、7番目のフィールド = シェル名があれば取り込む
shells = File.open('/etc/passwd', 'r').readlines.map do |line|
  fields = line.split(':')
  nil if fields.size < 7
  fields[6].chomp
end

# シェルの種類ごとに集計する
# group_by(&:itself)だけでは各キーごとに要素をまとめた配列が得られるだけなので
# transform_values(&:count)で各要素の数を数える必要がある
counts = shells.sort.group_by(&:itself).transform_values(&:count)
counts.each do |shell, count|
  puts "#{shell} #{count}"
end
```

## 所感
- `group_by(Enumeratorモジュール)`は、ブロック内の値ごとに要素をまとめる。なるほど。`(&:itself)`とすることで、同じ値のものをまとめることになる。
- `transform_values`もいろいろ使えそうで良い。
難読化ってなんですか？

本日はソースコードの難読化について調べてみました。


## 難読化ってなんだ？
　難読化とは、作成したソースコードの動作を変えずに、人間にとって読み取りにくく加工することです。アプリケーションの配布時やリリース時に必要になります。

### 難読化の効果
 ソースコードの難読化を行うこと以下のようなメリットがあります。
- コード上のロジックやアイディアの流出防止
- セキュリティの向上
- 改ざん防止

 ソースコードを難読化することで、可読性を下げ、コードの解析を難しくします。難読化をすることで、構造が分かりずらくなり、重要な技術や情報を保護することができます。これにより、攻撃者がコードを理解し、攻撃ポイントを見つけるのを難しくなり、セキュリティ向上の効果も付与されます。
### 暗号化との違い
　難読化は、他者からの攻撃や改善を防ぐために使用されます。似たような用語に **暗号化** があります。難読化とは違い、暗号化の目的はデータを完全に保護することをです。暗号化されたデータを読めるのは、復号するための鍵を持っている人に限られます。

## pythonでの難読化ツール

### Pyminifier
Pyminifierは、Pythonのコードを難読化、圧縮、および最小化することができます。

https://pypi.org/project/pyminifier/


### PyArmor
PyArmorは、Pythonスクリプトを難読化するためのコマンドラインツールです。

https://pyarmor.readthedocs.io/en/stable/tutorial/installation.html#installation



## 参考
https://cloudnavi.nhn-techorus.com/archives/2727
https://www.agtech.co.jp/blog/2022/10/to-protect-mobile-applications/
https://miyashinblog.com/pyarmor/
https://and-engineer.com/articles/ZJks2BAAACAA_iVM
アウトプットってカレー作りだよね

## はじめに
　何事においてもアウトプットは大切だと思います。この前、カレーを作っているとき料理のプロセスが良いアウトプットの手順とリンクできるのではないかと考えたので、検証していきます。

## まずはカレーを作ってみる
　カレーは料理の中でも結構簡単なレベルに位置すると思いますが、それゆえに様々なこだわりや工夫の仕方は多岐にわたります、ここでは一般的な作り方をおさらいしてみます。

### カレーの作り方
①　材料の準備
②　食材の加工
③　鍋に入れて炒める
④　水とルーを入れる
⑤　味を調える
⑥　盛り付ける

こんな感じでしょうか

カレーはいくつもの野菜を使用しますし、ごはん・パン・麺のどの炭水化物にも相性がいいので、かなり完成された料理といっても過言ではありません。子供から大人までどの年代でも上位に組み込んでいるのも納得でしょう。

## アウトプットの手順を考える
先ほど挙げたカレーの作り方を元にアウトプットの手順を考えてみましょう。

### 材料の準備
　まずは、必要な材料を準備しないと始まりません。これまでに得た知識や現在学んでいること、発信したいことなど必要に応じて自分の中にインプットしていきます。カレー作りでもたくさんの種類の野菜を入れたり、お肉の種類を選んだりするように、目的とするものに適した食材や鍋などの道具をそろえることが重要です。
### 具材の加工
　カレーに入れる具材を一口大に切るように、集めた知識や技術を適切に加工しましょう。具材を切る包丁という道具は使い方によって危険が伴う場合があります。それと同じように各種ツールも使い方や原理をしっかり理解する必要があるといえるでしょう。
　

### 鍋に入れて炒める
　さあ、集めて加工した各種具材を一つにまとめるフェーズです。鍋の大きさや形を適切に選択して具材を炒めましょう。炒めるときの火加減は超大事です。弱いと時間がかかってしまう、強いとすぐに焦げてしまいます。ところで、アウトプットにおける火加減は何に当たるのでしょうか。

### 水とルーを入れる
　水とカレールーを加えるのは、インプットした知識や加工したアイデアに深みと方向性を与えるようなものです。水は知識を広げるための追加情報や背景知識を象徴し、ルーはそれらを結び付けて具体的な形にするための理論やフレームワークと言えるでしょう。この段階でカレーの基本的な味が形成されるように、アウトプットの主要なメッセージやコンセプトがこの時点で明確になります。
### 味を調える
　ここでは、カレーの味を細かく調整するように、アウトプットを微調整します。追加のスパイスや調味料は、アウトプットに深みや独自性を加える追加情報や新しい視点を加えることを表しています。スパイスや隠し味は適切なバランスと調和を見つけることが重要で、これによりアウトプットはより魅力的で説得力のあるものになります。
### 盛り付ける
　最後完成したカレーをきれいに盛り付けしましょう。盛り付け方一つでカレーの印象が大きく変わるように、アウトプットの形式や方法、伝え方によってその効果は大きく異なります。清潔な皿に美しく盛り付けることで、アウトプットはより多くの人に受け入れられ、影響力を持つことができます。


## おわりに
　「作ったカレーは一晩寝かせると味が良くなる」とよく言われます。完成した成果物も一晩寝て、スッキリした状態で見直してみると、改めて気づくことがあるでしょう。
 　さらに、料理は何度も作ることでより良いものができたり、以前よりも短い時間で効率よくできたりします。アウトプットも何度も行うことで、より良いものが短時間でできるようになると信じています。
Apache Kafka®のキーコンセプト

<font color="Grey">*[Apache Kafka® key concepts](https://aiven.io/blog/apache-kafka-key-concepts)の翻訳です。*</font>

2022年3月20日

# Apache Kafka®のキーコンセプト

Apache Kafka®に関する用語集です。

## ブローカー


個別のApache Kafkaサーバー。スタンドアローンの場合もあるが、通常はノードの大きなクラスタの1つである。ブローカーとは、Apache Kafka自体を実行しているサーバーのことで、周辺ツール（Apache Kafka Connectなど）とは異なる。


## コンシューマー


Apache Kafkaからデータを読み込み、何らかの処理を行うアプリケーション。Apache Kafkaでよく使われる様々なツールも、実際にApache Kafkaと通信しているときは、最終的には単純なプロデューサーかコンシューマーである。


## コンシューマーグループ


多くのApache Kafkaブローカーがスケーラブルなプラットフォームを作るためにクラスタ化されるのと同じように、コンシューマーも通常、アプリケーションの単一のインスタンスを超えてスケールする必要がある。複数のアプリケーションを実行する場合、どのインスタンスがどのメッセージを処理するかを調整する必要がある。ありがたいことに、Apache Kafkaにはコンシューマのグループという概念が組み込まれており、アプリケーションの異なるコピーを異なるパーティションに割り当て、作業負荷を均等に分散させることができる。


## イベント駆動型アーキテクチャ


アプリケーションアーキテクチャ


## イベント


(レコード、メッセージ) 1つの個別のデータの塊で、Apache Kafka上で生成されたり、Apache Kafkaから消費されたりする最小単位。メッセージは常に "値"（電子メールに例えると、メッセージの本文）を持つが、多くの場合、"キー"（メッセージが関連する何かを識別する簡単な方法）と "ヘッダ"（電子メールのヘッダに似た、メッセージに関するメタデータ、例えば "From "や "To "や "Date "など）も持つ。


## Kafkaノード


ブローカーを見る


## Kafka サーバー


ブローカーを見る


## メッセージ


イベントを見る


## パーティショニング


膨大な量のデータを扱う場合、1台のサーバーでは十分でないことがよくある。これは、総量が足りない（ディスクの容量が足りない）か、アプリケーションの数が多すぎて、1台のサーバーではすべてのアプリケーションを処理するのに手間取ってしまうかのどちらかです。パーティショニングとは、Apache Kafkaが与えられたトピックを複数のサーバーに分割する方法であり、与えられたサーバーを常にパーティションの「リーダー」（プロデューサーがそのパーティションのデータを送信する場所）として扱います。パーティショニングは、複数のサーバー間でデータを "シャーディング "する方法の基本であり、いくつかの重要な利点がある。

レプリケーションはパーティションごとに行われ、メッセージの順序の保持はパーティション内でのみ保証されます。どのパーティションにパブリッシュするかを選択する際、アプリケーションはほとんどの場合、メッセージのキーを使用します（これは通常、ライブラリ内に隠されています）。パーティション数を変更することは、パーティション数の増加、減少の両方に影響するため、将来のニーズを考慮し、新しいトピックを作成する際には注意が必要です。


## プロデューサー


Apache Kafkaにデータを書き込むアプリケーションのこと。データは構造化されたものであったり、単純なテキスト列であったりするが、データそのものを説明するための[追加メタデータ](https://aiven.io/blog/tips-for-designing-payloads)を持つことが多い。


## Pub/sub


メッセージングアーキテクチャの一つで、あるアプリケーションがメッセージを発行し、それを他のリスニングアプリケーションにコピーする。これはラジオ放送に似ており、正しい周波数にチューニングされた人は誰でも中央のポイントから送信される音声を聞くことができる。これと対照的なのが、ポイント・ツー・ポイントのアーキテクチャで、そこではプロデューサーとコンシューマーが直接結合され、お互いを認識することになる。Apache Kafkaはニアリアルタイムだが、サブスクライバーはメッセージが公開された瞬間に耳を傾ける必要がある。


## キューイング


メッセージングアーキテクチャの一つで、プロデューサがメッセージを一定の順序で送信し、ある時点でコンシューマが送信したのと同じ順序で受信する。メッセージブローカーによっては、一度消費されたメッセージは削除され、二度と消費されないものもあるが、Apache Kafkaはそうではない。コンシューマーが中断されたり再起動されたりした場合、コンシューマーは単純に中断されたところから再開する。この "状態"（つまり "キューの位置"）は、Apache Kafka自体に保持することができる。


## レコード


イベントを見る


## レプリケーション


データに関しては、そのコピーが1つしかない場合に最大のリスクが発生する。Apache Kafkaには、複数のサーバーにデータをレプリケートする機能が組み込まれており、どのサーバーがどのデータを持っているかを追跡できる。これはトピックごとに設定する。メッセージを生成するときに同期するコピーの数は、追加のコントロールで決定する。


## トピック


Apache Kafka上のメッセージは、論理チャネル（トピック）に編成される。アプリケーションは、どのトピックに生成するか、またはどのトピックから消費するかを決定し、通常、どのトピックが使用されるかに応じてメッセージに対する期待値を持つ。例えば、"sensor-readings "や "kubernetes-logs "などだ。トピックは多くの場合、人間が読めるような名前が付けられる。
2023アドカレ22: Excelで次の○曜日の日付を出す方法

# 何の記事？
これは、[ぐらだけアドカレ2023](https://qiita.com/advent-calendar/2023/c9h11o2)の22日目の記事です。少し遅刻してしまった……。

仕事で来週の水曜日・金曜日を手入力して埋めているファイルがあったので、weekday関数さんに助けてもらって解決した手順を書きました。

# 何が起こったか
下記日付を手入力している作業がありました。

毎週木曜か金曜に作るシート：　来週の水曜の日付
毎週水曜か木曜に作るシート：　今週の金曜の日付

面倒なのは、シート作成日が変動することです。
今まではtoday関数のみでやっていたため、作成日が変動した場合は手修正を行なっていました。

# 対処法
```md:来週の水曜日の日付
=TODAY()-WEEKDAY(TODAY(),2)+4+6
```
+4だけだと単純に今週の木曜日の日付になります。そこに+6をして、来週の水曜日の日付に変更します。

```md:今週の金曜日の日付
=TODAY()-WEEKDAY(TODAY(),2)+5
```
今週の表示のみの場合、シンプルです。単純に金曜日をしめす+5をしてあげればよいです。

# 仕組みなど
`WEEKDAY(TODAY(),2)`だけだと、今日の曜日に応じた以下の数字を返します。
| 曜日 | 数値 |
|:-:|:-:|
| 月曜日  | 1  |
|  火曜日 | 2  |
| 水曜日  |  3 |
| 木曜日  | 4  |
|金曜日   |  5 |
|  土曜日 |  6 |
| 日曜日  | 7  |

今回の関数では`TODAY()`の曜日分を引いて、目的の曜日の数値を足すことで、`TODAY()`が何曜日でも狙った曜日の日付が変えるようにしています。

例えば`TODAY()`が木曜日の場合、
``

```md:今週の金曜日の日付
= [木曜日の日付] - 4 + 5
= [日曜日の日付]     + 5
= [金曜日の日付]
```

……となります。

# 参考にしたリンク

https://ameblo.jp/adtop-creative/entry-11499126449.html
マークダウンなんて怖くない

## はじめに
　今回のアドベントカレンダー企画で初めてQiitaの記事を書きました。そこでマークダウン形式の記述方法も初めての経験だったので少し苦戦しました。いくつかの記事を書いた中で私が実際に行った方法をまとめてみました。

### 目次
 - [はじめに](#はじめに)
- [公式を参考にする](#公式を参考にする)
- [とりあえず書いてみる](#とりあえず書いてみる)
- [ChatGPTを活用する](#chatgptを活用する)
- [おわりに](#おわりに)


 ## 公式を参考にする
　まずは、Qiita公式が文章を見やすく装飾する方法として提示している記事を一通り読みました。全てを覚える必要はなく、よく使いそうな項目は覚えておくくらいで良いでしょう。

 

 https://qiita.com/Qiita/items/c686397e4a0f4f11683d

 　実際に大事だなと思ったのは、 **何ができるかを知っておくこと** と **その項目の名前を覚えておくこと** です。マークダウンの装飾方法で何ができるかを知っていればそれだけ表現力が高まります。そして、実際に **使う時に調べられるようにしておく** ことで、覚えることを少なくできます。

  ## とりあえず書いてみる
  　「マークダウンなんてわからないー」と嘆いていてもしょうがないので、 **とりあえず記事を書き始める** のも一つの手です。記事を新規作成を開けば、最低限必要な見出しや強調やリストなどの記述方法が表示されていますので、とりあえず書くことはできるでしょう。便利なことに **スラッシュ（/）** を入力すれば、一部の記法が補完できるコマンドが表示されるので、まず困ることはなかったです。


## ChatGPTを活用する

　私は、記事の構成を考えるときや文章の校正をしてもらうときにChatGPTを活用しています。マークダウン形式で記事を書くときも重宝しました。「○○をマークダウン形式にしてください」と投げかけるだけで簡単に変換してくれます。
 　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3601651/9c68d3f6-db0b-e27e-74fe-c395fa46a8aa.png)

　こんな感じで比較的簡単とおっしゃっているので、多少無茶でも答えてくれます。表にする場合は、データごと渡せば、見やすい形で変換してくれるので、出力結果をそのままコピーするだけで完了します。
　

たとえば、以下の記事ではChatGPTに表示の相談をしました。

https://qiita.com/eikidesu/items/23f51ca2be0803a43982

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3601651/5d59db84-c55a-0e8b-54e7-9ef41052281b.png)

そんな中で、1番使ったのが記事の目次の作成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3601651/c1d01dd2-0724-3536-fd98-f6c0c8fa083a.png)


## おわりに
　私はマークダウン記法をQiitaで初めて意識しましたが、意外といろんなところで使われてることがわかりました。たとえば、ChatGPTの出力の表示もよく見るとマークダウンで記述されていることが、見て取れました。
 　
マークダウンなんてもう怖くないです。
mindの研究 その48 bmpファイル

# 概要
mindが、謎なので調べてみた。
練習問題、やってみた。

# 練習問題
mindでbmpファイルを作れ。

# サンプルコード

```
出力ファイルは　ファイル。
四バイト化とは
　変換後は　文字列実体
　数１は　変数
　数２は　変数
　数３は　変数
　数４は　変数
　数１に　入れ
　数２に　数１を　入れ
　数３に　数１を　入れ
　数４に　数１を　入れ
　変換後を　クリア
　数１を　24ビット　右シフトし　０ＦＦＨと　ANDし　変換後に　一文字追加し
　数２を　16ビット　右シフトし　０ＦＦＨと　ANDし　変換後に　一文字追加し
　数３を　８ビット　右シフトし　０ＦＦＨと　ANDし　変換後に　一文字追加し
　数４を　０ＦＦＨと　ANDし　変換後に　一文字追加し
　変換後を　返すこと
。
二バイト化とは
　変換後は　文字列実体
　数１は　変数
　数２は　変数
　数１に　入れ
　数２に　数１を　入れ
　変換後を　クリア
　数２を　８ビット　右シフトし　０ＦＦＨと　ANDし　変換後に　一文字追加し
　数１を　０ＦＦＨと　ANDし　変換後に　一文字追加し
　変換後を　返すこと
。

メインとは
　「test.bmp」で　出力ファイルを　新規オープンし
　424dhを　二バイト化し　出力ファイルに　書き込み
　7e000000hを　四バイト化し　出力ファイルに　書き込み
　0000hを　二バイト化し　出力ファイルに　書き込み
　0000hを　二バイト化し　出力ファイルに　書き込み
　3e000000hを　四バイト化し　出力ファイルに　書き込み
　28000000hを　四バイト化し　出力ファイルに　書き込み
　10000000hを　四バイト化し　出力ファイルに　書き込み
　10000000hを　四バイト化し　出力ファイルに　書き込み
　0100hを　二バイト化し　出力ファイルに　書き込み
　0100hを　二バイト化し　出力ファイルに　書き込み
　00000000hを　四バイト化し　出力ファイルに　書き込み
　40000000hを　四バイト化し　出力ファイルに　書き込み
　10000000hを　四バイト化し　出力ファイルに　書き込み
　10000000hを　四バイト化し　出力ファイルに　書き込み
　00000000hを　四バイト化し　出力ファイルに　書き込み
　00000000hを　四バイト化し　出力ファイルに　書き込み
　0ffffff00hを　四バイト化し　出力ファイルに　書き込み
　00000000hを　四バイト化し　出力ファイルに　書き込み
　00000000hを　四バイト化し　出力ファイルに　書き込み
　7ffe0000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　40020000hを　四バイト化し　出力ファイルに　書き込み
　7ffe0000hを　四バイト化し　出力ファイルに　書き込み
　00000000hを　四バイト化し　出力ファイルに　書き込み
　出力ファイルを　クローズする
。

```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ece949a4-5124-815f-fe6a-1c2c16e5b2e5.png)



以上。
brefをCDKから利用する際、handlerとcodeに記載するパスに関するメモ

## 前提

例えば以下のようなディレクトリ構成を想定。

```
ProjectRoot
├─CDK
└─Laravel
```

`PhpFpmFunctionProps`の`handler`と`code`それぞれに記載するpathの関係をメモしておく。

## 結論

```js:ProjectRoot/CDK/lib/sample.ts
new PhpFpmFunction(this, '***', {
    handler: 'public/index.php',
    code: packagePhpCode('../Laravel',{
        ...
    }),
    ...
})
```

## 備考

https://github.com/brefphp/constructs

`handler`のpathは基本的に変えなくていい。
`code`側で指定したディレクトリ基準で圧縮され、そこからの相対パスになる。
java入門その２　forとかifとか

この記事は、[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の19日目です。
javaの使い方や書き方について学んだので、ifで条件分岐とか繰り返しとか基本的な部分を学習しようとおみます。
# if
javaの条件式は、kotlinと同じように()の中に条件を入れ、その後の{}の中に行いたい処理を書くようです。
kotlinと同じく、countに10代入⇒もし10ならOKを出力、違っていたらNGを出力
```
public class Adokare {
    public static void main(String[] args){
        int count=10;
        if(count==10){
            System.out.println("OK");
        }
        else{
            System.out.println("NG");
        } 
    }
}
```
もちろんOKが出ました。

# for 
C#と一緒です。for(int 任意の名前=初めの回数;条件;intの増加)
1から10まで
```
public class Adokare {
    public static void main(String[] args){
      for(int a=1;a<=10;a++){
        System.out.println(a);
      }
        
    }
}
```
できる。
# while 
ただのwhile。
while(条件式)でできるらしい。
forと同じものを作った
```
public class Adokare {
    public static void main(String[] args){
     int a=1;
     while(a<=10){
        System.out.println(a);
        a++;
     }
}
}

```
できた
# switch
複数の条件分岐。C# と同じ感じなので、説明は省きます。
kotlinでwhen式になると書いてあったので、違いも載せておきます。
↓javaのswitch
```
public class Adokare {
    public static void main(String[] args){
     int a=1;
     while(a<=5){
       
        
    switch (a) {
        case 1:
            System.out.println("1");
            break;
        case 2:
                System.out.println("2");
                break;
        case 3:
            System.out.println("3");
            break;
        case 4:
            System.out.println("4");
            break;
        case 5:
            System.out.println("5");
            break;
            
    }
    a++;
     }
}
}
```
1から5が出ます。
kotlin when
```
fun main() {
    var a=1;
    for(x in 1..5){
	when{
        a==1->println("1");
        a==2->println("2");
        a==3->println("3");
        a==4->println("4");
        a==5->println("5");
    }
    a=a+1;
    
    }  
    
}
```
全然違うことがよくわかると思います。
特に違うのは、もし〇〇だった時とその処理でしょう。javaではcaseを使っているのに対して、kotlinは->とかを使って簡単に説明しているようです。
# まとめ
javaはなんと、C#とほぼ同じでした。


参考

https://www.javadrive.jp/start/if/index1.html

https://www.bold.ne.jp/engineer-club/java-int

https://www.javadrive.jp/start/for/index6.html#google_vignette

https://www.javadrive.jp/start/if/index4.html

https://www.sejuku.net/blog/100849
（プレリリース）Spring '24 データテーブル：選択した内容を保持したまま検索できるように


# はじめに


Spring ’24のリリースノートが公開されましたね！リリースノートの中にデータテーブルが選択した内容を保持した状態で検索ができるようになったと書かれていたので検証します。

https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_runtime_maintain_your_previous_selections_when_you_search_a_data_table.htm&release=248&type=5

:::note warn
2023年12月現在Spring '24は、プレリリース組織での提供となってます。
:::

# 何が変わるの？

今までは選択した後に、検索をすると選択した内容が全部消えるという悲しい仕様でしたが
Spring ’24から保持された状態になります。

|今まで|Spring ’24|
|---|---|
|![スクリーンショット 2023-12-23 2.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/bdefcaee-5961-b304-56a3-c3bc7f3be693.png)|![画面フロー検証 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/e773e319-6b34-6e51-6940-1715edec118b.png)|

# 試してみる

今回の検証ではプレスリリース組織と既存のAPI58環境で同じフローを用意し
検証しました。

## フロー全体

![スクリーンショット 2023-12-23 2.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/8db60901-a506-7c0c-abee-51bc68f9fdbd.png)

## フロー作成

### 1. レコードを検索

データテーブルで使用するレコードを取得します。

![スクリーンショット 2023-12-23 2.29.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/cf9cd35a-b739-be75-02f0-c3443119b2c2.png)

### 2. データテーブルの設定

データテーブルに関して今回リリースされる機能のオンオフ画面はありませんでした。
特に意識しなくともSpring '24から利用開始できます。

![スクリーンショット 2023-12-23 2.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/e15f8728-dc87-1726-b509-df100d6ed03a.png)

### 3. デバッグ

ちゃんと選択後に検索しても
選択状態は保持されていました。

![スクリーンショット 2023-12-23 2.33.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/7a3cb46a-8cc7-56fd-3d00-abed696d7f21.png)

![スクリーンショット 2023-12-23 2.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/1b400666-3016-77da-a5ba-b5a59b7636f7.png)

その後のデータ処理でも無事選択した内容がデータとして取得できていることもわかりました。

![スクリーンショット 2023-12-23 2.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/7584a482-6890-3dbc-51a2-845c20b49bc2.png)

# 最後に

この新仕様はかなり嬉しいですね。
今まで
`検索する→選択する`の流れが一回で終わってしまっていましたが、
これからは`検索する→選択する→検索する→選択する→...`と一つ画面で検索と選択がスムーズに行えるようになります。

この新仕様が嬉しいデータテーブル使いは多いのではないでしょうか？
C++でのコメントアウトの方法をまとめみた

# はじめに
C++書いてますか？
私は最近になってUnreal Engineを勉強することになったので、C++も書き始めるようになりました。
そして、Unreal C++の勉強でUnreal公式の動画を見ていた時に、コードにコメントを書く時の形式が違っていたのが気になり、C++でのコメント/コメントアウトの書き方を色々調べたのが今回の記事のきっかけになります。

# 「コメント」と「コメントアウト」の違い
これ調べるまで勘違いしてたのですが、コメントとコメントアウトって全然違うんですね...

***
**コメント**
「ソースコード中にメモなどを記述するために、特別な構文等を使用して記述した、プログラムとして解釈されない文字列、またその内容」らしいです[^1]

**コメントアウト**
「コメント構文を使用して、ソースコードをコメントに変え、一時的にプログラムを無効化すること」とのこと
***
てっきり、コメントを書くことをすべて「コメントアウト」というんだとずっと思ってましたが、ちゃんと区別がありました。
今回はC++での3種類の「コメントアウト」記法を紹介します。

# コメントアウト記法① `//`
## 基本
まずは「コメント」でも良く使われている`//`を使ったコメントアウト方法
```cpp
int Main()
{
    // int hoge = 0;
}
```
C++で追加されたコメントアウト記法です。
一行だけコメントアウトしたい場合などに使えますね。

## 複数行のコメントアウト
複数行のコメントアウトをしたい場合は`//`を各行に記述しないといけません
```cpp
int Main()
{
    // int hoge = 0;
    // for (int i = 0; i　< 10; i++) 
    // {
    //     hoge += i;
    // }
}
```

Visual Studioなどを使用していればコメントアウトしたい行を複数選択して`Ctrl`+`K`した後に`Ctrl`+`C`を押すとすべてコメントアウトしてくれます

# コメントアウト記法② `/**/`
## 基本
一つ目の記法ではVisual Studioなど便利なIDEを使っていないと複数行のコメントアウトは面倒だったりします。
そんなときに便利なのが`/*`と`*/`で囲む方法ですね。
```cpp
int Main()
{
    /*
    for (int i = 0; i < 10; i++) 
    {
        hoge += i;
    }
    */
}
```

複数行コメントを書く時にも使われたりします。
Visual Studioなどの機能を使わない人からしたら無駄にインデントをずらさないで済むので良かったりしますね。

## ネスト構造のときの注意点
ただ、ネスト構造だとコメントアウトがうまくいかないことがあるので注意が必要です
```cpp
int Main()
{
    /*
    for (int i = 0; i < 10; i++) 
    {
        /* hoge += i; */
    }
    */
}
```
ご覧の通り、もともとfor文内で`/**/`でコメント化している部分があると正しく指定した範囲をコメント化できないという問題が起きます(今回の例ではMain()内の下2行がコメントアウトされていないのでエラーになる)。

# コメントアウト記法③ `#if 0`
## 基本
最後は、Googleで「C++ コメントアウト」と調べても中々でてこない`#if 0`を使う方法です。
```cpp
int main()
{
#if 0
	int hoge = 0;

	for (int i = 0; i < 10; i++) 
	{
		hoge += i;
	}
#endif
}
```

正確にはこの記法はコメント機能ではなく条件コンパイルと呼ばれるものらしいです。
C言語経験者ほど活用するテクニックとのこと(ほんと？)。
## 複数行・ネスト構造に対応
`#if 0`を使うと複数行のコメントアウトに対応しており、ネスト構造にも対応しています

```cpp
int main()
{
#if 0
	int hoge = 0;

	for (int i = 0; i < 10; i++) 
	{
#if 0
		hoge += i;
#endif
	}
#endif
}
```
## コメントアウトの切り替え
`#if 0`を`#if 1`に変えることでコメントアウトを切り替えることができます
```cpp
int main()
{
#if 1
	int hoge = 0;

	for (int i = 0; i < 10; i++) 
	{
#if 0
		hoge += i;
#endif
	}
#endif
}
```

## 複数の実装案の切り替え
`#if 0`はif文なので`else`を使うこともできます。
```cpp
int main()
{
	int hoge = 0;

#if 0
	for (int i = 0; i < 10; i++) 
	{
		hoge += i;
	}
#else
	int count = 0;
	while (count < 10) 
	{
		hoge += count;
	}
#endif
}
```

旧方式と新方式など複数の実装案を試したいときに切り替えが楽だったりします。

# まとめ
C++でのコメントアウトする方法として3種類紹介しました
1. 行の先頭に`//`を付ける
2. `/*`と`*/`で囲む
3. 条件コンパイルの`#if 0`を使う

個人的には
* 「コメント」には`//`を使う。
* 「コメントアウト」には`#if 0`を使う

のがいいかなあと考えています。
`#if 0`はコメントアウト以外で使われることはまずないので、コメントアウトの箇所を検索しやすいだろうなと。
また、大規模な開発だとコメントアウトする行数が膨大になったりするので、可読性の観点でも`#if 0`がいいでしょうね。

皆さんも個人でもチームでもコメント化の方法は何かしら統一するといいでしょう
意味もなく記法がバラバラだととても気持ち悪いコードになってしまいますからね...

# 余談
ちなみに、自分が見たUnreal C++の動画([C++ Battery Collector](https://www.youtube.com/watch?v=mSRov77hNR4&list=PLZlv_N0_O1gYup-gvJtMsgJqnEB_dGiM4))では`/**`と`*/`で囲んでコメントを書いていたのですが、`/**`のように`*`を1つ余分に付けているのには何か意味があるんですかね...？


[^1]:[「コメント」と「コメントアウト」と「コメント化」の違い](https://www.tee-talog.com/entry/2017/12/09/215538)
gcloudコマンドでGKEを立ち上げてみた。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。

最近色々活用し始めているgcloudコマンドからのK8Sインフラ構築を実施してみました。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

mac M1を使用し、gcloudコマンドででGKE(GCP上のK8S)を立ち上げるものになります。

## 前提

以下のコマンドを利用できている状態になっていること。
```bash
brew
```

gcpコンソールからサービスアカウントも作成すること。

## gcloudインストール(初回)
```bash
curl https://sdk.cloud.google.com | bash
brew cask install google-cloud-sdk
```

## gcloud初期設定(初回)
```bash
gcloud init
```

## gcloudログイン設定(初回)
```bash
gcloud auth login
```

## gcloud設定(初回)
```bash
gcloud config set project プロジェクト名
gcloud config set compute/zone asia-northeast1-a
gcloud config set compute/region asia-northeast1
gcloud config configurations list
```
## API有効化(初回)
```bash
gcloud services enable container.googleapis.com
```

## GKEコンポーネント導入(初回)
```bash
gcloud components install gke-gcloud-auth-plugin
```

## ~/.zshrc追記(初回)
```bash
export USE_GKE_GCLOUD_AUTH_PLUGIN=True
```

## 反映(初回)
```bash
source .zshrc
```

## kubectlインストール(初回)
```bash
brew install kubectl

kubectl version --client
```
## gcloudアップデート
```bash
gcloud components update
```

## デフォルトネットワーク作成
```bash
gcloud compute networks create default --subnet-mode=auto
```

## GKEクラスタ立ち上げ
```bash
gcloud container clusters create gke-cluster --machine-type=e2-micro --num-nodes=2 --service-account=<サービスアカウント>
```

## GKE認証情報取得

```bash
gcloud container clusters get-credentials gke-cluster 
```

## コンテキスト確認
```bash
kubectl config get-contexts
```

## クラスタ確認
```bash
kubectl get all
```

## サンプルデプロイ実施。

以下のファイルを作成する。

deploy.yml
```bash
## デプロイメント 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
spec:
  replicas: 3
  selector:           # これは deployment - pod 対応用
    matchLabels:
      app: web
  template:           # ここからポッド・テンプレート
    metadata:
      labels:
        app: web      # ポッドのラベル
    spec:
      containers:
      - name: nginx
        image: nginx:latest
```


svc-lb.yml
```bash
apiVersion: v1
kind: Service
metadata:
  name: web-service-lb
spec:
  selector:
    app: web
  ports:
  - name: webserver
    protocol: TCP
    port: 80
  type: LoadBalancer
```


以下のコマンドを入力し、デプロイする。

```bash
kubectl apply -f deploy.yml

kubectl apply -f svc-lb.yml
```

デプロイ確認

```bash
kubectl get svc
→External-IPの値を確認する。(数分待つ。)
```

以下のサイトへアクセスしてnginx画面が出てくること。

```bash
http://<External-IP>
```

## サンプルデプロイ削除

```bash
kubectl delete -f .
```

## 削除方法

### クラスタ削除

```bash
gcloud container clusters delete gke-cluster
```

### デフォルトネットワーク削除

```bash
gcloud compute networks delete default
```

# おわりに

この記事がgcloud/GKEを扱う方の助けになればと思います。
CSP契約のAzure環境で条件付きアクセスポリシーを設定する際の注意点

特定の場所以外からのアクセスを禁止する条件付きアクセスを設定することが多いのですが、CSP契約のAzure環境の場合はサービスプロバイダーを明示的にポリシーの対象から除外しないとトラブルの原因になることを最近知りました。

# サービスプロバイダーがアクセスできなくなる
CSP契約のサブスクリプションのIAM設定をみると以下のようなものが割り当てられているかと思います。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/9bcff187-c1a1-bcc7-3036-c59372b92c9e.png)

これはサービスプロバイダーがこの環境に「予約」を払い出したり、サポートケースオープン時にアクセスしたりといった管理作業で必要な権限で、絶対に消さないでください、と案内されているものです。

条件付きアクセスで全ユーザーを対象に条件付きアクセスを設定してしまうと、この外部プリンシパルも影響を受けてアクセスできなくなってしまい、トラブルの原因になるわけです。サービスプロバイダーに管理操作をしてもらわない限りブロックしていても気付かないので、最近までこういった考慮点があることを把握していませんでした。

# サービスプロバイダーを条件付きアクセスの対象外に設定しよう
このようなトラブルを防ぐために、条件付きアクセスポリシーでサービスプロバイダーを除外する設定がひっそりとありました。

条件付きアクセスポリシー設定の「ユーザー」→「対象外」に[ゲストまたは外部ユーザー]という項目がありますので、チェックを入れて、**サービスプロバイダーユーザー**を選択します。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/d0606ccc-0708-abe8-4c0e-d9c53b0a90f2.png)

サービスプロバイダーを選択すると、「外部のMicrosoft Entra組織を指定する」という項目が出てきます。テナント名を指定して特定のテナントに除外対象を絞ることもできますが、権限が割り当たっていない限りアクセスされることはないと思いますので「**すべて**」を選択しても問題ないでしょう。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/bc4ea2eb-0f33-b18b-618a-6baace4a437f.png)

# 参考元
[CSP プログラムにおけるパートナーセンターから顧客テナントにアクセスする際の条件付きアクセス ポリシーについて - 「外部ユーザーの種類の指定」による解決方法](https://jpazureid.github.io/blog/azure-active-directory/new-capolicy-for-csp-account/)
最後に

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の２５日目（最終日）

# tl;dr

- 当初予定とはだいぶ違ったアドカレになっちゃった。コマンド類の小ネタで埋める予定だったんだけど。。。（コマンドの小ネタは来年やろう）
- これからエンジニアとしてご飯を食べていこうとしている君に届けば幸い
- 大事なことは、自分で自分を導くことだと覚えておいて欲しい。過去やってきたこと、今できること、これからすること、将来どうなりたいのか、そのために今何をすればいいのか、自分で自分をコントロールして目指すところに向かって欲しい

# 振り返り

- [ ] til や dotfiles は管理できているだろうか
- [ ] 新しい何かを始めてみただろうか
- [ ] 始めたものは継続できているだろうか
- [ ] 既存のものを改善できただろうか
- [ ] 要らないものを捨てられただろうか
- [ ] これだけやった、と言えるようになっただろうか

定期的に振り返ってみて欲しい。そして来年どうするかを考えよう。

本文はここまで。以下は時間外。というか自分の記録。

# 今年の振り返り

- 新規に検証用のリポジトリをいくつか作った。うち２つは既にいじっていない（汗
- github のコントリビューション数（草）は去年の2倍なのでだいぶがんばった（と思う）
- Go と Flutter を勉強した。まだまだだけど、ある程度の読み書きに困らない程度には把握できた
- 普段遣いの terraform, ansible, AWS, DataDog, PagerDuty に関しては（これまでも）そこそこ積んだので、スキルチェンジにテコ入れが必要だと思ってる。
- リモートワークで運動不足だったが、ジムをやめて夜間のスロージョギングを新たに習慣にした。が、12月に入って寒くなってしまったので崩壊しかけている
- 読書記録をつけろとか書いてたわりに、自分ではちゃんとした記録をとってなくて不正確なんだけど、趣味のラノベは（アンリミだし）約120冊、ビジネス書は大雑把に24冊（月に2冊は読むけど大抵読み終わったらブックオフ行きなので）、技術書が25冊（これは手元にあるから正確）、その他雑多な本（趣味の本）がちょっと数えられないｗ 来年はまた真面目に読書記録をつけるようにしたい
- 旅行が2回（法事のついでにUSJが1回、家族旅行が1回）、飲み会で外出したのが7回？8回？運動習慣で少し改善したとはいえ、家から一歩も外に出ない日のほうが多いのはよくない
- 特別悪いことはなかった（はずだ）し、総じて良好な一年だった

# 来年の抱負

- terraform-jp をほったらかしにしすぎなので来年こそはオフラインイベントを！
- 先のとおり読書記録をちゃんとつける（読書メーターを再利用かな）
- 既存のリポジトリでも動きの少ないやつがあるので、仕組み化して定期的に手をいれるようにする
- その前に分散してしまっているリポジトリを集約しなおすかを検討する
- メインの仕事に支障が出ると嫌なので普段は副業とかしてないんだけど、リスキリング用に何か考えたほうがいいかもしれないとほんのり思ってる（未定）
- 健康習慣をちゃんとものにしてダイエットを成功させるぞ！ｗ

# 最後に

2024年もいい年にしましょう！よいお年を！
[bash] psqlでPostgreSQLからcsv出力する

# 結論

psqlコマンドでCOPYコマンド発行し標準出力しました。
その結果をリダイレクトしてファイルを作成しています。
```
psql -U ${user name} -h ${host name} -d ${db name} -c "COPY (${SQL}) TO stdout WITH CSV Header" > ${output path}
```

# Version

```
psql 9.4.26, server 15.2
```

# psqlコマンド

使ったオプションは以下です。
| オプション | 説明 |
|:-:|:-:|
|  -U(--username=)| デフォルトのユーザではなくusernameを指定してデータベースに接続  |
|  -h(--host=) | サーバを実行しているマシンのホスト名を指定  |
|  -d(--dbname=) | 接続するデータベースの名前を指定。省略可能（オプション以外の最初の引数としてdbnameを指定するのと同じ効力を持つ）  |
|  -c(--command=) | psqlに対し、1つのコマンド文字列を実行し、終了するよう指示。→SQL実行できる  |

参考記事（その他のオプションもあり）

https://www.postgresql.jp/docs/9.4/app-psql.html

# COPYコマンド
`COPY (${SQL}) TO stdout WITH CSV Header`
でヘッダ行を含むcsv形式を標準出力します。

https://www.postgresql.jp/document/9.4/html/sql-copy.html
Slackの小技

## はじめに
　社内のコミュニケーションツールとして使用されているSlack。弊社もチーム内や部署の垣根を越えてコミュニケーションを行う際、会社から社員へ情報連携が行われる際にSlackを使用しています。今回はSlackの小技スラッシュコマンドとショートカットに注目した記事になります。弊社もSlackを日常的に使用していることもあり、今回の記事を通して作業効率が少しでも上がることを願い、社内への連携と自身の備忘を目的とし記録します。




##  Slackとは
　Slack は、人々をそれぞれが必要とする情報につなげる、ビジネス用のメッセージングアプリです。Slack を使うことで、メンバーが 1 つの場所に集まり、チームが一体となって働くことができ、組織のコミュニケーションの方法が変わります。（Slack公式より引用）

https://slack.com/intl/ja-jp/help/articles/115004071768-What-is-Slack

## Slackの小技
#### <メンションの種類>
@channel ：オンラインメンバー・オフラインメンバー関係なく、
  　　　　　　投稿するチャンネルの全員に通知される
@here    ：投稿するチャンネルのオンラインメンバーに通知される
@everyone：#generalのチャンネルの全員に通知される
@メンバー：指定したメンバーに直接通知ができる
<br>

#### <スラッシュコマンド>
　Slackにはスラッシュコマンドシステムがあり、メッセージの入力欄に「/（スラッシュ）」を入力することで特定の機能をキー入力により簡単に呼び出すことができます。

![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3243408/4df99d87-c341-5a87-b20d-78bd88ffd471.png)

##### ・ステータス関係
| スラッシュコマンド | 内容 |
|:--:|:--:|
| /active| ログイン状態をアクティブに変更する |
| /away| ログイン状態を離席中に変更する |

##### ・チャンネル全般関係
| スラッシュコマンド | 内容 |
|:--:|:--:|
| /open #チャンネル| 指定したチャンネルを開く |
| /archive| 現在開いているチャンネルをアーカイブする |
| /rename ~~| チャンネル名を変更する |
| /who| 現在のチャンネル参加メンバーリストを表示する|
| /invite @~~| メンバーを招待する |
| /leave,/close,/part| チャンネルから退出する |
| /dm @~~ メッセージ| @~~にDMを送る |
<br>
※アーカイブ：今は使用しないチャンネルだけれど、念のため削除せず残しておきたい

##### ・その他
| スラッシュコマンド | 内容 |
|:--:|:--:|
| /remind [#チャンネル] [内容][時間]| リマインダーを設定する |
| /shortcuts| ショートカットを一覧表示する |
| /search| Slack内を検索する |
<br>
<br>

#### <ショートカットキー>
　スラッシュコマンドの他、マウスを使わずに操作ができるショートカットキーがあり、
よく使用するショートカットキーを覚えておくと作業効率アップにもつながります。
また、全てのショートカットキーを覚える必要はなく、ヘルプから一覧を確認することもできます。今回はメッセージ関連と文字の装飾について紹介します。

 ##### ・メッセージ関連
| ショートカットキー | 内容 |
|:--:|:--:|
| `Ctrl + N` | 新規メッセージ |
| `Ctrl + U`  | エクスプローラーが立ち上がり、ファイル選択ができる |
| `Shift + Ctrl + T` | スレッド画面を開く |
| `Ctrl + Shift + L`  | チャンネル一覧を開く |
| `Ctrl + Shift + K` | DM一覧を開く |
| `Ctrl + Shift + A` | 未読メッセージを表示する |
| `Shift + Esc` | 全未読メッセージを既読にする |
| `Ctrl + ▲(上の矢印キー)` | 直近のメッセージを編集する |
| `Ctrl + Z` | 直近のメッセージを削除する |


 

##### ・文字の装飾
　書式設定を活用することでメッセージが分かりやすく、重要な箇所が目に入りやすくなります。文字の装飾方法としては、以下の3つになります。
　１：書式設定のツールバーを使用する
　２：マークアップ（*アスタリスクや_アンダーバーで囲む）をする
　３：ショートカットキーを使用する

| 書式設定 | 入力方法 | ショートカットキー |
|:--:|:--:|:--:|
| ➀太文字| *アスタリスクで囲む * | `Ctrl + B` |
| ➁斜体| _ アンダーバーで囲む_ | `Ctrl + I`  |
| ➂取消線| ~チルダで囲む~ | `Ctrl + Shift + X` |
| ➃順序付きリスト| 1.[スペース]| `Ctrl + Shift + 7` |
| ➄箇条書き| *[ スペース] | `Ctrl + Shift + 8` |
| ➅引用タグ| >山括弧を先頭にする | `Ctrl + Shift + 9` |
| ➆コード| ` バッククォートで囲む ` | `Ctrl + Shift + C` |
| ➇コードブロック| ```3つバッククォートを入れる | `Ctrl + Alt + Shift + C` |


使用例↓
![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3243408/8d5f67a8-8cb3-b107-ff10-a622586d8670.png)
<br>
ブックマークレット×GoogleChat - Webhook

# 記事概要
ブックマークレットを使い、表示ページのURLと選択している文字列をGoogleChatのスペース宛に送信する。

# 方法
下記JSをブックマークレットに登録する。
```js
javascript: (() => {
	const text = window.getSelection().toString();
	const url = location.href;
	if (window.confirm(text + '\n\n↑メッセージを投げますか？')) {
		const webhook = 'https://chat.googleapis.com/v1/spaces/XXXXX';
		fetch(webhook, {
			method: 'POST',
			headers: {
				'Content-Type': 'application/json; charset=UTF-8'
			},
			body: JSON.stringify({
				text: text + '\n' + url
			})
		});
	}
})();

```

# 使い方
文字列を選択した状態で、登録したブックマークレットを利用する。
SvelteKitでURLクエリパラメーターの操作をする

:::note info
これは [MIERUNE AdventCalendar 2023](https://qiita.com/advent-calendar/2023/mierune)　23日目の記事です。
昨日は @Guarneri001 さんによる [Rustで点群データからGeoTiffを作成する](https://qiita.com/Guarneri001/items/472fd2083d95af19f27d) でした。
:::

# クエリパラメーターをセットしたい場合

```javascript
import { page } from '$app/stores';

const urlSearchParams = $page.url.searchParams;
urlSearchParams.set('lat', map.getCenter().lat.toString());
urlSearchParams.set('lng', map.getCenter().lng.toString());
urlSearchParams.set('zoom', map.getZoom().toString());

history.replaceState(history.state, '', $page.url);
```
- ポイントは最後の行のhistory.stateを書き換える点
- コレがないと書き換わってくれない
- なんか他に良い方法があるかもしれない

# クエリパラメーターを取得したい場合

```javascript
import { page } from '$app/stores';

const urlSearchParams = $page.url.searchParams;
const lat = Number(urlSearchParams.get('lat')) ?? 35.681;
const lng = Number(urlSearchParams.get('lng')) ?? 137.767;
const zoom = Number(urlSearchParams.get('zoom')) ?? 7;
```
- $page.data.qでも取得できるっぽいですが、値が入っていない時の事を考えるとurlSearchParams.getの方が扱いやすいと思います

![スクリーンショット 2023-10-25 7.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/b61024be-9c13-1225-e961-a9616bb7588e.png)

:::note info
明日は@satoshi7190さんの記事です！お楽しみにー
:::
Windows PowerShell の警告音を消す

# はじめに
* Windows PowerShell の警告音がうるさい
    * で例えば AWS Systems Manager の Session Manager 経由で Linux 環境に入った時とか、lsコマンドのあとにタブ補完連打すると「ティントン～♪」みたいに鳴るのが鬱陶しい
* この音を止める方法を記載します

# 環境
* Windows 10 Pro

# 手順

1．スタート ＞ 設定　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436115/5a70370e-4da8-c642-6d61-3118f8ac53f0.png)

---

2．システム　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436115/c4fe7fba-6492-481f-9425-be20b4789b15.png)

---

3．サウンド ＞ サウンドコントロールパネル　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436115/36bb6a64-ee5b-4c72-84fd-5d8fac179d57.png)

---

4．タブ　サウンド　にて、下記設定をして　OK　をクリック

| プログラムイベント | サウンド（変更前） | サウンド（変更後） |
| --- | --- | --- |
| システムエラー | Windows Foreground.wav | (なし) |
| 一般の警告音 | Windows Background.wav | (なし) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436115/3326a55e-d83c-8638-a7ea-4fcf5ea9b2ed.png)
JavaScript・TypeScriptにおけるfor (const key in x)に気をつけて！

## はじめに
JavaScript・TypeScriptにはオブジェクト、配列に対するさまざまな操作が提供されています。
この記事では中でも`for...in`の扱う上で注意すべき点について解説します。
```ts
const object = {
  apple: 'red',
  banana: 'yellow',
  orange: 'orange',
};

for (cont key in object) {
  console.log(object, object[key]);
}
// apple red
// banana yellow
// orange orange
```

:::note warn
後ほど記述しますが、`for...in`は多くのスタイルガイドやリンターで非推奨となっています。利用するときは明確で固い意志を持ってください。
:::

## 列挙可能な全ての値で反復する
`for...in`はオブジェクトのキーで反復処理を行う文法ですが、厳密にはオブジェクトのキーだけではなくプロトタイプなど列挙可能な全ての値で反復処理を行います。
```ts
const object = {
  apple: 'red',
  banana: 'yellow',
  orange: 'orange',
};

object.__proto__ = { grape: 'purple' };

for (cont key in object) {
  console.log(object, object[key]);
}
// apple red
// banana yellow
// orange orange
// grape undefined
```

オブジェクト自身のプロパティのみ処理する方法もあります。ES2022がサポートされていれば`Object.hasOwn`を、サポートされていなければ`Object.prototype.hasOwnProperty.call`を用いて判定すれば良いのです。
```ts
const object = {
  apple: 'red',
  banana: 'yellow',
  orange: 'orange',
};

object.__proto__ = { grape: 'purple' };

for (cont key in object) {
  if (Object.hasOwn(, key)) {
    console.log(key);
  }
}
// apple red
// banana yellow
// orange orange

for (const key in object) {
  if (Object.prototype.hasOwnProperty.call.hasOwn(, key)) {
    console.log(key);
  }
}
// apple red
// banana yellow
// orange orange
```
`object.hasOwnProperty`ではなく、わざわざ`Object.prototype.hasOwnProperty.call`を用いたのは`object`の`prototype`が汚染されて、`hasOwnProperty`がオーバーライドされていることを防ぐためです。

## 反復の順序が保証されない
`for...in`ループを使用した反復処理の順序は必ずしもオブジェクトにプロパティが追加された順序とは一致しないです。
```ts
const object = {
  '2': 'two',
  '1': 'one',
  '3': 'three',
};

for (const key in object) {
  console.log(key);
}
// 1
// 2
// 3
```
この例では、プロパティのキーが整数であるため、キーが数値順に出力されます。
`for...of`を利用することで、反復の順序をプロパティーが追加された順番できます。
```ts
const object = {
  '2': 'two',
  '1': 'one',
  '3': 'three',
};

for (const key of Object.keys(object)) {
  console.log(key);
}
// 2
// 1
// 3
```
出力順に依存した処理を書くときは注意してください。

## 配列
先ほどの話と同じような内容になりますが、配列に対して`for...in`を利用するときは配列のインデックスが文字列で返されます(下記の例は文字列であることを強調してダブルクォーテーションで書いています)。
```ts
const arr = [4, 5];

for (const key in arr) {
  console.log(key, arr[key]);
}
// "0" 4
// "1" 5
```

## 型
`for...in`はキーが文字列であるとしているのでキーの型が常に`string`になってしまいます。

以下のコードはキーが数値で定義されていますが、文中では`string`と推論されてしまいます。
```ts
const object = {
  1: 'one',
  2: 'two',
};

for (const key in object) {
  console.log(key);
}
// "1"
// "2"
```
推論だけじゃなく、実際の値も文字列として扱われることに注意してください。

正確に推論させたい場合は`Object.keys()`などを用いてキーを抽出して`for...of`で反復処理を行なってください。
対数で計算量が表現されるアルゴリズムはなぜ計算量が小さいのかイメージをつかむ


アルゴリズムの計算量について
「O(log n)とO(n log n)が小さいことだけ覚えておけばいいんだよ」と教えられたことはないでしょうか？私は誰に教わったかは覚えていませんがあります。

ですが実際問題O(log n)の計算量はなぜ少なくなるのでしょうか。
調べるうちにイメージがつかめたため、自分用のメモと今後の宿題を残したいと思います。

### この記事でわかること

- なぜO(log n)の計算量が小さいのか

### O(1)、O(n)、O(log n)の順番でイメージをつかむ

#### O(1)の計算量

例えば配列の中の要素にアクセスする際array[10]と入力して、データのアクセスする場合などがO(1)の例になります。
（この例だと、事前に配列のどこに必要な要素があるか把握している必要があります）

#### O(n)の計算量

線形探索のように、前から後ろ（逆も可）に探索していくと、最悪の計算量はデータ数であるnに一致します。つまり最悪、データ数の数だけ探索するようなアルゴリズムです。

#### O(log n)の計算量

logという言葉を聞くと非常に難しい雰囲気が出てきます。

ですので、まずは二分探索の計算量をlogなしで計算してみることにします。
（ちなみに二分探索の計算量はO(log n)です）

n=64の時、二分探索をツリー上に表すと以下のようになります。
コンパクトに収める都合上、ツリーは省略して書いています。

```
              64
            /    \
           /        \
         32          32
        /  \
       16  16    
       /\
      8  8
     /\
    4  4
   /\
  2  2
 /\
1 1←右のコッチが答えだとします
```

64から求めたい1つの答えまでたどり着くのに、6回数字を半分に分けました。なのでこの時の最悪の計算量は「6」ということになります。logを使わずとも、計算量を求めることができました。そして確かにO(n)より小さいです。

しかし毎回ツリーを描くのは難しいです。64でも相当骨が折れます。何とか簡単に計算できないでしょうか？

そこでlogが登場します。

例えばlog2 64 = Xの場合、2を何乗したら64になりますか？ということを問われています。2は6乗すると64になるので、X=6です。
logとはある数を何乗したらこの数になりますか？ということを表す式なのです。

log2 64 = 6 のような式においてlogの右隣にある2のような数を「底」と呼びます。アルゴリズムの計算においてはほとんどの場合（どれくらいほとんどかは不明ですが）「底」を2と暗黙的に決めています。

なのでO(log 64)ならO(log2 64)と読み替えてもほぼ問題はない（そうです）。
ですからO(log 97384798)だろうがO(log 638749873)だろうが計算することができます。

これは「底」が違うことによる計算量の違いが、たかだが定数倍にしかならないからだとされています。つまり小さいということ（らしい）です。
この辺の理解は「異なる底の定数倍の違い」を理解する、という宿題として次回の記事で書けるようになりたいと思います。

最後にO(n)とO(log n）の計算量の違いをグラフにしてみました。
赤：O(n)
青：O(log n）
![s-CB_0005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/b05825b1-298e-c7d4-ef8b-f5d1eca2bbb6.jpeg)

グラフからもわかるようにO(n)と比較すると、O(log n)はデータ数が増えても、計算量の増加具合が緩やかです。

つまり、私に教えてくれた方はこのイメージさえつけておけば大丈夫というのを伝えたかったんですね。なるほどー。

### まとめ

O(log n)の計算量はやっぱり小さい。
初見Databricks on GCPを使ってわかったこと 2 【Git管理の仕方】

こちらの続きです。

https://qiita.com/magisystem0408/items/83e0842ed1d9275316c7


前回までは、Databricks on GCPで、Notebookでコード作成してからMlflowにログを記録してAPI modelを作成するまでを調べました。

今回は実際に書いたコードをGithub管理したいと思います。

![空白の図(13).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/bafe23ee-de71-0050-9729-bcf11eb9a911.jpeg)


使用するリポジトリは、前回と一緒

https://github.com/magisystem0408/mi_ops_exer

まず、GithubのRepositoryをCloneしてきます。

![スクリーンショット 2023-12-23 0.52.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/f528f96d-5a5f-cc99-04a2-286839ecc4fb.png)

するとmodalが開いてcloneする画面が出てきました。

![スクリーンショット 2023-12-23 0.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/11f53876-ecb9-8a81-eec2-1c7728825110.png)

![スクリーンショット 2023-12-23 0.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/a367f1d0-71ce-337d-a4b1-015ac4fbd88e.png)


cloneされると、`Repos/メールアドレス/repo-name`となってcloneされました。
![スクリーンショット 2023-12-23 0.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/e2ab689b-0425-89fa-038d-49cf039d8b20.png)


実際にnotebookだけでなく、pythonコードも書けることに気がつきました。

![スクリーンショット 2023-12-23 0.59.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/8b6e74ec-e7f4-807b-b090-e1e2372c9e1e.png)


この中でGitのcontrollする画面は、「・・・」の部分から「Git」を選択
![スクリーンショット 2023-12-23 1.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/5dbb0679-a297-d6a0-d302-1ec3e169005e.png)


実際にGitを選択すると、Github DeskTopに似た画面が出てきた。
どうやらここらへんでbranchを変更できるらしい。

![スクリーンショット 2023-12-23 1.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/d664a613-af61-f0d0-7758-19451415b658.png)

![スクリーンショット 2023-12-23 1.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/f267a107-b1a6-d261-9082-e4c300c2ea64.png)



## 次はデータ連携について
databricks workspace on GCP とCloud storageのデータ連携について調べました。

https://qiita.com/magisystem0408/items/6f01412bb6da7dc1d89c
ControlTowerについて調査してみた！

## はじめに
この記事は[NE Advent Calendar 2023 23日目](https://qiita.com/advent-calendar/2023/ne)の記事です。

## 概要
この記事では、ControlTowerを調査することになった経緯、既存アカウントへの導入調査、コントロールについて記述しています。
ControlTowerの操作などについては記述しておりません。

## ControlTowerとは？
セキュリティサービス群にベストプラクティスに則った設定を投入し、マルチアカウント環境を構成・運用するサービスです。

## 経緯
AWS Organizationsを利用してマルチアカウントの管理などを行っているのですが、セキュリティ向上・運用の効率化を図るためにControlTowerが導入できないか調査を行なっております。

## 既存アカウントへのControlTower導入調査
- 既存アカウントが存在した状態でControlTowerを導入しても既存のサービスに影響がないかを調査いたしました。
#### 分かったこと
- ControlTowerが作成したOUにはSCPが設定されている。
    - ControlTowerを正常に稼働させるために必要な禁止項目を定義したSCPで既存のサービスへの影響はない。
- AWS Organizationsを利用して作成されたリソースはControlTowerへの登録を実施しない限り管理外になる。
    - ControlTower側で設定されているSCP,Configルールの影響を受けない。
- CloudTrail 証跡の既存のデプロイがある場合はCloudTrailの料金が重複発生するため、アカウントレベルの証跡を削除しておくと良い。

## コントロール
- AWS環境全体に継続的なガバナンスを提供する高レベルのルールです。
※本記事で紹介するものは2023年12月21日時点のコントロール内容になります。

#### ・[必須コントロール](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/mandatory-controls.html)
- ControlTowerを正常に稼働させるために必要な禁止事項をSCPで定義したもの
![必須コントロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611757/679ca879-d6df-0d26-a566-c96655f98aa7.png)

#### ・[強く推奨されるコントロール](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/strongly-recommended-controls.html)
- マルチアカウントのベストプラクティスに基づく制限事項
![強く推奨されるコントロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611757/35996861-14a3-730e-242a-2fdbdd2987a8.png)

#### ・[選択的コントロール](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/elective-controls.html)
- AWSエンタープライズ環境で一般的に利用されている制限項目
![選択的コントロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611757/9e932a6f-7b14-c657-2811-7d057a54bbe3.png)

## まとめ
既存アカウントが存在している時に新規のサービスを導入する場合、今回記述した内容以外にも検証・調査する必要があるので導入コストは高いと思いますが、ControlTowerを導入してもすぐに既存のアカウントに影響を与えることはないことが分かったので良かったです。
この記事が誰かのお役に立てると幸いです。
勉強会での小話2

# はじめに

この記事は2023年度の振り返りです。

こちらの続きとなります。

https://qiita.com/youfuku/items/344d7b522670694e304c

問題を解いてる時の実話を元に、作成しております

# 勉強会内の小話

初学者達：でも、pluckで配列にして少しずつやった方がデバックしやすくないですか？

講師：確かに。デバックで考えるとそうだけど、SQLでinに渡せる上限値っていくつかしってるか？

初学者達：・・・。上限って、あるんですか？

講師：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/04ecf476-4747-4472-2f97-9805185d063d.png)

講師：・・・普通にあるぞ。

講師：軽く調べてみよう。

https://qiita.com/tondemonai7/items/93bf71714f7f828c0164

講師：記事は古いが、DBの種類によって上限値はまちまち。

初学者達：なるほど。でも、現状ならこのままでもいいようにも思えるのですが・・・・

講師：今はな。レコードが増えてくるとinの中身も増えてくる。だから、10年後か20年後かはパンクして動かないクエリになる可能性がある。そうなるよりかは、サブクエリがいいと思うぞ。

初学者達：なるほどーー。サブクエリだと、inの中身が大幅に増えることはなさそうですもんね！

# さいごに
今回の話は、前回のinの続きとなります。
とても短くてすみません。。。
BS11 を VLC で視聴するとブロックノイズが出る

VLC で BS11 放送を視聴したらブロックノイズが気になって仕方がない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/151b40d9-a217-4be3-945e-97d03374c1f5.png)

いろいろ調子が悪かったのだけど、特に BS11 が顕著。ちょうど TV アンテナ配線も調子が悪かったのでいろいろ直して、受信電波強度はいい感じになったけれども・・・

```
# checksignal --device /dev/px4video3 211
device = /dev/px4video3
C/N = 14.668133dB^C
SIGINT received. cleaning up...
```

ブロックノイズは改善しない。

PLEX のチューナーカード + EPGStation で見ていたけど 家電の TV はきれいに見えるので、PLEX のチューナー感度悪いなーとかあらぬ疑いをかけていたが・・・

VLCが問題だった。



# 環境

- TVサーバ
  - Mirakurun + EPGStation
  - 「PLEX PX-Q3PE4 で docker-mirakurun-epgstation を使いたい」
  - https://qiita.com/nanbuwks/items/640ee4405e1fdd2ca497
  - の設定 + PLEX PX-MLT8PE の組み合わせです。
- 視聴環境
  -  intel Core i7-13700 + Asus Pro WS W680-ACE
  -  Ubuntu 22.04 LTS
  -  VLC 3.0.16


 
# 設定手順
「ツール」-「設定」-「入力/コーデック」の「ハードウェアアクセラレーションによるデコード」が「自動」になっているのを「無効」に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/984f54f4-dfd1-1cf7-ab33-49bc49b2f6c7.png)

VLCの再起動で治りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/097a1430-422d-decd-a47c-5dcdc77c3763.png)

# グラフィックスドライバ

視聴環境のグラフィックドライバを調べてみたら

```
$ lspci -k | grep -EA3 'VGA|3D|Display'
00:02.0 VGA compatible controller: Intel Corporation Device a780 (rev 04)
	DeviceName: Onboard - Video
	Subsystem: ASUSTeK Computer Inc. Device 8694
	Kernel driver in use: i915
```

gnome にしても KiCAD にしても画面でなにかあったらグラフィックアクセラレーションを切る
という i915 のいつものあるある、ということでした。
Pythonで九九の表を累積和を用いて作成する

アルゴリズム力を高めたくて以下の本で勉強していたところ, 累積和について学びました. 

https://book.mynavi.jp/ec/products/detail/id=131288

累積和は今まで使ったことがなかったので, 練習もかねてPythonで九九の表を作ってみました. 

## ソースコード
```Python: 九九の表を累積和を用いて作成する
# 実行部分
if __name__ == '__main__':
  X = [i for i in range(1, 10)]
  
  Z = [[ 0 ]*(10) for i in range(10)]
  
  # 縦方向の累積和を計算
  for j in range(1, 10):
    for i in range(1, 10):
      Z[i][j] = Z[i-1][j] + X[j-1]
  
  # 九九の表の出力
  for i in range(1, 10):
    output = Z[i][1:10]
    for j in range(len(output)):
      if j < 9:
        print(f'{output[j]:>4}', end="")
      else:
        print(f'{output[j]:>4}')
    print() 
```

Xは1から10までのリストで, Zは累積和を計算したものを格納する行列にしています. その後, 縦方向の累積和を計算してZの値を変えていくことで九九を計算しています. 
最後の出力部分は少し綺麗に見せるために桁を揃えたりしていますが, 単に出力するだけだったら
```Python
for i in range(1, 10):
    output = Z[i][1:10]
    print(*output)
```
でできます. 

## 出力
```
   1   2   3   4   5   6   7   8   9
   2   4   6   8  10  12  14  16  18
   3   6   9  12  15  18  21  24  27
   4   8  12  16  20  24  28  32  36
   5  10  15  20  25  30  35  40  45
   6  12  18  24  30  36  42  48  54
   7  14  21  28  35  42  49  56  63
   8  16  24  32  40  48  56  64  72
   9  18  27  36  45  54  63  72  81
```
初心者エンジニアが直面するAPI認証の数々

今回は、エンジニアとして現場で経験した中で、API認証について理解したことを書く。

## 基本認証（Basic Authentication）
最初に直面するのが基本認証。シンプルで直接的、ユーザー名とパスワードをBase64でエンコードして送信。簡単だが、安全性には注意が必要。

## APIキー
次に来るのがAPIキー。単純明快、特定の文字列をリクエストに添えて認証する。外部サービスとの連携にはこれがスタンダード。

## OAuth
複雑さとセキュリティの完璧なバランス、それがOAuth。トークンを用いて認証を行うこの方法は、大手サービスのAPIで主流。理解しにくいかもしれないが、重要なので覚えよう。

## JWT（JSON Web Tokens）
ここで登場するのがJWT。エレガントなトークンベースの認証で、JSONを使って情報を包み込む。特にシングルページアプリケーションで効果を発揮する。

## ベアラートークン（Bearer Token）
「持つ者が権力を持つ」、これがベアラートークンの精神。OAuthで得たトークンを使っての認証は、RESTful APIでは不可欠。

## クッキーベースの認証
直感的かつ実践的、ウェブアプリケーションではクッキーベースの認証が標準。ブラウザを通じてシームレスに動作する。

## デジタル署名
最後に紹介するのがデジタル署名。最高レベルのセキュリティを求める場面でのみ使用される。少し複雑だが、知識としては持っておこう。
VSCodeでGithub Copilot Chatを試してみる

# 1. はじめに
* Github Copilot Chatをとりあえず試してみたい
* VSCodeでPythonのコードを書いてもらいたい

# 2. 開発環境
* VSCode
* Github Copilot Chat (無料トライアル中）


# 3. 環境準備
## 3.1. Githubとの接続
* 画面右下のGithub Copilotアイコンをクリックして連携しておく
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b4fc9e8b-bce2-40ab-c1b2-4dd9c5c38a91.png)

## 3.2. 拡張機能のインストール
* 下記2機能をインストールしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5c9b3039-5ece-5f0e-01ee-e357f0181214.png)

# 4. Github Copilot Chatの動作
* 試しのプロンプトを入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5c3dd82a-547b-7a66-7872-805bc1f850d8.png)

* コードが自動作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/bf1db758-f5b9-df19-adba-f8ea970f44eb.png)

* Acceptをクリックしてコードを採用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c67ab3b6-732a-8a8b-ea04-2bd7d6d4a1ab.png)

# 4. 参考文献

https://docs.github.com/ja/copilot/using-github-copilot/getting-started-with-github-copilot
【Spring Data JPA】導入方法

# Spring Data JPA
`Spring Data JPA`の導入方法
**Gradle**の場合は
```gradle:build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
```
**Maven**の場合は
```xml:pom.xml
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
```
と記述する
気象予報AI「GraphCast」の予報が見れるサイトを紹介する

# 概要
最近、Google Deepmind社が気象予報モデル**GraphCast**を発表し、話題になりました。

GraphCastはGNN（グラフニューラルネットワーク）により、従来の数値予報モデルや機械学習ベースモデルの精度を上回る精度を出したモデルです。

詳しい説明は別記事にしてありますので、こちらをご覧ください。

https://qiita.com/matsuda_tkm/items/3d9169c9b24adff172c0


本記事では、**GraphCastが実際に出している予報を見られる**サイトをご紹介します。

# サイトにアクセスしてみる

## 気温
ECMWF（ヨーロッパ中期予報センター）では試験的にGraphCastの予報を公開しており、誰でも下記のサイトで見ることができます。

https://charts.ecmwf.int/products/graphcast_medium-t-z

アクセスすると、以下のようなページが出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/2dddfa2f-7baa-eb8b-331a-db1018d855bc.png)

右側の地図がGraphCastによる予報結果が示されています。
黒い線は等圧線（正確にはジオポテンシャル高度）、色は気温を表しています。

※**地図右下のアイコン**を押すと凡例が出てきます。

そして、現在の設定は

- Base time＝`Fri 22 Dec 2023 00 UTC`
    - → 2023年12月22日(金)0時（日本時間9時）時点の情報をもとに予報
- Valid time＝`Fri 22 Dec 2023 06 UTC (T+6)`
    - → 2023年12月22日(金)6時（日本時間15時）の予報
- Area＝`Europe`
    - → 表示されているのはヨーロッパ地域
- Level＝`1000hPa`
    - → 1000hPaの高度（地上付近）での予報

となっています。日本付近を見たい場合は「Area」を`Eastern Asia`に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/f35e8a1b-6e92-8398-c9b2-e7ef07d0c4fb.png)

もう少し先の予報を見たい場合は、再生ボタンを押してみると10日先までの予報を見ることができます。

## 風

風の予報は下記から見ることができます。

https://charts.ecmwf.int/products/graphcast_medium-uv-z

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/f70e1da9-2d4c-027e-4df1-b2cf4afcbe00.png)

色は風速の強さを表しています。色がついていない領域は風速10m/s未満です。

## 降水量

降水量の予報は下記から見ることができます。

https://charts.ecmwf.int/products/graphcast_medium-mslp-rain

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/d9bfde39-83d3-3cc1-0bbc-cfd7786d3a77.png)

色の濃淡は降水量の多さを表しており、地図右下のアイコンを押すと凡例が出てきます。

なお、ここでの降水量とは**6時間雨量（12時間雨量）** のことです。6時間か12時間かは「Interval (hr)」のところで指定できます。

また、この地図での黒線は海面気圧の等圧線を示しており、5hPaごとに引かれています。

また、**積算降水量（Base timeからValid timeまでの総降水量）** も下記から見ることができます。

https://charts.ecmwf.int/products/graphcast_medium-rain-acc

# 数値予報モデルと比べてみた
せっかくなので、数値予報モデルとGraphCastの予報を比べてみました。

- **HRES**：解像度0.1°×0.1°
- **GraphCast**：解像度0.25°×0.25°

解像度が違うので不公平ですが…。

2023年12月22日0時(UTC)をValid timeとし、T+24及びT+96の予報を見てみます。

## 気温（850hPa）
上空1500m付近の気温で比べてみました。
赤線は平地での雪の目安となる-6℃の線を表しています（手書き）。

**1日前の予報**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/05d2ab3f-5ce5-7817-b7b9-3a6fef26f5b0.png)

**4日前の予報**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/e674ebcf-add9-e6cc-87db-0635108ae19d.png)

## 風（1000hPa）
**1日前の予報**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/945e16fd-20be-9047-52a6-31b1e06feaea.png)
**4日前の予報**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/f73fdcf3-368f-a188-2633-7e909d5bbfe2.png)

## 6時間降水量
**1日前の予報**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/95832e09-123e-df1e-eabf-3ebea668b379.png)
**4日前の予報**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/919e1e9e-1e91-2cb8-6b01-4998dd4afc44.png)