秘密の本棚

気になることをなんでも書きます

ニュージーランド周遊の旅⑪:マウント・クックで氷河を見ながらハイキング!

 前の記事:ニュージーランド周遊の旅⑩:クイーンズタウンの見どころ!

ワナカ湖畔でのんびり

クイーンズタウンから北東に進むと、1時間ほどでワナカという都市に到着します。ワナカはニュージーランドで4番目に大きい湖であるワナカ湖に面していて、湖でのアクティビティや湖畔のレストランでの食事を楽しめます。僕は初めて立ち乗りのボードに挑戦してみましたが、海と違って波もなく穏やかなので安心して乗ることができました。湖で遊んだあとは湖畔のバー兼レストランでカクテルを飲むのが最高です。

f:id:nexusuica:20180823000759j:plain

落ち着いた雰囲気の砂浜。遊具をレンタルできる

ワナカでは「Clearbrook Motels Wanaka」というモーテルに宿泊したのですが、部屋の目の前に小川が流れる庭が広がっていて、とても綺麗で素晴らしいところでした。一泊だけだったのが残念なくらいでした。 

f:id:nexusuica:20180823000908j:plain
f:id:nexusuica:20180823000909j:plain
部屋から庭を望めるのが素晴らしい。カモが住んでいるようだった

f:id:nexusuica:20180823000911j:plain

夜のライティングも非常に綺麗だった

氷河を望むマウントクック

ワナカからさらに北東に進み、プカキ湖を右手に見ながらマウント・クックを目指します。この道は非常に眺めが良いので、途中で車を停めて景色を存分に味わいましょう。

f:id:nexusuica:20180823001050j:plain

ドライブ中に見える、エメラルドブルーのプカキ

プカキ湖を後にしてさらに走ると、目前に氷河が見えてきます。ここまで来るとハイキングコースのスタート地点はもうすぐです。

f:id:nexusuica:20180823001056j:plain

眼前に氷河が迫ってくる

フッカー・バレーのハイキングへ出発!

マウント・クックは、ニュージーランドでも数少ない氷河を観察できる場所で、フッカー・バレーの散策路はその中でも特に代表的なハイキングコースです。キャンプ場から出発して往復4時間ほどのコースで、大自然に囲まれながら快適なハイキングを楽しめます。アップダウンもそれほどないので、体力に自信がなくても大丈夫です。

f:id:nexusuica:20180823002228j:plain

実際に感じるスケール感はもっと大きい

f:id:nexusuica:20180823002106j:plain

基本的に水はいつも濁っているそうだ

f:id:nexusuica:20180823002134j:plain

つり橋が途中3つあり、ペースの目安になる

つり橋を何回か渡りながら、氷河を抱くマウント・クックに迫っていきます。ハイキングコースの終点は氷河湖で、季節によっては氷河がたくさん浮いているそうです。訪れたのは夏だったのでほとんど氷河は浮いていませんでしたが、氷河をたたえたマウント・クックはバッチリ見ることができました。

f:id:nexusuica:20180823002110j:plain

マウント・クックの氷河湖。なんと泳いでいる人もいた

マウント・クックのハイキングは、晴れていればニュージーランドの自然を自分の足で歩いて感じられてとてもおすすめ。ヘリコプターで氷河に降り、氷河の上を歩くツアーもあるそうです(かなり値が張りますが)。ただし、マウント・クックは宿泊施設が少なく、予約を取るのが至難の業です。今回のようにワナカからアクセスするのも悪くないと思います(テカポからも比較的近いです)。

次回は旅の最後に、世界で最も星が綺麗といわれる、テカポに向かいます。

nexusuica.hatenablog.jp

OK Google, パソコンつけて。

Google Assistantにパソコンをつけさせたい

前の記事ではRaspberry Piをセットアップしましたが、今回からはこれを使ってホームオートメーションを進めていきます。今回取り組むのはパソコンの電源操作の自動化です。目指す形としては、Google AssistantにOK Google, パソコンつけて」と言うとパソコンが立ち上がるというものです。
nexusuica.hatenablog.jp

必要なステップに分解する

Google Assistantからパソコンの電源をつけるまでに必要なステップは、以下の4つです。

  • Google Assistantがフレーズを解釈してIFTTTをトリガーする
  • IFTTTがBeebotteにWebhookを投げる
  • Raspberry PiがBeebotteを監視してデータを取得する
  • Raspberry PiがLAN経由でPCの電源を起動する

それぞれのステップを作ればうまく動くはずです。

Google Assistantがフレーズを解釈してIFTTTをトリガーする

