blog.heartyfluid

勉強したることども

先週買った本8冊、買いたかった本6冊 2022-12-19 ~ 2022-12-25

今週はちょっと多めになってしまった。休みに入るからといって調子に乗っているんじゃないだろうか。

先週買った本

先週買いたかった本

猫のひたいほどワイド 2022年度第29週 自分用アーカイブ

月曜日 2022-11-28

  • MC 細貝圭
  • 猫の手も借り隊
    • ブルー 朝田淳弥 6
    • グリーン 岡田翔大郎 6→7
  • アシスタント 岡村帆奈美

公式アーカイブ 月22/11/28放送|猫ひたアーカイブ |猫のひたいほどワイド|tvk デジタル3ch テレビ神奈川

潜入リポート1 岡田翔大郎「今年も猫ひ田!集大成!!新米ネコヒカリを試食!!!」大磯町

今シーズンの「猫ひ田」シリーズ完結回。


www.youtube.com

新米ネコヒカリ大試食会

コーナー MC はグリーン岡田くん。白ご飯と塩むすびを試食。

お米マイスターの評:

匂いはややツンとしてかぐわしい。見た目は粒が大きく膨らみがいい。口に含むと全体的にもっちりしていて嚙み心地がいい。

潜入リポート2 朝田淳弥「バスケがしたいです!本格コートがグランドオープン」川崎市川崎区

イエロー早瀬くん、グリーン岡田くんとのトリオロケ。


www.youtube.com

猫ひたスタジオでやってみよう「決めろ!ヘディングハットトリック

カゴを目掛けてヘディングでシュートを決める。1人2球、全部で6球のうち3点以上入れば猫ひたポイント

視聴者:誰がシュートを決められるかを予想。予想が当たればサポーターバッジ

  • 岡田くん:0
  • 朝田くん:0 視聴者予想×
  • 細貝さん:0

猫ひたニュース

www.kanaloco.jp

K's English lesson #10 "TOUCH"

Tatsuya: Tatsuya Uesugi, loves Minami Asakura more than anyone else in the world.

Minami : What do you mean?

ここでは達也が南に電話で告白したアニメ版のシーンを採用。原作コミックでは河原で告白している。

発音面では "world" の舌の動きがポイント。Minami の "What do you mean?" に続いて、各自これまで学んだことを生かしてアドリブで返す新趣向。

猫ひたインフォ

プレゼントコーナー

今週のおやつは JA 島原雲仙のブロッコリー

今週のプレゼントはパックスナチュロン ハンドクリーム、またはパックスオリー ボディーソープパックスオリー ボディーコンディショナーのセット。

電話つながった。

火曜日 2022-11-29

  • MC 鎌苅健太
  • 猫の手も借り隊
    • レッド 大矢剛康 6→7
    • ブルー 植村颯太 5
  • アシスタント 岡村帆奈美

公式アーカイブ 火22/11/29放送|猫ひたアーカイブ |猫のひたいほどワイド|tvk デジタル3ch テレビ神奈川

去る26日に20歳を迎えたブルー植村くんが記念にオープニングトーク。30歳のレッド大矢くんをいじったうえで、俳優として売れることを誓う。

潜入リポート1 植村颯太「触れて学べて楽しめる!大人気の科学館!」相模原市中央区

植村くんの水族館レポート、シリーズ化?


www.youtube.com

鎌苅健太の奥深き TKG 「オムライス風 TKG」

卵好きの鎌苅が卵かけご飯 = TKG の新たな可能性を探るコーナー

新企画。いわく、年頭の目標に「卵」を掲げていたことに絡めているとのこと。試食後、鎌苅さんが「うまかり」もしくは「まずかり」の裁定を下し、「うまかり」の場合はレシピが公式アーカイブに掲載される。

ネコヒカリを使った「オムライス風 TKG」をスタジオ調理・試食。黒こしょうをたっぷりかけて、よく混ぜるのがおすすめらしい。

素直に「おいしい」と言えずに戸惑う出演者。岡村アナいわく「初めて食べる感じだから脳が一瞬追いつかない」「半熟すぎるオムライス」、植村くんいわく「この上に焼いた卵をのせたらおいしい」、率直にまずそうな表情を見せる大矢くん。「好きな人は好き」という鎌苅さんの裁定は「うまかり」。レシピは公式アーカイブに掲載。

潜入リポート2 大矢剛康「大集合!辻堂で出会える最新技術」藤沢市

公益財団法人湘南産業振興財団の「ロボテラス」を訪問、数々のロボット製品を紹介

