Kensington Expert Mouse 5 USBをX11で使う方法

トラックボールの名機と呼ばれるKensington Expert Mouse 5(EM5)をX11で使おうとしたが問題が発生した。

まず、EM5には4つのボタンがあり、それぞれのボタンはデフォルトでは以下のように割り当てられている:

.---------. .---------.
| Middle  | | Back    |
`---------' `---------'
.---------. .---------.
| Left    | | Right   |
`---------' `---------'

これら4つのボタンとホイールのX、Y軸それぞれの正方向、負方向のスクロールを合わせて8ボタンのマウスの扱いになる。

この割り当てを以下のように変更した上で、左クリックと右クリック同時押しで中央クリック、進むボタンを押しながらカーソル移動をスクロールに割り当てたい。

.---------. .---------.
| Middle  | | Forward |
`---------' `---------'
.---------. .---------.
| Left    | | Right   |
`---------' `---------'

これを実現するためにxorg.confでevdevの設定を以下のようにした:

Section "InputClass"
    Identifier "Kensington USB/PS2 Expert Mouse"
    MatchIsPointer "on"
    MatchProduct "Kensington USB/PS2 Expert Mouse"
    Driver "evdev"
    Option "ButtonMapping" "1 8 3 4 5 6 7 9 2"
    Option "Emulate3Buttons" "on"
    Option "Emulate3Button" "9"
    Option "EmulateWheel" "on"
    Option "EmulateWheelButton" "8"
    Option "EmulateWheelInertia" "10"
    Option "XAxisMapping" "6 7"
    Option "YAxisMapping" "4 5"
EndSection

しかし 8ボタンマウス として認識しているため、ButtonMapping の設定値で最後の 2 が無視されて 1 8 3 4 5 6 7 9 になってしまう。 そのため中央クリックのエミュレーションでボタン2(中央ボタン)ではなく、ボタン9(進むボタン)のイベントが送信されてしまう。

マッピングxinput コマンドで確認できる:

$ xinput get-button-map "Kensington USB/PS2 Expert Mouse"
1 8 3 4 5 6 7 9

今回これを回避するためにソースを編集してボタン数を btnmap の長さ(32)で決め打ちして回避した。

パッチを当てるとマッピングは以下のようになった:

$ xinput get-button-map "Kensington USB/PS2 Expert Mouse"                                 
1 8 3 4 5 6 7 9 2 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 

また、以前の記事でも、中央クリックのエミュレーションをマッピングの変更とともに使用するためのパッチを書いたが、これは中央ボタンの物理ボタン番号を指定する Emulate3Button の設定が実装されて不要になった。

なお、シリアルポート版のEM5をPS/2で使う場合はパッチは必要なく、以下の設定で同じ動作が可能:

Section "InputClass"
    Identifier "ThinkPS/2 Kensington ThinkingMouse"
    MatchIsPointer "on"
    MatchProduct "ThinkPS/2 Kensington ThinkingMouse"
    Driver "evdev"
    Option "ButtonMapping" "1 8 3 4 5 6 7 2 9"
    Option "Emulate3Buttons" "on"
    Option "Emulate3Button" "8"
    Option "EmulateWheel" "on"
    Option "EmulateWheelButton" "9"
    Option "EmulateWheelInertia" "10"
    Option "XAxisMapping" "6 7"
    Option "YAxisMapping" "4 5"
EndSection

初めてのスポーツ自転車の選び方

本稿では初めてスポーツバイク(自転車)を購入する方を対象に、自転車の選び方について述べます。 なるべく網羅的な情報を載せるように心掛けましたが、それらを自転車選び判断材料として活用頂ければ幸いです。

なお、レース目的での利用は想定しておらず、街乗りや、休日のツーリングで利用されることを想定しています。 また、かなり個人的な嗜好が反映されているので、中立なものではないことに留意した上でお読み下さい。

スポーツバイクの種類

スポーツバイクには様々な種類があります。 しかし、最近はロードバイクにだけスポットが当たることが多く、他にも様々な種類のスポーツバイクがあることが忘れられている傾向にあるのではないかと思います。 ロードバイクはどんな用途にでも利用できる万能なものではないです。 ロードバイクに限らず様々な車種を比較・検討した上で、最適なものを考えてみましょう。

以下は車種の選択における簡単なフローチャートですが参考にして下さい。

f:id:emonkak:20170112220032p:plain

ロードバイク

f:id:emonkak:20170112212859j:plain

Panasonic ORC-09

スポーツバイクといばこの車種を思い浮かべる人が多いでしょう。

ドロップハンドルと呼ばれる特徴的な形のハンドルが採用され、手の置く位置を変えて疲労を柔らげることができるので、長距離のツーリングに向いています。

変速は、平地を中心に走るためのクロスレシオなギアが取り付けられ、前2段、後8〜11段のものが多いです。

ホイールは径の大きな700cの(ママチャリの27インチに近い)ものが使われます。 そのため、背が低い人が乗るのには向いていないと言えます。 車種によっては背の低い人が乗れるサイズのものがありますが、無理な設計になっていて全体のバランスが悪く問題があることも多いです。 背の低い人でロードバイクにこだわりがないのであれば、650bや26インチホイールを使ったツーリングバイクの購入も視野に入れるといいです。

タイヤは23c(23mm)程度の細いものが使われ、高速で巡航するのが得意です。 細いタイヤが怖いという人がいるかもしれませんが、乗るとすぐに慣れるのでその点は心配の必要はないです。 ただ、雨の日のマンホール等はすべりやすいので注意が必要です。 また、細いタイヤはパンクし易いと考える人もいるみたいですが、太いタイヤに比べてパンクし易いということは、少なくとも普通の街乗り程度ではありません。

これらの特徴から、ロードバイクはオンロードを中心とした長い距離を楽に速く走るのが得意で、長距離のツーリングを考えている人には最適です。 一方で街乗り用途ではその特徴あまり活かすことができず、難点が目立つ場合もあります。 例としては、荷物な積載が難しい、泥除けを取り付けるのが難しい、乗車姿勢が前傾なので視界が悪い、比較的高価なので盗難されやすいという点などが上げられます。

マウンテンバイ

f:id:emonkak:20170112213307j:plain

Surly Karate Monky

オフロードを走るための車種です。 世界的には大ブームの車種ですが、近年日本では下火です。

特徴としてはオフロードを走るための溝がある太いブロックタイヤ、急な勾配にも対応できるワイドレシオなギアが特徴です。 ホイールは26インチのものもが長らく主流でしたが、近年は650b、29er(700c)と新しい規格のものが出て来ており、普及が進んでいます。 ホイールの固定方式も、より固定力の高いスルーアクスルという新しい方式のものが普及し始めていて、直にロードバイクもスルーアクスルが主流になるのではないかと言われています。

オンロードの平地中心の街乗りでは、軽快に走ることが難しいのでマウンテンバイクはあまり向いていないと言えます。 段差には強いので歩道を走りたいという人にはいいかもしれませんが、そもそも自転車は車道走行が基本ですし、歩道を走るのであればスピードはかなり制限されるのでママチャリで十分とも言えます。

冬季の雪国での走行を検討しているのであればマウンテンバイクは有力な選択肢です。 特に、マウンテンバイク用のスパイクタイヤはかなりのグリップ力があり、路面状況が良ければ凍結路面でもオンロードと変わらない走行ができます。 雪上での自転車は危険だと考えている人が多いとは思いますが、スパイクを履いたMTBなら歩くよりも安全に走れると言っても過言ではないので、興味があれば是非試してみて下さい。

クロスバイク

f:id:emonkak:20170112212737j:plain

Giant Escape R3

近年人気があり、かなり選択肢も増えた街乗り用の自転車です。 元々はMTB(マウンテンバイク)に溝のないオンロード用のスリックタイヤを取り付けることから始まった車種で、基本的な車体設計はMTBに近いです。 しかし、最近ではより街乗りに最適化されたロードバイクに近い車種も増えています。

MTBに使いクロスバイクと、ロードバイクに近いクロスバイクの違いとして、ギアの違いがあります。 MTBに近い車種は急な登りにも対応できる軽いギアを備えたワイドレシオのものが使用されるのに対して、ロードバイクに近い車種は平地に最適化されたクロスレシオなギアが使用されます。 ワイドレシオなギアは一度の変速で大きくギア比が変わるので、平地中心の走行では最適なギアが選択できず使い辛い場合があります(間のギアが欲しくなる)。 そのため、平地中心の街乗りではクロスレシオなギアが使用されているものが使い易いですが、残念ながらクロスバイクではワイドレシオなギアが主流です。 もちろん、ギアは交換可能なので不満があれば後で換えることはできます。

さらに、MTBロードバイクではフレームのエンド幅(ホイール取り付け部分の幅)が異なるので、車種によってエンド幅が異なります。 ホイールはフレームに合ったOLD(オーバーロックナット寸法)のものを使用する必要があります。

MTB近い車種は700cのOLD135mmのホイールが使われることが多いですが、これはロードバイクの700cのOLD130mmのホイールと互換性がないので注意が必要です。 そして、700cのOLD135mmのホイールはクロスバイク以外では通常使われない規格なので、替えのホイールの流通がほとんどありません。 対して、700cのOLD130mmのホイールはロードバイクの規格なのでとても選択肢が多いです。 この点から、クロスバイクを選ぶ時はフレームのエンド幅が130mmのものを選ぶのが無難です。

