16bit!

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

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

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

https://codeiq.jp/lp/horiemon/

と言っても企画自体は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を信仰しているので、死ぬまでにヴェネツィアには行かなきゃなぁと思っていたのもあります。

プラン

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

持ち物

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

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

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

ワインオープナー/ソムリエナイフ(役立ち度:★)
食費とかをケチる気満々だったので、ホテルの近所のスーパーとかでおつまみ的な総菜(生ハムやフルーツなんかが割と安い)とワインを買ってホテルで飲もうとか、スーパーで買ったワインボトルを広場に持っていって木陰とかで飲みながらのんびりしよう、とか思ってたんですが、暑すぎてワインどころじゃなかったです。気温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冊立て続けに読んでも自分の価値観や思想には何の影響もありませんでした。驚くべきことです。
ちなみに西尾維新を読んだのはこれが初めてでしたが、独特の文体はさすがだなと思いました。ああいうのって違う言語に翻訳する時に困るよなぁと。翻訳されたコーランを読んでも本家の文章の美しさを感じられないから、本当に読んだとは言えない、みたいな。ラノベの例えにコーラン使うのも恐れ多いですが。

十二対戦

個人的評価:★★

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

LOVE・MUSIC

個人的評価:★★★★

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

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

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

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

夜の床屋

個人的評価:★★

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

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的な思考回路のままさくさく使えるようになってるなぁと感じます。
便利だね。


おわり。

2015年上半期に観た映画まとめ

普段はそれほど映画観る人ではないんですが、2014年に観たのが「たまこラブストーリー」とか「アナと雪の女王」とか「アイカツ」とかで、振り返ってみて我ながらちょっと酷いなと思ったので、今年は毎月1本アニメ以外の映画を観ることを抱負として掲げることにしました。
というわけで、今年前半で6本のアニメじゃない映画を観たわけですが、せっかくなので簡単な感想メモと共にまとめておきます。

※一部ネタバレも含みますので、ご注意ください。

1月『ゴーン・ガール


ニックとエイミーの結婚5年目の日、妻のエイミーが消えてしまう。警察による事件の捜査が始まるが、夫ニックに不審な点が見つかり、彼が容疑者として疑われることになる。ニックは自身の無実を訴えるが…。

個人的評価:★★★★★

2014年公開の映画ですが、1月に観たのはデヴィット・フィンチャー監督の『ゴーン・ガール』でした。
出来はひとことで言うと最高で、なんなら結婚するカップルと結婚した夫婦全員に見て欲しいくらいです。

「結婚生活のすれ違い」と言えば大したことない問題に聞こえますが、この映画が表現しているのは基本的にはそれで、結婚が持つ本質のひとつの側面を切り取ってサスペンスとして表現した作品だと思います。最後の方で、「お互いに主導権を奪い合って云々かんぬん」みたいな台詞の後に「That's marriage(それが結婚よ)」みたいな台詞があるんですが、個人的にはすごく納得したし共感しました。まぁ自分独身なんですけどね。
一部では「こんなに恐い女はいない」とか言われてますが、多少誇張されてるだけで割とこんなもんなんじゃないなかなぁと思いますし、夫側の情けなさや甲斐性のなさ、浮気してしまうダメさなど、ある意味リアリティあるなぁと思いました。
結婚には『アマガミ』みたいな光の面もあれば、この作品のような闇の面もあるのです。自分独身だから分かんないけど、たぶん。

2月『ANNIE』



個人的評価:★★

2月に観たのは『ANNIE』。世界的に有名なミュージカル作品なので、あらすじは不要かと思います。
正直2ヶ月目にしてあんまり観たいものがなくて、またじっくり探す時間もなかったのもあって、ひとまず教養として観た感じが強いです。
音楽は悪くない。歌はすげーうまい、特にアニー役の子はびっくりするほどうまい。元気も出る。ファンタジー
みんなが大体のストーリーは知っているので、ストーリーではなく歌と音楽で作品として成り立たせたのかな?って印象でした。

3月『イントゥ・ザ・ウッズ』


赤ずきん」「シンデレラ」「ラプンツェル」「ジャックと豆の木」といった世界的に有­名なおとぎ話の主人公たちのその後を描く、ディズニー製作のミュージカル。ブロードウ­ェイで上演され、トニー賞を受賞したミュージカルを基に、『シカゴ』『NINE』など­のロブ・マーシャルが映画化。

個人的評価:★

3月は『イントゥ・ザ・ウッズ』。これも正直観たいものを探す時間がなかった感が否めません。
だからもともと期待値は低くしてたつもりだったんですが、観た感想としてはそれを下回ってきました。
評価できる点は、「シンデレラで描いた幸福とは何なのか問題」や「ラプンツェルで描いた親から子への愛情とは何なのか問題」など、各物語ごとのごちゃごちゃした色んなテーマを混ぜ込んだまま、何とか公開できる作品として作り上げたことくらいでしょうか。

4月『エイプリルフールズ』



個人的評価:★★★

4月は邦画にして、『エイプリルフールズ』を観ました。
エイプリルフールに色んな人が嘘をつく話なんですが、せっかくなら最終的に全部の嘘がもっとちゃんと繋がると良かったのになと思います。単発だったり、繋がりが中途半端だったりして、やや作り込みの雑さを感じました。
ただ、良い嘘と悪い嘘、嘘も方便みたいな嘘や全く必要ない嘘など、色んな嘘がそれぞれ描かれてたと見れば別に良かったのかな。
いやまぁそれでもエンターテイメントとして作るんだから、やっぱり全部が繋がって「うおーそうなるのか!」みたいなのが欲しかったですね。あのラストだけだと正直足りない。
面白さとしては可もなく不可もなく、です。