猫ひたスタジオでやってみよう「決めろ!ヘディングハットトリック

  • 植村くん:0
  • 大矢くん:0 視聴者予想×
  • 鎌苅さん:0

猫ひたニュース

www.kanaloco.jp

佐々木依里が行く やさしさヨコハマ発 PAX NATURON

WE リーグ 2年目の挑戦!ノジマステラ神奈川相模原

ノジマステラ神奈川相模原から共同キャプテンの杉田亜未松原有沙両選手がゲスト出演。

プレゼントコーナー

電話つながった。

水曜日 2022-11-30

  • MC 三上真史
  • 猫の手も借り隊
    • レッド 奥谷知弘 6
    • グリーン 拓郎 8→9
  • アシスタント 岡村帆奈美

公式アーカイブ 水22/11/30放送|猫ひたアーカイブ |猫のひたいほどワイド|tvk デジタル3ch テレビ神奈川

潜入リポート1 奥谷知弘「歓迎!猫ひた登山部・新入部員編!!」山北町

猫ひた登山部、四年越しに新入部員を迎える。グリーン拓郎くんとのコンビロケ。


www.youtube.com

放映当日、テレビ富士山はやっぱり悪天候で真っ白。

猫ひたガーデニング部「コキアでホウキを作ろう」

森一世ディレクターが育ててくれたコキアをほうきに仕立てる。

  • 用意するもの:麻紐、くし、はさみ
  • 手順
    1. 鉢からコキアを引き抜く
    2. コキアをくしで梳かしてごみを落とす
    3. ガーデンジャー「ガーデニングはさみ」で枝を切り分ける
    4. 枝元を麻紐で縛って柄にする。お好みで布などを巻きつけてもよい
    5. 必要に応じて穂先を切りそろえる

潜入リポート2 拓郎「おいしい!楽しい!ふるさとまつり大満喫!」座間市


www.youtube.com

猫ひたスタジオでやってみよう「決めろ!ヘディングハットトリック

視聴者は「誰も入れられない」という選択もできるようルール調整。

  • 拓郎くん:1
  • 奥谷くん:0 視聴者予想×
  • 三上さん:1

翌週のスペシャルウィークに向けて、「わたしの大切なひと鉢 スペシャル企画」。12月7日(水)の放送で写真を紹介した視聴者にガーデニング部バッジ+スペシャルプレゼント進呈。テーマは「秋冬の花」。

猫ひたニュース

www.kanaloco.jp

アゾンインターナショナルはかつて現火曜レッド大矢くんが取材している。


www.youtube.com

ニュースのあとは「新米ネコヒカリ大試食会」。コーナー MC はグリーン拓郎くん。

かながわ MIRAI 「靴下で雪だるまを作っちゃおう!」

まんまるマルタくん登場。雪だるまの作り方:

  1. 靴下の3分の1くらいまで綿・ティッシュなどを詰めて輪ゴムでとめる
  2. 靴下の3分の2くらいまで綿・ティッシュなどを詰めて輪ゴムでとめる
  3. 余った部分を外側に折り返してニット帽をつくる
  4. 紙や布で顔・マフラーなどをつけたらできあがり

雪だるまの起源は定かでない。ただ江戸時代の浮世絵にはすでに雪だるまの描写がある。

ゲスト:Olu.

Olu. (オルドット)よりはるちゃん・いもちゃんをゲストに迎える。

猫ひたインフォ

プレゼントコーナー

電話つながらず。

木曜日 2022-12-01

  • MC 井上正大
  • 猫の手も借り隊
    • ブルー 白又敦 7
    • イエロー 木村魁希 9→10
  • アシスタント 岡村帆奈美

公式アーカイブ 木22/12/1 放送|猫ひたアーカイブ |猫のひたいほどワイド|tvk デジタル3ch テレビ神奈川

照井アナの代打として岡村アナが登板。

潜入リポート1 白又敦「最強のご飯のお供!? 自慢の調味料を調査 !」相模原市緑区


www.youtube.com

スタジオでは「ネコヒカリ」に「胡麻之極味」をあわせて試食。

井上正大のお茶の時間「猫ひた版お茶カレー Vol.2 魅惑のアレンジ」

レシピは公式アーカイブに掲載。

潜入リポート2 木村魁希「舞台芸術をプロデュース!」川崎市麻生区


www.youtube.com


www.youtube.com

猫ひたスタジオでやってみよう「決めろ!ヘディングハットトリック

  • 木村くん:0 視聴者予想×
  • 白又くん:1
  • 井上さん:0

