OmniAICreator/Qiita-1.07M huggingface dataset:
Black Duck Software社製Bluck Duck（SCA）、Seeker（SAST）のご紹介

Re-grit Partnersサイバーセキュリティチームの長尾と山下が、Black Duck Software様を訪問し、同社製品についてハンズオン形式で説明を受けるとともに、トレーニングを受講しました。本投稿では、トレーニングの感想も交えながら、Black Duck Software社の提供するサービス概要をご説明し、企業・組織が今後取り組むべきサイバーセキュリティ対策の展望について述べます。

## Black Duck Software社について
Black Duck Software (旧 日本シノプシス) は、アプリケーション・セキュリティ・テスト（AST）分野のソリューションを提供するリーディングカンパニーです。ソフトウェアのセキュリティと品質を確保するための包括的なソリューションを展開しており、セキュリティリスクの軽減と開発効率の向上を支援しています。

## ハンズオントレーニングについて
渋谷スクランブルスクウェアにて、Black Duck Software社から以下の製品についてハンズオン形式でトレーニングを受講しました。

### Black Duck（ソフトウェア・コンポジション解析：SCA）
オープンソースソフトウェア（OSS）のセキュリティ（脆弱性管理）とライセンスコンプライアンスを統合管理するツールです。
#### 主な機能：
- SBOM（Software Bill of Material）を作成
- 作成したSBOMを基に脆弱性スキャンを実施
- システム内の脆弱性を一元管理

これにより、OSS利用に伴うセキュリティリスクの可視化と効率的な管理が可能になります。

### Coverity（静的アプリケーション解析：SAST）
Coverityは、ソースコードの静的解析を行い、コードに含まれる脆弱性や欠陥を検出するツールです。
#### 主な特徴：
- SASTを利用したセキュリティテスト（ホワイトボックステスト）を実施
- ソースコード内の各モジュール間の相関関係を踏まえた精密な脆弱性検査
- コーディングが完了し、ビルド済みの状態でスキャンを実施

これにより、フォルスポジティブやフォルスネガティブの発生が他社製品に比べて極めて少なく、高い精度を誇ります。


## その他ソリューションについて
今回のトレーニングでは対象外でしたが、Black Duck Software社は以下の製品も提供しています。
1.	Seeker（インタラクティブアプリケーション解析：IAST） 
実行中のアプリケーションをリアルタイムでテストし、脆弱性を検出。
2.	Polaris（SaaSベースのSCA/SAST) 
SaaS形式で、複数のセキュリティツールからの情報を集約・解析するプラットフォーム。
3.	White Hat（動的アプリケーション解析：DAST）
実行中のアプリケーションをブラックボックステストにより脆弱性を検出。

## 今後のサイバーセキュリティ施策
2024年に施行された欧州サイバーレジリエンス法（欧州CRA）により、欧州市場で流通するデジタル製品に関わる製造業者に対し、厳格な脆弱性管理が義務付けられました。この影響は欧州に留まらず、日本国内においても脆弱性管理体制の強化が求められる傾向が強まっています。
実際に、IT製品の構成情報を国が管理し、脆弱性情報の発信や対応要請を行う方針が検討されています。さらに、日本版CRAの制定により、強制的な対応が求められる可能性も高まっています。
こうした背景の中で、企業・組織が能動的に取り組むべきサイバーセキュリティ対策として、脆弱性管理の強化が重要です。そのため、今回ご紹介したBlack Duck Software社製のソリューション導入をはじめとする対策を、早期に検討することが求められます。
Re-grit Partners サイバーセキュリティチームは、ソリューション選定を含む脆弱性管理施策の立案・推進を全面的にサポートいたします。お気軽にご相談ください。

:::note warn
※本投稿に記載の製品仕様等は変更されている可能性があります。ご利用の際は、必ず最新の情報をご確認の上、対応をご検討ください。
:::
しみ出しはみ出してみた

前回、こんな記事を書いていた
https://qiita.com/msgks/items/1000a3124ddda3560c89

>「しみ出しはみ出し」
自分の意識と行動を、当事者として事業と組織全体に向ける。
職務や部門を超えて自分ごと化することで、事業と組織の成長を牽引する。

1年前に↑をやる！と宣言した後、当時想定していた以上にしみ出しはみ出した1年になった
<font color="##008000">**（色々巻き込んでいただいて、ありがとうございます！）**</font> 

しみ出しはみ出してみて、起きた変化について、書き留める。


### 社内に協力を依頼しやすい仲間が増えた
「スタンバイはいい人が多い」と言う人は多い。
ただし、その人が自分にとっていい人かどうかは、話しかけるまで判断つかない。
話しかけるタイミングがないから、わからないままで発展しない。
中には一度も話さずに退職されていた、という人もいる。

しみ出しはみ出すことで、業務で半強制的に会話する機会が生まれた。
お話しさせていただいた方々、みんないい人で、社内の業務連携を進めやすくなった。
コミュニケーションが苦手なら、しみ出しはみ出しを率先して実行することによって、
業務上で強制的に機会を作ることがおすすめ。

### 自分の知名度が上がり、話しかけられる側になった
色んな打ち合わせや様々な人たちの前で発言する機会が増えたおかげで、
僕の顔が一人歩きして、これまで話したことがない人からも、
オフィスにて話しかけられるようになった。
こちらから話しかけなくとも、話しかけられる側になれた。

事業や組織の話など、様々な情報が集まってくる。
こちらからも会話や協力する機会が増えた。
しみ出しはみ出しによって、コミュニケーションの輪が広がってきている。

### スタンバイの問題解決を考える機会が増え、当事者意識が高まった
様々な人とのコミュニケーションが増えたことによって、
スタンバイの事業や組織に起きている問題やリスクについて、理解を深める機会が増えた。

何か問題に直面した時に、
「詳細はよくわからないけど、うまくいってない。」だと、
前提理解がないから解決策までを考えるまでが大変。
（で、その時に諦めて思い出さなくなる。）

前提となる情報が自然と入ってくるからこそ、いざ問題に直面した時に紐解きやすくなる。
問題の要因が明らかになっており、自分ならどう解決できるのかを考える機会が発生し、
スタンバイに対する当事者意識を持った行動が自然に生まれた。

様々な人とのコミュニケーションの量が増えることで、
多くの情報が集まり、様々な問題に気づき、
それぞれの問題の解決に向けて思考の機会が増える。いい循環。


# 伝えたいこと
共に働く人って大事。
元々、「一緒に働く人に固執しない」と自己分析していた時期もあったけど、
スタンバイにきて、人の大切さを気付かされる機会に多く直面している。

コミュニケーション量が増えることで、周囲からの信頼を得られ、情報が集まる。
様々な役割のメンバーの視点や考えを聞くことで、事業と組織の解像度を上げられる。
それにより、自分なら何ができるのかについて考え、当事者意識が生まれて行動する。

コミュニケーションが少ないと、
色んな機会を逃して、得られる経験や充実感を感じられなくて勿体無い。

スタンバイはリモートワークで、週に１回しか顔を合わせる機会がない人も多い中で、
組織内のコミュニケーションを増やすために、何かと兆しを来年は見つけたい。

僕の顔は話しかけるなオーラを出していると言われますが、
そんなことないので、お気軽に（笑）
TimerIC555によるペンライトの制御

timerIC555を手に入れたので遊びます。
今回はペンライトを神棚に飾るため、時間経過で色が変わるように回路を組みます。



### 仕様
IC555は単安定モード、無安定モードがありタイマーやクロック回路に使用できます。
今回はこれを使用して、ペンライトを一定時間で切り替えるものを作ります。
仕組みは簡単。
IC555と抵抗でコンデンサの充電時間、放電時間を制御しON OFFを繰り返します。
ペンライト側はヰ世界情緒の3rdワンマンライブ、ANIMAⅢのペンライトを使用します。
タクトスイッチでpinをGRDに接続すると色が変わるようです。また、長押しするとOFFになるようです。

### 設計
http://www.pppea.com/triflesthings/ic555/
このサイトで大雑把に計算したところ、100μF,10μF,1MΩ,100kΩ,10kΩあたりを使うっぽいので、そのあたりを適当に買って、検証しながら制作します。
https://pc.watch.impress.co.jp/docs/2008/1023/musashino015.htm
配線は↑を参考にします。
IC555のoutをタクトスイッチに並列接続したフォトカプラに接続し、操作します。

### 実験
ひとまず回路を仮組します。
最初に
R1:100kΩ、R2:10kΩ、R3:1KΩ、C1:100μF、C2:0.1μF
で試します。

結果は周期8秒　消灯時間0.7秒　デューティー比は91.3%でした。
初手でなかなか良い結果が出ましたね。

次は
R1:<font color=”blue”>150</font>kΩ、R2:10kΩ、R3:1KΩ、C1:100μF、C2:0.1μF
で試します。

周期11秒　消灯時間1秒 デューティー比90.9%でした。

### 試作
R1:150kΩのほうが目的の値に近かったのですが、部品数少ないR1:100kΩを採用します。

ではペンライトと接続します。ペンライト側から線を出してブレットボードに接続します。
ここでフォトカプラを通すのですが、このままではON,OFFが逆なのでNOT回路を挟みます。
トランジスタ1個で済むなんてお得ですね。

![スクリーンショット 2024-12-10 124704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/0461c08a-0f85-0511-96a9-3ff0449c874f.png)

目的通りの周期でLEDが点滅しました。
しかし、LEDをフォトカプラに変えるとうまくいきません。
壊れているのでしょうか。
早々に諦めトランジスタを使います。

ペンライト用に5Vから4.5Vに降圧するための抵抗を挟み、完成です。
![スクリーンショット 2024-12-10 124155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/d52662e0-61f5-5cf1-99eb-cb9973167115.png)

### 組み立て

ユニバーサル基板に実装します。
何ということでしょう、ブレットボード上ではごちゃごちゃしていたジャンプワイヤーが片付き、美しい(？)姿に生まれ変わりました。
匠ですね。

最後に通電テストをします。
付きません、おかしいですね。
type-Cコネクタの製作ミスで、+と-の接続が逆になってしまっていました。
電解コンデンサが暖かいです。
幸い、難なく修正ができました。

