2023年に『SQL書き方ドリル』の付属ソフト「SQUAT」がMacで動くまで

くだんのフィヨルドブートキャンプは着実に進捗しており、nginxのプラクティスが最終盤。これが終わればSQLのプラクティスに入るので、以前に独学で取り組んでわかりやすかった以下の本を電子版で買い直した。

gihyo.jp

書誌情報は↑の方がわかりやすいけど、電子版を買いたい場合は以下へ。

改訂第3版 すらすらと手が動くようになる SQL書き方ドリル | Gihyo Digital Publishing … 技術評論社の電子書籍

技術評論社で電子版を買うと、ePub版とPDF版を同時に入手できるのでありがたい。

以前は紙版で買って、実際に本に鉛筆で書き込んで使ったものだけど、今回はPDF版を必要に応じてスクショして、それを何ページかまとめてPDF化して、それにiPadで書き込んで使っている。本当は元のPDF本にそのまま書き込めればベストだったんだけど、なんかロックがかかってるようで直接編集できなかったので次善策として。

で、本の内容自体は何も問題ないのだけど、本書の付属物で「SQUAT」というSQL練習用のソフトウェアがありまして、これを使うとPC上でもいろいろSQLを打ち込んで動かせる。ということを以前に買ったときも試して覚えていたので、早速それもやってみようと思っていろいろ試したのだけど、全然立ち上がらなかった。もしかして、本書は最新の改訂版でも2016年発売なので、それから7年も経って互換性の問題とかで現代のPC(というかMac)では動かないんやろか・・とか思いながらあの手この手で試すんだけど、何をやっても動かない。それで絶望&完全に諦めて、しかしその後もグダグダ粘っていたら最終的には動いたので、以下ではそれについて書いていく。

先に結論というか、「こうすれば動く」的なことをザッと書いて、その後に諸経緯をダラダラ書く。個人的には後半の方がメインだけど、本件についてはいくらググっても全然役立つ情報が出てこなかったので、同じようにハマってる人がいたらとりあえずその結論だけ見て試してもらえればいいのかなと。

結論

SQUATを動かすために必要なことはたったの2つ。

1. Javaを実行するための環境を準備する。
2. 同梱ソフト群の「startup.command」をダブルクリックする。*1

以上。なんだけど、もう少し具体的に説明すると、まずMacにJavaが入ってるかを確認する。ターミナルで以下を打つ。

$ java -version

以下のように出てきたら入ってないので、JREというのを入れる。

The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

JREって何?ということはもちろん知らなかったんだけど、以下がわかりやすかった。ようは、Javaを動かすための何か。
qiita.com

JREは、Javaのサイトの「ダウンロード」というそのままなページからダウンロードできるので、そこで.dmgファイルをダウンロードして、手元に落ちたらダブルクリックしてインストールする。ダウンロードページは以下。
https://www.java.com/ja/download/

ちなみに、M1 MacとIntel Macではダウンロード対象が異なるので注意。現時点(2023年8月後半)では、目立つダウンロードボタンはIntel用。M1用はそのボタンのすぐ下に「ARM64バージョンのJRE」というリンク文字があるので、そこからダウンロード。

なお、JREは今回の付属ソフトウェアの中にも同梱されているんだけど、これは「8u73」という2016年に有効期限が切れているもののようなので、使わない。

最新版JREのインストールが完了したら、ここでひとまずSQUATに同梱されている「startup.command」をFinderからダブルクリックしてみる。以下のように「開発元が怪しいので開けません」的な表示が出るかもしれないけど、

この場合はFinderからファイルを右クリックして「開く」を選択すれば、「ほんとに開くの?」的なダイアログで「開く」ボタンが出てくるので、それを押す。と、今度は以下のように「アクセス権限がないから実行できない」とかいうエラーが出るかもしれないけど、

この場合はターミナルで「startup.command」に実行権限を付与する。具体的には、「664」を「764」に変更。

$ chmod 764 startup.command 

その後に「startup.command」をダブルクリックして、ターミナルが起動してこんな感じでユーザー名を登録するための画面が表示されたら成功。

最短で動くケースはたぶんこれ。以下はそうは行かなかった人のための対処法。そう、それが私の辿った道。

一旦諦めてからなぜか成功するまで

今回、自分の環境では「MacBook 2016(Monterey)」と「MacBook Pro 2020(Ventura)」で試して、結果的には両方で動いたんだけど、最初はMacBookの方だけでやっていて、このときは最初に上記「結論」の手順をすべてやったんだけど動かなかった。それでかなりハマった。一方、MacBook Proの方は上記の手順で一発OKだった。

SQUATを使うためにはJavaをインストールしなければいけなくて、しかしメインマシンのMacBook Proにはなるべくそういう普段使わないものを入れたくないな〜・・と思ったので、初めはMacBookだけで使おうと思っていた。しかし後述のようにMacBookでは全然動かなかったので、仕方なくMacBook Proでも試したという流れ。

最初にMacBookの方でやったのは上記の通りで、まずはJavaが入ってるかどうかを確認して、JREを入れようと思ったけど古いのを使うのはマズイだろうと察して最新のそれをダウンロード&インストール。その後に「startup.command」をダブルクリックして、アクセス権がどうしたとか言われたのでターミナルで実行権限を付与して、そしたらターミナルは起動するんだけど、すぐに以下の表示が出て勝手に終了してしまう。

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[プロセスが完了しました]

ちなみに、これはSQUATを正常に終了したときに出てくる表示と同じもの。

それで、はあ駄目だこりゃ、このソフトが古いんだわ、と一旦諦めた。何しろ、同梱されているJREが上記の通り7年も前のもので、それを平気で同梱してるという時点でもうこのソフト、読者の手元で動かさせる気ないだろ、と思った。*2

とはいえ、なかなか諦めもつかないというか、以前に触ったときにはサクサク動いて良いソフトという印象だったし、なんとかならんのか・・と思って以下を試した。

あえて古いJREを入れてみる

互換性的な観点で、とりあえず最新のJREで動かないのだから同梱されてる方の古いJREを使ったら動くのでは?と考えた。それで、一旦すでに入っている最新版のJREをアンインストールして、同梱されている方を入れてみようと。JREのアンインストール方法は以下で示されている。

https://www.java.com/ja/download/help/mac_uninstall_java.html

次の手順で、ディレクトリとファイル(symlink)を1つずつ削除します:

1. DockにあるFinderアイコンをクリックします
2. 「Utilities」フォルダをクリックします
3. 「Terminal」アイコンをダブルクリックします
4. ターミナル・ウィンドウで、次のコマンドをコピー・アンド・ペーストします:

sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -fr /Library/PreferencesPanes/JavaControlPanel.prefPane
sudo rm -fr ~/Library/Application\ Support/Oracle/Java

sudoまじで使いたくない、と思ったけど公式サイトの案内だし、そこまでおかしなことにはならないだろう・・と楽観的に実行。ターミナルでJavaが入ってないことを確認して、その後にあらためて付属品に同梱されていた古いJREをインストール!・・のはずが、ずーっとグルグル回ってしまってまったくインストールされない。なんだよ〜・・

最新のJREを入れ直・・せない

まあ仕方ない。諦めて、さっきの最新版JREを入れ直すか、と思ってまたインストールしようとしたら、『XPC接続エラー』とかいう初見のエラーが表示されて、処理が強制的に終わってしまう。何度やっても同じ。なんと、さっきは正常に入ったはずのJava自体が入らなくなってしまった。どう考えても↑のsudoが悪かっただろ・・としか思えない。けど、どうしようもない。ハマるとき、こういうのが一番つらい。

