2013年6月14日金曜日

jQueryの複数Version共存と無名関数

例えば,ある公開中の顧客のサイトで何かのPluginを動かしたいとする.そのPluginはjQuery1.9.1以降であれば動作するが,それ未満であった場合,動作しないことが確認されている.しかし,顧客のサイトはjQuery1.2.6が導入されており,そこですでに使用されているPluginはjQuery1.9.1では動作しないことがわかっている.次の場合,単純にjQuery1.9.1をjQuery1.2.6が読み込まれた後に読み込むと,jQuery1.9.1になってしまう.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    alert($().jquery); // 1.9.1
  </script>
</head>
</html>

サンプルファイルDL : sample1.html

この場合,jQueryの共存を行うことが出来れば,ベストな解であるといえる.その方法は次のコードを導入することで,これを可能とする.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    jQuery1_9_1 = jQuery.noConflict(true);
    alert($().jquery); // 1.2.6
    alert(jQuery1_9_1().jquery); // 1.9.1
  </script>
</head>
</html>

サンプルファイルDL : sample2.html

さて,これによって,jQueryが1.2.6と1.9.1の共存した状態になる.つまり,jQuery1.9.1の$関数をjQuery1_9_1関数に書き換えたようなイメージになる.このような場合,それぞれのVersionで動かすためにはjQuery1.2.6ならば$関数を用いて,jQuery1.9.1ならば$関数の代わりにjQuery.noConflict()関数で$関数の代わりに定義したjQuery1_9_1関数(?)を用いれば良い.しかし,このままではjQuery1.9.1を使う場合,通常ならば$(hogehoge)と書くところをjQuery1_9_1(hogehoge)と書かなければならないので,無名関数を用いてjQuery1.9.1でも$(hogehoge)とかけるようにすることができる.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    jQuery1_9_1 = jQuery.noConflict(true);
    (function($){
      alert($().jquery); // 1.2.6
    })(jQuery);
    (function($){
      alert($().jquery); // 1.9.1
    })(jQuery1_9_1);
  </script>
</head>
</html>

サンプルファイルDL : sample3.html

ある関数はjQuery1.2.6で,ある関数はjQuery1.9.1で,それぞれを定義後,自由な位置で呼び出したい場合がある.これは連想配列内でそれぞれの定義を書けば,無名関数外でも,その関数を指定したjQueryのVersionで動かすことができる.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    jQuery1_9_1 = jQuery.noConflict(true);
    (function($){
      a191 = {
        b : function(){
          return $().jquery;
        }
      }
    })(jQuery1_9_1);
    (function($){
      a126 = {
        b : function(){
          return $().jquery;
        }
      }
    })(jQuery);
    alert(a191.b()); // 1.9.1
    alert(a126.b()); // 1.2.6
  </script>
</head>
</html>

サンプルファイルDL : sample4.html

補足:無名関数とはこのような関数である.

<html>
<head>
  <script type="text/javascript">
    alert(
      (function(a){
        return a;
      })("aに入る値")
    );
  </script>
</head>
</html>

サンプルファイルDL : sample5.html

この無名関数を理解すると,$関数がなぜ無名関数を使うと jQuery1.2.6 が jQuery1.9.1 に変わったのかが良く分かる.

2013年1月26日土曜日

モンテカルロ法による円周率推定(R言語実装)

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170.............

上の数字は円周率と呼ばれるものであるが,円周率π,円周長l,直径dの時,一番簡単な円周率の定義は,
π = l/d
である.d = 1である円の場合,lがそのまま円周率の値となる.

さて,このπを確率的な方法で”推定”してみる.
一辺が1の正方形に内接する半径r=1の円の扇型を考えてみよう.
正方形自体の面積は1であり,扇型の面積は
(扇型の面積) = (πr^2)/4 = π/4
である.さて,これの面積比を取ってみる.
面積比 = (扇型の面積)/(正方形の面積) = (πr^2)/4 = π/4

