0
Ruby on Rails 入門      2008. 3. 10   株式会社万葉 大場寧子
自己紹介実装大好きプログラマAward on Rails 2006 大賞受賞Ruby歴2年会社を作りました
デブサミ後の飲み会にてキムラデービーさんと感動の(?)再会ちょうどいいから Ruby on Rails の入門講師をやってください
Ruby on RailsWebアプリケーションフレームワークRubyオールインワン
RoRとの出会い2006年春マネージャーをやめてプログラムを楽しむことにするJava サーバの用意を旦那にねだる
RoRとの出会い2006年春マネージャーをやめてプログラムを楽しむことにするJava サーバの用意を旦那にねだる         断られた
ふてくされるミドルウェア苦手です代わりに「Ruby on Rails」の本を手渡されるなぜか環境も用意されている・・・・しぶしぶ手をつける
RoR ってスゴイ!スイスイ作れる実は本格的かゆいところに手が届く
楽しい!そのままどんどん作り続けた旦那が、Award on Rails を薦める大賞・審査員特別賞を頂戴する
ずっと RoR業務でもRuby on Rails ECサイト SNS 医事会計 地球の歩き方 旅すけ
今日のお題Ruby ってどんなカンジ?Ruby on Rails の雰囲気をつかむActiveRecord について少し詳しく実際に現場で使っての感想
時間配分Ruby - 10分Ruby on Rails - 30分ActiveRecord - 20分現場 - 5分
Ruby って  どんなカンジ?とてもイイ目を慣らさないと Rails に入れないRails に行く前に軽く説明します
Ruby 事始め        用意するものRuby, RubyGemRoR 対応バージョンは 1.8Windows なら One-Click Installerhttp://rubyinstaller.rubyforge.org/wiki/w...
irbRuby の動作を対話的に試せる> irb これを使いながらRubyの動作を    説明していきます。     DEMO
クラスの定義class Dogend Dog というクラスができます                   DEMO
インスタンスを作るdog = Dog.new dog という変数ができます Dog クラスのインスタンスが作ら れ、dog に代入されます                     DEMO
メソッドの定義class Dog def say   p Baw! endend  インスタンスメソッド say を定義する                   DEMO
メソッドを呼ぶdog = Dog.newdog.say dog の say メソッドを呼ぶ                     DEMO
引数のあるメソッドdef eat(food) if food   p Thank you! else   p oooooo endend                    DEMO
引数のある     メソッドを呼ぶdog = Dog.newdog.eat(100)                DEMO
メソッドの () の省略dog = Dog.newdog.eat 100 省略してもわかるものは省略できる 書式の統一よりのびのびした使い勝手 自由 > 統制                DEMO
インスタンス変数class Dog def name=(name)   @name = name endend @がついた変数はインスタンス変数 外部から直接アクセスできない    DEMO
クラスを調べてみるdog.kind_of?(Dog)dog.kind_of?(Object)dog.kind_of?(String)p dog.class 継承元クラスを明示的に指定しないと Object クラスの派生クラスになる       ...
クラスの継承class Sheltie < Dog def say   p coon endend  Dog の派生クラス Sheltie を作る                           DEMO
すべてがオブジェクトp Wow.classp 100.classp Dog.class プリミティブ型という概念なし クラスもオブジェクト                  DEMO
動的型づけ型宣言なし=すべての変数の型が Object であるのと一緒型の整合性は気にしない動作するかどうかだけが重要
文字列"文字列です""その犬の種類は #{dog.class.name} です" Stringクラス "..."では、#{}で評価結果を埋め込むこ とができる                     DEMO
文字コードRuby 1.8 では、文字列はバイト列RoR では utf-8を使う日本語の操作は正規表現万歳Ruby 1.9 では国際化された
配列a = Array.newa = []a = [1, 2, 3]p a[1]p a.size リスト操作は基本的に配列を使う                     DEMO
ハッシュh = Hash.newh = {}h = {:id => 1, :name => Pochi}p[:id]p[:name]  RoRでは基本中の基本となるクラス  :id ・・・シンボル(Symbol)              DEMO
引数にハッシュを渡すdog.eat(  {:name => meat, :price => 320})  320円の肉を食べる                                     DEMO
ハッシュの{ }の省略dog.eat :name => meat, :price => 320   任意のオプションを引数として渡すの   に多用される                   DEMO
null じゃなくて nil世の中で false なのは nil と false だけ0 も false ではない
あとのことはRuby リファレンスマニュアルhttp://www.ruby-lang.org/ja/man/html/index.html
RoR事始め    ∼用意するもの∼> gem install rails  Rails を Ruby 環境に入れる  Rails の最新バージョンは 2.0.2  DBを用意  IDE(Aptana, NetBeans etc)を用意
アプリケーションを作る  IDE から New Project  コマンドラインなら次のようにする> rails myapp   →プロジェクトで使うファイルや    ディレクトリ構造が作られる                       DEMO
RoR の MVCapp/controllers   app/models   Controller      Model                    DB      View app/views
Controller を動かす勉強会参加者の管理アプリを作ってみますまずは Top Page でも                  DEMO
URL, Controller, Viewhttp://localhost:3000/top_page/index         TopPageController                     index             ...
routes.rbどのURLに対してどのコントローラのどのアクションを呼び出すか定義デフォルトの動作も定義されている
URLが設計に影響Controller クラスをどう分割するかRESTfulにするのに適した設計モデルのCRUDとの自動対応
データベースの準備データベースを作るdatabase.ymlを設定する
モデルを作る「Seminar」クラスを作ろうテーブル名は seminarstitle, date, description を持つMigrationでテーブルを作るモデルクラスを作る                               ...
Controller, View と  つなげて動かす「Seminar」モデルのメンテナンスのためのコントローラ「SeminarsController」を作る簡単な登録フォームと一覧を作る                     DEMO
Scaffoldこのような定型的な処理には Scaffoldが利用できるあくまでも開発のための足場であって、完成品ではない                   DEMO
ActiveScaffold完成品にしちゃえばいいじゃない! というプラグイン管理機能などに便利                 DEMO
惑わされないRails というと Scaffold が有名汎用的な実装を楽にするためのツールに過ぎない人は Scaffold のために作るにあらず本当の価値は、総合的な生産効率
ActiveRecordO/R マッピングテーブル → クラスレコード → インスタンス
ActiveRecordの      使い方登録する検索する設計する
Rails のコンソール> ruby script/console  Rails のライブラリがすべて使える状態  のコンソール  ちょっとした動作確認に便利  これを使いつつ説明していきます                        DEMO
レコードを登録するseminar = Seminar.new(  :title => Ruby on Rails 入門,  :date => Date.today)seminar.save  インスタンスを作って save する        ...
Form から DBへ画面  <%= text_field :seminar, :title %>          リクエストパラメータ       {:seminar => {:title => 値}}コントローラseminar = Semi...
バリデーションsave を呼ぶと、内部でバリデーションメソッドが走る空でないか? ユニークか? etc違反があれば、保存されない                    DEMO
登録の前後に好きな処理を挟めるコールバックbefore_savebefore_validationafter_savecreate専用、update専用もある
レコードを検索する全件検索  @seminars = Seminar.find(:all)2008年開催のものを検索する@seminars = Seminar.find(:all, :conditions => "date >= 2008-01-0...
find_by_xxx find_by_date など、カラムごとの検索 メソッドが自動的に使えるようになるtoday_seminars =Seminar.find_by_date(Date.today)                       ...
joinfind のオプションで :joins で JOIN句をそのまま記述するjoin したデータを後で使うなら、「関連」を使うほうが楽
「関連」を使った検索  「Seminar」には「Participant」(参  加者)が複数いる<% for p in seminar.participants %>  ... 参加者情報の表示 ...<% end %>            ...
1 対 多の関連を張るclass Seminar < ActiveRecord::Base has_many :participantsendclass Participant < ActiveRecord::Base belongs_to :...
関連を使うセミナーオブジェクトから参加者を得るparticipants = seminar.participants参加者オブジェクトからセミナーを得るseminar = participant.seminar
関連の     Eager LoadingSeminar.find(:all,  :include => :participants) 一度の検索で関連オブジェクトも取得 デフォルトは Lazy Loading
count, max などcount = Seminar.countlast_date = Sminar.maxmum(date)
必要な情報だけを      取得するdates = Seminar.find(:all, :select => date)  必要なカラムの情報だけを取得するこ  ともできる                            DEMO
SQLの    チューニングActiveRecord が実際に使ったSQLは開発ログに出るそれを見ながらチューニングいざとなったらSQLを書く手も
モデルを設計するオブジェクト指向とテーブル設計をいったりきたりしながら最適なポイントを探す両者のギャップを埋めるための高度な機能が存在
高度な機能単一テーブル継承ポリモーフィック関連
単一テーブル継承            継承関係にある複数のクラスを                         class    table                 class       class1つのテーブルに対応づける
単一テーブル継承テーブルの type カラムにクラス名が格納される操作対象のクラスによって、ActiveRecord がよきにはからうオブジェクト指向で作れる
ポリモーフィック関連   *   1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
ポリモーフィック関連   *   1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
ポリモーフィック関連タグが      *   1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
ポリモーフィック関連タグが       いろいろなものにつく      *   1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
ActiveRecord 凄い!オブジェクト指向で開発できる自由度が高い規約どおりにつくればコード量がとても少なくて済む
RoR の開発現場アジャイルがお奨めモデル設計 → URL設計 → 実装10人くらい参加しても大丈夫
ありがちな心配コンパイル時のチェックがなくて品質は大丈夫か?分業しづらい?大規模開発に向かない?パフォーマンスが悪い?
案外大丈夫テストをしっかりやれば品質は上げられるオブジェクト指向に乗っ取れば分業はまったく問題ない大規模開発もできるただし、楽しくなくなるかも
パフォーマンス何も気にせず作ると、かなり遅いチューニング必須キャッシュやDBまわりのチューニングでかなり速くなる
テストRails には 3種類のテストフレームワークが備わっているUnit テストは使いやすいコントローラ・ビューのテストはSelenium が便利
Ruby, Rails の習得Java経験者なら構文はすぐ習得1ヶ月もすれば開発戦力にらしい プログラムを書くには3ヶ月くらいかかる
私の重視する開発習慣コミュニケーション名前づけの重視DRY(同じコードを重複して書かない)の追求まず仮定し、あとで調節する
RoRに必要な    マインドフレームワークに合わせる協調性フレームワークを拡張する勇気プラグインとの適切な距離感
Rails に合わせるRails の規約に従わないことは可能大きなコストが伴うできるだけ仕様をRailsに合わせることが高い生産性を得るコツ
Rails に呑まれないRails にないからといって諦めないRuby も Rails も動作を上書きできる何でもできる勇気を持つ
やりすぎないできるとやりたくなる過ぎたるは及ばざるがごとし改変ではなく拡張にとどめるバランスが難しい
プラグインいろいろ使えるようになっておくと開発がとても早いソースを読む覚悟で使う国際化不足のものもあるRailsのバージョンアップがしづらくなったりする
サービス紹介Web家計簿「小槌」BookScopeImageUpload プラグイン
小槌  http://www.kozuchi.netユーザー間の貸し借り連動記入など
BookScope  http://bookscope.net貸し借り管理のできる蔵書システム
ImageUpload      プラグインhttp://imageupload.rubyforge.org/伊藤忠商事 Tlab で開発かっこよく画像をアップロードするプラグイン
ご静聴ありがとうございました。    ご指摘・ご質問等は  y.ohba@everyleaf.com    までお願いします。
Upcoming SlideShare
Loading in...5
×

Ruby on Rails 入門

3,158

Published on

2008-03-10 に club db2 にて行った Ruby on Rails 入門セミナーの資料です。

Published in: Technology
1 Comment
11 Likes
Statistics
Notes
No Downloads
Views
Total Views
3,158
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
47
Comments
1
Likes
11
Embeds 0
No embeds

No notes for slide

Transcript of "Ruby on Rails 入門"

  1. 1. Ruby on Rails 入門 2008. 3. 10 株式会社万葉 大場寧子
  2. 2. 自己紹介実装大好きプログラマAward on Rails 2006 大賞受賞Ruby歴2年会社を作りました
  3. 3. デブサミ後の飲み会にてキムラデービーさんと感動の(?)再会ちょうどいいから Ruby on Rails の入門講師をやってください
  4. 4. Ruby on RailsWebアプリケーションフレームワークRubyオールインワン
  5. 5. RoRとの出会い2006年春マネージャーをやめてプログラムを楽しむことにするJava サーバの用意を旦那にねだる
  6. 6. RoRとの出会い2006年春マネージャーをやめてプログラムを楽しむことにするJava サーバの用意を旦那にねだる 断られた
  7. 7. ふてくされるミドルウェア苦手です代わりに「Ruby on Rails」の本を手渡されるなぜか環境も用意されている・・・・しぶしぶ手をつける
  8. 8. RoR ってスゴイ!スイスイ作れる実は本格的かゆいところに手が届く
  9. 9. 楽しい!そのままどんどん作り続けた旦那が、Award on Rails を薦める大賞・審査員特別賞を頂戴する
  10. 10. ずっと RoR業務でもRuby on Rails ECサイト SNS 医事会計 地球の歩き方 旅すけ
  11. 11. 今日のお題Ruby ってどんなカンジ?Ruby on Rails の雰囲気をつかむActiveRecord について少し詳しく実際に現場で使っての感想
  12. 12. 時間配分Ruby - 10分Ruby on Rails - 30分ActiveRecord - 20分現場 - 5分
  13. 13. Ruby って どんなカンジ?とてもイイ目を慣らさないと Rails に入れないRails に行く前に軽く説明します
  14. 14. Ruby 事始め 用意するものRuby, RubyGemRoR 対応バージョンは 1.8Windows なら One-Click Installerhttp://rubyinstaller.rubyforge.org/wiki/wiki.pl
  15. 15. irbRuby の動作を対話的に試せる> irb これを使いながらRubyの動作を 説明していきます。 DEMO
  16. 16. クラスの定義class Dogend Dog というクラスができます DEMO
  17. 17. インスタンスを作るdog = Dog.new dog という変数ができます Dog クラスのインスタンスが作ら れ、dog に代入されます DEMO
  18. 18. メソッドの定義class Dog def say p Baw! endend インスタンスメソッド say を定義する DEMO
  19. 19. メソッドを呼ぶdog = Dog.newdog.say dog の say メソッドを呼ぶ DEMO
  20. 20. 引数のあるメソッドdef eat(food) if food p Thank you! else p oooooo endend DEMO
  21. 21. 引数のある メソッドを呼ぶdog = Dog.newdog.eat(100) DEMO
  22. 22. メソッドの () の省略dog = Dog.newdog.eat 100 省略してもわかるものは省略できる 書式の統一よりのびのびした使い勝手 自由 > 統制 DEMO
  23. 23. インスタンス変数class Dog def name=(name) @name = name endend @がついた変数はインスタンス変数 外部から直接アクセスできない DEMO
  24. 24. クラスを調べてみるdog.kind_of?(Dog)dog.kind_of?(Object)dog.kind_of?(String)p dog.class 継承元クラスを明示的に指定しないと Object クラスの派生クラスになる DEMO
  25. 25. クラスの継承class Sheltie < Dog def say p coon endend Dog の派生クラス Sheltie を作る DEMO
  26. 26. すべてがオブジェクトp Wow.classp 100.classp Dog.class プリミティブ型という概念なし クラスもオブジェクト DEMO
  27. 27. 動的型づけ型宣言なし=すべての変数の型が Object であるのと一緒型の整合性は気にしない動作するかどうかだけが重要
  28. 28. 文字列"文字列です""その犬の種類は #{dog.class.name} です" Stringクラス "..."では、#{}で評価結果を埋め込むこ とができる DEMO
  29. 29. 文字コードRuby 1.8 では、文字列はバイト列RoR では utf-8を使う日本語の操作は正規表現万歳Ruby 1.9 では国際化された
  30. 30. 配列a = Array.newa = []a = [1, 2, 3]p a[1]p a.size リスト操作は基本的に配列を使う DEMO
  31. 31. ハッシュh = Hash.newh = {}h = {:id => 1, :name => Pochi}p[:id]p[:name] RoRでは基本中の基本となるクラス :id ・・・シンボル(Symbol) DEMO
  32. 32. 引数にハッシュを渡すdog.eat( {:name => meat, :price => 320}) 320円の肉を食べる DEMO
  33. 33. ハッシュの{ }の省略dog.eat :name => meat, :price => 320 任意のオプションを引数として渡すの に多用される DEMO
  34. 34. null じゃなくて nil世の中で false なのは nil と false だけ0 も false ではない
  35. 35. あとのことはRuby リファレンスマニュアルhttp://www.ruby-lang.org/ja/man/html/index.html
  36. 36. RoR事始め ∼用意するもの∼> gem install rails Rails を Ruby 環境に入れる Rails の最新バージョンは 2.0.2 DBを用意 IDE(Aptana, NetBeans etc)を用意
  37. 37. アプリケーションを作る IDE から New Project コマンドラインなら次のようにする> rails myapp →プロジェクトで使うファイルや ディレクトリ構造が作られる DEMO
  38. 38. RoR の MVCapp/controllers app/models Controller Model DB View app/views
  39. 39. Controller を動かす勉強会参加者の管理アプリを作ってみますまずは Top Page でも DEMO
  40. 40. URL, Controller, Viewhttp://localhost:3000/top_page/index TopPageController index アクション
  41. 41. routes.rbどのURLに対してどのコントローラのどのアクションを呼び出すか定義デフォルトの動作も定義されている
  42. 42. URLが設計に影響Controller クラスをどう分割するかRESTfulにするのに適した設計モデルのCRUDとの自動対応
  43. 43. データベースの準備データベースを作るdatabase.ymlを設定する
  44. 44. モデルを作る「Seminar」クラスを作ろうテーブル名は seminarstitle, date, description を持つMigrationでテーブルを作るモデルクラスを作る DEMO
  45. 45. Controller, View と つなげて動かす「Seminar」モデルのメンテナンスのためのコントローラ「SeminarsController」を作る簡単な登録フォームと一覧を作る DEMO
  46. 46. Scaffoldこのような定型的な処理には Scaffoldが利用できるあくまでも開発のための足場であって、完成品ではない DEMO
  47. 47. ActiveScaffold完成品にしちゃえばいいじゃない! というプラグイン管理機能などに便利 DEMO
  48. 48. 惑わされないRails というと Scaffold が有名汎用的な実装を楽にするためのツールに過ぎない人は Scaffold のために作るにあらず本当の価値は、総合的な生産効率
  49. 49. ActiveRecordO/R マッピングテーブル → クラスレコード → インスタンス
  50. 50. ActiveRecordの 使い方登録する検索する設計する
  51. 51. Rails のコンソール> ruby script/console Rails のライブラリがすべて使える状態 のコンソール ちょっとした動作確認に便利 これを使いつつ説明していきます DEMO
  52. 52. レコードを登録するseminar = Seminar.new( :title => Ruby on Rails 入門, :date => Date.today)seminar.save インスタンスを作って save する DEMO
  53. 53. Form から DBへ画面 <%= text_field :seminar, :title %> リクエストパラメータ {:seminar => {:title => 値}}コントローラseminar = Seminar.new(params[:seminar])
  54. 54. バリデーションsave を呼ぶと、内部でバリデーションメソッドが走る空でないか? ユニークか? etc違反があれば、保存されない DEMO
  55. 55. 登録の前後に好きな処理を挟めるコールバックbefore_savebefore_validationafter_savecreate専用、update専用もある
  56. 56. レコードを検索する全件検索 @seminars = Seminar.find(:all)2008年開催のものを検索する@seminars = Seminar.find(:all, :conditions => "date >= 2008-01-01 and date < 2009-01-01") DEMO
  57. 57. find_by_xxx find_by_date など、カラムごとの検索 メソッドが自動的に使えるようになるtoday_seminars =Seminar.find_by_date(Date.today) DEMO
  58. 58. joinfind のオプションで :joins で JOIN句をそのまま記述するjoin したデータを後で使うなら、「関連」を使うほうが楽
  59. 59. 「関連」を使った検索 「Seminar」には「Participant」(参 加者)が複数いる<% for p in seminar.participants %> ... 参加者情報の表示 ...<% end %> DEMO
  60. 60. 1 対 多の関連を張るclass Seminar < ActiveRecord::Base has_many :participantsendclass Participant < ActiveRecord::Base belongs_to :seminarend DEMO
  61. 61. 関連を使うセミナーオブジェクトから参加者を得るparticipants = seminar.participants参加者オブジェクトからセミナーを得るseminar = participant.seminar
  62. 62. 関連の Eager LoadingSeminar.find(:all, :include => :participants) 一度の検索で関連オブジェクトも取得 デフォルトは Lazy Loading
  63. 63. count, max などcount = Seminar.countlast_date = Sminar.maxmum(date)
  64. 64. 必要な情報だけを 取得するdates = Seminar.find(:all, :select => date) 必要なカラムの情報だけを取得するこ ともできる DEMO
  65. 65. SQLの チューニングActiveRecord が実際に使ったSQLは開発ログに出るそれを見ながらチューニングいざとなったらSQLを書く手も
  66. 66. モデルを設計するオブジェクト指向とテーブル設計をいったりきたりしながら最適なポイントを探す両者のギャップを埋めるための高度な機能が存在
  67. 67. 高度な機能単一テーブル継承ポリモーフィック関連
  68. 68. 単一テーブル継承 継承関係にある複数のクラスを class table class class1つのテーブルに対応づける
  69. 69. 単一テーブル継承テーブルの type カラムにクラス名が格納される操作対象のクラスによって、ActiveRecord がよきにはからうオブジェクト指向で作れる
  70. 70. ポリモーフィック関連 * 1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
  71. 71. ポリモーフィック関連 * 1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
  72. 72. ポリモーフィック関連タグが * 1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
  73. 73. ポリモーフィック関連タグが いろいろなものにつく * 1複数のテーブル(=クラス)を、どれも同じ関連であると見なす
  74. 74. ActiveRecord 凄い!オブジェクト指向で開発できる自由度が高い規約どおりにつくればコード量がとても少なくて済む
  75. 75. RoR の開発現場アジャイルがお奨めモデル設計 → URL設計 → 実装10人くらい参加しても大丈夫
  76. 76. ありがちな心配コンパイル時のチェックがなくて品質は大丈夫か?分業しづらい?大規模開発に向かない?パフォーマンスが悪い?
  77. 77. 案外大丈夫テストをしっかりやれば品質は上げられるオブジェクト指向に乗っ取れば分業はまったく問題ない大規模開発もできるただし、楽しくなくなるかも
  78. 78. パフォーマンス何も気にせず作ると、かなり遅いチューニング必須キャッシュやDBまわりのチューニングでかなり速くなる
  79. 79. テストRails には 3種類のテストフレームワークが備わっているUnit テストは使いやすいコントローラ・ビューのテストはSelenium が便利
  80. 80. Ruby, Rails の習得Java経験者なら構文はすぐ習得1ヶ月もすれば開発戦力にらしい プログラムを書くには3ヶ月くらいかかる
  81. 81. 私の重視する開発習慣コミュニケーション名前づけの重視DRY(同じコードを重複して書かない)の追求まず仮定し、あとで調節する
  82. 82. RoRに必要な マインドフレームワークに合わせる協調性フレームワークを拡張する勇気プラグインとの適切な距離感
  83. 83. Rails に合わせるRails の規約に従わないことは可能大きなコストが伴うできるだけ仕様をRailsに合わせることが高い生産性を得るコツ
  84. 84. Rails に呑まれないRails にないからといって諦めないRuby も Rails も動作を上書きできる何でもできる勇気を持つ
  85. 85. やりすぎないできるとやりたくなる過ぎたるは及ばざるがごとし改変ではなく拡張にとどめるバランスが難しい
  86. 86. プラグインいろいろ使えるようになっておくと開発がとても早いソースを読む覚悟で使う国際化不足のものもあるRailsのバージョンアップがしづらくなったりする
  87. 87. サービス紹介Web家計簿「小槌」BookScopeImageUpload プラグイン
  88. 88. 小槌 http://www.kozuchi.netユーザー間の貸し借り連動記入など
  89. 89. BookScope http://bookscope.net貸し借り管理のできる蔵書システム
  90. 90. ImageUpload プラグインhttp://imageupload.rubyforge.org/伊藤忠商事 Tlab で開発かっこよく画像をアップロードするプラグイン
  91. 91. ご静聴ありがとうございました。 ご指摘・ご質問等は y.ohba@everyleaf.com までお願いします。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×