16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【雑記】【ネタバレ】心が叫びたがってるんだ。

『心が叫びたがってるんだ。』を観てきたんですが、非常に良くて最高でただいま心が叫びたがってるので、感想を書きます。
勢いで書いているので全然まとまってませんが、参考程度に見ていただければ。
多少ネタバレもあります。

映画『心が叫びたがってるんだ。』

「言葉」の重さを伝える話

全体としてのテーマは「言葉」。

劇中のセリフにも直球で出てきますが、「言葉は人を傷つける(順)」けど、言葉で人は救われもする。
主人公の順は幼少期のトラウマで喋ることができないけど、別に順だけじゃなくて、誰だって言葉で人を傷つけるし、言葉で救われます。
ただ同時に「言わなきゃわかんないよな(拓実)」というセリフにもあるように、それでも言葉にしなきゃダメなんですよね。

ちなみに書いてて思ったんですが、順のトラウマが素直に喋りすぎたことに起因しているのに対して、拓実と菜月のすれ違いは素直に話せなかったことに起因しているという対比があって面白いです。
素直な言葉もそうじゃない言葉も、どちらも人を傷つけるということ。

そしてこの「素直」っていうのも結構大事な要素で、順も拓実も菜月も大樹も、みんなそれぞれ素直じゃありません。
というか、順以外の3人は喋ってはいるけど、心では喋っていない、口で喋っているだけです。
心が叫びたがっているのは、みんな同じ。
順はただそれがちょっと他の人よりわかりやすく表面に表れているだけなんですよね。

いずれにせよ、全体としてのメッセージがすごくシンプルで、言われてみれば当然のことなんですが、物語の途中まではずっと伏線や暗喩に留めておいて、最後にセリフとして表現させるっていうやり方は個人的に結構好きです。
シンプルなメッセージが、重みをもって伝わるので。

ハッピーエンドじゃないよ

物語は、地域ふれあい交流会で行うクラス劇の制作と本番を軸に進むのですが、
この劇中劇は、順自身の物語をモデルに順自身が脚本を書いているため、映画のストーリーの暗喩としてすごく機能しています。

当初、順は物語をサッドエンドにする予定でした。
ヒロインは死んでしまい、死んでしまった後になって心の叫び声が溢れてくる。
王子に「愛してる」と伝える頃にはもう遅い。
ですが途中で、順は結末をハッピーエンドに変えようとします。
ヒロインは順で、王子は拓実で、結末はハッピーエンド。
ここに順の意思のようなものも感じますが、ともあれ拓実はサッドエンドもハッピーエンドも、どちらも順の伝えたいこととして、両方とも取り入れたようなラストにします。

映画自体は、順は声を取り戻すし、母親との確執もなくなるし、拓実と菜月はよりを戻すし、順と大樹はくっつきそうだしで、なんとなくハッピーエンド感がありますが、個人的にはハッピーエンドではないよなと思います。
順は精神的にものすごく子どもだし、声を取り戻したところで、幼少期にトラウマが発生した頃と何が違うのか、声を取り戻せばハッピーエンドなのかというと、そうではないはずです。
劇中劇のラストで、取り戻した声で歌うのがハッピーエンド用の曲、心の声が歌うのがサッドエンド用の曲というのが、その辺を表しているのかなぁと。
ただ、「自分のおしゃべりのせいにしないとどうしていいのかわからない」と言っていた順が現実と向き合ったことで、ようやく前に進めるというのはあると思いますが。

割とリアル

映画の冒頭はラブホのシーンです。
幼少期の順が「お城」として憧れていた世界ですが、このラブホが映画全体を通してちょいちょいメタファーとして出てきて、しかも割とリアルです。
例えば劇中劇の、「そのお城が罪を犯した人を踊らせ続けている場所だと知ってもなお、少女はお城に行きたいという思いを止められない」という脚本なんかは、お城がラブホから来ていることを考えるとものすごく生々しい話だなぁとも思いますし、劇の当日に順が逃げ込んで、追いかけてきた拓実とぶつかり合うシーンでは、背景にガラス張りのシャワールームがわざわざ描かれていたりして、そこがラブホであることを強調してきます。
それ以外にも、チア部の誰かと野球部の誰かが校内の物陰でキスしているシーンがあるんですが、セリフも音も描写もプリヤ並にリアルだったり、野球部の先輩後輩の確執や順の母親が保険の営業で苦労しているあたりなんかも、サブストーリーでありながらやけにリアリティのある表現だなぁと。

テーマ自体が普遍的なものなので、作品全体にリアリティを出すための表現は結構多かったと思います。

あの花』ではないよ

ここまでの文章でわかると思いますが、本作はテーマもストーリーも世界観も、あの花」とは全く異なります
リアルだし、魔法の玉子なんて無いし、メッセージも現実的だし。