次に,この正方形のどこかランダムに点をn個打つとする.そのうち,扇型の中に入った個数をmとする.このランダムに点を打つとき,扇型の中に点が打たれる確率は,
(扇型の中に点が打たれる確率) = m/n
である.この確率は,先に出した面積比と等号で結ぶことができる.
(面積比) = (扇型の中に点が打たれる確率)
π/4 = m/n
∴π = 4m/n
つまり,扇型の中に点が打たれる確率で円周率を推定することができる.この方法を「モンテカルロ法」とよび,数値積分などの計算にも利用されている.

さて,ではR言語を用いてモンテカルロ法による円周率の推定を行なってみよう.次のプログラムを用いて推定を行った.
mcPi <- function(points){
  inR <- 0 #扇型に入った数
  cols <- NULL #plot色分け用
  range <- c(0,1) #plot時の描画範囲
  x <- runif(points,0,1) #一様乱数でx座標を決定
  y <- runif(points,0,1) #一様乱数でy座標を決定
  r <- x^2+y^2 #原点から各点がどのくらい離れているか
  for(i in r){
    if(i<=1){ #もし,原点からの距離が1以下であれば扇型の中
      inR <- inR + 1
      cols <- c(cols,"red") #扇型内であれば赤色でプロット
    }else{
      cols <- c(cols,"blue") #扇型外であれば青色でプロット
    }
  }
  return_data <- 4*inR/points #円周率計算
  plot(x,y,col=cols,xlim=range,ylim=range,pch=20,main="Estimate pi value with Monte Carlo method.",sub=sprintf("%s points. pi = %1.6f",points, return_data))
  return(return_data)
}
このmcPi()は引数に応じて点を打っていき,円周率を計算するプログラムである.
実行例:
mcPi(10000) #10000回点を打って円周率を推定

結果例:
[1] 3.1516 ←これが推定された円周率の値.毎回違う値になる.

次のような画像も一緒に出力される.

当然のことだが,打つ点が多ければ多いほどよい精度になりやすい(πの値により近づきやすくなる).

2013年1月19日土曜日

Javascriptのクロージャにおける変数のスコープ

Tips的なネタを一つ.
クロージャとは”関数の中の関数”という意味で見てほしい.
Javascriptのクロージャの引数をいちいち指定するのは書く方も面倒くさい.そこで気になるのはクロージャにおける変数のスコープである.それを説明するため,次のようなJavascriptコードを書いた.

message = "グローバル";
window.alert(message);

function test1(message){
  window.alert(message);//"グローバル"
  function test2(){
    window.alert(message);//"グローバル"
  }
  test2();
  
  var message = "ローカル1";
  window.alert(message);//"ローカル1"
  
  function test3(){
    var message = "ローカル2";
    window.alert(message);//"ローカル2"
  }
  test3();
  
  window.alert(message);//"ローカル1"
}
test1(message);

window.alert(message);//"グローバル"




実際に実行して遷移を見るとよく分かるはず.
簡単に解説すると,関数の引数は関数の中のグローバル変数になり,クロージャの変数に自動的に代入される.クロージャの中で変数を新たに代入すればクロージャの中のグローバル変数になり,クロージャの外の変数には影響を及ぼさない.
よくコードを追いながらアラートボックスのvalueを見てみてほしい.

2012年12月27日木曜日

トレス台が無い貴方へ贈るiPad活用術

「ああ!トレス台が必要なのにトレス台持ってないや!!!どうしよう!!!」というのはおそらく人生の中でも必ず起こりえる事態であるが,安くても5千円はくだらないトレス台にお金はあまり使いたくないし,そもそも今必要という人も多い.そもそもトレス台は何処にでも売っているわけではないので手軽にトレス台代わりになるものは無いかと思うものである.そこで,いまや皆様のご家庭に必ずあるApple社製のハイテク機器iPadを利用してトレス台として使う方法をご紹介する.まだiPadを持っていない輩はいますぐ最寄りのヨドバシなりビックなどの家電量販店やApple Storeに駆け込みiPadを購入して欲しい.今ならたった¥28,800~(Apple Store 2012/12/27現在)というお手頃価格で買える.(トレス台よりも高いというツッコミは受け付けない)

トレス台としてiPadを活用する方法は以下のとおりである.

  1. まずiPadを入手する.
    手段は問わない.
  2. App Storeに行ってJavoidの「フリーライト」をダウンロードする.
    ライト系のアプリならばどれでもいいが,なるべく単機能のアプリケーションがオススメ.
  3. iPadの設定を変更する.
    自動で切れないよう,自動ロックを切り,誤作動防止の為,マルチタスク用ジェスチャをオフにする.また,画面を一番明るくする.(赤枠を変更)
  4. 電源を接続する
    画面が明るいままなのでバッテリー消費が激しい.電源を接続しておくことをおすすめする.
  5. 適当な白い(半)透明のファイルなりアクリル板なり用意する.
    そのままでは手で触った時にiPadが誤作動を起こす.なるべく防ぐため厚めの透明な板状のものを敷く.写真ではリングファイルを用いているが,そのままでは高さが足りないので本などを敷いて高さを調節するなど,なるべく透明な板とiPadが密着するようにする.
  6. 完成

どのくらい明るいか?

実際に印刷用紙で検証してみたので画像をみて各々で判断して欲しいが,数枚なら普通に使えるレベルではないかとおもわれる.ただし,部屋の電気をなるべく消して利用しないとダメなようである.

注意しなければならないのは,iPadはガラス面なので力を入れすぎて画面を割らない様にすることである.多少力を入れてもビクともしないが気をつけておいた方がいい.

2012年11月17日土曜日

RのdoMCによる並列計算(マルチコア化)のメモ

R言語で計算高速化のためにマルチコアCPUで並列計算したい場合がある。並列計算と聞いて抵抗を感じる人も多いが、Rに関しての並列計算プログラムは容易に組むことが可能だ。
ではどうやって並列計算のコードを組むのか、モンティ・ホール問題の試行を計算するプログラムを元にやってみる。

モンティ・ホール問題(Monty Hall problem)とはアメリカのテレビ番組「Let's make a deal」(1984-1986)で行われたゲームに関する確率論の問題である。ゲームの内容は次のとおりである。
      
  1. 3つのドア (A, B, C) に(景品、ヤギ、ヤギ)がランダムに入っている。
  2.   
  3. プレイヤーはドアを1つ選ぶ。
  4.   
  5. モンティは残りのドアのうち1つを必ず開ける。
  6.   
  7. モンティの開けるドアは、必ずヤギの入っているドアである。
  8.   
  9. モンティはプレーヤーにドアを選びなおしてよいと必ず言う。
(モンティ・ホール問題及びそのゲーム内容に関する引用:モンティ・ホール問題 - Wikipedia)

このルールに則り、ゲームを再現するプログラムを書いた。
montyHall <- function(changeAns = FALSE){
  doorNum <- 1:3
  rightAns <- sample(doorNum, size = 1)
  playerChoice <- sample(doorNum, size = 1)
  montyChoice <- doorNum[doorNum != rightAns]
  montyChoice <- montyChoice[montyChoice != playerChoice]
  montyChoice <- sample(montyChoice, size = 1)
  if(changeAns){
    playerChoice <- doorNum[doorNum != playerChoice]
    playerChoice <- playerChoice[playerChoice != montyChoice]
    playerChoice <- sample(playerChoice, size = 1)
  }
  if(playerChoice == rightAns){result <- 1}else{result <- 0}
  result_data <- c(changeAns, result)
  return(result_data)
}
プログラムの便宜上、ドアの名前を(A, B, C)から(1,2,3)にしている。
また、返り値として、(選びなおす(1)か否か(0),景品か(1)否か(0))としている。
さて、これを通常のforを使った書き方でドアを選びなおす場合と選びなおさない場合をそれぞれ10万回行い、その時間を測る。コードは以下の通り
####### SC code #######
montyResult_Change <- NULL
SC_time_Change <- system.time(
  for(i in 1:repeatNum){
    montyResult_Change <- rbind(montyResult_Change, montyHall(TRUE))
  }
)

montyResult_NoChange <- NULL
SC_time_NoChange <- system.time(
  for(i in 1:repeatNum){
    montyResult_NoChange <- rbind(montyResult_NoChange, montyHall())
  }
)
cat("-----Result-----\nrepeat:",repeatNum,"\nChange    :",sum(montyResult_Change[,2]),"\nNo Change :",sum(montyResult_NoChange[,2]),"\n")
それぞれにかかった時間は、
                 user.self sys.self elapsed user.child sys.child
SC_time_Change      54.284    1.885  56.233      0.000     0.000
SC_time_NoChange    56.459    0.000  56.529      0.000     0.000
のようになった。

次に、マルチコア化したプログラムで同じように10万回試行する。くわしい書き方は後述する。
####### MC code #######
#install.packages("doMC")
library(doMC)
registerDoMC(cores=4)

MC_time_Change <- system.time(
  montyResult_Change <- foreach(i=1:repeatNum,.combine=rbind)%dopar%{
    montyHall(TRUE)
  }
)
MC_time_NoChange <- system.time(
  montyResult_NoChange <- foreach(i=1:repeatNum,.combine=rbind)%dopar%{
    montyHall()
  }
)
cat("-----Result-----\nrepeat:",repeatNum,"\nChange    :",sum(montyResult_Change[,2]),"\nNo Change :",sum(montyResult_NoChange[,2]),"\n")
それぞれにかかった時間は、
                 user.self sys.self elapsed user.child sys.child
MC_time_Change      35.387    0.028  36.517      3.148     0.144
MC_time_NoChange    46.255    0.040  47.395      3.992     0.252
のように、計算速度は約1.5倍ほど速くなった。

では,マルチコア化の手順を書いていく,
まず,packageを読み込む.私の環境はUbuntuまたはMacOS Xなので,packageはdoMCを使用する.Rに読み込ませる場合は以下のコードを実行する,
install.packages("doMC")
library(doMC)
このコードで,依存する(?)関連package(i.e. foreach etc...)がなければ自動的にインストール・読込される.次に,並列計算で使用するcore数を指定する.今回は4core使って計算するので次のように指定する.
registerDoMC(cores=4)
この3つのコードを書いたあとに,foreach文を使って並列計算の内容を書いていく.
並列計算の使用シーンはfor構文で書かれた繰り返し計算を並列化しjobが無いcoreにどんどんjobを割り振りたい時である.
例えば上記の例で言えば,
for(i in 1:repeatNum){
  montyResult_Change <- rbind(montyResult_Change, montyHall(TRUE))
}
という部分を並列にどんどん計算して行きたいわけである.ここで使う関数(構文?)がforeachである.
foreach文はfor構文に少しにているがfor構文と挙動が異なるので注意が必要である.例えば,for文で次のようなコードを実行しようとしよう.
a <- NULL
for(i in 1:10){
  a <- c(a,i)
}
これはベクトルaに1から10までの数字をaの末尾にどんどん追加していくコードである.for文が終わればこのaは
> a
[1] 1 2 3 4 5 6 7 8 9 10
という結果が帰ってくる.これをforeach文(シングルコアver)であらわそう.
a <- foreach(i = 1:10, .combine=c)%do%{
  i
}
シンプルな文ではあるが,色々とforとは違う部分があってわかりにくい部分もあると思う.私がforeachを最初に使った時に疑問に思った部分を中心に解説をしていく.
まず,foreach文は文の{}内で何かの変数に代入してもその変数の情報は{}をその実行している時だけ保持するように設計されている.だから,
a <- NULL
foreach(i = 1:10, .combine=c)%do%{
  a <- i
}
のように書いてもforeach文が終わった後のaにはNULLしか入っていないことに注意が必要である.しかし,foreach文で計算した結果はforeach文の中だけで外部に出力(何かの変数に代入など)することが出来ないかと言うわけではない.外部に出力をしたい場合にはforeachの前にその結果を順次追加していく変数をけば良い.
a <- foreach(i = 1:10, .combine=c)%do%{
  i
}
順次追加していく値は,foreachの{}内で追加したい数をterminalで確認するように打てば良い.例えば,
a <- foreach(i = 1:10, .combine=c)%do%{
  result <- i*10
}
という文をかいたとしても,resultの値はaに追加されない.変数resultの値をaに使いしたい場合は,
a <- foreach(i = 1:10, .combine=c)%do%{
  result <- i*10
  result
}
と組めば良い.ところで,以下のコードではどの変数がaに代入されるだろうか?
a <- foreach(i = 1:10, .combine=c)%do%{
  result <- i*10
  result2 <- i^10
  result
  result2
}
正解はresult2がaに追加される.つまり,一番最後に書いた(確認した?)変数がaに代入される.
次に,".combine" optionに関して書く.
.combineはaに随時代入される形式を指定する.各形式についてRのコードで例えてみよう,
===================================

a <- foreach(i = 1:10,.combine=c)%do%{
  i
}
ならば,
a <- NULL
for(i in 1:10{
  a <- c(a,i)
}

===================================

a <- foreach(i = 1:10,.combine=rbind)%do%{
  i
}
ならば,
a <- NULL
for(i in 1:10{
  a <- rbind(a,i)
}

===================================

a <- foreach(i = 1:10,.combine=cbind)%do%{
  i
}
ならば,
a <- NULL
for(i in 1:10{
  a <- cbind(a,i)
}

===================================
ちなみに,.combineにとくに指定がない場合はlist形式で随時追加される.
あとは次の2点がforとforeachと違う点である.
  • for文の"in"はforeachの"="である.
  • for(){}はforeach()%do%{}

さて,シングルコア版のforeach文をもう一度だそう.
a <- foreach(i = 1:10, .combine=c)%do%{
  i
}
これのマルチコア化したコードは次のとおりである.
a <- foreach(i = 1:10, .combine=c)%dopar%{
  i
}
つまり,"%do%"を"%dopar%"に変更するだけである.
ちなみに,あまりにも繰り返し回数が少ない,繰り返し構文中の計算量が少ない場合はマルチコア化した構文を書いても遅くなったり,無駄な計算が増えるので注意が必要である.また,例えば次のようなコードを書いたとする,
a <- foreach(i=1:10, .combine=c)%dopar%{
  cat(i,"")
  cat(i,"")
  i
}
これはiの内容を実行中に逐次terminalに表示させる構文であるが,普通のfor構文のような考えなら,
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
というように表示されるが,実際には
1 1 5 5 9 9 2 2 6 6 10 10 3 3 7 7 4 4 8 8
のように表示されてしまう(一例).ちなみにaには
1 2 3 4 5 6 7 8 9 10
というデータが代入される.

なぜこのようにバラバラに表示されてしまうかというと,foreachの{}内のjobは開いたコアから順次割り振られ,コアによってjobの実行速度は変わってくるためである.forで作った時にcat()やprint()を入れているコードはマルチコア化するときにこの点が要注意である.

ちなみに,montyHall()の実行結果だが,ドアを選び直したほうが景品が当たりやすいようである.

詳しい参考:
Package ‘doMC’
Getting Started with doMC and foreach

2012年10月24日水曜日

さくらのレンタルサーバー(ライト)でWordpresss2.7.1インストール

忘れないうちに.サブタイとしては「MySQLを用いないWordpressの構築」になるだろうか.

さくらインターネットのレンタルサーバー ライトプランでWordpressを構築する必要があったのでサーバー仕様を確認してみるとMySQLが使えないとのこと.ぐぐってみればDBはSQLiteが使用でき,WordpressのDBはSQLiteでもPDOdriverを用いれば構築できないこともないようなのでやって見ることに.

手順

  1. Wordpress2.7.1をダウンロード
    最新リリースは3.4.1(2012/10/24現在)だが,2.7.1をDL
    http://ja.wordpress.org/releases/#older
  2. "PDO (SQLite) For WordPress"をダウンロード
    バージョンは2.7.0(2012/10/24現在の最新版)を用いた
    http://wordpress.org/extend/plugins/pdo-for-wordpress/
  3. DLファイルの解凍
    ダウンロードしたWordpressとPDOを解凍
  4. ファイル移動
    PDOの解凍フォルダの内,
    • db.php
    • pdo/ ←サブディレクトリもすべて
    を /解凍したWordpressフォルダ/wp-content/ のなかにコピー
  5. wp-config-sample.phpのリネーム
    /解凍したWordpressフォルダ/wp-config-sample.php を wp-config.php にリネーム
  6. wp-config.phpの編集
    リネームしたwp-config.phpをテキストエディタで開き,
    define('DB_COLLATE', '');
    define('DB_TYPE', 'sqlite'); //mysql or sqlite`
    の様に赤字の部分を追記.ほかは全部いじらないでそのままにしておく.
    ※挿入する位置を間違えないこと
  7. サーバーアップロード
    FTP(FileZillaなど)クライアントソフトでwwwディレクトリに /解凍したWordpressフォルダ/ の中身をアップロード
  8. phpのバージョン変更
    さくらのサーバーコントロールの画像赤枠で囲ったところをクリック,phpのバージョンを5.3.17になんとなく上げておく
  9. wp-admin/install.phpにアクセス
    http://じぶんのどめいん/wp-admin/install.php にアクセス,ブログタイトルと管理者のメールアドレスを入力し,[Wordpressをインストール]をクリック
  10. インストール完了
    インストールが完了し,管理者アカウント名と自動生成のパスワードが表示され,さっき入力したメールアドレスに送信される.[ログイン]をクリック
  11. ログイン
    発行されたログインネームとパスワードでログインする
  12. ログイン完了
なお,このままではセキュリティ脆弱性があるので最新版にアップグレードをしなければならないが,DBのアップデート失敗により,自動アップデートではできないことが確認された.後日対応策を考える.
また,最新版のWordpress3.4.1で同じ操作を行ったところ,DBの詳細設定をしなければならなく,かつPDOのドライバーエラーが確認できた.
なお,ここに掲載した手順はPDOのダウンロードファイルに同梱されているreadme.txtを参照した.

2012年10月4日木曜日

地下鉄とか京王線連続立体交差事業のトンネルのお話

京王線の調布駅付近が地下化してから約1ヶ月たった9月15日,電車に乗っているとある男性が隣にいた女性と話している声が聞こえた.

「日本の地下鉄のトンネルは四角いでしょ.ヨーロッパとか外国の地下鉄は丸いのが多いんだよ.調布駅付近が四角いトンネルなのは日本独特なんダヨ」

そんなわけなかろうと思った.もちろん違う.調布駅・国領駅付近は浅いのと,上部がもともと駅構造であるから,開削工法(上から掘ってあとで上部だけ埋め戻すトンネル工法)を行なっても問題なかった.



ちなみに言うと,丸ノ内線も開削工法だが,これは浅いのが主な要因だが,開削工法は上から掘るので地上の交通網に何かしらの影響を与える.おそらく,丸ノ内線の場合には時代的にまだ開削を行なっても問題なかったとも考えられる.開削工法が主流な丸ノ内線だが,霞が関から赤坂見附の約230mの区間は半円形のシールド工法を用いて掘られている.もちろん深いからだ.地下鉄では一番深言われる都営大江戸線はもちろんシールド工法だ.

さて,京王線に話を戻すと,調布,国領駅は開削工法を用いた駅構造になっている.しかし,京王多摩川-調布と西調布-調布,調布-布田-国領の各区間はシールド工法を用いた構造になっており,布田駅はシールド工法をそのまま維持して駅を作った.



開削工法を用いたトンネルはそのトンネルの真上をすべて掘らなければならなく,余計にコストがかかるからだろうと思われる(と思ったが,開削工法は工期が短くかつ安いという利点があるらしい.つぎの意見のほうがもっともらしく思える).また,工期中もずっとトンネルの真上では営業列車が走っているので開削を行なうことで増加する事故のリスクは無視できない(作業員が本線上にたまたま出てしまった等).開削を行うことで事故はないにしても営業列車に対する多少の影響はあるだろう.



最後に,開削工法が日本独特のものでない例をひとつ出しておこう.
<弘の手紙30>~ニューヨーク交通博物館へ~: <弘>の手紙
"ニューヨークの地下鉄は開削工法を取っている。これは道路の地表から縦穴を掘り,中にコンクリートや鉄骨で箱を作り,埋め戻して完成させるものである。工事中は地上の道路使用を制限しなければならない、という欠点を持つが、複々線化や、階層化が容易であるし、トンネル方式に比べれば費用も安く済むらしい。その上複々線化や階層化を実現できれば、前述したように同じ路線に各駅停車と急行を走らせることも可能であるし、同じ路線でも途中から行き先を変えるという事も比較的容易である。反面、路線が複雑になり、わかりにくくなる傾向がある。"

適当な文に付き合ってくれて感謝.