クロスバイクに関連する車種として、ロードバイクのドロップハンドルをフラットバーにしたフラットバーロードという車種があります。 これは、ハンドルがフラットバーであるだけで、車体設計はロードバイクに限りなく近いですが、これもクロスバイクとして分類されることもあります。 フラットバーロードは、ハンドルをドロップハンドルにすることで実質的にロードバイクにもすることができるので、後々にロードバイクにカスタムすることができます。 一方で、その他の通常のクロスバイクは、どうカスタムしてもロードバイクにすることはできないので注意して下さい。

これまで述べてきたようにクロスバイクにはMTBに近い車種と、ロードバイクに近い車種があります。 これらを十把一絡げにクロスバイクと呼ぶのは乱暴だと思われるかもしれませんが、厳密なクロスバイクの定義が存在する訳ではないのでこれは仕方がないです。 最近は、ハンドルにフラットバーを採用した街乗り用の自転車であれば、クロスバイクと呼ばれることが多いです。 なおクロスバイクは日本でのみ使われる名称で、海外では街乗り用の自転車ということでUrban Bikeなどと呼ばれることが多いです。

シクロクロスバイ

f:id:emonkak:20170112213303j:plain

Surly Cross Check

ハンドルはドロップハンドル、ホイールは700cが採用されるロードバイクに近い車種です。 タイヤはロードバイクに比べて太い、オフロードも走行可能な32c(32mm)程度のものが備えられます。 クロスバイクと名前は似ていますが、全く異なる車種なので注意して下さい。

本来、シクロクロスというオフロードの自転車競技のためのものですが、荷物を積載するためのキャリアを取り付けるダボ穴を備えた、長距離のツーリングに向いている車種もあります。

ロードバイクとの違いについては、太いタイヤとそれに対応するためのブレーキの種類の違いがあります。 ロードバイクはキャリバーブレーキ(ママチャリの前ブレーキと同じ)を備えますが、シクロクロスバイクは太いタイヤに対応するためにカンチブレーキか、ディスクブレーキを備えます。 カンチブレーキが採用されている車種は、ブレーキの効きがロードバイクキャリパーブレーキに比べると劣ることが多いので注意が必要です。 特に安価なカンチブレーキは本当に効きが悪くて危険なので、効きのいいシマノのもの等に交換するか、カンチブレーキと互換性のあるミニVブレーキへの交換も検討した方がいいかもしれません。

ロードバイクに比べると走行性能は多少は劣るものの、少し細めの28c(28mm)くらいのスリック(溝のない)タイヤを履くことでロードバイクに近い走行性能も得られます。 もちろんロードバイクに取り付けるようなもっと細い23cのタイヤを履くこともできますが、本来細いタイヤを履くように車体が設計されていないので、見た目のバランスが悪くなってしまいます。 オフロードも走行可能で、オンロードも得意な、ある種いいとこ取りの車種がシクロクロスバイクと言えます。

似ている車種として、悪路も走れるロードバイクと言われるグラベルロードという車種があります。 グラベルロードは、マーケティングのためのメーカーによって作られた車種とも揶揄されますが、ディスクブレーキを備えたシクロクロスバイクと同じものであると言ってしまってもいいでしょう。

シングルスピードバイ

f:id:emonkak:20170112212734j:plain

Fuji Feather

変速機を備えないシングルギアの車種です。 変速機のないママチャリもこの車種の一部だと言えますが、ここでは700cのホイールを搭載したスポーツ寄りものものについて述べます。

シングルスピードバイクはピストバイクと呼ばれることもありますが、厳密には両者は異なります。 その違いはギアの方式にあります。

ピストバイクは本来、競輪等のトラック競技で用いられる競技用の車種で、固定ギアという後輪がペダルと直結した方式を取っており、走行中はペダルを常に回し続ける必要があります。 対してシングルスピードバイクは、ペダルを止めると後輪が空転するという、通常の自転車のそれであるフリーギアを搭載します。

固定ギアは、停車時にペダルの位置を合わせることや、下りやカーブで足を止めることができないので、街乗りでは不便ですが、固定ギアのダイレクトな走行感が好きという人も多いです。 シングルスピードバイクの中には、ホイールの左右に固定ギアとフリーギアを両方取り付けられる車種も多く、ホイールをひっくり返すことでどちらかに変えることができます。 街乗りではフリーギアの方が使い易いことは間違いないですが、どちらも使ってみたいという場合はそのような車種を選ぶといいです。

シングルスピードバイクの良い点としては、何といってもシンプルというのが大きいでしょう。 シンプルなので、メンテナンスが楽でパーツの点数も少なく価格も安いです。 ロードバイクに比べると、変速機の調整がないのでカスタムや組立ても比較的に簡単にできます。

変速機がないので、坂道の多い道ではちょっと辛いですが、駆動ロスが少なく同じギア比なら変速機のある自転車よりも軽快に走行できるので、短距離の街乗り用途であれば有力な選択肢になるでしょう。

ツーリングバイ

f:id:emonkak:20170112213311j:plain

Surly Long Haul Tracker

長距離ツーリングのための車種です。 荷物を積載するためのキャリアを取り付けるダボ穴をフレームに備え、悪路にも対応できる太めのタイヤを備えます。 乗車姿勢はアップライトで長時間乗っていても疲れにくいです。 ホイールの径は車種によって700c、600b、26インチと様々なものがあります。

ツーリングバイクの代表的なものとしてMTB規格の26インチホイールを備えるSurlyのLong Haul Trackerがあります。 26インチのホイールは世界的に最もメジャーな規格で、国外での走行でもタイヤの入手性が良くトラブルに強いです。 また、26インチのホイールは700cに比べると小さいので、取り回しもよく背の低い人でも乗り易いという利点もあります。 一方、ホイールの径が小さいので巡航性能は700cのホイールに比べると劣りますが、太いタイヤを履くことができ、悪路も安定して走行することができます。 また、ダボ穴があるのでキャリアを利用してたくさん荷物を積載することができ、泥除けを取り付けることもできるので街乗りにも最適です。

ツーリングバイクとして日本で有名なものにランドナースポルティーフがありますが、これは次で別途に取り扱います。

ランドナースポルティーフ

f:id:emonkak:20170112160124j:plain

ARAYA Federal

ランドナーは長距離ツーリング用の車種で、700c、650bあたりのホイールを採用し、タイヤは悪路も走行できる32mmを超える太めのものが使われることが多いです。 車体は比較的重くロードバイクのような軽快な走行は期待できないですが、重い荷物が積載できて、長期のツーリングに耐えられる丈夫な設計です。 太めのタイヤに対応するためのブレーキはカンチブレーキが使われます。

スポルティーフロードバイクと同じ700cのホイールに、少し太めの28c(28mm)くらいのタイヤが使われることが多いです。 ロードバイクに近い設計で走行性能が高く、ある程度の荷物も積載できる、ツーリングに向いた車種です。 ロードバイクより少し太いタイヤに対応するために、ブレーキはアームの長いロングアーチのキャリパーブレーキが使われます。

ランドナースポルティーフは共にママチャリで採用されるようなフルフェンダー(泥除け)を標準で備えているのが特徴です。 泥除けを備えているので、雨天も走行したい場合に最適です。 しかし、これらの車種は近年はあまり人気がなく選択肢が少ないのが欠点です。

フレームの素材

自転車のフレームにはいつくかの素材がありますが、それぞれ異なった見た目や特性があります。 ここでは代表的なスチール、アルミ、カーボンの3つの素材について述べます。

スチールフレーム

f:id:emonkak:20170112212855j:plain

Panasonic FRC-09

鉄を主成分にした合金で作られたフレームです。 クロムとモリブデンの合金のクロモリと呼ばれるものが有名です。 他に、ハイテンション鋼(ハイテン)というものがありますが、これは低価格なママチャリなどの自転車で使われることが多いです。

スチールフレームはパイプが細くすっきりとした見た目が特徴です。 フレームの素材としては最も古いもので、クラシックなデザインのものが多いです。

スチールには、しなりがあって振動吸収性が高く丈夫なので、街乗りや長距離のツーリングに向いていると言えます。 欠点としては重量が比較的重いので、走りの軽快さでは他の素材に劣ります。 しかし、スピードを重視しない街乗りやツーリング用途ではそれ程気にする必要はないでしょう。

雨天走行時は錆易いので注意が必要です。 そのため、完成車でも購入時には一旦ばらしてフレーム内に錆止めをスプレーし、パーツの固着を防ぐためにグリスを塗布した方がいいです。 パーツが固着するとパーツが壊れた時に交換が困難になるので、それがフレームの寿命となってしまう事にも繋がりかねません。

アルミフレーム

f:id:emonkak:20170112213314j:plain

TNI 7005MKⅡ

スチールに比べて軽量に作る事ができるアルミニウムを素材としたフレームです。 現在は最も主流なもので、価格が安く、エントリーモデルの車種に採用されることが多いです。

外見としてはスチールフレームに比べてパイプが太く、最近はエアロ形状の現代的な外見のものも多いです。

アルミフレームはスチールフレームに比べると硬く、反応がいいと言われます。 ただし硬い分、振動吸収性が悪いので、長距離のツーリングには向きません。 しかし、街乗り程度であればそれ程気にする必要はないでしょう。

スチールフレームに比べると錆びづらいのも利点の1つです。 ただし錆びないという訳ではないので、雨天走行時にはスチールフレームと同様注意する必要があります。

