本当は怖い情報科学

とあるHPC屋の趣味&実益ブログ

ドイツに旅行に行ってきたので鉄道の乗り方をまとめました

f:id:keisukefukuda:20160922161838j:plain

先日、旅行でドイツに行ってきました。普段のブログの趣旨とは違いますが、せっかくなので自分用のメモがてら役に立つと思われる情報をまとめておきたいと思います。 今回は、ドイツの鉄道についてです。

ドイツの鉄道の構成

ドイツは鉄道大国として知られています。その中でも最大の企業がDB(ドイチェ・バーン:ドイツ鉄道)です。 これは日本で言うJRで、ドイツ全土に鉄道網を持っている巨大企業です。中〜長距離列車は、ほぼ全てがDBによって運行されています。そして、各大都市圏にはローカル線を運行する地域鉄道会社があります。しかし、主に列車の種別で区別するので個別の会社については意識することはないと思います。

列車の種類

列車の種類は非常にわかりやすく分類されています。 これらの区分を全部覚える必要はほとんどありません。後述するユーレイルパス/ジャーマンレイルパスを使って移動する場合には、

  • U-Bahnと路面電車だけは乗れない
  • ICE-Sprinterと寝台列車は追加で予約が必須

と覚えておけばよいでしょう。特に、ICE SprinterはDBアプリでも検索に出てきてしまうので、予約をとるのでない限り無視しないといけません。 下の表が、列車の種類の一覧表です。おおまかに距離が長い順に並んでいます。

名称 正式名称 レイルパスで乗れるか
ICE Inter City Express
ICE Sprinter ○※
IC Inter City
IRE Inter Region Express
RE Regional Express
RB Regional Bahn
S-Bahn
U-Bahn
路面電車
CNL City Night Line:寝台列車 ○※
EC EuroCity

※追加で予約が必要です。

それ以外にも細かい種類がいろいろあるようですが、ほとんど目にする機会はないでしょう。地球の歩き方 ヨーロッパ鉄道の旅 ドイツに詳しい解説があります。

ユーレイルパス・ジャーマンレイルパス

旅行者の間では有名ですが、ユーレイルパスもしくはジャーマンレイルパスを使うと、ドイツ国内の鉄道が割安に乗り放題になります。 これを使わない手はありません。

購入の仕方ですが、日本国内に代理店が多数ありますので、インターネットを通じて購入が可能です。 (現地でも購入が可能らしいですが、日本で買っていくほうが安全でしょう。) 「ジャーマンレイルパス」で検索すれば、いくらでも販売の情報が出てきます。

注意点としては、

  • 旅行の日程を検討して、チケットの種類を注意深く選ぶ
  • 手数料や送料も加算して、一番安い業者を選ぶ

ということでしょうか。「最安値」と書いてあっても、送料や手数料が加算される場合もあるので、合計額で比較しましょう。

ちなみに、日本にも外国人旅行者向けの「Japan Rail Pass」というものがあります。日本人には縁がありませんが。

チケットの種類について:

ジャーマンレイルパスの種類は複数あり、それぞれ値段が異なります。後述するDBアプリを利用して、事前に移動の日数と料金と概算し、最も得になるように買うのが良いでしょう。

パスには、

  • 一等もしくは二等
  • 日数(3日間、5日間、7日間、10日、15日)
  • 連続使用タイプと、1日毎の使用(フレキシー)タイプ
  • 一人用、二人用

のような違いがあります。これらの組み合わせによってパスの種類が決まります。

今回は二人連れでの旅でしたので、特別キャンペーン中だった「連続7日間・二人用」を購入しました。合計で約4万円でしたので、一人あたり2万円、1日あたり3000円程度となり、かなり割安でした(多い日で、8000円分くらい乗っていた)

一等か二等か、というのが問題ですが、殆どの人は二等で問題無いと思います、一等のメリットは、

  • 寝台特急(CNL)に乗るときに一等個室が利用できる
  • 一部のICEで混雑する場合があるので、その場合は一等のほうが座れる確率が高い

というくらいでしょうか。一等は、イメージとしては日本で言うグリーン車だと思えばいいと思います。 また、二等でも電源等が備え付けられている車両が多いようです。

