Python Django: ModelFormの使い方頑張って調べて時間浪費するのもうやめる

DjangoのForm関連の機能は手間を色々減らしてくれる気がするので、ぜひ使い方をマスターして活用したいな、と思っていたけど、かゆいところに手が届かいので、一部あきらめる。

[app/form.py]
from django import forms
from .models import Project

class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ["field1", "field2", "field3"]

これだけでFormオブジェクトそのものはできちゃうので、Viewに1行くらいコンテキストに渡す処理書いてあげるだけで、Template側では

        <form method="POST"> {% csrf_token %}
            <fieldset class="module aligned">
                {% for field in form %}
                <div class="form-row"><div>
                    <label>{{ field.label_tag }}</label>
                    <div class="related-widget-wrapper">
                        {{ field }}
                        {{ field.errors }}
                    </div>
                </div></div>
                {% endfor %}
                <input name="submit" type="submit" value="Regist" />
            </fieldset>
        </form>

これ書いてあげるだけでフォーム作ってくれちゃうし、こりゃ今後フィールド増えたときも便利だなあと確かに助かったんだけども、View側でPOSTを受け取ったときが困り物で

    if(request.method == 'POST'):
        form = ProjectForm(request.POST)
        if not form.is_valid():

これ、Formのフィールドからはあえて削ったフィールドについては、手で横からセットしてあげることが多分できないんじゃないだろうか。無理やりrequest.POSTの中身をいじってから処理するのもなんか違う。上記の例だとformのオブジェクトに対してなんかメソッドやらでsetすることはできないのかと調べたものの出てこないし、Validationなんかも怪しいところだ・・・。

色々考えたすえ、ModelFormは画面の生成と一定のValidationでは頼ってみることにするけど、データ編集してDBにレコード保存する処理はModelで直で書いてあげることにする。これはもうその方がわかりやすい。

したら、Viewはこんなことになった。ピエン。

    if(request.method == 'POST'):
        form = ProjectForm(request.POST)
        if not form.is_valid():
            ctx['form'] = form
        else:
            p = request.POST
            pj = Project(
                field1=p['field1'],
                field2=p['field2'],
                field3=p['field3'],
                field4=xxxxxxx,  # Formからではなく自分で別の方法で取得させる
                field5=xxxxxxx,  # Formからではなく自分で別の方法で取得させる
            )
            pj.save()
            messages.success(request, 'Success')
            return redirect('xxxx:xxxxx')

いいのかなこれ。ちゃんと動いて、あとからメンテできればいいっていうポリシーでやってるけど、不安だ。

Lubuntu: Atom Text Editorが急に起動しなくなる

Atomをデスクトップメニューから起動しようとしても、しばらくしたらダウンしてしまう症状。
試しにシェルから起動してみたらこんなログが出ておる。Linux版のAtomはなんかトラブルが多いな。

user@xxx:~ $ atom
user@xxx:~ $ /usr/bin/atom: line 195:  3122 Illegal instruction     (core dumped) nohup "$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@" > "$ATOM_HOME/nohup.out" 2>&1
(node:3190) Electron: Loading non-context-aware native module in renderer: '/usr/share/atom/resources/app.asar.unpacked/node_modules/superstring/build/Release/superstring.node'. This is deprecated, see https://github.com/electron/electron/issues/18397.
(node:3190) Electron: Loading non-context-aware native module in renderer: '/usr/share/atom/resources/app.asar.unpacked/node_modules/pathwatcher/build/Release/pathwatcher.node'. This is deprecated, see https://github.com/electron/electron/issues/18397.
[3122:0919/131037.889620:FATAL:gpu_data_manager_impl_private.cc(439)] GPU process isn't usable. Goodbye.

GPU processが使えないってなんだよ・・・とググって見たけど

https://forum.manjaro.org/t/error-gpu-process-isnt-usable-goodbye/104611

こちらを発見して、以下の太字のところだけ追加したらスッキリ解決。意味は不明だけど別にいいか。。。

$ sudo vim /usr/share/applications/atom.desktop

