OmniAICreator/Qiita-1.07M huggingface dataset:
マルチプロジェクト構成のGradleプロジェクトで各サブプロジェクトのカバレッジを取得する

```groovy
plugins {
    id 'jacoco'
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'jacoco'

    repositories {
        mavenCentral()
    }

    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0'
    }

    test {
        useJUnitPlatform()
        finalizedBy jacocoTestReport
    }

    jacoco {
        toolVersion = "0.8.11"
    }

    jacocoTestReport {
        dependsOn test
        reports {
            html.required = true
            xml.required = true
            csv.required = false
            html.outputLocation = file("${rootProject.buildDir}/reports/jacoco/${project.name}")
            xml.outputLocation = file("${rootProject.buildDir}/reports/jacoco/${project.name}/report.xml")
        }
    }

    jacocoTestCoverageVerification {
        violationRules {
            rule {
                limit {
                    minimum = 0.8
                }
            }
        }
    }

    check.dependsOn jacocoTestCoverageVerification
}

```
実行
```bash
./gradlew test jacocoTestReport
```

サブプロジェクトをまたいで共通部品が使用されている場合
今回の場合はhoge,fugaがpiyoを呼び出している
```groovy
task jacocoMergeAll(type: JacocoMerge) {
    executionData fileTree(dir: '.', includes: [
        'hoge/build/jacoco/*.exec',
        'fuga/build/jacoco/*.exec'
    ])
    destinationFile = file("$buildDir/jacoco/merged.exec")
}

task jacocoPiyoAggregatedReport(type: JacocoReport, dependsOn: jacocoMergeAll) {
    executionData file("$buildDir/jacoco/merged.exec")

    classDirectories.from = fileTree(dir: "piyo/build/classes/java/main") {
        include '**/*.class'
    }

    sourceDirectories.from = files("piyo/src/main/java")

    reports {
        html.required = true
        xml.required = true
        html.outputLocation = file("$buildDir/reports/jacoco/piyo-aggregated")
        xml.outputLocation = file("$buildDir/reports/jacoco/piyo-aggregated/report.xml")
    }
}
```
実行
```bash
./gradlew :hoge:test :fuga:test
./gradlew jacocoPiyoAggregatedReport
```

※JacocoMergeをなぜか認識してくれなかったので...
```groovy
task jacocoPiyoAggregatedReport(type: JacocoReport) {
    dependsOn ':hoge:test', ':fuga:test'

    // ✅ Hoge・Fugaの .exec ファイルを複数読み込む
    executionData.from = files(
        fileTree(dir: 'hoge/build/jacoco', includes: ['*.exec']),
        fileTree(dir: 'fuga/build/jacoco', includes: ['*.exec'])
    ).filter { it.exists() && it.length() > 0 }

    // ✅ Piyo のクラスファイル
    classDirectories.from = files("piyo/build/classes/java/main")
    .asFileTree
    .matching {
        include '**/*.class'
    }


    // ✅ Piyo のソースファイル
    sourceDirectories.from = files("piyo/src/main/java")

    // ✅ 出力先をルート build 配下に集約
    reports {
        html.required = true
        xml.required = true
        html.outputLocation = file("$buildDir/reports/jacoco/piyo-aggregated")
        xml.outputLocation = file("$buildDir/reports/jacoco/piyo-aggregated/report.xml")
    }
}
```
Data Stream Fundamentals Superbadge Unit



https://trailhead.salesforce.com/content/learn/superbadges/superbadge-data-stream-fundamentals-sbu



# セールスデータストリームバンドルを接続する

販売データ ストリーム標準バンドルを設定します。

:::note alert
We can't find the Data Stream named ‘Account’.
:::


# カスタム数式を作成する

海外の連絡先用のカスタム数式フィールドを作成します。

:::note alert
We can't find the field ‘International Contact' associated with the proper Data Stream or it isn't configured properly.


適切なデータ ストリームに関連付けられたフィールド「国際連絡先」が見つからないか、正しく構成されていません。
:::


# データモデルオブジェクトに追加する

DMO に国際連絡先フィールドを追加します。


:::note alert
We can't find the field specified for International Contact on the Account Contact DMO or it isn't configured properly.


アカウント連絡先 DMO の国際連絡先に指定されたフィールドが見つからないか、正しく構成されていません。
:::
クリプトのマーケティング＆コミュニティ構築における10のルール: システムアプローチ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/ffd12f4d-48a2-4b60-9825-f8a39a5e967a.png)

:::note info
本記事はMonad Internが投稿した下記の翻訳となります。
[『10 rules for crypto marketing & community: a systems approach』](https://x.com/intern/status/1793353577328427501)
:::

---

今月、Sランクの暗号資産プロジェクトと10回以上ミーティングを行い、より強力なマーケティングとコミュニティのフライホイールを構築する方法について話しました。その中で出た提案の一部を、ここTwitterで公開します。

暗号資産マーケティング＆コミュニティのための10のルール：システム的アプローチ

## 1) 広告投稿はやめよう。

メインのTwitterアカウントが常に自社プロダクトの話ばかりしているなら、それは広告投稿です。人々は広告が嫌いです。YouTubeで特定の動画を見ようとしたとき、広告が出たらすぐにスキップしたくなりますよね。Crypto Twitterも同じです。広告ばかり投稿していれば、ブランドが好かれなかったり、エンゲージメントが低くても驚かないでください。

## 2) 競争相手は他のプロトコルではなく、インフルエンサーやエンタメコンテンツ。

多くの人がCrypto Twitter（CT）を開くとき、Cobieの投稿やETH ETFのミーム、その日のトレンドなど、楽しめるエンタメをチェックしています。あなたは、こうした人たちと同じ「注目の経済圏」で競争しているのであって、単に他のプロジェクトと競っているわけではありません。

## 3) マーケティング＆コミュニティ戦略はシステム的に考えるべき。

マーケティングやコミュニティは、個別の分断された領域としてではなく、さまざまなインプットとアウトプットがある複雑なシステムとして捉える方が正確です。Discord、Telegram、Twitterなどの間には相互作用があり、それぞれが影響し合っています。各領域を個別に最適化するよりも、全体の流れを良くする方がはるかに良い結果が出ます。コミュニティとマーケティングは密接に絡み合っています。分断してしまうと、どちらも効果が薄れます。両者が互いを強化できるようなシステムを作りましょう。

## 4) コミュニティにしっかり投資しよう。

コミュニティに十分な投資をしなければ、彼らもあなたのプロジェクトに投資してくれません。コミュニティメンバーの体験が悪ければ、他に楽しく活動できる暗号資産コミュニティはたくさんあります。自分自身が自分のコミュニティで過ごすのが楽しくないなら、他の誰も楽しめません。最高の体験を提供しましょう。

## 5) メインアカウントや創業者アカウントで、コミュニティの優れたコンテンツを投稿・交流しよう。

主な理由は2つあります。
1) コミュニティのコンテンツの方が自社チームのものより優れていることが多く、マーケティングはトップダウンのミームを作るよりも、優れたコミュニティコンテンツをキュレーションするプロセスになるから。
2) 高品質な貢献を評価していることがコミュニティに伝わるからです。コミュニティメンバーが何かを作り、それを大きな企業が「すごい！」と公に褒めてくれる機会はなかなかありません。多くのプロジェクトはこれをやりたがりません。コミュニティと積極的に交流しましょう。

## 6) 連想 ＞ 知識。

Red BullはInstagramにレッドブルの缶の写真を一枚も投稿していません。クールな人たちがRed Bullのロゴを身につけて素晴らしいことをしている写真ばかりです。ブランドを好きになってもらい、その結果として会社に良い影響が生まれます。もしInstagramがレッドブルの成分や他社との比較ばかりだったら、とっくに終わっていたでしょう。まずは素晴らしい連想を作り、興味を持った人が自分でプロダクトを学べるようにしましょう。

## 7) 他人の戦略をそのままコピペしない。

良いマーケティング＆コミュニティ戦略は、プロダクトの段階、業界、ターゲット層、現状の評判などをもとにゼロから構築されます。他のプロジェクトに合う戦略が、あなたのプロジェクトにもそのまま合うとは限りません。他のアプローチからインスピレーションを得るのは良いですが、自分たち独自のシステムを一から作ることを強くおすすめします。

## 8) 質 ＞ 量。

自動クエストは良い戦略ではありません。「フォロー、いいね、RT」で報酬を得るプラットフォームは、一見エンゲージメントを安く増やせるように見えますが、本当に関わってくれる人たちを薄めてしまい、7,200いいね、7,200RT、10,000ビューのような不自然な数字になります。数ヶ月、数年とコミュニティにいてくれる本物の人たちを、ボットのエンゲージメントと引き換えに失ってはいけません。持続可能なフライホイールは絶対に生まれません。

## 9) スケールしないことをやろう。

最初はコミュニティに関心を持ってくれる人が5〜20人いればラッキーです。彼らがコミュニティを強くするためにしてくれること全てに感謝と敬意を示しましょう。コミュニティが5万人に増えたらどうするかは心配しなくて大丈夫です。チームがこうした人たちと1対1で交流しなければ、そもそもそこまで成長しません。

## 10) コミュニティは「本物の生活を持つ本物の人間」で構成されている。

これをわざわざ書かないといけないのが信じられませんが、よくある話です。コミュニティは単なる数字や指標ではなく、あなたと同じ「生身の人間」です。彼らのためにシステムを作り、「ボット的な」交流は徹底的に排除しましょう。本物のメンバーの体験が損なわれるからです。コミュニティやプロジェクトを本気で大切に思ってくれる100人がいれば、他の99%の暗号資産プロジェクトより上です。メンバーを尊重しましょう。そうすれば、あなたも彼らから尊敬されます。

----

マーケティングとコミュニティは、システム的なアプローチで捉えた方が正確に理解できます。単なるTwitter運用ではなく、創造性とエンジニアリングの仕事です。とても重要なことなので、運任せにすべきではありません。もしこの投稿が100いいね未満なら、もう二度とこの話はしないかもしれませんが、反響があれば今後もこういった内容を投稿していきます。ありがとう。

