OmniAICreator/Qiita-1.07M huggingface dataset:
Xcode で Distribute App を実行しようとしたときに Communication with Apple Failed または No profiles for 'com.abc' were found となった時のエラー解消メモ

# これなに

- Xcode から Distribute App を実行しようと思ったら以下のエラーが出た
  - `Communication with Apple Failed`
  - `No profiles for 'com.abc' were found`
- そのエラーをどのようにして解決したのかをこの記事でメモ
- そのため、固有のケースによってはこれが当てはまらないケースもあることをご了承ください

![Qiita - Fix xcode provisioning error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/a70d7029-358e-367a-fcf9-ae3f50d99d31.png)


# 原因

Profiles が無かった

# 解消手順

## Step 1: Profiles を作成

[こちら](https://developer.apple.com/account/resources/profiles/list)から Profiles を作成してください
リンクに入ると以下のスクリーンショットのような画面になるかと思いますので、＋ボタンから手続きを行なってください

https://developer.apple.com/account/resources/profiles/list

![Screenshot at Nov 30 15-30-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/4eb0cfde-6cb8-6e64-1bd8-be4aca48c5f4.png)


## Step 2: Profiles をダウンロードして、指定の箇所に配置

Profiles の作成が完了したら、Profiles をダウンロードして `~/Library/MobileDevice/Provisioning Profiles`のディレクトリに配置してください

#### ↓ダウンロードはこちらから（リストページからのダウンロード可能なので、お好きなように）

![Screenshot at Nov 30 15-33-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/77868059-0fda-9623-8019-baec4e7d2640.png)

#### ↓実際の配置箇所の確認は以下の通り行いました

```zsh
% pwd
/Users/su3-hokkaido/Library/MobileDevice/Provisioning Profiles
$ ls
Su3_Provisioning_Profile_20241130.mobileprovision
$
```

## Step 3: Try again で Signing 再実行

Try again ボタンをクリックしてあげると無事に成功しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/d575625e-38ec-1f45-945e-b44c286156d0.png)


# 補足

おそらく同様の事象に発生した場合は Profiles を再作成するなどによってエラー解消しそうな気がするので、同じような事象に出会った方は試してみる価値があるかも

また、中間ファイルやキャッシュがエラーになっているかもしれないので、DerivedData や Caches を一度削除してから再実行してみるのも良いかもしれません

中間ファイルやキャッシュの削除手順は以下の記事の補足セクションの `試したけどダメだったもの` で掲載しています

https://qiita.com/su3-hokkaido/items/dd4e44a4680140e6d49b#%E8%A9%A6%E3%81%97%E3%81%9F%E3%81%91%E3%81%A9%E3%83%80%E3%83%A1%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE


# あとがき

以下の StackOverflow の質問で同様の手順を踏んでいる人がいたのですが、その人はこの手順では解決できなかった模様
上記内容で解決できないようであれば Copilot とか StackOverflow で解決方法を探しても良いかもです

https://stackoverflow.com/questions/69362808/xcode-couldnt-find-any-ios-app-store-provisioning-profiles-matching-bundle-id

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/da28755c-e1b3-04de-e935-db67f0ce7a45.png)
Null's Brawlでモバイルゲームの魅力を探る

Null's Brawlは、モバイルゲーマーにアクション満載の体験を提供するエキサイティングなゲームです。このゲームは、個々にユニークな能力を持つさまざまなキャラクターと、戦略的な戦闘を特徴としています。戦略的なバトルやマルチプレイヤー対戦が好きな人に最適です。ゲームに慣れている人も、ジャンルに初めて触れる人も、Null's Brawlは無限の楽しみを提供します。

ゲームに興味がある場合は、ダウンロード可能で、さまざまなゲーム内機能や報酬を楽しむことができます。定期的なアップデートと成長するコミュニティにより、Null's Brawlはプレイヤーを魅了し続けるゲームです。

ゲームについてもっと知り、コミュニティに参加してみましょう！公式ウェブサイトで詳細をご覧ください。https://nulls-brawl.com.de/
オブジェクトに直接ミックスインする

```rb
irb(main):001* module Baseball
irb(main):002> end
=> nil
irb(main):003* class Baseball::Second
irb(main):004*   def initialize(player, uniform_number)
irb(main):005*     @player = player
irb(main):006*     @uniform_number = uniform_number
irb(main):007*   end
irb(main):008> end
=> :initialize
irb(main):009> Baseball::Second.included_module
(irb):9:in `<main>': undefined method `included_module' for Baseball::Second:Class (NoMethodError)
```
# 名前空間で分けただけでincludeされていない
```rb
irb(main):010> Baseball::Second.included_modules
=> [PP::ObjectMixin, Kernel]
irb(main):011> Baseball::Second.class
=> Class
irb(main):012> Baseball::Second.include?(Baseball)
=> false
```
### extendすることで使えるようになった。
```rb
irb(main):012> player = Baseball::Second.new("alice", 13)
=> #<Baseball::Second:0x00000001110872f0 @player="alice", @uniform_number=13>
irb(main):013> player.baseball
(irb):13:in `<main>': undefined method `baseball' for #<Baseball::Second:0x00000001110872f0 @player="alice", @uniform_number=13> (NoMethodError)

player.baseball
      ^^^^^^^^^

irb(main):014> player.extend(Baseball)
=> #<Baseball::Second:0x00000001110872f0 @player="alice", @uniform_number=13>
irb(main):015> player.baseball
=> "baseball!"
```
```rb
irb(main):001* module Baseball
irb(main):002*   def baseball
irb(main):003*     "baseball!"
irb(main):004*   end
irb(main):005> end
=> :baseball
irb(main):006* class Baseball::Second
irb(main):007*   def initialize(player, uniform_number)
irb(main):008*     @player = player
irb(main):009*     @uniform_number = uniform_number
irb(main):010*   end
irb(main):011*   include Baseball
irb(main):012> end
=> Baseball::Second
irb(main):013> Baseball::Seocnd.new("Alice",13)
(irb):13:in <main>': uninitialized constant Baseball::Seocnd (NameError)

Baseball::Seocnd.new("Alice",13)
        ^^^^^^^^

