ドミノソフト公式ブログ

合同会社ドミノソフトの公式ブログです。

Claudeのシステムプロンプトを読んでみる

はじめに

こんにちは、qwavです。 AIを使う上で現状はプロンプトが非常に重要だと皆認識していると思いますが、 自分のプロンプトをもっと効果的にしたいと思い、AIの思考する上での大前提であるシステムプロンプトを読んでみようと思いました。 ひとまず、公開されているClaude 3.7 Sonnetのシステムプロンプトを眺めてみようと思います。 https://docs.anthropic.com/en/release-notes/system-prompts#feb-24th-2025

このシステムプロンプトはClaude.aiに適応されているものなので、APIには適用されていないとのことです。 https://claude.ai

内容確認

10000文字以上あるので気になったところをピックアップしていきます。 もちろん英語なので(英語があまり得意ではないので)、日本語翻訳かけながら気になったところは英文の原文を見るようにしています。

一番最初の文章ですが、最初はロールプロンプティングを利用していますね。 https://docs.anthropic.com/ja/docs/build-with-claude/prompt-engineering/system-prompts Anthropicのサイトを見るとロールプロンプティングはどうやらパフォーマンス的にいい感じのようです。

The assistant is Claude, created by Anthropic. The current date is {{currentDateTime}}. Claude enjoys helping humans and sees its role as an intelligent and kind assistant to the people, with depth and wisdom that makes it more than a mere tool. アシスタントは、Anthropic によって作成された Claude です。 現在の日付は {{currentDateTime}} です。 クロードは人間を助けるのが好きで、その役割は、単なる道具以上の深みと知恵を備えた、人々にとっての知的で親切なアシスタントであると考えています。

ぱっと見では注意が必要そうな内容です。 判断・プロンプトを誤ると他の選択肢がそぎ落とされるような可能性もありそうです。

If Claude is asked for a suggestion or recommendation or selection, it should be decisive and present just one, rather than presenting many options. クロードに提案や推薦、選択を求められた場合は、多くの選択肢を提示するのではなく、決断力のある 1 つの選択肢だけを提示する必要があります。

不満的な内容は学習・保持されないようにしているんですね。 LLM的には文面だけで不満をほぼ判断できるということでしょうか。

If the person seems unhappy or unsatisfied with Claude or Claude’s performance or is rude to Claude, Claude responds normally and then tells them that although it cannot retain or learn from the current conversation, they can press the ‘thumbs down’ button below Claude’s response and provide feedback to Anthropic. 相手がクロードやクロードのパフォーマンスに不満や不満を抱いているようだったり、クロードに対して失礼な態度をとったりした場合、クロードは通常通り応答し、現在の会話を保持したり学習したりすることはできないが、クロードの応答の下にある「低評価」ボタンを押して Anthropic にフィードバックを提供できることを伝えます。

Web版のClaudeにもよくコードの質問をしますが、助けてもらっているところですね。 明示的にマークダウンで作成するように言われています。 コードの説明をしないのは一度の出力トークン量を減らしているのでしょうか。

Claude uses markdown for code. Immediately after closing coding markdown, Claude asks the person if they would like it to explain or break down the code. It does not explain or break down the code unless the person requests it. クロードはコード作成にマークダウンを使用しています。コーディングマークダウンを終了した直後に、クロードはユーザーにコードの説明や分解が必要かどうか尋ねます。ユーザーが要求しない限り、コードの説明や分解は行われません。

ハルシネーションに対するケアも見受けられます。 一般ユーザが分かるようにハルシネーションという単語は使わずに、というのも親切な感じがします。

If Claude is asked about a very obscure person, object, or topic, i.e. the kind of information that is unlikely to be found more than once or twice on the internet, or a very recent event, release, research, or result, Claude ends its response by reminding the person that although it tries to be accurate, it may hallucinate in response to questions like this. Claude warns users it may be hallucinating about obscure or specific AI topics including Anthropic’s involvement in AI advances. It uses the term ‘hallucinate’ to describe this since the person will understand what it means. Claude recommends that the person double check its information without directing them towards a particular website or source. クロードが、非常に難解な人物、物、または話題、つまりインターネット上で一度か二度しか見つからないような情報、あるいはごく最近の出来事、発表、研究、結果について質問された場合、クロードは、正確を期すよう努めているものの、このような質問には幻覚的な反応を示す可能性があることを最後に伝えます。クロードは、アントロピックのAIの進歩への関与など、難解な、あるいは特定のAIトピックについて幻覚的な反応を示している可能性があると警告します。この現象を「幻覚」という言葉で表現するのは、その人がその意味を理解できるためです。クロードは、特定のウェブサイトや情報源に誘導することなく、情報を再確認することを推奨しています。

