Fessのサムネイル生成スクリプトのリファクタリング

Fessのサムネイル生成スクリプト(generate-thumbnail)をリファクタリングしました。主な変更点は以下の通りです。

ImageMagick v7対応

ImageMagick v7ではconvertコマンドがmagickコマンドに変わりました。今回の修正で、v7のmagickコマンドを優先的に使用し、存在しない場合はv6のconvertコマンドにフォールバックするようにしました。

get_imagemagick_cmd() {
  if command -v magick >/dev/null 2>&1; then
    echo "magick"
  elif command -v convert >/dev/null 2>&1; then
    echo "convert"
  else
    echo ""
  fi
}

SVGサムネイル生成

SVGファイルのサムネイル生成に対応しました。rsvg-convertコマンドを使用してSVGをPNGに変換します。

elif [[ x"${cmd_type}" = "xsvg" ]] ; then
  check_command rsvg-convert
  target_file=$(echo "$url" | sed -e "s#^file:/*#/#g")
  rsvg-convert -w 100 -h 100 --keep-aspect-ratio "${target_file}" -o "${output_file}"

MIMEタイプによるフォーマット検出

画像ファイルのサムネイル生成時にMIMEタイプを渡せるようにしました。ImageMagickはファイル拡張子からフォーマットを判定することがありますが、一時ファイルには適切な拡張子がない場合があります。MIMEタイプからフォーマットヒントを生成してImageMagickに渡すことで、より確実にフォーマットを識別できるようになりました。

format_hint=""
case "${mimetype}" in
  "image/gif")  format_hint="gif:" ;;
  "image/tiff") format_hint="tiff:" ;;
  "image/png")  format_hint="png:" ;;
  "image/jpeg") format_hint="jpeg:" ;;
  "image/bmp"|"image/x-windows-bmp"|"image/x-ms-bmp") format_hint="bmp:" ;;
  "image/vnd.adobe.photoshop"|"image/photoshop"|"application/x-photoshop"|"application/photoshop") format_hint="psd:" ;;
esac
${im_cmd} -thumbnail ${image_size} "${format_hint}${target_file}" "${output_file}"

Java側でも、MIMEタイプに基づいて適切な拡張子を持つ一時ファイルを作成するようにしました。

protected String getExtensionFromMimeType(final String mimeType) {
    if (mimeType == null) {
        return "";
    }
    return switch (mimeType) {
    case "image/gif" -> ".gif";
    case "image/tiff" -> ".tiff";
    case "image/svg+xml" -> ".svg";
    case "image/jpeg" -> ".jpg";
    case "image/png" -> ".png";
    case "image/bmp", "image/x-windows-bmp", "image/x-ms-bmp" -> ".bmp";
    case "image/vnd.adobe.photoshop", "image/photoshop", "application/x-photoshop", "application/photoshop" -> ".psd";
    default -> "";
    };
}

macOS互換性

rootユーザーのHOMEディレクトリチェックにmacOS対応を追加しました。Linuxでは/rootですが、macOSでは/var/rootになるため、両方をチェックするようにしています。

if [[ x"$HOME" = "x/root" ]] || [[ x"$HOME" = "x/var/root" ]] ; then
  HOME=/var/lib/fess
fi

これらの変更はFess 15.4.0に含まれる予定です。

投稿記事作成の効率化

最近は、Claude Codeを使うことで、今まで対応できなかったこともできるようになったりと、生産性の高まりを感じに今日この頃です。この前のClaude Code on Webも$990くらい使い、Fess周辺の開発がいろいろと前進したと思うのですが、いろいろとあって、その情報発信が追いついていない…。

そんな感じで、どうするかを考え始めて、開発関連の情報発信も効率化すれば良いと思い始める。たとえば、PRの情報とかを渡したら、まとめ記事のドラフトができる、くらいまでやってくれれば、コピペと簡単なチェックで公開できるのかなと。

そんなわけで、その仕組み自体もClaude Codeで作ったので、今後は効率が良い情報発信ができるようになるかもしれない。

Smart Stock Notes

Smart Stock Notesを始めました。

Smart Stock Notesは、生成AIが企業情報や様々な指標を元に企業情報を分析して、そのレポートを公開していくサイトです。個人投資家などが、この辺の情報を調べて理解しようとすると、かなりの労力が必要になりますし、そもそも企業を見つけるのも大変です。Smart Stock Notesは、プッシュ型の発信にはなりますが、上場会社の各種情報を整理して、公開していきます。まぁ、個人的にこのような情報が欲しいから、というのがありますが…。

上記のように、企業情報を効率よく欲しいという目的もありますが、もう一つの目的としては、LLMが同じ問題に対して、どのような結果を出力するのかを比較したい、というのもあります。LLMのベンチマーク比較で、点数を比較する情報だけだと、実際どうなのかがよくわからないので、違いを体感するというのも、重要かなと。

Smart Stock Notes上では、各LLMをAIアシスタント(Ginny, Noa, Charlotteの3人?)と呼んで、3つの生成AIを導入しています。その3つは有償のAPIを利用していますが、ollamaとかで、ローカルで実行するLLMのものも追加はしたいところです。

あとは、そのうち、サイトのデザインとかは見直したいなとは考えています。現状は、サイトのデザインにかける時間がなかったので、WordPressにあるものを適当に使っているだけなので…。そのほかにも、プロンプトもちょっと複雑になっている気がするので、プロンプトのチューニングも必要だったり。

そんな感じで、少しずつ進化させながら、運用していこうと思いますので、よろしくお願いします。