RedmineにLightbox2プラグインをインストール。

それなりに読まれていると自負している『ライザのアトリエ3』の攻略記事「有料DLC:ロスカ島」の文献探しの記事にも使われているLightbox2プラグインのインストール方法です。

メールアドレスの登録が必要なものの無料で利用できます。

  • 画像を拡大表示できるライトボックス機能。
  • スライドショー形式で画像を順に閲覧可能。

の2つが強力なため、Remdineで画像を多用する際にも大いに役立ちます。

動作環境

  • Ubuntu 24.04
  • Apache 2.4
  • Ruby 3.2

手順

Redmine Xでのパッケージ取得

公式サイトよりメールアドレスを登録します。

登録後、送られてくるメール内に記載されているURLからパッケージを取得。

任意の方法でサーバ内にアップロードします。

パッケージの展開

  • アップロードしたファイルがあるディレクトリに移動
cd /hoge && pwd
  • パッケージの所有者変更
sudo chown www-data:www-data redmine_x_lightbox2.zip

Redmineの実行ユーザーに合わせます。

パッケージの展開と配置

  • パッケージ配置
sudo -u www-data unzip redmine_x_lightbox2.zip -d /path/to/redmine/plugins

自分のRedmine環境に合わせます。

  • パッケージ配置確認
ls -ld /path/to/redmine/plugins/redmine_x_lightbox2

ディレクトリがあることを確認します。

プラグインインストール

  • Redmineルートディレクトリに移動
cd /path/to/redmine && pwd

自分の環境に合わせます。

  • bundle install
sudo -u www-data bundle install
  • DBマイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • Apache再起動
sudo systemctl restart apache2.service && echo $?

返値が0であることを確認します。

  • Apache再起動後のステータス確認
systemctl status apache2.service

active(running)を確認します。

動作確認

  1. 画像を添付 任意のチケットまたはWikiに画像を添付します。
  2. 画像をクリック 添付された画像をクリックし、ポップアップ表示が正常に動作することを確認します。
  3. ナビゲーションの確認 表示された画像を左右に切り替え、スライドショー機能が動作していることを確認します。

Firefly-III 1年間の検証結果と運用レビュー

オープンソースの家計管理システム「Firefly-III」を使い始めてから1年が経過しました。この1年間の運用を通じて、得られた知見や感想をまとめました。最初に導入した環境や特徴的なポイントについて、振り返ってみます。

環境の構築

最初にインストールした環境は、Ubuntu 20.04にPHP 8.1を使用していましたが、その後、Ubuntu 24.04とPHP 8.3にアップグレードしました。

(インストールのメモはこちら)

構築自体はWordpressの構築実績があれば理解可能で、公式ドキュメントに従うことでスムーズに進みました。特に専門的な知識がなくても、簡単に運用を開始できる点は大きな魅力でした。

入力の簡便さ

家計簿の管理で最も重要なのは、入力の手間をいかに減らすかです。Firefly-IIIでは、サブスクリプションや保険料など、毎月定期的に発生する費用を簡単にコピーして入力できる機能があり、手間を大幅に削減できました。これにより、月ごとの出金管理が非常に楽になりました。

直感的なインターフェース

「Firefly-III」のインターフェースは非常に直感的で、出金、入金、送金というシンプルな3つの取引項目で構成されています。このシンプルさにより、簿記などの知識に乏しくても迷うことなく運用できるようになりました。

視覚的な管理: グラフの活用

「Firefly-III」では、家計の動きをグラフで視覚化できるため、特に大きな支出がある場合に、どのくらいの金額が減るのかが一目で分かります。また、クレジットカードのような未来の引き落としもグラフに表示されるため、前もって支出を把握することができます。

予算管理とモチベーションの向上

予算を設定することで、趣味や娯楽に使うお金の限度を決めることができ、(ある程度の)無駄遣いを防げました。デジタルガジェットの購入やフィギュアの予約などに備えて出費を抑えられるようにもなりました。

また、「Firefly-III」では予算管理以外にもカテゴリー分けができ、食費や日用品などを細かく把握することができました。これにより、家計全体のバランスをよりよく理解できるようになりました。

