Thinking Skeever

Skyrim/The Witcher 3 Modについてのあれこれ。FoModの作り方、Mod導入時のトラブル事例などのニッチな話を書いていきます。a.k.a. BowmoreLover@nexusmods

.NET C#でMigemoってみる(その2):記号検索時のエラーを回避する

前回の記事で.NET C#のアプリケーションにMigemoの機能を追加しましたが、一つ問題を見つけました。
特定の記号を含む文字列で検索すると、正規表現エラーになってしまうのです。

f:id:thinkingskeever:20180313215929p:plain

どうやら正規表現のメタキャラクターがエスケープされていないみたいです。
というわけで対策方法をまとめてみます。

原因

Migemo.dllのソースrxgen.c中にdefault_int2char関数で、正規表現内の(メタ文字を除く)文字列を内部表現(unsigned int)から文字列(unsigned char *)に変換していますが、エスケープ対象の文字種が'\\', '.', '*', '^'. '$', '/'だけとなっていて、.NET C#正規表現仕様にマッチしていません。

対策

MigemoAPI migemo_setproc_int2charで独自のコールバック関数を登録して、.NET C#正規表現の仕様に合ったエスケープ処理を行います。
ついでに、MigemoAPI migemo_setproc_char2intについても独自のコールバック関数を登録して、2バイト文字を意識した処理を行います(rxgen.c中にdefault_char2int関数が2バイト文字を意識していないため)。

コード例

Migemo.csに次のコードを追加します。

  • コールバック関数での引数のアクセスにunsafeコードを使っているので、プロジェクトオプションのビルドタブで[アンセーフコードの許可]をチェックしてください(引数のマーシャリング云々が分からずサボってしまいました)。
  • エスケープすべきメタ文字についてはMicrosoft Reference Sourceを参考にしました。
[DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall)]
private static extern void migemo_setproc_char2int(IntPtr obj,
    [MarshalAs(UnmanagedType.FunctionPtr)]CharToIntCallbackDelegate callback);

[DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall)]
private static extern void migemo_setproc_int2char(IntPtr obj,
    [MarshalAs(UnmanagedType.FunctionPtr)]IntToCharCallbackDelegate callback);

//コールバックのデリゲート
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private unsafe delegate int CharToIntCallbackDelegate(byte* input, uint* output);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private unsafe delegate int IntToCharCallbackDelegate(uint input, byte* output);

/ デリゲートがGCで消えないように保持しておく
private CharToIntCallbackDelegate DefaultCharToIntCallback;
private IntToCharCallbackDelegate DefaultIntToCharCallback;

// 独自のコールバックを登録する
// LoadDictionaryの延長で辞書の文字コードに合ったデフォルトのコールバックに戻されるので、
// LoadDictionaryの後に呼び出すこと。
public void SetDefaultProc()
{
    if (this.migemoObject != IntPtr.Zero)
    {
        unsafe
        {
            DefaultCharToIntCallback = DefaultCharToIntCallbackFunction;
            DefaultIntToCharCallback = DefaultIntToCharCallbackFunction;
            migemo_setproc_char2int(this.migemoObject, DefaultCharToIntCallback);
            migemo_setproc_int2char(this.migemoObject, DefaultIntToCharCallback);
        }
    }
}

// コールバック関数 CharToInt
private unsafe static int DefaultCharToIntCallbackFunction(byte* input, uint* output)
{
    if (((uint)((input[0]) ^ 0x20) - 0xa1 < 0x3c) &&                            //SJIS1バイト目の判定
        ((0x40 <= (input[1])) && ((input[1]) <= 0xfc) && ((input[1]) != 0x7f))) //SJIS2バイト目の判定
    {
        if (output != null)
            output[0] = (uint)((input[0] << 8) | input[1]);
        return 2;
    }
    if (output != null)
        output[0] = (uint)input[0];
    return 1;
}

