🦊

2024年6月から2024年10月までに登場したWeb技術のつまみ食い (MyWebちぇんじろぐ2024part2)

2024/11/17に公開

ブラウザ (Chrome)

サードパーティークッキーについて

2000年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は基本的にエンドユーザーよりスペックが高いため、この機能により、より現実に即したデバッグが可能になります。

CPU Throttling

検証ツールでCore Web Vitalsの確認が可能に

検証ツールのPerformanceタグを開くことで、そのページのCore Web Vitalsを確認できるようになりました[6]。どの要素で問題が発生しているかも取得できるため、画面のカクツキや意図しないレイアウトシフトの検知に役立ちます。

また、Core Web Vitalsの値は検索順位にも影響を与えるため、toCサービスでは改善が必要な指標となっています。

こちらのCore Web Vitalsはローカルでの値だけでなく、そのURLにアクセスした実際のユーザーの値も確認できます。

現在のChromeはNetworkだけでなく、CPUのスロットリングも可能なため、ローカルの値が実際のデータに近づくようにスロットリングし、どのような問題が発生しうるかの確認もできます。

Local metrics

Console Insights

Console Insightsとはコンソール上に表示されたエラーをAI (Gemini) を使ってデバッグするための機能です[7]

個人的には、console上のエラーを見て何かをするといったことが一切ないため、あまり便利さは分かりません。Rollbarなどでエラーを検知し、エラーメッセージやスタックトレースで該当箇所のあたりをつけて、エラーになりそうな条件を考える方が個人的に良いと思ってます。

Console Insights

Firefox 生成AIを統合

ChatGPTなどの使い方として、記事の要約や日本語への翻訳をする機会が多いと思います。この度、Firefoxで右クリックで要約や読み替えができる機能が追加されました。Chromeにも欲しいですね。ただ、現状はカスタマイズ性が低く使い勝手が良くないです。

Firefoxに生成AI機能が統合

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>

Picture-in-Picture APIのデモ

Chromeだけでなく、VSCodeなど他のアプリよりも最前面に表示されます。ただし、システムの設定で最前面に表示してるものがある場合は、それより下に表示されます。

Picture-in-Picture APIのデモ2

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);
}

コンソール上にDBのクエリ結果を表示

ちなみに、データはこのようにブラウザのIndexedDB内に保存されます。

PGLiteのデータをIndexedDBに保存

database.build

database.buildはPGLiteを使って、ブラウザ内で完結するDBに対し、自然言語でクエリ発行ができるアプリです[10]

PostgreSQLで作成したDBテーブルをCSV出力し、ドラッグアンドドロップで追加することで利用できます。このように登録されているデータに対し、自然言語でクエリを発行し、結果を受け取ることができます。

database.buildのデモ

Wasmer

Node/Deno SDK

WasmerをJSで動かす際は@wasmer/sdkを利用しますが、こちらにNode.js/Denoのサポートが加わりました。例えば以下のようなコードで、WebAssembly化されたコードをサーバーサイドで実行できるらしいです[11]

ただし、使う時期が悪かったのか、SDK内部でエラーが発生し、実行結果の確認はできてません。もう少し安定化したら、使ってみたいですね。

これでWasmerのランタイムで起動できるものはたいてい動かせるようになるので、かなり応用が効きそうです (WebAssembly化されたWhisperとかもあるので、頑張れば、無料でWhisperが使えたりもします)。

index.js
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上で使うこともできます。

WasmerのC言語対応

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やコードの詳細を質問したり、自然言語によるファイル検索などが利用できます (いまどのページを見ているかを認識して回答を生成してくれます)。

GitHub上でGitHub Chatを利用するサンプル

GitHub上でGitHub Chatを利用するサンプル

ちなみに、Issueから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]

Push Rule

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 "*"

S3APIでファイルアップロードに成功した場合

既に同名のファイル名が存在していた場合

Storage Browser for Amazon S3 (α版)