井上さん、かごから球がバウンドして失敗。今週も引き続き全曜日0ポイントのまま。

猫ひたニュース

www.kanaloco.jp

猫ネットしらまた

「お茶の時間」の久保田美祈さんをゲストに迎える。猫ひた以外のお仕事の紹介、過去の緑の衣装のダイジェストなど。

猫ひたインフォ

プレゼントコーナー

電話つながった。

[映画]『ペルシャン・レッスン 戦場の教室』で語学への気合を入れなおす

movie.kinocinema.jp

映画『ペルシャン・レッスン 戦場の教室』を鑑賞しました。一度みてあまりに心打たれたので、日を置いてもう一度みてきました。

全体として、ドイツ語学習者としての自分の姿勢を強くただされた感があり、語学をやる人みんなにみてほしい映画だと思いました。

概要(ないしゲームのルール)

公式サイトから引用:

ナチス親衛隊に捕まったユダヤ人青年のジルは、処刑される寸前に、自分はペルシャ人だと嘘をついたことで一命を取り留める。彼は、終戦後にテヘランで料理店を開く夢をもつ収容所のコッホ大尉からペルシャ語を教えるよう命じられ、咄嗟に自ら創造したデタラメの単語を披露して信用を取りつける。こうして偽の<ペルシャ語レッスン>が始まるのだが、ジルは自身がユダヤ人であることを隠し通し、何とか生き延びることはできるのだろうか──。

主人公ジルに課されたミッションはおおむね次のとおり。

  • 自分のまったく知らないペルシャ語をコッホ大尉に教えなければならない
    • 実はペルシャ語を知らないとばれたら即射殺
    • ただし、コッホ大尉もペルシャ語をほとんど知らないので、適当な嘘をついてごまかすのがジルの基本戦術となる
  • コッホ大尉に教える嘘ペルシャ語の単語を自分ででっち上げなければならない
    • 自分のでっち上げた嘘言語を間違えたら、嘘がばれて即射殺
    • すなわち、自作の嘘言語をジル自身も間違いなく習得しなければならない
      • かつ、ジルは強制収容所の被収容者なので、筆記用具も自由に使えない。よって暗記の手段が限られる
    • 同音異義語をでっち上げれば暗記量は少なくなりそうだが、コッホ大尉に怪しまれかねない
  • たとえ嘘ペルシャ語教師のミッションを抜かりなくこなしても、強制収容所ではいつ理不尽に殺されるかわからない

簡単にまとめれば、「暗記できなかったら即殺されるし、暗記できても偶発的に殺されるかもしれない」ということです。

ジルに見習うべき点

1. 学んだ(というかでっち上げた)言語をとにかく堂々と運用する

ほかのユダヤ人といっしょに銃殺されそうになったところを「自分はペルシャ人だ」と言い張って切り抜ける冒頭から始まって、ジルは事あるごとにユダヤ人ではないかと疑われ殴る蹴るの暴行を受けたり銃口を突きつけられたりするわけですが、そのたび堂々と嘘をつき通します。あるときは相手の目を見て今思いついた嘘を言い、あるときは粛々と無視してみせる。

語学の上達には「失敗を恐れず堂々と運用してみる」のが大事です。もちろん失敗するというのは恥ずかしいものですが、失敗すれば即死のジルに比べればまったく取るに足りないことです。自分も学んだ言語をジルのように堂々と運用して、場数を増やしていきたいと思いました。

2. 勉強の質・量ともに貪欲

質についていえば、ペルシャ語の教材はもちろん筆記用具すら随意に使えない中、ジルは目に入ったものに片っ端から嘘ペルシャ語の名前をつけたり、被収容者名簿の氏名をもじって嘘単語をでっち上げることで記憶を強化したりと、勉強の手段を次々発明します。

ドイツ語を学んでいるとつい「英語は教材が豊富でいいな」「ロゴフィリアみたいな本がドイツ語にもあればな」などと甘えたことを考えがちですが、ジルのおかれた境遇に比べれば明らかに恵まれているわけで、もっとハングリーにならなければ語学の上達はおぼつかないと思い知らされます。

また量に関しては、コッホ大尉いわく半年で570語、その後期間は不明なものの終幕時点では3,000語弱を習得したようです。コッホ大尉はともかく、筆記用具も満足に使えないジルにとっては大変な量といってよいでしょう。

