AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

netstat のルーティング出力が macOS 11.3 以前で違うっぽい

VPN 接続がうまくいかない、という話で OpenVPN 側のプロセス追ったりしていた際に気づきました。

ちなみにその VPN 接続がうまくいかない件は、macOS を再起動したら治ったそうです。 Windows と比べてあまり再起動必要ないと言われますが、何かあったらマー再起動なりが安牌ですね。

ルーティング情報の出力

macOS 環境では netstat -rn で表示することができます。

macOS 11.3

user@localhost ~ $ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags        Netif Expire
default            192.168.0.1        UGScg          en0

# snip #

(たぶん) macOS 11.3 以前

user@localhost ~ $ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.0.1        UGSc            0        0     en0 

# snip #

Flags 出力が違う

UGSc はともかくとして、 UGScg とは? って感じですね。 ググっても G が代わりに表示されるので謎。 というわけでこういう時は man netstat ですね、確認してみましょう。

user@localhost ~ $ man netstat

# snip #

     1       RTF_PROTO1       Protocol specific routing flag #1
     2       RTF_PROTO2       Protocol specific routing flag #2
     3       RTF_PROTO3       Protocol specific routing flag #3
     B       RTF_BLACKHOLE    Just discard packets (during updates)
     b       RTF_BROADCAST    The route represents a broadcast address
     C       RTF_CLONING      Generate new routes on use
     c       RTF_PRCLONING    Protocol-specified generate new routes on use
     D       RTF_DYNAMIC      Created dynamically (by redirect)
     G       RTF_GATEWAY      Destination requires forwarding by intermediary
     H       RTF_HOST         Host entry (net otherwise)
     I       RTF_IFSCOPE      Route is associated with an interface scope
     i       RTF_IFREF        Route is holding a reference to the interface
     L       RTF_LLINFO       Valid protocol to link address translation
     M       RTF_MODIFIED     Modified dynamically (by redirect)
     m       RTF_MULTICAST    The route represents a multicast address
     R       RTF_REJECT       Host or net unreachable
     r       RTF_ROUTER       Host is a default router
     S       RTF_STATIC       Manually added
     U       RTF_UP           Route usable
     W       RTF_WASCLONED    Route was generated as a result of cloning
     X       RTF_XRESOLVE     External daemon translates proto to link address
     Y       RTF_PROXY        Proxying; cloned routes will not be scoped
     g       RTF_GLOBAL       Route to a destination of the global internet (policy hint)

# snip #

こちらですね。

g RTF_GLOBAL Route to a destination of the global internet (policy hint)

へぇーっ、グローバルに出てる経路を明示してくれてるのか? こんなフラグあったっけ。

しらべるマン

github.com

and I noticed there is a bunch of new routing flags that are being actively used starting with macOS 11.3

(ワイ訳:macOS 11.3 では、新しいルーティングフラグが積極的に利用されている)

とのことなので、新規に追加されたフラグのようです。 たしかに意味がわかると、この g フラグは便利ですね。

参考

qiita.com www.ibm.com

TeraStation の E10 エラー

週明け作業の確認に、休日オフィスに出たら TeraStation の ERROR ランプが赤く光っててオゲーッ!

E10: UPS で駆動しています

www.buffalo.jp

つまりどうすりゃいいんじゃ? という所がさっぱりわからないんだけど、電源喪失 -> 復旧しているなら、再起動すれば解消するってことか? と当たりをつけて再起動したら、無事 ERROR ランプ点灯が消えました。

接続している UPS 自体はバッテリー 100% になっていたので、実際に UPS で駆動していたわけではなく、TeraStation が電源見失っただけか……? という感じでよくわからない事象でした。 直近でオフィス入ってるビルの全体メンテナンスもなかったし、なんだろうなこれ。

WiFi の DTIM とは

こういうことらしい。

xtech.nikkei.com

ルーターの詳細設定にあったんだけど、全然しらなくて「へぇっ」ってなった。WiFi わりといまどきの機能だし、絶対時間で処理していると思ったのでポーリング間隔なのは知らなかったなあ。

ActiveRecord Relation の内容をビャッと view に出す

Model.select("created_at").first

とかすると、#<ActiveRecord::reration:〜〜〜> という感じのオブジェクトが頂けるので、いや拙者は値だけがほしい……というときにビャッとする。

Model.pluck("created_at").first

なるほど配列なので select ではなく pluck みたいな気持ちになってしまった。 とりあえず view に「ビャッ!」と出したい時はこれでいいか。

ENV が利用できない(ので ENV を利用できるようにする)

なんのこっちゃい、という感じですが。 だいたいこちらに書いてあるとおりです、ありがてえ。

zenn.dev

Rails環境変数呼び出し

rails new ./example とかして sqlite で初期化すると、こんな感じの config/database.yml が生成されると思います。

default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

以下省略

<%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> の部分は、環境変数 RAILS_MAX_THREADS を参照し、存在しなければ 5 を利用する。 という動作です。 やったー簡単に環境変数を呼べる!

redis で呼ぶ

gem 'redis' を指定した環境にて、上記と同じ様に config/redis.yml から、 ENV環境変数呼べ……ない!

default: &default
  db:
    host: <%= ENV['REDIS_HOST'] %>

REDIS_HOST127.0.0.1 などなんかしらの値が入っていても、実際にコードが読まれると <%= ENV['REDIS_HOST'] %> として解釈され、値が展開されない。

どうする

yaml を理解できないならできるようにしてやればよいのです。 というわけで、実際に <%= ENV['REDIS_HOST'] %> を呼び出している Ruby のファイル先頭に、記述を追加します。

今回は sidekiq+redis という環境だったので、呼び出しているのは config/initializers/sidekiq.rb でした。 こちらの先頭に追加してやります。

yaml = ERB.new(Pathname.new('config/redis.yml').read).result

redis_config =
  if YAML.respond_to?(:unsafe_load)
    YAML.unsafe_load(yaml)[Rails.env] || {}
  else
    YAML.load(yaml)[Rails.env] || {}
  end

# 適当にテスト
print ENV.fetch ('REDIS_HOST') {"aaaaaaaaaaaaaaaaaaaaaaaaadeneeeeeeeaaaaaaaaaaaaaaaaaaa"}

以下省略

ログに、環境変数として指定した値が出ればオッケーです。

ちなみに

本当はこのように、もうちょっと簡単に記述できます。

qiita.com

して unsafe_load load に分けてるナンデ? というと Psych 4.0.0 で破壊的修正がこのあたりに入ったらしく、という話を聞いており。 このへんかな?

www.hsbt.org

幸いにして僕は、このあたりの問題にまだぶつかってないんですが。 じゃあ Railsdatabase.yml を読み込む部分についてはどうなん? と調べたら、場合分けされていたのでパクった、ということですね。

github.com

      def load_database_yaml # :nodoc:
        if path = paths["config/database"].existent.first
          require "rails/application/dummy_erb_compiler"

          yaml = DummyERB.new(Pathname.new(path).read).result

          if YAML.respond_to?(:unsafe_load)
            YAML.unsafe_load(yaml) || {}
          else
            YAML.load(yaml) || {}
          end
        else
          {}
        end
      end

Rails のコード、全体を一斉に読もうとするとなにがなんだか、という感じですが。 こうやって問題にぶちあたって、部分部分だけ拾えると「へえっ!」ってなるので面白い。

というのを 10 年以上前に当時居た会社の CEO に言われてたんですが、めぐりめぐってようやく言葉の意味がわかってきましたね。 Rails なんもわからん。