LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログ

エンジニアブログ編集部の立ち上げとその目的

LCLでは今年からエンジニアブログ編集部を立ち上げました。 現在はフロントエンド、バックエンド、モバイルアプリエンジニアの3人で活動しています。 今回は立ち上げから3ヶ月が経過したので、立ち上げた経緯とその効果を紹介したいと思います。 目次 - エン…

Embulkを利用して、AWS請求情報をRedashで可視化する

今更ながら、Embulkを使う必要がでてきたので、素振り兼ねてAWS請求情報(S3)をDBへ格納しRedashで可視化できるようにしました。 AWSの費用は管理コンソールの「コストエクスプローラー」で確認できますが、コンソールへのログインはMFAを使用していることも…

ChatWork Webhookを利用したデプロイフロー

LCLでは、ChatWork + Hubotを利用してデプロイをしていましたが、ChatWorkがWebhookに対応したため、Hubotを廃止しました。簡単にどのような構成で行っているかを紹介します。

Bugsnagでエラーが多すぎる時に設定する3つの項目

フロントエンドエンジニアの岡田です。 以前ブログでもご紹介しましたが、LCLでは、JavaScriptのエラー検知のためにBugsnagを利用しています。 techblog.lclco.com 実は、設定してしばらくの間は、エラーが多すぎて本当に致命的なエラーが埋もれてしまってい…

git hooksをovercommitで管理して作業効率の底上げを狙う

チームで開発を進める上でちょっとした"決まりごと"が存在すると思います。 例えば、LCLの開発チームには以下の"決まりごと"が存在します。 コミットメッセージの先頭にはYouTrackのIssue番号を付ける RuboCopで設定したコーディングスタイルになるべく従う …

DFP Key-Value ターゲティングを利用して、広告配信を制御する

Webエンジニアの森脇です。 今回は、DFPでの広告配信について紹介します。 DFPとは DoubleClick for Publishers(DFP)は、Googleが提供している広告配信プラットフォームです。 多機能なので詳しくは、以下のドキュメントをご覧ください。 https://support.…

GASでラクをする技術(Gmail・Google Calendar・RSS編)

LCLでは業務や情報収集の中で定期的な作業を行う際にGoogle Apps Script(以下、GAS)を利用した自動化をしています。 GASとは、クラウド上でスクリプトを実行できるサービスです。スプレッドシートをはじめ、Googleが提供している色々なサービスと連携する…

突撃! 隣のChrome拡張機能

フロントエンドエンジニアの岡田です。 みなさん、Chromeの拡張機能、使っていますか? 拡張機能は、一つ一つはシンプルなものでも、既存のWebサービスをより使いやすくしてくれます。作業効率が上がるので、良い機能はどんどん取り入れていきたいですね。 …

iTerm2とfish shellを使ったターミナル環境構築のはじめの一歩

先日、エンジニアチームでの勉強会にてターミナルを題材としたハンズオンを行いました。今回はその際に共有した業務効率を上げるためのターミナル環境構築について紹介します。 以下に心当たりのある方は一緒に構築していきましょう。 ターミナルがモノクロ …

Webサービスの品質向上のために導入しているサービス・ツールまとめ

LCLが運営しているWebサービスは、品質向上のために、複数のサービスやツールを利用しています。今回はそれらのサービス・ツールをまとめてご紹介します。 品質向上のためのプロセス それぞれのサービス・ツールは以下のタイミングで利用しています。 各サー…

Varnish Grace Modeで非同期にキャッシュを更新する