もう一度テストをします。
緊張の数秒間…
やった！付きました！僕の勝ちです。
後はいい感じに神棚に飾れば、完成です。

### 仕様物品
<details><summary>部品</summary>

<dt>抵抗</dt>
    <dd>10Ω *1</dd>
    <dd>1kΩ *2</dd>
    <dd>10kΩ *2</dd>
    <dd>100kΩ *1</dd>
<dt>コンデンサ</dt>
    <dd>1uF</dd>
    <dd>100uF</dd>
<dt>IC</dt>
    <dd><a href= "https://akizukidenshi.com/catalog/g/g114531/" target="_blank" >NJM555D</a></dd>
<dt>トランジスタ</dt>
    <dd>2SC1815　*2</dd>
<dt>その他</dt>
    <dd>Type-Cレセプタクル</dd>
    <dd>細ピン</dd>
    <dt>基板</dd>
    <dd>やる気</dd>

</details>


お読みいただきありがとうございました。
【OpenAI ChatGPTクリスマスイベント第４日目】すべてのユーザーにCanvas機能が開放されました。


　どうも、カーブミラーです。

　今回は、OpenAIのクリスマスイベント。今日は第四日目。

:::note info
本記事は、ChatGPT（Plus版）
で使っていません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　さっそく、【本題】です。

　OpenAIの
　　クリスマスイベントの第四日。
　　　まずはごあいさつ。
　　　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1866540991005725080?t=XZLuSVG2cfaJyn1TJsJqsg&s=19)
　　　　　中身は、OpenAIの
　　　　　　イベントページへの誘導。

　四日目の今日は、
　　Canvas機能でした。

　これまでCanvas機能は
　　モデル選択メニューでは
　　　ひとつのモデルという
　　　　位置付けでした。
　　　　　beta版でしたから当然かな😅

　それが今回、
　　正式リリースとなったわけです。

　これにより
　　モデル選択メニューから
　　　“GPT-4o with canvas”
　　　　がなくなりました。
***
　今日の概要は
　1. 無料ユーザー含む
　　全ユーザーにCanvas機能を解放
　2. Canvas内でのPython実行が可能に
　3. GPTsへのCanvas搭載をサポート

　Canvas機能は
　　順次開放とのこと。
　　　動かせるのを待つしか
　　　　ありませんね😅

　ない人は、
　　Canvas機能を
　　　使うことができなくなって
　　　　いるのが、つらいかも。

　それはともかく、どうやら
　　入力枠に新たなアイコンが
　　　出てきたら、開放されたと
　　　　みてもいいようです。

　ちなみに、
　　このアイコンを
　　　ツールボックスアイコンと
　　　　呼ぶそうな。

　そのアイコンをタップすると
　　メニューが出てきて、
　　　Canvasを選択することで
　　　　利用可能らしい。

　私的にこのメニューを見て驚いたのは
　　DALL-Eが含まれていることです。
　　　ここからすると、
　　　　画像生成するには
　　　　　必ずこれをセットする
　　　　　　必要がある。
　　　　　　　Promptのみでは
　　　　　　　　なくなったことに
　　　　　　　　　なります。えー😅

　そういえば、
　　サムのポストに
　　　“絵文字を入れられる”って
　　　　書いてあったけど、
　　　　　前からだよね🧐

　そうそう、
　　Canvas機能は
　　　GPT-4oモデルのみの機能です。
　　　　ここ、大事！

　　あれ？
　　　o1でコードを書けないじゃん🧐

　コピペ機能も
　　新しくなっているみたいなことを
　　　説明してますね。

　あっ、これはあれだ。
　　数行入力すると
　　　入力枠の右上に出てくる
　　　　Canvasアイコンのことですね。
　　　　　広げればCanvas、
　　　　　　閉じれば入力枠に
　　　　　　　なります。

　　これは、編集時にも
　　　働きます。
***
　参考ポスト
　　[サム・アルトマンポスト](https://x.com/sama/status/1866555731149045990?t=nVFIejHO-TkH2k9YoXISdg&s=19)

　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1866578914233159928?t=z8Flp5clOgk7_Su2KkRUfQ&s=19)

