あいつの日誌β

働きながら旅しています。

electron で再生速度を変更できる動画プレイヤーを作りました。

というわけで electron をはじめました

動画の再生速度を変更したかったのですが、昔インストールしていた動画プレイヤーが何故か動かなかったので何となく自分で作ってみました。

github.com

electron を触った感想

最初は main process と renderer process の違いがよく分かってませんでしたがそこを乗り越えたらあとはそんなに難しくないと思いました。たぶん普段からサーバーサイドもフロントエンドも触っている人だったらそんなに難しくないと思います。

ちなみに Vue.js ではなく何となく TypeScript + React + Bulma を使いました。Vue.js でなくて React 使っているのは何となく Electron 界隈では React が主流な気がしたので、実際はどうなのかは分かっていませんが。

そしてディレクトリ構成などは以下をそのまま流用しました。

https://webpack.electron.build/

今の所本当にシンプルな構成なので redux など使ってないのですが、機能を追加したりして遊んでみたいと思います。

あとそれから

よかったら repository に star をください

36回目の開催となる We Are JavaScripters で LT してきました

wajs.connpass.com

f:id:okamuuu:20191002104639j:plain

本日のスポンサー: SmartHR

会場・飲食物の提供は SmartHR さまです。ありがとうございます!冷蔵庫の中から好きなドリンクを選べます。

f:id:okamuuu:20191002104728j:plain

冷えたビール飲めるので嬉しいですね。よなよなエールが置いてありました。なかなか素敵なチョイスですね。ぜひとも SmartHR 社には今後も色んな勉強会のスポンサーをやって欲しいです。

SmartHR はエンジニアが30人いてフロントエンドが6名だそうです。思ったよりも人数少ないなあと思いました。それから smartHR では component を storybook にして公開しているそうです。

https://www.npmjs.com/package/smarthr-ui

WeJSのスタッフより

  • TDD: 登壇ディベロップメント
  • 目標: 全員登壇
  • 会場: 貸してください

との事です。運営している人たちは常に会場をどこにするのか困っているので「勉強会行きたいから自社のスペース使ってやって欲しい」という人がいれば彼らに声がけするといいと思います。

https://www.facebook.com/groups/139611203185731/

LT一覧

LT1: Performance Timing API 超入門 @okamuuu

ISUCON に参加したときに負荷を計測するときに Performance Timing API を使ったのですが、その時にそこそこ良さげなライブラリができたのでそちらを紹介しました。

LT: https://okamuuu.com/talks/2019/2019-09-30.wejs36.smart-hr.html performance-measure: https://github.com/okamuuu/performance-measure/

良かったら star をください。

LT2: TypeScriptでVSCode拡張機能を作ってみた話 @kuromoka

TypeScript 初めて触るが VSCode拡張機能を作っている、という話。本当は作った、というタイトルでしたが間に合わなかったそうです。API の名前が分からないので欲しい API がなかなか見つけられない問題が発生したそうですが GitLens のソースコードの example を見て対処できたそうです。

LT3: 今回は参加できなかったみたいです。

LT4: JavaScriptアルゴリズムを学べる本を技術書典で出しました @pco2699

アルゴリズムと TypeScript が好きな人。本屋に並んでいるアルゴリズム本は 言語が C++, C, Python で実践的でないので何のためのアルゴリズムなのか分からない、という事で執筆したそうです。

無いなら作るってエンジニアぽくて良いですね。

LT5: TypeScript における型レベルバリデーション @チェシャ猫

猫耳の人。TypeScript の型で form validation を作る話かな?普通に Validation 書いた方が楽そうだけど、型を使った validation も頑張ればできる、という解釈で良いのかな。

LT6: option-t: one package to rule "nullable" all @saneyuki_s

JS で値がない、の表現が多すぎて困る。作法を統一したい、というお話。JS で値がない 時の処理を見やすくしたい場合は私は関数に代えちゃう事が多いなあ。

一応 lodash に isNilisNull という関数があったりします。

LT7: vue uiが想像以上に便利だったので共有したい @もふもふ

vue cli は version によって名前空間変わっているので注意。npm install で悩んで時間を溶かすのでみなさまも注意しましょう。

LT8: PWAのその前に Client side storageの撤退方法 @Shinichi Kogai

Service Worker と Cache Storage を使っている WordPress に POST しても更新されなくなってしまった。原因は PWA を勝手にやめても ブラウザには register されたままなので更新されない。

Cache するのは簡単ですけど Cache をどうやって消せば良いのかを考えるのほんと難しいですよね。

LT9: react-spring でリッチなアニメーション @brn0227

よく v8 javascript engine の事を話しているあの人。本日は React で簡単にアニメーション化できる react-spring のお話でした。

https://www.react-spring.io

LT10: Streams API入門 @chikoski

ファイルの読み書きに関するお話。ファイルを読み込みながら書き込みする Streams API を使って自作の Stream を作れますよ、というお話。OS 側ではファイルの読み書きで読み込みながら書き込みするのは普通の事だと思うのですがブラウザ側では最近できるようになったそうです。

うーん。ファイルを受け取りながら、かつ読み込み完了する前に処理を開始したい、ブラウザ側で。みたいなケースがあるんだろうか...

そういえば groonga が POST された JSON を受け取りきる前に解析始めているみたいな事言っていた気がするなあ。

懇親会

JavaScriptアルゴリズムを学べる本を技術書典で出しました @pco2699 さんとお話しました。アルゴリズム大事すよねえ。あと組み込み系の会社で働いている外国人も JS 周りのキャッチアップに来ていました。一昔前まで勉強会は日本人しかいなかったのですが、最近は外国人もちらほら見かけるようになったので丁寧な日本語で話す必要があるなあと思いました。

あとなぜか「ISUCON に出たんですか?すごい。」と言われたのですが誰でも参加できるんですけどフロントエンドの人からするとそういう認知なんだなーと思いました。

まとめ

