投稿記事

2023年 07月の記事 (5)

いらにか 2023/07/22 18:04

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/07/19 22:49

【Mes】チャット風テキスト生成について【書き忘れ小話】

まえおき

Mesにはチャットスタイル形式のHTMLを出力する機能があります。
これは現在のシンプルエディタ(SMWE)でもお試し感覚で使えます。

https://smwe.iranika.info/

ボタンを押すと下記のようなテキストがクリップボードにコピーされます。

<span style="color: #8D9147">いら:</span>どうも、いらにかの半身の"いら"です。
<span style="color: #9E09CA">にか:</span>どうも、もう半分の"にか"です。ってこれは一体なんですか?
<span style="color: #8D9147">いら:</span>今回は対談風テキストをブログに書き起こすときに便利なツールを作ってみたので、それの話をしようかなと。
<span style="color: #9E09CA">にか:</span>なるほど。それで実際にこんなテキストを書いてるのですね。
<span style="color: #8D9147">いら:</span>対談風テキストを書くときって大抵"〈名前〉:〈セリフ〉だよね。
<span style="color: #9E09CA">にか:</span>コロン《:》の代わりに余白とかのケースもありますね。
<span style="color: #8D9147">いら:</span>で、大抵のブログってHTML直書き or WYSIWYGって呼ばれる仕組みを採用してるんだけど、
名前のところを色つけたりとかボールド表示したりとか、いちいちブログのエディタで操作するの面倒くさいんだよね。
<span style="color: #9E09CA">にか:</span>あー、以前”よくわかる道草屋”を作ったときにも苦しめられてましたね
※”よくわかる道草屋”は某サービスの評価試験目的で作られたサイト。スマホじゃないとレイアウトが崩れるのであまり紹介したくない黒歴史。
<span style="color: #8D9147">いら:</span>無駄に思える繰り返し作業が本当にストレスなんだよね。
パソコンに出来ることならパソコンにやらせるべきだし。
あと、シエル学園シリーズは対談系テキストも書く予定だから、いっそのことツール作っちゃおうってことで作りました。

これをCi-enにそのまま貼り付けるとこんな感じ。


いら:どうも、いらにかの半身の"いら"です。
にか:どうも、もう半分の"にか"です。ってこれは一体なんですか?
いら:今回は対談風テキストをブログに書き起こすときに便利なツールを作ってみたので、それの話をしようかなと。
にか:なるほど。それで実際にこんなテキストを書いてるのですね。
いら:対談風テキストを書くときって大抵"〈名前〉:〈セリフ〉だよね。
にか:コロン《:》の代わりに余白とかのケースもありますね。
いら:で、大抵のブログってHTML直書き or WYSIWYGって呼ばれる仕組みを採用してるんだけど、
名前のところを色つけたりとかボールド表示したりとか、いちいちブログのエディタで操作するの面倒くさいんだよね。
にか:あー、以前”よくわかる道草屋”を作ったときにも苦しめられてましたね
※”よくわかる道草屋”は某サービスの評価試験目的で作られたサイト。スマホじゃないとレイアウトが崩れるのであまり紹介したくない黒歴史。
いら:無駄に思える繰り返し作業が本当にストレスなんだよね。
パソコンに出来ることならパソコンにやらせるべきだし。
あと、シエル学園シリーズは対談系テキストも書く予定だから、いっそのことツール作っちゃおうってことで作りました。



この機能は「Mesが脚本特化なら、ブログ向けの対談風テキストとか生成できたら便利なのでは?」 という思いつきで作りました。

地味にキャラごとの色分けが自動化されてたり、個人的に頑張った機能なんですが、シンプルエディタだとサンプルがショボいテキスト生成なので、いまいち便利さが伝わらない感もあったりします。

本題

