Azure Arc Enabled PostgreSQL Hyperscale (Citus)をやっていき

  • 投稿日:
  • by
  • カテゴリ:

Azure Arcはハイブリッドクラウドを管理するためのソリューションで、Azure以外のパブリッククラウドやオンプレミス環境を一括してAzure Portalから扱うことが可能になるんだけども、このArcを使ってKubernetes上にAzure Database for PostgreSQL Hyperscale (Citus)を構築することも出来ると。

でもまあKubernetesを自前で構築するのは面倒なので、Azure Kubernetes Service (AKS)のクラスタをデプロイしてそこにHyperscaleを立てちゃう、という記事がAzure Arc Jumpstartに公開されてると。面倒じゃ無い人は自前のKubernetesを用意すれば、もちろんそこにHyperscale (Citus)も構築できます。比較的簡単に。

要はAzure Resource Manager Template (ARM Template)なんで、こいつをちょいちょいと編集して実行すれば良いのだけれど、例によって例のごとく英語なんで、手順の主要なところだけ日本語で解説しましょう、というのがこのエントリーの主旨。macOSでの手順なので、Windowsでやりたい人は適宜読み替えるかWSL上でやってください。

さて。まずはレポジトリをコピります。gitが入ってない人はいませんよね?ここからつまづくようだと、先生ちょっと不安です。

git clone https://github.com/microsoft/azure_arc.git

Azure CLIはインストールされてると思うけれど、無ければHomebrewでインストール、有るならアップグレードしときます。

brew install azure-cli
brew upgrade azure-cli

SSHのキーが要るので、作ってない場合は以下で。

ssh-keygen -t rsa

キーは.ssh/id_rsa.pubに出来てるので、あとで

cat ~/.ssh/id_rsa.pub | pbcopy

すればクリップボードに。自分は以下のaliasを設定しちゃってますが。

alias pbkey="cat ~/.ssh/id_rsa.pub | pbcopy"

これで最新のazコマンドが使えるようになってると思うので、ログインします。

az login

つぎにサービスプリンシパルを作成。MyAzureArcDataは任意の文字列で。

az ad sp create-for-rbac -n "http://MyAzureArcData" --role contributor

何回かリトライするかもしれないけどちょっと待ってれば作成されます。あとで使うのでファイルにコピペして保存しとく。作成時にリダイレクトしておいてももちろん可。

