2年ごとにiPhoneとAndroid端末を乗り換えている話

iPhone 15を入手してまたAndroidからiOSに移行しているんですけど、なんでそもそもこんなことやってるんだっけと思えてきたので振り返ってみた。

Distracted Boyfriend Meme Generator - Imgflip

なんでやってるか

Androidアプリ開発のため

「我が社もAndroid版アプリを開発するためにエンジニア採用をしなくては」というタイミングでプロジェクトの関係者が全員iPhoneだったので、とりあえずAndroidに興味を持つところからはじめないとな〜 と思いなんとなくスイッチした。

これによってAndroidアプリエンジニアと面談の場である程度会話することができるようになった。

プラットフォームの違いを知るため

僕はクロスプラットームなGUIプログラミングに関心があるので、色々なプラットフォームを使ってみて比較したい。

例えばSwiftUIJetpack ComposeFlutterの開発者体験を比較したり、React NativeでHermesっていうJavaScriptエンジンが両OSに組込まれるところを眺めたり、Tauri MobileのWebView経由でNext.jsを動かしてみたりしている。

zenn.dev

趣味(Just for Fun)

端末のセットアップとかは多くの人が面倒だと思っている部分だと思うけど僕にとっては単に娯楽なのであまり疑問に思わなかった。

良かったところ

環境の見直し

環境構築を繰替えすことで一定のタイミングで現時点でのベストな方法を模索することができる。

惰性で使っていたツールがもうしばらく更新されていなかったり、より良い代替手段があったりする。

Androidアプリ開発

自分が日常的に使っている環境なので不便を感じた時に簡単なツールを自作して自分の端末で動かすことができる。

これによってAndroidアプリ開発ができるようになった。

Android環境

「Kindleがアプリ内で買える」ところがチャームポイントだったが近年の規制で外に飛ばさないといけなくなってしまった。

Google Play Booksで買った本やGihyo Digital PublishingO'Reilly Ebook StoreのePubをアップロードすると自動で読み上げてくれるので愛用してる。今は買えなくなっちゃったけど*1

laiso.hatenablog.com

iOSだと読み上げコントローラでKindleページ送りして読んでたので同等のことはできるかも。

support.apple.com

不便なところ

iOS版しかないアプリ

日本やアメリカのアーリーアダプタ向けのサービスはiOS版が先行しがちなのでAndroidしかないとお預け状態になる。

Apple系のサービスが使えない

この先Androidに移行する未来が決まっているので「Appleにすべてを委ねて楽になる」みたいなコンセプトのサービスが使えない。

逆に「Googleにすべてを委ねて楽になる」サービスはiOSでも使えることが多いのでAndroidファーストになってきてしまう。

Galaxy Watch使えてない

Galaxy Watch5を持っているんだけど、ネットワークはセルラー越しに行うモデルなのでiPhone側にコンパニオンアプリを入れてbluetoothでペアリングして中継してもらう必要がある。

laiso.hatenablog.com

でもいざiOS 17に移行しようとするとiOSアプリ:Samsung Galaxy Watchのプロセスが完了しない。

もう1年半以上更新されてないし最新のiOSやWear OSに対応してないんじゃ疑惑がある。

このためGalaxy Watch5が「現在時刻を見る」ぐらいのタスクしかこなせなくなってしまった。時計じゃん(時計だが)

現在はGalaxy Watchからクラウドへの同期を機能させるためだけにサブのAndroid端末が控えてる。

似た問題としてAirPods Proの接続をiPhoneに切り換えたらiOSでしか動作しないいろんな機能があったことに気付いた(会話するとボリューム抑えるのとか)。

自作したツールが移行できなくなる

自分の端末に入れて動かしてるツールがあってクロスプラットフォームなフレームワークで作ったやつはまだなんとかなるんですけどOSのAPI直接呼び出した方が速いようなケースではネイティブアプリで作ってる。

これを移行できないので再実装するか捨てるかを都度選択することになる。

Android端末の選択肢

iPhoneはその時に発売されたものを買えばいいとしてAndroidはどのメーカーのにするか、というのを最初に決めないといけない。

基本方針として「iPhoneと同価格帯」「まだ使ったことのないメーカー」の組合せて選んでる。

端末遍歴

Icon: https://iconduck.com/icons/

