[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
もう1か月半ほど前の話になるが、ゆとシートに他のツールからのキャラクターシート移行の機能が追加されている(公式の紹介記事:ゆとシートⅡ:コンバート機能の追加)。昨今、見易さを重視したオンセツールが流行っていることを考えると、ゆとシートの見易さは大変にありがたいのはわかると思う。しかし、キャラクター保管所やキャラクターシート倉庫の既存キャラクターシートの資産も活かしていきたい。そう考えるとこのコンバート機能はありがたい。
ゆとシートのコンバート機能には2種類がある。
既存キャラクターシート管理サービスは json 形式で情報を出力する機能を備えている。その機能を用いて他のキャラクターシート管理サービスから情報を取得し、ゆとシートと同じ見た目で表示する、という機能がある。GM をやるがキャラクターシートの提出方法が PL によってまちまちの場合にこれを使ってゆとシートにそろえてしまうことができる。
ばらばらのキャラクターシートを見易い見た目にそろえることができるのが強い利点となる。
先述のように既存キャラクターシート管理サービスは json 形式で情報を出力できるので、その情報を用いてそのままキャラクターシートを複製してしまう機能。
他のサービスからの完全移行やバックアップに利用可能。便利。
キャラクター保管所が先日大規模にダウンした事象があった。キャラクター保管所は個人が運営しているサービスであり、データが吹き飛ぶ可能性などは当然ながらあるし、その場合の保証や SLA 等もない(無論、管理者はかなりのリソースを割いてデータを守ってくれているが)。だからゆとシートがいいのか、というとそうではない。ゆとらいず工房設置のゆとシートもまた個人が運営しているものに過ぎずデータが吹き飛ぶ可能性は十分にある。
しかし、ゆとシートは他のキャラクターシート管理ツールとは異なりオープンソースであり個人での設置が容易に可能である。これにより、手元にキャラクターシートをバックアップできる。また、サーバ上にキャラクター情報が出力されているため、これをバックアップしておけばもしも設置したゆとシートが壊れたとしてもバックアップから容易に回復が可能である。また、移転も同様の理由で容易。データを移動すればよいのだ。ログインできないが閲覧はできる、というゆとシートを用意すればバックアップサーバとして閲覧のみのサービスの提供も可能である。
なお、データそのものの複製機能はゆとシート間でも可能であるため、エンドユーザの手によるサーバ間でのデータ複製も容易である。
Fantia を通して支援が可能である。
継続的に支援するのはちょっと、という方もいらっしゃるだろうがその場合はAmazo の欲しいものリストから何かを贈ると良い。
Discord は現時点では発言が削除されると後からそれを追うことができなくなる。何があったかというと、参加している Discord サーバで非常に攻撃的な発言を繰り返す人がおり、色々なことが合った末に BAN されていた。これは自然な流れだと思うが管理チームが対処に随分と苦心されていた。なんでだ、というのを追跡してみたところその人は発言をすぐに削除するようだ。『こういうことをしましたよね?』と後で指摘することが簡単ではないし、管理チームもこれだと何があったのか後から確認できない。これでは対処は困難だろう。サーバの風紀を乱す人を独断と偏見で蹴りだしても、そのサーバの公共性が極端に高くない限りにおいては構わないと個人的には思う。ただ、その管理者はそういうことを嫌う人の集まりだった。
傍から見ていてあまりに辛い話だったので「削除される前に発言があったら即座にどこかに溜めればいいんでねぇの?」と考えた。しかし、どこに溜めるべきかは難しい問題だ。
一番簡単な方法。生のテキストファイルにログを出力する。後で確認する際に自分でフィルタリングとかしないといけないので読むは大変。
多分読みやすさ、運用しやすさのバランスが取れている方法。後で確認する際は GSS の機能でフィルタリングできる。
別の Discord サーバに元々の Discord サーバの複製をつくる感じに出力する。運用は最高に楽。しかし、Discord サーバはチャネルを作れる数が限られているので運用に工夫が必要。さらに読みやすいのかは疑問。
実際に運用事例がある運用方法。IRC サーバにチャット履歴の複製を流し込む。IRC サーバの運用が楽にできる事情があればこちらの方が楽かも。ただ、これも読みやすいかは疑問。
読みやすいかは疑問。運用を他人に丸投げできるのは便利。
えっ、誰がそれ運用するの??? とはいえ、AWS とかのマネージドな DB を使うという手もある。ただ、さらに viewer を用意しないと使い物にならない。
えっ?それ運用するの??? また、閲覧できるの?? 誰が閲覧するの??? 分かる人が使えば強い。
前にも書いたが、私はキリスト教徒である。毎週日曜日に教会に集まって礼拝をおこなうわけだが、これはまさに「三密」というやつである。都知事は怒るだろうし、焼き討ちにも遭いかねないのだ。そんなこんなで、4月から私の所属教会も「説教原稿をメール送信」とか「礼拝をオンライン配信」とかといった施策を始めた。また、他の教会でも同様の事をしている所は多い。
この辺、今回の COVID19 騒ぎをへてベストプラクティスが形成されたりするのかなぁ。教派・教団を越えてなんかする、というのを嫌うグループも少なくない。しかし、ベストプラクティスのシェアについては教派・教団関係ないだろうし、どんどんした方がいいんだろうなぁとも思う。
2か月ほど前にリモートワークをはじめた旨を書いたがまだ続けている。会社として「在宅勤務 OK」だったのが「在宅勤務推奨」になり、さらに「在宅勤務を前提とする」にスタンスが変わったのだ。先の記事にも書いたが私は花粉症だし発汗で体調が一気に悪くなるしで在宅勤務は歓迎のスタンスである。
私は家族(ひつじと子供たち)と同居しているのでずっと在宅でも話し相手がいる。周囲には普段話し相手がいないメンバーもいる。そんなこんなで連携を密にするために通話アプリを用事もなく起動しぱなっしにしておいて常に通話を継続する、という体制をとっている。いわゆる「さぎょいぷ」(最近は Discord でやる場合にさぎょすこ、と呼ぶらしい)めいたことをしている。ちょっとした相談がすぐにできるので強い。アプリによってはチャットも併用できるのでさらに強い。
ただ、これが便利だすごいぞって言えるのは家族と完全に分離した部屋でリモートワーク出来る人の特権であって、家族が仕事部屋に入ってくる可能性が高い人はこれも難しいと聞く。しかし、ダイバーシティがなんだかんだというのが流行っている現状においてはそれぞれの立場でそれぞれが高いパフォーマンスが出せるやり方を見つける、というのは丁度良い課題になってくれるのかもしれない。
私の趣味の TRPG もオンラインでやるのが一般的になって久しい。どこでも簡単にやれる、とは言い難いが仕事や学校の授業がオンラインなのが普通、という時代は作ろうと思えば作れそうに思える。
HTML::Parser について使い方がなかなか分からなかったので書いておく。
parser を提議させ、その parser の parse 関数を実行すると parse 関数に渡した html を解析してくれる。
一気に解析して木を作ってくれるわけではない。HTML を上から順番に見ていき、開始タグ、終了タグ、なんでもない文章、コメントといったものを1つ1つ見つけるごとに関数を実行する、という挙動をする。そのため、parser を定義するときは「〇〇を見つけたらこの関数を実行してね」という話をする。
上述の 開始タグ、終了タグ、なんでもない文章、コメントといったもの
を event と呼んでいる(一覧)。この各イベントに対して見つかった際に実行する関数(handler)を定義することで parser を定義するのである。後述の例は イベント名_h というのがやたら出てくるが「〇〇というイベントに対応する handler」を定義しているのである。例えば開始タグのイベントに対しては when_open_tag_found という関数を handler として割り当てている([\&when_open_tag_found, "self, tagname, attr"])。
色々渡せる(一覧)。後述の例では start には tag 名称とその要素に当てられた属性を handler に渡している([\&when_open_tag_found, "self, tagname, attr"])
use HTML::Parser ();
use LWP::UserAgent;
print "start\n";
my $browser = LWP::UserAgent->new;
my $response = $browser->get("http://shunshun94.example.com/index.html");
my $parser = HTML::Parser->new(
api_version => 3,
start_h => [\&when_open_tag_found, "self, tagname, attr"],
end_h => [\&when_close_tag_found, "self, tagname"],
text_h => [\&when_text_found, "self, text"],
comment_h => [\&when_comment_found, "self, text"]
);
$parser->parse($response->content);
print "finish!\n";
sub when_open_tag_found {
my ($self, $tagname, $attr) = @_;
print "OPEN $tagname\n";
}
sub when_close_tag_found {
my ($self, $tagname) = @_;
print "CLOSE $tagname\n";
}
sub when_text_found {
my ($self, $text) = @_;
print "TEXT $text\n";
}
sub when_comment_found {
my ($self, $text) = @_;
print "COMMENT $text";
}