入出金は極めて有用なライフログ

家計簿をつけることで、いつ、どこで、何に、どれくらい使ったかという行動の記録が残ります。この記録は、単なる金銭的な管理にとどまらず、ライフログとしても非常に有用です。例えば、病院での支出を記録することで、いつ、どの病気にかかったかがわかり、過去の体調管理にも役立ちました。

また、突発的な出来事の際に、どのような出金が発生したかも目の当たりにできました。

旅行時の支出記録

旅行中も「Firefly-III」は大いに役立ちました。どんな店で何を食べたのか、お土産を買ったのかなど、旅行の詳細を記録しておくことで、後から振り返って思い出に浸ることができました。

すべての支出を記録するのは大変

一方で、全ての支出を記録するのはやはり大変です。LINEなどのトークアプリで自分自身にメモを送ることで忘れずに記録していますが、入力ミスや記録漏れが発生することもあり、後で差分をチェックすることが課題として残っています。

とはいえ、自分自身の予算管理のために多少の誤差は許容できる範囲であり、精度向上のための改善は引き続き行っています。

運用に関する課題

「Firefly-III」をサーバーで管理するため、サーバー運用に関する一定の知識が必要です。また、お金の流れという非常にセンシティブな情報を扱うため、慎重な運用が求められます。

データのセキュリティやバックアップについても配慮が必要です。

今後の目標

今後は、「Firefly-III」のタグ機能を活用して、さらに細かく支出のカテゴリーを分けて管理していく予定です。

また、自動的に支出が登録される仕組み(例えばAPIやスマートフォンアプリを活用)を導入することで、手間をさらに減らすことを目指しています。最終的には、資産の流れをより明確に把握し、効果的な予算の策定を行いたいと考えています。

1年間の運用を通じて、Firefly-IIIは家計管理を効率的に行うための強力なツールであることが実感できました。今後も継続して使いながら、より精度の高い予算管理を目指していきたいと思います。

2024年に購入した印象的なボードゲーム。

今年は部屋のスペースなどの関係でそれほどボードゲームを買っていませんでしたが、いくつかの作品が印象的でした。

ワーリング・ウイッチクラフト

2023年に遊び、2024年初頭に購入。

  • 資源管理
  • 資源の押しつけ
  • ドラフト
  • バースト

などが非常にかみ合い、フレーバーにもマッチ。友人に勧めたところ、その友人も購入し、更にその友人も買ったという連鎖的な作品。

短時間で終わり、ダウンタイムも少なめなのが素晴らしい作品です。

カスカディア

気になったときには売り切れていた作品。再版を機に拡張、インサート含めて買いました。

  • 悩ましいドラフト
  • わかりやすいルール
  • 映えるコンポーネント
  • 高いリプレイ性

など、人気も納得の作品でした。

来年もこのクラスの作品に出会えるのかが楽しみです。

Redmineで作成日に基づいて曜日を自動設定

Redmine 5.1環境で「View Customize Plugin」を使用し、チケットの作成日に基づいてカスタムフィールド「曜日」を自動的に設定する方法のメモです。

前提

1. View Customize Pluginのインストール

View Customize Pluginをまだインストールしていない場合は、こちらを参照してください。

プラグインのインストールが完了すると、管理メニューから「View Customize」の設定が利用可能になります。

2. カスタムフィールド「曜日」を作成する

  1. 管理メニューから「カスタムフィールド」を選択。
  2. チケット用カスタムフィールドを作成。
  3. フィールド名を「曜日」とし、以下の設定を行います:
    • 形式: リスト
    • 値月曜日
      火曜日
      水曜日
      木曜日
      金曜日
      土曜日
      日曜日
    • 必須: 任意

カスタムフィールドを作成したら、任意のトラッカーやプロジェクトにこのフィールドを設定してください。さらに、フィールドID(例: 6)を確認してください。このIDはスクリプトで使用します。

スクリプトの設定