まとめ

2年ごとにiPhoneとAndroid端末を乗り換えると便利—— なのか????

そもそも「2年ごとに買い替えて浪費するな」という意見もあると思うけど、自分のまわりでは毎年新型iPhoneに乗り換えて運用するApple著しく好き属性(ていねいな呼び方)な人が結構な割合でいるので2年だと比較的倹約家だな〜 と自負していて認知が歪んでいる。

*1:オライリー本が買えない話その後https://laiso.hatenablog.com/entry/2023/07/28/171613

TypeScript Origins: The Documentaryを観た

TypeScript Origins: The DocumentaryはTypeScriptの誕生に関わった関係者たちへのインタビューで構成されたドキュメンタリー動画。

www.youtube.com

製作元はOfferZenというアムステルダムの求人プラットームの会社で、以前にはSvelte OriginsLaravel Originsも公開している。

本作ではReact.js: The Documentaryの次世代フロントエンドフレームワーク開発競争と時期を同じくして起っていたAltJS戦争の中でどうTypeScriptが現在の地位を獲得していったのかに迫る。

laiso.hatenablog.com

私はTypeScriptについては片手間業務プログラマーという感じで全然詳しくないんですけど、TypeScript Originsのゆりかご からRemove TypeScriptの墓場まで(!)何かと当ブログでは縁がありますね。

laiso.hatenablog.com

あらすじ

動画はSteve Lucco、Luke Hoban(現PulumiCTO)へのインタビューからはじまる。ふたりはChakra Javascriptエンジンの開発者で*1、当時コードネームStradaと呼ばれていたTypeScriptプロジェクトはマイクロソフトの戦略的にはブラウザエンジン高速化→OfficeやVisual Studioなどの自社製品のブラウザアプリケーション化→より大規模で複雑なソースコードを管理できるようにする、という流れをくんで始まったものだという事実が明かされる。

この時点でなんか天才言語設計者のAnders HejlsbergがグッとガッツポーズしたらJavaScriptが改善したんでしょ、ぐらいの浅い理解だった自分には興味深かった。

Anders Hejlsbergが出てくるのはプロジェクトの方向性が言語設計の具体的になった次のフェーズで、先ずはC#など別の言語からトランスパイルするのか(CoffeeScript, Haxe, Script#, GWT)、別の言語とエンジンごと置き換えるのか(Dart)、様々な方法がある中で互換性を維持しつつJavaScriptそのものを改善するというアイデアを進めることにしたようだ(動画ではFlowの話も出てくr)。

舞台はこの後、Java界で著名なErich Gammaが出てきてVS Codeの初期開発を語ったり、当時OSS文化のなかったマイクロソフト内でAmanda Silverらがどう立ち回ってデベロッパーリレーションを確立したのか、GoogleのAngular開発者との連携、TC39との次期JavaScript仕様の標準化、などの話に入る(続きは本編をご覧ください)

(ハリウッド映画のようにカットインするAnders Hejlsberg)

感想

途中Anders HejlsbergがV8 JavaScriptエンジン開発者Lars Bak*2と「JavaScriptを直すべきか置き換えるべきか」という議論をしたという話が出てくる。

Larsは置き換えるという考えでDartVMをブラウザに乗せるべき開発を推進したが、結果は皆さんもご存じのとうり。

ただしDartはFlutterの中核として華麗にクロスプラットフォーム構築言語としてリバイバルしたので*3Dart側から見たドキュメンタリーもあったら面白そうだなぁと感じた。

それにしても2010年代はスマホブームに注目していて気付かなかったけど巨大資本主導によるOSSプロジェクトがどんどん躍進していったのですね—— と昨今のドキュメンタリー動画たちを観ていて思った。

*1:The Inner Workings of the Chakra Javascript Engine • Steve Lucco • GOTO 2012: https://www.youtube.com/watch?v=ouSoyWj_lSI

*2:Want to be a Better Programmer? • Lars Bak & Kasper Lund https://www.youtube.com/watch?v=P8ltWIqDPzo

*3:一度は挫折したDart言語が最近モバイル開発で右肩上がりに https://news.mynavi.jp/techplus/article/programinglanguageoftheworld-33/

Remove TypeScript

経緯

world.hey.com

