よしたく blog

ほぼ週刊で記事を書いています

Action CableをHerokuで動かす時のサブスクリプションアダプタ設定

Heroku で Action Cable を使うにはデフォルトの設定から変更する必要がある。 具体的に、初期設定ではconfig/cable.ymlファイルは下記のようになっており、redis を使う設定になっている。Heroku 環境を用意したときにデフォルトで Redis は使用できないので production 部分を変更する必要がある。

development:
  adapter: async

test:
  adapter: test

production:
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
  channel_prefix: heroku_cable_production

Action Cable で使えるサブスクリプションアダプタ

Action Cable で使えるサブスクリプションアダプタを整理する。 前提として Action Cable を動かすためにはサブスクリプションアダプタを設定する必要があり、現在利用できるアダプタは 3 種類ある。

  • Async アダプタ
    • 開発やテスト環境で利用するためのもの
  • Redis アダプタ
  • PostgreSQL アダプタ

Async アダプタは開発やテスト環境用で、 Heroku を本番環境として用意し Action Cable を動かすためには適していない。 Redis アダプタは、Heroku で Redis を使おうとすると別料金が掛かるため、一旦選択肢から外す。 その結果、Heroku 環境で無料利用できる PostgreSQL アダプタを使うのが選択肢に上がってくる。 ここからは PostgreSQL アダプタを使うための設定変更をおこなう。

設定変更

config/cable.yml の設定を変更する。 作成直後、 production 部分は redis が指定されていたが adapter を postgresql に変更する。 また、URL 部分も DATABASE_URL を見るように変更する。

development:
  adapter: async

test:
  adapter: test

-production:
-  adapter: redis
-  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
-  channel_prefix: heroku_cable_production
+production:
+  adapter: postgresql
+  url: <%= ENV['DATABASE_URL'] %>

まとめ

Heroku で Action Cable を使うための設定変更を確認した。 ちなみに、Heroku 環境で async 使うことは推奨されていないだけで、使うことはできる。 その場合は development に書いてあるのと同じように adapter に async を設定すれば利用可能になる。

development:
  adapter: async

test:
  adapter: test

-production:
-  adapter: redis
-  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
-  channel_prefix: heroku_cable_production
+production:
+  adapter: async

macOS Montereyから登場したショートカットを使う

iOSでは以前から使うことができたショートカットアプリが、Macでも使うことができるようになった。 現在自分が設定しているものをアイデアとして載せておく。

www.apple.com

コミュニケーション系アプリを全部終わらせるショートカット

起動したコミュニケーション系アプリをすべて閉じるためのショートカットを作成した。

f:id:yoshitaku_jp:20220327213119p:plain

コミュニケーション系アプリを開始するショートカット

逆にこちらはコミュニケーション系アプリを起動するためのショートカットになる。 ダラダラ見て時間が経っていることを避けるため、起動した後は5分後に前述の「コミュニケーション系アプリを全部終わらせるショートカット」を呼び出すようにしている。

f:id:yoshitaku_jp:20220327222136p:plain

ブログ執筆環境をVisual Studio Codeで開く

iOS版より様々なことができるようでシェルスクリプトの実行も可能になっている。

cd /Users/yoshitaku/workspace/blog
code .

を実行して執筆環境を開けるものになっている。

f:id:yoshitaku_jp:20220327222540p:plain

Terminal is dumb but no VISUAL nor EDITOR defined.エラーを解決する

macOS Monterey にして VS Code から git commitとしたらTerminal is dumb but no VISUAL nor EDITOR defined.が発生した。

デフォルト設定が外れてしまった理由がよくわからないけど、再度設定しておく。 設定する際に検索したことと、検索しても欲しい情報になかなかヒットしなかったのでメモとして残しておく。

git config --global core.editor vim

S3互換のMinIOを触ってみた

MinIO とは

MinIO は、高性能で S3 互換のオブジェクトストレージを提供します。 Kubernetes にネイティブな MinIO は、以下のような環境で利用できる唯一のオブジェクトストレージスイートです。 すべてのパブリッククラウド、すべての Kubernetes ディストリビューションプライベートクラウド、そして エッジになります。MinIO はソフトウェア定義型であり、GNU AGPL v3 のもと 100%オープンソースで提供されます。

