SlideShare a Scribd company logo
1 of 42
Download to read offline
laravel x モバイルアプリ
発表内容
• アプリ開発者という生き物について

• アプリ開発のDB事情

• モバイルアプリ用Web API 実装 tips
pochikawa

starfruits_j

Azione Co., Ltd.
Oshikawa
• 元Webデザイナ

• iOSアプリ開発

• たまにWebも触る

• PHP7は未経験

• SQLが嫌い
• 元Webデザイナ

• iOSアプリ開発

• たまにWebも触る

• PHP7は未経験

• SQLが嫌い
which.photos
ヤラナイカ
スプラトゥーンのフレンドの
オンライン状態をチェックし
たり通知してくれるアプリ
他 > littlegleam.com
発表内容
• アプリ開発者という生き物について
• アプリ開発のDB事情

• モバイルアプリ用Web API 実装 tips
アプリ開発者とはどんな生物? (所感です)
• ローカルでは主にSQLite

• アップデートの壁があるので、仕様変更はあまりしない(したく
ない)

• サーバサイドのように負荷分散等考えなくて良いので、あまり
チューニングとかしない(したくない)

• Viewはアプリ側にあるので、たまにしかサーバサイドは触らな
い

• Swiftばっかり書いてると、Swift以外のコードは隠 したくなる
つまりたまにしか

SQL書かない
忘れます!
SQL組み立てめんどい!
$sql = 'SELECT * FROM `laravel` WHERE ';
if ($user_id) {
$sql .= ' `user_id` = ' . $user_id;
} else {
$sql .= ' 1 = 1';
}
連想配列で組み立てるクエリビルダ
$arr = [];
if ($user_id) {
$arr['user_id'] = $user_id;
}
$db->select('table', $fields, $arr);
$arrってなんだっけ?
• resultがarrayだったり?

• 久々に触ると仕様を確認したりコードを呼んだ
りしなければならない

• SQL読んだ方が分かりやすい

• SQLが複雑になると、もはや読めもしない
発表内容
• アプリ開発者という生き物について

