Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Check these out next
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
【2000行弱!】x86用自作カーネルの紹介
Yuma Ohgami
Raspberry Piで始める自宅サーバー超入門
VirtualTech Japan Inc./Begi.net Inc.
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
レシピの作り方入門
Nobuhiro Iwamatsu
nginx入門
Takashi Takizawa
Redisの特徴と活用方法について
Yuji Otani
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Fixstars Corporation
1
of
48
Top clipped slide
UEFIベアメタルプログラミング
Mar. 11, 2017
•
0 likes
0 likes
×
Be the first to like this
Show More
•
1,449 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Software
わんくま同盟 札幌勉強会 #1(2017-03-04)の発表スライドです。 なお、発表時に使用していたEFIプログラム版の発表スライドは http://yuma.ohgami.jp に置いてあります。
Yuma Ohgami
Follow
Advertisement
Advertisement
Advertisement
Recommended
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
95.3K views
•
107 slides
目grep入門 +解説
murachue
87.2K views
•
83 slides
QEMUでARM64bitベアメタルプログラミング
Yuma Ohgami
3.7K views
•
20 slides
Docker Compose 徹底解説
Masahito Zembutsu
60.5K views
•
123 slides
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
12.3K views
•
31 slides
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
41K views
•
27 slides
More Related Content
Slideshows for you
(20)
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
•
47.5K views
【2000行弱!】x86用自作カーネルの紹介
Yuma Ohgami
•
8K views
Raspberry Piで始める自宅サーバー超入門
VirtualTech Japan Inc./Begi.net Inc.
•
29K views
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
•
15.2K views
レシピの作り方入門
Nobuhiro Iwamatsu
•
61.3K views
nginx入門
Takashi Takizawa
•
53K views
Redisの特徴と活用方法について
Yuji Otani
•
98.6K views
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Fixstars Corporation
•
1.5K views
ラズパイでデバイスドライバを作ってみた。
Kazuki Onishi
•
4.5K views
20180729 Preferred Networksの機械学習クラスタを支える技術
Preferred Networks
•
32.8K views
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
•
250.6K views
Dockerからcontainerdへの移行
Kohei Tokunaga
•
15.3K views
初心者向けCTFのWeb分野の強化法
kazkiti
•
14.9K views
テストコードの DRY と DAMP
Yusuke Kagata
•
1.3K views
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
•
2.9K views
オンラインゲームの仕組みと工夫
Yuta Imai
•
863.7K views
Kubernetesによる機械学習基盤への挑戦
Preferred Networks
•
14.3K views
プログラムを高速化する話
京大 マイコンクラブ
•
239.9K views
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
NTT Communications Technology Development
•
2.1K views
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
•
86.3K views
Similar to UEFIベアメタルプログラミング
(20)
Cell/B.E. プログラミング事始め
You&I
•
567 views
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
エピック・ゲームズ・ジャパン Epic Games Japan
•
21.4K views
レガシーフリーOSに必要な要素技術 legacy free os
uchan_nos
•
4.2K views
ベンチマーク勉強会#02
milk hanakara
•
4.2K views
皆さん!ふくてんが来ましたよ!!
ru pic
•
297 views
Firefox OS and Open Web Board - IGGG Meetup 2015 Spring
Gunma University
•
612 views
2014 0228 OSC-Spring Tokyo NETMF
Atomu Hidaka
•
1.7K views
ISUCON5 予選をPHPで戦った話
Suguru Shirai
•
1.3K views
Firefox mobile for android internals
Makoto Kato
•
1.4K views
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
System x 部 (生!) : しすなま! @ Lenovo Enterprise Solutions Ltd.
•
1.2K views
Python languageupdate (2004)
泰 増田
•
490 views
JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~
Neppo Telewisteria
•
721 views
ネットワークOS野郎 ~ インフラ野郎Night 20160414
Kentaro Ebisawa
•
13.1K views
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
CODE BLUE
•
2.3K views
2015 0227 OSC-Spring Tokyo NETMF
Atomu Hidaka
•
1.8K views
20160619_LPICl304 技術解説セミナー in AP浜松町
Takahiro Kujirai
•
419 views
Xamarinでも有能な .NET Core
Yuta Matsumura
•
1.3K views
Cq tse-fm3セミナー資料
Masaki Muranaka
•
2.3K views
Secret of Firefox
dynamis
•
28.2K views
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Mori Tetsuya
•
6.6K views
Advertisement
More from Yuma Ohgami
(18)
セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門
Yuma Ohgami
•
20 views
「へにゃぺんて」のこれまでを振り返るブログ記事の紹介
Yuma Ohgami
•
17 views
セガサターンで動く自作シンセサイザーの紹介
Yuma Ohgami
•
239 views
セガサターンマシン語プログラミングの紹介
Yuma Ohgami
•
898 views
ハードの作りで振り返るセガサターン
Yuma Ohgami
•
482 views
エミュレータのコードを読んでわかるセガサターン
Yuma Ohgami
•
412 views
エミュレータのコードを読んでわかる「セガサターン」
Yuma Ohgami
•
153 views
シェルスクリプトでセガサターンマシン語ベアメタルプログラミング
Yuma Ohgami
•
559 views
ゲームボーイ向けOSの作り方
Yuma Ohgami
•
664 views
メガドラ実機で自作のROMファイルを動かしてみた話
Yuma Ohgami
•
722 views
/dev/kvmを直接叩いて自作VM
Yuma Ohgami
•
1.1K views
x86_64向け自作OSの紹介
Yuma Ohgami
•
1.1K views
CybozuのOSS(WalB)へコミットしてみた/使ってみた
Yuma Ohgami
•
946 views
GPD WINでStretchを動かす
Yuma Ohgami
•
411 views
UEFIで始めるLinux From Scratch
Yuma Ohgami
•
1.2K views
UEFI向け自作OSの紹介
Yuma Ohgami
•
1.5K views
【シェル芸】コマンド7つで簡易コンテナ
Yuma Ohgami
•
933 views
フルスクラッチ自作OS(OS5)の紹介
Yuma Ohgami
•
1K views
Recently uploaded
(20)
①【密德萨斯大学毕业证文凭学位证书|工艺完美复刻】
0987hgh789
•
2 views
留信网认证可查【堪萨斯大学文凭证书毕业证购买】
1lkjhg
•
2 views
脆弱性がみつかってからパッチとSecurity Bulletinが作られるまで
Hiroko Takamiya
•
2 views
測量データ処理ソフト・MarineDiscoveryの紹介
ssuserbceee8
•
39 views
①【劳里埃大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.10.0対応)
fisuda
•
0 views
留信网认证可查【罗德岛大学文凭证书毕业证购买】
1lkjhg
•
3 views
留信网认证可查【俄克拉荷马大学文凭证书毕业证购买】
1lkjhg
•
2 views
☀️【波恩大学毕业证成绩单留学生首选】
bjd42as
•
2 views
①【南十字星大学毕业证文凭学位证书|工艺完美复刻】
vgh215w
•
3 views
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
Tomoharu ASAMI
•
9 views
在哪里可以做《南安普顿大学文凭证书|毕业证》
1232hdjk
•
2 views
①【卡毕兰诺大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
留信网认证可查【南安普顿大学文凭证书毕业证购买】
32lkhng
•
2 views
WEB-jsug info14_final.pdf
Draft One
•
4 views
留信网认证可查【威得恩大学文凭证书毕业证购买】
32lkhng
•
2 views
測量データ処理システム「MarineDiscoveryクラウド」の紹介
ssuserbceee8
•
56 views
留信网认证可查【波恩大学文凭证书毕业证购买】
khh123kj
•
2 views
在哪里可以做《俄克拉荷马大学文凭证书|毕业证》
lobd15
•
2 views
測量支援ソフト「みとおしえ」「みとおしえクラウド」の紹介
ssuserbceee8
•
59 views
Advertisement
UEFIベアメタルプログラミング
わんくま同盟 札幌勉強会 #1
2017-03 UEFIベアメタルプログラミング 大神 祐真 yuma@ohgami.jp
わんくま同盟 札幌勉強会 #1
2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 職業 – 組み込み系の技術営業@東京 (2016/12から) • 趣味 – フルスクラッチでOS自作
わんくま同盟 札幌勉強会 #1
2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 職業 – 組み込み系の技術営業@東京 (2016/12から) • 趣味 – フルスクラッチでOS自作
わんくま同盟 札幌勉強会 #1
2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 職業 – 組み込み系の技術営業@東京 (2016/12から) • 趣味 – フルスクラッチでOS自作 【技術書典2】 http://techbookfest.org え-15: へにゃぺんて “Ohgami’s Commentary on OS5”
わんくま同盟 札幌勉強会 #1
2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △
わんくま同盟 札幌勉強会 #1
2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △
わんくま同盟 札幌勉強会 #1
2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △ 今どき、 UEFI + x86_64
わんくま同盟 札幌勉強会 #1
2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △ 今どき、 UEFI + x86_64 まずは UEFIから 勉強してみよう
わんくま同盟 札幌勉強会 #1
2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
わんくま同盟 札幌勉強会 #1
2017-03 UEFIとは? Unified Extensible Firmware Interface (統一された拡張性のあるファームウェアインタフェース) Unified Extensible Firmware Interface – Wikipedia https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
わんくま同盟 札幌勉強会 #1
2017-03 ベアメタルプログラミングとは? • OSやライブラリ等を使用せず、 ハードウェアを制御するプログラミング • OS5へ反映させるために、 まずは、UEFIでベアメタルプログラミング • 今回紹介しきれないものも含め、 サンプルコードを以下で公開している – https://github.com/cupnes/bare_metal_uefi
わんくま同盟 札幌勉強会 #1
2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
わんくま同盟 札幌勉強会 #1
2017-03 実行までの流れ 1. ソースコード作成(C言語) 2. コンパイル(PE32+) 3. 2.を、ストレージ(USBフラッシュメモリ等)の 第1パーティション(FAT)の EFI/BOOT/BOOTX64.EFI に配置 4. 3.で起動
わんくま同盟 札幌勉強会 #1
2017-03 1. ソースコード作成(C言語) UEFI Specification を用意 【私の環境の場合】 • QEMU(OVMF.fd) : v2.4 • 実機(Lenovo ThinkPad) : v2.3.1
わんくま同盟 札幌勉強会 #1
2017-03 1. ソースコード作成(C言語) 仕様書にはCのプロトタイプ宣言も書かれているので、 この記載に則った形でソースコードを作っていく Unified Extensible Firmware Interface Specification Version 2.3.1 (P.75) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 1. ソースコード作成(C言語) 【UEFIの機能を呼び出すには】 • UEFIアプリのエントリ関数の プロトタイプ宣言が、仕様で決められている Unified Extensible Firmware Interface Specification Version 2.3.1 (P.75) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 【UEFIの機能を呼び出すには】 • UEFIアプリのエントリ関数の プロトタイプ宣言が、仕様で決められている Unified Extensible Firmware Interface Specification Version 2.3.1 (P.75) http://www.uefi.org/specifications この構造体を通して UEFIの機能を呼び出せる 1. ソースコード作成(C言語)
わんくま同盟 札幌勉強会 #1
2017-03 【UEFIの機能を呼び出すには】 EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications 1. ソースコード作成(C言語)
わんくま同盟 札幌勉強会 #1
2017-03 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLの宣言 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.424) http://www.uefi.org/specifications コンソールへ文字列を出力する関数 1. ソースコード作成(C言語)
わんくま同盟 札幌勉強会 #1
2017-03 EFI_TEXT_STRINGの宣言 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.428) http://www.uefi.org/specifications この関数(EFI_TEXT_STRING)をメンバとする構造体 (EFI_SIMPLE_OUTPUT_PROTOCOL)のポインタ 1. ソースコード作成(C言語)
わんくま同盟 札幌勉強会 #1
2017-03 EFI_TEXT_STRINGの宣言 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.428) http://www.uefi.org/specifications 文字列(Unicode,2bytes)のポインタ 1. ソースコード作成(C言語)
わんくま同盟 札幌勉強会 #1
2017-03 “Hello UEFI!”を出力するサンプル 010_conout/BOOTX64.c https://github.com/cupnes/bare_metal_uefi 1. ソースコード作成(C言語)
わんくま同盟 札幌勉強会 #1
2017-03 “Hello UEFI!”を出力するサンプル 010_conout/BOOTX64.c https://github.com/cupnes/bare_metal_uefi 1. ソースコード作成(C言語)
わんくま同盟 札幌勉強会 #1
2017-03 2. コンパイル(PE32+) 1. PE32+のクロスコンパイラを用意 – apt: x86_64-w64-mingw32-gcc 2. コンパイル $ x86_64-w64-mingw32-gcc -e efi_main ¥ -nostdlib -Wl,--subsystem,10 ¥ -o BOOTX64.EFI hello.c
わんくま同盟 札幌勉強会 #1
2017-03 3. ストレージへ配置、4. ストレージから起動 【実機】 1. ストレージの第1パーティション(FAT)の EFI/BOOT/BOOTX64.EFI に配置 2. 1.のストレージから起動 # mount /dev/sdb1 /mnt # mkdir -p /mnt/EFI/BOOT # cp BOOTX64.EFI /mnt/EFI/BOOT/
わんくま同盟 札幌勉強会 #1
2017-03 3. EFI/BOOT/BOOTX64.EFI へ配置 【QEMU】 1. UEFIファームウェア(OVMF.fd)をダウンロード – https://sourceforge.net/projects/edk2/files/OVMF/ 2. QEMUにHDDと認識させるディレクトリ作成、 BOOTX64.EFI配置 3. QEMU起動 $ mkdir -p hdd/EFI/BOOT $ cp BOOTX64.EFI hdd/EFI/BOOT/ $ qemu-system-x86_64 -bios OVMF.fd -hda fat:hdd
わんくま同盟 札幌勉強会 #1
2017-03 実機での実行の様子
わんくま同盟 札幌勉強会 #1
2017-03 キー入力を取得する 【UEFIの機能を呼び出すには】 EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 キー入力を取得する 【UEFIの機能を呼び出すには】 EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications キー入力を取得できそうな 機能がある
わんくま同盟 札幌勉強会 #1
2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
わんくま同盟 札幌勉強会 #1
2017-03 UEFIの情報取得 UEFIの情報も”SystemTable”から辿りつける EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 UEFIの情報取得 EFI_TABLE_HEADERの定義
わんくま同盟 札幌勉強会 #1
2017-03 UEFIの情報取得 EFI_TABLE_HEADERの定義 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.77) http://www.uefi.org/specifications マイナーバージョンメジャーバージョン 上位16ビット 下位16ビット 例) 0x0002 0x0040 (2.4) 0x0002 0x0031 (2.3.1)
わんくま同盟 札幌勉強会 #1
2017-03 UEFIの情報取得 UEFIバージョンを表示させてみる 【サンプルコード】 https://github.com/cupnes/bare_metal_uefi/tree/master/012_ efiversion 【実行の様子】 QEMU 実機
わんくま同盟 札幌勉強会 #1
2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
わんくま同盟 札幌勉強会 #1
2017-03 プロトコルとGUID • 全ての機能がSystemTableからメンバとして 辿れるわけではない • UEFIでは機能ごとに”プロトコル”と呼んで分 けている – 各プロトコルには一意の”GUID”が存在
わんくま同盟 札幌勉強会 #1
2017-03 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.466) http://www.uefi.org/specifications プロトコルとGUID
わんくま同盟 札幌勉強会 #1
2017-03 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.184) http://www.uefi.org/specifications プロトコルの構造体へのポインタが設定される LocateProtocol() SystemTable->BootServices->LocateProtocol() で GUIDからプロトコルの構造体の先頭アドレスを取得できる
わんくま同盟 札幌勉強会 #1
2017-03 GUIDとLocateProtocol() LocateProtocol()使用例
わんくま同盟 札幌勉強会 #1
2017-03 gop 画面描画を行ってくれる関数 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.466) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications ピクセルデータ を画面表示
わんくま同盟 札幌勉強会 #1
2017-03 gop->Blt() 表示する ピクセルデータ B G R - B G R - B G R - ・ ・ ・ ・ ・ ・ ・ ・ ・ 各8ビット 32ビットで1ピクセル Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications
わんくま同盟 札幌勉強会 #1
2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications 表示先座標 (原点は画面左上)
わんくま同盟 札幌勉強会 #1
2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications ピクセルデータの 幅、高さ
わんくま同盟 札幌勉強会 #1
2017-03 実行の様子 わんくまの画像を表示してみる 【サンプルコード】 https://github.com/cupnes/bare_metal_uefi/tree/master/043_ graphic_image_blt 【実行の様子】
わんくま同盟 札幌勉強会 #1
2017-03 【発表後追記】発表で行った、スライドに無かった内容について • UEFIスライドショー – 以下に置いてあります 使い方はREADMEを見てみてください – https://github.com/cupnes/bare_metal_uefi/tree/master/050_slide show • UEFI Shell – TianoCore[*1]から配布されている以下のEFIバイナリを使用しました – https://github.com/tianocore/edk2/tree/master/EdkShellBinPkg/Ful lShell/X64 – このEFIバイナリも、前述の説明通り、 ストレージの第1パーティション(FAT)の EFI/BOOT/BOOTX64.EFI へ配置すれば、 UEFIのファームウェアが実行してくれます [*1] ベアメタルプログラミング のため、使用していないですが、 UEFIのプログラムを作る 開発環境等をオープンソースで 提供するプロジェクトです。
Advertisement