ChatGPTに相談→OS再インストール

この辺りになるとかなりヤケになっていて、頼みの綱はChatGPTぐらいかという感じになる。それでGPT-4に聞いてみたら、いろいろ教えてくれるんだけど(エラーメッセージを見ろとかどのフォルダを見ろとか再起動しろとか)、すべて空振り。その上、「今言ったのが全部駄目なら最悪OSを再インストールしろ」とか言い出して、コイツ・・と思ったけど、まあそのMacBookには実は大事なデータとかは全然入ってなくて、シンクライアント的に使っていたので、それもありかと思ってサクッとOS再インストール。

何時間か経過して、全部まっさらな状態から始まると思っていたんだけど、同じOSだったせいかほとんど以前と変わっていない。肩透かしを食らいながらあらためて最新版のJREを入れてみようと試したら、さっきと同じく『XPC接続エラー』。いやいや、OS再インストールしたやろがい、なんでやねん。という感じでここで完全に諦めた。もう無理。

JDKを入れてみる

と本当に思ったんだけど、でもどうにも諦めきれない(どっちや)。それでそのままウダウダ検索していたら、Javaを動かすにはどうやらJREというもの以外にJDKというものがあるらしい、とわかった*3。そういえば、以前にもそんなの聞いた気がするなと探してみたらダウンロードできる場所を発見。

Java Downloads | Oracle

この中の「JDK 20→macOS」を選択して、今回のMacBookはIntel版なので、「x64 DMG Installer」というのをダウンロード&インストール。これはあっさり入った。*4

すかさず、懸案のJREのインストールをリトライ。最初に最新版で失敗したので、今度は古いやつ。

お、これは・・。

入った!
しかし、この「閉じる」ボタンを押すと以下に飛ばされて、これを使うな的なことを言われる。

https://www.java.com/ja/download/uninstalltool.jsp

どうも古いJavaだから、ということっぽい。ここで「条項に同意して続行します」ボタンを押すと、アンインストールツールがダウンロードされる。ようやく入ったのに即アンインストールかい。仕方ないのでやるけども、なんとなく最初の方でやったsudoコマンドでの操作が諸悪の根源だったのではという思い込みを捨てきれず、また流れ的に上手くいってるようにしか思えなかったので、自分の直感を信じてアンインストールツールは使わず、手動でFinderから以下をMacのゴミ箱に捨てた。

/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
/Library/PreferencesPanes/JavaControlPanel.prefPane
~/Library/Application\ Support/Oracle/Java

で、ターミナルでJavaが入ってないことを確認して、今度は最新版のJREをあらためて以下からダウンロード&インストール。

https://www.java.com/ja/download/

したら、今度はあっさり入った。やはり、運はこちらに向いている。

そして大きな期待とともに、久しぶりの「startup.command」をダブルクリック。すると・・

おお〜〜!まじか!ついに出た、SQUAT!結局JDKを入れてなかったからか〜、意味わかんないけど!なんて思いながらガッツポーズ!・・をしてたんだけど、なんとこの「コンポーネントをロードしています」からビタイチ動かなくなってしまった。嘘でしょ・・?ここまで来て?と思ったけど、嘘ではない。全然動かない。

なんだよ〜、JDKを入れたから解決したんだと思ってたのに、これで終わりじゃないなんて。ここで本当にマジで切れた。最後までつながっていた緊張の糸、集中力、淡い期待が。つまり諦めた。

技術評論社に問い合わせ

その後も一応、数少ないヒントの「コンポーネントをロードしています」とかいう文言でググってはみるものの、関係ありそうなものはまったく出てこない。「一旦全部アンインストールして再インストールして、マシンを再起動しろ。よくわからないがそれで直ることもある」みたいな責任感が崩壊したような情報しかない。*5

そしてもうこうなったら、技術評論社に問い合わせるしかないだろと思った。何しろこれは古本ではなく、定価で買った本の付属ソフトウェアである。それが動かないってさすがに問題だろと思った。もちろん本の内容だけでも価格には十分見合うとは思うけど、それにしてもこの失望・絶望はなんとか訴えたい。というか、7年前のJREが同梱されてる時点で全然互換性とか使用可否の確認とかしてないとしか思えず、著者も編集者もこの現象に気づいてないだけでは?問い合わせれば普通に解決するのでは?とも思ったのだった。自分で解決できないなら、外部の専門家の力を借りるしかない。(←結局まだ諦めてない)

それで、以下の問い合わせページにアクセスして、

書籍内容に関するお問い合わせ|技術評論社

ISBNコードなんかも全部入力して、詳しいレポートを書き始めたんだけど、そこで初めてこのインストール作業をひたすらMacBook1台だけでやっていたことに気がついた。で、どうせ問い合わせるならMacBook Proの方でも試して、同じ現象を再現させてからの方が説得力あるよな・・と思って、本当は上述のようにメインマシンの方にJavaを入れるのは嫌だったけど(ましてやレポートを送るためだけに!)、まあ背に腹はかえられない。再現性の確認を優先して、上記の「結論」にある手順をMacBook Proの方でやってみたら、普通に動いた。なんでやねん。

こうなると、少なくともSQUAT自体は何も問題ないということになり、問い合わせもできなくなってしまった。というか、念のため2台めで確認しておいてよかった。危うく大変な恥をかくところだった。

ということで、どうせまた同じ目に遭うとは思いながらも、問題のMacBookの方で一旦JDKをアンインストールして、あらためてMacBook Proで動いたのと同じ最新版JREをインストールしてみることに。

JDKのアンインストール方法は以下。

https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html#uninstall

Uninstalling the JDK on macOS

To uninstall the JDK on macOS, you must have Administrator privileges.
 
Note: Do not attempt to uninstall Java by removing the Java tools from /usr/bin. This directory is part of the system software and any changes will be reset by Apple the next time that you perform an update of the OS.
 
1. Go to /Library/Java/JavaVirtualMachines.
2. Remove the directory where the JDK is installed by running the rm command as a root user or by using the sudo tool:

$ rm -rf jdk-1.8.jdk

完了後、ターミナルでJavaが入ってないことを確認して、あらためて最新版のJREをインストール!・・したら、あっさり完了。バージョンも確認できた。

$ java -version
java version "1.8.0_381"
Java(TM) SE Runtime Environment (build 1.8.0_381-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.381-b09, mixed mode)

でもでもでも、どうせあれだろ、また「コンポーネントをロードしています」で止まるんだろ?お前はどうせ!と思いながら、ぶり返した淡い期待とともに「startup.command」をダブルクリック。

止まらなかった。見事に起動した。ええ、なんで〜?・・以前にできなかったときとの違いは、「一旦JDKをインストールして、アンインストールした」ぐらいなんだけど。まあ理由は全然わからないけど、とにかく2023年8月時点では、MacBook 2016とMacBook Pro 2020では『SQL書き方ドリル』の付属ソフト「SQUAT」が動くことがわかった。実際のドリルも何度か回答したけど、ちゃんと動いた。

著者さん、編集者さん、疑ってすみません。さすが現行流通本!JREは古いけど、それはそういうものなんですかね。