:::note info
【ARM3rdとは】
ARM3rdはグローバルL1/L2の開発支援、App Chain企画、キラーアプリケーション創出に特化した、Web3・AIのプロフェッショナルファームです。ArweaveやSolanaはじめグローバルのTier 1プロトコル、および日本のエンタープライズとの卓越した協業実績を有しています。

- [Website](http://arm3rd.com/)
- [Founder Twitter](https://x.com/kyohei_nft/)
:::
AI絵師ってどんな技術を使っているの？

少し前に話題となったAI絵師。SNSやイラスト投稿サイトで「プロンプトで描いた」「LoRA作った」などの投稿を見かけた方も多いのではないでしょうか。

私自身、いまさらながら「実際にどうやって動いているのか気になった」＆「自分でも使ってみたかった」ことがきっかけで、この分野の技術を調べてみました。

本記事では、Stable Diffusionを中心にしたAI絵師の技術スタックをエンジニア目線でわかりやすく整理しています。「AIで絵を描いてみたいエンジニア」の方の参考になれば幸いです。
  

##  1. コア技術：拡散モデル（Diffusion Models）

まずベースになっているのが拡散モデル（Diffusion Models）です。これは画像をノイズから少しずつ再構築していく生成手法で、従来のGANより高解像度・安定性に優れています。

- **前処理（フォワードプロセス）**：画像にノイズを段階的に加える  
- **生成（リバースプロセス）**：ノイズから画像を少しずつ復元

##  2. テキストから画像生成：CLIP × 条件付き生成

AI絵師が「テキストから絵を描ける」のは、OpenAIが開発した**CLIP**の力が大きいです。

CLIPは、**テキストと画像を同じベクトル空間で扱える**ようにするモデルです。これにより、以下のようなプロンプトが可能になります。

```
"宇宙空間に浮かぶ猫" → 実際にそれっぽい画像が生成される
```


##  3. LoRA（Low-Rank Adaptation）による軽量カスタム

LoRAは、Stable Diffusionを**軽量に学習・カスタマイズ**するための手法で、特定の画風・キャラ・衣装などを少量の画像から学習させられます。

- 「〇〇風のイラストが好き」
- 「自分だけのキャラを描かせたい」

などを実現しやすくなります。


##  4. ControlNet：構図やポーズの制御も自由自在

**ControlNet**は、元画像のポーズ・輪郭線・深度マップなどを**ガイドとして使える**技術です。  
トレースや構図指定に非常に便利で、「このポーズで描いてほしい」が実現できます。

### 使用例
- ポーズを指定：OpenPose + ControlNet
- スケッチを清書：Canny抽出 + ControlNet



##  おわりに

AI絵師の裏側には、多数の高度な技術が組み合わさっていますが、近年では**ツールやライブラリの整備が進み、個人でも簡単に扱える**ようになっています。

気になった技術があれば、ぜひ論文やGitHubをチェックし、**自分だけのLoRAを作る or プロンプト職人デビュー**してみてください。



##  参考リンク

- [Stable Diffusion GitHub (CompVis)](https://github.com/CompVis/stable-diffusion)
- [AUTOMATIC1111 WebUI（ローカルで使えるGUI）](https://github.com/AUTOMATIC1111/stable-diffusion-webui)
- [HuggingFace diffusersライブラリ](https://github.com/huggingface/diffusers)
- [CLIP：言語と画像のマルチモーダル基盤モデル](https://trail.t.u-tokyo.ac.jp/ja/blog/22-12-02-clip/)
- [An Introduction to Diffusion Models and Stable Diffusion](https://blog.marvik.ai/2023/11/28/an-introduction-to-diffusion-models-and-stable-diffusion/)
- [What is LoRA (low-rank adaption)?](https://www.ibm.com/think/topics/lora)
- [ControlNet – Achieving Superior Image Generation Results](https://learnopencv.com/controlnet/)
【typescript】thisはstatic メソッド内だとクラスを指す

### 勘違いしてたこと

```ts
class Me {
  static firstName = "Atsushi";

  static work() {
    return `Hey! I'm ${this.firstName}`;
  }
}
```

> 「参照先がstaticなのに `this` を使ってるの、おかしくない？」  
> 「thisってインスタンスじゃないの？」  

と思うかもしれません。**でもこれは正しい書き方です。**

---

## 結論：staticメソッド内の`this`はクラス自身

公式な動作として、`static` メソッド内での `this` は **インスタンスではなくクラス自身を指します**。

つまり、次の2つはまったく同じ意味です。

```ts
return this.firstName;
return Me.firstName;
```

staticメソッドはインスタンスではなく自身のクラスに紐づくというわけです。

### 基本的にはthis使う

- クラス名を直書き（例：`Me.firstName`）すると、将来的にクラス名を変更したとき修正が面倒。
- `this.firstName` にしておけば、クラス名を変更しても内部で自動的に反映される。

## 📚 引用元
サバイバルTypeScript

https://typescriptbook.jp/reference/object-oriented/class/static-methods
【gazebo】jointを動的につけ外しする【ドッキング、バキュームグリッパー】

お疲れ様です。秋並です。

今回は、gazeboで使用できる
- 動的にjointをつけ外し可能になるプラグイン「AttachablePlugin」

を紹介します。

https://github.com/akinami3/AttachablePlugin

本プラグインを使用することで、下動画のように
- 移動ロボットによるシェルフへのドッキング
- バキュームグリッパーの模擬

などが実現できます。

![attachable_joint_mobile_robot_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/9e6cd37e-18f1-4dfc-808d-b6355ead843e.gif)

![attachable_joint_arm_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/e0c46e82-26ed-4ad8-8835-3689150e5dfd.gif)

::: note
本プラグインは、Dagu12氏が作成したgazebo用pluginを「gazebo harmonic用に修正」「デモ用プログラムを追加」したものになります。

https://github.com/Dagu12s/AttachablePlugin
:::

# 目次
- [動作環境](#動作環境)
- [インストール](#インストール)
- [デモ](#デモ)
  - [移動ロボットへのシェルフのドッキング](#移動ロボットへのシェルフのドッキング)
  - [バキュームグリッパーの模擬](#バキュームグリッパーの模擬)

# 動作環境

本プラグインは以下の環境で動作確認しています。

- Ubuntu 24.04
- ROS 2 Jazzy
- gazebo harmonic

# インストール

最初に、本リポジトリをROS2のワークスペースにクローンします（ROS2のワークスペースは作成済みの前提とし、ここでは~/ros2_wsとします）。
```bash
cd ~/ros2_ws/src
```
```bash
git clone https://github.com/akinami3/AttachablePlugin.git
```

<br>

ワークスペースをビルドし、ソースをとおします。

```bash
cd ~/ros2_ws
```
```bash
colcon build --symlink-install
```
```bash
source ~/ros2_ws/install/setup.bash
```


# デモ

ここからは、本プラグインを使用したデモの実行手順を記載します。

## 移動ロボットへのシェルフのドッキング

ここでは、下動画のような搬送ロボットとシェルフをアタッチするシミュレーションを実行します。

![attachable_joint_mobile_robot_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/9e6cd37e-18f1-4dfc-808d-b6355ead843e.gif)

<br>

搬送ロボットへのシェルフのドッキングのサンプルを実行します。

```bash
ros2 launch attachable_plugin_demos mobile_robot_demo.launch.py
```
gazeboが起動したら、最初に搬送ロボットをteleopで動かしてみてください。この時点では、アタッチされておらず搬送ロボットは独立して動くはずです。

<br>

搬送ロボットをシェルフの真下付近に移動させたら、アタッチするためのトピックを発行します。

```bash
gz topic -t /attach -m gz.msgs.StringMsg   -p 'data:"[mobile_robot_model][base_link][shelf][poll1][attach]"'
```

トピックが発行されると、搬送ロボットとシェルフがアタッチされます。アタッチされた状態で、搬送ロボットを動かすと、シェルフも一緒に動きます。

:::note warn 
今回は、キャスターのついていないシェルフを使用しているため、シェルフをつけた状態だと移動ロボットの動作が少し不安定になります。実際は、「アタッチする直前にシェルフを少し浮かせる」 「キャスターのついたシェルフを使用する」などの工夫が必要です。）
:::

## バキュームグリッパーの模擬

ここでは、下動画のようにバキュームグリッパーを模擬するようなシミュレーションを実行します。

![attachable_joint_arm_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/e0c46e82-26ed-4ad8-8835-3689150e5dfd.gif)

<br>

バキュームグリッパーのサンプルを実行します。

```bash
ros2 launch attachable_plugin_demos arm_robot_demo.launch.py
```

<br>

次に、以下のノードを起動します。

```bash
ros2 run attachable_plugin_demos attach_contact_link 
```

こちらは、「"接触センサが設定されたリンク"にオブジェクトが接触したら、アタッチする」というノードになります。


::: note
gazeboの接触センサは「接触したオブジェクトのモデル名/リンク名」を取得できるため、それを利用しています。
:::

<br>

次に、アームの各関節をキーボードで制御するノードを起動します。

```bash
ros2 run attachable_plugin_demos arm_joint_teleop
```

ノードを起動したら、アームの先端のリンクをボックスに近づけてください。

接触センサが反応すると、アームの先端のリンクとボックスがアタッチされます。

アタッチされた状態で、アームを動かすと、ボックスも一緒に動くことが確認できます。


<br>

最後に、デタッチするためのトピックを発行すると、アームの先端のリンクとボックスがデタッチされます

```bash
ros2 topic pub /detach std_msgs/Empty "{}"
```

# さいごに

今回は、「jointを動的につけ外し可能になるプラグイン」を紹介しました。

本記事が、お役に立つことがあれば幸いです。
画像解析で予測精度を上げる方法まとめ

## 汎化性能とは
汎化性能とは未知のデータに対する予測性能のこと。
モデル構築では訓練データだけでなく、未知のデータに対する予測精度が重要だ。
モデルが訓練データに過剰に適合してしまうと、かえって未知のデータに対する予測精度が落ちてしまうことがある。いわゆる**過学習**だ。

本記事では、画像解析において
予測精度および汎化性能を上げる一般的な方法を以下にまとめる。

## ①データ分割
最もスタンダードな方法がまず「データの分割」することだ。
元データを**学習用**と**評価用**を２つのデータセットに分けて、評価用データを擬似的に未知のデータとする手法だ。
モデル作成用にはこの学習データだけ用いて、評価用データは精度を評価するためだけに利用する。
一般的には学習用データが7〜8割で、評価用データが2〜3割程度。

## ②データ拡張
そもそも元データのバリエーションが少ない場合は、データ拡張（Data Augmentation）が有効的だ。
データ拡張とは例えば、元の画像を回転、反転、リサイズ、変形、切り取りすることでデータのパターンを増やすといった手法だ。
**様々なパターンの画像**を利用して学習することで、モデルの精度向上が見込める。

## ③誤差と評価指標の算出
精度を示す指標として**損失関数**(誤差関数)を用いて、モデルが出力した結果と実際の答えの誤差を測る。
未知のデータに対するモデルの誤差（損失関数を利用して算出される値）を小さくしていくことが、今回のメイントピックと言える。

また誤差が小さくても、正解率が悪ければ精度の高いモデルとは言えない。
モデルの予測精度を確認するときは、誤差の大きさと、**評価関数**を用いて正解率なども一緒に確認することが重要である。

なおそれぞれ算出した誤差の大きや評価の値を縦軸に、繰り返した回数を横軸とった曲線を学習曲線と言い、精度の可視化において最も一般的な方法だ。

【代表的な損失関数】
* 回帰　　：MSE（二乗誤差）
* ２値分類：Binary Cross Entropy
* ３値以上の分類：Categorical Cross Entropy

【代表的な評価関数】
* 正解率：Accuracy
* 適合率：Precision
* 再現率：Recall
* F値


## ④活性化関数の選択
ニューラルネットワークでは複数のニューロンから、あるニューロンへの入力は全結合などの線形変換処理によって1つの数値にまとめられる。
活性化関数(Activation function)は、その値(あるニューロンにおける入力の合計)から次のニューロンへ値を出力する時に「どのような値にするか」を決定する関数で、非線形な関数とすることが多い。

![スクリーンショット 2025-05-01 14.50.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397581/210e3435-b593-4d6b-b449-cc2a2509eac0.png)

作成するモデルにおいて、**どの活性化関数を選ぶか**は、学習の効率化やタスクに適した出力を得るために非常に重要である。

【代表的な活性化間数】
* ステップ関数
* シグモイド関数
* ReLU関数
* ソフトマックス関数

## ⑤層の追加
ニューラルネットワークのうち、中間層が２つ以上のものをディープラーニング(深層学習)と呼ぶ。
そして一般的に層を深くすることでより表現力の高いモデルが作れると言われてる。

CNNの層を追加する時は、畳み込み層とプーリング層を順に追加する。

## ⑥オプティマイザーの選択
オプティマイザー(最適化アルゴリズム)は、モデルの収束具合を最適化させるための関数で、様々な種類がある。

代表的な**勾配降下法**というオプティマイザーは、目的となる関数を最小化(最大化)するパラメータを探索する手法である。しかし欠点として、試行を繰り返して最適値を探索するため、パラメータが多いと計算に時間がかかってしまう。

【勾配降下法の式】
`更新後の値　＝ 更新前の値 - 学習率(0~1の値) × 勾配の値`

【代表的なオプティマイザー】
* 最急降下法(GD)：全ての学習データを取り出す
* 確率的勾配降下法(SGD)：無作為に1つの学習データを取り出す
* ミニバッチ確率的勾配降下法：無作為に複数の学習データの束毎に取り出す
* Momentum
* AdaGrab
* Adam

## ⑦学習率の調整 
モデルにおいて、**学習率はモデルの収束に大きく関係**する。
学習率とは各パラメータを変更させる幅のことで、ハイパーパラメータとも呼ばれる。
学習率は手動で設定する必要があり、この学習率を調整することがモデルチューニングでは重要となる。

学習率を高くしすぎると収束しなくなり、学習率を低くしすぎると収束までに膨大な時間がかかってしまうため、適切な値を探す必要がある。
github youtube

【GitHub入門】初心者向け！GitHubでチーム開発するための基本操作を解説！
https://www.youtube.com/watch?v=Dz95iUNt-fg&t=5s

>0:00 今日のテーマ「GitHub」
0:26 ①GitHubとは？
3:21 ②準備
6:59 ③リモートリポジトリとは？
9:02 ④ローカルファイルをGitHubへ
16:34 ⑤GitHub上のファイルをローカルへ
19:22 ⑥ブランチ運用
22:24 ⑦featureで開発
26:28 ⑧mainにマージ(コンフリクトなし)
35:37 ⑨mainにマージ(コンフリクトあり)
38:13 エンディング

【わかりやすい！Git操作】初心者向けのGitの基本 〜 30分で入門！
https://www.youtube.com/watch?v=6SLMB7BPG9E


【基本知識】GitHubとは？できることや基礎用語を解説！
https://www.youtube.com/watch?v=yzNPC_QzgFM


GitHubの使い方を解説！ファイルの作成方法、ブランチの使い方が分かる！
https://www.youtube.com/watch?v=2mehreEA7yc

【初心者向け】Git と GitHub について解説します：環境構築、MATLABでGit機能を使う方法
https://www.youtube.com/watch?v=ahce6Hbim20

GitHub Actions チュートリアル - 基本概念と Docker を使用した CI/CD パイプライン
https://www.youtube.com/watch?v=R8_veQiYBjI

# Ref.


github memo
https://qiita.com/kaizen_nagoya/items/3eff7691205b1d7c8d50

github 入り口
https://qiita.com/kaizen_nagoya/items/a5d8dc24acb1ba43f7b6
Copilot × ChatGPT × Claude 3.5 Sonnetで「カレンダー給与管理アプリ」を4時間で開発した話

# ⏱️ Copilot × ChatGPT × Claude 3.5 Sonnetで「カレンダー給与管理アプリ」を4時間で開発した話

## 🧪 技術スタック・開発環境
| 項目              | 内容                                      |
|-------------------|-------------------------------------------|
| フレームワーク     | Next.js（App Router）                  |
| スタイリング       | Tailwind CSS                              |
| データベース       | Supabase（PostgreSQL）                    |
| AIツール           | ChatGPT（GPT-4）＋ Claude 3.5 Sonnet      |
| UIホスティング    | Vercel                                    |
| 使用コマンド     | `npx create-next-app@latest`              |

---

## 🎯 アプリの目的

**TimeTree風の直感的なUI**を採用しながら、  
**アルバイトやシフト勤務者が「働いた時間×時給」から給与の概算を計算できる**というシンプルかつ実用的なWebアプリの開発を試みました。
URL: https://shift-app-mu.vercel.app


- シフトをカレンダーに登録
- 自動的に月ごとの給与を計算
- UIはTimeTreeのように使いやすく、視覚的にもスッキリ

---

## 🛠️ 開発フロー（所要時間：約4時間）

### ① ChatGPTに仕様書を作ってもらう（30分）

まず、UIの方向性を「TimeTreeのようにしたい」と伝えた上で、  
ChatGPTに以下を一括生成してもらいました：

- 画面遷移図
- ER図
- 各コンポーネントごとのUI仕様書
- Header、Sidebarなどの構造定義

このフェーズで「人間が考える工数を爆速で圧縮」できました。

---

### ② Claude 3.5 Sonnetに開発を丸投げ → エラー地獄（1.5時間）

ChatGPTで作成した仕様書をもとに、Claudeでコード生成を開始。  
ところが、次のような問題が頻発：

| 問題点                     | 内容 |
|----------------------------|------|
| Tailwind CSS未読み込み     | PostCSSやtailwind.config.jsがなく、UIが崩壊 |
| package.jsonバージョン不整合 | `"next"`や依存ライブラリの整合が取れず起動不可 |

**対応策：**  
`npx create-next-app@latest` を自分で実行し、その上でClaudeに「この中に追記して」と依頼することで安定起動できました。

---

### ③ `useEffect` 無限ループ問題（30分）

Claudeが生成したAPI呼び出しコードでは `useEffect` の依存配列が未設定。  
→ 無限にSupabaseへアクセスが走ってサーバーが大変なことに…。

**対応：**

useEffect(() => {
  fetchData();
}, []); // 依存配列を空にすることで一度だけ実行


---

### ④ SupabaseのSQLトラブル（30分）

Supabaseにおけるテーブル作成もClaudeに任せましたが、  
**意図しない不要テーブル**（例：`company_roles` など）を自動生成し、外部キー制約のエラーが発生しました。

**対応：**
- 作成したいテーブルを **1つずつ明示的に指示** してSQLクエリを生成
- **ChatGPTに生成してもらったER図**と照らし合わせながら、構造を修正・統一

---

### ⑤ UI/UXの改善は「画像提示が必須」（1時間）

Claudeに「もっとTimeTree風にして」とテキストだけで依頼しても、  
**UI/UXの改善が一切反映されない**という事態が発生。

**対応：**
- TimeTreeのUIのスクリーンショットを提供
- 「どのようなカレンダー構成か」「何が見やすいか」などをChatGPTに明確に説明
- 画像ベースでコンポーネントの構造や色設計を伝えると、やっと意図通りのUIが実装可能に

---

### ⑥ Vercelデプロイ時のTypeScriptエラー対応（30分）

Vercelへのデプロイでは `any` 型や未定義の値による型エラーが頻発。  
一部のpropsが型定義されておらず、LintやTSエラーでデプロイ失敗。

**対応：**
- propsや関数の戻り値にしっかりと型アノテーションを追加
- ESLintとPrettierを併用して全体のコードフォーマットと安全性を確保

---

## ✨ 感想とTipsまとめ

- **AIに「丸投げ」は無理**。構成や初期セットアップまでは良くても、微修正は人間が必要。
- **AIにはプロンプト＋図解＋明示的指示が必須**。抽象的な「もっといい感じに」は無意味。
- **実務レベルでのAI活用には「先導役」が不可欠**。仕様書を固めたうえで「任せる範囲」を限定すること。

---

## 🔚 最後に

AIをフル活用すれば、**たった4時間で給与管理アプリが完成**できました。  
ただし、「丸投げ」ではなく「ハンドルを握る」意識が重要でした。
このあとは、レスポンシブ対応やloading処理を追加していきます
【備忘録】SQL SELECT文の句ごとの評価順

## 背景
*  業務で現行の機能内のSELECT文の改修を任せていただいた際、先輩から教えていただいた知識を備忘録として残そうと思う

## SQLの"句ごとの評価順"とは
*  例えば以下のクエリがあったとする
`SELECT * FROM t_sample WHERE sample_id=4946;`

このとき評価順=文章内のどこからコンピュータが読むのか　は

このクエリはSELECT, FROM, WHERE の３つの句で構成される

句ごとの評価順は FROM➡WHERE➡SELECT になる

## SQLの句ごとの評価順まとめ

| 順位 | 句 | 役割 |
|:-----------|------------:|:------------:|
| 1 | FROM | テーブルの決定,結合処理|
| 2 | ON | テーブルの結合条件の指定|
| 3 | JOIN | テーブルの結合処理|
| 4 | WHERE | 条件によるデータの絞り込み |
| 5 | GROUP BY | データのグループ化 |
| 6 | WITH CUBE, WITH ROLLUP | リレーショナルデータベースの操作 |
| ７ | HAVING | 集積結果の絞り込み |
| ８ | SELECT | 必要なカラムの選択 |
| ９ | DISTINCT | 必要なカラムの重複を除外 |
| １０ | ORDER BY | 並び替え |
| １１ | LIMIT, TOP | 取得行数の制限 |

### 参考
https://learn.microsoft.com/ja-jp/sql/t-sql/queries/select-transact-sql?view=sql-server-ver16

## 終わりに
あくまで私の腹落ちさせた方法として、クエリを日本語で書き直してみるとわかりやすかったのでこれも備忘として残す
日本語で解釈すると、以下のように解釈できるはずだ
`t_sample から sample_id=4946 のレコード全部を取得する`

日本語で読むと必ずしも前から並んでいる順に評価されているわけではないのがわかるだろう（**必ずしも日本語に直してたものと等しくはならないので注意**）

またデータベースによって同時に使えない場合もあるそうなので、その辺りも調べたらまとめようと思う
AWS VDM（Virtual Deliverability Manager）を導入して感じたメリットとその背景


## はじめに

私が関わっているプロジェクトで今回はメール送信に [Amazon SES（Simple Email Service）](https://aws.amazon.com/jp/ses/) を利用していました。

しかし、API経由で送信する場合、**「送信リクエストを受け付けた」ログしか残らず、実際にメールが送られたかどうか、バウンスしたかどうかの追跡が困難**という課題がありました。

運用中、「このメールって本当に送信されたんですか？」と取引先から確認されることが増えてきました。そのたびに CloudWatch Logs を確認し、「エラーは出ていないので、おそらく送れていると思います……」と曖昧な返答をするしかありませんでした。

この状況を改善するために導入したのが、**AWS VDM(Virtual Deliverability Manager)** です。

## VDM(Virtual Deliverability Manager)とは？

**Virtual Deliverability Manager**は、Amazon SESのメール送信に関する詳細な可視化・分析を提供してくれるサービスです。

VDMでは以下のような情報が取得できます：

- 開封（Open）やクリック（Click）のイベント
- バウンスや苦情（Complaint）のトラッキング
- ドメインごとの到達率や反応
- 配信レポートの生成（Dashboard）

これにより、**SESで送信したメールが実際に届いているのかどうかを証明できるようになりました。**

## 実際に導入して良かったこと

### 1. 「本当に送信されたのか？」という問いに即答できるようになった

以前は「送信APIを叩いたログしか残っていない」状態でしたが、VDM導入後は **CloudWatch LogsやEventBridge経由で「配信済み」「バウンス済み」といった詳細情報をトレース可能**になりました。

### 2. 配信状況のダッシュボードを使ってレポーティングが可能に

VDMでは、**CloudWatchまたはSESコンソールにメール配信状況のダッシュボード**が用意されています。

これにより、「1時間以内にどれくらい配信成功しているか」「どのドメインにバウンスが多いか」などの視点で分析・報告ができます。

## 料金について
詳細な料金については、以下の公式ページをご参照ください。
https://aws.amazon.com/jp/ses/pricing/

## まとめ

VDMを導入したことで、以下のような運用上の改善が実現できました

- 「メールは送信されたのか？」という問いに証拠付きで答えられる
- 問題が起きたときのトラブルシュートが楽になる
- ダッシュボードで配信状況をリアルタイム把握できる

メール送信を業務の中で重要視している場合、**SES + VDM構成はかなり心強い武器**になります。導入自体も数ステップで完了するため、まだ導入していない場合は検討してみる価値があると感じました
PythonプログラムをWindows上でショートカットから起動する(最も?)簡単な方法

## 経緯
PDFからコピーした文章の改行を（**1回の動作で**）消したい！と思い調べたところ以下の記事にたどり着きました。

[【Python】クリップボード内の改行を削除するプログラムを作る+windowsでショートカットに登録する](https://qiita.com/NNNiNiNNN/items/2a5104ca0a35e9fc29cc)

この記事では最終的にPythonプログラムをexe化してショートカットに登録していますが，exe化が面倒 & exeファイルから実行すると起動が遅いため，他の方法を探しました。その結果見つけた記事がこちら

[Pythonプログラム用のショートカットをつくる（Windows10）](https://qiita.com/odanny/items/4e3a320b70df5136c622)
[Python プログラムをデスクトップ上で実行する方法](https://qiita.com/Caffeine890/items/fff212af9fd71d1ef9c8)

1つ目の記事ではバッチファイルを作成する（+VBScriptで起動してコンソールを隠す）方法が，2つ目の記事では上記方法に加えて，Pythonプログラムのショートカットから直接実行する方法が紹介されています。
ただし，私の環境ではどちらもコンソールが一瞬表れてしまいました。

そこで別の方法を探したところ，より簡単な方法があったので紹介します。

## 方法
1. Pythonプログラムを，**.pyw**形式で保存する。
2. pyw形式のプログラムファイルのショートカットを作成する。
3. ダブルクリック or ショートカットキーを登録して実行。

#### 以上

## 補足説明
詳しくは[ここ](https://docs.fileformat.com/programming/pyw/)に書かれていますが，拡張子を.pywにすることで，python.exeではなくpythonw.exeから起動するようになるようです。PythonwはPythonアプリケーションのGUI表示のためのスクリプトで，起動時にコンソールを表示しないとのことです．
Google Colab の領収書をダウンロードする方法


Google Colab の利用に対する **領収書（請求書）** を取得を、以下の手順で行った。



## 🔗 アクセス先

以下のURLにアクセス：

👉 [https://payments.google.com/gp/w/home/activity](https://payments.google.com/gp/w/home/activity)

---

## 📸 該当ページのスクリーンショット

![GooglePayments.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/2b0b98fc-258b-43db-aeb6-ac7f9e0bf6e2.jpeg)


---

## 📄 領収書のダウンロード方法

各取引の詳細ページにある「**請求書をダウンロード**」ボタンから領収書をPDFでダウンロード。

---

## ⚠️ エラーが出る場合

`Provide Full address in Settings to generate the document`  
というエラーメッセージと共に **ボタンがグレーアウトしてダウンロードできない** 場合があった。


![ErrorCrop.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/a7211e05-708c-4f84-84ee-478d4b3ca3d0.jpeg)


### 対処方法

1. 「設定」タブ → 「お支払いプロファイル」を開く  
2. **住所情報（Full address）を正確に入力**


**設定後すぐには反映されなかった**

---

## 🕒 実際に反映されたタイミング

住所を設定して **数日後**、グレーアウトが解除され、領収書がダウンロード可能となった。

---

## 💬 それでも解決しない場合

- 設定後しばらく経ってもダウンロードできなかったため、右上の「**ヘルプ**」から問い合わせを行ったが、「この窓口では対応していない」と案内された。
- 結果として、**`colab-help@google.com` に連絡するように案内された。**

---

## ✅ 結論

- 住所設定は必須。
- 設定してから反映まで **時間がかかる** 可能性あり。
- それでも反映されない場合は `colab-help@google.com` へ連絡してみるのも一つの手段。
github memo

# kaizen-nagoya

https://github.com/kaizen-nagoya/
https://github.com/kaizen-nagoya/TheCPuzzleBook
https://github.com/kaizen-nagoya/GifuUniversityC
https://github.com/kaizen-nagoya/KihonJoho
https://github.com/kaizen-nagoya/xtuml
https://github.com/kaizen-nagoya/Safety_Analysis_self_driving_car
https://github.com/kaizen-nagoya/Open_Source_is_Agile
https://github.com/kaizen-nagoya/waka
https://github.com/kaizen-nagoya/SaveTheResearchmap
https://github.com/kaizen-nagoya/probability_and_statistics
https://github.com/kaizen-nagoya/autonomous_and_adaptive_system
https://github.com/kaizen-nagoya/ChokenekoWriteDoctorialThesis
https://github.com/kaizen-nagoya/doctoralthesispracticecenter-
https://github.com/kaizen-nagoya/AndroidOpenTextbook
https://github.com/kaizen-nagoya/Effective-Modern-Cpp
https://github.com/kaizen-nagoya/deeplearning
https://github.com/kaizen-nagoya/Management_with_Process_Assessment
https://github.com/kaizen-nagoya/anzen
https://github.com/kaizen-nagoya/ProgrammingTraining
https://github.com/kaizen-nagoya/cpp-compile-test
https://github.com/kaizen-nagoya/py100pon
https://github.com/kaizen-nagoya/p100pon
https://github.com/kaizen-nagoya/way_to_quantum_computer
https://github.com/kaizen-nagoya/English_Japanese
https://github.com/kaizen-nagoya/system_engineering_tools
https://github.com/kaizen-nagoya/EtherCAT
https://github.com/kaizen-nagoya/arm
https://github.com/kaizen-nagoya/ProfessionalEngineer
https://github.com/kaizen-nagoya/svntogit
https://github.com/kaizen-nagoya/maxima
https://github.com/kaizen-nagoya/spin
https://github.com/kaizen-nagoya/posix
https://github.com/kaizen-nagoya/openjij_users
https://github.com/kaizen-nagoya/C-N2385
https://github.com/kaizen-nagoya/CPPN4830
https://github.com/kaizen-nagoya/hello-world
https://github.com/kaizen-nagoya/arxiv_tools
https://github.com/kaizen-nagoya/docker-toppers-fmp-rpi64
https://github.com/kaizen-nagoya/ssp-rapsberry-pi-shurink-subset
https://github.com/kaizen-nagoya/XSTAMPP

# Ref.
github youtube
https://qiita.com/kaizen_nagoya/items/019bd8541453d3362fdd

github memo
https://qiita.com/kaizen_nagoya/items/3eff7691205b1d7c8d50

github 入り口
https://qiita.com/kaizen_nagoya/items/a5d8dc24acb1ba43f7b6
Authバリデーションエラーメッセージの日本語化

# やりたいこと
Authバリデーションエラーメッセージの日本語化を毎回作るのは面倒なので、
コピペできるテンプレートを作りたい。


# 前提条件
通常のバリデーションエラーなどは済んでいて、auth の日本語化されていない箇所等を修正していく。

# ✅ ログイン画面
ログイン画面は、
🔵 エラーメッセージの位置修正
を実装していく。

## 🔵 エラーメッセージの位置修正
 Email Address の x-input-error 文を一番上にする。
 
 これがメールアドレスとパスワードが正しくない時に、
 「ログイン情報が登録されていません。」と表示してくれる。
```/views/auth/login.blade.php
<!-- Email Address -->
// 修正前
<div>
    <x-input-label for="email" :value="__('auth.email')" />
    <x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus autocomplete="username" />
    <x-input-error :messages="$errors->get('email')" class="mb-2" />
</div>

// 修正後
<div>
    <x-input-error :messages="$errors->get('email')" />
    <x-input-label for="email" :value="__('auth.email')" class="mt-2" />
    <x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus autocomplete="username" />
</div>
```

## ゴール
![スクリーンショット 2025-04-30 0.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/9345e823-f5ab-4084-a13b-da8dbb39be21.png)



# ✅ 新規登録画面
新規登録画面は、
🔵 emailのバリデーションエラーメッセージの日本語化
🔵 パスワードのバリデーションエラーメッセージの修正
を実装していく。


## 🔵 emailのバリデーションエラーメッセージの日本語化
### ① validation.php に追記
```/lang/ja/validation.php
    'attributes' => [
      // 新規登録
      'email' => 'メールアドレス',
    ],
```


## 🔵 パスワードのバリデーションエラーメッセージの修正
以下を行う。

https://qiita.com/honaki/items/369953f2be6085387c86


## ゴール
![スクリーンショット 2025-04-30 16.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/a4ed43fd-0b25-4f35-89fa-03b9d1f32da7.png)



# ✅ パスワード再設定画面
パスワード再設定画面は、
🔵 パスワードのバリデーションエラーメッセージの修正
を実装していく。


## 🔵 パスワードのバリデーションエラーメッセージの修正
以下を行う。

https://qiita.com/honaki/items/0696fe34fc8883a279f7#-%E6%89%8B%E9%A0%86%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E5%86%8D%E8%A8%AD%E5%AE%9A%E7%94%BB%E9%9D%A2


## ゴール
![スクリーンショット 2025-04-30 16.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/afc75cb9-79fc-4e9a-97fa-df07b8df32ed.png)
チーム開発における言葉の解釈のずれをなくそう

## はじめに

チーム開発をしていると、こんなことってありませんか？
「あれ？その機能って、どういう動き想定してたっけ？」
「言われた通り作ったのに、レビューで“意図と違う”って言われた…」

コードの書き方や設計手法をどれだけ学んでも、
言葉の解釈のズレがあると、最終的なアウトプットに違いが出てしまいます。

このズレを埋めるためにどうしたらいいか調べたところユビキタス言語に辿り着きました。


この記事では、

- なぜ「言葉の解釈のズレ」が問題になるのか  
- ユビキタス言語として使う言葉を定義することによってどのようなメリットをもたらすのか

を紹介していきます


## 言葉の曖昧さが引き起こすすれ違い

たとえば、以下のような仕様があったとします。

**「イベントが発生したら、ユーザーに通知を送ってください」**

一見、シンプルな要件に思えます。
しかし、いざ設計に落とし込もうとすると、次のような疑問が浮かびます。
- 通知手段は何か？（メール？プッシュ通知？LINE？）
- 対象ユーザーは？（全員？条件に合う一部だけ？）
- 通知のタイミングは？（即時？毎回？1日1回？）


こうした定義を曖昧にしたまま進めると、
- 実装者ごとに異なる解釈で作業してしまう（手戻りが発生する）
- レビュー時に「そもそもこの言葉ってどういう意味？」と仕様に立ち返る羽目になる
- ドキュメントとコードと会話の内容がそれぞれ微妙に違って混乱する


このようなズレを防ぐために活用できるのが「ユビキタス言語」です

## ユビキタス言語とは？

ユビキタス言語（Ubiquitous Language）は、  
ドメイン駆動設計（DDD）における概念のひとつで
開発者やドメインエキスパートを含むチーム全体で共有された言語を指します。


簡単に言えば、

> **「チーム内で共通の言葉を使い、共通の意味で理解すること」**

です。

ユビキタス言語を定義することによって、次のようなメリットがあります：

- **認識のズレを減らせる**  
  曖昧な言葉に対して明確な定義を与えることで、  
  認識のずれによる手戻りなどを防ぐことができます。

- **非エンジニアとの会話もスムーズになる**  
  開発者でない方と話すときも、共通の前提で会話ができるようになります。

- **レビューや引き継ぎがしやすくなる**  
  言葉の意味をチームで定義しておくことで、属人化を防ぎやすくなります。

  

## 「通知」を共通言語として定義してみる（例）



「通知する」という言葉は曖昧で解釈に幅があります。そこで、具体的な種類ごとに名前と意味を定義してみます。


#### 全体通知
すべてのユーザーに一斉に送られる通知。  
例：システムメンテナンスのお知らせや、障害発生の告知など。


#### 条件付き通知
特定の条件（例：操作完了、イベント発生など）を満たしたユーザーのみに送る通知。  
例：予約が確定したときに送られる通知など。


#### 1日1回通知
同じ内容の通知は1日1回までしか送られないように制御された通知。  
例：リマインダーや「未対応のお知らせ」など、繰り返しが煩わしい通知。


####  設定可能通知
ユーザー自身が「受け取る・受け取らない」を設定できる通知。  
例：キャンペーン情報やアンケート依頼など、任意での受信が想定される通知。



このように、通知を種類ごとに具体的な名前と定義を与えることで、
設計や命名、関係者との会話でのズレを防ぐことができます。


## 非エンジニアとのコミュニケーションでも役立つ

共通言語の価値は、エンジニア同士の会話だけにとどまりません。
むしろ、非エンジニアとの連携にこそ効果を発揮します。

たとえば
	•「通知をユーザーに飛ばしたい」と依頼されたとき、
　→ 「それは全体通知でしょうか？それとも条件付き通知でしょうか？」と、正確な意図を確認できます


共通言語を定義しておけば、認識の食い違いによる手戻りや仕様漏れを防ぐことができます。

## まとめ
「通知する」といったシンプルな言葉でも、  
チームメンバーや関係者の間で解釈が異なることは多々あります。

そしてそのズレは、実装のミスやレビューでの手戻り、  
さらには「言った・言わない」の認識違いへとつながってしまいます。

こうした事態を防ぐために有効なのが、  
チーム全体で同じ意味で言葉を使うというユビキタス言語の考え方です。

ユビキタス言語を取り入れることで、

- 認識のずれを減らせる
- レビューや引き継ぎがしやすくなる 
- 非エンジニアとの会話もスムーズになる

といった効果が得られます。
音楽生成AIとは？日本語曲におすすめのAI作曲サービスと私の活用法【中年作曲好きの体験談】

こんにちは。趣味で長年作曲をしている50代の会社員です。  
今回は、最近話題の「音楽生成AI」について、私なりの理解と実際に使ってみた感想を書いてみたいと思います。

AIの進化で音楽制作も大きく変わってきていて、  
「ちょっとやってみたいな」と思っている方の参考になれば幸いです。

## 音楽生成AIとは？ざっくり解説
「**音楽生成AI**」とは、人工知能を使って**自動的に曲を作ってくれる技術**のことです。

昔は打ち込みや音楽理論がわからないと曲なんて作れませんでしたが、  
今はジャンルや雰囲気を選ぶだけでAIが自動生成してくれます。

- BGM  
- メロディ  
- コード進行  
- （場合によっては）歌詞やボーカルまで  

これらをAIが作ってくれるのは、本当に驚きですね。

## 音楽生成AIの発展を実感した話
5年ほど前、初めてAI作曲ツールを触ったときは  
> 「これはちょっと遊び道具だな」  
と思っていました。

音のつながりも不自然でしたし、使えるレベルじゃなかったんです。
でも、**今は違います。**

たとえば最近の [SOUNDRAW](https://soundraw.io/) や [TopMediai](https://jp.topmediai.com/ai-music-generator/) なんかは、びっくりするほど**自然な仕上がり**。  
特にBGM用途では、そのまま**動画やラジオに使えるクオリティ**ですし、  
**歌もののデモ作り**にも活用できます。

## 日本語曲におすすめの音楽生成AIツール【使ってみた感想付き】
私が実際に触ってみて、「これは**日本語曲**でも使えるな」と思ったサービスを紹介します。

| サイト・アプリ名 | 主な特徴 | 無料プラン | 日本語UI | 商用利用 | その他機能 |
|------------------|-----------------------------|-------------|------------|--------------|------------------------------|
| [TopMediai](https://jp.topmediai.com/ai-music-generator/) | 歌詞、説明、画像からAIが自動作曲可能、インスト作曲モードあり | △(制限あり) | 〇 | 〇 | AI歌詞生成、AIカバー、楽譜出力・MIDIエクスポート |
| [Suno.ai](https://suno.ai/) | 歌詞からメロディを自動生成、シンプルな操作性 | △(制限あり) | × | △(有料プラン要) | AIリミックス機能あり |
| [CREEVO](https://creevo-music.com/) | シンプルな歌詞を入力して30秒以下の曲を生成可能 | 〇(完全無料) | 〇 | 〇 | 日本語ボーカルの生成に強み |
| [SOUNDRAW](https://soundraw.io/) | ムードとジャンルを選択して楽曲生成、歌詞後付けも可 | △(試用可) | △(一部あり) | △(有料プラン要) | AIが楽曲の長さや構成を調整可能 |
| [AIVA](https://www.aiva.ai/) | クラシックやオーケストラ系の作曲に強み | △(試用可) | × | △(有料プラン要) | 楽譜出力・MIDIエクスポート対応 |

特に `TopMediai AI音楽生成` は、

- 4分以上の長尺楽曲や、複雑な編曲に対応
- 声質のバリエーションも豊富  
- ロック、ジャズ、エレクトロニカ、クラシックなど幅広いジャンルに対応  
- 作成した楽曲を楽譜やMIDI形式でエクスポートできる
-  AI作曲だけではなく、[AI作詞](https://jp.topmediai.com/ai-lyrics-generator/)機能も提供

昔から音楽をやっている身としてはありがたい限りです。

## 音楽生成AIのAPIも活用できる
最近は**APIとして提供されている音楽生成AI**も増えてきました。

エンジニアでなくても、自動で音楽を生成する仕組みを**自作アプリやゲームに組み込める**というものです。

### 代表的な音楽生成AI API
- **Suno AI（API.box経由）**：API.boxを通じてAPI提供あり。​Python SDKも利用可能で、開発者向けのドキュメントも充実しています。 
- [**TopMediai API**](https://jp.topmediai.com/api/ai-music-generator-api/) ：歌詞・プロンプト・プロンプトから楽曲を生成するサービスです。​日本語の歌詞にも対応しており、音楽制作のニーズに応えます。 

少し技術寄りの話ではありますが、  
最近は**ノーコードで連携できるツール**も登場しているので、興味があればぜひ。

## 私の考え：音楽生成AIは「相棒」だ
最後に、私の個人的な意見です。

音楽生成AIは「クリエイターの**代わり**」ではなく、  
「クリエイターの**相棒**」だと思っています。

- 自分では思いつかないコード進行を提案してくれる  
- 時間がないときにデモを作ってくれる  
- アイデアに詰まった時の良き相談相手になる  

AIと**上手に付き合えば**、音楽の可能性はもっと広がる。  
そう感じる今日この頃です。


## まとめ｜AIの力を借りて、もっと気軽に音楽を楽しもう
- 音楽生成AIは進化しており、**日本語曲にも対応**したサービスが増えている  
- `TopMediai` などのサービスは、**簡単操作でプロ並みのBGMやボーカル付きデモ**も作成可能  
- **APIを活用すれば**、音楽生成を自動化してアプリやサービスにも展開できる  
- 使い方次第で、AIは**創作活動の強力なサポーター**になる

作曲に興味はあるけど難しそう……と思っている方こそ、  
**一度AI作曲を体験してみてほしい**ですね。
「音楽を作る楽しさ」を、改めて感じられると思います。

> 参考記事：
https://jp.topmediai.com/ai-music-composition/
https://jp.topmediai.com/ai-lyrics-generator/
https://aismiley.co.jp/ai_news/6-ai-softwares-that-automatically-compose-music/
StorybookのDocsでCanvasをたくさん使うと重くなるので対応した

## はじめに

StorybookのDocsでCanvasコンポーネントを使用して、Storyの内容を表示していた。

1~3個だったら特に気にならなかったが、それ以上多くなると描画が遅く、動作が重くなってしまった。

その事象への対応を行った。

## 環境

- Storybook 8.6.4

## 対応内容

### 修正前
Canvasコンポーネントを使用して、Storyを表示していた。
以下はButtonの.storiesファイルからimportし、PrimaryButton StoryをCanvasで表示している例。

```jsx
import { Canvas } from "@storybook/blocks";


<Canvas of={ButtonStory.PrimaryButton} />
```

この場合、表示は以下のようになる。

![Canvasを使用した場合の表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68008/32ae04f9-3ab8-4eed-ad59-defe60e56faf.png)


### 修正後

Storyと、そのコード内容を表示させたい。  
そこでCanvasコンポーネントではなく、[Story](https://storybook.js.org/docs/api/doc-blocks/doc-block-story)コンポーネントと[Source](https://storybook.js.org/docs/api/doc-blocks/doc-block-source)
コンポーネントを使用した。

```jsx
import { Story, Source } from "@storybook/blocks";

<Story of={ButtonStory.PrimaryButton} inline={false} height="250px" />
<Source of={Button.PrimaryButton} dark/>
```

![Story,Sourceを使用した場合の表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68008/577318e1-c402-4f7d-97c3-a86a6a4c3427.png)

#### Storyコンポーネントの調整
Storyコンポーネントのinline={false}を指定することで、iframeの中にソースコードを表示できる。  
trueの場合は他のドキュメント部分と同じように表示される(下図)。

Canvasと見た目を同じようにしたかったため、今回は`false`にした


![inline:trueで表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68008/114c57ec-f41d-4403-8ec1-7e48ed9d709b.png)


また`height`を指定しないと、微妙に高さが余計に出てしまうので、Storyの描画内容に応じて調整した。

#### Sourceコンポーネントの調整
Sourceコンポーネントで、Storyのコードを表示した。  
Canvasコンポーネントを使っていた時はダークモードでコードが表示されていたため、
それに合わせてdarkを指定した。  
Sourceコンポーネントは、コードの開閉ができない。しかしCanvasコンポーネントを使用していた時もデフォルト開くようにしていたので、今回はそのままにした。



## 参考
- [Story](https://storybook.js.org/docs/api/doc-blocks/doc-block-story)
- [Source](https://storybook.js.org/docs/api/doc-blocks/doc-block-source)
LaTeX数式をパッと画像化するWebサービスを作った 

# PowerPointやiPadで数式を使いたいときに、サクッと変換できるWebアプリですわ
[🚀 アプリケーションはこちらから利用できます](https://latex-converter-m.vercel.app)

## なぜ作ったか

プレゼン資料やiPadでのノート作成時に

- 「PowerPointで数式を入力するのが面倒...」
- 「iPadで数式を書くのが大変...」
- 「LaTeXの数式を画像にしたいけど、インストールが面倒...」

などなど思ってオンラインで解決するサイト探したが、個人的に使いづらすぎたのでつくってみた

## 主な機能(といっても変換するだけですが)

### 1.簡単数式入力

- よく使うLaTeXコマンドをワンクリックで挿入
- リアルタイムでプレビュー表示

### 2. 高品質な画像生成

- 超高解像度（1200 DPI）で出力
- 背景透過でPowerPointにそのまま貼り付け可能

### 3.UI
- iPadでも快適に使用可能
- スマートフォンでも使える


## 使い方

1. 数式を入力（またはLaTeXコマンドボタンをクリック）
2. プレビューで確認
3. 希望の形式（SVG/PNG）を選択してダウンロード
4. PowerPointやiPadのノートアプリに貼り付け

##活用シーン

- **プレゼン資料作成**
  - PowerPointに数式を簡単に挿入
  - 高品質な数式画像で見やすい資料に

- **iPadでのノート作成**
  - GoodNotesやNotabilityに数式を貼り付け
  - 手書きでは難しい数式も美しく表示

- **研究資料の作成**
  - 論文やレポートに数式を挿入
  - 一貫性のある数式スタイルを維持

## 🛠️ 技術スタック

| カテゴリー | 使用技術 |
|------------|----------|
| バックエンド | Python (Flask) |
| フロントエンド | HTML, CSS, JavaScript |
| 数式レンダリング | MathJax |
| デプロイ | Vercel |

## 今後の展望

- [ ] 数式の履歴保存機能
- [ ] カスタムスタイルの追加
- [ ] バッチ処理機能
- [ ] PowerPointアドインの開発
- [ ] iPad用ショートカットの追加

プレゼン資料作成やノート作成の際に、ぜひご活用ください！

[🚀 アプリケーションはこちらから利用できます](https://latex-converter-m.vercel.app)
DBから取得したデータをDataBindで表示しようとしたときに制約エラーなどが生じたときの対処

DBから取得したデータをListViewに表示しようとしたら制約エラーが生じたが、
取得したデータのどのレコードのどのカラムが原因かが分からない場合の対処方法。

```VB:before.aspx.vb
PageDataSet.SampleTable.Clear()
Using ta As New dsMainPageTableAdapters.SampleTableTableAdapter(ConnectionString)
  ta.Fill(PageDataSet.SampleTable)

  '取得したデータをListViewにDataBind
  lvListTable.DataBind()
End Using
```

SQLが間違っていて、Nullがあったり、重複が許されない値が重複していたりして制約エラーが生じた。
そこで、以下のようにログを出して原因を特定した。

```diff_visual_basic
PageDataSet.SampleTable.Clear()
+ PageDataSet.EnforceConstraints = False
Using ta As New dsMainPageTableAdapters.SampleTableTableAdapter(ConnectionString)
  ta.Fill(PageDataSet.SampleTable)
+  Try
+    PageDataSet.EnforceConstraints = True
+  Catch ex As ConstraintException
+    Dim errorRows As DataRow() = PageDataSet.ExtensionTable.GetErrors()
+    For Each row As DataRow In errorRows
+      Dim msg As String = "▼ エラー行 ID: " & SafeToString(row, "ID")
+      For Each col As DataColumn In row.GetColumnsInError()
+        msg &= vbCrLf & "列: " & col.ColumnName & " → エラー: " & row.GetColumnError(col)
+      Next
+      '必要に応じてログや画面出力
+    Next
+  End Try

  '取得したデータをListViewにDataBind
  lvListTable.DataBind()
End Using

+Private Function SafeToString(row As DataRow, columnName As String) As String
+    If row.Table.Columns.Contains(columnName) AndAlso Not IsDBNull(row(columnName)) Then
+       Return row(columnName).ToString()
+    Else
+        Return "(NULL)"
+    End If
+End Function
```
Databricks AI/BIダッシュボードにコロプレス地図がやってきました！

これも個人的に待っていた機能。レガシーダッシュボードではあったのですが、AI/BIダッシュボードでは未サポートでした。

![Screenshot 2025-04-30 at 15.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ab7fc0fe-fe55-48e8-b419-364ffc203ad2.png)

言葉は馴染みがあまりないのですが、地域ごとの値に基づいて色分けする可視化です。

https://visualizing.jp/choropleth-map/

> **AI/BIダッシュボードでコロプレス地図が利用可能に**
> ダッシュボードでコロプレス地図が利用できるようになり、ユーザーは人口、収入、その他のメトリクスに基づいて変動する色で、地理的な領域でデータを可視化できるようになりました。詳細は[こちら](https://docs.databricks.com/aws/ja/dashboards/visualizations/types#%E3%82%B3%E3%83%AD%E3%83%97%E3%83%AC%E3%82%B9%E5%9C%B0%E5%9B%B3)。

試します。

[マニュアル](https://docs.databricks.com/aws/ja/dashboards/visualizations/types#%E3%82%B3%E3%83%AD%E3%83%97%E3%83%AC%E3%82%B9%E5%9C%B0%E5%9B%B3)にあるように以下のSQLでデータを作成。

```sql
SELECT
initcap(n_name) as Country,
sum(c_acctbal)
FROM samples.tpch.customer
join samples.tpch.nation where n_nationkey = c_nationkey
GROUP BY 1
```

日本語では、可視化のタイプは**階級区分図**になっています。

![Screenshot 2025-04-30 at 15.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6637bc33-aa3f-4590-aeb2-5ab1cc55a00b.png)

どの粒度で色分けするのかを指定することも可能です。

![Screenshot 2025-04-30 at 15.43.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5aeafec8-cc58-4673-a3b0-242ecc69efb8.png)

色の濃さを示す数値を**色**で指定します。

![Screenshot 2025-04-30 at 15.37.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7b8cd750-02df-4868-894f-ab9cb6cdcafc.png)

可視化されました！

![Screenshot 2025-04-30 at 15.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b460fa5d-742e-4bdc-9092-e4132b81cbce.png)

ご活用ください。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
re:inventで感じた参加者への配慮の充実

## はじめに

re:inventに行って感じたのは、参加者への配慮の充実度の高さでした。

re:inventから大分日が空いてしまいましたが、ピックアップして、紹介していきます。

## re:invent内の施策

### Vegan対応の食事メニュー

re:inventでは、朝昼の食事や軽食が提供されるのですが、ビーガンメニューがとても充実していました。

朝ヨガのクラスで提供された、ビーガン対応プロテインバー
↓
![IMG_2338.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/e50e2b09-9974-475c-82a5-82c92fd22296.jpeg)

少し見づらいですが、メニューにはベジタリアン・ビーガンの表記と共に、大豆やグルテン、ゴマの有無が書かれており、自分の食スタイルに合わせた選択ができました。


![IMG_2396.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/6f225306-5b4f-4af7-89aa-464407088df2.jpeg)

日によって、メニューが違い、海苔・ごはん・醤油などの和風メニューが出た日はとても嬉しかったです！
![IMG_2395.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/b2036936-735c-496f-ab5d-0e5c730e920c.jpeg)

![IMG_2394.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/8ffafc9a-d89c-4919-8ad0-fb856d214f58.jpeg)

もちろん、普通にパンなどオーソドックスな食事も楽しめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/27baa9df-f219-41a7-9449-b0df508338ae.png)


### 授乳室

朝から夜まで開かれている授乳室も、各会場にありました。

![IMG_2376.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/f01fbfd1-8dcc-4eb6-baaa-1bffadf13925.jpeg)

### re:playの同時手話

re:playではアーティストやDJのライブがありました。写真には写っていませんが、ステージの横に同時に手話を行う方がいらっしゃり、歌詞を手話で届けていました。普段ニュースで見かけるフォーマルな手話通訳の方ではなく、Tシャツでノリノリで手話をされており、新鮮でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/e1696cd1-2974-45ca-b0c3-df6dba23c634.png)

### その他
写真はありませんが、Prayer roomやジェンダー・アイデンティティを表せるinclusionバッチの配布、講演時の同時英語字幕等もありました。また至るところに、helpスタッフの方がいらっしゃって、迷子になることはありませんでした。

### 感想
授乳室が各会場にありましたが、re:invent滞在中に、小さなお子さんを連れた方は見かけませんでした。（そもそも参加者の大多数は男性で、女性は全参加者の2~3割の印象でした。）しかし、実際に授乳室の需要があるかで判断せず、様々な場所に授乳室が設置されており、誰もが安心して来場できるように最大限の配慮がされていることに感心しました。


仕事に限らず、プライベートでもこんなに規模の大きいイベントに参加したことが無かったので、運営側の観点からも非常に学ぶことが多かったです。

以上です。ありがとうございました。
vSphere Hypervisor(無償版ESXi 8.0 U3e)のインストールに失敗した話

# vSphere Hypervisor(無償版ESXi 8.0 U3e)のインストールに失敗した
自分のメモ書きのために残します。

# 【事象】ESXiをインストールしようとすると以下のエラーで進めなくなる。
「No Network Adapters」
「No network adapters were detected. Either no network adapters are physically connected to the system, or a suitable driver could not be located. A third party driver may be required.
insure that there is at least one network adapter physically connected to the
leas
system before attempting installation. If the problem persists, consult the VMware Knouledge Base.」

# 【原因】マザーボードのNICドライバが含まれていない
今回ESXi用に準備していたマザーボード「B450 STEEL LEGEND」（余ったPC）のNICが、Realtek社の「RTL8111H」だった。

https://compatibilityguide.broadcom.com/search?program=io&persona=live&column=brandName&order=asc

ESXi上に含まれているNICのドライバーは上記URLから探すのですが、「RTL8111H」が載っていない・・・。というかRealtek社が載っていない。
VMwareはRealtek社のNICだとインストールできないのは割と常識らしく・・・。今まで、VMware WorkStation Pro上に入れていたり、お客様導入のサーバに導入していたが、特にトラブルになったことがなかったので、知らなかった。

昔のESXiのバージョン（7以前）であれば、カスタムISOイメージを作成することで、RealtekのNICドライバーを組み込んだうえでインストール作業をすれば行けるらしいとの情報がインターネットにありましたが、ESXi 8以降はこちらの対策も現時点（2025/4/30）では不可とのこと。

# 【対策】ヤフオクで中古NICを買う
「Intel Ethernet Server Adapter I350-T2」という2ポートあるIntel製NICを購入しました。届き次第、インストール作業を再開します。

# (2025/5/5追記)
・無事にインストール完了しました。
・今回購入した「Intel Ethernet Server Adapter I350-T2」ですが、PCIe接続で×4レーン(物理的なPCIe端子の長さの話、実際に動作しているレーン数は未確認)必要なモデルでした。
・「B450 STEEL LEGEND」には×16レーン接続可能なスロットが二つあるのですが、M2スロットにNVMEを接続していると、2番目のPCIスロットが無効化されるという仕様があり・・・。今回購入したNICを接続しても、認識しない理由の特定にだいぶ時間がかかったのは余談です。
Pythonでキョウプロ的な勉強を始めた(標準入力って何？)

:::note info
前半に学習した内容、後半に感想や今回の内容に至った背景を書いています。
:::

## 目次
***○○って何？***
- [競プロ(キョウプロ)って何？](競プロって何？)
- [Pythonって何？](Pythonって何？)
- [標準入力って何？](標準入力って何？)

***プログラム例***
- [基礎となる標準入力のプログラム](基礎となる標準入力のプログラム) 
    - [四則演算の演算子](四則演算) (例)

***感想や背景***
- [競プロを始めたきっかけ](なぜ競プロなのか)
***

## 競プロって何？
 競技プログラミングの略。算数や数学みたいに問題があってプログラムを書いて解き、その正解数や解くのにかかった時間などを競う。[(Wikipedia)](https://ja.wikipedia.org/wiki/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
　競プロで検索したら[AtCoder](https://atcoder.jp/?lang=ja)というサイトが最初にヒットすると思うが、めっちゃ問題数がある。
 友人曰く、就活に使うにはタイパ悪いらしいけど、ランクが良いとそれだけで就活に使えたりするらしい。武器の一つになりそうだよね、知らんけど

## Pythonって何？
蛇です。ロゴがかわいい。プログラミング言語の一種で、他の言語に比べるとシンプルに書けるなぁって印象がある。
　ライブラリっていう便利な道具、ツールみたいなものがあってそれが充実してるんだって詳しい人が言ってた。
 私は高専時代の研究で使ってた。

## 標準入力って何？
　詳しく知りたい人はGoogleやChatGPTに聞いてね。
 今のところは、解答プログラムの正誤判定のために与えられるデータを読み込む方法という認識。
 
 　使ったことない何も分からんが！と思いながら勉強していた。
  今回この記事を書いているうちに、そういえば高専１年の実験のC++のプログラムでscanf関数を使っていた。Pythonでも研究の時にinput関数を使っていた。あれだったのかよ
<br>

***
### 基礎となる標準入力のプログラム 
(これ分かってるだけでPaizaのD問題なら全部解ける)

```ruby:Basics.py
line = input().rstrip().split(",")
print(line)
```
`input()`でテータを入力。`.`でそれぞれの関数を区切る。

`strip()`という関数は文字列の両側の文字を削除する。`()`内に削除するものを指定しないとき改行やスペースを削除する(仕様)。
　～　`rstrip()`は文字列の右側の文字、`lstrip()`だと左側を削除する。～

--- 参考　*[TechAcademy](https://magazine.techacademy.jp/magazine/33799)*　*[FreeHeroBlog](https://freeheroblog.com/strip-rstrip-split-rsplit/)*
<br>

以下は四則演算の***演算子例***
```ruby:calc.py
n = 3 #変数nに３を代入

a = line + n #足し算(和)
s = line - n #引き算(差)
m = line * n #掛け算(積)
d = line / n #割り算(商)
r = line % n #余り(剰余)
i = line // n #割り算して小数点以下を切り捨て
```

これらを様々に組み合わせてプログラムを書き計算することで、問題の解を求められるというわけだな！
競プロは数学も一度に勉強できてお得だね

<br>

***

<br>

## なぜ競プロなのか
プログラミングを学ぶ方法はたくさんある中でなぜ競プロを選んだのか。

　高専卒業までに習ったことをほとんど忘れてしまった気がしていた。プログラミングだけじゃなく、数学や英語もである。今や中学生以下の学力だという自信がある。

　さて、ほとんど忘れてしまったプログラミングの学習を始めるにあたり、まず何をすればいいの？という壁があった。
取り掛かり易かったProgateも無料でできる範囲にはすぐ終わってしまい限界がある。それで学べる知識だけで何かを完成させられるほど、私は器用でないことに色々とやっている内に気付くこともできた。しかし作りたいなと色々発想することは溢れるほどできて、挑戦し調べては「どうしたらいいのか分からない進まない」で終わることが多かった。
調べた時の、そこに書いてあることがどうすれば理解できるようになるのだろうと考えた。まずは基礎力を付けるべきだと結論した。

　ちょうどTLにツイートが流れてきて友人が就活していたのを知った。彼がずっと競プロをやっているのを思い出した。彼らの話してる内容が理解できたらもっと楽しいだろうにとか、足を引っ張らず一緒に大会へ出られたらなとか、学生時代にそんなことを思いながらも勉強するには余裕がなく、彼らに憧れながら諦めていたのを思い出した。

　基礎力を付けるには簡単なプログラムからとにかく沢山書くこと、簡単なプログラムをたくさん書くのに競プロがちょうど良いのではないかという気がした。
 昔、AtCoderの情報量に目が滑っていた記憶があったのでPaizaで始めてみることにした。学生時代やその後も、勉強しようと挑戦する度に標準入力ってなんだよと躓いてたのもあり、理解できたことは記録しようとこの記事を書いたわけである。

<br>

↓ 記事にしようと思った経緯はこちらに書いてます、よかったら読んでね
[おきもち](https://qiita.com/chika-ssy/private/c7d262e7b4dfe73e64dd)
ネットワーク勉強編

# *【初心者向け】ネットワークエンジニアを目指して勉強を始めました！*




### *はじめに*

ネットワークエンジニアを目指して勉強を始めた25歳社会人未経験の二十五日の夜です。このQiitaでは学んだことやつまずいたところを*自分のメモ＆誰かの役に立てたらいいな*と思って記録していきます。



### *勉強中のこと*

・Packet　tracerを使って基本的なコンフィグレーションを打ちこんでみた。

・PingーｔでCCNAの問題を解いてます

・情報系の通信大学でソフトウェアやハードウェア、データサイエンス、セキュリティ、ネットワークなどを勉強中。



### *最初につまずいたところと学んだこと*

#### *IPアドレスってなに？*

最初は「数字がいっぱいで意味不明」だったけど、
192.168．0.1みたいにネットワークを識別する番号なんだと分かってきた。

#### *Packet　tracerでやっってみたこと*
・CLIに基本的なコンフィグを試してみた



### *今後やりたいこと*
・とりあえず年齢も年齢なので通信で勉強しながら雇って頂けるところに就職できるよう頑張ります。

・Qiitaで週１はアウトプットしたい。

・CCNAに合格する！



### *おわりに*

もし同じように勉強している方がいたら、コメントやアドバイスもらえると嬉しいです！
これからも記録を続けていきます！
JavaScript における関数呼び出し時の引数渡しの挙動

## 概要
JavaScript では、関数に引数を渡す際の挙動が「プリミティブ型」と「オブジェクト型（配列を含む）」で異なります。
本記事では具体例を挙げながら解説します。

## プリミティブ型
数値や文字列、真偽値などのプリミティブ型は、関数内で再代入しても、呼び出し元の変数には影響しません。

```js
function inc(x) {
  x = x + 1;
  console.log("関数内:", x);  // 関数内: 2
}
let a = 1;
inc(a);
console.log("呼び出し元 a:", a);  // 呼び出し元 a: 1
```

## オブジェクト型（配列含む）は「参照のコピー」が渡される
- 関数内でプロパティ／要素を変更すると、呼び出し元のオブジェクト／配列にも影響が及ぶ
- 関数内で引数変数を別のオブジェクト／配列に再代入しても、呼び出し元の参照は変わらない

### オブジェクトの場合
```js
function setName(o) {
  o.name = "太郎";           // (A) 呼び出し元 person.name が "太郎" に
  o = { name: "次郎" };     // (B) o を新しいオブジェクトに再代入
  console.log("関数内 o:", o.name); // 関数内 o: 次郎
}

let person = { name: "一郎" };
setName(person);
console.log("呼び出し元 person:", person.name); // 呼び出し元 person: 太郎
```
- (A) では、`o.name = "太郎"` によって呼び出し元の `person.name` も "太郎" になる
- (B) の `o = {…}` は関数内の変数 `o` に新しい参照を割り当てるだけで、呼び出し元の `person` は変わらない

### 配列の場合
```js
function modifyArray(arr) {
  // (1) 要素の変更は呼び出し元にも反映
  arr[0] = "B";

  // (2) 変数自体を再代入しても呼び出し元には影響なし
  arr = ["X", "Y", "Z"];
  console.log("関数内 arr の再代入後:", arr); // ["X","Y","Z"]
}

let original = ["A","A","A"];
modifyArray(original);
console.log("呼び出し元 original:", original); // ["B","A","A"]
```
- (1) の `arr[0] = "B"`によって、呼び出し元 `original[0]` も `"B"` に
- (2) の `arr = […]`はローカル変数の再代入なので、`original` には影響しない

## スプレッド構文で配列をコピーするときの挙動（浅いコピー）
関数の引数ではないですが、スプレッド構文 [...] を使うと、新しい配列オブジェクトが作成されます。
しかし、その要素として格納されるオブジェクト自体は元の配列と同じ参照となる「浅いコピー（shallow copy）」になります。

たとえば以下の例を見てみましょう。

```js
const original = [{ name: "A" }, { name: "B" }];
const shallowCopy = [...original];

// 配列自体は別インスタンス
console.log(original === shallowCopy); // false

// 要素（オブジェクト）は同じ参照
console.log(original[0] === shallowCopy[0]); // true

// shallowCopy に要素を追加しても original には影響しない
shallowCopy.push({ name: "C" });
console.log(original.length);    // 2
console.log(shallowCopy.length); // 3

// しかし要素のプロパティを変更すると original も変わる
shallowCopy[0].name = "Z";
console.log(original[0].name); // "Z"
```
上記のとおり、shallowCopy 自体は別の配列です。

shallowCopy.push(...) で要素を足しても元配列 original は変わらなりません。
しかし、配列内のオブジェクトを直接操作すると同じオブジェクトを参照しているため、original の中身も変化するという挙動になります。

## まとめ
### プリミティブ型
再代入しても呼び出し元は変わらない

### オブジェクト型／配列
「参照のコピー」が渡され、プロパティや要素の変更は呼び出し元にも反映される。
一方、引数変数自体の再代入は影響しない
【傾向と対策】データサイエンティスト検定の対策

## はじめに

今年の3月にデータサイエンティスト検定という資格に合格したので体験記を残します。
個人的な所感としてはとても簡単な試験でした。
基礎的なデータ分析や機械学習を勉強した人であれば、
特別な対策をしなくても合格できると思います。
https://www.datascientist.or.jp/dscertification/

### 著者のレベル

データサイエンティスト歴：1年
ライブラリを使って機械学習の基本的なモデルをPythonで実装できる
モデルの裏側にある数式は理解していない

## 対策

白本と黒本（通称）を使って対策しました。
白本についてくるサンプル問題から何問か出題があるだろうと思ってましたが、
1問も出題がなくビビりました。
ちなみに黒本からも1問も出題がありませんでした。
あまりに類似問題が出ないので、
白本に載っている★1の部分を理解する勉強方法が現状のベストプラクティスです。

一応リンク載せておきます。
アフィリエイトリンクではないです。

■徹底攻略データサイエンティスト検定問題集［リテラシーレベル］対応

https://item.rakuten.co.jp/book/17069835/?variantId=17069835&scid=wi_ich_iphoneapp_item_share

■データサイエンティスト検定（リテラシーレベル）公式リファレンスブック 第3版 

https://item.rakuten.co.jp/book/17802962/?variantId=17802962&scid=wi_ich_iphoneapp_item_share

### 受験した所感

黒本の問題を１段階簡単にした問題が出ます。
ほとんどの問題に自信を持って回答できました。
成績は92%くらいだったと記憶しています。

### このような問題が出た

詳しい問題の内容は共有できないのですが、
雰囲気だけ伝えると下記のような問題が出ました。

――――――――――

【設問】

あなたはデータサイエンティストとして、以下の課題に取り組みます。

あるオンライン小売企業では、
顧客の過去の閲覧履歴や購買履歴、会員属性などをもとに、
次回の商品購入の有無を予測し、
購入見込みの高い顧客に対してプロモーションメールを送信したいと考えています。

この課題に最も適した手法は、以下の選択肢のうちどれか。

1. 回帰
2. 分類
3. 強化学習
4. クラスター分析

――――――――――

回答は2ですね。基本的な学習をした人であれば回答できると思います。

### この資格を取ると良い人

私自身はこの資格を取ることでデータサイエンスの全体像を掴む目的でした。
試験自体の難易度はおいておいて、
資格を取るための勉強で知識を深めることができたので、そこは良かったです。
例えば強化学習は実務で使っている人が少なく、見識がない人も多いのではないでしょうか？
この資格を勉強する過程で浅く広くそういった知識をつけることができます。
データインク比率とかね（笑）

## まとめ

データサイエンティスト検定は、
基礎的な分析・機械学習の理解があれば対策不要で合格可能です。
白本の★1レベルをしっかり押さえ、
全体像を楽しみながら学んで高得点＆合格を勝ち取りましょう。
自信を持って挑戦を！