序盤にコッホ大尉は1日4語、2年で2,000語という学習目標を立てます。ここで思い出したのが千野栄一『外国語上達法』でした。

ある外国語を習得したいという欲望が生まれてきたとき、まずその欲望がどうしてもそうしたいという衝動に変わるまで待つのが第一の作戦である。そして、その衝動により、まず何はともあれ、やみくもに千の単語を覚えることが必要である。

[...] そのエネルギーとしては、どうしてもその言語をモノにしたいという衝動力を使い、そのエネルギーの燃え尽きる前に千語を突破することである。従って、この千語習得の時間は短くなければならず、そこで十分に時間のとれるときに新しい言語を学び始めるよう計画をセットする必要がある。

「千語習得の時間」として千野がどの程度の長さを想定していたのか明示されてはいないものの、明らかにコッホ大尉の学習姿勢はヌルいな、と感じたのでした。そのあとすぐ「やっぱり40語教えろ」となって、これは案外ばかにできないかもしれん、と思い直すのですが。

条件の整ったコッホ大尉がそれなりの情熱で学習するということは、ジルもまた少ない道具立てでそれに応える必要があるわけです。おおよそ一日中単語の暗記に精力を注いでいたジルの嘘ペルシャ語学習は、質だけでなく量も圧倒的だったというべきでしょう。特に熱いのは、暴行を受けて半死半生の中無意識に嘘ペルシャ語単語を暗唱するシーン。日ごろどれだけ暗唱を繰り返していたかがしのばれます。

そういえば、単語を覚えるシーンが劇中たくさんあるのに対して、文法の話題はまったくと言っていいほど出てこないんですよね。むしろ、文法はまだ学んでいないとためらうコッホ大尉に、いいから噓ペルシャ語で話してみろとジルがけしかけるシーンすらあります。語学力を決定づけるのは結局語彙の量であり、語彙を増やすことこそが正義だというメッセージなのかもしれない…?

総じて、勉強の質にせよ量にせよ、自分にそれらが足りていないのは結局「ドイツ語ができるようにならないと死ぬ」とか思っていないからなんだろうな、と反省しました。まさに必死さが足りない。

3. 努力が報われない理不尽にもくじけない

「ドイツ語ができるようにならないと死ぬ」とか思っていない、と前項で書きましたが、これは裏を返せば「ドイツ語ができるようになったところで特に何もない」ということでもあります。簡単なところでいえば、たとえばドイツ語ができるようになったところで仕事には役立ちそうにない、とかそういうことです。興が乗っている間は知的好奇心だけでも勉強ははかどるのですが、残業したとか眠たいとか勉強の妨げになるものが現れると、とたんに「なんでこんなこと頑張ってるんだっけ」と気の迷いが生じます。

その点、ジルが嘘ペルシャ語に注ぐ情熱も、正当化するのがなかなか難しいものです。まずどこへ行っても通じない嘘ペルシャ語を身につけないといけないという状況自体、そもそも不条理です。また、それによってコッホ大尉には守ってもらえても、強制収容所では学習の努力とは無関係に理由なく殺されてしまうかもしれない。実際ジルにも、それまでの努力を投げ出して死に向かおうとする場面が何度かありました。情熱を持ち続けられないのも無理からぬことです。

ジルが長期にわたって心折れずに語学を続けられた理由は何だったのか。劇中では偶然の出会いで命拾いするわけですが、はたして単発かつ偶発的なイベントだけで継続できるものなのか。あるいは結局のところ運でしかないのか。この映画に描かれていることだけから答えを導き出すのは難しいことですが、今後考えたいところです。

ジルとコッホ大尉にみる語学の価値

劇中ジルとコッホ大尉の嘘ペルシャ語語彙が増えていくうち、二人はしだいに嘘ペルシャ語で会話ができるようになります。事実上、二人にしかわからない暗号です。嘘ペルシャ語でコッホ大尉は詩を編み、そして余人には話さないつらい過去をジルに打ち明けます。その後ドイツ語での会話では、ジルがコッホ大尉を親称 du で呼ぶようになります。

ジルはドイツ語も流暢なものの母語はフランス語、そしてコッホ大尉の母語はドイツ語です。二人がドイツ語で会話するのは、コッホ大尉はじめナチスにジルが隷従を強いられているためです。一方嘘ペルシャ語は、ジルにとっては自称母語であり、コッホ大尉にとっては母語話者レザ・ジューン(ジルがペルシャ人を装うために名乗った偽名)から学ぶ外国語です。つまりドイツ語の場合とは正反対に、コッホ大尉がレザ・ジューンの生活様式に合わせる形になるわけです。それも強制でなく自発的に。その結果ジルがコッホ大尉を du で呼ぶようになったのは、ジルがコッホ大尉に心を開いたととらえることもできそうです(結局最大の嘘は残しているというのが難しいところなんですが)。