// コールバック関数 IntToChar
private unsafe static int DefaultIntToCharCallbackFunction(uint input, byte* output)
{
    int len = 0;
    if (input >= 0x100)
    {
        if (output != null)
        {
            output[0] = (byte)((input >> 8) & 0xff);
            output[1] = (byte)(input & 0xff);
        }
        len = 2;
    }
    else
    {
        switch (input)
        {
            case ' ':
            case '#':
            case '$':
            case '(':
            case ')':
            case '*':
            case '+':
            case '-':
            case '.':
            case '?':
            case '[':
            case '\\':
            case ']':
            case '^':
            case '{':
            case '|':
            case '}':
                if (output != null)
                    output[len] = (byte)'\\';
                len++;
                break;
        }
        if (output != null)
            output[len] = (byte)(input & 0xff);
        len++;
    }
    return len;
}


アプリケーション側の処理に Migemo.SetDefaultProc メソッドの呼び出しを追加する。

Migemo migemo = new Migemo();
migemo.LoadDictionary(Migemo.DictionaryId.Migemo, "./dict/cp932/migemo-dict");
migemo.LoadDictionary(Migemo.DictionaryId.HanToZen, "./dict/cp932/han2zen.dat");
migemo.LoadDictionary(Migemo.DictionaryId.HiraToKata, "./dict/cp932/hira2kata.dat");
migemo.LoadDictionary(Migemo.DictionaryId.RomaToHira, "./dict/cp932/roma2hira.dat");
migemo.LoadDictionary(Migemo.DictionaryId.ZenToHan, "./dict/cp932/zen2han.dat");

//コールバックの登録。必ずLoadDictionaryの後に呼び出す
migemo.SetDefaultProc();

対策結果

無事、記号での検索ができるようになりました!

f:id:thinkingskeever:20180313215943p:plain

ちなみに、上記のコールバック関数でUTF-8との変換を行い、Migemo.csのQueryの文字コード変換処理を手直しすれば、utf-8の辞書が使えるようです。

以上です。



改訂履歴
2018/03/13 22:00 - 初回公開
2018/03/19 12:00 - コールバック関数 IntToChar のメタキャラ判定の訂正

.NET C#でMigemoってみる(その1)

Migemoってご存知でしょうか。ローマ字入力で漢字を検索しようというライブラリで、EmacsVim、SAKURAといったテキストエディタでよく使われています。
自作のテキスト検索系ツールにこの機能を組み込んでみようと思い、.NET C#Migemoが使えないかどうか試してみました。
結論から言うと上手く行きました。少し引っかかるところもあったので、忘備録を兼ねてまとめておきます。
※自作のツールへの組み込み作業で新しいことが分かったら随時追記します。

C/Migemoの入手

今回はVimでお世話になっているKaoriyaさんのC/Migemoを使うことにしました。
C言語による実装で、Vim用のアドオンと共に、単独で利用できるDLLも用意されています。

バイナリのダウンロード: C/Migemo - Kaoriya
ソースコードhttps://github.com/koron/cmigemo

テスト用プログラムの作成

今回はMicrosoft Visual Studio Community 2015のC#を使いました。
作成手順は次の通りです。

(1)プロジェクトの作成

Visual Studio C#を起動して、新規プロジェクト(Windowsフォームアプリケーション)を作成する。

(2)ライブラリと辞書の追加

プロジェクトフォルダに次のファイルをコピーする。

コピー元 コピーするファイル
cmigemo-default-win32-20110227.zip migemo.dll
cmigemo-default-win32-20110227.zip dictフォルダ
ソースコード(GitHubからダウンロード) tools/Migemo.cs

ソリューションエクスプローラーに次のファイルを追加する。

migemo.dll
migemo.cs
dict/cp932フォルダと中のファイル全部(フォルダごと)

ソリューションエクスプローラーでdict/cp932下のファイルとmigemo.dllを選択し、[出力ディレクトリにコピー]を"新しい場合はコピーする"に変更する。
f:id:thinkingskeever:20180311001331p:plain

(3)フォームの作成

Form1.csのデザインを開いてTextBox、Button、RichTextBoxを配置した後、Form1のLoadイベントとbutton1のClickイベントを追加する。
f:id:thinkingskeever:20180311001344p:plain

Form1.csのコードを開き、次のコードを追加する。

using System.Text.RegularExpressions;
using KaoriYa.Migemo;