感想の速報に「true tearsに似ている」という意見があったのですが、話自体は確かにそうかもしれません。
順は声が出せなくて、乃絵は涙を流せない。
菜月も比呂美も優等生で、主人公に好意を寄せているけど、それを表現しない。
テーマは違いますが、3人の関係のドロドロ感とか、話の雰囲気は似ていると思います。
アニメばりばりではなくて、普通の青春恋愛映画をアニメで表現している感じですかね。
あの花」ファンがアニメと同じ雰囲気を期待して観ると、確実に肩透かしを喰らうと思います。

音楽

最後に音楽について。

劇中劇はミュージカルなので、作中にも歌がちょくちょく挟まります。
一番の見所はやっぱり劇のラストで、ベートーベンの「悲愴」とオズの魔法使いの「Over the Rainbow」にそれぞれ歌詞を付けてマッシュアップみたいにして歌うシーンがあるのですが、それがもう最高でした。
この曲のためだけにサントラが欲しいレベル。

なお、エンドロールがなぜか乃木坂なんですが、これは本当になんでなんだろう?
電通の仕業としか言いようがないのか。
悲愴とOver the Rainbowでいいやん。

まとめ

やっぱり長井龍雪と岡田マリーはすごいなぁと思います。
まぁ脚本は今回王道と言えば王道なんですけど。

声優さんも、メイン4人は割とバッチリでした。
雨宮さんは順役のオーディションも受けたとかいう話でしたが、まぁ菜月だよなぁと思います。

あと思ったのは、1クールとかでアニメをやった後に作られた劇場版と、最初から2時間の映画として作られたものとはやっぱり全然違うなと。
この作品を1クールとかのアニメにしちゃうと、キャラを立てるのが大事になって一番重要なメッセージがぼやけてしまうと思うので、せっかく普遍的でアニメファン以外にも響くテーマなんだから、映画という形で、しかもバリバリのアニメ作品としてではなく、一般にも受け入れられるような作品として作ったのはすごく良いと思います。
できれば普段アニメ映画を観ないという人や、ジブリ細田守くらいしか観ないという方にも観てほしいなと思いました。


おわり。

【アルゴリズム】CodeIQの「ホリエモンからの挑戦状」を解いて1,200円貰いました

気付けば1ヶ月以上もブログを放置していました。
というわけで、ちょっと前にCodeIQでやっていた、「ホリエモンからの挑戦状」というキャンペーン問題を解いて1,200円くらいもらった話をリハビリがてら書きます。

CodeIQ|ホリエモンからの挑戦状~現金100万円山分けチャレンジ~

と言っても企画自体は7月頭くらいだったので、もはやほとんど忘れてるんですが、2ヶ月前に自分が書いたコードを思い出しながら頑張って書きたいと思います。

問題

問題は短い棒を3本繋いで決まった長さの棒を作る場合の組み合わせパターン数を求めろというものだったのですが、単純化すると以下のようになります。

自然数Lと、N個(1≦N≦5000)の自然数とが入力値として与えられる。
N個の自然数のうち3つを選び、その和がLになるような組み合わせはいくつあるかを求めるプログラムを書け。
なお、N個の自然数の大きさは全て異なるとする。

回答晒し

で、例のごとく回答を晒します。ちょっと長いですね。

public class Main {
	
	List<Long> list = new ArrayList<Long>();
	int startIdx;
	int endIdx;
	
	public static void main(String args[]) throws IOException {
		Main self = new Main();
		self.execute();
	}
	
	private void execute() throws IOException {
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
        
		final long L = Long.parseLong(br.readLine());
		final int N = Integer.parseInt(br.readLine());
       	
		//とりあえずリスト作成
		for (int i=0; i < N; i++) {
			list.add((long) Long.parseLong(br.readLine()));
 		}
		//数の大きい順にソートしておく
		Collections.sort(list);
		Collections.reverse(list);
        
		//ここがメイン
		try {
			long ans = 0;
			for (int i=0; i<N-2; i++) {
				//i番目の要素を1つ目の要素として選択した場合の合計
				if (isLengthTooMuch(i+1, L-list.get(i), 2)) {
					break;
				}
				ans += solve2(i+1, L-list.get(i), 2);
			}
			System.out.println(ans);
		} catch (Error e) {
			System.out.println("cause=" + e.getCause());
			System.out.println("class=" + e.getClass());
			System.out.println("message=" + e.getLocalizedMessage());
		}
	}
	
	private long solve2(int idx, long length, int num) {
		long res = 0;
		
		if (!isLengthEnough(length, num)) {
			return 0;
		}
		
		//探索用endIdxの初期化
		endIdx = list.size()-1;
		startIdx = idx;
		
		for (int j=idx; j<list.size()-1; j++) {
			if (startIdx < j+1) {
				startIdx = j+1;
			}
			if (containsAfter(j+1, length-list.get(j))) {
				res++;
			}
		}
		return res;
	}
	