それにしても、元はと言えばフィヨルドブートキャンプのSQLの基礎プラクティスをやるために副読本として用意しただけだったのに、解決するまでにまるまる3日は費やしてしまった。その間、SQL自体の進捗はゼロ(笑)。こんなに大きなヤックシェイヴィングは初めてかも。というか、途中では本気で(それも何度も)解決は諦めていたわけだけど。逆転のきっかけは、「技評さんに問い合わせよう」と思ったことかな・・あれがなかったら2台目で検証しようとは思わなかったし。まあでも、その前後の当て所ない試行錯誤も大事だったか。実るあてのない試行錯誤が結局解決に向けて自分を押し出してくれている。

しかし何より、この良書のドリルを手書きのみならずPC用ソフトでも特訓できるというのがとにかく嬉しい。これで心おきなく、練習できる。

*1:Macの場合。Windowsなら「startup.bat」。

*2:紙の本なら仕方ないんだけど、電子版の付属物はダウンロード方式で配布しているのでアップデート不可ということはないだろうと思ってる。

*3:これがわかりやすかった。https://qiita.com/keomo/items/a814a36be95033c14207

*4:このときに参考にしたのがこの動画。最初は「全然関係ない情報だった・・」と思っていたが、結果的にかなり参考になった。 www.youtube.com

*5:時にはたしかにそれが真実なのだけど。

フィヨルドブートキャンプとReact入門

今年の3月ぐらいからフィヨルドブートキャンプに通い始めている。

bootcamp.fjord.jp

何がきっかけだったのか、たしかRuby30周年イベントをYouTube配信で眺めていて、「あっ」と思ったような。今やらないと、みたいな。それでささっとトライアルに申し込んで、まあできるかなと思ってそのままスタート、みたいな。

全部で110ぐらいのプラクティスがあって、現在それの42個めとか。早いじゃんという感じだけど、最初は初歩的なことも多く、Gitの使い方とかすでに知っているのもあるし、という感じ。さくらのVPSを契約するとか、まったく未知の分野にも体当たりしていく必要があり、なかなか大変。

早いじゃん、とさも当然のように書いたけど、本当に早い人は半年ぐらいで卒業してしまうのでそういう人よりは遥かに遅い。一方で3年ぐらいかけてじっくり卒業する人もいるし、もちろん途中でやめたり、休止したりする人も。だから周りと比べても仕方ない。他人の進捗は参考や刺激にはなるけど、基準ではない。

いずれにしても、今のところはなんとか継続しているから、その一端をここでも報告してみようかとこれまたふと思い立った。一日一日は大した進捗もないのだけど、スケッチ風にというか、余裕があるときにさっとメモのように書いておこうかなと。

とか言いながら、いきなりフィヨルドブートキャンプの話ではないのだけど、ドットインストールのプレミアムプランを再開した。

dotinstall.com

最近Reactに関する新レッスンが公開されたそうで、Reactはいずれフィヨルドブートキャンプでもやることになるので、その予習をしておこうかな、と。今日はそれを始めて2日目。まずはその新レッスンの前に、React入門というものから。

dotinstall.com

全部で23回分あるようだけど、それの4回目まで終わったところ。まあまあの調子。そして、これを始めたのとほぼ同時に、脱Vimを図っているところ。これについてはまた機会をあらためて書きたいが、VS Codeを自在に使えるようにしたい、という目的によるもの。Bramさんが亡くなったこともひとつのきっかけにはなっているかもしれない。Vimはこれからも使っていきたいが、それしか使えないというのはやはり困る。独り立ちしないと。

毎日は無理だと思うが、また進捗と余裕があれば更新したい。

あれから10年の現在地〜YAPC::Kyoto 2023に行ってきた #yapcjapan

2023年3月19日に京都で開催されたYAPC::Kyoto 2023に参加してきました。

yapcjapan.org

2023年というと、じつはというか、もうぼくが趣味のプログラミングを始めてからちょうど10年になるんですよね。

10年前、2013年というのはぼくが初めてYAPCに参加した年でもあって、以下のレポートを書いていました。

note103.hatenablog.com

*今読むとノリがめちゃめちゃ恥ずかしい!

さらに、その2週間ぐらい前に初めてPerlコミュニティに飛び込んだ話が以下で、

note103.hatenablog.com

これを読んで思うのは、ああ〜懐かしい〜みたいなことでは全然なくて、俺、このときキツかったな〜大変だったな〜!ということ。それはリラックスの対極、終始ヒリヒリするような緊張感と焼けつくような恥ずかしさ、冷や汗がダラダラ流れ続けるような感覚で、サポーターの皆さんは本当に親切で良い感じだったんですけど、初心者向けの講座ですらあまりにも自分の実力が追いついておらず、「なんで来てしまったんだ・・無謀すぎるだろ俺」という感じでした。

当時のPerl入学式のサポーターといえば、id:papixさん、id:xtetsujiさん、まこぴーさん、うずらさん、わいとんさん、moznionさん、かるぱさん、それから猫のあずまさんと若林さん等々。皆さんいずれも今回の京都でご活躍でした。よく考えると、いや考えなくてもすごい面子。豪華でした。

ではなんでこのPerl入学式に行ったのかと言ったら、じつはそのすぐ後に開催予定だったYAPCの方に行くことを先に決めていて、チケットも買ってあったので、その前に少しでも知り合いを増やしておこうと思ったんですよね。・・姑息!しかしその試みはあんまりうまく行かなくて、いざYAPCに行ってみると、Perl入学式で知り合った人たちと会っても共通の話題がほとんどないのでちょっと話してもすぐ終わってしまうし、皆さんもともとの知り合いがたくさんいてそっちはそっちで貴重な機会だから、当然そちらで多くの時間を過ごすことになるしで、結局ぼくは懇親会の8〜9割ぐらいの時間を一人でじめ〜っと過ごしていました。そのときに考えていたのは、「このアウェイ感、激レアだからしっかり味わっておこう!」みたいなことではまったくなく、そのまますごすご帰るのもシャクというか、ただなんとなく帰るきっかけを失ったまま結局最後まで残ってた、みたいな感じだったと思います。

じゃあなんでそこまでしてYAPCに行こうと思ったの?と言ったら単純な話で、「なんか楽しそうだったから」なんですよね。じつはというか、その何年か前からYAPCのことは知っていて、たぶん初めてYAPCに触れたのが2008年のこれ。

YAPC::Asia 2008 - May 15-16th in Tokyo, JAPAN

Ustreamで配信されていて、IRCチャットで裏トーク的に解説が延々流れていて。それを使い慣れないLimeChatで見てました。当時ぼくは新しいフリーランスの仕事を請けたばかりで、それがものすごいプレッシャーだったから、現実逃避でジョブズiPhoneの発表をリアルタイムで眺めたりしていたんですけど、それと同じような感覚でそのIRCも見ていて、そのチャットがすごく良かったというか、この雰囲気めっちゃいいな!と思って、それを自分も間近で、現場に身を置いて見てみたいと思ったんですね。そしたら、それから数年経ってプログラミングを始めた頃に以下の記事を見まして、

yapcasia.org

ああ、これはYAPCに参加する良い口実になるなと。自分を騙す口実というか、自分で自分を動かす口実というか。それでその知り合いほぼゼロの状態で向こう見ずにも飛び込んだんですけど、当然のように撃沈したと。

