サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
衆院選
wapa5pow.com
この記事は 10X 創業6周年アドベントカレンダーの23日目の記事になります。 昨日はデータプロダクト部のysdytさんが、「ネットスーパー立ち上げの裏でデータの人は何をやってるの?」という記事を公開しています。 この記事では0->1->10になるときに出てくる問題と対策を共有し、同じような境遇にある方や、もうすぐ問題が起きそうなときにどのように対処したらいいかの一例として知ってもらえればなと思います。 書いてある事は自分以外にも10Xのメンバが作り上げてきたものです。 前提として10Xが作っているStailerが0なのか1なのか10なのかはわかりませんが、大手の小売の方に使ってもらえているので0でも1でもない気がしていてここでは10とさせていただきます(10Xだし)。 10Xは「ネットスーパー・ネットドラッグストアの立ち上げと成長を支援」するStailerというサービスを作っています。
不変クラスとは何か 前回の記事で紹介したように契約プログラミングでは以下の条件がありました。 事前条件(preconditions) 事後条件(postconditions) 不変条件(invariants) 事前条件と事後条件は想像がつくのですが不変条件はわかりにくいです。 不変条件とはメソッドが呼ばれたときの開始時と終了時に共通して保証されるべき条件です。例えば銀行口座の場合は口座の金額がマイナスにならないなどの条件です。 この不変条件をクラスに当てはめると 「守るべき条件をクラスのライフタイム(生成時・メソッド後)で必ず満たす」 不変クラス(Class invariant)になります。 不変クラスはどのように良いコードに貢献するのか 例えば銀行口座クラスがあったとします。 Dartで一番シンプルに実装すると以下のクラスになります。 「残高がマイナスにならない」というルールがあったとし
DDDやレイヤードアーキテクチャでアプリケーションを書いているとどのレイヤで値のバリデーションをしていくか迷う時があります。 レイヤーが増えたときに多くの場所でバリデーションを書きすぎると重複したコードが増え可読性も生産性も下がります。 レイヤごとに行うバリデーション それではどのレイヤでどのようなバリデーションをすればいいのでしょうか。以下のようにするといいのではと思っています。 フロントエンド ユーザの入力はシステムで想定されていない値がくるかもしれないので必要ならバリデーションを行います。 ただフロントエンドでバリデーションは、直接リクエストを変更しサーバにリクエストを投げることにより改変可能なので信用してはいけません。 あくまで最終的なバリデーションはサーバで行うとして多くのリクエストをサーバに投げられるのを防ぐためやサーバにいちいちリクエストしてユーザの利便性を損なうならばバリデ
入社したのが2017年11月だったので今月で5年間になります。いままででこんなに長く同じ会社で働いた事はなく長く働き続けられているのはひとえに10Xで働くのが楽しいからだと思っています。いろんなことがありましたがその時々であったこと学んだことを書いていきます。 10Xがサービスをリリースしていないときのまさに0.1くらいのときからいるのでいろいろ参考になるかもしれません。 そもそも10Xはどんな会社か いまはStailerという小売チェーンのECを垂直立ち上げするプラットフォームを作っています。スーパーなどの小売様がStailerを導入することによりWeb・アプリに対応したネットスーパーを立ち上げる事ができます。 Stailerを始める前にタベリーといういまはクローズした献立推薦アプリを作っていました。Stailerはタベリーで提供していた注文機能を切り出してそれぞれの小売様向けのアプリと
ここ数年、NotionとGitHubという組み合わせでプロダクト開発をしています。 ただ、両者が提供している機能をあわせても効率的に開発する上で足りていないなという点がでてきているので何が足りないかを明らかにし改善策を提案したいと思います。 Notion + GitHubだと何が足りないのか 前提として、アジャイル開発(Scrum開発)をしており各ツールは以下のように使用しています。 タスクがNotionとGitHubのIssueにわかれて入れられておりScrum開発で言うすべての開発アイテムがプロダクトバックログに入っている状態ではないです。 ロードマップやスケジュールはNotionで管理されていますが、Notionがデータベースのアイテムを階層化することができないのでタイムライン(ガントチャートのようなもの)でみたときにタスクとサブタスクがどのように紐付いているかわからず、スケジュール
GoでCloud SQLを使うことになったのですがライブラリが複数ありどのライブラリを選んでいいか迷ったので比較してみます。 ライブラリを導入する上でほしい機能は以下です。 migration: Railsみたいにマイグレーションファイルがかけてマイグレーションやロールバックがしたい transaction: トランザクションが書きやすく直感的 orm: データベースへのクエリを抽象化でき、Goのstructへのマッピングも可能 connection pool: データベースへのコネクション数を制限できる multiple environment support: 本番・ステージング・開発環境など複数の環境で設定Sを使い分けられる TL;DR スキーマを一度だけ書き、Goのstructもそれから生成してほしい場合は、マイグレーションをk0kubun/sqldef, ORMをvolatile
Kubernetes上に分析環境を構築する機会があったのでどのように構築したかを紹介します。同じような構成でKubernetes上で構築するのは3回目になったので構築方法も洗練されてきました。構成は以下のようになっています。 MySQL(RDS): サービスのデータベース。ここのテーブルからBigQueryにEmbulkでデータをエクスポートします。 PostgreSQL(RDS): Digdagのデータベース。今回新たにつくりました。 Digdag: データベースのエクスポートなどを実行するタスクスケジューラ。失敗したときにリトライもできます。 Embulk: プラグインを使ってデータベースをMySQLからBigQueryにエクスポートします。Digdagと同じDockerコンテナでDigdagのタスクから実行されます。 BigQuery: すべてのエクスポートされたデータをここに集約さ
�1.5年前ほどから投資をはじめました。その前から投資はやったほうがいいと思っていながらなかなか開始することができませんでした。 その理由として、以下がありました。 どのくらいのリターンがあるか、そのリターンは自分にとって満足いくかを認識できていなかった どこの証券会社がよくてどのようにすれば1を達成できるか調べるのが億劫だった あるとき、1の理由を解消する出来事がおきました。 飲み会で同じくエンジニアで投資している人から2年くらいの投資成績を見せてもらいました。WealthNavi(ロボット投資)で2000万くらい投資していて、300万くらい利益がでていました。 その額に驚いて自分でもやってみたいと思ってとりあえずWealthNaviからはじめました。 その後、iDeCo、NISA、海外ETFの定期積立、米国株の個別株購入という道をたどって現在にいたります。 このページでは私がどのような
Webエンジニアをしていれば経験したことがある人も少なくはない作業にDNSのレコード切り替えによるサーバ移転作業があります。 以下のように旧サーバがIPアドレスAで、新サーバがIPアドレスBで、DNSのレコードの向き先をAからBにするという作業です。 DNSのレコードを切り替えるだけなら簡単ではないかと思うかもしれませんが、自分は過去3回中2回失敗して再度挑戦して成功した経験がありなかなかあなどれません。 そのような経験の中で振り返りどのようにしていたら失敗しないで成功していたかを書こうかと思います。 失敗しないために 失敗しにくくするためには、以下の作業が必要です。 切り戻ししやすくする 切り替え前に実機でアクセスしてテストする 切り替え前にTLS証明書をテストする 切り戻ししやすくする DNSのレコードを切り替えたあとに障害などが見つかり元のサーバに切り戻すということがあるかもしれませ
年度が代わり新しい環境に行く人も多いですね。新しい環境・プロダクトだといろいろ戸惑うことがあります。自分は数年ごとに転職し、副業も複数のところでしているので初めての環境に関わることが結構あります。そのなかで素早くチームになじんでプロダクトに貢献できるようにやっていることがあるのでそれを紹介したいと思います。 自分がウェブやアプリのエンジニアなのでその文脈で話します。 「プロダクトのあるべき姿と現状を把握する」と「短期的・長期的に貢献できることを探す」ことを意識してやっています。 プロダクトのあるべき姿と現状を把握する 関わるプロダクトがユーザの何を解決しているのか理解することは開発する上で非常に大切です。機能を開発する上でもただ開発するだけでなくその機能自体が必要なのかどうか、必要ならどのような機能にすればユーザが問題を解決しやすいかという何を開発するかに密接にかかわっています。 1. ア
FlutterアプリでSentryとFirebase Crashlyticsにエラーレポートを送りアプリの品質改善に役立てる Flutterアプリとしてエラーは大きく2種類あります。 Flutter/Dart側で起きるエラー ネイティブ(Android/iOS)側で起きるエラー 今回は、1をSentryで、2をFirebase Crashlyticsで収集します。本当はどちらともFirebase Crashlyticsで収集したかったのですが、Crashlyticsのほうは、iOSで同じエラーでも以下のように別々のエラーとして扱われてしまったのでSentryとCrashlyticsを使っています。同じように扱える場合は、Crashlyticsで統一したいですね(ここ解決する方法しっていたら教えてください)。 Sentryの導入 まずあらかじめSentryでアカウントを作っておきます。Sen
3年ほど前からwapa5pow.comのドメインでブログをNetlify上のGatsbyで構築していましたがVercel上のNext.jsに移行しました。 当時はMarkdownで書いてGitHubにプッシュするだけでデプロイされて書きやすかったのですが、やりにくい点が多々でてきました。 当時触ったことのないReactの上にさらにGatsbyがのっていて細かいところに手がつけられない Gatsbyのバージョンが古くてnpmモジュールがいれられずSpeaker Deckなどの埋め込みがしずらい OGPの画像を自分で作成しなければいけない Markdownのメタデータにカテゴリを入れるところがあり無駄なものを考えなければいけない などです。以前Zennのエディタをローカルで動かしたときに編集しやすくこれと同じような感じでローカルで楽しくブログを書きたいなと思い構築しました。 Reactも最近触
目次 ワーカーノードの作成 DigdagとEmbulkのDockerビルド KubernetesにDigdag/Embulkをデプロイ Redashの導入 まとめ Kubernetes上に分析環境を構築する機会があったのでどのように構築したかを紹介します。同じような構成でKubernetes上で構築するのは3回目になったので構築方法も洗練されてきました。構成は以下のようになっています。 MySQL(RDS): サービスのデータベース。ここのテーブルからBigQueryにEmbulkでデータをエクスポートします。 PostgreSQL(RDS): Digdagのデータベース。今回新たにつくりました。 Digdag: データベースのエクスポートなどを実行するタスクスケジューラ。失敗したときにリトライもできます。 Embulk: プラグインを使ってデータベースをMySQLからBigQueryにエ
目次 tl;dr アーキテクチャ サービスアーキテクチャ まとめ 「Stailer」は株式会社 10Xが提供する「開発不要でネットスーパーアプリを立ち上げられるシステム」です。バックエンドとそれにつなげるアプリ(iOSとAndroid)を提供しています。 10Xではよりよいチームを目指しエンジニアも含めメンバーを募っています。エンジニアが気になるどのような技術を使っているかに関して今回このブログで紹介しようと思います。少しでもチームに興味を持ってもらえたら採用ページがあるのでぜひぜひこちらからご応募ください。 tl;dr インフラはGCP クライアントはFlutter(Dart)でサーバもDart サービス間通信はgRPC 分析環境はBigQuery/Redash/Digdagの組み合わせ 監視はCloud Monitoring アーキテクチャ Stailerは主なサービスはGCP上に構築
目次 Kubernetesの監視は大変 Cloud Monitoringだけで監視はできないか Cloud MonitoringでGKEをちゃんと監視するにはどうしたらいいか どのように実現したか インストール方法 PrometheusとStackdriver Prometheus sidecar Blackbox nodeExporter Prometheusの値をただCloud Monitoringに送るだけでは物足りない Cloud Monitoringでどのように監視できるか 既存のKubernetes Engineダッシュボード Prometheusのデータとともに作成されたダッシュボード 複数環境でダッシュボードをどのように同期するか アラートの設定 まとめ ここ2週間くらい10XでGKEの監視を整えています。2年前にタベリーで監視を整えたときよりだいぶいい感じに作れたのでどの
目次 構築方法 まとめ 最近はすべてのログはBigQueryに流すという運用をしています。iOS/AndroidのアプリログはFirebase AnalyticsでログをとってFirebaseの設定からBigQueryにエクスポートできます。 ブラウザの場合は自分は定まった方法をもっていなくて、Google Analyticsのカスタムイベントを送るとかがあるかなと思いますが今回はCloud RunのREST APIを使ってさくっと構築できる方法があったので構築方法を紹介します。 構築方法 構成は以下のようになります。 Cloud RunにREST APIを作ってGoのプログラムを実行し標準出力にJSON形式でログを出力します。そのログをLoggingのフィルタ機能を使ってフィルタし、エクスポート機能でBigQueryに出力します。 Cloud RunはUsing Cloud Pub/Su
目次 アーキテクチャ フロントエンド・バックエンドアーキテクチャ 分析アーキテクチャ レコメンデーションアーキテクチャ 最後に 「タベリー」は株式会社10Xが提供するパーソナルな献立を推薦するアプリです。iOSとAndroidとWebで提供しています。先日、プレスリリースで「オンライン注文機能リリース」と「2.5億円の第三者割当増資を実施したこと」をお知らせしました。献立作成、献立からの買い物リスト作成、買い物リストをネットスーパーで注文、料理を作るということがタベリー1つでできます。特にこの「オンライン注文機能」はいままでネットスーパーの商品を1つ1つ選択して注文していたものを、自動でカートに追加し注文できるのでとても便利です。 10Xではよりよいチームを目指しメンバーを募っています。エンジニアも募集しています。チームがどのように開発しているかは社長の矢本さんが書いた「10Xなプロダクト
目次 構成 Hubのカスタマイズ Jupyter Notebookのカスタマイズ まとめ 最近お手伝いしている会社で、機械学習・デープラーニングを学ぶユーザ向けに、ユーザごとのJupyter Notebookをウェブサイト上で操作できるようにした仕組みを構築しました。どのような課題があってどのように構築したのかを説明したいと思います。 Jupyter Notebookは以下のようにウェブブラウザ上でコードを実行してその結果を保存し共有できます。再度実行も簡単にできるので、機械学習・ディープラーニングの実行コードを共有するのに便利です。 (https://jupyter.org/より) その会社は機械学習のEラーニングを社会人向けに展開しており、ユーザはウェブページにアクセスして学びます。内容的にはPython、機械学習、ディープラーニングだったりするのですがモデルの学習のため、コーディング
目次 Kubernetesの実行環境としてMinikubeとDocker for Macどちらを選ぶか Telepresenceについて MinikubeとTelepresenceを使ってローカル開発環境を実現 まとめ 1年半くらいKubernetesにアプリケーションをデプロイして本番・ステージングと動かしていますが、ローカル開発環境はDocker Composeを使って開発しています。Docker Composeでの開発はそこそこ快適ではあったものの実際Kubernetes上で動いていないので、細かい環境が異なります。かといってMacでKubernetesを動かそうとするといちいちDockerイメージを作ってデプロイしてなければいけなくて面倒です。 今回、MinikubeとTelepresenceを使ってKubernetes上なのに快適なローカルな開発環境を構築できました。Miniku
目次 TL;DR 環境設定 migrationライブラリの調査 liamstask/goose 対応しているデータベース インストール 設定ファイル マイグレーションファイルの作成 マイグレーション ロールバック 所感 rubenv/sql-migrate 対応しているデータベース インストール 設定ファイル マイグレーションファイルの作成 マイグレーション ロールバック 所感 naoina/migu 対応しているデータベース インストール マイグレーション 所感 gobuffalo/pop 対応しているデータベース インストール 設定ファイル マイグレーションファイルの作成 マイグレーション ロールバック 既存のデータベースのスキーマをダンプする 所感 k0kubun/sqldef インストール スキーマの定義 スキーマの適用 スキーマのエクスポート 所感 ORMライブラリの調査 gob
このページを最初にブックマークしてみませんか?
『wapa5pow blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く