IFTTTは様々なサービスを連携させることができる超便利なツールで、「もしAならBする」ということを指示しておくと勝手にやってくれるツールです。
ifttt.com
今回であれば、「Google Assistantが『パソコン入れて』という文字列を受け取ったら」という条件付けを行います。この設定は以下のサイトを参考にします。
qiita.com
特に難しいことはありません。

IFTTTがBeebotteにWebhookを投げる

次に、IFTTTの動作を定義します。今回は、Beebotteというサービスを利用します。これは、Webhookを受け付けて出力してくれるサービスで、IFTTTから動作させることができます。ここの設定もさきほどのリンクを参考にします。

Raspberry PiがBeebotteを監視してデータを取得する

あとはRaspberry Pi側での処理です。Beebotteの監視のためにPAHO-MQTTをインストールし、Pythonでプログラムを書きます。ここの部分もさきほどの記事を参考に。

Raspberry PiがLAN経由でPCの電源を起動する

ここまでできれば、あとはRaspberry PiWake On Lanの処理を行わせます。Wake On Lanとはパソコンにある特定のパケットを投げると電源を投入してくれる機能のことで、今回はRaspberry Piから同一のLAN内に接続されているパソコンに対して特定のパケットを送信させます。Wake On Lanを使用するためには使用するパソコンのMACアドレスが必要ですので、調べておきます。また、パソコン側での設定も必要で、以下の記事を参考にします。
www.taneyats.com
worktoolsmith.com
ただしMacの場合は完全な電源OFFではなく、スリープからの復帰しかできません。また、Macは放っておくと2時間毎に勝手にスリープから復帰してしまうので、「PleaseSleep」というアプリを用いて強制的にスリープ状態を維持させます。
download.cnet.com
Raspberry Pi側では、「wakeonlan」というパッケージを利用します。先ほどのプログラムを以下のように書き換えます。IFTTTが投げるWebhookで、Macを起動する場合"action"に"mac_on"を、Windows PCを起動する場合"action"に"pc_on"をそれぞれ指定しているとします。

import paho.mqtt.client as mqtt
import json
import subprocess

TOKEN = "<Beebotteのトークン>"
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
TOPIC = "<Beebotteのチャンネル名>/<Beebotteのリソース名>"
CACERT = "mqtt.beebotte.com.pem"

def on_connect(client, userdata, flags, response_code):
    print('status {0}'.format(response_code))
    client.subscribe(TOPIC)

def on_message(client, userdata, msg):
    data = json.loads(msg.payload.decode("utf-8"))["data"][0]
    print(data)
    for key, value in data.items():
        if key == "action" and value == "mac_on":
            print("mac mini turning on...")
            for x in range(0,10):
                subprocess.call("sudo wakeonlan -i 192.168.3.255 <MacのMACアドレス>",shell=True)
        if key == "action" and value == "pc_on":
            print("desktop pc turning on...")
            for x in range(0,10):
                subprocess.call("sudo wakeonlan -i 192.168.3.255 <PCのMACアドレス>",shell=True)

client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(CACERT)
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

これでちゃんと動いてくれます。マジックパケットを10回連続で送っているので、失敗することはまずありません。これで外出先からでも「パソコンつけて」と言えばパソコンが起動するようになります。リモートデスクトップを多用している僕にとっては非常に便利です。

ニュージーランド周遊の旅⑩:クイーンズタウンの見どころ!

前の記事:ニュージーランド周遊の旅⑨:ミルフォード・ロードの立ち寄りスポットを紹介!

市街地は観光の拠点

ミルフォードサウンドの玄関口であるテ・アナウからクイーンズタウンまでは片道2時間。急カーブも多く気が抜けないので、しっかり休憩をとっていきたいところです。

クイーンズタウンが面するワカティプ湖を沿うように、断崖絶壁のところを縫うように走る区間もあってハラハラします。制限速度をしっかり守って慎重に。

f:id:nexusuica:20180820230046j:plain

わかりにくいが左側が道路、崖の下は湖に真っ逆さま。

クイーンズタウンニュージーランドを代表するリゾート地で、冬はスキーができるほか、夏には様々なアクティビティの拠点となります。参加したいくつかをご紹介します。

スカイラインに乗って「あの眺め」を手に入れる

ワカティプ湖に面するクイーンズタウンは、港近くに飲食店や雑貨店、旅行代理店などが集中しています。湖の水はかなりきれいでした。

f:id:nexusuica:20180820230625j:plain
f:id:nexusuica:20180820230627j:plain
クイーンズタウンの港と中心部。大通り以外は車通りがほとんど無い

その中心部から歩くこと約10分で、ロープウェイのスカイライン山麓駅に到着します。チケットを購入してロープウェイに乗車し、およそ8分ほどで頂上に到着。展望台から見えるのは、クイーンズタウンのガイドブックに必ずといっていいほど載っている風景です。

f:id:nexusuica:20180820230620j:plain

