タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

2020-01-01から1年間の記事一覧

ActiveStorageのダイレクトアップロードを付属のJavaScriptライブラリ以外で使う

たとえば、graphqlなどアップロード機能を提供したいとき、 ダイレクトアップロード用の ActiveStorage::Blob とURL等を生成 結果を受け取ってレコードにファイルを添付する をMutationで実装したいことがあります。 クライアントはアップロードしようとする…

AWS SDK for Ruby でアップロード用の署名付きURLを生成する方法

s3_resource = Aws::S3::Resource.new object = s3_resource.bucket(BUCKET_NAME).object(OBJECT_KEY) url = URI.parse(object.presigned_url(:put)) ちなみにcurl コマンドでアップロードするには $ curl -i -X PUT --upload-file README.md "<PRESIGNED_URL>" HTTP/1.1 20</presigned_url>…

Adobe XD + VSCode + Flutter でデザイントークンを開発者に共有する

先日VSCodeのAdobe XDプラグインが公開され、Adobe XDで作成したプロトタイプをコーディングに利用することが可能になりました。 利用までの手順と、実際に何ができて何ができないのか?試してみたので記録しておきます。 coliss.com letsxd.com Adobe XD + …

RubyでFirebase Authenticationトークンを検証するサンプル

Firebase AuthenticationのトークンをRubyで検証する方法について

graphql-ruby + Multiple Databases with ActiveRecord