アルミは素材の特性として疲労強度の限界点がないので、スチール比べると寿命は短いと言われます。 しかし、よっぽどハードな乗り方をするのでなければ、すぐに寿命を迎えることはそうないので心配する必要はないです。 ただし、寿命を迎えたアルミフレームは疲労限界に達して突然破断すると言われるので、10年を超えるくらい長く乗ったフレームでは、破断の兆候としての異音やひびに十分注意する必要があります。

カーボンフレーム

f:id:emonkak:20170112213317j:plain

TNI Podium

カーボンフレームは近年のロードレースの機材としては標準的になった、とても軽くて丈夫なフレームです。

外観としては、太いチューブでエアロ形状のレーシーな見た目のものが多いです。

カーボンフレームは他の素材に比べて圧倒的に軽く、振動吸収性も良く、他の素材に比べて優れている点が多いです。 金属フレームではないので錆の心配もなく、落車等がなければ一生使えるとも言われます。 ただし、特にレース用の軽量カーボンフレームはとても薄くできているので、落車等の衝撃には十分に注意が必要です。

カーボンは現時点でのフレームの素材として最高のものと言えますが、価格が高いので街乗りで使うには盗難の危険も大きく、オーバースペックと言えるでしょう。 カーボンフレームの自転車は街乗りでは使用せずに、レースやツーリング用途で使う事をおすすめします。

パーツの選び方

ここでは自転車を構成するパーツの選び方について述べます。

完成車を選ぶ際も、どのようなパーツが使われているのかは重要な指標となるので参考にして下さい。 もちろんパーツは後から交換することもできますが、完成車のパーツをあれこれ交換していると、かえって割高になることもあります。 望みのパーツで組まれた完成車が見付からない場合は、フレームから好きなパーツを選んで自分で組み上げる、フレーム組みを検討するといいです。

フレーム

f:id:emonkak:20170112220018j:plain

ICAN AERO 007

フレームの素材はスチール、アルミ、カーボンの3つが主流です。 素材によって特性が大きく異なるので、用途によって適切なものを選びます。

長距離のツーリングを考えている場合は振動吸収性のいいスチールフレームがおすすめです。 スチールは丈夫な素材なので壊れにくく、錆さえ気を付ければ、一生ものとも言われるので長く使いたいという人にいいです。 線が細く、他の素材のものにはないすっきりとした見た目をしているので、デザインが好みという理由で選ぶのもいいでしょう。

安い街乗り用の自転車を考えている人はアルミフレームがおすすめです。 なんといっても安く、錆に強いので街乗りで気軽に乗り回すことができます。

カーボンフレームは基本的にレース用の機材なので、街乗り用途にはあまり向いているとは言えません。 基本的にキャリアを取り付けることのできないので沢山の荷物を載せるのは難しいですが、荷物の少ない日帰りのツーリング程度であれば、軽く、振動吸収性もいいので快適にこなせると思います。 ツーリング用途であれば、高価ですが検討の価値はあります。

ハンドル

f:id:emonkak:20170112212750p:plain

Nitto B105AA

ハンドルはロードバイクならドロップハンドル、クロスバイクならフラットバーと車種によって決まることが多いです。 もちろん、例えばクロスバイクにドロップハンドルを使うようなこともできますが、車体の設計がそのようになっていないので、ポジション的に無理が生じることが多いです。 したがって、車種ごとに想定される標準的なハンドルを使うのが基本です。

ハンドル径は31.8mm、26.0mm、25.4mmの3種類が基本で、必ずステムのクランプ径とと揃えたものを使用する必要があります。

ロードバイクで使われるドロップハンドルには様々な形状のものがあるので選択に迷います。 現在最も一般的なのが、アナトミックシャローと呼ばれるコンパクトな形状のものです。 アナトミックシャローは小さな手の人でもレバーに指が届きやすいので、ブレーキを掛け易く、リーチ(奥行)とドロップ(高さ)が短いので下ハンドルを握った時に前傾が緩やかで扱い易いです。 他に、シャローや、アナトミックなどの形状もありますが、ドロップハンドルが初めてならアナトミックシャローが扱いやすいのでおすすめです。

ドロップハンドルを選ぶ時は幅の選択が重要で、主に流通しているのは380mm〜420mmのものです。 ハンドル幅は肩幅に合わせるのが基本と言われますが、まずは標準的な400mmのものを基準にして、小柄な体系であれば380mmを、大柄な体系の場合は420mmというのが1つの目安です。

あまり一般的ではないですが、クロスバイクや、シングルスピードバイクに乗るのであればフラットバーだけではなく、ブルホーンバーも選択肢の一つとして有力なものです。 ブルホーンバーは下ハンドルのないドロップハンドルのような形状で、ドロップハンドルのように握る場所を色々と変えることができるので、長距離を走っても疲れにくいです。 フラットバーの場合、どうしても手首を不自然な角度で曲げて握ることになりますが、ブルホーンバーでは、せり出した角の部分を握る事で、手首を自然な角度にして楽にハンドルを握る事ができます。

ステム

f:id:emonkak:20170112212850j:plain

Nitto UI-25

ハンドルを固定するためのパーツです。

スレッドステムと、アヘッドステムの2種類があり、フォークに対応するもの選びます。 現在一般的なのはアヘッドステムですが、スチールフレームの場合はスレッドステムもよく使われます。

対応するハンドルの径はステムのクランプ径によって決まるので、使いたいハンドルの径にあったものを選びます。 製品による違いは重さくらいしかないので、ハンドルの径に合っていて自分にとって最適な長さのものを選べばいいでしょう。

長さは100mm程度が標準的な長さで、このくらいの長さのステムでぴったりになるようにフレームのサイズを選ぶ必要があります。 ステムは極端に長くても、短くても格好悪いですし、ハンドリングに難が出てくるので注意して下さい。

サドル

f:id:emonkak:20170112221532j:plain

Selle Italia Turbo

サドルはレース用の硬いもの、ママチャリのような幅広で柔らかいコンフォートなものなど様々なものがありますが、スポーツバイクに取り付けるならコンフォートすぎるサドルは、柔かくて力が逃げるのでおすすめしません。

個人的におすすめなのは、丸みを帯びた形状(ラウンドシェイプ)が特徴のクラシックサドルです。 具体的にはセラ・イタリアのターボや、セラ・サンマルコのリーガルやロールスなどのサドルです。 昔のレーサーパンツは現代のもののように柔らかいパッドが入っていた訳ではないので、クラシックサドルは現代のサドルよりもクッションが多めになっている傾向にあります。 丸みを帯びた形状で適度なクッションがあるので、レーサーパンツなしの普段着でも乗りやすくツーリングや街乗りに最適です。 もちろんサドルの合う合わないは個人差が本当に大きいので、クラシックサドルが合わない人もいるかと思います。

長距離ツーリングを考えている人は革サドルも選択肢に入れるといいかもしれません。 革は使っている内に体に馴染むので、長く使って馴染んだ革サドルは長距離乗ってもお尻が痛くなりにくいです。 ただし、馴らすまでに時間を要するのと、雨に弱いという欠点があります。

シートポスト

f:id:emonkak:20170112212846p:plain

Nitto S65

サドルを固定するためのパーツです。

様々な径のものがありますがフレームのシートチューブの内径とぴったり一致するものを選ぶ必要があります。

大まかに、ねじ一本で固定する一本締めのものと、二本で固定する二本締めのものがあります。 二本締めのものは、固定力が高くサドルの角度がずれにくいのでこちらの方がおすすめです。 もちろん使い方や製品次第では一本締めであっても必ずしもずれ易い訳ではないので、選択の基準の1つと考えて下さい。

製品によってはサドルの後退幅を取るためのセットバックのあるものと、セットバックのないものがあります。 どちらを選択した方がいいかはフレームとサドルの組み合わせ次第ですが、どちらかといえばサドルを後退させたいケースの方が多いので、迷った時はセットバックがあるものを選ぶといいです。

BB(ボトムブラケット)

f:id:emonkak:20170112213120j:plain

Shimano BB-UN55

BBはクランクを取り付けるための軸の部分で、様々な規格のものがあります。

まず、ねじ規格がJISのものとITA(イタリンアン)のものの2種類があります。 JIS規格ものは右側のワンが逆ネジになっているので注意が必要です。 これはフレームのねじ切りによって決まってくるのでフレームに合致したものを選びます。 また、ねじを使用しない圧入式のBBも、カーボンフレームを中心に普及していますが、異音が発生し易い他、メンテンナンス性に難があるため、評判が良くないです。

次に、取り付けるクランクに応じてスクエアテーパー、オクタリンク、ホローテックなどの接合部分の規格xがあります。 廉価な完成車には、ベアリングにカップアンドコーンを採用したスクエアテーパーのBBが使用されることがあります。 この方式のものは雨に弱くグリスが流れてガタが出やすいので、可能ならシールドベアリングのものに交換することをおすすめします。

また、完成車はBBが非常に固く締め込まれているものがあり、それが錆びて固着してしまうと外すのが困難になることがあります。 そのため、完成車は購入時にBBを一度外して、ねじを入念にグリスアップした上で組み直した方がいいです。

ペダル

f:id:emonkak:20170112212744j:plain

MKS Prime Sylvan Road

ぺダルは大きく分けて、スニーカーで乗ることのできるフラットペダルと、専用の靴でペダルと靴を固定するビンディングペダルがあります。

街乗りであれば、スニーカーで乗ることのできるフラットペダルが便利です。 ただし、完成車に付属されることの多い樹脂ペダルは非常に滑りやすく危険なので、金属製のものに変えることをおすすめします。

