タケユー・ウェブ日報

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

VSCode Remote - SSH と WSL2 でリモートFlutter開発

f:id:uzuki05:20181215091555j:plain

この記事について

できたこと

  • VSCode の Remote SSH で Flutter 開発をするAndroidアプリをビルド)
    • Remote SSH で WSL2 の Ubuntu で開発する
    • Remote SSH 接続先である WSL2 のホスト機は Android端末と同じネットワーク内にある

できないこと

  • 遠隔地やクラウド上にあるWindows PC上のWSL2に入ったFlutter SDKで、手元にあるAndroid端末を使ってデバッグ実行する
    • WSL2 のホスト機からAndroid端末に対してTCP/IPで接続できる必要があります。もしかするとトンネリングなどの手法で遠隔地でもできるかもしれないが

構成図

f:id:uzuki05:20210130030106p:plain
構成図

続きを読む

Aurora MySQL で utf8mb4 なダンプデータをインポートしようとして ERROR 1709 (HY000) at line 25: Index column size too large. The maximum column size is 767 bytes.

よく知られているのが、 innodb_large_prefix=1innodb_file_format=Barracuda にする、ROW_FORMATDYNAMICCOMPRESSED にする必要があることです。 しかしその設定は満足しているのに、なぜ?という場面がありました。

show variables where Variable_name in ('innodb_large_prefix', 'innodb_file_format', 'innodb_default_row_format');
show variables like "chara%";
+---------------------------+-----------+
| Variable_name             | Value     |
+---------------------------+-----------+
| innodb_default_row_format | dynamic   |
| innodb_file_format        | Barracuda |
| innodb_large_prefix       | ON        |
+---------------------------+-----------+
3 rows in set (0.00 sec)

+--------------------------+------------------------------------------------------------------+
| Variable_name            | Value                                                            |
+--------------------------+------------------------------------------------------------------+
| character_set_client     | utf8mb4                                                          |
| character_set_connection | utf8mb4                                                          |
| character_set_database   | utf8mb4                                                          |
| character_set_filesystem | utf8mb4                                                          |
| character_set_results    | utf8mb4                                                          |
| character_set_server     | utf8mb4                                                          |
| character_set_system     | utf8                                                             |
| character_sets_dir       | /rdsdbbin/oscar-5.7.mysql_aurora.2.07.2.0.1106.0/share/charsets/ |
+--------------------------+------------------------------------------------------------------+
8 rows in set (0.00 sec)

原因

dumpファイルで ROW_FORMAT=COMPRESSED が指定されていました。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=50853 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

Aurora MySQL では COMPRESSED に対応していません。

Amazon RDS MySQL DB インスタンスから DB クラスターにデータを移行するAmazon Aurora MySQL - AWS Database Migration Service

このため、このダンプファイルはAuroraでは ROW_FORMAT の不備という扱いになりまいた。

対策

少々乱暴ですがダンプファイルを書き換えることで対応しました。

Linuxの場合

$ sed -i -e "s/ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8/ROW_FORMAT=DYNAMIC/g" dump.sql

macの場合

$ sed -i "" -e "s/ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8/ROW_FORMAT=DYNAMIC/g" dump.sql

Flutter で Android App Bundle を作成して Play Console にアップロードするときのメモ

Android App Bundle (.aab) の作成

flutter clean
flutter build appbundle --build-number=123

アップロード

Android App Bundle (.aab)

f:id:uzuki05:20210125040908p:plain
アップロード先

アップロードするファイル

PROJECT_ROOT/build/app/outputs/bundle/release/app-release.aab

ネイティブ デバッグ シンボル

f:id:uzuki05:20210125041134p:plain
ネイティブ デバッグ シンボル のアップロード

アップロードするファイル

PROJECT_ROOT/build/app/intermediates/flutter/release/ にある arm64-v8a armeabi-v7a x86_64 を1つのZIPファイルにアーカイブしてアップロードします。 Windowsだとまとめて選択して「圧縮フォルダーへ送る」でOKです。

Flutter/Dart で S3 へのダイレクトアップロードを実装する

f:id:uzuki05:20181215091555j:plain

ダイレクトアップロードのクライアント側実装では次の2つのステップが必要です。

  1. ダイレクトアップロード用のURLを取得する
  2. S3にダイレクトアップロードする

Flutter /Dart でどう書けば良いのか?私が試した方法を紹介します。

この記事ではサーバ側の実装については述べません。

続きを読む

codemagicのiOSビルドで Did not find matching provisioning profiles for code signing!

f:id:uzuki05:20210124010608p:plain

事象

Flutter向けのCI/CDサービスの Codemagic を使っていて、 ios/Runner.xcodeproj/project.pbxprojPRODUCT_BUNDLE_IDENTIFIERjp.co.takeyuweb.app.${DEFINE_BUILD_ENV} のように変数を埋め込む形にしたところ、

== Building for iOS ==

> xcode-project use-profiles
Configure code signing settings
Searching for files matching /Users/builder/Library/MobileDevice/Provisioning Profiles/*.mobileprovision
List available code signing certificates in keychain /private/var/folders/pj/2d8_b7sn6f37c48z4jj09xk80000gn/T/build_k021qytp.keychain
Searching for files matching /Users/builder/clone/**/*.xcodeproj
Completed configuring code signing settings
Did not find matching provisioning profiles for code signing!
Generated options for exporting IPA
 - Method: ad-hoc
 - Provisioning Profiles: []
 - Signing Certificate: 
 - Signing Style: manual
 - Team Id: 
Saved export options to /Users/builder/export_options.plist

のようなエラーが出て正しくプロビジョニングプロファイルを選択できなくなりました。

続きを読む

Ngrokなどのトンネリングツールを使うときは、 default_url_options をトンネリングURLのものにしたい

f:id:uzuki05:20181215091555j:plain

ローカル開発中のRailsアプリに外部からのリクエストを届かせる必要があるとき、Ngrokは便利です。

たとえば

  • 開発中のアプリなどを実機で動かしてて、ローカルのRails APIサーバーと通信したい
  • 外部のサービスからのリクエストを受け取る必要がある

といったときです。

通常、Railsでは、url_forホスト部などはHTTPリクエストのヘッダー情報から取得して組み立ててくれるのですが、たとえば graphql-ruby のフィールドなど、コントローラー以外で Rails.application.routes.url_helpers.url_for(user) を使った場合など、 default_url_options がないとうまくいかないケースもあります。

そんなとき、いちいち config/environments/development.rb を編集するのは面倒ですし、うっかり変更したままコミットする悲しい事故も起こります。

そこでこんなコードを書きました。 こうしておけば必要なときに default_url_options を変えることができます。

# config/environments/development.rb

Rails.application.configure do

   # (省略)

  # echo "https://xxxxxxxxxxxx.jp.ngrok.io" > tmp/default_url_options.txt
  # bin/rails restart
  default_url_options_path = Rails.root.join('tmp', 'default_url_options.txt')
  if default_url_options_path.exist?
    default_url = default_url_options_path.read.strip
    uri = URI(default_url)
    config.hosts << uri.host

    Rails.application.routes.default_url_options = {
      host: uri.host,
      port: uri.port,
      protocol: uri.scheme
    }
  else
    Rails.application.routes.default_url_options = {
      host: 'localhost',
      port: 3000
    }
  end
end

Railsのアセット(ActiveStorage , Webpacker, Asset Pipeline)をCloudFront経由で配信する

f:id:uzuki05:20210121025234j:plain

業務でRailsアプリを作る場合、処理負荷的にも転送量的にも重い画像等は、CDNから配信するようにすることは、最早当たり前といって良いと思います。

最近は CDK によって簡単にCloudFront Distribution設定を維持管理でき、さらに ActiveStorage 等、Rails側の機能改善もあって以前に比べて、簡単に、レールから外れない範囲で書けるようになりました。

今回は以下のような構成で、CloudFront 経由での配信によるエッジキャッシュの利用を実現する方法について紹介します。

f:id:uzuki05:20210121011247p:plain
構成イメージ

手順

  1. CDKでCloudFrontを作成する
  2. ActiveStorage の URL を CloudFront経由のものにする
  3. Webpacker, Asset Pipeline の成果物のURLを CloudFront経由のものにする
続きを読む