　　[ChatGPT研究所さんポスト](https://x.com/ctgptlb/status/1866551774355788247?t=pQOUD-W-oU3hWFwQKwFEHA&s=19)


　詳しいまとめは、こちらを。
　　[ChatGPT研究所さんnote](https://chatgpt-lab.com/n/n049c1ead6720)
***
　とりあえず、
　　わかったのは
　　　これだけです。

　疑問点もありますが、
　　まだ開放されていませんので、
　　　追々ということにしましょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
***
（2024/12/12追記）
　どうやら、
　　スマホブラウザを
　　　PC版サイトにしてないと、
　　　　Web版ではアイコンが
　　　　　出てこないようです。

　通常の場合で、
　　操作するには、
　　　“/”を入力して、
　　　　機能メニューの選択を
　　　　　する必要があります。

　ちなみに、
　　スマホアプリ版での“/”は
　　　反応ありませんでした。
　　　　今後に期待しましょう。
「あなたの世界が知りたいんです。」

こんにちは！

開発するとき、サービスを提供するとき、皆さんが大事にしていることは何ですか？
どんな機能にしようかな、どう実装しようかな、自分だったらどう使うかなとか？
それ大事ですよね。使いやすい、使ってもらえるものを作りたいですもの。

使いやすい、使ってもらえるシステムやサービスを開発する時に実装方法の基礎になるのは、「使う人の世界を知る」ことだなと思った経験がありました。

お客様から相談をもらったんです。
ビジョンがあって、でもどうしたらいいかな？っていう相談でした。
会話して、「こうしますか？」「こっちはどうですか？」っていろいろ案を見せたのですが、決められない。
「うーん、決められないなぁ…」「いいかどうか分からないなぁ。」という状態が続いて、そして「あなたがいいと思うものにしてよ」って言われたんですね。

その時は任されてるんだ！ってすごく張り切ったんですけど、今思うとそうじゃなかったんじゃないかなと思ってて。
お客様の作りたい世界を理解して、その上でアイデアを持って行けてたのかな？って。

私はお客様のビジョンを「自分なり」に理解してしまっていたから、自分本位のアイディアを出すし、お客様は私が伝えた世界が分からないから、良いも悪いも判断できないし、で、お互い「なんとなーく」なまま話をしていて、中途半端になっちゃった。

自分の世界と相手の世界は全っ然違うんです。
親子だって兄弟だって夫婦だってそうでしょ。

相手の世界を知るときって、その人のそれまでの経験やそこから生まれた気持ち、こだわりを知るってことなのかなと思います。
なぜそういうものが欲しいのか、その背後にどういう経験や思いがあって私に共有することにしたのか。
それってあんまり相手が自ら伝えてくれないものなんですね。特に仕事の会話だと。
なので、こちらから聞かないといけなくて、「どういう経緯があって、この話を考えたんですか」「何か経験されたんですか」って、まずそこを知らないと相手の隠れた思いやこだわりが分からないままなんです。
分からないのに、相手が作ろうとしているものを一緒に作ることはできないですよね。

「相手の世界を知る」って、なかなかできないんです。ついつい言われたことだけで理解しようとしたり、なじみのある領域や業務だったりすると「あーはいはいあの話だったらこうだな…」って反射的に考えちゃう。
でも本当はそうじゃない。人それぞれ会社それぞれの思いがあるんです。
なので、お客様と話す時があれば「この人は何を見て何を聞いて何を体験して、どういう世界にいるんだろう」と思うし、そういう会話をします。
お客様は「自分を理解しようとしてくれる、理解している人」と思って、もっといろいろな話ができる関係になっていくと思うし、それができるようになったら最強エンジニアだなと思っています。そして、その時に生まれる仕事は本っっ当に楽しいです。これからもそういう体験をしたいし、みんなにもして欲しくて、こんな話をしました。

この手の話が好きな人、興味ある人、違う意見を持っている人、私とお話ししませんか？
お待ちしています！
[CAIレシピ] BASIC認証を使用するサービス接続

## はじめに
この記事では、BASIC認証を使用するサービス接続を作成する手順を確認しています。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [サービス接続によるREST APIの実行](https://qiita.com/shunsuzu/private/f2783c55a4d75661fc0b)

## BASIC認証を使用するサービス接続の作成

次の手順では[プロセスの作成と実行(匿名アクセスと基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)で作成したCAIプロセス __recipe-pcb-HelloWorld__ を実行するサービス接続を定義しています。

1. サービス接続を次の設定で作成します。
    - 名前を __recipe-svcConn-svcConnTestBasic__ とする
    - アクション __getAction__ を追加する

1. __バインディング__ タブを選択して __URL__ に[プロセスの作成と実行(匿名アクセスと基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)で作成したCAIプロセス __recipe-pcb-HelloWorld__ のサービスURLを指定します。
更に __認証タイプ=基本__(BASIC認証を意味します)、__ユーザー名__,__パスワード__ を指定します。ここで指定するアカウント情報は __recipe-pcb-HelloWorld__ を実行する際に指定する IICS のユーザーアカウントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/c1c00a61-a4e0-e36d-21e8-b8005a201148.png)


1. __テスト結果__ タブを選択して、__テスト__ を実行、__プロセスオブジェクトの生成__ を実行します。
1. __出力__ タブを選択、出力フィールドの追加ボタンをクリックして、出力フィールドを次のように設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/c60114fa-2c26-914e-0a0a-895dd1d3c2a6.png)

1. 作成したサービス接続を 保存 して パブリッシュ を実行します。

1. アプリケーション接続とCAIプロセスの作成は [サービス接続によるREST APIの実行](https://qiita.com/shunsuzu/private/f2783c55a4d75661fc0b)にて記載している内容と同じ手順で進められます。


## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)
Javaを基礎から学ぶその11 入力

この記事は[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の11日目の記事です。
まだ勉強していない部分を勉強しながら作ります。
# ゲームを作る(3日間くらいで)
学習した知識を生かして何か作ることにしました。とりあえず、Hit&Blowと呼ばれている、数当てゲームを作ってみたいと思います。
ルールは非常にシンプルで、相手がランダムに決めた数を当てルームです。数字が正しく、また数字の場所(位)も正しければHit、数字は正しいが場所(位)が間違っている場合はBlowとなり、その数が表示されます。すべての正しい場所(位)に正しい数字がそろうまでの速さを競うやつです。
# 数字の入力を受け付ける
Scannerを使います。
Javaで文字を入力するためには、
```
import java.util.Scanner;

Scanner scanner=new java.util.Scanner(System.in);
    String A=scanner.nextLine();
    scanner.close();
```
一行で書く場合は、こうなります
文字の入力
```
String A=new java.util.Scanner(System.in).nextLine()
```
数字の入力
```
int A=new java.util.Scanner(System.in).nextInt()
```
とするようです。
古いjavaだと上のように最後にscanner close()が必要そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/80084139-0150-a8fb-58af-5f2716835527.png)
こういった注意書きが出ても、一応動きます。が、closeを使っておいた方がよさそうです。
また、新しいjavaではcloseは不要のようです。自分の環境に合わせて、必要なら書くといいと思います。


int型で数字の入力を受け付ける場合は文字を入力することができてしまい、文字を入力するとエラーが出て止まってしまいます。これを回避するためには、以下のようにすればよいそうです。以下は、エラーを出さない全文を記載しています。
```
import java.util.Scanner;
public class TEST {
   
    public static void main(String[] args)  {
    
    System.out.println("Number");
    Scanner scanner=new java.util.Scanner(System.in);
    String A=scanner.nextLine();
    scanner.close();
    boolean C=B(A);
    if(C==true)
    {
        System.out.println(A);
    }
    else{
        System.out.println("SUUJI!");
    }
    
    

    }
    public static Boolean B(String O){
       for(int i=0;i<O.length();i++){
        if(Character.isDigit(O.charAt(i))){
            continue;
        }
        return false;
       }
       return true;
    }
    
}
```
## 解説
```
 boolean C=B(A);

 public static Boolean B(String O){
       for(int i=0;i<O.length();i++){
        if(Character.isDigit(O.charAt(i))){
            continue;
        }
        return false;
       }
       return true;
    }
```
いったん全文をString型で受け取り→一文字ずつchar型にして判定の流れです。
booleanを使って、数字だけかどうかの真偽を判定しています。
文字が含まれている場合はfalseを、そうでない場合はtrueを返します。文字をchar型に変換して、一文字ずつ判定を行っています。
最初のboolean C=B(A);について、イコールの右辺は「戻り値」というそうです。その下に書かれたpublicでstaticなbooleanに()の文字を送り、処理結果を最初の行のbooleanなCに返してくれるそうです。()の文字を送る引数は複数送ることはできるようですが、そのあと帰ってくる「戻り値」は一つしか設定できないようです。
ちなみにreturnが使われると、そこでメゾットが終了するようです。returnの後に文を書いてもエラーが出るそうです。
### char型のisDigit
char型にはisDigitなるものがあるそうです。これを使うと、charの中身が数字か文字かを判断してくれます。作ろうとしている機能にぴったりです。
# まとめ
文字を入力するための方法にはscannerを使う方法がある。int型で数字、String型で文字の入力が可能。入力では数字を受け付けるところで文字も受け取れてしまうため、isDigitを使い判定を行うのがよい。

今日は文字の入力を受け付ける勉強をしているため、文字を入力⇒数字なら入力された数字をそのまま出力の流れです。

ゲームの中の、一部の機能を実装することができました。

# 参考文献

https://www.sejuku.net/blog/63188

https://magazine.techacademy.jp/magazine/19075

株式会社インプレス,スッキリわかるJava入門 第4版
kaggle tutorial time series part4

https://www.kaggle.com/code/ryanholbrook/hybrid-models

の確認をおこなっていきます。
trend+XGBoost(相互作用の学習)を組み合わせた「ハイブリッド」予測モデルを考えていきます。

```
series = trend + seasons + cycles + error
```

という関係を考えます。
ここで、
季節性（Seasonality）
- 固定された一定の期間で繰り返すパターン
- 例：1年周期、1日周期など

サイクル（Cycles）
- 不規則な期間で変動するパターン
- 周期が一定ではない
 
と違いが有ります。

trendの誤差分をseasonsで補正、seasonsでも残る誤差分をcyclesで、cyclesでも残る誤差はerrorという風に捉える事で近似出来ます。

どのようにそれをcodeにするかという関係を考えていきます。
```python
# 1. 最初のモデルで訓練と予測を行う
model_1.fit(X_train_1, y_train)
y_pred_1 = model_1.predict(X_train)

# 2. 残差に対して二つ目のモデルで訓練と予測を行う
model_2.fit(X_train_2, y_train - y_pred_1)
y_pred_2 = model_2.predict(X_train_2)

# 3. 全体の予測値を得るために足し合わせる
y_pred = y_pred_1 + y_pred_2
```
という形がわかりやすいですね。

その後は説明パートです。
理論をもとに、実際の例（売上の予測）です。
実際の例では、2つのモデル（trend+月ごとのXGBoost）の複合でデータを捉えようとしています。
c#で、なでしこ その9

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
文章を読み上げよ。

# サンプルコード

```
「CreateObject("SAPI.SpVoice").Speak "I love you"」を「si.vbs」へ保存する。
S =「cscript si.vbs」をコマンド実行

```

以上。
キャリアブレイク中にやっている勉強⑦ 自由研究

今日もキャリアブレイク中に具体的にやっている勉強について書きます。その⑦は「自由研究」です。

# 自由研究
ここまで6つの事を勉強していると書きました。時間割を作った時、週１回１時間だけ空きが出来たので、ここを特に定めず自由研究にしました。他に比べると少ないけれど、何をやっても良い時間です。特に勉強にすらこだわらず何かやってみるのも面白いかなと思いました。

# 世界を知る事
最初にやり始めたのは世界を知る事です。自分は世界について知らないことが多すぎます。中東、アフリカ、南アメリカ、国の名前を言われてもどこにあるかすら怪しい国は一杯あります。自分が知らなくて、豊かな国も人口が多い国も沢山あります。世界についてもう少し広く知ろうと思いました。

# 人口
最初に人口から攻めることにしました。世界の人口１位はどこだっけ？中国かなと思いました。２位にはインド？３位はアメリカ？それ以降はもう分からないなと思いました。日本は何位？10位？それより悪い？そう考えるとTOP10すら殆ど何も知らないと思いました。ビックリしたのは既に２年前に人口１位はインドでした。4位はインドネシアでしかも30年以上ずっと4位でした。でもインドネシアって場所もよく分からない。公用語はインド語？人口だけでも色々疑問が出てきました。

# GDP
次に気になったのはGDPです。1位はアメリカ？2位は中国？日本は何位？10位ぐらいと思いました。調べてみたら、ドイツが3位、日本が4位でこれも驚きました。また2位と3位の差の大きさも１桁あって、結構ビックリしました。あと、人口7位、GDP9位のブラジルも気になりました。GDPは日米中印とヨーロッパが殆どの中でブラジルが入っているのは想像も出来なかったので、何故ブラジルが強いのかも気になりました。

# 気になる国をピックアップ
こんな感じで気になる国をピックアップして詳しい情報を見たりしています。これ自体は面白いし、学べていることもあるんですが、人口とGDP以外のデータに関しては思ったほど公開されていないものも多く、今年ぐらいは分かっても過去30年の情報を調べると有料になりそうでした。

# 方向転換
で、11月は世界について色々調べたのですが、有料というので少しテンションが下がりました。またやりたいことのゴールもフワッとしていたので研究課題を変えようかなと思い始めています。これも別途書く予定ですが、息子に対しての勉強サポートの時間も週2回1時間取っています。この息子の勉強サポートをもう１段階進めて、子供に対して教育することを研究テーマにしようと思う機会が最近色々あって増えたので、12月はそれをやる予定です。
iPhoneのショートカット＋ChatGPTでタスクの抜き出し＆リマインダーに登録を自動で行う

## はじめに

人間が「選択」を行うためには「意志力」なるものを使用するらしいが、その「意志力」は1日にどれだけ使えるかの上限が決まっているらしい。
そのため、活動的に行動するためには可能な限り「選択」の回数を減らす必要がある。
そんな「選択」を減らすために活用できるツールとして、リマインダーやTODOリスト、タスク管理ツールなどがあるが、私がよく活用しているものはiOSに標準搭載されている「リマインダー」というアプリだ。
しかしどうにもタスクの入力すらとても面倒に感じるので、「ChatGPT」を用いて整形してもらい、ショートカットに自動で登録してもらおうと思った。

## 全体の流れ

ショートカット内では、以下の順番で処理を行ってもらう。

1. プロンプトで、テキスト(追加したいタスク)を入力する
    * 例) 明日、駅へ10時までに到着していたい。駅までは30分ほどかかるため、余裕を持って家を出たい。 
1. ChatGPTにタスクの抜き出しと整形を行ってもらう
    * 例) 以下の2件を戻り値として返す
        * 駅に到着,2024/12/12 10:00
        * 家を出る,2024/12/12 09:30
1. ChatGPTからの戻り値を、配列として取り込む
1. リマインダーに、タスクを追加する

## ショートカット内での詳細な処理

### 1. プロンプトで、テキスト(追加したいタスク)を入力する

アクション「入力を要求」にて、プロンプトからテキスト入力する。
![IMG_7628-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911155/0315af4d-a57d-64b5-dc5f-4d97315eea35.png)

### 2. ChatGPTにタスクの抜き出しと整形を行ってもらう

「ChatGPT」のアクション「Ask ChatGPT」にて、先ほど入力したタスクを整形してもらう。
整形形式はCSV同様で、タスク間は改行で区切り、タスク名と期日間はカンマで区切る。
また、時刻の指定がないタスクは、デフォルトで23時を設定する。

以下の文章をショートカット内に打ち込む。

```
これからタスク名と期日の抜き出しを行ってもらいます。
1つのタスクに対して、「タスク名,期日(yyyy/MM/dd hh:mm形式)」で記載してください。
複数タスクある場合は改行区切りで列挙してください。
期日の時刻に指定がない場合には、その日の23:00を設定してください。
タスク名、期日、区切り文字以外は発言しないでください。
以下が抜き出しを行うタスクです。
[入力を要求]
```
![IMG_7629-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911155/b5318ba3-596f-532d-6018-67c3ef78b2a7.png)

### 3. ChatGPTからの戻り値を、配列として取り込む

ChatGPTにて成形されたデータを配列として取り込み、1列目をタスク名、2列目を期日としてリマインダーに読み込ませる。

コードで表現すると、以下の通りの処理を行う。

```javascript:JavaScript
function (resultTextChatGpt) {
    let taskDataList = resultTextChatGpt.split("\n");
    for (let taskData of taskDataList) {
        let task = taskData.split(",");
        if (task.length == 2) {
            let taskName = task[0];
            let taskDue = task[1];

            // ここでリマインダーに「taskName」と「taskDue」を読み込ませる
        }
    }
}
```

### 4. リマインダーに、タスクを追加する

さて、ChatGPTから受け取った値の整形は行えたが、iOS標準搭載のリマインダーには困ったバグが存在する。
それは、**ショートカットから期日付きのリマインダーを新規で作成ができない**こと。

なので、リマインダーを新規作成した後、その作成したものを編集する形で期日を設定していく必要がある。

手順3と手順4をまとめてショートカットに登録すると、以下のようになる。

![IMG_7630-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911155/721b8d12-e4ce-30f5-0e50-267d2e95d79e.png)


## 実行状況

![IMG_7633.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911155/c5c650f1-6813-6812-6f3c-9bf993a3a49c.png)
![IMG_7634.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911155/d7462ff4-b232-e403-ed75-40f8fad1fb1a.png)
![IMG_7635.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911155/eb6003d3-a2f8-4ad5-2df5-2ac191d0e79d.png)

上記のように、ChatGPTが入力したテキストを読み取り整形し、そのままリマインダーへと登録された。
家を出発する時間が9時半ではなくて9時なのは、朝起きるのが苦手な筆者のためを思い「余裕を持って」設定してくれたのかもしれない。
ありがとう、ChatGPT。
さすがだ、ChatGPT。
LeetCodeを1日1題解いてみる (day40)

40日目に取り組んだ問題はこちら！

# 577. Employee Bonus

https://leetcode.com/problems/employee-bonus/?lang=pythondata

## 問題文
Table: `Employee`
```
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| empId       | int     |
| name        | varchar |
| supervisor  | int     |
| salary      | int     |
+-------------+---------+
```
empId is the column with unique values for this table.
Each row of this table indicates the name and the ID of an employee in addition to their salary and the id of their manager.

Table: `Bonus`
```
+-------------+------+
| Column Name | Type |
+-------------+------+
| empId       | int  |
| bonus       | int  |
+-------------+------+
```
empId is the column of unique values for this table.
empId is a foreign key (reference column) to empId from the Employee table.
Each row of this table contains the id of an employee and their respective bonus.

Write a solution to report the name and bonus amount of each employee with a bonus less than 1000.

Return the result table in any order.

## 僕の回答 (失敗作)
```py
import pandas as pd

def employee_bonus(employee: pd.DataFrame, bonus: pd.DataFrame) -> pd.DataFrame:
    df = pd.merge(employee, bonus, on="empId", how="left")
    filtered_df = df[(df["bonus"] < 1000) | (df["bonus"] == None)]
    return filtered_df[["name","bonus"]]
```
## 僕の回答 (GPTで修正)
```py
import pandas as pd

def employee_bonus(employee: pd.DataFrame, bonus: pd.DataFrame) -> pd.DataFrame:
    df = pd.merge(employee, bonus, on="empId", how="left")
    filtered_df = df[(df["bonus"] < 1000) | (df["bonus"].isna())]
    return filtered_df[["name","bonus"]]
```

## より効率の良い回答例
特になし

## 学んだこと
欠損値かどうかを判断するには`isna()`or`isnull()`を使う

## コメント
今回は方針がすぐに思いついた。ただ、フィルターやマージの使い方が怪しかった。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/00e3c1a04a5f24b53eaf
非エンジニアの私が挑んだDify活用2カ月間：初めて開発してみた失敗と学び

# 前提
株式会社リンクアンドモチベーションでは、生成AIを活用した生産性向上プロジェクトを2024年から本格的に開始しています。ChatGPTをはじめとするサードパーティツールとともに、Difyを活用した専用ツールの開発にも取り組んでいます。
私はマーケティングやイベントディレクション、CSopsなどの業務経験を経て、2024年8月にこのプロジェクトにジョインしました。それまでは開発組織に属しておらず、AIについてもほとんど何も知らない状態でした。そして10月からDifyを使ったツール開発に挑戦しています。
本記事では、非エンジニアとしてDifyを活用したプロセスを通じて得た失敗と学びについてお伝えしたいと思います。

# Difyを学ぶ期間
### 何をしたか
Difyの基本操作や活用方法を学ぶために、社内で毎週勉強会を開催してもらいました。ネットやSNSで情報を集めながら、実際にDifyを触って試行錯誤することで基礎を固めました。



### 学び① 完璧を目指すのではなく、まず試してみる
ネットやSNSで活用事例を見つけて自分で試してみました。その中で特に感じたのは、最初から全てを理解しようとするのではなく、まず手を動かしてみることが大事。そもそも知らないことも多く、アップデートも増えていくので、学びきるのは難しく、また見るだけでは分からない学びもたくさんあるので、実際にやることが良い方法でした。
SNSで紹介されていたDifyの使い方を真似て再現しながら操作感を掴むことで、自分の中に基礎が積み上がっていきました。疑問点が出たらChatGPTを活用し、設定ファイルを解析してもらうなどしながら、少しずつ前進していきました。


![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332055/343b0e97-0d6a-10c0-a806-4321cd852929.png)
とりあえず困ったらchatGPTにガサツに聞く


### 学び② すごいスピードで変わる世界。愚直に日々学ぶ
毎週新機能がリリースされるスピード感に圧倒されました。新しい機能をキャッチアップするのは大変で、一度でも学習が滞ると置いていかれる感覚がありました。ただ、毎日SNS見て必死にキャッチアップして、自分の知識やスキルも加速度的に向上していくことを実感しました。
思い通りにいかないことが何度もありましたが、その都度試行錯誤する中で新しい発見がありました。失敗するたびに、次にどのように取り組めば良いかがクリアになり、ツール開発における自信が少しずつ育まれました。

# Difyでのツール開発
### 何をしたか
次に取り組んだのは、Difyを使って現場メンバーが実際に利用できるツールを開発することです。先人の方が開発プロセスと注意点を言語化してくれていたので、それをもとに、現場の課題をヒアリングし、日々の業務を効率化するツールを2カ月で設計・実装しています。プロトタイプの段階から現場メンバーのフィードバックを取り入れながら、機能をブラッシュアップしていきました。（絶賛取り組み中）

### 学び① 意外と業務プロセスは単純じゃない
ツール開発を行うには、ある程度人によって業務プロセスが共通化されていることが重要ですが、対象の部署ではメンバーによってやり方にバラつきがあったり、顧客ごとに異なることがありました。なので、ツールでどこを解決するか？が迷子になることもありました。
その時はマネジャー/リーダークラス数名と話し、何を共通とするか、どういうやり方が良いか？を話しながら作っていきました。

### 学び②これよさそう！というクオリティに仕上げるまでが大変
中途半端なクオリティでは利用の定着化は図れないということを教わっていましたので、「これいい！」という感動レベルに仕上げたいのですが、まだまだDifyの理解も浅いので、苦労しました（しています）。
プロンプトを少し書いてchatGPTでやるのと何が違うのか？が私の場合は大きな壁で、どんなアウトプットがあれば、すごい！となるかを考えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332055/05093346-5dfb-87c3-d572-17a826e3851b.png)
例えば提案する研修の骨子を作成するBOTを作りましたが、研修対象者の課題（なぜ問題が起きているか）を業界や役職などから深堀りさせる機能のが好評でした。

# まとめ
実はまだツールを開発中で、効果的なものをリリースするまでには至っていません。
ただ、ここまでを振り返ると、Difyの知識以上に使われるツールを作ることの難しさに直面しました。しかし、難しいことばかりですが、とにかく楽しい。
これまでの仕事の中で、形になるまでに時間がかかる、リリースしたものの反応は数字だけ、ということもある中で、「すぐに形ができる」「実際に使ってみた声を聞ける」というのが本当に嬉しいなと思います。

また、Difyを使った学習と開発を通じて、完璧を目指すのではなくまず試してみることの重要性、そして失敗から学ぶことの価値を改めて実感しました。生成AIの進化が早い今だからこそ、できない理由を探すより、やってみることが鍵だと感じています。
この記事が、非エンジニアの方や生成AIに興味を持つ方々にとって、一歩を踏み出すきっかけになれば嬉しいです。
AI(ChatGPT)でITサポート問い合わせ文章作成(SAP向け)

おためし版になりますが、わりと精度の良いものが作れたので作り方も踏まえて共有します。

# 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/d1c4a299-f8e0-257d-17bf-afc68e12864d.png)

## 問い合わせ文章(プロンプト)
SAP本番コピー機でSAPGUIからDB02を実行した際にデータが表示されない。
DB SQL server2022、OS windows enterprise 2022

## AI作成文章
SAPコンポーネント： BC-DB-MSS (Microsoft SQL Server関連)

件名： Issue with DB02 Not Displaying Data on SAPGUI for Production Copy

本文：

Dear Support,

We have encountered an issue with our SAP system when executing DB02 from SAPGUI on the production copy. The data does not display as expected.

The system environment details are as follows:

Database: SQL Server 2022
Operating System: Windows Enterprise 2022
We suspect the issue may be related to database connectivity or configuration, but further analysis is required. I have attached the relevant logs and screenshots for your reference.

Please note that we are currently unable to provide remote access to the system. Should additional details or steps be necessary, feel free to let us know.

Thank you for your assistance.

Best regards,
[Your Name]

# 主な仕様
<br>

* 日本語を英語翻訳
* メールの文体で作成
* プロンプトから判断して件名作成
* プロンプトから判断してSAPコンポーネントの指定
* 条件として資料を添付した旨、システム・アクセスできない旨も追記

<br>

今回は英語で問い合わせる必要があるため英語での要件を入れてます。
英語を考えるのがめんどくさいのが作成のきっかけでもあります。

<br>

少しのプロンプトからSAPコンポーネントの指定や件名作成などのやっかいな部分も作成できるのがAIならではだと思います。

# 実際の指示文(条件文)

エラーや問題をSAPのサポートに問い合わせるための文章作成補助をします。
日本語で入力した文章を英語に翻訳してください。
メールの文体にしてください。件名も作成してください。
始まりは「Dear Support,」終わりは「Best regards,」
資料を添付した旨、システムへリモート接続できない旨を伝えてください。
文章の内容から関連するSAPのコンポーネントも提案してください。

<br>

テンプレート
SAPコンポーネント：
件名：
本文
SREエンジニアが入社半年を振り返る

この記事はトラストバンク[AdventCalendar](https://qiita.com/advent-calendar/2024/trustbank) 12日目になります

[トラストバンク](https://www.trustbank.co.jp/)でSREエンジニアをやっている @kgkukoaoisi です
2024年05月に入社してから半年が経ったので、振り返りを残しておこうと思います
チームとしてというより、だいぶと個人によった振り返りになってますが温かい目で読んでいただければ助かります

# やったこと
## AWS移行の完了とECS化に向けての準備
入社して２か月目からはさくらクラウドにあるサービスをAWS移行するプロジェクトへ参画
すでに環境構築は完了しており、テスト（負荷、運用・障害）と本番移行を担当しました

とはいえ、全く中身を知らなかったので手を動かしつつ、少しずつインプットしていました
分からないことは聞きつつ自分で調べて理解したので、そらで答えられることが増えました

AWSへの移行は特に目立ったトラブルもなく完了したので一安心したものの、
EC2を使っていて運用がつらい。。などの理由から今はECSへの移行を進めています

## キャンペーンに向けた準備
AWS移行が完了したことでサーバのスケールアウトやDBのスケールアップが容易に行えるようになりました
なので、キャンペーンによるアクセス増加がわかっている場合には事前にインフラ面をつよつよにして待ち受けます

事前準備をした時に限ってアクセスがそんなこないというあるあるをふむときもありますが、
想定通りアクセスがスパイクしてスケールアウト/アップしてよかったということもあるので準備しておくに越したことはないですね

この辺りは何回か試してみないと分からない部分でもあるので、ログを残しながら知見をためていっているといった感じです

## あるゆることを見直し
タイミング的なものもあり、所属しているチームではあらゆることを見直している最中です
ルールを明確にドキュメントに残したり、AWSのコストを削減してみたり。
今まではすでにあるルールに則って仕事をすることが多かったので、とても新鮮です！

どんなルールがいるのか（いらないのか）を背景から理解できるので勉強になってます
また、チームを一緒に作り上げていく感覚もあるので貴重な経験ですね

# よかったこと
## 準備を入念にできた
AWS移行では本番移行へ向けた準備に時間を割きました
そのため、事前検証したり、タイムスケジュールを詳細に組み、メンバーで何回か読み合わせるなどが功を奏しました
（もちろん、自分が参画する以前の環境構築やQAのおかげもあります）

数ヶ月前に読んだ本にもプロジェクトの成否は準備で決まると書いてあったので
準備はしすぎるに越したことはないと実感しました

現実的には時間やリソースの制約があるので準備に工数が割けないこともありますが、
調査や計画、検証にはそれほどお金がかからず、後の工程で発生しうるリスクを減らせるという強力なメリットがあります
これからもできるだけ準備を入念にしていきたいですね

## 1日の初めにスケジュールを組む
タスクが少ない時は何も決めず、カンバンとにらめっこしながらこなしていました
徐々にタスクが増えてくるとあれもこれもで、1つのタスクに集中できなくなりました

なので、出勤したらその日1日の予定をばーっと埋めて何時に何をやるかを明確にしてから業務開始するようにしてみました
時間を確保している分、そのタスクにのみ集中でき作業効率が上がった（気がします）

割り込みのタスクもあるのでスケジュール通りにいかないこともありますが、
今のところ性に合っているので取り入れてよかったです

# 反省点
## 言語化が苦手
フルリモートなのでテキストコミュニケーション中心であることや
他の人が見てもわかるようチケットやNotionにドキュメントを残すようにしています

が、
1つの情報も漏らさない＋参考リンクを載せると、冗長になり結局何が言いたいんだっけ状態に。
逆に言葉を削ぎ落とすと正確に伝わりづらかったりとなかなか難しさを感じています

仕事ができる人はこのあたりの塩梅が絶妙なので、自分もそうなりたいものです

## 他メンバーのプロジェクトやタスクを把握できてない
朝会で他のメンバーのタスクは聞いているものの、自分の前提知識がなくただ聞いているだけ状態が続いてます。

全てを細かく把握する必要はないかもしれませんが、
1. なぜやるのか（やらないのか）
2. 何に詰まったのか

などを知れたり、議論に混ざれるようになるので他のことに気を回す余裕が欲しい

# これから
## 絶賛進行中のECS移行をトラブルなく
まずは目の前のECS移行を完遂できるよう注力します
移行完了したら、サーバ運用が楽になるので改善活動に時間を割くことができるようになります

AWSへ移行した時ほど大掛かりなものではないとはいえ、油断せずしっかり準備していきます

## やっぱり経験や知識が足りない
チームで一番歴が浅いこともあり、チーム内でお話ししていても知識が足りないなと日々痛感しています
分からない単語を裏でコソコソ調べながら、訳わかっている顔で聞いてたりします
とはいえ、聞いたら教えてくれるのでそこに甘えて、すぐに教えてもらったりもしています
（心理的安全性が高いのでとても助かっています）

また、知見が足りないと自分の考えに自信が持てないときもあり、
「ここどうなっている？」とか「こっちの方がいいのでは？」となったときに尻込みしてしまいます
これによって提案や調整がその場で着地せず、宿題を持ち帰り再度MTGするという余計な時間が発生します

なので、
1. 一時情報にあたる
2. 理解したことを言語化する
3. 積極的に自分から首を突っ込む

などして知見を増やしていけたらなと。

# 最後に
大事だとは思いつつなかなか振り返りができていなかったので、
AdventCalenderという機会を得てまとめられたのはよかったです

来年は技術的なことを何か書けるよう頑張ります！

弊社ではSREを絶賛募集中です！興味がある方はぜひ！！
https://www.wantedly.com/projects/1626815
AWS Certified AI Practitioner（AIF）対策：LLM・SLM

# LLM（Large Language Model）

大規模言語モデルの略で、自然言語処理と呼ばれる分野で使用されます。

***<font color="MediumVioletRed">『汎用的なテキストデータを使って学習されており、様々な自然言語処理タスクで高い性能を発揮します』</font>***

- 大規模なデータセットとパラメータを使用してトレーニングされ、非常に高い精度と多様なタスク処理能力を持ちます。
- 計算リソースを大量に必要としますが、より複雑なタスクや精度が求められる場面に適しています。
- 開発・運用には膨大なデータと計算リソース、長い時間が要するため、コストが高いという課題があります。﻿

# SLM（Small Language Model）

***<font color="MediumVioletRed">『パラメータ数が少なく、特定の分野やタスクに特化して学習されている』</font>***

- 計算リソースの効率性を重視し、比較的小規模なモデルサイズで構築される。
- トレーニングや推論が高速で、コストも低めである。
- コスト面や運用の柔軟性に優れ、スマートフォンなどのエッジデバイスで利用することもできます。

:::note info
- **<font color="MediumBlue">SLM：効率性を重視</font>**
- **<font color="MediumBlue">LLM：性能を重視</font>**
:::
YAMAHA RTX1210ルーターで指定端末のアクセスを拒否する方法

## 概要
YAMAHA RTX1210ルーターで特定端末のみインターネットアクセスを拒否する設定方法について解説します。

## 前提条件
- YAMAHA RTX1210ルーター
- SSHによるリモートアクセスが可能な環境
- 拒否したい端末のMACアドレスが判明していること

## MACアドレスの確認方法
拒否したい端末のMACアドレスは以下のいずれかの方法で確認できます：

1. ルーターの管理画面から接続端末一覧を確認
2. Windows端末の場合：コマンドプロンプトで`ipconfig /all`を実行
3. Mac端末の場合：システム環境設定→ネットワークから該当の接続を選択

## SSHの準備
1. ルーターの管理画面にログイン
2. SSH機能を有効化
   - セキュリティ上、設定完了後はSSHを無効化することを推奨

 **注意**: セキュリティリスクを考慮し、必要な時のみSSHを有効化することをお勧めします。

## 設定手順

### 1. SSHでの接続
1. SSHクライアント（TeraTermなど）でルーターに接続
2. 一般ユーザーでログイン後、以下のコマンドで管理者権限に昇格：
```
administrator
```

### 2. フィルタリング設定
以下のコマンドを順番に実行：
```
ethernet filter 1 reject-log 90:2b:34:flag_cc:97:01 :::::
ethernet filter 100 pass-nolog ::::: :::::
ethernet lan1 filter in 1 100
```

#### コマンドの説明
- `reject-log`: アクセス拒否（ログを記録）
- `pass-nolog`: アクセス許可（ログを記録しない）
- 最後の数字（1 100）はフィルタリングの優先順位

### 3. フィルタリングの解除方法
拒否設定を解除する場合は、以下のように`pass`設定に変更：
```
ethernet filter 1 pass-log 90:2b:34:flag_cc:97:01 :::::
```

## 文字化け対策
TeraTermを使用する場合：
1. 「設定」→「端末」を選択
2. 文字コードを「UTF-8」から「SHIFT-JIS」に変更

> **注意**: Macのターミナルでは文字化けする可能性が高いため、WindowsのTeraTermの使用を推奨

## 補足事項
- GUIでの設定は限定的なため、詳細設定はコマンドラインかConfigファイルでの設定が必要
- フィルタリング設定後は正常に動作するか必ず動作確認を行う
- 設定変更後はSSHを無効化することを推奨

## 参考
https://network.yamaha.com/setting/router_firewall/security/lan_side/mac

https://note.com/noblehero0521/n/nfe969762f9fd

https://www.rtpro.yamaha.co.jp/RT/manual/rt-common/index.html

https://bacque.biz/archives/8048
Ubuntu Server 24.04でDocker＋MariaDBを用いてNextcloudを快適にセットアップする手順

# はじめに
最近、Ubuntu Server 24.04上でDockerを使い、NextcloudとMariaDBを組み合わせて構築したところ、とても快適な環境が整いました。
ここではその手順を紹介します。

UbuntuにDockerをインストールする記事は以下参照。

https://qiita.com/yu_uk/items/522cc91856a7262f343f

## 背景

Nextcloudは、オープンソースのプライベートクラウドストレージソフトウェアで、ファイル同期や共有、グループウェア機能などを備えています。 
従来、Raspberry Pi上でNextcloudを運用することもありましたが、パフォーマンス面やMicroSDの書き込み寿命などの問題があり、運用が安定しませんでした。
今回は、余っていたデスクトップPCにUbuntu Server 24.04を導入し、DockerとMariaDBを用いてより安定的かつ高速なNextcloud環境を構築しました。

## 環境

| 項目 | スペック・バージョン |
|------|----------------------|
| ハードウェア | DELL製デスクトップPC |
| CPU　| Intel Core i7(第3世代) |
| メモリ| 24GB |
| ストレージ| 500GB SSD + 4TB HDD |
| OS | Ubuntu Server 24.04 |
| Docker | 24.0.2 |
| Docker Compose | 2.17.2 |
| Nextcloud | Ver30 (latest) |
| MariaDB | 10.5 |

## セットアップ手順

### 1. DockerとDocker Composeのインストール

```bash
sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl start docker
sudo systemctl enable docker
```

インストール後はバージョンを確認します。

```bash
docker --version
docker-compose --version
```

### 2. docker-compose.ymlファイルの作成

以下の内容で`docker-compose.yml`ファイルを作成します。
NextcloudとMariaDBを連携し、データを永続化する設定が含まれています。

```yaml
version: '3'
services:
  db:
    image: mariadb:10.5
    container_name: nextcloud-db
    restart: always
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: mysecretpassword
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextclouduser
      MYSQL_PASSWORD: nextcloudpassword

  app:
    image: nextcloud:latest
    container_name: nextcloud-app
    ports:
      - 8080:80
    volumes:
      - nextcloud_data:/var/www/html
    restart: always
    environment:
      MYSQL_PASSWORD: nextcloudpassword
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextclouduser
      MYSQL_HOST: db
    depends_on:
      - db

volumes:
  db_data:
  nextcloud_data:
```

### 3. コンテナの起動

`docker-compose.yml`ファイルがあるディレクトリで以下を実行します。

```bash
sudo docker-compose up -d
```

起動後、`docker ps`でコンテナが正常に稼働しているか確認します。

### 4. Nextcloud初期設定

ブラウザで`http://[サーバーのIPアドレス]:8080`にアクセスすると、Nextcloudの初期設定画面が表示されます。以下の情報を入力して設定を完了してください。

* データベースユーザー名: `nextclouduser`
* データベースパスワード: `nextcloudpassword`
* データベース名: `nextcloud`
* データベースホスト: `db`

設定を完了すると、Nextcloudが利用可能になります。

## 使用感とポイント

* Dockerによるコンテナ化で環境構築が非常にシンプルになり、メンテナンスやアップデートが容易です。
* MariaDBとの組み合わせにより、安定したデータベース運用が可能で、Nextcloudのパフォーマンスも向上しました。
* Ubuntu Server 24.04上での稼働は軽快で、大容量のストレージを活用した快適なプライベートクラウド環境が実現できます。

## セキュリティや拡張性への配慮

* `docker-compose.yml`内にパスワードを直接記述するのは避け、`.env`ファイルで環境変数として管理することを推奨します。
* HTTPS化やリバースプロキシ（NginxやTraefik）を組み合わせることで、よりセキュアなアクセス環境を整えることが可能です。

## まとめ

DockerとUbuntu Serverを活用することで、Nextcloud＋MariaDBによるプライベートクラウド環境が容易かつ快適に構築できました。
大容量ストレージを備えたPCで運用することで、Raspberry Pi環境では得られなかった安定性や高速性が手に入ります。
「自分だけのプライベートクラウドを作りたい」という方は、ぜひこの手順を参考にしてみてください。

 Dockerを使うと環境が簡単に構築でき保守もかなら楽です。
そのあたりについても記事にしていきたいと思います。
メルカリハッカソン 2024 体験記


# メルカリハッカソンで準優勝しました！

こんにちは、現在no plan inc.でインターンをしている京谷です！
NFTに興味を持ったことをきっかけに、ブロックチェーンやスマートコントラクトの書き方を学び始めました。現在は、バックエンド開発の実務にも携わっています！

先日、メルカリのハッカソンで準優勝を獲得しました。このイベントでは、メルカリとメルコインをさらに進化させるための新機能を競い合う場となり、非常に刺激的な体験でした。この経験を振り返りながら、どのようなプロジェクトを作成したのか、そして得た学びについて共有したいと思います。

## ハッカソン概要

今回のハッカソンは、メルコインとメルカリハロの2つのサービスが協力して開催されました。それぞれから4チームずつ、合計8チームが出場しました。この中から上位3チーム選出するという形式でした。各チームの構成は以下の通りです：

- PM（プロダクトマネージャー）1名
- マーケター 1名
- デザイナー 1名
- エンジニア 2名

この構成は、私がこれまで経験してきたブロックチェーン関連のハッカソンとは大きく異なり、多様な専門性が活かされる場になっていました。

## チームの目標とプロジェクト概要

私たちのチームはメルコインチームとして、「メルカリ内のエンゲージメントで成長するキャラクター育成ゲームの提供」をテーマに取り組みました。

### 背景 / Background
メルカリのユーザーは多いものの、プラットフォームへの愛着不足やロイヤルティプログラムが無いという課題がありました。

### 何をやるか / What we do
「メルモン」という、ユーザーのエンゲージメントに応じて成長するキャラクター育成機能を提供し、エンゲージメントを拡大させることを目指しました。

### なぜうまくいくか / Why it works
- メルカリの広大なユーザープールを活用
- 魅力的なインセンティブ設計により、ユーザーの継続利用を促進

### 技術的な工夫

1. **ダイナミックNFTの活用**
   - ユーザーの行動（購入、出品、評価など）に応じて、メルモンが成長する仕組みを構築しました。
   - スマートコントラクトで進化情報をオンチェーンに記録。

2. **オンチェーンとオフチェーンの連携**
   - オンチェーンでは、メルモンの餌の量や比率、進化情報を記録。
   - オフチェーンでは、ユーザーのウォレットアドレスやクーポン発行情報を管理する設計を検討しました。

3. **高速化の仕組み**
   - スマートコントラクトの情報をデータベースやキャッシュで管理し、スマートコントラクトを叩く処理以外は高速に表示できる仕組みを設計予定でした。

![スクリーンショット 2024-12-11 11.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657206/6874ea94-418e-ff66-da7a-7b5a490a9640.png)



## ハッカソンでのプロセス

### 初日：アイデア出しと役割分担
初日はチームメンバーそれぞれが腹を割って話していなかったものの、アイデアをブレインストーミングし、大枠となる方向性を決定しました。どんなプロダクトを作るべきか議論する中でPMのリードが光り、全員が方向性を共有しました。

### 二日目：設計と実装の議論
二日目には、マーケター、PM、デザイナー、エンジニア全員で本当にこのプロダクトがうまくいくのかを深く議論しました。さらに、メルカリのエンジニアの方からのアドバイスを受け、単にフロントエンドとブロックチェーンをつなげるだけでなく、バックエンドの処理設計も考える必要があることに気づきました。時間が限られていたため、どの部分をオンチェーンに残し、どこをオフチェーンで管理するかを明確にしました。

### 最終日：実装とプレゼン準備
最終日はフロントエンドの完成度がまだ低かったため、急ピッチで作業を進めました。また、技術解説用のスライドを作成し、制限時間の5分以内で収まるようにプレゼンの練習も繰り返しました。チーム全員が全力を尽くし、無事に発表を成功させることができました。プレゼン後は豪華な食事も用意されていてテンションめちゃくちゃ上がりました！
![IMG_1206.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657206/98ed1361-bc73-1bdb-1af9-fbf12196e6c2.jpeg)



## 得た学び

- **異なる専門性を持つメンバーとの協業**
  - 今回のハッカソンでは、エンジニアだけでなくPM、マーケター、デザイナーと協力することで、多様な視点を活かしたプロジェクト作りができました。

- **ユーザー目線の重要性**
  - ブロックチェーンの技術中心のプロジェクトとは異なり、ユーザーにとって本当に便利な機能を考えることが重視されました。

- **時間管理と優先順位付け**
  - 限られた時間の中で、どの機能に注力するべきかを判断するスキルが求められました。

## 最後に

今回のハッカソンは、多くの刺激と学びを得られる貴重な体験でした。準優勝という結果には満足しつつも、次回はさらに高みを目指したいと思います！

もし同じようなハッカソンに興味がある方がいれば、ぜひ参加してみてください。そして、この記事が少しでも参考になれば嬉しいです。

最後まで読んでいただきありがとうございました！

---

これからも面白い技術やプロジェクトに挑戦していきたいと思いますので、どうぞよろしくお願いします！

（コメントやフィードバックも大歓迎です！）
c#で、なでしこ その8

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
c#をコンパイルして実行せよ。

# サンプルコード

```
F =「hello.cs」を「書」でファイルストリーム開く
「using System;」をFにファイルストリーム一行書く
「public class HelloWorld  {\123}」をFにファイルストリーム一行書く
「    static public void Main ()  {\123}」をFにファイルストリーム一行書く
「        Console.WriteLine ("Hello World!!");」をFにファイルストリーム一行書く
「    }」をFにファイルストリーム一行書く
「}」をFにファイルストリーム一行書く
Fをファイルストリーム閉じる
S =「C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc hello.cs」をコマンド実行
#S =「type hello.cs」をコマンド実行
Sを表示
S =「hello」をコマンド実行
Sを表示

```

# 実行結果

```
>cnako2 csc.nako
Microsoft (R) Visual C# Compiler version 4.8.9232.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240


Hello World!!
```

以上。
WorkatoでSlack等の複数メンションを動的に生成する

# はじめに
Workatoを使ってSlackやMicrosoft Teamsにメッセージを送信する際、メンションを付けることがあります。通常のUIでチャット欄に「@誰々...」と入力するのとは異なり、APIを利用する場合は、メンションとして認識される記法に従った文字列を生成し、メッセージに含める必要があります。

例えば、Slackの場合は`<@ユーザーID>`という記法を用いることで、特定のユーザーへメンションを送信できます。

固定の相手や1名宛てのメンションであれば、レシピの実装は比較的簡単です。しかし、**処理内でリストアップされた複数名のユーザーに対して同時にメンションを送る**必要がある場合は、少し複雑に思えるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/66899d96-eaeb-5f57-63ae-db8d1c1f1dd1.png)


実は、Workatoのformulaを活用することで、この複数メンションの実装をシンプルに行うことができます。




# ２つのformulaを併用します

### format_map
format_mapというformulaを使うと、リストの各行にフォーマットを適用できます。
（テキストのフォーマットとは、データを特定の構造や見た目に整えることです）
各行のフィールドの値を使用しながら、任意の文字列を作り出せるんですね。
フィールドは %{ `field_name` } という形式で表現します。

使用例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/18a7b31c-4a0d-d522-7ae8-37e320e24fac.png)

### join
これは皆さんもよく使っているformulaだと思います。
リスト内のすべての項目を、区切り文字で繋ぎながら１つの文字列に結合します。


### どのように使うか
Slackを例とした場合の、メンション文字列の生成における各formulaの役割は以下です。
- format_mapの役割：リストの各行の`SlackユーザーID`フィールドを抜き出して、<@と>で装飾
- joinの役割：フォーマット済みの文字列を半角スペースで結合


与えられたデータがハッシュなのか文字列のリストなのかに応じて、微妙にパラメータが異なるためそれぞれ解説します。


# ハッシュのリストの場合
ハッシュ（連想配列）は、「キー」と「値」をセットでデータを管理する仕組みです。たとえば、名前と年齢をセットで保存するとき、`{"name" => "田中", "age" => 25}`のように、キー（name、age）を使って値（田中、25）にアクセスできます。
この形式は、APIのレスポンスでJSON形式のデータを受け取る際によく使われます。また、スプレッドシートのデータを読み込んだり、何らかのデータセットを取得した場合にも見られる形です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/183d43c3-3556-27b6-be92-32726e166304.png)


