最近,というかここ1年くらい Android アプリは全然作ってなくて, 今ストアにあるやつもフェードアウトしつつある。でも意図せずタイトルが釣りになっているのか, SecureScreen というアプリは少しではあるが,毎日コンスタントにダウンロードされてるっぽかったので, 消されないように注意しつつ見守っていた。でも,アクティブに Android やってないと気づいたら消されているので, そのたびに Google Play Console を開いてストアの掲載情報をアップデートするのはかなり面倒くさい。
で,今回は12月くらいに削除したぞとメールが来ていて,面倒なので放置していたのだが, ついに今日,掲載情報をアップデートした。今回のはよくいつものに増してよく分からなかった。
ただ,アクティブに開発してないといつの間にか消されているシステムは必要なのかなと思ったりもしていて, それはなぜかというと,アクティブに開発されていないアプリは UI はさることながら使ってた API も古いものになっていき,ストアにゴミがあふれる結果になる気がするからだ。 そういう意味では,過去1年にアプリのアップデートがない場合は削除するみたいな仕組みを作ってもいいような気がする。
PAM で遊んでみた。PAM ってのは Pluggable Authentication Manager の略らしく, Linux のユーザー認証のしくみで,これの設定次第でユーザーが自由に認証の方法を変更できる。 例えばパスワード認証の代わりに指紋認証を使いたいみたいな場合もこの PAM のモジュールで実現できるはず。 当たり前だが,設定次第で認証システムを破綻(?)させることも可能で,常にログインできる PAM モジュールを使ってパスワードなしでログイン可能にしてしまったり,逆に絶対にログインできない PAM モジュールで全ユーザーを締め出したりもできてしまう。てなわけでまあ割とヤバイ部分で遊んだ。
PAM のモジュールを書くのはとても簡単な部類で,常にログインできるやつとかだと下みたいなコードで できたりする。
先日作った Minecraft のマップ画像を生成するやつが遅すぎる(7min/region)のをなんとかしたいので, Python で並列処理をする方法を調べて使ってみた。
Thread concurrent.futures.ThreadPoolExecutor を使うというもの。別に pool 使わなくてもいいけど。 でもまあ pool 使った方がいいでしょってことで。
この方法では結局 GIL のせいか全然速くならなかった。むしろ遅くなった。たしか 11min/region とかになった気がする。
Python で Thread を使うのは,主に IO がネックになってる場合っぽい。IO の待ち時間は GIL が解除されるけど,その他の状況では GIL のせいで並列処理というよりむしろ 並行処理になってる。
Process concurrent.futures.ProcessPoolExecutor を使うというもの。 fork できる環境(主にUNIX 系の OS?)ではデフォルトで fork になるって書いてあった。 これがなかなか速くて,なんでか 2 つしかプロセス起動してないのに半分未満の時間で処理できた。 Windows とかでは fork できないから遅いのかもしれないけど,Windows 使ってないのでよくわからない。
サイトに関してはここ半年くらいで elisp や bash で CMS 書いたりして迷走していたのだけど, 結局 hugo 使う感じになった。自前で実装するモチベーションが消えてしまったので。 多分当分変えることはないと思う。なんで今まで自分で実装していたかというと, 自分で実装して使うのが美徳みたいな考えがあったからだ。でもモチベーションが消えたので仕方ない。
この Hugo ってやつは本当に快適で,自分では何もしなくていい。ただ,hugo new foo/bar.md した後に表示されたファイル名をエディタで自分で開かないといけないのは割と不満なので, 暇があるときに適当にプルリクでも投げてみようかしらと思っていたらどうやらそういうオプションがあるっぽい。
あと,この Hugo の便利な点は,ビルトインサーバーの使いやすさにある。 このサーバーは生成した HTML を serve してくれるだけでなく,ファイルの更新を監視して, ページをリロードさせたりしてくれる。雑に見た感じだと WebSocket で実装されているみたい。モダン〜。 テーマもいろいろあるけれど,簡単そうでそこそこデザインが良ければいいやという感じで選んだ。 ただ,数式を簡単に表示できるという機能に関しては譲れないところなので, そういう条件で選んでいたら選択肢は割と絞られてきた。 複雑なやつは高機能ではあるんだけど,設定が面倒だったりシンタックスを覚えないといけなかったりと, 記事を書くコストが高くなる気がして良くないな,と。
から数日前に,お試し期間が終わるから VPS 代をクレジット決済するぞというメールが来ていた。 でも,決済自体は申し込んだ日に行われていたので怖くなった僕はさくらインターネットにメールした。 そうすると,決済は済んでいるので今回はメールで来たみたいな引き落としはなくて,次回は来年の 12 月 ですということで安心した。さくらインターネットってほら,なんか対応が雑みたいなので有名なので 怖かったんですよね。でもメールしたらその日のうちに返信来てた。
そういや,さくらインターネットがいつメンテナンスするって言い出すかっていうのがいつも怖くて, それはなんでかというとメンテナンスで壊されて自分で OS を再インストールしろと言われたという おそろしい話を Web でよく見るからです。OS インストールするの割と面倒くさかった,というか かなり苦労してインストールしたので,もう一度インストールしろって言われるとちょっと辛すぎるな,と。
VoxelMap というクライアント Mod を使っていて,この Mod は地図を PNG に書き出したり できるのだけれど,このところ書き出すところでクラッシュしていたので,セーブデータから 地図を生成するやつを自分で作ることにした。これを実現するためには Minecraft のセーブデータ をパーズする必要があるので,GitHub で適当に検索していたら良さげなのを発見。
matcool/anvil-parser
実際良いのかは分からないけど,なんかそこそこ動いてそうで,且つ最終コミットの日付が最近だったので これを使うことにしてみた。で,example っていうディレクトリがあって,一番上の非空気なブロック を画像に書き出すというものがあったので,それを参考にしながら作った。
作ってから分かったけどめちゃくちゃ遅い。生成にかかる時間はリージョンの中で生成されているチャンクの 数に依存するところはあるんだけど,だいたい 1 リージョン分の画像を生成するのに手元のラップトップだと 7 分くらいかかる。Python のオーバーヘッドだろうか。(知らんけど)
なんかここに
画像は VoxelMap という MOD が生成したやつで,JS は数ヶ月前に作った「洪水シミュレータ」という訳わからん やつを改造しただけなので適当。あとはいつもの GitHub に push したら自動で更新されるやつを 設定した。これがないと更新する気にならないので。
なんか,前は Emacs Lisp で動く CMS でブログを動かしていたのだけど,なにしろ Emacs Lisp で拡張していくのはあまりにも苦行なので VPS を移行するのと同時に書き直すことにした。 VPS を移行したといっても今も昔もさくらの VPS なので,その部分は変わってないのだけど, 前は Minecraft のサーバーを動かす必要があってそこそこハイスペックなものを借りていて毎月の出費が痛かったので, それを小さいものに移行したという話。さくらインターネットはスケールアップだけじゃなくて ダウンする方も実装してくれていいのではと思う。(そういや最近さくらインターネット炎上してたなあ。。。)
で,CMS を書き直した話だけど,変な言語で書きたいけどあまり辛い思いはしたくないな, ということで Bash で動くやつを書いてみた。といってもなんか結局割と苦労したが。 辛い思いをしたくないのであれば Wordpress などといった既存の CMS を使ったらいいじゃないかという話 なんだけど,ウェブインターフェースで記事を書かないといけないところとか RDB で管理されるところとか が後で動かしたくなったときに辛そうな気がして,なんとなく気が進まず,自前で用意している。 ブログサービスなんかを使うという手もあるけどその場合,前者の理由に加えて,他人の場所を使っているということで S/N 比を気にしてしまうところがあって,やっぱり自分で作るという結論になってしまった。 まあ Emacs で動かしていたころも S/N 比どうでもいいにも関わらずあまり書いてなかったわけではあるが。
Ubuntu (をはじめ多くの GNU/Linux ディストリビューション) では C 言語のマニュアルページは最初から標準で入っていますが、 C++ のマニュアルページは入っていません (C++ にはマニュアルページを見る文化がないのだろうか…)。 という訳で、自分でインストールする必要があります。
$ sudo apt install libstdc++-8-doc で、見るときは、
$ man std::vector みたいな感じで std:: までつけないといけないみたいです。
環境は Ubuntu 18.04.3 LTS x86_64 です.
必要なパッケージを入れる $ sudo apt install freeglut3-dev 試す なんか適当に
#include <stdlib.h> #include <GL/glut.h> #include <GL/gl.h> #include <GL/glu.h> static void display(void) { glClear(GL_COLOR_BUFFER_BIT); glFlush(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitWindowSize(256,256); glutCreateWindow("Hello"); glClearColor(1, 0, 0, 1); glutDisplayFunc(display); glutMainLoop(); return 0; } 256x256 のウィンドウを赤く塗りつぶすだけです.
で,コンパイル
$ gcc main.c -lglut -lGLU -lGL -lm できました.
適当に Makefile にしておく ライブラリが多くて毎回指定するのは面倒なので, Makefile 必須っぽいです.
LDFLAGS = -lglut -lGLU -GL -lm .PHONY: all all: main.o $(CC) main.o $(LDFLAGS) Man よこせ $ sudo apt install opengl-4-man-doc で入るみたいです.でも見た感じ, gl で始まる関数しかないっぽい. まあパッケージ名から想像がつくけど.
glut とか glu とかの man の入手の仕方を教えてください.
さいごに Windows でやる方がめんどくさいな,という印象ですね.まあ NuGet を使えば一発で入ることは入るんですが. でもあれはプロジェクトごとになるのであまり好きではない.