@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

tengu_p

blog.magnolia.tech

実際、便利です。 自動テストの実行中にデバッグプリントすると、出力結果を探すのが大変です。 制御文字を使わなくても赤色で表示されるので、出力結果が簡単に見つかって便利です。

でも、毎回次のように書くのは面倒です。 特にIMEを有効にしないと👺を入力できないのが面倒です。

p '👺', 'abc'

というわけで、tengu_pメソッドを実装しました。

def tengu_p(*args)
  p *args.map.with_index(1) { |msg, i| '👺' * i + msg.to_s }
end

実行すると次の感じです。

tengu_pの出力例

勇者に敗北した魔王様は返り咲くために魔物ギルドを作ることにしました。 5

好きすぎる。お話も好きだけど、作画すごすぎです。 作者さんがツイッターで公開している、4Kカラー画像・・・これ漫画の場面なんですよ? 188ページの一冊の単行本に全部入っています*1。 かといって、大ゴマばかりで話の展開が遅いということもないです。 しかも、半年に一冊でてくるの・・・どうなってるんですか?

*1:本編内では白黒です。

呪剣の姫のオーバーキル 2

次の設定が新鮮に感じました。

  • 人間が魔物と戦うには、魔力を付与した剣が必要
  • 付与した魔力には使用回数制限がある
  • 補給のために魔力を付与できる鍛冶職人が戦場に同行する

表紙はかわいい感じの絵で、本編はハード気味な絵です。

LeetCodeをやってみた

解いてみた問題は次の2つです。

速く動くプログラムを書くために、データ構造とかアルゴリズムを考える力を求められる感じです。 今の時点の僕は「これを求めてなかった」と、わかりました。

どうやら、僕がほしい教材は「問題があって、解くプログラムを書きなさい」だけのようです。 LeetCodeだと時間制約が余計です。 ゴリ押しのブルートフォース攻撃で解くプログラムを、早く書く方法を練習したいです。

速度が必要な時って、パレートの法則的に言えば2:8の2しかありません。 僕がやりたいのは次です。

  1. 10をゴリ押しで早く解く
  2. ボトルネックの2をあぶり出す
  3. 2を解決するために時間を使う

10を全部速く書きたいんじゃないんです。 ボトルネックを探すための、ゴリ押しパワーが欲しいです*1

参考

*1:2を探せるようになったら、2をゴリ押しで解決できるアルゴリズムパワーが欲しくなると思います。でも、それは今ではないです。

RubyMineでMarkdownに埋め込まれたPlantUMLをプレビューする

[memo] IntelliJでMarkdown内のplantumlをPreviewで表示できるようにする - Qiita

⌘, -> Languages & Frameworks -> Markdown を選んでから、PlantUML framework isn't installed と書いてあったら、それをクリックして以下のようになればオッケー。

いまは設定項目名が多少変わっています。

RubyMineのMarkdownの設定画面

最初はチェックボックスが無効です。 図の黄色のInstallをクリックして、何かをインストールすると、チェックボックスが有効になります。 チェックボックスにチェックをいれると、Markdownのプレビュー画面でPlantUMLで書いたUML図が表示されます。

PlantUMLにチェックをいれたところ

この設定を知らなかった時は、 PlantUML Integration - IntelliJ IDEs Plugin | Marketplace をいれ、拡張子がpumlなファイルをつくって、そこにPlantUML部分をコピペしてプレビューしました。

組織パターン

Grady Booch*1イーロン・マスクに「組織パターンを読め」って言ってました。 そういえば読んだことなかったので、読んでみます。

その名の通り、チームのパターンとかチームメンバーのロールのパターンとか書いてある本でした。

最初、読み方がよくわかりませんでした。 適当に気に入った名前のパターンを読んで、その中で参照されているパターンをたどるのがよさそうです。 電子書籍は、パターンの森を散歩するように読めるのがよいです。

