OmniAICreator/Qiita-1.07M huggingface dataset:
私がRPA支援を選んだ理由

この記事は クラウドワークス グループ [Advent Calendar 2024 シリーズ2](https://qiita.com/advent-calendar/2024/crowdworks)の9日目の記事です。


初めまして。Peaceful Morning株式会社にて技術者支援をしているyukikanekoと申します。
今回はグループ会社であるPeaceful Morning株式会社の事業と、なぜ自分がその事業に携わっているか・この事業で何をしたいかを記事にしたいと思います。

# Peaceful Morning株式会社
Peaceful morningでは、Roborunnerサービスを中心としたRPAの導入支援・運用支援を実施しております。現在は導入支援だけではなく、プロフェッショナル開発事業や「社内のDX化」に向けた様々なお手伝いをしている会社でございます。


# 自己紹介
・出身は埼玉県。現在は熊本県に在住。
・平成元年生まれ。去年、長男が生まれて3人暮らし。
・フルリモート勤務
・大学は、理工学部情報科学科卒業。
　JavaとかC言語とか学んだが難しすぎて挫折。

 
・卒業後は塾講師として小・中学生に集団授業
　→1年半で退職し、OA機器の営業に転職
　→売り上げが上がらず、技術部に異動。コールセンター業務に従事。
 　→コールセンター部門の中間管理職になる。
　　ここで、RPAと出会う。

   以降、8年くらいRPA関連の仕事をしています。


# 現在の業務
現在は、Robo runnerサービスを用いた内製化の支援や、RPAロボットの開発をしています。RPAロボットとは、PC上での業務を自動実行してくれる仕組みです。

私個人が主に力を入れている内容は、内製化支援です。
※以下　弊社営業資料

![LT資料＿金子 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938380/cb206815-9e54-7549-ce85-0ef385c10030.png)

詳しくはHPをご覧ください。
https://robo-runner.com/

# なぜこの業務をやっているのか。

経歴でも記載しましたが現時点で8年間RPAに関する業務に従事しておりますが、その中でも現在の仕事が一番やりがいがあると感じております。

### 今までに実施したことがあるRPA関連業務
　・自社内の実績集計（マクロとRPAの併用）
　 ・RPA初学者に対して、集団授業
 　・お客様の業務をヒアリングしてロボット化提案
  　・ロボット作成代行。開発納品
   　・導入支援、伴走支援

上記に関しては一通り対応できます。現在もPeaceful Morning内の業務として対応しているものもあります。
ただ、導入支援・伴走支援がやりたくてPeaceful Morningに入社しました。それには私が経験した少し苦い思い出があったからです。


# RPAデビュー
実は私は、最初はRPAなんてやりたくありませんでした。

8年前、当時所属していた会社がRPAの導入を決めたときのことです。
私は、コールセンターに所属し数名の班員を抱えていました。主な業務はクレーム対応と班員の実績集計でした。

社内システムから、班員の通話時間を調べたり、
お客様の意見から、当時の対応ログを調査したり、
問い合わせが多いお客様に関する調査だったり…がメインでした。多少残業はしていましたが、何の不満もありませんでした。

当時は「RPA」や「DX化」という単語が出始めたころでした。

総務省情報通信白書　RPA（働き方改革：業務自動化による生産性向上）より抜粋すると、RPAとは以下のように定義されています。
> RPAはこれまで人間が行ってきた定型的なパソコン操作をソフトウエアのロボットにより自動化するものです。

https://www.soumu.go.jp/menu_news/s-news/02tsushin02_04000043.html

RPAについての記事を見た私の上長は、RPAツールの導入を決定しました。
そして、私に言いました。
「これを使って、業務自動化して。」

上長は私が情報科学科卒業だということは知っているので、大丈夫だろうと考えているようでした。

# 技術習得の難しさ
新しい業務を与えられた私は、通常業務とは別にこの未知なるツールの解析を始めました。
私に与えられたものは、ツールのインストーラーと営業担当者の名刺程度でした。ただ、国産の有名なRPAツールだったためにネットで検索するとたくさんの記事が該当しました。

色々な記事を見ながら、とりあえずインストールして、触ってみました。


…全然わけがわからない。。。
正確には記事の内容はわかるけど応用方法がわからない…
かといって、営業担当者の方に電話しても技術的なことはわからないといわれてしまう。

ツール代金は年間100万円程度といわれていた自分は、「このままでは100万円無駄になってしまう…」という焦りもあり、精神的にしんどかったです。

当時は社内で一人だけ、遅くまで残業して解析していました。
周りの部署の方々が本当にうらやましかった…

# 運用開始
ツール導入後、しばらくはまったく成果が出ませんでしたが数か月後経って少しずつ形になってきました。
「今抱えている業務をロボット化したい」という目標到達は出来なかったものの、「ネットに記載されているロボットを使えば〇〇の業務は楽になるんじゃないか？」という観点からRPAの道が広がっていきました。

ロボットが少しでも運用できるようになったらそのあとはロボット開発が楽しくなりました。「前に作ったあのロボットを応用したらコレもできるな…」という引き出しが増えていき、面白いようにロボットが増えていきました。
慣れてくるとロボット開発はパズルのようなものなのでゲーム感覚で楽しめました。
「勉強のため」とだらだらと残業をすることもなくなりましたし、業務時間が削減できた＝成果が出せたことに対する喜びもありました。ちょっとした昇格もできたので、最終的にはとても良い経験をつめたと感じております。


# 学んだこと
上記のような経験を経て現在があるため、
RPA開発は「最初が最も大変で、心が折れてしまう可能性が高い」と身をもって痛感しております。
もちろん人によるとは思います。
学校の勉強と同様だと思います。

「教科書を読むだけでテスト満点取れる人」もいれば、
「学校だけでなく塾に行ってギリギリ合格点取れる人」もいるわけです。

自分は後者でした。
RPAの先生がいるならその人に教わりたかった。

だから、RPAに関する支援をしているPeaceful Morningの話を聞いて、一緒に仕事をしたいと思いました。



# まとめ

Peaceful Morning株式会社は、「我慢しないで働ける社会を作りたい」というメッセージからスタートしています。
自分が経験した一番の我慢は、RPA技術習得までの鍛錬でした。

業務の傍らRPAに着手する人にそんな思いをしてほしくありません。
なので、「RPAって何？」「やってみたけど難しい」「ロボット開発が苦痛」という方々は一度ご連絡ください。そういった我慢を取り除いて、働けるような社会になるように貢献出来たら嬉しいです。
【Cursor】A JavaScript error occurred in the main process Uncaught Exception: Error: Cannot find module　の解決策

# 背景
PCを立ち上げたら、Cursor エディタがエラーを吐いて立ち上がらない。昨日、急いでPCを落としたから、どこかで何かが起こったのだろう。
# エラー
```
A JavaScript error occurred in the main process
Uncaught Exception:
Error: Cannot find module 'C:\Users\**\AppData\Local\Programs\cursor\resources\app\out\main.js'
at Module._resolveFilename (node:internal/modules/cjs/loader:1152:15)
at s._resolveFilename (node:electron/js2c/browser_init:2:120426)
at node:electron/js2c/browser_init:2:152926
at node:electron/js2c/browser_init:2:126175
at node:electron/js2c/browser_init:2:126179
at BuiltinModule.compileForInternalLoader (node:internal/bootstrap/loaders:398:7)
at BuiltinModule.compileForPublicLoader (node:internal/bootstrap/loaders:337:10)
at loadBuiltinModule (node:internal/modules/helpers:104:7)
at Module._load (node:internal/modules/cjs/loader:1009:17)
at c._load (node:electron/js2c/node_init:2:13801)
```
# 解決策
- Cursor の再インストール
- Cursor をアンインストールしなくても、公式サイトからダウンロードしたファイルをインストールすることで解決できた
部活動のあるSESってなに・・・？

はじめまして。リンクラフトでバックエンドエンジニアとして業務担当しているニノです。
リンクラフトアドベントカレンダーの5日目を担当することになりました。
よろしくお願いします！


# 【結論】SESなのに部活動？
結論から話すと、リンクラフトの社員で構成された部活動があります！

ぜんぜん違うクライアント先に行っている、ふだん話さないような社員とも交流が取れるのです。もし、SESとして常駐先に行って、知らない人ばかり、不安ですよね？そうなったとしても、部活動で気軽に話せる仲間がいるのは何とも頼もしいですね。

そして、何より、異なる技術を持った人と話せる機会があるのは大きいと思います！私は主にPHPを使っていますが、 Python, Java, C#, Swift, Kotlin, React 等々、それらを使っている方々と話せるのは刺激があって面白いです。

これだけでも興味の沸いた方がいらっしゃると思います。ただ、何を言ってるかわからない方もいらっしゃると思いますので、詳しく説明していきます。

:::note warn
部活動は任意参加のため、強制参加ではございません。
:::

# そもそもSESとは？
IT業界における契約形態の一つで、System Engineering Serviceの略です。主に、技術者がクライアント先に常駐し、システムの開発や運用、保守などにおいて労働力を提供するサービスを指します。

リンクラフトでは多くのSESエンジニアを抱えています。顧客先が異なる社員とはふだん会う機会がありません。

これはSES業界特有の、社内コミュニケーションの希薄化、情報共有の課題、新入社員のオンボーディング、といったコミュニケーション課題になっているでしょう。

同じ会社の人と、それも同じエンジニアと、技術について話せる機会がないのは何だかもったいないですね。

# リンクラフトの部活動
では実際の部活動を紹介します。

## 部活動の種類
* フットサル
* 釣り
* 麻雀
* バスケットボール
* ボードゲーム

等々

## 活動頻度と参加状況
* 活動頻度: 月1回〜2ヶ月に1回
* 参加人数: 通常5〜10名程度
* 参加率: 全社員（約50名）の10〜20%
* 参加日程: 事前アンケートで最適な日程を選定

## 活動の特徴
* 多様な技術バックグラウンドを持つメンバーとの交流
* 普段接点のない社員との情報交換の場
* 気軽に参加できる雰囲気づくり

# 部活動がもたらす効果
SES業界特有の課題を解決すべく、部活動があると思っています。
社内コミュニケーションの活性化、エンジニアのスキルアップや知識共有、これはメタいですが、社員の帰属意識向上や離職率低下も期待できます。
もちろん、単純に部での活動が楽しいというのもあります！

# 部活動以外にも
今回は部活動をフォーカスして紹介しましたが、リンクラフトでは、月1回、全社員が集まり交流することもあります。
他にも、業務とは別で少数精鋭チームでひとつのサービス、システムを作っていたりもします。
社内交流ツールにもSlackが採用されているので、連絡も取りやすいです！

# まとめ
このように、SES企業であっても、部活動を通じて活発な社内交流を実現できると思っています。リンクラフトでは、技術者同士が気軽に交流できる環境を整えることで、より充実した職場環境を作り出しています。もしこれで興味の沸いた方は、ぜひリンクラフトへ！

-----------

一緒に働く仲間を募集中です！

リンクラフト株式会社では、組織拡大に伴い積極的な採用活動を行っています。
少しでも興味がある方はぜひご連絡ください。

▽会社ホームページ
https://lincraft.co.jp/
▽Instagram
https://www.instagram.com/lincraft.inc/
▽ご応募はこちらより
https://lincraft.co.jp/recruit

※カジュアル面談も受付中です。ご希望の方はHPのお問い合わせフォームよりご連絡ください。

-----------
uithubでChatGPTを用いたコード解析を一段階楽にしよう

## はじめに

ChatGPT等のLLMにOSSのコード解析を頼もうとしてもなかなか思うような返答がもらえないことがあります。
特に、リポジトリ全体を対象とした質問や、特定の関数やファイル間の関係性を理解したい場合には、
コード量が膨大すぎてAIが正確に把握できないことがしばしばあります。

これを解決してくれるひとつの要素としてuithubがあります。

https://uithub.com/

uithubはリポジトリ全体のコードをひとつのテキストファイルとして取得できます。
これにより、LLMを用いたコード解析や質問がよりしやすく、より正確になります。

## 使い方

読みたいGitHubライブラリのURLを用意します。
今回は普段競技プログラミングをやるときにお世話になっている`cargo-atcoder`にしてみました。

https://github.com/tanakh/cargo-atcoder

uithubの使い方は非常に簡単で、ブラウザ上で"github.com"の"g"を"u"にします。

![hoge.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/cbfc2b13-8a55-f8e9-a6f5-fac4d45d1856.gif)


すると、project treeの下にコードがずらっと並ぶようなテキストファイルを出力してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/de279b90-68b0-cec2-78af-d7c639504732.png)