//  (中略)

        // Migemoオブジェクト
        private Migemo m_migemo;

        private void Form1_Load(object sender, EventArgs e)
        {
            // Migemoオブジェクトを作る
            m_migemo = new Migemo("./dict/cp932/migemo-dict");

            // 行またがり検索をするときはこれを設定する
            m_migemo.OperatorNewLine = @"\s*";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 反転表示のクリア
            richTextBox1.SelectAll();
            richTextBox1.SelectionBackColor = richTextBox1.BackColor;

            // 正規表現オブジェクトの生成
            Regex regex = m_migemo.GetRegex(textBox1.Text);
            Debug.WriteLine(regex.ToString());  //生成された正規表現をデバッグコンソールに出力

            // テキストの検索と反転表示
            MatchCollection matches = regex.Matches(richTextBox1.Text, 0);

            foreach (Match match in matches)
            {
                richTextBox1.Select(match.Index, 0);
                richTextBox1.SelectionLength = match.Length;
                richTextBox1.SelectionBackColor = Color.Yellow;
            }
            richTextBox1.Select(0, 0);
        }

Migemo.csのコードを開き、DllImportの引数CallingConvention.CdeclをCallingConvention.StdCallに変更する。こうしないとMigemoAPI呼び出しでPInvokeStackImbalance例外が発生する。
migemo.dllのAPIエントリは__stdcallで定義されているのでStdCallが正しいと思うのですが、私の試した範囲では、組み込み先のプロジェクトによっては変更しなくても動作したりします。何故だろう… パスの通った別フォルダにすごく古いバージョン(2003年!)のmigemo.dllがあるためでした。最新版のmigemo.dllでは必ずこの修正が必要です。

    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    private static extern IntPtr migemo_open(string dict);
    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall)]
    private static extern void migemo_close(IntPtr obj);
    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    private static extern IntPtr migemo_query(IntPtr obj, string query);
    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall)]
    private static extern void migemo_release(IntPtr obj, IntPtr result);

    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    private static extern int migemo_set_operator(IntPtr obj,
        OperatorIndex index, string op);
    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall)]
    private static extern IntPtr migemo_get_operator(IntPtr obj,
        OperatorIndex index);

    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    private static extern DictionaryId migemo_load(IntPtr obj,
        DictionaryId id, string file);
    [DllImport("migemo.dll", CallingConvention = CallingConvention.StdCall)]
    private static extern int migemo_is_enable(IntPtr obj);

これで完成です。ビルドすればEXEが作成されるはず。

テストしてみる

テキストボックスにローマ字を入力して検索ボタンを押します。
 
まずは単語検索。
f:id:thinkingskeever:20180311001402p:plain

今度は少し長い文章を。語の切れ目を大文字にしてあげる必要があります。
f:id:thinkingskeever:20180311001406p:plain

改行またがり検索。
f:id:thinkingskeever:20180311001411p:plain
 
なかなか良い感じです。

その他気づいた点

辞書の読み込みエラーの検出

Migemoオブジェクトのコンストラクタ引数で辞書を指定する場合、読み込めなくてもエラーは発生しません。
C/MigemoのREADMEには、コンストラクタの引数は省略しておき、別途Migemo.LoadDictionaryメソッドで辞書をロードするとよいとありました。
 
そこで以下のコードを試してみましたが、regexには正しく正規表現展開されていない "sakura" または "s\s*a\s*k\s*u\s*r\s*a" が戻ってくるだけでした。

    Migemo migemo = new Migemo();
    migemo.LoadDictionary(Migemo.DictionaryId.Migemo, "./dict/cp932/migemo-dict");
    Regex regex = migemo.GetRegex("sakura");

試しに他の辞書も全て読み込んでみました。Migemo.csのenum DictionaryIdにはmigemo.hのMIGEMO_DICTID_ZEN2HANに相当する項目が定義されていませんので、ZenToHan = 5 を追加し、以下のコードを試してみましたところ、正しい正規表現が得られました。

    Migemo migemo = new Migemo();
    if (!migemo.LoadDictionary(Migemo.DictionaryId.Migemo, "./dict/cp932/migemo-dict"))
        return -1;
    if (!migemo.LoadDictionary(Migemo.DictionaryId.HanToZen, "./dict/cp932/han2zen.dat"))
        return -1;
    if (!migemo.LoadDictionary(Migemo.DictionaryId.HiraToKata, "./dict/cp932/hira2kata.dat"))
        return -1;
    if (!migemo.LoadDictionary(Migemo.DictionaryId.RomaToHira, "./dict/cp932/roma2hira.dat"))
        return -1;
    if (!migemo.LoadDictionary(Migemo.DictionaryId.ZenToHan, "./dict/cp932/zen2han.dat"))
        return -1;
    Regex regex = migemo.GetRegex("sakura");

