ときどきの雑記帖 RE* (新南口)
パーフェクトストーム
完璧な嵐
「A380は過ちだったのでしょうか?」元エアバスマネージャーが語る - Togetter
「リーヒー氏:そう、完璧な嵐でした。もしA380が(当初の)発表通り2005年に就航していたら、 あるいは少なくとも新世代のエンジンを搭載して燃費を向上させたA380が2007年に納入されていたら、 それは金融危機の前だったはずです。そうすれば、A380はより良いスタートを切ることができたでしょう」
「完璧な嵐」とはなんじゃそれ? と思ったが、ひょっとして「Perfect Storm」を字面通りに訳してる?
実はこの言葉、ある映画のタイトルにも使われていて
『パーフェクト ストーム』(The Perfect Storm)は、2000年のアメリカ合衆国のパニック映画。監督はウォルフガング・ペーターゼン、 出演はジョージ・クルーニーとマーク・ウォールバーグなど。タイトルの「パーフェクト・ストーム」は 複数の厄災が同時に起こって破滅的な事態に至ることを意味する[4]。
という(観に行ったよこの映画。ってもう20年前なのか)。 辞書にもちゃんと載っている(はず)。 たとえば上記引用部の[4]のリンク先がこれ perfect stormの意味・使い方|英辞郎 on the WEB
だからまあ「完璧な嵐」はあんまりですよね。ということで、原文はと見てみると
John Leahy über den Airbus A380: “Wir haben klar einen Designfehler gemacht” | STERN.de
Ja, es war der perfekte Sturm. Hätten wir die A380 wie angekündigt 2005 im Dienst gehabt oder wäre sie 2007 zumindest mit besserer Treibstoffeffizienz ausgeliefert worden mit neuer Triebwerksgeneration, wäre das vor der Finanzkrise gewesen. Dann wäre die A380 besser in Gang gekommen.
ドイツ語…わからん(大学で履修した第2外国語はフランス語)。が、perfekte Sturm
でググると
なんとドイツ語版Wikipediaに項目があった
(いや、末尾のrのあるなしが違うか? が、ドイツ語わからんのでヨシ!)。
Der Begriff perfekter Sturm ist eine wörtliche Übersetzung des englischen Ausdrucks perfect storm und bezeichnet eine maximale Katastrophe.
なんやらよくわからんけど、英語から輸入された言葉ぐらいな感じ?>englischen Ausdrucks
最後に英語版Wikipediaから。
A perfect storm is a meteorological event aggravated by a rare combination of circumstances.[1] The term is used by analogy to an unusually severe storm that results from a rare combination of meteorological phenomena.
パラダイムシフト
この本(「7つの習慣」)は読んだことないんだけど、本当に paradigm や paradigm shiftをこういう使い方しているの?
第467回 今一度、パラダイムシフトについて考える:5分間キャリア・コンサルティング:エンジニアライフ
「パラダイム」は7つの習慣ではよく出てくる考え方で私のコラムでも何度も紹介させてもらっていますが、 ものの考え方や価値観のことをいいます。自分の持つパラダイムをより効果性の高いパラダイムに変換することをパラダイムシフトといいます。
どうも引っかかるのであれこれ検索してみるとどうもそうらしい。
えーなんかやだなあ。
でもまあ「パラダイム(とパラダイムシフト)」くらい「いい加減な使い方」をされている言葉も そうそうないだろうから、こんなもんなのかねえ。
POSTD
POSTDをGatsby.jsベースに変更しました | POSTD
あら。また更新されるようになるのかな?
glob
まずは仕様を再確認。
2.13.3 Patterns Used for Filename Expansion
If the pattern matches any existing filenames or pathnames, the pattern shall be replaced with those filenames and pathnames, sorted according to the collating sequence in effect in the current locale. If the pattern contains an invalid bracket expression or does not match any existing filenames or pathnames, the pattern string shall be left unchanged.
確かにマッチするものがなかった場合はそのままの文字列になると書かれてますな。
コードのチェックまで行けなかった。(誰に向けるでもなく)すまん。
そもそも見るべきはglobの処理そのものではなく、それを呼び出しているところな気もしてきたがそこはそれ。
Hugo メモ
id
あとは結局コードに当たるしかないか。
と書いたので読み始めた(Goはよくわからんけど)。
ざっとディレクトリ構成を眺めて行くとmakrkup/goldmark
といういかにもな
名前のものがあったので、そこにあるファイルを確認する。
hugo-0.82.1\markup\goldmark のディレクトリ
2021/05/01 18:42 <DIR> goldmark_config
2021/05/01 18:42 <DIR> internal
2021/04/20 20:02 3,222 autoid.go
2021/04/20 20:02 3,800 autoid_test.go
2021/04/20 20:02 8,509 convert.go
2021/04/20 20:02 13,251 convert_test.go
2021/04/20 20:02 9,452 render_hooks.go
2021/04/20 20:02 2,901 toc.go
2021/04/20 20:02 3,913 toc_test.go
autoid.go
という名前のファイルがそれっぽそうなので、その中身を見るとこんな感じ
(ファイル冒頭のライセンス表記とimport部などは省略)。
autoid.go
func sanitizeAnchorNameString(s string, idType string) string {
return string(sanitizeAnchorName([]byte(s), idType))
}
func sanitizeAnchorName(b []byte, idType string) []byte {
return sanitizeAnchorNameWithHook(b, idType, nil)
}
func sanitizeAnchorNameWithHook(b []byte, idType string, hook func(buf *bytes.Buffer)) []byte {
buf := bp.GetBuffer()
if idType == goldmark_config.AutoHeadingIDTypeBlackfriday {
// TODO(bep) make it more efficient.
buf.WriteString(blackfriday.SanitizedAnchorName(string(b)))
} else {
asciiOnly := idType == goldmark_config.AutoHeadingIDTypeGitHubAscii
if asciiOnly {
// Normalize it to preserve accents if possible.
b = text.RemoveAccents(b)
}
b = bytes.TrimSpace(b)
for len(b) > 0 {
r, size := utf8.DecodeRune(b)
switch {
case asciiOnly && size != 1:
case r == '-' || r == ' ':
buf.WriteRune('-')
case isAlphaNumeric(r):
buf.WriteRune(unicode.ToLower(r))
default:
}
b = b[size:]
}
}
if hook != nil {
hook(buf)
}
result := make([]byte, buf.Len())
copy(result, buf.Bytes())
bp.PutBuffer(buf)
return result
}
func isAlphaNumeric(r rune) bool {
return r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r)
}
var _ parser.IDs = (*idFactory)(nil)
type idFactory struct {
idType string
vals map[string]struct{}
}
func newIDFactory(idType string) *idFactory {
return &idFactory{
vals: make(map[string]struct{}),
idType: idType,
}
}
func (ids *idFactory) Generate(value []byte, kind ast.NodeKind) []byte {
return sanitizeAnchorNameWithHook(value, ids.idType, func(buf *bytes.Buffer) {
if buf.Len() == 0 {
if kind == ast.KindHeading {
buf.WriteString("heading")
} else {
buf.WriteString("id")
}
}
if _, found := ids.vals[util.BytesToReadOnlyString(buf.Bytes())]; found {
// Append a hypen and a number, starting with 1.
buf.WriteRune('-')
pos := buf.Len()
for i := 1; ; i++ {
buf.WriteString(strconv.Itoa(i))
if _, found := ids.vals[util.BytesToReadOnlyString(buf.Bytes())]; !found {
break
}
buf.Truncate(pos)
}
}
ids.vals[buf.String()] = struct{}{}
})
}
func (ids *idFactory) Put(value []byte) {
ids.vals[util.BytesToReadOnlyString(value)] = struct{}{}
}
キモは sanitizeAnchorNameWithHook
の
r, size := utf8.DecodeRune(b)
switch {
case asciiOnly && size != 1:
case r == '-' || r == ' ':
buf.WriteRune('-')
case isAlphaNumeric(r):
buf.WriteRune(unicode.ToLower(r))
default:
}
b = b[size:]
の部分だと思うけど、case ...
が二行連続しているところって
前の方は処理部分が空ってことでいいのだよね?
C(やそのフォロワーの多く)ではbreakがないとfall throughするけど
Goだとfall throughさせたいときはそのように書くとなっているし、
case のあとに複数の条件をカンマでつないで置けるしで。
switch による条件分岐 | まくまくHugo/Goノート
とすると、asciiOnly でutf8.DecodeRune(b) の戻り値(の一つ)が1でないときは 単に読み飛ばす。と。
三番目のcaseで呼び出している isAlphaNumeric は
return r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r)' なので
unicode.` という「冠」がついているのでこれはこれで調べる必要があるけど
全体として記号類をはじいているという感じ。
goldmark
とここまで書いて、
asciiOnly := idType == goldmark_config.AutoHeadingIDTypeGitHubAscii
の部分でHugo の設定ファイルに↓のようなものがあるのを思い出した。
Goldmarkの設定 | Hugo | nasust dev blog
autoHeadingIDType
見出しに自動的にidを設定する場合の命名規則を設定します。
デフォルト: “github”see also: Incomplete auto heading ID for extended Latin and CJK characters · Issue #6616 · gohugoio/hugo
github、github-ascii、blackfridayのいずれかを設定できます。
github - GitHub互換のIDを生成します。
github-ascii,blackfriday - アクセントの正規化後に非ASCII文字をドロップします。見出し例:「Hugoとは」 → 「id=Hugo」
最初っからここ見れば良かったか😅
上記の引用部分にある issue を追いかけていくと
- Incomplete auto heading ID for extended Latin and CJK characters · Issue #6616 · gohugoio/hugo
- Github Markdown Heading Anchors
この部分が知りたかったことだな
Github Markdown Heading Anchors
The code that creates the anchors is here:
https://github.com/jch/html-pipeline/blob/master/lib/html/pipeline/toc_filter.rbIt downcases the string
remove anything that is not a letter, number, space or hyphen (see the source for how Unicode is handled)
changes any space to a hyphen.
If that is not unique, add “-1”, “-2”, “-3”,… to make it unique
長かった(笑)
ところで、Hugoで使われている markdown parser(goldmark)の作者って日本人 (日本語を書いているからと言ってそう断定するのは今日日アレかも知らんけど) だったのか。
- inforno :: goldmarkがHugoに採用された
- inforno :: Go言語でCommonMarkパーサを実装した、またCommonMarkについて
- yuin/goldmark: A markdown parser written in Go. Easy to extend, standard(CommonMark) compliant, well structured.
- goldmark/README.md at 155754ef6e54f2c1a9ee5a171edbcab710792184 · yuin/goldmark
脱線
Effective Go — プログラミング言語 Go ドキュメント v0.1 documentation
他の言語と同様に、Goにおいても名前は重要です。場合によって、名前は意味上の効果をもたらします。 例えば、パッケージの外側にある名前の可視性は、名前の一文字目が大文字かどうかで決定されます。 従って、命名規則にわずかばかりの時間を使うことは、Goにおいて価値のあることです。
Go では,他の言語と同様に名前が重要です。 名前は意味にも影響を及ぼし,パッケージ外の名前の可視性は, 最初の文字が大文字かどうかによって決まります。それで, Go プログラムの命名規則について話しましょう。
今一つしっくり内容が頭に入ってこない文章なので例によって原文に当たってみる。 ひょっとしたら(原文と翻訳とで)バージョンが異なる可能性もあるけど、 それはそれとして
Effective Go - The Go Programming Language
Names are as important in Go as in any other language. They even have semantic effect: the visibility of a name outside a package is determined by whether its first character is upper case. It’s therefore worth spending a little time talking about naming conventions in Go programs.
outsideの意味・使い方・読み方|英辞郎 on the WEB
visibility of a name outside a package
は
「あるパッケージの中からその外にある名前がどう見えるか」
という話ではなく、
「あるパッケージに属する名前がそのパッケージの外からどう見えるか」
って話ではなかろうか?
外部に公開する関数や構造体の場合、先頭を大文字にするという言語仕様があるので、 それに合わせてアッパーキャメルケース(先頭大文字から始まる)かローワーキャメルケース(先頭小文字から始まる)が決まります。
教えてGo のえらいひと (って一定の年齢以上にしか通じねえな)
(宇宙歴799年の)5月5日
宇宙暦七九九年五月五日
— 今日は何の日@銀英伝bot (@logh_today) May 4, 2021
この日は自由惑星同盟市民が初めて迎えた、あまりにも大きな苦悩と試練の長い一日であった。#自由惑星同盟のいちばん長い日 pic.twitter.com/KSZ40f5J4f
宇宙暦799年5月5日23時 両軍の間で停戦が発効し、足かけ12日間にわたったバーミリオン星域会戦が終結した。#神々の黄昏戦役 #バーミリオン星域会戦 #本伝5巻
— 今日は何の日@銀英伝bot (@logh_today) May 5, 2021