	private boolean containsAfter(int idx, long length) {
		if (length <= 0) {
			return false;
		}
		if (list.get(idx) < length) {
			return false;
		}
		if (list.get(list.size()-1) > length) {
			return false;
		}
		
		while (true) {
			if (Math.abs(startIdx - idx) <= 2) {
				startIdx = idx;
				break;
			} else if (list.get(startIdx) < length) {
				startIdx = startIdx-10;
			} else {
				break;
			}
		}
		
		while (true) {
			if (Math.abs(endIdx - startIdx) <= 2) {
				break;
			}
			
			int halfIdx = endIdx - Math.round((endIdx - startIdx)/2);
			long halfVal = list.get(halfIdx);
			if (halfVal == length) {
				return true;
			} else if (halfVal > length) {
				startIdx = halfIdx;
			} else {
				endIdx = halfIdx;
			}
		}
		
		for (int i = startIdx; i <= endIdx; i++) {
			if (list.get(i) < length) {
				break;
			}
			if (list.get(i).longValue() == length) {
				return true;
			}
		}
		return false;
	}

	private boolean isLengthEnough(long length, int num) {
		if (num == 1) {
			return (length >= list.get(list.size() - 1));
		} else if (num == 2) {
			return (length >= list.get(list.size() - 1) 
					+ list.get(list.size() - 2));
		} else {
			return (length >= list.get(list.size() - 1) 
					+ list.get(list.size() - 2)
					+ list.get(list.size() - 3));
		}
	}
	
	private boolean isLengthTooMuch(int idx, long length, int num) {
		if (num == 1) {
			return (length > list.get(idx));
		} else if (num == 2) {
			return (length > list.get(idx) + list.get(idx+1));
		} else {
			return (length > list.get(idx) 
					+ list.get(idx+1)
					+ list.get(idx+2));
		}
	}
}

ポイントとしては、まず最初にN個の数字を大きい順にソートしておく。
これによって、ループ処理の過程で選ばれていく組み合わせは必ず大きいものから順に並ぶことになるし、i+1番目以降の数値を使って作成できる最大の和は、最初に取れるr個の数値の和になる
これを利用して無駄な処理を省いているのがisLengthTooMuchを呼んでいる部分で、最初の数値としてi番目のものを選んだとして、i番目とi+1番目とi+2番目の和がLに届かないなら、それ以降のループは回す必要がないよね、ということ。
これで1重目のループを回す回数を抑えます。

で、最初に選ぶのがi番目の数値ということが決まったら、次はsolve2というメソッドで、残りの要素を探す。
ここではまずisLengthEnoughというメソッドを呼んで、i番目を選んだ時点で、残りの和を最小となるような組み合わせで選んだとしてもLを超えてしまうようになっていないかどうかを事前に調査する。
リストは大きい順に並んでいるので、リストの末尾の要素2個の和がi+1番目以降の要素2つで作れる和の最小となる。
どう頑張ってもLを超えてしまうような場合はこの時点で次のループへ。
そうでない場合は、2つ目の要素としてj番目の数値を選んだとして、大きさが「L - (i番目の数値) - (j番目の数値)」の数値がj+1番目以降に存在するかどうかを調べる。
存在すれば組み合わせパターンを+1する。

で、その「大きさが「L - (i番目の数値) - (j番目の数値)」の数値がj+1番目以降に存在するかどうかを調べる」ためのメソッドがcontainsAfterなわけですが、ここでもソートしてあることが効いている。
まずi番目とj番目を選んだ時点でLを超えているようなケースはスキップするとして、次にsolve2と同様に、j+1番目以降の最大の数値(要するにj+1番目の数値)が残りの必要な長さに達していなかったスキップだし、最小の数値(要するに最後の要素)が残りの長さよりも長くてもスキップする。

で、containsAfterはさらにちょっとクセのあることをやっていて、それがwhile(true)でループしている2カ所の部分。
何をやっているかというと、擬似的な2分探索をやることで、残りの長さlengthが存在するとしたら、startIdx〜endIdxの間にしかあり得ないということを絞り込んで、実際にループを回して探す回数を抑えている。(2個目のwhile(true))
これもリストがソートされているからできること。
しかも、このstartIdxは毎回初期化されるわけではなく、「i番目とj番目を選んだ時のstartIdxがkだったなら、i番目とj+1番目を選んだ場合のstartIdxもkと同じか、それよりちょっと手前くらいだろ」という推測のもと、2分探索自体の試行回数も少なくなるよう工夫してある。(1個目のwhile(true))

こういったアルゴリズムで、一応合格レベルの速度は満たすことができた。
総額100万円を合格者の数で山分けという話だったので、1,200円貰えたということは合格者は800人くらいということですね。
いずれにせよ、こういう趣味プログラミングで問題解くだけでおこづかい貰えるのはハッピー。
時給換算すると800円くらいなのでちょっと辛いですが、まぁ趣味だし。数独解いてお小遣い貰えるみたいな感じだし。

おまけ