• アプリ開発のDB事情
• モバイルアプリ用Web API 実装 tips
Realm
realm.io
RealmのModel
// Define your models like regular Swift classes
class Dog: Object {
dynamic var name = ""
dynamic var age = 0
}
// Use them like regular Swift objects
let mydog = Dog()
mydog.name = "Rex"
print("name of dog: (mydog.name)")
// Persist your data easily
let realm = try! Realm()
try! realm.write {
realm.add(mydog)
}
https://realm.io/docs/swift/latest/
RealmのSelect
let tanDogs = realm.objects(Dog).filter("color = 'tan'")
let tanDogsWithBNames = tanDogs.filter("name BEGINSWITH ‘B'")
※メソッドチェインでクエリを組み立てられる
https://realm.io/docs/swift/latest/#queries
よく使うクエリをclassメソッドで実装すると便利
class Dog: Object {
dynamic var name = ""
dynamic var age = 0
dynamic var color = "white"
class func tanDogs() -> Results<Dog> {
let realm = try! Realm()
return realm.objects(Dog).filter("color =
'tan'")
}
}
Dog.tanDogs().sorted("age", ascending: false)
https://realm.io/docs/swift/latest/#queries
モデルを書くことで仕様が決まり

モデルを見れば仕様が理解できる

コードが出来上がる👏
PHPでもメソッドチェインでクエリ
書けないものか?
そう、laravelならね
発表内容
• アプリ開発者という生き物について

• アプリ開発のDB事情

• モバイルアプリ用Web API 実装 tips
可視性の高い設計
• サーバ側とアプリ側でモデルを統一化したい

• Realmと酷似しているのでGood! 

• レコードを連想配列にしてJSON出力

• ModelのtoJson();でOK!レスポンスをJSONに
するのも簡単。

• アプリ側はRealmにマッピングして保存
users.password等、ユーザに渡せない情報
• Modelのhidden propertyで指定
アプリ側の実装
class User: Object {
dynamic var id = ""
dynamic var name = ""
}
https://realm.io/docs/swift/latest/#queries
laravel側の実装
/**
* @property string $id // ID
* @property string $name // 名前
* @property string $password // パスワード
*/
class User extends Model {
protected $hidden = ['password'];
}
https://realm.io/docs/swift/latest/#queries
deleted_at -> isDeleted
• カラムにないプロパティはget∼∼Attributeで追
加できる
アプリ側の実装
class User: Object {
dynamic var id = ""
dynamic var name = “"
dynamic var isDeleted = false
}
https://realm.io/docs/swift/latest/#queries
laravel側の実装
/**
* @property string $id // ID
* @property string $name // 名前
* @property string $deleted_at // 削除日時
*/
class User extends Model {
protected $hidden = [‘deleted_at’];
function getIsDeletedAttribute() {
return (boolean) ($this->deleted_at);
}
}
https://realm.io/docs/swift/latest/#queries
画像読み込みのストレスを減らす
• ローディング中に表示する
プレースホルダ用にサムネイ
ルをbase64したバイナリを
返す
laravel側の実装
/**
* @property string $id // ID
* @property string $name // 名前
*/
class User extends Model {
function getImageURLAttribute() {
return sprintf('%s/images/%d.jpg',
Config::get('app.url'), $this->user_id);
}
function getThumbnailAttribute() {
$bin = file_get_contents(
$this->thumbnail_file_path);
return base64encode($bin);
}
}
https://realm.io/docs/swift/latest/#queries
時差を考慮する
海外展開する場合等に困るので、
ISO8601で返すようにしてあげると安全
class User extends Model {
public function
getCreatedAtAttribute($date) {
return date('c', strtotime($date));
}
public function
getUpdatedAtAttribute($date) {
return date('c', strtotime($date));
}
}
https://realm.io/docs/swift/latest/#queries
RESTfulは注意
• リクエストの回数が増える

• フリースポット等で予期せぬ200が返ります

• statusをjsonに含めてチェックする等してあげた
方が無難
エラー発生時
App::error(function(Exception $exception, $code)
use($self) {
Log::error($exception);
$res = array(
'status' => 0,
'code' => $code,
'message' => $exception->getMessage(),
'trace' => $exception->getTraceAsString(),
);
if ($self->isDebug()) {
$res['sql_history'] = $self->sql_history;
$res['post'] = $_POST;
$res['get'] = $_GET;
}
return Response::json($res, $code);
});
https://realm.io/docs/swift/latest/#queries
AfterFilter
$this->afterFilter(function($route, $request,
$response) use($self) {
$data = $response->getOriginalContent();
if (!$data) {
$data = array();
}
if (is_array($data)) {
if (!isset($data['status'])) {
$data['status'] = 1;
}
if ($self->isDebug()) {
$data['sql_history'] = $self->sql_history;
$data['post'] = $_POST;
$data['get'] = $_GET;
}
$response->setContent($data);
}
});
https://realm.io/docs/swift/latest/#queries
レスポンスがタイムアウトするかも
• 通信状態が悪い場合、画像/動画のアップロード
でタイムアウトが発生するが、PHPはアップロー
ドが完了した時点でinsertしてしまう

• 極端に大きな通信はcommit用のAPIを用意して、
送信完了のレスポンスを受け取ってからcommit
する
ちょっとした変更でリクエストが複数回
• 通信量、速度のみでなく失敗のリスクも高まる

• JSON-RPC使う

• githubにあります (未確認)
laravelって素晴らしい!😉
• 優秀なQuery Builder

• 暗黙的でフレキシブルなORM

• SQLなんか書かなくて良い!

• 他FWに比べて並列分割のテーブルも扱いやすい

• API構築にも最適化されている
laravelって素晴らしい?😅
• CREATE TABLE必要

• Schema Builderもあるけど、やっぱり忘れる

• 複数テーブルをJOINし始めると辛い

• PHP7の新機能の活用に期待!
ご静聴ありがとう
ございました!

More Related Content

What's hot

Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법pyrasis
 
CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩淳 千葉
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Yuichi Ito
 
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~Recruit Lifestyle Co., Ltd.
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発Takafumi ONAKA
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기SeungYong Oh
 
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfukLaravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfukShohei Okada
 
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニングLaravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニングNOW PRODUCTION
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)についてYui Ito
 
