Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

SaaSにおけるカスタムフィールド実装パターン

サーバーサイドエンジニアの田実です! ヤプリのプロダクトである Yappli、Yappli CRM ではお客様のアプリごとにユーザ属性を自由にカスタマイズできます。 例えばクライアントAは「姓」「名」「性別」の属性を使い、クライアントBは「ログインID」「電話番…

Alpine.jsと管理画面での利用例

サーバーサイドエンジニアの田実です。 顧客管理サービスである Yappli CRM の社内用管理画面ではjQueryが使われています。jQueryは簡易的なDOM操作やインタラクティブなデザイン、アニメーションを実装するには便利なツールである一方で、要件が複雑になる…

成果を出す技術

サーバーサイドエンジニアの田実です! 私はコードの実装スピードが早いらしく、どうやったらそんなに早く実装できるのか、成果を出せるのかと度々聞かれます。 改めて成果を出すスピードがどこに起因しているのかを掘り下げて考えたところ、それを達成する…

mockery/mockery の仕組み

PHP

サーバーサイドエンジニアの田実です! 今回はPHPのモックライブラリである mockery/mockery がどのようにして動いているのかを紹介します。 本記事は PHP Advent Calendar 2023 の5日目の投稿になります! コードリーディング 今回紹介するmockery のバー…

Inertia.js によるSPA実装の効率化とその仕組み

サーバーサイドエンジニアの田実です! SPAはMPAよりもユーザ体験が上がる可能性がある*1一方で、開発・運用が複雑になりがちです。APIスキーマの設計・管理、フロントエンドのルーティングの管理、認証認可・CORSなど、データを取得して表示するだけの簡単…

PHPをバージョンアップするための技術と戦略

サーバーサイドエンジニアの田実です! 2023年3月に開催された PHPerKaigi 2023 のパンフレット記事に PHPをバージョンアップするための技術と戦略 というタイトルで寄稿させていただきました*1。技術要素に依らず汎用的な内容で、パンフレット記事だけにし…

PHPStanで引っかかりがちなエラーについてまとめてみた

サーバーサイドエンジニアの田実です! ヤプリの一部のサービスはPHPで実装されており、それぞれのサービスは品質向上を目的として静的解析ツールである PHPStan を導入しています。 PHPStanにより多くの不具合を事前に検知することができるのですが、PHPSta…

技術記事共有用のSlackチャンネル #talk-tech-news と期待している効果

サーバーサイドエンジニアの田実です! ヤプリのSlackには #talk-tech-news という技術記事や技術ネタを共有するチャンネルがあります。 今回はこの技術共有用チャンネルに期待している効果や共有する技術記事を探す方法を紹介したいと思います! 育休中なの…

SQLite3で管理していたデータの一部をMySQLに移行した

サーバーサイドエンジニアの田実です! YappliのサービスではコンテンツデータをSQLite3で管理しています。SQLite3を使っている理由や課題の詳細は以下の記事に書いています。 tech.yappli.io コンテンツデータ以外にもアプリやアカウントのデータもコンテン…

Yappli CRMの開発者体験を3ヶ月で爆上げした

サーバーサイドエンジニアの田実です! ヤプリではスマホアプリをノーコードで開発できる Yappli のプロダクトだけではなく、アプリや外部システムと連携可能な顧客管理基盤である Yappli CRM というプロダクトも提供しています。Yappli CRMのバックエンドの…

実行時間に1週間かかっていた日次バッチ処理を6分に短縮した話

サーバーサイドエンジニアの田実です! タイトルの通り、完了まで1週間かかっていた日次バッチ処理を6分に短縮して1500倍以上高速化したので、今回はその改善について紹介したいと思います。 587459秒 = 6.7日かかっていたバッチが… 改善して6分程度に! …

symfony/pantherによるJavaScriptを含めた自動テスト

PHP

サーバーサイドエンジニアの田実です! YappliのPHPアプリケーションに symfony/panther を使ってJavaScriptの処理を含めた自動テストを導入したので、 導入の背景とインストール方法などを紹介をしたいと思います。 ※この記事は PHP Advent Calendar 2022 …

俺たちはなぜテックブログを書くのか〜ブログの効能と書き方とメンタル的TIPS〜

サーバーサイドエンジニアの田実です! ヤプリのテックブログにちょくちょく投稿しているのですが、今数えてみたら23記事も書いていたようです。 ヤプリのテックブログに投稿した数も多いのですが、 実は私の ブログ も含めると、これまで書いてきたブログ投…

YappliにおけるPHPのテストと現状の課題

PHP

サーバーサイドエンジニアの田実です! Yappliでは一部のネイティブAPIのアプリケーションや社内用管理画面、マイクロサービスなどをPHPを使って構築しています。 今回はYappliにおけるPHPのテストと現状の課題について紹介したいと思います。 詳細はこちら…

ノーコード開発プラットフォームYappliの社内用検索機能をGenerated Columnsを使って刷新しました

サーバーサイドエンジニアの田実です! YappliはSQLite3を使ってアプリ情報・アカウントの管理やコンテンツの管理を行っています。 社内システムでYappliが管理しているアプリの情報やアカウントを良い感じに検索できる機能があるのですが、今回はその検索機…

