「ニューヨークでUberを使ったら過剰請求が来たけど、返還請求をしたら、戻ってきた」という話

1. 事の背景(Uberにしか興味ない方は2へ、Uberの過剰請求にしか興味ない方は3へ)

妻とニューヨークへの旅行を計画し、空港と宿泊するホテルの間の移動をどうするか、ということになった。
ホテルはマンハッタンの中心街に近く、本来は電車やバスで安く往復できるのだが、今回の旅行は私と妻にとって初のアメリカ、しかも添乗員無し海外旅行。
電車やバスの乗り継ぎなどに不安があったため、タクシーの利用が無難ではないかと考えていた。

そんな折、タクシーの予約や支払いがスマホのアプリ上で可能なUberを思い出し、この機会に利用してみることにした。
最新サービスで面白そうだという理由もあるが、英語力に自信の無い私にとっては、「ドライバーと直接話をしなくても良い」というのが何よりも魅力的だった。

Uberに関しては以前から存在は知っていたが、使ったことがなかったため、事前にネットで情報を入手し、アカウント作成や支払いカードの登録などを済ませた。
そして万全の体制で、いざアメリカ、ニューヨークへ!

今回はユナイテッド航空を利用し、成田からニューアーク国際空港へ。
ちなみにニューアーク国際空港というもの自体、旅行前までは知らず、「ニューヨークじゃなくてニューアーク?」
という程度の、知識レベルでした。。

なお、これから初めてUberを使うという方は、クーポンコード「3vw3iq」を事前に入力しておくと、条件次第で自動的に料金の割引が行われるので、お勧めです。

2. Uberの利用(往路:問題無し)

無事にニューアーク国際空港に到着し、さあUberでタクシーを呼ぶぞ、ということで、事前に準備を済ませたUberアプリを起動!

現在地と目的地を入力すると、近くのUber車両がちゃんと検索されました。
なお、ニューアーク国際空港で呼ぶ際は、A〜Cのターミナル名の、1〜3のピックアップ場所を確認して正しく入れるのが良い。
検索結果には何やら時刻のようなものが表示され、地図上には2分後、料金表示の下には40分後、と表示され、少し混乱してしまいましたが、この車両を呼ぶと迎車が2分後、目的地への到着予想が40分後という意味でした。
(ちょっと分かりづらかった)

程なくして、無事に指定したUber車両が目の前に現れ、乗車完了。
後は運転手と何も話すことなく(本当はニューヨークの観光情報などを聞きたかったが、相手の言葉を理解できそうになかったので、無言を貫いた。。)、目的地のホテルに到着。
到着後は運転手が荷物をおろしてくれて、あとは、サンキュー、とだけ言って、終わり。
アプリ上で支払いの操作とかが必要なのかと思っていたが、特に何も必要ない模様。
アプリ画面が自動的に「移動終了」みたいな感じになり、当初予定通りの金額が表示されていた。
あまりのスムーズさに感動し、思わず、その場でチップを支払い(これもアプリ上で)。

Uber最高!と思った瞬間だった。

3. Uber利用(復路:問題有り)

さて、4日間のニューヨーク観光を終え、今度は逆にホテルから空港への移動。
ホテルのポーターさんにはタクシーの利用を勧められたものの、往路でのUber料金よりも高い値段になりそうだったので、迷うのとなくUberを利用。

往路と同様に現在地(ホテル)と目的地(空港)を入力して、予定料金が約$70であることを確認。
そして、往路と同様に約2分後にUber車両が目の前に到着、のはずでしたが、なぜか運転手がその場でUターンをして、道の向かい側に向きを変えてしまいました。

私はアプリにホテルの場所を正しく入れたはずなので、どちら側で乗車するのかは分かるはずなのに。。。

ホテルの前の通りは6車線ある大きめの道のため、私たち自身が道を渡ることもできず、ドライバーに大きく手を降ってみたのだが、残念ながらドライバーには気づいてもらえなかった。
そうこうしてるうちに、ドライバーからUberアプリを通じて電話が着信。
私の拙い英語で、道の反対側に私がいることを(しどろもどろに)伝え、ようやく乗車。
英語喋らずに済むと思ったからUberを使ったのに。。

その後の移動は、道が少し渋滞していたものの、ドライバーがサーキットレーサー並みの超高速運転(正直、ありがた迷惑)で、予定時刻通りに空港に到着。

そして荷物を降ろしてもらい、旅の最終難関をクリアしたと思った私は、柄にもなくドライバーと握手してお別れ。
いやー、やっぱりUber最高!と最後に思った瞬間でした。

空港の中に入り、一応、アプリを確認。
往路と同様に、すべてが終わり料金が表示されているものと信じて疑わなかったのですが、、
あれ、、まだ乗車中になってる。。

