journagu

Webエンジニアの日常

バーチャル自転車おじさんはじめました

概要

中古で買ったスマートトレーナー(tacx neo smart)一式と Zwift を組み合わせて賃貸アパート 2F で室内運動環境を整える話。
tacx neo smart を買う買わないで悩んでいた私や、賃貸アパートの二階に住んでるけど振動や騒音大丈夫かなと悩んでいた私向けに書いてみる。
ついでに既に持っていた Garminバイスとの連携や、Garmin Connect、Strava の使用感などについても軽く触れる。

主な登場アイテム、サービス

  • tacx neo smart

    • ダイレクトドライブ式のスマートトレーナー
    • Wahoo の KICKR と静音性や機能面などで何かとよく比較されてるイメージ
    • メルカリで私に買われる
  • Garmin ForeAthlete 245

    • Garmin のリストバンド型活動量計
    • 多機能でバッテリー持ちもよく入門に最適(らしい)
  • Garmin Connect

    • Garmin活動量計の値を拾って可視化してくれるアプリ
    • 心拍数やストレス、睡眠の質などを確認できる
  • Strava

    • イケイケのスポーツマンたちが使っている SNS
    • 👆 になりたくてはじめました(´ε ` )

自転車に対するモチベとスマートトレーナー

自転車の身一つでどこまでも行ける感じが好きで、クロスバイクロードバイクと進んでいった。
目的地をごはん屋さんにセットして、汗だくになりつつも素敵な景色を見ながら走って辿り着いたごはん屋で美味しい飯を食べる。
語彙力がなくて最高の二文字でしか感情を表現できない。

北海道の支笏湖沿い ポロピナイ食堂で食べたヒメマス
北海道の支笏湖沿いをロードバイクで走ったときの写真 ポロピナイ食堂で食べたヒメマスの姿焼きとフライ

画像はポロピナイ食堂の「ポロピナイセット」

ただ不幸なことに、私は引きこもり体質だった。
上で述べた感動体験については全肯定ペンギンになれるんだけど、そもそも外へ出るまでの敷居が高すぎる。
あてもなくフラフラするのがあまり好きではないことも相まって、自転車で出かける場合はだいたい毎回以下の一連の作業をしていた。。

  1. その時の気分で目的地の候補をいくつか絞る
  2. 仕事が休みの日は晴れているか、お店は営業しているか調べる
  3. GoogleMap のストリートビュー機能で道幅や路面状況を調べる
  4. パンク修理キットの残部、いざパンクしたときの処置手順を確認する
  5. 当日道中で食べる補給食の買い出し

(ヾノ・∀・`)イヤイヤ、オオイデショ

自転車乗りたいけど外行きたくない気持ちが溢れてインターネットサーフィンをしていたらスマートトレーナーなるものを見つけた。
どうやら屋内用のロードレーサーレーニングアイテムらしい。
上位モデルになると自転車のリアタイヤ部分に直接取り付けるから負荷も自由自在で静か、パワーメーターなどが内蔵されているからトレーニングの効果も測りやすいみたい。すごい。
Zwift というアプリと連携することでバーチャルライド(実際の勾配が再現されていたり他のユーザが同じコースを走っていたりする)もできるらしい。すごい。

引きこもり用ロードバイクガジェットとの出会いである。

中古の tacx neo smart 一式を買う

tacx neo smart というスマートトレーナーが以前から欲しかったけど、Wiggle という値引率がとんでもない海外通販サイトから姿を消して以来諦めていた。
そんな矢先、メルカリで型落ちとはいえ定価 17 万円くらいのものが送料込み 9 万円で売りだされていたので買いだと思った。というか買った。(感謝)

驚いたことに 9 万円の中に下記アイテムが含まれていた。お買い得すぎる。。

  • tacx neo smart 本体
  • スプロケット 11-28T
  • ブルカット 2 x4
  • 汗カバー
  • ANT+ レシーバー

防振マットが付属しなかったため、インターネット上で実績報告が多く上がっている ALINCO のエクササイズマットをポチー。

