notes.kagcc

posts

Logseq Publish のインストールメモ(大体 ubuntu のせい)

Logseq でできた graph を, static site としてホストしたい. 非公式の日本語マニュアルにいい情報 (scrapbox.io) があるが,

今回は珍しく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

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 は罠

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])

ハマりどころ

たとえば

適当な番号 名前 探したいやつ “=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.

ともあるので,用語の混乱も致し方なし…という雰囲気.和文献では

しているようだ.

ざっと見る

自分が直近使いそうな気がするやつだけ抜き出す

変数定義されてるかどうかによって変わる系

${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

構造

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/default.md は書きながら適宜便利そうなやつを追加していけば良さそうで,サイトの機能という意味では主に layouts/ を触っていくことになる.

layouts

layouts/_default/home.html

{{ define "main" }}
	{{ .Content }}
	<div class="the-posts">
		<ul class="post-list">
		{{ range site.RegularPages }}
			<li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a> &mdash; {{ .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

[taxonomies]
  tag = 'tags'

こんな感じで紐解きながらちょっとずついじりながら,が良さそう. しばらくは随時構造を少しずつ調整していくので,その都度ここに追記するかより細かい記事を投げていくかしていきたい.

OpenCV を自前ビルドして opencv-rust から使う件

Manjaro と ubuntu (WSL2) でバージョンが違って,一部引数の個数が違ったりしてアレだったので,WSL 用にビルドしたうえで,opencv-rust に使ってもらおうというやつ.apt で入った 古い opencv がすでに入っている状態からのスタートだった.

ビルド

cmake -DOPENCV_GENERATE_PKGCONFIG=ON -DOPENCV_EXTRA_MODULES_PATH="../../opencv_contrib/modules"  ../

rust からの利用

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/"

確認