兼業主夫 ときどき 指揮者 のち ギーク?

2009-04-14

クライアントソフトが必要な気がしている

 トランプが(仮とはいえ)実装できたので、何となく自分の中で満足してしまって放置する事約1ヶ月。

 まだまだ中途半端である事が気がかりで、どうせ終わりにするならもっときちんとしたものにしてからが良いな、と思い始めた。

 機能的にはいくらでも(と言うと言い過ぎだが)追加出来るのだが、追加すればするほど「どう使うか」を説明する手間は増えていく。

 プログラミングするように文法に則ってSkypeで発言するのは、一般ユーザにはかなり難しいと思うのだ。

 となると簡易入力出来る仕組みが必要だ。

 サーバ側はどんなに複雑な命令でも文法に則っていれば処理出来るが、使用者がその複雑な命令を意識することなくSkypeで発言出来る仕組み。

 それはつまり、Skype de TRPGのクライアントソフトではなかろうか。

 ボタンを押せばサイコロを振れる。

 ボタンを押せばトランプを引ける。出せる。

 生命力や精神力といった、プレイ中に変動する値を管理してくれる。

 そんなクライアントソフトがあると良いなぁ、と思う。(人ごとのように……)

 で、Windowsユーザだけをターゲットにするなら難しい話ではない。Visual C#版に組み込んでしまえば良いだけである。サーバとして使用するかクライアントとして使用するかを選ばせる事で機能を使い分けるだけだ。

 しかしMacやLinuxユーザをターゲットにするとなると、それではまずい。

 ここは共通のプラットフォームで動くものが必要だ。

 となるとAdobe AIRか? SkypeAPIとの関係はどうなのだろう。理論的にはMacだろうがWindowsだろうが接続出来るはずなのだが、便利なライブラリっぽいものがない場合には自作する事になるので、はたしてそこが私にできるのかどうなのか。

 とはいえクライアントソフトが実現すれば、出来る事が飛躍的に広がる事になる。参加メンバーの能力値を一覧で常時表示出来たり、ボタンを押すだけでサイコロを振ったり、トランプの手札をヴィジュアル的に管理出来たり。

 4月からの四半期で、少し真剣に検討してみようと思う。

2009-03-07

