<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ノートアプリ on 或る阿呆の記</title><link>https://hack-le.com/tags/%E3%83%8E%E3%83%BC%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA/</link><description>Recent content in ノートアプリ on 或る阿呆の記</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Thu, 17 Sep 2026 14:09:03 +0900</lastBuildDate><atom:link href="https://hack-le.com/tags/%E3%83%8E%E3%83%BC%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA/index.xml" rel="self" type="application/rss+xml"/><item><title>Growi (Docker) をコンテナごと別マシンに引っ越す</title><link>https://hack-le.com/growi-docker-container/</link><pubDate>Sat, 13 Jun 2026 13:10:29 +0900</pubDate><guid>https://hack-le.com/growi-docker-container/</guid><description>&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;移行元&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop&lt;/li&gt;&#10;&lt;li&gt;Growi 7.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行先&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;Docker 29.2.1&lt;/li&gt;&#10;&lt;li&gt;Growi 7.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="基本的な手順"&gt;基本的な手順&#10;&lt;/h2&gt;&lt;p&gt;手順はWordPressのコンテナ移行とほぼ一緒なので、下記記事を参考にすること（雑）&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/container-wp/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;コンテナ構築のWordPressサイトを別マシンに移行する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/container-wp/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/05/eyecatch_50016_1779164478.webp" alt="コンテナ構築のWordPressサイトを別マシンに移行する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;全体の流れと微妙な差分を下記にメモ。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;移行元でコンテナを停止してボリュームをバックアップし、移行先にアーカイブを送信&lt;/li&gt;&#10;&lt;li&gt;移行先でボリュームを復元&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ここでElasticsearchの書き込み権限がなかったりするので修正する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;移行先の&lt;code&gt;docker-compose.yml&lt;/code&gt;でボリューム名を指定する&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;docker compose up&lt;/code&gt;してブラウザで動作確認&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;の流れ。ボリューム名の定義と、権限の修正あたりが若干の追加要素となる。&lt;/p&gt;&#10;&lt;p&gt;ボリューム名は通常はフォルダ名にデフォ名つくような感じだろう。たとえばgrowiフォルダでは以下のようになっているだろう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_es_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_growi_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_mongo_configdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_mongo_db&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらについて、&lt;code&gt;docker-compose.yml&lt;/code&gt;で&lt;code&gt;es_dataや&lt;/code&gt;growi_dataとなっているところをそれぞれ修正する。そして&lt;code&gt;external&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にする。ここらへんは上記WordPress記事のymlを見て参考に。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker compose up&lt;/code&gt;で様子を見るが、もしかするとElasticsearchでエラーが出てしまうかもしれない。これはElasticsearchコンテナの権限問題であるため、以下のコマンドで修正する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -v &amp;lt;ボリューム名、たとえばgrowi_es_data&amp;gt;:/mnt alpine chown -R 1000:1000 /mnt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;雑だが、以上。&lt;/p&gt;&#10;</description></item><item><title>Trilium Notes (Docker) のマシンを移行する</title><link>https://hack-le.com/trilium-notes-docker-migration/</link><pubDate>Sun, 07 Jun 2026 21:21:36 +0900</pubDate><guid>https://hack-le.com/trilium-notes-docker-migration/</guid><description>&lt;p&gt;現在運用しているTrilium Notesについて、Intel Mac mini 2018 + Docker Desktop から Linux Mint Xfce 22.3のサーバマシンに移行する。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Trilium Notesのlatest&lt;/li&gt;&#10;&lt;li&gt;移行元&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS Sonoma 14.6.1&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop for mac v4.76.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行先&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390&lt;/li&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker 29.5.2&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;移行元のマシンで停止する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;でデータディレクトリを確認する。&lt;code&gt;TRILIUM_DATA_DIR&lt;/code&gt;がどうなっているか見る。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Running `docker-compose up` will create/use the &amp;#34;trilium-data&amp;#34; directory in the user home&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run `TRILIUM_DATA_DIR=/path/of/your/choice docker-compose up` to set a different directory&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To run in the background, use `docker-compose up -d`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; trilium:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Optionally, replace `latest` with a version tag like `v0.90.3`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Using `latest` may cause unintended updates to the container&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: triliumnext/trilium:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Restart the container unless it was stopped by the user&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/node/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Tokyo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# By default, Trilium will be available at http://localhost:8080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# It will also be accessible at http://&amp;lt;host-ip&amp;gt;:8080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# You might want to limit this with something like Docker Networks, reverse proxies, or firewall rules,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# however be aware that using UFW is known to not work with default Docker installations, see:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;8080:8080&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Unless TRILIUM_DATA_DIR is set, the data will be stored in the &amp;#34;trilium-data&amp;#34; directory in the home directory.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# This can also be changed with by replacing the line below with `- /path/of/your/choice:/home/node/trilium-data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/trilium-data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/home/node/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - /etc/timezone:/etc/timezone:ro&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - /etc/localtime:/etc/localtime:ro&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは&lt;code&gt;~/trilium-data&lt;/code&gt;となっている。ついでにMacで&lt;code&gt;/etc/timezone&lt;/code&gt;がなかったのでコメントアウトされているね。&lt;/p&gt;&#10;&lt;p&gt;とりあえずアーカイブ化しよう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -czvf trilium-data-backup.tar.gz ~/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こいつを新しいマシンに転送してやる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp trilium-data-backup.tar.gz ユーザ@IPアドレス:移行先のパス&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新しいマシンで、これを保存先ディレクトリ上に展開する。今回は&lt;code&gt;trilium-data&lt;/code&gt;にしている。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xzvf trilium-data-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存先ディレクトリに入って、もしデータベースの一時ファイルが存在したら削除する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f document.db-shm document.db-wal&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;準備ができたらコンテナの起動。とりあえずフロントで。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エラーなく起動したら、&lt;code&gt;http://IPアドレス:ポート&lt;/code&gt;にアクセスする。以前使っていたパスワードでログインできることを確認する。&lt;/p&gt;&#10;&lt;p&gt;問題なければOK。Ctrl-cで停止して、改めてバックグラウンドで起動する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでOK。しばらく動かして、安定していることを確認したら元のコンテナは削除してよい。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/evernote-notion-trilium-notes/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/evernote-notion-trilium-notes/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/03/image-4.png" alt="Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで</title><link>https://hack-le.com/evernote-notion-trilium-notes/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/evernote-notion-trilium-notes/</guid><description>&lt;p&gt;今回取り上げるのは、ずっと記事書こうと思っていて放置していたメモアプリのTrilium Notes。割と使いたい人が多いかもしれないやつだと思う。&lt;/p&gt;&#10;&lt;h2 id="trilium-notesとはevernotenotion代替になるか"&gt;Trilium Notesとは。Evernote/Notion代替になるか&#10;&lt;/h2&gt;&lt;p&gt;Trilium NotesはEvernoteとかNotion代替として出てくる、セルフホストできるFOSS。サイトはここ「&lt;a class="link" href="https://triliumnotes.org/ja/" target="_blank" rel="noopener"&#10; &gt;Trilium Notes&lt;/a&gt;」。使い勝手は昔のEvernoteに近い気がする。&lt;strong&gt;昔のNotion並に軽いEvernote&lt;/strong&gt;。伝統的な階層型管理なのはNotion的かな。&lt;/p&gt;&#10;&lt;p&gt;Evernoteは最初全部フラットにしようとして失敗したと思う。ここらへん、スマホではじめで階層型はもう古い！みたいなトレンドがあったような気がする。結果としては、階層型ディレクトリだけが最強だった。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;リッチな機能はないし、ユーザも一人専用だけれど、ノートアプリとして欲しいものは全部揃っている。&lt;/strong&gt; いらない機能でわかりづらいUIと遅いパフォーマンス、崩れるレイアウトのために課金しなくてはいけない日々とはさよなら。&lt;/p&gt;&#10;&lt;p&gt;とはいえ&lt;strong&gt;Notionはノートアプリというよりもはやデータベースアプリになっているので、Notionの機能をゴリゴリ使っているならそりゃ厳しい&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;あと、&lt;strong&gt;もしかするとObsidianとどっち使うか考えている人もいるかもしれないが、どちらが良いかはObisidian vs Evernote（Notion）と考え方はほぼ同じになる&lt;/strong&gt;かなと思う。Obsidianはクライアントベース、ファイルベース、Markdown至上主義な考え方になるし、Trilium Notesはサーバベース、独自データベース、Markdownは基本だけどWYSYWIGにありがちなちょっとキモイ挙動もあるよみたいな感じ。&lt;/p&gt;&#10;&lt;p&gt;FOSSの文脈だと、サーバ必須なのとファイルではなく独自データベースのメリデメ（高機能だがサポートの継続が不安）をどう捉えるかになるかと思う。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;サーバ&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop for Mac&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Web Clipperを試したブラウザ&#10;&lt;ul&gt;&#10;&lt;li&gt;Vivaldi&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール"&gt;インストール&#10;&lt;/h2&gt;&lt;p&gt;インストール自体はいつものようにDocker一発なので取り立てていうところはない。docker使えれば使える。&lt;/p&gt;&#10;&lt;p&gt;以下のうち、ポート番号とデータベースを保存するディレクトリだけ編集。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Running `docker-compose up` will create/use the &amp;#34;trilium-data&amp;#34; directory in the user home&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Run `TRILIUM_DATA_DIR=/path/of/your/choice docker-compose up` to set a different directory&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# To run in the background, use `docker-compose up -d`&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; trilium:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Optionally, replace `latest` with a version tag like `v0.90.3`&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Using `latest` may cause unintended updates to the container&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: triliumnext/trilium:latest&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Restart the container unless it was stopped by the user&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/node/trilium-data&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Tokyo&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# By default, Trilium will be available at http://localhost:8080&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# It will also be accessible at http://&amp;lt;host-ip&amp;gt;:8080&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# You might want to limit this with something like Docker Networks, reverse proxies, or firewall rules,&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# however be aware that using UFW is known to not work with default Docker installations, see:&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;ポート番号:8080&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Unless TRILIUM_DATA_DIR is set, the data will be stored in the &amp;#34;trilium-data&amp;#34; directory in the home directory.&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# This can also be changed with by replacing the line below with `- /path/of/your/choice:/home/node/trilium-data&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/保存したいディレクトリ&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/home/node/trilium-data&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - /etc/timezone:/etc/timezone:ro&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - /etc/localtime:/etc/localtime:ro&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;timezoneのところお麺とアウトしているのはMacで当該ファイルがなかったからかな。&lt;/p&gt;&#10;&lt;p&gt;バックアップはこの設定ファイルとディレクトリをまるごとコピーしたらOK。&lt;/p&gt;&#10;&lt;h2 id="基本的な使い方"&gt;基本的な使い方&#10;&lt;/h2&gt;&lt;p&gt;ノートを書いて階層管理する使い勝手。なんかもう本当にシンプルなので、これも特に言うことがない。画面見りゃわかる。わかれ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-4-700x487.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;こんな感じで僕は「缶詰」や「酒」の管理とかに使っている。タスク管理にも使おうとしていたが、最近は一周回ってアナログ管理になってきたので、これはあまり使えていない。あと確定申告とかその時々のタスクにも使ってるね。&lt;/p&gt;&#10;&lt;h2 id="web-clipperの使い方"&gt;Web Clipperの使い方&#10;&lt;/h2&gt;&lt;p&gt;結局やりたいのはこれだと思うが、Web Clipperがある。「Trilium Web Clipper」でブラウザに対応した拡張機能をインストール。&lt;/p&gt;&#10;&lt;p&gt;ブラウザから、Trilium Web Clipperのオプションを開く。&lt;/p&gt;&#10;&lt;p&gt;Trilium server instanceの設定から、&lt;code&gt;http://IP address:port&lt;/code&gt;とパスワードを入力する。パスワードは実際に保存されるわけではなくて、一度ログインしてトークンを発行しているみたいだ。実際、SettingsのETAPIを見るとトークンが作られていることがわかる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-1-700x347.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;これで使えるようになっている。どっか適当なページで挙動を確認する。Gigazine開いたら最初の記事だった「&lt;a class="link" href="https://gigazine.net/news/20260312-is-icloud-free-tier-still-5gb/" target="_blank" rel="noopener"&#10; &gt;iCloudの無料枠がいつまで経っても5GBから増えないことを確認できる「Is iCloud’s free tier still 5GB？」 - GIGAZINE&lt;/a&gt;」をやってみよう。&lt;/p&gt;&#10;&lt;p&gt;ブラウザの拡張機能のアイコンをクリックすると選択肢が出てくる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-2.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;「Save whole page」を選択すると、Journalにクリップされる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-3-700x521.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;スクショも保存できる。しかし、表示されている画面分だけなので使い勝手は微妙な気がする。一部分のクリップはSNSとかヤフコメとか見ているときに捗るかもしれない。&lt;/p&gt;&#10;&lt;p&gt;検索するとノートがヒットする。ここらへんどれくらい管理するかは人それぞれ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-5.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;AI時代になってアプリ開発が劇的に楽になったため、自分用のノート・メモアプリはもう自作したほうがいいんじゃないの？と思うこともある今日この頃&lt;/strong&gt;だけれど、そうはいってもやはりそれにはスキルも時間も必要。&lt;/p&gt;&#10;&lt;p&gt;最初からほしいところがそろっていて、かつWeb Clipperが用意されているのは非常に強力なので、ノート系アプリがほしい人にとっては第一候補になると思う。&lt;/p&gt;&#10;&lt;p&gt;本アプリはSQLiteを使って独自データベース設計になっているが、AIでいろいろやりたい観点からは、ファイルベースのほうがいいという意見もあるかもしれない。が、正直そんなやらせることある？という気が個人的にはしている。&lt;strong&gt;AIにやらせたい特定のユースケースがあるならば、そのためにアプリを作った方がいい&lt;/strong&gt;と思う。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;メモアプリってのはもっとこう、散逸で適当なもんで、人間にも整理しきれないのが本質ではなかろうか&lt;/strong&gt;。人間に整理できないもんはAIにも無理。AIならなんかすげぇナレッジ出すらしいじゃんとか夢見たくなるのはわかるが、夢だと思う。&lt;/p&gt;&#10;&lt;p&gt;また、継続性の観点から独自データベース設計はややネックにはなるかもしれない。しかし、この手のメモアプリはいろいろ貼りたくなるもので、Obsidian使ったところでどうせ大変になる。画像みたいなバイナリがあると、そのバイナリのパスの管理なども出てくるから、ファイルベースだから大丈夫！とも言えない。パス失って探せないファイルはないのと同じ。&lt;strong&gt;ファイルベースも結局ディレクトリ構造どうしているのかわからないと管理できない&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;ってかもしサポートが途絶えたなら、それこそAI使ってデータベースから必要な抽出をすればいいと思うんよな。&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、個人的にはノートアプリのセルフホストFOSSとしておススメできるかなと思います。&lt;/p&gt;&#10;</description></item><item><title>NotionのMermaid記法でお絵かきするのが良いと伝える動画</title><link>https://hack-le.com/notion%E3%81%AEmermaid%E8%A8%98%E6%B3%95%E3%81%A7%E3%81%8A%E7%B5%B5%E3%81%8B%E3%81%8D%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E8%89%AF%E3%81%84%E3%81%A8%E4%BC%9D%E3%81%88%E3%82%8B%E5%8B%95%E7%94%BB/</link><pubDate>Sat, 07 Dec 2024 12:09:35 +0900</pubDate><guid>https://hack-le.com/notion%E3%81%AEmermaid%E8%A8%98%E6%B3%95%E3%81%A7%E3%81%8A%E7%B5%B5%E3%81%8B%E3%81%8D%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E8%89%AF%E3%81%84%E3%81%A8%E4%BC%9D%E3%81%88%E3%82%8B%E5%8B%95%E7%94%BB/</guid><description>&lt;p&gt;姉とNotion談義していた時に、Mermaid記法を普及しようと思った。スクリーンレコードで動画をとって見せてみたが、「何が起きてるのかわからないｗ」と言われて撃沈した。まぁそうか……。&lt;/p&gt;&#10;&lt;p&gt;まぁでもせっかく撮影したので、なんとなく雰囲気を察せられる動画として残すだけの記事。&lt;/p&gt;&#10;&lt;h2 id="notion--mermaid記法の動画"&gt;Notion &amp;amp; Mermaid記法の動画&#10;&lt;/h2&gt;&lt;p&gt;動画は以下。&lt;/p&gt;&#10;&lt;p&gt;&lt;video controls src="https://hack-le.com/images/uploads/2024/11/01035f564973c8fd1266bf76b09358cc.mov"&gt;&lt;/video&gt;&lt;/p&gt;&#10;&lt;p&gt;動画にしてしまうと記事文本文では言うことがない。言わなきゃ気づかないと思うけど、変換候補があれなのは固有名詞です笑&lt;/p&gt;&#10;&lt;h2 id="動画もアリか"&gt;動画もアリか&#10;&lt;/h2&gt;&lt;p&gt;今さらだけれど動画や音声をアップロードしていくのもアリかなと思った。本当に今さらだけど。&lt;/p&gt;&#10;</description></item><item><title>DockerでMongoDBのコンテナが永遠に再起動する時の対応</title><link>https://hack-le.com/docker-mongodb-restart/</link><pubDate>Mon, 04 Nov 2024 02:04:16 +0900</pubDate><guid>https://hack-le.com/docker-mongodb-restart/</guid><description>&lt;p&gt;色々なパターンがあると思うが、今回は以下のエラーにより、永遠にrestartしていたものと思われる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2024-11-03 21:25:06 {&amp;#34;t&amp;#34;:{&amp;#34;$date&amp;#34;:&amp;#34;2024-11-03T12:25:06.020+00:00&amp;#34;},&amp;#34;s&amp;#34;:&amp;#34;F&amp;#34;, &amp;#34;c&amp;#34;:&amp;#34;CONTROL&amp;#34;, &amp;#34;id&amp;#34;:6384300, &amp;#34;ctx&amp;#34;:&amp;#34;ftdc&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;Writing fatal message&amp;#34;,&amp;#34;attr&amp;#34;:{&amp;#34;message&amp;#34;:&amp;#34;DBException::toString(): FileStreamFailed: Failed to write to interim file buffer for full-time diagnostic data capture: /data/db/diagnostic.data/metrics.interim.temp\nActual exception type: mongo::error_details::ExceptionForImpl&amp;lt;(mongo::ErrorCodes::Error)39, mongo::AssertionException&amp;gt;\n\n&amp;#34;}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;/data/db/diagnostic.data/metrics.interim.temp&lt;/code&gt;に書き込めないことによるエラーっぽい。&lt;/p&gt;&#10;&lt;p&gt;（追記）むしろ原因は以下かも。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker-etc-hosts-full/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;DockerのMariaDBコンテナが起動失敗すると思ったら /etc/hosts が60GBで100% usage だった&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/docker-etc-hosts-full/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_16158_1789090882.webp" alt="DockerのMariaDBコンテナが起動失敗すると思ったら /etc/hosts が60GBで100% usage だった" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;macOS 14.6.1&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop 4.35.1&lt;/li&gt;&#10;&lt;li&gt;Growiのコンテナをたてていた&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;基本的に初期設定のままだが、 &lt;code&gt;docker-compose.yml&lt;/code&gt;を以下に示す。mongodbのバージョンは6.0。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; app:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- 省略 ---&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mongo:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: mongo:6.0&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - mongo_configdb:/data/configdb&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - mongo_db:/data/db&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- 省略 ---&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;volumes:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; growi_data:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mongo_configdb:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mongo_db:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; es_data:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="症状"&gt;症状&#10;&lt;/h2&gt;&lt;p&gt;永遠にmongodbのコンテナがrestartする。かろうじてログは取れた。&lt;/p&gt;&#10;&lt;h2 id="原因-mongodlockがemptyじゃない"&gt;原因: mongod.lockがemptyじゃない&#10;&lt;/h2&gt;&lt;p&gt;restart地獄だが幸いはログは取れた。どうも、直接的には&lt;code&gt;/data/db/diagnostic.data/metrics.interim.temp&lt;/code&gt;に書き込めないことによるエラーっぽい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2024-11-03 21:25:06 {&amp;#34;t&amp;#34;:{&amp;#34;$date&amp;#34;:&amp;#34;2024-11-03T12:25:06.020+00:00&amp;#34;},&amp;#34;s&amp;#34;:&amp;#34;F&amp;#34;, &amp;#34;c&amp;#34;:&amp;#34;CONTROL&amp;#34;, &amp;#34;id&amp;#34;:6384300, &amp;#34;ctx&amp;#34;:&amp;#34;ftdc&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;Writing fatal message&amp;#34;,&amp;#34;attr&amp;#34;:{&amp;#34;message&amp;#34;:&amp;#34;DBException::toString(): FileStreamFailed: Failed to write to interim file buffer for full-time diagnostic data capture: /data/db/diagnostic.data/metrics.interim.temp\nActual exception type: mongo::error_details::ExceptionForImpl&amp;lt;(mongo::ErrorCodes::Error)39, mongo::AssertionException&amp;gt;\n\n&amp;#34;}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なんでそうなるかというと、恐らく &lt;code&gt;mongod.lock&lt;/code&gt;がemptyではないためにmongodを起動できず、権限がなかったのではないか。以下のようなログが残っていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2024-11-03 21:24:59 {&amp;#34;t&amp;#34;:{&amp;#34;$date&amp;#34;:&amp;#34;2024-11-03T12:24:59.534+00:00&amp;#34;},&amp;#34;s&amp;#34;:&amp;#34;W&amp;#34;, &amp;#34;c&amp;#34;:&amp;#34;STORAGE&amp;#34;, &amp;#34;id&amp;#34;:22271, &amp;#34;ctx&amp;#34;:&amp;#34;initandlisten&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;Detected unclean shutdown - Lock file is not empty&amp;#34;,&amp;#34;attr&amp;#34;:{&amp;#34;lockFile&amp;#34;:&amp;#34;/data/db/mongod.lock&amp;#34;}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直前にMacを再起動したのだが、その時に正常に終了できなかったことに起因してるかもしれない。今となっては大元の原因は不明である。。。&lt;/p&gt;&#10;&lt;h2 id="対応-デバッグ用コンテナを作ってロックファイルを削除"&gt;対応: デバッグ用コンテナを作ってロックファイルを削除&#10;&lt;/h2&gt;&lt;p&gt;ロックファイル &lt;code&gt;mongod.lock&lt;/code&gt;を削除する。&lt;/p&gt;&#10;&lt;p&gt;ただし、コンテナは起動したそばからterminateしてしまうため、デバッグ用のコンテナを作ってそこからファイルをいじる。今回の例だと、以下のような &lt;code&gt;docker-compose.override.yml&lt;/code&gt;ファイルを作って、デバッグ用のmongoコンテナとする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mongo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この状態でコンテナを起動。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d mongo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose exec mongo /bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ログイン後、ファイルを削除し、データベースを修復する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f /data/db/mongod.lock&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mongod --repair --dbpath /data/db&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ログアウトして、コンテナを落とす。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker-compose.override.yml&lt;/code&gt;を削除する。削除後、コンテナを起動。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動しないことを祈る。しなければOK。したら別の問題がある。&lt;/p&gt;&#10;&lt;p&gt;（追記）以下が起きていたら先にこれを対応しないといけない。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker-etc-hosts-full/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;DockerのMariaDBコンテナが起動失敗すると思ったら /etc/hosts が60GBで100% usage だった&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/docker-etc-hosts-full/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_16158_1789090882.webp" alt="DockerのMariaDBコンテナが起動失敗すると思ったら /etc/hosts が60GBで100% usage だった" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;もはや本当の原因がわからないのだけれど、いずれにせよ直接の原因は &lt;code&gt;mongod.lock&lt;/code&gt; が残ってしまっていることで、Dockerの場合はデバッグ用コンテナからコイツを削除してやることで解決できるはず。&lt;/p&gt;&#10;</description></item><item><title>結局ナレッジツールの個人利用はNotionに戻りつつある</title><link>https://hack-le.com/knowledge-notion/</link><pubDate>Mon, 28 Oct 2024 15:26:05 +0900</pubDate><guid>https://hack-le.com/knowledge-notion/</guid><description>&lt;p&gt;僕の趣味は生産性を上げるために多くのナレッジツールを検証することに多大な時間を費やして生産性を下げることなので、今まで色々なツールを使ってきたし、今もNotion, Growi, AppFlowy, AFFiNE, Confluenceを同時並行で使っている。Evernote？知りませんねそんな象……。&lt;/p&gt;&#10;&lt;p&gt;多くの人に馴染みがあるのはNotionとConfluenceくらいだと思うのでさらっと説明すると、Growiは典型的なWiki、AppFlowyはNotion代替、AFFiNEはNotion + Miroの代替で、それぞれセルフホスティングできるのが特徴。あとOutlineもこの界隈では有名だがまだ試していない。&lt;/p&gt;&#10;&lt;p&gt;それぞれフォーカスしている価値が違うから、用途によって適当なものは変わるのだけれど、プライベート利用では結局なんだかんだでまたもやNotionに収束しつつある今日この頃だ。&lt;/p&gt;&#10;&lt;h2 id="notionは個人利用ではほぼ制限がない"&gt;Notionは個人利用ではほぼ制限がない&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Notionはチームで使うとそれなりに値が張るが、個人利用においては無料でほとんどの機能が使える&lt;/strong&gt;。まぁ実際的なところで多少困るのはアップロードできるファイルサイズの制限だろうか。個人的にこれはクリティカルではないが、人によっては困るだろう。まぁそういう人は素直に別のツールを使うか、金を払うべきだ。&lt;/p&gt;&#10;&lt;p&gt;個人的に少しつらいなと思うのは描画機能で、Mermaid記法が使えるものの、それしかないのはつらいと思う。draw.ioが使えるChromeのブラウザ拡張機能があるんだが、最近のレビューを見るとどうも壊れているっぽい……。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://chromewebstore.google.com/detail/drawio-for-notion/plhaalebpkihaccllnkdaokdoeaokmle" target="_blank" rel="noopener"&#10; &gt;https://chromewebstore.google.com/detail/drawio-for-notion/plhaalebpkihaccllnkdaokdoeaokmle&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;まぁブラウザ拡張機能ってお金にならないだろうしなぁ。正直買い切りライセンスだったら買ってもいいくらいの機能だと思うんだけれど。ちなみにdraw.ioの埋め込みはGrowiが地味にサポートしていて便利だった。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;チームで利用する場合、描画機能がMermaid記法オンリー問題は割と深刻&lt;/strong&gt;だと思う。非エンジニアに書いてもらうのはたいへんだし、なんならエンジニアでも嫌がる人は嫌がる……。&lt;/p&gt;&#10;&lt;h2 id="データベースつよい"&gt;データベースつよい&#10;&lt;/h2&gt;&lt;p&gt;長所と短所はだいたい表裏一体だが、&lt;strong&gt;Notionの場合もご多分に漏れず、なんといってもその超強力なデータベース機能が長所であり短所ともいえる&lt;/strong&gt;。長所であるのは言わずもがなだが、短所というのは、&lt;strong&gt;概念の理解が難しいので非エンジニアの人が習熟するには時間がかかる、なんなら無理まである&lt;/strong&gt;し、またカジュアルにデータベースを操作、削除できるものだから、大事なデータベースが誤削除されるなどという悲壮な事故が後を絶たない。しかも消した当人は消したことに気づいていない。チームで一回はやらかすと思う。やらかした。懺悔します。&lt;/p&gt;&#10;&lt;p&gt;しかしだからといってデータベース機能を使わないと、Notionである意味がかなり薄れる。というか真面目にNotionじゃなくていいし、むしろtoo fatだから適していないとすら言える。&lt;/p&gt;&#10;&lt;p&gt;つまりNotionを使う限りはデータベースを使ってなんぼだし、またチームで使いこなすことでその威力は大いに発揮されるのだが、開発者だけのチームならともかく、現実はそうもいかない。上述した描画がMermaid記法オンリーのストロングスタイル問題と相まって、非エンジニアにはかなり敷居が高く感じられだろう。&lt;strong&gt;機能を使いこなすことよりも、チームメンバのスキルや使い方を見て、適切な運用指針を築くことが一大プロジェクト&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;なんだけれど、僕一人で使う限りは、何も問題にならないので、Notionの強力なデータベース機能を好き勝手に使えて幸せハッピーなのである。&lt;/p&gt;&#10;&lt;h2 id="banだけが怖い"&gt;BANだけが怖い&#10;&lt;/h2&gt;&lt;p&gt;そんなわけで、&lt;strong&gt;個人利用においてNotionに対する大きな不満はなく、あれこれツールを試しているが、結局Notionに落ち着いてしまう&lt;/strong&gt;。&lt;strong&gt;ただ一点、どうしても気になるのはBANされたらどうしよう&lt;/strong&gt;、ということだ。&lt;/p&gt;&#10;&lt;p&gt;ビジネス用途で金払って、あくまでビジネスの用途でやっていれば、向こうも早々BANはしないと思うのだが、プライベートだと金払っていないうえに色々な使い方をするので、何かの拍子で目を付けられてカジュアルにBANされてしないだろうかという不安がある。まぁオンラインストレージで「子供のお風呂写真を上げたら警告なしBANされた」という話と同根だ。&lt;/p&gt;&#10;&lt;p&gt;たとえば僕の場合、趣味でやっているAIイラストのために、Webクリップした記事についている参考画像なんかにはけっこうきわどいのがある。といってもWebクリップの場合画像は元サイトを参照しているだけ（内部的には文字列データ）だろうし、またその内容もせいぜい肌色が多めくらいのものではあるから、なんら言われる筋合いはないのだが、昨今の潔癖な欧米のポリコレ的価値観からすると、こんな政治的に不健全なアカウントはBANするざます、みたいなことも考えられて、少し不安を感じている。&lt;/p&gt;&#10;&lt;p&gt;不安ならその使い方はしなければ良いのではないかと言われるとごもっともだし、そうしたいのはやまやまなのだけれど、&lt;strong&gt;NotionのWebクリップ拡張機能とデータベース機能の合わせ技が非常に便利であるため、今のところその代替が見つかっていない&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;まぁそうでなくても、フツーの使い方でも何故か突然垢BANされた、という話はNotionに限らずクラウドサービスにおいては、ネットをやっているとけっこう聞くことだ。なので、クラウドサービスの個人利用には警戒感が強い。幸いなことに僕は今までどこかからBANされたことはないのだけれど、一度でもあったらトラウマレベルの大事故なので、やはり怖い。オンプレからクラウドに移行する理由の一つに災害対策があげられることがあるけれど、&lt;strong&gt;正直自宅が災害でサーバがぶっ壊れる災害リスクよりも、プラットフォームの意味不明な基準と気まぐれでいきなり垢BANされる人災リスクのほうが現実的に大きい&lt;/strong&gt;と思う。&lt;/p&gt;&#10;&lt;p&gt;まぁ片手間でやっているGoogleやMSと違って、コアビジネスそのものであるNotionが、実際的な利益になるとは思えないポリコレ仕草のため雑に強権を発動する可能性は低いと思うし、そういった強権発動には慎重のはずだと思うのだけれど、まぁ不安はある。なので、Notion並とまでは言わなくても、セルフホスティングできるナレッジツールでそれなりに使えるデータベース機能があれば、そっちに乗り換えるんだがなぁ……とか思っていたら、AFFiNEの人がデータベース機能に注力しているらしいので、そのうち実装されるのかもしれない。&lt;/p&gt;&#10;&lt;p&gt;いずれにせよ、現時点においては&lt;strong&gt;個人ユースだとNotion最強伝説&lt;/strong&gt;になっている。&lt;/p&gt;&#10;</description></item><item><title>Growiのファイルアップロード先をS3に設定</title><link>https://hack-le.com/growi-s3/</link><pubDate>Tue, 17 Sep 2024 16:56:22 +0900</pubDate><guid>https://hack-le.com/growi-s3/</guid><description>&lt;p&gt;「&lt;a class="link" href="https://docs.growi.org/ja/admin-guide/management-cookbook/app-settings.html#amazon-s3-bucket-%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97" target="_blank" rel="noopener"&#10; &gt;アプリ設定 | GROWI Docs&lt;/a&gt;」にあるとおりなんだけれど、何故か毎回引っかかってしまうのでメモする。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;docker-composeで作ったもので確認&#10;&lt;ul&gt;&#10;&lt;li&gt;ホストOS: macOS 14, IntelとAppleSilicon両方確認&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Growi v7.0.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="やること"&gt;やること&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;user(ユーザ)&#10;growi(Growi)&#10;s3(S3)&#10;growi -.-&gt;|アップロード| s3&#10;s3 --&gt;|アクセス許可| growi --&gt;|ファイル| user&lt;/pre&gt;&lt;p&gt;Growiを通じてS3上のファイルをやりとりできるようにするための、Growi-S3間の権限設定をそれぞれすることになる。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS側&#10;&lt;ul&gt;&#10;&lt;li&gt;保存するバケットを作成する（今回はap-northeast-1）&#10;&lt;ul&gt;&#10;&lt;li&gt;バケットのパブリックブロックの設定を変更する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;バケットにアクセスするためのIAMポリシーをアタッチしたIAMユーザを作成する&#10;&lt;ul&gt;&#10;&lt;li&gt;IAMユーザの認証キーを作成する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Growi側&#10;&lt;ul&gt;&#10;&lt;li&gt;docker-compose.ymlで &lt;code&gt;S3_OBJECT_ACL=private&lt;/code&gt;の設定をする&lt;/li&gt;&#10;&lt;li&gt;アプリ設定で認証の設定をする&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="aws-バケットの作成"&gt;AWS: バケットの作成&#10;&lt;/h3&gt;&lt;p&gt;東京リージョンでバケットを作成する。&lt;/p&gt;&#10;&lt;p&gt;バケットのブロックパブリックアクセスのうち、「&lt;strong&gt;新しいアクセスコントロールリスト (ACL) を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする&lt;/strong&gt;」のみオフにする（下図）。作成時に設定できるが、作成後にも「アクセス許可」タブより設定変更可能。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2024/09/55013ed0226267980c63680fc934acd8-700x326.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="aws-iamの作成"&gt;AWS: IAMの作成&#10;&lt;/h3&gt;&lt;p&gt;作成したバケットにアクセスするためのIAMポリシーを作成する。ポリシーは以下。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;,&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Statement&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;s3:PutObject&amp;#34;&lt;/span&gt;,&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;s3:PutObjectAcl&amp;#34;&lt;/span&gt;,&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;s3:GetObject&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;,&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;arn:aws:s3:::&amp;lt;作成したバケット名&amp;gt;/*&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IAMユーザを作成し、作成したポリシーをアタッチする。&lt;/p&gt;&#10;&lt;p&gt;IAMユーザの認証キーを作成して保存する。&lt;/p&gt;&#10;&lt;h3 id="growi-docker-composeyml-の編集"&gt;Growi: docker-compose.yml の編集&#10;&lt;/h3&gt;&lt;p&gt;docker-compose.yml に環境変数として &lt;code&gt;S3_OBJECT_ACL=private&lt;/code&gt; を追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; app:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; build:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; context: .&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dockerfile: ./Dockerfile&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 127.0.0.1:13000:3000 &lt;span class="c1"&gt;# localhost only by default&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; links:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - mongo:mongo&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - elasticsearch:elasticsearch&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; depends_on:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - mongo&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - elasticsearch&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;MONGO_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mongodb://mongo:27017/growi&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;ELASTICSEARCH_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://elasticsearch:9200/growi&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;PASSWORD_SEED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;changeme&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;S3_OBJECT_ACL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;private &lt;span class="c1"&gt;# ---------------ここに追加-------------------&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - FILE_UPLOAD=mongodb # activate this line if you use MongoDB GridFS rather than AWS&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - FILE_UPLOAD=local&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテナを再起動する。&lt;/p&gt;&#10;&lt;h3 id="growi-アプリの設定"&gt;Growi: アプリの設定&#10;&lt;/h3&gt;&lt;p&gt;管理者画面の「アプリ設定」より「ファイルアップロード設定」で、ファイルアップロード方法としてAWS(S3)を選択し、リージョン、バケット名、キーの設定をして更新する。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;マニュアルに書いてあるんだけど、いつも何かを忘れて謎に引っかかるので、メモした。だいたいdocker-compose.ymlの編集を忘れる模様。&lt;/p&gt;&#10;&lt;p&gt;Growi便利だよね。&lt;/p&gt;&#10;</description></item><item><title>NotionはWebブラウザのほうが便利</title><link>https://hack-le.com/notion-web/</link><pubDate>Wed, 27 Sep 2023 23:18:07 +0900</pubDate><guid>https://hack-le.com/notion-web/</guid><description>&lt;p&gt;最近あった良いこととして、会社でNotionを使えるようになったことがある。プライベートでも使っているツールを、チームとして使える経験をもらえたのは良いことだ。また幸いなことに、一定程度の影響力を行使できる立場にあるので、限定的ではあるけれど、Notionをフルに使って開発作業にあたることができている。&lt;/p&gt;&#10;&lt;h2 id="デスクトップアプリの出来はあまりよくない"&gt;デスクトップアプリの出来はあまりよくない&#10;&lt;/h2&gt;&lt;p&gt;Notionにはデスクトップアプリがある。昔からのPCユーザの感覚だと、専用アプリがあるならそちらのほうがいいに決まっているだろう、と思ってしまうのだが、Notionについては残念な結果だった。&lt;/p&gt;&#10;&lt;p&gt;UIなど、何から何までWebアプリ版と同じで、違うところと言えば複数タブが開けるところくらいだと思う。でもタブの入れ替えという基本的なことも出来ず、ブラウザのタブ機能よりハッキリ言って貧弱であるため、これが機能アップとは言いがたい。&lt;/p&gt;&#10;&lt;p&gt;あとはまぁスタンドアロンのアプリなので、Dockから多少呼び出すやすくなった。&lt;/p&gt;&#10;&lt;p&gt;以上がデスクトップアプリを使って良かったことのすべて。ネイティブのアプリならパフォーマンスなどに期待したいところだが、残念ながら別にはやくなる感じはない。&lt;/p&gt;&#10;&lt;h2 id="webアプリには拡張機能がある"&gt;Webアプリには拡張機能がある&#10;&lt;/h2&gt;&lt;p&gt;まぁそれでも多少なりともいいところがあるなら使えばいいんじゃないの？という考えもあるかもしれないが、残念ながら（？）Webアプリ版のほうにこそデスクトップ版にはない大きなメリットがある。それは拡張機能だ。&lt;/p&gt;&#10;&lt;p&gt;特にsvgを直接編集できるようになるDraw.ioのNotion向けChomeエクステンションはめちゃくちゃ強力だ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://chrome.google.com/webstore/detail/drawio-for-notion/plhaalebpkihaccllnkdaokdoeaokmle/related?hl=ja" target="_blank" rel="noopener"&#10; &gt;https://chrome.google.com/webstore/detail/drawio-for-notion/plhaalebpkihaccllnkdaokdoeaokmle/related?hl=ja&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;これだけのためにWebブラウザ版使う価値がある。Notionの絵を描くにはMermaid記法しか使えないという大きな弱点を克服するものだ。プログラマはともかく、ビジネス層にMermaid記法で書いてくれとは言えないからねぇ。まぁそうでなくても、それなりに大きなアーキテクチャ図なんか、Mermaidで描いたらカオスだしね。カオスだった。&lt;/p&gt;&#10;&lt;p&gt;あと、個人的に最近使っているタイマーアプリTogglのエクステンションがNotionにも対応しているのがよかった。まだあんまり使いこなせてないけど。&lt;/p&gt;&#10;&lt;p&gt;ということで、拡張機能がある分Webアプリ版のほうがNotionについては明確に良い。&lt;/p&gt;&#10;&lt;h2 id="webアプリにネイティブの皮を被せても"&gt;Webアプリにネイティブの皮を被せても……&#10;&lt;/h2&gt;&lt;p&gt;まぁNotionに限らず、一時期からよく見かけるようになったWebアプリをそのまんまネイティブアプリにしたようなやつは、だいたいどれも拡張機能的な理由でWebアプリ版より劣る。アカウントの切り替えとかで多少の優位性があったりするが、それは拡張機能の不足を補えるものではない。開発費の関係でそうなってしまうんだろうなと思いつつ、だったらなくてええわ、というのがイチユーザとしての感触である。&lt;/p&gt;&#10;&lt;p&gt;むしろ、なまじっかWebアプリの出来がよいからこそ起きた悲劇なのかもしれない。EvernoteとかWebアプリ酷かったのに無理矢理UI統合して阿鼻叫喚だったからなぁ……今はもうよくなったのだろうか。&lt;/p&gt;&#10;&lt;p&gt;そんなこんなで、結局ブラウザ版のNotionを使っている。&lt;/p&gt;&#10;</description></item></channel></rss>