というわけで今回も登壇の機会を頂いたので経験値を増やす事ができました。We Are JavaScripters は登壇の敷居が低いのでみなさんも初登壇にチャレンジしてはいかがでしょうか?家でコード書くのも良いですが、登壇すると効率よく経験値を増やす事ができると思います。

というわけでスポンサー、運営のみなさま、今回も勉強会を開催していただきありがとうございます。次回もまたよろしくお願い致します。

ISUCON9 予選を復習する時の手順

あらすじ

復習するためにインスタンスを作成した時のメモを残します

多少は環境構築が楽になると思うので、イメージは予選の時に使用した isucon9-qualify-v1 を使用します。ただしこのイメージにはベンチマーカーが含まれていません。

この記事では以下の作業を行って webapp と benchmarker を1台のインスタンスに同梱させる方法を記します。

  • ECS の準備
  • make に必要な package を取得
  • isucon9q のソースコードを取得
  • 初期データを用意
  • ベンチマーカーを make

ECS を準備

基本的には以下の作業を行えばOK

https://gist.github.com/sota1235/a7356a5909af264c1c1c840dd216c98f

Elastic Compute Service(ECS)

カスタム購入

基本構成 (必須)

価格モデル: 従量課金

リージョン: アジア東北1ゾーンA

インスタンスタイプ: ecs.sn1ne.large

共有イメージ: isucon9-qualify-v1

Ultra クラウドディスク: 40GiB

ネットワーク (必須)

ネットワーク: VPC デフォルトのまま

ネットワーク課金タイプ: トラフィック課金 100MBps

セキュリティグループ: 80, 443, 22 が空いてればOK

システム構成

キーペア: 適宜

インスタンス名: 適宜

ホスト名: 適宜 isucon9q-001 のように 1-3 の連番を振ると便利

/etc/hosts を編集

以下のような感じで編集すれば良いでしょう。

47.74.xxx.xxx isucon9q-001 isucon9.catatsuy.org

https://isucon9.catatsuy.org/ で画面が表示される事を確認し、ssh でサーバーにログインできる事を確認します。

PATH を通す

ssh でサーバーにログインします。root user のまま作業を行っています。 PATH を通したいので isucon user の bash_profile をコピーします。

cat /home/isucon/.bash_profile >> ~/.bash_profile

PATH が通っている事を確認します

exec $SHELL -l
which go
/home/isucon/local/go/bin/go

make に必要な package を取得 (docker, unzip)

まず unzip をインストールします

apt update
apt install -y unzip

続いて Docker。以下の URL の Install using the repository INSTALL DOCKER ENGINE - COMMUNITY の作業を行います。

https://docs.docker.com/install/linux/docker-ce/ubuntu/

Install using the repository

apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

INSTALL DOCKER ENGINE - COMMUNITY

apt update
apt install -y docker-ce docker-ce-cli containerd.io

動作確認をする

docker run hello-world

isucon9q のソースコードを取得 (git clone)

この記事では /home/isucon の直下に isucon9-qualify を配置します。

cd /home/isucon
git clone https://github.com/isucon/isucon9-qualify.git

初期データを用意

make を実行します。docker を使って初期データを作成します。

cd /home/isucon/isucon9-qualify/initial-data/
make

生成された initial.sql は、/home/isucon/isucari/webapp/sql/initial.sql とは異なるデータになっているので同期させます。

cp /home/isucon/isucon9-qualify/initial-data/result/initial.sql /home/isucon/isucari/webapp/sql/initial.sql

ベンチマーク用画像データをダウンロード

cd /home/isucon/isucon9-qualify/initial-data/
curl -L -O "https://github.com/isucon/isucon9-qualify/releases/download/v2/bench1.zip"
unzip bench1.zip
rm -rf images
mv v3_bench1 images

ベンチマーカーを make (bin/benchmarker)

cd /home/isucon/isucon9-qualify/
make

動作確認をします。最後に以下のような出力がされていれば OK です。

./bin/benchmarker
<省略>
2019/09/15 01:04:20 main.go:180: === final check ===
2019/09/15 01:04:20 main.go:212: 2110 0
{"pass":true,"score":2110,"campaign":0,"language":"Go","messages":[]}

あとそれから

今回の isucon で私がボトルネックを検出するために作った計測ツールを先日 npm publish しました。

github.com

使い方

cd /home/isucon/isucari/webapp/nodejs
npm install performance-measure

edit /home/isucon/isucari/webapp/nodejs/index.ts

diff --git a/index.ts b/index.ts
index f8a6ca6..d769f00 100755
--- a/index.ts
+++ b/index.ts
@@ -15,6 +15,9 @@ import crypt from "crypto";
 import bcrypt from "bcrypt";
 import {paymentToken, shipmentCreate, shipmentRequest, shipmentStatus} from "./api";

+const PerformanceMeasure = require('performance-measure')
+const m = new PerformanceMeasure()
+
 const execFile = util.promisify(childProcess.execFile);

 type MySQLResultRows = Array<any> & { insertId: number };
@@ -251,21 +254,42 @@ async function getDBConnection() {
     return fastify.mysql.getConnection();
 }

+// measure
+fastify.addHook('preHandler', function (request :any, reply: any, next) {
+  m.start(request.raw.id)
+  next()
+})
+
+fastify.addHook('onSend', function (request: any, reply: any, _, next) {
+  const routeId = reply.context.config.statsId ? reply.context.config.statsId : request.raw.url
+  m.endAs(request.raw.id, routeId)
+  next()
+})
+
+fastify.get('/__stats__', async (req, reply) => {
+  const style = "font-family: 'Fira Mono', 'Andale Mono', 'Consolas', 'monospace';"
+  reply
+    .header('Content-Type', 'Content-type: text/html; charset=utf-8')
+    .send(`<pre style="${style}">${m.print()}</pre>`)
+})
+
+function c (statsId: string) {
+  return { config: { statsId } }
+}
 // API
 fastify.post("/initialize", postInitialize);
