おひとり様ActivityPubサーバー実装メモ

2023/9/8 [15:45:34] (金) 天気

ActivityPubを通じてMastodonなどFediverseと呼ばれるネット連合からアカウントとして認識されるように最低限のサーバー構成を作ったのが7/12。その後、秘密鍵・公開鍵を使えるperlのモジュールをlolipopレンタルサーバーにインストールできたことで、それっぽいものにしあがって、実際に運用して今日に至る。


「ため池」

↑perlで自作実装したおひとり様ActivityPubサーバー


そもそもMastodonやMisskeyなどのサーバーを立てるスキルがない。わたしには難易度が高すぎる。

自分のわかる範囲で自作実装したので、間違ってる・勘違いしてるところもあるかも知れないけど、今のところ意図通り。

この雑記帖と同じレンタルサーバーに展開して追加の費用なども必要ない。


自作とはいえ、スグ忘れるのでまとめてメモしておこう、というのがこのエントリ。

5分以上前の自分はアカの他人。


Fediverseからアカウントとして認識されるために必要なもの

1)nodeinfo(json)

 サーバー情報。

2)host-meta(xml)

 webfingerのURL。

3)webfinger(json)

 ユーザー情報のURL。

4)actor.json(json)

 ユーザー情報。type:Personのjson。

上から順番にアクセスされて4のユーザー情報にたどり着けばActivityPubサーバーのアカウントとして認識される。

1と2はなくても大丈夫らしいけど、webfingerのURLは「/」だったり「/.well-known/」だったりするので、2の「/host-meta」で教えてあげる。


「ActivityPubを使ってFediverseにたどり着く」

↑各ファイルの詳細。



おひとり様サーバーとして動作しているスクリプトは2つだけ。

・飛んでくるリクエストをさばく門番的スクリプト

・タイムラインを表示、投稿、管理するスクリプト



【飛んでくるリクエストをさばく門番スクリプト】


ActivityPubでの会話を求めて飛んでくるリクエストはいろいろ。

アカウント情報を取得するためにactor.jsonをリクエストされるし、ActivityとしてCreate(投稿)Follow(フォロー)などのリクエストが飛んでくる。


まず「.htaccess」を設置

rewrite ruleでパラメータをつけて門番スクリプトにリダイレクトするところからスタート。


リダイレクトされてリクエストを受けつける門番スクリプトの仕事は以下。


サーバー情報やユーザー情報はGETでリクエストが飛んでくる。

リクエストされたURLに応じて、門番は用意してある静的ファイル、jsonやxmlファイルを返す。

ActivityPubのjsonファイルは「Content-Type: application/activity+json; charset=utf-8」をヘッダにつけるのが必須。


followerやfollowingにアクセスされた時はfollower、followingを記載したテキストファイルを読んで、静的ファイルにそのリスト情報をくっつけて返すようにした。


Activityリクエストは「ユーザー名/inbox」にPOSTでリクエストが飛んでくる。

これはまとめて門番で受け取って。

・HTTPヘッダ類

・content(ボディ)

これをひとつのログファイルとして、所定のディレクトリに保存する。

ボディ=jsonを読んで、CreateだのFollowだのUndoだのログファイル名の一部にしておく。

門番スクリプトの仕事はここまで。


ヘッダ類もログファイルに収録するのは。

公開鍵とhttp signatureで、飛んできたリクエストが正しく署名されているか検証する必要がある。

Mastodonなんかはたぶんリクエストが来たらその場で検証までしてるはずで、ログファイルなど必要ないと思う。

わたしの場合、まだよくわかってないことが多くて、ログファイルで確認したいことがあるので、そのためにログファイルを残している。


ActivityのPOSTリクエストのうちいくつかは今時点スルーしている。

仕様的にはMUSTとかSHOULDだったりするものもあって、対応が必要と思われるけど、ウチの運用的にそれ必要?と微妙なもの…要検討。



【タイムラインを表示、投稿、管理するスクリプト】

あまり考えず「ため池」という名前にした。


Mastodonでいうところの「ローカルタイムライン」のために投稿用のデータベースを用意。


といっても、テーブル2つだけ。それも1つはログインに使うだけのもの。投稿用のテーブルはテキストと、画像のURLや幅・高さぐらいを記録するメモ帳。

投稿するには重複しない一意のIDが必要で、それにはデータベースが便利に使える…ほぼそのため。