コンストラクタでmigemoのを指定すれば関連する辞書すべて読み込まれるようなので、コンストラクタの直後にIsEnableで判定する手もあります。

    Migemo migemo = new Migemo();
    migemo.LoadDictionary(Migemo.DictionaryId.Migemo, "./dict/cp932/migemo-dict");
    if (!migemo.IsEnable())
        return -1;
    Regex regex = migemo.GetRegex("sakura");

 

利用する辞書のコードセットについて

.NETの内部コードはUnicode(UTF8?)なのでutf-8の辞書を使ってしまいそうですが、utf-8の辞書では正規表現が文字化けしてしまうようです。cp932(shift-jis)の辞書を使います。
 

改行またがりの検索をするには

デフォルトでは改行またがりの検索が無効となっています。
Migemo.OperatorNewLineプロパティに@"\s*"を指定することで、改行またがり検索が有効になります。
 

GitHubから入手したソースをVisual Studioでリビルドする

こういう作業には慣れていないのですが、恐る恐るcmigemo-master\compile\vs2003\CMigemo.slnを開いてソリューションを変換してビルドすればDLLが作成されました。セキュリティ系の警告(_s関数を使え)が沢山出ましたが、上記サンプルの範囲ではうまく動きました。
 

ライセンスについて

C/Migemo本体はMITライセンスと独自ライセンスのデュアルライセンスとなっていて、どちらも商用利用も可能な自由度のあるライセンスのようです。
ですがC/MigemoのREADMEにもあるように、辞書はGPLライセンスSKK辞書を使って作られています。
商用ソフトなど、非GPLのソフトウェアで利用する場合には注意が必要です。
※別途KaoriyaさんのC/Migemoをダウンロードして辞書ファイルをコピーすることを前提とした商用ソフトがいくつか存在するようですが、こういった方法許容されるのかどうか自信がありません。

改行またがり検索の問題について

改行位置によっては改行またがり検索がうまくヒットしない場合がありました。
 
こういうテキストがあったとします。
f:id:thinkingskeever:20180311001622p:plain
 
単語の間で改行されている場合はうまくヒットします。
f:id:thinkingskeever:20180311001630p:plain

単語の切れ目で改行されているとうまくヒットしません。
f:id:thinkingskeever:20180311001634p:plain

C/Migemoで生成された正規表現は次のとおりでした。

(?:シ\s*ュ\s*ト\s*ク|シ\s*ュ\s*ト\s*ク|取\s*得|し\s*ゅ\s*と\s*く|s\s*y\s*u\s*t\s*o\s*k\s*u|s\s*y\s*u\s*t\s*o\s*k\s*u)(?:[鋭鯣駿]|ス\s*ル|ス\s*ル|す\s*る|S\s*u\s*r\s*u|S\s*u\s*r\s*u)

 
要約すると、 "(?:取得)(?:する)" のように2つのグループが定義されていて、グループ間に0個以上の空白または改行を示す "\s*" が生成されていません。
試しに正規表現を "(?:取得)\s*(?:する)" のように訂正するとヒットしました。
これがC/Migemoの問題なのか仕様なのか、今のところ分かりません。
 
 

最後に

ちょっとびっくりするような正規表現が生成されますが、今のマシンパワーですと全然気にならないですね。幸い、自分のツールでは文章の途中に改行の入らないテキストを扱うので、行またがり検索の問題の影響はありません。早速自作ツールに組み込もうと思います。

追記:組み込みました。おかげさまで自作のしょぼいツールが少しだけパワーアップ。ありがたや。
f:id:thinkingskeever:20180311172024p:plain

最後に、素晴らしいライブラリを公開してくださったC/Migemoの作者の村岡さんに感謝します。

以上


改訂履歴
2018/03/11 00:30 - 初回公開
2018/03/11 13:00 - DllImportの引数変更に関する追記
2018/03/11 17:00 - 辞書の読み込みエラーの検出に関する追記、DllImportの引数変更に関する追記変更、組み込み結果を追加

