php 7.4 に Typed Properties 2.0 が来そうな話

TL;DR

  • https://wiki.php.net/rfc/typed_properties_v2
  • php 7.4 へのオブジェクトプロパティへの型付け導入への RFC 投票が始まった
  • 現在のところ反対意見もなくこのまま可決されそう
  • 現状の実装だとパフォーマンスは MediaWiki でのテストで 2% 〜 3% 低下

php での静的型付け

php はほとんどの人が名前を聞いたことがあるであろう(良くも悪くも) Web を代表するインタプリタ言語の一つです。

php も時代と共に進化を続け、5.0 で OOP の導入、7.0 でタイプヒンティングの型宣言への進化や変数内部実装の大幅な刷新などモダン化が進んで来ました。

7.1 での nullable の導入など、ゆるふわダックタイピングな言語からそれなりにしっかりしたコードの書ける言語へと変化を進めていますが、ことオブジェクトのプロパティ(メンバ)に対しては今もゆるふわなままとなっていました。

Typed Properties 2.0

PHP: rfc:typed_properties_v2

Typed Properties 2.0 は php 7.4 に対しオブジェクトメンバの静的型付けを導入するという提案 (RFC : Request for Comments)です。

内容としては以下のような構文が利用できるようになります。(サフィックスによる型宣言についても RFC 中では言及されていますが、全体としてプレフィックスでの実装が好ましい旨まとめられているので端折ります)

<?php
declare(strict_types=1);

class Example
{
    // スカラ型型宣言
    protected int $foo;
    // スカラ型宣言( nullable )
    protected ?string $bar;
    // 仮想型宣言
    protected iterable $baz;
    // オブジェクト(クラス / インターフェイス)宣言
    protected HogeInterface $hoge;
    // callable は実装上の問題のためサポートされない (RFC 参照)
    /* protected callable $fuga; */
}

これは php 7.0 で導入された型宣言 (RFC: Return Type Declarations, Scalar Type Declarations) を補強するものであり、ユーザー定義オブジェクトのメンバに対する型宣言を言語レベルでサポートするものです。

Reflection でのオブジェクトメンバ型情報の扱いについても言及されており、 DI Container を用いた Auto Wiring が捗るものとなっています。

/ 余談ですが、いつになったら php.net の Reflection に関するドキュメントは整備されるんだろう... /

既に実装も行われており、 GitHub に pull-request が提出されています。

github.com

パフォーマンスへの影響

現在のところ、提案されている実装を適用した際に、 MediaWiki を用いたパフォーマンス計測で 2% 〜 3% ほどの速度低下が見られるようです。

とは言えそこまで大きな影響でもなく、 Zend OPCache の高性能化もあってphp 7.4 がリリースされる頃には殆ど影響はなくなっているのではないかと思います。

RFC 投票の状況

php では新機能の実装や言語コアへの変更を加える際には投票を行い、それぞれ一定以上のコアメンバーの承認が必要となります。

今回の Typed Properties 2.0 に関しては php の言語コアに対する変更になるため、投票者の3分の2が賛成しなければ可決されません。

2018/09/17 時点での投票状況は賛成60人反対1人と前例のないものとなっており、ほぼほぼ可決されるものと思います。

(今のところ反対となっている pollita 氏はジョークで反対に投票していることを Twitter 上で明らかにしています)

モダンな php に向けて

何かとクソ言語として *1 有名な php ですが、 7.0 以降ドラスティックに言語のモダン化が進められています。

今回の Typed Properties 2.0 以外にも非同期処理への対応である Fiber の導入(Ruby そのまんまですねこれ)提案や internals での php 8.0 に向けての議論が進められており、見ていて楽しい感じです。

*1 Wordpress のメンテさせられそうになった時ははよ滅べクソ言語と思いましたが

訃報 : Western Digital WD Red WD10JFCX 2.5inch 1TB

平成30年9月9日 午後9時頃、Western Digital 製の 2.5 inch HDD であります WD10JFCX がご臨終なされました。 推定5歳でした。

発覚の経緯

9月15日 朝4時頃、いつも通り適当に Twitter を眺めていたところ 自宅ステータス通知bot @zeriyoshi_svr のつぶやきがおかしなことになっていることに気づいた

/dev/sda (WD10JFCX) の最期のステータス

その次のステータス そこにはもう /dev/sda の姿はない

dmesg から「彼の最期の声」を探す

彼が逝ってしまったのは 9月9日 の 21:00 〜 20:15 の間であることは間違いないのだが、正確な時刻がわからなかった。

Linux カーネルのログには残っているだろうとおもむろに dmesg -T を叩く。