おひとり様サーバー、ユーザーはわたしだけ。サーバーに登録しているユーザーの投稿を表示する「ローカルタイムライン」は、わたしの壁打ちとなる。



フォローしたひとの投稿を表示する「ホームタイムライン」はファイル管理。


自分以外、ひと様のデータを持たないのが原則。ひと様のデータを溜め込むといろいろ考えなきゃいけないことが出てくるから。


ため池にアクセスすると、門番スクリプトが保存したログファイルを開いて。

まずはHTTP SignatureのVerify。

actor情報をリクエストして、公開鍵を取得。公開鍵を使ってログファイルのヘッダ情報にあるSignatureを検証する。

Signatureに問題がなければ、Activityに応じた所定のフォルダに、所定の命名規則で名前をつけたjsonファイルを保存。元のログファイルを削除。


「RSAモジュールで公開鍵と秘密鍵」

「HTTP Signatureをlolipopレンタルサーバーで作成」

↑秘密鍵、公開鍵について


タイムライン用に保存するjsonファイルはCreateかAnnounceのNote

・上限20個

・期間1日

ディレクトリのファイルを読んで制限以上になっていたら削除。

フォローイングが増えてくると、読まないまま削除される方が多いし、さらにフォローは増やすつもりなので、読む・目にする投稿の方が圧倒的に少なくなる。知らない間に流れてきて知らないうちに削除されている。


でも、SNSはそのぐらいで適正だと思う。

その時その場で見たものがすべて。「袖すり合うも他生の縁」だ。


「ホームタイムライン」用に保存するjsonファイルは「to」か「cc」に「Publish」(全公開)が指定されているもの限定(サークル投稿を除く)

この「ホームタイムライン」を表示するにはログインが前提。つまり、見ることができるのはわたしだけだ。


ホームタイムラインの投稿にフォローしたひとのアイコンや名前を表示させるために、actor.jsonをリクエストしてpersonを取得してそこからアイコンのURLや名前を取ることになる。

これだけのためにリクエストが生じるんで、ホームタイムラインの表示が重い。


[10/24 09:27:53]

さすがに重すぎでキレた…ので、不本意ながら、表示名とアイコンURLに限っては、キャッシュすることにした。

当然、表示は劇的に早くなった。

キャッシュの期間は30日(要検討)。

Updateのリクエストがpersonだったら確認してキャッシュに反映。


本当だったら非同期で情報を更新したいところだけど、Javascriptとか面倒くさいし、メンテやエラーの特定にあっちもこっちもになってコスト高なので却下。手動更新。


見るのが自分ひとり、一般公開はしないということから、表示が重いのは我慢、また、同じ理由でいくつかのリクエストはスルーしてもいいかな、と。


[10/04 12:53:50]

というのが、ログファイルが貯まるとさすがに重すぎるので、このフェーズだけ抜き出したスクリプトを作ってcronで5分間隔で回すようにした。



MentionとFollowは別扱い。

両方とも確認してから返事するなりフォロー返しするなりしてから手動で削除することにした。


FollowをAcceptしたら、Followのjsonを保存して、followersのリストに登録する。

Following、こちらからフォローする場合も同じ。Followingに使ったjsonを保存して、followingのリストに登録する。Followingのjsonを保存するのは、フォロー解除するUndoのために、元になったjsonが必要だから。uuidでIDを作ることにしてしまって、残しておかないと元のjsonを再現できないというオチ。


Mention

連絡先としてサイトや名刺など今まではtwitterのアカウントを入れたんだけど、twitterがなくなったんで、こっちを「連絡先はこちら」にしたい。Mentionを見落としちゃまずいんで、これも確認からの手動にした。


[09/21 10:05:12]

リクエストとして飛んでくるブーストは対応済みで、こちらからブーストのリクエストを飛ばすのも実装してみた。

「おひとり様ActivityPubサーバーにブースト実装」

いろいろ考えなきゃいけないことあった(改めて)


[10/03 10:57:44]

「おひとり様ActivityPubサーバーのjsonの実例」

投稿するのに実際に使ってるActivityPubのJSONの実例をメモした。


[10/06 10:26:14]

「おひとり様ActivityPubサーバーにLike実装」

Likeされる方じゃなくて、する方の実装。

WEB拍手みたい感じで使うのがいいかな、と。


[12/22 07:40:43]