メソッド名がsolve2とかになっているのは、当然もともとはsolveがあったから。
最初はsolveを「idx番目以降の要素をnum個使って、合計lengthとなる組み合わせの数を返す」というメソッドとして定義し、再起的に呼び出すことでコーディングの省力化を図っていたのですが、上記の通り最後の1つを探す時には2分探索した方が良いとか色々あってできませんでした。
isLengthTooMuchやisLengthEnoughが無駄に汎用的に書かれているのもその名残です。
なお、C++とかの高速言語ならもしかしたら再起呼び出しのもともとのソースでも合格できたかもしれません。
そしたら時給1,000円超えるね。


以上、おわり。

【雑記】イタリアにぼっち旅行をしてきました

先日、有休消化を兼ねて6泊8日でイタリアに行ってきました。
日付は2015/07/14-2015/07/21です。
一人旅です。ぼっちなので。
というわけで、何となく思ったこととかを書いておきます。

前提

個人的には別に旅好きというわけではありません。2014年度は東京から一切出ず(帰省くらいはした)、「引き蘢ってるなぁ」と自覚してた人間です。今回の旅行も、有休消化で長期休みがあるから、「せっかくだからどっか行くか」くらいのテンションで決めていて、別に「やったー!休みだー!旅行行くぞー!」って感じではありませんでした。
行き先をイタリアにしたのは、旅行代理店でニューヨークのパンフレット見た後にイタリアのを見たら、同じ値段で1泊多くてさらに3都市も行けるということを知ったからです。コスパコスパ。あと自分はARIAを信仰しているので、死ぬまでにヴェネツィアには行かなきゃなぁと思っていたのもあります。

ARIA 全12巻 完結セット (BLADE COMICS)

ARIA 全12巻 完結セット (BLADE COMICS)

プラン

代理店で飛行機とホテルと都市間の鉄道だけ取ってもらった個人旅行でした。オプショナルツアーも無し。
最初2日がヴェネツィア、次の2日がフィレンツェ、最後の2日がローマでした。初日と最終日は飛行機です。
どこをどう回るかは『地球の歩き方』のみで決めました。割と便利な本でした。

A09 地球の歩き方 イタリア 2015~2016

A09 地球の歩き方 イタリア 2015~2016

持ち物

持っていったもののうち、役に立ったものと無駄だったものをちょっと書いておきます。

・サングラス(役立ち度:★★★★★)
無いと死ぬ。目が焼けるのもそうですが、眩しさが抑えられるだけでだいぶ体感温度が違う気がしました。

・ダイヤル錠(役立ち度:★★★★★)
街や駅を歩く時や、鉄道や飛行機の中などでは、バッグのジップをダイヤル錠でロックしてました。スリ対策です。
事前に聞いていたほどスリの気配は感じませんでしたが、ロックしてないと常に気を張ってないといけないのが、ロックがあることで気を抜けるのでだいぶ楽です。

ワインオープナー/ソムリエナイフ(役立ち度:★)
食費とかをケチる気満々だったので、ホテルの近所のスーパーとかでおつまみ的な総菜(生ハムやフルーツなんかが割と安い)とワインを買ってホテルで飲もうとか、スーパーで買ったワインボトルを広場に持っていって木陰とかで飲みながらのんびりしよう、とか思ってたんですが、暑すぎてワインどころじゃなかったです。気温39℃とかだったし、乾燥してるので、あっという間に身体から水分が抜けていく。「こんな状況で脱水効果のあるアルコールなんか摂取できるか!」というわけで、ほぼ水ばっかり飲んでました。涼しい時期だったら良いかもしれない。特にヴェネツィアカナル・グランデ沿いとかは最高だと思います。

ジップロック(役立ち度:★★★★)
小分け袋兼圧縮袋。旅行の定番。非常に便利。

・ペットボトルホルダー(役立ち度:★★★★)
腰とか鞄から下げられるやつ。上記の通り、バッグ自体はダイヤル錠によりロックされてしまうので、わざわざロック解除しなくても水を飲めることは非常に重要。15分で500ml無くなったりするからね。

言葉

当方、イタリア語はおろか、英語すらままならないレベルですが、「まぁ観光地だしなんとかなるだろ」と思って行ったら何とかなりました。
ちなみに現地での会話はほぼ英語。1週間居て、発したイタリア語は「ボンジョルノ」と「チャオ」と「グラツィエ」のみでした。

お金

事前に両替していったのは250€でしたが、これでちょっと余るくらいでした。とは言っても僕は食費をスーパーでの買い物で済ませたり、水代を水汲みポイントで済ませてケチったりしていたので、普通においしいものを食べて、水もお金払って買うならちょうどくらいかなと思います。
ちなみに高めのお土産(ヴェネツィアングラスなど)はカードで買いました。

ヴェネツィア

f:id:sakuramochi702:20150715214636j:plain