最近、Ci-enにやってきた川上稔氏がキャラアイコン付きの対談形式っぽい感じで記事を投稿していて、「やっぱり対談形式ならではの面白さってあるなぁ」 と改めて思いました。
※カクヨムで無料公開されている境界線上のホライゾン NEXT BOXもアイコン付きだったのを思い出しました
※参考記事 https://ci-en.dlsite.com/creator/17061/article/914079
※注釈:川上稔氏はR18で活動してるので他記事はえっちなやつが多いです。
 我は大人だぞ?という人はフォローしてヨシ!
 未成年は境界線上のホライゾンを今すぐ買えば、読み終わる頃には大人だと思います(ここ笑うとこ)



さてさて。
シンプルエディタのチャットスタイル形式ではアイコンではなく、色付きテキストの生成になっているので何が関係あるんだという感じですが、実はMesライブラリでチャットスタイル生成を担当しているToChatStyleHTMLメソッドは引数でテンプレート関数を渡せば、好きなテンプレートでテキスト生成ができる仕様になっています。


つまり、ライブラリの利用側が独自のテンプレート関数を作ってメソッドに渡せば自由に変更ができます。



「おい待て、C#で作られたライブラリのメソッド使うにはC#で書かなきゃいけないのでは?サクッと使いたい時に不便じゃねぇか!」

というツッコミをした人に朗報なんですが、11月以降の.NET8対応に向けてリファクタリング中のMesでは強化されたPowerShell用のモジュールも公開される予定です。前の記事でそのことに触れるのを忘れていました。
※ちなみにクラスライブラリは.NET言語ならC#以外でも使えます。あなたもPowerShellに目覚めるのです…(パワーシェル イズ パワー)


まぁ難しいことを多少抜いて話すと、↓こんな感じでPowerShellで独自に作ったテンプレート関数を渡して画像付きチャットスタイルが生成できるようになります。

コンパイラ要らずの動的言語(というかシェル言語)でも拡張しやすくてやったね!

ちなみに、上記は整理前の安定バージョンのライブラリを使っているので、少し冗長なメソッド呼び出しになっています。これはいずれ$mes.ToChatStyleHTML($fn)みたいな感じで簡単に呼び出せるようになります。
MesではC#とPowerShellでの利用を前提に開発を進めているので、ガッツリプログラミングにもサクッとスクリプティングにも耐えられるような設計で進めています。
(まぁ僕が便利なように作ってるだけなのですが)


ただ、この機能をWebエディタに組み込むとなると少し話が変わってきて、色々と難しい感じになるのでそこは今後の課題になっています。
(関数ではなくテンプレートテキストで渡すような仕組みになるので、テンプレートエンジンを組み込んだりetc...な感じで少し厄介なのです)


とまぁ、これを書き忘れていたので今回記事にしました。
まだみなさんが上記の機能を簡単に使える状況にはないですが、使えるようにする予定があるよというご報告でした。


前の記事にも書きましたが、Mesは11月まで開発を凍結してリファクタリングに集中しています。そこから.NET8への移植があるので、年内と年始くらいまではほぼ新たな動きは無いと思ってください。

ぶっちゃけ、ユーザーファーストに開発を考えるならWebエディタの機能拡張に注力して「リファクタしてる暇があったら機能拡張しつづけろ」というのがビジネス的には正解で最適解です。これが仕事ならエディタ開発に注力してる。
ただ、Mesは僕にとって砂場なので、現状はユーザーファーストで動いていません。
Mesは記述言語としてもまだまだ未熟なので、時間をかけて熟成させる必要があると思っています。
エディタに利用しているMAUIも発展途上中ですし、エディタの開発はいま急いでも良くない気がしています。覚えたことが無価値になったり、負の遺産になったりするのが継続的にGUIアプリ開発するときの怖いところです。MAUIの噂を聞いたとき、Xamarinで作り始めなくてほんと良かった……
(Xamarinは.NETに多大な貢献をした素晴らしい技術です)


では、また。


余談 : チャットスタイル形式のテキスト生成のコードの抜粋

ここからは少し高度(?)なプログラミングの話です。
わかる人向けに書くので日本語少なめ。