DHHが「オタクくん見てる〜? 今からうちのレポジトリからTypeScriptを剥しま〜す」と宣言したことにより、Web開発者界隈でTypeScriptの是非自体の話になり騒ぎになった*1*2

github.com

その後、野次馬がたくさん集ってきてrevertプルリクエストを立てる人やTypeScript公式リポジトリから全ソースコードを消すプルリクエストを出す*3ようなキッズムーブをする人も出てきた

world.hey.com

実際の変更

8617行のTypeScriptがJavaScript化された。(Sloc 便利)

❯ scc src/               
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
TypeScript                  81     10934     2048       269     8617        986
HTML                        65      1891      138         2     1751          0
JavaScript                   3       170       17        23      130         29
CSS                          2         6        0         0        6          0
SVG                          1         1        0         0        1          0
TypeScript Typings           1        13        2         1       10          1
───────────────────────────────────────────────────────────────────────────────
Total                      153     13015     2205       295    10515       1016
❯ scc src/
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
JavaScript                  81     10434     1983       272     8179        752
HTML                        65      1891      138         2     1751          0
CSS                          2         6        0         0        6          0
SVG                          1         1        0         0        1          0
───────────────────────────────────────────────────────────────────────────────
Total                      149     12332     2121       274     9937        752

典型的な変更は型注釈の削除。これを全ファイルに渡って行っている。