Storage Browser for Amazon S3はS3上のファイルをGUIで操作するためのReactコンポーネントです。「ログイン済みユーザーしか閲覧できないファイル」「ファイルを投稿したユーザーしか更新処理ができない」「特定の権限を持つユーザーしかアクセスできない」といった権限管理も組み込みで実装されています[21]

amplify/storage/resource.ts
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]

parent.vue
// 親コンポーネント
<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>
components/Child.vue
// 子コンポーネント
<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は以下のようにブラウザ上で動かすことができます。

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]

脚注
  1. https://blog.chromium.org/2020/01/building-more-private-web-path-towards.htm ↩︎

  2. https://developer.mozilla.org/en-US/docs/Web/Privacy/Third-party_cookies#how_do_browsers_handle_third-party_cookies ↩︎

  3. https://privacysandbox.com/news/privacy-sandbox-update/ ↩︎

  4. https://developers.google.com/search/blog/2024/06/mobile-indexing-vlast-final-final.doc?hl=ja ↩︎

  5. https://developer.chrome.com/blog/new-in-devtools-126?hl=ja#throttle-20x ↩︎

  6. https://developer.chrome.com/blog/devtools-realtime-cwv ↩︎

  7. https://developer.chrome.com/docs/devtools/console/understand-messages ↩︎

  8. https://developer.mozilla.org/en-US/docs/Web/API/DocumentPictureInPicture ↩︎

  9. https://github.com/electric-sql/pglite ↩︎

  10. https://github.com/supabase-community/postgres-new ↩︎

  11. https://wasmer.io/posts/wasmer-js-sdk-now-supports-node-and-bun ↩︎

  12. https://duckdb.org/docs/api/wasm/overview.html ↩︎

  13. https://github.com/xenova/transformers.js/tree/v3/examples/webgpu-whisper ↩︎

  14. https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/asking-github-copilot-questions-in-githubcom ↩︎

  15. https://github.blog/changelog/2024-08-14-copilot-autofix-for-codeql-code-scanning-alerts-is-now-generally-available/ ↩︎

  16. https://github.com/marketplace?type=apps&copilot_app=true ↩︎

  17. https://github.blog/changelog/2024-07-24-copilot-text-completion-for-pull-request-descriptions-beta/ ↩︎

  18. https://github.blog/changelog/2024-07-08-github-actions-gpu-hosted-runners-are-now-generally-available/ ↩︎

  19. https://github.blog/changelog/2024-09-05-pull-request-commits-page-refresh-public-beta/ ↩︎

  20. https://aws.amazon.com/jp/about-aws/whats-new/2024/08/amazon-s3-conditional-writes/ ↩︎

  21. https://aws.amazon.com/jp/about-aws/whats-new/2024/09/storage-browser-amazon-s3-alpha-release/ ↩︎

  22. https://aws.amazon.com/jp/about-aws/whats-new/2024/08/amazon-s3-no-charges-several-http-error-codes/ ↩︎

  23. https://aws.amazon.com/jp/about-aws/whats-new/2024/07/amazon-ecs-software-version-consistency-containerized-applications/ ↩︎

  24. https://aws.amazon.com/jp/about-aws/whats-new/2024/07/amazon-cloudfront-managed-cache-policies-web-applications/ ↩︎

  25. https://aws.amazon.com/jp/about-aws/whats-new/2024/06/amazon-api-gateway-integration-timeout-limit-29-seconds/ ↩︎

  26. https://github.com/vuejs/core/issues/4318 ↩︎

  27. https://vueschool.io/articles/vuejs-tutorials/whats-coming-in-vue-3-5/ ↩︎

  28. https://zed.dev/ ↩︎

  29. https://wasmer.io/posts/announcing-instaboot-instant-cold-starts-for-serverless-apps ↩︎

  30. https://auth0.com/blog/auth0-plans-got-an-upgrade/ ↩︎

  31. https://www.elastic.co/jp/blog/elasticsearch-is-open-source-again ↩︎

  32. https://flutterfoundation.dev/blog/posts/we-are-forking-flutter-this-is-why/ ↩︎

  33. https://shopify.engineering/shopify-tophat-mobile-developer-testing ↩︎

GitHubで編集を提案

Discussion