あとはこれをChatGPT等のLLMに持って行って聞いてあげます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/8e5becc3-e8eb-54f5-3e5b-776b1ddcb029.png)

ただGitHubのURLを貼って聞くよりも精度をあげて精密に回答してもらえます！

## 終わりに

非常にありがたいのでぜひみなさんも使ってみてください！
AI Practitionerの勉強にAIを使って何が悪い

記載内容は所属会社を代表したものではなく、私の個人的な意見ということをご了承ください。

# はじめに
さて、10月から「AWS Certified AI Practitioner」の正式版がリリースされましたね。
AI関連の試験として「AWS Certified Machine Learning - Specialty」を受験した時のAWS関係ないじゃんって問題にたくさん出会したことを良く覚えています。
今回は「AWS Certified AI Practitioner」の取得に向けて、どのように対策すれば良いのかを通勤の電車(往復3時間)で考えてみました。
(1度目に全く勉強せず受験したところ落ちてしまいました(^_^;))

# 思いつき
私は電車の中にいます。
手元にはスマートフォン(GalaxyS24)があります。
スマートフォンにはChatGPTのアプリが入っています。
「AWS Certified AI Practitioner」の試験ガイドをChatGPTに食わせて問題を作ってもらえば良いのでは？と考えます。

# Let's Challenge
まずは試験ガイドを全部コピーしてみて、問題を作ってと依頼してみます。
![1000008076.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780811/a4fa47f3-8f6c-79b1-f28d-82223e186d5a.jpeg)
良く分からん問題が出てきました。
(スクリーンショットには映りきれてませんが問題提起みたいな感じのことをつらつらとしてきました。)

ひとまず読みにくかったので、一問一答形式に整えてもらって、、、
![1000008077.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780811/39975431-8ad9-170b-0fda-7d54518ef2bb.jpeg)

試験問題で問われるようなユースケースの感じにして、解説もつけてもらって、、、
![1000008080.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780811/3fe203a5-2f4f-06a8-7a72-8398af7381db.jpeg)
それらしくなってきました！

きっと本番問題はもう少し難しいので難易度を上げてもらって、、、
![1000008083.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780811/86cc53c9-e61b-19e3-e3de-f7a7baa7434c.jpeg)
![1000008086.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780811/63b2bfc4-840b-f61c-f05f-b3a39a140043.jpeg)
良い感じになってきた気がします！

AWSのサービスを問う問題も混ぜ込んでもらって、、、
![1000008089.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780811/b5eadac1-c11d-98d1-32ed-4a95244f9e2b.jpeg)
準備は出来ました！
テスト本番までにこれで問題をたくさん作ってもらいましょう！

# ポイント！
今回はテスト範囲だけを与えて問題を作ってもらってます。
故にハルシネーションの抑止対策は一切しておりません。
それらしい問題は作ってくれるので、矛盾が無いかを自分で調べることをお勧めします。
と言うより、これにより的を得た勉強になると思います。

# 結果発表！
無事に合格！
![1000008301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780811/56f22ffc-9bed-0986-193c-9fce250d7df0.jpeg)
機械学習とは？って問題に強くなれた気がします。

# 感想
今回使用したのは、無償版のChatGPTでGPT4に基づいて、2023年10月までの情報を学習してるらしいです。
まぁBedrock以外はそれなりに的を得た回答をしてそうなので、そこそこ使えそうな感覚です。
次回は「AWS Certified Machine Learning Engineer - Associate」の取得を目指して、「2025 Japan AWS All Certifications Engineers」の資格をもらいたいと思います！
それでは！
javaで何かプログラムを書こう！

何をテーマにして記事を書こうかな～と悩んでいたところ、ちょうど目の前に![IMG_8440.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943869/d7785f68-274a-89e7-9f51-b139726545eb.jpeg)
バーコードがありました。そこで思いついたのがチェックディジットだったので、チェックディジットの計算法をプログラムで書こうと思いました。

チェックディジットとは？
読み誤りがないかチェックするために、算出された数値で、バーコードデータの最後につけられます。

書いたコード

    import java.util.Scanner;

    public class qita {

    public static void main(String[] args) throws Exception{
    
        Scanner stdIn = new Scanner(System.in, "Shift_JIS");
        System.out.println("13桁のバーコードの数字を入れてください。");
        
        String A = stdIn.next();
        
        int a=1 ,c=0;
        for(int i=A.length()-2;i>=0;i--){
            int suji = Character.getNumericValue(A.charAt(i));
            if(a%2==0){
                c=c+suji;
            }
            else
            c=c+suji*3;
            a++;
        }
        
        int digit=10-(c%10);
       if (digit == 10) {
         digit = 0;
        }
        System.out.println("出たこたえは"+digit+"です。");
        int ADigit = Character.getNumericValue(A.charAt(A.length() - 1));
        if (ADigit == digit) { 
            System.out.println("バーコードのチェックディジットと計算が合いました。おめでとうございます。"); 
        } 
        else { 
            System.out.println("バーコードのチェックディジットと計算が合いませんでした。間違っていますよ。");
    }
    }
    }


int suji = Character.getNumericValue(A.charAt(i));の部分は入力した文字列Aのi番目の文字を整数値に変換しています。ここは調べて書きました..。

実行結果
![スクリーンショット 2024-11-27 000749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943869/746a54c8-ea53-fdcd-73af-ee6ecb2a03cd.png)
![スクリーンショット 2024-11-27 000801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943869/edffb770-8cd9-69ec-a7e9-5252b4b75e82.png)

もっと良い書き方や省略があると思うのでそのようなところを修正し、学んでいきたいです。12桁や8桁などいいろいろありますが、今回は13桁だけの計算にしました。ほかのも追加出来たらなと思います。
セルフレジやバーコード決済など最近はバーコードに触れる機会が多くなっているなと感じているので、バーコードについての知識を身に着けていることも有りかと思いますね。



参考にしたサイト↓

https://www.keyence.co.jp/ss/products/autoid/codereader/basic_mechanism.jsp
Rubyでべき乗の計算をする2つの方法

## はじめに

Rubyでべき乗の計算をする場面に遭遇しました。
<br>

初歩的ですがやり方を忘れていたため、備忘録としてまとめます。
<br>

Rubyのバージョンは次のとおりです。
<br>

```ruby
$ ruby -v
ruby 3.3.4 (2024-07-09 revision be1089c8ec) [arm64-darwin22]
```

## Rubyでべき乗の計算をする2つの方法

次の2つのやり方がありました。
<br>

1. 算術演算子`**`を使う
2. `pow`メソッドを使う

### 1. 算術演算子`**`を使う

1つ目は算術演算子`**`を使う方法です。
<br>

次のように使用します。
<br>