Nexus Modsニュース和訳:Kingdom Come: Deliveranceプレゼント(2018/3/2)

https://staticdelivery.nexusmods.com/images/News/cropped_13461_tile_1519836961.png

2018/3/2のNexus Modsニュース Kingdom Come: Deliverance GiveawayKingdom Come: Deliveranceプレゼント)の和訳です。

Kingdom Come: Deliveranceプレゼント

元記事:Kingdom Come: Deliverance Giveaway
投稿者:TerrorFox1234 (コミュニティ開発&広報担当)
投稿日:2018/3/2

https://staticdelivery.nexusmods.com/images/News/headers/13461_head_1519837467.png

はじめに

今月の初めに肯定的なレビューを受けてKingdom Come: Deliveranceがリリースされた。最新のゲームに詳しくない人に補足しておくと、KCDは15世紀のボヘミアを舞台とした、(比較的)歴史に忠実なロー・ファンタジーオープンワールドRPGだ。ゲーム自体が素晴らしいのはもちろん、開発側からの公式のモッディングツールがリリースされる前であっても非常にモッディングしやすいのは嬉しいニュースだ。というわけで、数週間僕たちは、ここNexus Mods上に活気あふれるKCDのモッディングコミュニティのための拠点を作るのに忙しかった(今数えたら300ほどのMODがあった!)。

Kingdom Come: Deliveranceについて

Warhorse(ゲーム開発元のチェコデベロッパ)は開発プロセスの中で、ゲームがモッディング可能となるようにできるだけオープンにしただけでなく、リリース前からモッディングコミュニティを育て、新進のMOD制作者を助けてきた。このことはKCDのメインのDiscordサーバーで証明済みだ。驚くことに、そこではゲーム開発に関わる人々が質問に答えたり、コミュニティと交流したりしてきた。それだけでなく、僕たちのWikiに対して内部ドキュメントの一部を持ち込み、ゲームの複雑な分野や、一般的なモッディングチュートリアルについての役立つ助言を提供してくれた。是非ゲームのモッディング中に見つけた有用な情報をシェアして、Wikiの成長を手助けしてほしい。結局のところ知識は力だし、KCDのモッディングコミュニティの繁栄は誰にとってもありがたいからね!

Warhorseは初の大規模パッチの開発に忙しい。ゲーム用のモッディングツールのリリースにどれほど時間がかかるのか分からないが、彼らはこの初のパッチの一環として、ゲームのモッディングをより簡単にする仕組みに取り組んでいる。パッチには専用のModsフォルダ(もうzzz_modname.extファイルじゃない!)が含まれ、ロードオーダーとマニフェストも含まれる。これはツールがリリースされるまでの待ち望んでいた応急措置になるはずだ。

というわけで僕たちは、開発者から高く評価され人気のある、モッディングコミュニティの育成に一生懸命なデベロッパーからのゲームを手にすることになった。これこそPCゲーミング界隈で望まれていたものだ!

最後に、今週はGOG.com版がリリースされたので、DRMフリー版のKCDも入手できる!

プレゼントについて

こうした状況から、今週はいつものように35ポンド分のSteamギフトカードをプレゼントするのではなく、ゲームそのものをプレゼントするのがぴったりだと判断した。GOGからKCDのコピーをいくつか購入するつもりだったけれど、最終的にWarhorseとGOGが気前よくキーを提供してくれたんだ。本当にありがたい! そんなわけで、幸運な当選者10名にゲームをプレゼントしよう。

まずは以下を読んでほしい。さもないと失格するかもしれないからね!
今回は応募者がNexus Modsの利用者であることを確認するために、応募資格を保証するための手順が必要だ。

  1. この記事にコメントを書きこむ。好きなことを書けばいい(サイトルール順守のこと!)
  2. 好きな方法でGleamウィジェットにログインする(末尾のリンク)
  3. 2番目の項目 "Leave a comment on Nexus Mods(Nexus Modsにコメントを残す)" をクリックする
  4. テキストボックスにNexus Modsのユーザー名を入力する