「自分の母語で相手に話させる」ということは「自分の世界に相手を取り込む」ということであり、逆に「相手の母語で話す」ということは「相手の世界を尊重しその世界に入っていく」ことなんだろうな、と思いました。そして心を開いて「相手の母語で話す」ことには、相手の心をも開かせる効果があるのかもしれません。もしそうなら、語学って希望があるなと思います。そういえば先日、「ウクライナの避難民から日本語であいさつを受けてすごく親近感がわいた。自分もウクライナ語であいさつしてあげようと思った」というような話を聞きました。ちょっと似ていますね。

ただまあ、コッホ大尉もジルと嘘ペルシャ語を話している間は何かしら幸福そうでしたが、最終的にはコッホ大尉の努力は報われなかったんですよね…。やはり「努力が報われない」結末も、覚悟しておかないといけないのかもしれない。

追伸

  • 原作は Wolfgang Kohlhaase "Erfindung einer Sprache" 『ある言語の発明(でっち上げ)』。Kindle ストアにある短編集のサンプルで、全編読めてしまう模様。太っ腹
  • 『バビ・ヤール』はパンフレットを読んで復習します…

www.imageforum.co.jp

php-build で PHP8.1 を WSL2 上の Ubuntu 22.4 LTS にインストールする

ふだん PHP は Docker 経由もしくは Windows + Scoop で利用しています。

bashalog.c-brains.jp

今回、表題のとおり WSL2 上の Ubuntu で PHP8.1 が使いたくなりました。

$ php -v
Command 'php' not found, but can be installed with:
sudo apt install php8.1-cli  # version 8.1.2-1ubuntu2.9, or
sudo apt install php-cli     # version 2:8.1+92ubuntu1

APT のパッケージとしても提供されているようだけれど、どうせなら Windows + Scoop のように任意のバージョンが使えるようにしたいところです。

そこで、 php-build を導入して任意のバージョンの PHP がビルドできるようにしたうえで、 direnv でバージョンが切り替えられるようにすることにしました。

tenkoma.hatenablog.com

php-build のインストール

まずは php-build のコード一式を取得してインストールします。公式ドキュメントいうところの standalone での導入にあたります。

$ git clone https://github.com/php-build/php-build.git
$ cd php-build/
$ PREFIX=$HOME/local ./install.sh
$ php-build/bin/php-build --version
php-build v0.11.0dev

php-buildPHP をビルドする

本校執筆時点での PHP8.1 系最新バージョンのビルドを試みます。

$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
tar (child): bzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
-----------------------------------------
[...]

bzip2 が入っていませんでした。インストールして再試行します。

$ sudo apt install bzip2
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: in `/tmp/php-build/source/8.1.13':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
-----------------------------------------
[...]

C コンパイラが入っていませんでした。インストールして再試行。

$ sudo apt install build-essential
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: The pkg-config script could not be found or is too old.  Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.

Alternatively, you may set the environment variables LIBXML_CFLAGS
and LIBXML_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See `config.log' for more details
-----------------------------------------
[...]

phg-config が古すぎた。

$ sudo apt install pkg-config
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (libxml-2.0 >= 2.9.0) were not met:

No package 'libxml-2.0' found
[...]

libxml2 が足りない。

$ sudo apt install libxml2-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (openssl >= 1.0.2) were not met:

No package 'openssl' found
[...]

openssl が足りない。

$ sudo apt install libssl-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (sqlite3 >= 3.7.7) were not met:

No package 'sqlite3' found
[...]

sqlite3 が足りない。

$ sudo apt install libsqlite3-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (zlib >= 1.2.0.4) were not met:

No package 'zlib' found
[...]

zlib が足りない。

$ sudo apt install zlib1g-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Please reinstall the BZip2 distribution
-----------------------------------------
[...]

BZip2... さっき入れましたが。コマンドでなく development kit のほうが必要になったということかしら。

$ sudo apt install libbz2-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (libcurl >= 7.29.0) were not met:

No package 'libcurl' found
[...]

libcurl が足りない。

$ sudo apt install libcurl4-openssl-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (libpng) were not met:

No package 'libpng' found
[...]

libpng が足りない。

$ sudo apt install libpng-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (libjpeg) were not met:

