あいつの日誌β

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

動画を反転したり再生速度を変更する chroe extension を作りました

f:id:okamuuu:20191019224449j:plain

あらすじ

Youtube の動画に対して以下の機能ががあればいいのに、と思ったので作りました。

  • 水平方向への反転
  • 再生速度のコントロール
  • 指定範囲でのループ

使い方

一応 store に申請したのですが審査が必要らしいので、以下の repository で npm run build して build ディレクトリをそのまま chrome に突っ込むと動きます。良かったら使ってみてください。

github.com

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人前からでないと注文できない場所がほとんどです