1. View Customizeで新しいカスタマイズを作成

  1. 管理メニューから「View Customize」を選択。
  2. 「新しいカスタマイズを追加」をクリック。
  3. 以下の内容を設定:
    • 挿入位置: 全ページのヘッダ
    • 種別: JavaScript
    • コメント: 作成日に基づく曜日設定

2. スクリプトを記述する

以下のスクリプトを入力します。カスタムフィールドID(例: 6)は環境に合わせて変更してください。

$(document).ready(function () {
   // 曜日フィールドと作成日フィールドの取得
   const weekdayField = $('#issue_custom_field_values_6');
   const startDateField = $('#issue_start_date');

   // カスタムフィールドが存在する場合のみ処理を実行
   if (weekdayField.length > 0 && startDateField.length > 0) {
       // 作成日フィールドが変更されたときに曜日を更新
       startDateField.on('change', function () {
           const startDate = startDateField.val(); // 作成日(yyyy-mm-dd形式)
           if (!startDate) return;

           // 作成日から曜日を計算
           const date = new Date(startDate);
           const weekdays = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日'];
           const dayOfWeek = weekdays[(date.getDay() + 6) % 7]; // 月曜日始まりに調整

           // 計算結果を曜日フィールドに設定
           weekdayField.val(dayOfWeek).change(); // 値を設定して変更を反映
      });

       // 初期表示時にも作成日があれば曜日を計算
       startDateField.trigger('change');
  }
});

動作確認

  1. 任意のトラッカーまたはプロジェクトで「曜日」カスタムフィールドが設定されていることを確認します。
  2. Redmineのチケット作成画面を開きます。
  3. 「曜日」フィールドがあることと、それが開いた日付であることを確認できれば動作完了です。

パスワード生成のrubyスクリプト・改。

以前のスクリプトを改良です。

スクリプト内容

  • password_generate.rb