まさにクイーンズタウン、といった風景

晴れていれば湖の青が映えて非常に美しいです。夜景もとても綺麗だそうです。

ニュージーランド版ゴーカート「リュージュ」で遊ぶ

スカイラインに乗って登ったあとは、いくつかの選択肢があります。一つは、頂上のレストランストラトスフェア」での食事です。クイーンズタウンでやるべきことの1つとされているくらいで、特にディナーは夜景を見ながらロマンチックなものだそうです。ただ、今回はデートで来ているわけではないのでパス。

代わりにアウトドアのアクティビティとして、マウンテンバイクもあります。非常に多くのコースが用意されていて、頂上から一気に麓まで駆け下りる爽快感は素晴らしいでしょう。眺めも良いそうです。ただ、これは同行者が怖がったのでパス(笑)。

そこで今回チャレンジしたのが、リュージュというゴーカートのような乗り物を操作しながら斜面のコースを駆け下りるというもの。実際にやってみるまでどのようなものかわからなかったですが、これが想像以上に楽しいです。

リュージュにはハンドルとブレーキが付いていて、この2つで操作します。スピードを上げて風を感じながら、斜面のコースをうまく下りていけると非常に爽快です。座面の位置が地面すれすれなので、実際のスピード以上に速度感がありました。友人と競走しながら下っていくのはかなり盛り上がりました。ただ、スピードを上げすぎると曲がりきれずに壁に激突して普通に怪我するので、ほどほどが重要ですね。

f:id:nexusuica:20180820230612j:plain

コースは初級と上級がある

大人気!ジェット船で風を感じる

クイーンズタウンを代表するアクティビティとして、ジェット船で湖を周遊するツアーがあります。

ライフジャケットを身に着けてジェット船に乗り込み、あとは船長に操縦を任せるだけ。時速100km近くにもなるジェット船の船上は水しぶきと暴風が吹き荒れ、国籍問わず盛り上がります。湖から少し遡上して川に入ると、緑のトンネルのような美しい風景も見られました。

f:id:nexusuica:20180820230614j:plain
f:id:nexusuica:20180820230615j:plain
基本的に乗って身を任せるだけ。次に何が起こるかわからないスリル感も味わえる

1時間のツアーなので少し短く見えますが、体感的にははしゃぎ疲れて結構長く感じました。誰でも満足できる内容だと思います。

船をチャーターして自分で操縦する!?

完全に組まれているツアーに参加するのもよいですが、ちょっとここで変化球。ワカティプ湖で小型のボートをレンタルして、乗り回してみることにしていました。レンタルしたのは中心部から車で10分ほどのところの「Water Sport World」というところ。ホームページの作りも簡素で、果たしてうまく借りられるだろうかと不安でしたが、行ってみたら普通に大丈夫でした。

小型の「STABI CRAFT」という5人乗りのボートを半日レンタルしました。$400かかりましたが、クイーンズタウンの物価に麻痺していると何も感じません。

f:id:nexusuica:20180820230617j:plain
f:id:nexusuica:20180820230618j:plain
自分の船さえあればどこへでも行けちゃうのだ!

係員から地図を受け取り、簡単な説明が終わると湖に放たれます。自分たち以外、船には誰も乗っていない状況。日本でこんな事がありえるのでしょうか…?

まず困ったのは、エンジンの入れ方がわからなくなってしまったこと。岸からどんどん離れていっている状況で、これはかなり焦りました。落ち着いてニュートラルに入れてエンジンキーを回せばつきました(笑)。

ボートのレンタルでは、どこへ行くかは完全に自由。スピードも出そうと思えばかなりのスピードが出ました(怖くてフルスロットルにはできませんでした)。水の上でこんな自由が与えられたことに、若干困惑してしまいます。

この日は天気があまりすぐれず、風が強かったため湖面には白波が立ち、油断していると船上はかなり揺れて命の危険を感じました。用意されたアトラクションでないぶん本当に怖かったですが、こんなスリルが味わえるのもチャーターならではでした。

f:id:nexusuica:20180820230623j:plain
f:id:nexusuica:20180820235359j:plain
こんな写真も撮れちゃうのだ!

人気のファーグバーガーでお腹を満たす!

クイーンズタウンは多くのバーやレストランがありますが、有名なハンバーガー店「ファーグバーガー」クイーンズタウンに行くなら一回は食べたいという代表的な店。いつも行列ができています。メニューはたくさん用意されていますが、迷ったら一番安い「ファーグバーガー」でよいでしょう。パティとレタス、トマト、オニオンが入っていて、決め手はソース。たっぷり入っている甘めのソースがかなりクセになる美味しさで、滞在中にリピートしてしまいました。行列ができるのも納得です。行列ができていてやや敬遠してしまいますが、作るのが早いので20分も見ていれば大丈夫です。