f:id:keisukefukuda:20161008160403j:plain

バリデーション

日本出国前には、特にすることはありません。ドイツに入国後、最初に鉄道に乗る前に「バリデーション」と呼ばれる作業をする 必要があります。

フランクフルト空港の場合は、空港から駅へ向かう途中の左手にDBのオフィスがあります。写真を撮り忘れたので、詳細は 非常に丁寧な記録を書いてくださっている人がいるので参考にしてください。列車移動(フランクフルト空港~コブレンツ) : 世界遺産を100%楽しもう!

フレキシータイプのパスを使う場合は、自分で日付を記入しましょう。これで準備は完了です。 列車を利用する際は常にレイルパスを携帯するように注意しましょう。

DBアプリの使い方

列車移動の強い味方(というか必須)なのが、DBアプリです。

言語設定を英語にしてしまえば、直感的に使えるので説明は不要でしょう。検索をすれば、

  • 時間
  • 発車プラットフォーム
  • 料金(DB管轄下の場合のみ)

などが表示されます。

f:id:keisukefukuda:20161008163659p:plain

ちょっとトリッキーなのは、ドイツ語特有のアルファベット(いわゆるウムラウトとエスツェット)の入力です。これは、

文字 代替
ä ae
ö oe
ü ue
ß ss

のように代替できます。例えば、Köln(ケルン)は、「koeln」と入力することで認識されます。これは覚えておいたほうが良いでしょう。

乗り方(DBの列車)

DBアプリで検索できれば、あとは駅に行って指定されたホームで待つだけです。ドイツの鉄道は、改札がありません。小さな駅では市街からホームまでが直結なんてこともあります。

改札がない代わりに、後述する検札があります。不正乗車にはキツーイ罰則があるそうです。

大きな駅であれば、ホームの電光掲示板に列車の情報が表示されています。一等車と二等車を間違えないように乗りましょう。 下の画像で、列車の名前、目的地、一等車/二等車/食堂車の編成と乗車位置A〜Gが示されているのがわかりますね。

多くの場合、列車の側面に等級を示す数字が書いてあるので間違えることはないと思います。

予約席について

座席の上に、電光掲示板もしくは紙のラベルで、駅の区間が示されていることがあります。 これは、この区間で予約がされていますよという意味なので、自分が予約していない場合はそれ以外の席に座りましょう。

乗り方(U-Bahn)

今回宿泊したケルン近郊のホテルは、最寄りにU-Bahnの駅しかありませんでした。なので、ケルンまでの日帰り観光では U-Bahnを利用しました。

今回は、窓口の係員の人に「To Köln, 2 persons, roundtrip tickets, please」といって購入したので、 詳細な買い方を調べていません。二人分・往復で4枚綴りの回数券を発行してくれました。

車内に乗車したら、チケットキャンセラーと呼ばれる機械がありますので、それで切符に打刻をします。 これがかなり曲者で、バーコードのある面を上に向けて差し込むと打刻されました。 (周囲にいたおじさんに教えてもらいました…)

f:id:keisukefukuda:20161008163322j:plain (画像引用:capl@washjeff.edu より)

切符の種類・料金や買い方については、こちらのブログに詳しく書かれているので参考になると思います。 切符の買い方・使い方 - ドイツでハンドメイドライフ。また、都市によっては一日乗車券が整備されているところもあるので、よく調べましょう。

乗り方(バス)

バスにも何度か乗車しました。バスは前からでも後ろからでも乗れますが、チケットがない場合は前から乗車し、ドライバーに話しかけて チケットを購入しましょう。

検札について

ドイツの鉄道では、改札がない代わりに、車内で車掌さんが検札に回ってきます。 今回の旅行では、一週間の間に、ICの乗車中に2回ほど検札されました。 検札の際は、ジャーマンレイルパスを見せればOKです。(一応、パスポートも必要ということになってはいるが、求められませんでした)

その他

自転車も車内に持ち込み可で、列車によっては自転車積み込み用の車両がついている場合もあります。 席は折りたたみ式となっており、自転車固定用のケーブルが設置されています。

f:id:keisukefukuda:20160925133352j:plain

