Works : VR 機材を使わずにフェイストラッキングを行うアプリケーションを作る

動機

私は Linux 使いです. Windows もありますが Linux も使います.

VTuber を初めとした V の者の活動を支援するツールは Windows にはいっぱいあります.

あとは解ると思いますが Linux にはほぼありません. (あるかもしれませんが, ちょっと探したぐらいでは見つからないぐらいにはありません)

これでは Linux をメインに活動する際に支障が出ます.

なので自分で作ることにしました.

続きを読む

プログラミング: fontconfig を C言語で使う

概要

fontconfig とは linux をはじめとするシステムに於いてインストールされているフォントを管理する機能である.

fontconfig を用いることによってフォントを必要とするプログラムに於いて, フォントのパス指定が必要なくなる. また, スタイルや文字セットなどの指定から最適なフォントを選択することもできる.

続きを読む

tarでまとめるのとそのままではどっちが効率がいい?

タイトルそのままの実験です.

きっかけはBMSの読み込みが長いこと, しかし, CS版の弐寺ではかなり高速. この違いは何なのか考えた時, BMSはファイルがバラバラだからではないかと考察したのでそれを検証する次第です.

大体全体で60MBぐらいあるBMS曲(厭世アリス - LeaF)をディレクトリにそのまま展開したものとtarアーカイブしたもので用意しpython3で処理してみた.

コード

標準ライブラリで読み出し, ファイルとしてダンプする.

ディレクトリ版 (naive.py)
import os
import time

out = open("naive.dump", "wb")
start = time.time()

base = "[clover]LeaF_AliceinMisanthrope"
for e in os.listdir(base):
    buf = open(base + "/" + e, 'rb')
    out.write(buf.read())
    buf.close()

span = time.time() - start
print(span)
tar版 (tar.py)
import tarfile
import time

out = open("tar.dump", "wb")
start = time.time()

handle = tarfile.TarFile.open("ensei_tar.tar")

for e in handle.getmembers():
    if (e.isfile()):
        buf = handle.extractfile(e)
        out.write(buf.read())
        buf.close()

span = time.time() - start
print(span)

結果

単位はいずれも秒

% python3 naive.py 
0.22434473037719727
% python3 tar.py
0.4075179100036621

tarのほうが遅い
しかしこれぐらいの差だとあんまり実感がわかないぐらいの差しかない. 読み込み速度の違いには, どうやらこれ以外の要因も関わっているようだ. (デコードとか)

主観だが, ファイル読み込みはオーバーヘッドがそれなりにあると考えていて, 個別ファイルと1ファイルにまとまっているのでは後者のほうが速度的に有利だと考えていた. しかしこれはその予想を裏切ることになっている.

不思議なこと

かなり計測にばらつきが出る. コードを書いて一番初めに実行した時にはかなり時間がかかる(10秒ぐらい). 2回め以降は上記の結果になる. なぜだかわからない.

以上

Works : MarkdownViewerQt - Markdownビューワー(Linux + Qt)

qlmarkdownみたいな手軽さでMarkdownを見られたら良いなと思ってqtで作成したものです.
今回は紹介だけで, ビルド可能なパッケージはまだ準備出来ていません.

追記:準備ができました.

続きを読む

LuaSDL2: ビルドできない件

LuaSDL2とはLuaでSDL2を利用するためのライブラリであるが, gitからcloneしてビルドしようとするとうまく行かない.

問題

/home/hoge/tmp/luasdl2/src/window.c: In function ‘hitTestCallback’:
/home/hoge/tmp/luasdl2/src/window.c:915:2: warning: implicit declaration of function ‘lua_geti’ [-Wimplicit-function-declaration]
  lua_geti(cd->L, LUA_REGISTRYINDEX, cd->ref);
  ^
/home/hoge/tmp/luasdl2/src/window.c: In function ‘l_window_setHitTest’:
/home/hoge/tmp/luasdl2/src/window.c:950:10: error: void value not ignored as it ought to be
  if ((ut = lua_getuservalue(L, 1)) == LUA_TUSERDATA) {
          ^
/home/hoge/tmp/luasdl2/src/window.c:947:6: warning: variable ‘ut’ set but not used [-Wunused-but-set-variable]
  int ut;
      ^
CMakeFiles/SDL.dir/build.make:590: ターゲット 'CMakeFiles/SDL.dir/src/window.c.o' のレシピで失敗しました
make[2]: *** [CMakeFiles/SDL.dir/src/window.c.o] エラー 1
CMakeFiles/Makefile2:67: ターゲット 'CMakeFiles/SDL.dir/all' のレシピで失敗しました

warningは良いとして, errorについてみてみる.
lua_getuservalue関数はvoidらしい.
こんな単純なミスを犯すだろうか?
Lua5.2のリファレンスを見てみてもこの関数はvoidを返す.
ではLua5.3では?
intを返すのだ.

解決策

  • liblua-5.3-dev (Ubuntuの場合)をインストール
  • cmake .. -DWITH_LUAVER=53 でcmakeする

これで出来ました.
ちなみにgithubのissueに上がっています. 調べが甘かったです. apiリファレンスやヘッダファイルを調べるはめになりました.

cmakeのデフォルトがLua5.2らしいけど, デフォルトでビルドすると失敗するのは解決した今なら笑える冗談です. (バグだというのは重々承知の上で)

以上.