ARIA教の聖地。というのを差し置いても、すごく良い街でした。
歩いてると、細い路地とまぁまぁ広い道、小さい広場と大きい広場、狭い水路と広い運河が交互に現れて、歩いてるだけで最高に楽しい街です。たぶん散歩してて楽しい街ランキングで世界1位じゃないかな。アリスちゃんの言ってることが良くわかる。
車も自転車も通ってないっていうのも非常に良いなと思います。人間本来の速度で散歩できる街ですね。
いたるところにある広場もものすごくのんびりできて、サンマルコ広場ではカフェ・フローリアンで冷たい飲み物を頼んで2時間くらいのんびりしてたし、サンタ・マリア・デッラ・サルーテ教会の前でもまた2時間くらいのんびりしてました。前者は広場の様子を眺めているだけの2時間、後者は運河の様子を眺めているだけの2時間でした。贅沢な時間だ。

名所的なところでは、個人的にはドゥカーレ宮殿がすごかったです。壁から天井まで全部絵画と額縁装飾で覆われていて、「絢爛すぎワロタwww」って感じでした。所狭しと絵が貼ってある様子はある意味オタクの部屋みたいな。もっと節操を持てよとつっこみたくなるような。豪華さという意味では、壁に金箔張り巡らせたお寺も完敗です。金あったんだろうなぁ。

なお、ゴンドラは普通に乗るとめちゃくちゃ高いので、トラゲットっていう、川を横断するだけの短いやつに乗りました。渡るところの幅にもよりますが、概ね10€以内くらいで足りる模様。ゴンドラを体験するだけならこれでも良いかもしれません。安いし。まぁ灯里ちゃんが漕いでくれるなら100€でも払うんだけどね、おっさんじゃあね。

ちなみにさっきから何回かARIAの話が出てきてますが、割と本気で ARIAヴェネツィア観光にとても良いガイドブックだと思います。まず「歩いてて楽しい」って感覚が実感できるし、「パリーナ」とか「トラゲット」とかの単語も出てくるし、サンマルコ広場とか溜息橋とかの名所も出てくるし、ケットシーの仮面も街中でめっちゃ売ってるし。というわけで、みなさんヴェネツィア観光に行く前にはARIA読んでいくことをおすすめしますよ(布教)。

フィレンツェ

f:id:sakuramochi702:20150716220450j:plain

とにかくドゥオーモがすごかったなぁというのが最大の印象です。駅からホテルまでの道中にドゥオーモがあったのですが、最初見た時に「すげー!なんだこれー!」ってなってしまって、炎天下の中キャリーケース持ったままドゥオーモの周りをぐるぐる回っていたところ、歩き回りすぎてホテルに着く頃には半分熱中症みたいな状態になってました。実際そのくらい迫力あるし、造りがいちいちめちゃくちゃ細かいし、古い建物だと思えないような配色してる(フラットデザインみたいな配色だ)し、ホントすごかったです。正直こんなにすごいとは思ってなかったな。
なお、フィレンツェの街って道がほとんど石畳なので、キャリー持って歩くのにあんまり適していません。僕は駅から割と遠いホテルにしちゃったんですが、駅近にとる方が良い気がします。

あとは建物としていうならサンタ・クローチェ教会も綺麗でした。教会前の広場が開けてて広いのと、ちょっと街の中心部から外れているからか、周りに高い建物がないのとで、堂々と立っている感じがあって、「これぞ教会!」的な威厳を感じました。ちなみに中にはミケランジェロとかのお墓があるので、挨拶してきました。

で、フィレンツェと言えば美術館ですが、とりあえず今回は中でも一番有名(?)なウフィッツィ美術館に行ってきました。めちゃくちゃ並ぶと言われている美術館ですが、平日の開館時間15分前くらいに行ったからか、予約無しでもほぼ開館と同時に入れました。館内写真撮影OKですが、美術品の写真なんか撮っても意味ないなぁとつくづく感じます。それよりも自分の目で1秒でも長く見た方が良い。ボッティチェリの『プリマヴェーラ』なんか本当に最高でした。見た瞬間に「あ、これは傑作だわ」と感じるくらいには素晴らしい作品です。
美術館自体は現在改修中なのですが、それでも日本の美術館よりも全然広くて、気付けば5時間弱いました。これがもしツアーだったら1カ所に5時間もいれないので、フリープランで来て良かったなぁと思いました。ヴェネツィアでも広場で2時間ぼんやりするなんて、ツアーだとできなさそうだし。

というわけで今回はウフィッツィ美術館しか行けなかったので、人生でもう1回くらいはフィレンツェ行って、アカデミア美術館にも行きたいなと思いました。街並みも綺麗ですし、ここも歩いてて楽しい街だと思います。世界ランキングで言えば6位くらいかな? 初日にミケランジェロ広場という高台の広場からフィレンツェを一望したんですが、アルノ川を挟んでドゥオーモやたくさんの教会たちを見下ろすのは最高に気持ちよかったです。

ローマ

f:id:sakuramochi702:20150718230558j:plain