No package 'libjpeg' found
[...]

libjpeg が足りない。

$ sudo apt install libjpeg-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (oniguruma) were not met:

No package 'oniguruma' found
[...]

oniguruma が足りない。

$ sudo apt install libonig-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Please reinstall readline - I cannot find readline.h
-----------------------------------------
[...]

readline が足りない。

$ sudo apt install libreadline-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Cannot find libtidy
-----------------------------------------
[...]

libtidy が足りない。

$ sudo apt install libtidy-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Package requirements (libxslt >= 1.1.0) were not met:

No package 'libxslt' found
[...]

libxslt が足りない。

$ sudo apt install libxslt1-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
No package 'libzip' found
[...]

libzip が足りない。

$ sudo apt install libzip-dev
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[...]
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
In file included from /tmp/php-build/source/8.1.13/ext/opcache/jit/zend_jit.c:705:
/tmp/php-build/source/8.1.13/ext/opcache/jit/zend_jit.c: In function ‘zend_jit_startup’:
/tmp/php-build/source/8.1.13/ext/opcache/jit/dynasm/dasm_x86.h:127:19: warning: array subscript -10 is outside array bounds of ‘void *[38]’ [-Warray-bounds]
  127 |   D->globals = gl - 10;  /* Negative bias to compensate for locals. */
      |                ~~~^~~~
In file included from /tmp/php-build/source/8.1.13/ext/opcache/jit/zend_jit.c:763:
/tmp/php-build/source/8.1.13/ext/opcache/jit/zend_jit_x86.dasc:143:14: note: while referencing ‘dasm_labels’
  143 | static void* dasm_labels[zend_lb_MAX];
      |              ^~~~~~~~~~~
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
-----------------------------------------
[...]

何か一目ではわからないエラーが出てきました。エラーメッセージの一部でぐぐってみると、先達がいました。あらまほしきことです。

qiita.com

autoconf を入れましょう。

$ sudo apt install autoconf
$ php-build/bin/php-build -i development 8.1.13 ~/php/8/8.1.13
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-development gets used as php.ini
[Info]: Building 8.1.13 into /home/ykagata/php/8/8.1.13
[Skipping]: Already downloaded and extracted https://www.php.net/distributions/php-8.1.13.tar.bz2
[Preparing]: /tmp/php-build/source/8.1.13
[Compiling]: /tmp/php-build/source/8.1.13
[xdebug]: Installing version 3.2.0
[Skipping]: Already downloaded http://xdebug.org/files/xdebug-3.2.0.tgz
[xdebug]: Compiling xdebug in /tmp/php-build/source/xdebug-3.2.0
[xdebug]: Installing xdebug configuration in /home/ykagata/php/8/8.1.13/etc/conf.d/xdebug.ini
[xdebug]: Cleaning up.
Makefile:243: warning: overriding recipe for target 'test'
Makefile:136: warning: ignoring old recipe for target 'test'
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.8.1.13.20221223223630.log or rebuild with '--verbose' option
[Success]: Built 8.1.13 successfully.
$ ~/php/8/8.1.13/bin/php -v
PHP 8.1.13 (cli) (built: Dec 23 2022 22:38:51) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies
    with Xdebug v3.2.0, Copyright (c) 2002-2022, by Derick Rethans

Sehr gut.

記録のため、必要なパッケージをひとつひとつ探索する一部始終を書き起こしました。いったんわかってしまえば次回以降は、ここまででインストールしたパッケージを最初に一括で apt install すれば十分ですね。

direnvPHP にパスを通す

direnv は APT でインストールできます。

$ sudo apt install direnv

当該ディレクトリで必要な環境変数を定義するファイル .envrc を作成します。以下のコマンドでテキストエディタが開きます。

$ direnv edit .

次のとおり追記して保存し、テキストエディタを抜けます。

PATH_add $HOME/php/8/8.1.13/bin

作成した .envrc の適用を許可します。

$ direnv allow

大事なことを忘れていました。 ~/.bash_profile に以下を追記します。

eval "$(direnv hook bash)"

direnvを活用して楽々環境変数管理【Ubuntu】 | Abillyzによれば

~/.bashrcにフックする設定をする。 ※WSLのUbuntuはデフォルトで読まないので~/.bash_profileに設定

とのことで、 WSL 以外では ~/.bashrc に書けばよいもよう。

編集した ~/.bash_profile をリロードすれば、できあがりです。