ものが揃ったら早速手持ちのロードバイクをドッキングする。
今回 Trek Emonda ALR5 でセッティングしたが Bontrager DuoTrap とトレーナーが干渉するため、小さい六角レンチがあると良い。
六角レンチがなかったので無理セッティングしてみたけど DuoTrap が圧で潰れそうになっている。

tacx neo smart with Trek Emonda ALR5

音や騒音はほぼなし

いろいろなブログや Youtube でも公開されているが、おそらく買うとき一番の懸念が近隣や家族へ迷惑をかけないかだと思う。
私は二階に住んでいるので特に階下への振動や騒音迷惑が一番心配だったが、ブルカット+エクササイズマットのおかげか問題なさそう。
振動について、体感ではドラム式洗濯機の乾燥中のほうが強いくらい。
騒音についても多くの先人が述べている通りチェーンの音やギア切り替えの音が一番でかい。でかいと言っても蛇口から出した水がシンクにあたってる音のほうがでかい説まである。

今の所ご近所問題はないが、気をつけるべき点としては深夜から早朝(21:00 ~ 07:30 くらいの感覚)にかけては利用しないのが一番だと思う。
人それぞれ音や振動への感覚は千差万別なので、できる対策は全てとりそれでも苦情が来た場合を想定して外箱は捨てずに保管しておけば、ロスが少なく手放すこともできるだろう。
振動は建物によりけりな部分が大きいため最悪即手放しを考えてロスが少なくなるよう行動しよう。

ちなみに手放しを考えると中古で買うもしくは譲ってもらうが一番安全に思う。

Zwift(iPad 9.7inch)をやってみる

tacx neo smart はパワーセンサやケイデンスセンサを内蔵していて、かつ通信規格は Bluetooth と Ant+にも対応している。
なので Bluetooth が利用できる iPadiPhone、デスクトップパソコン といったデバイスでは Ant+レシーバーがなくても普通に連携できる。

最近 iPad Pro を買って無印の iPad が余っていたため Zwift 専用機として有効活用してみた。
コースの勾配に合わせたペダル負荷や走っている感は見事だった。
これすげえって思ったのでブログを書きはじめてみたが、すげえを言語化できなかったのでぜひ買って自分で体験してみよう。

Zwiftのスクリーンショット

tacx neo smart だけだと心拍数が取得できないため、手持ちの Garmin ForeAthlete 245 を心拍転送モードで iPad に繋いでみた。
心拍数を取る専用のバンド型活動量計もあるらしいがリスト型の活動量計があるならあえて買うほどのものには感じなかった。

Zwift のライド記録は Garmin と Strava に連携している。Garmin, Strava, Zwift はそれぞれ公式の連携可能なサービスに含まれているため難しい操作はゼロだった。
個人的には運動系の記録はすべて Strava に集約したくて、Zwift の記録は Strava にも保存されるよう連携している。
また、ForeAthlete 245 で記録したデータ(外ランニングや外ロード)もすべて Strava にも保存されるようにしている。

Strava は運動強度や評価を見れるだけではなくて近場の人気なコース探索やチャレンジ(1 ヶ月で 100km 走ろう)など、とにかくアスリート向けの機能が豊富な SNS だ。
SNS なのにフォロー・フォロワーがゼロ人で SNS の旨味を全く活かせていないため、どうにかこうにか活用できるようになりたい。
Strava はじめた人がいたらこっそり教えて下さい。

スマートトレーナーを導入してみて

ここ半年ほど在宅ワークがメインとなり外出する機会が更に減ってランニングをはじめてみたりもしていたが、冬場は流石にきつそうだなんて思っていた。 スマートトレーナーと Zwift のおかげで家の中にいてもぬくぬくと自転車に乗ることができ、余裕で汗をかけるようになった。
また、これは想定外だったが Zwift を起動中にピクチャー・イン・ピクチャーでアニメやドラマを観たり音楽聞いたりができるのが地味にポイント高い。

最後に冒頭で述べた

tacx neo smart を買う買わないで悩んでいた私や、賃貸アパートの二階に住んでるけど振動や騒音大丈夫かなと悩んでいた私向けに書いてみる。