リファクタリング中のチャットスタイルテキスト生成のコードはインターフェースのデフォルト実装で拡張メソッドが参照されるようになっています。
要はミックスインみたいな感じで、インターフェースを継承するだけでデフォルト実装がクラスに実装される仕組みです。
開発中のMesでは、データ加工処理をクラスの外(外部ファイル)に切り出して、Mesクラスではインターフェースを継承するだけのミックスイン実装を採用しています。
拡張メソッドと違ってMesクラスに実装されるので、PowerShellや他言語からも呼び出しができるのがポイントです。
モックのテストをパスしたミックスイン(インターフェース)だけをMesクラスに継承させていくことで、機能追加が安全かつ安定してできるようになります。
データ加工処理を追加したい外部の開発者は、新しいファイルにミックスインを実装→プルリク送る→OKなら僕がMesクラスに継承させて機能追加→リリースみたいな流れになると思います。
編集するファイルが分離されているので不用意な変更が起こりにくくなり、安全性も高くなるのが個人的に嬉しいです。


下記は開発途中のコードですが参考にどうぞ(参考になるか分かりませんが)

//ChatStyleExtension.cs
using Mes.Core;
using System.Drawing;
using System.Text;
using System.Security.Cryptography;


namespace Mes.Core.Extension;

public interface IChatStyleExtention
{
    public IEnumerable<MesPiece> GetMesPieces();
    public IEnumerable<string> ToChatStyleHTML() => ChatStyleExtension.ToChatStyleHTML(this, ChatStyleExtension.DefaultTemplate);

    public IEnumerable<string> ToChatStyleHTML(Func<MesPiece, string> TextTemplate) => ChatStyleExtension.ToChatStyleHTML(this, TextTemplate);
}

internal static class ChatStyleExtension
{
    internal static IEnumerable<string> ToChatStyleHTML(this IChatStyleExtention mes)
    {
        return mes.ToChatStyleHTML(DefaultTemplate);
    }

    internal static IEnumerable<string> ToChatStyleHTML(this IChatStyleExtention mes, Func<MesPiece, string> TextTemplate)
    {
        foreach (var piece in mes.GetMesPieces())
        {
            yield return TextTemplate(piece);
        }
    }

    internal static string DefaultTemplate(MesPiece piece)
    {
        return $"<span style=\"color: #{CharactorNameToColorCode(piece.charactor)}\">{piece.charactor}:</span>{piece.dialogue}";
    }
    private static string CharactorNameToColorCode(string charactorName)
    {
        using (var sha1 = new SHA1Managed())
        {
            byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(charactorName));
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 3; i++) // 3バイト分のハッシュ値を使用して6桁の16進数表記に変換する
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }
}

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/07/18 00:03

【雑記】欲しかったライブラリ設計の教典を買った、ライフハック小噺

欲しかったライブラリ設計の教典を買った


.NETのクラスライブラリ設計 改訂新版


C#界隈では有名なライブラリ設計の教典。
すごく抽象度が高い設計上のノウハウが詰め込まれていて、UNIXという考え方と並ぶ哲学書だと個人的には思っている。

専門書界隈における名著なバイブルは、手引き的な意味でのバイブルではなく、聖書に近い意味でバイブルと呼ばれたりする。読んで学んだら終わりみたいな本ではないのだ。
※過去に改定前の内容を途中まで読んだことがある


6年前からずっと欲しかった本ではあるが、正直なところ超絶ボリューミーな内容なので読み終えられる自信が無かったことや、6,000円超えのお値段に気が引けてなかなか手が出せなかった。
そうこうしている間に、.Netを取り巻く環境も変わり、2021年に改訂版が出て.Net Coreも範囲に含んだ良書に進化した。
そして、Kindleで半額キャンペーンの対象になっていたことがダメ押しになり、ついに買ってしまった。
(ちなみに本書は中古価格が値崩れしない良書なのである)


空いた時間で少しずつ読み進めているが、難解ではなくシンプルに書かれているのに咀嚼しようとすると考えることがいっぱいで脳が疲れる。
すべての宗教の教典に言えるだろうが、簡単な教えであっても咀嚼して守破離の精神で向き合うのは難しい。だからこそ修行になる。


読書でこんなに脳が疲労する感覚は、スワロウテイルシリーズ以来かもしれない。
哲学書を読むとミームの防御系免疫が抗体反応を引き起こして、結果として体力をすごくもっていかれるのを久しぶりに痛感した。