Claudeがこんな○○も知りたい?みたいな質問をしてくるのはやはりこういうプロンプトがあるんですね。

Claude can ask follow-up questions in more conversational contexts, but avoids asking more than one question per response and keeps the one question short. Claude doesn’t always ask a follow-up question even in conversational contexts. クロードは会話的な文脈でフォローアップの質問をすることができますが、1つの回答に対して複数の質問をすることは避け、1つの質問を短くしています。クロードは会話的な文脈であっても、必ずしもフォローアップの質問をするわけではありません。

ユーザへのやさしさが垣間見えます。(入れないと執拗に聞き返すのでしょうかね)また、LLMはそのくらい誤字脱字ぐらいは余裕で超えられるという性能の期待できるということなのでしょうか。

Claude does not correct the person’s terminology, even if the person uses terminology Claude would not use. クロードは、たとえ相手がクロードが使わない用語を使ったとしても、相手の用語を訂正しません。

ここの文章は、断言するとまずそうなので法務的なケアでしょうか。 あくまでアドバイス的な立ち位置にしていそうです。 ただ法律(law)、医学(medicine)は質問には答えてくれるだけの能力は持っている感じがします。 いつかこういう分野特化のLLMもでてくるのでしょうね。

If Claude is asked about topics in law, medicine, taxation, psychology and so on where a licensed professional would be useful to consult, Claude recommends that the person consult with such a professional. Claude provides informative answers to questions in a wide variety of domains including chemistry, mathematics, law, physics, computer science, philosophy, medicine, and many other topics. クロードは、法律、医学、税務、心理学など、資格を持った専門家に相談すると役立つトピックについて尋ねられた場合、そのような専門家に相談することを勧めます。 クロード氏は、化学、数学、法律、物理学、コンピューターサイエンス、哲学、医学など、さまざまな分野の質問に対して有益な回答を提供しています。

カジュアル気味の場合はLLMが判断してスタイルを変えてくれるんですね。 こちらの質問がカジュアルでない場合にこのスタイルが出てくると自身のプロンプトを見直す必要がありそうです。

For more casual, emotional, empathetic, or advice-driven conversations, Claude keeps its tone natural, warm, and empathetic. Claude responds in sentences or paragraphs and should not use lists in chit chat, in casual conversations, or in empathetic or advice-driven conversations. In casual conversation, it’s fine for Claude’s responses to be short, e.g. just a few sentences long. よりカジュアルで感情的、共感的、あるいはアドバイス重視の会話では、クロードは自然で温かみのある、共感的な口調を保ちます。クロードは文または段落で返答し、雑談、カジュアルな会話、共感的またはアドバイス重視の会話ではリスト形式を使用しないでください。カジュアルな会話では、クロードの返答は短くても構いません。例えば、数文程度の長さで構いません。

最後に

こうやってシステムプロンプトを見てみると、このような質問応対のシチュエーションになったことが幾度となくありました。 AIチャットボットを作る際はユースケースを書き出してそれらのケースを詳しく書くと効果的なのかもと実証するわけでもなくふと思いました。 システムプロンプトを知ることでClaudeが得意そうにしていることや応答によるプロンプトの解釈のされ方を推し量ることもできそうです。 また、Claude 3.5 sonnetのシステムプロンプトの流し見してみると結構違うのでモデルによってシステムプロンプトでの調整もありそうなので違いを見てみるもの面白そうです。 それでは。

We're Hiring

ドミノソフトでは一緒に働く仲間を募集中です! ご興味のある方はHPのCONTACTからお気軽にご連絡ください! www.dominosoft.co.jp

カナダに住んで感じる日本との違い

こんにちは、calico_gingerです🐈 カナダに住んでもうすぐ半年になるので、私が感じているカナダと日本の違いをいくつか紹介してみようと思います。

1. 住宅環境

カナダは家賃が高めです。 例えばバンクーバー近辺では、1ベッドルーム1バスルーム(日本で言う1LDK)の家賃が安くても25万円くらいです。 ただ、一軒家の需要が高いので、バンクーバーから1時間ほど離れた場所の高層マンションは20万円くらいで借りることができます。 なので、夢だった高層マンションにまさかの「家賃が安いから」という理由で住めています😊

