にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

このブログについて

文字・フォント・プログラム・技術・趣味などについて、Twitterでは書きづらい長い内容などをまとめるためのブログです。基本的には自分用のメモとして書いている部分が多いです。

リンク等

note https://note.com/nixeneko 残らなくてもいい記事
Pixiv https://pixiv.me/nixeneko
Tumblr https://nixeneko.tumblr.com/ 絵。Pixivと同じにしたいがサボリ気味
Pleroma @nixeneko@nixeneko.info Mastodonとかやってる人はフォローしてください
Twitter @nixeneko
GitHub https://github.com/nixeneko プログラムとか
Bookmeter https://bookmeter.com/users/9166 読書記録。たまに感想
D4DJグルミク oDgpcYR9
Amazon欲しい物リスト amazon.jp/registry/wishlist/1C43ZFBA4IL6Z

同人誌(無料公開)

https://nixeneko.hatenablog.com/entry/c88_russian_alphabethttps://nixeneko.hatenablog.com/entry/c90_greek_latin_cyrillichttp://nixeneko.hatenablog.com/entry/20170811_dentyu

『モンゴル文字とUnicode』

サークル“ヒュアリニオス”として頒布した『モンゴル文字Unicode』(初出: コミックマーケット100)を公開します。
モンゴル文字の特徴や現在のコンピュータ上で扱う際の問題点などを簡潔に説明するのを目指した漫画です。

サポートページ

hyalinios.hatenadiary.com

紙版販売

Boothで初版在庫分を販売しています(未修正の誤植などがあります)。紙でほしい場合はどうぞ。

ダウンロード

PDFファイルのダウンロードはこちらから: mongol_bichig_ba_unicode.pdf (13.2 MB)

本文










































ブログのデザインテーマを変更しました

やったこと

今まで使っていたテーマは“Epic”というものだったらしい。

これを現在のデフォルトテーマであるらしい“Smooth”に変更することにした。

なぜ変えるのか

  • 文字が小さい
    • 小さい文字が見づらくなってきた。
    • いつも120%程度にして使っていた。
    • 文字が小さいというのは、画面解像度が低い時代に合わせて作られたデザインであり、時代を感じる。
  • レスポンシブ対応してない
    • レスポンシブデザイン対応テーマにすることで、スマホも統一的にデザインを設定できる。

そんなわけで変更しました。

色やフォントの関係は慣れない部分もあるものの、字が大きくなったので見やすくなったと思います。

Ledgerで始める同人経理

動機

同人関係を記帳したいな~というモチベーション。

Ledger

Plain Text Accountingという類の、簿記をプレーンテキストによって行うソフトがあり、有名なのがLedgerBeancountなどであるらしい。LedgerはC++(互換のHLedgerHaskell)、BeancountはPythonで書かれている。

違いはよくわからんのだが、このページによるとBeancountは「悲観的」であり、ユーザーは入力ミスを犯すもので、通常の複式簿記の仕組みが提供する以上に入力のチェックを行っているとのことだ。

今回はLedgerを使うことにする。

ちなみにLedgerは一般名詞なので検索性が異様に悪く、Ledger CLIとかで検索しないとまともに情報にありつけない。あるいは公式サイトからたどるとか。

なぜLedger?

勘定科目の名前に日本語を使いたかったのだが、Beancountの安定版であるv2はASCIIの範囲内の文字しか科目名に使えないという制限があった。v3では改善されているとのことだったが、うまくコンパイルが通らない(特にWindowsでは無理そう)。

LedgerやHLedgerは勘定科目名として非ASCIIも扱うことができる。しかし、Windows用として配布されているバイナリは、Ledgerは入力ファイルはShift_JIS (というかたぶんcp932)しか対応してないようで、HLedgerについてはエラーが出て使えないという感じだった。できればUTF-8が使いたいのだが。
UbuntuなどのLinuxならどっちも普通にUTF-8ファイル読めるっぽい。

普段はCygwinを使っているので、CygwinコンパイルすることでUTF-8で使えるようにしたい。

CygwinでLedgerのインストール

Cygwin以外の人はこのページを参照。


Cygwinに次のパッケージをインストールする

  • make
  • automake
  • cmake
  • gcc-core
  • gcc-g++
  • libboost-devel
  • libgmp-devel
  • libmpfr-devel
  • python3
  • wget

ソースコード持ってきてコンパイルする。今回はv3.2.1を使う。

wget https://github.com/ledger/ledger/archive/refs/tags/v3.2.1.tar.gz
tar xvf v3.2.1.tar.gz
cd ledger-3.2.1
./acprep update
make install

できた。
./acprep updateには-j4などでプロセス数を多く指定してやるとコンパイルが早くなる。

これでUTF-8テキストが扱えるようになった。

実行

例えば、2022年の収支をまとめたファイル2022.journalが次の内容だとする。