$ source ~/.bash_profile
direnv: loading ~/.envrc
direnv: export ~PATH
$ php -v
PHP 8.1.13 (cli) (built: Dec 23 2022 22:38:51) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies
    with Xdebug v3.2.0, Copyright (c) 2002-2022, by Derick Rethans

別のバージョンの PHP が使いたくなったら、同様の要領でビルドして、 direnv でパスを通してやれば ok です。

[イベント]第147回 PHP勉強会@東京

phpstudy.doorkeeper.jp

きのう表題のイベントをオンライン視聴した際のメモ。

細かすぎて伝わらないちょうぜつ本見どころ5選

#ちょうぜつ本こと『ちょうぜつソフトウェア設計――PHPで理解するオブジェクト指向の活用 』を先日上梓したばかりの田中ひさてるさんによる著者解題。

  • 伝わりやすい見どころ:Facade パターン
    • Facade パターンにおいて Facade と Features は 1:N
      • 1:1 はよくある誤解。Taylor OtwellGoF がなんといったか忘れたか
        • 用語は原義をふまえて踏襲しよう
  • 伝わらない見どころ
    1. ダーティ vs クリーン
      • クリーンアーキテクチャは層の内容を問わない!安定した中心に不安定な要素が依存していればよい
      • 求めるべき安定度は案件による
    2. 順に読むとネタかと思う流れ
      • DI コンテナ紹介 → シングルトン批判 → SingletonTrait のサンプルコード
        • 意図した流れ
      • シングルトンとは唯一無二。すなわち「概念と存在の区別がつかない」ものに使うのがよい
        • たとえば「神」
          • 時をつかさどる神 Time クラス
          • 数学をつかさどる神 Math クラス
        • PHP では True False Null
          • またユーザー空間では constenum
      • 表向きは「シングルトン使うな」であり、ほんとうの玄人向けには「State パターンで使います」
    3. 抽象クラスとインターフェイスの使い分け
      • 抽象クラス:サブカテゴリ
        • カテゴリは唯一いずれかの配下であるほうがわかりやすい
      • インターフェイス:「~とみなして使える」
        • 用途は多様にできたほうがよい
      • 「テクい」「強い」で武器を決めない。使い分けが大事
        • PofEAA の「クラステーブル継承」は抽象クラスでないと実現できない
    4. SOLID 原則の中で異色の存在 LSP「リスコフの置換原則」
    5. オブジェクト指向は構造化プログラミングではない
      • 構造化:上下の階層構造。上から下へ依存する。下が壊れると全体が壊れる
        • 『ちょうぜつ』の UML クラス図はすべて「依存の向き」を表現している
      • オブジェクト指向:「パッケージ」(もしくは「ユニット」)が「インターフェイス」で「結合」する。パッケージは単体でその品質が保証される
  • One More Thing: ひみつの参考文献

プログラムを実行するとはどういうことか

プログラムを実行するとはどういうことか / What does it mean to execute a program? - Speaker Deck

LT

PHP Open Textbook のお話

mikumoさん。

Laravel コアファイルのコードリーディング Model::all() から new PDO() まで追ってみた

Laravelコアファイルのコードリーディング/Reading the core code of Laravel - Speaker Deck

  • なぜコアファイルを読もうと思ったか
    • 好奇心
    • 仕事ではコアの奥底まで読むことがない
    • コードリーディングの練習
  • Model::all() から new PDO() まで
    • Connector (シングルトン)
    • クエリビルダー
    • Eloquent のビルダー
    • Model の Collection
  • コアファイルを読むメリット

CUPID について5分でわかりやすく解説してみる

Seiichi Akiba さん。

  • CUPID—for joyful coding - Dan North & Associates Ltd
  • CUPID は SOLID 原則に代わる5つの Properties
    • Properties はルールでなく目標
  • Composable 組み立てやすい
    • 最小限の依存関係を保つ。意図がわかりやすい
  • Unix 哲学
    • シンプルで一貫性のあるモデル
  • Predictable 予測可能
    • 期待通りに動作し決定論的、観察可能
  • Idiomatic 自然に感じる
    • 自分にとって読みやすいコードでなく言語のイディオムを尊重する
    • ローカルなイディオムのガイドラインを持つ
  • Domain-based 問題領域をモデル化する

『えこひいき』される関数たち

うさみけんたさん。

Trait

Trait - Google スライド

  • traituse するのは継承とは異なる
    • メソッド名の衝突とその解決
    • メソッドをコピペするようなものと思えばよい
    • 継承クラスの self は不変、トレイトの self は可変
  • トレイトの static な変数やメソッドにはクラス定義なしにアクセスできてしまう
    • PHP8.1 から deprecated