*1:UMLとかBooch法で有名なおじいさん 。グラディ・ブーチ - Wikipedia

おやす

「勃起」という言葉はいつから、普通の意味で使われなくなったか?~ゴールデンカムイ雑談 - INVISIBLE D. ーQUIET & COLORFUL PLACE-

へー。じゃあ勃起を乗っ取る前は何て表現してたんだろうか

2022/05/04 11:59
b.hatena.ne.jp

そういえば、なんて呼んでいたのかしらないなーと思って謎の検索力を発揮しました。

永井義男「江戸の性語辞典」 | とのとののブログ という記事を見つけました。 次の本が紹介されていました。

ちゃんと書いてありました。

「生やす(おやす)」とか「生える(おえる)」とか言っていたそうです。

生とは - コトバンク

お・える おへる【生】 〘自ハ下一〙 ① 陰茎が勃起する。おやける。 ※史記抄(1477)五「男根のをへるを陸梁すると云ほどにぞ」

遅くとも、室町時代から使われていたようです。

ちまき とは?

なぜか5月5日に ちまき を食べますね

端午の節句(こどもの日)に菖蒲湯に入り、柏餅・ちまきを食べる由来

ちまきを食べる風習も、中国の古い歴史に由来します。 古代中国に、屈原という忠誠心の高い高名な詩人がいました。政治にも携わっていた彼は、多くの人民から支持されていましたが、それを好ましく思わない者の陰謀によって国を追われ、川へ身投げしたという言い伝えがあります。嘆き悲しんだ多くの民は、屈原が魚に食べられないよう川へちまきを投げ入れました。 この言い伝えから、中国では、ちまきは「忠誠心が高い象徴」として考えられています。そのため、忠義のある子に育つことを願い、こどもにちまきを食べさせました。屈原が入水した日が5月5日であったことから、端午の節句ちまきを食べる風習が生まれ、日本に伝わっています。

屈原と粽 | 菓子資料室 虎屋文庫 | 株式会社 虎屋

「淵には蛟龍(こうりゅう=龍の一種)が住んでおり、投げ込んだ供物を食べてしまう。厄除けに楝樹(せんだん)の葉で包み、五色の糸で巻けば蛟龍は食べないであろう。」 それから里人は教え通りに供物を作るようになったといいます。 これが粽の始まりだといわれます。

ちまきの由来? | 食育大事典

竜が嫌う葉で米を包み、五色の糸で縛ったものを流すようになりました。これがちまきの始まりなのだとか。

ういろうちまきと中華ちまき全然違うものなのになぜ同じ名前なの?

端午の節句の「ちまき」 包まれた中身が東西で違う! - ウェザーニュース

これが、奈良時代端午の節句の風習の1つとして日本に伝来。当時、都のあった近畿地方を中心に、(白く甘い団子を笹の葉で包んだ)ちまきが広まったようです。 一説によると、その後も伝統を重んじる近畿地方では、ちまきを食べる習わしが引き継がれているようです。

一方、端午の節句ちまきを食す風習があまり定着しなかった東日本や北日本では、のちに端午の節句に柏餅を食べるのが主流となったようです。

ちまき - Wikipedia

承平年間(931年 - 938年)に編纂された『倭名類聚鈔』には「和名知萬木」という名で項目があり、もち米を植物の葉で包み、これを灰汁で煮込むという製法が記載されている[16]。元々は灰汁の持つ殺菌力や防腐性を用いた保存食であった。その後、各地で改良や簡略化が行われ、京では餅の中に餡を包み込んだり、餅を葛餅に替えるなど独自の物も出来て来た。

もしかして、「灰汁巻き」という奴でしょうか? すると、中国から端午の節句にまつわる、「ちまき伝承」が伝わり、形はすでにあった「灰汁巻き」と合体し、京都で改良されたものが「ういろうちまき」のようです。 その後、関東で謎の変異を遂げたものが「柏餅」なのでしょうか?