### 実装内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/93492f6b-e3fb-c322-1306-742e00186b1a.png)


```ruby:formula記述（コピペ用）
ハッシュのリスト.format_map('<@%{col_社員SlackID}>').join(" ")
```

中括弧{ }内で、対象リストの**フィールド名**を指定します。

:::note warn

上記の例ではフィールド名を指定する際に「**col**_」を先頭に付けていますが、これは**スプレッドシートのデータ操作における固有の仕様**です。
他アプリケーションのデータについては、フィールド名のみの指定で問題ありません。
:::

### 実行結果
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/d7c15654-b5bd-d849-c079-b89f967dbdfc.png">


### ＜余談（こんな加工もできます）＞
**社員氏名に「さん」を付けて、句点で区切る** こともできます。

```ruby:formula記述（コピペ用）
ハッシュのリスト.format_map('%{col_社員氏名}さん').join("、")
```
```:実行結果
{
	"message": "デモ太郎さん、デモ花子さん、デモ二郎さん"
}
```

# 文字列のリストの場合
特定のフィールドやエンティティに関する複数の値を含むデータが返されるケースでは、ハッシュではなく、単純な配列で返されることがあります。

具体例として、SlackWorkbotのモーダル画面でユーザーを複数選択した場合は、次のようなデータが返却されます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/94db42df-875a-a5ff-91ea-cd38626d28b4.png">