MinIO は AWS の S3 と互換性のあるストレージになる。 Minio と表記されている記事をよく見たけど、公式サイトには MinIO と書いてあった。

min.io

Docker で動かす

MinIO を docker-compose で動かす。 ports90009001で分けているが、1 つにまとめようとするとうまくうごかなかったので、このまま分けておいたほうが良さそう。 docker-compose.yml は次のような形。

minio:
  image: "minio/minio"
  container_name: minio
  environment:
    MINIO_ROOT_USER: minio
    MINIO_ROOT_PASSWORD: miniominiominio
  command: server /export --address :9000 --console-address :9001
  volumes:
    - ./minio/data:/export
  ports:
    - "9000:9000"
    - "9001:9001"

docker-compose upで起動すると、http://127.0.0.1:9001/loginでアクセスができる。

ユーザ名とパスワードは docker-compose.yml で設定したので、ログインする。

  • ユーザ名
    • minio
  • パスワード
    • miniominiominio

Bucket 作成

画面上から Bucket を作成してみる。

Bucket Name に system-a と入力し、Create Bucket をクリックする。

無事に作成できたことが確認できる。

ファイル配置

Upload ボタンをクリックするとファイルをアップロードできる。 これはアップロード後の画面になる。

左のタブの Buckets をクリックすると Bucket の一覧と先ほど作成したsystem-aBuclet が見える。 ファイルを置いたことにより、Usage と Objects にも現在の数値が反映されている。

ディレクトリにもファイルが配置されていることがわかる。

まとめ

ローカルで S3 と同等のことができる MinIO を触ってみた。 ローカル環境で開発するときに S3 を用意する必要もないし、Docker で実行することも確かめられたので CI 環境でも利用できそう!

Streamlitに用意されている「line_chart」「area_chart」「bar_chart」を触ってみた

Streamlit について引き続き確認していく。

yoshitaku-jp.hatenablog.com

今回は Streamlit で標準に用意されている simple chart を試す。

紹介されているのは以下の 3 種類になる。

line_chart

線グラフはst.line_chart関数で表現できる。 ここでは温度の上下を想定したデータを作って表現してみた。

df_temp = pd.DataFrame(
    np.random.uniform(15.0, 25.0, 6), columns=["温度"], index=np.array(range(9, 15))
)
st.line_chart(df_temp)

表示されるとこんな感じ。

f:id:yoshitaku_jp:20220305092503p:plain

docs.streamlit.io

area_chart

面グラフはst.area_chart関数で表現できる。 ここでは月の収支を想定したデータを作って表現してみた。

df_pl = pd.DataFrame(
    np.random.uniform(500, 1000, (12, 2)),
    columns=["収入", "支出"],
)
st.area_chart(df_pl)

表示されるとこんな感じ。

f:id:yoshitaku_jp:20220305092510p:plain

docs.streamlit.io

bar_chart

棒グラフはst.bar_chart関数で表現できる。 ここではページごとのクリック数を想定したデータを作って表現してみた。

df_clicks = pd.DataFrame(
    np.random.uniform(500, 1000, 3),
    columns=["clicks"],
    index=["Page A", "Page B", "Page C"],
)
st.bar_chart(df_clicks)

表示されるとこんな感じ。

f:id:yoshitaku_jp:20220305092518p:plain

docs.streamlit.io

まとめ

今回は simple chart として紹介されていた line_chartarea_chartbar_chartを触ってみた。

簡単に表現できてとても便利だと感じたが、DataFrame でのデータの持ち方や DataFrame の Index に依存するようなので、そこのメンテナンスが鍵になりそう。現段階で pyplot に慣れていない自分でも、関数に DataFrame を流すだけで図表を書いてくれるのは大変ありがたかった! また、今は種類が少ないので別の図表も表現できるようになれば嬉しいと感じた。 streamlit/roadmap#q2-2022に 「Develop apps in the browser.」「We want to make it much, much easier to create beautiful charts with a single line of code!」といったことが書いてあるので、期待している!

凝った表現をしたければシンタックスシュガーとして紹介されているst.altair_chart st.pyplotを使うことになる。Streamlit を導入する前までに pyplot で作成してきた資産があれば、こちらがいいと思う

