ときどきの雑記帖 RE* (新南口)
2020年11月29日
black friday
今年も各所で black friday のセールが (追記 すでに終わっています)。
- Packt | Programming Books, eBooks & Videos for Developers
- Manning | Home
- Springer - International Publisher Science, Technology, Medicine
- Cyber Deal | Apress
- Pragmatic Bookshelf: By Developers, For Developers
んが、Packt はサブスクリプションの期間限定値下げだけ?
追記
No Starch Press。 No Starch Press | “The finest in geek entertainment”
この半端に見える割引率(33.7%)には何か意味があるんだろうか?
今日の bash tips: 変数の文字列を先頭大文字にしたり全て大文字/小文字にしたりするのに sed は使わない。
— mattn (@mattn_jp) November 18, 2020
$ os=linux; echo ${os^}
Linux
$ os=linux; echo ${os^^}
LINUX
$ os=LinuX; echo ${os,}
linuX
$ os=LinuX; echo ${os,,}
linux
$ os=LiNuX; echo ${os~~}
lInUx
これも足しておこう。
— mattn (@mattn_jp) November 18, 2020
$ os=Linux; echo ${os//inu/umi}
Lumix
さて本題。
Bash 固有の機能だろうなあと思いつつまずは
Shell Parameter Expansion (Bash Reference Manual) を見ると、 【シェル芸人への道】Bashの変数展開と真摯に向き合う - Qiita にも
${parameter~pattern}: 大小文字反転
さらに大小文字の反転までできます。なぜかマニュアルには記述が見当たらない…。
とあるように ^ と , の記載はあるが ~ はない。
それじゃあとソースコードに当たり subst.c に parameter_brace_expand という関数 bash/subst.c at master · bminor/bash · GitHub を発見。
ここで
parameter_brace_expand (string, indexp, quoted, pflags, quoted_dollar_atp, contains_dollar_at)
#if defined (CASEMOD_EXPANSIONS)
  else if (c == '^' || c == ',' || c == '~')
    {
      modspec = c;
      want_casemod = 1;
    }
#endif
や
#if defined (CASEMOD_EXPANSIONS)
  else if (want_casemod)
    {
      temp1 = parameter_brace_casemod (name, temp, ind, modspec, value, quoted, pflags, (tflag & W_ARRAYIND) ? AV_USEIND : 0);
      FREE (value);
といったものを発見。
Search · CASEMOD_EXPANSIONS · GitHub
を見るに、コンパイル時に CASEMOD_EXPANSIONS が定義されている場合にのみ ~ は有効になるようだ。
undocumented な理由は不明。
実はこの後対象が通常の変数なのか配列なのかなどによって分岐をしていき、 説明が面倒なのでここまでで止め。
zsh
zshはどうなんだろうと思い調べてみると、似たような機能はあるらしい (ただし case の入れ替えはない模様)。大文字化、小文字化の記述はzshスタイルの方が わかりやすい気がする(ほかの機能も入れやすそうだし)。
- Zsh 変数メモ - GitHub
- zsh の分かりにくい記号、用語のまとめ - Qiita
- zshexpn(1): zsh expansion/substitution - Linux man page
POSIX の範囲でどうなのかは Shell Command Language 2.6.2 Parameter Expansion 辺りで(makeみたいに反映されていない更新があったりするんだろうか)。
fish はわからん。
Hugo メモ
config.toml
permalinks
現在ここで使用しているpermalinks は以下のルールに従っている (コメントアウトしている二行目は最近まで使っていたもの)。
[permalinks]
  post = "/post/:year/:month/:day/"
# post = "/post/:year/:month/:day/:filename/"
上記で使ったものを含め使用できるパラメータは以下の通り
(コロンで始まっていない部分(上記の例でいえば post )はそのまま使われる)。
| パラメータ名 | 意味 | 
|---|---|
| :year | 数字4桁で表した西暦年 | 
| :month | 数字2桁で表した月 | 
| :monthname | 英語での月名(January, February, …, December) | 
| :day | 数字2桁で表した日 | 
| :weekday | 日曜を0とし、土曜を6として数字で表した曜日(0~6) | 
| :weekdayname | 英語での曜日(Sunday, Monday, …, Saturday) | 
| :yearday | 1月1日を1とした年内の通日(1~366) | 
| :section | コンテンツのsection | 
| :title | コンテンツのtitle | 
| :slug | コンテンツのslug(なければtitle) | 
| :filename | 拡張子を除いたファイル名 | 
ここで slug とはなんぞやという話なんだけれども、きちんと説明するのがめんどうなのでリンク先に丸投げ。
- 静的サイトジェネレータHugoを使ったサイト構築(レイアウト編3) · feedtailor Inc. スタッフブログ
- Hugoで記事を書く方法(フロントマター編) - たかけんテックラボ
- URL Management | Hugo
deprecated
ふと何やら警告が出ていたのに気がつく。
$ hugo server
Building sites … WARN 2020/11/28 14:43:33 Page.URL is deprecated and will be removed in a future release. 
Use .Permalink or .RelPermalink. If what you want is the front matter URL value, use .Params.url
                   | JA
-------------------+-----
  Pages            | 29
  Paginator pages  |  6
  Non-page files   |  2
  Static files     | 10
  Processed images |  0
  Aliases          |  2
  Sitemaps         |  1
  Cleaned          |  0
Built in 447 ms
Watching for changes in C:\Users\kbk\xxx\yyy\zzz\{content,static,themes}
Watching for config changes in C:\Users\kbk\xxx\yyy\zzz\config.toml
Environment: "development"
Serving pages from memory
Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
Web Server is available at http://localhost:1313/~kbk/zakkicho/ (bind address 127.0.0.1)
Press Ctrl+C to stop
いつから出ていたものだろうと思いつつも警告内容を手掛かりに調べてみると rss出力のためのテンプレートで
<atom:link href="{{.URL}}" rel="self" type="application/rss+xml" />
と書いていたのが引っかかっていた。
Hugo 0.53→0.55.6に上げたときの警告の対応方法 - Qiita
では .RelPermalink を薦めていたけど .Permalink にしてみた。 その結果、無事警告は消えた。
table
table を border つきにするのは markdown 中のtable表記の直前に
 {{<  table id="tableid"  border=2  >}}
を置くことで解決(前出のテーブルで使った)。 本来はcssファイルをきちんと書くべきなんだけど 新しいファイルをあちこちで作りたくなかったのでとりあえずはこれで。
話はちょっとそれるけど、上記のコード部分の markdownを最初はそのまま 書いたところ markdown パーザーが shortcode をしっかり解釈してしまい 結果がえらいことに。
 \{\{< table id="urlparams" class="bordered" border=2 >}}
のようにエスケープするという手段もあったのだけど、出力にも \ が残るのがよろしくない。 で、
を参考に、shortcode を指定する二重カーリーブレースの内側を
/* と */ によるコメントにして解決。
わかるかこんなの。
TODO
- PCで見たときの表示幅を広くしたい
- home と post の関係をきちんとする
- home と post それぞれで生成される index.htmlの表示内容の改善(左上のリンクとか)