2024年6月から2024年10月までに登場したWeb技術のつまみ食い (MyWebちぇんじろぐ2024part2)
ブラウザ (Chrome)
サードパーティークッキーについて
2020年1月14日に、Googleによりサードパーティークッキーの段階的な廃止が発表されました[1]。
サードパーティークッキーは、ユーザーが現在閲覧しているサイト (ファーストパーティー) とは異なるドメインによって設定されるデータです。iframe内の認証情報を維持したり、広告配信の最適化、クロスサイトトラッキングなどで利用されています。
馴染みないかもしれないですが、認証が必要なサービスをiframeで埋め込んで利用する際に、サードパーティークッキーが必要になるケースがあります (例えば、Amazon Connectなど)。
こちらのサードパーティークッキーについては、SafariとFirefoxではデフォルトでブロック。ChromeとMicrosoft Edgeは検討中という段階でした[2]。
この度、2024年7月22日にChromeから発表があり、Chromeについてはサードパーティークッキーを引き続き利用できることになりました[3]。
サードパーティークッキー廃止に伴い新しく導入されたPrivacy Sandbox APIについては引き続き、開発を進めていくとのことです。また、ユーザー起点でサードパーティークッキーをブロックするかどうかを選択できる機能を追加する予定とのことです。
コメント
Chromeの発表により、サードパーティークッキー対応が緊急ではなくなりました。特に、利用できるブラウザを指定している場合はしばらく優先順位を下げられそうです。
ただし、日本では利用者の多いSafariはサードパーティークッキーをブロックしてますし、EdgeもChroniumベースとはいえ、どうなるか分かりません。また、ユーザー自身がサードパーティークッキーを許可しない設定も可能なので、Privacy Sandbox APIの開発状況も見つつ、移行していく必要があります。
デスクトップ版 Googlebot廃止
2024年7月5日以降、Gogle検索のインデックス登録で、モバイル版Googlebotでクロールされるようになりました[4]。そのため、モバイル端末で閲覧できないウェブサイトはインデックス登録されなくなります (Google検索時に表示されなくなります)。
Google検索はモバイルファーストを掲げており、そのための施策となります。今後はモバイルに最適化されたウェブサイトの構築が、SEOにもより大事になってきます。
Throttling機能
Performanceパネルが改善され、CPUのThrottlingを20倍低速にできるようになりました[5]。開発環境のPCは基本的にエンドユーザーよりスペックが高いため、この機能により、より現実に即したデバッグが可能になります。
検証ツールでCore Web Vitalsの確認が可能に
検証ツールのPerformanceタグを開くことで、そのページのCore Web Vitalsを確認できるようになりました[6]。どの要素で問題が発生しているかも取得できるため、画面のカクツキや意図しないレイアウトシフトの検知に役立ちます。
また、Core Web Vitalsの値は検索順位にも影響を与えるため、toCサービスでは改善が必要な指標となっています。
こちらのCore Web Vitalsはローカルでの値だけでなく、そのURLにアクセスした実際のユーザーの値も確認できます。
現在のChromeはNetworkだけでなく、CPUのスロットリングも可能なため、ローカルの値が実際のデータに近づくようにスロットリングし、どのような問題が発生しうるかの確認もできます。
Console Insights
Console Insightsとはコンソール上に表示されたエラーをAI (Gemini) を使ってデバッグするための機能です[7]。
個人的には、console上のエラーを見て何かをするといったことが一切ないため、あまり便利さは分かりません。Rollbarなどでエラーを検知し、エラーメッセージやスタックトレースで該当箇所のあたりをつけて、エラーになりそうな条件を考える方が個人的に良いと思ってます。
Firefox 生成AIを統合
ChatGPTなどの使い方として、記事の要約や日本語への翻訳をする機会が多いと思います。この度、Firefoxで右クリックで要約や読み替えができる機能が追加されました。Chromeにも欲しいですね。ただ、現状はカスタマイズ性が低く使い勝手が良くないです。
HTML/CSS/JavaScript/TypeScript
Document Pincture-in-Pincture APIの強化
こちらは実験段階のAPIで、ChromeとEdgeでしか利用できません。Picture In Pictureとは、HTML要素の一部を別ウィンドウで最前面に表示する仕組みです。
例えば、以下のようなコードで画像のように、要素を切り出して表示させることができます[8]。こちらのAPIを使うことで、既存の新規ウィンドウを開くだけでは難しかった「ウィンドウ間の状態管理」や「他のアプリが重なっても最前面に表示する」といったことが組み込みで可能となります。
<button id="start-button">Start Picture In Picture</button>
<div id="picture-in-picture">
ここの要素がPicture In Pictureとして、切り出されて表示される
</div>
<script>
const startButton = document.querySelector("#start-button");
startButton.addEventListener("click", async () => {
// picture-in-pictureウィンドウを取得
const pictureInPictureWindow =
await documentPictureInPicture.requestWindow();
// picture-in-pictureとして表示したい要素を追加
const pictureInPicture = document.querySelector("#picture-in-picture");
pictureInPictureWindow.document.body.append(pictureInPicture);
});
</script>
Chromeだけでなく、VSCodeなど他のアプリよりも最前面に表示されます。ただし、システムの設定で最前面に表示してるものがある場合は、それより下に表示されます。
TypeScript
型のNarrowingが強化
TypeScript 5.5より前のバージョンでは、以下のコードで型エラーが発生していました。コード的にはfood.isFruitでフィルタリングできてますが、型的にはブロッコリーにsugarContentが定義されていないため、型エラーとなります。
TypeScript 5.5からはこちらの型のNarrowingが効くようになり、型エラーも回避できるようになりました。
const foods = [
{ name: 'りんご', isFruit: true, isVegetable: false, sugarContent: 13 },
{ name: 'ブロッコリー', isFruit: false, isVegetable: true },
{ name: 'バナナ', isFruit: true, isVegetable: false, sugarContent: 21 },
] as const
const fruits = foods.filter((food) => food.isFruit)
fruits.forEach(fruit => {
console.log(`${fruit.name} の糖度は ${fruit.sugarContent}`)
})
正規表現のチェック性能がアップデート
また、TypeScript5.5から正規表現のチェック性能が向上しました。正規表現の書き方が間違っているときにエラーを出したり、トランスパイル先で対応してない正規表現を記述したときにエラーが出るようになりました。
無効なNullチェック、true/falseチェックのエラー
TypeScript 5.6から意味のない条件分岐がエラーになります。例えば、以下のように正規表現で.testを書き忘れていたり、括弧のつけ忘れで常に同じ値で評価されるコードを書くとエラーになります。
if (/0x[0-9a-f]/) {
// ↑ .testがない
// ...
}
function isValid(value: string | number, options?: any) {
return value < options.max ?? 100;
// ↑ (value < options.max) ?? 100 と解釈され、常に value < options.maxが評価される
// ...
}
WebAssembly
PGLite
PGLiteはPostgresをWebAssembly化したDBです[9]。ブラウザやNode.jsで起動させることができます。
例えば、以下のようなコードを書くことで、テーブルの作成かデータ追加、データ取得までをブラウザで完結できます (NPM経由でダウンロードしたPGLiteで予期しないエラーが発生したため、以下のコードではCDN経由で動かしてます)。
PrismaなどのORMの対応が進んでないこともあり、実アプリを作るのは大変です。しかし、軽量 (Gzip化されたもので3MB) でブラウザのIndexedDB内に永続化できるため、便利な使い方ができそうな気がします。
import {
PGlite
} from "https://cdn.jsdelivr.net/npm/@electric-sql/pglite/dist/index.js";
let db: PGlite
const createDb = async () => {
db = new PGlite('idb://pilefort-sample-pglite')
// テーブルを作成
await db.query(`
CREATE TABLE users (
id SERIAL PRIMARY KEY, name TEXT NOT NULL, age INT
);
`);
// データの挿入
await db.query(`
INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30),
('Charlie', 35);
`);
console.log('create database')
}
const dbQuery = async () => {
const result = await db.query("SELECT * FROM users;");
console.log("Users table data:", result.rows);
}
ちなみに、データはこのようにブラウザのIndexedDB内に保存されます。
database.build
database.buildはPGLiteを使って、ブラウザ内で完結するDBに対し、自然言語でクエリ発行ができるアプリです[10]。
PostgreSQLで作成したDBテーブルをCSV出力し、ドラッグアンドドロップで追加することで利用できます。このように登録されているデータに対し、自然言語でクエリを発行し、結果を受け取ることができます。
Wasmer
Node/Deno SDK
WasmerをJSで動かす際は@wasmer/sdk
を利用しますが、こちらにNode.js/Denoのサポートが加わりました。例えば以下のようなコードで、WebAssembly化されたコードをサーバーサイドで実行できるらしいです[11]。
ただし、使う時期が悪かったのか、SDK内部でエラーが発生し、実行結果の確認はできてません。もう少し安定化したら、使ってみたいですね。
これでWasmerのランタイムで起動できるものはたいてい動かせるようになるので、かなり応用が効きそうです (WebAssembly化されたWhisperとかもあるので、頑張れば、無料でWhisperが使えたりもします)。
import { init, Wasmer } from "@wasmer/sdk";
async function main() {
await init();
const pkg = await Wasmer.fromRegistry("python/python");
const instance = await pkg.entrypoint.run({
args: ["-c", "print('Hello, World!')"],
});
const { code, stdout } = await instance.wait();
console.log(`Python exited with ${code}: ${stdout}`);
}
main()
C言語対応
WasmerでC言語のコードをWebAssembly化できるようになりました。以下のようなコードで簡単に変換できます。
wasmer run clang/clang example.c -o example.wasm
こちらの赤枠部分が実行結果になります。画像ではブラウザ上で実行してますが、SDKを使うことでNode.jsやDeno上で使うこともできます。
DuckDB WASM
DuckDBは列指向データベースで、BigQueryやRedshiftのように、データ分析用途で利用されます。こちらはOSSで管理されており、無料で利用可能で、様々なプラットフォーム (Linux, macOS, Windows) で動作します。このたび、WASM版がリリースされ、Webアプリやモバイルアプリに組み込んで利用できるようになりました[12]。
ちなみに、Webエンジニアが通常利用するMySQLやPostgressなどは、行指向データベースと呼ばれるものです。行指向の場合は意味のある単位でデータ処理できるため、更新処理やトランザクションに強いです。対して列指向は特定の列に対する計算が早く、CPUなどもリソース効率も高いです。
# 行指向DB
id: 1, name: yamada, age: 20
id: 2, name: tanaka, age: 23
# 列指向DB
id: 1, 2
name: yamada, tanaka
age: 20, 23
ブラウザWhisper
ブラウザ上で機械学習ライブラリを実行できる transformer.jsというリポジトリにおいて、WhisperがWASM化されました[13]。動作は重めですが、高品質にオフラインでも音声からテキストを生成できるようになります。
GitHub
GitHub Copilotのいろいろ
Copilot Chat
GitHub上でCopilot Chatが利用可能になりました[14]。このように、PRやコードの詳細を質問したり、自然言語によるファイル検索などが利用できます (いまどのページを見ているかを認識して回答を生成してくれます)。
ちなみに、IssueからIssueを解決するためのコードを生成する機能も一部ユーザーで利用可能になってます。日本語にも対応しており、日本語で指示を出し、コードを改善することが可能です。
脆弱性のあるコードの自動修正機能リリース
こちらはGitHub Advanced Securityに追加課金しないと利用できない機能ですが、PR上で脆弱性を検知し、修正案を提案する機能が発表されました[15]。49ドル/月 x 人数の費用がかかるため、金銭的ハードルは高いですが、以下のようなXSS脆弱性やSQLの脆弱性を検知し、修正案を出してくれます。
- div.innerHTML = name ?? ''
+ div.textContent = name ? ''
GitHub Copilot Extensions
こちらはGitHub Copilotと組み込みができる拡張機能です。まだ種類が少ないですが、Dockerファイルの生成や脆弱性解析、Teamsアプリ開発のデバッグなどが用意されています[16]。今後に期待です。
PRコメントの自動補完機能
こちらは2023年3月ぐらいから実験的に公開されていた機能です。Copilot Enterpriseでしか利用できませんが、PR説明欄の自動補完機能がリリースされました。PR内のコミットやPRに紐づけられたissueから文章を補完するそうです[17]。
GitHub Actions
GPU Runnerが利用可能に
GitHub ActionsでGPUが利用可能になりました。OSはLinuxとWindowsが用意されています[18]。
Repository
Pushルール
GitHubにPushルールが設定可能になりました。これにより、許可されていないファイルサイズや拡張子、ファイル名のpushをブロックできます[19]。
AWS
S3へのファイル更新で条件付き書き込みがサポート
Amazon S3に、既にオブジェクトが存在するかどうかをチェックした上で、ファイルアップロードができるAPIが追加されました[20]。以下のように、--if-none-match
オプションでファイルが存在すればアップロード失敗、存在しないならアップロードできます。
以前までであればロジックで、オブジェクトが存在するかどうかを別途APIを実行して確認した後、処理する必要がありましたが、そのあたりが簡略化できます。
aws s3api put-object \
--bucket pilefort-s3-conditional-write \
--key test.txt \
--body ./test.txt \
--if-none-match "*"
Storage Browser for Amazon S3 (α版)
Storage Browser for Amazon S3はS3上のファイルをGUIで操作するためのReactコンポーネントです。「ログイン済みユーザーしか閲覧できないファイル」「ファイルを投稿したユーザーしか更新処理ができない」「特定の権限を持つユーザーしかアクセスできない」といった権限管理も組み込みで実装されています[21]。
export const storage = defineStorage({
name: 'myProjectFiles',
access: (allow) => ({
'public/*': [
allow.guest.to(['read']),
allow.authenticated.to(['read', 'write', 'delete']),
],
'protected/{entity_id}/*': [
allow.authenticated.to(['read']),
allow.entity('identity').to(['read', 'write', 'delete'])
],
'private/{entity_id}/*': [
allow.entity('identity').to(['read', 'write', 'delete'])
]
})
});
S3における403 (Access Denied) エラーの課金を停止
Amazon S3が403 (Access Denied) を返した時の課金がなくなりました[22]。これで意図しないユーザーのアクセスによる課金を防ぐことができます。
ECS
ECSをECRからタグを切ってデプロイするときに、イメージタグではなく、イメージのハッシュを内部的に保持して使うようになったそうです[23]。
これは例えば、ECSでECRのlatestタグを使ってデプロイしていたときに、ECR側のlatestを更新しても、以前latestタグだったイメージを使うようになったということです。
最近はECSの基盤側の更新が激しい (2週間に1回はタスクが自動更新される) ので、意図しないデグレを解消するために導入されたような気がします。
CloudFront
CloudFrontのマネージドキャッシュポリシーとして、UseOriginCacheControlHeadersとUseOriginCacheControlHeaders-QueryStringsがサポートされました[24]。こちらは、オリジンが返すCache-Controlヘッダーに基づいてコンテンツのキャッシュができるポリシーです。
API GatewayのREST APIのtimeoutを上限申請可能になった
上限申請を別途提出することにより、API GatewayのREST API統合タイムアウトをデフォルトの29秒から引き上げることができるようになりました[25]。
re:PostにAWS公式チャンネル開設
AWS re:Postはコミュニティーがメインで質疑応答する質問サイトですが、この度AWS公式のチャンネルが設立されました。トラブルシューティングや最適化ネタが投稿されており、参考になります。
フレームワーク
Tauri 2.0
Tauri 1.0のときはデスクトップアプリ開発のためのフレームワークでしたが、Tauri 2.0になり、モバイルアプリもカバーできるようになりました。画面部分はWebViewで構築され、JavaScriptフレームワークを使って記述できます。
モバイルアプリをJavaScriptで構築する場合は、React Native (Expo) も選択肢に上がります。React Nativeは画面部分をネイティブコンポーネント + WebViewを使うため、Webアプリをそのまま移植することが難しく、React Native用のコンポーネントに置き換える必要があります。TauriはWebで動いていたアプリをそのまま移植できるため、モバイルアプリの検証をするのに大変便利です。
また、Tauri2.0ではDialogや通知周りも簡単に導入でき、動作も速いです。β版のときはボタンを押してから、1、3秒ぐらい遅れて反応してましたが、その辺りも解消されています。
import {
isPermissionGranted, requestPermission, sendNotification
} from '@tauri-apps/plugin-notification';
async function notify() {
let permissionGranted = await isPermissionGranted();
// 通知が許可されてなかったら、許可を求める
if (!permissionGranted) {
const permission = await requestPermission();
permissionGranted = permission === 'granted';
}
if (permissionGranted) {
sendNotification({ title: 'Tauri', body: 'Tauri is awesome!' });
}
}
window.addEventListener("DOMContentLoaded", () => {
document.querySelector("#notify")?.addEventListener("click", () => {
notify()
});
});
雑談ですが、React Native (Expo) には、EAS Updateという仕組みがあります。こちらはApp StoreやGoogle Playに新しいバージョンのアプリを出し直さなくても、JS/TS部分だけを更新できる機能です。Tauriのモバイル対応は出て日が浅いですが、デプロイ・アプリ申請周りが強化されないと採用しづらいため、今後良くなっていくことを祈ってます。
Vue 3.5 Beta
メモリ使用量が60%削減、配列処理[26]が10倍高速化など性能面の向上もありますが、scriptタグ内の仕様変更も入ってます。
以下のようなコードを書いたとします。これは親コンポーネントでcountを管理し、子コンポーネントにcountの値を渡して表示しています。子コンポーネントのtemplate内の<div>{{count}}</div>
部は親コンポーネントのカウントアップと連動して、数値が変わっていきます。
しかし、script内のcountについては以前は値が連動しませんでした。親コンポーネントでカウントアップしても、watchEffectが発火しませんでしたが、Vue3.5からはscript内のコードもリアクティブになり、値が変わるようになりました[27]。
// 親コンポーネント
<template>
<div>
<Child :count="count" />
<button @click="() => countPlus()">カウントアップ</button>
</div>
</template>
<script setup lang="ts">
import Child from './components/Child.vue'
import { ref } from 'vue'
const count = ref(0)
const countPlus = () => {
count.value++
}
</script>
// 子コンポーネント
<script setup lang="ts">
import { watchEffect } from 'vue'
const { count } = defineProps({
count: {
type: Number,
required: true
}
})
watchEffect(() => {
console.log('count is changed', count)
})
</script>
<template>
<div>{{count}}</div>
</template>
Tool
Android Studio on IDX
GoogleのProject IDXで、Androidアプリの開発が実験段階になりました。Project IDXとはAI組み込みのWebエディタで、Web上でアプリを動かしながら開発ができます。Androidの開発はまだ安定版になっていませんが、Android Studioをブラウザ上で起動できるそうです。
ちなみに、Flutterは以下のようにブラウザ上で動かすことができます。
Zed
Atomエディタの開発者たちが新しく開発を進めていたZedがGAになりました[28]。拡張機能周りがまだ弱いので、VSCodeからの移植はしてないですが、組み込みでAI機能も利用できるため、今後に期待しています。
Platform
Deno2
DenoがLTSになりました。LTSは半年間続き、バグ修正などが定期的に適用されます。ただ、Node.jsの場合はメンテナンス期間も含め、2年ぐらいLTSがあるため、それに比べると短いです。もう少し長くならないと、AWSなどのクラウド側でランタイムのサポートがされない気がするので、もう少し長くなってほしいです。
とはいうものの Denoはこの数年で格段に良くなりました。npmライブラリも完全にサポートされ、deno compileによる実行ファイルの生成も可能になりました (Node.jsで実行ファイルを生成するには、SEAを使いますが、とても使いづらいです...)。TypeScriptやリント周りも組み込まれているため、早くAWSやGCPなどのクラウドサービスでもランタイムがサポートされて欲しいです。
Wasmer Edge Instaboot
Wasmer EdgeはCDN EdgeにWebAssembly製アプリ (JS, PHP, Python, Rust etc) をデプロイするための環境です。WebAssemblyはDockerイメージよりも軽量かつポータビリティが高く、異なるマシン上 (OSやデバイスが異なっても) であっても、同じ入力に対して常に同じ結果を返すことができます。
Wasmerは、WebAssemblyの特性を活かし、アプリ起動後の状態を保存し、リクエスト時にその状態を復元することで、コールドスタートを100~200倍短縮できる技術 (Instaboot) を発表しました[29]。同社の発表によると、PHPで構築されたWebサイトをWasmer Edge上で公開した際に、WebAssemblyが寄与する処理が2320 msから13 msに短縮されたとのことです。
DockerはDockerイメージだけでなく、WebAssemblyへのビルドもサポートしています。ただ、WebAssemblyのデプロイ自体は限られたクラウドサービスでしか利用できませんし、InstabootのようなWebAssemblyの特性を最大限活かしたサービスもあまりありません。
AWS LambdaなどでDockerイメージをデプロイして使うケースも増えてきていると感じますが、どうしてもコールドスタートの短縮に頭を抱えます (ウォームアップぐらいしかやりようがないが、費用がかかる)。まだ先のこととは思いますが、AWS LambdaでもWebAssemblyデプロイがサポートされ、Instabootのような機能が実装されることを願っています。
Auth0プランアップデート
Auth0は様々な言語やフレームワークで利用可能な認証・認可サービスです。業務で利用したことはありませんが、AmazonのCognitoよりも柔軟性が高そうなサービスだなと感じてます。
この度、プランのアップデートがあり、無料プランは7,500ユーザーから25,000ユーザーまで無料。GoogleやTwitterを用いたログインが無制限、カスタムドメインの設定が可能になったそうです[30]。有料プランについてもMFAの機能アップデートなどが入っており、太っ腹な印象です。
番外編
ElasticsearchがOSSに戻る
Elasticsearchとkibanaが再びOSSになりました[31]。AWSはフォークして自分で開発を進めていたりするので、これからどうなるんだろうという印象です。
Flock (Flutter+)
FlockはFlutterをベースにしつつ、コミュニティの要望やバグ修正に対応するためのリポジトリです。Flutterの最新版を常に取り込みつつ、コンフリクトなどは都度都度対応していくそうです[32]。
こちらが登場した理由はGoogleのFlutterへの投資が下がっているためです。現在GoogleはAI関連事業に力を入れており、Flutterの開発が後回しなっています。このことに、危機感を感じた開発者がFlutter+として、Flockを立ち上げました。Flockで開発を進めて、都度都度Flutterに取り込むという流れが加速できれば、かなり有益そうですね。
tophat
こちらはShopifyが開発を進めているモバイルアプリの動作確認ツールです。GitHubと連携し、PRを立てるとモバイルアプリをビルド、ワンクリックでMacOS上にモバイルアプリを起動できるそうです。AndroidやiOSに対応してるだけでなく、React Nativeもサポートしているそうです[33]。
-
https://blog.chromium.org/2020/01/building-more-private-web-path-towards.htm ↩︎
-
https://developer.mozilla.org/en-US/docs/Web/Privacy/Third-party_cookies#how_do_browsers_handle_third-party_cookies ↩︎
-
https://developers.google.com/search/blog/2024/06/mobile-indexing-vlast-final-final.doc?hl=ja ↩︎
-
https://developer.chrome.com/blog/new-in-devtools-126?hl=ja#throttle-20x ↩︎
-
https://developer.chrome.com/docs/devtools/console/understand-messages ↩︎
-
https://developer.mozilla.org/en-US/docs/Web/API/DocumentPictureInPicture ↩︎
-
https://wasmer.io/posts/wasmer-js-sdk-now-supports-node-and-bun ↩︎
-
https://github.com/xenova/transformers.js/tree/v3/examples/webgpu-whisper ↩︎
-
https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/asking-github-copilot-questions-in-githubcom ↩︎
-
https://github.blog/changelog/2024-08-14-copilot-autofix-for-codeql-code-scanning-alerts-is-now-generally-available/ ↩︎
-
https://github.com/marketplace?type=apps&copilot_app=true ↩︎
-
https://github.blog/changelog/2024-07-24-copilot-text-completion-for-pull-request-descriptions-beta/ ↩︎
-
https://github.blog/changelog/2024-07-08-github-actions-gpu-hosted-runners-are-now-generally-available/ ↩︎
-
https://github.blog/changelog/2024-09-05-pull-request-commits-page-refresh-public-beta/ ↩︎
-
https://aws.amazon.com/jp/about-aws/whats-new/2024/08/amazon-s3-conditional-writes/ ↩︎
-
https://aws.amazon.com/jp/about-aws/whats-new/2024/09/storage-browser-amazon-s3-alpha-release/ ↩︎
-
https://aws.amazon.com/jp/about-aws/whats-new/2024/08/amazon-s3-no-charges-several-http-error-codes/ ↩︎
-
https://aws.amazon.com/jp/about-aws/whats-new/2024/07/amazon-ecs-software-version-consistency-containerized-applications/ ↩︎
-
https://aws.amazon.com/jp/about-aws/whats-new/2024/07/amazon-cloudfront-managed-cache-policies-web-applications/ ↩︎
-
https://aws.amazon.com/jp/about-aws/whats-new/2024/06/amazon-api-gateway-integration-timeout-limit-29-seconds/ ↩︎
-
https://vueschool.io/articles/vuejs-tutorials/whats-coming-in-vue-3-5/ ↩︎
-
https://wasmer.io/posts/announcing-instaboot-instant-cold-starts-for-serverless-apps ↩︎
-
https://www.elastic.co/jp/blog/elasticsearch-is-open-source-again ↩︎
-
https://flutterfoundation.dev/blog/posts/we-are-forking-flutter-this-is-why/ ↩︎
-
https://shopify.engineering/shopify-tophat-mobile-developer-testing ↩︎
Discussion