ビンディングペダルは足を固定することでフラットペダルに比べて効率の良いペダリングをすることが可能なので、長距離のツーリングで楽に走ることができます。 一方、街乗りの場合はストップアンドゴーが多く、ペダルの付け外しが頻繁に必要になってしまうことから、あまり向いていないと言えます。

クランク

f:id:emonkak:20170112213258j:plain

Sugino Mighty Comp

クランクはチェーンリングとペダルを取り付けるためのパーツです。 クランクとチェーンリングはセット(クランクセット)で販売されているものが多いです。

クランクは165〜175mmくらいまので長さのものが存在しますが、これは脚の長さやペダリングのやり方によって最適なものが異なってきます。 長さは170mmが標準的で、完成車はこの長さのものが取り付けられることが多いです。 170mmの長さのクランクは身長の170cmくらいの人で丁度いいというのが一つの目安で、まずはそれを基準にクランクの長さを考えてみるといいです。

クランクに取り付けるためのチェーンリングには、変速に対応する薄歯のものと、変速に対応しない厚歯のものがあります。 変速機を備えるロードバイクでは薄歯のものを使用し、変速機を使用しないシングルスピードバイクでは厚歯を使用します。

チェーンにも薄歯と、厚歯のものがあるので対応するものを選びます。 厚歯のチェーンは、変速に対応しなくていい分、厚く丈夫にできているので薄歯のものより長持ちすると言われます。

ロードバイクの場合、チェーンリングを2枚取り付けるものが主流で、歯数の組み合わせは52-39T(外側に52丁、内側に39丁の歯)、50-34Tの2種類が主流です。 52-39Tを備えるものをノーマルクランク、対して歯数の少なく小さな50-34Tを備えるものをものをコンパクトクランクと言います。 クランクに取り付けるチェーンリングは歯数が多ければ多い程、漕ぐのが重くなります。 近年は歯数の少ないコンパクトクランクが主流で、重すぎず急な勾配にも対応できるので特に初心者にはこちらの方がおすすめです。 ただし、コンパクトクランクは外側と内側の歯数差が大きく、フロンノ変速時に大きくギア比が変わるので、それが気になる場合はノーマルクランクを選択するといいです。

クロスバイクの場合、MTBのようにチェーンリングが3枚取り付けられているものがありますが、街乗りではこれは重いだけでメリットは少ないです。 よっぽどの急勾配がない限り3枚のチェーンリングを使いこなすことはできないので、平地中心の街乗りであれば、2枚ものもか、シングルのものでも十分です。 フロントをシングルにする場合はどうしてもチェーンが外れやすくなるという欠点がありますが、最近MTBシクロクロスバイクで良く使われているナローワイドのチェーンリングを使うことで強力にチェーンが噛みこみ、よっぽどのことがない限りチェーンが外れることはなくなります。

ディレイラー(変速機)

f:id:emonkak:20170112213136j:plain

Shimano RD-6700

変速機はシマノの場合、最新の規格でリア(後)が最大11段にまで対応しています。 フロントはロードバイクの場合が通常2段で、MTBの場合は3段が標準です。

リアの変速の段数は多いに越したことがないのは確かですが、段数が多いものは高価になるので、街乗りやツーリングでは古い規格の8〜10段のものでも十分です。

ディレイラーシマノのものが国内では安くて品質が良いいのでおすすめですが、グレードごとにかなりの種類があります。 シマノのロードコンポーネントのグレードは低い順にClaris、Sora、Tiagra、105、Ultegra、DuraAceの6段階があります。 それぞれのグレードに対応するディレイラーが製品として存在しますが、段数の違いの他は、グレード間の性能差はほとんどないと言っていいです。 したがって、廉価なグレードものもでも十分高性能なので、8速ならClaris、9速ならSora、10速なら1つ前のモデルの105のものがおすすめです。

しかし、グレード間で性能差はほとんどないとはいえ、見た目の違いは大きく、廉価なグレードは見栄えが良くないです。 見栄えにこだわって、高いグレードものものを選択するのもいいでしょう。 高いグレードものものも、古いモデルの中古なら安く手に入ることも多いので、中古を探すのもいいです。

ブレーキ

f:id:emonkak:20170112213125j:plain

Shimano BR-6700

ブレーキには色々な種類があり、車種によって取り付けられものものが異なります。 一般に、ロードバイクにはキャリパーブレーキシクロクロスバイクやツーリングバイクにはカンチブレーキクロスバイクMTBにはVブレーキを取り付けることが多いです。 また、最近は制動力が高く雨天走行にも強いディスクブレーキを搭載した車種も多くなっています。

ブレーキはどんな乗り方をするのであれ、命を預けるとても重要な部品なので品質のいいものを選択した方がいいです。 やはりシマノ製のものが優れていて、ロードバイク用のキャリパーブレーキなら105以上のグレードのものを強くおすすめします。 先程の変速機と違ってブレーキのグレードによる性能差はかなり大きく、廉価なグレードのものは効きが悪いです。

シクロクロスバイクやツーリングバイクで使われるカンチブレーキについては、廉価なものでは相当効きが悪いので、高価でも効きのいいものを選ぶべきです。 シマノUltegraグレードのBR-CX70は効きが良くおすすめですが、廃盤になるという話もあるので在庫のある内に早めに購入しておいた方がいいかもしれません。

スプロケット

f:id:emonkak:20170112213133j:plain

Shimano CS-6700

リア(後)ホイールに付けるギア板です。

スプロケットは、ディレイラーと変速レバーの段数に合ったものを選びます。 シマノの場合、グレード間で重さと表面の仕上げの違いがあります。 低いグレードのものは表面の仕上げの違いから少し錆び易いので、雨天走行をした時は注意が必要です。 錆はメンテナンスで簡単に防げるものなので、重さが気にならないなら、低いグレードのものでも十分でしょう。

スプロケットの歯数はフロントのチェーンリングとは逆で少ない程重くなります。 歯の組み合わせとしては12-25T(最も小さい歯が12丁、最も大きい歯が25丁)がある程度の坂も対応できてバランスが良く、街乗りでもツーリングでも使い易いでしょう。 急な峠を含むツーリングを考えるのであれば、クランクをコンパクトクランクにして12-28Tくらいのスプロケットを選択するのがいいでしょう。

ブレーキレバー・シフター

f:id:emonkak:20170112213140j:plain

Shimano ST-6700

ロードバイクの場合、ブレーキとシフターが一体になったデュアルコントロールレバーが主流です。 デュアルコントロールレバーならブレーキから手を離さずに変速できるので、安全で簡単に変速できるので非常に扱いやすいです。

一方で、ブレーキレバーとシフターが別のタイプも特にツーリング用途では根強い人気があります。 例えば、フレームのダウンチューブの左右に取り付けるWレバーという変速レバーですが、これは手を股の下に伸ばさないといけないので変速はデュアルコントロールレバーに比べると不便です。 しかし、シンプルな機構で故障も少なく、見た目もスマートなので愛用者も多いです。 ツーリング用途であれば、街乗り程ストップアンドゴーが多い訳ではないので、変速の機会も比較的少なく、慣れるとそれ程不便を感じないです。 また、変速レバーを備えないブレーキレバーは、ブラケットが小さく、手の小さい人でも握りやすいという利点もあります。

Wレバーの以外のドロップハンドルで使えるシフターとして、ハンドルの先端に取り付けるバーエンドコントローラーや、ブレーキブラケット周辺に取り付けるコマンドシフター、ブレーキレバーの上部にWレバーやバーエンドコントローラーを取り付けるための台座を設けたGevenalle CXなどもあります。 これらはハンドルに取り付けることができるので、Wレバーに比べると操作性で優れます。 なお、コマンドシフターは既に廃盤になった商品ですが、デットストックが未だに流通している他、ヨシガイから復刻する話もあるようです。

フラットバーで使えるシフターとしては、グリップシフトと、ラピッドファイヤーがあります。 現在主流なのはラピッドファイヤーで、グリップシフトは廉価な自転車で使われることが多いです。 他にフラットバーにWレバーをマウントするためのパーツも存在するので、Wレバーを使うこともできます。

ホイール

f:id:emonkak:20170112213200j:plain

Shimano WH-6800

ホイールはフレームが対応する径のものを選びます。 ロードバイククロスバイクシクロクロスバイクの場合700cのものが一般的です。 ツーリングバイクでは700cの他に650bや26インチものも使われます。 ホイールの素材としてはアルミが主流ですが、レース用の軽いものになってくるとカーボンも使われます。

ホイール選びの際に重要なのはなんといっても重量です。 重量は軽ければ軽い程走りも軽くなるので、他の条件が同じなら当然軽い方がいいです。 ただし、軽いホイールというのは基本的にレース用のものになってくるので、高価で、普段使いするにはオーバースペックです。 また、軽いホイールは強度で劣る傾向にあるので、体重の重い人や、自転車に沢山荷物を載せることを考えているのであれば、避けた方がいいかもしれません。

ホイールの販売形態としては完成品のホイールを売る完組みホイールが主流です。 一方で部品をバラバラに買って自分で組み立てる、手組みホイールも根強い人気です。 完組みホイールと手組みホイールの違い何かと言うと、一般にスポーク数が異なります。

