トップ 最新 追記

Days of Speed

過ぎゆく日々を書こう。忘れっぽい未来の自分のために


2021-10-02

_ tDiaryのDockerとsqueeze.rbを使ってコンテンツをHTMLにする

カレントディレクトリに設定ファイルのtdiary.confと変換スクリプトのsqueeze.rb、tDiaryのデータをdataというディレクトリに置いて、dockerを実行すればhtmlディレクトリにhtmlファイルが出力されます。

 $ wget https://raw.githubusercontent.com/tdiary/tdiary-contrib/master/plugin/squeeze.rb
 $ docker pull tdiary/tdiary:latest
 $ docker run --rm -v "$(pwd)/data/:/usr/src/app/data" -v "$(pwd)/tdiary.conf:/tdiary.conf" \
 -v "$(pwd)/squeeze.rb:/squeeze.rb" -v "$(pwd)/html:/html" --user $(id -u):$(id -g) \
 tdiary/tdiary:latest /usr/local/bin/ruby /squeeze.rb -p /usr/src/app/lib/ -c /usr/src/app/ \
 -s -x .html /html
Tags: tdiary

2021-10-07

_ Bluditはコンテンツのメタデータをjsonで管理している

フラットファイルCMSのBluditのコンテンツは、bl-contentフォルダ以下にあります。ページは、bl-content/pages/の下に(フレンドリーURL)/index.txtという形で保存されています。

 bludit
 ├ bl-content
 │ ├ databases (コンテンツのメタデータ。phpという拡張子ですがjsonで保存)
 │ │ ├ plugins (プラグインそれぞれのデータ)
 │ │ ├ categories.php
 │ │ ├ pages.php
 │ │ ├ security.php
 │ │ ├ site.php
 │ │ ├ syslog.php
 │ │ ├ tags.php
 │ │ └ users.php
 │ ├ pages (コンテンツの実体)
 │ │ └ フレンドリーURL
 │ │   └ index.txt
 │ ├ tmp
 │ ├ uploads
 │ └ workspaces
  (以下略)

自分の記憶では、ごく初期は、ほかの静的サイトジェネレーターのようにコンテンツのテキストの中にメタデータが埋め込まれていたと記憶してましたが、今はコンテンツとメタデータを分離されていてbl-content/databases/以下にjsonで保存、管理しています。

データを変換する場合、どうやってメタデータを生成すればいいのか気になったので調べてみました。

データを解析してみる

メタデータは、jsonですがphpの拡張子が付いています。pages.phpを見るとphpとして実行されないように1行目にこういう行があります。

 <?php defined('BLUDIT') or die('Bludit CMS.'); ?>

そしてjsonは圧縮されているのでかなり読みづらくなってます。とりあえず読むにはjqを使って整形するのが良さそうです。こんな感じで見てみました。lvはDebianの日本語環境をインストールすると入るページャーです。

 $ sed 1d pages.php | jq . | lv