それから10年の歳月が経って、ついにアウェイがホームになった!という話をできれば綺麗なんですが、やっぱりまだまだ全然アウェイなんですよね・・。いや当時に比べたら全然ホームなんですけど、あのときLimeChatで見た楽しそうな雰囲気の中には今も自分はおらず、そういう不全感は今なお残っているなあと。で、それはなんでかと考えたんですが、たぶん結局技術の話がわからないからなんですよね。どうしてもある程度プログラミングができないと、自分が知りたいと思っている対象もふんわりぼんやり曖昧なまま、焦点がよく合わないまま話を聞くしかなくなっちゃう。でも、やっぱりそういうのは嫌で、みんなが見ているものを自分もクリアに見たい、同じものをスッキリ見たい、という感じ。わかりますかね。自分もピントを合わせてそれを見たいんですよ。

そのために、もう少しちゃんとプログラミングやろうと思って、今こういうところに通っていまして、

bootcamp.fjord.jp

5月にはRubyKaigiにも行くぞ!っていう。

rubykaigi.org

だから、プログラミング入門から10年経って、ついに1周回ってYAPCに帰ってきた!当時のサポーターもみんないる!わーい!みたいな感じかと思ったらじつはまだ入門中で、お前まだ足りないよ、もう1周走ってこい!って言われたような状況といいますか。その最初の入門時のことは以下の記事にサクッとまとめたのですが、

note103.hateblo.jp

それにちなんで言えば今って「48才からのプログラミング再入門」という感じなんですね。大西さんの発表で紹介されていた宮川さんの一文、「Better late than never」そのものみたいで、べつにそれで綺麗に落とすためにここまで書いたわけではないんですけど、でもそのものではありますね。

って気がついたらなんだかエモい話になってきた気もしますが、でもぼくの場合はエモいというよりウェットなんですよね・・。本会の最後、ライトニングトークの直前に、Perl神社でお参りして席に戻ったら以前吉祥寺.pmで会ったやっさん(id:yassan0627)が隣の席に座っていて、お〜!ご無沙汰です!なんて言ってそのまま「この後どうしますか」「メシでも行きますか」みたいな流れで何人かで飲みに行ったんですけど、そこで同席した人たちと話していたのが、YAPCにいるスタープログラマーの人たちってみんなすごい優しいけどウェットではないんだよね、みたいな話で。ドライなんだけど冷たいわけではなくて、優しいんだけどベタつかないっていう感じ。でもぼくのはベタつくんですよね・・。

それがイヤっていうわけではないんだけど、いや、やっぱり嫌なんですけど、でも何らかの内容を持つメッセージをアウトプットしようとすると、どうしても一緒に湿気や粘り気が出てきちゃうというか。でも、それを気にして何もアウトプットできなくなるぐらいなら湿り気まじりでもなんかメッセージを吐き出せた方が良いと思うので、それで今ちょっと頑張っていろいろ書いてみてるんですけど。

さて、すでに十分長くなってるんですが、現場で見た発表、その他懇親会などについても書いてみます。ここで大体、全体の31%ぐらいです!

前日祭

まず京都へ出発した日のことですが、ぼくはとにかく朝が弱いので、東京発の新幹線は13時ちょっと前ぐらいのやつに乗って、京都に着いたのが15時半ぐらい。前日祭は17時までというので参加する予定はなかったんだけど、夜にはなんにも予定がなかったのでどうしようかな・・と思っていたらHelpfeelさんが非公式の懇親会をやる、それも前日祭に出ていない人も来てOKというので、ありがたく参加させてもらいました。しかも、ただでさえ参加費1,000円というのに、「フォロー割*1」という無料枠まで設けてくれて、ぼくが申し込んだときはその枠がまだ空いていたので無料で。さらには、とくに会場で何か宣伝されるとか勧誘されるみたいなことは一切なく、むしろ何か宣伝してほしいぐらい。と思ったら4/4(火)にこんなイベントがあるようですよ。ご興味おありの方ぜひどうぞ!

nota.connpass.com

会場には知り合いがほとんどいない覚悟で臨みましたが、ありがたいことに結構知っている人がいて、技術系の編集者として誰もが知る風穴さん、そしてこれまでのYAPCで何度かお会いしている小飼弾さん、白方さん、makamakaさん、さらには当のHelpfeelでご活躍中のid:daiizさんなど。

面識がない人に対しても、年の功というのか、案外自然に「YAPCは初めてですか?」とか、「普段はどんなお仕事されてるんですか?」みたいなことをたまたま隣同士になった人にさらっと聞くみたいなことができていて、なんか間が持たないとか微妙な時間が続く・・みたいなことは一切なく楽しめました。

風穴さん、弾さんと話しているときには法林さんもいらっしゃって、初対面ながら技術系のライティングをするとはどういうことかみたいな話もできて、これは個人的に非常に貴重な経験だったなあ、と思いました。ここにラムダノートの鹿野さんがいてくれたらもっと話が広がるだろうなあ、とも。そんな機会があったらなあ・・。

この会でぼくが一番印象に残ったのは、今のYAPCってPerl成分が少ないよね、というよくある話題になったときに、弾さんが「YAPCにとってのPerlっていうのはマティーニにとってのベルモットみたいなものなんだよ」とおっしゃり始めて、一瞬場が「??」みたいな空気になったのもつかの間、「マティーニに入れるベルモットの量は少ないけど、ベルモットがなかったらただのジンになっちゃうんだから、少しだろうとそこにあることが大事なの」と言っていて*2、おお〜!みたいな。

あとは弾さんにChatGPTに関する見解を聞けたのもよかったですね。詳細は割愛しますが、その数日前にGPT-4が発表されて、かなり熱い時期だったので。実際、弾さんの発表でもChatGPTは不可欠な役割を果たしていたので、その辺を複層的に聞けてラッキーでした。

懇親会の終了後、同じく市内に宿を取っていたid:daiizさんと一緒に途中まで帰ろうということになって、すごく意気投合して楽しく喋りながらズンズン歩いていたら、京都の町並みってどこを向いても同様に整然としているからか、思いっきり違う方向に突き進んでいて、結局ものすごい回り道をして京都駅に帰り着いたのも良い思い出になりました。謎の裏道みたいなところを抜けて戻ったので、たぶんまた京都に行くことがあったとしても二度とあの道を歩くことはないでしょう(再現不能という意味で)。なんか大学生の頃に酔っ払って友達と歩いているうちに、いつの間にか初めて見る港みたいなところに着いちゃって、ボーッと汽笛みたいのを聞きながらかなり不安なんだけど高揚感もあるような、そういうのを思い出しました。

真夜中の京都市郊外。手前のフェンス越しにかすかに見える京都タワー。
フェンスの向こうに見える京都タワー。ここ、どこ・・?

本会当日

長い散歩が効いたのか、そこそこ飲んだわりに二日酔いもほとんどなく、当日朝に会場に着いてからはスタッフとして大活躍していたpapixさん、xtetsujiさん、id:tomcha0079さん、id:anatofuzさん、そしてid:tecklさんたちと次々邂逅。参加者として来ていたid:sironekotoroさんやid:kaz_hiramatsuさんにも会えて、さながらPerl入学式の同窓会のような雰囲気に。うおー、みんな元気だった?会えて普通に嬉しいんですけど、という感じ。

ではここから当日本編。この日に見たトークでとくに印象に残ったのは以下でした。

小さく始め、長く続けるOSS開発と貢献 / Songmuさん

同時間帯のcharsbarさんの「2023年春のPerl」とどちらにするか、ものすごく悩みましたが、これはリアルタイムで聞いておきたいなあと思って。