「ActivityPubサーバーのGETリクエストに署名」

GETリクエストでactor情報などを取得する時にHTTP Signatureが必要なサーバーもあった。

GETにも署名することにした。


[12/27 10:01:38]

「おひとり様ActivityPubサーバーにBlock実装」

レアケースだけどBlockも対応した。


[2024/01/23 09:08:36]

「おひとり様サーバーの改修」

Fedibird.comやkmy.blueなど一部のサーバーが実装しているサークル機能に対応…といっても読むだけ。サークル作成やサークル投稿に対する返信は未対応。


■以上、雑なまとめでした■

ディテールというか無駄の多いエントリはカテゴリからどうぞ。

「ActivitiyPub::ひまつぶし雑記帖」



以下のサイトを参考にさせてもらっておひとり様ActivityPubサーバーを実装することができた。感謝深謝。

「NetlifyとSupabaseでほぼ静的なActivityPubサーバ」

「Fediverse入門―非中央集権型SNSサーバを作ろう!」

「田舎の昼のサイレンbotをActivityPubで実装する(マストドンにアカウントを認識してもらう編)」

「ActivityPubの実装についてのメモ」


ActivitiPub本家本元。

「ActivityPub」

「ActivityPubの仕様(和訳)」


image

[12/13 08:30:17]追記。

Activityなどの実装・対応状況


[済]Create

noteを投げ込むのに使用

[済]Follow

followしたらfollowingリストに追加。json保存。

followされたらfollowersリストに追加

[済]Accept

followされたら許可

[未]Reject

followされたら拒絶

[済]Update

noteやpersonなどオブジェクトの更新…だけど、personだけ対応

[済]Delete

自分がポストしたNoteの削除。

ポストされて流れてきたNoteの削除(20個しか保存しないので、すでに削除済みのことが多いけど念のため)

[未]Add

オブジェクトの追加

[未]Remove

オブジェクトの削除

[済]Block

ブロックされたらリストに登録。間違えてFollowするといけないので、Followリクエストを飛ばす時にブロックリストも確認する。

[済]Like

いいね。

したらjson保存。14日間。

されたら1日だけ表示。jsonは3日間だけ保存。

[済]Announce

ブースト。

したら、7日間ため池データベースに保存。期限がすぎたら削除、undo

されたものは削除

ブーストされたらLikeと同じ対応にした

[済]Undo

やり直し。

ブーストの取り消しとフォロー解除は対応済み。Likeは未対応。



[済]Mention

DMみたいなものだからJSON保存。確認して手動で対応。

[済]Hashtag

お一人さまだと意味はないけどとりあえず

[未]Replies

リプライは実装しない方向で


Json-LDの署名について不明。手がかりにできそうなURL

jsonの日本語訳PP版

MastodonのJSON-LD署名と検証

MastodonのJSON-LD署名の実装rubyのコード

JSON-LD関連のコード

graph rdfとかよくわからんけど、関係しそうなところ

LDのAPI


おひとり様ActivityPubサーバーの自作実装::On Golden Pond

↑まとめはこちら

思考ツールの構築

2023/9/1 [00:04:05] (金) 天気

うわ。なんか、虫唾の走る啓発系本のタイトルみたいで、自分でムカつく。

…のはともかく、還暦を過ぎて、明らかに脳みそが劣化してるんでそのサポートにいいかも、と思ったんでメモ。


この雑記帖以外のナニかを最近作ったんだけど、これらがけっこう使いものになってる。


1)思いつきを垂れ流すひとり言掲示板。

ところてんx10

2)ネットに放流するのに使うおひとり様ActivityPubサーバー。

ため池

3)そして、1998年から続けてる雑記帖。


思考はまさにこの番号順。


1)ひとり言掲示板という、ただのメモ。

スマホで手軽気軽に入力できるので思いついたらその場でちゃっちゃと記入。

そんな思いつきみたいなものをネットで公開?…てのは、公開する意味は意外にもあって、こんな辺境でアクセスログを確認してもほとんど見られていない場所だけど、それでも見られてしまうかもしれないとか考えると、思いつきとはいえ迂闊なことは書けない。ひと目をそれなりに意識したものになる。

保持するのは100個だけ。100個以上はところてん式に古いものを削除。表示させないのではなく、データベースから文字通り削除している。思いつきが流れて消えてしまう前になんらかのカタチにしようと思うことが増えた。つまり、自分で自分を急かしてる。