についててだが、まとめると「購入を悩んでいる場合は対策を考慮した上でお金を用意して、安全マージンをしっかりとってとりあえず買ってみる」というのが良さそうに思う。
趣味にしては今回の出費は大きめなだった。最低限、投資した分は回収したいため「少しでも…」なんて甘っちょろいことは言わず、運動不足を解消して体力向上や体作りに励んでいこうと思う。

おしまい(¦3[___]

TP-LinkのArcher A10を使ってSoftbank光でIPv6通信を試みる

概要

Softbank 光で IPv6IPv6 over IPv4)を利用するためには BB ユニット(ルータ)を月額課金でレンタルする必要がある。
BB ユニットの無線 LAN 機能を有効にするには更に月額課金が必要となり、長期的に見るとランニングコストが嵩んでくるため、BB ユニットと市販ルータを繋いで月額課金額を減らした。

モチベーション

  • 無線 LAN 機能を有効にするための月額課金が悪魔的なため、市販ルータと組み合わせて IPv6 が利用できる状態で月額課金額を減らしたかった
  • 市販ルータと BB ユニットを組み合わせた系の記事はすぐにヒットしたけど実際にダウンロード/アップロードの速度比較をしていたサイトがほとんど見当たらなかった

Softbank 光を堪能するためのオプション料金体系

Softbank 光回線IPv6 を利用するためには BB ユニットなるルータを 400 円/月で、BB ユニットの Wi-Fi 機能を使えるようにする Wi-Fi マルチパックで 1,000 円/月の課金が必要になる。
BB ユニットは IPv6 対応のために必要なのは良いとして、Wi-Fi マルチパックって……すごい料金体系だなって思った。他のプロバイダもこんな感じなの??

通信速度は地域による差が大きいらしいが、自分が住んでいる地域では比較的空いている時間帯の有線接続で下り 1Gbps 出たことがある。有線のときは平均したら 600Mbps くらい。
無線ではばらつきがさらに激しいけど平均すると大体 180Mbps くらい。
市販のルータに変更してもこの速度より劣化しないことを祈りつつ、続いてルータの選定へ。

ところで Softbank が使っている「IPv6 IPoE + IPv4」という単語、調べてみてもよくわからなかったけど通信は IPoE で扱っていて、IPv6 でつなげるものは IPv4 over IPv6 で繋いで、IPv6 非対応のサイトは IPv4 でつなぐっていうことなのかな。

【参考】

TP-Link の Archer A10 を購入

BB ユニットのモデルは E-WMTA2.3 。 最新のモデルは 2.4 で MU-MIMO やビームフォーミングに対応しているらしい。下記サイトで詳しくまとめられていた。

なにはともあれ月 1,000 円も払い続けたくないので、ちょうど開催されていた Amazon Prime Day セール会場を覗いてみたら TP-Link の Archer A10 が安くなっていた。
IPoE 対応、MU-MIMO、ビームフォーミングに対応しており 802.11ac 規格に対応していたので当分困らなさそうだったので購入してみる。

tp-link Archer A10

ルーター、案外大きくてどこに置くか困る。。。

BB ユニットとルータを接続

BB ユニットは無線 LAN 機能をオフにして A10 をブリッジモードで運用中。

接続構成
ONU --- BB ユニット(WAN), BB ユニット(LAN) --- A10(WAN)

インターネットへは IPv6 で接続できているみたい。
IPv6 接続の確認 - https://test-ipv6.com/

試行 BB ユニット(下り) BB ユニット(上り) A10(下り) A10(上り)
1 160Mbps 140Mbsp 180Mbps 590Mbps
2 310Mbps 200Mbsp 180Mbps 490Mbps
3 200Mbps 230Mbsp 220Mbps 470Mbps
4 280Mbps 480Mbsp 200Mbps 450Mbps
5 180Mbps 390Mbsp 180Mbps 430Mbps

下りは 180Mbps 付近で安定しているように見える。 BBユニット比では速度が落ちているように見える。 一方で上りはなぜか上がり続けている。遅くなるよりヨシ!