```ruby
irb(main):001> 2 ** 3
=> 8
irb(main):002> 3 ** 4
=> 81
irb(main):003> 2 ** (-2)
=> (1/4)  # Rational型が返される
irb(main):004> 2.0 ** (-2)
=> 0.25   # Float型が返される
```

### 2. `pow`メソッドを使う

2つ目はIntegerクラスの`pow`メソッドを使う方法です。
<br>

次のように使用します。
<br>

```ruby
irb(main):001> 2.pow(3)
=> 8
irb(main):002> 3.pow(4)
=> 81
irb(main):003> 2.pow(-2)
=> (1/4)  # Rational型が返される
irb(main):004> 2.0.pow(-2)
(irb):4:in `<main>': undefined method `pow' for an instance of Float (NoMethodError)

2.0.pow(-2)
   ^^^^
        from <internal:kernel>:187:in `loop'
        from /opt/homebrew/lib/ruby/gems/3.3.0/gems/irb-1.14.1/exe/irb:9:in `<top (required)>'
        from /opt/homebrew/lib/ruby/gems/3.3.0/bin/irb:25:in `load'
        from /opt/homebrew/lib/ruby/gems/3.3.0/bin/irb:25:in `<main>'
irb(main):004> (2.0).pow(-2)
(irb):4:in `<main>': undefined method `pow' for an instance of Float (NoMethodError)

(2.0).pow(-2)
     ^^^^
        from <internal:kernel>:187:in `loop'
        from /opt/homebrew/lib/ruby/gems/3.3.0/gems/irb-1.14.1/exe/irb:9:in `<top (required)>'
        from /opt/homebrew/lib/ruby/gems/3.3.0/bin/irb:25:in `load'
        from /opt/homebrew/lib/ruby/gems/3.3.0/bin/irb:25:in `<main>'
```
<br>

`pow`メソッドの場合、`(2.0).pow(-2)`とFloat型に対して実行するとエラーになります。

## おわりに

初歩的な内容でも、自分がうろ覚えなものであれば気にせずアウトプットしていきます。

### 参考

https://docs.ruby-lang.org/ja/latest/method/Integer/i/=2a=2a.html
２０２４参加イベントを振り返る　その１

おつかれさまです、みやもとです。

早いものでもう12月、1年の締めくくりの月になりました。
昨年初めてエンジニアコミュニティの存在を知りイベントに参加し、以降さまざまなイベントにお邪魔しては楽しい時間を過ごしてきたので、アドベントカレンダーのネタとして少し振り返りをしたいと思います。

## Connpassで参加イベントを調べる
まずはどんなイベントに参加したのかを調べます。
私はほぼConnpassからイベント申し込みをしているので、Connpassのプロフィールにある自分の参加イベントをさかのぼりました。

![event1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477580/b5965ebc-2069-541f-9383-8a9ef3b89f05.png)

1ページに10行表示されるので17ページ×10行。
今年初めて参加したのは最終行よりひとつ前にオンラインもくもく会があったので、+1して171のイベントに参加した計算となります。
実際には急な用事等でキャンセルしたものもありますが、DoorKeepeerや主催コミュニティのサイト等Connpass以外から申し込んだイベントも少ないながらあったので、まあ数としてはだいたい合っているでしょう。
さすがに1記事で振り返るには多い。

ひとまず今回は1月～4月ぐらいまでのイベントの中から特に印象に残ったものをピックアップして、覚えている範囲で簡単なレポートを書いていきます。

## バスチーともくもく会 in Mola Cafe
2月にTECH WOMAN KANSAIで開催したイベントです。
普段はオンラインで開催しているもくもく会をオフラインでやろう、ということで大阪のMola Cafeさんを会場にして開催しました。
顔を合わせて作業するのは何となく新鮮でしたね。

この頃はオフラインイベントの企画運営担当としてコミュニティに参加させていただいていたので、このイベントの企画にも携わっていました。
数少ない自分が運営側として参加したイベントなので、やっぱり印象に残っています。

https://tech-woman-kansai.connpass.com/event/309033/

この時は運営スタッフとしてちゃんとやらないと！という意気込みが強く、全体的には好評だったのですが予想もしなかったことが起こったり事前にこのあたりも詰めておけば良かったな…と思うこともいくつかあって、個人的には反省するところも大きかったイベントでした。
もし今後運営として参加することがあれば、この時の反省を生かしたいと思います。

## LINEを使ったLT会 #7
LINE Developer ComunityのオンラインLTイベントです。
#7とナンバリングされている通り恒例化していて、最新のイベントは#10となっています。

https://linedevelopercommunity.connpass.com/event/311378/

この回は初心者・初登壇歓迎ということで初めてLTに挑戦しました。
ちょうどこの少し前にコミュニティのオフラインMeetupに参加したこと、Pythonの勉強ついでに[LINEBOT](https://qiita.com/Mymt_aggw2208/items/8636e517ebec701c4563)を作っていたこと、何よりオンライン登壇ということで顔出し必須のオフライン登壇よりは緊張しなくて済むだろうということで、初めて発表用スライドを用意してあれこれお話させていただきました。
結局緊張はそれなりにしましたしアーカイブ映像も恥ずかしくて見られませんが、知り合いには割と好評で頑張ってよかったかもと思えました。

## 細かすぎて伝わらないLT会
もくもく会でお世話になっている三宮.devのLTイベントです。
この時はテーマ自由、お酒飲みながら話そう！ということで「ごくごく会」となっていました。
会場のHack.BARはTECH WOMAN KANSAIのイベントでお世話になったこともある、今ではおなじみのお店です。

https://kobe-sannomiya-dev.connpass.com/event/312030/

テーマ自由といううたい文句に偽りはなく、本当に自由なイベントでした。
一番印象に残っているのはガンダムに関するLTですね。
界隈はディープなファンが多い印象でしたが、印象にたがわず濃いお話を聞けてめちゃくちゃ楽しく過ごしました。

## 参加イベント主催コミュニティ

### TECH WOMAN KANSAI
関西を拠点に活動している女性エンジニアのためのコミュニティです。
習熟度や経験年数・技術に関する制限はなく、活動の主軸は女性エンジニア同士の交流とアウトプットの活発化。
女性向けのエンジニアコミュニティという存在に興味を持って参加させていただくようになりました。

https://tech-woman-kansai.connpass.com/

### LINE Developer Comunity
LINE APIを使った開発をする人のコミュニティです。
配信のハンズオンイベントや個人開発の成果発表等がメイン。
LINEBOTをいじり始めた頃にたまたま大きなオフラインイベントがあり参加させていただきました。

https://linedevelopercommunity.connpass.com/

### 三宮.dev
神戸三宮を拠点に活動しているエンジニアコミュニティです。
雰囲気はわりとゆるっとしていて、LT会やもくもく会がメインですがバーベキューとかやってることもあります。
地元密着っぽい雰囲気に惹かれて参加するようになりました。

https://kobe-sannomiya-dev.connpass.com/

## イベントの探し方
この時期はとにかくいろんなイベントに出てみよう、コミュニティも特に限定しないでいろんなところに行ってみよう、とあれこれ探していた時期でした。
Connpassで調べる時にも「Meetup」「勉強会」等、あまり技術を限定せずに検索をかけていた感じです。
その後、私の主な活動範囲である関西のイベントに限定して投稿してくれるXアカウントを発見してイベント探しがちょっと楽になりました。

https://twitter.com/cp_kansai_evts
【Recharts】複数のチャートを組み合わせて横向きに表示する

# はじめに
この記事では、React 向けのチャート（グラフ）ライブラリである **Recharts** を使い、複数のチャートを組み合わせて横向きに表示する方法を記載します。

https://recharts.org/en-US

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Next.js 14.2.4
- React 18.3.1
- TypeScript 5.5.2
- Recharts 2.13.2

# 表示するデータ
表示するデータは以下の通りです。
X軸に `uv`、`pv`、`amt` の値、Y軸に `name` の値を表示します。

```data.ts
export const data = [
  {
    name: "Page A",
    uv: 4000,
    pv: 2400,
    amt: 2400,
  },
  {
    name: "Page B",
    uv: 3000,
    pv: 1398,
    amt: 2210,
  },
  {
    name: "Page C",
    uv: 2000,
    pv: 9800,
    amt: 2290,
  },
  {
    name: "Page D",
    uv: 2780,
    pv: 3908,
    amt: 2000,
  },
  {
    name: "Page E",
    uv: 1890,
    pv: 4800,
    amt: 2181,
  },
  {
    name: "Page F",
    uv: 2390,
    pv: 3800,
    amt: 2500,
  },
  {
    name: "Page G",
    uv: 3490,
    pv: 4300,
    amt: 2100,
  },
];

```

# 横向きのチャートを実装する
縦向きのチャートを以下の記事で実装しているので、そちらとの相違点を整理しながら実装していきます。

https://qiita.com/Yasushi-Mo/items/cfb16b1f44059a24fc3d

## チャート全体のレイアウト
チャート全体のレイアウトは、`ComposedChart` の `layout` プロパティで指定します。`'horizontal'` と `'vertical'` の2種類存在し、デフォルト値は `'horizontal'` です。

https://recharts.org/en-US/api/ComposedChart

縦向きのチャートでは、デフォルト値通りで問題なかったですが、横向きのチャートでは、変更する必要があります。

```page.tsx
<ComposedChart width={800} height={450} data={data} layout="vertical">
```

## X軸・Y軸に表示する情報
縦向きのチャートでは、それぞれ以下の通りでした。

- X軸: `name` の値（カテゴリー）
- Y軸: `uv`、`pv`、`amt` の値（数値）

```page.tsx
<XAxis dataKey="name" />
<YAxis />
```

横向きのチャートでは、それらを入れ替える必要があります。

- X軸: `uv`、`pv`、`amt` の値（数値）
- Y軸: `name` の値（カテゴリー）

```page.tsx
<XAxis />
<YAxis dataKey="name" />
```

また、X軸・Y軸の軸の種類（`type`）には、`'number'` と `'category'` の2種類が存在します。
デフォルト値はそれぞれ以下の通りです。

- `XAxis`: `category`
- `YAxis`: `number`

https://recharts.org/en-US/api/XAxis

縦向きのチャートでは、デフォルト値通りで問題なかったですが、横向きのチャートでは、入れ替わるので、それぞれ props に追加する必要があります。

```page.tsx
<XAxis type="number" />
<YAxis type="category" dataKey="name" />
```

# 完成
完成したコードは以下の通りです。

```page.tsx
"use client";

