432 Views
September 20, 24
スライド概要
ソースをオープンにして公開するメリットを、ブログ書く理由を例に説明します。
また、いくつかの OSS の事例を挙げオープンの動機付けを行います。
最後にオープンでうれしいことを実感してもらうため AI を扱うコードを公開し、アプリに組み込む例を挙げます
mishizaki
ソースオープンのススメ v 2024 09 石崎 充良 1 / 22
自己紹介 石崎 充良 ( @mishi_cs ) C# Tokyo コミュニティ管理メンバー GitHub: https://github.com/m-ishizaki blog: https://rksoftware.hatenablog.com/ 2 / 22
1. (分量:03 ページ) ソースオープンとは 2. (分量:05 ページ)人はなぜブログを書くのか 3. (分量:02 ページ)とはいえそんな分量は書けない 4. (分量:04 ページ)今日のために Pleasanter に AI を組み込んでみた 5. (分量:01 ページ)まとめ 目次 3 / 22
ソースオープンとは OSS とはオープンなソースのソフトウェア では ありません Open Source Initiative(OSI)という組織が認め たライセンスを採用しているソースコードと解釈 しておけばよいでしょう。 **要件にソースがオープン** というのがあります。 4 / 22
OSS にしなくてよいのか? OSS にしてください Open Source Initiative (OSI)という組織が認めた ライセンス(定番ライセンス) 定番ライセンスは 読まなくてよい 誰でも利用可能 例えば OSS は軍事利用が可能です 軍事利用が可能でないならば OSS ではありません https://github.com/m-ishizaki/CSTokyoCSharpOdai/blob/main/LICENSE 5 / 22
適用が簡単 GitHub でリポジトリを作るときに マウスをカチカチするだけ で適用で きる、親切設計 マウスぽちぽち で OK https://github.com/new 6 / 22
1. (分量:03 ページ) ソースオープンとは 2. (分量:05 ページ)人はなぜブログを書くのか 3. (分量:02 ページ)とはいえそんな分量は書けない 4. (分量:04 ページ)今日のために Pleasanter に AI を組み込んでみた 5. (分量:01 ページ)まとめ 目次 7 / 22
人は忘れる生き物だから 学んだことは書き留めておかねばなりません どこに? どうやって 読み返す? 紙のノート? 自宅 PC 上のファイル? クラウドストレージ? ノートを探してページを探して? 自宅に帰って フォルダをたどって? いつでも、どこでも Web 検索で 読み返せたら最強なのでは! 8 / 22
例えば C# で早いコードを書きたいけど、ベンチ マークの取り方どうやるんだっけ? https://www.google.com/search https://rksoftware.hatenablog.com/entry/2023/12/19/010000 9 / 22
不十分・わかりにくい 調べものをしていて、良さそうな記事を見つけました。喜んで読んでみると 記事を書いた 本人にとって 十分でわかりやすい 10 / 22
例えば 検索したのは自分 C# で早いコードを書きたいけど、ベンチ マークの取り方どうやるんだっけ? 書いたのは自分 読んでいるのは 自分 自分の自分による自分のための記事 自分が書いたものが自分にとって一番わかりやすい https://www.google.com/search https://rksoftware.hatenablog.com/entry/2023/12/19/010000 11 / 22
プログラム ソースコード も同じです CSV を読み込むロジックってどうだったっ け? 自分で書いた自分 にとってわかりや すいソースコード https://www.google.com/search https://github.com/m-ishizaki/CsvParser/blob/main/src/CsvParser/CsvReader.cs 12 / 22
1. (分量:03 ページ) ソースオープンとは 2. (分量:05 ページ)人はなぜブログを書くのか 3. (分量:02 ページ)とはいえそんな分量は書けない 4. (分量:04 ページ)今日のために Pleasanter に AI を組み込んでみた 5. (分量:01 ページ)まとめ 目次 13 / 22
大丈夫です C# 界最速の enum ライブラリ ダウンロードして ソースコード部分 (8 万文字程度のサイズ) ※ Pleasanter には 1 ファイル 5 百万文字 5MB あり https://github.com/xin9le/FastEnum 14 / 22
さっきの CSV Parser 敷居を下げることが割と得意です。 たったの 54 行 のソースコードでオープン しています。 ダウンロードして ソースコード部分 (2,300 文字・54 行) https://github.com/m-ishizaki/CsvParser/blob/main/src/CsvParser/CsvReader.cs 15 / 22
1. (分量:03 ページ) ソースオープンとは 2. (分量:05 ページ)人はなぜブログを書くのか 3. (分量:02 ページ)とはいえそんな分量は書けない 4. (分量:04 ページ)今日のために Pleasanter に AI を組み込んで みた 5. (分量:01 ページ)まとめ 目次 16 / 22
AI を使うコードを GitHub で公開 つまり 皆さん Pleasanter に AI を組 み込めるということです 本当は皆さんがソースコードを見なくても 使えるようにしたかったのですが、時間切 れ…… https://github.com/m-ishizaki/AIClientAPI https://github.com/m-ishizaki/OpenAIChatSample/ 17 / 22
ソースコード テーブルの管理 Pleasanter のソースにファイルを追加 C# コードのソースコードファ イルとして読まれるところなら どこにでも テーブルの管理でボタンと ↑で追加した機能を呼び出 すスクリプトを追加 18 / 22
ソースコード貼り付けページ
今は読まなくて大丈夫です。後でじっくり読んでください
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
using System.Linq;
namespace RKSoftware.AIClientAPI.Controllers;
[Microsoft.AspNetCore.Mvc.ApiController]
[Microsoft.AspNetCore.Mvc.Route("[controller]")]
public class AIController : Microsoft.AspNetCore.Mvc.ControllerBase
{
public record PostParameter(string UserMessage) { }
public record Result(string AIMessage) { }
// API Key 等。ここでは環境変数から取得。コードに書かなくてよいように
// DeploymentName は環境変数にしなくてもよいとは思いますが、コピペで検証しやすいように環境変数にしています
static readonly string openAIEndpoint = Environment.GetEnvironmentVariable("OpenAIEndpoint")!;
static readonly string openAIAPIKey = Environment.GetEnvironmentVariable("OpenAIAPIKey")!;
static readonly string openAIDeploymentName = Environment.GetEnvironmentVariable("OpenAIDeploymentName")!;
// システムプロンプトの文言を用意しておきます
static readonly string systemPrompt = "ユーザーからのメッセージを要約してください";
// エンドポイント、キー、デプロイメント名を使って AI のクライアントを生成しておきます
static readonly Azure.AI.OpenAI.AzureOpenAIClient client = new Azure.AI.OpenAI.AzureOpenAIClient(new Uri(openAIEndpoint),
new Azure.AzureKeyCredential(openAIAPIKey));
[Microsoft.AspNetCore.Mvc.HttpPost()]
public async Task<Result> Post(PostParameter p)
{
// AI と会話する会話履歴オブジェクトを生成。システムプロンプトとユーザーからの質問を保持
List<OpenAI.Chat.ChatMessage> chatHistory = new() { OpenAI.Chat.ChatMessage.CreateSystemMessage(systemPrompt),
OpenAI.Chat.ChatMessage.CreateUserMessage(p.UserMessage) };
// AI のクライアントを生成し回答を得る
var aiMessage = (await
client.GetChatClient(openAIDeploymentName).CompleteChatAsync(chatHistory)).Value.Content.Last().Text;
return new Result(aiMessage);
}
}
<form><button id='testButton'>AI 要約</button></form>
<script>
function addAIClientAPI(idButton, idTextarea, site) {
document.getElementById(idButton).setAttribute('onclick', `aiClientAPI('${idTextarea}', site);return false;`);
}
function aiClientAPI(id, site) {
var elm = document.getElementById(id).children[0].children[0];
fetch(`${site}/AI`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userMessage: elm.innerText })
})
.then(response => response.json())
.then(data => {
elm.innerText = data.aiMessage;
})
.catch(error => {
alert(error);
});
}
const site = '';
addAIClientAPI('testButton', 'Results_Body.viewer', site);
</script>
19 / 22
実行結果 20 / 22
1. (分量:03 ページ) ソースオープンとは 2. (分量:05 ページ)人はなぜブログを書くのか 3. (分量:02 ページ)とはいえそんな分量は書けない 4. (分量:04 ページ)今日のために Pleasanter に AI を組み込んでみた 5. (分量:01 ページ)まとめ 目次 21 / 22
まとめ ⚫ 学んだことを GitHub に置いていけば ⚫ Web 検索でいつでもどこでも参照可能 ⚫ 自分のために自分の知識を OSS に ⚫ どこに居ても、どこに行っても Pleasanter に自分機能を追加 22 / 22
ありがとうございました。 石崎 充良 23 / 22