posts
Logseq Publish のインストールメモ(大体 ubuntu のせい)
Logseq でできた graph を, static site としてホストしたい. 非公式の日本語マニュアルにいい情報 (scrapbox.io) があるが,
- Logseq じたいからエクスポートが可能
- コマンドラインからやるなら,現状公式が github action を主眼に提供している logseq/publish-spa が良さそうなのだが,インストールのハマりどころ.
今回は珍しくWSL 2.0 なので,ubuntu (22.04 LTS) ベースの話になる.結局 apt
で入るバージョンが古いことが色んな環境構築で色々複雑にしている(→ snap
とか自分でソースからビルドするとか,その後の管理も複雑化する)ことが多い感触があって,周囲の初心者に勧めていいものか微妙なところも感じるんですよねえ.
現時点の readme から
To use this as a CLI locally, first install babashka and clojure. Then:
$ git clone https://github.com/logseq/publish-spa
# If you have yarn 1.X:
$ cd publish-spa && yarn install
$ yarn global add $PWD
# Otherwise use npm:
$ cd publish-spa && npm i -g
This CLI depends on Logseq being checked out locally in order to build the static directory for it. If you haven’t built the static directory, you’ll need to do it once (takes some time):
$ git clone https://github.com/logseq/logseq && cd logseq
# Switch to a stable version
$ git checkout 0.10.6
# Install deps and build static directory
$ yarn install --frozen-lockfile && yarn gulp:build && clojure -M:cljs release publishing
Then use the CLI from any logseq graph directory!
$ logseq-publish-spa out
Parsing 306 files...
Export public pages and publish assets to out successfully 🎉
babashka
- 公式に則ればよいっぽい…のだが,
git clone
して install をそのまま走らせた.
Logseq の static/ のビルド
このステップで yarn が必要になるっぽい…のだが, apt で入る yarn は古くて --frozen-lockfile
オプションがない.やむなくこれもインストールしに行く.corepack
が良しなにしてくれるっぽいことが 書いてある.
npm install -g corepack
後から気付くことだがバージョンの非互換性があるみたいで, logseq 側の readme は 古い.
clojure も古い
以下のように失敗する
Execution error (FileNotFoundException) at java.io.FileInputStream/open0 (FileInputStream.java:-2). -M:cljs (No such file or directory)
Logseq のドキュメントでは 手当の記載がある,要するに apt でインストールされた clojure が古い.
(If you run into Execution error (FileNotFoundException) at java.io.FileInputStream/open0 (FileInputStream.java:-2). -M:cljs (No such file or directory), it means you have a wrong Clojure version installed. Please uninstall it and follow the instructions linked.)
結局連れていかれるのはこれ なんですけど…
curl -L -O https://github.com/clojure/brew-install/releases/latest/download/linux-install.sh
chmod +x linux-install.sh
sudo ./linux-install.sh
ここまでやると
yarn install --frozen-lockfile && yarn gulp:build && clojure -M:cljs release publishing
が成功する…はず(諸事情で次のステップから一度戻ってここを2回目走らせるとうまくいく,ということがあったが,原因がよくわからない).
Readme にある yarn は罠
- 上に書いた通り
$ cd publish-spa && yarn install
→$ yarn global add $PWD
は yarn のバージョン違いで失敗する - おとなしく
$ cd publish-spa && npm i -g
でやりましょう
static/ の指定が必要
- これで一応
logseq-publish-spa
が走るようになるのだが,logseq static directory が../logseq/static
がデフォルトという微妙な状況で,明示する必要がある
# graph のあるディレクトリで
logseq-publish-spa ../publish/ -s ~/src/logseq/static/
で一応成功するはず.妙にハマりどころが多いが,多くは Ubuntu の apt で入るバージョンが思ったより色々古いことに起因している.結構苦労した割にあまり食わせられるオプションが多くなさそうで悲しみ.
Excel に関して詰まったら見るメモ
Excel は好きではないものの,きちんと行・列の構造を大事にしながら使えばそこそこよくできてるな…と感じることも多く,自分が作る際に他人との共有の便利さを踏まえて考える選択肢としてはありうると思っている. とくに,うまく列に演算結果を保存していって最終的に欲しい結果を得るのは,案外パズル感もあってわるくない.
…のだけど,とっさに書き方が分からなくて(特に引数の取り方)迷うことがあるので,ハマるたびに少しずつ書き足していくメモとする.
函数
VLOOKUP
VLOOKUP (lookup_value, table_array, col_index_num, [range_lookup])
- 求める値 (
lookup_value
) を,table_array
の左端の列から探して,見つかった行のcol_index_num
列目を返す. range_lookup
がTRUE
がデフォルト動作で,これは exact match を要しない.この時には,table_array
の最初の列がソートされていることが必要で,かつ closest value を返す
ハマりどころ
- 探したいものは
table_array
の左端にないとダメ col_index_num
はtable_array
の左端を1として何列目かを指定する上,table_array
に含まれていないといけないrange_lookup
を与えないとデフォルト動作では最も近い行を返す(多分二分探索の最後なんだろう),基本的には常にfalse
でいいのではないか
たとえば
適当な番号 | 名前 | 探したいやつ | “=VLOOKUP(C2,A:B,2)” | “=VLOOKUP(C2,A:B,2,FALSE)” |
1 | a | 1 | a | a |
2 | b | 2 | b | b |
3 | c | 10 | e | #N/A |
4 | d | 11 | e | #N/A |
6 | e | 13 | e | #N/A |
76 | f | 50 | e | #N/A |
100 | g | 76 | f | f |
こちらは記法の例
=VLOOKUP(A2,A10:C20,2,TRUE)
=VLOOKUP("Fontana",B2:E7,2,FALSE)
=VLOOKUP(A2,'Client Details'!A:F,3,FALSE)
Bash の変数/文字列操作 (Parameter Substitution)
Bash では,たとえば f="IMG_0001.JPG"
のとき, ${f%.JPG}
で IMG_0001
が取れる.だいぶ以前にすこし触れたことがあって, そのときには これ とかを参照したが,ここにもメモを残しておく.
用語の整理
echo {01..10}.txt
みたいなのは brace expansion と呼ばれるが,それとはまた違ってですね….
多分 Linux Documentation Project にある Advanced Bash-Scripting Guide では, Chapter 10 Maniplating Variables のなかの Parameter substitution とか string operations とかで扱われている内容で,
Bash supports a surprising number of string manipulation operations. Unfortunately, these tools lack a unified focus. Some are a subset of parameter substitution, and others fall under the functionality of the UNIX expr command.
ともあるので,用語の混乱も致し方なし…という雰囲気.和文献では
- 先程挙げたのでは 変数内の文字列置換 (ozuma.hatenablog.jp) とされていたり,
- 変数展開 (tohoho-web.com) , (qiita.com/t_nakayama0714)とか
- パラメータ展開 (zenn.dev/shmi593) の一機能として扱われたり,
- 変数の置換機能 (gihyo.jp)と呼ばれたり,
しているようだ.
ざっと見る
自分が直近使いそうな気がするやつだけ抜き出す
変数定義されてるかどうかによって変わる系
${parameter-default}, ${parameter:-default} # 未定義なら default
${parameter=default}, ${parameter:=default} # 未定義なら default に set
変数の文字列操作
長さ・index 系
f="IMG_0001.JPG"
echo ${#f} # => 12, 長さ
echo ${f:5} # => 001.JPG, offset 5 から
echo ${f:4:4} # => 0001, offset 4 から最大4文字
# {var:pos:len}
マッチ・置換などの操作系
echo ${f#IMG_} # => 0001.JPG, 前から Pattern を削除
echo ${f##IMG_} # => こっちは最長マッチ,↑は最短マッチ
echo ${f%.JPG} # => IMG_0001, 後ろから Pattern を削除
echo ${f%%.JPG} # => IMG_0001, 同様に最長マッチ
echo ${f/JPG/png} # => IMG_0001.png, 置換
echo ${f/0/Zero} # => IMG_Zero001.JPG
echo ${f//0/Zero} # => IMG_ZeroZeroZero1.JPG, global replacement
echo ${f/%JPG/png} # => IMG_0001.png, 末尾に合致したら置換. # も同様にある
g="out.tiff"
echo ${g/%.JPG/.png} # => out.tiff
echo ${g%.JPG}.png # => out.tiff.png
h="IMG"
echo ${f#$h} # => _0001.JPG, こういうのもできる
ちょっとした処理をその場でするときに便利ですね.
Theme なしで Hugo を使いはじめる
普段コードをあまり書かない人とも共同で扱うかもしれないことから,(jekyll に比べて環境構築が楽かもしれない) hugo の利用を検討して,このブログもその一環で作成している. 公式の quick start 通り theme を使うとむしろ機能がわかりにくいので,素の状態から使い始めてみる的なやつを,随時更新しながらメモ書きとする.
本当の quick start
- 公式の quick start では
hugo new site quickstart
して次にgit submodule
で theme をインストールしている - しかし,たとえばこの
themes/ananke/layouts/
に置いてあるファイルは,普通にプロジェクト直下のlayouts/
に置いていても同様に働く(むしろ,そういうのをまとめてパッケージ化したのが theme といって良さそうだ).- しかし,一気に theme 全体の理解をするのは大変っぽい.
- そこで,
hugo new theme
でできる空のテーマから必要そうなファイルをプロジェクト直下にコピーしていき,機能の理解を進めながらシンプルにやってみることにする.
構造
hugo new theme my-theme
でできるのはこんな構造だ
./
├── archetypes/
│ └── default.md
├── assets/
│ ├── css/
│ │ └── main.css
│ └── js/
│ └── main.js
├── content/
│ ├── _index.md
│ └── posts/
│ ├── _index.md
│ ├── post-1.md
│ ├── post-2.md
│ └── post-3/
│ ├── bryce-canyon.jpg
│ └── index.md
├── data/
├── hugo.toml
├── i18n/
├── layouts/
│ ├── _default/
│ │ ├── baseof.html
│ │ ├── home.html
│ │ ├── list.html
│ │ └── single.html
│ └── partials/
│ ├── footer.html
│ ├── head/
│ │ ├── css.html
│ │ └── js.html
│ ├── header.html
│ ├── head.html
│ ├── menu.html
│ └── terms.html
├── LICENSE
├── README.md
├── static/
│ └── favicon.ico
└── theme.toml
documentation の Directory structure にある通りだがざっくり,
archetypes/
がhugo new content
で新しい記事/ページを作る時の雛形assets/
は見た通りcontent/
が実際のページ・記事hugo.toml
が設定ファイルlayouts/
が,content/
にあるいろいろとか,トップページとかを実際の形にするためのテンプレートstatic/
にあるファイルはビルド後pubic/
直下に置かれる
みたいな構造になっている.
このうち archetypes/default.md
は書きながら適宜便利そうなやつを追加していけば良さそうで,サイトの機能という意味では主に layouts/
を触っていくことになる.
layouts
layouts/_default/home.html
- 上の空の theme の
layouts/
をまるっとコピーすると,これがサイトの root で見られるページを作る(はず). たとえば
{{ define "main" }}
{{ .Content }}
<div class="the-posts">
<ul class="post-list">
{{ range site.RegularPages }}
<li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a> — {{ .Date | time.Format "02 January 2006" }}</li>
<!-- {{ .Summary }} -->
{{ end }}
</ul>
</div>
<div class="links">
See <a href="/posts">all posts</a> or <a href="/tags">tags</a>.
</div>
{{ end }}
を今は採用している.
テンプレートのややこしい所はあるがまあ最終的には見たままの動きではある
layouts/_default/list.html
デフォルトではこんなふうになっている.
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ .Content }}
{{ range .Pages }}
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
{{ .Summary }}
{{ end }}
{{ end }}
最初の時点からなんか色々思ったより表示されるな…?となるのはこいつの力,というのも…
layouts/tags/tag.terms.html.html
あんまりそれっぽいテンプレートがないのに色々表示される,とか,なぜかここの更新がこっちに反映されないとか,ここの更新がこっちにも影響してしまう…とかが色々出てくる.
見るべきは lookup order のドキュメンテーション.例えば,タグの一覧を示すページはここ を見て,layouts/tags/tag.terms.html.html
というファイルを作ると,専用のテンプレートとして設定できる.
そんなファイルが存在しないうちからなんとなくそれっぽいものが表示されていたのは,lookup order の下の方に layouts/_default/list.html
があるから.リスト化するやつはだいたいこれね,という感じでよしなに作られていたわけだ.
同様に個別のタグのページは例えば,layouts/tags/term.html.html
に
{{ define "main" }}
<h2>Posts tagged with: {{ .Title }}</h2>
{{ .Content }}
<div>
<ul class="article-list">
{{ range .Pages }}
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHuman := .Date | time.Format "02 January 2006" }}
<li>
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
<time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
</li>
{{ end }}
</ul>
</div>
{{ end }}
のようにする.
Taxonomy
- Hugo独自のもの…だと思うが,普通の tag とか category を包括する形で,種別・そのなかのメンバ・どのページにそれが紐づけられているか,が概念化されている.
- Taxonomy, Term, Value の区分を含めて,やはりこれも ドキュメンテーション がわかりやすい.
- ひとまず以下の設定で,タグだけ有効にしている.このときタグ一覧のページとかは上記の layout で作られているわけだ.
[taxonomies]
tag = 'tags'
こんな感じで紐解きながらちょっとずついじりながら,が良さそう. しばらくは随時構造を少しずつ調整していくので,その都度ここに追記するかより細かい記事を投げていくかしていきたい.
OpenCV を自前ビルドして opencv-rust から使う件
Manjaro と ubuntu (WSL2) でバージョンが違って,一部引数の個数が違ったりしてアレだったので,WSL 用にビルドしたうえで,opencv-rust に使ってもらおうというやつ.apt
で入った 古い opencv がすでに入っている状態からのスタートだった.
ビルド
- これは割と単純.opencv には opencv_contrib という,追加のモジュール群を合わせたのがあるので,これも合わせて用意する.
- 公式のインストールのチュートリアル にほぼ沿えばよいが,今後のアップデートのことも考えて zip じゃなくて git で clone しておく.両方 github にあって,今回は tag
4.11.0
に checkout した. - また,この後 rust から使う際に必要になるので,pkgconfig も作ってもらうようにする.opencv と opencv_contrib を同じディレクトリで clone していた場合は,自分で作った
opencv/build
の下からこんな感じ
cmake -DOPENCV_GENERATE_PKGCONFIG=ON -DOPENCV_EXTRA_MODULES_PATH="../../opencv_contrib/modules" ../
- このあたりは OpenCV configuration options reference に詳しい.
- あとは
make
してsudo make install
でとりあえずはOK.
rust からの利用
- いくつか環境変数の設定の必要がある.
- ここでさっき作った pgkcfg が効いてきて, たぶん opencv-rust が pkgconfig を使ってバージョンを判定しているところがあって,ここで間違えて apt 側の (
/usr/include
の) バージョンを見てしまって食い違ってるよってなったのは,上記の-DOPENCV_GENERATE_PKGCONFIG=ON
で解消した.OpenCV version from the headers: (at /usr/local/include/opencv4/) must match version of the OpenCV library (include paths: ["/usr/local/include/opencv4/"])
といって怒られる.
- 最終的に加えたのは以下.全部要るのか・これが本当に正解なのかはよく知らない.
export OPENCV_DIR="/usr/local/lib/cmake/"
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig"
export LD_LIBRARY_PATH="/usr/local/lib/"
export OPENCV_LINK_PATHS="/usr/local/lib"
export OPENCV_INCLUDE_PATHS="/usr/local/include/opencv4/"
確認
- 新たな(じゃなくてもいいけど)プロジェクトで,opencv::core::CV_VERSION を print させて望みのものが出たらOK.