2022-01-31 * 1月分Fanbox売上
	収益:売上:Fanbox	-500円
	支出:支払手数料	50円
	資産:売掛金		450円

この残高を見るには

ledger -f 2022.journal balance

とする。
出力は

              -500円  収益:売上:Fanbox
                50円  支出:支払手数料
               450円  資産:売掛金
--------------------
                   0

となる。

書き方

複式簿記のアイデアについては解説を省く。

コメントは;の他、行頭に来る場合#, |, *, %も使える。

たとえば次のような仕訳は…

2022/1/31 1月分Fanbox売上
売掛金) 450(Fanbox売上) 500
(支払手数料) 50

Ledgerでは次のような書き方ができる。

2022-01-31 * 1月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金		450円
	
  • 日付は2022/01/31みたいな書き方もでき、割と柔軟である。日付の横はスペースで区切って摘要を書く。摘要の前に*を入れると決済が済んだ取引として扱われ、集計ができるらしいが、使う気が無いので今回は付けなくてもいい気がする。
  • その下に勘定科目と、スペースで区切って金額を書く。
  • 勘定科目
    • Assets:Cashのように:で区切って2つ以上をつなげたものとなる。英数字以外も使える。
    • 最初の部分が勘定科目の種類であり、一貫してれば何でも良くて、今回は資産・負債・純資産・収益・支出の5種類を使うことにする。
    • 資産:A銀行:普通預金みたいに3つ以上を:でつなげることもできる。細かく集計したいときとかに便利。
  • 金額
    • 借方(debit)がプラス(符号なし)
    • 貸方(credit)がマイナス
    • JPYでもでもいいけど金額の前か後に一貫した文字列を置いておくとそれを単位として集計するっぽい。
    • 複式簿記の性質から、貸方と借方でそれぞれの合計は一致するため、金額の一つは省略できる。
2022-01-31 * 1月分Fanbox売上
	収益:売上:Fanbox		;金額を書かないと自動計算される
	支出:支払手数料		50円
	資産:売掛金		450円
	

金額は、実は単位は何でもいい

  • 通貨以外でも可能
  • @{}を使って単価を示すことが可能→通貨に換算される
2022-08-13 コミケでの販売
	資産:商品		-10 同人誌A @ 320円
	資産:商品		-15 同人誌B {800円}
	支出:売上原価		15200円
	収益:売上:コミケ		-20,000円 ;同人誌A 10冊×500円, 同人誌B 15冊×1000円
	資産:現金		20,000円


事業としてやってるわけでもないので、事業専用の財布や銀行口座をもっているわけではない。

そこで、現金を得たり銀行口座に振り込まれた金額は事業主貸として、現金を支払ったり銀行から引き落とされた額は事業主借として振り替える。これにより、事業主貸・事業主借を見るとキャッシュフローが見える*1

2022-08-11 スーパーにて消毒用エタノール購入
 	資産:現金		436円
 	純資産:事業主借		-436円
 	支出:消耗品費		436円
 	資産:現金		-436円

実例

; Declare top level accounts, setting their types and display order;
; Replace these account names with yours; it helps commands like bs and is detect them.
account 資産:銀行:普通預金
account 資産:現金
account 資産:売掛金
account 資産:商品
account 資産:貯蔵品
account 負債:買掛金
account 純資産:資本金
account 純資産:事業主貸
account 純資産:事業主借
account 収益:売上
account 支出:支払手数料
account 支出:荷造運賃
account 支出:通信費
account 支出:消耗品費
account 支出:販売促進費
account 支出:売上原価

declare commodities:
commodity 円

2022-01-01 繰越
	資産:商品	51 ギリシャ文字・ロシアの文字合冊 @ 96.4円
	純資産:資本金	;自動計算

2022-01-31 1月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円

2022-02-28 2月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円

2022-03-31 3月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円

2022-04-26 Booth Tシャツ無在庫販売
	収益:売上:Booth		-3,100円
	支出:支払手数料		584円
	支出:売上原価		2,350円
	資産:売掛金:Booth	166円

2022-04-30 4月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円	

2022-05-31 5月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円	

2022-06-30 6月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円	
	
2022-07-01 7月初頭分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円	

2022-07-22 Fanbox売上の振り込み
	資産:売掛金:Fanbox	-3,150円
	支出:支払手数料		200円
	資産:銀行:普通預金	2,950円

2022-08-11 スーパーにて消毒用エタノール購入
	資産:現金		436円
	純資産:事業主借		-436円
	支出:消耗品費		436円
	資産:現金		-436円

2022-08-11 ホームセンターにてコミケ用資材購入
	資産:現金		849円
	純資産:事業主借		-849円
	支出:消耗品費		849円
	資産:現金		-849円

2022-08-13 コンビニにておしながき印刷
	資産:現金		60円
	純資産:事業主借		-60円
	支出:販売促進費		60円
	資産:現金		-60円