# パスワード生成関数
def generate_password(length, complexity, password_count, exclude_similar)
  # 発行強度に応じた文字セットを選択
  base_chars = {
    1 => [('a'..'z'), (0..9)],
    2 => [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*']],
    3 => [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*'], ['-', '_', '=', '+', '<', '>', '?']]
  }

  chars = base_chars[complexity].map(&:to_a).flatten

  # 見た目が似ている文字を除外
  similar_chars = %w[i l 1 I o O 0 |]
  chars -= similar_chars if exclude_similar

  if chars.empty?
    puts "文字セットが空です。条件を入力してください。"
    return
  end

  # 指定された数のパスワードを生成
  password_count.times do |i|
    password = Array.new(length) { chars.sample }.join
    puts "Password #{i + 1}: #{password}"
  end
end

# 発行強度入力関数
def get_complexity
  puts "発行強度を選択してください:\n"
  puts "1: 小文字と数字のみ(例: a1b2c3)- 8文字\n"
  puts "2: 小文字、大文字、数字、基本記号(例: Abc1@3)- 10文字\n"
  puts "3: 小文字、大文字、数字、基本記号、追加記号(例: Ab1@-+?)- 12文字\n"
  print "発行強度を1から3の範囲で入力してください (デフォルトは2): "

  complexity_input = gets.chomp

  complexity = complexity_input.empty? ? 2 : complexity_input.to_i

  until (1..3).cover?(complexity)
    print "有効な範囲で入力してください(1から3): "
    complexity = gets.chomp.to_i
  end

  complexity
end

# パスワード数入力関数
def get_password_count
  print "表示するパスワードの数を入力してください (デフォルトは4): "
  count_input = gets.chomp

  count = count_input.empty? ? 4 : count_input.to_i

  count
end

# 見た目が似ている文字を除外するかの入力関数
def get_exclude_similar_option
  print "見た目が似ている文字 (例: i, l, 1, 0) を除外しますか?(y/N): "
  exclude_input = gets.chomp

  %w[y Y].include?(exclude_input)
end

puts "パスワードを生成します。"
complexity = get_complexity
password_count = get_password_count
exclude_similar = get_exclude_similar_option

# 発行強度に応じたパスワード長を設定
length_by_complexity = { 1 => 8, 2 => 10, 3 => 12 }
password_length = length_by_complexity[complexity]

# パスワードを生成
generate_password(password_length, complexity, password_count, exclude_similar)

実行例

ruby password_generate.rb

パスワードを生成します。
発行強度を選択してください:
1: 小文字と数字のみ(例: a1b2c3)- 8文字
2: 小文字、大文字、数字、基本記号(例: Abc1@3)- 10文字
3: 小文字、大文字、数字、基本記号、追加記号(例: Ab1@-+?)- 12文字
発行強度を1から3の範囲で入力してください (デフォルトは2): 2
表示するパスワードの数を入力してください (デフォルトは4): 3
見た目が似ている文字 (例: i, l, 1, 0) を除外しますか?(y/N): n
Password 1: &o26_yTt/j
Password 2: LWn8byl8lO
Password 3: .7R2B/QVHI

として、対話的かつ柔軟なパスワードの生成が可能になりました。

概要

各所にあるサプライポートから、確率でアイテムのレシピが登場します。

必要なもの

無垢の鍵

「レアリティアップ+2」を発現させた無垢の鍵が確実です。(可能であれば全てを最大まで発現させましょう)

この効果を発現させるためには

  • アダマント(異界オーリムで入手可能な素材)
  • 調合アイテム「賢者の石」

の両方が必要なので、メインクエスト『異界ウィンドル』受諾後からが本番です。

どのようなレシピが出てくるか?

  • 特殊な武器/防具
  • 種のバリエーション
  • 調合アイテム

が主です。特に、今作では「火の種」や「神秘の種」と言った優良素材を入手できる種のバリエーションはここからしか入手できません。(「植物の種」のみ最初から調合可能)

また、一部の武器防具はクエスト達成条件にも繋がっています。

クーケン島周辺エリアのサプライポートから入手できるレシピ

LM〔星見の高台〕 直近のサプライポートが効率的です。(ファストトラベルを繰り返しましょう)

武器

  1. 双剣(タオ用)
    • ヴィータリーパー
  2. 弓(クラウディア用)
    • エトワールフィラント
  3. 両手杖(ライザ用)
    • ミストラルケーン
  4. 大剣(レント用)
    • ハッシュブリンガー

防具

  1. ソルジャーキュイラス
  2. レディアントプレート
  3. 術師のローブ

ソルジャーキュイラスとレディアントプレートは最強武器入手のクエストに関わります。

クレリア地方のサプライポートから入手できるレシピ

LM〔森の隠れ処〕 直近のサプライポートが効率的です。(ファストトラベルを繰り返しましょう)

武器

  1. 扇(フェデリーカ用)
    • 護身扇
  2. 片手剣(ボオス用)
    • ヴォイドパニッシャー

  • 石の種
  • 火の種

ネメド地方のサプライポートから入手できるレシピ

LM〔中央封鎖区画〕 南のサプライポートが効率的です。(ファストトラベルを繰り返しましょう)

武器

  1. 長巻(パトリツィア用)
    • フォルクロール
  2. 斧(ディアン用)
    • ブルートベイル

防具

  1. 月影の外套
  2. エルフの法衣
  3. ドラグーンメイル

調合アイテム

  1. 四季のドーム

  1. 水の種
  2. 神秘の種

異界オーリムのサプライポートから入手できるレシピ

LM〔ウィンドル〕 #225 周辺が効率的に集められますl

武器

  1. 片手杖(アンペル)
    • ウインドワード
  2. 爪(リラ)
    • クリムゾンミスト
  3. 槌(カラ)
    • ソルマルクト

調合素材

  1. 固形燃氷
  2. グレースネロ

  • 毒の種
  • 金の種

グレースネロは影響拡大や属性値が大きい「水」「毒の材料」を持つアイテムなので使いやすいです。

『ライザのアトリエ3』パーティークエストのTIPS。

特定の行動をこなすことでキャラクターごとのパッシブスキルが得られるパーティークエスト。

その中でのちょっとしたテクニックです。

残りHPが少ない状態で戦闘を終える

  • アンペル『泰然自若』
  • ディアン『限界を超えて』

が相当。この、残りHPが少ないとは戦闘不能を含みます。

低ステータスの装備を持たせて高難易度の敵に放置、戦闘不能後を確認後に高威力のコアアイテムを魔物に当てることでクリアします。

敵をブレイク状態にする

  • リラ『油断大敵』

これはあくまでも、敵のブレイクゲージをなくしたときがトリガーとなります。超特性「ブレイク必中」ではカウントされません。

タクティクスレベルを上げる/フェイタルドライブを使う

  • パトリツィア『実戦経験』
  • ライザ『これぞとっておき』
  • リラ『見せるべき背中』

これに関しては

コアアイテム「時空の天文時計」で上げていくか、ラムロースト3号の「開幕、タクティクスレベルMAX』から行けば問題ありません。

町の人と会話をする

  • フェデリーカ『時には世間話を』
  • カラ『異文化交流』

が該当。(全く同じ条件です)この、町の人の定義は

  • アガーテ、験者などネームドのサブキャラではない
  • 商人(ロミィ含む)はカウントされない
  • ソードマスターなどのクエストに関する人物も含まない

が条件です。サルドニカやクーケン港など、人が密集しているところで達成できます。

特定カテゴリーのアイテムを調合する

  • アンペル『張りのある食生活』
  • クラウディア『クラウディアの収納術』
  • フェデリーカ『通ずる技術』
  • フェデリーカ『次なる学び』

などは、他キャラクターと条件を合わせるなどで狙えます。(ライザの『歩んだ道のり』で調合する古の賢者の石は宝石を含むため、フェデリーカの「宝石を5つ調合する」に入ります。

また、個数ではなく「作成した回数」を含みます。なので、このカテゴリーで一番大変なのはカテゴリ「食材」を持つアイテムを10回作る、アンペルの『張りのある食生活』です。

  1. グラスビーンズ
  2. ドライビスク

2つしか条件に合わないため、お任せ調合などを使うのも視野に入れます。

BBC Newsの見出しを取得するBashスクリプト、更に改良

これを更に改良です。

スクリプト

  • bbc_headlin.sh
#!/bin/bash

# デフォルト値の設定
default_section="world"
default_count=3

# メインセクションのリスト
main_sections=("world" "uk" "business" "politics" "health" "education" "science_and_environment" "technology" "entertainment_and_arts")

# グローバルセクションのリスト
global_sections=("africa" "asia" "europe" "latin_america" "middle_east" "us_and_canada")

# 全セクションのリストを統合
all_sections=("${main_sections[@]}" "${global_sections[@]}")

# 引数の処理
if [[ "$1" =~ ^[0-9]+$ ]]; then
section=$default_section
count=$1
else
section=${1:-$default_section} # 引数1が指定されていない場合はデフォルト値を使用
count=${2:-$default_count}     # 引数2が指定されていない場合はデフォルト値を使用
fi

# 引数の短縮形を対応する正式名に変換
case "$section" in
"usa" | "n-usa") section="us_and_canada" ;;
"me") section="middle_east" ;;
"latam" | "la") section="latin_america" ;;
"eu") section="europe" ;;
"science") section="science_and_environment" ;;
"entertainment") section="entertainment_and_arts" ;;
*) section=$section ;;  # その他はそのまま
esac