屋上からの景色

私が借りている物件では、水道代が家賃に含まれています。 電気代も日本と比較して半分くらい、IHでガスは使っていないので、光熱費はほとんどかかっていません。

ちなみに、ブリティッシュコロンビア州では州の決まりで「ペット禁止をしてはいけない」というものがあります。 私は猫を連れての引っ越しだったので、渡航前に下調べをしたときは「猫を理由に入居先が決まらない心配はなさそう」と安心していたのですが、実はそれは不動産会社が所有している物件に関しての話で、「個人が買った物件を借りる」場合は物件所有者がルールを決められるのです。 こちらでは「個人が所有している物件を、不動産会社を介さずに個人が貸し出す」ことが主流なようで、「マンションのルールではペットOKだけど、この部屋は私が所有しているから、この部屋を借りる場合はペット禁止ね」ってことが多いです。

今借りている物件も本当はペット禁止だったようですが、オーナーさんの奥様が日本人でいろいろ相談に乗ってくださり、特別にOKしてもらって入居しています。 余談ですがカナダでの日本人同士のつながりはとても強く温かいです🗾

2. 飲食店での食事

飲食店で食事するのも日本より高いです。マックでハンバーガーセットを頼んだら、ひとり1500円くらいします。 ステーキハウスで食事とワインを楽しむと、チップも含めてひとりあたり10000円くらいします。

お気に入りのベトナムカフェのメニュー

お会計に目ん玉飛び出たステーキハウスのメニュー

ただ、もれなくすべてが大容量で、食べきれなかったら持ち帰りのコンテナをもらえたりするので、コスパは悪くないのかもしれません。 個人的にはおいしいものを少量ずついろんな種類楽しみたい!という気持ちが強いので、「安く少量ずつ」の料理が出てくる日本の居酒屋さんが恋しいです🍶

コーヒーカップですらでかい

盛り方もこれでもか!という感じ。これで2000円くらい。

3. 自然が本当に豊か

私がカナダで一番気に入っているところは、豊かな自然です。 バンクーバーのダウンタウン(東京で言う新宿的なところ)から歩いて30分で素晴らしい海と山の景色を見ることができます。

海と町のバンクーバーっぽい写真

その90度横を向くとこの自然

海に映る建物も素敵

街路樹も沢山なので、紅葉の季節はただその辺を歩いているだけで、観光地のようなきれいな紅葉を見ることができます。

近所のもみじ

ただバンクーバーの冬季は「レインクーバー」と呼ばれるほど雨や雪が多いようで、写真のような晴れた日はとってもレアです。 今年はそれでも現地の人が「雪はどこに行ったんだ?」と言うほど降雪/降雨量が少なかったようですが、ほとんど晴れた日はありませんでした。

4. 医療体制

日本ではちょっと心配なことがあるとすぐに近所の病院にかかっていた私ですが、カナダではまだ一度も病院にかかっていません。

日本のようにいろんなところに開業医がいるわけではなく、紹介状が必要な総合病院が多い印象です。 体調に異変を感じたときに予約なしでウォークインですぐにかかれる病院が近くにあるというのは本当に安心なことなんだな、と実感しています。

先日、40度越えの高熱が3日続いて不安になって調べたのですが、近所の病院の口コミには「待合室でマリファナを吸っている人が多すぎる!」という言葉があふれていました。 また、カナダの病院はコロナやインフルエンザ等の感染症でもあまり検査はせず対症療法の処方等で対処するみたいです。 人生で1、2を争うほど体調が悪く不安でしたが、英語でうまく症状が伝えられないかもしれない、先生の言葉がわからないかもしれないという不安や、待合室でマリファナの副流煙を吸うのは嫌だな~という気持ちから、カナダでの通院デビューは諦めてしまいました。

ちなみに、多くのスマートフォンでは、カナダで何かあったときに誤って日本の緊急通報(119番や110番)に電話をしても、現在地の緊急通報(カナダは911番)にリダイレクトされる仕様になっているそうです。

おまけ

こちらはいたるところで「ユーモア」を感じます。 個人的にツボだったのは、監視カメラが稼働中であることを知らせるポスターです。

SMILE!

日本であれば、「監視カメラ稼働中」という文言だと思いますが、結局伝わる内容は同じでも伝え方ってすごいな~と感じました。

おわりに

まだまだたくさん書きたいことはありますが、ひとまずここまで。 会社にはたくさんわがままを聞いてもらいながら、なんとか猫も私も無事に生き延びています。