(Gleamウィジェットに行く前にコメントを書くのを忘れた場合、記事へのリンクを開いてコメントを書いてくれ)
コメントがなかったりユーザー名が間違っていた場合、KCDのキーは手に入らないからね。

ここまで読んでくれてありがとう。当選を祈る。そして楽しいモッディングを!!

Kingdom Come: Deliveranceプレゼントの応募はこちらから:https://gleam.io/kinT3/nxmkcdgiveaway
(当選したキーはGOG.comで利用可能だ)

以上


→ その他のNexus Modsニュース和訳はこちら

Nexus Modsニュース和訳:Vortexアルファ版リリース(2018/2/15)

https://staticdelivery.nexusmods.com/images/News/headers/cropped_13411_head_1518689649.jpg

2018/2/15のNexus Modsニュース Vortex Alpha Release(Vortexアルファ版リリース)の和訳です。

要約:

  • アルファ版のリスクを理解した上で利用のこと
  • MODの設定に慣れた人向け
  • NMM/MOからのデータ移行が可能だし、バックアップしておけば元の環境にいつでも戻すことができる
  • ユーザーの話を聞いていないという風評があるが、フィードバックには全て目を通した上で判断している
  • Vortexのダウンロードページはこちら:https://www.nexusmods.com/site/mods/1

Vortexアルファ版リリース

元記事:Vortex Alpha Release
投稿者:Dark0ne(サイトオーナー)
投稿日:2018/2/15


やあ、みんな。

僕たちは1年以上にわたって、安定しないNexus Mod Managerの後継となるMODマネージャーに取り組んできた。前提は単純で、Nexus Mod ManagerのシンプルさとMod Organizerの高度な機能を組み合わせて、あらゆる種類のモッダーにも利用できるものを作ることだった。2017年の5月にはこの後継版を"Vortex"と命名した。

数週間前には1000人のユーザーに対してVortex限定アルファ版をリリースし(その時の記事の和訳)、大半の人はバグやフィードバックの投稿で非常に役に立ってくれた。子のフィードバックを受け手、Tannninは2週間前の初回リリース以来4つのVortexアップデート版をリリースした。これらにはバグ修正と機能更新が含まれていた。ソフトウェアを広範に利用してVortexのフィードバックシステムを使ってバグ報告してくれたみんなに感謝する。このプロセスにおいてみんなの助力は非常に有用だった。

そして今、使いたい人全員にVortexアルファ版を公開する準備が整った。

さっそく飛びつく前に、「アルファ版」の意味、Vortexの現在の状態、そしてVortexが君に合うものなのかを完全に理解してもらいたい。

アルファ版ソフトウェアとは?

Google検索する手間を省くため、アルファ版の最初の説明を引用してみよう。

アルファ版ソフトウェアとは、テストの初期段階にあるコンピューターソフトウェアのことである。使用に十分な機能はあるものの、洗練されておらず、プログラムの最終バージョンに含まれる機能のほとんどが欠けていることが多い。ソフトウェア開発における「アルファフェーズ」はプログラミングと設計段階の次の段階で、最終バージョンとよく似た「ベータフェーズ」の前の段階である。
 
アルファフェーズはソフトウェア開発サイクルの初期段階であるため、通常アルファ版ソフトウェアには重大なバグやユーザビリティの問題がある。

Wikipedia日本語版の説明はこちら

Vortexはまさに今この状態だから、適切に警告することが重要だ。今ここで知っておくべきことを十分に伝えているから、セーブファイルやゲーム状態のバックアップも取らず、VortexがインストールされたMODを壊したとの不満をフォーラムなどでぶちまけられても、正直言って同情するつもりはない。そうなった原因となるバグを知りたいと思うし、できるだけ速く修正するよう努力はするが、アルファ版ソフトウェアについて思い違いをしてもらいたくない。僕たちはこれをアルファ版ソフトウェアとして扱っているし、修正が必要な未知のバグがあると予想されるからだ。

これは誰のためのもの? Vortexを使うべき?