具体的なプログラミングやコードの話はあまりなく、エピソード主体で汎用的に聞ける話が多かったので、ぼくにもリアリティのある内容として終始興味を引きつけられながら聞きました。とくに、kazuhoさんのツイートを参照しながら、マージされやすくなるためにはある程度事前にプログラマーとしての信頼を獲得している方が有利みたいな話があって、これは刺さるというか、本来の意図とは違うかもしれないですが、ぼくはプログラマーではないのでコミュニティ内で今の実力のままいくら立ち回っても効果が限定的というか、その信頼貯金みたいなものが一定程度以上にはどうしても貯まらないという構造的な壁に直面することが多々あり、それにつながる話だなあなんて思って聞いていました。

今回の機会だけでなく、長期的な参照に耐える内容だったと思います。

あの日ハッカーに憧れた自分が、「ハッカーの呪縛」から解き放たれるまで / あらたまさん

そのSongmuさんが開催前から「これは期待」というようなことをTwitterで言っていて、自分もそれを見て「これは直接聞かねば」と思っていました。果たして、ご本人の長年にわたるさまざまな葛藤や、答えがあるようでないような課題との向き合いの連続が整理されながら語られていて、面白かったです。

個人的に、この話で取り上げられた最も重要な転換点は、「事業」という枠組みを自分が目指すモデルの中に含められるかどうか、みたいなことかなと思って聞きました。それが視野に入ってから今につながる方針が見えてきたというような。

上では「整理されながら」と書きましたが、ある意味では混沌としたテーマという印象もあり、本来ならこの時間やスライド数では到底まとめられないぐらい多岐にわたる、そして形を持たないような話だったと思うのですが、圧倒的な準備とある種の力技でこの時間・内容にまとめられたような感じがあり、パッと見からはちょっと想像できないような密度も感じました。今回の発表のスライドを1枚ずつダブルクリックしたらさらにそれを支える話題がいくらでも出てきそうな内容で、ぼく自身ちょっとイメージが追いついていないようなところもいくつかあるので、その辺あらためて見返しながら整理してみたいと思っています。

何はともあれ、ベストトーク賞おめでとうございました!

余談ですが、Cake.jpって「ケーキジェーピー」って読むんですね。「ケイクドットジェーピー」かと思っていました・・。

あらたまさん自身による当イベントの感想ブログは以下です。
tamamemo.hatenablog.com

ゲストトーク / nekokakさん

ご自身のキャリアを振り返りつつ、どのような考えを持ってどのように行動してきたかといったお話。これはこの次の大西さんのトークと対になっているような感じが非常に強かったです。もちろん、このお話単体でも面白かったんですけど、その後に大西さんの話を聞くことで、両者の話が立体的になるというか、大西さんが用意していた年表にnekokakさんの年表を重ねたら三次元の年表になりそうだな、というような。

nekokakさんはその転機を記事翻訳とかモジュールを書くとか登壇するとかにつなげて行って、大西さんは大西さんでそれに重なるような活動をしつつも会社の広告記事に立候補して登場するとか、その異同が興味深いなと。

自分のことではなく、事業に全部振り込む、自分はいつ切られてもOK的な、ある種「利他的」な姿勢というのは、あらたまさんの発表にあった「事業」とか「組織」とかの軸を自分の目標に含めていくみたいな話とつながる部分もあるなと思いました。

基本的には自分語りのテーマのはずなのに、全然ウェットにならなくてどこか他人の物語を紡いでいるような感じ。というのは上に書いた「優しいけどベタつかない」という印象にそのままつながるんですが、なんだかそういうところも面白かったですね。

キーノート / 大西さん

大西さんといえば、個人的には池澤あやかさんと展開していた以下の記事のような印象が強いんですけど、

www.r-staffing.co.jp

いつも真顔で面白いことを言う人というイメージがあり、それは記事の作り方によるものではなくご本人のキャラクターなんだなと今回確信できました。とにかく数分に一度(というか数十秒に一度)はきっちり笑いを取ってましたね・・。

年表を見ながらいくらでも喋れるという話、わかる気がしました。あとは創業期のむちゃくちゃ狭いオフィス時代、破天荒な工夫のかぎりを尽くしていた話とか、引き込まれながら聞いてるうちに終わってしまいました。40分とは思えなかったです。

ご本人のブログによれば、かなり計算を重ねられた上でのバランスが実現されていたようで、それも興味深かったです。

onishi.hatenablog.com

自虐とは言いますが、自覚が強いんですね。ぼくはそれが苦手なので素直に尊敬します。

そしてnekokakさんのトークにも大西さんのトークにもそれぞれのあり方でキーパーソンとして出てくる宮川さんと直也さん・・このお二人、とくに宮川さんのキーノートへの出現率は半端ないですね。

英語は苦手でも「Better late than never」は死ぬまで覚えていられそうです。

Andrii Nuggedさん from ヘルシンキ

今回のYAPCには今年8月にヘルシンキで開催される「Perl and Koha conference」の主催者であるアンドリィさんが参加されていて、YAPC開催中にこんなツイートをしているのをたまたま見かけ、

企業ブースコーナーの一角にいるのは見ていたんだけど、あんまり人と話しているところを見てなかったので、ちょっと声をかけてみようと思ってランチセッションに向かう途中で「こんにちは〜」という感じで声をかけてみました。(お菓子に釣られたというのもある)

そしたら、気さくにフィンランドのお菓子を勧めてくれて、センキューセンキューといいながらありがたくもらって話し始めたら、そのままずーっと話が続いて気がついたら1時間ぐらい経っていました。途中で、「ああ、もうランチセッション始まるな」とは思ったんですが、聞けばアンドリィさんはフィンランドから北極点を回ってなんと14時間のフライトを経て日本まで来ていて、その人との話を「ちょっとお昼だから」といって途中でやめる気にはあんまりならないというか、それに普段そんなにも遠く離れている人と同じ場所で直接話してて、けっこう通じてるという感覚、というかかなり「通じてる!」感があって、それがすごく貴重だったというか。それで、へえ〜そうなんですねえ、なんて話していたらふと通りかかったcharsbarさんが途中から参加してくれて、じつはちょうどもうこれ以上英語頭に入ってきません!オーバーワークです!となりかけていたので良かったというか、それでむしろ延長的にそのまま心置きなく話をすることができました。英語で話をしているときにcharsbarさんが横にいる安心感と言ったら!

アンドリィさんは今回ヘルシンキから来ていたけど、ご出身はウクライナで、その服綺麗ですね、と言ったら「ウクライナの服なんだよ、ゼレンスキーも着てたやつ」と教えてもらいました。最後に、握手をしながら「来てよ、ヘルシンキ」みたいに言われつつ撮ってもらったのがこの写真。

写真左側に大柄なアンドリィさん。右側に私。アンドリィさんのスマホで高い場所からセルフィーしているので私だけ真上を見ているかのような見上げ。アンドリィさんのブース前にて。背景には窓。
アンドリィさんと私 @YAPC::Kyoto 2023

なんか、ここ数年で撮ってもらった自分の写真で、一番好きな表情かも。(ちょっと眠そうだけど)

アンドリィさんはLT大会にも参加されて、そのスライド資料は以下で読めます。日本語で説明を入れてくれていてありがたい!Perlで書かれたOSSの図書館システムKohaや、8月開催のPerlカンファレンスに関する詳しい説明が読めます。ぜひご一読を!

