Webエンジニア目指して#39
どうもスマブラマンです。
新キャラ実装日ですね。ゼノブレ2やる前にホムラヒカリ来ちゃったな〜クリア後だったらすごいテンション上がってたと思います。
残すは2キャラ、一体何が来るんでしょう。アルルきて(切望)
さてProgateのRails Vやっていきましょう
バリデーションで空の投稿を防ぐ
データベースに保存されるデータをチェックし、意図しないものは弾くシステムのことをバリデーションという
モデルファイルに対して記述する
class Post < ApplicationRecord validates :message,{presence: true} end
第2引数の{presence: true}
が空の文字数を弾くバリデーション
第1引数のmessage
カラムに対して動作する
これを記述した状態でmessageカラムが空のレコードを保存してみると、 falseと出て失敗する(本来はtrueと出て保存内容が表示される)
actionに組み込んでやるとそのままスルーする これで空の投稿や編集ができちゃう問題は解決
バリデーションで文字数制限
validates :message,{length: {maximum:140}}
{length: {maximum:140}
の部分が文字数制限。
下のように他のバリデーションとまとめて書くことができる
validates :message,{presence: true,length: {maximum:140}}
バリデーションの結果で表示を変える
バリデーションに引っかかる状態でsaveメソッドを使ったらfalseを返すのを利用して、if文に組み込む
いつぞやの新規投稿actionを書き換える
def save @post=Post.new(message: params[:message]) if @post.save redirect_to("/post/index") else redirect_to("/post/#{@post.id}/new") end end
if文の条件でしかsaveメソッドを書いてないがちゃんと実行した上で分岐をしてくれるらしい 結果はこんな感じ
renderメソッド
render("controller名/viewファイル名")
routingアドレスを書かないように注意、viewファイルを直接参照する。接頭に/
がないのにも注意
render
はviewを再描画する
redirect
だと単純に再読み込みをするためactionの再実行によって入力した文字列が上書きされてしまうが、render
は定義や代入した変数は保持されるため、再描画直前の入力情報を表示させることが可能
以下の例のように、バリデーションで引っかかった際にrender
を使って直前の入力情報が表示されるようにする
投稿ページ(new.html.erb)
<div class="main"> <h1>新規投稿</h1> <%= form_tag("/post/save") do %> <textarea name="message"><%= @post.message %></textarea> <input type="submit" value="投稿"> <% end %> </div>
新規投稿画面だが再描画直前の入力を読み込ませるため、textareaに@post.message
を仕込んだ
saveアクション
def save @post=Post.new(message: params[:message]) if @post.save redirect_to("/post/index") else render("post/new") end end
バリデーションに引っかかりsave
がfalseを返したときにrender
で再描画をさせる
再描画時点では@post.message
は入力したレコードが代入されているため、viewで仕込んだtextareaに拾ってもらえる
newアクション
def new @post=Post.new() end
viewに@postを書いているため、saveアクションが実行されるまでは定義されていない変数があることになり、最初にnewページを開いたときにエラーが出てしまう
これを防ぐために@postに空のレコードを入れておいた
投稿エラーメッセージを表示させる
下図のように、save
がfalseを返すときにレコード.errors.full_messagesの中にエラーメッセージが配列として入力される
save
を実行するまではerrorsが空なことを利用してviewに仕込んでおく
<div class="main"> <h1>新規投稿</h1> <% @post.errors.full_messages.each do |err| %> <%= err %> <% end %> <%= form_tag("/post/save") do %> <textarea name="message"><%= @post.message %></textarea> <input type="submit" value="投稿"> <% end %> </div>
結果 なんか英語だがバリデーションの内容に対応したエラーメッセージが出ている、なんて便利なんだ
flash[:notice]
viewを一度表示したらnilにリセットされる変数。
保存に成功しました、みたいなメッセージ表示に使う
viewの上らへんにこんな感じで置いて、flash[:notice]に中身があるときだけ表示させる
<% if flash[:notice] != nil %> <div class="flash"> <%= flash[:notice] %> </div> <% end %>
saveアクションに仕込んでみた
def save @post=Post.new(message: params[:message]) if @post.save flash[:notice]="新しく投稿しました" redirect_to("/post/index") else render("post/new") end end
結果
似たようなものを削除actionや編集actionに仕込んでRails Vはおしまい!ではでは。
Webエンジニア目指して#38
どうも桃鉄マンです
名古屋に戻ったということで、久しぶりに友人と集まり桃鉄とスマブラをしました。やっぱりオフラインじゃないと得られる楽しさが違いますね。最高の時間でした
さてProgateのRails IVです
getとpostの違い
get...データベースに変更を加えない post...データベースに変更を加える
データベースからレコードを編集する流れ
変数A=モデル名.find_by(編集対象のカラム名:値)
変数A.内容を変更したいカラム名
変数A.save
編集ページの作成
詳細ページから編集ページへのリンク(detail.html.erb)
<%= link_to("編集","/post/#{@post.id}/edit") %>
link_to
を使って閲覧中の詳細レコードのidを取得し編集ページへ飛ばす
編集ページ(edit.html.erb)
<textarea name="message"><%= @post.message %></textarea> <input type="submit" value="保存">
後述のactionから対象のレコードのmessageカラムを取得しtextareaのデフォルト表示にする
routing
get 'post/:id/edit'=> 'post#edit'
このように変数は末尾じゃなくても仕込める
controller
def edit @post=Post.find_by(id: params[:id]) end
:idをURLから拾って、編集対象のレコードを取得する
編集機能の実装
編集ページ
<%= form_tag("/post/#{@post.id}/update") do %> <textarea name="message"><%= @post.message %></textarea> <input type="submit" value="保存"> <% end %>
form_tag
を使って:message
をupdateアクションに送信
routing
post 'post/:id/update' => 'post#update'
:id
も一緒に送信する
action
def update @post=Post.find_by(id: params[:id]) @post.message=params[:message] @post.save redirect_to("/post/index") end
編集対象レコードを取得し、編集内容の:message
をmessageカラムに代入し、saveメソッドを実行→投稿一覧にリダイレクト
結果
データベースからレコードを削除する流れ
変数A=モデル名.find_by(編集対象のカラム名:値)
変数A.destroy
削除機能の実装
routing
post 'post/:id/delete' => 'post#delete'
今回は直でdestroyメソッドのactionへ通したい
詳細ページから削除actionへのリンク
<%= link_to("削除","/post/#{@post.id}/delete", {method:"post"}) %>
link_to
はgetで記述されたactionしか検索しないらしい
このように第3引数に,{method:"post"}
をつけることでpostで記述したものを検索してくれる
action
def delete @post=Post.find_by(id: params[:id]) @post.destroy redirect_to("/post/index") end
対象レコードを取得しdestroy
メソッドで削除、一覧へリダイレクト
結果
Webエンジニア目指して#37
どうもハロワマンです
ようやく失業給付の申請ができました。結構受け取りまで時間かかるんですね、もらうまでに転職終わっちまうぜ?
今回はProgateのRails 道場編 Iなのでwebアプリを立ち上げるまでの流れのまとめみたいな感じです
流れ
rails new アプリケーション名
rails s
rails g controller コントローラー名 ビュー名
html,cssなど見た目の部分の編集、構築 ページを増やしたらroutingとactionも増やす
rails db:migrate
consoleでDBテスト
後はviewやらcontrollerをゴリゴリ書く
以上
すんなり道場編はクリア〜 ではでは。
Webエンジニア目指して#36
どうもラクママンです。 使ってないものを金にすべくせこせこ出品してます。本当は引っ越す前に終わらせるつもりだったけど働いてるとリフレッシュで精一杯でしたね
さてProgateのRails IIIです。
投稿ページの作成
前回のactionとデータベースを利用してWebページにレコードの特定の値を表示させる機能を使って投稿をできるようにする
モデル名.find_byメソッド
テーブルから目的の値を持ったレコードを持ってきてくれる
変数に代入して欲しい条件の欲しい値を使ったりなどに利用する
routingのURLにidを含める
routingにget 'post/:id' => 'post#details'
のような記述をすると、
URLが/post/1
や/post/aiueo
のように
末尾が何の文字でも指定したactionを参照する(post以降の/
が1個の場合のみ)
ユーザーidごとにそのユーザーに対応したページを表示させる、などが可能になる
URLからidを取得する
routingにidを仕込んだ状態で、参照先のactionに@id=params[:id]
を記述すると、
変数@id
にURL末尾の文字列が代入される
これをviewに利用したりする
投稿詳細ページ
上記を組み合わせて投稿詳細ページを作ってみる
view
<h1>投稿詳細</h1> <%= @post.message %> <%= @post.created_at %>
controller
class PostController < ApplicationController def details @post=Post.find_by(id: params[:id]) end end
routing
Rails.application.routes.draw do get 'post/:id' => 'post#details' end
結果 urlの末尾がpost/1に対してしっかりpostsテーブルのid:1のレコードを返している
投稿詳細ページへのリンク
前回の記事で書いたlink_toメソッドを使って、メインページに並べられた投稿それぞれに詳細のリンクをつける
メインページ
<h1>ruby埋め込みテスト用</h1> <% @posts.each do |post| %> <div class="messages-entire"> <%= link_to(post.message,"/post/#{post.id}") %> </div> <% end %>
詳細ページ
<h1>投稿詳細</h1> <p>--------</p> <%= @post.message %> <%= @post.created_at %> <p>--------</p> <a href="/post/index">戻る</a>
こんな感じ
投稿機能の実装
投稿ページ
htmlのtextareaに入力し投稿ボタンを押したらrailsが内容をデータベースに保存してくれるようにする
以下のようにtextarea
にname属性を付けて、
<%= form_tag("データの送信先パス") do %>
と
<% end %>
で投稿フォームを挟むことで、railsによってname属性をキーとしたハッシュが指定パスへ送られる
view
<%= form_tag("/post/save") do %> <textarea name="message"></textarea> <input type="submit" value="投稿"> <% end %>
また、name属性をつけてform_tag
メソッドで飛ばしたデータは送信先のactionで以下のように受け取ることができる
params[:name属性の値]
例えば、上記のtextareaに"aiueo"と入力し送信した場合は、ハッシュ{message:"aiueo"} を受け取り、params[:message]は"aiueo"を返す
フォーム送信先のrouting
post 'post/save' => 'post#save'
form_tagで指定するrouteはget
ではなくpost
から始める
actionにリダイレクトを仕込む
redirect_to("リダイレクト先URL")
専用のviewを用意していなくても別のviewへ飛ばすことができる。今回の投稿のような、処理だけして一覧へ飛びたいactionに最適
フォーム送信先のaction
ここまで書いたことと、前回の記事でrails consoleを使ってテーブルにレコードを保存したときの知識を使って、Postテーブルへmessageカラムの内容を指定したレコードの作成、保存をさせる。その後投稿一覧へ飛ばす
def save @post=Post.new(message: params[:message]) @post.save redirect_to("/post/index") end
できた
投稿成功
投稿一覧を新しい順に並べ替える
投稿一覧ページのactionにorder
メソッドを使うと読み込みの際に並べ替えができる
def index @posts=Post.all.order(created_at: :desc) end
orderメソッドは:
を2回使うところに注意
結果
というわけでRails III終わり!ではでは
Webエンジニア目指して#35
どうも筋肉痛マンです 思い出したようにワイドスクワットしたら足がヨボヨボになりました
ようやく退職証明書が届いたので色々と動ける!!1月後半はまあまあニート生活になってましたね
のんびりしてると貯金が尽きるので頑張っていこうと思います
というわけでProgateのRails IIです
2個目のcontroller生成
特に気にすることはなくrailsコマンドを使えば生成できる
役割が別のページはcontrollerを分けたほうがいいみたい
$ rails g controller sample aiueo
generate
はg
で略せる
html.erb内で変数宣言をする
.erbはembedded rubyから略されてたんですね
このファイルはrubyの埋め込みが可能で、
<% %>
で囲うとページでの表示なし、
<%= %>
で囲うとページでの表示ありでrubyのコードを記述できる
表示なしを利用して変数宣言などをして、
表示ありを利用して変数の値の出力をする
例
<% message1="こんにちは" %> <%= message1 %>
配列とeach文でテキストを表示する
こんな感じで埋め込みとhtmlを織り交ぜることもできる
<% messages=[ "メッセージ1", "メッセージ2" ] %> <% messages.each do |message| %> <div class="messages-entire"> <%= message %> </div> <% end %>
controller actionにrubyを記述する
一般的には変数の定義はactionで記述するらしい
controller
class PostController < ApplicationController def index @messages=[ "メッセージ1", "メッセージ2" ] end end
html.erb
<div class="main"> <% @messages.each do |message| %> <div class="messages-entire"> <%= message %> </div> <% end %> </div>
こんな感じで@変数名で扱うことでviewとcontrollerで相互的に使える @変数は配列に限らずなんでも使えるっぽい
データベースを用意する
migraionファイルの生成
まずはmigrationファイルというデータベースに指示を出すファイルを生成
railsコマンド$ rails g model テーブル名 カラム名:データ型
例
$ rails g model post message:text
今回は文字を入れるのでデータ型はtext
生成される場所はここ
中身はrubyで何やら書かれていますがまだわからないのでメモは割愛
class CreatePosts < ActiveRecord::Migration[6.1] def change create_table :posts do |t| t.text :message t.timestamps end end end
テーブルの生成
先程のmigrationファイルを使ってデータベースに変更指示を出す
$ rails db:migrate
migrationファイルを作ったらmigrateをしないとどのviewを開いてもエラーが出るそう
migration errorが表示されるのでその際はmigrateが必要
modelの確認
migrationファイルの生成でmodelというものが下図のフォルダに作られている
中身はこれだけ
class Post < ApplicationRecord end
ApplicationRecordを継承したクラスのことをmodelというらしい これがあることで生成したPostテーブルが操作できる
rails consoleでテーブルにレコードを追加する
rails consoleはrubyのコードを入力してEnterをするとその結果をすぐ出力するもの
終了するまでは定義した変数に代入した値など覚えてくれる
↓こんなやつ
これを使って、
変数=モデル名.new(カラム名:"文字列")
を実行した後に
インスタンスを代入した変数.save
を実行すると対象テーブルにレコードが保存される
↓こんな感じ
このsaveメソッドが使えるのはApplicationRecordクラスを継承しているおかげみたい
rails consoleでテーブルからデータを取り出す
レコードを追加したので確認してみる
変数=モデル名.first
で変数にテーブルの1つめのレコードを代入できる
レコードを代入した変数.カラム名
で対象レコードのカラム名に格納されたデータを参照できる
こんな感じ
モデルのallメソッド
モデル名.all[0].message
のように、allメソッドを使うと配列としてテーブルにアクセスできる
データベースとアクションの連動
データベースの状態
progateではまだ出てきてないけどsqlite3で表示してみる
rails dbconsole
で起動して.headers on
でカラム名の表示ON、あとはSQL文を打てばOK。ちゃんと保存したレコードが入ってる
rails consoleで見るよりこっちの方が絶対いいね
controller
class PostController < ApplicationController def index @posts=Post.all end end
html.erb
<div class="main"> <h1>ruby埋め込みテスト用</h1> <% @posts.each do |post| %> <div class="messages-entire"> <%= post.message %> </div> <% end %> </div>
できた
要所はcontrollerの@posts=Post.allと
html.erbの<%= post.message %>
allメソッドで配列として変数に格納して、eachでmessage
の値を取り出す。
viewの共通レイアウト
今のview
<!DOCTYPE html> <html> <head> </head> <body> <header> <p>テストページ</p> </header> <div class="main"> <h1>ruby埋め込みテスト用</h1> <% @posts.each do |post| %> <div class="messages-entire"> <%= post.message %> </div> <% end %> </div> <footer> <p>Copyright © misokatsusand All Rights Reserved.</p> </footer> </body> </html>
これのmainクラスタグの部分だけ記述しても機能させる方法がある
(余談ですがhtml5はmainタグ標準装備されてます、後から知りました)
下図のディレクトリにあるapplication.html.erbというファイルがある
中身はこれ
<!DOCTYPE html> <html> <head> <title>Webapp</title> <meta name="viewport" content="width=device-width,initial-scale=1"> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> <%= yield %> </body> </html>
デフォルトでこの状態だから中身は好みに書き換えるとして、
トップページなどのviewのhtmlにいきなりmainタグとその中身だけ書いても、
このapplication.html.erbの<%= yield %>
の部分にhtmlが代入されてからブラウザに表示される。
これを使って共通するレイアウトはまとめられる
現状のように各viewに個別にheaderタグやら書いちゃってもそれはapplication.html.erbより優先されるっぽい
色々置きすぎて手元のhtmlはメンテの手間がでかいため割愛
link_toメソッド
<%= link_to("表示文字列","URL") %>
html.erbに使うメソッドで、a
タグと同じ役割
有効利用の仕方はまた後から出てくるらしい。その時でよかったんじゃね?
以上、rails II終わり!ではでは
Webエンジニア目指して#34
どうも無職マンです。
退職証明書類が未だ届かず、事務手続きを全て終わらせてからWebエンジニアのスクールへ臨むつもりが遅れてます。はよしてくれ〜〜〜〜〜
運動不足をなんとかしようと思って2億年振りにDDRやったんですが、全然踏めません。軟体動物が地団駄を踏むゲームになっています
そんな感じでいきまShow ProgateのRuby on Rails I !!!!!!!!!!!!!!
Webアプリケーションの生成
$ rails new application_name
ターミナルでこいつを入力すると自動で必要なディレクトリを作ってくれるらしい!行くぜうおお!
あ、$はコマンドを表す文字で、ターミナルに元々表示されるため入力は不要です
Rails入っとらんやんけ!!!!!!!
入れてきました。なにやら警告されてますが初めてRailsを始める場合は無視でいいそうなので無視します
というわけで先程のrails new
を実行すると
予想よりたくさん生成されました。これがwebアプリの土台になるわけですね。こんなん手作業で作ってられないのでRailsは偉大ですね
サーバーの起動
rails new
をしたら今度はサーバーを起動します
別途ターミナルを立ち上げて下記の通り入力
$ rails server
するとこんな表示になります。
Ctrl+Cでサーバーを閉じるまではこの窓は開きっぱなしにします。
忘れると閉じられなくなるんで回りくどい操作が必要になってしまうそうな
次にブラウザでlocalhost:3000
をアドレスバーに入力するとこんな画面が出ます。
これでサーバーが立ちました。
トップページの自動生成
$ rails generate controller home top
このコマンドを実行するとトップページが自動生成されます
メリットはまだ分かりませんがなにやら色々やってるのでただトップページを作るだけじゃないみたい
この状態でlocalhost:3000/home/top
をブラウザで開くといかにもデフォルトな感じのページが開きます
viewについて
Railsページにはview
,controller
,routing
の3ファイルが必要で、
ブラウザの要求に対してRailsはrouting
>controller
>view
の順に経由しview
を返します
view
は見た目の部分、つまりhtmlのことです
view
ファイルは下図のディレクトリに入ってます。自動生成したhome/topも入ってますね
生成したtop.html.erb
はhtmlのノリで編集できます。末尾にerbがついてますがhtmlと同じ記述らしい
controllerについて
先述の通り、Railsがブラウザにviewを返す前にcontroller
ファイルを経由してきます。さてはサーバーサイドの処理だな?
rails generate controller home top
で生成されたものの中にcontroller
と名のついた.rb拡張子のファイルがあります
これの中身がこちら
class HomeController < ApplicationController def top end end
home/topを生成したのに合わせてtop
メソッドが書かれてます
このようにcontroller
に書かれたメソッドをactionといって、
routingについて
rountingはブラウザに入力されるURLとcontroller
をリンクさせるファイルです
[viewについて]で書いた流れを細かく書くと、
1.ブラウザからの要求に対しRailsがURLとrouting
を参照
2.対応したcontroller
ファイル名とそのaction
を参照
3.そのaction
名のview
となるhtmlをブラウザに返す
って感じですね
このrouting
も自動生成されてます
その中身がこちら
Rails.application.routes.draw do get 'home/top' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end
あれ、Progateだとget "home/top" => "home#top"
となりましたが結果が違う
ver.の違いでしょうか(Rails6.1.1)
コメントアウトに書いてあるURLへ行ってみると、どうやらURLの指定とcontroller action
が同じだと省略できるみたいです。なるほどね
ちなみに全然関係ないURLを入力したらrounting errorが出ました。 routingがうまく記述できてないとこうなるわけですね
routingの変更
controllerを呼び出すURLを変えます
Rails.application.routes.draw do get 'top'=>'home#top' end
こうするとlocalhost:3000/top
だけで呼び出せるようになります
また、下のように書いた場合はlocalhost:3000
だけで呼び出せます
Rails.application.routes.draw do get '/'=>'home#top' end
2個目以降のページの作成
home/topはrailsコマンドを使って自動生成しましたが、重複したcontrollerはコマンドが弾かれるため今まで書いたview,controller,routingファイルの自作が必要です
cssの適用
railsで下図のようにcss専用のフォルダが作られます
home.scssがhomeフォルダのview全てに適用、
application.cssが全てのviewに適用されます
適用順はapplication>homeなので重複要素があればapplicationの記述は上書きされます
railsではscssなんですね。sass覚えといて良かった〜
画像の保存場所
railsは独特な参照をするみたいで、<img src="/bnr_mini.png">
みたいな書き方をすると下図のフォルダを参照します。
別にもapp/assets/imagesに保存場所があってどっちやねん!って感じですね
参照する際は/assets/images/xxx.pngのように記述します。appがルートディレクトリになるわけですね
ちらっと調べた感じwebアプリを立ち上げたとして、ユーザーが利用する範囲のものはpublic、システム画像などであまり変化のないものはassets/imagesに置くのがいいというのを見ました
htmlリンクの設定
htmlのa
タグのリンク先にroutingのパスを記述するとその設定通りに飛ぶ
<a href="/">トップページ</a>
途中で調べることが多くて止まっちゃいましたがRails Iおわり!ではでは
Webエンジニア目指して#33
どうも運動不足マンです
外に出ないせいで完全に冬眠モードです。実家なのでリングフィットやるスペースもないし困ったもんですね
さてやっていきましょうProgateのRuby Vです。Ruby単体はこれが最後ですね
クラスの継承
class Sushi < Food end
継承の記述が左に流れるため紛らわしい
jsと同様に継承や上書きなどほとんど同じ概念がある
継承によって生成された子クラスにはインスタンス変数とインスタンスメソッドが継承されるところも同じ
また、子クラスで新規メソッドを記述すれば子クラスにのみ追加され、既存メソッドを記述すれば上書きされる
superメソッド
class Food attr_accessor:name def initialize(name:) self.name=name puts "#{self.name}が生成されました" end end class Sushi < Food attr_accessor:wasabi def initialize(name:,wasabi:) super(name: name) self.wasabi=wasabi puts "わさび#{self.wasabi}です" end end food1=Sushi.new(name:"ネギトロ",wasabi:"なし") 実行結果----------------- ネギトロが生成されました わさびなしです
super(name: name)
の部分で親クラスの同名関数を呼び出してます
新しく定義した変数については通常通り記述
もうほぼjsでやった内容と同じですね
Dateクラス
require "date" eventday=Date.new(2021,1,31) puts eventday puts eventday.sunday? 実行結果------------- 2021-01-31 true
定義しなくてもrequire "date"
でDateクラスを読み込み、上記の流れでその日が何曜日か判定できる。
調べたところ、インスタンスメソッドは他にもたくさんあるみたい
また、下記のようにインスタンス生成の際に.new
ではなく.today
と記述することでその日の日付を取得できる
require "date" eventday=Date.today puts eventday 実行結果--------------------- 2021-02-01
クラスメソッド
Date.new
やDate.today
のような記述をクラスメソッドと呼ぶとか呼ばないとか
クラスに対するメソッドなのでそのまんまですね
クラスメソッドを自前で用意するにはdef クラス名.メソッド名
のように記述
以下お試し結果
require "date" class Sample def Sample.is_today_sunday? today=Date.today if today.sunday? puts "今日は日曜日" else puts "今日は日曜日ではありません" end end end sample1=Sample.is_today_sunday? 実行結果------------- 今日は日曜日ではありません
クラスメソッドの連結
1つ上のコードは回りくどいなあと思って
Date.today.sunday?
みたいに記述できないかな?と気になって試してみたらできた
メソッドチェーンと呼ぶらしい jQと同じ呼び方ですね
require "date" today1=Date.new(2021,1,31).sunday? puts today1 today2=Date.new(2021,2,1).sunday? puts today2 実行結果------------ true false
これでRuby Vは終わり!次はやっとRailsですね 遅くね?
ではでは