2022-08-13 『モンゴル文字とUnicode』納入される
	資産:商品	110 モンゴル文字 @ 215.9円
	負債:買掛金	-23,750円
	支出:売上原価	;端数調整

2022-08-13 コミケでの販売
	資産:商品		-36 モンゴル文字 @ 215.9円
	資産:商品		-27 ギリシャ文字・ロシアの文字合冊 @ 96.4円
	支出:売上原価		;自動計算
	収益:売上:コミケ		-31,500円
	資産:現金		31,500円

2022-08-13 コミケ見本誌提出
	資産:商品		-1 モンゴル文字 @ 215.9円
	支出:支払手数料		;自動計算
	
2022-08-13 コミケ新刊をサークルメンバーに配布
	資産:商品		-2 モンゴル文字 @ 215.9円
	支出:売上原価		;自動計算
	収益:売上:配布		-1,000円
	純資産:事業主貸		1,000円

2022-08-13 コミケ販売後の在庫をゆうパックで自宅へ発送
	純資産:事業主借		-1,100円
	資産:現金		1,100円
	資産:現金		-1,100円
	支出:通信費		1,100円

2022-08-13 コミケ売上の現金の回収
	資産:現金		-31,500円
	純資産:事業主貸		31,500円

2022-08-11 100円ショップにて梱包資材購入
	資産:現金		550円
	純資産:事業主借		-550円
	支出:荷造運賃		550円
	資産:現金		-550円
	
2022-08-18 Booth通販売上
	収益:売上:Booth		-1,370円
	支出:荷造運賃		370円
	支出:支払手数料		99円
	資産:売掛金:Booth	901円
	資産:商品		-1 モンゴル文字 @ 215.9円
	資産:商品		-1 ギリシャ文字・ロシアの文字合冊 @ 96.4円
	支出:売上原価		;自動計算

2022-08-19 Booth通販売上
	収益:売上:Booth		-2,240円
	支出:荷造運賃		740円
	支出:支払手数料		170円
	資産:売掛金:Booth	1,330円
	資産:商品		-2 モンゴル文字 @ 215.9円
	支出:売上原価		;自動計算

2022-08-20 Booth通販売上
	収益:売上:Booth		-3,610円
	支出:荷造運賃		1,110円
	支出:支払手数料		269円
	資産:売掛金:Booth	2,231円
	資産:商品		-3 モンゴル文字 @ 215.9円
	資産:商品		-2 ギリシャ文字・ロシアの文字合冊 @ 96.4円
	支出:売上原価		;自動計算
	
2022-08-24 Booth通販売上
	収益:売上:Booth		-4,780円
	支出:荷造運賃		1,480円
	支出:支払手数料		357円
	資産:売掛金:Booth	2,943円
	資産:商品		-4 モンゴル文字 @ 215.9円
	資産:商品		-2 ギリシャ文字・ロシアの文字合冊 @ 96.4円
	支出:売上原価		;自動計算

2022-08-25 Booth通販売上
	収益:売上:Booth		-870円
	支出:荷造運賃		370円
	支出:支払手数料		71円
	資産:売掛金:Booth	429円
	資産:商品		-1 モンゴル文字 @ 215.9円
	支出:売上原価		;自動計算

2022-08-31 Booth通販売上
	収益:売上:Booth		-870円
	支出:荷造運賃		370円
	支出:支払手数料		71円
	資産:売掛金:Booth	429円
	資産:商品		-1 ギリシャ文字・ロシアの文字合冊 @ 96.4円
	支出:売上原価		;自動計算

2022-08-31 8月分Fanbox売上
	収益:売上:Fanbox		-500円
	支出:支払手数料		50円
	資産:売掛金:Fanbox	450円

2022-09-06 Booth通販売上
	収益:売上:Booth		-2,740円
	支出:荷造運賃		740円
	支出:支払手数料		198円
	資産:売掛金:Booth	1,802円
	資産:商品		-2 モンゴル文字 @ 215.9円
	資産:商品		-2 ギリシャ文字・ロシアの文字合冊 @ 96.4円
	支出:売上原価		;自動計算

2022-09-13 Booth通販売上
	収益:売上:Booth		-1,370円
	支出:荷造運賃		370円
	支出:支払手数料		99円
	資産:売掛金:Booth	901円
	資産:商品		-1 モンゴル文字 @ 215.9円
	支出:売上原価		;自動計算

2022-09-21 8月分までのBooth売上の振込
	資産:銀行:普通預金	8,229円
	支出:支払手数料		200円
	資産:売掛金:Booth	-8,429円

2022-09-27 印刷代クレジットカード引き落とし
	負債:買掛金	23,750円
	純資産:事業主借	-23,750円

2022-09-30 9月分Fanbox売上 
	収益:売上:Fanbox		-500円
	支出:販売手数料		50円
	資産:売掛金:Fanbox	450円

2022-10-31 10月分Fanbox売上 
	収益:売上:Fanbox		-500円
	支出:販売手数料		50円
	資産:売掛金:Fanbox	450円