ともあれ、欲しかった本を手に入れたのでゆっくりと読書を楽しもうと思う。

フォロワー以上限定無料

無料プランに入るとモチベーションを支援できます

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/07/09 22:50

キーボードの買い替えを考えている話

現状

メインのキーボードは長らくREALFORCE 91UBK(静音じゃないやつ)とNiz 82EC(Bluetoothと有線両用)を使ってきた。
その他サブとして、エレコムのトラックボール付きのタブレット向けキーボードなどを使ったり。


■REALFORCE


https://www.realforce.co.jp/products/discontinued/91UBK-S_NG01B0/

■Niz


https://www.akeeyo.co.jp/collections/keyboard/products/aky-niz-keyboard?variant=40998140674207

■エレコム TK-DCP03BK


https://www.elecom.co.jp/products/TK-DCP03BK.html


これまでに、Think padのキーボードなども使ってきたが結局のところ上記のREALFORCEとNizに落ち着いている。
静電容量無接点方式の信者とまでは行かないが、やはりあの打鍵感がすごく好きなのである。
メカニカルキーボード(静音のピンク軸を除く)も触ってきたが、メーカーによりピンキリなのもあって、借りて使ったことはあっても買うまでには至っていない。


で、長らく使ってきたのでREALFORCEのほうは爪が割れたり、Sキーの表面が摩耗していたり、致命的ではないがそろそろ買い替えたい欲が出始めてきた。



Nizの方はまだまだ現役だが、USキーボードなせいで稀にマシンのキッティングなどで使おうとすると日本語入力で大変なことになるケースに遭遇する。なので、Nizの代わりに持ち運びできるやつが欲しかったり。
※僕のPC自体はUS配列でも日本語配列のどちらでもいけるような設定になってるし、僕の体もどっちでもタイプできるように適応してしまったので普段遣いでは困らない。
※余談だがNizを職場で他人に貸したとき、記号の配列の違いに気づかずに鯖のパスワードを間違って設定して、別環境からSSHでログインしようとしてもできないというアホみたいな事件にも遭遇したことがある。


というわけで、メインの3台目としてのキーボードを探し始めた。


FILCO Majestouch MINILA-R Convertible

まず、候補に上がったのはFILCO Majestouch MINILA-R Convertibleの静音赤軸(ピンク軸)。




https://www.diatec.co.jp/shop/MINILA-R/

60%キーボードなので、持ち運びしやすいし、日本語配列なら他人にも貸しやすい。
Youtubeで打鍵音も聞いてみたが、結構静かだし、悪くない。
有線と無線の両対応なのも助かる(この点はNizですごく利便性を実感した)



値段も1万円弱と(REALFORCEやNizに比べれば)お手頃なのも良い。



何より、メカニカルキーボードをひとつくらい持ってても良いのではないかと思っている。


REALFORCE R3HC12


https://www.realforce.co.jp/products/R3HC12/

有線と無線の両対応で、なによりも静音REALFORCEなのがポイント。
このモデルではないが、友人の静音REALFORCEを触らせてもらったことがあり、とても静かでポスポスという打鍵感が心地よかった。


Nizも一応静音だが、Nizは独特の僅かなカチャカチャ感がある。
静音REALFORCEにはそれがない。


REALFORCEでも標準キーと静音キーで音と打鍵感が意外と変わる。

https://youtu.be/q_C2rxFRmW4

https://youtu.be/gOvpoeplqwI


ただ、お値段が3万円超えるし、テンキーレスの80%サイズなので持ち運ぶには少し大きい。まぁカバンには入るので、持ち運べないわけではないが。
REALFORCEは65%作ってくれたら嬉しいんだけど、HHKBとの棲み分けで多分作らないと思う。ちなみにHHKBは配列が苦手なので候補にはない。


あと、地味にAPC対応してたり、昔と比べてソフトウェアのユーティリティが便利になってたり、魅力がいっぱいある。
ぶっちゃけ、これ買えば間違はない。