-fastify.get("/new_items.json", getNewItems);
-fastify.get("/new_items/:root_category_id(^\\d+).json", getNewCategoryItems);
-fastify.get("/users/transactions.json", getTransactions);
-fastify.get("/users/:user_id(^\\d+).json", getUserItems);
-fastify.get("/items/:item_id(^\\d+).json", getItem);
+fastify.get("/new_items.json", c("/new_items.json"), getNewItems);
+fastify.get("/new_items/:root_category_id(^\\d+).json", c("/new_items/:root_category_id(^\\d+).json"), getNewCategoryItems);
+fastify.get("/users/transactions.json", c("/users/transactions.json"), getTransactions);
+fastify.get("/users/:user_id(^\\d+).json", c("/users/:user_id(^\\d+).json"), getUserItems);
+fastify.get("/items/:item_id(^\\d+).json", c("/items/:item_id(^\\d+).json"), getItem);
 fastify.post("/items/edit", postItemEdit);
 fastify.post("/buy", postBuy);
 fastify.post("/sell", postSell);
 fastify.post("/ship", postShip)
 fastify.post("/ship_done", postShipDone);
 fastify.post("/complete", postComplete);
-fastify.get("/transactions/:transaction_evidence_id(^\\d+).png", getQRCode);
+fastify.get("/transactions/:transaction_evidence_id(^\\d+).png", c("/transactions/:transaction_evidence_id(^\\d+).png"), getQRCode);
 fastify.post("/bump", postBump);
 fastify.get("/settings", getSettings);
 fastify.post("/login", postLogin);
@@ -277,10 +301,10 @@ fastify.get("/", getIndex);
 fastify.get("/login", getIndex);
 fastify.get("/register", getIndex);
 fastify.get("/timeline", getIndex);
-fastify.get("/categories/:category_id/items", getIndex);
+fastify.get("/categories/:category_id/items", c("/categories/:category_id/items"), getIndex);
 fastify.get("/sell", getIndex);