import {
  Area,
  Bar,
  CartesianGrid,
  ComposedChart,
  Legend,
  Line,
  Tooltip,
  XAxis,
  YAxis,
} from "recharts";
import { data } from "../data";

export default function ComposedCharts() {
  return (
    <ComposedChart width={800} height={450} data={data} layout="vertical">
      <XAxis type="number" />
      <YAxis type="category" dataKey="name" />
      <Tooltip />
      <Legend />
      <CartesianGrid stroke="#f5f5f5" />
      <Area dataKey="amt" fill="#adffff" stroke="#7fbfff" />
      <Bar dataKey="pv" barSize={20} fill="#7fff7f" />
      <Line dataKey="uv" stroke="#ff7f7f" />
    </ComposedChart>
  );
}

```

Area Chart、Bar Chart、Line Chart を組み合わせたチャートが横向きに表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/16755364-0055-73a5-de5b-21560ea2afd8.png)


# 参照
- [ComposedChart](https://recharts.org/en-US/api/ComposedChart)
- [XAxis](https://recharts.org/en-US/api/XAxis)
- [YAxis](https://recharts.org/en-US/api/YAxis)
C言語　配列の練習

C言語の練習はpaiza.ioで行います

https://paiza.io/projects/RII2j9rl3eyeQ3SETm7Z9w

# C言語配列
## example01
* 配列ｄを宣言している
* 配列ｄの各要素へ代入した値を合計し出力している
```c 
#include <stdio.h>
int main(void){
    int d[10],sum;
    sum = 0;
    d[0]=1;
    d[1]=2;
    d[2]=3;
    d[3]=4;
    d[4]=5;
    d[5]=6;
    d[6]=7;
    d[7]=8;
    d[8]=9;
    d[9]=10;
    
    //演算部
    sum = d[0]+d[1]+d[2]+d[3]+d[4]+d[5]+d[6]+d[7]+d[8]+d[9];
    
    //値の出力
    printf("SUM = %d\n",sum);
}
```
`d[10]`の`ｄ`が配列名　`10`がサイズー＞要素の数
配列は変数を連続して扱う方法
個々の配列は`d[0]`のように`[]`ないに番号を付けて識別する
添え字は必ず`0`から始まる、したがって要素数が`10`の時は添え字は`0～9`となる


## example02
* 各要素の合計を計算する部分を`for`を用いた方法へ変更する
* 一般的にこのような処理には繰り返しを使う
```c
#include <stdio.h>
int main(void){
    int d[10],sum,i;
    sum = 0;
    d[0]=1;
    d[1]=2;
    d[2]=3;
    d[3]=4;
    d[4]=5;
    d[5]=6;
    d[6]=7;
    d[7]=8;
    d[8]=9;
    d[9]=10;
    //演算部
    for(i = 0 ; i < 10 ; i++){
        sum = sum + d[i];
    }
    //値の出力
    printf("SUM = %d\n",sum);
}
```
配列 `d[i]`の添え字部分は整数型の値である


## example03

* 入力部分も繰り返し処理に変更する
```c
#include <stdio.h>
int main(void){
    int d[10],sum,i; 
    
    sum = 0;
    
    //配列への入力部
    for(i = 0 ; i < 10 ; i++){
        d[i] = i + 1;
    }
    //演算部
    for(i = 0 ; i < 10 ; i++){
        sum = sum + d[i];
    }
    //結果の出力
    printf("SUM = %d\n",sum);
}
```

## example04
* 配列の初期化
```c
#include <stdio.h>
int main(void){
    //配列の宣言と初期化
    int d[10]={72,28,40,9,10,14,3,-8,77,11};
    int sum,i; 
    
    sum = 0;
    
  
    //配列の演算部
    for(i = 0 ; i < 10 ; i++){
        sum = sum + d[i];
    }
    //結果の出力
    printf("SUM = %d\n",sum);
}
```

配列は`{ }`で囲んだ値を初期化できる
`{ }`に記述された順番で要素0から順番に初期化される
例：`int d[10]={72,28,40,9,10,14,3,-8,77,11};`と初期化すると`d[5]`の値は`14`となる


## example05  検索

* 入力された値が配列に含まれるか調べる

:::note
__POINT__ 繰り返しとif文を組み合わせて配列の値を一つずつ調べる
:::

```c
#include <stdio.h>
int main(void){
    //配列の宣言と初期化
    int d[10]={72,28,40,9,10,14,3,-8,77,11};
    int key,i; 
    
    printf("検索値を入力\n");
    scanf("%d",&key);
    
    //配列の演算部
    for(i = 0 ; i < 10 ; i++){
        if(key == d[i]){
            printf("%dを発見しました\n",key);
        }
    }
}

```
【Ruby】コードを通してFile::Statの使い方を学ぶ

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
現在Fileクラスについて勉強していますが、その中でも`File::Stat`について解説していこうと思います。

この記事では、`File::Stat` クラスを使ったファイル属性の取得方法や、代表的なインスタンスメソッドの使い方をわかりやすく紹介します。

# `File::Stat`とは？
`File::Stat` は、ファイルやディレクトリに関する属性（サイズやタイムスタンプ、権限など）を取得するためのクラスです。
Rubyでは以下のように `File.stat` クラスメソッドを使って `File::Stat` のインスタンスを取得できます。
```ruby
stat = File.stat("example.txt")
```
ここで得られる `stat` は `File::Stat` クラスのインスタンスであり、さまざまな情報を取得できるメソッドが用意されています。

## 基本的な使い方
まずは `File::Stat` を使った簡単な例を見てみましょう。
```ruby
filename = "example.txt"

# ファイルを作成
File.write(filename, "Rubyでファイル属性を取得する練習")

# ファイルの属性を取得
stat = File.stat(filename)

# 属性を確認
puts "ファイルサイズ: #{stat.size} バイト"
puts "最終更新日時: #{stat.mtime}"
puts "読み取り可能: #{stat.readable?}"
puts "書き込み可能: #{stat.writable?}"
puts "実行可能: #{stat.executable?}"
```
出力はいかの通りです
```ruby
ファイルサイズ: 27 バイト
最終更新日時: 2024-11-24 12:00:00 +0000
読み取り可能: true
書き込み可能: true
実行可能: false
```

### 代表的な`File::Stat`のメソッド
以下は、`File::Stat` クラスでよく使われるインスタンスメソッドの一覧です。
| 　メソッド名　| 説明                                                          | 
|:-------------|:-------------------------------------------------------|
| `size`       |ファイルのサイズ（バイト数）を返す    |
|  `file?`    |通常ファイルであれば true を返す                           |
|`directory?` | ディレクトリであれば true を返す                      |	
|`readable?` |  読み取り可能であれば true を返す                  |	
|  `writable?`   | 書き込み可能であれば true を返す              |  
| `executable? `   |	  実行可能であれば true を返す |  
| `atime `   |	最後にアクセスした時刻を返す   |  
| `mtime `   |	最後に内容を変更した時刻を返す   |  
| `ctime `   |	メタデータを最後に変更した時刻を返す   |  
| `mode `   |	ファイルモード（パーミッション情報）を返す   |  
| `uid `   |ファイル所有者のユーザーIDを返す	   |  
| `gid `   |ファイル所有者のグループIDを返す	   |  

## ファイルモードを操作する例
次に、`File::Stat` を使ってファイルのモード（権限）を取得し、変更する方法を紹介します。
以下の例では、既存のファイルに実行権限を追加します。
```ruby
filename = "example.txt"
stat = File.stat(filename)

# 現在のファイルモードを取得
puts "現在のモード: #{stat.mode.to_s(8)}"

# 実行権限を追加
File.chmod(stat.mode | 0111, filename)