# セクションの検証
if [[ ! " ${all_sections[@]} " =~ " ${section} " ]]; then
echo "Error: Invalid section '${section}'. Valid sections are: ${all_sections[*]}"
exit 1
fi

# URLの構築
if [[ " ${main_sections[@]} " =~ " ${section} " ]]; then
url="https://feeds.bbci.co.uk/news/${section}/rss.xml"
else
url="https://feeds.bbci.co.uk/news/world/${section}/rss.xml"
fi

# BBC NewsのRSSフィードから見出しを取得
headlines=$(curl -s "$url" | xmllint --format - | grep -oP '(?<=<title>).*?(?=</title>)' | sed -n '3,'"$((count+2))"'p' | sed 's/<!\[CDATA\[//g' | sed 's/\]\]>//g')

# 見出しの表示
if [ -z "$headlines" ]; then
echo "No headlines found for section '${section}'. Please check the section name or try again later."
else
echo "BBC News - ${section} section (${count} headlines)"
echo "$headlines"
fi

改良点

  • BBC 英国版とワールド版の両方のセクションを参照できるようにしました。
  • us_and_canada, latain_americaなどはusa(n-usa)、latam(la)など、省略形を引数にできます。

使用例

  • ヨーロッパのニュースを4件表示
./bbc_headline.sh eu 4
BBC News - europe section (4 headlines)
Six killed in strike on Russia's Kursk after deadly missile attack on Kyiv
Child, 7, dies in stabbing at Croatian primary school
Italy's deputy PM Salvini cleared in kidnap trial of migrants blocked at sea
Eight migrants drown after boat tries to evade Greek ship
  • サイエンス分野のニュースを表示