Query では読み込み専用 、Mutation では読み書きを使うようにしたかった。 github.com 上記のコメントで動くのだが、テストでトランザクションを使ったロールバック戦略を採用していると、レプリカに変更が伝搬されずに失敗する点に注意。(関連:Rails 6.0…

ActiveRecordでid以外によるアソシエーションを設定する

foreign_key: と primary_key: オプションを利用する。 # == Schema Information # # Table name: twitter_accounts # # id :bigint(8) not null, primary key # screen_name :string(255) not null # # Indexes # # index_twitter_accounts_on_screen_name …

コレクションキャッシュでキャッシュのキーをカスタマイズする方法

コレクションキャッシュについてコードリーディングを行ったところ、キャッシュキーのカスタマイズ方法がわかったのでメモ。

cron の代わり CloudWatch Events + Lambda + RunCommand でタスク実行を冗長化するCloudFormationテンプレート

AWSでサーバーレスなcron代替を構成する方法を紹介します。 この構成ではスケジューリングサーバーの管理なしに、冗長な定期タスク実行の仕組みを実現できます。

EC2インスタンスにSSH接続せずに任意のLinuxコマンドを実行する

AWS Systems Managerを利用すると、任意のLinuxコマンドを、外部から実行することもできます。

cron の代わり CloudWatch Events + Lambda + RunCommand でタスク実行を冗長化する

AWSでサーバーレスなcron代替を構成する方法を紹介します。 この構成ではスケジューリングサーバーの管理なしに、冗長な定期タスク実行の仕組みを実現できます。

AWS WAF v2 を使って特定のURLパスにアクセス元IPアドレス制限をかける

やりたかったこと ALB 配下のWebサーバーの特定のURLパス( /admin/ )には特定のIPアドレスからのみアクセスできるようにする IPアドレスの数は1個~たくさん 断念したこと ALBのリスナールールで制限 リスナールールの条件の数は上限が5個で許可対象のIPア…

Rails + PostGIS (activerecord-postgis-adapter) で矩形内に含まれるレコードを検索する

# == Schema Information # # Table name: places # # id :bigint not null, primary key # geom :geography not null, point, 4326 # # Indexes # # index_places_on_geom (geom) USING gist class Place < ApplicationRecord end class CreatePlaces < Act…

Docker Compose で PostGIS を使った開発環境を構築する

postgis/postgis イメージがあるのでそれを使います。 hub.docker.com このイメージは公式のpostgresイメージをベースに作成されていて、安心感があります。 Postgres の各バージョンと、PostGIS の各バージョンそれぞれの組み合わせから選べるので、多くの…

Rails で言語別に複数形変換 pluralize をカスタマイズする

言語特有の複数形やイレギュラーは、Rails標準の `pluralize` では正しく変換することができません。このようなときは、 `config/initializers/inflections.rb` に独自のルールを定義します。

Google API Client for Ruby でGoogleDriveにアップロード

S3などのオブジェクトストレージと比べて面倒 フォルダを作る必要がある 同名のフォルダを複数作成できてしまう gem 'google-api-client' require 'googleauth' require 'google/apis/drive_v3' FOLDER_ID = "xxxxxxxxxxxxxxxxxxxxxx" # https://drive.googl…

JavaScript (TypeScript) でビデオキャプチャーからの映像を表示したり、スナップショットを取ったりしたい!

USBビデオキャプチャーからの映像は、ブラウザからはWebカメラと同じように扱えます。 従って `getUserMedia` を使うことで簡単に取得することができます。

JavaScript (TypeScript) で画面全体や他のウインドウのスクリーンショットを取りたい!

Webアプリでデスクトップや他(ブラウザ以外の)ウインドウのスクリーンショットを撮りたい場面がありました。 こういうことです。 ブラウザで画面をキャプチャ&ショット サンプル See the Pen wvMGvWp by Yuichi Takeuchi (@takeyuweb) on CodePen. 動作確…

rails new したときにライブラリのインストールをしない

docker-compose などで動かしたいとき、ホストへライブラリのインストールをなるべくしたくない。(依存パッケージの関係でそもそも pg が入らない、とか) bundle install と rails webpacker:install を避ける rails new myapp --skip-bundle --database=p…

S3からGoogle Driveに同期する(Lambda Ruby + CDK)

やりたかったこと S3にアップロードされたアイテムをGoogleDriveの共有フォルダに同期する S3のオブジェクト作成イベントでLambdaを実行して処理 対象のバケットやLambda関数などはCDKで作成する この記事に書いたこと Lambda Ruby で gem を使う方法 AWS SD…

Ruby で SSLサーバ証明書の内容を確認する

cert_content = <

Ruby による Amazon Personalize の使い方

AWSの機械学習レコメンデーションサービスである Amazon Personalize を案件で利用したのでSDKの使い方メモです。 Amazon Personalize aws.amazon.com Amazon Personalize は、機械学習の知識がなくても、簡単にレコメンデーションをアプリに組み込むことが…

OpenAPI Specification からTypeScript型定義を生成するジェネレータ、swagger-to-tsを試す

GraphQLにおける graphql-codegen のような、 OpenAPI のSpecification から TypeScript の型定義を作ってくれる swagger-to-ts を触ってみました。 github.com まとめ VSCodeの補完が効いてうれしい typoやパラメータの不足などのミスを防ぐ 使い方 型定義…

Stoplight Studio を試す

OpenAPI の定義ファイルの作成と管理のためのツールを探していて、Stoplight Studio が良いと聞いたので試してみることにしました。 stoplight.io Stoplight Studio Stoplight Studio の触れ込み Next gen editor for API design & technical docs (API設計…

Lambda から EC2 インスタンス内でコマンドを実行する

Amazon SSM を利用することで、Lambda を使って、EC2インスタンス内で任意のコマンドを実行することができます。 これを CloudWatch Events と組み合わせると、従来CRONによって行っていたような定期実行タスクを、特定のEC2インスタンスをSPOFにすることな…

CloudFormation で CloudWatch Events + Lambda による定期実行タスクを作成する

AWSで定期的な処理を行いたいときは、CloudWatch Events を使い、 Lambda ファンクションの実行をスケジューリングすることで行います。 docs.aws.amazon.com 設定画面 CloudWatch Events のルール Lambdaファンクションの実行権限設定 CloudFormation テン…

DockerCompose + PostgreSQL Replication

Railsの複数データベース機能を開発環境でも有効にしたかった docker-compose up でセットアップから起動まで一発で動くようにしたい Docker Compose docker-compose.yml version: "3" volumes: pg_primary_data: driver: local pg_readonly_data: driver: l…

Ruby で Firebase User を作成

動機 Firebase Auth を使ったWebアプリの Rails System Spec を書きたい フロントエンドで Firebase JavaScript SDK を使っているため、バックエンドでのstubでは書けない サンプルコード(一部抜粋) Google::Apis::IdentitytoolkitV3::IdentityToolkitServ…

rspec で Firebase ID Token を stub

class SessionsController < ApplicationController def create id_token = params.required(:id_token) user = User.from_firebase(id_token) # (snip) end end class User < ApplicationRecord CIRTIFICATE_URL = 'https://www.googleapis.com/robot/v1/me…

rspec で ActionMailer の deliver_later のジョブはすぐに処理する

ActiveJob へのキューインの spec で示したように ActiveJob::Base.queue_adapter = :test を使うと、 perform_later のジョブはキューに溜まるようになる。 しかし、 ActionMailer の deliver_later で非同期送信を使っている場合にまでキューインされてし…

ActiveJob へのキューインの spec

まとめ ActiveJob::Base.queue_adapter = :test を使うと、 ActiveJob::Base.queue_adapter.enqueued_jobs にジョブが入る have_enqueued_job マッチャーでジョブが入っていることを expect する サンプルコード it 'enqueues PaymentIntentSuccessedJob' do…