回線速度は向上しなかったものの、速度劣化なしに月額課金額を減らせたので良かった。
Archer A10 は 6,000 円くらいだったので半年くらい運用したら元が取れそう!

おしまい(¦3[___]

2020年のpc環境

はじめに

数年後に「あの頃はこんな環境だった(ほっこり」と懐古したいため PC 環境をまとめる。
とんでもない誰得エントリになっています。

メインで使っているのは MacBook Pro と自作したデスクトップ PC の二つ。

  • MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)
  • 自作のデスクトップ PC

MacBook Pro (13-inch, 2017, Touch Bar モデル)

Category Products/Specifications
Processor 3.1 GHz Dual-Core Intel Core i5
Memory 16 GB 2133 MHz LPDDR3
Storage SSD 256GB
Graphics Intel Iris Plus Graphics 650 1536 MB

Touch Bar/Touch ID/バタフライキーボード搭載、短バッテリー持ちで有名な 2017 年の 13-inch モデル。色はスペースグレイ。
夢と希望を抱いて買ったノートパソコン。Retina ディスプレイは文字がめっちゃきれい。

人生初の Apple 製品だったため大切に使っているが、ほとんど据え置き機となっている(内蔵バッテリーが心配……)。持ち運ぶ予定がないなら 15-inch や 16-inch がいいですこれは本当。
軽い処理なら何でもござれなので基本的にはこいつをメインに使ってる。

デスクトップ PC

Category Products/Specifications
Processor Core i7 8700K
Memory 32GB DDR4 2666MHz
Storage1 NVMe SSD 500GB with Heatsink
Storage2 NVMe SSD 500GB
Storage3 HDD 1TB
Graphics GeForce RTX 2070
Motherboard ROG STRIX Z390-F GAMING
Power 750W/90+
Cooling KRAKEN X52
Case H510I
Other1 riser cable
Other2 grease

これはもう NZXT のケース(H510I)と簡易水冷(Kraken)に恋して買いました(゚A゚;)
H510I はライザーケーブルを使うことで VGA を垂直に設置できるためガラス越しの眺めが最高。

公式画像 1 公式画像 2 自宅画像
H510I_1 nzxt.jpより H510I_2 nzxt.jpより 自宅のH510I

今は同じ NZXT の H1 という縦長になっているケースが気になっている。欲しい。
NVMe SSD が二つあるのはゲーム用の Windows10 と技術系で手を動かす環境としての Ubuntu とで使い分けているため。

ゲームに関しては Nier: Automata(最高画質) や FINAL FANTASY XV(高画質)で安定して遊べるためしばらくはこのスペックでもやっていけそう。
手を動かす環境としては現状十分すぎる。最近は MacBook Pro のローカル環境を汚さないようにデスクトップの docker コンテナ上で環境を作ってわちゃわちゃ手を動かしている。ぶっ壊れたコンテナはポイッと捨てて新規にクリーンな環境がすぐに作れるので便利すぎる。

雑感

MacBook Pro とデスクトップの費用そんなに差がなくて、むしろ AppleCare+ for 13-inch MacBook Pro を合わせると MacBook Pro のほうがお金かかってる。
わかってはいたけど改めて金額と中身を突き合わせると 😫 って感情になった。
ただ高いだけじゃなくていいところもいっぱいあるんだけどね!!(ディスプレイとか iPhone/iPad との連携、サポートとか)

環境としてはさくら VPSAWS, GCP とかも触ってみたけど自分の用途だとクラウド環境を触り続ける意味をあまり感じなくて放置中。
自分のプロダクトを作ると使うことがあるかもしれんがそれでも PaaS や CaaS で十分そう。
開発環境をクラウドで構築してクソヘボ端末から作業というのもパターンとしてはあると思う。今はローカル環境で十分かな。

おしまい(¦3[___]

python3のloggingモジュールを使ってサイズ・時間別にログローテートする

概要

最近 Python3 のログ出力部分を書いていて、ログローテートに関連した日本語のエントリが少なかったので備忘録的に残しておく。
それと実際にログをプログラム中に仕込むときに --debug オプションをつけてより詳細なログが出せるようにもしたのでメモしておく。

ファイルサイズベース・時間ベースのログローテート

ファイルサイズベースのときは RotatingFileHandler 、時間ベースのときは TimedRotatingFileHandler を使用する。

import logging
import logging.handlers
import time

LOG_FILE = "/tmp/app.log"

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# サイズベースのローテーション
handler = logging.handlers.RotatingFileHandler(
    LOG_FILE,
    maxBytes=100,
    backupCount=9
)

# 時間ベースのローテーション
# handler = logging.handlers.TimedRotatingFileHandler(
#     LOG_FILE,
#     when='S',
#     interval=1,
#     backupCount=10
# )
handler.suffix = '%Y%m%d%H%M%S'

logger.addHandler(handler)

while True:
    logger.critical('critical')
    logger.error('error')
    logger.warning('warning')
    logger.info('info')
    logger.debug('debug')
    time.sleep(2.5)

出力例

# サイズベース
$ python make_logs.py
$ ls -l /tmp/
total 24
-rw-r--r-- 1 root root 34 Aug 15 14:51 app.log
-rw-r--r-- 1 root root 93 Aug 15 14:51 app.log.1
-rw-r--r-- 1 root root 96 Aug 15 14:51 app.log.2
...
# 時間ベース
$ python make_logs.py
$ ls -l /tmp/
total 24
-rw-r--r-- 1 root root 34 Aug 15 15:01 app.log
-rw-r--r-- 1 root root 34 Aug 15 15:01 app.log.20200815150108
-rw-r--r-- 1 root root 34 Aug 15 15:01 app.log.20200815150110
...

オプション引数で DEBUG レベルのログまで出力する

普段は DEBUG レベルのログまで出しているとリソースがもったいないので、通常は INFO レベルまでのログを出力し --debug 引数があるときに debug レベルまでログを表示するときはこんな感じに書いた。

import argparse
import logging
import logging.handlers

LOG_FILE = "/tmp/app.log"

parser = argparse.ArgumentParser()
parser.add_argument('--debug', help='optional', action='store_true')
args = parser.parse_args()

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter(
    '%(asctime)s [%(filename)s:%(lineno)d] %(levelname)-8s %(message)s'
)
handler = logging.FileHandler(LOG_FILE)
handler.setFormatter(formatter)
logger.addHandler(handler)

if (args.debug):
    logger.setLevel(logging.DEBUG)

logger.critical('critical')
logger.error('error')
logger.warning('warning')
logger.info('info')
logger.debug('debug')

logger.setLevel(logging.INFO) で INFO ログまで出すようにし、argparser によって --debug オプション受け取った際に logger.setLevel(logging.DEBUG) でログレベルを再設定する。

出力例

$ python make_logs.py
$ cat /tmp/app.log
2020-08-15 14:30:47,526 [make_logs.py:23] CRITICAL critical
2020-08-15 14:30:47,526 [make_logs.py:24] ERROR    error
2020-08-15 14:30:47,526 [make_logs.py:25] WARNING  warning
2020-08-15 14:30:47,526 [make_logs.py:26] INFO     info
$ python make_logs.py --debug
$ cat /tmp/app.log
2020-08-15 14:31:29,198 [make_logs.py:23] CRITICAL critical
2020-08-15 14:31:29,198 [make_logs.py:24] ERROR    error
2020-08-15 14:31:29,198 [make_logs.py:25] WARNING  warning
2020-08-15 14:31:29,198 [make_logs.py:26] INFO     info
2020-08-15 14:31:29,198 [make_logs.py:27] DEBUG    debug

参考

これ書いてて思ったけど参考にあるPython のロギングを覚えたでやっている Logger 名を引数で受けて Logger オブジェクトを返す関数、すごく便利そうだし他の箇所でも再利用できそう。
次回またログ出力部分を実装するときはメソッドかクラスで定義すると良さそうに思った。

おしまい(¦3[___]

FlexiSpot製の昇降デスクを組み立てた

概要

天板を自分好みのサイズにしたく、どうせならと脚部分は昇降機能を持ったものを購入して若干の DIY 要素を交えて 6 万円で昇降デスクを作ったおぼえがき。

なぜ天板オーダーメイドな昇降デスクにしたか

そもそものきっかけは引っ越しの際にこれまで使用していた机のサイズが合わなくなったため。 インターネットを彷徨っていると長さ 1,800mm の天板をオーダーして DIY!!ネット通販のみで簡単に好みのデスクが作れます ♪ というエントリを見つけて「天板オーダーメイドすればすべて解決じゃん。」となったため。 昇降式にしたのは座る姿勢が悪いなか在宅ワークがメインとなり、長時間変な姿勢でいることが多くなったから。よく椅子の上であぐらかいたりしている。 昇降デスクにすれば自分で立つ座るを切り替えられるので、座る姿勢がよろしくない自分にとっては健康面で良いのでは!と思い購入した。

昇降デスクの脚と天板

自分がデスクの脚を選ぶ際に考慮したポイント。

項目 要件 理由
価格 ¥ 40,000 以内 今回の予算
耐荷重 50kg 以上 天板にデスクトップ PC とモニタを置く予定だったため。
横幅 1200mm 以下 設置予定場所のスペース的に 1200mm を超えると厳しい。
機能 昇降機能がある 機能が少ないほうがコスト的に嬉しい。
見た目 ゴツくなくスッキリしてる スマートなデスクは精神をスマートにする

昇降デスクは最近話題のFlexiSpotを覗いてみると比較的安価で見た目的にも良かったのでこの会社のプロダクトから選ぶことにした。

4 種類くらいモデルがあったがEC1(E1E)を選んだ。 なおモデル毎の比較は公式サイトに載っていたのでペタリ →  FlexiSpot 各シリーズの比較

各モデルを観ていると耐荷重、横幅は全プロダクト満たしており問題なかった。 機能面での違いは昇降範囲や昇降スピード、アラーム機能や記憶機能があるかないかなど。 昇降範囲は下限が 10cm ほど上限が 2cm ほどの差しかなかったため、EC1 と EN1 に絞った。 この 2 モデルの差はアラーム機能と記憶機能があるかないかで、アラーム機能は使う予定もうまく活用できる未来も見えず、記憶機能は都度操作すれば良いんじゃない?と思い最も安価なモデルの EC1 にした。 お値段¥ 27,700。

天板なしの実物はこんな感じ。 f:id:csnagu:20210411181640j:plain

天板はきっかけになったエントリで紹介されているマルトクショップを利用した。 木材の縦横高さの指定から角部分の処理、面部分の処理、オイル塗りなど何でもできる。 一つ難しいのが使用する木材を観たことがないと天板の色が想像できないため、実際にホームセンターなどで木材の色を確認しておくことをおすすめ。 寸法は実際に設置する場所を測って、昇降することも考慮して少し小さめで発注した。(縦 x 幅 x 厚さ:600mm x 1130mm x 25mm) 天板は送料を含めて¥ 28,050。

ここまで脚と天板を合わせて¥ 55,750。 最後に人力で天板にネジを差し込むのは骨が折れそうなため適当な電動ドライバーを購入した。

アイリスオーヤマ JCD-421-D ¥ 4,000。

これで脚+天板+電動ドライバー合わせて¥ 59,750。 タイトル詐欺せずに済んでよかった。

完成図(デスクの上が汚い) f:id:csnagu:20210411181645j:plain

雑感

ぶっちゃけ今の所強い腰痛があるわけでもないので、よほど気が乗った日じゃないとスタンディングしないっすね。。 むしろ座った状態でデスクの高さを微調整したいという意味ではしっくり来るポジションを見つけられるので良きでした。 もしかした高さ記憶機能がついてるひとつ上のモデルにしたらボタン 1 プッシュで指定した高さまで調節できるからスタンディングが捗ったかもしれない。 それと自分は天板に選んだ木材の実物を観たことがなかったため届いた瞬間はなんか違うってなったのでちゃんと実物確認しよう(大事なことなので 2 回 ry)。