ちまきの名前の意味

粽(チマキ)とは何? Weblio辞書

古くはチガヤの葉で巻いたところから

「茅巻き」のようです。 茅萱(ちがや)と茅(かや)は同じものなのでしょうか? いわゆる、かやぶき屋根に使う「かや」と同じ系統の植物でしょうか?

笹じゃないし、中国の「ちまき伝承」では楝樹(せんだん)だったし、もう葉っぱならなんでも良い感じですね。 柏餅も葉っぱだけは残った感じがします。 葉っぱはローカライズするときに現地で入手しやすい植物に置き換わるのかもしれません。

カオトムマット

ということは、東南アジアのバナナの葉っぱで餅米蒸してたべる料理も「ちまき」に入るんでしょうか?

タイのお菓子:カオトムマット(ข้าวต้มมัด) | タイNavi

カオトムマットはタイ全土で食べられる伝統的なお菓子です。バナナや小豆、タロイモなどをココナッツミルクなどで甘く味付けしたもち米に包み、バナナの葉で包んだ料理で、タイではデザートとして食されることが多いカオトムマットですが、お供え物として供えたりもする料理です。

もう「ちまき」ですね。 タイで「カオトムマット」と呼ぶ食べ物を(中華系の人が多い)シンガポールでは何と呼ぶのでしょう? 興味が尽きません。

20220504追記

そういえば笹の葉、朴葉、柿の葉なんかの葉っぱでご飯を包んで保存するのってメジャーですね。 なるほど「竜が嫌う葉」って、おばあちゃんの知恵袋的な豆知識から来てそうです。

Ubuntuをアップグレードしようとして22.04を見つけられなかった話

WSLで使っているUbuntuを軽い気持ちでアップグレードしようと思いました。

Releases - Ubuntu Wiki

Ubuntu 22.04 LTS

がリリースされています。今使っているのは20.04です。

ledsun@MSI:~/textae►lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal

アップグレードしようとしても22.04が見つかりません。

ledsun@MSI:~/textae►sudo do-release-upgrade
Checking for a new Ubuntu release
There is no development version of an LTS available.
To upgrade to the latest non-LTS development release
set Prompt=normal in /etc/update-manager/release-upgrades.

Ubuntu18.04 LTSから20.04 LTSにdo-release-upgradeした時の問題について - Qiita

Ubuntu 20.04.1がリリースされていますが、参考資料のドキュメントにあるように最初の".1"リリースがでるまでの間は古いバージョンからのアップグレードは推奨されていません。

また現状では、まだ、'-d'オプションを要求されます。

なるほどー。 -dオプションをLTSでないバージョンを入れるためのオプションだと勘違いしていました。

参考

あるリファクタリング

次のような関数がありました。 どうしたもんかなあ?と悩みました。

import validateAnnotation from './validateAnnotation'
import convertBeginAndEndToInteger from './convertBeginAndEndToInteger'

export default function (
  spanContainer,
  entityContainer,
  attributeContainer,
  relationContainer,
  text,
  spans,
  rowData,
  trackNumber = ''
) {
  const { accept, reject } = validateAnnotation(text, spans, rowData)

  const { typeSetting } = accept
  const typesettings = typeSetting.map((src) => ({
    ...src,
    span: convertBeginAndEndToInteger(src.span)
  }))
  spanContainer.addSource(typesettings, 'typesetting')

  const { denotation } = accept
  const denotations = denotation.map((src) => ({
    ...src,
    id: src.id ? trackNumber + src.id : null,
    span: convertBeginAndEndToInteger(src.span)
  }))
  spanContainer.addSource(denotations, 'denotation')
  entityContainer.addSource(denotations, 'denotation')

  const { block } = accept
  const blocks = block.map((src) => ({
    ...src,
    id: src.id ? trackNumber + src.id : null,
    span: convertBeginAndEndToInteger(src.span)
  }))
  spanContainer.addSource(blocks, 'block')
  entityContainer.addSource(blocks, 'block')

  const { relation } = accept
  const relations = relation.map((src) => ({
    ...src,
    id: src.id ? trackNumber + src.id : null,
    subj: trackNumber + src.subj,
    obj: trackNumber + src.obj
  }))
  relationContainer.addSource(relations)

  const { attribute } = accept
  const attributes = attribute.map((src) => ({
    ...src,
    id: src.id ? trackNumber + src.id : null,
    subj: trackNumber + src.subj,
    obj: src.obj
  }))
  attributeContainer.addSource(attributes)

  return reject
}