SQLAlchemyを使ってMysql 8.0にアクセスしたらAuthentication plugin 'caching_sha2_password' is not supported エラーが発生した

SQLAlchemyを使ったPython環境でDcoker上に立てたMysql 8.0にアクセスしたらAuthentication plugin 'caching_sha2_password' is not supported エラーが発生した。 これはMySQLのバージョン8.0以降、デフォルトの認証方式がcaching_sha2_passwordに変更されているが、SQLAlchemyが対応していないため発生している。

MySQL5.7までの認証プラグインには mysql_native_password がデフォルトで使用されていましたが、MySQL8.0より新たに追加された caching_sha2_password に変更されました。 SHA-256を使用した、より安全なパスワードの暗号化を提供するとともに、キャッシュを使用して同一ユーザの認証処理を高速化しようという、MySQL推奨の認証プラグインです。

(中略)

しかし、認証プラグインに caching_sha2_password を設定しているユーザは、接続に使用するクライアント又はコネクタ側でも caching_sha2_password をサポートしている必要があり、サポートされていない場合は、認証エラーが返されます。

MySQL8.0新機能 (caching_sha2_password 認証プラグイン) | スマートスタイル TECH BLOG

このエラーを回避するためにcaching_sha2_passwordがサポートされているコネクタを使用することはもちろん挙げられるが、Dockerを使って一時的にアクセスしたかったことと、Pandasのread_sql_query関数では引数sqlalchemyを使わなければいけないので、MySQL側の設定を変更することで回避した。

mysqld --default-authentication-plugin=mysql_native_password

Python製のWebフレームワークStreamlitをさわってみた

datatech-jp Casual Talks #1に参加したときに知った、Python製のWebフレームワークStreamlitを触ってみた。

yoshitaku-jp.hatenablog.com

streamlit.io

github.com

Streamlitのサイトを覗くとまずThe fastest way to build and share data appsと書いてあり、データ周りで共有を楽にすることを全面に打ち出していることがわかる。 Pythonスクリプトで実行できるので、データ分析スクリプトの内容をそのまま流用できるのも嬉しいし、Pythonで完結されるのでフロントエンドの知識が不要な点も大きい!

今回はどれぐらい簡単に表示できるのか試してみる。 まずはDockerを使って環境の準備から立ち上げ実施し、次にseabornのtitanicデータを使って可視化をおこなう。

準備

streamlitフォルダを作成し、直下にDockerfileとdocker-compose.ymlを用意する。streamlit以外にもライブラリが入っているけど立ち上げ後に使うので、必要なければ入れなくても大丈夫🙏

Dockerfile

FROM python:3.9.10

RUN pip install streamlit
RUN pip install pandas
RUN pip install seaborn
RUN pip install matplotlib

docker-compose.yml

version: '3'
services:
  app:
    build: .
    container_name: 'streamlit'
    command: "streamlit run src/app.py"
    ports:
      - "8501:8501"
    volumes:
      - "./src:/src/"

次にstreamlit配下にsrcフォルダを用意し、app.pyを作成する。app.pyには次の内容を記述する。

import streamlit as st

# タイトル
st.title("Streamlit Application - titanic data")

立ち上げ

ここまで用意できたらdocker-compose up -d --buildで起動し、http://localhost:8501/にアクセスする。次の画面が表示される。 まずは立ち上げまで実施してみた。

f:id:yoshitaku_jp:20220220200240p:plain

データ周りを表示してみる

app.pyの内容を次のように変更してみる。 スクリプトのコメントにも書いたけど、seabornのサンプルデータtitanicを元に、生存者データの可視化とチケット別生存者データの可視化で2つの図を表示してみた!

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import streamlit as st

# タイトル
st.title("Streamlit Application - titanic data")

# タイタニックデータの読み込み
titanic = sns.load_dataset("titanic")

# 生存者データの可視化
st.subheader("Number of Titanic Survivors")

fig1 = plt.figure(figsize=(10, 4))
sns.countplot(x="survived", data=titanic)
st.pyplot(fig1)

# チケット別生存者データの可視化
st.subheader("Number of Titanic Survivors by Ticket")

fig2 = plt.figure(figsize=(10, 4))
sns.countplot(x="survived", hue="class", data=titanic)
st.pyplot(fig2)