./bbc_headline.sh science
BBC News - science_and_environment section (3 headlines)
Ancient landmarks closed off to walkers, campaigners say
Trouble in Arctic town as polar bears and people face warming world
Nasa astronauts Butch and Suni's homecoming delayed again

後はupdate-motdなどに仕込むことで、ターミナルでログインすると同時にニュースの見出しを見ることができます。

Redmineの進捗率を自動クローズ/変更時に元に戻すView_Customize

個人メモとして利用しているRedmine。ステータスに応じて進捗率を設定してしまうと、トラッカーが追えなくなるため、以下のカスタマイズを行いました。

スクリプトの内容

  1. Redmineに管理者権限でログインします。
    1. 管理>表示のカスタマイズに進みます。
    2. 新しい表示のカスタマイズを選択し、
      1. パスのパターン:空白
      2. 挿入位置:全ページのヘッダ
      3. 種別:JavaScript
      4. コード
$(document).on('change', '#issue_status_id', function () {
 const closedStatuses = [5, 6]; // 閉じられたステータスIDを指定(例: 5: 完了, 6: 却下)
 const selectedStatus = parseInt($(this).val(), 10);

 // 元の進捗率を保存するための変数
 let originalDoneRatio = $('#issue_done_ratio').data('original-done-ratio');

 if (!originalDoneRatio) {
   // 初回実行時に元の進捗率を保存
   originalDoneRatio = $('#issue_done_ratio').val();
   $('#issue_done_ratio').data('original-done-ratio', originalDoneRatio);
}

 if (closedStatuses.includes(selectedStatus)) {
   $('#issue_done_ratio').val('100'); // 進捗率を100%に設定
} else {
   // 元の進捗率に戻す
   $('#issue_done_ratio').val(originalDoneRatio);
}
});

動作の解説

  1. チケットのステータスが変更されると、指定された閉じられたステータスIDの場合は、自動で進捗率が100%に変更されます。
  2. その他のステータスに変更された場合は、初回に保存した元の進捗率に戻されます。

これで、進捗率を維持しつつステータスの変更が可能になります。

Apache設定ファイル反映を効率化するスクリプトをコマンド化。

先日ご紹介したApache環境のWebサービス再起動を効率的に行うスクリプトをコマンドとして登録します。

コマンドとして登録

  • 実行権限付与
sudo chmod +x apache_check_restart.sh
  • シンボリックリンク付与
sudo ln -s /path/to/script/apache_check_restart.sh /usr/local/bin/apache_check_restart

スクリプトが配置されたディレクトリをフルパスで書きます。

  • シンボリックリンク付与確認
 which apache_check
/usr/local/bin/apache_check_restart

実行例

sudo apache_check_restart
==== 有効なサイト設定ファイル ====
設定ファイル: atelier.conf
ServerName atelier.reisalin.com
servername atelier.reisalin.com
設定ファイル: bookstack.conf
ServerName barrel.reisalin.com
servername barrel.reisalin.com
構文チェック中...
Syntax OK
構文チェック完了: 問題ありません。
Apacheを再起動しますか? (y/n): 

Apacheが正常に再起動されました。

となり、yならapacheサービスを再起動後にステータスを表示。nならそのままスクリプトを抜けます。

Page 3 of 243

Powered by WordPress & Theme by Anders Norén