2022-11-30 11月分Fanbox売上 
	収益:売上:Fanbox		-500円
	支出:販売手数料		50円
	資産:売掛金:Fanbox	450円

2022-12-31 12月分Fanbox売上 
	収益:売上:Fanbox		-1,000円
	支出:販売手数料		100円
	資産:売掛金:Fanbox	900円

2022-12-31 銀行口座のお金を回収
	資産:銀行:普通預金	-11,179円
	純資産:事業主貸		11,179円
	
2022-12-31 決算
	支出:荷造運賃		-225円
	資産:貯蔵品		225円

-X 円って指定すると換算で計算してくれる

ledger -f 2022.journal balance -X
           -59,950円  収益:売上
           -20,950円    Booth
            -6,500円    Fanbox
           -31,500円    コミケ
            -1,000円    配布
            28,456円  支出
            16,952円    売上原価
             2,934円    支払手数料
             1,285円    消耗品費
             5,875円    荷造運賃
                60円    販売促進費
               250円    販売手数料
             1,100円    通信費
            12,018円  純資産
           -26,745円    事業主借
            43,679円    事業主貸
            -4,916円    資本金
            19,477円  資産
            13,849円    商品
             5,403円    売掛金
             2,703円      Booth
             2,700円      Fanbox
               225円    貯蔵品
--------------------
                   0

所得だいたい3万円か。よかったですね。交通費考慮すると更に1万円近く減るんだけど。

参考

日本語でいろいろまとめてくれている人がいて助かる

Documentationsへのリンク

*1:自家消費分を事業主貸に含めるとまた違ってくる気がする。自家消費分を別科目に立てるといいかもしれない。とはいえ別に普通のやり方でキャッシュフロー計算すればいいだけではあるんだけど。

Blenderとペパクラデザイナーを用いた球面に貼るステッカーの構成

2022/12/31のコミケ101において頒布された、サークル「kabesa*」の本に寄稿した記事を公開します。
biacco42.hatenablog.com

球面にステッカーを貼るということ

カッティングシートをカットすることでステッカーが作れる。車や店舗の窓などに貼ってあるあれである。平面やそれに近い形状ならばただ貼ればいいのだが、球面に貼るのは難しい。

この原因は、メルカトル図法などの平面地図と地球儀のアナロジーで理解できる。つまり、平面地図を球に貼ろうとすると、極に向かうにつれて絵柄が引き伸ばされているため、その部分にしわ寄せが来る。
ステッカーデザインで考えると、ステッカーの図柄中に広い面やループが存在する場合、球面に貼ると歪みが蓄積するため、きれいに貼れなかったり、図柄が歪んだりする。

球面に貼りやすいステッカーを作るには、分岐のある紐状にするのがよい。球面より十分に細い紐状の形であれば、局所的に見れば平面に貼るのに近くなるので、きれいに貼ることができる。ただし、歪みが蓄積するので図柄はずれていくことになる。

球面向けステッカーの構成

そのため、図柄をなるべく歪めずに、球面に貼れる形に構成することを考えたい。ここで「図柄を歪めない」というのは、ある視点から見た場合に平面と同じ図柄になるということを想定している。

ある視点から見た場合に平面と同じ図柄になる見た目の球体というのは、その視点から球体の表面へと図柄を透視投影することによって実現できる。図柄が投影された球体モデルの図柄部分のみを、立体の展開図のように展開できれば、歪みの少ない球体向けのステッカー用図柄が得られるはずである。

実際にやってみた

球体への投影にはBlender、投影した図柄の平面への展開はペパクラデザイナーを用いる。

球体への投影と展開用モデル作成

球体への図柄の投影と展開用モデル作成にはBlenderを用いる。
以下の説明はBlender 3.3.1 LTSの英語版UIを前提としている。また、基本操作については解説を省く。

事前準備
  • 3DビューポートのシェーディングをMaterial Previewにしておく。