[Desktop Entry]
Name=Atom
Comment=A hackable text editor for the 21st Century.
GenericName=Text Editor
Exec=env ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT=false /usr/bin/atom %F --no-sandbox
Icon=atom
Type=Application
StartupNotify=true
Categories=GTK;Utility;TextEditor;Development;
MimeType=application/javascript;application/json;application/x-httpd-eruby;application/x-httpd-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/x-ruby;application/x-bash;application/x-csh;application/x-sh;application/x-zsh;application/x-shellscript;application/x-sql;application/x-tcl;application/xhtml+xml;application/xml;application/xml-dtd;application/xslt+xml;text/coffeescript;text/css;text/html;text/plain;text/xml;text/xml-dtd;text/x-bash;text/x-c++;text/x-c++hdr;text/x-c++src;text/x-c;text/x-chdr;text/x-csh;text/x-csrc;text/x-dsrc;text/x-diff;text/x-go;text/x-java;text/x-java-source;text/x-makefile;text/x-markdown;text/x-objc;text/x-perl;text/x-php;text/x-python;text/x-ruby;text/x-sh;text/x-zsh;text/yaml;inode/directory
StartupWMClass=atom
~                           

Lubuntu: あとからFcitx + Mozcで日本語入力環境を整える

インストール時点では英語環境にしたけど、あとから日本語入力環境を入れた。
Lubuntu 22.04。

sudo apt install fcitx-mozc

あと、意味があったかどうかわからないけど、この辺いくつか触って

こんな具合にして

それでも急には有効になってくれないので、Rebootしたら問題なく入力できるようになりました。

JR宝塚と篠山口を往復

なんか景色見てて普段思い出さないこと思い出す。

中学の時、一個下のバンド仲間でグレイのジローに憧れてベースやってたやつが、ケースがないっていう理由で普通にベースを肩にかけてライブ中か、みたいな姿で道歩いて移動してるやつがいて、おもろくてめっちゃ笑った。

Google Photoの代替を探す 3

結局メモを忘れていたけどnextcloudをphp、apache、mysqlそれぞれ入れたところにインストールし直して、photoprismとはwebdav連携させて2週間ぐらいで大体動くとこまでできた。これでしばらく運用してみよう。

人の顔の認識のやつはおもろいな。photoprismは寄付ちょっとしようかしら。

Google Photoの代替を探す2

Piwigoがぼちぼちいい感じだなと思っていたが、結局サーバハードが弱すぎるため別を考えることにする(良いソフトだったけど)

ryzen 7 2700xとメモリ16GBを備えるマシンにubuntuサーバを最小構成でインストールしてNextCloud + PhotoPrismを入れてみることにした。ある程度動いたときの使用感は非常に良かったので基本これベースで進めることにしてみたい。

やったことメモ

  • PCにHyper-VでUbuntuを最小構成でインストール
  • SnapコマンドでNextCloudをインストール、めっちゃ簡単。動作確認
  • PhotoPrismもdocker-composeで入れる。動作を確認。
  • NextCloudのクライアントを操作用PCに導入し同期機能で写真をアップロード開始。デフォルトでNextCloudのフォルダ全体を同期しようとするのだが、その設定をいったん外してほしいところだけにするよう工夫。
  • PhotoPrismがWebDAV経由でNextCloudの写真を取り込むところもやんわり成功。
  • この辺で、ディスクパーティションの切り方をミスっていることに気づく。ホストマシンのSSD上にOS用の60GB、SATA HDDにデータ用に600GBと、それぞれ仮想ディスクをこしらえていたのだが、後者を程よいところにマウントしようと思ってて完全に後手に。
  • 一度Ubuntuのインストールディスクで起動して、途中で右上の「Help」ってところからShellに入れたので、そこでfdiskとかmkfsを使ってパーティションを作った後、マウントしてファイルコピーしてfstabいじるなどして無事終えた。uuidをlsblk -f /dev/sdxというコマンドで調べてもViエディタにコピーしに行けないので、コマンドから>>で/etc/fstabに書き込ませてから中で編集するという荒業も。
  • WANからも使いたいのでリバースプロキシを設定しようとして超苦戦。以下試したがなかなかうまくいかなかった。
    • 素直にリバプロ設定 → CSS、JSなどが動作せず真っ白な画面に。
    • NextCloudの動作をhttp://xxx.xxx.xxx.xxx/から、http://xxx.xxx.xxx.xxx/ncみたいに動作が変えられないか試し、一瞬うまくいきかけたけどどうしても不調。Webに事例もなし。
    • VirtualHostでうまくいった。けど、Lets Encryptの証明書の更改が必要だったのでACMEチャレンジみたいなのをやったりこれも時間がかかった。
    • LAN内からもサブドメインでアクセスできるようになり上々の出来だったけど、Syncクライアントだけはなぜか変な動きになってダメだったのでIP直指定でLAN内だけで運用することにした。
  • 翌朝、Photoprismが領域/homeをガンガンに食っていることで止まっていることを発見。/homeフォルダ用の仮想ディスクもhyper-vでHDD上に追加して積みなおし。
  • NextCloudのアプリのインストールがsnapバージョンではできないことを発見。きつい。NextCloud Appstoreからtar.gzを落としてきて食わせる方法がないかも探したけどネットにノウハウなし。あきらめて、SNAPはやめてもう一回NextCloudを自前で構築するか・・・それは夕方にやろう。

