Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゴーファーくんたちと学ぶRust言語の世界/rust-world-with-gopher

iwasiman
April 14, 2023

 ゴーファーくんたちと学ぶRust言語の世界/rust-world-with-gopher

若手向けに開催した社内のミニ勉強会の資料です。Rust言語についての基本情報周りを概説しています。

iwasiman

April 14, 2023
Tweet

More Decks by iwasiman

Other Decks in Programming

Transcript

  1. 2 この技術講習会(先端技術勉強会)について ゆるくやっていくので、気軽にいきましょう! ⚫ 新年度開始、メンバー15人に増加。グループを超えて部門の活動となりつつ あるので今まで通り続けていきます!! ⚫ 頻度は不定、基本1H、だいたい夕方にやっています。 ⚫ とりあえず始めてみて様子を見ながら続けます。

    ⚫ 説明中も適宜間を挟むので、リアクションはその都度音声でもチャットでもOKです! ⚫ テーマはフリー、参加者から聞いたりして決めていきます。 ⚫ 次回テーマは [いよいよPythonかも?] ,[フロントエンドを題材に前後編で 資料作成中] 。その後のテーマ候補も募集中です! ⚫ 皆さんが講師をするのも大歓迎です!
  2. ゴーファーくんたちと学ぶ 言語の世界 1. Rust言語とは 2. Rustの採用事例 3. Rust言語の特徴 4. 実行速度差のイメージ

    5. Rust言語の用途 6. 主要言語内での立ち位置① (再掲) 7. 主要言語内での立ち位置② 8. 主要言語内での立ち位置③ 9. Rust言語の言語仕様上のあれこれ 10.所有権の仕組みをちょっとだけ 11.学習難易度を検証してみよう 12.Rust最速伝説を検証してみよう 13.まとめ 祝・再開催 Update版 2023/4/14
  3. 5 1. Rust言語とは ◆「ラスト」。当時Mozilla社員のグレイドン・ホアレ氏が2006年に個人プロジェクトで開始、 2010年にMozillaサミットで公開、2015年にv1.0。2023/3に最新版がv1.68.2 ◆Stack Overflowの愛される言語 2016年から7年連続1位を独占と世界のエンジニアから不動の支持 ◆英語の「錆び」だが、真菌のしぶといサビ菌類=安全、堅牢な言語をというのが由来。 robust(頑丈)、trust(信頼)、frustrating(いらいら)、rustic(素朴)、thrust(推力)

    の部分文字列 ◆開発チームに自転車好きが多くチェーンリングがロゴに。歯車とカニがよくメタファーに ◆ゆるかわマスコットがフェリス、Rustプログラマーの通り名は甲殻類からRustacean(ラステイシャン) ◆Go言語と同じく、先進的なエンジニア層に注目されている。2言語目以降の立ち位置 ◆日本語で読める商業本が22冊…2022年に9冊/2023年に2冊→計25冊! 盛り上がっている ◆キーワード:Empowering everyone(誰もに力を与える), Blazingly fast(猛烈な速さ), Fearless concurrency(並行処理も安全に実装できる), No Rust 2.0(後方互換性重視), Zero-cost abstractions(ゼロコスト抽象化) ◆弱み:これから広がる段階、ライブラリやFWが成熟途中のも、学習難易度の高さ ◆競合、似た立ち位置にある言語: ◆Go: Google発2009年、大まかには似た特徴、立ち位置で既に一定のシェア。v1.20.2 ◆Carbon(カーボン): Googleが存在を発表、C++の後継を目指す実験的言語。v0.1[2022/7] ◆Zig(ジグ): アンドリュー・ケリー氏設計のC置き換えを目指した言語。v0.10.1[2023/1] 非公式マスコット カニさんの 「フェリス(Ferris)」 鉄に関連することを意味 する形容詞ferrousより。 https://www.rust-lang.org/ja https://rustacean.net/ 定番の『WEB+DB PRESS』誌で遂に特集!! [2022/10] 『Software Design』誌でも2021/9、2020/6に特集
  4. 6 2. Rustの採用事例 ◆世界のテクノロジー・リーダー企業で注目されている ◆DropboxがインフラをAWSから自社ハードウエアへ移行、ファイルストレージシステムを一度Goで書いた後、 3~4割をRustで作り直して目標達成[2016] ◆Firefoxのv57がRustを採用、実行速度2倍になったと発表。[2017] ここで認知高まる ◆ドワンゴ、ニコニコ配信で使っている分散オブジェクトストレージのFrugalosをRust製 [2018]

    ◆AWS Lambdaで使われている瞬時に起動する軽量VMのFirecracker、 内部実装はRustと発表[2018/11] その後v1.0に[2022/2] 。AWS Fargateでも活用。 ◆AWS Lambdaで使える言語が増えるカスタムランタイム登場、Rustも可能に[2018] ◆AWS、“Why AWS loves Rust, and how we’d like to help”と題してRustプロジェクト支援とRustへの投資強化をブ ログで宣言[2020] ◆Microsoft、Windowsの一部をRustで実装していることを明らかに[2019/11] ◆AzureのAzure IoT Edgeというサービス、内部でRustを採用しているのを発表[2019] ◆チャットアプリのDiscord、実装をGoからRustに切り替え[2020/5] ◆IBM、内部のNode.js製ファイル変換システムの書き換えにRustを採用したのを発表[2020] ◆Google、Android OS自体の開発にRustを採用。[2021/4] Chrome OS、Fuchsia OSでもRustを活用 ◆管理・開発を主導する非営利組織 Rust Foundation 設立。Mozilla+AWS+Microsoft+Google+Huawei [2021/2] ◆Facebook改めMeta、社内の正式開発言語にHACK、C++、Pythonに加えRustを採用[2022/7] ◆OSのLinux6.1、遂にカーネルにRustを一部採用し安定版に [2022/12] ◆フロントエンドのJS実行環境のDeno、当初Goで実装したがRustで再実装 ◆フロントエンドの統合ツールチェーンのRome、JS実装をやめてRustで再実装し高速化 ◆Python用の有名なデータ分析ライブラリPandasの後継、Rust製の高速なPolars登場[2022/10] →GAFA+Mレベルで大注目!! 日本では大手サービスの丸ごとRust刷新などは まだ聞かないが、機能の一部Rust置き換えなどが話題に。機運が高まっている。 フェリス Flatバージョン
  5. 7 3. Rust言語の特徴 ◆①業界最速の猛烈なパフォーマンス ◆コンパイルで機械語に翻訳されてバイナリが実行。JVMのような仮想マシンの仕組みな し。ランタイム環境は不要 ◆自動的なガベージコレクションの仕組みを持たず、メモリ解放の時間ロスがない。後述 の所有権の仕組みで言語機能としてメモリの確保/解放を安全に ◆「ゼロコスト抽象化」の追求でコードの抽象化はコンパイル時に解決、実行時に追加コ ストなし

    ◆→安全性を犠牲にせずに、かつC/C++に迫る実行速度を実現したモダンな言語 ◆②高い信頼性:コンパイルが通る→ほぼ安全なコード ◆型システム、所有権モデル、ライフタイムの仕組み。メモリ安全でないコード、スレッド間 でデータ競合の可能性のあるコードはコンパイルエラーで事前に弾ける ◆③高い生産性 ◆型推論、関数型のアプローチ、モダンな言語機能を一通り備えた21世紀の新しい言語 ◆非常に賢いコンパイラが丁寧なエラーメッセージを出してくれる ◆ビルドツール+パッケージ管理は公式の機能豊富なCargo ◆コードフォーマットも公式提供済みでコマンド1発、型検査や自動補完のエディタサポー トも提供済み ◆ドキュメントも整備済み(一部日本語化) ◆→総合して開発者体験(Developer Experience: DX)に優れる ジャパンのDXと同名注意… Firefoxのバグ56%がメモリ管理 やNullポインタ起因 [2017] Chroniumの5年間の脆弱性の 70%近くがメモリ起因 [2020] →Rustこそが救世主に…?
  6. 8 4. 実行速度差のイメージ 2019年の書籍 『実践Rust入門 [言語仕様から開発手法まで]』 通称“自転車本” より引用。ベンチーマーク測定に使われる Computer Language

    Benchmarks Game 2019/2 の ”How many times slower?”グラフの結果より考察として… C, C++, Rustが同レベルで最高速 Java, Swift, Goが約2-3倍の処理時間 Node.js(JavaScript)は約6倍 Ruby, Python3は約30倍 遅い.. ガベージ コレクションの壁 仮想マシンの壁 インタプリタ型 言語の壁 最速!! JVM言語であるScala、Kotlinも大まかには同程度と思われる。 C#も、JVMと似た仮想マシンの仕組みの上で動いている。 シンプルな処理で 実際に計ってみた 結果は後で! Blazingly Fast! このインタプリタ型言語の壁までの間に、かなり大きい速度の差あり。 Node.jsなどJS実行環境はコンパイル型とインタプリタ型の中間らしく、 比較的速い。 メモリ安全の防壁 機械語 機械語 中間ファイル 逐次実行 メモリ操作の罠 注:簡略化していますが、実際のプログラムの実行速度 にはこれら「~の壁」以外にも言語の仕組みなど様々な 要素が関係します。 主要言語の中では実は遅さが目立つ。Python→ マシンコードへ変換するコンパイラの「Codon」 論文発表、C++並みの速度とのこと [2023/3]
  7. 9 フェリス Extra-cute バージョン 5. Rust言語の用途 ◆クラウド、コンテナ領域 ◆Go言語と同じく実行ファイルだけで動くのでポータビリティが高い ◆サーバーレスのAWS Lambdaは実行時間が短い=安く済む

    のでRustと相性良し ◆サーバーサイド、Webバックエンド、バッチ処理 ◆性能が必要な大量データ処理、検索エンジン、データベースやメッセージングなど ◆WebバックエンドとしてはActix-webというFWが有力、他axum。Web APIの用途も ◆データベースとのORMツールはDiesel、後発にsqlx ◆Webフロントエンド ◆WebAssembly(WASM)にいち早く対応、JSで賄うには重い処理を関数レベルでRustで受け持てる。 (書籍での例:マンデルブロ集合の描画) ◆フロントエンドのフレームワークが担う領域自体をRustで代用しようという野心的なプロジェクトも。Yew, seed-rs ◆他言語との連携、重い処理の置き換え ◆Foreign Function Interface: FFIの機能があり、双方で準備すると他言語から関数レベルでRust製の関数を 呼び出せる。逆も可能。大きいシステムを部分的にRustでリプレイスして高速化するパターンなど ◆コマンドラインユーティリティ、ちょっとしたツール系 ◆起動時間最小、メモリ利用量が少なく、ポータビリティが高いので配置が容易。Linuxコマンド系も作れる ◆低レイヤー、システムプログラミング領域 ◆OS自体、コンパイラやエンジン、リソースが希少な組み込み系、IoT領域 ◆他の領域 ◆UIのあるデスクトップアプリ、画像処理、音声、モバイルのネイティブアプリなど。 システムプログラミング言語だが汎用なので基本的に幅広く可能 →担う領域は大まかにはGo言語と似ている。次頁以降で図示。 “クジラ本”で様々な 領域の実装テーマが 扱われてます
  8. 10 6.主要言語内での立ち位置① Webアプリ フロントエンド (クライアントサイド) バックエンド(サーバーサイド, バッチ系も大まかに含む) コンパイル型言語(静的) インタープリタ型言語(動的,LL,軽量級,スクリプト系) 2014

    1996 2002 登場年 (基本はv1) 2012 1995 1995 1994 2015 2019 1995 2020 2009 手軽さや開発速度、アジャイルとの親和 性で若い企業で採用多し。実行速度で はコンパイル型に劣る。 2010年代中~後半から、型の重要性、 実行速度、設計の重要性などが認識 2016 2003 モダン (ES6以降) モダン 2014 1987 Node.js, Denoは 言語でなくJS実行環境 JavaScript、型で強化した TypeScriptがフロントエンドの華。 ブラウザの上で動く言語は現状これだけ。 2013 Angular 2015 2012 モダン モダン モダン JavaとC#が同世代 枠内の3つを「JVM系言語」 他の回と同じ図の再掲、この色が Rustの話です オレンジがモダンと分類される言語 WebAssembly(WASM)とい う技術で、Rustの実行ファイルで JS処理を部分的に受け持てる。 またフロントエンドの新ビルド ツール周りで、Go,Rustの採用 パターンが出現(詳細は別回…) これらのFW自体の置き 換えの試みも一応あり モダン Goをも上回る実行速度、メモリ 安全と型推論。全面採用も、FFI で部分的な置き換えも可能 Webフレームワークのデファク トがまだで今後。
  9. 11 7. 主要言語内での立ち位置② 低レイヤー、低水準、システムプログラミング 1972 1983 iOS: Objective-C→Swift Android: Java→Kotlin

    2012 2015 モバイル、 スマートデバイス コンパイル型言語(静的) 2014 2016 2018 2013 2015 モバイルバックエンド ネイティブアプリ開発 クロスプラットフォーム開発 Webアプリのバックエンド と同じ言語群 Flutter: AltJSのDart言語を使用、優勢 React Native: JavaScript .NET MAUI: C# ←★出たばかり! 2022 モダン モダン モダン モダン モダン 長らくC,C++の独壇場… RustでもiOS, AndroidOS のネイティブアプリも作れる そうだが、主はバックエンドと 思われる メモリ安全な開発可能に Go:”Better C”止まり Rust:今度こそCの完全 置き換え可能と言われる
  10. 12 8. 主要言語内での立ち位置③ 2006 2010 クラウド プラットフォーム AWS Lambda Auto

    scaling Amazon EC2 ②サーバーレス ①インスタンス上 ECR ECS or EKS EC2 or Fargate exeをcopyするだけ! 登録するところ 管理してくれるところ コンテナが動くところ ③(サーバーレス)コンテナ 2008 対応はNode.js(JS), Python, Go, Java, Ruby, PHP, .NET Core(C#)で、Rustはまだ。 コードを書いたコンテナをデプロイする「Cloud Run」で使える 仮想マシン 見えない コンテナ上で 動く関数 コンテナ、クラウド、マイクロ サービスの文脈全般でGo言 語がよく登場、Rustも似た立 ち位置で基盤にも使われる どんな言語製のアプリも載せられるのでGoも RustもOK。デプロイしやすさが強み 対応はJava、Go、PowerShell、 Node.js(JS)、C#、Python、Ruby カスタムランタイムでRustも使えて実行速度 が強み。Lambda自体の仕組みにも使われる。 API単位でRustに置き換えたり。 コンテナ系サービスや マイクロサービス系: 同じくデプロイしやす さ、サービス単位での 置き換え 対応はC#, JavaScript, F#, Java, PowerShell, Python, TypeScript カスタムランタイムでGoとRustも
  11. 13 9. Rustの言語仕様上のあれこれ ◆インデントは伝統のスペース4桁、関数や変数のネーミングはsnake_case ◆文末はセミコロン; 、省略すると式と判定されて関数の戻り値に。return文不要 ◆let num: i64 =

    64; 形式だが、多くの場合で型推論が効くので型宣言を書かなくて済む ◆変数はimmutable(不変)、mut をつけないと変えたら即エラー、未使用の変数も警告 ◆文字列型は&str型とString型と2つある。後者がメモリを確保して変更可能 ◆ifは文でなく式、結果を変数に入れたりできる。条件に入るのは真偽値だけ ◆配列は長さ固定、可変の場合はベクタというものを使う ◆!がつくのはマクロ、コンパイル時に展開されていろいろ便利機能が用意。Cのマクロに似ている ◆Nullの概念がないので、そもそも伝統のぬるぽが発生しない ◆列挙型に値があるか/ないかの2通りのOption<T>型、正常終了/回復可能なエラーを表すResult<T, E>型でよ く判定。列挙型に複数の型が書けて表現が多彩。Haskellという関数型言語の代数的データ型の系譜 ◆エラーだったら即関数から抜ける ?、値が取れなかったらpanicでプログラム終了させるunwrap()など、 エラーハンドリングがシンプルに書ける仕組みがあれこれ用意。ネストが深くなりがちな例外機構より進化 ◆ループはfor, while, loop。switch文の代わりにmatch式が便利。break不要、分岐が足りないと教えてくれる ◆テストコードはコードと同じファイル中に #[cfg(test)] アトリビュートの後に書く(別ファイルも可) ◆データ構造は構造体(struct)で定義。オブジェクト指向言語でないのでクラスがない。構造体に関数を紐付けて 同じようなことはできる。継承はない ◆関数に関数を渡したり、クロージャという無名関数を変数に入れたり… →と、関数型言語のアプローチ ◆汎用機能は標準ライブラリでなく外部ライブラリで提供、独立して進化をという思想。(ここはGoと違う) let mut v = vec![1,2,3]; let isOk = if flg == true {“ok”;}; さらば、ぬるぽ!! Go言語と似たところもありつつ、言語仕様はより大きい。 21世紀のモダンな言語の新しい考え方を一通り網羅。
  12. 14 10. 所有権の仕組みをちょっとだけ 01:fn main() { 02: let outer =

    “ブロックの外側の変数だよ”; // 変更不可の&str型 03: { 04: let x = String::from(“こんにちはフェリス!”); // 変更可のString型。変数xに「束縛」される 05: let mut y = x; // xの所有権は変数yに移動(move)する。以降、xは使用不可 06: //println!(“{}”, x); // xはもう使えないのでコンパイルエラー 07: println!(“{}”, y); // yは使える 08: 09: let z = &y; // 所有権の借用(borrow) 10: println!(“{} {}”, y, z); // yもzも使える 11: //some_function(y); // 変数yの所有権は関数に移動するのでもう使えない 12: y = some_function(y); // 関数の戻り値で受け取るとまた使えるようになる。借用を使う手も 13: // 他、値をcopy したり中身を丸ごと複製でcloneするなど、各種機能が用意されている 14: } 15: //println!(“{}”, y); // yの生存期間は終了しているのでエラー 16: println!(“{}”, outer); // こちらはまだ存在 17:} ライフタイム(生存期間): 関数の終わりやブロックの終わり “}” を越えると スコープを抜け、所有権が移動して変数は破棄、 メモリは安全に解放される。 DBとのコネクションやネットワーク接続、ファイル オープンなどの後のクローズ処理が要らない。 (地味にすごい…) 所有者は常に一人 メモリの多重解放阻止 メモリの解放忘れ阻止 ダングリングポインタ阻止 メモリの多重解放防止 コンパイラー(+rust-analyzer)で教えてくれること: ★初期化されていない変数の読み出し、不変な値の変更、未使用 ★厳密な型チェック ★長さ3の配列やベクタの4番目にアクセス (これを弾ける!) ★if flag == true と書こうとして if flag = true と代入 ★複数スレッドで共有している変数への同時読み書きによる データ競合 ★イテレーターの変数 i をループ中に i そのものを変更 ★ match式でi32(数値)型を指定して分岐で1,2,3と書くと、 i32::MINからi32::MAXまで満たしていませんよ~と指摘 ★match式の分岐のその他を表すアンダーバー (_)抜け ★変更可能なベクタを宣言しておいて値を追加しない ★関数名の1文字目が大文字… →などなど、とても有能! →これらのルールでメモリ安全を保証し、コンパイルの段階でエラーで弾く。 複雑なガベージコレクションを不要にして圧倒的な実行速度を実現。 コンパイラも優秀で品質維持・生産性向上の助けに。 整数、小数、論理値など固定長でメモリのスタック領域に格納される値は関係なし。 文字列、ベクタなど可変長でヒープ領域に格納される値に所有権(Ownership)のルールが適用。
  13. 15 書籍: “歯車本”『実践Rustプログラミング入門』 『手を動かして考えればよくわかる 高効率言語Rust 書きかた・作りかた』 Udemy: 『Rustプログラミング入門 (最高峰・最難解言語) 』

    『基礎から学ぶRustプログラミング入門』 ほか、インターネット上の情報など: 実装: 定番のVisual Studio Code+優秀な拡張機能のrust-analyzer Udemy講座に従った各種実装、講座のお題の家計簿アプリの コンソールアプリは、実装後に自力でリファクタリングで改善できる程度まで習熟 11. 学習難易度を検証してみよう ◆所有権モデル周り:Rustの鬼門と言われるが… ◆確かに難しいが、本や講座でメモリアドレスの図などと一緒に詳しく解説あり。メモリ安全性の維持のためにこの仕組みが ある、という背景を元に読み解けば理解していける ◆コーディング時はコンパイルエラーで丁寧に教えてくれる。エラー解決→Rust的に正しいコードとなり、それほど詰まらない ◆→総合してコンソールアプリやバッチ、普通のWebアプリのレベルではそんなに困らないのでは? ◆トレイト(trait)周り:Javaのインターフェースや抽象クラスと似ているのでObj指向言語を知っていればOK ◆優秀なコンパイラ: (英語だけど)エラーメッセージがとても丁寧! ◆エラーが意味不明でググるという作業ほぼナシで進められた。(ネットに同様の感想あり) 初めてTypeScriptに触った時の ような感動 ◆エラー箇所の提示、Maybe~で本当はこれを書きたいんじゃないの?という補助、match式で残りのこれが足りませんよ… などの指示も的確。さすがに21世紀のモダンな言語。そしてコードを書いていて楽しい! ◆ビルド管理+ライブラリ管理ツールのcargo: こちらも優秀、すべて公式標準提供 ◆>cargo test でユニットテスト、>cargo fmt でフォーマット整備、linterの>cargo clippyで非推奨の書き方チェック。 ◆Rust自体のインストールも簡単。(Macだと本当にcurlコマンド1発だけ) ◆ほか、Go言語に比べると独特で驚くようなところが比較的少ない印象。他の言語から入るのもスムーズかと 夏の自由研究です →「Rustは難しい」と言われるが基本周りはそこまででもないような? 総合して、開発者体験(Developer Experience: DX)が高い!!
  14. 16 関数 add_array(n: u64, x: u64) -> u64 仕様: 引数nの数だけ要素を持った配列を宣言、各要素に+1していく。これを引数x回だけ繰り返して合計値を返す。戻り値はn*xになる。

    入門書として有名な“歯車本”『実践Rustプログラミング入門』11章よりお題を拝借。 同書ではRuby言語と比較し、Rust:0.3秒、Ruby:6.3秒 で20倍以上(!)の性能が出ることを実証。 これを他の言語で同じ処理の関数を実装、実行速度を比較してみる。マシンは古めのMacBook。(Core i5 3.1GHz2コア メモリ8GB) 12. Rust最速伝説を検証してみよう https://github.com/iwasiman/rust-speed-compare 夏の自由研究です 引数n, x Python 3.9.13 Ruby 2.6.8 PHP 7.4.3 JavaScript (Node.js16.16.0) Java 18.0.2 Go 1.18 Rust 1.62 1万 8.6秒 6.8秒 4.8秒 0.4秒 0.2秒 0.54秒 0.42秒 10万 15分58秒 11分26秒 7分56秒 11.8秒 8.5秒 4.7秒 4.9秒 100万 返ってこないので中断… 23分16秒 14分23秒 10分5秒 10分13秒 200万 返ってこないので中断… 1時間26分5秒 58分31秒 45分10秒 43分37秒 ◆1万レベル:インタプリタ型言語の11~16倍を達成、Goと互角。Javaもまだ健闘 (0.*秒レベルはほぼ誤差。) ◆→ここでRustは開発用のデバッグビルドだと6.12秒、リリースビルドだと上の0.42秒でだいぶ差が出る。 ◆10万レベル:インタプリタ型言語の98倍~170倍を達成。ここでもGoと互角、Javaは遅れが目立つ。 ◆100万レベル:今回はGoが僅差で勝利。RustはJavaScriptの2.3倍、Javaの1.4倍を達成。 ◆200万レベル:Rustが僅差で優勝。JavaScriptの2倍、Javaの1.3倍、Goの1.03倍を達成。 スクリプト系言語より10~100倍の爆速という評価は本物!! 単純な1関数だったせいか今回はGoとほぼ互角だったが、 より複雑で長時間の処理だと違う結果になるのかも? またGoとRustはJavaより速く、完全に上位互換となる。 Blazingly Fast! 緑がインタプリタ型言語← →朱色がコンパイル型言語
  15. 17 13. 本日のまとめ ◆言語の仕組みでメモリ安全を確保しC/C++並みの 最高速度を実現。20世紀から続く人類とメモリとの戦いは遂に終止符…か? ◆クラウド、Web、OS自体や組み込み系も可能でオールラウンド ◆優秀なコンパイラ、周辺ツールで高い生産性と品質維持と開発者体験 +カニさんというゆるかわマスコット ◆→他の言語のシェアを奪い取るのではなく、Goと同じように隙間を埋める 立ち位置や実行速度向上目的の全体/一部置き換えに?

    ◆コンパイル型言語ではGoと並びこのRustが大きく注目、今後の動向が 楽しみな言語です。 Creative Commons Attributions 3.0 The Gopher character is based on the Go mascot designed by Renée French. それではまた次回! 資料中の様々なロゴやマスコットはその言語や技術の公式・非公式のものです。書影はその書籍・雑誌のものです。 そうだね! 一緒に未来をつくろう!