この2点だけでもこのひとり言掲示板は、わたし的にめちゃくちゃポイントが高い。生産性が上がったとかクソ啓発系ビジネス書みたいなこというけど、自画自讃。


とにかく。思いつきをテキストにして入力するのが楽しいんだわ。


スクリプト的には手抜きもいいとこで、今まで作ってきたスクリプトの中でも難易度は最低レベル。データベースもリレーションなんてないただのメモ帳。


ていうか、これ、間違いなく還暦を過ぎた老化現象。こうしてテキストに落とし込んでおかないとすぐに忘れてしまう。若い頃ならこんなの必要はなかったと思う。


2)おひとり様APサーバー

ひとり言掲示板でネタをためて、この雑記帖のエントリにする、というのが元々の発想だったんだけど、twitterがなくなったこともあって、あれこれ調べて作ったりして面白かったので、こいつも使うようにした。

こっちはひとり言掲示板と違って、Fediverseというネット空間に意図をもって投稿する、ことになるので、わたしの知らないサーバーに表示されるかも知れないし残るかもしれない。自分のコントロールがきかないので、かなり「よそいき」を意識する。

元ネタとしてひとり言掲示板に書いたものから拾うようにする、とりあえずひとり言掲示板に書いてみるのが前提。

twitterなんかのSNSはつい何か言いたくなってしまうことがあって、それは承認欲求だったりマウントだったり、我ながら、動機がロクでもない。

ひとり言掲示板を起点、発火点にすることで、ひと呼吸おけるようになった。


てのはともかく、twitterやfacebookみたいな中央集権型のSNSには愛想が尽きたんで、おひとり様APサーバーをSNSの窓口にしていく。

こいつの発想や仕様をちゃんとメモしておかないと忘れるので、もう少し枯れてきたら雑記帖のエントリにしよう。


3)雑記帖

1998年からなにか書いてる日記で、25年ほど続けてるんで、そこにはなにか狂気を孕んでたりしてのちのち評価されたり…なんてことは1mmもなく、ただただ凡庸でくだらない事象心象についてつまらない文章で書かれてるだけ。

とはいえ、ここまで続けてきたので、レンサバの契約切れとかわたしの健康面金銭面での都合でやむなく終了するまでは書き散らすつもり。

これを作った頃はまだスマホじゃなくてPCだったんで、入力フォームやもろもろPC前提。増改築の継ぎ足し継ぎ足しでスクリプトはこんがらがってるなあ。今となっては無駄なIE対応のCSSなんか読み込んでるし。


現状、ひとり言掲示板の大勝利。

image

2023年も、もう9月。還暦を過ぎると月日の流れがいっそう早くなるなあ。

おひとり様ActivityPubサーバーにタイムライン追加

2023/8/30 [14:11:40] (水) 天気

発信専門でいいかと思ってた「おひとり様APサーバー」をしばらく使ってて、やっぱりタイムラインが欲しくなった。フォローしたひとの投稿を表示する、Mastodonでいうところのホームタイムライン。

結局、投稿を閲覧するのにあっちのMastodonこっちのfirefishと行ったり来たりするのが面倒くさくなった、ということもあって、ここだけで完結できればそれに越したことはない。


とはいえ、要求される機能を満たすのはなかなかしんどいので、ここも必要最小限で追加してみた。

たぶん、すぐ忘れるのでメモ。5分以上前の自分なんてあかの他人だしなあ。


表示させるのは「to」に「Public」の指定のあるもの=全公開OKなものだけ(公開範囲がいろいろあって、全部を振り分けするのは面倒くさいし事故の元)

そして保持するのは1日だけ、最大個数20個まで(設定ファイルで制御)

データベースは使わない。ログファイルを振り分けて保存して、規定の期間個数に達したら古いものから削除する。


自分以外のひとのデータを持つのはいろいろ考えなきゃいけなくて、削除してしまうのは、そのリスク回避もある。データベースでも同じことだけど、ただのファイルだと、何かあったらFTPでログインしてその場で削除すればいいしね。慌ててデータベースにdeleteを投げるのは事故の元。


フォロー数が増えたら、この程度のデータ保持数だと見られない投稿の方が全然多くなる。

でもSNSなんて「袖すり合うも他生の縁」その時その場での関わりでいいと思ってるんで問題はない。むしろ本来こういうカタチが正しいと思ってる。