3Dモデルとテクスチャの作成
  1. UV Sphereなどの球を用意する(以下、“MySphere”とする)。最終的には使わないのでメッシュはかなり細かくして良い。
  2. “MySphere”にマテリアルを追加し、シェーダーエディタを開く。[Principled BSDF]を削除し、代わりに[Emission]シェーダーを追加する。さらに[Image Texture]を追加して図柄の画像ファイル(“design.png”; 図1)を開く。
    図1 用意した図柄の元データ“design.png
  3. [Color]-[Color]間と[Emission]-[Surface]間を接続する(図2)。
    図2 シェーダーのノードの接続
  4. [Add Modifier]から[UV Project]モディファイヤを追加し、[UV Map]にデフォルトの“UVMap”を選択、[Object]はデフォルトカメラの“Camera”を設定する(図3)。
    図3 UV Projectモディファイアの設定
  5. カメラ“Camera”の位置を(0, 0, 5)とかに持っていき、回転も(0°, 0°, 0°)などにしてZ軸下側を見るようにする。
  6. テクスチャの画像を編集して、テクスチャの中心が中央に来るようにする。カメラを移動するとテクスチャの位置が動くものの、透視投影をする都合上、テクスチャが思った位置になるように移動させるのはテクスチャの方を編集したほうが良いかもしれない。
  7. [UV Project]モディファイヤの[Scale X]/[Scale Y]を利用してテクスチャの大きさを変更できるので、適当な大きさにする(図4)。
    図4 テクスチャ投影位置と大きさの調整
  8. 思ったような見た目になったら、展開用のモデルを作成する。Faceへのスナップ機能を使いながら、図柄を覆うようにメッシュを作成していく。作成したメッシュ(図5)は“MyMesh”という名前とする。
    図5 作成したメッシュ
  9. “MySphere”はもう使わないので非表示にする。
  10. “MyMesh”をUV展開する。[UV Editing]ワークスペースを開いてメッシュ全選択→[U]キー→[UV Unwrap]。
  11. “MyMesh”のマテリアルは“MySphere”に設定していたものと同一のものを指定する。
    モディファイヤとして[UV Project]を“MySphere”のときと同様に設定する。すると図6のような見た目となる。
    図6 作成した“MyMesh”にテクスチャ投影を設定した
  12. “MyMesh”のObject Dataプロパティの[UV Maps]に新規追加し、“proj”と名付ける。
    “proj”の右のカメラマークをクリックしてアクティブレンダーに設定。
    [UVProject]モディファイヤの[UV Map]を“proj”に変更。
  13. イメージエディタなどで“baked”というテクスチャを作成する。シェーダーエディターで[Image Texture]を追加し“baked”のテクスチャを開き、そのノードを選択状態にする(図7)。
    図7 ベイク用のテクスチャの選択
  14. [UV Editing]ワークスペースを開き、メッシュを全選択する。[UV Map]のアクティブレンダーを“proj”にしたまま(カメラマーク)、“UVMap”を選択状態にする(図8)。
    図8 ベイクのためのUVマップの設定
  15. Renderプロパティを開いて[Render Engine]を[Cycles]にし、[Bake]の下の[Bake Type]を[Emit]にして[Bake]を実行する。すると“baked”に結果が描かれる。
  16. “MyMesh”を選択して、[UVProject]モディファイアを削除。シェーダーエディタを開いて“baked”を使うように繋ぎ変える(図9)。
    図9 ベイクしたテクスチャを使うように設定
エクスポート
  1. “baked”という画像を“baked.png”としてファイルに保存する。
  2. “MyMesh”を選択し、[File]→[Export]→[Wavefront (.obj)]でエクスポートする。
  3. 設定画面で、(Limit to) [Selected Only]にチェック、[Forward Axis]を[Y]、[Up Axis]を[Z]にする。[Geometry]の[Materials]にチェックがあるのを確認してエクスポートを行う。

ペパクラデザイナーで展開図を作成

ペパクラデザイナー5で.objファイルを読み込む。

[設定(S)]→[テクスチャの設定(T)]から、設定したマテリアルを選択して[テクスチャ画像の指定...]を押し、“baked.png”を指定する(図10)。

図10 ペパクラデザイナーでモデルとテクスチャを読み込んだところ

ループがある場合は、切る辺を適当に指定してループがなくなるようにする。「切開する辺を指定する」ツールで切る辺を指定する(図11)。>

図11 切開する辺を指定したところ

その後、「展開」を押す。

すると展開される(図12)。

図12 展開した結果

[展開図ウィンドウ(E)]から[のりしろを表示する(F)]をオフ。
[辺の色の指定]ツールを開き、[選択対象]は[切り取り線]のみにチェックを入れ、[色選択]で淡い色を選択する。そして展開図の上をドラッグして切り取り線の色を薄くする。

これをPDF ([ファイル(F)]→[PDFファイルへの出力(D)])等で出力し、画像処理ソフトを使って閾値で2値化すると、カットするための図案が得られる。

結果

実際に得られた画像が図13である。

図13 作成したカット用図柄

これを元に実際にカットしたステッカーを図14に、球形のものに貼ってみた結果を図15に示す。

図14 カットしたステッカー
図15 りんごに貼ったところ

若干のズレがあるために隙間が開いているが、割といい感じになってると思う。

感想と課題

設計に用いたサイズと実際の球面の大きさが異なると、大きくても小さくても歪み方が変わるので、きれいに貼れない可能性がある。最終的なサイズがきっちり決まっている場合は、サイズをちゃんと計算した方がいいだろう。サイズが確定しない場合は、大きさを調整して試行錯誤してみたり、ループを断ち切った部分などは長めに伸ばしておいて、若干重なるように構成しても良いかもしれない。
ちなみに、今回は球体で行ったが、3Dモデルが用意できれば球面に限らずあらゆる立体に対応できるはずである。