irb(main):016> user = Baseball::Second.new("Alice",13)
=> #<Baseball::Second:0x000000010ebee5d8 @player="Alice", @uniform_number=13>
irb(main):017> user.baseball
=> "baseball!"
```
https://gihyo.jp/book/2017/978-4-7741-9397-7

# 感想
includeしないとモジュールのメソッドが使えない
Blender tips

Blenderの覚えておくとちょっと便利な機能をまとめる

ベベルのテクニック
ベベルをかけた際にかけすぎると重なってしまう
その際にCを同時に押すことで重ならずにベベルをかけることができる

https://x.com/N1809031125/status/1862783290970959890

https://www.youtube.com/watch?v=BPfuFJmWmOo&list=PLbcfxxORzQ3bu8oMDO-t1-8IwjDZf63Zf&index=7

曲がったパイプの作り方
2つの円柱を選択しctrl+jで統合させる
editモードにした状態で接地面を辺選択で選択後、右クリックからBridgeEdgeLoopsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/260c4829-105b-7988-294f-59dd8a93264a.png)

なお使い方にはやや癖があるので予め円柱同士の場所を調整したりして工夫が必要

https://x.com/N1809031125/status/1862789321767469213

https://www.youtube.com/watch?v=NgAW_Qb3yUQ&list=PLbcfxxORzQ3bu8oMDO-t1-8IwjDZf63Zf&index=20

一括でモデルの変更を行う方法
alt+Dで複製を行う

https://x.com/N1809031125/status/1863096894509212067

https://www.youtube.com/watch?v=iq_0n9iiTBM&list=PLbcfxxORzQ3bu8oMDO-t1-8IwjDZf63Zf&index=14

面を移動させる際に別の面と被らないようにする方法
面を選択した後にalt+Eを押してExtrude Manifoldを選択する

https://x.com/N1809031125/status/1863470457611252044

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/9ea5be04-c73b-be68-e651-fcfa66f6b828.png)

バラバラの頂点を一括で修正する方法
複数の頂点を選択し、sキーを押してから軸を選択（動画ではzを入力）その後０を入力する
なお元に戻したい頂点が含まれていないと失敗するため必ず元に戻す頂点を含めてから操作を行う

https://x.com/N1809031125/status/1863784508014858526
ASONについて

ASONはAltScript Object Notationの略で階層型のテキストベースのデータ交換フォーマットです。

公式サイトには以下のようなASONの例が載っています。

```plaintext
user-database: [
  {
    name: "John Smith"
    age:  22
    born: 1998-8-15
    usage: 8:22:45
    email: jsmith@altscript.com
    website: http://altscript.com
    version: 3.2.14
    passhash: #A94A8FE5CCB19BA6
    colors: [ 255.100.50 50.50.80 ]
    allow: [ login admin upload edit ]
    check: [ if age > 60 [ add-to people.seniors ]]
  }
  { ... more users ... }
]
```

https://altscript.com/

一見するとJSONのような構造を持っていますが、以下でJSONとの違いについて説明していきます。

# データ型
JSONは以下のデータ型をサポートしています。

- ブール値
- 整数
- 浮動小数点数
- 文字列

しかし、これ以外のデータ型が必要な場合は文字列として記述して、JSON読み出すプログラム側でパースする必要があります。時刻を文字列型で表現するケースが良く見かける例です。

ASONは上記のデータ型に加えて以下のデータ型もサポートしています。

- シンボル
- 日付
- 時刻
- 通過
- バージョン
- メールアドレス
- ネットワークアドレス
- HTMLタグ
- 16進数
- バイナリ(Base64形式)

これにより文字列型の値をパースしてデータ型を変換する処理をASONパーサーに任せることができます。

# カンマ
JSONではカンマで要素を区切っていましたが、ASONでは空白で区切ります。
これは見た目がスッキリする以上の意味を持つようです。
ASONはデータを表現するだけではなく、後述するシンボルを使うことでコードを表現することも考えられています。
空白で区切るような仕組みにすると、このコードとしての表現が通常のプログラミング言語のような見た目にできるのが大きな利点です。

例えば、以下がJSONでコードを記述した例で、

```
[ "if", "time", ">", "10:30", [ "signal", "wakeup" ] ]
```

以下がASONでコードを記述した例です。

```
[ if time > 10:30 [ signal wakeup ] ]
```

ASONの方が一般的なプログラミング言語に似た雰囲気なことが分かります。

# シンボル
ASONではシンボル型を利用できるのが大きな特徴です。
Lispにおけるシンボル型のようなものだと考えるとイメージしやすいです。

シンボルはシンボルテーブルに格納されることで整数のような単純な値に変換されます。これによって文字列型よりも高速に比較演算ができます。
しかしシンボル型の真価は比較の高速化ではなく、シンボルに意味を与えるために使用することだそうです。

例えば以下のASONにはprintというシンボルが使われています。このprintに関数(典型的には画面出力処理など)を割り当てることができます。

```
[ print "Hello" ]
```

この他にも `if` や `>` などのシンボルにも同様に処理を割り当てることで、ASONを単なるデータフォーマットとしてだけではない使い方もできます。

これ以上は具体例がなかったので推測になってしまうのですが、テンプレートエンジンやLisp処理系のようなものに発展していく構想があるのだろうと思います。

実際に以下のロードマップを見るとこの様に書かれており、コード形式のASONを処理するインタプリターを作ることが示唆されてます。

> AltScript — A high-performance interpreter for ASON code including standard functions for all datatypes, support for network connections, file I/O, encryption, compression, and more.

https://altscript.com/?p=116

具体的な実装はまだないですが、データとコードの両方を同じフォーマットで表現するという発想は個人的に面白いと感じました。
C#のDictionaryと私

## AtCoderめッ！難しい問題出すんだからッ！
https://atcoder.jp/

『AtCoderとは、プログラミングを用いて戦う頭脳スポーツ「競技プログラミング」のコンテストサイトの一つ』だそうです(サイトから引用)。

知るきっかけは先輩が毎週参加しており、「出てみん？」と言われたこと。

当時C#を勉強中？の私はBigginerコンテストに参加をしたが全然歯が立たず...。
まぁ今でも歯が立ってるとは思いませんが。

特に悩んでいたのはC問題。ここを毎回突破できずにいました。

なぁんとなくそれっぽいコードを書くことはできるんですけど、実行時間の制限に引っかかってしまい。そうなんですよ、実行時間にも制限があるんですよ。

そんな私を救ったのが、『**Dictionary**』ってわけ☆

というわけで今回はC#のDictionaryのお話し、始まり始まり。

## 語るまでもないか？Dictionaryの話
Dictionary君、何が便利なのか。

個人的な使用感としては「**タグ付け**」のイメージ。

こんなこと言うと『貸せ！Dictionaryってのはこう使うんだよ！』と怒られるかもしれませんが、そこは個人の使用感&プロコンでしか使ったことがない、なので目をつぶっていただきたい。

```ruby:title.rb

var fukuro = new Dictionary<int, int>();

```

Dictionaryには**Key**と**Value**が存在している。前半のintがKeyにあたり、後半のintがValueにあたるものとなる。

Keyが先ほど言っていたタグ、Valueがそのタグに紐づけられた何かしらのものであり、Keyで検索をかければ目的のもの(Value)をｻｯと取り出したり、逆にValueに変更を加えることができる。

今回はintとしているが、ValueをstringやList<string>などにもできるのでそこは自分が何を必要にするかに応じて変更すること。

この説明ではまだピンと来ないはず、ということで実際に問題を解いてみましょう。

## 早速使ってみようじゃあないか
というわけでDictionaryを使って問題を解いてみませう。

今回は2024年8月10日開催『AtCoder Beginner Contest 366』のC問題を。

https://atcoder.jp/contests/abc366/tasks/abc366_c

上のリンクからアクセスできますが、問題も画像で貼り付け。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944350/4fbc5c0c-9ece-02e2-82a9-28b9e441e70f.png)
要約してしまえば、「数字を書いたボールを、袋に入れるか出すかするから、こっちが『袋に入ってるボールに書かれた数でユニークなものは何個』って聞いたらその都度答えてね」といったところ。

さて、まずはDictionaryのKeyとValueを明確にしておきましょう。

今回の問題において、**Keyはボールに書かれた数字、Valueは袋の中のボールの数**、とします。このように設定しておけば、例えば、『1と書かれたボールを袋に入れる』という操作の場合、Keyが1となっているものを引っ張ってきて、紐づいているValueに+1するなんて操作が行える。

百聞、百イメージは一見にしかず、実際に書いたコードをご覧あれ。

```ruby:title.rb
var num = int.Parse(Console.ReadLine()); #何回操作を行うかを格納

var fukuro = new Dictionary<int, int>(); #Dictionary爆誕

var final = new List<int>(); #OutputのためのListも用意

for (int i = 0; i < num; i++) {
    var line = Console.ReadLine().Split(); #入力を読み込んで操作を確認
    if (line[0] == "3") {
        final.Add(fukuro.Count); #操作3は出力となるためDictionary内のKeyの数を格納
    }
    else
    {
        var siji = int.Parse(line[0]); #1だったら袋に入れる、2だったら袋から出す
        var checknum = int.Parse(line[1]); #対象とするボールに書かれた数字
        if (siji == 1) {
            if (fukuro.Keys.Contains(checknum)) {
                fukuro[checknum] += 1; #KeyがDictionary内にあるならばそのKeyのValueに1追加
            }
            else {
                fukuro[checknum] = 1; #KeyがDictionary内にないならば新たにDictionaryに追加
            }
        }
        else if (siji == 2) {
            fukuro[checknum] -= 1; #対象のKeyに紐づいているValueから1個減らす
            if (fukuro[checknum] == 0) {
                fukuro.Remove(checknum); #減らしたうえでValueが0ならKeyごと削除する
            }
        }
        
    }
   
}

foreach (var item in final) {
    Console.WriteLine(item); #操作3のタイミングで出力されるはずの数字がまとめられたリストを出力
}

```

コードで行っていることとしては
・何回繰り返すかをチェック
・袋に入れる、袋から出す、ユニークな数字の数の確認の3操作の確認(繰り返される部分)
→(袋に入れる場合)すでに袋の中に対応する数字があるならばValueに+1、存在しないならばKeyを追加してそのValueを1とする
→(袋から出す場合)対応するKeyのValueを-1、その際Valueが0になるならばKeyを削除
→(ユニークな数字の数の確認の場合)Listにその時点でのKeyの数を格納
・最終的にListに格納した数字を出力
といったところ。

あぁなんて便利なDictionary君。今後も彼の活躍からは目が離せない。
私的サーバー構築日誌：sftpサーバー・Ubuntu 24.04 LTS in MicroServer N54L

## 能書き

[私的サーバー構築日誌：仕切り直し](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6)からの自宅サーバー構築の続きです。

[MicroServer N54L に Ubuntu24.04LTS をインストールしてZFSで使うように設定した](https://qiita.com/katz_engineer/items/bd96a26e0a65ceb28ff7)我が家のファイルサーバですが、今回は SFTP でファイル共有します。

実は私が所有しているiPhoneで撮影した写真をファイルサーバーに転送したいのですが、PhotoSyncというアプリではSambaには接続できなかったのでした。SFTPなら大丈夫でした。Sambaで接続できない原因は何でしょうね…

## 参考文献

- [私的サーバー構築日誌：公開鍵の送付専用ユーザー - Qiita](https://qiita.com/katz_engineer/items/fc02e92d1315d6a51a7c)
- [sftpで fatal: bad ownership or modes for chroot directory と言われた - Qiita](https://qiita.com/haniokasai/items/55332af1e08b1bc32c16)

## ユーザー追加

ログイン不可、ホームディレクトリ無しのユーザーです。

```console
sudo useradd -s /usr/sbin/nologin -M jiro
```

通常のLinuxユーザーとしてパスワードを作成します。

```console
sudo passwd jiro
```

追加したユーザーの為の共有ディレクトリを用意します。

```console
cd /mnt/tank
sudo mkdir jiro
```

```console
sudo chown jiro: jiro
```

```console
sudo chmod 755 jiro
```

## 追加したユーザーの sftp 設定

`ChrootDirectory`で指定するディレクトリは、オーナーが`root:root`で権限が755でなければならない事に注意します。

```console
cat | sudo tee /etc/ssh/sshd_config.d/user_jiro.conf >/dev/null <<___
Match User jiro
  X11Forwarding no
  AllowTcpForwarding no
  PermitTTY no
  PasswordAuthentication yes
  ForceCommand internal-sftp
  ChrootDirectory /mnt/tank
