数ヶ月ぶりの三浦半島で痛感するロングライドの走り方


数ヶ月振りに 200km 超のロングライドに出かけました。

このところ出張が続いたこともあり、まともに自転車に乗ること自体が約2週間振りだったのですが、毎朝の日課として自転車またはランニングで 20km ほど走っていることから大丈夫だろうと高を括っていました。

実際に 100km を走るまでは。

走り出してみると継続的に溜まり続ける疲労への対処に補給食の必要性、ファミレスの偉大さ、三浦半島の走りにくさなど様々なことに気付かされます。

そして長距離を走るには継続的に長距離を走り、走り方を忘れないことが重要だという当たり前のことを改めて実感します。

毎朝の決まり切った時間に近所を周回するトレーニングとは異なり、長距離では道路状況や地形が読めないことが通常ですし、夜間から早朝、日中へと時間が移り変わっていく中で視界状況や温度といった環境も激しく変化します。

同じ距離を走るにしても、いつもよりも疲労が大きいのです。

そして疲れても直ぐに引き返してシャワーを浴びることができないという精神的な重圧が、距離を稼ぐに連れて地味に負担になってきます。

そのことに私が気がついたのは走行距離が 100km を超えてから。

しくじったなと思いながらも長距離ゆえに簡単に終わらないところが辛い点です。

長距離では疲労を溜め込まないように、負荷を少なく維持する走り方を心掛けなければなりません。




そもそもの間違いは長距離であるにも関わらず、重いギアを踏みながら長時間走り続けることです。

早朝4時台に麹町を出発して6時には横浜で日の出が見えるというオーバーペース振り。


路側帯が路上駐車で埋め尽くされる前に都内を抜けたい、始発電車と同じ時刻に横浜に到着したい、きっと写真写りが良いはずだという雑念が歩を緩めません。

東京と横浜の往復走であれば片道 35km 程度なので、こうした走り方でも大きな問題にはなりません。

しかし、距離が伸びれば話が変わります。

日の出とともに訪れる東京都市圏の地獄のような混雑を避けるためにクランクを回し続けているうちに徐々に太腿が強張ってきます。

走行距離にして約 70km ほど、横須賀を過ぎた辺りから寒さや向かい風を辛く感じるようになり、脚も回らなくなってくるのを自覚します。

晩秋の気温と海風に手が悴み、長距離の走行で眼と肩が疲れてきたので、朝食を兼ねて久里浜のデニーズで暖をとることに決めました。


数時間振りに口に含んだコーヒーは暖かく、染み渡るほどに美味しく感じられることに新鮮な驚きを覚えます。

冬場のロングライドで、糖分も水分も枯渇した後に口にするラーメンやココアなどは物凄く美味しいと感じることを思い出しました。

デニーズの朝食で気力と思考力を回復させたら、道路が混み出す前に先を急ぎます。

そもそも人口も可住面積も大阪府とほぼ同一で道路も狭い神奈川県には、いくら東京都心から離れたところで平地の快走地帯など存在しません。

そこで大事なことは、どれだけ人 (車) がいない時間帯のうちに走れるかということです。

ところで同じ関東平野の先に位置する半島でも、東京と対岸にある房総方面に行けば少しは話も変わります。

久里浜からの東京湾フェリーで片道40分、大人一人720円 (+ 自転車一台1,210円) で海峡を越えられることから、東京圏でまともに走れる場所の中では極めて短時間かつ低料金でアクセスできる魅力的な場所と言えます。

何よりも不必要な輪行袋を持ち歩かなくて良い点が素晴らしいです。

8時台の便に乗れるように早朝に自走で到着して、以後は房総半島でゆったりと過ごすのも良さそうです。


翻って三浦半島を眺めると、狭くて迂回路もない道路に押し寄せる人や車の量に感心してしまいます。

早々に引き返して去ろうとしている私の方はともかく、日が昇ると同時に対向車線から押し寄せる四輪車や二輪車、そして自転車の列の長さに圧倒されます。