-fastify.get("/items/:item_id/edit", getIndex);
-fastify.get("/items/:item_id/buy", getIndex);
+fastify.get("/items/:item_id/edit", c("/items/:item_id/edit"), getIndex);
+fastify.get("/items/:item_id/buy", c("/items/:item_id/buy"), getIndex);
 fastify.get("/buy/complete", getIndex);

 async function getIndex(_req: any, reply: FastifyReply<ServerResponse>) {
@@ -309,7 +333,7 @@ async function postInitialize(req: FastifyRequest, reply: FastifyReply<ServerRes

     const res = {
         // キャンペーン実施時には還元率の設定を返す。詳しくはマニュアルを参照のこと。
-        campaign: 0,
+        campaign: 2,
         // 実装言語を返す
         language: "nodejs",
     };

node.js を起動

systemctl stop    isucari.golang.service
systemctl disable isucari.golang.service
systemctl start   isucari.nodejs.service
systemctl enable  isucari.nodejs.service

ベンチ実行

2019/09/15 02:16:57 main.go:180: === final check ===
2019/09/15 02:16:58 main.go:212: 5410 0

GET https://isucon9.catatsuy.org/__stats__

name                                              size  sum         max      min      mean
------------------------------------------------  ----  ----------  -------  -------  -------
/buy                                               529  1379186.94  3843.30     0.03  2607.16
/items/:item_id(^\d+).json                        1066   802732.08  3839.38     1.30   753.03
/login                                             704   782362.84  4105.26   225.83  1111.31
/settings                                          666   545591.99  3765.35     4.80   819.21
/new_items/:root_category_id(^\d+).json            366   383428.45  4208.59   162.25  1047.62
/new_items.json                                    126   145147.42  4250.52   217.48  1151.96
/users/transactions.json                            50   111228.35  7035.00    45.94  2224.57
/users/:user_id(^\d+).json                         119    97799.55  3978.04    47.27   821.84
/sell                                               40    24101.81  1527.11     0.03   602.55
/ship                                               10     8616.09  2033.46     0.38   861.61
/complete                                            8     8140.25  2017.89     9.76  1017.53
/ship_done                                          11     7456.80  1591.32     0.03   677.89
/initialize                                          1     6554.08  6554.08  6554.08  6554.08
/bump                                                7     3852.41  1223.84    15.66   550.34
/transactions/:transaction_evidence_id(^\d+).png    10     3465.90  1067.22     0.85   346.59
/items/edit                                          4     1496.02  1064.49     3.50   374.01
/reports.json                                        1      477.86   477.86   477.86   477.86
/static/js/2.ff6e1067.chunk.js                       1      244.51   244.51   244.51   244.51
/upload/30f7679c97b5bb567dc1b38e3f52601a.jpg         2       22.00    21.72     0.27    11.00
/upload/0674e4389f096c8afd8b114b89275de6.jpg         1       21.18    21.18    21.18    21.18
/upload/5e8f91b52cb52c6b8d72533cab6f63b7.jpg         1       19.60    19.60    19.60    19.60
/upload/0d14fcbed9720312fafb8573d8556f51.jpg         1       13.33    13.33    13.33    13.33
/upload/1a571465c3b144d02490e3115208f8ca.jpg         1       11.76    11.76    11.76    11.76
/upload/30325ba77825014e96d42b19c18b9ee4.jpg         1        7.67     7.67     7.67     7.67
/static/js/runtime~main.a8a9905a.js                  1        7.46     7.46     7.46     7.46
/upload/9b2bb8fb771e26dfbf335798f2adbd7a.jpg         1        3.50     3.50     3.50     3.50
/upload/62da8c459ff224e10f297a8deb207349.jpg         1        2.53     2.53     2.53     2.53
/upload/17aba6bc9657f59ba91ec376d08c3255.jpg         1        2.52     2.52     2.52     2.52
/upload/2dd7e13de6eadfc195a94c9c4d34884c.jpg         1        2.51     2.51     2.51     2.51
/upload/393afbdea5b3308247015ad89db679d9.jpg         1        1.97     1.97     1.97     1.97
/upload/26e8c534dca0c993c4fd0581c8a75a20.jpg         1        1.95     1.95     1.95     1.95
/upload/2efc92a5d55e12337d8f50d80ee0cf0b.jpg         1        1.95     1.95     1.95     1.95
/upload/2e0ba97d1012991aae5f83a447105342.jpg         1        1.95     1.95     1.95     1.95
/upload/5f57c8f5f424d3187a5097e5bc349cbc.jpg         1        1.86     1.86     1.86     1.86
/upload/30f113dd78473b35e8b3df60bc1dc7bd.jpg         1        1.86     1.86     1.86     1.86
/upload/7c6b3916fe91112d88d9f810b745aae5.jpg         1        1.72     1.72     1.72     1.72
/upload/169534d0a6d9d37be61d4737bfcd0a81.jpg         1        1.54     1.54     1.54     1.54
/upload/30eacdcf0bd8b425ce8112845974d8be.jpg         1        1.31     1.31     1.31     1.31
/upload/3a47c2abbaa28eeb79b322033b56c175.jpg         1        1.18     1.18     1.18     1.18
/upload/2f233413a51dfd3983f0e9feba54bcb5.jpg         1        1.15     1.15     1.15     1.15
/upload/3104fe69b6596368bb86db005c17b3f1.jpg         1        1.11     1.11     1.11     1.11
/upload/2e88083aaaa21439d3cb8520ad38d8fd.jpg         1        1.11     1.11     1.11     1.11
/upload/40c71b0281e1cbff0b8e2c71e355b6e0.jpg         1        1.08     1.08     1.08     1.08
/upload/30935566cc5c445de0920cdb12950a17.jpg         1        1.02     1.02     1.02     1.02
/upload/3fd4a90b3c3f80755468aac1292d1d3f.jpg         1        1.00     1.00     1.00     1.00
/upload/2ccfaf5b7ace96f26e9ba26a7002c4ad.jpg         1        0.90     0.90     0.90     0.90
/static/js/main.babc3d4d.chunk.js                    1        0.88     0.88     0.88     0.88
/upload/47f8232fc19e4a8034b8580eb6a69ada.jpg         1        0.82     0.82     0.82     0.82
/upload/17892821abdb57d7e8cf05e750f1b063.jpg         1        0.79     0.79     0.79     0.79
/upload/3118b492c1b976decd88bf3c71cd7813.jpg         1        0.77     0.77     0.77     0.77
/static/css/main.19393e92.chunk.css                  1        0.69     0.69     0.69     0.69
/upload/30e884e88d49d8c6979f30cf89c5954e.jpg         1        0.63     0.63     0.63     0.63
/upload/30cb5e2438a8d2d31b5cc388a2ec665b.jpg         1        0.62     0.62     0.62     0.62
/upload/270e6b5b8bd15f200f54d617449a8150.jpg         1        0.60     0.60     0.60     0.60
/upload/15fb39a6cd94ce77f8903879aecc7945.jpg         1        0.59     0.59     0.59     0.59
/upload/2e7c0c29569c8bfe80c9b46367db87b2.jpg         1        0.56     0.56     0.56     0.56
/upload/03024b6a442d9932fc55919b1a6dbcab.jpg         1        0.54     0.54     0.54     0.54
/upload/30d141435d573e446a935b8ebe4c0270.jpg         1        0.47     0.47     0.47     0.47
/upload/30e64ab77ec09bb3b083d22dae89a203.jpg         1        0.46     0.46     0.46     0.46
/upload/30333707b92970cad1817c46c0726049.jpg         1        0.44     0.44     0.44     0.44
/upload/237058d87bb27255efcda80870d5af5b.jpg         1        0.41     0.41     0.41     0.41
/upload/30480d069d071b8a7beff3a6529b7a5b.jpg         1        0.40     0.40     0.40     0.40
/upload/534c5fffb5cd56f903caa807ea8af714.jpg         1        0.38     0.38     0.38     0.38
/upload/3d9e29dc8f9a8af8913e83e317f2cfd1.jpg         1        0.36     0.36     0.36     0.36
/upload/301712d7770ac99623d90a88cc2c663c.jpg         1        0.35     0.35     0.35     0.35
/upload/41ddf24e267a66474d01afaff368f046.jpg         1        0.35     0.35     0.35     0.35
/upload/30471846202de60d114ee201c3ef3166.jpg         1        0.34     0.34     0.34     0.34
/upload/2f8454793d91d4a17a8932474d50dd92.jpg         1        0.34     0.34     0.34     0.34
/upload/0e480baa07ce38a1a10a34909460e5f6.jpg         1        0.33     0.33     0.33     0.33
/upload/302815cd68966575618cb9ccc4afafc6.jpg         1        0.33     0.33     0.33     0.33
/upload/30c480dfca6870d6a6b710189e162861.jpg         1        0.31     0.31     0.31     0.31
/upload/30c6ae135ad2a68517f2baf58bb9d7fa.jpg         1        0.29     0.29     0.29     0.29

こちらからは以上です。

追記

運営側へのお礼を言い忘れてました。今年も楽しく参加させて頂きました。毎年こんなに効率よくエンジニアとしての力量が向上するイベントを開催して頂いて感謝しております。次回も開催して欲しいといつも思っています。これだけの規模のイベントをハンドリングできる強いチームは他に存在していないと思うので継続してもらえるとありがたいです。今年も運営のみなさまお疲れさまでした。

ADDress が運営している北鎌倉と京都伏見のシェア別荘を体験しました

あらすじ

旅しながら働いていると「家賃と宿泊費」をダブルで払う事になるのですが、その問題を解消するサービスが最近ちらほらと登場しています。というわけで早速試してみました。

ADDress とは

簡単に言うと定額制の家賃で全国住み放題のシェアサービスです。現在約19箇所の住居(主に戸建)を有していて、会員はその拠点の中から一箇所をホーム拠点に設定できて、そこで郵便物や住民票を登録できます。そして他の拠点で暮らしたいときは都度予約して利用することができます。

月4万円でアドレスホッパーな生活を送ることができる夢のサービスです。

address.love

実際に試してみた感想

というわけで ADDress が会員をクラウドファンディングで募集していたので2019年4月ごろに「5万円で一ヶ月試せる権利」を取得していまして、8月にその権利を発動して北鎌倉と京都伏見に滞在しました。

感想としては思った以上に使えるサービスだな、と感じました。なんですが現在 ADDress は古民家再生をメインに拠点を拡大しようとしているらしく、どうしても立地がやや不便な場所になってしまうな、とも思いました。ここはちょっとネックになると思います。

住民票や郵便物の問題が解決できるのはかなり大きなポイントですが、まだまだ拠点数が少なく、行きたい場所に拠点がない、もしくは立地が不便、といったデメリットがあります。とはいえ今後利用されなくなる古民家などは増え続けると思いますのでこういったシェアリングサービスは長い目で見るとかなり良いサービスに成長すると思います。

北鎌倉

f:id:okamuuu:20190908085315j:plain

北鎌倉の ADDress 物件

北鎌倉は大船と鎌倉の中間に位置していて、とても静かな住宅街でした。ADDress で人気が高い物件の一つです。風通しが良い庭付きの戸建物件です。リビングで作業していると家守さんとそこの住人が時折姿を見せるのでお話したり、仕事に没頭したりして、ちょっとしたコワーキングスペースになっていました。

6日間ほど滞在しのたですが、割と快適に過ごせたのと鎌倉が思ったよりも楽しかったのでもう少し滞在したいなと思いました。

f:id:okamuuu:20190908085359j:plain
ADDress で使われているコアラベッド。少し柔らかすぎたかな?

鎌倉のビーチと海の家について

せっかくなので由比ヶ浜、森戸海岸、一色海岸に行ってきました。飲み歩いた際に現地に詳しい人からおすすめの海の家をヒアリングしました。オススメは以下の通りです。

  • 由比ヶ浜でのおすすめはタイ村
  • 森戸海岸でのおすすめはオアシス
  • 一色海岸でのおすすめはブルームーン、umigoya

私は森戸海岸が一番落ち着いた雰囲気だったので一押しです。といっても他のビーチもそこまで騒がしい雰囲気ではなかったです。平日という事もあったのかもしれませんが、どのビーチでもマナーの悪い人を見かけませんでした。たぶんきちんと取り締まっている人たちのおかげだと思います。なのでどこのビーチに行っても楽しめると思います。森戸海岸と一色海岸については渋滞必至なので帰る時間をずらしたりするなど工夫するといいと思います。

京都伏見について

f:id:okamuuu:20190908085631j:plain

京都伏見の ADDress 物件

オープン直後の新拠点で最寄駅から徒歩1分という、とても人気になりそうな物件にお邪魔しました。元々は学生寮だった建物をリノベーションした物件で、リビングがなかなかいい感じの建物でした。家守さんが日中はお仕事で不在で、オープン直後で滞在しているのは私1人だったので広い空間を独り占めできてとても楽しかったです。ここは3日間しかいなかったのですが、もっと滞在したかったです。

ちなみに隣に大家さんであるおばあちゃんが住んでまして、大家さんはどんな人がこの物件に来るのか興味を持っていました。たぶん新しい事が大好きな人だと思うので、宿泊される方は是非お話してみてください。

f:id:okamuuu:20190908085712j:plain
伏見産の変形する椅子。人をさほどだめにしない適度な硬さの優れた椅子。

京都伏見の街並みについて

伏見といえば幕末の舞台となっているのでご存知の方も多いと思います。私は今回の旅で初めて訪問しのたですがなかなか趣のある街並みでした。いい感じの飲み屋さんがいっぱいあるので今度から河原町だけでなく伏見にも足を伸ばそうと思いました。

まとめ

というわけでお互いの住処をシェアして別荘を増やす、新しいサービスを体験してきました。まだまだ始まったばかりなので物件の数少なくてサービスの本領が発揮できていないと思うのですが、これから魅力的な物件が増えてくると思うのでこれから要チェックなサービスなんじゃないかと思います。

こちらからは以上です。

韓国のソウル、釜山へティーウェイ航空(tway)とPeach航空(ピーチ)を使ってそれぞれ4泊5日, 2泊3日の旅をしてきた(3) 釜山で食べたご飯編

f:id:okamuuu:20190720160342j:plain

というわけで釜山で食べたものリスト

釜山

ソウルから新幹線を使って韓国第2の都市へ。主に宿泊先の南浦洞周りを探索しました。

エリア 店名 品名 値段(ウォン)
南浦 チャガルチ市場 タコ一匹刺身+あさり1個スープ 19,000
南浦 ロッテリア光複店のフードコート 石焼ビビンバ 8,500
南浦 Egg Drop 분짜(Bun Cha) 4,800
南浦 しじみ定食 しじみ定食 9,000
西面 ミートボール 豚丼 9,000

チャガルチ市場: ⭐⭐

f:id:okamuuu:20190714161737j:plain

釜山駅からも地下鉄で2駅ほどに南浦洞にある漁港です。こちらでは観光客向けに新鮮な魚をそのばで刺身にしてくれたり、スープにしてくれたりします。

10,000ウォンから15,000ウォン程度で食材を選ぶと、上の階にある食堂に案内されるのでそちらでご飯を食べられます。海の幸は1Fで支払いをして、上の階で追加料金として席代4000ウォンが追加されます。今回あさりをスープにしたのですが、それは5000ウォンでした。

タコ一匹の値段を聞くと10,000ウォン、あさり2個の値段を聞くと5,000ウォンとの事でした。私はタコ1匹とあさり2個で10,000ウォンと交渉しました。結果タコ1匹とあさり1個で10000ウォンとなりました。たぶん単体での相場はあまり決まっていないので食べたいものを一通り揃えてから値段を聞いたほうが良いかもしれません。

ちなみにタコ1匹を1人で食べるとだいぶお腹いっぱいになりました。席料400円はナムル付きなので1人でタコ1匹注文する人は小さめのタコを選んだ方が良いでしょう。

どちらかというとエンターテイメントで訪れる場所だと思ったので星2つ

ロッテリア光複店のフードコート: ⭐

f:id:okamuuu:20190720160602j:plain

そういえば石焼ビビンバ食べてないなあと思い南浦洞の地下鉄に直結しているロッテリアデパートで注文しました。美味しいんですけどまあ日本でも食べれそうだなあ、という感想だったので星ひとつ。

Egg Drop: ⭐⭐⭐

f:id:okamuuu:20190720160621j:plain

南浦洞の通りにあるオシャレな軽食屋さんです。韓国では早朝にフレンチトースト的なパンを食べるらしいんですが、それがおしゃれになった感じでしょうか?安くて美味しかったのとインスタ映えするので星3つです。

蟾津江シジミスープ専門店: ⭐⭐

f:id:okamuuu:20190720160700j:plain

旅行中美味しいものを食べすぎたせいですっかり胃が弱っていたので胃に優しいものを、と Google Map でシジミスープ専門店を見つけて潜入。なんですけど早朝からボリュームがすごい事になっていました。スープの中にはしじみがたくさんはいっていて鯖の煮付け?*1がかなり美味しかったです。なんですがナムルの量がちょっとおかしいことになっていて胃を休めることができなかったので星ふたつです

ミートボール: ⭐⭐⭐

f:id:okamuuu:20190720160719j:plain

釜山で若者たちが集う西面で、その若者たちがたくさんランチしている店を発見したので潜入しました。韓国の飲食店でときどきお店の名前が日本語だったりするんですが、流行っているんだろうか?さておきカウンター席の豚丼のお店を発見しました。結構じっくり焼くので時間はかかりますが美味しかったです。豚肉は結構本格的だったのでこれを食べていればサムギョプサルを食べなくても満喫できるな、と思いました。

お一人様で美味しいお肉にありつけるので星3つ

南浦洞のお店(名称、金額不明)

f:id:okamuuu:20190720160952j:plain

ちょっと記録してなくてお店の名前がわからないのですが宿泊したホテルの近くにあったファーストフード的なお店です。割と安くて美味しかったです。日本でいうと吉野家みたいな感じなのかな?と勝手に思いました。ひとり旅でふらっと訪れた時にはこういうお店がとても便利。

まとめ

というわけで韓国第2の都市釜山で食べた物をまとめました。滞在期間が短かったのですあまり散策はできなかったのですが南浦洞はごはんどころが結構ありました。釜山は日本から近いのでおすすめです。

*1:いわしだった気がする

韓国のソウル、釜山へティーウェイ航空(tway)とPeach航空(ピーチ)を使ってそれぞれ4泊5日, 2泊3日の旅をしてきた(2) ソウルで食べたご飯編

というわけで観光で食べた物をリスト化しました。円に換算する時は10で割れば大体OK(15,000ウォンは1500円)

ソウル

主に漢江の北側を散策しました。そういえば今回江南(カンナム) でご飯食べてないです。次回訪れた時には江南も調査したいと思います。

エリア 店名 品名 値段(ウォン)
明洞 神仙ソルロンタン お肉いっぱいソルロンタン 15,000
明洞 味加本(みかぼん) 高麗人参と鶏肉のお粥 8,000
明洞 emoi(ロッテリア内) 분짜(Bun Cha) 15,000
明洞 少年食堂(ロッテリア内) 海老の醤油漬けご飯(カンジャンセウパッ) 9,000
弘大 少年食堂 海老の醤油漬けご飯(カンジャンセウパッ) 10,000
東大門 多菜 東大門店 サムギョプサル(2人前) 30,000
東大門 屋台 豚のモツ丼 4,600
益善洞 ミルトースト スチーム食パン(基本のパン+あんこ) 1,2000
益善洞 Hand Steak ビーフステーキコンボ 9,900

神仙ソルロンタン: ⭐⭐

f:id:okamuuu:20190710190745j:plain

明洞で24時間営業している、割と有名なお店です。2Fに同じく有名なお粥の店があり、週末の午前9時に来るとたぶん行列ができていると思われます。お肉いっぱいソルロンタンを注文しましたが予想以上にお腹がいっぱいになり、そのあとしばらくお腹が空かなくなるのでご注意ください。有名なお店で地元の人も食べに来ているようなのですが、そこまで美味しいのか私はよくわかりませんでした。

ちなみにキムチが取り放題なのですが、ここのキムチはかなり美味しかったので星2つ。

味加本(みかぼん): ⭐

f:id:okamuuu:20190720145548j:plain

神仙ソルロンタンの2Fにあるお粥のお店です。こちらも週末の朝はかなり混雑しますので行かれる場合はご注意ください。どちらのお店も初見の観光客が行列を作るので、場合によっては片方の店にしか行列ができていないので、空いている方に突入するのが賢明かもしれません。

お粥ですけど種類によっては味付けが濃いです。胃に優しさを求めていたらちょっと違った、ということで星ひとつ。

emoi ロッテリア明洞店: ⭐⭐⭐

f:id:okamuuu:20190711193620j:plain

ベトナム料理のお店です。よくよく考えれば韓国料理ではなかったのですが、かなり美味しかったです。東京に帰ってきてから調べたところ韓国の若者に人気があるお店らしいです。私はフードコートでさまよっていたら美味しそうだったのでなんとなく注文しました。

少年食堂 ロッテリア明洞店, 弘大店: ⭐⭐⭐

f:id:okamuuu:20190720145753j:plain

弘大店で食べた海老の醤油漬けご飯がかなり美味しかったので、もう一度食べたいなと思っていたらロッテリア明洞店のフードコートにもあったので旅行中にもう一度食べました。なぜか値段がちょっと違ったのですが弘大店のほうがエビが大きかったきがします。

多菜 東大門店: ⭐⭐

f:id:okamuuu:20190720145818j:plain

韓国で絶対に食べてやろうと思っていたのがサムギョプサル。東大門のサウナに行く前に2人前のサムギョプサルを食べに行きました*1忙しくない時間帯なのか、日本人だからなのか、店員さんがお肉を焼いて、はさみで切ってくれました。葉っぱでお肉を巻いて食べる形式で、お肉よりも葉っぱがメインのお店らしいです。かなり美味しかったのですが、1人で食べるとやっぱり量が多いので星2つにしました。

屋台: ⭐⭐

f:id:okamuuu:20190720150033j:plain

東大門 DTP の夜市の屋台で購入。赤いソースはかなり辛いらしく「No, MIX, OK?」みたいな事を言われました。というわけで辛さは自身で調整しましょう。私はほとんど Mix できませんでした。味はともかくちょうどよい気温の中屋外で食べれたので星二つ。

ミルトースト: ⭐⭐⭐⭐

f:id:okamuuu:20190720145642j:plain

益善洞でなんとなくシャレオツな雰囲気のお店があったんですが、蒸した食パン、美味しいのかなあ...と思いながらもお店の雰囲気を信じて潜入。スチームされたパンを口の中に入れた瞬間の歯ごたえで「再訪決定」となった今回の旅で私が一番気に入ったお店です。平日に訪れたので空いていましたが、週末に来た時は満席でした。

私は気に入ったのですが、あくまでもパンなのでもしかしたらお肉が好きって人には合わないかもしれません、ドリンクだけでもOKなので益善洞を散策中に見かけたら要チェックです。

Hand Steak: ⭐⭐

f:id:okamuuu:20190720150008j:plain

益善洞を気に入ったので旅行中にもう一度訪問したんですが、週末の益善洞はご飯どころがどこもいっぱいでした。お茶だけのお店は割と空いていたのでご飯は益善洞のはずれで食べる事にしました。

たぶん益善洞に来たのに Hand Steak というのは求めている雰囲気じゃないとは思いますが、週末だと食べるのに並ぶ必要があるのでこういう選択肢もありじゃないかなと思います。

お皿とドリンクが一体になった容器のおかげで歩きながら食事できるアイデアが良いと思うので星ふたつ。

*1:2人前からでないと注文できない場所がほとんどです

韓国のソウル、釜山へティーウェイ航空(tway)とPeach航空(ピーチ)を使ってそれぞれ4泊5日, 2泊3日の旅をしてきた(1)

f:id:okamuuu:20190717163139j:plain

あらすじ

とある洋服屋の社長さんとご飯食べ手た時に「韓国人は爆買いしないのか?」と聞いたところ「洋服に関しては韓国の方が安いし種類もあるから日本で買う理由がない」という事でした。

そうかー洋服安いのかー。コスメも安いっていうし、そういえば韓国はすごく近い場所にあるのにあまり良く知らないんだよな、と思ったのでちょっと一週間ほど行ってきました。

観光した場所

ソウルと釜山(ぷさん)に行ってきました。ソウルでは明洞(みょんどん), 益善洞(いくそんどん), 東大門(トンデモン), 弘大(ほんで), COMMON GROUND, COEX MALL へ。釜山では南浦洞(なんぽどう), 西面(そみょん), 海雲台(へうんで)へ行って来ました。

もし上記の場所に興味がある人はこのブログをご覧になってみてください。

旅行日程

場所 日時 行程
東京 2019/07/10 12:00 成田国際空港
ソウル 2019/07/10 14:40 仁川国際空港
ソウル 2019/07/10 18:00 ゲストハウス: ブルーマウンテン明洞 check in
ソウル 2019/07/14 10:00 ゲストハウス: ブルーマウンテン明洞 check out
ソウル 2019/07/14 11:20 KTX: ソウル駅発
釜山 2019/07/14 14:50 KTX: 釜山駅着
釜山 2019/07/14 16:00 ゲストハウス: K-Guesthouse Premium Nampo 1 check in
釜山 2019/07/16 10:00 ゲストハウス: K-Guesthouse Premium Nampo 1 check out
釜山 2019/07/16 16:00 金海(キメ)国際空港発
大阪 2019/07/16 17:30 関西国際空港

かかった移動費と宿泊費は以下の通りです。たまたまウォン安の時だったので少しお得になっているかも。

  • 往路: 11010円(座席番号を指定して+1700)
  • ソウル宿泊費: 220,968ウォン(だいたい21000円)
  • 新幹線: 485,00ウォン(だいたい4500円)
  • 釜山宿泊費: 80,100ウォン(だいたい7500円)
  • 復路: 69,200ウォン(だいたい6500円)

これらが合計で50510円

大半が食事とコーヒー代が3万円ぐらい、地下鉄で4700円ほど(カード代700円+4000円チャージ)かかっていて、洋服Tシャツ3枚買いました(6千円ぐらい)。というわけで一週間滞在して費用が大体9万円です。私の場合飛行機の安い時期をまず選んで格安のゲストハウスに空きがある事を確認してから日程を組んでいるので、お一人様でちゃんとしたホテルに宿泊する場合はもう少し料金かかると思います。

ティーウェイ航空とピーチ航空について

ティーウェイ航空の成田カウンターではセルフチェックインができないです。でも割と成田->ソウル行きの旅行者は多かったです。釜山行きはそうでもなかったです。そんなわけでソウル行きの搭乗手続きのカウンターの前に長蛇の列が出来ており、手続きまでに30分待ちました。出発時刻から逆算すると出発の2時間前にはついてないとちょっと不安だと思います。ちなみにこの日は出発時間が30分遅延していました。

ちなみに私は座席番号をA1(+1,700円)を指定したのですが目の前が壁になっているタイプの航空機なので思ったより広さがなくて残念でした。ただし、隣の席がなぜか無人だったのでそこそこ快適に過ごせました。

手荷物に関しては以下の記載がありました。私は普段から5kg程度のバックパックで旅行しているので重さは問題なし。往路ではハンドバック、ショッピングバック無しですから全く問題なし。

三辺(横・縦・高)の合が115cm, 重量10kg 以下の手荷物 1つに限り、無料で機内持込できます。

https://www.twayairlines.jp/yoyaku/smart/static/baggage.html

ピーチ航空

ピーチやジェットスターなどの格安 LCC は便利なんですが手荷物の制限がかなり厳しいので注意が必要です。2点OKといいつつ 7kg の制限。私は今回お土産を最初から韓国海苔にすると決めてあったのでそこは問題なし。ただ、そこそこ厚手の半袖Tシャツを3着購入したのでそこだけ気をつけました。

https://www.flypeach.com/pc/jp/lm/ai/airports/baggage/carry_on_bag

釜山から大阪まで1時間30分だったので特に座席指定しませんでしたがやっぱり狭いですね。隣に夫婦が座っていらっしゃったのですが「狭いわー足短くてよかったわー」と関西人らしいコテコテのボケを披露していました*1。そういえば釜山から大阪までは赤いパスポート(日本人)持っている人が多かったです。

ゲストハウス: ブルーマウンテン明洞

ちなみにブルーマウンテン明洞ではツインベッド、K-Guesthouse ではダブルベッドを予約しました。シングルルームも存在するようですがあまり空きがなかったのと、そこまで値段に差がでるわけではないので1人旅でもツインベッド、ダブルベッドにしても損をする感覚はないです。

とはいえ2人で宿泊すればお得になるんじゃないか、という話ではあるのですが、正直あまり部屋が広くないのでどんなに気心がしれている友人でも私はちょっと遠慮したい、そんな感じでした。

ブルーマウンテン明洞は立地は最高だったのですが、ドライヤーが温風でなかったり、シャワールームの扉がきちんと閉まらなかったりと、ちょっと微妙、でも別に私1人だったら困らないなあ、という感じだったのでもし、この記事見てブルーマウンテン明洞に興味を持った人はその点ご注意ください。個人的に室内に机がなかったので室内で作業するのはつらいのでノマドワーカーにはあんまり向かないかも。

K-ゲストハウス プレミアム南浦1

K-ゲストハウス プレミアム南浦1 は思ったよりも広くて快適でした。とはいえやはり2人で宿泊するのはつらい、そんな感じです。ブルーマウンテン明洞に比べて K-ゲストハウス は割と広かったし、ややおしゃれでした。ソウルと釜山なので比較しづらいのですが、明洞にも K-ゲストハウスがあるようなので次回ソウルに旅行する際には検討してみたいと思います。

f:id:okamuuu:20190717163615j:plain

韓国の印象

ソウルに関しては滞在先が明洞だった事もあるのですが日本語がかなり通じます。屋台の店員さんや赤い服を着た観光案内のスタッフさんに英語で話しかけても「日本人ですか?」と聞き返されます。彼らからすると日本語の方が案内しやすいんだと思います。あと日本人だからといって冷たくされたと感じた事は一度もなかったです。

それから洋服は確かに安いので時期を見て韓国を訪れるのは面白いと思います。ただし、洋服のサイズが日本と違います。私は日本ではMサイズなのですが、韓国ではSサイズにあたります。そして私が旅行中に気づいたのはSサイズの洋服があんまり無かったです。そして割とフリーサイズの服がいっぱいでした。ちょっとここは誤算でしたがまたセールの時期にでも訪れてみようと思います。ちなみに私は中目黒で6000円ぐらいで売っているTシャツを、ウォン安とセールのおかげもあり2500円ぐらいで買えました。

f:id:okamuuu:20190717163735j:plain
そこそこの厚手があるTシャツ。定価の39000ウォンで購入。SサイズはラインナップにないそうなのでMサイズを買いました。

f:id:okamuuu:20190712204617j:plain
have a good time のポケT。中目黒で6000円ぐらいでで購入したものが韓国のお店でセールのおかげもあって2500円ぐらい。これは Sサイズがありました。

ちなみに、日本人の成人男性の平均身長が 171cm に対して韓国の成人男性の平均身長は 175cm です。そして韓国人男性はやたらと筋肉質の人が多かったです。兵役義務があったり、普通の公園にそこそこの運動器具があったり、サウナや銭湯にウェイトマシーンがあったりするのでそういう事も関係しているのかもしれません。

ごはんに関しては何を注文しても基本的にナムルという惣菜が付いてきて量がたくさんあります。でも値段に関しては東京とそれほど変わらないと思います。あと韓国に来たらこれ食べよう的な料理は大体2人前からなのでお一人様にはつらいかもしれません。そしてブログなどで紹介されている店にも訪問しましたが、個人的にはフードコートで食べるほうが満足度が高かったです。もし土日に旅行する場合はむしろフードコートの方が行列ができないのでおすすめです。

f:id:okamuuu:20190717164514j:plain
サムギョプサル2人前3000円。基本的に2人前からでないと注文できないのでご注意を。この他ナムルと野菜取り放題のシステムなのでボリュームが半端ないです。

まとめ

というわけで1週間ほど韓国に滞在してきました。たまたまウォン安だったし、ご飯も美味しかったので満足しました。韓国は週末にふらっと行ける距離だし、他の国に行く時に経由するのも便利だと思うので今後何度か足を運ぶ事になるだろうなと思いました。

ソウルと釜山で食べたご飯については別の記事にします。

*1:奥さま拾わずにスルーしていました