完組みホイールは16〜24本くらいの少ないスポークで比較的重いリムを使って組まれているのに対して、手組みホイールは28〜36本くらいのスポークで、軽いリムを使って組まれることが多いです。 回転部分は外周部の重量が軽い方が良く回ると言われていますので、この点から言うとリムの軽い手組みホイールに軍配が上がります。 また、手組みホイールはスポーク数が多いので、壊れにくく、修理も容易で、振動吸収性も良い傾向にあります。 これらの特徴から街乗りや、ツーリングに最適だと言えます。

タイヤ

f:id:emonkak:20170112212730j:plain

Continental GatorSkin

タイヤはホイールの径にあったものを選びます。

タイヤは様々な幅のものがありますが、車種によって取り付けることのできる幅は決まってきます。 ロードバイクかシンスグルスピードだと23mm〜25mm、クロスバイクだと28〜32mm、シクロクロスバイクだと32mm、26インチのツーリングバイクだと1.5inch、MTBだと2.0〜2.5inchくらいのものが使われることが多いです。

タイヤの種類としてはクリンチャータイヤと、チューブラーのタイヤがあります。 クリンチャータイヤはタイヤの中にチューブに空気を入れて使用するごく一般的なタイヤですが、チューブラータイヤはチューブと一体になったタイヤです。 チューブラータイヤはクリンチャータイヤに比べると、軽く、しなやかで振動吸収性も良く優れている点が多いです。 しかし、タイヤの取り付けにリムセメントと言う接着剤を使用する必要があり、パンク修理もかなり面倒なので、街乗りやツーリングには向かないと言えます。 街乗りやツーリング用途ではクリンチャータイヤを使うのがおすすめです。

クリンチャータイヤにはワイヤーが入っていて折り畳むことのできないワイヤービードのものと、ビードに柔らかいアラミドを利用して折り畳むことのできるケブラービードのものがあります。 ケブラービードのものの方が高価ですが、軽くて性能のいいタイヤが多いです。

ケブラービードのタイヤは高いといっても1本3000円程度で性能のいいものが買えるので、こちらの方をおすすめします。 タイヤは自転車部品の中で最も性能を体感しやすいパーツで、安価な重いワイヤービードのタイヤを使っているのであれば、軽いケブラービードのものに変えることで走りは大幅に改善します。

クリンチャータイヤの中には、チューブラータイヤと同じ製法で作られたオープンチューブラーというタイヤも存在します。 オープンチューブラーは、クリンチャータイヤでありながら、チューブラータイヤのようなしなやかさを持つタイヤです。 しかし、とても高価な他、取り付けが難しいという欠点があります。

タイヤを選ぶ際、パンクについて気になる人も多いかと思いますが、パンクは走る道と運による所が大きく、その次にタイヤが影響してくると思って下さい。 ただし、悪路を走行する場合はタイヤの影響が比較的大きくなりますので、パンクに強いタイヤを履くことが重要になります。

また、細いタイヤはパンクし易いと思われるかもしれませんが、そのような傾向はまずありません。 タイヤを太くするよりも、強い耐パンクベルトを備えるタイヤを選ぶことが、パンクの抑制に有効です。

耐パンク性能に定評のある700cのタイヤとして、コンチネンタルのGatorSkinがあります。 このタイヤは比較的安価な割にかなり重量も軽く、耐久性と、耐パンク性能に定評があります。 幅も23-32cまでとラインナップが広いので様々な車種に対応できます。 ただし、耐パンク性能の高いタイヤは硬くゴツゴツした走りで、振動吸収性は悪い傾向にあります。 しなやかで乗り心地が良く、耐パンク性能の高いタイヤというのは存在しないので、ここはトレードオフになってきます。

具体的な車種の選択

これまで、スポーツバイクの種類、フレームの素材、パーツの選び方について自分の考えを述べました。 これらの内容を1つの判断材料として、様々な種類のものの中から、よく比較検討した上で具体的な車種を決めて下さい。

具体的な車種を選ぶ際は、相場よりも著しく安いものは避けた方がいいです。 安いのには理由があり、必ず何か問題があるものです。

価格帯としては、ロードバイクシクロクロスバイク、ツーリングバイクなら10万円以上のものを、シングルスピードバイク、クロスバイクなら5万以上のものを選ぶと良いです。 安い車種の中には安全上の問題があるものもあり、ある程度の予算を掛けることが必要だと思って下さい。

また、オークションなどで中古の自転車を購入するのは、自身で何でもメンテナンスができるのではない限り避けた方がいいです 中古でも、状態の良いものなら良いですが、問題があればパーツの換装やメンテナンスが必要になるからです。 問題があるか否かは、実物を見なければ完全にはわかりません。 もちろん、購入した自転車のメンテナンスを自転車店に任せてしまってもいいですが、店によっては断わられることもありますし、工賃が高く付いて、かえって割高になってしまうかもしれません。 これらのことから、特に状態のわからない中古の自転車は避けるのが無難と言えます。

初めはやはり新品の完成車を買うことから初めるといいでしょう。 そしてメンテナンスを一通り覚えて慣れてきたら、フレーム組みも検討してみるといいです。

おわりに

本稿で述べた内容には個人的趣向が大きく反映されていますが、そもそも筆者はどんな車種に乗っているのか疑問に思われたかもしれません。 最後に自分の所有している2台の自転車の写真を紹介しておわりとします。 写真のリンク先にはパーツ構成も書かれているので、参考にして下さい。

Panasonic FRC-27

Panasonic FRC-27

PanasonicのFRC-27でフレーム組みしたロードバイクです。 コンポーネントは7800系のDura-Aceを中心にして、少々クラシックな感じで組みました。

Surly CrossCheck

Surly Cross Check

SurlyのCrossCheckでフレーム組みしたシクロクロスバイクです。 泥除けを備えており、普段の通勤で使用しています。 泊まり掛けのツーリング時には、この自転車にキャリアとパニアバックを取り付けています。 ドライブトレインは、フロントはシングルでナローワイドの44Tギアを備えており、リアはワイドレシオに12-30Tのスプロケットを取り付けています。 これで、ある程度の峠を含むツーリングにも対応でき、平地もそれなりの速度で巡航できます。

ただの声優オタクが選ぶ2017年注目の女性声優8人

先日人気声優が選ぶ「声優総選挙」ベスト200という番組が放送されていたみたいです。 自分は見ていないのですが、便乗して2017年注目の女性声優8人を勝手に選びます。

