ときどきの雑記帖 RE* (新南口)
Song of Earth
今週のしずえさん
リュックサックの「アレ」の役目(目的)
日経
読みたくはあるんだけど、 「あの人」が記事書いてる間は絶対有料会員になるつもりはないし、 無料でも会員登録したくないんだよなあここ。
ブライアン・カーニハン=プリンストン大学
カーニハン大先生の記事はほかにもあるのか。
split
発端は
投票とってみるか。
— いわた (@wonderful_panda) June 21, 2021
「与えられた文字列をカンマでsplitした結果を配列で返す」というメソッドがあるとして、空文字列を指定した結果は
これが 0 になる処理系って何があるの?(なんで半数割れしてるのか分からない) https://t.co/SKq07dPYpz
— mattn (@mattn_jp) June 21, 2021
で、関連する一連の発言はここにまとめられていて
その中の一つによれば
改訂版
空文字列をsplitした結果→
空リスト派: Perl, Ruby, R, D, Go, Tcl, Julia
空文字列のリスト派: JavaScript, Python, Java, Kotlin, C#, Rust, Crystal
なのだそうだけど、なんで誰もawk出さんのじゃ(しくしく)。
まあそれはさておき、 Ruby の仕様は確か Perlのそれを踏襲したものだったと記憶しているのだけど、 そのPerlはおそらくawkに影響受けてると思うのだよね(要検証)。
んでまあ Perl に関しては
Perlの組み込み関数 split の翻訳 - perldoc.jp
LIMIT の指定に関わらず、空文字列に評価される EXPR を分割すると常に 0 個の フィールドを生成することに注意してください。
のようにこの動作はドキュメントに明記されているのだけど String#split (Ruby 3.0.0 リファレンスマニュアル) には見当たらない?
awk
それはそれとしてawkの話。手っ取り早いところでgawkのマニュアルから。
split(string, array [, fieldsep [, seps ] ])
Divide string into pieces separated by fieldsep and store the pieces in array and the separator strings in the seps array. The first piece is stored in array[1], the second piece in array[2], and so forth. The string value of the third argument, fieldsep, is a regexp describing where to split string (much as FS can be a regexp describing where to split input records). If fieldsep is omitted, the value of FS is used. split() returns the number of elements created. seps is a gawk extension, with seps[i] being the separator string between array[i] and array[i+1]. If fieldsep is a single space, then any leading whitespace goes into seps[0] and any trailing whitespace goes into seps[n], where n is the return value of split() (i.e., the number of elements in array).
このあと詳しい説明が続いているのだけどそこは省略してこの部分。
If string is null, the array has no elements. (So this is a portable way to delete an entire array with one statement. See section The delete Statement.)
空文字列じゃないけどセパレーターも含んでいない文字列をsplitした場合についてはこのように。
If string does not match fieldsep at all (but is not null), array has one element only. The value of that element is the original string.
で、なぜそうなった(そうなっているか)の理由だけど、たぶんここからだろうと思う。
kbk@toybox4:/mnt/c/Users/kbk$ gawk 'BEGIN{split("", ary, ",");print length(ary)}'
0
kbk@toybox4:/mnt/c/Users/kbk$ gawk '{print NF}'
a
1
0
a b c
3
kbk@toybox4:/mnt/c/Users/kbk$
内部的には入力レコードのフィールド分割はsplitと同じ事で、 レコードが空のときにフィールド数が1になると色々面倒になる(たぶん)。
あと、awkに影響を与えた(とされる)言語がどうかは知らないし調べる気もないので その辺よろしく。
その他の言語
JuliaはRからの流れだろうけど、Tclはどこから来たんかねえ。
RはRでSの仕様から来たような気もするけどどうなんだろう。
glob zsh編 その0
Bourne Shellは前回でけりをつけた(つもりな)ので、 次はbashとzshのどちらにしようかと考えたのだけど 「なじみの薄い方」のzshにした。
んで、zsh-users/zsh: Mirror of the Z shell source code repository. を参照しつつ見ていこうと思い、つらつらとディレクトリ構成とファイル一覧を眺めていると
.indent.pro
というファイルがあるのに気がついた。なにこれと思い調べると indentが参照するファイルらしい。その中身はというと
zsh/.indent.pro at master · zsh-users/zsh
--dont-format-comments
--procnames-start-lines
--no-parameter-indentation
--indent-level4
--line-comments-indentation4
--cuddle-else
--brace-indent0
--dont-star-comments
--blank-lines-after-declarations
--blank-lines-after-procedures
--no-blank-lines-after-commas
--comment-indentation33
--declaration-comment-column33
--no-comment-delimiters-on-blank-lines
--continuation-indentation4
--case-indentation0
--else-endif-column33
--no-space-after-casts
--no-blank-before-sizeof
--declaration-indentation0
--continue-at-parentheses
--no-space-after-function-call-names
--swallow-optional-blank-lines
--dont-space-special-semicolon
--tab-size8
--line-length132
--braces-on-if-line
indentを使っていたのは大昔のことなのでロングオプションが使えるとか知らなかったけど
なるほどそれっぽい内容ではある。
にしても、数値パラメーターをとるオプションも
--line-length=132
じゃなく--line-length132
のように記述するのね。
GNU getoptってこんなんハンドリングできたっけ?
gnu indent
- Man page of INDENT
- Indent - GNU Project - Free Software Foundation
- GNU Indent - beautify C code - GNU Project - Free Software Foundation (FSF)
Manページのこれ
indent の他のオプションのほとんどは、 プログラムをどのように整形する かを制御するためのものである。 バージョン 1.2 からは、indent は各オプ ション名として長い名前も認識する。 長いオプションの前には `–’ か `+’ が置かれる。 [POSIX 標準と一貫性を持たせるため、現在は `+’ を `–’ に置き換えようとしているところである。] 本ドキュメントの大部分では、簡潔に表現するために伝統的な短い名前を 使っている。
最新バージョンでも+
をロングオプションの開始記号として受け付けてるんだろうか?
といきなり脱線から始まるのであった。
Hugo メモ
0.84.0
0.84.0 がリリースされていた。
Release v0.84.0 · gohugoio/hugo
今使っているバージョンはいくつだったっけかと調べると0.80.0だった。 週末にでもあげとくか。
theme
ついでに使っているテーマの方はどうかと調べると
Gohugo Theme Ananke | Hugo Themes
Minimum Hugo Version: 0.64.0 Updated: 2021-06-17
あら。つい最近更新されてるじゃないですか。 Releases · theNewDynamic/gohugo-theme-ananke で更新内容をチェックしておこう (というかそろそろテーマを変えちゃうかという気も)。
目次ページ
というか、月ごとのまとめページを作りたいなあと思ったのだけど
Hugoでのアーカイブページの作り方を調べてみると、大きく分けて次の2つがありました。
a) Taxonomyでコンテンツごとに年・月の情報を付加する /2020/, /2020-12/のように年ごと、月ごとのアーカイブページを自動生成できる b) Archive用のテンプレートと、Archiveページのコンテンツを作成する
a)の方式だと各コンテンツのFront Matterに情報を付加しないといけないため、まずは簡単にできそうなb)の方法で実装しました。
ふむ。Taxonomyにはそんな使い道もあったのか。 とは言えそもそもTaxonomyを無効にして使ってるのだけどね😄
とすると、b)の手段か。
大サトーおじさんの愛猫千早は、冬になると家中の扉を開けてくれとせがむ。千早は、扉のどれかが明るく楽しい夏へ通じていると信じて疑わず、「夏への扉」を探しつづけ、決して諦めないのだ。
— 3200たか (@3200taka) June 14, 2021
そして、大サトーおじさんもまた「夏への扉」を探していた。#大サトー