Google Photoの代替を探す

Google Photoが有料化されて以降、何か違う手段はないものかと考えている。

15GBって少ないし、スマホで撮った写真やちょっとした動画ですぐ埋まってしまう。画質をオリジナルで保存できないのもなんか残念だ。かといって容量追加をGoogle Oneで申請すると微妙に出費になってしまう。払えなくもないものの、それでも100GBを気にしないといけないし、そもそも自宅には1TBとか2TBのハードディスクが空いている。

せっかくUbuntuの自宅サーバを運営しているのだから、何かできることがあるはずと思い、調べたり実験したりしてみた。

要件を考え直してみる

どういう生活が幸せかを整理。

必須

  • スマホ、デジカメなどで撮影した写真やビデオを永続的に保存。オリジナル画質。
  • スマホでどこからでもブラウズができる。
  • 容量を気にしたくない (この点でGoogle Photoがノックアウト)。
  • 今ある資源で。サーバ買い足すなどの投資はしたくない。

できれば外したくない

  • スマホからWi-Fi経由で自動アップロード ⇒ できればいいけど、時々手動でPCから上げるでもいい
  • アルバム機能で友達に共有、友達からもアップロードを受け付ける ⇒ できればいいけど、最悪このシチュエーションだけGoogle Photoを使えばいい
  • 上記同様で、公開Linkの発行
  • スマホでの動画のストリーミング再生 ⇒ できてほしい・・・けど写真ほど優先しない

あきらめられる機能

  • 顔認識 ⇒ 便利だけどなくても死なない
  • 画像認識とキーワード検索 ⇒ Googleだと「ハイキング」とか検索するとそういうのが出るけど、めちゃくちゃお世話になるわけではない。
  • 軽快なパフォーマンス ⇒ Google Photoのサクサク動作は多分無理なので、最低限使えればいい。サムネはさらさらーっと流せて見えたらうれしいけど。

手元にある資源

自宅サーバ

昔使ってたノートPCにUbuntuをGUIなしで入れてサーバにしているもの。Thinkpad Z61t、Core 2 Duo T5500、メモリ1GB、PHP7.4をFPMで設定してあり、MySQLなんかも動いていてブログも動作中。家庭内のSMBサーバとしても。CPUは普段はがら空き。HDDは600GB積んでて500GBくらい空いている。

どんなに軽いLinuxを入れてもノートPCとしては全く使い物にならなかったので、天寿を全うするまでの最後の仕事は自宅サーバということになっていただいた。これでもamazonのEC2でmicroかなにか最小のインスタンスタイプで借りていた時に比べるとパフォーマンスはよいのである。月の電気代は以前測ったら200~300円くらいだった。

ここにSelf-Hosted型の何かをいれて要件が満たせればいいのではと考える。

自宅の作業用PC

普段から、家族が仕事や趣味で使用するPCが約3台。Windows 10。ここからスマホやデジカメの写真をSMBやWeb経由でアップできれば良い。今までのデジカメなどの写真データがかき集めると200GBほどあり、Google Photoの無料枠からはみ出たものはHDDの中においてあって参照などは特にできない。

スマートフォン(家族4人分)、デジカメ

すでに一家で一人一台ですべてAndroid。デジカメはSDカード経由でのアップロードとなる。

NextCloudを試した

インストールは成功。
PHP7.4のFPMにいくつか追加パッケージをインストールしたが、あとはもうWordpress入れるのと似たような手順でMySQLにDBとユーザ切って設定したら動き出した。写真管理というよりはクラウドグループウェアのオープンソース版という感じでチャットとかも付属。

スマホにアプリも導入でき、スマホ内のCameraフォルダを同期させることもできてしばらく待ってみるも、飛んでもなく時間がかかり一晩たってもエラーでまくりで止まっていた。サーバマシンのCPUは常にphp-fpmのプロセスがCPU100%で、こりゃ多分サムネ生成でGDとかが働いてるんだろうけどさっぱりダメだな・・・。ものすごいマシン持ってこないとまともに使えない気がする。

画面遷移も遅い、スマホアプリも応答待ちが長いためか不安定、写真データもぽろぽろアップロードしているけどエラーも出るし何が行ってて何が行ってないか不安満点。