選考基準としては「今」人気の人よりも、「これから」より人気になるであろう人を選んでいます。

  • 上田麗奈

    「うえしゃま」こと上田麗奈さんです。

    昨年はアニメーションとしては珍しいバイクを題材にした「ばくおん!!」で主人公「佐倉羽音」役を演じられて話題になりました。 さらに今年は自転車を題材にしたアニメ「南鎌倉高校女子自転車部」で主人公「舞春ひろみ」役を演じられており、乗り物アニメといえば彼女か、東山奈央さんという感じになりつつあります。

    いわゆる天然系のアホキャラを演じるとピカイチで、「ばくおん」の「佐倉羽音」役はこの上ないくらいマッチしていたと思います。

    ラジオでは、小野大輔さんとパーソナリティを務めていた「ディメラジ〜Dimension W Radio〜」ではパーソナリティが2人とも「ボケ」で面白いと話題になりました。

    また、昨年末にはミニアルバム「RefRain」が発売され、アーティスト活動も開始されています。

  • 夏川椎菜

    TriSeilのメンバーとしてもお馴染の「ナンス」こと夏川椎菜さんです。

    昨年は「はいふり」こと「ハイスクール・フリート」の主人公「岬明乃」役で注目を集めました。 癖のない正統派の主人公・ヒロイン声という印象で、これからも色々な作品で活躍されるのではないかと思います。

    ラジオは、新人声優の登竜門的な番組「ラジオどっとあい」で「夏川椎菜のナンスの角に小指ぶつけて痛い」という番組をやられていました。 「TrySailのTRYangle harmony」では個性の強い雨宮天さん、麻倉ももさんに押されてどちらかといえば地味な印象でしたが、個人の番組も独特なトークで中々に面白いです。

  • 大森日雅

    「にちかちゅ」こと大森日雅さんです。

    2014年に「六畳間の侵略者!?」の「虹野ゆりか」役で衝撃のデビューを飾ったことが印象的です。 当時、「脳がとろける」とも言われた独特の甘い声質が話題になりました。

    六畳間の侵略者!?」では大森日雅さん、鈴木絵理さん、田澤茉純さん、長縄まりあさんの4人で「ハート♡インベーダー」というユニットも結成されました。 個人的に注目していたユニットで、再始動されないかなと密かに期待しています。

    昨年は、「魔法少女なんてもういいですから」で「坂上ちや」役を演じられ、彼女の甘い声質とドSキャラのギャップが良かったです。 まだあまりアニメ出演数は多くありませんが、今年さらに活動の幅が広がることを期待しています。

    ラジオでは、鈴木絵理さんと2人でパーソナリティを務める「大森日雅鈴木絵理 今夜もスパで待ち合わせ♪」が印象に残っています。 ここでも、彼女のあの声質でドS発言をするというギャップが印象的です。

  • 本渡楓

    アイム期待の新人「えーで」こと本渡楓さんです。

    去年の下半期は「レガリア The Three Sacred Stars」の主人公「ユインシエル・アステリア」役、「ガーリッシュナンバー」の「久我山八重」役、「競女!!!!!!!!」の「青葉風音」役、とメイン級の役を立て続けに3つ担当されました。 今年は現時点で「うらら迷路帖」の「巽紺」役、「亜人ちゃんは語りたい」の「小鳥遊ひかり」役を演じられており、今一番勢いのある新人声優と言っても過言ではないと思います。

    声優としての演技に定評あるのはもちろんのこと、ラジオもかなり面白いです。 特に、芸人の天津向さんと2人でパーソナリティを務める「本渡楓と天津向の『本渡上陸作戦』」が強く印象に残っています。

    番組は基本的に本渡楓さんのボケに天津向さんがツッコむという形で進行しますが、その応酬が秀逸で、さながらプロのお笑いコンビのようなやり取りです。 お笑い芸人と、声優の組み合わせも新鮮で、今までにない新しい声優ラジオが聞きたい人は是非聞いてみて欲しいです。

  • 水瀬いのり

    「いのりん」こと水瀬いのりです。

    2014年頃から途切れることなくメイン級の役を多数演じられている、みなさんご存知の大人気声優です。 昨年特に印象的だったのは「魔法少女育成計画」の「スイムスイム」役です。 「スイムスイム」は今までになかったような難しい役柄だったと思うのですが、とても見事に演じられていたと思います。

    その他のアニメの出演も多数あるのですが、アーティスト活動についても触れておかなければならないでしょう。 まずデビューシングルの「夢のつぼみ」はとにかく衝撃的でした。 まず、歌声が別人の様で驚き、その声量に驚き、その歌唱力の高さに驚きました。 若手の声優で彼女の歌唱力に匹敵するの人はそういないのではないかと感じました。

    3rdシングルの「Starry Wish」は「魔法少女リリカルなのはシリーズ」の第5期となる「ViVid Strike!」のEDテーマになっています。 ちなみに、OPテーマは小倉唯さんが歌う「Future Strike」です。 「魔法少女リリカルなのはシリーズ」のOP&EDと言えば代々、水樹奈々さん、田村ゆかりさんが担当されていましたが、いよいよこの2人に続く声優アーティストが出てきたと感じました。 今後の活躍も楽しみです。

  • 花守ゆみり

    「ゆみりん」こと花守ゆみりさんです。

    昨年は「リルリルフェアリル」の主人公「りっぷ」役、「あんハピ♪」の「花小泉杏」役、「灼熱の卓球娘」の「旋風こより」役、「魔法少女育成計画」の「ねむりん」役、とメイン級の役が続きました。 「リルリルフェアリル」は女児向けアニメですが、今後プリキュア声優になる日も近いのではないでしょうか。

    まだ19歳でとても若いので今後のさらなる活躍を期待してます。

  • 長縄まりあ

    「なーなーまりあ」こと長縄まりあさんです。

    彼女はとにかく声が特徴的で、「長縄まりあ」でGoogle検索すると、本当にあの声が地声なのかと「長縄まりあ 地声」とサジェストされる程です。

    昨年はやはり「ステラのまほう」で主人公の「本田珠輝」役を演じられたのが印象的です。 彼女の可愛らしい癒し系の声がキャラクターにマッチしてとても良かったと思います。

    ラジオは、「小澤亜李・長縄まりあのおざなり」を取り上げない訳にはいかないでしょう。 内容としては小澤亜李さんと、長縄まりあさんがイチャイチャしているだけと言えばそうなのですが、2人のトークの端々に出る毒が強烈で面白いです。 声優ラジオとしては唯一無二と言ってもいい、非常に個性の際だったラジオだと思います。

  • 麻倉もも

    TriSeilのメンバーとしてもお馴染の「もちょ」こと麻倉ももさんです。

    麻倉ももを、ほっとけない。」これは「B.L.T. VOICE GIRLS」の表紙に彼女が載った時のコピーです。 これはまさに彼女の印象を的確に表したコピーだと思います。 彼女はとにかく可愛いらしくて、同時にどこか危なっかしくてほっとけないのです。

    昨年は、「クロムクロ」の「白羽小春」役が印象に残りました。 さらに一昨年になりますが「Charlotte」の「乙坂歩未」役も印象に残っています。 この2つはどちらも妹役で、妹といえば麻倉ももさんというのはもはや過言ではないでしょう。 まだアニメの出演数は多くはないですが、今後のより一層の活躍に期待しています。

    ラジオについては一昨年になりますが「ラジオどっとあい 麻倉もものもちょやまばなし」が印象的です。 とにかくボケの応酬でツッコミ不在の番組だったのですが、可愛いしそれがまた面白かったです。 現在は「TrySailのTRYangle harmony」でTrySailのメンバーとしてラジオをやっていますが、まったく別の人との組み合わせの番組も聞いてみたいです。

rxvt-unicodeのフォントレンダリングを改善する

問題

最近はNoto Fontという高品質な日本語フォントが無料で手に入るいい時代になりました。 しかし、rxvt-unicodeでこのフォントを指定すると、とても残念な表示になってしまいます。

フォントの設定は以下のものです:

Rxvt.font: \
  xft:Consolas:pixelsize=13, \
  xft:Noto Sans CJK JP:pixelsize=13:style=DemiLight
Rxvt.lineSpace: 6

f:id:emonkak:20161209173120p:plain

サンプルテキストにはロレム・イプサムを利用させて頂きました。

これはrxvt-unicodeのバージョン9.22で表示した画像ですが、いつくかの表示上の問題があります。

  1. 欧文の文字間隔が異常に広い
  2. lineSpaceで指定した分の数値が行の高さとして単純に足されるので文字が上によってしまう
  3. アンダーラインの表示がベースライン上に引かれるのでベースラインの下にはみ出す 'g' や 'y' が読みづらい(これは好み)
  4. 日本語フォントが著しく小さい

解決

1の文字間隔については既にパッチが出まわっていて、gentooのパッケージでは alt-fontwidth のuseオプション有効にすることで改善します。

f:id:emonkak:20161209173115p:plain

他の問題については1つづつ自分でパッチを書いて改善していきます。

まずはlineSpaceの問題についてですが、これ単純に文字の描画位置を調整するだけでいいので簡単です:

diff --git a/src/rxvtfont.C b/src/rxvtfont.C
index 1914539..20a77af 100644
--- a/src/rxvtfont.C
+++ b/src/rxvtfont.C
@@ -1395,7 +1395,7 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,

           ep->glyph = glyph;
           ep->x = x_ + (cwidth - extents.xOff >> 1);
-          ep->y = y_ + ascent;
+          ep->y = y_ + ascent + (term->lineSpace >> 1);

           if (extents.xOff == 0)
             ep->x = x_ + cwidth;

次のアンダーラインの問題も同様です:

diff --git a/src/screen.C b/src/screen.C
index 9eb375a..7b3cdbf 100644
--- a/src/screen.C
+++ b/src/screen.C
@@ -2432,8 +2432,8 @@ rxvt_term::scr_refresh () NOTHROW
                 XSetForeground (dpy, gc, pix_colors[fore]);

               XDrawLine (dpy, vt, gc,
-                         xpixel, ypixel + font->ascent + 1,
-                         xpixel + Width2Pixel (count) - 1, ypixel + font->ascent + 1);
+                         xpixel, ypixel + Height2Pixel (1) - 1,
+                         xpixel + Width2Pixel (count) - 1, ypixel + Height2Pixel (1) - 1);
             }
         }                     /* for (col....) */
     }                         /* for (row....) */

最後の日本語の文字が著しく小さくなる問題ですが、これは中々苦労しました。

条件としては組み合わせるフォントのアセンダ・ディセンダの値が大きく異なると発生します。 ですので、FontForgeなどでアセンダ・ディセンダを調整することで回避することもできます(やってました)。

しかし、これはあんまりなのでソース側で対応することにしました。 どうやら、欧文フォントに比べて日本語フォントのアセンダ・ディセンダが大きすぎるので、枠内に収まるように縮小しているようです。 これはもう余計なお世話という他ないので、この処理はばっさりと消してしまいます。

すると、文字が正しい大きさで描画されるようになりますが、欧文フォントと日本語フォントのベースラインが揃わずにガタガタになってしまいます。 これは以下のことをして調整しました:

  • フォントのアセンダ・ディセンダ、高さの値を xterm で使っている値と同じものを使うようにするパッチを適用
  • 描画する行の高さを取得し、アセンダ・ディセンダの比率から描画位置を決定する
  • ベースラインから描画位置を決定する

これで以下のように綺麗に描画されるようになりました:

f:id:emonkak:20161209173122p:plain

ここまでやったすべての修正を含むソースは以下にあります。

https://github.com/emonkak/rxvt-unicode/tree/9.22-patched

パッチは以下になります:

おわりに

rxvt-unicode はフォントレンダリングにはいくつか問題がありますが、他にいい代替がないので困りものでした。 今回これを綺麗に描画するように修正できて今はrxvt-unicodeに満足しています。

本当は本家が修正されるのがいいんでしょうけど、様々なディストリのパッケージが独自にパッチを適用しているのを見ると厳しいのかもしれません。

追記:描画位置の修正が不十分だったのでさらに修正しました

PSR-7とPSR-15を使ったWebアプリケーション開発

はじめに

PSR-7(HTTP Message)が承認されてからしばらく経ちますが、現在はこれを使った様々なライブラリ・フレームワークが登場しています。 これによって特定のライブラリ・フレームワークにロックインされずに、Webアプリケーションを実装できる道程が見えてきました。

しかし、PSR-7はあくまでHTTPメッセージのインターフェイスを提供するもので、リクエストを受け取ってレスポンスを返す流れを抽象化するものではありません。 これはHTTPミドルウェアと呼称されますが、そのインターフェイスはそれぞれの実装でまちまちです。 そこで、これを抽象化するPSR-15(HTTP Middleware)が提案されています。