-  respondsToEventTarget(target: EventTarget | null) {
+  respondsToEventTarget(target) {
     const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null
     return element && element.closest("turbo-frame, html") == this.element
   }

Turboとは何か

TurboはRailsのviewでSPAを書くための仕組みです。https://turbo.build/とは別。

laiso.hatenablog.com

厳密には「サーバーサイドHTMLテンプレートベースでSPAを書くための仕組み」でRails以外にも適用できるのでGitHubのorgが独立して開発されている。

github.com

背景

「静的型付け言語と動的型付け言語はどちらが良いのか」という議論は今までにも各所で行なわれてきた。TypeScriptは静的型付け言語でJavaScriptやRubyは動的型付け言語に分類される。

typescriptbook.jp

DHHは(Ruby on Railsの作者だから当然)動的型付け言語の信仰者で、TypeScriptを好んでなくて利点を認めつつもあまり熱心ではないと普段から公言していた。

Rails誕生からの十数年を経て近年は型推論で静的型付けの記述量が軽減されたり、IDEや言語サーバーが賢くなったり、世間のプロジェクトが大規模複雑化してきたりしてもその部分はブレていないようだ。

world.hey.com

なのでTurboのレポジトリがTypeScriptだったのも「ライブラリはTypeScriptにするメリットがあるんだろうな」ぐらいに自分は感じていた。

実際、37signalsが作成するRailsアプリケーションのサンプルコードはいつもデフォルトJavaScriptで、彼等のプロダクトのコードもそうなんだろうと思う。

彼にとってTypeScriptが本来なくても充分に機能する複雑な抽象レイヤーという認識だったのかもしれませんね。

laiso.hatenablog.com

あと直接TypeScript書いてたコミッタの人は2021年のCEOブチ切れ事件の時にやめてる

techcrunch.com

誰に影響があるのか

Turboのコントリビューター

RailsのviewでSPAを書いていてTurbo本体にコントリビュートしたい時にJavaScriptコードで変更をしないといけなくなる人。

一方、RailsのviewでSPAを書いているアプリケーション開発l=Turboユーザー当事者はviewテンプレートと向きあったりwebpackやesbuildを通じたアセット管理をしているだけで、Turboのインターフェイスをコードから直接呼び出すようなことはない。

なのでTurboの中身がJavaScriptになったことでアプリケーション側ではひき続きTypeScriptで書くことができる(と言ってもTurboを使っている時に主に書くのはHTMLとRubyだが)

guides.rubyonrails.org

そもそもRailsのviewを使う機会が近年のチーム開発では減ってきていてそれを指して「Railsはオワコン」とか言われていたりする。

laiso.hatenablog.com

Rails以外でTurboを使えるようにしたい人

Turboを別のフレームワークに提供するためにプラグインを書いて、その時に@hotwired/turboの型定義を参考にする人。

自分の知っている中ではLaravel版があるけど彼等もJavaScriptで書いてる。

github.com

Railsエコシステム周りでTypeScriptやっていきたい人

37signals系のライブラリがTypeScriptを剥すのは既定路線で今から覆らなさそうなので、StimulusなどのRailsでかつフロント関係あるやつが全部JS化されて生きづらくなりそう。

ニューWindowsマシンのセットアップした

10年ぶりぐらいにWindowsメイン機を構築したら色々変わっていた。その過程で情報収集しながら記録した内容をポストします。

マシンの目的

  • Windowsしか対応していないビデオゲームをプレイする
  • GPU使ったタスク。機械学習モデルの推論やファインチューニング。画像・テキスト生成AIの実行
  • Windowsデスクトップアプリケーションの開発
  • VRデバイスや3Dゲームエンジンを使った開発
  • WindowsにしかSDKがないデバイス組込ソフトウェア系の開発

やらなかったこと

日本語環境の構築

半分ぐらいサーバー機っぽいのでIMEいらんやろと思ってパスした。

WindowsはサーバーエディションじゃなくてWindows 11 Proを買った。

古いWindowsっぽく振る舞う設定系

老いに逆らってゆきたいので、基本的に差し出された最新のWindows 11環境をなるべく使うようにした。

仮想マシン内にLinux環境を作る系

LinuxベースWeb開発環境っぽいものを構築するのをやめた。デバイスやGPUを直で使いたいので仮想環境じゃない方が都合もよく、既に所持しているmacOS環境でWeb系の作業も足りているので。

.NET系のWeb環境は別で何か入れるかもしれない。

Remote Desktop

手持ちMacBookからログインして作業したいのでRemote Desktopを先に設定した。

Microsoft Remote Desktop

Microsoft Remote Desktop

  • Microsoft Corporation
  • Business
  • Free
apps.apple.com

support.microsoft.com

sshd

GUIなしでシェルでガチャガチャ作業するだけならRDP経由じゃなくてSSHでいいので以下を参考にMacからログインできるようにした。

learn.microsoft.com

以下まで実行するとログインがPowerShellになる。

learn.microsoft.com

winget

aptやbrewみたいなパッケージマネージャコマンド。ツール類をまとめて管理するために利用。

learn.microsoft.com

Git

GitHubからツールをダウンロードしてくる時などに使われがち。

公式ページにあるwingetコマンドでインストールした。

git-scm.com

Python

どうなんだろう……と思いながらMicrosoft Storeから入れた。

Stable Diffusion系の記事で3.10系にしとけみたいな記述が多かったので様子見で3.10にした。

apps.microsoft.com

Stable Diffusion web UI

ここまでセットアップした環境ですんなり起動できて、画像生成もできた。

github.com

7860ポートを開放して webui.bat --listenで起動するとネットワークの他のマシンからアクセスできる。

New-NetFirewallRule -Name 'stable-diffusion-webui' -DisplayName 'stable-diffusion-webui' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 7860

Visual Studio 2022

Windows系のアプリケーション開発に使うIDEとSDK類。

visualstudio.microsoft.com

Communityエディションでいいらしい。

Win10以降のことよく知らなかったが最新のデスクトップ向けプラットフォームはUWPというやつらしい。

learn.microsoft.com

MAUIっていうのが元Xamarinで、モバイルアプリ作るのはこれらしい。

learn.microsoft.com

PowerToys

Caps lockとcontrolどうやってスワップするんだと調べていた時に見付けた今風のやつ。

learn.microsoft.com

JoyToKey

Java版のマイクラをパッドでやる用に入れた。

joytokey.net

未だJoyToKeyが定番らしい。メンテナンスし続けてくれてありがとうございます。

Power Automate

MacでいうAutomatorっぽいやつらしい。

powerautomate.microsoft.com

マシン間のファイル送受信

Remote Desktopの接続先に接続元のディレクトリを指定できるのでファイルの受け渡しができる。

support.microsoft.com

自動ログオンとキオスク端末化

キオスク端末として普段はゲーム用に自動ログインしておき、管理者はRemoteログインするという運用をしたかったので以下を設定した。

learn.microsoft.com

Steam設定でBig Picture modeをデフォルトにしておきシステムの起動時に自動で立ち上げるようにしておくと、Xboxのコントローラーのみで操作可能な疑似キオスク端末風にできる。

help.steampowered.com

PaLM APIのファインチューニングではてな匿名ダイアリー風文章生成モデルを作る

PaLMとは

PaLMはGoogleの大規模言語モデルです。先日、日本語に対応しました。

www.itmedia.co.jp

PaLM APIのファインチューニング

PaLM APIの基本的な利用方については以下の記事が参考になります。

zenn.dev

6月頃に「PaLMって英語の受け答えにしか対応していないけど日本語でファインチューニングしたらどうなるんだろう*1」と思って実行してみたんですけど、当然のごとくエラーが出て失敗しました。

今回日本語に対応したので、再度挑戦してみました。

はてな匿名ダイアリー風文章生成モデルとは

題材として、以前以下の記事でみかけたコンセプトである「はてな匿名ダイアリー風文章生成モデル」の自作を選びました。

Anond AIは、rinna/japanese-gpt2-mediumをはてな匿名ダイアリーのデータを用いてファインチューニングし、ドメイン適応させたものです。

developer.hatenastaff.com

Quotaの申請

以下のドキュメントに沿ってすすめます。

cloud.google.com

ファインチューニングの実行はeurope-west4かus-central1でないと実行できないようになっているので、そのlocationでQuotaの申請を行います。

6月時点ではeurope-west4しか対応してなかったので、europe-west4 + restricted_image_training_tpu_v3_pod=64を申請しました。

For europe-west4, submit a request for Restricted image training TPU V3 pod cores per region in the europe-west4 region in multiples of 64.

受理までしばらく時間がかかりました(数日)。以下URLから割り当て状況を確認可能です。

https://console.cloud.google.com/iam-admin/quotas/qirs

データセットの作成

ドキュメントに従いjsonlファイルを作ります。300件ほどサンプルがあればよいかと思い、以下のような形式のデータを作成しました。

  • input_text: 投稿のタイトル
  • output_text: 投稿の本文冒頭
❯ tail dataset.jsonl
{"input_text": "表現規制派の言ってる事って「マイナスイオン」とか「水からの伝言」と何が違うの?", "output_text": "強力効果論とか限定効果論とかあるけどさ、あれってどの位証明されてどの位信用が
  けるものなの? そういう影響論を真に受けて表現規制とか公共の場に出すなとか言っているけど それが嘘だった場合(つまり、影響なんて無いか、無視できる程度だったり、他の表現や社会的に許容されて
  他の一般的行動とか慣習と同程度の影響しかなかった場合)、どうするの? 現状、その可能性は全然有る様に見えるんだけど 全然効果が無い事の為に、仕事を失ったり罵倒されり悪として扱われる人達の理
  尽な境遇を考えないなら、リベラルの名を語る資格無くね? あなた達は人を不幸にする為にリベラルとか表現規制派とかをやっているの? 違うと言うなら、何で真面目に考えようとしないの? 表現規制派の
  ってる事って「マイナスイオン」とか「水からの伝言」と何が違うの? 追記 冒頭に挙げた例が却って一例に拘泥して論点を見失う原因になるようなので、消しまし"}
{"input_text": "甲子園球児の笑顔が辛い", "output_text": "しんどい場面で笑ってるのがキツイ。本当は「くそがああああ!!!!」とブチギレたいだろうに。グローブでもベンチに投げつけたいし、バット
  し折りたいだろう。緊張極まってプルプル真っ青な顔でいたいだろうに。テレビもあるし、一生残るし常に「どんな状況でも甲子園楽しんでます!」を演出しなきゃいけないのしんどすぎるだろ。小さい頃に
  ちゃイジメられてたのにヘラヘラ笑うしか無かった自分を思い出して見てられん。はーしんど。"}
{"input_text": "お金がなくなっていくって怖いよね", "output_text": "元々貧乏な生活してささやかな貯金をするのが趣味だった。 今配偶者がなおるあてのない長く療養が必要な重い病気になって貯金を切
  崩す生活をしてて、使える制度をフルに使っても100万円しかない貯金が毎月10万円ずつ減ってるの見てるけど、配偶者が重い病気で怖いとか悲しいより、このお金が無くなるという方が正直ストレスに感じて
  。 薄情なやつだな、と思うけど、そんなことを悟られないようにして最期まで面倒みるから、許して欲しい。 実家、新築の家を昔ローンで買ってたけど、今年55歳の父親が1500万の残債がどうにもならなく
  売りに出すって。でも、私あの家にそんな価値ないって知ってる。猫が柱をがちゃがちゃにして、あらゆるところの掃除をマメにしていたわけでないから汚れが酷くて立地が酷い。だからきっとそんな値段で
  売れない。父親と母親は熟年離婚した。母親も貧乏な生活してる。父親も母親も高卒で、両親はわたしを含め"}

これによって未知のタイトルを入力したら、はてな匿名ダイアリーの投稿の書き出しを生成してくれるのを期待します。

できたらjsonlファイルをGCSにアップロードしておきます。

トレーニングJobの実行

tuning.pyを参考に実装します。

model = TextGenerationModel.from_pretrained("text-bison@001")

model.tune_model(
    training_data=training_data,
    model_display_name='text-anond',
    train_steps=12,
    tuning_job_location="europe-west4",
    tuned_model_location=location,
)

training_dataはGCSにアップロードしたデータセットのパスを指定します。例: gs://bucket-name/path/to/dataset.csv

train_stepsはファインチューニングのステップ数を指定します。データセットのサンプル数とジョブ実行locationで調整します。

If there are 240 examples in a training dataset, in europe-west4, it takes 240 / 24 = 10 steps to process the entire dataset once. In us-central1, it takes 240 / 8 = 30 steps to process the entire dataset once. The default value is 300.

tuned_model_locationはモデルが配置される場所です。トレーニングとは別のlocationが指定できます。

このスクリプトを実行するとVertex AIのパイプライン上で実行中となり状況やエラーなどを確認できます。

https://console.cloud.google.com/vertex-ai/pipelines/runs

第1回目のチューニングを実行した直後「差別的な内容など・データセットに問題あり」警告が100件程出てきて完全に題材見誤ったわーと後悔したのですが、なんとかなりました。

チューニング済みモデルで文章生成する

無事チューニングジョブが完了したら、以下のモデル一覧にチューニング済みモデルが表示されます。

https://console.cloud.google.com/vertex-ai/models

「デプロイ」→「モデルのテスト」→「Generative AI Studio」と進むとブラウザ上で応答を確認できます。

Prompt入力欄に匿名ダイアリーにありそうなタイトルを入力してみて、生成された文章を確認します。創作性を発揮してもらいたいのでモデルのtemplateは1にしておきます。

ここで残念なお知らせですが、GoogleのGenerative AI Preview Products利用規約に従い生成された文章は第三者に公開できません(なので本稿も公開情報だけに触れています)。

なので私の感想を書くだけにとどめますが——そういえばはてな匿名ダイアリーを普段読まないので正直よく分からん。

ソースコードからこのモデルを呼び出す時のコードはideation.py が参考になります。

今回のテストだとこんな感じになります。

model = TextGenerationModel.from_pretrained("text-bison@001")
model = model.get_tuned_model(f"projects/{project_id}/locations/{location}/models/{tuned_model_id}")
response = model.predict(
    """タモリさんの本名は?""",
    **parameters
)
print(f"Response from Model: {response.text}")

おまけ: gpt-3-5-turboでも同じファインチューニングしてみた

openai.com

データセットは微修正すればいけるので追加で試した。

model = "ft:gpt-3.5-turbo-0613:personal::XXXXXXX"

completion = openai.ChatCompletion.create(
    model=model,
    messages=[
        {"role": "user", "content": "まじな話をすると、N予備校のプログラミング入門コースやるのがオススメ"}
    ],
    max_tokens=255,
)

print(completion.choices[0].message['content'])
❯ python tuning_openai.py
個人的な意見で、エンジニアになりたい人、プログラミングを自己流ではなくちゃんと根底から学びたい人には超オススメというか、やらない理由を教えてくれ。1.人に教える道具としてプログラミングが使え
るようになる。言語が単なる道具になる。
2.NO②を使って試してみる、NO①で作った物からいじり方を考える
3.解説あっての練習_system.out.println()の設定 ・javaの入出力の勉強
4 プログラムのバグは悪くない、そのバグは必ず意味がある、じゃないと書けない。高校の見方しか出来ない。
5 数字コード「文字コード」を理解する
6

見比べるとこっちのがはてな匿名ダイアリーっぽい(諸説ある)。

チューニングなし

我が家のインドカレー

インドカレーは、我が家の定番料理です。母はインドの友人から学んだ本格的なレシピで作るので、香り高いスパイスと豊かな味わいが特徴です。

チューニングあり

我が家のインドカレー

インド料理を美味しく頂くのはもちろんだが、カレールウを自作することが我々日本人にとってもっとも適した消費の仕方であり、肝要である。原因は3つ考えられる。

ジョブの実行部分

import openai

resp = openai.File.create(
  file=open("dataset.jsonl", "rb"),
  purpose='fine-tune'
)

print(resp)

job = openai.FineTuningJob.create(training_file=resp.id, model="gpt-3.5-turbo")

print(job)

[アクションが必要]AWS Lambda Go 1.x ランタイム終了を時系列理解

Go 1.x ランタイムでデプロイしたLambdaがあるとこういうメールが来る。

Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するのに合わせて、AWS Lambda での Go 1.x ランタイムのサポートを終了します [1]。

Lambda は、provided.al2 ランタイムを使用して Go プログラミング言語を引き続きサポートします。

provided.al2 ランタイムを使用すると、AWS Graviton2 プロセッサのサポートや、より小さなデプロイパッケージとより高速な関数呼び出しパスによる効率的な実装など、go1.x ランタイムに比べていくつかの利点があります。

詳細については、ブログ記事 [2] を参照してください。

Q:「Go対応のプライオリティが下げられたのか」

ちょっとニュアンスが違う。

Lambdaランタイム 一覧にあるとうりLambdaはarm64やAmazon Linux 2サポートが進行していて、Javaや.NET、スクリプト言語などのシステム依存の割合が比較的大きい環境のが優先されている。

Goはカスタムランタイム以前にサポートされたので専用ランタイムが存在しているが、たとえばシステム依存の少ないワンバイナリを作れるRustなども専用ランタイムはない*1

なのでより正確な文脈としてはFaaSやサーバーレスサービス全般の(Dockerに限らない)コンテナネイティブなアーキテクチャへの移行という意味になると思う。

現在はウェブアプリケーション向けのソースコードからAmazon Linuxベースのイメージを生成するApp Runnerの基盤もあるし、GoogleのCloud Functions も2nd genになってCloud Runが基盤になっている。

firebase.google.com

時系列

2017年末にAmazon Linux 2 LTS Candidateが公開。

aws.amazon.com

2018年1月にAWS LambdaのGoサポートが追加。

aws.amazon.com

2018年11月にAmazon Linux 2を使ったカスタムランタイムが公開。

aws.amazon.com

2020年1月にAmazon Linux AMI(2じゃないやつ)のサポート期間が2020年6月30日から2023年6月30日まで延長。

dev.classmethod.jp

2020年1月のBuilding enterprise applications using Amazon DynamoDB, AWS Lambda, and Go | AWS Database Blogが書かれた時点ではサンプルコードにGo 1.x ランタイムが指定されている*2

2020年6月のコミットでカスタムランタイムを指定してaws-lambda-goで書いた関数をデプロイ可能になった。

https://github.com/aws/aws-lambda-go/pull/298

2020年9月の公式ドキュメントGo の AWS Lambda デプロイパッケージ - AWS LambdaではGo 1.x ランタイムが指定されている。

2022年4月頃のドキュメント.zip ファイルアーカイブを使用して Go Lambda 関数をデプロイする - AWS Lambdaの最後にprovided.al2 ランタイムのオプションが登場。


これ以降英語ドキュメントの方の経過を見ていった方がいいのではと思ったので切り換え。

2023年1月のBuilding Lambda functions with Go - AWS LambdaではまだGo 1.x ランタイムのみが記述。

2023年6月 Building Lambda functions with Go - AWS Lambda になかった

Go is implemented differently than other managed runtimes. Because Go compiles to native code, Lambda treats Go as a custom runtime. We recommend that you use the provided.al2 runtime to deploy Go functions to Lambda.

2023年8月には追加されている。

まとめ

  • Go 1.x ランタイムはAmazon Linux AMIと共にしばらく延命されていたが最近までドキュメントから流入は起きていた
  • アクションが必要

aws.amazon.com