[英語]ボキャブライダー #1159 「お手軽調理」の "easy" "prepackaged" について

Web サイトでの配信期間は2022年12月28日(水)中とのことだけれどいちおうリンクを張っておく。

ボキャブライダー #1159 「お手軽調理」|NHKラジオ らじる★らじる

NHKゴガク アプリなら、今のところ無期限で聴ける。

easy (形容詞)作りやすい、手間のかからない

Max: "Easy recipe" で「手間のかからないレシピ」、 "easy to make" で「作りやすい」です。

Hiyori: "Simple recipe" じゃだめなんですか?

Max: "Simple recipe" というと「材料や手順などが少ない」という感じで、 "easy recipe" は「誰でも作れる」という感じです。

あっこれはいい質問、 t_wada さんに教わったやつだ、とピンときた。

Easy: 手数の少なさを重視(そのかわり覚えることが増え、特定の状況には強いが他には弱い設計になる)

Simple: 覚えることの少なさを重視(そのかわり手数が増えたり、自分で組み合わせたりしなければならない)

Simple と Easy は軸が違う(それぞれ対極は Complex と Hard)ので、対象が十分に小さければ両立できないわけではないのですが、多くの場合では結局トレードオフになります。

prepackaged (形容詞)あらかじめ包装された

Hiyori: 「レトルト」は英語じゃないんですか?

Max: "Retort" という英語はあるんですが、ほとんどのアメリカ人には通じないと思います。"Prepackaged" は、レトルト食品や冷凍食品、お弁当など、広く「調理されてパッケージに入った」ものを指します。

"Retort" を辞書で引くと、名詞の意味よりも「言い返す」という意味の動詞としての意味が先に出てくる。英辞郎ではレベル8。

レトルト食品 - Wikipedia いわく:

レトルトパウチ(食品)は英語でも retort pouch (foods) と呼ばれるため、和製英語ではない。また、同じ意味で boil-in-bag (foods) が使われる。

"retort pouch" で Google 検索すると Retort pouch - Wikipedia が出てきた:

In the consumer market, retort pouches have gained great popularity outside of the United States, particularly in the Pacific Rim region. However, American consumers have evidently demonstrated reluctance regarding the packaging technology, and its adoption has been slow. As a result, many retort packages sold in the United States are packaged in cartons to give them an appearance more familiar to consumers.

アメリカ人はレトルトパウチのパッケージを嫌うため同国では普及が遅れており、その外観をよくするためパウチを紙箱に入れている…というけれど、レトルトパウチをそれほど嫌っているようでもない日本でもレトルトカレーとかは紙箱に入っているのがふつうのような。あれは一種の緩衝材なんだと思っていたけど、どうなんだろうか。

[記事]CakePHP 5.0.0-beta1 Released

とうとう CakePHP5 の beta1 がリリース。

bakery.cakephp.org

よりくわしい変更点は移行ガイドに: 5.0 Migration Guide - 5.x

新機能は思いのほか少ない。

CakePHP 5 leverages the expanded type system feature available in PHP8.1+.

型宣言をより積極的にしていくのが変更の主眼か。このあたりがどの程度アプリ開発のしやすさに寄与してくるのかは、使ってみないとわからないところか。

CakePHP also uses assert() to provide improved error messages and additional type soundness. In production mode, you can configure PHP to not generate code for assert() yielding improved application performance.

すなわち、CakePHP アプリの本番環境では zend.assertions-1 に設定しておく必要が出てくる。従来は「本番環境の PHP 設定がどうなっているかわからないから…」とプロダクトコードに assert() を使うのをためらう案件もあったけれど、フレームワーク側でそもそも使っているならスタンスが変わってきそう。

Query::all() was added which runs result decorator callbacks and returns a result set for select queries.

これが何のことを言っているのか、ざっと見ただけではわからず。ただ従来 Cake\ORM\Query::$_type でクエリの種別( select / insert / update / delete)を表現していたところ、クエリの種別ごとにクラスが新設されているのは見つけた。

EnumType was added to allow mapping between PHP backed enums and a string or integer column.

PHP8.1 で追加された列挙型を使った EnumType が提供されるのはうれしい。ぜひ使いたい。

前回の CakePHP4 リリース時をふりかえると、4.0.0 beta1 リリースから 4.0.0 正式リリースまでは約半年。すると5.0.0の正式リリースは来年2023年半ばくらいかしら。