<![CDATA[おわらない | ブログ記事]]> https://apxxxxxxe.dev/ RSS for Node Mon, 19 May 2025 16:03:14 GMT <![CDATA[無題20250519]]> https://apxxxxxxe.dev/entries/zakki202505191557 https://apxxxxxxe.dev/entries/zakki202505191557 Mon, 19 May 2025 00:00:00 GMT <p>2025/5/18の伺アニお疲れ様でした!<br> 日野は\45 FoxyLabでNaoさんと一緒に参加させていただいていました<br> おかげさまで用意したグッズも完売し、たくさんのデベロッパーさん、ユーザさんとお話することができました<br> イベント初参加でしたが1日通してとても楽しかったです<br> お声掛けいただいた方々、またイベント関係者の皆様ありがとうございました!</p> <![CDATA[無題20250513]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki202505131317 Tue, 13 May 2025 00:00:00 GMT <p>子供の頃に特定ベクトルの作品を浴びて性癖が曲がる経験は誰しもあるかと思いますが、<br> わたしにとってのそれが<a href="https://x.com/garvvjunyaSKB/status/1429284487947378691">以前流れてきたツイート</a>で紹介されていました</p> <p>「ぞくぞく村のゾンビのビショビショ」<br> まさにこの本が当時の学級文庫にあって、頻繁に読んでいたのを思い出しました<br> このシリーズはこのキャラクターの造形が妙にフェティッシュで、他にも雪女や人魚などが印象に残っています<br> 自分は肩にかかる癖のあるロングヘアが性癖なのですが、その原体験の一つに本書があるような気がしています</p> <p>昨今はコロコロなどの少年誌でこんなんええんか?というデザインや描写がしばしば話題になったりしていて、<br> ネットの普及などもあり現代の子供は手の届く範囲に刺激が多いななどと考えていたのですが文化とはそういうものなのかもしれません 性癖は曲がるもの</p> <![CDATA[無題20250511]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki202505110556 Sun, 11 May 2025 00:00:00 GMT <p>web拍手の返信をブログのみで行うように方針を変更します<br> Mastodonでも行っていたのですが窓口は一本化したほうが双方おそらくうれしいため…</p> <p>なので今後拍手返信を待ち受ける必要がある場合はブログのRSS購読でご確認いただければ幸いです</p> <![CDATA[無題20250508]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki20250508133330 Fri, 09 May 2025 06:00:00 GMT <p>他の方に描いていただいた作品を紹介するコーナーを<a href="https://apxxxxxxe.dev/gallery/">ギャラリー</a>に追加しました<br> アカウント無しでアクセスできるページであるかどうかを紹介の基準としています</p> <![CDATA[2025/5/9にweb拍手をくださった方へ]]> https://apxxxxxxe.dev/entries/webclap202505081330 https://apxxxxxxe.dev/entries/webclap202505081330 Fri, 09 May 2025 03:00:00 GMT <p>(4/24に拍手をくださり、その続きとして5/9に拍手をくださった方への返信です)</p> <p>詳細なご回答ありがとうございます。おかげさまで原因が判明しました!<br> ご推察の通り、SSPが日本語を含むファイルパスに配置されている場合に不具合が生じていました。</p> <h3 id="原因読み飛ばしていただいて構いません">原因(読み飛ばしていただいて構いません)</h3> <p>現在の仕様ではプラグインのロード時にプラグインのファイルパスをSSPから受け取っている(ログファイルがプラグインフォルダの直下に生成される機能などはこれを用いています)のですが、<br> ここで日本語文字列が含まれている場合は読み込みに失敗してしまい、以降の処理が部分的に働かなくなっていたようです。</p> <h3 id="対応">対応</h3> <p>修正バージョン(<a href="https://github.com/apxxxxxxe/GhostSpeaker/releases">v1.2.4</a>)を作成し、公開しました!</p> <p>上記の問題に対処し、SSP(厳密にはプラグインのフォルダ)が日本語を含むファイルパスに配置されている場合でも動くように修正しています。<br> テストとして、こちらの環境で <code>C:\Users\Public\Downloads\伺か\ssp.exe</code> となるように配置したSSPで検証し、プラグインが正常に動作することを確認しました。</p> <p>すでにフォルダ名をアルファベットに変更することでご対応いただいたとのことで、ご不便をおかけして申し訳ありませんでした。<br> 本バージョン以降では問題なくご利用いただけるかと思います。</p> <p>また何かご不明点などございましたらご連絡いただければ幸いです。</p> <![CDATA[無題20250509]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki202505091330 Fri, 09 May 2025 00:00:00 GMT <p>アラームを設定してから仮眠を取っていたのですが、</p> <ul> <li>初回アラーム: 睡眠時間1時間40分</li> <li>スヌーズ機能アラーム: 睡眠時間10分</li> </ul> <p>で2つの体感時間がほぼ同じでした そんなことある?<br> ちなみにばっちり夢も見ました 人体のふしぎ</p> <![CDATA[無題20250508]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki202505081330 Thu, 08 May 2025 00:00:00 GMT <p>他の方に描いていただいた作品を紹介するコーナーを<a href="https://apxxxxxxe.dev/gallery/">ギャラリー</a>に追加しました。<br> アカウント不要で見られるページに掲載されているかどうかを紹介の基準としています。</p> <![CDATA[雑記]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki202505081101 Thu, 08 May 2025 00:00:00 GMT <p>試験的にサイト全体の指定フォントをメイリオにしました<br> メイリオがインストールされている環境では優先的に使用されます</p> <p>往年の雰囲気(というより2010年代のwiki文化あたり?)を目指しての変更ですがどうかな<br> しばらくやってみて見にくさが勝つようだったら戻します</p> <![CDATA[雑記]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki202505060659 Wed, 07 May 2025 00:00:00 GMT <p>数日前からTwitterなどで創作サーチ(<a href="https://tters.jp/s">https://tters.jp/s</a>)が話題ですね</p> <p>ざっと眺めるだけでもサイト管理者さん達の個性と創作意欲が発揮されていて楽しいです</p> <p>特に目を引いたのは「<a href="https://www.nuilulu.me/">るる美の保健室</a>」さん<br> やりたいこと全部やってる感じがめちゃくちゃ素敵です こうありたい</p> <![CDATA[2025/4/24 に拍手をくださった方へ]]> https://apxxxxxxe.dev/entries/clap202505060208 https://apxxxxxxe.dev/entries/clap202505060208 Tue, 06 May 2025 00:00:00 GMT <p>GhostSpeakerの不具合について、ご報告ありがとうございます。 原因調査のためにいくつかご質問させていただきたいことがございます。<br> 長くなっておりお手数をおかけして申し訳ございませんが、ご確認いただければ幸いです。</p> <h3 id="ご確認したいこと">ご確認したいこと</h3> <ul> <li>本プラグインにおける自動更新機能は現在削除済みですが、v1.0.2時点では有効でした。v1.0.2では動作するというのは、自動更新が走り、最新版への更新が行われたうえでのことでしょうか?(バージョンはプラグインメニューの最上部に記載されておりますので、ご確認いただければ幸いです。)</li> <li>v1.0.2より先のバージョンで音声合成が行われないとのことですが、 <ul> <li>棒読みちゃん</li> <li>VOICEVOX</li> <li>COEIROINK2</li> </ul> </li> </ul> <p>のすべてで音声合成が行われないということでしょうか。(上の3ソフトとは別々のロジックで通信しているので、原因の切り分けのためのご質問です)</p> <h3 id="前提">前提</h3> <p>上記のご質問は、以下の前提に立つものです。</p> <ul> <li>v1.2.1以前、ログファイルの初期化に失敗した場合は回復不能エラーとしてSSPごと落ちるという仕様になっていました。ログファイル機能にそこまでの厳しさは必要ないということでv1.2.2以降は警告メッセージのみ発し、それ以降の機能はそのまま続ける仕様になっています。</li> <li>すなわちv1.0.2ではログファイルの初期化に失敗した場合はSSPごと落ちるはずなので、本お問い合わせの焦点はログファイルが生成されないことではなく、v1.0.2では動いていた音声合成が以降のバージョンで動かないことにあると推測しております。</li> </ul> <hr> <p>ご依頼、ご説明は以上となります。<br> 改めて、お手数をおかけして申し訳ございませんがご回答いただければ幸いです。</p> <![CDATA[イラスト!!!!!]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki202505051706 Mon, 05 May 2025 12:12:02 GMT <p>ホウ酸さんにハイネと女性ユーザのイラストを描いていただきました!!!!!!(<a href="https://misskey.io/notes/a7dcqx7o2pez02m3">link</a>)<br> 顔が近く、感情がある ありがとうございます…</p> <![CDATA[雑記]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/zakki20250505 Mon, 05 May 2025 00:00:00 GMT <p>最近ランニングをしています</p> <p>学生の頃のマラソン大会は競争の面が強くて嫌だったけれど、<br> 夜中に一人で走るのはなかなか楽しい</p> <![CDATA[理想の女を描いていただきました]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/fammefatale_from_others Mon, 10 Feb 2025 00:00:00 GMT <p><a href="https://apxxxxxxe.dev/gallery/fammefatale/">私の理想の女</a>を小戸らでくさんに描いていただきました (<a href="https://nekoorinu.monster/illust.html">link</a>)</p> <p>ここでいう理想の女という概念は小戸らでくさんが考案された概念で、<br> 名の通り自分にとっての理想の女を考えてみようというムーブメントでした</p> <p>うちの理想の女は儚さと強さがある人でした<br> 不意に消えてしまいそうな雰囲気だけど、問題解決能力が高く他人に頼らず一人で生きていける人 でももういない<br> 「もう会うことのない人」という概念が持つ雰囲気 何がきっかけだったか思い出せないけど昔から好き</p> <p>みたいなことをその場にいた人たちと話し合っていました<br> それぞれの人が考案した理想を見て、あ~確かに好きそ~ となったりしてよかったです<br> あとマジでガチの理想を凝縮しているので人に話したり見せるのが恥ずかしいというのも共通の感想でした</p> <p>みなさんも理想の女/男/その他 を考えてみてはいかがでしょうか</p> <![CDATA[サイト更新: ギャラリーページ追加]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/publish-gallery Wed, 05 Feb 2025 00:00:00 GMT <p>サイトに<a href="https://apxxxxxxe.dev/gallery/">ギャラリー</a>ページを追加しました。<br> 伺かのイラストだけでなく、自作絵全般を載せていく予定です。</p> <![CDATA[福笑い式surfaces.txtジェネレーターを作った話]]> https://apxxxxxxe.dev/entries/adventcalendar_20241207 https://apxxxxxxe.dev/entries/adventcalendar_20241207 Sat, 07 Dec 2024 00:00:00 GMT <p>伺か・伺的 Advent Calendar 2024 (第2会場) 7日目の記事です。<br> 6日目の<a href="https://note.com/kanade_lab/n/n36254ac65034">ななっちさん</a>に続いて、日野つみが記事を書かせていただきます。</p> <p>本記事では、界隈でたびたび話題となっているサーフェス定義方針、<br> いわゆる「福笑い式」について界隈での動きなどを提示したのち、<br> 私が開発した福笑い式に基づくsurfaces.txtジェネレーター「surfaces-mixer」について紹介します。</p> <h2 id="福笑い式の定義">福笑い式の定義</h2> <p><strong>※記事で言及する便宜上本項で定義していますが、一般的な意味を定めるものではありません。</strong></p> <p>「福笑い式」とは、伺かのサーフェス定義ファイルsurfaces.txtにおいて、<br> サーフェス番号の桁一つに対してパーツを割り当てるという手法です。<br> 例えば、サーフェス番号111~999の範囲で、1の位には目パーツ、10の位には口パーツ、100の位には眉パーツを割り当てるといった具合です。</p> <p><img src="20241201_adventcalendar.png" alt="center:福笑い式の図"></p> <p>「1は開いた目」 「2は閉じた目」 「3は笑った目」というように数字に対してパーツの意味を割り当てておくことで、<br> 「普通の眉、笑った口、笑った目はサーフェス番号133番」というように、サーフェス番号からパーツを推測しやすくなるというメリットがあります。 パーツの組み合わせを網羅しているため、欲しい表情を瞬時にゴーストに適用することができます。</p> <p>デメリットとしては、パーツが増えるほど組み合わせの数も指数関数的に増えていくため<br> 手作業でのsurfaces.txtの記述が困難であることが挙げられます。</p> <h2 id="界隈における取り組み">界隈における取り組み</h2> <p>福笑い式に関する取り組みを知っている限りご紹介します。<br> 他にもあるよ!という場合は<a href="http://clap.webclap.com/clap.php?id=apxxxxxxe">Web拍手</a>等で教えていただけると幸いです。</p> <h3 id="桁ごとにパーツを指定するsurface定義"><a href="https://yoippari.n0v0.be/p/dev_10Ksurface.html">桁ごとにパーツを指定するsurface定義</a></h3> <p>冷やし湯さんが作成された福笑い式サーフェス定義を積んだサンプルゴーストです。<br> また、リンク先ページでは福笑い式についての解説もされています。</p> <h3 id="サーフィス組み合わせ機"><a href="https://ukiya.sakura.ne.jp/other/surfacecombinator.html">サーフィス組み合わせ機</a></h3> <p>Ukiyaさんが作成されたWebアプリケーションです。<br> 画像ファイル名をパーツ別に指定することで、福笑い式のsurfaces.txtを生成します。</p> <h3 id="サーフェス連番ジェネレータ"><a href="https://kuronekokuro.bake-neko.net/ukagaka/index.html">サーフェス連番ジェネレータ</a></h3> <p>クロ猫黒さんが作成されたexe形式のアプリケーションです。<br> パーツ別に別ディレクトリに格納されたパーツファイルを読み込んで、福笑い式のsurfaces.txtを生成します。</p> <h3 id="surfacebuilder"><a href="https://github.com/kanadelab/SurfaceBuilder">SurfaceBuilder</a></h3> <p>ななっちさんが作成されたexe形式のアプリケーションです。 パーツ画像をドラッグ&ドロップすることで、サーフェス合成プレビューを確認することができます。<br> また、合成したサーフェスの定義をクリップボードにコピーする補助機能も搭載されています。</p> <h2 id="surfaces-mixer">surfaces-mixer</h2> <p>本記事で紹介するsurfaces-mixerは、上記の取り組みを参考にしつつ、以下の特徴を持つsurfaces.txtジェネレーターです。<br> surfaces-mixerは設定ファイルに特定のフォーマットでパーツの指定を記述し、それを読み込むことでsurfaces.txtを生成します。<br> フォーマット(yaml)の把握と簡単なコマンドラインの操作さえ可能ならば、柔軟で強力、かつメンテナンスフリーにsurfaces.txtを生成することができます。</p> <h3 id="surfacestxtのメンテナンスが容易">surfaces.txtのメンテナンスが容易</h3> <p>従来の福笑い式ジェネレーターは、surfaces.txtの一部を生成し、<br> 残りは手作業でsurfaces.txtへ移植するという手法が一般的でした。</p> <p>一方、surfaces-mixerは、surfaces.txtの全体を生成することができます。</p> <h3 id="パーツの指定方法が柔軟">パーツの指定方法が柔軟</h3> <p>surfaces-mixerは yaml というデータ形式を採用することで、surfaces.txtに手書きしていた<br> <code>animation</code>や<code>collision</code>を含むサーフェス定義をそのまま記述することができます。</p> <pre><code class="language-yaml"># サンプルファイル # yamlファイルはraw,charactersの2分類を起点に構成される。 # # - raw: descriptなど、組み合わせに関係のない定義。 # ここに記述された内容はsurfaces.txtの冒頭にそのまま出力される。 # # - characters: キャラクターごとのパーツの定義。 # [構造] # // \0キャラクターの定義 # - base: ... # 頭や胴体など、全サーフェスに共通するパーツの定義。 # parts: # 基点 # - group: 〇〇 # 「目」「口」など、そのグループ名が何であるかの目安。 # details: # 詳細情報の基点 # - name: △△ # 「半目」「閉じ目」など、そのパーツが何であるかの目安。 # text: ... # そのパーツのサーフェス定義。 # // \1キャラクターの定義 # - base: ... # 頭や胴体など、全サーフェスに共通するパーツの定義。 # parts: # 基点 # (移行同様) raw: | descript { version,1 } characters: # \0側キャラクター - parts: - group: 顔色 details: - name: 通常顔 text: | - name: 照れ顔 text: | animation500600.interval,runonce animation500600.pattern0,overlay,101,0,0,0 - group: 目 details: - name: こっち目 text: | animation500300.interval,runonce+rarely animation500300.option,shared-index animation500300.pattern0,overlay,201,0,0,0 animation500300.pattern1,overlay,209,4000,0,0 animation500300.pattern2,overlay,204,100,0,0 animation500300.pattern3,overlay,201,100,0,0 - name: あっち目 text: | animation500300.interval,runonce+rarely animation500300.option,shared-index animation500300.pattern0,overlay,203,0,0,0 animation500300.pattern1,overlay,209,4000,0,0 animation500300.pattern2,overlay,206,100,0,0 animation500300.pattern3,overlay,203,100,0,0 - group: 腕 details: - name: 前手 text: | animation505000.interval,runonce animation505000.pattern0,overlay,503,0,0,0 collisionex13,hand,polygon,288,423,330,410,336,414,341,422,328,446,317,436,288,442 collisionex14,hand,polygon,282,501,262,536,261,550,285,556,299,549,294,521,295,512 - name: 胸に手 text: | animation504000.interval,runonce animation504000.pattern0,overlay,501,0,0,0 animation590000.interval,runonce animation590000.pattern0,overlay,601,0,0,0 collisionex13,hand,polygon,288,423,330,410,336,414,341,422,328,446,317,436,288,442 collisionex14,hand,polygon,282,501,262,536,261,550,285,556,299,549,294,521,295,512 base: | collisionex10,shoulder,polygon,205,319,206,309,214,301,229,299,251,293,248,312 collisionex11,shoulder,polygon,292,293,309,299,332,302,339,315,301,315 collisionex7,mouse,ellipse,260,259,283,268 collisionex8,head,polygon,292,134,319,151,340,176,339,192,292,190,240,192,201,187,213,158,230,140,259,127 collisionex6,face,polygon,270,285,239,267,227,246,220,214,222,189,227,173,315,170,320,189,321,210,315,245,305,268 //素体 element0,overlay,surface1000.png,0,0 # \1側キャラクター - parts: - group: 素体 details: - name: 通常 text: | - name: 腕上げ text: | animation500600.interval,runonce animation500600.pattern0,overlay,101,0,0,0 - group: 目 details: - name: こっち目 text: | element0,overlay,surface3000.png,0,0 - name: あっち目 text: | element0,overlay,surface3001.png,0,0 </code></pre> <p>このyamlファイルをsurfaces-mixerに読み込むことで、以下のsurfaces.txtを生成することができます。</p> <pre><code>charset,UTF-8 descript { version,1 } // 顔色 surface111,112,121,122 { // 通常顔 } surface211,212,221,222 { // 照れ顔 animation500600.interval,runonce animation500600.pattern0,overlay,101,0,0,0 } // 目 surface111,112,211,212 { // こっち目 animation500300.interval,runonce+rarely animation500300.option,shared-index animation500300.pattern0,overlay,201,0,0,0 animation500300.pattern1,overlay,209,4000,0,0 animation500300.pattern2,overlay,204,100,0,0 animation500300.pattern3,overlay,201,100,0,0 } surface121,122,221,222 { // あっち目 animation500300.interval,runonce+rarely animation500300.option,shared-index animation500300.pattern0,overlay,203,0,0,0 animation500300.pattern1,overlay,209,4000,0,0 animation500300.pattern2,overlay,206,100,0,0 animation500300.pattern3,overlay,203,100,0,0 } // 腕 surface111,121,211,221 { // 前手 animation505000.interval,runonce animation505000.pattern0,overlay,503,0,0,0 collisionex13,hand,polygon,288,423,330,410,336,414,341,422,328,446,317,436,288,442 collisionex14,hand,polygon,282,501,262,536,261,550,285,556,299,549,294,521,295,512 } surface112,122,212,222 { // 胸に手 animation504000.interval,runonce animation504000.pattern0,overlay,501,0,0,0 animation590000.interval,runonce animation590000.pattern0,overlay,601,0,0,0 collisionex13,hand,polygon,288,423,330,410,336,414,341,422,328,446,317,436,288,442 collisionex14,hand,polygon,282,501,262,536,261,550,285,556,299,549,294,521,295,512 } surface.append111-222 { collisionex10,shoulder,polygon,205,319,206,309,214,301,229,299,251,293,248,312 collisionex11,shoulder,polygon,292,293,309,299,332,302,339,315,301,315 collisionex7,mouse,ellipse,260,259,283,268 collisionex8,head,polygon,292,134,319,151,340,176,339,192,292,190,240,192,201,187,213,158,230,140,259,127 collisionex6,face,polygon,270,285,239,267,227,246,220,214,222,189,227,173,315,170,320,189,321,210,315,245,305,268 //素体 element0,overlay,surface1000.png,0,0 } // 素体 surface1011,1012 { // 通常 } surface1021,1022 { // 腕上げ animation500600.interval,runonce animation500600.pattern0,overlay,101,0,0,0 } // 目 surface1011,1021 { // こっち目 element0,overlay,surface3000.png,0,0 } surface1012,1022 { // あっち目 element0,overlay,surface3001.png,0,0 } </code></pre> <p>このように、パーツ別の定義を箇条書き的に記述することができます。</p> <h3 id="使い方">使い方</h3> <p>1. 生成したいsurfaces.txtのyamlファイルを作成します。上記サンプルを参考にしてください。</p> <p>2. surfaces-mixer.exeの最新版を以下リンクからダウンロードします。<br> <a href="https://github.com/apxxxxxxe/surfaces-mixer/releases">https://github.com/apxxxxxxe/surfaces-mixer/releases</a></p> <p>3. ダウンロードしたsurfaces-mixer.exeを、surfaces.txtを生成したいディレクトリに配置します。<br> パスを通せる方は、任意のディレクトリに配置したのち、環境変数PATHに追加してください。</p> <p>4. コマンドプロンプトを開き、surfaces-mixer.exeがあるディレクトリに移動します。<br> 例えば、<code>C:\Users\user1\Ukagaka\ssp\ghost\myghost\shell\master</code> に移動する場合は、</p> <pre><code>cd C:\Users\user1\Ukagaka\ssp\ghost\myghost\shell\master </code></pre> <p>と入力します。<br> <img src="cmd_cd.png" alt="center:cdコマンドで目的のディレクトリ(フォルダ)へ移動"></p> <p>5. コマンドプロンプトに以下のコマンドを入力します。</p> <pre><code>.\surfaces-mixer.exe -i [yamlファイル名] </code></pre> <p>例えば、yamlファイル名が<code>surfaces.yaml</code>の場合は、</p> <pre><code>.\surfaces-mixer.exe -i surfaces.yaml </code></pre> <p>と入力します。 <img src="cmd_surfaces-mixer.png" alt="center:surfaces-mixerの実行"><br> 成功していれば、スクリーンショットのように「saved to ~」と表示され、surfaces.txtが生成されます。</p> <h2 id="まとめ">まとめ</h2> <p>福笑い式サーフェス定義はパーツ分けがされた画像群を用いてシェルを作成する際に便利な手法です。<br> 具体的には、<a href="https://khmix.sakura.ne.jp/download.shtml">キャラクターなんとか機</a>によって生成されたパーツからシェルを作る場合に効果を発揮します。<br> もちろん自作シェルの場合でも、パーツを分けたものを福笑い式にサーフェス定義することで、網羅的に表情を作成することができます。</p> <p>ぜひ紹介させていただいたツール、あるいはsurfaces-mixerを使って、福笑い式のsurfaces.txtを生成してみてください。<br> ここまで読んでいただき、ありがとうございました。</p> <![CDATA[Skeb用資料]]> https://apxxxxxxe.dev/entries/haine_references https://apxxxxxxe.dev/entries/haine_references Sun, 20 Oct 2024 00:00:00 GMT <p><img src="20240822_cry.png" alt="center:size-limit:最新の絵です"></p> <p><img src="haine.png" alt="center:size-limit:"></p> <![CDATA[2024/8/8 にweb拍手をくださった方へ]]> https://apxxxxxxe.dev/entries/webclap_response_20240808 https://apxxxxxxe.dev/entries/webclap_response_20240808 Sat, 10 Aug 2024 00:00:00 GMT <p>こちらこそハイネを気にかけてくださってありがとうございます~~~</p> <p>2019年代に一度公開したときは完成度の低さに自分で恥ずかしくなっちゃって公開を停止していました</p> <p>現在も正式に公開するのはまだ先ですが、(おそらくご存じの通り)GitHubから開発中のデータをダウンロードできるようになっています</p> <p>すでに当時から大幅な変更が入っており、今後も設定変更・仕様変更などがあることは否めませんがゆるくお付き合いいただければと思います</p> <![CDATA[サイト内部の更新]]> https://apxxxxxxe.dev/blog https://apxxxxxxe.dev/entries/static-update Wed, 07 Aug 2024 00:00:00 GMT <p>以前まではSSRを用いた動的サイトとして本サイトをデプロイしていましたが、<br> Next.jsのstatic exportを使ってサイトを静的に生成する形に更新しました。ちょっと早くなったかも</p> <p>ところで、この文のような記事にするまでもない雑記は一覧に全文を表示する形式にしました。<br> 記事らしい記事の更新もできていないので、今後はマイクロブログっぽい使い方もしたりしつつなんとかこのスペースを活用していきたいですね</p> <![CDATA[gitで過去のコミットを編集したり分割したりする方法]]> https://apxxxxxxe.dev/entries/git-split https://apxxxxxxe.dev/entries/git-split Wed, 26 Apr 2023 00:00:00 GMT <h2 id="tldl">TL;DL</h2> <p>intaractive rebaseを使いましょう。</p> <h2 id="はじめに">はじめに</h2> <p>gitでコミット分割の方法を調べたのでメモしておきます。</p> <h2 id="手順">手順</h2> <h3 id="git-logして該当コミットとその1つ前のコミットのshaを確認">git logして該当コミット(とその1つ前のコミット)のSHAを確認</h3> <pre><code class="language-sh">git log --oneline 83f52e6 (HEAD -> main) hoge f1cae65 fuga b8929a2 piyo 0fd0f4e hoge 945b51e fuga 18f60e3 piyo d6b8ce8 poyo </code></pre> <p>下から2番目の18f60e3のコミットを分割したいとします。<br> このとき、18f60e3,d6b8ce8の2コミットをのちに入力できるように記憶しておきます。</p> <h3 id="git-rebaseで該当コミットを編集可能な状態にする">git rebaseで該当コミットを編集可能な状態にする</h3> <pre><code class="language-sh">git rebase -i d6b8ce8 </code></pre> <p>とするとエディタが開き、そこには</p> <pre><code class="language-sh">pick 18f60e3 piyo pick 945b51e fuga pick 0fd0f4e hoge pick b8929a2 piyo pick f1cae65 fuga pick 83f52e6 hoge # Rebase d6b8ce8..83f52e6 onto d6b8ce8 (6 commands) (以下省略) </code></pre> <p>のような記述がなされています。<br> 今回いじりたいのは18f60e3なので、</p> <pre><code class="language-sh">edit 18f60e3 piyo pick 945b51e fuga pick 0fd0f4e hoge pick b8929a2 piyo pick f1cae65 fuga pick 83f52e6 hoge # Rebase d6b8ce8..83f52e6 onto d6b8ce8 (6 commands) (以下省略) </code></pre> <p>と文頭のpickをeditに変え、保存して閉じます。</p> <pre><code class="language-sh">Stopped at 18f60e3... piyo You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue </code></pre> <p>と出力されれば成功。18f60e3が編集可能となりました。</p> <h3 id="git-resetで変更をワーキングディレクトリに戻す">git resetで変更をワーキングディレクトリに戻す</h3> <p>現在、18f60e3での変更はヒストリー上にあるので、コミットし直すためにワーキングディレクトリまで引き戻します。</p> <pre><code class="language-sh">git reset HEAD~ </code></pre> <h3 id="変更をコミット">変更をコミット</h3> <p>git add, git commitで変更をコミットします。<br> ここでコミットを小分けにすることで、当初の目的であるコミット18f60e3の分割が叶います。</p> <h3 id="git-rebase---continueでheadにチェックアウトして終了">git rebase --continueでHEADにチェックアウトして終了</h3> <p>コミットが完了したら、rebaseで編集モードを終了し、HEADへチェックアウトします。</p> <pre><code class="language-sh">git rebase --continue Successfully rebased and updated refs/heads/main. </code></pre> <p>過去のコミットを分割しなおすことができました。</p> <h2 id="参考">参考</h2> <ul> <li><a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">3.6 Git Branching - Rebasing</a></li> <li><a href="https://ken-c-lo.hatenadiary.org/entry/20130706/1373092204?utm_source=pocket_saves">Gitで数個前のcommitを遡って分割する</a></li> <li><a href="https://qiita.com/phanect/items/4353854cb0d962916acf?utm_source=pocket_saves">Git でブランチを上書きする</a></li> </ul> <![CDATA[直近のゴーストをリスト表示するプラグインを作った]]> https://apxxxxxxe.dev/entries/recentghosts-intro https://apxxxxxxe.dev/entries/recentghosts-intro Sun, 24 Jul 2022 00:00:00 GMT <h2 id="要旨">要旨</h2> <p>いっぱいゴーストがいるのでより便利な方法で管理したいと思いました。<br> 思いつく方法は</p> <ol> <li>お気に入りのゴーストとその他のゴーストを別管理</li> <li>起動したいゴーストを検索する</li> <li>最近起動したゴーストをリスト表示</li> </ol> <p>3.のみ既存の機能になかったので<strong>プラグインを作りました</strong>。</p> <h2 id="きっかけ">きっかけ</h2> <p>私の環境にはゴーストが700名ほどインストールされています。<br> どのゴーストさんも満遍なく起動したいとはいえ、このままではあまりにも無秩序です。<br> ある程度優先順位をつけ、探しやすくする必要があると考えました。</p> <h2 id="アプローチ">アプローチ</h2> <h3 id="1-お気に入りのゴーストとその他のゴーストを分ける">1. お気に入りのゴーストとその他のゴーストを分ける</h3> <p>最初に思いつく方法でした。お気に入りは特別な枠で管理したいものです。<br> SSPでは、ゴーストのインストールディレクトリを複数設定することが可能です。(バルーンなども同様)<br> この機能を使うことで、お気に入り/それ以外のみならず、イベント別・ジャンル別など様々な分類が可能になります。</p> <h3 id="2-起動したいゴーストを検索する">2. 起動したいゴーストを検索する</h3> <p>ユーザの需要をより即時的かつ直感的に叶える方法です。<br> これもSSPに該当する機能が搭載されています。<br> Ctrl+Eで開くエクスプローラーでCtrl+Fを押すと開く検索窓に単語を入力することで、ゴースト名はもちろん作者名、キャラクター名までもを対象にゴーストの検索が可能です。<br> とてもべんり</p> <h3 id="3-最近起動したゴーストのリストを作る">3. 最近起動したゴーストのリストを作る</h3> <p><a href="https://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E3%81%AE%E5%B1%80%E6%89%80%E6%80%A7">時間的局所性</a>という概念があります。<br> ある時点で参照されたデータは近い未来に再度参照されることが多いというコンピュータ科学での考え方ですが、これは一般にも同じことが言えると思います。実際、よくテキストエディタに搭載されている「最近使ったファイル」には類似の思考が見えます。<br> ぜひこれをSSPでも使いたいと思ったのですが、SSPに最近起動したゴーストを表示する機能はありませんでした。(私が気付いてないだけであれば教えていただけると幸いです)<br> ということで<strong>最近起動したゴーストをリスト表示するプラグインを作りました。</strong><br> <a href="https://github.com/apxxxxxxe/recentghosts">card:直近のゴースト - Github</a></p> <h2 id="直近のゴーストの簡単な説明">「直近のゴースト」の簡単な説明</h2> <p><img src="https://raw.githubusercontent.com/apxxxxxxe/recentghosts/images/image.png" alt="center:preview"></p> <ul> <li>本プラグインを有効にしておくと、起動したゴーストが自動的に20件まで記録されます。</li> <li>メニューから本プラグインを実行するとリストが表示されます。</li> <li>リストには各ゴーストの切り替え・呼び出し機能があります。</li> </ul> <p>ぜひおためしください。</p> <![CDATA[ゴースト作成のTIPS]]> https://apxxxxxxe.dev/entries/tips https://apxxxxxxe.dev/entries/tips Wed, 29 Jun 2022 00:00:00 GMT <h2 id="で口パクアニメーションしないようにしたい">「......」で口パクアニメーションしないようにしたい</h2> <p><img src="kuchipaku.gif" alt="center:……で口パクを止めている"></p> <h3 id="シェルの口パク">シェルの口パク</h3> <p><a href="http://ssp.shillest.net/ukadoc/manual/descript_shell_surfaces.html#introduction_animationinterval">surfaces.txtのアニメーションインターバル定義</a>には、トークに合わせてanimationを動かすオプションのtalkがあります。 これを使うとトーク時に口を動かす表現が実現できます。ただし、これは「……」のようなセリフ的には無言の部分でも口が動いてしまいます。解決策を考えましょう。</p> <h3 id="解決策">解決策</h3> <ul> <li><strong>「……」をクイックセクション(\_q)で囲む。</strong></li> </ul> <p>クイックセクションには以下の特徴があります。</p> <ol> <li>クイックセクション内の文章は一瞬で表示される</li> <li>ただしウェイトは有効である</li> </ol> <p>クイックセクション内の文章は一瞬で表示されます。一瞬で表示されるということは、当然口パクの対象外になります。<br> いっぽうで、クイックセクション内でもウェイト(\w9や\_w[500]など)は依然として有効です。</p> <p>すなわち、以下のようにさくらスクリプトを記述することで、口パクする/しないを指定することができます。</p> <pre><code>// before ……あいうえお // after \_q…\_w[500]…\_w[500]\_qあいうえお </code></pre> <p>その都度ウェイトを仕込むのは大変なので、里々ならreplace.txt、YAYAならOnTranslateに置換処理を記述するとよいでしょう。</p> <h2 id="トーク文章の表示速度を辞書側で調整したい">トーク文章の表示速度を辞書側で調整したい</h2> <p>SSPのデフォルト表示速度は50ms/文字(ユーザ側で調整可能)ですが、<br> 早口、ゆったりの表現や長い文章をゆっくり表示したいなど、ゴースト側から表示速度を変更したいことがしばしばあります。</p> <h3 id="実現するための考え方">実現するための考え方</h3> <ul> <li>遅らせたい場合、1文字ごとにウェイト(\_w[25]など)を入れて表示速度を調整すればよい</li> <li>早めたい場合は上記に加えてさくらスクリプト\_qでデフォルトのウェイトを消す必要がある</li> </ul> <p>考え方自体は単純ですが、問題はどうやってウェイトを挿入するかです。 機械的に1文字ごとにウェイトを入れようとすると、さくらスクリプトの記述が壊されてしまいます。</p> <pre><code>\_q -> \\_w[25]_\_w[25]q\_w[25] (さくらスクリプトが機能しない) </code></pre> <h3 id="具体的な方法yaya">具体的な方法(YAYA)</h3> <p>さくらスクリプトをRE_REPLACE関数で一時的に制御文字に置き換え、ウェイト挿入後に再度置換することで解決します。</p> <pre><code>AddWait { // _argv[0]: 対象文字列 // _argv[1]: ウェイト[ms] // メッセージスピードの標準は50ms これに加算すると考えて調整 _text = _argv[0] _wait = '\_w[' + _argv[1] + ']' // 適当な制御文字 YAYAは0x0を扱えないので0x1で _tagmark = CHR(0x1) // さくらスクリプトは_tagmarkに置き換えて退避 //(さくらスクリプト中にウェイト記述が挟まって破綻するのを防ぐ) // 置換したさくらスクリプトは配列に保持しておいて適宜取り出す _t = RE_REPLACE(_text, '\\_{0,2}[a-zA-Z0-9*!&#x26;\-+](\d|\[("([^"]|\\")+?"|([^\]]|\\\])+?)+?\])?', _tagmark) _tags = RE_GETSTR _tagcount = 0 _textlen = STRLEN(_argv[0]) _result = "" for _i=0; _i&#x3C;_textlen; _i++ { _c = SUBSTR(_t, _i, 1) if _c == _tagmark { _result += _tags[_tagcount] _tagcount += 1 } else { _result += _c + _wait // #1 } } _result } </code></pre> <p>OnTranslateInternal関数にこれを仕込むことでウェイトの調整がトーク全体に適用されます。</p> <h2 id="連続して同じトークが来るのを避ける">連続して同じトークが来るのを避ける</h2> <p>たくさんのトーク群からどのようにトークを選び、喋らせるかは、ゴーストの実在感・トークの没入感に関わります。<br> トーク選択の基本処理はSHIORIがよしなにやってくれていますが、デベロッパー側からある程度ルールを設定することも可能です。</p> <h3 id="前提">前提</h3> <p>トーク被りを避け、出来るだけまんべんなくトークが選ばれるようにしたい。</p> <h4 id="里々">里々</h4> <p>『$文「○」の重複回避』『$単語群「○」の重複回避』を利用してトーク被りを回避できます。<br> 詳しくは<a href="http://soliton.sub.jp/satori/index.php?%E7%89%B9%E6%AE%8A%E5%A4%89%E6%95%B0#o772b719">こちら</a>を参照</p> <h4 id="yaya">YAYA</h4> <p>関数のオプション「nooverlap」を指定することでトーク被りを回避できます。<br> 詳しくは<a href="https://emily.shillest.net/ayaya/?%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/%E6%96%87%E6%B3%95/2.%E9%96%A2%E6%95%B0#vce5bec3">こちら</a>を参照</p> <h4 id="提案ルーレット選択アルゴリズムを実装するyaya">提案:ルーレット選択アルゴリズムを実装する(YAYA)</h4> <p>上記の方法では、直前のトークとの被りのみ考慮されます。つまり極端に言えば、トークがA,B,C,...と用意されているのに、</p> <pre><code>トークA -> トークB -> トークA </code></pre> <p>のような順番は依然としてありえます。<br> このトークさっき聞いたな?となるのはなるべく避けるべきです。<br> そこで提案したいのが<a href="https://ja.wikipedia.org/wiki/%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0#:~:text=%E3%82%82%E3%81%AE%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82-,%E3%83%AB%E3%83%BC%E3%83%AC%E3%83%83%E3%83%88%E9%81%B8%E6%8A%9E,-%5B%E7%B7%A8%E9%9B%86%5D">ルーレット選択アルゴリズム</a>です。<br> 実装方法として、</p> <ul> <li>各トークに重みを付け、それを考慮したランダム選択を行います。</li> <li>選択のたびに次の処理を行います。 <ul> <li>選ばれたトークは重みを1に減らす</li> <li>選ばれなかったトークは重みを一定数増やす</li> </ul> </li> </ul> <p>これにより、トークが選ばれた直後は被る確率が最小になり、その後少しずつ確率が増えることで前述の問題を軽減し、より自然かつ満遍ないトークが可能になります。</p> <h5 id="実装例">実装例</h5> <p>拙作ゴースト「<a href="https://github.com/apxxxxxxe/Haine/blob/main/ghost/master/yaya_rouletteselection.dic">Crave The Grave</a>」で実装されています。</p> <h2 id="トークを日本語的にいい感じのところで自動改行したい">トークを日本語的にいい感じのところで自動改行したい</h2> <h3 id="トーク毎に改行にこだわるのは面倒">トーク毎に改行にこだわるのは面倒</h3> <p>ゴーストのトークを書く際、通常の文章と異なる最も大きな点は改行だと思います。<br> 筆者は文章の中途半端なところで改行が挟まると読みづらいため、読みやすい部分で改行を入れるのですが、 一般的なブログサイトは1行60文字程度であるのに対して、伺かの標準バルーンは24文字(全角、SSPデフォルト+の場合)であり、トークを書いていると改行が頻繁に来るなと感じています。 そこで見栄えの良い改行を自動化し、デベロッパーがトークの内容に専念できるようにするにはどうすればよいかを考えました。</p> <h3 id="文節を機械的に見分けて処理する">文節を機械的に見分けて処理する</h3> <p>見栄えの良い文章とは、すなわち意味の区切り=文節で改行が入っている文章です。 例えば、</p> <pre><code>吾輩は猫である。名前はまだない。  どこで生れたか頓と見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。 </code></pre> <p>という文章をバルーンで表示する場合、そのまま書き込むとこうなります。</p> <pre><code>吾輩は猫である。名前はまだない。  どこで生れたか頓と見当がつかぬ。何でも薄暗いじ めじめした所でニャーニャー泣いていた事だけは記憶 している。吾輩はここで始めて人間というものを見た。 </code></pre> <p>24文字の時点で機械的に折り返されています。ぶつ切りな印象です。<br> つぎに、以下で紹介する自動改行関数を通した場合こうなります。</p> <pre><code>吾輩は猫である。名前はまだない。  どこで生れたか頓と見当がつかぬ。何でも 薄暗いじめじめした所でニャーニャー泣いて いた事だけは記憶している。吾輩はここで始めて 人間というものを見た。 </code></pre> <p>文節で改行しています。<br> 従来より自然な印象が出ている気がします。</p> <h3 id="くわしい説明yaya">くわしい説明(YAYA)</h3> <p>形態素解析ソフトMeCabを実装したSAORI(<a href="https://github.com/ponapalt/csaori">kisaragi.dll</a>)で文章を単語に分解し、各品詞から文節を割り出すことが可能です。 これを利用して、文章を文節ごとに改行する関数を作ります。</p> <ul> <li>editing</li> </ul> <h3 id="実装例-1">実装例</h3> <p>拙作ゴースト「<a href="https://github.com/apxxxxxxe/Haine/blob/main/ghost/master/yaya_insertlinefeed.dic">Crave The Grave</a>」で実装されています。</p> <h2 id="栞を最新版にしよう">栞を最新版にしよう</h2> <h3 id="よい">よい</h3> <ul> <li>新機能が使える</li> <li>バグが修正され、不自由/危険が解消される</li> <li>最新版をつかっているという安心感</li> </ul> <h3 id="わるい">わるい</h3> <ul> <li>更新の手間(複数ゴースト等を抱えていると特に)</li> </ul> <h3 id="解決策-1">解決策</h3> <ul> <li><a href="https://github.com/apxxxxxxe/shioriupdater">複数の栞ファイルを一括で更新するツール</a>を使う</li> </ul> <p>ただし現在の機能ではdllファイルを差し替えるのみなので、更新に伴って必要となる作業がある場合は手作業で行う必要がある。</p> <h2 id="ある着せ替えパーツの表示順をサーフェスによって変えたい">ある着せ替えパーツの表示順をサーフェスによって変えたい</h2> <p><img src="sode_sample.png" alt="center:こういうサーフェスがある。"> <img src="sode_nashi.png" alt="center:袖を着せ替えパーツとしている。"> <img src="sode_nashi_ushiro.png" alt="center:腕を後ろで組むサーフェス(表示の優先度が胴>腕)を作りたいけれど、"> <img src="sode_ushiro_failure.png" alt="center:同一のanimation番号では胴<腕のままなので、後ろに表示されない。"></p> <p>だからといって後手のみanimation番号を変えただけだと、別の着せ替えパーツとして認識されてしまう。</p> <h4 id="解決法">解決法</h4> <p><strong>addid</strong>(<a href="http://ssp.shillest.net/ukadoc/manual/descript_shell.html#sakura.bindgroup*.addid,ID">解説</a>)を使うと複数のanimationをまとめて1つの着せ替えパーツとして定義できる。<br> 上述のように後手を別アニメーションとして定義したあと、shellのdescript.txtに以下のように記述する。</p> <pre><code>sakura.bindoption.group,袖 sakura.bindgroup505318.name,袖,長白 sakura.bindgroup505318.addid,500168 // 注 // animation505318: 前手用の袖アニメーション // animation500168: 後手用の袖アニメーション </code></pre> <p><img src="sode_ushiro_success.png" alt="center:やりたい動作が実現できた。"></p>