# 更新後のモードを確認
stat = File.stat(filename)
puts "更新後のモード: #{stat.mode.to_s(8)}"
```
出力例は以下の通りです
```ruby
現在のモード: 100644
更新後のモード: 100755
```
コードの解説は以下の通りです
* ファイルモード（パーミッション）
ファイルモードは 8 進数で表され、100644 は通常の読み書き可能なファイル、100755 は実行権限が追加されたファイルを表します。

* `File.chmod`
ファイルの権限を変更するメソッドです。上記の例では `|` 演算子を使い、既存のモードに実行権限を追加しました。

この方法を活用することで、スクリプト内で柔軟にファイル権限を変更できます。

# まとめ
`File::Stat` は、ファイルやディレクトリの属性を簡単に取得できる強力なクラスです。
特に、ファイルモードやタイムスタンプの取得、パーミッションの確認など、ファイル操作において非常に便利です。

今後は、この記事で取り上げた `File.chmod` や、ファイルのパーミッションに関連する詳細な操作についても解説記事を書く予定ですので、ぜひ楽しみにしていてください！
WordPressに関する興味深い事実

![wordpress-589121_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771407/51ab9e0c-ad54-b3b9-64ce-fb48d73a0f63.jpeg)

WordPressは、現在最も人気のあるコンテンツ管理システム（CMS）の1つであり、世界中のウェブサイトの構築に広く利用されています。ここでは、WordPressに関する興味深い事実をいくつかご紹介します。

1. 世界中のウェブサイトの43%以上がWordPressを使用
最新の統計によると、全世界のウェブサイトの約43%がWordPressを基盤にしています。その汎用性と使いやすさから、個人ブログから大規模な企業サイトまで幅広く利用されています。

2. オープンソースで誰でも無料で利用可能
WordPressはオープンソースソフトウェアであり、誰でも無料で利用・改良できます。この仕組みは、開発者コミュニティによる継続的な改善を促進し、幅広い拡張性を可能にしています。

3. プラグインとテーマの豊富な選択肢
WordPressには50,000以上の無料プラグインと数千のテーマが提供されています。これにより、ユーザーは簡単に機能を追加したり、デザインをカスタマイズすることができます。

4. 有名なウェブサイトもWordPressを利用
世界的に有名な企業や団体もWordPressを採用しています。例えば、以下のようなサイトがWordPressで構築されています：

ディズニー
BBCアメリカ
ホワイトハウス（アメリカ政府公式サイト）
5. 多言語対応が容易
WordPressは多言語対応をサポートしており、プラグインを使うことで簡単に多言語サイトを構築できます。そのため、国際的なビジネスにも適しています。

6. ブログとしてスタート
WordPressは2003年にブログプラットフォームとしてスタートしました。当初はブログ用途が主でしたが、現在ではECサイト、ポートフォリオ、SNSなど、多種多様な用途に対応しています。

7. コミュニティが活発
WordPressは世界中に広がるユーザーと開発者コミュニティを持っています。毎年「[Cargo Indonesia ke Jepang](https://www.cargojepang.com/)」というイベントが世界各地で開催され、ユーザーが知識を共有したり、最新の技術を学ぶ機会を提供しています。

8. セキュリティアップデートが頻繁
オープンソースであるため、WordPressは脆弱性が指摘されることもありますが、開発チームは迅速にセキュリティアップデートを提供しています。最新のバージョンを利用することで、安全にサイト運営が可能です。

結論
WordPressは、その柔軟性、使いやすさ、そして活発なコミュニティによって、ウェブサイト構築の分野で他の追随を許さない存在となっています。これからも進化を続けるWordPressは、初心者からプロの開発者まで、誰にとっても魅力的なツールであり続けるでしょう。

WordPressに関する興味深い事実と知られざる機能
WordPressは、非常に多機能で柔軟性が高いCMSですが、知られていない機能や使い方がいくつかあります。以下に、あまり知られていないWordPressの機能を紹介します。

1. カスタムポストタイプ
WordPressでは、標準の投稿やページに加えて「カスタムポストタイプ」を作成することができます。この機能を使えば、ブログ記事や静的ページ以外のコンテンツも簡単に管理でき、オンラインショップやポートフォリオ、レビューサイトなど、さまざまなタイプのコンテンツを扱えるようになります。

2. サイトのアクセス解析ツール「Jetpack」
Jetpackは、WordPress公式のプラグインで、サイトのセキュリティ、パフォーマンス向上、アクセス解析などをワンパッケージで提供します。特に、訪問者数、人気の投稿、ユーザーの行動などを可視化できるアクセス解析機能が便利です。

3. ダッシュボードのカスタマイズ
WordPressでは、管理者用ダッシュボードのインターフェースをカスタマイズできます。不要なウィジェットを非表示にしたり、自分のサイトに合わせたデザインや機能を追加したりすることで、より効率的に作業できるようになります。

4. サイト内検索機能の拡張
WordPressの標準の検索機能はシンプルですが、カスタム検索機能を追加することで、より詳細な検索結果を提供することができます。たとえば、カスタムフィールドやタグに基づいて検索結果を絞り込むことが可能になります。

5. パスワード付きページの作成
WordPressでは、投稿やページにパスワードを設定することができます。この機能を使えば、特定のユーザーにだけアクセスを許可したり、非公開で一時的にコンテンツを公開したりすることができます。

6. REST APIによるデータ操作
WordPressはREST APIをサポートしており、これを使うことで、外部アプリケーションや他のウェブサイトからWordPressサイトのデータを操作することができます。これにより、モバイルアプリや他のシステムとの連携が容易になり、サイトの機能を拡張することが可能です。

7. バージョン管理
WordPressでは、記事やページの更新履歴を追跡できる「リビジョン管理」機能があります。これにより、過去の編集内容に戻すことができ、誤って変更した内容をすぐに復元することができます。

8. マルチサイト機能
WordPressには、複数のウェブサイトを1つのインストールで管理できる「マルチサイト」機能があります。これを使えば、異なるテーマやプラグインを使った複数のサイトを一元管理でき、複数のドメインを持つ場合などに便利です。

9. ウィジェットでのカスタマイズ
WordPressでは、ウィジェットを使ってサイトのサイドバーやフッターに簡単にコンテンツを追加することができます。例えば、最新の投稿、カレンダー、検索バー、ソーシャルメディアリンクなどをウィジェットで追加することで、サイトの機能性を高めることができます。

10. 自動更新機能
WordPressは、セキュリティアップデートやマイナーな修正を自動的にインストールする機能を持っています。この機能を有効にすることで、サイトを常に最新の状態に保ち、セキュリティリスクを減らすことができます。

結論
WordPressは単なるブログ作成ツールではなく、さまざまな機能を備えた強力なコンテンツ管理システムです。この記事で紹介した知られざる機能を活用すれば、ウェブサイトの管理や運営がさらに効率的かつ効果的になります。
IPアドレスの仕組みを学ぼう：サブネットマスクのビット数は任意の数値を設定できないか

サブネットマスクのビット数は任意の数値を設定できるわけではなく、**特定のルールに従う必要があります**。以下にその理由と設定のルールを説明します。

---

### **1. サブネットマスクのビット数のルール**
- サブネットマスクのビット数は **0～32の範囲** で指定します。
  - `0`ビット: IP全体がホスト部分（使用可能なIP全体）
  - `32`ビット: 1つのIPアドレス（特定のホストのみ）
- 一般的なAWSの利用では、`/16`～`/28`が主に使用されます。

---

### **2. サブネットマスクのビット数とIPアドレスの範囲**
ビット数を増やすと、ネットワーク部分が増え、利用可能なホスト数が減ります。次に例を挙げます。

| ビット数 (CIDR) | ホスト部分のビット数 | 使用可能なIP数 (ネットワーク/ブロードキャストを除く) |
|-----------------|--------------------|---------------------------------------|
| `/16`           | 16ビット            | 65,534個                              |
| `/24`           | 8ビット             | 254個                                 |
| `/28`           | 4ビット             | 14個                                  |

**ポイント:**  
ビット数が大きいほど、IPアドレス範囲が狭くなります。AWSでは、ネットワーク設計に応じて適切な範囲を選択する必要があります。

---

### **3. 任意のビット数を選択できない理由**
1. **2進数ベースの計算**  
   IPアドレスは2進数で管理されているため、ホスト部分のサイズは \( 2^n \) の単位になります。つまり、サブネットマスクは「連続したビット数」を使用する必要があります。

2. **アドレス整合性**  
   例えば、`/25`ならば、IP範囲は必ず`192.168.1.0～192.168.1.127`のように、計算上の整合性が保たれます。

---

### **4. 設定例**
- **CIDRブロック: `10.0.0.0/16`**
  - 全体で65,536個のIPアドレスを管理。
  - サブネット例:
    - `/24`: `10.0.1.0 ～ 10.0.1.255`（254 IP）
    - `/28`: `10.0.1.0 ～ 10.0.1.15`（14 IP）

- **不正な例:**
  - `10.0.1.0/23.5`のような非整数のビット数や、
  - ホスト数が \( 2^n \) の単位にならないビット設定。

---

:fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks:
### **その他：AWSでのサブネットマスク設定の制限**
AWSではVPCやサブネットを設計する際、以下の制限があります：
- **VPC全体のCIDRブロック**: `/16`～`/28` の範囲で指定可能。
- **サブネットのCIDRブロック**: VPCのCIDR範囲内で、より狭い範囲を指定。
  - 例えば、VPCが`10.0.0.0/16`の場合、サブネットには`10.0.1.0/24`や`10.0.2.0/24`を設定可能。

:fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks::fireworks:


---

### **まとめ**
サブネットマスクのビット数は、2進数ベースの規則に従い、**0～32の整数**で指定する必要があります。AWSでは一般的に`/16`～`/28`が使用されます。計画時は、ネットワークの規模や構造に合わせて適切なビット数を選びましょう。
【SQL】char型とvarchar型の違いのまとめ

### 簡単な結論
あらかじめ用意した箱のサイズに合わせて中身を入れるか、箱の中身のサイズに合わせて用意するかの違いである

### CHAR型
・`固定長の文字列`を扱うデータ型
・CHAR（10）と指定されている場合、10バイトの領域が確保されており、常に格納するデータは10バイトになる
・10バイトに満たない場合、空白が追加される
例）CHAR(3)の箱に【男性】
男性□

### VARCHAR型
・`可変長の文字列`を扱うデータ型
・`CHAR型`と異なり、文字列の長さは調整されない
・VARCHAR(10)としていされた列に3バイトや7バイトの文字列が入力された場合、それに合わせた領域が確保される
・VARCHAR(10)としている場合、11バイト以上の文字列は格納できない

### 使い分け
□CHAR型
`郵便番号`や`社員番号`など

□VARCHAR型
`氏名`や`書籍名`など

### 参考書籍
すっきりわかるSQL入門
IPアドレスの仕組みを学ぼう：ネットワークアドレスとブロードキャストアドレスを理解する

ネットワークアドレスとブロードキャストアドレスは、IPアドレス範囲を管理するうえで重要な特別なアドレスです。それぞれの役割を以下に説明します。

---

### **1. ネットワークアドレスとは？**
- **概要**:  
  ネットワーク内の特定のサブネットを表すアドレスで、ホスト部分がすべて `0` の状態です。  
  このアドレスは**ネットワーク自体を指す識別子**として使われます。
  
- **用途**:  
  ネットワークを識別するためのアドレスで、データ送信には使用されません。

- **例**:  
  CIDRブロックが `192.168.1.0/24` の場合、ネットワークアドレスは `192.168.1.0` です。

---

### **2. ブロードキャストアドレスとは？**
- **概要**:  
  同じネットワーク内のすべてのホストにデータを送信するための特別なアドレスで、ホスト部分がすべて `1` の状態です。

- **用途**:  
  **ネットワーク内の全ホストへ一斉にデータを送信する**（ブロードキャスト）ために使用されます。

- **例**:  
  CIDRブロックが `192.168.1.0/24` の場合、ブロードキャストアドレスは `192.168.1.255` です。

---

### **3. ネットワークアドレスとブロードキャストアドレスの例**
以下は CIDR ブロックが `192.168.1.0/24` の場合を考えた例です：

| 用途                     | アドレス範囲              | ホスト部分             |
|--------------------------|--------------------------|------------------------|
| **ネットワークアドレス** | `192.168.1.0`            | すべて `0`             |
| **使用可能なホスト**      | `192.168.1.1` ～ `192.168.1.254` | ホスト部分が自由         |
| **ブロードキャストアドレス** | `192.168.1.255`          | すべて `1`             |

---

### **4. ネットワークアドレスとブロードキャストアドレスを計算する方法**
1. **ネットワークアドレス**：
   - IPアドレスを2進数に変換。
   - サブネットマスクのビット数分だけネットワーク部分を固定し、ホスト部分をすべて `0` にする。
   
2. **ブロードキャストアドレス**：
   - ネットワークアドレスを基準に、ホスト部分をすべて `1` にする。

#### **例：CIDRブロック `192.168.1.0/24`**
- ネットワークアドレス: `192.168.1.0` (ホスト部分が `00000000`)
- ブロードキャストアドレス: `192.168.1.255` (ホスト部分が `11111111`)

---

### **5. 使用可能なIPアドレス**
ネットワーク内で実際にホストに割り当てられるIPアドレスは、**ネットワークアドレスとブロードキャストアドレスを除いた範囲**になります。  
上記の例では、`192.168.1.1` から `192.168.1.254` までが使用可能なIPアドレスです。

---

### **まとめ**
- **ネットワークアドレス**: ネットワーク全体の識別子（データ送信には使用しない）。  
- **ブロードキャストアドレス**: ネットワーク内のすべてのホストに一斉送信するためのアドレス。

これらはサブネット設計やIPアドレス管理において不可欠な要素です。
Windows WSL で Linux 開発環境構築: Winget と VS Code を活用したセットアップ

# Windows WSL で Linux 開発環境構築: Winget と VS Code を活用したセットアップ

Windowsで快適な Linux 開発環境を構築するために、以下のツールを使用します。

- Windows Terminal: さまざまなシェルを統一的に管理できるモダンなターミナル
- Winget: Microsoft公式のパッケージマネージャー
- WSL (Windows Subsystem for Linux): Linux環境をWindows上で利用
- VS Code (Visual Studio Code): 高機能エディタ

この記事では、 Windows Terminal を使用して、 Winget でこれらをセットアップする方法を解説します。

## 1. Windows Terminalのインストール

### Windows Terminalとは？

Windows Terminalは、PowerShell、コマンドプロンプト、WSLなどの複数のシェルを統合して利用できる最新のターミナルアプリケーションです。

### インストール手順

1. [Microsoft Store](https://apps.microsoft.com/detail/9n0dx20hk701) を開きます
2. 検索ボックスで「Windows Terminal」を検索
3. インストールボタンをクリックしてインストールします

## 2. Windows Terminalを管理者権限で実行する

一部のコマンド（WSLのインストールやWingetを利用したシステムレベルの操作）には管理者権限が必要です。

### 管理者権限でWindows Terminalを起動する方法

1. スタートメニューを開き、「Windows Terminal」と検索
2. 結果一覧に表示された「Windows Terminal」を右クリック
3. メニューから「管理者として実行」を選択

管理者権限で実行中のターミナルは、ウィンドウのタイトルバーに「管理者:」と表示されます。

## 3. Winget の準備

### Winget とは？
Winget（Windows Package Manager）は、Microsoftが提供する公式のパッケージマネージャーです。CLI（コマンドライン）を使って簡単にアプリケーションをインストール・管理できます。

### Winget の確認
Windows 10 バージョン 1809以降のシステムでは、 Winget は「App Installer」として事前インストールされていることが多いです。以下のコマンドで確認できます。

```powershell
winget --version
```

もしWingetがインストールされていない場合、以下の手順でインストールしてください。

### Microsoft StoreからApp Installerをインストール

1. [Microsoft Store](https://apps.microsoft.com/detail/9nblggh4nns1)を開き、「App Installer」を検索
2. インストールを実行

### Windows Updateで最新状態にする

Wingetが使用できない場合は、Windows Updateで最新の状態にしてください。

## 4. Gitのインストール

[Git](https://git-scm.com/downloads/win) の インストール

```powershell
winget install --id Git.Git -e --source winget
```

## 5. WSLのインストール

### WSLとは？

WSL（Windows Subsystem for Linux）は、Windows上でLinux環境を利用できる機能です。開発に必要なLinuxコマンドやツールを直接使用できます。

### インストール手順

以下のコマンドを実行してWSLをインストール:

```powershell
wsl --install
```

これにより、WSLとUbuntu（デフォルト）が自動的にインストールされます。
インストールが完了したら、以下のコマンドでWSLのバージョンを確認します。

```powershell
wsl --version
```

## 6. Visual Studio Codeのインストール

Wingetを使用して、VS Codeをインストールします。

```
winget install --id Microsoft.VisualStudioCode
```

さらに、WSL内のLinux環境を直接操作するために、VS Code 拡張機能の [WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl
)をインストールします。

```powershell
code --install-extension ms-vscode-remote.remote-wsl
```

## 7. VS CodeでWSLに接続する

VS Codeの拡張機能でWSLにアクセスすることによって、VS CodeからLinux環境で直接開発を行います。

1. スタートメニューで「Visual Studio Code」と検索
2. 検索結果を右クリックし、「管理者として実行」を選択
3. 「Ctrl + Shift + P」を押して、検索窓に「WSL」と入力し、「Remote-WSL: Connect to WSL」コマンドを選択

WSLに接続されるので、任意のフォルダーを開いて開発することができます。
【Suno AIでつくった楽曲】声でつながるAIとの対談: 挿入曲 #3【動画 3分31秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ 声でつながるAIとの対談_ 挿入曲 #3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/134d3b57-5042-0ea5-0ee5-a14c87622ceb.png)




* # 動画URL
    * https://youtu.be/PHxfxL_IgNc

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】声でつながるAIとの対談: 挿入曲 #3【動画 3分31秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-11-24(日)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

“声でつながるAIとの対談”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao
👆の挿入曲としてつかう予定です。

ぜひ聴いてみてください。
そして、ぜひみなさんも、ご自身の対談、番組、コンテンツのために楽曲をつくってみてください！

作曲日:
2024-11-20(水)

Suno AI 契約の種類:
Pro Plan

Suno AI Version:
v4

楽曲の正式名称:
声でつながるAIとの対談: 挿入曲 #3 - AI Voice Talks: Minimal Melody #3

Suno AI Library URL:
https://bit.ly/AI-Voice-Talks-Minimal-Melody-03

Custom Mode: On

Audio Inputs: Not Used

Instrumental:


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Jazz][Piano][Bass][Ballad][220 Seconds][Break][Outro]


🇯🇵日本語訳

[ジャズ][ピアノ][ベース][バラード][220秒][ブレイク][アウトロ]


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“声でつながるAIとの対談”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4fCLetC
VimでHTMLをプレビューしながらコーディング

## はじめに

本記事はプロもくチャット Adevent Calendar2024の7日目です

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

## やりたいこと

VimでHTMLを編集しつつ、ブラウザにリアルタイムで反映させたい

## TL;DR

**[Browsersync](https://www.browsersync.io/)を立ち上げればOK**
以上🫡

<iframe width="560" height="315" src="https://www.youtube.com/embed/BMPH2fGqA9c?si=AKjHfWy7KEmksB4N" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## やり方

1. [Browsersync](https://www.browsersync.io/)をインストールする

```bash
npm install -g browser-sync
```

2. HTMLファイルを置いたプロジェクトに移動して、以下のコマンドを実行する

```bash
browser-sync start --server --files "**/*.html"
```

1. ブラウザが`http://localhost:3000`で立ち上がるので、
Chromeのアドレスバーから対象となるHTMLファイルを指定
    ![](https://i.gyazo.com/53850c2c334f1f06104f650b79efe5fa.png)

1. あとはVimを立ち上げて、HTMLファイルを編集すればOK

:::note info
Vimは`browser-sync`とは異なるウィンドウで実行すること
:::    

## 実行しやすい環境を整える

### ✅️ エイリアス設定

シェルの設定ファイル(`.bashrc`など)に`browser-sync`のエイリアスを設定

```bash:.bashrc
# browser-sync
alias bs='browser-sync start --server --no-open --files "**/*"'
```

ターミナル上で`bs<Enter>`と入力すれば`browser-sync`が立ち上がる
```bash
# エイリアスでbrowser-syncを実行
bs
> [Browsersync] Access URLs:
>  -----------------------------------
>        Local: http://localhost:3000
>     External: http://10.0.214.4:3000
>  -----------------------------------
>           UI: http://localhost:3001
>  UI External: http://10.0.214.4:3001
>  -----------------------------------
> [Browsersync] Serving files from: ./
> [Browsersync] Watching files...
```

### ✅️ Vimからブラウザを開く

現在のファイルパスを指定してブラウザを開く関数を`.vimrc`に追加する

```vim:.vimrc
" Gitリポジトリのルートディレクトリからの相対パスをローカルホストのURLに変換してChromeで開く
function! OpenLiveServer()
  let l:relative_path = substitute(system('git rev-parse --show-toplevel'), '\n', '', 'g') . '/'
  let l:current_file = expand('%:p')
  let l:url = 'http://localhost:3000/' . substitute(l:current_file, l:relative_path, '', '')
  execute '!open -a "Google Chrome" ' . shellescape(l:url)
endfunction

command! OpenLiveServer call OpenLiveServer()
```

Vimで対象のファイルを開いた状態で`:OpenLiveServer`と入力すれば  
ローカルホスト経由のファイルをChromeで開くことができる

```bash
:OpenLiveServer
```

:::note info
Browsersync用の相対パスを生成するため
ファイルはGit管理されていることを前提としています🙏
:::
バッチファイルでゲームを作りたい🥺

###### 皆さん、どうも初めまして！
ハリネズミです。初めての投稿です...！
記事も書き慣れていないペーペーな大学生ですが、よかったらどうか見てやってください:bow_tone1:

以前よりコーディングをするうえで行き詰まったりしたら、よくQiitaを覗いていました:rolling_eyes:
私にはプログラミングをしている中で、ﾁｮｺっとした夢があります。
### バッチファイルでゲームを作りたい！！

これまた始まりました。なーんでもっとC#とかPythonとか言語いっぱいあるのに。
なんと理由、あります:skull:

それは今から約10年前...くらい
小学校でコンピューター室たるものが出来まして・・・機械！ロボット！そういうの大好き男子たちはみんなこぞって学校のPCをこねくり回します。
ですが先生の使うPCはみんなのPC画面を管理してるので、、あしからず...:thinking:
そこでわたくし齢十数才、ひらめきました

**先生のPCを遠隔でシャットダウンしてやろう:zap:**

天啓でした。当時YouTubeで「[【悪戯厳禁】人のPCを遠隔でシャットダウンする方法](https://youtu.be/Cheggnyc58E?si=MNq6V6l0aPhNvz3p)」というなんとも物騒なタイトルの動画を発見し、さっそく実践。
反省文を書いた右手の側面が見たこともないくらい真っ黒だった記憶しかありません:pencil::punch_tone5:

長い昔話はここまで、それが私が**初めて**触れた言語でした。

なんとなく、思い出深い言語 というのもあるのですが、この言語で大規模なゲーム制作をしている同志を見かけたことがなかったので、未開の地を開拓したいという思いが大きかったです
このQiitaで沢山の方や、同じ考えを持つ方と交流が出来たらな と思っています！

長くなりましたが、基本独学でコードを書いているため:sob:本来は人に見せられたものではないコードばかりなのですが、せっかくQiitaを使うなら！ということで備忘録として自分の作業の進捗を気ままに投稿しようかなと思ってます！

もしこの記事を見に足を運んでくださったそこのあなたさま！見てくださりありがとうございました:bow_tone1:
stylyでvr その2

# 概要
stylyでvrやってみた。
ギャラリー漁ってみた。

# かぼちゃが生まれる。

https://gallery.styly.cc/scene/e9f61d45-b592-47bc-a6ac-82310d6850f4

# パヒュームが踊る。

https://gallery.styly.cc/scene/512010d0-54b9-4813-82a6-b0f447e1ec41


# 日付でイベント。

https://gallery.styly.cc/scene/e68a694d-12d8-49f2-afd7-1733c0807c49

# デモ。

https://gallery.styly.cc/scene/c04122f0-aefc-4e61-9202-2389cc1553a9

# 会津大。

https://gallery.styly.cc/scene/a38b5f3e-c63d-41cf-a7d2-337f6e4f5061

# 花笠音頭。

https://gallery.styly.cc/scene/724f65ba-0895-40e3-b6b9-fa34c25f1f00

# 花火。

https://gallery.styly.cc/scene/73a790e8-0b4e-4193-bf5e-97bd2ba8b4d6

# オーロラ。

https://gallery.styly.cc/scene/f77c2190-1a66-422d-bc3a-c2354048b5dd

# urlに飛ぶ。

https://gallery.styly.cc/scene/2f4f73b5-32d0-4dd6-b25b-9cd8c386e1d6

# 湯婆婆。

https://gallery.styly.cc/scene/72bcdfdb-334e-4f25-b6c6-0b71632d3f70

# ドライブ。

https://gallery.styly.cc/scene/b65d9ac6-740c-4c46-bd50-6122fc2f6851

# ライブ。

https://gallery.styly.cc/scene/d45c0e6c-5c3c-4cf5-8a3e-b6c9a3d4ed1a

# yorukake

https://gallery.styly.cc/scene/4f64614b-a87b-4aab-a63f-bc98db1e87cf

https://gallery.styly.cc/scene/2ce57dc9-b189-4c64-88f9-548d9c72e097

https://gallery.styly.cc/scene/53243277-d6ec-42a0-8935-b00444758e30

https://gallery.styly.cc/scene/b62c21e4-e59c-4572-9274-5843cadc2d0e

https://gallery.styly.cc/scene/013fdc55-0186-4496-b666-2073314622e8

https://gallery.styly.cc/scene/966c284a-2961-42f6-b412-5d2fb968e750

https://gallery.styly.cc/scene/aa32e59c-f222-4535-b318-c0e67c28e34a

https://gallery.styly.cc/scene/17fa7d68-51cd-4172-b325-77a6fac0c84a

https://gallery.styly.cc/scene/128d9242-1aaa-4fb9-927a-a16cd8bf7256

https://gallery.styly.cc/scene/e9522491-6f99-4089-9e96-bb925f1b15ec

# サイゼリア

https://gallery.styly.cc/scene/964394ba-1c9b-40d5-b58d-04a58731997e

以上。
【単一責任の原則】汚いコードを書かないための考え方

# はじめに

こんにちは、未経験エンジニア3年目の嶋田です。

今回は、**単一責任の原則**(Single Responsibility Principle、以下SRP)についてまとめたいと思います。

Railsのプロジェクトを進める中で、実装をしながら自分のコードがどんどん汚くなり、リファクタリングが必要になった際、先輩エンジニアから「単一責任の原則」という考え方を教えてもらいました。  
この原則を知ってから、コードを改善するための重要な観点として意識し始めたのですが、理解して適用することに苦労しました。

この記事では、自分の経験を踏まえ、SRPについて整理し、具体的な適用例を備忘録としてまとめてみました。
同じように設計で悩む方の参考になれば幸いです。

## 目次
- [単一責任の原則（SRP）とは](#単一責任の原則srpとは)
- [責任が曖昧なコードの例](#責任が曖昧なコードの例)
- [SRPを適用したリファクタリング](#srpを適用したリファクタリング)
  - [1. 責任を分割したクラス設計](#1-責任を分割したクラス設計)
  - [2. 各クラスの責任範囲](#2-各クラスの責任範囲)
- [SRP適用後のメリット](#srp適用後のメリット)
- [まとめ](#まとめ)



## 単一責任の原則（SRP）とは

**単一責任の原則（Single Responsibility Principle）**は、SOLID原則の一つで、クラスが「一つの責任」に集中すべきであることを定義します。

### 定義
> **クラスは「変更する理由」が一つだけであるべき**

具体的には、クラスが複数の責任を持つと、以下のようなリスクが発生します。

- 責任ごとの変更が互いに影響し、デバッグや開発が困難になる
- クラスが肥大化し、理解が難しくなる
- テストが複雑化し、管理コストが増加する


## 責任が曖昧なコードの例

以下は、SRPが適用されていないコード例です。
1つのクラスに複数の責任が含まれていて、変更や保守が難しくなっています。

```ruby
class UserManager
  def initialize(user)
    @user = user
  end

  def authenticate(password)
    # ユーザー認証
  end

  def update_profile(params)
    # プロフィール更新
  end

  def send_notification(message)
    # 通知を送信
  end
end
```

このクラスには以下の責任が含まれています。

1. ユーザーの認証
2. プロフィールの更新
3. 通知の送信

一見便利に見えますが、以下の問題が発生しやすいです。

- **変更が影響を及ぼすリスク**：例えば、通知機能の変更が認証機能に影響を与える可能性がある
- **可読性の低下**：責任が増えるにつれて、コードが複雑化する
- **テストの困難さ**：テストケースが増え、メンテナンスが難しくなる


## SRPを適用したリファクタリング

### 1. 責任を分割したクラス設計

上記のコードをSRPに基づいてリファクタリングし、責任を分割した設計に改善します。

```ruby
class UserAuthenticator
  def initialize(user)
    @user = user
  end

  def authenticate(password)
    # ユーザー認証
  end
end

class UserProfileUpdater
  def initialize(user)
    @user = user
  end

  def update(params)
    # プロフィール更新
  end
end

class NotificationSender
  def initialize(user)
    @user = user
  end

  def send(message)
    # 通知を送信
  end
end
```

### 2. 各クラスの責任範囲

| クラス名               | 責任                                                                 |
|------------------------|--------------------------------------------------------------------|
| **UserAuthenticator** | ユーザー認証処理を担当                                               |
| **UserProfileUpdater**| ユーザープロフィールの更新                                           |
| **NotificationSender**| ユーザーへの通知送信処理を担当                                       |


## SRP適用後のメリット

このリファクタリングを行ったことで、以下のようなメリットがあります。

1. **変更に強い設計**  
   例えば認証処理を変更しても、通知処理やプロフィール更新処理に影響を与えない

2. **可読性の向上**  
   各クラスが持つ責任が明確になるため、新しい開発者がコードを理解しやすくなる

3. **テストの容易さ**  
   責任ごとにテストを作成できるため、単体テストが簡単かつ独立して行うことができる


## まとめ

単一責任の原則（SRP）は、コードの保守性と拡張性を高めるための重要な設計指針です。
今回を振り返ると、以下の点がポイントでした。(実際コードを書くときにスラスラと意識しながらできるようになりたいです…🥲)

1. クラスを1つの責任に集中させることで、変更や拡張に強くする
2. 複数の責任を持つクラスを分割し、それぞれ独立させる
3. 具体的な課題に対してもSRPを意識することで、設計の質を向上させる

私自身まだまだ勉強中なので、何か問題がありましたらぜひコメントで教えてください！
単一責任原則はSOLID原則のひとつに過ぎないので、他の原則についても学びを深め、自分のものにして綺麗なコードが書けるように頑張りたいです。

最後まで読んでいただき、ありがとうございました！
VSCodeでUbuntuを使う

### 概要

VSCodeからWSLやUbuntuを使うための手順についての投稿

### 前提条件

Windowsストアなどから、WSLやUbuntuがダウンロード、インストールされておりWSLの有効化が既にされている。

### 環境構築手順

①VSCodeを開く
②左端の「Extention」から拡張機能「WSL」を有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926100/7aed8e78-01dc-a5ea-6903-90d4d22442df.png)
③VSCODE左下の緑色のマークをクリック、上部に出てくるプルダウンから「Connect to WSL Using Distro...」をクリックし使いたいUbuntuのバージョンを選択。(ない場合は「+Install New」から必要なものをインストール)
④TERMINALでUbuntuが使えるようになっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926100/d73d451f-7dd1-6e7a-d058-5a8f6cd3d3e3.png)


### VSCodeのUbuntuでLinuxコマンドを使用して動作確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926100/ef198ba8-5782-7e23-a9b4-cadf071c5768.png)
Excelで使うスクリプト言語は何がいいか

最近Excelを使ってツールを作ってそれを納品するということがあったので、改めてこれを考えてみた。

前提として、Excel使用者が作業を効率化するなどの目的で、Excelを一種の業務効率化アプリとすることが目的です。
実行環境が整えられないので、ウェブ系のツールはNG、使用者がプログラマではないのでコマンドライン系もNGです。

考えられる候補は以下の3つだと思います。
- [Python in Excel](https://support.microsoft.com/ja-jp/office/python-in-excel-%E3%81%AE%E6%A6%82%E8%A6%81-55643c2e-ff56-4168-b1ce-9428c8308545)
- [Officeスクリプト](https://learn.microsoft.com/ja-jp/office/dev/scripts/overview/excel)
- [VBA](https://learn.microsoft.com/ja-jp/office/vba/library-reference/concepts/getting-started-with-vba-in-office)

# 主観に基づく比較表

|項目|Python in Excel|Officeスクリプト|VBA|
|:---|:---|:---|:---|
|安定感|×|◎|◎|
|理解しやすさ|Pythonがわかれば概ね◯|JS、TS、GASに慣れていれば概ね◯|個人的に×|
|プログラミング幸福度|◯|◯|×|
|共有性|PF差異があるので×|プラン差異があるので×|セキュリティによるので△|
|テストしやすさ|×|◯|×|

# それぞれの説明

## Python in Excel

https://qiita.com/tomgoodsun/items/9b6ea92dc3e2c26e70fe

詳しくは上記に記載していますが、以下の点から実用には耐えないと判断しています。

- プログラムを書き換えるとランタイムの再起動が必要（「実行時刻のリセット」が必要）
- 2024年11月現在Windows版のExcelでしか使えない
- 情報が少ない
- ボタン等のイベントにフックできない

## Officeスクリプト

この存在は随分前から知っていて、自分の業務効率化でいくつか書いたことがありました。
OfficeスクリプトはTypeScriptがベースの言語なので、言ってしまえばJavaScript感覚で書けます。
Google App Scriptを書いていると感覚的に使えるのではと思うところがありますし、個人的には学習コストは低いと思います。

ただ、これも色々な制約があって、結局選択肢からは外しました。
- 365個人プランでは使えない（2024年11月現在Insiderプログラムに参加しないと使えない）
- 組織アカウントに紐づいているので、クラウドに接続されていることが前提
- スクリプトは専用のJSONベースのファイルにOneDrive内に保存される（`%ONEDRIVE%\Office Scripts\*.osts`）
- 同じ組織内であれば、警告ダイアログに同意すれば動かせるが、他社のアカウント内で動かせるのかがわからない

これらが解決できると非常に強力なんですけどね。
個人的にはこれの今後の発展に注目したいです。

## VBA

https://qiita.com/tomgoodsun/items/43a4bc4bb81df6cd0070

結局VBAという話になってしまうのですが、あまり扱った経験がないのと、色々と使いにくいところが多すぎるという点で、一番最初に選択肢から外していました。
ネットで同じ意見の人を探すとどれも共感するものばかりです。

- エディタが微妙
    - 書いている途中で、自動で整形、警告でるのやめてほしい
- 言語として辛い部分がある
    - 横展しづらい
    - REST形式なのかRPC形式なのか・・・
    - 関数と同じ識別子に代入すると戻り値になるのか・・・
    - `"`を文字列として記述する際に`""""`としなければならないのがつらい（ダブルクォーテーションのエスケープ文字はダブルクォーテーション）
- マクロは別のPCで動かす際に無効化されることがあり、ちゃんとした署名をいれる必要がある
    - メンテナンスなどを考えると非常にコストが掛かるので、Excelのセキュリティレベルを下げてもらうということをお願いしなければならない

# まとめ

結局アドインとかも試してみたのですが、ピンとくるものがなくVBAを選択するしかなかったわけですが、最終的には関数でそれっぽいのを作って共有する形になりました。
現状はVBAしか選択肢がないという結果になりました。

Google Spreadsheetの場合、Google App ScriptをJavaScriptのように書ける他、[CLAPS（Command Line Apps Script Projects）](https://github.com/google/clasp)を使うことで、手元の環境で、TypeScriptで書いたものをGASにアップロードできるという仕組みがあったりして、ありがたかったりします。
Excelで、JavaScriptライクな言語でプログラミングできる日が来ることを望みます。
ゲームでキャラクターとかがプレイヤーの方向を向く処理を実装してみた

ゲーム開発では、敵キャラクターがプレイヤーの方向を向いて動く、
いわゆる「ターゲット追尾」の動きをよく作るかと思います。

本記事では、DirectXTKを使って、「キャラがプレイヤーの方向を向く処理」を簡単に実装する方法を紹介します。


処理の流れ
-
今回の実装では、以下の手順でキャラクターの回転を計算します

・プレイヤーとの相対的な角度を計算する
自分（キャラクター）からプレイヤーがどの方向にいるのかを求めます。
→ 目標地点への方向を示す角度を計算します。

・クォータニオンで回転を設定する
計算した角度を元に、回転を表すデータを作りますYaw の回転のみ使用）。

・オブジェクトの回転に適用する
最終的に、回転を自分のキャラクターに設定します。

実装コード
-
以下は、DirectXTK の SimpleMath を使ったコード例です。
まず、プレイヤーの方向を計算する関数を作ります。
```cpp
#include <SimpleMath.h>   // DirectXTK の簡易計算用クラス
#include <DirectXMath.h>  // DirectXMath の基本機能
#include <cmath>          // 数学関数（atan2）


// eye から target への角度を計算する関数
inline float CalculateAngle(const DirectX::SimpleMath::Vector3& eye,
	const DirectX::SimpleMath::Vector3& target)
{
	// 目標への方向ベクトルを計算
	DirectX::SimpleMath::Vector3 direction = target - eye;

	// ベクトルを正規化（方向だけを抽出）
	direction.Normalize();

	// X-Z 平面上での角度を計算
	float angle = std::atan2(direction.x, direction.z);

	return angle;
}

```
この関数を使うと、自分（キャラクター）からプレイヤーの方向への角度を求めることができます。
次に、この関数を利用してキャラクターの回転を設定します。
```cpp
// プレイヤーを向くための回転設定
m_rotation = DirectX::SimpleMath::Quaternion::CreateFromYawPitchRoll(
	CalculateAngle(m_position, playerPos), // Yaw（ヨー：左右の回転）
	0.0f,                                  // Pitch（ピッチ：上下の回転）
	0.0f                                   // Roll（ロール：傾き）
);
```

結果と応用例
-
このコードを適用すると、例えば以下のような動きを実現できるかと思います：

・敵キャラクターがプレイヤーの方向を向く
・銃口がプレイヤーを狙うように回転する
・カメラがプレイヤーを追いかける

まとめ
-
この方法を使うと、簡単に「ターゲット方向を向く動き」が実現できます！
特に、DirectXTK の SimpleMath::Quaternion を使うことで、複雑な回転計算をシンプルに処理できるのがポイントです。

このコードを使ってモデルを描画したりするときには、これ以外にもいろいろ手順を踏む必要がありますが
ここではプレイヤーと敵の座標から角度を求めて、クォータニオンで回転させるための下準備に当たる部分を紹介しました！