___
```

ssh 設定ファイルを作成したらsshを再起動します。sshdではなくてsshのようです。

```console
sudo systemctl restart ssh
```

## 確認

普段使いのマシンから`sftp`コマンドで入ってみます。

```console:クライアント側
sftp jiro@172.16.1.3
```

通常のFTPコマンドで操作を確認します。

## 仕舞い

`/etc`のSubversion登録。

```console
sudo svn st /etc
```

```console
cd /etc
sudo svn st | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -rt svn add
```

```console
sudo svn ci -m"added user 'jiro'"
```

セキュリティを考えると、`ChrootDirectory`はそのユーザーしか存在しないディレクトリを指定すべきです。今回は技術確認の為にお手軽なディレクトリを指定してしまいました。
名前空間でグループやカテゴリを分ける

>クラスのグループ分け・カテゴリ分けをする目的で使われ流場合もあります。クラスが何十、何百もあるような大きなプログラムになっていると、カテゴリ別にモジュールを（名前空間）を使って整理しないと、どれが何のクラスなのかパッと把握しにくくなるためです。

module ActionViewのmodule Helpersのmodule DateHelperというように名前空間が作られています。

```rb
module ActionView
  module Helpers # :nodoc:
    # = Action View \Date \Helpers
    #
    # The Date Helper primarily creates select/option tags for different kinds of dates and times or date and time
    # elements. All of the select-type methods share a number of common options that are as follows:
    #
    # * <tt>:prefix</tt> - overwrites the default prefix of "date" used for the select names. So specifying "birthday"
    #   would give \birthday[month] instead of \date[month] if passed to the <tt>select_month</tt> method.
    # * <tt>:include_blank</tt> - set to true if it should be possible to set an empty date.
    # * <tt>:discard_type</tt> - set to true if you want to discard the type part of the select name. If set to true,
    #   the <tt>select_month</tt> method would use simply "date" (which can be overwritten using <tt>:prefix</tt>) instead
    #   of \date[month].
    module DateHelper
      MINUTES_IN_YEAR = 525600
      MINUTES_IN_QUARTER_YEAR = 131400
      MINUTES_IN_THREE_QUARTERS_YEAR = 394200
````

https://github.com/rails/rails/blob/dd8f7185faeca6ee968a6e9367f6d8601a83b8db/actionview/lib/action_view/helpers/date_helper.rb#L11C1-L27C46

# 感想
モジュールを知ることでrailsのapiの見方が少し分かりやすく見える
今年のKGDC活動を振り返る

