OmniAICreator/Qiita-1.07M huggingface dataset:
2024/5/5主にITとかセキュリティの記事

Docker Hubのリポジトリ280万件以上がフィッシング攻撃に悪用、注意を(5/3)
https://news.mynavi.jp/techplus/article/20240503-2938126/

【3分で解説！サイバー被害が多い業種とは？】のホワイトペーパーを公開(5/3)
https://japan.cnet.com/release/30970509/

名古屋の繊維商社「豊島」に不正アクセス　顧客や取引先の情報、漏えいの可能性(5/3)
https://www.chunichi.co.jp/article/893460

米医療業界でデータ流出　1340万人の顧客に影響か(5/3)
https://www.epochtimes.jp/2024/05/222409.html

Windows 10/11/サーバーで4月のWindows Update適用後、VPN接続に失敗する不具合が発生中(5/3)
https://enjoypclife.net/windows-10-11-server-april-windows-update-vpn-connection-fails/

更新プログラムKB5036909インストールでWindows Server認証トラフィック増加の不具合(5/3)
https://news.mynavi.jp/techplus/article/20240503-2938612/

GoのOSS(Code-Hex/Synchro)にファジングテストを実装して得た学び(5/2)
https://zenn.dev/notahotel/articles/fuzzing-synchro

ネット記事に発信元情報　偽情報の拡散抑止、来年開始へ(5/3)
https://www.toonippo.co.jp/articles/-/1771519

Nifty Gateway(ニフティゲートウェイ)とは？使い方やNFTの出品・販売・購入方法を解説！(5/3)
https://the-owner.jp/archives/21519

再びソフトバンク回線を利用する政治家への「SIMハイジャック攻撃」が実施される。(5/3)
https://smhn.info/202405-sim-hijack-again

ISMSコンサルの思い出(5/3)
https://blogs.itmedia.co.jp/satou55_makoto/2024/05/isms.html?ref=rss

230万円分電子マネー詐欺被害　津の20代男性、個人情報流出とうそ　三重(5/3)
https://nordot.app/1158931993226822287?c=39546741839462401

「すごい請求がきた」 → “想像を絶する額の架空請求”に「太陽系丸ごと買えそう」「桃鉄終盤」(5/3)
https://news.yahoo.co.jp/articles/b15c64053ee3dbf55e4f6ed69fc5853db8b11564?source=rss

PCやスマホに警告画面が突然出た!? それは「サポート詐欺」かも(5/3)
https://ascii.jp/elem/000/004/196/4196833/

高市氏、重大なサイバー攻撃防ぐ「能動的サイバー防御」の法整備「心待ちにしている」…平時から監視・通信の秘密との兼ね合い課題(5/3)
https://www.yomiuri.co.jp/politics/20240503-OYT1T50055/

憲法から考える経済安全保障　新たな領域への対応に遅れ
日本国憲法施行77年(5/3)
https://www.nikkei.com/article/DGXZQOUA222780S4A420C2000000/

「非対面式」「投資」がキーワード　特殊詐欺は減少気配も、ＳＮＳがターゲットに(5/3)
https://www.sankei.com/article/20240503-VSX54F2E55PF5NC3LILK54QIBU/

日本とEU “半導体などの調達 特定の国に過度に依存しない”(5/3)
https://www3.nhk.or.jp/news/html/20240503/k10014439201000.html

日ＥＵの経済安保強化で合意　中国念頭に太陽光パネルや半導体などの調達で「共通の原則」(5/2)
https://www.sankei.com/article/20240502-Q5SJUE66AVO7XM4YBY6OFQ4L24/

総務省指導にネイバー「事業戦略に基づき判断」　ＬＩＮＥヤフーとの資本関係見直しで(5/3)
https://www.sankei.com/article/20240503-T5BIC3PE45K37IJUMTQRVXMS6A/

「事業戦略に基づき判断」　総務省指導にネイバー(5/3)
https://www.chibanippo.co.jp/newspack/20240503/1220930
https://www.kobe-np.co.jp/news/zenkoku/compact/202405/0017611903.shtml
https://www.saitama-np.co.jp/articles/78755/postDetail

「ＬＩＮＥの売却」圧力から一歩後退した日本…韓国政府は顔色伺ってばかり(5/3)
https://japan.hani.co.kr/arti/economy/49906.html

ＬＩＮＥ経営権めぐり「韓国世論、激しく反発」日本メディアも注目(5/3)
https://japan.hani.co.kr/arti/international/49912.html

齋藤経済産業大臣が第5回日EUハイレベル経済対話に出席しました(5/2)
https://www.meti.go.jp/press/2024/05/20240502001/20240502001.html
SOQL にて日付項目への条件指定

日付関数を使用して指定する
2022-03-03  の行を取得したい場合
CALENDER_YEAR(項目名) = '2022'
and CALENDAR_MONTH(項目名) = '3'
and DAI_IN_MONTH(項目名) = '3'

とめんどくさい
PracticeA - Welcome to AtCoder Rubyの解法 丁寧解説

# 概要 :airplane:
PracticeA - Welcome to AtCoderの解説はあるけども、メソッドの使い方とか丁寧にまとめておきたいと思いこの記事を書いてます。


:::note warn

Ruby初学者、AtCoder初心者、記事作成初心者、なのでミスが多々あるかもしれません。
:::

# 問題 :pencil2:
今回初めてAtCoderに取り組む人が最初にするであろう問題、[PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)の解説をしていきます。
問題内容については該当ページからご確認ください。

この問題でしたいことは、
1\. 入力値を受け取る
2\. 必要な型に変換して、変数に格納する
3\. 求める形に整えて、出力する

この順番で問題を解いていきます

# 丁寧に解説
公式の回答があるので、それをベースに何をしているのかを補足として説明していきます。
まずは、公式の回答
```ruby
# 整数の入力
a = gets.to_i
# スペース区切りの整数の入力
b,c=gets.chomp.split(" ").map(&:to_i);
# 文字列の入力
s = gets.chomp
# 出力
print("#{a+b+c} #{s}\n")
```
## 一行目から早速丁寧に解説をしていきます
```ruby
a = gets.to_i
```
getsメソッドでは入力値を一行だけ読み込んで、**文字列**を返り値として取得します。
to_iメソッドでは文字列を整数型に変更します。
以上をまとめると
aに格納される値は、ユーザーが入力した値を取得して、整数型に変換したものです。

:::note info
gets メソッドで標準入力から取得した値は、デフォルトで改行文字（\n）が含まれています。しかし、to_i メソッドは、文字列の末尾にある改行文字を無視して整数に変換します。
:::

## 二行目
```ruby
# スペース区切りの整数の入力
b,c=gets.chomp.split(" ").map(&:to_i);
```
chomp メソッドを使うと、改行文字が削除されます。
```ruby
"hello\n".chomp
# => "hello"
```
splitメソッドでは引数で指定した値で分割して、それぞれを配列の要素として格納します。
mapメソッドは、元の配列に対して要素の分だけ処理を繰り返し、新しく配列を作成します。今回は各要素を取り出して整数型にしたものを新しい配列に格納しています。

ここまでの処理をまとめる
```ruby
# 入力値は "2 3" とする
test = gets.chomp.split(" ").map(&:to_i);
p test 
#=> [2, 3]
```
左辺がb, cのように2つ設定していると、それに合わせた要素がそれぞれに格納されます。
今回であれば、bに2, cに3が格納されます。

## 三行目
```ruby
# 文字列の入力
s = gets.chomp
```
getsでユーザーの入力を文字列で受け取り、改行文字を排除する

三行目までで、冒頭で説明した
1\. 入力値を受け取る
2\. 必要な型に変換して、変数に格納する
が終わっている。

四行目で、
3\. 求める形に整えて、出力する
を進めていく

## 四行目
```ruby
# 出力
print("#{a+b+c} #{s}\n")
```
#{}の中に定義した変数を利用して、求める形に整形して出力している

## 最後に
下記の記事を参考にしてこの記事を作成しました。
https://pikawaka.com/ruby/gets
https://pikawaka.com/ruby/map
Ubuntu24.04のインストール

中古で購入したVersaProへ、Ubuntu24.04をインストールしたのだが
ブートしてこない。SecureBootがどうとかEFIパーティションが・・・
と、ネット検索すると出てくるが、どれを試してもうまくいかない。

USBメモリのインストーラからはブートするので、外付けSSDにインストール
でOKなのか？と試してみたら、うまくいきました。
内蔵にはWindows11入れてのデュアルブートマシンの出来上がり。
[Rails]ユーザー管理機能

# 1. demoアプリを作成する。
```bash:
rails new demo -d postgresql
```

# 2. demoアプリのルートディレクトリに移動する。
```bash:
cd demo
```

# 3. ユーザーに関するscaffoldを自動生成する。
```bash:
bin/rails generate scaffold user name:string address:string age:integer
```
>$ bin/rails generate scaffold user name:string address:string age:integer
      invoke  active_record
      create    db/migrate/20240504174055_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      create      app/views/users/_user.html.erb
      invoke    resource_route
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      create      test/system/users_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder

# 4. データベースを作成する。
```bash:
bin/rails db:create
```

# 5. テーブルを作成する。
```bash:
bin/rails db:migrate
```

# 6. アプリケーションを起動する。
```bash:
bin/rails s
```

# 7. 以下にアクセスする。
http://127.0.0.1:3000/users

■トップ画面（ユーザーなし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512307/417a9ca3-54e7-903a-644e-debacfef5890.png)

■ユーザー登録画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512307/151bea41-d8aa-b4d1-348d-b7b4e4cdbe4e.png)

■ユーザー登録完了画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512307/37080286-e3f9-cfe4-6cfd-3a5e6f7877e4.png)

■トップ画面（ユーザーあり）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512307/57d83975-f285-1c90-711e-8c5caa673d3d.png)

# 8. 結論
scaffoldすごい。
ＧｉｔＨｕｂでフォーク後のリポジトリで作業中、アップストリームの変更を随時取り込む技

# はじめに

ＧｉｔＨｕｂで何かプロジェクトをフォークして、自リポジトリで修正した後、プルリクで本家プロジェクトにフィードバックする、というワークフローはよくある話だと思います。
よくある困ったこととして、フォーク元の更新が早いと、修正した内容が問題無いか確認が必要だったり、別途調整が必要など、色々と頭が痛い問題があります。
ここではエイリアスを駆使してフォーク元の更新に同期しつつ、修正を完遂したいユースケースについてメモを残しておきます。

# フォーク元の変更をフォーク先のリポジトリに同期する

フォーク元の変更をフォーク先のリポジトリに同期するするには下記のコマンドを実行する必要があります。

```
gh repo sync フォーク先のリポジトリ名
```

これでリモートリポジトリ（フォーク先のリポジトリ）を最新の状態に更新することができますが、当該リポジトリ（フォーク先のリポジトリ）の作業している時、リモートリポジトリというのは、ローカルリポジトリで作業している場合では自明です。
自明ですが、`gh` コマンドはローカルリポジトリとは無関係で稼動することが要求されるコマンドです。明示的にリポジトリ名を指定する必要があります。
そこでローカルリポジトリの作業中、`git` 側のフローと連動させることで、この辺りの省力化を図ります。

というわけで現在作業しているリポジトリ（ワークスペース）のリポジトリ名を取得します。

```
gh repo set-default --view
```

これで取得できれば（＝ＧｉｔＨｕｂからクローンしていれば）、下記のようにして同期、つまり最新の状態に更新できます。

```
gh repo sync $(gh repo set-default --view)
```

ここまでできれば `git pull` すれば最新の更新をワークスペースに取り込めることになります。

あとはワークフローに乗せるだけですね。下記のようにエイリアスを定義すれば、`git pull` 前に `git sync` してしまえば良いことになります。

```
git config --global alias.sync '!gh repo sync $(gh repo set-default --view)'
```

# よくある質問とその答え

## Ｑ．`gh repo sync` じゃダメなのですか？

Ａ．リモートリポジトリをローカルリポジトリに同期するだけです。`git pull` にほぼ等しい振る舞いになります。

## Ｑ．用語が分からん。関係性込みで説明してくれ。

Ａ．ワークスペース・インデックス・ローカルリポジトリ・リモートリポジトリまでであればＧｉｔの範疇の用語となります。こちらについては参考文献を参照してください。とりあえずＧｉｔとは何か…を知っている前提でこの辺りの話を省略します。
厳密には更に、ＧｉｔＨｕｂとは何か…を知っている必要があります。ここではＧｉｔとＧｉｔＨｕｂの接点がどうなってるかを注視して説明します。

ＧｉｔＨｕｂではリモートリポジトリをホスティングしてくれるサービスです。
ＧｉｔＨｕｂは、別のリポジトリからフォークして、自分のリモートリポジトリとして取り扱う事ができるサービスを提供しています。
ＧｉｔＨｕｂでは、別のリポジトリからフォークする、その元となるリポジトリをアップストリーム（`upstream`）と位置付けています。
もちろんその関係性も含めてＧｉｔで取り扱う事ができなくもないです（あります）が、ＧｉｔＨｕｂが自身が用意されてる機能を使用することで、管理が容易になります。

ワークスペース→（`git add`）→インデックス→（`git commit`）→ローカルリポジトリ→（`git push`）→リモートリポジトリ→（`gh pr`）→アップストリーム

リモートリポジトリまではＧｉｔの取り扱い範疇ですが、リモートリポジトリから先はＧｉｔＨｕｂの取り扱い範疇となります。
その辺りの用語説明無しに解説されている話ではありますが、リモートリポジトリ・アップストリームを「フォーク先のリポジトリ」・「フォーク元のリポジトリ」としてＧｉｔＨｕｂ側の立場になって見る必要があります。

# 参考文献
`gh repo sync` については色々と解説を見て参考にもなるのですが、この核心に触れる解説を見つけられなかったので、マニュアルのみリンクします。