このコードは次のように表示してくれる。 無事に2つの図が表示されている💡

f:id:yoshitaku_jp:20220220201133p:plain

まとめ

ダッシュボード周りはコード化しづらく、現在もダッシュボードの変更履歴が管理できない部分は頭を悩ませていて、今後広く問題になると思っていたのでStreamlitのようなものが解決の糸口になってくれると嬉しいと感じた。 他に似たようなdashもあるので、こちらはこちらも触って比較したい💪

github.com

datatech-jp Casual Talks #1 に参加した!

datatech-jpのCasual Talks #1 が開催されるとのことで覗いてみた!

datatech-jp.connpass.com

発表内容

資料待ち / syou6162

会社のテックブログに掲載されるとのことで公開待ち🙏

公開されていたので貼りました🙏

tech-blog.monotaro.com

小さく始めるデータ基盤 / reizist

speakerdeck.com

スタートアップ企業でデータ基盤を作成した話だった。 どんなデータを、どこに、どうやって集めるのかと言った定義から、実際に選択された製品までまとまっていてわかりやすかった。 コストのところではCloudRunとBigQueryで200円ということで、コンビニコーヒー2杯と考えたらめっちゃ安い! なかなか公開できない部分ではあるけど、スタートアップ以外ではどのぐらいのコスト感で運用しているのか気になった🙏

BigQueryのネイティブJSON型がサポートされたので触ってみた / ohsawa0515

speakerdeck.com

BigQueryのネイティブJSON型を触ってみた話だった。 今までSQLやユーザ定義関数を使ってスキーマ定義していたものがJSON型で触りやすくなったのはいい話だと思った。 8スライドめにパフォーマンスについても言及されていて素晴らしいと思った。 テーブルサイズがString型よりも半分近くも削減されるのは、理由が気になる!

開発者生産性指標の可視化 / udzura

speakerdeck.com

For Keysというソフトウェア開発チームのパフォーマンスを示す4つの指標を、自チームでどう実現したかという話だった。 エンジニアとしてのパフォーマンスを可視化できるなんて面白い! また、それをどうやって集めていったかの話にも言及されていて勉強になった。

もう一つの話題で面白かったのがDashboard as Codeだった。 ダッシュボードの変更履歴や構成が管理できない部分は、今後自分も問題になるんじゃないかと思っていて、ここにチャレンジしているのはすごいと思った。 StreamlitというPython製のWebフレームワークが紹介されていて、ノートブック系で試行錯誤した結果をPandasやNumPyそのままの形でダッシュボードまで持っていきやすい点がいいと思った。 時間があったら触ってみたい!

まとめでは、Four Keysの他にも有効な指標がないか模索している点や、ダッシュボードが活用されているかも追っていくことが明言されていて、今後も気になる!

まとめ

datatech-jpのCasual Talks #1に参加し、聞けた範囲でメモを残した!

  • 小さい規模でのデータ基盤について
  • 技術的に検証した話
  • 指標を設定してそれをどう追っていったかとダッシュボードの変更管理

と話題が重ならず、そしてどれも興味深く話を聞くことが出来た!

datatech-jpのSlackでは書籍の輪読会なども実施されていて見ていて楽しい! 勉強会中はチャンネルでコミュニケーションが盛り上がっていたが、Twitterハッシュタグでも盛り上がっている様子が伝わればいいなと思った! 2回目があれば楽しみにしています!!

Azure Data FactoryのFailアクティビティについて調べた

f:id:yoshitaku_jp:20220206100004p:plain

2021年後半にAzure Data FactoryのFailアクティビティが追加されました。10月頃にプレビューで登場していたのは確認していたのですが、いつのまにかGAされていました。Failアクティビティは名前の通りパイプライン上で意図的にエラーを引き起こしたいときに使えるものです。

docs.microsoft.com

Failアクティビティが登場するまでは、パイプライン上でゼロ除算を実行させたり、Web アクティビティで存在しないURLにアクセスしてエラーを引き起こし処理を止めていました。あまり良い処理の止め方ではないのでFailアクティビティが登場してよかったです。ここでは実際にどう動くのかをまとめました。なお、日本語では失敗アクティビティという名前がついていますが今回はFailアクティビティに統一して記事を書いています。

Failアクティビティ作成

