さようならEvernote、こんにちはUpNote

重かったり、だんだん使いずらくなると感じつつも過去の資産があるのでダラダラと使っていたEvernoteですが、とうとうノートの追加ができなくなっていました。  

ノート管理に775円/月 というのは若干高い印象だったので、UpNoteに乗り換えてみました。

移行先の選定理由

Notionも良さそうですが、若干高機能なのと、有料プランの選択肢が $8/月 という点が気になりました。 一方UpNoteですが、軽快で私がよく使う機能としては十分そうだし、有料プランも$0.99/月 or $29.99 の買い切りとなっており、 まぁこの値段で買い切りで使えるなら十分そうということで一旦使って見ることにしました。

よく使う機能

UpNoteの懸念点

ユーザー数がおそらくそこまで多くないので、ある日突然サービスが終了する可能性もありそう。 これは仕方がないと言えばそうなんだけど、ユーザー数が多ければその可能性は低くなると思うので、この辺りは若干心配。 そうなった時にユーザー数が多いほど移行の選択肢が提供される可能性がありそうですよね。 https://trends.google.co.jp/trends/explore?q=UpNote,Notion,Evernote&hl=ja

データ移行

有料プランのみですが、Evernoteのノートブック単位での移行(enex形式)が可能です。 月額$0.99課金して利用してみました。 移行自体はすんなりできて良いですが、web clip形式のノートの背景色が変わってたり、見づらい感じになってました。この辺は手動で修正しています。

使用感

Evernoteに近い印象です。code blockは有料っぽいので、しばらく使って問題なければ買い切りにしようかと思っています。

Github Actions + simplecov + codecov でカバレッジを表示する

rochefort/git-trend のCIは、これまで Travis-CI を利用していたのですが、 無料で使えなくなっていました(どうも2020年ぐらいからだったみたい)ので、今だとGithub Actionsが簡単に利用できそうでしたので、こちらへ移行しました。

また、カバレッジの表示もCoveralls を利用していたのですが、公開されているGithub Actions でうまく利用できなかったので、 これを機に Codecov へ移行してみました。

あんまり関係ないところで少しはまっていましたが、移行自体は簡単でした。

こんな感じ

codecov側はこんな感じです。

githubに載せるバッジはこんな感じです。

Github Actionsでrspecの実行

ruby/setup-ruby@v1 を使って rspec, rubocop を実行しています。 ここでは省略していますが、複数のrubyで実行したかったので、jobsをrubyのversion毎に作成しています。

# .github/workflows/ci.yml
name: CI

on:
  push:
  pull_request:

jobs:
  ruby32:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.2.2'
          bundler-cache: true

      - name: Show ruby version
        run: ruby -v

      - name: Run tests
        run: bundle exec rspec

      - name: Run lint
        run: bundle exec rubocop

smplecov + codecov

codecov側の設定

Codecovgithubでログインし、対象リポジトリを選択すると、CODECOV_TOKEN が発行されます。

simplecov

SimpleCov::Formatter::SimpleFormatter で送れば良いので、これ用の設定は特に不要でした。

# spec/spec_helper.rb
require "simplecov"
SimpleCov.start do
  add_filter "/spec/"
end

最初は、githubに記載されてるように、ENV["CI"] でformatter分ける必要があるかと思ったのですが、なくてもlocalでhtmlとSimpleFormatterのそれぞれ出力されてるようなので、上記に変更しました。

# spec/spec_helper.rb
require "simplecov"
SimpleCov.start do
  add_filter "/spec/"

  if ENV["CI"]
    formatter SimpleCov::Formatter::SimpleFormatter
  else
    formatter SimpleCov::Formatter::MultiFormatter.new([
      SimpleCov::Formatter::SimpleFormatter,
      SimpleCov::Formatter::HTMLFormatter,
    ])
  end
end

Github Actionsの設定

これをgithubに追加します。 「Settings -> Secrets and Variables -> Actions -> Repository secrets」で追加できます。

Github Actionsワークフロー

filesとtokenオプションが必要です。 その他オプションは、Codecov · Actions · GitHub Marketplace に記載されています。

# .github/workflows/ci.yml
(略)
      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v3
        with:
          files: ./coverage/.resultset.json
          token: ${{ secrets.CODECOV_TOKEN }}

GithubのREADMEにつけるバッジ

codecovの設定から選択できます。

その他ハマったところ