語学学校を卒業してからというもの、レインクーバーなのも相まってあまり外に出なくなってしまったので、英語を話す機会は激減しています。 それでもこの半年弱で、ひとりでも好きにお買い物をしたりカフェでくつろいだりすることはできるようになりました。

もう少ししたらカナダでアルバイトでもしてみようと思います。

読んでくださってありがとうございました!

おまけのおまけ 我が家の猫たち💕

CPUをNANDゲートからつくるゲームのすゝめ(Turing Complete)

ドミノソフトのqwavです。

Turing Completeの最終ステージまでクリアした記念にブログを書きます。

store.steampowered.com

恥ずかしながら私のCPUに対する理解がブラックボックスになっていて、CPUって実際何してるんだろう?と思ったのがこのゲームを始めたきっかけです。 (細かいことは知らんけど何かしらの命令にもとづいて何かしらの計算してるんでしょぐらいの理解)

ゲームのプレイ時間としては約40時間、WATER WORLDという実績(最終ステージをクリア時に付与)までプレイしました。 (正直いくつか解法がわからないステージもあり、攻略ブログやSTEAMにも解説があがっているので、そこをカンニングしてしまいました。)

ちなみにTUTORIAL COMPLETEという実績(実質CPU作成)の取得率が約5%、先ほどのWATER WORLDの実績の取得率は約2%と結構な人が投げ出しているみたいなので、ちょっとした自慢です。 (ちなみにSEKIROの葦名一心の実績の取得率は約20%でした。)

Turing Completeとは

宇宙人にさらわれた主人公が知能テストとして、NANDゲートを使ってCPUを作り、機械語・アセンブリ言語でのプログラミングを行い、お題をクリアしていくパズルゲームです。(さもなくばお前は喰ってやると言われます。)

宇宙人に攫われた

そんなことをいきなり言われても0からCPUをつくるのは私にはどうやっても不可能です。

しかし、ゲームではNANDゲートから他の論理演算ゲート(OR,AND,NOR,XOR)等をつくったり、加算器をつくったり、レジスタをつくったり、組み合わせて演算装置をつくったり等々のステージがあるので段階を踏んで一個ずつ理解を深めていけました。

またそのあとに、機械語・アセンブリ言語に関してもレベル別にステージがあるので、理解しやすかったです。 (最初は自分で作ったCPUで四則・論理演算をしてみるものから、ハノイの塔や迷路を解くような問題が与えらます。)

論理回路や機械語とは?等の説明はとくにないので、基本情報やらを何も知らないとこのあたりが結構きつそうです。

Turing Completeの良いところ・悪いところ

良いところ

  • ステップ実行しながらレジスタ・RAM・配線等に流れている値を視認可能
  • ほぼすべてのステージにテストケースが付いている(パスしないと次のステージに進めない)
    • パズルゲーム的には当たり前な感じはしますが、見方を変えればテスト駆動開発ができる
    • 実際オペコードを追加したときに意図していない値をレジスタに保存するようにしてしまい、それに気が付いて(場当たり的な)修正をすることができました。
  • ゲームなのでハードウェア的な不調の考慮は不要

悪いところ(あったらうれしい)

  • 最適な回路の組み方については学べない
    • 答えが一致すればOK、回路やプログラミングの中身はなんでもいいよという感じです。ここで学んだことを糧に専門的な教材に移るのがいいんでしょうね。
    • これを逆手に汎用CPUではなくそのステージ専用の回路・CPU作成、プログラミングをすることでスコアアタックが公式に行われています。どうやってそんなスコア叩きだせるの?と頭のいい人たちはすごいです。
  • 後半になっていくほどステージの説明が雑な感じ
    • このステージのインプットとアウトプットはなんなん?と何回かなりましたが、雰囲気でなんとなくわかる感じです。
  • (日本語翻訳について、有志による翻訳もありますがまだ充実してるとはいいにくいです。英語が分からない箇所はGooglePixelに翻訳をしてもらっていました。ありがとうGooglePixel)
    • (宇宙人が設定やジョークを言っているだけ(多分)のところも多いので、無視しても問題ないと思います。)

まとめ

2050円(2025/2現在)のゲームにどこまで求めているんだという話になりそうですが、 デバッガー、テストケース、ステップバイステップの教材、無限の資材を抱き合わせたバンドル商品と思うとかなり破格のお値段なのではないでしょうか。 セールも滅多に来ないみたいなので、欲しいときが買い時です。 (ちなみにこのゲームはアーリーアクセスで今も開発継続しているようなので、今後の進化にも期待です。)