また、この手法は、半球より大きな図柄は構成できない。加えて、端の方の歪みはかなり大きくなるため、正しく見える視点が限定される。そのため、全体に貼りたい場合などは別の手法が必要となるだろう。

他にも、今回はメッシュの張り替えを手で行っているが、これだけ単純な図柄でも結構面倒なので、さらに複雑な図柄だともっと大変なことになる。自動化してえなあ~。

参考

Ubuntu 22.04でハード構成を変更したらネットに繋がらなくなった話

まとめ

Ubuntu 22.04でインストール時に固定IPを設定した。
ハードウェア構成を変更したらネットに繋がらなくなった。
netplanの設定のインタフェース名が異なっていた。インタフェース名を修正したらつながった。

経緯

自宅でファイルサーバとして動かしてるマシン(Proliant MicroServer N54L)のOSを新しくして、Ubutu 22.04をインストールしてセットアップした。

インストール時にインストーラで固定IPを設定した。

それでしばらく使っていたが、ハードウェア構成を変更したらネットに繋がらなくなった。具体的にはPCIeの機器を外してグラボを取り付けたりした。

ここで、

sudo dhclient

とするとIPが取得できることが確認できた。

しかし、

sudo netplan apply

では取得できなかった。

結論

Bug #1881832 “Ubuntu server 20.04 fails to get IP address from D...” : Bugs : netplan.io package : Ubuntu
似たような現象に遭ってる人がいたので解決した。

結論としてはnetplanの設定ファイルのインタフェース名が異なっていた。

Ubuntuインストーラが生成した/etc/netplan/00-installer-config.yamlが変更されたのか、インタフェース自体の名前が変更になったのかは確認してないのではっきりわからないが、おそらく後者だと思われる。

PCIeを増設したり取り外したりした時など、ネットワークインターフェースの名前が変わる可能性があり、設定ファイルを見直す必要があるのかもしれない。

Pleroma 2.4.5→2.5.0の更新

概要

Pleromaの2.5.0がリリースされていたので更新した。
更新方法は次の記事に書かれていたので、それに従ったが、Elixirの更新が必要になったのでそこでつまづいた。

環境

Ubuntu 20.04 LTS
Pleroma 2.4.5 (ソースからインストール)

データベースのバックアップ

sudo systemctl stop pleroma
sudo -Hu postgres pg_dump -d pleroma -v --format=custom -f /home/nixeneko/pleroma_dev.20221225.pgdump

pleromaはデータベースの名前、/home/nixeneko/pleroma_dev.20221225.pgdumpは出力先ファイルの指定

Pleromaをv2.5.0へ更新

ソースをv2.5.0に更新する。

cd /opt/pleroma
sudo -Hu pleroma git pull
sudo -Hu pleroma git checkout v2.5.0

ここで、コンパイルに進もうと

sudo -Hu pleroma MIX_ENV=prod mix deps.get

とやってみたが、次のエラーがでた。

** (Mix) You're trying to run :pleroma on Elixir v1.9.1 but it has declared in its mix.exs file it supports only Elixir ~> 1.11

つまり、Elixirのバージョンが1.11以上でないといけないということだった。

Elixirの更新

Ubuntu 20.04 LTSで入るElixirのバージョンは1.9.1だが、Pleroma 2.5.0では1.11以上が必要らしい。
というわけで、Elixirのバージョンを上げる。

面倒なのでErlang Solutionsのリポジトリを使うことにした。

wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
sudo dpkg -i erlang-solutions_2.0_all.deb
sudo apt update
sudo apt install erlang
sudo apt upgrade

Pleromaのコンパイル

ここでPleromaをコンパイルするのだが、ここでつまづいた。

まず依存するモジュールを取ってくるところで…

cd /opt/pleroma
sudo -Hu pleroma MIX_ENV=prod mix deps.get

次のエラーが出た。

Could not start Hex. Try fetching a new version with "mix local.hex" or uninstalling it with "mix archive.uninstall hex.ez"

mixが古いとのことなので、次のように実行した。

sudo -Hu pleroma MIX_ENV=prod mix local.hex

しかし、コンパイルしようとして、

sudo -Hu pleroma MIX_ENV=prod mix deps.get
sudo -Hu pleroma MIX_ENV=prod mix compile

としたところ、

** (Mix) Could not compile dependency :eblurhash, "/var/lib/pleroma/.mix/rebar3 bare compile --paths /opt/pleroma/_build/prod/lib/*/ebin" command failed. Errors may have been logged above. You can recompile this dependency with "mix deps.compile eblurhash", update it with "mix deps.update eblurhash" or clean it with "mix deps.clean eblurhash"

と出てeblurhashコンパイルできないということだった。

ここでしばらく途方に暮れていたのだが、救いの手はAkkomaが差しのべてくれた。

このページのCompilation Troubleshootingにおいて、