自分が早期導入者(新たに現れた革新的商品やサービスなどを比較的早い段階で採用・受容する人々)なのか、それともVortexがより洗練されてベータ版/完全版となるのを待つべきなのかよく考えることだ。Vortexにはバグがあって不完全な状態であると公表されていることを考慮した上で、それでもこの状態のソフトウェアを利用したいのだろうか? 正常に機能しなかったり問題が発生して、Vortexが更新されるか手動修正するまでゲームがプレイできなくなっても動揺しないだろうか? もしそうでないなら、自分用のMODマネージャーとしてVortexを利用するのに適したタイミングではない。

セーブゲームやMODフォルダーのバックアップ方法を十分に理解していて、Vortexがうまく動作しない場合に手動あるいは別のMODマネージャーで問題解決できる能力があるだろうか? 感情的になったり失礼になることなく、建設的なフィードバックやバグ報告を提供して僕たちを助けたいだろうか? バグ修正や機能の開発を辛抱強く待つことができるだろうか? もしそうであれば、Vortexをダウンロードして徹底的に使ってもらいたいし、そんな君からの意見を楽しみにしている。

VortexはNMM/MO/今使っているMODマネージャーの代用になるか?

今すぐにという意味ならノーだ。今使っているMOD管理ツールからVortexに完全に切り替えることはお薦めできない。イエスと言える日はそう遠くないはずだが、今のところはノーだ。

テストチームと数週間前にリリースした限定アルファ版に参加した多くのユーザーは完全に切り替えることができた。切り替えを試すことをお勧めするが、今使っているMODマネージャーと関連したMOD設定/セーブゲームをバックアップして残しておくこと。こうしておけば、もしVortexに何か問題が起こっても、簡単に元に戻せるので、ゲーミングへの影響はない。

現時点では本サイトのNMMを公式に置き換えていない。画面上部のナビゲーションに"Install NMM"ボタンを残りしているし、VortexをダウンロードできるのはNexus Modsのゲームページだけだ。うまくいけばVortexを進化させるためのエクステンションもここでダウンロードできるようになるだろう。

今回のVortexのリリースがどういう扱いなのか伝えておかなければ。乗り換えるべき最上のものだと、大衆に対して大々的にアピールできるものではない。つまり粛々とリリースを続ける必要がある。方向性には満足しているが、まだ熟成の時間が必要だ。

アルファ版ではどういった利用者を求めているのか?

本当にVortexを試してもらいたいし、バグ報告や機能に関するフィードバックによる助けが得られると本当にありがたい。僕たちが今求めているのは、ゲームにMODを導入する能力があり、アルファ版ソフトウェアの利用に関するリスクを理解していて、本当に良い物の開発のためにバグや機能不足に我慢してくれる人だ。

アルファ版はいつまで続くのか?

NMMは永遠のベータ版で、誰にでも理想的な状態ではなかったことは理解している。Vortexではこれを避けたいと考えているが、現時点ではタイムラインやロードマップを提供することはできない。

当初の目標は、アルファ版のバグを修正してあらゆる問題に対処することだ。それから今後のロードマップに取り組み、ベータ版に到達するまでの達成目標を決定するつもりだ。

ドキュメントはある?

現在、一般公開の準備が整っているドキュメントは非常に限られているが、今後数ヶ月かけて是正していきたいと考えている。それまでの間、人気ユーチューバーのGopherがVortexの紹介とソフトウェアの使用手順をガイドするチュートリアル動画を作成している。紹介動画の準備ができ次第、このニュース記事を更新するつもりだ。彼のYoutubeチャンネルで更新情報が入手できる: https://www.youtube.com/user/GophersVids/videos


VortexにはNMM/MOからのインポート機能があるのか?

Vortexはコンピューター上に(NMMやMOとは)別のアプリケーションとしてインストールされる。Vortexのインストールや利用によって既存のNMM/MO設定が影響を受けることはない。唯一影響を受けるのは、NXM(ダウンロード)リンクの処理方法、つまりサイト上で"Download with manager"ボタンをクリックしたときに、どのアプリケーションが起動してダウンロードを始めるのかだけだ。

Vortexには「NMMからのインポート」「MOからのインポート」機能があり、各MODマネージャーからMOD設定のコピーを試みることができる。これは後戻りのできない破壊的な機能ではないし、既存の設定に影響を与えることもない。

既存のMOD設定が特に巨大な場合、Vortexが読み込むのに少し時間がかかるかもしれないので、処理中は辛抱強く待ってほしい。