2時間くらいいじくり回して、こうなったっす。

import IDConflictResolver from './IDConflictResolver'
import convertBeginAndEndOfSpanToInteger from './convertBeginAndEndOfSpanToInteger'

export default function (
  spanContainer,
  entityContainer,
  attributeContainer,
  relationContainer,
  accept,
  trackNumber = ''
) {
  const [typeSettings, denotation, block] = convertBeginAndEndOfSpanToInteger(
    accept.typeSetting,
    accept.denotation,
    accept.block
  )
  const { relation, attribute } = accept
  const { denotations, blocks, relations, attributes } = new IDConflictResolver(
    trackNumber
  ).addTrackNumberAsIDPrefix(denotation, block, relation, attribute)

  spanContainer.addSource(typeSettings, 'typesetting')
  spanContainer.addSource(denotations, 'denotation')
  spanContainer.addSource(blocks, 'block')
  entityContainer.addSource(denotations, 'denotation')
  entityContainer.addSource(blocks, 'block')
  relationContainer.addSource(relations)
  attributeContainer.addSource(attributes)
}

当初「データ取り込みの前処理部分なので、綺麗に書きようがないのかなあ?」と思いましたが、やればそれなりに読める形になりました。 やはり、単に脳みそがサボりたくて、賢そうなことを言っていただけのようです。

あとから見るとリファクタリングのコンセプトは、データ種別単位で

  1. 前処理1
  2. 前処理2
  3. 取り込み

とやっていたのを、処理単位にまとめ直したのでした。 それで処理に意図がわかる名前 IDConflictResolver がつけられるようになったのが良かったです。

convertBeginAndEndOfSpanToInteger も、もっとHowでなくWhatを表す名前にしても良いかもしれません。

底辺領主の勘違い英雄譚 5

魔力がやたらすぐれた主人公領主が話の流れでなぜか国王と戦い始めました。

登場人物が全員阿呆です。 阿呆というかデウス・エクス・マキナです。 ギャグ漫画って大抵、ほとんどのキャラが狂っているけど、一人はツッコミ役というか狂言回しというか、読者側に立つ常識人が配置されてるじゃないですか。 そういうキャラクターも居ません。 登場したては常識人に見えるのですが、レギュラーになった頃には狂人になっています。

登場人物が全員、物語を進めるための舞台装置で、作者からキャラクターへの自己投影みたいなものがないっぽいんですよね。 主人公もふくめて、特定キャラクターへのえこひいきがありません。 そのせいもあってかどのキャラクターにも感情移入できません。 なんとなく一歩引いた感じでみています。 やってることはめちゃくちゃなのにウェットさがなくて陰惨に感じません。 ギャグとして消化できちゃうんですよね、不思議です。

キャラクターへの感情移入がなくても、物語として成り立って5巻も続いているの、なかなか不思議です。

望まぬ不死の冒険者 1

9巻が出てたので、1巻から読み直しました。 この漫画の第一話、最高にいいんですよ。 「難題に直面した平凡な奴」の導入として、舞台説明と目的設定が完璧。 まったくわけわからないけどそれらしい説明がば~っとされて主人公がなんか納得してやる気出すところまで、いい感じで描かれています*1

*1:なんだこの説明・・・