[Sun Sep  9 21:00:01 2018] ata1: exception Emask 0x50 SAct 0x0 SErr 0x4090800 action 0xe frozen
[Sun Sep  9 21:00:01 2018] ata1: irq_stat 0x00400040, connection status changed
[Sun Sep  9 21:00:01 2018] ata1: SError: { HostInt PHYRdyChg 10B8B DevExch }
[Sun Sep  9 21:00:01 2018] ata1: hard resetting link
[Sun Sep  9 21:00:01 2018] ata1: SATA link down (SStatus 0 SControl 320)
[Sun Sep  9 21:00:06 2018] ata1: hard resetting link
[Sun Sep  9 21:00:07 2018] ata1: SATA link down (SStatus 0 SControl 320)
[Sun Sep  9 21:00:12 2018] ata1: hard resetting link
[Sun Sep  9 21:00:12 2018] ata1: SATA link down (SStatus 0 SControl 320)
[Sun Sep  9 21:00:12 2018] ata1.00: disabled
[Sun Sep  9 21:00:12 2018] ata1: EH complete
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: rejecting I/O to offline device
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: [sda] killing request
[Sun Sep  9 21:00:12 2018] ata1.00: detaching (SCSI 0:0:0:0)
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: [sda] FAILED Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: [sda] CDB: Synchronize Cache(10) 35 00 00 00 00 00 00 00 00 00
[Sun Sep  9 21:00:12 2018] print_req_error: I/O error, dev sda, sector 1953525096
[Sun Sep  9 21:00:12 2018] md: super_written gets error=10
[Sun Sep  9 21:00:12 2018] md/raid1:md2: Disk failure on sda2, disabling device.
                           md/raid1:md2: Operation continuing on 1 devices.
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: [sda] Stopping disk
[Sun Sep  9 21:00:12 2018] sd 0:0:0:0: [sda] Start/Stop Unit failed: Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[Sun Sep  9 21:00:12 2018] md/raid1:md1: Disk failure on sda1, disabling device.
                           md/raid1:md1: Operation continuing on 1 devices.

あった。 mdadm が自動的に縮退運転に切り替えてくれている。

どうやら彼は 9月9日 21:00:01 にその生涯を終えたようだった。

彼とは自分が自宅サーバーを始めた2013年頃からの付き合いであり、当初は Cubieboard 2 という ARM なシングルボードコンピュータに接続されていた。

なんだかんだで5年間頑張ってくれたことになる。耐久性が低いと言われる 2.5 inch HDD としては大往生なのではないだろうか。

5年間も無事に動き続けてくれた彼に感謝しつつ、スペアの確保が難しくなってきた今どう構成を変更していくかを考えたいと思う。

macOS High Sierra(10.13.6)のfold(1)コマンドが死んでる話

シェルスクリプトで汎用的なコマンドを作るのがダルかったので雛形を作ろうとしていた時にSegmentation Faultに出くわした。

SEGVなんてPOSIX準拠のコマンドを普通に使っている限り発生しないと思っていたのだけれど、発生してしまったものは仕方ないので少々調査してみることにした。

どうやらmacOSfold(1)がバグを抱えているくさい。標準入力から値を渡し、-sまたは-bオプションをつけると確実にSEGVする。

asciinema.org

上記の通り、BSDfold(1)ではなくGNUfold(1)では正常に動作している。

macOS自体がBSD系なので、同じ系統であるFreeBSD (12.0 Current)でも動作を確かめてみた。結果としては問題なく動作した。

うーん困った... 一応Appleにバグレポートを投げてみたけれど、いつころからこのバグを抱えているんだろうか...

fold(1)を使うシェルスクリプトが全滅する可能性もありなんとも言えない。せめてPOSIXの範囲内では正常に動作するようにしてほしい...

というかPOSIX標準満たせてなくてもThe Open GroupのUNIX認証通るんですね...特にテストとかはないのかな

KickstarterでHexgears X-1にプレッジした

KickstarterクラウドファンディングされているHexgears X-1というキーボードにプレッジした。

www.kickstarter.com

なぜ

グダグダと長い文章を読まされたくない人が大多数だろうから手短に箇条書き

  • 前々から気になっていたKailh Choc Switch (別名Kailh Low Profile)スイッチの採用の薄型メカニカルキーボード
  • デザインが好み
  • 有線/無線どちらでも使える
  • 配列が Apple Magic Keyboard とほぼ同一 (ここ重要)

仕事・個人で使っているのがMacBook ProとMagic Keyboard(US配列)なので、同じ配列なのは嬉しいと言うか違うとめちゃくちゃストレスが溜まるのでマストだった。

同じようにMacBook Pro / Magic Keyboardの配列とほぼ同一なMatias 60%というものも存在しているのだけれど、キットの取扱が終了してしまっているようで手が出せず... (ALPSキースイッチ自体は古いキーボードから採取したものが大量にあるのでMatiasスイッチはいらない...)