{
"appId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"displayName": "MyAzureArcData",
"name": "http://MyAzureArcData",
"password": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"tenant": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

今回がAzureArcDataを利用するのが初めて!という人は、リソースプロバイダを有効化する必要があります。以下。

az provider register --namespace Microsoft.AzureArcData

登録中は以下の通り、Registeringという表示。

az provider show -n Microsoft.AzureArcData -o table
Namespace               RegistrationPolicy    RegistrationState
----------------------  --------------------  -------------------
Microsoft.AzureArcData  RegistrationRequired  Registering

登録完了するとStateがRegisteredになるので、ウマ娘でもやりながら待っててください。

az provider show -n Microsoft.AzureArcData -o table
Namespace               RegistrationPolicy    RegistrationState
----------------------  --------------------  -------------------
Microsoft.AzureArcData  RegistrationRequired  Registered

登録完了したら、いよいよデプロイと行きたいところだけど、その前にAKSのバージョンをチェック。このエントリーを読んでる人はだいたい東日本人だろうからリージョンをAzure東日本にしてるけど、西日本人はAzure西日本にするのも悪くない考えです。

az aks get-versions -l japaneast -o table
The behavior of this command has been altered by the following extension: aks-preview
KubernetesVersion    Upgrades
-------------------  -------------------------
1.20.2(preview)      None available
1.19.7               1.20.2(preview)
1.19.6               1.19.7, 1.20.2(preview)
1.18.14              1.19.6, 1.19.7
1.18.10              1.18.14, 1.19.6, 1.19.7
1.17.16              1.18.10, 1.18.14
1.17.13              1.17.16, 1.18.10, 1.18.14

執筆時点では1.20.2はプレビュー、1.19.7がstableなので1.19.7を使いました。previewを敢えてデプロイしてバグを踏んでSupport Requestをあげてくれるのは大歓迎ですが?

次にパラメータファイルを編集しないといけません。パラメータファイルはgit cloneしたディレクトリのJSONなので、VimでもEmacsでもVSCodeでもnanoでもJeditでもお好きなエディタでどうぞ(宗教戦争を回避するスタイルで)。

cd azure_arc/azure_arc_data_jumpstart/aks/arm_template/postgres_hs
vim azuredeploy.parameters.json

JSONにパラメータの例が入っているので分かると思うけれど、sshRSAPublicKeyはcat ~/.ssh/id_rsa.pub | pbcopyしたやつ、SPN_CLIENT_ID / CLIENT_SECRET / TENANT_IDはサービスプリンシパルを作成した時の、appId / password / tenant、ARC_DC_SUBSCRIPTIONはaz account showのid、vmSizeはaz vm list-sizes -l japaneast -o tableで好きなのを(強火にすると高いよ!)。

POSTGRES_WORKER_NODE_COUNTとPOSTGRES_DATASIZEはIntegerなので、以下のようにダブルクォートを付けないこと。

        "POSTGRES_WORKER_NODE_COUNT": {
            "value": 3
        },
        "POSTGRES_DATASIZE": {
            "value": 524288
        },

ちょっと不安になるのが、POSTGRES_DATASIZEで、単位がMBになってる。Hyperscaleのストレージは現時点では512GB / 1TB / 2TBなので、とりあえず512 * 1024で524288を入れてみると。POSTGRES_SERVICE_TYPEはClusterIPで。

残りのパラメータはFQDNの衝突だけ気を付けて任意で。

さて、パラメータが揃ったのでデプロイ。しかし、なんでJSON中にリソースグループ名もリージョンも指定してるのにリソースグループを作ってくれないんだ?
jqで抜いてシェル変数にセットしておけばtypoしないのでよろしいかと。

rg=$(jq -r ".parameters.resourceGroup.value" azuredeploy.parameters.json)
lc=$(jq -r ".parameters.ARC_DC_REGION.value" azuredeploy.parameters.json)
az group create --name $rg --location $lc

az deployment group create --resource-group $rg \
--name arcdatapostgresdemo \
--template-file azuredeploy.json \
--parameters azuredeploy.parameters.json

はい、ここまで行けば後は20分ぐらい、アズールレーンでもやりながら待っててください。

Jumpstartのドキュメントでは、このあと、Windowsにログインしてホゲホゲしましょうとあるんだけど、別に手元にkubectlやpostgresql-clientがインストールされてれば、ダイレクトに操作すれば良いんじゃないの?となるので、vmSizeを指定したのは何だったんだ?となるんだけども、このWindowsにログインしないとデプロイが完了しないという罠が仕掛けてあるので、まだ消しちゃダメですw
なんでPowerShellにするかなぁ...。

2021-03-5追記:vmSizeはKubernetesのノードのサイズですね。Windowsのサイズではなかったです。

あ、ついでにkubectlとpostgresql-clientはインストールしておいてもバチは当たらないと思うので、MacのSSDが残り5%とかになってなかったら入れときましょう。5%になってる人はMacを買い換えて、このエントリーの最初からやり直しです。

az aks install-cli

すればkubectlはインストールされますし、

brew install postgresql-client

すればHyperscaleとお喋り出来るので、そこはよしなに。

さて、Azure Portalを開いてみると、リソースグループが2つ作成されていて、WindowsのVMがあります。
20210304225307.png

IPアドレスを見つけて、Microsoft Remote Desktopで接続します。
20210304225249.png

なんかPowerShellが走り出します。
20210304225850.png

kubectlが走り出して
20210304225938.png

コンテナ(正確にはポッド)が作られていきます。この辺で眺めているのに飽きてくるので、しばらく放置してTwitterでもやっててください。
20210304230104.png

Twitterから帰ってきましたか?油断している間に、arcpgc-0(HyperscaleのCoordinator Node)、arcpgw-0/1/2(HyperscaleのWorker Nodes)がRunningしちゃってますよ、予想に反して一発で動いちゃってるじゃん!
で、裏になってる画面にPostgreSQL InstanceのIPアドレスが表示されてますね?
20210304231656.png

psqlで接続してみましょう。

psql -h 20.46.123.242 -U postgres
Password for user postgres: 
psql (13.2, server 12.3 (Ubuntu 12.3-1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

うお、繋がった!ビックリした!

分散テーブルを作ってみましょう。

postgres=# CREATE TABLE hoge (id bigint);
CREATE TABLE
postgres=# SELECT create_distributed_table('hoge', 'id');
 create_distributed_table 
--------------------------
 
(1 row)

当然っちゃ当然ですけど、参照テーブルも作れますね。

postgres=# CREATE TABLE fuga (id bigint);
CREATE TABLE
postgres=# SELECT create_reference_table('fuga');
 create_reference_table 
------------------------
 
(1 row)

PostGISを有効にしてみる、と。

postgres=# CREATE EXTENSION postgis;
CREATE EXTENSION

はい、というわけで「Re:ゼロバイトから始めるYAML生活(ネット遮断環境で)」みたいな地獄を経験しないでも、Kubernetes上に作成されたAzure Database for PostgreSQL Hyperscale (Citus)が動いちゃったので、「Kubernetes完全に分かった」って言えるようになりましたね?現場からは以上です。

2021-03-05追記:AKSノードを追加してからWorker Nodeを30とかにすると、ちゃんと動きますね...。
20210305085320.png

ContainerCreatingになってるけど、そのうち動く。
20210305085311.png

PostgreSQLに20TB・89億件のデータを入れてみる

  • 投稿日:
  • by
  • カテゴリ:

そーだいさんがこんなことを呟いていた。

ふーむ。これはやってみないといけないですね。
普通のPostgreSQLではちょっと無理っぽい件数なので、Azure Database for PostgreSQL Hyperscale (Citus)に入れてみる。海外さんのPGstromという変態実装(褒めている)を使う方法もあるけれど、PaaSでRDBMSで、っていうとHyperscale (Citus)がまず候補かな、と。

ちょっとどんな感じか分からないので、IOPSが最大になる2TBのストレージを持つワーカーノードを20台で構成してみる。
20201009210014.png
全体としてはこんな感じ。 20201009210001.png

で、64vCPUのVMにPremium SSDのData Diskを付けたUbuntuにpostgresql-clientをインストールした上で20TBのCSVデータを用意。splitコマンドで適当なサイズに分割して、

$ find chunks/ -type f | 
xargs -n1 -P64 sh \
-c "psql -h riotbindex-c.postgres.database.azure.com -p 5432 -d citus --username=citus \
-c \"\\copy table1 from '\$0' WITH CSV\""
って感じに投入する。クライアントを64vCPUにしたのはpsqlを64並列でデータ投入するから。コーディネータノードも64vCPUなので良いだろうと思ったら、もう少しコーディネータには余裕があった。

投入するのに、約7時間かかった...。さて、入ってるかな?

citus=> \timing
Timing is on.
citus=> select count(*) from table1;
   count    
------------
 8887648000
(1 row)

Time: 7689798.324 ms (02:08:09.798)

デフォルトパラメータのままだと、89億件を数えるのに2時間かかる...。

さて、本筋はインデックスですね、やってみましょうこうですか分かりません。

psql > CREATE INDEX table1_index ON table1 (ev_type);
CREATE INDEX
Time: 4884228.616 ms (01:21:24.229)

というわけで、1時間21分24秒でした。

Wahoo ELEMNT BOLTを動画に表示する話

  • 投稿日:
  • by
  • カテゴリ:

先日来、OSMO Actionで撮影した動画にWahoo ELEMNT BOLTのデータを表示する、ということをやっている。元々、ELEMNT BOLTはCANYON用のマウントで搭載していて、これは下部にGo Proなどのアクションカメラのマウントもあるので、そこにOSMO Actionを装着した次第。OSMO Actionは記録する画質が2.7K以上で無いとRock Steadyという映像ブレ補正技術が効かず、2.7Kでは内蔵バッテリーで実測80分程度しか録画出来ないため、サドルバッグに入れたモバイルバッテリーまで1.5メートルのUSB-C to USB-Cなケーブルを引っ張り、タイラップでケーブルを固定している。

撮影した動画にELEMNT BOLTから出力したFITファイルのデータを表示するのに、まずはGarminのVIRB Editを試してみた。で、何が不満だったかというと、ギアが表示出来ないことと、動画とFITのタイミングを合わせるのが「地図上の位置」で行う点。自分が乗ってるCANYONはSRAM Force eTAP AXSにパワーメーターを追加しているが、シフターが無線なので現在ギアがいくつかということは、サイコンの画面でないと確認出来ない。なので、動画中でも「あー、この時、2-10までギア変えたのか」とか知りたい。タイヤの周長をL(mm)、ケイデンスをC(bpm)、フロントギア/リアギアの歯数をF/Rとすると、60CFL/1000000R(km/h)なので、ギアから計算される速度とサイコンの実測値の違いを確認したりもしたい。

じゃあ作るかということで、まずFITにfileコマンドして、まあバイナリだよねhexdumpするかなるほどFITというシグネチャが入ってるのね、まで数分。んでちょっとググって、FIT SDKを見つけてきて、ざーっと目を通す。んー、大して面倒じゃないけど、誰かパーサを書いてないかなぁ、とググる。最初に見つけたパーサは使い勝手が悪く、fit parserの検索結果を総当たりして見つけたのが、PyPIにあったfitdecode。FITファイルを食わせてとりまイテレータでメッセージ部分をダンプしてみると、問題無さそう。じゃあこいつで、というところまで小一時間。

ダンプは出来るようになったものの、フィールド名がunknownだったりするので、それを要・不要分けてdictの配列に突っ込むか否かを処理したり、FIT SDKには無い形式で保存されてるデータを変換したりをparseint()という関数にまず実装。ELEMNT BOLTのイメージを動画に合成するのに、PillowでPNGを出力してffmpegでオーバーレイする作戦にしたものの、Pillowが遅くてどうしたもんかなぁ、あ、ワークアラウンドがあるやん、で高速化に成功。でも、まだ遅いなぁ、ループ内に無駄な処理が多いからそれを直して、っと、はい、合成できた、までは結構時間がかかった。

githubに公開したやつは、ここまでを実装してある。手元のバージョンでは地図を表示出来るようにしてあるけれど、公開する前にちゃんとオブジェクティブに書き直したいわぁ...。

MariaDBでSpiderクラスタを作る

  • 投稿日:
  • by
  • カテゴリ:

半分仕事、半分興味本位でMariaDBのSpiderクラスタをAzure上に構築するスクリプトを書いたので、GitHubに晒しておいた。

半分しか仕事じゃないのはこれがPaaSのサービスでは無いからなんだけど、仕事に「含まれている」Hyperscale (Citus)はスケールアウト出来るPostgreSQLである一方、MySQL / MariaDBのスケールアウト出来る実装って何やろな?って感じでSpiderを選んでみた。

スクリプトを書いて動かしてみた雑感としては、Citusだとシャーディングの設定はcreate_distributed_table('table', 'shard_key')で済むところを、データノードでInnoDBのテーブルを作成しSpiderでspiderのテーブルを作成しないとならないところが微妙に面倒なので、ここは改良されると嬉しいかと。あとはCitusと比較すると様々な面で(特にエンタープライズで)不足してる機能があるので、このあたりを自前で補わないと実運用は厳しそうだなぁ、というところ。

2020.07.09 追記
VMだけで構成していたんだけど、ちゃんと仕事になるようにSpider Data NodeはPaaSのMySQLを使うバージョンも作ってみた。create_spider_with_orcas.shは、PaaSを使う方。解説は後日。

macOS構築自動化

  • 投稿日:
  • by
  • カテゴリ:

GitHubにアップしといた。

brew file、AppleScript (osascript)、シェルスクリプト等々を組み合わせて、おおむね自動化した。
ただし、Terminal.appを[システム環境設定]→[セキュリティとプライバシー]の[アクセシビリティ]と[フルディスクアクセス]に追加するのと、注記に入れているosascriptのワンライナーだけは手動で実行する必要がある。これはまあ、致し方ないなぁ。
あと、AppleScriptの部分はかなり怪しいしGUIの変化に大変に弱いので、果たして新しいmacOSが出たときに動くかは不明...。

Azure CLIをmacOSのzsh completionで使えるようにする

  • 投稿日:
  • by
  • カテゴリ:

微妙に動かない設定しか見つからなかったのでメモっておく。

zsh-completionをインストールする。

% brew install zsh-completion

で、エラーが出る。

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?

compauditでチェックして、パーミッションを修正する。

% compaudit   
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh

% chmod 755 /usr/local/share/zsh/site-functions
% chmod 755 /usr/local/share/zsh/

/usr/local/share/だけ変更すれば良い可能性もあり。

bash completion用のファイルを~/.azure/az.completionとしてダウンロードする。

% mkdir ~/.azure
% curl -o ~/.azure/az.completion https://raw.githubusercontent.com/Azure/azure-cli/dev/az.completion

~/.zprofileに以下を追加する。

if type brew &>/dev/null; then
    FPATH=$(brew --prefix)/share/zsh/site-functions:$FPATH

    autoload -Uz compinit
    compinit
fi

autoload -U +X bashcompinit && bashcompinit
source ~/.azure/az.completion

Optimizing storage size of Azure DB for PostgreSQL

  • 投稿日:
  • by
  • カテゴリ:

This article describes how storage size affects the result of benchmarking, pgbench.

The storage size of Azure DB for PostgreSQL is 100 GB by default. It can be enough for your data, but you should know that IOPS is defined with storage size by 3 IOPS per GB. And you should understand the fact that pgbench is just a benchmark as well. It doesn't reflect the real querying pattern from your app. The queries from pgbench are too simple, so the result will be very sensitive for latency. Another I need to mention here is that the minimum IOPS for Azure DB for PostgreSQL is 100 regardless of storage size. Both 5GB and 33GB show a similar result of benchmarking.

I tested with following settings.
PostgreSQL: General Purpose, 4 vCore(s)
Client: Standard F16s (16 vcpus, 32 GiB memory), Ubuntu 18.04

Firstly, inserted 10M records.

$ pgbench -i "host=riopostgres.postgres.database.azure.com port=5432 dbname=postgres user=rifujita@riopostgres password={password} sslmode=require" -s 100

Checked that about 1.5GB data existed after inserting.

postgres=> select datname, pg_size_pretty(pg_database_size(datname)) from pg_database where datname='postgres';
 datname  | pg_size_pretty 
----------+----------------
 postgres | 1503 MB
(1 row)

pgbench command executed

$ pgbench -c 10 -t 1000 "host=riopostgres.postgres.database.azure.com port=5432 dbname=postgres user=rifujita@riopostgres password={password} sslmode=require"

Common parameters through benchmarks

transaction type: 
scaling factor: 100
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000

  • 33 GB(100 IOPS)
    latency average = 91.464 ms
    tps = 109.332645 (including connections establishing)
    tps = 109.800127 (excluding connections establishing)
  • 50 GB(150 IOPS)
    latency average = 60.443 ms
    tps = 165.445682 (including connections establishing)
    tps = 166.176647 (excluding connections establishing)
  • 100 GB(300 IOPS)
    latency average = 34.883 ms
    tps = 286.669194 (including connections establishing)
    tps = 288.647951 (excluding connections establishing)
  • 200 GB(600 IOPS)
    latency average = 29.285 ms
    tps = 341.474144 (including connections establishing)
    tps = 344.244699 (excluding connections establishing)
  • 400 GB(1,200 IOPS)
    latency average = 28.352 ms
    tps = 352.708873 (including connections establishing)
    tps = 355.236614 (excluding connections establishing)
  • 800 GB(2,400 IOPS)
    latency average = 28.632 ms
    tps = 349.256644 (including connections establishing)
    tps = 352.543669 (excluding connections establishing)

Conclusion: From the performance standpoint, the best storage size is 200GB with this querying pattern, and data size, 1.5GB.

CANYONをメンテするには

  • 投稿日:
  • by
  • カテゴリ:

自転車を長く扱ってる人なら当然に所持しているものも多いだろうけれど、CANYONをメンテするにあたって購入したもの等、まとめて備忘録としておく。
Ultimate WMN CF SL Disc 8.0 ETAPの納車以前に購入し、引き続き使用しているものも含めておく。特段断りの無いものはUltimate WMN CF SL Disc 8.0 ETAPで使えるもの。
また、Wiggleや他のサイトの方が安いこともあるので、そちらも是非検索を。

チェーンロックは欲しい強度や携行できる重さなど、色々な基準で好きなのを選ぶと良いけれど、2つ目の盗難防止策として非常に有効なAlterLockは是非装着を。

CANYONのパーツ・オプションはCANYONのウェブサイトから購入するしか無い。
スルーアクスルはデザインがちょっと違うだけでDT SwissのOEM品。フロント100mm、リア142mmで、M12 x 1mmのピッチが切ってあるものであれば、おそらく使える。
ディレイラーハンガー(No.40)は互換品がヤフオクなどに出ていて、それらの中ではPilo D717がまともそう。

タイヤ関連

チューブレスにはしたものの、やはり携行しておくと安心。

ボトル関連

上の2つのボトルケージを付けたが、下のIberaのボトルケージはシートチューブと干渉してしまい取り付けられなかった。

ペダル関連

ディスプレイスタンド

上のIberaのディスプレイスタンドはチェーンステーを支えるタイプなのでどうにか使えるものの、気を付けないとリアのディスクに当たる。下のクイックにはまるタイプは当然役立たず。

バッグ

Ultimate WMN CF SL Disc 8.0 ETAPのヘッドコラムが太いため、このトップチューブバッグはベロクロの長さが不足する。

トップチューブバッグにiPhoneを入れるタイプは、画面内の触ってないところが反応してしまい使い物にならなかった。

ので、iPhoneをステムに固定することに。

iPhoneでずっとやってきたが、バッテリーをトップチューブバッグに入れておかないとならないのも面倒になり、結局サイコンに移行。WAHOO ELEMNT BOLTのアウトフロントマウントは取り付けられず、ひとまずステムマウント。

wahoo_elemnt_bolt_limited_cor.jpgWAHOO ELEMNT BOLT

アウトフロントに付けたいということで、CANYONのCP10に対応するREC-MOUNTSのCANYON2を購入。20200107210504.jpg

工具としては、基本のヘキサとトルクス。トルクスはSRAM FORCEのチェーンリングの分解にT20とT30が、CANYONのディレイラーハンガー、No.40の取り外しにもT25ではなく、T20が必要。デジタルトルクレンチは細かなボルト類に、プレセット型トルクレンチはチェーンリングやディスクローター、クランクの着脱などに。チェーンリングは54Nmの指定があるため、少なくとも60Nmに対応したトルクレンチがオススメ。

T20が含まれるアーレンキーのセットはなかなか少なく、TopeakのX tool+ぐらいしか見つけられなかった。

センターロックディスクローターの着脱用。40Nmが指定されているので、差し込み9.5mmのトルクレンチ → 9.5mm : 24mmソケット → ボスフリー抜きの組み合わせで指定トルクで取り付けられる。

掃除用具

これは自転車に限らないけれど、洗った後に短時間で乾燥させるにはブロアが最適。特にディレイラー周りなどの水滴を残らず吹き飛ばせるので掃除にかかる時間が劇的に短縮できる。コスパ高い。

Zwift関連

上のANT+アダプタに付属するUSB延長ケーブルではちょっと届かず、Amazonベーシックの3mのものを追加。

アクセサリ

ルイガノに上のVOLT200を付けていたが、キャットアイのフレックスタイトブラケットの余った部分を店で切られてしまったため追加購入。これでライトとベルを1本のフレックスタイトブラケットで上下にまとめて装着する。

ロードバイクにハマった

  • 投稿日:
  • by
  • カテゴリ:

Twitterでは散々書いてることなんだけどもブログには書いていなかったので、そろそろまとめておくかという感じで。

今年の9月にルイガノのロードバイクを買った。サイクルベースあさひの在庫処分で本体は68,000円。ヘルメットやポンプ、諸経費込みで10万円以内で収まった。

きっかけは娘ちゃんの自転車の練習。2018年6月に供用した外環道と国道298号の横には歩行者・自転車専用道が整備されたので、そこで娘ちゃんに練習させている時に、ふと「この道で結構遠くまで行けるのでは?」と思ったこと。

20190923110645.jpg

2週間と経たずに、あまりのブレーキ性能の酷さにブレーキだけUltegraにした。

20191006095900.jpg 20191006125013.jpg

10月8日にはContinental Grand Prix 5000に履き替えた。

20191008160944.jpg

SPDペダルにしたりホイールをアルミにしたりしつつ、9月の数日で100km、10月に514km、11月に500km、さらにZwift環境を整えて屋内でのローラー練習も始めた。

20191216201739.jpg

ここまでの時点でメンテの知識もだいぶ身に付いたし工具も大体揃った。フィッティングのような経験のいる作業はともかく、エボIVのメンテや洗濯機の分解、あるいは子供の頃からやってきた機械いじりに慣れていることもあって自転車のメンテ作業に抵抗感はない。

自転車って完全に自分で弄れるのでは?と思い始めたタイミングでもあったので、10.8kgもあるルイガノよりもっと軽くて性能の良い、でも安いのが良いということで12月13日にCANYONのUltimate WMN CF SL Disc 8.0 ETAPを注文し、17日にドイツのフランクフルトから届いた。ステム一体型のハンドルを取り付け、シートポストを差し込み、前輪をスルーアクスルで締め、ペダルを取り付ければ良いだけで、あっけないほど簡単。ディスクブレーキのスペーサーを取り外すのを忘れずに。ペダルはルイガノで使っていて気に入っているシマノのSPDペダル・PD-ES600をCANYONにも。

20191217184753.jpg

さらに輸入したSRAM Force用のパワーメーター、ブランドはSRAMのQUARQになっている、を取り付けた。これは、8mmヘキサで固定されているSRAMのdub規格のチェーンリングを外して、インナー、アウター、オクトパスをT20とT30のトルクスレンチで分解し、オクトパスを入れ替えるだけでパワーとケイデンスがBluetooth / ANT+で取得出来るようになる。$599はリーズナブルだと思う。

20191226200709.jpg 20191227113524.jpg

シートチューブとボトルケージの隙間に写っている黒いパーツは、AlterLock。ある程度高価な、あるいは大事にしているバイクなら絶対付けておくことを強くオススメする。盗まれてもGPSで追跡できる。

Ultimate WMN CF SL Disc 8.0 ETAPについては新しいこともあって色々情報がなく、ひょっとしたら役立つかもしれないのでここにまとめておく。

  • 納車時にSRAM FORCE eTAP AXSのフロントディレイラー、リアディレイラー、左右のシフターがリンクしているかスマホアプリでチェックした方が良い。自分の場合、フロントディレイラーがリンクしていない上、10-33Tが付いて来てるのに、10-26Tが付いてることになってた。
  • スルーアクスルはフロント100mm、リア142mmで、ネジピッチがM12 x 1mmとなっているX-12規格のもの。これがほとんど代替品が無いので、ホイールの交換などを考えているのであれば新車購入時に同時に注文しておくのが良い。でないと、送料11,000円がまた必要になる...。
  • 付属のタイヤはSchwalbe Pro One Evoで、同じくSchwalbeのチューブが入った状態で出荷されてくる。シーラントを別途用意すれば、Reynoldsのホイール用のバルブステム(DT Swiss製?)は付属しているのでチューブレス化が可能。ただし、Schwalbe Pro One Evoの個体差かも知れないけれど、納車から2回目の実走で後輪がパンクし、その後もウォール・トレッドのあちこちからシュワシュワ言い出す始末で信頼出来ないため、とっととContinental Grand Prix 5000 TLにスイッチ。車体色に合わせた赤いTNIのステムでも問題なく使えた。
  • フレームやチェーンステーの傷保護用のシールは最初から貼られているので別途購入の必要はなし。
  • XOSSなどのケイデンスセンサーはクランクに取り付けるクリアランスが全く無いので注意が必要(ということもあって、上記の通りパワーメーターを購入した)。
  • ディレイラーハンガーは、No.40
  • ディスクローターはウェブページには、SRAM Centerline Xと書いてあるけれど、実際にはSRAM Centerline XRが付いて来た。

ブレーキパッドは写真のようなものが付いてくるが、型番が分からず。20191229143849.jpg
色々探してみたところ、サービスマニュアルからパーツナンバーが00.5318.024.000だということが分かった。

今月は実走1,000km超えが、Festive500もあって確定。Zwiftは300kmいくかいかないか...。

追記:Festive500達成。20191229203226.png