SlideShare a Scribd company logo
1 of 14
Recommend Widgetを作った
話
Masahiro Higuchi / 樋口雅拓
● グリーグループのリミア株式会社で、LIMIA という住まい領域のメ
ディアを作っています。ゲーム会社ですが、最近はメディアに力を
入れています。
● 機械学習のエンジニアですが、iOS, Android,JSなどもやっている何で
も屋です。4歳の娘のパパ。twitter: @mahiguch1
● https://limia.jp/
● https://arine.jp/
● https://aumo.jp/
● https://www.mine-3m.com/mine/
LIMIAとは?
● メディアサービス
● 記事一覧を表示し、タップす
ると記事詳細を閲覧できる。
● 記事詳細の最下部に別の記事
への回遊導線が付いている
RecommendWidgetとは?
● メディアアプリの記事下に付いている。オ
ススメ記事と広告をセットにしたもの。
● オススメ記事はRecommendEngine、広告
は広告システムから取得している。
● 3, 6, 9枠目が広告のようにして、指定位置
に差し込む。
背景と目的
● 既存のRecommendWidgetを使っていたが、思ったほど成果が上がら
なかった。
● じゃあ、内製化するか!
● 軽い気持ちで始めたら、想定外の要件が発生。
--> 同じ罠にハマる人が減るように、経験を共有します。
RecommendWidget実装1
想像通り、サーバから取得しているコンテンツを表示している。
serverIdeaClient.callGetIdeaRecommendation(object : RequestListener<List<IdeaCompactDto>> {
override fun onSuccess(data: List<IdeaCompactDto>?) {
iIdeaDetailView?.showRecommendationIdeas(data?.let { convertFromDtoList(data,
ContentViewModel.ListType.RECOMMENDATION) })
}
}
override fun showRecommendationIdeas(list: List<IContentView>?) {
ideaDetailRecyclerAdapter?.addItems(IdeaDetailRecyclerAdapter.LayoutType.IDEA_RECOMMENDATION, list)
}
fun addItems(type: LayoutType, list: List<IContentView>?) {
contentLst.addAll(list)
}
RecommendWidget実装2
指定枠(3, 6, 9枠目)には、コンテンツとは別に広告を広告システムか
ら取得して表示している。
private fun loadAdvertisement(order: SspViewModel, h: RecyclerView.ViewHolder, position: Int) {
adsViewManager.houseAdManager.callAdvertisement(object : LimiaHouseAdViewManager.RequestListener{
override fun onSuccess(houseAdDto: HouseAdDto) {
model.houseAdDto = houseAdDto
holder.intoView(context, model, object: HouseAdClickListener {
広告取得部分の詳細については、potatotips#60のLT資料で解説していますhttps://speakerdeck.com/mahiguch/firestorewoshi-
オススメ記事の生成方法
オススメ記事の一覧は、サーバ側で生成して
いる。
● ユーザの行動履歴を元に、似たような行
動をしているユーザが見ていて自分が見
ていないもの。
● 同じようなトピックについて書いてある
記事。
これらを混ぜて応答している。
リリースしてほっとしていたら。。。
● 二つのアルゴリズムを混ぜて表示したら、どちらがどれだけ効果が
あるのかよくわからない。
→ CTRを計測することで、この課題を解決しよう!
CTRとは?
CTR(Click Through Rate) = タップ数 / 表示回数
【表示回数の定義】
・広告が視聴可能なスクリーンに表示されていること
・広告の一定面積以上が見える状態にあること
・広告が一定の時間以上見える状態であること
・広告が人間によって視聴されていること
つまり、一覧表示のChild/Cellが画面上に表示したうち、タップされた割合。
タップ数は簡単に取れるが、スクリーンに表示された回数はどう取れば良いのか?
スクリーンに表示されたログ送信(iOS)
スクリーンに表示された回数は、表示される度にログを送信すれば実現
できる。iOSの場合、cellのwillDisplayでログ送信すれば実現可能。
override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell,
forItemAt indexPath: IndexPath) { ログ送信 }
https://developer.apple.com/documentation/uikit/uicollectionviewdelegate/1618087-collectionview?language=objc
スクリーンに表示されたログ送信(Android)1
AndroidではRecyclerView.layoutManagerのpositionを取得する
ことで実現した。
(obtainRecyclerView()?.layoutManager as? LinearLayoutManager)?.let {
val first = it.findFirstVisibleItemPosition()
val last = it.findLastVisibleItemPosition()
if (first >= 0 && last >= 0) {
for (position in first..last) {
ログ送信
https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager.html#findFirstVisibleItemPositio
n()
スクリーンに表示されたログ送信(Android)2
いきなり走らせると更新される度にログが再送されてしまうので、viewTreeObserverの
Listnerに仕込むことで描画してからログ送信されるようにした。
obtainRecyclerView()?.viewTreeObserver?.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
logImpressionForCurrentVisibleItems {
obtainRecyclerView()?.viewTreeObserver?.removeOnGlobalLayoutListener(this)
https://developer.android.com/reference/android/view/ViewTreeObserver
まとめ
● RecommendWidgetは簡単に作れる。
● 計測は面倒なので、良い方法があれば教えて欲しい。
● RecommendEngineの中身は、どこかで話したい。
ご静聴、ありがとうございました!

More Related Content

What's hot

公式部活動技術書典部の活動紹介
公式部活動技術書典部の活動紹介公式部活動技術書典部の活動紹介
公式部活動技術書典部の活動紹介gree_tech
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さま
#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さま#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さま
#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さまDaiki Hirozawa
 
IoTを擬人化してみた
IoTを擬人化してみたIoTを擬人化してみた
IoTを擬人化してみたIchiro Tsuji
 
IoTを擬人化してみた そして巨大化してみる
IoTを擬人化してみた そして巨大化してみるIoTを擬人化してみた そして巨大化してみる
IoTを擬人化してみた そして巨大化してみるIchiro Tsuji
 
JAWS-UG京都をre:Bootしてみた
JAWS-UG京都をre:BootしてみたJAWS-UG京都をre:Bootしてみた
JAWS-UG京都をre:BootしてみたIchiro Tsuji
 
WordPressとS3で落ちないコーポレートサイトを立ち上げよう
WordPressとS3で落ちないコーポレートサイトを立ち上げようWordPressとS3で落ちないコーポレートサイトを立ち上げよう
WordPressとS3で落ちないコーポレートサイトを立ち上げようIchiro Tsuji
 
【サンプル】 Instagram開設マニュアルサービス資料
【サンプル】 Instagram開設マニュアルサービス資料【サンプル】 Instagram開設マニュアルサービス資料
【サンプル】 Instagram開設マニュアルサービス資料AAsolution
 
月間6アプリリリースの開発現場でのQiita:Team活用法
月間6アプリリリースの開発現場でのQiita:Team活用法月間6アプリリリースの開発現場でのQiita:Team活用法
月間6アプリリリースの開発現場でのQiita:Team活用法Naoya Mouri
 
How are AsakusaSatellite growing with mzp
How are AsakusaSatellite growing with mzpHow are AsakusaSatellite growing with mzp
How are AsakusaSatellite growing with mzpRyo Suetsugu
 
Ruby会議08 倉貫発表資料
Ruby会議08 倉貫発表資料Ruby会議08 倉貫発表資料
Ruby会議08 倉貫発表資料Yoshihito Kuranuki
 
Matcherの紹介@ITリーダー育成キャンプ
Matcherの紹介@ITリーダー育成キャンプMatcherの紹介@ITリーダー育成キャンプ
Matcherの紹介@ITリーダー育成キャンプnoriyaz
 
3行説明「ZakurIT」
3行説明「ZakurIT」3行説明「ZakurIT」
3行説明「ZakurIT」R Tamura
 
Trend of Augmented Reality (for Event tool Japan) 2013
Trend of Augmented Reality (for Event tool Japan) 2013Trend of Augmented Reality (for Event tool Japan) 2013
Trend of Augmented Reality (for Event tool Japan) 2013Etsuji Kameyama
 
NIFTYCloud C4SA FacebookNight vol.11
NIFTYCloud C4SA FacebookNight vol.11NIFTYCloud C4SA FacebookNight vol.11
NIFTYCloud C4SA FacebookNight vol.11Yuichi Saotome
 
Realtime database、Clean Architectureを組み合わせた導入事例
Realtime database、Clean Architectureを組み合わせた導入事例Realtime database、Clean Architectureを組み合わせた導入事例
Realtime database、Clean Architectureを組み合わせた導入事例Tatsuya Kikuchi
 
マルチテナントに対応したシラサギグループウェアのご紹介
マルチテナントに対応したシラサギグループウェアのご紹介マルチテナントに対応したシラサギグループウェアのご紹介
マルチテナントに対応したシラサギグループウェアのご紹介Shinji Tanimoto
 

What's hot (17)

公式部活動技術書典部の活動紹介
公式部活動技術書典部の活動紹介公式部活動技術書典部の活動紹介
公式部活動技術書典部の活動紹介
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さま
#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さま#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さま
#インスタサミット 「アカウント運用の基礎」アライドアーキテクツ株式会社 藤田さま
 
IoTを擬人化してみた
IoTを擬人化してみたIoTを擬人化してみた
IoTを擬人化してみた
 
IoTを擬人化してみた そして巨大化してみる
IoTを擬人化してみた そして巨大化してみるIoTを擬人化してみた そして巨大化してみる
IoTを擬人化してみた そして巨大化してみる
 
JAWS-UG京都をre:Bootしてみた
JAWS-UG京都をre:BootしてみたJAWS-UG京都をre:Bootしてみた
JAWS-UG京都をre:Bootしてみた
 
WordPressとS3で落ちないコーポレートサイトを立ち上げよう
WordPressとS3で落ちないコーポレートサイトを立ち上げようWordPressとS3で落ちないコーポレートサイトを立ち上げよう
WordPressとS3で落ちないコーポレートサイトを立ち上げよう
 
【サンプル】 Instagram開設マニュアルサービス資料
【サンプル】 Instagram開設マニュアルサービス資料【サンプル】 Instagram開設マニュアルサービス資料
【サンプル】 Instagram開設マニュアルサービス資料
 
月間6アプリリリースの開発現場でのQiita:Team活用法
月間6アプリリリースの開発現場でのQiita:Team活用法月間6アプリリリースの開発現場でのQiita:Team活用法
月間6アプリリリースの開発現場でのQiita:Team活用法
 
How are AsakusaSatellite growing with mzp
How are AsakusaSatellite growing with mzpHow are AsakusaSatellite growing with mzp
How are AsakusaSatellite growing with mzp
 
Ruby会議08 倉貫発表資料
Ruby会議08 倉貫発表資料Ruby会議08 倉貫発表資料
Ruby会議08 倉貫発表資料
 
Matcherの紹介@ITリーダー育成キャンプ
Matcherの紹介@ITリーダー育成キャンプMatcherの紹介@ITリーダー育成キャンプ
Matcherの紹介@ITリーダー育成キャンプ
 
3行説明「ZakurIT」
3行説明「ZakurIT」3行説明「ZakurIT」
3行説明「ZakurIT」
 
Trend of Augmented Reality (for Event tool Japan) 2013
Trend of Augmented Reality (for Event tool Japan) 2013Trend of Augmented Reality (for Event tool Japan) 2013
Trend of Augmented Reality (for Event tool Japan) 2013
 
NIFTYCloud C4SA FacebookNight vol.11
NIFTYCloud C4SA FacebookNight vol.11NIFTYCloud C4SA FacebookNight vol.11
NIFTYCloud C4SA FacebookNight vol.11
 
Realtime database、Clean Architectureを組み合わせた導入事例
Realtime database、Clean Architectureを組み合わせた導入事例Realtime database、Clean Architectureを組み合わせた導入事例
Realtime database、Clean Architectureを組み合わせた導入事例
 
マルチテナントに対応したシラサギグループウェアのご紹介
マルチテナントに対応したシラサギグループウェアのご紹介マルチテナントに対応したシラサギグループウェアのご紹介
マルチテナントに対応したシラサギグループウェアのご紹介
 

More from gree_tech

アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜gree_tech
 
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介gree_tech
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表gree_tech
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~gree_tech
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化gree_tech
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介gree_tech
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介gree_tech
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてgree_tech
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験gree_tech
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組みgree_tech
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違いgree_tech
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介gree_tech
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてgree_tech
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーgree_tech
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-gree_tech
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話gree_tech
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)gree_tech
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜gree_tech
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)gree_tech
 

More from gree_tech (20)

アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
 
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件について
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジー
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
 

RecommendWidgetを作った話