今回合わせて、gemの更新も行ったのですが、 Simplecov.start の実行よりもアプリケーションのrequireが早く実行されており、 gemの更新により、rspecの結果がcoverageに表示されなくなってしまっていました。

これに気づかずに、codecovには送信できているが結果が何も表示されておらず、 formatterが問題ではないかと疑って、いろいろ試してしまっていました。

# before
require "simplecov"
require "webmock/rspec"
require "git_trend"   # <- これがアプリケーションコード。これより先に SimpleCov.start しないといけない
SimpleCov.start do
  add_filter "/spec/"
end
# after
require "simplecov"
SimpleCov.start do
  add_filter "/spec/"
end

require "webmock/rspec"
require "git_trend"

macOS Sonomaでのmysql2 gemのエラー対応

Sonomaでのmysql2関連のエラー対応メモです。
macOSアップグレードの度に毎回似たようなやつをググっては対応していたので、少し調べながら対応してみました。
根本的に理解するには、もっと深いところを調べる必要がありそう。
どれも、その筋の人にしか分からん対応な感じがする。

①'stdio.h' file not found

現象

bundle install時にエラーメッセージとして表示されているmkmf.logを確認します。

In file included from conftest.c:1:
In file included from /Users/rochefort/.asdf/installs/ruby/3.2.2/include/ruby-3.2.0/ruby.h:38:
In file included from /Users/rochefort/.asdf/installs/ruby/3.2.2/include/ruby-3.2.0/ruby/ruby.h:25:
/Users/rochefort/.asdf/installs/ruby/3.2.2/include/ruby-3.2.0/ruby/defines.h:16:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5:   return !!argv[argc];
6: }
/* end */

stdio.h が無いというやつですね。近年よく見ますね。

対応

Xcode同梱のSDKを使うようにします。ググるとたくさん見つかります。

export SDKROOT="$(xcrun --sdk macosx --show-sdk-path)"

SDKROOTとは何なのか

xcrunのmanを見ると、それっぽいことが書いています。 具体的にbuild時にどうclangを呼び出してるかまでは見てないですが、ここに書かれているような実装なら SDKROOTに記載のSDKを指定することになるようです。

Specifies the default SDK to be used when looking up tools (some tools may have SDK specific versions).

This environment variable is also set by xcrun to be the absolute path to the user provided SDK 
(either via SDKROOT or the --sdk option), when it is used to invoke a normal developer tool 
(build tools like xcodebuild or make are exempt from this behavior).

          For example, if xcrun is used to invoke clang via:
             xcrun --sdk macosx clang test.c

then xcrun will provide the full path to the macosx SDK in the environment variable SDKROOT. 
That in turn will be used by clang(1) to automatically select that SDK when compiling the test.c file.

②'zstd' not found

現象

こちらもmkmf.log

(省略...)
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: warning: ignoring duplicate libraries: '-lruby.3.2'
ld: library 'zstd' not found
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

対応

zstdはbrewで入れてるので、環境変数を設定するのみ。これもググれば出てきます。

export LIBRARY_PATH=$(brew --prefix zstd)/lib/:$LIBRARY_PATH

LIBRARY_PATH とは何か

stackoverflowに挙がっていました。 gcc - LD_LIBRARY_PATH vs LIBRARY_PATH - Stack Overflow

When linking libraries with gcc or g++, the LIBRARY_PATH environment variable is read 

とのこと。(でもログ見ると ld なんだよなぁ。今回のは、LD_LIBRARY_PATH じゃないらしい。この辺はイマイチ分からない。)

see documentとして記載されてる、gccのマニュアルも同様のことが書かれています。 Environment Variables (Using the GNU Compiler Collection (GCC))

The value of LIBRARY_PATH is a colon-separated list of directories, much like PATH. 
When configured as a native compiler, GCC tries the directories thus specified 
when searching for special linker files, if it cannot find them using GCC_EXEC_PREFIX. 
Linking using GCC also uses these directories when searching for ordinary libraries 
for the -l option (but directories specified with -L come first).

そういえば

ググってみると、 --with-ldflags やら --with-opt-dir やらの話も出てきて、以下の対応入れるやつですが 今回はopenssl@3を入れてLDFLAGSあたりを設定してるから?か対応不要でした。(よく分からん)

$ bundle config --global build.mysql2 "--with-opt-dir=$(brew --prefix openssl)"

See Also

macOS Sonoma 14.1.2にrubyをinstallする - rochefort's blog