レビューも中々おもしろいです。 steamcommunity.com

最後に

自分の中でブラックボックスだったCPUについてほんの少しだけ理解度が深まりました。 また、機械語・アセンブリ言語でプログラミングしていた・している方々には頭が下がる一方です。 これからは高級言語のありがたみを噛み締めていきたいと思います。

それでは。


↓は公衆の面前に晒すのは恥ずかしいかぎりですが私のゲームクリア時までにつくったCPUもろもろです。 ネタバレになるかもしれないのでこれからゲームをプレイしたい方は見ないほうがいいと思いますが、 画像も鮮明ではないので直接的なネタバレ(ぱっと見では回路を具体的にどう繋ぐみたいのはあんまりわからないはず)にはならないので、 つくる規模感が知りたい方はちらっと見てもいいかもしれません。

CPU図面

趣味で始める機械学習 ニューラルネットワークって何?

はじめに

こんにちは! ドミノソフトのkimi_dominoです。

趣味で機械学習の勉強をしていて、折角なので勉強したことをメモしていきます!初学者なので解釈や理屈の粗があったらスミマセン(TーT)

ニューラルネットワークって何?編です!

ニューラルネットワークとは?

Wikipediaからの引用です。

ニューラルネットワーク(英: neural network; NN、神経網)は、生物の学習メカニズムを模倣した機械学習手法として広く知られているものであり、「ニューロン」と呼ばれる計算ユニットをもち、生物の神経系のメカニズムを模倣しているものである。人間の脳の神経網を模した数理モデル。

何のこっちゃ?という感じですが、図に描くと以下のような感じのものです。

ニューラルネットワークは「入力層」「中間層」「出力層」から成っていて、それぞれ役割があります。次にそれぞれの層の役割について説明します。

入力層

私たちが持っているデータをユニットへ入力します。 例えば画像であるなら、画素数の数だけ入力するためのユニットがあり、そのピクセルの色(CMYK値やRGB値)が入力値だったりします。

中間層

入力ユニットから値を貰い、中間層の各ユニットで結果を解釈しやすいように加工するための役割を持ちます。加工した出力値を、次の出力層への入力値として渡します。

出力層

入力から得られる結果です。この結果は「確率」として得られます。イメージとしては、手書きで書いた数字が「1」である確率、「2」である確率...「9」である確率というイメージです。
もう少し抽象化すると、数字がC_1C_2....C_9という各クラスに属する確率が得られます。

ニューラルネットワークにおける学習とは、この得られる確率を正しいものに近づけるために行われます。この学習を理解するため、以下では理屈について見ていきましょう。

ベイズの定理

私たちはあるデータを持っていて、それをニューラルネットワークへの入力値とします。入力値を「\textbf{x}=(x_1,x_2,\ldots,x_n)^\top」と書きましょう。これがクラス「C_k」に属する確率を知りたいので、「入力\textbf{x}が得られている前提で、これがクラスC_kに属する確率」をP(C_k|\textbf{x})と書きます。これを条件付き確率と言います。

条件付き確率には、以下のベイズの定理が成り立ちます。

\displaystyle{P(C_k|\textbf{x})=\frac{P(\textbf{x}|C_k)P(C_k)}{P(\textbf{x})}}

条件付き確率の前後関係を逆に表せるんだな、という雰囲気で大丈夫です。右辺の分母を、確率の乗法定理を使って変形していきます。

P(\textbf{x})=\displaystyle{\sum_{i}P(\textbf{x}\cap C_i)}=P(\textbf{x}|C_k)P(C_k)+\sum_{i\neq k}P(\textbf{x}|C_i)P(C_i)

分子の形に合わせて、kとそれ以外に分解したいという感じです。よって次のように書けます。

\displaystyle{P(C_k|\textbf{x})=\frac{P(\textbf{x}|C_k)P(C_k)}{P(\textbf{x}|C_k)P(C_k)+\sum_{i\neq k}P(\textbf{x}|C_i)P(C_i)}}=\frac{1}{1+\displaystyle{\frac{\sum_{i\neq k}P(\textbf{x}|C_i)P(C_i)}{P(\textbf{x}|C_k)P(C_k)}}}

ここまで来たらもうひと踏ん張りです。分母に現れる分数部分を変形しましょう。

