#author("2025-07-03T11:01:52+09:00","default:dramsukohome","dramsukohome")
#author("2025-07-03T11:03:41+09:00","default:dramsukohome","dramsukohome")
[[LinuxServer]]

#contents();



# なぜ pukiwiki から wiki.js へ移行しようと思ったか 1
1. コメントの受け付けしたい
1. スパムがやだ
1. 過去にストーカー被害にあったこともあり、特定のユーザーを拒否できる仕組みを実装したい
1. ユーザーが、ユーザー自身を登録できる wiki が良いなぁ。。。 -> wiki.js となりました。



## なぜ pukiwiki から wiki.js へ移行しようと思ったか 2
- 自分、 markdown 言語が大好きだから。
- 正直、書いてると落ち着きます。。。




# 目次
 <!-- toc -->
- [目次](#目次)
- [なぜ pukiwiki から wiki.js へ移行しようと思ったか 1](#なぜ-pukiwiki-から-wikijs-へ移行しようと思ったか-1)
	- [なぜ pukiwiki から wiki.js へ移行しようと思ったか 2](#なぜ-pukiwiki-から-wikijs-へ移行しようと思ったか-2)
- [目次](#目次-1)
- [公式リンク(top)](#公式リンクtop)
	- [Editor - Markdown](#editor---markdown)
	- [Editor - MarkDown(日本語)](#editor---markdown日本語)
- [前提](#前提)
	- [環境](#環境)
	- [他に検討したもの](#他に検討したもの)
- [構築](#構築)
	- [構築コマンド](#構築コマンド)
	- [MariaDBへ切り替え](#mariadbへ切り替え)
		- [なぜ?](#なぜ)
		- [参考サイト](#参考サイト)
		- [MariaDB のインストールと自動起動設定,起動](#mariadb-のインストールと自動起動設定起動)
		- [初期設定](#初期設定)
		- [(MariaDB) wiki.js用ユーザーの作成とデータベースの作成](#mariadb-wikijs用ユーザーの作成とデータベースの作成)
		- [wiki.js の変更](#wikijs-の変更)
		- [backup](#backup)
- [設定変更](#設定変更)
	- [config.yml の場所,Path](#configyml-の場所path)
	- [SSL(TLS)化](#ssltls化)
	- [dataPAth: の変更](#datapath-の変更)
	- [faviconの変更](#faviconの変更)
	- [Web画面からの設定変更](#web画面からの設定変更)
		- [全般設定](#全般設定)
		- [言語](#言語)
		- [ナビゲーション](#ナビゲーション)
		- [グループ](#グループ)
		- [アナリティクス](#アナリティクス)
		- [セキュリティ](#セキュリティ)
- [記事の作成関連](#記事の作成関連)
	- [markdown](#markdown)
		- [User's manual(公式)](#users-manual公式)
		- [書式の設定方法(参考サイト)](#書式の設定方法参考サイト)
		- [designet(参考サイト)](#designet参考サイト)
			- [ブロッククォート(箇条書きと組み合わせない場合、使用可能です)](#ブロッククォート箇条書きと組み合わせない場合使用可能です)
			- [脚注](#脚注)
			- [キーボード,](#キーボード)
			- [tabset](#tabset)
		- [タブ {.tabset}](#タブ-tabset)
			- [タブ aaa](#タブ-aaa)
			- [タブ bbb](#タブ-bbb)
- [メディア資産(画像など)の管理](#メディア資産画像などの管理)
	- [前提条件](#前提条件)
	- [関連情報は3つ](#関連情報は3つ)
	- [table の desc 情報](#table-の-desc-情報)
	- [概要](#概要)
	- [場面ごとの変更方法(MariaDBでの変更方法)](#場面ごとの変更方法mariadbでの変更方法)
		- [共通](#共通)
		- [メディア資産で表示されるフォルダ名の変更](#メディア資産で表示されるフォルダ名の変更)
		- [メディア資産で表示されるフォルダ名の削除](#メディア資産で表示されるフォルダ名の削除)
		- [メディア資産で表示される画像ファイルのフォルダ移動](#メディア資産で表示される画像ファイルのフォルダ移動)
- [Microsoft Visual Studio Code(vscode)を使用](#microsoft-visual-studio-codevscodeを使用)
	- [おすすめ拡張機能](#おすすめ拡張機能)
		- [使い方(Markdown Preview Enhanced)](#使い方markdown-preview-enhanced)
		- [使い方(Markdown All in One)](#使い方markdown-all-in-one)
	- [vscode 共通機能の設定についてはこちら](#vscode-共通機能の設定についてはこちら)
	- [(vscode) 目次の作成方法](#vscode-目次の作成方法)
- [Log (ログ) の出力,確認](#log-ログ-の出力確認)
	- [rsyslog のインストール](#rsyslog-のインストール)
	- [daemonの実行と再起動時の自動実行設定](#daemonの実行と再起動時の自動実行設定)
	- [log の確認](#log-の確認)
	- [新規ユーザーや新規コメントの確認](#新規ユーザーや新規コメントの確認)
- [elasticsearchの導入](#elasticsearchの導入)
	- [install](#install)
	- [設定](#設定)
		- [メモリ関連の設定](#メモリ関連の設定)
		- [elasticsearchデーモンの起動と自動起動設定](#elasticsearchデーモンの起動と自動起動設定)
	- [動作確認](#動作確認)
	- [wiki.js側の設定](#wikijs側の設定)
	- [動作確認して完了です。](#動作確認して完了です)
	- [refresh\_interval の時間を変更する。](#refresh_interval-の時間を変更する)
- [pukiwikiからの移行(置換概要)](#pukiwikiからの移行置換概要)
	- [最初に](#最初に)
	- [\* -\> #(数の多い方からやっていきます)](#---数の多い方からやっていきます)
	- [+ -\> 1.](#---1)
	- [「----」 -\> Tab へ](#-------tab-へ)
	- [ハッシュタグの消去](#ハッシュタグの消去)
	- [リンクの変更](#リンクの変更)
	- [改行](#改行)
	- [-- -\> tabへ](#-----tabへ)
	- [template](#template)
	- [あまりにも面倒なので python でプログラムを組みましたw](#あまりにも面倒なので-python-でプログラムを組みましたw)
- [その他](#その他)
	- [Visual Editor と Markdown 比較と感想](#visual-editor-と-markdown-比較と感想)
		- [Visual Editorの長所](#visual-editorの長所)
		- [Markdownの長所](#markdownの長所)
- [(おまけ) なぜか vim をインストール後、かつsshの状態で、マウス右クリックしても貼り付けできない](#おまけ-なぜか-vim-をインストール後かつsshの状態でマウス右クリックしても貼り付けできない)
- [コメントをフルオープンにした場合、どれくらいスパムが来るのか検証](#コメントをフルオープンにした場合どれくらいスパムが来るのか検証)




# 公式リンク(top)
-[Wiki.js](https://docs.requarks.io/)



## Editor - Markdown
-[Editors - Markdown](https://docs.requarks.io/editors/markdown)



## Editor - MarkDown(日本語)
-[(designet)8. エディターの使用方法](https://www.designet.co.jp/ossinfo/wiki.js/usermanual/usage.php)




# 前提



## 環境
- proxmoxのコンテナを使います。
- proxmox については[こちら(当方 pukiwiki )](https://tar3.net/pukiwiki/index.php?Proxmox%20VE)を見てね~。



## 他に検討したもの
- Growi -> mongodbにおいて CPUは avx に対応したものが必要らしく、
	うちのサーバのCPUでは対応してませんでした。。。(2009年製のホストがいるので。。。)
	まぁしようがないですね(^^;)
- wikiを比較する際は、以下のサイトを参考にしました。
	- [(designet) 社内Wikiのおすすめツールとは?無料で使えるおすすめOSS比較6選](https://www.designet.co.jp/ossinfo/selection/office-wiki-tools.html)




# 構築



## 構築コマンド
- [(参考サイト) wiki.js(lxc) Proxmox VE Helper-Scripts](https://community-scripts.github.io/ProxmoxVE/scripts?id=wikijs)
- どれかのホストで以下のコマンドを実行
- インストール時、色々聞かれるようにカスタムインストールを選択した方が良いと思います。
	```
	sudo su -
	bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wikijs.sh)"
	```



## MariaDBへ切り替え


### なぜ?
- 以下に「メディア資産管理」の項目を書くのですが、作ったフォルダを消せないらしく、
	データベースを直にいじるので、使い慣れている MariaDB(MySQL) にしました。


### 参考サイト
- [参考サイト(Nginx : Wiki.js インストール)](https://www.server-world.info/query?os=Ubuntu_22.04&p=nginx&f=13)


### MariaDB のインストールと自動起動設定,起動
```
sudo apt install mariadb-server
sudo apt start mariadb
sudo apt enable mariadb
```


### 初期設定
```
sudo mysql_secure_installation
```
- 概要
	1. Unix_Socket 認証に切り替えるか否か
	[no] でも root のみ デフォルトで Unix_Socket 認証は有効
		``Switch to unix_socket authentication [Y/n] n``
	1. MariaDB root パスワードを設定するか否か
	 MariaDBへ root パスワードでもログインできるようになる。
	 不要と言えば不要なんだけど、自分はバックアップの設定もあるのでYesにした。
		``Change the root password? [Y/n] y``
	1. 匿名ユーザーは削除する
		``Remove anonymous users? [Y/n] y``
	1. root のリモートログインは無効とする
	`	`Disallow root login remotely? [Y/n] y``
	1. テストデータベースは削除する
		``Remove test database and access to it? [Y/n] y``
	1. 特権情報をリロードする
		``Reload privilege tables now? [Y/n] y``
	1. インストール完了


### (MariaDB) wiki.js用ユーザーの作成とデータベースの作成
1. root ユーザーでログイン
	```
	mysql
	```
1. データベースの作成
	```
	create database wikijs;
	```
1. 権限の設定とパスワードの設定
	```
	grant all privileges on wikijs.* to wikijs@'localhost' identified by 'password'; 
	```
1.権限の更新
	```
	flush privileges; 
	```
1. MariaDBから出る。
	```
	exit
	```



### wiki.js の変更
- できるだけ元の設定は残しておいた方が良いかもです。
	行頭に「#」を付けるとコメント・アウトになります。
	```
	sudo vi /opt/wikijs/config.yml
	```
	```
	db:
	type: mariadb

	# PostgreSQL / MySQL / MariaDB / MS SQL Server only:
	host: localhost
	port: 3306
	user: wikijs
	pass: password
	db: wikijs
	ssl: false
	```


### backup
[こちらを参照(mysql)](/310-Linux/313-LinuxServer/mysql#mysql-server-backup)




# 設定変更



## config.yml の場所,Path
- ``/opt/wikijs/config.yml``
- システム情報で確認できます。
	- ![wikijs-01.png](/310-linux/313-linuxserver/wikijs/wikijs-01.png)



## SSL(TLS)化
1. key と crt は適当なディレクトリへ保存
	(自分はLet's Encryptは使ってません。有償の証明書を持ってるため)
- 中間証明書は要らないのかな?この辺、良くわかってないです。でも動いてるから良いのかな?
- ssl の port は 3443 にしています。
	```
	sudo vi /opt/wikijs/config.yml
	```
	```
	# ---------------------------------------------------------------------
	# SSL/TLS Settings
	# ---------------------------------------------------------------------
	# Consider using a reverse proxy (e.g. nginx) if you require more
	# advanced options than those provided below.

	ssl:
	#enabled: false
	enabled: true
	port: 3443

	# Provider to use, possible values: custom, letsencrypt
	provider: custom
	#provider: letsencrypt

	# ++++++ For custom only ++++++
	# Certificate format, either 'pem' or 'pfx':
	format: pem
	# Using PEM format:
	# key
	key: /etc/pki/tls/certs/server.key
	# 証明書
	cert: /etc/pki/tls/certs/server.crt
	# Using PFX format:
	#pfx: path/to/cert.pfx
	# Passphrase when using encrypted PEM / PFX keys (default: null):
	passphrase: null
	# Diffie Hellman parameters, with key length being greater or equal
	# to 1024 bits (default: null):
	dhparam: null

	# ++++++ For letsencrypt only ++++++
	domain: wikijp.tar3.net
	subscriberEmail: hogehoge@unyaunya.net
	```



## dataPAth: の変更
- なんか容量食うと嫌なので普通にファイルサーバのPathを指定しました。
	```
	dataPath: /mnt/hogehoge/data/unya/wikijs
	```
- config.yml の変更は以上です。大したことないですね(^^)



## faviconの変更
1. favicon.ico
	- path
		- /opt/wikijs/assets/favicon.ico
	- 画像解像度
		- 48 x 48
1. favicons ディレクトリ
	- path
		- /opt/wikijs/assets/favicons/
		|ファイル名|解像度|
		|-|-|
		|android-chrome-192x192.png|192 x 192|
		|android-chrome-256x256.png|256 x 256|
		|apple-touch-icon.png|180 x 180|
		|favicon-16x16.png|16 x 16|
		|favicon-32x32.png|32 x 32|
		|mstile-150x150.png|150 x 150|
		{.dense}



## Web画面からの設定変更


### 全般設定
- サイトのURL
- サイトのタイトル
- ロゴURL


### 言語
- 日本語


### ナビゲーション
- サイトツリー


### グループ
- registerdUsers を追加。どなたかが新規にアカウントを作った時用


### アナリティクス
- google analytics を設定
	- Tracking ID の確認方法
	- Google Analytics -> 左側「データの収集と修正」 -> 「データストリーム」
		- 対象のアカウントをクリック
		- 「測定ID」が Tracking ID です。


### セキュリティ
- アップロード
	- 最大アップロードサイズ
		```
		104857600
		```
	- 1回あたりの最大ファイル数
		```
		50
		```




# 記事の作成関連



## markdown


### User's manual(公式)
- [wiki.js - Markdown](https://docs.requarks.io/editors/markdown)
	1. [image](https://docs.requarks.io/editors/markdown#images)
		```
		![Image](/link/to/image.jpg =100x)
		![Image](/link/to/image.jpg =100x50)
		![Image](/link/to/image.jpg =x50)
		![Image](/link/to/image.jpg =100%x)
		```
	1. [Keyboard Keys](https://docs.requarks.io/editors/markdown#keyboard1.keys)
		```
		Lorem ipsum dolor <kbd>CTRL</kbd> + <kbd>C</kbd>
		```
	1. [Links](https://docs.requarks.io/editors/markdown#links)
		```
		[Lorem ipsum](https://wiki.js.org/about)
		```
		- ページ内の見出しへリンクする
			- Link先の取得(見出しをマウスオーバーすると右側にリンクが表示されます)
			ここを右クリックしてリンクをコピーするとハッシュタグが取得できます
				- ![wikijs-link-title-01.png](/310-linux/313-linuxserver/wikijs/wikijs-link-title-01.png)
		- 例としてはこんな感じで書きます。
			```
			[こちらを参照(mysql)](/310-Linux/313-LinuxServer/mysql#mysql-server-backup)
			```
	1. [table](https://docs.requarks.io/editors/markdown#table)
		```
		| Header 1 | Header 2 | Header 3 |
		|----------|----------|----------|
		| Foo      | Bar      | Xyz      |
		| Abc      | Def      | 123      |
		{.dense}
		```
	1. 色
		- [参考サイト(Change text color on pages)](https://feedback.js.wiki/wiki/p/change-text-color-on-pages)
		```
		<span style='color:green;'>緑色の文字</span>
		```
		<span style='color:green;'>緑色の文字</span>


### 書式の設定方法(参考サイト)
- [参考サイト1: Wiki hina.dev](https://wiki.o.hina.dev/wikijs/editors/markdown)
	- 太字
	- イタリック
	- 取り消し線
	- 見出し
	- 下付き文字
	- 上付き文字
	- ブロック引用
	- 順序つきリスト
	- 順序無しリスト
	- タスクリスト
	- インラインコード
	- コードブロック
	- 水平線
	- 画像
	- リンク
	- キーボードキー


### designet(参考サイト)
- [(designet) 8. エディターの使用方法](https://www.designet.co.jp/ossinfo/wiki.js/usermanual/usage.php)


#### ブロッククォート(箇条書きと組み合わせない場合、使用可能です)
```
> スタイルなし eee

> .is-info aaa
{.is-info}

> .is-succsess bbb
{.is-success}

> .is-warning ccc
{.is-warning}

> .is-danger ddd
{.is-danger}
```
> スタイルなし eee

> .is-info aaa
{.is-info}

> .is-succsess bbb
{.is-success}

> .is-warning ccc
{.is-warning}

> .is-danger ddd
{.is-danger}


#### 脚注
```
This sentence[^1] needs a few footnotes.[^2]

[^1]: A string of syntactic words.
[^2]: A useful example sentence.
```
This sentence[^1] needs a few footnotes.[^2]

[^1]: A string of syntactic words.
[^2]: A useful example sentence.


#### キーボード,<kbd></kbd>
```
<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>o</kbd>
```
<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>o</kbd>


#### tabset
```
### タブ {.tabset}
#### タブ aaa
タブの記事
#### タブ bbb
タブの記事2
```
### タブ {.tabset}
#### タブ aaa
タブの記事
#### タブ bbb
タブの記事2




# メディア資産(画像など)の管理
- 以下のような感じの所ですね。
![wikijs-gazo-kanri-01.png](/930-other/wikijs-gazo-kanri-01.png)
> **注意**
データベースをいじることは非常に大きなリスクです(データを壊してしまう可能性があります)。
以下の内容におけるトラブルに関し、当方では一切の責任は負いかねますのでご注意下さい。
また作業前には必ずデータベースのバックアップを取る事をおすすめします。
[バックアップはこちらを参照(mysql)](/310-Linux/313-LinuxServer/mysql#mysql-server-backup)
{.is-warning}



## 前提条件
- データベースはMariaDBです。
- /opt/wikijs/config.yml の dataPath
```
/mnt/hoge/munya/wikijs
```



## 関連情報は3つ
1. データベース(MariaDB)
	1. assets
	1. assetFolders
1. dataPath
	1. /mnt/hoge/munya/wikijs/imagedirectorya/imagedirectoryb/testimage.png



## table の desc 情報
1. assets
	| Field     | Type                   | Null | Key | Default                  | Extra          |
	|-----------|------------------------|------|-----|--------------------------|----------------|
	| id        | int(10) unsigned       | NO   | PRI | NULL                     | auto_increment |
	| filename  | varchar(255)           | NO   |     | NULL                     |                |
	| hash      | varchar(255)           | NO   |     | NULL                     |                |
	| ext       | varchar(255)           | NO   |     | NULL                     |                |
	| kind      | enum('binary','image') | NO   |     | binary                   |                |
	| mime      | varchar(255)           | NO   |     | application/octet-stream |                |
	| fileSize  | int(10) unsigned       | YES  |     | NULL                     |                |
	| metadata  | longtext               | YES  |     | NULL                     |                |
	| createdAt | varchar(255)           | NO   |     | NULL                     |                |
	| updatedAt | varchar(255)           | NO   |     | NULL                     |                |
	| folderId  | int(10) unsigned       | YES  | MUL | NULL                     |                |
	| authorId  | int(10) unsigned       | YES  | MUL | NULL                     |                |
	{.dense}
1. assetFolders
	| Field    | Type             | Null | Key | Default | Extra          |
	|----------|------------------|------|-----|---------|----------------|
	| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
	| name     | varchar(255)     | NO   |     | NULL    |                |
	| slug     | varchar(255)     | NO   |     | NULL    |                |
	| parentId | int(10) unsigned | YES  | MUL | NULL    |                |
	{.dense}



## 概要
1. assets が画像情報の格納先です。
	- folderID で assetFolders へ正規化されています。
	ここで紐づけられたフォルダに画像が入っている必要があります。
1. assetFolders は、親フォルダ名を持ってるだけで一般的な基準情報ですね。
	- フォルダ名はここで決まります。



## 場面ごとの変更方法(MariaDBでの変更方法)
- さて、実際どのように情報を変えていくかを記載していきます。
- wikiの画像参照リンクの変更も必要です。


### 共通
- MariaDBへのログインとデータベースの変更
	(wikijsのMariaDBのあるサーバで実行)
	```
	sudo mysql
	```
	```
	use wikijs
	```
- assets と assetFolders のデータを確認
	```
	SELECT * FROM assets;
	SELECT * FROM assetFolders;
	```


### メディア資産で表示されるフォルダ名の変更
- id は上記の「SELECT * FROM assetFolders;」で表示された対象の「id」を指定
> WHERE 句を入れないと全部のフォルダー名が一律に変わってしまいます!
このミスは慣れた頃に起きるのと、結構データベースに精通した(10年選手)でもたまにやらかします。
データベースのバックアップは重要です。
{.is-warning}
```
UPDATE assetFolders SET name='imagedirectoryc', slug='imagedirectoryc' WHERE id=2;
```


### メディア資産で表示されるフォルダ名の削除
- 消す前に以下はやりましょう~。(要は以下の「[メディア資産で...移動](/310-Linux/313-LinuxServer/wiki#%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E8%B3%87%E7%94%A3%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E7%94%BB%E5%83%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E7%A7%BB%E5%8B%95)」を参照)
	1. データベース情報の変更
	1. サーバの物理Pathから別のフォルダへ画像を移動(mv コマンド)
	1. フォルダ内にある画像のリンク元の変更(``![test.png](.....test.png)``)
	- id は消すフォルダのid(SELECT * FROM assetFolders のid)
	```
	DELETE FROM assetFolders WHERE id=2;
	```


### メディア資産で表示される画像ファイルのフォルダ移動
1. 正直、これは画像を再アップロードした方が早いかもしんないw
1. WHERE の後ろのIDは、対象の画像ファイルのid
	folderIdは上記「SELECT * FROM assetFolders;」の結果から変更したい(ターゲット)フォルダーIDを入力
	```
	update assets SET folderId=35 WHERE id>=24 and id<=36;
	```
1. Linuxサーバ上のファイルを移動
	- 例) imagedirectory<span style='color:red;'>**b**</span> -> imagedirectory<span style='color:red;'>**c**</span>
		```
		mv /mnt/hoge/munya/wikijs/imagedirectorya/imagedirectoryb/testimage.png /mnt/hoge/munya/wikijs/imagedirectorya/imagedirectoryc/testimage.png
		```
1. イメージリンクを変更
	- 前(例) imagedirectory<span style='color:red;'>**b**</span> -> imagedirectory<span style='color:red;'>**c**</span>
		```
		![testimage.png](/imagedirectorya/imagedirectoryb/testimage.png)
		```
	- 後(例)
		```
		![testimage.png](/imagedirectorya/imagedirectoryc/testimage.png)
		```




# Microsoft Visual Studio Code(vscode)を使用



## おすすめ拡張機能
1. Markdown Preview Enhanced
1. Markdown All in One



### 使い方(Markdown Preview Enhanced)
- <kbd>Ctrl</kbd> + <kbd>k</kbd> <kbd>v</kbd>
- [Manual(markdown-preview-enhanced)](https://shd101wyy.github.io/markdown-preview-enhanced/#/ja-jp/usages)


### 使い方(Markdown All in One)
- 特に特別な事は無いんですが、<kbd>Shift</kbd> + <kbd>Enter</kbd>の挙動がちょっといまいちなので、
	以下の通り変更しました。
- 変更前
	- <kbd>Shift</kbd> + <kbd>Enter</kbd>で改行できない時がある。
- 変更後
	- 基本的に<kbd>Shift</kbd> + <kbd>Enter</kbd>で改行できるようにしました
- 変更方法
	- 「ファイル」 -> 「ユーザー設定」->「キーボードショートカット」
	- 「markdown.extension.onShiftEnterKey」で検索
	- 右クリック「When 式を変更」
	- 以下としました
	```
	editorTextFocus && !editorHasMultipleSelections && !editorReadonly && editorLangId =~ /^markdown$|^rmd$|^quarto$/ || editorTextFocus && !editorHasMultipleSelections && !editorReadonly && !markdown.extension.editor.cursor.inFencedCodeBlock && !markdown.extension.editor.cursor.inMathEnv && !suggestWidgetVisible && editorLangId =~ /^markdown$|^rmd$|^quarto$/
	```
	- 残したのは以下
		- エディターにフォーカス
		- 複数選択してない
		- エディターは読み取り専用ではない
		- エディターの言語は markdown である
		- マルチプルセレクションではない(すみません、これ良く分かってないですw)
		- markdown拡張機能のエディターカーソルがCodeBlockでない場合![wikijs-vscode-seikihyougen-01.png](/310-linux/310-linux/313-linuxserver/wikijs/wikijs-vscode-seikihyougen-01.png)
			(なのですが、CodeBlock内でも<kbd>Shift</kbd> + <kbd>Enter</kbd>効くようになってます)
		- カーソルが MathEnv でないとき
		- あとは等々


## vscode 共通機能の設定についてはこちら
- [vscode:設定](/510-program/vscode/vscode#%E8%A8%AD%E5%AE%9A)



## (vscode) 目次の作成方法
- wiki.jsは左側のサマリが見出し2までしか表示できないです。
	個人的にはこれがかなりネックだったのですが、目次を作る事によってちょっとは緩和できるかも。。。
1. 目次を作成したい個所にカーソルを移動
1. vscode上で<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> を押す。
1. ``TOC``で検索。
1. ``Markdown All in One; 目次(TOC)の作成``を選択
1. 目次が挿入される。




# Log (ログ) の出力,確認



## rsyslog のインストール
```
sudo apt install rsyslog
```



## daemonの実行と再起動時の自動実行設定
```
sudo systemctl start rsyslog
sudo systemctl enable rsyslog
```



## log の確認
```
cat /var/log/syslog
```
- こんな感じの結果が出力されます。
> 2025-06-05T20:55:51.783155+09:00 wikijs node[638]: 2025-06-05T11:55:49.084Z [JOB] #033[32minfo#033[39m: Using database driver mysql2 for mariadb [ OK ]
> 2025-06-05T20:56:03.162381+09:00 wikijs node[638]: 2025-06-05T11:56:03.161Z [JOB] #033[32minfo#033[39m: Rendering page ID 1: [ COMPLETED ]
> 2025-06-05T20:56:03.180948+09:00 wikijs node[158]: 2025-06-05T11:56:03.180Z [MASTER] #033[32minfo#033[39m: (STORAGE/DISK) Updating file [ja] home...




## 新規ユーザーや新規コメントの確認
- 結局、上記のログでは新規ユーザーや新規コメントが確認できなかったので、
	MariaDBから直に出力することにしました。
- ユーザーが増えたかどうか
	```
	SELECT id,email,name,timezone,createdAt,updatedAt,lastLoginAt FROM users
	```
- コメントがあったかどうか
	```
	SELECT * FROM comments
	```




# elasticsearchの導入
- 普通にインストールしただけでは中身の検索ができないんですね。。。(T_T)



## install
1. レポジトリの追加
	```
	sudo wget https://artifacts.elastic.co/GPG-KEY-elasticsearch -O /etc/apt/keyrings/GPG-KEY-elasticsearch.key
	sudo su -
	echo "deb [signed-by=/etc/apt/keyrings/GPG-KEY-elasticsearch.key] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list 
	```
1. install
	```
	sudo apt update
	sudo apt install apt-transport-https
	sudo apt -y install elasticsearch
	```
	- 以下に表示されているパスワードをメモする
		```
		The generated password for the elastic built-in superuser is :
		```
	- アナライザ トークナイザ、「analysis-kuromoji」のインストール
		```
		sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
		```



## 設定


### メモリ関連の設定
```
sudo vim /etc/elasticsearch/jvm.options
```
- 以下を追加(値は各自のサーバ状況に合わせて下さい)
	```
	################################################################
	## IMPORTANT: JVM heap size
	################################################################
	##
	## The heap size is automatically configured by Elasticsearch
	## based on the available memory in your system and the roles
	## each node is configured to fulfill. If specifying heap is
	## required, it should be done through a file in jvm.options.d,
	## which should be named with .options suffix, and the min and
	## max should be set to the same value. For example, to set the
	## heap to 4 GB, create a new file in the jvm.options.d
	## directory containing these lines:
	##
	## -Xms4g
	## -Xmx4g
	##
	## See https://www.elastic.co/guide/en/elasticsearch/reference/8.17/heap-size.html
	## for more information
	##
	################################################################

	-Xms512m
	-Xmx512m
	```
- sslの無効化
	- このファイル、どういうわけだかとても壊れやすいです。。。
	なので最初にバックアップを取ります。
	というか、NextCloudの方とも合わせて、ymlファイルが壊れていて動かないのか、
	設定が間違えているのか区別が付かず、検証がちゃんと行えてません。
	なんかわからんけど動かない、なんかわからんけど動いた、って時が多すぎ。。。
	```
	sudo cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.bak
	```
	
	```
	sudo vim /etc/elasticsearch/elasticsearch.yml
	```

	```
	# ======================== Elasticsearch Configuration =========================
	#
	# NOTE: Elasticsearch comes with reasonable defaults for most settings.
	#       Before you set out to tweak and tune the configuration, make sure you
	#       understand what are you trying to accomplish and the consequences.
	#
	# The primary way of configuring a node is via this file. This template lists
	# the most important settings you may want to configure for a production cluster.
	#
	# Please consult the documentation for further information on configuration options:
	# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
	#
	# ---------------------------------- Cluster -----------------------------------
	#
	# Use a descriptive name for your cluster:
	#
	#cluster.name: my-application
	 cluster.name: wikijs
	#
	# ------------------------------------ Node ------------------------------------
	#
	# Use a descriptive name for the node:
	#
	#node.name: node-1
	#
	# Add custom attributes to the node:
	#
	#node.attr.rack: r1
	#
	# ----------------------------------- Paths ------------------------------------
	#
	# Path to directory where to store the data (separate multiple locations by comma):
	#
	path.data: /var/lib/elasticsearch
	#
	# Path to log files:
	#
	path.logs: /var/log/elasticsearch
	#
	# ----------------------------------- Memory -----------------------------------
	#
	# Lock the memory on startup:
	#
	#bootstrap.memory_lock: true
	#
	# Make sure that the heap size is set to about half the memory available
	# on the system and that the owner of the process is allowed to use this
	# limit.
	#
	# Elasticsearch performs poorly when the system is swapping the memory.
	#
	# ---------------------------------- Network -----------------------------------
	#
	# By default Elasticsearch is only accessible on localhost. Set a different
	# address here to expose this node on the network:
	#
	#network.host: 192.168.0.1
	#
	# By default Elasticsearch listens for HTTP traffic on the first free port it
	# finds starting at 9200. Set a specific HTTP port here:
	#
	#http.port: 9200
	#
	# For more information, consult the network module documentation.
	#
	# --------------------------------- Discovery ----------------------------------
	#
	# Pass an initial list of hosts to perform discovery when this node is started:
	# The default list of hosts is ["127.0.0.1", "[::1]"]
	#
	#discovery.seed_hosts: ["host1", "host2"]
	#
	# Bootstrap the cluster using an initial set of master-eligible nodes:
	#
	#cluster.initial_master_nodes: ["node-1", "node-2"]
	#
	# For more information, consult the discovery and cluster formation module documentation.
	#
	# ---------------------------------- Various -----------------------------------
	#
	# Allow wildcard deletion of indices:
	#
	#action.destructive_requires_name: false

	#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
	#
	# The following settings, TLS certificates, and keys have been automatically
	# generated to configure Elasticsearch security features on 07-06-2025 05:58:45
	#
	# --------------------------------------------------------------------------------

	# Enable security features
	xpack.security.enabled: false

	xpack.security.enrollment.enabled: false

	# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
	xpack.security.http.ssl:
	enabled: false
	keystore.path: certs/http.p12

	# Enable encryption and mutual authentication between cluster nodes
	xpack.security.transport.ssl:
	enabled: false
	verification_mode: certificate
	keystore.path: certs/transport.p12
	truststore.path: certs/transport.p12
	# Create a new cluster with the current node only
	# Additional nodes can still join the cluster later
	cluster.initial_master_nodes: ["serverName"]

	# Allow HTTP API connections from anywhere
	# Connections are encrypted and require user authentication
	http.host: 0.0.0.0

	# Allow other nodes to join the cluster from anywhere
	# Connections are encrypted and mutually authenticated
	#transport.host: 0.0.0.0
	#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
	```


### elasticsearchデーモンの起動と自動起動設定
```
sudo systemctl restart elasticsearch
sudo systemctl enable elasticsearch
```



## 動作確認
- なんかしら帰ってきます。ブラウザでも確認可能
	```
	curl http://localhost:9200
	```



## wiki.js側の設定
- index(wikijs)は手動で作成せずとも wiki.js が自動で作ります。
	~~analysis-kuromoji だと自動で作らないのですが、それは wiki.js がバグっているためと思われます。~~
  インストールは「analysis-kuromoji」なのですが、設定はただの「kuromoji」で動く事がわかりました。。。
	ここまで長かった。。。	
- simple でも一応、日本語の検索もできました。。。
- ![wikijs-elasticsearch-01.png](/310-linux/313-linuxserver/wikijs/wikijs-elasticsearch-01.png)



## 動作確認して完了です。
- ![wikijs-elasticsearch-02.png](/310-linux/313-linuxserver/wikijs/wikijs-elasticsearch-02.png)



## refresh_interval の時間を変更する。
1. 1秒から20秒へ
1. index名の確認
	```bash
	curl --noproxy '*' http://localhost:9200/_cat/indices?v
	```
	- 結果例(index の下にあるのがindex名です)(例では wikijs)
		```
		health status index  uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
		yellow open   wikijs abcdefgabcdefg2JgCrqg   1   1         69            3      2.8mb          2.8mb        2.8mb
		```
1. 1秒から20秒へ
	```bash
	curl --noproxy '*' -X PUT "http://localhost:9200/wikijs/_settings" \
	  -H "Content-Type: application/json" \
	  -d '{ "index": { "refresh_interval": "20s" } }'
	```
	- 変更確認
		```bash
		curl --noproxy '*' -X GET "http://localhost:9200/wikijs/_settings?pretty"
		```




# pukiwikiからの移行(置換概要)



## 最初に
- "- + # * の右側に半角スペースを作っておきます。"



## * -> #(数の多い方からやっていきます)
1. 回目
	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		***** 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		##### 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		**** 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		#### 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		*** 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		### 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		** 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		## 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		* 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		# 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



## + -> 1.
- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\+\+\+\+\+ 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t\t\t\t1. 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\+\+\+\+ 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t\t\t1. 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\+\+\+ 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t\t1. 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\+\+ 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t1. 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\+ 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		1. 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



## 「----」 -> Tab へ
- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		----- 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t\t\t\t- 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		---- 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t\t\t- 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		--- 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t\t- 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		-- 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		\t- 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 回目
	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
		```
		- 
		```
	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
		```
		- 
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



## ハッシュタグの消去
- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
- 置換元(行頭スペース必要)
	```
		\[.........\]
	```
- 置換先(無)
	```
	
	```
- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



## リンクの変更
- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
1. 最初
	- 置換元
		```
		[[
		```
	- 置換先
		```
		[
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 中間
	- 置換元
		```
		:http
		```
	- 置換先
		```
		](http
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1. 末尾
	- 置換元
		```
		]]
		```
	- 置換先
		```
		)
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



## 改行
1. チルダ
	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
	- 置換元
		```
		~\n
		```
	- 置換先
		```
		\n\t
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
1.  &br;
	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
	- 置換元
		```
		&br;
		```
	- 置換先
		```
		<br>
		```
	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



## -- -> tabへ
- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
- 置換元(スペースを入れないと結果が変わってしまうかも。。。)
	```
	-- 
	```
- 置換先(スペースを入れないと結果が変わってしまうかも。。。)
	```
	\t- 
	```
- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



##  template
- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : 
- 置換元(スペースを入れないと結果が変わってしまうかも。。。)
	```

	```
- 置換先(スペースを入れないと結果が変わってしまうかも。。。)
	```

	```
- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)



## あまりにも面倒なので python でプログラムを組みましたw
1. 最初に
	1. 実行は自己責任でお願いします。
	1. とりあえず動けば良いや、的なやっつけプログラムです。
	1. python、始めて組んだんですが、まぁ他の言語と大差ないかなぁ。。。
		なんでこんなに世間で話題になってるのか、いまいちわからなかったです。。。
	1. 4時間位で作ったので、まだバグはありそうw
	1. python の基本的な使い方は[こちら](/510-program/python/python)から
1. 機能
	1. Listの後ろに半角スペースが無ければ追加
	1. Tabの処理
	1. \+ を 1. へ
	1. \* を # へ
	1. リンクを変更
		- 例
			- 変更前
				```
				[[Link:https://dummy.hoge.net]]
				```
			- 変更後
				```
				[Link](https://dummy.hoge.net)
				```
	1. 表を変換
	1. #の下はタブ無しへ
1. 更新履歴
	|日時|更新内容|
	|-|-|
	|2025/6/15 13:23|# or * 後のTab処理が反映されなかったのを修正|
	|2025/6/15 8:32|``&imgr(./image/keyboard/Mechanical-Jiku-12_2.JPG,50%);``の形式からwiki.jsの画像リンクへ変更<br> -> ``![keyboardHHKJPLite2Black.jpg](%ImgFilePath%/keyboardhhkjplite2black.jpg)``|
	|2025/6/14 10:20 |# と表組みに対応|
	|2025/6/9 10:20 |間違えて ' と指定した個所を ` へ修正|
	{.dense}
1. その他
	1. 以下2点が同時に発生する時、行頭のタブが一つ足りなくなる不具合があります。
		ただ、自分にはちょっと無理かもしれない。。。
		1. リストのインデントが増えたり減ったりする時(例) 「\t\t1.」 -> 「\t1.」)
		1. `` ``` ``を閉じる際
```
import re
import os


class CheckTabSharpClass:

    def __init__(self) -> None:
        self.tabCharacter = ""
        self.sharpAsteriskFlag = False
        self.tableFlag = False


    def check( \
                       self \
                      ,line\
                        ):

        afterReplaceCharacter=""
        beforeReplaceCharacter=""

        if line and line[0] in {"+", "-"}:
            beforeReplaceCharacter = line[0]
            if line and line[0] == "+":
                afterReplaceCharacter = "1."
            else:
                afterReplaceCharacter = line[0]

            beforeReplaceOrderList = ""
            orderCount=0
            newListLine=""
            self.tabCharacter = ""
            for characterOrder in line:
                if characterOrder==" ":
                    break
                else:
                    if orderCount==0:
                        beforeReplaceOrderList = characterOrder
                        newListLine = characterOrder.replace(beforeReplaceCharacter,afterReplaceCharacter)
                    else:
                        beforeReplaceOrderList += characterOrder
                        newListLine = "\t" + newListLine
                        self.tabCharacter += "\t"
                orderCount += 1
            line = line.replace(beforeReplaceOrderList,newListLine)


        if line and line[0]=="|":
            self.tableFlag=True
        else:
            self.tableFlag=False


        if line and line[0]=="*":
            line = line.replace("*","#")
            self.tabCharacter=""
            self.sharpAsteriskFlag=True
        elif self.tableFlag==False:
            self.sharpAsteriskFlag=False


        return line


def checkAddSpace(line):

    headerSpace=""
    spaceFlag= False
    beforeReplace=""
    for character in line:
        if character==" ":
            spaceFlag = True
            headerSpace += character
            break
        elif character.startswith('*') \
                or character.startswith('+') \
                or character.startswith('-') \
                    :
            pass
        else:
            beforeReplace = headerSpace
            headerSpace = headerSpace + " "
            break
        headerSpace += character

    if spaceFlag == False:
        line= line.replace(beforeReplace,headerSpace)

    return line


class CreateTabTextClass:
    def __init__(self) -> None:
        self.codeFlag=False
        self.codeHeadTab=""
        self.tableFlag=False


    def CreateTabText( \
                       self \
                      ,eachLine \
                      ,checkTabSharpClass \
                        ):

        tabCharacter=""
        returnEachLine=""
        returnEachLine=eachLine

        if checkTabSharpClass.sharpAsteriskFlag==False \
                and checkTabSharpClass.tableFlag==False:
            tabCharacter="\t"

        self.codeHeadTab=""
        if eachLine.startswith(" "):
            if self.codeFlag == False:
                self.codeHeadTab = tabCharacter + checkTabSharpClass.tabCharacter + "```\n"
            
            returnEachLine = self.codeHeadTab + tabCharacter + checkTabSharpClass.tabCharacter + eachLine[1:]
            self.codeFlag=True
        elif eachLine.startswith(' ')==False \
                and self.codeFlag==True :
            returnEachLine = self.codeHeadTab + tabCharacter + checkTabSharpClass.tabCharacter + "```\n" + eachLine
            self.codeFlag=False
        
        if eachLine.replace("\t","").startswith("|"):
            tableSeparate="|"
            
            if self.tableFlag==False:
                for pipeCount in range(1, eachLine.count("|")):
                    tableSeparate+="-|"
                returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine \
                                     + tabCharacter + checkTabSharpClass.tabCharacter + tableSeparate + "\n"
                self.tableFlag=True
            else:
                returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine
        elif self.tableFlag==True \
                and eachLine.replace("\t","").startswith("|")==False \
                    :
            self.tableFlag=False



        return returnEachLine

class ConvertImgrClass:
    def convert(self, argEachLine):
        eachLine=argEachLine
        afterSplitComma=[]
        afterSplitSlash=[]
        imgFileName=""

        afterSplitComma=eachLine.split(",")
        afterSplitSlash=afterSplitComma[0].split("/")
        imgFileName=afterSplitSlash[-1].lower()

        eachLine="!["+imgFileName+"](%ImgFilePath%/"+imgFileName+")\n"

        return eachLine



class TransFormLineClass:
    def transform_line( \
                         self \
                       , inputLines \
                        ):
        
        try:

            checkTabSharpClass = CheckTabSharpClass()
            createTabTextClass = CreateTabTextClass()
            convertImgrClass = ConvertImgrClass()
            eachLine=""
            outputText=""

            for line in inputLines:
                eachLine=line
                if \
                    eachLine.startswith('*') \
                        or eachLine.startswith('+') \
                        or eachLine.startswith('-') \
                        or eachLine.startswith('|') \
                            :

                    #Spaceが無い場合に追加
                    if eachLine.startswith('|')==False:
                        eachLine = checkAddSpace(eachLine)

                    #Tabと * の処理
                    eachLine = checkTabSharpClass.check(eachLine)

                    eachLine=re.sub(r" \[.........\]", "", eachLine)
                    eachLine=re.sub(r"\[.........\]", "", eachLine)

                eachLine=createTabTextClass.CreateTabText( \
                                                        eachLine \
                                                        , checkTabSharpClass \
                                                            )


                if "&imgr" in eachLine:
                    eachLine=convertImgrClass.convert(eachLine)

                eachLine=eachLine.replace("~","")
                eachLine=eachLine.replace("[[","[")
                eachLine=eachLine.replace(":http","](http")
                eachLine=eachLine.replace("]]",")")
                eachLine=eachLine.replace("''","**")
                eachLine=eachLine.replace("&br;","<br>")
                eachLine=eachLine.replace("|h","|")

                outputText+=eachLine

            
            del createTabTextClass
            del checkTabSharpClass
            del convertImgrClass

            return outputText
        
        except:
            import traceback
            traceback.print_exc()



# ファイル単位で処理する場合
inputFileName="input.pukiwiki"
outputFileName="output.wikijs"
with open('pukiwikiWikijsSource\\'+inputFileName, 'r', encoding='utf-8') as infile, \
     open('pukiwikiWikijsSource\\'+outputFileName, 'w', encoding='utf-8') as outfile:

    transFormLineClass = TransFormLineClass()
    inputLines=[]
    for line in infile:
        inputLines.append(line)

    outputText=""
    outputText=transFormLineClass.transform_line(inputLines)
    if outputText is not None and isinstance(outputText, str):
        outfile.write(outputText)
    del transFormLineClass
```
1. PlantUML,シーケンス図
	1. 
		```
		@startuml sequence
		title pukiwiki -> wiki.js 変換プログラム

		participant main
		participant TransFormLineClass
		participant CheckTabSharpClass
		participant CreateTabTextClass

		Activate main
		note right main
			inputFileName="input.pukiwiki"
			outputFileName="output.wikijs"

			open input.pukiwiki
			open output.wikijs
		end note
		loop foreach line in input file
			note right main
				inputLines.append(line)
			end note
		end
		note right main
			outputText=transFormLineClass.transform_line(inputLines)
		end note

		main -> TransFormLineClass:  transform_line(self, inputLines)
		Activate TransFormLineClass
			note right TransFormLineClass
				checkTabSharpClass = CheckTabSharpClass()
				createTabTextClass = CreateTabTextClass()
				eachLine=""
				outputText=""
			end note

			TransFormLineClass -> CheckTabSharpClass
			activate CheckTabSharpClass
			TransFormLineClass -> CreateTabTextClass
			activate CreateTabTextClass

			loop foreach line in inputLines
				note right TransFormLineClass
					eachLine = line
				end note
				
				alt eachLine.startswith('*') or eachLine.startswith('+') or eachLine.startswith('-') or eachLine.startswith('|') 
					alt eachLine.startswith('|')==False
						TransFormLineClass -> main: checkAddSpace
						note right TransFormLineClass
							1. # - のあとに半角スペースが無ければ挿入
						end note

						activate main
						main --> TransFormLineClass: eachLine
						deactivate main
					end


					TransFormLineClass -> CheckTabSharpClass: check(eachLine)
					note right  CheckTabSharpClass
						afterReplaceCharacter=""
						beforeReplaceCharacter=""
					end note

					alt line and line[0] in {"+", "-"}
						note right CheckTabSharpClass 
							+ を 1. へ変更

							beforeReplaceOrderList = ""
							orderCount=0
							newListLine=""
						end note

						loop characterOrder in line
							alt characterOrder==" "
								note right CheckTabSharpClass 
									何文字目かの文字(foreach)が、半角スペース(もう終わりなら)
									break
								end note
							else
								alt orderCount==0
									note right CheckTabSharpClass 
										文字が - か + で、かつ最初の文字の時
										beforeReplaceOrderList = characterOrder
										newListLine = characterOrder.replace(beforeReplaceCharacter,afterReplaceCharacter)
									end note
								else
									note right CheckTabSharpClass 
										文字が - か + で、かつ2文字目以降(タブの追加)
										beforeReplaceOrderList += characterOrder
										newListLine = "\ t" + newListLine
										self.tabCharacter += "\ t"
									end note
								end
							end
							note right CheckTabSharpClass 
								orderCount += 1
							end note
						end
						note right CheckTabSharpClass 
							line = line.replace(beforeReplaceOrderList,newListLine)
						end note
					end

					alt line and line[0]=="|" 
						note right CheckTabSharpClass 
							self.tableFlag=True
						end note
					else
						note right CheckTabSharpClass 
							self.tableFlag=False
						end note
					end

					alt line and line[0]=="*"
						note right CheckTabSharpClass 
								line = line.replace("*","#")
								self.tabCharacter=""
								self.sharpAsteriskFlag=True
						end note
					else self.tableFlag==False
						note right CheckTabSharpClass 
							self.sharpAsteriskFlag=False
						end note
					end
					CheckTabSharpClass --> TransFormLineClass: eachLine=line
					note right TransFormLineClass
						ハッシュタグの消去
					end note
				end

				TransFormLineClass -> CreateTabTextClass:createTabText(eachLine, checkTabSharpClass)
				note right CreateTabTextClass
					tabCharacter=""
					returnEachLine=""
					returnEachLine=eachLine
				end note

				alt checkTabSharpClass.sharpAsteriskFlag==False
					note right CreateTabTextClass
						tabCharacter="\ t"
					end note
				end

				alt checkTabSharpClass.tableFlag==False
					note right CreateTabTextClass
						tabCharacter="\ t"
					end note
				end


				alt self.eachLine.startswith(" "):
					alt self.codeFlag == False
						note right CreateTabTextClass
							self.codeHeadTab = tabCharacter + "```\n"
						end note
					end
					note right CreateTabTextClass
						returnEachLine = self.codeHeadTab + tabCharacter + "" + eachLine[1:]
						self.codeFlag=True
					end note
				else self.eachLine.startswith(' ')==False and self.codeFlag==True
					note right CreateTabTextClass
						returnEachLine = tabCharacter + "```\n" + eachLine
						self.codeFlag=False
					end note
				end

				alt eachLine.replace("\ t","").startswith("|")
					note right CreateTabTextClass
						tableSeparate="|"
					end note
					alt eachLine.replace("\t","").startswith("|")
						note right CreateTabTextClass
							tableSeparate="|"
						end note
						loop pipeCount in range(1, eachLine.count("|"))
							note right CreateTabTextClass
								tableSeparate+="-|"
							end note
						end
						note right CreateTabTextClass
							returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine \ 
												+ tabCharacter + checkTabSharpClass.tabCharacter + tableSeparate + "\n"
							self.tableFlag=True
						end note
					else
						note right CreateTabTextClass
							returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine
						end note
					end
				else self.tableFlag==True and eachLine.replace("\t","").startswith("|")==False 
					note right CreateTabTextClass
						self.tableFlag=False
					end note
				end

				CreateTabTextClass --> TransFormLineClass:returnEachLine

				note right TransFormLineClass
					eachLine=eachLine.replace("~","")
					eachLine=eachLine.replace("[[","[")
					eachLine=eachLine.replace(":http","](http")
					eachLine=eachLine.replace("]]",")")
					eachLine=eachLine.replace("''","**")

					outputText+=eachLine
				end note
			end
			TransFormLineClass --> main: outputText                        

			deActivate CreateTabTextClass
			deActivate CheckTabSharpClass

		deActivate TransFormLineClass



		note right main
			outfile.write(outputText)
		end note
		@enduml
		```
	1. ![plantuml-01.png](/310-linux/313-linuxserver/wikijs/plantuml-01.png)



# その他



## Visual Editor と Markdown 比較と感想


### Visual Editorの長所
- 細かいテーブルレイアウトが可能


### Markdownの長所
vs codeでの編集が可能。




# (おまけ) なぜか vim をインストール後、かつsshの状態で、マウス右クリックしても貼り付けできない
- とりあえず、<kbd>Shift</kbd> + <kbd>Insert</kbd>で緊急対応はできます。
- あとはバックスペースが効かないとか。。。一応、以下にまとめてました。
	- [vi,vim(wiki.js)](https://wikijs.tar3.net:3443/ja/310-Linux/311-LinuxCommon/vi,vim)




# コメントをフルオープンにした場合、どれくらいスパムが来るのか検証
- 2025/6/20 7:15~
- そのうち結果を書きます
	- 2025/6/30(18:00):今のところスパムは無いです。このままいけるか??

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS