本当は怖いHPC

HPC屋の趣味&実益ブログ

読書感想文:「コンテナ物語」モノの流れを通して世界を変えたコンテナリゼーション

コンテナ物語

コンテナ物語

この「コンテナ物語」は,現代では当たり前になった「コンテナ輸送」がどのように開発され広まったのかという歴史を記述した本だ.コンテナリゼーションというのは,一つのイノベーションである.本書は,単なる運送業の歴史にとどまらず,イノベーションがどのように社会に受け入れられ,社会を変革していくのかという記録でもある.綿密な調査と大量の資料に裏打ちされて,歴史の読み物としても,ビジネス書としても価値が高いものになっていると思う.

取り上げられているトピックは,コンテナの過去〜現在〜未来である.

  • コンテナがどのように開発され,どのような経緯を経て広まった歴史
  • コンテナが広く普及した後の,供給過剰による苦難の時代
  • 開発と普及の過程を通して,コンテナがどのように世界を変えたか?

ビジネス的視点から見たコンテナ輸送業の本質と,苦難の歴史

コンテナは,ビジネス的な観点からみれば資本集約型の巨大な固定資産産業である.

コンテナ輸送サービスというものは,スタートするその瞬間から大規模にやらねばならない.貨物を求めてあちこちの港に立ち寄りなんとか儲けを出していた在来線とはわけがちがうのである.巨額の資本を一気に投下して十分な数の船とコンテナをそろえ,大型校を結ぶ定期航路に高頻度のサービスを実現しないと勝ち目はない.

海運会社はポラロイドやゼロックスではない.

船会社が売るのは,基本的には小麦や大豆や鉱石や鋼鉄と同じコモディティなのだ.外的要因の影響を強く受け,売上森栄喜率も景気の変動やライバルの動向に左右される.

コンテナの歴史は苦難の連続だった.コンテナ黎明期の海運・陸運・鉄道会社の運賃は政府の規制によって統制されていたし,埠頭での荷役作業が減ることを恐れた港湾労働組合は激しい抵抗を見せた.それらを乗り越えた後も,供給過剰による運賃の下落,オイルショックによる燃料費の高騰と下落が襲う.その中で,多くの会社が倒産・合併を繰り返しながらも,徐々に現代的なコンテナ輸送システムが整備されていく.

一人の起業家マルコム・マクリーンを中心としたコンテナリゼーションの歴史

実は,コンテナの歴史というのは,マルコム・マクリーンという一人の起業家の物語でもあった.1913年にノース・カロライナ州の田舎で生まれたマクリーンは,ガソリンの転売業からマクリーン輸送を興し,その後陸運会社として発展させていく.そのマクリーンが,あるときに規格サイズの箱を使った輸送,特に船舶・鉄道・トラックをシームレスに接続したインターモーダル輸送を着想し,海運業に進出する.

マクリーンの目からみれば鉄道もトラックも船もモノを運ぶという点では同じである.だったら,シーランドが貨車を走らせて何が悪いのだろう

しかし,上で書いたように,その構想は幾多の苦難に直面しなかなか実現しなかった.一時は,起業家と経営者という2つの役割の違いに直面し,自らが起こした会社を去っている.その後海運業界に復帰するものの,最終的には石油価格の読み違いからくる船の発注戦略の失敗によって業界を去ることになった.

最大の顧客:アメリカ海軍とベトナム戦争

本書で特に圧巻なのは,1960年台,コンテナの最大顧客となる「アメリカ軍」の登場である.

一九六五年冬,米政府はベトナムへの緊急増派を開始した.そして,たちまち物資補給の混乱が始まる.米軍史上で最悪の混乱だったが,これを解決したのがコンテナリゼーションだった.

もともと「ロジスティクス」というのは「兵站」を意味する軍隊用語だが,民間でコンテナが広まりつつあった1965年の段階では米軍の兵站戦略にコンテナは採用されていなかった.その時に米軍にコンテナの導入を働きかけたのも,またマルコム・マクリーンであった.

コンテナリゼーションによって米軍のベトナムへの物資輸送は劇的に改善し,米軍はコンテナリゼーションの熱烈な支持者となる.なによりすごいのは,米軍の担当者がコンテナの本質を見抜いていたことだ.

「コンテナは単に輸送手段の一種と考えるべきではない」とベッソンは一九七〇年に議会で力説している.「コンテナリゼーションはシステムである.コンテナの全面活用を念頭において設計されたロジスティクス・システムで使われて始めて,コンテナの効果は最大化される」.これは,民間の荷主がようやく気づき始めた事実であった.

これは,今でも有効な教訓だろう.情報システムでもよく言われることだ.何らかの情報管理システムを導入する際に,それを単なる便利なツールとみなしたのではうまくいかないことが多い.システムを前提にして全体の情報と意思決定の流れを再設計しないと,システムの効果を最大限に引き出すことはできない.