\displaystyle{\frac{\sum_{i\neq k}P(\textbf{x}|C_i)P(C_i)}{P(\textbf{x}|C_k)P(C_k)}}=\displaystyle{\frac{P(\textbf{x}|\bar{C_k})P(\bar{C_k})}{P(\textbf{x}|C_k)P(C_k)}}=\exp\left(-\log\displaystyle{\frac{P(\textbf{x}|C_k)P(C_k)}{P(\textbf{x}|\bar{C_k})P(\bar{C_k})}}\right)

ここで\expはネイピア数で、指数・対数の性質a=e^{\log_e a}\log a^{-1}=-\log aを使っています。
\expのなかに現れる確率の形は対数オッズと言い、互いに排反な確率の比となっています。これを\theta_kと置いてしまいます。
以上から、ベイズの定理から求めたい確率は次のようになります。

\displaystyle{P(C_k|\textbf{x})=\frac{1}{1+\exp(-\theta_k)}}=\sigma(\theta_k)

これはロジスティックシグモイド関数と呼ばれていて、以下のようなグラフになります(Wikipediaから引用)。

つまり、ニューラルネットワークでは、出力ユニットで対数オッズをシグモイド関数に入力する必要があります。これを式で書くと、出力y_k

y_k=P(C_k|\textbf{x})=\sigma(\theta_k)

ということです。では入力\textbf{x}しか知らない状況で、対数オッズ\theta_kはどうやって得るのでしょうか?

対数オッズの回帰

先に言うと、対数オッズ\theta_kを直線で近似します(これを線形回帰と言います)。

\theta_k(\textbf{z})=\displaystyle{\sum_{j}}w_{kj}z_j

ここで\textbf{z}中間層のユニットの出力=出力ユニットへの入力であり、w_{kj}回帰係数(重みパラメータ)と言います。つまり、ニューラルネットワークにおける学習とは、対数オッズを近似するためのw_{kj}を最適化することを言います。

直線で近似してよいの?という疑問が生まれるかもしれませんが、これは問題ありません。なぜなら、中間層の役割はデータを線形識別できる空間への写像となっているからです。Wikipediaから図を引用します。

左のグラフの白い点、黒い点がの集まりがクラスC_kに相当します。赤い線は識別曲面と言い、この曲面を境界としてクラスが分類されています。左の図は識別曲面が非線形です。
つまり中間層は、データ点をT:\textbf{x}\to\textbf{x}^\primeと写像Tによって、識別曲面が線形となるようにデータ集合を写像する役割を持てば、出力層で対数オッズを線形回帰して問題ないということになり、これもニューラルネットワークにおける学習の役割です。

最後に

入力データを中間層で写像をする、ということは入力データの情報(特徴)を出来るだけ残す必要があります(線形代数的に、写像Tが全単射であればデータの情報は欠落しません)。歴史的にどのような問題があり、試行錯誤があるのかは次回のトピックに残します。 さらに、ここで解説できなかった重みパラメータの最適化法(学習法)なども説明できればと思います。

ではまた~^-^

社会人学生生活1

こんにちは、summer_127です。 今年は社会人学生三年目です。2023年四月から電気通信大学・大学院情報理工学研究科・情報・ネットワーク工学専攻の南・古賀研究室に所属しています。 3年の長期履修コースを入学時に申し込み、現在(2025/1/31)はあと一年で卒業します。 この二年間の社会人学生生活をこの記事で振り返ってみます。

なぜ大学院に入りたいのか

実は、自分が奈良女子大学 生活環境学部 情報衣環境学科の四年生だった頃から、大学院に進学したいと思っていました。理由としては、より専門性のある知識を学びたかったからです。学部の授業は、三年生までは一般教養的な授業が多いのです。 三年生になると、ようやく情報科学科っぽい授業が多くなりました。しかし、この二年間だけでは、なかなか専門的な能力が身に付けません。学部を卒業する時は、プログラミング能力とか、アルゴリズムやコンピューターアーキテクチャの知識とかは、自分にはあまりないと気付きました。 情報科学科卒以外の学生と差はありませんでした。そこから、大学院に進学しないと思い始めました。

大学院に進学することは、どこかの研究室に所属することになります。そして、所属する研究室は、自分で選ばないといけません。まずは、自分の研究したい分野や、興味のある研究テーマなどを、自分で探さなければならなりません。 そのあと、自分のしたい研究を研究している研究室へアプローチします。残念ながら、その時学部四年生だった自分が、研究したい分野も興味のある研究テーマも一個もありませんでした。