:::note info
この記事は [mediba Advent Calender 2024](https://qiita.com/advent-calendar/2024/mediba) の8日目の記事です
:::
# はじめに
みなさんこんにちは。medibaでバックエンドエンジニアをしている[@hrktcy](https://x.com/hrktcy)です。
入社してから毎年執筆してきたアドカレですが、今回は「今年のKGDC活動を振り返る」と題して、皆さまにご紹介したいと思います。

# KGDCとは
https://kgdc.connpass.com/

**K**DDI **G**roup **D**eveloper **C**ommunity -> KGDC

KDDIグループ企業各社のDeveloperが集い、「エンジニアが楽しめる」イベントを提供するコミュニティです。2021年から活動を始めてもうすぐ4年目を迎えようとしています。

今年KGDCでは3つのイベントを開催しました。

# 3/19: AWS GameDay for KDDI Group
KDDIグループ企業限定のプライベートイベントとして、AWS GameDayをAWSさんに開催していただきました。当日は総勢153名・42チームも集まりました。

<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634396/4d3ad9b1-58ea-d12b-a86e-0bd6875d4fac.jpeg">

<details><summary>AWS GameDayとは？</summary>
AWS上で発生する様々なトラブルへの対応力が問われる実践的な腕試しのイベントです。参加者はイベント用のWebアプリケーションが稼働するAWSアカウントが与えられ、そこで発生する予測できない脅威・変動・変更に対し、チームを組んで立ち向かいます。
アプリケーションがリクエストを処理し続けることで獲得できるポイントを稼ぎ、最終的な合計点をチームで競い合います。
</details>

AWS GameDayのような自らの実践力・思考力が求められるイベントは、参加者の皆さまに良い刺激を与える機会となり、とても盛り上がりました。
またイベント後には懇親会の場も用意していただき、イベントで発生したトラブルの解説をしていただきました。

# 7/29: #7 セキュリティ回
https://kgdc.connpass.com/event/324050/

「KDDIグループのセキュリティ技術 〜KDDIグループ企業でとりくむセキュリティの実態〜」と称し、各社のセキュリティへの取り組みを紹介していただきました。

今年はサイバー攻撃による被害や人的ミスによる情報漏洩など、何かと話題になるセキュリティ被害が多かったと思います。本イベントを通して、改めて兜の緒を締める機会になったのではないでしょうか。

# 11/27: #8 生成AI回
https://kgdc.connpass.com/event/334391/

<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634396/9a021ddc-cb6d-0732-3fd7-3967db7f02c4.jpeg">

今年2月に開業されたeスポーツ専用施設「[esport Style UENO](https://esports.au.com/)」を会場提供していただき、「KDDIグループにおける生成AIの活用状況と今後の展望」と称し、LTとパネルディスカッションの2部構成で開催しました。

生成AIが話題にならない日はないくらい様々な発表がされており、もはや生成AIを使わないという選択肢は無くなってきている近年。KDDIグループ会社における生成AIの活用方法や悩みなどを熱く語っていただいた回となりました。

私個人としても、生成AIの動向を追い、うまく向き合いながらパフォーマンス向上・業務効率化による利益創出を狙っていきたいと思いました。


# 最後に
medibaでは我々と共に「良いモノを届け続ける」エンジニアを募集しています。
興味を持っていただいた方は、[こちら](https://www.mediba.jp/recruit)からどうぞ。
【Pyxel】Macの動作環境について

私が使っているMacは、
> M2 Mac (2023 mac mini) OS:Sonoma

です。

[PyxelのReadme](https://github.com/kitao/pyxel/blob/main/docs/README.ja.md)に書かれているMacのインストール方法

> Mac
> Homebrew をインストールした後、次のコマンドを実行します。
> 
> brew install pipx
> pipx ensurepath
> pipx install pyxel
> Pyxel をインストールした後にバージョンを更新する場合は、pipx upgrade pyxelを実行してください。

と書かれていますが、私のMacでは上記の方法ではインストールできませんでした。
いろいろ試した結果以下の方法に落ち着きました。

> sudo pip3 uninstall pyxel
> sudo pip3 install pyxel

Pyxelは今も鋭意更新中なので新versionが出るたびにこれを実行して更新しています。

ちなみにpython3とpip3のバージョンは、

> python3 : Python 3.12.4
> pip3 : pip 24.2

参考までに！
AWS All Builders Welcome Grantに採択されました！

はじめまして！ぱのです。
普段はメーカーでソフトウェアを触るなどしている社会人1年目です。
本記事では本年度採択をいただきましたAWS All Builders Welcome Grant(ABWG)について概要や応募のプロセスを書いていきます！
ABWGは未経験だけどAWSに興味がある人、AWSバリバリやっている人、re:Invent行ってみたい人、そして学生や若手、女性のエンジニアの方に是非知っていただきたい助成金です。

# All Builders Welcome Grantとは？
All Builders Welcome Grantはラスベガスで行われるre:Invent参加のための助成金です。
## AWSから支援いただける内容
- 金銭面
    - 日本からラスベガスまでの往復渡航費(上限は2000ドルくらい)
    - 滞在費(ホテル5日分)
    - カンファレンスパス(2099ドル)
    - その他　タクシー代、お小遣いなどなど
- イベント
    - 渡航前の説明会
    - Slackコミュニティへの参加
    - Grantee(本助成金に採択された人)限定のセッション
    - 初日、最終日のレセプション

re:Invent参加のために必要な多くの費用をAWSに支援していただけるだけでなく、Granteeのみのイベントも多数用意されています！

## 対象者
エンジニア歴が5年以内　かつ　IT分野において何らかのマイノリティである人が対象となっています。ただ、対象でない場合も申し込みが可能です。
- 女性 / アフリカ系黒人 / ヒスパニック or ラティニクス / 先住民族 / 退役軍人 / 障がい者 / LGBTQIA+ に当てはまる方
- 技術者としてのキャリアにおいて、非特定多数に対する差別行為による障壁や不利益に直面したことがある方

これらどれかがひとつでも当てはまれば対象者となります。

# そもそもre:Inventとは？
私はGrantに応募するまでre:InventのことをラスベガスであるめちゃデカいAWSのイベントなんだな〜！ぐらいしか理解していなかったので、簡単に書いておきます。
- 例年12月初旬の5日間にアメリカ・ラスベガスで行われるAWS主催のカンファレンス
- 2000以上のセッションが開催
    - 聴講するセッション
    - 自分で手を動かしてサービスをデプロイするセッション
    - 少人数でディスカッションするセッション　　　　　　　　　　　など
- re:Playなどの楽しそうなアクティビティもある

今の私の理解はこのくらいです。おそらく調べると何度も参加された方の記事などが出てくるとおもいます。渡航後にもうちょっと詳しく書きます！頑張ります！

# なんで未経験の私がre:Inventに？
そもそも私はre:InventどころかAWS(ほぼ)未経験です。本当に横目でEC2の管理画面的な何かを見たことがあったくらいです。

## 応募のきっかけ
大学の同期からのLINEがきっかけでした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89404/774150d9-1823-f26c-f5fa-295c8252b5dd.jpeg" width=50%>


見てわかるかと思いますが、ノリがとても軽いです。
社会人1年目なこともあって、業務に必ずしも直結しないカンファレンス かつ 平日5日間アメリカ行きます！とはちょっと...と思い、すぐその場で返事はしませんでした。ただ、どうせ受からないだろうし、せっかくなら応募くらいはしてみるか、の気持ちで応募を決めました。

## 応募のプロセス
応募にはプロフィールやエッセイを英語でつらつら書いて提出する必要があります。2024年の内容はこんな感じです。

- プロフィール
    - クラウドテクノロジーに関係のある学位やトレーニングの経験、職歴
    - 今の仕事、あれば前職のことも
    - 学歴(ちなみに学生も応募可能です)
    - 応募条件を満たしているかの確認
        - ここはチェックをつけるだけで証明書などは必要なかったはずです  
        <br>
- エッセイ
    - クラウドテクノロジーに関連した個人的または仕事上での経験(資格なども含む)
    - 今までのAWSサービスの経験について、経験がない場合はこれからAWSでやってみたいこと
    - 今までの個人的または仕事上での経験で最も誇れること
    - クラウドテクノロジーに関連したキャリアの目標について

概ねこんな感じでした。エッセイはそれぞれで上限500wordなので日本語で1000字以上の換算になります。お恥ずかしながら英語でエッセイを書いた経験は少なかったので、DeepLやGrammarlyを多用してなんとかギリギリ仕上げました。Grammarlyは無料でも使い方次第でとっても良さげな英文が仕上がってくるのでおすすめです。（方法はここに載せるとアレなのでいつでも個人的に聞いてください!）

## 応募してから採択まで
応募はWebから提出するだけで「提出したよ！」的なメールもありませんでした。結果の発表までは1ヶ月以上あります。ここで衝撃の事実が発覚しました。先ほど私を誘っていた友人がなんと申し込みを忘れたらしいのです！！！！突然ひとりになってしまいました。
そしてある日朝起きたらこんなメールが来ていました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89404/24fc747d-4aef-7471-1f9e-a48be55cb4cc.png" width=80%>


やった〜！という気持ちと、大変だ！会社に説明しなきゃ！の気持ちでどうやって会社に行ったのかその日のことを思い出せないですが、許可をいただくことができたので今回は有給休暇を取得して参加することになりました！もしチームメンバーや同じ部署の皆さんがご覧になっていたら、改めて感謝をお伝えしたいです。

# 最後に
私が知る限り、この助成金の日本からの採択者は昨年１人、今年は私含めて2人です。また採択が決まってからJAWSと呼ばれるAWSのユーザーコミュニティにも参加していますが、なかなか助成金自体が知られていない状況だと知りました。
私はAWS未経験、会社もAWS使っていない、という状況でしたが助成金をいただくことになりました。応募は全部英語でちょっと大変かもしれませんが、多くの人にチャンスがあると思います。是非、応募条件に当てはまる多くの方に知っていただき、来年以降も日本からの採択者が増えていくといいなと思っています。
来年以降応募の際に疑問などあれば是非SNSで気軽にご連絡ください！全力でサポートします！
re:Inventに参加しての感想はまた12月に！
モジュールを利用した名前空間の作成

# クラス名の衝突を防ぐ名前空間を定義
>`クラス名の衝突を防止する名前空間として使われています`。
モジュールに属するクラスを参照する際は、`モジュール名::クラス名`にように`::`でモジュール名とクラス名を区切ります

# 名前の衝突が起きる
>大規模なプログラムや外部に公開するライブラリを作ったりするときはクラス名の重複が問題になることがあります。

>2つのクラスを同時に使う必要が出てきた場合、どうやって区別をすればいいでしょうか？
```rb
irb(main):001* class Second
irb(main):002*   def initialize(player, uniform_number)
irb(main):003*     @player = player
irb(main):004*     @uniform_number = uniform_number
irb(main):005*   end
irb(main):006> end
=> :initialize
irb(main):007* class Second
irb(main):008*   def initialize(digits)
irb(main):009*     @digits = digits
irb(main):010*   end
irb(main):011> end
=> :initialize
irb(main):012> Second.new('Alice', 13)
(irb):8:in initialize': wrong number of arguments (given 2, expected 1) (ArgumentError)

irb(main):013> Second.new(13)
=> #<Second:0x000000010774f380 @digits=13>
```
# 異なるモジュールの配下になることによってclass名の衝突が起きない
>`「名前空間（ネームスペース)」としてのモジュール`です。モジュール構文の中にクラス定義を書くと「そのモジュールに属するクラス」という意味になるため、`同名のクラスがあっても外側のモジュール名さえ異なっていれば名前の衝突は発生しなくなります`。

```rb
irb(main):001* module Baseball
irb(main):002*   class Second
irb(main):003*     def initialize(player, uniform_number)
irb(main):004*       @player = player
irb(main):005*       @uniform_number = uniform_number
irb(main):006*     end
irb(main):007*   end
irb(main):008> end
=> :initialize
irb(main):009* module Clock
irb(main):010*   class Second
irb(main):011*     def initialize(digits)
irb(main):012*       @digits = digits
irb(main):013*     end
irb(main):014*   end
irb(main):015> end
=> :initialize
irb(main):016> Baseball::Second.new("Alice", 13)
=> #<Baseball::Second:0x00000001059a29b8 @player="Alice", @uniform_number=13>
irb(main):017> Clock::Second.new(13)
=> #<Clock::Second:0x0000000105d8b480 @digits=13>
```

https://gihyo.jp/book/2017/978-4-7741-9397-7
CloudWatch用語整理

CloudWatchの「期間」「統計」「メトリクス」「データポイント」の理解がふんわりしてたので、調べてみました。

## 学習前

メトリクスは・・なんかCPU使用率とかわかるやつ。

期間は・・メトリクス取得するタイミング？EC2の基本モニタリング詳細モニタリングとの違いわからん。

## CloudWatch用語理解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/b57a8519-b437-4cbb-742a-f5c1a2cc8334.png)
↑https://blog.serverworks.co.jp/2023/01/16/102254より拝借

AWSリソースからCloudWatchに情報が送られてくる**＝メトリクス**

CloudWatchはメトリクスを決められた期間・統計によって集計する**＝データポイント**

このデータポイントによってCloudWatchのグラフが形成される

これを踏まえて自分なりに整理してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/fb097bb8-c618-62e5-b889-a80a23730ea0.png)


CloudWatchAlarmの設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/7040033f-345b-53b5-aff8-c43c82c71c41.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/2009621b-24c0-5b16-b5d2-0b61ed6962a0.png)


## 学習後
メトリクスとデータポイントの違いが理解できて、すっきりしました！これからは自信をもって構築できそうです。
CloudWatchの用語がふんわりしている方の助けになりましたら幸いです。☆(ゝω・)vｷｬﾋﾟ
Google Cloudのサポート費用計算早見表(Enhanced Support版)

Google Cloudのエンハンストサポート費用は以下の計算式で決まります。
利用費用に対するパーセンテージでサポート費用が決まりますが、一律〇〇%という話ではなく、金額が大きくなるにつれて、パーセンテージが低くなるような仕組みです。

> 最低料金 \\$100.00
> -または-
> \\$ 0から \\$10,000 までは月額クラウド料金の 10%
> \\$10,000 から \\$80,000 までは月額クラウド料金の 7%
> \\$80,000 から \\$250,000 までは月額クラウド料金の 5%
> \\$250,000 以上は月額クラウド料金の 3%

https://cloud.google.com/support?hl=ja

例えば、利用費が \\$ 300,000の場合は、まずは以下のようにそれぞれの金額帯になるように分離して小計を求めます。

| 利用費($)                      | サポート費用率 | 小計($) |
|-----------------------------|---------|-------|
| 10,000 (0〜10,000の範囲)        | 10%     | 1,000 |
| 70,000  (10,000〜80,000の範囲)  | 7%      | 4,900 |
| 170,000 (80,000〜250,000の範囲) | 5%      | 8,500 |
| 50,000 (250,000〜の範囲)        | 3%      | 1,500 |


その後に小計を足し合わせるとサポート費用が求まります。

```
1,000 + 4,900 + 8,500 + 1,500 = 15,900
```

しかし、一々この方法で計算すると煩雑なため、これと等価な結果を返す早見表を作成しました。

| 利用費の範囲($)      | サポート費用率(A) | 加算(B) |
|----------------|---------|-------|
| 0〜10,000       | 10      | 0     |
| 10,000〜80,000  | 7       | 300   |
| 80,000〜250,000 | 5       | 1,900 |
| 250,000〜       | 3       | 6,900 |

この表から利用費がどの範囲に該当するのかを調べてA, Bを求めた後は、以下の計算式で簡単に計算できます。

```
利用費 * A + B
```

例えば先程の利用費が \\$ 300,000の場合は以下のようにシンプルに求まります。

```
300,000 * 3% + 6,900 = 15,900
```
AWS WAFのログをはじめて読むあなたへ

# はじめに

AWS WAFを導入し、とりあえずカウントモードで運用を始めてみたものの、ログを確認しても何が記載されているのか分からず困ったことはありませんか？  
ログには多くの情報が詰まっていますが、何の手がかりもなく見るのは量が多く大変です。  
本記事では、AWS WAFのログをS3バケットなどに出力している方を対象に、ログの中身を読み解くための基本を解説します。  
ログの出力設定やWAF自体の導入手順については省略しますのでご了承ください。

---

# ログファイルの中身

AWS WAFのログには、リクエストごとの詳細な情報がJSON形式で記録されています。  
大まかな構成は以下の通りです：

### 冒頭から `ruleGroupList`まで
リクエストの最終的な判定結果（`ALLOW`、`BLOCK`、`COUNT`）や対象リソース、タイムスタンプなどが記載されています。

### `ruleGroupList`
現在適用されている個別ルールセットごとの判定結果が記録されています。  
そのルールセットのうちどの特定のルールがヒットしたかどうかを確認する際に役立ちます。

### `httpRequest`
クライアントのIP情報、リクエストURI、HTTPヘッダーなど、リクエストの詳細情報が含まれています。
- **`clientIp`**: リクエスト元のIPアドレス  
- - **`CloudFront-Is-xx-Viewer `**: リクエスト元のデバイスタイプ
- **`headers`**: HTTPリクエストヘッダー情報


### `labels`
ルールの一致詳細や原因に関するラベルが記載されています。  
カスタムルールやマネージドルールがトリガーされた際の理由を把握するために活用できます。

---

# どこにどの情報があるか

AWS WAFのログを効率的に読み解くためには、特定の情報がどこに記録されているかを理解することが重要です。  
以下、主なフィールドについて解説します。

### 1. 判定結果の確認
- **フィールド**: `action`  
- **内容**: WAFが最終的に下した判定（`ALLOW`、`BLOCK`、`COUNT`）
- **利用例**: ブロックされたリクエストだけを確認したい場合、`action: "BLOCK"`を条件にフィルタリングする

### 2. リクエストの送信元
- **フィールド**: `httpRequest.clientIp` および `httpRequest.country`  
- **内容**: リクエスト元のIPアドレスとその地理的な発信元国
- **利用例**: 不審なIPアドレスや予期しない国からのアクセスを特定する

### 3. マッチしたルールの詳細
- **フィールド**: `ruleGroupList`  
- **内容**: 適用されたルールセットごとに、どのルールが一致したかの情報
- **利用例**: 特定のルールが過剰にトリガーされていないかを確認する

### 4. トリガー理由の詳細
- **フィールド**: `labels`  
- **内容**: ルール一致の詳細な理由が記載されています。  
- **利用例**: どの条件がルールをトリガーしたのかを深掘りする際に使用します

---

# どういった時にどこの情報を見るか

ここでは、ユースケース別に「どの情報を確認すべきか」を具体的に解説します。

### 1. 不正アクセスが疑われる場合
- **確認箇所**: `httpRequest.clientIp`、`httpRequest.country`、`httpRequest.headers`  
- **目的**:  
  - 不審なIPアドレスや、地理的にあり得ない地域からのアクセスを発見
  - 攻撃パターン（特定の`User-Agent`や`URI`）を特定

### 2. 過剰ブロックが発生している場合
- **確認箇所**: `action`、`ruleGroupList`  
- **目的**:  
  - ブロックされたリクエストを調べ、過剰に厳しいルールが適用されていないかを確認
  - `labels`で詳細なトリガー理由を把握し、条件を調整

### 3. レート制限のトリガー確認
- **確認箇所**: `rateBasedRuleList`  
- **目的**:  
  - レート制限にヒットしたリクエストを特定。  
  - トリガーしたIPアドレスやリクエストパターンを分析し、適切な制限値を設定

---

# 終わりに

AWS WAFのログには、セキュリティの強化やアクセスパターンの可視化に役立つ多くの情報が記録されています。  
本記事では、ログの基本的な読み方や、状況に応じた確認ポイントを紹介しました。
次のステップとして、一定期間のログの情報や特定のルールやラベルに一致している情報などを、Amazon Athenaなどを使って分析することも良いかと思います。
AWS WAFのログの情報を有効活用していきましょう！
関数型インタフェースは抽象メソッドが1つだけであれば、フィールドやdefaultメソッドを持っても問題ないことを知った

関数型インタフェースのことを「抽象メソッドを1つだけ持つインタフェース」と認識していたため、フィールドやdefaultメソッドも定義できないと勝手に思い込んでいたが、試してみるとフィールドやdefaultメソッドを定義しても問題ないことが分かった。

```java:Test.java
package org.example;

public interface Test {
    void test();
    int num = 0;
    default void a() {
        System.out.println("a");
    }
}
```

```java:Main.java
package org.example;

public class Main {
    public static void main(String[] args) {
        Test t = () -> System.out.println("test");
        t.test();
        t.a();
        System.out.println(t.num);
    }
}
```

```text:出力結果
test
a
0
```

しかし、あえて抽象メソッドを1つのみ定義することで効果を発揮していると思われる関数型インタフェースに、わざわざフィールドやdefaultメソッドはいらないだろうと感じた。
Azure Administrator Associate(AZ-104)合格体験記


# はじめに
Microsoft Azure Administrator（AZ-104）に合格した時の体験記です。
2024年8月に無事一発で合格しましたのでその時の体験を元にこれから受験する方向けの情報を記事にしました。

おすすめ勉強法は「Udemyの講座でざっくり把握⇒問題集を解きまくる」です。

AZ-104を受験する方向けの参考になれば嬉しいです。

# 出題範囲
| 分野 | 割合 |
|:--|:--|
|Azure ID とガバナンスを管理する |20-25%  |
| ストレージを実装して管理する  | 15-20%  |
| Azure のコンピューティング リソースのデプロイと管理	  | 20-25% |
|  仮想ネットワークを実装および管理する | 15-20%  |
|  Azure リソースの監視と管理 | 10-15% |


割合変わることがあるかもしれないので、正しくは公式サイトよりご覧ください。
https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/az-104

# 試験中のポイント

私が受講したときは試験中に「Microsoft　Lean」を見ることができました。（下記サイト）
https://learn.microsoft.com/ja-jp/

Googleと違って非常に検索には癖がありますが、カンニングできるというのは非常に大きなポイントです。
時期によって参照できるできないが変わるようなので事前に確認することをおすすめします。

これがあるかないかで勉強戦略を練ることをおすすめします
暗記がどうしても苦手な方は、Microsoft　Lean上で目的のサイトまでたどり着ける検索ワードだけ覚えていくと◎

# どんな問題がでるのか

ある要件に対して
・どう設定をすれば実現できるか
・最低価格、最低権限なのはどれか
・課題や問題を解決するにはどれが適切か
といった内容です。

問題のイメージは公式の練習試験より
英語のサイトですが以下サイトのほうが試験に近いです

https://www.examtopics.com/exams/microsoft/az-104/

Azure portalの画面スクショを使った試験問題が出てきたりしました。

# 勉強方法

#### 最初はざっくり頭に入れる
まずはざっくり頭にどんな知識が必要か分からせてあげるのがおすすめです。
私はUdemy講座を視聴しました。

人には「見て勉強するのが得意」な人と「読んで勉強するのが得意」な人など結構タイプが分かれるようです。
書籍派のかたは書籍でもよいかと思います。
少し大変ですが公式サイトから無料で学ぶことも可能です

https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/

#### 次に問題を解きまくる

最初の１週目は分からないはずなので、非常に時間がかかることを覚悟し、１つずつ、わからないところを調べて潰していくとよいです

問題を解く⇒分からない部分を調べる⇒問題を解く　
の流れでひたすらループするのがおすすめです。

問題を解いていくと知識をメモしておきたくなります。
しかし、すべてメモすると時間がかかります。
ので、メモしている人を探すと楽ができるかもしれません。
参考文献の段落に私が参照させていただいたチートシートブログを紹介しておきます。

# 実際に活用したUdemy講座紹介


【世界で20万人が受講】AZ-104: Microsoft Azure Administrator 試験対策講座

https://www.udemy.com/course/az-104-microsoft-azure-administrator-jp/?couponCode=CPBRAND24JP

⇒ざっくり頭に知識を入れるのに最適でよかったです
わからない問題の知識を補完する際にも使用できるのでおすすめです。※これだけで完結するわけではありません。

受講生30万講師のAZ-104: Microsoft Azure Administrator模擬試験問題集（400問）

https://www.udemy.com/course/30az-104-microsoft-azure-administrator240/?couponCode=CPBRAND24JP

⇒すべて解くことをおすすめします。
これを解き終わってから試験に臨んで合格できたので、おすすめです。

# 参考文献

[AZ-104：Azure Administrator Associate 試験 チートシート](https://zenn.dev/michinoku/articles/4b8282b8c68a3c)
初めての生成AI　小5とChatGPTを使ってみた話

今、話題の生成AIについて。便利な技術で、ちゃんと勉強して使えるようになったらすごい武器になること間違いなし・・・なのはわかっているけど、なかなか一歩がすすまない。
ということで、今回ははじめての生成AIをYouTubeデビューを夢見ている小5次男と使ってみたお話を書きます。

## １．生成AIとは
### ①生成AIの特徴

生成AIとは文章や画像、動画、音声などいろいろなコンテンツを生成することができるAIのことです。
従来のAIはデータ分析や分類タスクの実施、画像認識などを行うことが主な目的でした。
需要予測や不正検知などこれまでに学習したデータからの傾向分析、未来予測に活用されてました。欠点として大量のデータが必要で、また特定の課題解決のためのカスタマイズも必要だったため、導入にコストがかかり一般向きではありませんでした。

生成AIは文章や画像の生成することに利用されることが多いのが特徴です。
OpenAIなどが提供する事前に学習されたモデルを利用することができるので、大量のデータ準備が必要なくなりました。
また特定の課題にカスタマイズする必要はなく、凡用的なタスクに同じモデルを利用することができます。

### ②生成AIツールの紹介
生成AIのツールは少し調べただけでも非常に種類が多く、また今後も増え続けるのは間違いないので、どれを選んだらよいかも勉強が必要です。

文章生成AI…ChatGPT、Gemini、NotionAI
動画生成AI…Runway、Pika、Canva
音楽生成AI…Suno、SongR、MusicFX

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946605/b5e6f9c7-b3a5-1d3f-da7e-3553f273b5da.png)

ビジネスのためのChatGPT活用ガイドより引用

## ２．ChatGPTのスマホアプリ
### ①ChatGPTをダウンロード
 AppStoreにはその他にも`GP Chat`という日本語で手軽に使えるというAIチャットアプリや`ChatGTPｰ日本語版人工知能ロボット`など類似アプリがたくさんありました。

 ### ②注意点を確認
 生成AIを活用するうえで、特に知識のない子供に対しては、生成AIから受けた情報が正しいと思い込んでしまう場合があったり、個人情報を書き込んでしまう場合があるので、事前に注意が必要ということを聞いていました。
 
 今回はダウンロードした一番最初のページに以下の注意書きがありました。
 「回答は誤っている可能性があること」
 「機密性の高い情報は共有しない」　
子供にこの件については大事なので一緒に読み聞かせて注意するよう話しました。

 ![IMG_8055.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946605/048b0c5f-400d-456d-1021-530486501b90.png)

 また始める前に利用者の年齢の登録画面がありました。
 気にせず自分の年齢を入れましたが10歳と入れたら利用できたのでしょうか？

 ### ③実際に使ってみた結果
 ChatGPTは前述のとおり文章生成AIなので文章を作るのが得意そうですが、YouTube好きの小学生は文章よりも画像生成に興味があるようでした。
 そこで我が家の飼い猫をChatGPTでどんなふうになるのか試してみました。

![IMG_0020A9C8-0E56-4994-826D-32B75F26A5EF.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946605/dec2c5b1-24d0-e1f9-8786-08e1dc2607ff.jpeg)

「このネコを元にスマホのアイコンにできるようなキャラをつくってください。」

![3AB10419-1F6F-4EFF-8F4C-A09C12598A0E.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946605/7c94b426-a137-00cb-2790-bfbd46da965c.png)

「もっとリアルにしてください。」
![E409CDF7-515F-4EB2-9F88-D94FFB0EA62A.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946605/b750f14f-7537-cee0-d683-2f040441d6cc.png)

「他にはありませんか？」というあいまいな質問に対しては、
「新たなデザインの生成に失敗しました。別の方向性や細かいリクエストがあれば、再度試します。」との返事がきました。

![IMG_8062.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946605/9b95b901-52e2-0dec-2ee9-896b368c7cfd.png)

生成できたのは3画像のみで1日の上限に達してしまいました。
YouTubeでも生成AIを使って、リクエストして画像をどんどん変えていくような動画もみかけます。このようにつくっていたんだなって思いました。

## 3.まとめ
小学校5年生の次男とChatGPTを試してみたところ、今回は主に遊びとして活用する形になりました。これから、生活や学習にどのように役立てていけるかを考えていく必要があると感じています。
また、今回は画像生成を試しましたが、文章生成AIは入試の面接対策や小論文の作成に役立つとも聞いているため、少しずつ日常生活に取り入れ、自然に活用できるようになると良いなと思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946605/4654ab30-b21a-1aab-8340-9825bd8f47d2.png)
【ReactNative】環境の作り方

## はじめに
webアプリケーション開発以外にも自分の知見の幅を増やしたいと思ったため、ReactNativeでスマホアプリを作りたいと思った。が、色々忘れそうだなぁと思ったため、備忘録として新しくプロジェクトを作るところから、プロジェクトを開発環境に立ち上がるところまでを備忘録としてここに残しておく。

## 開発環境
・MacOS
・npm
・Expo
・Expo Go

## プロジェクト作成
```
npx create-expo-app@latest
```

## Macでのエラー対処
```
ulimit -n 524288
source ~/.zshrc
```

## プロジェクト起動
```
npm run start
```


## 実機(iPhone)での確認
AppStoreで「Expo Go」を見つけてインストールする。その後、ターミナルに表示されているQRコードを読み込んで、表示されれば完了となる。

## おわりに
なんだか慣れないもんですな...
オブジェクトに直接ミックスインさせる

# クラス以外にもインスタンス以外にもミックスインできる。
```rb
irb(main):001* module Loggable
irb(main):002*   def log(text)
irb(main):003*     puts "[LOG] #{text}"
irb(main):004*   end
irb(main):005> end
=> :log
irb(main):006> s = 'abc'
=> "abc"
irb(main):007> s.log('Hello')
(irb):7:in <main>': undefined method `log' for "abc":String (NoMethodError)

s.log('Hello')
 ^^^^

irb(main):008> s.extend(Loggable)
=> "abc"
irb(main):009> s.log('Hello.')
[LOG] Hello.
=> nil
```
https://gihyo.jp/book/2017/978-4-7741-9397-7

### extend
>extend(*modules) -> self
引数で指定したモジュールのインスタンスメソッドを `self の特異メソッドとして追加`します。

>Module#include は、クラス(のインスタンス)に機能を追加しますが、`extend は、ある特定のオブジェクトだけにモジュールの機能を追加`したいときに使用します。

>`引数に複数のモジュールを指定した場合、最後の引数から逆順に extend を行います`。

https://docs.ruby-lang.org/ja/latest/method/Object/i/extend.html#:~:text=extend(*modules)%20%2D%3E%20self,%E3%82%92%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
AtCoder Beginner Contest 134B - Golden Appleメモ（python）

ABC134Bを間違えたのでメモします。指摘などありましたらコメントをお願いします。
## 問題
[AtCoder Beginner Contest 134B - Golden Apple](https://atcoder.jp/contests/abc134/tasks/abc134_b)
## 考察
求める数は$D$人の監視員の監視範囲で$N$を割った数の切り上げ。
番号$i$の木に配置された監視員は、番号$i-D$以上$i-D$以下のすべてのリンゴの木を監視できる。すなわち$2D+1$の範囲を監視できる。よって$2D+1 = len$としてとき`(N+len-1)//len`が答えになる。なお、`a`を`b`で割った切り上げを求めたいときは`(a+b-1)//b`をすればいい。これがなぜこうなるのかは[ABC153の解説放送](https://www.youtube.com/watch?v=pKOPnK1JPLE&t=2269s)の37分あたりをみるとわかりやすい。
## ACコード
```py
def monitor(n,d):
    len = 2*d + 1
    return (n+len-1)//len

n,d=map(int,input().split())

print(monitor(n,d))
```
xamppのlocalhostで"要求された URL はこのサーバー上に見つかりませんでした。"と表示されたときの解決方法の一例

# 事象
PHPの勉強をしているときにxamppを使いlocalhostでphpファイルを実行しようとすると

![要求されたURLはこのサーバー上に見つかりませんでした。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946329/c3e61971-237e-5269-ca00-5c85702d0d92.png)

と表示された。

# 解決方法
動かそうとしているPHP（今回は"1st.php"という名のファイル）の拡張子が問題だった。

エクスプローラーのフォルダーオプションの詳細設定で"登録されている拡張子は表示しない"にチェックが入っていたため、ディレクトリ上では"1st.php"と表示されていたが、実際は"1st.php.txt"であった。

登録されている拡張子は表示しないにチェックが入っている状態
![登録されている拡張子は表示しないにチェックが入っている状態.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946329/13fbb5e8-69a1-8a40-d03e-c117085a2163.png)

登録されている拡張子は表示しないにチェックが入っていない状態
![登録されている拡張子は表示しないにチェックが入っていない状態.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946329/eccd211a-aff3-ca7e-45af-dd1b02ff06b9.png)

フォルダーオプションを変更したことで、"1st.php"が"1st.php.txt"と表示され、phpファイルではなくtxtファイルであることが分かった。後は、"1st.php.txt"の".txt"部分を消し、拡張子を".php"にすると…

![成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946329/cd52f97a-1ec8-a540-3089-ffe6307d54b0.png)

無事に”1st.php"の内容を表示することができました！
Cloud上のJenkinsの開発時にMySQL Conatinerでつまづいたこと2

# はじめに
引き続き、Could上のJenkinsにpipelineを作る際にmysql containerでつまづいたことを書いていきます。今回はmysqlすぐ落ちてしまうせいでJobも落ちる問題と、その解決方法について書いていきます。

前回の記事はこちら↓ 

https://qiita.com/araiWorks/items/9f0b0b71014d79df6a80


# 環境
- Cloud上のJenkins
- Harbor
#### ざっくりテストJobの流れ
1. localにあるdocker imageをHarborに上げる
2. HarborのimageをJenkinsのジョブ内で呼ぶ
3. Containerを起動させてテストを実行


# つまづいたこと 2: MySQL containerの立ち上がりが遅いため、Jobが落ちてしまう
```bash
#log
mysqladmin: connect to server at 'mysql' failed
error: 'Can't connect to MySQL server on 'mysql' (111)'
Check that mysqld is running on mysql and that the port is XXXX.
You can check this by doing 'telnet mysql XXXX'
```
Pipelineを動かしてみたら、今度はMysqldが立ち上がっていないというエラーですぐjobが落ちてしまいました....

localの`docker composer up` 後の流れを見ている感じ、MySQL containerの立ち上がりには他のcontainerと比べて時間差があるようでした。　私は今回初めて知ったんですが、MySQLの立ち上げが遅いのは結構あるあるみたいですね。

### 解決方法
MySQL Containerが立ち上がるまで1秒ごと立ち上がっているかチェックする関数を作成しました。Containerを起動後に以下の関数を呼ぶと起動状態を確認し、まだ起動していない場合はsleepに移るようになります🥳
一応Containerの起動timeoutを3分で設定しているのですが、大体5-6秒で起動されるかなと言った感じです。

```groovy
def checkMysqlContainerRun() {
    timeout(time: 1, unit: 'MINUTES') {
        def containerRun = false
        while (!containerRun) {
            try {
                sh "docker exec mysql mysqladmin -uroot -pPASS ping -h mysql"
                containerRun = true
            } catch (Exception e) {
                sleep(1)
            }
        }
    }
}
```

# おわりに
実はMySQL containerには運用開始後も色々と悩まされております...
運用開始後のつまづきと対応も今後書ければと思います。

参考になれば幸いです🍎
コンピュータおたくが薦めるUdemy講座

## 1.はじめに

この記事は、「[Udemyおすすめ講座をシェアしよう！ by Udemy Advent Calendar 2024](https://qiita.com/advent-calendar/2024/udemy) シリーズ1」の12日目の記事です。

https://qiita.com/advent-calendar/2024/udemy

### 1.1 自己紹介

筆者は、IT企業で開発業務に勤める新卒2年目のエンジニアです。  
工業高校の電子科を卒業し、情報系の大学に進学。大学を3年で中退し、現在はAzureやGitHubをメインに扱っているクラウドインテグレーターで働いています。
コンピュータが大好きで、かれこれ10年近くコンピュータおたくをやっています。

## 2. お勧めの講座

今回、紹介する講座は以下の講座です。

[Macで学ぶUnix、そしてViマスター](https://www.udemy.com/course/macunixvi/?couponCode=CPBRAND24JP)

https://www.udemy.com/course/macunixvi/?couponCode=CPBRAND24JP

## 3. お勧めする理由

私の周りには、別業種からプログラミングスクールで学んで転職した人や、大学で文系の学部だけどプログラミングを学んでいるという人がよくいます。そういう人に私は、

**「情報工学を知らないなんて勿体無い」**

そう思っています。
正直、本講座はエンジニアリングとは直接的には関係ありません、がコンピュータを扱うエンジニアとしてぜひ知っておいてほしい内容となっています。

### 3.1 コンピュータの歴史・仕組みが学べる

本講座では、エジソンと電球から、大学の「コンピュータ概論」や「コンピュータアーキテクチャ」の授業で触れる内容について学ぶことができます。
なぜUnixができたのか、なぜOSが必要なのかなど、大学の授業では説明されないことまで詳しく解説されており、ここでしか学べない内容となっています。

### 3.2 OSについて学べる

OSが無い時代の話から始まり、オペレーティングシステムがどんなことをやっているかや実際のコマンド操作までを学ぶことができます。ファイルシステムとディレクトリ構造、ドドファイルやパスについても言及されているのは個人的にお勧めポイントです。
基本情報の試験で出てくるような、OSの役割についても学べるのは初学者の方はもちろんのこと、情報工学を学んでいないエンジニアの方にもお勧めできる部分になります。

### 3.3 プログラミングが楽しくなる！

はい、これが結論になります。

やっぱり、エンジニアたるものプログラミングが好きでやってると思います。そんな方にこそ今回紹介する講義を見てコンピュータのことを深く知ることで、普段の業務やプログラミングがさらに楽しくなると思います！

## 4. 特にお勧めする内容

筆者が個人的にお勧めなのは、トランジスタの話になります。

私は普段、ソフトウェアのプログラミングを行なっていますが、そのソースコードはコンバイラによってバイナリーデータに変換されます。よく、コンピュータは1と0の2進数で電気信号が表されると言われますが、その0と1を切り替えるスイッチの役割をしているのがトランジスタ、電気を保存しているのがコンデンサーになります。そこの電子回路が個人的に一番好きな学問なので、この講座で紹介されていることがとても嬉しいです。

ぜひ、情報工学を学んだことがない方はもちろん、一度学んだ方も学び直してほしいと思います！

## 5. まとめ

以上、コンピュータおたくの筆者からお勧めするUdemy講座の紹介でした。

業務とは直接関係ないかもしれませんが、情報工学も学んで見てはいかがでしょうか！
クラスやモジュール自身もオブジェクト

# クラスもモジュールもインスタンス
```rb
irb(main):001* class User
irb(main):002> end
=> nil
irb(main):003> User.class
=> Class
irb(main):004> Class.superclass
=> Module
irb(main):005* module
irb(main):005* module Loggable
irb(main):006> end
=> nil
irb(main):007> Loggable.class
=> Module

irb(main):010> Module.superclass
=> Object
```
* かくもの全てがインスタンス
* クラスのスーパークラスがモジュール

```rb
irb(main):001* class User
irb(main):002*   p self
irb(main):003*   p self.class
irb(main):004> end
User
Class
=> Class
irb(main):005>
irb(main):006* module
irb(main):006* module Loggable
irb(main):007*   p self
irb(main):008*   p self.class
irb(main):009> end
Loggable
Module
```
* Userクラスのクラスはクラス
* Loggableモジュールのクラスはモジュール

https://gihyo.jp/book/2017/978-4-7741-9397-7

# 感想
面白い
Laravel 処理が多いartisanコマンドのコンソール表示を無反応にしない


## はじめに

### 自作artisanコマンドで進捗がないと怖い
すでに公開しているWebサイトのデータベースの内容を加工したいとき、自作のartisanコマンドをサーバ上で実行することはよくあると思います。

しかし、対象データ数が多いために10分以上コンソールで何も表示がないまま待っていると、正常に実行されているか固まっているかの判断がつかずとても怖いです。ほんとに。

### 何のコマンドの進捗か、進捗率、最後まで処理できたかを表示
そこで必要な情報の表示を忘れないために、何のコマンドの進捗か、進捗率、最後まで処理できたかを表示の表示を行うサンプルを作ます。

![2024-11-3014.54.16-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393314/64adfbe9-8593-39bc-fd0d-d2a673d76fc2.gif)



## コマンドのサンプル


- 実行したコマンドが正しいことを確認できるように最初にタイトルを表示
 （正常に開始できたか、開始するときに指定したsignetureと実際の処理があっているかコンソール上で確認できます）
- 多くのデータのループ処理はwithProgressBarのコールバックで実行して進捗表示
 （このメソッドを使うだけでループ中に進捗表示が確認できるようになります）
- すべて処理して終端にたどり着いたら`OK`を表示
 （メモリ不足や他プロセスからのKILLで止まっていないことが確認できるようにするため）
- 処理対象が正しいかを確認できるように`--dry`オプションでドライラン
 （時間をかけ大きな変更をする前に、変更対象を確認できるようにするため）

```php:app/Console/Commands/ExampleCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ExampleCommand extends Command
{

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'example:command {--dry}';


    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'コマンドのサンプル';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        /**
         * コマンドを実行したときに、どのコマンドが実行されたか確認できるように最初にタイトルを表示
         */
        $this->info('コマンドのサンプル : 開始'); // タイトル

        /**
         * サンプルデータ
         *  DBから取得したデータを想定
         */
        $users = [  // ユーザの配列の例： Users::get()などでDBから取得したデータなどを想定
            [
                'name' => 'AAAAA', // ユーザ名
                'elements' => array_fill(0, 12, '-'), // ユーザのなにかの要素： $user->immagesなどのリレーションを想定
            ],
            [
                'name' => 'BBBBBBB',
                'elements' => array_fill(0, 10, '-'),
            ],
            [
                'name' => 'CCC',
                'elements' => array_fill(0, 5, '-'),
            ],
            [
                'name' => 'DDDDD',
                'elements' => array_fill(0, 8, '-'),
            ],
        ];

        /**
         * 処理のメイン
         *  データ単位ごとの実行する場合
         */
        foreach ($users as $user) {
            $this->taskUser($user);
        }

        /**
         * コマンドの最後まで実行できたことが確認できるように最後にメッセージ出力
         */
        $this->info('OK');
    }

    protected function taskUser($user)
    {
        $this->info("USER: {$user['name']}");

        if (!$this->option('dry')) {

            /**
             * 要素ごとの処理
             *  表示上で処理の進行が確認できるようにwithProgressBar()でループ処理をする
             */
            $users = $this->withProgressBar($user['elements'], function ($element) use ($user) {
                $this->taskUserElement($element);
            });

            $this->newLine();

        }

    }

    protected function taskUserElement($element)
    {
        /**
         * 要素ごとに処理
         *  element->update() などを想定
         */

        // ダミーの処理 //////////
        sleep(1);
        ////////////////////////
    }
}

```
モジュールとインスタンス変数

# モジュールはinclude先のクラスのインスタンス変数を共有できてしまう
>モジュールとミックスイン先のクラスでインスタンス変数を共有するのはあまり良く設計ではありません。
```rb
irb(main):001* module NameChanger
irb(main):002*   def change_name
irb(main):003*     @name = 'アリス'
irb(main):004*   end
irb(main):005> end
=> :change_name
irb(main):006* class User
irb(main):007*   include NameChanger
irb(main):008*
irb(main):009*   attr_reader :name
irb(main):010*
irb(main):011*   def initialize(name)
irb(main):012*     @name = name
irb(main):013*   end
irb(main):014> end
=> :initialize
irb(main):015> user = User.new
(irb):11:in initialize': wrong number of arguments (given 0, expected 1) (ArgumentError)
...
irb(main):016> user = User.new("alice")
=> #<User:0x0000000106e4fd98 @name="alice">
irb(main):017> user.name
=> "alice"
irb(main):018> user.change_name
=> "アリス"
irb(main):019> user.name
=> "アリス"
```
# インスタンス変数でなくセッターメソッド経由で変更する
>ミックスイン先のクラスと連携する場合は特定のインスタンス変数の存在を前提とするより、特定のメソッドの存在を前提とする方が安全です。
```rb
irb(main):001* module NameChanger
irb(main):002*   def change_name
irb(main):003*     self.name = 'ありす'
irb(main):004*   end
irb(main):005> end
=> :change_name
irb(main):006* class User
irb(main):007*   include NameChanger
irb(main):008*
irb(main):009*   attr_accessor :name
irb(main):010*
irb(main):011*   def initialize(name)
irb(main):012*     @name = name
irb(main):013*   end
irb(main):014> end
=> :initialize
irb(main):015> user = User.new('alice')
=> #<User:0x00000001100f5a30 @name="alice">
irb(main):016> user.change_name
=> "ありす"
irb(main):017> user.name
=> "ありす"
```
https://gihyo.jp/book/2017/978-4-7741-9397-7
.DS_Store ファイルの一括削除の仕方(windows版)

# 今回行ったこと
Windowsを使って、「.DS_Store」というファイルを一括で削除する方法について説明します。

# 環境
- **作業を行う環境（ファイル削除を行う環境）**  
  Windows 10 Pro  

- **元ファイルを作成した環境**  
  MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)

# 作業
Windowsの標準コマンドプロンプトを使用して削除します。

1. **コマンドプロンプトを管理者権限で開く**  
   管理者権限でコマンドプロンプトを開きます。以下の画像を参考にしてください。  
   ![スクリーンショット 2024-11-30 15.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887299/4985fb76-e226-4f83-118a-f5ab1a1a38ea.png)

2. **以下のコマンドを入力し、実行します** 
`del /s /q /f "C:\Users\<ユーザー名>\Desktop\.DS_Store"`
(<ユーザー名>の部分は、修正してください。<>は削除してください。)

# ユーザー名が分からないとき
1. コマンドプロンプトで以下のコマンドを実行することで、確認できます。
`echo %username%`

# 注意事項
- 誤って他のファイルを削除しないように、コマンドに誤りがないか確認してください！
[rails] graphql-rubyでどのfield呼び出しが遅いのかわからない場合

# 問題

graphqlのqueryでActiveRecordの呼び出し部分は問題がないが、各fieldの呼び出し`app/graphql_types/*_type.rb`でどうも遅い。だけどfieldでより時間がかかっているのか？、どのぐらい呼び出されているのかわからない。

# 解決

[GraphQL::Tracing::ActiveSupportNotificationsTracing][1]を使って、呼び出し毎の処理状況をログに落とし込む。

```rb:config/initializers/active_support_notifications.rb
logfile = Pathname(Rails.root.join("log/graphql.tsv"))

ActiveSupport::Notifications.subscribe(
  /graphql/
) do |name, started, finished, unique_id, data|
  # 古いgraphql-ruby（graphql (1.9.17)）使っているので、データのアクセス方法は違うかも
  next unless data[:context]

  operation_name = data[:context].query.operation_name
  name = data[:context].field.name
  type = data[:context].field.type
  duration = ((finished - started) * 1000).round(2)

  logfile.write(
    [
      Time.current.strftime("%Y-%m-%d %H:%M:%S"),
      operation_name,
      name,
      type,
      duration,
      "\n"
    ].join("\t"),
    mode: "a"
  )
end
```

```rb:app/graphql/app_schema.rb
class AppSchema < GraphQL::Schema
  # config/initializers/active_support_notifications.rbが呼ばれる
  tracer(GraphQL::Tracing::ActiveSupportNotificationsTracing)

  # ...
  # ...
end
```

# 出力ログ

これにより`Rails.root.join("log/graphql.tsv")`へログが逐次出力され

- 出力日時
- Queryの名前
- field名
- 処理時間

がタブ区切りで記録される。このTSVをgoogle spreadsheetなどにインポートしてピボットテーブルなどで集計して原因を探る。

[1]: https://imaharu.github.io/graphql-ruby-doc-ja/queries/tracing#activesupportnotifications

## 例

```graphql
query Test{
  test{
    id
    name
    product {
      id
      name
      price
    }
  }
}
```

などとあった場合、

```tsv:app/log/graphql.tsv
2024-11-30 6:29:41	Test	id	0.01
2024-11-30 6:29:41	Test	name	0.01
...
```

みたいな感じで出力される。
株式会社マジルミエに登場したソースコードはオブジェクト指向だった

# はじめに
　こんにちは，Umamusume22です．最近，私は株式会社マジルミエ[1]をDMMで観ています．マジルミエの8話を観ていた時，二子山(以下，ニコ)というキャラクターがコードを組んで魔法を作っていました．この時，ニコが実装したコードを一時停止してじっくり見ました．今回はじっくり見たコードを読んで分かったことや考えられることなどを書きます．

 https://magilumiere-pr.com/

 # 8話に登場したコードの画像　

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964975/4016dc85-591f-bc97-ddff-fe1852004f23.png)

 　　　　　　　　　　　　図１　魔法を転送している最中


# 分かったこと
- コードを読み限りオブジェクト指向
- 魔法を生成する処理をfor文で5回繰り返している
- 赤色と黒色で何かを塗っている (多分魔法陣を描画している)
- コードの前半は魔法を生成する処理を行っている．そして，後半は生成した魔法を魔法陣として描画する処理を行っている


# 最後に
　株式会社マジルミエに登場したソースコードを分析してみました．分かったことは少数ですがニコが書いた全部のコードを読んでみたいです．今後の課題としてニコが書いたコードを実装してみる，図１以外にアニメの放送中に登場したコードの分析が挙げられます．

ここまで記事を読んでいただきありがとうございました！

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteもやっています．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!




# 参考文献
[1] "株式会社マジルミエ"
https://magilumiere-pr.com/