If you ever encounter compilation issues during the updating of Akkoma, you can try these commands and see if they fix things:

  • mix deps.clean --all
  • mix local.rebar
  • mix local.hex
  • rm -r _build
https://akkoma.dev/sfr/akkoma

とするとよいとのこと。つまり、rebarを更新するのを忘れていたということになると思う。

というわけで、書かれている通りに

cd /opt/pleroma
sudo -Hu pleroma MIX_ENV=prod mix deps.clean --all
sudo -Hu pleroma MIX_ENV=prod mix local.rebar
sudo -Hu pleroma MIX_ENV=prod mix local.hex
sudo -Hu pleroma rm -r _build

を実行し、コンパイルを行うと…

sudo -Hu pleroma MIX_ENV=prod mix deps.get
sudo -Hu pleroma MIX_ENV=prod mix compile

無事コンパイルできた!!

その後、Migrationを行い、

sudo -Hu pleroma MIX_ENV=prod mix ecto.migrate

VACUUM ANALYZEをする。

sudo -Hu pleroma MIX_ENV=prod mix pleroma.database vacuum analyze

再起動して終了。

sudo systemctl start pleroma

いやーヒヤヒヤしました。

Epicyon建ててみたメモ

AcrivityPubの一実装であるEpicyonサーバーを立ててみた。

Epicyon

EpicyonはActivityPubという規格に基づいて通信を行うSNSソフトウェアである。
ActivityPubを話すソフトウェアは互いに通信することができ、Mastodonなどと相互に通信ができる。

Epicyonは次のページにある。
https://epicyon.net/

特徴としては、JavaScriptを使っていないので、ページの動的な更新がされない、またリレーショナルデータベースなどを利用せず、データは普通のファイルとして保存されるそうだ。サーバーはPythonで書かれている。

インストールメモ

サーバーのセットアップ

VPS用意

WebARENA IndigoでUbuntu 22.04、メモリ1GBのインスタンス作成

DNSレコードを設定

ドメイン(以降の説明ではepicyon.example.comとする)にIPアドレスを設定。

ログイン

sshでログイン

とりあえず更新
sudo apt update
sudo apt upgrade
sudo reboot now

再ログイン

sshd設定
sudo nano /etc/ssh/sshd_config

次のような設定を行った。

port 10022 

LoginGraceTime 30
PermitRootLogin no
MaxAuthTries 3
MaxSessions 3

再起動

sudo sshd -t
sudo service sshd restart

ファイアウォールとかの設定は略。

Epicyonのインストール

諸々入れる
sudo apt install python3-socks imagemagick python3-setuptools python3-cryptography python3-dateutil python3-idna python3-requests python3-flake8 python3-django-timezone-field python3-pyqrcode python3-png python3-bandit libimage-exiftool-perl certbot nginx wget

インストールの説明だとtorもインストールすることになってるけど省いた。

ソースコードとってくる
cd /opt
sudo git clone https://gitlab.com/bashrc2/epicyon
ユーザーの追加
sudo useradd -r -s /bin/false -d /opt/epicyon -U epicyon
sudo chown -R epicyon:epicyon /opt/epicyon

なんかリンク張る。以降ドメインepicyon.example.comとする。

sudo mkdir /var/www/epicyon.example.com
sudo mkdir -p /opt/epicyon/accounts/newsmirror
sudo ln -s /opt/epicyon/accounts/newsmirror /var/www/epicyon.example.com
sudo chown -R epicyon:epicyon /opt/epicyon/accounts/

accounts/以下のownerがrootになっていたので変更した。

デーモンを作成
sudo nano /etc/systemd/system/epicyon.service

公式ページの説明にあるように次のような内容を貼り付ける

[Unit]
Description=epicyon
After=syslog.target
After=network.target

[Service]
Type=simple
User=epicyon
Group=epicyon
WorkingDirectory=/opt/epicyon
ExecStart=/usr/bin/python3 /opt/epicyon/epicyon.py --port 443 --proxy 7156 --domain epicyon.example.com -registration open --log_login_failures
Environment=USER=epicyon
Environment=PYTHONUNBUFFERED=true
Restart=always
StandardError=syslog
CPUQuota=80%
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
ProtectKernelLogs=true
ProtectHostname=true
ProtectClock=true
ProtectProc=invisible
ProcSubset=pid
PrivateTmp=true
PrivateUsers=true
PrivateDevices=true
PrivateIPC=true
MemoryDenyWriteExecute=true
NoNewPrivileges=true
LockPersonality=true
RestrictRealtime=true
RestrictSUIDSGID=true
RestrictNamespaces=true
SystemCallArchitectures=native

[Install]
WantedBy=multi-user.target

YOUR_DOMAINだけ使うドメイン(ここでは仮にepicyon.example.com)に置換している。
ユーザー登録を無効化するにはExecStartのところの--registration open--registration closedに変更するといいっぽい。

有効化

