Raspberry Pi で DiscordChatExporter を実行する方法

結論

1. arm用の .NET Core 3.1 をダウンロードします

.tar.gz ファイルで落ちてきます。

dotnet.microsoft.com

gyazo.com

2. 落としたファイルを展開します

大量のファイルが展開されるので注意です。また、落とした場所にパスを通す必要があります(次の項目「3.」を参照)。

$ tar zxf dotnet-sdk-3.Y.ZZZ-linux-arm64.tar.gz

3. 落としたファイル群が入っているディレクトリにパスを通します

僕の場合は /usr/local/bin/dotnet にファイル一式を置きました。その上で export PATH="/usr/local/bin/dotnet:$PATH" をシェルの設定ファイルに書き、パスを通しました。

4. dotnet コマンドが正しく実行できるかを確認する

確認します。

$ dotnet --version
3.1.405

5. DiscordChatExporter の CLI の zip を落として展開します。

最新のリリースから DiscordChatExporter.CLI.zip をダウンロードし、展開します。大量のファイルが展開されるので注意です。

github.com

6. 展開したファイルの中にある DiscordChatExporter.Cli.dll を dotnet で実行する

それでは実行しましょう。

$ dotnet /opt/DiscordChatExporter/DiscordChatExporter.Cli.dll
DiscordChatExporter.Cli v2.26.0

Usage
  dotnet DiscordChatExporter.Cli.dll [command] [options]
(以下省略)

補足

Raspberry Pi だけというわけではなく、Linux 全般で適用できる方法だと思います。

参考

docs.microsoft.com

WSL2 (Ubuntu) で System Spec (RSpec, Capybara) を実行しようとすると Webdrivers::BrowserNotFound: Failed to find Chrome binary と出るときの対処方法

結論

1. google-chrome をインストールします

  • 詳細は割愛します*1
  • 配置場所は /opt/google/chrome 配下になるかと思います

2. chromedriver をインストールします

  • 詳細は割愛します
  • 配置場所は /usr/bin/chromedriver になるかと思います*2

3. spec/rails_helper.rb に記述を追加します

spec/rails_helper.rb に以下の記述を追加します*3/usr/bin/chromedriver の部分は chromedriver がインストールされている場所です。

Selenium::WebDriver::Chrome.driver_path = '/usr/bin/chromedriver'

4. RSpec (System Spec) を実行します

これで、System Spec が正しく実行できるはずです。ただ、ヘッドレスではない Chrome の動作には VcXsrc X Server の設定が必要になります*4

注意点

Chrome を Headless モードで実行したい場合は /opt/google/chrome/google-chrome を編集します*5

最終行の以下の部分を編集します。

exec -a "$0" "$HERE/chrome" "$@"v

上記の部分に対して以下のように --headless オプションを付与すると、ヘッドレスモードで起動できます。他に --disable-setuid-sandbox オプションなどを付与することも出来ます。

exec -a "$0" "$HERE/chrome" --headless "$@"

補足

共同開発をしている場合には、自分だけ WSL2 で開発しているときは spec/rails_helper.rb を変更してしまうことになります。その際は git update-index --skip-worktree コマンドを使うなどしてコミットに混ぜ込まない工夫をしましょう*6

*1:Ubuntu ならば apt や dpkg で入れるといいでしょう

*2:パスが通っているならばどこでも良いです

*3:Deprectaed が気になる場合は、WARNING メッセージに出る記述で追加しましょう

*4:詳細は割愛します

*5:このファイルは実行のためのスクリプトファイルですので、編集ができます

*6:Docker で開発するとこのような悩みは無くなりそうです

Embulk で配列型のカラムを PostgreSQL に outputするときは column_options で {value_type: 'string'} を指定する

結論

例えば、my_hobbies のようなカラムがあり、配列型で定義されているとします*1。そのようなカラムを含んだテーブルを特に何もせずに embulk-output-postgresql で PostgreSQL に書き込むと、以下のようなエラーが出て怒られます。

org.embulk.exec.PartialExecutionException: java.lang.UnsupportedOperationException: Unsupported type _VARCHAR (sqlType=2003, size=2147483647, scale=0)

このとき、当該カラムを {value_type: 'string'} と明示的に指定することで正常に書き込めます。Yaml の例は以下のとおりです。

out:
  type: postgresql
  (中略)
  column_options:
    my_hobbies: {value_type: 'string'}

補足

インポート時にエラーが出た場合、一時テーブルが残ってしまうことがあるので適宜削除しましょう。

*1:例えば Rails なら t.string "my_hobbies", array: true と定義されるでしょう

Goreman を用いる際に環境変数を使いたい場合は、direnv を用いるのがおそらくベター

Goreman とは

Foreman の Go 実装です*1

github.com

環境変数を使いたい

Goreman には Foreman にある -e オプションがありません。したがって、環境変数を用いたい場合にどのような手段を採るかで少々悩みます*2

direnv を用いるのがベター

Goreman で環境変数を用いる際にはいくつか方法が思いつきます。

最も単純な方法はおそらく、コマンド実行時に直接指定する方法です*3。しかし個人的には、むき出しのコンソールに環境変数を入力することにはためらいがあります*4

次に思いつくのは、シェルの環境変数に組み込む方法です。この方法でも特に問題はないと思います。シェルが変わった時に設定を忘れないように注意する必要があるぐらいでしょうか。

ただ、私がベターだと思う方法は、direnv を使って .envrc から読み込む方法です。秘匿性と可搬性の両方を良い感じで兼ね備えていると思うからです。これは Goreman についてだけではなく、環境変数を用いる場合一般に言えるかと思います。

*1:作者は mattn さんです

*2:Procfile に環境変数への参照が含まれている場合に起こるでしょう

*3:$ ENV1=HOGE ENV2=HOGE goreman start

*4:秘匿性が高くない情報なら問題ないと思います

WSL2 の環境で System Spec (Rails) が一向に走らないときの確認事項

結論

(もろもろの設定は済んでいるとして)X Server が起動しているかどうか。

補足

エラーが出るわけではなく一向に進まないため、気づかないときはなかなか気づきにくい点かと思います。

Powered by はてなブログ