### 実装方法
上記を例として、メンション文字列を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/e02fcfc9-fefc-e7dd-1f51-baa2cdcf85e5.png)

ハッシュのリストとの違いとしては、keyが無いことです。
この場合、「**%s**」を使用して値にアクセスします。

```ruby:formula記述（コピペ用）
文字列のリスト.format_map('<@%s>').join(" ")
```
### 実行結果
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/30ea22f5-8f43-6463-cb1e-4aaef6b0baed.png">
Clojure: RingでTodoアプリを作る - ルーティング

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 14*](https://qiita.com/advent-calendar/2024/clojure)

昨日までで、Todoアプリを作成するための準備が整いました。

今日は実際に実装していきます。

簡単なCRUDのアプリを想定します。

作るリクエストの口としては、

|項目           |メソッド|パス            |
|--------------|------|------------------|
|Todoの作成     |POST  |`/v1/todos/{id}` |
|Todo一覧の取得  |GET   |`/v1/todos`     |
|特定のTodoの取得|GET   |`/v1/todos/{id}` |
|Todoの変更     |PUT   |`/v1/todos/{id}` |
|Todoの削除     |DELETE|`/v1/todos/{id}` |

こんなところでしょうか。

まずはルーティングを作っていきます

ルーティングには `compojure` を使います

:::note info
もちろん`compojure`を使わなくてもルーティングを表現することはできますが、
使うとソースコードがシンプルになるので今回は採用します
:::

## Compojure

https://github.com/weavejester/compojure

まずはプロジェクトに追加します

```clojure
  :dependencies [[org.clojure/clojure "1.11.1"]
                 [...]
                 [compojure "1.7.1"]]
```

`compojure`は`ring`と連携することができるので、
`defroutes`で複数のルーティングを定義し、そのルーティングを読み込み`ring`でサーバーを起動します

個々のルーティングは`GET`や`POST`といったマクロで定義します

```clojure
(ns todo.core
  (:require [ring.adapter.jetty :as jetty]
            [compojure.core :refer [defroutes GET]]
            [compojure.route :as route]))

(defroutes handler
  (GET "/v1/todos" [] {:status 200 :body "Hello, World!"})
  (route/not-found {:status 404 :body "Not Found"}))

(defn -main []
  (jetty/run-jetty handler {:port 3000}))
```

これで、`GET /v1/todos`と、マッチしなかったときの `404` のパターンを作れました

実際にリクエストを送ってみます

```bash
$ curl localhost:3000/v1/todos
Hello, World!

$ curl localhost:3000/not-found-path
Not Found
```

うまくルーティングが設定できたようです。

この調子ですべてのルーティングを作ってしまいます

```clojure
(defroutes handler
  (POST "/v1/todos" [] {:status 200 :body "作成しました"})
  (GET "/v1/todos" [] {:status 200 :body "Todoの一覧を返します"})
  (GET "/v1/todos/:id" [id] {:status 200 :body (str "Todoを返します(id:" id ")")})
  (PUT "/v1/todos/:id" [id] {:status 200 :body (str "更新しました(" id ")")})
  (DELETE "/v1/todos/:id" [id] {:status 200 :body (str "削除しました(id: " id ")")})
  (route/not-found {:status 404 :body "Not Found"}))
```

これらにリクエストを送ってみます

```bash
# GET /v1/todos
$ curl localhost:3000/v1/todos
Todoの一覧を返します
# GET /v1/todos/:id
$ curl localhost:3000/v1/todos/1
Todoを返します(id:1)
# POST /v1/todos
$ curl localhost:3000/v1/todos -X POST
作成しました
# PUT /v1/todos/:id/:item
$ curl localhost:3000/v1/todos/1/title -X PUT
更新しました(1)
# DELETE /v1/todos/:id
$ curl localhost:3000/v1/todos/1 -X DELETE
削除しました(id: 1)
```

ちゃんと動いてそうです

明日はミドルウェアを使い、**json**を扱えるようにしていきます
GitHub Copilotを使ってみた

## はじめに
GitHub Copilotを実際に使ってみて便利だったので共有したい。
GitHub Copilotは有料のサービスであるため、導入に悩む方が多いかもしれないので、
具体的に現在どういった使い方をしているのか記載してみました。
手順について、割愛させていただきます。
公式のドキュメントは以下です。
https://docs.github.com/ja/copilot

## 使い方
### Github Copilot Chat
チャット形式で会話ができます。
ChatGPTと同じような使い方ができます。
![github_copilot_chat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784994/3e300cdd-dd19-fcbe-26e1-83c3833e0b6a.png)

### 文章補完機能
以下の郵便番号検索APIを使って具体例を記載します。
https://zipcloud.ibsnet.co.jp/doc/api
URLを記載するだけで説明文が生成されます。
![文章補完機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784994/d15f95fe-0b26-29f1-1ba9-8f206fbdfba3.png)

改行とタブだけでコードが生成されていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784994/16d8acb2-f3b6-9622-03de-a1fba883e804.png)