docs.google.com

そのスライドからも行けるけど、ペライチにまとめられたドキュメントはこちら。

docs.google.com

アンドリィさん、まじでまた会いましょう。お話しできて嬉しかったです。

本会後の飲み会

さて最後のエピソード。もうはるか昔に書いた話、つまりPerl神社でお参りした後にやっさんに再会したということはもう書いたと思うんですが(覚えてますか)、その後にじゃあ飲みに行こうということになったものの、急に決まったのと時間が中途半端だったせいでなかなか店が空いておらず、「うまい酒が飲める店」に超絶詳しいやっさんにずーっとあちこち問い合わせてもらってついに見つかったお店がすごく良くて、2時間ぐらいですか、ラストオーダーまでゆったりまったり、快適な時間を過ごせました。やっさん、本当にありがとう。楽しかったです。

ところで、この打ち上げの席でぼくの隣りに座った初対面の人がすごく落ち着いた調子で話す人で、不思議なバランス感覚のある人だなと思いながら話をしていたんですけど、最後に会計をするときにその人が皆のお金を集めてくれていて、誰かが「じゃあ、ぼんぬさんに払えばいいですか」というのを聞いて、二度見ならぬ二度聞き。・・え?っていう。その方、ぼくがPerl入学式どころかそのさらに10年近く前、たしか2004年とかに初めてJUGEMにブログを開設した頃にネットで知り合った人で、当時の何も知らないままとりあえず新しげなものを見かけたら何でも頭から突っ込んで試していく謎人間に対してすごく丁寧に接してくれた、ある意味人生で初めて会ったIT系の中の人というか、エンジニアさんだったんですよね。言ってみればITエンジニアとのファーストコンタクト。でも、ずっと顔も声も知らないブラウザ越しの関係だったから、2時間隣りに座ってたのに全然気づかなかったという。それでええ〜〜!ってなって、あの、ぼくあのとき助けてもらった亀です的な挨拶をして、なんかそれから今までの約20年の間にやってきたことが全部ブワッて甦ってくるような、伏線全部回収されました的なオチがつきました。

YAPC::Kyoto、最後まで思いがけないことの連続で、飽きることがなかったです。開催を実現するために走り回ってくれた皆さん、ありがとうございました。Perl入門から10年経って、ようやく入り口に立てたかなという実感ですが、実際はまだまだ全然足りなくて、「もう1周走ってこい!」って言われた感じなのでもう1周、今度はRoRで回ってきます。それが終わったらきっと何か別のものになって帰ってきます。それでもまた「もう1周!」と言われるかもしれないけど、それでも・・。

*1:HelpfeelさんのTwitterアカウントをフォローすれば先着10名は無料というすごい企画枠。

*2:すでにそこそこ飲んでいたのでディテールが違ったらすみません。

YAPC::Japan::Online 2022に参加した

何年ぶり? というほど久しぶりにYAPC::Japanに参加しました。2018年の沖縄、2019年の東京に続いて3回目。YAPC::Asiaを含めると2013年から数えて6回目。

yapcjapan.org

今回はコロナ渦での開催ということもあり、オンライン。これが2,000円ぐらいの破格だったので迷う間もなく申し込みましたが、当初分はきっちり完売したようで何よりでした。

ではざっくり、振り返ります!



DAY1 (2022/03/04)

スタートはたしか18:50で、最初の乾杯が19:25ぐらいでしたが、この日は珍しく日中の仕事がかなり立て込んでしまったのでオープニングには間に合わず、乾杯直前にようやくログイン(Discordに)。YouTube Live見ながら乾杯しながら、その数時間前に届いていたperlbrewを飲みました。

今回はノベルティも飲食物も自宅に宅配される仕組みで、最高でしたね・・感染リスク、ほぼゼロ! ライス入りのスパイシーな丸ごとチキンは大変おいしく、何種類もあったオードブルやシチューもいい感じでした。とくにオードブル(というかおしゃれなツマミ)はビールが進みましたね・・今回はラムネとビールを1本ずつにしたので(ラムネ珍しかったので)、「ビール2本でも良かった・・」と思いましたが、まあ自宅なので普通に常備しているものを2本目として飲みました。

ゲスト対談

最初のゲスト対談、前半は見れなかったですが、それでもすごく良かったです。とくに昔語りをするわけでもなく、今この時の話をしているのに、空気だけはなんだかやけに懐かしい(笑)。うずらさんの喋り回し(というのか)はいつも通りで一気に「YAPCに帰ってきた!」(自分が)という感じになりました。

トーク

トーク編では@dankogaiさんの正規表現トークを聞けたのがよかったです。副音声のPerl入学式チームによる解説もあり、とくに@xtetsujiさんは正規表現や数学に大変詳しいので、その辺の相性も良かった気がします。

www.slideshare.net

懇親会・アンカンファレンス

トーク編の後は懇親会。すでに結構飲んで気分良くなってしまっていたので、最初は「懇親会の前につぶれるんじゃないか・・」とやや不安でしたが、実際はあまり飲みすぎることもなく各アトラクションを堪能しました。たぶん、オフラインだったらもっと周りの勢いに乗って飲んでしまっていたかな・・と。

Perl入学式主催のクイズ大会、充実していてよかったです。ぼくが回答するなら1問につき45分ぐらいほしかったと思いますが(笑)。参加者さん出題者さん、おつかれさまでした。

アンカンファレンス部屋もちょいちょい覗いて、ここでも久しぶりのYAPC感。まったり技術の話をしているのを良い距離感で聞けて、しかもオンラインなので資料も音声も明瞭。途中入退出が他の人の邪魔にならないのも良い感じでした。

ぜんぶ見終わり飲み食い終わり、オフラインだとその後に宿まで帰る手間がありますが、それもなく即自宅なのもオンラインの良いところ。沢山の知らない人たちと直接会って喋って得られる鮮烈な体験や、記憶への焼きつき方は薄れますが、それでもオンラインならではの良さを実感しました。

DAY2 (2022/03/05)

通常、連日開催する系のITカンファレンスだと2日目のスタートは午前からで、前日の懇親会で飲みすぎてキツい・・となりがちですが、この2日目は13:30からのスタートで大変助かりました。

しかし前夜、「あんまり飲まずに済んだ」などと思っていましたがじつは結構な二日酔いになっており(笑)、やはりお祭りだけあって普段に比べたらしっかり飲んでいたんだな・・と。オフラインだったらどうなっていたか・・。

トーク

2日目は結果的に、ずっとA会場のトークを聴いていました。といってもがっつりライブを見るという感じではなくて、リアルタイムの発表と裏トーク会場を行き来しながら自宅のタスク(家事とか)をしたりという感じ。オンラインでなければできない所業。

白方さんのコアモジュールの話はPerlっぽくてとてもよかったです。副音声のてつじさん、@shironekoさんによる話も聞きながら、より楽しめました。
argrath.ub32.org

その裏トーク、野球の解説なんかと違って解説も本編もどっちも「喋り」なので、両方同時に聞くというのはなかなか難しいですが、それでもこういった「メインの発表以外の場」が用意されているのは良い感じだと思いました。トーク後に登壇者自身の補足みたいのが聞けるのもいいですね。

続いてアナグラさんの発表、スタートと同時にピザが届いた(アナグラさん宅に)のはウケました。しかしそれを見越して「ピザ受け取り中」のスライド&コードも用意しているのがさらにすごい(笑)。

