あらすじ
Youtube の動画に対して以下の機能ががあればいいのに、と思ったので作りました。
- 水平方向への反転
- 再生速度のコントロール
- 指定範囲でのループ
使い方
一応 store に申請したのですが審査が必要らしいので、以下の repository で npm run build
して build ディレクトリをそのまま chrome に突っ込むと動きます。良かったら使ってみてください。
動画の再生速度を変更したかったのですが、昔インストールしていた動画プレイヤーが何故か動かなかったので何となく自分で作ってみました。
最初は main process と renderer process の違いがよく分かってませんでしたがそこを乗り越えたらあとはそんなに難しくないと思いました。たぶん普段からサーバーサイドもフロントエンドも触っている人だったらそんなに難しくないと思います。
ちなみに Vue.js ではなく何となく TypeScript + React + Bulma を使いました。Vue.js でなくて React 使っているのは何となく Electron 界隈では React が主流な気がしたので、実際はどうなのかは分かっていませんが。
そしてディレクトリ構成などは以下をそのまま流用しました。
https://webpack.electron.build/
今の所本当にシンプルな構成なので redux など使ってないのですが、機能を追加したりして遊んでみたいと思います。
よかったら repository に star をください
会場・飲食物の提供は SmartHR さまです。ありがとうございます!冷蔵庫の中から好きなドリンクを選べます。
冷えたビール飲めるので嬉しいですね。よなよなエールが置いてありました。なかなか素敵なチョイスですね。ぜひとも SmartHR 社には今後も色んな勉強会のスポンサーをやって欲しいです。
SmartHR はエンジニアが30人いてフロントエンドが6名だそうです。思ったよりも人数少ないなあと思いました。それから smartHR では component を storybook にして公開しているそうです。
https://www.npmjs.com/package/smarthr-ui
との事です。運営している人たちは常に会場をどこにするのか困っているので「勉強会行きたいから自社のスペース使ってやって欲しい」という人がいれば彼らに声がけするといいと思います。
https://www.facebook.com/groups/139611203185731/
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 をください。
TypeScript 初めて触るが VSCode の拡張機能を作っている、という話。本当は作った、というタイトルでしたが間に合わなかったそうです。API の名前が分からないので欲しい API がなかなか見つけられない問題が発生したそうですが GitLens のソースコードの example を見て対処できたそうです。
アルゴリズムと TypeScript が好きな人。本屋に並んでいるアルゴリズム本は 言語が C++, C, Python で実践的でないので何のためのアルゴリズムなのか分からない、という事で執筆したそうです。
無いなら作るってエンジニアぽくて良いですね。
猫耳の人。TypeScript の型で form validation を作る話かな?普通に Validation 書いた方が楽そうだけど、型を使った validation も頑張ればできる、という解釈で良いのかな。
JS で値がない
、の表現が多すぎて困る。作法を統一したい、というお話。JS で値がない
時の処理を見やすくしたい場合は私は関数に代えちゃう事が多いなあ。
一応 lodash に isNil
と isNull
という関数があったりします。
vue cli は version によって名前空間変わっているので注意。npm install
で悩んで時間を溶かすのでみなさまも注意しましょう。
Service Worker と Cache Storage を使っている WordPress に POST しても更新されなくなってしまった。原因は PWA を勝手にやめても ブラウザには register されたままなので更新されない。
Cache するのは簡単ですけど Cache をどうやって消せば良いのかを考えるのほんと難しいですよね。
よく v8 javascript engine の事を話しているあの人。本日は React で簡単にアニメーション化できる react-spring
のお話でした。
ファイルの読み書きに関するお話。ファイルを読み込みながら書き込みする Streams API を使って自作の Stream を作れますよ、というお話。OS 側ではファイルの読み書きで読み込みながら書き込みするのは普通の事だと思うのですがブラウザ側では最近できるようになったそうです。
うーん。ファイルを受け取りながら、かつ読み込み完了する前に処理を開始したい、ブラウザ側で。みたいなケースがあるんだろうか...
そういえば groonga が POST された JSON を受け取りきる前に解析始めているみたいな事言っていた気がするなあ。
JavaScriptでアルゴリズムを学べる本を技術書典で出しました @pco2699 さんとお話しました。アルゴリズム大事すよねえ。あと組み込み系の会社で働いている外国人も JS 周りのキャッチアップに来ていました。一昔前まで勉強会は日本人しかいなかったのですが、最近は外国人もちらほら見かけるようになったので丁寧な日本語で話す必要があるなあと思いました。
あとなぜか「ISUCON に出たんですか?すごい。」と言われたのですが誰でも参加できるんですけどフロントエンドの人からするとそういう認知なんだなーと思いました。
というわけで今回も登壇の機会を頂いたので経験値を増やす事ができました。We Are JavaScripters は登壇の敷居が低いのでみなさんも初登壇にチャレンジしてはいかがでしょうか?家でコード書くのも良いですが、登壇すると効率よく経験値を増やす事ができると思います。
というわけでスポンサー、運営のみなさま、今回も勉強会を開催していただきありがとうございます。次回もまたよろしくお願い致します。
復習するためにインスタンスを作成した時のメモを残します
多少は環境構築が楽になると思うので、イメージは予選の時に使用した isucon9-qualify-v1
を使用します。ただしこのイメージにはベンチマーカーが含まれていません。
この記事では以下の作業を行って webapp と benchmarker を1台のインスタンスに同梱させる方法を記します。
基本的には以下の作業を行えばOK
https://gist.github.com/sota1235/a7356a5909af264c1c1c840dd216c98f
カスタム購入
価格モデル: 従量課金
リージョン: アジア東北1ゾーンA
インスタンスタイプ: ecs.sn1ne.large
共有イメージ: isucon9-qualify-v1
Ultra クラウドディスク: 40GiB
ネットワーク: VPC デフォルトのまま
ネットワーク課金タイプ: トラフィック課金 100MBps
セキュリティグループ: 80, 443, 22 が空いてればOK
キーペア: 適宜
インスタンス名: 適宜
ホスト名: 適宜 isucon9q-001 のように 1-3 の連番を振ると便利
以下のような感じで編集すれば良いでしょう。
47.74.xxx.xxx isucon9q-001 isucon9.catatsuy.org
https://isucon9.catatsuy.org/ で画面が表示される事を確認し、ssh でサーバーにログインできる事を確認します。
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
まず 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
この記事では /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
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
しました。
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
こちらからは以上です。
運営側へのお礼を言い忘れてました。今年も楽しく参加させて頂きました。毎年こんなに効率よくエンジニアとしての力量が向上するイベントを開催して頂いて感謝しております。次回も開催して欲しいといつも思っています。これだけの規模のイベントをハンドリングできる強いチームは他に存在していないと思うので継続してもらえるとありがたいです。今年も運営のみなさまお疲れさまでした。
旅しながら働いていると「家賃と宿泊費」をダブルで払う事になるのですが、その問題を解消するサービスが最近ちらほらと登場しています。というわけで早速試してみました。
簡単に言うと定額制の家賃で全国住み放題のシェアサービスです。現在約19箇所の住居(主に戸建)を有していて、会員はその拠点の中から一箇所をホーム拠点に設定できて、そこで郵便物や住民票を登録できます。そして他の拠点で暮らしたいときは都度予約して利用することができます。
月4万円でアドレスホッパーな生活を送ることができる夢のサービスです。
というわけで ADDress が会員をクラウドファンディングで募集していたので2019年4月ごろに「5万円で一ヶ月試せる権利」を取得していまして、8月にその権利を発動して北鎌倉と京都伏見に滞在しました。
感想としては思った以上に使えるサービスだな、と感じました。なんですが現在 ADDress は古民家再生をメインに拠点を拡大しようとしているらしく、どうしても立地がやや不便な場所になってしまうな、とも思いました。ここはちょっとネックになると思います。
住民票や郵便物の問題が解決できるのはかなり大きなポイントですが、まだまだ拠点数が少なく、行きたい場所に拠点がない、もしくは立地が不便、といったデメリットがあります。とはいえ今後利用されなくなる古民家などは増え続けると思いますのでこういったシェアリングサービスは長い目で見るとかなり良いサービスに成長すると思います。
北鎌倉は大船と鎌倉の中間に位置していて、とても静かな住宅街でした。ADDress で人気が高い物件の一つです。風通しが良い庭付きの戸建物件です。リビングで作業していると家守さんとそこの住人が時折姿を見せるのでお話したり、仕事に没頭したりして、ちょっとしたコワーキングスペースになっていました。
6日間ほど滞在しのたですが、割と快適に過ごせたのと鎌倉が思ったよりも楽しかったのでもう少し滞在したいなと思いました。
せっかくなので由比ヶ浜、森戸海岸、一色海岸に行ってきました。飲み歩いた際に現地に詳しい人からおすすめの海の家をヒアリングしました。オススメは以下の通りです。
私は森戸海岸が一番落ち着いた雰囲気だったので一押しです。といっても他のビーチもそこまで騒がしい雰囲気ではなかったです。平日という事もあったのかもしれませんが、どのビーチでもマナーの悪い人を見かけませんでした。たぶんきちんと取り締まっている人たちのおかげだと思います。なのでどこのビーチに行っても楽しめると思います。森戸海岸と一色海岸については渋滞必至なので帰る時間をずらしたりするなど工夫するといいと思います。
オープン直後の新拠点で最寄駅から徒歩1分という、とても人気になりそうな物件にお邪魔しました。元々は学生寮だった建物をリノベーションした物件で、リビングがなかなかいい感じの建物でした。家守さんが日中はお仕事で不在で、オープン直後で滞在しているのは私1人だったので広い空間を独り占めできてとても楽しかったです。ここは3日間しかいなかったのですが、もっと滞在したかったです。
ちなみに隣に大家さんであるおばあちゃんが住んでまして、大家さんはどんな人がこの物件に来るのか興味を持っていました。たぶん新しい事が大好きな人だと思うので、宿泊される方は是非お話してみてください。
伏見といえば幕末の舞台となっているのでご存知の方も多いと思います。私は今回の旅で初めて訪問しのたですがなかなか趣のある街並みでした。いい感じの飲み屋さんがいっぱいあるので今度から河原町だけでなく伏見にも足を伸ばそうと思いました。
というわけでお互いの住処をシェアして別荘を増やす、新しいサービスを体験してきました。まだまだ始まったばかりなので物件の数少なくてサービスの本領が発揮できていないと思うのですが、これから魅力的な物件が増えてくると思うのでこれから要チェックなサービスなんじゃないかと思います。
こちらからは以上です。
というわけで釜山で食べたものリスト
ソウルから新幹線を使って韓国第2の都市へ。主に宿泊先の南浦洞周りを探索しました。
エリア | 店名 | 品名 | 値段(ウォン) |
---|---|---|---|
南浦洞 | チャガルチ市場 | タコ一匹刺身+あさり1個スープ | 19,000 |
南浦洞 | ロッテリア光複店のフードコート | 石焼ビビンバ | 8,500 |
南浦洞 | Egg Drop | 분짜(Bun Cha) | 4,800 |
南浦洞 | しじみ定食 | しじみ定食 | 9,000 |
西面 | ミートボール | 豚丼 | 9,000 |
釜山駅からも地下鉄で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つ
そういえば石焼ビビンバ食べてないなあと思い南浦洞の地下鉄に直結しているロッテリアデパートで注文しました。美味しいんですけどまあ日本でも食べれそうだなあ、という感想だったので星ひとつ。
南浦洞の通りにあるオシャレな軽食屋さんです。韓国では早朝にフレンチトースト的なパンを食べるらしいんですが、それがおしゃれになった感じでしょうか?安くて美味しかったのとインスタ映えするので星3つです。
旅行中美味しいものを食べすぎたせいですっかり胃が弱っていたので胃に優しいものを、と Google Map でシジミスープ専門店を見つけて潜入。なんですけど早朝からボリュームがすごい事になっていました。スープの中にはしじみがたくさんはいっていて鯖の煮付け?*1がかなり美味しかったです。なんですがナムルの量がちょっとおかしいことになっていて胃を休めることができなかったので星ふたつです
釜山で若者たちが集う西面で、その若者たちがたくさんランチしている店を発見したので潜入しました。韓国の飲食店でときどきお店の名前が日本語だったりするんですが、流行っているんだろうか?さておきカウンター席の豚丼のお店を発見しました。結構じっくり焼くので時間はかかりますが美味しかったです。豚肉は結構本格的だったのでこれを食べていればサムギョプサルを食べなくても満喫できるな、と思いました。
お一人様で美味しいお肉にありつけるので星3つ
ちょっと記録してなくてお店の名前がわからないのですが宿泊したホテルの近くにあったファーストフード的なお店です。割と安くて美味しかったです。日本でいうと吉野家みたいな感じなのかな?と勝手に思いました。ひとり旅でふらっと訪れた時にはこういうお店がとても便利。
というわけで韓国第2の都市釜山で食べた物をまとめました。滞在期間が短かったのですあまり散策はできなかったのですが南浦洞はごはんどころが結構ありました。釜山は日本から近いのでおすすめです。
*1:いわしだった気がする
というわけで観光で食べた物をリスト化しました。円に換算する時は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 |
明洞で24時間営業している、割と有名なお店です。2Fに同じく有名なお粥の店があり、週末の午前9時に来るとたぶん行列ができていると思われます。お肉いっぱいソルロンタンを注文しましたが予想以上にお腹がいっぱいになり、そのあとしばらくお腹が空かなくなるのでご注意ください。有名なお店で地元の人も食べに来ているようなのですが、そこまで美味しいのか私はよくわかりませんでした。
ちなみにキムチが取り放題なのですが、ここのキムチはかなり美味しかったので星2つ。
神仙ソルロンタンの2Fにあるお粥のお店です。こちらも週末の朝はかなり混雑しますので行かれる場合はご注意ください。どちらのお店も初見の観光客が行列を作るので、場合によっては片方の店にしか行列ができていないので、空いている方に突入するのが賢明かもしれません。
お粥ですけど種類によっては味付けが濃いです。胃に優しさを求めていたらちょっと違った、ということで星ひとつ。
ベトナム料理のお店です。よくよく考えれば韓国料理ではなかったのですが、かなり美味しかったです。東京に帰ってきてから調べたところ韓国の若者に人気があるお店らしいです。私はフードコートでさまよっていたら美味しそうだったのでなんとなく注文しました。
弘大店で食べた海老の醤油漬けご飯がかなり美味しかったので、もう一度食べたいなと思っていたらロッテリア明洞店のフードコートにもあったので旅行中にもう一度食べました。なぜか値段がちょっと違ったのですが弘大店のほうがエビが大きかったきがします。
韓国で絶対に食べてやろうと思っていたのがサムギョプサル。東大門のサウナに行く前に2人前のサムギョプサルを食べに行きました*1忙しくない時間帯なのか、日本人だからなのか、店員さんがお肉を焼いて、はさみで切ってくれました。葉っぱでお肉を巻いて食べる形式で、お肉よりも葉っぱがメインのお店らしいです。かなり美味しかったのですが、1人で食べるとやっぱり量が多いので星2つにしました。
東大門 DTP の夜市の屋台で購入。赤いソースはかなり辛いらしく「No, MIX, OK?」みたいな事を言われました。というわけで辛さは自身で調整しましょう。私はほとんど Mix できませんでした。味はともかくちょうどよい気温の中屋外で食べれたので星二つ。
益善洞でなんとなくシャレオツな雰囲気のお店があったんですが、蒸した食パン、美味しいのかなあ...と思いながらもお店の雰囲気を信じて潜入。スチームされたパンを口の中に入れた瞬間の歯ごたえで「再訪決定」となった今回の旅で私が一番気に入ったお店です。平日に訪れたので空いていましたが、週末に来た時は満席でした。
私は気に入ったのですが、あくまでもパンなのでもしかしたらお肉が好きって人には合わないかもしれません、ドリンクだけでもOKなので益善洞を散策中に見かけたら要チェックです。
益善洞を気に入ったので旅行中にもう一度訪問したんですが、週末の益善洞はご飯どころがどこもいっぱいでした。お茶だけのお店は割と空いていたのでご飯は益善洞のはずれで食べる事にしました。
たぶん益善洞に来たのに Hand Steak というのは求めている雰囲気じゃないとは思いますが、週末だと食べるのに並ぶ必要があるのでこういう選択肢もありじゃないかなと思います。
お皿とドリンクが一体になった容器のおかげで歩きながら食事できるアイデアが良いと思うので星ふたつ。
*1:2人前からでないと注文できない場所がほとんどです