Github Copilot Chatも含めて要望を追加していくと、住所が取得できる関数を作成できました。
![住所取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784994/09366f23-cf44-f317-2222-3d578afe5866.png)

### リファクタリング
リファクタリング機能があります。
以下は悪いコードの例です。このコードは、リスト内の数値をフィルタリングして合計を計算しますが、無駄に複雑で理解しにくいです。
![complex_bad_code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784994/7b959a68-e643-7e74-0d57-1b4246f555e1.png)
以下はリファクタリングしたコードです。
リファクタリングしてとGithub Copilot Chatに記載するだけで簡単にできます。
![calculate_sum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784994/009d2584-98a2-328b-6736-327c17d08da8.png)

コメント欄を入れると自動で関数の説明が作成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784994/84c074c1-7938-cf11-9056-160b05e77d0f.png)

レビューをすることがあり、違和感があるコードを見つけるとひとまずリファクタリングして試しています。


## まとめ
GitHub Copilotは補完機能やリファクタリング機能など開発効率を上げることが可能です。
もちろん誤字や間違いが発生しますが、進化過程にあるため、今後さらに便利になることを期待できます。
大量にコードを記載する場合は間違いなく効率アップに繋がりますので、おすすめです。
【Unity：エディタ】Unityからシェルスクリプトを実行してみよう