NMMのDataフォルダの処理方法は(今や)古風な方法となってしまったので、Vortexへのインポートに成功したら、NMMにインストールされたMODを無効にするか、空のプロファイルに切り替えてNMMがDataフォルダに入れたファイルをクリアすることをお勧めする。こうする理由は、VortexとNMMの両方がインストールされたファイルを把握しようとするためで、同じゲームに対するMODツールを複数同時に使用するとこれがより難しくなるからだ。NMMに戻す必要があれば、Vortexを無効にしてNMMプロファイルを再適用するだけで以前の設定に戻すことが出来る。

いつものことだけど、最悪の場合に備えて現在のMOD設定をバックアップすること。問題が発生した場合にバックアップから復元できるよう、MODのインストールのバックアップを確実に取って、Vortexを使う前に正しく復元する方法を確認しておくこと。

フィードバックするにはどうすれば?

Vortexにはフィードバック・バグ報告システムが組み込まれていて、右上のメニューからアクセスできる。ソフトウェアの使用中に問題が発生した場合はこれを使って問題を報告し、問題が発生したときに行っていたことに関する詳細な情報を提供してほしい。これはTanninに直通するもので、バグを発見して修正するのに最速の方法だ。

もしVortexのバグ報告ツールではなくフォーラムなどでバグを報告されても正直役に立たない。他の場所でバグの議論をするのは自由だが、少なくともまずはVortex内からバグを報告してほしい。

フィードバックに関する注意点

現時点でVortexに取り組んでいる開発者はTannin一人だけなので、彼の時間を慎重に管理する必要がある点に留意してほしい。実際にVortexを改善する作業に大半の時間を費やすのが望ましく、ユーザーのフィードバックに対応する時間はVortex自体に費やされる時間ではないからだ。可能な限り対応したいとは思っているが、すべてのフィードバックに対応できない点に注意してほしい。とはいえ(送られたフィードバックは)全て読んでいる。

Vortexのリリースと新サイトデザインのリリースで共通して耳にするのは「俺たちの話を聞いてくれない」という概念だ。こうした馬鹿げた考え方を摘み取るために少し時間を取らせてほしい。

ユーザーの話を聞かないことと、ユーザーの言うこと/頼み事/明らかに馬鹿げた要求に応えないことの間には大きな違いがある。僕たちがVortexやサイト上から受け取った全てのフィードバックを読んでいるのは保証するし、フィードバックに基づいて行動していないとしても、僕たちが話を聞いてないというわけではない。

僕たちは複数のユーザーからの要求に応じて行動したり変更したりしないのには様々な理由があるし、何でも思い通りになるとは思わないでほしい。僕たちは1,400万人を超えるユーザー規模の要求に応じなければならない。その中には君の意見に異議を唱える者もいるだろうし、君とは全く異なることを求める者もいるだろう。僕たちは全てのユーザーの要求に応じたいが、単に実現できないことや不可能なこともあるということだ。

僕たちが変更要求に同意するか熟考するとしても、長期間にわたって積み重ねられたTODOリストがあり、君のフィードバックへの対応がその最上位に配置されるとは限らない(かといって単に最後に追加されるわけでもない)。もう一度言うが、僕たちが「耳を傾けない」ことはないし、君のフィードバックが評価されないというわけでもない。どうか理解してほしい。

Vortexはオープンソースソースコードはどこにある?

できるだけ早くVortexのソースコードをリリースする予定だ。おそらく1~2日のうちに、GitHubリポジトリに段階的に追加されるはずだ。準備ができたらこのニュース記事を更新するとともに、Vortex Code Developmentフォーラムに投稿する。

ここまで全部読んだ。Vortexを使ってテストしたい。どこで手に入る?

Vortexはゲームカテゴリ"Nexus Mods"のページにある。Vortexのために特別なMODページを用意した。https://www.nexusmods.com/site/mods/1

以上


→ その他のNexus Modsニュース和訳はこちら

Copyright (C) 2015-2020 ThinkingSkeever, All Rights Reserved.
ブログの記事内に記載されているメーカー名、製品名称等は、日本及びその他の国における各企業の商標または登録商標です。
リンクはご自由に。記事の転載はご遠慮ください。記事を引用する場合はトラックバックするか元のURLを明記してください。