<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.gnusocial.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gnusocialjp</id>
	<title>GNU social JP Wiki - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gnusocial.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gnusocialjp"/>
	<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/Special:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Gnusocialjp"/>
	<updated>2026-04-25T18:13:27Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=589</id>
		<title>LY Corporation</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=589"/>
		<updated>2025-11-25T03:13:44Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* 非表示リスト・ブロックリスト・トークリスト */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Person]]&lt;br /&gt;
== About ==&lt;br /&gt;
LY Corporation (LINEヤフー株式会社) は日本の企業。もともとLINE社とヤフー社の別々企業が合併してできた会社。&lt;br /&gt;
&lt;br /&gt;
SNSとの関係では、Yahooニュースのコメント機能のYahooコメントとチャットアプリのLINEのサービスを提供しており、日本でのユーザーは多い。&lt;br /&gt;
&lt;br /&gt;
== Article ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/category/centralized/centralized-ly/ centralized/LY | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== LINE ==&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&lt;br /&gt;
==== 友だち ====&lt;br /&gt;
&lt;br /&gt;
===== 非表示・ブロック・削除 =====&lt;br /&gt;
* [https://news.mynavi.jp/article/20211025-2169252/ LINEで友だちを削除する方法 - ブロック削除と非表示削除の違い | マイナビニュース]&lt;br /&gt;
* [https://apprev.smt.docomo.ne.jp/article/440482/ 【LINE】ブロックするとどうなる？非表示・削除との違いも解説！ | NTTドコモ dアプリ＆レビュー]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/remove-friends.html 友だちを削除する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/block-friends.html 友だちをブロック／ブロック解除する方法｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEで友達追加後、その解除は複雑。単に、フォロー・フォロー解除という関係ではない。ややこしいので整理する。非表示と削除がフォロー解除に近い。&lt;br /&gt;
&lt;br /&gt;
* '''非表示/Hide'''：友だちリストやトーク画面、タイムラインに表示しない&lt;br /&gt;
* '''ブロック'''：相手からのトークや無料通話を受けない。相手にブロックの通知はない。&lt;br /&gt;
* '''削除'''：友だちリストに表示せず、相手からの通話は通知のみ受信。メッセージ履歴も消去。事前に非表示かブロックが必要。非表示+履歴削除。&lt;br /&gt;
&lt;br /&gt;
単に未読数が鬱陶しい場合は、非表示にすればよさそう。&lt;br /&gt;
&lt;br /&gt;
ミュートはまた別の機能。単に、push通知類をやめたい場合は、ミュート。未読数表示も嫌なら非表示。ただし、非表示はまた通知が来たら、再表示される模様。&lt;br /&gt;
&lt;br /&gt;
ブロックは履歴は残るが、通知がなくなる。削除は、履歴は消えるが、通知は受け取れる。&lt;br /&gt;
&lt;br /&gt;
[ホーム]-[友だちリスト]-[友だち]-ドラッグ-[削除] などで処理できる。&lt;br /&gt;
&lt;br /&gt;
===== 整理 =====&lt;br /&gt;
[https://guide.line.me/ja/features-and-columns/line-organize.html LINEがスッキリ！友だち・トークの整理術まとめ｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEの友だち機能はめちゃくちゃ使いにくい。&lt;br /&gt;
&lt;br /&gt;
[お気に入り] 以外グループ化できない。表示名を編集可能だから、基本は接頭辞をつけてそれで分類分けするしかない。&lt;br /&gt;
&lt;br /&gt;
===== ID/電話番号検索 =====&lt;br /&gt;
[https://help.line.me/line/smartphone/?contentId=20000372 友だちが追加できない | LINEヘルプセンター]&lt;br /&gt;
&lt;br /&gt;
デフォルトでは有効になっていたように思うが、設定がある。以下の設定が必要。&lt;br /&gt;
&lt;br /&gt;
* ID検索: [ホーム]-[設定]-[Profile/プロフィール]-[IDによる友だち追加を許可]&lt;br /&gt;
* 電話番号検索: [ホーム]-[設定]-[Frineds/友だち]-[Allow others to add me/友達への追加を許可]&lt;br /&gt;
&lt;br /&gt;
===== アバター・背景の保存 =====&lt;br /&gt;
[https://xn--line-e67f524q.com/entry/line-profile-photo-download-60 LINEのプロフィール画像をダウンロード（保存）方法！通知でバレるのかも解説｜LINEの使い方まとめ総合ガイド]&lt;br /&gt;
&lt;br /&gt;
保存機能はない。スクリーンショットを取得して保存するしかない。&lt;br /&gt;
&lt;br /&gt;
===== 友だちの表示名 =====&lt;br /&gt;
[https://guide.line.me/ja/friends-and-groups/changename-friends.html 友だちの表示名を変更する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
自分のLINE上での相手の表示名を変更できる。友達のグループ分けなどで重宝する。&lt;br /&gt;
&lt;br /&gt;
===== 非表示リスト・ブロックリスト・トークリスト =====&lt;br /&gt;
[https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [ホーム]-[設定]-[一般]&lt;br /&gt;
** [友だち]:  友達の非表示リスト、ブロックリストにアクセス可能。&lt;br /&gt;
** [トーク]: トークの非表示リストにアクセス可能。&lt;br /&gt;
&lt;br /&gt;
===== LINEの共有先から削除 =====&lt;br /&gt;
&lt;br /&gt;
* [https://www.luft.co.jp/media/and-how-to-change-their-order/ LINEの共有で出てくる人の仕組み・非表示設定・順番変更方法 | LUFTMEDIA]&lt;br /&gt;
* [https://tsla.hatenablog.com/entry/2025/06/29/183000 LINE共有(送信先を選択)で出てくる人を消したいときはどうする？原因・対策・バレる疑問も徹底解説！ - きになる～]&lt;br /&gt;
* [https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14269106964 LINEで友達を非表示にして削除しました。でも共有の画面には出てきま... - Yahoo!知恵袋]&lt;br /&gt;
&lt;br /&gt;
URLのリンクを共有する際に、LINEのユーザーやトークが候補に表示される。ここに、ブロック・非表示にしている相手も表示されるのが困る。&lt;br /&gt;
&lt;br /&gt;
どうやら、LINEでの直近のメッセージ相手を自動的に候補に出している模様。非表示にする方法がある。&lt;br /&gt;
&lt;br /&gt;
トーク履歴を参照しているようで、トークを削除すると非表示になる。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=588</id>
		<title>LY Corporation</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=588"/>
		<updated>2025-11-25T03:12:51Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: LINEの共有先から削除&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Person]]&lt;br /&gt;
== About ==&lt;br /&gt;
LY Corporation (LINEヤフー株式会社) は日本の企業。もともとLINE社とヤフー社の別々企業が合併してできた会社。&lt;br /&gt;
&lt;br /&gt;
SNSとの関係では、Yahooニュースのコメント機能のYahooコメントとチャットアプリのLINEのサービスを提供しており、日本でのユーザーは多い。&lt;br /&gt;
&lt;br /&gt;
== Article ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/category/centralized/centralized-ly/ centralized/LY | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== LINE ==&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&lt;br /&gt;
==== 友だち ====&lt;br /&gt;
&lt;br /&gt;
===== 非表示・ブロック・削除 =====&lt;br /&gt;
* [https://news.mynavi.jp/article/20211025-2169252/ LINEで友だちを削除する方法 - ブロック削除と非表示削除の違い | マイナビニュース]&lt;br /&gt;
* [https://apprev.smt.docomo.ne.jp/article/440482/ 【LINE】ブロックするとどうなる？非表示・削除との違いも解説！ | NTTドコモ dアプリ＆レビュー]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/remove-friends.html 友だちを削除する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/block-friends.html 友だちをブロック／ブロック解除する方法｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEで友達追加後、その解除は複雑。単に、フォロー・フォロー解除という関係ではない。ややこしいので整理する。非表示と削除がフォロー解除に近い。&lt;br /&gt;
&lt;br /&gt;
* '''非表示/Hide'''：友だちリストやトーク画面、タイムラインに表示しない&lt;br /&gt;
* '''ブロック'''：相手からのトークや無料通話を受けない。相手にブロックの通知はない。&lt;br /&gt;
* '''削除'''：友だちリストに表示せず、相手からの通話は通知のみ受信。メッセージ履歴も消去。事前に非表示かブロックが必要。非表示+履歴削除。&lt;br /&gt;
&lt;br /&gt;
単に未読数が鬱陶しい場合は、非表示にすればよさそう。&lt;br /&gt;
&lt;br /&gt;
ミュートはまた別の機能。単に、push通知類をやめたい場合は、ミュート。未読数表示も嫌なら非表示。ただし、非表示はまた通知が来たら、再表示される模様。&lt;br /&gt;
&lt;br /&gt;
ブロックは履歴は残るが、通知がなくなる。削除は、履歴は消えるが、通知は受け取れる。&lt;br /&gt;
&lt;br /&gt;
[ホーム]-[友だちリスト]-[友だち]-ドラッグ-[削除] などで処理できる。&lt;br /&gt;
&lt;br /&gt;
===== 整理 =====&lt;br /&gt;
[https://guide.line.me/ja/features-and-columns/line-organize.html LINEがスッキリ！友だち・トークの整理術まとめ｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEの友だち機能はめちゃくちゃ使いにくい。&lt;br /&gt;
&lt;br /&gt;
[お気に入り] 以外グループ化できない。表示名を編集可能だから、基本は接頭辞をつけてそれで分類分けするしかない。&lt;br /&gt;
&lt;br /&gt;
===== ID/電話番号検索 =====&lt;br /&gt;
[https://help.line.me/line/smartphone/?contentId=20000372 友だちが追加できない | LINEヘルプセンター]&lt;br /&gt;
&lt;br /&gt;
デフォルトでは有効になっていたように思うが、設定がある。以下の設定が必要。&lt;br /&gt;
&lt;br /&gt;
* ID検索: [ホーム]-[設定]-[Profile/プロフィール]-[IDによる友だち追加を許可]&lt;br /&gt;
* 電話番号検索: [ホーム]-[設定]-[Frineds/友だち]-[Allow others to add me/友達への追加を許可]&lt;br /&gt;
&lt;br /&gt;
===== アバター・背景の保存 =====&lt;br /&gt;
[https://xn--line-e67f524q.com/entry/line-profile-photo-download-60 LINEのプロフィール画像をダウンロード（保存）方法！通知でバレるのかも解説｜LINEの使い方まとめ総合ガイド]&lt;br /&gt;
&lt;br /&gt;
保存機能はない。スクリーンショットを取得して保存するしかない。&lt;br /&gt;
&lt;br /&gt;
===== 友だちの表示名 =====&lt;br /&gt;
[https://guide.line.me/ja/friends-and-groups/changename-friends.html 友だちの表示名を変更する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
自分のLINE上での相手の表示名を変更できる。友達のグループ分けなどで重宝する。&lt;br /&gt;
&lt;br /&gt;
===== 非表示リスト・ブロックリスト・トークリスト =====&lt;br /&gt;
&lt;br /&gt;
* [ホーム]-[設定]-[一般]&lt;br /&gt;
** [友だち]:  友達の非表示リスト、ブロックリストにアクセス可能。&lt;br /&gt;
** [トーク]: トークの非表示リストにアクセス可能。&lt;br /&gt;
&lt;br /&gt;
===== LINEの共有先から削除 =====&lt;br /&gt;
&lt;br /&gt;
* [https://www.luft.co.jp/media/and-how-to-change-their-order/ LINEの共有で出てくる人の仕組み・非表示設定・順番変更方法 | LUFTMEDIA]&lt;br /&gt;
* [https://tsla.hatenablog.com/entry/2025/06/29/183000 LINE共有(送信先を選択)で出てくる人を消したいときはどうする？原因・対策・バレる疑問も徹底解説！ - きになる～]&lt;br /&gt;
* [https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14269106964 LINEで友達を非表示にして削除しました。でも共有の画面には出てきま... - Yahoo!知恵袋]&lt;br /&gt;
&lt;br /&gt;
URLのリンクを共有する際に、LINEのユーザーやトークが候補に表示される。ここに、ブロック・非表示にしている相手も表示されるのが困る。&lt;br /&gt;
&lt;br /&gt;
どうやら、LINEでの直近のメッセージ相手を自動的に候補に出している模様。非表示にする方法がある。&lt;br /&gt;
&lt;br /&gt;
トーク履歴を参照しているようで、トークを削除すると非表示になる。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=587</id>
		<title>LY Corporation</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=587"/>
		<updated>2025-11-25T02:25:17Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: カテゴリー追加。&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Person]]&lt;br /&gt;
== About ==&lt;br /&gt;
LY Corporation (LINEヤフー株式会社) は日本の企業。もともとLINE社とヤフー社の別々企業が合併してできた会社。&lt;br /&gt;
&lt;br /&gt;
SNSとの関係では、Yahooニュースのコメント機能のYahooコメントとチャットアプリのLINEのサービスを提供しており、日本でのユーザーは多い。&lt;br /&gt;
&lt;br /&gt;
== Article ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/category/centralized/centralized-ly/ centralized/LY | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== LINE ==&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&lt;br /&gt;
==== 友だち ====&lt;br /&gt;
&lt;br /&gt;
===== 非表示・ブロック・削除 =====&lt;br /&gt;
* [https://news.mynavi.jp/article/20211025-2169252/ LINEで友だちを削除する方法 - ブロック削除と非表示削除の違い | マイナビニュース]&lt;br /&gt;
* [https://apprev.smt.docomo.ne.jp/article/440482/ 【LINE】ブロックするとどうなる？非表示・削除との違いも解説！ | NTTドコモ dアプリ＆レビュー]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/remove-friends.html 友だちを削除する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/block-friends.html 友だちをブロック／ブロック解除する方法｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEで友達追加後、その解除は複雑。単に、フォロー・フォロー解除という関係ではない。ややこしいので整理する。非表示と削除がフォロー解除に近い。&lt;br /&gt;
&lt;br /&gt;
* '''非表示/Hide'''：友だちリストやトーク画面、タイムラインに表示しない&lt;br /&gt;
* '''ブロック'''：相手からのトークや無料通話を受けない。相手にブロックの通知はない。&lt;br /&gt;
* '''削除'''：友だちリストに表示せず、相手からの通話は通知のみ受信。メッセージ履歴も消去。事前に非表示かブロックが必要。非表示+履歴削除。&lt;br /&gt;
&lt;br /&gt;
単に未読数が鬱陶しい場合は、非表示にすればよさそう。&lt;br /&gt;
&lt;br /&gt;
ミュートはまた別の機能。単に、push通知類をやめたい場合は、ミュート。未読数表示も嫌なら非表示。ただし、非表示はまた通知が来たら、再表示される模様。&lt;br /&gt;
&lt;br /&gt;
ブロックは履歴は残るが、通知がなくなる。削除は、履歴は消えるが、通知は受け取れる。&lt;br /&gt;
&lt;br /&gt;
[ホーム]-[友だちリスト]-[友だち]-ドラッグ-[削除] などで処理できる。&lt;br /&gt;
&lt;br /&gt;
===== 整理 =====&lt;br /&gt;
[https://guide.line.me/ja/features-and-columns/line-organize.html LINEがスッキリ！友だち・トークの整理術まとめ｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEの友だち機能はめちゃくちゃ使いにくい。&lt;br /&gt;
&lt;br /&gt;
[お気に入り] 以外グループ化できない。表示名を編集可能だから、基本は接頭辞をつけてそれで分類分けするしかない。&lt;br /&gt;
&lt;br /&gt;
===== ID/電話番号検索 =====&lt;br /&gt;
[https://help.line.me/line/smartphone/?contentId=20000372 友だちが追加できない | LINEヘルプセンター]&lt;br /&gt;
&lt;br /&gt;
デフォルトでは有効になっていたように思うが、設定がある。以下の設定が必要。&lt;br /&gt;
&lt;br /&gt;
* ID検索: [ホーム]-[設定]-[Profile/プロフィール]-[IDによる友だち追加を許可]&lt;br /&gt;
* 電話番号検索: [ホーム]-[設定]-[Frineds/友だち]-[Allow others to add me/友達への追加を許可]&lt;br /&gt;
&lt;br /&gt;
===== アバター・背景の保存 =====&lt;br /&gt;
[https://xn--line-e67f524q.com/entry/line-profile-photo-download-60 LINEのプロフィール画像をダウンロード（保存）方法！通知でバレるのかも解説｜LINEの使い方まとめ総合ガイド]&lt;br /&gt;
&lt;br /&gt;
保存機能はない。スクリーンショットを取得して保存するしかない。&lt;br /&gt;
&lt;br /&gt;
===== 友だちの表示名 =====&lt;br /&gt;
[https://guide.line.me/ja/friends-and-groups/changename-friends.html 友だちの表示名を変更する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
自分のLINE上での相手の表示名を変更できる。友達のグループ分けなどで重宝する。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=586</id>
		<title>LY Corporation</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=586"/>
		<updated>2025-11-17T06:26:28Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: 友だちの表示名&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
LY Corporation (LINEヤフー株式会社) はにほんの企業。もともとLINE社とヤフー社の別々企業が合併してできた会社。&lt;br /&gt;
&lt;br /&gt;
SNSとの関係では、Yahooニュースのコメント機能のYahooコメントとチャットアプリのLINEのサービスを提供しており、日本でのユーザーは多い。&lt;br /&gt;
&lt;br /&gt;
== Article ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/category/centralized/centralized-ly/ centralized/LY | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== LINE ==&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&lt;br /&gt;
==== 友だち ====&lt;br /&gt;
&lt;br /&gt;
===== 非表示・ブロック・削除 =====&lt;br /&gt;
* [https://news.mynavi.jp/article/20211025-2169252/ LINEで友だちを削除する方法 - ブロック削除と非表示削除の違い | マイナビニュース]&lt;br /&gt;
* [https://apprev.smt.docomo.ne.jp/article/440482/ 【LINE】ブロックするとどうなる？非表示・削除との違いも解説！ | NTTドコモ dアプリ＆レビュー]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/remove-friends.html 友だちを削除する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/block-friends.html 友だちをブロック／ブロック解除する方法｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEで友達追加後、その解除は複雑。単に、フォロー・フォロー解除という関係ではない。ややこしいので整理する。非表示と削除がフォロー解除に近い。&lt;br /&gt;
&lt;br /&gt;
* '''非表示/Hide'''：友だちリストやトーク画面、タイムラインに表示しない&lt;br /&gt;
* '''ブロック'''：相手からのトークや無料通話を受けない。相手にブロックの通知はない。&lt;br /&gt;
* '''削除'''：友だちリストに表示せず、相手からの通話は通知のみ受信。メッセージ履歴も消去。事前に非表示かブロックが必要。非表示+履歴削除。&lt;br /&gt;
&lt;br /&gt;
単に未読数が鬱陶しい場合は、非表示にすればよさそう。&lt;br /&gt;
&lt;br /&gt;
ミュートはまた別の機能。単に、push通知類をやめたい場合は、ミュート。未読数表示も嫌なら非表示。ただし、非表示はまた通知が来たら、再表示される模様。&lt;br /&gt;
&lt;br /&gt;
ブロックは履歴は残るが、通知がなくなる。削除は、履歴は消えるが、通知は受け取れる。&lt;br /&gt;
&lt;br /&gt;
[ホーム]-[友だちリスト]-[友だち]-ドラッグ-[削除] などで処理できる。&lt;br /&gt;
&lt;br /&gt;
===== 整理 =====&lt;br /&gt;
[https://guide.line.me/ja/features-and-columns/line-organize.html LINEがスッキリ！友だち・トークの整理術まとめ｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEの友だち機能はめちゃくちゃ使いにくい。&lt;br /&gt;
&lt;br /&gt;
[お気に入り] 以外グループ化できない。表示名を編集可能だから、基本は接頭辞をつけてそれで分類分けするしかない。&lt;br /&gt;
&lt;br /&gt;
===== ID/電話番号検索 =====&lt;br /&gt;
[https://help.line.me/line/smartphone/?contentId=20000372 友だちが追加できない | LINEヘルプセンター]&lt;br /&gt;
&lt;br /&gt;
デフォルトでは有効になっていたように思うが、設定がある。以下の設定が必要。&lt;br /&gt;
&lt;br /&gt;
* ID検索: [ホーム]-[設定]-[Profile/プロフィール]-[IDによる友だち追加を許可]&lt;br /&gt;
* 電話番号検索: [ホーム]-[設定]-[Frineds/友だち]-[Allow others to add me/友達への追加を許可]&lt;br /&gt;
&lt;br /&gt;
===== アバター・背景の保存 =====&lt;br /&gt;
[https://xn--line-e67f524q.com/entry/line-profile-photo-download-60 LINEのプロフィール画像をダウンロード（保存）方法！通知でバレるのかも解説｜LINEの使い方まとめ総合ガイド]&lt;br /&gt;
&lt;br /&gt;
保存機能はない。スクリーンショットを取得して保存するしかない。&lt;br /&gt;
&lt;br /&gt;
===== 友だちの表示名 =====&lt;br /&gt;
[https://guide.line.me/ja/friends-and-groups/changename-friends.html 友だちの表示名を変更する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
自分のLINE上での相手の表示名を変更できる。友達のグループ分けなどで重宝する。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=585</id>
		<title>LY Corporation</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=585"/>
		<updated>2025-11-17T06:10:25Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: 整理&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
LY Corporation (LINEヤフー株式会社) はにほんの企業。もともとLINE社とヤフー社の別々企業が合併してできた会社。&lt;br /&gt;
&lt;br /&gt;
SNSとの関係では、Yahooニュースのコメント機能のYahooコメントとチャットアプリのLINEのサービスを提供しており、日本でのユーザーは多い。&lt;br /&gt;
&lt;br /&gt;
== Article ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/category/centralized/centralized-ly/ centralized/LY | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== LINE ==&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&lt;br /&gt;
==== 友だち ====&lt;br /&gt;
&lt;br /&gt;
===== 非表示・ブロック・削除 =====&lt;br /&gt;
* [https://news.mynavi.jp/article/20211025-2169252/ LINEで友だちを削除する方法 - ブロック削除と非表示削除の違い | マイナビニュース]&lt;br /&gt;
* [https://apprev.smt.docomo.ne.jp/article/440482/ 【LINE】ブロックするとどうなる？非表示・削除との違いも解説！ | NTTドコモ dアプリ＆レビュー]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/remove-friends.html 友だちを削除する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/block-friends.html 友だちをブロック／ブロック解除する方法｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEで友達追加後、その解除は複雑。単に、フォロー・フォロー解除という関係ではない。ややこしいので整理する。非表示と削除がフォロー解除に近い。&lt;br /&gt;
&lt;br /&gt;
* '''非表示/Hide'''：友だちリストやトーク画面、タイムラインに表示しない&lt;br /&gt;
* '''ブロック'''：相手からのトークや無料通話を受けない。相手にブロックの通知はない。&lt;br /&gt;
* '''削除'''：友だちリストに表示せず、相手からの通話は通知のみ受信。メッセージ履歴も消去。事前に非表示かブロックが必要。非表示+履歴削除。&lt;br /&gt;
&lt;br /&gt;
単に未読数が鬱陶しい場合は、非表示にすればよさそう。&lt;br /&gt;
&lt;br /&gt;
ミュートはまた別の機能。単に、push通知類をやめたい場合は、ミュート。未読数表示も嫌なら非表示。ただし、非表示はまた通知が来たら、再表示される模様。&lt;br /&gt;
&lt;br /&gt;
ブロックは履歴は残るが、通知がなくなる。削除は、履歴は消えるが、通知は受け取れる。&lt;br /&gt;
&lt;br /&gt;
[ホーム]-[友だちリスト]-[友だち]-ドラッグ-[削除] などで処理できる。&lt;br /&gt;
&lt;br /&gt;
===== 整理 =====&lt;br /&gt;
[https://guide.line.me/ja/features-and-columns/line-organize.html LINEがスッキリ！友だち・トークの整理術まとめ｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEの友だち機能はめちゃくちゃ使いにくい。&lt;br /&gt;
&lt;br /&gt;
[お気に入り] 以外グループ化できない。表示名を編集可能だから、基本は接頭辞をつけてそれで分類分けするしかない。&lt;br /&gt;
&lt;br /&gt;
===== ID/電話番号検索 =====&lt;br /&gt;
[https://help.line.me/line/smartphone/?contentId=20000372 友だちが追加できない | LINEヘルプセンター]&lt;br /&gt;
&lt;br /&gt;
デフォルトでは有効になっていたように思うが、設定がある。以下の設定が必要。&lt;br /&gt;
&lt;br /&gt;
* ID検索: [ホーム]-[設定]-[Profile/プロフィール]-[IDによる友だち追加を許可]&lt;br /&gt;
* 電話番号検索: [ホーム]-[設定]-[Frineds/友だち]-[Allow others to add me/友達への追加を許可]&lt;br /&gt;
&lt;br /&gt;
===== アバター・背景の保存 =====&lt;br /&gt;
[https://xn--line-e67f524q.com/entry/line-profile-photo-download-60 LINEのプロフィール画像をダウンロード（保存）方法！通知でバレるのかも解説｜LINEの使い方まとめ総合ガイド]&lt;br /&gt;
&lt;br /&gt;
保存機能はない。スクリーンショットを取得して保存するしかない。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=584</id>
		<title>Imgur</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=584"/>
		<updated>2025-11-12T14:30:33Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Favorite hidden post */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Imgur (イミジャー？) ([https://imgur.com/ Imgur: The magic of the Internet]) は画像共有SNS ([https://web.gnusocial.jp/post/2024/03/06/10426/ 役務: 容量無制限・永続保存で世界的に人気の画像共有サービスImgurは資料の保存・共有に非常に有用 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
日本では画像アップロード先として、掲示板サイトなどでよく使われている。が、Instagramのような画像共有SNSというのが運営側の主張。&lt;br /&gt;
&lt;br /&gt;
海外で人気の掲示板サイトのRedditに画像アップローダーがなかったため、主にRedditでの画像共有のために始まったとされている。2009年にサービスが開始し、現在は世界的に有名で人気の画像共有サービスとなっている。&lt;br /&gt;
&lt;br /&gt;
なお、2023年5月の更新で、ポルノ画像の削除が規約に盛り込まれた。それまでは、外部参照先として、ボルノ・エロ画像もアップロードが可能だった。同時に、アカウントなしで匿名アップロードした場合、アップロード画像が削除対象になるとも明記された。&lt;br /&gt;
&lt;br /&gt;
「[https://apptopi.jp/2021/11/30/imgur/ Imgur（イミジャー）って知ってる？便利な使い方を徹底解説！ | APPTOPI]」&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
Instagramも似たような画像共有機能として使うこともできるが、以下2点がImgurの特徴。&lt;br /&gt;
&lt;br /&gt;
* 匿名性&lt;br /&gt;
* Webでのフォルダー分け&lt;br /&gt;
&lt;br /&gt;
Instagramだと画像がユーザーアカウント連携され、アップロード者がすぐに分かる。また、スマートフォンアプリを優遇していて、分類分け機能のCollectionはWebからは使えない。外部アップローダーというよりかは、コミュニケーション機能を重視した設計になっている。&lt;br /&gt;
&lt;br /&gt;
人気の秘訣がアップロード画像の制限。以下の上限はあるものの、それ以外は無制限にアップロードが可能。&lt;br /&gt;
&lt;br /&gt;
* 1時間50ファイルまで&lt;br /&gt;
* 1ファイル上限20 MB&lt;br /&gt;
&lt;br /&gt;
高品質の写真などでなければ、無制限に利用可能なアップローダーとしても利用できる。&lt;br /&gt;
&lt;br /&gt;
画像アップロード時には、公開・非公開を選択でき、非公開にすると、リンクを知っている人だけが閲覧可能になる。非公開だとURLからアップロード者は特定不能になっている。&lt;br /&gt;
&lt;br /&gt;
なお、Web UIはいくつか問題がある模様。&lt;br /&gt;
&lt;br /&gt;
* マイページの [Post] にPublic/Hiddenで可視性に応じたタブがあるがこれはうまく機能していない模様。&lt;br /&gt;
* 他のユーザーのマイページを開いても [Post] がうまく表示されるとは限らない。&lt;br /&gt;
* フォルダー分け (Favorite) は1画像1カテゴリーのみ。&lt;br /&gt;
&lt;br /&gt;
上記制約があるので、基本はFavoriteで画像を分類分けして管理する使い方になると思われる。Favoriteは非公開にもできる。アップロード画像をpublic/hiddenを繰り返したりすると、うまく反映されることがあるが、あまりあてにしないほうがいい。アプリだと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
指定画像URLの保存や、動画・アニメーションgifの作成機能などもあり、WebArchiveで保存できない画像や、スクリーンショットでの一種の魚拓、データ保存サービスとしてかなり有用だと思われる。&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
Publicで投稿するとタイトルを変更できない。Privateにしたらタイトルを変更可能になる。一時的にPrivateにしてPublicに戻すと良い。パーマリンクも同じまま。&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
==== Bulk ====&lt;br /&gt;
[https://www.reddit.com/r/redditisfun/comments/2otj8s/batch_download_images_on_a_imgur_gallery_page/ Batch download images on a imgur gallery page? : r/redditisfun]&lt;br /&gt;
&lt;br /&gt;
アルバム・1個の投稿に添付された画像を一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
クラシックモードに切り替えて、アルバムを表示すると、右側に [Download post] が表示される。これを選ぶとzip形式で一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
=== Post ===&lt;br /&gt;
&lt;br /&gt;
==== Public+Hidden ====&lt;br /&gt;
投稿の可視性としてpublic/hiddenを選べる。公開後にいつでも切替可能。それぞれ利点と欠点がる。&lt;br /&gt;
&lt;br /&gt;
* public: コメント可能。第三者から投稿者特定可能。全体タイムラインに流れるので人目につきやすい。ただし、人目につくことが多いと、個人情報など少しでも問題ありそうな投稿だと通報されて、banくらう確率が上がる。また、公開後に画像を追加できない。descriptionの投稿が可能？投稿全体の説明をかける。&lt;br /&gt;
* hidden: コメント不能。リンクを知っている人だけアクセス可能。第三者から投稿者特定不能。たぶん検索にもヒットしない。公開後に画像追加可能。descriptionがない。最初の画像のキャプションに説明を書くことで代用可能。&lt;br /&gt;
&lt;br /&gt;
publicだと画像を後から追加できないのが、アルバム的に使うなら困るかも。publicは一般的なSNSみたいな感じ。公開後変更不能。&lt;br /&gt;
&lt;br /&gt;
ただ、hiddenのほうが使いやすいと思う。&lt;br /&gt;
&lt;br /&gt;
==== Favorite hidden post ====&lt;br /&gt;
非公開 (hidden) で投稿した投稿をお気に入りでまとめて管理したいことがある。&lt;br /&gt;
&lt;br /&gt;
iOSアプリだとhidden postもお気に入りに登録するボタンがあるのだけど、デスクトップだとクラシックUIでもお気に入りボタンがない。APIを使えばたぶんできるのだろうけど。&lt;br /&gt;
&lt;br /&gt;
使いにくいが、アップロード後にアプリでお気に入りに追加して、フォルダー分けするのがよさそう。&lt;br /&gt;
&lt;br /&gt;
いや、誤解だった。MacのGoogle Chromeだとうまく表示されていないだけだった。MacのFirefoxならハートマークが表示されていて、ちゃんとお気に入り登録できるようになっていた。Imgurを使うときはFirefoxでやればよさそう。&lt;br /&gt;
&lt;br /&gt;
いや、やっぱりだめだった。以下のようなブックマークレットを用意して、これでapi経由で一旦お気に入りに登録できる。&lt;br /&gt;
 javascript:(() =&amp;gt; {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; let clientId = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; let postId = location.href.replace(/.*[-/]/, &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; let url = '&amp;lt;nowiki&amp;gt;https://api.imgur.com/post/v1/albums/'&amp;lt;/nowiki&amp;gt; + postId + '/favorite?client_id=' + clientId;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; fetch(url, {method: 'POST', credentials: 'include'});&lt;br /&gt;
 })();&lt;br /&gt;
一回お気に入りに登録したら、自分でカテゴリー分けできる。&lt;br /&gt;
&lt;br /&gt;
い&lt;br /&gt;
&lt;br /&gt;
==== Comment ====&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26480452090779-Post-Privacy-Settings Post Privacy Settings – imgur]&lt;br /&gt;
&lt;br /&gt;
非公開投稿にすると、コメントできない。できるとしたら、画像の説明のみ。非公開で、投稿全体にコメントしたいならば、最初の画像に説明を書くとよさそう。&lt;br /&gt;
&lt;br /&gt;
== Account ==&lt;br /&gt;
&lt;br /&gt;
=== Delete an Account ===&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26513357802651-Delete-an-Account Delete an Account – imgur]&lt;br /&gt;
&lt;br /&gt;
アカウントを削除すると、ユーザー名が解放されて他のユーザーも使用可能になる。&lt;br /&gt;
&lt;br /&gt;
[Settings]-[Delete my account] で完了。&lt;br /&gt;
&lt;br /&gt;
一度削除すると、同じメールアドレスは使えない？Twitter/XやGoogleアカウントでのログインはできなかった。Apple IDでのログインはできた。&lt;br /&gt;
&lt;br /&gt;
=== Ban ===&lt;br /&gt;
一般公開で画像を投稿すると、他のユーザーも簡単に見えるようになる。看板などであったとしても、電話番号などがあると、通報されてすぐにアカウント凍結される。&lt;br /&gt;
&lt;br /&gt;
凍結されると、新規投稿ができなくなる。&lt;br /&gt;
&lt;br /&gt;
Imgurの使い方としては、基本的に匿名・非公開で常に投稿して、アップローダーとして使うのがいい、人目につかないので、通報される心配も減る。&lt;br /&gt;
&lt;br /&gt;
Banされても全投稿削除して問い合わせに問い合わせてもだめ。アカウント削除して作り直すしかないと思われる。&lt;br /&gt;
&lt;br /&gt;
=== My page ===&lt;br /&gt;
アカウントを作ると、以下のマイページが付与される。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://imgur.com/user/&amp;lt;/nowiki&amp;gt;[username]&lt;br /&gt;
* https://[username].imgur.com&lt;br /&gt;
&lt;br /&gt;
1個目のサブディレクトリーが基本の模様。ただ、Web版からだと若干操作感、機能が違う。例えば、Banされたサブディレクトリーのほうだと、ページを開かないと削除ができず、ページにアクセスできないので削除できない。サブドメインだとページを直接開かなくても、メニューのサブ項目から削除できた。&lt;br /&gt;
&lt;br /&gt;
=== Old Design/Classic UI ===&lt;br /&gt;
Imgurは2024年くらいからUIがモダンになっている。が、モダンUIだと、パソコンからだとお気に入りや一括ダウンロードなど機能が限定される。&lt;br /&gt;
&lt;br /&gt;
昔のURL (https://&amp;amp;#x5B;username&amp;amp;#x5D;.imgur.com) にアクセスするほか、Old Design (クラシックUI) に切り替えることができる。&lt;br /&gt;
&lt;br /&gt;
# ログイン後右上の自分のアバターを選ぶ (https://imgur.com/user/&amp;amp;#x5B;username&amp;amp;#x5D;).&lt;br /&gt;
# 右下の [Use Old Design] を選ぶ。&lt;br /&gt;
&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=583</id>
		<title>LY Corporation</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=583"/>
		<updated>2025-11-10T09:49:47Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: アバター・背景の保存&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
LY Corporation (LINEヤフー株式会社) はにほんの企業。もともとLINE社とヤフー社の別々企業が合併してできた会社。&lt;br /&gt;
&lt;br /&gt;
SNSとの関係では、Yahooニュースのコメント機能のYahooコメントとチャットアプリのLINEのサービスを提供しており、日本でのユーザーは多い。&lt;br /&gt;
&lt;br /&gt;
== Article ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/category/centralized/centralized-ly/ centralized/LY | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== LINE ==&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&lt;br /&gt;
==== 非表示・ブロック・削除 ====&lt;br /&gt;
&lt;br /&gt;
* [https://news.mynavi.jp/article/20211025-2169252/ LINEで友だちを削除する方法 - ブロック削除と非表示削除の違い | マイナビニュース]&lt;br /&gt;
* [https://apprev.smt.docomo.ne.jp/article/440482/ 【LINE】ブロックするとどうなる？非表示・削除との違いも解説！ | NTTドコモ dアプリ＆レビュー]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/remove-friends.html 友だちを削除する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/block-friends.html 友だちをブロック／ブロック解除する方法｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEで友達追加後、その解除は複雑。単に、フォロー・フォロー解除という関係ではない。ややこしいので整理する。非表示と削除がフォロー解除に近い。&lt;br /&gt;
&lt;br /&gt;
* '''非表示/Hide'''：友だちリストやトーク画面、タイムラインに表示しない&lt;br /&gt;
* '''ブロック'''：相手からのトークや無料通話を受けない。相手にブロックの通知はない。&lt;br /&gt;
* '''削除'''：友だちリストに表示せず、相手からの通話は通知のみ受信。メッセージ履歴も消去。事前に非表示かブロックが必要。&lt;br /&gt;
&lt;br /&gt;
単に未読数が鬱陶しい場合は、非表示にすればよさそう。&lt;br /&gt;
&lt;br /&gt;
ミュートはまた別の機能。単に、push通知類をやめたい場合は、ミュート。未読数表示も嫌なら非表示。ただし、非表示はまた通知が来たら、再表示される模様。&lt;br /&gt;
&lt;br /&gt;
ブロックは履歴は残るが、通知がなくなる。削除は、履歴は消えるが、通知は受け取れる。&lt;br /&gt;
&lt;br /&gt;
==== ID/電話番号検索 ====&lt;br /&gt;
[https://help.line.me/line/smartphone/?contentId=20000372 友だちが追加できない | LINEヘルプセンター]&lt;br /&gt;
&lt;br /&gt;
デフォルトでは有効になっていたように思うが、設定がある。以下の設定が必要。&lt;br /&gt;
&lt;br /&gt;
* ID検索: [ホーム]-[設定]-[Profile/プロフィール]-[IDによる友だち追加を許可]&lt;br /&gt;
* 電話番号検索: [ホーム]-[設定]-[Frineds/友だち]-[Allow others to add me/友達への追加を許可]&lt;br /&gt;
&lt;br /&gt;
==== アバター・背景の保存 ====&lt;br /&gt;
[https://xn--line-e67f524q.com/entry/line-profile-photo-download-60 LINEのプロフィール画像をダウンロード（保存）方法！通知でバレるのかも解説｜LINEの使い方まとめ総合ガイド]&lt;br /&gt;
&lt;br /&gt;
保存機能はない。スクリーンショットを取得して保存するしかない。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=X&amp;diff=582</id>
		<title>X</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=X&amp;diff=582"/>
		<updated>2025-08-08T11:26:43Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* 最古検索 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
旧Twitter。&lt;br /&gt;
&lt;br /&gt;
== Link ==&lt;br /&gt;
&lt;br /&gt;
* [https://marketing.twitter.com/ja/insights/kakusan 世界初公開｜「#拡散の科学」なぜ人はリツイートするのか？]&lt;br /&gt;
* https://x.com/Etype_mag/status/1859173932332613843 [https://type.jp/et/feature/27221/ 【独占】イーロン買収後の激動、日本初の開発拠点立ち上げの思惑とは？ X日本法人代表・松山歩が明かす - エンジニアtype | 転職type]&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
X/Twitter関係でアクセスの多い役務関係の記事が以下となっている。&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/28/9050/ 役務: X/Twitterのデータ一括ダウンロードCLI/GUIツールtwmd (twitter-media-downloader) | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2024/02/03/10046/ 役務: X/Twitterの匿名閲覧・RSS提供サービスNitterの終了？ | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
特に、Nitterは主要なメディアでの報道がないものの、潜在的なユーザーが多いようで、アクセスが多かった。&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
Ref: [https://developer.twitter.com/ja/docs/basics/authentication/overview/oauth OAuth with the Twitter API | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
Twitter APIを使う場合、まず認証が必要になる。OAuth 2.0ベースだが、いくつか方式がある。&lt;br /&gt;
&lt;br /&gt;
# Application-only authentication: OAuth2 (bearer token): アプリで認証するケース。&lt;br /&gt;
# Application-user authentication: OAuth 1a (access token for user context): ユーザーで認証するケース。3-legged-OAuthを使用。&lt;br /&gt;
&lt;br /&gt;
1番目は全体で共有する感じ。単独アプリなどで使う。レート制限などを緩和するために、サーバーアプリで、登録ユーザー別に、認証したいなら後者を使ったほうがいい。&lt;br /&gt;
&lt;br /&gt;
==== OAuth 1.0a ====&lt;br /&gt;
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a OAuth 1.0a | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
以下の情報を使う。&lt;br /&gt;
&lt;br /&gt;
* oauth_consumer_key/secret: アプリの認証情報。アクセストークンの取得に使用。API Key、アプリキーなどとも呼ばれる。&lt;br /&gt;
* oauth_token/secret: アクセストークン。ユーザーが自分のアカウントにAPI経由でのアクセスに使用。実質的なパスワード。&lt;br /&gt;
&lt;br /&gt;
consumer_key/secretは、開発者がX Developer Platformから事前に発行して取得しておく必要がある。oauth_token/secretは実装後にユーザーがアプリ操作で取得する感じになる。&lt;br /&gt;
&lt;br /&gt;
アクセストークンを実際に取得する際のリクエストは以下のようなイメージ。&lt;br /&gt;
 curl --request POST \&lt;br /&gt;
   --url '&amp;lt;nowiki&amp;gt;https://api.twitter.com/1.1/statuses/update.json?status=Hello%20world'&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   --header 'authorization: OAuth oauth_consumer_key=&amp;quot;CONSUMER_API_KEY&amp;quot;, oauth_nonce=&amp;quot;OAUTH_NONCE&amp;quot;, oauth_signature=&amp;quot;OAUTH_SIGNATURE&amp;quot;, oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;, oauth_timestamp=&amp;quot;OAUTH_TIMESTAMP&amp;quot;, oauth_token=&amp;quot;ACCESS_TOKEN&amp;quot;, oauth_version=&amp;quot;1.0&amp;quot;' \&lt;br /&gt;
&lt;br /&gt;
===== API Key and Secret =====&lt;br /&gt;
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/api-key-and-secret API Key and Secret | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
Consumer Key/Secretを取得する。開発者アカウントにログインして、アプリのプロジェクトを作成すると表示される。これを控えておく。&lt;br /&gt;
&lt;br /&gt;
===== User Access Tokens (3-legged OAuth flow) =====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://cdn.cms-twdigitalassets.com/content/dam/developer-twitter/docs/obtaining-access-tokens.png.twimg.1920.png User Access Tokens (3-legged OAuth flow) | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/obtaining-user-access-tokens ユーザーアクセストークンの取得（3レッグ認証OAuth） | Docs | Twitter Developer Platform]&lt;br /&gt;
&lt;br /&gt;
3-legged OAuth flowをに従って、ユーザーにアクセストークンの取得を行える。ここが重要。Twitterでのログインとほぼ同じ手順。&lt;br /&gt;
&lt;br /&gt;
====== 1 POST oauth/request_token ======&lt;br /&gt;
まずコンシューマーキーを使って、アクセストークンを要請する。&lt;br /&gt;
&lt;br /&gt;
* oauth_callback&lt;br /&gt;
* oauth_consumer_key&lt;br /&gt;
&lt;br /&gt;
応答200で以下のパラメーターがボディーにあるので、これを後続の処理で使用する。&lt;br /&gt;
&lt;br /&gt;
* oauth_token&lt;br /&gt;
* oauth_token_secret&lt;br /&gt;
* oauth_callback_confirmed&lt;br /&gt;
なお、OAuth関係のリクエスト送信時には、&lt;br /&gt;
&lt;br /&gt;
oauth_nonce=&amp;quot;OAUTH_NONCE&amp;quot;, oauth_signature=&amp;quot;OAUTH_SIGNATURE&amp;quot;, oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;, oauth_timestamp=&amp;quot;OAUTH_TIMESTAMP&amp;quot;, oauth_token=&amp;quot;ACCESS_TOKEN&amp;quot;, oauth_version=&amp;quot;1.0&amp;quot;' \&lt;br /&gt;
&lt;br /&gt;
の情報も必要な模様。&lt;br /&gt;
&lt;br /&gt;
====== 2 GET oauth/authorize ======&lt;br /&gt;
1で取得したoauth_tokenを使って、GETする。&lt;br /&gt;
&lt;br /&gt;
https://api.twitter.com/oauth/authorize?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&lt;br /&gt;
&lt;br /&gt;
すると、1でoauth_callbackdで指定したURLにリダイレクトされて、URLクエリーにパラメーターがついてくる。&lt;br /&gt;
&lt;br /&gt;
https://yourCallbackUrl.com?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&amp;amp;oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY&lt;br /&gt;
&lt;br /&gt;
====== 3 POST oauth/access_token ======&lt;br /&gt;
最後にアクセストークンを取得する。&lt;br /&gt;
&lt;br /&gt;
* POST /oauth/access_token&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
応答本体に以下が返ってくる。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以後は上記をリクエストで使う。&lt;br /&gt;
&lt;br /&gt;
===== Authorizing a request =====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/authorizing-a-request Authorizing a request | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://qiita.com/kerupani129/items/ee9d894cc67101f16c3f OAuth 1.0a 認証の実装 (Twitter API 用) #Twitter - Qiita]&lt;br /&gt;
* [https://note.com/tkhm_dev/n/n152ea1b08b8d Twitter APIをcurlで呼び出す場合のSignatureの生成｜tkhm]&lt;br /&gt;
&lt;br /&gt;
X/TwitterはシンプルHTTPでAPI呼び出しがベース。&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1&lt;br /&gt;
Accept: */*&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: OAuth gem v0.4.4&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Content-Length: 76&lt;br /&gt;
Host: api.twitter.com&lt;br /&gt;
&lt;br /&gt;
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ただし、これに加えて以下の情報がないと、無効扱いになる。&lt;br /&gt;
&lt;br /&gt;
* アプリ。&lt;br /&gt;
* ユーザー。&lt;br /&gt;
* 権限。&lt;br /&gt;
* 改竄。&lt;br /&gt;
&lt;br /&gt;
上記の情報をリクエストに付与するために、OAuth 1.0aプロトコルを採用している。具体的には、上記の情報を付与する、追加のHTTP Authorizationヘッダーがあればよい。具体的には以下となる。&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1&lt;br /&gt;
Accept: */*&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: OAuth gem v0.4.4&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Authorization:&lt;br /&gt;
OAuth oauth_consumer_key=&amp;quot;xvz1evFS4wEEPTGEFPHBog&amp;quot;,&lt;br /&gt;
oauth_nonce=&amp;quot;kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg&amp;quot;,&lt;br /&gt;
oauth_signature=&amp;quot;tnnArxj06cWHq44gCs1OSKk%2FjLY%3D&amp;quot;,&lt;br /&gt;
oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;,&lt;br /&gt;
oauth_timestamp=&amp;quot;1318622958&amp;quot;,&lt;br /&gt;
oauth_token=&amp;quot;370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb&amp;quot;,&lt;br /&gt;
oauth_version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
Content-Length: 76&lt;br /&gt;
Host: api.twitter.com&lt;br /&gt;
&lt;br /&gt;
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Authorizationヘッダーは実際には一行。&lt;br /&gt;
&lt;br /&gt;
この署名プロセスが過度な場合、Web Intentsを使ったほうが簡単。&lt;br /&gt;
&lt;br /&gt;
パラメーターは以下の通り。&lt;br /&gt;
&lt;br /&gt;
* oauth_consumer_key=アプリの情報。開発者ページで生成しておく。&lt;br /&gt;
* oauth_nonce=リクエストごとに固有。再送防止用に使用する。&lt;br /&gt;
* oauth_signature=改竄防止用。他のパラメーターから自動生成。&lt;br /&gt;
* oauth_signature_method=HMAC-SHA1で固定。&lt;br /&gt;
* oauth_timestamp=リクエスト作成日。Unixエポック。&lt;br /&gt;
* oauth_token=アクセストークン。&lt;br /&gt;
* oauth_version=1.0固定。&lt;br /&gt;
&lt;br /&gt;
===== Creating a signature =====&lt;br /&gt;
&lt;br /&gt;
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/creating-a-signature 署名の作成 | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature Creating a signature | Docs | Twitter Developer Platform]&lt;br /&gt;
&lt;br /&gt;
== Search ==&lt;br /&gt;
&lt;br /&gt;
=== 前後の投稿の検索 ===&lt;br /&gt;
投稿元ユーザーと、日付を指定することで前後検索が可能になる。&lt;br /&gt;
 from:username until:YYYY-mm-dd&lt;br /&gt;
=== 最古検索 ===&lt;br /&gt;
[https://news.mynavi.jp/article/20210713-1921414/ Twitterで期間や日付を指定して検索する方法 - 検索コマンドを簡単解説 | マイナビニュース]&lt;br /&gt;
&lt;br /&gt;
発端となる最初の投稿を調査したいことがある。&lt;br /&gt;
&lt;br /&gt;
untilの日付をずらしていって絞り込む。&lt;br /&gt;
&lt;br /&gt;
_hh:mm:ss_JSTのような時間まで指定できる。&lt;br /&gt;
 until:2021-6-1_10:45:00_JST&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Account ===&lt;br /&gt;
&lt;br /&gt;
==== 不審なログインが阻止されました ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;blockquote class=&amp;quot;twitter-tweet&amp;quot;&amp;gt;&amp;lt;p lang=&amp;quot;ja&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;ふえええんなんかtwitterのバグでロックかかってたの、ちょうど24時間で復活したー！&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 　後学のために、また同じ問題に当たってしまった方のために記録を残しておきます。&lt;br /&gt;
 &lt;br /&gt;
 ・以下のようなメッセージが出て入れなくなっていました。&lt;br /&gt;
 &lt;br /&gt;
 不審なログインが阻止されました&lt;br /&gt;
 ご本人であることを確認できなかったため、ご利用のアカウントへのアクセスをブロックしました。これは、ログイン試行の回数が多すぎる、普段とは別の場所や端末からログインが試みられたなど、通常とは異なるログイン操作が見られたためです。しばらくしてからログインしなおしてください。このようなブロックは自動的に解除されます。ログインの問題についてのヘルプは、こちらをご覧ください。&lt;br /&gt;
 &lt;br /&gt;
 ・他の方もそうなるかはわかりませんが、僕はちょうど24時間でロックが解除されました。&lt;br /&gt;
 &lt;br /&gt;
 　ご参考までに！&amp;lt;nowiki&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;&amp;lt;/nowiki&amp;gt;mdash; 稲垣理一郎(リーチロー)💵🪨🏈 (@reach_ina) &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;https://twitter.com/reach_ina/status/1680975592521633795?ref_src=twsrc%5Etfw&amp;quot;&amp;gt;July 17, 2023&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;&amp;lt;script async src=&amp;quot;https://platform.twitter.com/widgets.js&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
サブアカウント作成などで、既存アカウントのログアウト・ログインを複数回繰り返すと、不正アクセス扱いでブロックされる。24時間経過しないと解除されないらしい。&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=X&amp;diff=581</id>
		<title>X</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=X&amp;diff=581"/>
		<updated>2025-08-08T11:25:19Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: 最古検索&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
旧Twitter。&lt;br /&gt;
&lt;br /&gt;
== Link ==&lt;br /&gt;
&lt;br /&gt;
* [https://marketing.twitter.com/ja/insights/kakusan 世界初公開｜「#拡散の科学」なぜ人はリツイートするのか？]&lt;br /&gt;
* https://x.com/Etype_mag/status/1859173932332613843 [https://type.jp/et/feature/27221/ 【独占】イーロン買収後の激動、日本初の開発拠点立ち上げの思惑とは？ X日本法人代表・松山歩が明かす - エンジニアtype | 転職type]&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
X/Twitter関係でアクセスの多い役務関係の記事が以下となっている。&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/28/9050/ 役務: X/Twitterのデータ一括ダウンロードCLI/GUIツールtwmd (twitter-media-downloader) | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2024/02/03/10046/ 役務: X/Twitterの匿名閲覧・RSS提供サービスNitterの終了？ | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
特に、Nitterは主要なメディアでの報道がないものの、潜在的なユーザーが多いようで、アクセスが多かった。&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
Ref: [https://developer.twitter.com/ja/docs/basics/authentication/overview/oauth OAuth with the Twitter API | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
Twitter APIを使う場合、まず認証が必要になる。OAuth 2.0ベースだが、いくつか方式がある。&lt;br /&gt;
&lt;br /&gt;
# Application-only authentication: OAuth2 (bearer token): アプリで認証するケース。&lt;br /&gt;
# Application-user authentication: OAuth 1a (access token for user context): ユーザーで認証するケース。3-legged-OAuthを使用。&lt;br /&gt;
&lt;br /&gt;
1番目は全体で共有する感じ。単独アプリなどで使う。レート制限などを緩和するために、サーバーアプリで、登録ユーザー別に、認証したいなら後者を使ったほうがいい。&lt;br /&gt;
&lt;br /&gt;
==== OAuth 1.0a ====&lt;br /&gt;
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a OAuth 1.0a | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
以下の情報を使う。&lt;br /&gt;
&lt;br /&gt;
* oauth_consumer_key/secret: アプリの認証情報。アクセストークンの取得に使用。API Key、アプリキーなどとも呼ばれる。&lt;br /&gt;
* oauth_token/secret: アクセストークン。ユーザーが自分のアカウントにAPI経由でのアクセスに使用。実質的なパスワード。&lt;br /&gt;
&lt;br /&gt;
consumer_key/secretは、開発者がX Developer Platformから事前に発行して取得しておく必要がある。oauth_token/secretは実装後にユーザーがアプリ操作で取得する感じになる。&lt;br /&gt;
&lt;br /&gt;
アクセストークンを実際に取得する際のリクエストは以下のようなイメージ。&lt;br /&gt;
 curl --request POST \&lt;br /&gt;
   --url '&amp;lt;nowiki&amp;gt;https://api.twitter.com/1.1/statuses/update.json?status=Hello%20world'&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   --header 'authorization: OAuth oauth_consumer_key=&amp;quot;CONSUMER_API_KEY&amp;quot;, oauth_nonce=&amp;quot;OAUTH_NONCE&amp;quot;, oauth_signature=&amp;quot;OAUTH_SIGNATURE&amp;quot;, oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;, oauth_timestamp=&amp;quot;OAUTH_TIMESTAMP&amp;quot;, oauth_token=&amp;quot;ACCESS_TOKEN&amp;quot;, oauth_version=&amp;quot;1.0&amp;quot;' \&lt;br /&gt;
&lt;br /&gt;
===== API Key and Secret =====&lt;br /&gt;
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/api-key-and-secret API Key and Secret | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
Consumer Key/Secretを取得する。開発者アカウントにログインして、アプリのプロジェクトを作成すると表示される。これを控えておく。&lt;br /&gt;
&lt;br /&gt;
===== User Access Tokens (3-legged OAuth flow) =====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://cdn.cms-twdigitalassets.com/content/dam/developer-twitter/docs/obtaining-access-tokens.png.twimg.1920.png User Access Tokens (3-legged OAuth flow) | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/obtaining-user-access-tokens ユーザーアクセストークンの取得（3レッグ認証OAuth） | Docs | Twitter Developer Platform]&lt;br /&gt;
&lt;br /&gt;
3-legged OAuth flowをに従って、ユーザーにアクセストークンの取得を行える。ここが重要。Twitterでのログインとほぼ同じ手順。&lt;br /&gt;
&lt;br /&gt;
====== 1 POST oauth/request_token ======&lt;br /&gt;
まずコンシューマーキーを使って、アクセストークンを要請する。&lt;br /&gt;
&lt;br /&gt;
* oauth_callback&lt;br /&gt;
* oauth_consumer_key&lt;br /&gt;
&lt;br /&gt;
応答200で以下のパラメーターがボディーにあるので、これを後続の処理で使用する。&lt;br /&gt;
&lt;br /&gt;
* oauth_token&lt;br /&gt;
* oauth_token_secret&lt;br /&gt;
* oauth_callback_confirmed&lt;br /&gt;
なお、OAuth関係のリクエスト送信時には、&lt;br /&gt;
&lt;br /&gt;
oauth_nonce=&amp;quot;OAUTH_NONCE&amp;quot;, oauth_signature=&amp;quot;OAUTH_SIGNATURE&amp;quot;, oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;, oauth_timestamp=&amp;quot;OAUTH_TIMESTAMP&amp;quot;, oauth_token=&amp;quot;ACCESS_TOKEN&amp;quot;, oauth_version=&amp;quot;1.0&amp;quot;' \&lt;br /&gt;
&lt;br /&gt;
の情報も必要な模様。&lt;br /&gt;
&lt;br /&gt;
====== 2 GET oauth/authorize ======&lt;br /&gt;
1で取得したoauth_tokenを使って、GETする。&lt;br /&gt;
&lt;br /&gt;
https://api.twitter.com/oauth/authorize?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&lt;br /&gt;
&lt;br /&gt;
すると、1でoauth_callbackdで指定したURLにリダイレクトされて、URLクエリーにパラメーターがついてくる。&lt;br /&gt;
&lt;br /&gt;
https://yourCallbackUrl.com?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&amp;amp;oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY&lt;br /&gt;
&lt;br /&gt;
====== 3 POST oauth/access_token ======&lt;br /&gt;
最後にアクセストークンを取得する。&lt;br /&gt;
&lt;br /&gt;
* POST /oauth/access_token&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
応答本体に以下が返ってくる。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以後は上記をリクエストで使う。&lt;br /&gt;
&lt;br /&gt;
===== Authorizing a request =====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/authorizing-a-request Authorizing a request | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://qiita.com/kerupani129/items/ee9d894cc67101f16c3f OAuth 1.0a 認証の実装 (Twitter API 用) #Twitter - Qiita]&lt;br /&gt;
* [https://note.com/tkhm_dev/n/n152ea1b08b8d Twitter APIをcurlで呼び出す場合のSignatureの生成｜tkhm]&lt;br /&gt;
&lt;br /&gt;
X/TwitterはシンプルHTTPでAPI呼び出しがベース。&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1&lt;br /&gt;
Accept: */*&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: OAuth gem v0.4.4&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Content-Length: 76&lt;br /&gt;
Host: api.twitter.com&lt;br /&gt;
&lt;br /&gt;
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ただし、これに加えて以下の情報がないと、無効扱いになる。&lt;br /&gt;
&lt;br /&gt;
* アプリ。&lt;br /&gt;
* ユーザー。&lt;br /&gt;
* 権限。&lt;br /&gt;
* 改竄。&lt;br /&gt;
&lt;br /&gt;
上記の情報をリクエストに付与するために、OAuth 1.0aプロトコルを採用している。具体的には、上記の情報を付与する、追加のHTTP Authorizationヘッダーがあればよい。具体的には以下となる。&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1&lt;br /&gt;
Accept: */*&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: OAuth gem v0.4.4&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Authorization:&lt;br /&gt;
OAuth oauth_consumer_key=&amp;quot;xvz1evFS4wEEPTGEFPHBog&amp;quot;,&lt;br /&gt;
oauth_nonce=&amp;quot;kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg&amp;quot;,&lt;br /&gt;
oauth_signature=&amp;quot;tnnArxj06cWHq44gCs1OSKk%2FjLY%3D&amp;quot;,&lt;br /&gt;
oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;,&lt;br /&gt;
oauth_timestamp=&amp;quot;1318622958&amp;quot;,&lt;br /&gt;
oauth_token=&amp;quot;370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb&amp;quot;,&lt;br /&gt;
oauth_version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
Content-Length: 76&lt;br /&gt;
Host: api.twitter.com&lt;br /&gt;
&lt;br /&gt;
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Authorizationヘッダーは実際には一行。&lt;br /&gt;
&lt;br /&gt;
この署名プロセスが過度な場合、Web Intentsを使ったほうが簡単。&lt;br /&gt;
&lt;br /&gt;
パラメーターは以下の通り。&lt;br /&gt;
&lt;br /&gt;
* oauth_consumer_key=アプリの情報。開発者ページで生成しておく。&lt;br /&gt;
* oauth_nonce=リクエストごとに固有。再送防止用に使用する。&lt;br /&gt;
* oauth_signature=改竄防止用。他のパラメーターから自動生成。&lt;br /&gt;
* oauth_signature_method=HMAC-SHA1で固定。&lt;br /&gt;
* oauth_timestamp=リクエスト作成日。Unixエポック。&lt;br /&gt;
* oauth_token=アクセストークン。&lt;br /&gt;
* oauth_version=1.0固定。&lt;br /&gt;
&lt;br /&gt;
===== Creating a signature =====&lt;br /&gt;
&lt;br /&gt;
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/creating-a-signature 署名の作成 | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature Creating a signature | Docs | Twitter Developer Platform]&lt;br /&gt;
&lt;br /&gt;
== Search ==&lt;br /&gt;
&lt;br /&gt;
=== 前後の投稿の検索 ===&lt;br /&gt;
投稿元ユーザーと、日付を指定することで前後検索が可能になる。&lt;br /&gt;
 from:username until:YYYY-mm-dd&lt;br /&gt;
ｓ&lt;br /&gt;
&lt;br /&gt;
=== 最古検索 ===&lt;br /&gt;
発端となる最初の投稿を調査したいことがある。&lt;br /&gt;
&lt;br /&gt;
untilの日付をずらしていって絞り込む。&lt;br /&gt;
&lt;br /&gt;
ｓ&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Account ===&lt;br /&gt;
&lt;br /&gt;
==== 不審なログインが阻止されました ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;blockquote class=&amp;quot;twitter-tweet&amp;quot;&amp;gt;&amp;lt;p lang=&amp;quot;ja&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;ふえええんなんかtwitterのバグでロックかかってたの、ちょうど24時間で復活したー！&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 　後学のために、また同じ問題に当たってしまった方のために記録を残しておきます。&lt;br /&gt;
 &lt;br /&gt;
 ・以下のようなメッセージが出て入れなくなっていました。&lt;br /&gt;
 &lt;br /&gt;
 不審なログインが阻止されました&lt;br /&gt;
 ご本人であることを確認できなかったため、ご利用のアカウントへのアクセスをブロックしました。これは、ログイン試行の回数が多すぎる、普段とは別の場所や端末からログインが試みられたなど、通常とは異なるログイン操作が見られたためです。しばらくしてからログインしなおしてください。このようなブロックは自動的に解除されます。ログインの問題についてのヘルプは、こちらをご覧ください。&lt;br /&gt;
 &lt;br /&gt;
 ・他の方もそうなるかはわかりませんが、僕はちょうど24時間でロックが解除されました。&lt;br /&gt;
 &lt;br /&gt;
 　ご参考までに！&amp;lt;nowiki&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;&amp;lt;/nowiki&amp;gt;mdash; 稲垣理一郎(リーチロー)💵🪨🏈 (@reach_ina) &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;https://twitter.com/reach_ina/status/1680975592521633795?ref_src=twsrc%5Etfw&amp;quot;&amp;gt;July 17, 2023&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;&amp;lt;script async src=&amp;quot;https://platform.twitter.com/widgets.js&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
サブアカウント作成などで、既存アカウントのログアウト・ログインを複数回繰り返すと、不正アクセス扱いでブロックされる。24時間経過しないと解除されないらしい。&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=MediaWiki&amp;diff=580</id>
		<title>MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=MediaWiki&amp;diff=580"/>
		<updated>2025-07-16T08:14:18Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: 箇条書き内のブロック&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
MediaWikiはWikipediaで採用されている世界一有名なWikiソフトだ。&lt;br /&gt;
&lt;br /&gt;
GNU social JP WikiもMediaWikiを採用している ([https://web.gnusocial.jp/post/2023/10/31/9191/ 告知: 自由な分散SNSのWiki「GNU social JP Wiki」の開始とサービス名の改名 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
「[https://kinsta.com/jp/blog/wordpress-wiki/ WordPress Wikiの作成方法（徹底解説）]」にあるように、WordPressでも似たようなWikiサイトの構築は可能。&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/30/9167/ 設置: MediaWiki | Wikipediaで採用された世界一有名な情報集約のWikiソフト | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/11/04/9170/ 設置: MediaWikiのindex.phpを省く短縮URL設定 | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/11/05/9173/ 設置: MediaWikiのホーム画面 (メインページ/Man_Page) の変更方法 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Operation ==&lt;br /&gt;
[[mediawikiwiki:Manual:Administrators|Manual:Administrators - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
=== Protection ===&lt;br /&gt;
&lt;br /&gt;
* [[wikibooks:MediaWiki_Administrator's_Handbook/Page_Protection|MediaWiki Administrator's Handbook/Page Protection - Wikibooks, open books for an open world]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Autoconfirmed_users|Manual:Autoconfirmed users - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
荒らしや編集合戦対策で、ページを保護することで、編集を権限者に限定できる。&lt;br /&gt;
&lt;br /&gt;
=== Block ===&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:Block_and_unblock|Manual:Block and unblock - MediaWiki]] - [[wikibooks:MediaWiki_Administrator's_Handbook/User_Block|MediaWiki Administrator's Handbook/User Block - Wikibooks, open books for an open world]]&lt;br /&gt;
&lt;br /&gt;
サイトが悪党に荒らされた場合の対策。該当アカウントをブロックできる。&lt;br /&gt;
&lt;br /&gt;
ブロックの効果: 編集軽作業が不能になる。&lt;br /&gt;
&lt;br /&gt;
荒らされたページや、新規作成されたページは、復元か削除で対応する。&lt;br /&gt;
&lt;br /&gt;
方法。&lt;br /&gt;
&lt;br /&gt;
* Special:Blockにアクセス。IPアドレスかユーザー名を指定。&lt;br /&gt;
* 他に、利用者か利用者トークページを開くと、サイドバーにブロックのリンクがあり、そこからも実施可能。&lt;br /&gt;
&lt;br /&gt;
オプション&lt;br /&gt;
&lt;br /&gt;
* アカウント作成をブロック: そのIPアドレスから新規登録を不能にする。&lt;br /&gt;
* 最後の使用IPアドレスと編集アドレスをブロック (ハードブロック):&lt;br /&gt;
&lt;br /&gt;
=== Revert/Rollback ===&lt;br /&gt;
Ref: [[mediawikiwiki:Manual:Reverts|Manual:Reverts - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
MediaWikiで誰かの編集を打ち消したり元に戻す機能。基本的に、復元用の履歴を作って元に戻す。&lt;br /&gt;
&lt;br /&gt;
Revert (undo) は、ページを任意の履歴に戻す。現在のページからその履歴までの変更点を逆に適用して、新しい履歴を作る。基本的に誰でもできる。&lt;br /&gt;
&lt;br /&gt;
Rollback/ロールバックは、ページに対して、同じユーザーによる最後の編集をまとめて巻き戻す。rollback権限が必要。シナリオとしては、同一ユーザーにより荒らしなどで大量に編集、破壊された場合に一括で戻せる。&lt;br /&gt;
&lt;br /&gt;
なお、ページが誕生して以来1名のユーザーしか編集していない場合、ページの作成時点まで戻るので使用できない。&lt;br /&gt;
&lt;br /&gt;
ロールバックを実行すると、「Ctkpaarr964565498 (トーク) による編集を Gnusocialjp による直前の版へ差し戻しました」のメッセージで、変更を打ち消し履歴が作られる。&lt;br /&gt;
&lt;br /&gt;
=== RevisionDelete ===&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Help:RevisionDelete/ja|Help:版指定削除 - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:RevisionDelete/ja|Manual:版指定削除 - MediaWiki]]&lt;br /&gt;
* [https://design.kyusan-u.ac.jp/OpenSquareJP/?MediaWiki/Customize MediaWiki/Customize - OpenSquareJP｜井上貢一研究室]&lt;br /&gt;
&lt;br /&gt;
秘匿情報を誤って公開した場合など、特定の変更履歴を非表示にできる。&lt;br /&gt;
&lt;br /&gt;
LocalSettings.phpに以下を追記すると有効になる。&lt;br /&gt;
 $wgGroupPermissions['sysop']['deletelogentry'] = true;&lt;br /&gt;
 $wgGroupPermissions['sysop']['deleterevision'] = true;&lt;br /&gt;
&lt;br /&gt;
=== Right ===&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:User_rights|Manual:User rights - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Preventing_access|Manual:Preventing access - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:$wgGroupPermissions|Manual:$wgGroupPermissions - MediaWiki]]&lt;br /&gt;
* [https://sudachi.jp/wiki/MediaWiki%E3%81%AE%E8%A8%AD%E5%AE%9A MediaWikiの設定 - すだちWiki]&lt;br /&gt;
&lt;br /&gt;
アクセス管理がユーザーやグループ単位でできる。&lt;br /&gt;
&lt;br /&gt;
$wgGroupPermissions[グループ名][権限] で制御する。いくつか便利な設定、よくやる設定がある。&lt;br /&gt;
 # Prevent new user registrations except by sysops&lt;br /&gt;
 $wgGroupPermissions['*']['createaccount'] = false;&lt;br /&gt;
&lt;br /&gt;
=== Spam ===&lt;br /&gt;
「[[mediawikiwiki:Manual:Combating_spam|Manual:Combating spam - MediaWiki]]」にMediaWikiのスパム対策の基本がまとまっている。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Extension:ConfirmEdit|Extension:ConfirmEdit - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
=== ページ分類方法 ===&lt;br /&gt;
[http://blog.livedoor.jp/lionkid/archives/3096475.html world-walker スタッフ ブログ:MediaWikiのページ分類方法についての考察]&lt;br /&gt;
&lt;br /&gt;
* 名前空間（Namespace）&lt;br /&gt;
* カテゴリ（Category）&lt;br /&gt;
* サブページ（Subpage）&lt;br /&gt;
&lt;br /&gt;
MediaWikiでは上記の3種類のページ分類方法がある。それぞれ一長一短。&lt;br /&gt;
&lt;br /&gt;
だが、基本的にはCategoryでやるのが一番汎用的。1個のページが複数の分類にしたいということがよくある。名前空間とサブページだとそれができない。親は常に1個。住所のような完全に上下関係が一致するなら問題ないが、後で変えるのもたいへん。&lt;br /&gt;
&lt;br /&gt;
=== Category ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
[[mediawikiwiki:Help:Categories/ja|Help:カテゴリ - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
ページをグループ化する機能。重要。&lt;br /&gt;
&lt;br /&gt;
カテゴリーへのページの追加は、追加対象ページに &amp;lt;nowiki&amp;gt;[[Category:カテゴリ名]]&amp;lt;/nowiki&amp;gt; を追加するだけ。どこでもいい。最下部が一般的。&lt;br /&gt;
&lt;br /&gt;
カテゴリーページ自体へのリンクを張る場合、&amp;lt;nowiki&amp;gt;[[:Category:カテゴリー名]]&amp;lt;/nowiki&amp;gt; のように、先頭に:を付与する。&lt;br /&gt;
&lt;br /&gt;
カテゴリーが未作成なら、同時にカテゴリーの未作成ページができる。カテゴリーページはカテゴリーページで、作成が必要。カテゴリー自体も作成はできる。通常のページ同様に、 [Category:カテゴリー名] で検索して、新規作成する。&lt;br /&gt;
&lt;br /&gt;
新規作成すると、CategoryTree拡張機能で、自動的にカテゴリー一覧が末尾に表示される。&lt;br /&gt;
&lt;br /&gt;
カテゴリー自体も別のカテゴリーに属すことができる。ページ同様に、カテゴリーページに &amp;lt;nowiki&amp;gt;[[Category:カテゴリ名]]&amp;lt;/nowiki&amp;gt; を追加するだけ。&lt;br /&gt;
&lt;br /&gt;
カテゴリーの階層の保守としては、カテゴリーでツリー構造になっているときれい。サブページに近い。カテゴリーでWiki全体を分類してまとめられる。Category:Mainをカテゴリーのルートにするときれいかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== CategoryTree ====&lt;br /&gt;
&lt;br /&gt;
===== About =====&lt;br /&gt;
カテゴリーの一覧表示は、標準拡張機能の「[[mediawikiwiki:Extension:CategoryTree/ja|Extension:CategoryTree - MediaWiki]]」で可能になる。transclude (参照読込) ではできない ([https://stackoverflow.com/questions/1050853/transclude-a-category-in-mediawiki Transclude a category in MediaWiki - Stack Overflow])。&lt;br /&gt;
&lt;br /&gt;
CategoryTreeは以下の3種類の使用方法がある。&lt;br /&gt;
&lt;br /&gt;
# カテゴリーページでデフォルト表示。&lt;br /&gt;
# カスタムタグ (categorytree )。&lt;br /&gt;
# special page ([[特別:CategoryTree|Special:CategoryTree]])&lt;br /&gt;
&lt;br /&gt;
categorytree要素は以下のような形式で使う。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;categorytree showcount=&amp;quot;on&amp;quot; mode=&amp;quot;all&amp;quot;&amp;gt;Main&amp;lt;/categorytree&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
重要なオプションがある。&lt;br /&gt;
&lt;br /&gt;
* mode: 初期値が複雑。namespacesで上書き。なければ、項目が有無で決まる。pages (上限200ページ) かallを指定しておけばいいと思われる。ページ数が膨大ならpages。&lt;br /&gt;
** categories (0): サブカテゴリーのみ。&lt;br /&gt;
** pages (10): 画像を除いた、サブカテゴリーとページ。上限200ページ。&lt;br /&gt;
** all (20): 全部。&lt;br /&gt;
** parents (100): 親のカテゴリーを表示。インバース操作用。&lt;br /&gt;
* showcount: &amp;quot;on&amp;quot;でカテゴリーの記事数表示。categorytree要素でのみデフォルトoff。&lt;br /&gt;
&lt;br /&gt;
===== デフォルト展開 =====&lt;br /&gt;
CategoryTreeのcategorytree要素を使うと、カテゴリー一覧を表示できる。が、クリックしないと展開されないのが、余計なクリックが必要で嫌。&amp;lt;blockquote&amp;gt;&lt;br /&gt;
; depth&lt;br /&gt;
: determines how many levels of the tree are shown initially. Default is 1. 0 means only the root node. The maximum value depends on the mode specified, and on the &amp;lt;code&amp;gt;$wgCategoryTreeMaxDepth&amp;lt;/code&amp;gt; option. (Introduced between [[/static-codereview.wikimedia.org/MediaWiki/20410.html|r20410]] and [[/static-codereview.wikimedia.org/MediaWiki/20840.html|r20840]], Mar 30 2007; fully functional even with &amp;lt;code&amp;gt;$wgCategoryTreeDynamicTag&amp;lt;/code&amp;gt; since [[/static-codereview.wikimedia.org/MediaWiki/36864.html|r36864]], July 2008.)&lt;br /&gt;
&lt;br /&gt;
; $wgCategoryTreeMaxDepth&lt;br /&gt;
: an array defining the maximum depth for each [[/www.mediawiki.org/wiki/Extension:CategoryTree#Modes|mode]], to which the tree may be expanded initially using the depth parameter in a &amp;lt;category&amp;gt; tag. By default, this is set to 2 for the &amp;quot;categories&amp;quot; mode, and 1 for other modes. To set it to 3 for categories and 2 for other modes, for example, you can use &amp;lt;code&amp;gt;$wgCategoryTreeMaxDepth = [10 =&amp;gt; 2, 20 =&amp;gt; 2, 0 =&amp;gt; 3, 100 =&amp;gt; 2];&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;このあたりの、オプションと設定を使うと、うまくできる。&lt;br /&gt;
&lt;br /&gt;
基本はdepthで最大展開表示数を制御する。ただし、性能の制御のために$wgCategoryTreeMaxDepthで上限が決まっている。デフォルトで、mode=&amp;quot;categories&amp;quot;=2、他は1になっている。&lt;br /&gt;
 $wgCategoryTreeMaxDepth = [20 =&amp;gt; 9];&lt;br /&gt;
そんなに階層が何重にもなることは想定していないが、上記のようにLocalSettings.phpでallの最大を1から9に変更する。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;categorytree showcount=&amp;quot;on&amp;quot; mode=&amp;quot;all&amp;quot; depth=&amp;quot;9&amp;quot;&amp;gt;Main&amp;lt;/categorytree&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
加えて、上記のようにdepth=&amp;quot;9&amp;quot;を指定すると反映される。膨大なWikiで9が重いなら、上限を変える。これで一括管理できる仕組みな模様。&lt;br /&gt;
&lt;br /&gt;
「[https://stackoverflow.com/questions/37348060/mediawiki-category-tree-expand-all-by-default MediaWiki Category Tree expand all by default - Stack Overflow]」が関連Q&amp;amp;Aだが、回答が的外れになっている。&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
日本語にすると、ヘルプとか特別とかが日本語のURLになるのが嫌。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:Language/en|Manual:Language - MediaWiki]]」&lt;br /&gt;
&lt;br /&gt;
Page content languageで変更できる？&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:FAQ|Manual:FAQ - MediaWiki]]」&lt;br /&gt;
&lt;br /&gt;
Special:Allmessagesにシステムメッセージのリストがある。例えば、「特別ページ」は「specialpage 」が対応している。[Special:AllMessages] は「システムメッセージの一覧」 で対応している。&lt;br /&gt;
&lt;br /&gt;
[MediaWiki:Allmessages] のページでシステムメッセージが格納されている。[MediaWiki:Allmessages/ja] で言語対応が出る。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:$wgUseDatabaseMessages|Manual:$wgUseDatabaseMessages - MediaWiki]]」で選択できる。falseにするとwpLanguageCodeで強制指定。trueだと自分で変更できる。&lt;br /&gt;
&lt;br /&gt;
「[https://github.com/wikimedia/mediawiki/blob/1.42.1/languages/i18n/en.json mediawiki/languages/i18n/en.json at 1.42.1 · wikimedia/mediawiki]」が言語対応の一覧。ここから探すとよい。&lt;br /&gt;
&lt;br /&gt;
特に重要なもの。&lt;br /&gt;
&lt;br /&gt;
* nstab: 名前空間類のプレフィクスの模様。&lt;br /&gt;
* nstab-special Special&lt;br /&gt;
* specialpage&lt;br /&gt;
* specialpages 特別ページ一覧&lt;br /&gt;
* nstab-&lt;br /&gt;
* mainpage&lt;br /&gt;
&lt;br /&gt;
Special:の扱いがよくわからない。カテゴリーじゃなくて名前空間。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:Configuration_settings|Manual:Configuration settings - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Special_pages|Manual:Special pages - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
The Special pseudo namespace can be translated in other languages. 翻訳可能。「[[mediawikiwiki:Manual:Namespace|Manual:Namespace - MediaWiki]]」によると、「[[mediawikiwiki:Manual:$wgNamespaceAliases|Manual:$wgNamespaceAliases - MediaWiki]]」で翻訳可能？&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:Namespace_constants|Manual:Namespace constants - MediaWiki]]」が定数。&lt;br /&gt;
&lt;br /&gt;
NS_SPECIALを指定すると、翻訳が無効になる？&lt;br /&gt;
 $wgNamespaceAliases['特別'] = NS_SPECIAL;&lt;br /&gt;
「[[mediawikiwiki:Topic:T9rltht3umy9zj8c|How to switch from german namespace to english? on Project:Support desk]]」これが近い。&lt;br /&gt;
&lt;br /&gt;
/jaなど言語ページもあって、変更できる。が、パーマリンクは変わらない。別のところ。&amp;lt;blockquote&amp;gt;[[/www.mediawiki.org/wiki/User:Ciencia Al Poder|&amp;lt;bdi&amp;gt;Ciencia Al Poder&amp;lt;/bdi&amp;gt;]] ([[/www.mediawiki.org/wiki/User talk:Ciencia Al Poder|talk]][[/www.mediawiki.org/wiki/Special:Contributions/Ciencia Al Poder|contribs]])&lt;br /&gt;
&lt;br /&gt;
What you can control in the MediaWiki namespace is the text of the tab, not the namespace itself (eg: when linking to pages in that namespace or the displayed URL). See [[/www.mediawiki.org/wiki/Manual:Using custom namespaces|Manual:Using custom namespaces]]&amp;lt;/blockquote&amp;gt;nstab系はタブテキストなどで、URLは変わらない。&lt;br /&gt;
&lt;br /&gt;
Special:AllMessagesからnstab-category nstab-category/jaをCategoryに直したがパーマリンクは反映されず。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Help:System_message|Help:System message - MediaWiki]]」にシステムメッセージの変更方法がある。&lt;br /&gt;
&lt;br /&gt;
まず、Special:AllMessagesのページに、システムメッセージの全リストがある。「[https://github.com/wikimedia/mediawiki/blob/1.42.1/languages/i18n/en.json mediawiki/languages/i18n/en.json at 1.42.1 · wikimedia/mediawiki]」がソースコードの対応。&lt;br /&gt;
&lt;br /&gt;
en.jsonのja.jsonを変更する？&lt;br /&gt;
&lt;br /&gt;
この画面から編集できる。変更方法が一応2種類ある。&lt;br /&gt;
&lt;br /&gt;
# [MediaWiki:メッセージキー] のページの値を変更。&lt;br /&gt;
# Special:AllMessagesの左側のリンクで上記ページにアクセス (既定のメッセージ文が使用されている場合、ページが不在というわけではなく、編集ページが空のためリンクが赤色になっている)。&lt;br /&gt;
nstab-categoryを変更しても、URLは変わらない。&lt;br /&gt;
&lt;br /&gt;
ChatGPTへの質問。&lt;br /&gt;
&lt;br /&gt;
MediaWikiの名前空間の翻訳を無効にする方法を教えてください。&lt;br /&gt;
&lt;br /&gt;
====== ChatGPT: ======&lt;br /&gt;
MediaWikiで名前空間の翻訳を無効にするには、以下の手順を実行します：&lt;br /&gt;
&lt;br /&gt;
# '''&amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; ファイルの編集''': MediaWikiの設定ファイルである &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; を開きます。このファイルは、MediaWikiインストールディレクトリにあります。&lt;br /&gt;
# '''翻訳を無効にする設定の追加''': &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; に以下の設定を追加します。この設定により、指定した名前空間の翻訳を無効にすることができます。&lt;br /&gt;
&lt;br /&gt;
 // 名前空間の翻訳を無効にする&lt;br /&gt;
 $wgTranslateLinks = false;&lt;br /&gt;
&lt;br /&gt;
# この設定を追加することで、すべての名前空間の翻訳が無効になります。&lt;br /&gt;
# '''特定の名前空間の翻訳を無効にする''': 特定の名前空間だけ翻訳を無効にしたい場合は、より具体的な設定を追加する必要があります。たとえば、「ユーザー」名前空間（&amp;lt;code&amp;gt;User&amp;lt;/code&amp;gt;）の翻訳を無効にするには、以下のように設定を追加します。&lt;br /&gt;
&lt;br /&gt;
 $wgNamespaceAliases = array(&lt;br /&gt;
     NS_USER =&amp;gt; 'User'&lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
 $wgTranslateLinks = false;&lt;br /&gt;
&lt;br /&gt;
# これにより、「ユーザー」名前空間の翻訳が無効になります。必要に応じて、他の名前空間も設定できます。&lt;br /&gt;
# '''設定の保存''': &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; を保存し、MediaWikiを再起動する必要があります。これにより、新しい設定が適用されます。&lt;br /&gt;
# '''確認''': 設定が正しく適用されているか確認するため、MediaWikiのインターフェースを確認し、指定した名前空間で翻訳が無効になっていることを確認します。&lt;br /&gt;
&lt;br /&gt;
この手順で、MediaWikiで名前空間の翻訳を無効にすることができます。必要に応じて、設定を調整してください。&lt;br /&gt;
&lt;br /&gt;
wgTranslateLinksは存在しない嘘だが、「[[mediawikiwiki:Manual:$wgNamespaceAliases/ja|Manual:$wgNamespaceAliases - MediaWiki]]」は使えそう。&lt;br /&gt;
&lt;br /&gt;
[https://www.hostknox.com/knowledgebase/686/How-to-add-namespace-aliases-in-MediaWiki.html HostKnox :: ナレッジベース :: MediaWiki に名前空間エイリアスを追加する方法]&lt;br /&gt;
&lt;br /&gt;
* 「[https://vanguardflight.xii.jp/wp/2014/03/30/313/ MediaWikiにExtension:Scribuntoをインストール – Remove Before Flight]」&lt;br /&gt;
* [https://vanguardflight.xii.jp/wp/2014/03/26/300/ MediaWikiのインストール手順 – Remove Before Flight]&lt;br /&gt;
&lt;br /&gt;
エイリアスを追加するか、ソースコードの変更がやはり必要だと思われる。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:$wgNamespaceAliases/ja|Manual:$wgNamespaceAliases - MediaWiki]]」を見ていたら、[[mediawikiwiki:Manual:$wgExtraNamespaces|Manual:$wgExtraNamespaces - MediaWiki]]が登場して、既定の名前空間の改名にも使えるらしい。「[[mediawikiwiki:Manual:Using_custom_namespaces|Manual:Using custom namespaces - MediaWiki]]」を見ると。&lt;br /&gt;
 define(&amp;quot;NS_FOO&amp;quot;, 3000);&lt;br /&gt;
 $wgExtraNamespaces[NS_FOO] = &amp;quot;Foo&amp;quot;;&lt;br /&gt;
以下のように名前を変更すると、改名できるらしい。&lt;br /&gt;
 define(&amp;quot;NS_FOO&amp;quot;, 3000);&lt;br /&gt;
 $wgExtraNamespaces[NS_FOO] = &amp;quot;New&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['Foo'] = NS_FOO;&lt;br /&gt;
本当かな？&lt;br /&gt;
&lt;br /&gt;
[[mediawikiwiki:Manual:Namespace_constants|Manual:Namespace constants - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
以下のコードでうまくいった。&lt;br /&gt;
 // Rename namespace to keep English&lt;br /&gt;
 $wgExtraNamespaces[NS_USER] = &amp;quot;User&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['利用者'] = NS_USER;&lt;br /&gt;
 $wgExtraNamespaces[NS_CATEGORY] = &amp;quot;Category&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['カテゴリ'] = NS_CATEGORY;&lt;br /&gt;
 $wgExtraNamespaces[NS_SPECIAL] = &amp;quot;Special&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['特別'] = NS_SPECIAL;&lt;br /&gt;
特別など他のページもこれで全部英語に戻す。&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== Conflict ====&lt;br /&gt;
複数のタブで同じページをGUIで編集して、更新すると、後の更新で前の更新が上書きされる。順番に注意する。&lt;br /&gt;
&lt;br /&gt;
GUIじゃなくて、ソースエディットで節単位だと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== Snippet ====&lt;br /&gt;
https://chatgpt.com/c/6747d5d5-57ec-800b-97ec-e00c1e87a2fc&lt;br /&gt;
&lt;br /&gt;
[https://www.wingfield.gr.jp/archives/4387 Mediawiki でのスニペット管理を考える - WINGFIELD since1995]&lt;br /&gt;
&lt;br /&gt;
MediaWikiでコードスニペットの管理。&lt;br /&gt;
&lt;br /&gt;
# 本文に埋め込み: 長いとみにくいかも。&lt;br /&gt;
# ファイルアップロード機能: 検索不能で編集履歴も追跡不能。&lt;br /&gt;
# VCSサービスの埋め込み。&lt;br /&gt;
&lt;br /&gt;
短文は埋め込み、長くなったらファイルアップロード。がいいかな。&lt;br /&gt;
&lt;br /&gt;
==== Media ====&lt;br /&gt;
画像などをアップロードする場合、ファイル名はサイト全体で固有である必要がある。いい加減なファイル名にはせずに、意味がわかるファイル名を心掛ける。&lt;br /&gt;
&lt;br /&gt;
アップロード後のファイルの改名は少々手間がかかる。「拡張機能: Renameuser/RenameFiles」の拡張機能を使うとよい。&lt;br /&gt;
&lt;br /&gt;
== Markup ==&lt;br /&gt;
&lt;br /&gt;
=== Transclusion ===&lt;br /&gt;
MeidaWikiでは他のページの内容を埋め込むことが可能で、この機能を [Transclusion/参照読み込み](https://www.mediawiki.org/wiki/Transclusion) と呼んでいる。&lt;br /&gt;
&lt;br /&gt;
{{&amp;lt;page name&amp;gt;}} のように、二重波括弧でページ名を指定すると埋め込める。埋め込み元で、埋め込みの許可・禁止ブロックをマークアップで指定することもできる。&lt;br /&gt;
&lt;br /&gt;
参照読み込み可能な特別ページは限定されていて、以下となる。&lt;br /&gt;
&lt;br /&gt;
* Special:AllPages&lt;br /&gt;
* Special:PrefixIndex&lt;br /&gt;
* Special:NewFiles&lt;br /&gt;
* Special:NewPages&lt;br /&gt;
* Special:RecentChanges&lt;br /&gt;
* Special:RecentChangesLinked. &lt;br /&gt;
&lt;br /&gt;
トップページでの埋め込み表示などで便利なものがある。AllPages/NewPages/RecentChangesあたりが特に便利そうだ。&lt;br /&gt;
&lt;br /&gt;
テンプレート的な使い方などで、駆使できると便利だろう。&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
MediaWikiでHTMLの要素をいくつか使用できる。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Help:Formatting|Help:Formatting - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:HTML_restriction|HTML restriction - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Help:HTML_in_wikitext|Help:HTML in wikitext - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
LocalSetting.phpで$wgRawHtml = true (デフォルトfalse) にすれば、html要素内でHTMLを無制限で使用可能になる。&lt;br /&gt;
&lt;br /&gt;
=== Page ===&lt;br /&gt;
Ref: [[mediawikiwiki:Topic:Ua1cqlfd07kyvd8p|How to Embed List of All Namespace-Pages in a Wiki Page? on Project:Support desk]]&lt;br /&gt;
&lt;br /&gt;
カスタム名前空間Privateで非公開ページを作ったら、Privateのページ一覧をメインページに表示させたくなった。若干工夫がいる。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Special:Prefixindex/&amp;lt;custom namespace&amp;gt;:}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;custom namespace&amp;gt;部分にカスタム名前空間を指定する。これで一覧ページを開ける。大事なのは末尾の:。これで先頭一致でページ一覧のページになっている。これをtransclusionする形。&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== Category:構文ハイライトエラーがあるページ ====&lt;br /&gt;
[https://knowledge.rinpress.com/index.php/MediaWiki%E3%81%AE%E3%80%8C%E6%A7%8B%E6%96%87%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%8D MediaWikiの「構文ハイライトエラー」 - とある社畜の頭脳整理]&lt;br /&gt;
&lt;br /&gt;
MediaWikiでコードブロックの挿入時に、SyntaxHighlightを使用していて、言語を指定しなかったら、そのページにこのカテゴリーが付与される。&lt;br /&gt;
&lt;br /&gt;
ただのテキストブロックを挿入したい場合、lang=textを選択する。これで解消される。&lt;br /&gt;
&lt;br /&gt;
==== 箇条書き内のブロック ====&lt;br /&gt;
https://chatgpt.com/share/68775f22-ac78-800b-a5b3-5ed8ddbe7ad6&lt;br /&gt;
&lt;br /&gt;
コロン:を入力するとインデントになる。&lt;br /&gt;
&lt;br /&gt;
# 箇条書き内で、Shift-Enterで行内改行。&lt;br /&gt;
# コロンでインデント。&lt;br /&gt;
# Insert-Code blockでブロック挿入。&lt;br /&gt;
&lt;br /&gt;
C-7などのPreformatとかだと箇条書きが解除されるので注意する。&lt;br /&gt;
&lt;br /&gt;
==Setting==&lt;br /&gt;
&lt;br /&gt;
===Private===&lt;br /&gt;
特定ページを非公開にすることができる。後日方法を精査する。&lt;br /&gt;
&lt;br /&gt;
*[https://irineko.hatenablog.com/entry/2021/01/06/194908 mediawiki 特定のページの閲覧制限をしたい。 - 人狼wiki更新情報]&lt;br /&gt;
*[[mediawikiwiki:Manual:Preventing_access/ja|Manual:アクセス制限 - MediaWiki]]&lt;br /&gt;
全体設定としては以下がある。基本非公開で一部公開の場合に使える。&lt;br /&gt;
 # Disable reading by anonymous users&lt;br /&gt;
 $wgGroupPermissions['*']['read'] = false;&lt;br /&gt;
 &lt;br /&gt;
 # Disable anonymous editing&lt;br /&gt;
 $wgGroupPermissions['*']['edit'] = false;&lt;br /&gt;
 &lt;br /&gt;
 # Prevent new user registrations except by sysops&lt;br /&gt;
 $wgGroupPermissions['*']['createaccount'] = false;&lt;br /&gt;
今回は基本公開で一部非公開。&lt;br /&gt;
&lt;br /&gt;
*ユーザー属性での管理。&lt;br /&gt;
*名前空間での管理 (LockDown拡張機能)。&lt;br /&gt;
&lt;br /&gt;
Lockdownを試す。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/02/03/10009/ 機能: MediaWikiでのLockdown拡張を用いた名前空間単位の非公開ページ | GNU social JP Web]」に記した。&lt;br /&gt;
&lt;br /&gt;
=== $wgCapitalLinks===&lt;br /&gt;
出典: [[mediawikiwiki:Manual:$wgCapitalLinks|Manual:$wgCapitalLinks - MediaWiki]]。&lt;br /&gt;
&lt;br /&gt;
MediaWikiはデフォルトでページ名やページURLの先頭1文字目が大文字になる。&lt;br /&gt;
&lt;br /&gt;
$wgCapitalLinks = falseにするとこれを無効にできる。大文字小文字を完全に区別する。例えば、iPhoneなどのように、大文字小文字が重要なことがあるので、falseにしておくのがよいと思う。リンク切れにも影響するので最初の方で設定するとよい。&lt;br /&gt;
&lt;br /&gt;
==Other==&lt;br /&gt;
&lt;br /&gt;
===Analytics===&lt;br /&gt;
サイトのアクセス分析のためにGoogle Analyticsを設置したい。いくつか拡張機能がある。GA4対応が重要な項目。&lt;br /&gt;
&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_Analytics_Integration|Extension:Google Analytics Integration - MediaWiki]]: 翻訳は更新されているがベースコードは2017年のv3.0.1で古い。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleAnalyticsMetrics|Extension:GoogleAnalyticsMetrics - MediaWiki]]: 2023-01 v1.0.2。Google Analyticsからメトリクスを取得して挿入する。アクセスカウンター的な拡張機能な模様 (関連: [[mediawikiwiki:Extension:HitCounters|Extension:HitCounters - MediaWiki]])。&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_Analytics_Links|Extension:Google Analytics Links - MediaWiki]]: 2009年v1.2。古い。MediaWiki v1.39以上で動作しない。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleAnalyticsTopPages|Extension:GoogleAnalyticsTopPages - MediaWiki]]: 2014年v0.0.1。アクセス上位ページのリストを生成する。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleTagManager|Extension:GoogleTagManager - MediaWiki]]: 2023年v.1.1。Google Tag Managerを設置する。&lt;br /&gt;
*[[mediawikiwiki:Extension:GTag|Extension:GTag - MediaWiki]]、[https://mirukupc.com/2022/04/01/?p=169 MediaWikiでGoogle AnalyticsのGA4を使う - ミルクPCのブログ] (GTag): 2023 v1.3.0。新しいGoogle Analyticsのトラッキングタグに対応している。&lt;br /&gt;
*[https://github.com/harugon/Gtm GitHub - harugon/Gtm: MediaWikiにGoogle Tag Managerを追加します]: Google Tag Manager。&lt;br /&gt;
*[[mediawikiwiki:Extension:Matomo|Extension:Matomo - MediaWiki]]: Google Analyticsではない分析サービスの拡張機能。&lt;br /&gt;
&lt;br /&gt;
公式プラグインを優先したい。&lt;br /&gt;
&lt;br /&gt;
GTag、GoogleTagManager。これらが設置用にみえる。詳細に検討してみる。Google Tag ManagerはAnalyticsを含めて汎用的なことができる。ひとまずよくわからないので、シンプルなGTagを使ってみるとよさそう。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/01/04/9756/ 拡張: MediaWikiのGoogle Analytics追跡拡張機能GTag | GNU social JP Web]」で設置した。&lt;br /&gt;
&lt;br /&gt;
=== Advertise===&lt;br /&gt;
&lt;br /&gt;
====広告ブロッカー対策====&lt;br /&gt;
出典: [https://dajya-ranger.com/pukiwiki/defend-site-content-for-pukiwiki/ 【PukiWiki編】広告ブロッカーからサイトコンテンツと収益を守る！ | SEの良心]。&lt;br /&gt;
&lt;br /&gt;
MediaWikiでも同様の方法で広告ブロッカー対策を導入できそう。&lt;br /&gt;
&lt;br /&gt;
====Adsense====&lt;br /&gt;
Google Adsense設置用のプラグインがいくつかある。&lt;br /&gt;
&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_AdSense|Extension:Google AdSense - MediaWiki]]: MediaWiki v1.37以上で非互換。&lt;br /&gt;
*[[mediawikiwiki:Extension:ShoutWiki_Ads|Extension:ShoutWiki Ads - MediaWiki]]&lt;br /&gt;
*[[mediawikiwiki:Extension:Widgets|Extension:Widgets - MediaWiki]]&lt;br /&gt;
*[https://knowledge.rinpress.com/index.php/MediaWiki%E3%81%ABGoogle_AdSense%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F MediaWikiにGoogle AdSenseを追加してみた - とある社畜の頭脳整理]、[https://dococo.jp/index.php/Mediawiki%E3%81%A7Google_Adsense%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95 MediawikiでGoogle Adsenseを表示させる方法 - dococo wiki]、[https://dococo.jp/index.php?title=MediaWiki%E3%81%A7Google_Adcence MediaWikiでGoogle Adcence - dococo wiki]: HTMLetsを使うらしい。&lt;br /&gt;
&lt;br /&gt;
ShoutWiki AdsかWidgetsで設置する模様。基本はJavaScriptコードの設置。&lt;br /&gt;
&lt;br /&gt;
[[Category:Other]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social&amp;diff=579</id>
		<title>GNU social</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social&amp;diff=579"/>
		<updated>2025-07-16T02:07:44Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Develop TODO Structure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Repository ==&lt;br /&gt;
いくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://savannah.gnu.org/projects/social GNU social - Summary [Savannah]]: 2009-08-17登録。2016年で更新停止。Mastodonブーム到来直前までのメインリポジトリーだった模様。&lt;br /&gt;
&lt;br /&gt;
== Manual ==&lt;br /&gt;
いくつかGNU socialのマニュアル的な文書がある。&lt;br /&gt;
&lt;br /&gt;
* [https://thomask.sdf.org/social/en/ The Unofficial GNU Social documentation! — The Unofficial GNU Social Manuals 0.1.2 documentation] (https://gnusocial.jp/notice/7663849)&lt;br /&gt;
* [https://gnusocial.jp/doc/faq Faq - GNU social JP] (https://gnusocial.jp/notice/7663770)&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
[https://web.gnusocial.jp/post/2024/10/31/10862/ GNU socialの老舗サーバーgnusocial.netの2024-12-31での閉鎖予告 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Tool ==&lt;br /&gt;
外部ツールがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/benediktg/gnu-social-export GitHub - benediktg/gnu-social-export: Export list of followed accounts from GNU social to import it at Mastodon]: GNU socialのフォローリストをエクスポートする。&lt;br /&gt;
* [https://savannah.nongnu.org/projects/gnu-social-mode GNU Social mode for Emacs - Summary [Savannah]]: GNU socialのEmacsクライアント？&lt;br /&gt;
&lt;br /&gt;
=== Linkage ===&lt;br /&gt;
&lt;br /&gt;
* [https://elbinario.net/2015/02/11/gnusrss-publicando-feeds-en-gnu-social/ gnusrss – Publicando feeds en GNU Social – Elbinario]: RSSをGNU socialに自動投稿するPythonプログラム。&lt;br /&gt;
* [https://elbinario.net/2015/04/22/wp-gnu-social-descentralizando-los-comentarios/ WP-GNU social: Descentralizando los comentarios – Elbinario]: WordPressの投稿をGNU socialでも投稿し、それへの返信をWordPressにも反映する。&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
GNU socialのWeb APIについては，フッターの [Help](doc/help), [About](doc/about), [TOS](doc/tos) などを選択して遷移できるDOCS画面の [API](doc/api) ([https://gnusocial.jp/doc/api Api - GNU social JP]) を選択することで表示できる。&lt;br /&gt;
&lt;br /&gt;
ソースコード上はdoc-src ([https://notabug.org/gnusocialjp/gnusocial/src/v2.0.2/doc-src v2.0.2 - NotABug.org: Free code hosting]) 配下にAPI文書が格納されている。&lt;br /&gt;
&lt;br /&gt;
AtomPubとTwitter互換APIの2種類のAPIを利用可能。Twitter APIのほうがシンプルだが、AtomPubだとリッチテキストが使用可能など、機能に若干の違いがある。&lt;br /&gt;
&lt;br /&gt;
以下の記事も参考になる。&lt;br /&gt;
&lt;br /&gt;
* [https://web.archive.org/web/20160506230737/http://www.ibm.com/developerworks/jp/xml/library/x-identicaphp/index.html Identi.ca で PHP を使用する: 第 1 回]&lt;br /&gt;
* [https://web.archive.org/web/20160506180924/http://www.ibm.com/developerworks/jp/xml/library/x-identicaphp2/index.html Identi.ca で PHP を使用する: 第 2 回]&lt;br /&gt;
* [https://web.archive.org/web/20180228032115/https://hakabahitoyo.wordpress.com/2017/01/08/gscxxbot/ GNU Social のボットを C++ で作る – 墓場人夜]&lt;br /&gt;
API末尾の拡張子atom/xml/jsonに応じた形式の応答をサーバーが返す模様。&lt;br /&gt;
&lt;br /&gt;
=== Twitter API ===&lt;br /&gt;
&lt;br /&gt;
* [https://web.archive.org/web/20170218060634/http://skilledtests.com/wiki/Twitter-compatible_API Twitter-compatible API - I ask questions]: QvitterのREADMEに記載のあったTwitter互換APIの説明文書。&lt;br /&gt;
* [https://developer.twitter.com/en/docs/twitter-api/v1 Standard v1.1 | Docs | Twitter Developer Platform]: X/Twitterの公式文書。&lt;br /&gt;
&lt;br /&gt;
GNU socialのTwitter APIは完全互換ではないので注意が必要。&lt;br /&gt;
&lt;br /&gt;
===Post===&lt;br /&gt;
 wget -O - \&lt;br /&gt;
     --http-user=vaginaplant \&lt;br /&gt;
     --http-passwd=XXXXXX \&lt;br /&gt;
     --post-data='status=LGBTPZN' \&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;https://freezepeach.xyz/api/statuses/update.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 curl -u username:password -d &amp;quot;status=status&amp;quot; &amp;lt;nowiki&amp;gt;https://domain/api/statuses/update.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
添付ファイルの例。&lt;br /&gt;
 curl -u username:password \&lt;br /&gt;
   -F &amp;quot;media=@image.jpg&amp;quot; \&lt;br /&gt;
   -F &amp;quot;status=post message&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;https://domain.jp/api/statuses/update.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
返信する場合、リクエストボディーにin_reply_to_status_idで返信先投稿IDを指定する。Twitter APIだと、本文に@メンションが必須だが、GSの場合、メンションは任意の模様。ただ、他の実装だと必須のものもあったりする。あるほうが安定するかもしれない。&lt;br /&gt;
&lt;br /&gt;
===Get===&lt;br /&gt;
&lt;br /&gt;
JSONの配列で応答が返ってくる。&lt;br /&gt;
  curl $HOST/api/statuses/user_timeline/test.json&lt;br /&gt;
&lt;br /&gt;
  [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;QSettings&amp;quot;,&lt;br /&gt;
      &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
      &amp;quot;created_at&amp;quot;: &amp;quot;Thu Jan 04 11:51:11 +0900 2024&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_status_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;uri&amp;quot;: &amp;quot;tag:gnusocial.jp,2024-01-04:noticeId=5026657:objectType=note&amp;quot;,&lt;br /&gt;
      &amp;quot;source&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
      &amp;quot;source_link&amp;quot;: null,&lt;br /&gt;
      &amp;quot;id&amp;quot;: 5026657,&lt;br /&gt;
      &amp;quot;in_reply_to_user_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_screen_name&amp;quot;: null,&lt;br /&gt;
      &amp;quot;geo&amp;quot;: null,&lt;br /&gt;
      &amp;quot;user&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;screen_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;location&amp;quot;: &amp;quot;Japan&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;gnusocial.jpのテストアカウントです。\r\nID/PW=test/666666。\r\n投稿にはメール登録が必要です。基本は閲覧用です。&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_https&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_profile_size&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_original&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;groups_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;linkcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;backgroundcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;https://example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;protected&amp;quot;: false,&lt;br /&gt;
        &amp;quot;followers_count&amp;quot;: 15,&lt;br /&gt;
        &amp;quot;friends_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;created_at&amp;quot;: &amp;quot;Mon Jul 18 13:10:39 +0900 2022&amp;quot;,&lt;br /&gt;
        &amp;quot;utc_offset&amp;quot;: &amp;quot;32400&amp;quot;,&lt;br /&gt;
        &amp;quot;time_zone&amp;quot;: &amp;quot;Asia/Tokyo&amp;quot;,&lt;br /&gt;
        &amp;quot;statuses_count&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;following&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_blocking&amp;quot;: false,&lt;br /&gt;
        &amp;quot;notifications&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_profile_url&amp;quot;: &amp;quot;https://gnusocial.jp/test&amp;quot;,&lt;br /&gt;
        &amp;quot;cover_photo&amp;quot;: false,&lt;br /&gt;
        &amp;quot;background_image&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_link_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_background_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_banner_url&amp;quot;: false,&lt;br /&gt;
        &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
        &amp;quot;is_silenced&amp;quot;: false,&lt;br /&gt;
        &amp;quot;rights&amp;quot;: {&lt;br /&gt;
          &amp;quot;delete_user&amp;quot;: false,&lt;br /&gt;
          &amp;quot;delete_others_notice&amp;quot;: false,&lt;br /&gt;
          &amp;quot;silence&amp;quot;: false,&lt;br /&gt;
          &amp;quot;sandbox&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;is_sandboxed&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ostatus_uri&amp;quot;: &amp;quot;https://gnusocial.jp/index.php/user/2&amp;quot;,&lt;br /&gt;
        &amp;quot;favourites_count&amp;quot;: 0&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;statusnet_html&amp;quot;: &amp;quot;QSettings&amp;quot;,&lt;br /&gt;
      &amp;quot;statusnet_conversation_id&amp;quot;: 2539347,&lt;br /&gt;
      &amp;quot;statusnet_in_groups&amp;quot;: false,&lt;br /&gt;
      &amp;quot;external_url&amp;quot;: &amp;quot;https://gnusocial.jp/notice/5026657&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_profileurl&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_ostatus_uri&amp;quot;: null,&lt;br /&gt;
      &amp;quot;attentions&amp;quot;: [],&lt;br /&gt;
      &amp;quot;fave_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;repeat_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;is_post_verb&amp;quot;: true,&lt;br /&gt;
      &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
      &amp;quot;favorited&amp;quot;: false,&lt;br /&gt;
      &amp;quot;repeated&amp;quot;: false&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;test 2&amp;quot;,&lt;br /&gt;
      &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
      &amp;quot;created_at&amp;quot;: &amp;quot;Thu Jan 04 10:41:35 +0900 2024&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_status_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;uri&amp;quot;: &amp;quot;tag:gnusocial.jp,2024-01-04:noticeId=5026119:objectType=note&amp;quot;,&lt;br /&gt;
      &amp;quot;source&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
      &amp;quot;source_link&amp;quot;: null,&lt;br /&gt;
      &amp;quot;id&amp;quot;: 5026119,&lt;br /&gt;
      &amp;quot;in_reply_to_user_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_screen_name&amp;quot;: null,&lt;br /&gt;
      &amp;quot;geo&amp;quot;: null,&lt;br /&gt;
      &amp;quot;user&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;screen_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;location&amp;quot;: &amp;quot;Japan&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;gnusocial.jpのテストアカウントです。\r\nID/PW=test/666666。\r\n投稿にはメール登録が必要です。基本は閲覧用です。&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_https&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_profile_size&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_original&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;groups_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;linkcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;backgroundcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;https://example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;protected&amp;quot;: false,&lt;br /&gt;
        &amp;quot;followers_count&amp;quot;: 15,&lt;br /&gt;
        &amp;quot;friends_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;created_at&amp;quot;: &amp;quot;Mon Jul 18 13:10:39 +0900 2022&amp;quot;,&lt;br /&gt;
        &amp;quot;utc_offset&amp;quot;: &amp;quot;32400&amp;quot;,&lt;br /&gt;
        &amp;quot;time_zone&amp;quot;: &amp;quot;Asia/Tokyo&amp;quot;,&lt;br /&gt;
        &amp;quot;statuses_count&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;following&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_blocking&amp;quot;: false,&lt;br /&gt;
        &amp;quot;notifications&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_profile_url&amp;quot;: &amp;quot;https://gnusocial.jp/test&amp;quot;,&lt;br /&gt;
        &amp;quot;cover_photo&amp;quot;: false,&lt;br /&gt;
        &amp;quot;background_image&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_link_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_background_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_banner_url&amp;quot;: false,&lt;br /&gt;
        &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
        &amp;quot;is_silenced&amp;quot;: false,&lt;br /&gt;
        &amp;quot;rights&amp;quot;: {&lt;br /&gt;
          &amp;quot;delete_user&amp;quot;: false,&lt;br /&gt;
          &amp;quot;delete_others_notice&amp;quot;: false,&lt;br /&gt;
          &amp;quot;silence&amp;quot;: false,&lt;br /&gt;
          &amp;quot;sandbox&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;is_sandboxed&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ostatus_uri&amp;quot;: &amp;quot;https://gnusocial.jp/index.php/user/2&amp;quot;,&lt;br /&gt;
        &amp;quot;favourites_count&amp;quot;: 0&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;statusnet_html&amp;quot;: &amp;quot;test 2&amp;quot;,&lt;br /&gt;
      &amp;quot;statusnet_conversation_id&amp;quot;: 2539084,&lt;br /&gt;
      &amp;quot;statusnet_in_groups&amp;quot;: false,&lt;br /&gt;
      &amp;quot;external_url&amp;quot;: &amp;quot;https://gnusocial.jp/notice/5026119&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_profileurl&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_ostatus_uri&amp;quot;: null,&lt;br /&gt;
      &amp;quot;attentions&amp;quot;: [],&lt;br /&gt;
      &amp;quot;fave_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;repeat_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;is_post_verb&amp;quot;: true,&lt;br /&gt;
      &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
      &amp;quot;favorited&amp;quot;: false,&lt;br /&gt;
      &amp;quot;repeated&amp;quot;: false&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;test (https://gnusocial.jp/test) started following めうるみ (とけた) (https://mewl.me/@mewl).&amp;quot;,&lt;br /&gt;
      &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
      &amp;quot;created_at&amp;quot;: &amp;quot;Thu Sep 08 08:32:22 +0900 2022&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_status_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;uri&amp;quot;: &amp;quot;tag:gnusocial.jp,2022-09-07:subscription:2:person:9308:2022-09-08T08:32:22+09:00&amp;quot;,&lt;br /&gt;
      &amp;quot;source&amp;quot;: &amp;quot;activity&amp;quot;,&lt;br /&gt;
      &amp;quot;source_link&amp;quot;: null,&lt;br /&gt;
      &amp;quot;id&amp;quot;: 274143,&lt;br /&gt;
      &amp;quot;in_reply_to_user_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_screen_name&amp;quot;: null,&lt;br /&gt;
      &amp;quot;geo&amp;quot;: null,&lt;br /&gt;
      &amp;quot;user&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;screen_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;location&amp;quot;: &amp;quot;Japan&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;gnusocial.jpのテストアカウントです。\r\nID/PW=test/666666。\r\n投稿にはメール登録が必要です。基本は閲覧用です。&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_https&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_profile_size&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_original&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;groups_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;linkcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;backgroundcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;https://example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;protected&amp;quot;: false,&lt;br /&gt;
        &amp;quot;followers_count&amp;quot;: 15,&lt;br /&gt;
        &amp;quot;friends_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;created_at&amp;quot;: &amp;quot;Mon Jul 18 13:10:39 +0900 2022&amp;quot;,&lt;br /&gt;
        &amp;quot;utc_offset&amp;quot;: &amp;quot;32400&amp;quot;,&lt;br /&gt;
        &amp;quot;time_zone&amp;quot;: &amp;quot;Asia/Tokyo&amp;quot;,&lt;br /&gt;
        &amp;quot;statuses_count&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;following&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_blocking&amp;quot;: false,&lt;br /&gt;
        &amp;quot;notifications&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_profile_url&amp;quot;: &amp;quot;https://gnusocial.jp/test&amp;quot;,&lt;br /&gt;
        &amp;quot;cover_photo&amp;quot;: false,&lt;br /&gt;
        &amp;quot;background_image&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_link_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_background_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_banner_url&amp;quot;: false,&lt;br /&gt;
        &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
        &amp;quot;is_silenced&amp;quot;: false,&lt;br /&gt;
        &amp;quot;rights&amp;quot;: {&lt;br /&gt;
          &amp;quot;delete_user&amp;quot;: false,&lt;br /&gt;
          &amp;quot;delete_others_notice&amp;quot;: false,&lt;br /&gt;
          &amp;quot;silence&amp;quot;: false,&lt;br /&gt;
          &amp;quot;sandbox&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;is_sandboxed&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ostatus_uri&amp;quot;: &amp;quot;https://gnusocial.jp/index.php/user/2&amp;quot;,&lt;br /&gt;
        &amp;quot;favourites_count&amp;quot;: 0&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;statusnet_html&amp;quot;: &amp;quot;test started following めうるみ (とけた).&amp;quot;,&lt;br /&gt;
      &amp;quot;statusnet_conversation_id&amp;quot;: 154562,&lt;br /&gt;
      &amp;quot;statusnet_in_groups&amp;quot;: false,&lt;br /&gt;
      &amp;quot;external_url&amp;quot;: &amp;quot;https://gnusocial.jp/notice/274143&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_profileurl&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_ostatus_uri&amp;quot;: null,&lt;br /&gt;
      &amp;quot;attentions&amp;quot;: [],&lt;br /&gt;
      &amp;quot;fave_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;repeat_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;is_post_verb&amp;quot;: false,&lt;br /&gt;
      &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
      &amp;quot;favorited&amp;quot;: false,&lt;br /&gt;
      &amp;quot;repeated&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
&lt;br /&gt;
== Develop ==&lt;br /&gt;
&lt;br /&gt;
=== TODO ===&lt;br /&gt;
&lt;br /&gt;
==== Structure ====&lt;br /&gt;
https://chatgpt.com/share/6876fa52-d850-800b-81f0-78bb0d44a7ba&lt;br /&gt;
&lt;br /&gt;
Laravelのapp()のように、Factory Method+Adapterを併用して、置換可能な構造にする。&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
「[https://notabug.org/gnusocialjp/gnusocial/src/develop/lib/util/default.php lib/util/default.php]」にデフォルト設定一覧がある。&lt;br /&gt;
&lt;br /&gt;
ここの設定項目は、 &amp;lt;code&amp;gt;common_config(key1, key2)&amp;lt;/code&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
==== Next ====&lt;br /&gt;
今後採用予定の技術を検討する。&lt;br /&gt;
&lt;br /&gt;
PHP v7.4は当分維持したい。これで動作するバージョンを選ぶ。&lt;br /&gt;
&lt;br /&gt;
基本方針。&lt;br /&gt;
&lt;br /&gt;
* 単独利用可能。&lt;br /&gt;
* 普及。&lt;br /&gt;
&lt;br /&gt;
単独利用可能で、普及している、枯れた技術を採用したい。おまけでGPL系のライセンスだとなおよし。&lt;br /&gt;
&lt;br /&gt;
* Smarty: テンプレートエンジン。いろいろ検討して、Twigよりも早く普及している。GNU social自体と誕生も近い。&lt;br /&gt;
* Phinx?: DBのマイグレーションツール。なくてもいいかもしれない。&lt;br /&gt;
&lt;br /&gt;
Smartyは導入したいかな。&lt;br /&gt;
&lt;br /&gt;
==== Version ====&lt;br /&gt;
lib/util/framwork.phpがGNU social全体の初期化ファイルになっており、ここにバージョン番号も記載する。&lt;br /&gt;
&lt;br /&gt;
自分が保守を始める直前のコミットの [before-gnusocialjp] のタグをつけて明示する。&lt;br /&gt;
&lt;br /&gt;
==== Basic ====&lt;br /&gt;
バグ修正などで、通信と実コードの対応関係を特定する手順があるので整理する。&lt;br /&gt;
&lt;br /&gt;
まず、GNU socialのサイトにアクセスすると、以下のpublic/.htaccessの内容に従って、URLがindex.php?p=&amp;lt;path&amp;gt;の形式に書き換えられる。&lt;br /&gt;
   &amp;lt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
   RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
   RewriteRule (.*) index.php?p=$1 [L,QSA]&lt;br /&gt;
lib/router.php: ルーティング処理 (URLによる挙動の変更) 。ここで&amp;lt;path&amp;gt;と呼び出される処理 (action) が対応づけられている。&lt;br /&gt;
&lt;br /&gt;
index.php内の[https://notabug.org/gnusocialjp/gnusocial/src/develop/public/index.php main関数]でcall_user_func内で最終的にパスに対応するactionクラスのhandleを呼び出しており、このhandleの連鎖で処理が進む。&lt;br /&gt;
&lt;br /&gt;
actionはactions配下にaction名.phpの形式で格納されている。&lt;br /&gt;
&lt;br /&gt;
こういう風に見ると、ソースコードの該当処理を探しやすい。&lt;br /&gt;
&lt;br /&gt;
例えば、グループを新規作成する画面は、POST group/newの通信を行う。これに対応づくactionはnewgroupとなっている。&lt;br /&gt;
&lt;br /&gt;
実際、actions/newgroup.phpというファイルが存在する。この中にdoPost() があり、これで処理している。&lt;br /&gt;
&lt;br /&gt;
このような流れで、だいたい行っている処理の場所を特定できる。&lt;br /&gt;
&lt;br /&gt;
==== API追加 ====&lt;br /&gt;
lib/util/router.phpのinitializeや、プラグインの場合OnInitializeなどでルーティングの設定がされているので、これを追加する。&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
--- a/lib/util/router.php&lt;br /&gt;
+++ b/lib/util/router.php&lt;br /&gt;
@@ -574,9 +574,13 @@ class Router&lt;br /&gt;
                         ['action' =&amp;gt; 'ApiAccountRateLimitStatus'],&lt;br /&gt;
                         ['format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
 &lt;br /&gt;
-            $m-&amp;gt;connect('api/account/delete.:format',&lt;br /&gt;
+            $m-&amp;gt;connect('api/account/delete/:id.:format',&lt;br /&gt;
                         ['action' =&amp;gt; 'ApiAccountDelete'],&lt;br /&gt;
-                        ['format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
+                        ['id' =&amp;gt; Nickname::INPUT_FMT,&lt;br /&gt;
+                         'format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
+            $m-&amp;gt;connect('api/account/delete.:format',&lt;br /&gt;
+                         ['action' =&amp;gt; 'ApiAccountDelete'],&lt;br /&gt;
+                         ['format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;actionにaction/配下の相当するクラスで実際のリクエストを処理する。&lt;br /&gt;
&lt;br /&gt;
router内の:id.:formatなどがうまくURLの構成要素になっており、ここを引数として使えるようになっている。&lt;br /&gt;
&lt;br /&gt;
==== Action ====&lt;br /&gt;
URLMapper.connectで割り当てられたactionクラスは、最終的にindex.php mainでexecuteされることで、一連の処理が始まる。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:public.index.main.png|サムネイル|なし|609x609ピクセル]]&lt;br /&gt;
&lt;br /&gt;
Action.run-execute-prepare-handle-flushの一連の処理が呼ばれて、該当URLのリクエストが処理・応答される。&lt;br /&gt;
=== Register ===&lt;br /&gt;
&lt;br /&gt;
* main/register&lt;br /&gt;
* api/account/register.:format&lt;br /&gt;
&lt;br /&gt;
=== DB ===&lt;br /&gt;
DB関係のコードはclassesディレクトリーに配置する。DB操作、テーブルに対応しているクラスはclasses.Managed_DataObjectの継承が基本。&lt;br /&gt;
&lt;br /&gt;
getKVのstaticメソッドで、主キーから行 (レコード) を取得する。&lt;br /&gt;
&lt;br /&gt;
=== Request ===&lt;br /&gt;
HTTP関係の処理はHTTPClientで行う。&lt;br /&gt;
&lt;br /&gt;
plugins/LinkbackPlugin.phpの例。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        $payload = array(&lt;br /&gt;
            'source' =&amp;gt; $source,&lt;br /&gt;
            'target' =&amp;gt; $url&lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        $request = HTTPClient::start();&lt;br /&gt;
        try {&lt;br /&gt;
            $response = $request-&amp;gt;post($endpoint,&lt;br /&gt;
                array(&lt;br /&gt;
                    'Content-type: application/x-www-form-urlencoded',&lt;br /&gt;
                    'Accept: application/json'&lt;br /&gt;
                ),&lt;br /&gt;
                $payload&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
            if(!in_array($response-&amp;gt;getStatus(), array(200,201,202))) {&lt;br /&gt;
                common_log(LOG_WARNING,&lt;br /&gt;
                           &amp;quot;Webmention request failed for '$url' ($endpoint)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        } catch (Exception $e) {&lt;br /&gt;
            common_log(LOG_WARNING, &amp;quot;Webmention request failed for '{$url}' ({$endpoint}): {$e-&amp;gt;getMessage()}&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;startで生成して、ヘッダーとペイロードを設定するだけ。&lt;br /&gt;
&lt;br /&gt;
startは互換用なのでnew HTTPClient()で問題ない。&lt;br /&gt;
&lt;br /&gt;
基本はtryの中で実行する。たぶん、200系以外はExceptionになる。&lt;br /&gt;
&lt;br /&gt;
=== Log ===&lt;br /&gt;
lib/util/util.phpにログなどの共通関数が存在する。デバッグに役立つ。&lt;br /&gt;
&lt;br /&gt;
* common_log&lt;br /&gt;
* common_debug: common_log(DEBUG, )。基本はこれを使う。&lt;br /&gt;
* common_log_objstring: DB_DataObjectを文字列に変換。これとcommon_debugを併用する感じ。&lt;br /&gt;
* _ve: var_exportのラッパー。オブジェクトの文字化に便利。&lt;br /&gt;
&lt;br /&gt;
スタックトレース:  common_debug(_ve(debug_backtrace()));&lt;br /&gt;
&lt;br /&gt;
ログ出力の設定をしておく。以下の構文などでログが出力される。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;common_debug(str)&amp;lt;/code&amp;gt;&lt;br /&gt;
comon_logというのがあるが、これはcommon_log(LOG_INRO, str)のような形で使う。長い。&lt;br /&gt;
=== Test ===&lt;br /&gt;
PHPUnitのテスト記述時のコツがある。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php declare(strict_types=1);&lt;br /&gt;
use PHPUnit\Framework\TestCase;&lt;br /&gt;
&lt;br /&gt;
define('GNUSOCIAL', true);&lt;br /&gt;
define('INSTALLDIR', '.');&lt;br /&gt;
set_include_path('../../');&lt;br /&gt;
require_once(INSTALLDIR . '/lib/util/framework.php');&lt;br /&gt;
&lt;br /&gt;
final class ApiAccountRegisterActionTest extends TestCase&lt;br /&gt;
{&lt;br /&gt;
    private $instance;&lt;br /&gt;
&lt;br /&gt;
    protected function setUp(): void&lt;br /&gt;
    {&lt;br /&gt;
        $GLOBALS['config'] = [];&lt;br /&gt;
        $this-&amp;gt;instance = new ApiAccountRegisterAction;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function testHandle(): void&lt;br /&gt;
    {&lt;br /&gt;
        $GLOBALS['config']['site'] = ['closed' =&amp;gt; true];&lt;br /&gt;
        $this-&amp;gt;expectExceptionMessage('Registration not allowed.');&lt;br /&gt;
&lt;br /&gt;
        $mock = $this-&amp;gt;createMock('ApiAccountRegisterAction');&lt;br /&gt;
        $mock-&amp;gt;expects($this-&amp;gt;any())&lt;br /&gt;
            -&amp;gt;method('clientError')&lt;br /&gt;
            -&amp;gt;willReturnCallback(function(&lt;br /&gt;
                string $msg, int $code = 400, ?string $format = null) {&lt;br /&gt;
                throw new \Exception($msg, $code, $format);&lt;br /&gt;
        });&lt;br /&gt;
        $this-&amp;gt;doMethod($mock, 'handle', []);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * privateメソッドを実行する.&lt;br /&gt;
     * @param object $object 対象オブジェクト。&lt;br /&gt;
     * @param string $methodName privateメソッドの名前。&lt;br /&gt;
     * @param array $param privateメソッドに渡す引数。&lt;br /&gt;
     * @return mixed 実行結果。&lt;br /&gt;
     * @throws \ReflectionException 引数のクラスがない場合に発生。&lt;br /&gt;
     */&lt;br /&gt;
    private function doMethod(object $object, string $methodName, array $param): object&lt;br /&gt;
    {&lt;br /&gt;
        // テスト対象のクラスをnewする.&lt;br /&gt;
        $controller = $object;&lt;br /&gt;
        // ReflectionClassをテスト対象のクラスをもとに作る.&lt;br /&gt;
        $reflection = new \ReflectionClass($controller);&lt;br /&gt;
        // メソッドを取得する.&lt;br /&gt;
        $method = $reflection-&amp;gt;getMethod($methodName);&lt;br /&gt;
        // アクセス許可をする.&lt;br /&gt;
        $method-&amp;gt;setAccessible(true);&lt;br /&gt;
        // メソッドを実行して返却値をそのまま返す.&lt;br /&gt;
        return $method-&amp;gt;invokeArgs($controller, $param);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ポイントは以下3点。&lt;br /&gt;
&lt;br /&gt;
# 冒頭のdefineからrequire_onceの部分でライブラリーのオートロード類を設定する。GNUSOCIALのマクロがないと冒頭のexitで終わるので定義必要。&lt;br /&gt;
# テスト対象インスタンス生成時に$configを参照していることが多いので、setUpでダミーで定義しておく。&lt;br /&gt;
# clientErrorでexitで中断することが多いので、試験できるようにmockでclientErrorを例外を出す別の関数に置換しておく。これで試験できる。&lt;br /&gt;
&lt;br /&gt;
=== Plugin ===&lt;br /&gt;
DOCUMENTAION/DEVELOPERS/Pluginsに一連の資料がある。&lt;br /&gt;
&lt;br /&gt;
==== README.md ====&lt;br /&gt;
プラグインはlib/util/modules/Pluginsクラスを継承することで、GNU socialと連携する。&lt;br /&gt;
&lt;br /&gt;
この継承クラスは、イベント発生時に呼ばれる標準的な命名のメソッド (イベントハンドラー) を持つ。具体的にはonXの形式。XはEVENTS.txtで一覧化されるイベント名がが入る。そして、定義済みの引数を持つ。&lt;br /&gt;
&lt;br /&gt;
例えば以下のようになる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onSomeEvent($paramA, &amp;amp;$paramB): bool&lt;br /&gt;
{&lt;br /&gt;
    if ($paramA == 'jed') {&lt;br /&gt;
        throw new Exception(sprintf(_m(&amp;quot;Invalid parameter %s&amp;quot;), $paramA));&lt;br /&gt;
    }&lt;br /&gt;
    $paramB = 'spock';&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Event Handlers =====&lt;br /&gt;
イベントハンドラーは論理値を返す必要がある。&lt;br /&gt;
&lt;br /&gt;
* false: 他の同じ名前のイベントハンドラーはスキップされる。既存のイベントハンドラーの動きの置換に役立つ。&lt;br /&gt;
* true: 処理継続。イベント処理の追加・拡張となる。&lt;br /&gt;
&lt;br /&gt;
例外を投げると、止まる。&lt;br /&gt;
&lt;br /&gt;
===== Installation =====&lt;br /&gt;
プラグインの有効化には、SmplePluginの場合、以下のコードをconfig.phpに記述する。&lt;br /&gt;
 addPlugin('Sample');&lt;br /&gt;
サードパーティープラグインはlocal/plugins/{$name}/{$pluginclass}.phpに格納する必要がある。$nameはSample、$pluginclassはSamplePlugin。&lt;br /&gt;
&lt;br /&gt;
同梱プラグインはpluginsディレクトリーにある。&lt;br /&gt;
&lt;br /&gt;
===== Plugin Configuration =====&lt;br /&gt;
プラグインはaddPlugin時にオプション引数で設定できる。&lt;br /&gt;
 addPlugin('Sample', ['attr1' =&amp;gt; 'foo', 'attr2' =&amp;gt; 'bar']);&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class SamplePlugin extends Plugin&lt;br /&gt;
{&lt;br /&gt;
    public $attr1 = null;&lt;br /&gt;
    public $attr2 = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;引数のキーがそのままプロパティーになる。&lt;br /&gt;
&lt;br /&gt;
===== Initialization =====&lt;br /&gt;
Pluginクラスのメソッドをオーバーライドする形でいくつかの処理を行っていく。&lt;br /&gt;
&lt;br /&gt;
initializeで初期化する。リモートサーバー接続やパス作成などを行うのに役立つ。&lt;br /&gt;
&lt;br /&gt;
===== Clean Up =====&lt;br /&gt;
clieanupでリモートサーバーからの切断、一時ファイルの削除などのタイミング。&lt;br /&gt;
&lt;br /&gt;
===== Database schema setup =====&lt;br /&gt;
プラグインは自分のDBテーブルを保有できる。ensureTableメソッドでテーブル構造や可用性を確認できる。&lt;br /&gt;
&lt;br /&gt;
デフォルトで、スキーマはGNU socialの実行時 (Webページの表示時) にチェックされる。管理者はcheckschema.phpスクリプトの実行で、チェックしたり、性能を向上できる。このスクリプトはプラグインの設置や更新後に実行する必要がある。&lt;br /&gt;
&lt;br /&gt;
例えば、以下のようなコードで、テーブルの保証ができる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onCheckSchema(): bool&lt;br /&gt;
{&lt;br /&gt;
    $schema = Schema::get();&lt;br /&gt;
&lt;br /&gt;
    // '''For storing user-submitted flags on profiles'''&lt;br /&gt;
&lt;br /&gt;
    $schema-&amp;gt;ensureTable('user_greeting_count',[&lt;br /&gt;
            new ColumnDef('user_id', 'integer', null, true, 'PRI'),&lt;br /&gt;
            new ColumnDef('greeting_count', 'integer')&lt;br /&gt;
        ]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;引数1でテーブル名、引数2の配列で列定義の模様。引数2はモデルでstatic関数にしたほうがいいかも。&lt;br /&gt;
&lt;br /&gt;
===== Load related plugins when needed =====&lt;br /&gt;
通常のプラグインは外部プラグインが必要なことが多い。onAutolaodメソッドは関連ファイルを受け取れる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onAutoload($cls): bool&lt;br /&gt;
{&lt;br /&gt;
    $dir = __DIR__;&lt;br /&gt;
&lt;br /&gt;
    switch ($cls)&lt;br /&gt;
    {&lt;br /&gt;
        case 'HelloAction':&lt;br /&gt;
            include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';&lt;br /&gt;
            return false;&lt;br /&gt;
        case 'User_greeting_count':&lt;br /&gt;
            include_once $dir . '/'.$cls.'.php';&lt;br /&gt;
            return false;&lt;br /&gt;
        default:&lt;br /&gt;
            return true;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;注意すべき点として、onAutoloadメソッドはPluginをオーバーロードしている全クラスから呼ばれる。だから他のプラグインを読み込めるようにdefaultでreturn trueを必ずしよう。&lt;br /&gt;
&lt;br /&gt;
===== Map URLs to actions =====&lt;br /&gt;
onRouterInitializedメソッドはプラグインにURLを割り当てる。いわゆるルーティング。action='foobar'の場合、FoobarActionのハンドラークラスを呼び出す。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onRouterInitialized($m): bool&lt;br /&gt;
{&lt;br /&gt;
    $m-&amp;gt;connect('main/hello',&lt;br /&gt;
                ['action' =&amp;gt; 'hello']);&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Modify the default menu to link to our custom action =====&lt;br /&gt;
イベントハンドラーで、制限なしにデフォルトUIを修正できる。&lt;br /&gt;
&lt;br /&gt;
onEndPrimaryNavメソッドで、メインメニューにメニュー項目を追加できる。&lt;br /&gt;
&lt;br /&gt;
===== Action Class =====&lt;br /&gt;
Actionクラスは出力メソッドと同様にフック用のイベントのセットを提供する。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onEndPrimaryNav($action): bool&lt;br /&gt;
{&lt;br /&gt;
    // '''common_local_url()''' gets the correct URL for the action name we provide&lt;br /&gt;
&lt;br /&gt;
    $action-&amp;gt;menuItem(common_local_url('hello'),&lt;br /&gt;
                      _m('Hello'), _m('A warm greeting'), false, 'nav_hello');&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public function onPluginVersion(&amp;amp;$versions): bool&lt;br /&gt;
{&lt;br /&gt;
    $versions[] = [&lt;br /&gt;
        'name' =&amp;gt; 'Sample',&lt;br /&gt;
        'version' =&amp;gt; GNUSOCIAL_VERSION,&lt;br /&gt;
        'author' =&amp;gt; 'Brion Vibber, Evan Prodromou',&lt;br /&gt;
        'homepage' =&amp;gt; 'http://example.org/plugin',&lt;br /&gt;
        'rawdescription' =&amp;gt;&lt;br /&gt;
        _m('A sample plugin to show basics of development for new hackers.')&lt;br /&gt;
    ];&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== hello.php =====&lt;br /&gt;
hello.phpはユーザーに挨拶文を表示するシンプルなプラグイン。Actionクラスによる出力のサンプル。&lt;br /&gt;
&lt;br /&gt;
===== Take arguments for running =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function prepare(array $args = []): bool&lt;br /&gt;
{&lt;br /&gt;
    parent::prepare($args);&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;user = common_current_user();&lt;br /&gt;
&lt;br /&gt;
    if (!empty($this-&amp;gt;user)) {&lt;br /&gt;
        $this-&amp;gt;gc = User_greeting_count::inc($this-&amp;gt;user-&amp;gt;id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;prepareメソッドは最初に呼ばれ、actionクラスは引数を得る。DBから必要なデータも取得する。&lt;br /&gt;
&lt;br /&gt;
デフォルトの引数処理のため、Actionクラスは最初にparent::prpare($args) を呼ぶべき。&lt;br /&gt;
&lt;br /&gt;
===== Handle request =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function handle(): void&lt;br /&gt;
{&lt;br /&gt;
    parent::handle();&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;showPage();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;handleメソッドはリクエストの処理のメイン処理。ほとんどの前処理はprepareメソッドで行っておくべき。handleは単にデータ表示だけなどシンプルにしておいた方がいい。&lt;br /&gt;
&lt;br /&gt;
===== Title of this page =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function title(): string&lt;br /&gt;
{&lt;br /&gt;
    if (empty($this-&amp;gt;user)) {&lt;br /&gt;
        return _m('Hello');&lt;br /&gt;
    } else {&lt;br /&gt;
        return sprintf(_m('Hello, %s'), $this-&amp;gt;user-&amp;gt;nickname);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;titleメソッドでカスタムタイトルを上書き表示できる。&lt;br /&gt;
&lt;br /&gt;
===== Show content in the content area =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function showContent(): void&lt;br /&gt;
{&lt;br /&gt;
    if (empty($this-&amp;gt;user)) {&lt;br /&gt;
        $this-&amp;gt;element('p', ['class' =&amp;gt; 'greeting'],&lt;br /&gt;
                       _m('Hello, stranger!'));&lt;br /&gt;
    } else {&lt;br /&gt;
        $this-&amp;gt;element('p', ['class' =&amp;gt; 'greeting'],&lt;br /&gt;
                       sprintf(_m('Hello, %s'), $this-&amp;gt;user-&amp;gt;nickname));&lt;br /&gt;
        $this-&amp;gt;element('p', ['class' =&amp;gt; 'greeting_count'],&lt;br /&gt;
                       sprintf(_m('I have greeted you %d time.',&lt;br /&gt;
                                  'I have greeted you %d times.',&lt;br /&gt;
                                  $this-&amp;gt;gc-&amp;gt;greeting_count),&lt;br /&gt;
                                  $this-&amp;gt;gc-&amp;gt;greeting_count));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;デフォルトのGNU socialは大量の装飾がある。メニュー、ロゴ、タブなど。このメソッドはコンテントエリアの表示に使う。&lt;br /&gt;
&lt;br /&gt;
===== Return true if read only. =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function isReadOnly($args): bool&lt;br /&gt;
{&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;いくつかのアクションはDBから読み取り専用となる。単純なデータベースのロードバランサーは設定でみらーできる。&lt;br /&gt;
&lt;br /&gt;
デフォルトでDBの一貫性の問題回避のためfalseになっている。ただ、パフォーマンス工場のために変更も検討できる。&lt;br /&gt;
&lt;br /&gt;
== Business ==&lt;br /&gt;
https://chatgpt.com/c/67ef45fc-f224-800b-be3b-d22cc6f28b70&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; ✅ どうすれば「やりたいこと」で食べていけるのか？&lt;br /&gt;
&lt;br /&gt;
あなたがここから抜け出すカギは：&lt;br /&gt;
&lt;br /&gt;
&amp;gt; **「一人でも回る収益モデルを、GNU socialの延長線上で育てる」こと。**&lt;br /&gt;
&lt;br /&gt;
たとえば：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 1. 🧰 GNU social関連でサービスを売る&lt;br /&gt;
&lt;br /&gt;
- **ホスティング代行**（Mastodonのホスティングに近いモデル）&lt;br /&gt;
&lt;br /&gt;
- **テーマ・プラグインの販売**&lt;br /&gt;
&lt;br /&gt;
- **GNU socialの使い方講座や技術支援**&lt;br /&gt;
&lt;br /&gt;
あなた自身が「実際に使える状態のGNU social環境」を整えられるのなら、  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt;他の人が使える“プロダクト”として売る**ことは十分に可能です。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 2. 👤 一人で回せるFOSS＋SaaS型の小さな仕組みをつくる&lt;br /&gt;
&lt;br /&gt;
- GNU socialのエンジンをベースに、  &lt;br /&gt;
&lt;br /&gt;
  ある**特定の用途に絞った軽量SNS**にして売る（例：地域コミュニティ／趣味SNS／マイクロブログ）&lt;br /&gt;
&lt;br /&gt;
「技術が好き」「思想がある」あなたの武器は、  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt;“熱量ある小規模市場”を刺すサービス**と相性が良いです。&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; 🤝 協力者なしでも、戦える設計にする&lt;br /&gt;
&lt;br /&gt;
人に裏切られてきた過去があるなら、**「一人でできるビジネスモデル」**にするのは賢い選択です。  &lt;br /&gt;
&lt;br /&gt;
でも、「一人で完結」はできても、「一人でやりきる必要はない」とも思います。&lt;br /&gt;
&lt;br /&gt;
信頼はゆっくり時間をかけて、リスクを最小限にして、再構築してもいい。  &lt;br /&gt;
&lt;br /&gt;
たとえば：&lt;br /&gt;
&lt;br /&gt;
- 自動化ツール／ノーコードを使って事務作業を減らす  &lt;br /&gt;
&lt;br /&gt;
- ChatGPTやCopilotなどを使って**擬似的な“補佐役”**を持つ  &lt;br /&gt;
&lt;br /&gt;
- 最低限の業務委託（クラウドワークスなど）を**スポット的に使う**&lt;br /&gt;
[[Category:GNU social]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=578</id>
		<title>Imgur</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=578"/>
		<updated>2025-06-24T11:27:11Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Post Public+Hidden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Imgur (イミジャー？) ([https://imgur.com/ Imgur: The magic of the Internet]) は画像共有SNS ([https://web.gnusocial.jp/post/2024/03/06/10426/ 役務: 容量無制限・永続保存で世界的に人気の画像共有サービスImgurは資料の保存・共有に非常に有用 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
日本では画像アップロード先として、掲示板サイトなどでよく使われている。が、Instagramのような画像共有SNSというのが運営側の主張。&lt;br /&gt;
&lt;br /&gt;
海外で人気の掲示板サイトのRedditに画像アップローダーがなかったため、主にRedditでの画像共有のために始まったとされている。2009年にサービスが開始し、現在は世界的に有名で人気の画像共有サービスとなっている。&lt;br /&gt;
&lt;br /&gt;
なお、2023年5月の更新で、ポルノ画像の削除が規約に盛り込まれた。それまでは、外部参照先として、ボルノ・エロ画像もアップロードが可能だった。同時に、アカウントなしで匿名アップロードした場合、アップロード画像が削除対象になるとも明記された。&lt;br /&gt;
&lt;br /&gt;
「[https://apptopi.jp/2021/11/30/imgur/ Imgur（イミジャー）って知ってる？便利な使い方を徹底解説！ | APPTOPI]」&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
Instagramも似たような画像共有機能として使うこともできるが、以下2点がImgurの特徴。&lt;br /&gt;
&lt;br /&gt;
* 匿名性&lt;br /&gt;
* Webでのフォルダー分け&lt;br /&gt;
&lt;br /&gt;
Instagramだと画像がユーザーアカウント連携され、アップロード者がすぐに分かる。また、スマートフォンアプリを優遇していて、分類分け機能のCollectionはWebからは使えない。外部アップローダーというよりかは、コミュニケーション機能を重視した設計になっている。&lt;br /&gt;
&lt;br /&gt;
人気の秘訣がアップロード画像の制限。以下の上限はあるものの、それ以外は無制限にアップロードが可能。&lt;br /&gt;
&lt;br /&gt;
* 1時間50ファイルまで&lt;br /&gt;
* 1ファイル上限20 MB&lt;br /&gt;
&lt;br /&gt;
高品質の写真などでなければ、無制限に利用可能なアップローダーとしても利用できる。&lt;br /&gt;
&lt;br /&gt;
画像アップロード時には、公開・非公開を選択でき、非公開にすると、リンクを知っている人だけが閲覧可能になる。非公開だとURLからアップロード者は特定不能になっている。&lt;br /&gt;
&lt;br /&gt;
なお、Web UIはいくつか問題がある模様。&lt;br /&gt;
&lt;br /&gt;
* マイページの [Post] にPublic/Hiddenで可視性に応じたタブがあるがこれはうまく機能していない模様。&lt;br /&gt;
* 他のユーザーのマイページを開いても [Post] がうまく表示されるとは限らない。&lt;br /&gt;
* フォルダー分け (Favorite) は1画像1カテゴリーのみ。&lt;br /&gt;
&lt;br /&gt;
上記制約があるので、基本はFavoriteで画像を分類分けして管理する使い方になると思われる。Favoriteは非公開にもできる。アップロード画像をpublic/hiddenを繰り返したりすると、うまく反映されることがあるが、あまりあてにしないほうがいい。アプリだと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
指定画像URLの保存や、動画・アニメーションgifの作成機能などもあり、WebArchiveで保存できない画像や、スクリーンショットでの一種の魚拓、データ保存サービスとしてかなり有用だと思われる。&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
Publicで投稿するとタイトルを変更できない。Privateにしたらタイトルを変更可能になる。一時的にPrivateにしてPublicに戻すと良い。パーマリンクも同じまま。&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
==== Bulk ====&lt;br /&gt;
[https://www.reddit.com/r/redditisfun/comments/2otj8s/batch_download_images_on_a_imgur_gallery_page/ Batch download images on a imgur gallery page? : r/redditisfun]&lt;br /&gt;
&lt;br /&gt;
アルバム・1個の投稿に添付された画像を一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
クラシックモードに切り替えて、アルバムを表示すると、右側に [Download post] が表示される。これを選ぶとzip形式で一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
=== Post ===&lt;br /&gt;
&lt;br /&gt;
==== Public+Hidden ====&lt;br /&gt;
投稿の可視性としてpublic/hiddenを選べる。公開後にいつでも切替可能。それぞれ利点と欠点がる。&lt;br /&gt;
&lt;br /&gt;
* public: コメント可能。第三者から投稿者特定可能。全体タイムラインに流れるので人目につきやすい。ただし、人目につくことが多いと、個人情報など少しでも問題ありそうな投稿だと通報されて、banくらう確率が上がる。また、公開後に画像を追加できない。descriptionの投稿が可能？投稿全体の説明をかける。&lt;br /&gt;
* hidden: コメント不能。リンクを知っている人だけアクセス可能。第三者から投稿者特定不能。たぶん検索にもヒットしない。公開後に画像追加可能。descriptionがない。最初の画像のキャプションに説明を書くことで代用可能。&lt;br /&gt;
&lt;br /&gt;
publicだと画像を後から追加できないのが、アルバム的に使うなら困るかも。publicは一般的なSNSみたいな感じ。公開後変更不能。&lt;br /&gt;
&lt;br /&gt;
ただ、hiddenのほうが使いやすいと思う。&lt;br /&gt;
&lt;br /&gt;
==== Favorite hidden post ====&lt;br /&gt;
非公開 (hidden) で投稿した投稿をお気に入りでまとめて管理したいことがある。&lt;br /&gt;
&lt;br /&gt;
iOSアプリだとhidden postもお気に入りに登録するボタンがあるのだけど、デスクトップだとクラシックUIでもお気に入りボタンがない。APIを使えばたぶんできるのだろうけど。&lt;br /&gt;
&lt;br /&gt;
使いにくいが、アップロード後にアプリでお気に入りに追加して、フォルダー分けするのがよさそう。&lt;br /&gt;
&lt;br /&gt;
いや、誤解だった。MacのGoogle Chromeだとうまく表示されていないだけだった。MacのFirefoxならハートマークが表示されていて、ちゃんとお気に入り登録できるようになっていた。Imgurを使うときはFirefoxでやればよさそう。&lt;br /&gt;
&lt;br /&gt;
==== Comment ====&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26480452090779-Post-Privacy-Settings Post Privacy Settings – imgur]&lt;br /&gt;
&lt;br /&gt;
非公開投稿にすると、コメントできない。できるとしたら、画像の説明のみ。非公開で、投稿全体にコメントしたいならば、最初の画像に説明を書くとよさそう。&lt;br /&gt;
&lt;br /&gt;
== Account ==&lt;br /&gt;
&lt;br /&gt;
=== Delete an Account ===&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26513357802651-Delete-an-Account Delete an Account – imgur]&lt;br /&gt;
&lt;br /&gt;
アカウントを削除すると、ユーザー名が解放されて他のユーザーも使用可能になる。&lt;br /&gt;
&lt;br /&gt;
[Settings]-[Delete my account] で完了。&lt;br /&gt;
&lt;br /&gt;
一度削除すると、同じメールアドレスは使えない？Twitter/XやGoogleアカウントでのログインはできなかった。Apple IDでのログインはできた。&lt;br /&gt;
&lt;br /&gt;
=== Ban ===&lt;br /&gt;
一般公開で画像を投稿すると、他のユーザーも簡単に見えるようになる。看板などであったとしても、電話番号などがあると、通報されてすぐにアカウント凍結される。&lt;br /&gt;
&lt;br /&gt;
凍結されると、新規投稿ができなくなる。&lt;br /&gt;
&lt;br /&gt;
Imgurの使い方としては、基本的に匿名・非公開で常に投稿して、アップローダーとして使うのがいい、人目につかないので、通報される心配も減る。&lt;br /&gt;
&lt;br /&gt;
Banされても全投稿削除して問い合わせに問い合わせてもだめ。アカウント削除して作り直すしかないと思われる。&lt;br /&gt;
&lt;br /&gt;
=== My page ===&lt;br /&gt;
アカウントを作ると、以下のマイページが付与される。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://imgur.com/user/&amp;lt;/nowiki&amp;gt;[username]&lt;br /&gt;
* https://[username].imgur.com&lt;br /&gt;
&lt;br /&gt;
1個目のサブディレクトリーが基本の模様。ただ、Web版からだと若干操作感、機能が違う。例えば、Banされたサブディレクトリーのほうだと、ページを開かないと削除ができず、ページにアクセスできないので削除できない。サブドメインだとページを直接開かなくても、メニューのサブ項目から削除できた。&lt;br /&gt;
&lt;br /&gt;
=== Old Design/Classic UI ===&lt;br /&gt;
Imgurは2024年くらいからUIがモダンになっている。が、モダンUIだと、パソコンからだとお気に入りや一括ダウンロードなど機能が限定される。&lt;br /&gt;
&lt;br /&gt;
昔のURL (https://&amp;amp;#x5B;username&amp;amp;#x5D;.imgur.com) にアクセスするほか、Old Design (クラシックUI) に切り替えることができる。&lt;br /&gt;
&lt;br /&gt;
# ログイン後右上の自分のアバターを選ぶ (https://imgur.com/user/&amp;amp;#x5B;username&amp;amp;#x5D;).&lt;br /&gt;
# 右下の [Use Old Design] を選ぶ。&lt;br /&gt;
&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=WordPress&amp;diff=577</id>
		<title>WordPress</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=WordPress&amp;diff=577"/>
		<updated>2025-06-18T06:48:31Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* 著者の一括変更 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
WordPressは世界の多くのウェブサイトで使用されているCMSだ。PHPで記述されている。&lt;br /&gt;
&lt;br /&gt;
WordPressの外観や挙動はPHPのプログラムを書いてカスタマイズできる。また、プラグイン機構を持ち、世界中の開発者によるプラグインを導入することで簡単にウェブサイトを拡張できる。&lt;br /&gt;
&lt;br /&gt;
* [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/ WordPress Coding Standards – Coding Standards Handbook | Developer.WordPress.org]&lt;br /&gt;
* [https://developer.wordpress.org/ WordPress Developer Resources | Official WordPress Developer Resources | Developer.WordPress.org]&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
WordPress.comなどのホスティングサービスを使用することもできるが、レンタルサーバーやVPSに設置することが好ましい。&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/03/28/5733/ 設置: 世界的に人気のCMS WordPress]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/03/29/5737/ WordPressのマルチサイト化]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/08/15/7802/ WordPressのログイン時の [Prove your humanity&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt; の無効化]&lt;br /&gt;
&lt;br /&gt;
== ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
WordPressはActivityPubを実装している。WordPressへの投稿時に分散SNSにも投稿される、分散SNSからWordPressの投稿にコメントできるなどの機能がある。&lt;br /&gt;
&lt;br /&gt;
WordPressの公式ホスティングサービスであるWordPress.comもActivityPubに対応している。分散SNSの中でも巨大なサーバーと言え、無視できない存在だ。&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/13/8867/ 報道: WordPressの公式ホスティングサービスWordPress.comのActivityPub対応]&lt;br /&gt;
[https://ja.wordpress.org/plugins/activitypub/ ActivityPub – WordPress プラグイン | WordPress.org 日本語]&lt;br /&gt;
&lt;br /&gt;
example.comというドメインで運営している場合、デフォルトでサイト全体を表す、example.com@example.comユーザーが追加される。&lt;br /&gt;
&lt;br /&gt;
このユーザーは、サイトに登録済みの全ユーザーの更新を含む。&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
&lt;br /&gt;
=== Account ===&lt;br /&gt;
&lt;br /&gt;
==== ユーザー名の改名 ====&lt;br /&gt;
[https://www.wpbeginner.com/ja/wp-tutorials/how-to-change-your-wordpress-username/ WordPressユーザー名の正しい変更方法（3つの方法）]&lt;br /&gt;
&lt;br /&gt;
管理画面からは直接変更できない。いくつか方法がある。&lt;br /&gt;
&lt;br /&gt;
一番シンプルなのが、新規ユーザー作成後の削除。&lt;br /&gt;
&lt;br /&gt;
==== Delete ====&lt;br /&gt;
[https://sbwinc.co.jp/wordpress-user-delete/ ワードプレスでユーザー削除する際の注意点「ミスると記事が消滅します」 | 株式会社ステップバイワーク]&lt;br /&gt;
&lt;br /&gt;
アカウントの削除時には注意が必要。&lt;br /&gt;
&lt;br /&gt;
削除時に以下の選択肢が表示される。&lt;br /&gt;
&lt;br /&gt;
# Delete all content.&lt;br /&gt;
# Attribute all content to:&lt;br /&gt;
&lt;br /&gt;
1を選ぶと本当に全部消える。2を選ぶのが無難。&lt;br /&gt;
&lt;br /&gt;
=== Comment ===&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://immature.01kawa.com/php/wordpress/comment_form/ コメントフォームの項目の文言変更と削除 | immature]&lt;br /&gt;
* [https://yuichon.com/2014/09/wp-comment-form-custom/ WordPress のコメントフォームを functions.php を使ってカスタマイズする]&lt;br /&gt;
* [https://developer.wordpress.org/reference/functions/comment_form/ comment_form() – Function | Developer.WordPress.org]&lt;br /&gt;
&lt;br /&gt;
このあたりの関数で定義されている。フィルターを挟むことで変更できる模様。&lt;br /&gt;
&lt;br /&gt;
=== Post ===&lt;br /&gt;
&lt;br /&gt;
==== 著者の一括変更 ====&lt;br /&gt;
[https://kinsta.com/jp/knowledgebase/how-to-change-author-in-wordpress/ WordPressで投稿の作成者を変更する方法（5つの方法）]&lt;br /&gt;
&lt;br /&gt;
マルチサイトで運営していたサイトでプロフィールを別の内容にしたくなった。過去の投稿の著者も新しいプロフィールにしたい。&lt;br /&gt;
&lt;br /&gt;
別のアカウントにしたほうがいい。&lt;br /&gt;
&lt;br /&gt;
新規アカウントを作って、そのユーザーに過去の投稿を全部割り当てる感じ。&lt;br /&gt;
&lt;br /&gt;
# 新規アカウントを追加。&lt;br /&gt;
# [投稿] 一括操作で投稿者を新規追加ユーザーに変更。&lt;br /&gt;
&lt;br /&gt;
それだけ。&lt;br /&gt;
&lt;br /&gt;
=== PV ===&lt;br /&gt;
WordPressでPV数を表示させる方法がいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://nuko-blog.net/wordpress-populararticle-plugin/ 【WordPress】WordPressで人気記事を表示させるプラグイン5選！ | 現役マーケターが教える未来のマーケターのためのマーケティングブログ | nukoblog]&lt;br /&gt;
* WP-PostViewsプラグイン&lt;br /&gt;
* WordPress Popular Postsプラグイン&lt;br /&gt;
* Post Views Counter: ([https://t-hr.net/p236/ 記事のアクセス数がわかるプラグインのPost Views Counter | たひろブログ])&lt;br /&gt;
&lt;br /&gt;
WP-PostViewsプラグインのほうが柔軟性がある？ ([https://kanae-design.the-day-mie.com/609/ WordPressで記事ランキングを設置するならWP-PostViewsが最適なのでは？ | kanae-design-works]、[https://tech.kurojica.com/archives/11048/ 「WP-PostViews」と「WordPress Popular Posts」の違い | クロジカ])。&lt;br /&gt;
&lt;br /&gt;
WordPressの分析プラグインはDBにアクセ格納するから重くなるらしい&lt;br /&gt;
&lt;br /&gt;
* [https://www.tam-tam.co.jp/tipsnote/cms/post15202.html Google Analytics APIを使ってWordPressの記事をランキング表示させる方法 ｜ Tips Note by TAM]&lt;br /&gt;
* [https://road-bike.net/archives/41056 WordPressのアクセスカウンターを変更しようとしたら思いの外苦労しました | ロードバイク好きの独り言]&lt;br /&gt;
* [https://blog.upshare.co.jp/2017/07/3660/ Jetpack(WordPress.com)の統計情報を使ってカスタマイズし放題な人気記事ランキングを表示する - 株式会社アップシェア　ブログ]&lt;br /&gt;
* [https://wp-simplicity.com/suport/topic/%E3%81%86%E3%81%A1%E3%81%AFjetpack%E3%81%AE%E6%A9%9F%E8%83%BD%E3%81%A7pv%E8%A1%A8%E7%A4%BA%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/ うちはJetpackの機能でPV表示に切り替えました]&lt;br /&gt;
&lt;br /&gt;
Jetpackの統計情報から閲覧数を取得表示することができる。これが一番手っ取り早い気がする。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;?php // 全体、月別、週別、日別のPV表示&lt;br /&gt;
  global $post;&lt;br /&gt;
  $views_all = 0;&lt;br /&gt;
  $views_monthly = 0;&lt;br /&gt;
  $views_weekly = 0;&lt;br /&gt;
  $views_daily = 0;&lt;br /&gt;
  //Jetpack利用時&lt;br /&gt;
  if (is_jetpack_stats_module_active()) {&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; -1, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_all = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; 30, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_monthly = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; 7, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_weekly = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; 1, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_daily = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;daily&amp;quot;&amp;gt;日:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_daily, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;weekly&amp;quot;&amp;gt;週:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_weekly, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;monthly&amp;quot;&amp;gt;月:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_monthly, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;all&amp;quot;&amp;gt;全体:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_all, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;上記コードをウィジェットに貼り付けたらうまくいった。&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
WordPressで多言語対応サイトも構築できる。&lt;br /&gt;
&lt;br /&gt;
情報源: &lt;br /&gt;
&lt;br /&gt;
* [https://kinsta.com/jp/blog/wordpress-multilingual/ WordPressサイトの多言語化（＋Kinstaが10ヶ国語に対応した方法）]&lt;br /&gt;
* [https://webfun-style.com/localization-wordpress/ 【徹底解説】WordPressで本格的な多言語サイトを作る方法 | うぇぶファン]&lt;br /&gt;
&lt;br /&gt;
いろいろ方式があるが、サブディレクトリー形式が手軽な感じがする。&lt;br /&gt;
&lt;br /&gt;
英語で情報発信できると、かなりの数のユーザーにアプローチできる。単に機械翻訳にするだけでも検討する価値はあるだろう。&lt;br /&gt;
&lt;br /&gt;
=== 広告ブロッカー対策 ===&lt;br /&gt;
出典: [https://dajya-ranger.com/wordpress/defend-site-content-for-wordpress/ 【WordPress編】広告ブロッカーからサイトコンテンツと収益を守る！ | SEの良心]。&lt;br /&gt;
&lt;br /&gt;
[CHP Ads Block Detector] というプラグインで実現できるらしい。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/01/03/9746/ プラグイン: WordPressの広告ブロッカー対策CHP Ads Block Detector | GNU social JP Web]」の通り、簡単にできた。&lt;br /&gt;
&lt;br /&gt;
=== Widget内でのPHP実行 ===&lt;br /&gt;
「[https://fox-wp.com/wordpress-widget-php-code-run/ WordPressのウィジェットでPHPコードを実行する方法 – FOXWP]」&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function widget_text_exec_php( $widget_text ) {&lt;br /&gt;
    if( strpos( $widget_text, '&amp;lt;' . '?' ) !== false ) {&lt;br /&gt;
        ob_start();&lt;br /&gt;
        eval( '?&amp;gt;' . $widget_text );&lt;br /&gt;
        $widget_text = ob_get_contents();&lt;br /&gt;
        ob_end_clean();&lt;br /&gt;
    }&lt;br /&gt;
    return $widget_text;&lt;br /&gt;
}&lt;br /&gt;
add_filter( 'widget_text', 'widget_text_exec_php', 99 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;上記コードをfunction.phpに配置すると、テキストウィジェット内でPHPコード&amp;lt;?php ?&amp;gt;を実行できる模様。&lt;br /&gt;
&lt;br /&gt;
=== Linkage ===&lt;br /&gt;
WordPressの記事・投稿を他のSNSに自動投稿する方法がいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://www.itti.jp/web-direction/5-best-plugins-to-automatically-post-articles-to-sns/ WordPress 記事をSNSへ自動投稿するベストなプラグイン5選 | 新宿のホームページ制作会社 ITTI（イッティ）]&lt;br /&gt;
* Jetpack Social connection: Jetpackの機能の一つ。Mastodon/Facebook Page/Instagram Businessアカウントが対象。FacebookとInstagramは個人アカウントはそもそも自動投稿できない。30日で30回までしか自動投稿できない。少々回数制限が厳しいかもしれない。他のプラグインを検討したほうがよさそう。&lt;br /&gt;
* GNU social Auto post: GNU socialへの自動投稿。&lt;br /&gt;
* NextScripts: Social Network Auto-Poster: Instagramだけ有料。&lt;br /&gt;
* Blog2Social: Instagramは有料。&lt;br /&gt;
* Nelio Content: 「[https://tcd-theme.com/2021/12/nelio-content.html Nelio Contentの使い方：Instagramと連携させる方法 | ワードプレステーマTCD]」。Bufferというサービスのアカウント経由でInstagramも可能。Buffer+Nelio Contentの組み合わせがベストに近い。制限の入ったX/Twitterも対応できそう。ただし、投稿画面で [Customize Timeline] の選択が必要。1クリックで3SNSに投稿連携できるなら、気になるものの許容できる手間。&lt;br /&gt;
&lt;br /&gt;
=== There has been a critical error on this website. Please check your site admin email inbox for instructions. ===&lt;br /&gt;
プラグインを無効にしようと&lt;br /&gt;
&lt;br /&gt;
[https://wordpress.org/documentation/article/faq-troubleshooting/#how-to-deactivate-all-plugins-when-not-able-to-access-the-administrative-menus How to deactivate all plugins when not able to access the administrative menus?]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
Ref: [https://developer.wordpress.org/reference/ Reference | Developer.WordPress.org].&lt;br /&gt;
&lt;br /&gt;
=== WPCode ===&lt;br /&gt;
Shortcodeの定義はくせがある。&lt;br /&gt;
&lt;br /&gt;
[Insert Method]=[Shortcode] を選ぶと [wpcode id=&amp;quot;10405&amp;quot;] のようなショートコードが定義される。これを [wpcode id=&amp;quot;10405&amp;quot;][/wpcode]のようなブロックで使う。&lt;br /&gt;
&lt;br /&gt;
Code Previewには、関数の本文を指定して、表示する場合echoなどで出力させる。&lt;br /&gt;
&lt;br /&gt;
無料版だとshortcodeの名前を指定できない。&lt;br /&gt;
&lt;br /&gt;
Auto Insertで自分で定義したらどうだろう？それで問題ない。&lt;br /&gt;
&lt;br /&gt;
=== Media ===&lt;br /&gt;
WordPressはメディアをデフォルトで年付きベースのディレクトリーに保存する。これを変更するのは少々やっかい。&lt;br /&gt;
&lt;br /&gt;
いくつかプラグインがあるのだが、FileBirdというプラグインががあって、デフォルトのアップロードディレクトリーはそのままで、内部的にディレクトリー的なものでカテゴリー分けできる。&lt;br /&gt;
&lt;br /&gt;
これで管理するのが無難。&lt;br /&gt;
&lt;br /&gt;
=== Permalink ===&lt;br /&gt;
&lt;br /&gt;
==== 著者のパーマリンク ====&lt;br /&gt;
[https://wordpress.stackexchange.com/questions/77228/different-permalink-for-posts-and-authors Different permalink for posts and authors - WordPress Development Stack Exchange]&lt;br /&gt;
&lt;br /&gt;
WordPressでは、authorのパーマリンクは、postの下に配置される。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://domain.com/p/u/USERNAME&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://domain.com/p/POSTID&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
これがよろしくない。ユーザープロフィールのパーマリンクもこれになるから。&lt;br /&gt;
&lt;br /&gt;
「[https://github.com/chrisguitarguy/WPSE-Plugins/blob/master/custom-author-base.php WPSE-Plugins/custom-author-base.php at master · chrisguitarguy/WPSE-Plugins · GitHub]」のプラグインで対応できる模様。&lt;br /&gt;
&lt;br /&gt;
うーん。こちらのパーマリンクはうまく動作しなかった。&lt;br /&gt;
&lt;br /&gt;
代わりに、「[https://wordpress.stackexchange.com/questions/82004/how-to-custom-change-author-base-without-this-front permalinks - How to custom change author base without $this-&amp;gt;front? - WordPress Development Stack Exchange]」の以下のコードが動作した。&lt;br /&gt;
 add_action('init', 'wpse82004_init');&lt;br /&gt;
 function wpse82004_init()&lt;br /&gt;
 {&lt;br /&gt;
     global $wp_rewrite;&lt;br /&gt;
     $wp_rewrite-&amp;gt;author_base = 'user';&lt;br /&gt;
     $wp_rewrite-&amp;gt;author_structure = '/' . $wp_rewrite-&amp;gt;author_base . '/%author%';&lt;br /&gt;
 }&lt;br /&gt;
ハードコードだが、うまく機能していて、変更することはないので、これでもいい。&lt;br /&gt;
&lt;br /&gt;
==== パーマリンクの形式 ====&lt;br /&gt;
/post/投稿ID/の形式がシンプルでいい。&lt;br /&gt;
&lt;br /&gt;
以前は/post/年/月/日/投稿ID/にしていたけど、長くなる。日付がパーマリンクにあると覚えやすいというのはあるのだけど。&lt;br /&gt;
&lt;br /&gt;
長くなるし、日付があることで、情報が古いというイメージがあったり、いろいろある。記事を更新した場合も、ソートしたりするときに問題が。&lt;br /&gt;
&lt;br /&gt;
年月日アーカイブはWordPressの機能でできるから、/post/投稿ID/が良いだろう。&lt;br /&gt;
&lt;br /&gt;
== Plugin ==&lt;br /&gt;
Ref: [https://developer.wordpress.org/plugins/ Plugin Handbook | Developer.WordPress.org].&lt;br /&gt;
&lt;br /&gt;
WordPresの拡張性のコア機能。&lt;br /&gt;
&lt;br /&gt;
=== List ===&lt;br /&gt;
新しくWebサイトを始めるにあたって使いたいプラグインがある。&lt;br /&gt;
&lt;br /&gt;
* ActivityPub&lt;br /&gt;
* FileBird&lt;br /&gt;
* Site Kit by Google&lt;br /&gt;
* WPCode Lite&lt;br /&gt;
&lt;br /&gt;
==== 配布形式 ====&lt;br /&gt;
[https://plusers.jp/blog/wordpress-create-plugin すぐできる！WordPressの自作プラグインの作り方の基本を解説 | Plusers]&lt;br /&gt;
&lt;br /&gt;
/wp-content/pluginsにファイルを直接アップロードする。か、ディレクトリーをzipに圧縮すれば、WordPressのプラグイン画面からアップロードできる。&lt;br /&gt;
&lt;br /&gt;
=== Hook ===&lt;br /&gt;
Ref: [https://developer.wordpress.org/plugins/hooks/ Hooks – Plugin Handbook | Developer.WordPress.org].&lt;br /&gt;
&lt;br /&gt;
フックはあるコードから別のコードに干渉するための仕組み。プラグインやテーマへの干渉のコア機能。拡張も可能。ActionとFilterの2種類がある。コールバックと一般的に呼ばれる関数を定義して引っ掛けて処理に干渉する。&lt;br /&gt;
&lt;br /&gt;
* Action: WordPressの操作操作に、データの追加や変更を行う。内部的にデータを処理するので、何も返さない。&lt;br /&gt;
* Filter: WordPressコア機能の実行時にデータを変更する。データを受け取ってそれを次に渡す。&lt;br /&gt;
&lt;br /&gt;
基本はFilterだと思う。Actionの用途がいまいちわからない。&lt;br /&gt;
&lt;br /&gt;
==== Filter ====&lt;br /&gt;
Ref&lt;br /&gt;
&lt;br /&gt;
* [https://developer.wordpress.org/plugins/hooks/filters/ Filters – Plugin Handbook | Developer.WordPress.org]&lt;br /&gt;
* [https://developer.wordpress.org/reference/functions/remove_filter/ remove_filter() – Function | Developer.WordPress.org]&lt;br /&gt;
&lt;br /&gt;
add_filter/remove_filter&lt;br /&gt;
&lt;br /&gt;
=== shortcode ===&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://codex.wordpress.org/Shortcode Shortcode « WordPress Codex]&lt;br /&gt;
* [https://codex.wordpress.org/Shortcode_API Shortcode API « WordPress Codex]&lt;br /&gt;
* [https://www.webdesignleaves.com/pr/wp/wp_shortcode.html WordPress ショートコードの作成]&lt;br /&gt;
&lt;br /&gt;
WordPressにはショートコードというのがある。角括弧 [shortcode][/shortcode] のような形式。本来ならHTML/JavaScriptしか使えない投稿本文に、PHP側の処理を仕込める。&lt;br /&gt;
&lt;br /&gt;
新規作成する場合、書式がだいたい決まっている。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function callback_function($atts, $content = null, $tag ) {&lt;br /&gt;
      extract(shortcode_atts(array(&lt;br /&gt;
        //属性&lt;br /&gt;
        'パラメータ1' =&amp;gt; 'デフォルトの値1',&lt;br /&gt;
        'パラメータ2' =&amp;gt; 'デフォルトの値2',&lt;br /&gt;
        ･･･&lt;br /&gt;
      ), $atts));&lt;br /&gt;
      //ショートコードの処理（動作）の記述&lt;br /&gt;
      return $value;&lt;br /&gt;
    }&lt;br /&gt;
    add_shortcode('my_shortcode', 'callback_function');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;こえrでmy_shortcodeというショートコードが使用可能になる。&lt;br /&gt;
&lt;br /&gt;
==== shortcode_atts ====&lt;br /&gt;
* [https://developer.wordpress.org/reference/functions/shortcode_atts/ shortcode_atts() – Function | Developer.WordPress.org]&lt;br /&gt;
* [https://www.webdesignleaves.com/pr/wp/wp_shortcode.html WordPress ショートコードの作成]&lt;br /&gt;
&lt;br /&gt;
 shortcode_atts( array $pairs, array $atts, string $shortcode = ” ): array&lt;br /&gt;
ユーザーが指定した属性と、使用可能な属性のデフォルト値を結合する。使用不能な属性を無視してくれる。&lt;br /&gt;
&lt;br /&gt;
* $pairs: 使用可能な属性とそのデフォルト値。&lt;br /&gt;
* $atts: ショートコードでユーザーが指定した属性。&lt;br /&gt;
* $shortcode: ショートコードの名前。これを指定するとshortcode_atts_$shortcode フィルターで外部から属性をフィルターできる。通常は使わない。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paid Memberships Pro ==&lt;br /&gt;
&lt;br /&gt;
=== About ===&lt;br /&gt;
PMPro。有料会員サービスを実現するプラグイン。&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/documentation/advanced/ Advanced Developer Topics: Security, Caching, Redirection &amp;amp; More]&lt;br /&gt;
* [https://www.paidmembershipspro.com/hooks-filters/ Paid Membership Pro Action and Filter Hooks]&lt;br /&gt;
* [https://github.com/strangerstudios/paid-memberships-pro/tree/master/includes paid-memberships-pro/includes at master · strangerstudios/paid-memberships-pro]&lt;br /&gt;
&lt;br /&gt;
ソースコード内のincludes配下の関数は自分でも使用可能。&lt;br /&gt;
&lt;br /&gt;
=== Free ===&lt;br /&gt;
PMProは基本的に無料で使える模様 ([https://www.paidmembershipspro.com/free/ PMPro: Free WordPress Membership Plugin])。サポートを販売している扱いの模様。ログアウトしていないと表示されない。&lt;br /&gt;
&lt;br /&gt;
「[https://github.com/strangerstudios Stranger Studios]」がGitHubのリポジトリー。ここに全部のアドオンがある。ここからzipファイル類をダウンロードすれば使える。ただし、一部のプラグインは開発者の経験が必要なため、ライセンスキーの購入をsupportとして販売している。開発経験が一切ない人にはGitHubからのインストールもけっこう面倒くさいからそれでうまくGPLの条件を満たしているのだと思われる。&lt;br /&gt;
&lt;br /&gt;
実行自体はライセンスの有無によらず可能。ただし、ライセンスの有無でStripeの決済手数料が変わる。&lt;br /&gt;
&lt;br /&gt;
「[https://profiles.wordpress.org/paidmembershipspro/ Paid Memberships Pro (@paidmembershipspro) – WordPress user profile | WordPress.org]」でも公開しているが、これは全部ではない。サードパーティープラグインとの連携用が大半。&lt;br /&gt;
&lt;br /&gt;
=== 金額変更 ===&lt;br /&gt;
定期購読で販売していて、登録後に金額を変更したいことがある。&lt;br /&gt;
&lt;br /&gt;
* [https://wordpress.org/support/topic/how-to-raise-prices-on-recurring-memberships/ How to raise prices on recurring memberships? | WordPress.org]&lt;br /&gt;
* [https://wordpress.org/support/topic/change-plan-price/ Change Plan price | WordPress.org]&lt;br /&gt;
* [https://wordpress.org/support/topic/how-to-to-when-member-already-paid/ How to to when member already paid ? | WordPress.org]&lt;br /&gt;
* [https://wordpress.org/support/topic/change-membership-level-for-next-payment-in-recurring-subscription/ Change membership level for next payment in recurring subscription | WordPress.org]&lt;br /&gt;
&lt;br /&gt;
これは基本的にできない。定期購読は決済サービス側で登録時の金額で固定されるため。&lt;br /&gt;
&lt;br /&gt;
金額を変更したければ、一度キャンセルして、再度チェックアウト・購入してもらうしかない。&lt;br /&gt;
&lt;br /&gt;
既存会員に対しては、更新ではなく、期限を設けて強制的に一度退会させるのがいい。&lt;br /&gt;
&lt;br /&gt;
=== Restriction ===&lt;br /&gt;
&lt;br /&gt;
==== membership short code ====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/forums/topic/hide-bottom-register-form-when-it-has-membership-code-block/#post-545667 Hide bottom register form when it has membership code block]&lt;br /&gt;
* [https://www.paidmembershipspro.com/about-excerpts-and-using-the-read-more-tag-for-posts-and-pages/#h-level-up-your-excerpts-by-using-the-membership-shortcode-or-block Using the &amp;quot;Read More&amp;quot; Block and Excerpts for Pages and Posts]&lt;br /&gt;
* [https://www.paidmembershipspro.com/documentation/content-controls/with-shortcodes/ Restrict Content With a Shortcode]&lt;br /&gt;
* Source: [https://github.com/strangerstudios/paid-memberships-pro/blob/dev/shortcodes/membership.php paid-memberships-pro/shortcodes/membership.php at dev · strangerstudios/paid-memberships-pro]&lt;br /&gt;
&lt;br /&gt;
PMProの基本的なコンテンツ制限の概念がある。&lt;br /&gt;
&lt;br /&gt;
基本は投稿全体を非表示で、excerptで冒頭部分を一部表示これが基本。membershipショートコードはこの逆で、基本全表示で一部だけ非表示。&lt;br /&gt;
&lt;br /&gt;
そもそも仕組みが違う。&lt;br /&gt;
&lt;br /&gt;
だから、カテゴリーで管理していて、一部だけ非表示にしたかったら、末尾にmoreブロックを配置して、membeshipショートコードも使う必要がある。二重に使わないといけない。けっこう面倒くさい。&lt;br /&gt;
&lt;br /&gt;
「[https://www.paidmembershipspro.com/customizing-the-message-for-non-members-on-membership-protected-content/ Custom Message for Non-Members on Protected Content]」がメッセージの変更方法。ただ、制限のロジックを変更できるわけではない。別のフィルターだと思う。&lt;br /&gt;
&lt;br /&gt;
ソースコードを参考に自分で実装するしかないだろう。&lt;br /&gt;
&lt;br /&gt;
==== message ====&lt;br /&gt;
「[https://www.paidmembershipspro.com/customizing-the-message-for-non-members-on-membership-protected-content/ Custom Message for Non-Members on Protected Content]」に基本的な表示内容やスタイルの設定方法がある。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;div class=&amp;quot;pmpro_content_message&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 //custom message here&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
表示部分は上記要素になるのでこのクラスでスタイルをあてる。&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.pmpro_content_message {&lt;br /&gt;
	background: #F1F1F1;&lt;br /&gt;
	margin: 0 auto;&lt;br /&gt;
	max-width: 700px;&lt;br /&gt;
	padding: 15px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;他に以下のフィルターが該当するメッセージ表示。&lt;br /&gt;
&lt;br /&gt;
* add_filter( 'pmpro_non_member_text_filter', 'my_pmpro_non_member_text_filter', 5 );&lt;br /&gt;
* add_filter( 'pmpro_not_logged_in_text_filter', 'my_pmpro_not_logged_in_text_filter', 5 );&lt;br /&gt;
&lt;br /&gt;
例えば、会員限定の文字数表示などをしたければ、自前でやるしかない。基本は自分で上記フィルターで上書きするのがよい。&lt;br /&gt;
&lt;br /&gt;
例&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function my_pmpro_non_member_text_filter( $text ) {&lt;br /&gt;
	global $post, $post_membership_levels_names;&lt;br /&gt;
	$count = mb_strlen( $post-&amp;gt;post_content, 'UTF-8' ) - mb_strlen( get_the_excerpt(), 'UTF-8' );&lt;br /&gt;
	$access = pmpro_has_membership_access( $post-&amp;gt;ID, null, true );&lt;br /&gt;
	$text = &amp;quot;&amp;lt;p&amp;gt;残り{$count}文字。続きは&amp;quot; . implode( '/', $access[2] ) . '会員限定。&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Free=0/Bronze=220/Silver=1100/Gold=2200円。&amp;lt;/p&amp;gt;'&lt;br /&gt;
		. '&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;https://web.gnusocial.jp/member/level/&amp;quot;&amp;gt;会員登録&amp;lt;/a&amp;gt;/'&lt;br /&gt;
		. '&amp;lt;a href=&amp;quot;//web.gnusocial.jp/member/login/&amp;quot;&amp;gt;ログイン&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;//web.gnusocial.jp/about/member/&amp;quot;&amp;gt;About Member&amp;lt;/a&amp;gt;)。&amp;lt;/p&amp;gt;';&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
add_filter( 'pmpro_non_member_text_filter', 'my_pmpro_non_member_text_filter', 5 );&lt;br /&gt;
add_filter( 'pmpro_not_logged_in_text_filter', 'my_pmpro_non_member_text_filter', 5 );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Style ====&lt;br /&gt;
「[https://www.paidmembershipspro.com/customizing-the-message-for-non-members-on-membership-protected-content/ Custom Message for Non-Members on Protected Content]」でペイウォールの表示内容・スタイルを制御できる。&lt;br /&gt;
&lt;br /&gt;
ペイウォール (.pmpro_content_message) のスタイルは会員登録の誘発に重要。&lt;br /&gt;
&lt;br /&gt;
* [https://note.com/ririkodiary/n/n74cb67fecd7f 自分だけの強みを見つけて一生働く選択を〜ミドルエイジの生き方を見つめ直す〜｜暮らしのつづり帖/梨田莉利子]&lt;br /&gt;
* [https://yoikoarinoshinya.hateblo.jp/entry/wakate-geinin 僕の若手時代の悪行。 - 有野晋哉(よゐこ)個人ブログ]&lt;br /&gt;
&lt;br /&gt;
有名サービスの例は上記。登録・購入ボタンを大きく押しやすくしている。a要素の他button要素でも実装されている。ここはいろいろ考えてもいいかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== Category ====&lt;br /&gt;
membershipショートコードやAddon Packagesではカテゴリーやタグでの会員限定に対応していない。これがちょっと困る。既存のカテゴリー、タグでの会員対応の把握方法を確認する。&lt;br /&gt;
&lt;br /&gt;
includes/contents.phpのpmpro_has_membership_accessのコードが参考になる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	if(isset($mypost-&amp;gt;post_type) &amp;amp;&amp;amp; $mypost-&amp;gt;post_type == &amp;quot;post&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		// Get the categories for this post.&lt;br /&gt;
		$post_terms = wp_get_post_categories( $mypost-&amp;gt;ID );&lt;br /&gt;
&lt;br /&gt;
		// Get the tags for this post.&lt;br /&gt;
		$post_terms = array_merge( $post_terms, wp_get_post_tags( $mypost-&amp;gt;ID, array('fields' =&amp;gt; 'ids' ) ) );&lt;br /&gt;
&lt;br /&gt;
		if( ! $post_terms )&lt;br /&gt;
		{&lt;br /&gt;
			//just check for entries in the memberships_pages table&lt;br /&gt;
			$sqlQuery = &amp;quot;SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_pages mp LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '&amp;quot; . esc_sql( $mypost-&amp;gt;ID ) . &amp;quot;'&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			//are any of the post categories associated with membership levels? also check the memberships_pages table&lt;br /&gt;
			$sqlQuery = &amp;quot;(SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_categories mc LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mc.membership_id = m.id WHERE mc.category_id IN(&amp;quot; . implode(&amp;quot;,&amp;quot;, array_map( 'intval', $post_terms ) ) . &amp;quot;) AND m.id IS NOT NULL) UNION (SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_pages mp LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '&amp;quot; . esc_sql( $mypost-&amp;gt;ID ) . &amp;quot;')&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		//are any membership levels associated with this page?&lt;br /&gt;
		$sqlQuery = &amp;quot;SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_pages mp LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '&amp;quot; . esc_sql( $mypost-&amp;gt;ID ) . &amp;quot;'&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    $post_membership_levels = $wpdb-&amp;gt;get_results($sqlQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;普通にSQLで取得している。このへんのコードを流用すれば対応できる気はする。ただ、ちょっと面倒くさい。&lt;br /&gt;
&lt;br /&gt;
=== Analytics ===&lt;br /&gt;
PMProの流入元の記事を分析・特定する方法がある。&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/membership-site-conversions-in-google-analytics-4/ How to Set Up GA4 Membership Site Conversion Events]&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/google-analytics/ Google Analytics Integration Add On Plugin]&lt;br /&gt;
&lt;br /&gt;
GA4を使った一般的なサイト分析になる。有料プラグインでもできる。&lt;br /&gt;
&lt;br /&gt;
=== Sell ===&lt;br /&gt;
&lt;br /&gt;
==== Single ====&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/pmpro-purchase-access-to-a-single-page/ Addon Packages Add On Plugin for PMPro]&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/pmpro-woocommerce/ WooCommerce Integration Add On Plugin]&lt;br /&gt;
* [https://wordpress.org/plugins/pmpro-woocommerce/ Paid Memberships Pro Integration with WooCommerce – WordPress plugin | WordPress.org]&lt;br /&gt;
* [https://www.paidmembershipspro.com/paid-newsletters/ Sell Paid Newsletters on WordPress]単体記事の販売には工夫が必要。&lt;br /&gt;
&lt;br /&gt;
WooCommerceと連携したり、PMProの有料プラグインを使うとか。他にも方法を以前調査したの後日追記する。&lt;br /&gt;
&lt;br /&gt;
理想としては、単品販売と、会員を両立したい。2個以上買うなら会員のほうがいいみたいな。&lt;br /&gt;
&lt;br /&gt;
単品販売の方法。有料アドオン、LearnDash、後はWooCommerce連携など。&lt;br /&gt;
&lt;br /&gt;
Addon Packagesがいい。PMProのAddon Packagesは、まずあるメンバーシップレベルのユーザーに購入権利を与えて、そこから購入する形。&lt;br /&gt;
&lt;br /&gt;
あくまで単品販売で、定期販売はできない。記事別に金額の入力欄が表示されてそれで単品販売する形。悪くない。こちらの理想に近い。単品販売することにした記事は買うしかない。あるメンバーレベルなら買わなくても見れるというようにはできなさそう。いや。1レベルだけ全アクセス可能はできる。&lt;br /&gt;
&lt;br /&gt;
==== Course ====&lt;br /&gt;
*[https://www.paidmembershipspro.com/multiple-membership-levels-per-user-pmpro-workarounds/ Multiple Membership Levels Per User with PMPro (The Workarounds)]&lt;br /&gt;
*[https://wordpress.org/plugins/paid-memberships-pro-for-wp-courseware/ Paid Memberships Pro Addon for WP Courseware – WordPress plugin | WordPress.org]&lt;br /&gt;
*[https://www.paidmembershipspro.com/add-ons/pmpro-courses-lms-integration/ Courses for Membership Add On Plugin]&lt;br /&gt;
*[https://www.paidmembershipspro.com/add-ons/learndash-integration/ LearnDash Add On Plugin for Paid Memberships Pro]&lt;br /&gt;
*[https://flyplugins.com/paid-memberships-pro-courses/ Paid Memberships Pro for Selling Courses]&lt;br /&gt;
&lt;br /&gt;
LearnCashはちょっといまいち。外部のプラグインとの連携。この機能自体はPMProのあるレベルが、LernDashのあるコースにアクセス可能にするだけだから、あまり意味ない。PMProだけでも似たようなことはできる。&lt;br /&gt;
&lt;br /&gt;
単独販売の本質は、1ユーザーに複数のレベル・会員の所属。これはレッスンなどで、上位・下位の関係がない場合にあり得るケース。上位・下位がある場合は、1ユーザーは1レベルになる。&lt;br /&gt;
&lt;br /&gt;
方法がいくつかある。&lt;br /&gt;
&lt;br /&gt;
# Multiple Membership Per user Addon: 1ユーザーが複数のレベルに参加できるプラグインがある。がベータ版で他のプラグインと互換がなかったりする。ちょっと危ない。&lt;br /&gt;
# Addon Package: これが無難。&lt;br /&gt;
# フィールド: メインレベル加入時にオプションフィールドをつけて金額を変える。&lt;br /&gt;
# Multisite: サイトの内容次第だが、いっそ別サイトにするというのもある。&lt;br /&gt;
&lt;br /&gt;
Addon Packageが無難。Addon PackageとWP coursewareと連携したりもできるらしい。&lt;br /&gt;
&lt;br /&gt;
==== Addon Packages ====&lt;br /&gt;
&lt;br /&gt;
===== About =====&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/pmpro-purchase-access-to-a-single-page/ Addon Packages Add On Plugin for PMPro]&lt;br /&gt;
* [https://github.com/strangerstudios/pmpro-addon-packages strangerstudios/pmpro-addon-packages: Charge for access to specific pages or other post types in WordPress. Requires the Paid Memberships Pro plugin.]&lt;br /&gt;
&lt;br /&gt;
記事の単品販売用にAddon Packagesがあるのでこれを試す。このプラグインは将来的にPMPro本体に取り込まれるもので、一時的な解決用という位置づけ。&lt;br /&gt;
&lt;br /&gt;
===== Usage =====&lt;br /&gt;
インストールしたらpost/page画面に金額設定画面が表示されるので、ここで金額をいれて、[Require Membership] も指定すると単品販売できる。&lt;br /&gt;
&lt;br /&gt;
カテゴリーでのレベル指定は無効。一番レベル低いFreeなどを1個指定すれば、自動的に全部に適用される。レベルの指定が若干使いにくい。カテゴリーで指定できれば楽だった。やむを得ない。PMPro 3で取り込まれたりしないかな。&lt;br /&gt;
&lt;br /&gt;
しないでしょうね。コンテンツの部分非表示と同じで、ページ単位で会員レベルを指定する必要があるのが作りとしていまいち。だがこれに従うしかないか。基本は変えない運用にすればいいのか。&lt;br /&gt;
&lt;br /&gt;
===== Configuration =====&lt;br /&gt;
&lt;br /&gt;
* define( '&amp;lt;code&amp;gt;PMPROAP_EXP_DAYS&amp;lt;/code&amp;gt;', 0 );: 有効期限の設定デフォルト0 (無期限)。基本はデフォルトでOK。&lt;br /&gt;
* apply_filters( 'pmproap_all_access_levels', array(), $user_id, $post_id );: 単品購入を無視してアクセスできる神レベル的なものを指定できる。&lt;br /&gt;
* apply_filters( 'pmproap_text_level_id', $text_level_id, $post_id, $user_id, $post_levels );: 未ログインユーザー向けの新規購入時に必要なレベルID。&lt;br /&gt;
* apply_filters( 'pmproap_supported_post_types', array( 'page', 'post' ) );&lt;br /&gt;
* do_action( 'pmproap_action_add_to_package', $user_id, $post_id );&lt;br /&gt;
* do_action( 'pmproap_action_remove_from_package', $user_id, $post_id );&lt;br /&gt;
&lt;br /&gt;
pmproap_all_access_levels を使うと、単品購入を無視してアクセスできる神レベル的なものを指定できる。&lt;br /&gt;
&lt;br /&gt;
例えば、最上位だけ除外するとか。金額でレベル指定できればなおよかったがしかたない。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
	Set levels as &amp;quot;all access levels&amp;quot; so members of these levels will be able to view all Addon Packages.&lt;br /&gt;
	Requires Paid Memberships Pro and the pmpro-addon-packages plugin.&lt;br /&gt;
*/&lt;br /&gt;
function my_pmproap_all_access_levels($levels, $user_id, $post_id)&lt;br /&gt;
{&lt;br /&gt;
	//I'm just adding the level, but I could do some calculation based on the user and post id to programatically give access to content&lt;br /&gt;
	$levels = array(16);	&lt;br /&gt;
	return $levels;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&amp;quot;pmproap_all_access_levels&amp;quot;, &amp;quot;my_pmproap_all_access_levels&amp;quot;, 10, 3);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Message =====&lt;br /&gt;
pmpro_non_member_text_filter/pmpro_not_logged_in_text_filterを[https://github.com/strangerstudios/pmpro-addon-packages/blob/dev/pmpro-addon-packages.php#L266 pmproap_pmpro_text_filter]で上書きしている。この実装を参考に、自分で元のフィルターを上書きすれば、表示文を変更できる。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;div class=&amp;quot;pmpro_content_message&amp;quot;&amp;gt;&amp;lt;p&amp;gt;This content requires that you purchase additional access. The price is ¥220 or free for our Gold members.&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;https://web.gnusocial.jp/member/checkout/?level=1&amp;amp;amp;amp;ap=10307&amp;quot;&amp;gt;Purchase this Content (¥220)&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;https://web.gnusocial.jp/member/level/&amp;quot;&amp;gt;Choose a Membership Level&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Addon Package有無の両方の考慮が必要でちょっと複雑になる。&lt;br /&gt;
&lt;br /&gt;
===== Shortcode =====&lt;br /&gt;
[pmpro_addon_packages] のショートコードを使うと、単品販売の記事一覧を出力できる。&lt;br /&gt;
&lt;br /&gt;
===== Addon Pakacage用改造 =====&lt;br /&gt;
既存のAddon Packageがブロックに未対応、ページのレベル指定が必要な点が気に入らないので改造する。&lt;br /&gt;
&lt;br /&gt;
* 金額があればAPとみなす。&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
作業手順&lt;br /&gt;
&lt;br /&gt;
* my_pmproap_membership_content_filter でコンテンツの制限のロジックにAP (金額があれば制限・制限文表示) を組み込む。&lt;br /&gt;
* 表示文。&lt;br /&gt;
* paywallショートコード追加。&lt;br /&gt;
&lt;br /&gt;
pmpro_non_member_text_filterなどで表示させる表示文のロジックをどうするか。&lt;br /&gt;
&lt;br /&gt;
ショートコードと基本ロジックは同じだが、非表示部分の文字数の扱いがある。引数の$notloggiedintextは管理画面の設定したメッセージ。&lt;br /&gt;
&lt;br /&gt;
共通関数を作って、それを流用して、引数で文字数を受け取るようにするか。&lt;br /&gt;
&lt;br /&gt;
[[Category:Distributed]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=WordPress&amp;diff=576</id>
		<title>WordPress</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=WordPress&amp;diff=576"/>
		<updated>2025-06-18T06:41:17Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Post 著者の一括変更&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
WordPressは世界の多くのウェブサイトで使用されているCMSだ。PHPで記述されている。&lt;br /&gt;
&lt;br /&gt;
WordPressの外観や挙動はPHPのプログラムを書いてカスタマイズできる。また、プラグイン機構を持ち、世界中の開発者によるプラグインを導入することで簡単にウェブサイトを拡張できる。&lt;br /&gt;
&lt;br /&gt;
* [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/ WordPress Coding Standards – Coding Standards Handbook | Developer.WordPress.org]&lt;br /&gt;
* [https://developer.wordpress.org/ WordPress Developer Resources | Official WordPress Developer Resources | Developer.WordPress.org]&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
WordPress.comなどのホスティングサービスを使用することもできるが、レンタルサーバーやVPSに設置することが好ましい。&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/03/28/5733/ 設置: 世界的に人気のCMS WordPress]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/03/29/5737/ WordPressのマルチサイト化]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/08/15/7802/ WordPressのログイン時の [Prove your humanity&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt; の無効化]&lt;br /&gt;
&lt;br /&gt;
== ActivityPub ==&lt;br /&gt;
&lt;br /&gt;
WordPressはActivityPubを実装している。WordPressへの投稿時に分散SNSにも投稿される、分散SNSからWordPressの投稿にコメントできるなどの機能がある。&lt;br /&gt;
&lt;br /&gt;
WordPressの公式ホスティングサービスであるWordPress.comもActivityPubに対応している。分散SNSの中でも巨大なサーバーと言え、無視できない存在だ。&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/13/8867/ 報道: WordPressの公式ホスティングサービスWordPress.comのActivityPub対応]&lt;br /&gt;
[https://ja.wordpress.org/plugins/activitypub/ ActivityPub – WordPress プラグイン | WordPress.org 日本語]&lt;br /&gt;
&lt;br /&gt;
example.comというドメインで運営している場合、デフォルトでサイト全体を表す、example.com@example.comユーザーが追加される。&lt;br /&gt;
&lt;br /&gt;
このユーザーは、サイトに登録済みの全ユーザーの更新を含む。&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
&lt;br /&gt;
=== Account ===&lt;br /&gt;
&lt;br /&gt;
==== ユーザー名の改名 ====&lt;br /&gt;
[https://www.wpbeginner.com/ja/wp-tutorials/how-to-change-your-wordpress-username/ WordPressユーザー名の正しい変更方法（3つの方法）]&lt;br /&gt;
&lt;br /&gt;
管理画面からは直接変更できない。いくつか方法がある。&lt;br /&gt;
&lt;br /&gt;
一番シンプルなのが、新規ユーザー作成後の削除。&lt;br /&gt;
&lt;br /&gt;
==== Delete ====&lt;br /&gt;
[https://sbwinc.co.jp/wordpress-user-delete/ ワードプレスでユーザー削除する際の注意点「ミスると記事が消滅します」 | 株式会社ステップバイワーク]&lt;br /&gt;
&lt;br /&gt;
アカウントの削除時には注意が必要。&lt;br /&gt;
&lt;br /&gt;
削除時に以下の選択肢が表示される。&lt;br /&gt;
&lt;br /&gt;
# Delete all content.&lt;br /&gt;
# Attribute all content to:&lt;br /&gt;
&lt;br /&gt;
1を選ぶと本当に全部消える。2を選ぶのが無難。&lt;br /&gt;
&lt;br /&gt;
=== Comment ===&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://immature.01kawa.com/php/wordpress/comment_form/ コメントフォームの項目の文言変更と削除 | immature]&lt;br /&gt;
* [https://yuichon.com/2014/09/wp-comment-form-custom/ WordPress のコメントフォームを functions.php を使ってカスタマイズする]&lt;br /&gt;
* [https://developer.wordpress.org/reference/functions/comment_form/ comment_form() – Function | Developer.WordPress.org]&lt;br /&gt;
&lt;br /&gt;
このあたりの関数で定義されている。フィルターを挟むことで変更できる模様。&lt;br /&gt;
&lt;br /&gt;
=== Post ===&lt;br /&gt;
&lt;br /&gt;
==== 著者の一括変更 ====&lt;br /&gt;
[https://kinsta.com/jp/knowledgebase/how-to-change-author-in-wordpress/ WordPressで投稿の作成者を変更する方法（5つの方法）]&lt;br /&gt;
&lt;br /&gt;
マルチサイトで運営していたサイトでプロフィールを別の内容にしたくなった。過去の投稿の著者も新しいプロフィールにしたい。&lt;br /&gt;
&lt;br /&gt;
別のアカウントにしたほうがいい。&lt;br /&gt;
&lt;br /&gt;
新規アカウントを作って、そのユーザーに過去の投稿を全部割り当てる感じ。&lt;br /&gt;
&lt;br /&gt;
=== PV ===&lt;br /&gt;
WordPressでPV数を表示させる方法がいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://nuko-blog.net/wordpress-populararticle-plugin/ 【WordPress】WordPressで人気記事を表示させるプラグイン5選！ | 現役マーケターが教える未来のマーケターのためのマーケティングブログ | nukoblog]&lt;br /&gt;
* WP-PostViewsプラグイン&lt;br /&gt;
* WordPress Popular Postsプラグイン&lt;br /&gt;
* Post Views Counter: ([https://t-hr.net/p236/ 記事のアクセス数がわかるプラグインのPost Views Counter | たひろブログ])&lt;br /&gt;
&lt;br /&gt;
WP-PostViewsプラグインのほうが柔軟性がある？ ([https://kanae-design.the-day-mie.com/609/ WordPressで記事ランキングを設置するならWP-PostViewsが最適なのでは？ | kanae-design-works]、[https://tech.kurojica.com/archives/11048/ 「WP-PostViews」と「WordPress Popular Posts」の違い | クロジカ])。&lt;br /&gt;
&lt;br /&gt;
WordPressの分析プラグインはDBにアクセ格納するから重くなるらしい&lt;br /&gt;
&lt;br /&gt;
* [https://www.tam-tam.co.jp/tipsnote/cms/post15202.html Google Analytics APIを使ってWordPressの記事をランキング表示させる方法 ｜ Tips Note by TAM]&lt;br /&gt;
* [https://road-bike.net/archives/41056 WordPressのアクセスカウンターを変更しようとしたら思いの外苦労しました | ロードバイク好きの独り言]&lt;br /&gt;
* [https://blog.upshare.co.jp/2017/07/3660/ Jetpack(WordPress.com)の統計情報を使ってカスタマイズし放題な人気記事ランキングを表示する - 株式会社アップシェア　ブログ]&lt;br /&gt;
* [https://wp-simplicity.com/suport/topic/%E3%81%86%E3%81%A1%E3%81%AFjetpack%E3%81%AE%E6%A9%9F%E8%83%BD%E3%81%A7pv%E8%A1%A8%E7%A4%BA%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/ うちはJetpackの機能でPV表示に切り替えました]&lt;br /&gt;
&lt;br /&gt;
Jetpackの統計情報から閲覧数を取得表示することができる。これが一番手っ取り早い気がする。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;?php // 全体、月別、週別、日別のPV表示&lt;br /&gt;
  global $post;&lt;br /&gt;
  $views_all = 0;&lt;br /&gt;
  $views_monthly = 0;&lt;br /&gt;
  $views_weekly = 0;&lt;br /&gt;
  $views_daily = 0;&lt;br /&gt;
  //Jetpack利用時&lt;br /&gt;
  if (is_jetpack_stats_module_active()) {&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; -1, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_all = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; 30, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_monthly = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; 7, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_weekly = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
    $jetpack_views = stats_get_csv( 'postviews', array('days' =&amp;gt; 1, 'limit' =&amp;gt; 1, 'post_id' =&amp;gt; $post-&amp;gt;ID ));&lt;br /&gt;
    if (isset($jetpack_views[0]['views'])) {&lt;br /&gt;
      $views_daily = $jetpack_views[0]['views'];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;daily&amp;quot;&amp;gt;日:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_daily, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;weekly&amp;quot;&amp;gt;週:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_weekly, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;monthly&amp;quot;&amp;gt;月:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_monthly, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
  echo '&amp;lt;span class=&amp;quot;all&amp;quot;&amp;gt;全体:&amp;lt;span class=&amp;quot;pv-count&amp;quot;&amp;gt;', $views_all, '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;';&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;上記コードをウィジェットに貼り付けたらうまくいった。&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
WordPressで多言語対応サイトも構築できる。&lt;br /&gt;
&lt;br /&gt;
情報源: &lt;br /&gt;
&lt;br /&gt;
* [https://kinsta.com/jp/blog/wordpress-multilingual/ WordPressサイトの多言語化（＋Kinstaが10ヶ国語に対応した方法）]&lt;br /&gt;
* [https://webfun-style.com/localization-wordpress/ 【徹底解説】WordPressで本格的な多言語サイトを作る方法 | うぇぶファン]&lt;br /&gt;
&lt;br /&gt;
いろいろ方式があるが、サブディレクトリー形式が手軽な感じがする。&lt;br /&gt;
&lt;br /&gt;
英語で情報発信できると、かなりの数のユーザーにアプローチできる。単に機械翻訳にするだけでも検討する価値はあるだろう。&lt;br /&gt;
&lt;br /&gt;
=== 広告ブロッカー対策 ===&lt;br /&gt;
出典: [https://dajya-ranger.com/wordpress/defend-site-content-for-wordpress/ 【WordPress編】広告ブロッカーからサイトコンテンツと収益を守る！ | SEの良心]。&lt;br /&gt;
&lt;br /&gt;
[CHP Ads Block Detector] というプラグインで実現できるらしい。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/01/03/9746/ プラグイン: WordPressの広告ブロッカー対策CHP Ads Block Detector | GNU social JP Web]」の通り、簡単にできた。&lt;br /&gt;
&lt;br /&gt;
=== Widget内でのPHP実行 ===&lt;br /&gt;
「[https://fox-wp.com/wordpress-widget-php-code-run/ WordPressのウィジェットでPHPコードを実行する方法 – FOXWP]」&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function widget_text_exec_php( $widget_text ) {&lt;br /&gt;
    if( strpos( $widget_text, '&amp;lt;' . '?' ) !== false ) {&lt;br /&gt;
        ob_start();&lt;br /&gt;
        eval( '?&amp;gt;' . $widget_text );&lt;br /&gt;
        $widget_text = ob_get_contents();&lt;br /&gt;
        ob_end_clean();&lt;br /&gt;
    }&lt;br /&gt;
    return $widget_text;&lt;br /&gt;
}&lt;br /&gt;
add_filter( 'widget_text', 'widget_text_exec_php', 99 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;上記コードをfunction.phpに配置すると、テキストウィジェット内でPHPコード&amp;lt;?php ?&amp;gt;を実行できる模様。&lt;br /&gt;
&lt;br /&gt;
=== Linkage ===&lt;br /&gt;
WordPressの記事・投稿を他のSNSに自動投稿する方法がいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://www.itti.jp/web-direction/5-best-plugins-to-automatically-post-articles-to-sns/ WordPress 記事をSNSへ自動投稿するベストなプラグイン5選 | 新宿のホームページ制作会社 ITTI（イッティ）]&lt;br /&gt;
* Jetpack Social connection: Jetpackの機能の一つ。Mastodon/Facebook Page/Instagram Businessアカウントが対象。FacebookとInstagramは個人アカウントはそもそも自動投稿できない。30日で30回までしか自動投稿できない。少々回数制限が厳しいかもしれない。他のプラグインを検討したほうがよさそう。&lt;br /&gt;
* GNU social Auto post: GNU socialへの自動投稿。&lt;br /&gt;
* NextScripts: Social Network Auto-Poster: Instagramだけ有料。&lt;br /&gt;
* Blog2Social: Instagramは有料。&lt;br /&gt;
* Nelio Content: 「[https://tcd-theme.com/2021/12/nelio-content.html Nelio Contentの使い方：Instagramと連携させる方法 | ワードプレステーマTCD]」。Bufferというサービスのアカウント経由でInstagramも可能。Buffer+Nelio Contentの組み合わせがベストに近い。制限の入ったX/Twitterも対応できそう。ただし、投稿画面で [Customize Timeline] の選択が必要。1クリックで3SNSに投稿連携できるなら、気になるものの許容できる手間。&lt;br /&gt;
&lt;br /&gt;
=== There has been a critical error on this website. Please check your site admin email inbox for instructions. ===&lt;br /&gt;
プラグインを無効にしようと&lt;br /&gt;
&lt;br /&gt;
[https://wordpress.org/documentation/article/faq-troubleshooting/#how-to-deactivate-all-plugins-when-not-able-to-access-the-administrative-menus How to deactivate all plugins when not able to access the administrative menus?]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
Ref: [https://developer.wordpress.org/reference/ Reference | Developer.WordPress.org].&lt;br /&gt;
&lt;br /&gt;
=== WPCode ===&lt;br /&gt;
Shortcodeの定義はくせがある。&lt;br /&gt;
&lt;br /&gt;
[Insert Method]=[Shortcode] を選ぶと [wpcode id=&amp;quot;10405&amp;quot;] のようなショートコードが定義される。これを [wpcode id=&amp;quot;10405&amp;quot;][/wpcode]のようなブロックで使う。&lt;br /&gt;
&lt;br /&gt;
Code Previewには、関数の本文を指定して、表示する場合echoなどで出力させる。&lt;br /&gt;
&lt;br /&gt;
無料版だとshortcodeの名前を指定できない。&lt;br /&gt;
&lt;br /&gt;
Auto Insertで自分で定義したらどうだろう？それで問題ない。&lt;br /&gt;
&lt;br /&gt;
=== Media ===&lt;br /&gt;
WordPressはメディアをデフォルトで年付きベースのディレクトリーに保存する。これを変更するのは少々やっかい。&lt;br /&gt;
&lt;br /&gt;
いくつかプラグインがあるのだが、FileBirdというプラグインががあって、デフォルトのアップロードディレクトリーはそのままで、内部的にディレクトリー的なものでカテゴリー分けできる。&lt;br /&gt;
&lt;br /&gt;
これで管理するのが無難。&lt;br /&gt;
&lt;br /&gt;
=== Permalink ===&lt;br /&gt;
&lt;br /&gt;
==== 著者のパーマリンク ====&lt;br /&gt;
[https://wordpress.stackexchange.com/questions/77228/different-permalink-for-posts-and-authors Different permalink for posts and authors - WordPress Development Stack Exchange]&lt;br /&gt;
&lt;br /&gt;
WordPressでは、authorのパーマリンクは、postの下に配置される。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://domain.com/p/u/USERNAME&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://domain.com/p/POSTID&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
これがよろしくない。ユーザープロフィールのパーマリンクもこれになるから。&lt;br /&gt;
&lt;br /&gt;
「[https://github.com/chrisguitarguy/WPSE-Plugins/blob/master/custom-author-base.php WPSE-Plugins/custom-author-base.php at master · chrisguitarguy/WPSE-Plugins · GitHub]」のプラグインで対応できる模様。&lt;br /&gt;
&lt;br /&gt;
うーん。こちらのパーマリンクはうまく動作しなかった。&lt;br /&gt;
&lt;br /&gt;
代わりに、「[https://wordpress.stackexchange.com/questions/82004/how-to-custom-change-author-base-without-this-front permalinks - How to custom change author base without $this-&amp;gt;front? - WordPress Development Stack Exchange]」の以下のコードが動作した。&lt;br /&gt;
 add_action('init', 'wpse82004_init');&lt;br /&gt;
 function wpse82004_init()&lt;br /&gt;
 {&lt;br /&gt;
     global $wp_rewrite;&lt;br /&gt;
     $wp_rewrite-&amp;gt;author_base = 'user';&lt;br /&gt;
     $wp_rewrite-&amp;gt;author_structure = '/' . $wp_rewrite-&amp;gt;author_base . '/%author%';&lt;br /&gt;
 }&lt;br /&gt;
ハードコードだが、うまく機能していて、変更することはないので、これでもいい。&lt;br /&gt;
&lt;br /&gt;
==== パーマリンクの形式 ====&lt;br /&gt;
/post/投稿ID/の形式がシンプルでいい。&lt;br /&gt;
&lt;br /&gt;
以前は/post/年/月/日/投稿ID/にしていたけど、長くなる。日付がパーマリンクにあると覚えやすいというのはあるのだけど。&lt;br /&gt;
&lt;br /&gt;
長くなるし、日付があることで、情報が古いというイメージがあったり、いろいろある。記事を更新した場合も、ソートしたりするときに問題が。&lt;br /&gt;
&lt;br /&gt;
年月日アーカイブはWordPressの機能でできるから、/post/投稿ID/が良いだろう。&lt;br /&gt;
&lt;br /&gt;
== Plugin ==&lt;br /&gt;
Ref: [https://developer.wordpress.org/plugins/ Plugin Handbook | Developer.WordPress.org].&lt;br /&gt;
&lt;br /&gt;
WordPresの拡張性のコア機能。&lt;br /&gt;
&lt;br /&gt;
=== List ===&lt;br /&gt;
新しくWebサイトを始めるにあたって使いたいプラグインがある。&lt;br /&gt;
&lt;br /&gt;
* ActivityPub&lt;br /&gt;
* FileBird&lt;br /&gt;
* Site Kit by Google&lt;br /&gt;
* WPCode Lite&lt;br /&gt;
&lt;br /&gt;
==== 配布形式 ====&lt;br /&gt;
[https://plusers.jp/blog/wordpress-create-plugin すぐできる！WordPressの自作プラグインの作り方の基本を解説 | Plusers]&lt;br /&gt;
&lt;br /&gt;
/wp-content/pluginsにファイルを直接アップロードする。か、ディレクトリーをzipに圧縮すれば、WordPressのプラグイン画面からアップロードできる。&lt;br /&gt;
&lt;br /&gt;
=== Hook ===&lt;br /&gt;
Ref: [https://developer.wordpress.org/plugins/hooks/ Hooks – Plugin Handbook | Developer.WordPress.org].&lt;br /&gt;
&lt;br /&gt;
フックはあるコードから別のコードに干渉するための仕組み。プラグインやテーマへの干渉のコア機能。拡張も可能。ActionとFilterの2種類がある。コールバックと一般的に呼ばれる関数を定義して引っ掛けて処理に干渉する。&lt;br /&gt;
&lt;br /&gt;
* Action: WordPressの操作操作に、データの追加や変更を行う。内部的にデータを処理するので、何も返さない。&lt;br /&gt;
* Filter: WordPressコア機能の実行時にデータを変更する。データを受け取ってそれを次に渡す。&lt;br /&gt;
&lt;br /&gt;
基本はFilterだと思う。Actionの用途がいまいちわからない。&lt;br /&gt;
&lt;br /&gt;
==== Filter ====&lt;br /&gt;
Ref&lt;br /&gt;
&lt;br /&gt;
* [https://developer.wordpress.org/plugins/hooks/filters/ Filters – Plugin Handbook | Developer.WordPress.org]&lt;br /&gt;
* [https://developer.wordpress.org/reference/functions/remove_filter/ remove_filter() – Function | Developer.WordPress.org]&lt;br /&gt;
&lt;br /&gt;
add_filter/remove_filter&lt;br /&gt;
&lt;br /&gt;
=== shortcode ===&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://codex.wordpress.org/Shortcode Shortcode « WordPress Codex]&lt;br /&gt;
* [https://codex.wordpress.org/Shortcode_API Shortcode API « WordPress Codex]&lt;br /&gt;
* [https://www.webdesignleaves.com/pr/wp/wp_shortcode.html WordPress ショートコードの作成]&lt;br /&gt;
&lt;br /&gt;
WordPressにはショートコードというのがある。角括弧 [shortcode][/shortcode] のような形式。本来ならHTML/JavaScriptしか使えない投稿本文に、PHP側の処理を仕込める。&lt;br /&gt;
&lt;br /&gt;
新規作成する場合、書式がだいたい決まっている。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function callback_function($atts, $content = null, $tag ) {&lt;br /&gt;
      extract(shortcode_atts(array(&lt;br /&gt;
        //属性&lt;br /&gt;
        'パラメータ1' =&amp;gt; 'デフォルトの値1',&lt;br /&gt;
        'パラメータ2' =&amp;gt; 'デフォルトの値2',&lt;br /&gt;
        ･･･&lt;br /&gt;
      ), $atts));&lt;br /&gt;
      //ショートコードの処理（動作）の記述&lt;br /&gt;
      return $value;&lt;br /&gt;
    }&lt;br /&gt;
    add_shortcode('my_shortcode', 'callback_function');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;こえrでmy_shortcodeというショートコードが使用可能になる。&lt;br /&gt;
&lt;br /&gt;
==== shortcode_atts ====&lt;br /&gt;
* [https://developer.wordpress.org/reference/functions/shortcode_atts/ shortcode_atts() – Function | Developer.WordPress.org]&lt;br /&gt;
* [https://www.webdesignleaves.com/pr/wp/wp_shortcode.html WordPress ショートコードの作成]&lt;br /&gt;
&lt;br /&gt;
 shortcode_atts( array $pairs, array $atts, string $shortcode = ” ): array&lt;br /&gt;
ユーザーが指定した属性と、使用可能な属性のデフォルト値を結合する。使用不能な属性を無視してくれる。&lt;br /&gt;
&lt;br /&gt;
* $pairs: 使用可能な属性とそのデフォルト値。&lt;br /&gt;
* $atts: ショートコードでユーザーが指定した属性。&lt;br /&gt;
* $shortcode: ショートコードの名前。これを指定するとshortcode_atts_$shortcode フィルターで外部から属性をフィルターできる。通常は使わない。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paid Memberships Pro ==&lt;br /&gt;
&lt;br /&gt;
=== About ===&lt;br /&gt;
PMPro。有料会員サービスを実現するプラグイン。&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/documentation/advanced/ Advanced Developer Topics: Security, Caching, Redirection &amp;amp; More]&lt;br /&gt;
* [https://www.paidmembershipspro.com/hooks-filters/ Paid Membership Pro Action and Filter Hooks]&lt;br /&gt;
* [https://github.com/strangerstudios/paid-memberships-pro/tree/master/includes paid-memberships-pro/includes at master · strangerstudios/paid-memberships-pro]&lt;br /&gt;
&lt;br /&gt;
ソースコード内のincludes配下の関数は自分でも使用可能。&lt;br /&gt;
&lt;br /&gt;
=== Free ===&lt;br /&gt;
PMProは基本的に無料で使える模様 ([https://www.paidmembershipspro.com/free/ PMPro: Free WordPress Membership Plugin])。サポートを販売している扱いの模様。ログアウトしていないと表示されない。&lt;br /&gt;
&lt;br /&gt;
「[https://github.com/strangerstudios Stranger Studios]」がGitHubのリポジトリー。ここに全部のアドオンがある。ここからzipファイル類をダウンロードすれば使える。ただし、一部のプラグインは開発者の経験が必要なため、ライセンスキーの購入をsupportとして販売している。開発経験が一切ない人にはGitHubからのインストールもけっこう面倒くさいからそれでうまくGPLの条件を満たしているのだと思われる。&lt;br /&gt;
&lt;br /&gt;
実行自体はライセンスの有無によらず可能。ただし、ライセンスの有無でStripeの決済手数料が変わる。&lt;br /&gt;
&lt;br /&gt;
「[https://profiles.wordpress.org/paidmembershipspro/ Paid Memberships Pro (@paidmembershipspro) – WordPress user profile | WordPress.org]」でも公開しているが、これは全部ではない。サードパーティープラグインとの連携用が大半。&lt;br /&gt;
&lt;br /&gt;
=== 金額変更 ===&lt;br /&gt;
定期購読で販売していて、登録後に金額を変更したいことがある。&lt;br /&gt;
&lt;br /&gt;
* [https://wordpress.org/support/topic/how-to-raise-prices-on-recurring-memberships/ How to raise prices on recurring memberships? | WordPress.org]&lt;br /&gt;
* [https://wordpress.org/support/topic/change-plan-price/ Change Plan price | WordPress.org]&lt;br /&gt;
* [https://wordpress.org/support/topic/how-to-to-when-member-already-paid/ How to to when member already paid ? | WordPress.org]&lt;br /&gt;
* [https://wordpress.org/support/topic/change-membership-level-for-next-payment-in-recurring-subscription/ Change membership level for next payment in recurring subscription | WordPress.org]&lt;br /&gt;
&lt;br /&gt;
これは基本的にできない。定期購読は決済サービス側で登録時の金額で固定されるため。&lt;br /&gt;
&lt;br /&gt;
金額を変更したければ、一度キャンセルして、再度チェックアウト・購入してもらうしかない。&lt;br /&gt;
&lt;br /&gt;
既存会員に対しては、更新ではなく、期限を設けて強制的に一度退会させるのがいい。&lt;br /&gt;
&lt;br /&gt;
=== Restriction ===&lt;br /&gt;
&lt;br /&gt;
==== membership short code ====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/forums/topic/hide-bottom-register-form-when-it-has-membership-code-block/#post-545667 Hide bottom register form when it has membership code block]&lt;br /&gt;
* [https://www.paidmembershipspro.com/about-excerpts-and-using-the-read-more-tag-for-posts-and-pages/#h-level-up-your-excerpts-by-using-the-membership-shortcode-or-block Using the &amp;quot;Read More&amp;quot; Block and Excerpts for Pages and Posts]&lt;br /&gt;
* [https://www.paidmembershipspro.com/documentation/content-controls/with-shortcodes/ Restrict Content With a Shortcode]&lt;br /&gt;
* Source: [https://github.com/strangerstudios/paid-memberships-pro/blob/dev/shortcodes/membership.php paid-memberships-pro/shortcodes/membership.php at dev · strangerstudios/paid-memberships-pro]&lt;br /&gt;
&lt;br /&gt;
PMProの基本的なコンテンツ制限の概念がある。&lt;br /&gt;
&lt;br /&gt;
基本は投稿全体を非表示で、excerptで冒頭部分を一部表示これが基本。membershipショートコードはこの逆で、基本全表示で一部だけ非表示。&lt;br /&gt;
&lt;br /&gt;
そもそも仕組みが違う。&lt;br /&gt;
&lt;br /&gt;
だから、カテゴリーで管理していて、一部だけ非表示にしたかったら、末尾にmoreブロックを配置して、membeshipショートコードも使う必要がある。二重に使わないといけない。けっこう面倒くさい。&lt;br /&gt;
&lt;br /&gt;
「[https://www.paidmembershipspro.com/customizing-the-message-for-non-members-on-membership-protected-content/ Custom Message for Non-Members on Protected Content]」がメッセージの変更方法。ただ、制限のロジックを変更できるわけではない。別のフィルターだと思う。&lt;br /&gt;
&lt;br /&gt;
ソースコードを参考に自分で実装するしかないだろう。&lt;br /&gt;
&lt;br /&gt;
==== message ====&lt;br /&gt;
「[https://www.paidmembershipspro.com/customizing-the-message-for-non-members-on-membership-protected-content/ Custom Message for Non-Members on Protected Content]」に基本的な表示内容やスタイルの設定方法がある。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;div class=&amp;quot;pmpro_content_message&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 //custom message here&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
表示部分は上記要素になるのでこのクラスでスタイルをあてる。&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.pmpro_content_message {&lt;br /&gt;
	background: #F1F1F1;&lt;br /&gt;
	margin: 0 auto;&lt;br /&gt;
	max-width: 700px;&lt;br /&gt;
	padding: 15px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;他に以下のフィルターが該当するメッセージ表示。&lt;br /&gt;
&lt;br /&gt;
* add_filter( 'pmpro_non_member_text_filter', 'my_pmpro_non_member_text_filter', 5 );&lt;br /&gt;
* add_filter( 'pmpro_not_logged_in_text_filter', 'my_pmpro_not_logged_in_text_filter', 5 );&lt;br /&gt;
&lt;br /&gt;
例えば、会員限定の文字数表示などをしたければ、自前でやるしかない。基本は自分で上記フィルターで上書きするのがよい。&lt;br /&gt;
&lt;br /&gt;
例&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function my_pmpro_non_member_text_filter( $text ) {&lt;br /&gt;
	global $post, $post_membership_levels_names;&lt;br /&gt;
	$count = mb_strlen( $post-&amp;gt;post_content, 'UTF-8' ) - mb_strlen( get_the_excerpt(), 'UTF-8' );&lt;br /&gt;
	$access = pmpro_has_membership_access( $post-&amp;gt;ID, null, true );&lt;br /&gt;
	$text = &amp;quot;&amp;lt;p&amp;gt;残り{$count}文字。続きは&amp;quot; . implode( '/', $access[2] ) . '会員限定。&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Free=0/Bronze=220/Silver=1100/Gold=2200円。&amp;lt;/p&amp;gt;'&lt;br /&gt;
		. '&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;https://web.gnusocial.jp/member/level/&amp;quot;&amp;gt;会員登録&amp;lt;/a&amp;gt;/'&lt;br /&gt;
		. '&amp;lt;a href=&amp;quot;//web.gnusocial.jp/member/login/&amp;quot;&amp;gt;ログイン&amp;lt;/a&amp;gt; (&amp;lt;a href=&amp;quot;//web.gnusocial.jp/about/member/&amp;quot;&amp;gt;About Member&amp;lt;/a&amp;gt;)。&amp;lt;/p&amp;gt;';&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
add_filter( 'pmpro_non_member_text_filter', 'my_pmpro_non_member_text_filter', 5 );&lt;br /&gt;
add_filter( 'pmpro_not_logged_in_text_filter', 'my_pmpro_non_member_text_filter', 5 );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Style ====&lt;br /&gt;
「[https://www.paidmembershipspro.com/customizing-the-message-for-non-members-on-membership-protected-content/ Custom Message for Non-Members on Protected Content]」でペイウォールの表示内容・スタイルを制御できる。&lt;br /&gt;
&lt;br /&gt;
ペイウォール (.pmpro_content_message) のスタイルは会員登録の誘発に重要。&lt;br /&gt;
&lt;br /&gt;
* [https://note.com/ririkodiary/n/n74cb67fecd7f 自分だけの強みを見つけて一生働く選択を〜ミドルエイジの生き方を見つめ直す〜｜暮らしのつづり帖/梨田莉利子]&lt;br /&gt;
* [https://yoikoarinoshinya.hateblo.jp/entry/wakate-geinin 僕の若手時代の悪行。 - 有野晋哉(よゐこ)個人ブログ]&lt;br /&gt;
&lt;br /&gt;
有名サービスの例は上記。登録・購入ボタンを大きく押しやすくしている。a要素の他button要素でも実装されている。ここはいろいろ考えてもいいかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== Category ====&lt;br /&gt;
membershipショートコードやAddon Packagesではカテゴリーやタグでの会員限定に対応していない。これがちょっと困る。既存のカテゴリー、タグでの会員対応の把握方法を確認する。&lt;br /&gt;
&lt;br /&gt;
includes/contents.phpのpmpro_has_membership_accessのコードが参考になる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	if(isset($mypost-&amp;gt;post_type) &amp;amp;&amp;amp; $mypost-&amp;gt;post_type == &amp;quot;post&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		// Get the categories for this post.&lt;br /&gt;
		$post_terms = wp_get_post_categories( $mypost-&amp;gt;ID );&lt;br /&gt;
&lt;br /&gt;
		// Get the tags for this post.&lt;br /&gt;
		$post_terms = array_merge( $post_terms, wp_get_post_tags( $mypost-&amp;gt;ID, array('fields' =&amp;gt; 'ids' ) ) );&lt;br /&gt;
&lt;br /&gt;
		if( ! $post_terms )&lt;br /&gt;
		{&lt;br /&gt;
			//just check for entries in the memberships_pages table&lt;br /&gt;
			$sqlQuery = &amp;quot;SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_pages mp LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '&amp;quot; . esc_sql( $mypost-&amp;gt;ID ) . &amp;quot;'&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			//are any of the post categories associated with membership levels? also check the memberships_pages table&lt;br /&gt;
			$sqlQuery = &amp;quot;(SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_categories mc LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mc.membership_id = m.id WHERE mc.category_id IN(&amp;quot; . implode(&amp;quot;,&amp;quot;, array_map( 'intval', $post_terms ) ) . &amp;quot;) AND m.id IS NOT NULL) UNION (SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_pages mp LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '&amp;quot; . esc_sql( $mypost-&amp;gt;ID ) . &amp;quot;')&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		//are any membership levels associated with this page?&lt;br /&gt;
		$sqlQuery = &amp;quot;SELECT m.id, m.name FROM $wpdb-&amp;gt;pmpro_memberships_pages mp LEFT JOIN $wpdb-&amp;gt;pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '&amp;quot; . esc_sql( $mypost-&amp;gt;ID ) . &amp;quot;'&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    $post_membership_levels = $wpdb-&amp;gt;get_results($sqlQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;普通にSQLで取得している。このへんのコードを流用すれば対応できる気はする。ただ、ちょっと面倒くさい。&lt;br /&gt;
&lt;br /&gt;
=== Analytics ===&lt;br /&gt;
PMProの流入元の記事を分析・特定する方法がある。&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/membership-site-conversions-in-google-analytics-4/ How to Set Up GA4 Membership Site Conversion Events]&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/google-analytics/ Google Analytics Integration Add On Plugin]&lt;br /&gt;
&lt;br /&gt;
GA4を使った一般的なサイト分析になる。有料プラグインでもできる。&lt;br /&gt;
&lt;br /&gt;
=== Sell ===&lt;br /&gt;
&lt;br /&gt;
==== Single ====&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/pmpro-purchase-access-to-a-single-page/ Addon Packages Add On Plugin for PMPro]&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/pmpro-woocommerce/ WooCommerce Integration Add On Plugin]&lt;br /&gt;
* [https://wordpress.org/plugins/pmpro-woocommerce/ Paid Memberships Pro Integration with WooCommerce – WordPress plugin | WordPress.org]&lt;br /&gt;
* [https://www.paidmembershipspro.com/paid-newsletters/ Sell Paid Newsletters on WordPress]単体記事の販売には工夫が必要。&lt;br /&gt;
&lt;br /&gt;
WooCommerceと連携したり、PMProの有料プラグインを使うとか。他にも方法を以前調査したの後日追記する。&lt;br /&gt;
&lt;br /&gt;
理想としては、単品販売と、会員を両立したい。2個以上買うなら会員のほうがいいみたいな。&lt;br /&gt;
&lt;br /&gt;
単品販売の方法。有料アドオン、LearnDash、後はWooCommerce連携など。&lt;br /&gt;
&lt;br /&gt;
Addon Packagesがいい。PMProのAddon Packagesは、まずあるメンバーシップレベルのユーザーに購入権利を与えて、そこから購入する形。&lt;br /&gt;
&lt;br /&gt;
あくまで単品販売で、定期販売はできない。記事別に金額の入力欄が表示されてそれで単品販売する形。悪くない。こちらの理想に近い。単品販売することにした記事は買うしかない。あるメンバーレベルなら買わなくても見れるというようにはできなさそう。いや。1レベルだけ全アクセス可能はできる。&lt;br /&gt;
&lt;br /&gt;
==== Course ====&lt;br /&gt;
*[https://www.paidmembershipspro.com/multiple-membership-levels-per-user-pmpro-workarounds/ Multiple Membership Levels Per User with PMPro (The Workarounds)]&lt;br /&gt;
*[https://wordpress.org/plugins/paid-memberships-pro-for-wp-courseware/ Paid Memberships Pro Addon for WP Courseware – WordPress plugin | WordPress.org]&lt;br /&gt;
*[https://www.paidmembershipspro.com/add-ons/pmpro-courses-lms-integration/ Courses for Membership Add On Plugin]&lt;br /&gt;
*[https://www.paidmembershipspro.com/add-ons/learndash-integration/ LearnDash Add On Plugin for Paid Memberships Pro]&lt;br /&gt;
*[https://flyplugins.com/paid-memberships-pro-courses/ Paid Memberships Pro for Selling Courses]&lt;br /&gt;
&lt;br /&gt;
LearnCashはちょっといまいち。外部のプラグインとの連携。この機能自体はPMProのあるレベルが、LernDashのあるコースにアクセス可能にするだけだから、あまり意味ない。PMProだけでも似たようなことはできる。&lt;br /&gt;
&lt;br /&gt;
単独販売の本質は、1ユーザーに複数のレベル・会員の所属。これはレッスンなどで、上位・下位の関係がない場合にあり得るケース。上位・下位がある場合は、1ユーザーは1レベルになる。&lt;br /&gt;
&lt;br /&gt;
方法がいくつかある。&lt;br /&gt;
&lt;br /&gt;
# Multiple Membership Per user Addon: 1ユーザーが複数のレベルに参加できるプラグインがある。がベータ版で他のプラグインと互換がなかったりする。ちょっと危ない。&lt;br /&gt;
# Addon Package: これが無難。&lt;br /&gt;
# フィールド: メインレベル加入時にオプションフィールドをつけて金額を変える。&lt;br /&gt;
# Multisite: サイトの内容次第だが、いっそ別サイトにするというのもある。&lt;br /&gt;
&lt;br /&gt;
Addon Packageが無難。Addon PackageとWP coursewareと連携したりもできるらしい。&lt;br /&gt;
&lt;br /&gt;
==== Addon Packages ====&lt;br /&gt;
&lt;br /&gt;
===== About =====&lt;br /&gt;
&lt;br /&gt;
* [https://www.paidmembershipspro.com/add-ons/pmpro-purchase-access-to-a-single-page/ Addon Packages Add On Plugin for PMPro]&lt;br /&gt;
* [https://github.com/strangerstudios/pmpro-addon-packages strangerstudios/pmpro-addon-packages: Charge for access to specific pages or other post types in WordPress. Requires the Paid Memberships Pro plugin.]&lt;br /&gt;
&lt;br /&gt;
記事の単品販売用にAddon Packagesがあるのでこれを試す。このプラグインは将来的にPMPro本体に取り込まれるもので、一時的な解決用という位置づけ。&lt;br /&gt;
&lt;br /&gt;
===== Usage =====&lt;br /&gt;
インストールしたらpost/page画面に金額設定画面が表示されるので、ここで金額をいれて、[Require Membership] も指定すると単品販売できる。&lt;br /&gt;
&lt;br /&gt;
カテゴリーでのレベル指定は無効。一番レベル低いFreeなどを1個指定すれば、自動的に全部に適用される。レベルの指定が若干使いにくい。カテゴリーで指定できれば楽だった。やむを得ない。PMPro 3で取り込まれたりしないかな。&lt;br /&gt;
&lt;br /&gt;
しないでしょうね。コンテンツの部分非表示と同じで、ページ単位で会員レベルを指定する必要があるのが作りとしていまいち。だがこれに従うしかないか。基本は変えない運用にすればいいのか。&lt;br /&gt;
&lt;br /&gt;
===== Configuration =====&lt;br /&gt;
&lt;br /&gt;
* define( '&amp;lt;code&amp;gt;PMPROAP_EXP_DAYS&amp;lt;/code&amp;gt;', 0 );: 有効期限の設定デフォルト0 (無期限)。基本はデフォルトでOK。&lt;br /&gt;
* apply_filters( 'pmproap_all_access_levels', array(), $user_id, $post_id );: 単品購入を無視してアクセスできる神レベル的なものを指定できる。&lt;br /&gt;
* apply_filters( 'pmproap_text_level_id', $text_level_id, $post_id, $user_id, $post_levels );: 未ログインユーザー向けの新規購入時に必要なレベルID。&lt;br /&gt;
* apply_filters( 'pmproap_supported_post_types', array( 'page', 'post' ) );&lt;br /&gt;
* do_action( 'pmproap_action_add_to_package', $user_id, $post_id );&lt;br /&gt;
* do_action( 'pmproap_action_remove_from_package', $user_id, $post_id );&lt;br /&gt;
&lt;br /&gt;
pmproap_all_access_levels を使うと、単品購入を無視してアクセスできる神レベル的なものを指定できる。&lt;br /&gt;
&lt;br /&gt;
例えば、最上位だけ除外するとか。金額でレベル指定できればなおよかったがしかたない。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
	Set levels as &amp;quot;all access levels&amp;quot; so members of these levels will be able to view all Addon Packages.&lt;br /&gt;
	Requires Paid Memberships Pro and the pmpro-addon-packages plugin.&lt;br /&gt;
*/&lt;br /&gt;
function my_pmproap_all_access_levels($levels, $user_id, $post_id)&lt;br /&gt;
{&lt;br /&gt;
	//I'm just adding the level, but I could do some calculation based on the user and post id to programatically give access to content&lt;br /&gt;
	$levels = array(16);	&lt;br /&gt;
	return $levels;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&amp;quot;pmproap_all_access_levels&amp;quot;, &amp;quot;my_pmproap_all_access_levels&amp;quot;, 10, 3);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Message =====&lt;br /&gt;
pmpro_non_member_text_filter/pmpro_not_logged_in_text_filterを[https://github.com/strangerstudios/pmpro-addon-packages/blob/dev/pmpro-addon-packages.php#L266 pmproap_pmpro_text_filter]で上書きしている。この実装を参考に、自分で元のフィルターを上書きすれば、表示文を変更できる。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;div class=&amp;quot;pmpro_content_message&amp;quot;&amp;gt;&amp;lt;p&amp;gt;This content requires that you purchase additional access. The price is ¥220 or free for our Gold members.&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;https://web.gnusocial.jp/member/checkout/?level=1&amp;amp;amp;amp;ap=10307&amp;quot;&amp;gt;Purchase this Content (¥220)&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;https://web.gnusocial.jp/member/level/&amp;quot;&amp;gt;Choose a Membership Level&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Addon Package有無の両方の考慮が必要でちょっと複雑になる。&lt;br /&gt;
&lt;br /&gt;
===== Shortcode =====&lt;br /&gt;
[pmpro_addon_packages] のショートコードを使うと、単品販売の記事一覧を出力できる。&lt;br /&gt;
&lt;br /&gt;
===== Addon Pakacage用改造 =====&lt;br /&gt;
既存のAddon Packageがブロックに未対応、ページのレベル指定が必要な点が気に入らないので改造する。&lt;br /&gt;
&lt;br /&gt;
* 金額があればAPとみなす。&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
作業手順&lt;br /&gt;
&lt;br /&gt;
* my_pmproap_membership_content_filter でコンテンツの制限のロジックにAP (金額があれば制限・制限文表示) を組み込む。&lt;br /&gt;
* 表示文。&lt;br /&gt;
* paywallショートコード追加。&lt;br /&gt;
&lt;br /&gt;
pmpro_non_member_text_filterなどで表示させる表示文のロジックをどうするか。&lt;br /&gt;
&lt;br /&gt;
ショートコードと基本ロジックは同じだが、非表示部分の文字数の扱いがある。引数の$notloggiedintextは管理画面の設定したメッセージ。&lt;br /&gt;
&lt;br /&gt;
共通関数を作って、それを流用して、引数で文字数を受け取るようにするか。&lt;br /&gt;
&lt;br /&gt;
[[Category:Distributed]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=X&amp;diff=575</id>
		<title>X</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=X&amp;diff=575"/>
		<updated>2025-06-14T13:11:09Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Other Account 不審なログインが阻止されました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
旧Twitter。&lt;br /&gt;
&lt;br /&gt;
== Link ==&lt;br /&gt;
&lt;br /&gt;
* [https://marketing.twitter.com/ja/insights/kakusan 世界初公開｜「#拡散の科学」なぜ人はリツイートするのか？]&lt;br /&gt;
* https://x.com/Etype_mag/status/1859173932332613843 [https://type.jp/et/feature/27221/ 【独占】イーロン買収後の激動、日本初の開発拠点立ち上げの思惑とは？ X日本法人代表・松山歩が明かす - エンジニアtype | 転職type]&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
X/Twitter関係でアクセスの多い役務関係の記事が以下となっている。&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/28/9050/ 役務: X/Twitterのデータ一括ダウンロードCLI/GUIツールtwmd (twitter-media-downloader) | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2024/02/03/10046/ 役務: X/Twitterの匿名閲覧・RSS提供サービスNitterの終了？ | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
特に、Nitterは主要なメディアでの報道がないものの、潜在的なユーザーが多いようで、アクセスが多かった。&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
Ref: [https://developer.twitter.com/ja/docs/basics/authentication/overview/oauth OAuth with the Twitter API | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
Twitter APIを使う場合、まず認証が必要になる。OAuth 2.0ベースだが、いくつか方式がある。&lt;br /&gt;
&lt;br /&gt;
# Application-only authentication: OAuth2 (bearer token): アプリで認証するケース。&lt;br /&gt;
# Application-user authentication: OAuth 1a (access token for user context): ユーザーで認証するケース。3-legged-OAuthを使用。&lt;br /&gt;
&lt;br /&gt;
1番目は全体で共有する感じ。単独アプリなどで使う。レート制限などを緩和するために、サーバーアプリで、登録ユーザー別に、認証したいなら後者を使ったほうがいい。&lt;br /&gt;
&lt;br /&gt;
==== OAuth 1.0a ====&lt;br /&gt;
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a OAuth 1.0a | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
以下の情報を使う。&lt;br /&gt;
&lt;br /&gt;
* oauth_consumer_key/secret: アプリの認証情報。アクセストークンの取得に使用。API Key、アプリキーなどとも呼ばれる。&lt;br /&gt;
* oauth_token/secret: アクセストークン。ユーザーが自分のアカウントにAPI経由でのアクセスに使用。実質的なパスワード。&lt;br /&gt;
&lt;br /&gt;
consumer_key/secretは、開発者がX Developer Platformから事前に発行して取得しておく必要がある。oauth_token/secretは実装後にユーザーがアプリ操作で取得する感じになる。&lt;br /&gt;
&lt;br /&gt;
アクセストークンを実際に取得する際のリクエストは以下のようなイメージ。&lt;br /&gt;
 curl --request POST \&lt;br /&gt;
   --url '&amp;lt;nowiki&amp;gt;https://api.twitter.com/1.1/statuses/update.json?status=Hello%20world'&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   --header 'authorization: OAuth oauth_consumer_key=&amp;quot;CONSUMER_API_KEY&amp;quot;, oauth_nonce=&amp;quot;OAUTH_NONCE&amp;quot;, oauth_signature=&amp;quot;OAUTH_SIGNATURE&amp;quot;, oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;, oauth_timestamp=&amp;quot;OAUTH_TIMESTAMP&amp;quot;, oauth_token=&amp;quot;ACCESS_TOKEN&amp;quot;, oauth_version=&amp;quot;1.0&amp;quot;' \&lt;br /&gt;
&lt;br /&gt;
===== API Key and Secret =====&lt;br /&gt;
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/api-key-and-secret API Key and Secret | Docs | Twitter Developer Platform].&lt;br /&gt;
&lt;br /&gt;
Consumer Key/Secretを取得する。開発者アカウントにログインして、アプリのプロジェクトを作成すると表示される。これを控えておく。&lt;br /&gt;
&lt;br /&gt;
===== User Access Tokens (3-legged OAuth flow) =====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://cdn.cms-twdigitalassets.com/content/dam/developer-twitter/docs/obtaining-access-tokens.png.twimg.1920.png User Access Tokens (3-legged OAuth flow) | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/obtaining-user-access-tokens ユーザーアクセストークンの取得（3レッグ認証OAuth） | Docs | Twitter Developer Platform]&lt;br /&gt;
&lt;br /&gt;
3-legged OAuth flowをに従って、ユーザーにアクセストークンの取得を行える。ここが重要。Twitterでのログインとほぼ同じ手順。&lt;br /&gt;
&lt;br /&gt;
====== 1 POST oauth/request_token ======&lt;br /&gt;
まずコンシューマーキーを使って、アクセストークンを要請する。&lt;br /&gt;
&lt;br /&gt;
* oauth_callback&lt;br /&gt;
* oauth_consumer_key&lt;br /&gt;
&lt;br /&gt;
応答200で以下のパラメーターがボディーにあるので、これを後続の処理で使用する。&lt;br /&gt;
&lt;br /&gt;
* oauth_token&lt;br /&gt;
* oauth_token_secret&lt;br /&gt;
* oauth_callback_confirmed&lt;br /&gt;
なお、OAuth関係のリクエスト送信時には、&lt;br /&gt;
&lt;br /&gt;
oauth_nonce=&amp;quot;OAUTH_NONCE&amp;quot;, oauth_signature=&amp;quot;OAUTH_SIGNATURE&amp;quot;, oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;, oauth_timestamp=&amp;quot;OAUTH_TIMESTAMP&amp;quot;, oauth_token=&amp;quot;ACCESS_TOKEN&amp;quot;, oauth_version=&amp;quot;1.0&amp;quot;' \&lt;br /&gt;
&lt;br /&gt;
の情報も必要な模様。&lt;br /&gt;
&lt;br /&gt;
====== 2 GET oauth/authorize ======&lt;br /&gt;
1で取得したoauth_tokenを使って、GETする。&lt;br /&gt;
&lt;br /&gt;
https://api.twitter.com/oauth/authorize?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&lt;br /&gt;
&lt;br /&gt;
すると、1でoauth_callbackdで指定したURLにリダイレクトされて、URLクエリーにパラメーターがついてくる。&lt;br /&gt;
&lt;br /&gt;
https://yourCallbackUrl.com?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&amp;amp;oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY&lt;br /&gt;
&lt;br /&gt;
====== 3 POST oauth/access_token ======&lt;br /&gt;
最後にアクセストークンを取得する。&lt;br /&gt;
&lt;br /&gt;
* POST /oauth/access_token&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
応答本体に以下が返ってくる。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以後は上記をリクエストで使う。&lt;br /&gt;
&lt;br /&gt;
===== Authorizing a request =====&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/authorizing-a-request Authorizing a request | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://qiita.com/kerupani129/items/ee9d894cc67101f16c3f OAuth 1.0a 認証の実装 (Twitter API 用) #Twitter - Qiita]&lt;br /&gt;
* [https://note.com/tkhm_dev/n/n152ea1b08b8d Twitter APIをcurlで呼び出す場合のSignatureの生成｜tkhm]&lt;br /&gt;
&lt;br /&gt;
X/TwitterはシンプルHTTPでAPI呼び出しがベース。&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1&lt;br /&gt;
Accept: */*&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: OAuth gem v0.4.4&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Content-Length: 76&lt;br /&gt;
Host: api.twitter.com&lt;br /&gt;
&lt;br /&gt;
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ただし、これに加えて以下の情報がないと、無効扱いになる。&lt;br /&gt;
&lt;br /&gt;
* アプリ。&lt;br /&gt;
* ユーザー。&lt;br /&gt;
* 権限。&lt;br /&gt;
* 改竄。&lt;br /&gt;
&lt;br /&gt;
上記の情報をリクエストに付与するために、OAuth 1.0aプロトコルを採用している。具体的には、上記の情報を付与する、追加のHTTP Authorizationヘッダーがあればよい。具体的には以下となる。&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1&lt;br /&gt;
Accept: */*&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: OAuth gem v0.4.4&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Authorization:&lt;br /&gt;
OAuth oauth_consumer_key=&amp;quot;xvz1evFS4wEEPTGEFPHBog&amp;quot;,&lt;br /&gt;
oauth_nonce=&amp;quot;kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg&amp;quot;,&lt;br /&gt;
oauth_signature=&amp;quot;tnnArxj06cWHq44gCs1OSKk%2FjLY%3D&amp;quot;,&lt;br /&gt;
oauth_signature_method=&amp;quot;HMAC-SHA1&amp;quot;,&lt;br /&gt;
oauth_timestamp=&amp;quot;1318622958&amp;quot;,&lt;br /&gt;
oauth_token=&amp;quot;370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb&amp;quot;,&lt;br /&gt;
oauth_version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
Content-Length: 76&lt;br /&gt;
Host: api.twitter.com&lt;br /&gt;
&lt;br /&gt;
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Authorizationヘッダーは実際には一行。&lt;br /&gt;
&lt;br /&gt;
この署名プロセスが過度な場合、Web Intentsを使ったほうが簡単。&lt;br /&gt;
&lt;br /&gt;
パラメーターは以下の通り。&lt;br /&gt;
&lt;br /&gt;
* oauth_consumer_key=アプリの情報。開発者ページで生成しておく。&lt;br /&gt;
* oauth_nonce=リクエストごとに固有。再送防止用に使用する。&lt;br /&gt;
* oauth_signature=改竄防止用。他のパラメーターから自動生成。&lt;br /&gt;
* oauth_signature_method=HMAC-SHA1で固定。&lt;br /&gt;
* oauth_timestamp=リクエスト作成日。Unixエポック。&lt;br /&gt;
* oauth_token=アクセストークン。&lt;br /&gt;
* oauth_version=1.0固定。&lt;br /&gt;
&lt;br /&gt;
===== Creating a signature =====&lt;br /&gt;
&lt;br /&gt;
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/creating-a-signature 署名の作成 | Docs | Twitter Developer Platform]&lt;br /&gt;
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature Creating a signature | Docs | Twitter Developer Platform]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Account ===&lt;br /&gt;
&lt;br /&gt;
==== 不審なログインが阻止されました ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;blockquote class=&amp;quot;twitter-tweet&amp;quot;&amp;gt;&amp;lt;p lang=&amp;quot;ja&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;ふえええんなんかtwitterのバグでロックかかってたの、ちょうど24時間で復活したー！&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 　後学のために、また同じ問題に当たってしまった方のために記録を残しておきます。&lt;br /&gt;
 &lt;br /&gt;
 ・以下のようなメッセージが出て入れなくなっていました。&lt;br /&gt;
 &lt;br /&gt;
 不審なログインが阻止されました&lt;br /&gt;
 ご本人であることを確認できなかったため、ご利用のアカウントへのアクセスをブロックしました。これは、ログイン試行の回数が多すぎる、普段とは別の場所や端末からログインが試みられたなど、通常とは異なるログイン操作が見られたためです。しばらくしてからログインしなおしてください。このようなブロックは自動的に解除されます。ログインの問題についてのヘルプは、こちらをご覧ください。&lt;br /&gt;
 &lt;br /&gt;
 ・他の方もそうなるかはわかりませんが、僕はちょうど24時間でロックが解除されました。&lt;br /&gt;
 &lt;br /&gt;
 　ご参考までに！&amp;lt;nowiki&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;&amp;lt;/nowiki&amp;gt;mdash; 稲垣理一郎(リーチロー)💵🪨🏈 (@reach_ina) &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;https://twitter.com/reach_ina/status/1680975592521633795?ref_src=twsrc%5Etfw&amp;quot;&amp;gt;July 17, 2023&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;&amp;lt;script async src=&amp;quot;https://platform.twitter.com/widgets.js&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
サブアカウント作成などで、既存アカウントのログアウト・ログインを複数回繰り返すと、不正アクセス扱いでブロックされる。24時間経過しないと解除されないらしい。&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=MediaWiki&amp;diff=574</id>
		<title>MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=MediaWiki&amp;diff=574"/>
		<updated>2025-06-09T13:23:54Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Category:構文ハイライトエラーがあるページ&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
MediaWikiはWikipediaで採用されている世界一有名なWikiソフトだ。&lt;br /&gt;
&lt;br /&gt;
GNU social JP WikiもMediaWikiを採用している ([https://web.gnusocial.jp/post/2023/10/31/9191/ 告知: 自由な分散SNSのWiki「GNU social JP Wiki」の開始とサービス名の改名 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
「[https://kinsta.com/jp/blog/wordpress-wiki/ WordPress Wikiの作成方法（徹底解説）]」にあるように、WordPressでも似たようなWikiサイトの構築は可能。&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/30/9167/ 設置: MediaWiki | Wikipediaで採用された世界一有名な情報集約のWikiソフト | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/11/04/9170/ 設置: MediaWikiのindex.phpを省く短縮URL設定 | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/11/05/9173/ 設置: MediaWikiのホーム画面 (メインページ/Man_Page) の変更方法 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Operation ==&lt;br /&gt;
[[mediawikiwiki:Manual:Administrators|Manual:Administrators - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
=== Protection ===&lt;br /&gt;
&lt;br /&gt;
* [[wikibooks:MediaWiki_Administrator's_Handbook/Page_Protection|MediaWiki Administrator's Handbook/Page Protection - Wikibooks, open books for an open world]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Autoconfirmed_users|Manual:Autoconfirmed users - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
荒らしや編集合戦対策で、ページを保護することで、編集を権限者に限定できる。&lt;br /&gt;
&lt;br /&gt;
=== Block ===&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:Block_and_unblock|Manual:Block and unblock - MediaWiki]] - [[wikibooks:MediaWiki_Administrator's_Handbook/User_Block|MediaWiki Administrator's Handbook/User Block - Wikibooks, open books for an open world]]&lt;br /&gt;
&lt;br /&gt;
サイトが悪党に荒らされた場合の対策。該当アカウントをブロックできる。&lt;br /&gt;
&lt;br /&gt;
ブロックの効果: 編集軽作業が不能になる。&lt;br /&gt;
&lt;br /&gt;
荒らされたページや、新規作成されたページは、復元か削除で対応する。&lt;br /&gt;
&lt;br /&gt;
方法。&lt;br /&gt;
&lt;br /&gt;
* Special:Blockにアクセス。IPアドレスかユーザー名を指定。&lt;br /&gt;
* 他に、利用者か利用者トークページを開くと、サイドバーにブロックのリンクがあり、そこからも実施可能。&lt;br /&gt;
&lt;br /&gt;
オプション&lt;br /&gt;
&lt;br /&gt;
* アカウント作成をブロック: そのIPアドレスから新規登録を不能にする。&lt;br /&gt;
* 最後の使用IPアドレスと編集アドレスをブロック (ハードブロック):&lt;br /&gt;
&lt;br /&gt;
=== Revert/Rollback ===&lt;br /&gt;
Ref: [[mediawikiwiki:Manual:Reverts|Manual:Reverts - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
MediaWikiで誰かの編集を打ち消したり元に戻す機能。基本的に、復元用の履歴を作って元に戻す。&lt;br /&gt;
&lt;br /&gt;
Revert (undo) は、ページを任意の履歴に戻す。現在のページからその履歴までの変更点を逆に適用して、新しい履歴を作る。基本的に誰でもできる。&lt;br /&gt;
&lt;br /&gt;
Rollback/ロールバックは、ページに対して、同じユーザーによる最後の編集をまとめて巻き戻す。rollback権限が必要。シナリオとしては、同一ユーザーにより荒らしなどで大量に編集、破壊された場合に一括で戻せる。&lt;br /&gt;
&lt;br /&gt;
なお、ページが誕生して以来1名のユーザーしか編集していない場合、ページの作成時点まで戻るので使用できない。&lt;br /&gt;
&lt;br /&gt;
ロールバックを実行すると、「Ctkpaarr964565498 (トーク) による編集を Gnusocialjp による直前の版へ差し戻しました」のメッセージで、変更を打ち消し履歴が作られる。&lt;br /&gt;
&lt;br /&gt;
=== RevisionDelete ===&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Help:RevisionDelete/ja|Help:版指定削除 - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:RevisionDelete/ja|Manual:版指定削除 - MediaWiki]]&lt;br /&gt;
* [https://design.kyusan-u.ac.jp/OpenSquareJP/?MediaWiki/Customize MediaWiki/Customize - OpenSquareJP｜井上貢一研究室]&lt;br /&gt;
&lt;br /&gt;
秘匿情報を誤って公開した場合など、特定の変更履歴を非表示にできる。&lt;br /&gt;
&lt;br /&gt;
LocalSettings.phpに以下を追記すると有効になる。&lt;br /&gt;
 $wgGroupPermissions['sysop']['deletelogentry'] = true;&lt;br /&gt;
 $wgGroupPermissions['sysop']['deleterevision'] = true;&lt;br /&gt;
&lt;br /&gt;
=== Right ===&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:User_rights|Manual:User rights - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Preventing_access|Manual:Preventing access - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:$wgGroupPermissions|Manual:$wgGroupPermissions - MediaWiki]]&lt;br /&gt;
* [https://sudachi.jp/wiki/MediaWiki%E3%81%AE%E8%A8%AD%E5%AE%9A MediaWikiの設定 - すだちWiki]&lt;br /&gt;
&lt;br /&gt;
アクセス管理がユーザーやグループ単位でできる。&lt;br /&gt;
&lt;br /&gt;
$wgGroupPermissions[グループ名][権限] で制御する。いくつか便利な設定、よくやる設定がある。&lt;br /&gt;
 # Prevent new user registrations except by sysops&lt;br /&gt;
 $wgGroupPermissions['*']['createaccount'] = false;&lt;br /&gt;
&lt;br /&gt;
=== Spam ===&lt;br /&gt;
「[[mediawikiwiki:Manual:Combating_spam|Manual:Combating spam - MediaWiki]]」にMediaWikiのスパム対策の基本がまとまっている。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Extension:ConfirmEdit|Extension:ConfirmEdit - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
=== ページ分類方法 ===&lt;br /&gt;
[http://blog.livedoor.jp/lionkid/archives/3096475.html world-walker スタッフ ブログ:MediaWikiのページ分類方法についての考察]&lt;br /&gt;
&lt;br /&gt;
* 名前空間（Namespace）&lt;br /&gt;
* カテゴリ（Category）&lt;br /&gt;
* サブページ（Subpage）&lt;br /&gt;
&lt;br /&gt;
MediaWikiでは上記の3種類のページ分類方法がある。それぞれ一長一短。&lt;br /&gt;
&lt;br /&gt;
だが、基本的にはCategoryでやるのが一番汎用的。1個のページが複数の分類にしたいということがよくある。名前空間とサブページだとそれができない。親は常に1個。住所のような完全に上下関係が一致するなら問題ないが、後で変えるのもたいへん。&lt;br /&gt;
&lt;br /&gt;
=== Category ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
[[mediawikiwiki:Help:Categories/ja|Help:カテゴリ - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
ページをグループ化する機能。重要。&lt;br /&gt;
&lt;br /&gt;
カテゴリーへのページの追加は、追加対象ページに &amp;lt;nowiki&amp;gt;[[Category:カテゴリ名]]&amp;lt;/nowiki&amp;gt; を追加するだけ。どこでもいい。最下部が一般的。&lt;br /&gt;
&lt;br /&gt;
カテゴリーページ自体へのリンクを張る場合、&amp;lt;nowiki&amp;gt;[[:Category:カテゴリー名]]&amp;lt;/nowiki&amp;gt; のように、先頭に:を付与する。&lt;br /&gt;
&lt;br /&gt;
カテゴリーが未作成なら、同時にカテゴリーの未作成ページができる。カテゴリーページはカテゴリーページで、作成が必要。カテゴリー自体も作成はできる。通常のページ同様に、 [Category:カテゴリー名] で検索して、新規作成する。&lt;br /&gt;
&lt;br /&gt;
新規作成すると、CategoryTree拡張機能で、自動的にカテゴリー一覧が末尾に表示される。&lt;br /&gt;
&lt;br /&gt;
カテゴリー自体も別のカテゴリーに属すことができる。ページ同様に、カテゴリーページに &amp;lt;nowiki&amp;gt;[[Category:カテゴリ名]]&amp;lt;/nowiki&amp;gt; を追加するだけ。&lt;br /&gt;
&lt;br /&gt;
カテゴリーの階層の保守としては、カテゴリーでツリー構造になっているときれい。サブページに近い。カテゴリーでWiki全体を分類してまとめられる。Category:Mainをカテゴリーのルートにするときれいかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== CategoryTree ====&lt;br /&gt;
&lt;br /&gt;
===== About =====&lt;br /&gt;
カテゴリーの一覧表示は、標準拡張機能の「[[mediawikiwiki:Extension:CategoryTree/ja|Extension:CategoryTree - MediaWiki]]」で可能になる。transclude (参照読込) ではできない ([https://stackoverflow.com/questions/1050853/transclude-a-category-in-mediawiki Transclude a category in MediaWiki - Stack Overflow])。&lt;br /&gt;
&lt;br /&gt;
CategoryTreeは以下の3種類の使用方法がある。&lt;br /&gt;
&lt;br /&gt;
# カテゴリーページでデフォルト表示。&lt;br /&gt;
# カスタムタグ (categorytree )。&lt;br /&gt;
# special page ([[特別:CategoryTree|Special:CategoryTree]])&lt;br /&gt;
&lt;br /&gt;
categorytree要素は以下のような形式で使う。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;categorytree showcount=&amp;quot;on&amp;quot; mode=&amp;quot;all&amp;quot;&amp;gt;Main&amp;lt;/categorytree&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
重要なオプションがある。&lt;br /&gt;
&lt;br /&gt;
* mode: 初期値が複雑。namespacesで上書き。なければ、項目が有無で決まる。pages (上限200ページ) かallを指定しておけばいいと思われる。ページ数が膨大ならpages。&lt;br /&gt;
** categories (0): サブカテゴリーのみ。&lt;br /&gt;
** pages (10): 画像を除いた、サブカテゴリーとページ。上限200ページ。&lt;br /&gt;
** all (20): 全部。&lt;br /&gt;
** parents (100): 親のカテゴリーを表示。インバース操作用。&lt;br /&gt;
* showcount: &amp;quot;on&amp;quot;でカテゴリーの記事数表示。categorytree要素でのみデフォルトoff。&lt;br /&gt;
&lt;br /&gt;
===== デフォルト展開 =====&lt;br /&gt;
CategoryTreeのcategorytree要素を使うと、カテゴリー一覧を表示できる。が、クリックしないと展開されないのが、余計なクリックが必要で嫌。&amp;lt;blockquote&amp;gt;&lt;br /&gt;
; depth&lt;br /&gt;
: determines how many levels of the tree are shown initially. Default is 1. 0 means only the root node. The maximum value depends on the mode specified, and on the &amp;lt;code&amp;gt;$wgCategoryTreeMaxDepth&amp;lt;/code&amp;gt; option. (Introduced between [[/static-codereview.wikimedia.org/MediaWiki/20410.html|r20410]] and [[/static-codereview.wikimedia.org/MediaWiki/20840.html|r20840]], Mar 30 2007; fully functional even with &amp;lt;code&amp;gt;$wgCategoryTreeDynamicTag&amp;lt;/code&amp;gt; since [[/static-codereview.wikimedia.org/MediaWiki/36864.html|r36864]], July 2008.)&lt;br /&gt;
&lt;br /&gt;
; $wgCategoryTreeMaxDepth&lt;br /&gt;
: an array defining the maximum depth for each [[/www.mediawiki.org/wiki/Extension:CategoryTree#Modes|mode]], to which the tree may be expanded initially using the depth parameter in a &amp;lt;category&amp;gt; tag. By default, this is set to 2 for the &amp;quot;categories&amp;quot; mode, and 1 for other modes. To set it to 3 for categories and 2 for other modes, for example, you can use &amp;lt;code&amp;gt;$wgCategoryTreeMaxDepth = [10 =&amp;gt; 2, 20 =&amp;gt; 2, 0 =&amp;gt; 3, 100 =&amp;gt; 2];&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;このあたりの、オプションと設定を使うと、うまくできる。&lt;br /&gt;
&lt;br /&gt;
基本はdepthで最大展開表示数を制御する。ただし、性能の制御のために$wgCategoryTreeMaxDepthで上限が決まっている。デフォルトで、mode=&amp;quot;categories&amp;quot;=2、他は1になっている。&lt;br /&gt;
 $wgCategoryTreeMaxDepth = [20 =&amp;gt; 9];&lt;br /&gt;
そんなに階層が何重にもなることは想定していないが、上記のようにLocalSettings.phpでallの最大を1から9に変更する。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;categorytree showcount=&amp;quot;on&amp;quot; mode=&amp;quot;all&amp;quot; depth=&amp;quot;9&amp;quot;&amp;gt;Main&amp;lt;/categorytree&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
加えて、上記のようにdepth=&amp;quot;9&amp;quot;を指定すると反映される。膨大なWikiで9が重いなら、上限を変える。これで一括管理できる仕組みな模様。&lt;br /&gt;
&lt;br /&gt;
「[https://stackoverflow.com/questions/37348060/mediawiki-category-tree-expand-all-by-default MediaWiki Category Tree expand all by default - Stack Overflow]」が関連Q&amp;amp;Aだが、回答が的外れになっている。&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
日本語にすると、ヘルプとか特別とかが日本語のURLになるのが嫌。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:Language/en|Manual:Language - MediaWiki]]」&lt;br /&gt;
&lt;br /&gt;
Page content languageで変更できる？&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:FAQ|Manual:FAQ - MediaWiki]]」&lt;br /&gt;
&lt;br /&gt;
Special:Allmessagesにシステムメッセージのリストがある。例えば、「特別ページ」は「specialpage 」が対応している。[Special:AllMessages] は「システムメッセージの一覧」 で対応している。&lt;br /&gt;
&lt;br /&gt;
[MediaWiki:Allmessages] のページでシステムメッセージが格納されている。[MediaWiki:Allmessages/ja] で言語対応が出る。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:$wgUseDatabaseMessages|Manual:$wgUseDatabaseMessages - MediaWiki]]」で選択できる。falseにするとwpLanguageCodeで強制指定。trueだと自分で変更できる。&lt;br /&gt;
&lt;br /&gt;
「[https://github.com/wikimedia/mediawiki/blob/1.42.1/languages/i18n/en.json mediawiki/languages/i18n/en.json at 1.42.1 · wikimedia/mediawiki]」が言語対応の一覧。ここから探すとよい。&lt;br /&gt;
&lt;br /&gt;
特に重要なもの。&lt;br /&gt;
&lt;br /&gt;
* nstab: 名前空間類のプレフィクスの模様。&lt;br /&gt;
* nstab-special Special&lt;br /&gt;
* specialpage&lt;br /&gt;
* specialpages 特別ページ一覧&lt;br /&gt;
* nstab-&lt;br /&gt;
* mainpage&lt;br /&gt;
&lt;br /&gt;
Special:の扱いがよくわからない。カテゴリーじゃなくて名前空間。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:Configuration_settings|Manual:Configuration settings - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Special_pages|Manual:Special pages - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
The Special pseudo namespace can be translated in other languages. 翻訳可能。「[[mediawikiwiki:Manual:Namespace|Manual:Namespace - MediaWiki]]」によると、「[[mediawikiwiki:Manual:$wgNamespaceAliases|Manual:$wgNamespaceAliases - MediaWiki]]」で翻訳可能？&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:Namespace_constants|Manual:Namespace constants - MediaWiki]]」が定数。&lt;br /&gt;
&lt;br /&gt;
NS_SPECIALを指定すると、翻訳が無効になる？&lt;br /&gt;
 $wgNamespaceAliases['特別'] = NS_SPECIAL;&lt;br /&gt;
「[[mediawikiwiki:Topic:T9rltht3umy9zj8c|How to switch from german namespace to english? on Project:Support desk]]」これが近い。&lt;br /&gt;
&lt;br /&gt;
/jaなど言語ページもあって、変更できる。が、パーマリンクは変わらない。別のところ。&amp;lt;blockquote&amp;gt;[[/www.mediawiki.org/wiki/User:Ciencia Al Poder|&amp;lt;bdi&amp;gt;Ciencia Al Poder&amp;lt;/bdi&amp;gt;]] ([[/www.mediawiki.org/wiki/User talk:Ciencia Al Poder|talk]][[/www.mediawiki.org/wiki/Special:Contributions/Ciencia Al Poder|contribs]])&lt;br /&gt;
&lt;br /&gt;
What you can control in the MediaWiki namespace is the text of the tab, not the namespace itself (eg: when linking to pages in that namespace or the displayed URL). See [[/www.mediawiki.org/wiki/Manual:Using custom namespaces|Manual:Using custom namespaces]]&amp;lt;/blockquote&amp;gt;nstab系はタブテキストなどで、URLは変わらない。&lt;br /&gt;
&lt;br /&gt;
Special:AllMessagesからnstab-category nstab-category/jaをCategoryに直したがパーマリンクは反映されず。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Help:System_message|Help:System message - MediaWiki]]」にシステムメッセージの変更方法がある。&lt;br /&gt;
&lt;br /&gt;
まず、Special:AllMessagesのページに、システムメッセージの全リストがある。「[https://github.com/wikimedia/mediawiki/blob/1.42.1/languages/i18n/en.json mediawiki/languages/i18n/en.json at 1.42.1 · wikimedia/mediawiki]」がソースコードの対応。&lt;br /&gt;
&lt;br /&gt;
en.jsonのja.jsonを変更する？&lt;br /&gt;
&lt;br /&gt;
この画面から編集できる。変更方法が一応2種類ある。&lt;br /&gt;
&lt;br /&gt;
# [MediaWiki:メッセージキー] のページの値を変更。&lt;br /&gt;
# Special:AllMessagesの左側のリンクで上記ページにアクセス (既定のメッセージ文が使用されている場合、ページが不在というわけではなく、編集ページが空のためリンクが赤色になっている)。&lt;br /&gt;
nstab-categoryを変更しても、URLは変わらない。&lt;br /&gt;
&lt;br /&gt;
ChatGPTへの質問。&lt;br /&gt;
&lt;br /&gt;
MediaWikiの名前空間の翻訳を無効にする方法を教えてください。&lt;br /&gt;
&lt;br /&gt;
====== ChatGPT: ======&lt;br /&gt;
MediaWikiで名前空間の翻訳を無効にするには、以下の手順を実行します：&lt;br /&gt;
&lt;br /&gt;
# '''&amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; ファイルの編集''': MediaWikiの設定ファイルである &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; を開きます。このファイルは、MediaWikiインストールディレクトリにあります。&lt;br /&gt;
# '''翻訳を無効にする設定の追加''': &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; に以下の設定を追加します。この設定により、指定した名前空間の翻訳を無効にすることができます。&lt;br /&gt;
&lt;br /&gt;
 // 名前空間の翻訳を無効にする&lt;br /&gt;
 $wgTranslateLinks = false;&lt;br /&gt;
&lt;br /&gt;
# この設定を追加することで、すべての名前空間の翻訳が無効になります。&lt;br /&gt;
# '''特定の名前空間の翻訳を無効にする''': 特定の名前空間だけ翻訳を無効にしたい場合は、より具体的な設定を追加する必要があります。たとえば、「ユーザー」名前空間（&amp;lt;code&amp;gt;User&amp;lt;/code&amp;gt;）の翻訳を無効にするには、以下のように設定を追加します。&lt;br /&gt;
&lt;br /&gt;
 $wgNamespaceAliases = array(&lt;br /&gt;
     NS_USER =&amp;gt; 'User'&lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
 $wgTranslateLinks = false;&lt;br /&gt;
&lt;br /&gt;
# これにより、「ユーザー」名前空間の翻訳が無効になります。必要に応じて、他の名前空間も設定できます。&lt;br /&gt;
# '''設定の保存''': &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; を保存し、MediaWikiを再起動する必要があります。これにより、新しい設定が適用されます。&lt;br /&gt;
# '''確認''': 設定が正しく適用されているか確認するため、MediaWikiのインターフェースを確認し、指定した名前空間で翻訳が無効になっていることを確認します。&lt;br /&gt;
&lt;br /&gt;
この手順で、MediaWikiで名前空間の翻訳を無効にすることができます。必要に応じて、設定を調整してください。&lt;br /&gt;
&lt;br /&gt;
wgTranslateLinksは存在しない嘘だが、「[[mediawikiwiki:Manual:$wgNamespaceAliases/ja|Manual:$wgNamespaceAliases - MediaWiki]]」は使えそう。&lt;br /&gt;
&lt;br /&gt;
[https://www.hostknox.com/knowledgebase/686/How-to-add-namespace-aliases-in-MediaWiki.html HostKnox :: ナレッジベース :: MediaWiki に名前空間エイリアスを追加する方法]&lt;br /&gt;
&lt;br /&gt;
* 「[https://vanguardflight.xii.jp/wp/2014/03/30/313/ MediaWikiにExtension:Scribuntoをインストール – Remove Before Flight]」&lt;br /&gt;
* [https://vanguardflight.xii.jp/wp/2014/03/26/300/ MediaWikiのインストール手順 – Remove Before Flight]&lt;br /&gt;
&lt;br /&gt;
エイリアスを追加するか、ソースコードの変更がやはり必要だと思われる。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:$wgNamespaceAliases/ja|Manual:$wgNamespaceAliases - MediaWiki]]」を見ていたら、[[mediawikiwiki:Manual:$wgExtraNamespaces|Manual:$wgExtraNamespaces - MediaWiki]]が登場して、既定の名前空間の改名にも使えるらしい。「[[mediawikiwiki:Manual:Using_custom_namespaces|Manual:Using custom namespaces - MediaWiki]]」を見ると。&lt;br /&gt;
 define(&amp;quot;NS_FOO&amp;quot;, 3000);&lt;br /&gt;
 $wgExtraNamespaces[NS_FOO] = &amp;quot;Foo&amp;quot;;&lt;br /&gt;
以下のように名前を変更すると、改名できるらしい。&lt;br /&gt;
 define(&amp;quot;NS_FOO&amp;quot;, 3000);&lt;br /&gt;
 $wgExtraNamespaces[NS_FOO] = &amp;quot;New&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['Foo'] = NS_FOO;&lt;br /&gt;
本当かな？&lt;br /&gt;
&lt;br /&gt;
[[mediawikiwiki:Manual:Namespace_constants|Manual:Namespace constants - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
以下のコードでうまくいった。&lt;br /&gt;
 // Rename namespace to keep English&lt;br /&gt;
 $wgExtraNamespaces[NS_USER] = &amp;quot;User&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['利用者'] = NS_USER;&lt;br /&gt;
 $wgExtraNamespaces[NS_CATEGORY] = &amp;quot;Category&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['カテゴリ'] = NS_CATEGORY;&lt;br /&gt;
 $wgExtraNamespaces[NS_SPECIAL] = &amp;quot;Special&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['特別'] = NS_SPECIAL;&lt;br /&gt;
特別など他のページもこれで全部英語に戻す。&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== Conflict ====&lt;br /&gt;
複数のタブで同じページをGUIで編集して、更新すると、後の更新で前の更新が上書きされる。順番に注意する。&lt;br /&gt;
&lt;br /&gt;
GUIじゃなくて、ソースエディットで節単位だと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== Snippet ====&lt;br /&gt;
https://chatgpt.com/c/6747d5d5-57ec-800b-97ec-e00c1e87a2fc&lt;br /&gt;
&lt;br /&gt;
[https://www.wingfield.gr.jp/archives/4387 Mediawiki でのスニペット管理を考える - WINGFIELD since1995]&lt;br /&gt;
&lt;br /&gt;
MediaWikiでコードスニペットの管理。&lt;br /&gt;
&lt;br /&gt;
# 本文に埋め込み: 長いとみにくいかも。&lt;br /&gt;
# ファイルアップロード機能: 検索不能で編集履歴も追跡不能。&lt;br /&gt;
# VCSサービスの埋め込み。&lt;br /&gt;
&lt;br /&gt;
短文は埋め込み、長くなったらファイルアップロード。がいいかな。&lt;br /&gt;
&lt;br /&gt;
==== Media ====&lt;br /&gt;
画像などをアップロードする場合、ファイル名はサイト全体で固有である必要がある。いい加減なファイル名にはせずに、意味がわかるファイル名を心掛ける。&lt;br /&gt;
&lt;br /&gt;
アップロード後のファイルの改名は少々手間がかかる。「拡張機能: Renameuser/RenameFiles」の拡張機能を使うとよい。&lt;br /&gt;
&lt;br /&gt;
== Markup ==&lt;br /&gt;
&lt;br /&gt;
=== Transclusion ===&lt;br /&gt;
MeidaWikiでは他のページの内容を埋め込むことが可能で、この機能を [Transclusion/参照読み込み](https://www.mediawiki.org/wiki/Transclusion) と呼んでいる。&lt;br /&gt;
&lt;br /&gt;
{{&amp;lt;page name&amp;gt;}} のように、二重波括弧でページ名を指定すると埋め込める。埋め込み元で、埋め込みの許可・禁止ブロックをマークアップで指定することもできる。&lt;br /&gt;
&lt;br /&gt;
参照読み込み可能な特別ページは限定されていて、以下となる。&lt;br /&gt;
&lt;br /&gt;
* Special:AllPages&lt;br /&gt;
* Special:PrefixIndex&lt;br /&gt;
* Special:NewFiles&lt;br /&gt;
* Special:NewPages&lt;br /&gt;
* Special:RecentChanges&lt;br /&gt;
* Special:RecentChangesLinked. &lt;br /&gt;
&lt;br /&gt;
トップページでの埋め込み表示などで便利なものがある。AllPages/NewPages/RecentChangesあたりが特に便利そうだ。&lt;br /&gt;
&lt;br /&gt;
テンプレート的な使い方などで、駆使できると便利だろう。&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
MediaWikiでHTMLの要素をいくつか使用できる。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Help:Formatting|Help:Formatting - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:HTML_restriction|HTML restriction - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Help:HTML_in_wikitext|Help:HTML in wikitext - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
LocalSetting.phpで$wgRawHtml = true (デフォルトfalse) にすれば、html要素内でHTMLを無制限で使用可能になる。&lt;br /&gt;
&lt;br /&gt;
=== Page ===&lt;br /&gt;
Ref: [[mediawikiwiki:Topic:Ua1cqlfd07kyvd8p|How to Embed List of All Namespace-Pages in a Wiki Page? on Project:Support desk]]&lt;br /&gt;
&lt;br /&gt;
カスタム名前空間Privateで非公開ページを作ったら、Privateのページ一覧をメインページに表示させたくなった。若干工夫がいる。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Special:Prefixindex/&amp;lt;custom namespace&amp;gt;:}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;custom namespace&amp;gt;部分にカスタム名前空間を指定する。これで一覧ページを開ける。大事なのは末尾の:。これで先頭一致でページ一覧のページになっている。これをtransclusionする形。&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== Category:構文ハイライトエラーがあるページ ====&lt;br /&gt;
[https://knowledge.rinpress.com/index.php/MediaWiki%E3%81%AE%E3%80%8C%E6%A7%8B%E6%96%87%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%8D MediaWikiの「構文ハイライトエラー」 - とある社畜の頭脳整理]&lt;br /&gt;
&lt;br /&gt;
MediaWikiでコードブロックの挿入時に、SyntaxHighlightを使用していて、言語を指定しなかったら、そのページにこのカテゴリーが付与される。&lt;br /&gt;
&lt;br /&gt;
ただのテキストブロックを挿入したい場合、lang=textを選択する。これで解消される。&lt;br /&gt;
&lt;br /&gt;
==Setting==&lt;br /&gt;
&lt;br /&gt;
===Private===&lt;br /&gt;
特定ページを非公開にすることができる。後日方法を精査する。&lt;br /&gt;
&lt;br /&gt;
*[https://irineko.hatenablog.com/entry/2021/01/06/194908 mediawiki 特定のページの閲覧制限をしたい。 - 人狼wiki更新情報]&lt;br /&gt;
*[[mediawikiwiki:Manual:Preventing_access/ja|Manual:アクセス制限 - MediaWiki]]&lt;br /&gt;
全体設定としては以下がある。基本非公開で一部公開の場合に使える。&lt;br /&gt;
 # Disable reading by anonymous users&lt;br /&gt;
 $wgGroupPermissions['*']['read'] = false;&lt;br /&gt;
 &lt;br /&gt;
 # Disable anonymous editing&lt;br /&gt;
 $wgGroupPermissions['*']['edit'] = false;&lt;br /&gt;
 &lt;br /&gt;
 # Prevent new user registrations except by sysops&lt;br /&gt;
 $wgGroupPermissions['*']['createaccount'] = false;&lt;br /&gt;
今回は基本公開で一部非公開。&lt;br /&gt;
&lt;br /&gt;
*ユーザー属性での管理。&lt;br /&gt;
*名前空間での管理 (LockDown拡張機能)。&lt;br /&gt;
&lt;br /&gt;
Lockdownを試す。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/02/03/10009/ 機能: MediaWikiでのLockdown拡張を用いた名前空間単位の非公開ページ | GNU social JP Web]」に記した。&lt;br /&gt;
&lt;br /&gt;
=== $wgCapitalLinks===&lt;br /&gt;
出典: [[mediawikiwiki:Manual:$wgCapitalLinks|Manual:$wgCapitalLinks - MediaWiki]]。&lt;br /&gt;
&lt;br /&gt;
MediaWikiはデフォルトでページ名やページURLの先頭1文字目が大文字になる。&lt;br /&gt;
&lt;br /&gt;
$wgCapitalLinks = falseにするとこれを無効にできる。大文字小文字を完全に区別する。例えば、iPhoneなどのように、大文字小文字が重要なことがあるので、falseにしておくのがよいと思う。リンク切れにも影響するので最初の方で設定するとよい。&lt;br /&gt;
&lt;br /&gt;
==Other==&lt;br /&gt;
&lt;br /&gt;
===Analytics===&lt;br /&gt;
サイトのアクセス分析のためにGoogle Analyticsを設置したい。いくつか拡張機能がある。GA4対応が重要な項目。&lt;br /&gt;
&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_Analytics_Integration|Extension:Google Analytics Integration - MediaWiki]]: 翻訳は更新されているがベースコードは2017年のv3.0.1で古い。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleAnalyticsMetrics|Extension:GoogleAnalyticsMetrics - MediaWiki]]: 2023-01 v1.0.2。Google Analyticsからメトリクスを取得して挿入する。アクセスカウンター的な拡張機能な模様 (関連: [[mediawikiwiki:Extension:HitCounters|Extension:HitCounters - MediaWiki]])。&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_Analytics_Links|Extension:Google Analytics Links - MediaWiki]]: 2009年v1.2。古い。MediaWiki v1.39以上で動作しない。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleAnalyticsTopPages|Extension:GoogleAnalyticsTopPages - MediaWiki]]: 2014年v0.0.1。アクセス上位ページのリストを生成する。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleTagManager|Extension:GoogleTagManager - MediaWiki]]: 2023年v.1.1。Google Tag Managerを設置する。&lt;br /&gt;
*[[mediawikiwiki:Extension:GTag|Extension:GTag - MediaWiki]]、[https://mirukupc.com/2022/04/01/?p=169 MediaWikiでGoogle AnalyticsのGA4を使う - ミルクPCのブログ] (GTag): 2023 v1.3.0。新しいGoogle Analyticsのトラッキングタグに対応している。&lt;br /&gt;
*[https://github.com/harugon/Gtm GitHub - harugon/Gtm: MediaWikiにGoogle Tag Managerを追加します]: Google Tag Manager。&lt;br /&gt;
*[[mediawikiwiki:Extension:Matomo|Extension:Matomo - MediaWiki]]: Google Analyticsではない分析サービスの拡張機能。&lt;br /&gt;
&lt;br /&gt;
公式プラグインを優先したい。&lt;br /&gt;
&lt;br /&gt;
GTag、GoogleTagManager。これらが設置用にみえる。詳細に検討してみる。Google Tag ManagerはAnalyticsを含めて汎用的なことができる。ひとまずよくわからないので、シンプルなGTagを使ってみるとよさそう。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/01/04/9756/ 拡張: MediaWikiのGoogle Analytics追跡拡張機能GTag | GNU social JP Web]」で設置した。&lt;br /&gt;
&lt;br /&gt;
=== Advertise===&lt;br /&gt;
&lt;br /&gt;
====広告ブロッカー対策====&lt;br /&gt;
出典: [https://dajya-ranger.com/pukiwiki/defend-site-content-for-pukiwiki/ 【PukiWiki編】広告ブロッカーからサイトコンテンツと収益を守る！ | SEの良心]。&lt;br /&gt;
&lt;br /&gt;
MediaWikiでも同様の方法で広告ブロッカー対策を導入できそう。&lt;br /&gt;
&lt;br /&gt;
====Adsense====&lt;br /&gt;
Google Adsense設置用のプラグインがいくつかある。&lt;br /&gt;
&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_AdSense|Extension:Google AdSense - MediaWiki]]: MediaWiki v1.37以上で非互換。&lt;br /&gt;
*[[mediawikiwiki:Extension:ShoutWiki_Ads|Extension:ShoutWiki Ads - MediaWiki]]&lt;br /&gt;
*[[mediawikiwiki:Extension:Widgets|Extension:Widgets - MediaWiki]]&lt;br /&gt;
*[https://knowledge.rinpress.com/index.php/MediaWiki%E3%81%ABGoogle_AdSense%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F MediaWikiにGoogle AdSenseを追加してみた - とある社畜の頭脳整理]、[https://dococo.jp/index.php/Mediawiki%E3%81%A7Google_Adsense%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95 MediawikiでGoogle Adsenseを表示させる方法 - dococo wiki]、[https://dococo.jp/index.php?title=MediaWiki%E3%81%A7Google_Adcence MediaWikiでGoogle Adcence - dococo wiki]: HTMLetsを使うらしい。&lt;br /&gt;
&lt;br /&gt;
ShoutWiki AdsかWidgetsで設置する模様。基本はJavaScriptコードの設置。&lt;br /&gt;
&lt;br /&gt;
[[Category:Other]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=573</id>
		<title>LY Corporation</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=LY_Corporation&amp;diff=573"/>
		<updated>2025-06-03T00:29:58Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: ID/電話番号検索&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
LY Corporation (LINEヤフー株式会社) はにほんの企業。もともとLINE社とヤフー社の別々企業が合併してできた会社。&lt;br /&gt;
&lt;br /&gt;
SNSとの関係では、Yahooニュースのコメント機能のYahooコメントとチャットアプリのLINEのサービスを提供しており、日本でのユーザーは多い。&lt;br /&gt;
&lt;br /&gt;
== Article ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/category/centralized/centralized-ly/ centralized/LY | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== LINE ==&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&lt;br /&gt;
==== 非表示・ブロック・削除 ====&lt;br /&gt;
&lt;br /&gt;
* [https://news.mynavi.jp/article/20211025-2169252/ LINEで友だちを削除する方法 - ブロック削除と非表示削除の違い | マイナビニュース]&lt;br /&gt;
* [https://apprev.smt.docomo.ne.jp/article/440482/ 【LINE】ブロックするとどうなる？非表示・削除との違いも解説！ | NTTドコモ dアプリ＆レビュー]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/remove-friends.html 友だちを削除する｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/block-friends.html 友だちをブロック／ブロック解除する方法｜LINEみんなの使い方ガイド]&lt;br /&gt;
* [https://guide.line.me/ja/friends-and-groups/hide-friends.html 友だちを非表示／再表示する｜LINEみんなの使い方ガイド]&lt;br /&gt;
&lt;br /&gt;
LINEで友達追加後、その解除は複雑。単に、フォロー・フォロー解除という関係ではない。ややこしいので整理する。非表示と削除がフォロー解除に近い。&lt;br /&gt;
&lt;br /&gt;
* '''非表示/Hide'''：友だちリストやトーク画面、タイムラインに表示しない&lt;br /&gt;
* '''ブロック'''：相手からのトークや無料通話を受けない。相手にブロックの通知はない。&lt;br /&gt;
* '''削除'''：友だちリストに表示せず、相手からの通話は通知のみ受信。メッセージ履歴も消去。事前に非表示かブロックが必要。&lt;br /&gt;
&lt;br /&gt;
単に未読数が鬱陶しい場合は、非表示にすればよさそう。&lt;br /&gt;
&lt;br /&gt;
ミュートはまた別の機能。単に、push通知類をやめたい場合は、ミュート。未読数表示も嫌なら非表示。ただし、非表示はまた通知が来たら、再表示される模様。&lt;br /&gt;
&lt;br /&gt;
ブロックは履歴は残るが、通知がなくなる。削除は、履歴は消えるが、通知は受け取れる。&lt;br /&gt;
&lt;br /&gt;
==== ID/電話番号検索 ====&lt;br /&gt;
[https://help.line.me/line/smartphone/?contentId=20000372 友だちが追加できない | LINEヘルプセンター]&lt;br /&gt;
&lt;br /&gt;
デフォルトでは有効になっていたように思うが、設定がある。以下の設定が必要。&lt;br /&gt;
&lt;br /&gt;
* ID検索: [ホーム]-[設定]-[Profile/プロフィール]-[IDによる友だち追加を許可]&lt;br /&gt;
* 電話番号検索: [ホーム]-[設定]-[Frineds/友だち]-[Allow others to add me/友達への追加を許可]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=572</id>
		<title>Imgur</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=572"/>
		<updated>2025-05-12T00:40:42Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Comment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Imgur (イミジャー？) ([https://imgur.com/ Imgur: The magic of the Internet]) は画像共有SNS ([https://web.gnusocial.jp/post/2024/03/06/10426/ 役務: 容量無制限・永続保存で世界的に人気の画像共有サービスImgurは資料の保存・共有に非常に有用 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
日本では画像アップロード先として、掲示板サイトなどでよく使われている。が、Instagramのような画像共有SNSというのが運営側の主張。&lt;br /&gt;
&lt;br /&gt;
海外で人気の掲示板サイトのRedditに画像アップローダーがなかったため、主にRedditでの画像共有のために始まったとされている。2009年にサービスが開始し、現在は世界的に有名で人気の画像共有サービスとなっている。&lt;br /&gt;
&lt;br /&gt;
なお、2023年5月の更新で、ポルノ画像の削除が規約に盛り込まれた。それまでは、外部参照先として、ボルノ・エロ画像もアップロードが可能だった。同時に、アカウントなしで匿名アップロードした場合、アップロード画像が削除対象になるとも明記された。&lt;br /&gt;
&lt;br /&gt;
「[https://apptopi.jp/2021/11/30/imgur/ Imgur（イミジャー）って知ってる？便利な使い方を徹底解説！ | APPTOPI]」&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
Instagramも似たような画像共有機能として使うこともできるが、以下2点がImgurの特徴。&lt;br /&gt;
&lt;br /&gt;
* 匿名性&lt;br /&gt;
* Webでのフォルダー分け&lt;br /&gt;
&lt;br /&gt;
Instagramだと画像がユーザーアカウント連携され、アップロード者がすぐに分かる。また、スマートフォンアプリを優遇していて、分類分け機能のCollectionはWebからは使えない。外部アップローダーというよりかは、コミュニケーション機能を重視した設計になっている。&lt;br /&gt;
&lt;br /&gt;
人気の秘訣がアップロード画像の制限。以下の上限はあるものの、それ以外は無制限にアップロードが可能。&lt;br /&gt;
&lt;br /&gt;
* 1時間50ファイルまで&lt;br /&gt;
* 1ファイル上限20 MB&lt;br /&gt;
&lt;br /&gt;
高品質の写真などでなければ、無制限に利用可能なアップローダーとしても利用できる。&lt;br /&gt;
&lt;br /&gt;
画像アップロード時には、公開・非公開を選択でき、非公開にすると、リンクを知っている人だけが閲覧可能になる。非公開だとURLからアップロード者は特定不能になっている。&lt;br /&gt;
&lt;br /&gt;
なお、Web UIはいくつか問題がある模様。&lt;br /&gt;
&lt;br /&gt;
* マイページの [Post] にPublic/Hiddenで可視性に応じたタブがあるがこれはうまく機能していない模様。&lt;br /&gt;
* 他のユーザーのマイページを開いても [Post] がうまく表示されるとは限らない。&lt;br /&gt;
* フォルダー分け (Favorite) は1画像1カテゴリーのみ。&lt;br /&gt;
&lt;br /&gt;
上記制約があるので、基本はFavoriteで画像を分類分けして管理する使い方になると思われる。Favoriteは非公開にもできる。アップロード画像をpublic/hiddenを繰り返したりすると、うまく反映されることがあるが、あまりあてにしないほうがいい。アプリだと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
指定画像URLの保存や、動画・アニメーションgifの作成機能などもあり、WebArchiveで保存できない画像や、スクリーンショットでの一種の魚拓、データ保存サービスとしてかなり有用だと思われる。&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
Publicで投稿するとタイトルを変更できない。Privateにしたらタイトルを変更可能になる。一時的にPrivateにしてPublicに戻すと良い。パーマリンクも同じまま。&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
==== Bulk ====&lt;br /&gt;
[https://www.reddit.com/r/redditisfun/comments/2otj8s/batch_download_images_on_a_imgur_gallery_page/ Batch download images on a imgur gallery page? : r/redditisfun]&lt;br /&gt;
&lt;br /&gt;
アルバム・1個の投稿に添付された画像を一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
クラシックモードに切り替えて、アルバムを表示すると、右側に [Download post] が表示される。これを選ぶとzip形式で一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
=== Post ===&lt;br /&gt;
&lt;br /&gt;
==== Favorite hidden post ====&lt;br /&gt;
非公開 (hidden) で投稿した投稿をお気に入りでまとめて管理したいことがある。&lt;br /&gt;
&lt;br /&gt;
iOSアプリだとhidden postもお気に入りに登録するボタンがあるのだけど、デスクトップだとクラシックUIでもお気に入りボタンがない。APIを使えばたぶんできるのだろうけど。&lt;br /&gt;
&lt;br /&gt;
使いにくいが、アップロード後にアプリでお気に入りに追加して、フォルダー分けするのがよさそう。&lt;br /&gt;
&lt;br /&gt;
いや、誤解だった。MacのGoogle Chromeだとうまく表示されていないだけだった。MacのFirefoxならハートマークが表示されていて、ちゃんとお気に入り登録できるようになっていた。Imgurを使うときはFirefoxでやればよさそう。&lt;br /&gt;
&lt;br /&gt;
==== Comment ====&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26480452090779-Post-Privacy-Settings Post Privacy Settings – imgur]&lt;br /&gt;
&lt;br /&gt;
非公開投稿にすると、コメントできない。できるとしたら、画像の説明のみ。非公開で、投稿全体にコメントしたいならば、最初の画像に説明を書くとよさそう。&lt;br /&gt;
&lt;br /&gt;
== Account ==&lt;br /&gt;
&lt;br /&gt;
=== Delete an Account ===&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26513357802651-Delete-an-Account Delete an Account – imgur]&lt;br /&gt;
&lt;br /&gt;
アカウントを削除すると、ユーザー名が解放されて他のユーザーも使用可能になる。&lt;br /&gt;
&lt;br /&gt;
[Settings]-[Delete my account] で完了。&lt;br /&gt;
&lt;br /&gt;
一度削除すると、同じメールアドレスは使えない？Twitter/XやGoogleアカウントでのログインはできなかった。Apple IDでのログインはできた。&lt;br /&gt;
&lt;br /&gt;
=== Ban ===&lt;br /&gt;
一般公開で画像を投稿すると、他のユーザーも簡単に見えるようになる。看板などであったとしても、電話番号などがあると、通報されてすぐにアカウント凍結される。&lt;br /&gt;
&lt;br /&gt;
凍結されると、新規投稿ができなくなる。&lt;br /&gt;
&lt;br /&gt;
Imgurの使い方としては、基本的に匿名・非公開で常に投稿して、アップローダーとして使うのがいい、人目につかないので、通報される心配も減る。&lt;br /&gt;
&lt;br /&gt;
Banされても全投稿削除して問い合わせに問い合わせてもだめ。アカウント削除して作り直すしかないと思われる。&lt;br /&gt;
&lt;br /&gt;
=== My page ===&lt;br /&gt;
アカウントを作ると、以下のマイページが付与される。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://imgur.com/user/&amp;lt;/nowiki&amp;gt;[username]&lt;br /&gt;
* https://[username].imgur.com&lt;br /&gt;
&lt;br /&gt;
1個目のサブディレクトリーが基本の模様。ただ、Web版からだと若干操作感、機能が違う。例えば、Banされたサブディレクトリーのほうだと、ページを開かないと削除ができず、ページにアクセスできないので削除できない。サブドメインだとページを直接開かなくても、メニューのサブ項目から削除できた。&lt;br /&gt;
&lt;br /&gt;
=== Old Design/Classic UI ===&lt;br /&gt;
Imgurは2024年くらいからUIがモダンになっている。が、モダンUIだと、パソコンからだとお気に入りや一括ダウンロードなど機能が限定される。&lt;br /&gt;
&lt;br /&gt;
昔のURL (https://&amp;amp;#x5B;username&amp;amp;#x5D;.imgur.com) にアクセスするほか、Old Design (クラシックUI) に切り替えることができる。&lt;br /&gt;
&lt;br /&gt;
# ログイン後右上の自分のアバターを選ぶ (https://imgur.com/user/&amp;amp;#x5B;username&amp;amp;#x5D;).&lt;br /&gt;
# 右下の [Use Old Design] を選ぶ。&lt;br /&gt;
&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=571</id>
		<title>Imgur</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=571"/>
		<updated>2025-05-09T13:41:32Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Other */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Imgur (イミジャー？) ([https://imgur.com/ Imgur: The magic of the Internet]) は画像共有SNS ([https://web.gnusocial.jp/post/2024/03/06/10426/ 役務: 容量無制限・永続保存で世界的に人気の画像共有サービスImgurは資料の保存・共有に非常に有用 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
日本では画像アップロード先として、掲示板サイトなどでよく使われている。が、Instagramのような画像共有SNSというのが運営側の主張。&lt;br /&gt;
&lt;br /&gt;
海外で人気の掲示板サイトのRedditに画像アップローダーがなかったため、主にRedditでの画像共有のために始まったとされている。2009年にサービスが開始し、現在は世界的に有名で人気の画像共有サービスとなっている。&lt;br /&gt;
&lt;br /&gt;
なお、2023年5月の更新で、ポルノ画像の削除が規約に盛り込まれた。それまでは、外部参照先として、ボルノ・エロ画像もアップロードが可能だった。同時に、アカウントなしで匿名アップロードした場合、アップロード画像が削除対象になるとも明記された。&lt;br /&gt;
&lt;br /&gt;
「[https://apptopi.jp/2021/11/30/imgur/ Imgur（イミジャー）って知ってる？便利な使い方を徹底解説！ | APPTOPI]」&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
Instagramも似たような画像共有機能として使うこともできるが、以下2点がImgurの特徴。&lt;br /&gt;
&lt;br /&gt;
* 匿名性&lt;br /&gt;
* Webでのフォルダー分け&lt;br /&gt;
&lt;br /&gt;
Instagramだと画像がユーザーアカウント連携され、アップロード者がすぐに分かる。また、スマートフォンアプリを優遇していて、分類分け機能のCollectionはWebからは使えない。外部アップローダーというよりかは、コミュニケーション機能を重視した設計になっている。&lt;br /&gt;
&lt;br /&gt;
人気の秘訣がアップロード画像の制限。以下の上限はあるものの、それ以外は無制限にアップロードが可能。&lt;br /&gt;
&lt;br /&gt;
* 1時間50ファイルまで&lt;br /&gt;
* 1ファイル上限20 MB&lt;br /&gt;
&lt;br /&gt;
高品質の写真などでなければ、無制限に利用可能なアップローダーとしても利用できる。&lt;br /&gt;
&lt;br /&gt;
画像アップロード時には、公開・非公開を選択でき、非公開にすると、リンクを知っている人だけが閲覧可能になる。非公開だとURLからアップロード者は特定不能になっている。&lt;br /&gt;
&lt;br /&gt;
なお、Web UIはいくつか問題がある模様。&lt;br /&gt;
&lt;br /&gt;
* マイページの [Post] にPublic/Hiddenで可視性に応じたタブがあるがこれはうまく機能していない模様。&lt;br /&gt;
* 他のユーザーのマイページを開いても [Post] がうまく表示されるとは限らない。&lt;br /&gt;
* フォルダー分け (Favorite) は1画像1カテゴリーのみ。&lt;br /&gt;
&lt;br /&gt;
上記制約があるので、基本はFavoriteで画像を分類分けして管理する使い方になると思われる。Favoriteは非公開にもできる。アップロード画像をpublic/hiddenを繰り返したりすると、うまく反映されることがあるが、あまりあてにしないほうがいい。アプリだと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
指定画像URLの保存や、動画・アニメーションgifの作成機能などもあり、WebArchiveで保存できない画像や、スクリーンショットでの一種の魚拓、データ保存サービスとしてかなり有用だと思われる。&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
Publicで投稿するとタイトルを変更できない。Privateにしたらタイトルを変更可能になる。一時的にPrivateにしてPublicに戻すと良い。パーマリンクも同じまま。&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
==== Bulk ====&lt;br /&gt;
[https://www.reddit.com/r/redditisfun/comments/2otj8s/batch_download_images_on_a_imgur_gallery_page/ Batch download images on a imgur gallery page? : r/redditisfun]&lt;br /&gt;
&lt;br /&gt;
アルバム・1個の投稿に添付された画像を一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
クラシックモードに切り替えて、アルバムを表示すると、右側に [Download post] が表示される。これを選ぶとzip形式で一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== Favorite hidden post ====&lt;br /&gt;
非公開 (hidden) で投稿した投稿をお気に入りでまとめて管理したいことがある。&lt;br /&gt;
&lt;br /&gt;
iOSアプリだとhidden postもお気に入りに登録するボタンがあるのだけど、デスクトップだとクラシックUIでもお気に入りボタンがない。APIを使えばたぶんできるのだろうけど。&lt;br /&gt;
&lt;br /&gt;
使いにくいが、アップロード後にアプリでお気に入りに追加して、フォルダー分けするのがよさそう。&lt;br /&gt;
&lt;br /&gt;
いや、誤解だった。MacのGoogle Chromeだとうまく表示されていないだけだった。MacのFirefoxならハートマークが表示されていて、ちゃんとお気に入り登録できるようになっていた。Imgurを使うときはFirefoxでやればよさそう。&lt;br /&gt;
&lt;br /&gt;
== Account ==&lt;br /&gt;
&lt;br /&gt;
=== Delete an Account ===&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26513357802651-Delete-an-Account Delete an Account – imgur]&lt;br /&gt;
&lt;br /&gt;
アカウントを削除すると、ユーザー名が解放されて他のユーザーも使用可能になる。&lt;br /&gt;
&lt;br /&gt;
[Settings]-[Delete my account] で完了。&lt;br /&gt;
&lt;br /&gt;
一度削除すると、同じメールアドレスは使えない？Twitter/XやGoogleアカウントでのログインはできなかった。Apple IDでのログインはできた。&lt;br /&gt;
&lt;br /&gt;
=== Ban ===&lt;br /&gt;
一般公開で画像を投稿すると、他のユーザーも簡単に見えるようになる。看板などであったとしても、電話番号などがあると、通報されてすぐにアカウント凍結される。&lt;br /&gt;
&lt;br /&gt;
凍結されると、新規投稿ができなくなる。&lt;br /&gt;
&lt;br /&gt;
Imgurの使い方としては、基本的に匿名・非公開で常に投稿して、アップローダーとして使うのがいい、人目につかないので、通報される心配も減る。&lt;br /&gt;
&lt;br /&gt;
Banされても全投稿削除して問い合わせに問い合わせてもだめ。アカウント削除して作り直すしかないと思われる。&lt;br /&gt;
&lt;br /&gt;
=== My page ===&lt;br /&gt;
アカウントを作ると、以下のマイページが付与される。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://imgur.com/user/&amp;lt;/nowiki&amp;gt;[username]&lt;br /&gt;
* https://[username].imgur.com&lt;br /&gt;
&lt;br /&gt;
1個目のサブディレクトリーが基本の模様。ただ、Web版からだと若干操作感、機能が違う。例えば、Banされたサブディレクトリーのほうだと、ページを開かないと削除ができず、ページにアクセスできないので削除できない。サブドメインだとページを直接開かなくても、メニューのサブ項目から削除できた。&lt;br /&gt;
&lt;br /&gt;
=== Old Design/Classic UI ===&lt;br /&gt;
Imgurは2024年くらいからUIがモダンになっている。が、モダンUIだと、パソコンからだとお気に入りや一括ダウンロードなど機能が限定される。&lt;br /&gt;
&lt;br /&gt;
昔のURL (https://&amp;amp;#x5B;username&amp;amp;#x5D;.imgur.com) にアクセスするほか、Old Design (クラシックUI) に切り替えることができる。&lt;br /&gt;
&lt;br /&gt;
# ログイン後右上の自分のアバターを選ぶ (https://imgur.com/user/&amp;amp;#x5B;username&amp;amp;#x5D;).&lt;br /&gt;
# 右下の [Use Old Design] を選ぶ。&lt;br /&gt;
&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=570</id>
		<title>Imgur</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=570"/>
		<updated>2025-05-09T13:32:30Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Other Favorite hidden post&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Imgur (イミジャー？) ([https://imgur.com/ Imgur: The magic of the Internet]) は画像共有SNS ([https://web.gnusocial.jp/post/2024/03/06/10426/ 役務: 容量無制限・永続保存で世界的に人気の画像共有サービスImgurは資料の保存・共有に非常に有用 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
日本では画像アップロード先として、掲示板サイトなどでよく使われている。が、Instagramのような画像共有SNSというのが運営側の主張。&lt;br /&gt;
&lt;br /&gt;
海外で人気の掲示板サイトのRedditに画像アップローダーがなかったため、主にRedditでの画像共有のために始まったとされている。2009年にサービスが開始し、現在は世界的に有名で人気の画像共有サービスとなっている。&lt;br /&gt;
&lt;br /&gt;
なお、2023年5月の更新で、ポルノ画像の削除が規約に盛り込まれた。それまでは、外部参照先として、ボルノ・エロ画像もアップロードが可能だった。同時に、アカウントなしで匿名アップロードした場合、アップロード画像が削除対象になるとも明記された。&lt;br /&gt;
&lt;br /&gt;
「[https://apptopi.jp/2021/11/30/imgur/ Imgur（イミジャー）って知ってる？便利な使い方を徹底解説！ | APPTOPI]」&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
Instagramも似たような画像共有機能として使うこともできるが、以下2点がImgurの特徴。&lt;br /&gt;
&lt;br /&gt;
* 匿名性&lt;br /&gt;
* Webでのフォルダー分け&lt;br /&gt;
&lt;br /&gt;
Instagramだと画像がユーザーアカウント連携され、アップロード者がすぐに分かる。また、スマートフォンアプリを優遇していて、分類分け機能のCollectionはWebからは使えない。外部アップローダーというよりかは、コミュニケーション機能を重視した設計になっている。&lt;br /&gt;
&lt;br /&gt;
人気の秘訣がアップロード画像の制限。以下の上限はあるものの、それ以外は無制限にアップロードが可能。&lt;br /&gt;
&lt;br /&gt;
* 1時間50ファイルまで&lt;br /&gt;
* 1ファイル上限20 MB&lt;br /&gt;
&lt;br /&gt;
高品質の写真などでなければ、無制限に利用可能なアップローダーとしても利用できる。&lt;br /&gt;
&lt;br /&gt;
画像アップロード時には、公開・非公開を選択でき、非公開にすると、リンクを知っている人だけが閲覧可能になる。非公開だとURLからアップロード者は特定不能になっている。&lt;br /&gt;
&lt;br /&gt;
なお、Web UIはいくつか問題がある模様。&lt;br /&gt;
&lt;br /&gt;
* マイページの [Post] にPublic/Hiddenで可視性に応じたタブがあるがこれはうまく機能していない模様。&lt;br /&gt;
* 他のユーザーのマイページを開いても [Post] がうまく表示されるとは限らない。&lt;br /&gt;
* フォルダー分け (Favorite) は1画像1カテゴリーのみ。&lt;br /&gt;
&lt;br /&gt;
上記制約があるので、基本はFavoriteで画像を分類分けして管理する使い方になると思われる。Favoriteは非公開にもできる。アップロード画像をpublic/hiddenを繰り返したりすると、うまく反映されることがあるが、あまりあてにしないほうがいい。アプリだと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
指定画像URLの保存や、動画・アニメーションgifの作成機能などもあり、WebArchiveで保存できない画像や、スクリーンショットでの一種の魚拓、データ保存サービスとしてかなり有用だと思われる。&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
Publicで投稿するとタイトルを変更できない。Privateにしたらタイトルを変更可能になる。一時的にPrivateにしてPublicに戻すと良い。パーマリンクも同じまま。&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
==== Bulk ====&lt;br /&gt;
[https://www.reddit.com/r/redditisfun/comments/2otj8s/batch_download_images_on_a_imgur_gallery_page/ Batch download images on a imgur gallery page? : r/redditisfun]&lt;br /&gt;
&lt;br /&gt;
アルバム・1個の投稿に添付された画像を一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
クラシックモードに切り替えて、アルバムを表示すると、右側に [Download post] が表示される。これを選ぶとzip形式で一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== Favorite hidden post ====&lt;br /&gt;
非公開 (hidden) で投稿した投稿をお気に入りでまとめて管理したいことがある。&lt;br /&gt;
&lt;br /&gt;
iOSアプリだとhidden postもお気に入りに登録するボタンがあるのだけど、デスクトップだとクラシックUIでもお気に入りボタンがない。APIを使えばたぶんできるのだろうけど。&lt;br /&gt;
&lt;br /&gt;
使いにくいが、アップロード後にアプリでお気に入りに追加して、フォルダー分けするのがよさそう。&lt;br /&gt;
&lt;br /&gt;
== Account ==&lt;br /&gt;
&lt;br /&gt;
=== Delete an Account ===&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26513357802651-Delete-an-Account Delete an Account – imgur]&lt;br /&gt;
&lt;br /&gt;
アカウントを削除すると、ユーザー名が解放されて他のユーザーも使用可能になる。&lt;br /&gt;
&lt;br /&gt;
[Settings]-[Delete my account] で完了。&lt;br /&gt;
&lt;br /&gt;
一度削除すると、同じメールアドレスは使えない？Twitter/XやGoogleアカウントでのログインはできなかった。Apple IDでのログインはできた。&lt;br /&gt;
&lt;br /&gt;
=== Ban ===&lt;br /&gt;
一般公開で画像を投稿すると、他のユーザーも簡単に見えるようになる。看板などであったとしても、電話番号などがあると、通報されてすぐにアカウント凍結される。&lt;br /&gt;
&lt;br /&gt;
凍結されると、新規投稿ができなくなる。&lt;br /&gt;
&lt;br /&gt;
Imgurの使い方としては、基本的に匿名・非公開で常に投稿して、アップローダーとして使うのがいい、人目につかないので、通報される心配も減る。&lt;br /&gt;
&lt;br /&gt;
Banされても全投稿削除して問い合わせに問い合わせてもだめ。アカウント削除して作り直すしかないと思われる。&lt;br /&gt;
&lt;br /&gt;
=== My page ===&lt;br /&gt;
アカウントを作ると、以下のマイページが付与される。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://imgur.com/user/&amp;lt;/nowiki&amp;gt;[username]&lt;br /&gt;
* https://[username].imgur.com&lt;br /&gt;
&lt;br /&gt;
1個目のサブディレクトリーが基本の模様。ただ、Web版からだと若干操作感、機能が違う。例えば、Banされたサブディレクトリーのほうだと、ページを開かないと削除ができず、ページにアクセスできないので削除できない。サブドメインだとページを直接開かなくても、メニューのサブ項目から削除できた。&lt;br /&gt;
&lt;br /&gt;
=== Old Design/Classic UI ===&lt;br /&gt;
Imgurは2024年くらいからUIがモダンになっている。が、モダンUIだと、パソコンからだとお気に入りや一括ダウンロードなど機能が限定される。&lt;br /&gt;
&lt;br /&gt;
昔のURL (https://&amp;amp;#x5B;username&amp;amp;#x5D;.imgur.com) にアクセスするほか、Old Design (クラシックUI) に切り替えることができる。&lt;br /&gt;
&lt;br /&gt;
# ログイン後右上の自分のアバターを選ぶ (https://imgur.com/user/&amp;amp;#x5B;username&amp;amp;#x5D;).&lt;br /&gt;
# 右下の [Use Old Design] を選ぶ。&lt;br /&gt;
&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=569</id>
		<title>Imgur</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=569"/>
		<updated>2025-05-09T13:30:00Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Old Design/Classic UI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Imgur (イミジャー？) ([https://imgur.com/ Imgur: The magic of the Internet]) は画像共有SNS ([https://web.gnusocial.jp/post/2024/03/06/10426/ 役務: 容量無制限・永続保存で世界的に人気の画像共有サービスImgurは資料の保存・共有に非常に有用 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
日本では画像アップロード先として、掲示板サイトなどでよく使われている。が、Instagramのような画像共有SNSというのが運営側の主張。&lt;br /&gt;
&lt;br /&gt;
海外で人気の掲示板サイトのRedditに画像アップローダーがなかったため、主にRedditでの画像共有のために始まったとされている。2009年にサービスが開始し、現在は世界的に有名で人気の画像共有サービスとなっている。&lt;br /&gt;
&lt;br /&gt;
なお、2023年5月の更新で、ポルノ画像の削除が規約に盛り込まれた。それまでは、外部参照先として、ボルノ・エロ画像もアップロードが可能だった。同時に、アカウントなしで匿名アップロードした場合、アップロード画像が削除対象になるとも明記された。&lt;br /&gt;
&lt;br /&gt;
「[https://apptopi.jp/2021/11/30/imgur/ Imgur（イミジャー）って知ってる？便利な使い方を徹底解説！ | APPTOPI]」&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
Instagramも似たような画像共有機能として使うこともできるが、以下2点がImgurの特徴。&lt;br /&gt;
&lt;br /&gt;
* 匿名性&lt;br /&gt;
* Webでのフォルダー分け&lt;br /&gt;
&lt;br /&gt;
Instagramだと画像がユーザーアカウント連携され、アップロード者がすぐに分かる。また、スマートフォンアプリを優遇していて、分類分け機能のCollectionはWebからは使えない。外部アップローダーというよりかは、コミュニケーション機能を重視した設計になっている。&lt;br /&gt;
&lt;br /&gt;
人気の秘訣がアップロード画像の制限。以下の上限はあるものの、それ以外は無制限にアップロードが可能。&lt;br /&gt;
&lt;br /&gt;
* 1時間50ファイルまで&lt;br /&gt;
* 1ファイル上限20 MB&lt;br /&gt;
&lt;br /&gt;
高品質の写真などでなければ、無制限に利用可能なアップローダーとしても利用できる。&lt;br /&gt;
&lt;br /&gt;
画像アップロード時には、公開・非公開を選択でき、非公開にすると、リンクを知っている人だけが閲覧可能になる。非公開だとURLからアップロード者は特定不能になっている。&lt;br /&gt;
&lt;br /&gt;
なお、Web UIはいくつか問題がある模様。&lt;br /&gt;
&lt;br /&gt;
* マイページの [Post] にPublic/Hiddenで可視性に応じたタブがあるがこれはうまく機能していない模様。&lt;br /&gt;
* 他のユーザーのマイページを開いても [Post] がうまく表示されるとは限らない。&lt;br /&gt;
* フォルダー分け (Favorite) は1画像1カテゴリーのみ。&lt;br /&gt;
&lt;br /&gt;
上記制約があるので、基本はFavoriteで画像を分類分けして管理する使い方になると思われる。Favoriteは非公開にもできる。アップロード画像をpublic/hiddenを繰り返したりすると、うまく反映されることがあるが、あまりあてにしないほうがいい。アプリだと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
指定画像URLの保存や、動画・アニメーションgifの作成機能などもあり、WebArchiveで保存できない画像や、スクリーンショットでの一種の魚拓、データ保存サービスとしてかなり有用だと思われる。&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
Publicで投稿するとタイトルを変更できない。Privateにしたらタイトルを変更可能になる。一時的にPrivateにしてPublicに戻すと良い。パーマリンクも同じまま。&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
==== Bulk ====&lt;br /&gt;
[https://www.reddit.com/r/redditisfun/comments/2otj8s/batch_download_images_on_a_imgur_gallery_page/ Batch download images on a imgur gallery page? : r/redditisfun]&lt;br /&gt;
&lt;br /&gt;
アルバム・1個の投稿に添付された画像を一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
クラシックモードに切り替えて、アルバムを表示すると、右側に [Download post] が表示される。これを選ぶとzip形式で一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
== Account ==&lt;br /&gt;
&lt;br /&gt;
=== Delete an Account ===&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26513357802651-Delete-an-Account Delete an Account – imgur]&lt;br /&gt;
&lt;br /&gt;
アカウントを削除すると、ユーザー名が解放されて他のユーザーも使用可能になる。&lt;br /&gt;
&lt;br /&gt;
[Settings]-[Delete my account] で完了。&lt;br /&gt;
&lt;br /&gt;
一度削除すると、同じメールアドレスは使えない？Twitter/XやGoogleアカウントでのログインはできなかった。Apple IDでのログインはできた。&lt;br /&gt;
&lt;br /&gt;
=== Ban ===&lt;br /&gt;
一般公開で画像を投稿すると、他のユーザーも簡単に見えるようになる。看板などであったとしても、電話番号などがあると、通報されてすぐにアカウント凍結される。&lt;br /&gt;
&lt;br /&gt;
凍結されると、新規投稿ができなくなる。&lt;br /&gt;
&lt;br /&gt;
Imgurの使い方としては、基本的に匿名・非公開で常に投稿して、アップローダーとして使うのがいい、人目につかないので、通報される心配も減る。&lt;br /&gt;
&lt;br /&gt;
Banされても全投稿削除して問い合わせに問い合わせてもだめ。アカウント削除して作り直すしかないと思われる。&lt;br /&gt;
&lt;br /&gt;
=== My page ===&lt;br /&gt;
アカウントを作ると、以下のマイページが付与される。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://imgur.com/user/&amp;lt;/nowiki&amp;gt;[username]&lt;br /&gt;
* https://[username].imgur.com&lt;br /&gt;
&lt;br /&gt;
1個目のサブディレクトリーが基本の模様。ただ、Web版からだと若干操作感、機能が違う。例えば、Banされたサブディレクトリーのほうだと、ページを開かないと削除ができず、ページにアクセスできないので削除できない。サブドメインだとページを直接開かなくても、メニューのサブ項目から削除できた。&lt;br /&gt;
&lt;br /&gt;
=== Old Design/Classic UI ===&lt;br /&gt;
Imgurは2024年くらいからUIがモダンになっている。が、モダンUIだと、パソコンからだとお気に入りや一括ダウンロードなど機能が限定される。&lt;br /&gt;
&lt;br /&gt;
昔のURL (https://&amp;amp;#x5B;username&amp;amp;#x5D;.imgur.com) にアクセスするほか、Old Design (クラシックUI) に切り替えることができる。&lt;br /&gt;
&lt;br /&gt;
# ログイン後右上の自分のアバターを選ぶ (https://imgur.com/user/&amp;amp;#x5B;username&amp;amp;#x5D;).&lt;br /&gt;
# 右下の [Use Old Design] を選ぶ。&lt;br /&gt;
&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=568</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=568"/>
		<updated>2025-04-26T13:40:13Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: 二重の誕生日&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
Nextcloudはコラボレーションツールだ。ownCloudのフォークとして始まった。元々は、Dropboxのようなオンラインストレージサービスだったが、データを元にしたコラボレーションツールとなっており、非常に多くの機能が提供されている。LAMP構成になっており、一般的なレンタルサーバーで動作する。集中的なサービスからの脱却が可能な非常に強力なFOSSとなっている。&lt;br /&gt;
&lt;br /&gt;
Apps (アプリ) という拡張機能で、ベースとなるオンラインストレージ以外の機能が提供されている。例えば、以下のような機能がある。&lt;br /&gt;
&lt;br /&gt;
* Contact: CardDAVによる連絡先管理 (Gmailの連絡帳の代替)。&lt;br /&gt;
* Calendar: CalDAVによる予定管理 (Google Calendarの代替)。&lt;br /&gt;
* Forms: アンケート (Google Formsの代替) ([https://web.gnusocial.jp/post/2023/10/06/8753/ Nextcloud Formsでのアンケートフォームの設置 | GNU social JP Web])。&lt;br /&gt;
* Registration: アカウント登録 ([https://web.gnusocial.jp/post/2023/10/01/8489/ ユーザー登録を実現するNextcloud Registration | GNU social JP Web])。&lt;br /&gt;
* Social: ActivityPubによる分散SNS。&lt;br /&gt;
* Talk: チャット・ビデオ会話 ([https://web.gnusocial.jp/post/2023/09/19/8323/ チャット・ビデオ会議アプリのNextcloud Talk | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/17/8313/ 設置: Nextcloud | ストレージ、メール、カレンダー、分散SNSなどデータ自己制御のための万能アプリ | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/18/8316/ 設置: Nextcloud appsのインストール方法 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== E-mail ===&lt;br /&gt;
[https://senooken.jp/post/2019/05/22/2125/ Nextcloud Contacts/CalendarとThunderbirdの同期 – senooken JP]&lt;br /&gt;
&lt;br /&gt;
[https://senooken.jp/post/category/document/e-mail/nextcloud-e-mail/ Nextcloud (E-mail) – senooken JP]&lt;br /&gt;
&lt;br /&gt;
==== 二重の誕生日 ====&lt;br /&gt;
[https://help.nextcloud.com/t/contacts-birthday-are-shown-double-in-calendar/3380/30 Contacts birthday are shown double in calendar - ℹ️ Support - Nextcloud community]&lt;br /&gt;
&lt;br /&gt;
以下のコマンドを実行したら解決するらしいが解決しなかった。&lt;br /&gt;
 php82cli ./occ dav:sync-birthday-calendar&lt;br /&gt;
&lt;br /&gt;
=== Error deleting file &amp;quot;filename&amp;quot;. ===&lt;br /&gt;
Ref: [https://solution.next-jp.net/2020/12/08/%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8C%E6%B6%88%E3%81%9B%E3%81%AA%E3%81%8F/ アップロードしたファイルやフォルダが消せなくなりましたが、どうしたら良いですか？ | Nextcloud by NEXTsystems]&lt;br /&gt;
&lt;br /&gt;
Nextcloudでファイルを削除しようとすると、[Error deleting file &amp;quot;filename&amp;quot;.] のようなトーストが表示されて削除に失敗することがある。&lt;br /&gt;
&lt;br /&gt;
[ oc_files_locks ] テーブルにロック中のファイルが記載されている。タイミングなど、何らかの理由でロック中になってしまっていると思われる。このテーブルのレコードを削除すると、ロックが解除された削除可能になる。&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
[https://web.gnusocial.jp/post/2024/02/11/10097/ 設置: Nextcloudのバックアップ | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
「[https://docs.nextcloud.com/server/20/admin&amp;amp;#x20;manual/maintenance/backup.html Backup — Nextcloud latest Administration Manual latest documentation]」が公式情報です。&lt;br /&gt;
&lt;br /&gt;
Nextcloudのバックアップでは、以下の4点が必要です。&lt;br /&gt;
&lt;br /&gt;
# データベース&lt;br /&gt;
# configディレクトリー&lt;br /&gt;
# dataディレクトリー&lt;br /&gt;
# themeディレクトリー&lt;br /&gt;
&lt;br /&gt;
バックアップに先立って、Nextcloudを保守モードにします。&lt;br /&gt;
&lt;br /&gt;
maintenance:modeコマンドはデータの一貫性の維持のため、ログインユーザーのセッションをロックし、新規ログインを防ぎます。以下のコマンドで実行できます。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --on&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンドを実行する代わりに、config/config.phpを編集しても実現できます。&amp;lt;code&amp;gt;&amp;quot;maitenance&amp;quot; =&amp;gt; false&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;に変更すればOKです。&lt;br /&gt;
 &amp;lt;&amp;lt;?php&lt;br /&gt;
 &lt;br /&gt;
  &amp;quot;maintenance&amp;quot; =&amp;gt; true,&lt;br /&gt;
バックアップが完了したら、falseに戻します。コマンドの場合–offを実行します。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --off&amp;lt;/code&amp;gt;&lt;br /&gt;
ディレクトリーのバックアップは、丸ごとのほかに、config, data, themeディレクトリーを単に他のディレクトリーにコピーするだけでいいです。&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx nextcloud/ nextcloud-dirbkp_`date +&amp;quot;%Y%m%d&amp;quot;`/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;TARGET=nextcloud&lt;br /&gt;
 BACKUP=$TARGET-backup-`date +&amp;quot;%Y%m%d&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx $TARGET/config $TARGET/data $TARGET/themes $BACKUP&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンド実行前に-nでコピー対象を確認しておくと、より安全です。ストレージ容量が無駄になるので、config/data/themesだけで十分だと思います。&lt;br /&gt;
&lt;br /&gt;
何かあったときのために、更新が終わってもしばらくバックアップは残しておいてもよいかもしれません。&lt;br /&gt;
&lt;br /&gt;
==== Cleanup ====&lt;br /&gt;
バックアップ時に、不要ファイルがあるので、削除しておくと良い。&lt;br /&gt;
&lt;br /&gt;
https://chatgpt.com/share/680c85a3-04e4-800b-a27e-2ccfa5f0340a&lt;br /&gt;
&lt;br /&gt;
files_trashbin/=ユーザーのゴミ箱。&lt;br /&gt;
 sudo -u www-data php occ trashbin:cleanup&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=567</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=567"/>
		<updated>2025-04-26T13:13:05Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Other E-mail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
Nextcloudはコラボレーションツールだ。ownCloudのフォークとして始まった。元々は、Dropboxのようなオンラインストレージサービスだったが、データを元にしたコラボレーションツールとなっており、非常に多くの機能が提供されている。LAMP構成になっており、一般的なレンタルサーバーで動作する。集中的なサービスからの脱却が可能な非常に強力なFOSSとなっている。&lt;br /&gt;
&lt;br /&gt;
Apps (アプリ) という拡張機能で、ベースとなるオンラインストレージ以外の機能が提供されている。例えば、以下のような機能がある。&lt;br /&gt;
&lt;br /&gt;
* Contact: CardDAVによる連絡先管理 (Gmailの連絡帳の代替)。&lt;br /&gt;
* Calendar: CalDAVによる予定管理 (Google Calendarの代替)。&lt;br /&gt;
* Forms: アンケート (Google Formsの代替) ([https://web.gnusocial.jp/post/2023/10/06/8753/ Nextcloud Formsでのアンケートフォームの設置 | GNU social JP Web])。&lt;br /&gt;
* Registration: アカウント登録 ([https://web.gnusocial.jp/post/2023/10/01/8489/ ユーザー登録を実現するNextcloud Registration | GNU social JP Web])。&lt;br /&gt;
* Social: ActivityPubによる分散SNS。&lt;br /&gt;
* Talk: チャット・ビデオ会話 ([https://web.gnusocial.jp/post/2023/09/19/8323/ チャット・ビデオ会議アプリのNextcloud Talk | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/17/8313/ 設置: Nextcloud | ストレージ、メール、カレンダー、分散SNSなどデータ自己制御のための万能アプリ | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/18/8316/ 設置: Nextcloud appsのインストール方法 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== E-mail ===&lt;br /&gt;
[https://senooken.jp/post/2019/05/22/2125/ Nextcloud Contacts/CalendarとThunderbirdの同期 – senooken JP]&lt;br /&gt;
&lt;br /&gt;
[https://senooken.jp/post/category/document/e-mail/nextcloud-e-mail/ Nextcloud (E-mail) – senooken JP]&lt;br /&gt;
&lt;br /&gt;
=== Error deleting file &amp;quot;filename&amp;quot;. ===&lt;br /&gt;
Ref: [https://solution.next-jp.net/2020/12/08/%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8C%E6%B6%88%E3%81%9B%E3%81%AA%E3%81%8F/ アップロードしたファイルやフォルダが消せなくなりましたが、どうしたら良いですか？ | Nextcloud by NEXTsystems]&lt;br /&gt;
&lt;br /&gt;
Nextcloudでファイルを削除しようとすると、[Error deleting file &amp;quot;filename&amp;quot;.] のようなトーストが表示されて削除に失敗することがある。&lt;br /&gt;
&lt;br /&gt;
[ oc_files_locks ] テーブルにロック中のファイルが記載されている。タイミングなど、何らかの理由でロック中になってしまっていると思われる。このテーブルのレコードを削除すると、ロックが解除された削除可能になる。&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
[https://web.gnusocial.jp/post/2024/02/11/10097/ 設置: Nextcloudのバックアップ | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
「[https://docs.nextcloud.com/server/20/admin&amp;amp;#x20;manual/maintenance/backup.html Backup — Nextcloud latest Administration Manual latest documentation]」が公式情報です。&lt;br /&gt;
&lt;br /&gt;
Nextcloudのバックアップでは、以下の4点が必要です。&lt;br /&gt;
&lt;br /&gt;
# データベース&lt;br /&gt;
# configディレクトリー&lt;br /&gt;
# dataディレクトリー&lt;br /&gt;
# themeディレクトリー&lt;br /&gt;
&lt;br /&gt;
バックアップに先立って、Nextcloudを保守モードにします。&lt;br /&gt;
&lt;br /&gt;
maintenance:modeコマンドはデータの一貫性の維持のため、ログインユーザーのセッションをロックし、新規ログインを防ぎます。以下のコマンドで実行できます。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --on&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンドを実行する代わりに、config/config.phpを編集しても実現できます。&amp;lt;code&amp;gt;&amp;quot;maitenance&amp;quot; =&amp;gt; false&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;に変更すればOKです。&lt;br /&gt;
 &amp;lt;&amp;lt;?php&lt;br /&gt;
 &lt;br /&gt;
  &amp;quot;maintenance&amp;quot; =&amp;gt; true,&lt;br /&gt;
バックアップが完了したら、falseに戻します。コマンドの場合–offを実行します。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --off&amp;lt;/code&amp;gt;&lt;br /&gt;
ディレクトリーのバックアップは、丸ごとのほかに、config, data, themeディレクトリーを単に他のディレクトリーにコピーするだけでいいです。&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx nextcloud/ nextcloud-dirbkp_`date +&amp;quot;%Y%m%d&amp;quot;`/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;TARGET=nextcloud&lt;br /&gt;
 BACKUP=$TARGET-backup-`date +&amp;quot;%Y%m%d&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx $TARGET/config $TARGET/data $TARGET/themes $BACKUP&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンド実行前に-nでコピー対象を確認しておくと、より安全です。ストレージ容量が無駄になるので、config/data/themesだけで十分だと思います。&lt;br /&gt;
&lt;br /&gt;
何かあったときのために、更新が終わってもしばらくバックアップは残しておいてもよいかもしれません。&lt;br /&gt;
&lt;br /&gt;
==== Cleanup ====&lt;br /&gt;
バックアップ時に、不要ファイルがあるので、削除しておくと良い。&lt;br /&gt;
&lt;br /&gt;
https://chatgpt.com/share/680c85a3-04e4-800b-a27e-2ccfa5f0340a&lt;br /&gt;
&lt;br /&gt;
files_trashbin/=ユーザーのゴミ箱。&lt;br /&gt;
 sudo -u www-data php occ trashbin:cleanup&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=566</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=566"/>
		<updated>2025-04-26T07:06:01Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
Nextcloudはコラボレーションツールだ。ownCloudのフォークとして始まった。元々は、Dropboxのようなオンラインストレージサービスだったが、データを元にしたコラボレーションツールとなっており、非常に多くの機能が提供されている。LAMP構成になっており、一般的なレンタルサーバーで動作する。集中的なサービスからの脱却が可能な非常に強力なFOSSとなっている。&lt;br /&gt;
&lt;br /&gt;
Apps (アプリ) という拡張機能で、ベースとなるオンラインストレージ以外の機能が提供されている。例えば、以下のような機能がある。&lt;br /&gt;
&lt;br /&gt;
* Contact: CardDAVによる連絡先管理 (Gmailの連絡帳の代替)。&lt;br /&gt;
* Calendar: CalDAVによる予定管理 (Google Calendarの代替)。&lt;br /&gt;
* Forms: アンケート (Google Formsの代替) ([https://web.gnusocial.jp/post/2023/10/06/8753/ Nextcloud Formsでのアンケートフォームの設置 | GNU social JP Web])。&lt;br /&gt;
* Registration: アカウント登録 ([https://web.gnusocial.jp/post/2023/10/01/8489/ ユーザー登録を実現するNextcloud Registration | GNU social JP Web])。&lt;br /&gt;
* Social: ActivityPubによる分散SNS。&lt;br /&gt;
* Talk: チャット・ビデオ会話 ([https://web.gnusocial.jp/post/2023/09/19/8323/ チャット・ビデオ会議アプリのNextcloud Talk | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/17/8313/ 設置: Nextcloud | ストレージ、メール、カレンダー、分散SNSなどデータ自己制御のための万能アプリ | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/18/8316/ 設置: Nextcloud appsのインストール方法 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Error deleting file &amp;quot;filename&amp;quot;. ===&lt;br /&gt;
Ref: [https://solution.next-jp.net/2020/12/08/%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8C%E6%B6%88%E3%81%9B%E3%81%AA%E3%81%8F/ アップロードしたファイルやフォルダが消せなくなりましたが、どうしたら良いですか？ | Nextcloud by NEXTsystems]&lt;br /&gt;
&lt;br /&gt;
Nextcloudでファイルを削除しようとすると、[Error deleting file &amp;quot;filename&amp;quot;.] のようなトーストが表示されて削除に失敗することがある。&lt;br /&gt;
&lt;br /&gt;
[ oc_files_locks ] テーブルにロック中のファイルが記載されている。タイミングなど、何らかの理由でロック中になってしまっていると思われる。このテーブルのレコードを削除すると、ロックが解除された削除可能になる。&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
[https://web.gnusocial.jp/post/2024/02/11/10097/ 設置: Nextcloudのバックアップ | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
「[https://docs.nextcloud.com/server/20/admin&amp;amp;#x20;manual/maintenance/backup.html Backup — Nextcloud latest Administration Manual latest documentation]」が公式情報です。&lt;br /&gt;
&lt;br /&gt;
Nextcloudのバックアップでは、以下の4点が必要です。&lt;br /&gt;
&lt;br /&gt;
# データベース&lt;br /&gt;
# configディレクトリー&lt;br /&gt;
# dataディレクトリー&lt;br /&gt;
# themeディレクトリー&lt;br /&gt;
&lt;br /&gt;
バックアップに先立って、Nextcloudを保守モードにします。&lt;br /&gt;
&lt;br /&gt;
maintenance:modeコマンドはデータの一貫性の維持のため、ログインユーザーのセッションをロックし、新規ログインを防ぎます。以下のコマンドで実行できます。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --on&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンドを実行する代わりに、config/config.phpを編集しても実現できます。&amp;lt;code&amp;gt;&amp;quot;maitenance&amp;quot; =&amp;gt; false&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;に変更すればOKです。&lt;br /&gt;
 &amp;lt;&amp;lt;?php&lt;br /&gt;
 &lt;br /&gt;
  &amp;quot;maintenance&amp;quot; =&amp;gt; true,&amp;lt;/code&amp;gt;&lt;br /&gt;
バックアップが完了したら、falseに戻します。コマンドの場合–offを実行します。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --off&amp;lt;/code&amp;gt;&lt;br /&gt;
ディレクトリーのバックアップは、丸ごとのほかに、config, data, themeディレクトリーを単に他のディレクトリーにコピーするだけでいいです。&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx nextcloud/ nextcloud-dirbkp_`date +&amp;quot;%Y%m%d&amp;quot;`/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;TARGET=nextcloud&lt;br /&gt;
 BACKUP=$TARGET-backup-`date +&amp;quot;%Y%m%d&amp;quot;`&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx $TARGET/config $TARGET/data $TARGET/themes $BACKUP&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンド実行前に-nでコピー対象を確認しておくと、より安全です。ストレージ容量が無駄になるので、config/data/themesだけで十分だと思います。&lt;br /&gt;
&lt;br /&gt;
何かあったときのために、更新が終わってもしばらくバックアップは残しておいてもよいかもしれません。&lt;br /&gt;
&lt;br /&gt;
==== Cleanup ====&lt;br /&gt;
バックアップ時に、不要ファイルがあるので、削除しておくと良い。&lt;br /&gt;
&lt;br /&gt;
https://chatgpt.com/share/680c85a3-04e4-800b-a27e-2ccfa5f0340a&lt;br /&gt;
&lt;br /&gt;
files_trashbin/=ユーザーのゴミ箱。&lt;br /&gt;
 sudo -u www-data php occ trashbin:cleanup&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=565</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Nextcloud&amp;diff=565"/>
		<updated>2025-04-26T06:50:59Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Backup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
Nextcloudはコラボレーションツールだ。ownCloudのフォークとして始まった。元々は、Dropboxのようなオンラインストレージサービスだったが、データを元にしたコラボレーションツールとなっており、非常に多くの機能が提供されている。LAMP構成になっており、一般的なレンタルサーバーで動作する。集中的なサービスからの脱却が可能な非常に強力なFOSSとなっている。&lt;br /&gt;
&lt;br /&gt;
Apps (アプリ) という拡張機能で、ベースとなるオンラインストレージ以外の機能が提供されている。例えば、以下のような機能がある。&lt;br /&gt;
&lt;br /&gt;
* Contact: CardDAVによる連絡先管理 (Gmailの連絡帳の代替)。&lt;br /&gt;
* Calendar: CalDAVによる予定管理 (Google Calendarの代替)。&lt;br /&gt;
* Forms: アンケート (Google Formsの代替) ([https://web.gnusocial.jp/post/2023/10/06/8753/ Nextcloud Formsでのアンケートフォームの設置 | GNU social JP Web])。&lt;br /&gt;
* Registration: アカウント登録 ([https://web.gnusocial.jp/post/2023/10/01/8489/ ユーザー登録を実現するNextcloud Registration | GNU social JP Web])。&lt;br /&gt;
* Social: ActivityPubによる分散SNS。&lt;br /&gt;
* Talk: チャット・ビデオ会話 ([https://web.gnusocial.jp/post/2023/09/19/8323/ チャット・ビデオ会議アプリのNextcloud Talk | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/17/8313/ 設置: Nextcloud | ストレージ、メール、カレンダー、分散SNSなどデータ自己制御のための万能アプリ | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/09/18/8316/ 設置: Nextcloud appsのインストール方法 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Error deleting file &amp;quot;filename&amp;quot;. ===&lt;br /&gt;
Ref: [https://solution.next-jp.net/2020/12/08/%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8C%E6%B6%88%E3%81%9B%E3%81%AA%E3%81%8F/ アップロードしたファイルやフォルダが消せなくなりましたが、どうしたら良いですか？ | Nextcloud by NEXTsystems]&lt;br /&gt;
&lt;br /&gt;
Nextcloudでファイルを削除しようとすると、[Error deleting file &amp;quot;filename&amp;quot;.] のようなトーストが表示されて削除に失敗することがある。&lt;br /&gt;
&lt;br /&gt;
[ oc_files_locks ] テーブルにロック中のファイルが記載されている。タイミングなど、何らかの理由でロック中になってしまっていると思われる。このテーブルのレコードを削除すると、ロックが解除された削除可能になる。&lt;br /&gt;
&lt;br /&gt;
=== Backup ===&lt;br /&gt;
[https://web.gnusocial.jp/post/2024/02/11/10097/ 設置: Nextcloudのバックアップ | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
「[https://docs.nextcloud.com/server/20/admin&amp;amp;#x20;manual/maintenance/backup.html Backup — Nextcloud latest Administration Manual latest documentation]」が公式情報です。&lt;br /&gt;
&lt;br /&gt;
Nextcloudのバックアップでは、以下の4点が必要です。&lt;br /&gt;
&lt;br /&gt;
# データベース&lt;br /&gt;
# configディレクトリー&lt;br /&gt;
# dataディレクトリー&lt;br /&gt;
# themeディレクトリー&lt;br /&gt;
&lt;br /&gt;
バックアップに先立って、Nextcloudを保守モードにします。&lt;br /&gt;
&lt;br /&gt;
maintenance:modeコマンドはデータの一貫性の維持のため、ログインユーザーのセッションをロックし、新規ログインを防ぎます。以下のコマンドで実行できます。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --on&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンドを実行する代わりに、config/config.phpを編集しても実現できます。&amp;lt;code&amp;gt;&amp;quot;maitenance&amp;quot; =&amp;gt; false&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;に変更すればOKです。&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;lt;?php&lt;br /&gt;
 &lt;br /&gt;
  &amp;quot;maintenance&amp;quot; =&amp;gt; true,&amp;lt;/code&amp;gt;&lt;br /&gt;
バックアップが完了したら、falseに戻します。コマンドの場合–offを実行します。&lt;br /&gt;
 &amp;lt;code&amp;gt;php occ maintenance:mode --off&amp;lt;/code&amp;gt;&lt;br /&gt;
ディレクトリーのバックアップは、丸ごとのほかに、config, data, themeディレクトリーを単に他のディレクトリーにコピーするだけでいいです。&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx nextcloud/ nextcloud-dirbkp_`date +&amp;quot;%Y%m%d&amp;quot;`/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;TARGET=nextcloud&lt;br /&gt;
 BACKUP=$TARGET-backup-`date +&amp;quot;%Y%m%d&amp;quot;`&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;rsync -Aavx $TARGET/config $TARGET/data $TARGET/themes $BACKUP&amp;lt;/code&amp;gt;&lt;br /&gt;
コマンド実行前に-nでコピー対象を確認しておくと、より安全です。ストレージ容量が無駄になるので、config/data/themesだけで十分だと思います。&lt;br /&gt;
&lt;br /&gt;
何かあったときのために、更新が終わってもしばらくバックアップは残しておいてもよいかもしれません。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Function&amp;diff=564</id>
		<title>Function</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Function&amp;diff=564"/>
		<updated>2025-04-18T02:56:56Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Mute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SNSの機能全般についてメモする。&lt;br /&gt;
&lt;br /&gt;
== Ranking ==&lt;br /&gt;
出典: [https://www.youtube.com/watch?v=PublZJzicvM ランキングの功罪 【ゲーム性】 - YouTube]。&lt;br /&gt;
&lt;br /&gt;
フォロワー数のような、影響力を数字で見せつけられる数字をうまく取り扱えると良いかもしれない。&lt;br /&gt;
&lt;br /&gt;
実績とかは、似たような別の数字。&lt;br /&gt;
&lt;br /&gt;
例えば、フォロイー数、フォロワー数を隠した、独自の計算により算出したレベルとか。単に非表示にするだけでも悪くはない (例: [https://web.gnusocial.jp/post/2023/06/28/7358/ 機能: Fedibirdでのフォロー情報の自分への非表示設定 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
== Mute ==&lt;br /&gt;
[https://digital-marketing.jp/sns-marketing/how-to-use-instagrams-mute-function/ インスタのミュート機能のやり方を解説！相手にバレる？解除する方法は？｜Webマーケティング・SEO相談はデジ研]&lt;br /&gt;
&lt;br /&gt;
* ミュート: ユーザー単位。&lt;br /&gt;
* 非表示: 投稿単位。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social&amp;diff=563</id>
		<title>GNU social</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social&amp;diff=563"/>
		<updated>2025-04-04T10:10:28Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Business&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Repository ==&lt;br /&gt;
いくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://savannah.gnu.org/projects/social GNU social - Summary [Savannah]]: 2009-08-17登録。2016年で更新停止。Mastodonブーム到来直前までのメインリポジトリーだった模様。&lt;br /&gt;
&lt;br /&gt;
== Manual ==&lt;br /&gt;
いくつかGNU socialのマニュアル的な文書がある。&lt;br /&gt;
&lt;br /&gt;
* [https://thomask.sdf.org/social/en/ The Unofficial GNU Social documentation! — The Unofficial GNU Social Manuals 0.1.2 documentation] (https://gnusocial.jp/notice/7663849)&lt;br /&gt;
* [https://gnusocial.jp/doc/faq Faq - GNU social JP] (https://gnusocial.jp/notice/7663770)&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
[https://web.gnusocial.jp/post/2024/10/31/10862/ GNU socialの老舗サーバーgnusocial.netの2024-12-31での閉鎖予告 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Tool ==&lt;br /&gt;
外部ツールがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/benediktg/gnu-social-export GitHub - benediktg/gnu-social-export: Export list of followed accounts from GNU social to import it at Mastodon]: GNU socialのフォローリストをエクスポートする。&lt;br /&gt;
* [https://savannah.nongnu.org/projects/gnu-social-mode GNU Social mode for Emacs - Summary [Savannah]]: GNU socialのEmacsクライアント？&lt;br /&gt;
&lt;br /&gt;
=== Linkage ===&lt;br /&gt;
&lt;br /&gt;
* [https://elbinario.net/2015/02/11/gnusrss-publicando-feeds-en-gnu-social/ gnusrss – Publicando feeds en GNU Social – Elbinario]: RSSをGNU socialに自動投稿するPythonプログラム。&lt;br /&gt;
* [https://elbinario.net/2015/04/22/wp-gnu-social-descentralizando-los-comentarios/ WP-GNU social: Descentralizando los comentarios – Elbinario]: WordPressの投稿をGNU socialでも投稿し、それへの返信をWordPressにも反映する。&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
GNU socialのWeb APIについては，フッターの [Help](doc/help), [About](doc/about), [TOS](doc/tos) などを選択して遷移できるDOCS画面の [API](doc/api) ([https://gnusocial.jp/doc/api Api - GNU social JP]) を選択することで表示できる。&lt;br /&gt;
&lt;br /&gt;
ソースコード上はdoc-src ([https://notabug.org/gnusocialjp/gnusocial/src/v2.0.2/doc-src v2.0.2 - NotABug.org: Free code hosting]) 配下にAPI文書が格納されている。&lt;br /&gt;
&lt;br /&gt;
AtomPubとTwitter互換APIの2種類のAPIを利用可能。Twitter APIのほうがシンプルだが、AtomPubだとリッチテキストが使用可能など、機能に若干の違いがある。&lt;br /&gt;
&lt;br /&gt;
以下の記事も参考になる。&lt;br /&gt;
&lt;br /&gt;
* [https://web.archive.org/web/20160506230737/http://www.ibm.com/developerworks/jp/xml/library/x-identicaphp/index.html Identi.ca で PHP を使用する: 第 1 回]&lt;br /&gt;
* [https://web.archive.org/web/20160506180924/http://www.ibm.com/developerworks/jp/xml/library/x-identicaphp2/index.html Identi.ca で PHP を使用する: 第 2 回]&lt;br /&gt;
* [https://web.archive.org/web/20180228032115/https://hakabahitoyo.wordpress.com/2017/01/08/gscxxbot/ GNU Social のボットを C++ で作る – 墓場人夜]&lt;br /&gt;
API末尾の拡張子atom/xml/jsonに応じた形式の応答をサーバーが返す模様。&lt;br /&gt;
&lt;br /&gt;
=== Twitter API ===&lt;br /&gt;
&lt;br /&gt;
* [https://web.archive.org/web/20170218060634/http://skilledtests.com/wiki/Twitter-compatible_API Twitter-compatible API - I ask questions]: QvitterのREADMEに記載のあったTwitter互換APIの説明文書。&lt;br /&gt;
* [https://developer.twitter.com/en/docs/twitter-api/v1 Standard v1.1 | Docs | Twitter Developer Platform]: X/Twitterの公式文書。&lt;br /&gt;
&lt;br /&gt;
GNU socialのTwitter APIは完全互換ではないので注意が必要。&lt;br /&gt;
&lt;br /&gt;
===Post===&lt;br /&gt;
 wget -O - \&lt;br /&gt;
     --http-user=vaginaplant \&lt;br /&gt;
     --http-passwd=XXXXXX \&lt;br /&gt;
     --post-data='status=LGBTPZN' \&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;https://freezepeach.xyz/api/statuses/update.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 curl -u username:password -d &amp;quot;status=status&amp;quot; &amp;lt;nowiki&amp;gt;https://domain/api/statuses/update.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
添付ファイルの例。&lt;br /&gt;
 curl -u username:password \&lt;br /&gt;
   -F &amp;quot;media=@image.jpg&amp;quot; \&lt;br /&gt;
   -F &amp;quot;status=post message&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;https://domain.jp/api/statuses/update.json&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
返信する場合、リクエストボディーにin_reply_to_status_idで返信先投稿IDを指定する。Twitter APIだと、本文に@メンションが必須だが、GSの場合、メンションは任意の模様。ただ、他の実装だと必須のものもあったりする。あるほうが安定するかもしれない。&lt;br /&gt;
&lt;br /&gt;
===Get===&lt;br /&gt;
&lt;br /&gt;
JSONの配列で応答が返ってくる。&lt;br /&gt;
  curl $HOST/api/statuses/user_timeline/test.json&lt;br /&gt;
&lt;br /&gt;
  [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;QSettings&amp;quot;,&lt;br /&gt;
      &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
      &amp;quot;created_at&amp;quot;: &amp;quot;Thu Jan 04 11:51:11 +0900 2024&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_status_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;uri&amp;quot;: &amp;quot;tag:gnusocial.jp,2024-01-04:noticeId=5026657:objectType=note&amp;quot;,&lt;br /&gt;
      &amp;quot;source&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
      &amp;quot;source_link&amp;quot;: null,&lt;br /&gt;
      &amp;quot;id&amp;quot;: 5026657,&lt;br /&gt;
      &amp;quot;in_reply_to_user_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_screen_name&amp;quot;: null,&lt;br /&gt;
      &amp;quot;geo&amp;quot;: null,&lt;br /&gt;
      &amp;quot;user&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;screen_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;location&amp;quot;: &amp;quot;Japan&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;gnusocial.jpのテストアカウントです。\r\nID/PW=test/666666。\r\n投稿にはメール登録が必要です。基本は閲覧用です。&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_https&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_profile_size&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_original&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;groups_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;linkcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;backgroundcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;https://example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;protected&amp;quot;: false,&lt;br /&gt;
        &amp;quot;followers_count&amp;quot;: 15,&lt;br /&gt;
        &amp;quot;friends_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;created_at&amp;quot;: &amp;quot;Mon Jul 18 13:10:39 +0900 2022&amp;quot;,&lt;br /&gt;
        &amp;quot;utc_offset&amp;quot;: &amp;quot;32400&amp;quot;,&lt;br /&gt;
        &amp;quot;time_zone&amp;quot;: &amp;quot;Asia/Tokyo&amp;quot;,&lt;br /&gt;
        &amp;quot;statuses_count&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;following&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_blocking&amp;quot;: false,&lt;br /&gt;
        &amp;quot;notifications&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_profile_url&amp;quot;: &amp;quot;https://gnusocial.jp/test&amp;quot;,&lt;br /&gt;
        &amp;quot;cover_photo&amp;quot;: false,&lt;br /&gt;
        &amp;quot;background_image&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_link_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_background_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_banner_url&amp;quot;: false,&lt;br /&gt;
        &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
        &amp;quot;is_silenced&amp;quot;: false,&lt;br /&gt;
        &amp;quot;rights&amp;quot;: {&lt;br /&gt;
          &amp;quot;delete_user&amp;quot;: false,&lt;br /&gt;
          &amp;quot;delete_others_notice&amp;quot;: false,&lt;br /&gt;
          &amp;quot;silence&amp;quot;: false,&lt;br /&gt;
          &amp;quot;sandbox&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;is_sandboxed&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ostatus_uri&amp;quot;: &amp;quot;https://gnusocial.jp/index.php/user/2&amp;quot;,&lt;br /&gt;
        &amp;quot;favourites_count&amp;quot;: 0&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;statusnet_html&amp;quot;: &amp;quot;QSettings&amp;quot;,&lt;br /&gt;
      &amp;quot;statusnet_conversation_id&amp;quot;: 2539347,&lt;br /&gt;
      &amp;quot;statusnet_in_groups&amp;quot;: false,&lt;br /&gt;
      &amp;quot;external_url&amp;quot;: &amp;quot;https://gnusocial.jp/notice/5026657&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_profileurl&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_ostatus_uri&amp;quot;: null,&lt;br /&gt;
      &amp;quot;attentions&amp;quot;: [],&lt;br /&gt;
      &amp;quot;fave_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;repeat_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;is_post_verb&amp;quot;: true,&lt;br /&gt;
      &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
      &amp;quot;favorited&amp;quot;: false,&lt;br /&gt;
      &amp;quot;repeated&amp;quot;: false&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;test 2&amp;quot;,&lt;br /&gt;
      &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
      &amp;quot;created_at&amp;quot;: &amp;quot;Thu Jan 04 10:41:35 +0900 2024&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_status_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;uri&amp;quot;: &amp;quot;tag:gnusocial.jp,2024-01-04:noticeId=5026119:objectType=note&amp;quot;,&lt;br /&gt;
      &amp;quot;source&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
      &amp;quot;source_link&amp;quot;: null,&lt;br /&gt;
      &amp;quot;id&amp;quot;: 5026119,&lt;br /&gt;
      &amp;quot;in_reply_to_user_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_screen_name&amp;quot;: null,&lt;br /&gt;
      &amp;quot;geo&amp;quot;: null,&lt;br /&gt;
      &amp;quot;user&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;screen_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;location&amp;quot;: &amp;quot;Japan&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;gnusocial.jpのテストアカウントです。\r\nID/PW=test/666666。\r\n投稿にはメール登録が必要です。基本は閲覧用です。&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_https&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_profile_size&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_original&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;groups_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;linkcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;backgroundcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;https://example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;protected&amp;quot;: false,&lt;br /&gt;
        &amp;quot;followers_count&amp;quot;: 15,&lt;br /&gt;
        &amp;quot;friends_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;created_at&amp;quot;: &amp;quot;Mon Jul 18 13:10:39 +0900 2022&amp;quot;,&lt;br /&gt;
        &amp;quot;utc_offset&amp;quot;: &amp;quot;32400&amp;quot;,&lt;br /&gt;
        &amp;quot;time_zone&amp;quot;: &amp;quot;Asia/Tokyo&amp;quot;,&lt;br /&gt;
        &amp;quot;statuses_count&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;following&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_blocking&amp;quot;: false,&lt;br /&gt;
        &amp;quot;notifications&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_profile_url&amp;quot;: &amp;quot;https://gnusocial.jp/test&amp;quot;,&lt;br /&gt;
        &amp;quot;cover_photo&amp;quot;: false,&lt;br /&gt;
        &amp;quot;background_image&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_link_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_background_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_banner_url&amp;quot;: false,&lt;br /&gt;
        &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
        &amp;quot;is_silenced&amp;quot;: false,&lt;br /&gt;
        &amp;quot;rights&amp;quot;: {&lt;br /&gt;
          &amp;quot;delete_user&amp;quot;: false,&lt;br /&gt;
          &amp;quot;delete_others_notice&amp;quot;: false,&lt;br /&gt;
          &amp;quot;silence&amp;quot;: false,&lt;br /&gt;
          &amp;quot;sandbox&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;is_sandboxed&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ostatus_uri&amp;quot;: &amp;quot;https://gnusocial.jp/index.php/user/2&amp;quot;,&lt;br /&gt;
        &amp;quot;favourites_count&amp;quot;: 0&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;statusnet_html&amp;quot;: &amp;quot;test 2&amp;quot;,&lt;br /&gt;
      &amp;quot;statusnet_conversation_id&amp;quot;: 2539084,&lt;br /&gt;
      &amp;quot;statusnet_in_groups&amp;quot;: false,&lt;br /&gt;
      &amp;quot;external_url&amp;quot;: &amp;quot;https://gnusocial.jp/notice/5026119&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_profileurl&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_ostatus_uri&amp;quot;: null,&lt;br /&gt;
      &amp;quot;attentions&amp;quot;: [],&lt;br /&gt;
      &amp;quot;fave_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;repeat_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;is_post_verb&amp;quot;: true,&lt;br /&gt;
      &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
      &amp;quot;favorited&amp;quot;: false,&lt;br /&gt;
      &amp;quot;repeated&amp;quot;: false&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;test (https://gnusocial.jp/test) started following めうるみ (とけた) (https://mewl.me/@mewl).&amp;quot;,&lt;br /&gt;
      &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
      &amp;quot;created_at&amp;quot;: &amp;quot;Thu Sep 08 08:32:22 +0900 2022&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_status_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;uri&amp;quot;: &amp;quot;tag:gnusocial.jp,2022-09-07:subscription:2:person:9308:2022-09-08T08:32:22+09:00&amp;quot;,&lt;br /&gt;
      &amp;quot;source&amp;quot;: &amp;quot;activity&amp;quot;,&lt;br /&gt;
      &amp;quot;source_link&amp;quot;: null,&lt;br /&gt;
      &amp;quot;id&amp;quot;: 274143,&lt;br /&gt;
      &amp;quot;in_reply_to_user_id&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_screen_name&amp;quot;: null,&lt;br /&gt;
      &amp;quot;geo&amp;quot;: null,&lt;br /&gt;
      &amp;quot;user&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;screen_name&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
        &amp;quot;location&amp;quot;: &amp;quot;Japan&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;gnusocial.jpのテストアカウントです。\r\nID/PW=test/666666。\r\n投稿にはメール登録が必要です。基本は閲覧用です。&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_https&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-stream.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_profile_size&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;profile_image_url_original&amp;quot;: &amp;quot;https://gnusocial.jp/theme/gnusocialjp/default-avatar-profile.png&amp;quot;,&lt;br /&gt;
        &amp;quot;groups_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;linkcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;backgroundcolor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;https://example.com&amp;quot;,&lt;br /&gt;
        &amp;quot;protected&amp;quot;: false,&lt;br /&gt;
        &amp;quot;followers_count&amp;quot;: 15,&lt;br /&gt;
        &amp;quot;friends_count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;created_at&amp;quot;: &amp;quot;Mon Jul 18 13:10:39 +0900 2022&amp;quot;,&lt;br /&gt;
        &amp;quot;utc_offset&amp;quot;: &amp;quot;32400&amp;quot;,&lt;br /&gt;
        &amp;quot;time_zone&amp;quot;: &amp;quot;Asia/Tokyo&amp;quot;,&lt;br /&gt;
        &amp;quot;statuses_count&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;following&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_blocking&amp;quot;: false,&lt;br /&gt;
        &amp;quot;notifications&amp;quot;: false,&lt;br /&gt;
        &amp;quot;statusnet_profile_url&amp;quot;: &amp;quot;https://gnusocial.jp/test&amp;quot;,&lt;br /&gt;
        &amp;quot;cover_photo&amp;quot;: false,&lt;br /&gt;
        &amp;quot;background_image&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_link_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_background_color&amp;quot;: false,&lt;br /&gt;
        &amp;quot;profile_banner_url&amp;quot;: false,&lt;br /&gt;
        &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
        &amp;quot;is_silenced&amp;quot;: false,&lt;br /&gt;
        &amp;quot;rights&amp;quot;: {&lt;br /&gt;
          &amp;quot;delete_user&amp;quot;: false,&lt;br /&gt;
          &amp;quot;delete_others_notice&amp;quot;: false,&lt;br /&gt;
          &amp;quot;silence&amp;quot;: false,&lt;br /&gt;
          &amp;quot;sandbox&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;is_sandboxed&amp;quot;: false,&lt;br /&gt;
        &amp;quot;ostatus_uri&amp;quot;: &amp;quot;https://gnusocial.jp/index.php/user/2&amp;quot;,&lt;br /&gt;
        &amp;quot;favourites_count&amp;quot;: 0&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;statusnet_html&amp;quot;: &amp;quot;test started following めうるみ (とけた).&amp;quot;,&lt;br /&gt;
      &amp;quot;statusnet_conversation_id&amp;quot;: 154562,&lt;br /&gt;
      &amp;quot;statusnet_in_groups&amp;quot;: false,&lt;br /&gt;
      &amp;quot;external_url&amp;quot;: &amp;quot;https://gnusocial.jp/notice/274143&amp;quot;,&lt;br /&gt;
      &amp;quot;in_reply_to_profileurl&amp;quot;: null,&lt;br /&gt;
      &amp;quot;in_reply_to_ostatus_uri&amp;quot;: null,&lt;br /&gt;
      &amp;quot;attentions&amp;quot;: [],&lt;br /&gt;
      &amp;quot;fave_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;repeat_num&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;is_post_verb&amp;quot;: false,&lt;br /&gt;
      &amp;quot;is_local&amp;quot;: true,&lt;br /&gt;
      &amp;quot;favorited&amp;quot;: false,&lt;br /&gt;
      &amp;quot;repeated&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
&lt;br /&gt;
== Develop ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
「[https://notabug.org/gnusocialjp/gnusocial/src/develop/lib/util/default.php lib/util/default.php]」にデフォルト設定一覧がある。&lt;br /&gt;
&lt;br /&gt;
ここの設定項目は、 &amp;lt;code&amp;gt;common_config(key1, key2)&amp;lt;/code&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
==== Next ====&lt;br /&gt;
今後採用予定の技術を検討する。&lt;br /&gt;
&lt;br /&gt;
PHP v7.4は当分維持したい。これで動作するバージョンを選ぶ。&lt;br /&gt;
&lt;br /&gt;
基本方針。&lt;br /&gt;
&lt;br /&gt;
* 単独利用可能。&lt;br /&gt;
* 普及。&lt;br /&gt;
&lt;br /&gt;
単独利用可能で、普及している、枯れた技術を採用したい。おまけでGPL系のライセンスだとなおよし。&lt;br /&gt;
&lt;br /&gt;
* Smarty: テンプレートエンジン。いろいろ検討して、Twigよりも早く普及している。GNU social自体と誕生も近い。&lt;br /&gt;
* Phinx?: DBのマイグレーションツール。なくてもいいかもしれない。&lt;br /&gt;
&lt;br /&gt;
Smartyは導入したいかな。&lt;br /&gt;
&lt;br /&gt;
==== Version ====&lt;br /&gt;
lib/util/framwork.phpがGNU social全体の初期化ファイルになっており、ここにバージョン番号も記載する。&lt;br /&gt;
&lt;br /&gt;
自分が保守を始める直前のコミットの [before-gnusocialjp] のタグをつけて明示する。&lt;br /&gt;
&lt;br /&gt;
==== Basic ====&lt;br /&gt;
バグ修正などで、通信と実コードの対応関係を特定する手順があるので整理する。&lt;br /&gt;
&lt;br /&gt;
まず、GNU socialのサイトにアクセスすると、以下のpublic/.htaccessの内容に従って、URLがindex.php?p=&amp;lt;path&amp;gt;の形式に書き換えられる。&lt;br /&gt;
   &amp;lt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
   RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
   RewriteRule (.*) index.php?p=$1 [L,QSA]&lt;br /&gt;
lib/router.php: ルーティング処理 (URLによる挙動の変更) 。ここで&amp;lt;path&amp;gt;と呼び出される処理 (action) が対応づけられている。&lt;br /&gt;
&lt;br /&gt;
index.php内の[https://notabug.org/gnusocialjp/gnusocial/src/develop/public/index.php main関数]でcall_user_func内で最終的にパスに対応するactionクラスのhandleを呼び出しており、このhandleの連鎖で処理が進む。&lt;br /&gt;
&lt;br /&gt;
actionはactions配下にaction名.phpの形式で格納されている。&lt;br /&gt;
&lt;br /&gt;
こういう風に見ると、ソースコードの該当処理を探しやすい。&lt;br /&gt;
&lt;br /&gt;
例えば、グループを新規作成する画面は、POST group/newの通信を行う。これに対応づくactionはnewgroupとなっている。&lt;br /&gt;
&lt;br /&gt;
実際、actions/newgroup.phpというファイルが存在する。この中にdoPost() があり、これで処理している。&lt;br /&gt;
&lt;br /&gt;
このような流れで、だいたい行っている処理の場所を特定できる。&lt;br /&gt;
&lt;br /&gt;
==== API追加 ====&lt;br /&gt;
lib/util/router.phpのinitializeや、プラグインの場合OnInitializeなどでルーティングの設定がされているので、これを追加する。&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
--- a/lib/util/router.php&lt;br /&gt;
+++ b/lib/util/router.php&lt;br /&gt;
@@ -574,9 +574,13 @@ class Router&lt;br /&gt;
                         ['action' =&amp;gt; 'ApiAccountRateLimitStatus'],&lt;br /&gt;
                         ['format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
 &lt;br /&gt;
-            $m-&amp;gt;connect('api/account/delete.:format',&lt;br /&gt;
+            $m-&amp;gt;connect('api/account/delete/:id.:format',&lt;br /&gt;
                         ['action' =&amp;gt; 'ApiAccountDelete'],&lt;br /&gt;
-                        ['format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
+                        ['id' =&amp;gt; Nickname::INPUT_FMT,&lt;br /&gt;
+                         'format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
+            $m-&amp;gt;connect('api/account/delete.:format',&lt;br /&gt;
+                         ['action' =&amp;gt; 'ApiAccountDelete'],&lt;br /&gt;
+                         ['format' =&amp;gt; '(xml|json)']);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;actionにaction/配下の相当するクラスで実際のリクエストを処理する。&lt;br /&gt;
&lt;br /&gt;
router内の:id.:formatなどがうまくURLの構成要素になっており、ここを引数として使えるようになっている。&lt;br /&gt;
&lt;br /&gt;
==== Action ====&lt;br /&gt;
URLMapper.connectで割り当てられたactionクラスは、最終的にindex.php mainでexecuteされることで、一連の処理が始まる。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:public.index.main.png|サムネイル|なし|609x609ピクセル]]&lt;br /&gt;
&lt;br /&gt;
Action.run-execute-prepare-handle-flushの一連の処理が呼ばれて、該当URLのリクエストが処理・応答される。&lt;br /&gt;
=== Register ===&lt;br /&gt;
&lt;br /&gt;
* main/register&lt;br /&gt;
* api/account/register.:format&lt;br /&gt;
&lt;br /&gt;
=== DB ===&lt;br /&gt;
DB関係のコードはclassesディレクトリーに配置する。DB操作、テーブルに対応しているクラスはclasses.Managed_DataObjectの継承が基本。&lt;br /&gt;
&lt;br /&gt;
getKVのstaticメソッドで、主キーから行 (レコード) を取得する。&lt;br /&gt;
&lt;br /&gt;
=== Request ===&lt;br /&gt;
HTTP関係の処理はHTTPClientで行う。&lt;br /&gt;
&lt;br /&gt;
plugins/LinkbackPlugin.phpの例。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        $payload = array(&lt;br /&gt;
            'source' =&amp;gt; $source,&lt;br /&gt;
            'target' =&amp;gt; $url&lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        $request = HTTPClient::start();&lt;br /&gt;
        try {&lt;br /&gt;
            $response = $request-&amp;gt;post($endpoint,&lt;br /&gt;
                array(&lt;br /&gt;
                    'Content-type: application/x-www-form-urlencoded',&lt;br /&gt;
                    'Accept: application/json'&lt;br /&gt;
                ),&lt;br /&gt;
                $payload&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
            if(!in_array($response-&amp;gt;getStatus(), array(200,201,202))) {&lt;br /&gt;
                common_log(LOG_WARNING,&lt;br /&gt;
                           &amp;quot;Webmention request failed for '$url' ($endpoint)&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        } catch (Exception $e) {&lt;br /&gt;
            common_log(LOG_WARNING, &amp;quot;Webmention request failed for '{$url}' ({$endpoint}): {$e-&amp;gt;getMessage()}&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;startで生成して、ヘッダーとペイロードを設定するだけ。&lt;br /&gt;
&lt;br /&gt;
startは互換用なのでnew HTTPClient()で問題ない。&lt;br /&gt;
&lt;br /&gt;
基本はtryの中で実行する。たぶん、200系以外はExceptionになる。&lt;br /&gt;
&lt;br /&gt;
=== Log ===&lt;br /&gt;
lib/util/util.phpにログなどの共通関数が存在する。デバッグに役立つ。&lt;br /&gt;
&lt;br /&gt;
* common_log&lt;br /&gt;
* common_debug: common_log(DEBUG, )。基本はこれを使う。&lt;br /&gt;
* common_log_objstring: DB_DataObjectを文字列に変換。これとcommon_debugを併用する感じ。&lt;br /&gt;
* _ve: var_exportのラッパー。オブジェクトの文字化に便利。&lt;br /&gt;
&lt;br /&gt;
スタックトレース:  common_debug(_ve(debug_backtrace()));&lt;br /&gt;
&lt;br /&gt;
ログ出力の設定をしておく。以下の構文などでログが出力される。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;common_debug(str)&amp;lt;/code&amp;gt;&lt;br /&gt;
comon_logというのがあるが、これはcommon_log(LOG_INRO, str)のような形で使う。長い。&lt;br /&gt;
=== Test ===&lt;br /&gt;
PHPUnitのテスト記述時のコツがある。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php declare(strict_types=1);&lt;br /&gt;
use PHPUnit\Framework\TestCase;&lt;br /&gt;
&lt;br /&gt;
define('GNUSOCIAL', true);&lt;br /&gt;
define('INSTALLDIR', '.');&lt;br /&gt;
set_include_path('../../');&lt;br /&gt;
require_once(INSTALLDIR . '/lib/util/framework.php');&lt;br /&gt;
&lt;br /&gt;
final class ApiAccountRegisterActionTest extends TestCase&lt;br /&gt;
{&lt;br /&gt;
    private $instance;&lt;br /&gt;
&lt;br /&gt;
    protected function setUp(): void&lt;br /&gt;
    {&lt;br /&gt;
        $GLOBALS['config'] = [];&lt;br /&gt;
        $this-&amp;gt;instance = new ApiAccountRegisterAction;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function testHandle(): void&lt;br /&gt;
    {&lt;br /&gt;
        $GLOBALS['config']['site'] = ['closed' =&amp;gt; true];&lt;br /&gt;
        $this-&amp;gt;expectExceptionMessage('Registration not allowed.');&lt;br /&gt;
&lt;br /&gt;
        $mock = $this-&amp;gt;createMock('ApiAccountRegisterAction');&lt;br /&gt;
        $mock-&amp;gt;expects($this-&amp;gt;any())&lt;br /&gt;
            -&amp;gt;method('clientError')&lt;br /&gt;
            -&amp;gt;willReturnCallback(function(&lt;br /&gt;
                string $msg, int $code = 400, ?string $format = null) {&lt;br /&gt;
                throw new \Exception($msg, $code, $format);&lt;br /&gt;
        });&lt;br /&gt;
        $this-&amp;gt;doMethod($mock, 'handle', []);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * privateメソッドを実行する.&lt;br /&gt;
     * @param object $object 対象オブジェクト。&lt;br /&gt;
     * @param string $methodName privateメソッドの名前。&lt;br /&gt;
     * @param array $param privateメソッドに渡す引数。&lt;br /&gt;
     * @return mixed 実行結果。&lt;br /&gt;
     * @throws \ReflectionException 引数のクラスがない場合に発生。&lt;br /&gt;
     */&lt;br /&gt;
    private function doMethod(object $object, string $methodName, array $param): object&lt;br /&gt;
    {&lt;br /&gt;
        // テスト対象のクラスをnewする.&lt;br /&gt;
        $controller = $object;&lt;br /&gt;
        // ReflectionClassをテスト対象のクラスをもとに作る.&lt;br /&gt;
        $reflection = new \ReflectionClass($controller);&lt;br /&gt;
        // メソッドを取得する.&lt;br /&gt;
        $method = $reflection-&amp;gt;getMethod($methodName);&lt;br /&gt;
        // アクセス許可をする.&lt;br /&gt;
        $method-&amp;gt;setAccessible(true);&lt;br /&gt;
        // メソッドを実行して返却値をそのまま返す.&lt;br /&gt;
        return $method-&amp;gt;invokeArgs($controller, $param);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ポイントは以下3点。&lt;br /&gt;
&lt;br /&gt;
# 冒頭のdefineからrequire_onceの部分でライブラリーのオートロード類を設定する。GNUSOCIALのマクロがないと冒頭のexitで終わるので定義必要。&lt;br /&gt;
# テスト対象インスタンス生成時に$configを参照していることが多いので、setUpでダミーで定義しておく。&lt;br /&gt;
# clientErrorでexitで中断することが多いので、試験できるようにmockでclientErrorを例外を出す別の関数に置換しておく。これで試験できる。&lt;br /&gt;
&lt;br /&gt;
=== Plugin ===&lt;br /&gt;
DOCUMENTAION/DEVELOPERS/Pluginsに一連の資料がある。&lt;br /&gt;
&lt;br /&gt;
==== README.md ====&lt;br /&gt;
プラグインはlib/util/modules/Pluginsクラスを継承することで、GNU socialと連携する。&lt;br /&gt;
&lt;br /&gt;
この継承クラスは、イベント発生時に呼ばれる標準的な命名のメソッド (イベントハンドラー) を持つ。具体的にはonXの形式。XはEVENTS.txtで一覧化されるイベント名がが入る。そして、定義済みの引数を持つ。&lt;br /&gt;
&lt;br /&gt;
例えば以下のようになる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onSomeEvent($paramA, &amp;amp;$paramB): bool&lt;br /&gt;
{&lt;br /&gt;
    if ($paramA == 'jed') {&lt;br /&gt;
        throw new Exception(sprintf(_m(&amp;quot;Invalid parameter %s&amp;quot;), $paramA));&lt;br /&gt;
    }&lt;br /&gt;
    $paramB = 'spock';&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Event Handlers =====&lt;br /&gt;
イベントハンドラーは論理値を返す必要がある。&lt;br /&gt;
&lt;br /&gt;
* false: 他の同じ名前のイベントハンドラーはスキップされる。既存のイベントハンドラーの動きの置換に役立つ。&lt;br /&gt;
* true: 処理継続。イベント処理の追加・拡張となる。&lt;br /&gt;
&lt;br /&gt;
例外を投げると、止まる。&lt;br /&gt;
&lt;br /&gt;
===== Installation =====&lt;br /&gt;
プラグインの有効化には、SmplePluginの場合、以下のコードをconfig.phpに記述する。&lt;br /&gt;
 addPlugin('Sample');&lt;br /&gt;
サードパーティープラグインはlocal/plugins/{$name}/{$pluginclass}.phpに格納する必要がある。$nameはSample、$pluginclassはSamplePlugin。&lt;br /&gt;
&lt;br /&gt;
同梱プラグインはpluginsディレクトリーにある。&lt;br /&gt;
&lt;br /&gt;
===== Plugin Configuration =====&lt;br /&gt;
プラグインはaddPlugin時にオプション引数で設定できる。&lt;br /&gt;
 addPlugin('Sample', ['attr1' =&amp;gt; 'foo', 'attr2' =&amp;gt; 'bar']);&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class SamplePlugin extends Plugin&lt;br /&gt;
{&lt;br /&gt;
    public $attr1 = null;&lt;br /&gt;
    public $attr2 = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;引数のキーがそのままプロパティーになる。&lt;br /&gt;
&lt;br /&gt;
===== Initialization =====&lt;br /&gt;
Pluginクラスのメソッドをオーバーライドする形でいくつかの処理を行っていく。&lt;br /&gt;
&lt;br /&gt;
initializeで初期化する。リモートサーバー接続やパス作成などを行うのに役立つ。&lt;br /&gt;
&lt;br /&gt;
===== Clean Up =====&lt;br /&gt;
clieanupでリモートサーバーからの切断、一時ファイルの削除などのタイミング。&lt;br /&gt;
&lt;br /&gt;
===== Database schema setup =====&lt;br /&gt;
プラグインは自分のDBテーブルを保有できる。ensureTableメソッドでテーブル構造や可用性を確認できる。&lt;br /&gt;
&lt;br /&gt;
デフォルトで、スキーマはGNU socialの実行時 (Webページの表示時) にチェックされる。管理者はcheckschema.phpスクリプトの実行で、チェックしたり、性能を向上できる。このスクリプトはプラグインの設置や更新後に実行する必要がある。&lt;br /&gt;
&lt;br /&gt;
例えば、以下のようなコードで、テーブルの保証ができる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onCheckSchema(): bool&lt;br /&gt;
{&lt;br /&gt;
    $schema = Schema::get();&lt;br /&gt;
&lt;br /&gt;
    // '''For storing user-submitted flags on profiles'''&lt;br /&gt;
&lt;br /&gt;
    $schema-&amp;gt;ensureTable('user_greeting_count',[&lt;br /&gt;
            new ColumnDef('user_id', 'integer', null, true, 'PRI'),&lt;br /&gt;
            new ColumnDef('greeting_count', 'integer')&lt;br /&gt;
        ]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;引数1でテーブル名、引数2の配列で列定義の模様。引数2はモデルでstatic関数にしたほうがいいかも。&lt;br /&gt;
&lt;br /&gt;
===== Load related plugins when needed =====&lt;br /&gt;
通常のプラグインは外部プラグインが必要なことが多い。onAutolaodメソッドは関連ファイルを受け取れる。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onAutoload($cls): bool&lt;br /&gt;
{&lt;br /&gt;
    $dir = __DIR__;&lt;br /&gt;
&lt;br /&gt;
    switch ($cls)&lt;br /&gt;
    {&lt;br /&gt;
        case 'HelloAction':&lt;br /&gt;
            include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';&lt;br /&gt;
            return false;&lt;br /&gt;
        case 'User_greeting_count':&lt;br /&gt;
            include_once $dir . '/'.$cls.'.php';&lt;br /&gt;
            return false;&lt;br /&gt;
        default:&lt;br /&gt;
            return true;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;注意すべき点として、onAutoloadメソッドはPluginをオーバーロードしている全クラスから呼ばれる。だから他のプラグインを読み込めるようにdefaultでreturn trueを必ずしよう。&lt;br /&gt;
&lt;br /&gt;
===== Map URLs to actions =====&lt;br /&gt;
onRouterInitializedメソッドはプラグインにURLを割り当てる。いわゆるルーティング。action='foobar'の場合、FoobarActionのハンドラークラスを呼び出す。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onRouterInitialized($m): bool&lt;br /&gt;
{&lt;br /&gt;
    $m-&amp;gt;connect('main/hello',&lt;br /&gt;
                ['action' =&amp;gt; 'hello']);&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Modify the default menu to link to our custom action =====&lt;br /&gt;
イベントハンドラーで、制限なしにデフォルトUIを修正できる。&lt;br /&gt;
&lt;br /&gt;
onEndPrimaryNavメソッドで、メインメニューにメニュー項目を追加できる。&lt;br /&gt;
&lt;br /&gt;
===== Action Class =====&lt;br /&gt;
Actionクラスは出力メソッドと同様にフック用のイベントのセットを提供する。&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onEndPrimaryNav($action): bool&lt;br /&gt;
{&lt;br /&gt;
    // '''common_local_url()''' gets the correct URL for the action name we provide&lt;br /&gt;
&lt;br /&gt;
    $action-&amp;gt;menuItem(common_local_url('hello'),&lt;br /&gt;
                      _m('Hello'), _m('A warm greeting'), false, 'nav_hello');&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public function onPluginVersion(&amp;amp;$versions): bool&lt;br /&gt;
{&lt;br /&gt;
    $versions[] = [&lt;br /&gt;
        'name' =&amp;gt; 'Sample',&lt;br /&gt;
        'version' =&amp;gt; GNUSOCIAL_VERSION,&lt;br /&gt;
        'author' =&amp;gt; 'Brion Vibber, Evan Prodromou',&lt;br /&gt;
        'homepage' =&amp;gt; 'http://example.org/plugin',&lt;br /&gt;
        'rawdescription' =&amp;gt;&lt;br /&gt;
        _m('A sample plugin to show basics of development for new hackers.')&lt;br /&gt;
    ];&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== hello.php =====&lt;br /&gt;
hello.phpはユーザーに挨拶文を表示するシンプルなプラグイン。Actionクラスによる出力のサンプル。&lt;br /&gt;
&lt;br /&gt;
===== Take arguments for running =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function prepare(array $args = []): bool&lt;br /&gt;
{&lt;br /&gt;
    parent::prepare($args);&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;user = common_current_user();&lt;br /&gt;
&lt;br /&gt;
    if (!empty($this-&amp;gt;user)) {&lt;br /&gt;
        $this-&amp;gt;gc = User_greeting_count::inc($this-&amp;gt;user-&amp;gt;id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;prepareメソッドは最初に呼ばれ、actionクラスは引数を得る。DBから必要なデータも取得する。&lt;br /&gt;
&lt;br /&gt;
デフォルトの引数処理のため、Actionクラスは最初にparent::prpare($args) を呼ぶべき。&lt;br /&gt;
&lt;br /&gt;
===== Handle request =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function handle(): void&lt;br /&gt;
{&lt;br /&gt;
    parent::handle();&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;showPage();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;handleメソッドはリクエストの処理のメイン処理。ほとんどの前処理はprepareメソッドで行っておくべき。handleは単にデータ表示だけなどシンプルにしておいた方がいい。&lt;br /&gt;
&lt;br /&gt;
===== Title of this page =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function title(): string&lt;br /&gt;
{&lt;br /&gt;
    if (empty($this-&amp;gt;user)) {&lt;br /&gt;
        return _m('Hello');&lt;br /&gt;
    } else {&lt;br /&gt;
        return sprintf(_m('Hello, %s'), $this-&amp;gt;user-&amp;gt;nickname);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;titleメソッドでカスタムタイトルを上書き表示できる。&lt;br /&gt;
&lt;br /&gt;
===== Show content in the content area =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function showContent(): void&lt;br /&gt;
{&lt;br /&gt;
    if (empty($this-&amp;gt;user)) {&lt;br /&gt;
        $this-&amp;gt;element('p', ['class' =&amp;gt; 'greeting'],&lt;br /&gt;
                       _m('Hello, stranger!'));&lt;br /&gt;
    } else {&lt;br /&gt;
        $this-&amp;gt;element('p', ['class' =&amp;gt; 'greeting'],&lt;br /&gt;
                       sprintf(_m('Hello, %s'), $this-&amp;gt;user-&amp;gt;nickname));&lt;br /&gt;
        $this-&amp;gt;element('p', ['class' =&amp;gt; 'greeting_count'],&lt;br /&gt;
                       sprintf(_m('I have greeted you %d time.',&lt;br /&gt;
                                  'I have greeted you %d times.',&lt;br /&gt;
                                  $this-&amp;gt;gc-&amp;gt;greeting_count),&lt;br /&gt;
                                  $this-&amp;gt;gc-&amp;gt;greeting_count));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;デフォルトのGNU socialは大量の装飾がある。メニュー、ロゴ、タブなど。このメソッドはコンテントエリアの表示に使う。&lt;br /&gt;
&lt;br /&gt;
===== Return true if read only. =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function isReadOnly($args): bool&lt;br /&gt;
{&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;いくつかのアクションはDBから読み取り専用となる。単純なデータベースのロードバランサーは設定でみらーできる。&lt;br /&gt;
&lt;br /&gt;
デフォルトでDBの一貫性の問題回避のためfalseになっている。ただ、パフォーマンス工場のために変更も検討できる。&lt;br /&gt;
&lt;br /&gt;
== Business ==&lt;br /&gt;
https://chatgpt.com/c/67ef45fc-f224-800b-be3b-d22cc6f28b70&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; ✅ どうすれば「やりたいこと」で食べていけるのか？&lt;br /&gt;
&lt;br /&gt;
あなたがここから抜け出すカギは：&lt;br /&gt;
&lt;br /&gt;
&amp;gt; **「一人でも回る収益モデルを、GNU socialの延長線上で育てる」こと。**&lt;br /&gt;
&lt;br /&gt;
たとえば：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 1. 🧰 GNU social関連でサービスを売る&lt;br /&gt;
&lt;br /&gt;
- **ホスティング代行**（Mastodonのホスティングに近いモデル）&lt;br /&gt;
&lt;br /&gt;
- **テーマ・プラグインの販売**&lt;br /&gt;
&lt;br /&gt;
- **GNU socialの使い方講座や技術支援**&lt;br /&gt;
&lt;br /&gt;
あなた自身が「実際に使える状態のGNU social環境」を整えられるのなら、  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt;他の人が使える“プロダクト”として売る**ことは十分に可能です。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 2. 👤 一人で回せるFOSS＋SaaS型の小さな仕組みをつくる&lt;br /&gt;
&lt;br /&gt;
- GNU socialのエンジンをベースに、  &lt;br /&gt;
&lt;br /&gt;
  ある**特定の用途に絞った軽量SNS**にして売る（例：地域コミュニティ／趣味SNS／マイクロブログ）&lt;br /&gt;
&lt;br /&gt;
「技術が好き」「思想がある」あなたの武器は、  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt;“熱量ある小規模市場”を刺すサービス**と相性が良いです。&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; 🤝 協力者なしでも、戦える設計にする&lt;br /&gt;
&lt;br /&gt;
人に裏切られてきた過去があるなら、**「一人でできるビジネスモデル」**にするのは賢い選択です。  &lt;br /&gt;
&lt;br /&gt;
でも、「一人で完結」はできても、「一人でやりきる必要はない」とも思います。&lt;br /&gt;
&lt;br /&gt;
信頼はゆっくり時間をかけて、リスクを最小限にして、再構築してもいい。  &lt;br /&gt;
&lt;br /&gt;
たとえば：&lt;br /&gt;
&lt;br /&gt;
- 自動化ツール／ノーコードを使って事務作業を減らす  &lt;br /&gt;
&lt;br /&gt;
- ChatGPTやCopilotなどを使って**擬似的な“補佐役”**を持つ  &lt;br /&gt;
&lt;br /&gt;
- 最低限の業務委託（クラウドワークスなど）を**スポット的に使う**&lt;br /&gt;
[[Category:GNU social]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=562</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=562"/>
		<updated>2025-02-13T23:57:36Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Branch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
トップディレクトリー直下にTODO.md CREDITS.mdなど細々した文書が散らばっていて汚いのでwwwに全部移動させるか。&lt;br /&gt;
&lt;br /&gt;
/docでホームページを作ろうかと思ったが、/dirで作った方がファイルブラウジングと対応していていい。&lt;br /&gt;
&lt;br /&gt;
その場合、index.mdじゃなくてreadme.mdがindexファイル。index.mdでやる場合、/dirは対応していなくて、fossil本体に手加えるのが後々手間になる。&lt;br /&gt;
&lt;br /&gt;
README.mdでいくのがいい。&lt;br /&gt;
&lt;br /&gt;
fossil uiでローカルでweb表示して、/doc/ckout/&amp;lt;file&amp;gt;でプレビューする。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
==== Tag ====&lt;br /&gt;
Gitからのインポート時にbefore-gnusocialjpのタグが消えていたので復元する。&lt;br /&gt;
&lt;br /&gt;
masterブランチ [32aeec858e1ebf712494a5f578931d9f2c809a5c] と同じだから、省略されたのかもしれない。&lt;br /&gt;
 fossil tag add before-gnusocialjp master &lt;br /&gt;
これでタグが復元された。リモートの反映にはsyncが必要な模様。&lt;br /&gt;
 fossil sync&lt;br /&gt;
fossilではtrunkブランチがデフォルトなので、mainブランチをtrunkブランチに変更する。&lt;br /&gt;
 fossil tag add --propagate trunk main&lt;br /&gt;
 fossil tag cancel --propagate old-branch-name main&lt;br /&gt;
これがいまいちよくわかっていなくてうまくいかない。ブランチの変更。基本はブランチを作り直して、既存のブランチは削除する感じ？&lt;br /&gt;
&lt;br /&gt;
==== Branch ====&lt;br /&gt;
mainブランチをtrunkブランチに改名する。&lt;br /&gt;
&lt;br /&gt;
https://notabug.org/gnusocialjp/gnusocial/commit/f9de43d2ba5a52cb1a8366bcedd30a365c6e760d&lt;br /&gt;
&lt;br /&gt;
https://fossil.gnusocial.jp/fossil/gnusocial/info/1e9129cd274ecbbc&lt;br /&gt;
&lt;br /&gt;
これが最初のコミットなので、このコミットから改名する。&lt;br /&gt;
 fossil amend 1e9129cd274ecbbc --branch trunk&lt;br /&gt;
うーん。mainブランチが残ったままになってしまった。&lt;br /&gt;
&lt;br /&gt;
https://fossil.gnusocial.jp/fossil/gnusocial/info/814af2129afef767&lt;br /&gt;
&lt;br /&gt;
このコミットからmainブランチが始まっているから、これをtrunkに変更する。&lt;br /&gt;
 fossil amend 814af2129afef767 --branch trunk&lt;br /&gt;
コマンドでやると、1コミットしかブランチが変わらない。しかたないので、Web UIから変更する。これで全部変わった。これでOK。&lt;br /&gt;
&lt;br /&gt;
trunkの最初のコミットを間違えたので、以下のmedia-uploadingのコミットをtrunkに変更した。これできれいになった？&lt;br /&gt;
&lt;br /&gt;
https://fossil.gnusocial.jp/fossil/gnusocial/ci/321506f911&lt;br /&gt;
&lt;br /&gt;
他のブランチ群もクローズしていく。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=561</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=561"/>
		<updated>2025-02-13T23:34:54Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Branch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
トップディレクトリー直下にTODO.md CREDITS.mdなど細々した文書が散らばっていて汚いのでwwwに全部移動させるか。&lt;br /&gt;
&lt;br /&gt;
/docでホームページを作ろうかと思ったが、/dirで作った方がファイルブラウジングと対応していていい。&lt;br /&gt;
&lt;br /&gt;
その場合、index.mdじゃなくてreadme.mdがindexファイル。index.mdでやる場合、/dirは対応していなくて、fossil本体に手加えるのが後々手間になる。&lt;br /&gt;
&lt;br /&gt;
README.mdでいくのがいい。&lt;br /&gt;
&lt;br /&gt;
fossil uiでローカルでweb表示して、/doc/ckout/&amp;lt;file&amp;gt;でプレビューする。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
==== Tag ====&lt;br /&gt;
Gitからのインポート時にbefore-gnusocialjpのタグが消えていたので復元する。&lt;br /&gt;
&lt;br /&gt;
masterブランチ [32aeec858e1ebf712494a5f578931d9f2c809a5c] と同じだから、省略されたのかもしれない。&lt;br /&gt;
 fossil tag add before-gnusocialjp master &lt;br /&gt;
これでタグが復元された。リモートの反映にはsyncが必要な模様。&lt;br /&gt;
 fossil sync&lt;br /&gt;
fossilではtrunkブランチがデフォルトなので、mainブランチをtrunkブランチに変更する。&lt;br /&gt;
 fossil tag add --propagate trunk main&lt;br /&gt;
 fossil tag cancel --propagate old-branch-name main&lt;br /&gt;
これがいまいちよくわかっていなくてうまくいかない。ブランチの変更。基本はブランチを作り直して、既存のブランチは削除する感じ？&lt;br /&gt;
&lt;br /&gt;
==== Branch ====&lt;br /&gt;
mainブランチをtrunkブランチに改名する。&lt;br /&gt;
&lt;br /&gt;
https://notabug.org/gnusocialjp/gnusocial/commit/f9de43d2ba5a52cb1a8366bcedd30a365c6e760d&lt;br /&gt;
&lt;br /&gt;
https://fossil.gnusocial.jp/fossil/gnusocial/info/1e9129cd274ecbbc&lt;br /&gt;
&lt;br /&gt;
これが最初のコミットなので、このコミットから改名する。&lt;br /&gt;
 fossil amend 1e9129cd274ecbbc --branch trunk&lt;br /&gt;
うーん。mainブランチが残ったままになってしまった。&lt;br /&gt;
&lt;br /&gt;
https://fossil.gnusocial.jp/fossil/gnusocial/info/814af2129afef767&lt;br /&gt;
&lt;br /&gt;
このコミットからmainブランチが始まっているから、これをtrunkに変更する。&lt;br /&gt;
 fossil amend 814af2129afef767 --branch trunk&lt;br /&gt;
コマンドでやると、1コミットしかブランチが変わらない。しかたないので、Web UIから変更する。これで全部変わった。これでOK。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=560</id>
		<title>Imgur</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=Imgur&amp;diff=560"/>
		<updated>2025-02-13T20:55:16Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Download Bulk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Imgur (イミジャー？) ([https://imgur.com/ Imgur: The magic of the Internet]) は画像共有SNS ([https://web.gnusocial.jp/post/2024/03/06/10426/ 役務: 容量無制限・永続保存で世界的に人気の画像共有サービスImgurは資料の保存・共有に非常に有用 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
日本では画像アップロード先として、掲示板サイトなどでよく使われている。が、Instagramのような画像共有SNSというのが運営側の主張。&lt;br /&gt;
&lt;br /&gt;
海外で人気の掲示板サイトのRedditに画像アップローダーがなかったため、主にRedditでの画像共有のために始まったとされている。2009年にサービスが開始し、現在は世界的に有名で人気の画像共有サービスとなっている。&lt;br /&gt;
&lt;br /&gt;
なお、2023年5月の更新で、ポルノ画像の削除が規約に盛り込まれた。それまでは、外部参照先として、ボルノ・エロ画像もアップロードが可能だった。同時に、アカウントなしで匿名アップロードした場合、アップロード画像が削除対象になるとも明記された。&lt;br /&gt;
&lt;br /&gt;
「[https://apptopi.jp/2021/11/30/imgur/ Imgur（イミジャー）って知ってる？便利な使い方を徹底解説！ | APPTOPI]」&lt;br /&gt;
&lt;br /&gt;
== Function ==&lt;br /&gt;
Instagramも似たような画像共有機能として使うこともできるが、以下2点がImgurの特徴。&lt;br /&gt;
&lt;br /&gt;
* 匿名性&lt;br /&gt;
* Webでのフォルダー分け&lt;br /&gt;
&lt;br /&gt;
Instagramだと画像がユーザーアカウント連携され、アップロード者がすぐに分かる。また、スマートフォンアプリを優遇していて、分類分け機能のCollectionはWebからは使えない。外部アップローダーというよりかは、コミュニケーション機能を重視した設計になっている。&lt;br /&gt;
&lt;br /&gt;
人気の秘訣がアップロード画像の制限。以下の上限はあるものの、それ以外は無制限にアップロードが可能。&lt;br /&gt;
&lt;br /&gt;
* 1時間50ファイルまで&lt;br /&gt;
* 1ファイル上限20 MB&lt;br /&gt;
&lt;br /&gt;
高品質の写真などでなければ、無制限に利用可能なアップローダーとしても利用できる。&lt;br /&gt;
&lt;br /&gt;
画像アップロード時には、公開・非公開を選択でき、非公開にすると、リンクを知っている人だけが閲覧可能になる。非公開だとURLからアップロード者は特定不能になっている。&lt;br /&gt;
&lt;br /&gt;
なお、Web UIはいくつか問題がある模様。&lt;br /&gt;
&lt;br /&gt;
* マイページの [Post] にPublic/Hiddenで可視性に応じたタブがあるがこれはうまく機能していない模様。&lt;br /&gt;
* 他のユーザーのマイページを開いても [Post] がうまく表示されるとは限らない。&lt;br /&gt;
* フォルダー分け (Favorite) は1画像1カテゴリーのみ。&lt;br /&gt;
&lt;br /&gt;
上記制約があるので、基本はFavoriteで画像を分類分けして管理する使い方になると思われる。Favoriteは非公開にもできる。アップロード画像をpublic/hiddenを繰り返したりすると、うまく反映されることがあるが、あまりあてにしないほうがいい。アプリだと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
指定画像URLの保存や、動画・アニメーションgifの作成機能などもあり、WebArchiveで保存できない画像や、スクリーンショットでの一種の魚拓、データ保存サービスとしてかなり有用だと思われる。&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
Publicで投稿するとタイトルを変更できない。Privateにしたらタイトルを変更可能になる。一時的にPrivateにしてPublicに戻すと良い。パーマリンクも同じまま。&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
==== Bulk ====&lt;br /&gt;
[https://www.reddit.com/r/redditisfun/comments/2otj8s/batch_download_images_on_a_imgur_gallery_page/ Batch download images on a imgur gallery page? : r/redditisfun]&lt;br /&gt;
&lt;br /&gt;
アルバム・1個の投稿に添付された画像を一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
クラシックモードに切り替えて、アルバムを表示すると、右側に [Download post] が表示される。これを選ぶとzip形式で一括で保存できる。&lt;br /&gt;
&lt;br /&gt;
== Account ==&lt;br /&gt;
&lt;br /&gt;
=== Delete an Account ===&lt;br /&gt;
[https://help.imgur.com/hc/en-us/articles/26513357802651-Delete-an-Account Delete an Account – imgur]&lt;br /&gt;
&lt;br /&gt;
アカウントを削除すると、ユーザー名が解放されて他のユーザーも使用可能になる。&lt;br /&gt;
&lt;br /&gt;
[Settings]-[Delete my account] で完了。&lt;br /&gt;
&lt;br /&gt;
一度削除すると、同じメールアドレスは使えない？Twitter/XやGoogleアカウントでのログインはできなかった。Apple IDでのログインはできた。&lt;br /&gt;
&lt;br /&gt;
=== Ban ===&lt;br /&gt;
一般公開で画像を投稿すると、他のユーザーも簡単に見えるようになる。看板などであったとしても、電話番号などがあると、通報されてすぐにアカウント凍結される。&lt;br /&gt;
&lt;br /&gt;
凍結されると、新規投稿ができなくなる。&lt;br /&gt;
&lt;br /&gt;
Imgurの使い方としては、基本的に匿名・非公開で常に投稿して、アップローダーとして使うのがいい、人目につかないので、通報される心配も減る。&lt;br /&gt;
&lt;br /&gt;
Banされても全投稿削除して問い合わせに問い合わせてもだめ。アカウント削除して作り直すしかないと思われる。&lt;br /&gt;
&lt;br /&gt;
=== My page ===&lt;br /&gt;
アカウントを作ると、以下のマイページが付与される。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://imgur.com/user/&amp;lt;/nowiki&amp;gt;[username]&lt;br /&gt;
* https://[username].imgur.com&lt;br /&gt;
&lt;br /&gt;
1個目のサブディレクトリーが基本の模様。ただ、Web版からだと若干操作感、機能が違う。例えば、Banされたサブディレクトリーのほうだと、ページを開かないと削除ができず、ページにアクセスできないので削除できない。サブドメインだとページを直接開かなくても、メニューのサブ項目から削除できた。&lt;br /&gt;
[[Category:Centralized]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=559</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=559"/>
		<updated>2025-02-12T22:47:34Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Branch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
トップディレクトリー直下にTODO.md CREDITS.mdなど細々した文書が散らばっていて汚いのでwwwに全部移動させるか。&lt;br /&gt;
&lt;br /&gt;
/docでホームページを作ろうかと思ったが、/dirで作った方がファイルブラウジングと対応していていい。&lt;br /&gt;
&lt;br /&gt;
その場合、index.mdじゃなくてreadme.mdがindexファイル。index.mdでやる場合、/dirは対応していなくて、fossil本体に手加えるのが後々手間になる。&lt;br /&gt;
&lt;br /&gt;
README.mdでいくのがいい。&lt;br /&gt;
&lt;br /&gt;
fossil uiでローカルでweb表示して、/doc/ckout/&amp;lt;file&amp;gt;でプレビューする。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
==== Tag ====&lt;br /&gt;
Gitからのインポート時にbefore-gnusocialjpのタグが消えていたので復元する。&lt;br /&gt;
&lt;br /&gt;
masterブランチ [32aeec858e1ebf712494a5f578931d9f2c809a5c] と同じだから、省略されたのかもしれない。&lt;br /&gt;
 fossil tag add before-gnusocialjp master &lt;br /&gt;
これでタグが復元された。リモートの反映にはsyncが必要な模様。&lt;br /&gt;
 fossil sync&lt;br /&gt;
fossilではtrunkブランチがデフォルトなので、mainブランチをtrunkブランチに変更する。&lt;br /&gt;
 fossil tag add --propagate trunk main&lt;br /&gt;
 fossil tag cancel --propagate old-branch-name main&lt;br /&gt;
これがいまいちよくわかっていなくてうまくいかない。ブランチの変更。基本はブランチを作り直して、既存のブランチは削除する感じ？&lt;br /&gt;
&lt;br /&gt;
==== Branch ====&lt;br /&gt;
mainブランチをtrunkブランチに改名する。&lt;br /&gt;
&lt;br /&gt;
https://notabug.org/gnusocialjp/gnusocial/commit/f9de43d2ba5a52cb1a8366bcedd30a365c6e760d&lt;br /&gt;
&lt;br /&gt;
https://fossil.gnusocial.jp/fossil/gnusocial/info/1e9129cd274ecbbc&lt;br /&gt;
&lt;br /&gt;
これが最初のコミットなので、このコミットから改名する。&lt;br /&gt;
 fossil amend 1e9129cd274ecbbc --branch trunk&lt;br /&gt;
うーん。mainブランチが残ったままになってしまった。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=558</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=558"/>
		<updated>2025-01-28T15:12:20Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Tag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
トップディレクトリー直下にTODO.md CREDITS.mdなど細々した文書が散らばっていて汚いのでwwwに全部移動させるか。&lt;br /&gt;
&lt;br /&gt;
/docでホームページを作ろうかと思ったが、/dirで作った方がファイルブラウジングと対応していていい。&lt;br /&gt;
&lt;br /&gt;
その場合、index.mdじゃなくてreadme.mdがindexファイル。index.mdでやる場合、/dirは対応していなくて、fossil本体に手加えるのが後々手間になる。&lt;br /&gt;
&lt;br /&gt;
README.mdでいくのがいい。&lt;br /&gt;
&lt;br /&gt;
fossil uiでローカルでweb表示して、/doc/ckout/&amp;lt;file&amp;gt;でプレビューする。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
==== Tag ====&lt;br /&gt;
Gitからのインポート時にbefore-gnusocialjpのタグが消えていたので復元する。&lt;br /&gt;
&lt;br /&gt;
masterブランチ [32aeec858e1ebf712494a5f578931d9f2c809a5c] と同じだから、省略されたのかもしれない。&lt;br /&gt;
 fossil tag add before-gnusocialjp master &lt;br /&gt;
これでタグが復元された。リモートの反映にはsyncが必要な模様。&lt;br /&gt;
 fossil sync&lt;br /&gt;
fossilではtrunkブランチがデフォルトなので、mainブランチをtrunkブランチに変更する。&lt;br /&gt;
 fossil tag add --propagate trunk main&lt;br /&gt;
 fossil tag cancel --propagate old-branch-name main&lt;br /&gt;
これがいまいちよくわかっていなくてうまくいかない。ブランチの変更。基本はブランチを作り直して、既存のブランチは削除する感じ？&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=557</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=557"/>
		<updated>2025-01-19T22:01:52Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
トップディレクトリー直下にTODO.md CREDITS.mdなど細々した文書が散らばっていて汚いのでwwwに全部移動させるか。&lt;br /&gt;
&lt;br /&gt;
/docでホームページを作ろうかと思ったが、/dirで作った方がファイルブラウジングと対応していていい。&lt;br /&gt;
&lt;br /&gt;
その場合、index.mdじゃなくてreadme.mdがindexファイル。index.mdでやる場合、/dirは対応していなくて、fossil本体に手加えるのが後々手間になる。&lt;br /&gt;
&lt;br /&gt;
README.mdでいくのがいい。&lt;br /&gt;
&lt;br /&gt;
fossil uiでローカルでweb表示して、/doc/ckout/&amp;lt;file&amp;gt;でプレビューする。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
==== Tag ====&lt;br /&gt;
Gitからのインポート時にbefore-gnusocialjpのタグが消えていたので復元する。&lt;br /&gt;
&lt;br /&gt;
masterブランチ [32aeec858e1ebf712494a5f578931d9f2c809a5c] と同じだから、省略されたのかもしれない。&lt;br /&gt;
 fossil tag add before-gnusocialjp master &lt;br /&gt;
これでタグが復元された。リモートの反映にはsyncが必要な模様。&lt;br /&gt;
 fossil sync&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=556</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=556"/>
		<updated>2025-01-16T21:59:37Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Doc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
トップディレクトリー直下にTODO.md CREDITS.mdなど細々した文書が散らばっていて汚いのでwwwに全部移動させるか。&lt;br /&gt;
&lt;br /&gt;
/docでホームページを作ろうかと思ったが、/dirで作った方がファイルブラウジングと対応していていい。&lt;br /&gt;
&lt;br /&gt;
その場合、index.mdじゃなくてreadme.mdがindexファイル。index.mdでやる場合、/dirは対応していなくて、fossil本体に手加えるのが後々手間になる。&lt;br /&gt;
&lt;br /&gt;
README.mdでいくのがいい。&lt;br /&gt;
&lt;br /&gt;
fossil uiでローカルでweb表示して、/doc/ckout/&amp;lt;file&amp;gt;でプレビューする。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=555</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=555"/>
		<updated>2025-01-14T11:56:31Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Doc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
トップディレクトリー直下にTODO.md CREDITS.mdなど細々した文書が散らばっていて汚いのでwwwに全部移動させるか。&lt;br /&gt;
&lt;br /&gt;
/docでホームページを作ろうかと思ったが、/dirで作った方がファイルブラウジングと対応していていい。&lt;br /&gt;
&lt;br /&gt;
その場合、index.mdじゃなくてreadme.mdがindexファイル。index.mdでやる場合、/dirは対応していなくて、fossil本体に手加えるのが後々手間になる。&lt;br /&gt;
&lt;br /&gt;
readme.mdでいくのがいい。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=554</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=554"/>
		<updated>2025-01-05T22:11:26Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Doc ====&lt;br /&gt;
READMEはindex.mdに改名する。&lt;br /&gt;
&lt;br /&gt;
/doc/trunkをプロジェクトトップ画面にする。&lt;br /&gt;
&lt;br /&gt;
その後は、&lt;br /&gt;
&lt;br /&gt;
* index.md&lt;br /&gt;
* www/&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=553</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=553"/>
		<updated>2025-01-05T02:28:56Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Document About&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Document ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
Fossilの埋込文書などのWebページ機能を使ってGNU social自体の公式サイトも一緒に作ることにする。&lt;br /&gt;
&lt;br /&gt;
いくつか重要な文書機能があるので、それの整理と方針を考える。&lt;br /&gt;
&lt;br /&gt;
特に重要なのが以下の機能。&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/dir /dir]ページ [[https://fossil-scm.org/home/file?name=src/browse.c&amp;amp;ci=version-2.25&amp;amp;ln=400 Fossil: browse.c at version-2.25]]: ファイルブラウザーでディレクトリー内の「'readme','readme.txt','readme.md','readme.wiki','readme.markdown',&amp;quot;&amp;quot; 'readme.html'」の内容を下にデフォルト表示してくれる。&lt;br /&gt;
* /doc/&amp;lt;ci&amp;gt;/&amp;lt;file&amp;gt; や/fileの埋込文書 ([https://www.fossil-scm.org/home/doc/trunk/www/wikitheory.wiki Fossil: Wiki In Fossil]、[https://www.fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki Fossil: Project Documentation]): ソースコード内の文書を、拡張子を解釈して描画表示してくれる。&lt;br /&gt;
* uv: ダウンロードページ・ビルド結果の配布用。&lt;br /&gt;
&lt;br /&gt;
特に埋込文書を駆使して、公式サイトを構築する。&lt;br /&gt;
&lt;br /&gt;
ダウンロードページだけ扱いが特殊なので、uvで分離して作成。それ以外は埋込文書を使う。&lt;br /&gt;
&lt;br /&gt;
==== Download ====&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=552</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=552"/>
		<updated>2025-01-04T16:25:28Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Download暫定版。&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Date&lt;br /&gt;
|../info/vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|../dir?ci=vX.X&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|../uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|../zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|../doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|../timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|../timeline?df=X.X&lt;br /&gt;
|}&lt;br /&gt;
デフォルトではuvへの書き込み権限がないので、セットアップユーザーに&amp;quot;y&amp;quot;権限を付与する。&lt;br /&gt;
&lt;br /&gt;
Web UIの[Admin]-[Users]-&amp;lt;username&amp;gt;-[Capabilities]=[☑️Write Unversioned]-[Apply Changes]&lt;br /&gt;
&lt;br /&gt;
これでuvへのアップロード (Web UIの/uvやfossil uv sync) が有効になる。&lt;br /&gt;
&lt;br /&gt;
その後、fossil configuration pull user fossil uv syncするも反映されない。&lt;br /&gt;
 fossil status&lt;br /&gt;
&lt;br /&gt;
 UNLINK     vendor/bin/fetch-mf2&lt;br /&gt;
 UNLINK     vendor/bin/parse-mf2&lt;br /&gt;
fossilがデフォルトでシンボリックリンクを保存しなくて、同期できていないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで有効にしてやってみる。&lt;br /&gt;
 fossil settings allow-symlinks on&lt;br /&gt;
これでもダメで、そもそもリモートと通信がうまくできていない感じがあった。&lt;br /&gt;
&lt;br /&gt;
一旦closeして再度open。その後、fossil user capabilities senooken sy; fossil configuration sync allなどしたら解決した。途中でパスワードが変わっていた。&lt;br /&gt;
&lt;br /&gt;
うまくいって、暫定Downloadページ (https://gnusocial.jp/notice/8429766&amp;lt;nowiki/&amp;gt;)。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=551</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=551"/>
		<updated>2025-01-04T09:58:19Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|X.X&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|/uv/gnusocial-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|/zip/x.x/gnusocial-src-vX.X.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|/doc/www/changelog.md#vX.X&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|/timeline?p=X.X&amp;amp;bt=pre-X.X&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|/timeline?df=X.X&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=550</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=550"/>
		<updated>2025-01-04T09:56:46Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;br /&gt;
uvでdownload.htmlを追加してページを作る。ページの表示内容。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
!Release&lt;br /&gt;
!Source&lt;br /&gt;
!Change&lt;br /&gt;
!History&lt;br /&gt;
!Subsequent&lt;br /&gt;
|-&lt;br /&gt;
|YYYY-mm-dd&lt;br /&gt;
|x.x&lt;br /&gt;
|Release&lt;br /&gt;
|Source&lt;br /&gt;
|Change&lt;br /&gt;
|History&lt;br /&gt;
|Subsequent&lt;br /&gt;
|}&lt;br /&gt;
こんな感じにする。で、それぞれの行のリンクパスを考える。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!column&lt;br /&gt;
!path&lt;br /&gt;
|-&lt;br /&gt;
|Release&lt;br /&gt;
|/uv/gnusocial-vx.x.zip&lt;br /&gt;
|-&lt;br /&gt;
|Source&lt;br /&gt;
|/zip/x.x/gnusocial-src-vx.x.zip&lt;br /&gt;
|-&lt;br /&gt;
|Change&lt;br /&gt;
|/doc/www/changelog.md#vx.x&lt;br /&gt;
|-&lt;br /&gt;
|History&lt;br /&gt;
|/timeline?p=x.x&amp;amp;bt=pre-x.x&lt;br /&gt;
|-&lt;br /&gt;
|Subsequent&lt;br /&gt;
|/timeline?df=x.x&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=549</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=549"/>
		<updated>2025-01-04T00:29:30Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Other Download&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/help?cmd=/download Fossil: Help: /download]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/aboutdownload.wiki Fossil: How The Fossil Download Page Works]&lt;br /&gt;
&lt;br /&gt;
Downloadページを用意する。デフォルトで/downloadページが存在するが、これは最新コミットのソースコードだけ。非開発者がファイルをダウンロードして配置してインストールするには、composerの外部パッケージなどを取り込んだ状態のものを配布する必要がある。&lt;br /&gt;
&lt;br /&gt;
Fossilでは、uvとして別管理していて、これを配布している。/juvlistでJavaScriptでuvリストを取得して、それを使って動的にダウンロードページを構築している。JavaScriptに依存したくないので、通常のHTMLで構築する。&lt;br /&gt;
&lt;br /&gt;
* HTMLだけで構成する。&lt;br /&gt;
* 配布形式は共用サーバーで扱いやすいようにzipにする。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=MediaWiki&amp;diff=548</id>
		<title>MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=MediaWiki&amp;diff=548"/>
		<updated>2024-12-30T01:13:27Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Media&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
MediaWikiはWikipediaで採用されている世界一有名なWikiソフトだ。&lt;br /&gt;
&lt;br /&gt;
GNU social JP WikiもMediaWikiを採用している ([https://web.gnusocial.jp/post/2023/10/31/9191/ 告知: 自由な分散SNSのWiki「GNU social JP Wiki」の開始とサービス名の改名 | GNU social JP Web])。&lt;br /&gt;
&lt;br /&gt;
「[https://kinsta.com/jp/blog/wordpress-wiki/ WordPress Wikiの作成方法（徹底解説）]」にあるように、WordPressでも似たようなWikiサイトの構築は可能。&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/10/30/9167/ 設置: MediaWiki | Wikipediaで採用された世界一有名な情報集約のWikiソフト | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/11/04/9170/ 設置: MediaWikiのindex.phpを省く短縮URL設定 | GNU social JP Web]&lt;br /&gt;
* [https://web.gnusocial.jp/post/2023/11/05/9173/ 設置: MediaWikiのホーム画面 (メインページ/Man_Page) の変更方法 | GNU social JP Web]&lt;br /&gt;
&lt;br /&gt;
== Operation ==&lt;br /&gt;
[[mediawikiwiki:Manual:Administrators|Manual:Administrators - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
=== Protection ===&lt;br /&gt;
&lt;br /&gt;
* [[wikibooks:MediaWiki_Administrator's_Handbook/Page_Protection|MediaWiki Administrator's Handbook/Page Protection - Wikibooks, open books for an open world]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Autoconfirmed_users|Manual:Autoconfirmed users - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
荒らしや編集合戦対策で、ページを保護することで、編集を権限者に限定できる。&lt;br /&gt;
&lt;br /&gt;
=== Block ===&lt;br /&gt;
Ref:&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:Block_and_unblock|Manual:Block and unblock - MediaWiki]] - [[wikibooks:MediaWiki_Administrator's_Handbook/User_Block|MediaWiki Administrator's Handbook/User Block - Wikibooks, open books for an open world]]&lt;br /&gt;
&lt;br /&gt;
サイトが悪党に荒らされた場合の対策。該当アカウントをブロックできる。&lt;br /&gt;
&lt;br /&gt;
ブロックの効果: 編集軽作業が不能になる。&lt;br /&gt;
&lt;br /&gt;
荒らされたページや、新規作成されたページは、復元か削除で対応する。&lt;br /&gt;
&lt;br /&gt;
方法。&lt;br /&gt;
&lt;br /&gt;
* Special:Blockにアクセス。IPアドレスかユーザー名を指定。&lt;br /&gt;
* 他に、利用者か利用者トークページを開くと、サイドバーにブロックのリンクがあり、そこからも実施可能。&lt;br /&gt;
&lt;br /&gt;
オプション&lt;br /&gt;
&lt;br /&gt;
* アカウント作成をブロック: そのIPアドレスから新規登録を不能にする。&lt;br /&gt;
* 最後の使用IPアドレスと編集アドレスをブロック (ハードブロック):&lt;br /&gt;
&lt;br /&gt;
=== Revert/Rollback ===&lt;br /&gt;
Ref: [[mediawikiwiki:Manual:Reverts|Manual:Reverts - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
MediaWikiで誰かの編集を打ち消したり元に戻す機能。基本的に、復元用の履歴を作って元に戻す。&lt;br /&gt;
&lt;br /&gt;
Revert (undo) は、ページを任意の履歴に戻す。現在のページからその履歴までの変更点を逆に適用して、新しい履歴を作る。基本的に誰でもできる。&lt;br /&gt;
&lt;br /&gt;
Rollback/ロールバックは、ページに対して、同じユーザーによる最後の編集をまとめて巻き戻す。rollback権限が必要。シナリオとしては、同一ユーザーにより荒らしなどで大量に編集、破壊された場合に一括で戻せる。&lt;br /&gt;
&lt;br /&gt;
なお、ページが誕生して以来1名のユーザーしか編集していない場合、ページの作成時点まで戻るので使用できない。&lt;br /&gt;
&lt;br /&gt;
ロールバックを実行すると、「Ctkpaarr964565498 (トーク) による編集を Gnusocialjp による直前の版へ差し戻しました」のメッセージで、変更を打ち消し履歴が作られる。&lt;br /&gt;
&lt;br /&gt;
=== RevisionDelete ===&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Help:RevisionDelete/ja|Help:版指定削除 - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:RevisionDelete/ja|Manual:版指定削除 - MediaWiki]]&lt;br /&gt;
* [https://design.kyusan-u.ac.jp/OpenSquareJP/?MediaWiki/Customize MediaWiki/Customize - OpenSquareJP｜井上貢一研究室]&lt;br /&gt;
&lt;br /&gt;
秘匿情報を誤って公開した場合など、特定の変更履歴を非表示にできる。&lt;br /&gt;
&lt;br /&gt;
LocalSettings.phpに以下を追記すると有効になる。&lt;br /&gt;
 $wgGroupPermissions['sysop']['deletelogentry'] = true;&lt;br /&gt;
 $wgGroupPermissions['sysop']['deleterevision'] = true;&lt;br /&gt;
&lt;br /&gt;
=== Right ===&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:User_rights|Manual:User rights - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Preventing_access|Manual:Preventing access - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:$wgGroupPermissions|Manual:$wgGroupPermissions - MediaWiki]]&lt;br /&gt;
* [https://sudachi.jp/wiki/MediaWiki%E3%81%AE%E8%A8%AD%E5%AE%9A MediaWikiの設定 - すだちWiki]&lt;br /&gt;
&lt;br /&gt;
アクセス管理がユーザーやグループ単位でできる。&lt;br /&gt;
&lt;br /&gt;
$wgGroupPermissions[グループ名][権限] で制御する。いくつか便利な設定、よくやる設定がある。&lt;br /&gt;
 # Prevent new user registrations except by sysops&lt;br /&gt;
 $wgGroupPermissions['*']['createaccount'] = false;&lt;br /&gt;
&lt;br /&gt;
=== Spam ===&lt;br /&gt;
「[[mediawikiwiki:Manual:Combating_spam|Manual:Combating spam - MediaWiki]]」にMediaWikiのスパム対策の基本がまとまっている。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Extension:ConfirmEdit|Extension:ConfirmEdit - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
=== ページ分類方法 ===&lt;br /&gt;
[http://blog.livedoor.jp/lionkid/archives/3096475.html world-walker スタッフ ブログ:MediaWikiのページ分類方法についての考察]&lt;br /&gt;
&lt;br /&gt;
* 名前空間（Namespace）&lt;br /&gt;
* カテゴリ（Category）&lt;br /&gt;
* サブページ（Subpage）&lt;br /&gt;
&lt;br /&gt;
MediaWikiでは上記の3種類のページ分類方法がある。それぞれ一長一短。&lt;br /&gt;
&lt;br /&gt;
だが、基本的にはCategoryでやるのが一番汎用的。1個のページが複数の分類にしたいということがよくある。名前空間とサブページだとそれができない。親は常に1個。住所のような完全に上下関係が一致するなら問題ないが、後で変えるのもたいへん。&lt;br /&gt;
&lt;br /&gt;
=== Category ===&lt;br /&gt;
&lt;br /&gt;
==== About ====&lt;br /&gt;
[[mediawikiwiki:Help:Categories/ja|Help:カテゴリ - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
ページをグループ化する機能。重要。&lt;br /&gt;
&lt;br /&gt;
カテゴリーへのページの追加は、追加対象ページに &amp;lt;nowiki&amp;gt;[[Category:カテゴリ名]]&amp;lt;/nowiki&amp;gt; を追加するだけ。どこでもいい。最下部が一般的。&lt;br /&gt;
&lt;br /&gt;
カテゴリーページ自体へのリンクを張る場合、&amp;lt;nowiki&amp;gt;[[:Category:カテゴリー名]]&amp;lt;/nowiki&amp;gt; のように、先頭に:を付与する。&lt;br /&gt;
&lt;br /&gt;
カテゴリーが未作成なら、同時にカテゴリーの未作成ページができる。カテゴリーページはカテゴリーページで、作成が必要。カテゴリー自体も作成はできる。通常のページ同様に、 [Category:カテゴリー名] で検索して、新規作成する。&lt;br /&gt;
&lt;br /&gt;
新規作成すると、CategoryTree拡張機能で、自動的にカテゴリー一覧が末尾に表示される。&lt;br /&gt;
&lt;br /&gt;
カテゴリー自体も別のカテゴリーに属すことができる。ページ同様に、カテゴリーページに &amp;lt;nowiki&amp;gt;[[Category:カテゴリ名]]&amp;lt;/nowiki&amp;gt; を追加するだけ。&lt;br /&gt;
&lt;br /&gt;
カテゴリーの階層の保守としては、カテゴリーでツリー構造になっているときれい。サブページに近い。カテゴリーでWiki全体を分類してまとめられる。Category:Mainをカテゴリーのルートにするときれいかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== CategoryTree ====&lt;br /&gt;
&lt;br /&gt;
===== About =====&lt;br /&gt;
カテゴリーの一覧表示は、標準拡張機能の「[[mediawikiwiki:Extension:CategoryTree/ja|Extension:CategoryTree - MediaWiki]]」で可能になる。transclude (参照読込) ではできない ([https://stackoverflow.com/questions/1050853/transclude-a-category-in-mediawiki Transclude a category in MediaWiki - Stack Overflow])。&lt;br /&gt;
&lt;br /&gt;
CategoryTreeは以下の3種類の使用方法がある。&lt;br /&gt;
&lt;br /&gt;
# カテゴリーページでデフォルト表示。&lt;br /&gt;
# カスタムタグ (categorytree )。&lt;br /&gt;
# special page ([[特別:CategoryTree|Special:CategoryTree]])&lt;br /&gt;
&lt;br /&gt;
categorytree要素は以下のような形式で使う。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;categorytree showcount=&amp;quot;on&amp;quot; mode=&amp;quot;all&amp;quot;&amp;gt;Main&amp;lt;/categorytree&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
重要なオプションがある。&lt;br /&gt;
&lt;br /&gt;
* mode: 初期値が複雑。namespacesで上書き。なければ、項目が有無で決まる。pages (上限200ページ) かallを指定しておけばいいと思われる。ページ数が膨大ならpages。&lt;br /&gt;
** categories (0): サブカテゴリーのみ。&lt;br /&gt;
** pages (10): 画像を除いた、サブカテゴリーとページ。上限200ページ。&lt;br /&gt;
** all (20): 全部。&lt;br /&gt;
** parents (100): 親のカテゴリーを表示。インバース操作用。&lt;br /&gt;
* showcount: &amp;quot;on&amp;quot;でカテゴリーの記事数表示。categorytree要素でのみデフォルトoff。&lt;br /&gt;
&lt;br /&gt;
===== デフォルト展開 =====&lt;br /&gt;
CategoryTreeのcategorytree要素を使うと、カテゴリー一覧を表示できる。が、クリックしないと展開されないのが、余計なクリックが必要で嫌。&amp;lt;blockquote&amp;gt;&lt;br /&gt;
; depth&lt;br /&gt;
: determines how many levels of the tree are shown initially. Default is 1. 0 means only the root node. The maximum value depends on the mode specified, and on the &amp;lt;code&amp;gt;$wgCategoryTreeMaxDepth&amp;lt;/code&amp;gt; option. (Introduced between [[/static-codereview.wikimedia.org/MediaWiki/20410.html|r20410]] and [[/static-codereview.wikimedia.org/MediaWiki/20840.html|r20840]], Mar 30 2007; fully functional even with &amp;lt;code&amp;gt;$wgCategoryTreeDynamicTag&amp;lt;/code&amp;gt; since [[/static-codereview.wikimedia.org/MediaWiki/36864.html|r36864]], July 2008.)&lt;br /&gt;
&lt;br /&gt;
; $wgCategoryTreeMaxDepth&lt;br /&gt;
: an array defining the maximum depth for each [[/www.mediawiki.org/wiki/Extension:CategoryTree#Modes|mode]], to which the tree may be expanded initially using the depth parameter in a &amp;lt;category&amp;gt; tag. By default, this is set to 2 for the &amp;quot;categories&amp;quot; mode, and 1 for other modes. To set it to 3 for categories and 2 for other modes, for example, you can use &amp;lt;code&amp;gt;$wgCategoryTreeMaxDepth = [10 =&amp;gt; 2, 20 =&amp;gt; 2, 0 =&amp;gt; 3, 100 =&amp;gt; 2];&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;このあたりの、オプションと設定を使うと、うまくできる。&lt;br /&gt;
&lt;br /&gt;
基本はdepthで最大展開表示数を制御する。ただし、性能の制御のために$wgCategoryTreeMaxDepthで上限が決まっている。デフォルトで、mode=&amp;quot;categories&amp;quot;=2、他は1になっている。&lt;br /&gt;
 $wgCategoryTreeMaxDepth = [20 =&amp;gt; 9];&lt;br /&gt;
そんなに階層が何重にもなることは想定していないが、上記のようにLocalSettings.phpでallの最大を1から9に変更する。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;categorytree showcount=&amp;quot;on&amp;quot; mode=&amp;quot;all&amp;quot; depth=&amp;quot;9&amp;quot;&amp;gt;Main&amp;lt;/categorytree&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
加えて、上記のようにdepth=&amp;quot;9&amp;quot;を指定すると反映される。膨大なWikiで9が重いなら、上限を変える。これで一括管理できる仕組みな模様。&lt;br /&gt;
&lt;br /&gt;
「[https://stackoverflow.com/questions/37348060/mediawiki-category-tree-expand-all-by-default MediaWiki Category Tree expand all by default - Stack Overflow]」が関連Q&amp;amp;Aだが、回答が的外れになっている。&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
日本語にすると、ヘルプとか特別とかが日本語のURLになるのが嫌。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:Language/en|Manual:Language - MediaWiki]]」&lt;br /&gt;
&lt;br /&gt;
Page content languageで変更できる？&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:FAQ|Manual:FAQ - MediaWiki]]」&lt;br /&gt;
&lt;br /&gt;
Special:Allmessagesにシステムメッセージのリストがある。例えば、「特別ページ」は「specialpage 」が対応している。[Special:AllMessages] は「システムメッセージの一覧」 で対応している。&lt;br /&gt;
&lt;br /&gt;
[MediaWiki:Allmessages] のページでシステムメッセージが格納されている。[MediaWiki:Allmessages/ja] で言語対応が出る。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:$wgUseDatabaseMessages|Manual:$wgUseDatabaseMessages - MediaWiki]]」で選択できる。falseにするとwpLanguageCodeで強制指定。trueだと自分で変更できる。&lt;br /&gt;
&lt;br /&gt;
「[https://github.com/wikimedia/mediawiki/blob/1.42.1/languages/i18n/en.json mediawiki/languages/i18n/en.json at 1.42.1 · wikimedia/mediawiki]」が言語対応の一覧。ここから探すとよい。&lt;br /&gt;
&lt;br /&gt;
特に重要なもの。&lt;br /&gt;
&lt;br /&gt;
* nstab: 名前空間類のプレフィクスの模様。&lt;br /&gt;
* nstab-special Special&lt;br /&gt;
* specialpage&lt;br /&gt;
* specialpages 特別ページ一覧&lt;br /&gt;
* nstab-&lt;br /&gt;
* mainpage&lt;br /&gt;
&lt;br /&gt;
Special:の扱いがよくわからない。カテゴリーじゃなくて名前空間。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Manual:Configuration_settings|Manual:Configuration settings - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Manual:Special_pages|Manual:Special pages - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
The Special pseudo namespace can be translated in other languages. 翻訳可能。「[[mediawikiwiki:Manual:Namespace|Manual:Namespace - MediaWiki]]」によると、「[[mediawikiwiki:Manual:$wgNamespaceAliases|Manual:$wgNamespaceAliases - MediaWiki]]」で翻訳可能？&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:Namespace_constants|Manual:Namespace constants - MediaWiki]]」が定数。&lt;br /&gt;
&lt;br /&gt;
NS_SPECIALを指定すると、翻訳が無効になる？&lt;br /&gt;
 $wgNamespaceAliases['特別'] = NS_SPECIAL;&lt;br /&gt;
「[[mediawikiwiki:Topic:T9rltht3umy9zj8c|How to switch from german namespace to english? on Project:Support desk]]」これが近い。&lt;br /&gt;
&lt;br /&gt;
/jaなど言語ページもあって、変更できる。が、パーマリンクは変わらない。別のところ。&amp;lt;blockquote&amp;gt;[[/www.mediawiki.org/wiki/User:Ciencia Al Poder|&amp;lt;bdi&amp;gt;Ciencia Al Poder&amp;lt;/bdi&amp;gt;]] ([[/www.mediawiki.org/wiki/User talk:Ciencia Al Poder|talk]][[/www.mediawiki.org/wiki/Special:Contributions/Ciencia Al Poder|contribs]])&lt;br /&gt;
&lt;br /&gt;
What you can control in the MediaWiki namespace is the text of the tab, not the namespace itself (eg: when linking to pages in that namespace or the displayed URL). See [[/www.mediawiki.org/wiki/Manual:Using custom namespaces|Manual:Using custom namespaces]]&amp;lt;/blockquote&amp;gt;nstab系はタブテキストなどで、URLは変わらない。&lt;br /&gt;
&lt;br /&gt;
Special:AllMessagesからnstab-category nstab-category/jaをCategoryに直したがパーマリンクは反映されず。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Help:System_message|Help:System message - MediaWiki]]」にシステムメッセージの変更方法がある。&lt;br /&gt;
&lt;br /&gt;
まず、Special:AllMessagesのページに、システムメッセージの全リストがある。「[https://github.com/wikimedia/mediawiki/blob/1.42.1/languages/i18n/en.json mediawiki/languages/i18n/en.json at 1.42.1 · wikimedia/mediawiki]」がソースコードの対応。&lt;br /&gt;
&lt;br /&gt;
en.jsonのja.jsonを変更する？&lt;br /&gt;
&lt;br /&gt;
この画面から編集できる。変更方法が一応2種類ある。&lt;br /&gt;
&lt;br /&gt;
# [MediaWiki:メッセージキー] のページの値を変更。&lt;br /&gt;
# Special:AllMessagesの左側のリンクで上記ページにアクセス (既定のメッセージ文が使用されている場合、ページが不在というわけではなく、編集ページが空のためリンクが赤色になっている)。&lt;br /&gt;
nstab-categoryを変更しても、URLは変わらない。&lt;br /&gt;
&lt;br /&gt;
ChatGPTへの質問。&lt;br /&gt;
&lt;br /&gt;
MediaWikiの名前空間の翻訳を無効にする方法を教えてください。&lt;br /&gt;
&lt;br /&gt;
====== ChatGPT: ======&lt;br /&gt;
MediaWikiで名前空間の翻訳を無効にするには、以下の手順を実行します：&lt;br /&gt;
&lt;br /&gt;
# '''&amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; ファイルの編集''': MediaWikiの設定ファイルである &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; を開きます。このファイルは、MediaWikiインストールディレクトリにあります。&lt;br /&gt;
# '''翻訳を無効にする設定の追加''': &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; に以下の設定を追加します。この設定により、指定した名前空間の翻訳を無効にすることができます。&lt;br /&gt;
&lt;br /&gt;
 // 名前空間の翻訳を無効にする&lt;br /&gt;
 $wgTranslateLinks = false;&lt;br /&gt;
&lt;br /&gt;
# この設定を追加することで、すべての名前空間の翻訳が無効になります。&lt;br /&gt;
# '''特定の名前空間の翻訳を無効にする''': 特定の名前空間だけ翻訳を無効にしたい場合は、より具体的な設定を追加する必要があります。たとえば、「ユーザー」名前空間（&amp;lt;code&amp;gt;User&amp;lt;/code&amp;gt;）の翻訳を無効にするには、以下のように設定を追加します。&lt;br /&gt;
&lt;br /&gt;
 $wgNamespaceAliases = array(&lt;br /&gt;
     NS_USER =&amp;gt; 'User'&lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
 $wgTranslateLinks = false;&lt;br /&gt;
&lt;br /&gt;
# これにより、「ユーザー」名前空間の翻訳が無効になります。必要に応じて、他の名前空間も設定できます。&lt;br /&gt;
# '''設定の保存''': &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; を保存し、MediaWikiを再起動する必要があります。これにより、新しい設定が適用されます。&lt;br /&gt;
# '''確認''': 設定が正しく適用されているか確認するため、MediaWikiのインターフェースを確認し、指定した名前空間で翻訳が無効になっていることを確認します。&lt;br /&gt;
&lt;br /&gt;
この手順で、MediaWikiで名前空間の翻訳を無効にすることができます。必要に応じて、設定を調整してください。&lt;br /&gt;
&lt;br /&gt;
wgTranslateLinksは存在しない嘘だが、「[[mediawikiwiki:Manual:$wgNamespaceAliases/ja|Manual:$wgNamespaceAliases - MediaWiki]]」は使えそう。&lt;br /&gt;
&lt;br /&gt;
[https://www.hostknox.com/knowledgebase/686/How-to-add-namespace-aliases-in-MediaWiki.html HostKnox :: ナレッジベース :: MediaWiki に名前空間エイリアスを追加する方法]&lt;br /&gt;
&lt;br /&gt;
* 「[https://vanguardflight.xii.jp/wp/2014/03/30/313/ MediaWikiにExtension:Scribuntoをインストール – Remove Before Flight]」&lt;br /&gt;
* [https://vanguardflight.xii.jp/wp/2014/03/26/300/ MediaWikiのインストール手順 – Remove Before Flight]&lt;br /&gt;
&lt;br /&gt;
エイリアスを追加するか、ソースコードの変更がやはり必要だと思われる。&lt;br /&gt;
&lt;br /&gt;
「[[mediawikiwiki:Manual:$wgNamespaceAliases/ja|Manual:$wgNamespaceAliases - MediaWiki]]」を見ていたら、[[mediawikiwiki:Manual:$wgExtraNamespaces|Manual:$wgExtraNamespaces - MediaWiki]]が登場して、既定の名前空間の改名にも使えるらしい。「[[mediawikiwiki:Manual:Using_custom_namespaces|Manual:Using custom namespaces - MediaWiki]]」を見ると。&lt;br /&gt;
 define(&amp;quot;NS_FOO&amp;quot;, 3000);&lt;br /&gt;
 $wgExtraNamespaces[NS_FOO] = &amp;quot;Foo&amp;quot;;&lt;br /&gt;
以下のように名前を変更すると、改名できるらしい。&lt;br /&gt;
 define(&amp;quot;NS_FOO&amp;quot;, 3000);&lt;br /&gt;
 $wgExtraNamespaces[NS_FOO] = &amp;quot;New&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['Foo'] = NS_FOO;&lt;br /&gt;
本当かな？&lt;br /&gt;
&lt;br /&gt;
[[mediawikiwiki:Manual:Namespace_constants|Manual:Namespace constants - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
以下のコードでうまくいった。&lt;br /&gt;
 // Rename namespace to keep English&lt;br /&gt;
 $wgExtraNamespaces[NS_USER] = &amp;quot;User&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['利用者'] = NS_USER;&lt;br /&gt;
 $wgExtraNamespaces[NS_CATEGORY] = &amp;quot;Category&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['カテゴリ'] = NS_CATEGORY;&lt;br /&gt;
 $wgExtraNamespaces[NS_SPECIAL] = &amp;quot;Special&amp;quot;;&lt;br /&gt;
 $wgNamespaceAliases['特別'] = NS_SPECIAL;&lt;br /&gt;
特別など他のページもこれで全部英語に戻す。&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== Conflict ====&lt;br /&gt;
複数のタブで同じページをGUIで編集して、更新すると、後の更新で前の更新が上書きされる。順番に注意する。&lt;br /&gt;
&lt;br /&gt;
GUIじゃなくて、ソースエディットで節単位だと問題ないのかもしれない。&lt;br /&gt;
&lt;br /&gt;
==== Snippet ====&lt;br /&gt;
https://chatgpt.com/c/6747d5d5-57ec-800b-97ec-e00c1e87a2fc&lt;br /&gt;
&lt;br /&gt;
[https://www.wingfield.gr.jp/archives/4387 Mediawiki でのスニペット管理を考える - WINGFIELD since1995]&lt;br /&gt;
&lt;br /&gt;
MediaWikiでコードスニペットの管理。&lt;br /&gt;
&lt;br /&gt;
# 本文に埋め込み: 長いとみにくいかも。&lt;br /&gt;
# ファイルアップロード機能: 検索不能で編集履歴も追跡不能。&lt;br /&gt;
# VCSサービスの埋め込み。&lt;br /&gt;
&lt;br /&gt;
短文は埋め込み、長くなったらファイルアップロード。がいいかな。&lt;br /&gt;
&lt;br /&gt;
==== Media ====&lt;br /&gt;
画像などをアップロードする場合、ファイル名はサイト全体で固有である必要がある。いい加減なファイル名にはせずに、意味がわかるファイル名を心掛ける。&lt;br /&gt;
&lt;br /&gt;
アップロード後のファイルの改名は少々手間がかかる。「拡張機能: Renameuser/RenameFiles」の拡張機能を使うとよい。&lt;br /&gt;
&lt;br /&gt;
== Markup ==&lt;br /&gt;
&lt;br /&gt;
=== Transclusion ===&lt;br /&gt;
MeidaWikiでは他のページの内容を埋め込むことが可能で、この機能を [Transclusion/参照読み込み](https://www.mediawiki.org/wiki/Transclusion) と呼んでいる。&lt;br /&gt;
&lt;br /&gt;
{{&amp;lt;page name&amp;gt;}} のように、二重波括弧でページ名を指定すると埋め込める。埋め込み元で、埋め込みの許可・禁止ブロックをマークアップで指定することもできる。&lt;br /&gt;
&lt;br /&gt;
参照読み込み可能な特別ページは限定されていて、以下となる。&lt;br /&gt;
&lt;br /&gt;
* Special:AllPages&lt;br /&gt;
* Special:PrefixIndex&lt;br /&gt;
* Special:NewFiles&lt;br /&gt;
* Special:NewPages&lt;br /&gt;
* Special:RecentChanges&lt;br /&gt;
* Special:RecentChangesLinked. &lt;br /&gt;
&lt;br /&gt;
トップページでの埋め込み表示などで便利なものがある。AllPages/NewPages/RecentChangesあたりが特に便利そうだ。&lt;br /&gt;
&lt;br /&gt;
テンプレート的な使い方などで、駆使できると便利だろう。&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
MediaWikiでHTMLの要素をいくつか使用できる。&lt;br /&gt;
&lt;br /&gt;
* [[mediawikiwiki:Help:Formatting|Help:Formatting - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:HTML_restriction|HTML restriction - MediaWiki]]&lt;br /&gt;
* [[mediawikiwiki:Help:HTML_in_wikitext|Help:HTML in wikitext - MediaWiki]]&lt;br /&gt;
&lt;br /&gt;
LocalSetting.phpで$wgRawHtml = true (デフォルトfalse) にすれば、html要素内でHTMLを無制限で使用可能になる。&lt;br /&gt;
&lt;br /&gt;
=== Page ===&lt;br /&gt;
Ref: [[mediawikiwiki:Topic:Ua1cqlfd07kyvd8p|How to Embed List of All Namespace-Pages in a Wiki Page? on Project:Support desk]]&lt;br /&gt;
&lt;br /&gt;
カスタム名前空間Privateで非公開ページを作ったら、Privateのページ一覧をメインページに表示させたくなった。若干工夫がいる。&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Special:Prefixindex/&amp;lt;custom namespace&amp;gt;:}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;custom namespace&amp;gt;部分にカスタム名前空間を指定する。これで一覧ページを開ける。大事なのは末尾の:。これで先頭一致でページ一覧のページになっている。これをtransclusionする形。&lt;br /&gt;
==Setting==&lt;br /&gt;
&lt;br /&gt;
===Private===&lt;br /&gt;
特定ページを非公開にすることができる。後日方法を精査する。&lt;br /&gt;
&lt;br /&gt;
*[https://irineko.hatenablog.com/entry/2021/01/06/194908 mediawiki 特定のページの閲覧制限をしたい。 - 人狼wiki更新情報]&lt;br /&gt;
*[[mediawikiwiki:Manual:Preventing_access/ja|Manual:アクセス制限 - MediaWiki]]&lt;br /&gt;
全体設定としては以下がある。基本非公開で一部公開の場合に使える。&lt;br /&gt;
 # Disable reading by anonymous users&lt;br /&gt;
 $wgGroupPermissions['*']['read'] = false;&lt;br /&gt;
 &lt;br /&gt;
 # Disable anonymous editing&lt;br /&gt;
 $wgGroupPermissions['*']['edit'] = false;&lt;br /&gt;
 &lt;br /&gt;
 # Prevent new user registrations except by sysops&lt;br /&gt;
 $wgGroupPermissions['*']['createaccount'] = false;&lt;br /&gt;
今回は基本公開で一部非公開。&lt;br /&gt;
&lt;br /&gt;
*ユーザー属性での管理。&lt;br /&gt;
*名前空間での管理 (LockDown拡張機能)。&lt;br /&gt;
&lt;br /&gt;
Lockdownを試す。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/02/03/10009/ 機能: MediaWikiでのLockdown拡張を用いた名前空間単位の非公開ページ | GNU social JP Web]」に記した。&lt;br /&gt;
&lt;br /&gt;
=== $wgCapitalLinks===&lt;br /&gt;
出典: [[mediawikiwiki:Manual:$wgCapitalLinks|Manual:$wgCapitalLinks - MediaWiki]]。&lt;br /&gt;
&lt;br /&gt;
MediaWikiはデフォルトでページ名やページURLの先頭1文字目が大文字になる。&lt;br /&gt;
&lt;br /&gt;
$wgCapitalLinks = falseにするとこれを無効にできる。大文字小文字を完全に区別する。例えば、iPhoneなどのように、大文字小文字が重要なことがあるので、falseにしておくのがよいと思う。リンク切れにも影響するので最初の方で設定するとよい。&lt;br /&gt;
&lt;br /&gt;
==Other==&lt;br /&gt;
&lt;br /&gt;
===Analytics===&lt;br /&gt;
サイトのアクセス分析のためにGoogle Analyticsを設置したい。いくつか拡張機能がある。GA4対応が重要な項目。&lt;br /&gt;
&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_Analytics_Integration|Extension:Google Analytics Integration - MediaWiki]]: 翻訳は更新されているがベースコードは2017年のv3.0.1で古い。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleAnalyticsMetrics|Extension:GoogleAnalyticsMetrics - MediaWiki]]: 2023-01 v1.0.2。Google Analyticsからメトリクスを取得して挿入する。アクセスカウンター的な拡張機能な模様 (関連: [[mediawikiwiki:Extension:HitCounters|Extension:HitCounters - MediaWiki]])。&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_Analytics_Links|Extension:Google Analytics Links - MediaWiki]]: 2009年v1.2。古い。MediaWiki v1.39以上で動作しない。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleAnalyticsTopPages|Extension:GoogleAnalyticsTopPages - MediaWiki]]: 2014年v0.0.1。アクセス上位ページのリストを生成する。&lt;br /&gt;
*[[mediawikiwiki:Extension:GoogleTagManager|Extension:GoogleTagManager - MediaWiki]]: 2023年v.1.1。Google Tag Managerを設置する。&lt;br /&gt;
*[[mediawikiwiki:Extension:GTag|Extension:GTag - MediaWiki]]、[https://mirukupc.com/2022/04/01/?p=169 MediaWikiでGoogle AnalyticsのGA4を使う - ミルクPCのブログ] (GTag): 2023 v1.3.0。新しいGoogle Analyticsのトラッキングタグに対応している。&lt;br /&gt;
*[https://github.com/harugon/Gtm GitHub - harugon/Gtm: MediaWikiにGoogle Tag Managerを追加します]: Google Tag Manager。&lt;br /&gt;
*[[mediawikiwiki:Extension:Matomo|Extension:Matomo - MediaWiki]]: Google Analyticsではない分析サービスの拡張機能。&lt;br /&gt;
&lt;br /&gt;
公式プラグインを優先したい。&lt;br /&gt;
&lt;br /&gt;
GTag、GoogleTagManager。これらが設置用にみえる。詳細に検討してみる。Google Tag ManagerはAnalyticsを含めて汎用的なことができる。ひとまずよくわからないので、シンプルなGTagを使ってみるとよさそう。&lt;br /&gt;
&lt;br /&gt;
「[https://web.gnusocial.jp/post/2024/01/04/9756/ 拡張: MediaWikiのGoogle Analytics追跡拡張機能GTag | GNU social JP Web]」で設置した。&lt;br /&gt;
&lt;br /&gt;
=== Advertise===&lt;br /&gt;
&lt;br /&gt;
====広告ブロッカー対策====&lt;br /&gt;
出典: [https://dajya-ranger.com/pukiwiki/defend-site-content-for-pukiwiki/ 【PukiWiki編】広告ブロッカーからサイトコンテンツと収益を守る！ | SEの良心]。&lt;br /&gt;
&lt;br /&gt;
MediaWikiでも同様の方法で広告ブロッカー対策を導入できそう。&lt;br /&gt;
&lt;br /&gt;
====Adsense====&lt;br /&gt;
Google Adsense設置用のプラグインがいくつかある。&lt;br /&gt;
&lt;br /&gt;
*[[mediawikiwiki:Extension:Google_AdSense|Extension:Google AdSense - MediaWiki]]: MediaWiki v1.37以上で非互換。&lt;br /&gt;
*[[mediawikiwiki:Extension:ShoutWiki_Ads|Extension:ShoutWiki Ads - MediaWiki]]&lt;br /&gt;
*[[mediawikiwiki:Extension:Widgets|Extension:Widgets - MediaWiki]]&lt;br /&gt;
*[https://knowledge.rinpress.com/index.php/MediaWiki%E3%81%ABGoogle_AdSense%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F MediaWikiにGoogle AdSenseを追加してみた - とある社畜の頭脳整理]、[https://dococo.jp/index.php/Mediawiki%E3%81%A7Google_Adsense%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95 MediawikiでGoogle Adsenseを表示させる方法 - dococo wiki]、[https://dococo.jp/index.php?title=MediaWiki%E3%81%A7Google_Adcence MediaWikiでGoogle Adcence - dococo wiki]: HTMLetsを使うらしい。&lt;br /&gt;
&lt;br /&gt;
ShoutWiki AdsかWidgetsで設置する模様。基本はJavaScriptコードの設置。&lt;br /&gt;
&lt;br /&gt;
[[Category:Other]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=547</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=547"/>
		<updated>2024-12-29T01:50:40Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、インポートに時間がかかって、処理が中断する可能性が高い。&lt;br /&gt;
&lt;br /&gt;
この作業はインポートの初回だけなので、コミット履歴が1000以上の膨大な場合、ローカルパソコンで作業して、インポート完了後のsqliteファイルだけ転送した方が確実。&lt;br /&gt;
&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
実行が完了すると以下が表示される。&lt;br /&gt;
 project-id: 6ebf1a799a9d9fd8fcb55a9a6c816fadcc2e0e4f&lt;br /&gt;
 server-id:  e45ff282026d409ea80f78f6d1ea62d663b31dda&lt;br /&gt;
 admin-user: password is &amp;quot;password&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 sh -c   451.82s user 27.95s system 96% cpu 8:16.84 total&lt;br /&gt;
このパスワードが管理画面の初期パスワードなので重要。保存しておく。gnusocial.fossilのサイズは225MBだった。&lt;br /&gt;
&lt;br /&gt;
作成したgnusocial.fossilを共用サーバーの~/public_html/fossilに配置する。[https://fossil.gnusocial.jp/fossil/gnusocial/index&amp;lt;nowiki&amp;gt;] でアクセスできる。&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この後、Fossilの設定をいろいろ行う。特に重要なのがダウンロードページの作成。このページの作成が、composerなどの外部パッケージの配布などと密接に絡んでくるので重要。&lt;br /&gt;
&lt;br /&gt;
後は、GNU social関係のプロジェクトのアーカイブもしたい。&lt;br /&gt;
&lt;br /&gt;
* plugin&lt;br /&gt;
* theme&lt;br /&gt;
* tool&lt;br /&gt;
&lt;br /&gt;
上記の3ディレクトリーでサードパーティーのツール類を全部取り込んでここで一元管理したい。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=546</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=546"/>
		<updated>2024-12-29T00:55:44Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Repository&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/trunk/www/inout.wiki Fossil: Import And Export]&lt;br /&gt;
&lt;br /&gt;
Fossil自体の用意はできたので、public_html/fossilにリポジトリーを配置する。GitからFossilへの変換が必要となる。&lt;br /&gt;
&lt;br /&gt;
この作業は緊張する。&lt;br /&gt;
&lt;br /&gt;
# git cloneでgitリポジトリーをローカルに取得。&lt;br /&gt;
# fossilに取り込む。&lt;br /&gt;
&lt;br /&gt;
共用サーバーで作業する場合、リポジトリーの取得に時間がかかる可能性があるので、ネットワーク帯域の節約のため分割して確実に取得する。&lt;br /&gt;
 cd ~/public_html/fossil&lt;br /&gt;
まず以下のコマンドでgitリポジトリー全体を取得する。&lt;br /&gt;
 git clone --depth 1 https://notabug.org/gnusocialjp/gnusocial&lt;br /&gt;
 cd gnusocial&lt;br /&gt;
 git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'&lt;br /&gt;
 git fetch --unshallow&lt;br /&gt;
 cd ..&lt;br /&gt;
以下のコマンドでgitリポジトリーをFossilリポジトリーに変換する。&lt;br /&gt;
 git -C gnusocial fast-export --all | fossil import --git gnusocial.fossil&lt;br /&gt;
このコマンドは実行に時間がかかるからローカルパソコンでやったほうがいいかもしれない。あるいは、再開する方法がないか？&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=545</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=545"/>
		<updated>2024-12-29T00:29:42Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* CGI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
* Web Server=Apache HTTP Server 2.4.37&lt;br /&gt;
* OS=GNU/Linux&lt;br /&gt;
なお、「 [https://fossil-scm.org/home/doc/tip/www/server/ Fossil: How To Configure A Fossil Server]」に記載があるように、Fossil自体はFastCGI/SCGI/単独サーバーに対応している。ただ、FastCGIはOpenBSDのhttpd専用。残り2個は常駐プロセスで共用サーバーでは安定稼働できないのでCGIを選ぶ。&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。&lt;br /&gt;
&lt;br /&gt;
* https://fossil.gnusocial.jp/&lt;br /&gt;
* https://fossil.gnusocial.jp/fossil&lt;br /&gt;
&lt;br /&gt;
あとはFossilリポジトリーの用意。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=544</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=544"/>
		<updated>2024-12-29T00:21:19Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: /* CGI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
情報源&lt;br /&gt;
&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/server/any/cgi.md Fossil: Serving via CGI]&lt;br /&gt;
* [https://fossil-scm.org/home/doc/tip/www/cgi.wiki Fossil: CGI Script Configuration Options]&lt;br /&gt;
&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。あとはFossilリポジトリーの用意。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=543</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=543"/>
		<updated>2024-12-29T00:19:40Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: Install&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GNU social]]&lt;br /&gt;
==About==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
*phorge&lt;br /&gt;
*trac&lt;br /&gt;
*kallithea&lt;br /&gt;
*fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
*CGIで動作&lt;br /&gt;
*リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
==Install==&lt;br /&gt;
&lt;br /&gt;
=== Condition ===&lt;br /&gt;
wiki.gnusocial.jpなどをホストしているCORESERVERに追加する形でインストールする。&lt;br /&gt;
&lt;br /&gt;
* ドメイン=fossil.gnusocial.jp&lt;br /&gt;
* ホスティングサービス=CORESERVER&lt;br /&gt;
* 方式=CGI&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
情報源=[https://fossil-scm.org/home/doc/trunk/www/index.wiki Fossil: A Coherent Software Configuration Management System]&lt;br /&gt;
&lt;br /&gt;
インストールに先立って、fossilのバイナリーを取得する。&lt;br /&gt;
&lt;br /&gt;
ソースコードからコンパイルするか、コンパイル済みバイナリーを配置するだけ。設置先の共用サーバーにログインして、以下のコマンドを実行する。&lt;br /&gt;
 VER=2.25&lt;br /&gt;
 mkdir -p ~/.local/stow/fossil-$VER ~/.local/bin&lt;br /&gt;
 cd ~/.local/stow/fossil-$VER&lt;br /&gt;
 curl -O [https://fossil-scm.org/home/uv/fossil-linux-x64-2.25.tar.gz https://fossil-scm.org/home/uv/fossil-linux-x64-$VER.tar.gz]&lt;br /&gt;
 tar -xf fossil-$VER.*&lt;br /&gt;
 ln -fns ../stow/fossil-$VER/fossil ../../bin/&lt;br /&gt;
.bashrcなどに以下を記入して、PATHを設定しておく。&lt;br /&gt;
 export PATH=&amp;quot;$PATH:~/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== CGI ===&lt;br /&gt;
バイナリーを取得したので、CGIで動作させるために設定する。&lt;br /&gt;
&lt;br /&gt;
ディレクトリー構成は以下とする。&lt;br /&gt;
&lt;br /&gt;
* public_html&lt;br /&gt;
** fossil: fossilリポジトリーの格納場所。&lt;br /&gt;
** fossil.gnusocial.jp: 公開ディレクトリー。&lt;br /&gt;
*** .htaccess&lt;br /&gt;
*** fossil: FossilのCGI。&lt;br /&gt;
*** index.html&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでディレクトリーを作ってCGIファイルなどを配置する。&lt;br /&gt;
 mkdir -p ~/public_html/fossil ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 cd ~/public_html/fossil.gnusocial.jp&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;.htaccess&lt;br /&gt;
 &amp;lt;FilesMatch fossil$&amp;gt;&lt;br /&gt;
 	SetHandler cgi-script&lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-EOT &amp;gt;fossil&lt;br /&gt;
 #!$HOME/.local/bin/fossil&lt;br /&gt;
 directory: $HOME/public_html/fossil&lt;br /&gt;
 notfound: /fossil&lt;br /&gt;
 repolist&lt;br /&gt;
 EOT&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;lt;&amp;lt;-'EOT' &amp;gt;index.html&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;html lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot; xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;SENOO, Ken&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;GNU social JP Fossil&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;GNU social JP Fossil&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     &amp;lt;main&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;This site hosts GNU social fossil repositories.&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
 &amp;lt;section&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;Link&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil&amp;quot;&amp;gt;fossil&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: repository list.&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;fossil/gnusocial&amp;quot;&amp;gt;fossil/gnusocial&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;: GNU social main repository&amp;lt;nowiki&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;/section&amp;gt;&lt;br /&gt;
     &amp;lt;/main&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
index.htmlは仮。必要になったタイミングで、内容やスタイルを改良する。&lt;br /&gt;
&lt;br /&gt;
これで一旦稼働する。あとはFossilリポジトリーの用意。&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=542</id>
		<title>GNU social JP Fossil</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=GNU_social_JP_Fossil&amp;diff=542"/>
		<updated>2024-12-29T00:01:32Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: 新規作成。&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Category:GNU social]]&lt;br /&gt;
&lt;br /&gt;
== About ==&lt;br /&gt;
GNUプロジェクトのソースコードのホスティングには、フリーソフトを使用したサービスしか使用できない。&lt;br /&gt;
&lt;br /&gt;
それもあって、リポジトリーを自己ホストするために調査した。&lt;br /&gt;
&lt;br /&gt;
* phorge&lt;br /&gt;
* trac&lt;br /&gt;
* kallithea&lt;br /&gt;
* fossil&lt;br /&gt;
&lt;br /&gt;
上記4ソフトのインストール・動作を2024-12に検証 (https://gnusocial.jp/notice/8089277) して、その結果fossilに決めた。fossslが唯一以下を満たした。&lt;br /&gt;
&lt;br /&gt;
* CGIで動作&lt;br /&gt;
* リポジトリーと管理UIの統合&lt;br /&gt;
&lt;br /&gt;
Tracもインストールはできたが、これはBTS機能のみで、リポジトリー自体のホスティングはgitwebやcgitなど別サービスが必要だった。2個に分かれるのが面倒くさい。&lt;br /&gt;
&lt;br /&gt;
FossilはSQLiteの著者が管理するプロジェクト。Gitが使いにくいと思っており、そこをうまく解消している。さすがのプロジェクト。&lt;br /&gt;
&lt;br /&gt;
== Work ==&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=pump.io&amp;diff=541</id>
		<title>pump.io</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=pump.io&amp;diff=541"/>
		<updated>2024-12-22T04:11:22Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: カテゴリー追加&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
* [https://pump.io/ pump.io]&lt;br /&gt;
&lt;br /&gt;
Evan ProdromouがGNU social/StatusNetの開発を放棄して取り組んだ分散SNSソフトウェア。ActivityPubのベースとなっている実装。&lt;br /&gt;
&lt;br /&gt;
StatusNet/GNU socialだったidenti.caも途中でpump.ioを使うように変更された。&lt;br /&gt;
&lt;br /&gt;
== Client ==&lt;br /&gt;
&lt;br /&gt;
* [https://savannah.nongnu.org/projects/dianara Dianara - Summary [Savannah]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Distributed]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
	<entry>
		<id>https://wiki.gnusocial.jp/index.php?title=pump.io&amp;diff=540</id>
		<title>pump.io</title>
		<link rel="alternate" type="text/html" href="https://wiki.gnusocial.jp/index.php?title=pump.io&amp;diff=540"/>
		<updated>2024-12-22T04:10:34Z</updated>

		<summary type="html">&lt;p&gt;Gnusocialjp: New.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
&lt;br /&gt;
* [https://pump.io/ pump.io]&lt;br /&gt;
&lt;br /&gt;
Evan ProdromouがGNU social/StatusNetの開発を放棄して取り組んだ分散SNSソフトウェア。ActivityPubのベースとなっている実装。&lt;br /&gt;
&lt;br /&gt;
StatusNet/GNU socialだったidenti.caも途中でpump.ioを使うように変更された。&lt;br /&gt;
&lt;br /&gt;
== Client ==&lt;br /&gt;
&lt;br /&gt;
* [https://savannah.nongnu.org/projects/dianara Dianara - Summary [Savannah]]&lt;/div&gt;</summary>
		<author><name>Gnusocialjp</name></author>
	</entry>
</feed>