- [GitHub CLI manual](https://cli.github.com/manual/)
- [GitHub CLI command line](https://cli.github.com/manual/gh)
  - [gh repo](https://cli.github.com/manual/gh_repo)
    - [gh repo sync](https://cli.github.com/manual/gh_repo_sync)
    - [gh repo set-default](https://cli.github.com/manual/gh_repo_set-default)
- [フォークを同期する](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork?platform=linux)
- [フォーク用のリモート リポジトリの構成](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork?platform=linux)
- [GitのWorking TreeとIndexが分かる記事](https://qiita.com/sparklingbaby/items/e749249d366c7487bbbf)
- [Git - Index](https://www.geeksforgeeks.org/git-index/)
【ABC336】FortranでA,B,C問題

## 目次
  - [A - Long Loong](#a---long-loong)
  - [B - CTZ](#b---ctz)
  - [C - Even Digits](#c---even-digits)


## A - Long Loong
### 問題
正の整数 X について、レベル X の 龍文字列 とは、1 個の L, X 個の o, 1 個の n,1 個の g をこの順に並べた文字列です。
正の整数 N が与えられるので、レベル N の龍文字列を出力してください。

>**制約**
>1. $1≤N≤2024$
>2. N は整数

詳細はこちらです。

https://atcoder.jp/contests/abc336/tasks/abc336_a

### 解説
o の部分のみ`do文`で N 回分出力します。

なお龍文字列は改行せずに出力する必要があります。
`write文`に`advance='no'`をつけ、改行を行わない様にします。


### プログラム例
```Fortran
program abc336a
    !N：整数
    implicit none
    integer N, i

    !入力
    read (*, *) N

    !結果の出力
    write (*, '(a1)', advance='no') "L"
    do i = 1, N
        write (*, '(a1)', advance='no') "o"
    end do
    write (*, '(a2)') "ng"
end program abc336a
```



## B - CTZ
### 問題
正の整数 N に対して、N を 2 進表記したときに 末尾 に連続する 0 の個数を出力してください。

>**制約**
>1. $1≤N≤10^9$
>2. N は整数

詳細はこちらです。

https://atcoder.jp/contests/abc336/tasks/abc336_b

### 解説
`btest(i,pos)`を用いて i 桁目が 1、0のどちらであるかを判定し、連続する 0 の個数を求めます。


### プログラム例
```Fortran
program abc336b
    !N  ：整数N
    !cnt：末尾に連続する0の数
    implicit none
    integer N
    integer cnt, i

    !入力
    read (*, *) N
    cnt = 0
    do i = 0, 40
        if (btest(N, i)) then
            exit
        else
            cnt = cnt + 1
        end if
    end do

    !結果の出力
    write (*, *) cnt
end program abc336b
```



## C - Even Digits
### 問題
非負整数 n がn を 10 進法で表したときに、偶数の数字(0,2,4,6,8) のみで表せる時、n を 良い整数 と呼びます。
整数 N が与えられるので。良い整数のうち小さい方から N 番目の整数を求めてください。

>**制約**
>1. $1≤N≤10^{12}$
>2. N は整数

詳細はこちらです。

https://atcoder.jp/contests/abc336/tasks/abc336_c

### 解説
使ってもよい数字は (0,2,4,6,8)の５種類なので、５進数に置き換えることができます。
N を１桁目から５進数に変換して出力します。


### プログラム例
```Fortran
program abc335c
    !N：取り出したい良い整数の番号
    !Ans：N番目の良い整数
    implicit none
    integer(8) N, Ans(100)
    integer i, j, tmp

    !読み込み
    read (*, *) N
    N = N - 1; Ans = 0

    !良い整数の算定
    if (N == -1) then !N=1の場合
        write (*, '(i0)', advance='no') 0
        stop
    else !N=1より大きい
        i = 1; tmp = 5
        do
            Ans(i) = mod(n, tmp)
            N = N/5
            if (N == 0) exit
            i = i + 1
        end do
    end if

    !結果の出力
    do j = i, 1, -1
        write (*, '(i0)', advance='no') Ans(j)*2
    end do
end program abc335c
```
Halton列の作成をするためのRコード


<details><summary>Disclaimer</summary>
・この記事は筆者の所属する組織・団体とは一切関係がありません。<br>
・この記事の内容を利用することによって生じた損失等について、筆者は一切責任を負いません。
</details>

### Halton列の生成をするRの関数 Halton(N,r)
Quasiモンテカルロ（準モンテカルロ）で利用する機会のある超一様分布列(Low-Discrepancy Sequence; LDS)、の一種であるHalton列の生成コードをここに置いておきます。
```R:
## r進数に基づくHalton列の生成コード
trans <- function(n, r){
  if(n <= 0){
    return(NULL)
  }else{
    return(append(Recall(n%/%r,r), n%%r))
  }
}
Halton <- function(N,r){
  a <- numeric()
  for(i in 1:N){
    b <- rev(trans(n = i,r = r))
    a[i] <- sum(2^(-1*(1:length(b))) *b) 
  }
  return(a)
}
### Halton(N,r)はr進数に基づき、Halton列をN個まで生成する。
### 出力はベクトル。
```
使い方：例えば2進数に基づくHalton列を横軸、3進数に基づくHalton列を縦軸にして、256個の点列をプロットすると以下のようになります。
```R:
N <- 256
plot(Halton(N=N , r = 2),Halton(N=N , r = 3))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784717/ae0d6795-bda8-01fb-349d-e687693286d9.png)
これは、単に一様乱数を二次元にマップさせた場合（下図）と比べると、より「幅広く」分布する点列であることが視覚的に確認できます。
```
set.seed(1)
plot(runif(n=N),runif(n=N))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784717/332afae7-762f-1c29-31bf-cca5608ed266.png)

#### 参考文献
Dick, Josef, Frances Y. Kuo, and Ian H. Sloan. "High-dimensional integration: the quasi-Monte Carlo way." Acta Numerica 22 (2013): 133-288.
Bambu Labで表面を綺麗にするアイロン設定の解説

# アイロンとは
皺をとるからアイロンなのか、3Dプリント品の表面上の積層痕をかなり目立たなくできる設定です。
アイロンをかける分印刷時間はのびます。

↓↓アイロン前↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/f0b115be-9b01-7a5a-7531-7bdbd94cbd81.png)

↓↓アイロン後↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/072f78c9-9864-672d-5117-c05f7f6bf9d3.png)

# やり方
 高度な設定をONにして、アイロン面をしない→いずれかに変更しましょう
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/e92a6fca-763d-9480-b77f-d1a854c93849.png" width="400">
 
# それぞれのオプションについて
今回は以下のオブジェクトを例に見ていきます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/4e4b940e-32f3-bb4f-1e2f-e6ae2dcdf258.png" width="400">

## 全てのトップ面
この設定では、サポート材がつく場合でも上面となっている面にアイロンをかけます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/e9911bf0-1912-1932-54f0-67cf125fe923.png" width="400">

チェックボックスをアイロンだけにすると、上面だけにアイロンがかかっていることがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/8ccf4f29-3b14-6f1d-7d75-0ee13620760e.png" width="400">


## 最上部のみ
この設定では、オブジェクトの一番上の面となっている面だけにアイロンをかけます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/7930b68b-6d7a-1cb8-08ad-be437b61b576.png" width="400">

チェックボックスをアイロンだけにすると、最上部だけにアイロンがかかっていることがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/e9105ed3-fd57-2153-2710-9b66441cef11.png" width="400">

## 全てのソリッド積層
ちょっとわかりにくかったのですが、この設定では、オブジェクトの上面と底面にアイロンをかけます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/114e939d-d5ea-3003-5cf6-46a1637ad190.png" width="400">

チェックボックスをアイロンだけにすると、上面と底面にアイロンがかかっていることがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/6a05e677-934e-5467-eeb5-01b76695db21.png" width="400">

複雑な形状だとどうなんだ…と思ったので試してみました
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/6defb05d-9228-56c6-67df-10c54ea5b733.png" width=300">

概ね全体にかかってますね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/60bfd1ce-f86f-7961-b842-cb0b438a95b5.png" width="400">

内部ソリッドインフィルになっているところと同じところにかかるようです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/38e5bc55-b5c8-16cb-6dfd-b251da2bcb2f.png" width="400">

ちなみに全てのトップ面でスライスした結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/739601b2-eb21-2d28-e060-513d283867e7.png" width="400">

複雑な形状にアイロンをかけたい場合はこのオプションがよさそうです
WSUSの更新プログラムを拒否するスクリプトの実行結果 (Wsustainable)

需要はほぼ無いと考えていますが、WSUSの更新プログラムを拒否するスクリプトを作成しました。
ここではスクリプト本体やインストール・構築方法には触れません。詳しくはGitHubをご覧ください。

https://github.com/rin309/Wsustainable

::: note warn
現在プレビュー版として公開しており、今後仕様を大きく変更する可能性があります
ご利用は自己責任にてお願いします。
:::


# スクリプト実行後の結果
使用する製品として下記のような選択をしました。
![Wsustainable 使用する製品とバージョン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667945/08d4bbb6-86f2-e03e-8f4e-73eabf636e5c.png)

## WSUSの条件: 環境
- Windows Server 2025 Preview (Build 26085)
- Hyper-V 仮想環境
- Intel Core i7-10875H
- 仮想プロセッサの数: 8
- メモリ: 8192MB
- NVMe SSD

## WSUSの条件: 製品
### Developer Tools, Runtimes, and Redistributables
- Visual Studio 2017
- Visual Studio 2019
- Visual Studio 2022
- Windows 10, Version 1903 and later

### Office
- Office 2016

### Windows
- Microsoft Defender Antivirus
- Microsoft Edge
- Windows 10 and later Dynamic Update
- Windows 10 and later GDR-DU
- Windows 10 LTSB
- Windows 10, Version 1903 and later
- Windows 11 Dynamic Update
- Windows 11 GDR-DU
- Windows 11
- Windows Safe OS Dynamic Update
- Windows Security platform

## WSUSの条件: 分類
- Feature Packs
- Service Packs
- Upgrades
- セキュリティ問題の修正プログラム
- ツール
- 更新
- 修正プログラム集
- 重要な更新
- 定義更新プログラム

# スクリプト実行後の結果
- 未承認の更新プログラム: https://github.com/rin309/rin309.github.io/blob/main/Wsustainable/0.2/Logs/2024-05-05T002002/NotApproved.csv
- 拒否された更新プログラム: https://github.com/rin309/rin309.github.io/tree/main/Wsustainable/0.2/Logs/2024-05-05T002002 (の {製品名}*.csv)

上記 NotApproved.csv (未承認の更新プログラム) の中身を見ますと、Windows 11/10の過去のバージョンや、32ビット版やARM64ビット版といった選択しなかった製品はリストに無さそうです。
完璧ではありませんが"それなり"に少なくなっていることが確認できます。

環境により大きく前後するため参考になりませんが、私の環境ではおおむね5分程度で完了しています。


# 課題
- 個人開発のため、そこまでリソースを割けない
- デバッグ不足による不具合があるかもしれない
- スクリプトの更新が面倒 (定義ファイル https://github.com/rin309/Wsustainable/tree/main/DeclineFilters がプログラムに同梱されている)
- 設定ファイルの更新 (バージョン変更ごとに再構築が必要)
初めてのLRF(ROS2)

# はじめに
今回は北陽さんの測域センサである[UTM-30LX](https://www.hokuyo-aut.co.jp/search/single.php?serial=21)を使って距離が取れるところまでを解説する。
次回にはransacを実装して壁を認識してみようと思う。
 # 動作環境
 * ubuntu20.04
 * ROS2 foxy
 # urg_nodeのインストール
 urg_nodeとは、簡単にいうとlidarの測定した値を/Scan型でpubしてくれるnodeです。詳しくは[ここ](https://sourceforge.net/p/urgnetwork/wiki/urg_node2/)を参考にしてください。
 ```
 sudo apt update
 sudo apt install ros-foxy-urg-node
 ```
 
 # /Scanの中身について
 
 ```
 std_msgs/Header header
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities
```
今回使うのは、距離がわかればいいのでfloat32[] rangesの中身を読みます。
他の変数についてては[ここ](https://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/LaserScan.html)を参照してください。

# 実際に動かす！
* 電源を入れて、usbをpcにつなぐ。
* 権限を付与

```
sudo chmod 777 /dev/ttyACM0
```
*　urg_nodeを起動(赤色のエラーが出たときは権限を与え直す。)
```
ros2 run urg_node urg_node_driver --ros-args -p serial_port:=/dev/ttyACM0
```
* rviz2で可視化するとこんな感じ(frameをLaserにする)
![IMG_8418.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531353/5041c854-5700-7698-e040-1548fada8377.jpeg)

# lidarで距離を測ってみよう。
今回使用しているlidarは270°の視野を1081で分割しているため、lidarの真ん中が測定している値は541番目のインデックスに入ることになるからコードは以下のようになる。
```
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import LaserScan

class LidarNode(Node):
    def __init__(self):
        super().__init__('lidar_sample_node')
        self.ranges =[]
        
        self.lidar_sub = self.create_subscription(
            LaserScan,'/scan',self.lidar_cb,10
        )
        
    def lidar_cb(self,msg):
        self.ranges =msg.ranges
        print(f'0[deg]:{self.ranges[541]}')
        

def main():
    rclpy.init()
    node = LidarNode()
    print('lidar_sample_node is started')
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    rclpy.shutdown()

if __name__=='__main__':
    main()
```
# 最後に
これでlidarを使って距離を測ることができた。このコードをいじって/Scanの他の変数には何が入ってるかをprintしてみてもいいと思う。次回はransacを使って壁を認識していく。

#　参考文献
* https://www.hokuyo-aut.co.jp/search/single.php?serial=21#program
* https://sourceforge.net/p/urgnetwork/wiki/urg_node2/
* https://github.com/Hokuyo-aut/urg_node2
Fusion360から印刷データをスライサーに直接流し込む

# 背景
毎回STLを落としてスライサーにかけるのが面倒だっため、直接流し込める方法がないか調べてみました。
中間生成物が出ないのであとあとデータ消したりとかもいらないです。

諸事情によりFusion360が英語になっていますがおそらく変わりません。

# やりかた
1. file > 3D Printを選択
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/ce29ad7a-9be8-a642-8118-efc49fddf762.png" width="400">
    
1. Selectionで印刷するオブジェクトを選択して、Formatで流し込みたいデータ形式を選択
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/ccc17c37-3790-6505-9b1d-fa47b0f6d1cd.png" width="500">

1. Send to 3D Print Utilityにチェックを入れる
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/791419fc-aa80-8549-11b7-f318c5d597e7.png" width="400"> 

1. Print Utilityはカスタムを選択
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/0ba5638a-ebe2-25d9-7a8b-c2bef7b85e3e.png" width="300"> 

1. Applicationのフォルダマークを押し、Select from my computerから流し込みたいスライサーを選ぶ
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/3b1d56c7-2f90-7aea-4611-0fa3ab498f53.png" width="600"> 

    今回はbambu-studio.exeを選びます。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/fc47c6b5-c5bd-153e-a180-bf3033aeb3c8.png" width="500"> 

1. OKを選んで完了
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/3b1e2a68-bc52-fd86-4be6-0158fb16ca1a.png" width="500"> 

    無事流し込まれました。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/e4754c12-8047-c763-4c08-1e81132827c4.png" width="500">
Javaで「文字リテラルと文字コード」の動作を確認してみた

# 概要

Javaで「文字リテラルと文字コード」の動作を確認してみました。
以下のページを参考にしました。

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

# 実装

以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
  public static void main(String[] args){
    System.out.println('a');
    System.out.println('あ');
  }
}
```
```JSample1_2.java
class JSample1_2{
  public static void main(String[] args){
    System.out.println('a');
    System.out.println(0x0061);
    System.out.println('\u0061');
  }
}
```

以下のコマンドを実行しました。
```
$ javac -encoding UTF-8 JSample1_1.java
$ java JSample1_1 
a
あ
```
```
$ javac -encoding UTF-8 JSample1_2.java
$ java JSample1_2 
a
97
a
```

# まとめ

何かの役に立てばと。
【X】１万円課金して分かった事

みなさんX（旧ツイッター）のAPIを使っていますか？
先日課金してみて色々と分かったので、共有したいと思います。

![スクリーンショット 2024-05-05 0.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/f5d67b85-8332-eda6-9e9a-995e8bee6575.png)

感想編はnoteにまとめています。

https://note.com/zuki2/n/na25c8cc97163

## そもそも X APIとは？
X APIは、X社が公開している公式のAPIです。主に以下のような操作をAPIで行えます。
- ツイートの投稿
- ツイートの取得
- アカウントの検索

元々は無料でしたが、イーロンマスク氏が2023年5月に有償化して、1万円〜という驚愕の料金になってしまいました。今では開発者コミュニティは縮小し、情報が殆ど無くなってしまいました。

課金するには、所謂ブルーバッジ（Xプレミアム）とは異なり、X Developersというページから申し込む必要があります。

https://developer.twitter.com

![スクリーンショット 2024-05-05 0.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/4fd08fba-68fd-3dfd-e9c2-e1096d3c4c58.png)

## 課金すると何ができるか？
#### 前提
大前提として、__実はFreeプランがあります__。Freeプランでは1500通までのPostができます。これを使えば予約投稿やBOT作成を行えます。
#### ではなぜ課金するのか？
それはツイートの取得ができるからです。課金すると１万件までのツイートの取得ができます。また、リツイートや引用リツイートも可能になります。これにより、**トレンドツイートの一括取得やインプレゾンビの生成**（絶対やらないで下さい！）ができるようになります。

## 課金するべきか？
#### 結論：課金するメリットは少ないです。
ここからは、不満点を例に挙げつつ理由を説明します。
#### 不満点１：価格が高すぎる
１ツイートの取得に1円を有します。これはあまりにも高いです。例えば、ハッシュタグ「#大谷」を自動収集してポジネガ分析をしようとします。1万件取得して分析しようとすると1万円かかります。かといって100件だけ取得する場合は、自分でツイート検索できてしまいます。これでは帯に短し襷に長しです。

#### 不満点２：APIの自由度が低すぎる
いざ触ってみるとできることが非常に少なかったです。
- ツイートの取得は１回あたり100件まで
- ツイートの投稿は15分あたり5件まで
- トレンドの取得はできない

などなど、痒い所に手が届きません。

#### 不満点３：個人開発者が少ないので、情報が少ない
簡単な情報すら調べるのに時間がかかります。また、古い情報が非常に多いです。2024年5月現在のAPIは「X API v2」です。しかしネット上の情報は殆どが「Twitter API v1」です。そのため、０から自分でコードを開発する必要があります。参考までに、tweepyを使ったclientの立ち上げ方を載せておきます。
``` X_API_V2.py
import tweepy
from datetime import datetime, timedelta
import json

# Twitter APIの認証情報
consumer_key = "自分のKEYを入力"
consumer_secret = "自分のKEYを入力"
access_token = "自分のKEYを入力"
access_token_secret = "自分のKEYを入力"
bearer = "自分のKEYを入力"
client = tweepy.Client(bearer, consumer_key=consumer_key, consumer_secret=consumer_secret, access_token=access_token, access_token_secret=access_token_secret)
```

## それでも課金するべき人
ここまで酷評してきましたが、使える人もいると思います。
- 自動返信BOTサービスを展開する人（ex.質問に答える生成AI BOT）
- 明確に利用用途がある人（ex.自社商品の評判を1万件取得し、顧客像を洗い出すことで広告宣伝に活用する）

上記の人は価格云々ではなく、APIがないとそもそも実現することができないので、課金するべきだと考えます。反対に上記に当てはまらない人は、APIへの課金はする必要はないと思います。

## まとめ
基本的にデメリット>>>メリットなので、課金はお勧めしません。明確に活用用途がある人だけ使うべきだと思います。
また、「X API 使い方」などの検索でこの記事に辿り着いた迷える方がいたら、コメント頂けたら答えます。

## 終わりに
2024年4月からアウトプットのためにQiitaとnoteを始めました。「フォロー」や「いいね」頂けると励みになります！

https://qiita.com/zukki2

https://note.com/zuki2
SetとMap

# JavaScriptのMapとSetの挙動について
今回はMapとSetを整理するために記事を書くことにしました。

## そもそもMapとSetとは？
``Map`` -> キーと値がセットのデータの入れ物
``Set`` -> 重複する値を許さないデータの入れ物

## ObjectとMapの比較
Objectも同様にキーと値がセットになっているデータですが、
その二つの違いを下のテーブルにまとめてみます。
| | Object | Map |
|:-:|:-:|:-:|
|キー|文字列|制約なし|
|列挙順|曖昧|挿入順|
|for...in|可|不可|
|for...of|不可|可|

MapはObjectと同様にすでに同じキーがある場合は後で設定した値が上書きされる。

## Mapの主なメソッド
・``new Map()`` -> mapコンストラクタからインスタンス化をして、mapオブジェクトを作成

・``map.set(key, value)`` -> 第一引数にキー、第2引数に値をそれぞれ渡して設定

・``map.get(key)`` -> キーの値を取得

・``map.delete(key)`` -> キーの値を削除

・``map.size()`` -> mapの要素数を取得

・``map.has(key)`` -> Mapオブジェクト内に対応するvalueがあるかの論理値を返却




## SetとArrayの比較
``Set``と``Array``の大きな違い-> ``Set``は重複した値を許さない

```
const mySet = new Set(); //新しいSetインスタンスを作成

// Setに値を追加
mySet.add(1);
mySet.add(5);
mySet.add("Hello");
mySet.add({ a: 1, b: 2 });


// Setの内容をコンソールに表示
console.log(mySet); // Set(4) { 1, 5, 'Hello', { a: 1, b: 2 } }


// 同じ値を追加しても無視される
mySet.add(1);
console.log(mySet);  // Set(4) { 1, 5, 'Hello', { a: 1, b: 2 } }
```

## Setの主なメソッド

・``new Set()`` -> setコンストラクタからインスタンス化をして、setオブジェクトを作成

・``set.clear()`` -> すべての要素を``Set``オブジェクトから取り除く

・``set.delete(value)`` -> valueの要素を取り除き、要素の削除に成功したか否かの論理値を返す

・``set.add(value)`` -> ``Set``オブジェクト内に同じ値を持つ要素が存在しない場合のみ指定した値を持つ要素を挿入

・``set.has(value)`` -> ``Set``オブジェクト内にvalueがあるかどうかの論理値を返す

・``set.entries()`` -> ``Setオブジェクト内の各要素を[value,value]の配列が挿入順で返却

・``set.has(value)`` -> ``Set``オブジェクト内にvalueが存在するかの論理値を返却
Rack::Attackを用いたDoS攻撃防止策の設定方法

# はじめに

この記事では、RailsアプリケーションにおけるDoS攻撃防止策として、`Rack::Attack`の設定方法についてステップバイステップで解説します。`Rack::Attack`は、不正なアクセスや不要なトラフィックを制限するためのミドルウェアであり、アプリケーションを保護する上で非常に有効です。

## ステップ1: Gem の追加

まず、Railsプロジェクトの`Gemfile`に以下の行を追加し、`rack-attack` gemをプロジェクトにインクルードします。

```ruby
gem 'rack-attack'
```

追加後、ターミナルで以下のコマンドを実行して、gemをインストールします。

```bash
bundle
```

## ステップ2: 初期化ファイルの設定

`rack-attack`の設定を管理するために、`config/initializers/rack_attack.rb`ファイルを作成します。ファイルには、特定のリクエストを制限するための設定を記述します。以下はその一例です。

```config/initializers/rack_attack.rb
class Rack::Attack
  # ユーザーごとの予約リクエストを制限
  throttle('request by user', limit: 150, period: 1.hour) do |req|
    if req.path.start_with?('/reservations') && req.post? # postのみに適用
      warden_info = req.env['warden'].user(:customer)
      warden_info&.id.to_s
    end
  end
  
  throttle('logins/email', limit: 5, period: 20.seconds) do |req|
    if req.path == '/login' && req.post?
      req.params['email'].presence
    end
  end

  # イベントを購読してログに記録
  ActiveSupport::Notifications.subscribe('rack.attack') do |name, start, finish, request_id, req|
    Rails.logger.info "Rack::Attack: #{req.env['rack.attack.match_type']} from #{req.ip} blocked."
  end
end
```

## ステップ3: Middleware として追加

次に、`Rack::Attack`をRailsアプリケーションのミドルウェアスタックに追加する必要があります。`config/application.rb`ファイルを開き、以下の行を追加します。

```config/application.rb
config.middleware.use Rack::Attack
```

## ステップ4: キャッシュストアの設定

`Rack::Attack`はリクエストの頻度を追跡するためにキャッシュストアを利用します。Railsでは標準でいくつかのキャッシュストアが用意されていますが、本例ではRedisを使用します。Redisの設定は以下の通りです。
※Redisはインメモリデータストアであり、データベース、キャッシュ、メッセージブローカーとして広く使われています。Railsアプリケーションでキャッシュシステムとして利用されることが多いですが、他にもMemcachedなどがよく使われます。

```config/environments/production.rb
Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(url: ENV['REDIS_URL'])
```

開発環境で使用する場合は以下の通りです。
```config/environments/development.rb
config.cache_store = :redis_cache_store, { url: 'redis://localhost:6379/1' }
```

この設定を行う前に、Redisサーバーが起動していることを確認してください。

## ステップ5: ログの設定

`Rack::Attack`の動作を監視するために、ログ設定を追加することが推奨されます。以下の設定を`config/initializers/rack_attack.rb`に追加することで、攻撃を検出した際にログを出力できます。

```ruby
ActiveSupport::Notifications.subscribe('rack.attack') do |name, start, finish, request_id, req|
  Rails.logger.info "Rack::Attack: #{req.env['rack.attack.match_type']} #{req.path}"
end
```

以上の設定により、`Rack::Attack`を利用してRailsアプリケーションのセキュリティを向上させることができます。次のステップでは、これらの設定をテストし、適切に動作するかを確認する方法について説明します。

## 補足: エラーハンドリング
Rack-Attackが設定どおりにブロックしない場合は、以下のことを試してください。

### 1. Rails consoleでRedisの存在とキャッシュの設定を確認
以下のようにコンソールから現在設定されているキャッシュストアを確認できます

```ruby
rails console
```
コンソールで以下のコマンドを実行してください：

```ruby
puts Rails.configuration.cache_store
```


また、以下のコマンドを実行します
```bash
(base) Kengo% redis-cli
zsh: command not found: redis-cli
(base) Kengo% 
```

以下のようになる場合、現在のRailsアプリケーションで設定されているキャッシュストアは`null_store`です。これは実際には何もキャッシュしない設定で、キャッシュストアとして機能しないため、`Rack::Attack`のような機能でリクエストを追跡して制限を行う場合には適していません。

```bash
[1] pry(main)> puts Rails.configuration.cache_store
null_store
=> nil
```

Rack::Attackを有効に使用するためには、有効なキャッシュストア（例えばRedisやMemcached）を設定する必要があります。Redisをキャッシュストアとして設定する基本的な手順は以下の通りです。

https://qiita.com/KM9973/items/69c31b80e2be0d5c8c7f
Redisの導入と設定方法

この記事では、Rack::Attackを使用するためのキャッシュストアとしてRedisを導入する手順について説明します。Redisは高速なインメモリデータストアであり、キャッシュやメッセージブローカーとして広く利用されています。

## 参考記事
Rack::Attackの使用については以下の記事を参照してください。

https://qiita.com/KM9973/items/878a698239b4f7e396b6

## Redisのインストールと設定

1. **Redisのインストール**:
   Redisは多くのOSで簡単にインストール可能です。以下はUbuntuとmacOSでのインストール方法です。

   - **Ubuntu**:
     ```bash
     sudo apt update
     sudo apt install redis-server
     ```
   
   - **macOS** (Homebrewを使用):
     ```bash
     brew install redis
     ```

   インストール後、Redisサーバーが自動的に起動するかを確認し、起動していない場合は手動で起動します。

   ```bash
   redis-server
   ```

2. **Redisの確認**:
   インストールが成功したかどうかを確認するために、次のコマンドを実行してみます。正常に動作していれば、`PONG`という応答が返ってきます。

   ```bash
   redis-cli ping
   ```

3. **RailsでのRedis設定**:
   RailsでRedisをキャッシュストアとして使用するには、まず`redis` gemが必要です。`Gemfile`に以下を追加し、`bundle install`を実行します。

   ```ruby
   gem 'redis'
   ```

   次に、`config/environments/development.rb`（開発環境の設定）や`config/environments/production.rb`（本番環境の設定）にRedisをキャッシュストアとして指定します。

   ```ruby
   config.cache_store = :redis_cache_store, { url: 'redis://localhost:6379/0' }
   ```

   このURLは、使用しているRedisサーバーの設定によります。ローカルで開発している場合は`localhost`を指定しますが、本番環境では適切なサーバーアドレスに変更してください。

## Rack::AttackでのRedis利用

Rack::AttackがRedisを利用するように、`config/initializers/rack_attack.rb`にキャッシュストアの設定を追加します。

```ruby
# 不要かもしれない
Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(url: 'redis://localhost:6379/0')
```

この設定により、Rack::AttackはRedisを利用してIPアドレスやユーザーごとにリクエスト数を追跡し、設定したリミットを超えるリクエストを適切にブロックします。
超いまさらMOS試験を受けたけど良かった話

## 保有資格が…ない
先週、社内で自己紹介的な資料作成を頼まれ、テンプレをみたところ「保有資格」について書く欄があり、固まりました。

社会人10年目…なのに…何も資格を持っていないのである…！


空欄を必死に埋めるため、ひねり出したのは昨年取得したローコードツールの認定資格と、データ分析かじり始めたくらいに受けたビジネス統計スペシャリスト…と10年前くらいに受験したTOEICの点数…(笑)
謎の焦りで、気が付いたらすぐに受けられそうなMOS（Excel ExpertとPowerPoint）を1週間後（GW真っ只中）に申し込んでいました。（PL-900とかもあわてて月末に申し込んだ…。）

## MOSとは

>マイクロソフト オフィス スペシャリスト（MOS）は、マイクロソフト社が主催する、Excel・Word・PowerPointなどのMicrosoft Office製品の知識・操作スキルを客観的に評価・証明する資格試験です。試験は実際にパソコンを操作する実技形式で行われるため、MOSを取得することは実践的なパソコンスキルを有することの証明となり、就職・転職時のアピールとしても活用できます。

https://mos.odyssey-com.co.jp/about/

Office系の資格といったらMOS。大学時代からずっと受けよう受けようと思っていたのですが、実務で使えるようになっちゃったし、履歴書を書くこともないし結局後回しにしていました。本当は別に取らなくてもいい資格だけれど、今回は取得のいいきっかけとなりました。
試験はCBTで指定のテストセンターから受験地を選び、受けに行きます。出題形式は四択等ではなく、実際にExcel等のアプリを動かす実技試験となります。

## 今回受けたやつ
試験はOffice製品によってバージョンとレベルがあります。今回は以下の2つの試験を受けました。

https://mos.odyssey-com.co.jp/outline/

### Excel 365 エキスパート（上級）
参考書：[MOS Excel 365&2019 Expert対策テキスト&問題集 (よくわかるマスター)](https://amzn.asia/d/e6qJAJq)
勉強時間：5時間くらい
難易度について：実務で関数もグラフもピボットも難なくExcel使っているし、一般じゃなくてExpertでええやろと思い受験。試験範囲的にも実務で使っている場合はそれほどがっつりと対策する必要はないかなと思いました。
しかし、そんなん使ったことないよ機能…（What-if分析や、ウォッチウィンドウ、ローンを計算する聞いたことない関数）等はテキストと模擬試験でやっておいたほうがよいです。ウォッチウィンドウってVBAでしか聞いたことなかったけど、Excelにもあるんだね？？？
本番の感想：テキストに記載のなかった新関数の設問がいくつか出てきました。まぁバージョンが365だから仕方ないのか…でも対策できていなかったのでこれから受験される方は新関数について調べておくとよいと思います。パニクったけど無事合格…ふぅよかった。


### PowerPoint 365（一般）
参考書：[MOS PowerPoint 365 対策テキスト＆問題集 (よくわかるマスター)](https://amzn.asia/d/ajwQW6X)
勉強時間：3時間くらい
難易度について：あんまりPowerPoint知識がなかったので、新しく知ることが正直結構ありました。が、いつものOffice製品のリボンに慣れ親しんでいればだいたい勘でいけます。
しかしながら、パワポにもそんなん使ったことないよ機能があり…（ズームスライド、プレゼンテーションの詳細設定、Wordからのパワポ作成、文字の詳細の装飾）等はやはりケチらずテキストをなぞっておいたほうがよいです。
本番の感想：奇をてらう問題はなく、テキスト・模擬試験通りなかんじで、かなり時間もゆとりをもって無事合格…ふぅよかった。

## 焦りからの受験、結構いいかも？
とりあえず申し込んでしまう作戦で受験せざるを得なくなったのでいいおしり叩きになりました。書ける資格が…ちょっとレベルとしては低めだけどとりあえず2つ確保！

今年はこの焦りから申し込む手法でいろいろとMSの上位資格含めてもろもろチャレンジしてみたいと思います。MOSの残りについてはまだ申し込んでないけどWordのエキスパート（そもそもWordはほぼ実務で使わないため入門からはじめたほうがいいのかも）も夏までには取得してみたいと思います🌞💦
Azure Static Web Apps をパイプラインを使わずSWA CLIでデプロイしたメモ

## 概要
パイプラインが混雑しているときのために、ローカルからデプロイする方法を控えておく。

[ソースコード](https://github.com/hibohiboo/Yakumi/tree/3b641b9b1f5ef71b90e58d4a77557b775c7b3e98)

## ソースコード追加
[パイプライン用に取得](https://qiita.com/hibohiboo/items/5a5bd1fae07fd4a0dd61#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%8F%96%E5%BE%97)したものと同じトークンを環境変数`SWA_CLI_DEPLOYMENT_TOKEN`に入れておく。

```.env
SWA_CLI_DEPLOYMENT_TOKEN = 静的Webアプリのデプロイトークン
```

[swa cli](https://learn.microsoft.com/ja-jp/azure/static-web-apps/static-web-apps-cli-install)を準備する

```diff:package.json
{
  "private": true,
  "name": "yakumi",
  "version": "0.1.0",
  "description": "Udonarium支援ツール",
  "devDependencies": {
+    "@azure/static-web-apps-cli": "^1.1.7",
    "prettier": "^3.2.5",
    "turbo": "^1.13.3",
    "typescript": "^5.4.5"
  },
  "scripts": {
    "build": "turbo build",
    "dev": "turbo dev",
+    "preazure-deploy": "npm run build",
+    "azure-deploy": "swa deploy ./dist --env production --api-location ./api"
  }
}
```

実行
```
npm run azure-deploy
```


## デプロイ成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/9861349e-776c-ede2-8367-3e4ae1841455.png)

なお、パイプラインからデプロイしたときは下記のようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/f6765078-81d9-fc94-60a4-d23417ff8ecf.png)

## (2024.07.22 追記) 環境変数を設定したデプロイスクリプト
[dotenv-cli](https://github.com/entropitor/dotenv-cli)を使うとenvファイルで管理できる。

```json
{
  "scripts": {
    "predeploy": "npm run build",
    "deploy": "dotenv -e .env.local -- bash -c 'swa deploy ./dist --env production'"
  "devDependencies": {
    "@azure/static-web-apps-cli": "^1.1.10",
    "dotenv-cli": "^7.4.2"
  }
}
```

```.env.local
# Static Web App のデプロイトークン
SWA_CLI_DEPLOYMENT_TOKEN=hoge-000000-0000-0000-0000-fugafuga0000
```

[ソースコード](https://github.com/hibohiboo/async-ttrpg/blob/96bcf4e644f7a56e9b33be4038b0e4b47d882eb5/apps/pl-app/package.json)

## monorepo+RPCでのパイプラインをデプロイしたメモ (2024.08.01 追記)
[HonoでRPCをしたAzureStaticWebAppsをAzureDevOpsのパイプラインからデプロイしたメモ](https://zenn.dev/hibo/articles/b9d26ce2174fb2)

## 参考
[Azure Static Web Apps CLI を使用して静的 Web アプリをデプロイする](https://learn.microsoft.com/ja-jp/azure/static-web-apps/static-web-apps-cli-deploy)
[Azure Static Web Apps をローカルソースから直接デプロイする](https://qiita.com/fsdg-nagumo/items/f09b3c567050fc042634)

[作成済のAzure Static Web Apps に Azure DevOps からデプロイしたメモ](https://qiita.com/hibohiboo/items/5a5bd1fae07fd4a0dd61)
【pytrends】WEBトレンドを5行で取得する方法

pytrends＋Google Colaboratoryを活用し、WEBトレンド（Google Trend）の上位データを取得する方法です。ランキングサイトやトレンドウォッチする際に活用できます。
## 早速結論
Google Colab上で下記の手順でデータを取得できます。今回はリスト型で保存します。
```
!pip install pytrends
```
```code.py
from pytrends.request import TrendReq

# pytrendsオブジェクトを生成
pytrends = TrendReq()

# 日本のトレンドデータを取得
trending_data = pytrends.trending_searches(pn='japan')

# 上位10件の急上昇ワードをリストで取得
top_trends = trending_data.head(10).values.flatten().tolist()

# 結果を表示
print(top_trends)
```
#### 結果
>['日本 U-23 対 ウズベキスタン U-23', '鬼滅の刃', 'サッカー日本代表 U23', 'ケンタッキーダービー', '今井美樹', '新日本プロレス', '長嶋茂雄', 'Jリーグ', '博多どんたく', '浦和レッズ']

## 補足
#### 特定のキーワードから関連検索キーワードを取得する方法
```keyword.py
from pytrends.request import TrendReq
pytrend = TrendReq(hl='ja-jp',tz=-540, retries=5)
kw_list = ["大谷"]
pytrends.build_payload(kw_list, cat=0, timeframe='today 5-y', geo='JP')
pytrends.related_queries()
```
#### 結果
>{'大谷': {'top':           query  value
  0         大谷 翔平    100
  1         大谷 速報     19
  2      大谷 翔平 速報     12
  3         エンゼルス      9
  4      エンゼルス 大谷      9
  'rising':                 query  value
  0        田中 真美子 大谷 翔平  78150
  1              田中 真美子  44650
  2               大渓 翔平  21450
  3         大谷 翔平 結婚 相手  17400
  4      エンゼルス 大谷 翔平 投手  11800}}

#### 期間を指定してデータを取得する方法
trending_searches()は直近24時間のトレンドを取得します。これだとリアルタイムのバズが分かりません。その場合は、
  
```realtime.py
from pytrends.request import TrendReq

# pytrendsオブジェクトを生成
pytrends = TrendReq()

# 日本のトレンドデータを取得
# trending_data = pytrends.trending_searches(pn='japan')
trending_data = pytrends.realtime_trending_searches(pn='JP')

# 上位10件の急上昇ワードをリストで取得
top_trends = trending_data.head(10).values.flatten().tolist()

# 結果を表示
print(top_trends)
```
#### 結果
※英語でしか出力されない点に注意
>['LaLiga, Takefusa Kubo, Real Sociedad, UD Las Palmas, Real Madrid CF, FC Barcelona']

## 終わりに
2024年4月からアウトプットのためにQiitaとnoteを始めました。「フォロー」や「いいね」頂けると励みになります！

https://qiita.com/zukki2

https://note.com/zuki2
Qiita内にcodepenを埋め込む方法

# codepenとは？
1. **コードの実行とプレビュー：** CodePenを使用すると、HTML、CSS、JavaScriptを含むコードをリアルタイムで編集し、ブラウザ上で即座にプレビューすることができます。
1. **プロジェクトの共有とコラボレーション：** 自分の作品やプロジェクトをCodePen上で公開し、他のユーザーと共有することができます。また、他のユーザーの作品に対してコメントやフィードバックを提供したり、コラボレーションしたりすることも可能です.
1. **コミュニティと学習：** CodePen には、世界中の開発者が集まるコミュニティがあります。他の人のペンを見て学ぶことができますし、自分の知識を共有することもできます。
1. **他サイトでの埋め込み：** ソースコードや結果表示を他のサイト(Qiita)に埋め込むことができます．

# 埋め込み方法

埋め込んでみるとこんな感じ⇓⇓

<p class="codepen" data-height="400" data-default-tab="html,result" data-slug-hash="VwNJJPm"</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 方法1：URLのゴリ押し
必要なのはpenを開いた時のURLの最後の部分
https://codepen.io/ユーザー名/pen/「ここが必要」/

それをコピーして以下のコードのdata-slug-hash=" **ココにぶち込め** "
```
<p class="codepen" data-height="400" data-default-tab="html,result" data-slug-hash="表示したいpenのURL"</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
```
**出来たらこれをマークアップ内に貼るだけで完成**

## 方法2：本来の正規ルート

:::note warn
私は，なぜか `Embed` というボタンが表示されなかったので1の方法をとった．
理由が分かる優しい方いらっしゃれば教えてください．
:::
https://qiita.com/Qiita/items/edae7417214c8e957f54

# その他
基本的な使い方を知りたい方は以下を参照ください

https://qiita.com/fumu238/items/f73274aa1a188eb15794

codepenのページです

https://codepen.io
なんとなくvim

# なんとなくvim
なんとなくvimを初めてみました。
現時点での設定をメモしておきます。

## 環境
M1 Mac
fish
neovim

## インストールしているもの
fish
neovim

vim-plug
fern.vim
vim-easymotion
telescope.nvim
coc.nvim:lsp用

## fern.vim
以下をaliasに設定して、開くようにしてます。

```
alias vimm="nvim -c 'Fern . -drawer'"
```

Ctrl + wを２回押すと親のディレクトリに戻れます。

### vim-easymotion
ブラウザでvimiumを使っている方ならイメージがつきやすいです。
あれのファイル内検索バージョンです。
私の場合はleaderをスペースに割り当てているので
スペース+スペース+s+検索したい文字列
で移動できます。


### telescope.nvim
vscodeのctrl+pのような感じでファイル検索ができます
私の場合はleaderをスペースに設定しているので
スペース+ffでファイル検索ができます。(デフォルトのまま）
エスケープキーで閉じれます。

### coc.nvim
```
:CocInstall coc-clangd
```


現時点だと以上です。
まずは、基本的なコマンドをマッスルメモリーに叩き込もうと思います。
まだまだ使いこなすには時間がかかりそうです。
ちょっとずつアップデートしていければと思います！！


その他追記メモ：
環境構築で必要なもの。

Rectangle:ウィンドウを移動できる
z:ディレクトリ間の移動を高速にできる
【小ネタ】Node.js と Mac の Sayコマンドでテキストの読み上げ（複数の文章を対象にしつつパラメータ変更も試す）

この記事では、「Node.js と Mac の Sayコマンドを組み合わせて、テキストの読み上げを行う」というものです。その際に、1回のコマンド実行で、複数の文章を読み上げるようにしつつ、さらに読み上げの速度の変更も試してみます。

今回の内容を行った背景は、以下のイベント参加時に試作したものが関係しています。
具体的には、Node.js で Vertex AI Gemini API を使った簡易なプログラムを作った際に、API で扱うリクエスト・レスポンスのテキストを、Mac上で簡易な方法で読み上げるようにしてみたい、というものでした。

●Build with AI - Python SDKを触ってみよう @ 仙台 - connpass
https://gdgishinomaki.connpass.com/event/315940/

ちなみに以下のポストの動画が、API でのリクエスト・レスポンスのテキストの内容を、Sayコマンドで読み上げる、という内容を Node.js で実装して動かしてみた時の様子です。

https://twitter.com/youtoy/status/1786758652973707336

## Mac の Sayコマンド
Mac の Sayコマンドは、Mac で標準で使える、テキストの読み上げができるコマンドです。

例えば、以下のコマンドを実行すると、音声読み上げが簡単に行えます。

```zsh
say "こんにちは"
```

### 読み上げ時に利用できる音声
この読み上げをする音声は変更できるのですが、その際に選べる音声のリストは、以下のコマンドで確認できます。

```zsh
say -v "?"
```

上記のコマンドを実行した際に表示される結果の一部を以下に掲載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/50b79bdb-8402-7138-74c5-085512dcd284.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6f69f076-93d3-b9df-1a34-66c18d477f35.png)

自分のデフォルトの環境だと、日本語の読み上げができるのは、以下の　1つのみでした（※日本語に対応した他の音声を、追加することはできるようです）。

```zsh
Kyoko               ja_JP    # こんにちは! 私の名前はKyokoです。
```

### 読み上げに関するパラメータ
また、Sayコマンドでの読み上げでは、読み上げるスピードなどを変更できます。

以下のやり方を使うと、文章の途中で読み上げのスピードを変更できます。

```zsh
say "読み上げのテストです。[[rate 220]]この部分ははやく読まれて[[rate 70]]この部分は遅く読まれます。"
```

また、コマンドで指定した文章全体を、あるスピードで読み上げるという場合は、以下のやり方を使うこともできます。

```zsh
say -r 220 "この文章ははやく読まれます。"
```

## Node.js で Sayコマンドを使う
それでは上で見てきた Sayコマンドを、Node.js で使ってみます。

Node.js でコマンドを実行するのには、↓こちらを使いました。

●Child process | Node.js v22.1.0 Documentation
https://nodejs.org/api/child_process.html#child_processexecsynccommand-options
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5ba5ec7a-f8b0-d6e4-0d7d-f948f2442d6b.png)

以下が、Sayコマンドを 3回実行するプログラムです。

```javascript
const { execSync } = require("child_process");

execSync('say テスト');

execSync('say '+'読み上げのテストです。[[rate 220]]この部分ははやく読まれて[[rate 70]]この部分は遅く読まれます。');

execSync('say '+'-r 250 この文章ははやく読まれます。');
```

上記のプログラムを nodeコマンドで実行すると、読み上げが行われるのが確認できます。

## 参考にしたサイト

●（macOS）sayコマンドの読み上げを動的にカスタマイズする方法
　https://zenn.dev/moutend/articles/5f4ab7f51f8a1ea87e8d

●"say" command in Mac.｜Nobu
　https://note.com/nobuhirosaijo/n/n815a8390e4c5
[Leet Code] 09 Palindrome Number

[**09 Palindrome Number**]("https://leetcode.com/problems/palindrome-number/description/")
整数が与えられ、それがPalindromeかどうかを判定する問題。
**Palindrome** ... An integer is a palindrome when it reads the same forward and backward.

まず負の数の場合を除外。
与えられた整数を文字列とし、前から左右対称の位置の文字と一致するか見ていく。

if(String(x)[i] != String(x)[(String(x).length **-1** )  - i]) の -1 をずっと忘れていて悩み苦しんだ。。。。。


```palindromeNumber.js
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    let ans_bool = true;
    if(x < 0){
        ans_bool = false;
        return ans_bool;
    }
    for(let i = 0; i<(String(x).length + 1)/2; i++){
        if(String(x)[i] != String(x)[(String(x).length-1)  - i]){
            ans_bool = false;
        }
    }
    return ans_bool;
};
```
技術同人誌イベント、行くのも出すのも楽しいぞ！【行く編】

# 今年もまたイベントの時期がやってきた！
もうすぐ[技書博](https://gishohaku.dev/)＆[技術書典](https://techbookfest.org/)…ということで、私自身新刊は出さないのですが、フリーペーパーへの寄稿（？）としてポエム書きます。私のような非エンジニアにとっては、初めて知る世界だったりするのでその魅力を語ろうと思います。

ちなみに今回の技書博＆技術書典では、私の所属するノンプロ研（[ノンプログラマーのためのスキルアップ研究会](https://plannauts.co.jp/nonproken/)）からこのたびPython本『PySimpleGUIではじめるPythonデスクトップアプリ作成レシピ』がホッタさん著で出ます！（まだリンクとかない）
気になりすぎるし、私も早く買いたい。。

# 技術同人とは
同人といえばコミケ的なものを連想しますが、まさにその技術版です。[技書博](https://gishohaku.dev/)＆[技術書典](https://techbookfest.org/)等の同人即売会ではあらゆる技術分野について書かれた同人誌や自作グッズ等が頒布されます。技術本からポエム本、ライフハック本（？）まで、驚くほど幅広ジャンルです。個人が丹精込めて書き上げた薄い本が並ぶので技術に詳しくなくても楽しめます。

# いざ参らん
### プレサークルチェック
開催前になると、Xで技書博や技術書典のハッシュタグや投稿が増えてきます。少しチェックしてみて好きなジャンルのサークルや頒布がないか確認してみましょう。

もしこれを読んでいるあなたがエンジニアではないのであればぜひノンプロ研をチェックしてみてください。本職がプログラマーではないけれど、プログラミング（ExcelVBA、Google Apps Script、Python、ローコードツール等）で業務効率化しているメンバーの新刊が出ているかもしれません！既刊もたくさんあるのでぜひ～。ちなみに紙の本で購入できるのはイベントの期間だけなので要チェックです！私の『ExcelでBIツール風』本はあとちょっとで売り切れ予定です…。

https://techbookfest.org/organization/5633780930838528

### 入場申込

技書博＆技術書典はだいたい開催時期が近く、およそ一年に二回くらい：春と秋に開催されています。入場料や入場申し込みがないかどうか確認しておきましょう。コロナ前は早い時間帯が有料だったりしたこともありましたが、最近は無料で開催されていることが多いです。行く勇気がなくても、ふらっと立ち寄るだけでもOKです。枠がなくなる前に登録だけしておくのがおすすめです。

### 当日の装備

当日は戦利品を入れるトートバック的なものがあるとよいです（おまけでくれることもあるが、結構派手目の色だったりするので恥ずかしければ用意）。また、技術書典ではあとで決済するキャッシュレスの仕組みがありますが、これは事前に登録しておく必要があります。ちょっと面倒な場合は現金を５００円単位で用意しておくとよきです。

### サークルチェック

当日行く前にお目当てのサークルがどこにあるかXやイベントの公式サイトを確認しましょう。目当てがあると動きやすくなります。同人誌は印刷部数が少ないため、物理本（紙の本）を絶対にGETしたい方は真っ先に向かいましょう。

### とにかく雰囲気がたのしい

聞いたこともないようなジャンルの本や、なんだこれは！？な本など思わぬ出会いがあると思います。サークルで出展側も、買いに来ている側もかなり熱量が高いです。知らないジャンルでもかなりアツい解説が聞けたりするのでどんどんいろいろなところをまわってみてください！直接推しに会えるのも良き。

### 戦利品をチェック

誰かと行く場合は戦利品を見せ合ったり読みながら休憩するのも楽しいです。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/b3abd3c2-1fd3-dce6-15bc-147b2b9d59cc.jpeg">

ちなみに写真見返していたら私が初めて行った際はOffice本、スクレイピング本、Chrome本と非エンジニア寄りの同人誌をGETしてました。（エモい）
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/0a26131a-262e-9336-ba75-fba42e9d3afc.jpeg">

技術書典では購入した戦利品を撮影するブース等もあります笑
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/117f0369-35f0-21f6-ae06-5952d22c70b9.jpeg">

皆様にも素敵な作品との出会いがありますように！
次は出そう編をかけたら書きます（行けたら行くのノリ）
【ABC352】コンテストメモ【AtCoder】

## はじめに
毎週取り組んでいる「AtCoder Beginner Contest」の感想・まとめをこちらの記事に散文的にまとめていきます。

:::note warn
使用言語はC++
:::

:::note warn
「未着手」は手を付けていない問題。
「未提出」は手を付けたけれど提出はしていない問題。
:::

## 結果
- 順位: 6253位
- 点数: 600 (1)点
- 時間: 29:31
- pef: 512相当
- R: 233 → 257 (+)Highest更新
- 完問数:3完 ABC(1)

![スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954837/94f0789f-4d0f-f3be-cefd-4bd88d8eae31.png)


## 問題別評価

### A問題
- AC 3:00
- [AtCoder Line](https://atcoder.jp/contests/abc352/tasks/abc352_a)
- [AC実行結果](https://atcoder.jp/contests/abc352/submissions/53083843)

Nは考えずにX、Yの間にZがいるかどうかを考えればよい。XとYの大小は定められていないので注意が必要。


### B問題
- AC 11:39
- [Typing](https://atcoder.jp/contests/abc352/tasks/abc352_b)
- [AC実行結果](https://atcoder.jp/contests/abc352/submissions/53099078)

全探索。文字を一つずつ比較して一致したindexを保存する。

### C問題
- AC(1) 24:31
- [Standing On The Shoulders](https://atcoder.jp/contests/abc352/tasks/abc352_c)
- [AC実行結果](https://atcoder.jp/contests/abc352/submissions/53109863)

全探索...？
肩と頭の差が一番ある巨人を一番上に乗っければよいので差を比較する。

### D問題
- TLE(1)
- [Permutation Subsequence](https://atcoder.jp/contests/abc352/tasks/abc352_d)

直近で解いた問題に似ていたので解けると思ったがTLEを解消できず（解いた問題も思い出せない。コンテスト番号が近かった気もする）。
データの保存方法はあっていたが、尺取り法な気がしていたのですが具体的なコードに落とし込めず。

### E問題
- 未着手
- [Clique Connect](https://atcoder.jp/contests/abc352/tasks/abc352_e)

重み付き無向グラフ。ゼロからは解けないと判断したので放置。

### F問題
- 未着手
- [Estimate Order](https://atcoder.jp/contests/abc352/tasks/abc352_f)

よくわからず。解説を見た感じだとグラフに落とし込んでこねこねするみたい。

### G問題
- 未着手
- [Socks 3](https://atcoder.jp/contests/abc352/tasks/abc352_g)

整数問題？だと思う。当分解くことはなさそう。

## 総評・まとめ
久しぶりのコンテストで茶pefを出せたので万々歳。茶色になることを目標にしながら緑pefを目指して頑張ります。
ハングル全文字1万1,172個を抽出する方法

## ハングルの全文字リストを取得する方法
ハングルの全文字のリスト(11,172文字)を見つけることは意外と困難でしたが、最終的に成功した方法を共有します。

### 問題の背景
最初は、ハングルの全文字リストを見つけるのが難しいことに驚きました。インターネット上では、テキストベースのリストがあまり見当たらず、検索しても求めている情報にたどり着けませんでした。

### 要求されるリストの内容
ハングルの文字は、母音字が11個、子音字が17個で、合計28字です。これらを組み合わせると1万1,172個の文字が表現可能である、と[こちらの記事](https://chosonsinbo.com/jp/2011/09/hangul_7/)に書かれていました。

### 解決策の発見
やがて、Wikipedia日本語版の「ハングル」ページで、[U+AC00-U+D7AF（ハングル音節）](https://www.unicode.org/charts/PDF/UAC00.pdf)というPDFを見つけました。このPDFには、ハングル文字一覧が含まれていました。

### リストの作成
pythonを使ってPDFからテキスト情報を抽出し、韓国語の部分を抜き出して文字列のリストを作成しました。リストの長さは合計で11,172文字でした。
```python:extract.py
import re
import pdfplumber

# PDFファイルのパス
pdf_file_path = './data/UAC00.pdf'

def extract_hangul_from_all_pages(pdf_path):
    hangul_text = []
    
    with pdfplumber.open(pdf_path) as pdf:
        # 各ページに対してループ
        for page in pdf.pages:
            # テキストを抽出
            page_text = page.extract_text()
            # ハングルのみを正規表現で抽出してリストに追加
            hangul_matches = re.findall("[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]+", page_text)
            hangul_text.extend(hangul_matches)
    return hangul_text
    

# PDFファイルからハングルのみを抽出して表示
hangul_characters = extract_hangul_from_all_pages(pdf_file_path)
print(len(hangul_characters))
print(hangul_characters)

```
→結果：
11,172
가 감 갠 갰 걀 ... 흟 흯 흿 힏 힟

(11,172文字をすべてこちらに貼るとページが落ちたので皆さんご自分で取得してください)

### 結論
韓国語には詳しくありませんが、このリストはおそらく正しいものだと思います。これで、ハングルの全文字リストを取得することができました。

やはり、文字コード等で困ったときはWikipediaですね。以上です。