すでに目標金額は達成しているようなので、MacBook や Magic Keyboard とコンパチ配列なキーボードを求めている方にはおすすめかもしれない。

余談

最近は自作キーボードの流行が凄まじく、各種同人誌が発行されたりイベントが催されたりととても楽しいことになってきている。

Let's Split (通称レツプリ)やHelixに関しては職場でも話が上がってくるほどだ。

数年前「自作キーボードを作るぞ」と息巻いていた自分が未だに何も出来ていないのが非常にもどかしいが、このとても楽しい流れに乗りそびれないよう今後活動していきたい...

(ちょうど先日開かれたMaker Faire Tokyo 2018でも自作キーボードクラスタの方々が出展されており、ぜひとも行きたかったのだが尋常じゃない外耳炎・中耳炎の併発のせいで行けなかった...めちゃくちゃ悲しい...)

「自尊心が低い」とは何か

"自尊心が低い人"という言葉を定期的に耳にするが、これは一体どういうことなのか。そもそも"自尊心"とは何なのか。

細かな定義を考えてみると曖昧な部分があったので今一度整理することにした。

"自尊心"とは

じそんしん 2【自尊心】

① 自分を優秀な者だと思う気持ち。尊大に構える心。プライド。「―が強い」

② 自分の品位を保とうとする心。プライド。「そんなことは―が許さない」

スーパー大辞林 より

自分を優秀な者だと思う気持ちについては理解していた通りだったが、プライドというのが少し予想外だった。

"自尊心が低い" is 何

"自尊心が低い"という意味は大体理解できたが、その本質は何なのだろう。

"自尊心が低い"にも理由があるはずなので、軽く分類分けした。

自尊心が低い説
├ 価値を正しく認識できていないよ流
│├ 周囲からの評価が適切じゃないよ派
│└ 謙遜して評価を素直に受け取れていないよ派
│ ├ 本気で低く思っているよ系
│ └ 本当はそんなことないのにプライドから低く見積もっているよ系 *1
└ 裏付けされた低価値を元にしているよ流
 ├ 周囲からの評価が過剰だよ派
 │├ クズさが周りに伝わってないよ系 -> 本当に価値がないよ派へ
 │└ 実は裏付けが間違っているよ系 -> 価値を正しく認識できていないよ流へ
 └ 本当に価値がないよ派
  └ 自尊心が低いというよりただの事実だよ系

注目してほしいのが*1で、これはある意味でプライドが高いと言える。本来の意味からするとプライドが高い = 自尊心が高いということになる。

まとめ

だからどうしたってわけでもないのだけれど、己は自尊心が低いわけじゃないんだなということが理解できた。

あと関係ないけども本来の自分の価値を認識してない方はもっと自信を持っていいのになと思った。重荷*2じゃないのであればだけれど。

*1 プライド高いというかひねくれているというかなんというか

*2 自信を持つことに伴う責任の重さってなかなか厄介だよね

Golang用DIコンテナ(gontainer)を作った

まえがき

最近業務でGo言語(以下Golang)を触っています。

趣味でLuaJava, C, C#などは使っていたのですが,ご飯を食べるために書いていたのはphpJavaScript(ECMAScript)くらいです。

実を言うと元々Golangには当初否定的な考えを持っていました。単に食わず嫌い(リサーチ不足とも言える)していただけです。

ポインタ扱うくせにGCのある言語って...とかシングルバイナリとかDelphi VCLの再来...とか今日日例外機構も無い言語って...とか散々思ってました。

今考えると当時の自分が浅はかだったと思うほかありません。

Golang設計の本質を問い直す言語なのではないかと思います。

長ったらしい命名規則や無駄に構造化されたドキュメントの徹底など,関心の分離さえできていれば考える必要がないことだったのです。 長くなりそうなのでGolang自体に関する話はまた今度別にしたいと思います。

そんなこんなでGolangにベタ惚れしたところで,簡単なDIコンテナを作りたくなりました。 特定環境でしか動作しないコードをローカル環境でテストするためのスタブが必要になったのです。

せっかく柔軟なinterfaceを持つ言語なのだから,その程度条件分岐で済ませてしまえば良いと思う方も多いかもしれません。 ある意味ではその通りです。しかし今回作っているものはモノリシックな構造で,後で地獄を見るのは火を見るより明らかでした。

そんなこんなでGolang向けのDependency Injection Containerを作ることとなりました。

gontainer

で,作ったものがこちらになります。

github.com

Golang + Containergontainerです。

わかる人にはわかりそうですが,LaravelIlluminate\Containerに強く影響されています。 GolangはあんなLL並のコンテナ構造を簡単に作れてしまうくらい柔軟な言語なのです。

では実際に使ってみます。せっかくなのでinterface(抽象)に対しstruct(具象)を割り当ててみたいと思います。

