「Firebase は安いし楽だしマジ最高」という一心で技術選定してしまったプロダクトが成功して見えてきた課題、割高なコスト・権限管理・カスタマイズ性、そして (特性やスキルセット的に)RDB 製品が適していたのに無理やり Firestore を採用したことによるデータ不整合。 その結果チーム内で Firebase を抜ける機運が高まるも、Firebase べっとりなアプリケーションすぎて移行しづらいといった問題に出会うかもしれません。 そのような場合に備え、Firebase の存在を隠蔽して開発することに挑戦してみましょう。 注意: Firebase を剥がしているときに「俺、次は絶対そうするわ」と感じたものを書いているだけであり、まだ実際にはこのパターンでプロダクション導入していません。 あくまで個人開発で試してみていけそうと思ったので、提案しますという体です。 また Firebase
Firebaseでサービスを公開するときに、最低限必要なセキュリティーのポイントをまとめています。 Firebaseは、現在もすごい勢いで開発が進んでいるので、セキュリティーに関するポイントやノウハウも日々更新されます。最新のドキュメントや、変更点を調べることをおすすめします。この記事を含め、ネットの記事は古い可能性があります。2022年前後でも、App Check導入、Cross service Rulesの導入、AuthenticationのIdentity Platform導入、Workload Identity連携の導入など、日々更新されています。 公式のFirebaseのセキュリティチェックリストは必ず目を通しましょう。 GCPインフラ Firebaseで使うGoogle Accountは個人のアカウントを使わないでGoogle Workspace/Cloud Identityの
.app 1 .dev 1 #11WeeksOfAndroid 13 #11WeeksOfAndroid Android TV 1 #Android11 3 #DevFest16 1 #DevFest17 1 #DevFest18 1 #DevFest19 1 #DevFest20 1 #DevFest21 1 #DevFest22 1 #DevFest23 1 #hack4jp 3 11 weeks of Android 2 A MESSAGE FROM OUR CEO 1 A/B Testing 1 A4A 4 Accelerator 6 Accessibility 1 accuracy 1 Actions on Google 16 Activation Atlas 1 address validation API 1 Addy Osmani 1 ADK 2 AdMob 32 Ads
はじめに こんばんは。CX事業本部の平屋です。 Firebase App DistributionがパブリックベータになったのでiOSアプリの配布を試してみました。本記事ではその手順を紹介します。 検証環境 macOS Mojave 10.14.5 Xcode Version 10.3 テスターアカウントのメールアドレス: Gmail iOS端末 iPhone 7 iOS 13 メールアプリ: Gmailアプリ アプリをビルドする 配布用のアプリをビルドし、ipaファイルを作成します。 ipaファイルの要件は以下のページの[アプリをビルドする]に記載されています。 Firebase コンソールを使用してテスターに iOS アプリをテスターに配布する Firebaseプロジェクトの作成とAppの追加を行う 必要に応じて以下の作業を行います。 Firebaseプロジェクトの作成 プロジェクトに
Reactプロジェクトの作成 macOS上でReactプロジェクトを作成するためにNode.jsのインストールが必要となります。Node.jsインストールを行ってからReactプロジェクトの作成を行ってください。 npx create-react-appコマンドを利用してReactプロジェクトを作成します。コマンドの後ろにはプロジェクト名を指定します。プロジェクト名には任意の名前をつけてください。ここではreact-fierebase-authとしています。 % npx create-react-app react-firebase-auth Firebaseの初期設定 FirebaseのAuthenticationの機能を利用するためにはFirebaseでユーザアカウント登録を行う必要があります。もしアカウントを持っていない場合は、Firabaseのページでユーザ登録を行なってください。
export const echo = functions.https.onRequest((request, response) => { const task = request.body response.send(JSON.stringify(task)) }) とは別に functions.https.onCall という方式もあるようで、今回はそちらをつかってみます。そしてそれをスタート地点にして、Functions上に構築したREST API を、Firebaseの認証機能で保護するやり方を考えてみようとおもいます。 ついでに、自前で構築したRESTサーバにも、Firebaseの認証を組み込んでみようと思います。 TL;DR functions.https.onRequest でRESTなサービスを作ったばあい認証チェックなどは自動では行われない。従って作り込みが必要ではある
以前開発したときは、APNs証明書だけだったのに知らぬうちに2つの方法ができていたので備忘録です。 そもそもAPNsとは? Apple Push Notification Service(以下、APNs)は、iOSやtvOS、MacOS上で実行されているアプリケーションに対して開発者側から通知を送るためのAppleによるサービスのことを指します。 誤解されがちなのは、Firebase Cloud Messaging(以下、FCM)などの通知を行えるサービスと各アプリケーションが1対1で繋がっているようにとらわれがちですが、Appleデバイスを対象に通知を送付する際は必ずAPNsを介して送付されています。 当たり前ですが、APNsに対してどんなリクエストでも送れてしまったら意図しない通知がユーザーの手元に届いてしまいますので、サーバー側とAPNs間のセキュアな通信を担保するために証明書または
ANDPADでモバイルアプリエンジニアをしている @kanari3333 です。 初日にGitHubのパスワードをど忘れして、社内では本名で活動していましたが、これを機に覚えて頂ければと思います。GitHubも移行していきたいです (規約的にも) ANDPADのアプリ開発では、UnitTestはもちろんUITestにも力を入れています。 今回は、iOSのUITestを実装していく中で遭遇した辛い事案を紹介したいと思います。 概要 iOSのWebViewのUITestは、要素が取得できないことがある Simulatorはテストが安定しない 特に最新のOSで顕著 この記事では検証用のサンプルアプリを作成し、BitriseでSimulator / Firebase Test Labの実機テストを回し検証していきます。 まえおき ANDPADのiOSアプリでは、CI/CDとしてBitriseをメイ
はじめに 先日公開したアプリでは定期購入を実装しています。いわゆるサブスクです。 Flutter(iOS/Android)でサブスクの実装例は少なく、苦労した点もあるので知見を公開します。定期購入の仕様について丁寧に解説するというよりは、実際に私がどのような実装をしているかについて書いています。 注意事項 本記事は公式ドキュメント、技術記事投稿サイト、個人ブログなどの情報を自分なりに解釈して実装した内容です。 課金周りはアップデートが多いため、常に最新情報の確認を推奨します。特に英語版公式ドキュメントは最も信頼できると思います。 本番環境で動作していることを確認済みですが、サブスクユーザーは現状数名です。サブスクユーザーが多数の場合による影響は未検証です。 その他、十分に検証できていない内容があります。何かお気づきの点があればご指摘いただけると助かります。 環境 本記事執筆時の環境です。
みなさまFabricからFirebaseへの移行はお済みでしょうか。Fabricのbeta配信やCrashlyticsを使用していたのですが、Fabricにログインすると「Fabricは2020年3月31日にdeprecatedになるのでFirebaseに移行してね!」とバナー表示されるようになったのでFirebaseへ移行してみました。 前提 Fabricが既に機能しているアプリがあること 移行先のFirebaseアカウントがあること 移行手順 Fabricの移行ページでGoogleアカウントの紐つけを行なった後、Fabric登録アプリをFirebaseに紐付けるだけでアプリのアップデートなしに移行ができます。注意して欲しいことは、今使っているiOSやAndroidのFabricSDKとAPIキーは変更しないことです。Firebase版のSDKは数ヶ月以内にリリース予定ですが、今のところ
こんにちわ がじぇったー (@hackmylife7) | Twitter です。 PythonでRealtime DBをさわってごにょごにょしたいなぁと思い色々触って見ることにしました。 TL;DR(要約) Cloud Firestoreとは? ServiceAccountの作成 Cloud Datastoreの作成 cloud_firestore.pyの編集 データを読み取る 所感 TL;DR(要約) Cloud FirestoreはFirebase Realtime Databaseの進化版 Cloud Firestoreとは? みんな大好きFirebase Realtime Databaseの進化版です。 Firebaseの良さはそのまま引き継ぎ、弱点だった複雑で階層が深いデータ構造にも対応することができます。 Realtime Databaseはシングルリージョンでしたが、Clo
Overview Firebaseの無料枠はかなり大きい。 私もCloudFunctionsが外部にリクエストを投げれていたら、まだ課金プランにはしていなかった可能性が高い。 外部リクエストのためだけに課金を有効にして数か月、明細を見てみたらFirebase Hostingで課金が発生している たった8円なので影響は0に等しいが、その理由を理解しておかないと危険と考え原因を究明することに。 今回は結論に至るまでの過程を記録しておきます。 読者対象 Firebaseで今後課金プランへの移行を検討している方 Firebaseで既に課金プランへ移行している方 いきなり結論 Firebaseを課金プラン(Blazeプラン)に移行すると日割り計算のプロダクトが出てくるため。 無課金のSparkの無料枠に加え、Blazeプランでは日割りでの上限が設定されているようです。 細かいことを知りたい場合は続く
(2022年6月追記) 2022年6月現在、この記事にあるアプリよりも、ほぼ同じコンセプトのReact+NextJS製webサービス「みんなで作業場」に滞在していることが多いです。 是非お越しください! アプリ 先日、個人開発アプリをリリースしました!やったね!!! 審査も通りまして、現在App StoreとPlay Storeで配信されております。 App Store Play Store せっかくなので、利用した技術のメリットと注意点をまとめておこうと思います。 作ったアプリ これです。 広報用ページも作ってみたのでリンクを貼っておきます。 広報用ページはスマホで見る用にレイアウトしてます。 監視し合う会 〜お互いサボらないようにみんなで作業しよう〜 英語名: Procrastinators Watch Mutually 解決したい課題 やらなきゃいけないことがあるのに、なかなか取り組
こんにちは、大阪のかずえです。遅くなってしまいましたが先週7/30に開催された「Firebase Meetup in Osaka #4」をレポートします。 Firebase meetupは国内最大のFirebaseコミュニティ Firebase Japan User Group(FJUG)が主催するナレッジ共有イベントです。 FJUGはFirebaseに興味をもつ全ての人を歓迎いたします。 今回の会場はなんばスカイオのWeWorkなんばスカイオ! 行ったのは2回目ですがやはり広くて綺麗ですね。 スポンサーセッション ゆめみ大阪に足りないモノ ゆめみさんは今回の勉強会の会場となっているWeWorkなんばスカイオに大阪オフィスを新しく立ち上げられたそうです。 ですが大阪オフィスの現在のメンバー構成が営業1名+フロントエンジニア3名とのことで、サーバーサイドエンジニアやiOS/Androidエン
この記事は、Firebase #2 Advent Calendar 2019の3日目の記事です。 今年の9月下旬ごろにリリースされた新機能、App Distributionについて解説します。 App Distributionとはなにか Firebaseが提供する、テスター向けのアプリ配信ツールです。同様のツールとしてDeployGateやFabric betaが有名です。ちなみにFabricは、Googleが2017年にTwitterから買収しています。 はっきりと明言していませんが、Fabricは2020年3月末にサービスが終了することもあり、App DistributionはFabric betaの代替として用意されたものとして考えればいいと思います。実際に使い方も機能も、ほぼほぼ違いがありません。 なお、この記事を執筆時点ではまだベータ版となっています。 App Distribut
はじめに 去年(2018)春ごろから、Firebase x React x TypeScriptでアプリケーションを作成する機会が多くなり、 自分の中である程度書き方が固まってきたので、その内容をまとめることにしました。 フロントエンドの実装を想定した説明をしますが、サーバーサイドも似たような構造で筆者は書きます。 Firebase、TypeScriptを使ったことがないかたは、少し難しいかもしれません。 「俺はこのような書き方してるよ〜」などあれば、コメントで教えて欲しいです! アーキテクチャについて 筆者はFirebaseプロジェクトでの設計では、レポジトリパターンを使って設計することが多いです。 ※厳密にレポジトリパターンになっているかといわれると、なっていないかも... 下記がフォルダ構造です。
Static webhosting benchmark: AWS, Google, Firebase, Netlify, GitHub & Cloudflare Static websites are still a hot topic. They are fast, and they're incredibly secure because there isn't a CMS to hack. Once you build a static website, however, the question becomes: Where do I host? In other words: what is the fastest static website hosting provider in 2020? Well, let's find out! I did a similar test
いかに楽に入力できるか、いかに楽に自分の進捗を把握できるかに着目して作りました。 入力については、Slack アカウトごとに前回入力済みの内容を Firestore に保存し、初回以降は入力欄の初期値として入るようにしています。 進捗把握については、初回以降は前回の実行時からの差分を表示するようにしています。なので週 1 回とかコマンドを打てば前週との比較が手軽に出来ます。 構成 どのような構成かざっくり紹介します。 Bolt.js を Cloud Functions for Firebase で動かして Slack とのやりとりをしています。 そして、フォームの入力内容・指標データを Firestore に保存しています。 指標集計部分は自分で各サービスの API クライントを書いて使っています。 Zenn の API クライアント import { ZennArticle, Follo
学生エンジニアのためのチャットサービスをNext.js + TypeScript + AtomicDesign + Firebase9 + Dockerで作った(β)DockerFirebaseOSSNext.jsAtomicDesign はじめに ※今回の開発は、株式会社OwN様からいただいた技術課題の一環で行ったものになります。 自己紹介 会社員やりつつ、趣味で個人開発を行っております。 フロントエンジニアのふぁると申します。 【Twitterリンク】 itamaster サービスについて サービス名 hacker-class-roomを略して、「はかくら」です! リポジトリURL こちらになります。 https://github.com/FAL-coffee/hacker-class-room サービスの概要 「プログラミングの授業が始まるが、ついていけるのか不安......」 「情
はじめに ※この記事はfreee APIで業務を楽しく便利にハックしよう!アドベントカレンダー2021の6日目の記事として投稿しています。 はじめまして。今年の1月からプログラミングの勉強をしているものです。 今回は、ネットで知り合った仲間とともに(顔もフルネームも知らないもの同士で)半年間、開発を行い、農家の3代目の困りごとを解決するアプリを作った話をしたいと思います。 きっかけ 私は技術力を身につけたいと思い、今年の1月〜4月ごろまで独学で勉強を進めていました。しかし次第に写経に飽き、このままUdemyなどで写経をして学習するより実際になにか動くものを作るほうが楽しいだろうなと思うようになりました。 また、せっかくなら1人でやるより誰かと一緒に開発する方がもっと楽しいだろうなと思い、勇気を出してネットで仲間を募り、アプリのチーム開発を始めてみることにしました。 募集したメンバーのうちの
Google アナリティクス for Firebase (以下GA4F)は、GA360と同様、サンプリングされていない生データを無料でBigQueryへエクスポートできます。 BigQueryへエクスポートしたデータを利用すると、GA4FやGoogle アナリティクス 4 プロパティ (以下GA4)のレポート画面では難しいカスタム分析やアプリ以外の外部データと組み合わせた分析が可能になります。 さらに、BigQueryへエクスポートしたデータはデータポータルなどのBIツールと連携すればカスタムレポートの作成も可能となります。 今回はGA4Fのデータ活用をテーマに、次の内容を紹介します。 BigQueryエクスポートの設定手順データポータルのBigQuery接続方法・レポートの作成方法 BigQueryエクスポートの設定手順GA4FのデータをBigQueryへエクスポートする方法は2種類あり
Firebase側にはこれ以外の様々な機能(Crashlytics等)がありますが、Supabase側にはありません。 まずは認証とデータ周りをしっかりとサポートしていくのだと考えられます。 価格 2020年12月現在、無料で使用できます。 2020年12月以前をαバージョン、2020年12月以降をβバージョンとしており、βバージョンのユーザは1年間無料でWeb上の機能が使用できます。 そのため、2021年あたりからクラウド版のホスティング料金体系が出てくるのではないでしょうか。 また、スポンサーとして貢献することも可能です。 触ってみた所管 データ構造が違う Firebaseとの一番の大きな違いは、Firebaseが NoSQL に対して、Supabaseは PostgreSQL を選択している点です。 Firebaseも確かに便利ではありますが、Realtime Databaseの作法
サーバ管理なしでWebサービス公開 -Firebase(Authentication, Hosting, Firestore) + GAEで『LogCrow(ログ情報共有サービス)』開発-GAEVue.jsFirebase個人開発algolia FirebaseとGoogle App Engineを中心に活用し、Webサービスをローンチしたのでそのアーキテクチャ & サービス概要を紹介します。 LogCrow(ログ情報共有サービス) 背景・動機 私は日頃業務で、システムの保守・運用の効率化・改善について検討しており、いろんな運用者の知見が共有できている状態が作れると運用者が幸せになれるのではないかと考えています。 そんな中で、特に保守・運用時にキーポイントとなるログ情報についてフォーカスし、こういうログが出たときには「原因」として何が考えられ、どういった「対処」が必要となるのかといった情報
大阪オフィスのフロントエンド勉強会で使用したAngular+Firebaseハンズオンの資料を公開します。勉強用のサンプルアプリケーションとして活用していただければ幸いです。 どうも!大阪オフィスの西村祐二です。 大阪オフィスではフロントエンド勉強会を隔週で行っており、そこでAngular+Firebaseで作るTODOアプリケーションのハンズオン行ったのでその資料を公開します。 勉強のためのサンプルアプリケーションとしてお役に立てれば幸いです。 ゴール 下記のようなTODOアプリケーションを実装します。 主な機能として下記になります。 TODOの追加削除 Drag And DropでTODOを移動させてデータを更新 Googleアカウントでログイン・ログアウト TODO追加入力フォームのバリデーション バックエンドはFirebaseを利用しています。 利用するツール Angular An
Komercoの高橋です。 昨日は前編でFirestoreの設計パターンについてお話しましたが、後編はFirebase運用の仕組化についてです。 前の記事でも述べたように、昨年はWeb版のリリースや送料無料イベントもあり、ユーザ数がさらに増加してきています。 サービス規模が大きくなるにつれて運用コストも大きくなり、その効率化も求められるようになってきました。 ここではKomercoで行っている、運用に関する仕組みについてご紹介します。 Komercoの構成 まず前提としてKomercoの構成について簡単にご紹介します。 Komercoは器や料理道具、食材や調味料を扱うECサービスで、商品の販売者から直接購入ができるC2Cサービスとなっています。 商品を購入するユーザを「カスタマー」、販売するユーザを「クリエイター」と呼んでいます。 Komercoではこのカスタマー、クリエイターそれぞれに対
Web Push通知の受信を、Firebase Cloud Messaging(FCM)+Service Worker +Notificationで受信側でコントロールしてみた
iOS14からユーザートラッキングに用いられている端末の広告識別子IDFA取得のオプトイン/オプトアウトの選択をユーザーに求めることが必須になります。アプリが取得するプライバシーポリシーの提出必須化と同じく大きな変更ですが、開発中のアプリが該当するか調べる時にFirebase AnalyticsとFirebase Crashlyticsのみを使っていて広告系のSDKも利用していない場合何の対応も必要ないかが心配になったので調べていました。 App Tracking Transparency | Apple Developer Documentation iOS14で必要になるユーザートラッキングについての対応 AppleからUser Privacy and Data Use というドキュメントが公開されました。ユーザーがアプリのプライバシーポリシーをダウンロード前に確認して、アプリが収集す
2022年2月追記 Firebase SDK v9では、実装方法が大きく変わりました。 v9を利用した認証の実装については、以下をご覧ください。 Authenticationを利用した実装 前回 に続き、 Firebase の備忘録を書いていきます。 今回はFirebase Authenticationを利用した認証システムの実装についてメモを残しておきます。 Firebase Authentication の設定 認証は、Firebase プロジェクトのコンソールから「Auhentication」を選んで設定していきます。 公式ドキュメントは以下。 ここでは、サンプルアプリで利用したGoogle 認証に絞って記述します。 Google 認証の設定 Authentication → Sign-in methodを選び、設定を「有効」に変更→保存で、終了。 Google認証の実装 Fireb
Firebase Cloud FunctionsとFirestoreを組み合わせてREST APIぽいものを作る。Cloud FunctionsとFirestoreに初めて触るので、その動作を知る勉強といった感じ。 REST構築には別でAPIが用意されているので、本来はそちらを使うべきかもしれません。 Cloud Functionsとは Firebaseの機能(AuthやDatabaseなど)やHTTPSリクエストのイベントに応じて、自動的に実行できるバックエンド関数のこと。例えばFirebase Authenticationでユーザーを作成したときにCloud Functionsに定義した関数をトリガーさせて、何かしらの処理(メールを送ったり)をさせることができる。Hostingと組み合わせて動的サイトも提供できるようです。 前述のようにFirebaseの機能に限らず、HTTPSリクエス
フィードバックを送信 Cloud Firestore のベスト プラクティス コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。 ここで紹介するベスト プラクティスは、Cloud Firestore を使用するアプリケーションを構築する際のクイック リファレンスとしてご利用ください。 データベースのロケーション データベース インスタンスを作成するときは、ユーザーとコンピューティング リソースに最も近いデータベースのロケーションを選択してください。広範囲に及ぶネットワーク ホップはエラーが発生しやすく、クエリのレイテンシを増加させます。 アプリケーションの可用性と耐久性を最大化するには、マルチリージョン ロケーションを選択し、重要なコンピューティング リソースを少なくとも 2 つのリージョンに配置します。 アプリケーションでレイテンシが重要な場合や、他の GC
エラー内容 firebase initコマンドを実行し、Hostingを選択してエンターしたら、以下のようなエラーが出ました。。。 Error: HTTP Error: 401, Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project. firebase loginまでは全く問題なく進んでいたのになぜ??となっておりました。 解決方法 firebase login に、--reauth --no-localhost というオプションをつ
環境 ・MacOS BigSur(11.5.2) ・VScode(1.59.1) ・Node.js (16.1.1) ・Firebase (9.0.0)←New! ・yarn (1.22.11) ・TypeScript(4.4.2) 対象 ・これからFirebaseでプロジェクトを始めようとする人 ✍️8月25日以前に出された教材やチュートリアル、記事、そして現時点での日本語の公式ドキュメントを参考にしようとしている人は特に! ・教材や記事、ハンズオン通りにFirebaseでプロジェクトを始めたのに原因不明のエラーぶつかった人 ・8月25日以前にFirebaseプロジェクト作っている人 ※この記事は2021年9月1日時点の情報です ※情報ソースはFirebaseの公式ドキュメント及び公式に発表されているリリースノートとブログを参考にしています はじめに 早速本題に入りますが、つい先日(20
はじめに Flutter と Firebase を使って個人でアプリ開発をするときのロードマップを紹介します。 本記事を一通り読めばアプリを公開するまでにやるべきことの大枠をイメージできるようにしました。 広く浅く紹介しているので、もし気になる内容があれば、個別に深掘りしてみてください。 個人開発にフォーカスした記事になっているとはいえ、いくつかの Flutter のお仕事を請けた私自身の経験も反映しているため、お仕事でも活用できる内容も含まれていると思います。 本記事は、ざっくり次の流れになっています。 アプリの構想と具体化 実装に入る前の準備 基本機能の実装 よりよい実装にするための Tips 開発フロー アプリの公開 収益化の話 想定読者 Flutter × Firebase を使って個人開発をしようとしているひと または、既に個人開発をしているひと Flutter を導入するか悩ん
モバイル向けNoSQL「Firestore」で件数を数える「count()関数」、期限付きデータ「Time To Live」など新機能。Firebase Summit 2022 Googleは10月18日に米ニューヨークでモバイル向けのバックエンドサービスであるFirebaseにフォーカスしたイベント「Firebase Summit 2022」を開催し、モバイル向けのNoSQLデータベースFirebaseの新機能として、件数を数える「count()」関数や期限が来たら自動的にデータが消去される「Time To Live」などを発表しました。 クエリ結果の件数を返してくれるcount()関数 これまでFirebaseでクエリの結果何件のデータがマッチしたのかを数えるには、プログラマが検索処理の後になんらかの手法で件数を数える処理を記述する必要がありました。 件数を数えることは比較的ニーズの高
はじめに iOSやAndroidアプリの利用状況把握のツールとして、Firebase Analyticsがあります。導入方法は、以前の記事で書きましたが、この方法のような通常の利用だと、Firebaseの公式ページによるとアプリによってロギングされるイベントは、約1時間の周期でバッチ処理され、まとめてアップロードされます。 通常は、これで十分です。しかし、デバッグ時には、1時間待たないと結果が出ないのは、効率的ではありません。この記事では、デバッグ時に有効なログの出し方を書いていきます。 アプリコンソールにログを出す方法 Xcodeのコンソールに、Firebase Analyticsのログをリアルタイムに出力する方法です。-FIRAnalyticsDebugEnabledを追加してアプリを起動すると、Firebase Analyticsのログがリアルタイムで出力されます。 具体的には、以下
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く