ちょうど同じ頃にウチにもピザが到着して、ほんとに来た(笑)と驚きました。宅配ピザなんてもう何年も自分では頼んだことがなかったですが、久しぶりに食べたらかなり満足。「特うまプルコギ」というメニューでした。

ちなみに、ピザハットの「ハット」はHatではなくHutだと初めて知りましたね・・(LTスポンサートークでの小ネタ)。何十年もHatだと思っていましたが。さらにちなみに、このピザハットさんのLTも最初は長めの公式CMが流れ出して、もしかしてこれだけで終わり・・? と思ってしまいましたが、その後の発表も良い雰囲気で結構熱心に聞きました。

話を戻して、アナグラさんの発表は自分にはレベルが高くて、雰囲気でやることすらできなそうなので資料を見て勉強したいと思います。
speakerdeck.com

ベストトークを取ったまかまかさんのトーク、よかったです。40分が短く感じました。あのサクサクしたテンポを保ちつつ、Acme大全の制作に関わる部分では叙情的な展開もあり、しかし湿った感じに染まるわけでもなく懐かしさと乾いたユーモアみたいなものが横溢した良い時間だったと思います。
speakerdeck.com

具体的なところだと、初期の一升瓶ラッパ飲みの表紙イラストのモデルがまかまかさんだったという話があって、「へえ〜!」と思ったり。こういう一つひとつのディテールが刺さるというか。
「この頃は年金問題が流行ったので・・その流行りを取り入れて」とかでもその都度ウケました。あと、「マルチ中毒」の元ネタはわかりましたが(昔出した自分の本の版元が「マルチチュード」とかをやっているところだったので)、「Acme::rion」は元ネタを知らず、わからず・・でも、Discordではそこがかなり盛り上がっていたので結局面白かったですね。

この「元ネタを知らないのに面白い」というのがすごくて、ハイコンテキストなのにコンテキストを共有していない人にもちゃんと面白さが届いているのが不思議です。YAPCのLTだと周りの人たちの反応がヴィヴィッドにわかるので、余計にこういう現象が起きるのかもしれないですが、オンラインでも同様にそれが体験できたのでそれもまた不思議な面白さでした。(発表者に反応が届きづらいのはつらいところですが)

あと、元々は批評系の同人サークルに間借りしていたという話も案外Acme大全の本質に触れるところのように思われ、Acme大全には真面目な批評的な観点の記事も欠かせない要素としてあるので、そういう何というかまかまかさんの批評的な物の見方というか、社会に対する論理的な意思表明のあり方みたいなものがAcme大全に表れているのかもしれないなあ、なんてことを思ったりもしました。

キーノート

本編最後のSongmuさんのキーノート。ご自身の経歴とともにこれまでのPerlYAPCとの関わりを振り返りつつ、現在の仕事を踏まえて今後を見据えるような内容でした。とくに、Launchableに関わる川口さんとの話などは新鮮なところが多くて、この発表の核心になっていると思いました。落ち着いた雰囲気で過去と未来を提示する、まさにキーノートという感じでしたね。
junkyard.song.mu

LT

LTはどれも「さすがYAPCのLT!」という感じでよかったですが、個人的には「Perl詩」(Perl Poem)が大変味わい深くてよかったです。
speakerdeck.com

深さと重さ、軽さと広がり、これらが同居してしまうのが文学の面白さで、紹介されたいくつかのPerl詩はたしかにその域に達していましたね。「プールでひと休み」の意外すぎる作者改題も必見。
たぶん、ベストLTはこれが最後まで競ったのでは? と思いましたが、実際のベストLTになったgugodさんの発表も非常に面白かったので、納得。こちらも笑いあり、頓知あり。考えたこともないことを考える時間でした。
github.com

配信のすごさ

見聞きした発表は以上ですが、今回非常に印象的だったのはとにかくオンライン開催ならではの配信で、そのクオリティがすごかったことですね。登壇者はみな遠隔地からそれぞれ参加していたと思いますが、同じ会場で発表しているのかと思うぐらいスムーズで、これは本当にスタッフの皆さんに脱帽でした。発表者が喋っている表情(動画)が画面右上に入ったり、Twitterハッシュタグ付きツイートが下の方に流れてきたり、という仕掛けもすごい仕上がり、かつ安定感。最後のLTなんてオフラインの方がよほどトラブルがあるのでは(笑)と思うぐらいスムーズな進行で驚きました。

配信については以下に関連ブログがありました。ありがとうございました。
godan09.hatenablog.com

アフターショー

終わってからしばらく裏トークAチャンネルPerl入学式を中心とした感想戦をまったり聴いていたら、いろいろ昔のことを思い出したのと、ちょうど話もひと段落したような感じだったので挙手してスピーカーに入れてもらって、あれこれ感想を述べました。この時間、自分にはとても貴重で、なぜならもうこんなふうに界隈の皆さんと直接声を交わせる機会なんて、次はいつ来るかまったくわからないので。

Perl入学式10周年

そこでも話題に出ましたが、考えてみたらPerl入学式って今年で立ち上げから10周年。すごい! ぼくが初参加したのは2年目の2013年で、趣味のプログラミングを本格的に始めたのもその年から。となると、ぼくの趣味プログラミングも来年で10周年! といっても、ぼくの場合は10年続けたというよりは単に「やめないままそろそろ10年経ってしまいそう」というだけですが・・。

Perl入学式やYAPCでは、これがなければまったく接点がなかったような人たちとの出会いがあり、その人たちは当時から今に至るまでずっと楽しそうに(もちろん見えないところでは大変な苦難も多くあるだろうけど)生き続けていて、それを見ていたら自分もやはり同じように精力的に活動したいと思うのが必然で、結果的にカンファレンスにも参加するし、自分用のプログラムを書いてみたりもするし、という。それで気づいたら10年経ってましたね。

YAPCらしさ

あと、裏トークAチャンネルで感想を話しているときに、「オンラインでもやっぱりYAPCだと思った」という話をしたら、「そのYAPCらしさってなんでしょうね」と聞かれ、ん〜、あの最初っからまったりした感じというか、「水曜どうでしょう」を見てるときみたいな、友達の家で深夜まで飲みながらダラダラ結論の出ない話をしているような心地よさもあれば、逆に技術トークを聴いてるときのあのついていけない感じ、知らない話を体全体で浴び続けるその刺激が「自由」とか「未来」への期待を感じさせたりもするっていうところかなあ・・みたいなことを言いました。

後から思うと、それはそれで全部本当なんだけど、もう少し簡潔に言ったらやっぱり「人」というか、月並みかもしれないですが、その会場(オンラインでも)で出会ったり、面識はないけど勝手に知っているその人を見かけたり、あるいはその勝手に知ってる人が別の有名な人と言葉を交わしている、その何でもないような会話をしばらく近くで聞いてみるとか、そういう一人ひとりの「人」や「場所」、そういう魅力がデカいというか、うわ〜こんな人が、こんな考え方が世の中にはあるのか〜・・という驚き、音もなく、目にも見えないけど明らかに感じる不可逆なショックというか、やっぱりそういう場がもたらす何かっていうのが「YAPCらしさ」なのかなあ、という気もします。(ぜんぜん簡潔じゃなかった!)

