#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`` - システム情報で確認できます。 -  ## 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) ```     ``` 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先の取得(見出しをマウスオーバーすると右側にリンクが表示されます) ここを右クリックしてリンクをコピーするとハッシュタグが取得できます -  - 例としてはこんな感じで書きます。 ``` [こちらを参照(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 # メディア資産(画像など)の管理 - 以下のような感じの所ですね。  > **注意** データベースをいじることは非常に大きなリスクです(データを壊してしまう可能性があります)。 以下の内容におけるトラブルに関し、当方では一切の責任は負いかねますのでご注意下さい。 また作業前には必ずデータベースのバックアップを取る事をおすすめします。 [バックアップはこちらを参照(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. フォルダ内にある画像のリンク元の変更(````) - 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> ```  ``` - 後(例) ```  ``` # 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でない場合 (なのですが、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 でも一応、日本語の検索もできました。。。 -  ## 動作確認して完了です。 -  ## 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> -> ````| |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="\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.  # その他 ## 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):今のところスパムは無いです。このままいけるか??