heroku/pythonからPython2のサポートが外れたことの回避策
遭遇した問題
- Python 2.7 で動いているアプリケーションが Heroku(Stack-18)でデプロイができなくなった。
- すでに stack-18はdeprecatedだが、 Python 2 をサポートしている唯一のstackであり、EOLは2023年の5月1日だと書かれていたので驚いた。
原因
使用していたbuildpackであるheroku/pythonのバージョンがあがり、Python 2.7がサポート外になったこと。
対策
Python 2.7 EOL FAQ | Heroku Dev Center に記述があるとおり、buildpackのURLを heroku/python
から https://github.com/heroku/heroku-buildpack-python#v218
に変更する必要がある。
参考
heroku.ymlでConfig-Varsを利用する
やりたいこと
heroku.yml を利用してRailsアプリをHerokuにデプロイしたい。heroku.ymlを利用したDockerfileのビルドで bin/rails asset:precompile
を利用する際に必要な環境変数 SECRET_KEY_BASE
をハードコードせず、heroku config:set
で利用できるConfig-Varsを利用したい。
やったこと
以下のように、 変数名を参照することができます
build: docker: web: Dockerfile config: SECRET_KEY_BASE: $SECRET_KEY_BASE
app.jsonを配備すれば、Review Appsごとに SECRET_KEY_BASE
をセットすることも可能です。
( review
というキーにネストさせることもできる らしいのですがそこは試していません 🙏 )
{ "stack": "container", "env": { "SECRET_KEY_BASE": { "required": true, "generator": "secret" } } }
余談
Fullstaq Rubyを使ったRailsアプリをHerokuで動かすやつ(絶賛お試し中)
EchoをVercel(Zeit now)のServerless Function上で動かす
TL;DR
Goやサーバレスアーキテクチャの初心者なので、もうちょっといいやり方ないかなーと持っています。
やりたいこと
Vercel(Zeit now)を使っていて、Serverless functionでGoが選択できたので利用してみたいと思ったので試してみた。
やったこと
ドキュメントにあるように プロジェクトルートに api
ディレクトリを生成して date.go
などつくる(このときhttp.HandleFuncのシグネチャである公開メソッドを用意すること)と /api/date
というURLを提供できる( /api/
を指定したい場合は /api/index.go
とする)。
が、今回はルーティングはEchoに任せたい(そもそもこれでいいのか?)と思ったので、 now.json の routes
オプションを使い、 /api
配下に来たリクエストは /api/index.go
で受け取って振り分けるようにした。
わかっていないこと
go.mod で module github.com/kimihito/hoge
みたいな指定をすると、 now dev
などで開発するとGitHubにアクセスしにいってしまう。 これがGo modのお作法なのか、 利用しているプラットフォームの動作なのかわかっていない(ょゎぃ)
参考にしたリンク
HanamiでNuxt.jsのビルドしたファイルを配信したい
やりたいこと
- HTML, CSS, JavaScriptはHanamiの
app/web/views
で書きたくない。 - Nuxt.jsやcreate-react-appとかで作ったものを public 配下で配信したい
- ただ Hanami.rb では
public/index.html
をおいても反映されなかった
やったこと
Hanami::Static#initializer
に index
オプションを付与する
require 'rack/static' module Hanami class Static < ::Rack::Static def initialize(app, root: Hanami.public_directory, header_rules: HEADER_RULES) super(app, urls: _urls(root), root: root, header_rules: header_rules, index: 'index.html') # index: 'index.html' を追加 end end end
動作確認をしたリポジトリ
Nuxt.js側の設定(srcDir
, generate dir
を指定を変えたり、 @nuxt/proxy 入れたり)もあります(雑コミットでごめんなさい)
参考
Google Cloud Storageでダイレクトアップロードを有効にする on Heroku
やりたいこと
- RailsでActive Storageを利用している
- Google Cloud Storageを利用している
Rails.application.configuration.active_storage.service = :google
- Heroku Review Appsでも利用したい。
やったこと
setup for Active Storage direct upload ( Google Cl ...
github.com にてドキュメントが追加されましたが、ダイレクトアップロードを実行する際はCORSの設定が必要なのでその参考になるといいなぁと思ったので。
外部キー制約を付与したデータにより Herokuで db:fixtures:load が落ちてしまう
TL;DR
ENV['FIXTURES'] = 'hoge,fuga,bar'
と並び順を指定してから投入しているが、あまり良いやり方ではなさそうなので、なにか良い方法があれば教えてください 🙏
遭遇した問題
今作っているアプリケーションをHerokuで開発している。 Review Appsで動作を確認したいので、 db:fixtures:load
を読みだしたところ下記のようなエラーが出た。
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table "hoge" violates foreign key constraint "fk_rails_xxxxx"
Rails のバージョンは 5.2.3 。
原因
テーブル fuga が hoge に対して外部キー制約を持っていたが、 hoge より先に fuga のデータを作ろうとしてしまいエラーになっているようだった。
Use SET CONSTRAINTS
for disable_referential_integrity
without superuser privileges (take 2) がRevertされており、現状解決策はなさそう?
やったこと
この辺を見て、ENV['FIXTURES'] = 'hoge,fuga,bar'
と投入順を指定することで対処した。ただこれだと fixtures/*.yml
の増減に引っ張られてしまうので、微妙だと思っている。
なにか他に良い方法があれば教えて下さい 🙏
参考
アバター画像のプレースホルダに avatars.dicebear.com を利用する
TL;DR
https://avatars.dicebear.com/v2/種類/値.svg
みたいな感じで入力すればアバター画像のプレースホルダが手に入る。
他にもいろいろオプションがあるので便利かも。
やりたいこと
Webサービスでよくある、ログインユーザのアイコン画像を表示するときデフォルトをどうしようと思っていた。
GitHubのようなアイコン生成は identicons というらしく、似たような形で表現したいなーと思っていた。
やったこと
npmパッケージなどないか調べていたら、上掲の DiceBear/avatars を見つけたので導入した。 上掲のURLで利用することを推奨していたけど、npmパッケージで導入。
「Sprite Collections」を見ると identicons だけじゃなくていろんな種類がある。
READMEの通りに導入した。
Stimulus: A modest JavaScript framework for the HTML you already have.で使うときはこんな感じでconnect
で呼び出す。