ここで、私は「まぁいいか。料金は最初から決まってるんだし」←この判断が問題の始まり

その時のスクリーンショット(というか、妻が「一応、スクショ撮っておいたほうが良い」と言って、妻自身のスマホカメラで撮影した画像)

空港ではチェックインや手荷物検査やトイレなどを済ませ、あとは搭乗を待つだけ、となり、
時間を潰すことに。
ここで、ふと、Uberがどうなったのか気になり、再びアプリを確認すると。。。

あれー、ドライバーの位置が空港からかなり離れたところまで移動してるのに、まだ終了していない!
「うーむ、どうしたものか。でも、まぁいいか、料金は決まってるんだし」←二度目の判断誤り

そして搭乗時間を待つこと数十分、Uberからのメールが着信。

ここで驚愕の事実が! 「領収書:$150」
?!
$150だとぉー!

領収書の詳細は、こんな感じ。

私が乗車した距離や時間は、これの半分以下だし、そもそも距離や時間で料金が決まるシステムではないはず!

しかし、迫り来る飛行機の搭乗時間までの短い時間でクレームを申し出て、解決までする自身はなく、悶々としながらも飛行機に搭乗。
とりあえず、この問題の事は忘れて、日本までの14時間は飛行機で爆睡。

そして、帰国後に、自宅のネットでこの問題のことを調べたら、私と同じ問題に遭った人の記事を発見。

「アメリカで体験!Uberで不正請求にあった場合の対応方法」

私も、これに習って、クレームをつけて料金返還の請求をすることにした。

で、私の場合は、以下のような文書を(Google翻訳を駆使して)作成して、Uberアプリから送信!

I took this driver ‘s car from the Watson hotel in New York to Newark internatinal airport.
The boarding time was from 7:30 to 8:20.
The pre-notified fee at that time was $ 69.99.

(You can confirm by application screen capture when getting off at 8:30.
If necessary, I can send this screen capture as evidence.)

However, the notified fee was more than double that amount.

After checking the boarding history, the driver, after dropping us,
ran for quite a long distance while forgetting to stop the ride meter,
and the charge including that amount.

The valid boarding distance was 28.5 Km (17.7 mile), and the boarding time was about 50 minutes.

However, due to unauthorized processing by the driver, a large amount of money is being charged.
Toll charges for Holland Tunnel and tolls for George Washington Bridge are also being charged.

The toll fee for the Holland tunnel should be included in the pre-notified fee.

And, the toll fee of George Washington Bridge was not related to our ride.
This was the charge that the driver passed by himself alone on the way to his home.

Therefore, We will request a refund the overcharge of about $80 ($151 – $69.99) .

文法的には間違いだらけだとは思うものの、こちらの意図さえ伝われば十分なので、思い切って送信!

その数十分後、何やら「返金します」的なメールが届き、Uberアプリ上でも無事に過剰請求分の料金が返還され、当初予定通りの料金だけの領収書に修正されている事が確認できた。

ちなみに、Uberから届いた「返金します」的な内容のメールは、乗車実績についての事実認定と料金返還については記載されているものの、いわゆる謝罪は一切無し。
これがアメリカかぁー。

という結末でした。

ちゃんちゃん

医用画像関連の情報

最近使った、いくつかのツール類についてメモ

  • ITK
    • Insight Tool Kit
    • 医用画像関連の色々な処理がパッケージングされている
    • DICOMファイルの入出力には下記のGDCMを使っているようだ
  • GDCM
    • Grassroots DICOM library
    • DICOMファイル関連のツール
    • 圧縮DICOMも扱える
  • DCMTK
    • DICOM Toolkit
    • こちらもDICOMファイル関連のツール
    • ほとんど使ったことが無いので、よくわからないが、GDCMと同じような感じなのだと思う
  • Live Volume
    • GPGPUによる高速なボリュームレンダリングソフト(フリー)
    • DICOMファイルを直接読み込める
    • 日本製(京都大学の松田研究室)

B-Spline

Free Form Deformation (FFD) などに使われるB-Splineはよく知られているが、
実はよく知られているのは3次のB-Splineであり、0次,1次,2次のB-Splineもある。

最も単純な0次のB-Splineは±0.5の範囲で1を返し、それ以外では0を返す矩形の
基底関数である。
面白いのは、1次のB-Splineは、0次のB-Spline同志のの畳み込みであり、
2次のB-Splineは1次のB-Splineに0次のB-Splineを畳み込んだものである。
よく知られた3次のB-Splineは2次のB-Splineに0次のB-Splineを畳み込んだものとなる。
これらの各次数の基底を用いることで、特定の基底の微分や積分を表現できる。