sudo systemctl enable epicyon
sudo systemctl start epicyon
Webサーバーの設定
sudo nano /etc/nginx/sites-available/epicyon.example.com

公式の説明通りに次のような内容を貼り付ける。

server {
 listen 80;
 listen [::]:80;
 server_name epicyon.example.com;
 access_log /dev/null;
 error_log /dev/null;
 client_max_body_size 31m;
 client_body_buffer_size 128k;
 
 limit_conn conn_limit_per_ip 10;
 limit_req zone=req_limit_per_ip burst=10 nodelay;
 
 index index.html;
 rewrite ^ https://$server_name$request_uri? permanent;
 }
 
 server {
 listen 443 ssl;
 server_name epicyon.example.com;
 
 gzip on;
 gzip_disable "msie6";
 gzip_vary on;
 gzip_proxied any;
 gzip_min_length 1024;
 gzip_comp_level 6;
 gzip_buffers 16 8k;
 gzip_http_version 1.1;
 gzip_types text/plain text/css text/vcard text/vcard+xml application/json application/ld+json application/javascript text/xml application/xml application/rdf+xml application/xml+rss text/javascript;
 
 ssl_stapling off;
 ssl_stapling_verify off;
 #ssl on;
 ssl_certificate /etc/letsencrypt/live/epicyon.example.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/epicyon.example.com/privkey.pem;
 #ssl_dhparam /etc/ssl/certs/epicyon.example.com.dhparam;
 
 ssl_protocols TLSv1.2 TLSv1.3;
 ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
 ssl_prefer_server_ciphers on;
 ssl_session_cache shared:SSL:10m;
 ssl_session_tickets off;
 
 add_header Content-Security-Policy "default-src https:; script-src https: 'unsafe-inline'; style-src https: 'unsafe-inline'";
 add_header X-Frame-Options DENY;
 add_header X-Content-Type-Options nosniff;
 add_header X-XSS-Protection "1; mode=block";
 add_header X-Download-Options noopen;
 add_header X-Permitted-Cross-Domain-Policies none;
 add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
 
 access_log /dev/null;
 error_log /dev/null;
 
 index index.html;
 
 location /newsmirror {
 root /var/www/YOUR_DOMAIN;
 try_files $uri =404;
 }
 
 keepalive_timeout 70;
 sendfile on;
 
 location / {
 proxy_http_version 1.1;
 client_max_body_size 31M;
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forward-Proto http;
 proxy_set_header X-Nginx-Proxy true;
 proxy_temp_file_write_size 64k;
 proxy_connect_timeout 10080s;
 proxy_send_timeout 10080;
 proxy_read_timeout 10080;
 proxy_buffer_size 64k;
 proxy_buffers 16 32k;
 proxy_busy_buffers_size 64k;
 proxy_redirect off;
 proxy_request_buffering off;
 proxy_buffering off;
 proxy_pass http://localhost:7156;
 tcp_nodelay on;
 }
 } 

YOUR_DOMAINを使うドメインepicyon.example.com)に置換している。
ssl on;はwarning出たのでコメントアウトした。

これだけだとエラーでて動かないので、Nginxの設定を編集し

sudo nano /etc/nginx/nginx.conf

で、httpセクション内、includeの前に

	limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
	limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=50r/s;

とかを追加。

有効化

sudo ln -s /etc/nginx/sites-available/epicyon.example.com /etc/nginx/sites-enabled/
SSH対応
sudo systemctl stop nginx
sudo certbot certonly -n --server https://acme-v02.api.letsencrypt.org/directory --standalone -d epicyon.example.com --renew-by-default --agree-tos --email test@example.com
sudo systemctl start nginx

メールアドレスは適切に設定。


これで動き出すっぽい。
ダメな場合はNginxについてはsudo systemctl status nginx.servicesudo journalctl -xeu nginx.serviceなどで、Epicyonについてはsudo journalctl -f -u epicyonとかでログが見られるっぽい。

使う

これでブラウザからアクセスすると登録画面が出てきて使うことができる。

感想

WebクライアントのUIがこなれてない。デザインもあんまり分かりやすくないし、見た目もあんまりよくない気がする。

Mastodonとは通信ができたが、自分のメインのPleromaインスタンス(nixeneko.info)とはうまく疎通できなかった。Pleroma→Epicyonは配送できてもEpicyon→Pleromaは配送できなかった。Pleromaバージョンを上げればいいのかもしれないが…。

結局、試すには試したけど常用するには難しいかなという感じ。


さすがにWebクライアントが最新投稿を自動で取ってくるくらいはして欲しい気がする。とはいえ適当なアプリ使えばいいのかも。

自由ソフトウェア的な思想が結構強い雰囲気を感じる。好みは分かれるかもしれない。

特に、コミュニケーションを目的とせず、情報を配信するために自分でActivityPubサーバーを立てる時にはこういった選択肢は有用であると思われる。動かすのに強いマシンが要らないので。