5月『セッション』


名門音楽学校へと入学し、世界に通用するジャズドラマーになろうと決意するニーマン(マイルズ・テラー)。そんな彼を待ち受けていたのは、鬼教師として名をはせるフレッチャー(J・K・シモンズ)だった。ひたすら罵声を浴びせ、完璧な演奏を引き出すためには暴力をも辞さない彼におののきながらも、その指導に必死に食らい付いていくニーマン。だが、フレッチャーのレッスンは次第に狂気じみたものへと変化していく。

個人的評価:★★★★★

5月は『セッション』。これまたひとことで言って最高の映画でした。
フレッチャー役のJ・K・シモンズもニーマン役もはまってて、最初から最後まで圧倒されっぱなしでした。すごすぎて。
え!? お前ここで車にひかれるの!? 交通事故の伏線ここで回収するの!?」みたいな。

天才を作り上げるには狂気じみた指導が必要で、「獅子は我が子を〜」じゃないけど、めちゃくちゃ厳しい状況や圧倒的な挫折を乗り越えないと、常識破りの天才っていうのはなかなか出てこない。現代の教育ではこういう超スパルタはむずかしい(潰れちゃった時に誰に責任がいくのか良くわからない。そして大抵は潰れる)ですが、音楽業界だけでなく、教育全般に対するひとつの警鐘なんじゃないかと思います。

もちろん音楽もすごくて、映画館の音響で聴くと聞き応え十分でした。あとで知ったんですが、アカデミー録音賞取ってるだけのことはある。
あと唐突にスタバで流れてるジャズのCDがディスられたの面白かったです。

ちなみに監督のデイミアン・チャゼルは28歳でこの作品を撮ったらしくて、この人がどんな才能の磨き方をしてきたのか、どんな指導を受けてきたのかは知りませんが、純粋にすげえなと思いました。

6月『マッドマックス 怒りのデス・ロード』



個人的評価:★★★★

で、6月が今話題の『マッドマックス』。
これはマッドマックスシリーズの一応4作目という位置づけですが、正直前作を観てる必要はないです。
世紀末感満載の世界で、銃と火炎放射器をぶっ放しながら2時間丸々カーチェイスするという映画なので。
しかも同じ道を行って戻ってくるからね。なんじゃそりゃ。

全体的に観るのに左脳を全く使わないのがすごく良かったです。「ヒャッハー!ガソリンだー!!」って感じ。
荒廃した世界に対して無駄に色んな時代背景をねじ込んできたりせず、ただただ純粋に「この世界は荒れ切っています」なので、こちらとしても「あぁそうなんだ。そりゃもう車走らせるしかないよな(意味不明)」みたいになります。
あとタイトルは「マッドマックス」ですが、狂ってるのはマックスだけじゃなくて、大体みんな狂ってます。
個人的にはトラックの前で火炎放射器搭載したツインギター弾いてるやつが最高にバカっぽくて最高でした。

f:id:sakuramochi702:20150628005455j:plain

こいつ最高。

まぁでも見終わって思ってみると、「この世界は荒れ切っています。救いはありません」みたいな雰囲気出しといて、なんだかんだ希望の物語だったので、よくわかんないけどすごい映画だったのかもしれません。

番外編『ラブライブ!The School Idol Movie



個人的評価:★★★

劇場版ラブライブ!が非常に良かったので最後に番外編。
(評価が★3なのは、純粋に映画として見ると別に大したものではないからです)

初日に観に行ったんですが、観ながら「やっぱラブライブすげえな…」ってなりました。
個人的な感想として、アニメ「ラブライブ!」って作品は、基本的にはμ'sというアイドルグループを最も魅力的に見せるために作られた物語だと思っていて、あれを見る時、視聴者はμ'sと同じ空間にいるんじゃなくて、あくまでも画面を通してμ'sを見ている状態っていうのが徹底されてる。
ことりちゃんが左下から覗き込んだりほのかちゃんが走ってくるシーンでカメラがくるくる回転するのとかがまさにそれを表していて、その作りはもちろん映画でも継承されていました。
だからこそ凛ちゃんはいきなり歌いだすし、謎の女性シンガーも出てくるし、もっと言えばにこまきが百合百合する。
最後に劇場版で海外行くとかなると、何となく「けいおん!」とか思い出すけど、あれとは根本的に構造が違いますね。

日本帰ってきてから秋葉原で「スクールアイドルみんなのためのライブ」みたいなのもやるけど、あれもやっぱりμ'sのためのライブであるという感じが満載。徹頭徹尾、ラブライブはμ'sのための作品だと思います。


宣伝に“金も時間もかけた”映画『海街diary』が『ラブライブ!』に惨敗

あとは蛇足ですが、この前なんかニュースで「海街diaryラブライブに負けたの、映画界的に衝撃大きい」みたいなのを見たんですが、個人的には「そんなの当たり前じゃない?」と思います。『海街〜』は確かに色んな番組で宣伝もしてたし、カンヌとか出てて多少話題もあったでしょうが、その公開を心待ちにしてた人はほとんどいなかったと思うので、初速の爆発力が違うのは当然だと思います。
だいたい女優と宣伝で興行収入決まる時代じゃないと思うし、そんなことはとっくに痛感してると思ってたんですが・・・。

おわりに

というわけで2015年上半期に見た映画のまとめでした。
下半期は何か面白いのあるでしょうか?今のところだと、2015年個人的に最高の映画は『セッション』になりそうですが、それを超える映画に出会えると良いなぁ。

おわり。