市内に見所はたくさんあるんですが、個人的にはフォロ・ロマーノがいちばん好きでした。なんていうか簡単に言うと廃墟なんですが、ドラクエとかに出てくる廃墟のイメージがそのまま目の前に広がってて、「古代文明の廃墟って本当にあるんだ」ってなりました。壁の崩れてる感じとか、柱の折れてる感じとか最高でしたね。
ちなみにフォロ・ロマーノとかコロッセオとか、あとはサン・ピエトロ大聖堂とか、ローマの主な観光名所の周りには無料の水汲みスポットがあって、これも非常にありがたかったです。基本的に胃腸の弱い僕が飲んでもお腹を壊さなかったので、たぶん大抵の日本人は大丈夫だと思います。

で、コロッセオフォロ・ロマーノと並ぶもう一つの見所であるサン・ピエトロ大聖堂キリスト教大本山)ですが、ここはなかなか酷い行列でした。聖堂の前にかなり広い広場があるんですが、そこをぐるっと一周するくらい行列が並んでて、しかも並んでる場所の半分以上は日なたなので、この季節に並ぶのは非常につらぽよだと思います。しかも並んでると物売りと物乞いが近づいてくるし、噂ではスリもいるのことだし。
僕はキリスト教徒ではないので素直にあきらめて、外観写真だけとってあとは行列をしばらく眺めた後に去りました。噂では朝イチで行くとほとんど並ばずに入れるらしいので、中を見たい人は朝イチで行くのが良いと思われます。僕も割と朝早くには出たんですが、サン・ピエトロに行く前にパンテオンとかに寄ってしまったので、着いたころにはもう酷い行列でした。

あ、パンテオンはとても良い建物でしたよ。街の真ん中にいきなりどでかい神殿があるの、ほんと日本じゃ考えられないのですげえなと思います。ちなみにパンテオンって天井のど真ん中に天窓として穴が空いているのですが、雨が降っても近代のドームみたいに屋根が閉じるわけではないので、雨が降ると普通に中までびしょぬれになります。が、それはそれとしてとりあえず止むまでは放置しておいて、止んだら掃除するそうです。アナログ最高ですね。

最後に、『地球の歩き方』に「スペイン広場には、日本人を見かけると『ナガトモ〜!』とか言いながら近づいてきて、握手を求めるふりしてミサンガを売りつける押し売りがいる」という情報が載っていたのですが、僕が行った時にもいました。何年前からやってるんだよ、もうちょっと試行錯誤しろよ、と思いました。

総括

ここまでにも何回か書いてますが、まずは暑かったなぁと。日差しがものすごく強いので、なるべく日陰を歩くようにしないと死にます。子供のころにやった「日陰しか歩いちゃいけないゲーム 〜陰以外は全部マグマ!〜」が現実になった感じです。
あと、サマータイムとかいう謎システムのため、12時を過ぎてからもまだまだ日が高くなるし、緯度が日本より高いため、17時18時でも平気で太陽はさんさんと降り注いでいます。

ツアーでなくフリープランで行ったことについては大正解だったなと思います。自分が好きなところで好きなだけ時間を使ってのんびりできたし、3都市ともほぼ徒歩で巡れるくらいの街なので、バスとかでツアー組まなくても簡単に観光スポットまわれるし。

あ、ちなみにローマには「ラツィオ・ポイント」というラツィオの公式ショップと、「ローマ・ストア」というASローマの公式ショップがあるんですが、「ラツィオ・ポイント」はやる気がないのか、それとも土日休業なのか知りませんが空いておらず、「ローマ・ストア」もそんなに広くなく、選手名の入ったユニとかは売ってませんでした。ピアニッチのユニ買おうと思ってたのになぁ。


おわり。

2015年上半期に読んだ本まとめ

この前上半期に観た映画をまとめましたが、今回はせっかくだから読んだ本もまとめときます。
小説(ラノベ含む)とビジネス書籍の混合です。
ただし僕は別に読書家ではないので、そんなにたくさん読んでるわけではありません。あしからず。

レインツリーの国

レインツリーの国 (新潮文庫)

レインツリーの国 (新潮文庫)

個人的評価:★★★★

メッセージがシンプルで、文体も読みやすく、かつ面白かったです。
これについては詳細な感想を以前の記事に書いているので、ここではリンクを貼るに留めておきます。
よろしければどうぞ。

【読書感想文】『レインツリーの国』を読みました - 16bit!

戯言シリーズ

戯言シリーズ 文庫 全9巻 完結セット (講談社文庫)

戯言シリーズ 文庫 全9巻 完結セット (講談社文庫)

個人的評価:★★★

ラノベです。
ビックリするくらい主義主張やメッセージが無い(良い意味で中身が無い)ので、9冊立て続けに読んでも自分の価値観や思想には何の影響もありませんでした。驚くべきことです。
ちなみに西尾維新を読んだのはこれが初めてでしたが、独特の文体はさすがだなと思いました。ああいうのって違う言語に翻訳する時に困るよなぁと。翻訳されたコーランを読んでも本家の文章の美しさを感じられないから、本当に読んだとは言えない、みたいな。ラノベの例えにコーラン使うのも恐れ多いですが。

十二対戦

十二大戦

十二大戦

個人的評価:★★

上半期に西尾維新ばっかり読んでたのは、友人が次々に貸してくれたからです。これは十二支をモチーフにした殺し屋たちがバトルロワイヤルする話で、こちらも案の定中身は無いというか、無いです。ただやっぱ「うまく作ったなぁ」という感じはあって、十二支の後ろから順番(要するに干支決めレースの最下位から順番)に敗退していくし、最後は鼠が勝つのも戦略勝ちみたいな感じだし。
それにしても西尾維新って中身のある話は書かないのか? アニメ観た感じだと少なくとも物語シリーズには中身がありそうなんだけど、本家小説には無いのかな? 機会があれば読んでみたいです。ただし次に読みたいラノベは「なれる!SE」。完結してないから手を出しづらいですが、完結してくれたら買おうと思います。

LOVE・MUSIC

LOVE (新潮文庫)

LOVE (新潮文庫)

MUSIC (新潮文庫)

MUSIC (新潮文庫)

個人的評価:★★★★

古川日出男さんの小説2冊。めちゃくちゃ面白いんですが、ストーリーらしいストーリーというものが無いので、あらすじの説明が全く出来ないのが困るところ。
『LOVE』は「猫を数える話」としか説明できないし、『MUSIC』は「猫の生命力」としか説明できない。
特筆すべきはその独特な文体で、一言で言うとものすごくリズム感がある。本を読んでるだけなのに気付いたら爪先でリズム取ってたので、この文章は正直すごいと思います。
以下に適当なページから数文を引用しますが、だいたいこんな感じ。

ついに残り時間は二時間を切る。
助走は終了。だとしたら。もう飛ぶしかないね。なにしろ、秘密がいっぱいだ。東京の三月のとある春の、こんな小さな区画に、たった七時間の物語のなかに、こんなにも。そして僕たち六人は、それぞれの秘密主義を遵守したままで動き出す。いよいよ、ドバッて。音速で。僕はそんなふうに語る約束を、してたからね。
さて飛ぼう。

いま。いま。現在<いま>しかない。秋。それから美余の足がもっと下方とつながる。走る美余の足が、何かと。走りながら美余は問う、これってなに? 美余は聞いてみる、大地? そう、大地。そこに鳴り響いている。美余の全身、一本の搏動<ビート>と化した肉体と共鳴するものが。これだ、と美余は思う。あたしの本能が求めていたのは、結局のところ、音楽。これ。この瞬間に美余はわかるからわかる。聞こえるから聞こえる。説明なんてできないよ、と思う。

このリズム感、良いなぁ。

夜の床屋

夜の床屋 (創元推理文庫)

夜の床屋 (創元推理文庫)

個人的評価:★★

短編集と見せかけて、実は全部が繋がってる、みたいな話でした。
ただしラストのどんでん返し(?)はミステリというにはちょっと無理矢理感がありますので、ミステリとして読みたいならあんまりおすすめできません。
まぁでも個人的には、こういう「日常系ミステリだと思っていたらいつのまにかファンタジーになってた」みたいなのもアリはアリだなと思います。
全容を解明したと思っていたことが実は全然足りてなくて、間違ってはいないけれども表面しか見えてなくて、世の中には自分が知らない不思議なこともたくさんあって、それらが実は一本の線で繋がっていたとしたら、それは可能性だけであっても、当事者にとっては世界の見え方が変わる最高の体験だろうなと思います。
何言ってるのか良くわかりませんが、「そうきたか!うおー!」みたいなのではなく、「え?そんなのあり得ないでしょ。おかしいでしょ。…でもまぁ、あり得たとしたら世界は面白いね」みたいなことを思いました。

How Google Works

How Google Works (ハウ・グーグル・ワークス)  ―私たちの働き方とマネジメント

How Google Works (ハウ・グーグル・ワークス) ―私たちの働き方とマネジメント

個人的評価:★★★★

Googleにおけるマネジメント手法がメインの内容でしたが、具体的なエピソードもたくさん掲載されていて、とても面白かったです。
ただこれも以前に感想を記事にまとめているので、ここではリンクを貼っておくだけにします。

【読書感想文】How Google Works を読んだ その1 - 16bit!
【読書感想文】How Google Works を読んだ その2 - 16bit!
【読書感想文】How Google Works を読んだ その3 - 16bit!
【読書感想文】How Google Works を読んだ その4 - 16bit!

人工知能は人間を超えるか

個人的評価:★★★★

人工知能の現在・過去・ちょっと先の未来」がものすごく分かりやすくまとめられている本でした。
著者が人工知能、つまりは「学ぶとはどういうことか」を研究しているだけのことはあって、この本自体も、人工知能について何も知らない人でも簡単に学習できるように書かれています。
「学習する」ことはすなわち「分ける」ことであるというのはこれまでも何となく認識してはいたものの、いざ文章として書かれるとハッとしますし、その「分け方」が人によって千差万別だからこそ、同じ知識を入れてもそれを扱うアイデアが異なってくるということにも気付きます。