グレンジ [Advent Calendar 2024](https://qiita.com/advent-calendar/2024/grenge) 14日目担当の@shirasaya0201です

## 概要

シェルスクリプトをUnityのエディタウィンドウから実行する機会があったので基本的な手順をまとめてみました

## シェルスクリプト作成

まずは呼び出すシェルスクリプトを作成します

```shell:HelloWorld.sh
#!/bin/bash

echo "Hello World" $1
```

Hello World を出力、ついでに引数（$1）も渡せるようにしてみます

## エディタウィンドウ作成

次にUnityでエディタウィンドウを作成します

```csharp:SampleEditor.cs
using System.Diagnostics;
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;

public class SampleEditor : EditorWindow
{
    [MenuItem("Window/Sample")]
    public static void ShowWindow()
    {
        var window = GetWindow<SampleEditor>("Sample Editor");
        window.ShowUtility();
    }

    private void CreateGUI()
    {
        var button = new Button();
        button.text = "Run";
        button.clicked += () =>
        {
            UnityEngine.Debug.Log("Button clicked");
        };
        rootVisualElement.Add(button);
    }
}
```

Unityのメニュー Window > Sample でウィンドウが開きます
ボタンを押すと Button clicked のログが表示されます

## 実行メソッド作成

外部プロセスを実行したい時は System.Diagnostics.Process を使用します
使いまわせるように汎用的なメソッドを作ります

```csharp:SampleEditor.cs
public class SampleEditor : EditorWindow
{
    ...
    
    private void Run(string fileName, string arguments)
    {
        var process = new Process();
        process.StartInfo.FileName = fileName;
        process.StartInfo.Arguments = arguments;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
    
        process.Start();
        var output = process.StandardOutput.ReadToEnd();
        var error = process.StandardError.ReadToEnd();
        process.WaitForExit();
    
        if (!string.IsNullOrEmpty(output))
        {
            UnityEngine.Debug.Log(output);
        }
        if (!string.IsNullOrEmpty(error))
        {
            UnityEngine.Debug.LogError(error);
        }
    }
}
```

引数について
<dl>
  <dt>fileName</dt>
  <dd>外部プロセスのファイル名を指定</dd>
  <dt>arguments</dt>
  <dd>外部プロセスに渡す引数を指定</dd>
</dl>

## 実行

ボタンを押した時のイベントを書き換えます

```csharp:SampleEditor.cs
using System.Diagnostics;
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;

public class SampleEditor : EditorWindow
{
    ...

    private void CreateGUI()
    {
        var button = new Button();
        button.text = "Run";
        button.clicked += () =>
        {
            var path = "最初に作成した HelloWorld.sh のフルパス";
            Run("chmod", $"+x {path}");
            Run("/bin/bash", $"{path} {123}");
        };
        rootVisualElement.Add(button);
    }

    ...
}
```

path には最初に作成したシェルスクリプトのフルパスを指定します
1つ目の Run で実行権限を付与しています
2つ目の Run でシェルスクリプトを実行しています
パスの後にスペースを開けて引数を入力します

ボタンを押すと以下がログに出力されます
```
Hello World 123
```

## まとめ

Unityから外部プロセスを実行することはあまりなさそうですが、Unityから何かを実行するツールを作成するときなどは重宝しそうです
今回は比較的シンプルな実装でしたが、またの機会にもう少し深掘りしてみようかと思います
【React＆TypeScript基礎知識】ReactとTypeScriptについて調べてたら集めた資料が大量になったからまとめてみた

初投稿
## 概要
サークルでReactを使うと言われ、Reactについて調べていたら資料が大量に集まってしまい忘れたりして見返したいとき自分が見返しやすいようにまとめることにした

# Reactとは
**Reactとは**ユーザインターフェース(UI)を構築するためのJavaScriptライブラリである

### Reactの基本ルール
React自身ではデザイン（CSS）は設計しない
React内でのHTMLのところはJSXという書き方で書く
Reactでのレンダリングを指定したエリア内はすべてReactで生成する（＝一部だけ生のHTMLで書くことはできない

### ライブラリとは
いろいろな便利な機能が準備されていて、必要に応じて必要な機能を利用できる。つまり、作業を簡略化するために使用できる予め書き込まれたプログラムの集まりのことである（例：React、jQuery）
## ライブラリとフレームワークの違いは何？
### そもそもフレームワークとは
そもそも**フレームワークとは**アプリケーションを開発するのに必要な処理・機能が一通り揃っているものを示し（例：Vue.js）、アプリケーションとして動く骨組みが用意されているので別途プログラムを書かなくても最低限のアプリケーションとして動作できる。つまりフレームワークはデフォルトでアプリケーション開発に必要な機能がそろっているものであり、そこに自分の実装したい内容を追加していくものである
### つまりライブラリとフレームワークの違いは何？
ライブラリとフレームワークはどちらもアプリケーション開発を効率化できるものだが、ライブラリは特定の機能を実装するときにコードを書く作業を簡略化でき、フレームワークはアプリケーションを開発するときに必要な土台を作る作業を簡略化できる

## 参考
https://3chome.net/javascript-typescript-react/

https://3chome.net/javascript-typescript-react/

https://zenn.dev/nameless_sn/articles/framework_and_library

https://qiita.com/koeri3/items/c8d6abed6fa862093ebb

https://qiita.com/tomipetit/items/6563eacd88e63bda5de3

# TypeScript
### JavaScriptとTypeScriptの違い
**JavaScriptは**動的型付け言語であり、実行時に変数の型が決定されるため変数の型を宣言せずに値を代入できるが、型チェックがないため変数を間違えたり予期しないデータ型を扱ったりする可能性がある。**TypeScriptは**静的型付け言語であり変数を宣言する必要があるがコードをコンパイルする際に型チェックをしてくれ、型定義やインターフェース、ジャネリクスなどの機能を提供していてTypeScriptはプロジェクトの規模が大きくなるほど恩恵が強く得られる
## .jsと.jsxと.tsと.tsxの違い
###.jsと.jsxの違い
どちらもJavaScriptで使う拡張子だが、.jsはdivなどのHTML風のタグやReactを使用しないプロジェクトや、Reactコーポネートを別のファイルで記述する場合などに適していて、純粋なJavaScriptを書くことが一般的であり、.jsxはdivなどHTML風のタグを使うときやReactUIコンポーネントを記述する際に使用します、JSX(JavaScript XML:Reactなどのライブラリで使用されるJavaScriptとXML風の記述を組み合わせたもの)がデフォルトで使用できReactUIコンポーネントを直接記述できる
### .tsと.tsxの違い
**.ts**はReactを使用しないプロジェクトやReactコンポーネント以外のTypeScriptコードを記述する場合などの通常のTypeScriptコードを記述するために使用され、**.tsx**は.jsxのTypeScript版であり.jsxと同じで場合にTypeScriptを使用したいとき使用する
#### .tsファイル名
型の定義：〇〇〇Type.ts
カスタムフック：use〇〇〇.ts
定数定義：〇〇〇Constants.ts
### 参考
https://3chome.net/javascript-typescript/
### その他参考
https://3chome.net/javascript-typescript-folder/

https://3chome.net/react-typescript-issues/

https://qiita.com/mzmz__02/items/63f2624e00c02be2f942

https://3chome.net/react-typescript-issues/
ハードウェア全く知らない人がFPGAとASICの違いを理解してみる。

# FPGA（Field Programmable Gate Array）とは

横文字でフィールド・プログラマブル・ゲート・アレイの略である。
簡単にいうと「プログラム可能な集積回路」の事である。

- 柔軟性が高い 設計後でも回路の動作を変更できるため、試作や実験に向いている。
- 開発が迅速 設計から実装までの時間が短くすぐに動作確認が出来る。
- コスト 少量生産やプロトタイプにはコスト効率は良い！しかし、大量生産には向かない。
- 用途　学習用、研究開発、製品の初期段階（プロトタイプの制作）など

揮発性のSRAMを用いて、LUT(Look Up Table)を切り替えて論理回路を実現。

**もう少し噛み砕いていうと・・・**
LUTは入力に対するあらかじめ用意された答えはこれという決められた結果をすぐに出せるようにする仕組みの事らしい。(論理演算について)
つまり、SRAMの中身を書き換えればLUTが別の動きをするようになるということ。

# ASIC(Application Specific Integrated Circuit)とは？
横文字でアプリケーション・スペシフィック・インテグレーテッド・サーキットの略である。
簡単にいうと、特定の仕事だけをこなすために作られたオーダーメイドの電子回路の事。

- 専用であるという事 特定の機能や用途に最適化されている。非常に効率的である。
- 性能 高性能で省電力な設計が可能。
- コスト 設計や製造にかかる初期費用が高い。（長い目で見れば1個あたりのコストが低い。）
- 用途 スマホのプロセッサー、自動車の制御システム、家電製品など大量に必要とされる製品。

ASICには大きく分けて2種類がある。
フルカスタムICと基本的な回路や機能ブロックなどを組み合わせて設計を行うセミカスタムICがある。

セミカスタムICには基本的な論理回路を敷き詰めた半完成部品を用意し、回路間の配線を指定することで機能を実装するゲートアレイ方式がある。

機能を実装した部品化された回路を組み合わせていくスタンダートセル方式がある。

両者の特徴を合わせたエンベデットアレイ方式がある。


~~将来ハードウェア屋さんになるわけでもないしこの程度のふんわりした理解でいいでしょ・・・~~


# 参考文献（参照日2024年12月11日）

https://www.epson.jp/prod/semicon/products/asic/about_asic1.htm