ミドルウェアは大まかにダブルパスのミドルウェアと、シングパスのミドルウェアに分けることができます。 PSR-15は現在の所シングルパスのシグネチャを採用しています。

シングルパスのミドルウェアシグネチャ

function (ServerRequestInterface $request, callable $next): ResponseInterface;

ダブルパスのミドルウェアシグネチャ

function (ServerRequestInterface $request, ResponseInterface $response, callable $next): ResponseInterface;

PSR-15のインターフェイスを提供するhttp-interop/http-middlewareにシングルパスを採用する理由があります。 ダブルパスのミドルウェアには事前にレスポンスを与える必要がありますが、そのレスポンスが利用可能なものかどうかを保証できないことが問題だと判断し、シングルパスを採用したようです。

The most severe is that passing an empty response has no guarantees that the response is in a usable state. This is further exacerbated by the fact that a middleware may modify the response before passing it for further dispatching.

残念ながら、この2つのインターフェイスには相互運用性がないので、アダプターを介してシグネチャを統一しても同じ動作を保証できません。 しかしこれは過渡期の問題で、恐らくはPSR-15の承認とともにどちらかに統一されることで解決に向かうはずです。

実装方針

本稿ではPSR-15を利用して簡単なサンプルとしてのWebアプリケーションを実装することを目的とします。 アプリケーションの設計については様々な手法がありますが、今回はDDD(Domain-driven design)を採用することを念頭に置いて進めていきます(サンプルなのでドメインと言っても実体があまりないですが)。

実装にあたっては既存のフレームワークを使うという選択肢もありますが、ここでは単機能なライブラリを組合わせて疎結合な独自のマイクロフレームワークを構築し、その上でアプリケーションを実装します。 これはあえてフルスタックフレームワークを避けたということでもあります。

フルスタックフレームワークは機能が豊富で便利なのは確かですが、注意深く設計をしないとドメインが特定のインフラストラクチャに依存する形になってしまいがちです。 さらには、複雑なドメインとアプリケーションの要件次第では、フレームワークの機能も十分に生かすことができず、かえって足枷になってしまうこともあります(フレームワークに汚いハックをして無理矢理要件を満たすなど)。 これはフレームワークが汎用のものである所以です。

ドメインは特定のインフラストラクチャから完全に分離されており、それ単体で動作するのが理想的です。 そうすると、ドメインへの影響は一切なしに、フレームワークを乗り換えることだってできます。 フレームワークもアプリケーションの要件に完全に合致したものがあればミスマッチもありません。

そこで、クリーンアーキテクチャを採用した、独自のマイクロフレームワークを作成するという道を選択しました。 幸いにして、そのための部品(ライブラリ)は揃いつつあります(揃えました)。 クリーンアーキテクチャではフレームワークに依存するレイヤーはこの図にある「Interface Adapters」と「Frameworks & Drivers」の部分だけです。

f:id:emonkak:20161209010829j:plain

https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

仕様

作成するのはアカウント登録、ログイン、ログアウトがあるだけのごく単純なアプリケーションです。

  • ユーザーはサービスを利用するためのアカウントを作成(サインアップ)しなければならない
  • アカウント作成にはメールアドレスとパスワードが必要
  • アカウントが作成されると自動的にログインされる
  • ログインに成功すると「Hello World!」と表示される
  • ログインしたアカウントはログアウトすることができる
  • ログインするにはアカウント作成時に入力したメールアドレスとパスワードが必要

実装

今回実装したアプリケーションのソースは以下にあります。

https://github.com/emonkak/php-http-app-skeleton

使用ライブラリ

いくつか自作のライブラリも含まれますが、それぞれ詳細については追って記事にしたいと思います。

ディレクトリ構造

Laravelの構成を参考にしています。

パッケージ構成

  • App\Adapters

    HTTP、コンソール(CLI)、データベースなどの外部インターフェイスへのアダプターが格納されます。 本来であればデータベースにアクセスするリポジトリの実装はこちらに配置するのが望ましいですが、今回はインターフェイス定義を省略して簡略化するために App\Domain に配置しています。

  • App\UseCases

    アプリケーションのユースケースが格納されます。 今回の場合はアカウントの認証と作成のためのサービスが格納されています。

  • App\Domain

    アプリケーションが対象とする問題領域であるドメインの実装が格納されます。 パッケージ直下には実装は格納せずに、集約ルート(ルートエンティティ)ごとにサブパッケージを定義します。 今回はアカウントのサブパッケージのみが格納されています。

  • App\Supports

    他の各レイヤーの実装を支援するためのユーティリティが格納されます。

エントリーポイント

まずはサーバーのエントリーポイントとなるスクリプトを見てみます。

最初に、リクエストからレスポンスを生成するための Application クラスのインスタンスを別ファイルから require しています。 この Applicationインスタンスにリクエストを与えて、生成されたレスポンスを送信するというのが全体の流れです。

<?php
// public/index.php

use Zend\Diactoros\Response\SapiEmitter;
use Zend\Diactoros\ServerRequestFactory;

// アプリケーションのインスタンスを読み込む
$app = require __DIR__ . '/../bootstrap/http.php';

// グローバル変数からリクエストを生成
$request = ServerRequestFactory::fromGlobals();

// リクエストからレスポンスを生成
$response = $app->handle($request);

// レスポンスを送信する
(new SapiEmitter())->emit($response);

アプリケーションの初期化

Application の初期化は bootstrap/http.php で行なわれます。 ここではオートローダーを読み込み環境変数の設定をした上で、各種ミドルウェアの登録を行っています。

以下は bootstrap/http.php の内容です:

<?php

require __DIR__ . '/../vendor/autoload.php';

// .envから環境変数を読み込み
(new Dotenv\Dotenv(__DIR__ . '/../'))->load();

if (getenv('APP_DEBUG')) {
    // デバッグモードならsymfony/debugによるエラー画面を表示する
    Symfony\Component\Debug\Debug::enable();
}

$app = new App\Adapters\Http\Application(realpath(__DIR__ . '/../'));

// 以降ミドルウェアの設定
// ミドルウェアは追加された順番通りに実行される

// POST時に_methodパラメータをPOSTすることでメソッドをオーバーライドする
$app->pipe(
    (new Middlewares\MethodOverride())
        ->post(['PATCH', 'PUT', 'DELETE'])
        ->parsedBodyParameter('_method')
);

// セッションを開始する
$app->register(App\Adapters\Http\Middlewares\SessionStarter::class);

// アカウントを認証する認証
$app->register(App\Adapters\Http\Middlewares\Authenticator::class);

// テンプレートに設定される共通の変数($request, $uri, $session, $flashes)を設定する
$app->register(App\Adapters\Http\Middlewares\ViewSharedVariables::class);

// ルーティングの結果から処理を設定されたハンドラに移譲する
$app->registerDispatcher();

// エラーのロギングを実行する
$app->registerErrorHandler();

if (!getenv('APP_DEBUG')) {
    // Dispatcherが処理できなかった時に最後に実行されるミドルウェア
    // 404ぺージが表示される
    $app->register(App\Adapters\Http\Middlewares\ErrorPage::class);

    // 同様の実装をエラー発生時にも実行されるように登録する
    // catchされない例外があればここでハンドリングされてエラーページが作成される
    $app->registerOnError(App\Adapters\Http\Middlewares\ErrorPage::class);
}

return $app;

DIコンテナの生成

Applicationインスタンスが生成される時に、コンストラクターでは bootstrap/container.phprequire してPSR-11の ContainerInterface の実装が生成されます。 要求されるのは ContainerInterfaceインスタンスなので、好きなDIコンテナの実装を利用することができます。 今回は自作の emonkak/di を使っています。

このコンテナにはアプリケーションに必要な各種インスタンスが登録されます。 環境の違いによって異なる設定を利用したい場合は、.env によって設定される環境変数を利用して切り替えます。

以下はDBのコネクションをコンテナに登録している部分のソースです:

<?php

$container->factory(PDOInterface::class, function() {
    return new PDO(
        sprintf(
            '%s:host=%s;port=%d;dbname=%s',
            getenv('DB_CONNECTION'),
            getenv('DB_HOST'),
            getenv('DB_PORT'),
            getenv('DB_DATABASE')
        ),
        getenv('DB_USERNAME'),
        getenv('DB_PASSWORD'),
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        ]
    );
})->in(SingletonScope::getInstance());

本サンプルでは設定値を管理するための専用の仕組みは得に設けていませんが、ほとんどの場合この環境変数を使う方法で事足りるはずです。

仮に環境によって特別な設定をしたい場合についても、以下のように if で分岐してしまえば対応できます。 多くの設定は環境によらず共通のはずで(環境ごとの差異が大きすぎるのは問題)、異なる部分だけをif文で分岐するというのが重複も発生せずシンプルでいいと思ってます。

<?php

if (getenv('APP_ENV') === 'production') {
    // production settings
} else {
    // other settings
}

ルーターの生成

ルーターはURLのパスに応じて、リクエストをハンドリングするクラス(ハンドラー)を決定するためのものです。

ルーターの生成は、パスに応じた処理を実行するための Dispatcher ミドルウェアの登録時に bootstrap/router.phprequire することで行われます。 ここで要求されるのは emonkak/router で定義されたインターフェイスである RouterInterface の実装です。

以下は bootstrap/router.php の内容です:

<?php

