板門店に行ってみた 韓国5泊6日 旅行記① 計画編
また旅行記に戻ります.
2016年の9月,5泊6日の旅程で韓国に行きました.今回の旅行の最大の目的は北朝鮮との境界線上に位置する板門店の訪問.
また、日本からの移動手段には大阪-釜山のフェリー(パンスタークルーズ)を選択。5泊のうち2泊は船上でした.
人生初の韓国(そして北朝鮮)旅行は楽しいものとなりました.その様子をお伝えします.
スマホの事情で写真が少ないのですが,大目にみて頂ければ...
旅程
9/14 出国(@東京,大阪)
9/15 韓国入国・釜山観光(@釜山)
9/16 ソウルへ移動(@釜山,ソウル)
9/17 板門店・DMZ観光(@ソウル,板門店)
9/18 釜山へ移動,出国(@ソウル,釜山)
9/19 日本入国(@大阪,東京)
旅行の契機
韓国旅行の契機は,友人から送られてきた送られてきた一通のLINE「くまぽんで韓国行きフェリーが安く手に入る」というものでした.
そのくまぽんのページがこちら(現在は販売終了).
kumapon.jp
大阪南港に停泊するフェリー
フェリーはサンスターラインという会社が提供しているもので,大阪-釜山を18時間30分で結んでいます.船の名前はパンスタードリーム.この船のデラックススイートが通常往復5万円のところ15800円となります.(食事はコース料理からビュッフェにグレードダウンしますが)
この安さと海外に船で行く経験ができることに惹かれ,旅行を決意しました.
www.panstar.jp
フェリーの運行日と相談し,水曜日(9/14)に大阪を出港する便で日本を立ち,日曜日(9/18)に釜山を出港する便で帰国することとしました.つまり韓国では3泊4日.ところでこの時期は韓国の旧盆「秋夕(チュソク)」.韓国ではこの時期は家族一緒に過ごすらしく商業施設も休み.いわゆる普通の観光が出来なくなる可能性がありました(実際は杞憂でしたが).
japanese.visitkorea.or.kr
そこで休日など関係のない状態が残念ながら続いている板門店・DMZを観光するツアーに参加することにしました.
後はホテルの手配,釜山-ソウル間の交通手段の手配,海外WiFiの手配を済ませて旅行初日を待ちます.
わかりやすさのため,旅行記は次の記事から始めます.
次の記事はこちら
liberaldays.hatenablog.com
一行ごとのJSONをRで読み書きする.
久しぶりに旅行記以外のものを執筆します.
データ入出力の形式として現在はJSONがとにかく広く使われている気がします.私のプロジェクトでもJSONを頻繁に使うのですが,1行毎にJSONのオブジェクトが格納され末尾にカンマがないという,ちょっと特殊なJSON(一行JSONと勝手に呼んでます)をRで読み書きする機会があったのでそのやり方をまとめておきます.
同様のことをpythonでやっている人は発見しました.
qiita.com
また,jq コマンドというjson操作に特化したコマンドを使用して処理する方法もありました.
qiita.com
ただjqコマンドを入れられない環境もあったので,使わない方法でアプローチします.
よくあるJSONはこんな感じ.
[ { "foo" : 10, "bar" : 20, "arr" :["a","b"] }, { "foo" : 30, "bar" : 40, "arr" :["c","d"] } ]
Rではjsonliteパッケージで読み込めます.
df <- jsonlite::fromJSON(txt='./sample.json') print(df)
| foo| bar|arr | | 10| 20|a, b | | 30| 40|c, d |
一方で今回読み書きしたいJSON(一行JSON)は次のような形式です.
{"foo" : 10,"bar" : 20,"arr" :["a","b"]} {"foo" : 30,"bar" : 40,"arr" :["c","d"]}
この形式をアプリケーションのログファイル等で使用すると便利なのですが,(少なくともjsonliteでは)想定されていない形式のためそのまま読み書きすることは出来ません.
具体的には,
- ファイルの先頭,末尾に[]がない
- 各行末尾に「,」がない
という違いがあります.
そこでシェルスクリプトを噛ませてjsonliteで対応可能な形式に変換を行います.
読み込む
{"foo" : 10,"bar" : 20,"arr" :["a","b"]} {"foo" : 30,"bar" : 40,"arr" :["c","d"]}
上のようなデータを次のシェルスクリプトで変形します.
#!/bin/bash #convertJSON.sh LF=$(printf '\\\012_') LF=${LF%_} sed '/^$/d' $1 | sed -e 's/}{/}'"$LF"'{/g' | sed "s/$/,/g" | sed "1s/^/[/" | sed '$s/},/}]/'
$1が読み込みたいデータのファイルパスで,sed '/^$/d'で空行を削除,sed -e 's/}{/}'"$LF"'{/g'で一行に複数データが書き込まれていた際データ毎に改行させます.
sed "s/$/,/g" | sed "1s/^/[/" | sed '$s/},/}]/'でファイル先頭,末尾への[]の挿入と,各行末尾への「,」の挿入を行っています.
(/bin/shでなく/bin/bashを呼び出してるのは改行が上手くいかなかったから...のはずですが再検証したらshでも動いた.)
JSON入力の全操作をRで完結させるため,上のスクリプト(convertJSON.shとします)を使い関数readMyJSONを作成しました.
readMyJSON <- function(jsonFile){ jsonTmp <- tempfile() system(paste0('./convertJSON.sh ',jsonFile,'> ',jsonTmp)) df <- fromJSON(jsonTmp) try({file.remove(jsonTmp)}) return(df) }
この関数を使うと一行JSONのファイルを普通のJSONに変換,jsonliteで読み込みデータフレームとして返してくれます.
書き込む
データフレームを一行JSON形式で書き込むためには,jsonliteで一度普通のJSONで書き込んだ後,シェルスクリプトで整形します.
以下が使用した関数writeMyJSONとシェルスクリプトwriteJSON.shです.
writeMyJSON <- function(df,filename){ jsonData <- toJSON(df) jsonTmp <- tempfile() write(jsonData,file=jsonTmp) system(paste0('./writeJSON.sh ',jsonTmp,' > ',filename)) try({file.remove(jsonTmp)}) return(TRUE) }
#!/bin/bash #writeJSON.sh LF=$(printf '\\\012_') LF=${LF%_} sed -e 's/},{/}'"$LF"'{/g' $1 | sed "1s/\[//" | sed '$s/}]/}/'
これで一行JSONの書き込みも出来ました.
ただtempfileに一時的にファイルを書き込んでいるため,巨大なファイルを扱うときのパフォーマンスはよくありません.私が扱うのは大きくとも数100MB程度のJSONファイルなのでなんとかなってはいますが.(でもそれ以上に大きなデータはJSONでは扱わないきもする.)
箱根一泊二日(強羅花扇)旅行記④ 大涌谷とサロン・ド・テ ロザージュでおやつ
この記事は下の記事の続きです
liberaldays.hatenablog.com
旅行二日目(最終日),強羅花扇を11時に出発しとりあえず大涌谷に車で向かいます.
宿から大涌谷までは車で10分かからないくらい.ですが大涌谷の駐車場が大変な混雑だったので,桃源台まで移動してそこからロープウェイで大涌谷に向かうことにします.今考えれば,宿に車をおいて早雲山からロープウェイを使えばよかったですね.
桃源台の無料駐車場は満車でしたので,となりの有料市営駐車場(500円/回)に駐車してロープウェイ駅に向かいます.
年末で混雑しているとの噂でしたが,10分程度の待ち時間でロープウェイに乗車出来ました.待機列中では無料のホッカイロ(広告付き)が配布されていて助かりました.
ロープウェイの乗り場が格好良かったのでつい連写.
桃源台から2駅16分で大涌谷に到着します.少し風の強い日でしたがほとんど揺れることもなく,富士山の眺めを楽しみながら移動することができました.
大涌谷はお土産屋さんを除いて大した人混みではなく,ぼうっと噴煙地を眺められます.先日の火山活動の影響で黒玉子で有名な小屋には登れなくなっていたのが残念.
山頂では黒玉子とお土産を買い,たまごソフトクリームを頂きました.
眺めに満足したのでロープウェイで桃源台に戻ります.このとき14時.夜には自宅に戻りたかったので,おやつを食べて箱根を立つことにしました.
おやつは元箱根の「サロン・ド・テ ロザージュ」が人気店ということでここに向かいます.
www.hakone-hoteldeyama.jp
到着時には満席でしたが,5分ほどで店内に案内されました.14時-17時にはアフタヌーンティーが提供されるので,折角だからこれを頼んでみました.紅茶はティーメニューから好きなものを選べ,ポットで提供されます.私はチャイを頼みました.
チャイはシナモン系の香りが程よく,美味しかったです.スコーンは柚子のジャムで頂いたのですが,このジャムが美味しくてたくさん付けてしまいました.
ちなみにレストランの2Fはショップになっていて可愛らしいティーグッズが販売されていました.
アフタヌーンティーが済んだので自宅に戻り正月準備となりました.
1泊2日の小旅行でしたが,良い気分転換ができました.
箱根一泊二日(強羅花扇)旅行記③ 朝食,チェックアウト
この記事は下の記事の続きです
liberaldays.hatenablog.com
翌日は7時頃に目が醒めました.加湿空気清浄機のお陰で暖房をつけっぱなしでも喉は痛くありません.
朝食の時間は8:30でお願いしていたのでまだ時間があります.とりあえずエスプレッソをまた追加し,朝風呂に入ります.大浴場も開いていたと思いますが折角なのでお部屋のお風呂に.お風呂で外を眺めていたところ,箱根のケーブルカーが早雲山駅に向かって斜面を昇るところを発見しました.
(といっても線路から十分離れているためケーブルカー車内からの視線を気にする必要はないでしょう.)
発汗作用のある温泉で気持ちよく汗をかき,湯冷ましをしていたらちょうど朝食時間です.夕食とおなじくロビーに向かい,同じ個室に案内されます.
朝食は下の写真のようなメニューで美味しくいただきました.おかゆか白米かで選べたと思います.
40分ほど掛けて朝食を頂いたあとはラウンジに向かいます.仲居さんから10時まで,コーヒーかお茶(紅茶だっかかも)のサービスがあると聞いたので折角なので.本日2杯目のコーヒーをここで頂きました.ラウンジには他の宿泊客の方々がいらっしゃいました.私達と同じく特別室を利用している家族連れの方,カップルと思しき方,欧米系の方,小さな子ども連れなどをラウンジ付近で見かけました.
室数が少ない割に建物が大きく,食事処も個室なので昨日は他の宿泊客とほとんど顔を合わせなかったのですが...ちゃんと他のお客さんも居たんですね.そりゃそうか.
チェックアウトは11時なので,それまでまたお部屋で過ごします.移動が控えているのでネスプレッソはもう飲みません.
11時にロビーにいくと,仲居さん他従業員の方が迎えて下さります.精算は済んでいるので後は宿を去るのみ.玄関前に自宅の車を横付けしてくれていたのでそれに乗り込んで出発.皆さんありがとうございました.
さて,強羅花扇を振り返ってですが,「現実逃避」を目的とした今回の旅には最適でした.お部屋は十分に広く,アメニティも充実しており,お風呂でリラックスもできました.さらに電源も各所にありWiFiもあるので趣味のプログラミング・サーバー管理も存分に.時間があればもう一泊したいと思える宿でした.
強いて難点を挙げるとすれば,お料理の何となく何かが不足している感じ(料理については前日の記事を参照.料理自体は十分豪華なんですけれどね.)と,本当にごく一部,襖の鴨居の上の部分なんかにホコリが見えたところでしょうか(こんなところ気にしてると小姑と思われそうですが).まあ些細なことで,存分に羽を伸ばす事が出来ました.
ここで言うのも何ですが,実は予約時には更にランクの高い別の宿(「強羅花扇 円かの杜」だったかな)への宿泊を考えていました.
ただ年末という忙しい時期で予約が取れず,代わりに案内されたのがこの「強羅花扇」でした.いい宿に出会えたと思っていますが,次回の箱根旅行は高いお宿へもリベンジしたいですね.他に行きたい温泉地もあるので,実現がいつになるかは分かりませんが....
さて,箱根旅行ですが大涌谷に向かい,元箱根でスイーツを食し帰宅します.
その様子はまた後日.
次の記事はこちら
liberaldays.hatenablog.com
箱根一泊二日(強羅花扇)旅行記② お風呂と夕食
この記事は下の記事の続きです
liberaldays.hatenablog.com
お部屋でゆっくりしたあとは,とりあえず大浴場に向かいます.
部屋は2Fにあったのですが,大浴場はロビー階(1Fの下).エレベーターで向かいます.廊下は結構長いのですが床暖房が完備されており足袋で歩いても寒さを感じません.この廊下,夜は照明が抑えられておりとてもムーディーでした.
(書き忘れていましたが,この宿は玄関で外履きを脱ぎます.部屋に新品の足袋が用意されているのでそれを履いて過ごしました.部屋にスリッパがありますがそれはトイレ専用です.)
タオル等は全て大浴場に備えられているので,手ぶらで向かう事が出来ます.とても気楽で良いですね.部屋にお風呂用のカバン(竹製品?)もあるので小物が多ければこれを持ってゆけば良いでしょう.脱衣所のロッカー(ちなみに木製でおしゃれ)は鍵が掛かるので安心です.
廊下
16時と早めの時間に入ったためか,大浴場はほぼ貸し切り状態でした.屋内に長方形の浴槽があり,露天風呂も2つ備えられています.洗い場も各ブース十分な幅がありました.肝心の温泉ですが湯温は気持ち低めです.でも発汗作用があるらしく使っていると暑くなってきました.湯冷まし用に外に椅子もありましたが,冬の箱根なので流石に座ってのんびりとはいきませんでした....
脱衣所には洗面台があり,ブラシやドライヤー,ひげそりなど必要なものが揃っています.自由に使えるマッサージチェアや冷水機まで備えられています.長風呂しても安心でしょうか.
さて,部屋に戻ったら今度は部屋のお風呂に入ります.部屋のお風呂は常に湯が流れていて,必要ならば湯・水を足して温度を調節できます.
部屋の露天風呂
こちらでもリラックスした後はバスローブにでも着替えてハートランドをごくり.ラボの自端末にSSHして進捗を確認したりして夕食の時間を待ちました.
夕食は懐石料理です.A5ランクの飛騨牛を頂けるとのことで楽しみ.JTBを経由して予約した時には海鮮も美味しいとのことでした.
時間になったらロビーにゆくと仲居さんが食事処まで案内して頂けます.案内されたのは45帖ほどの個室でした...広い(写真を撮り忘れたのが残念).
献立は下の通りです.
撮影した料理の写真を上げておきます(幾つか撮影し忘れたものもありますが...).
前菜
刺し身
飛騨牛 手元で焼いて頂きます
ご飯
そしてデザート(水物)
2時間掛けて頂き,お腹が一杯になりました(炭水化物少なめなので夜中にお腹が空いて和菓子を頂いたのは秘密).飛騨牛,伊勢海老の刺し身など,どの料理も美味しく頂けました.ただ同行の両親曰く「どの料理も美味しいのだけれど,なんというか地味,あと少し何かあれば完全なのに」とのこと.それは確かに.器でしょうか,調味料でしょうか...何かがもの足りない気はしました.美味しかったので概ね満足ですけどね.
夕食後は腹ごなしも兼ねてロビー付近を散策します.
ロビーの照明が幻想的です.ロビーには小さな売店があり,寄木細工やお菓子,おもちゃなどが売られていました.
部屋に戻る途中で廊下にお正月の飾り付けがされていることに気付きました.
部屋に戻ると和室に布団が敷かれており,茶器の交換もされていました.
あとは夜までエスプレッソとビールを飲みながら,ゆっくり.良い夜を過ごせました.
翌日の様子はまた次回.
次の記事はこちら
liberaldays.hatenablog.com
箱根一泊二日(強羅花扇)旅行記① チェックインとお部屋の様子
昨年末に箱根に一泊二日の旅行に行ってきましたのでその様子をお伝えします.
基本的には宿でのんびりし,2日目にちょっぴり観光して自宅に帰るだけの小旅行でした.でも宿の設備がすばらしく十分な現実逃避が出来たので満足です.
今回は強羅花扇という宿に泊まりました.この会社は箱根(というか強羅)には3箇所の宿を運営しているようなのですがそのうちの一箇所です.
(宿HP)
箱根強羅温泉の旅館なら全室露天風呂付きの宿 強羅花扇【公式サイト】
(楽天)
強羅温泉 強羅花扇 宿泊予約【楽天トラベル】
ケーブルカー,ロープウェイの早雲山駅からは専用のエレベーターでつながっており,アクセスも便利そうです.
といっても車で向かったのでこのエレベーターを使うことはなかったのですが.
車で宿に到着すると,仲居さん他数名の方が迎えて下さいました.荷物は先に部屋に運び込んで頂き,1Fのラウンジでチェックインの手続きを行います.このときにお菓子(お芋の素揚げ)と飲み物も頂きます.飲み物はジュース類はもちろん,抹茶も頂けたようですが私はビールを選択しました.
ラウンジの様子と
お菓子・ビール
その後お部屋に向かいます.今回は家族での宿泊なので4人宿泊できる特別室に泊まります.HPによると花扇は全20室と小規模なホテルで,うち4人以上で宿泊できるのは特別室(2室)と準特別室(1室)になります.特別室もそれぞれ間取りが違うのですが210号室に泊まりました.
入室後は仲居さんからお部屋の説明があり,鍵(2本)を渡されました.夕食の時間も18:30に決めます.その後はウェルカムフルーツと用意されていた和菓子をいただきました.
お部屋はリビングと寝室,和室の3室が主で,トイレ,脱衣所,シャワールーム,露天風呂,縁側(?)もあります.
リビング(奥は脱衣所,シャワールーム,そして露天風呂)
(TV周りの様子.ちょうどだまされた大賞を観てました)
リビングにはソファやテレビが設置されています.プレーヤーにBOSEのサラウンドシステムも完備されており,テレビ横のDVDリストからDVDの貸出もお願いできるので映画鑑賞も出来ます.
TV台の下には茶器と茶葉.冷蔵庫にはコンプリメンタリーのビール(ハートランド),ペリエ,オレンジジュースと水が各4本用意されていました.また水差し,デロンギの湯沸かし器,ネスプレッソのカプセルマシーンがあり,流しもあって水も汲めます.この部屋にいる限り飲み物に困ることはないでしょう.ネスプレッソの使い過ぎで夜寝れなくなるかと思いました.ネスプレッソのカプセル,36杯分もありとても全ては飲めません.
冷蔵庫
寝室はこんな感じ.2ベッドです.ベッドの上とクローゼットには浴衣と作務衣,バスローブが用意されていたので滞在中は部屋の中では作務衣,部屋を出るときは浴衣で過ごしていました.
寝室
和室はこんな感じ.コタツがあり,夜には布団が敷かれます.
和室
そして縁側
和室の奥には素晴らしい眺めの縁側があります.加湿空気清浄機も用意されています.この宿では全館WiFiが繋がるので,ここで眺めを楽しみながらMacでラムダ式の使い所を勉強したりchefを回したり...まあ相変わらず好きなことをやってました.
お風呂関係ですが,まずリビングの隣にアメニティ類の充実した脱衣所・洗面所があり,その隣にシャワールーム.そしてそこから外の露天風呂につながっています.足を伸ばせるほどの大きさでは残念ながらないですが,十分でしょう.お部屋露天風呂があるのもこの宿を選んだ大きな理由です.
ちなみにお風呂はリビングから丸見えなので,必要ならばカーテンを閉めましょう.露天風呂と外の仕切りを閉めることも出来るので,気になる人も大丈夫なのだろうか.
トイレはもちろんウォシュレット完備です.
きれいなトイレ
当然エアコンは全室にあり,床暖房も広い範囲をカバーしています.外は夜には氷点下になりますが部屋の中で寒いと感じることはありませんでした.木材に拘った家具類も使いやすく,リラックスできます.
さて,一息ついたので,これから大浴場に向かいます.その後は(趣味の)コードを書いて部屋でまたお風呂に入り,夕食を食べたらまたコードを書いてのんびりする,最高の年末を過ごしました.長くなりそうなので以降の様子はまた後日.
次の記事はこちら
liberaldays.hatenablog.com
パケットデータ(pcap)をRで読み込む話
tcpdumpで取得したパケットのキャプチャデータをRに読み込ませる話。
遊びでパケットキャプチャしてみたけど結果が見難い。じゃあいつも使ってるRで読ませてみましょうと考えた。wiresharkや、そのCUI版であるTsharkを使えばキャプチャデータをcsvに変換出来て楽だけど、Rだけでなんとかしてみる。データ読み込みのお勉強。
つかうキャプチャデータは,tcpdumpで得られたもの.tcpdumpに何のオプションを付けるかによって得られるデータが変わるけど,今回はIPアドレスの名前解決や,パケットの中身の取得は行わず,純粋にプロトコルやIP,ポート番号だけを記録したものを使う...というか,今回扱いたいデータがそうして取得されたものだった.
Rで読み込ませる前に,catでデータの中身を表示させてみた....が文字化け.文字コードを変更しつつvimで開いてもダメ.そもそもテキストで保存されてないのか.
じゃあとおもって
tcpdump -r packet_data.pcap > encoded.txt
と打つと,無事encoded.txtに人間が見て分かる形式で表示された.
あとは人間で読める形式に変換してからRを起動してデータを読みこませれば良いわけだけど,シェルでtcpdump打って変換してからRを起動して...とやるのは面倒.
全部Rで完結させるために,R内からshellコマンドを実行することにする.
今回使うのは,Rのsystemコマンド.
system('ls') system('pwd')
みたいに使うと,シェルコマンドをRから実行してくれる.実行結果はRのコンソール上に吐かれるので,オプションのinternをTRUEにして,文字列としてR内で持たせてあげる.
まとめるとこんなかんじ
pcap.path <- <pcapデータへのフルパス> data <- system(paste0('tcpdump -nn -r 'pcap.path),intern=T)
これでtcpdumpの出力が,オブジェクトdataに文字列として保存される.
nnオプションはIPの名前解決をしないオプション.付けないと勝手にドメインに書き換えられるから必須.
追記
(オプション-nnttqが、色々無駄なの消えて一番楽ということに後で気付いた.
またプロトコルを指定したい場合はオプションを色々弄ると楽になる.)
data [1] "09:00:37.1691342 IP 100.100.123.123.52 > 123.123.123.123.22: UDP, length 0" ....
あとは文字列処理のお話.
strsplitで空白とカンマで分割してやる.
strsplit(data,split=' |,') #strsplit(data,split=' |,|:|>|\\.') #コロンやピリオドでも分割するならこっち.時刻やIPが分かれすぎるけど #追記の-nnttqオプションでやるならこっちが便利(僕の場合)
結果はリスト.unlistしたいところだけど,パケットごとに分割後の長さが異なるのでやめておく.「時刻」とか「送信元」とか,必要な情報をリストからいちいち取り出してゆく
Time <- sapply(data,'[[',1) #時刻だけ取り出し Source <- sapply(data,'[[',3) #送信元だけ取り出し(IPとポートは後で分けよう) Dest <- sapply(data,'[[',5) #宛先だけ取り出し(IPとポートは後で分けよう,末尾のコロンも後で消そう) Protocol <- sapply(data,'[[',6) #TCPかUDPかそれ以外か
とりあえず,僕が必要なのはこれだけ.パケットフラグとかも必要なら,もう少し面倒な処理が必要だったかも.
あとはTime,Source,Dest,Protocolをdata.frameにまとめれば解析に必要なデータは得られたことになる.(IPとポート分ける処理とかは書いてないけど)
追記
(icmpが来るとポート番号が無いので変なことになるのに気付いた。僕の場合はtcpだけ取れれば良いから、tcpdumpの時点でフィルタリングしてしまう)
さっそくプロットとかしてみよう