そうするとこんなふうになりました。

 {
   "gallery": {
     "title": "gallery",
     "description": "",
     "username": "admin",
     "tags": [],
     "type": "static",
     "date": "2021-10-06 19:29:02",
     "dateModified": "2021-10-06 19:30:55",
     "position": 8,
     "coverImage": "",
     "category": "",
     "md5file": "d41d8cd98f00b204e9800998ecf8427e",
     "uuid": "a6957a9e0ae50865c6ef293dbf1b4974",
     "allowComments": true,
     "template": "",
     "noindex": false,
     "nofollow": false,
     "noarchive": false,
     "custom": [
       false
     ]
   },
 (以下略)

これはわかりやすいですね。ちょっと気になるのがmd5fileとuuidフィールドですが、bl-kernel/pages.class.phpを見るとこなっていました

 // Checksum MD5
            $row['md5file'] = md5_file(PATH_PAGES.$key.DS.FILENAME);

md5はindex.txtのmd5を求めていますね。

 function generateUUID() {
         return md5( uniqid().time() );
 }

uuidは、uuidと時間からmd5を求めたものをuuidにしているいうことですね。ワンライナーで試すとこんな感じ。

 $ php -r 'echo md5(uniqid().time())."\n";'

そしてpages.class.phpには頭にこういう部分がありまして…

       protected $dbFields = array(
               'title'=>'',
               'description'=>'',
               'username'=>'',
               'tags'=>array(),
               'type'=>'published', // published, static, draft, sticky, scheduled, autosave
               'date'=>'',
               'dateModified'=>'',
               'position'=>0,
               'coverImage'=>'',
               'category'=>'',
               'md5file'=>'',
               'uuid'=>'',
               'allowComments'=>true,
               'template'=>'',
               'noindex'=>false,
               'nofollow'=>false,
               'noarchive'=>false,
               'custom'=>array()
       );

これ見たら一発でわかるやーん!

まとめ

きれいにオチがついたところでBluditのメタデータ解析でした。これぐらいなら、シェルスクリプトでササッと書いて作れますね。

Tags: bludit

2021-10-08

_ DockerでMinetestサーバーが動いた

MinetestのDockerイメージがDocker hubにあると思い込んでいたけど、公式のDockerイメージはGitLabで公開していることにやっと気がついた。README.mdの一番下に書いてあるのは気がつかないよ…

confとdataディレクトリを作って、confにサーバーの設定のminetest.conf、dataに.minetestディレクトリ(ドットminetestです。minetestの前にドットがあります。)以下にgameやmodファイルを置きます。こんな感じです。

 current
 ├ conf
 │ └ minetest.conf
 ├ data
 │ └ .minetest
 │   ├ games
 │   ├ mods
 │   ├ textures
 │   └ worlds
 └ docker-compose.yml

Dockerの中でminetestサーバーは、minetestユーザー(gid:30000/uid:30000)で動いています。なので、data/.minetest/以下は書き込めるように所有者を変えておきます。

 $ sudo chown -R 30000:30000 data/.minetest/

docker-compose.ymlは、とりあえず最低限のものを用意しました。イメージについては最初、latestにしていましたがlatestでは現在のmodと互換性の問題が出たので、stable-5にしました。

 version: "3"

 services:
   minetest:
     container_name: minetest
     image: registry.gitlab.com/minetest/minetest/server:stable-5
     volumes:
       - "./data/:/var/lib/minetest/"
       - "./conf/:/etc/minetest/"
     ports:
       - "30000:30000/udp"

用意ができたら、docker-compose upを実行すればDockerでminetestサーバーが起動します。

やっとDockerでminetestサーバーが使えるようになったので、本格的に使うためのPostgreSQL連携を調べて外部に公開したいなー。そして、ゆくゆくはMinetest Mapserverも動かして世界を作っている様子を外に公開したいなー。

Tags: linux game

2021-10-09

_ DockerでMinetestとMinetest realtime mapserverを動かしてリアルタイムで様子を見よう

昨日、DockerでMinetestサーバーが動いたと書きましたが夜、寝る前にMinetestの世界をリアルタイムに描画してくれるMapserverのMinetest realtime mapserverのDockerを追加したら、あっさり動きました。

ということでdocker-compose.ymlを載せておきます。mapserver以下の行が追記した部分です。ボリュームでMinetestのworldを共有しているところがポイントですね。

 version: "3"

 services:
   minetest:
     container_name: minetest
     image: registry.gitlab.com/minetest/minetest/server:stable-5
     volumes:
       - "./data:/var/lib/minetest/"
       - "./conf:/etc/minetest/"
     ports:
       - "30000:30000/udp"
   mapserver:
     container_name: mapserver
     image: minetestmapserver/mapserver
     volumes:
       - "./data/.minetest/worlds/world:/minetest"
     working_dir: "/minetest"
     ports:
       - "8080:8080"

これを使ってdocker-compose upして、ブラウザで http://(Dockerが動いているPCのIP):8080/ にアクセスすればリアルタイムでマップが変わる様子がわかります。

これにmapserver-modを追加すればプレーヤーの位置やラグの表示もできるようになって普通に使えるようになります。

mapserver-modは、アーカイブをダウンロードして展開したら、data/.minetest/mods/以下に移動して、minetest.confに以下を追記すれば使えます。

 mapserver.enable_crafting = true

デフォルトはパッシブモードなので、アクティブモードにする場合はもう少し追記が必要になります。詳しくはドキュメントを参照してください。

標準のsqlite3がどこまでの人数に耐えられるのかわからないけど普通に使えるし、50人、100人という規模でもなく身内で遊ぶぐらいならこれで十分な気がしてきた。

Tags: linux game

2021-10-10

_ 「GS選挙調査センター」と名乗るところから携帯に電話があった

結論から書くと株式会社グリーン・シップという調査会社がやっているアンケートの電話。ランダムに組み合わせてヒットした電話番号に自動音声のアンケート依頼を流す。承諾するとvb2.jpの短縮URLのついたショートメールを送ってくるというアンケート手法でアンケートを取っている。アンケートの短縮URLには電話番号と紐付けるクエリーが付いている。

vb2.jpドメインの所有者は株式会社ソフトウェア開発研究所。ここも電話を利用したシステムを作っている会社らしい。このvb2は単純に短縮URLとアクセス解析を提供しているようで他の会社も利用している。

グリーン・シップのサイトを見ると、政治山という政治関連業界のニュースサイトをやっていて選挙業界マップという記事にリンクが貼ってあった。

ちょうど、「ツイッターで野党攻撃の匿名アカ…正体は「法人」だった | FRIDAYデジタル」という記事も出ていたけど、政治関連業界には、いろんなIT系会社が入り込んでいるんだな。


2021-10-12

_ minetest/mineclone2(5)で、わりと面白いSeed値が出たので貼っておきます

「研究」と称してminetestで遊んでいるワケですが、わりとアタリじゃないかと思うSeed値が出たので貼っておきます。

  • 条件
    • mineclone2またはmineclone5
    • マップジェネレーター: v7
  • Seed値
    • 9822058850383763019

このSeed値を使う条件ですが、ゲームはmineclone2またはmineclone5です。マップジェネレーターはv7を使います。minetest_gameやそれ以外のゲームやマップジェネレーターにv7以外を使うと、まったく違うワールドが作られるので注意してください。(遊べなくはないけど普通のワールドが生成されます。)

初期出現位置が、木の中や絶望するぐらい深い谷の中の場合は諦めて同じSeed値で作り直してください。少し歩くとジャングルの中に村が出てくるはず。

mineclon5-9822058850383763019

Tags: linux game

_ minetestのマップ画像を生成する

minetestには地図を生成するminetestmapperというツールがあります。上の画像をは、これを使って地図を生成しました。 minetestmapperはDebianのパッケージになっているのでaptでインストールできます。

 $ sudo apt install minetestmapper

使い方はこんな感じです。

 $ minetestmapper -i (ワールドのあるディレクトリ) -o (出力画像のファイル名)

minetest_gameでは、あらかじめノードの色の設定が入っているので、これだけで地図が生成できますが、mineclone2/5の場合はノードの色の設定が無いのでこちらこちらのcolors.txtをダウンロードして使います。

そして、いろんな場所を歩き回っているならエリアもそれなりに広く、デフォルトで構いませんが、今回のように初期出現位置の周りだけの場合はエリアが小さいので画像も小さく生成されます。その場合は、--zoomでズーム率も指定します。

 $ minetestmapper -i (ワールドのあるディレクトリ) --colors (色設定ファイル) --zoom (拡大倍率) -o (出力画像のファイル名)

リアルタイムマップサーバーを立てるほどではないけど地図が見たい場合に、このツールは使えるので、面白いSeed値が出たらminetestmapperで地図画像を生成してみると意外なものが発見できるかも。

Tags: linux game

2021-10-13

_ Minetestのgameを翻訳するためのtemplate.txt抜き出しと翻訳したファイルをリネームするワンラインスクリプト

Minetestは、ゲームエンジンでMinetest本体にはゲームは無いし遊べません。Minetestのゲームを遊ぶには、Luaで書かれたgameを動かして初めてゲームとして遊べます。勘違いした人が「Minetest」と言っているのは、gameである「minetest_game」のことです。

さて、Minetest本体は、ある程度翻訳されているので日本語メッセージが表示されていますが、Minetestのリファレンスであり付属のgameである「minetest_game」は、まったく翻訳されていないのでゲーム内メッセージやアイテムは全部英語のままです。

翻訳していない理由は、いろいろあると思いますが一番の理由は面倒だからだと思います。

gameの実装は、メイン以外は機能ごとにmodとして実装しています。gameのmodsフォルダー以下にはフォルダーに分かれた各機能のmodが細かくあります。翻訳するテキストは、その細かく分かれたフォルダーのさらに中にあるlocaleフォルダーのtemplate.txtを翻訳します。

GUIのファイルマネージャーで細かく分かれたフォルダーを行ったり来たりしてファイルを翻訳するのは面倒なので、template.txtを同じフォルダー構造で抜き出すスクリプトとOmegaTで翻訳して生成した訳文ファイルをフォルダーの命名規則に則ってファイルのリネームをするスクリプトを書きました。

modsフォルダー内のtemplate.txtを同じフォルダー構造でコピーする

~/.minetest/games/フォルダーの下に移動して、コピー先のtranslationフォルダーを作成する。そして、実行するとtransolationフォルダーにtemplate.txtだけを抜き出したフォルダーができる。

 $ w="translation"; for i in $(find ./ | grep template.txt);do mkdir -p "${w}/$(dirname ${i#\./})" && cp -a ${i} ${w}/${i#\./}; done

生成されたtranslation以下のフォルダーをOmegaTのsouceフォルダーに移動して翻訳する。

OmegaTで生成した訳文を命名規則に沿ってリネーム

OmegaTのtargetフォルダーに移動して実行する。template.txtをmodフォルダーの名前に従ってtemplate.txtをリネームするので、変更したら~/.minetest/games/以下のgameにフォルダごと上書きコピーすると日本語メッセージの確認ができる。

 $ for i in $(find . | grep template.txt); do mv "$i" "$(dirname $i)/$(echo $i | cut -d'/' -f4).ja.tr" ;done
Tags: linux game tips

2021-10-27

_ Bluditは5000件ほどの記事があっても全然問題無し

以前、静的サイトジェネレーターのHexoに移行しようとしましたが、大量の記事があるとビルドが異様に遅くて移行を断念しました。

今日、ふと「Bluditに大量の記事を食わせてみるとどうなるだろう?」と思ったのでダミー記事を生成するスクリプトを書いて、5000件ほど記事を生成して試してみました。ちなみに5000件は1日1件記事を書いて13年ほどの分量です。

結果、レスポンスが遅くなることなく普通に使えました。

Bluditを動かした環境は、phpの内蔵httpサーバー(php -S localhost:8000)なので高速化など無縁の環境です。これはなかなか優秀じゃないでしょうか。

Tags: bludit

2021-10-29

_ サーバー移転していました(2回目)

9月にさくらインターネットのVPSにnofuture.tvを移転しましたが、メモリ1GBでいろんなサービスを動かすには余裕がないことが判明。さらにスケールアップもできないこともわかりましたが、ちょうど11月には契約が切れるので解約しました。

それでいろいろ考えていましたが、結局、さくらのVPSのメモリ2GBプランにして移転しました。 9月の移転時点でDocker化して設定をgitで管理していたので、移転もgit cloneしてデータを書き戻すぐらいで、すぐに終わりました。

Tags: nofuture

2001|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|06|08|12|
2011|01|02|03|06|07|08|09|10|11|12|
2012|01|02|03|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|12|
2014|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|10|11|12|
2017|01|02|11|12|
2018|01|02|03|04|07|09|10|11|12|
2019|01|03|04|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|

クリエイティブ・コモンズ・ライセンス Jun NOGATA を著作者とするこの 作品クリエイティブ・コモンズの 表示 - 継 承 4.0 国際 ライセンスで提供されています。