その混雑に根負けして、一度、主要な道路を離れてしまうと、今度は民家の間の狭い路地を伝って山越えをするはめに陥ることが度々です。

この山越えがまた斜度 20% 近い急坂で構成されていたり、異常に長い屈曲路を通ることになったりするので侮れません。

半島地形だけに逃げ場がないのです。

東京圏からのアクセスが良く、景観の美しさは息を呑むほどなので、入門者でも訪れる気持ちは理解できるものの、道路環境の劣悪さと交通量を考えると、実は国内のサイクリングスポットの中でも指折りの過酷な環境であることに違いありません。

少なくとも私は人通りの多い週末の日中には絶対に走りたくありません。

まさにこれから混雑が始まろうとしている対向車線を横目に、そこを走る彼等の休日が少しでも良いものとなることを祈りつつ、道路がまだ渋滞で埋まらない間に一足先に引き上げます。


ここまでの走行距離は約 150km にして獲得標高は 1,050m 超、前半に飛ばしたせいで消費カロリーは約 5,000kcal に迫ろうとしています。

長らく自転車から離れていたせいか、実際の数値よりも疲労が著しく、珍しく1ライド中に2度も休憩を入れました。

高級グループセットを載せたフラッグシップでは駐輪を躊躇してしまうところでも、クロモリのエントリーモデルなら気兼ねなく何処にでも休憩できます。

200km を超えて帰宅した時には、肩と肘が痺れるほどに限界を感じます。

長距離は長距離の走り方を守りながら、定期的に走りに行ってないと駄目ですね。

台風一過の荒川を覆う泥と風

日本各地に大雨をもたらした台風21号と22号。

私の住んでいる東京都でも河川が増水して交通機関に影響が出たと聞いています。

台風の直撃を避けるような形で新潟県や静岡県への出張が重なったので、私自身は実感はしていないのですが、風に飛ばされて道路上に転がるゴミ箱の蓋などを見るたび、その風雨の強さを意識させられます。

嵐は去って増水した川の水は引いても、強風は直ぐには収まりません。

荒川の河川敷では冬の恒常的な北風よりも強い横風が突発的に吹き付けて、飛行中の小鳥が風に流されてバランスを崩す様子などが見られます。


サイクリングロードまで完全に水が引いていて、舗装路が綺麗に見えるところがほとんどなのですが、一部の区間は泥に埋まっていたり、水溜まりに浸かっていたりして自転車で走行するには危険を感じます。

特に泥濘んでいるところを避けようとしてブレーキをかけるとスリップしてハンドルを持っていかれるので、水溜まりの中では絶対にブレーキレバーを引いてはいけません。

自転車にとってはグレーチングや雪と同様に危険です。


上述の強風と路面の悪さとが相まって、通常よりもバランスを崩しやすくなっているので神経を使います。

自転車は向かい風では進みませんし、横風ではハンドルを取られますし、追い風では落車しそうになるほど急加速します。

こういう時は重心を低く落として車体を安定させます。




そうして風や路面に注意を向けて泥や水溜まりを避けながら堤防側を走行していても、泥や砂を巻き込むことは避けられません。


気づいた頃には手遅れなほどにホイールやドライブトレインが泥で汚れてしまいます。

駆動系は諦めるとしてもホイールリムのブレーキ面だけは走行に支障が出るので、定期的に側溝に溜まった水で泥を洗い流します。



せっかくの晴天の振替休日ですが、向かい風や横風が強くて思うように進まない割に止めどなく汚れが増えていくので、埼玉県との都県境で止む無く折り返すことを決めました。

台風一過には展望が良くなるので、その時を狙って山に登る人もいますが、倒木や飛来物や落下物 (とくに落石と枝) で道路環境が読めないこと、また土砂災害の危険性があることから、私は基本的には山には向かいません。

そこで平地の広めのサイクリングロードを訪れてみたのですが、こちらも風が止むまでは為す術もないことを体感しました。

Android 初心者がフラグメントを使う話

Android アプリ開発の入門書を手に取ると、まず画面の作成に始まり、必要な部品を追加してメソッドを実装し、他の画面への遷移へと順に進む方針で書かれていることが一般的です。