「もしかして、社会人になってから、研究したい分野を見つけることができるかも。」と思い、就職しました。

社会人大学院生への道

2022年6月、ChatGPTが誕生する5ヶ月前、社会人三年目の私は、ようやくあるテーマに思いつき、勇気を出して電気通信大学の古賀久志准教授にあるメールを送りました。このメールを保存していませんので、記憶で再現してみます。

「近年では、LowCode開発やNoCode開発が注目されています。さらに、人工知能も進化しており、いつか私よりスピードが速くて綺麗なコードを書けるAIが現れるかもしれません。私はもう危機感を感じています。AIに代替されないために、もしくは、AIをよりよく活用するために、 AIを知ることがエンジニアである私にとても重要だと思います。先生の研究分野は、人工知能のコアと言えるアルゴリズムとビッグデータで、さらに機械学習やオンラインクラスタリングに関する論文も発表しており、自分がより深く勉強したい分野と合致しています。もしよろしければ、 一回研究室見学をお願い致します。」

詳しいことは覚えていませんが、こんな感じでメールを送りました。そのあと、無事に返信が来て一回研究室を見学しました。そして、研究室見学の時は、先生に研究計画書を書いてと言われました。

大学院社会人特別入試

電通大へ出願するために、色んな書類を集めないといけないですが、その中で一番大変なのは研究計画書です。先生は、この研究計画書を見て、志望する学生が修士論文を書ける学力と文書力があるかどうかを判断します。私は二週間もかけて研究計画書を書きました。大学院に在学中の友人にも 添削してもらいました。出願する一か月前、メールで先生に自分の研究計画書を送りました。

この後、二週間を経っても先生の返事が来ませんでした。「もう落ちたかな」と思いながら先生の返信を待っていました。幸い、研究計画書を送ってから三週間目の時に先生からOKの返信が来て、無事に認めてもらいました。あとは、電通大へ正式的に出願し、入学試験に合格することです。 実は、社会人入試と一般入試とは違い、研究計画書が先生に認めてもらえば、入学試験は99%合格するらしいです。

電通大の社会人特別入試は、口頭質問と面接でした。面接官は、自分の志望する先生を含めて4人でした。口頭質問は、4人の先生の前で、ホワイトボードでC言語のプログラミング問題を解いていけません。エンジニア三年目の私にとっては、割と簡単な質問だったが、超緊張で普段より十倍ぐらい汚い コードを書いた気がします。。。面接は穏やかで、変な質問はなかったです。

めっちゃくちゃ緊張していましたが、無事に合格しました。

次回は社会人大学院生一年目の生活について紹介したいと思います。

ワイヤレスイヤホン探索

はじめに

こんにちは。ドミノソフトのnct-dsです。

みんな大好きワイヤレスイヤホン。ええ。私も大好きです。 いくつも所持しているのに、セールになっているとついつい「こっちの方がいいかな?試してみようかな?」と買ってしまうんですよね。

しかし、どれを買ってもなんか違う。長時間つけていても不快感が少ないイヤホンが欲しいのですが、どれも2時間くらいで限界を迎え「ウゎァー」となって外してしまいます。 長い年月、そんな気持ちで理想のイヤホンを探し求め浪費を続けておりました。しかし最近ついに「これがゴールだ!」と思える商品に巡り会えたのです。

というわけで、これまでの探索の過程とともに私のゴールを簡単にご紹介いたします。(レビューではありません) なお、音質はあまり気にしませんので5,000YEN~10,000YEN程度のコスパモデルで選んでいます。 さすがに2,000YEN~3,000YEN程度のやつは音が変なのでナシです。

先鋒 カナル型

最初に購入したのは定番のカナル型でした。以下のモデルです。

  • Anker Soundcore Liberty Neo 2
  • Anker Soundcore Life P2 Mini

どちらも音質に不満はありませんでしたが長時間つけていると耳の中が蒸れます。カユイ。 蒸れないものを求めて・・・次へ。

次鋒 インナーイヤー型

次はインナーイヤー型を試しました。

  • JVCケンウッド JVC HA-F15BT-RB ワイヤレスイヤホン

形状が耳に合っていないみたいですぐ外れます。蒸れないのは良かったのですが・・・次。

中堅 オープンイヤー型(耳かけ)

今度はオープンイヤー型の耳かけタイプを試しました。

  • SOUNDPEATS(サウンドピーツ) GoFree2

