ドイツに旅行に行ってきたので鉄道の乗り方をまとめました
先日、旅行でドイツに行ってきました。普段のブログの趣旨とは違いますが、せっかくなので自分用のメモがてら役に立つと思われる情報をまとめておきたいと思います。 今回は、ドイツの鉄道についてです。
ドイツの鉄道の構成
ドイツは鉄道大国として知られています。その中でも最大の企業が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で混雑する場合があるので、その場合は一等のほうが座れる確率が高い
というくらいでしょうか。一等は、イメージとしては日本で言うグリーン車だと思えばいいと思います。 また、二等でも電源等が備え付けられている車両が多いようです。
バリデーション
日本出国前には、特にすることはありません。ドイツに入国後、最初に鉄道に乗る前に「バリデーション」と呼ばれる作業をする 必要があります。
フランクフルト空港の場合は、空港から駅へ向かう途中の左手にDBのオフィスがあります。写真を撮り忘れたので、詳細は 非常に丁寧な記録を書いてくださっている人がいるので参考にしてください。列車移動(フランクフルト空港~コブレンツ) : 世界遺産を100%楽しもう!
フレキシータイプのパスを使う場合は、自分で日付を記入しましょう。これで準備は完了です。 列車を利用する際は常にレイルパスを携帯するように注意しましょう。
DBアプリの使い方
列車移動の強い味方(というか必須)なのが、DBアプリです。
言語設定を英語にしてしまえば、直感的に使えるので説明は不要でしょう。検索をすれば、
- 時間
- 発車プラットフォーム
- 料金(DB管轄下の場合のみ)
などが表示されます。
ちょっとトリッキーなのは、ドイツ語特有のアルファベット(いわゆるウムラウトとエスツェット)の入力です。これは、
文字 | 代替 |
---|---|
ä | 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枚綴りの回数券を発行してくれました。
車内に乗車したら、チケットキャンセラーと呼ばれる機械がありますので、それで切符に打刻をします。 これがかなり曲者で、バーコードのある面を上に向けて差し込むと打刻されました。 (周囲にいたおじさんに教えてもらいました…)
(画像引用:capl@washjeff.edu より)
切符の種類・料金や買い方については、こちらのブログに詳しく書かれているので参考になると思います。 切符の買い方・使い方 - ドイツでハンドメイドライフ。また、都市によっては一日乗車券が整備されているところもあるので、よく調べましょう。
乗り方(バス)
バスにも何度か乗車しました。バスは前からでも後ろからでも乗れますが、チケットがない場合は前から乗車し、ドライバーに話しかけて チケットを購入しましょう。
検札について
ドイツの鉄道では、改札がない代わりに、車内で車掌さんが検札に回ってきます。 今回の旅行では、一週間の間に、ICの乗車中に2回ほど検札されました。 検札の際は、ジャーマンレイルパスを見せればOKです。(一応、パスポートも必要ということになってはいるが、求められませんでした)
その他
自転車も車内に持ち込み可で、列車によっては自転車積み込み用の車両がついている場合もあります。 席は折りたたみ式となっており、自転車固定用のケーブルが設置されています。
中にはこんな人も。
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氏の資料にぶつかります.
- Linux Performance Analysis: New Tools and Old Secrets
- USENIX/LISA'14 というカンファレンスで発表された資料と講演ビデオへのリンク
- The Netflix Tech Blog: Linux Performance Analysis in 60,000 Milliseconds
- いろんなツールのまとめです.Netflix社のブログですが,書いているのはGregg氏
- Velocity 2015 linux perf tools
- どのように性能チューニングを進めていけばいいのか,という方法論が述べられ,その後に各ツールの使い方が述べられていきます.すさまじい数のツールの紹介
- Linux Performance
- Gregg氏自身による資料のまとめとポインタ
4つ目のページには,OS(Linux)の構成要素と対応する計測ツールが図にまとめられています(下図は縮小したもの).これを見ればこのエントリいらないんじゃないかな(提案
その他
- 書籍
- Performance Tuning Guide
- Redhat社のマニュアル.英語だし量が多いので気合が必要
- Performance Tuning Guide
- Redhat社のマニュアル第二弾
- Linux Performance and Tuning Guidelines (PDF, 約150ページ)
- Lenovo(旧IBM)の資料で,Linuxの仕組みの解説からチューニングの方法まで,網羅的に書かれたドキュメントです
- Extreme Linux Performance Monitoring and Tuning
- 性能を阻害する要因にはどのようなものがあるのか,Linuxのプロセス管理の方法の整理.
vmstat
,mpstat
,top
,ps
などのコマンドの出力をどう解釈するか.
- 性能を阻害する要因にはどのようなものがあるのか,Linuxのプロセス管理の方法の整理.
- Measuring Execution Time and Real-time Performance: Part 1 | Dr Dobb's
- 組み込み・リアルタイムシステムを対象とした性能計測.計測に使う関数の正確度(accuracy)解像度(Resolution)の話,何を計測するためにどのツールを使うべきか.
- キーワード:timeコマンド,gprof,clock(),
- 大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog
- 続編→ ”私の環境で”大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog
- 続続編→ プロセスのランキュー待ち時間とI/O待ち時間を調べる - ablog
awk file
に比べてcat file|awk
の方が速いという現象が発生した際の原因追跡をされた記事です.データがパイプによって渡されていることによって,間にバッファが作られ,catのIOとawkの計算の間でオーバーラップが行われるので速くなるのでは?という仮説をもとに検証されています.- 言及されているツール:/proc/sys/vm, strace, perf, Flame Graphs, top, taskset,
- How profilers lie: the cases of gprof and KCachegrind
- プロファイラというものは,常に正しい測定結果を返すわけではありません.gprofなどのプロファイラツールが,どのような時になぜ間違うのかを説明しています.
- キーワード:callgrind, cachegrind, gprof
- Linux Performance Profiling and Monitoring
- 大量のコマンドの使い方が図や用例と主に紹介.おすすめ.
- キーワード: Sysstat, dstat, nistat, /proc, sar, sadc, top, htop, iotop, iftop, perf_events, ftrace, perf-tools, Flame Graphs
- c++ - How to determine CPU and memory consumption from inside a process? - Stack Overflow
- メモリの使用量をCプログラムから取得する方法がWindows, Linux, Macごとにまとめられています.
背景知識・前提知識・お勉強編(用語がわからない人へ)
- Latency Numbers Every Programmer Should Know · GitHub
- What every programmer should know about memory :有名論文.
- 東大の田浦先生のOSの授業資料
- 「オペレーティングシステム論」の講義資料・ノートPDF。OSのプロセス管理やメモリ管理,ファイルシステムを勉強 - 主に言語とシステム開発に関して
- OSの基礎について言及した本が何冊か:
- Help! Linux ate my RAM!
- Linux上で,「used」となっているメモリの意味.続きのページでは,実際にC言語でプログラムを書いて挙動を観察する実験.
- キーワード:free, /proc/sys/vm
個別コマンド・ツール編
上記「ノウハウ編」で登場したコマンドの個別の使い方や結果の解釈の仕方などを説明したページへのリンクを集めました.おおまかに,高レベル(OSレベル)→低レベル(CPU命令レベル)の順に並んでいます.リンクがないところは書いてる途中ですが,個別のツールについてはググればすぐに資料が見つかるので不要かもしれません.
- Broken Linux Performance Tools 2016
- たびたび登場するBrendan Greggさんの資料.各ツールの落とし穴.
- キーワード:load averageの意味,top,free,vmstat,netstat,cachestat,perf,perf_events, tcpdump, valgrind, /proc/stat の解釈の仕方など.
- free
- ps
- Virtual Threads: Understanding memory usage on Linux
- KEditというアプリケーション(KDEのメモ帳)が25MBもメモリを食っている(ように見える)のはなぜか,という話を題材に,psが表示する数値の意味を説明しています.
- Virtual Threads: Understanding memory usage on Linux
- vmstat
- /proc
- pidstat
- top/htop
- TAU, Vampir Trace, Open|Speedshop, scalasca (スパコン向け性能解析ツール)
- oprofile
- google-perftools
- perf_tools
- Flame Graph
- Valgrind / cachegrind
- RDTSC命令
- PAPI
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とかを使ってきっちり評価したいとは思いますが.
- 作者: επιστημη,高橋晶
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/04/17
- メディア: 単行本
- この商品を含むブログ (6件) を見る