中にはこんな人も。 f:id:keisukefukuda:20160925134342j:plain

Linux上での計算系プログラムの性能計測のための知識とツールまとめ

アプリケーションの性能最適化ツール等のまとめとリンク集です.随時更新していきたいと思っています.

私の専門分野の関係上,計算をガリガリするプログラムを対象としたものが多く,通信やWebサーバーのチューニング系は少なめです.

TL;DR(時間のない人へ)

とりあえずこの2つだけ嫁

Velocity 2015 linux perf tools

Linux Performance Profiling and Monitoring

まとめ・ノウハウ系資料

システムのパフォーマンスを改善する上で,どのコマンド/ツールをどう使えばよいか, どのようなアプローチが有効か,などの説明をしているページや動画等をまとめています.

Brendan Gregg氏の資料

Brendan Gregg氏は,perf-tools,やFlame Graphというツールの開発者であり,Netflixのエンジニアです.性能測定関係の情報を探していると,かならずGregg氏の資料にぶつかります.

4つ目のページには,OS(Linux)の構成要素と対応する計測ツールが図にまとめられています(下図は縮小したもの).これを見ればこのエントリいらないんじゃないかな(提案

f:id:keisukefukuda:20160830165959p:plain

その他

背景知識・前提知識・お勉強編(用語がわからない人へ)

個別コマンド・ツール編

上記「ノウハウ編」で登場したコマンドの個別の使い方や結果の解釈の仕方などを説明したページへのリンクを集めました.おおまかに,高レベル(OSレベル)→低レベル(CPU命令レベル)の順に並んでいます.リンクがないところは書いてる途中ですが,個別のツールについてはググればすぐに資料が見つかるので不要かもしれません.

std::tupleとstd::tieを使って複数の配列を一緒にソートする(配列の構造体 SoA のソート)

互いに関連付けられた複数の配列を一緒にソートしたい場合があります.

// SoAの例
std::vector<int> student_ids;
std::vector<std::string> names;
std::vector<int> math_scores;

// AoSの例
struct Student {
  int id;
  std::string name;
  int math_score
};

専門的には,SoA(Structure of Array:配列の構造体)と呼びます(かならずしも構造体とはなっていなくても).一方,普通に構造体やクラスの配列になっている場合はAoS(Array of Structure:構造体の配列)と呼ばれます.

さて,このSoAのデータ構造をソートしたいと思います.上の例で言いうと,生徒番号を元に名前などのフィールドを一斉にソートしたいということです.最初からAoSを採用すれば余計な苦労はありませんが,歴史的な事情や効率の都合でSoAになっているとします.

そこで,C++11のstd::tupleを使って,SoAを内部的にAoSに変換してソートする関数を書いてみました.ポイントは,std::tieを使うとPythonの一括代入のようなことができるという点ですね.これは調べるまで知りませんでした.

template<class T, class...Args>
void TiedSort(std::vector<T> &a, std::vector<Args>&... args) {
  using tt = struct {
    T key;
    std::tuple<Args...> val;
  };
  std::vector<tt> vals(a.size());

  for (size_t i = 0; i < a.size(); i++) {
    vals[i].key = a[i];
    vals[i].val = std::make_tuple(args[i]...);
  }

  std::sort(std::begin(vals), std::end(vals), [](const tt& a, const tt& b) {
      return a.key < b.key;
    });
  
  for (size_t i = 0; i < a.size(); i++) {
    a[i] = vals[i].key;
    std::tuple<Args&...>(args[i]...) = vals[i].val;
  }
}

int main() {
  std::vector<int> student_ids = {3,2,5,1,4};
  std::vector<double> weights = {42.3, 34.6, 32.5, 51.2, 41.7};
  std::vector<double> heights = {1,1,1,1,1};
  
  TiedSort<int, double, double>(student_ids, weights, heights);
}

なお,SoAをソートする方法としては,インデックス配列を用意してそれをソートする方法(数学で言う置換:permutationを使う)方法もありますが,これだと一時領域が必要になりコピーのコストが増大するため低速でした.そのうちPAPIとかを使ってきっちり評価したいとは思いますが.

C++テンプレートテクニック 第2版

C++テンプレートテクニック 第2版

【広告】