勉強会&オフ会だった

 3月7日(土)はmixiで管理人をしている「WEBサイト制作勉強会」の勉強会&オフ会だった。

 勉強会はid:kidd-number5さんによる「(セミナー型勉強会)ハンズオン・Google App Engine」

 Google App Engineは概要こそ何となく知っているものの、実際にどんな感じで開発をするのかはさっぱり知らなかったので、非常に勉強になった。

 ちなみにid:kidd-number5さんは「Google AppフレームワークGAEO、日本語ドキュメント登場 | エンタープライズ | マイコミジャーナル」で紹介されている「GAEO ドキュメント日本語和訳バージョン」の中の人。

 近い知り合いにそんなすごい人がいるなんて誇らしいわー、みたいな?(何

 およそ2時間半でざーっと概要+簡単な実践をしたのだが、なかなか興味深く、また非常に分かりやすかった。id:kidd-number5さんありがとう。

 その後はとある人の疑問提示という形から「クラウドとは?」「クラウドの今後は?」みたいないろいろな話をざっくばらんに1時間半ほど。

 私自身は分かったような口を利いていたけれど「なるほどねー」と思うことも非常に多くて、こちらもとてもためになった。

 その後のオフ会&2次会も非常に楽しいものだったのだがそこは割愛。

 帰途の電車の中でつらつら考えているうちにGoogle App Engineでやりたいことがいくつか出てきて、明日にでもPythonの本を購入する勢いだ。幸いな事に(?)明日は渋谷まで出るし。新しいものに飛びつくと今やっている事(not 仕事)が中途半端なまま放置されてしまうのはちょっと気にはなるのだが、でも鉄は熱いうちに打てとも言うし。

 とりあえず構想だけはしていたTRPGキャラクタDB(仮)をGoogle App Engineで作ろうと思った。そしてそれにSkype de TRPGを連動させたい。

 とにかくとても有意義な1日だった。

2009-02-12

オブジェクト指向学習中

 力業で良ければもうトランプ機能の実装が終わっていても良い頃なのだが、実際には道半ばといったところ。

 それもこれもオブジェクト指向を学習しているところだから。

 とりあえず好きなものを好きなように作っても良いのだが、せっかくvisual C#に触れる機会があったのだし、せっかくオブジェクト指向について学ぶきっかけがあったのだから、これを機にある程度ものにしておきたいと思っている。

 しかもOffice L西村さんid:myamya19701022さん、id:kidd-number5さんが寄ってたかって教えてくれるというこの状況を活かさない手はないだろう。

 ということで、現在オブジェクト指向を試行錯誤中。ようやく理解の入り口まで到達出来た気がする。

 後はもう少しあれこれやってみて手応えを感じたい。


 と、そうやって今月来月の事を考えていたら、id:myamya19701022さんからLingrのAPIについて「クライアントソフトを作るべしー」けしかけられる。(参考サイト:Lingr Developer Wiki - Lingr Group on Hatena)

 しかも「Haskell」についても目の前でひらひらされて「あーうー、やりたいけど当面は全く以て無理」と歯がゆい思いをした。いつか触ってみたいと思う。(参考サイト:本物のプログラマはHaskellを使う:ITpro)


 やりたい事と、(いつかは)やらないといけない事が山積しているので、しっかり計画を立てて地道に1つずつ潰していかなければ。そういうのはあまり得意ではないのだが、得意ではないとか言っている場合でもないのだ。

2009-01-30

Skype de TRPG の ToDoリストを公開

 自分の中でやる事を整理したかったのと、外から意見がもらえるかもなー、という下心もあって、check*padを利用してToDoリストを公開してみた。

 

 check*pad - Skype de TRPG

 頭の中にはまだToDoまで上手く落とし込めていないいろいろな事があるので、もう少しいろいろと考えつつ手も動かして、少しずつものにしていきたいと思う。

 今日は「オブジェクト指向」を勉強しつつトランプ部分をつらつら作っていたが、まだテストをしていないのでちゃんと動くのかどうか。

2009-01-28

それっぽくVisual C#版 Skype de TRPG 支援ツールが出来た

 Visual C#で、何とかそれっぽいツールを作ることが出来た。

 機能は「」とほぼ同じ。違うのはツール実行者の発言も拾ってくれることくらいである。

 まだC#はよく分からないし、SkypeAPIもいまいち分かっていないのだが、ネット上の情報を探りながら何とか出来た次第。

 とても「出来た!」とソースをお見せ出来る状態にはないのだが、より上を目指すためにもここに公開しておく。どう作るのがより良いのか、などはこれから学んでいくことにしよう。

参考サイト: Skype Community > c# using skype4com in threads

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SKYPE4COMLib;
using System.Threading;
using System.Collections;
using System.Text.RegularExpressions;

namespace SkypeDeTRPG
{
  public partial class MainForm : Form
  {
    private Skype skype = new Skype();
    private Chat chat;
    private string strMessage;
    private Hashtable htbThread = new Hashtable();
    
    public MainForm()
    {
      InitializeComponent();

      skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
      try
      {
        if (!skype.Client.IsRunning)
        {
          skype.Client.Start(false, true);
        }
      }
      catch (Exception)
      {
        // All Skype Logic uses TRY for safety
      }

      try
      {
        //Skypeと接続
        skype.Attach(7, false);
      }
      catch (Exception)
      {
        //MessageBox.Show("Konnte nicht verbinden", "Verbindungsproblem", MessageBoxButtons.RetryCancel);

      }
    }

    void skype_MessageStatus(ChatMessage pMessage, TChatMessageStatus Status)
    {
      string outputMessage = "";
      string Name = "";

      if (pMessage.Status == TChatMessageStatus.cmsReceived || pMessage.Status==TChatMessageStatus.cmsSent)
      {
        chat = skype.get_Chat(pMessage.Chat.Name);
        strMessage = pMessage.Body.ToLower().ToString();
        Name = pMessage.FromDisplayName;

        if (strMessage.Substring(0, 4) == "サイコロ" || strMessage.Substring(0, 4) == "さいころ")
        {
          strMessage = strMessage.Replace("さいころ", ""); //トリガーとなる文字「さいころ」を削除
          strMessage = strMessage.Replace("サイコロ", ""); //トリガーとなる文字「サイコロ」を削除
          strMessage = strMessage.Replace(" ", "");    //空白を削除

          //全角→半角変換
          var str = "";
          var han = "0123456789-+Dd";
          var zen = "0123456789−+Dd";
          var c = "";
          var n = 0;
          string kekka = "";

          for (var i = 0; i < strMessage.Length; i++)
          {
            c = strMessage.Substring(i, 1);
            n = zen.IndexOf(c, 0);
            if (n >= 0) c = han.Substring(n, 1);
            str += c;
          }

          strMessage = str;
          strMessage = strMessage.ToLower();       //小文字に変換

          //サイコロを振る
          var temp = strMessage.Split('+');
          var total = 0;

          // Random クラスの新しいインスタンスを生成する
          Random cRandom = new System.Random();

          for (var i = 0; i < temp.Length; i++)
          {
            var kekkaTemp = 0;

            if (temp[i].IndexOf('d', 0) >= 0)
            {
              var dice = temp[i].Split('d');
              if (dice[0] == "") dice[0] = "1"; //省略された場合はダイス1つ
              for (int j = 0; j < int.Parse(dice[0]); j++)
              {
                if (dice[1] == "") dice[1] = "6"; //省略された場合は6面ダイス
                var rand = cRandom.Next(1, int.Parse(dice[1]));
                kekkaTemp = kekkaTemp + rand;
                total = total + rand; //合計の算出

                kekka = kekka + " と " + kekkaTemp;
              }
            }
            else
            {
              kekka = kekka + " に " + int.Parse(temp[i]) + " を足して";
              total = total + int.Parse(temp[i]); //合計の算出
            }
          }

          //結果出力
          if (total != 0)
          {
            kekka = kekka.Substring(3);
            if(kekka.IndexOf("を足して", 0) < 0) kekka = kekka + " で";

            outputMessage = '■' + Name + "さん> コロコロ…… " + kekka + " 合計 " + total + " です";

            //メッセージの出力
            chat.SendMessage(outputMessage.ToString());
          }
        }
      }
    }
  }
}

とりあえずメッセージの送信

 Visual C#でのSkype連携ツール作成に関するメモ。

Skype API COM Wrapperを登録する

  1. メニューバーにある「ツール」をクリック
  2. 「ツールボックス アイテムの選択」をクリック
  3. 「COMコンポーネント」タブをクリック
  4. 「Skype Class」にチェックをつける
  5. 「OK」をクリック
  6. 「全般」に「Skype Class」が登録される

特定のユーザに特定の文字列を送信する

//Skypeと接続
axSkype1.Attach(7,false);

//文字列の送信 (
axSkype1.SendMessage("送信したいユーザのID (表示名ではない)", "送信したい文字列");

2009-01-24

Skype de TRPG 支援ツール の今後

 定例の仲間内勉強会でいろいろアドバイスをいただき、まだはっきりとは決めていないもののSkype de TRPG 支援ツール の今後を考えた。

(「Skype de TRPG 支援ツール」については、「Skype de TRPG用のファイルを、まとめてダウンロード出来るようにした - 日常のきれはし」を参照)

  1. Visual C#で開発。

 出来ればインストール不要(ファイルをダブルクリックで実行)、それが不可能なら簡単にインストールできる仕組みを用意する

  1. ツールを実行している人の発言も拾いたい
  2. まずは現行のツールと同等のもの(ダイスを振る)を作る
  3. ソードワールドRPGのレーティング表を実装する (どのような形にするかはこれから考える)
  4. トランプ機能を実装する

 誰が何を持っているのか、はその人にしかわからないようにする。(持っていないカードを出せないようなチェックも必要)

 山札がなくなった時には捨て札を切り直して山札にする。

 もちろんカードの重複がないように。

  1. キャラクターの能力値を最初に設定しておくと、自動で判定してくれたりなんかしちゃったりして?
  2. 「Skype de TRPG 支援ツール」に代わる名前を考える

 以降、思いつく限りの必要な機能は実装させていきたい

 トランプ機能の実装までを、できれば年度内にこなせると理想的。「やるやる」と言ってやらないことの多い私だし、3月末には第3子が誕生する予定なのでなかなかそうもいかないかもしれないが、可能な限り努力したいと思う。

まさかの展開でVisual C#

 今日は定例(第1、第3土曜日)の仲間内勉強会。

 先日作ったSkype de TRPGの続きをやろうと思っていたのだが、その前に気になっている事があった。

 それは「果たして使いやすいツールになっているのか」という事。

 2種類のファイルをダウンロードしないといけないし、それらのファイルを1つのフォルダにまとめるのも面倒。

 さらに「レジストリに登録」というのも「コマンドプロンプト画面が立ち上がる」のも知らない人には怖いと思う。

 1台のマシンでSkypeの同時立ち上げが出来ないのもいまいちだし。(そのためだけにcoLinuxやVM Wareを入れたりようかと本気で思ってた)

 そんな事をあれこれ話していたら、「そもそもWindowsアプリケーションとして作れば良いんじゃないの?」というアドバイスを受ける。

 「ああ、それもそうかも」と思い(Windowsアプリケーションを作ってみたい気も前々からあったし)、なーんにも知らないしなーんにも準備をしていないので初心者丸出し質問を連発してとりあえず「Visual C#」に挑戦してみることにした。

 VBAはいつも使っているのでVisual Basicにしようかと思っていたのだが、「勉強するならC#がいいよ!(仕事で使うのは別だけど)」とか言われたので素直に従うことにする。

 で、Visual C#をダウンロードしてインストールしているところ。

2009-01-21

Skype de TRPG 支援ツール のちょっと困った問題 (2009年1月24日追記)

 ツールを実行しているPCで立ち上げているSkypeの発言を拾ってくれない。

 Skypeの仕様上仕方ないのかもしれない(調べてない)けど、これはちょっと困った問題かも。

 その人だけ自分でサイコロを振る、というのもいまいちな解決方法だし。

 考えられるのは

  1. 常にゲームマスターがツールを起動する
  2. 他の人がautoreply.config.jsonでuser指定してツールを起動しておく

 1は、ゲームマスターは自分でサイコロを振る事になるので、手加減出来るという利点がある。

 また2は、他の人も同じようにツールを起動すると人によってはサイコロが2回振られてしまうが、そこでuser指定しておく事によってサイコロを振れない人にだけ反応するようにしておけば全員を網羅出来る、という考え。詳しい人(ツールを導入出来る人)が2人必要になるのが難点。

 自動インストールしてくれるツールを作れば解決するんだろうけど、そこまでの技術は持ち合わせていないので……。

※ 2009年1月24追記

 Skypeの公式Blogに「2つのアカウントで同時ログイン - Skype 日本語ブログ」という記事があるのを発見した。これならややこしい事をしなくて済む。

 が、Vistaではこの手法は使えないらしい……。

 公式Blogにこういう記事が載るという事は、Skypeでは複数アカウントを持つ事を公式に認めている(黙認している?)という事なのだと思う。

Skype de TRPG 支援ツールを作った 下 〜実践編〜

 前の記事とこの記事の内容を楽に実践するための方法を別Blogの記事として書きましたので、お急ぎの方はそちらをご覧下さい。(別Blogに書いたのは、ファイルをダウンロードできるようにするためです)

 Skype de TRPG用のファイルを、まとめてダウンロード出来るようにした - 日常のきれはし

----

 特定の言葉に反応してSkypeに発言する基本的な部分に関しては、「Skypeのチャットに自動応答するJavaScriptを簡単に作れるようにする - 今日覚えたこと」から拝借する事にする。上記にソースがあるので、「autoreply.js」というファイルをメモ帳なりテキストエディタなりを使って用意。

 次にどんな言葉に反応するかを記しておく「autoreply.config.json」を用意する。

 基本的に場面や発言者を問わず反応するようにするので、「chat」や「user」は省略する。

 サイコロを振ってもらうためのキーワードはずばり「サイコロ」

 ただし文章中に「サイコロ」という言葉が出てくる度に反応されては困るので、文頭に「サイコロ」もしくは「さいころ」と書かれた場合のみ反応する事にする。

 また、呼び出されるスクリプトは「dice.js」というファイル名にしておく。

autoreply.js

[
  {
    body: /^さいころ/,
    file: 'dice.js'
  },
  {
    body: /^サイコロ/,
    file: 'dice.js'
  }
]

 では実際にサイコロを振る部分。

 TRPGでは様々なサイコロを用いる。

 6面かもしれないし、10面かもしれないし、あるいは4面かもしれない。

 さらには6面ダイスを1つ振るのか2つ振るのか、という区別もある。

 そこで「サイコロ2d6+1d10」という形式で発言してもらう事にする。dの前がサイコロの数、dの後ろが何面体のサイコロを振るか、の指定。

 これで2d6の結果と1d6の結果、そしてその合計値が計算されれば言う事なしだ。

 さらに、面倒くさがりな人のために省略も出来るようにした。

 サイコロの数が省略された場合は1個、何面体かという指定が省略されたら自動的に6面体として扱う事にする。

 そしてdが大文字でも小文字でもOKにして、全角でも半角に変換してあげることにしよう。

dice.js

function(user, body){
  body = body.replace("さいころ","");  //トリガーとなる文字「さいころ」を削除
  body = body.replace("サイコロ","");  //トリガーとなる文字「サイコロ」を削除
  body = body.replace(/^\s/, "");  //空白を削除

//全角→半角変換
  var str = "";
  var han = "0123456789-+Dd";
  var zen = "0123456789−+Dd";

  for (i = 0; i < body.length; i++) {
    c = body.charAt(i);
    n = zen.indexOf(c,0);
    if (n >= 0) c = han.charAt(n);
    str += c;
  }
  body = str;

  body = body.toLowerCase();  //大文字→小文字変換
  
//サイコロを振る
  temp = body.split("+");
  var kekka = "";
  var total = 0;
  for (i = 0; i < temp.length; i++) {
    var kekkaTemp = 0;

    dice = temp[i].split("d");
    if (dice[0] == "") dice[0] = 1;  //省略された場合はダイス1つ
    for (j = 0; j < dice[0]; j++) {
      if (dice[1] == "") dice[1] = 6;  //省略された場合は6面ダイス
      var rand = Math.floor( Math.random() * dice[1] ) + 1;
      kekkaTemp = kekkaTemp + rand;
      total = total + rand;  //合計の算出
    }
    kekka = kekka + ' と ' + kekkaTemp;
  }

//結果出力
  if (total != 0) {
    kekka = kekka.replace(/^\sと\s/, "");
    return '■' + user + 'さん> コロコロ…… ' + kekka + ' で 合計 ' + total + ' です';
  } else {
    return;
  }
}

 こんな感じ。

 JavaScriptをがりがり書ける人ではないので、ネット上の情報をあれこれ探してコピペしつつ作成した。

 もっと良い方法などあれば御指南いただけるとありがたく。

 作ったファイルはSkype4COMと同じフォルダに置いておく。

 スクリプトの実行は、コマンドプロンプトでツール一式のあるフォルダに移動してから

cscript autoreply.js

と入力してEnter。*1

 初回のみ「Skypeとwscript.exeとの連携を許可するかどうか」の確認メッセージが表示されるので、許可しておく事。

 これで

サイコロ2d6+d8

と発言すれば、

■(Skypeのニックネーム)さん> コロコロ…… 8 と 8 で 合計 16 です

と発言が返ってくる。

 これでSkypeを用いたTRPGセッションが少しは楽になるといいなぁ。

〜〜

 次はTOKYO N◎VA等のトランプを使うセッションにも対応させたい、という気はあるのだけれど、山札がなくなった後の処理をどうすればいいか分からないので保留。

〜〜

 勢いに任せて作って記事も書いたのだが、そういえばid:nacookanさんの許可とか何も取ってなかった。怒られたら削除するのであしからず。

Skype de TRPG 支援ツールを作った 中 〜準備篇〜

 この記事と次の記事の内容を楽に実践するための方法を別Blogの記事として書きましたので、お急ぎの方はそちらをご覧下さい。(別Blogに書いたのは、ファイルをダウンロードできるようにするためです)

 Skype de TRPG用のファイルを、まとめてダウンロード出来るようにした - 日常のきれはし

----

 まずは下準備。

 「Skype4COMでJavaScriptからSkypeを操作 - 今日覚えたこと」で書かれている通り、Skype4COMを入手する。

 Skype公式の開発者向けページからダウンロードする。(画面中央「COM wrapper」にある「Build and resources」からダウロードできる)

 次にこれを適当な場所に解凍。

 今これを書いている時点で最新の「Skype4COM, release 1.0.31.0」には下記3ファイルが含まれていた。

  • Skype4COM.chm
  • Skype4COM.dll
  • Skype4COM.msm

 このdllをレジストリに登録する必要があるので、コマンドプロンプトからそのフォルダに移動。

 そして

regsvr32 Skype4COM.dll

と入力してEnter。

 3秒ほど待つと「成功しました」とダイアログが表示されるはずなので、これで準備OKである。


 Skype de TRPG 支援ツールを作った 下 〜実践編〜 に続く

Skype de TRPG 支援ツールを作った 上 〜思い出話篇〜

 昨年末、久しぶりに元地元(ややこしい。主に中学時代の友人たち+そのまた友人たち)関連の友人たちと会う機会があった。

 いろいろ話をしている中で、ICQ → MSNメッセンジャー(現Windows Live Messenger)と移り変わってきたツールが、現在はSkypeになっている事が判明。何人かをコンタクトリストに加えた。

 そこでふと思ったのが、昔この友人たちとチャットでTRPGをした事があったなぁ、という事。

 「またやりたいね」なんて話も出た時に、ふとさらに昔の事を思い出した。

〜〜〜

 1990年代前半、インターネットの気配がようやく近くまでやってきた頃、私は父のアカウントを借りてPC-VANというパソコン通信サービス(現BIGLOBE)に出入りしていた。

 その中にあった「ゲーマーズクラブ (GMC)」というSIG(フォーラム)では、チャット(PC-VANではOLT(オンライントーク)と呼ばれていた)を使ったTRPGのセッションも頻繁に開催されていて、私も何度となく参加したし、参加しないにしても見学させてもらったりしていた。(イメージとしては今のIRCに近いと思う)

 当時パソコン通信をするのによく使われていたソフトは「秀Term」というもので、「マクロ」を導入する事で機能拡張出来たのだが当時の私はただただ使うだけ。せいぜいログを保存するくらいの機能しか使いこなしては居なかっただろう。

 しかし参加者の中には当然レベルの高い人がいて、自作のマクロを作る人もいた。

 よく見たのが、OLTに新しい参加者が来たら自動で挨拶をする、というもの。

 新しく参加者が来るとそれを知らせる定型メッセージが表示されるので、それを利用して「こんにちは!>○○さん」というメッセージを自動投稿する、というものだ。何人かがそのマクロを導入していると、一瞬にしてわさわさっと挨拶文が投稿されたりして、見ていて楽しかったのを覚えている。

 そして今でも覚えているのが、サイコロを振るマクロ。

 「サイコロ」と発言すると6面ダイス1つ、「コロコロ」と発言すると6面ダイス2つを振るというものだったと思う。

 これがあるから手元でサイコロを振る手間が省けるし、ズルもできないので重宝していたのだ。(ゲームマスターが手加減出来なくなる、という問題(?)もあったが)

〜〜〜

 今年に入ってからふと下記記事を目にとめ、上記のような昔話を思い出した。

Skype4COMでJavaScriptからSkypeを操作 - 今日覚えたこと

Skypeのチャットに自動応答するJavaScriptを簡単に作れるようにする - 今日覚えたこと

 つまりは、JavaScriptを使ってあの「自動応答ダイス」が作れるのでは?

 ということで、やってみることにした。


 Skype de TRPG 支援ツールを作った 中 〜準備編〜 に続く

*1:終了させる場合はCtrl+C