先日、[https://inside-frontend.com/:title] というフロントエンドのイベントがあり、チームメンバーが参加しました。参加メンバーから日経新聞社様の事例「日経電子版を速くする」について共有をしてもらい、弊社でも活用できそうな点は、対応することにし…

Railsアプリケーションで採用しているDBスキーマ設計ガイドライン

Railsアプリケーションで採用しているDB設計(スキーマ定義)について紹介します。 ※ Railsでは当たり前もの、Railsに依存していない内容も含んでいます。

Dangerの指摘をChatWorkに流してリリースのミスを防ぐ

LCLでは作業中のPull Reqeustが誤マージされるのを防ぐため、Pull Requestのステータスをラベルで管理しています。 ラベルは「WIP」と「ready for release」の2つあり、マージするためには「ready for release」を付ける必要があります。 「ready for releas…

モブプロ方式による勉強会

フロントエンドエンジニアの岡田です。 今回は、少し前からエンジニアチームで行っているモブプロ方式による勉強会についてご紹介します。 モブプロ(モブプログラミング)とは なぜモブプロ方式による勉強会をはじめたか LCLのモブプロルール 活用例 自動テ…

デバイスサイズが異なるシミュレータで一度にアプリを起動して動作確認の効率を上げる

iOS

モバイルアプリエンジニアの山下です。 iPhone Xが発売されて4ヶ月が経とうとしてますが、iOSエンジニアにとっては確認する端末がまたひとつ増え苦労しています。 Xcode 9からシミュレータ自体の並行起動は可能になりましたが、アプリの実行は1つのシミュレ…

PostgreSQLで安全にテーブル定義を変更する

Webエンジニアの森脇です。 PostgreSQLで、サービス稼働中に安易にALTER TABLE等を実行すると、ダウンタイムに繋がることがあります。安全にテーブル定義を変更するために、弊社で気をつけている点を紹介します。 なお、本記事の内容は PostgreSQL 9.5.4 環…

Zapier × ChatWorkでちょっと面倒な日々のタスクを自動化する

フロントエンドエンジニアの岡田です。 LCLのエンジニアチームでは、積極的にリモートワークを行っています。私も週に2日は完全リモートワークで、他の3日間も在宅勤務と会社での勤務を併用しています。 そこでエンジニアチームで大切にしているのが、チャッ…

LCLはITエンジニアが「成長できる」環境か

モバイルアプリエンジニアの山下です。 去年の8月に入社してから早くも半年が経とうとしています。 techblog.lclco.com 先日、開発チームで ITエンジニア採用に欠かせない原則とは の記事が話題に上がりました。 そこで、LCLはITエンジニアが「成長できる」…

AWS WAFの概要まとめ

年末年始にかけて、AWS関連の最新情報を整理していたところ、AWS WAFがかなり使いやすいレベルにアップデートされていました。 セキュリティ関連のサービスは、日頃はそれほど最新の情報を追えていないので、これを機会に簡単にまとめたいと思います。 AWS W…

Redashで1つのカラムに保存されたJSONデータを取り扱う

Redashでデータを加工する際に、1つのカラムに含まれるJSONの中身を取り扱う必要がありました。しかし、単純にクエリを叩くだけではJSONの中身を参照できません。 そこで、Redashの機能の一つであるPython Data Sourceを利用してJSONを解析し、各データを1つ…

コードレビューの機械的な指摘はDangerに任せる

先日のコードレビューの機械的な指摘はSideCIに任せるに続き、 今回は同様のことが可能であるOSSのDangerについて紹介します。 Danger とは Dangerとは、Pull Requestのレビュー時に発生しやすい、 ”You Forgot To...(...するのを忘れてませんか?)"という…

AMPページにsticky広告(固定追尾広告)を表示する

フロントエンドエンジニアの岡田です。 先日、AMPページにsticky広告を追加しました。 その際にいくつかつまづいた点があったのでまとめます。 弊社が運営するバスとりっぷでは、AMPページを用意しています。 すでに通常の広告は表示していたのですが、今回…

iOSアプリ開発で動作確認をする際にあると捗るTips

iOS

この記事はiOS2 Advent Calendar 2017の9日目の記事です。 開発中やリリース前に、手動での動作確認を行うことは多いと思います。 弊社では、リリースの前にテスト配布を行い、他のエンジニアメンバーや 担当のデザイナー、プロジェクトマネージャーに動作確…

コードレビューの機械的な指摘はSideCIに任せる

コードレビューを自動化してくれるSideCIを導入しました。GitHubのプルリクエストを自動で解析して指摘してくれます。 主にRubyを使用しているのでRuboCopを筆頭に解析ツールが豊富に揃っているのは助かっています。 導入の経緯 もともとRuboCop, JSHint, ES…

InstabugのWeb版(Beta)導入方法

InstabugでWebサイトのフィードバックを送れるように設定しました。 すでにiOSでは使い始めていて、iOSの設定については以下の記事で軽く触れています。 techblog.lclco.com Web版は現時点(2017/11/13)でBeta版のためか、少し導入でつまづいた点もありまし…

ChatWorkのWebhookをRuby/Railsで受信する

先日、ChatworkがWebhookに対応されました。弊社では普段からChatworkを利用しており、早速検証しました。 ビジネスチャット「チャットワーク」がWebhookとOAuthに対応、オープンβ版の提供開始〜2018年春までにクラウドサービス17社18サービスとデータ連携開…

Baltoからの移行先としてInstaBugとBugseeを比較してみました

iOS

先日、Baltoがサービスを終了するという悲しいお知らせがありました。 【重要】フィードバックツール「Balto」サービス終了について 日々のフィードバックや開発の中盤から終盤の確認フェーズにかけて、 大変お世話になり、Baltoのおかげで開発スピードが何…

モバイルアプリエンジニアとして入社して3ヶ月が経ちました

2017年8月よりモバイルアプリエンジニアとして入社しました 山下です。 入社後1ヶ月ほどから下書きを書きつつ、あっという間に3ヶ月が経っていました。 新しい環境にも慣れてきたので、今回は転職の経緯や入社までの所感、 入社後3ヶ月経った上での会社の紹…

Bitriseで動作するFastlane/Gymでビルドが失敗する問題の解決方法

iOS

Xcode9 / Swift4の対応後、とあるブランチを配布しようとした際に PodsでインストールしたライブラリでProvisioning Profileが参照できずビルドが失敗する現象が発生しました。 以下はBitrise上のログです。(Provisioning Profile等の情報は伏せてあります…

Swift 4とiPhone Xの対応をしました

iOS

iPhone Xの発売まであと1週間ほどとなり、 弊社のiOSアプリ「高速バス比較」でも、Swift4とiPhone Xの対応を行いました。 今回は、Swift3からSwift4への作業内容をまとめていきたいと思います。 準備 Xcode上でビルドするためにコードやライブラリの更新をし…