コンテナが激変させた世界と,未来

現代のグローバル・サプライチェーンは,コンテナなしでは有り得なかった.従来は,港に近いところに工場を立地させるのが当然だったが,コンテナリゼーション以後は設備の整った巨大港への道路が整備されていることが重要で,単純な距離というものは意味を成さなくなった.従来の港を中心とした工業都市は衰退し,港の拡張競争とともに,都市の勢力図を大きく塗り替えた.

九〇年台後半に先進各国で物価が下がったのは安価な輸入品によるところが大きく,三〇年におよぶインフレ基調に終止符が打たれた.

このように,コンテナリゼーションは経済のグローバリゼーションの中心的役割を果たし,経済そのものを変貌させた.

経済と地理のこの新しい関係のおかげで,これまで国内しか見ていなかった企業も国外に目を向けることが容易になった.

地元市場で満足している控えめなメーカーであっても,好むと好まざるとにかかわらず国際競争に巻き込まれる.なぜなら,グローバル市場の方から押し寄せてくるからだ.消費地に近いことだけが取り柄の高コスト体質のメーカーにとって,もはや輸送費は防護壁にはなってくれない.

コンテナは,テロや不法移民,麻薬取引,トラックによる環境汚染といった問題を抱えながらも,社会の発展とともに,より大規模に,より効率的に発達していくだろう.

書籍情報:コンテナ物語

【スポンサーリンク】

mpirunとmpiexecの違いは何か

MPIプログラムを起動する方法として,mpirunmpiexecがあります.プログラムを普通に起動するだけなら,どちらのコマンドでも困ることはありません.実行するノードとプロセス数の指定をする程度なら,どの実装のどちらのコマンドを使っても大差ないからです.

初期のMPI標準(MPI-1)には,プログラムの起動方法は言及されていませんでした.よって,それぞれのMPI実装はmpirunと呼ばれるコマンドを実装しましたが,コマンドラインオプションはそれぞれ異なるものでした.

これは不便だということで、MPI-2においてmpiexecが標準として定められました.現在の標準である MPI-3.1 では,「8.8 Portable MPI Process Startup」でmpiexecコマンドが述べられています.

標準なのだから黙ってmpiexecを使えばいいのですが,残念ながら話はそこまで単純ではありません.現実には,mpiexecに定められているのは最大公約数的なオプションだけで,詳細は実装に任されています.

オプション 意味
-n プロセス数
-host MPIプログラムを実行するホストが指定されたファイル(書式は実装依存)
-arch アーキテクチャ名.よくわからん
-wdir プロセスが実行される実行ディレクトリ名
-file 実行に関する追加情報が書かれたファイルを指定.中身は実装依存(なんじゃそりゃ)
-sort MPI_COMM_SPAWNなどが作れるプロセス数を指定.詳細省略

標準なので仕方ないのですが,これではいかにも物足りません.

現実的に重要なのは,プロセスのリソースへのマッピングバインディング,それから環境変数の指定です.MPI実装の事実上の二強である Open MPI と Mpich では,--map-by--bind-to-x-genvなどのオプションが実装されていますが,それぞれ詳細は異なります.これらについてのまとめは非常に少ないので,時間を見つけてまとめてみたいと思います.

余談だが,世の中の殆どのMPI実装は Open MPIか Mpichの派生で、mpichの派生としては mvapich, Intel MPI,またOpen MPIの派生としてはFujitsu MPIなどがあります.この2つのmpiexecの文法を身につければ怖くないと言えるでしょう.

MPI並列プログラミング

MPI並列プログラミング

関数プログラミング入門・一人読書会 (4)

関数プログラミング入門」の練習問題をやっていきます

今回は1.5.1〜1.5.2

1.5.1

フィボナッチ数を計算する関数fibを定義する

fib :: Integer -> Integer
fib n
  | n <  0 = error "fib: n must be >= 0"
  | n == 0 = 0
  | n == 1 = 1
  | otherwise = fib (n - 1) + fib (n - 2)

main :: IO()
main = putStrLn $ show $ (fib 20) == 6765

1.5.2

整数の絶対値を返す関数absを定義せよ

abs' :: Integer -> Integer
abs' n
  | n < 0 = -n
  | otherwise = n

main :: IO()
main = do
  putStrLn $ show $ (abs'   0) ==  0
  putStrLn $ show $ (abs'  20) == 20
  putStrLn $ show $ (abs' (-20)) == 20

関数プログラミング入門 ―Haskellで学ぶ原理と技法―

関数プログラミング入門 ―Haskellで学ぶ原理と技法―

【広告】