2022年02月現在、Failアクティビティは全般カテゴリの中にあります。

f:id:yoshitaku_jp:20220206085435p:plain

実際に配置してみると以下のようになります。真ん中にあるのがFailアクティビティです。左右にはWaitアクティビティを置いています。

f:id:yoshitaku_jp:20220206090527p:plain

動きの確認

当たり前ですが、エラーが発生しFailアクティビティで処理が止まってくれないと意味がありません。さきほどのパイプラインをデバッグ実行してみます。

実行結果を見ると後続のFailアクティビティが実行されておらず、無事に処理が止まっていることが確認できます。

f:id:yoshitaku_jp:20220206091156p:plain

次はトリガー実行しメールが送信されるかも確認します。アラート設定は省きますが、こちらも無事に送信されていました。

f:id:yoshitaku_jp:20220206094120p:plain

注意点

注意点としてはForEachアクティビティなどのループ処理の中でFailアクティビティでエラーを引き起こしても、ループ処理は継続され抜け出さないことには注意が必要です。

Cloud Storageでオブジェクトのライフサイクルを設定する

多くの企業がデータ分析基盤を選択するときにGoogle Cloud Platformを選んでいる気がするので、気になって少し触ってみた。 わからないことが多すぎてオープンワールドのゲームに飛び込んだような感覚なので、まずは手軽にCloud Storageでライフサイクルの設定をおこない記事にした🙏

ライフサイクルの設定

バケットsandbox-yoshitakuを作成した状態になっている。今回はこのバケットで設定をおこなってみる。 対象のバケットをクリックする。

f:id:yoshitaku_jp:20220130164928p:plain

バケットの詳細に移動してくる。タブがいくつかあるなか、ライフサイクルがあるのでクリックする。 現時点で並んでいるのは次の5つになる。

  • オブジェクト
  • 設定
  • 権限
  • 保護
  • ライフサイクル

権限保護ライフサイクルは設定タブの中にまとまりそうだけど、この3つだけ外に出されている点が気になった🙋

f:id:yoshitaku_jp:20220130165148p:plain

ライフサイクルのタブに移動すると、ルールの追加があるのでクリックする。

f:id:yoshitaku_jp:20220130165234p:plain

オブジェクト ライフサイクル ルールの追加に移動してくる。デフォルト設定で作成されたバケットはストレージクラスがStandardなので、Standardからどこへ移動させるかの設定をおこなう。

移動先のストレージクラスは3つから選べ、削除も入れると選択肢としては4つになる。 今回はデータレイクの選択肢として一番最初に使われそうなNearline(アクセスが 1 か月に 1 回未満のバックアップとデータに最適)を選択する。

  • Nearline
  • Coldline
  • Archive
  • 削除

f:id:yoshitaku_jp:20220130165303p:plain

オブジェクト条件の選択に移動してきて、どの条件のオブジェクトを先ほど設定したNearlineに移動させるかを設定していく。 データ分析基盤だと、データが届いて1ヶ月ぐらいで移動させるケースが多いので、年齢に30を設定する。 最後に作成をクリックして完了となる。

f:id:yoshitaku_jp:20220130165359p:plain

作成した設定がライフサイクルのタブに表示されていればOKとなる👌

ゴミ箱マークをクリックすれば設定の削除できるが、今の時点で確認ダイアログは出なかったので注意が必要😕 細かい設定をした後に間違えて消してしまうなんてことがないようにしたい。 確認ダイアログ求む〜🙏

f:id:yoshitaku_jp:20220130165443p:plain

まとめ

Cloud Storageでオブジェクトのライフサイクルを設定してみた。

オブジェクト ライフサイクル ルールの追加での、年齢選択肢はデータが生成されてということを表現していると思っているけど、表現としてはわかりづらくて戸惑った🙁 他の選択肢は割とわかりやすい表現になっており、英語でageと表現されていて翻訳したのかなぁと思った。

画面全体で言えば、移動先を選択した画面のアクションを選択にチェックマーク✅がついており、現在の設定段階が縦で表現されているのが、個人的に見慣れないなぁと思った👀

ちなみに、恥ずかしながらNearlineという表現に初めて出会った🙇 参考にリンクを張っておく🙏

ニアラインストレージ (nearline storage)とは | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典