いや〜それにしても、おかげでまた一気にプログラミングのモチベーションが高まりました。今までもそんなにモチベーションが落ちていたわけではなく、機会があればいろいろ作ってはいましたが(最近は自分用のブックマークレットばっかりですが)、さらにグッと一段階、気持ちが高まった感じです。自由への志向が強まったというか・・やっぱりプログラミングは自由への道。やりたいこと、やれることの選択肢を増やす道。もっと時間を注ぎたい・・。

なんて落ち着いたところで、今回もこのような機会を実現してくれたスタッフの皆さん、登壇者・参加者・スポンサーの皆さん、ありがとうございました。また会いましょう!

command not found: sed というエラー

command not found: というエラー表示は時々見るが、この前ターミナル操作をしていたら、

command not found: sed

というエラーが出てきた。

sedが見つからない? ・・どういうこと?

いやいや、でも普通に sed --h と打ち込んだり man sed などとしてもきちんと表示されるので、sedコマンドがない、などということはなさそう。

しかし同じ操作をすると、やっぱり何度でも安心感を持ってそのエラーが再現される。

・・どういうこと?

具体的に何をしていたのかと言ったら、かつて .bashrc に書いていた、そして今は .zshrc に書いてある、短いシェルスクリプトの関数をターミナルから呼び出して動かしていたのだけど、たしかにというか、そのコードの中の sed の段階になるとエラーで落ちてしまっている状況だった。

それは自分にとってはかなり有用な関数(というかツール)だったので、とりあえずはどんな手を使ってでも動いてほしく、もうその部分だけでもなんとか応急手当できないかと試行錯誤する中で which sed をしたら /usr/bin/sed だというから、その関数の中のsedを全部 /usr/bin/sed に置き換えたらとりあえず動いた。 なんでやねん・・。

と思って、一旦その作業が落ち着いてからTwitterになんでやねん・・という感じのことを書いたら、詳しい方がこのようなことを教えてくれた。

え、ローカル変数・・おおお、たしかに! 思いっきり使っていた、変数名で path

で、とりあえずそれを path2 みたいにすると、あっさり消えた(普通に動いた)。なんという・・

本当にありがとうございましたありがとうございました。助かりました。🙏

で、今回 command not found: sed でいくら検索してもこれにつながる情報が一向に出てこなかったので、とりあえずここに書いておいた。同じハマり方をする人が今後出てこないとも限らないので・・。

それでふと思い出したけど、以前にもほとんど同じようなNG変数名によるハマり方をしていたんだっけ・・。(このときはfi

note103.hateblo.jp

もう5年前!

続・Scrapboxの日記にWebページをブックマークするためのブックマークレット

以下のアップデート版。

note103.hateblo.jp

コードはこんな感じで。

javascript:(function(){var input = window.prompt('Bookmark to Scrapbox','[' + document.title + ' ' + window.location.href + ']');
if (input==null) return;

var dt = new Date();
var dty = dt.getFullYear();
var dtm = dt.getMonth()+1;
var dtd = dt.getDate();
if (dtm < 10) { dtm = '0'+dtm };
if (dtd < 10) { dtd = '0'+dtd };
var today = dty+'-'+dtm+'-'+dtd;

var dh = dt.getHours();
var dm = dt.getMinutes();
var ds = dt.getSeconds();
if (dh < 10) {dh = '0' + dh};
if (dm < 10) {dm = '0' + dm};
if (ds < 10) {ds = '0' + ds};
var time = dh + ':' + dm + ':' + ds;

var data=window.prompt('Date',today);
if (data==null) return;
str = data;
elems = str.split('-');
dateYear = (elems[0]);
dateMonth = ((elems[1])-1);
dateDate = (elems[2]);
dt = new Date(dateYear, dateMonth, dateDate);
dy = dt.getFullYear();
dtm = dt.getMonth()+1;
dtd = dt.getDate();
if (dtm < 10) { dtm = '0'+dtm };
if (dtd < 10) { dtd = '0'+dtd };
var date = dy+'-'+dtm+'-'+dtd;

if (date == today) {time = ' ' + time} else {time = ' [' + today + '] ' + time};

var link = '[' + document.title + ' ' + window.location.href + ']';
var lines = [];
if (input == link) { lines.push(link + time) } else { lines.push(input + time + "\n" + '  ' + link) };
var quote = window.getSelection().toString();
if (quote.trim()) lines = lines.concat(quote.split(/\n/g).map(function(line){ if (line !== '') { return '  > ' + line } }));

var lines_and_quotes = [];
for (var i = 0; i < lines.length; ++i) { if (lines[i] !== undefined) { lines_and_quotes.push(lines[i])}};
var body = encodeURIComponent(lines_and_quotes.join('\n'));

window.open('https://scrapbox.io/***/' + date + '?body= ' + body)})()

最後の「***」にページのIDを入れる感じ。GIF動画は今回はパス。

もう1年ぐらいはずっとこれを使っていたんだけど、ブログで紹介していたのはその前のバージョンだったので、ひとまず現在のものをシェア、ということで。

前バージョンとの違いとしては、前の方だと当日のページに追記することしかできなかったけど、これだと日付を変えられる。その分、日付を確定するためのプロンプトが1つ増えてしまうんだけど、そんなに気にはならない。というかそれで慣れてしまった。

その他の機能については、冒頭リンクから前回の記事をご参照。

毎日使っているので、便利と言える。ブックマークがそのまま日記になるという感じ。プログラミング最高。

最近よく使っている自作ブックマークレット

ブックマークレットをよく作っては使っている。こんなのあったら便利では、と思ったらとりあえず作ってみて、使いながらだんだん出てくるさらなる希望に応じて機能を追加したり変更したり、それを延々とやっている。いつまででもできる。

このブログでは以前から時々そういうブックマークレットを紹介しているが、久しぶりに最近よく使っているものを紹介しておく。

選択した英語を日本語に翻訳

使用例はこんな感じ。

f:id:note103:20210411122513g:plain

コードは以下。

javascript:(function(){var quote = window.getSelection().toString();window.open('https://translate.google.co.jp/?hl=ja&sl=en&tl=ja&text=' + quote + '&op=translate')})()

Google翻訳を使ってるんだけど、翻訳元の文章に応じたURLにアクセスしているのだとふと気づいて、それを使ってみた感じ。

選択した韓国語を日本語に翻訳

使用例。

f:id:note103:20210411025355g:plain

コードは以下。

javascript:(function(){var quote = window.getSelection().toString();window.open('https://papago.naver.com/?sk=ko&tk=ja&hn=0&st=' + quote)})()

原理は同じだけど、Google翻訳の韓日版は今イチに思われることがあり、それでPapagoを使っている。仕組みが同様で助かった。

選択した部分をググる

使用例。

f:id:note103:20210411025506g:plain

コードは以下。

javascript:(function(){var quote = window.getSelection().toString();window.open('https://www.google.com/search?q=' + quote)})()

これも原理は同様。ここでは英単語をググっているけど、直訳ではなく用例を知りたいときとか、あるいは人名とか、もちろん日本語を含めてちょっと知りたいフレーズが出てきたら即ググるボタン、みたいな感じ。

いずれもコード自体は何のひねりもないシンプルなものだけど、ワンクリックで翻訳・検索されてくれるので毎日のように使っている。(とくに英語のやつ)

エンジニアでもなければ30代後半までプログラミングにかすりすらしてこなかった自分が何か思いつくたびにこのようなことをできるようになったのは、ひとえにPerl入学式で丁寧にプログラミングを教えてくれた皆さんのおかげなので、本当に感謝しています。

www.perl-entrance.org