ただ、FILCOのMINILA-Rが2つ買える値段に尻込みしてしまう自分がいる。


REALFORCE GX1


https://www.realforce.co.jp/products/series_gaming_gx1.html

完全に今回のダークフォース。
つい先日、Dynamic modeとかいう変態な機能を載せてきやがった。


https://twitter.com/TOPRE_REALFORCE/status/1677238523643203584?s=20


ゲーム用途なら、すごく興味を惹かれるし、静電容量スイッチの構造的にもこれからファームウェアアップデートで少しずつ機能が拡張されそうな予感がしている。


ただ、買うなら今じゃないかな感。
もう少し様子見してからで良さそう。



まとめ

今のところ、FILCOのMINILA-Rがコスト的に手が出しやすいので第一候補になっている。
ただ、今持っているREALFORCEを誰かに押し付ければ、REALFORCE枠が空くのでREALFORCEのR3HC12を買う必然性が出てくるなぁとか思ったり思わなかったり。


Nizで有線無線に両対応しているモデルの便利さを体感してしまったので、ゲーミングキーボードは憧れるけれども、無線対応してない不便さをずっと引きずりそう。


こんな感じでキーボードの好き嫌いがあるけれど、僕の好みに当てはまらないやつでもいいので、もしオススメのキーボードとかあったらコメントで教えてください。


余談

静電容量無接点方式ばかり推してる感じになったが、実はパンタグラフやメンブレンも結構好き。


で、この前家電量販店でエレコムの洗える 抗菌 Bluetoothキーボードを触った感じが意外と良かった。



https://www.elecom.co.jp/products/TK-WS03BMKBK.html

テンキーモデル(フルサイズ)は大きすぎてマウスの定位置と干渉するし、ぶっちゃけ邪魔なので絶対に購入候補にならないが、これのテンキーレスモデルがあったら割りと本気で購入を考えていたかもしれない。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

いらにか 2023/07/08 12:12

Mes開発経過の話@現状報告

Mesは現在、2023年11月頃の.NET8のLTSリリースを待つために機能拡張などの開発を一時ストップしています。
引き続き各種ツールは使えます。


元々、Mesコアライブラリ、SMWE(ウェブエディタ)、MesWordAddin等のツールはC#の勉強を兼ねつつ試作目的で作り始めたというのもあり、当時新しかった.NET7で作り始めた経緯があります。
それらのツールも核となる機能は実装できていて、これからの作業は機能拡張とUX向上がメインになってくるので、このあたりで一度ペースを落としてLTSへ移行しようと思いました。

.NET8がリリースされるまでの間は、主に既存のライブラリの改修をやっています。

例えばこれ。

上記のコードでは、クラスにデフォルト実装をもたせたインタフェースを継承させることで、様々な実装をアダプティブに追加できるようにしています。いわゆるミックスインみたいなものです。
Mesのデータに対して何かしらの加工処理(例えばHTMLで出力する等)を追加したい時は、その加工処理用のインタフェースとデフォルト実装を作って継承させるだけでMesに組み込むことができます。機能の着け外しが楽なのです。
ゆくゆくは依存性注入などで、外部からプラグインなどを簡単に組み込めるようにする計画とかもあったりします。

こんな感じで、ブクブク太ったコードをスッキリさせて綺麗な状態にすることで、本格的な機能拡張をストレスフリーに行えるよう、身動きの取りやすいデザインに修正しています。


またSMWEでは、テキストデータを保管しておけるようなセーブストレージの実装も計画しています。ただ、.NET8に移行する際にMAUIのリサーチをしないといけないかもしれないので、コストが不透明なのが恐怖です。場合によってはクラウドストレージの検討をしないといけないのかも。



というわけで、ダイエット期間なのでお知らせするような進捗はありませんが、Mesではいつでもご意見をお待ちしているので、僕にDMを送るかNotionからissue上げてください。
MesのissueはNotionでまとめていますので、進捗などが気になる人もここを見てください。

https://www.notion.so/tokakuya/fc3a9620c16c447fb2a0f8e57cd997ae?v=ea406da72c704996ae56ce10cb30ea38&pvs=4


では、また。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索