自前で0次~3次のB-Splineを実装してみたので、ソースを公開してみる。

	///0次B-Spline基底
	static double bSplineBasis0(const double u){
		double absU=abs(u);
		if(absU<0.5){
			return 1.0;
		}
		return 0.0;
	}
	///1次B-Spline基底
	static double bSplineBasis1(const double u){
		double absU=abs(u);
		if(absU<1.0){
			return 1.0-absU;
		}
		return 0.0;
	}
	///2次B-Spline基底
	static double bSplineBasis2(const double u){
		double absU=abs(u);
		if(absU<0.5){
			return 3.0/4-absU*absU;
		}
		if(absU<1.5){
			return 0.5*absU*absU-1.5*absU+9.0/8;
		}
		return 0.0;
	}
	///3次B-Spline基底
	static double bSplineBasis3(const double u){
		double absU=abs(u);
		if(absU<1.0){
			// [0,1
			return (3.0*absU*absU*absU-6.0*absU*absU+4.0)/6.0;
		}
		if(absU<2.0){
			// [1,2)
			return (2.0-absU)*(2.0-absU)*(2.0-absU)/6.0;
		}
		return 0.0;
	}

多項式の項を生成する

多項式の組み合わせは、シンプルと言えばシンプルなのだが、
自動的に全組み合わせを生成しようとすると、少し頭が混乱する。

ということで、改めて落ち着いて自動生成のアルゴリズムを書いたので、
備忘録としてアップしておく。

世の中、多項式の項の組み合わせを自動生成しようと思う人は、
ほとんど居ないと思うので、ほぼ完全に自分用ですが。。。



#include<iostream>
#include<vector>
#include<Eigen/Dense>


std::vector<Eigen::VectorXi> genMonomialFixedDegree(const int dimm, const int degree){
	std::vector<Eigen::VectorXi> ans;
	if (dimm == 1){
		Eigen::VectorXi monomial(1);
		monomial[0] = degree;
		ans.push_back(monomial);
	}
	else{
		for (int i = 0; i <= degree; i++){
			Eigen::VectorXi monomial(dimm);
			monomial[0] = i;
			std::vector<Eigen::VectorXi> monomialLast = genMonomialFixedDegree(dimm - 1, degree - i);
			for (int j = 0; j < monomialLast.size(); j++){
				for (int k = 0; k < dimm - 1; k++){
					monomial(1 + k) = monomialLast[j](k);
				}
				ans.push_back(monomial);
			}
		}
	}
	return ans;
}

std::vector<Eigen::VectorXi> genMonomial(const int dimm, const int degree){
	std::vector<Eigen::VectorXi> ans;
	for (int i = 0; i <= degree; i++){
		std::vector<Eigen::VectorXi> ansDegree = genMonomialFixedDegree(dimm, i);
		for (int j = 0; j < ansDegree.size(); j++){
			ans.push_back(ansDegree[j]);
		}
	}
	return ans;
}

int main(int argc, char** argv){
	const int degree = 3;
	const int dimm = 3;

	std::vector<Eigen::VectorXi> monomials = genMonomial(dimm, degree);
	for (int j = 0; j < monomials.size(); j++){
		std::cout << monomials[j].transpose() << std::endl;
	}
	return 0;
}

YouTubuの動画を連続再生する方法

超簡単な方法です。

もう誰でも知っている方法かもしれませんが、私は今まで知りませんでした。

方法は、、、

連続再生したいYouTube動画のURL(アドレス)の中の、

www.youtube.com の部分を www.youtuberepeat.com と書き直すだけ。

たとえば、「Red garland trio-C jam Blues」の動画
https://www.youtube.com/watch?v=ra0p0u59N7o

OpenGLのチュートリアル始めました

すがすがしく新年度が始まりました。

理工学系の大学四年生などは、今年から研究室へ配属される人も多いと思います。

このサイトでは理工学系の大学生向けに、基礎的なプログラミングやツール類などについて紹介、解説を充実させていこうと思っています。

ということで、その一環として、三次元グラフィックスのコンピュータプログラミングの基本的なライブラリであるOpenGLの解説ページを新設しました。

まだ情報は少ないですが、徐々に充実させていきますので、どうぞご活用ください。

また、それ以外にも、コンピュータによる音声解析などのページも作っていこうと思っています。ご期待ください。

今年も、実り多き新年度にしていきましょう!

公開されているComputer Visionの講義資料

http://cs.brown.edu/courses/cs143/

Brown大学コンピュータサイエンス学科のコンピュータビジョンの講義資料が公開されていて、なかなか勉強になったので、共有と備忘を兼ねてブログにリンクを張っておきます。

特に認識関連の講義資料が充実しているようです。