f:id:nexusuica:20180820230632j:plain
f:id:nexusuica:20180820230631j:plain
ボリューミーでこれだけで十分満腹

 以上、クイーンズタウンのご紹介でした。クイーンズタウンからミルフォードサウンドに一日かけて行くツアーや、船で渡って農場体験するツアーなど、他にも有名なツアーがあります。また、キウィが見られる動物園がスカイライン山麓駅のすぐそばにあります。これくらいおさえておけば完璧でしょう。

次回はマウント・クックで氷河を見ながらのハイキング!!です!!

nexusuica.hatenablog.jp

AtCoder Beginner Contest 106

AtCoder Beginner Contest 106 - AtCoder

A - Garden

問題

A - Garden

考察

 A、横 Bの長方形から縦 A、横 1の長方形と縦 1、横 Bの長方形を切り取った残りの面積を求める。これらの長方形は平行移動しても残りの面積が不変であるから、端に寄せれば残りは縦 A-1、横 B-1の長方形となる。

コード

int main(){
  ll a,b;
  cin >> a >> b;
  cout << (a-1)*(b-1) << endl;
  return 0;
}

B - 105

問題

B - 105

考察

 1以上 N以下の奇数で約数を8個もつものの個数を答える。約数の個数をカウントする関数を書いて、ループで回せばよい。

コード

ll cnt_n(ll n){
  ll cnt = 0;
  for(int i = 1; i <= n; i++){
    if(n%i==0) cnt++;
  }
  return cnt;
}
 
int main(){
  ll n;
  cin >> n;
  ll cnt = 0;
  for(int i = 1; i <= n; i+=2){
    if(cnt_n(i)==8){
      cnt++;
    }
  }
  cout << cnt << endl;
  return 0;
}

C - To Infinity

考察

与えられた文字列に対し、1以外の文字は無限に付け足されると考えてよく、そのとき K文字目に何が現れるかを答える。したがって左から順に見ていって K文字目までに1しかなければ答えは1だが、それ以外の文字が現れたら即時にその文字が答えとなる。

コード

int main(){
  str s;
  cin >> s;
  ll k;
  cin >> k;
  REP(i,s.length()){
    if(s[i]!='1'&&k>i){
      cout << s[i] << endl;
      return 0;
    }
  }
  cout << 1 << endl;
  return 0;
}

D - AtCoder Express 2

考察

区間 \left[1,N\right]に含まれる M個の区間が与えられ、その後 Q回別途与えられる区間内に、 M個のうちいくつの区間が含まれるかをそれぞれ答える。 Q 10^5まで大きくなりうるので、各クエリに対しては O(N)以下で答える必要がある。
各クエリに対して O(1)で答えるには、区間 \left[p,q\right]に含まれる区間の個数を配列 A[p][q]としてもっておけばよい。この配列を効率よく計算する方法を考える。
 M個与えられる区間のうちの1つを \left[l_i,r_i\right]とする。ここで、この区間が答えとしてカウントされるようなクエリの条件は、クエリを \left[p,q\right]として p\leq l_i\text{かつ}q\geq r_iである。したがって、これを満たすようなすべての (p,q)に対して A[p][q]を1加えるという操作を行えば、配列 Aが完成する。しかし、これに必要なオーダーは O(N^2)となって、 M個の区間に対して繰り返すには大きすぎる。
そこで、区間 \left[l_i,r_i\right]に対して加算される Aの範囲は長方形であることに着目する。このような場合、累積和を用いるとオーダーを落とすことができる。 Aと同じサイズの配列 Bを用意し、先ほどの1加える範囲の最初に +1を、最後に -1を行ごとに置いておく。すると、 Bの累積和を取っていけば求めたかった Aが現れる。 Bの生成が O(MN)、累積和の計算が O(N^2)なので間に合う。

コード

int main(){ll n,m,q;
  cin >> n >> m >> q;
  ll array[n][n+1];
  ll sum[n][n+1];
  fill(array[0],array[n],0);
  REP(i,m){
    ll l,r;
    cin >> l >> r;
    l--, r--;
    for(ll k = 0; k <= l; k++){
      array[k][r]++;
      array[k][n]--;
    }
  }
  ll val = 0;
  REP(i,n){
    REP(j,n+1){
      val += array[i][j];
      sum[i][j] = val;
    }
  }
  REP(i,q){
    ll p,q;
    cin >> p >> q;
    p--, q--;
    cout << sum[p][q] << endl;
  }
  return 0;

雑感

今回は運良くかなり好調で、24分で全完できました。累積和が使える問題の頻度は結構高い気がします。
継続は力なりなので、毎週参加していきたいです。