2003-11-11 (Tue)
_ monitor.rb
Gennady Bystritskyさんという人から変更の提案をもらったのでコードの見直し。
あまりにもひどいので、テストを書いてリファクタリング。 rubyのtest/以下にテストがいろいろあるようだけど、lib直下のライブラリの テストはどこに置くべきなんだろう。
まあ、とりあえずコードだけcommitしとくか。
_ attribute parameter中のtypeof(void)
mcs(monoのC#コンパイラ)で、
[SatherNameAttribute("times!")]
[IterReturnTypeAttribute(typeof(void))]
public static __itertype_times __iter_times(int self)
{
return new __itertype_times(self);
}
のようなコードをコンパイルしようとすると、
int.cs(301) error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression
のようなエラーになるようだ。
mcsのソースの該当部(attribute.cs:137)を見ると、
if (e is Constant) {
result = ((Constant) e).GetValue ();
return true;
} else if (e is TypeOf) {
result = ((TypeOf) e).TypeArg;
return true;
} else if (e is ArrayCreation){
result = ((ArrayCreation) e).EncodeAsAttribute ();
if (result != null)
return true;
}
result = null;
Error_AttributeArgumentNotValid (loc);
return false;
となっている。
TypeOfはtypeof演算子に対応する抽象構文木のノードを表現するクラスなのでtypeof(void) も許されそうなものだが、実はtypeof(void)はTypeOfVoidという別のクラスで表現されていて、 しかもTypeOfとTypeOfVoidには継承関係がないらしい。
ECMAの"C# Language Specification"を見てもとくにtypeof(void)だけ除外するような 記述はなさそうだし(いつものように斜め読みだけど)、Visual C#では上記のようなコードは 通るようだ。 ってことはmcsのバグかな。 (cvs updateしたら直ってたりして…最近そういうことがよくあるのだ。)
2011-11-11 (Fri)
_ MIMEメッセージから添付ファイルを抽出する
Apple Mailから送られて来るMIMEメッセージをなぜかWanderlust(というかSEMI)が上手く処理してくれないので、 Rubyで添付ファイルを抽出することにした。 最近はmailというgemパッケージを使うのがいいのかな?
#!/home/shugo/local/bin/ruby-trunk
require "mail"
mail = Mail.read(ARGV[0])
mail.attachments.each do |att|
if File.exist?(att.filename)
STDOUT.print("Overwrite #{att.filename}? (y/n): ")
STDOUT.flush
unless /^y/i.match(STDIN.gets)
next
end
end
File.binwrite(att.filename, att.decoded)
puts("extracted #{att.filename}")
end
File.binwriteを使っているので、Ruby 1.9.3でないと動かない。
_ 次女の熱傷の経過
入院から8日が経過して、脚の方はかなり良くなっているが、腕の方があまりよくないらしい。 主治医の先生の話では、あと二週間で治らなければ手術になるとのこと。こんなに元気なのに。 他の場所から皮膚を移植することになるのでますます跡が広がるようだ…。
色々調べると湿潤療法という治療方法があるらしく、松江では市立病院の岡先生が熱傷の湿潤療法をされているらしい。 明日主治医の先生に湿潤療法について聞いてみようかなあ。
何か有用な情報があったら教えてください。
2025-11-11 (Tue)
_ Mastodonアカウントの引っ越し
Mastodonはruby.socialを使っていたが、tDiaryのサーバをKAGOYA CLOUD VPSに移したついでにsocial.shugo.netにインスタンスを立ててアカウントを引っ越した。 Mastodonにはアカウントの引っ越し機能があるので、とりあえずruby.socialではじめて必要なら後で引っ越せばいいやと思っていたのだが、投稿データの引き継ぎが行われないのは誤算だった(データのアーカイブは取得できる)。 これからMastodonのアカウントを作る人はちゃんと考えた方がいいですよ。
CPU 2コア、メモリ2GBのプランのVPSにtDiaryも同居という構成なので、Dockerは使わずに公式ドキュメントのInstalling from sourceの手順でインストールした。
不要なデータの削除やバックアップなどの定期実行処理については上記の手順には書れていなかったので、適当に検索して出てきたcleanup.shやかゆいところに手が届くインスタンス運用の初級テクニック集を参考に、以下のスクリプトをcronで動かすことにした。
cleanup.sh:
#!/bin/bash
export PATH=/home/mastodon/.rbenv/shims:/home/mastodon/.rbenv/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/l
ocal/bin
set -eu
CACHE_RETENTION_DAYS=7
echo "=> Cleanup"
cd /home/mastodon/live
export RAILS_ENV=production
echo "=> Retention days set to ${CACHE_RETENTION_DAYS}"
echo "==> media cache ..."
./bin/tootctl media remove --days=${CACHE_RETENTION_DAYS}
echo "==> orphaned media ..."
./bin/tootctl media remove-orphans
echo "==> preview cards ..."
./bin/tootctl preview-cards remove --days=${CACHE_RETENTION_DAYS}
echo "==> prune profiles ..."
./bin/tootctl media remove --prune-profiles --days=${CACHE_RETENTION_DAYS}
echo "==> remove headers ..."
./bin/tootctl media remove --remove-headers --days=${CACHE_RETENTION_DAYS}
echo "==> clear cache ..."
./bin/tootctl cache clear
echo "==> remove unreferenced statuses ..."
./bin/tootctl statuses remove --days=${CACHE_RETENTION_DAYS}
echo "==> prune accounts ..."
./bin/tootctl accounts prune
backup.sh:
#!/bin/bash
set -euo pipefail
# Configurable variables
INSTANCE_DIR="/home/mastodon/live"
SYSTEM_DIR="/home/mastodon/live/public/system"
BACKUP_DIR="/home/mastodon/backup"
BACKUP_LIFETIME_DAYS=7
DATE_FORMAT="%Y%m%d"
DB_USER="mastodon"
DB_NAME="mastodon_production"
RCLONE_DB_DEST="r2:mastodon-db"
RCLONE_MEDIA_DEST="r2:mastodon-media"
# Error handling
trap 'echo "An error occurred. Exiting." && exit 1' ERR
backup_date="$(date +$DATE_FORMAT)"
# Database backup
echo -n "Backup DB... "
DB_BACKUP_FILE="$BACKUP_DIR/db_$backup_date.sql.gz"
pg_dump -Fc -U $DB_USER $DB_NAME | gzip -c >"$DB_BACKUP_FILE"
find "$BACKUP_DIR" -mtime +$BACKUP_LIFETIME_DAYS -name "db_*.gz" -exec rm -f {} \;
echo "Success!"
# Sync backup
echo -n "Backup to R2... "
rclone copy "$BACKUP_DIR" $RCLONE_DB_DEST
rclone copy --exclude="/cache/**" "$SYSTEM_DIR" $RCLONE_MEDIA_DEST
echo "Success!"
crontab -e:
35 3 * * * /home/mastodon/cleanup.sh > /dev/null
50 3 * * * /home/mastodon/backup.sh > /dev/null
11/18追記
cleanup.shのtootctl {media,preview-cards,statuses} removeは[管理] > [サーバ設定] > [コンテンツの保持] > [メディアキャッシュの保持期間]または[リモートコンテンツの保存期間]で設定しておけばSidekiqの定期実行ジョブで削除されそうなのと、他は消さなくてもよさそうなので、cleanup.shは実行しないように変更した。
_ O-Show [湿潤療法という言葉は『傷はぜったい消毒するな 生態系としての皮膚の科学』という本で知りましたが、 それを読んだ限りで..]
_ shugo [ありがとうございます。 入院先の病院では実施されてない気がしますが、とりあえず相談してみます。]