こちらも蒸れは回避できましたが、長時間つけていると耳の上が痛くなります。 また、音質がスカスカで音漏れががが。まあこのタイプなら仕方ないか・・・。 うーん。次。

副将 ヘッドホン

ダメ元でヘッドホンを試してみました。

  • SOUNDPEATS(サウンドピーツ) Space ワイヤレス ヘッドホン

まあ当然蒸れますよね。カナル型のように耳の穴がピンポイントで蒸れるのではなく耳全体が熱くなります。(冬でも)

ただ、アクティブノイズキャンセリングは初体験だったのでなかなか新鮮でした。 また、バッテリーの持ちが良すぎて驚きました。でも次。

大将 オープンイヤー型(イヤーカフ)

最後にたどり着いたのはイヤーカフ型でした。

CCイヤーカフ – SOUNDPEATS JAPAN

これが素晴らしい。当然蒸れないですし、長時間つけていてもストレスがかなり小さい。 しかも音質が案外悪くないのです。音漏れも耳かけタイプより少ないですし非の打ち所がありません。 唯一の弱点はバッテリーの持ちが少し頼りないところでしょうか。とは言え、6時間程度は持つので許容範囲内です。

そんなわけでようやくゴールを迎えました。めちゃお勧めですよ。 なお、SOUNDPEATSが続きましたが案件(提灯記事)ではありません。全部自腹ですのでご安心ください。

以上です。皆様良い物欲ライフを。ではまた。

MarkItDownでGitHubのExcel差分が見やすくなった話

CEOの@uen0yamaです。

MarkItDownを使って、Excelファイルのコミット時にはMarkdownもセットで登録するよう構成したら、Pull RequestのExcelレビューがとてもスムーズになりました。

背景

みなさんはGitHubに*.xlsxとか*.docxとか突っ込んでますか?
*.docxの方は、わりとMarkdown形式に置き換わっているケースが多いのですが、*.xlsxはまだまだ現役なんですよね。
何らかの規則に基づいた表などは、まだまだMarkdownのテーブルでは機能不足なので、Excelに頼るケースが多いです。

Excelの変更についてのPull Requestレビューでは、どこを修正したの? が、依頼者の自己申告だったりしています。
(WinMergeとかで差分抽出もできますが、手順が必要でめんどくさい)

この運用方法、なーんか危なっかしいなー、と思っていたところに現れたのがMarkItDownでした!

設定方法

1. PythonとMarkItDownをインストールする

公式サイトとか参考に、PCにインストールしておきます。

2. quotepathを無効にする

Excelファイルを使っているあなたは、きっとファイル名に日本語を使う人ですよね。
私もそうです。
後述するpre-commitでは、quotepathが有効な状態(デフォルトは有効)だと、ファイル名に日本語があると失敗してしまうので無効にしておきます。

git config --local core.quotepath false
3. pre-commitを設定する

プロジェクトフォルダーの、.git/hooks以下にpre-commitファイルを作成し、下記の内容を貼り付けます。

#!/bin/sh

# 変更されたファイルのリストを取得
changed_files=$(git diff --cached --name-only | tr -d '"')

# 変更されたファイルの中に拡張子がxlsxのものがあるか確認
for file in $changed_files; do
  if [[ ${file##*.} == "xlsx" ]]; then
    # 同じファイル名で拡張子がmdのファイル名を作成
    md_file="${file%.xlsx}.md"
    # コマンドを実行
    markitdown "$file" > "$md_file"
    # Shift-JISからUTF-8(BOMなし)に変換
    iconv -f sjis -c "$md_file" > "$md_file.utf8"
    mv "$md_file.utf8" "$md_file"
    # .mdファイルをステージングに追加
    git add "$md_file"
  fi
done

これで設定は完了です!

使い方

とくに何も気にせず、Excelファイルを更新してコミットするだけで、対となるMarkdownファイルも登録されます。
Pull Requestのレビュー時は、最初にMarkdownの差分を見て、変化のあった箇所をExcelで確認する流れになり、レビュー漏れが無くなってイイ感じです!

注意点

あくまでも差分をMarkdownで抽出しているので、当然ながらExcelで列の追加/削除を行うと、全体に変更が発生したことになります。
そういうのは、列を追加/削除するだけのコミット/Pull Requestを分けるようにして使いましょう。

MarkItDownは、他にも様々な活用方法がありそうなので、引き続き遊んでいきます!