reflect.TypeOfを使っていますが,効率的にあまり好ましくないので文字列とかでやったほうがいいです。

あくまでもIlluminate\Containerっぽくするための例ということで...

なんということでしょう

まるでLLみたいなコードが書けてしまいました。

Golangの強力なinterfaceと組み合わせれば,簡単にスタブが作れてしまいます。

強いて欠点を上げるとコンパイル型言語である以上依存関係の登録処理が完全に手動になってしまうことでしょうか。 とは言え手続きは登録処理だけに抑えられ,コードがごちゃごちゃすることは避けられます。

Golangたのしい

見ての通り,Golangは非常に柔軟で楽しい言語です。LLに甘やかされてきた人でも簡単に始めることができます。 また,豊富なライブラリも揃っており,LL並の生産性を有しています。

シングルバイナリという点からもコマンドラインツールの開発においては最高の言語と言えるのではないかと思います。

数年遅れてしまいましたが,自分もGolangerとしての道を歩み始めました。LL上がりのクソザコナメクジですが,何卒よろしくお願いいたします。

日記 : 社会人2年目・とりあえず読んで欲しいお肉の話

久しぶりの記事となってしまいました。

時が経つのは早いもので,いつの間にか社会人生活も2年目に突入していました。 本当にいろいろな出来事があり,学ぶことや考えさせられることの多い1年間でした。 時には様々な方々に迷惑をおかけしてしまうこともありましたが,過去の人生の中で一番濃い時間だったのではないかと思います。

牛肉おいしい

閑話休題

先日,ちょっとした用事で普段自分では買わないような国産和牛のお弁当を食べる機会がありました。 久々に甘辛く味付けされたお肉を食べてみると非常に美味しく,翌日の夕飯は吉野家で牛カルビ丼を食べました。 先日食べた国産和牛とは比較に及びませんが,これもまた十分に美味しく満足出来るものでした。

帰宅する最中,ふと「お肉の質」ってなんだろうと思いました。

産地や等級など,お肉には様々な「階級付け」が存在します。それが表すところは生まれ育った産地であったり 飼料の種類であったり多種多様です。

しかし,両者は同じ「牛肉」であり,「牛肉」である以上「牛という動物の肉」であることには変わらないのです。 生前の牛たちは格付けされており,その評価基準は「人間が食べて美味しいものであるか」というものでした。

食べられる牛側からしてみれば,いくら高い等級がつけられようと全く嬉しくないでしょう。 この格付が人間基準の評価であり,人間がどう利益を享受できるのかでしか判断されていないものである以上当然ではあります。

しかし,「格付が当人の利益に結びつかない」という話は,別に人間社会においても何ら変わりないものだと思うのです。

社会的地位≠人としての幸福

一般的に,社会的地位が低くて損をすることは無いでしょう。この部分については「肉として格付けされる牛」とは異なっています。

ですが人としての本質的な部分を考えた時,社会的地位は何も手助けしてくれないどころか,むしろ阻害要因にすらなり得る部分があります。

仮にあなたが超一流のエンジニアであると考えてください。業界内であなたの名を知らない人はおらず,多くの人から尊敬されているとします。 あなたが何かを作れば誰かが必ず反応し,良くも悪くも常にフィードバックが得られます。あなたはそのフィードバックを元に試行錯誤をしつつ,更なる高みを目指していくことでしょう。

しかし,順調に良いサイクルが回り続ける保証はどこにもありません。大概にして良いサイクルは数年程度で崩れてしまいます。

先程の例で考えてみます。あなたは超一流のエンジニアで良いものを常に産み出し続けています。しかし,ある日突然スランプに陥ってしまいました。業界のトレンドについていけず,考え方の刷新も図れない,次第に周りに居た人達はどんどん離れてゆき,最終的に孤独が訪れます。

こうなる理由は簡単で,周りはあなた自身を評価していたのではなく,その能力を評価していたからです。人は往々にしてここで勘違いをしてしまい,評価を失った時に負のスパイラルに陥ってしまいます。

これ,本質的に「肉」として格付けされた牛と同じなのです。むしろ本人が「自己への評価」だと思いこんでしまっている分,真実を知ったときのダメージが大きく,質が悪いといえるかもしれません。

「本当の自分」を評価してくれる人を大切に

最終的に言いたいのはこれです。「超一流の誰からも尊敬されるようなエンジニアになってやる!」と考えるのは大事ですし,向上心を持つことは専門職をやっていく上で必要不可欠です。

ただ,「能力を抜きにした自分」を評価してくれる人・環境を大切にすることを忘れないでください。それが家族,友人,恋人など何であるかは別にどうだっていいと思います。

ただ一つ言えることは,いつか挫折し地位を失った時,あなたを支えてくれるのはその人達だけだろうということです。

そういう人が周りに居てくれるということは本当に幸せなことだと思います。