Docker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | Edureka
Docker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | EdurekaDocker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | Edureka
Docker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | EdurekaEdureka!
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Masahito Zembutsu
 
AWS Black Belt Online Seminar 2018 AWS Well-Architected Framework
AWS Black Belt Online Seminar 2018 AWS Well-Architected FrameworkAWS Black Belt Online Seminar 2018 AWS Well-Architected Framework
AWS Black Belt Online Seminar 2018 AWS Well-Architected FrameworkAmazon Web Services Japan
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門増田 亨
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
backlogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るbacklogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るTakeru Maehara
 

What's hot (20)

Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법
 
CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
12 factor app
12 factor app12 factor app
12 factor app
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
 
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfukLaravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
 
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニングLaravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニング
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)について
 
Docker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | Edureka
Docker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | EdurekaDocker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | Edureka
Docker Swarm For High Availability | Docker Tutorial | DevOps Tutorial | Edureka
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
AWS Black Belt Online Seminar 2018 AWS Well-Architected Framework
AWS Black Belt Online Seminar 2018 AWS Well-Architected FrameworkAWS Black Belt Online Seminar 2018 AWS Well-Architected Framework
AWS Black Belt Online Seminar 2018 AWS Well-Architected Framework
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
backlogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るbacklogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見る
 

Similar to laravel x モバイルアプリ

SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの PerlのつかいかたRyuzo Yamamoto
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
Sledge recently in Yokohama.pm Aug, 2008
Sledge recently in Yokohama.pm Aug, 2008Sledge recently in Yokohama.pm Aug, 2008
Sledge recently in Yokohama.pm Aug, 2008Yoshiki Kurihara
 
JavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsiderJavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsiderTsuyoshi Yasunishi
 
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
 jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキングTakashi Okamoto
 
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成Tomoki Oyamatsu
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 
Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Yohei Sasaki
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~Microsoft Azure Japan
 
Realmの暗号化とAndroid System
Realmの暗号化とAndroid SystemRealmの暗号化とAndroid System
Realmの暗号化とAndroid SystemKeiji Ariyama
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittrkenjis
 
はてなのサービスの開発環境
はてなのサービスの開発環境はてなのサービスの開発環境
はてなのサービスの開発環境ast_j
 
多分モダンなWebアプリ開発
多分モダンなWebアプリ開発多分モダンなWebアプリ開発
多分モダンなWebアプリ開発tak-nakamura
 
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた日本マイクロソフト株式会社
 

Similar to laravel x モバイルアプリ (20)

SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの Perlのつかいかた
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Sledge recently in Yokohama.pm Aug, 2008
Sledge recently in Yokohama.pm Aug, 2008Sledge recently in Yokohama.pm Aug, 2008
Sledge recently in Yokohama.pm Aug, 2008
 
JavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsiderJavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsider
 
Jqm20120804 publish
Jqm20120804 publishJqm20120804 publish
Jqm20120804 publish
 
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
 jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
 
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22
 
APIMeetup 20170329_ichimura
APIMeetup 20170329_ichimuraAPIMeetup 20170329_ichimura
APIMeetup 20170329_ichimura
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
Realmの暗号化とAndroid System
Realmの暗号化とAndroid SystemRealmの暗号化とAndroid System
Realmの暗号化とAndroid System
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
はてなのサービスの開発環境
はてなのサービスの開発環境はてなのサービスの開発環境
はてなのサービスの開発環境
 
多分モダンなWebアプリ開発
多分モダンなWebアプリ開発多分モダンなWebアプリ開発
多分モダンなWebアプリ開発
 
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
 

laravel x モバイルアプリ