人工知能は今ブームみたいになっていますが、実際、活版印刷→蒸気機関の次に世界を大きく変えてしまうのは、人工知能なんじゃないかと思っています。これまでのITは時間と手間さえかければ人間でもできることをやっていたに過ぎませんが、人工知能は「人間にはできないこと」をやれるようになるわけで。
個人的には早く人間より優秀な人工知能が開発されて、人間は自分より優秀な知能を活用しながら悠々自適に暮らせるようになれば良いなぁと思っています。

なぜ、この人と話をすると楽になるのか

なぜ、この人と話をすると楽になるのか

なぜ、この人と話をすると楽になるのか

個人的評価:★★★

自分がコミュ障なので読んだ本。ですが、別にこの本は特効薬でもなんでもないので、これを読んだからといって急にしゃべりがうまくなるわけではありません。結局コミュニケーションって経験値が必要なので、装備だけ整えても意味がないのです。
ちなみにコミュ障について、「必要な会話は問題なく行えるが、他愛の無いおしゃべりができないこと」と定義されていて、「あぁそれまさに僕だ」と思いました。でも、そもそもおかしいと思ったこともあって、それは「エレベータで知り合いと出くわした時の会話が無い状態」が普通に「気まずい」とされていたことです。個人的にはこれを気まずいと思ったことは無かったので、そもそも本来そこには不要なおしゃべりがあるべきだという認識すらなかったということになって、もしかしてこれは重度なのかなと思いました。
職場での雑談はすごく大事だと思っているのですが、これはあくまでもお互いの信頼関係の構築や、役に立たなさそうだけど実は後で役に立つかもしれないアイデアの交換のためであって、あんまり「コミュニケーションの目的はコミュニケーションだ」と言われてもピンと来ませんでした。

Tipsとしては、「人は間違いを訂正する時に一番しゃべる生き物→だから間違っているかもしれないこともどんどん喋れ」といったことや、「自分の欠点をツッコミOKにしてしまうことで、戦略的に自分のキャラを作れる」といったあたりが面白かったです。特に後者なんか本当にその通りだよなぁと思います。自分の周りで雑談がうまい人を思い出してみても、基本的にはイジられることを許容している人ばっかりだし。

おわりに

というわけで2015年上半期に読んだ本の感想をざっくりまとめました。
それぞれ数行の感想なので足りない点も多いですが、ひとまずこれにて終わります。
それにしても小説が14冊でビジネス書籍は3冊か、ビジネス書籍の少なさがやばいですね…。

おわり。

【js】Parse.QueryのmatchesKeyInQueryを使う

Parse.QueryのmatchesKeyInQueryが便利なのでメモしておく。

https://parse.com/docs/js/api/symbols/Parse.Query.html#matchesQuery
https://parse.com/docs/js/api/symbols/Parse.Query.html#matchesKeyInQuery

ParseはデータをJSONライクな形式で保存しているKVS型のDBを使ってますが、
matchesQueryやmatchesKeyInQueryは簡単に言うと、RDB型のDBに対してSQLで行う、「他のテーブルと結合してデータを絞り込む」的なことを簡単に実現するためのAPIです。

・matchesQuery(key, query)
・matchesKeyInQuery(key, queryKey, query)

両社は引数の数が違っていて、matchesQueryが引数のクエリと本クエリとで一致させたいkeyの名称が同じ場合に使い、
matchesKeyInQueryはkeyの名称が違う場合に使えます。
ざっくり言うと、matchesKeyInQueryの方が引数が多い分より汎用的です。

サンプル

ユーザーごとに受講している授業(Lesson)が複数ある。ユーザーと受講している授業のマッピングは受講(Attend)情報としてまとめられている。
この時に、ログイン中のユーザーが受講している授業の一覧を取得する。

var Lesson = Parse.Object.extend("Lesson");
var Attend = Parse.Object.extend("Attend");
var query = new Parse.Query(Lesson);
var innerQuery = new Parse.Query(Attend);
	
innerQuery.equalTo("username", Parse.User.current().getUsername());
query.matchesKeyInQuery("objectId", "lessonId", innerQuery);
query.find({
	success: function(results) {
		//hogehoge
	},
	error: function(error) {
		//fugafuga
	}
});

innerQueryで、ログイン中のユーザー(Parse.User.Current())に関するAttend情報を絞りこみ、
AttendのlessonIdとobjectIdが一致するLesson情報を取得している。
このように、他のObjectのobjectIdをキーにしてマッピングしているような場合も、mathcesKeyInQueryを使えば簡単に欲しいデータを取得できる。

おまけ

Parseを使っていると、上記のようにObject間の結合みたいなことが簡単にできたり、コンソールがExcelライク(つまりRDBライク)だったりして、
RDB的な思考回路のままさくさく使えるようになってるなぁと感じます。
便利だね。


おわり。