use App\Adapters\Http\Handlers;
use Emonkak\Router\TrieRouterBuilder;

return (new TrieRouterBuilder())
    ->get('/', Handlers\Index::class)
    ->get('/api/ping', Handlers\Api\Ping::class)
    ->get('/accounts/sign_up', Handlers\Accounts\SignUp::class)
    ->post('/accounts', Handlers\Accounts\Create::class)
    ->get('/sessions/login', Handlers\Sessions\Login::class)
    ->post('/sessions', Handlers\Sessions\Create::class)
    ->delete('/sessions', Handlers\Sessions\Delete::class)
    ->build();

これは単純にルーティングの内容を書き下しているだけですが、ハンドラーの命名に一定の法則を設けることで、クラスの一覧を取得して自動的にルーティングを定義するという方法も考えられます。 さらに生成したルーティングの内容をシリアライズした上でキャッシュすることで、性能的にも有利になります。 ルーティング数の多い大規模アプリケーションであれば、このような方法も検討もするといいかもしれません。

実装のイメージとしては以下のようなものです:

<?php

if (file_exsits(__DIR__ . '/../storage/router.cache.php')) {
    return unserialize(file_get_contents('/../storage/router.cache.php'));
}

$builder = new TrieRouterBuilder();

foreach (RoutingResolver::resolve(__DIR__ . '/../src/Adapters/Http/Handlers') as list($method, $path, $handler)) {
    $builder->route($method, $path, $handler);
}

file_put_contents(__DIR__ . '/../storage/router.cache.php', serialize($builder->build()));

return $router;

ハンドラーの実装

リクエストをハンドリングしてレスポンスを返すクラスをハンドラーと呼んでいます。 あらゆるPSR-15のミドルウェアはハンドラーとして利用できます。

その他、1つのクラスで複数のエンドポイントを取り扱う、コントローラースタイルのクラスをハンドラーとして登録することもできます。 コントローラーを登録する時はルーターにクラス名とメソッド名のペアを指定します。 指定されたクラスのメソッドは ServerMiddlewareInterfaceprocess() メソッドと同じシグネチャであることを期待されます。

コントローラーの例:

<?php

class ExampleController
{
    public function index(ServerRequestInterface $request, DelegateInterface $delegate)
    {
        ...
    }

    public function create(ServerRequestInterface $request, DelegateInterface $delegate)
    {
        ...
    }

    ...
}

http-interop/http-middleware に言及がありますが、PSR-15のシングルパスのミドルウェアはレスポンスの生成をミドルウェア自身が行うので、レスポンスの実装に対する依存が起きてしまいます。

Some have argued that passing the response helps ensure dependency inversion. While it is true that it helps avoid depending on a specific implementation of HTTP messages, the problem can also be resolved by injecting factories into the middleware to create HTTP message objects, or by injecting empty message instances. With the creation of HTTP Factories in PSR-17, a standard approach to handling dependency inversion is possible.

確かにPSR-17を使うことで特定の実装に依存することは回避できるのですが、ちょっと使い勝手が良くありません。 例えばJSONのレスポンスを返す時にContent-Typeを適切に設定してデータを json_encode() を設定しなければならないのはなかなかに面倒です。

そこでもっと簡単にレスポンスオブジェクトを生成できる Respondable トレイトを作成しました。

<?php

trait Respondable
{
    public function html($html, $statusCode = 200, array $headers = [])
    {
        return new HtmlResponse($html, $statusCode, $headers);
    }

    public function json($data, $statusCode = 200, array $headers = [])
    {
        return new JsonResponse($data, $statusCode, $headers);
    }

    public function redirect($uri, $statusCode = 302)
    {
        return new RedirectResponse($uri, $statusCode);
    }

    ...
}

これらのメソッドをハンドラーにミックスインして呼び出すことで、直接特定のレスポンスの実装に依存することはなくなりました。

おわりに

PSR-7とPSR-15を使ってマイクロフレームワークを作成して、簡単なサンプルアプリケーションという試みをしてみました。 機能としては不足している点はありますが、この成果は現実のアプリケーションに十分に適用できるものだと思います。

実は、このような試みをしたのは2度目で、その時の成果として emonkak/wafというライブラリがあります。 これは前職で関わったとあるプロダクトで利用されています。 この時はアプリケーションの要件がかなり特殊で既存のフレームワークとは適合しなかったので、独自のフレームワークを作成する必要がありました。

本稿では説明不足な点も多々ありますが、ソースはシンプルで読み易いはずなので、興味があれば読んで頂ければと思います。

株式会社インフィニットループを退職しました

2011年10月から約五年間務めていました株式会社インフィニットループを退職しました。

今の会社を離れて新しいことをやりたくなったというのがその理由です。 別の言い方をするのであれば、会社から与えられる仕事について不満があったというのが正直な所です。

インフィニットループソーシャルゲームの受託開発を主としていますので、開発の人員の割合もこれに関するものが最も多いです。 そのため社員にはゲーム好きが多く集り、自社で開発したゲームについても熱心なプレイヤーが社内にもいます。

私自身については、ゲームがとにかく好きで暇さえあればゲームをやっていた時代もありましたが、今はほとんどやらなくなって十年以上が経ちます。 そのきっかけは何だったかというと、自分はゲームをやることよりも物語を楽しむことが好きだと気付いたのが始まりです。 物語を楽しむのであれば、私にとってゲーム性の部分は不要で、ビジュアルノベルで良かったし、さらには小説やアニメで良かったということです。

そんな中、ゲーム好きが集まる社内では疎外感を感じることもありましたし、ソーシャルゲームの開発というのも自分として決してやりたい仕事ではありませんでした。 しかしながら、今の時代プログラマーのキャリアとしてソーシャルゲームの開発に携わるというのは重要だと考えていたので、仕事として全力で取り組みはしました。 ですが同時にこれをずっと続けていくのは耐えられないとも思いました。

一方で、幸いにして自分は、会社からある程度好きなことをやっていいという裁量を与えられていました。 自ら新しい仕事を提案することもできましたし、嫌な仕事は断わって別のことをやらせてもらうこともできました。 実際、インフィニットループでの五年間でソーシャルゲームの開発に携わったのはごく僅かで、検定アプリだったり、勤怠管理だったり、某PBWだったりと他にも様々な開発に参加してきました。 結果的に、iOS/Androidネイティブクライアント、Unityクライアント、Windowsアプリケーション、JavaScriptのSPA、サーバーサイドではPHPとNodejs、などと様々な環境を経験することができました。

退職に至る話し合いの折も、いくつか自社企画の下で新しい仕事の提案を頂きました。 しかし、自分としてそれをこの会社でやる意味を見出せませんでした。 本気でそれを作りたいという会社としての強い意思が感じられなかったからです。

まずもって、ある企画を確固とした意思をもってサービスとして世に出すというのは、相当な熱量が必要になるのではないでしょうか。 それが受託中心の会社におけるマインドの問題もあって、難しいのではないかと思います。

最後に、インフィニットループでの様々な経験が今の自分の糧になっているのは間違いなく、得難い経験をさせて頂いた会社にはとても感謝しています。入社のころから考えると、会社の規模が二倍、三倍になって環境が大きく変わっていったのは、とても刺激的で興味深い体験でした。

これからは先の仕事は何も決まっていませんが、とりあえずは無職を満喫しようと思います。

時間計算における丸め

本稿では時間計算についての丸め操作を考える。 最初に丸めの定義は以下とする。

丸め(まるめ)とは、与えられた数値を、ある一定の丸め幅の整数倍の数値に置き換えることである。 https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86

丸めの対象

時間計算における丸めの対象は瞬間(Instant)あるいは日時(LocalDateTime)とする。

瞬間 とはタイムゾーン(場所)によらず一意な時間である。瞬間は一般にUTC時間で表される。 一方、日時 は特定の瞬間を表すものではなく、タイムゾーンによってその日時を表す瞬間は異なる。 瞬間日時タイムゾーンが与えられれば相互に変換することができる。

丸めの単位

時間計算における丸めの単位は継続時間(Duration)とする。 継続時間とは、長さを表す時間の概念で秒で表されるものとする(実際の実装ではナノ秒)。

ここでまず単純な例を挙げると:

  • 2001/02/03 01:02:03 を 10分(600秒) を単位に切り捨てる → 2001/02/03 01:00:00
  • 2001/02/03 01:02:03 を 10分(600秒) を単位に切り上げる → 2001/02/03 01:10:00

まず丸め処理をするためには、丸めの対象となる日時を数値に変換する必要がある。 この例だと丸めの単位が一日の長さの約数なので、日を無視して時間だけに注力すれば良い。 SI単位系を用いて計算すると 01:02:03(1 * 60 * 60) + (2 * 60) + 3 = 3723(秒) となるので、ここから 3723 % 600 = 123(秒) のように余りを求めてそれを足し引きすればいい。

これは自明は結果だが、以下のケースだとどうなるか:

  • 2001/02/03 01:02:03 を 7分 を単位に切り捨てる → ?

この丸めは一般に定義できない。 なぜなら7分(420秒)というのは一日の長さの約数ではないからだ。 一日の長さははSI単位系24 * 60 * 60 = 86400(秒) なので 86400 / 420 = 205.714286... のように割り切ることはできない。 すると日を含めた日時を数値に変換して余りを求めなければならないが、それはどの瞬間を起点とするか、1年の長さが何秒なのかによって結果が異なってしまう。 これは 紀年法と暦を定義しないと数値に変換することはできない ことを意味する。

実装