そこでは基本的にアクティビティ (Activity) というコンポーネントを使用することを前提に話が進みます。

アクティビティは私のような初心者にも直感的に理解しやすく、書籍などの情報量も多いので、当然と言えば当然なのかもしれません。

一方で現在の Android アプリ開発では、入門書の例のようにアクティビティをふんだんに用いて実装を行うのではなく、より小さなフラグメント (Fragment) というコンポーネントを利用して、個々のアクティビティの役割を少なくする考えが主流になっています。

その背景にはアクティビティの役割が増えすぎて肥大化していたことや、異なる画面の大きさを持つ多くの機器への対応などが挙げられていますが、本題ではない上に長くなるので割愛します。

重要なことは、一般的な Android アプリ開発では多用されているフラグメントについて、アプリ開発の入門段階では使い方を知る術が限られていることです。

たとえインターネット上には豊富に情報があったとしても、知らないものは調べられないのです。




フラグメントを使用するとタブの切り替えによる画面表示の変更などを簡単に実装できます。

それどころか、入門書で作成しているサンプルアプリではアクティビティほど多用な機能は必要ない場合も多いので、フラグメントのみで画面遷移を実現できる場合も少なくありません。

フラグメントの簡単な使用方法はアクティビティ同様に、Java ファイルと XML ファイルを用意してアクティビティに追加してあげることです。

例えば Java ファイルを FooFragment.java として、その内容を以下のようにしてやれば、他に必要なことは2点のみです。

public class FooFragment extends Fragment {
    /* 省略 */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_foo, container, false);
        // view.findViewById() などで何かする場合にはここに実装
        return view;
    }
}

1点目はコード中の R.layout.fragment_foo で参照されている XML ファイル fragment_foo.xml を作成してあげること。

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="info.femoghalvfems.sample.FooFragment">
    <!-- 省略 -->
</android.support.constraint.ConstraintLayout>

もう1点目は作成したフラグメントをアクティビティに追加してあげることです。

public class MainActivity extends FragmentActivity
        implements FooFragment.OnFragmentInteractionListener
{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FooFragment fragment = new FooFragment();
        FragmentTransaction transaction =
        getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.layout_activity_main, fragment);
        transaction.commit();
    }
}

この時、追加するフラグメントの OnFragmentInteractionListener を実装してあげないと InflateException を吐いてアプリが落ちますので、忘れずに実装してください。

InflateException は他のエラーと同様に Android Monitor の logcat から確認できます。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: info.femoghalvfems.sample, PID: 13994
                                                                                      java.lang.RuntimeException: Unable to start activity ComponentInfo{info.femoghlavfems.sample/info.femoghalvfems.sample.MainActivity}: android.view.InflateException: Binary XML file line #12:
Binary XML file line #12: Error inflating class fragment
### 省略 ###
Caused by: java.lang.RuntimeException:
info.femoghlavfems.sample.MainActivity@87ac4dd must implement OnFragmentInteractionListener

これでうまくビルドに成功すれば、アプリの立ち上げ画面からフラグメントのレイアウトを表示するようになります。

レイアウトを切り替えるにはフラグメントから FragmentManager を利用します。

public class FooFragment extends Fragment implements View.OnClickListener {
    /* 省略 */
    @Override
    public void onClick(View v) {
        FragmentManager manager = getActivity().getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.layout_activity_main,
        BarFragment.newInstance("", "")).addToBackStack(null).commit();
    }
}

この時に忘れてはならないのは、追加されるアクティビティ (ここでは MainActivity) に追加するフラグメント (ここでは BarFragment) の OnFragmentInteractionListener を追加実装してあげることです。

このようにアクティビティと比較するとやや煩雑になってしまいますが、入門書で作成したサンプルアプリを使ってアクティビティからフラグメントを使用した構成に自分でコードを書き換えていくと、アプリ開発についての理解が深まって良い勉強になります。

そしてあまり入門書では触れられていない、FragmentTabHost を用いたタブの切り替えも簡単に行えるようになる点も見逃せません。