質問・雑談会(仮)

会社の人とslackのハドルで30分の技術にまつわる雑談をしました。 ハドルなので顔出しなし、時々画面共有あり、slackでURL送ったりくらいのコミュニケーションでした。

予想していたより、だいぶ体験が良いです。社外の勉強会で久しぶりに会った人と「最近なにやっているんですか?」と話すのと似た体験に感じました。新型コロナウイルスで失われたふわっとしたコミュニケーションです。あれ?こんな方法で代替えできたのでしょうか?

社内限定なので、ネタは流行の奴じゃなくて業務でやっていることでした。発表用の整形したソースコードでなくて、仕事用の生きているソースコードを見せ合えるのも、綺麗なやつばかりでなく「ぎえー、読みたくねえ」ってなる奴*1もあって、おもしろいです。

*1:ソースコードが汚いという意味でなくて、そもそもの業務ロジックが複雑なのを、苦労してなるべく読めるコードに実装した奴です。

テメレア戦記 1 下

「あとがき」によるとヴィレッジブックス版は翻訳が途中で途切れていたそうです。そういえば後半になるほど、日本語訳が出るのが遅くなって読むのをやめたのでした。今度は年内に完結までどどっと出るそうです。楽しみです。

テメレア戦記

海軍の軍人だった主人公が、たまたま竜に選ばれて空軍にという導入です。 人間と動物(今回は竜)のバディものです。 バディがいちゃいちゃするのを楽しむ奴です。

竜が初飛行する場面で、主人公が風上に向かって飛ぶ方法としてタッキング(上手回し)を教える場面があります。 タッキングを応用して左右にジグザグ飛べば風上に飛べるぞというアイデアです。

そういえばヨット(帆船)はジグザグに進むと、風上に進めると聞いたことがあります。 本当でしょうか?

ヨットの原理と海

風上に進む場合は、右図に示すようにセールを飛行機の翼のような形となるようにします。 翼上部の膨らんだ部分を通る風と下部の膨らんでいない部分を通る風の速さの違い=気圧差で翼の膨らんだ部分 に揚力が生じます。

え?揚力なんすか?

揚力をベクトルにすると船を横に流す力と前進させる推力とに分けられます。横に流す力は船の下部に付いた キールにより止められ抗力となります。よって、推力で風上にも進みます。

なるほど、船体の向きと帆の角度を工夫すれば、船からみて右前に引っ張る力を発生させられそうです。 それからヨットには左右に進むのを止めるキールというパーツがあるので、横には進まず前にだけ進むようです。

左右に進まないのは、船体の形状でだと思ってましたが、キールという専用パーツがあるんですね。

竜骨 (船) - Wikipedia

汽船では帆船にみられるこのような突起部は無用な抵抗を生じる。一方で鋼船構造の船舶が現れ船底外板がすべて平板になってもキールと呼ばれており、本来のキールの意味からは外れるが平板竜骨(Flat keel)と呼ばれることがある。

現代の一般的な船の船底に突起はないらしいです。 僕が、なんとなく船の底が平らなイメージを持っているのは、現代の船に対するイメージのようです。

とうわけで、帆船がタッキングできるのは水の抵抗があるからです。 空を飛ぶドラゴンはタッキングできないんです。 鳥が風上に飛べないかというとそんなことはないです。 帆船と同じで、風上に翼を向けると揚力が得られるので、上昇できます。 あとは下降すれば重力を使って速度が得られます。 上昇下降を繰り返せば風上に進めます。

というかおそらく逆で、鳥が風上に進む動きを帆船の帆を翼にみたてて真似たのがタッキングなのだろうと思います。 まあ、つまり、帆船乗りがドラゴンにタッキングを教えるのは、釈迦に説法な訳です。 と、細かいところに気がつきました。

2010年に読んだときは気がつかなかったなあ。 同じ本を読んでも、読むときの自分によって得られる情報は変わるようです。