Progate復習用note ~ Ruby 学習コース ~
これはProgateの Ruby 学習コースを学んだ方に、あとから学んだ内容を思い返したいときに使用していただくために作成したnoteです。ぜひ、復習やコードを忘れてしまった際に活用していただければと思います。
Ruby を学んだことがない方も、読めばある程度は理解できるように書いています。なので勉強に使っていただくのもいいと思います。その際の質問も、どしどし受け付けております! ですが、基本的にはProgateで学習された方へ向けて、簡単に書いております。理解が難しい部分がありましたら申し訳ありません。
なお、質問や内容に不備・追加の要望等がございましたらコメント欄、またはTwitter(@sk_403)までお願いします。
目次
1. Rubyとは
2. 機能の解説
・変数
・配列
・ハッシュ
・メソッド
・クラスとインスタンス
3. 命令文一覧
・コメント
・出力
・入力
・条件分岐
・配列の繰り返し
4. 終わりに
1. Rubyとは
動的なWEBアプリケーションの「システム」をつくるためのプログラミング言語の一つで、オブジェクト指向型のスクリプト言語。ほかの言語と比べ、Ruby は純粋に楽しみのために設計され、言語を作る人、使う人、学ぶ人すべてが楽しめることを目的としている。Rubyを用いて開発されたものの代表としては、CookpadやGunosyなどが挙げられる。
※スクリプト言語とは、プログラミング言語のうち、プログラムの記述や実行を比較的簡易に行うことができる言語の総称である。
また、RubyMotionというソフトウェアを使用することでAndroid、IOSのアプリを開発をすることもできる。
2. 機能の解説
・変数
文字や数値などの値を入れておく箱のようなもの。「変数名 = 値」の形で定義する。定義した後は、その変数は代入した値として扱うことができる(逆に、定義する以前の記述ではその変数は使用できない)。数値が入った変数はその数値として扱うことができ、変数同士や変数と整数で計算をすることができる。
変数名をつける際のルールとして、以下の3つが決められている。
1) 1文字目は英小文字(数字は使用不可)または、「 _ 」(アンダーバー)
2) 2文字目以降は英数文字または、「 _ 」
3) 予約語は使用できない
※予約語とは、「end」などの既に別の用途が割り当てられた識別子のことである。
[入力]
myouji = "本田"
namae = "竜也"
age = 19
puts myouji + namae + "さんの年齢は"
puts age
[出力]
本田竜也さんの年齢は
19
変数の値を文字列に含めるには、文字列の中で「#{変数名}」というようにする。これを変数展開という。
なお、変数展開をする際には「' '」ではなくて、「" "」を使用しなければいけない。(変数が置き換えられず、そのまま出力されてしまう。)
[入力]
name = "竜也"
age = 19
puts "#{name}さんの年齢は、#{age}歳です。"
puts '#{name}さんの年齢は、#{age}歳です。'
[出力]
竜也さんの年齢は、19歳です。
#{name}さんの年齢は、#{age}歳です。
また、一度代入した変数に再度代入をすると、もともと入っていた値は上書きされてしまうという性質がある。代入は自分自身の値を使ってすることもできる。
[入力]
age = 2
puts age
age = 9
puts age
age = age + 10
puts age
age += 10
puts age
[出力]
2
9
19
29
※自分自身に代入するとき、省略形として「変数名 += 値」などの形にすることもできる。
・配列
複数の値をまとめて扱いたい際に使用する。例えば、ユーザー名が複数ある場合、それぞれを変数として定義するよりも配列としてまとめて適宜するほうが効率がよい。書き方は、「 [値1, 値2, 値3] 」の形である。配列も変数に代入することができ、「puts」を使うことで、配列内の値を出力することができる。
[入力]
names = ["Taro" , "Jiro" , "Ryusuke" , "Takuma"]
puts names
[出力]
Taro
Jiro
Ryusuke
Takuma
配列の要素は、前から順に「0, 1, 2, ...」と数字が割り振られている。これをインデックス番号という。配列の各要素は、「 配列名[インデックス番号] 」とすることで用いることができる。また、これは変数展開でも使用できる。
[入力]
names = ["Taro" , "Jiro" , "Ryusuke" , "Takuma"]
puts names[0]
puts "Hello!! #{names[3]}"
[出力]
Taro
Hello!! Takuma
・ハッシュ
配列と同様に、複数の値をまとめて管理する方法。配列は複数の値を並べて管理するのに対して、ハッシュはそれぞれの値にキーと呼ばれる名前をつけて管理する。ハッシュは、「 {キー1 => 値1, キー2 => 値2} 」の形で作る。
配列と同様に、変数に代入することができる。「 puts 」を使用すると、定義したハッシュがそのまま出力される。
[入力]
user = {"name" => "Tatsuya" , "age" => 19}
puts user
[出力]
{"name"=>"Tatsuya", "age"=>19}
ハッシュの各要素の値は、対応するキーを使って、「 ハッシュ[キー] 」とすることで用いることができる。また、「 ハッシュ[キー] = 値 」と書くことで、キーと対応している値を更新することができる。
「 ハッシュ[新しいキー] = 値 」と書くことで、ハッシュに新しい要素を追加することができる。
[入力]
user = {"name" => "Tatsuya" , "age" => 19}
puts user["name"]
user["name"] = "Satoshi"
user["gender"] = "male"
puts user
[出力]
Tatsuya
{"name"=>"Satoshi", "age"=>19, "gender"=>"male"}
ハッシュは、キーの部分を文字列ではなく、先頭に「 : 」(コロン)を付けた書き方をすることもできる。この書き方のことをシンボルと言う。
文字列とシンボルは厳密には異なるが、基本的には同じように使用することができる。
[入力]
user = {:name => "Tatsuya" , :age => 19}
puts "Ruby"
puts :Ruby
puts user[:name]
[出力]
Ruby
Ruby
Tatsuya
また、ハッシュのキーにシンボルを用いるときには、省略した書き方をすることができる。具体的には「 :key => 」を「 key: 」というようにすることができる。
[入力]
user = {name:"Tatsuya" , age:"20"}
puts user[:name]
[出力]
Tatsuya
※要素を取得する場合には「 :key 」のようにシンボルを用いる必要がある。
ハッシュに存在しないキーを指定すると、なにも表示されない。ハッシュから存在しないキーの値を取り出した時の「何もない」という値は、Rubyでは「 nil 」(ニル)という特別な値で表現される。「 nil 」は「何もない」という意味なので、putsしても何も表示されない。
[入力]
user = {name:"Tatsuya" , age:"20"}
puts user[:name]
puts user[:gender]
[出力]
Tatsuya
このような現象は、if文を使用することで回避できる。実は、if文の条件には、真偽値以外も使うことができる。Rubyでは、ifの条件に真偽値以外を用いたとき、それがnilであればfalseとして扱われ、それ以外はtrueとして扱われる。
つまり、「 if ハッシュ[キー] 」とすることで、値がない場合、すなわちnilの場合はfalseとして扱われる。
[入力]
user = {name:"Tatsuya" , age:20}
if user[:gender]
puts "#{user[:name]}さんは、#{user[:gender]}です。"
else
puts "#{user[:name]}さんの性別は秘密です。"
end
user[:gender] = "男"
if user[:gender]
puts "#{user[:name]}さんは、#{user[:gender]}です。"
else
puts "#{user[:name]}さんの性別は秘密です。"
end
[出力]
Tatsuyaさんの性別は秘密です。
Tatsuyaさんは、男です。
配列の要素には、文字列や数値だけでなく、ハッシュも使うことができる。その際、コードが横に長くなることを防ぐために、下の例のように要素ごとに改行することがよくある。
配列に入ったキャッシュは、「 配列[インデックス番号] 」で対応するハッシュを用いることができる。また、そのハッシュを代入した変数をつかって、「 変数[キー] 」とすることでハッシュの要素の値を用いることができる。
[入力]
users = [
{name:"Satoshi" , age:20} ,
{name:"Tatsuya" , age:32}
]
puts user[0]
user = user[0]
puts user[:name]
[出力]
{:name=>"Satoshi", :age=>20}
Satoshi
また、上記の配列の要素内のキャッシュを取り出す記述を、変数を用いずに書くと...
[入力]
users = [
{name:"Satoshi" , age:20} ,
{name:"Tatsuya" , age:32}
]
puts users[1][:name]
[出力]
Tatsuya
ハッシュが値の配列でeach文を使うと、「 | | 」に囲まれた変数がハッシュになっていることがわかる。これは、変数に、配列の各要素が順番に代入されるためである。
そして、each文のなかで、「 変数[キー] 」とすることで、ハッシュの中の値を使うことができる。
[入力]
users = [
{name:"Satoshi" , age:20} ,
{name:"Tatsuya" , age:32}
]
users.each do |user|
puts user
puts user[:name]
end
[出力]
{:name=>"Satoshi", :age=>20}
Satoshi
{:name=>"Tatsuya", :age=>32}
Tatsuya
・メソッド
複数の処理を1つにまとめたもの。メソッドは、「 def メソッド名 」と「end」の間に、まとめたい処理を書くことでつくることができる。このことを「メソッドを定義する」という。
メソッドは、「メソッド名」だけを書くことで実行できる。メソッドを実行することを、「メソッドを呼び出す」という。
[入力]
def introduce
puts "はじめまして!"
puts "私の名前はさとしです。"
end
introduce
[出力]
はじめまして!
私の名前はさとしです。
メソッドを呼び出すときに一緒に引数を渡すことで、メソッドの中でその値を利用することができる。引数とはメソッドに与える追加情報のようなもので、文字列や数値を渡すことができる。引数はメソッド内では変数のように使用することができる。
引数を渡せるメソッドを定義するには、「 def メソッド名(引数名) 」の形でメソッドを定義する。なお、メソッドを定義するときに用意した引数は、そのメソッドの中でしか使うことができない。
[入力]
def introduce(name)
puts "はじめまして!"
puts "私の名前は#{name}です。"
end
introduce("さとし")
introduce("たつや")
[出力]
はじめまして!
私の名前はさとしです。
はじめまして!
私の名前はたつやです。
引数は、括弧の中に受け取る引数を「 , 」(コンマ)で区切って並べることで、複数の引数を指定することができる。
引数は、左から順番に「第1引数、第2引数」というように呼ぶ。
[入力]
def introduce(name , age)
puts "はじめまして!"
puts "私の名前は#{name}、#{age}歳です。"
end
introduce("さとし" , 20)
introduce("たつや" , 32)
[出力]
はじめまして!
私の名前はさとし、20歳です。
はじめまして!
私の名前はたつや、32歳です。
「 return 値 」と書くことで、メソッドはその値を戻り値として返します。戻り値とは、呼び出し元で受け取る処理結果のことである。このことを「メソッドが戻り値を返す」という。
戻り値がある場合、メソッドの呼び出し部分がそのまま戻り値に置き換わる。なので、図メソッドの呼び出し部分を変数に代入するように書くことで、メソッドの戻り値を受け取ることができる。
[入力]
def add(a,b)
return a + b
end
num = add(10,30)
puts "10+30=#{num}"
[出力]
10+30=40
戻り値も引数と同様に、様々な値を用いることができる。例えば、if文で使うような条件式をreturnすると、その条件式の結果として得られる真偽値を返すことができる。
真偽値を返すメソッドは、メソッド名の末尾に「?」をつける慣習がある。(あくまで慣習なので、つける義務はない。そうしたほうが良いというだけである。)
[入力]
def nation?(num)
return num > 0
end
puts nation?(50)
[出力]
true
returnはメソッドを終了させる機能も持っているので、retuenの後に書かれた命令は実行されない。この性質により、条件分岐を組み合わせることで複数のreturnを用いることができる。
[入力]
def judge(num)
puts "#{num}点です。"
if num > 80
return "よくできました!"
puts "計算終了"
end
return "もっとがんばりましょう..."
puts "計算終了"
end
puts judge(99)
puts judge(37)
[出力]
99点です。
よくできました!
37点です。
もっとがんばりましょう...
※puts "計算終了"は、returnの後に書かれているので、実行されない。
キーワード引数を用いた書き方をすることで、呼び出し側で引数を明記することができる。キーワード引数は、通常の引数の書き方に加えて
① 定義側で、引数の後に「 : 」(コロン)を付ける
② 呼び出し側で、値の前に引数名を書く
とすることで、書くことができる。
引数の数が多くなると、呼び出し側で値がどの引数に入るのかがわかりにくくなるが、キーワード引数を用いればそのような事態を避けることができる。
[入力]
def introduce(name: , age: , food:)
puts "はじめまして!"
puts "私の名前は#{name}、#{age}歳です。"
puts "好きな食べ物は、#{food}です"
end
introduce(name:"たつや" , age:32 , food:"たこやき")
[出力]
はじめまして!
私の名前はたつや、32歳です。
好きな食べ物は、たこやきです。
※メソッド内の変数展開で使用する際には、「 : 」はつけない
・クラスとインスタンス
プログラミングで様々な情報を持つ「もの」を作成するには、その設計図である「クラス」が必要である。クラスをもとに生成される「もの」のことを「インスタンス」と呼ぶ。生成の流れは、①クラスの作成 → ②クラスをもとに、空のインスタンスの生成 → ③インスタンスに情報を与える の3段階である。
クラスは、「class クラス名」とすることで定義できる。終わりには「end」を書く必要がある。ただし、クラス名は必ず大文字で始めなければならない。
クラスに情報を持たせるためには、「attr_accessor シンボル」のように記述する。この時の情報を、インスタンス変数という。
[入力]
class Menu
attr_accessor :name
attr_accessor :price
end
[出力]
クラスを元に、新しくインスタンスを生成するには、「クラス名.new」とする。また、「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入することができる。
空のインスタンスに情報を追加するには、「インスタンス.変数名 = 値」とする。もちろん、代入したインスタンス変数の値を用いることができる。
[入力]
class Menu
attr_accessor :name
attr_accessor :price
end
menu1 = Menu.new
menu1.name = "すし"
menu2 = Menu.new
nemu2.name = "ハンバーガー"
puts menu1.name
puts menu2.name
[出力]
すし
ハンバーガー
クラスの中で定義したメソッドは、インスタンスに対して使うようにして呼び出すことができる。呼び出すときには、「インスタンス.メソッド名」のようにする。このようなメソッドのことを、インスタンスメソッドという。
[入力]
class Menu
attr_accessor :name
attr_accessor :price
def show(data)
return "私は#{data}です。"
end
end
menu1 = Menu.new
puts menu1.show("メニュー")
[出力]
私はメニューです。
インスタンスメソッドの中で、インスタンス変数を使用するには、特殊な変数「self」を用いて「self.変数名」とする。
[入力]
class Menu
attr_accessor :name
attr_accessor :price
def show_name
puts "私は、#{self.name}です。"
end
end
menu1 = Menu.new
menu1.name = "すし"
menu1.show_name
[出力]
わたしは、すしです。
initializeメソッドを使用すると、インスタンスを生成した直後に処理を実行することができる。initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出される。
[入力]
class Menu
attr_accessor :name
attr_accessor :price
def initialize
puts "自動で表示されます。"
self.name = "ハンバーガー"
end
end
menu1 = Menu.new
puts menu1.name
[出力]
自動で表示されます。
ハンバーガー
initializeメソッドには、「クラス.new」に対して引数を渡すことで、その値を渡すことができる。また、initializeメソッドでインスタンス変数に引数の値を代入することで、インスタンス毎にインスタンス変数の値を変えることができる。その際、キーワード引数を使うことで見やすく書くことができる。
[入力]
class Menu
attr_accessor :name
attr_accessor :price
def initialize(name: , price:)
self.name = name
self.price = price
end
end
menu1 = Menu.new(name:"ハンバーガー" , price:1000)
puts menu1.name
puts menu1.price
[出力]
ハンバーガー
1000
クラスの定義部分をほかのRubyファイルに移すことで、クラスを管理しやすくすることができる。その際、元のファイルでも移動したクラスを使用できるようにするために、「require "./ファイル名"」とする。
以下の例では、Menuクラスを「munu.rb」というファイルに移し、それを「index.rb」ファイルで呼び出している。
[入力](index.rb)
require "./menu"
menu1 = Menu.new(name:"ハンバーガー" , price:1000)
menu1.info
[入力](menu.rb)
class Menu
attr_accessor :name
attr_accessor :price
def initialize(name: , price:)
self.name = name
self.price = price
end
def info
puts "商品名:#{self.name} 値段:#{self.price}円"
end
end
[出力](index.rbを実行)
商品名:ハンバーガー 値段:1000円
あるクラスを元にして新たなクラスをつくることを「継承」と呼ぶ。
「class 新しいクラス名 < 元となるクラス名」とすることで他のクラスを継承して、新しいクラスを定義することができる。このとき、新しいクラスは「子クラス」、元となるクラスは「親クラス」と呼ばれる。
継承をすると、子クラスは親クラスのインスタンス変数とインスタンスメソッドを引き継ぎ、それらを呼び出すことが出来る。
[入力](index.rb)
require "./menu"
food1 = Food.new(name:"ハンバーガー", price:460)
food1.info
[入力](menu.rb)
class Menu
attr_accessor :name
attr_accessor :price
def initialize(name: , price:)
self.name = name
self.price = price
end
def info
puts "商品名:#{self.name} 値段:#{self.price}円"
end
end
class Food < Menu
end
[出力]
商品名:ハンバーガー 値段:460円
子クラスには、新しくインスタンス変数やインスタンスメソッドをを追加することができる。また、親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書きする。これをメソッドの「オーバーライド」と呼ぶ。
オーバーライドしたメソッドの中で「super」とすることで、親クラスの同名のメソッドを呼び出すことができる。ただし、あくまでメソッドを呼び出しているだけなので、親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要がある。
[入力](index.rb)
require "./menu"
food1 = Food.new(name:"ピザ" , price:800 , calorie:1600)
food1.info
[入力](menu.rb)
class Menu
attr_accessor :name
attr_accessor :price
def initialize(name: , price:)
self.name = name
self.price = price
end
def info
puts "商品名:#{self.name} 値段:#{self.price}円"
end
end
class Food < Menu
attr_accessor:calorie
def initialize(name: , price: , calorie:)
super(name:name , price:price)
self.calorie = calorie
def info
puts "商品名:#{self.name} 値段:#{self.price}円 カロリー:#{self.calorie}kcol"
end
end
[出力](index.rbを実行)
商品名:ピザ 値段:800円 カロリー:1600kcol
クラスに対して呼び出されるメソッドを「クラスメソッド」といい、「def クラス名.メソッド名」とすることで定義できる。インスタンスメソッドとの違いはメソッド名の前にクラス名を書く必要がある点である。
呼ぶ出す際には、定義時と同じように、「クラス名.メソッド名」とする。
[入力]
class Menu
attr_accessor :name
attr_accessor :price
def initialize(name:, price:)
self.name = name
self.price = price
end
def Menu.is_discount_day?
today = Date.today
return today.sunday?
end
end
puts Menu.is_discount_day?
[出力]
false
※「Date.today.sunday?」では、今日が日曜日かどうかを判断して、trueまたはfalseを出力します。これを書いたのは木曜日なので、falseです。
3. 命令文一覧
#:コメントを書く部分。これが先頭にある行は出力には影響しないので、自由に記述することができる。
[入力]
puts "Ruby"
# この文も、下のputsもコメントだよ。
# puts "world"
[出力]
Ruby
puts:文字や数値を表示する命令。文字を出力する場合はputs '○○' またはputs "○○"のように、出力したい文字を「' '」(クォーテーション)または「" "」(ダブルクォーテーション)で囲む。数値を出力する場合は必要ない。また「+」の記号を用いて、文字列同士を連結することができる。putsのあとには「 」(半角スペース)を空ける。
[入力]
puts "Hello Note!"
puts 8 + 9
puts "Hello" + "Ruby"
[出力]
Hello Note!
17
HelloRuby
require:外部のファイルを読み取る際に使用する。「require:"./ファイル名"」と記述することで、「ファイル名.rb」という名前のRubyファイルを読み取る。ただし、読み取ることができるのは同じファイルに保存されているRubyファイルに限る。
例えば、「index.rb」というファイルで「require "./intro.rb"」と入力すると、「intro.rb」という名前のファイルで書かれている命令文を読み取ることができる。
[入力](index.rb)
require "./intro.rb"
[入力](intro.rb)
class Intro
attr_accessor :name
def initialize(name:)
self.name = name
end
end
intro1 = Intro.new(name:"きよし")
puts "#{intro1.name}といいます。"
[出力](index.rbを実行)
きよしといいます。
プログラム内で日付を使用する際には、Dateクラスをrequireで読み込む。Dateクラスは、「Date.new(年 ,月 , 日)」とすることでインスタンスを生成することができる。これをputsすると、その日付が表示される。Dateクラスには、このほかにも多くのインスタンスメソッドが用意されている。詳しくはこちらをどうぞ。
[入力]
require "date"
date1 = Date.new(2012,03,22)
today = Date.today
puts date1
puts today
[出力]
2012-03-22
gets.chomp:このコードが実行されると、コンソールが入力待機状態になり、文字列を入力することができるようになる。「変数 = gets.chomp」とすれば、入力された値を変数に代入することができる。
入力した文字は、数字でもすべて文字列として扱われてしまうので、計算などに用いる場合は、これを数値に変換する必要がある。入力された内容を数値に変換し、計算などにも使えるようにするには、「gets.chomp.to_i」とする。
[入力]
puts "文字列を入力してください。"
str = gets.chomp
puts "足したい数値を2つ入力してください。"
one = gets.chomp.to_i
two = gets.chomp.to_i
puts "入力された文字列は「#{str}」です。"
puts "2つの値を足した数は「#{one + two}」です。"
[出力]
文字列を入力してください。
ぱんだ
足したい数値を2つ入力してください。
45
55
入力された文字列は「ぱんだ」です。
2つの値を足した数は「100」です。
※出力の2行目、4行目、5行目は、キーボードから入力された数値、文字列である。
each文:配列の要素を順番に取り出して処理を行うことができる。「 配列.each do |変数名| 」と書き、「end」までの間に実行したい処理を書く。each文は配列の要素の数だけ繰り返し処理を行い、「 | | 」で囲まれた変数に配列の要素が1つずつ入っていき、その上でeach文の中の処理が実行されていく。
「 | | 」内で定義された変数は、each文の中でしか使用できない。一方でeach文外で定義された変数はeach文内外で使用できる。このような、変数が使用できる範囲をスコープという。
[入力]
names = ["Taro" , "Jiro" , "Ryusuke" , "Takuma"]
names.each do |name|
puts "私の名前は#{name}です。"
end
[出力]
私の名前は、Taroです。
私の名前は、Jiroです。
私の名前は、Ryusukeです。
私の名前は、Takumaです。
※「 | | 」の変数名は何でもよいが、慣習上では配列の列の変数名(names)の単数形(name)にすることが多い。
if文:もし○○ならば、XXを行うという条件分岐を行うことができる文。ifのうしろに条件式を書き、成り立つ場合のみに処理を実行し、成り立たないときなにもしない。ただし、else文を追加することで、成り立たなかった場合の処理を実行することもできる。if文の終わりには、必ずendをつける
[入力]
age = 40
if age > 30
puts "入場料は無料です。"
else
puts "入場料は100円です。"
end
[出力]
入場料は無料です。
if文は、真偽値とよばれる値によって出力を変えている。真偽値には、trueとfalseが存在し、成り立つときはture、そうでないときはfalseとなる。真偽値を見るには、「puts 条件式」の形にすればよい。
[入力]
age = 20
puts age < 60
age = 90
puts age < 60
[出力]
true
false
※条件式で使われる演算子としては、「>」、「>=」、「<」、「<=」、「==」(等しい)、「!=」(等しくない)などがある。また、「&&」(かつ)や「||」(または)を用いて複数の条件をつけることもできる。
else文にさらに条件式を加えた、elsif文もある。基本的に書き方は変わらない。
[入力]
age = 14
if age > 30
puts "入場料は無料です。"
elsif age > 10
puts "入場料は200円です。"
else
puts "入場料は100円です。"
end
[出力]
入場料は200円です。
※elsif文では、複数の条件に合致したとしても実行されるのは一つである。基本的には上から順に処理されていくので、最初に合致した条件の処理が実行されることになる。
4. 終わりに
ほかの言語のまとめnoteも作っていく予定です。「この言語のまとめnoteが欲しい!」、「こういう情報が欲しい!」、「この言語で出来ること教えて!」等々、要望がございましたら、お気軽にコメント欄、またはTwitter(@dm_403)までご連絡ください。私のこたえられる範囲で答え、わからないことは調べてすぐにお答えします!
この記事が気に入ったらサポートをしてみませんか?