PHP Conference Japan 2022に参加・登壇してきました!

PHP

サーバーサイドエンジニアの田実です! PHP Conference Japan 2022 に参加・登壇してきました!今回はそのレポートになります! 登壇してきたよ 今回は業務に全く関係ない話ですが登壇してきました! speakerdeck.com プログラミング言語のソースコードをい…

ノーコード開発プラットフォームの課題とアプリ基盤改善プロジェクト

サーバーサイドエンジニアの田実です! 我々が開発・運用している Yappli というサービスはノーコードでスマホアプリが開発できるプラットフォームです。Yappliの機能数は50種類以上あり、ビデオ機能を使った動画配信やポイントカード機能を使ったデジタル会…

マルチテナント・マルチバージョンなコンテンツ管理システムをMySQLで再構築する

サーバーサイドエンジニアの田実です! Yappliではアプリのリリース前に下書きのコンテンツ(プレビュー)を事前に確認したり、下書きのコンテンツを本番に反映する機能があります。 stagingブランチでアプリの動作確認を行い、問題がなければstagingブラン…

YappliのGoのテストについて

Go

サーバーサイドエンジニアの田実です! 今回はYappliのGoのテストコードについて紹介したいと思います。 基本編 DBを使ったテスト HTTPリクエストのテスト インテグレーションテスト テストの実行とカバレッジの集計 その他 まとめ 基本編 基本的には標準ラ…

NewRelicをYappliのサービスに適用してみた

サーバーサイドエンジニアの田実です! Yappliではインフラ・アプリケーションの監視、メトリクスの計測にNewRelicを使っています。 今回、YappliのサーバーサイドアプリケーションにNewRelicを適用したので紹介したいと思います。 Go x gRPCなアプリケーシ…

PHPerKaigi 2022 にダイアモンドスポンサーとして協賛しています!

PHP

サーバーサイドエンジニアの田実です。 もうすぐ PHPerKaigi 2022 が始まりますね! 今回も面白そうなセッションばかりで非常に楽しみです。 phperkaigi.jp ヤプリは PHPerKaigi 2022 にダイアモンドスポンサーとして協賛しています!! ヤプリは創業期からP…

YappliにおけるgRPC, Protocol Buffers運用について

サーバーサイドエンジニアの田実です! Yappliでは各APIの通信にgRPC, Protobufを採用しています。 本記事ではYappliにおけるgRPC, Protobufの利用方法・運用方法についてご紹介します! 利用箇所 以下のAPI通信においてgRPCを利用しています。 用途 プロト…

SQLite3入門

サーバーサイドエンジニアの田実です! YappliはSQLite3を使ったマルチテナントアーキテクチャを採用しています。 今回は、SQLite3の運用でよく使うコマンドやちょっとマニアックな仕様についてまとめてみました! CLIでクエリ結果を縦に表示したい スキーマ…

gRPC-Gateway v2へのアップグレードで対応したこと

サーバーサイドエンジニアの田実です! YappliではネイティブアプリのAPIでgRPC-Gatewayを使って実装しています。 今回は、gRPC-Gatewayをv1からv2にアップグレードしたときに対応したことを紹介します! マイグレーションガイドはこちら↓ github.com 1. Go…

json.Unmarshalでmap[string]interface{}型にパースするときの注意点

Go

サーバーサイドエンジニアの田実です! 今回はGoの json.Unmarshal 関数で map[string]interface{} の型を指定したときに発生していた事象とその対策を併せて紹介します! なにが起きていたか 以下のように任意のキー、バリューを含むJSON文字列を map[strin…

PHPからGoを呼び出す方法

サーバーサイドエンジニアの田実です! ヤプリではPHPとGoを使っています。ということで(?)、PHPからGoを呼び出す方法について紹介します。 なおこの記事はGoからPHPを呼び出す方法の姉妹投稿(?)となっております。 ※この記事は PHP Advent Calendar 2…

GoからPHPを呼び出す方法

サーバーサイドエンジニアの田実です! ヤプリではGoとPHPを使っています。ということで(?)、GoからPHPを呼び出す方法について紹介します。 なおこの記事はPHPからGoを呼び出す方法の姉妹投稿(?)となっております。 ※この記事は Go Advent Calendar 20…

サーバーサイドエンジニアによるエンジニア採用の取り組み in 2021

サーバーサイドエンジニアの田実です! ヤプリではプロダクトをよりグロースさせていくために全社的にエンジニアの採用を強化しています。 サーバーサイドエンジニアも募集しているのですが、2020年7月から2021年9月の約一年間でサーバーサイドエンジニアの…

huskyの仕組みを調べてみた

サーバーサイドエンジニアの田実です! ヤプリのフロントエンドの開発では、huskyを使ってコミット前にlint-stagedを実行し、eslintやprettierでフォーマットしています。 huskyがどのようにして動いているのか興味があったので調べてみました。確認したhusk…

ファイルの埋め込みをstatikからgo:embedに置き換えた

Go

サーバーサイドエンジニアの田実です! Yappliではメールテンプレートや多言語化の設定ファイルをGoに埋め込んで使うためにstatikを使っていました。Go 1.16から導入されたgo:embedによってビルド時にファイルコンテンツを埋め込めるようになったので、stati…