さすがにこんなに重いのもおかしいのではと、opcache、acpとかmemcached入れたりPHPのメモリ制限開放したりチューニングにも励んでみたけどダメなのであった。NextCloudはこれはこれで何かに使える気もしなくはないけど、求めていた写真管理の件に関してはあきらめる。こんな非力なマシンで動くものではないんだろうな、きっと。

ここまで来てGoogle Photoに対する見方も少し変わった。そうか、あれは単にディスク容量を買うだけだと無駄に高い感じしかしないけど、アップロード機能、ブラウズ機能、いろいろなコンピューティングリソースもソフトウェアも全部コミコミなんやから、そらそうよね。ごめんなさい。でもまだあきらめませんが。

次の一手

ちょっと寄り道して、Slackの代替もセルフホストできるようなのあるのかしら?とか調べてたらMattermostなどいろいろあるよう。へー。でもこれもSlackで別にいいよな。Slackも無料版は5GBという容量制限があるが。

LibrePhotosか、Photoprismというのが使えそうな気がしたけど、もう一つPiwigoというのがよさそうに見える。

https://qiita.com/fujiisoup/items/52a69fdd60b6155f1420

スマホから自動で写真同期は、NextCloudであの不安定感だったからもうあきらめて、定期的にスマホをPCにつないでアップロードするくらいの手間は取ってやるとして、SMB経由でサーバにファイルおいてあげれば、ブラウズ機能だけはフロントで提供するみたいな考え方なんだろうか。MySQLとPHP7.4で動くらしいので手っ取り早そう。
ここをザーッとみる限りアップロードの手間以外はほしいやつっぽい。

パフォーマンスがどうかやな・・・CPU空いてるときにちまちまサムネイルとか生成して、サクサク見せてくれる仕組みならよいのだけども、とりあえず今からこれ入れてみる。

Piwigo導入

Apacheのドキュメントルートにダウンロードして展開。

$ cd /var/www/html/
$ wget https://piwigo.org/download/dlcounter.php?code=latest
$ mv dlcounter.php\?code\=latest ./piwigo.zip
$ unzip ./piwigo.zip

おー、わかりやすい・・・昔ながらのWebアプリのインストールだ。

SMBでgalleriesというフォルダに大量の写真を転送したらそれを見せてくれるところまでの動きは非常に良い感じ。ただUIがちょっと微妙かな・・・写真がなんかスマホの画面だと画面中央に大人しめにしか表示されない。そしてサムネイル生成に途方もない時間がかかるのはNextCloudのときと同じだった。夜中にバッチでやらせるにしてもサーバにしているノートPCが火を噴きそうだし毎回これもやってられんかもなあ。

Piwigoのスマホアプリも試してみたけど、そもそもサーバ側が重いので今のところ実用には耐えられないものの、サムネ生成が済んでいるアルバムを参照するのにはそれほど困らないので使い勝手自体は悪くない。

旅は続く・・・

結局今回は完全に落ち着く先は決まらなかった。

そもそもセルフホストするハードウェアがこれだとどの選択肢もどん詰まり。こうなったら、息子があまり使わなくなっているデスクトップPC(ryzen 7 2700x)をサーバ化してしまうか。それとも写真を眺めたり管理するのもいつもってわけじゃないからAWSのオンデマンドインスタンスでも借りて、使うときだけ起動する形式にしようかな。でもそれだと、スマホとかデジカメの写真をアップロードするのに待ち時間長くなりそうだな。

ここを見てるとPhotoPrism+NextCloudが用途も広くてよさそうだし、前述のうちで一番性能がいいPCを常時起動にして、Hyper-Vでサーバ立ててみようか、それともSSD買い足していったんネイティブLinuxマシンにしてしまおうか。でもデュアルブートにしないとWindows 10のライセンスどっか行っちゃったら面倒だな・・。

2022 GWの連休

前半は野津さん、渉さん、永井さんとスタジオで4曲ほど演奏をたしなむ。練習2週間だったけどちょっと頑張った。Slackでワイワイ。Seventh Noteに雨の中向かった。

そのあとはたけぞーらと合流して2件ほど飲む。

翌日は妻外出。上の息子と初めてスポーツセンターでトレーニングする。

伊丹のイオンで息子の服を買う。妻と弟は映画。

5/2は結構仕事したりしつつ、5/3も割とだらだらする。

5/4は甲賀市にいって忍術のテーマパークで遊ぶ。

5/5は実家の方へ行ってタケノコ掘りをするも不作であまり採れず。

ウェストが78cmくらいまで回復していたので、ダイエットを再開することにする。腹が減ってないのに食べるのをまずやめる。トレーニングとかストレッチを再開する。