Mentionだけは別扱い。「連絡先はこちら」というのでこれまでtwitterのアカウントを使ってたんだけど、twitterがなくなったのでどうしたもんかと思ってたところ。今後は「連絡先はこちら」におひとり様APサーバーを使う。


「@t2aki@tokoroten.doncha.net」


↑これを検索してもらえれば、おひとり様APサーバーのアカウントが表示されて、そこにメッセージを飛ばしてもらえればわたしに届く。

もちろん、MastodonやMisskeyなんかにログインしている・アカウントが必要となる。twitterやfacebookと違ってハードルは高い。これについてはそのうちMastodonなんかが当たり前になればハードルは下がるし、そもそも、公開する連絡先なんて多少ハードルがあるぐらいでちょうどいい。


MentionはNoteの中のtag配列に「type:Mention」のブロックがあったらそこに宛先も記載されている。それで判定できる。

Mentionは、ログインしてないと見られない=見られるのはおひとり様サーバーのわたしだけ。


自分の投稿に対するLikeや、自分の投稿をブーストされたら、それらもリクエストが飛んでくる。

ご褒美とか承認欲求という言葉になるんだろうけど、ここは割りとどうでもいいので、それらのリクエストは受けた時点で破棄。

だいたい、こんなのはサイトのアクセスログを見ればわかることで、そっちの数字の方が確実だ。

本や雑誌でいうと、評価よりも実売部数、というのを肌身に染みて思い知らされてきたしね。


どうでもいいごたくを並べたけど。

こういったフロント側、閲覧側はかなりうっとーしーことがいろいろ。

タイムラインというからにはリアルタイムで表示を更新するのが当たり前。だけど、同期にしろ非同期にしろJavascriptなんかを使って閲覧してる裏でデータを確認取得しなきゃいけない。

飛んでくるリクエストを捌く、入口で門番をしてるスクリプトがあるのでデータが来たことはそれこそリアルタイムで検知している。

でもJavascriptは触りたくない。メンテが大変なのだ。どこが原因なのか特定するのにこっちまで見なきゃいけないのは労力に見合わない。

てことで、リアルタイム更新は却下。手動F5にした。


そんなオレオレAPサーバーは

「ため池」https://tokoroten.doncha.net/tameike.pl

絶賛壁打ち中です。

image


Noteの公開範囲についてはfedibird管理人ののえるさんの投稿

https://fedibird.com/@noellabo/110573926847901369

「ToにPublicが指定されていれば『公開』」

を参考にさせていただきました。ありがとうございます。

HTTP Signatureをlolipopレンタルサーバーで作成

2023/8/22 [09:42:59] (火) 天気

ActivityPubでPOSTするには電子署名が必要。

というエントリを書いたけど、WEBでサーバー同士でやりとりしたり、WEBサービスのAPIを利用したり、電子署名が必要なのはActivityPubに限らず。


ちらほら書いてきたように、lolipopレンタルサーバーにはperlで電子署名をする時によく使われるモジュール「Crypt::OpenSSL::RSA」がインストールされていない。

ということは。lolipopではHTTP Signatureを作ることができない「Cryptが使えないんじゃ話にならない」ということになる。


しょうがないんで、ローカルにcpanから「Crypt::OpenSSL::RSA」をインストールして、ActivityPubにPOSTする時はローカルのスクリプトを使う、という急場しのぎ。

これはこれで、投稿するのにひと手間あった方が事故も起こさなくていいかな、と思ってやってたんだけど、やっぱりサーバー上だけでやれるならラクちんなことは確か。


なもんで、グーグル先生にお願いしてみたら

「Crypt-Perl-0.38」https://metacpan.org/pod/Crypt::Perl

↑pure perlのCryptモジュールがあった。


インストール時にコンパイルが必要なモジュールはOSやファイル構成、環境に依存するけど、PurePerlというのはperlだけで作られているので、perlさえあればサーバーにそのままアップロードして使える。


さっそくダウンロードして展開。テストスクリプトで試したところ、依存関係で必要なモジュールがあったのでそいつらもダウンロードして展開。


Class-Accessor-0.51

Bytes-Random-Secure-Tiny-1.011

Convert-ASN1-0.34

Crypt-Format-0.12

(あと、たぶん以前amazonのAPIがらみでインストール済みのpure perlのDigest::SHAも必要)

当然ながら(?)これらのモジュールもpure perlなので、コンパイル不要、展開するだけで使える。


サーバーの適当なところ、例えば「lib」というディレクトリを作って展開したファイル群をアップロードするだけ。

lib/Bytes/

lib/Class/

lib/Convert/

lib/Crypt/

スクリプトでuse lib ’lib’などとやればlolipopレンタルサーバーでもCrypt RSAが使えるようになる。


いや。ぶっちゃけ。これらモジュールの作者のみなさんには大感謝。大袈裟じゃなく狂喜乱舞小躍りだった。ほんとうにありがとうございます。

マジperl使いすげー。perl話者が減ってるだろう昨今、凄腕のperl使いはワシントン条約で保護すべき存在。


使い方は「RSAモジュールで公開鍵と秘密鍵」とほぼ同じ。


秘密鍵を使う

my $privatekey = Crypt::Perl::RSA::Parse::private($private-pem);

公開鍵を使う

my $publickey = Crypt::Perl::RSA::Parse::public($public-pem);


Signatureを作る。

my $sign = $privatekey->sign_RS256($sign-str);
encode_base64($sign, "");

Signatureを検証する。

my $decoded = decode_base64($sign);
$publickey->verify_RS256($sign-str, $decoded);


あとは。

こうすると、思いつきから投稿放流までが直結するので、事故を起こさない自制心が必要となるです、はい。

image

ActivityPubサーバの終わらせ方

2023/8/15 [10:29:00] (火) 天気

おひとり様ActivityPubサーバーというか、最低限のオレオレAPサーバーを立ち上げた、のはいいけど、これの終わらせ方も調べないとダメ。

どんなアプリも起動方法と終了方法はマニュアルに必須の情報。


もうこのサーバーは終了しましたというお知らせを出せばいい、とのこと。


サーバー(サイト)へのアクセスに対して

「410 gone」(もう存在しません)を返す。


.htaccess

RewriteEngine On
RewriteRule .* - [G]

これで、サーバー(サイト)は終了しました、というお知らせになる。


いつまでこのお知らせを出せばいいのか。


特に決まりごとはない。

原則、サイトがある限りこの状態にすればいいということだけど。

このサイトはもう存在しませんよ、というのが周知されればOK…いや、周知されたかどうか知る方法はない。なので、根拠なく数ヶ月ぐらいでいいんじゃないか、とも言われている。


DNSの反映にしてもすべて行き渡るのにどのぐらいかかるのか知るよしもなしで、ネットがからむといきなり運任せというか神さまだけが知っている、という状態なのがメタな話で閑話休題(それはさておき)


サーバーのドメインを維持し続けるならともかく、サーバーもドメインも削除することもあるだろうし、その場合はその削除までのお知らせ掲載期間として数ヶ月もあればいいということかな。


サーバー(サイト)終了のお知らせが必要な理由は。


おひとり様APサーバーといっても、Fediverseに繋がることになる。

一度なんらかのアクションを起こすと、おひとり様APサーバーが、他のサーバーからリクエスト先として認識される。そうすると投稿やフォローはもちろん、各種Activityのために他のサーバーはリクエストを飛ばしてくる。


ところが、サーバー(サイト)をお知らせなしに終わらせると。

他のサーバーは存在しないサーバーがメンテで落ちてるのか本当になくなってるのかわからない。しょうがないんで、リクエストを再送しようとする。これが負荷になる。ネット全体に悪影響となる大きな負荷ではないんだろうけど、それでもチリツモ。

なので、ちゃんと終了のお知らせ掲載は必要。


どれだけの数のサーバーに繋がるのかは、それこそ神のみぞ知る領域。気軽手軽におひとり様APサーバーだっ!とか言ってもひとはひとりで生きるわけじゃない、とも。ActivityPubで繋がることの魅力でもあるし、そこに生じる責任とか、やらなければならないことの自覚も促されるところ、だ。

わたしみたいにミーハーな勢いだけでおひとり様オレオレAPサーバーとか言ってはしゃぐだけじゃダメです(自戒)

始めたものを終わらせる準備はしておく。


お盆だしね。

image


参考にさせていただいたサイト。

いつかサーバーを閉じるとき 〜お金をかけずに 410 を返す方法〜

あまり手間も費用もかけずに410 Goneを返してみる

RewriteRule Flags

サイトを完全に削除する方法

<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】